From 357adda8912905e1986cf4237f85f6d9982b3cd5 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 23 Jan 2025 15:19:38 -0500 Subject: [PATCH 001/244] Add URL Cache --- .../dae00e5aa8dd_create_rooturlcache.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 collector_db/alembic/versions/dae00e5aa8dd_create_rooturlcache.py diff --git a/collector_db/alembic/versions/dae00e5aa8dd_create_rooturlcache.py b/collector_db/alembic/versions/dae00e5aa8dd_create_rooturlcache.py new file mode 100644 index 00000000..c95b10e0 --- /dev/null +++ b/collector_db/alembic/versions/dae00e5aa8dd_create_rooturlcache.py @@ -0,0 +1,34 @@ +"""Create RootURLCache + +Revision ID: dae00e5aa8dd +Revises: dcd158092de0 +Create Date: 2025-01-19 10:40:19.650982 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = 'dae00e5aa8dd' +down_revision: Union[str, None] = 'dcd158092de0' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + op.create_table('root_url_cache', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('url', sa.String(), nullable=False), + sa.Column('page_title', sa.String(), nullable=False), + sa.Column('page_description', sa.String(), nullable=True), + sa.Column('updated_at', sa.TIMESTAMP(), server_default=sa.text('now()'), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('url', name='root_url_cache_uq_url') + ) + + +def downgrade() -> None: + op.drop_table('root_url_cache') From 541ce853aad9c2a5fad572375e04bbba7241c2bb Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 23 Jan 2025 15:28:43 -0500 Subject: [PATCH 002/244] Change transformers to use PyTorch --- requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index c05cfbfa..7406d1ef 100644 --- a/requirements.txt +++ b/requirements.txt @@ -33,8 +33,7 @@ APScheduler~=3.11.0 alembic~=1.14.0 asyncpg~=0.30.0 pytest-asyncio~=0.25.2 -transformers~=4.40.2 -tf-keras~=2.18.0 +transformers[torch]~=4.40.2 # HTML Collector playwright~=1.49.1 From 9c604deb9c90697b2394f68c36c87a6bfdf6c524 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 23 Jan 2025 16:08:11 -0500 Subject: [PATCH 003/244] Change transformers to use tf-keras --- Dockerfile | 2 ++ requirements.txt | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 8e64b85d..1287b9d0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,6 +10,8 @@ COPY . . # Install dependencies RUN pip install --no-cache-dir -r requirements.txt +RUN playwright install +RUN playwright install-deps # Expose the application port EXPOSE 80 diff --git a/requirements.txt b/requirements.txt index 7406d1ef..c05cfbfa 100644 --- a/requirements.txt +++ b/requirements.txt @@ -33,7 +33,8 @@ APScheduler~=3.11.0 alembic~=1.14.0 asyncpg~=0.30.0 pytest-asyncio~=0.25.2 -transformers[torch]~=4.40.2 +transformers~=4.40.2 +tf-keras~=2.18.0 # HTML Collector playwright~=1.49.1 From 4231c477919d87be48131111df8662d95e26fe8c Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 23 Jan 2025 17:46:37 -0500 Subject: [PATCH 004/244] Reduce size of Dockerfile --- .project-root | 0 Dockerfile | 21 +++++++++++++++++++-- core/SourceCollectorCore.py | 20 -------------------- util/miscellaneous_functions.py | 2 +- 4 files changed, 20 insertions(+), 23 deletions(-) create mode 100644 .project-root diff --git a/.project-root b/.project-root new file mode 100644 index 00000000..e69de29b diff --git a/Dockerfile b/Dockerfile index 1287b9d0..2d719b81 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,15 +5,32 @@ FROM python:3.12.8 # Set working directory WORKDIR /app -# Copy project files -COPY . . +COPY requirements.txt ./requirements.txt # Install dependencies RUN pip install --no-cache-dir -r requirements.txt RUN playwright install RUN playwright install-deps +# Copy project files +COPY agency_identifier ./agency_identifier +COPY api ./api +COPY collector_db ./collector_db +COPY collector_manager ./collector_manager +COPY core ./core +COPY html_tag_collector ./html_tag_collector +COPY hugging_face/url_relevance ./hugging_face/url_relevance +COPY hugging_face/HuggingFaceInterface.py ./hugging_face/HuggingFaceInterface.py +COPY source_collectors ./source_collectors +COPY util ./util +COPY alembic.ini ./alembic.ini +COPY apply_migrations.py ./apply_migrations.py +COPY security_manager ./security_manager +COPY execute.sh ./execute.sh +COPY .project-root ./.project-root + # Expose the application port EXPOSE 80 +COPY .env ./.env RUN chmod +x execute.sh \ No newline at end of file diff --git a/core/SourceCollectorCore.py b/core/SourceCollectorCore.py index b341bda3..cf4ad3a3 100644 --- a/core/SourceCollectorCore.py +++ b/core/SourceCollectorCore.py @@ -12,12 +12,9 @@ from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse -from core.DTOs.LabelStudioExportResponseInfo import LabelStudioExportResponseInfo from core.DTOs.MessageResponse import MessageResponse from core.ScheduledTaskManager import ScheduledTaskManager from core.enums import BatchStatus -from label_studio_interface.DTOs.LabelStudioTaskExportInfo import LabelStudioTaskExportInfo -from label_studio_interface.LabelStudioAPIManager import LabelStudioAPIManager class SourceCollectorCore: @@ -25,7 +22,6 @@ def __init__( self, core_logger: CoreLogger, db_client: DatabaseClient = DatabaseClient(), - label_studio_api_manager: LabelStudioAPIManager = LabelStudioAPIManager(), dev_mode: bool = False ): self.db_client = db_client @@ -38,7 +34,6 @@ def __init__( self.scheduled_task_manager = ScheduledTaskManager(db_client=db_client) else: self.scheduled_task_manager = None - self.label_studio_api_manager = label_studio_api_manager def get_batch_info(self, batch_id: int) -> BatchInfo: return self.db_client.get_batch_by_id(batch_id) @@ -98,21 +93,6 @@ def get_batch_logs(self, batch_id: int) -> GetBatchLogsResponse: logs = self.db_client.get_logs_by_batch_id(batch_id) return GetBatchLogsResponse(logs=logs) - def export_batch_to_label_studio(self, batch_id: int) -> LabelStudioExportResponseInfo: - # TODO: Might this need to be a separate thread? - db_url_infos = self.db_client.get_urls_by_batch(batch_id) - url_count = len(db_url_infos) - export_infos = [] - for url_info in db_url_infos: - export_infos.append(LabelStudioTaskExportInfo(url=url_info.url)) - import_id = self.label_studio_api_manager.export_tasks_into_project( - data=export_infos - ) - return LabelStudioExportResponseInfo( - label_studio_import_id=import_id, - num_urls_imported=url_count - ) - def abort_batch(self, batch_id: int) -> MessageResponse: self.collector_manager.abort_collector(cid=batch_id) return MessageResponse(message=f"Batch aborted.") diff --git a/util/miscellaneous_functions.py b/util/miscellaneous_functions.py index d27793ff..4b0bc88b 100644 --- a/util/miscellaneous_functions.py +++ b/util/miscellaneous_functions.py @@ -32,7 +32,7 @@ def get_project_root() -> Path: """ # Define the root markers that signify the root directory of the project - root_markers = ['.git'] # Add more markers as needed + root_markers = ['execute.sh'] # Add more markers as needed # Start from the current file's directory current_dir = Path(__file__).resolve().parent while current_dir != current_dir.parent: # Check if we've reached the root of the filesystem From bc68f287b2bcc579a935cb054762d6fdae361c59 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 23 Jan 2025 17:51:34 -0500 Subject: [PATCH 005/244] Reduce size of Dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 2d719b81..96e4fe91 100644 --- a/Dockerfile +++ b/Dockerfile @@ -32,5 +32,5 @@ COPY .project-root ./.project-root # Expose the application port EXPOSE 80 -COPY .env ./.env +#COPY .env ./.env RUN chmod +x execute.sh \ No newline at end of file From f8826d86e791398df88c29c4615cb773acd51078 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 23 Jan 2025 18:02:29 -0500 Subject: [PATCH 006/244] Set playwright to only install chromium --- Dockerfile | 6 ++++-- html_tag_collector/URLRequestInterface.py | 6 ++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 96e4fe91..b2949405 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ COPY requirements.txt ./requirements.txt # Install dependencies RUN pip install --no-cache-dir -r requirements.txt -RUN playwright install +RUN playwright install chromium RUN playwright install-deps # Copy project files @@ -32,5 +32,7 @@ COPY .project-root ./.project-root # Expose the application port EXPOSE 80 +RUN chmod +x execute.sh +# Use the below for ease of local development, but remove when pushing to GitHub +# Because there is no .env file in the repository (for security reasons) #COPY .env ./.env -RUN chmod +x execute.sh \ No newline at end of file diff --git a/html_tag_collector/URLRequestInterface.py b/html_tag_collector/URLRequestInterface.py index d6c8ace2..6c6756d0 100644 --- a/html_tag_collector/URLRequestInterface.py +++ b/html_tag_collector/URLRequestInterface.py @@ -31,10 +31,8 @@ class RequestResources: semaphore: asyncio.Semaphore = asyncio.Semaphore(MAX_CONCURRENCY) def ensure_browsers_installed(): - print("Installing browsers...") - result = subprocess.run("playwright install", shell=True, capture_output=True, text=True) - print(result.stdout) - print(result.stderr) + # TODO: Slated for destruction + pass HTML_CONTENT_TYPE = "text/html" From aabc499db594e1ea8ff8c02c8bd3182cf8b2e04d Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 23 Jan 2025 18:16:54 -0500 Subject: [PATCH 007/244] Remove unused components --- source_collectors/muckrock/.gitignore | 1 - .../muckrock/classes/FOIADBSearcher.py | 65 ----- source_collectors/muckrock/constants.py | 1 - .../muckrock/create_foia_data_db.py | 260 ------------------ .../muckrock/get_allegheny_foias.py | 67 ----- .../muckrock/search_foia_data_db.py | 141 ---------- 6 files changed, 535 deletions(-) delete mode 100644 source_collectors/muckrock/classes/FOIADBSearcher.py delete mode 100644 source_collectors/muckrock/create_foia_data_db.py delete mode 100644 source_collectors/muckrock/get_allegheny_foias.py delete mode 100644 source_collectors/muckrock/search_foia_data_db.py diff --git a/source_collectors/muckrock/.gitignore b/source_collectors/muckrock/.gitignore index 3ad8c498..5047d9bc 100644 --- a/source_collectors/muckrock/.gitignore +++ b/source_collectors/muckrock/.gitignore @@ -226,4 +226,3 @@ flycheck_*.el *.json *.csv /csv -last_page_fetched.txt diff --git a/source_collectors/muckrock/classes/FOIADBSearcher.py b/source_collectors/muckrock/classes/FOIADBSearcher.py deleted file mode 100644 index 391f7a8d..00000000 --- a/source_collectors/muckrock/classes/FOIADBSearcher.py +++ /dev/null @@ -1,65 +0,0 @@ -import os -import sqlite3 - -import pandas as pd - -from source_collectors.muckrock.constants import FOIA_DATA_DB - -check_results_table_query = """ - SELECT name FROM sqlite_master - WHERE (type = 'table') - AND (name = 'results') - """ - -search_foia_query = """ - SELECT * FROM results - WHERE (title LIKE ? OR tags LIKE ?) - AND (status = 'done') - """ - - -class FOIADBSearcher: - - def __init__(self, db_path = FOIA_DATA_DB): - self.db_path = db_path - if not os.path.exists(self.db_path): - raise FileNotFoundError("foia_data.db does not exist.\nRun create_foia_data_db.py first to create and populate it.") - - - def search(self, search_string: str) -> pd.DataFrame | None: - """ - Searches the foia_data.db database for FOIA request entries matching the provided search string. - - Args: - search_string (str): The string to search for in the `title` and `tags` of the `results` table. - - Returns: - Union[pandas.DataFrame, None]: - - pandas.DataFrame: A DataFrame containing the matching entries from the database. - - None: If an error occurs during the database operation. - - Raises: - sqlite3.Error: If any database operation fails, prints error and returns None. - Exception: If any unexpected error occurs, prints error and returns None. - """ - try: - with sqlite3.connect(self.db_path) as conn: - results_table = pd.read_sql_query(check_results_table_query, conn) - if results_table.empty: - print("The `results` table does not exist in the database.") - return None - - df = pd.read_sql_query( - sql=search_foia_query, - con=conn, - params=[f"%{search_string}%", f"%{search_string}%"] - ) - - except sqlite3.Error as e: - print(f"Sqlite error: {e}") - return None - except Exception as e: - print(f"An unexpected error occurred: {e}") - return None - - return df \ No newline at end of file diff --git a/source_collectors/muckrock/constants.py b/source_collectors/muckrock/constants.py index 07dca8f4..f152d8c4 100644 --- a/source_collectors/muckrock/constants.py +++ b/source_collectors/muckrock/constants.py @@ -1,4 +1,3 @@ BASE_MUCKROCK_URL = "https://www.muckrock.com/api_v1" -FOIA_DATA_DB = "foia_data.db" \ No newline at end of file diff --git a/source_collectors/muckrock/create_foia_data_db.py b/source_collectors/muckrock/create_foia_data_db.py deleted file mode 100644 index 9114801c..00000000 --- a/source_collectors/muckrock/create_foia_data_db.py +++ /dev/null @@ -1,260 +0,0 @@ -""" -create_foia_data_db.py - -This script fetches data from the MuckRock FOIA API and stores it in a SQLite database. -Run this prior to companion script `search_foia_data_db.py`. - -A successful run will output a SQLite database `foia_data.db` with one table `results`. -The database will contain all FOIA requests available through MuckRock. - -Functions: - - create_db() - - fetch_page() - - transform_page_data() - - populate_db() - - main() - -Error Handling: -Errors encountered during API requests or database operations are logged to an `errors.log` file -and/or printed to the console. -""" - -import json -import logging -import os -import time -from typing import List, Tuple, Dict, Any - -from tqdm import tqdm - -from source_collectors.muckrock.classes.SQLiteClient import SQLiteClientContextManager, SQLClientError -from source_collectors.muckrock.classes.muckrock_fetchers import FOIAFetcher -from source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher import MuckrockNoMoreDataError - -logging.basicConfig( - filename="errors.log", level=logging.ERROR, format="%(levelname)s: %(message)s" -) - -# TODO: Why are we pulling every single FOIA request? - -last_page_fetched = "last_page_fetched.txt" - -NO_MORE_DATA = -1 # flag for program exit -JSON = Dict[str, Any] # type alias - - -create_table_query = """ - CREATE TABLE IF NOT EXISTS results ( - id INTEGER PRIMARY KEY, - title TEXT, - slug TEXT, - status TEXT, - embargo_status TEXT, - user INTEGER, - username TEXT, - agency INTEGER, - datetime_submitted TEXT, - date_due TEXT, - days_until_due INTEGER, - date_followup TEXT, - datetime_done TEXT, - datetime_updated TEXT, - date_embargo TEXT, - tracking_id TEXT, - price TEXT, - disable_autofollowups BOOLEAN, - tags TEXT, - communications TEXT, - absolute_url TEXT - ) - """ - - -foia_insert_query = """ - INSERT INTO results (id, title, slug, status, embargo_status, user, username, agency, - datetime_submitted, date_due, days_until_due, date_followup, - datetime_done, datetime_updated, date_embargo, tracking_id, - price, disable_autofollowups, tags, communications, absolute_url) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - """ - - -def create_db() -> bool: - """ - Creates foia_data.db SQLite database with one table named `results`. - - Returns: - bool: True, if database is successfully created; False otherwise. - - Raises: - sqlite3.Error: If the table creation operation fails, - prints error and returns False. - """ - with SQLiteClientContextManager("foia_data.db") as client: - try: - client.execute_query(create_table_query) - return True - except SQLClientError as e: - print(f"SQLite error: {e}.") - logging.error(f"Failed to create foia_data.db due to SQLite error: {e}") - return False - -def transform_page_data(data_to_transform: JSON) -> List[Tuple[Any, ...]]: - """ - Transforms the data received from the MuckRock FOIA API - into a structured format for insertion into a database with `populate_db()`. - - Transforms JSON input into a list of tuples, - as well as serializes the nested `tags` and `communications` fields - into JSON strings. - - Args: - data_to_transform: The JSON data from the API response. - Returns: - A list of tuples, where each tuple contains the fields - of a single FOIA request. - """ - - transformed_data = [] - - for result in data_to_transform.get("results", []): - result["tags"] = json.dumps(result.get("tags", [])) - result["communications"] = json.dumps(result.get("communications", [])) - - transformed_data.append( - ( - result["id"], - result["title"], - result["slug"], - result["status"], - result["embargo_status"], - result["user"], - result["username"], - result["agency"], - result["datetime_submitted"], - result["date_due"], - result["days_until_due"], - result["date_followup"], - result["datetime_done"], - result["datetime_updated"], - result["date_embargo"], - result["tracking_id"], - result["price"], - result["disable_autofollowups"], - result["tags"], - result["communications"], - result["absolute_url"], - ) - ) - return transformed_data - - -def populate_db(transformed_data: List[Tuple[Any, ...]], page: int) -> None: - """ - Populates foia_data.db SQLite database with the transfomed FOIA request data. - - Args: - transformed_data (List[Tuple[Any, ...]]): A list of tuples, where each tuple contains the fields of a single FOIA request. - page (int): The current page number for printing and logging errors. - - Returns: - None - - Raises: - sqlite3.Error: If the insertion operation fails, attempts to retry operation (max_retries = 2). If retries are - exhausted, logs error and exits. - """ - with SQLiteClientContextManager("foia_data.db") as client: - retries = 0 - max_retries = 2 - while retries < max_retries: - try: - client.execute_query(foia_insert_query, many=transformed_data) - print("Successfully inserted data!") - return - except SQLClientError as e: - print(f"{e}. Retrying...") - retries += 1 - time.sleep(1) - - if retries == max_retries: - report_max_retries_error(max_retries, page) - - -def report_max_retries_error(max_retries, page): - print( - f"Failed to insert data from page {page} after { - max_retries} attempts. Skipping to next page." - ) - logging.error( - f"Failed to insert data from page {page} after { - max_retries} attempts." - ) - - -def main() -> None: - """ - Main entry point for create_foia_data_db.py. - - This function orchestrates the process of fetching - FOIA requests data from the MuckRock FOIA API, transforming it, - and storing it in a SQLite database. - """ - - if not os.path.exists("foia_data.db"): - print("Creating foia_data.db...") - success = create_db() - if success == False: - print("Failed to create foia_data.db") - return - - start_page = get_start_page() - fetcher = FOIAFetcher( - start_page=start_page - ) - - with tqdm(initial=start_page, unit="page") as pbar: - while True: - - # TODO: Build collector that does similar logic - try: - pbar.update() - page_data = fetcher.fetch_next_page() - except MuckrockNoMoreDataError: - # Exit program because no more data exists - break - if page_data is None: - continue - transformed_data = transform_page_data(page_data) - populate_db(transformed_data, fetcher.current_page) - - with open(last_page_fetched, mode="w") as file: - file.write(str(fetcher.current_page)) - - print("create_foia_data_db.py run finished") - - -def get_start_page(): - """ - Returns the page number to start fetching from. - - If the file `last_page_fetched` exists, - reads the page number from the file and returns it + 1. - Otherwise, returns 1. - """ - if os.path.exists(last_page_fetched): - with open(last_page_fetched, mode="r") as file: - page = int(file.read()) + 1 - else: - page = 1 - return page - - -if __name__ == "__main__": - try: - main() - except Exception as e: - logging.error(f"An unexpected error occurred: {e}") - print( - "Check errors.log to review errors. Run create_foia_data_db.py again to continue" - ) diff --git a/source_collectors/muckrock/get_allegheny_foias.py b/source_collectors/muckrock/get_allegheny_foias.py deleted file mode 100644 index ddfb1d60..00000000 --- a/source_collectors/muckrock/get_allegheny_foias.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -Get Allegheny County FOIA requests -and save them to a JSON file - -""" - -from source_collectors.muckrock.classes.fetch_requests.FOIALoopFetchRequest import FOIALoopFetchRequest -from source_collectors.muckrock.classes.muckrock_fetchers import JurisdictionLoopFetchRequest, \ - JurisdictionLoopFetcher -from source_collectors.muckrock.classes.muckrock_fetchers.FOIALoopFetcher import FOIALoopFetcher -from source_collectors.muckrock.utils import save_json_file - - -def fetch_jurisdiction_ids(town_file, level="l", parent=126): - """ - fetch jurisdiction IDs based on town names from a text file - """ - with open(town_file, "r") as file: - town_names = [line.strip() for line in file] - - request = JurisdictionLoopFetchRequest( - level=level, parent=parent, town_names=town_names - ) - - fetcher = JurisdictionLoopFetcher(request) - fetcher.loop_fetch() - return fetcher.jurisdictions - - - -def fetch_foia_data(jurisdiction_ids): - """ - fetch FOIA data for each jurisdiction ID and save it to a JSON file - """ - all_data = [] - for name, id_ in jurisdiction_ids.items(): - print(f"\nFetching records for {name}...") - request = FOIALoopFetchRequest(jurisdiction=id_) - fetcher = FOIALoopFetcher(request) - fetcher.loop_fetch() - all_data.extend(fetcher.ffm.results) - - # Save the combined data to a JSON file - save_json_file(file_path="foia_data_combined.json", data=all_data) - print(f"Saved {len(all_data)} records to foia_data_combined.json") - - -def main(): - """ - Execute the script - """ - town_file = "allegheny-county-towns.txt" - # Fetch jurisdiction IDs based on town names - jurisdiction_ids = fetch_jurisdiction_ids( - town_file, - level="l", - parent=126 - ) - print(f"Jurisdiction IDs fetched: {jurisdiction_ids}") - - # Fetch FOIA data for each jurisdiction ID - fetch_foia_data(jurisdiction_ids) - - -# Run the main function -if __name__ == "__main__": - main() diff --git a/source_collectors/muckrock/search_foia_data_db.py b/source_collectors/muckrock/search_foia_data_db.py deleted file mode 100644 index ede7d1de..00000000 --- a/source_collectors/muckrock/search_foia_data_db.py +++ /dev/null @@ -1,141 +0,0 @@ -""" -search_foia_data_db.py - -This script provides search functionality for the `foia_data.db` SQLite database. The search looks in `title`s and -`tags` of FOIA requests that match an input string provided by the user. -Run this after companion script `create_foia_data_db.py`. - -A successful run will output a JSON file containing entries matching the search string. - -Functions: - - parser_init() - - search_foia_db() - - parse_communications_column() - - generate_json() - - main() - -Error Handling: -Errors encountered during database operations, JSON parsing, or file writing are printed to the console. -""" - -import argparse -import json -from typing import Union, List, Dict - -import pandas as pd - -from source_collectors.muckrock.classes.FOIADBSearcher import FOIADBSearcher - - -def parser_init() -> argparse.ArgumentParser: - """ - Initializes the argument parser for search_foia_data_db.py. - - Returns: - argparse.ArgumentParser: The configured argument parser. - """ - - parser = argparse.ArgumentParser( - description="Search foia_data.db and generate a JSON file of resulting matches" - ) - parser.add_argument( - "--search_for", - type=str, - required=True, - metavar="", - help="Provide a string to search foia_data.db", - ) - - return parser - - -def search_foia_db(search_string: str) -> Union[pd.DataFrame, None]: - searcher = FOIADBSearcher() - return searcher.search(search_string) - - -def parse_communications_column(communications) -> List[Dict]: - """ - Parses a communications column value, decoding it from JSON format. - - Args: - communications : The input value to be parsed, which can be a JSON string or NaN. - - Returns: - list (List[Dict]): A list containing the parsed JSON data. If the input is NaN (missing values) or - there is a JSON decoding error, an empty list is returned. - - Raises: - json.JSONDecodeError: If deserialization fails, prints error and returns empty list. - """ - - if pd.isna(communications): - return [] - try: - return json.loads(communications) - except json.JSONDecodeError as e: - print(f"Error decoding JSON: {e}") - return [] - - -def generate_json(df: pd.DataFrame, search_string: str) -> None: - """ - Generates a JSON file from a pandas DataFrame. - - Args: - df (pandas.DataFrame): The DataFrame containing the data to be written to the JSON file. - - search_string (str): The string used to name the output JSON file. Spaces in the string - are replaced with underscores. - - Returns: - None - - Raises: - Exception: If writing to JSON file operation fails, prints error and returns. - """ - - output_json = f"{search_string.replace(' ', '_')}.json" - - try: - df.to_json(output_json, orient="records", indent=4) - print(f'Matching entries written to "{output_json}"') - except Exception as e: - print(f"An error occurred while writing JSON: {e}") - - -def main() -> None: - """ - Function to search the foia_data.db database for entries matching a specified search string. - - Command Line Args: - --search_for (str): A string to search for in the `title` and `tags` fields of FOIA requests. - """ - - parser = parser_init() - args = parser.parse_args() - search_string = args.search_for - - df = search_foia_db(search_string) - if df is None: - return - update_communications_column(df) - - announce_matching_entries(df, search_string) - - generate_json(df, search_string) - - -def announce_matching_entries(df, search_string): - print( - f'Found {df.shape[0]} matching entries containing "{search_string}" in the title or tags' - ) - - -def update_communications_column(df): - if not df["communications"].empty: - df["communications"] = df["communications"].apply(parse_communications_column) - - -if __name__ == "__main__": - main() From c743cdd3b7e72365edb09d56c0697d9ef0545fb6 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 24 Jan 2025 15:34:37 -0500 Subject: [PATCH 008/244] Add url_record_type_labeling directory and add init files to hugging_face directory and subdirectories --- hugging_face/__init__.py | 0 hugging_face/example/__init__.py | 0 hugging_face/testing/__init__.py | 0 hugging_face/url_record_type_labeling/__init__.py | 0 hugging_face/url_relevance/__init__.py | 0 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 hugging_face/__init__.py create mode 100644 hugging_face/example/__init__.py create mode 100644 hugging_face/testing/__init__.py create mode 100644 hugging_face/url_record_type_labeling/__init__.py create mode 100644 hugging_face/url_relevance/__init__.py diff --git a/hugging_face/__init__.py b/hugging_face/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/hugging_face/example/__init__.py b/hugging_face/example/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/hugging_face/testing/__init__.py b/hugging_face/testing/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/hugging_face/url_record_type_labeling/__init__.py b/hugging_face/url_record_type_labeling/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/hugging_face/url_relevance/__init__.py b/hugging_face/url_relevance/__init__.py new file mode 100644 index 00000000..e69de29b From 076fbbba8c233e6dc1486cc15e2a595e07fe1b13 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 24 Jan 2025 15:35:01 -0500 Subject: [PATCH 009/244] Add url_record_type_labeling directory to Dockerfile --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index b2949405..86bd21b1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,6 +20,7 @@ COPY collector_manager ./collector_manager COPY core ./core COPY html_tag_collector ./html_tag_collector COPY hugging_face/url_relevance ./hugging_face/url_relevance +COPY hugging_face/url_record_type_labeling ./hugging_face/url_record_type_labeling COPY hugging_face/HuggingFaceInterface.py ./hugging_face/HuggingFaceInterface.py COPY source_collectors ./source_collectors COPY util ./util From 8f81089c079824bb2b399bca88e8a064dcf5a3df Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 27 Jan 2025 09:12:56 -0500 Subject: [PATCH 010/244] Remove unused json files --- html_tag_collector/url_cache.json | 5 ----- html_tag_collector/urls.json | 17 ----------------- 2 files changed, 22 deletions(-) delete mode 100644 html_tag_collector/url_cache.json delete mode 100644 html_tag_collector/urls.json diff --git a/html_tag_collector/url_cache.json b/html_tag_collector/url_cache.json deleted file mode 100644 index d4a340e1..00000000 --- a/html_tag_collector/url_cache.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "http://www.example.com": "Example Domain", - "http://www.google.com": "Google", - "https://books.toscrape.com": "\n All products | Books to Scrape - Sandbox\n" -} \ No newline at end of file diff --git a/html_tag_collector/urls.json b/html_tag_collector/urls.json deleted file mode 100644 index 79574f93..00000000 --- a/html_tag_collector/urls.json +++ /dev/null @@ -1,17 +0,0 @@ -[{ - "id": 1, - "url": "https://pdap.io", - "label": "Label" -}, { - "id": 2, - "url": "https://pdapio.io", - "label": "Label" -}, { - "id": 3, - "url": "https://pdap.dev", - "label": "Label" -}, { - "id": 4, - "url": "https://pdap.io/404test", - "label": "Label" -}] From 4c9f03f8d9e91d1fd955922d9150d57b36643bf5 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 27 Jan 2025 09:37:21 -0500 Subject: [PATCH 011/244] Begin draft --- core/enums.py | 40 +++++++++- hugging_face/HuggingFaceInterface.py | 6 +- hugging_face/URLClassifier.py | 10 +++ llm_api_logic/DeepSeekRecordClassifier.py | 92 +++++++++++++++++++++++ llm_api_logic/__init__.py | 0 requirements.txt | 2 +- 6 files changed, 146 insertions(+), 4 deletions(-) create mode 100644 hugging_face/URLClassifier.py create mode 100644 llm_api_logic/DeepSeekRecordClassifier.py create mode 100644 llm_api_logic/__init__.py diff --git a/core/enums.py b/core/enums.py index 69505406..605e49e5 100644 --- a/core/enums.py +++ b/core/enums.py @@ -9,4 +9,42 @@ class BatchStatus(Enum): class LabelStudioTaskStatus(Enum): PENDING = "pending" - COMPLETED = "completed" \ No newline at end of file + COMPLETED = "completed" + +class RecordType(Enum): + ACCIDENT_REPORTS = "Accident Reports" + ARREST_RECORDS = "Arrest Records" + CALLS_FOR_SERVICE = "Calls for Service" + CAR_GPS = "Car GPS" + CITATIONS = "Citations" + DISPATCH_LOGS = "Dispatch Logs" + DISPATCH_RECORDINGS = "Dispatch Recordings" + FIELD_CONTACTS = "Field Contacts" + INCIDENT_REPORTS = "Incident Reports" + MISC_POLICE_ACTIVITY = "Misc Police Activity" + OFFICER_INVOLVED_SHOOTINGS = "Officer Involved Shootings" + STOPS = "Stops" + SURVEYS = "Surveys" + USE_OF_FORCE_REPORTS = "Use of Force Reports" + VEHICLE_PURSUITS = "Vehicle Pursuits" + COMPLAINTS_AND_MISCONDUCT = "Complaints & Misconduct" + DAILY_ACTIVITY_LOGS = "Daily Activity Logs" + TRAINING_AND_HIRING_INFO = "Training & Hiring Info" + PERSONNEL_RECORDS = "Personnel Records" + ANNUAL_AND_MONTHLY_REPORTS = "Annual & Monthly Reports" + BUDGETS_AND_FINANCES = "Budgets & Finances" + CONTACT_INFO_AND_AGENCY_META = "Contact Info & Agency Meta" + GEOGRAPHIC = "Geographic" + LIST_OF_DATA_SOURCES = "List of Data Sources" + POLICIES_AND_CONTRACTS = "Policies & Contracts" + CRIME_MAPS_AND_REPORTS = "Crime Maps & Reports" + CRIME_STATISTICS = "Crime Statistics" + MEDIA_BULLETINS = "Media Bulletins" + RECORDS_REQUEST_INFO = "Records Request Info" + RESOURCES = "Resources" + SEX_OFFENDER_REGISTRY = "Sex Offender Registry" + WANTED_PERSONS = "Wanted Persons" + BOOKING_REPORTS = "Booking Reports" + COURT_CASES = "Court Cases" + INCARCERATION_RECORDS = "Incarceration Records" + OTHER = "Other" diff --git a/hugging_face/HuggingFaceInterface.py b/hugging_face/HuggingFaceInterface.py index efb54b75..2ea635d5 100644 --- a/hugging_face/HuggingFaceInterface.py +++ b/hugging_face/HuggingFaceInterface.py @@ -1,12 +1,14 @@ from transformers import pipeline from collector_db.DTOs.URLWithHTML import URLWithHTML +from hugging_face.URLClassifier import URLClassifier class HuggingFaceInterface: def __init__(self): - self.pipe = pipeline("text-classification", model="PDAP/url-relevance") + self.relevance_pipe = pipeline("text-classification", model="PDAP/url-relevance") + self.url_classifier = URLClassifier() def get_url_relevancy( self, @@ -14,7 +16,7 @@ def get_url_relevancy( threshold: float = 0.5 ) -> list[bool]: urls = [url_with_html.url for url_with_html in urls_with_html] - results: list[dict] = self.pipe(urls) + results: list[dict] = self.relevance_pipe(urls) bool_results = [] for result in results: diff --git a/hugging_face/URLClassifier.py b/hugging_face/URLClassifier.py new file mode 100644 index 00000000..04380645 --- /dev/null +++ b/hugging_face/URLClassifier.py @@ -0,0 +1,10 @@ +from multimodal_transformers.model import DistilBertWithTabular +from transformers import AutoTokenizer + + +class URLClassifier: + + def __init__(self): + self.tokenizer = AutoTokenizer.from_pretrained("PDAP/url-classifier") + self.model = DistilBertWithTabular.from_pretrained("PDAP/url-classifier") + self.model.eval() diff --git a/llm_api_logic/DeepSeekRecordClassifier.py b/llm_api_logic/DeepSeekRecordClassifier.py new file mode 100644 index 00000000..dde870b6 --- /dev/null +++ b/llm_api_logic/DeepSeekRecordClassifier.py @@ -0,0 +1,92 @@ +import os + +from openai import OpenAI + +from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from collector_db.DTOs.URLWithHTML import URLWithHTML +from core.enums import RecordType + +QUERY_CONTENT = """ + You will be provided with structured data from a web page and determine + the record type. + + The record types are as follows + + "Accident Reports": Records of vehicle accidents. + "Arrest Records": Records of each arrest made in the agency's jurisdiction. + "Calls for Service": Records of officers initiating activity or responding to requests for police response. Often called "Dispatch Logs" or "Incident Reports" when published. + "Car GPS": Records of police car location. Not generally posted online. + "Citations": Records of low-level criminal offenses where a police officer issued a citation instead of an arrest. + "Dispatch Logs": Records of calls or orders made by police dispatchers. + "Dispatch Recordings": Audio feeds and/or archives of municipal dispatch channels. + "Field Contacts": Reports of contact between police and civilians. May include uses of force, incidents, arrests, or contacts where nothing notable happened. + "Incident Reports": Reports made by police officers after responding to a call which may or may not be criminal in nature. Not generally posted online. + "Misc Police Activity": Records or descriptions of police activity not covered by other record types. + "Officer Involved Shootings": Case files of gun violence where a police officer was involved, typically as the shooter. Detailed, often containing references to records like Media Bulletins and Use of Force Reports. + "Stops": Records of pedestrian or traffic stops made by police. + "Surveys": Information captured from a sample of some population, like incarcerated people or magistrate judges. Often generated independently. + "Use of Force Reports": Records of use of force against civilians by police officers. + "Vehicle Pursuits": Records of cases where police pursued a person fleeing in a vehicle. + "Complaints & Misconduct": Records, statistics, or summaries of complaints and misconduct investigations into law enforcement officers. + "Daily Activity Logs": Officer-created reports or time sheets of what happened on a shift. Not generally posted online. + "Training & Hiring Info": Records and descriptions of additional training for police officers. + "Personnel Records": Records of hiring and firing, certification, discipline, and other officer-specific events. Not generally posted online. + "Annual & Monthly Reports": Often in PDF form, featuring summaries or high-level updates about the police force. Can contain versions of other record types, especially summaries. + "Budgets & Finances": Budgets, finances, grants, or other financial documents. + "Contact Info & Agency Meta": Information about organizational structure, including department structure and contact info. + "Geographic": Maps or geographic data about how land is divided up into municipal sectors, zones, and jurisdictions. + "List of Data Sources": Places on the internet, often data portal homepages, where many links to potential data sources can be found. + "Policies & Contracts": Policies or contracts related to agency procedure. + "Crime Maps & Reports": Records of individual crimes in map or table form for a given jurisdiction. + "Crime Statistics": Summarized information about crime in a given jurisdiction. + "Media Bulletins": Press releases, blotters, or blogs intended to broadly communicate alerts, requests, or other timely information. + "Records Request Info": Portals, forms, policies, or other resources for making public records requests. + "Resources": Agency-provided information or guidance about services, prices, best practices, etc. + "Sex Offender Registry": Index of people registered, usually by law, with the government as sex offenders. + "Wanted Persons": Names, descriptions, images, and associated information about people with outstanding arrest warrants. + "Booking Reports": Records of booking or intake into corrections institutions. + "Court Cases": Records such as dockets about individual court cases. + "Incarceration Records": Records of current inmates, often with full names and features for notification upon inmate release. + "Other": Other record types not otherwise described. + + Output the record type in the following format. Do not include any other information: + + { + "record_type": "" + } + """ + +def dictify_html_info(html_info: URLHTMLContentInfo) -> dict: + + + +class DeepSeekRecordClassifier: + + def __init__(self): + self.client = OpenAI( + api_key=os.getenv("DEEPSEEK_API_KEY"), + base_url="https://api.deepseek.com" + ) + + def build_query_messages(self, html_info: URLHTMLContentInfo) -> list[dict[str, str]]: + insert_content = dictify_html_info(html_info) + return [ + { + "role": "system", + "content": QUERY_CONTENT + }, + { + "role": "user", + "content": f"```json{insert_content}```" + } + ] + + def classify_url(self, url_with_html: URLWithHTML) -> RecordType: + response = self.client.chat.completions.create( + model="deepseek-chat", + messages=self.build_query_messages(url_with_html.html_infos[0]), + stream=False, + response_format={ + 'type': 'json_object' + } + ) diff --git a/llm_api_logic/__init__.py b/llm_api_logic/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/requirements.txt b/requirements.txt index c05cfbfa..2cc28614 100644 --- a/requirements.txt +++ b/requirements.txt @@ -45,4 +45,4 @@ PyJWT~=2.10.1 # Tests pytest-timeout~=2.3.1 - +openai~=1.60.1 From 5cca756d48e256bb147f830ef7aada1cd02333d0 Mon Sep 17 00:00:00 2001 From: maxachis Date: Mon, 27 Jan 2025 11:07:20 -0500 Subject: [PATCH 012/244] Create first draft of DeepSeek record classifier and test --- llm_api_logic/DeepSeekRecordClassifier.py | 24 ++++++++------- tests/manual/llm_api_logic/__init__.py | 0 .../test_deepseek_record_classifier.py | 29 +++++++++++++++++++ 3 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 tests/manual/llm_api_logic/__init__.py create mode 100644 tests/manual/llm_api_logic/test_deepseek_record_classifier.py diff --git a/llm_api_logic/DeepSeekRecordClassifier.py b/llm_api_logic/DeepSeekRecordClassifier.py index dde870b6..1348b358 100644 --- a/llm_api_logic/DeepSeekRecordClassifier.py +++ b/llm_api_logic/DeepSeekRecordClassifier.py @@ -1,9 +1,8 @@ import os -from openai import OpenAI +from openai import AsyncOpenAI from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo -from collector_db.DTOs.URLWithHTML import URLWithHTML from core.enums import RecordType QUERY_CONTENT = """ @@ -56,20 +55,22 @@ } """ -def dictify_html_info(html_info: URLHTMLContentInfo) -> dict: - - +def dictify_html_info(html_infos: list[URLHTMLContentInfo]) -> dict[str, str]: + d = {} + for html_info in html_infos: + d[html_info.content_type.value] = html_info.content + return d class DeepSeekRecordClassifier: def __init__(self): - self.client = OpenAI( + self.client = AsyncOpenAI( api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com" ) - def build_query_messages(self, html_info: URLHTMLContentInfo) -> list[dict[str, str]]: - insert_content = dictify_html_info(html_info) + def build_query_messages(self, content_infos: list[URLHTMLContentInfo]) -> list[dict[str, str]]: + insert_content = dictify_html_info(content_infos) return [ { "role": "system", @@ -81,12 +82,13 @@ def build_query_messages(self, html_info: URLHTMLContentInfo) -> list[dict[str, } ] - def classify_url(self, url_with_html: URLWithHTML) -> RecordType: - response = self.client.chat.completions.create( + async def classify_url(self, content_infos: list[URLHTMLContentInfo]) -> RecordType: + response = await self.client.chat.completions.create( model="deepseek-chat", - messages=self.build_query_messages(url_with_html.html_infos[0]), + messages=self.build_query_messages(content_infos), stream=False, response_format={ 'type': 'json_object' } ) + return RecordType(response["choices"][0]["message"]["content"]["record_type"]) diff --git a/tests/manual/llm_api_logic/__init__.py b/tests/manual/llm_api_logic/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/manual/llm_api_logic/test_deepseek_record_classifier.py b/tests/manual/llm_api_logic/test_deepseek_record_classifier.py new file mode 100644 index 00000000..48692023 --- /dev/null +++ b/tests/manual/llm_api_logic/test_deepseek_record_classifier.py @@ -0,0 +1,29 @@ +import pytest + +from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier + + +@pytest.mark.asyncio +async def test_deepseek_record_classifier(): + from collector_db.DTOs.URLHTMLContentInfo import HTMLContentType as hct + + d = { + hct.TITLE: "test title", + hct.DESCRIPTION: "test description", + hct.H1: "test h1", + hct.H2: "test h2", + hct.H3: "test h3", + hct.H4: "test h4", + hct.H5: "test h5", + hct.H6: "test h6", + hct.DIV: "test div", + } + content_infos = [] + for k, v in d.items(): + content_info = URLHTMLContentInfo(content_type=k, content=v) + content_infos.append(content_info) + + classifier = DeepSeekRecordClassifier() + result = await classifier.classify_url(content_infos) + print(result) \ No newline at end of file From e1dce2f292b9304d9f860e9562e2d6a84576aec1 Mon Sep 17 00:00:00 2001 From: maxachis Date: Mon, 27 Jan 2025 12:23:56 -0500 Subject: [PATCH 013/244] Change "Cycle" term to "Task" for clarity. Add README description. --- collector_db/AsyncDatabaseClient.py | 48 ++++++++++ .../RelevanceLabelStudioInputCycleInfo.py | 9 -- collector_db/enums.py | 5 + collector_db/models.py | 1 + core/AsyncCore.py | 26 ++--- ...URLHTMLCycleInfo.py => URLHTMLTaskInfo.py} | 2 +- core/DTOs/URLRecordTypeTaskInfo.py | 11 +++ ....py => URLRelevanceHuggingfaceTaskInfo.py} | 2 +- core/README.md | 11 ++- core/ScheduledTaskManager.py | 2 +- core/classes/URLHTMLCycler.py | 95 ------------------- core/classes/URLHTMLTaskOperator.py | 95 +++++++++++++++++++ core/classes/URLRecordTypeTaskOperator.py | 24 +++++ ...=> URLRelevanceHuggingfaceTaskOperator.py} | 47 +++++---- .../test_html_tag_collector_integration.py | 10 +- .../test_url_relevancy_huggingface_cycle.py | 6 +- 16 files changed, 245 insertions(+), 149 deletions(-) delete mode 100644 collector_db/DTOs/RelevanceLabelStudioInputCycleInfo.py rename core/DTOs/{URLHTMLCycleInfo.py => URLHTMLTaskInfo.py} (94%) create mode 100644 core/DTOs/URLRecordTypeTaskInfo.py rename core/DTOs/{URLRelevanceHuggingfaceCycleInfo.py => URLRelevanceHuggingfaceTaskInfo.py} (78%) delete mode 100644 core/classes/URLHTMLCycler.py create mode 100644 core/classes/URLHTMLTaskOperator.py create mode 100644 core/classes/URLRecordTypeTaskOperator.py rename core/classes/{URLRelevanceHuggingfaceCycler.py => URLRelevanceHuggingfaceTaskOperator.py} (51%) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index db94a8d5..e83d10ca 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -119,11 +119,59 @@ async def get_pending_urls_without_html_data(self, session: AsyncSession): scalar_result = await session.scalars(statement) return scalar_result.all() + @session_manager + async def get_urls_with_html_data_and_without_metadata_type( + self, + session: AsyncSession, + without_metadata_type: URLMetadataAttributeType = URLMetadataAttributeType.RELEVANT + ): + + # TODO: Generalize this so that it can exclude based on other attributes + # Get URLs with no relevancy metadata + statement = (select(URL.id, URL.url, URLHTMLContent). + join(URLHTMLContent). + where(URL.outcome == URLStatus.PENDING.value) + # No relevancy metadata + .where( + ~exists( + select(URLMetadata.id). + where( + URLMetadata.url_id == URL.id, + URLMetadata.attribute == without_metadata_type.value + ) + ) + ) + .limit(100) + .order_by(URL.id) + ) + raw_result = await session.execute(statement) + result = raw_result.all() + url_ids_to_urls = {url_id: url for url_id, url, _ in result} + url_ids_to_html_info = {url_id: [] for url_id, _, _ in result} + + for url_id, _, html_info in result: + url_ids_to_html_info[url_id].append( + URLHTMLContentInfo(**html_info.__dict__) + ) + + final_results = [] + for url_id, url in url_ids_to_urls.items(): + url_with_html = URLWithHTML( + url_id=url_id, + url=url, + html_infos=url_ids_to_html_info[url_id] + ) + final_results.append(url_with_html) + + + return final_results + @session_manager async def get_urls_with_html_data_and_no_relevancy_metadata( self, session: AsyncSession ) -> list[URLWithHTML]: + # TODO: Generalize this so that it can exclude based on other attributes # Get URLs with no relevancy metadata statement = (select(URL.id, URL.url, URLHTMLContent). join(URLHTMLContent). diff --git a/collector_db/DTOs/RelevanceLabelStudioInputCycleInfo.py b/collector_db/DTOs/RelevanceLabelStudioInputCycleInfo.py deleted file mode 100644 index 644e0e27..00000000 --- a/collector_db/DTOs/RelevanceLabelStudioInputCycleInfo.py +++ /dev/null @@ -1,9 +0,0 @@ -from pydantic import BaseModel - -from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo - - -class RelevanceLabelStudioInputCycleInfo(BaseModel): - url: str - metadata_id: int - html_content_info: list[URLHTMLContentInfo] \ No newline at end of file diff --git a/collector_db/enums.py b/collector_db/enums.py index fa66aac4..66734a9c 100644 --- a/collector_db/enums.py +++ b/collector_db/enums.py @@ -32,6 +32,11 @@ class URLHTMLContentType(PyEnum): H6 = "H6" DIV = "Div" +class TaskType(PyEnum): + HTML = "HTML" + RELEVANCY = "Relevancy" + RECORD_TYPE = "Record Type" + class PGEnum(TypeDecorator): impl = postgresql.ENUM diff --git a/collector_db/models.py b/collector_db/models.py index 273d956f..03837a0b 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -158,6 +158,7 @@ class URLErrorInfo(Base): url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) error = Column(Text, nullable=False) updated_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) + # TODO: Add Info on Cycle the task occurred in # Relationships url = relationship("URL", back_populates="error_info") diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 67f134b1..de70abd2 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -6,8 +6,8 @@ from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo from core.DTOs.RelevanceAnnotationInfo import RelevanceAnnotationPostInfo from core.DTOs.RelevanceAnnotationRequestInfo import RelevanceAnnotationRequestInfo -from core.classes.URLHTMLCycler import URLHTMLCycler -from core.classes.URLRelevanceHuggingfaceCycler import URLRelevanceHuggingfaceCycler +from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator +from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator from html_tag_collector.DataClassTags import convert_to_response_html_info from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.URLRequestInterface import URLRequestInterface @@ -30,26 +30,26 @@ def __init__( self.logger = logging.getLogger(__name__) self.logger.setLevel(logging.INFO) - async def run_url_html_cycle(self): - self.logger.info("Running URL HTML Cycle") - cycler = URLHTMLCycler( + async def run_url_html_task(self): + self.logger.info("Running URL HTML Task") + operator = URLHTMLTaskOperator( adb_client=self.adb_client, url_request_interface=self.url_request_interface, html_parser=self.html_parser ) - await cycler.cycle() + await operator.run_task() - async def run_url_relevance_huggingface_cycle(self): - self.logger.info("Running URL Relevance Huggingface Cycle") - cycler = URLRelevanceHuggingfaceCycler( + async def run_url_relevance_huggingface_task(self): + self.logger.info("Running URL Relevance Huggingface Task") + operator = URLRelevanceHuggingfaceTaskOperator( adb_client=self.adb_client, huggingface_interface=self.huggingface_interface ) - await cycler.cycle() + await operator.run_task() - async def run_cycles(self): - await self.run_url_html_cycle() - await self.run_url_relevance_huggingface_cycle() + async def run_tasks(self): + await self.run_url_html_task() + await self.run_url_relevance_huggingface_task() async def convert_to_relevance_annotation_request_info(self, url_info: URLAnnotationInfo) -> RelevanceAnnotationRequestInfo: response_html_info = convert_to_response_html_info( diff --git a/core/DTOs/URLHTMLCycleInfo.py b/core/DTOs/URLHTMLTaskInfo.py similarity index 94% rename from core/DTOs/URLHTMLCycleInfo.py rename to core/DTOs/URLHTMLTaskInfo.py index 1d739375..cff69e4f 100644 --- a/core/DTOs/URLHTMLCycleInfo.py +++ b/core/DTOs/URLHTMLTaskInfo.py @@ -7,7 +7,7 @@ @dataclass -class URLHTMLCycleInfo: +class URLHTMLTaskInfo: url_info: URLInfo url_response_info: Optional[URLResponseInfo] = None html_tag_info: Optional[ResponseHTMLInfo] = None diff --git a/core/DTOs/URLRecordTypeTaskInfo.py b/core/DTOs/URLRecordTypeTaskInfo.py new file mode 100644 index 00000000..6c5d8ea7 --- /dev/null +++ b/core/DTOs/URLRecordTypeTaskInfo.py @@ -0,0 +1,11 @@ +from typing import Optional + +from pydantic import BaseModel + +from collector_db.DTOs.URLWithHTML import URLWithHTML +from core.enums import RecordType + + +class URLRecordTypeTaskInfo(BaseModel): + url_with_html: URLWithHTML + record_type: Optional[RecordType] = None \ No newline at end of file diff --git a/core/DTOs/URLRelevanceHuggingfaceCycleInfo.py b/core/DTOs/URLRelevanceHuggingfaceTaskInfo.py similarity index 78% rename from core/DTOs/URLRelevanceHuggingfaceCycleInfo.py rename to core/DTOs/URLRelevanceHuggingfaceTaskInfo.py index 19318e6a..bb4553d1 100644 --- a/core/DTOs/URLRelevanceHuggingfaceCycleInfo.py +++ b/core/DTOs/URLRelevanceHuggingfaceTaskInfo.py @@ -5,6 +5,6 @@ from collector_db.DTOs.URLWithHTML import URLWithHTML -class URLRelevanceHuggingfaceCycleInfo(BaseModel): +class URLRelevanceHuggingfaceTaskInfo(BaseModel): url_with_html: URLWithHTML relevant: Optional[bool] = None diff --git a/core/README.md b/core/README.md index c9095c41..25b1cde3 100644 --- a/core/README.md +++ b/core/README.md @@ -2,4 +2,13 @@ The Source Collector Core is a directory which integrates: 1. The Collector Manager 2. The Source Collector Database 3. The API (to be developed) -4. The PDAP API Client (to be developed) \ No newline at end of file +4. The PDAP API Client (to be developed) + +# Nomenclature + +- **Collector**: A submodule for collecting URLs. Different collectors utilize different sources and different methods for gathering URLs. +- **Batch**: URLs are collected in Collector Batches, with different collectors producing different Batches. +- **Cycle**: Refers to the overall lifecycle for Each URL -- from initial retrieval in a Batch to either disposal or incorporation into the Data Sources App Database +- **Task**: A semi-independent operation performed on a set of URLs. These include: Collection, retrieving HTML data, getting metadata via Machine Learning, and so on. +- **Task Set**: Refers to a group of URLs that are operated on together as part of a single task. These URLs in a set are not necessarily all from the same batch. URLs in a task set should only be operated on in that task once. +- **Task Operator**: A class which performs a single task on a set of URLs. \ No newline at end of file diff --git a/core/ScheduledTaskManager.py b/core/ScheduledTaskManager.py index 590690d1..e061adee 100644 --- a/core/ScheduledTaskManager.py +++ b/core/ScheduledTaskManager.py @@ -52,7 +52,7 @@ def __init__(self, async_core: AsyncCore): def add_scheduled_tasks(self): self.run_cycles_job = self.scheduler.add_job( - self.async_core.run_cycles, + self.async_core.run_tasks, trigger=IntervalTrigger( hours=1, start_date=datetime.now() + timedelta(minutes=1) diff --git a/core/classes/URLHTMLCycler.py b/core/classes/URLHTMLCycler.py deleted file mode 100644 index 73344a9c..00000000 --- a/core/classes/URLHTMLCycler.py +++ /dev/null @@ -1,95 +0,0 @@ -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from collector_db.DTOs.URLInfo import URLInfo -from core.DTOs.URLHTMLCycleInfo import URLHTMLCycleInfo -from core.classes.HTMLContentInfoGetter import HTMLContentInfoGetter -from html_tag_collector.ResponseParser import HTMLResponseParser -from html_tag_collector.URLRequestInterface import URLRequestInterface - - -class URLHTMLCycler: - - def __init__( - self, - url_request_interface: URLRequestInterface, - adb_client: AsyncDatabaseClient, - html_parser: HTMLResponseParser - ): - self.url_request_interface = url_request_interface - self.adb_client = adb_client - self.html_parser = html_parser - - async def cycle(self): - print("Running URL HTML Cycle...") - cycle_infos = await self.get_pending_urls_without_html_data() - await self.get_raw_html_data_for_urls(cycle_infos) - success_cycles, error_cycles = await self.separate_success_and_error_cycles(cycle_infos) - await self.update_errors_in_database(error_cycles) - await self.process_html_data(success_cycles) - await self.update_html_data_in_database(success_cycles) - - - async def get_just_urls(self, cycle_infos: list[URLHTMLCycleInfo]): - return [cycle_info.url_info.url for cycle_info in cycle_infos] - - async def get_pending_urls_without_html_data(self): - pending_urls: list[URLInfo] = await self.adb_client.get_pending_urls_without_html_data() - cycle_infos = [ - URLHTMLCycleInfo( - url_info=url_info, - ) for url_info in pending_urls - ] - return cycle_infos - - async def get_raw_html_data_for_urls(self, cycle_infos: list[URLHTMLCycleInfo]): - just_urls = await self.get_just_urls(cycle_infos) - url_response_infos = await self.url_request_interface.make_requests(just_urls) - for cycle_info, url_response_info in zip(cycle_infos, url_response_infos): - cycle_info.url_response_info = url_response_info - - async def separate_success_and_error_cycles( - self, - cycle_infos: list[URLHTMLCycleInfo] - ) -> tuple[ - list[URLHTMLCycleInfo], # Successful - list[URLHTMLCycleInfo] # Error - ]: - errored_cycle_infos = [] - successful_cycle_infos = [] - for cycle_info in cycle_infos: - if not cycle_info.url_response_info.success: - errored_cycle_infos.append(cycle_info) - else: - successful_cycle_infos.append(cycle_info) - return successful_cycle_infos, errored_cycle_infos - - async def update_errors_in_database(self, errored_cycle_infos: list[URLHTMLCycleInfo]): - error_infos = [] - for errored_cycle_info in errored_cycle_infos: - error_info = URLErrorPydanticInfo( - url_id=errored_cycle_info.url_info.id, - error=str(errored_cycle_info.url_response_info.exception), - ) - error_infos.append(error_info) - await self.adb_client.add_url_error_infos(error_infos) - - async def process_html_data(self, cycle_infos: list[URLHTMLCycleInfo]): - for cycle_info in cycle_infos: - html_tag_info = await self.html_parser.parse( - url=cycle_info.url_info.url, - html_content=cycle_info.url_response_info.html, - content_type=cycle_info.url_response_info.content_type - ) - cycle_info.html_tag_info = html_tag_info - - async def update_html_data_in_database(self, cycle_infos: list[URLHTMLCycleInfo]): - html_content_infos = [] - for cycle_info in cycle_infos: - hcig = HTMLContentInfoGetter( - response_html_info=cycle_info.html_tag_info, - url_id=cycle_info.url_info.id - ) - results = hcig.get_all_html_content() - html_content_infos.extend(results) - - await self.adb_client.add_html_content_infos(html_content_infos) diff --git a/core/classes/URLHTMLTaskOperator.py b/core/classes/URLHTMLTaskOperator.py new file mode 100644 index 00000000..42c3e21a --- /dev/null +++ b/core/classes/URLHTMLTaskOperator.py @@ -0,0 +1,95 @@ +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from collector_db.DTOs.URLInfo import URLInfo +from core.DTOs.URLHTMLTaskInfo import URLHTMLTaskInfo +from core.classes.HTMLContentInfoGetter import HTMLContentInfoGetter +from html_tag_collector.ResponseParser import HTMLResponseParser +from html_tag_collector.URLRequestInterface import URLRequestInterface + + +class URLHTMLTaskOperator: + + def __init__( + self, + url_request_interface: URLRequestInterface, + adb_client: AsyncDatabaseClient, + html_parser: HTMLResponseParser + ): + self.url_request_interface = url_request_interface + self.adb_client = adb_client + self.html_parser = html_parser + + async def run_task(self): + print("Running URL HTML Task...") + task_infos = await self.get_pending_urls_without_html_data() + await self.get_raw_html_data_for_urls(task_infos) + success_subset, error_subset = await self.separate_success_and_error_subsets(task_infos) + await self.update_errors_in_database(error_subset) + await self.process_html_data(success_subset) + await self.update_html_data_in_database(success_subset) + + + async def get_just_urls(self, task_infos: list[URLHTMLTaskInfo]): + return [task_info.url_info.url for task_info in task_infos] + + async def get_pending_urls_without_html_data(self): + pending_urls: list[URLInfo] = await self.adb_client.get_pending_urls_without_html_data() + task_infos = [ + URLHTMLTaskInfo( + url_info=url_info, + ) for url_info in pending_urls + ] + return task_infos + + async def get_raw_html_data_for_urls(self, task_infos: list[URLHTMLTaskInfo]): + just_urls = await self.get_just_urls(task_infos) + url_response_infos = await self.url_request_interface.make_requests(just_urls) + for task_info, url_response_info in zip(task_infos, url_response_infos): + task_info.url_response_info = url_response_info + + async def separate_success_and_error_subsets( + self, + task_infos: list[URLHTMLTaskInfo] + ) -> tuple[ + list[URLHTMLTaskInfo], # Successful + list[URLHTMLTaskInfo] # Error + ]: + errored_task_infos = [] + successful_task_infos = [] + for task_info in task_infos: + if not task_info.url_response_info.success: + errored_task_infos.append(task_info) + else: + successful_task_infos.append(task_info) + return successful_task_infos, errored_task_infos + + async def update_errors_in_database(self, errored_task_infos: list[URLHTMLTaskInfo]): + error_infos = [] + for error_task_info in errored_task_infos: + error_info = URLErrorPydanticInfo( + url_id=error_task_info.url_info.id, + error=str(error_task_info.url_response_info.exception), + ) + error_infos.append(error_info) + await self.adb_client.add_url_error_infos(error_infos) + + async def process_html_data(self, task_infos: list[URLHTMLTaskInfo]): + for task_info in task_infos: + html_tag_info = await self.html_parser.parse( + url=task_info.url_info.url, + html_content=task_info.url_response_info.html, + content_type=task_info.url_response_info.content_type + ) + task_info.html_tag_info = html_tag_info + + async def update_html_data_in_database(self, task_infos: list[URLHTMLTaskInfo]): + html_content_infos = [] + for task_info in task_infos: + hcig = HTMLContentInfoGetter( + response_html_info=task_info.html_tag_info, + url_id=task_info.url_info.id + ) + results = hcig.get_all_html_content() + html_content_infos.extend(results) + + await self.adb_client.add_html_content_infos(html_content_infos) diff --git a/core/classes/URLRecordTypeTaskOperator.py b/core/classes/URLRecordTypeTaskOperator.py new file mode 100644 index 00000000..3b1b27b2 --- /dev/null +++ b/core/classes/URLRecordTypeTaskOperator.py @@ -0,0 +1,24 @@ +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_db.enums import URLMetadataAttributeType +from llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier + + +class URLRecordTypeTaskOperator: + + def __init__( + self, + adb_client: AsyncDatabaseClient, + classifier: DeepSeekRecordClassifier + ): + self.adb_client = adb_client + self.classifier = classifier + + async def run_task(self): + # Get pending urls from Source Collector + # with HTML data and without Record Type Metadata + task_infos = await self.adb_client.get_pending_urls_without_html_data( + without_metadata_attribute=URLMetadataAttributeType.RECORD_TYPE + ) + + + async def get_ml_classifications(self, task_infos: list[URLRecordTypeTaskInfo]): \ No newline at end of file diff --git a/core/classes/URLRelevanceHuggingfaceCycler.py b/core/classes/URLRelevanceHuggingfaceTaskOperator.py similarity index 51% rename from core/classes/URLRelevanceHuggingfaceCycler.py rename to core/classes/URLRelevanceHuggingfaceTaskOperator.py index 8ffdb705..904adbe1 100644 --- a/core/classes/URLRelevanceHuggingfaceCycler.py +++ b/core/classes/URLRelevanceHuggingfaceTaskOperator.py @@ -2,11 +2,11 @@ from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.DTOs.URLWithHTML import URLWithHTML from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource -from core.DTOs.URLRelevanceHuggingfaceCycleInfo import URLRelevanceHuggingfaceCycleInfo +from core.DTOs.URLRelevanceHuggingfaceTaskInfo import URLRelevanceHuggingfaceTaskInfo from hugging_face.HuggingFaceInterface import HuggingFaceInterface -class URLRelevanceHuggingfaceCycler: +class URLRelevanceHuggingfaceTaskOperator: def __init__( self, @@ -16,41 +16,48 @@ def __init__( self.adb_client = adb_client self.huggingface_interface = huggingface_interface - async def cycle(self): + async def run_task(self): # Get pending urls from Source Collector # with HTML data and without Relevancy Metadata - cycle_infos = await self.get_pending_url_info() + task_infos = await self.get_pending_url_info( + without_metadata_attribute=URLMetadataAttributeType.RELEVANT + ) # Pipe into Huggingface - await self.add_huggingface_relevancy(cycle_infos) + await self.add_huggingface_relevancy(task_infos) # Put results into Database - await self.put_results_into_database(cycle_infos) + await self.put_results_into_database(task_infos) - async def put_results_into_database(self, cycle_infos): + async def put_results_into_database(self, task_infos): url_metadatas = [] - for cycle_info in cycle_infos: + for task_info in task_infos: url_metadata = URLMetadataInfo( - url_id=cycle_info.url_with_html.url_id, + url_id=task_info.url_with_html.url_id, attribute=URLMetadataAttributeType.RELEVANT, - value=str(cycle_info.relevant), + value=str(task_info.relevant), validation_status=ValidationStatus.PENDING_VALIDATION, validation_source=ValidationSource.MACHINE_LEARNING ) url_metadatas.append(url_metadata) await self.adb_client.add_url_metadatas(url_metadatas) - async def add_huggingface_relevancy(self, cycle_infos: list[URLRelevanceHuggingfaceCycleInfo]): - urls_with_html = [cycle_info.url_with_html for cycle_info in cycle_infos] + async def add_huggingface_relevancy(self, task_infos: list[URLRelevanceHuggingfaceTaskInfo]): + urls_with_html = [task_info.url_with_html for task_info in task_infos] results = self.huggingface_interface.get_url_relevancy(urls_with_html) - for cycle_info, result in zip(cycle_infos, results): - cycle_info.relevant = result + for task_info, result in zip(task_infos, results): + task_info.relevant = result - async def get_pending_url_info(self) -> list[URLRelevanceHuggingfaceCycleInfo]: - cycle_infos = [] - pending_urls: list[URLWithHTML] = await self.adb_client.get_urls_with_html_data_and_no_relevancy_metadata() + async def get_pending_url_info( + self, + without_metadata_attribute: URLMetadataAttributeType + ) -> list[URLRelevanceHuggingfaceTaskInfo]: + task_infos = [] + pending_urls: list[URLWithHTML] = await self.adb_client.get_urls_with_html_data_and_without_metadata_type( + without_metadata_type=without_metadata_attribute + ) for url_with_html in pending_urls: - cycle_info = URLRelevanceHuggingfaceCycleInfo( + task_info = URLRelevanceHuggingfaceTaskInfo( url_with_html=url_with_html ) - cycle_infos.append(cycle_info) - return cycle_infos + task_infos.append(task_info) + return task_infos diff --git a/tests/manual/html_collector/test_html_tag_collector_integration.py b/tests/manual/html_collector/test_html_tag_collector_integration.py index cb803e96..1673ca42 100644 --- a/tests/manual/html_collector/test_html_tag_collector_integration.py +++ b/tests/manual/html_collector/test_html_tag_collector_integration.py @@ -3,7 +3,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLInfo import URLInfo -from core.classes.URLHTMLCycler import URLHTMLCycler +from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator from helpers.DBDataCreator import DBDataCreator from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.RootURLCache import RootURLCache @@ -43,14 +43,14 @@ async def test_url_html_cycle_live_data( """ Tests the cycle on whatever exists in the DB """ - cycler = URLHTMLCycler( + operator = URLHTMLTaskOperator( adb_client=AsyncDatabaseClient(), url_request_interface=URLRequestInterface(), html_parser=HTMLResponseParser( root_url_cache=RootURLCache() ) ) - await cycler.cycle() + await operator.run_task() @pytest.mark.asyncio async def test_url_html_cycle( @@ -64,11 +64,11 @@ async def test_url_html_cycle( db_client.insert_urls(url_infos=url_infos, batch_id=batch_id) - cycler = URLHTMLCycler( + operator = URLHTMLTaskOperator( adb_client=AsyncDatabaseClient(), url_request_interface=URLRequestInterface(), html_parser=HTMLResponseParser( root_url_cache=RootURLCache() ) ) - await cycler.cycle() \ No newline at end of file + await operator.run_task() \ No newline at end of file diff --git a/tests/test_automated/integration/cycles/test_url_relevancy_huggingface_cycle.py b/tests/test_automated/integration/cycles/test_url_relevancy_huggingface_cycle.py index 064eff51..3ff2c846 100644 --- a/tests/test_automated/integration/cycles/test_url_relevancy_huggingface_cycle.py +++ b/tests/test_automated/integration/cycles/test_url_relevancy_huggingface_cycle.py @@ -6,7 +6,7 @@ from collector_db.DTOs.URLWithHTML import URLWithHTML from collector_db.enums import ValidationStatus, ValidationSource from collector_db.models import URLMetadata -from core.classes.URLRelevanceHuggingfaceCycler import URLRelevanceHuggingfaceCycler +from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator from hugging_face.HuggingFaceInterface import HuggingFaceInterface @@ -38,11 +38,11 @@ def mock_get_url_relevancy( mock_hf_interface = MagicMock(spec=HuggingFaceInterface) mock_hf_interface.get_url_relevancy = mock_get_url_relevancy - cycler = URLRelevanceHuggingfaceCycler( + cycler = URLRelevanceHuggingfaceTaskOperator( adb_client=AsyncDatabaseClient(), huggingface_interface=mock_hf_interface ) - await cycler.cycle() + await cycler.run_task() results = await db_data_creator.adb_client.get_all(URLMetadata) From f861bd6d9d6a0c2a2da0beabacb96daf721a1436 Mon Sep 17 00:00:00 2001 From: maxachis Date: Mon, 27 Jan 2025 12:36:57 -0500 Subject: [PATCH 014/244] Add precise test data --- .../test_deepseek_record_classifier.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/tests/manual/llm_api_logic/test_deepseek_record_classifier.py b/tests/manual/llm_api_logic/test_deepseek_record_classifier.py index 48692023..3396018d 100644 --- a/tests/manual/llm_api_logic/test_deepseek_record_classifier.py +++ b/tests/manual/llm_api_logic/test_deepseek_record_classifier.py @@ -9,15 +9,11 @@ async def test_deepseek_record_classifier(): from collector_db.DTOs.URLHTMLContentInfo import HTMLContentType as hct d = { - hct.TITLE: "test title", - hct.DESCRIPTION: "test description", - hct.H1: "test h1", - hct.H2: "test h2", - hct.H3: "test h3", - hct.H4: "test h4", - hct.H5: "test h5", - hct.H6: "test h6", - hct.DIV: "test div", + hct.TITLE: "Oath of Office for Newly Promoted Corporal Lumpkin with Acworth Police – City of Acworth, GA", + hct.DESCRIPTION: "At the Thursday, November 2 regular city council meeting, Chief Evans administered the oath of office and swearing in of Corporal Cody Lumpkin. Corporal Lumpkin was surrounded by his family and members of the Acworth Police Department for the occasion. Corporal Lumpkin began employment with the Acworth Police Department on June 8,", + hct.H3: ["Oath of Office for Newly Promoted Corporal Lumpkin with Acworth Police"], + hct.H4: ["Share this on Social Media"], + hct.DIV: "PHONE DIRECTORY RESOURCES Search for: Search Button NEWS DEPARTMENTS GOVERNANCE & DEVELOPMENT Administration Development Clerks Office Court Services DDA, Tourism, and Historic Preservation OPERATIONS Parks, Recreation, and Community Resources Power, Public Works, and Stormwater SUPPORT SERVICES Customer Service Human Resources Finance Information Technology PUBLIC SAFETY Acworth Police RESIDENTS Public Art Master Plan Application for Boards & Commissions Board of Aldermen Customer Service Parks, Recreation, and Community Resources Historic Acworth Master Fee Schedule E-News Sign Up Online Payments BUSINESS Bids & Projects E-Verify Permits, Applications, & Ordinances City Code of Ordinances Master Fee Schedule Start a Business EVENTS VISIT ACWORTH NEWS DEPARTMENTS GOVERNANCE & DEVELOPMENT Administration Development Clerks Office Court Services DDA, Tourism, and Historic Preservation OPERATIONS Parks, Recreation, and Community Resources Power, Public Works, and Stormwater SUPPORT SERVICES Customer Service Human Resources Finance Information Technology PUBLIC SAFETY Acworth Police RESIDENTS Public Art Master Plan Application for Boards & Commissions Board of Aldermen Customer Service Parks, Recreation, and Community Resources Historic Acworth Master Fee Schedule E-News Sign Up Online Payments BUSINESS Bids & Projects E-Verify Permits, Applications, & Ordinances City Code of Ordinances Master Fee Schedule Start a Business EVENTS VISIT ACWORTH Oath of Office for Newly Promoted Corporal Lumpkin with Acworth Police Published On: November 3, 2023 At the Thursday, November 2 regular city council meeting, Chief Evans administered the oath of office and swearing in of Corporal Cody Lumpkin.  Corporal Lumpkin was surrounded by his family and members of the Acworth Police Department for the occasion.  Corporal Lumpkin began employment with the Acworth Police Department on June 8 , 2015, and has served as a patrol officer in addition to time spent time in Special Operations prior to his recent promotion. Share this on Social Media 4415 Center Street, Acworth GA 30101 Phone Directory Contact Us © 2025 City of Acworth Acworth is located in the foothills of the North Georgia mountains and is nestled along the banks of Lake Acworth and Lake Allatoona, hence its nickname “The Lake City.” The city boasts a rich history, a charming downtown, abundant outdoor recreational activities, a vibrant restaurant scene, and an active festival and events calendar. Acworth is one of the best, family-friendly destinations in the Atlanta region. Come discover why You’re Welcome in Acworth! ESS | Webmail | Handbook | Peak | Laserfiche | Login ", } content_infos = [] for k, v in d.items(): From 593b21991a3f99e4355274aafce46ae856f8818d Mon Sep 17 00:00:00 2001 From: maxachis Date: Mon, 27 Jan 2025 13:59:03 -0500 Subject: [PATCH 015/244] Draft work --- ...c732a_add_task_tables_and_linking_logic.py | 52 +++++++++++++++++ collector_db/models.py | 57 ++++++++++++++++++- tests/test_alembic/helpers.py | 8 ++- tests/test_alembic/test_revisions.py | 14 ++++- .../collector_db/test_database_structure.py | 9 ++- 5 files changed, 134 insertions(+), 6 deletions(-) create mode 100644 collector_db/alembic/versions/b0e34cec732a_add_task_tables_and_linking_logic.py diff --git a/collector_db/alembic/versions/b0e34cec732a_add_task_tables_and_linking_logic.py b/collector_db/alembic/versions/b0e34cec732a_add_task_tables_and_linking_logic.py new file mode 100644 index 00000000..2061ef45 --- /dev/null +++ b/collector_db/alembic/versions/b0e34cec732a_add_task_tables_and_linking_logic.py @@ -0,0 +1,52 @@ +"""Add Task Tables and linking logic + +Revision ID: b0e34cec732a +Revises: dae00e5aa8dd +Create Date: 2025-01-27 13:22:49.620212 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = 'b0e34cec732a' +down_revision: Union[str, None] = 'dae00e5aa8dd' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + op.create_table('tasks', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('task_type', sa.String(), nullable=False), + sa.Column('task_id', sa.String(), nullable=False), + sa.Column('task_status', sa.String(), nullable=False), + sa.Column('updated_at', sa.TIMESTAMP(), server_default=sa.text('now()'), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('task_type', 'task_id', name='uq_task_type_task_id') + ) + op.create_table('task_errors', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('task_id', sa.Integer(), nullable=False), + sa.Column('error', sa.Text(), nullable=False), + sa.Column('updated_at', sa.TIMESTAMP(), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['task_id'], ['tasks.id'], ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('link_task_urls', + sa.Column('task_id', sa.Integer(), nullable=False), + sa.Column('url_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['task_id'], ['tasks.id'], ondelete='CASCADE'), + sa.ForeignKeyConstraint(['url_id'], ['urls.id'], ondelete='CASCADE'), + sa.PrimaryKeyConstraint('task_id', 'url_id'), + sa.UniqueConstraint('task_id', 'url_id', name='uq_task_id_url_id') + ) + + +def downgrade() -> None: + op.drop_table('link_task_urls') + op.drop_table('task_errors') + op.drop_table('tasks') diff --git a/collector_db/models.py b/collector_db/models.py index 03837a0b..05578dd2 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -86,6 +86,11 @@ class URL(Base): url_metadata = relationship("URLMetadata", back_populates="url", cascade="all, delete-orphan") html_content = relationship("URLHTMLContent", back_populates="url", cascade="all, delete-orphan") error_info = relationship("URLErrorInfo", back_populates="url", cascade="all, delete-orphan") + tasks = relationship( + "Task", + secondary="link_task_urls", + back_populates="url", + ) # URL Metadata table definition @@ -158,10 +163,11 @@ class URLErrorInfo(Base): url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) error = Column(Text, nullable=False) updated_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) - # TODO: Add Info on Cycle the task occurred in + task_id = Column(Integer, ForeignKey('tasks.id'), nullable=True) # Relationships url = relationship("URL", back_populates="error_info") + task = relationship("Task", back_populates="errored_urls") class URLHTMLContent(Base): __tablename__ = 'url_html_content' @@ -232,3 +238,52 @@ class Missing(Base): # Relationships batch = relationship("Batch", back_populates="missings") + +class Task(Base): + __tablename__ = 'tasks' + __table_args__ = (UniqueConstraint( + "task_type", + "task_id", + name="uq_task_type_task_id"), + ) + + id = Column(Integer, primary_key=True) + task_type = Column(String, nullable=False) + task_id = Column(String, nullable=False) + task_status = Column(String, nullable=False) + updated_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) + + # Relationships + urls = relationship( + "URL", + secondary="link_task_urls", + back_populates="task" + ) + task_errors = relationship("TaskError", back_populates="task") + errored_urls = relationship("URLErrorInfo", back_populates="task") + +class LinkTaskURL(Base): + __tablename__ = 'link_task_urls' + __table_args__ = (UniqueConstraint( + "task_id", + "url_id", + name="uq_task_id_url_id"), + ) + + task_id = Column(Integer, ForeignKey('tasks.id', ondelete="CASCADE"), primary_key=True) + url_id = Column(Integer, ForeignKey('urls.id', ondelete="CASCADE"), primary_key=True) + + # Relationships + task = relationship("Task", back_populates="link_task_urls") + url = relationship("URL", back_populates="link_task_urls") + +class TaskError(Base): + __tablename__ = 'task_errors' + + id = Column(Integer, primary_key=True) + task_id = Column(Integer, ForeignKey('tasks.id', ondelete="CASCADE"), nullable=False) + error = Column(Text, nullable=False) + updated_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) + + # Relationships + task = relationship("Task", back_populates="task_errors") \ No newline at end of file diff --git a/tests/test_alembic/helpers.py b/tests/test_alembic/helpers.py index d66854f2..098ee1df 100644 --- a/tests/test_alembic/helpers.py +++ b/tests/test_alembic/helpers.py @@ -9,12 +9,14 @@ def get_enum_values(enum_name: str, session: Session) -> list[str]: def table_creation_check( alembic_runner: AlembicRunner, - table_name: str, + tables: list[str], start_revision: str, end_revision: str ): alembic_runner.upgrade(start_revision) - assert table_name not in alembic_runner.inspector.get_table_names() + for table_name in tables: + assert table_name not in alembic_runner.inspector.get_table_names() alembic_runner.upgrade(end_revision) alembic_runner.reflect() - assert table_name in alembic_runner.inspector.get_table_names() \ No newline at end of file + for table_name in tables: + assert table_name in alembic_runner.inspector.get_table_names() \ No newline at end of file diff --git a/tests/test_alembic/test_revisions.py b/tests/test_alembic/test_revisions.py index 75df5f0c..95684ce2 100644 --- a/tests/test_alembic/test_revisions.py +++ b/tests/test_alembic/test_revisions.py @@ -298,7 +298,19 @@ def test_add_in_label_studio_metadata_status(alembic_runner): def test_create_metadata_annotation_table(alembic_runner): table_creation_check( alembic_runner, - "metadata_annotations", + ["metadata_annotations"], start_revision="108dac321086", end_revision="dcd158092de0" + ) + +def test_add_task_tables_and_linking_logic(alembic_runner): + table_creation_check( + alembic_runner, + tables=[ + "tasks", + "task_errors", + "link_task_urls" + ], + start_revision="dcd158092de0", + end_revision="b0e34cec732a" ) \ No newline at end of file diff --git a/tests/test_automated/integration/collector_db/test_database_structure.py b/tests/test_automated/integration/collector_db/test_database_structure.py index 926a6ed8..51d9a918 100644 --- a/tests/test_automated/integration/collector_db/test_database_structure.py +++ b/tests/test_automated/integration/collector_db/test_database_structure.py @@ -325,4 +325,11 @@ def test_root_url(db_data_creator: DBDataCreator): engine=db_data_creator.db_client.engine ) - table_tester.run_column_tests() \ No newline at end of file + table_tester.run_column_tests() + +def test_task_url_links(db_data_creator: DBDataCreator): + # Create URLs + + # Create task + + # Associate URLs with task From 990cf3bc546999584e0e19af94ded68f9a012969 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 27 Jan 2025 15:38:47 -0500 Subject: [PATCH 016/244] Refine DeepSeekRecordClassifier * Add relevant environment variable to ENV.md * Fix bug in manual DeepSeekRecordClassifier test * Update DeepSeekRecordClassifier.py to pass test * Refine URLHTMLContentInfo to include list of strings --- ENV.md | 1 + collector_db/DTOs/URLHTMLContentInfo.py | 2 +- llm_api_logic/DeepSeekRecordClassifier.py | 6 +++++- .../manual/llm_api_logic/test_deepseek_record_classifier.py | 4 ++-- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/ENV.md b/ENV.md index a8210fb9..943ad293 100644 --- a/ENV.md +++ b/ENV.md @@ -16,3 +16,4 @@ Please ensure these are properly defined in a `.env` file in the root directory. |`POSTGRES_PORT` | The port for the test database | `5432` | |`DS_APP_SECRET_KEY`| The secret key used for decoding JWT tokens produced by the Data Sources App. Must match the secret token that is used in the Data Sources App for encoding. |`abc123`| |`DEV`| Set to any value to run the application in development mode. |`true`| +|'DEEPSEEK_API_KEY'| The API key required for accessing the DeepSeek API. |`abc123`| diff --git a/collector_db/DTOs/URLHTMLContentInfo.py b/collector_db/DTOs/URLHTMLContentInfo.py index ffd82724..f8b24eb0 100644 --- a/collector_db/DTOs/URLHTMLContentInfo.py +++ b/collector_db/DTOs/URLHTMLContentInfo.py @@ -18,4 +18,4 @@ class HTMLContentType(Enum): class URLHTMLContentInfo(BaseModel): url_id: Optional[int] = None content_type: HTMLContentType - content: str \ No newline at end of file + content: str | list[str] \ No newline at end of file diff --git a/llm_api_logic/DeepSeekRecordClassifier.py b/llm_api_logic/DeepSeekRecordClassifier.py index 1348b358..5a2067e0 100644 --- a/llm_api_logic/DeepSeekRecordClassifier.py +++ b/llm_api_logic/DeepSeekRecordClassifier.py @@ -1,3 +1,4 @@ +import json import os from openai import AsyncOpenAI @@ -91,4 +92,7 @@ async def classify_url(self, content_infos: list[URLHTMLContentInfo]) -> RecordT 'type': 'json_object' } ) - return RecordType(response["choices"][0]["message"]["content"]["record_type"]) + result_str = response.choices[0].message.content + + result_dict = json.loads(result_str) + return result_dict["record_type"] diff --git a/tests/manual/llm_api_logic/test_deepseek_record_classifier.py b/tests/manual/llm_api_logic/test_deepseek_record_classifier.py index 3396018d..b0a6c1fb 100644 --- a/tests/manual/llm_api_logic/test_deepseek_record_classifier.py +++ b/tests/manual/llm_api_logic/test_deepseek_record_classifier.py @@ -16,8 +16,8 @@ async def test_deepseek_record_classifier(): hct.DIV: "PHONE DIRECTORY RESOURCES Search for: Search Button NEWS DEPARTMENTS GOVERNANCE & DEVELOPMENT Administration Development Clerks Office Court Services DDA, Tourism, and Historic Preservation OPERATIONS Parks, Recreation, and Community Resources Power, Public Works, and Stormwater SUPPORT SERVICES Customer Service Human Resources Finance Information Technology PUBLIC SAFETY Acworth Police RESIDENTS Public Art Master Plan Application for Boards & Commissions Board of Aldermen Customer Service Parks, Recreation, and Community Resources Historic Acworth Master Fee Schedule E-News Sign Up Online Payments BUSINESS Bids & Projects E-Verify Permits, Applications, & Ordinances City Code of Ordinances Master Fee Schedule Start a Business EVENTS VISIT ACWORTH NEWS DEPARTMENTS GOVERNANCE & DEVELOPMENT Administration Development Clerks Office Court Services DDA, Tourism, and Historic Preservation OPERATIONS Parks, Recreation, and Community Resources Power, Public Works, and Stormwater SUPPORT SERVICES Customer Service Human Resources Finance Information Technology PUBLIC SAFETY Acworth Police RESIDENTS Public Art Master Plan Application for Boards & Commissions Board of Aldermen Customer Service Parks, Recreation, and Community Resources Historic Acworth Master Fee Schedule E-News Sign Up Online Payments BUSINESS Bids & Projects E-Verify Permits, Applications, & Ordinances City Code of Ordinances Master Fee Schedule Start a Business EVENTS VISIT ACWORTH Oath of Office for Newly Promoted Corporal Lumpkin with Acworth Police Published On: November 3, 2023 At the Thursday, November 2 regular city council meeting, Chief Evans administered the oath of office and swearing in of Corporal Cody Lumpkin.  Corporal Lumpkin was surrounded by his family and members of the Acworth Police Department for the occasion.  Corporal Lumpkin began employment with the Acworth Police Department on June 8 , 2015, and has served as a patrol officer in addition to time spent time in Special Operations prior to his recent promotion. Share this on Social Media 4415 Center Street, Acworth GA 30101 Phone Directory Contact Us © 2025 City of Acworth Acworth is located in the foothills of the North Georgia mountains and is nestled along the banks of Lake Acworth and Lake Allatoona, hence its nickname “The Lake City.” The city boasts a rich history, a charming downtown, abundant outdoor recreational activities, a vibrant restaurant scene, and an active festival and events calendar. Acworth is one of the best, family-friendly destinations in the Atlanta region. Come discover why You’re Welcome in Acworth! ESS | Webmail | Handbook | Peak | Laserfiche | Login ", } content_infos = [] - for k, v in d.items(): - content_info = URLHTMLContentInfo(content_type=k, content=v) + for content_type, value in d.items(): + content_info = URLHTMLContentInfo(content_type=content_type, content=value) content_infos.append(content_info) classifier = DeepSeekRecordClassifier() From 6a30a43348f8d8215d3f5ebeb6df2585a6762984 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 28 Jan 2025 18:26:35 -0500 Subject: [PATCH 017/244] Remove unused files --- core/DTOs/LabelStudioExportResponseInfo.py | 9 --------- core/DTOs/LabelStudioTaskInfo.py | 11 ----------- hugging_face/URLClassifier.py | 10 ---------- 3 files changed, 30 deletions(-) delete mode 100644 core/DTOs/LabelStudioExportResponseInfo.py delete mode 100644 core/DTOs/LabelStudioTaskInfo.py delete mode 100644 hugging_face/URLClassifier.py diff --git a/core/DTOs/LabelStudioExportResponseInfo.py b/core/DTOs/LabelStudioExportResponseInfo.py deleted file mode 100644 index fae94096..00000000 --- a/core/DTOs/LabelStudioExportResponseInfo.py +++ /dev/null @@ -1,9 +0,0 @@ -from typing import Annotated - -from fastapi.param_functions import Doc -from pydantic import BaseModel - - -class LabelStudioExportResponseInfo(BaseModel): - label_studio_import_id: Annotated[int, Doc("The ID of the Label Studio import")] - num_urls_imported: Annotated[int, Doc("The number of URLs imported")] \ No newline at end of file diff --git a/core/DTOs/LabelStudioTaskInfo.py b/core/DTOs/LabelStudioTaskInfo.py deleted file mode 100644 index 5c277c8a..00000000 --- a/core/DTOs/LabelStudioTaskInfo.py +++ /dev/null @@ -1,11 +0,0 @@ -from pydantic import BaseModel - -from collector_db.enums import URLMetadataAttributeType -from core.enums import LabelStudioTaskStatus - - -class LabelStudioTaskInfo(BaseModel): - metadata_id: int - attribute: URLMetadataAttributeType - task_id: int - task_status: LabelStudioTaskStatus \ No newline at end of file diff --git a/hugging_face/URLClassifier.py b/hugging_face/URLClassifier.py deleted file mode 100644 index 04380645..00000000 --- a/hugging_face/URLClassifier.py +++ /dev/null @@ -1,10 +0,0 @@ -from multimodal_transformers.model import DistilBertWithTabular -from transformers import AutoTokenizer - - -class URLClassifier: - - def __init__(self): - self.tokenizer = AutoTokenizer.from_pretrained("PDAP/url-classifier") - self.model = DistilBertWithTabular.from_pretrained("PDAP/url-classifier") - self.model.eval() From 1e502a30722477d16bc37eb3c799a57e0b190e24 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 28 Jan 2025 18:28:48 -0500 Subject: [PATCH 018/244] Implement draft of Record Type Classifier: * Refine Task Operators to follow unified logic, including logging * Add tables related to tracking tasks and errors/urls within tasks * Add new tests, update and refine existing tests * Refactor some database client logic --- api/main.py | 18 +- collector_db/AsyncDatabaseClient.py | 278 +++++++++++++----- collector_db/DTOs/TaskInfo.py | 18 ++ collector_db/DTOs/URLErrorInfos.py | 1 + collector_db/StatementComposer.py | 43 +++ ...5b1c_add_task_tables_and_linking_logic.py} | 42 ++- collector_db/enums.py | 1 - collector_db/models.py | 43 +-- core/AsyncCore.py | 21 ++ core/DTOs/GetTasksResponse.py | 19 ++ core/DTOs/task_data_objects/README.md | 1 + .../URLRecordTypeTDO.py} | 8 +- .../URLRelevanceHuggingfaceTDO.py} | 2 +- .../UrlHtmlTDO.py} | 2 +- core/classes/TaskOperatorBase.py | 64 ++++ core/classes/URLHTMLTaskOperator.py | 100 ++++--- core/classes/URLRecordTypeTaskOperator.py | 77 ++++- .../URLRelevanceHuggingfaceTaskOperator.py | 52 ++-- html_tag_collector/RootURLCache.py | 2 +- hugging_face/HuggingFaceInterface.py | 2 - local_database/DataDumper/docker-compose.yml | 4 +- tests/helpers/DBDataCreator.py | 19 +- tests/helpers/assert_functions.py | 7 + .../lifecycle/test_auto_googler_lifecycle.py | 2 +- .../core/lifecycle/test_ckan_lifecycle.py | 2 +- .../lifecycle/test_muckrock_lifecycles.py | 4 +- .../test_muckrock_collectors.py | 2 +- tests/test_alembic/helpers.py | 22 +- tests/test_alembic/test_revisions.py | 15 +- .../api/helpers/RequestValidator.py | 38 ++- .../integration/api/test_task.py | 41 +++ .../collector_db/test_database_structure.py | 7 - .../collector_db/test_db_client.py | 6 +- .../integration/tasks/__init__.py | 0 .../integration/tasks/test_example_task.py | 87 ++++++ .../integration/tasks/test_url_html_task.py | 105 +++++++ .../tasks/test_url_record_type_task.py | 47 +++ .../test_url_relevancy_huggingface_task.py} | 25 +- 38 files changed, 999 insertions(+), 228 deletions(-) create mode 100644 collector_db/DTOs/TaskInfo.py create mode 100644 collector_db/StatementComposer.py rename collector_db/alembic/versions/{b0e34cec732a_add_task_tables_and_linking_logic.py => 072b32a45b1c_add_task_tables_and_linking_logic.py} (57%) create mode 100644 core/DTOs/GetTasksResponse.py create mode 100644 core/DTOs/task_data_objects/README.md rename core/DTOs/{URLRecordTypeTaskInfo.py => task_data_objects/URLRecordTypeTDO.py} (50%) rename core/DTOs/{URLRelevanceHuggingfaceTaskInfo.py => task_data_objects/URLRelevanceHuggingfaceTDO.py} (78%) rename core/DTOs/{URLHTMLTaskInfo.py => task_data_objects/UrlHtmlTDO.py} (94%) create mode 100644 core/classes/TaskOperatorBase.py create mode 100644 tests/helpers/assert_functions.py create mode 100644 tests/test_automated/integration/api/test_task.py create mode 100644 tests/test_automated/integration/tasks/__init__.py create mode 100644 tests/test_automated/integration/tasks/test_example_task.py create mode 100644 tests/test_automated/integration/tasks/test_url_html_task.py create mode 100644 tests/test_automated/integration/tasks/test_url_record_type_task.py rename tests/test_automated/integration/{cycles/test_url_relevancy_huggingface_cycle.py => tasks/test_url_relevancy_huggingface_task.py} (82%) diff --git a/api/main.py b/api/main.py index 356467af..0a9c0249 100644 --- a/api/main.py +++ b/api/main.py @@ -6,6 +6,7 @@ from api.routes.batch import batch_router from api.routes.collector import collector_router from api.routes.root import root_router +from api.routes.task import task_router from api.routes.url import url_router from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DatabaseClient import DatabaseClient @@ -71,8 +72,15 @@ async def setup_database(db_client): lifespan=lifespan ) -app.include_router(root_router) -app.include_router(collector_router) -app.include_router(batch_router) -app.include_router(annotate_router) -app.include_router(url_router) \ No newline at end of file +routers = [ + root_router, + collector_router, + batch_router, + annotate_router, + url_router, + task_router +] +for router in routers: + app.include_router(router) + + diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index e83d10ca..07f1cc10 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -1,24 +1,31 @@ from functools import wraps +from typing import Optional -from sqlalchemy import select, exists +from sqlalchemy import select, exists, func from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import selectinload from collector_db.ConfigManager import ConfigManager from collector_db.DTOs.MetadataAnnotationInfo import MetadataAnnotationInfo +from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.DTOs.URLAnnotationInfo import URLAnnotationInfo from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from collector_db.DTOs.URLInfo import URLInfo from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.DTOs.URLWithHTML import URLWithHTML -from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource +from collector_db.StatementComposer import StatementComposer +from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource, TaskType from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import URLMetadata, URL, URLErrorInfo, URLHTMLContent, Base, MetadataAnnotation, \ - RootURL + RootURL, Task, TaskError, LinkTaskURL from collector_manager.enums import URLStatus +from core.DTOs.GetTasksResponse import GetTasksResponse, GetTasksResponseTaskInfo from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseMetadataInfo, GetURLsResponseErrorInfo, \ GetURLsResponseInnerInfo from core.DTOs.RelevanceAnnotationInfo import RelevanceAnnotationPostInfo +from core.enums import BatchStatus + def add_standard_limit_and_offset(statement, page, limit=100): offset = (page - 1) * limit @@ -31,6 +38,14 @@ def __init__(self, db_url: str = get_postgres_connection_string(is_async=True)): echo=ConfigManager.get_sqlalchemy_echo(), ) self.session_maker = async_sessionmaker(bind=self.engine, expire_on_commit=False) + self.statement_composer = StatementComposer() + + @staticmethod + def _add_models(session: AsyncSession, model_class, models): + for model in models: + instance = model_class(**model.model_dump()) + session.add(instance) + @staticmethod def session_manager(method): @@ -66,14 +81,11 @@ async def get_url_metadata_by_status( @session_manager async def add_url_metadata(self, session: AsyncSession, url_metadata_info: URLMetadataInfo): - url_metadata = URLMetadata(**url_metadata_info.model_dump()) - session.add(url_metadata) + self._add_models(session, URLMetadata, [url_metadata_info]) @session_manager async def add_url_metadatas(self, session: AsyncSession, url_metadata_infos: list[URLMetadataInfo]): - for url_metadata_info in url_metadata_infos: - url_metadata = URLMetadata(**url_metadata_info.model_dump()) - session.add(url_metadata) + self._add_models(session, URLMetadata, url_metadata_infos) @session_manager async def add_url_error_infos(self, session: AsyncSession, url_error_infos: list[URLErrorPydanticInfo]): @@ -88,34 +100,39 @@ async def add_url_error_infos(self, session: AsyncSession, url_error_infos: list @session_manager async def get_urls_with_errors(self, session: AsyncSession) -> list[URLErrorPydanticInfo]: - statement = (select(URL, URLErrorInfo.error, URLErrorInfo.updated_at) + statement = (select(URL, URLErrorInfo.error, URLErrorInfo.updated_at, URLErrorInfo.task_id) .join(URLErrorInfo) .where(URL.outcome == URLStatus.ERROR.value) .order_by(URL.id)) scalar_result = await session.execute(statement) results = scalar_result.all() final_results = [] - for url, error, updated_at in results: - final_results.append(URLErrorPydanticInfo(url_id=url.id, error=error, updated_at=updated_at)) + for url, error, updated_at, task_id in results: + final_results.append(URLErrorPydanticInfo( + url_id=url.id, + error=error, + updated_at=updated_at, + task_id=task_id + )) return final_results @session_manager async def add_html_content_infos(self, session: AsyncSession, html_content_infos: list[URLHTMLContentInfo]): - for html_content_info in html_content_infos: - # Add HTML Content Info to database - db_html_content_info = URLHTMLContent(**html_content_info.model_dump()) - session.add(db_html_content_info) + self._add_models(session, URLHTMLContent, html_content_infos) + + @session_manager + async def has_pending_urls_without_html_data(self, session: AsyncSession) -> bool: + statement = self.statement_composer.pending_urls_without_html_data() + statement = statement.limit(1) + scalar_result = await session.scalars(statement) + return bool(scalar_result.first()) @session_manager async def get_pending_urls_without_html_data(self, session: AsyncSession): # TODO: Add test that includes some urls WITH html data. Check they're not returned - statement = (select(URL). - outerjoin(URLHTMLContent). - where(URLHTMLContent.id == None). - where(URL.outcome == URLStatus.PENDING.value). - limit(100). - order_by(URL.id)) + statement = self.statement_composer.pending_urls_without_html_data() + statement = statement.limit(100).order_by(URL.id) scalar_result = await session.scalars(statement) return scalar_result.all() @@ -124,26 +141,17 @@ async def get_urls_with_html_data_and_without_metadata_type( self, session: AsyncSession, without_metadata_type: URLMetadataAttributeType = URLMetadataAttributeType.RELEVANT - ): + ) -> list[URLWithHTML]: - # TODO: Generalize this so that it can exclude based on other attributes # Get URLs with no relevancy metadata statement = (select(URL.id, URL.url, URLHTMLContent). join(URLHTMLContent). - where(URL.outcome == URLStatus.PENDING.value) - # No relevancy metadata - .where( - ~exists( - select(URLMetadata.id). - where( - URLMetadata.url_id == URL.id, - URLMetadata.attribute == without_metadata_type.value - ) - ) - ) - .limit(100) - .order_by(URL.id) + where(URL.outcome == URLStatus.PENDING.value)) + statement = self.statement_composer.exclude_urls_with_select_metadata( + statement=statement, + attribute=without_metadata_type ) + statement = statement.limit(100).order_by(URL.id) raw_result = await session.execute(statement) result = raw_result.all() url_ids_to_urls = {url_id: url for url_id, url, _ in result} @@ -167,49 +175,24 @@ async def get_urls_with_html_data_and_without_metadata_type( return final_results @session_manager - async def get_urls_with_html_data_and_no_relevancy_metadata( - self, - session: AsyncSession - ) -> list[URLWithHTML]: + async def has_pending_urls_with_html_data_and_without_metadata_type( + self, + session: AsyncSession, + without_metadata_type: URLMetadataAttributeType = URLMetadataAttributeType.RELEVANT + ) -> bool: # TODO: Generalize this so that it can exclude based on other attributes # Get URLs with no relevancy metadata statement = (select(URL.id, URL.url, URLHTMLContent). join(URLHTMLContent). - where(URL.outcome == URLStatus.PENDING.value) - # No relevancy metadata - .where( - ~exists( - select(URLMetadata.id). - where( - URLMetadata.url_id == URL.id, - URLMetadata.attribute == URLMetadataAttributeType.RELEVANT.value - ) - ) - ) - .limit(100) - .order_by(URL.id) + where(URL.outcome == URLStatus.PENDING.value)) + statement = self.statement_composer.exclude_urls_with_select_metadata( + statement=statement, + attribute=without_metadata_type ) + statement = statement.limit(1) raw_result = await session.execute(statement) result = raw_result.all() - url_ids_to_urls = {url_id: url for url_id, url, _ in result} - url_ids_to_html_info = {url_id: [] for url_id, _, _ in result} - - for url_id, _, html_info in result: - url_ids_to_html_info[url_id].append( - URLHTMLContentInfo(**html_info.__dict__) - ) - - final_results = [] - for url_id, url in url_ids_to_urls.items(): - url_with_html = URLWithHTML( - url_id=url_id, - url=url, - html_infos=url_ids_to_html_info[url_id] - ) - final_results.append(url_with_html) - - - return final_results + return len(result) > 0 @session_manager async def get_urls_with_metadata( @@ -425,5 +408,156 @@ async def get_urls(self, session: AsyncSession, page: int, errors: bool) -> GetU count=len(final_results) ) + @session_manager + async def initiate_task( + self, + session: AsyncSession, + task_type: TaskType + ) -> int: + # Create Task + task = Task( + task_type=task_type, + task_status=BatchStatus.IN_PROCESS.value + ) + session.add(task) + # Return Task ID + await session.flush() + await session.refresh(task) + return task.id + @session_manager + async def update_task_status(self, session: AsyncSession, task_id: int, status: BatchStatus): + task = await session.get(Task, task_id) + task.task_status = status.value + await session.commit() + + @session_manager + async def add_task_error(self, session: AsyncSession, task_id: int, error: str): + task_error = TaskError( + task_id=task_id, + error=error + ) + session.add(task_error) + await session.commit() + + @session_manager + async def get_task_info(self, session: AsyncSession, task_id: int) -> TaskInfo: + # Get Task + result = await session.execute( + select(Task) + .where(Task.id == task_id) + .options( + selectinload(Task.urls), + selectinload(Task.error), + selectinload(Task.errored_urls) + ) + ) + task = result.scalars().first() + error = task.error[0].error if len(task.error) > 0 else None + # Get error info if any + # Get URLs + urls = task.urls + url_infos = [] + for url in urls: + url_info = URLInfo( + id=url.id, + batch_id=url.batch_id, + url=url.url, + collector_metadata=url.collector_metadata, + outcome=URLStatus(url.outcome), + updated_at=url.updated_at + ) + url_infos.append(url_info) + + errored_urls = [] + for url in task.errored_urls: + url_error_info = URLErrorPydanticInfo( + task_id=url.task_id, + url_id=url.url_id, + error=url.error, + updated_at=url.updated_at + ) + errored_urls.append(url_error_info) + return TaskInfo( + task_type=TaskType(task.task_type), + task_status=BatchStatus(task.task_status), + error_info=error, + updated_at=task.updated_at, + urls=url_infos, + url_errors=errored_urls + ) + + @session_manager + async def get_html_content_info(self, session: AsyncSession, url_id: int) -> list[URLHTMLContentInfo]: + session_result = await session.execute( + select(URLHTMLContent) + .where(URLHTMLContent.url_id == url_id) + ) + results = session_result.scalars().all() + return [URLHTMLContentInfo(**result.__dict__) for result in results] + + + + @session_manager + async def link_urls_to_task(self, session: AsyncSession, task_id: int, url_ids: list[int]): + for url_id in url_ids: + link = LinkTaskURL( + url_id=url_id, + task_id=task_id + ) + session.add(link) + + @session_manager + async def get_tasks( + self, + session: AsyncSession, + task_type: Optional[TaskType] = None, + task_status: Optional[BatchStatus] = None, + page: int = 1 + ) -> GetTasksResponse: + url_count_subquery = self.statement_composer.simple_count_subquery( + LinkTaskURL, + 'task_id', + 'url_count' + ) + + url_error_count_subquery = self.statement_composer.simple_count_subquery( + URLErrorInfo, + 'task_id', + 'url_error_count' + ) + statement = select( + Task, + url_count_subquery.c.url_count, + url_error_count_subquery.c.url_error_count + ).outerjoin( + url_count_subquery, + Task.id == url_count_subquery.c.task_id + ).outerjoin( + url_error_count_subquery, + Task.id == url_error_count_subquery.c.task_id + ) + if task_type is not None: + statement = statement.where(Task.task_type == task_type.value) + if task_status is not None: + statement = statement.where(Task.task_status == task_status.value) + add_standard_limit_and_offset(statement, page) + + execute_result = await session.execute(statement) + all_results = execute_result.all() + final_results = [] + for task, url_count, url_error_count in all_results: + final_results.append( + GetTasksResponseTaskInfo( + task_id=task.id, + type=TaskType(task.task_type), + status=BatchStatus(task.task_status), + url_count=url_count if url_count is not None else 0, + url_error_count=url_error_count if url_error_count is not None else 0, + updated_at=task.updated_at + ) + ) + return GetTasksResponse( + tasks=final_results + ) diff --git a/collector_db/DTOs/TaskInfo.py b/collector_db/DTOs/TaskInfo.py new file mode 100644 index 00000000..e8d8090d --- /dev/null +++ b/collector_db/DTOs/TaskInfo.py @@ -0,0 +1,18 @@ +import datetime +from typing import Optional + +from pydantic import BaseModel + +from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from collector_db.DTOs.URLInfo import URLInfo +from collector_db.enums import TaskType +from core.enums import BatchStatus + + +class TaskInfo(BaseModel): + task_type: TaskType + task_status: BatchStatus + updated_at: datetime.datetime + error_info: Optional[str] = None + urls: list[URLInfo] + url_errors: list[URLErrorPydanticInfo] \ No newline at end of file diff --git a/collector_db/DTOs/URLErrorInfos.py b/collector_db/DTOs/URLErrorInfos.py index cf73a6dc..46f5b9fa 100644 --- a/collector_db/DTOs/URLErrorInfos.py +++ b/collector_db/DTOs/URLErrorInfos.py @@ -5,6 +5,7 @@ class URLErrorPydanticInfo(BaseModel): + task_id: int url_id: int error: str updated_at: Optional[datetime.datetime] = None \ No newline at end of file diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py new file mode 100644 index 00000000..dc756fb3 --- /dev/null +++ b/collector_db/StatementComposer.py @@ -0,0 +1,43 @@ + +from sqlalchemy import Select, select, exists, Table, func, Subquery + +from collector_db.enums import URLMetadataAttributeType +from collector_db.models import URL, URLHTMLContent, URLMetadata +from collector_manager.enums import URLStatus + + +class StatementComposer: + """ + Assists in the composition of SQLAlchemy statements + """ + + @staticmethod + def pending_urls_without_html_data() -> Select: + return (select(URL). + outerjoin(URLHTMLContent). + where(URLHTMLContent.id == None). + where(URL.outcome == URLStatus.PENDING.value)) + + @staticmethod + def exclude_urls_with_select_metadata( + statement: Select, + attribute: URLMetadataAttributeType + ) -> Select: + return (statement.where( + ~exists( + select(URLMetadata.id). + where( + URLMetadata.url_id == URL.id, + URLMetadata.attribute == attribute.value + ) + ) + )) + + @staticmethod + def simple_count_subquery(model, attribute: str, label: str) -> Subquery: + attr_value = getattr(model, attribute) + return select( + attr_value, + func.count(attr_value).label(label) + ).group_by(attr_value).subquery() + diff --git a/collector_db/alembic/versions/b0e34cec732a_add_task_tables_and_linking_logic.py b/collector_db/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py similarity index 57% rename from collector_db/alembic/versions/b0e34cec732a_add_task_tables_and_linking_logic.py rename to collector_db/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py index 2061ef45..dcae164b 100644 --- a/collector_db/alembic/versions/b0e34cec732a_add_task_tables_and_linking_logic.py +++ b/collector_db/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py @@ -1,32 +1,46 @@ """Add Task Tables and linking logic -Revision ID: b0e34cec732a +Revision ID: 072b32a45b1c Revises: dae00e5aa8dd -Create Date: 2025-01-27 13:22:49.620212 +Create Date: 2025-01-27 15:48:02.713484 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa -from sqlalchemy.dialects import postgresql + +from collector_db.enums import PGEnum # revision identifiers, used by Alembic. -revision: str = 'b0e34cec732a' +revision: str = '072b32a45b1c' down_revision: Union[str, None] = 'dae00e5aa8dd' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None +task_type = PGEnum( + 'HTML', + 'Relevancy', + 'Record Type', + name='task_type', +) + def upgrade() -> None: op.create_table('tasks', sa.Column('id', sa.Integer(), nullable=False), - sa.Column('task_type', sa.String(), nullable=False), - sa.Column('task_id', sa.String(), nullable=False), - sa.Column('task_status', sa.String(), nullable=False), + sa.Column('task_type', task_type, nullable=False), + sa.Column( + 'task_status', + PGEnum( + 'complete', 'error', 'in-process', 'aborted', + name='batch_status', + create_type=False + ), + nullable=False + ), sa.Column('updated_at', sa.TIMESTAMP(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('task_type', 'task_id', name='uq_task_type_task_id') ) op.create_table('task_errors', sa.Column('id', sa.Integer(), nullable=False), @@ -44,9 +58,21 @@ def upgrade() -> None: sa.PrimaryKeyConstraint('task_id', 'url_id'), sa.UniqueConstraint('task_id', 'url_id', name='uq_task_id_url_id') ) + # Change to URL Error Info requires deleting prior data + op.execute("DELETE FROM url_error_info;") + + op.add_column('url_error_info', sa.Column('task_id', sa.Integer(), nullable=False)) + op.create_unique_constraint('uq_url_id_error', 'url_error_info', ['url_id', 'task_id']) + op.create_foreign_key("fk_url_error_info_task", 'url_error_info', 'tasks', ['task_id'], ['id']) def downgrade() -> None: + + op.drop_constraint("fk_url_error_info_task", 'url_error_info', type_='foreignkey') + op.drop_constraint('uq_url_id_error', 'url_error_info', type_='unique') + op.drop_column('url_error_info', 'task_id') op.drop_table('link_task_urls') op.drop_table('task_errors') op.drop_table('tasks') + + task_type.drop(op.get_bind(), checkfirst=True) diff --git a/collector_db/enums.py b/collector_db/enums.py index 66734a9c..a6f3c95e 100644 --- a/collector_db/enums.py +++ b/collector_db/enums.py @@ -37,7 +37,6 @@ class TaskType(PyEnum): RELEVANCY = "Relevancy" RECORD_TYPE = "Record Type" - class PGEnum(TypeDecorator): impl = postgresql.ENUM diff --git a/collector_db/models.py b/collector_db/models.py index 05578dd2..f1eac526 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -16,6 +16,7 @@ CURRENT_TIME_SERVER_DEFAULT = func.now() +batch_status_enum = PGEnum('complete', 'error', 'in-process', 'aborted', name='batch_status') class Batch(Base): __tablename__ = 'batches' @@ -29,9 +30,7 @@ class Batch(Base): user_id = Column(Integer, nullable=False) # Gives the status of the batch status = Column( - postgresql.ENUM( - 'complete', 'error', 'in-process', 'aborted', - name='batch_status'), + batch_status_enum, nullable=False ) # The number of URLs in the batch @@ -89,7 +88,7 @@ class URL(Base): tasks = relationship( "Task", secondary="link_task_urls", - back_populates="url", + back_populates="urls", ) @@ -158,12 +157,17 @@ class RootURL(Base): class URLErrorInfo(Base): __tablename__ = 'url_error_info' + __table_args__ = (UniqueConstraint( + "url_id", + "task_id", + name="uq_url_id_error"), + ) id = Column(Integer, primary_key=True) url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) error = Column(Text, nullable=False) updated_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) - task_id = Column(Integer, ForeignKey('tasks.id'), nullable=True) + task_id = Column(Integer, ForeignKey('tasks.id'), nullable=False) # Relationships url = relationship("URL", back_populates="error_info") @@ -241,25 +245,22 @@ class Missing(Base): class Task(Base): __tablename__ = 'tasks' - __table_args__ = (UniqueConstraint( - "task_type", - "task_id", - name="uq_task_type_task_id"), - ) id = Column(Integer, primary_key=True) - task_type = Column(String, nullable=False) - task_id = Column(String, nullable=False) - task_status = Column(String, nullable=False) + task_type = Column( + PGEnum( + 'HTML', 'Relevancy', 'Record Type', name='task_type' + ), nullable=False) + task_status = Column(batch_status_enum, nullable=False) updated_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) # Relationships urls = relationship( "URL", secondary="link_task_urls", - back_populates="task" + back_populates="tasks" ) - task_errors = relationship("TaskError", back_populates="task") + error = relationship("TaskError", back_populates="task") errored_urls = relationship("URLErrorInfo", back_populates="task") class LinkTaskURL(Base): @@ -273,10 +274,6 @@ class LinkTaskURL(Base): task_id = Column(Integer, ForeignKey('tasks.id', ondelete="CASCADE"), primary_key=True) url_id = Column(Integer, ForeignKey('urls.id', ondelete="CASCADE"), primary_key=True) - # Relationships - task = relationship("Task", back_populates="link_task_urls") - url = relationship("URL", back_populates="link_task_urls") - class TaskError(Base): __tablename__ = 'task_errors' @@ -286,4 +283,10 @@ class TaskError(Base): updated_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) # Relationships - task = relationship("Task", back_populates="task_errors") \ No newline at end of file + task = relationship("Task", back_populates="error") + + __table_args__ = (UniqueConstraint( + "task_id", + "error", + name="uq_task_id_error"), + ) \ No newline at end of file diff --git a/core/AsyncCore.py b/core/AsyncCore.py index de70abd2..5318a044 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -1,17 +1,23 @@ import logging from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.DTOs.URLAnnotationInfo import URLAnnotationInfo +from collector_db.enums import TaskType from core.DTOs.GetNextURLForRelevanceAnnotationResponse import GetNextURLForRelevanceAnnotationResponse +from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo from core.DTOs.RelevanceAnnotationInfo import RelevanceAnnotationPostInfo from core.DTOs.RelevanceAnnotationRequestInfo import RelevanceAnnotationRequestInfo from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator +from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator +from core.enums import BatchStatus from html_tag_collector.DataClassTags import convert_to_response_html_info from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.URLRequestInterface import URLRequestInterface from hugging_face.HuggingFaceInterface import HuggingFaceInterface +from llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier class AsyncCore: @@ -47,9 +53,18 @@ async def run_url_relevance_huggingface_task(self): ) await operator.run_task() + async def run_url_record_type_task(self): + self.logger.info("Running URL Record Type Task") + operator = URLRecordTypeTaskOperator( + adb_client=self.adb_client, + classifier=DeepSeekRecordClassifier() + ) + await operator.run_task() + async def run_tasks(self): await self.run_url_html_task() await self.run_url_relevance_huggingface_task() + await self.run_url_record_type_task() async def convert_to_relevance_annotation_request_info(self, url_info: URLAnnotationInfo) -> RelevanceAnnotationRequestInfo: response_html_info = convert_to_response_html_info( @@ -87,3 +102,9 @@ async def submit_url_relevance_annotation( async def get_urls(self, page: int, errors: bool) -> GetURLsResponseInfo: return await self.adb_client.get_urls(page=page, errors=errors) + + async def get_task_info(self, task_id: int) -> TaskInfo: + return await self.adb_client.get_task_info(task_id=task_id) + + async def get_tasks(self, page: int, task_type: TaskType, task_status: BatchStatus) -> GetTasksResponse: + return await self.adb_client.get_tasks(page=page, task_type=task_type, task_status=task_status) diff --git a/core/DTOs/GetTasksResponse.py b/core/DTOs/GetTasksResponse.py new file mode 100644 index 00000000..42b3d954 --- /dev/null +++ b/core/DTOs/GetTasksResponse.py @@ -0,0 +1,19 @@ +import datetime + +from pydantic import BaseModel + +from collector_db.enums import TaskType +from core.enums import BatchStatus + + +class GetTasksResponseTaskInfo(BaseModel): + task_id: int + type: TaskType + status: BatchStatus + url_count: int + url_error_count: int + updated_at: datetime.datetime + + +class GetTasksResponse(BaseModel): + tasks: list[GetTasksResponseTaskInfo] diff --git a/core/DTOs/task_data_objects/README.md b/core/DTOs/task_data_objects/README.md new file mode 100644 index 00000000..3d2fc5ae --- /dev/null +++ b/core/DTOs/task_data_objects/README.md @@ -0,0 +1 @@ +Task Data Objects (or TDOs) are data transfer objects (DTOs) used within a given task operation. Each Task type has one type of TDO. \ No newline at end of file diff --git a/core/DTOs/URLRecordTypeTaskInfo.py b/core/DTOs/task_data_objects/URLRecordTypeTDO.py similarity index 50% rename from core/DTOs/URLRecordTypeTaskInfo.py rename to core/DTOs/task_data_objects/URLRecordTypeTDO.py index 6c5d8ea7..34bbc233 100644 --- a/core/DTOs/URLRecordTypeTaskInfo.py +++ b/core/DTOs/task_data_objects/URLRecordTypeTDO.py @@ -6,6 +6,10 @@ from core.enums import RecordType -class URLRecordTypeTaskInfo(BaseModel): +class URLRecordTypeTDO(BaseModel): url_with_html: URLWithHTML - record_type: Optional[RecordType] = None \ No newline at end of file + record_type: Optional[RecordType] = None + error: Optional[str] = None + + def is_errored(self): + return self.error is not None \ No newline at end of file diff --git a/core/DTOs/URLRelevanceHuggingfaceTaskInfo.py b/core/DTOs/task_data_objects/URLRelevanceHuggingfaceTDO.py similarity index 78% rename from core/DTOs/URLRelevanceHuggingfaceTaskInfo.py rename to core/DTOs/task_data_objects/URLRelevanceHuggingfaceTDO.py index bb4553d1..33311a9b 100644 --- a/core/DTOs/URLRelevanceHuggingfaceTaskInfo.py +++ b/core/DTOs/task_data_objects/URLRelevanceHuggingfaceTDO.py @@ -5,6 +5,6 @@ from collector_db.DTOs.URLWithHTML import URLWithHTML -class URLRelevanceHuggingfaceTaskInfo(BaseModel): +class URLRelevanceHuggingfaceTDO(BaseModel): url_with_html: URLWithHTML relevant: Optional[bool] = None diff --git a/core/DTOs/URLHTMLTaskInfo.py b/core/DTOs/task_data_objects/UrlHtmlTDO.py similarity index 94% rename from core/DTOs/URLHTMLTaskInfo.py rename to core/DTOs/task_data_objects/UrlHtmlTDO.py index cff69e4f..05e9caf2 100644 --- a/core/DTOs/URLHTMLTaskInfo.py +++ b/core/DTOs/task_data_objects/UrlHtmlTDO.py @@ -7,7 +7,7 @@ @dataclass -class URLHTMLTaskInfo: +class UrlHtmlTDO: url_info: URLInfo url_response_info: Optional[URLResponseInfo] = None html_tag_info: Optional[ResponseHTMLInfo] = None diff --git a/core/classes/TaskOperatorBase.py b/core/classes/TaskOperatorBase.py new file mode 100644 index 00000000..6fd86c97 --- /dev/null +++ b/core/classes/TaskOperatorBase.py @@ -0,0 +1,64 @@ +from abc import ABC, abstractmethod + +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_db.enums import TaskType +from core.enums import BatchStatus + + +class TaskOperatorBase(ABC): + + def __init__(self, adb_client: AsyncDatabaseClient): + self.adb_client = adb_client + self.task_id = None + self.tasks_linked = False + + @property + @abstractmethod + def task_type(self) -> TaskType: + raise NotImplementedError + + @abstractmethod + async def meets_task_prerequisites(self): + """ + A task should not be initiated unless certain + conditions are met + """ + raise NotImplementedError + + async def link_urls_to_task(self, url_ids: list[int]): + await self.adb_client.link_urls_to_task(task_id=self.task_id, url_ids=url_ids) + self.tasks_linked = True + + async def initiate_task_in_db(self) -> int: + task_id = await self.adb_client.initiate_task( + task_type=self.task_type + ) + return task_id + + async def conclude_task_in_db(self): + if not self.tasks_linked: + raise Exception("Task has not been linked to any URLs") + await self.adb_client.update_task_status(task_id=self.task_id, status=BatchStatus.COMPLETE) + + async def run_task(self): + if not await self.meets_task_prerequisites(): + print(f"Task {self.task_type.value} does not meet prerequisites. Skipping...") + return + self.task_id = await self.initiate_task_in_db() + + try: + await self.inner_task_logic() + await self.conclude_task_in_db() + except Exception as e: + await self.handle_task_error(e) + + @abstractmethod + async def inner_task_logic(self): + raise NotImplementedError + + async def handle_task_error(self, e): + await self.adb_client.update_task_status(task_id=self.task_id, status=BatchStatus.ERROR) + await self.adb_client.add_task_error( + task_id=self.task_id, + error=str(e) + ) diff --git a/core/classes/URLHTMLTaskOperator.py b/core/classes/URLHTMLTaskOperator.py index 42c3e21a..63321635 100644 --- a/core/classes/URLHTMLTaskOperator.py +++ b/core/classes/URLHTMLTaskOperator.py @@ -1,93 +1,105 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.DTOs.URLInfo import URLInfo -from core.DTOs.URLHTMLTaskInfo import URLHTMLTaskInfo +from collector_db.enums import TaskType +from core.DTOs.task_data_objects.UrlHtmlTDO import UrlHtmlTDO from core.classes.HTMLContentInfoGetter import HTMLContentInfoGetter +from core.classes.TaskOperatorBase import TaskOperatorBase from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.URLRequestInterface import URLRequestInterface -class URLHTMLTaskOperator: +class URLHTMLTaskOperator(TaskOperatorBase): def __init__( - self, - url_request_interface: URLRequestInterface, - adb_client: AsyncDatabaseClient, - html_parser: HTMLResponseParser + self, + url_request_interface: URLRequestInterface, + adb_client: AsyncDatabaseClient, + html_parser: HTMLResponseParser ): + super().__init__(adb_client) self.url_request_interface = url_request_interface - self.adb_client = adb_client self.html_parser = html_parser - async def run_task(self): + @property + def task_type(self): + return TaskType.HTML + + async def meets_task_prerequisites(self): + return await self.adb_client.has_pending_urls_without_html_data() + + async def inner_task_logic(self): print("Running URL HTML Task...") - task_infos = await self.get_pending_urls_without_html_data() - await self.get_raw_html_data_for_urls(task_infos) - success_subset, error_subset = await self.separate_success_and_error_subsets(task_infos) + tdos = await self.get_pending_urls_without_html_data() + url_ids = [task_info.url_info.id for task_info in tdos] + await self.link_urls_to_task(url_ids=url_ids) + await self.get_raw_html_data_for_urls(tdos) + success_subset, error_subset = await self.separate_success_and_error_subsets(tdos) await self.update_errors_in_database(error_subset) await self.process_html_data(success_subset) await self.update_html_data_in_database(success_subset) - async def get_just_urls(self, task_infos: list[URLHTMLTaskInfo]): - return [task_info.url_info.url for task_info in task_infos] + async def get_just_urls(self, tdos: list[UrlHtmlTDO]): + return [task_info.url_info.url for task_info in tdos] async def get_pending_urls_without_html_data(self): pending_urls: list[URLInfo] = await self.adb_client.get_pending_urls_without_html_data() - task_infos = [ - URLHTMLTaskInfo( + tdos = [ + UrlHtmlTDO( url_info=url_info, ) for url_info in pending_urls ] - return task_infos + return tdos - async def get_raw_html_data_for_urls(self, task_infos: list[URLHTMLTaskInfo]): - just_urls = await self.get_just_urls(task_infos) + async def get_raw_html_data_for_urls(self, tdos: list[UrlHtmlTDO]): + just_urls = await self.get_just_urls(tdos) url_response_infos = await self.url_request_interface.make_requests(just_urls) - for task_info, url_response_info in zip(task_infos, url_response_infos): - task_info.url_response_info = url_response_info + for tdto, url_response_info in zip(tdos, url_response_infos): + tdto.url_response_info = url_response_info async def separate_success_and_error_subsets( self, - task_infos: list[URLHTMLTaskInfo] + tdos: list[UrlHtmlTDO] ) -> tuple[ - list[URLHTMLTaskInfo], # Successful - list[URLHTMLTaskInfo] # Error + list[UrlHtmlTDO], # Successful + list[UrlHtmlTDO] # Error ]: - errored_task_infos = [] - successful_task_infos = [] - for task_info in task_infos: - if not task_info.url_response_info.success: - errored_task_infos.append(task_info) + errored_tdos = [] + successful_tdos = [] + for tdto in tdos: + if not tdto.url_response_info.success: + errored_tdos.append(tdto) else: - successful_task_infos.append(task_info) - return successful_task_infos, errored_task_infos + successful_tdos.append(tdto) + return successful_tdos, errored_tdos - async def update_errors_in_database(self, errored_task_infos: list[URLHTMLTaskInfo]): + async def update_errors_in_database(self, error_tdos: list[UrlHtmlTDO]): error_infos = [] - for error_task_info in errored_task_infos: + for error_tdo in error_tdos: error_info = URLErrorPydanticInfo( - url_id=error_task_info.url_info.id, - error=str(error_task_info.url_response_info.exception), + task_id=self.task_id, + url_id=error_tdo.url_info.id, + error=str(error_tdo.url_response_info.exception), ) error_infos.append(error_info) await self.adb_client.add_url_error_infos(error_infos) - async def process_html_data(self, task_infos: list[URLHTMLTaskInfo]): - for task_info in task_infos: + async def process_html_data(self, tdos: list[UrlHtmlTDO]): + for tdto in tdos: html_tag_info = await self.html_parser.parse( - url=task_info.url_info.url, - html_content=task_info.url_response_info.html, - content_type=task_info.url_response_info.content_type + url=tdto.url_info.url, + html_content=tdto.url_response_info.html, + content_type=tdto.url_response_info.content_type ) - task_info.html_tag_info = html_tag_info + tdto.html_tag_info = html_tag_info - async def update_html_data_in_database(self, task_infos: list[URLHTMLTaskInfo]): + async def update_html_data_in_database(self, tdos: list[UrlHtmlTDO]): html_content_infos = [] - for task_info in task_infos: + for tdto in tdos: hcig = HTMLContentInfoGetter( - response_html_info=task_info.html_tag_info, - url_id=task_info.url_info.id + response_html_info=tdto.html_tag_info, + url_id=tdto.url_info.id ) results = hcig.get_all_html_content() html_content_infos.extend(results) diff --git a/core/classes/URLRecordTypeTaskOperator.py b/core/classes/URLRecordTypeTaskOperator.py index 3b1b27b2..18ac8ef4 100644 --- a/core/classes/URLRecordTypeTaskOperator.py +++ b/core/classes/URLRecordTypeTaskOperator.py @@ -1,24 +1,85 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.enums import URLMetadataAttributeType +from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo +from collector_db.enums import URLMetadataAttributeType, TaskType, ValidationStatus, ValidationSource +from core.DTOs.task_data_objects.URLRecordTypeTDO import URLRecordTypeTDO +from core.classes.TaskOperatorBase import TaskOperatorBase +from core.enums import RecordType from llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier -class URLRecordTypeTaskOperator: +class URLRecordTypeTaskOperator(TaskOperatorBase): def __init__( self, adb_client: AsyncDatabaseClient, classifier: DeepSeekRecordClassifier ): - self.adb_client = adb_client + super().__init__(adb_client) self.classifier = classifier - async def run_task(self): + @property + def task_type(self): + return TaskType.RECORD_TYPE + + async def meets_task_prerequisites(self): + return await self.adb_client.has_pending_urls_with_html_data_and_without_metadata_type( + without_metadata_type=URLMetadataAttributeType.RECORD_TYPE + ) + + async def get_tdos(self) -> list[URLRecordTypeTDO]: + urls_with_html = await self.adb_client.get_urls_with_html_data_and_without_metadata_type( + without_metadata_type=URLMetadataAttributeType.RECORD_TYPE + ) + tdos = [URLRecordTypeTDO(url_with_html=url_with_html) for url_with_html in urls_with_html] + return tdos + + async def inner_task_logic(self): # Get pending urls from Source Collector # with HTML data and without Record Type Metadata - task_infos = await self.adb_client.get_pending_urls_without_html_data( - without_metadata_attribute=URLMetadataAttributeType.RECORD_TYPE - ) + tdos = await self.get_tdos() + url_ids = [tdo.url_with_html.url_id for tdo in tdos] + await self.link_urls_to_task(url_ids=url_ids) + + await self.get_ml_classifications(tdos) + success_subset, error_subset = await self.separate_success_and_error_subsets(tdos) + await self.put_results_into_database(success_subset) + await self.update_errors_in_database(error_subset) + + async def update_errors_in_database(self, tdos: list[URLRecordTypeTDO]): + error_infos = [] + for tdo in tdos: + error_info = URLErrorPydanticInfo( + task_id=self.task_id, + url_id=tdo.url_with_html.url_id, + error=tdo.error + ) + error_infos.append(error_info) + await self.adb_client.add_url_error_infos(error_infos) + + async def put_results_into_database(self, tdos: list[URLRecordTypeTDO]): + url_metadatas = [] + for tdo in tdos: + url_metadata = URLMetadataInfo( + url_id=tdo.url_with_html.url_id, + attribute=URLMetadataAttributeType.RECORD_TYPE, + value=str(tdo.record_type), + validation_status=ValidationStatus.PENDING_VALIDATION, + validation_source=ValidationSource.MACHINE_LEARNING + ) + url_metadatas.append(url_metadata) + await self.adb_client.add_url_metadatas(url_metadatas) + + async def separate_success_and_error_subsets(self, tdos: list[URLRecordTypeTDO]): + success_subset = [tdo for tdo in tdos if not tdo.is_errored()] + error_subset = [tdo for tdo in tdos if tdo.is_errored()] + return success_subset, error_subset - async def get_ml_classifications(self, task_infos: list[URLRecordTypeTaskInfo]): \ No newline at end of file + async def get_ml_classifications(self, tdos: list[URLRecordTypeTDO]): + for tdo in tdos: + try: + record_type_str = await self.classifier.classify_url(tdo.url_with_html.html_infos) + tdo.record_type = RecordType(record_type_str) + except Exception as e: + tdo.error = str(e) \ No newline at end of file diff --git a/core/classes/URLRelevanceHuggingfaceTaskOperator.py b/core/classes/URLRelevanceHuggingfaceTaskOperator.py index 904adbe1..2d54a856 100644 --- a/core/classes/URLRelevanceHuggingfaceTaskOperator.py +++ b/core/classes/URLRelevanceHuggingfaceTaskOperator.py @@ -1,63 +1,73 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.DTOs.URLWithHTML import URLWithHTML -from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource -from core.DTOs.URLRelevanceHuggingfaceTaskInfo import URLRelevanceHuggingfaceTaskInfo +from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource, TaskType +from core.DTOs.task_data_objects.URLRelevanceHuggingfaceTDO import URLRelevanceHuggingfaceTDO +from core.classes.TaskOperatorBase import TaskOperatorBase from hugging_face.HuggingFaceInterface import HuggingFaceInterface -class URLRelevanceHuggingfaceTaskOperator: +class URLRelevanceHuggingfaceTaskOperator(TaskOperatorBase): def __init__( self, adb_client: AsyncDatabaseClient, huggingface_interface: HuggingFaceInterface ): - self.adb_client = adb_client + super().__init__(adb_client) self.huggingface_interface = huggingface_interface - async def run_task(self): + @property + def task_type(self): + return TaskType.RELEVANCY + + async def meets_task_prerequisites(self): + return await self.adb_client.has_pending_urls_with_html_data_and_without_metadata_type() + + async def inner_task_logic(self): # Get pending urls from Source Collector # with HTML data and without Relevancy Metadata - task_infos = await self.get_pending_url_info( + tdos = await self.get_pending_url_info( without_metadata_attribute=URLMetadataAttributeType.RELEVANT ) + url_ids = [tdo.url_with_html.url_id for tdo in tdos] + await self.link_urls_to_task(url_ids=url_ids) # Pipe into Huggingface - await self.add_huggingface_relevancy(task_infos) + await self.add_huggingface_relevancy(tdos) # Put results into Database - await self.put_results_into_database(task_infos) + await self.put_results_into_database(tdos) - async def put_results_into_database(self, task_infos): + async def put_results_into_database(self, tdos): url_metadatas = [] - for task_info in task_infos: + for tdo in tdos: url_metadata = URLMetadataInfo( - url_id=task_info.url_with_html.url_id, + url_id=tdo.url_with_html.url_id, attribute=URLMetadataAttributeType.RELEVANT, - value=str(task_info.relevant), + value=str(tdo.relevant), validation_status=ValidationStatus.PENDING_VALIDATION, validation_source=ValidationSource.MACHINE_LEARNING ) url_metadatas.append(url_metadata) await self.adb_client.add_url_metadatas(url_metadatas) - async def add_huggingface_relevancy(self, task_infos: list[URLRelevanceHuggingfaceTaskInfo]): - urls_with_html = [task_info.url_with_html for task_info in task_infos] + async def add_huggingface_relevancy(self, tdos: list[URLRelevanceHuggingfaceTDO]): + urls_with_html = [tdo.url_with_html for tdo in tdos] results = self.huggingface_interface.get_url_relevancy(urls_with_html) - for task_info, result in zip(task_infos, results): - task_info.relevant = result + for tdo, result in zip(tdos, results): + tdo.relevant = result async def get_pending_url_info( self, without_metadata_attribute: URLMetadataAttributeType - ) -> list[URLRelevanceHuggingfaceTaskInfo]: - task_infos = [] + ) -> list[URLRelevanceHuggingfaceTDO]: + tdos = [] pending_urls: list[URLWithHTML] = await self.adb_client.get_urls_with_html_data_and_without_metadata_type( without_metadata_type=without_metadata_attribute ) for url_with_html in pending_urls: - task_info = URLRelevanceHuggingfaceTaskInfo( + tdo = URLRelevanceHuggingfaceTDO( url_with_html=url_with_html ) - task_infos.append(task_info) - return task_infos + tdos.append(tdo) + return tdos diff --git a/html_tag_collector/RootURLCache.py b/html_tag_collector/RootURLCache.py index be670475..e306b6e1 100644 --- a/html_tag_collector/RootURLCache.py +++ b/html_tag_collector/RootURLCache.py @@ -26,7 +26,7 @@ async def save_to_cache(self, url: str, title: str): self.cache[url] = title await self.adb_client.add_to_root_url_cache(url=url, page_title=title) - async def get_from_cache(self, url: str): + async def get_from_cache(self, url: str) -> Optional[str]: if self.cache is None: self.cache = await self.adb_client.load_root_url_cache() diff --git a/hugging_face/HuggingFaceInterface.py b/hugging_face/HuggingFaceInterface.py index 2ea635d5..4e37e9c4 100644 --- a/hugging_face/HuggingFaceInterface.py +++ b/hugging_face/HuggingFaceInterface.py @@ -1,14 +1,12 @@ from transformers import pipeline from collector_db.DTOs.URLWithHTML import URLWithHTML -from hugging_face.URLClassifier import URLClassifier class HuggingFaceInterface: def __init__(self): self.relevance_pipe = pipeline("text-classification", model="PDAP/url-relevance") - self.url_classifier = URLClassifier() def get_url_relevancy( self, diff --git a/local_database/DataDumper/docker-compose.yml b/local_database/DataDumper/docker-compose.yml index f24c78b5..4a28c5e8 100644 --- a/local_database/DataDumper/docker-compose.yml +++ b/local_database/DataDumper/docker-compose.yml @@ -22,6 +22,6 @@ services: entrypoint: [ "bash", # Comment out one of the following lines depending on your needs -# "/usr/local/bin/dump.sh" - "/usr/local/bin/restore.sh" + "/usr/local/bin/dump.sh" +# "/usr/local/bin/restore.sh" ] \ No newline at end of file diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index c7fce247..c9c26846 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -1,4 +1,4 @@ -from typing import List +from typing import List, Optional from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.BatchInfo import BatchInfo @@ -9,7 +9,7 @@ from collector_db.DTOs.URLInfo import URLInfo from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.DatabaseClient import DatabaseClient -from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource +from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource, TaskType from collector_manager.enums import CollectorType from core.enums import BatchStatus from tests.helpers.simple_test_data_functions import generate_test_urls @@ -34,6 +34,12 @@ def batch(self): ) ) + async def task(self, url_ids: Optional[list[int]] = None) -> int: + task_id = await self.adb_client.initiate_task(task_type=TaskType.HTML) + if url_ids is not None: + await self.adb_client.link_urls_to_task(task_id=task_id, url_ids=url_ids) + return task_id + def urls(self, batch_id: int, url_count: int) -> InsertURLsInfo: raw_urls = generate_test_urls(url_count) url_infos: List[URLInfo] = [] @@ -99,12 +105,19 @@ async def metadata( ) ) - async def error_info(self, url_ids: list[int]): + async def error_info( + self, + url_ids: list[int], + task_id: Optional[int] = None + ): + if task_id is None: + task_id = await self.task() error_infos = [] for url_id in url_ids: url_error_info = URLErrorPydanticInfo( url_id=url_id, error="test error", + task_id=task_id ) error_infos.append(url_error_info) await self.adb_client.add_url_error_infos(error_infos) diff --git a/tests/helpers/assert_functions.py b/tests/helpers/assert_functions.py new file mode 100644 index 00000000..ef379d3e --- /dev/null +++ b/tests/helpers/assert_functions.py @@ -0,0 +1,7 @@ +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_db.models import Task + + +async def assert_database_has_no_tasks(adb_client: AsyncDatabaseClient): + tasks = await adb_client.get_all(Task) + assert len(tasks) == 0 \ No newline at end of file diff --git a/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py b/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py index 2489d17f..c962e1e7 100644 --- a/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py +++ b/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py @@ -1,12 +1,12 @@ import os import dotenv -from tests.automated.core.helpers.common_test_procedures import run_collector_and_wait_for_completion import api.dependencies from collector_db.DTOs.BatchInfo import BatchInfo from collector_manager.enums import CollectorType from core.enums import BatchStatus +from test_automated.integration.core.helpers.common_test_procedures import run_collector_and_wait_for_completion def test_auto_googler_collector_lifecycle(test_core): diff --git a/tests/manual/core/lifecycle/test_ckan_lifecycle.py b/tests/manual/core/lifecycle/test_ckan_lifecycle.py index 10802c77..575dedfa 100644 --- a/tests/manual/core/lifecycle/test_ckan_lifecycle.py +++ b/tests/manual/core/lifecycle/test_ckan_lifecycle.py @@ -1,10 +1,10 @@ -from tests.automated.core.helpers.common_test_procedures import run_collector_and_wait_for_completion import api.dependencies from collector_db.DTOs.BatchInfo import BatchInfo from collector_manager.enums import CollectorType from core.enums import BatchStatus from source_collectors.ckan.search_terms import group_search, package_search, organization_search +from test_automated.integration.core.helpers.common_test_procedures import run_collector_and_wait_for_completion def test_ckan_lifecycle(test_core): diff --git a/tests/manual/core/lifecycle/test_muckrock_lifecycles.py b/tests/manual/core/lifecycle/test_muckrock_lifecycles.py index d92fa0be..b688b0a8 100644 --- a/tests/manual/core/lifecycle/test_muckrock_lifecycles.py +++ b/tests/manual/core/lifecycle/test_muckrock_lifecycles.py @@ -1,10 +1,10 @@ -from tests.automated.core.helpers.common_test_procedures import run_collector_and_wait_for_completion -from tests.automated.core.helpers.constants import ALLEGHENY_COUNTY_TOWN_NAMES, ALLEGHENY_COUNTY_MUCKROCK_ID import api.dependencies from collector_db.DTOs.BatchInfo import BatchInfo from collector_manager.enums import CollectorType from core.enums import BatchStatus +from test_automated.integration.core.helpers.common_test_procedures import run_collector_and_wait_for_completion +from test_automated.integration.core.helpers.constants import ALLEGHENY_COUNTY_MUCKROCK_ID, ALLEGHENY_COUNTY_TOWN_NAMES def test_muckrock_simple_search_collector_lifecycle(test_core): diff --git a/tests/manual/source_collectors/test_muckrock_collectors.py b/tests/manual/source_collectors/test_muckrock_collectors.py index 00e1d57e..4689dbab 100644 --- a/tests/manual/source_collectors/test_muckrock_collectors.py +++ b/tests/manual/source_collectors/test_muckrock_collectors.py @@ -7,7 +7,7 @@ from source_collectors.muckrock.classes.MuckrockCollector import MuckrockSimpleSearchCollector, \ MuckrockCountyLevelSearchCollector, MuckrockAllFOIARequestsCollector from source_collectors.muckrock.schemas import MuckrockURLInfoSchema -from test_automated.integration.core.helpers import ALLEGHENY_COUNTY_MUCKROCK_ID, ALLEGHENY_COUNTY_TOWN_NAMES +from test_automated.integration.core.helpers.constants import ALLEGHENY_COUNTY_MUCKROCK_ID, ALLEGHENY_COUNTY_TOWN_NAMES def test_muckrock_simple_search_collector(): diff --git a/tests/test_alembic/helpers.py b/tests/test_alembic/helpers.py index 098ee1df..d6b2bea4 100644 --- a/tests/test_alembic/helpers.py +++ b/tests/test_alembic/helpers.py @@ -1,7 +1,9 @@ +from typing import Optional + from sqlalchemy import text from sqlalchemy.orm import Session -from tests.test_alembic.AlembicRunner import AlembicRunner +from tests.test_alembic.AlembicRunner import AlembicRunner def get_enum_values(enum_name: str, session: Session) -> list[str]: @@ -10,13 +12,23 @@ def get_enum_values(enum_name: str, session: Session) -> list[str]: def table_creation_check( alembic_runner: AlembicRunner, tables: list[str], - start_revision: str, - end_revision: str + end_revision: str, + start_revision: Optional[str] = None, + ): - alembic_runner.upgrade(start_revision) + if start_revision is not None: + alembic_runner.upgrade(start_revision) for table_name in tables: assert table_name not in alembic_runner.inspector.get_table_names() alembic_runner.upgrade(end_revision) alembic_runner.reflect() for table_name in tables: - assert table_name in alembic_runner.inspector.get_table_names() \ No newline at end of file + assert table_name in alembic_runner.inspector.get_table_names() + +def columns_in_table( + alembic_runner: AlembicRunner, + table_name: str, + columns_to_check: list[str], +) -> bool: + current_columns = [col["name"] for col in alembic_runner.inspector.get_columns(table_name)] + return all(column in current_columns for column in columns_to_check) diff --git a/tests/test_alembic/test_revisions.py b/tests/test_alembic/test_revisions.py index 95684ce2..67869ab6 100644 --- a/tests/test_alembic/test_revisions.py +++ b/tests/test_alembic/test_revisions.py @@ -15,6 +15,7 @@ from sqlalchemy import text +from test_alembic.helpers import columns_in_table from tests.test_alembic.helpers import get_enum_values, table_creation_check @@ -304,6 +305,12 @@ def test_create_metadata_annotation_table(alembic_runner): ) def test_add_task_tables_and_linking_logic(alembic_runner): + alembic_runner.upgrade("dcd158092de0") + assert not columns_in_table( + alembic_runner, + table_name="url_error_info", + columns_to_check=["task_id"], + ) table_creation_check( alembic_runner, tables=[ @@ -311,6 +318,10 @@ def test_add_task_tables_and_linking_logic(alembic_runner): "task_errors", "link_task_urls" ], - start_revision="dcd158092de0", - end_revision="b0e34cec732a" + end_revision="072b32a45b1c" + ) + assert columns_in_table( + alembic_runner, + table_name="url_error_info", + columns_to_check=["task_id"], ) \ No newline at end of file diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index 7a0e9a6a..220b6645 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -5,15 +5,17 @@ from starlette.testclient import TestClient from collector_db.DTOs.BatchInfo import BatchInfo +from collector_db.DTOs.TaskInfo import TaskInfo +from collector_db.enums import TaskType from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.enums import CollectorType from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse from core.DTOs.GetNextURLForRelevanceAnnotationResponse import GetNextURLForRelevanceAnnotationResponse +from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo -from core.DTOs.LabelStudioExportResponseInfo import LabelStudioExportResponseInfo from core.DTOs.MessageCountResponse import MessageCountResponse from core.DTOs.MessageResponse import MessageResponse from core.DTOs.RelevanceAnnotationInfo import RelevanceAnnotationPostInfo @@ -160,12 +162,6 @@ def get_batch_logs(self, batch_id: int) -> GetBatchLogsResponse: ) return GetBatchLogsResponse(**data) - def export_batch_to_label_studio(self, batch_id: int) -> LabelStudioExportResponseInfo: - data = self.post( - url=f"/label-studio/export-batch/{batch_id}" - ) - return LabelStudioExportResponseInfo(**data) - def abort_batch(self, batch_id: int) -> MessageResponse: data = self.post( url=f"/batch/{batch_id}/abort" @@ -201,4 +197,30 @@ def get_urls(self, page: int = 1, errors: bool = False) -> GetURLsResponseInfo: url=f"/url", params={"page": page, "errors": errors} ) - return GetURLsResponseInfo(**data) \ No newline at end of file + return GetURLsResponseInfo(**data) + + def get_task_info(self, task_id: int) -> TaskInfo: + data = self.get( + url=f"/task/{task_id}" + ) + return TaskInfo(**data) + + def get_tasks( + self, + page: int = 1, + task_type: Optional[TaskType] = None, + task_status: Optional[BatchStatus] = None + ) -> GetTasksResponse: + params = {"page": page} + update_if_not_none( + target=params, + source={ + "task_type": task_type.value if task_type else None, + "task_status": task_status.value if task_status else None + } + ) + data = self.get( + url=f"/task", + params=params + ) + return GetTasksResponse(**data) \ No newline at end of file diff --git a/tests/test_automated/integration/api/test_task.py b/tests/test_automated/integration/api/test_task.py new file mode 100644 index 00000000..64fbe75d --- /dev/null +++ b/tests/test_automated/integration/api/test_task.py @@ -0,0 +1,41 @@ +import pytest + +from collector_db.enums import TaskType +from test_automated.integration.api.conftest import APITestHelper + + +async def task_setup(ath: APITestHelper) -> int: + iui = ath.db_data_creator.urls(batch_id=ath.db_data_creator.batch(), url_count=3) + url_ids = [url.url_id for url in iui.url_mappings] + + task_id = await ath.db_data_creator.task(url_ids=url_ids) + await ath.db_data_creator.error_info(url_ids=[url_ids[0]], task_id=task_id) + + return task_id + +@pytest.mark.asyncio +async def test_get_task_info(api_test_helper): + ath = api_test_helper + + task_id = await task_setup(ath) + + task_info = ath.request_validator.get_task_info(task_id=task_id) + + assert len(task_info.urls) == 3 + assert len(task_info.url_errors) == 1 + + assert task_info.task_type == TaskType.HTML + +@pytest.mark.asyncio +async def test_get_tasks(api_test_helper): + ath = api_test_helper + for i in range(2): + await task_setup(ath) + + response = ath.request_validator.get_tasks(page=1, task_type=None, task_status=None) + + assert len(response.tasks) == 2 + for task in response.tasks: + assert task.type == TaskType.HTML + assert task.url_count == 3 + assert task.url_error_count == 1 diff --git a/tests/test_automated/integration/collector_db/test_database_structure.py b/tests/test_automated/integration/collector_db/test_database_structure.py index 51d9a918..272f3de2 100644 --- a/tests/test_automated/integration/collector_db/test_database_structure.py +++ b/tests/test_automated/integration/collector_db/test_database_structure.py @@ -326,10 +326,3 @@ def test_root_url(db_data_creator: DBDataCreator): ) table_tester.run_column_tests() - -def test_task_url_links(db_data_creator: DBDataCreator): - # Create URLs - - # Create task - - # Associate URLs with task diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index feadf57f..fa3b7110 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -136,12 +136,14 @@ async def test_add_url_error_info(db_data_creator: DBDataCreator): url_ids = [url_mapping.url_id for url_mapping in url_mappings] adb_client = AsyncDatabaseClient() + task_id = await db_data_creator.task() error_infos = [] for url_mapping in url_mappings: uei = URLErrorPydanticInfo( url_id=url_mapping.url_id, error="test error", + task_id=task_id ) error_infos.append(uei) @@ -167,7 +169,9 @@ async def test_get_urls_with_html_data_and_no_relevancy_metadata( url_ids = [url_info.url_id for url_info in url_mappings] await db_data_creator.html_data(url_ids) await db_data_creator.metadata([url_ids[0]]) - results = await db_data_creator.adb_client.get_urls_with_html_data_and_no_relevancy_metadata() + results = await db_data_creator.adb_client.get_urls_with_html_data_and_without_metadata_type( + without_metadata_type=URLMetadataAttributeType.RELEVANT + ) permitted_url_ids = [url_id for url_id in url_ids if url_id != url_ids[0]] assert len(results) == 2 diff --git a/tests/test_automated/integration/tasks/__init__.py b/tests/test_automated/integration/tasks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/test_automated/integration/tasks/test_example_task.py b/tests/test_automated/integration/tasks/test_example_task.py new file mode 100644 index 00000000..6e69bc89 --- /dev/null +++ b/tests/test_automated/integration/tasks/test_example_task.py @@ -0,0 +1,87 @@ +import types + +import pytest + +from collector_db.enums import TaskType +from core.classes.TaskOperatorBase import TaskOperatorBase +from core.enums import BatchStatus +from helpers.DBDataCreator import DBDataCreator + +class ExampleTaskOperator(TaskOperatorBase): + + @property + def task_type(self) -> TaskType: + # Use TaskType.HTML so we don't have to add a test enum value to the db + return TaskType.HTML + + def inner_task_logic(self): + raise NotImplementedError + + async def meets_task_prerequisites(self): + return True + +@pytest.mark.asyncio +async def test_example_task_success(db_data_creator: DBDataCreator): + batch_id = db_data_creator.batch() + url_mappings = db_data_creator.urls( + batch_id=batch_id, + url_count=3 + ).url_mappings + url_ids = [url_info.url_id for url_info in url_mappings] + + async def mock_inner_task_logic(self): + # Add link to 3 urls + await self.adb_client.link_urls_to_task(task_id=self.task_id, url_ids=url_ids) + self.tasks_linked = True + + operator = ExampleTaskOperator(adb_client=db_data_creator.adb_client) + operator.inner_task_logic = types.MethodType(mock_inner_task_logic, operator) + + await operator.run_task() + + # Get Task Info + task_info = await db_data_creator.adb_client.get_task_info(task_id=operator.task_id) + + # Check that 3 urls were linked to the task + assert len(task_info.urls) == 3 + + # Check that error info is empty + assert task_info.error_info is None + + # Check that the task was marked as complete + assert task_info.task_status == BatchStatus.COMPLETE + + # Check that the task type is HTML + assert task_info.task_type == TaskType.HTML + + + # Check that updated_at is not null + assert task_info.updated_at is not None + +@pytest.mark.asyncio +async def test_example_task_failure(db_data_creator: DBDataCreator): + operator = ExampleTaskOperator(adb_client=db_data_creator.adb_client) + + def mock_inner_task_logic(self): + raise ValueError("test error") + + operator.inner_task_logic = types.MethodType(mock_inner_task_logic, operator) + await operator.run_task() + + # Get Task Info + task_info = await db_data_creator.adb_client.get_task_info(task_id=operator.task_id) + + # Check that there are no URLs associated + assert len(task_info.urls) == 0 + + # Check that the task was marked as errored + assert task_info.task_status == BatchStatus.ERROR + + # Check that the task type is HTML + assert task_info.task_type == TaskType.HTML + + # Check error + assert "test error" in task_info.error_info + + + diff --git a/tests/test_automated/integration/tasks/test_url_html_task.py b/tests/test_automated/integration/tasks/test_url_html_task.py new file mode 100644 index 00000000..ff608b66 --- /dev/null +++ b/tests/test_automated/integration/tasks/test_url_html_task.py @@ -0,0 +1,105 @@ +import types +from typing import Optional + +import pytest + +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_db.enums import TaskType +from collector_db.models import Task +from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator +from core.enums import BatchStatus +from helpers.DBDataCreator import DBDataCreator +from helpers.assert_functions import assert_database_has_no_tasks +from html_tag_collector.DataClassTags import ResponseHTMLInfo +from html_tag_collector.ResponseParser import HTMLResponseParser +from html_tag_collector.RootURLCache import RootURLCache +from html_tag_collector.URLRequestInterface import URLRequestInterface, URLResponseInfo + + +@pytest.mark.asyncio +async def test_url_html_task(db_data_creator: DBDataCreator): + + mock_html_content = "" + mock_content_type = "text/html" + + async def mock_make_requests(self, urls: list[str]) -> list[URLResponseInfo]: + results = [] + for idx, url in enumerate(urls): + if idx == 2: + results.append( + URLResponseInfo( + success=False, + exception=ValueError("test error"), + content_type=mock_content_type + )) + else: + results.append(URLResponseInfo( + html=mock_html_content, success=True, content_type=mock_content_type)) + return results + + async def mock_parse(self, url: str, html_content: str, content_type: str) -> ResponseHTMLInfo: + assert html_content == mock_html_content + assert content_type == mock_content_type + return ResponseHTMLInfo( + url=url, + title="fake title", + description="fake description", + ) + + async def mock_get_from_cache(self, url: str) -> Optional[str]: + return None + + # Add mock methods or mock classes + url_request_interface = URLRequestInterface() + url_request_interface.make_requests = types.MethodType(mock_make_requests, url_request_interface) + + mock_root_url_cache = RootURLCache() + mock_root_url_cache.get_from_cache = types.MethodType(mock_get_from_cache, mock_root_url_cache) + + html_parser = HTMLResponseParser( + root_url_cache=mock_root_url_cache + ) + html_parser.parse = types.MethodType(mock_parse, html_parser) + + operator = URLHTMLTaskOperator( + adb_client=AsyncDatabaseClient(), + url_request_interface=url_request_interface, + html_parser=html_parser + ) + await operator.run_task() + + # Check that, because no URLs were created, the task did not run + await assert_database_has_no_tasks(db_data_creator.adb_client) + + batch_id = db_data_creator.batch() + url_mappings = db_data_creator.urls(batch_id=batch_id, url_count=3).url_mappings + url_ids = [url_info.url_id for url_info in url_mappings] + + await operator.run_task() + + + # Check in database that + # - task is listed as complete + # - task type is listed as 'HTML' + # - task has 3 urls + # - task has one errored url with error "ValueError" + task_info = await db_data_creator.adb_client.get_task_info( + task_id=operator.task_id + ) + + assert task_info.error_info is None + assert task_info.task_status == BatchStatus.COMPLETE + assert task_info.task_type == TaskType.HTML + + assert len(task_info.urls) == 3 + assert len(task_info.url_errors) == 1 + assert task_info.url_errors[0].error == "test error" + + adb = db_data_creator.adb_client + # Check that both success urls have two rows of HTML data + hci = await adb.get_html_content_info(url_id=task_info.urls[0].id) + assert len(hci) == 2 + hci = await adb.get_html_content_info(url_id=task_info.urls[1].id) + assert len(hci) == 2 + + # Check that errored url has error info diff --git a/tests/test_automated/integration/tasks/test_url_record_type_task.py b/tests/test_automated/integration/tasks/test_url_record_type_task.py new file mode 100644 index 00000000..349a4e23 --- /dev/null +++ b/tests/test_automated/integration/tasks/test_url_record_type_task.py @@ -0,0 +1,47 @@ +from unittest.mock import MagicMock + +import pytest + +from collector_db.enums import TaskType +from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator +from core.enums import RecordType, BatchStatus +from helpers.assert_functions import assert_database_has_no_tasks +from llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier + + +@pytest.mark.asyncio +async def test_url_record_type_task(db_data_creator): + + mock_classifier = MagicMock(spec=DeepSeekRecordClassifier) + mock_classifier.classify_url.side_effect = [RecordType.ACCIDENT_REPORTS, "Error"] + + operator = URLRecordTypeTaskOperator( + adb_client=db_data_creator.adb_client, + classifier=mock_classifier + ) + + await operator.run_task() + + # No task should have been created due to not meeting prerequisites + await assert_database_has_no_tasks(db_data_creator.adb_client) + + batch_id = db_data_creator.batch() + iui = db_data_creator.urls(batch_id=batch_id, url_count=2) + url_ids = [iui.url_mappings[0].url_id, iui.url_mappings[1].url_id] + await db_data_creator.html_data(url_ids) + + await operator.run_task() + + + # Task should have been created + task_info = await db_data_creator.adb_client.get_task_info(task_id=operator.task_id) + assert task_info.error_info is None + assert task_info.task_status == BatchStatus.COMPLETE + + response = await db_data_creator.adb_client.get_tasks() + tasks = response.tasks + assert len(tasks) == 1 + task = tasks[0] + assert task.type == TaskType.RECORD_TYPE + assert task.url_count == 2 + assert task.url_error_count == 1 diff --git a/tests/test_automated/integration/cycles/test_url_relevancy_huggingface_cycle.py b/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py similarity index 82% rename from tests/test_automated/integration/cycles/test_url_relevancy_huggingface_cycle.py rename to tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py index 3ff2c846..1cab4ee5 100644 --- a/tests/test_automated/integration/cycles/test_url_relevancy_huggingface_cycle.py +++ b/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py @@ -5,18 +5,15 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLWithHTML import URLWithHTML from collector_db.enums import ValidationStatus, ValidationSource -from collector_db.models import URLMetadata +from collector_db.models import URLMetadata, Task from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator +from helpers.assert_functions import assert_database_has_no_tasks from hugging_face.HuggingFaceInterface import HuggingFaceInterface @pytest.mark.asyncio -async def test_url_relevancy_huggingface_cycle(db_data_creator): - batch_id = db_data_creator.batch() - url_mappings = db_data_creator.urls(batch_id=batch_id, url_count=3).url_mappings - url_ids = [url_info.url_id for url_info in url_mappings] - await db_data_creator.html_data(url_ids) - await db_data_creator.metadata([url_ids[0]]) +async def test_url_relevancy_huggingface_task(db_data_creator): + def num_to_bool(num: int) -> bool: if num == 0: @@ -38,11 +35,21 @@ def mock_get_url_relevancy( mock_hf_interface = MagicMock(spec=HuggingFaceInterface) mock_hf_interface.get_url_relevancy = mock_get_url_relevancy - cycler = URLRelevanceHuggingfaceTaskOperator( + task_operator = URLRelevanceHuggingfaceTaskOperator( adb_client=AsyncDatabaseClient(), huggingface_interface=mock_hf_interface ) - await cycler.run_task() + await task_operator.run_task() + + await assert_database_has_no_tasks(db_data_creator.adb_client) + + batch_id = db_data_creator.batch() + url_mappings = db_data_creator.urls(batch_id=batch_id, url_count=3).url_mappings + url_ids = [url_info.url_id for url_info in url_mappings] + await db_data_creator.html_data(url_ids) + await db_data_creator.metadata([url_ids[0]]) + + await task_operator.run_task() results = await db_data_creator.adb_client.get_all(URLMetadata) From 698902e9d20ea34b31d80635a09846399422018c Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 28 Jan 2025 18:34:00 -0500 Subject: [PATCH 019/244] Create `/task` route --- api/routes/task.py | 49 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 api/routes/task.py diff --git a/api/routes/task.py b/api/routes/task.py new file mode 100644 index 00000000..d9cdbeac --- /dev/null +++ b/api/routes/task.py @@ -0,0 +1,49 @@ +from typing import Optional + +from fastapi import APIRouter, Depends, Query, Path + +from api.dependencies import get_async_core +from collector_db.DTOs.TaskInfo import TaskInfo +from collector_db.enums import TaskType +from core.AsyncCore import AsyncCore +from core.enums import BatchStatus +from security_manager.SecurityManager import AccessInfo, get_access_info + +task_router = APIRouter( + prefix="/task", + tags=["Task"], + responses={404: {"description": "Not found"}}, +) + + +@task_router.get("") +async def get_tasks( + page: int = Query( + description="The page number", + default=1 + ), + task_status: Optional[BatchStatus] = Query( + description="Filter by task status", + default=None + ), + task_type: Optional[TaskType] = Query( + description="Filter by task type", + default=None + ), + async_core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info) +): + return await async_core.get_tasks( + page=page, + task_type=task_type, + task_status=task_status + ) + + +@task_router.get("/{task_id}") +async def get_task_info( + task_id: int = Path(description="The task id"), + async_core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info) +) -> TaskInfo: + return await async_core.get_task_info(task_id) \ No newline at end of file From fbc9bcb5a606442338e26a98a86bbc4c4c7519c0 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 28 Jan 2025 18:34:09 -0500 Subject: [PATCH 020/244] Rename directory --- .../cycles => core/DTOs/task_data_objects}/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {tests/test_automated/integration/cycles => core/DTOs/task_data_objects}/__init__.py (100%) diff --git a/tests/test_automated/integration/cycles/__init__.py b/core/DTOs/task_data_objects/__init__.py similarity index 100% rename from tests/test_automated/integration/cycles/__init__.py rename to core/DTOs/task_data_objects/__init__.py From b90a7bdac8614e1276437ea6a97596bbf012f0fb Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 28 Jan 2025 18:34:24 -0500 Subject: [PATCH 021/244] Change name of url_error_info foreign key constraint --- .../072b32a45b1c_add_task_tables_and_linking_logic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/collector_db/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py b/collector_db/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py index dcae164b..b6670ff1 100644 --- a/collector_db/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py +++ b/collector_db/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py @@ -63,12 +63,12 @@ def upgrade() -> None: op.add_column('url_error_info', sa.Column('task_id', sa.Integer(), nullable=False)) op.create_unique_constraint('uq_url_id_error', 'url_error_info', ['url_id', 'task_id']) - op.create_foreign_key("fk_url_error_info_task", 'url_error_info', 'tasks', ['task_id'], ['id']) + op.create_foreign_key("url_error_info_task_id_fkey", 'url_error_info', 'tasks', ['task_id'], ['id']) def downgrade() -> None: - op.drop_constraint("fk_url_error_info_task", 'url_error_info', type_='foreignkey') + op.drop_constraint("url_error_info_task_id_fkey", 'url_error_info', type_='foreignkey') op.drop_constraint('uq_url_id_error', 'url_error_info', type_='unique') op.drop_column('url_error_info', 'task_id') op.drop_table('link_task_urls') From 2cecaf52a241cc2afad1c0897cd5d85ea83f271e Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 29 Jan 2025 12:15:37 -0500 Subject: [PATCH 022/244] Add logic for automatically assigning values to record types via OpenAI. --- Dockerfile | 3 +- collector_db/DTOs/URLMetadataInfo.py | 1 + ...45b1c_add_task_tables_and_linking_logic.py | 2 + collector_db/models.py | 2 + core/AsyncCore.py | 4 +- core/ScheduledTaskManager.py | 3 +- core/classes/TaskOperatorBase.py | 2 +- core/classes/URLRecordTypeTaskOperator.py | 10 +- llm_api_logic/DeepSeekRecordClassifier.py | 103 ++++-------------- llm_api_logic/LLMRecordClassifierBase.py | 76 +++++++++++++ llm_api_logic/OpenAIRecordClassifier.py | 34 ++++++ llm_api_logic/RecordTypeStructuredOutput.py | 13 +++ llm_api_logic/constants.py | 48 ++++++++ llm_api_logic/helpers.py | 8 ++ local_database/DataDumper/docker-compose.yml | 4 +- local_database/DataDumper/dump.sh | 4 - local_database/DataDumper/restore.sh | 10 +- tests/helpers/DBDataCreator.py | 2 +- .../test_openai_record_classifier.py | 26 +++++ tests/test_alembic/test_revisions.py | 10 ++ .../tasks/test_url_record_type_task.py | 15 ++- 21 files changed, 266 insertions(+), 114 deletions(-) create mode 100644 llm_api_logic/LLMRecordClassifierBase.py create mode 100644 llm_api_logic/OpenAIRecordClassifier.py create mode 100644 llm_api_logic/RecordTypeStructuredOutput.py create mode 100644 llm_api_logic/constants.py create mode 100644 llm_api_logic/helpers.py create mode 100644 tests/manual/llm_api_logic/test_openai_record_classifier.py diff --git a/Dockerfile b/Dockerfile index 86bd21b1..e59b96f2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,6 +29,7 @@ COPY apply_migrations.py ./apply_migrations.py COPY security_manager ./security_manager COPY execute.sh ./execute.sh COPY .project-root ./.project-root +COPY llm_api_logic ./llm_api_logic # Expose the application port EXPOSE 80 @@ -36,4 +37,4 @@ EXPOSE 80 RUN chmod +x execute.sh # Use the below for ease of local development, but remove when pushing to GitHub # Because there is no .env file in the repository (for security reasons) -#COPY .env ./.env +COPY .env ./.env diff --git a/collector_db/DTOs/URLMetadataInfo.py b/collector_db/DTOs/URLMetadataInfo.py index 9cbc7dca..461d16e9 100644 --- a/collector_db/DTOs/URLMetadataInfo.py +++ b/collector_db/DTOs/URLMetadataInfo.py @@ -12,6 +12,7 @@ class URLMetadataInfo(BaseModel): attribute: Optional[URLMetadataAttributeType] = None # TODO: May need to add validation here depending on the type of attribute value: Optional[str] = None + notes: Optional[str] = None validation_status: Optional[ValidationStatus] = None validation_source: Optional[ValidationSource] = None created_at: Optional[datetime] = None diff --git a/collector_db/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py b/collector_db/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py index b6670ff1..b2174484 100644 --- a/collector_db/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py +++ b/collector_db/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py @@ -62,6 +62,7 @@ def upgrade() -> None: op.execute("DELETE FROM url_error_info;") op.add_column('url_error_info', sa.Column('task_id', sa.Integer(), nullable=False)) + op.add_column("url_metadata", sa.Column('notes', sa.Text(), nullable=True)) op.create_unique_constraint('uq_url_id_error', 'url_error_info', ['url_id', 'task_id']) op.create_foreign_key("url_error_info_task_id_fkey", 'url_error_info', 'tasks', ['task_id'], ['id']) @@ -71,6 +72,7 @@ def downgrade() -> None: op.drop_constraint("url_error_info_task_id_fkey", 'url_error_info', type_='foreignkey') op.drop_constraint('uq_url_id_error', 'url_error_info', type_='unique') op.drop_column('url_error_info', 'task_id') + op.drop_column('url_metadata', 'notes') op.drop_table('link_task_urls') op.drop_table('task_errors') op.drop_table('tasks') diff --git a/collector_db/models.py b/collector_db/models.py index f1eac526..aa33d41e 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -114,6 +114,8 @@ class URLMetadata(Base): PGEnum('Machine Learning', 'Label Studio', 'Manual', name='validation_source'), nullable=False ) + notes = Column(Text, nullable=True) + # Timestamps created_at = Column(TIMESTAMP, nullable=False, server_default=func.now()) diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 5318a044..afa5c7ab 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -17,7 +17,7 @@ from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.URLRequestInterface import URLRequestInterface from hugging_face.HuggingFaceInterface import HuggingFaceInterface -from llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier +from llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier class AsyncCore: @@ -57,7 +57,7 @@ async def run_url_record_type_task(self): self.logger.info("Running URL Record Type Task") operator = URLRecordTypeTaskOperator( adb_client=self.adb_client, - classifier=DeepSeekRecordClassifier() + classifier=OpenAIRecordClassifier() ) await operator.run_task() diff --git a/core/ScheduledTaskManager.py b/core/ScheduledTaskManager.py index e061adee..5b2ff0a7 100644 --- a/core/ScheduledTaskManager.py +++ b/core/ScheduledTaskManager.py @@ -56,7 +56,8 @@ def add_scheduled_tasks(self): trigger=IntervalTrigger( hours=1, start_date=datetime.now() + timedelta(minutes=1) - ) + ), + misfire_grace_time=60 ) def shutdown(self): diff --git a/core/classes/TaskOperatorBase.py b/core/classes/TaskOperatorBase.py index 6fd86c97..7998713c 100644 --- a/core/classes/TaskOperatorBase.py +++ b/core/classes/TaskOperatorBase.py @@ -1,5 +1,5 @@ -from abc import ABC, abstractmethod +from abc import ABC, abstractmethod from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.enums import TaskType from core.enums import BatchStatus diff --git a/core/classes/URLRecordTypeTaskOperator.py b/core/classes/URLRecordTypeTaskOperator.py index 18ac8ef4..6287bcae 100644 --- a/core/classes/URLRecordTypeTaskOperator.py +++ b/core/classes/URLRecordTypeTaskOperator.py @@ -5,7 +5,7 @@ from core.DTOs.task_data_objects.URLRecordTypeTDO import URLRecordTypeTDO from core.classes.TaskOperatorBase import TaskOperatorBase from core.enums import RecordType -from llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier +from llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier class URLRecordTypeTaskOperator(TaskOperatorBase): @@ -13,7 +13,7 @@ class URLRecordTypeTaskOperator(TaskOperatorBase): def __init__( self, adb_client: AsyncDatabaseClient, - classifier: DeepSeekRecordClassifier + classifier: OpenAIRecordClassifier ): super().__init__(adb_client) self.classifier = classifier @@ -63,14 +63,14 @@ async def put_results_into_database(self, tdos: list[URLRecordTypeTDO]): url_metadata = URLMetadataInfo( url_id=tdo.url_with_html.url_id, attribute=URLMetadataAttributeType.RECORD_TYPE, - value=str(tdo.record_type), + value=str(tdo.record_type.value), validation_status=ValidationStatus.PENDING_VALIDATION, - validation_source=ValidationSource.MACHINE_LEARNING + validation_source=ValidationSource.MACHINE_LEARNING, + notes=self.classifier.model_name ) url_metadatas.append(url_metadata) await self.adb_client.add_url_metadatas(url_metadatas) - async def separate_success_and_error_subsets(self, tdos: list[URLRecordTypeTDO]): success_subset = [tdo for tdo in tdos if not tdo.is_errored()] error_subset = [tdo for tdo in tdos if tdo.is_errored()] diff --git a/llm_api_logic/DeepSeekRecordClassifier.py b/llm_api_logic/DeepSeekRecordClassifier.py index 5a2067e0..67f6fa09 100644 --- a/llm_api_logic/DeepSeekRecordClassifier.py +++ b/llm_api_logic/DeepSeekRecordClassifier.py @@ -5,94 +5,29 @@ from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo from core.enums import RecordType +from llm_api_logic.LLMRecordClassifierBase import RecordClassifierBase -QUERY_CONTENT = """ - You will be provided with structured data from a web page and determine - the record type. - - The record types are as follows +class DeepSeekRecordClassifier(RecordClassifierBase): - "Accident Reports": Records of vehicle accidents. - "Arrest Records": Records of each arrest made in the agency's jurisdiction. - "Calls for Service": Records of officers initiating activity or responding to requests for police response. Often called "Dispatch Logs" or "Incident Reports" when published. - "Car GPS": Records of police car location. Not generally posted online. - "Citations": Records of low-level criminal offenses where a police officer issued a citation instead of an arrest. - "Dispatch Logs": Records of calls or orders made by police dispatchers. - "Dispatch Recordings": Audio feeds and/or archives of municipal dispatch channels. - "Field Contacts": Reports of contact between police and civilians. May include uses of force, incidents, arrests, or contacts where nothing notable happened. - "Incident Reports": Reports made by police officers after responding to a call which may or may not be criminal in nature. Not generally posted online. - "Misc Police Activity": Records or descriptions of police activity not covered by other record types. - "Officer Involved Shootings": Case files of gun violence where a police officer was involved, typically as the shooter. Detailed, often containing references to records like Media Bulletins and Use of Force Reports. - "Stops": Records of pedestrian or traffic stops made by police. - "Surveys": Information captured from a sample of some population, like incarcerated people or magistrate judges. Often generated independently. - "Use of Force Reports": Records of use of force against civilians by police officers. - "Vehicle Pursuits": Records of cases where police pursued a person fleeing in a vehicle. - "Complaints & Misconduct": Records, statistics, or summaries of complaints and misconduct investigations into law enforcement officers. - "Daily Activity Logs": Officer-created reports or time sheets of what happened on a shift. Not generally posted online. - "Training & Hiring Info": Records and descriptions of additional training for police officers. - "Personnel Records": Records of hiring and firing, certification, discipline, and other officer-specific events. Not generally posted online. - "Annual & Monthly Reports": Often in PDF form, featuring summaries or high-level updates about the police force. Can contain versions of other record types, especially summaries. - "Budgets & Finances": Budgets, finances, grants, or other financial documents. - "Contact Info & Agency Meta": Information about organizational structure, including department structure and contact info. - "Geographic": Maps or geographic data about how land is divided up into municipal sectors, zones, and jurisdictions. - "List of Data Sources": Places on the internet, often data portal homepages, where many links to potential data sources can be found. - "Policies & Contracts": Policies or contracts related to agency procedure. - "Crime Maps & Reports": Records of individual crimes in map or table form for a given jurisdiction. - "Crime Statistics": Summarized information about crime in a given jurisdiction. - "Media Bulletins": Press releases, blotters, or blogs intended to broadly communicate alerts, requests, or other timely information. - "Records Request Info": Portals, forms, policies, or other resources for making public records requests. - "Resources": Agency-provided information or guidance about services, prices, best practices, etc. - "Sex Offender Registry": Index of people registered, usually by law, with the government as sex offenders. - "Wanted Persons": Names, descriptions, images, and associated information about people with outstanding arrest warrants. - "Booking Reports": Records of booking or intake into corrections institutions. - "Court Cases": Records such as dockets about individual court cases. - "Incarceration Records": Records of current inmates, often with full names and features for notification upon inmate release. - "Other": Other record types not otherwise described. - Output the record type in the following format. Do not include any other information: + @property + def api_key(self): + return os.getenv("DEEPSEEK_API_KEY") - { - "record_type": "" - } - """ + @property + def model_name(self): + return "deepseek-chat" -def dictify_html_info(html_infos: list[URLHTMLContentInfo]) -> dict[str, str]: - d = {} - for html_info in html_infos: - d[html_info.content_type.value] = html_info.content - return d + @property + def base_url(self): + return "https://api.deepseek.com" -class DeepSeekRecordClassifier: + @property + def response_format(self): + return { + 'type': 'json_object' + } - def __init__(self): - self.client = AsyncOpenAI( - api_key=os.getenv("DEEPSEEK_API_KEY"), - base_url="https://api.deepseek.com" - ) - - def build_query_messages(self, content_infos: list[URLHTMLContentInfo]) -> list[dict[str, str]]: - insert_content = dictify_html_info(content_infos) - return [ - { - "role": "system", - "content": QUERY_CONTENT - }, - { - "role": "user", - "content": f"```json{insert_content}```" - } - ] - - async def classify_url(self, content_infos: list[URLHTMLContentInfo]) -> RecordType: - response = await self.client.chat.completions.create( - model="deepseek-chat", - messages=self.build_query_messages(content_infos), - stream=False, - response_format={ - 'type': 'json_object' - } - ) - result_str = response.choices[0].message.content - - result_dict = json.loads(result_str) - return result_dict["record_type"] + @property + def completions_func(self) -> callable: + return AsyncOpenAI.chat.completions.create \ No newline at end of file diff --git a/llm_api_logic/LLMRecordClassifierBase.py b/llm_api_logic/LLMRecordClassifierBase.py new file mode 100644 index 00000000..85142aea --- /dev/null +++ b/llm_api_logic/LLMRecordClassifierBase.py @@ -0,0 +1,76 @@ +import json +from abc import ABC, abstractmethod +from typing import Any + +from openai import AsyncOpenAI + +from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from llm_api_logic.RecordTypeStructuredOutput import RecordTypeStructuredOutput +from llm_api_logic.constants import RECORD_CLASSIFICATION_QUERY_CONTENT +from llm_api_logic.helpers import dictify_html_info + + +class RecordClassifierBase(ABC): + + def __init__(self): + self.client = AsyncOpenAI( + api_key=self.api_key, + base_url=self.base_url + ) + + @property + @abstractmethod + def api_key(self) -> str: + pass + + @property + @abstractmethod + def model_name(self) -> str: + pass + + @property + @abstractmethod + def base_url(self) -> str: + pass + + @property + @abstractmethod + def response_format(self) -> dict | RecordTypeStructuredOutput: + pass + + @property + @abstractmethod + def completions_func(self) -> callable: + pass + + def build_query_messages(self, content_infos: list[URLHTMLContentInfo]) -> list[dict[str, str]]: + insert_content = dictify_html_info(content_infos) + return [ + { + "role": "system", + "content": RECORD_CLASSIFICATION_QUERY_CONTENT + }, + { + "role": "user", + "content": str(insert_content) + } + ] + + @abstractmethod + def post_process_response(self, response: Any) -> str: + pass + + async def classify_url(self, content_infos: list[URLHTMLContentInfo]) -> str: + func = self.completions_func + response = await func( + model=self.model_name, + messages=self.build_query_messages(content_infos), + #stream=False, # Note that this is set for DeepSeek, but may not be needed for it + response_format=self.response_format + ) + return self.post_process_response(response) + + result_str = response.choices[0].message.content + + result_dict = json.loads(result_str) + return result_dict["record_type"] \ No newline at end of file diff --git a/llm_api_logic/OpenAIRecordClassifier.py b/llm_api_logic/OpenAIRecordClassifier.py new file mode 100644 index 00000000..fc20a0e2 --- /dev/null +++ b/llm_api_logic/OpenAIRecordClassifier.py @@ -0,0 +1,34 @@ +from typing import Any + +from openai.types.chat import ParsedChatCompletion + +from llm_api_logic.LLMRecordClassifierBase import RecordClassifierBase +from llm_api_logic.RecordTypeStructuredOutput import RecordTypeStructuredOutput +from util.helper_functions import get_from_env + + +class OpenAIRecordClassifier(RecordClassifierBase): + + @property + def api_key(self): + return get_from_env("OPENAI_API_KEY") + + @property + def model_name(self): + return "gpt-4o-mini-2024-07-18" + + @property + def base_url(self): + return None + + @property + def response_format(self): + return RecordTypeStructuredOutput + + @property + def completions_func(self) -> callable: + return self.client.beta.chat.completions.parse + + def post_process_response(self, response: ParsedChatCompletion) -> str: + output: RecordTypeStructuredOutput = response.choices[0].message.parsed + return output.record_type.value \ No newline at end of file diff --git a/llm_api_logic/RecordTypeStructuredOutput.py b/llm_api_logic/RecordTypeStructuredOutput.py new file mode 100644 index 00000000..a5993ae9 --- /dev/null +++ b/llm_api_logic/RecordTypeStructuredOutput.py @@ -0,0 +1,13 @@ +""" +Used per the guidance given in Open AI's documentation on structured outputs: +https://platform.openai.com/docs/guides/structured-outputs +""" + +from pydantic import BaseModel + +from core.enums import RecordType + + + +class RecordTypeStructuredOutput(BaseModel): + record_type: RecordType \ No newline at end of file diff --git a/llm_api_logic/constants.py b/llm_api_logic/constants.py new file mode 100644 index 00000000..55133abf --- /dev/null +++ b/llm_api_logic/constants.py @@ -0,0 +1,48 @@ +RECORD_CLASSIFICATION_QUERY_CONTENT = """ + You will be provided with structured data from a web page and determine + the record type. + + The record types are as follows + + "Accident Reports": Records of vehicle accidents. + "Arrest Records": Records of each arrest made in the agency's jurisdiction. + "Calls for Service": Records of officers initiating activity or responding to requests for police response. Often called "Dispatch Logs" or "Incident Reports" when published. + "Car GPS": Records of police car location. Not generally posted online. + "Citations": Records of low-level criminal offenses where a police officer issued a citation instead of an arrest. + "Dispatch Logs": Records of calls or orders made by police dispatchers. + "Dispatch Recordings": Audio feeds and/or archives of municipal dispatch channels. + "Field Contacts": Reports of contact between police and civilians. May include uses of force, incidents, arrests, or contacts where nothing notable happened. + "Incident Reports": Reports made by police officers after responding to a call which may or may not be criminal in nature. Not generally posted online. + "Misc Police Activity": Records or descriptions of police activity not covered by other record types. + "Officer Involved Shootings": Case files of gun violence where a police officer was involved, typically as the shooter. Detailed, often containing references to records like Media Bulletins and Use of Force Reports. + "Stops": Records of pedestrian or traffic stops made by police. + "Surveys": Information captured from a sample of some population, like incarcerated people or magistrate judges. Often generated independently. + "Use of Force Reports": Records of use of force against civilians by police officers. + "Vehicle Pursuits": Records of cases where police pursued a person fleeing in a vehicle. + "Complaints & Misconduct": Records, statistics, or summaries of complaints and misconduct investigations into law enforcement officers. + "Daily Activity Logs": Officer-created reports or time sheets of what happened on a shift. Not generally posted online. + "Training & Hiring Info": Records and descriptions of additional training for police officers. + "Personnel Records": Records of hiring and firing, certification, discipline, and other officer-specific events. Not generally posted online. + "Annual & Monthly Reports": Often in PDF form, featuring summaries or high-level updates about the police force. Can contain versions of other record types, especially summaries. + "Budgets & Finances": Budgets, finances, grants, or other financial documents. + "Contact Info & Agency Meta": Information about organizational structure, including department structure and contact info. + "Geographic": Maps or geographic data about how land is divided up into municipal sectors, zones, and jurisdictions. + "List of Data Sources": Places on the internet, often data portal homepages, where many links to potential data sources can be found. + "Policies & Contracts": Policies or contracts related to agency procedure. + "Crime Maps & Reports": Records of individual crimes in map or table form for a given jurisdiction. + "Crime Statistics": Summarized information about crime in a given jurisdiction. + "Media Bulletins": Press releases, blotters, or blogs intended to broadly communicate alerts, requests, or other timely information. + "Records Request Info": Portals, forms, policies, or other resources for making public records requests. + "Resources": Agency-provided information or guidance about services, prices, best practices, etc. + "Sex Offender Registry": Index of people registered, usually by law, with the government as sex offenders. + "Wanted Persons": Names, descriptions, images, and associated information about people with outstanding arrest warrants. + "Booking Reports": Records of booking or intake into corrections institutions. + "Court Cases": Records such as dockets about individual court cases. + "Incarceration Records": Records of current inmates, often with full names and features for notification upon inmate release. + "Other": Other record types not otherwise described. + + Output the record type in the following JSON format: + { + "record_type": "" + } + """ diff --git a/llm_api_logic/helpers.py b/llm_api_logic/helpers.py new file mode 100644 index 00000000..3d5bde11 --- /dev/null +++ b/llm_api_logic/helpers.py @@ -0,0 +1,8 @@ +from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo + + +def dictify_html_info(html_infos: list[URLHTMLContentInfo]) -> dict[str, str]: + d = {} + for html_info in html_infos: + d[html_info.content_type.value] = html_info.content + return d diff --git a/local_database/DataDumper/docker-compose.yml b/local_database/DataDumper/docker-compose.yml index 4a28c5e8..f24c78b5 100644 --- a/local_database/DataDumper/docker-compose.yml +++ b/local_database/DataDumper/docker-compose.yml @@ -22,6 +22,6 @@ services: entrypoint: [ "bash", # Comment out one of the following lines depending on your needs - "/usr/local/bin/dump.sh" -# "/usr/local/bin/restore.sh" +# "/usr/local/bin/dump.sh" + "/usr/local/bin/restore.sh" ] \ No newline at end of file diff --git a/local_database/DataDumper/dump.sh b/local_database/DataDumper/dump.sh index 6f1954c4..fd63c65f 100644 --- a/local_database/DataDumper/dump.sh +++ b/local_database/DataDumper/dump.sh @@ -1,6 +1,5 @@ #!/bin/bash set -e - # Variables (customize these or pass them as environment variables) DB_HOST=${DUMP_HOST:-"postgres_container"} DB_USER=${DUMP_USER:-"your_user"} @@ -8,12 +7,9 @@ DB_PORT=${DUMP_PORT:-"5432"} # Default to 5432 if not provided DB_PASSWORD=${DUMP_PASSWORD:-"your_password"} DB_NAME=${DUMP_NAME:-"your_database"} DUMP_FILE=${DUMP_FILE:-"/dump/db_dump.sql"} - # Export password for pg_dump export PGPASSWORD=$DB_PASSWORD - # Dump the database echo "Dumping database $DB_NAME from $DB_HOST:$DB_PORT..." pg_dump -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME --no-owner --no-acl -F c -f $DUMP_FILE - echo "Dump completed. File saved to $DUMP_FILE." \ No newline at end of file diff --git a/local_database/DataDumper/restore.sh b/local_database/DataDumper/restore.sh index d2046fb0..ff62349e 100644 --- a/local_database/DataDumper/restore.sh +++ b/local_database/DataDumper/restore.sh @@ -1,6 +1,5 @@ #!/bin/bash set -e - # Variables (customize these or pass them as environment variables) DB_HOST=${RESTORE_HOST:-"postgres_container"} DB_USER=${RESTORE_USER:-"your_user"} @@ -8,15 +7,11 @@ DB_PORT=${RESTORE_PORT:-"5432"} # Default to 5432 if not provided DB_PASSWORD=${RESTORE_PASSWORD:-"your_password"} NEW_DB_NAME=${RESTORE_DB_NAME:-"new_database"} # Name of the database to restore into DUMP_FILE=${DUMP_FILE:-"/dump/db_dump.sql"} - MAINTENANCE_DB="postgres" - # Export password for pg_restore export PGPASSWORD=$DB_PASSWORD - CONNECTION_STRING="postgresql://$DB_USER:$DB_PASSWORD@$DB_HOST:$DB_PORT/$NEW_DB_NAME" MAINT_CONNECTION_STRING="postgresql://$DB_USER:$DB_PASSWORD@$DB_HOST:$DB_PORT/$MAINTENANCE_DB" - echo "Checking if database $NEW_DB_NAME exists on $DB_HOST:$DB_PORT..." psql -d $MAINT_CONNECTION_STRING -tc "SELECT 1 FROM pg_database WHERE datname = '$NEW_DB_NAME';" | grep -q 1 && { echo "Database $NEW_DB_NAME exists. Dropping it..." @@ -25,16 +20,13 @@ psql -d $MAINT_CONNECTION_STRING -tc "SELECT 1 FROM pg_database WHERE datname = # Drop the database psql -d $MAINT_CONNECTION_STRING -c "DROP DATABASE $NEW_DB_NAME;" } - # Create the new database echo "Creating new database $NEW_DB_NAME on $DB_HOST:$DB_PORT..." psql -d $MAINT_CONNECTION_STRING -c "CREATE DATABASE $NEW_DB_NAME;" || { echo "Failed to create database $NEW_DB_NAME. It might already exist." exit 1 } - # Restore the dump into the new database echo "Restoring dump from $DUMP_FILE into database $NEW_DB_NAME..." pg_restore -d $CONNECTION_STRING --no-owner --no-acl -F c $DUMP_FILE - -echo "Database restoration completed." +echo "Database restoration completed." \ No newline at end of file diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index c9c26846..0041fad5 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -21,7 +21,7 @@ class DBDataCreator: """ def __init__(self, db_client: DatabaseClient = DatabaseClient()): self.db_client = db_client - self.adb_client = AsyncDatabaseClient() + self.adb_client: AsyncDatabaseClient = AsyncDatabaseClient() def batch(self): return self.db_client.insert_batch( diff --git a/tests/manual/llm_api_logic/test_openai_record_classifier.py b/tests/manual/llm_api_logic/test_openai_record_classifier.py new file mode 100644 index 00000000..72d474d2 --- /dev/null +++ b/tests/manual/llm_api_logic/test_openai_record_classifier.py @@ -0,0 +1,26 @@ +import pytest + +from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier + + +@pytest.mark.asyncio +async def test_openai_record_classifier(): + from collector_db.DTOs.URLHTMLContentInfo import HTMLContentType as hct + + d = { + hct.TITLE: "Oath of Office for Newly Promoted Corporal Lumpkin with Acworth Police – City of Acworth, GA", + hct.DESCRIPTION: "At the Thursday, November 2 regular city council meeting, Chief Evans administered the oath of office and swearing in of Corporal Cody Lumpkin. Corporal Lumpkin was surrounded by his family and members of the Acworth Police Department for the occasion. Corporal Lumpkin began employment with the Acworth Police Department on June 8,", + hct.H3: ["Oath of Office for Newly Promoted Corporal Lumpkin with Acworth Police"], + hct.H4: ["Share this on Social Media"], + hct.DIV: "PHONE DIRECTORY RESOURCES Search for: Search Button NEWS DEPARTMENTS GOVERNANCE & DEVELOPMENT Administration Development Clerks Office Court Services DDA, Tourism, and Historic Preservation OPERATIONS Parks, Recreation, and Community Resources Power, Public Works, and Stormwater SUPPORT SERVICES Customer Service Human Resources Finance Information Technology PUBLIC SAFETY Acworth Police RESIDENTS Public Art Master Plan Application for Boards & Commissions Board of Aldermen Customer Service Parks, Recreation, and Community Resources Historic Acworth Master Fee Schedule E-News Sign Up Online Payments BUSINESS Bids & Projects E-Verify Permits, Applications, & Ordinances City Code of Ordinances Master Fee Schedule Start a Business EVENTS VISIT ACWORTH NEWS DEPARTMENTS GOVERNANCE & DEVELOPMENT Administration Development Clerks Office Court Services DDA, Tourism, and Historic Preservation OPERATIONS Parks, Recreation, and Community Resources Power, Public Works, and Stormwater SUPPORT SERVICES Customer Service Human Resources Finance Information Technology PUBLIC SAFETY Acworth Police RESIDENTS Public Art Master Plan Application for Boards & Commissions Board of Aldermen Customer Service Parks, Recreation, and Community Resources Historic Acworth Master Fee Schedule E-News Sign Up Online Payments BUSINESS Bids & Projects E-Verify Permits, Applications, & Ordinances City Code of Ordinances Master Fee Schedule Start a Business EVENTS VISIT ACWORTH Oath of Office for Newly Promoted Corporal Lumpkin with Acworth Police Published On: November 3, 2023 At the Thursday, November 2 regular city council meeting, Chief Evans administered the oath of office and swearing in of Corporal Cody Lumpkin.  Corporal Lumpkin was surrounded by his family and members of the Acworth Police Department for the occasion.  Corporal Lumpkin began employment with the Acworth Police Department on June 8 , 2015, and has served as a patrol officer in addition to time spent time in Special Operations prior to his recent promotion. Share this on Social Media 4415 Center Street, Acworth GA 30101 Phone Directory Contact Us © 2025 City of Acworth Acworth is located in the foothills of the North Georgia mountains and is nestled along the banks of Lake Acworth and Lake Allatoona, hence its nickname “The Lake City.” The city boasts a rich history, a charming downtown, abundant outdoor recreational activities, a vibrant restaurant scene, and an active festival and events calendar. Acworth is one of the best, family-friendly destinations in the Atlanta region. Come discover why You’re Welcome in Acworth! ESS | Webmail | Handbook | Peak | Laserfiche | Login ", + } + content_infos = [] + for content_type, value in d.items(): + content_info = URLHTMLContentInfo(content_type=content_type, content=value) + content_infos.append(content_info) + + classifier = OpenAIRecordClassifier() + result = await classifier.classify_url(content_infos) + print(type(result)) + print(result) \ No newline at end of file diff --git a/tests/test_alembic/test_revisions.py b/tests/test_alembic/test_revisions.py index 67869ab6..1a5516c0 100644 --- a/tests/test_alembic/test_revisions.py +++ b/tests/test_alembic/test_revisions.py @@ -311,6 +311,11 @@ def test_add_task_tables_and_linking_logic(alembic_runner): table_name="url_error_info", columns_to_check=["task_id"], ) + assert not columns_in_table( + alembic_runner, + table_name="url_metadata", + columns_to_check=["notes"], + ) table_creation_check( alembic_runner, tables=[ @@ -324,4 +329,9 @@ def test_add_task_tables_and_linking_logic(alembic_runner): alembic_runner, table_name="url_error_info", columns_to_check=["task_id"], + ) + assert columns_in_table( + alembic_runner, + table_name="url_metadata", + columns_to_check=["notes"], ) \ No newline at end of file diff --git a/tests/test_automated/integration/tasks/test_url_record_type_task.py b/tests/test_automated/integration/tasks/test_url_record_type_task.py index 349a4e23..a3b336cd 100644 --- a/tests/test_automated/integration/tasks/test_url_record_type_task.py +++ b/tests/test_automated/integration/tasks/test_url_record_type_task.py @@ -3,23 +3,24 @@ import pytest from collector_db.enums import TaskType +from collector_db.models import URLMetadata from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator from core.enums import RecordType, BatchStatus +from helpers.DBDataCreator import DBDataCreator from helpers.assert_functions import assert_database_has_no_tasks from llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier - @pytest.mark.asyncio -async def test_url_record_type_task(db_data_creator): +async def test_url_record_type_task(db_data_creator: DBDataCreator): mock_classifier = MagicMock(spec=DeepSeekRecordClassifier) mock_classifier.classify_url.side_effect = [RecordType.ACCIDENT_REPORTS, "Error"] + mock_classifier.model_name = "test_notes" operator = URLRecordTypeTaskOperator( adb_client=db_data_creator.adb_client, classifier=mock_classifier ) - await operator.run_task() # No task should have been created due to not meeting prerequisites @@ -32,7 +33,6 @@ async def test_url_record_type_task(db_data_creator): await operator.run_task() - # Task should have been created task_info = await db_data_creator.adb_client.get_task_info(task_id=operator.task_id) assert task_info.error_info is None @@ -45,3 +45,10 @@ async def test_url_record_type_task(db_data_creator): assert task.type == TaskType.RECORD_TYPE assert task.url_count == 2 assert task.url_error_count == 1 + + # Get metadata + metadata_results = await db_data_creator.adb_client.get_all(URLMetadata) + for metadata_row in metadata_results: + assert metadata_row.notes == "test_notes" + assert metadata_row.value == RecordType.ACCIDENT_REPORTS.value + From e139656865c2c9fe9a10f66aaff4863d2c504e49 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 29 Jan 2025 12:21:04 -0500 Subject: [PATCH 023/244] Add tests to Dockerfile --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index e59b96f2..0f241e7c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,6 +29,7 @@ COPY apply_migrations.py ./apply_migrations.py COPY security_manager ./security_manager COPY execute.sh ./execute.sh COPY .project-root ./.project-root +COPY tests ./tests COPY llm_api_logic ./llm_api_logic # Expose the application port From c3b8752e0a74d6d0d6d44abbf34d781ae08f61d2 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 29 Jan 2025 12:25:07 -0500 Subject: [PATCH 024/244] Fix error in import routing --- .../integration/tasks/test_url_record_type_task.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_automated/integration/tasks/test_url_record_type_task.py b/tests/test_automated/integration/tasks/test_url_record_type_task.py index a3b336cd..ee624dae 100644 --- a/tests/test_automated/integration/tasks/test_url_record_type_task.py +++ b/tests/test_automated/integration/tasks/test_url_record_type_task.py @@ -6,8 +6,8 @@ from collector_db.models import URLMetadata from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator from core.enums import RecordType, BatchStatus -from helpers.DBDataCreator import DBDataCreator -from helpers.assert_functions import assert_database_has_no_tasks +from tests.helpers.DBDataCreator import DBDataCreator +from tests.helpers.assert_functions import assert_database_has_no_tasks from llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier @pytest.mark.asyncio From 42af80a4f70787045815f1925036e8a35ff3706e Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 29 Jan 2025 12:28:12 -0500 Subject: [PATCH 025/244] Fix error in import routing --- .../integration/tasks/test_url_relevancy_huggingface_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py b/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py index 1cab4ee5..abf86cda 100644 --- a/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py +++ b/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py @@ -7,7 +7,7 @@ from collector_db.enums import ValidationStatus, ValidationSource from collector_db.models import URLMetadata, Task from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator -from helpers.assert_functions import assert_database_has_no_tasks +from tests.helpers.assert_functions import assert_database_has_no_tasks from hugging_face.HuggingFaceInterface import HuggingFaceInterface From 49bb5a6d04526e4e9416e284c846ee0910b6228c Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 29 Jan 2025 12:33:20 -0500 Subject: [PATCH 026/244] Fix error in import routing --- tests/test_automated/integration/tasks/test_url_html_task.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/test_automated/integration/tasks/test_url_html_task.py b/tests/test_automated/integration/tasks/test_url_html_task.py index ff608b66..7674113f 100644 --- a/tests/test_automated/integration/tasks/test_url_html_task.py +++ b/tests/test_automated/integration/tasks/test_url_html_task.py @@ -5,11 +5,10 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.enums import TaskType -from collector_db.models import Task from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator from core.enums import BatchStatus -from helpers.DBDataCreator import DBDataCreator -from helpers.assert_functions import assert_database_has_no_tasks +from tests.helpers.DBDataCreator import DBDataCreator +from tests.helpers.assert_functions import assert_database_has_no_tasks from html_tag_collector.DataClassTags import ResponseHTMLInfo from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.RootURLCache import RootURLCache From 3e6c0b451f07145d275eb8a18a8cd9287e06b85e Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 29 Jan 2025 12:39:02 -0500 Subject: [PATCH 027/244] Fix error in import routing --- tests/test_automated/integration/api/test_task.py | 2 +- tests/test_automated/integration/tasks/test_example_task.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_automated/integration/api/test_task.py b/tests/test_automated/integration/api/test_task.py index 64fbe75d..d6e13b1f 100644 --- a/tests/test_automated/integration/api/test_task.py +++ b/tests/test_automated/integration/api/test_task.py @@ -1,7 +1,7 @@ import pytest from collector_db.enums import TaskType -from test_automated.integration.api.conftest import APITestHelper +from tests.test_automated.integration.api.conftest import APITestHelper async def task_setup(ath: APITestHelper) -> int: diff --git a/tests/test_automated/integration/tasks/test_example_task.py b/tests/test_automated/integration/tasks/test_example_task.py index 6e69bc89..f6f56521 100644 --- a/tests/test_automated/integration/tasks/test_example_task.py +++ b/tests/test_automated/integration/tasks/test_example_task.py @@ -5,7 +5,7 @@ from collector_db.enums import TaskType from core.classes.TaskOperatorBase import TaskOperatorBase from core.enums import BatchStatus -from helpers.DBDataCreator import DBDataCreator +from tests.helpers.DBDataCreator import DBDataCreator class ExampleTaskOperator(TaskOperatorBase): From 13eae1b396f49a13af9335fcf4c1a23d5799106f Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 29 Jan 2025 12:46:54 -0500 Subject: [PATCH 028/244] Fix error in import routing --- tests/test_alembic/test_revisions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_alembic/test_revisions.py b/tests/test_alembic/test_revisions.py index 1a5516c0..22a83496 100644 --- a/tests/test_alembic/test_revisions.py +++ b/tests/test_alembic/test_revisions.py @@ -15,7 +15,7 @@ from sqlalchemy import text -from test_alembic.helpers import columns_in_table +from tests.test_alembic.helpers import columns_in_table from tests.test_alembic.helpers import get_enum_values, table_creation_check From b64838279fc4365ae36d5ea4ed0075e2fe89c2fe Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 29 Jan 2025 12:55:57 -0500 Subject: [PATCH 029/244] Comment out `.env` copy command --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 0f241e7c..0410d458 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,4 +38,4 @@ EXPOSE 80 RUN chmod +x execute.sh # Use the below for ease of local development, but remove when pushing to GitHub # Because there is no .env file in the repository (for security reasons) -COPY .env ./.env +#COPY .env ./.env From 776671e7d97833785bb54c0c6cfccdf9873f696b Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 29 Jan 2025 13:17:45 -0500 Subject: [PATCH 030/244] Convert dockerfile to slim package --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 0410d458..e820fa66 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # Dockerfile for Source Collector FastAPI app -FROM python:3.12.8 +FROM python:3.12.8-slim # Set working directory WORKDIR /app From c2601a32f06b5771977635b8e2534e93fc38b7ef Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 30 Jan 2025 09:24:55 -0500 Subject: [PATCH 031/244] Remove unused files --- annotation_pipeline/README.md | 43 --- annotation_pipeline/config.ini | 19 -- annotation_pipeline/data/batch_info.csv | 4 - annotation_pipeline/data/cache.json | 15 - .../urls_2024-08-16_15-18-09.csv | 3 - .../urls_2024-08-20_14-07-03.csv | 23 -- annotation_pipeline/populate_labelstudio.py | 256 ------------------ annotation_pipeline/record_types.txt | 36 --- annotation_pipeline/requirements.txt | 13 - .../muckrock/muckrock_ml_labeler.py | 80 ------ .../manual/label_studio_interface/__init__.py | 0 ...test_label_studio_interface_integration.py | 73 ----- 12 files changed, 565 deletions(-) delete mode 100644 annotation_pipeline/README.md delete mode 100644 annotation_pipeline/config.ini delete mode 100644 annotation_pipeline/data/batch_info.csv delete mode 100644 annotation_pipeline/data/cache.json delete mode 100644 annotation_pipeline/data/tag_collector/urls_2024-08-16_15-18-09.csv delete mode 100644 annotation_pipeline/data/tag_collector/urls_2024-08-20_14-07-03.csv delete mode 100644 annotation_pipeline/populate_labelstudio.py delete mode 100644 annotation_pipeline/record_types.txt delete mode 100644 annotation_pipeline/requirements.txt delete mode 100644 source_collectors/muckrock/muckrock_ml_labeler.py delete mode 100644 tests/manual/label_studio_interface/__init__.py delete mode 100644 tests/manual/label_studio_interface/test_label_studio_interface_integration.py diff --git a/annotation_pipeline/README.md b/annotation_pipeline/README.md deleted file mode 100644 index a6d7a1e4..00000000 --- a/annotation_pipeline/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# Annotation Pipeline - -This Python script automates the process of crawling for relevant URLs, scraping HTML content from those pages, formatting the data as Label Studio tasks, and uploading them to Label Studio for annotation. - -## Features - -- **Common Crawl Integration**: Initiates the Common Crawl script to crawl for relevant URLs based on specified parameters such as Common Crawl ID, URL type, keyword, and number of pages to process. - -- **HTML Tag Collector**: Collects HTML tags from the crawled URLs using the tag collector script. - -- **Label Studio Tasks**: Formats the collected data into tasks suitable for Label Studio annotation, including pre-annotation support for assumed record types. - -- **Upload to Label Studio**: Uploads the tasks to Label Studio for review and annotation. - -## Setup - -1. Create venv and install Python dependencies (if not done previously) - (assuming these are run within the annotation_pipeline/ folder): - - `python -m venv annotation-pipeline-env` - - `source annotation-pipeline-env` - - `pip install -r requirements.txt` - -2. Setup Environment variables in data_source_identification/.env - - HUGGINGFACE_ACCESS_TOKEN=... - - LABEL_STUDIO_ACCESS_TOKEN=... - - LABEL_STUDIO_PROJECT_ID=... - - LABEL_STUDIO_ORGANIZATION_ID=... - -## Usage - -Run from the parent directory (data-source-identification/) - -The output logs from common crawl will be stored in `annotation_pipeline/data` by default. This can be modified by editing the `annotation_pipeline/config.ini` file. - -`python annotation_pipeline/populate_labelstudio.py common_crawl_id url keyword --pages num_pages [--record-type record_type]` - -- `common_crawl_id`: ID of the Common Crawl Corpus to search -- `url`: Type of URL to search for (e.g. *.gov for all .gov domains). -- `keyword`: Keyword that must be matched in the full URL -- `--pages num_pages`: Number of pages to search -- `--record-type record_type` (optional): Assumed record type for pre-annotation. - -e.g. `python annotation_pipeline/populate_labelstudio.py CC-MAIN-2024-10 '*.gov' arrest --pages 2 --record-type 'Arrest Records'` diff --git a/annotation_pipeline/config.ini b/annotation_pipeline/config.ini deleted file mode 100644 index 6f2deb96..00000000 --- a/annotation_pipeline/config.ini +++ /dev/null @@ -1,19 +0,0 @@ -# This configuration file contains default settings for the Common Crawler application. -# Settings can be modified to suit different environments or testing needs. - -[DEFAULT] -# Filename for the cache. Stores which pages have been crawled -# at which combinations of index, url search term, and keyword -# to avoid re-crawling them. -cache_filename = cache - -# Directory where data files (both cache and output) are stored. -# Change as needed for different environments. -# Path is relative from working directory that executes common_crawler/main.py -data_dir = annotation_pipeline/data - -# Filename for the output CSV containing crawled URLs. -output_filename = urls - -# Name of the huggingface repo -huggingface_repo_id = PDAP/unlabeled-urls diff --git a/annotation_pipeline/data/batch_info.csv b/annotation_pipeline/data/batch_info.csv deleted file mode 100644 index 35b2c19e..00000000 --- a/annotation_pipeline/data/batch_info.csv +++ /dev/null @@ -1,4 +0,0 @@ -Datetime,Source,Count,Keywords,Notes,Filename -2024-08-12 16:31:20.362180,Common Crawl,0,*.com - police,"CC-MAIN-2024-14, 10 pages, starting at 1",urls_2024-08-12_16-31-20 -2024-08-16 15:18:09.405734,Common Crawl,2,*.com - police,"CC-MAIN-2024-30, 2 pages, starting at 1",urls_2024-08-16_15-18-09 -2024-08-20 14:07:03.339044,Common Crawl,22,*.gov - police,"CC-MAIN-2024-30, 2 pages, starting at 1",urls_2024-08-20_14-07-03 diff --git a/annotation_pipeline/data/cache.json b/annotation_pipeline/data/cache.json deleted file mode 100644 index 066b4285..00000000 --- a/annotation_pipeline/data/cache.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "CC-MAIN-2024-14": { - "*.com": { - "police": 1 - } - }, - "CC-MAIN-2024-30": { - "*.com": { - "police": 2 - }, - "*.gov": { - "police": 2 - } - } -} \ No newline at end of file diff --git a/annotation_pipeline/data/tag_collector/urls_2024-08-16_15-18-09.csv b/annotation_pipeline/data/tag_collector/urls_2024-08-16_15-18-09.csv deleted file mode 100644 index b7b488cd..00000000 --- a/annotation_pipeline/data/tag_collector/urls_2024-08-16_15-18-09.csv +++ /dev/null @@ -1,3 +0,0 @@ -url,url_path,html_title,meta_description,root_page_title,http_response,h1,h2,h3,h4,h5,h6,div_text,batch_id -https://001-adult-toys-n-sex-dolls.com/video/3879/stoya-gets-investigated-by-the-police/,video/3879/stoya-gets-investigated-by-the-police,Stoya gets investigated by the police | One truly amazing adult page with everything included,"Stoya tweeted her accusations, and neither porn star James.",Sex dolls porn clips | One truly amazing adult page with everything included,200,"[""Stoya gets investigated by the police""]","[""Related Videos""]",[],[],[],[],Sex dolls Home Models Categories Sex dolls Home Models Categories Home Models Categories ,2024-08-16 15:18:09 -https://001-adult-toys-n-sex-dolls.com/video/39592/policeman-helps-out-jasmine-jae-glaze-up-her-filth/,video/39592/policeman-helps-out-jasmine-jae-glaze-up-her-filth,Policeman helps out Jasmine Jae glaze up her filth | One truly amazing adult page with everything included,Please rest assured that we are working hard to reach out to.,Sex dolls porn clips | One truly amazing adult page with everything included,200,"[""Policeman helps out Jasmine Jae glaze up her filth""]","[""Related Videos""]",[],[],[],[],Sex dolls Home Models Categories Sex dolls Home Models Categories Home Models Categories ,2024-08-16 15:18:09 diff --git a/annotation_pipeline/data/tag_collector/urls_2024-08-20_14-07-03.csv b/annotation_pipeline/data/tag_collector/urls_2024-08-20_14-07-03.csv deleted file mode 100644 index 66108893..00000000 --- a/annotation_pipeline/data/tag_collector/urls_2024-08-20_14-07-03.csv +++ /dev/null @@ -1,23 +0,0 @@ -url,url_path,html_title,meta_description,root_page_title,http_response,h1,h2,h3,h4,h5,h6,div_text,batch_id -https://origin-www.acquisition.gov/dfars/252.225-7029-acquisition-uniform-components-afghan-military-or-afghan-national-police.,dfars/252.225-7029-acquisition-uniform-components-afghan-military-or-afghan-national-police.,252.225-7029 Acquisition of Uniform Components for Afghan Military or Afghan National Police. | Acquisition.GOV,,Home | Acquisition.GOV,200,"[""DFARS"", ""252.225-7029 Acquisition of Uniform Components for Afghan Military or Afghan National Police.""]","[""Main navigation"", ""Breadcrumb"", ""DFARS Parts"", ""Regulations DFARS Menu"", ""DFARS Appendix"", ""Regulations DFARS Appendix Menu"", ""Upper Footer Menu""]","[""FAR""]","[""Favorite"", ""X""]",[],[],,2024-08-20 14:07:03 -https://acworth-ga.gov/events/category/police-event/,events/category/police-event,"Events from November 16 – November 16 › police-event › – City of Acworth, GA",,"Home - City of Acworth, GA",200,"[""police-event""]","[""Events Search and Views Navigation"", ""November 2024""]","[""Event Views Navigation""]",[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset ,2024-08-20 14:07:03 -https://acworth-ga.gov/events/tag/police-department/,events/tag/police-department,"Events from November 16 – November 16 – City of Acworth, GA",,"Home - City of Acworth, GA",200,"[""police-department""]","[""Events Search and Views Navigation"", ""November 2024""]","[""Event Views Navigation""]",[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset ,2024-08-20 14:07:03 -https://acworth-ga.gov/faq-items/i-got-a-ticket-from-an-acworth-police-officer-what-do-i-do/,faq-items/i-got-a-ticket-from-an-acworth-police-officer-what-do-i-do,"I got a ticket from an Acworth Police officer. What do I do? - City of Acworth, GA",There is a court date listed on the citation. This is an arraignment date. You will be asked to enter a plea at this time. Please be on time for your appointed court date as the judge will give you a lot of valuable information at the opening of the court session.,"Home - City of Acworth, GA",200,"[""I got a ticket from an Acworth Police officer. What do I do?""]",[],[],"[""Please Feel Free to Share This Story:""]",[],[],"Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Previous Next I got a ticket from an Acworth Police officer. What do I do? There is a court date listed on the citation. This is an arraignment date. You will be asked to enter a plea at this time. Please be on time for your appointed court date as the judge will give you a lot of valuable information at the opening of the court session. Mike Brooks 2024-07-29T13:52:05-04:00 September 15, 2023 | Please Feel Free to Share This Story: Facebook X LinkedIn Pinterest Email 4415 Center Street, Acworth GA 30101 Phone Directory Contact Us © 2023 City of Acworth Acworth is located in the foothills of the North Georgia mountains and is nestled along the banks of Lake Acworth and Lake Allatoona, hence its nickname “The Lake City.” The city boasts a rich history, a charming downtown, abundant outdoor recreational activities, a vibrant restaurant scene, and an active festival and events calendar. Acworth is one of the best, family-friendly destinations in the Atlanta region. Come discover why You’re Welcome in Acworth! ESS | Webmail | Handbook | Laserfiche | Login Previous Next I got a ticket from an Acworth Police officer. What do I do? There is a court date listed on the citation. This is an arraignment date. You will be asked to enter a plea at this time. Please be on time for your appointed court date as the judge will give you a lot of valuable information at the opening of the court session. Mike Brooks 2024-07-29T13:52:05-04:00 September 15, 2023 | Please Feel Free to Share This Story: Facebook X LinkedIn Pinterest Email 4415 Center Street, Acworth GA 30101 Phone Directory Contact Us © 2023 City of Acworth Acworth is located in the foothills of the North Georgia mountains and is nestled along the banks of Lake Acworth and Lake Allatoona, hence its nickname “The Lake City.” The city boasts a rich history, a charming downtown, abundant outdoor recreational activities, a vibrant restaurant scene, and an active festival and events calendar. Acworth is one of the best, family-friendly destinations in the Atlanta region. Come discover why You’re Welcome in Acworth! ESS | Webmail | Handbook | Laserfiche | Login ",2024-08-20 14:07:03 -https://acworth-ga.gov/presentation-introducing-three-new-civilian-members-of-the-acworth-police-department/,presentation-introducing-three-new-civilian-members-of-the-acworth-police-department,"Presentation Introducing Three New Civilian Members of the Acworth Police Department - City of Acworth, GA","At the Thursday, May 18 regular city council meeting, Chief Evans introduced three new civilian members of the Acworth Police Department. Macey Williams serves as Crime Analyst, Madison Harrison serves as Evidence Tech, and Emily Hall serves as Victim Advocate. These employees play an integral role in assisting officers with solving cases, and Chief Evans","Home - City of Acworth, GA",200,[],[],"[""Presentation Introducing Three New Civilian Members of the Acworth Police Department""]","[""Share this on Social Media""]",[],[],"Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset PHONE DIRECTORY RESOURCES Search for: Search Button PHONE DIRECTORY RESOURCES Search for: Search Button NEWS DEPARTMENTS GOVERNANCE & DEVELOPMENT Development Clerks Office Court Services DDA, Tourism, and Historic Preservation OPERATIONS Parks, Recreation, and Community Resources Power, Public Works, and Stormwater SUPPORT SERVICES Administration Customer Service Human Resources Finance Information Technology PUBLIC SAFETY Acworth Police RESIDENTS Public Art Master Plan Application for Boards & Commissions Board of Aldermen Customer Service Parks, Recreation, and Community Resources Historic Acworth Master Fee Schedule E-News Sign Up Online Payments BUSINESS Bids & Projects E-Verify Permits, Applications, & Ordinances City Code of Ordinances Master Fee Schedule Start a Business EVENTS VISIT ACWORTH NEWS DEPARTMENTS GOVERNANCE & DEVELOPMENT Development Clerks Office Court Services DDA, Tourism, and Historic Preservation OPERATIONS Parks, Recreation, and Community Resources Power, Public Works, and Stormwater SUPPORT SERVICES Administration Customer Service Human Resources Finance Information Technology PUBLIC SAFETY Acworth Police RESIDENTS Public Art Master Plan Application for Boards & Commissions Board of Aldermen Customer Service Parks, Recreation, and Community Resources Historic Acworth Master Fee Schedule E-News Sign Up Online Payments BUSINESS Bids & Projects E-Verify Permits, Applications, & Ordinances City Code of Ordinances Master Fee Schedule Start a Business EVENTS VISIT ACWORTH Presentation Introducing Three New Civilian Members of the Acworth Police Department Published On: May 18, 2023 At the Thursday, May 18 regular city council meeting, Chief Evans introduced three new civilian members of the Acworth Police Department. Macey Williams serves as Crime Analyst, Madison Harrison serves as Evidence Tech, and Emily Hall serves as Victim Advocate. These employees play an integral role in assisting officers with solving cases, and Chief Evans was pleased to share with Mayor Allegood and Acworth’s Aldermen how important their new positions are in supporting both the Acworth Police Department and the community as a whole. Share this on Social Media 4415 Center Street, Acworth GA 30101 Phone Directory Contact Us © 2023 City of Acworth Acworth is located in the foothills of the North Georgia mountains and is nestled along the banks of Lake Acworth and Lake Allatoona, hence its nickname “The Lake City.” The city boasts a rich history, a charming downtown, abundant outdoor recreational activities, a vibrant restaurant scene, and an active festival and events calendar. Acworth is one of the best, family-friendly destinations in the Atlanta region. Come discover why You’re Welcome in Acworth! ESS | Webmail | Handbook | Laserfiche | Login ",2024-08-20 14:07:03 -https://acworth-ga.gov/team_member/police-department-records/,team_member/police-department-records,"Police Department Records - City of Acworth, GA",,"Home - City of Acworth, GA",200,"[""Police Department Records""]",[],[],"[""Please Feel Free to Share This Story:""]",[],[],"Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset PHONE DIRECTORY RESOURCES Search for: Search Button PHONE DIRECTORY RESOURCES Search for: Search Button NEWS DEPARTMENTS GOVERNANCE & DEVELOPMENT Development Clerks Office Court Services DDA, Tourism, and Historic Preservation OPERATIONS Parks, Recreation, and Community Resources Power, Public Works, and Stormwater SUPPORT SERVICES Administration Customer Service Human Resources Finance Information Technology PUBLIC SAFETY Acworth Police RESIDENTS Public Art Master Plan Application for Boards & Commissions Board of Aldermen Customer Service Parks, Recreation, and Community Resources Historic Acworth Master Fee Schedule E-News Sign Up Online Payments BUSINESS Bids & Projects E-Verify Permits, Applications, & Ordinances City Code of Ordinances Master Fee Schedule Start a Business EVENTS VISIT ACWORTH NEWS DEPARTMENTS GOVERNANCE & DEVELOPMENT Development Clerks Office Court Services DDA, Tourism, and Historic Preservation OPERATIONS Parks, Recreation, and Community Resources Power, Public Works, and Stormwater SUPPORT SERVICES Administration Customer Service Human Resources Finance Information Technology PUBLIC SAFETY Acworth Police RESIDENTS Public Art Master Plan Application for Boards & Commissions Board of Aldermen Customer Service Parks, Recreation, and Community Resources Historic Acworth Master Fee Schedule E-News Sign Up Online Payments BUSINESS Bids & Projects E-Verify Permits, Applications, & Ordinances City Code of Ordinances Master Fee Schedule Start a Business EVENTS VISIT ACWORTH Previous Next Police Department Records Mike Brooks 2023-12-18T10:02:20-05:00 December 18, 2023 | Please Feel Free to Share This Story: Facebook X LinkedIn Pinterest Email 4415 Center Street, Acworth GA 30101 Phone Directory Contact Us © 2023 City of Acworth Acworth is located in the foothills of the North Georgia mountains and is nestled along the banks of Lake Acworth and Lake Allatoona, hence its nickname “The Lake City.” The city boasts a rich history, a charming downtown, abundant outdoor recreational activities, a vibrant restaurant scene, and an active festival and events calendar. Acworth is one of the best, family-friendly destinations in the Atlanta region. Come discover why You’re Welcome in Acworth! ESS | Webmail | Handbook | Laserfiche | Login ",2024-08-20 14:07:03 -https://www.ada.gov/_pages/redirects/illinois_state_police/,_pages/redirects/illinois_state_police,SETTLEMENT AGREEMENT BETWEEN THE UNITED STATES AND ILLINOIS STATE POLICE,"The ADA Home Page provides access to Americans with Disabilities Act (ADA) regulations for businesses and State and local governments, technical assistance materials, ADA Standards for Accessible Design, links to Federal agencies with ADA responsibilities and information, updates on new ADA requirements, streaming video, information about Department of Justice ADA settlement agreements, consent decrees, and enforcement activities and access to Freedom of Information Act (FOIA) ADA material",The Americans with Disabilities Act | ADA.gov,200,"[""SETTLEMENT AGREEMENT BETWEEN THE UNITED STATES \n OF AMERICA AND AND ILLINOIS STATE POLICE""]","[""I. BACKGROUND"", ""II. GENERAL AGREEMENT"", ""III. SPECIFIC REMEDIAL RELIEF"", ""IV. IMPLEMENTATION AND ENFORCEMENT""]",[],[],[],[],,2024-08-20 14:07:03 -https://www.ada.gov/policeinfo.htm,policeinfo.htm,American's with Disabilities Act: Information for Law Enforcement,"The ADA Home Page provides access to Americans with Disabilities Act (ADA) regulations for businesses and State and local governments, technical assistance materials, ADA Standards for Accessible Design, links to Federal agencies with ADA responsibilities and information, updates on new ADA requirements, streaming video, information about Department of Justice ADA settlement agreements, consent decrees, and enforcement activities and access to Freedom of Information Act (FOIA) ADA material",The Americans with Disabilities Act | ADA.gov,200,"[""Americans with Disabilites Act Information for Law Enforcement""]","[""PUBLICATIONS""]",[],[],[],[],"Americans with Disabilites Act Information for Law Enforcement How do you interview a witness who is deaf?  How do you assist a person who is having a seizure?  How do you transport a suspect who uses a wheelchair?  Under the Americans with Disabilities Act (ADA), people who have disabilities are entitled to the same services law enforcement provides to anyone else. They may not be excluded or segregated from services, be denied services, or otherwise be treated differently than other people.  The following compliance assistance materials will help state and local law enforcement officers understand how to interact with victims, witnesses, suspects, and others who have disabilities. PUBLICATIONS Communicating with People Who Are Deaf or Hard of Hearing:  ADA Guide for Law Enforcement Officers - This 8-panel pocket guide provides basic information for officers about communicating effectively with people who are deaf or hard of hearing. Guide for Officers Model Policy for Law Enforcement on Communicating with People Who Are Deaf or Hard of Hearing - This 4-page document serves as a model for law enforcement agencies when adopting a policy on effective communication with people who are deaf or hard of hearing.  Agencies are encouraged to download and adapt the policy to suit their needs. Model Policy (PDF) | Model Policy (HTML) Commonly Asked Questions about the Americans with Disabilities Act and Law Enforcement - This 12-page fact sheet answers frequent questions about the ADA and its effect on law enforcement services involving people with disabilities. Commonly Asked Questions (PDF) | Commonly Asked Questions (HTML) Questions and Answers: The Americans with Disabilities Act and Hiring Police Officers - This 5-page fact sheet answers frequent questions about the ADA and its impact on law enforcement officers with disabilities. Questions and Answers (PDF) | Questions and Answers (HTML) Additional ADA information for state and local government agencies including law enforcement ADA Regulations | Other Publications December 1, 2008 ",2024-08-20 14:07:03 -https://www.ada.gov/policevideo/policedialupgallery.htm,policevideo/policedialupgallery.htm,,,The Americans with Disabilities Act | ADA.gov,404,,,,,,,,2024-08-20 14:07:03 -https://www.adamscountypa.gov/departments/victimwitness/police-departments,departments/victimwitness/police-departments,Adams County PA - Police Departments,,Adams County PA - Official Website,200,"[""Police Departments"", ""Police Departments""]",[],[],[],[],[],[Skip to Content] ,2024-08-20 14:07:03 -https://www.adamscountypa.gov/police-14c9658f036316bb91289647492de2ae/narema/contact-us,police-14c9658f036316bb91289647492de2ae/narema/contact-us,Adams County PA - Contact Us,,Adams County PA - Official Website,200,"[""Contact Us"", ""Contact Us""]","[""Emergency Dial 9-1-1  -   Non-Emergency 717-334-8603""]",[],[],[],[],[Skip to Content] ,2024-08-20 14:07:03 -https://www.adamscountypa.gov/police/earpd/calendar/police-department-commission-meeting,police/earpd/calendar/police-department-commission-meeting,Adams County PA - Police Department Commission Meeting,,Adams County PA - Official Website,200,"[""Police Department Commission Meeting""]",[],[],[],[],[],"[Skip to Content] Search ✖ Home Services Locations Powered by Translate Log in Register ✖ Commissioners Board of Commissioners Commissioners Office Elections and Voters Registration Human Resources Solicitor Tax Services Veterans Affairs County Services Board of Commissioners Meetings County Budget Employment Opportunites Open Records Right to Know Parcel Locator - Interactive Mapping Pay Delinquent Taxes Register to Vote Veterans Services Controller's Fraud Hotline About Adams County Adams County Broadband Taskforce Adams County Profile Adams County School Districts Adams County Plans, Studies, and Publications Adams County Tax Collectors Adams Economic Alliance Land Conservancy of Adams County Penn State Extension Office of Adams County Courts 51st Judicial District Court Court of Common Pleas Court Administration Magisterial District Judges Magisterial District Judges Home District Court 51-3-01 District Court 51-3-02 District Court 51-3-03 District Court 51-3-04 Court Departments Criminal Justice Advisory Board (CJAB) Domestic Relations Section Law Library Operational Services Probation Services County Government County Administration Adult Correction Complex Building and Maintenance​​ Children and Youth Services​​ Conservation District​ Department of Emergency Services​ Elections and Voter Registration​ Human Resources Information Technology Office of Budget and Purchasing Office of Planning and Development​ ​ Protective Services Public Defender Security Solicitor Tax Services​​​ Veterans Affairs Victim Witness Elected Officials Clerk of Court​ ​ Clerk of Orphans' Court ​ ​ Controller​​ ​ Coroner​​ ​ District Attorney ​ Prothonotary Recorder of Deeds ​ Register of Wills​ ​ Sheriff ​ Treasurer ​ Municipalities Boroughs Abbottstown Borough Arendtsville Borough Bendersville Borough Biglerville Borough Bonneauville Borough Carroll Valley Borough East Berlin Borough Fairfield Borough Gettysburg Borough Littlestown Borough New Oxford Borough McSherrystown Borough York Springs Borough Townships Berwick Township Butler Township Conewago Township Cumberland Township Franklin Township Freedom Township Germany Township Hamiltonban Township Hamilton Township Highland Township Huntington Township Latimore Township Liberty Township Menallen Township Mt. Joy Township Mt. Pleasant Township Oxford Township Reading Township Straban Township Tyrone Township Union Township ​Associations Council of Government Association of Borough Officials Association of Township Officials York/Adams MH IDD Program Adams County Volunteer Emergency Services Northern Adams Regional Emergency Management Agency Police Department (EARPD) Search Search Police Department Commission Meeting Start Date: Sunday, January 1, 2023 End Date: Sunday, December 31, 2023 Location: Eastern Adams Regional Police Department - 110 N Berlin Road Start Time: 4:00 PM Back to previous page Resources County by Location County Coat of Arms Privacy Statement Terms of Use Navigation Commissioners County Government Courts Municipalities Services Courts Self-Help Center Election Resources Employment Office of Open Records Tax Services​​​ Copyright 2024 ",2024-08-20 14:07:03 -https://www.adamscountypa.gov/police/earpd/calendar/police-department-commission-meeting/07-18-2023-04-00-00-pm-police-department-commission-meeting,police/earpd/calendar/police-department-commission-meeting/07-18-2023-04-00-00-pm-police-department-commission-meeting,Adams County PA - 07/18/2023 04:00:00 PM Police Department Commission Meeting,,Adams County PA - Official Website,200,"[""Police Department Commission Meeting""]",[],[],[],[],[],"[Skip to Content] Search ✖ Home Services Locations Powered by Translate Log in Register ✖ Commissioners Board of Commissioners Commissioners Office Elections and Voters Registration Human Resources Solicitor Tax Services Veterans Affairs County Services Board of Commissioners Meetings County Budget Employment Opportunites Open Records Right to Know Parcel Locator - Interactive Mapping Pay Delinquent Taxes Register to Vote Veterans Services Controller's Fraud Hotline About Adams County Adams County Broadband Taskforce Adams County Profile Adams County School Districts Adams County Plans, Studies, and Publications Adams County Tax Collectors Adams Economic Alliance Land Conservancy of Adams County Penn State Extension Office of Adams County Courts 51st Judicial District Court Court of Common Pleas Court Administration Magisterial District Judges Magisterial District Judges Home District Court 51-3-01 District Court 51-3-02 District Court 51-3-03 District Court 51-3-04 Court Departments Criminal Justice Advisory Board (CJAB) Domestic Relations Section Law Library Operational Services Probation Services County Government County Administration Adult Correction Complex Building and Maintenance​​ Children and Youth Services​​ Conservation District​ Department of Emergency Services​ Elections and Voter Registration​ Human Resources Information Technology Office of Budget and Purchasing Office of Planning and Development​ ​ Protective Services Public Defender Security Solicitor Tax Services​​​ Veterans Affairs Victim Witness Elected Officials Clerk of Court​ ​ Clerk of Orphans' Court ​ ​ Controller​​ ​ Coroner​​ ​ District Attorney ​ Prothonotary Recorder of Deeds ​ Register of Wills​ ​ Sheriff ​ Treasurer ​ Municipalities Boroughs Abbottstown Borough Arendtsville Borough Bendersville Borough Biglerville Borough Bonneauville Borough Carroll Valley Borough East Berlin Borough Fairfield Borough Gettysburg Borough Littlestown Borough New Oxford Borough McSherrystown Borough York Springs Borough Townships Berwick Township Butler Township Conewago Township Cumberland Township Franklin Township Freedom Township Germany Township Hamiltonban Township Hamilton Township Highland Township Huntington Township Latimore Township Liberty Township Menallen Township Mt. Joy Township Mt. Pleasant Township Oxford Township Reading Township Straban Township Tyrone Township Union Township ​Associations Council of Government Association of Borough Officials Association of Township Officials York/Adams MH IDD Program Adams County Volunteer Emergency Services Northern Adams Regional Emergency Management Agency Police Department (EARPD) Search Search Police Department Commission Meeting Start Date: Tuesday, July 18, 2023 End Date: Tuesday, July 18, 2023 Location: Eastern Adams Regional Police Department - 110 N Berlin Road Start Time: 4:00 PM Back to previous page Resources County by Location County Coat of Arms Privacy Statement Terms of Use Navigation Commissioners County Government Courts Municipalities Services Courts Self-Help Center Election Resources Employment Office of Open Records Tax Services​​​ Copyright 2024 ",2024-08-20 14:07:03 -https://cumberland.adamscountypa.gov/departments/contactuspolice/policecontacts/brian-weikert,departments/contactuspolice/policecontacts/brian-weikert,Adams County Municipality Cumberland Township - Brian Weikert,,Adams County Municipality Cumberland Township - Official Website,200,[],[],[],[],[],[],"[Skip to Content] Search ✖ Log in Register ✖ Home Township Meetings Township Services Township Land Use Search Search Brian Weikert Patrolman Email: bweikert@cumberlandtwppa.gov Extension: 450 Direct Phone: 717-334-6485 Ext. 450 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Search ✖ Log in Register ✖ Home Township Meetings Township Services Township Land Use Search Search Search ✖ Log in Register ✖ Log in Register Home Township Meetings Township Services Township Land Use Search Search Search Brian Weikert Patrolman Email: bweikert@cumberlandtwppa.gov Extension: 450 Direct Phone: 717-334-6485 Ext. 450 Brian Weikert Patrolman Email: bweikert@cumberlandtwppa.gov Extension: 450 Direct Phone: 717-334-6485 Ext. 450 Brian Weikert Patrolman Email: bweikert@cumberlandtwppa.gov Extension: 450 Direct Phone: 717-334-6485 Ext. 450 Brian Weikert Patrolman Email: bweikert@cumberlandtwppa.gov Extension: 450 Direct Phone: 717-334-6485 Ext. 450 Brian Weikert Patrolman Email: bweikert@cumberlandtwppa.gov Extension: 450 Direct Phone: 717-334-6485 Ext. 450 Brian Weikert Patrolman Email: bweikert@cumberlandtwppa.gov Email: Extension: 450 Extension: Direct Phone: 717-334-6485 Ext. 450 Direct Phone: Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Copyright 2024 Copyright 2024 Copyright 2024 ",2024-08-20 14:07:03 -https://cumberland.adamscountypa.gov/departments/contactuspolice/policecontacts/daniel-barbagelle,departments/contactuspolice/policecontacts/daniel-barbagelle,Adams County Municipality Cumberland Township - Daniel Barbagello,,Adams County Municipality Cumberland Township - Official Website,200,[],[],[],[],[],[],"[Skip to Content] Search ✖ Log in Register ✖ Home Township Meetings Township Services Township Land Use Search Search Daniel Barbagello Patrolman First Class Email: dbarbagello@cumberlandtwppa.gov Extension: 404 Direct Phone: 717-334-6485 Ext. 404 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Search ✖ Log in Register ✖ Home Township Meetings Township Services Township Land Use Search Search Search ✖ Log in Register ✖ Log in Register Home Township Meetings Township Services Township Land Use Search Search Search Daniel Barbagello Patrolman First Class Email: dbarbagello@cumberlandtwppa.gov Extension: 404 Direct Phone: 717-334-6485 Ext. 404 Daniel Barbagello Patrolman First Class Email: dbarbagello@cumberlandtwppa.gov Extension: 404 Direct Phone: 717-334-6485 Ext. 404 Daniel Barbagello Patrolman First Class Email: dbarbagello@cumberlandtwppa.gov Extension: 404 Direct Phone: 717-334-6485 Ext. 404 Daniel Barbagello Patrolman First Class Email: dbarbagello@cumberlandtwppa.gov Extension: 404 Direct Phone: 717-334-6485 Ext. 404 Daniel Barbagello Patrolman First Class Email: dbarbagello@cumberlandtwppa.gov Extension: 404 Direct Phone: 717-334-6485 Ext. 404 Daniel Barbagello Patrolman First Class Email: dbarbagello@cumberlandtwppa.gov Email: Extension: 404 Extension: Direct Phone: 717-334-6485 Ext. 404 Direct Phone: Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Copyright 2024 Copyright 2024 Copyright 2024 ",2024-08-20 14:07:03 -https://cumberland.adamscountypa.gov/departments/contactuspolice/policecontacts/eric-yost,departments/contactuspolice/policecontacts/eric-yost,Adams County Municipality Cumberland Township - Eric Yost,,Adams County Municipality Cumberland Township - Official Website,200,[],[],[],[],[],[],"[Skip to Content] Search ✖ Log in Register ✖ Home Township Meetings Township Services Township Land Use Search Search Eric Yost Patrolman Email: eyost@cumberlandtwppa.gov Extension: 4400 Direct Phone: 717-334-6485 Ext. 4400 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Search ✖ Log in Register ✖ Home Township Meetings Township Services Township Land Use Search Search Search ✖ Log in Register ✖ Log in Register Home Township Meetings Township Services Township Land Use Search Search Search Eric Yost Patrolman Email: eyost@cumberlandtwppa.gov Extension: 4400 Direct Phone: 717-334-6485 Ext. 4400 Eric Yost Patrolman Email: eyost@cumberlandtwppa.gov Extension: 4400 Direct Phone: 717-334-6485 Ext. 4400 Eric Yost Patrolman Email: eyost@cumberlandtwppa.gov Extension: 4400 Direct Phone: 717-334-6485 Ext. 4400 Eric Yost Patrolman Email: eyost@cumberlandtwppa.gov Extension: 4400 Direct Phone: 717-334-6485 Ext. 4400 Eric Yost Patrolman Email: eyost@cumberlandtwppa.gov Extension: 4400 Direct Phone: 717-334-6485 Ext. 4400 Eric Yost Patrolman Email: eyost@cumberlandtwppa.gov Email: Extension: 4400 Extension: Direct Phone: 717-334-6485 Ext. 4400 Direct Phone: Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Copyright 2024 Copyright 2024 Copyright 2024 ",2024-08-20 14:07:03 -https://cumberland.adamscountypa.gov/departments/contactuspolice/policecontacts/josh-goodling,departments/contactuspolice/policecontacts/josh-goodling,Adams County Municipality Cumberland Township - Josh Goodling,,Adams County Municipality Cumberland Township - Official Website,200,[],[],[],[],[],[],"[Skip to Content] Search ✖ Log in Register ✖ Home Township Meetings Township Services Township Land Use Search Search Josh Goodling Sergeant Email: jgoodling@cumberlandtwppa.gov Extension: 407 Direct Phone: 717-334-6485 Ext. 407 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Search ✖ Log in Register ✖ Home Township Meetings Township Services Township Land Use Search Search Search ✖ Log in Register ✖ Log in Register Home Township Meetings Township Services Township Land Use Search Search Search Josh Goodling Sergeant Email: jgoodling@cumberlandtwppa.gov Extension: 407 Direct Phone: 717-334-6485 Ext. 407 Josh Goodling Sergeant Email: jgoodling@cumberlandtwppa.gov Extension: 407 Direct Phone: 717-334-6485 Ext. 407 Josh Goodling Sergeant Email: jgoodling@cumberlandtwppa.gov Extension: 407 Direct Phone: 717-334-6485 Ext. 407 Josh Goodling Sergeant Email: jgoodling@cumberlandtwppa.gov Extension: 407 Direct Phone: 717-334-6485 Ext. 407 Josh Goodling Sergeant Email: jgoodling@cumberlandtwppa.gov Extension: 407 Direct Phone: 717-334-6485 Ext. 407 Josh Goodling Sergeant Email: jgoodling@cumberlandtwppa.gov Email: Extension: 407 Extension: Direct Phone: 717-334-6485 Ext. 407 Direct Phone: Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Copyright 2024 Copyright 2024 Copyright 2024 ",2024-08-20 14:07:03 -https://cumberland.adamscountypa.gov/departments/contactuspolice/policecontacts/joshua-rosenberger,departments/contactuspolice/policecontacts/joshua-rosenberger,Adams County Municipality Cumberland Township - Joshua Rosenberger,,Adams County Municipality Cumberland Township - Official Website,200,[],[],[],[],[],[],"[Skip to Content] Search ✖ Log in Register ✖ Home Township Meetings Township Services Township Land Use Search Search Joshua Rosenberger Sergeant Email: jrosenberger@cumberlandtwppa.gov Extension: 402 Direct Phone: 717-334-6485 Ext. 402 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Search ✖ Log in Register ✖ Home Township Meetings Township Services Township Land Use Search Search Search ✖ Log in Register ✖ Log in Register Home Township Meetings Township Services Township Land Use Search Search Search Joshua Rosenberger Sergeant Email: jrosenberger@cumberlandtwppa.gov Extension: 402 Direct Phone: 717-334-6485 Ext. 402 Joshua Rosenberger Sergeant Email: jrosenberger@cumberlandtwppa.gov Extension: 402 Direct Phone: 717-334-6485 Ext. 402 Joshua Rosenberger Sergeant Email: jrosenberger@cumberlandtwppa.gov Extension: 402 Direct Phone: 717-334-6485 Ext. 402 Joshua Rosenberger Sergeant Email: jrosenberger@cumberlandtwppa.gov Extension: 402 Direct Phone: 717-334-6485 Ext. 402 Joshua Rosenberger Sergeant Email: jrosenberger@cumberlandtwppa.gov Extension: 402 Direct Phone: 717-334-6485 Ext. 402 Joshua Rosenberger Sergeant Email: jrosenberger@cumberlandtwppa.gov Email: Extension: 402 Extension: Direct Phone: 717-334-6485 Ext. 402 Direct Phone: Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Copyright 2024 Copyright 2024 Copyright 2024 ",2024-08-20 14:07:03 -https://cumberland.adamscountypa.gov/departments/contactuspolice/policecontacts/lane-hartley,departments/contactuspolice/policecontacts/lane-hartley,Adams County Municipality Cumberland Township - Lane Hartley,,Adams County Municipality Cumberland Township - Official Website,200,[],[],[],[],[],[],"[Skip to Content] Search ✖ Log in Register ✖ Home Township Meetings Township Services Township Land Use Search Search Lane Hartley Patrolman Email: lhartley@cumberlandtwppa.gov Extension: 408 Direct Phone: 717-334-6485 Ext. 408 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Search ✖ Log in Register ✖ Home Township Meetings Township Services Township Land Use Search Search Search ✖ Log in Register ✖ Log in Register Home Township Meetings Township Services Township Land Use Search Search Search Lane Hartley Patrolman Email: lhartley@cumberlandtwppa.gov Extension: 408 Direct Phone: 717-334-6485 Ext. 408 Lane Hartley Patrolman Email: lhartley@cumberlandtwppa.gov Extension: 408 Direct Phone: 717-334-6485 Ext. 408 Lane Hartley Patrolman Email: lhartley@cumberlandtwppa.gov Extension: 408 Direct Phone: 717-334-6485 Ext. 408 Lane Hartley Patrolman Email: lhartley@cumberlandtwppa.gov Extension: 408 Direct Phone: 717-334-6485 Ext. 408 Lane Hartley Patrolman Email: lhartley@cumberlandtwppa.gov Extension: 408 Direct Phone: 717-334-6485 Ext. 408 Lane Hartley Patrolman Email: lhartley@cumberlandtwppa.gov Email: Extension: 408 Extension: Direct Phone: 717-334-6485 Ext. 408 Direct Phone: Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Copyright 2024 Copyright 2024 Copyright 2024 ",2024-08-20 14:07:03 -https://cumberland.adamscountypa.gov/departments/contactuspolice/policecontacts/ryan-eiker,departments/contactuspolice/policecontacts/ryan-eiker,Adams County Municipality Cumberland Township - Ryan Eiker,,Adams County Municipality Cumberland Township - Official Website,200,[],[],[],[],[],[],"[Skip to Content] Search ✖ Log in Register ✖ Home Township Meetings Township Services Township Land Use Search Search Ryan Eiker Patrolman First Class Email: reiker@cumberlandtwppa.gov Extension: 403 Direct Phone: 717-334-6485 Ext. 403 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Search ✖ Log in Register ✖ Home Township Meetings Township Services Township Land Use Search Search Search ✖ Log in Register ✖ Log in Register Home Township Meetings Township Services Township Land Use Search Search Search Ryan Eiker Patrolman First Class Email: reiker@cumberlandtwppa.gov Extension: 403 Direct Phone: 717-334-6485 Ext. 403 Ryan Eiker Patrolman First Class Email: reiker@cumberlandtwppa.gov Extension: 403 Direct Phone: 717-334-6485 Ext. 403 Ryan Eiker Patrolman First Class Email: reiker@cumberlandtwppa.gov Extension: 403 Direct Phone: 717-334-6485 Ext. 403 Ryan Eiker Patrolman First Class Email: reiker@cumberlandtwppa.gov Extension: 403 Direct Phone: 717-334-6485 Ext. 403 Ryan Eiker Patrolman First Class Email: reiker@cumberlandtwppa.gov Extension: 403 Direct Phone: 717-334-6485 Ext. 403 Ryan Eiker Patrolman First Class Email: reiker@cumberlandtwppa.gov Email: Extension: 403 Extension: Direct Phone: 717-334-6485 Ext. 403 Direct Phone: Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Copyright 2024 Copyright 2024 Copyright 2024 ",2024-08-20 14:07:03 -https://cumberland.adamscountypa.gov/home/newsinformation/now-hiring-police-department,home/newsinformation/now-hiring-police-department,Adams County Municipality Cumberland Township - Official Website,Official Website,Adams County Municipality Cumberland Township - Official Website,200,"[""Now Hiring - Police Department""]",[],[],[],[],[],"[Skip to Content] Search ✖ Log in Register ✖ Home Township Meetings Township Services Township Land Use Search Search Now Hiring - Police Department News Date: Tuesday, June 18, 2024 Full Time Police Cadet Full Time Officer Application Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Search ✖ Log in Register ✖ Home Township Meetings Township Services Township Land Use Search Search Search ✖ Log in Register ✖ Log in Register Home Township Meetings Township Services Township Land Use Search Search Search Now Hiring - Police Department News Date: Tuesday, June 18, 2024 Full Time Police Cadet Full Time Officer Application Now Hiring - Police Department Now Hiring - Police Department News Date: Tuesday, June 18, 2024 News Date: Tuesday, June 18, 2024 News Date: Tuesday, June 18, 2024 Full Time Police Cadet Full Time Officer Application Full Time Police Cadet Full Time Officer Application Full Time Police Cadet Full Time Officer Application Full Time Police Cadet Full Time Officer Application Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Cumberland Township 1370 Fairfield Road Gettysburg, PA 17325 Phone - 717-334-6485 Fax - 717-334-3632 Copyright 2024 Copyright 2024 Copyright 2024 Copyright 2024 ",2024-08-20 14:07:03 -https://cumberland.adamscountypa.gov/home/newsinformation/press-release-for-police-department-donations,home/newsinformation/press-release-for-police-department-donations,,,Adams County Municipality Cumberland Township - Official Website,404,,,,,,,,2024-08-20 14:07:03 diff --git a/annotation_pipeline/populate_labelstudio.py b/annotation_pipeline/populate_labelstudio.py deleted file mode 100644 index 49c673c2..00000000 --- a/annotation_pipeline/populate_labelstudio.py +++ /dev/null @@ -1,256 +0,0 @@ -""" -This Python script automates the process of crawling Common Crawl Corpus for relevant URLs, -scraping HTML content from those pages, -formatting the data as Label Studio tasks, -and uploading them to Label Studio for annotation. -""" - -import argparse -import configparser -import os -import subprocess -import sys -from http import HTTPStatus - -import pandas as pd -from huggingface_hub import hf_hub_download - -# The below code sets the working directory to be the root of the entire repository for module imports -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) - -from label_studio_interface.LabelStudioConfig import LabelStudioConfig -from label_studio_interface.LabelStudioAPIManager import LabelStudioAPIManager - -def run_subprocess(terminal_command: str): - """ - Runs subprocesses (e.g. common crawl and html tag collector) and handles their outputs + errors - """ - - process = subprocess.Popen(terminal_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, bufsize=1) - - with process.stdout, process.stderr: - for line in process.stdout: - print(line, end='') - for line in process.stderr: - print(line, end='') - - return_code = process.wait() - - stdout, stderr = process.communicate() - - return return_code, stdout, stderr - -def run_common_crawl(common_crawl_id: str, url: str, search_term: str, num_pages: str): - """ - Prompts terminal to run common crawl script provided the following: - Args: SEE def process_crawl() - - See Common Crawl Documentation @ https://github.com/Police-Data-Accessibility-Project/data-source-identification/blob/main/common_crawler/README.md - - CSV of crawled URL's uploaded to HuggingFace - """ - - common_crawl = f"python common_crawler/main.py {common_crawl_id} '{url}' {search_term} --config annotation_pipeline/config.ini --pages {num_pages}" - - return_code, stdout, stderr = run_subprocess(common_crawl) - - return return_code, stdout, stderr - -def run_tag_collector(filename: str): - """ - Prompts terminal to run tag collector on crawled URL's - filename: name of csv containing crawled URL's - - CSV of URL's + collected tags saved in ./labeled-source-text.csv - """ - tag_collector = f"python3 html_tag_collector/collector.py annotation_pipeline/data/{filename} --render-javascript" - - return_code, stdout, stderr = run_subprocess(tag_collector) - - return return_code, stdout, stderr - -def csv_to_label_studio_tasks(csv_file_path: str, batch_id: str, output_name: str, record_type: str = None) -> list[dict]: - """ - Formats CSV into list[dict] with "data" key as labelstudio expects - csv_file_path: path to csv with labeled source text - batch_id: timestamp to append to all URL's in batch - output_name: saves tag_collected CSV + batch_info in data/tag_collector/{output_name} - """ - df = pd.read_csv(csv_file_path) - df['batch_id'] = [batch_id] * len(df) - df = df.fillna('') - os.makedirs("annotation_pipeline/data/tag_collector/", exist_ok=True) - df.to_csv("annotation_pipeline/data/tag_collector/" + output_name.replace("urls/", "", 1), index=False) - - #remove labeled-source-text.csv (updated and written to data/tag_collector) - if os.path.exists(csv_file_path): - os.remove(csv_file_path) - - tasks = [] - - if record_type: - for _, row in df.iterrows(): - task_data = row.to_dict() - task_predictions = { - "model_version": "record-type prediction", - "result": [ - { - "from_name": "record-type", - "to_name": "url", - "type": "choices", - "value": { - "choices": [record_type] - } - } - ] - } - - tasks.append({"data": task_data, "predictions": [task_predictions]}) - else: - tasks = [{"data": row.to_dict()} for _, row in df.iterrows()] - - return tasks - -def get_valid_record_types(file_path: str) -> set: - """ load file containing valid record types and return them as a set""" - with open(file_path, 'r') as file: - valid_record_types = {line.strip() for line in file} - return valid_record_types - -def get_huggingface_repo_id(config_file: str) -> str: - """ Returns HuggingFace REPO_ID (where unlabeled URLs are stashed) from config.ini file""" - - config = configparser.ConfigParser() - config.read(config_file) - - # Retrieve the huggingface_repo_id from the DEFAULT section - huggingface_repo_id = config['DEFAULT'].get('huggingface_repo_id') - - if huggingface_repo_id is None: - raise ValueError("huggingface_repo_id not found in the config file.") - - return huggingface_repo_id - -def process_crawl(common_crawl_id: str, url: str, search_term: str, num_pages: str) -> pd.Series: - """Initiated common crawl script and handles output for further processing - - Args: - common_crawl_id: string to specify which common crawl corpus to search - url: specify type of url to search for (e.g. *.gov for all .gov domains) - search_term: further refine search with keyword that must be matched in full URL - num_pages: number of pages to search (15,000 records per page) - - Returns: - batch_info (pd.Series): summary info of crawl, including filename of csv containing relevant URLs - """ - #run common crawl - crawl_return_code, crawl_stdout, crawl_stderr = run_common_crawl(common_crawl_id, url, search_term, num_pages) - - print(f"from populate label studio crawl error: crawl return {crawl_return_code}, crawl stdout {crawl_stdout}, crawl stderr {crawl_stderr}") - - #check success - if crawl_return_code != 0: - raise ValueError(f"Common crawl script failed:\n{crawl_stderr}") - - #print batch info to verify before continuing - batch_info = pd.read_csv("annotation_pipeline/data/batch_info.csv").iloc[-1] - print("Batch Info:\n" + f"{batch_info}") - - if(batch_info["Count"] == 0): - raise ValueError("Batch count is 0. Rerun to crawl more pages.") - - return batch_info - -def process_tag_collector(batch_info: pd.Series, FILENAME: str) -> str: - """ - Initiates tag collector script and creates a batch id for all samples - - Args: - batch_info (pd.Series): summary info for crawl - FILENAME (str): filename of csv to collect tags on - - Returns: - batch_id (str): a datetime stamp to track batches - """ - - #run tag collector - tag_collector_return_code, tag_collector_stdout, tag_collector_stderr = run_tag_collector(FILENAME) - - #check success - if tag_collector_return_code != 0: - raise ValueError(f"Tag collector script failed:\n{tag_collector_stderr}") - - #create batch_id from datetime (removes milliseconds) - datetime = batch_info["Datetime"] - batch_id = datetime[:datetime.find('.')] - - return batch_id - -def label_studio_upload(batch_id: str, FILENAME: str, record_type: str): - """ - Handles label studio task formatting and upload - """ - - #convert to label studio task format - data = csv_to_label_studio_tasks("labeled-source-text.csv", batch_id, FILENAME, record_type) - - # Load the configuration for the Label Studio API - config = LabelStudioConfig(".env") - if "REPLACE_WITH_YOUR_TOKEN" in config.authorization_token: - raise ValueError("Please replace the access token in .env with your own access token") - - # Create an API manager - api_manager = LabelStudioAPIManager(config) - - #import tasks - label_studio_response = api_manager.export_tasks_into_project(data) - - #check import success - if label_studio_response.status_code == HTTPStatus.CREATED: - labelstudio_url = api_manager.api_url_constructor.get_import_url().rstrip('/import') - print(f"Tasks successfully imported. Please access the project at {labelstudio_url} to perform review and annotation tasks") - else: - raise ValueError(f"Failed to import tasks. Response code: {label_studio_response.status_code}\n{label_studio_response.text}") - -def main(): - """ - This script automates the process of crawling for relevant URL's, - scraping HTML content from those pages, formatting the data as label studio tasks, - and uploading to label studio - """ - - parser = argparse.ArgumentParser(description='Process crawl arguments') - parser.add_argument('common_crawl_id', type=str, help='common crawl ID') - parser.add_argument('url', type=str, help='URL type to search for') - parser.add_argument('keyword', type=str, help='require this keyword in URL results') - parser.add_argument('--pages', type=str, required=True, help='number of pages to process') - parser.add_argument('--record-type', type=str, required=False, help='assumed record type for pre-annotation') - args = parser.parse_args() - - if args.record_type is not None: - valid_record_types = get_valid_record_types("annotation_pipeline/record_types.txt") - if args.record_type not in valid_record_types: - raise ValueError(f"Invalid record type: {args.record_type}. Must be one of {valid_record_types}") - return - - try: - # COMMON CRAWL - batch_info = process_crawl(args.common_crawl_id, args.url, args.keyword, args.pages) - #get urls from hugging face - REPO_ID = get_huggingface_repo_id("annotation_pipeline/config.ini") - FILENAME = "urls/" + batch_info["Filename"] + ".csv" - hf_hub_download(repo_id=REPO_ID, filename=FILENAME, repo_type="dataset", local_dir="annotation_pipeline/data/") - - # TAG COLLECTOR - batch_id = process_tag_collector(batch_info, FILENAME) - - # LABEL STUDIO UPLOAD - label_studio_upload(batch_id, FILENAME, args.record_type) - except ValueError as e: - print(f"Error: {e}") - return - -if __name__ == "__main__": - print("Running Annotation Pipeline...") - main() - diff --git a/annotation_pipeline/record_types.txt b/annotation_pipeline/record_types.txt deleted file mode 100644 index b12931d6..00000000 --- a/annotation_pipeline/record_types.txt +++ /dev/null @@ -1,36 +0,0 @@ -Accident Reports -Arrest Records -Calls for Service -Car GPS -Citations -Dispatch Logs -Dispatch Recordings -Field Contacts -Incident Reports -Misc Police Activity -Officer Involved Shootings -Stops -Surveys -Use of Force Reports -Vehicle Pursuits -Complaints & Misconduct -Daily Activity Logs -Training & Hiring Info -Personnel Records -Annual & Monthly Reports -Budgets & Finances -Contact Info & Agency Meta -Geographic -List of Data Sources -Policies & Contracts -Crime Maps & Reports -Crime Statistics -Media Bulletins -Records Request Info -Resources -Sex Offender Registry -Wanted Persons -Booking Reports -Court Cases -Incarceration Records -Poor Data Source \ No newline at end of file diff --git a/annotation_pipeline/requirements.txt b/annotation_pipeline/requirements.txt deleted file mode 100644 index 5ff85815..00000000 --- a/annotation_pipeline/requirements.txt +++ /dev/null @@ -1,13 +0,0 @@ -pandas==2.1.4 -python-dotenv~=1.0.1 -argparse~=1.1 -huggingface-hub~=0.22.2 -requests~=2.31.0 -requests_html>=0.10.0 -lxml~=5.1.0 -pyppeteer>=2.0.0 -beautifulsoup4>=4.12.3 -bs4~=0.0.2 -tqdm>=4.64.1 -polars~=0.20.10 -urllib3~=1.26.18 diff --git a/source_collectors/muckrock/muckrock_ml_labeler.py b/source_collectors/muckrock/muckrock_ml_labeler.py deleted file mode 100644 index 49af4794..00000000 --- a/source_collectors/muckrock/muckrock_ml_labeler.py +++ /dev/null @@ -1,80 +0,0 @@ -""" -Utilizes a fine-tuned model to label a dataset of URLs. -""" - -import argparse - -import pandas as pd -import torch -from transformers import AutoTokenizer, AutoModelForSequenceClassification - - -def load_dataset_from_command_line() -> pd.DataFrame: - parser = argparse.ArgumentParser(description="Load CSV file into a pandas DataFrame.") - parser.add_argument("--csv_file", type=str, required=True, help="Path to the CSV file") - args = parser.parse_args() - return pd.read_csv(args.csv_file) - - -def create_combined_text_column(df: pd.DataFrame) -> None: - # Combine multiple columns (e.g., 'url', 'html_title', 'h1') into a single text field for each row - columns_to_combine = [ - "url_path", - "html_title", - "h1", - ] # Add other columns here as needed - df["combined_text"] = df[columns_to_combine].apply( - lambda row: " ".join(row.values.astype(str)), axis=1 - ) - - -def get_list_of_combined_texts(df: pd.DataFrame) -> list[str]: - # Convert the combined text into a list - return df["combined_text"].tolist() - - -def save_labeled_muckrock_dataset_to_csv(): - df.to_csv("labeled_muckrock_dataset.csv", index=False) - - -def create_predicted_labels_column(df: pd.DataFrame, predicted_labels: list[str]) -> None: - df["predicted_label"] = predicted_labels - - -def map_predictions_to_labels(model, predictions) -> list[str]: - labels = model.config.id2label - return [labels[int(pred)] for pred in predictions] - - -def get_predicted_labels(texts: list[str]) -> list[str]: - # Load the tokenizer and model - model_name = "PDAP/fine-url-classifier" - tokenizer = AutoTokenizer.from_pretrained(model_name) - - model = AutoModelForSequenceClassification.from_pretrained(model_name) - model.eval() - # Tokenize the inputs - inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt") - # Perform inference - with torch.no_grad(): - outputs = model(**inputs) - # Get the predicted labels - predictions = torch.argmax(outputs.logits, dim=-1) - # Map predictions to labels - predicted_labels = map_predictions_to_labels(model=model, predictions=predictions) - - return predicted_labels - - -if __name__ == "__main__": - df = load_dataset_from_command_line() - # TODO: Check for existence of required columns prior to further processing - create_combined_text_column(df=df) - - texts = get_list_of_combined_texts(df=df) - - predicted_labels = get_predicted_labels(texts=texts) - # Add the predicted labels to the dataframe and save - create_predicted_labels_column(df=df, predicted_labels=predicted_labels) - - save_labeled_muckrock_dataset_to_csv() \ No newline at end of file diff --git a/tests/manual/label_studio_interface/__init__.py b/tests/manual/label_studio_interface/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/manual/label_studio_interface/test_label_studio_interface_integration.py b/tests/manual/label_studio_interface/test_label_studio_interface_integration.py deleted file mode 100644 index d8e6fdb4..00000000 --- a/tests/manual/label_studio_interface/test_label_studio_interface_integration.py +++ /dev/null @@ -1,73 +0,0 @@ -import pytest - -from label_studio_interface.DTOs.LabelStudioTaskExportInfo import LabelStudioTaskExportInfo -from label_studio_interface.LabelStudioAPIManager import LabelStudioAPIManager, generate_random_word -from label_studio_interface.LabelStudioConfig import LabelStudioConfig - - -# Setup method -@pytest.fixture -def api_manager() -> LabelStudioAPIManager: - config = LabelStudioConfig() - return LabelStudioAPIManager(config) - -# Helper methods -def get_member_role_and_user_id(user_id: str, org_id: str, data: dict) -> tuple[str, int]: - for result in data['results']: - if result['organization'] == int(org_id) and result['user']['username'] == user_id: - return result['role'], result['user']['id'] - -def test_import_tasks_from_project(api_manager): - response = api_manager.import_tasks_from_project() - print(response.json()) - -def test_export_tasks_into_project(api_manager): - data = [] - for _ in range(10): - data.append( - LabelStudioTaskExportInfo(url=f"https://example.com/{generate_random_word(10)}") - ) - import_id = api_manager.export_tasks_into_project(data) - print("Import ID:", import_id) - - -def test_ping_project(api_manager): - project_accessible = api_manager.ping_project() - assert project_accessible - print("Project is accessible") - - -def test_get_members_in_organization(api_manager): - response = api_manager.get_members_in_organization() - assert response.status_code == 200 - print(response.json()) - -def test_update_member_role(api_manager): - # Note that for this test to work, you need to ensure there is seat available for the user in the organization - # A seat can be made available by deactivating a seat from another user - # (Remember to reassign the seat to the user after the test) - from label_studio_interface.LabelStudioAPIManager import Role - username = 'resibe6343' - response = api_manager.get_members_in_organization() - org_id = api_manager.config.organization_id - role, user_id = get_member_role_and_user_id(username, org_id, response.json()) - print(role) - - # Update role to Annotator - response = api_manager.update_member_role(user_id, Role.ANNOTATOR) - assert response.status_code == 200 - response = api_manager.get_members_in_organization() - role, _ = get_member_role_and_user_id(username, org_id, response.json()) - assert role == Role.ANNOTATOR.value - - # Update role to Deactivated - response = api_manager.update_member_role(user_id, Role.DEACTIVATED) - assert response.status_code == 200 - response = api_manager.get_members_in_organization() - role, _ = get_member_role_and_user_id(username, org_id, response.json()) - assert role == Role.DEACTIVATED.value - - - # response = api_manager.update_member_role("user_id", "role") - # assert response.status_code == 200 - # print(response.json()) \ No newline at end of file From a7f757e829bdbc804c4b47d556b49b979ba6cf62 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 30 Jan 2025 11:30:23 -0500 Subject: [PATCH 032/244] Remove unused files --- html_tag_collector/ResponseFetcher.py | 64 --------------------------- 1 file changed, 64 deletions(-) delete mode 100644 html_tag_collector/ResponseFetcher.py diff --git a/html_tag_collector/ResponseFetcher.py b/html_tag_collector/ResponseFetcher.py deleted file mode 100644 index 04ef3f21..00000000 --- a/html_tag_collector/ResponseFetcher.py +++ /dev/null @@ -1,64 +0,0 @@ -import ssl -import traceback -from dataclasses import dataclass -from typing import Optional - -import requests -import urllib3 -from requests_html import AsyncHTMLSession - -from html_tag_collector.constants import REQUEST_HEADERS -from html_tag_collector.url_adjustment_functions import http_to_https - - -class ResponseFetcher: - - def __init__(self, session: AsyncHTMLSession, url: str, debug=False): - self.headers = REQUEST_HEADERS - self.session = session - self.url = url - self.debug = debug - - def debug_print(self, s: str): - if self.debug: - print(s) - - async def fetch(self, verify_ssl=True): - return await self.session.get( - self.url, - headers=self.headers, - timeout=120, - verify=verify_ssl - ) - - async def get_response(self): - response = None - try: - response = await self.fetch() - except (requests.exceptions.SSLError, ssl.SSLError): - # This error is raised when the website uses a legacy SSL version, which is not supported by requests - self.debug_print(f"SSLError: {self.url}") - - # Retry without SSL verification - response = await self.fetch(verify_ssl=False) - except requests.exceptions.ConnectionError: - # Sometimes this error is raised because the provided url uses http - # when it should be https and the website does not handle it properly - self.debug_print(f"MaxRetryError: {self.url}") - - response = await self.retry_with_https() - except (urllib3.exceptions.LocationParseError, requests.exceptions.ReadTimeout) as e: - self.debug_print(f"{type(e).__name__}: {self.url}") - except Exception as e: - self.debug_print(f""" - "Exception:", {self.url} - {traceback.format_exc()} - {e} - """) - finally: - self.debug_print(f"{self.url} - {str(response)}") - return response - - async def retry_with_https(self): - self.url = http_to_https(self.url) - return await self.fetch() From ecde93ff18cc752ba126d694157a51be7aed2d5b Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 30 Jan 2025 11:30:38 -0500 Subject: [PATCH 033/244] Remove unused libraries --- requirements.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 2cc28614..7954fedf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ requests~=2.31.0 -polars~=0.20.10 python-dotenv~=1.0.1 bs4~=0.0.2 tqdm>=4.64.1 @@ -13,7 +12,6 @@ datasets~=2.19.1 huggingface-hub~=0.22.2 # html_tag_collector_only -requests_html>=0.10.0 lxml~=5.1.0 beautifulsoup4>=4.12.3 From 1ab1eab921a74598aedc557833c92918331a9b89 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 30 Jan 2025 11:32:22 -0500 Subject: [PATCH 034/244] Update Dockerfile - refine test copies - set pip install to prefer binary --- Dockerfile | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index e820fa66..6582e44d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ WORKDIR /app COPY requirements.txt ./requirements.txt # Install dependencies -RUN pip install --no-cache-dir -r requirements.txt +RUN pip install --no-cache-dir --prefer-binary -r requirements.txt RUN playwright install chromium RUN playwright install-deps @@ -29,7 +29,13 @@ COPY apply_migrations.py ./apply_migrations.py COPY security_manager ./security_manager COPY execute.sh ./execute.sh COPY .project-root ./.project-root -COPY tests ./tests + +COPY tests/conftest.py ./tests/conftest.py +COPY tests/__init__.py ./tests/__init__.py +COPY tests/test_automated ./tests/test_automated +COPY tests/test_alembic ./tests/test_alembic +COPY tests/helpers ./tests/helpers + COPY llm_api_logic ./llm_api_logic # Expose the application port From da929dde95671e631de4b00943a15f3422b7b805 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 30 Jan 2025 12:07:23 -0500 Subject: [PATCH 035/244] Update Dockerfile/requirements - Change to Python 3.11.9 - Only install playwright deps for Chromium - Move to tensorflow-cpu --- Dockerfile | 4 ++-- requirements.txt | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6582e44d..fae4de32 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # Dockerfile for Source Collector FastAPI app -FROM python:3.12.8-slim +FROM python:3.11.9-slim # Set working directory WORKDIR /app @@ -10,7 +10,7 @@ COPY requirements.txt ./requirements.txt # Install dependencies RUN pip install --no-cache-dir --prefer-binary -r requirements.txt RUN playwright install chromium -RUN playwright install-deps +RUN playwright install-deps chromium # Copy project files COPY agency_identifier ./agency_identifier diff --git a/requirements.txt b/requirements.txt index 7954fedf..b72804e7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -32,7 +32,9 @@ alembic~=1.14.0 asyncpg~=0.30.0 pytest-asyncio~=0.25.2 transformers~=4.40.2 -tf-keras~=2.18.0 +tensorflow-cpu~=2.15.1 +keras~=2.15.0 + # HTML Collector playwright~=1.49.1 From 34a7ef3d59ffd963add83597547c27d6b6c94bb7 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 31 Jan 2025 09:41:23 -0500 Subject: [PATCH 036/244] Begin draft on record type annotation. --- api/routes/annotate.py | 50 ++++++++++++--- collector_db/AsyncDatabaseClient.py | 19 +++--- collector_db/DTOs/URLAnnotationInfo.py | 3 +- collector_db/StatementComposer.py | 20 +++++- core/AsyncCore.py | 54 +++++++++++----- ...equestInfo.py => AnnotationRequestInfo.py} | 5 +- core/DTOs/GetNextURLForAnnotationResponse.py | 9 +++ ...etNextURLForRelevanceAnnotationResponse.py | 9 --- core/DTOs/RecordTypeAnnotationPostInfo.py | 7 +++ ...Info.py => RelevanceAnnotationPostInfo.py} | 0 .../api/helpers/RequestValidator.py | 30 +++++++-- .../integration/api/test_annotate.py | 63 ++++++++++++++----- 12 files changed, 203 insertions(+), 66 deletions(-) rename core/DTOs/{RelevanceAnnotationRequestInfo.py => AnnotationRequestInfo.py} (57%) create mode 100644 core/DTOs/GetNextURLForAnnotationResponse.py delete mode 100644 core/DTOs/GetNextURLForRelevanceAnnotationResponse.py create mode 100644 core/DTOs/RecordTypeAnnotationPostInfo.py rename core/DTOs/{RelevanceAnnotationInfo.py => RelevanceAnnotationPostInfo.py} (100%) diff --git a/api/routes/annotate.py b/api/routes/annotate.py index 25eab1d3..27b21708 100644 --- a/api/routes/annotate.py +++ b/api/routes/annotate.py @@ -1,9 +1,11 @@ from fastapi import APIRouter, Depends, Path from api.dependencies import get_async_core +from collector_db.enums import URLMetadataAttributeType from core.AsyncCore import AsyncCore -from core.DTOs.GetNextURLForRelevanceAnnotationResponse import GetNextURLForRelevanceAnnotationResponse -from core.DTOs.RelevanceAnnotationInfo import RelevanceAnnotationPostInfo +from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse +from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo +from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo from security_manager.SecurityManager import get_access_info, AccessInfo annotate_router = APIRouter( @@ -17,8 +19,11 @@ async def get_next_url_for_relevance_annotation( access_info: AccessInfo = Depends(get_access_info), async_core: AsyncCore = Depends(get_async_core), -) -> GetNextURLForRelevanceAnnotationResponse: - result = await async_core.get_next_url_for_relevance_annotation(user_id=access_info.user_id) +) -> GetNextURLForAnnotationResponse: + result = await async_core.get_next_url_for_annotation( + user_id=access_info.user_id, + metadata_type=URLMetadataAttributeType.RELEVANT + ) return result @@ -28,14 +33,43 @@ async def annotate_url_for_relevance_and_get_next_url( metadata_id: int = Path(description="The metadata id for the associated URL metadata"), async_core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info) -) -> GetNextURLForRelevanceAnnotationResponse: +) -> GetNextURLForAnnotationResponse: + """ + Post URL annotation and get next URL to annotate + """ + result = await async_core.submit_and_get_next_url_for_annotation( + user_id=access_info.user_id, + metadata_id=metadata_id, + annotation=str(relevance_annotation_post_info.is_relevant), + metadata_type = URLMetadataAttributeType.RELEVANT + ) + return result + +@annotate_router.get("/record-type") +async def get_next_url_for_record_type_annotation( + access_info: AccessInfo = Depends(get_access_info), + async_core: AsyncCore = Depends(get_async_core), +) -> GetNextURLForAnnotationResponse: + result = await async_core.get_next_url_for_annotation( + user_id=access_info.user_id, + metadata_type=URLMetadataAttributeType.RECORD_TYPE + ) + return result + +@annotate_router.post("/record-type/{metadata_id}") +async def annotate_url_for_record_type_and_get_next_url( + record_type_annotation_post_info: RecordTypeAnnotationPostInfo, + metadata_id: int = Path(description="The metadata id for the associated URL metadata"), + async_core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info) +) -> GetNextURLForAnnotationResponse: """ Post URL annotation and get next URL to annotate """ - await async_core.submit_url_relevance_annotation( + result = await async_core.submit_and_get_next_url_for_annotation( user_id=access_info.user_id, metadata_id=metadata_id, - annotation=relevance_annotation_post_info + annotation=record_type_annotation_post_info.record_type.value, + metadata_type=URLMetadataAttributeType.RECORD_TYPE ) - result = await async_core.get_next_url_for_relevance_annotation(user_id=access_info.user_id) return result diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 07f1cc10..04d40a82 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -23,7 +23,7 @@ from core.DTOs.GetTasksResponse import GetTasksResponse, GetTasksResponseTaskInfo from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseMetadataInfo, GetURLsResponseErrorInfo, \ GetURLsResponseInnerInfo -from core.DTOs.RelevanceAnnotationInfo import RelevanceAnnotationPostInfo +from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo from core.enums import BatchStatus @@ -232,10 +232,11 @@ async def update_url_metadata_status(self, session: AsyncSession, metadata_ids: url_metadata.validation_status = validation_status @session_manager - async def get_next_url_for_relevance_annotation( + async def get_next_url_for_annotation( self, session: AsyncSession, - user_id: int + user_id: int, + metadata_type: URLMetadataAttributeType ) -> URLAnnotationInfo: # Get a URL, its relevancy metadata ID, and HTML data # For a URL which has not yet been annotated by this user id @@ -246,10 +247,11 @@ async def get_next_url_for_relevance_annotation( URL.id.label("url_id"), URL.url, URLMetadata.id.label("metadata_id"), + URLMetadata.value, ) .join(URLMetadata) # Metadata must be relevant - .where(URLMetadata.attribute == URLMetadataAttributeType.RELEVANT.value) + .where(URLMetadata.attribute == metadata_type.value) # Metadata must not be validated .where(URLMetadata.validation_status == ValidationStatus.PENDING_VALIDATION.value) # URL must have HTML content entries @@ -274,6 +276,7 @@ async def get_next_url_for_relevance_annotation( select( subquery.c.url, subquery.c.metadata_id, + subquery.c.value, URLHTMLContent.content_type, URLHTMLContent.content, ) @@ -291,9 +294,10 @@ async def get_next_url_for_relevance_annotation( annotation_info = URLAnnotationInfo( url=result[0][0], metadata_id=result[0][1], + suggested_value=result[0][2], html_infos=[] ) - for _, _, content_type, content in result: + for _, _, _, content_type, content in result: html_info = URLHTMLContentInfo( content_type=content_type, content=content @@ -307,11 +311,12 @@ async def add_relevance_annotation( session: AsyncSession, user_id: int, metadata_id: int, - annotation_info: RelevanceAnnotationPostInfo): + annotation: str + ): annotation = MetadataAnnotation( metadata_id=metadata_id, user_id=user_id, - value=str(annotation_info.is_relevant) + value=annotation ) session.add(annotation) diff --git a/collector_db/DTOs/URLAnnotationInfo.py b/collector_db/DTOs/URLAnnotationInfo.py index 54792dfc..844b226d 100644 --- a/collector_db/DTOs/URLAnnotationInfo.py +++ b/collector_db/DTOs/URLAnnotationInfo.py @@ -6,4 +6,5 @@ class URLAnnotationInfo(BaseModel): metadata_id: int url: str - html_infos: list[URLHTMLContentInfo] \ No newline at end of file + html_infos: list[URLHTMLContentInfo] + suggested_value: str \ No newline at end of file diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index dc756fb3..c042e10c 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -1,8 +1,8 @@ from sqlalchemy import Select, select, exists, Table, func, Subquery -from collector_db.enums import URLMetadataAttributeType -from collector_db.models import URL, URLHTMLContent, URLMetadata +from collector_db.enums import URLMetadataAttributeType, ValidationStatus +from collector_db.models import URL, URLHTMLContent, URLMetadata, MetadataAnnotation from collector_manager.enums import URLStatus @@ -33,6 +33,22 @@ def exclude_urls_with_select_metadata( ) )) + @staticmethod + def exclude_url_annotated_by_user( + statement: Select, + user_id: int + ) -> Select: + return (statement.where( + ~exists( + select(MetadataAnnotation.id). + where( + MetadataAnnotation.metadata_id == URLMetadata.id, + MetadataAnnotation.user_id == user_id + ) + ) + )) + + @staticmethod def simple_count_subquery(model, attribute: str, label: str) -> Subquery: attr_value = getattr(model, attribute) diff --git a/core/AsyncCore.py b/core/AsyncCore.py index afa5c7ab..6ab9fcf5 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -3,12 +3,11 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.DTOs.URLAnnotationInfo import URLAnnotationInfo -from collector_db.enums import TaskType -from core.DTOs.GetNextURLForRelevanceAnnotationResponse import GetNextURLForRelevanceAnnotationResponse +from collector_db.enums import TaskType, URLMetadataAttributeType +from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo -from core.DTOs.RelevanceAnnotationInfo import RelevanceAnnotationPostInfo -from core.DTOs.RelevanceAnnotationRequestInfo import RelevanceAnnotationRequestInfo +from core.DTOs.AnnotationRequestInfo import AnnotationRequestInfo from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator @@ -66,39 +65,62 @@ async def run_tasks(self): await self.run_url_relevance_huggingface_task() await self.run_url_record_type_task() - async def convert_to_relevance_annotation_request_info(self, url_info: URLAnnotationInfo) -> RelevanceAnnotationRequestInfo: + async def convert_to_annotation_request_info(self, url_info: URLAnnotationInfo) -> AnnotationRequestInfo: response_html_info = convert_to_response_html_info( html_content_infos=url_info.html_infos ) - return RelevanceAnnotationRequestInfo( + return AnnotationRequestInfo( url=url_info.url, metadata_id=url_info.metadata_id, - html_info=response_html_info + html_info=response_html_info, + suggested_value=url_info.suggested_value ) - async def get_next_url_for_relevance_annotation(self, user_id: int) -> GetNextURLForRelevanceAnnotationResponse: - response = GetNextURLForRelevanceAnnotationResponse() - ua_info: URLAnnotationInfo = await self.adb_client.get_next_url_for_relevance_annotation(user_id=user_id) + async def get_next_url_for_annotation(self, user_id: int, metadata_type: URLMetadataAttributeType) -> GetNextURLForAnnotationResponse: + response = GetNextURLForAnnotationResponse() + ua_info: URLAnnotationInfo = await self.adb_client.get_next_url_for_annotation( + user_id=user_id, + metadata_type=metadata_type + ) if ua_info is None: return response # Format result - result = await self.convert_to_relevance_annotation_request_info(url_info=ua_info) + result = await self.convert_to_annotation_request_info(url_info=ua_info) response.next_annotation = result return response + async def submit_and_get_next_url_for_annotation( + self, + user_id: int, + metadata_id: int, + annotation: str, + metadata_type: URLMetadataAttributeType + ) -> GetNextURLForAnnotationResponse: + await self.submit_url_annotation( + user_id=user_id, + metadata_id=metadata_id, + annotation=annotation, + metadata_type=metadata_type + ) + result = await self.get_next_url_for_annotation( + user_id=user_id, + metadata_type=metadata_type + ) + return result - async def submit_url_relevance_annotation( + async def submit_url_annotation( self, user_id: int, metadata_id: int, - annotation: RelevanceAnnotationPostInfo - ) -> GetNextURLForRelevanceAnnotationResponse: + annotation: str, + metadata_type: URLMetadataAttributeType + ) -> GetNextURLForAnnotationResponse: await self.adb_client.add_relevance_annotation( user_id=user_id, metadata_id=metadata_id, - annotation_info=annotation) - return await self.get_next_url_for_relevance_annotation(user_id=user_id) + annotation=annotation) + return await self.get_next_url_for_annotation(user_id=user_id, metadata_type=metadata_type) async def get_urls(self, page: int, errors: bool) -> GetURLsResponseInfo: return await self.adb_client.get_urls(page=page, errors=errors) diff --git a/core/DTOs/RelevanceAnnotationRequestInfo.py b/core/DTOs/AnnotationRequestInfo.py similarity index 57% rename from core/DTOs/RelevanceAnnotationRequestInfo.py rename to core/DTOs/AnnotationRequestInfo.py index de4036db..1e886ae8 100644 --- a/core/DTOs/RelevanceAnnotationRequestInfo.py +++ b/core/DTOs/AnnotationRequestInfo.py @@ -3,7 +3,8 @@ from html_tag_collector.DataClassTags import ResponseHTMLInfo -class RelevanceAnnotationRequestInfo(BaseModel): +class AnnotationRequestInfo(BaseModel): url: str metadata_id: int - html_info: ResponseHTMLInfo \ No newline at end of file + html_info: ResponseHTMLInfo + suggested_value: str \ No newline at end of file diff --git a/core/DTOs/GetNextURLForAnnotationResponse.py b/core/DTOs/GetNextURLForAnnotationResponse.py new file mode 100644 index 00000000..b4bc1087 --- /dev/null +++ b/core/DTOs/GetNextURLForAnnotationResponse.py @@ -0,0 +1,9 @@ +from typing import Optional + +from pydantic import BaseModel + +from core.DTOs.AnnotationRequestInfo import AnnotationRequestInfo + + +class GetNextURLForAnnotationResponse(BaseModel): + next_annotation: Optional[AnnotationRequestInfo] = None diff --git a/core/DTOs/GetNextURLForRelevanceAnnotationResponse.py b/core/DTOs/GetNextURLForRelevanceAnnotationResponse.py deleted file mode 100644 index a58a4565..00000000 --- a/core/DTOs/GetNextURLForRelevanceAnnotationResponse.py +++ /dev/null @@ -1,9 +0,0 @@ -from typing import Optional - -from pydantic import BaseModel - -from core.DTOs.RelevanceAnnotationRequestInfo import RelevanceAnnotationRequestInfo - - -class GetNextURLForRelevanceAnnotationResponse(BaseModel): - next_annotation: Optional[RelevanceAnnotationRequestInfo] = None diff --git a/core/DTOs/RecordTypeAnnotationPostInfo.py b/core/DTOs/RecordTypeAnnotationPostInfo.py new file mode 100644 index 00000000..87e8b674 --- /dev/null +++ b/core/DTOs/RecordTypeAnnotationPostInfo.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel + +from core.enums import RecordType + + +class RecordTypeAnnotationPostInfo(BaseModel): + record_type: RecordType \ No newline at end of file diff --git a/core/DTOs/RelevanceAnnotationInfo.py b/core/DTOs/RelevanceAnnotationPostInfo.py similarity index 100% rename from core/DTOs/RelevanceAnnotationInfo.py rename to core/DTOs/RelevanceAnnotationPostInfo.py diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index 220b6645..5ff2f239 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -12,13 +12,14 @@ from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse -from core.DTOs.GetNextURLForRelevanceAnnotationResponse import GetNextURLForRelevanceAnnotationResponse +from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo from core.DTOs.MessageCountResponse import MessageCountResponse from core.DTOs.MessageResponse import MessageResponse -from core.DTOs.RelevanceAnnotationInfo import RelevanceAnnotationPostInfo +from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo +from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo from core.enums import BatchStatus from util.helper_functions import update_if_not_none @@ -175,22 +176,39 @@ def process_relevancy(self) -> MessageCountResponse: ) return MessageCountResponse(**data) - def get_next_relevance_annotation(self) -> GetNextURLForRelevanceAnnotationResponse: + def get_next_relevance_annotation(self) -> GetNextURLForAnnotationResponse: data = self.get( url=f"/annotate/relevance" ) - return GetNextURLForRelevanceAnnotationResponse(**data) + return GetNextURLForAnnotationResponse(**data) + + def get_next_record_type_annotation(self) -> GetNextURLForAnnotationResponse: + data = self.get( + url=f"/annotate/record-type" + ) + return GetNextURLForAnnotationResponse(**data) + + def post_record_type_annotation_and_get_next( + self, + metadata_id: int, + record_type_annotation_post_info: RecordTypeAnnotationPostInfo + ) -> GetNextURLForAnnotationResponse: + data = self.post( + url=f"/annotate/record-type/{metadata_id}", + json=record_type_annotation_post_info.model_dump() + ) + return GetNextURLForAnnotationResponse(**data) def post_relevance_annotation_and_get_next( self, metadata_id: int, relevance_annotation_post_info: RelevanceAnnotationPostInfo - ) -> GetNextURLForRelevanceAnnotationResponse: + ) -> GetNextURLForAnnotationResponse: data = self.post( url=f"/annotate/relevance/{metadata_id}", json=relevance_annotation_post_info.model_dump() ) - return GetNextURLForRelevanceAnnotationResponse(**data) + return GetNextURLForAnnotationResponse(**data) def get_urls(self, page: int = 1, errors: bool = False) -> GetURLsResponseInfo: data = self.get( diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/test_automated/integration/api/test_annotate.py index 5b8730cf..899c7f28 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/test_automated/integration/api/test_annotate.py @@ -1,14 +1,23 @@ +from typing import Any + import pytest from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource -from core.DTOs.GetNextURLForRelevanceAnnotationResponse import GetNextURLForRelevanceAnnotationResponse -from core.DTOs.RelevanceAnnotationInfo import RelevanceAnnotationPostInfo +from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse +from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo +from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo +from core.enums import RecordType from tests.test_automated.integration.api.conftest import MOCK_USER_ID - -@pytest.mark.asyncio -async def test_annotate(api_test_helper): +async def run_annotation_test( + api_test_helper, + submit_and_get_next_function: callable, + get_next_function: callable, + post_info: Any, + metadata_attribute: URLMetadataAttributeType, + expected_metadata_value: str +): ath = api_test_helper # Create batch with status `in-process` and strategy `example` @@ -20,7 +29,7 @@ async def test_annotate(api_test_helper): url_2 = iui.url_mappings[1] kwargs = { - "attribute": URLMetadataAttributeType.RELEVANT, + "attribute": metadata_attribute, "validation_status": ValidationStatus.PENDING_VALIDATION, "validation_source": ValidationSource.MACHINE_LEARNING } @@ -39,20 +48,18 @@ async def test_annotate(api_test_helper): # Add HTML data to both await ath.db_data_creator.html_data([url_1.url_id, url_2.url_id]) # Call `GET` `/annotate/url` and receive next URL - request_info_1: GetNextURLForRelevanceAnnotationResponse = ath.request_validator.get_next_relevance_annotation() + request_info_1: GetNextURLForAnnotationResponse = get_next_function() inner_info_1 = request_info_1.next_annotation # Validate presence of HTML data in `html` field assert inner_info_1.html_info.description != "" assert inner_info_1.html_info.title != "" + assert inner_info_1.suggested_value == "False" - post_info = RelevanceAnnotationPostInfo( - is_relevant=True - ) # Call `POST` `/annotate/url` with finished annotation, and receive next URL - request_info_2 = ath.request_validator.post_relevance_annotation_and_get_next( - metadata_id=inner_info_1.metadata_id, - relevance_annotation_post_info=post_info + request_info_2 = submit_and_get_next_function( + inner_info_1.metadata_id, + post_info ) inner_info_2 = request_info_2.next_annotation # Confirm 2nd URL is distinct from 1st @@ -68,7 +75,7 @@ async def test_annotate(api_test_helper): ) assert len(results) == 1 assert results[0].user_id == MOCK_USER_ID - assert results[0].value == "True" + assert results[0].value == expected_metadata_value # Submit this one in turn, and no subsequent annotation info should be returned request_info_3 = ath.request_validator.post_relevance_annotation_and_get_next( @@ -76,4 +83,30 @@ async def test_annotate(api_test_helper): relevance_annotation_post_info=post_info ) - assert request_info_3.next_annotation is None \ No newline at end of file + assert request_info_3.next_annotation is None + +@pytest.mark.asyncio +async def test_annotate_relevancy(api_test_helper): + await run_annotation_test( + api_test_helper=api_test_helper, + submit_and_get_next_function=api_test_helper.request_validator.post_relevance_annotation_and_get_next, + get_next_function=api_test_helper.request_validator.get_next_relevance_annotation, + post_info=RelevanceAnnotationPostInfo( + is_relevant=True + ), + metadata_attribute=URLMetadataAttributeType.RELEVANT, + expected_metadata_value="True" + ) + +@pytest.mark.asyncio +async def test_annotate_record_type(api_test_helper): + await run_annotation_test( + api_test_helper=api_test_helper, + submit_and_get_next_function=api_test_helper.request_validator.post_record_type_annotation_and_get_next, + get_next_function=api_test_helper.request_validator.get_next_record_type_annotation, + post_info=RecordTypeAnnotationPostInfo( + record_type=RecordType.ACCIDENT_REPORTS + ), + metadata_attribute=URLMetadataAttributeType.RECORD_TYPE, + expected_metadata_value=RecordType.ACCIDENT_REPORTS.value + ) From d6efb62a35210d4de9a6e530b994d07def5aa33e Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 31 Jan 2025 11:42:12 -0500 Subject: [PATCH 037/244] Draft work --- .../integration/api/helpers/RequestValidator.py | 4 ++-- tests/test_automated/integration/api/test_annotate.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index 5ff2f239..d3e60e1d 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -195,7 +195,7 @@ def post_record_type_annotation_and_get_next( ) -> GetNextURLForAnnotationResponse: data = self.post( url=f"/annotate/record-type/{metadata_id}", - json=record_type_annotation_post_info.model_dump() + json=record_type_annotation_post_info.model_dump(mode='json') ) return GetNextURLForAnnotationResponse(**data) @@ -206,7 +206,7 @@ def post_relevance_annotation_and_get_next( ) -> GetNextURLForAnnotationResponse: data = self.post( url=f"/annotate/relevance/{metadata_id}", - json=relevance_annotation_post_info.model_dump() + json=relevance_annotation_post_info.model_dump(mode='json') ) return GetNextURLForAnnotationResponse(**data) diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/test_automated/integration/api/test_annotate.py index 899c7f28..1ee03963 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/test_automated/integration/api/test_annotate.py @@ -78,9 +78,9 @@ async def run_annotation_test( assert results[0].value == expected_metadata_value # Submit this one in turn, and no subsequent annotation info should be returned - request_info_3 = ath.request_validator.post_relevance_annotation_and_get_next( - metadata_id=inner_info_2.metadata_id, - relevance_annotation_post_info=post_info + request_info_3 = submit_and_get_next_function( + inner_info_2.metadata_id, + post_info ) assert request_info_3.next_annotation is None From 88df8d585530f879319b9e077dad3d944e0760f1 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 31 Jan 2025 11:45:34 -0500 Subject: [PATCH 038/244] Update container python version --- .github/workflows/test_app.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index c83608ac..e16d1771 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -21,7 +21,7 @@ jobs: container-job: runs-on: ubuntu-latest timeout-minutes: 20 - container: python:3.12.8 + container: python:3.11.9 services: postgres: From 14e3d66ad8191ef6ce2a1e6158a74e044a8db3dc Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sun, 2 Feb 2025 10:46:01 -0500 Subject: [PATCH 039/244] Create new table: `url_agency_suggestions` --- ...19bf57df581a_add_url_agency_suggestions.py | 40 +++++++++++++++++++ collector_db/models.py | 36 +++++++++++++++-- tests/test_alembic/test_revisions.py | 12 +++++- 3 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 collector_db/alembic/versions/19bf57df581a_add_url_agency_suggestions.py diff --git a/collector_db/alembic/versions/19bf57df581a_add_url_agency_suggestions.py b/collector_db/alembic/versions/19bf57df581a_add_url_agency_suggestions.py new file mode 100644 index 00000000..56d47427 --- /dev/null +++ b/collector_db/alembic/versions/19bf57df581a_add_url_agency_suggestions.py @@ -0,0 +1,40 @@ +"""Add url_agency_suggestions + +Revision ID: 19bf57df581a +Revises: 072b32a45b1c +Create Date: 2025-02-02 10:33:02.029875 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from collector_db.enums import PGEnum +# revision identifiers, used by Alembic. +revision: str = '19bf57df581a' +down_revision: Union[str, None] = '072b32a45b1c' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +suggestion_type_enum = PGEnum('Suggestion', 'Unknown', 'New Agency', 'Confirmed', name='url_agency_suggestion_type') + +def upgrade() -> None: + op.create_table('url_agency_suggestions', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('url_id', sa.Integer(), nullable=False), + sa.Column('suggestion_type', suggestion_type_enum, nullable=False), + sa.Column('agency_id', sa.Integer(), nullable=True), + sa.Column('agency_name', sa.String(), nullable=False), + sa.Column('state', sa.String(), nullable=True), + sa.Column('county', sa.String(), nullable=True), + sa.Column('locality', sa.String(), nullable=True), + sa.Column('updated_at', sa.TIMESTAMP(), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['url_id'], ['urls.id'], ), + sa.PrimaryKeyConstraint('id') + ) + + +def downgrade() -> None: + op.drop_table('url_agency_suggestions') + suggestion_type_enum.drop(op.get_bind(), checkfirst=True) diff --git a/collector_db/models.py b/collector_db/models.py index aa33d41e..6ca04846 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -90,6 +90,7 @@ class URL(Base): secondary="link_task_urls", back_populates="urls", ) + agency_suggestions = relationship("URLAgencySuggestion", back_populates="url", cascade="all, delete-orphan") # URL Metadata table definition @@ -98,11 +99,11 @@ class URLMetadata(Base): __table_args__ = (UniqueConstraint( "url_id", "attribute", - name="model_num2_key"), + name="uq_url_id_attribute"), ) id = Column(Integer, primary_key=True) - url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) + url_id = Column(Integer, ForeignKey('urls.id', name='url_metadata_url_id_fkey'), nullable=False) attribute = Column( PGEnum('Record Type', 'Agency', 'Relevant', name='url_attribute'), nullable=False) @@ -143,7 +144,7 @@ class MetadataAnnotation(Base): url_metadata = relationship("URLMetadata", back_populates="annotations") class RootURL(Base): - __tablename__ = 'root_urls' + __tablename__ = 'root_url_cache' __table_args__ = ( UniqueConstraint( "url", @@ -276,6 +277,8 @@ class LinkTaskURL(Base): task_id = Column(Integer, ForeignKey('tasks.id', ondelete="CASCADE"), primary_key=True) url_id = Column(Integer, ForeignKey('urls.id', ondelete="CASCADE"), primary_key=True) + + class TaskError(Base): __tablename__ = 'task_errors' @@ -291,4 +294,29 @@ class TaskError(Base): "task_id", "error", name="uq_task_id_error"), - ) \ No newline at end of file + ) + +class URLAgencySuggestion(Base): + __tablename__ = 'url_agency_suggestions' + + id = Column(Integer, primary_key=True) + url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) + suggestion_type = Column( + PGEnum( + 'Suggestion', + 'Unknown', + 'New Agency', + 'Confirmed', + name='url_agency_suggestion_type' + ), + nullable=False + ) + agency_id = Column(Integer, nullable=True) + agency_name = Column(String, nullable=False) + state = Column(String, nullable=True) + county = Column(String, nullable=True) + locality = Column(String, nullable=True) + updated_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) + + # Relationships + url = relationship("URL", back_populates="agency_suggestions") \ No newline at end of file diff --git a/tests/test_alembic/test_revisions.py b/tests/test_alembic/test_revisions.py index 22a83496..e94f4180 100644 --- a/tests/test_alembic/test_revisions.py +++ b/tests/test_alembic/test_revisions.py @@ -334,4 +334,14 @@ def test_add_task_tables_and_linking_logic(alembic_runner): alembic_runner, table_name="url_metadata", columns_to_check=["notes"], - ) \ No newline at end of file + ) + +def test_add_url_agency_suggestions(alembic_runner): + table_creation_check( + alembic_runner, + tables=[ + "url_agency_suggestions" + ], + start_revision="072b32a45b1c", + end_revision="19bf57df581a" + ) From f73c084c7fd4e7eed55941fd9cd89e13cfce7baf Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 4 Feb 2025 19:50:23 -0500 Subject: [PATCH 040/244] Move alembic to standalone directory. --- alembic.ini | 2 +- {collector_db/alembic => alembic}/README.md | 0 {collector_db/alembic => alembic}/env.py | 0 {collector_db/alembic => alembic}/script.py.mako | 0 .../072b32a45b1c_add_task_tables_and_linking_logic.py | 0 .../108dac321086_update_metadata_validation_status.py | 0 .../versions/19bf57df581a_add_url_agency_suggestions.py | 8 +++++++- ...fa_create_url_error_info_table_and_url_error_status.py | 0 .../versions/86692fc1d862_add_url_metadata_table.py | 0 .../9afd8a5633c9_create_htmlcontent_and_rooturl_tables.py | 0 .../versions/a4750e7ff8e7_add_updated_at_to_url_table.py | 0 .../versions/d11f07224d1f_initial_creation.py | 0 .../versions/dae00e5aa8dd_create_rooturlcache.py | 0 ...db6d60feda7d_convert_batch_strategy_status_to_enums.py | 0 .../dcd158092de0_create_metadata_annotation_table.py | 0 .../versions/e27c5f8409a3_convert_url_outcome_to_enum.py | 0 16 files changed, 8 insertions(+), 2 deletions(-) rename {collector_db/alembic => alembic}/README.md (100%) rename {collector_db/alembic => alembic}/env.py (100%) rename {collector_db/alembic => alembic}/script.py.mako (100%) rename {collector_db/alembic => alembic}/versions/072b32a45b1c_add_task_tables_and_linking_logic.py (100%) rename {collector_db/alembic => alembic}/versions/108dac321086_update_metadata_validation_status.py (100%) rename {collector_db/alembic => alembic}/versions/19bf57df581a_add_url_agency_suggestions.py (89%) rename {collector_db/alembic => alembic}/versions/5a5ca06f36fa_create_url_error_info_table_and_url_error_status.py (100%) rename {collector_db/alembic => alembic}/versions/86692fc1d862_add_url_metadata_table.py (100%) rename {collector_db/alembic => alembic}/versions/9afd8a5633c9_create_htmlcontent_and_rooturl_tables.py (100%) rename {collector_db/alembic => alembic}/versions/a4750e7ff8e7_add_updated_at_to_url_table.py (100%) rename {collector_db/alembic => alembic}/versions/d11f07224d1f_initial_creation.py (100%) rename {collector_db/alembic => alembic}/versions/dae00e5aa8dd_create_rooturlcache.py (100%) rename {collector_db/alembic => alembic}/versions/db6d60feda7d_convert_batch_strategy_status_to_enums.py (100%) rename {collector_db/alembic => alembic}/versions/dcd158092de0_create_metadata_annotation_table.py (100%) rename {collector_db/alembic => alembic}/versions/e27c5f8409a3_convert_url_outcome_to_enum.py (100%) diff --git a/alembic.ini b/alembic.ini index 7cc1a0d5..9daecaa2 100644 --- a/alembic.ini +++ b/alembic.ini @@ -3,7 +3,7 @@ [alembic] # path to migration scripts # Use forward slashes (/) also on windows to provide an os agnostic path -script_location = collector_db/alembic +script_location = alembic # template used to generate migration file names; The default value is %%(rev)s_%%(slug)s # Uncomment the line below if you want the files to be prepended with date and time diff --git a/collector_db/alembic/README.md b/alembic/README.md similarity index 100% rename from collector_db/alembic/README.md rename to alembic/README.md diff --git a/collector_db/alembic/env.py b/alembic/env.py similarity index 100% rename from collector_db/alembic/env.py rename to alembic/env.py diff --git a/collector_db/alembic/script.py.mako b/alembic/script.py.mako similarity index 100% rename from collector_db/alembic/script.py.mako rename to alembic/script.py.mako diff --git a/collector_db/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py b/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py similarity index 100% rename from collector_db/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py rename to alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py diff --git a/collector_db/alembic/versions/108dac321086_update_metadata_validation_status.py b/alembic/versions/108dac321086_update_metadata_validation_status.py similarity index 100% rename from collector_db/alembic/versions/108dac321086_update_metadata_validation_status.py rename to alembic/versions/108dac321086_update_metadata_validation_status.py diff --git a/collector_db/alembic/versions/19bf57df581a_add_url_agency_suggestions.py b/alembic/versions/19bf57df581a_add_url_agency_suggestions.py similarity index 89% rename from collector_db/alembic/versions/19bf57df581a_add_url_agency_suggestions.py rename to alembic/versions/19bf57df581a_add_url_agency_suggestions.py index 56d47427..aca55c13 100644 --- a/collector_db/alembic/versions/19bf57df581a_add_url_agency_suggestions.py +++ b/alembic/versions/19bf57df581a_add_url_agency_suggestions.py @@ -17,7 +17,13 @@ depends_on: Union[str, Sequence[str], None] = None -suggestion_type_enum = PGEnum('Suggestion', 'Unknown', 'New Agency', 'Confirmed', name='url_agency_suggestion_type') +suggestion_type_enum = PGEnum( + 'Auto Suggestion', + 'Manual Suggestion', + 'Unknown', + 'New Agency', + 'Confirmed', name='url_agency_suggestion_type' +) def upgrade() -> None: op.create_table('url_agency_suggestions', diff --git a/collector_db/alembic/versions/5a5ca06f36fa_create_url_error_info_table_and_url_error_status.py b/alembic/versions/5a5ca06f36fa_create_url_error_info_table_and_url_error_status.py similarity index 100% rename from collector_db/alembic/versions/5a5ca06f36fa_create_url_error_info_table_and_url_error_status.py rename to alembic/versions/5a5ca06f36fa_create_url_error_info_table_and_url_error_status.py diff --git a/collector_db/alembic/versions/86692fc1d862_add_url_metadata_table.py b/alembic/versions/86692fc1d862_add_url_metadata_table.py similarity index 100% rename from collector_db/alembic/versions/86692fc1d862_add_url_metadata_table.py rename to alembic/versions/86692fc1d862_add_url_metadata_table.py diff --git a/collector_db/alembic/versions/9afd8a5633c9_create_htmlcontent_and_rooturl_tables.py b/alembic/versions/9afd8a5633c9_create_htmlcontent_and_rooturl_tables.py similarity index 100% rename from collector_db/alembic/versions/9afd8a5633c9_create_htmlcontent_and_rooturl_tables.py rename to alembic/versions/9afd8a5633c9_create_htmlcontent_and_rooturl_tables.py diff --git a/collector_db/alembic/versions/a4750e7ff8e7_add_updated_at_to_url_table.py b/alembic/versions/a4750e7ff8e7_add_updated_at_to_url_table.py similarity index 100% rename from collector_db/alembic/versions/a4750e7ff8e7_add_updated_at_to_url_table.py rename to alembic/versions/a4750e7ff8e7_add_updated_at_to_url_table.py diff --git a/collector_db/alembic/versions/d11f07224d1f_initial_creation.py b/alembic/versions/d11f07224d1f_initial_creation.py similarity index 100% rename from collector_db/alembic/versions/d11f07224d1f_initial_creation.py rename to alembic/versions/d11f07224d1f_initial_creation.py diff --git a/collector_db/alembic/versions/dae00e5aa8dd_create_rooturlcache.py b/alembic/versions/dae00e5aa8dd_create_rooturlcache.py similarity index 100% rename from collector_db/alembic/versions/dae00e5aa8dd_create_rooturlcache.py rename to alembic/versions/dae00e5aa8dd_create_rooturlcache.py diff --git a/collector_db/alembic/versions/db6d60feda7d_convert_batch_strategy_status_to_enums.py b/alembic/versions/db6d60feda7d_convert_batch_strategy_status_to_enums.py similarity index 100% rename from collector_db/alembic/versions/db6d60feda7d_convert_batch_strategy_status_to_enums.py rename to alembic/versions/db6d60feda7d_convert_batch_strategy_status_to_enums.py diff --git a/collector_db/alembic/versions/dcd158092de0_create_metadata_annotation_table.py b/alembic/versions/dcd158092de0_create_metadata_annotation_table.py similarity index 100% rename from collector_db/alembic/versions/dcd158092de0_create_metadata_annotation_table.py rename to alembic/versions/dcd158092de0_create_metadata_annotation_table.py diff --git a/collector_db/alembic/versions/e27c5f8409a3_convert_url_outcome_to_enum.py b/alembic/versions/e27c5f8409a3_convert_url_outcome_to_enum.py similarity index 100% rename from collector_db/alembic/versions/e27c5f8409a3_convert_url_outcome_to_enum.py rename to alembic/versions/e27c5f8409a3_convert_url_outcome_to_enum.py From a6dcd00903718140e169ea808397d8f4bf5b554e Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 5 Feb 2025 09:48:30 -0500 Subject: [PATCH 041/244] Add logic for Agency Identification. --- ENV.md | 35 +-- agency_identifier/MuckrockAPIInterface.py | 51 ++++ ...19bf57df581a_add_url_agency_suggestions.py | 25 +- collector_db/AsyncDatabaseClient.py | 61 ++++- collector_db/StatementComposer.py | 10 +- collector_db/enums.py | 1 + collector_db/models.py | 19 +- core/DTOs/URLAgencySuggestionInfo.py | 15 ++ .../AgencyIdentificationTDO.py | 11 + .../AgencyIdentificationTaskOperator.py | 92 +++++++ .../AgencyIdentificationSubtaskBase.py | 16 ++ .../AutoGooglerAgencyIdentificationSubtask.py | 25 ++ .../CKANAgencyIdentificationSubtask.py | 29 ++ ...ommonCrawlerAgencyIdentificationSubtask.py | 23 ++ .../MuckrockAgencyIdentificationSubtask.py | 42 +++ core/classes/subtasks/__init__.py | 0 core/enums.py | 8 + core/exceptions.py | 8 + core/helpers.py | 48 ++++ html_tag_collector/URLRequestInterface.py | 7 - pdap_api_client/AccessManager.py | 104 ++++--- pdap_api_client/DTOs.py | 24 +- pdap_api_client/PDAPClient.py | 45 +++- pdap_api_client/enums.py | 7 + requirements.txt | 1 + tests/helpers/DBDataCreator.py | 26 +- tests/manual/agency_identifier/__init__.py | 0 .../test_muckrock_api_interface.py | 16 ++ tests/manual/pdap_client/__init__.py | 0 .../manual/pdap_client/test_access_manager.py | 23 ++ tests/manual/pdap_client/test_pdap_client.py | 23 ++ .../api/helpers/RequestValidator.py | 4 +- .../integration/api/test_annotate.py | 6 +- .../tasks/test_agency_preannotation_task.py | 255 ++++++++++++++++++ util/helper_functions.py | 4 +- 35 files changed, 977 insertions(+), 87 deletions(-) create mode 100644 agency_identifier/MuckrockAPIInterface.py create mode 100644 core/DTOs/URLAgencySuggestionInfo.py create mode 100644 core/DTOs/task_data_objects/AgencyIdentificationTDO.py create mode 100644 core/classes/AgencyIdentificationTaskOperator.py create mode 100644 core/classes/subtasks/AgencyIdentificationSubtaskBase.py create mode 100644 core/classes/subtasks/AutoGooglerAgencyIdentificationSubtask.py create mode 100644 core/classes/subtasks/CKANAgencyIdentificationSubtask.py create mode 100644 core/classes/subtasks/CommonCrawlerAgencyIdentificationSubtask.py create mode 100644 core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py create mode 100644 core/classes/subtasks/__init__.py create mode 100644 pdap_api_client/enums.py create mode 100644 tests/manual/agency_identifier/__init__.py create mode 100644 tests/manual/agency_identifier/test_muckrock_api_interface.py create mode 100644 tests/manual/pdap_client/__init__.py create mode 100644 tests/manual/pdap_client/test_access_manager.py create mode 100644 tests/manual/pdap_client/test_pdap_client.py create mode 100644 tests/test_automated/integration/tasks/test_agency_preannotation_task.py diff --git a/ENV.md b/ENV.md index 943ad293..8fd30c33 100644 --- a/ENV.md +++ b/ENV.md @@ -2,18 +2,23 @@ This page provides a full list, with description, of all the environment variabl Please ensure these are properly defined in a `.env` file in the root directory. -| Name | Description | Example | -|--------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------| -| `LABEL_STUDIO_ACCESS_TOKEN` | The access token for the Label Studio API. The access token for the Label Studio API. This can be obtained by logging into Label Studio and navigating to the [user account section](https://app.heartex.com/user/account), where the access token can be copied. | `abc123` | -| `LABEL_STUDIO_PROJECT_ID` | The project ID for the Label Studio API. This can be obtained by logging into Label Studio and navigating to the relevant project, where the project id will be in the URL, as in `https://app.heartex.com/projects/58475/` | `58475` | -| `LABEL_STUDIO_ORGANIZATION_ID` | The organization ID for the Label Studio API. This can be obtained by logging into Label Studio and navigating to the [Organization section](https://app.heartex.com/organization?page=1), where the organization ID can be copied. | `6758` | -| `GOOGLE_API_KEY` | The API key required for accessing the Google Custom Search API | `abc123` | -| `GOOGLE_CSE_ID` | The CSE ID required for accessing the Google Custom Search API | `abc123` | -|`POSTGRES_USER` | The username for the test database | `test_source_collector_user` | -|`POSTGRES_PASSWORD` | The password for the test database | `HanviliciousHamiltonHilltops` | -|`POSTGRES_DB` | The database name for the test database | `source_collector_test_db` | -|`POSTGRES_HOST` | The host for the test database | `127.0.0.1` | -|`POSTGRES_PORT` | The port for the test database | `5432` | -|`DS_APP_SECRET_KEY`| The secret key used for decoding JWT tokens produced by the Data Sources App. Must match the secret token that is used in the Data Sources App for encoding. |`abc123`| -|`DEV`| Set to any value to run the application in development mode. |`true`| -|'DEEPSEEK_API_KEY'| The API key required for accessing the DeepSeek API. |`abc123`| +| Name | Description | Example | +|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------| +| `LABEL_STUDIO_ACCESS_TOKEN` | The access token for the Label Studio API. The access token for the Label Studio API. This can be obtained by logging into Label Studio and navigating to the [user account section](https://app.heartex.com/user/account), where the access token can be copied. | `abc123` | +| `LABEL_STUDIO_PROJECT_ID` | The project ID for the Label Studio API. This can be obtained by logging into Label Studio and navigating to the relevant project, where the project id will be in the URL, as in `https://app.heartex.com/projects/58475/` | `58475` | +| `LABEL_STUDIO_ORGANIZATION_ID` | The organization ID for the Label Studio API. This can be obtained by logging into Label Studio and navigating to the [Organization section](https://app.heartex.com/organization?page=1), where the organization ID can be copied. | `6758` | +| `GOOGLE_API_KEY` | The API key required for accessing the Google Custom Search API | `abc123` | +| `GOOGLE_CSE_ID` | The CSE ID required for accessing the Google Custom Search API | `abc123` | +|`POSTGRES_USER` | The username for the test database | `test_source_collector_user` | +|`POSTGRES_PASSWORD` | The password for the test database | `HanviliciousHamiltonHilltops` | +|`POSTGRES_DB` | The database name for the test database | `source_collector_test_db` | +|`POSTGRES_HOST` | The host for the test database | `127.0.0.1` | +|`POSTGRES_PORT` | The port for the test database | `5432` | +|`DS_APP_SECRET_KEY`| The secret key used for decoding JWT tokens produced by the Data Sources App. Must match the secret token that is used in the Data Sources App for encoding. | `abc123` | +|`DEV`| Set to any value to run the application in development mode. | `true` | +|`DEEPSEEK_API_KEY`| The API key required for accessing the DeepSeek API. | `abc123` | +|`OPENAI_API_KEY`| The API key required for accessing the OpenAI API.| `abc123` | +|`PDAP_EMAIL`| An email address for accessing the PDAP API.| `abc123@test.com` | +|`PDAP_PASSWORD`| A password for accessing the PDAP API.| `abc123` | +|`PDAP_API_KEY`| An API key for accessing the PDAP API.| `abc123` | + diff --git a/agency_identifier/MuckrockAPIInterface.py b/agency_identifier/MuckrockAPIInterface.py new file mode 100644 index 00000000..bbc56ee7 --- /dev/null +++ b/agency_identifier/MuckrockAPIInterface.py @@ -0,0 +1,51 @@ +from enum import Enum +from typing import Optional + +import requests +from aiohttp import ClientSession +from pydantic import BaseModel + + +class AgencyLookupResponseType(Enum): + FOUND = "found" + NOT_FOUND = "not_found" + ERROR = "error" + +class AgencyLookupResponse(BaseModel): + name: Optional[str] + type: AgencyLookupResponseType + error: Optional[str] = None + + + +class MuckrockAPIInterface: + + def __init__(self, session: ClientSession): + self.base_url = "https://www.muckrock.com/api_v1/" + self.session = session + + def build_url(self, subpath: str): + return f"{self.base_url}{subpath}" + + + async def lookup_agency(self, muckrock_agency_id: int) -> AgencyLookupResponse: + url = self.build_url(f"agency/{muckrock_agency_id}") + try: + async with self.session.get(url) as results: + results.raise_for_status() + json = await results.json() + name = json["name"] + return AgencyLookupResponse( + name=name, type=AgencyLookupResponseType.FOUND + ) + except requests.exceptions.HTTPError as e: + return AgencyLookupResponse( + name=None, + type=AgencyLookupResponseType.ERROR, + error=str(e) + ) + except KeyError: + return AgencyLookupResponse( + name=None, type=AgencyLookupResponseType.NOT_FOUND + ) + diff --git a/alembic/versions/19bf57df581a_add_url_agency_suggestions.py b/alembic/versions/19bf57df581a_add_url_agency_suggestions.py index aca55c13..608fcd1b 100644 --- a/alembic/versions/19bf57df581a_add_url_agency_suggestions.py +++ b/alembic/versions/19bf57df581a_add_url_agency_suggestions.py @@ -25,13 +25,31 @@ 'Confirmed', name='url_agency_suggestion_type' ) +old_task_options = ( + 'HTML', + 'Relevancy', + 'Record Type', +) +new_task_options = old_task_options + ('Agency Identification',) + +old_task_type_enum = PGEnum( + *old_task_options, + name='task_type_old' +) + +new_task_type_enum = PGEnum( + *new_task_options, + name='task_type' +) + def upgrade() -> None: + op.execute("ALTER TYPE task_type ADD VALUE 'Agency Identification';") op.create_table('url_agency_suggestions', sa.Column('id', sa.Integer(), nullable=False), sa.Column('url_id', sa.Integer(), nullable=False), sa.Column('suggestion_type', suggestion_type_enum, nullable=False), sa.Column('agency_id', sa.Integer(), nullable=True), - sa.Column('agency_name', sa.String(), nullable=False), + sa.Column('agency_name', sa.String(), nullable=True), sa.Column('state', sa.String(), nullable=True), sa.Column('county', sa.String(), nullable=True), sa.Column('locality', sa.String(), nullable=True), @@ -44,3 +62,8 @@ def upgrade() -> None: def downgrade() -> None: op.drop_table('url_agency_suggestions') suggestion_type_enum.drop(op.get_bind(), checkfirst=True) + old_task_type_enum.create(op.get_bind()) + op.execute("DELETE FROM TASKS;") + op.execute("ALTER TABLE tasks ALTER COLUMN task_type TYPE task_type_old USING task_type::text::task_type_old;") + new_task_type_enum.drop(op.get_bind(), checkfirst=True) + op.execute("ALTER TYPE task_type_old RENAME TO task_type;") diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 04d40a82..de3c7f3d 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -18,12 +18,14 @@ from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource, TaskType from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import URLMetadata, URL, URLErrorInfo, URLHTMLContent, Base, MetadataAnnotation, \ - RootURL, Task, TaskError, LinkTaskURL -from collector_manager.enums import URLStatus + RootURL, Task, TaskError, LinkTaskURL, URLAgencySuggestion, Batch +from collector_manager.enums import URLStatus, CollectorType from core.DTOs.GetTasksResponse import GetTasksResponse, GetTasksResponseTaskInfo from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseMetadataInfo, GetURLsResponseErrorInfo, \ GetURLsResponseInnerInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo +from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO from core.enums import BatchStatus @@ -566,3 +568,58 @@ async def get_tasks( return GetTasksResponse( tasks=final_results ) + + @session_manager + async def has_urls_without_agency_suggestions( + self, + session: AsyncSession + ) -> bool: + statement = ( + select( + URL.id + )) + statement = self.statement_composer.exclude_urls_with_agency_suggestions(statement) + raw_result = await session.execute(statement) + result = raw_result.all() + return len(result) != 0 + + @session_manager + async def get_urls_without_agency_suggestions(self, session: AsyncSession) -> list[AgencyIdentificationTDO]: + statement = ( + select( + URL.id, + URL.collector_metadata, + Batch.strategy, + ).join(Batch) + ) + statement = self.statement_composer.exclude_urls_with_agency_suggestions(statement) + statement = statement.limit(100) + raw_results = await session.execute(statement) + return [ + AgencyIdentificationTDO( + url_id=raw_result[0], + collector_metadata=raw_result[1], + collector_type=CollectorType(raw_result[2]) + ) + for raw_result in raw_results + ] + + @session_manager + async def add_agency_suggestions( + self, + session: AsyncSession, + suggestions: list[URLAgencySuggestionInfo] + ): + for suggestion in suggestions: + url_agency_suggestion = URLAgencySuggestion( + url_id=suggestion.url_id, + suggestion_type=suggestion.suggestion_type, + agency_id=suggestion.pdap_agency_id, + agency_name=suggestion.agency_name, + state=suggestion.state, + county=suggestion.county, + locality=suggestion.locality + ) + session.add(url_agency_suggestion) + + await session.commit() \ No newline at end of file diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index c042e10c..a04ed07f 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -2,7 +2,7 @@ from sqlalchemy import Select, select, exists, Table, func, Subquery from collector_db.enums import URLMetadataAttributeType, ValidationStatus -from collector_db.models import URL, URLHTMLContent, URLMetadata, MetadataAnnotation +from collector_db.models import URL, URLHTMLContent, URLMetadata, MetadataAnnotation, URLAgencySuggestion from collector_manager.enums import URLStatus @@ -57,3 +57,11 @@ def simple_count_subquery(model, attribute: str, label: str) -> Subquery: func.count(attr_value).label(label) ).group_by(attr_value).subquery() + @staticmethod + def exclude_urls_with_agency_suggestions( + statement: Select + ): + return (statement.where(~exists( + select(URLAgencySuggestion.id). + where(URLAgencySuggestion.url_id == URL.id) + ))) diff --git a/collector_db/enums.py b/collector_db/enums.py index a6f3c95e..2d82e87b 100644 --- a/collector_db/enums.py +++ b/collector_db/enums.py @@ -36,6 +36,7 @@ class TaskType(PyEnum): HTML = "HTML" RELEVANCY = "Relevancy" RECORD_TYPE = "Record Type" + AGENCY_IDENTIFICATION = "Agency Identification" class PGEnum(TypeDecorator): impl = postgresql.ENUM diff --git a/collector_db/models.py b/collector_db/models.py index 6ca04846..41c50048 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -24,7 +24,13 @@ class Batch(Base): id = Column(Integer, primary_key=True) strategy = Column( postgresql.ENUM( - 'example', 'ckan', 'muckrock_county_search', 'auto_googler', 'muckrock_all_search', 'muckrock_simple_search', 'common_crawler', + 'example', + 'ckan', + 'muckrock_county_search', + 'auto_googler', + 'muckrock_all_search', + 'muckrock_simple_search', + 'common_crawler', name='batch_strategy'), nullable=False) user_id = Column(Integer, nullable=False) @@ -252,7 +258,11 @@ class Task(Base): id = Column(Integer, primary_key=True) task_type = Column( PGEnum( - 'HTML', 'Relevancy', 'Record Type', name='task_type' + 'HTML', + 'Relevancy', + 'Record Type', + 'Agency Identification', + name='task_type' ), nullable=False) task_status = Column(batch_status_enum, nullable=False) updated_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) @@ -303,7 +313,8 @@ class URLAgencySuggestion(Base): url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) suggestion_type = Column( PGEnum( - 'Suggestion', + 'Auto Suggestion', + 'Manual Suggestion' 'Unknown', 'New Agency', 'Confirmed', @@ -312,7 +323,7 @@ class URLAgencySuggestion(Base): nullable=False ) agency_id = Column(Integer, nullable=True) - agency_name = Column(String, nullable=False) + agency_name = Column(String, nullable=True) state = Column(String, nullable=True) county = Column(String, nullable=True) locality = Column(String, nullable=True) diff --git a/core/DTOs/URLAgencySuggestionInfo.py b/core/DTOs/URLAgencySuggestionInfo.py new file mode 100644 index 00000000..9729cfb5 --- /dev/null +++ b/core/DTOs/URLAgencySuggestionInfo.py @@ -0,0 +1,15 @@ +from typing import Optional + +from pydantic import BaseModel + +from core.enums import SuggestionType + + +class URLAgencySuggestionInfo(BaseModel): + url_id: int + suggestion_type: SuggestionType + pdap_agency_id: Optional[int] = None + agency_name: Optional[str] = None + state: Optional[str] = None + county: Optional[str] = None + locality: Optional[str] = None diff --git a/core/DTOs/task_data_objects/AgencyIdentificationTDO.py b/core/DTOs/task_data_objects/AgencyIdentificationTDO.py new file mode 100644 index 00000000..10c3ce99 --- /dev/null +++ b/core/DTOs/task_data_objects/AgencyIdentificationTDO.py @@ -0,0 +1,11 @@ +from typing import Optional + +from pydantic import BaseModel + +from collector_manager.enums import CollectorType + + +class AgencyIdentificationTDO(BaseModel): + url_id: int + collector_metadata: Optional[dict] = None + collector_type: CollectorType diff --git a/core/classes/AgencyIdentificationTaskOperator.py b/core/classes/AgencyIdentificationTaskOperator.py new file mode 100644 index 00000000..2c027a0f --- /dev/null +++ b/core/classes/AgencyIdentificationTaskOperator.py @@ -0,0 +1,92 @@ +from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from collector_db.enums import TaskType +from collector_manager.enums import CollectorType +from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO +from core.classes.TaskOperatorBase import TaskOperatorBase +from core.classes.subtasks.AutoGooglerAgencyIdentificationSubtask import AutoGooglerAgencyIdentificationSubtask +from core.classes.subtasks.CKANAgencyIdentificationSubtask import CKANAgencyIdentificationSubtask +from core.classes.subtasks.CommonCrawlerAgencyIdentificationSubtask import CommonCrawlerAgencyIdentificationSubtask +from core.classes.subtasks.MuckrockAgencyIdentificationSubtask import MuckrockAgencyIdentificationSubtask +from pdap_api_client.PDAPClient import PDAPClient + + +# TODO: Validate with Manual Tests + +class AgencyIdentificationTaskOperator(TaskOperatorBase): + + def __init__( + self, + adb_client: AsyncDatabaseClient, + pdap_client: PDAPClient, + muckrock_api_interface: MuckrockAPIInterface, + ): + super().__init__(adb_client) + self.pdap_client = pdap_client + self.muckrock_api_interface = muckrock_api_interface + + @property + def task_type(self): + return TaskType.AGENCY_IDENTIFICATION + + async def meets_task_prerequisites(self): + has_urls_without_agency_suggestions = await self.adb_client.has_urls_without_agency_suggestions() + return has_urls_without_agency_suggestions + + async def get_pending_urls_without_agency_identification(self): + return await self.adb_client.get_urls_without_agency_suggestions() + + async def get_muckrock_subtask(self): + return MuckrockAgencyIdentificationSubtask( + muckrock_api_interface=self.muckrock_api_interface, + pdap_client=self.pdap_client + ) + + async def get_subtask(self, collector_type: CollectorType): + match collector_type: + case CollectorType.MUCKROCK_SIMPLE_SEARCH: + return await self.get_muckrock_subtask() + case CollectorType.MUCKROCK_COUNTY_SEARCH: + return await self.get_muckrock_subtask() + case CollectorType.MUCKROCK_ALL_SEARCH: + return await self.get_muckrock_subtask() + case CollectorType.AUTO_GOOGLER: + return AutoGooglerAgencyIdentificationSubtask() + case CollectorType.COMMON_CRAWLER: + return CommonCrawlerAgencyIdentificationSubtask() + case CollectorType.CKAN: + return CKANAgencyIdentificationSubtask( + pdap_client=self.pdap_client + ) + + @staticmethod + async def run_subtask(subtask, url_id, collector_metadata): + return await subtask.run(url_id=url_id, collector_metadata=collector_metadata) + + async def inner_task_logic(self): + tdos: list[AgencyIdentificationTDO] = await self.get_pending_urls_without_agency_identification() + await self.link_urls_to_task(url_ids=[tdo.url_id for tdo in tdos]) + error_infos = [] + all_agency_suggestions = [] + for tdo in tdos: + subtask = await self.get_subtask(tdo.collector_type) + try: + new_agency_suggestions = await self.run_subtask( + subtask, + tdo.url_id, + tdo.collector_metadata + ) + all_agency_suggestions.extend(new_agency_suggestions) + except Exception as e: + error_info = URLErrorPydanticInfo( + task_id=self.task_id, + url_id=tdo.url_id, + error=str(e), + ) + error_infos.append(error_info) + + await self.adb_client.add_agency_suggestions(all_agency_suggestions) + await self.adb_client.add_url_error_infos(error_infos) + + diff --git a/core/classes/subtasks/AgencyIdentificationSubtaskBase.py b/core/classes/subtasks/AgencyIdentificationSubtaskBase.py new file mode 100644 index 00000000..755cade5 --- /dev/null +++ b/core/classes/subtasks/AgencyIdentificationSubtaskBase.py @@ -0,0 +1,16 @@ +import abc +from abc import ABC +from typing import Optional + +from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo + + +class AgencyIdentificationSubtaskBase(ABC): + + @abc.abstractmethod + async def run( + self, + url_id: int, + collector_metadata: Optional[dict] = None + ) -> list[URLAgencySuggestionInfo]: + raise NotImplementedError diff --git a/core/classes/subtasks/AutoGooglerAgencyIdentificationSubtask.py b/core/classes/subtasks/AutoGooglerAgencyIdentificationSubtask.py new file mode 100644 index 00000000..1e5d945b --- /dev/null +++ b/core/classes/subtasks/AutoGooglerAgencyIdentificationSubtask.py @@ -0,0 +1,25 @@ +from typing import Optional + +from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from core.classes.subtasks.AgencyIdentificationSubtaskBase import AgencyIdentificationSubtaskBase +from core.enums import SuggestionType + + +class AutoGooglerAgencyIdentificationSubtask(AgencyIdentificationSubtaskBase): + + async def run( + self, + url_id: int, + collector_metadata: Optional[dict] = None + ) -> list[URLAgencySuggestionInfo]: + return [ + URLAgencySuggestionInfo( + url_id=url_id, + suggestion_type=SuggestionType.UNKNOWN, + pdap_agency_id=None, + agency_name=None, + state=None, + county=None, + locality=None + ) + ] diff --git a/core/classes/subtasks/CKANAgencyIdentificationSubtask.py b/core/classes/subtasks/CKANAgencyIdentificationSubtask.py new file mode 100644 index 00000000..5eb88406 --- /dev/null +++ b/core/classes/subtasks/CKANAgencyIdentificationSubtask.py @@ -0,0 +1,29 @@ +from typing import Optional + +from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from core.helpers import process_match_agency_response_to_suggestions +from pdap_api_client.PDAPClient import PDAPClient +from pdap_api_client.DTOs import MatchAgencyResponse + + +class CKANAgencyIdentificationSubtask: + + def __init__( + self, + pdap_client: PDAPClient + ): + self.pdap_client = pdap_client + + async def run( + self, + url_id: int, + collector_metadata: Optional[dict] + ) -> list[URLAgencySuggestionInfo]: + agency_name = collector_metadata["agency_name"] + match_agency_response: MatchAgencyResponse = await self.pdap_client.match_agency( + name=agency_name + ) + return process_match_agency_response_to_suggestions( + url_id=url_id, + match_agency_response=match_agency_response + ) diff --git a/core/classes/subtasks/CommonCrawlerAgencyIdentificationSubtask.py b/core/classes/subtasks/CommonCrawlerAgencyIdentificationSubtask.py new file mode 100644 index 00000000..5d0fa409 --- /dev/null +++ b/core/classes/subtasks/CommonCrawlerAgencyIdentificationSubtask.py @@ -0,0 +1,23 @@ +from typing import Optional + +from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from core.enums import SuggestionType + + +class CommonCrawlerAgencyIdentificationSubtask: + async def run( + self, + url_id: int, + collector_metadata: Optional[dict] + ) -> list[URLAgencySuggestionInfo]: + return [ + URLAgencySuggestionInfo( + url_id=url_id, + suggestion_type=SuggestionType.UNKNOWN, + pdap_agency_id=None, + agency_name=None, + state=None, + county=None, + locality=None + ) + ] diff --git a/core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py b/core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py new file mode 100644 index 00000000..03f2a064 --- /dev/null +++ b/core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py @@ -0,0 +1,42 @@ +from typing import Optional + +from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponse, AgencyLookupResponseType +from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from core.exceptions import MuckrockAPIError +from core.helpers import process_match_agency_response_to_suggestions +from pdap_api_client.PDAPClient import PDAPClient +from pdap_api_client.DTOs import MatchAgencyResponse + + +class MuckrockAgencyIdentificationSubtask: + + def __init__( + self, + muckrock_api_interface: MuckrockAPIInterface, + pdap_client: PDAPClient + ): + self.muckrock_api_interface = muckrock_api_interface + self.pdap_client = pdap_client + + async def run( + self, + url_id: int, + collector_metadata: Optional[dict] + ) -> list[URLAgencySuggestionInfo]: + muckrock_agency_id = collector_metadata["agency"] + agency_lookup_response: AgencyLookupResponse = await self.muckrock_api_interface.lookup_agency( + muckrock_agency_id=muckrock_agency_id + ) + if agency_lookup_response.type != AgencyLookupResponseType.FOUND: + raise MuckrockAPIError( + f"Failed to lookup muckrock agency: {muckrock_agency_id}:" + f" {agency_lookup_response.type.value}: {agency_lookup_response.error}" + ) + + match_agency_response: MatchAgencyResponse = await self.pdap_client.match_agency( + name=agency_lookup_response.name + ) + return process_match_agency_response_to_suggestions( + url_id=url_id, + match_agency_response=match_agency_response + ) diff --git a/core/classes/subtasks/__init__.py b/core/classes/subtasks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/core/enums.py b/core/enums.py index 605e49e5..213db47c 100644 --- a/core/enums.py +++ b/core/enums.py @@ -48,3 +48,11 @@ class RecordType(Enum): COURT_CASES = "Court Cases" INCARCERATION_RECORDS = "Incarceration Records" OTHER = "Other" + + +class SuggestionType(Enum): + AUTO_SUGGESTION = "Auto Suggestion" + MANUAL_SUGGESTION = "Manual Suggestion" + UNKNOWN = "Unknown" + NEW_AGENCY = "New Agency" + CONFIRMED = "Confirmed" diff --git a/core/exceptions.py b/core/exceptions.py index edaa32a3..d9685245 100644 --- a/core/exceptions.py +++ b/core/exceptions.py @@ -1,2 +1,10 @@ class InvalidPreprocessorError(Exception): pass + + +class MuckrockAPIError(Exception): + pass + + +class MatchAgencyError(Exception): + pass diff --git a/core/helpers.py b/core/helpers.py index e69de29b..bac603bd 100644 --- a/core/helpers.py +++ b/core/helpers.py @@ -0,0 +1,48 @@ +from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from core.enums import SuggestionType +from core.exceptions import MatchAgencyError +from pdap_api_client.DTOs import MatchAgencyResponse +from pdap_api_client.enums import MatchAgencyResponseStatus + + +def process_match_agency_response_to_suggestions( + url_id: int, + match_agency_response: MatchAgencyResponse +) -> list[URLAgencySuggestionInfo]: + if match_agency_response.status == MatchAgencyResponseStatus.EXACT_MATCH: + match = match_agency_response.matches[0] + return [ + URLAgencySuggestionInfo( + url_id=url_id, + suggestion_type=SuggestionType.CONFIRMED, + pdap_agency_id=int(match.id), + agency_name=match.submitted_name, + state=match.state, + county=match.county, + ) + ] + if match_agency_response.status == MatchAgencyResponseStatus.NO_MATCH: + return [ + URLAgencySuggestionInfo( + url_id=url_id, + suggestion_type=SuggestionType.UNKNOWN, + ) + ] + + if match_agency_response.status != MatchAgencyResponseStatus.PARTIAL_MATCH: + raise MatchAgencyError( + f"Unknown Match Agency Response Status: {match_agency_response.status}" + ) + + return [ + URLAgencySuggestionInfo( + url_id=url_id, + suggestion_type=SuggestionType.AUTO_SUGGESTION, + pdap_agency_id=match.id, + agency_name=match.submitted_name, + state=match.state, + county=match.county, + locality=match.locality + ) + for match in match_agency_response.matches + ] diff --git a/html_tag_collector/URLRequestInterface.py b/html_tag_collector/URLRequestInterface.py index 6c6756d0..2b135516 100644 --- a/html_tag_collector/URLRequestInterface.py +++ b/html_tag_collector/URLRequestInterface.py @@ -1,5 +1,4 @@ import asyncio -import subprocess from typing import Optional from aiohttp import ClientSession @@ -7,16 +6,10 @@ from dataclasses import dataclass -from requests import Response from tqdm.asyncio import tqdm MAX_CONCURRENCY = 5 -@dataclass -class URLResponseInfoOld: - success: bool - response: Response or Exception - @dataclass class URLResponseInfo: success: bool diff --git a/pdap_api_client/AccessManager.py b/pdap_api_client/AccessManager.py index 87877466..0776fe0d 100644 --- a/pdap_api_client/AccessManager.py +++ b/pdap_api_client/AccessManager.py @@ -2,15 +2,16 @@ from typing import Optional import requests +from aiohttp import ClientSession from pdap_api_client.DTOs import RequestType, Namespaces, RequestInfo, ResponseInfo API_URL = "https://data-sources-v2.pdap.dev/api" request_methods = { - RequestType.POST: requests.post, - RequestType.PUT: requests.put, - RequestType.GET: requests.get, - RequestType.DELETE: requests.delete, + RequestType.POST: ClientSession.post, + RequestType.PUT: ClientSession.put, + RequestType.GET: ClientSession.get, + RequestType.DELETE: ClientSession.delete, } @@ -32,15 +33,42 @@ class AccessManager: """ Manages login, api key, access and refresh tokens """ - def __init__(self, email: str, password: str, api_key: Optional[str] = None): - self.access_token = None - self.refresh_token = None + def __init__( + self, + session: ClientSession, + email: str, + password: str, + api_key: Optional[str] = None, + ): + self.session = session + self._access_token = None + self._refresh_token = None self.api_key = api_key + self.email = email + self.password = password self.login(email=email, password=password) + @property + async def access_token(self): + if self._access_token is None: + await self.login( + email=self.email, + password=self.password + ) + return self._access_token + + @property + async def refresh_token(self): + if self._refresh_token is None: + await self.login( + email=self.email, + password=self.password + ) + return self._refresh_token + # TODO: Add means to refresh if token expired. - def load_api_key(self): + async def load_api_key(self): url = build_url( namespace=Namespaces.AUTH, subdomains=["api-key"] @@ -48,41 +76,48 @@ def load_api_key(self): request_info = RequestInfo( type_ = RequestType.POST, url=url, - headers=self.jwt_header() + headers=await self.jwt_header() ) - response_info = self.make_request(request_info) + response_info = await self.make_request(request_info) self.api_key = response_info.data["api_key"] - def refresh_access_token(self): + async def refresh_access_token(self): url = build_url( namespace=Namespaces.AUTH, subdomains=["refresh-session"], ) - raise NotImplementedError("Waiting on https://github.com/Police-Data-Accessibility-Project/data-sources-app/issues/566") + refresh_token = await self.refresh_token + rqi = RequestInfo( + type_=RequestType.POST, + url=url, + json={"refresh_token": refresh_token}, + headers=await self.jwt_header() + ) + rsi = await self.make_request(rqi) + data = rsi.data + self._access_token = data['access_token'] + self._refresh_token = data['refresh_token'] - def make_request(self, ri: RequestInfo) -> ResponseInfo: + async def make_request(self, ri: RequestInfo) -> ResponseInfo: try: - response = request_methods[ri.type_]( - ri.url, - json=ri.json, - headers=ri.headers, - params=ri.params, - timeout=ri.timeout - ) - response.raise_for_status() + method = getattr(self.session, ri.type_.value.lower()) + async with method(**ri.kwargs()) as response: + response.raise_for_status() + json = await response.json() + return ResponseInfo( + status_code=HTTPStatus(response.status), + data=json + ) except requests.RequestException as e: # TODO: Precise string matching here is brittle. Consider changing later. - if e.response.json().message == "Token is expired. Please request a new token.": - self.refresh_access_token() - return self.make_request(ri) + if json.message == "Token is expired. Please request a new token.": + await self.refresh_access_token() + return await self.make_request(ri) else: raise CustomHTTPException(f"Error making {ri.type_} request to {ri.url}: {e}") - return ResponseInfo( - status_code=HTTPStatus(response.status_code), - data=response.json() - ) - def login(self, email: str, password: str): + + async def login(self, email: str, password: str): url = build_url( namespace=Namespaces.AUTH, subdomains=["login"] @@ -95,19 +130,20 @@ def login(self, email: str, password: str): "password": password } ) - response_info = self.make_request(request_info) + response_info = await self.make_request(request_info) data = response_info.data - self.access_token = data["access_token"] - self.refresh_token = data["refresh_token"] + self._access_token = data["access_token"] + self._refresh_token = data["refresh_token"] - def jwt_header(self) -> dict: + async def jwt_header(self) -> dict: """ Retrieve JWT header Returns: Dictionary of Bearer Authorization with JWT key """ + access_token = await self.access_token return { - "Authorization": f"Bearer {self.access_token}" + "Authorization": f"Bearer {access_token}" } def api_key_header(self): diff --git a/pdap_api_client/DTOs.py b/pdap_api_client/DTOs.py index 31c8c2cf..19255a35 100644 --- a/pdap_api_client/DTOs.py +++ b/pdap_api_client/DTOs.py @@ -1,13 +1,18 @@ from enum import Enum from http import HTTPStatus -from typing import Optional +from typing import Optional, List from pydantic import BaseModel +from pdap_api_client.enums import MatchAgencyResponseStatus + class MatchAgencyInfo(BaseModel): + id: int submitted_name: str - id: str + state: Optional[str] = None + county: Optional[str] = None + locality: Optional[str] = None class ApprovalStatus(Enum): APPROVED = "approved" @@ -48,7 +53,22 @@ class RequestInfo(BaseModel): params: Optional[dict] = None timeout: Optional[int] = 10 + def kwargs(self) -> dict: + d = { + "url": self.url, + } + if self.json is not None: + d['json'] = self.json + if self.headers is not None: + d['headers'] = self.headers + return d + class ResponseInfo(BaseModel): status_code: HTTPStatus data: Optional[dict] + + +class MatchAgencyResponse(BaseModel): + status: MatchAgencyResponseStatus + matches: List[MatchAgencyInfo] diff --git a/pdap_api_client/PDAPClient.py b/pdap_api_client/PDAPClient.py index 6c03ce0f..b2b89564 100644 --- a/pdap_api_client/PDAPClient.py +++ b/pdap_api_client/PDAPClient.py @@ -1,22 +1,27 @@ -from typing import List +from typing import Optional from pdap_api_client.AccessManager import build_url, AccessManager from pdap_api_client.DTOs import MatchAgencyInfo, UniqueURLDuplicateInfo, UniqueURLResponseInfo, Namespaces, \ - RequestType, RequestInfo + RequestType, RequestInfo, MatchAgencyResponse +from pdap_api_client.enums import MatchAgencyResponseStatus class PDAPClient: - def __init__(self, access_manager: AccessManager): + def __init__( + self, + access_manager: AccessManager, + ): self.access_manager = access_manager - def match_agency( + async def match_agency( self, name: str, - state: str, - county: str, - locality: str - ) -> List[MatchAgencyInfo]: + state: Optional[str] = None, + county: Optional[str] = None, + locality: Optional[str] = None + ) -> MatchAgencyResponse: + # TODO: Change to async """ Returns agencies, if any, that match or partially match the search criteria """ @@ -24,9 +29,12 @@ def match_agency( namespace=Namespaces.MATCH, subdomains=["agency"] ) + headers = await self.access_manager.jwt_header() + headers['Content-Type'] = "application/json" request_info = RequestInfo( type_=RequestType.POST, url=url, + headers=headers, json={ "name": name, "state": state, @@ -34,11 +42,24 @@ def match_agency( "locality": locality } ) - response_info = self.access_manager.make_request(request_info) - return [MatchAgencyInfo(**agency) for agency in response_info.data["agencies"]] + response_info = await self.access_manager.make_request(request_info) + + matches = [ + MatchAgencyInfo( + id = agency['id'], + submitted_name=agency['name'], + state=agency['state'], + county=agency['county'], + locality=agency['locality'] + ) + for agency in response_info.data["agencies"]] + return MatchAgencyResponse( + status=MatchAgencyResponseStatus(response_info.data["status"]), + matches=matches + ) - def is_url_unique( + async def is_url_unique( self, url_to_check: str ) -> UniqueURLResponseInfo: @@ -56,7 +77,7 @@ def is_url_unique( "url": url_to_check } ) - response_info = self.access_manager.make_request(request_info) + response_info = await self.access_manager.make_request(request_info) duplicates = [UniqueURLDuplicateInfo(**entry) for entry in response_info.data["duplicates"]] is_unique = (len(duplicates) == 0) return UniqueURLResponseInfo( diff --git a/pdap_api_client/enums.py b/pdap_api_client/enums.py new file mode 100644 index 00000000..3dc7d931 --- /dev/null +++ b/pdap_api_client/enums.py @@ -0,0 +1,7 @@ +from enum import Enum + + +class MatchAgencyResponseStatus(Enum): + EXACT_MATCH = "Exact Match" + PARTIAL_MATCH = "Partial Matches" + NO_MATCH = "No Match" diff --git a/requirements.txt b/requirements.txt index b72804e7..48f86981 100644 --- a/requirements.txt +++ b/requirements.txt @@ -46,3 +46,4 @@ PyJWT~=2.10.1 pytest-timeout~=2.3.1 openai~=1.60.1 +aiohttp~=3.11.11 \ No newline at end of file diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 0041fad5..c9a6b31a 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -1,5 +1,7 @@ from typing import List, Optional +from pydantic import BaseModel + from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.BatchInfo import BatchInfo from collector_db.DTOs.DuplicateInfo import DuplicateInsertInfo @@ -15,6 +17,10 @@ from tests.helpers.simple_test_data_functions import generate_test_urls +class BatchURLCreationInfo(BaseModel): + batch_id: int + url_ids: list[int] + class DBDataCreator: """ Assists in the creation of test data @@ -23,10 +29,10 @@ def __init__(self, db_client: DatabaseClient = DatabaseClient()): self.db_client = db_client self.adb_client: AsyncDatabaseClient = AsyncDatabaseClient() - def batch(self): + def batch(self, strategy: CollectorType = CollectorType.EXAMPLE) -> int: return self.db_client.insert_batch( BatchInfo( - strategy=CollectorType.EXAMPLE.value, + strategy=strategy.value, status=BatchStatus.IN_PROCESS, total_url_count=1, parameters={"test_key": "test_value"}, @@ -40,6 +46,22 @@ async def task(self, url_ids: Optional[list[int]] = None) -> int: await self.adb_client.link_urls_to_task(task_id=task_id, url_ids=url_ids) return task_id + async def batch_and_urls( + self, + strategy: CollectorType = CollectorType.EXAMPLE, + url_count: int = 1, + with_html_content: bool = False + ) -> BatchURLCreationInfo: + batch_id = self.batch(strategy=strategy) + iuis: InsertURLsInfo = self.urls(batch_id=batch_id, url_count=url_count) + url_ids = [iui.url_id for iui in iuis.url_mappings] + if with_html_content: + await self.html_data(url_ids) + + return BatchURLCreationInfo(batch_id=batch_id, url_ids=url_ids) + + + def urls(self, batch_id: int, url_count: int) -> InsertURLsInfo: raw_urls = generate_test_urls(url_count) url_infos: List[URLInfo] = [] diff --git a/tests/manual/agency_identifier/__init__.py b/tests/manual/agency_identifier/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/manual/agency_identifier/test_muckrock_api_interface.py b/tests/manual/agency_identifier/test_muckrock_api_interface.py new file mode 100644 index 00000000..2dac6bd4 --- /dev/null +++ b/tests/manual/agency_identifier/test_muckrock_api_interface.py @@ -0,0 +1,16 @@ +import pytest +from aiohttp import ClientSession + +from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface + + +@pytest.mark.asyncio +async def test_muckrock_api_interface(): + + async with ClientSession() as session: + muckrock_api_interface = MuckrockAPIInterface(session=session) + + response = await muckrock_api_interface.lookup_agency( + muckrock_agency_id=1 + ) + print(response) diff --git a/tests/manual/pdap_client/__init__.py b/tests/manual/pdap_client/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/manual/pdap_client/test_access_manager.py b/tests/manual/pdap_client/test_access_manager.py new file mode 100644 index 00000000..ff08ee0e --- /dev/null +++ b/tests/manual/pdap_client/test_access_manager.py @@ -0,0 +1,23 @@ +import pytest +from aiohttp import ClientSession + +from pdap_api_client.AccessManager import AccessManager +from util.helper_functions import get_from_env + + +@pytest.mark.asyncio +async def test_refresh_session(): + async with ClientSession() as session: + access_manager = AccessManager( + email=get_from_env("PDAP_EMAIL"), + password=get_from_env("PDAP_PASSWORD"), + api_key=get_from_env("PDAP_API_KEY", allow_none=True), + session=session + ) + old_access_token = await access_manager.access_token + old_refresh_token = await access_manager.refresh_token + await access_manager.refresh_access_token() + new_access_token = await access_manager.access_token + new_refresh_token = await access_manager.refresh_token + assert old_access_token != new_access_token + assert old_refresh_token != new_refresh_token diff --git a/tests/manual/pdap_client/test_pdap_client.py b/tests/manual/pdap_client/test_pdap_client.py new file mode 100644 index 00000000..b1232244 --- /dev/null +++ b/tests/manual/pdap_client/test_pdap_client.py @@ -0,0 +1,23 @@ +import pytest +from aiohttp import ClientSession + +from pdap_api_client.AccessManager import AccessManager +from pdap_api_client.PDAPClient import PDAPClient +from util.helper_functions import get_from_env + + +@pytest.mark.asyncio +async def test_match_agency(): + + async with ClientSession() as session: + access_manager = AccessManager( + email=get_from_env("PDAP_EMAIL"), + password=get_from_env("PDAP_PASSWORD"), + api_key=get_from_env("PDAP_API_KEY", allow_none=True), + session=session + ) + pdap_client = PDAPClient(access_manager=access_manager) + + response = await pdap_client.match_agency(name="police") + + print(response) diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index 5ff2f239..f6703d29 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -195,7 +195,7 @@ def post_record_type_annotation_and_get_next( ) -> GetNextURLForAnnotationResponse: data = self.post( url=f"/annotate/record-type/{metadata_id}", - json=record_type_annotation_post_info.model_dump() + json=record_type_annotation_post_info.model_dump(mode="json") ) return GetNextURLForAnnotationResponse(**data) @@ -206,7 +206,7 @@ def post_relevance_annotation_and_get_next( ) -> GetNextURLForAnnotationResponse: data = self.post( url=f"/annotate/relevance/{metadata_id}", - json=relevance_annotation_post_info.model_dump() + json=relevance_annotation_post_info.model_dump(mode="json") ) return GetNextURLForAnnotationResponse(**data) diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/test_automated/integration/api/test_annotate.py index 899c7f28..1ee03963 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/test_automated/integration/api/test_annotate.py @@ -78,9 +78,9 @@ async def run_annotation_test( assert results[0].value == expected_metadata_value # Submit this one in turn, and no subsequent annotation info should be returned - request_info_3 = ath.request_validator.post_relevance_annotation_and_get_next( - metadata_id=inner_info_2.metadata_id, - relevance_annotation_post_info=post_info + request_info_3 = submit_and_get_next_function( + inner_info_2.metadata_id, + post_info ) assert request_info_3.next_annotation is None diff --git a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py new file mode 100644 index 00000000..94f6c1d3 --- /dev/null +++ b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py @@ -0,0 +1,255 @@ +import types +from typing import Optional +from unittest.mock import MagicMock, AsyncMock, patch + +import pytest +from aiohttp import ClientSession + +from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponseType, AgencyLookupResponse +from collector_manager.enums import CollectorType +from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from core.classes.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator +from core.classes.subtasks.AutoGooglerAgencyIdentificationSubtask import AutoGooglerAgencyIdentificationSubtask +from core.classes.subtasks.CKANAgencyIdentificationSubtask import CKANAgencyIdentificationSubtask +from core.classes.subtasks.CommonCrawlerAgencyIdentificationSubtask import CommonCrawlerAgencyIdentificationSubtask +from core.classes.subtasks.MuckrockAgencyIdentificationSubtask import MuckrockAgencyIdentificationSubtask +from core.enums import SuggestionType +from helpers.DBDataCreator import DBDataCreator, BatchURLCreationInfo +from pdap_api_client.AccessManager import AccessManager +from pdap_api_client.DTOs import MatchAgencyResponse, MatchAgencyInfo +from pdap_api_client.PDAPClient import PDAPClient +from pdap_api_client.enums import MatchAgencyResponseStatus + + +@pytest.mark.asyncio +async def test_agency_preannotation_task(db_data_creator: DBDataCreator): + async def mock_run_subtask( + subtask, + url_id: int, + collector_metadata: Optional[dict] + ): + return [ + URLAgencySuggestionInfo( + url_id=url_id, + suggestion_type=SuggestionType.UNKNOWN, + pdap_agency_id=None, + agency_name=None, + state=None, + county=None, + locality=None + ) + ] + + async with ClientSession() as session: + mock = MagicMock() + access_manager = AccessManager( + email=mock.email, + password=mock.password, + api_key=mock.api_key, + session=session + ) + pdap_client = PDAPClient( + access_manager=access_manager + ) + muckrock_api_interface = MuckrockAPIInterface(session=session) + with patch.object( + AgencyIdentificationTaskOperator, + "run_subtask", + side_effect=mock_run_subtask, + ) as mock: + operator = AgencyIdentificationTaskOperator( + adb_client=db_data_creator.adb_client, + pdap_client=pdap_client, + muckrock_api_interface=muckrock_api_interface + ) + + # Try to run initially and confirm it doesn't run + # due to not meeting prerequisites + await operator.run_task() + + d = {} + + # Create six urls, one from each strategy + for strategy in [ + CollectorType.COMMON_CRAWLER, + CollectorType.AUTO_GOOGLER, + CollectorType.MUCKROCK_COUNTY_SEARCH, + CollectorType.MUCKROCK_SIMPLE_SEARCH, + CollectorType.MUCKROCK_ALL_SEARCH, + CollectorType.CKAN + ]: + creation_info: BatchURLCreationInfo = await db_data_creator.batch_and_urls(strategy=strategy, url_count=1, with_html_content=True) + d[strategy] = creation_info.url_ids[0] + + # Run task + await operator.run_task() + + # Confirm tasks are piped into the correct subtasks + # * common_crawler into common_crawler_subtask + # * auto_googler into auto_googler_subtask + # * muckrock_county_search into muckrock_subtask + # * muckrock_simple_search into muckrock_subtask + # * muckrock_all_search into muckrock_subtask + # * ckan into ckan_subtask + + assert mock.call_count == 6 + + + # Confirm subtask classes are correct for the given urls + d2 = {} + for call_arg in mock.call_args_list: + subtask_class = call_arg[0][0].__class__ + url_id = call_arg[0][1] + d2[url_id] = subtask_class + + + subtask_class_collector_type = [ + (MuckrockAgencyIdentificationSubtask, CollectorType.MUCKROCK_ALL_SEARCH), + (MuckrockAgencyIdentificationSubtask, CollectorType.MUCKROCK_COUNTY_SEARCH), + (MuckrockAgencyIdentificationSubtask, CollectorType.MUCKROCK_SIMPLE_SEARCH), + (CKANAgencyIdentificationSubtask, CollectorType.CKAN), + (CommonCrawlerAgencyIdentificationSubtask, CollectorType.COMMON_CRAWLER), + (AutoGooglerAgencyIdentificationSubtask, CollectorType.AUTO_GOOGLER) + ] + + for subtask_class, collector_type in subtask_class_collector_type: + url_id = d[collector_type] + assert d2[url_id] == subtask_class + + # Run task again and confirm it doesn't call any additional subtasks + await operator.run_task() + + assert mock.call_count == 6 + +@pytest.mark.asyncio +async def test_common_crawler_subtask(db_data_creator: DBDataCreator): + # Test that common_crawler subtask correctly adds URL to + # url_agency_suggestions with label 'Unknown' + subtask = CommonCrawlerAgencyIdentificationSubtask() + results: list[URLAgencySuggestionInfo] = await subtask.run(url_id=1, collector_metadata={}) + assert len(results) == 1 + assert results[0].url_id == 1 + assert results[0].suggestion_type == SuggestionType.UNKNOWN + + +@pytest.mark.asyncio +async def test_auto_googler_subtask(db_data_creator: DBDataCreator): + # Test that auto_googler subtask correctly adds URL to + # url_agency_suggestions with label 'Unknown' + subtask = AutoGooglerAgencyIdentificationSubtask() + results: list[URLAgencySuggestionInfo] = await subtask.run(url_id=1, collector_metadata={}) + assert len(results) == 1 + assert results[0].url_id == 1 + assert results[0].suggestion_type == SuggestionType.UNKNOWN + +@pytest.mark.asyncio +async def test_muckrock_subtask(db_data_creator: DBDataCreator): + # Test that muckrock subtask correctly sends agency name to + # MatchAgenciesInterface and adds received suggestions to + # url_agency_suggestions + + # Create mock instances for dependency injections + muckrock_api_interface_mock = MagicMock(spec=MuckrockAPIInterface) + pdap_client_mock = MagicMock(spec=PDAPClient) + + # Set up mock return values for method calls + muckrock_api_interface_mock.lookup_agency.return_value = AgencyLookupResponse( + type=AgencyLookupResponseType.FOUND, + name="Mock Agency Name", + error=None + ) + + pdap_client_mock.match_agency.return_value = MatchAgencyResponse( + status=MatchAgencyResponseStatus.PARTIAL_MATCH, + matches=[ + MatchAgencyInfo( + id=1, + submitted_name="Mock Agency Name", + ), + MatchAgencyInfo( + id=2, + submitted_name="Another Mock Agency Name", + ) + ] + ) + + # Create an instance of MuckrockAgencyIdentificationSubtask with mock dependencies + muckrock_agency_identification_subtask = MuckrockAgencyIdentificationSubtask( + muckrock_api_interface=muckrock_api_interface_mock, + pdap_client=pdap_client_mock + ) + + # Run the subtask + results: list[URLAgencySuggestionInfo] = await muckrock_agency_identification_subtask.run( + url_id=1, + collector_metadata={ + "agency": 123 + } + ) + + # Verify the results + assert len(results) == 2 + assert results[0].url_id == 1 + assert results[0].suggestion_type == SuggestionType.AUTO_SUGGESTION + assert results[0].pdap_agency_id == 1 + assert results[0].agency_name == "Mock Agency Name" + assert results[1].url_id == 1 + assert results[1].suggestion_type == SuggestionType.AUTO_SUGGESTION + assert results[1].pdap_agency_id == 2 + assert results[1].agency_name == "Another Mock Agency Name" + + # Assert methods called as expected + muckrock_api_interface_mock.lookup_agency.assert_called_once_with( + muckrock_agency_id=123 + ) + pdap_client_mock.match_agency.assert_called_once_with( + name="Mock Agency Name" + ) + + +@pytest.mark.asyncio +async def test_ckan_subtask(db_data_creator: DBDataCreator): + # Test that ckan subtask correctly sends agency id to + # CKANAPIInterface, sends resultant agency name to + # PDAPClient and adds received suggestions to + # url_agency_suggestions + + pdap_client = AsyncMock() + pdap_client.match_agency.return_value = MatchAgencyResponse( + status=MatchAgencyResponseStatus.PARTIAL_MATCH, + matches=[ + MatchAgencyInfo( + id=1, + submitted_name="Mock Agency Name", + ), + MatchAgencyInfo( + id=2, + submitted_name="Another Mock Agency Name", + ) + ] + ) # Assuming MatchAgencyResponse is a class + + # Create an instance of CKANAgencyIdentificationSubtask + task = CKANAgencyIdentificationSubtask(pdap_client) + + # Call the run method with static values + collector_metadata = {"agency_name": "Test Agency"} + url_id = 1 + + # Call the run method + result = await task.run(url_id, collector_metadata) + + # Check the result + assert len(result) == 2 + assert result[0].url_id == 1 + assert result[0].suggestion_type == SuggestionType.AUTO_SUGGESTION + assert result[0].pdap_agency_id == 1 + assert result[0].agency_name == "Mock Agency Name" + assert result[1].url_id == 1 + assert result[1].suggestion_type == SuggestionType.AUTO_SUGGESTION + assert result[1].pdap_agency_id == 2 + assert result[1].agency_name == "Another Mock Agency Name" + + # Assert methods called as expected + pdap_client.match_agency.assert_called_once_with(name="Test Agency") + diff --git a/util/helper_functions.py b/util/helper_functions.py index ccc7d96e..bf72d39b 100644 --- a/util/helper_functions.py +++ b/util/helper_functions.py @@ -9,10 +9,10 @@ def get_enum_values(enum: Type[Enum]): return [item.value for item in enum] -def get_from_env(key: str): +def get_from_env(key: str, allow_none: bool = False): load_dotenv() val = os.getenv(key) - if val is None: + if val is None and not allow_none: raise ValueError(f"Environment variable {key} is not set") return val From ff1999f80d72d4522d695baa420fdd3516579d2c Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 5 Feb 2025 09:59:54 -0500 Subject: [PATCH 042/244] Add alembic directory --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index fae4de32..6cf1d6a2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,6 +25,7 @@ COPY hugging_face/HuggingFaceInterface.py ./hugging_face/HuggingFaceInterface.py COPY source_collectors ./source_collectors COPY util ./util COPY alembic.ini ./alembic.ini +COPY alembic ./alembic COPY apply_migrations.py ./apply_migrations.py COPY security_manager ./security_manager COPY execute.sh ./execute.sh From 83f25cb39e749eda3d817695581076d59f22e599 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 5 Feb 2025 10:58:36 -0500 Subject: [PATCH 043/244] Add logic for Agency Identification task --- core/AsyncCore.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 6ab9fcf5..5e0a9590 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -1,5 +1,8 @@ import logging +from aiohttp import ClientSession + +from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.DTOs.URLAnnotationInfo import URLAnnotationInfo @@ -8,6 +11,7 @@ from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo from core.DTOs.AnnotationRequestInfo import AnnotationRequestInfo +from core.classes.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator @@ -17,6 +21,9 @@ from html_tag_collector.URLRequestInterface import URLRequestInterface from hugging_face.HuggingFaceInterface import HuggingFaceInterface from llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier +from pdap_api_client.AccessManager import AccessManager +from pdap_api_client.PDAPClient import PDAPClient +from util.helper_functions import get_from_env class AsyncCore: @@ -26,7 +33,7 @@ def __init__( adb_client: AsyncDatabaseClient, huggingface_interface: HuggingFaceInterface, url_request_interface: URLRequestInterface, - html_parser: HTMLResponseParser + html_parser: HTMLResponseParser, ): self.adb_client = adb_client self.huggingface_interface = huggingface_interface @@ -60,10 +67,30 @@ async def run_url_record_type_task(self): ) await operator.run_task() + async def run_agency_identification_task(self): + self.logger.info("Running Agency Identification Task") + async with ClientSession() as session: + pdap_client = PDAPClient( + access_manager=AccessManager( + email=get_from_env("PDAP_EMAIL"), + password=get_from_env("PDAP_PASSWORD"), + api_key=get_from_env("PDAP_API_KEY"), + session=session + ), + ) + muckrock_api_interface = MuckrockAPIInterface(session=session) + operator = AgencyIdentificationTaskOperator( + adb_client=self.adb_client, + pdap_client=pdap_client, + muckrock_api_interface=muckrock_api_interface + ) + await operator.run_task() + async def run_tasks(self): await self.run_url_html_task() await self.run_url_relevance_huggingface_task() await self.run_url_record_type_task() + await self.run_agency_identification_task() async def convert_to_annotation_request_info(self, url_info: URLAnnotationInfo) -> AnnotationRequestInfo: response_html_info = convert_to_response_html_info( From 2e5bc3688f7253d77add7df4228cdcef1c69bfac Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 5 Feb 2025 10:59:12 -0500 Subject: [PATCH 044/244] Add `user_id` and trigger enforcement logic for url_agency_suggestion --- ...ae_add_user_url_agency_suggestions_and_.py | 63 +++++++++++++++++++ collector_db/models.py | 3 +- tests/test_alembic/test_revisions.py | 14 +++++ .../collector_db/test_database_structure.py | 14 +++++ 4 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 alembic/versions/8c44e02733ae_add_user_url_agency_suggestions_and_.py diff --git a/alembic/versions/8c44e02733ae_add_user_url_agency_suggestions_and_.py b/alembic/versions/8c44e02733ae_add_user_url_agency_suggestions_and_.py new file mode 100644 index 00000000..8eadb6a3 --- /dev/null +++ b/alembic/versions/8c44e02733ae_add_user_url_agency_suggestions_and_.py @@ -0,0 +1,63 @@ +"""Add user_url_agency_suggestions and trigger + +Revision ID: 8c44e02733ae +Revises: 19bf57df581a +Create Date: 2025-02-05 10:33:46.002025 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy import Column, Integer +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '8c44e02733ae' +down_revision: Union[str, None] = '19bf57df581a' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + op.add_column( + table_name='url_agency_suggestions', + column=Column( + name="user_id", + type_=Integer, + nullable=True + ) + ) + + op.execute( + """ + CREATE OR REPLACE FUNCTION user_url_agency_suggestions_value() + RETURNS TRIGGER AS $$ + BEGIN + IF NEW.suggestion_type = 'Manual Suggestion' and NEW.user_id IS NULL THEN + RAISE EXCEPTION 'User ID must not be null when suggestion type is "Manual Suggestion"'; + END IF; + RETURN NEW; + END; + $$ LANGUAGE plpgsql; + + CREATE TRIGGER enforce_url_agency_suggestions_manual_suggestion_user_id + BEFORE INSERT ON url_agency_suggestions + FOR EACH ROW + EXECUTE FUNCTION user_url_agency_suggestions_value(); + + """ + ) + + +def downgrade() -> None: + op.drop_column( + table_name='url_agency_suggestions', + column_name="user_id" + ) + op.execute( + """ + DROP TRIGGER IF EXISTS enforce_url_agency_suggestions_manual_suggestion_user_id; + DROP FUNCTION IF EXISTS user_url_agency_suggestions_value(); + """ + ) diff --git a/collector_db/models.py b/collector_db/models.py index 41c50048..81d9d2c3 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -327,7 +327,8 @@ class URLAgencySuggestion(Base): state = Column(String, nullable=True) county = Column(String, nullable=True) locality = Column(String, nullable=True) + user_id = Column(Integer, nullable=True) updated_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) # Relationships - url = relationship("URL", back_populates="agency_suggestions") \ No newline at end of file + url = relationship("URL", back_populates="agency_suggestions") diff --git a/tests/test_alembic/test_revisions.py b/tests/test_alembic/test_revisions.py index e94f4180..51096ec5 100644 --- a/tests/test_alembic/test_revisions.py +++ b/tests/test_alembic/test_revisions.py @@ -345,3 +345,17 @@ def test_add_url_agency_suggestions(alembic_runner): start_revision="072b32a45b1c", end_revision="19bf57df581a" ) + +def test_add_user_url_agency_suggestions(alembic_runner): + def column_check() -> bool: + return columns_in_table( + alembic_runner, + table_name="url_agency_suggestions", + columns_to_check=["user_id"] + ) + + alembic_runner.upgrade("19bf57df581a") + assert not column_check() + alembic_runner.reflect() + alembic_runner.upgrade("8c44e02733ae") + assert column_check() diff --git a/tests/test_automated/integration/collector_db/test_database_structure.py b/tests/test_automated/integration/collector_db/test_database_structure.py index 272f3de2..462f3b24 100644 --- a/tests/test_automated/integration/collector_db/test_database_structure.py +++ b/tests/test_automated/integration/collector_db/test_database_structure.py @@ -326,3 +326,17 @@ def test_root_url(db_data_creator: DBDataCreator): ) table_tester.run_column_tests() + +@pytest.mark.asyncio +async def test_url_agency_suggestions_trigger(db_data_creator: DBDataCreator): + # Check that if an entry is added to the user_url_agency_suggestions table, + # The trigger checks that the corresponding entry `url_agency_suggestions` has value 'Manual Suggestion' + # And raises an error if not + dbdc = db_data_creator + await dbdc.batch_and_urls( + with_html_content=True + ) + # Insert + + + pytest.fail("Not implemented") \ No newline at end of file From 5975ce647868d885190437a88dd91b99ed9c4521 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 5 Feb 2025 10:59:23 -0500 Subject: [PATCH 045/244] Add first draft of agency annotation api endpoint --- api/routes/annotate.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/api/routes/annotate.py b/api/routes/annotate.py index 27b21708..04641878 100644 --- a/api/routes/annotate.py +++ b/api/routes/annotate.py @@ -73,3 +73,30 @@ async def annotate_url_for_record_type_and_get_next_url( metadata_type=URLMetadataAttributeType.RECORD_TYPE ) return result + +async def get_next_url_for_agency_annotation( + access_info: AccessInfo = Depends(get_access_info), + async_core: AsyncCore = Depends(get_async_core), +) -> GetNextURLForAnnotationResponse: + result = await async_core.get_next_url_for_annotation( + user_id=access_info.user_id, + metadata_type=URLMetadataAttributeType.AGENCY + ) + return result + +async def annotate_url_for_agency_and_get_next_url( + agency_annotation_post_info: RecordTypeAnnotationPostInfo, + metadata_id: int = Path(description="The metadata id for the associated URL metadata"), + async_core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info) +) -> GetNextURLForAnnotationResponse: + """ + Post URL annotation and get next URL to annotate + """ + result = await async_core.submit_and_get_next_url_for_annotation( + user_id=access_info.user_id, + metadata_id=metadata_id, + annotation=agency_annotation_post_info.agency.value, + metadata_type=URLMetadataAttributeType.AGENCY + ) + return result \ No newline at end of file From d8076fd2e3bc485f49a881047ba0bcb2cb27e738 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 7 Feb 2025 15:59:53 -0500 Subject: [PATCH 046/244] Begin draft on revision of agency identification task --- ...daf0_revise_agency_identification_logic.py | 107 ++++++++++++++++++ api/routes/annotate.py | 23 ++-- collector_db/AsyncDatabaseClient.py | 59 +++++++--- collector_db/StatementComposer.py | 18 ++- collector_db/models.py | 83 ++++++++++---- core/AsyncCore.py | 29 ++++- .../GetNextURLForAgencyAnnotationResponse.py | 22 ++++ core/DTOs/URLAgencySuggestionInfo.py | 1 + .../AgencyIdentificationTaskOperator.py | 9 +- tests/test_alembic/AlembicRunner.py | 7 ++ tests/test_alembic/test_revisions.py | 16 +++ .../collector_db/test_database_structure.py | 82 ++++++++++++-- .../tasks/test_agency_preannotation_task.py | 64 ++++++++--- 13 files changed, 447 insertions(+), 73 deletions(-) create mode 100644 alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py create mode 100644 core/DTOs/GetNextURLForAgencyAnnotationResponse.py diff --git a/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py b/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py new file mode 100644 index 00000000..ebe6cdf5 --- /dev/null +++ b/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py @@ -0,0 +1,107 @@ +"""Revise agency identification logic + +Revision ID: d7eb670edaf0 +Revises: 8c44e02733ae +Create Date: 2025-02-07 13:10:41.181578 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +from collector_db.enums import PGEnum + +# revision identifiers, used by Alembic. +revision: str = 'd7eb670edaf0' +down_revision: Union[str, None] = '8c44e02733ae' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +suggestion_type_enum = PGEnum( + 'Auto Suggestion', + 'Manual Suggestion', + 'Unknown', + 'New Agency', + 'Confirmed', name='url_agency_suggestion_type' +) + +def upgrade(): + # Create agencies table + op.create_table( + "agencies", + sa.Column("agency_id", sa.Integer(), primary_key=True), + sa.Column("name", sa.String(), nullable=False), + sa.Column("state", sa.String(), nullable=True), + sa.Column("county", sa.String(), nullable=True), + sa.Column("locality", sa.String(), nullable=True), + sa.Column("updated_at", sa.DateTime(), nullable=False, server_default=sa.func.now()), + ) + + # Create confirmed_url_agency table + op.create_table( + "confirmed_url_agency", + sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), + sa.Column("agency_id", sa.Integer(), sa.ForeignKey("agencies.agency_id"), nullable=False), + sa.Column("url_id", sa.Integer(), sa.ForeignKey("urls.id"), nullable=False), + ) + op.create_unique_constraint( + "uq_confirmed_url_agency", "confirmed_url_agency", ["agency_id", "url_id"] + ) + + # Create automated_url_agency_suggestions table + op.create_table( + "automated_url_agency_suggestions", + sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), + sa.Column("agency_id", sa.Integer(), sa.ForeignKey("agencies.agency_id"), nullable=False), + sa.Column("url_id", sa.Integer(), sa.ForeignKey("urls.id"), nullable=False), + sa.Column("is_unknown", sa.Boolean(), nullable=True), + ) + op.create_unique_constraint( + "uq_automated_url_agency_suggestions", "automated_url_agency_suggestions", ["agency_id", "url_id"] + ) + + # Create user_url_agency_suggestions table + op.create_table( + "user_url_agency_suggestions", + sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), + sa.Column("agency_id", sa.Integer(), sa.ForeignKey("agencies.agency_id"), nullable=True), + sa.Column("url_id", sa.Integer(), sa.ForeignKey("urls.id"), nullable=False), + sa.Column("user_id", sa.Integer(), nullable=False), + sa.Column("is_new", sa.Boolean(), nullable=True), + ) + op.create_unique_constraint( + "uq_user_url_agency_suggestions", "user_url_agency_suggestions", ["agency_id", "url_id", "user_id"] + ) + + op.drop_table('url_agency_suggestions') + suggestion_type_enum.drop(op.get_bind(), checkfirst=True) + + + +def downgrade(): + # Drop constraints first + op.drop_constraint("uq_confirmed_url_agency", "confirmed_url_agency", type_="unique") + op.drop_constraint("uq_automated_url_agency_suggestions", "automated_url_agency_suggestions", type_="unique") + op.drop_constraint("uq_user_url_agency_suggestions", "user_url_agency_suggestions", type_="unique") + + # Drop tables + op.drop_table("user_url_agency_suggestions") + op.drop_table("automated_url_agency_suggestions") + op.drop_table("confirmed_url_agency") + op.drop_table("agencies") + + op.create_table('url_agency_suggestions', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('url_id', sa.Integer(), nullable=False), + sa.Column('suggestion_type', suggestion_type_enum, nullable=False), + sa.Column('agency_id', sa.Integer(), nullable=True), + sa.Column('agency_name', sa.String(), nullable=True), + sa.Column('state', sa.String(), nullable=True), + sa.Column('county', sa.String(), nullable=True), + sa.Column('locality', sa.String(), nullable=True), + sa.Column('updated_at', sa.TIMESTAMP(), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['url_id'], ['urls.id'], ), + sa.PrimaryKeyConstraint('id') + ) + diff --git a/api/routes/annotate.py b/api/routes/annotate.py index 04641878..980c16f9 100644 --- a/api/routes/annotate.py +++ b/api/routes/annotate.py @@ -3,6 +3,8 @@ from api.dependencies import get_async_core from collector_db.enums import URLMetadataAttributeType from core.AsyncCore import AsyncCore +from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ + URLAgencyAnnotationPostInfo from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo @@ -77,26 +79,27 @@ async def annotate_url_for_record_type_and_get_next_url( async def get_next_url_for_agency_annotation( access_info: AccessInfo = Depends(get_access_info), async_core: AsyncCore = Depends(get_async_core), -) -> GetNextURLForAnnotationResponse: - result = await async_core.get_next_url_for_annotation( +) -> GetNextURLForAgencyAnnotationResponse: + result = await async_core.get_next_url_agency_for_annotation( user_id=access_info.user_id, - metadata_type=URLMetadataAttributeType.AGENCY ) return result async def annotate_url_for_agency_and_get_next_url( - agency_annotation_post_info: RecordTypeAnnotationPostInfo, - metadata_id: int = Path(description="The metadata id for the associated URL metadata"), + url_id: int, + agency_annotation_post_info: URLAgencyAnnotationPostInfo, async_core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info) -) -> GetNextURLForAnnotationResponse: +) -> GetNextURLForAgencyAnnotationResponse: """ Post URL annotation and get next URL to annotate """ - result = await async_core.submit_and_get_next_url_for_annotation( + await async_core.submit_url_agency_annotation( + user_id=access_info.user_id, + url_id=url_id, + agency_post_info=agency_annotation_post_info + ) + result = await async_core.get_next_url_agency_for_annotation( user_id=access_info.user_id, - metadata_id=metadata_id, - annotation=agency_annotation_post_info.agency.value, - metadata_type=URLMetadataAttributeType.AGENCY ) return result \ No newline at end of file diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index de3c7f3d..dbc2d3dc 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -3,7 +3,7 @@ from sqlalchemy import select, exists, func from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker -from sqlalchemy.orm import selectinload +from sqlalchemy.orm import selectinload, aliased from collector_db.ConfigManager import ConfigManager from collector_db.DTOs.MetadataAnnotationInfo import MetadataAnnotationInfo @@ -18,7 +18,7 @@ from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource, TaskType from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import URLMetadata, URL, URLErrorInfo, URLHTMLContent, Base, MetadataAnnotation, \ - RootURL, Task, TaskError, LinkTaskURL, URLAgencySuggestion, Batch + RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, ConfirmedUrlAgency, AutomatedUrlAgencySuggestion from collector_manager.enums import URLStatus, CollectorType from core.DTOs.GetTasksResponse import GetTasksResponse, GetTasksResponseTaskInfo from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseMetadataInfo, GetURLsResponseErrorInfo, \ @@ -26,7 +26,7 @@ from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO -from core.enums import BatchStatus +from core.enums import BatchStatus, SuggestionType def add_standard_limit_and_offset(statement, page, limit=100): @@ -585,12 +585,18 @@ async def has_urls_without_agency_suggestions( @session_manager async def get_urls_without_agency_suggestions(self, session: AsyncSession) -> list[AgencyIdentificationTDO]: + """ + Retrieve URLs without confirmed or suggested agencies + Args: + session: + + Returns: + + """ + statement = ( - select( - URL.id, - URL.collector_metadata, - Batch.strategy, - ).join(Batch) + select(URL.id, URL.collector_metadata, Batch.strategy) + .join(Batch) ) statement = self.statement_composer.exclude_urls_with_agency_suggestions(statement) statement = statement.limit(100) @@ -605,21 +611,48 @@ async def get_urls_without_agency_suggestions(self, session: AsyncSession) -> li ] @session_manager - async def add_agency_suggestions( + async def upsert_new_agencies( self, session: AsyncSession, suggestions: list[URLAgencySuggestionInfo] ): + """ + Add or update agencies in the database + """ for suggestion in suggestions: - url_agency_suggestion = URLAgencySuggestion( - url_id=suggestion.url_id, - suggestion_type=suggestion.suggestion_type, + agency = Agency( agency_id=suggestion.pdap_agency_id, - agency_name=suggestion.agency_name, + name=suggestion.agency_name, state=suggestion.state, county=suggestion.county, locality=suggestion.locality ) + await session.merge(agency) + + async def add_confirmed_agency_url_links( + self, + session: AsyncSession, + suggestions: list[URLAgencySuggestionInfo] + ): + for suggestion in suggestions: + confirmed_agency_url_link = ConfirmedUrlAgency( + agency_id=suggestion.pdap_agency_id, + url_id=suggestion.url_id + ) + session.add(confirmed_agency_url_link) + + @session_manager + async def add_agency_auto_suggestions( + self, + session: AsyncSession, + suggestions: list[URLAgencySuggestionInfo] + ): + for suggestion in suggestions: + url_agency_suggestion = AutomatedUrlAgencySuggestion( + url_id=suggestion.url_id, + agency_id=suggestion.pdap_agency_id, + is_unknown=suggestion.suggestion_type == SuggestionType.UNKNOWN + ) session.add(url_agency_suggestion) await session.commit() \ No newline at end of file diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index a04ed07f..fd1b11a9 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -1,8 +1,10 @@ from sqlalchemy import Select, select, exists, Table, func, Subquery +from sqlalchemy.orm import aliased from collector_db.enums import URLMetadataAttributeType, ValidationStatus -from collector_db.models import URL, URLHTMLContent, URLMetadata, MetadataAnnotation, URLAgencySuggestion +from collector_db.models import URL, URLHTMLContent, URLMetadata, MetadataAnnotation, AutomatedUrlAgencySuggestion, \ + ConfirmedUrlAgency from collector_manager.enums import URLStatus @@ -61,7 +63,13 @@ def simple_count_subquery(model, attribute: str, label: str) -> Subquery: def exclude_urls_with_agency_suggestions( statement: Select ): - return (statement.where(~exists( - select(URLAgencySuggestion.id). - where(URLAgencySuggestion.url_id == URL.id) - ))) + # Aliases for clarity + AutomatedSuggestion = aliased(AutomatedUrlAgencySuggestion) + ConfirmedAgency = aliased(ConfirmedUrlAgency) + + statement = (statement + .where(~exists().where(AutomatedSuggestion.url_id == URL.id)) # Exclude if automated suggestions exist + .where(~exists().where(ConfirmedAgency.url_id == URL.id)) + ) # Exclude if confirmed agencies exist + + return statement \ No newline at end of file diff --git a/collector_db/models.py b/collector_db/models.py index 81d9d2c3..064cf660 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -1,7 +1,8 @@ """ SQLAlchemy ORM models """ -from sqlalchemy import func, Column, Integer, String, TIMESTAMP, Float, JSON, ForeignKey, Text, UniqueConstraint +from sqlalchemy import func, Column, Integer, String, TIMESTAMP, Float, JSON, ForeignKey, Text, UniqueConstraint, \ + Boolean, DateTime from sqlalchemy.dialects import postgresql from sqlalchemy.orm import declarative_base, relationship @@ -96,7 +97,9 @@ class URL(Base): secondary="link_task_urls", back_populates="urls", ) - agency_suggestions = relationship("URLAgencySuggestion", back_populates="url", cascade="all, delete-orphan") + automated_agency_suggestions = relationship("AutomatedUrlAgencySuggestion", back_populates="url") + user_agency_suggestions = relationship("UserUrlAgencySuggestion", back_populates="url") + confirmed_agencies = relationship("ConfirmedUrlAgency", back_populates="url") # URL Metadata table definition @@ -306,29 +309,65 @@ class TaskError(Base): name="uq_task_id_error"), ) -class URLAgencySuggestion(Base): - __tablename__ = 'url_agency_suggestions' +class Agency(Base): + __tablename__ = "agencies" - id = Column(Integer, primary_key=True) - url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) - suggestion_type = Column( - PGEnum( - 'Auto Suggestion', - 'Manual Suggestion' - 'Unknown', - 'New Agency', - 'Confirmed', - name='url_agency_suggestion_type' - ), - nullable=False - ) - agency_id = Column(Integer, nullable=True) - agency_name = Column(String, nullable=True) + agency_id = Column(Integer, primary_key=True) + name = Column(String, nullable=False) state = Column(String, nullable=True) county = Column(String, nullable=True) locality = Column(String, nullable=True) - user_id = Column(Integer, nullable=True) - updated_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) + updated_at = Column(DateTime, nullable=False, default=func.now()) # Relationships - url = relationship("URL", back_populates="agency_suggestions") + confirmed_urls = relationship("ConfirmedUrlAgency", back_populates="agency") + automated_suggestions = relationship("AutomatedUrlAgencySuggestion", back_populates="agency") + user_suggestions = relationship("UserUrlAgencySuggestion", back_populates="agency") + + +class ConfirmedUrlAgency(Base): + __tablename__ = "confirmed_url_agency" + + id = Column(Integer, primary_key=True, autoincrement=True) + agency_id = Column(Integer, ForeignKey("agencies.agency_id"), nullable=False) + url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) + + agency = relationship("Agency", back_populates="confirmed_urls") + url = relationship("URL", back_populates="confirmed_agencies") + + __table_args__ = ( + UniqueConstraint("agency_id", "url_id", name="uq_confirmed_url_agency"), + ) + + +class AutomatedUrlAgencySuggestion(Base): + __tablename__ = "automated_url_agency_suggestions" + + id = Column(Integer, primary_key=True, autoincrement=True) + agency_id = Column(Integer, ForeignKey("agencies.agency_id"), nullable=False) + url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) + is_unknown = Column(Boolean, nullable=True) + + agency = relationship("Agency", back_populates="automated_suggestions") + url = relationship("URL", back_populates="automated_agency_suggestions") + + __table_args__ = ( + UniqueConstraint("agency_id", "url_id", name="uq_automated_url_agency_suggestions"), + ) + + +class UserUrlAgencySuggestion(Base): + __tablename__ = "user_url_agency_suggestions" + + id = Column(Integer, primary_key=True, autoincrement=True) + agency_id = Column(Integer, ForeignKey("agencies.agency_id"), nullable=True) + url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) + user_id = Column(Integer, nullable=False) + is_new = Column(Boolean, nullable=True) + + agency = relationship("Agency", back_populates="user_suggestions") + url = relationship("URL", back_populates="user_agency_suggestions") + + __table_args__ = ( + UniqueConstraint("agency_id", "url_id", "user_id", name="uq_user_url_agency_suggestions"), + ) \ No newline at end of file diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 5e0a9590..11225da2 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -7,6 +7,8 @@ from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.DTOs.URLAnnotationInfo import URLAnnotationInfo from collector_db.enums import TaskType, URLMetadataAttributeType +from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ + URLAgencyAnnotationPostInfo from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo @@ -15,7 +17,7 @@ from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator -from core.enums import BatchStatus +from core.enums import BatchStatus, SuggestionType from html_tag_collector.DataClassTags import convert_to_response_html_info from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.URLRequestInterface import URLRequestInterface @@ -157,3 +159,28 @@ async def get_task_info(self, task_id: int) -> TaskInfo: async def get_tasks(self, page: int, task_type: TaskType, task_status: BatchStatus) -> GetTasksResponse: return await self.adb_client.get_tasks(page=page, task_type=task_type, task_status=task_status) + + async def get_next_url_agency_for_annotation( + self, + user_id: int + ) -> GetNextURLForAgencyAnnotationResponse: + return await self.adb_client.get_next_url_agency_for_annotation(user_id=user_id) + + async def submit_url_agency_annotation( + self, + user_id: int, + url_id: int, + agency_post_info: URLAgencyAnnotationPostInfo + ) -> GetNextURLForAgencyAnnotationResponse: + if agency_post_info.suggested_agency == "NEW": + suggestion_type = SuggestionType.NEW_AGENCY + agency_suggestion_id = None + else: + suggestion_type = SuggestionType.MANUAL_SUGGESTION + agency_suggestion_id = agency_post_info.suggested_agency + return await self.adb_client.submit_url_agency_annotation( + user_id=user_id, + url_id=url_id, + suggestion_type=suggestion_type, + agency_suggestion_id=agency_suggestion_id + ) diff --git a/core/DTOs/GetNextURLForAgencyAnnotationResponse.py b/core/DTOs/GetNextURLForAgencyAnnotationResponse.py new file mode 100644 index 00000000..4710275e --- /dev/null +++ b/core/DTOs/GetNextURLForAgencyAnnotationResponse.py @@ -0,0 +1,22 @@ +from typing import Optional, Literal + +from core.enums import SuggestionType +from html_tag_collector.DataClassTags import ResponseHTMLInfo + +class GetNextURLForAgencyAgencyInfo: + suggestion_type: SuggestionType + pdap_agency_id: Optional[int] = None + agency_name: Optional[str] = None + state: Optional[str] = None + county: Optional[str] = None + locality: Optional[str] = None + +class GetNextURLForAgencyAnnotationResponse: + url_id: int + agency_suggestions: list[ + GetNextURLForAgencyAgencyInfo + ] + html_info: ResponseHTMLInfo + +class URLAgencyAnnotationPostInfo: + suggested_agency: int | Literal["NEW"] \ No newline at end of file diff --git a/core/DTOs/URLAgencySuggestionInfo.py b/core/DTOs/URLAgencySuggestionInfo.py index 9729cfb5..2eae0496 100644 --- a/core/DTOs/URLAgencySuggestionInfo.py +++ b/core/DTOs/URLAgencySuggestionInfo.py @@ -13,3 +13,4 @@ class URLAgencySuggestionInfo(BaseModel): state: Optional[str] = None county: Optional[str] = None locality: Optional[str] = None + user_id: Optional[int] = None diff --git a/core/classes/AgencyIdentificationTaskOperator.py b/core/classes/AgencyIdentificationTaskOperator.py index 2c027a0f..05fac3cc 100644 --- a/core/classes/AgencyIdentificationTaskOperator.py +++ b/core/classes/AgencyIdentificationTaskOperator.py @@ -3,12 +3,14 @@ from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.enums import TaskType from collector_manager.enums import CollectorType +from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO from core.classes.TaskOperatorBase import TaskOperatorBase from core.classes.subtasks.AutoGooglerAgencyIdentificationSubtask import AutoGooglerAgencyIdentificationSubtask from core.classes.subtasks.CKANAgencyIdentificationSubtask import CKANAgencyIdentificationSubtask from core.classes.subtasks.CommonCrawlerAgencyIdentificationSubtask import CommonCrawlerAgencyIdentificationSubtask from core.classes.subtasks.MuckrockAgencyIdentificationSubtask import MuckrockAgencyIdentificationSubtask +from core.enums import SuggestionType from pdap_api_client.PDAPClient import PDAPClient @@ -61,7 +63,7 @@ async def get_subtask(self, collector_type: CollectorType): ) @staticmethod - async def run_subtask(subtask, url_id, collector_metadata): + async def run_subtask(subtask, url_id, collector_metadata) -> list[URLAgencySuggestionInfo]: return await subtask.run(url_id=url_id, collector_metadata=collector_metadata) async def inner_task_logic(self): @@ -86,7 +88,10 @@ async def inner_task_logic(self): ) error_infos.append(error_info) - await self.adb_client.add_agency_suggestions(all_agency_suggestions) + await self.adb_client.upsert_new_agencies(all_agency_suggestions) + confirmed_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type == SuggestionType.CONFIRMED] + await self.adb_client.add_confirmed_agency_url_links(confirmed_suggestions) + await self.adb_client.add_agency_auto_suggestions(all_agency_suggestions) await self.adb_client.add_url_error_infos(error_infos) diff --git a/tests/test_alembic/AlembicRunner.py b/tests/test_alembic/AlembicRunner.py index 51347d55..867c8ba3 100644 --- a/tests/test_alembic/AlembicRunner.py +++ b/tests/test_alembic/AlembicRunner.py @@ -21,6 +21,7 @@ def reflect(self): def upgrade(self, revision: str): command.upgrade(self.alembic_config, revision) + self.reflect() def downgrade(self, revision: str): print("Downgrading...") @@ -33,3 +34,9 @@ def reset_schema(self): self.connection.exec_driver_sql("DROP SCHEMA public CASCADE;") self.connection.exec_driver_sql("CREATE SCHEMA public;") self.connection.commit() + + def table_exists(self, table_name: str) -> bool: + return table_name in self.inspector.get_table_names() + + def tables_exist(self, table_names: list[str]) -> bool: + return all(table_name in self.inspector.get_table_names() for table_name in table_names) diff --git a/tests/test_alembic/test_revisions.py b/tests/test_alembic/test_revisions.py index 51096ec5..aa3deb87 100644 --- a/tests/test_alembic/test_revisions.py +++ b/tests/test_alembic/test_revisions.py @@ -359,3 +359,19 @@ def column_check() -> bool: alembic_runner.reflect() alembic_runner.upgrade("8c44e02733ae") assert column_check() + +def test_revise_agency_suggestions(alembic_runner): + + tables_to_check = [ + "user_url_agency_suggestions", + "automated_url_agency_suggestions", + "agencies", + "confirmed_url_agency" + ] + + alembic_runner.upgrade("8c44e02733ae") + assert alembic_runner.table_exists("url_agency_suggestions") + assert not alembic_runner.tables_exist(tables_to_check) + alembic_runner.upgrade("d7eb670edaf0") + assert not alembic_runner.table_exists("url_agency_suggestions") + assert alembic_runner.tables_exist(tables_to_check) \ No newline at end of file diff --git a/tests/test_automated/integration/collector_db/test_database_structure.py b/tests/test_automated/integration/collector_db/test_database_structure.py index 462f3b24..30cf6f27 100644 --- a/tests/test_automated/integration/collector_db/test_database_structure.py +++ b/tests/test_automated/integration/collector_db/test_database_structure.py @@ -14,15 +14,16 @@ import sqlalchemy as sa from sqlalchemy import create_engine from sqlalchemy.dialects import postgresql -from sqlalchemy.exc import DataError +from sqlalchemy.exc import DataError, DBAPIError from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_db.enums import URLHTMLContentType from collector_db.helper_functions import get_postgres_connection_string -from collector_db.models import Base +from collector_db.models import Base, Agency from collector_manager.enums import CollectorType, URLStatus -from core.enums import BatchStatus -from tests.helpers.DBDataCreator import DBDataCreator +from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from core.enums import BatchStatus, SuggestionType +from tests.helpers.DBDataCreator import DBDataCreator, BatchURLCreationInfo from util.helper_functions import get_enum_values SATypes: TypeAlias = sa.Integer or sa.String or postgresql.ENUM or sa.TIMESTAMP or sa.Text @@ -333,10 +334,77 @@ async def test_url_agency_suggestions_trigger(db_data_creator: DBDataCreator): # The trigger checks that the corresponding entry `url_agency_suggestions` has value 'Manual Suggestion' # And raises an error if not dbdc = db_data_creator - await dbdc.batch_and_urls( + creation_info: BatchURLCreationInfo = await dbdc.batch_and_urls( with_html_content=True ) - # Insert + # Insert agency suggestion + suggestion_info = URLAgencySuggestionInfo( + url_id=creation_info.url_ids[0], + suggestion_type=SuggestionType.MANUAL_SUGGESTION, + pdap_agency_id=1, + agency_name="Test Agency", + state="Test State", + county="Test County", + locality="Test Locality", + user_id=None + ) + + adb_client = dbdc.adb_client + + # Without the User ID, should fail + with pytest.raises(DBAPIError): + await adb_client.add_agency_suggestions([suggestion_info]) + + # With the User ID, should succeed + suggestion_info.user_id = 1 + await adb_client.add_agency_suggestions([suggestion_info]) + +@pytest.mark.asyncio +async def test_upset_new_agencies(db_data_creator: DBDataCreator): + """ + Check that if the agency doesn't exist, it is added + But if the agency does exist, it is updated with new information + """ + + suggestions = [] + for i in range(3): + suggestion = URLAgencySuggestionInfo( + url_id=1, + suggestion_type=SuggestionType.AUTO_SUGGESTION, + pdap_agency_id=i, + agency_name=f"Test Agency {i}", + state=f"Test State {i}", + county=f"Test County {i}", + locality=f"Test Locality {i}", + user_id=1 + ) + suggestions.append(suggestion) + + adb_client = db_data_creator.adb_client + await adb_client.upsert_new_agencies(suggestions) + + update_suggestion = URLAgencySuggestionInfo( + url_id=1, + suggestion_type=SuggestionType.AUTO_SUGGESTION, + pdap_agency_id=0, + agency_name="Updated Test Agency", + state="Updated Test State", + county="Updated Test County", + locality="Updated Test Locality", + user_id=1 + ) + + await adb_client.upsert_new_agencies([update_suggestion]) + + rows = await adb_client.get_all(Agency) + + assert len(rows) == 3 + + d = {} + for row in rows: + d[row.agency_id] = row.name + assert d[0] == "Updated Test Agency" + assert d[1] == "Test Agency 1" + assert d[2] == "Test Agency 2" - pytest.fail("Not implemented") \ No newline at end of file diff --git a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py index 94f6c1d3..2ee9ec45 100644 --- a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py +++ b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py @@ -6,6 +6,7 @@ from aiohttp import ClientSession from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponseType, AgencyLookupResponse +from collector_db.models import ConfirmedUrlAgency, Agency, AutomatedUrlAgencySuggestion from collector_manager.enums import CollectorType from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.classes.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator @@ -14,12 +15,38 @@ from core.classes.subtasks.CommonCrawlerAgencyIdentificationSubtask import CommonCrawlerAgencyIdentificationSubtask from core.classes.subtasks.MuckrockAgencyIdentificationSubtask import MuckrockAgencyIdentificationSubtask from core.enums import SuggestionType -from helpers.DBDataCreator import DBDataCreator, BatchURLCreationInfo from pdap_api_client.AccessManager import AccessManager from pdap_api_client.DTOs import MatchAgencyResponse, MatchAgencyInfo from pdap_api_client.PDAPClient import PDAPClient from pdap_api_client.enums import MatchAgencyResponseStatus - +from tests.helpers.DBDataCreator import DBDataCreator, BatchURLCreationInfo + +sample_agency_suggestions = [ + URLAgencySuggestionInfo( + suggestion_type=SuggestionType.UNKNOWN, + pdap_agency_id=None, + agency_name=None, + state=None, + county=None, + locality=None + ), + URLAgencySuggestionInfo( + suggestion_type=SuggestionType.CONFIRMED, + pdap_agency_id=1, + agency_name="Test Agency", + state="Test State", + county="Test County", + locality="Test Locality" + ), + URLAgencySuggestionInfo( + suggestion_type=SuggestionType.AUTO_SUGGESTION, + pdap_agency_id=2, + agency_name="Test Agency 2", + state="Test State 2", + county="Test County 2", + locality="Test Locality 2" + ) +] @pytest.mark.asyncio async def test_agency_preannotation_task(db_data_creator: DBDataCreator): @@ -28,17 +55,10 @@ async def mock_run_subtask( url_id: int, collector_metadata: Optional[dict] ): - return [ - URLAgencySuggestionInfo( - url_id=url_id, - suggestion_type=SuggestionType.UNKNOWN, - pdap_agency_id=None, - agency_name=None, - state=None, - county=None, - locality=None - ) - ] + val = url_id % 3 + suggestion = sample_agency_suggestions[val] + suggestion.url_id = url_id + return [suggestion] async with ClientSession() as session: mock = MagicMock() @@ -121,6 +141,24 @@ async def mock_run_subtask( assert mock.call_count == 6 + + # Check confirmed and auto suggestions + adb_client = db_data_creator.adb_client + confirmed_suggestions = await adb_client.get_all(ConfirmedUrlAgency) + assert len(confirmed_suggestions) == 2 + + agencies = await adb_client.get_all(Agency) + assert len(agencies) == 2 + + auto_suggestions = await adb_client.get_all(AutomatedUrlAgencySuggestion) + assert len(auto_suggestions) == 4 + + # Of the auto suggestions, 2 should be unknown + assert len([s for s in auto_suggestions if s.is_unknown]) == 2 + + # Of the auto suggestions, 2 should not be unknown + assert len([s for s in auto_suggestions if not s.is_unknown]) == 2 + @pytest.mark.asyncio async def test_common_crawler_subtask(db_data_creator: DBDataCreator): # Test that common_crawler subtask correctly adds URL to From 412ad7e78654dc36d29d647b32b8c80b21c2a54f Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 7 Feb 2025 19:12:11 -0500 Subject: [PATCH 047/244] Revise TaskOperator logic --- ...daf0_revise_agency_identification_logic.py | 25 ++- collector_db/AsyncDatabaseClient.py | 1 + collector_db/DTOs/InsertURLsInfo.py | 1 + collector_db/DatabaseClient.py | 1 + collector_db/models.py | 2 +- core/AsyncCore.py | 96 ++++++++---- core/DTOs/TaskOperatorRunInfo.py | 14 ++ .../AgencyIdentificationTaskOperator.py | 6 +- core/classes/TaskOperatorBase.py | 37 +++-- tests/helpers/DBDataCreator.py | 5 +- tests/test_alembic/AlembicRunner.py | 9 +- tests/test_alembic/test_revisions.py | 136 ++++++++--------- .../collector_db/test_database_structure.py | 30 ---- .../integration/core/test_async_core.py | 144 ++++++++++++++++++ .../tasks/test_agency_preannotation_task.py | 33 ++-- .../integration/tasks/test_example_task.py | 44 +----- .../integration/tasks/test_url_html_task.py | 20 +-- .../tasks/test_url_record_type_task.py | 16 +- .../test_url_relevancy_huggingface_task.py | 4 +- 19 files changed, 411 insertions(+), 213 deletions(-) create mode 100644 core/DTOs/TaskOperatorRunInfo.py create mode 100644 tests/test_automated/integration/core/test_async_core.py diff --git a/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py b/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py index ebe6cdf5..4db28b9d 100644 --- a/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py +++ b/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py @@ -53,13 +53,30 @@ def upgrade(): op.create_table( "automated_url_agency_suggestions", sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), - sa.Column("agency_id", sa.Integer(), sa.ForeignKey("agencies.agency_id"), nullable=False), + sa.Column("agency_id", sa.Integer(), sa.ForeignKey("agencies.agency_id"), nullable=True), sa.Column("url_id", sa.Integer(), sa.ForeignKey("urls.id"), nullable=False), sa.Column("is_unknown", sa.Boolean(), nullable=True), ) op.create_unique_constraint( "uq_automated_url_agency_suggestions", "automated_url_agency_suggestions", ["agency_id", "url_id"] ) + op.execute(""" + CREATE OR REPLACE FUNCTION enforce_no_agency_id_if_unknown() + RETURNS TRIGGER AS $$ + BEGIN + IF NEW.is_unknown = TRUE AND NEW.agency_id IS NOT NULL THEN + RAISE EXCEPTION 'agency_id must be null when is_unknown is TRUE'; + END IF; + RETURN NEW; + END; + $$ LANGUAGE plpgsql; + """) + op.execute(""" + CREATE TRIGGER enforce_no_agency_id_if_unknown + BEFORE INSERT ON automated_url_agency_suggestions + FOR EACH ROW + EXECUTE FUNCTION enforce_no_agency_id_if_unknown(); + """) # Create user_url_agency_suggestions table op.create_table( @@ -104,4 +121,10 @@ def downgrade(): sa.ForeignKeyConstraint(['url_id'], ['urls.id'], ), sa.PrimaryKeyConstraint('id') ) + op.execute(""" + DROP TRIGGER IF EXISTS enforce_no_agency_id_if_unknown ON automated_url_agency_suggestions; + """) + op.execute(""" + DROP FUNCTION IF EXISTS enforce_no_agency_id_if_unknown; + """) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index dbc2d3dc..d89ffc10 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -629,6 +629,7 @@ async def upsert_new_agencies( ) await session.merge(agency) + @session_manager async def add_confirmed_agency_url_links( self, session: AsyncSession, diff --git a/collector_db/DTOs/InsertURLsInfo.py b/collector_db/DTOs/InsertURLsInfo.py index 079510d2..da2ee39a 100644 --- a/collector_db/DTOs/InsertURLsInfo.py +++ b/collector_db/DTOs/InsertURLsInfo.py @@ -5,6 +5,7 @@ class InsertURLsInfo(BaseModel): url_mappings: list[URLMapping] + url_ids: list[int] total_count: int = 0 original_count: int = 0 duplicate_count: int = 0 diff --git a/collector_db/DatabaseClient.py b/collector_db/DatabaseClient.py index 2a659f3f..372cca8e 100644 --- a/collector_db/DatabaseClient.py +++ b/collector_db/DatabaseClient.py @@ -125,6 +125,7 @@ def insert_urls(self, url_infos: List[URLInfo], batch_id: int) -> InsertURLsInfo total_count=len(url_infos), original_count=len(url_mappings), duplicate_count=len(duplicates), + url_ids=[url_mapping.url_id for url_mapping in url_mappings] ) @session_manager diff --git a/collector_db/models.py b/collector_db/models.py index 064cf660..ee43f35b 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -344,7 +344,7 @@ class AutomatedUrlAgencySuggestion(Base): __tablename__ = "automated_url_agency_suggestions" id = Column(Integer, primary_key=True, autoincrement=True) - agency_id = Column(Integer, ForeignKey("agencies.agency_id"), nullable=False) + agency_id = Column(Integer, ForeignKey("agencies.agency_id"), nullable=True) url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) is_unknown = Column(Boolean, nullable=True) diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 11225da2..2ec17da5 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -13,7 +13,9 @@ from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo from core.DTOs.AnnotationRequestInfo import AnnotationRequestInfo +from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome from core.classes.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator +from core.classes.TaskOperatorBase import TaskOperatorBase from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator @@ -44,55 +46,89 @@ def __init__( self.logger = logging.getLogger(__name__) self.logger.setLevel(logging.INFO) - async def run_url_html_task(self): + async def get_url_html_task_operator(self): self.logger.info("Running URL HTML Task") operator = URLHTMLTaskOperator( adb_client=self.adb_client, url_request_interface=self.url_request_interface, html_parser=self.html_parser ) - await operator.run_task() + return operator - async def run_url_relevance_huggingface_task(self): + async def get_url_relevance_huggingface_task_operator(self): self.logger.info("Running URL Relevance Huggingface Task") operator = URLRelevanceHuggingfaceTaskOperator( adb_client=self.adb_client, huggingface_interface=self.huggingface_interface ) - await operator.run_task() + return operator - async def run_url_record_type_task(self): - self.logger.info("Running URL Record Type Task") + async def get_url_record_type_task_operator(self): operator = URLRecordTypeTaskOperator( adb_client=self.adb_client, classifier=OpenAIRecordClassifier() ) - await operator.run_task() - - async def run_agency_identification_task(self): - self.logger.info("Running Agency Identification Task") - async with ClientSession() as session: - pdap_client = PDAPClient( - access_manager=AccessManager( - email=get_from_env("PDAP_EMAIL"), - password=get_from_env("PDAP_PASSWORD"), - api_key=get_from_env("PDAP_API_KEY"), - session=session - ), - ) - muckrock_api_interface = MuckrockAPIInterface(session=session) - operator = AgencyIdentificationTaskOperator( - adb_client=self.adb_client, - pdap_client=pdap_client, - muckrock_api_interface=muckrock_api_interface - ) - await operator.run_task() + return operator + + async def get_agency_identification_task_operator(self): + session = ClientSession() + pdap_client = PDAPClient( + access_manager=AccessManager( + email=get_from_env("PDAP_EMAIL"), + password=get_from_env("PDAP_PASSWORD"), + api_key=get_from_env("PDAP_API_KEY"), + session=session + ), + ) + muckrock_api_interface = MuckrockAPIInterface(session=session) + operator = AgencyIdentificationTaskOperator( + adb_client=self.adb_client, + pdap_client=pdap_client, + muckrock_api_interface=muckrock_api_interface + ) + return operator + + async def get_task_operators(self) -> list[TaskOperatorBase]: + return [ + await self.get_url_html_task_operator(), + await self.get_url_relevance_huggingface_task_operator(), + await self.get_url_record_type_task_operator(), + await self.get_agency_identification_task_operator() + ] async def run_tasks(self): - await self.run_url_html_task() - await self.run_url_relevance_huggingface_task() - await self.run_url_record_type_task() - await self.run_agency_identification_task() + operators = await self.get_task_operators() + for operator in operators: + meets_prereq = await operator.meets_task_prerequisites() + if not meets_prereq: + self.logger.info(f"Skipping {operator.task_type.value} Task") + continue + task_id = await self.initiate_task_in_db(task_type=operator.task_type) + run_info: TaskOperatorRunInfo = await operator.run_task(task_id) + await self.conclude_task(run_info) + + async def conclude_task(self, run_info): + await self.adb_client.link_urls_to_task(task_id=run_info.task_id, url_ids=run_info.linked_url_ids) + await self.handle_outcome(run_info) + + async def initiate_task_in_db(self, task_type: TaskType) -> int: + self.logger.info(f"Initiating {task_type.value} Task") + task_id = await self.adb_client.initiate_task(task_type=task_type) + return task_id + + async def handle_outcome(self, run_info: TaskOperatorRunInfo): + match run_info.outcome: + case TaskOperatorOutcome.ERROR: + await self.handle_task_error(run_info) + case TaskOperatorOutcome.SUCCESS: + await self.adb_client.update_task_status( + task_id=run_info.task_id, + status=BatchStatus.COMPLETE + ) + + async def handle_task_error(self, run_info: TaskOperatorRunInfo): + await self.adb_client.update_task_status(task_id=run_info.task_id, status=BatchStatus.ERROR) + await self.adb_client.add_task_error(task_id=run_info.task_id, error=run_info.message) async def convert_to_annotation_request_info(self, url_info: URLAnnotationInfo) -> AnnotationRequestInfo: response_html_info = convert_to_response_html_info( diff --git a/core/DTOs/TaskOperatorRunInfo.py b/core/DTOs/TaskOperatorRunInfo.py new file mode 100644 index 00000000..6b5c29e0 --- /dev/null +++ b/core/DTOs/TaskOperatorRunInfo.py @@ -0,0 +1,14 @@ +from enum import Enum +from typing import Optional + +from pydantic import BaseModel + +class TaskOperatorOutcome(Enum): + SUCCESS = "success" + ERROR = "error" + +class TaskOperatorRunInfo(BaseModel): + task_id: Optional[int] + linked_url_ids: list[int] + outcome: TaskOperatorOutcome + message: str = "" \ No newline at end of file diff --git a/core/classes/AgencyIdentificationTaskOperator.py b/core/classes/AgencyIdentificationTaskOperator.py index 05fac3cc..de27f6cb 100644 --- a/core/classes/AgencyIdentificationTaskOperator.py +++ b/core/classes/AgencyIdentificationTaskOperator.py @@ -88,10 +88,12 @@ async def inner_task_logic(self): ) error_infos.append(error_info) - await self.adb_client.upsert_new_agencies(all_agency_suggestions) + non_unknown_agency_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type != SuggestionType.UNKNOWN] + await self.adb_client.upsert_new_agencies(non_unknown_agency_suggestions) confirmed_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type == SuggestionType.CONFIRMED] await self.adb_client.add_confirmed_agency_url_links(confirmed_suggestions) - await self.adb_client.add_agency_auto_suggestions(all_agency_suggestions) + non_confirmed_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type != SuggestionType.CONFIRMED] + await self.adb_client.add_agency_auto_suggestions(non_confirmed_suggestions) await self.adb_client.add_url_error_infos(error_infos) diff --git a/core/classes/TaskOperatorBase.py b/core/classes/TaskOperatorBase.py index 7998713c..ece3bc81 100644 --- a/core/classes/TaskOperatorBase.py +++ b/core/classes/TaskOperatorBase.py @@ -2,6 +2,7 @@ from abc import ABC, abstractmethod from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.enums import TaskType +from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome, TaskOperatorRunInfo from core.enums import BatchStatus @@ -11,6 +12,7 @@ def __init__(self, adb_client: AsyncDatabaseClient): self.adb_client = adb_client self.task_id = None self.tasks_linked = False + self.linked_url_ids = [] @property @abstractmethod @@ -26,8 +28,7 @@ async def meets_task_prerequisites(self): raise NotImplementedError async def link_urls_to_task(self, url_ids: list[int]): - await self.adb_client.link_urls_to_task(task_id=self.task_id, url_ids=url_ids) - self.tasks_linked = True + self.linked_url_ids = url_ids async def initiate_task_in_db(self) -> int: task_id = await self.adb_client.initiate_task( @@ -35,22 +36,32 @@ async def initiate_task_in_db(self) -> int: ) return task_id - async def conclude_task_in_db(self): - if not self.tasks_linked: + async def conclude_task(self): + if not self.linked_url_ids: raise Exception("Task has not been linked to any URLs") - await self.adb_client.update_task_status(task_id=self.task_id, status=BatchStatus.COMPLETE) - - async def run_task(self): - if not await self.meets_task_prerequisites(): - print(f"Task {self.task_type.value} does not meet prerequisites. Skipping...") - return - self.task_id = await self.initiate_task_in_db() + return await self.run_info( + outcome=TaskOperatorOutcome.SUCCESS, + message="Task completed successfully" + ) + async def run_task(self, task_id: int) -> TaskOperatorRunInfo: + self.task_id = task_id try: await self.inner_task_logic() - await self.conclude_task_in_db() + return await self.conclude_task() except Exception as e: - await self.handle_task_error(e) + return await self.run_info( + outcome=TaskOperatorOutcome.ERROR, + message=str(e) + ) + + async def run_info(self, outcome: TaskOperatorOutcome, message: str): + return TaskOperatorRunInfo( + task_id=self.task_id, + linked_url_ids=self.linked_url_ids, + outcome=outcome, + message=message + ) @abstractmethod async def inner_task_logic(self): diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index c9a6b31a..2d6b603f 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -72,7 +72,10 @@ def urls(self, batch_id: int, url_count: int) -> InsertURLsInfo: ) ) - return self.db_client.insert_urls(url_infos=url_infos, batch_id=batch_id) + return self.db_client.insert_urls( + url_infos=url_infos, + batch_id=batch_id, + ) def duplicate_urls(self, duplicate_batch_id: int, url_ids: list[int]): """ diff --git a/tests/test_alembic/AlembicRunner.py b/tests/test_alembic/AlembicRunner.py index 867c8ba3..cb435d5a 100644 --- a/tests/test_alembic/AlembicRunner.py +++ b/tests/test_alembic/AlembicRunner.py @@ -2,7 +2,7 @@ from alembic import command from alembic.config import Config -from sqlalchemy import Connection, Inspector, MetaData, inspect +from sqlalchemy import Connection, Inspector, MetaData, inspect, text from sqlalchemy.orm import scoped_session @@ -40,3 +40,10 @@ def table_exists(self, table_name: str) -> bool: def tables_exist(self, table_names: list[str]) -> bool: return all(table_name in self.inspector.get_table_names() for table_name in table_names) + + def execute(self, sql: str): + result = self.connection.execute(text(sql)) + if result.cursor is not None: + results = result.fetchall() + self.connection.commit() + return results diff --git a/tests/test_alembic/test_revisions.py b/tests/test_alembic/test_revisions.py index aa3deb87..343890df 100644 --- a/tests/test_alembic/test_revisions.py +++ b/tests/test_alembic/test_revisions.py @@ -164,39 +164,38 @@ def test_convert_batch_strategy_status_to_enum(alembic_runner): "aborted" ] d = {} - with alembic_runner.session() as session: - for strategy, status in product(existing_strategy_strings, existing_status_strings): - # Execute inserts and store each ID - id_ = session.execute(text( - f""" - INSERT INTO BATCHES - (strategy, user_id, status, total_url_count, original_url_count, duplicate_url_count) - VALUES( - '{strategy}', - 1, - '{status}', - 0, - 0, - 0 - ) - RETURNING ID; - """ - )).scalar() - d[id_] = [strategy, status] - session.commit() + for strategy, status in product(existing_strategy_strings, existing_status_strings): + # Execute inserts and store each ID + query = f""" + INSERT INTO BATCHES + (strategy, user_id, status, total_url_count, original_url_count, duplicate_url_count) + VALUES( + '{strategy}', + 1, + '{status}', + 0, + 0, + 0 + ) + RETURNING ID; + """ + + id_ = alembic_runner.execute(query)[0][0] + d[id_] = [strategy, status] alembic_runner.upgrade('db6d60feda7d') - with alembic_runner.session() as session: - # Assert all strategies and statuses remain the same - for id_ in d.keys(): - strategy, status = d[id_] - result = session.execute(text( - f""" - SELECT strategy, status FROM BATCHES WHERE id = {id_}; - """ - )).fetchone() - assert result[0] == strategy - assert result [1] == status + + # Assert all strategies and statuses remain the same + for id_ in d.keys(): + strategy, status = d[id_] + + result = alembic_runner.execute( + f""" + SELECT strategy, status FROM BATCHES WHERE id = {id_}; + """ + )[0] + assert result[0] == strategy + assert result [1] == status def test_convert_url_outcome_to_enum(alembic_runner): @@ -209,50 +208,49 @@ def test_convert_url_outcome_to_enum(alembic_runner): 'duplicate', ] d = {} - with alembic_runner.session() as session: - batch_id = session.execute(text( - """INSERT INTO BATCHES - (strategy, user_id, status, total_url_count, original_url_count, duplicate_url_count) - VALUES( - 'ckan', - 1, - 'in-process', - 0, - 0, - 0 - ) - RETURNING ID; + # with alembic_runner.session() as session: + batch_id = alembic_runner.execute( + """INSERT INTO BATCHES + (strategy, user_id, status, total_url_count, original_url_count, duplicate_url_count) + VALUES( + 'ckan', + 1, + 'in-process', + 0, + 0, + 0 + ) + RETURNING ID; + """ + )[0][0] + + + for outcome in existing_outcome_strings: + id_ = alembic_runner.execute( + f""" + INSERT INTO URLS + (batch_id, url, collector_metadata, outcome) + VALUES ( + '{batch_id}', + 'https://example.com/{outcome}', + '{{}}', + '{outcome}' + ) + RETURNING ID; """ - )).scalar() - - for outcome in existing_outcome_strings: - id_ = session.execute(text( - f""" - INSERT INTO URLS - (batch_id, url, collector_metadata, outcome) - VALUES ( - '{batch_id}', - 'https://example.com/{outcome}', - '{{}}', - '{outcome}' - ) - RETURNING ID; - """ - )).scalar() - d[id_] = outcome - session.commit() + )[0][0] + d[id_] = outcome alembic_runner.upgrade('e27c5f8409a3') - with alembic_runner.session() as session: - for id_ in d.keys(): - outcome = d[id_] + for id_ in d.keys(): + outcome = d[id_] - result = session.execute(text( - f"""SELECT OUTCOME FROM URLS WHERE ID = {id_};""" - )).scalar() + result = alembic_runner.execute( + f"""SELECT OUTCOME FROM URLS WHERE ID = {id_};""" + )[0][0] - assert result == outcome + assert result == outcome def test_create_htmlcontent_and_rooturl_tables(alembic_runner): alembic_runner.upgrade('e27c5f8409a3') diff --git a/tests/test_automated/integration/collector_db/test_database_structure.py b/tests/test_automated/integration/collector_db/test_database_structure.py index 30cf6f27..cdf93801 100644 --- a/tests/test_automated/integration/collector_db/test_database_structure.py +++ b/tests/test_automated/integration/collector_db/test_database_structure.py @@ -328,36 +328,6 @@ def test_root_url(db_data_creator: DBDataCreator): table_tester.run_column_tests() -@pytest.mark.asyncio -async def test_url_agency_suggestions_trigger(db_data_creator: DBDataCreator): - # Check that if an entry is added to the user_url_agency_suggestions table, - # The trigger checks that the corresponding entry `url_agency_suggestions` has value 'Manual Suggestion' - # And raises an error if not - dbdc = db_data_creator - creation_info: BatchURLCreationInfo = await dbdc.batch_and_urls( - with_html_content=True - ) - # Insert agency suggestion - suggestion_info = URLAgencySuggestionInfo( - url_id=creation_info.url_ids[0], - suggestion_type=SuggestionType.MANUAL_SUGGESTION, - pdap_agency_id=1, - agency_name="Test Agency", - state="Test State", - county="Test County", - locality="Test Locality", - user_id=None - ) - - adb_client = dbdc.adb_client - - # Without the User ID, should fail - with pytest.raises(DBAPIError): - await adb_client.add_agency_suggestions([suggestion_info]) - - # With the User ID, should succeed - suggestion_info.user_id = 1 - await adb_client.add_agency_suggestions([suggestion_info]) @pytest.mark.asyncio async def test_upset_new_agencies(db_data_creator: DBDataCreator): diff --git a/tests/test_automated/integration/core/test_async_core.py b/tests/test_automated/integration/core/test_async_core.py new file mode 100644 index 00000000..3b99d15c --- /dev/null +++ b/tests/test_automated/integration/core/test_async_core.py @@ -0,0 +1,144 @@ +import types +from unittest.mock import MagicMock, AsyncMock + +import pytest + +from collector_db.enums import TaskType +from collector_db.models import Task +from core.AsyncCore import AsyncCore +from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome +from core.enums import BatchStatus +from helpers.DBDataCreator import DBDataCreator + +@pytest.mark.asyncio +async def test_conclude_task_success(db_data_creator: DBDataCreator): + ddc = db_data_creator + + batch_id = ddc.batch() + url_ids = ddc.urls(batch_id=batch_id, url_count=3).url_ids + task_id = await ddc.task() + run_info = TaskOperatorRunInfo( + task_id=task_id, + linked_url_ids=url_ids, + outcome=TaskOperatorOutcome.SUCCESS, + ) + + core = AsyncCore( + adb_client=ddc.adb_client, + huggingface_interface=MagicMock(), + url_request_interface=MagicMock(), + html_parser=MagicMock() + ) + await core.conclude_task(run_info=run_info) + + task_info = await ddc.adb_client.get_task_info(task_id=task_id) + + assert task_info.task_status == BatchStatus.COMPLETE + assert len(task_info.urls) == 3 + +@pytest.mark.asyncio +async def test_conclude_task_success(db_data_creator: DBDataCreator): + ddc = db_data_creator + + batch_id = ddc.batch() + url_ids = ddc.urls(batch_id=batch_id, url_count=3).url_ids + task_id = await ddc.task() + run_info = TaskOperatorRunInfo( + task_id=task_id, + linked_url_ids=url_ids, + outcome=TaskOperatorOutcome.SUCCESS, + ) + + core = AsyncCore( + adb_client=ddc.adb_client, + huggingface_interface=MagicMock(), + url_request_interface=MagicMock(), + html_parser=MagicMock() + ) + await core.conclude_task(run_info=run_info) + + task_info = await ddc.adb_client.get_task_info(task_id=task_id) + + assert task_info.task_status == BatchStatus.COMPLETE + assert len(task_info.urls) == 3 + +@pytest.mark.asyncio +async def test_conclude_task_error(db_data_creator: DBDataCreator): + ddc = db_data_creator + + batch_id = ddc.batch() + url_ids = ddc.urls(batch_id=batch_id, url_count=3).url_ids + task_id = await ddc.task() + run_info = TaskOperatorRunInfo( + task_id=task_id, + linked_url_ids=url_ids, + outcome=TaskOperatorOutcome.ERROR, + message="test error", + ) + + core = AsyncCore( + adb_client=ddc.adb_client, + huggingface_interface=MagicMock(), + url_request_interface=MagicMock(), + html_parser=MagicMock() + ) + await core.conclude_task(run_info=run_info) + + task_info = await ddc.adb_client.get_task_info(task_id=task_id) + + assert task_info.task_status == BatchStatus.ERROR + assert task_info.error_info == "test error" + assert len(task_info.urls) == 3 + +@pytest.mark.asyncio +async def test_run_task_prereq_not_met(): + core = AsyncCore( + adb_client=AsyncMock(), + huggingface_interface=AsyncMock(), + url_request_interface=AsyncMock(), + html_parser=AsyncMock() + ) + + mock_operator = AsyncMock() + mock_operator.meets_task_prerequisites = AsyncMock(return_value=False) + AsyncCore.get_task_operators = AsyncMock(return_value=[mock_operator]) + await core.run_tasks() + + mock_operator.meets_task_prerequisites.assert_called_once() + mock_operator.run_task.assert_not_called() + +@pytest.mark.asyncio +async def test_run_task_prereq_met(db_data_creator: DBDataCreator): + + async def run_task(self, task_id: int) -> TaskOperatorRunInfo: + return TaskOperatorRunInfo( + task_id=task_id, + outcome=TaskOperatorOutcome.SUCCESS, + linked_url_ids=[1, 2, 3] + ) + + core = AsyncCore( + adb_client=db_data_creator.adb_client, + huggingface_interface=AsyncMock(), + url_request_interface=AsyncMock(), + html_parser=AsyncMock() + ) + core.conclude_task = AsyncMock() + + mock_operator = AsyncMock() + mock_operator.meets_task_prerequisites = AsyncMock(return_value=True) + mock_operator.task_type = TaskType.HTML + mock_operator.run_task = types.MethodType(run_task, mock_operator) + + AsyncCore.get_task_operators = AsyncMock(return_value=[mock_operator]) + await core.run_tasks() + + mock_operator.meets_task_prerequisites.assert_called_once() + + results = await db_data_creator.adb_client.get_all(Task) + + assert len(results) == 1 + assert results[0].task_status == BatchStatus.IN_PROCESS.value + + core.conclude_task.assert_called_once() + diff --git a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py index 2ee9ec45..c8df809c 100644 --- a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py +++ b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py @@ -1,4 +1,5 @@ import types +from copy import deepcopy from typing import Optional from unittest.mock import MagicMock, AsyncMock, patch @@ -8,6 +9,7 @@ from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponseType, AgencyLookupResponse from collector_db.models import ConfirmedUrlAgency, Agency, AutomatedUrlAgencySuggestion from collector_manager.enums import CollectorType +from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.classes.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator from core.classes.subtasks.AutoGooglerAgencyIdentificationSubtask import AutoGooglerAgencyIdentificationSubtask @@ -23,6 +25,7 @@ sample_agency_suggestions = [ URLAgencySuggestionInfo( + url_id=-1, # This will be overwritten suggestion_type=SuggestionType.UNKNOWN, pdap_agency_id=None, agency_name=None, @@ -31,16 +34,18 @@ locality=None ), URLAgencySuggestionInfo( + url_id=-1, # This will be overwritten suggestion_type=SuggestionType.CONFIRMED, - pdap_agency_id=1, + pdap_agency_id=-1, agency_name="Test Agency", state="Test State", county="Test County", locality="Test Locality" ), URLAgencySuggestionInfo( + url_id=-1, # This will be overwritten suggestion_type=SuggestionType.AUTO_SUGGESTION, - pdap_agency_id=2, + pdap_agency_id=-1, agency_name="Test Agency 2", state="Test State 2", county="Test County 2", @@ -55,9 +60,10 @@ async def mock_run_subtask( url_id: int, collector_metadata: Optional[dict] ): - val = url_id % 3 - suggestion = sample_agency_suggestions[val] + # Deepcopy to prevent using the same instance in memory + suggestion = deepcopy(sample_agency_suggestions[url_id % 3]) suggestion.url_id = url_id + suggestion.pdap_agency_id = (url_id % 3) if suggestion.suggestion_type != SuggestionType.UNKNOWN else None return [suggestion] async with ClientSession() as session: @@ -83,9 +89,9 @@ async def mock_run_subtask( muckrock_api_interface=muckrock_api_interface ) - # Try to run initially and confirm it doesn't run - # due to not meeting prerequisites - await operator.run_task() + # Confirm does not yet meet prerequisites + assert not await operator.meets_task_prerequisites() + d = {} @@ -101,8 +107,12 @@ async def mock_run_subtask( creation_info: BatchURLCreationInfo = await db_data_creator.batch_and_urls(strategy=strategy, url_count=1, with_html_content=True) d[strategy] = creation_info.url_ids[0] + + # Confirm meets prerequisites + assert await operator.meets_task_prerequisites() # Run task - await operator.run_task() + run_info = await operator.run_task(1) + assert run_info.outcome == TaskOperatorOutcome.SUCCESS, run_info.message # Confirm tasks are piped into the correct subtasks # * common_crawler into common_crawler_subtask @@ -136,10 +146,11 @@ async def mock_run_subtask( url_id = d[collector_type] assert d2[url_id] == subtask_class - # Run task again and confirm it doesn't call any additional subtasks - await operator.run_task() - assert mock.call_count == 6 + # Confirm task again does not meet prerequisites + assert not await operator.meets_task_prerequisites() + + # Check confirmed and auto suggestions diff --git a/tests/test_automated/integration/tasks/test_example_task.py b/tests/test_automated/integration/tasks/test_example_task.py index f6f56521..819d0dc0 100644 --- a/tests/test_automated/integration/tasks/test_example_task.py +++ b/tests/test_automated/integration/tasks/test_example_task.py @@ -3,6 +3,7 @@ import pytest from collector_db.enums import TaskType +from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.TaskOperatorBase import TaskOperatorBase from core.enums import BatchStatus from tests.helpers.DBDataCreator import DBDataCreator @@ -31,32 +32,15 @@ async def test_example_task_success(db_data_creator: DBDataCreator): async def mock_inner_task_logic(self): # Add link to 3 urls - await self.adb_client.link_urls_to_task(task_id=self.task_id, url_ids=url_ids) - self.tasks_linked = True + self.linked_url_ids = url_ids operator = ExampleTaskOperator(adb_client=db_data_creator.adb_client) operator.inner_task_logic = types.MethodType(mock_inner_task_logic, operator) - await operator.run_task() + run_info = await operator.run_task(1) + assert run_info.outcome == TaskOperatorOutcome.SUCCESS + assert run_info.linked_url_ids == url_ids - # Get Task Info - task_info = await db_data_creator.adb_client.get_task_info(task_id=operator.task_id) - - # Check that 3 urls were linked to the task - assert len(task_info.urls) == 3 - - # Check that error info is empty - assert task_info.error_info is None - - # Check that the task was marked as complete - assert task_info.task_status == BatchStatus.COMPLETE - - # Check that the task type is HTML - assert task_info.task_type == TaskType.HTML - - - # Check that updated_at is not null - assert task_info.updated_at is not None @pytest.mark.asyncio async def test_example_task_failure(db_data_creator: DBDataCreator): @@ -66,22 +50,8 @@ def mock_inner_task_logic(self): raise ValueError("test error") operator.inner_task_logic = types.MethodType(mock_inner_task_logic, operator) - await operator.run_task() - - # Get Task Info - task_info = await db_data_creator.adb_client.get_task_info(task_id=operator.task_id) - - # Check that there are no URLs associated - assert len(task_info.urls) == 0 - - # Check that the task was marked as errored - assert task_info.task_status == BatchStatus.ERROR - - # Check that the task type is HTML - assert task_info.task_type == TaskType.HTML - - # Check error - assert "test error" in task_info.error_info + run_info = await operator.run_task(1) + assert run_info.outcome == TaskOperatorOutcome.ERROR diff --git a/tests/test_automated/integration/tasks/test_url_html_task.py b/tests/test_automated/integration/tasks/test_url_html_task.py index 7674113f..75c46855 100644 --- a/tests/test_automated/integration/tasks/test_url_html_task.py +++ b/tests/test_automated/integration/tasks/test_url_html_task.py @@ -5,6 +5,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.enums import TaskType +from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator from core.enums import BatchStatus from tests.helpers.DBDataCreator import DBDataCreator @@ -65,20 +66,22 @@ async def mock_get_from_cache(self, url: str) -> Optional[str]: url_request_interface=url_request_interface, html_parser=html_parser ) - await operator.run_task() - # Check that, because no URLs were created, the task did not run - await assert_database_has_no_tasks(db_data_creator.adb_client) + meets_prereqs = await operator.meets_task_prerequisites() + # Check that, because no URLs were created, the prereqs are not met + assert not meets_prereqs batch_id = db_data_creator.batch() url_mappings = db_data_creator.urls(batch_id=batch_id, url_count=3).url_mappings url_ids = [url_info.url_id for url_info in url_mappings] - await operator.run_task() + task_id = await db_data_creator.adb_client.initiate_task(task_type=TaskType.HTML) + run_info = await operator.run_task(task_id) + assert run_info.outcome == TaskOperatorOutcome.SUCCESS + assert run_info.linked_url_ids == url_ids # Check in database that - # - task is listed as complete # - task type is listed as 'HTML' # - task has 3 urls # - task has one errored url with error "ValueError" @@ -87,18 +90,17 @@ async def mock_get_from_cache(self, url: str) -> Optional[str]: ) assert task_info.error_info is None - assert task_info.task_status == BatchStatus.COMPLETE assert task_info.task_type == TaskType.HTML - assert len(task_info.urls) == 3 assert len(task_info.url_errors) == 1 assert task_info.url_errors[0].error == "test error" adb = db_data_creator.adb_client # Check that both success urls have two rows of HTML data - hci = await adb.get_html_content_info(url_id=task_info.urls[0].id) + await adb.link_urls_to_task(task_id=run_info.task_id, url_ids=run_info.linked_url_ids) + hci = await adb.get_html_content_info(url_id=url_ids[0]) assert len(hci) == 2 - hci = await adb.get_html_content_info(url_id=task_info.urls[1].id) + hci = await adb.get_html_content_info(url_id=url_ids[1]) assert len(hci) == 2 # Check that errored url has error info diff --git a/tests/test_automated/integration/tasks/test_url_record_type_task.py b/tests/test_automated/integration/tasks/test_url_record_type_task.py index ee624dae..cf4c8e0e 100644 --- a/tests/test_automated/integration/tasks/test_url_record_type_task.py +++ b/tests/test_automated/integration/tasks/test_url_record_type_task.py @@ -4,6 +4,7 @@ from collector_db.enums import TaskType from collector_db.models import URLMetadata +from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator from core.enums import RecordType, BatchStatus from tests.helpers.DBDataCreator import DBDataCreator @@ -21,29 +22,32 @@ async def test_url_record_type_task(db_data_creator: DBDataCreator): adb_client=db_data_creator.adb_client, classifier=mock_classifier ) - await operator.run_task() - # No task should have been created due to not meeting prerequisites - await assert_database_has_no_tasks(db_data_creator.adb_client) + # Should not meet prerequisites + meets_prereqs = await operator.meets_task_prerequisites() + assert not meets_prereqs batch_id = db_data_creator.batch() iui = db_data_creator.urls(batch_id=batch_id, url_count=2) url_ids = [iui.url_mappings[0].url_id, iui.url_mappings[1].url_id] await db_data_creator.html_data(url_ids) - await operator.run_task() + assert await operator.meets_task_prerequisites() + task_id = await db_data_creator.adb_client.initiate_task(task_type=TaskType.RECORD_TYPE) + + run_info = await operator.run_task(task_id) + assert run_info.outcome == TaskOperatorOutcome.SUCCESS # Task should have been created task_info = await db_data_creator.adb_client.get_task_info(task_id=operator.task_id) assert task_info.error_info is None - assert task_info.task_status == BatchStatus.COMPLETE response = await db_data_creator.adb_client.get_tasks() tasks = response.tasks assert len(tasks) == 1 task = tasks[0] assert task.type == TaskType.RECORD_TYPE - assert task.url_count == 2 + assert run_info.linked_url_ids == url_ids assert task.url_error_count == 1 # Get metadata diff --git a/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py b/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py index abf86cda..188621b7 100644 --- a/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py +++ b/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py @@ -39,7 +39,7 @@ def mock_get_url_relevancy( adb_client=AsyncDatabaseClient(), huggingface_interface=mock_hf_interface ) - await task_operator.run_task() + await task_operator.run_task(1) await assert_database_has_no_tasks(db_data_creator.adb_client) @@ -49,7 +49,7 @@ def mock_get_url_relevancy( await db_data_creator.html_data(url_ids) await db_data_creator.metadata([url_ids[0]]) - await task_operator.run_task() + await task_operator.run_task(1) results = await db_data_creator.adb_client.get_all(URLMetadata) From 28df49dadf9154c39ff7abebf10f8eb924b40e15 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 10 Feb 2025 09:34:20 -0500 Subject: [PATCH 048/244] Revise agency identification annotation logic --- Dockerfile | 3 +- agency_identifier/MuckrockAPIInterface.py | 2 +- alembic/env.py | 12 +- ...daf0_revise_agency_identification_logic.py | 23 +- api/routes/annotate.py | 2 + collector_db/AsyncDatabaseClient.py | 127 +++++++++- core/AsyncCore.py | 18 +- .../GetNextURLForAgencyAnnotationResponse.py | 15 +- .../AgencyIdentificationTaskOperator.py | 59 ++--- pdap_api_client/AccessManager.py | 3 +- tests/helpers/DBDataCreator.py | 70 +++++- .../integration/api/conftest.py | 3 + .../api/helpers/RequestValidator.py | 19 ++ .../integration/api/test_annotate.py | 225 +++++++++++++++++- .../collector_db/test_database_structure.py | 3 +- 15 files changed, 532 insertions(+), 52 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6cf1d6a2..c93fe158 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,6 +28,7 @@ COPY alembic.ini ./alembic.ini COPY alembic ./alembic COPY apply_migrations.py ./apply_migrations.py COPY security_manager ./security_manager +COPY pdap_api_client ./pdap_api_client COPY execute.sh ./execute.sh COPY .project-root ./.project-root @@ -45,4 +46,4 @@ EXPOSE 80 RUN chmod +x execute.sh # Use the below for ease of local development, but remove when pushing to GitHub # Because there is no .env file in the repository (for security reasons) -#COPY .env ./.env +COPY .env ./.env diff --git a/agency_identifier/MuckrockAPIInterface.py b/agency_identifier/MuckrockAPIInterface.py index bbc56ee7..703164fc 100644 --- a/agency_identifier/MuckrockAPIInterface.py +++ b/agency_identifier/MuckrockAPIInterface.py @@ -20,7 +20,7 @@ class AgencyLookupResponse(BaseModel): class MuckrockAPIInterface: - def __init__(self, session: ClientSession): + def __init__(self, session: Optional[ClientSession] = None): self.base_url = "https://www.muckrock.com/api_v1/" self.session = session diff --git a/alembic/env.py b/alembic/env.py index 69587988..7eaa1a8b 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -1,3 +1,4 @@ +from datetime import datetime from logging.config import fileConfig from alembic import context @@ -59,6 +60,13 @@ def run_migrations_online() -> None: and associate a connection with the context. """ + + def process_revision_directives(context, revision, directives): + # 20210801211024 for a migration generated on Aug 1st, 2021 at 21:10:24 + rev_id = datetime.now().strftime("%Y%m%d%H%M%S") + for directive in directives: + directive.rev_id = rev_id + connectable = engine_from_config( config.get_section(config.config_ini_section, {}), prefix="sqlalchemy.", @@ -67,7 +75,9 @@ def run_migrations_online() -> None: with connectable.connect() as connection: context.configure( - connection=connection, target_metadata=target_metadata + connection=connection, + target_metadata=target_metadata, + process_revision_directives=process_revision_directives ) with context.begin_transaction(): diff --git a/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py b/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py index 4db28b9d..62d9930d 100644 --- a/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py +++ b/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py @@ -77,7 +77,6 @@ def upgrade(): FOR EACH ROW EXECUTE FUNCTION enforce_no_agency_id_if_unknown(); """) - # Create user_url_agency_suggestions table op.create_table( "user_url_agency_suggestions", @@ -90,6 +89,26 @@ def upgrade(): op.create_unique_constraint( "uq_user_url_agency_suggestions", "user_url_agency_suggestions", ["agency_id", "url_id", "user_id"] ) + op.execute(""" + CREATE OR REPLACE FUNCTION enforce_no_agency_id_if_new() + RETURNS TRIGGER AS $$ + BEGIN + IF NEW.is_new = TRUE AND NEW.agency_id IS NOT NULL THEN + RAISE EXCEPTION 'agency_id must be null when is_new is TRUE'; + END IF; + RETURN NEW; + END; + $$ LANGUAGE plpgsql; + """) + op.execute(""" + CREATE TRIGGER enforce_no_agency_id_if_new + BEFORE INSERT ON user_url_agency_suggestions + FOR EACH ROW + EXECUTE FUNCTION enforce_no_agency_id_if_new(); + """) + + + op.drop_table('url_agency_suggestions') suggestion_type_enum.drop(op.get_bind(), checkfirst=True) @@ -127,4 +146,6 @@ def downgrade(): op.execute(""" DROP FUNCTION IF EXISTS enforce_no_agency_id_if_unknown; """) + op.execute("DROP TRIGGER enforce_no_agency_id_if_new ON user_url_agency_suggestions") + op.execute("DROP FUNCTION enforce_no_agency_id_if_new()") diff --git a/api/routes/annotate.py b/api/routes/annotate.py index 980c16f9..591920ff 100644 --- a/api/routes/annotate.py +++ b/api/routes/annotate.py @@ -76,6 +76,7 @@ async def annotate_url_for_record_type_and_get_next_url( ) return result +@annotate_router.get("/agency") async def get_next_url_for_agency_annotation( access_info: AccessInfo = Depends(get_access_info), async_core: AsyncCore = Depends(get_async_core), @@ -85,6 +86,7 @@ async def get_next_url_for_agency_annotation( ) return result +@annotate_router.post("/agency/{url_id}") async def annotate_url_for_agency_and_get_next_url( url_id: int, agency_annotation_post_info: URLAgencyAnnotationPostInfo, diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index d89ffc10..2f657c54 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -18,8 +18,11 @@ from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource, TaskType from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import URLMetadata, URL, URLErrorInfo, URLHTMLContent, Base, MetadataAnnotation, \ - RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, ConfirmedUrlAgency, AutomatedUrlAgencySuggestion + RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, ConfirmedUrlAgency, AutomatedUrlAgencySuggestion, \ + UserUrlAgencySuggestion from collector_manager.enums import URLStatus, CollectorType +from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ + GetNextURLForAgencyAgencyInfo, GetNextURLForAgencyAnnotationInnerResponse, URLAgencyAnnotationPostInfo from core.DTOs.GetTasksResponse import GetTasksResponse, GetTasksResponseTaskInfo from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseMetadataInfo, GetURLsResponseErrorInfo, \ GetURLsResponseInnerInfo @@ -27,6 +30,7 @@ from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO from core.enums import BatchStatus, SuggestionType +from html_tag_collector.DataClassTags import convert_to_response_html_info def add_standard_limit_and_offset(statement, page, limit=100): @@ -610,6 +614,106 @@ async def get_urls_without_agency_suggestions(self, session: AsyncSession) -> li for raw_result in raw_results ] + @session_manager + async def get_next_url_agency_for_annotation( + self, session: AsyncSession, user_id: int + ) -> GetNextURLForAgencyAnnotationResponse: + """ + Retrieve URL for annotation + The URL must + not be a confirmed URL + not have been annotated by this user + have extant autosuggestions + """ + # Select statement + statement = ( + select(URL.id, URL.url) + # Must not be a confirmed URL + .join(ConfirmedUrlAgency, isouter=True) + .where( + ~exists( + select(ConfirmedUrlAgency). + where(ConfirmedUrlAgency.url_id == URL.id). + correlate(URL) + ) + ) + # Must not have been annotated by this user + .join(UserUrlAgencySuggestion, isouter=True) + .where( + ~exists( + select(UserUrlAgencySuggestion). + where( + (UserUrlAgencySuggestion.user_id == user_id) & + (UserUrlAgencySuggestion.url_id == URL.id) + ). + correlate(URL) + ) + ) + # Must have extant autosuggestions + .join(AutomatedUrlAgencySuggestion, isouter=True) + .where( + exists( + select(AutomatedUrlAgencySuggestion). + where(AutomatedUrlAgencySuggestion.url_id == URL.id). + correlate(URL) + ) + ) + ).limit(1) + raw_result = await session.execute(statement) + results = raw_result.all() + if len(results) == 0: + return GetNextURLForAgencyAnnotationResponse( + next_annotation=None + ) + + result = results[0] + url_id = result[0] + url = result[1] + # Get relevant autosuggestions and agency info, if an associated agency exists + statement = ( + select( + AutomatedUrlAgencySuggestion.agency_id, + AutomatedUrlAgencySuggestion.is_unknown, + Agency.name, + Agency.state, + Agency.county, + Agency.locality + ) + .join(Agency, isouter=True) + .where(AutomatedUrlAgencySuggestion.url_id == url_id) + ) + raw_autosuggestions = await session.execute(statement) + autosuggestions = raw_autosuggestions.all() + agency_suggestions = [] + for autosuggestion in autosuggestions: + agency_id = autosuggestion[0] + is_unknown = autosuggestion[1] + name = autosuggestion[2] + state = autosuggestion[3] + county = autosuggestion[4] + locality = autosuggestion[5] + agency_suggestions.append(GetNextURLForAgencyAgencyInfo( + suggestion_type=SuggestionType.AUTO_SUGGESTION if not is_unknown else SuggestionType.UNKNOWN, + pdap_agency_id=agency_id, + agency_name=name, + state=state, + county=county, + locality=locality + )) + + # Get HTML content info + html_content_infos = await self.get_html_content_info(url_id) + response_html_info = convert_to_response_html_info(html_content_infos) + + return GetNextURLForAgencyAnnotationResponse( + next_annotation=GetNextURLForAgencyAnnotationInnerResponse( + url_id=url_id, + url=url, + html_info=response_html_info, + agency_suggestions=agency_suggestions + ) + ) + @session_manager async def upsert_new_agencies( self, @@ -656,4 +760,23 @@ async def add_agency_auto_suggestions( ) session.add(url_agency_suggestion) - await session.commit() \ No newline at end of file + await session.commit() + + @session_manager + async def add_agency_manual_suggestion( + self, + session: AsyncSession, + agency_id: Optional[int], + url_id: int, + user_id: int, + is_new: bool + ): + if is_new and agency_id is not None: + raise ValueError("agency_id must be None when is_new is True") + url_agency_suggestion = UserUrlAgencySuggestion( + url_id=url_id, + agency_id=agency_id, + user_id=user_id, + is_new=is_new + ) + session.add(url_agency_suggestion) diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 2ec17da5..808821f7 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -44,6 +44,7 @@ def __init__( self.url_request_interface = url_request_interface self.html_parser = html_parser self.logger = logging.getLogger(__name__) + self.logger.addHandler(logging.StreamHandler()) self.logger.setLevel(logging.INFO) async def get_url_html_task_operator(self): @@ -71,16 +72,14 @@ async def get_url_record_type_task_operator(self): return operator async def get_agency_identification_task_operator(self): - session = ClientSession() pdap_client = PDAPClient( access_manager=AccessManager( email=get_from_env("PDAP_EMAIL"), password=get_from_env("PDAP_PASSWORD"), api_key=get_from_env("PDAP_API_KEY"), - session=session ), ) - muckrock_api_interface = MuckrockAPIInterface(session=session) + muckrock_api_interface = MuckrockAPIInterface() operator = AgencyIdentificationTaskOperator( adb_client=self.adb_client, pdap_client=pdap_client, @@ -208,15 +207,16 @@ async def submit_url_agency_annotation( url_id: int, agency_post_info: URLAgencyAnnotationPostInfo ) -> GetNextURLForAgencyAnnotationResponse: - if agency_post_info.suggested_agency == "NEW": - suggestion_type = SuggestionType.NEW_AGENCY + if not agency_post_info.is_new and not agency_post_info.suggested_agency: + raise ValueError("suggested_agency must be provided if is_new is False") + + if agency_post_info.is_new: agency_suggestion_id = None else: - suggestion_type = SuggestionType.MANUAL_SUGGESTION agency_suggestion_id = agency_post_info.suggested_agency - return await self.adb_client.submit_url_agency_annotation( + return await self.adb_client.add_agency_manual_suggestion( user_id=user_id, url_id=url_id, - suggestion_type=suggestion_type, - agency_suggestion_id=agency_suggestion_id + agency_id=agency_suggestion_id, + is_new=agency_post_info.is_new, ) diff --git a/core/DTOs/GetNextURLForAgencyAnnotationResponse.py b/core/DTOs/GetNextURLForAgencyAnnotationResponse.py index 4710275e..8b3d06f4 100644 --- a/core/DTOs/GetNextURLForAgencyAnnotationResponse.py +++ b/core/DTOs/GetNextURLForAgencyAnnotationResponse.py @@ -1,9 +1,11 @@ from typing import Optional, Literal +from pydantic import BaseModel + from core.enums import SuggestionType from html_tag_collector.DataClassTags import ResponseHTMLInfo -class GetNextURLForAgencyAgencyInfo: +class GetNextURLForAgencyAgencyInfo(BaseModel): suggestion_type: SuggestionType pdap_agency_id: Optional[int] = None agency_name: Optional[str] = None @@ -11,12 +13,17 @@ class GetNextURLForAgencyAgencyInfo: county: Optional[str] = None locality: Optional[str] = None -class GetNextURLForAgencyAnnotationResponse: +class GetNextURLForAgencyAnnotationInnerResponse(BaseModel): url_id: int + url: str agency_suggestions: list[ GetNextURLForAgencyAgencyInfo ] html_info: ResponseHTMLInfo -class URLAgencyAnnotationPostInfo: - suggested_agency: int | Literal["NEW"] \ No newline at end of file +class GetNextURLForAgencyAnnotationResponse(BaseModel): + next_annotation: Optional[GetNextURLForAgencyAnnotationInnerResponse] + +class URLAgencyAnnotationPostInfo(BaseModel): + is_new: bool = False + suggested_agency: Optional[int] = None \ No newline at end of file diff --git a/core/classes/AgencyIdentificationTaskOperator.py b/core/classes/AgencyIdentificationTaskOperator.py index de27f6cb..1589b96f 100644 --- a/core/classes/AgencyIdentificationTaskOperator.py +++ b/core/classes/AgencyIdentificationTaskOperator.py @@ -1,3 +1,5 @@ +from aiohttp import ClientSession + from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo @@ -67,33 +69,36 @@ async def run_subtask(subtask, url_id, collector_metadata) -> list[URLAgencySugg return await subtask.run(url_id=url_id, collector_metadata=collector_metadata) async def inner_task_logic(self): - tdos: list[AgencyIdentificationTDO] = await self.get_pending_urls_without_agency_identification() - await self.link_urls_to_task(url_ids=[tdo.url_id for tdo in tdos]) - error_infos = [] - all_agency_suggestions = [] - for tdo in tdos: - subtask = await self.get_subtask(tdo.collector_type) - try: - new_agency_suggestions = await self.run_subtask( - subtask, - tdo.url_id, - tdo.collector_metadata - ) - all_agency_suggestions.extend(new_agency_suggestions) - except Exception as e: - error_info = URLErrorPydanticInfo( - task_id=self.task_id, - url_id=tdo.url_id, - error=str(e), - ) - error_infos.append(error_info) + async with ClientSession() as session: + self.pdap_client.access_manager.session = session + self.muckrock_api_interface.session = session + tdos: list[AgencyIdentificationTDO] = await self.get_pending_urls_without_agency_identification() + await self.link_urls_to_task(url_ids=[tdo.url_id for tdo in tdos]) + error_infos = [] + all_agency_suggestions = [] + for tdo in tdos: + subtask = await self.get_subtask(tdo.collector_type) + try: + new_agency_suggestions = await self.run_subtask( + subtask, + tdo.url_id, + tdo.collector_metadata + ) + all_agency_suggestions.extend(new_agency_suggestions) + except Exception as e: + error_info = URLErrorPydanticInfo( + task_id=self.task_id, + url_id=tdo.url_id, + error=str(e), + ) + error_infos.append(error_info) - non_unknown_agency_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type != SuggestionType.UNKNOWN] - await self.adb_client.upsert_new_agencies(non_unknown_agency_suggestions) - confirmed_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type == SuggestionType.CONFIRMED] - await self.adb_client.add_confirmed_agency_url_links(confirmed_suggestions) - non_confirmed_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type != SuggestionType.CONFIRMED] - await self.adb_client.add_agency_auto_suggestions(non_confirmed_suggestions) - await self.adb_client.add_url_error_infos(error_infos) + non_unknown_agency_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type != SuggestionType.UNKNOWN] + await self.adb_client.upsert_new_agencies(non_unknown_agency_suggestions) + confirmed_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type == SuggestionType.CONFIRMED] + await self.adb_client.add_confirmed_agency_url_links(confirmed_suggestions) + non_confirmed_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type != SuggestionType.CONFIRMED] + await self.adb_client.add_agency_auto_suggestions(non_confirmed_suggestions) + await self.adb_client.add_url_error_infos(error_infos) diff --git a/pdap_api_client/AccessManager.py b/pdap_api_client/AccessManager.py index 0776fe0d..c39ba1e8 100644 --- a/pdap_api_client/AccessManager.py +++ b/pdap_api_client/AccessManager.py @@ -35,9 +35,9 @@ class AccessManager: """ def __init__( self, - session: ClientSession, email: str, password: str, + session: Optional[ClientSession] = None, api_key: Optional[str] = None, ): self.session = session @@ -46,7 +46,6 @@ def __init__( self.api_key = api_key self.email = email self.password = password - self.login(email=email, password=password) @property async def access_token(self): diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 2d6b603f..d550e801 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -1,3 +1,4 @@ +from random import randint from typing import List, Optional from pydantic import BaseModel @@ -13,7 +14,8 @@ from collector_db.DatabaseClient import DatabaseClient from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource, TaskType from collector_manager.enums import CollectorType -from core.enums import BatchStatus +from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from core.enums import BatchStatus, SuggestionType from tests.helpers.simple_test_data_functions import generate_test_urls @@ -60,6 +62,72 @@ async def batch_and_urls( return BatchURLCreationInfo(batch_id=batch_id, url_ids=url_ids) + async def agency(self) -> int: + agency_id = randint(1, 99999999) + await self.adb_client.upsert_new_agencies( + suggestions=[ + URLAgencySuggestionInfo( + url_id=-1, + suggestion_type=SuggestionType.UNKNOWN, + pdap_agency_id=agency_id, + agency_name=f"Test Agency {agency_id}", + state=f"Test State {agency_id}", + county=f"Test County {agency_id}", + locality=f"Test Locality {agency_id}" + ) + ] + ) + return agency_id + + async def auto_suggestions( + self, + url_ids: list[int], + num_suggestions: int, + suggestion_type: SuggestionType.AUTO_SUGGESTION or SuggestionType.UNKNOWN + ): + allowed_suggestion_types = [SuggestionType.AUTO_SUGGESTION, SuggestionType.UNKNOWN] + if suggestion_type not in allowed_suggestion_types: + raise ValueError(f"suggestion_type must be one of {allowed_suggestion_types}") + if suggestion_type == SuggestionType.UNKNOWN and num_suggestions > 1: + raise ValueError("num_suggestions must be 1 when suggestion_type is unknown") + + for url_id in url_ids: + suggestions = [] + for i in range(num_suggestions): + if suggestion_type == SuggestionType.UNKNOWN: + agency_id = None + else: + agency_id = await self.agency() + suggestion = URLAgencySuggestionInfo( + url_id=url_id, + suggestion_type=suggestion_type, + pdap_agency_id=agency_id + ) + suggestions.append(suggestion) + + await self.adb_client.add_agency_auto_suggestions( + suggestions=suggestions + ) + + async def confirmed_suggestions(self, url_ids: list[int]): + for url_id in url_ids: + await self.adb_client.add_confirmed_agency_url_links( + suggestions=[ + URLAgencySuggestionInfo( + url_id=url_id, + suggestion_type=SuggestionType.CONFIRMED, + pdap_agency_id=await self.agency() + ) + ] + ) + + async def manual_suggestion(self, user_id: int, url_id: int, is_new: bool = False): + await self.adb_client.add_agency_manual_suggestion( + agency_id=await self.agency(), + url_id=url_id, + user_id=user_id, + is_new=is_new + ) def urls(self, batch_id: int, url_count: int) -> InsertURLsInfo: diff --git a/tests/test_automated/integration/api/conftest.py b/tests/test_automated/integration/api/conftest.py index 8f80716f..d9a504a7 100644 --- a/tests/test_automated/integration/api/conftest.py +++ b/tests/test_automated/integration/api/conftest.py @@ -20,6 +20,9 @@ class APITestHelper: mock_huggingface_interface: MagicMock mock_label_studio_interface: MagicMock + def adb_client(self): + return self.db_data_creator.adb_client + MOCK_USER_ID = 1 diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index d3e60e1d..38b7cafd 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -12,6 +12,8 @@ from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse +from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ + URLAgencyAnnotationPostInfo from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse @@ -210,6 +212,23 @@ def post_relevance_annotation_and_get_next( ) return GetNextURLForAnnotationResponse(**data) + async def get_next_agency_annotation(self) -> GetNextURLForAgencyAnnotationResponse: + data = self.get( + url=f"/annotate/agency" + ) + return GetNextURLForAgencyAnnotationResponse(**data) + + async def post_agency_annotation_and_get_next( + self, + url_id: int, + agency_annotation_post_info: URLAgencyAnnotationPostInfo + ) -> GetNextURLForAgencyAnnotationResponse: + data = self.post( + url=f"/annotate/agency/{url_id}", + json=agency_annotation_post_info.model_dump(mode='json') + ) + return GetNextURLForAgencyAnnotationResponse(**data) + def get_urls(self, page: int = 1, errors: bool = False) -> GetURLsResponseInfo: data = self.get( url=f"/url", diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/test_automated/integration/api/test_annotate.py index 1ee03963..09e5a267 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/test_automated/integration/api/test_annotate.py @@ -4,10 +4,13 @@ from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource +from collector_db.models import UserUrlAgencySuggestion +from core.DTOs.GetNextURLForAgencyAnnotationResponse import URLAgencyAnnotationPostInfo from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo -from core.enums import RecordType +from core.enums import RecordType, SuggestionType +from helpers.DBDataCreator import BatchURLCreationInfo from tests.test_automated.integration.api.conftest import MOCK_USER_ID async def run_annotation_test( @@ -110,3 +113,223 @@ async def test_annotate_record_type(api_test_helper): metadata_attribute=URLMetadataAttributeType.RECORD_TYPE, expected_metadata_value=RecordType.ACCIDENT_REPORTS.value ) + +@pytest.mark.asyncio +async def test_annotate_agency_multiple_auto_suggestions(api_test_helper): + """ + Test Scenario: Multiple Auto Suggestions + A URL has multiple Agency Auto Suggestion and has not been annotated by the User + The user should receive all of the auto suggestions with full detail + """ + ath = api_test_helper + adb_client = ath.adb_client() + buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( + url_count=1, + with_html_content=True + ) + await ath.db_data_creator.auto_suggestions( + url_ids=buci.url_ids, + num_suggestions=2, + suggestion_type=SuggestionType.AUTO_SUGGESTION + ) + + # User requests next annotation + response = await ath.request_validator.get_next_agency_annotation() + + assert response.next_annotation + next_annotation = response.next_annotation + # Check that url_id matches the one we inserted + assert next_annotation.url_id == buci.url_ids[0] + + # Check that html data is present + assert next_annotation.html_info.description != "" + assert next_annotation.html_info.title != "" + + # Check that two agency_suggestions exist + assert len(next_annotation.agency_suggestions) == 2 + + for agency_suggestion in next_annotation.agency_suggestions: + assert agency_suggestion.suggestion_type == SuggestionType.AUTO_SUGGESTION + assert agency_suggestion.pdap_agency_id is not None + assert agency_suggestion.agency_name is not None + assert agency_suggestion.state is not None + assert agency_suggestion.county is not None + assert agency_suggestion.locality is not None + + +@pytest.mark.asyncio +async def test_annotate_agency_single_unknown_auto_suggestion(api_test_helper): + """ + Test Scenario: Single Unknown Auto Suggestion + A URL has a single Unknown Agency Auto Suggestion and has not been annotated by the User + The user should receive a single Unknown Auto Suggestion lacking other detail + """ + ath = api_test_helper + adb_client = ath.adb_client() + buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( + url_count=1, + with_html_content=True + ) + await ath.db_data_creator.auto_suggestions( + url_ids=buci.url_ids, + num_suggestions=1, + suggestion_type=SuggestionType.UNKNOWN + ) + response = await ath.request_validator.get_next_agency_annotation() + + assert response.next_annotation + next_annotation = response.next_annotation + # Check that url_id matches the one we inserted + assert next_annotation.url_id == buci.url_ids[0] + + # Check that html data is present + assert next_annotation.html_info.description != "" + assert next_annotation.html_info.title != "" + + # Check that one agency_suggestion exists + assert len(next_annotation.agency_suggestions) == 1 + + agency_suggestion = next_annotation.agency_suggestions[0] + + assert agency_suggestion.suggestion_type == SuggestionType.UNKNOWN + assert agency_suggestion.pdap_agency_id is None + assert agency_suggestion.agency_name is None + assert agency_suggestion.state is None + assert agency_suggestion.county is None + assert agency_suggestion.locality is None + + +@pytest.mark.asyncio +async def test_annotate_agency_single_confirmed_agency(api_test_helper): + """ + Test Scenario: Single Confirmed Agency + A URL has a single Confirmed Agency and has not been annotated by the User + The user should not receive this URL to annotate + """ + ath = api_test_helper + adb_client = ath.adb_client() + buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( + url_count=1, + with_html_content=True + ) + await ath.db_data_creator.confirmed_suggestions( + url_ids=buci.url_ids, + ) + response = await ath.request_validator.get_next_agency_annotation() + assert response.next_annotation is None + +@pytest.mark.asyncio +async def test_annotate_agency_other_user_annotation(api_test_helper): + """ + Test Scenario: Other User Annotation + A URL has been annotated by another User + Our user should still receive this URL to annotate + """ + ath = api_test_helper + adb_client = ath.adb_client() + buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( + url_count=1, + with_html_content=True + ) + await ath.db_data_creator.auto_suggestions( + url_ids=buci.url_ids, + num_suggestions=1, + suggestion_type=SuggestionType.UNKNOWN + ) + + await ath.db_data_creator.manual_suggestion( + user_id=MOCK_USER_ID + 1, + url_id=buci.url_ids[0], + ) + + response = await ath.request_validator.get_next_agency_annotation() + + assert response.next_annotation + next_annotation = response.next_annotation + # Check that url_id matches the one we inserted + assert next_annotation.url_id == buci.url_ids[0] + + # Check that html data is present + assert next_annotation.html_info.description != "" + assert next_annotation.html_info.title != "" + + # Check that one agency_suggestion exists + assert len(next_annotation.agency_suggestions) == 1 + +@pytest.mark.asyncio +async def test_annotate_agency_submit_and_get_next(api_test_helper): + """ + Test Scenario: Submit and Get Next (no other URL available) + A URL has been annotated by our User, and no other valid URLs have not been annotated + Our user should not receive another URL to annotate + Until another relevant URL is added + """ + ath = api_test_helper + adb_client = ath.adb_client() + buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( + url_count=2, + with_html_content=True + ) + await ath.db_data_creator.auto_suggestions( + url_ids=buci.url_ids, + num_suggestions=1, + suggestion_type=SuggestionType.UNKNOWN + ) + + # User should submit an annotation and receive the next + response = await ath.request_validator.post_agency_annotation_and_get_next( + url_id=buci.url_ids[0], + agency_annotation_post_info=URLAgencyAnnotationPostInfo( + suggested_agency=await ath.db_data_creator.agency(), + is_new=False + ) + + ) + assert response.next_annotation is not None + + # User should submit this annotation and receive none for the next + response = await ath.request_validator.post_agency_annotation_and_get_next( + url_id=buci.url_ids[1], + agency_annotation_post_info=URLAgencyAnnotationPostInfo( + suggested_agency=await ath.db_data_creator.agency(), + is_new=False + ) + ) + assert response.next_annotation is None + + +@pytest.mark.asyncio +async def test_annotate_agency_submit_new(api_test_helper): + """ + Test Scenario: Submit New + Our user receives an annotation and marks it as `NEW` + This should complete successfully + And within the database the annotation should be marked as `NEW` + """ + ath = api_test_helper + adb_client = ath.adb_client() + buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( + url_count=1, + with_html_content=True + ) + await ath.db_data_creator.auto_suggestions( + url_ids=buci.url_ids, + num_suggestions=1, + suggestion_type=SuggestionType.UNKNOWN + ) + + # User should submit an annotation and mark it as New + response = await ath.request_validator.post_agency_annotation_and_get_next( + url_id=buci.url_ids[0], + agency_annotation_post_info=URLAgencyAnnotationPostInfo( + suggested_agency=await ath.db_data_creator.agency(), + is_new=True + ) + ) + assert response.next_annotation is None + + # Within database, the annotation should be marked as `NEW` + all_manual_suggestions = await adb_client.get_all(UserUrlAgencySuggestion) + assert len(all_manual_suggestions) == 1 + assert all_manual_suggestions[0].is_new + diff --git a/tests/test_automated/integration/collector_db/test_database_structure.py b/tests/test_automated/integration/collector_db/test_database_structure.py index cdf93801..9c31c9cf 100644 --- a/tests/test_automated/integration/collector_db/test_database_structure.py +++ b/tests/test_automated/integration/collector_db/test_database_structure.py @@ -330,7 +330,7 @@ def test_root_url(db_data_creator: DBDataCreator): @pytest.mark.asyncio -async def test_upset_new_agencies(db_data_creator: DBDataCreator): +async def test_upsert_new_agencies(db_data_creator: DBDataCreator): """ Check that if the agency doesn't exist, it is added But if the agency does exist, it is updated with new information @@ -377,4 +377,3 @@ async def test_upset_new_agencies(db_data_creator: DBDataCreator): assert d[0] == "Updated Test Agency" assert d[1] == "Test Agency 1" assert d[2] == "Test Agency 2" - From f98dcd732c6075b358f380ac3ed60138250d9737 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 10 Feb 2025 09:34:20 -0500 Subject: [PATCH 049/244] Revise agency identification annotation logic --- Dockerfile | 3 +- agency_identifier/MuckrockAPIInterface.py | 2 +- alembic/env.py | 12 +- ...daf0_revise_agency_identification_logic.py | 23 +- api/routes/annotate.py | 2 + collector_db/AsyncDatabaseClient.py | 127 +++++++++- core/AsyncCore.py | 18 +- .../GetNextURLForAgencyAnnotationResponse.py | 15 +- .../AgencyIdentificationTaskOperator.py | 59 ++--- pdap_api_client/AccessManager.py | 3 +- tests/helpers/DBDataCreator.py | 70 +++++- .../integration/api/conftest.py | 3 + .../api/helpers/RequestValidator.py | 19 ++ .../integration/api/test_annotate.py | 225 +++++++++++++++++- .../collector_db/test_database_structure.py | 3 +- .../integration/core/test_async_core.py | 2 +- 16 files changed, 533 insertions(+), 53 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6cf1d6a2..c93fe158 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,6 +28,7 @@ COPY alembic.ini ./alembic.ini COPY alembic ./alembic COPY apply_migrations.py ./apply_migrations.py COPY security_manager ./security_manager +COPY pdap_api_client ./pdap_api_client COPY execute.sh ./execute.sh COPY .project-root ./.project-root @@ -45,4 +46,4 @@ EXPOSE 80 RUN chmod +x execute.sh # Use the below for ease of local development, but remove when pushing to GitHub # Because there is no .env file in the repository (for security reasons) -#COPY .env ./.env +COPY .env ./.env diff --git a/agency_identifier/MuckrockAPIInterface.py b/agency_identifier/MuckrockAPIInterface.py index bbc56ee7..703164fc 100644 --- a/agency_identifier/MuckrockAPIInterface.py +++ b/agency_identifier/MuckrockAPIInterface.py @@ -20,7 +20,7 @@ class AgencyLookupResponse(BaseModel): class MuckrockAPIInterface: - def __init__(self, session: ClientSession): + def __init__(self, session: Optional[ClientSession] = None): self.base_url = "https://www.muckrock.com/api_v1/" self.session = session diff --git a/alembic/env.py b/alembic/env.py index 69587988..7eaa1a8b 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -1,3 +1,4 @@ +from datetime import datetime from logging.config import fileConfig from alembic import context @@ -59,6 +60,13 @@ def run_migrations_online() -> None: and associate a connection with the context. """ + + def process_revision_directives(context, revision, directives): + # 20210801211024 for a migration generated on Aug 1st, 2021 at 21:10:24 + rev_id = datetime.now().strftime("%Y%m%d%H%M%S") + for directive in directives: + directive.rev_id = rev_id + connectable = engine_from_config( config.get_section(config.config_ini_section, {}), prefix="sqlalchemy.", @@ -67,7 +75,9 @@ def run_migrations_online() -> None: with connectable.connect() as connection: context.configure( - connection=connection, target_metadata=target_metadata + connection=connection, + target_metadata=target_metadata, + process_revision_directives=process_revision_directives ) with context.begin_transaction(): diff --git a/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py b/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py index 4db28b9d..62d9930d 100644 --- a/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py +++ b/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py @@ -77,7 +77,6 @@ def upgrade(): FOR EACH ROW EXECUTE FUNCTION enforce_no_agency_id_if_unknown(); """) - # Create user_url_agency_suggestions table op.create_table( "user_url_agency_suggestions", @@ -90,6 +89,26 @@ def upgrade(): op.create_unique_constraint( "uq_user_url_agency_suggestions", "user_url_agency_suggestions", ["agency_id", "url_id", "user_id"] ) + op.execute(""" + CREATE OR REPLACE FUNCTION enforce_no_agency_id_if_new() + RETURNS TRIGGER AS $$ + BEGIN + IF NEW.is_new = TRUE AND NEW.agency_id IS NOT NULL THEN + RAISE EXCEPTION 'agency_id must be null when is_new is TRUE'; + END IF; + RETURN NEW; + END; + $$ LANGUAGE plpgsql; + """) + op.execute(""" + CREATE TRIGGER enforce_no_agency_id_if_new + BEFORE INSERT ON user_url_agency_suggestions + FOR EACH ROW + EXECUTE FUNCTION enforce_no_agency_id_if_new(); + """) + + + op.drop_table('url_agency_suggestions') suggestion_type_enum.drop(op.get_bind(), checkfirst=True) @@ -127,4 +146,6 @@ def downgrade(): op.execute(""" DROP FUNCTION IF EXISTS enforce_no_agency_id_if_unknown; """) + op.execute("DROP TRIGGER enforce_no_agency_id_if_new ON user_url_agency_suggestions") + op.execute("DROP FUNCTION enforce_no_agency_id_if_new()") diff --git a/api/routes/annotate.py b/api/routes/annotate.py index 980c16f9..591920ff 100644 --- a/api/routes/annotate.py +++ b/api/routes/annotate.py @@ -76,6 +76,7 @@ async def annotate_url_for_record_type_and_get_next_url( ) return result +@annotate_router.get("/agency") async def get_next_url_for_agency_annotation( access_info: AccessInfo = Depends(get_access_info), async_core: AsyncCore = Depends(get_async_core), @@ -85,6 +86,7 @@ async def get_next_url_for_agency_annotation( ) return result +@annotate_router.post("/agency/{url_id}") async def annotate_url_for_agency_and_get_next_url( url_id: int, agency_annotation_post_info: URLAgencyAnnotationPostInfo, diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index d89ffc10..2f657c54 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -18,8 +18,11 @@ from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource, TaskType from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import URLMetadata, URL, URLErrorInfo, URLHTMLContent, Base, MetadataAnnotation, \ - RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, ConfirmedUrlAgency, AutomatedUrlAgencySuggestion + RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, ConfirmedUrlAgency, AutomatedUrlAgencySuggestion, \ + UserUrlAgencySuggestion from collector_manager.enums import URLStatus, CollectorType +from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ + GetNextURLForAgencyAgencyInfo, GetNextURLForAgencyAnnotationInnerResponse, URLAgencyAnnotationPostInfo from core.DTOs.GetTasksResponse import GetTasksResponse, GetTasksResponseTaskInfo from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseMetadataInfo, GetURLsResponseErrorInfo, \ GetURLsResponseInnerInfo @@ -27,6 +30,7 @@ from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO from core.enums import BatchStatus, SuggestionType +from html_tag_collector.DataClassTags import convert_to_response_html_info def add_standard_limit_and_offset(statement, page, limit=100): @@ -610,6 +614,106 @@ async def get_urls_without_agency_suggestions(self, session: AsyncSession) -> li for raw_result in raw_results ] + @session_manager + async def get_next_url_agency_for_annotation( + self, session: AsyncSession, user_id: int + ) -> GetNextURLForAgencyAnnotationResponse: + """ + Retrieve URL for annotation + The URL must + not be a confirmed URL + not have been annotated by this user + have extant autosuggestions + """ + # Select statement + statement = ( + select(URL.id, URL.url) + # Must not be a confirmed URL + .join(ConfirmedUrlAgency, isouter=True) + .where( + ~exists( + select(ConfirmedUrlAgency). + where(ConfirmedUrlAgency.url_id == URL.id). + correlate(URL) + ) + ) + # Must not have been annotated by this user + .join(UserUrlAgencySuggestion, isouter=True) + .where( + ~exists( + select(UserUrlAgencySuggestion). + where( + (UserUrlAgencySuggestion.user_id == user_id) & + (UserUrlAgencySuggestion.url_id == URL.id) + ). + correlate(URL) + ) + ) + # Must have extant autosuggestions + .join(AutomatedUrlAgencySuggestion, isouter=True) + .where( + exists( + select(AutomatedUrlAgencySuggestion). + where(AutomatedUrlAgencySuggestion.url_id == URL.id). + correlate(URL) + ) + ) + ).limit(1) + raw_result = await session.execute(statement) + results = raw_result.all() + if len(results) == 0: + return GetNextURLForAgencyAnnotationResponse( + next_annotation=None + ) + + result = results[0] + url_id = result[0] + url = result[1] + # Get relevant autosuggestions and agency info, if an associated agency exists + statement = ( + select( + AutomatedUrlAgencySuggestion.agency_id, + AutomatedUrlAgencySuggestion.is_unknown, + Agency.name, + Agency.state, + Agency.county, + Agency.locality + ) + .join(Agency, isouter=True) + .where(AutomatedUrlAgencySuggestion.url_id == url_id) + ) + raw_autosuggestions = await session.execute(statement) + autosuggestions = raw_autosuggestions.all() + agency_suggestions = [] + for autosuggestion in autosuggestions: + agency_id = autosuggestion[0] + is_unknown = autosuggestion[1] + name = autosuggestion[2] + state = autosuggestion[3] + county = autosuggestion[4] + locality = autosuggestion[5] + agency_suggestions.append(GetNextURLForAgencyAgencyInfo( + suggestion_type=SuggestionType.AUTO_SUGGESTION if not is_unknown else SuggestionType.UNKNOWN, + pdap_agency_id=agency_id, + agency_name=name, + state=state, + county=county, + locality=locality + )) + + # Get HTML content info + html_content_infos = await self.get_html_content_info(url_id) + response_html_info = convert_to_response_html_info(html_content_infos) + + return GetNextURLForAgencyAnnotationResponse( + next_annotation=GetNextURLForAgencyAnnotationInnerResponse( + url_id=url_id, + url=url, + html_info=response_html_info, + agency_suggestions=agency_suggestions + ) + ) + @session_manager async def upsert_new_agencies( self, @@ -656,4 +760,23 @@ async def add_agency_auto_suggestions( ) session.add(url_agency_suggestion) - await session.commit() \ No newline at end of file + await session.commit() + + @session_manager + async def add_agency_manual_suggestion( + self, + session: AsyncSession, + agency_id: Optional[int], + url_id: int, + user_id: int, + is_new: bool + ): + if is_new and agency_id is not None: + raise ValueError("agency_id must be None when is_new is True") + url_agency_suggestion = UserUrlAgencySuggestion( + url_id=url_id, + agency_id=agency_id, + user_id=user_id, + is_new=is_new + ) + session.add(url_agency_suggestion) diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 2ec17da5..808821f7 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -44,6 +44,7 @@ def __init__( self.url_request_interface = url_request_interface self.html_parser = html_parser self.logger = logging.getLogger(__name__) + self.logger.addHandler(logging.StreamHandler()) self.logger.setLevel(logging.INFO) async def get_url_html_task_operator(self): @@ -71,16 +72,14 @@ async def get_url_record_type_task_operator(self): return operator async def get_agency_identification_task_operator(self): - session = ClientSession() pdap_client = PDAPClient( access_manager=AccessManager( email=get_from_env("PDAP_EMAIL"), password=get_from_env("PDAP_PASSWORD"), api_key=get_from_env("PDAP_API_KEY"), - session=session ), ) - muckrock_api_interface = MuckrockAPIInterface(session=session) + muckrock_api_interface = MuckrockAPIInterface() operator = AgencyIdentificationTaskOperator( adb_client=self.adb_client, pdap_client=pdap_client, @@ -208,15 +207,16 @@ async def submit_url_agency_annotation( url_id: int, agency_post_info: URLAgencyAnnotationPostInfo ) -> GetNextURLForAgencyAnnotationResponse: - if agency_post_info.suggested_agency == "NEW": - suggestion_type = SuggestionType.NEW_AGENCY + if not agency_post_info.is_new and not agency_post_info.suggested_agency: + raise ValueError("suggested_agency must be provided if is_new is False") + + if agency_post_info.is_new: agency_suggestion_id = None else: - suggestion_type = SuggestionType.MANUAL_SUGGESTION agency_suggestion_id = agency_post_info.suggested_agency - return await self.adb_client.submit_url_agency_annotation( + return await self.adb_client.add_agency_manual_suggestion( user_id=user_id, url_id=url_id, - suggestion_type=suggestion_type, - agency_suggestion_id=agency_suggestion_id + agency_id=agency_suggestion_id, + is_new=agency_post_info.is_new, ) diff --git a/core/DTOs/GetNextURLForAgencyAnnotationResponse.py b/core/DTOs/GetNextURLForAgencyAnnotationResponse.py index 4710275e..8b3d06f4 100644 --- a/core/DTOs/GetNextURLForAgencyAnnotationResponse.py +++ b/core/DTOs/GetNextURLForAgencyAnnotationResponse.py @@ -1,9 +1,11 @@ from typing import Optional, Literal +from pydantic import BaseModel + from core.enums import SuggestionType from html_tag_collector.DataClassTags import ResponseHTMLInfo -class GetNextURLForAgencyAgencyInfo: +class GetNextURLForAgencyAgencyInfo(BaseModel): suggestion_type: SuggestionType pdap_agency_id: Optional[int] = None agency_name: Optional[str] = None @@ -11,12 +13,17 @@ class GetNextURLForAgencyAgencyInfo: county: Optional[str] = None locality: Optional[str] = None -class GetNextURLForAgencyAnnotationResponse: +class GetNextURLForAgencyAnnotationInnerResponse(BaseModel): url_id: int + url: str agency_suggestions: list[ GetNextURLForAgencyAgencyInfo ] html_info: ResponseHTMLInfo -class URLAgencyAnnotationPostInfo: - suggested_agency: int | Literal["NEW"] \ No newline at end of file +class GetNextURLForAgencyAnnotationResponse(BaseModel): + next_annotation: Optional[GetNextURLForAgencyAnnotationInnerResponse] + +class URLAgencyAnnotationPostInfo(BaseModel): + is_new: bool = False + suggested_agency: Optional[int] = None \ No newline at end of file diff --git a/core/classes/AgencyIdentificationTaskOperator.py b/core/classes/AgencyIdentificationTaskOperator.py index de27f6cb..1589b96f 100644 --- a/core/classes/AgencyIdentificationTaskOperator.py +++ b/core/classes/AgencyIdentificationTaskOperator.py @@ -1,3 +1,5 @@ +from aiohttp import ClientSession + from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo @@ -67,33 +69,36 @@ async def run_subtask(subtask, url_id, collector_metadata) -> list[URLAgencySugg return await subtask.run(url_id=url_id, collector_metadata=collector_metadata) async def inner_task_logic(self): - tdos: list[AgencyIdentificationTDO] = await self.get_pending_urls_without_agency_identification() - await self.link_urls_to_task(url_ids=[tdo.url_id for tdo in tdos]) - error_infos = [] - all_agency_suggestions = [] - for tdo in tdos: - subtask = await self.get_subtask(tdo.collector_type) - try: - new_agency_suggestions = await self.run_subtask( - subtask, - tdo.url_id, - tdo.collector_metadata - ) - all_agency_suggestions.extend(new_agency_suggestions) - except Exception as e: - error_info = URLErrorPydanticInfo( - task_id=self.task_id, - url_id=tdo.url_id, - error=str(e), - ) - error_infos.append(error_info) + async with ClientSession() as session: + self.pdap_client.access_manager.session = session + self.muckrock_api_interface.session = session + tdos: list[AgencyIdentificationTDO] = await self.get_pending_urls_without_agency_identification() + await self.link_urls_to_task(url_ids=[tdo.url_id for tdo in tdos]) + error_infos = [] + all_agency_suggestions = [] + for tdo in tdos: + subtask = await self.get_subtask(tdo.collector_type) + try: + new_agency_suggestions = await self.run_subtask( + subtask, + tdo.url_id, + tdo.collector_metadata + ) + all_agency_suggestions.extend(new_agency_suggestions) + except Exception as e: + error_info = URLErrorPydanticInfo( + task_id=self.task_id, + url_id=tdo.url_id, + error=str(e), + ) + error_infos.append(error_info) - non_unknown_agency_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type != SuggestionType.UNKNOWN] - await self.adb_client.upsert_new_agencies(non_unknown_agency_suggestions) - confirmed_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type == SuggestionType.CONFIRMED] - await self.adb_client.add_confirmed_agency_url_links(confirmed_suggestions) - non_confirmed_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type != SuggestionType.CONFIRMED] - await self.adb_client.add_agency_auto_suggestions(non_confirmed_suggestions) - await self.adb_client.add_url_error_infos(error_infos) + non_unknown_agency_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type != SuggestionType.UNKNOWN] + await self.adb_client.upsert_new_agencies(non_unknown_agency_suggestions) + confirmed_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type == SuggestionType.CONFIRMED] + await self.adb_client.add_confirmed_agency_url_links(confirmed_suggestions) + non_confirmed_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type != SuggestionType.CONFIRMED] + await self.adb_client.add_agency_auto_suggestions(non_confirmed_suggestions) + await self.adb_client.add_url_error_infos(error_infos) diff --git a/pdap_api_client/AccessManager.py b/pdap_api_client/AccessManager.py index 0776fe0d..c39ba1e8 100644 --- a/pdap_api_client/AccessManager.py +++ b/pdap_api_client/AccessManager.py @@ -35,9 +35,9 @@ class AccessManager: """ def __init__( self, - session: ClientSession, email: str, password: str, + session: Optional[ClientSession] = None, api_key: Optional[str] = None, ): self.session = session @@ -46,7 +46,6 @@ def __init__( self.api_key = api_key self.email = email self.password = password - self.login(email=email, password=password) @property async def access_token(self): diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 2d6b603f..d550e801 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -1,3 +1,4 @@ +from random import randint from typing import List, Optional from pydantic import BaseModel @@ -13,7 +14,8 @@ from collector_db.DatabaseClient import DatabaseClient from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource, TaskType from collector_manager.enums import CollectorType -from core.enums import BatchStatus +from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from core.enums import BatchStatus, SuggestionType from tests.helpers.simple_test_data_functions import generate_test_urls @@ -60,6 +62,72 @@ async def batch_and_urls( return BatchURLCreationInfo(batch_id=batch_id, url_ids=url_ids) + async def agency(self) -> int: + agency_id = randint(1, 99999999) + await self.adb_client.upsert_new_agencies( + suggestions=[ + URLAgencySuggestionInfo( + url_id=-1, + suggestion_type=SuggestionType.UNKNOWN, + pdap_agency_id=agency_id, + agency_name=f"Test Agency {agency_id}", + state=f"Test State {agency_id}", + county=f"Test County {agency_id}", + locality=f"Test Locality {agency_id}" + ) + ] + ) + return agency_id + + async def auto_suggestions( + self, + url_ids: list[int], + num_suggestions: int, + suggestion_type: SuggestionType.AUTO_SUGGESTION or SuggestionType.UNKNOWN + ): + allowed_suggestion_types = [SuggestionType.AUTO_SUGGESTION, SuggestionType.UNKNOWN] + if suggestion_type not in allowed_suggestion_types: + raise ValueError(f"suggestion_type must be one of {allowed_suggestion_types}") + if suggestion_type == SuggestionType.UNKNOWN and num_suggestions > 1: + raise ValueError("num_suggestions must be 1 when suggestion_type is unknown") + + for url_id in url_ids: + suggestions = [] + for i in range(num_suggestions): + if suggestion_type == SuggestionType.UNKNOWN: + agency_id = None + else: + agency_id = await self.agency() + suggestion = URLAgencySuggestionInfo( + url_id=url_id, + suggestion_type=suggestion_type, + pdap_agency_id=agency_id + ) + suggestions.append(suggestion) + + await self.adb_client.add_agency_auto_suggestions( + suggestions=suggestions + ) + + async def confirmed_suggestions(self, url_ids: list[int]): + for url_id in url_ids: + await self.adb_client.add_confirmed_agency_url_links( + suggestions=[ + URLAgencySuggestionInfo( + url_id=url_id, + suggestion_type=SuggestionType.CONFIRMED, + pdap_agency_id=await self.agency() + ) + ] + ) + + async def manual_suggestion(self, user_id: int, url_id: int, is_new: bool = False): + await self.adb_client.add_agency_manual_suggestion( + agency_id=await self.agency(), + url_id=url_id, + user_id=user_id, + is_new=is_new + ) def urls(self, batch_id: int, url_count: int) -> InsertURLsInfo: diff --git a/tests/test_automated/integration/api/conftest.py b/tests/test_automated/integration/api/conftest.py index 8f80716f..d9a504a7 100644 --- a/tests/test_automated/integration/api/conftest.py +++ b/tests/test_automated/integration/api/conftest.py @@ -20,6 +20,9 @@ class APITestHelper: mock_huggingface_interface: MagicMock mock_label_studio_interface: MagicMock + def adb_client(self): + return self.db_data_creator.adb_client + MOCK_USER_ID = 1 diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index d3e60e1d..38b7cafd 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -12,6 +12,8 @@ from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse +from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ + URLAgencyAnnotationPostInfo from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse @@ -210,6 +212,23 @@ def post_relevance_annotation_and_get_next( ) return GetNextURLForAnnotationResponse(**data) + async def get_next_agency_annotation(self) -> GetNextURLForAgencyAnnotationResponse: + data = self.get( + url=f"/annotate/agency" + ) + return GetNextURLForAgencyAnnotationResponse(**data) + + async def post_agency_annotation_and_get_next( + self, + url_id: int, + agency_annotation_post_info: URLAgencyAnnotationPostInfo + ) -> GetNextURLForAgencyAnnotationResponse: + data = self.post( + url=f"/annotate/agency/{url_id}", + json=agency_annotation_post_info.model_dump(mode='json') + ) + return GetNextURLForAgencyAnnotationResponse(**data) + def get_urls(self, page: int = 1, errors: bool = False) -> GetURLsResponseInfo: data = self.get( url=f"/url", diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/test_automated/integration/api/test_annotate.py index 1ee03963..ef3693c2 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/test_automated/integration/api/test_annotate.py @@ -4,10 +4,13 @@ from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource +from collector_db.models import UserUrlAgencySuggestion +from core.DTOs.GetNextURLForAgencyAnnotationResponse import URLAgencyAnnotationPostInfo from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo -from core.enums import RecordType +from core.enums import RecordType, SuggestionType +from tests.helpers.DBDataCreator import BatchURLCreationInfo from tests.test_automated.integration.api.conftest import MOCK_USER_ID async def run_annotation_test( @@ -110,3 +113,223 @@ async def test_annotate_record_type(api_test_helper): metadata_attribute=URLMetadataAttributeType.RECORD_TYPE, expected_metadata_value=RecordType.ACCIDENT_REPORTS.value ) + +@pytest.mark.asyncio +async def test_annotate_agency_multiple_auto_suggestions(api_test_helper): + """ + Test Scenario: Multiple Auto Suggestions + A URL has multiple Agency Auto Suggestion and has not been annotated by the User + The user should receive all of the auto suggestions with full detail + """ + ath = api_test_helper + adb_client = ath.adb_client() + buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( + url_count=1, + with_html_content=True + ) + await ath.db_data_creator.auto_suggestions( + url_ids=buci.url_ids, + num_suggestions=2, + suggestion_type=SuggestionType.AUTO_SUGGESTION + ) + + # User requests next annotation + response = await ath.request_validator.get_next_agency_annotation() + + assert response.next_annotation + next_annotation = response.next_annotation + # Check that url_id matches the one we inserted + assert next_annotation.url_id == buci.url_ids[0] + + # Check that html data is present + assert next_annotation.html_info.description != "" + assert next_annotation.html_info.title != "" + + # Check that two agency_suggestions exist + assert len(next_annotation.agency_suggestions) == 2 + + for agency_suggestion in next_annotation.agency_suggestions: + assert agency_suggestion.suggestion_type == SuggestionType.AUTO_SUGGESTION + assert agency_suggestion.pdap_agency_id is not None + assert agency_suggestion.agency_name is not None + assert agency_suggestion.state is not None + assert agency_suggestion.county is not None + assert agency_suggestion.locality is not None + + +@pytest.mark.asyncio +async def test_annotate_agency_single_unknown_auto_suggestion(api_test_helper): + """ + Test Scenario: Single Unknown Auto Suggestion + A URL has a single Unknown Agency Auto Suggestion and has not been annotated by the User + The user should receive a single Unknown Auto Suggestion lacking other detail + """ + ath = api_test_helper + adb_client = ath.adb_client() + buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( + url_count=1, + with_html_content=True + ) + await ath.db_data_creator.auto_suggestions( + url_ids=buci.url_ids, + num_suggestions=1, + suggestion_type=SuggestionType.UNKNOWN + ) + response = await ath.request_validator.get_next_agency_annotation() + + assert response.next_annotation + next_annotation = response.next_annotation + # Check that url_id matches the one we inserted + assert next_annotation.url_id == buci.url_ids[0] + + # Check that html data is present + assert next_annotation.html_info.description != "" + assert next_annotation.html_info.title != "" + + # Check that one agency_suggestion exists + assert len(next_annotation.agency_suggestions) == 1 + + agency_suggestion = next_annotation.agency_suggestions[0] + + assert agency_suggestion.suggestion_type == SuggestionType.UNKNOWN + assert agency_suggestion.pdap_agency_id is None + assert agency_suggestion.agency_name is None + assert agency_suggestion.state is None + assert agency_suggestion.county is None + assert agency_suggestion.locality is None + + +@pytest.mark.asyncio +async def test_annotate_agency_single_confirmed_agency(api_test_helper): + """ + Test Scenario: Single Confirmed Agency + A URL has a single Confirmed Agency and has not been annotated by the User + The user should not receive this URL to annotate + """ + ath = api_test_helper + adb_client = ath.adb_client() + buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( + url_count=1, + with_html_content=True + ) + await ath.db_data_creator.confirmed_suggestions( + url_ids=buci.url_ids, + ) + response = await ath.request_validator.get_next_agency_annotation() + assert response.next_annotation is None + +@pytest.mark.asyncio +async def test_annotate_agency_other_user_annotation(api_test_helper): + """ + Test Scenario: Other User Annotation + A URL has been annotated by another User + Our user should still receive this URL to annotate + """ + ath = api_test_helper + adb_client = ath.adb_client() + buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( + url_count=1, + with_html_content=True + ) + await ath.db_data_creator.auto_suggestions( + url_ids=buci.url_ids, + num_suggestions=1, + suggestion_type=SuggestionType.UNKNOWN + ) + + await ath.db_data_creator.manual_suggestion( + user_id=MOCK_USER_ID + 1, + url_id=buci.url_ids[0], + ) + + response = await ath.request_validator.get_next_agency_annotation() + + assert response.next_annotation + next_annotation = response.next_annotation + # Check that url_id matches the one we inserted + assert next_annotation.url_id == buci.url_ids[0] + + # Check that html data is present + assert next_annotation.html_info.description != "" + assert next_annotation.html_info.title != "" + + # Check that one agency_suggestion exists + assert len(next_annotation.agency_suggestions) == 1 + +@pytest.mark.asyncio +async def test_annotate_agency_submit_and_get_next(api_test_helper): + """ + Test Scenario: Submit and Get Next (no other URL available) + A URL has been annotated by our User, and no other valid URLs have not been annotated + Our user should not receive another URL to annotate + Until another relevant URL is added + """ + ath = api_test_helper + adb_client = ath.adb_client() + buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( + url_count=2, + with_html_content=True + ) + await ath.db_data_creator.auto_suggestions( + url_ids=buci.url_ids, + num_suggestions=1, + suggestion_type=SuggestionType.UNKNOWN + ) + + # User should submit an annotation and receive the next + response = await ath.request_validator.post_agency_annotation_and_get_next( + url_id=buci.url_ids[0], + agency_annotation_post_info=URLAgencyAnnotationPostInfo( + suggested_agency=await ath.db_data_creator.agency(), + is_new=False + ) + + ) + assert response.next_annotation is not None + + # User should submit this annotation and receive none for the next + response = await ath.request_validator.post_agency_annotation_and_get_next( + url_id=buci.url_ids[1], + agency_annotation_post_info=URLAgencyAnnotationPostInfo( + suggested_agency=await ath.db_data_creator.agency(), + is_new=False + ) + ) + assert response.next_annotation is None + + +@pytest.mark.asyncio +async def test_annotate_agency_submit_new(api_test_helper): + """ + Test Scenario: Submit New + Our user receives an annotation and marks it as `NEW` + This should complete successfully + And within the database the annotation should be marked as `NEW` + """ + ath = api_test_helper + adb_client = ath.adb_client() + buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( + url_count=1, + with_html_content=True + ) + await ath.db_data_creator.auto_suggestions( + url_ids=buci.url_ids, + num_suggestions=1, + suggestion_type=SuggestionType.UNKNOWN + ) + + # User should submit an annotation and mark it as New + response = await ath.request_validator.post_agency_annotation_and_get_next( + url_id=buci.url_ids[0], + agency_annotation_post_info=URLAgencyAnnotationPostInfo( + suggested_agency=await ath.db_data_creator.agency(), + is_new=True + ) + ) + assert response.next_annotation is None + + # Within database, the annotation should be marked as `NEW` + all_manual_suggestions = await adb_client.get_all(UserUrlAgencySuggestion) + assert len(all_manual_suggestions) == 1 + assert all_manual_suggestions[0].is_new + diff --git a/tests/test_automated/integration/collector_db/test_database_structure.py b/tests/test_automated/integration/collector_db/test_database_structure.py index cdf93801..9c31c9cf 100644 --- a/tests/test_automated/integration/collector_db/test_database_structure.py +++ b/tests/test_automated/integration/collector_db/test_database_structure.py @@ -330,7 +330,7 @@ def test_root_url(db_data_creator: DBDataCreator): @pytest.mark.asyncio -async def test_upset_new_agencies(db_data_creator: DBDataCreator): +async def test_upsert_new_agencies(db_data_creator: DBDataCreator): """ Check that if the agency doesn't exist, it is added But if the agency does exist, it is updated with new information @@ -377,4 +377,3 @@ async def test_upset_new_agencies(db_data_creator: DBDataCreator): assert d[0] == "Updated Test Agency" assert d[1] == "Test Agency 1" assert d[2] == "Test Agency 2" - diff --git a/tests/test_automated/integration/core/test_async_core.py b/tests/test_automated/integration/core/test_async_core.py index 3b99d15c..ad72f2bf 100644 --- a/tests/test_automated/integration/core/test_async_core.py +++ b/tests/test_automated/integration/core/test_async_core.py @@ -8,7 +8,7 @@ from core.AsyncCore import AsyncCore from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome from core.enums import BatchStatus -from helpers.DBDataCreator import DBDataCreator +from test.helpers.DBDataCreator import DBDataCreator @pytest.mark.asyncio async def test_conclude_task_success(db_data_creator: DBDataCreator): From 31266b611c31237f524e364538a1d5dab569fa44 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 10 Feb 2025 09:52:17 -0500 Subject: [PATCH 050/244] Comment out `COPY .env` --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index c93fe158..dfcb1392 100644 --- a/Dockerfile +++ b/Dockerfile @@ -46,4 +46,4 @@ EXPOSE 80 RUN chmod +x execute.sh # Use the below for ease of local development, but remove when pushing to GitHub # Because there is no .env file in the repository (for security reasons) -COPY .env ./.env +#COPY .env ./.env From a049497688a997cd1abc93a2ae69ff387d6a5ff1 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 21 Feb 2025 08:55:36 -0500 Subject: [PATCH 051/244] DRAFT --- ENV.md | 10 +- api/main.py | 3 + api/routes/review.py | 19 ++ collector_db/AsyncDatabaseClient.py | 198 +++++++++++++++- collector_db/DTOConverter.py | 198 ++++++++++++++++ collector_db/models.py | 6 +- core/AsyncCore.py | 5 +- core/DTOs/GetNextURLForFinalReviewResponse.py | 64 ++++++ security_manager/SecurityManager.py | 1 + tests/helpers/DBDataCreator.py | 75 +++++- .../collector_db/test_db_client.py | 215 +++++++++++++++++- 11 files changed, 770 insertions(+), 24 deletions(-) create mode 100644 api/routes/review.py create mode 100644 collector_db/DTOConverter.py create mode 100644 core/DTOs/GetNextURLForFinalReviewResponse.py diff --git a/ENV.md b/ENV.md index 8fd30c33..68359348 100644 --- a/ENV.md +++ b/ENV.md @@ -14,11 +14,11 @@ Please ensure these are properly defined in a `.env` file in the root directory. |`POSTGRES_DB` | The database name for the test database | `source_collector_test_db` | |`POSTGRES_HOST` | The host for the test database | `127.0.0.1` | |`POSTGRES_PORT` | The port for the test database | `5432` | -|`DS_APP_SECRET_KEY`| The secret key used for decoding JWT tokens produced by the Data Sources App. Must match the secret token that is used in the Data Sources App for encoding. | `abc123` | +|`DS_APP_SECRET_KEY`| The secret key used for decoding JWT tokens produced by the Data Sources App. Must match the secret token `JWT_SECRET_KEY` that is used in the Data Sources App for encoding. | `abc123` | |`DEV`| Set to any value to run the application in development mode. | `true` | |`DEEPSEEK_API_KEY`| The API key required for accessing the DeepSeek API. | `abc123` | -|`OPENAI_API_KEY`| The API key required for accessing the OpenAI API.| `abc123` | -|`PDAP_EMAIL`| An email address for accessing the PDAP API.| `abc123@test.com` | -|`PDAP_PASSWORD`| A password for accessing the PDAP API.| `abc123` | -|`PDAP_API_KEY`| An API key for accessing the PDAP API.| `abc123` | +|`OPENAI_API_KEY`| The API key required for accessing the OpenAI API. | `abc123` | +|`PDAP_EMAIL`| An email address for accessing the PDAP API. | `abc123@test.com` | +|`PDAP_PASSWORD`| A password for accessing the PDAP API. | `abc123` | +|`PDAP_API_KEY`| An API key for accessing the PDAP API. | `abc123` | diff --git a/api/main.py b/api/main.py index 0a9c0249..34cebdd1 100644 --- a/api/main.py +++ b/api/main.py @@ -1,5 +1,6 @@ from contextlib import asynccontextmanager +import uvicorn from fastapi import FastAPI from api.routes.annotate import annotate_router @@ -84,3 +85,5 @@ async def setup_database(db_client): app.include_router(router) +if __name__ == "__main__": + uvicorn.run(app, host="0.0.0.0", port=8000) \ No newline at end of file diff --git a/api/routes/review.py b/api/routes/review.py new file mode 100644 index 00000000..f1b7210a --- /dev/null +++ b/api/routes/review.py @@ -0,0 +1,19 @@ +from fastapi import APIRouter, Depends + +from api.dependencies import get_async_core +from core.AsyncCore import AsyncCore +from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse +from security_manager.SecurityManager import AccessInfo, get_access_info + +review_router = APIRouter( + prefix="/review", + tags=["Review"], + responses={404: {"description": "Not found"}}, +) + +@review_router.get("/next-source") +async def get_next_source( + core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info), +) -> GetNextURLForFinalReviewResponse: + return await core.get_next_source_for_review() \ No newline at end of file diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 2f657c54..62a44fbf 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -1,11 +1,12 @@ from functools import wraps from typing import Optional -from sqlalchemy import select, exists, func +from sqlalchemy import select, exists, func, distinct, case, desc, asc from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker -from sqlalchemy.orm import selectinload, aliased +from sqlalchemy.orm import selectinload, aliased, joinedload from collector_db.ConfigManager import ConfigManager +from collector_db.DTOConverter import DTOConverter from collector_db.DTOs.MetadataAnnotationInfo import MetadataAnnotationInfo from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.DTOs.URLAnnotationInfo import URLAnnotationInfo @@ -23,6 +24,8 @@ from collector_manager.enums import URLStatus, CollectorType from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ GetNextURLForAgencyAgencyInfo, GetNextURLForAgencyAnnotationInnerResponse, URLAgencyAnnotationPostInfo +from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, FinalReviewAnnotationInfo, \ + FinalReviewAnnotationRelevantInfo, FinalReviewAnnotationRecordTypeInfo, FinalReviewAnnotationAgencyInfo from core.DTOs.GetTasksResponse import GetTasksResponse, GetTasksResponseTaskInfo from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseMetadataInfo, GetURLsResponseErrorInfo, \ GetURLsResponseInnerInfo @@ -47,10 +50,12 @@ def __init__(self, db_url: str = get_postgres_connection_string(is_async=True)): self.statement_composer = StatementComposer() @staticmethod - def _add_models(session: AsyncSession, model_class, models): - for model in models: - instance = model_class(**model.model_dump()) - session.add(instance) + async def _add_models(session: AsyncSession, model_class, models) -> list[int]: + instances = [model_class(**model.model_dump()) for model in models] + session.add_all(instances) + await session.flush() + return [instance.id for instance in instances] + @staticmethod @@ -86,12 +91,13 @@ async def get_url_metadata_by_status( return [URLMetadataInfo(**url_metadata.__dict__) for url_metadata in model_result] @session_manager - async def add_url_metadata(self, session: AsyncSession, url_metadata_info: URLMetadataInfo): - self._add_models(session, URLMetadata, [url_metadata_info]) + async def add_url_metadata(self, session: AsyncSession, url_metadata_info: URLMetadataInfo) -> int: + result = await self._add_models(session, URLMetadata, [url_metadata_info]) + return result[0] @session_manager - async def add_url_metadatas(self, session: AsyncSession, url_metadata_infos: list[URLMetadataInfo]): - self._add_models(session, URLMetadata, url_metadata_infos) + async def add_url_metadatas(self, session: AsyncSession, url_metadata_infos: list[URLMetadataInfo]) -> list[int]: + return await self._add_models(session, URLMetadata, url_metadata_infos) @session_manager async def add_url_error_infos(self, session: AsyncSession, url_error_infos: list[URLErrorPydanticInfo]): @@ -125,7 +131,7 @@ async def get_urls_with_errors(self, session: AsyncSession) -> list[URLErrorPyda @session_manager async def add_html_content_infos(self, session: AsyncSession, html_content_infos: list[URLHTMLContentInfo]): - self._add_models(session, URLHTMLContent, html_content_infos) + await self._add_models(session, URLHTMLContent, html_content_infos) @session_manager async def has_pending_urls_without_html_data(self, session: AsyncSession) -> bool: @@ -312,7 +318,7 @@ async def get_next_url_for_annotation( return annotation_info @session_manager - async def add_relevance_annotation( + async def add_metadata_annotation( self, session: AsyncSession, user_id: int, @@ -780,3 +786,171 @@ async def add_agency_manual_suggestion( is_new=is_new ) session.add(url_agency_suggestion) + + @session_manager + async def get_next_url_for_final_review(self, session: AsyncSession) -> GetNextURLForFinalReviewResponse: + + # Subqueries for ORDER clause + + # Subqueries for Counting distinct annotations + # Count distinct auto annotations for metadata + distinct_auto_metadata_subquery = ( + select( + URLMetadata.url_id, + func.count(distinct(URLMetadata.attribute)).label("auto_count") + ). + group_by(URLMetadata.url_id).subquery() + ) + # Count distinct user annotations for metadata + distinct_user_metadata_subquery = ( + select( + URLMetadata.url_id, + func.count(distinct(URLMetadata.attribute)).label("user_count") + ).join(MetadataAnnotation). + where(MetadataAnnotation.user_id != None). + group_by(URLMetadata.url_id).subquery() + ) + + + # Count whether agency auto annotations exist + # (Note: Can be either confirmed or auto suggestion) + agency_annotations_exist_subquery = ( + select( + URL.id, + case( + ( + exists().where(URL.id == ConfirmedUrlAgency.url_id), 1 + ), + ( + exists().where(URL.id == AutomatedUrlAgencySuggestion.url_id), 1 + ), + else_=0 + ).label("agency_annotations_exist") + ).subquery() + ) + + # Count whether agency user annotations exist + agency_user_annotations_exist_subquery = ( + select( + URL.id, + case( + ( + exists().where(URL.id == UserUrlAgencySuggestion.url_id), 1 + ), + else_=0 + ).label("agency_user_annotations_exist") + ).subquery() + ) + + # Subqueries for counting *all* annotations + + # Count all auto annotations for metadata + all_auto_metadata_subquery = ( + select( + URLMetadata.url_id, + func.count(URLMetadata.attribute).label("auto_count") + ).group_by(URLMetadata.url_id).subquery() + ) + # Count all user annotations for metadata + all_user_metadata_subquery = ( + select( + URLMetadata.url_id, + func.count(URLMetadata.attribute).label("user_count") + ).join(MetadataAnnotation). + where(MetadataAnnotation.user_id != None). + group_by(URLMetadata.url_id).subquery() + ) + + # Count all user agency annotations + all_user_agency_annotations_subquery = ( + select( + UserUrlAgencySuggestion.url_id, + func.count(UserUrlAgencySuggestion.agency_id).label("user_count") + ).group_by(UserUrlAgencySuggestion.url_id).subquery() + ) + + + + # Basic URL query + url_query = ( + select( + URL, + ( + func.coalesce(distinct_auto_metadata_subquery.c.auto_count, 0) + + func.coalesce(distinct_user_metadata_subquery.c.user_count, 0) + + func.coalesce(agency_annotations_exist_subquery.c.agency_annotations_exist, 0) + + func.coalesce(agency_user_annotations_exist_subquery.c.agency_user_annotations_exist, 0) + ).label("total_distinct_annotation_count"), + ( + func.coalesce(all_auto_metadata_subquery.c.auto_count, 0) + + func.coalesce(all_user_metadata_subquery.c.user_count, 0) + + func.coalesce(all_user_agency_annotations_subquery.c.user_count, 0) + + func.coalesce(agency_annotations_exist_subquery.c.agency_annotations_exist, 0) + ).label("total_overall_annotation_count") + ).outerjoin( + distinct_auto_metadata_subquery, URL.id == distinct_auto_metadata_subquery.c.url_id + ).outerjoin( + distinct_user_metadata_subquery, URL.id == distinct_user_metadata_subquery.c.url_id + ).outerjoin( + agency_annotations_exist_subquery, URL.id == agency_annotations_exist_subquery.c.id + ).outerjoin( + agency_user_annotations_exist_subquery, URL.id == agency_user_annotations_exist_subquery.c.id + ).outerjoin( + all_auto_metadata_subquery, URL.id == all_auto_metadata_subquery.c.url_id + ).outerjoin( + all_user_metadata_subquery, URL.id == all_user_metadata_subquery.c.url_id + ).outerjoin( + all_user_agency_annotations_subquery, URL.id == all_user_agency_annotations_subquery.c.url_id + ) + ) + options = [ + joinedload(URL.html_content), + joinedload(URL.url_metadata).joinedload(URLMetadata.annotations), + joinedload(URL.automated_agency_suggestions).joinedload(AutomatedUrlAgencySuggestion.agency), + joinedload(URL.user_agency_suggestions).joinedload(UserUrlAgencySuggestion.agency), + joinedload(URL.confirmed_agencies).joinedload(ConfirmedUrlAgency.agency), + ] + + # Apply options + url_query = url_query.options(*options) + + # Apply order clause + url_query = url_query.order_by( + desc("total_distinct_annotation_count"), + desc("total_overall_annotation_count"), + ) + + + # Apply limit + url_query = url_query.limit(1) + + # Execute query + raw_result = await session.execute(url_query) + full_result = raw_result.unique().all()[0] + result: URL = full_result[0] + + # Convert html content to response format + html_content = result.html_content + html_content_infos = [URLHTMLContentInfo(**html_info.__dict__) for html_info in html_content] + + automated_agency_suggestions = result.automated_agency_suggestions + user_agency_suggestions = result.user_agency_suggestions + confirmed_agencies = result.confirmed_agencies + url_metadatas = result.url_metadata + + # Return + return GetNextURLForFinalReviewResponse( + id=result.id, + url=result.url, + html_info=convert_to_response_html_info(html_content_infos), + annotations=FinalReviewAnnotationInfo( + relevant=DTOConverter.final_review_annotation_relevant_info(url_metadatas), + record_type=DTOConverter.final_review_annotation_record_type_info(url_metadatas), + agency=DTOConverter.final_review_annotation_agency_info( + automated_agency_suggestions=automated_agency_suggestions, + confirmed_agencies=confirmed_agencies, + user_agency_suggestions=user_agency_suggestions + ) + ) + ) + diff --git a/collector_db/DTOConverter.py b/collector_db/DTOConverter.py new file mode 100644 index 00000000..63c88d92 --- /dev/null +++ b/collector_db/DTOConverter.py @@ -0,0 +1,198 @@ +from collector_db.enums import ValidationStatus, ValidationSource, URLMetadataAttributeType +from collector_db.models import URLMetadata, ConfirmedUrlAgency, AutomatedUrlAgencySuggestion, UserUrlAgencySuggestion, \ + MetadataAnnotation +from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo +from core.DTOs.GetNextURLForFinalReviewResponse import FinalReviewAnnotationRelevantInfo, \ + FinalReviewAnnotationRelevantUsersInfo, FinalReviewAnnotationRecordTypeInfo, FinalReviewAnnotationAgencyAutoInfo, \ + FinalReviewAnnotationAgencyInfo, FinalReviewAnnotationAgencyUserInfo +from core.enums import RecordType, SuggestionType + + +def get_url_metadata( + url_metadatas: list[URLMetadata], + validation_status: ValidationStatus, + validation_source: ValidationSource, + attribute: URLMetadataAttributeType +): + for url_metadata in url_metadatas: + if url_metadata.validation_status != validation_status.value: + continue + if url_metadata.validation_source != validation_source.value: + continue + if url_metadata.attribute != attribute.value: + continue + return url_metadata + + + +class DTOConverter: + + """ + Converts SQLAlchemy objects to DTOs + """ + + @staticmethod + def final_review_annotation_relevant_info( + url_metadatas: list[URLMetadata] + ) -> FinalReviewAnnotationRelevantInfo: + relevant_metadata = get_url_metadata( + url_metadatas=url_metadatas, + validation_status=ValidationStatus.PENDING_VALIDATION, + validation_source=ValidationSource.MACHINE_LEARNING, + attribute=URLMetadataAttributeType.RELEVANT + ) + auto_value = relevant_metadata.value if relevant_metadata else None + if auto_value is not None: + auto_value = (auto_value == "True") + + + annotations: list[MetadataAnnotation] = relevant_metadata.annotations if relevant_metadata else [] + relevant_count = 0 + not_relevant_count = 0 + for annotation in annotations: + if annotation.value == "True": + relevant_count += 1 + else: + not_relevant_count += 1 + return FinalReviewAnnotationRelevantInfo( + auto=auto_value, + users=FinalReviewAnnotationRelevantUsersInfo( + relevant=relevant_count, + not_relevant=not_relevant_count + ) + ) + + @staticmethod + def final_review_annotation_record_type_info( + url_metadata: list[URLMetadata] + ): + record_type_metadata = get_url_metadata( + url_metadatas=url_metadata, + validation_status=ValidationStatus.PENDING_VALIDATION, + validation_source=ValidationSource.MACHINE_LEARNING, + attribute=URLMetadataAttributeType.RECORD_TYPE + ) + user_count = {} + if record_type_metadata is None: + auto_value = None + annotations = [] + else: + auto_value = RecordType(record_type_metadata.value) + annotations = record_type_metadata.annotations + for annotation in annotations: + value = RecordType(annotation.value) + if value not in user_count: + user_count[value] = 0 + user_count[value] += 1 + # Sort users by count, descending + user_count = dict(sorted(user_count.items(), key=lambda x: x[1], reverse=True)) + + return FinalReviewAnnotationRecordTypeInfo( + auto=auto_value, + users=user_count + ) + + @staticmethod + def final_review_annotation_agency_auto_info( + automated_agency_suggestions: list[AutomatedUrlAgencySuggestion] + ) -> FinalReviewAnnotationAgencyAutoInfo: + + if len(automated_agency_suggestions) == 0: + return FinalReviewAnnotationAgencyAutoInfo( + unknown=True, + suggestions=[] + ) + + + if len(automated_agency_suggestions) == 1: + suggestion = automated_agency_suggestions[0] + unknown = suggestion.is_unknown + else: + unknown = False + + if unknown: + return FinalReviewAnnotationAgencyAutoInfo( + unknown=True, + suggestions=[ + GetNextURLForAgencyAgencyInfo( + suggestion_type=SuggestionType.UNKNOWN, + ) + ] + ) + + return FinalReviewAnnotationAgencyAutoInfo( + unknown=unknown, + suggestions=[ + GetNextURLForAgencyAgencyInfo( + suggestion_type=SuggestionType.AUTO_SUGGESTION, + pdap_agency_id=suggestion.agency_id, + agency_name=suggestion.agency.name, + state=suggestion.agency.state, + county=suggestion.agency.county, + locality=suggestion.agency.locality + ) for suggestion in automated_agency_suggestions + ] + ) + + @staticmethod + def user_url_agency_suggestion_to_final_review_annotation_agency_user_info( + user_url_agency_suggestions: list[UserUrlAgencySuggestion] + ) -> dict[int, FinalReviewAnnotationAgencyUserInfo]: + d = {} + for suggestion in user_url_agency_suggestions: + agency = suggestion.agency + agency_id = agency.agency_id + if agency.agency_id not in d: + d[agency_id] = FinalReviewAnnotationAgencyUserInfo( + suggestion_type=SuggestionType.MANUAL_SUGGESTION, + agency_name=agency.name, + pdap_agency_id=agency_id, + state=agency.state, + county=agency.county, + locality=agency.locality, + count=1 + ) + else: + d[agency_id].count += 1 + + # Return sorted + return dict(sorted(d.items(), key=lambda x: x[1].count, reverse=True)) + + + @staticmethod + def final_review_annotation_agency_info( + automated_agency_suggestions: list[AutomatedUrlAgencySuggestion], + confirmed_agencies: list[ConfirmedUrlAgency], + user_agency_suggestions: list[UserUrlAgencySuggestion] + ): + if len(confirmed_agencies) == 1: + confirmed_agency = confirmed_agencies[0] + confirmed_agency_info = GetNextURLForAgencyAgencyInfo( + suggestion_type=SuggestionType.CONFIRMED, + pdap_agency_id=confirmed_agency.agency_id, + agency_name=confirmed_agency.agency.name, + state=confirmed_agency.agency.state, + county=confirmed_agency.agency.county, + locality=confirmed_agency.agency.locality + ) + return FinalReviewAnnotationAgencyInfo( + confirmed=confirmed_agency_info, + users=None, + auto=None + ) + + + agency_auto_info = DTOConverter.final_review_annotation_agency_auto_info( + automated_agency_suggestions + ) + + agency_user_info = DTOConverter.user_url_agency_suggestion_to_final_review_annotation_agency_user_info( + user_agency_suggestions + ) + + return FinalReviewAnnotationAgencyInfo( + confirmed=None, + users=agency_user_info, + auto=agency_auto_info + ) + diff --git a/collector_db/models.py b/collector_db/models.py index ee43f35b..f462198c 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -111,7 +111,7 @@ class URLMetadata(Base): name="uq_url_id_attribute"), ) - id = Column(Integer, primary_key=True) + id = Column(Integer, primary_key=True, autoincrement=True) url_id = Column(Integer, ForeignKey('urls.id', name='url_metadata_url_id_fkey'), nullable=False) attribute = Column( PGEnum('Record Type', 'Agency', 'Relevant', name='url_attribute'), @@ -143,7 +143,7 @@ class MetadataAnnotation(Base): name="metadata_annotations_uq_user_id_metadata_id"), ) - id = Column(Integer, primary_key=True) + id = Column(Integer, primary_key=True, autoincrement=True) user_id = Column(Integer, nullable=False) metadata_id = Column(Integer, ForeignKey('url_metadata.id'), nullable=False) value = Column(Text, nullable=False) @@ -193,7 +193,7 @@ class URLHTMLContent(Base): name="uq_url_id_content_type"), ) - id = Column(Integer, primary_key=True) + id = Column(Integer, primary_key=True, autoincrement=True) url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) content_type = Column( PGEnum('Title', 'Description', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'Div', name='url_html_content_type'), diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 808821f7..d2085540 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -180,7 +180,7 @@ async def submit_url_annotation( annotation: str, metadata_type: URLMetadataAttributeType ) -> GetNextURLForAnnotationResponse: - await self.adb_client.add_relevance_annotation( + await self.adb_client.add_metadata_annotation( user_id=user_id, metadata_id=metadata_id, annotation=annotation) @@ -220,3 +220,6 @@ async def submit_url_agency_annotation( agency_id=agency_suggestion_id, is_new=agency_post_info.is_new, ) + + async def get_next_source_for_review(self): + return await self.adb_client.get_next_url_for_final_review() diff --git a/core/DTOs/GetNextURLForFinalReviewResponse.py b/core/DTOs/GetNextURLForFinalReviewResponse.py new file mode 100644 index 00000000..8a7077a1 --- /dev/null +++ b/core/DTOs/GetNextURLForFinalReviewResponse.py @@ -0,0 +1,64 @@ +from typing import Optional + +from pydantic import BaseModel, Field + +from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo +from core.enums import RecordType +from html_tag_collector.DataClassTags import ResponseHTMLInfo + +# Todo: Add descriptions + +class FinalReviewAnnotationRelevantUsersInfo(BaseModel): + relevant: int = Field(title="Number of users who marked the URL as relevant") + not_relevant: int = Field(title="Number of users who marked the URL as not relevant") + +class FinalReviewAnnotationRelevantInfo(BaseModel): + auto: Optional[bool] = Field(title="Whether the auto-labeler has marked the URL as relevant") + users: FinalReviewAnnotationRelevantUsersInfo = Field( + title="How users identified the relevancy of the source", + ) + +class FinalReviewAnnotationRecordTypeInfo(BaseModel): + auto: Optional[RecordType] = Field(title="The record type suggested by the auto-labeler") + users: dict[RecordType, int] = Field( + title="A dictionary, sorted by size and omitting zero values, of all record types suggested by users", + ) + +class FinalReviewAnnotationAgencyUserInfo(GetNextURLForAgencyAgencyInfo): + count: int = Field(title="Number of times suggested by users") + +class FinalReviewAnnotationAgencyAutoInfo(BaseModel): + unknown: bool = Field(title="Whether the auto-labeler suggested the URL as unknown") + suggestions: Optional[list[GetNextURLForAgencyAgencyInfo]] = Field( + title="A list of agencies, if any, suggested by the auto-labeler", + ) + +class FinalReviewAnnotationAgencyInfo(BaseModel): + confirmed: Optional[GetNextURLForAgencyAgencyInfo] = Field( + title="The confirmed agency for the URL", + ) + auto: Optional[FinalReviewAnnotationAgencyAutoInfo] = Field( + title="A single agency or a list of agencies suggested by the auto-labeler",) + users: Optional[dict[int, FinalReviewAnnotationAgencyUserInfo]] = Field( + title="A list, sorted by size, of all agencies suggested by users", + ) + +class FinalReviewAnnotationInfo(BaseModel): + relevant: FinalReviewAnnotationRelevantInfo = Field( + title="User and auto annotations for relevancy", + ) + record_type: FinalReviewAnnotationRecordTypeInfo = Field( + title="User and auto annotations for record type", + ) + agency: FinalReviewAnnotationAgencyInfo = Field( + title="User and auto annotations for agency", + ) + +class GetNextURLForFinalReviewResponse(BaseModel): + id: int = Field(title="The id of the URL") + url: str = Field(title="The URL") + html_info: ResponseHTMLInfo = Field(title="The HTML content of the URL") + annotations: FinalReviewAnnotationInfo = Field( + title="The annotations for the URL, from both users and the auto-labeler", + ) \ No newline at end of file diff --git a/security_manager/SecurityManager.py b/security_manager/SecurityManager.py index 18bc6a26..8d80f46c 100644 --- a/security_manager/SecurityManager.py +++ b/security_manager/SecurityManager.py @@ -39,6 +39,7 @@ def __init__( def validate_token(self, token: str) -> AccessInfo: try: payload = jwt.decode(token, self.secret_key, algorithms=[ALGORITHM]) + print(payload) return self.payload_to_access_info(payload) except InvalidTokenError as e: raise HTTPException( diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index d550e801..86efe510 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -186,9 +186,10 @@ async def metadata( value: str = "False", validation_status: ValidationStatus = ValidationStatus.PENDING_VALIDATION, validation_source: ValidationSource = ValidationSource.MACHINE_LEARNING - ): + ) -> list[int]: + metadata_ids = [] for url_id in url_ids: - await self.adb_client.add_url_metadata( + metadata_id = await self.adb_client.add_url_metadata( URLMetadataInfo( url_id=url_id, attribute=attribute, @@ -197,6 +198,8 @@ async def metadata( validation_source=validation_source, ) ) + metadata_ids.append(metadata_id) + return metadata_ids async def error_info( self, @@ -215,3 +218,71 @@ async def error_info( error_infos.append(url_error_info) await self.adb_client.add_url_error_infos(error_infos) + async def user_annotation( + self, + metadata_id: int, + user_id: Optional[int] = None, + annotation: str = "test annotation" + ): + if user_id is None: + user_id = randint(1, 99999999) + await self.adb_client.add_metadata_annotation( + user_id=user_id, + metadata_id=metadata_id, + annotation=annotation + ) + + async def agency_auto_suggestions( + self, + url_id: int, + count: int, + suggestion_type: SuggestionType = SuggestionType.AUTO_SUGGESTION + ): + if suggestion_type == SuggestionType.UNKNOWN: + count = 1 # Can only be one auto suggestion if unknown + + await self.adb_client.add_agency_auto_suggestions( + suggestions=[ + URLAgencySuggestionInfo( + url_id=url_id, + suggestion_type=suggestion_type, + pdap_agency_id=None if suggestion_type == SuggestionType.UNKNOWN else await self.agency(), + state="Test State", + county="Test County", + locality="Test Locality" + ) for _ in range(count) + ] + ) + + async def agency_confirmed_suggestion( + self, + url_id: int + ): + + await self.adb_client.add_confirmed_agency_url_links( + suggestions=[ + URLAgencySuggestionInfo( + url_id=url_id, + suggestion_type=SuggestionType.CONFIRMED, + pdap_agency_id=await self.agency() + ) + ] + ) + + async def agency_user_suggestions( + self, + url_id: int, + user_id: Optional[int] = None, + agency_id: Optional[int] = None + ): + if user_id is None: + user_id = randint(1, 99999999) + + if agency_id is None: + agency_id = await self.agency() + await self.adb_client.add_agency_manual_suggestion( + agency_id=agency_id, + url_id=url_id, + user_id=user_id, + is_new=False + ) diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index fa3b7110..9444bc79 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -10,7 +10,7 @@ from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource from collector_manager.enums import URLStatus -from core.enums import BatchStatus +from core.enums import BatchStatus, RecordType, SuggestionType from tests.helpers.DBDataCreator import DBDataCreator @@ -194,3 +194,216 @@ async def test_get_urls_with_metadata(db_data_creator: DBDataCreator): ) assert len(results) == 1 +async def setup_for_get_next_url_for_final_review( + db_data_creator: DBDataCreator, + annotation_count: int, + include_user_annotations: bool = True +): + batch_id = db_data_creator.batch() + url_mapping = db_data_creator.urls(batch_id=batch_id, url_count=1).url_mappings[0] + await db_data_creator.html_data([url_mapping.url_id]) + + async def add_metadata_annotation(count: int, value: str, metadata_id: int): + for i in range(count): + await db_data_creator.user_annotation( + metadata_id=metadata_id, + annotation=value + ) + + async def add_user_suggestion(count: int): + agency_id = await db_data_creator.agency() + for i in range(count): + await db_data_creator.agency_user_suggestions( + url_id=url_mapping.url_id, + agency_id=agency_id + ) + + relevant_metadata_ids = await db_data_creator.metadata( + url_ids=[url_mapping.url_id], + attribute=URLMetadataAttributeType.RELEVANT, + value="True", + validation_source=ValidationSource.MACHINE_LEARNING, + validation_status=ValidationStatus.PENDING_VALIDATION + ) + relevant_metadata_id = relevant_metadata_ids[0] + record_type_metadata_ids = await db_data_creator.metadata( + url_ids=[url_mapping.url_id], + attribute=URLMetadataAttributeType.RECORD_TYPE, + value=RecordType.ARREST_RECORDS.value, + validation_source=ValidationSource.MACHINE_LEARNING, + validation_status=ValidationStatus.PENDING_VALIDATION + ) + record_type_metadata_id = record_type_metadata_ids[0] + + if include_user_annotations: + await add_metadata_annotation(annotation_count, "True", relevant_metadata_id) + await add_metadata_annotation(1, "False", relevant_metadata_id) + await add_metadata_annotation(3, RecordType.ARREST_RECORDS.value, record_type_metadata_id) + await add_metadata_annotation(2, RecordType.DISPATCH_RECORDINGS.value, record_type_metadata_id) + await add_metadata_annotation(1, RecordType.ACCIDENT_REPORTS.value, record_type_metadata_id) + + if include_user_annotations: + # Add user suggestions for agencies, one suggested by 3 users, another by 2, another by 1 + for i in range(annotation_count): + await add_user_suggestion(i + 1) + + + return url_mapping + + +@pytest.mark.asyncio +async def test_get_next_url_for_final_review_basic(db_data_creator: DBDataCreator): + """ + Test that an annotated URL is returned + """ + + url_mapping = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + + await db_data_creator.agency_auto_suggestions( + url_id=url_mapping.url_id, + count=3 + ) + + + result = await db_data_creator.adb_client.get_next_url_for_final_review() + + assert result.url == url_mapping.url + html_info = result.html_info + assert html_info.description == "test description" + assert html_info.title == "test html content" + + annotation_info = result.annotations + relevant_info = annotation_info.relevant + assert relevant_info.auto == True + assert relevant_info.users.relevant == 3 + assert relevant_info.users.not_relevant == 1 + + record_type_info = annotation_info.record_type + assert record_type_info.auto == RecordType.ARREST_RECORDS + user_d = record_type_info.users + assert user_d[RecordType.ARREST_RECORDS] == 3 + assert user_d[RecordType.DISPATCH_RECORDINGS] == 2 + assert user_d[RecordType.ACCIDENT_REPORTS] == 1 + assert list(user_d.keys()) == [RecordType.ARREST_RECORDS, RecordType.DISPATCH_RECORDINGS, RecordType.ACCIDENT_REPORTS] + + + agency_info = annotation_info.agency + auto_agency_suggestions = agency_info.auto + assert auto_agency_suggestions.unknown == False + assert len(auto_agency_suggestions.suggestions) == 3 + + # Check user agency suggestions exist and in descending order of count + user_agency_suggestions = agency_info.users + user_agency_suggestions_as_list = list(user_agency_suggestions.values()) + assert len(user_agency_suggestions_as_list) == 3 + for i in range(3): + assert user_agency_suggestions_as_list[i].count == 3 - i + + + +@pytest.mark.asyncio +async def test_get_next_url_for_final_review_favor_more_components(db_data_creator: DBDataCreator): + """ + Test in the case of two URLs, favoring the one with more annotations for more components + i.e., if one has annotations for record type and agency id, that should be favored over one with just record type + """ + + url_mapping_without_user_anno = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=False + ) + + url_mapping_with_user_anno = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + + # Have both be listed as unknown + + for url_mapping in [url_mapping_with_user_anno, url_mapping_without_user_anno]: + await db_data_creator.agency_auto_suggestions( + url_id=url_mapping.url_id, + count=3, + suggestion_type=SuggestionType.UNKNOWN + ) + + result = await db_data_creator.adb_client.get_next_url_for_final_review() + + assert result.id == url_mapping_with_user_anno.url_id + + + +@pytest.mark.asyncio +async def test_get_next_url_for_final_review_favor_more_annotations(db_data_creator: DBDataCreator): + """ + Test in the case of two URLs with the same number of components annotated, favoring the one with more total annotations + """ + url_mapping_lower_count = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=1, + include_user_annotations=True + ) + + url_mapping_higher_count = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + + for url_mapping in [url_mapping_lower_count, url_mapping_higher_count]: + await db_data_creator.agency_confirmed_suggestion( + url_id=url_mapping.url_id + ) + + result = await db_data_creator.adb_client.get_next_url_for_final_review() + + assert result.id == url_mapping_higher_count.url_id + + assert result.annotations.agency.confirmed is not None + + # TODO: Check that the the confirmed agency is shown for the result + + + +@pytest.mark.asyncio +async def test_get_next_url_for_final_review_no_annotations(db_data_creator: DBDataCreator): + """ + Test in the case of one URL with no annotations. + Should be returned if it is the only one available. + """ + batch_id = db_data_creator.batch() + url_mapping = db_data_creator.urls(batch_id=batch_id, url_count=1).url_mappings[0] + + result = await db_data_creator.adb_client.get_next_url_for_final_review() + + assert result.id == url_mapping.url_id + + annotations = result.annotations + + agency = annotations.agency + assert agency.confirmed is None + assert agency.auto.unknown is True + assert agency.auto.suggestions == [] + + record_type = annotations.record_type + assert record_type.auto is None + assert record_type.users == {} + + relevant = annotations.relevant + assert relevant.auto is None + assert relevant.users.relevant == 0 + assert relevant.users.not_relevant == 0 + + +async def test_get_next_url_for_final_review_only_confirmed_urls(db_data_creator: DBDataCreator): + """ + Test in the case of one URL that is confirmed + Should not be returned. + """ + batch_id = db_data_creator.batch() \ No newline at end of file From e3b467e9f3b628f54deac1b4d81effc8690c4ca1 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 21 Feb 2025 08:55:36 -0500 Subject: [PATCH 052/244] feat(api): add review get next source endpoint --- ENV.md | 10 +- api/main.py | 3 + api/routes/review.py | 19 ++ collector_db/AsyncDatabaseClient.py | 198 +++++++++++++++- collector_db/DTOConverter.py | 198 ++++++++++++++++ collector_db/models.py | 6 +- core/AsyncCore.py | 5 +- core/DTOs/GetNextURLForFinalReviewResponse.py | 64 ++++++ security_manager/SecurityManager.py | 1 + tests/helpers/DBDataCreator.py | 75 +++++- .../collector_db/test_db_client.py | 215 +++++++++++++++++- 11 files changed, 770 insertions(+), 24 deletions(-) create mode 100644 api/routes/review.py create mode 100644 collector_db/DTOConverter.py create mode 100644 core/DTOs/GetNextURLForFinalReviewResponse.py diff --git a/ENV.md b/ENV.md index 8fd30c33..68359348 100644 --- a/ENV.md +++ b/ENV.md @@ -14,11 +14,11 @@ Please ensure these are properly defined in a `.env` file in the root directory. |`POSTGRES_DB` | The database name for the test database | `source_collector_test_db` | |`POSTGRES_HOST` | The host for the test database | `127.0.0.1` | |`POSTGRES_PORT` | The port for the test database | `5432` | -|`DS_APP_SECRET_KEY`| The secret key used for decoding JWT tokens produced by the Data Sources App. Must match the secret token that is used in the Data Sources App for encoding. | `abc123` | +|`DS_APP_SECRET_KEY`| The secret key used for decoding JWT tokens produced by the Data Sources App. Must match the secret token `JWT_SECRET_KEY` that is used in the Data Sources App for encoding. | `abc123` | |`DEV`| Set to any value to run the application in development mode. | `true` | |`DEEPSEEK_API_KEY`| The API key required for accessing the DeepSeek API. | `abc123` | -|`OPENAI_API_KEY`| The API key required for accessing the OpenAI API.| `abc123` | -|`PDAP_EMAIL`| An email address for accessing the PDAP API.| `abc123@test.com` | -|`PDAP_PASSWORD`| A password for accessing the PDAP API.| `abc123` | -|`PDAP_API_KEY`| An API key for accessing the PDAP API.| `abc123` | +|`OPENAI_API_KEY`| The API key required for accessing the OpenAI API. | `abc123` | +|`PDAP_EMAIL`| An email address for accessing the PDAP API. | `abc123@test.com` | +|`PDAP_PASSWORD`| A password for accessing the PDAP API. | `abc123` | +|`PDAP_API_KEY`| An API key for accessing the PDAP API. | `abc123` | diff --git a/api/main.py b/api/main.py index 0a9c0249..34cebdd1 100644 --- a/api/main.py +++ b/api/main.py @@ -1,5 +1,6 @@ from contextlib import asynccontextmanager +import uvicorn from fastapi import FastAPI from api.routes.annotate import annotate_router @@ -84,3 +85,5 @@ async def setup_database(db_client): app.include_router(router) +if __name__ == "__main__": + uvicorn.run(app, host="0.0.0.0", port=8000) \ No newline at end of file diff --git a/api/routes/review.py b/api/routes/review.py new file mode 100644 index 00000000..f1b7210a --- /dev/null +++ b/api/routes/review.py @@ -0,0 +1,19 @@ +from fastapi import APIRouter, Depends + +from api.dependencies import get_async_core +from core.AsyncCore import AsyncCore +from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse +from security_manager.SecurityManager import AccessInfo, get_access_info + +review_router = APIRouter( + prefix="/review", + tags=["Review"], + responses={404: {"description": "Not found"}}, +) + +@review_router.get("/next-source") +async def get_next_source( + core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info), +) -> GetNextURLForFinalReviewResponse: + return await core.get_next_source_for_review() \ No newline at end of file diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 2f657c54..62a44fbf 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -1,11 +1,12 @@ from functools import wraps from typing import Optional -from sqlalchemy import select, exists, func +from sqlalchemy import select, exists, func, distinct, case, desc, asc from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker -from sqlalchemy.orm import selectinload, aliased +from sqlalchemy.orm import selectinload, aliased, joinedload from collector_db.ConfigManager import ConfigManager +from collector_db.DTOConverter import DTOConverter from collector_db.DTOs.MetadataAnnotationInfo import MetadataAnnotationInfo from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.DTOs.URLAnnotationInfo import URLAnnotationInfo @@ -23,6 +24,8 @@ from collector_manager.enums import URLStatus, CollectorType from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ GetNextURLForAgencyAgencyInfo, GetNextURLForAgencyAnnotationInnerResponse, URLAgencyAnnotationPostInfo +from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, FinalReviewAnnotationInfo, \ + FinalReviewAnnotationRelevantInfo, FinalReviewAnnotationRecordTypeInfo, FinalReviewAnnotationAgencyInfo from core.DTOs.GetTasksResponse import GetTasksResponse, GetTasksResponseTaskInfo from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseMetadataInfo, GetURLsResponseErrorInfo, \ GetURLsResponseInnerInfo @@ -47,10 +50,12 @@ def __init__(self, db_url: str = get_postgres_connection_string(is_async=True)): self.statement_composer = StatementComposer() @staticmethod - def _add_models(session: AsyncSession, model_class, models): - for model in models: - instance = model_class(**model.model_dump()) - session.add(instance) + async def _add_models(session: AsyncSession, model_class, models) -> list[int]: + instances = [model_class(**model.model_dump()) for model in models] + session.add_all(instances) + await session.flush() + return [instance.id for instance in instances] + @staticmethod @@ -86,12 +91,13 @@ async def get_url_metadata_by_status( return [URLMetadataInfo(**url_metadata.__dict__) for url_metadata in model_result] @session_manager - async def add_url_metadata(self, session: AsyncSession, url_metadata_info: URLMetadataInfo): - self._add_models(session, URLMetadata, [url_metadata_info]) + async def add_url_metadata(self, session: AsyncSession, url_metadata_info: URLMetadataInfo) -> int: + result = await self._add_models(session, URLMetadata, [url_metadata_info]) + return result[0] @session_manager - async def add_url_metadatas(self, session: AsyncSession, url_metadata_infos: list[URLMetadataInfo]): - self._add_models(session, URLMetadata, url_metadata_infos) + async def add_url_metadatas(self, session: AsyncSession, url_metadata_infos: list[URLMetadataInfo]) -> list[int]: + return await self._add_models(session, URLMetadata, url_metadata_infos) @session_manager async def add_url_error_infos(self, session: AsyncSession, url_error_infos: list[URLErrorPydanticInfo]): @@ -125,7 +131,7 @@ async def get_urls_with_errors(self, session: AsyncSession) -> list[URLErrorPyda @session_manager async def add_html_content_infos(self, session: AsyncSession, html_content_infos: list[URLHTMLContentInfo]): - self._add_models(session, URLHTMLContent, html_content_infos) + await self._add_models(session, URLHTMLContent, html_content_infos) @session_manager async def has_pending_urls_without_html_data(self, session: AsyncSession) -> bool: @@ -312,7 +318,7 @@ async def get_next_url_for_annotation( return annotation_info @session_manager - async def add_relevance_annotation( + async def add_metadata_annotation( self, session: AsyncSession, user_id: int, @@ -780,3 +786,171 @@ async def add_agency_manual_suggestion( is_new=is_new ) session.add(url_agency_suggestion) + + @session_manager + async def get_next_url_for_final_review(self, session: AsyncSession) -> GetNextURLForFinalReviewResponse: + + # Subqueries for ORDER clause + + # Subqueries for Counting distinct annotations + # Count distinct auto annotations for metadata + distinct_auto_metadata_subquery = ( + select( + URLMetadata.url_id, + func.count(distinct(URLMetadata.attribute)).label("auto_count") + ). + group_by(URLMetadata.url_id).subquery() + ) + # Count distinct user annotations for metadata + distinct_user_metadata_subquery = ( + select( + URLMetadata.url_id, + func.count(distinct(URLMetadata.attribute)).label("user_count") + ).join(MetadataAnnotation). + where(MetadataAnnotation.user_id != None). + group_by(URLMetadata.url_id).subquery() + ) + + + # Count whether agency auto annotations exist + # (Note: Can be either confirmed or auto suggestion) + agency_annotations_exist_subquery = ( + select( + URL.id, + case( + ( + exists().where(URL.id == ConfirmedUrlAgency.url_id), 1 + ), + ( + exists().where(URL.id == AutomatedUrlAgencySuggestion.url_id), 1 + ), + else_=0 + ).label("agency_annotations_exist") + ).subquery() + ) + + # Count whether agency user annotations exist + agency_user_annotations_exist_subquery = ( + select( + URL.id, + case( + ( + exists().where(URL.id == UserUrlAgencySuggestion.url_id), 1 + ), + else_=0 + ).label("agency_user_annotations_exist") + ).subquery() + ) + + # Subqueries for counting *all* annotations + + # Count all auto annotations for metadata + all_auto_metadata_subquery = ( + select( + URLMetadata.url_id, + func.count(URLMetadata.attribute).label("auto_count") + ).group_by(URLMetadata.url_id).subquery() + ) + # Count all user annotations for metadata + all_user_metadata_subquery = ( + select( + URLMetadata.url_id, + func.count(URLMetadata.attribute).label("user_count") + ).join(MetadataAnnotation). + where(MetadataAnnotation.user_id != None). + group_by(URLMetadata.url_id).subquery() + ) + + # Count all user agency annotations + all_user_agency_annotations_subquery = ( + select( + UserUrlAgencySuggestion.url_id, + func.count(UserUrlAgencySuggestion.agency_id).label("user_count") + ).group_by(UserUrlAgencySuggestion.url_id).subquery() + ) + + + + # Basic URL query + url_query = ( + select( + URL, + ( + func.coalesce(distinct_auto_metadata_subquery.c.auto_count, 0) + + func.coalesce(distinct_user_metadata_subquery.c.user_count, 0) + + func.coalesce(agency_annotations_exist_subquery.c.agency_annotations_exist, 0) + + func.coalesce(agency_user_annotations_exist_subquery.c.agency_user_annotations_exist, 0) + ).label("total_distinct_annotation_count"), + ( + func.coalesce(all_auto_metadata_subquery.c.auto_count, 0) + + func.coalesce(all_user_metadata_subquery.c.user_count, 0) + + func.coalesce(all_user_agency_annotations_subquery.c.user_count, 0) + + func.coalesce(agency_annotations_exist_subquery.c.agency_annotations_exist, 0) + ).label("total_overall_annotation_count") + ).outerjoin( + distinct_auto_metadata_subquery, URL.id == distinct_auto_metadata_subquery.c.url_id + ).outerjoin( + distinct_user_metadata_subquery, URL.id == distinct_user_metadata_subquery.c.url_id + ).outerjoin( + agency_annotations_exist_subquery, URL.id == agency_annotations_exist_subquery.c.id + ).outerjoin( + agency_user_annotations_exist_subquery, URL.id == agency_user_annotations_exist_subquery.c.id + ).outerjoin( + all_auto_metadata_subquery, URL.id == all_auto_metadata_subquery.c.url_id + ).outerjoin( + all_user_metadata_subquery, URL.id == all_user_metadata_subquery.c.url_id + ).outerjoin( + all_user_agency_annotations_subquery, URL.id == all_user_agency_annotations_subquery.c.url_id + ) + ) + options = [ + joinedload(URL.html_content), + joinedload(URL.url_metadata).joinedload(URLMetadata.annotations), + joinedload(URL.automated_agency_suggestions).joinedload(AutomatedUrlAgencySuggestion.agency), + joinedload(URL.user_agency_suggestions).joinedload(UserUrlAgencySuggestion.agency), + joinedload(URL.confirmed_agencies).joinedload(ConfirmedUrlAgency.agency), + ] + + # Apply options + url_query = url_query.options(*options) + + # Apply order clause + url_query = url_query.order_by( + desc("total_distinct_annotation_count"), + desc("total_overall_annotation_count"), + ) + + + # Apply limit + url_query = url_query.limit(1) + + # Execute query + raw_result = await session.execute(url_query) + full_result = raw_result.unique().all()[0] + result: URL = full_result[0] + + # Convert html content to response format + html_content = result.html_content + html_content_infos = [URLHTMLContentInfo(**html_info.__dict__) for html_info in html_content] + + automated_agency_suggestions = result.automated_agency_suggestions + user_agency_suggestions = result.user_agency_suggestions + confirmed_agencies = result.confirmed_agencies + url_metadatas = result.url_metadata + + # Return + return GetNextURLForFinalReviewResponse( + id=result.id, + url=result.url, + html_info=convert_to_response_html_info(html_content_infos), + annotations=FinalReviewAnnotationInfo( + relevant=DTOConverter.final_review_annotation_relevant_info(url_metadatas), + record_type=DTOConverter.final_review_annotation_record_type_info(url_metadatas), + agency=DTOConverter.final_review_annotation_agency_info( + automated_agency_suggestions=automated_agency_suggestions, + confirmed_agencies=confirmed_agencies, + user_agency_suggestions=user_agency_suggestions + ) + ) + ) + diff --git a/collector_db/DTOConverter.py b/collector_db/DTOConverter.py new file mode 100644 index 00000000..63c88d92 --- /dev/null +++ b/collector_db/DTOConverter.py @@ -0,0 +1,198 @@ +from collector_db.enums import ValidationStatus, ValidationSource, URLMetadataAttributeType +from collector_db.models import URLMetadata, ConfirmedUrlAgency, AutomatedUrlAgencySuggestion, UserUrlAgencySuggestion, \ + MetadataAnnotation +from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo +from core.DTOs.GetNextURLForFinalReviewResponse import FinalReviewAnnotationRelevantInfo, \ + FinalReviewAnnotationRelevantUsersInfo, FinalReviewAnnotationRecordTypeInfo, FinalReviewAnnotationAgencyAutoInfo, \ + FinalReviewAnnotationAgencyInfo, FinalReviewAnnotationAgencyUserInfo +from core.enums import RecordType, SuggestionType + + +def get_url_metadata( + url_metadatas: list[URLMetadata], + validation_status: ValidationStatus, + validation_source: ValidationSource, + attribute: URLMetadataAttributeType +): + for url_metadata in url_metadatas: + if url_metadata.validation_status != validation_status.value: + continue + if url_metadata.validation_source != validation_source.value: + continue + if url_metadata.attribute != attribute.value: + continue + return url_metadata + + + +class DTOConverter: + + """ + Converts SQLAlchemy objects to DTOs + """ + + @staticmethod + def final_review_annotation_relevant_info( + url_metadatas: list[URLMetadata] + ) -> FinalReviewAnnotationRelevantInfo: + relevant_metadata = get_url_metadata( + url_metadatas=url_metadatas, + validation_status=ValidationStatus.PENDING_VALIDATION, + validation_source=ValidationSource.MACHINE_LEARNING, + attribute=URLMetadataAttributeType.RELEVANT + ) + auto_value = relevant_metadata.value if relevant_metadata else None + if auto_value is not None: + auto_value = (auto_value == "True") + + + annotations: list[MetadataAnnotation] = relevant_metadata.annotations if relevant_metadata else [] + relevant_count = 0 + not_relevant_count = 0 + for annotation in annotations: + if annotation.value == "True": + relevant_count += 1 + else: + not_relevant_count += 1 + return FinalReviewAnnotationRelevantInfo( + auto=auto_value, + users=FinalReviewAnnotationRelevantUsersInfo( + relevant=relevant_count, + not_relevant=not_relevant_count + ) + ) + + @staticmethod + def final_review_annotation_record_type_info( + url_metadata: list[URLMetadata] + ): + record_type_metadata = get_url_metadata( + url_metadatas=url_metadata, + validation_status=ValidationStatus.PENDING_VALIDATION, + validation_source=ValidationSource.MACHINE_LEARNING, + attribute=URLMetadataAttributeType.RECORD_TYPE + ) + user_count = {} + if record_type_metadata is None: + auto_value = None + annotations = [] + else: + auto_value = RecordType(record_type_metadata.value) + annotations = record_type_metadata.annotations + for annotation in annotations: + value = RecordType(annotation.value) + if value not in user_count: + user_count[value] = 0 + user_count[value] += 1 + # Sort users by count, descending + user_count = dict(sorted(user_count.items(), key=lambda x: x[1], reverse=True)) + + return FinalReviewAnnotationRecordTypeInfo( + auto=auto_value, + users=user_count + ) + + @staticmethod + def final_review_annotation_agency_auto_info( + automated_agency_suggestions: list[AutomatedUrlAgencySuggestion] + ) -> FinalReviewAnnotationAgencyAutoInfo: + + if len(automated_agency_suggestions) == 0: + return FinalReviewAnnotationAgencyAutoInfo( + unknown=True, + suggestions=[] + ) + + + if len(automated_agency_suggestions) == 1: + suggestion = automated_agency_suggestions[0] + unknown = suggestion.is_unknown + else: + unknown = False + + if unknown: + return FinalReviewAnnotationAgencyAutoInfo( + unknown=True, + suggestions=[ + GetNextURLForAgencyAgencyInfo( + suggestion_type=SuggestionType.UNKNOWN, + ) + ] + ) + + return FinalReviewAnnotationAgencyAutoInfo( + unknown=unknown, + suggestions=[ + GetNextURLForAgencyAgencyInfo( + suggestion_type=SuggestionType.AUTO_SUGGESTION, + pdap_agency_id=suggestion.agency_id, + agency_name=suggestion.agency.name, + state=suggestion.agency.state, + county=suggestion.agency.county, + locality=suggestion.agency.locality + ) for suggestion in automated_agency_suggestions + ] + ) + + @staticmethod + def user_url_agency_suggestion_to_final_review_annotation_agency_user_info( + user_url_agency_suggestions: list[UserUrlAgencySuggestion] + ) -> dict[int, FinalReviewAnnotationAgencyUserInfo]: + d = {} + for suggestion in user_url_agency_suggestions: + agency = suggestion.agency + agency_id = agency.agency_id + if agency.agency_id not in d: + d[agency_id] = FinalReviewAnnotationAgencyUserInfo( + suggestion_type=SuggestionType.MANUAL_SUGGESTION, + agency_name=agency.name, + pdap_agency_id=agency_id, + state=agency.state, + county=agency.county, + locality=agency.locality, + count=1 + ) + else: + d[agency_id].count += 1 + + # Return sorted + return dict(sorted(d.items(), key=lambda x: x[1].count, reverse=True)) + + + @staticmethod + def final_review_annotation_agency_info( + automated_agency_suggestions: list[AutomatedUrlAgencySuggestion], + confirmed_agencies: list[ConfirmedUrlAgency], + user_agency_suggestions: list[UserUrlAgencySuggestion] + ): + if len(confirmed_agencies) == 1: + confirmed_agency = confirmed_agencies[0] + confirmed_agency_info = GetNextURLForAgencyAgencyInfo( + suggestion_type=SuggestionType.CONFIRMED, + pdap_agency_id=confirmed_agency.agency_id, + agency_name=confirmed_agency.agency.name, + state=confirmed_agency.agency.state, + county=confirmed_agency.agency.county, + locality=confirmed_agency.agency.locality + ) + return FinalReviewAnnotationAgencyInfo( + confirmed=confirmed_agency_info, + users=None, + auto=None + ) + + + agency_auto_info = DTOConverter.final_review_annotation_agency_auto_info( + automated_agency_suggestions + ) + + agency_user_info = DTOConverter.user_url_agency_suggestion_to_final_review_annotation_agency_user_info( + user_agency_suggestions + ) + + return FinalReviewAnnotationAgencyInfo( + confirmed=None, + users=agency_user_info, + auto=agency_auto_info + ) + diff --git a/collector_db/models.py b/collector_db/models.py index ee43f35b..f462198c 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -111,7 +111,7 @@ class URLMetadata(Base): name="uq_url_id_attribute"), ) - id = Column(Integer, primary_key=True) + id = Column(Integer, primary_key=True, autoincrement=True) url_id = Column(Integer, ForeignKey('urls.id', name='url_metadata_url_id_fkey'), nullable=False) attribute = Column( PGEnum('Record Type', 'Agency', 'Relevant', name='url_attribute'), @@ -143,7 +143,7 @@ class MetadataAnnotation(Base): name="metadata_annotations_uq_user_id_metadata_id"), ) - id = Column(Integer, primary_key=True) + id = Column(Integer, primary_key=True, autoincrement=True) user_id = Column(Integer, nullable=False) metadata_id = Column(Integer, ForeignKey('url_metadata.id'), nullable=False) value = Column(Text, nullable=False) @@ -193,7 +193,7 @@ class URLHTMLContent(Base): name="uq_url_id_content_type"), ) - id = Column(Integer, primary_key=True) + id = Column(Integer, primary_key=True, autoincrement=True) url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) content_type = Column( PGEnum('Title', 'Description', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'Div', name='url_html_content_type'), diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 808821f7..d2085540 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -180,7 +180,7 @@ async def submit_url_annotation( annotation: str, metadata_type: URLMetadataAttributeType ) -> GetNextURLForAnnotationResponse: - await self.adb_client.add_relevance_annotation( + await self.adb_client.add_metadata_annotation( user_id=user_id, metadata_id=metadata_id, annotation=annotation) @@ -220,3 +220,6 @@ async def submit_url_agency_annotation( agency_id=agency_suggestion_id, is_new=agency_post_info.is_new, ) + + async def get_next_source_for_review(self): + return await self.adb_client.get_next_url_for_final_review() diff --git a/core/DTOs/GetNextURLForFinalReviewResponse.py b/core/DTOs/GetNextURLForFinalReviewResponse.py new file mode 100644 index 00000000..8a7077a1 --- /dev/null +++ b/core/DTOs/GetNextURLForFinalReviewResponse.py @@ -0,0 +1,64 @@ +from typing import Optional + +from pydantic import BaseModel, Field + +from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo +from core.enums import RecordType +from html_tag_collector.DataClassTags import ResponseHTMLInfo + +# Todo: Add descriptions + +class FinalReviewAnnotationRelevantUsersInfo(BaseModel): + relevant: int = Field(title="Number of users who marked the URL as relevant") + not_relevant: int = Field(title="Number of users who marked the URL as not relevant") + +class FinalReviewAnnotationRelevantInfo(BaseModel): + auto: Optional[bool] = Field(title="Whether the auto-labeler has marked the URL as relevant") + users: FinalReviewAnnotationRelevantUsersInfo = Field( + title="How users identified the relevancy of the source", + ) + +class FinalReviewAnnotationRecordTypeInfo(BaseModel): + auto: Optional[RecordType] = Field(title="The record type suggested by the auto-labeler") + users: dict[RecordType, int] = Field( + title="A dictionary, sorted by size and omitting zero values, of all record types suggested by users", + ) + +class FinalReviewAnnotationAgencyUserInfo(GetNextURLForAgencyAgencyInfo): + count: int = Field(title="Number of times suggested by users") + +class FinalReviewAnnotationAgencyAutoInfo(BaseModel): + unknown: bool = Field(title="Whether the auto-labeler suggested the URL as unknown") + suggestions: Optional[list[GetNextURLForAgencyAgencyInfo]] = Field( + title="A list of agencies, if any, suggested by the auto-labeler", + ) + +class FinalReviewAnnotationAgencyInfo(BaseModel): + confirmed: Optional[GetNextURLForAgencyAgencyInfo] = Field( + title="The confirmed agency for the URL", + ) + auto: Optional[FinalReviewAnnotationAgencyAutoInfo] = Field( + title="A single agency or a list of agencies suggested by the auto-labeler",) + users: Optional[dict[int, FinalReviewAnnotationAgencyUserInfo]] = Field( + title="A list, sorted by size, of all agencies suggested by users", + ) + +class FinalReviewAnnotationInfo(BaseModel): + relevant: FinalReviewAnnotationRelevantInfo = Field( + title="User and auto annotations for relevancy", + ) + record_type: FinalReviewAnnotationRecordTypeInfo = Field( + title="User and auto annotations for record type", + ) + agency: FinalReviewAnnotationAgencyInfo = Field( + title="User and auto annotations for agency", + ) + +class GetNextURLForFinalReviewResponse(BaseModel): + id: int = Field(title="The id of the URL") + url: str = Field(title="The URL") + html_info: ResponseHTMLInfo = Field(title="The HTML content of the URL") + annotations: FinalReviewAnnotationInfo = Field( + title="The annotations for the URL, from both users and the auto-labeler", + ) \ No newline at end of file diff --git a/security_manager/SecurityManager.py b/security_manager/SecurityManager.py index 18bc6a26..8d80f46c 100644 --- a/security_manager/SecurityManager.py +++ b/security_manager/SecurityManager.py @@ -39,6 +39,7 @@ def __init__( def validate_token(self, token: str) -> AccessInfo: try: payload = jwt.decode(token, self.secret_key, algorithms=[ALGORITHM]) + print(payload) return self.payload_to_access_info(payload) except InvalidTokenError as e: raise HTTPException( diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index d550e801..86efe510 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -186,9 +186,10 @@ async def metadata( value: str = "False", validation_status: ValidationStatus = ValidationStatus.PENDING_VALIDATION, validation_source: ValidationSource = ValidationSource.MACHINE_LEARNING - ): + ) -> list[int]: + metadata_ids = [] for url_id in url_ids: - await self.adb_client.add_url_metadata( + metadata_id = await self.adb_client.add_url_metadata( URLMetadataInfo( url_id=url_id, attribute=attribute, @@ -197,6 +198,8 @@ async def metadata( validation_source=validation_source, ) ) + metadata_ids.append(metadata_id) + return metadata_ids async def error_info( self, @@ -215,3 +218,71 @@ async def error_info( error_infos.append(url_error_info) await self.adb_client.add_url_error_infos(error_infos) + async def user_annotation( + self, + metadata_id: int, + user_id: Optional[int] = None, + annotation: str = "test annotation" + ): + if user_id is None: + user_id = randint(1, 99999999) + await self.adb_client.add_metadata_annotation( + user_id=user_id, + metadata_id=metadata_id, + annotation=annotation + ) + + async def agency_auto_suggestions( + self, + url_id: int, + count: int, + suggestion_type: SuggestionType = SuggestionType.AUTO_SUGGESTION + ): + if suggestion_type == SuggestionType.UNKNOWN: + count = 1 # Can only be one auto suggestion if unknown + + await self.adb_client.add_agency_auto_suggestions( + suggestions=[ + URLAgencySuggestionInfo( + url_id=url_id, + suggestion_type=suggestion_type, + pdap_agency_id=None if suggestion_type == SuggestionType.UNKNOWN else await self.agency(), + state="Test State", + county="Test County", + locality="Test Locality" + ) for _ in range(count) + ] + ) + + async def agency_confirmed_suggestion( + self, + url_id: int + ): + + await self.adb_client.add_confirmed_agency_url_links( + suggestions=[ + URLAgencySuggestionInfo( + url_id=url_id, + suggestion_type=SuggestionType.CONFIRMED, + pdap_agency_id=await self.agency() + ) + ] + ) + + async def agency_user_suggestions( + self, + url_id: int, + user_id: Optional[int] = None, + agency_id: Optional[int] = None + ): + if user_id is None: + user_id = randint(1, 99999999) + + if agency_id is None: + agency_id = await self.agency() + await self.adb_client.add_agency_manual_suggestion( + agency_id=agency_id, + url_id=url_id, + user_id=user_id, + is_new=False + ) diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index fa3b7110..9444bc79 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -10,7 +10,7 @@ from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource from collector_manager.enums import URLStatus -from core.enums import BatchStatus +from core.enums import BatchStatus, RecordType, SuggestionType from tests.helpers.DBDataCreator import DBDataCreator @@ -194,3 +194,216 @@ async def test_get_urls_with_metadata(db_data_creator: DBDataCreator): ) assert len(results) == 1 +async def setup_for_get_next_url_for_final_review( + db_data_creator: DBDataCreator, + annotation_count: int, + include_user_annotations: bool = True +): + batch_id = db_data_creator.batch() + url_mapping = db_data_creator.urls(batch_id=batch_id, url_count=1).url_mappings[0] + await db_data_creator.html_data([url_mapping.url_id]) + + async def add_metadata_annotation(count: int, value: str, metadata_id: int): + for i in range(count): + await db_data_creator.user_annotation( + metadata_id=metadata_id, + annotation=value + ) + + async def add_user_suggestion(count: int): + agency_id = await db_data_creator.agency() + for i in range(count): + await db_data_creator.agency_user_suggestions( + url_id=url_mapping.url_id, + agency_id=agency_id + ) + + relevant_metadata_ids = await db_data_creator.metadata( + url_ids=[url_mapping.url_id], + attribute=URLMetadataAttributeType.RELEVANT, + value="True", + validation_source=ValidationSource.MACHINE_LEARNING, + validation_status=ValidationStatus.PENDING_VALIDATION + ) + relevant_metadata_id = relevant_metadata_ids[0] + record_type_metadata_ids = await db_data_creator.metadata( + url_ids=[url_mapping.url_id], + attribute=URLMetadataAttributeType.RECORD_TYPE, + value=RecordType.ARREST_RECORDS.value, + validation_source=ValidationSource.MACHINE_LEARNING, + validation_status=ValidationStatus.PENDING_VALIDATION + ) + record_type_metadata_id = record_type_metadata_ids[0] + + if include_user_annotations: + await add_metadata_annotation(annotation_count, "True", relevant_metadata_id) + await add_metadata_annotation(1, "False", relevant_metadata_id) + await add_metadata_annotation(3, RecordType.ARREST_RECORDS.value, record_type_metadata_id) + await add_metadata_annotation(2, RecordType.DISPATCH_RECORDINGS.value, record_type_metadata_id) + await add_metadata_annotation(1, RecordType.ACCIDENT_REPORTS.value, record_type_metadata_id) + + if include_user_annotations: + # Add user suggestions for agencies, one suggested by 3 users, another by 2, another by 1 + for i in range(annotation_count): + await add_user_suggestion(i + 1) + + + return url_mapping + + +@pytest.mark.asyncio +async def test_get_next_url_for_final_review_basic(db_data_creator: DBDataCreator): + """ + Test that an annotated URL is returned + """ + + url_mapping = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + + await db_data_creator.agency_auto_suggestions( + url_id=url_mapping.url_id, + count=3 + ) + + + result = await db_data_creator.adb_client.get_next_url_for_final_review() + + assert result.url == url_mapping.url + html_info = result.html_info + assert html_info.description == "test description" + assert html_info.title == "test html content" + + annotation_info = result.annotations + relevant_info = annotation_info.relevant + assert relevant_info.auto == True + assert relevant_info.users.relevant == 3 + assert relevant_info.users.not_relevant == 1 + + record_type_info = annotation_info.record_type + assert record_type_info.auto == RecordType.ARREST_RECORDS + user_d = record_type_info.users + assert user_d[RecordType.ARREST_RECORDS] == 3 + assert user_d[RecordType.DISPATCH_RECORDINGS] == 2 + assert user_d[RecordType.ACCIDENT_REPORTS] == 1 + assert list(user_d.keys()) == [RecordType.ARREST_RECORDS, RecordType.DISPATCH_RECORDINGS, RecordType.ACCIDENT_REPORTS] + + + agency_info = annotation_info.agency + auto_agency_suggestions = agency_info.auto + assert auto_agency_suggestions.unknown == False + assert len(auto_agency_suggestions.suggestions) == 3 + + # Check user agency suggestions exist and in descending order of count + user_agency_suggestions = agency_info.users + user_agency_suggestions_as_list = list(user_agency_suggestions.values()) + assert len(user_agency_suggestions_as_list) == 3 + for i in range(3): + assert user_agency_suggestions_as_list[i].count == 3 - i + + + +@pytest.mark.asyncio +async def test_get_next_url_for_final_review_favor_more_components(db_data_creator: DBDataCreator): + """ + Test in the case of two URLs, favoring the one with more annotations for more components + i.e., if one has annotations for record type and agency id, that should be favored over one with just record type + """ + + url_mapping_without_user_anno = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=False + ) + + url_mapping_with_user_anno = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + + # Have both be listed as unknown + + for url_mapping in [url_mapping_with_user_anno, url_mapping_without_user_anno]: + await db_data_creator.agency_auto_suggestions( + url_id=url_mapping.url_id, + count=3, + suggestion_type=SuggestionType.UNKNOWN + ) + + result = await db_data_creator.adb_client.get_next_url_for_final_review() + + assert result.id == url_mapping_with_user_anno.url_id + + + +@pytest.mark.asyncio +async def test_get_next_url_for_final_review_favor_more_annotations(db_data_creator: DBDataCreator): + """ + Test in the case of two URLs with the same number of components annotated, favoring the one with more total annotations + """ + url_mapping_lower_count = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=1, + include_user_annotations=True + ) + + url_mapping_higher_count = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + + for url_mapping in [url_mapping_lower_count, url_mapping_higher_count]: + await db_data_creator.agency_confirmed_suggestion( + url_id=url_mapping.url_id + ) + + result = await db_data_creator.adb_client.get_next_url_for_final_review() + + assert result.id == url_mapping_higher_count.url_id + + assert result.annotations.agency.confirmed is not None + + # TODO: Check that the the confirmed agency is shown for the result + + + +@pytest.mark.asyncio +async def test_get_next_url_for_final_review_no_annotations(db_data_creator: DBDataCreator): + """ + Test in the case of one URL with no annotations. + Should be returned if it is the only one available. + """ + batch_id = db_data_creator.batch() + url_mapping = db_data_creator.urls(batch_id=batch_id, url_count=1).url_mappings[0] + + result = await db_data_creator.adb_client.get_next_url_for_final_review() + + assert result.id == url_mapping.url_id + + annotations = result.annotations + + agency = annotations.agency + assert agency.confirmed is None + assert agency.auto.unknown is True + assert agency.auto.suggestions == [] + + record_type = annotations.record_type + assert record_type.auto is None + assert record_type.users == {} + + relevant = annotations.relevant + assert relevant.auto is None + assert relevant.users.relevant == 0 + assert relevant.users.not_relevant == 0 + + +async def test_get_next_url_for_final_review_only_confirmed_urls(db_data_creator: DBDataCreator): + """ + Test in the case of one URL that is confirmed + Should not be returned. + """ + batch_id = db_data_creator.batch() \ No newline at end of file From 96a98acbf103cd4be8cf75270632d0c1a5c449a4 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 21 Feb 2025 11:21:20 -0500 Subject: [PATCH 053/244] feat(api): add review get next source endpoint --- api/main.py | 5 +- collector_db/AsyncDatabaseClient.py | 15 +++- tests/helpers/DBDataCreator.py | 10 ++- tests/helpers/complex_test_data_functions.py | 60 +++++++++++++++ .../api/helpers/RequestValidator.py | 10 ++- .../integration/api/test_review.py | 55 ++++++++++++++ .../collector_db/test_db_client.py | 74 ++++--------------- 7 files changed, 162 insertions(+), 67 deletions(-) create mode 100644 tests/helpers/complex_test_data_functions.py create mode 100644 tests/test_automated/integration/api/test_review.py diff --git a/api/main.py b/api/main.py index 34cebdd1..8feaa165 100644 --- a/api/main.py +++ b/api/main.py @@ -6,6 +6,7 @@ from api.routes.annotate import annotate_router from api.routes.batch import batch_router from api.routes.collector import collector_router +from api.routes.review import review_router from api.routes.root import root_router from api.routes.task import task_router from api.routes.url import url_router @@ -79,8 +80,10 @@ async def setup_database(db_client): batch_router, annotate_router, url_router, - task_router + task_router, + review_router ] + for router in routers: app.include_router(router) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 62a44fbf..f6548dfa 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -788,7 +788,10 @@ async def add_agency_manual_suggestion( session.add(url_agency_suggestion) @session_manager - async def get_next_url_for_final_review(self, session: AsyncSession) -> GetNextURLForFinalReviewResponse: + async def get_next_url_for_final_review( + self, + session: AsyncSession + ) -> Optional[GetNextURLForFinalReviewResponse]: # Subqueries for ORDER clause @@ -901,6 +904,8 @@ async def get_next_url_for_final_review(self, session: AsyncSession) -> GetNextU all_user_metadata_subquery, URL.id == all_user_metadata_subquery.c.url_id ).outerjoin( all_user_agency_annotations_subquery, URL.id == all_user_agency_annotations_subquery.c.url_id + ).where( + URL.outcome == URLStatus.PENDING.value ) ) options = [ @@ -926,8 +931,12 @@ async def get_next_url_for_final_review(self, session: AsyncSession) -> GetNextU # Execute query raw_result = await session.execute(url_query) - full_result = raw_result.unique().all()[0] - result: URL = full_result[0] + + full_result = raw_result.unique().all() + + if len(full_result) == 0: + return None + result: URL = full_result[0][0] # Convert html content to response format html_content = result.html_content diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 86efe510..16f73602 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -13,7 +13,7 @@ from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.DatabaseClient import DatabaseClient from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource, TaskType -from collector_manager.enums import CollectorType +from collector_manager.enums import CollectorType, URLStatus from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.enums import BatchStatus, SuggestionType from tests.helpers.simple_test_data_functions import generate_test_urls @@ -130,13 +130,19 @@ async def manual_suggestion(self, user_id: int, url_id: int, is_new: bool = Fals ) - def urls(self, batch_id: int, url_count: int) -> InsertURLsInfo: + def urls( + self, + batch_id: int, + url_count: int, + outcome: URLStatus = URLStatus.PENDING + ) -> InsertURLsInfo: raw_urls = generate_test_urls(url_count) url_infos: List[URLInfo] = [] for url in raw_urls: url_infos.append( URLInfo( url=url, + outcome=outcome ) ) diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py new file mode 100644 index 00000000..57f4c412 --- /dev/null +++ b/tests/helpers/complex_test_data_functions.py @@ -0,0 +1,60 @@ +from collector_db.enums import URLMetadataAttributeType, ValidationSource, ValidationStatus +from core.enums import RecordType +from tests.helpers.DBDataCreator import DBDataCreator + + +async def setup_for_get_next_url_for_final_review( + db_data_creator: DBDataCreator, + annotation_count: int, + include_user_annotations: bool = True +): + batch_id = db_data_creator.batch() + url_mapping = db_data_creator.urls(batch_id=batch_id, url_count=1).url_mappings[0] + await db_data_creator.html_data([url_mapping.url_id]) + + async def add_metadata_annotation(count: int, value: str, metadata_id: int): + for i in range(count): + await db_data_creator.user_annotation( + metadata_id=metadata_id, + annotation=value + ) + + async def add_user_suggestion(count: int): + agency_id = await db_data_creator.agency() + for i in range(count): + await db_data_creator.agency_user_suggestions( + url_id=url_mapping.url_id, + agency_id=agency_id + ) + + relevant_metadata_ids = await db_data_creator.metadata( + url_ids=[url_mapping.url_id], + attribute=URLMetadataAttributeType.RELEVANT, + value="True", + validation_source=ValidationSource.MACHINE_LEARNING, + validation_status=ValidationStatus.PENDING_VALIDATION + ) + relevant_metadata_id = relevant_metadata_ids[0] + record_type_metadata_ids = await db_data_creator.metadata( + url_ids=[url_mapping.url_id], + attribute=URLMetadataAttributeType.RECORD_TYPE, + value=RecordType.ARREST_RECORDS.value, + validation_source=ValidationSource.MACHINE_LEARNING, + validation_status=ValidationStatus.PENDING_VALIDATION + ) + record_type_metadata_id = record_type_metadata_ids[0] + + if include_user_annotations: + await add_metadata_annotation(annotation_count, "True", relevant_metadata_id) + await add_metadata_annotation(1, "False", relevant_metadata_id) + await add_metadata_annotation(3, RecordType.ARREST_RECORDS.value, record_type_metadata_id) + await add_metadata_annotation(2, RecordType.DISPATCH_RECORDINGS.value, record_type_metadata_id) + await add_metadata_annotation(1, RecordType.ACCIDENT_REPORTS.value, record_type_metadata_id) + + if include_user_annotations: + # Add user suggestions for agencies, one suggested by 3 users, another by 2, another by 1 + for i in range(annotation_count): + await add_user_suggestion(i + 1) + + + return url_mapping diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index 38b7cafd..d25ca424 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -15,6 +15,7 @@ from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse +from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo @@ -260,4 +261,11 @@ def get_tasks( url=f"/task", params=params ) - return GetTasksResponse(**data) \ No newline at end of file + return GetTasksResponse(**data) + + async def review_next_source(self) -> GetNextURLForFinalReviewResponse: + data = self.get( + url=f"/review/next-source" + ) + return GetNextURLForFinalReviewResponse(**data) + diff --git a/tests/test_automated/integration/api/test_review.py b/tests/test_automated/integration/api/test_review.py new file mode 100644 index 00000000..a69f474a --- /dev/null +++ b/tests/test_automated/integration/api/test_review.py @@ -0,0 +1,55 @@ +import pytest + +from core.enums import RecordType +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review + + +@pytest.mark.asyncio +async def test_review_next_source(api_test_helper): + ath = api_test_helper + + url_mapping = await setup_for_get_next_url_for_final_review( + db_data_creator=ath.db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + + await ath.db_data_creator.agency_auto_suggestions( + url_id=url_mapping.url_id, + count=3 + ) + + result = await ath.request_validator.review_next_source() + + assert result.url == url_mapping.url + html_info = result.html_info + assert html_info.description == "test description" + assert html_info.title == "test html content" + + annotation_info = result.annotations + relevant_info = annotation_info.relevant + assert relevant_info.auto == True + assert relevant_info.users.relevant == 3 + assert relevant_info.users.not_relevant == 1 + + record_type_info = annotation_info.record_type + assert record_type_info.auto == RecordType.ARREST_RECORDS + user_d = record_type_info.users + assert user_d[RecordType.ARREST_RECORDS] == 3 + assert user_d[RecordType.DISPATCH_RECORDINGS] == 2 + assert user_d[RecordType.ACCIDENT_REPORTS] == 1 + assert list(user_d.keys()) == [RecordType.ARREST_RECORDS, RecordType.DISPATCH_RECORDINGS, RecordType.ACCIDENT_REPORTS] + + + agency_info = annotation_info.agency + auto_agency_suggestions = agency_info.auto + assert auto_agency_suggestions.unknown == False + assert len(auto_agency_suggestions.suggestions) == 3 + + # Check user agency suggestions exist and in descending order of count + user_agency_suggestions = agency_info.users + user_agency_suggestions_as_list = list(user_agency_suggestions.values()) + assert len(user_agency_suggestions_as_list) == 3 + for i in range(3): + assert user_agency_suggestions_as_list[i].count == 3 - i + diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 9444bc79..20b5c194 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -12,6 +12,7 @@ from collector_manager.enums import URLStatus from core.enums import BatchStatus, RecordType, SuggestionType from tests.helpers.DBDataCreator import DBDataCreator +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review def test_insert_urls(db_client_test): @@ -194,62 +195,6 @@ async def test_get_urls_with_metadata(db_data_creator: DBDataCreator): ) assert len(results) == 1 -async def setup_for_get_next_url_for_final_review( - db_data_creator: DBDataCreator, - annotation_count: int, - include_user_annotations: bool = True -): - batch_id = db_data_creator.batch() - url_mapping = db_data_creator.urls(batch_id=batch_id, url_count=1).url_mappings[0] - await db_data_creator.html_data([url_mapping.url_id]) - - async def add_metadata_annotation(count: int, value: str, metadata_id: int): - for i in range(count): - await db_data_creator.user_annotation( - metadata_id=metadata_id, - annotation=value - ) - - async def add_user_suggestion(count: int): - agency_id = await db_data_creator.agency() - for i in range(count): - await db_data_creator.agency_user_suggestions( - url_id=url_mapping.url_id, - agency_id=agency_id - ) - - relevant_metadata_ids = await db_data_creator.metadata( - url_ids=[url_mapping.url_id], - attribute=URLMetadataAttributeType.RELEVANT, - value="True", - validation_source=ValidationSource.MACHINE_LEARNING, - validation_status=ValidationStatus.PENDING_VALIDATION - ) - relevant_metadata_id = relevant_metadata_ids[0] - record_type_metadata_ids = await db_data_creator.metadata( - url_ids=[url_mapping.url_id], - attribute=URLMetadataAttributeType.RECORD_TYPE, - value=RecordType.ARREST_RECORDS.value, - validation_source=ValidationSource.MACHINE_LEARNING, - validation_status=ValidationStatus.PENDING_VALIDATION - ) - record_type_metadata_id = record_type_metadata_ids[0] - - if include_user_annotations: - await add_metadata_annotation(annotation_count, "True", relevant_metadata_id) - await add_metadata_annotation(1, "False", relevant_metadata_id) - await add_metadata_annotation(3, RecordType.ARREST_RECORDS.value, record_type_metadata_id) - await add_metadata_annotation(2, RecordType.DISPATCH_RECORDINGS.value, record_type_metadata_id) - await add_metadata_annotation(1, RecordType.ACCIDENT_REPORTS.value, record_type_metadata_id) - - if include_user_annotations: - # Add user suggestions for agencies, one suggested by 3 users, another by 2, another by 1 - for i in range(annotation_count): - await add_user_suggestion(i + 1) - - - return url_mapping - @pytest.mark.asyncio async def test_get_next_url_for_final_review_basic(db_data_creator: DBDataCreator): @@ -367,7 +312,6 @@ async def test_get_next_url_for_final_review_favor_more_annotations(db_data_crea assert result.annotations.agency.confirmed is not None - # TODO: Check that the the confirmed agency is shown for the result @@ -400,10 +344,20 @@ async def test_get_next_url_for_final_review_no_annotations(db_data_creator: DBD assert relevant.users.relevant == 0 assert relevant.users.not_relevant == 0 - +@pytest.mark.asyncio async def test_get_next_url_for_final_review_only_confirmed_urls(db_data_creator: DBDataCreator): """ - Test in the case of one URL that is confirmed + Test in the case of one URL that is submitted Should not be returned. """ - batch_id = db_data_creator.batch() \ No newline at end of file + batch_id = db_data_creator.batch() + url_mapping = db_data_creator.urls( + batch_id=batch_id, + url_count=1, + outcome=URLStatus.SUBMITTED + ).url_mappings[0] + + result = await db_data_creator.adb_client.get_next_url_for_final_review() + + assert result is None + From c833c2d093a6747e552547e63f61cf2c784666b4 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 21 Feb 2025 13:58:23 -0500 Subject: [PATCH 054/244] DRAFT --- ...cd_add_approved_enum_value_to_urlstatus.py | 70 +++++++++++ collector_db/AsyncDatabaseClient.py | 112 +++++++++++++++++- collector_manager/enums.py | 1 + core/AsyncCore.py | 3 + 4 files changed, 182 insertions(+), 4 deletions(-) create mode 100644 alembic/versions/76f902fe18cd_add_approved_enum_value_to_urlstatus.py diff --git a/alembic/versions/76f902fe18cd_add_approved_enum_value_to_urlstatus.py b/alembic/versions/76f902fe18cd_add_approved_enum_value_to_urlstatus.py new file mode 100644 index 00000000..a0ff537f --- /dev/null +++ b/alembic/versions/76f902fe18cd_add_approved_enum_value_to_urlstatus.py @@ -0,0 +1,70 @@ +"""Add approved enum value to URLStatus + +Revision ID: 76f902fe18cd +Revises: d7eb670edaf0 +Create Date: 2025-02-21 13:46:00.621485 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '76f902fe18cd' +down_revision: Union[str, None] = 'd7eb670edaf0' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +old_enum_values = ('pending', 'submitted', 'human_labeling', 'rejected', 'duplicate', 'error') +new_enum_values = old_enum_values + ('approved',) + +old_outcome_enum = postgresql.ENUM( + *old_enum_values, name='url_status') + +tmp_new_outcome_enum = postgresql.ENUM( + *new_enum_values, + name='tmp_url_status' +) +new_outcome_enum = postgresql.ENUM( + *new_enum_values, + name='url_status' +) + +common_args = { + "table_name": "urls", + "column_name": "outcome", +} + +def upgrade() -> None: + op.alter_column( + **common_args, + existing_type=old_outcome_enum, + type_=tmp_new_outcome_enum + ) + old_outcome_enum.drop(op.get_bind(), checkfirst=True) + new_outcome_enum.create(op.get_bind()) + + op.alter_column( + **common_args, + existing_type=tmp_new_outcome_enum, + type_=new_outcome_enum + ) + tmp_new_outcome_enum.drop(op.get_bind(), checkfirst=True) + +def downgrade() -> None: + op.alter_column( + **common_args, + existing_type=new_outcome_enum, + type_=old_outcome_enum + ) + + new_outcome_enum.drop(op.get_bind(), checkfirst=True) + old_outcome_enum.create(op.get_bind()) + + op.alter_column( + **common_args, + existing_type=old_outcome_enum, + type_=new_outcome_enum + ) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index f6548dfa..896d18cf 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -1,7 +1,8 @@ from functools import wraps -from typing import Optional +from typing import Optional, List -from sqlalchemy import select, exists, func, distinct, case, desc, asc +from fastapi import HTTPException +from sqlalchemy import select, exists, func, distinct, case, desc, asc, Select from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import selectinload, aliased, joinedload @@ -20,7 +21,7 @@ from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import URLMetadata, URL, URLErrorInfo, URLHTMLContent, Base, MetadataAnnotation, \ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, ConfirmedUrlAgency, AutomatedUrlAgencySuggestion, \ - UserUrlAgencySuggestion + UserUrlAgencySuggestion, status from collector_manager.enums import URLStatus, CollectorType from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ GetNextURLForAgencyAgencyInfo, GetNextURLForAgencyAnnotationInnerResponse, URLAgencyAnnotationPostInfo @@ -32,7 +33,7 @@ from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO -from core.enums import BatchStatus, SuggestionType +from core.enums import BatchStatus, SuggestionType, RecordType from html_tag_collector.DataClassTags import convert_to_response_html_info @@ -963,3 +964,106 @@ async def get_next_url_for_final_review( ) ) + @session_manager + async def approve_url( + self, + session: AsyncSession, + url_id: int, + record_type: Optional[RecordType], + relevant: Optional[bool], + agency_id: Optional[int] + ) -> None: + + async def set_approved_metadata( + attribute: URLMetadataAttributeType, + value: Optional[str] + ): + selected_metadata = None + for metadata in metadatas: + if metadata.attribute == attribute.value: + selected_metadata = metadata + break + + # If metadata doesn't exist, create it + if selected_metadata is None: + # If a value was not provided for this metadata, raise an error. + if value is None: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"Must specify {attribute.value} value if URL does not already have a {attribute.value} metadata entry" + ) + + metadata_obj = URLMetadata( + attribute=attribute.value, + value=value, + validation_status=ValidationStatus.VALIDATED.value, + validation_source=ValidationSource.MANUAL.value, + url_id=url_id + ) + url.url_metadata.append(metadata_obj) + + else: + + # If value was provided, overwrite existing value. Otherwise, ignore + if value is not None: + selected_metadata.value = value + + # Mark metadata as validated + selected_metadata.validation_status = ValidationStatus.VALIDATED.value + selected_metadata.validation_source = ValidationSource.MANUAL.value + + + + # Get URL + + query = ( + Select(URL) + .where(URL.id == url_id) + .options( + selectinload(URL.url_metadata), + selectinload(URL.confirmed_agencies) + ) + ) + + url = await session.execute(query) + url = url.scalars().first() + + metadatas = url.url_metadata + + await set_approved_metadata( + attribute=URLMetadataAttributeType.RECORD_TYPE, + value=record_type + ) + + await set_approved_metadata( + attribute=URLMetadataAttributeType.RELEVANT, + value=relevant + ) + + # Check if agency_id exists as confirmed agency + confirmed_agency = url.confirmed_agencies + # If it doesn't, create it + if confirmed_agency is None: + confirmed_agency = ConfirmedUrlAgency( + agency_id=agency_id, + url_id=url_id + ) + url.confirmed_agencies.append(confirmed_agency) + + # If a different agency exists as confirmed, overwrite it + elif confirmed_agency.agency_id != agency_id: + confirmed_agency.agency_id = agency_id + + # If it does, do nothing + + url.outcome = URLStatus.APPROVED + + + + + # Confirm that URL has + # - a confirmed agency + # - a validated record_type + # - a validated relevant + + diff --git a/collector_manager/enums.py b/collector_manager/enums.py index 3820f274..b4289488 100644 --- a/collector_manager/enums.py +++ b/collector_manager/enums.py @@ -16,3 +16,4 @@ class URLStatus(Enum): REJECTED = "rejected" DUPLICATE = "duplicate" ERROR = "error" + APPROVED = "approved" diff --git a/core/AsyncCore.py b/core/AsyncCore.py index d2085540..4ca4129c 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -223,3 +223,6 @@ async def submit_url_agency_annotation( async def get_next_source_for_review(self): return await self.adb_client.get_next_url_for_final_review() + + async def approve_and_get_next_source_for_review( + self, url_id: int): From 953206fcd3d9bed2250b112d9938738aa1fb275d Mon Sep 17 00:00:00 2001 From: maxachis Date: Sat, 22 Feb 2025 15:11:09 -0500 Subject: [PATCH 055/244] DRAFT --- ...cd_add_approved_enum_value_to_urlstatus.py | 26 +++++++++++++------ collector_db/AsyncDatabaseClient.py | 14 ++-------- collector_db/models.py | 10 ++++++- core/AsyncCore.py | 12 ++++++++- core/DTOs/FinalReviewApprovalInfo.py | 26 +++++++++++++++++++ .../collector_db/test_db_client.py | 18 +++++++++++++ 6 files changed, 84 insertions(+), 22 deletions(-) create mode 100644 core/DTOs/FinalReviewApprovalInfo.py diff --git a/alembic/versions/76f902fe18cd_add_approved_enum_value_to_urlstatus.py b/alembic/versions/76f902fe18cd_add_approved_enum_value_to_urlstatus.py index a0ff537f..b548cc54 100644 --- a/alembic/versions/76f902fe18cd_add_approved_enum_value_to_urlstatus.py +++ b/alembic/versions/76f902fe18cd_add_approved_enum_value_to_urlstatus.py @@ -21,7 +21,9 @@ new_enum_values = old_enum_values + ('approved',) old_outcome_enum = postgresql.ENUM( - *old_enum_values, name='url_status') + *old_enum_values, + name='url_status' +) tmp_new_outcome_enum = postgresql.ENUM( *new_enum_values, @@ -38,33 +40,41 @@ } def upgrade() -> None: + tmp_new_outcome_enum.create(op.get_bind(), checkfirst=True) op.alter_column( **common_args, existing_type=old_outcome_enum, - type_=tmp_new_outcome_enum + type_=tmp_new_outcome_enum, + postgresql_using='outcome::text::tmp_url_status' ) old_outcome_enum.drop(op.get_bind(), checkfirst=True) - new_outcome_enum.create(op.get_bind()) + new_outcome_enum.create(op.get_bind(), checkfirst=True) op.alter_column( **common_args, existing_type=tmp_new_outcome_enum, - type_=new_outcome_enum + type_=new_outcome_enum, + postgresql_using='outcome::text::url_status' ) tmp_new_outcome_enum.drop(op.get_bind(), checkfirst=True) def downgrade() -> None: + tmp_new_outcome_enum.create(op.get_bind()) op.alter_column( **common_args, existing_type=new_outcome_enum, - type_=old_outcome_enum + type_=tmp_new_outcome_enum, + postgresql_using='outcome::text::tmp_url_status' ) new_outcome_enum.drop(op.get_bind(), checkfirst=True) - old_outcome_enum.create(op.get_bind()) + old_outcome_enum.create(op.get_bind(), checkfirst=True) op.alter_column( **common_args, - existing_type=old_outcome_enum, - type_=new_outcome_enum + existing_type=tmp_new_outcome_enum, + type_=old_outcome_enum, + postgresql_using='outcome::text::url_status' ) + + tmp_new_outcome_enum.drop(op.get_bind(), checkfirst=True) \ No newline at end of file diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 896d18cf..fbf22f7c 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -5,6 +5,7 @@ from sqlalchemy import select, exists, func, distinct, case, desc, asc, Select from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import selectinload, aliased, joinedload +from starlette import status from collector_db.ConfigManager import ConfigManager from collector_db.DTOConverter import DTOConverter @@ -21,7 +22,7 @@ from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import URLMetadata, URL, URLErrorInfo, URLHTMLContent, Base, MetadataAnnotation, \ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, ConfirmedUrlAgency, AutomatedUrlAgencySuggestion, \ - UserUrlAgencySuggestion, status + UserUrlAgencySuggestion from collector_manager.enums import URLStatus, CollectorType from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ GetNextURLForAgencyAgencyInfo, GetNextURLForAgencyAnnotationInnerResponse, URLAgencyAnnotationPostInfo @@ -1012,8 +1013,6 @@ async def set_approved_metadata( selected_metadata.validation_status = ValidationStatus.VALIDATED.value selected_metadata.validation_source = ValidationSource.MANUAL.value - - # Get URL query = ( @@ -1058,12 +1057,3 @@ async def set_approved_metadata( url.outcome = URLStatus.APPROVED - - - - # Confirm that URL has - # - a confirmed agency - # - a validated record_type - # - a validated relevant - - diff --git a/collector_db/models.py b/collector_db/models.py index f462198c..338d83ce 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -80,7 +80,15 @@ class URL(Base): collector_metadata = Column(JSON) # The outcome of the URL: submitted, human_labeling, rejected, duplicate, etc. outcome = Column( - postgresql.ENUM('pending', 'submitted', 'human_labeling', 'rejected', 'duplicate', 'error', name='url_status'), + postgresql.ENUM( + 'pending', + 'submitted', + 'human_labeling', + 'rejected', + 'duplicate', + 'error', + name='url_status' + ), nullable=False ) created_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 4ca4129c..4e6794d8 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -7,6 +7,7 @@ from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.DTOs.URLAnnotationInfo import URLAnnotationInfo from collector_db.enums import TaskType, URLMetadataAttributeType +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse @@ -225,4 +226,13 @@ async def get_next_source_for_review(self): return await self.adb_client.get_next_url_for_final_review() async def approve_and_get_next_source_for_review( - self, url_id: int): + self, + approval_info: FinalReviewApprovalInfo + ): + await self.adb_client.approve_url( + url_id=approval_info.url_id, + is_approved=approval_info.is_approved, + record_type=approval_info.record_type, + relevant=approval_info.relevant + ) + return await self.get_next_source_for_review() diff --git a/core/DTOs/FinalReviewApprovalInfo.py b/core/DTOs/FinalReviewApprovalInfo.py new file mode 100644 index 00000000..96af2f87 --- /dev/null +++ b/core/DTOs/FinalReviewApprovalInfo.py @@ -0,0 +1,26 @@ +from typing import Optional + +from pydantic import BaseModel, Field + +from core.enums import RecordType + + +class FinalReviewApprovalInfo(BaseModel): + url_id: int = Field( + title="The id of the URL." + ) + record_type: Optional[RecordType] = Field( + title="The final record type of the URL." + "If none, defers to the existing value from the auto-labeler only if it exists.", + default=None + ) + relevant: Optional[bool] = Field( + title="Final determination on whether the URL is relevant." + "If none, defers to the existing value from the auto-labeler only if it exists.", + default=None + ) + agency_id: Optional[int] = Field( + title="The final confirmed agency for the URL. " + "If none, defers to an existing confirmed agency only if that exists.", + default=None + ) diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 20b5c194..833e157a 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -361,3 +361,21 @@ async def test_get_next_url_for_final_review_only_confirmed_urls(db_data_creator assert result is None +@pytest.mark.asyncio +async def test_approve_url_basic(db_data_creator: DBDataCreator): + url_mapping = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + + # Add confirmed agency + await db_data_creator.agency_confirmed_suggestion( + url_id=url_mapping.url_id + ) + + # Approve URL. Only URL should be affected. No other properties should be changed. + await db_data_creator.adb_client.approve_url(url_mapping.url_id) + + + From b550fe5650a5466cb193d6e012ed0f8cedfc0308 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sun, 23 Feb 2025 21:40:08 -0500 Subject: [PATCH 056/244] DRAFT - Begin Overhaul --- alembic.ini | 2 +- ...6ce_update_confirmed_url_agency_unique_.py | 44 ++++ ...0590bb_overhaul_annotation_organization.py | 225 ++++++++++++++++ api/routes/annotate.py | 19 +- collector_db/AsyncDatabaseClient.py | 171 ++++++++++-- collector_db/DTOConverter.py | 243 +++++++++-------- collector_db/StatementComposer.py | 22 +- collector_db/models.py | 244 ++++++++++++------ core/AsyncCore.py | 19 +- tests/helpers/DBDataCreator.py | 16 +- tests/helpers/complex_test_data_functions.py | 6 + .../integration/api/test_annotate.py | 36 +++ .../collector_db/test_db_client.py | 44 +++- 13 files changed, 858 insertions(+), 233 deletions(-) create mode 100644 alembic/versions/2025_02_23_0855-0c6dc00806ce_update_confirmed_url_agency_unique_.py create mode 100644 alembic/versions/2025_02_23_1023-33421c0590bb_overhaul_annotation_organization.py diff --git a/alembic.ini b/alembic.ini index 9daecaa2..cfa2db9a 100644 --- a/alembic.ini +++ b/alembic.ini @@ -9,7 +9,7 @@ script_location = alembic # Uncomment the line below if you want the files to be prepended with date and time # see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file # for all available tokens -# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s +file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s # sys.path path, will be prepended to sys.path if present. # defaults to the current working directory. diff --git a/alembic/versions/2025_02_23_0855-0c6dc00806ce_update_confirmed_url_agency_unique_.py b/alembic/versions/2025_02_23_0855-0c6dc00806ce_update_confirmed_url_agency_unique_.py new file mode 100644 index 00000000..b081ec9d --- /dev/null +++ b/alembic/versions/2025_02_23_0855-0c6dc00806ce_update_confirmed_url_agency_unique_.py @@ -0,0 +1,44 @@ +"""Update confirmed_url_agency unique constraint to be only url_id + +Revision ID: 0c6dc00806ce +Revises: 76f902fe18cd +Create Date: 2025-02-23 08:55:07.046607 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '0c6dc00806ce' +down_revision: Union[str, None] = '76f902fe18cd' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + op.drop_constraint( + constraint_name="uq_confirmed_url_agency", + table_name="confirmed_url_agency", + ) + + op.create_unique_constraint( + constraint_name="uq_confirmed_url_agency", + table_name="confirmed_url_agency", + columns=["url_id"], + ) + + +def downgrade() -> None: + op.drop_constraint( + constraint_name="uq_confirmed_url_agency", + table_name="confirmed_url_agency", + ) + + op.create_unique_constraint( + constraint_name="uq_confirmed_url_agency", + table_name="confirmed_url_agency", + columns=["url_id", "agency_id"], + ) \ No newline at end of file diff --git a/alembic/versions/2025_02_23_1023-33421c0590bb_overhaul_annotation_organization.py b/alembic/versions/2025_02_23_1023-33421c0590bb_overhaul_annotation_organization.py new file mode 100644 index 00000000..4b453174 --- /dev/null +++ b/alembic/versions/2025_02_23_1023-33421c0590bb_overhaul_annotation_organization.py @@ -0,0 +1,225 @@ +"""Overhaul annotation organization + +New Tables +- AutoRelevantSuggestions +- AutoRecordTypeSuggestions +- UserRelevantSuggestions +- UserRecordTypeSuggestions + +New Columns for `URL` +- `agency_id` +- `record_type` +- `relevant` + +Removed Tables +- `URLMetadata` +- `ConfirmedURLAgency` +- `MetadataAnnotation` + +Revision ID: 33421c0590bb +Revises: 0c6dc00806ce +Create Date: 2025-02-23 10:23:19.696248 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy import UniqueConstraint + +from core.enums import RecordType + +# revision identifiers, used by Alembic. +revision: str = '33421c0590bb' +down_revision: Union[str, None] = '0c6dc00806ce' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +record_type_values = [ + "Accident Reports", + "Arrest Records", + "Calls for Service", + "Car GPS", + "Citations", + "Dispatch Logs", + "Dispatch Recordings", + "Field Contacts", + "Incident Reports", + "Misc Police Activity", + "Officer Involved Shootings", + "Stops", + "Surveys", + "Use of Force Reports", + "Vehicle Pursuits", + "Complaints & Misconduct", + "Daily Activity Logs", + "Training & Hiring Info", + "Personnel Records", + "Annual & Monthly Reports", + "Budgets & Finances", + "Contact Info & Agency Meta", + "Geographic", + "List of Data Sources", + "Policies & Contracts", + "Crime Maps & Reports", + "Crime Statistics", + "Media Bulletins", + "Records Request Info", + "Resources", + "Sex Offender Registry", + "Wanted Persons", + "Booking Reports", + "Court Cases", + "Incarceration Records", + "Other" +] + + +record_type_enum = sa.Enum(*record_type_values, name='record_type') + +def upgrade() -> None: + # Delete the old tables + op.drop_table('metadata_annotations') + op.drop_table('url_metadata') + op.drop_table('confirmed_url_agency') + + # Create the new tables + op.create_table( + 'auto_relevant_suggestions', + sa.Column('id', sa.Integer(), primary_key=True), + sa.Column('url_id', sa.Integer(), sa.ForeignKey('urls.id', ondelete='CASCADE'), nullable=False), + sa.Column('relevant', sa.Boolean(), nullable=False), + sa.Column('created_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()')), + sa.Column('updated_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()'), onupdate=sa.text('now()')), + UniqueConstraint( + 'url_id', + name='auto_relevant_suggestions_uq_url_id' + ) + ) + + op.create_table( + 'auto_record_type_suggestions', + sa.Column('id', sa.Integer(), primary_key=True), + sa.Column( + 'url_id', + sa.Integer(), + sa.ForeignKey('urls.id', ondelete='CASCADE'), + nullable=False + ), + sa.Column('record_type', record_type_enum, nullable=False), + sa.Column('created_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()')), + sa.Column('updated_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()'), onupdate=sa.text('now()')), + UniqueConstraint( + 'url_id', + name='auto_record_type_suggestions_uq_url_id' + ) + ) + + op.create_table( + 'user_relevant_suggestions', + sa.Column('id', sa.Integer(), primary_key=True), + sa.Column( + 'url_id', + sa.Integer(), + sa.ForeignKey('urls.id', ondelete='CASCADE'), + nullable=False + ), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('relevant', sa.Boolean(), nullable=False), + sa.Column('created_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()')), + sa.Column('updated_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()'), onupdate=sa.text('now()')), + sa.UniqueConstraint("url_id", "user_id", name="uq_user_relevant_suggestions") + ) + + op.create_table( + 'user_record_type_suggestions', + sa.Column('id', sa.Integer(), primary_key=True), + sa.Column( + 'url_id', + sa.Integer(), + sa.ForeignKey('urls.id', ondelete='CASCADE'), + nullable=False + ), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('record_type', record_type_enum, nullable=False), + sa.Column('created_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()')), + sa.Column('updated_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()'), onupdate=sa.text('now()')), + sa.UniqueConstraint("url_id", "user_id", name="uq_user_record_type_suggestions") + ) + + # Add the new columns + op.add_column( + 'urls', + sa.Column('record_type', record_type_enum, nullable=True) + ) + + op.add_column( + 'urls', + sa.Column('relevant', sa.Boolean(), nullable=True) + ) + + op.add_column( + 'urls', + sa.Column( + 'agency_id', + sa.Integer(), + sa.ForeignKey('agencies.agency_id', ondelete='NO ACTION'), + nullable=True + ) + ) + + + + +def downgrade() -> None: + # Drop the new tables + op.drop_table('auto_relevant_suggestions') + op.drop_table('auto_record_type_suggestions') + op.drop_table('user_relevant_suggestions') + op.drop_table('user_record_type_suggestions') + + # Drop the new columns + op.drop_column('urls', 'record_type') + op.drop_column('urls', 'relevant') + op.drop_column('urls', 'agency_id') + + # Create the old tables + op.create_table( + 'url_metadata', + sa.Column('id', sa.Integer(), primary_key=True), + sa.Column('url_id', sa.Integer(), sa.ForeignKey('urls.id', ondelete='CASCADE'), nullable=False), + sa.Column('attribute', sa.String(), nullable=False), + sa.Column('value', sa.String(), nullable=False), + sa.Column('created_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()')), + sa.Column('updated_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()'), onupdate=sa.text('now()')), + sa.UniqueConstraint( + "url_id", + "attribute", + name="uq_url_id_attribute"), + ) + + op.create_table( + 'confirmed_url_agency', + sa.Column('id', sa.Integer(), primary_key=True), + sa.Column('url_id', sa.Integer(), sa.ForeignKey('urls.id', ondelete='CASCADE'), nullable=False), + sa.Column( + 'agency_id', + sa.Integer(), + sa.ForeignKey('agencies.agency_id', ondelete='CASCADE'), nullable=False), + sa.Column('created_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()')), + sa.Column('updated_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()'), onupdate=sa.text('now()')), + sa.UniqueConstraint("url_id", name="uq_confirmed_url_agency") + ) + + op.create_table( + 'metadata_annotations', + sa.Column('id', sa.Integer(), primary_key=True), + sa.Column('url_id', sa.Integer(), sa.ForeignKey('urls.id', ondelete='CASCADE'), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('created_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()')), + sa.Column('updated_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()'), onupdate=sa.text('now()')), + sa.UniqueConstraint( + "user_id", + "metadata_id", + name="metadata_annotations_uq_user_id_metadata_id"), + ) diff --git a/api/routes/annotate.py b/api/routes/annotate.py index 591920ff..1c33a978 100644 --- a/api/routes/annotate.py +++ b/api/routes/annotate.py @@ -29,23 +29,24 @@ async def get_next_url_for_relevance_annotation( return result -@annotate_router.post("/relevance/{metadata_id}") +@annotate_router.post("/relevance/{url_id}") async def annotate_url_for_relevance_and_get_next_url( relevance_annotation_post_info: RelevanceAnnotationPostInfo, - metadata_id: int = Path(description="The metadata id for the associated URL metadata"), + url_id: int = Path(description="The URL id to annotate"), async_core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info) ) -> GetNextURLForAnnotationResponse: """ Post URL annotation and get next URL to annotate """ - result = await async_core.submit_and_get_next_url_for_annotation( + await async_core.submit_url_relevance_annotation( + user_id=access_info.user_id, + url_id=url_id, + relevant=relevance_annotation_post_info.is_relevant + ) + return await async_core.get_next_url_for_relevance_annotation( user_id=access_info.user_id, - metadata_id=metadata_id, - annotation=str(relevance_annotation_post_info.is_relevant), - metadata_type = URLMetadataAttributeType.RELEVANT ) - return result @annotate_router.get("/record-type") async def get_next_url_for_record_type_annotation( @@ -58,10 +59,10 @@ async def get_next_url_for_record_type_annotation( ) return result -@annotate_router.post("/record-type/{metadata_id}") +@annotate_router.post("/record-type/{url_id}") async def annotate_url_for_record_type_and_get_next_url( record_type_annotation_post_info: RecordTypeAnnotationPostInfo, - metadata_id: int = Path(description="The metadata id for the associated URL metadata"), + url_id: int = Path(description="The URL id to annotate"), async_core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info) ) -> GetNextURLForAnnotationResponse: diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index fbf22f7c..3e7eee14 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -2,7 +2,7 @@ from typing import Optional, List from fastapi import HTTPException -from sqlalchemy import select, exists, func, distinct, case, desc, asc, Select +from sqlalchemy import select, exists, func, distinct, case, desc, asc, Select, not_ from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import selectinload, aliased, joinedload from starlette import status @@ -20,9 +20,10 @@ from collector_db.StatementComposer import StatementComposer from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource, TaskType from collector_db.helper_functions import get_postgres_connection_string -from collector_db.models import URLMetadata, URL, URLErrorInfo, URLHTMLContent, Base, MetadataAnnotation, \ - RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, ConfirmedUrlAgency, AutomatedUrlAgencySuggestion, \ - UserUrlAgencySuggestion +from collector_db.models import URL, URLErrorInfo, URLHTMLContent, Base, \ + RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ + UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ + UserRecordTypeSuggestion from collector_manager.enums import URLStatus, CollectorType from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ GetNextURLForAgencyAgencyInfo, GetNextURLForAgencyAnnotationInnerResponse, URLAgencyAnnotationPostInfo @@ -92,6 +93,124 @@ async def get_url_metadata_by_status( model_result = scalar_result.all() return [URLMetadataInfo(**url_metadata.__dict__) for url_metadata in model_result] + # region relevant + @session_manager + async def add_auto_relevant_suggestion( + self, + session: AsyncSession, + url_id: int, + relevant: bool + ): + suggestion = AutoRelevantSuggestion( + url_id=url_id, + relevant=relevant + ) + session.add(suggestion) + + @session_manager + async def add_user_relevant_suggestion( + self, + session: AsyncSession, + url_id: int, + user_id: int, + relevant: bool + ): + suggestion = UserRelevantSuggestion( + url_id=url_id, + user_id=user_id, + relevant=relevant + ) + session.add(suggestion) + + @session_manager + async def get_next_url_for_relevance_annotation( + self, + session: AsyncSession, + user_id: int + ): + url_query = ( + select( + URL, + ) + # TODO: Generalize this whole section + .where(exists(select(URLHTMLContent).where(URLHTMLContent.url_id == URL.id))) + # URL must not have metadata annotation by this user + # TODO: Have this as a parameter for the user model + .where( + not_( + exists( + select(UserRelevantSuggestion) + .where( + UserRelevantSuggestion.url_id == URL.id, + UserRelevantSuggestion.user_id == user_id + ) + ) + ) + # TODO: Parameterize relationship attribute to joinedload + ).options( + joinedload(URL.auto_relevant_suggestions), + joinedload(URL.html_content) + ). + limit(1) + ) + + raw_result = await session.execute(url_query) + + url: URL = raw_result.scalars().one_or_none() + if url is None: + return None + + # Next, get all HTML content for the URL + html_response_info = DTOConverter.html_content_list_to_html_response_info( + url.html_content + ) + + # Get auto-suggestion if exists + if len(url.auto_relevant_suggestions) > 0: + auto_suggestion = url.auto_relevant_suggestions[0].relevant + else: + auto_suggestion = None + + return RelevanceAnnotationResponseInfo( + url_id=url.id, + suggested_relevant=auto_suggestion, + html_response_info=html_response_info + ) + + + + #endregion relevant + + @session_manager + async def add_auto_record_type_suggestion( + self, + session: AsyncSession, + url_id: int, + record_type: RecordType + ): + suggestion = AutoRecordTypeSuggestion( + url_id=url_id, + record_type=record_type.value + ) + session.add(suggestion) + + + @session_manager + async def add_user_record_type_suggestion( + self, + session: AsyncSession, + url_id: int, + user_id: int, + record_type: RecordType + ): + suggestion = UserRecordTypeSuggestion( + url_id=url_id, + user_id=user_id, + record_type=record_type.value + ) + session.add(suggestion) + + @session_manager async def add_url_metadata(self, session: AsyncSession, url_metadata_info: URLMetadataInfo) -> int: result = await self._add_models(session, URLMetadata, [url_metadata_info]) @@ -281,9 +400,6 @@ async def get_next_url_for_annotation( .limit(1) ) - raw_result = await session.execute(subquery) - result = raw_result.all() - # Next, get all HTML content for the URL statement = ( @@ -334,17 +450,17 @@ async def add_metadata_annotation( ) session.add(annotation) - @session_manager - async def get_annotations_for_metadata_id( - self, - session: AsyncSession, - metadata_id: int - ) -> list[MetadataAnnotation]: - statement = (select(MetadataAnnotation). - where(MetadataAnnotation.metadata_id == metadata_id)) - scalar_result = await session.scalars(statement) - all_results = scalar_result.all() - return [MetadataAnnotationInfo(**result.__dict__) for result in all_results] + # @session_manager + # async def get_annotations_for_metadata_id( + # self, + # session: AsyncSession, + # metadata_id: int + # ) -> list[MetadataAnnotation]: + # statement = (select(MetadataAnnotation). + # where(MetadataAnnotation.metadata_id == metadata_id)) + # scalar_result = await session.scalars(statement) + # all_results = scalar_result.all() + # return [MetadataAnnotationInfo(**result.__dict__) for result in all_results] @session_manager async def get_all(self, session, model: Base): @@ -970,9 +1086,9 @@ async def approve_url( self, session: AsyncSession, url_id: int, - record_type: Optional[RecordType], - relevant: Optional[bool], - agency_id: Optional[int] + record_type: Optional[RecordType] = None, + relevant: Optional[bool] = None, + agency_id: Optional[int] = None ) -> None: async def set_approved_metadata( @@ -1040,9 +1156,16 @@ async def set_approved_metadata( ) # Check if agency_id exists as confirmed agency - confirmed_agency = url.confirmed_agencies + confirmed_agency = url.confirmed_agencies[0] if len(url.confirmed_agencies) > 0 else None + # If it doesn't, create it if confirmed_agency is None: + if agency_id is None: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="Must specify agency_id if URL does not already have a confirmed agency" + ) + confirmed_agency = ConfirmedUrlAgency( agency_id=agency_id, url_id=url_id @@ -1050,10 +1173,10 @@ async def set_approved_metadata( url.confirmed_agencies.append(confirmed_agency) # If a different agency exists as confirmed, overwrite it - elif confirmed_agency.agency_id != agency_id: + elif confirmed_agency.agency_id != agency_id and agency_id is not None: confirmed_agency.agency_id = agency_id # If it does, do nothing - url.outcome = URLStatus.APPROVED + url.outcome = URLStatus.APPROVED.value diff --git a/collector_db/DTOConverter.py b/collector_db/DTOConverter.py index 63c88d92..9b2b0d24 100644 --- a/collector_db/DTOConverter.py +++ b/collector_db/DTOConverter.py @@ -1,28 +1,30 @@ +from collector_db.DTOs.URLHTMLContentInfo import HTMLContentType from collector_db.enums import ValidationStatus, ValidationSource, URLMetadataAttributeType -from collector_db.models import URLMetadata, ConfirmedUrlAgency, AutomatedUrlAgencySuggestion, UserUrlAgencySuggestion, \ - MetadataAnnotation +from collector_db.models import AutomatedUrlAgencySuggestion, UserUrlAgencySuggestion, URLHTMLContent from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo from core.DTOs.GetNextURLForFinalReviewResponse import FinalReviewAnnotationRelevantInfo, \ FinalReviewAnnotationRelevantUsersInfo, FinalReviewAnnotationRecordTypeInfo, FinalReviewAnnotationAgencyAutoInfo, \ FinalReviewAnnotationAgencyInfo, FinalReviewAnnotationAgencyUserInfo from core.enums import RecordType, SuggestionType - - -def get_url_metadata( - url_metadatas: list[URLMetadata], - validation_status: ValidationStatus, - validation_source: ValidationSource, - attribute: URLMetadataAttributeType -): - for url_metadata in url_metadatas: - if url_metadata.validation_status != validation_status.value: - continue - if url_metadata.validation_source != validation_source.value: - continue - if url_metadata.attribute != attribute.value: - continue - return url_metadata - +from html_tag_collector.DataClassTags import convert_to_response_html_info, ResponseHTMLInfo, ENUM_TO_ATTRIBUTE_MAPPING + + +# +# def get_url_metadata( +# url_metadatas: list[URLMetadata], +# validation_status: ValidationStatus, +# validation_source: ValidationSource, +# attribute: URLMetadataAttributeType +# ): +# for url_metadata in url_metadatas: +# if url_metadata.validation_status != validation_status.value: +# continue +# if url_metadata.validation_source != validation_source.value: +# continue +# if url_metadata.attribute != attribute.value: +# continue +# return url_metadata +# class DTOConverter: @@ -30,67 +32,67 @@ class DTOConverter: """ Converts SQLAlchemy objects to DTOs """ - - @staticmethod - def final_review_annotation_relevant_info( - url_metadatas: list[URLMetadata] - ) -> FinalReviewAnnotationRelevantInfo: - relevant_metadata = get_url_metadata( - url_metadatas=url_metadatas, - validation_status=ValidationStatus.PENDING_VALIDATION, - validation_source=ValidationSource.MACHINE_LEARNING, - attribute=URLMetadataAttributeType.RELEVANT - ) - auto_value = relevant_metadata.value if relevant_metadata else None - if auto_value is not None: - auto_value = (auto_value == "True") - - - annotations: list[MetadataAnnotation] = relevant_metadata.annotations if relevant_metadata else [] - relevant_count = 0 - not_relevant_count = 0 - for annotation in annotations: - if annotation.value == "True": - relevant_count += 1 - else: - not_relevant_count += 1 - return FinalReviewAnnotationRelevantInfo( - auto=auto_value, - users=FinalReviewAnnotationRelevantUsersInfo( - relevant=relevant_count, - not_relevant=not_relevant_count - ) - ) - - @staticmethod - def final_review_annotation_record_type_info( - url_metadata: list[URLMetadata] - ): - record_type_metadata = get_url_metadata( - url_metadatas=url_metadata, - validation_status=ValidationStatus.PENDING_VALIDATION, - validation_source=ValidationSource.MACHINE_LEARNING, - attribute=URLMetadataAttributeType.RECORD_TYPE - ) - user_count = {} - if record_type_metadata is None: - auto_value = None - annotations = [] - else: - auto_value = RecordType(record_type_metadata.value) - annotations = record_type_metadata.annotations - for annotation in annotations: - value = RecordType(annotation.value) - if value not in user_count: - user_count[value] = 0 - user_count[value] += 1 - # Sort users by count, descending - user_count = dict(sorted(user_count.items(), key=lambda x: x[1], reverse=True)) - - return FinalReviewAnnotationRecordTypeInfo( - auto=auto_value, - users=user_count - ) + # + # @staticmethod + # def final_review_annotation_relevant_info( + # url_metadatas: list[URLMetadata] + # ) -> FinalReviewAnnotationRelevantInfo: + # relevant_metadata = get_url_metadata( + # url_metadatas=url_metadatas, + # validation_status=ValidationStatus.PENDING_VALIDATION, + # validation_source=ValidationSource.MACHINE_LEARNING, + # attribute=URLMetadataAttributeType.RELEVANT + # ) + # auto_value = relevant_metadata.value if relevant_metadata else None + # if auto_value is not None: + # auto_value = (auto_value == "True") + # + # + # annotations: list[MetadataAnnotation] = relevant_metadata.annotations if relevant_metadata else [] + # relevant_count = 0 + # not_relevant_count = 0 + # for annotation in annotations: + # if annotation.value == "True": + # relevant_count += 1 + # else: + # not_relevant_count += 1 + # return FinalReviewAnnotationRelevantInfo( + # auto=auto_value, + # users=FinalReviewAnnotationRelevantUsersInfo( + # relevant=relevant_count, + # not_relevant=not_relevant_count + # ) + # ) + # + # @staticmethod + # def final_review_annotation_record_type_info( + # url_metadata: list[URLMetadata] + # ): + # record_type_metadata = get_url_metadata( + # url_metadatas=url_metadata, + # validation_status=ValidationStatus.PENDING_VALIDATION, + # validation_source=ValidationSource.MACHINE_LEARNING, + # attribute=URLMetadataAttributeType.RECORD_TYPE + # ) + # user_count = {} + # if record_type_metadata is None: + # auto_value = None + # annotations = [] + # else: + # auto_value = RecordType(record_type_metadata.value) + # annotations = record_type_metadata.annotations + # for annotation in annotations: + # value = RecordType(annotation.value) + # if value not in user_count: + # user_count[value] = 0 + # user_count[value] += 1 + # # Sort users by count, descending + # user_count = dict(sorted(user_count.items(), key=lambda x: x[1], reverse=True)) + # + # return FinalReviewAnnotationRecordTypeInfo( + # auto=auto_value, + # users=user_count + # ) @staticmethod def final_review_annotation_agency_auto_info( @@ -158,41 +160,60 @@ def user_url_agency_suggestion_to_final_review_annotation_agency_user_info( # Return sorted return dict(sorted(d.items(), key=lambda x: x[1].count, reverse=True)) + # + # @staticmethod + # def final_review_annotation_agency_info( + # automated_agency_suggestions: list[AutomatedUrlAgencySuggestion], + # confirmed_agencies: list[ConfirmedUrlAgency], + # user_agency_suggestions: list[UserUrlAgencySuggestion] + # ): + # if len(confirmed_agencies) == 1: + # confirmed_agency = confirmed_agencies[0] + # confirmed_agency_info = GetNextURLForAgencyAgencyInfo( + # suggestion_type=SuggestionType.CONFIRMED, + # pdap_agency_id=confirmed_agency.agency_id, + # agency_name=confirmed_agency.agency.name, + # state=confirmed_agency.agency.state, + # county=confirmed_agency.agency.county, + # locality=confirmed_agency.agency.locality + # ) + # return FinalReviewAnnotationAgencyInfo( + # confirmed=confirmed_agency_info, + # users=None, + # auto=None + # ) + # + # + # agency_auto_info = DTOConverter.final_review_annotation_agency_auto_info( + # automated_agency_suggestions + # ) + # + # agency_user_info = DTOConverter.user_url_agency_suggestion_to_final_review_annotation_agency_user_info( + # user_agency_suggestions + # ) + # + # return FinalReviewAnnotationAgencyInfo( + # confirmed=None, + # users=agency_user_info, + # auto=agency_auto_info + # ) + # @staticmethod - def final_review_annotation_agency_info( - automated_agency_suggestions: list[AutomatedUrlAgencySuggestion], - confirmed_agencies: list[ConfirmedUrlAgency], - user_agency_suggestions: list[UserUrlAgencySuggestion] - ): - if len(confirmed_agencies) == 1: - confirmed_agency = confirmed_agencies[0] - confirmed_agency_info = GetNextURLForAgencyAgencyInfo( - suggestion_type=SuggestionType.CONFIRMED, - pdap_agency_id=confirmed_agency.agency_id, - agency_name=confirmed_agency.agency.name, - state=confirmed_agency.agency.state, - county=confirmed_agency.agency.county, - locality=confirmed_agency.agency.locality - ) - return FinalReviewAnnotationAgencyInfo( - confirmed=confirmed_agency_info, - users=None, - auto=None - ) + def html_content_list_to_html_response_info(html_content_list: list[URLHTMLContent]): + response_html_info = ResponseHTMLInfo() + for html_content in html_content_list: + content_type = HTMLContentType(html_content.content_type) + content = html_content.content - agency_auto_info = DTOConverter.final_review_annotation_agency_auto_info( - automated_agency_suggestions - ) + setattr( + response_html_info, + ENUM_TO_ATTRIBUTE_MAPPING[content_type], + content + ) - agency_user_info = DTOConverter.user_url_agency_suggestion_to_final_review_annotation_agency_user_info( - user_agency_suggestions - ) - return FinalReviewAnnotationAgencyInfo( - confirmed=None, - users=agency_user_info, - auto=agency_auto_info - ) + return response_html_info + diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index fd1b11a9..6b6ab677 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -3,8 +3,7 @@ from sqlalchemy.orm import aliased from collector_db.enums import URLMetadataAttributeType, ValidationStatus -from collector_db.models import URL, URLHTMLContent, URLMetadata, MetadataAnnotation, AutomatedUrlAgencySuggestion, \ - ConfirmedUrlAgency +from collector_db.models import URL, URLHTMLContent, AutomatedUrlAgencySuggestion from collector_manager.enums import URLStatus @@ -72,4 +71,21 @@ def exclude_urls_with_agency_suggestions( .where(~exists().where(ConfirmedAgency.url_id == URL.id)) ) # Exclude if confirmed agencies exist - return statement \ No newline at end of file + return statement + + @staticmethod + def get_all_html_content_for_url(subquery) -> Select: + statement = ( + select( + subquery.c.url, + subquery.c.metadata_id, + subquery.c.value, + URLHTMLContent.content_type, + URLHTMLContent.content, + ) + .join(URLHTMLContent) + .where(subquery.c.url_id == URLHTMLContent.url_id) + ) + + raw_result = await session.execute(statement) + result = raw_result.all() \ No newline at end of file diff --git a/collector_db/models.py b/collector_db/models.py index 338d83ce..8e3d2a7d 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -7,7 +7,7 @@ from sqlalchemy.orm import declarative_base, relationship from collector_db.enums import PGEnum -from core.enums import BatchStatus +from core.enums import BatchStatus, RecordType from util.helper_functions import get_enum_values # Base class for SQLAlchemy ORM models @@ -19,6 +19,15 @@ batch_status_enum = PGEnum('complete', 'error', 'in-process', 'aborted', name='batch_status') +record_type_values = get_enum_values(RecordType) + +def get_created_at_column(): + return Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) + +def get_updated_at_column(): + return Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT, onupdate=CURRENT_TIME_SERVER_DEFAULT) + + class Batch(Base): __tablename__ = 'batches' @@ -91,13 +100,15 @@ class URL(Base): ), nullable=False ) - created_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) - updated_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) + agency_id = Column(Integer, ForeignKey('agencies.agency_id', name='fk_url_agency_id')) + record_type = Column(postgresql.ENUM(*record_type_values, name='record_type'), nullable=True) + relevant = Column(Boolean, nullable=True) + created_at = get_created_at_column() + updated_at = get_updated_at_column() # Relationships batch = relationship("Batch", back_populates="urls") duplicates = relationship("Duplicate", back_populates="original_url") - url_metadata = relationship("URLMetadata", back_populates="url", cascade="all, delete-orphan") html_content = relationship("URLHTMLContent", back_populates="url", cascade="all, delete-orphan") error_info = relationship("URLErrorInfo", back_populates="url", cascade="all, delete-orphan") tasks = relationship( @@ -105,60 +116,63 @@ class URL(Base): secondary="link_task_urls", back_populates="urls", ) + agency = relationship("Agency", back_populates="urls") automated_agency_suggestions = relationship("AutomatedUrlAgencySuggestion", back_populates="url") user_agency_suggestions = relationship("UserUrlAgencySuggestion", back_populates="url") - confirmed_agencies = relationship("ConfirmedUrlAgency", back_populates="url") - - -# URL Metadata table definition -class URLMetadata(Base): - __tablename__ = 'url_metadata' - __table_args__ = (UniqueConstraint( - "url_id", - "attribute", - name="uq_url_id_attribute"), - ) - - id = Column(Integer, primary_key=True, autoincrement=True) - url_id = Column(Integer, ForeignKey('urls.id', name='url_metadata_url_id_fkey'), nullable=False) - attribute = Column( - PGEnum('Record Type', 'Agency', 'Relevant', name='url_attribute'), - nullable=False) - value = Column(Text, nullable=False) - validation_status = Column( - PGEnum('Pending Validation', 'Validated', name='metadata_validation_status'), - nullable=False) - validation_source = Column( - PGEnum('Machine Learning', 'Label Studio', 'Manual', name='validation_source'), - nullable=False - ) - notes = Column(Text, nullable=True) - - - # Timestamps - created_at = Column(TIMESTAMP, nullable=False, server_default=func.now()) - updated_at = Column(TIMESTAMP, nullable=False, server_default=func.now(), onupdate=func.now()) - - # Relationships - url = relationship("URL", back_populates="url_metadata") - annotations = relationship("MetadataAnnotation", back_populates="url_metadata") - -class MetadataAnnotation(Base): - __tablename__ = 'metadata_annotations' - __table_args__ = (UniqueConstraint( - "user_id", - "metadata_id", - name="metadata_annotations_uq_user_id_metadata_id"), - ) - - id = Column(Integer, primary_key=True, autoincrement=True) - user_id = Column(Integer, nullable=False) - metadata_id = Column(Integer, ForeignKey('url_metadata.id'), nullable=False) - value = Column(Text, nullable=False) - created_at = Column(TIMESTAMP, nullable=False, server_default=func.now()) - - # Relationships - url_metadata = relationship("URLMetadata", back_populates="annotations") + auto_record_type_suggestions = relationship("AutoRecordTypeSuggestion", back_populates="url") + user_record_type_suggestions = relationship("UserRecordTypeSuggestion", back_populates="url") + auto_relevant_suggestions = relationship("AutoRelevantSuggestion", back_populates="url") + user_relevant_suggestions = relationship("UserRelevantSuggestion", back_populates="url") + +# # URL Metadata table definition +# class URLMetadata(Base): +# __tablename__ = 'url_metadata' +# __table_args__ = (UniqueConstraint( +# "url_id", +# "attribute", +# name="uq_url_id_attribute"), +# ) +# +# id = Column(Integer, primary_key=True, autoincrement=True) +# url_id = Column(Integer, ForeignKey('urls.id', name='url_metadata_url_id_fkey'), nullable=False) +# attribute = Column( +# PGEnum('Record Type', 'Agency', 'Relevant', name='url_attribute'), +# nullable=False) +# value = Column(Text, nullable=False) +# validation_status = Column( +# PGEnum('Pending Validation', 'Validated', name='metadata_validation_status'), +# nullable=False) +# validation_source = Column( +# PGEnum('Machine Learning', 'Label Studio', 'Manual', name='validation_source'), +# nullable=False +# ) +# notes = Column(Text, nullable=True) +# +# +# # Timestamps +# created_at = Column(TIMESTAMP, nullable=False, server_default=func.now()) +# updated_at = Column(TIMESTAMP, nullable=False, server_default=func.now(), onupdate=func.now()) +# +# # Relationships +# url = relationship("URL", back_populates="url_metadata") +# annotations = relationship("MetadataAnnotation", back_populates="url_metadata") + +# class MetadataAnnotation(Base): +# __tablename__ = 'metadata_annotations' +# __table_args__ = (UniqueConstraint( +# "user_id", +# "metadata_id", +# name="metadata_annotations_uq_user_id_metadata_id"), +# ) +# +# id = Column(Integer, primary_key=True, autoincrement=True) +# user_id = Column(Integer, nullable=False) +# metadata_id = Column(Integer, ForeignKey('url_metadata.id'), nullable=False) +# value = Column(Text, nullable=False) +# created_at = Column(TIMESTAMP, nullable=False, server_default=func.now()) +# +# # Relationships +# url_metadata = relationship("URLMetadata", back_populates="annotations") class RootURL(Base): __tablename__ = 'root_url_cache' @@ -172,7 +186,7 @@ class RootURL(Base): url = Column(String, nullable=False) page_title = Column(String, nullable=False) page_description = Column(String, nullable=True) - updated_at = Column(TIMESTAMP, nullable=False, server_default=func.now(), onupdate=func.now()) + updated_at = get_updated_at_column() class URLErrorInfo(Base): @@ -186,7 +200,7 @@ class URLErrorInfo(Base): id = Column(Integer, primary_key=True) url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) error = Column(Text, nullable=False) - updated_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) + updated_at = get_updated_at_column() task_id = Column(Integer, ForeignKey('tasks.id'), nullable=False) # Relationships @@ -208,7 +222,7 @@ class URLHTMLContent(Base): nullable=False) content = Column(Text, nullable=False) - updated_at = Column(TIMESTAMP, nullable=False, server_default=func.now(), onupdate=func.now()) + updated_at = get_updated_at_column() # Relationships url = relationship("URL", back_populates="html_content") @@ -245,7 +259,7 @@ class Log(Base): id = Column(Integer, primary_key=True) batch_id = Column(Integer, ForeignKey('batches.id'), nullable=False) log = Column(Text, nullable=False) - created_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) + created_at = get_created_at_column() # Relationships batch = relationship("Batch", back_populates="logs") @@ -258,7 +272,7 @@ class Missing(Base): record_type = Column(String, nullable=False) batch_id = Column(Integer, ForeignKey('batches.id')) strategy_used = Column(Text, nullable=False) - date_searched = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) + date_searched = get_created_at_column() # Relationships batch = relationship("Batch", back_populates="missings") @@ -276,7 +290,7 @@ class Task(Base): name='task_type' ), nullable=False) task_status = Column(batch_status_enum, nullable=False) - updated_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) + updated_at = get_updated_at_column() # Relationships urls = relationship( @@ -306,7 +320,7 @@ class TaskError(Base): id = Column(Integer, primary_key=True) task_id = Column(Integer, ForeignKey('tasks.id', ondelete="CASCADE"), nullable=False) error = Column(Text, nullable=False) - updated_at = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) + updated_at = get_updated_at_column() # Relationships task = relationship("Task", back_populates="error") @@ -325,27 +339,27 @@ class Agency(Base): state = Column(String, nullable=True) county = Column(String, nullable=True) locality = Column(String, nullable=True) - updated_at = Column(DateTime, nullable=False, default=func.now()) + updated_at = get_updated_at_column() # Relationships - confirmed_urls = relationship("ConfirmedUrlAgency", back_populates="agency") + urls = relationship("URL", back_populates="agency") automated_suggestions = relationship("AutomatedUrlAgencySuggestion", back_populates="agency") user_suggestions = relationship("UserUrlAgencySuggestion", back_populates="agency") -class ConfirmedUrlAgency(Base): - __tablename__ = "confirmed_url_agency" - - id = Column(Integer, primary_key=True, autoincrement=True) - agency_id = Column(Integer, ForeignKey("agencies.agency_id"), nullable=False) - url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) - - agency = relationship("Agency", back_populates="confirmed_urls") - url = relationship("URL", back_populates="confirmed_agencies") - - __table_args__ = ( - UniqueConstraint("agency_id", "url_id", name="uq_confirmed_url_agency"), - ) +# class ConfirmedUrlAgency(Base): +# __tablename__ = "confirmed_url_agency" +# +# id = Column(Integer, primary_key=True, autoincrement=True) +# agency_id = Column(Integer, ForeignKey("agencies.agency_id"), nullable=False) +# url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) +# +# agency = relationship("Agency", back_populates="confirmed_urls") +# url = relationship("URL", back_populates="confirmed_agencies") +# +# __table_args__ = ( +# UniqueConstraint("url_id", name="uq_confirmed_url_agency"), +# ) class AutomatedUrlAgencySuggestion(Base): @@ -378,4 +392,76 @@ class UserUrlAgencySuggestion(Base): __table_args__ = ( UniqueConstraint("agency_id", "url_id", "user_id", name="uq_user_url_agency_suggestions"), - ) \ No newline at end of file + ) + +class AutoRelevantSuggestion(Base): + __tablename__ = "auto_relevant_suggestions" + + id = Column(Integer, primary_key=True, autoincrement=True) + url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) + relevant = Column(Boolean, nullable=True) + created_at = get_created_at_column() + updated_at = get_updated_at_column() + + __table_args__ = ( + UniqueConstraint("url_id", name="auto_relevant_suggestions_uq_url_id"), + ) + + # Relationships + + url = relationship("URL", back_populates="auto_relevant_suggestions") + + +class AutoRecordTypeSuggestion(Base): + __tablename__ = "auto_record_type_suggestions" + + id = Column(Integer, primary_key=True, autoincrement=True) + url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) + record_type = Column(postgresql.ENUM(*record_type_values, name='record_type'), nullable=False) + created_at = get_created_at_column() + updated_at = get_updated_at_column() + + __table_args__ = ( + UniqueConstraint("url_id", name="auto_record_type_suggestions_uq_url_id"), + ) + + # Relationships + + url = relationship("URL", back_populates="auto_record_type_suggestions") + +class UserRelevantSuggestion(Base): + __tablename__ = "user_relevant_suggestions" + + id = Column(Integer, primary_key=True, autoincrement=True) + url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) + user_id = Column(Integer, nullable=False) + relevant = Column(Boolean, nullable=False) + created_at = get_created_at_column() + updated_at = get_updated_at_column() + + __table_args__ = ( + UniqueConstraint("url_id", "user_id", name="uq_user_relevant_suggestions"), + ) + + # Relationships + + url = relationship("URL", back_populates="user_relevant_suggestions") + + +class UserRecordTypeSuggestion(Base): + __tablename__ = "user_record_type_suggestions" + + id = Column(Integer, primary_key=True, autoincrement=True) + url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) + user_id = Column(Integer, nullable=False) + record_type = Column(postgresql.ENUM(*record_type_values, name='record_type'), nullable=False) + created_at = get_created_at_column() + updated_at = get_updated_at_column() + + __table_args__ = ( + UniqueConstraint("url_id", "user_id", name="uq_user_record_type_suggestions"), + ) + + # Relationships + + url = relationship("URL", back_populates="user_record_type_suggestions") \ No newline at end of file diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 4e6794d8..39c1fc46 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -174,6 +174,21 @@ async def submit_and_get_next_url_for_annotation( ) return result + async def submit_url_relevance_annotation( + self, + user_id: int, + url_id: int, + relevant: bool + ): + return await self.adb_client.add_user_relevant_suggestion( + user_id=user_id, + url_id=url_id, + relevant=relevant + ) + + async def get_next_url_for_relevance_annotation(self, user_id: int) -> GetNextURLForAnnotationResponse: + return await self.adb_client.get_next_url_for_relevance_annotation(user_id=user_id) + async def submit_url_annotation( self, user_id: int, @@ -231,8 +246,8 @@ async def approve_and_get_next_source_for_review( ): await self.adb_client.approve_url( url_id=approval_info.url_id, - is_approved=approval_info.is_approved, record_type=approval_info.record_type, - relevant=approval_info.relevant + relevant=approval_info.relevant, + agency_id=approval_info.agency_id ) return await self.get_next_source_for_review() diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 16f73602..b33051b5 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -79,6 +79,13 @@ async def agency(self) -> int: ) return agency_id + async def auto_relevant_suggestions(self, url_id: int, relevant: bool = True): + await self.adb_client.add_auto_relevant_suggestion( + url_id=url_id, + relevant=relevant + ) + + async def auto_suggestions( self, url_ids: list[int], @@ -264,16 +271,21 @@ async def agency_confirmed_suggestion( self, url_id: int ): - + """ + Creates a confirmed agency suggestion + and returns the auto-generated pdap_agency_id + """ + agency_id = await self.agency() await self.adb_client.add_confirmed_agency_url_links( suggestions=[ URLAgencySuggestionInfo( url_id=url_id, suggestion_type=SuggestionType.CONFIRMED, - pdap_agency_id=await self.agency() + pdap_agency_id=agency_id ) ] ) + return agency_id async def agency_user_suggestions( self, diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index 57f4c412..b45fb14a 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -8,6 +8,12 @@ async def setup_for_get_next_url_for_final_review( annotation_count: int, include_user_annotations: bool = True ): + """ + Sets up the database to test the final_review functions + Auto-labels the URL with 'relevant=True' and 'record_type=ARREST_RECORDS' + And applies auto-generated user annotations + """ + batch_id = db_data_creator.batch() url_mapping = db_data_creator.urls(batch_id=batch_id, url_count=1).url_mappings[0] await db_data_creator.html_data([url_mapping.url_id]) diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/test_automated/integration/api/test_annotate.py index ef3693c2..fe5d4c28 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/test_automated/integration/api/test_annotate.py @@ -90,6 +90,42 @@ async def run_annotation_test( @pytest.mark.asyncio async def test_annotate_relevancy(api_test_helper): + ath = api_test_helper + + batch_id = ath.db_data_creator.batch() + + # Create 2 URLs with outcome `pending` + iui: InsertURLsInfo = ath.db_data_creator.urls(batch_id=batch_id, url_count=2) + + url_1 = iui.url_mappings[0] + url_2 = iui.url_mappings[1] + + # Add `Relevancy` attribute with value `True` to 1st URL + await ath.db_data_creator.auto_relevant_suggestions( + url_id=url_1.url_id, + relevant=True + ) + + # Add 'Relevancy' attribute with value `False` to 2nd URL + await ath.db_data_creator.auto_relevant_suggestions( + url_id=url_2.url_id, + relevant=False + ) + + # Add HTML data to both + await ath.db_data_creator.html_data([url_1.url_id, url_2.url_id]) + # Call `GET` `/annotate/url` and receive next URL + request_info_1: GetNextURLForAnnotationResponse = api_test_helper.request_validator.get_next_relevance_annotation() + inner_info_1 = request_info_1.next_annotation + + # Validate presence of HTML data in `html` field + assert inner_info_1.html_info.description != "" + assert inner_info_1.html_info.title != "" + assert inner_info_1.suggested_value == "True" + + + + await run_annotation_test( api_test_helper=api_test_helper, submit_and_get_next_function=api_test_helper.request_validator.post_relevance_annotation_and_get_next, diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 833e157a..8d970d48 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -9,6 +9,7 @@ from collector_db.DTOs.URLInfo import URLInfo from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource +from collector_db.models import ConfirmedUrlAgency, MetadataAnnotation, URL from collector_manager.enums import URLStatus from core.enums import BatchStatus, RecordType, SuggestionType from tests.helpers.DBDataCreator import DBDataCreator @@ -370,12 +371,51 @@ async def test_approve_url_basic(db_data_creator: DBDataCreator): ) # Add confirmed agency - await db_data_creator.agency_confirmed_suggestion( + agency_id = await db_data_creator.agency_confirmed_suggestion( url_id=url_mapping.url_id ) + adb_client = db_data_creator.adb_client # Approve URL. Only URL should be affected. No other properties should be changed. - await db_data_creator.adb_client.approve_url(url_mapping.url_id) + await adb_client.approve_url(url_mapping.url_id) + # Confirm same agency id is listed as confirmed + confirmed_agencies = await adb_client.get_all( + ConfirmedUrlAgency + ) + assert len(confirmed_agencies) == 1 + confirmed_agency = confirmed_agencies[0] + assert confirmed_agency.url_id == url_mapping.url_id + assert confirmed_agency.agency_id == agency_id + + # Confirm two metadata entries + metadatas = await adb_client.get_all( + MetadataAnnotation + ) + assert len(metadatas) == 2 + record_type_metadata = None + relevant_metadata = None + for metadata in metadatas: + if metadata.attribute == URLMetadataAttributeType.RECORD_TYPE.value: + record_type_metadata = metadata + elif metadata.attribute == URLMetadataAttributeType.RELEVANT.value: + relevant_metadata = metadata + + # - One is Record Type, with record type as ARREST_RECORDS and set as approved + + assert record_type_metadata.value == RecordType.ARREST_RECORDS.value + assert record_type_metadata.validation_status == ValidationStatus.VALIDATED.value + # - One is Relevant, and is set as TRUE and approved + + assert relevant_metadata.value == "True" + assert relevant_metadata.validation_status == ValidationStatus.VALIDATED.value + + # Confirm URL + urls = await adb_client.get_all( + URL + ) + assert len(urls) == 1 + url = urls[0] + assert url.status == URLStatus.APPROVED From a3598e982d6dbd6e5729ac27a13624c212b6a06a Mon Sep 17 00:00:00 2001 From: maxachis Date: Mon, 24 Feb 2025 13:59:02 -0500 Subject: [PATCH 057/244] DRAFT --- api/routes/annotate.py | 9 +- collector_db/AsyncDatabaseClient.py | 155 ++++++++++++------ collector_db/StatementComposer.py | 2 +- core/AsyncCore.py | 28 +++- .../GetNextRelevanceAnnotationResponseInfo.py | 22 +++ core/DTOs/ResponseURLInfo.py | 6 + .../api/helpers/RequestValidator.py | 21 +-- .../integration/api/test_annotate.py | 90 ++++++++-- 8 files changed, 248 insertions(+), 85 deletions(-) create mode 100644 core/DTOs/GetNextRelevanceAnnotationResponseInfo.py create mode 100644 core/DTOs/ResponseURLInfo.py diff --git a/api/routes/annotate.py b/api/routes/annotate.py index 1c33a978..d5f2e709 100644 --- a/api/routes/annotate.py +++ b/api/routes/annotate.py @@ -3,6 +3,8 @@ from api.dependencies import get_async_core from collector_db.enums import URLMetadataAttributeType from core.AsyncCore import AsyncCore +from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo, \ + GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse @@ -21,10 +23,9 @@ async def get_next_url_for_relevance_annotation( access_info: AccessInfo = Depends(get_access_info), async_core: AsyncCore = Depends(get_async_core), -) -> GetNextURLForAnnotationResponse: - result = await async_core.get_next_url_for_annotation( +) -> GetNextRelevanceAnnotationResponseOuterInfo: + result = await async_core.get_next_url_for_relevance_annotation( user_id=access_info.user_id, - metadata_type=URLMetadataAttributeType.RELEVANT ) return result @@ -35,7 +36,7 @@ async def annotate_url_for_relevance_and_get_next_url( url_id: int = Path(description="The URL id to annotate"), async_core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info) -) -> GetNextURLForAnnotationResponse: +) -> GetNextRelevanceAnnotationResponseOuterInfo: """ Post URL annotation and get next URL to annotate """ diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 3e7eee14..3d34f024 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -2,9 +2,9 @@ from typing import Optional, List from fastapi import HTTPException -from sqlalchemy import select, exists, func, distinct, case, desc, asc, Select, not_ +from sqlalchemy import select, exists, func, distinct, case, desc, asc, Select, not_, and_ from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker -from sqlalchemy.orm import selectinload, aliased, joinedload +from sqlalchemy.orm import selectinload, aliased, joinedload, Mapped, QueryableAttribute from starlette import status from collector_db.ConfigManager import ConfigManager @@ -15,6 +15,7 @@ from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo from collector_db.DTOs.URLInfo import URLInfo +from collector_db.DTOs.URLMapping import URLMapping from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.DTOs.URLWithHTML import URLWithHTML from collector_db.StatementComposer import StatementComposer @@ -25,6 +26,7 @@ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ UserRecordTypeSuggestion from collector_manager.enums import URLStatus, CollectorType +from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ GetNextURLForAgencyAgencyInfo, GetNextURLForAgencyAnnotationInnerResponse, URLAgencyAnnotationPostInfo from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, FinalReviewAnnotationInfo, \ @@ -33,16 +35,23 @@ from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseMetadataInfo, GetURLsResponseErrorInfo, \ GetURLsResponseInnerInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo +from core.DTOs.ResponseURLInfo import ResponseURLInfo from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO from core.enums import BatchStatus, SuggestionType, RecordType from html_tag_collector.DataClassTags import convert_to_response_html_info +# Type Hints + +UserSuggestionModel = UserRelevantSuggestion or UserRecordTypeSuggestion or UserUrlAgencySuggestion +AutoSuggestionModel = AutoRelevantSuggestion or AutoRecordTypeSuggestion or AutomatedUrlAgencySuggestion + def add_standard_limit_and_offset(statement, page, limit=100): offset = (page - 1) * limit return statement.limit(limit).offset(offset) + class AsyncDatabaseClient: def __init__(self, db_url: str = get_postgres_connection_string(is_async=True)): self.engine = create_async_engine( @@ -59,11 +68,10 @@ async def _add_models(session: AsyncSession, model_class, models) -> list[int]: await session.flush() return [instance.id for instance in instances] - - @staticmethod def session_manager(method): """Decorator to manage async session lifecycle.""" + @wraps(method) async def wrapper(self, *args, **kwargs): async with self.session_maker() as session: @@ -74,6 +82,7 @@ async def wrapper(self, *args, **kwargs): except Exception as e: await session.rollback() raise e + return wrapper @session_manager @@ -107,27 +116,29 @@ async def add_auto_relevant_suggestion( ) session.add(suggestion) - @session_manager - async def add_user_relevant_suggestion( - self, + @staticmethod + async def get_user_suggestion( session: AsyncSession, - url_id: int, + model: UserSuggestionModel, user_id: int, - relevant: bool - ): - suggestion = UserRelevantSuggestion( - url_id=url_id, - user_id=user_id, - relevant=relevant + url_id: int + ) -> Optional[UserSuggestionModel]: + statement = Select(model).where( + and_( + model.url_id == url_id, + model.user_id == user_id + ) ) - session.add(suggestion) + result = await session.execute(statement) + return result.unique().scalar_one_or_none() - @session_manager - async def get_next_url_for_relevance_annotation( - self, + @staticmethod + async def get_next_url_for_user_annotation( session: AsyncSession, + user_suggestion_model_to_exclude: UserSuggestionModel, + auto_suggestion_relationship: QueryableAttribute, user_id: int - ): + ) -> URL: url_query = ( select( URL, @@ -139,16 +150,16 @@ async def get_next_url_for_relevance_annotation( .where( not_( exists( - select(UserRelevantSuggestion) + select(user_suggestion_model_to_exclude) .where( - UserRelevantSuggestion.url_id == URL.id, - UserRelevantSuggestion.user_id == user_id + user_suggestion_model_to_exclude.url_id == URL.id, + user_suggestion_model_to_exclude.user_id == user_id ) ) ) - # TODO: Parameterize relationship attribute to joinedload + # TODO: Parameterize relationship attribute to joinedload ).options( - joinedload(URL.auto_relevant_suggestions), + joinedload(auto_suggestion_relationship), joinedload(URL.html_content) ). limit(1) @@ -156,7 +167,46 @@ async def get_next_url_for_relevance_annotation( raw_result = await session.execute(url_query) - url: URL = raw_result.scalars().one_or_none() + return raw_result.unique().scalars().one_or_none() + + @session_manager + async def add_user_relevant_suggestion( + self, + session: AsyncSession, + url_id: int, + user_id: int, + relevant: bool + ): + prior_suggestion = await self.get_user_suggestion( + session, + model=UserRelevantSuggestion, + user_id=user_id, + url_id=url_id + ) + if prior_suggestion is not None: + prior_suggestion.relevant = relevant + return + + suggestion = UserRelevantSuggestion( + url_id=url_id, + user_id=user_id, + relevant=relevant + ) + session.add(suggestion) + + @session_manager + async def get_next_url_for_relevance_annotation( + self, + session: AsyncSession, + user_id: int + ) -> Optional[GetNextRelevanceAnnotationResponseInfo]: + + url = await self.get_next_url_for_user_annotation( + session, + user_suggestion_model_to_exclude=UserRelevantSuggestion, + auto_suggestion_relationship=URL.auto_relevant_suggestions, + user_id=user_id + ) if url is None: return None @@ -171,15 +221,27 @@ async def get_next_url_for_relevance_annotation( else: auto_suggestion = None - return RelevanceAnnotationResponseInfo( - url_id=url.id, + return GetNextRelevanceAnnotationResponseInfo( + url_info=URLMapping( + url=url.url, + url_id=url.id + ), suggested_relevant=auto_suggestion, - html_response_info=html_response_info + html_info=html_response_info ) + #endregion relevant + + #region record_type + + @session_manager + async def get_next_url_for_record_type_annotation( + self, + session: AsyncSession, + user_id: int + ) = : - #endregion relevant @session_manager async def add_auto_record_type_suggestion( @@ -194,7 +256,6 @@ async def add_auto_record_type_suggestion( ) session.add(suggestion) - @session_manager async def add_user_record_type_suggestion( self, @@ -210,6 +271,7 @@ async def add_user_record_type_suggestion( ) session.add(suggestion) + #endregion record_type @session_manager async def add_url_metadata(self, session: AsyncSession, url_metadata_info: URLMetadataInfo) -> int: @@ -304,14 +366,13 @@ async def get_urls_with_html_data_and_without_metadata_type( ) final_results.append(url_with_html) - return final_results @session_manager async def has_pending_urls_with_html_data_and_without_metadata_type( - self, - session: AsyncSession, - without_metadata_type: URLMetadataAttributeType = URLMetadataAttributeType.RELEVANT + self, + session: AsyncSession, + without_metadata_type: URLMetadataAttributeType = URLMetadataAttributeType.RELEVANT ) -> bool: # TODO: Generalize this so that it can exclude based on other attributes # Get URLs with no relevancy metadata @@ -357,7 +418,8 @@ async def get_urls_with_metadata( return final_results @session_manager - async def update_url_metadata_status(self, session: AsyncSession, metadata_ids: list[int], validation_status: ValidationStatus): + async def update_url_metadata_status(self, session: AsyncSession, metadata_ids: list[int], + validation_status: ValidationStatus): for metadata_id in metadata_ids: statement = select(URLMetadata).where(URLMetadata.id == metadata_id) scalar_result = await session.scalars(statement) @@ -631,8 +693,6 @@ async def get_html_content_info(self, session: AsyncSession, url_id: int) -> lis results = session_result.scalars().all() return [URLHTMLContentInfo(**result.__dict__) for result in results] - - @session_manager async def link_urls_to_task(self, session: AsyncSession, task_id: int, url_ids: list[int]): for url_id in url_ids: @@ -932,7 +992,6 @@ async def get_next_url_for_final_review( group_by(URLMetadata.url_id).subquery() ) - # Count whether agency auto annotations exist # (Note: Can be either confirmed or auto suggestion) agency_annotations_exist_subquery = ( @@ -990,23 +1049,21 @@ async def get_next_url_for_final_review( ).group_by(UserUrlAgencySuggestion.url_id).subquery() ) - - # Basic URL query url_query = ( select( URL, ( - func.coalesce(distinct_auto_metadata_subquery.c.auto_count, 0) + - func.coalesce(distinct_user_metadata_subquery.c.user_count, 0) + - func.coalesce(agency_annotations_exist_subquery.c.agency_annotations_exist, 0) + - func.coalesce(agency_user_annotations_exist_subquery.c.agency_user_annotations_exist, 0) + func.coalesce(distinct_auto_metadata_subquery.c.auto_count, 0) + + func.coalesce(distinct_user_metadata_subquery.c.user_count, 0) + + func.coalesce(agency_annotations_exist_subquery.c.agency_annotations_exist, 0) + + func.coalesce(agency_user_annotations_exist_subquery.c.agency_user_annotations_exist, 0) ).label("total_distinct_annotation_count"), ( - func.coalesce(all_auto_metadata_subquery.c.auto_count, 0) + - func.coalesce(all_user_metadata_subquery.c.user_count, 0) + - func.coalesce(all_user_agency_annotations_subquery.c.user_count, 0) + - func.coalesce(agency_annotations_exist_subquery.c.agency_annotations_exist, 0) + func.coalesce(all_auto_metadata_subquery.c.auto_count, 0) + + func.coalesce(all_user_metadata_subquery.c.user_count, 0) + + func.coalesce(all_user_agency_annotations_subquery.c.user_count, 0) + + func.coalesce(agency_annotations_exist_subquery.c.agency_annotations_exist, 0) ).label("total_overall_annotation_count") ).outerjoin( distinct_auto_metadata_subquery, URL.id == distinct_auto_metadata_subquery.c.url_id @@ -1043,7 +1100,6 @@ async def get_next_url_for_final_review( desc("total_overall_annotation_count"), ) - # Apply limit url_query = url_query.limit(1) @@ -1179,4 +1235,3 @@ async def set_approved_metadata( # If it does, do nothing url.outcome = URLStatus.APPROVED.value - diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index 6b6ab677..b3ab5312 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -74,7 +74,7 @@ def exclude_urls_with_agency_suggestions( return statement @staticmethod - def get_all_html_content_for_url(subquery) -> Select: + async def get_all_html_content_for_url(subquery) -> Select: statement = ( select( subquery.c.url, diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 39c1fc46..a4cea685 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -8,6 +8,7 @@ from collector_db.DTOs.URLAnnotationInfo import URLAnnotationInfo from collector_db.enums import TaskType, URLMetadataAttributeType from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo +from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse @@ -20,7 +21,7 @@ from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator -from core.enums import BatchStatus, SuggestionType +from core.enums import BatchStatus, SuggestionType, RecordType from html_tag_collector.DataClassTags import convert_to_response_html_info from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.URLRequestInterface import URLRequestInterface @@ -186,8 +187,29 @@ async def submit_url_relevance_annotation( relevant=relevant ) - async def get_next_url_for_relevance_annotation(self, user_id: int) -> GetNextURLForAnnotationResponse: - return await self.adb_client.get_next_url_for_relevance_annotation(user_id=user_id) + async def get_next_url_for_relevance_annotation(self, user_id: int) -> GetNextRelevanceAnnotationResponseOuterInfo: + next_annotation = await self.adb_client.get_next_url_for_relevance_annotation(user_id=user_id) + return GetNextRelevanceAnnotationResponseOuterInfo( + next_annotation=next_annotation + ) + + async def get_next_url_for_record_type_annotation(self, user_id: int) -> GetNextRecordTypeAnnotationResponseOuterInfo: + next_annotation = await self.adb_client.get_next_url_for_record_type_annotation(user_id=user_id) + return GetNextRecordTypeAnnotationResponseOuterInfo( + next_annotation=next_annotation + ) + + async def submit_url_record_type_annotation( + self, + user_id: int, + url_id: int, + record_type: RecordType + ): + return await self.adb_client.add_user_record_type_suggestion( + user_id=user_id, + url_id=url_id, + record_type=record_type + ) async def submit_url_annotation( self, diff --git a/core/DTOs/GetNextRelevanceAnnotationResponseInfo.py b/core/DTOs/GetNextRelevanceAnnotationResponseInfo.py new file mode 100644 index 00000000..61cb35a5 --- /dev/null +++ b/core/DTOs/GetNextRelevanceAnnotationResponseInfo.py @@ -0,0 +1,22 @@ +from typing import Optional + +from pydantic import BaseModel, Field + +from collector_db.DTOs.URLMapping import URLMapping +from core.DTOs.ResponseURLInfo import ResponseURLInfo +from html_tag_collector.DataClassTags import ResponseHTMLInfo + + +class GetNextRelevanceAnnotationResponseInfo(BaseModel): + url_info: URLMapping = Field( + title="Information about the URL" + ) + suggested_relevant: Optional[bool] = Field( + title="Whether the auto-labeler identified the URL as relevant or not" + ) + html_info: ResponseHTMLInfo = Field( + title="HTML information about the URL" + ) + +class GetNextRelevanceAnnotationResponseOuterInfo(BaseModel): + next_annotation: Optional[GetNextRelevanceAnnotationResponseInfo] diff --git a/core/DTOs/ResponseURLInfo.py b/core/DTOs/ResponseURLInfo.py new file mode 100644 index 00000000..c7f7e364 --- /dev/null +++ b/core/DTOs/ResponseURLInfo.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel + + +class ResponseURLInfo(BaseModel): + url: str + url_id: int \ No newline at end of file diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index d25ca424..8a7cd487 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -12,6 +12,8 @@ from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse +from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo, \ + GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse @@ -172,18 +174,11 @@ def abort_batch(self, batch_id: int) -> MessageResponse: ) return MessageResponse(**data) - def process_relevancy(self) -> MessageCountResponse: - # TODO: Delete - data = self.post( - url=f"process/relevancy" - ) - return MessageCountResponse(**data) - - def get_next_relevance_annotation(self) -> GetNextURLForAnnotationResponse: + def get_next_relevance_annotation(self) -> GetNextRelevanceAnnotationResponseOuterInfo: data = self.get( url=f"/annotate/relevance" ) - return GetNextURLForAnnotationResponse(**data) + return GetNextRelevanceAnnotationResponseOuterInfo(**data) def get_next_record_type_annotation(self) -> GetNextURLForAnnotationResponse: data = self.get( @@ -204,14 +199,14 @@ def post_record_type_annotation_and_get_next( def post_relevance_annotation_and_get_next( self, - metadata_id: int, + url_id: int, relevance_annotation_post_info: RelevanceAnnotationPostInfo - ) -> GetNextURLForAnnotationResponse: + ) -> GetNextRelevanceAnnotationResponseOuterInfo: data = self.post( - url=f"/annotate/relevance/{metadata_id}", + url=f"/annotate/relevance/{url_id}", json=relevance_annotation_post_info.model_dump(mode='json') ) - return GetNextURLForAnnotationResponse(**data) + return GetNextRelevanceAnnotationResponseOuterInfo(**data) async def get_next_agency_annotation(self) -> GetNextURLForAgencyAnnotationResponse: data = self.get( diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/test_automated/integration/api/test_annotate.py index fe5d4c28..b90ad1cc 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/test_automated/integration/api/test_annotate.py @@ -3,16 +3,32 @@ import pytest from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo +from collector_db.DTOs.URLMapping import URLMapping from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource -from collector_db.models import UserUrlAgencySuggestion +from collector_db.models import UserUrlAgencySuggestion, UserRelevantSuggestion +from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import URLAgencyAnnotationPostInfo from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo from core.enums import RecordType, SuggestionType +from html_tag_collector.DataClassTags import ResponseHTMLInfo from tests.helpers.DBDataCreator import BatchURLCreationInfo from tests.test_automated.integration.api.conftest import MOCK_USER_ID +def check_url_mappings_match( + map_1: URLMapping, + map_2: URLMapping +): + assert map_1.url_id == map_2.url_id + assert map_2.url == map_2.url + +def check_html_info_not_empty( + html_info: ResponseHTMLInfo +): + assert html_info.description != "" + assert html_info.title != "" + async def run_annotation_test( api_test_helper, submit_and_get_next_function: callable, @@ -57,6 +73,8 @@ async def run_annotation_test( # Validate presence of HTML data in `html` field assert inner_info_1.html_info.description != "" assert inner_info_1.html_info.title != "" + + # Validate that the correct metadata value is returned assert inner_info_1.suggested_value == "False" # Call `POST` `/annotate/url` with finished annotation, and receive next URL @@ -115,28 +133,72 @@ async def test_annotate_relevancy(api_test_helper): # Add HTML data to both await ath.db_data_creator.html_data([url_1.url_id, url_2.url_id]) # Call `GET` `/annotate/url` and receive next URL - request_info_1: GetNextURLForAnnotationResponse = api_test_helper.request_validator.get_next_relevance_annotation() + request_info_1: GetNextRelevanceAnnotationResponseOuterInfo = api_test_helper.request_validator.get_next_relevance_annotation() inner_info_1 = request_info_1.next_annotation - # Validate presence of HTML data in `html` field - assert inner_info_1.html_info.description != "" - assert inner_info_1.html_info.title != "" - assert inner_info_1.suggested_value == "True" + check_url_mappings_match(inner_info_1.url_info, url_1) + check_html_info_not_empty(inner_info_1.html_info) + # Validate that the correct relevant value is returned + assert inner_info_1.suggested_relevant is True + # Annotate with value 'False' and get next URL + request_info_2: GetNextRelevanceAnnotationResponseOuterInfo = api_test_helper.request_validator.post_relevance_annotation_and_get_next( + url_id=inner_info_1.url_info.url_id, + relevance_annotation_post_info=RelevanceAnnotationPostInfo( + is_relevant=False + ) + ) + inner_info_2 = request_info_2.next_annotation - await run_annotation_test( - api_test_helper=api_test_helper, - submit_and_get_next_function=api_test_helper.request_validator.post_relevance_annotation_and_get_next, - get_next_function=api_test_helper.request_validator.get_next_relevance_annotation, - post_info=RelevanceAnnotationPostInfo( + check_url_mappings_match( + inner_info_2.url_info, + url_2 + ) + check_html_info_not_empty(inner_info_2.html_info) + + request_info_3: GetNextRelevanceAnnotationResponseOuterInfo = api_test_helper.request_validator.post_relevance_annotation_and_get_next( + url_id=inner_info_2.url_info.url_id, + relevance_annotation_post_info=RelevanceAnnotationPostInfo( is_relevant=True - ), - metadata_attribute=URLMetadataAttributeType.RELEVANT, - expected_metadata_value="True" + ) ) + assert request_info_3.next_annotation is None + + # Get all URL annotations. Confirm they exist for user + adb_client = ath.adb_client() + results: list[UserRelevantSuggestion] = await adb_client.get_all(UserRelevantSuggestion) + result_1 = results[0] + result_2 = results[1] + + assert result_1.url_id == inner_info_1.url_info.url_id + assert result_1.relevant is False + + assert result_2.url_id == inner_info_2.url_info.url_id + assert result_2.relevant is True + + # If user submits annotation for same URL, the URL should be overwritten + + request_info_4: GetNextRelevanceAnnotationResponseOuterInfo = api_test_helper.request_validator.post_relevance_annotation_and_get_next( + url_id=inner_info_1.url_info.url_id, + relevance_annotation_post_info=RelevanceAnnotationPostInfo( + is_relevant=True + ) + ) + + assert request_info_4.next_annotation is None + + results: list[UserRelevantSuggestion] = await adb_client.get_all(UserRelevantSuggestion) + assert len(results) == 2 + + for result in results: + if result.url_id == inner_info_1.url_info.url_id: + assert results[0].relevant is True + + + @pytest.mark.asyncio async def test_annotate_record_type(api_test_helper): await run_annotation_test( From 93faa1fbe925717150fe56fce905d1f7765d2528 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 25 Feb 2025 11:56:31 -0500 Subject: [PATCH 058/244] build(api): add approve source endpoint and overhaul metadata Create `/review/approve-source` endpoint Overhaul annotation backend for better maintainability BREAKING CHANGE: Annotations no longer return metadata ids, but url ids. Approval or suggested annotations must now include url ids instead of metadata ids. --- ...45b1c_add_task_tables_and_linking_logic.py | 1 - ...21086_update_metadata_validation_status.py | 16 +- ...0590bb_overhaul_annotation_organization.py | 81 ++- ...ae_add_user_url_agency_suggestions_and_.py | 6 +- ...daf0_revise_agency_identification_logic.py | 1 - api/routes/annotate.py | 15 +- collector_db/AsyncDatabaseClient.py | 663 ++++++++---------- collector_db/DTOConverter.py | 232 +++--- collector_db/StatementComposer.py | 19 +- collector_db/models.py | 77 +- collector_manager/enums.py | 6 +- core/AsyncCore.py | 63 +- core/DTOs/FinalReviewApprovalInfo.py | 4 +- ...GetNextRecordTypeAnnotationResponseInfo.py | 22 + core/DTOs/GetNextURLForFinalReviewResponse.py | 1 - core/DTOs/GetURLsResponseInfo.py | 1 - core/classes/URLRecordTypeTaskOperator.py | 27 +- .../URLRelevanceHuggingfaceTaskOperator.py | 27 +- local_database/DataDumper/dump.sh | 2 +- tests/helpers/DBDataCreator.py | 71 +- tests/helpers/complex_test_data_functions.py | 56 +- .../test_html_tag_collector_integration.py | 1 - tests/test_alembic/test_revisions.py | 7 +- .../api/helpers/RequestValidator.py | 13 +- .../integration/api/test_annotate.py | 177 ++--- .../integration/api/test_url.py | 5 - .../collector_db/test_database_structure.py | 39 -- .../collector_db/test_db_client.py | 102 +-- .../security_manager/test_security_manager.py | 5 +- .../tasks/test_agency_preannotation_task.py | 4 +- .../tasks/test_url_record_type_task.py | 10 +- .../test_url_relevancy_huggingface_task.py | 17 +- util/alembic_helpers.py | 38 + 33 files changed, 800 insertions(+), 1009 deletions(-) create mode 100644 core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py create mode 100644 util/alembic_helpers.py diff --git a/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py b/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py index b2174484..f408396f 100644 --- a/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py +++ b/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py @@ -72,7 +72,6 @@ def downgrade() -> None: op.drop_constraint("url_error_info_task_id_fkey", 'url_error_info', type_='foreignkey') op.drop_constraint('uq_url_id_error', 'url_error_info', type_='unique') op.drop_column('url_error_info', 'task_id') - op.drop_column('url_metadata', 'notes') op.drop_table('link_task_urls') op.drop_table('task_errors') op.drop_table('tasks') diff --git a/alembic/versions/108dac321086_update_metadata_validation_status.py b/alembic/versions/108dac321086_update_metadata_validation_status.py index 5212865a..aa05ee1b 100644 --- a/alembic/versions/108dac321086_update_metadata_validation_status.py +++ b/alembic/versions/108dac321086_update_metadata_validation_status.py @@ -43,13 +43,13 @@ def upgrade() -> None: def downgrade() -> None: validation_status.create(op.get_bind()) - - op.alter_column( - table_name="url_metadata", - column_name="validation_status", - existing_type=metadata_validation_status, - type_=validation_status, - postgresql_using="validation_status::text::validation_status" - ) + # + # op.alter_column( + # table_name="url_metadata", + # column_name="validation_status", + # existing_type=metadata_validation_status, + # type_=validation_status, + # postgresql_using="validation_status::text::validation_status" + # ) metadata_validation_status.drop(op.get_bind(), checkfirst=True) diff --git a/alembic/versions/2025_02_23_1023-33421c0590bb_overhaul_annotation_organization.py b/alembic/versions/2025_02_23_1023-33421c0590bb_overhaul_annotation_organization.py index 4b453174..55442f50 100644 --- a/alembic/versions/2025_02_23_1023-33421c0590bb_overhaul_annotation_organization.py +++ b/alembic/versions/2025_02_23_1023-33421c0590bb_overhaul_annotation_organization.py @@ -16,6 +16,11 @@ - `ConfirmedURLAgency` - `MetadataAnnotation` +Update URL Status to just three enum value: +- VALIDATED +- SUBMITTED +- PENDING + Revision ID: 33421c0590bb Revises: 0c6dc00806ce Create Date: 2025-02-23 10:23:19.696248 @@ -27,7 +32,7 @@ import sqlalchemy as sa from sqlalchemy import UniqueConstraint -from core.enums import RecordType +from util.alembic_helpers import switch_enum_type # revision identifiers, used by Alembic. revision: str = '33421c0590bb' @@ -77,11 +82,50 @@ record_type_enum = sa.Enum(*record_type_values, name='record_type') +def run_data_migrations(): + + op.execute( + """ + INSERT INTO AUTO_RELEVANT_SUGGESTIONS (url_id, relevant) + SELECT url_id, LOWER(value)::boolean + FROM public.url_metadata + WHERE validation_source = 'Machine Learning' + and attribute = 'Relevant' + """ + ) + + op.execute( + """ + INSERT INTO AUTO_RECORD_TYPE_SUGGESTIONS(url_id, record_type) + SELECT url_id, value::record_type + FROM public.url_metadata + WHERE validation_source = 'Machine Learning' + and attribute = 'Record Type' + """ + ) + + op.execute( + """ + INSERT INTO USER_RELEVANT_SUGGESTIONS(url_id, relevant, user_id) + SELECT um.url_id, LOWER(um.value)::boolean, ma.user_id + FROM public.url_metadata um + INNER join metadata_annotations ma on um.id = ma.metadata_id + where um.attribute = 'Relevant' + """ + ) + + op.execute( + """ + INSERT INTO USER_RECORD_TYPE_SUGGESTIONS(url_id, record_type, user_id) + SELECT um.url_id, um.value::record_type, ma.user_id + FROM public.url_metadata um + INNER join metadata_annotations ma on um.id = ma.metadata_id + where um.attribute = 'Record Type' + + """ + ) + def upgrade() -> None: - # Delete the old tables - op.drop_table('metadata_annotations') - op.drop_table('url_metadata') - op.drop_table('confirmed_url_agency') # Create the new tables op.create_table( @@ -168,6 +212,21 @@ def upgrade() -> None: ) ) + run_data_migrations() + + # Delete the old tables + op.drop_table('metadata_annotations') + op.drop_table('url_metadata') + op.drop_table('confirmed_url_agency') + + switch_enum_type( + table_name='urls', + column_name='outcome', + enum_name='url_status', + new_enum_values=['pending', 'submitted', 'validated', 'error', 'duplicate'] + ) + + @@ -214,7 +273,7 @@ def downgrade() -> None: op.create_table( 'metadata_annotations', sa.Column('id', sa.Integer(), primary_key=True), - sa.Column('url_id', sa.Integer(), sa.ForeignKey('urls.id', ondelete='CASCADE'), nullable=False), + sa.Column('metadata_id', sa.Integer(), sa.ForeignKey('url_metadata.id', ondelete='CASCADE'), nullable=False), sa.Column('user_id', sa.Integer(), nullable=False), sa.Column('created_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()')), sa.Column('updated_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()'), onupdate=sa.text('now()')), @@ -223,3 +282,13 @@ def downgrade() -> None: "metadata_id", name="metadata_annotations_uq_user_id_metadata_id"), ) + + switch_enum_type( + table_name='urls', + column_name='outcome', + enum_name='url_status', + new_enum_values=['pending', 'submitted', 'human_labeling', 'rejected', 'duplicate', 'error'] + ) + + # Drop enum + record_type_enum.drop(op.get_bind()) diff --git a/alembic/versions/8c44e02733ae_add_user_url_agency_suggestions_and_.py b/alembic/versions/8c44e02733ae_add_user_url_agency_suggestions_and_.py index 8eadb6a3..87c069fa 100644 --- a/alembic/versions/8c44e02733ae_add_user_url_agency_suggestions_and_.py +++ b/alembic/versions/8c44e02733ae_add_user_url_agency_suggestions_and_.py @@ -51,13 +51,9 @@ def upgrade() -> None: def downgrade() -> None: - op.drop_column( - table_name='url_agency_suggestions', - column_name="user_id" - ) + op.execute("DROP TRIGGER IF EXISTS enforce_url_agency_suggestions_manual_suggestion_user_id ON url_agency_suggestions;") op.execute( """ - DROP TRIGGER IF EXISTS enforce_url_agency_suggestions_manual_suggestion_user_id; DROP FUNCTION IF EXISTS user_url_agency_suggestions_value(); """ ) diff --git a/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py b/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py index 62d9930d..2bb7c157 100644 --- a/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py +++ b/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py @@ -146,6 +146,5 @@ def downgrade(): op.execute(""" DROP FUNCTION IF EXISTS enforce_no_agency_id_if_unknown; """) - op.execute("DROP TRIGGER enforce_no_agency_id_if_new ON user_url_agency_suggestions") op.execute("DROP FUNCTION enforce_no_agency_id_if_new()") diff --git a/api/routes/annotate.py b/api/routes/annotate.py index d5f2e709..53486d7d 100644 --- a/api/routes/annotate.py +++ b/api/routes/annotate.py @@ -3,6 +3,7 @@ from api.dependencies import get_async_core from collector_db.enums import URLMetadataAttributeType from core.AsyncCore import AsyncCore +from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo, \ GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ @@ -53,10 +54,9 @@ async def annotate_url_for_relevance_and_get_next_url( async def get_next_url_for_record_type_annotation( access_info: AccessInfo = Depends(get_access_info), async_core: AsyncCore = Depends(get_async_core), -) -> GetNextURLForAnnotationResponse: - result = await async_core.get_next_url_for_annotation( +) -> GetNextRecordTypeAnnotationResponseOuterInfo: + result = await async_core.get_next_url_for_record_type_annotation( user_id=access_info.user_id, - metadata_type=URLMetadataAttributeType.RECORD_TYPE ) return result @@ -66,15 +66,14 @@ async def annotate_url_for_record_type_and_get_next_url( url_id: int = Path(description="The URL id to annotate"), async_core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info) -) -> GetNextURLForAnnotationResponse: +) -> GetNextRecordTypeAnnotationResponseOuterInfo: """ Post URL annotation and get next URL to annotate """ - result = await async_core.submit_and_get_next_url_for_annotation( + result = await async_core.submit_url_record_type_annotation( user_id=access_info.user_id, - metadata_id=metadata_id, - annotation=record_type_annotation_post_info.record_type.value, - metadata_type=URLMetadataAttributeType.RECORD_TYPE + url_id=url_id, + record_type=record_type_annotation_post_info.record_type, ) return result diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 3d34f024..cf7f36cb 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -1,41 +1,36 @@ from functools import wraps -from typing import Optional, List +from typing import Optional, Type from fastapi import HTTPException -from sqlalchemy import select, exists, func, distinct, case, desc, asc, Select, not_, and_ +from sqlalchemy import select, exists, func, case, desc, Select, not_, and_ from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker -from sqlalchemy.orm import selectinload, aliased, joinedload, Mapped, QueryableAttribute +from sqlalchemy.orm import selectinload, joinedload, QueryableAttribute from starlette import status from collector_db.ConfigManager import ConfigManager from collector_db.DTOConverter import DTOConverter -from collector_db.DTOs.MetadataAnnotationInfo import MetadataAnnotationInfo from collector_db.DTOs.TaskInfo import TaskInfo -from collector_db.DTOs.URLAnnotationInfo import URLAnnotationInfo from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo from collector_db.DTOs.URLInfo import URLInfo from collector_db.DTOs.URLMapping import URLMapping -from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.DTOs.URLWithHTML import URLWithHTML from collector_db.StatementComposer import StatementComposer -from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource, TaskType +from collector_db.enums import URLMetadataAttributeType, TaskType from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import URL, URLErrorInfo, URLHTMLContent, Base, \ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ UserRecordTypeSuggestion from collector_manager.enums import URLStatus, CollectorType +from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ - GetNextURLForAgencyAgencyInfo, GetNextURLForAgencyAnnotationInnerResponse, URLAgencyAnnotationPostInfo -from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, FinalReviewAnnotationInfo, \ - FinalReviewAnnotationRelevantInfo, FinalReviewAnnotationRecordTypeInfo, FinalReviewAnnotationAgencyInfo + GetNextURLForAgencyAgencyInfo, GetNextURLForAgencyAnnotationInnerResponse +from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, FinalReviewAnnotationInfo from core.DTOs.GetTasksResponse import GetTasksResponse, GetTasksResponseTaskInfo -from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseMetadataInfo, GetURLsResponseErrorInfo, \ +from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseErrorInfo, \ GetURLsResponseInnerInfo -from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo -from core.DTOs.ResponseURLInfo import ResponseURLInfo from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO from core.enums import BatchStatus, SuggestionType, RecordType @@ -85,23 +80,6 @@ async def wrapper(self, *args, **kwargs): return wrapper - @session_manager - async def get_url_metadata_by_status( - self, - session: AsyncSession, - url_status: URLStatus, - offset: int = 0 - ): - statement = (select(URLMetadata) - .join(URL) - .where(URL.outcome == url_status.value) - .limit(100) - .offset(offset) - .order_by(URLMetadata.id)) - scalar_result = await session.scalars(statement) - model_result = scalar_result.all() - return [URLMetadataInfo(**url_metadata.__dict__) for url_metadata in model_result] - # region relevant @session_manager async def add_auto_relevant_suggestion( @@ -143,10 +121,8 @@ async def get_next_url_for_user_annotation( select( URL, ) - # TODO: Generalize this whole section .where(exists(select(URLHTMLContent).where(URLHTMLContent.url_id == URL.id))) # URL must not have metadata annotation by this user - # TODO: Have this as a parameter for the user model .where( not_( exists( @@ -157,7 +133,6 @@ async def get_next_url_for_user_annotation( ) ) ) - # TODO: Parameterize relationship attribute to joinedload ).options( joinedload(auto_suggestion_relationship), joinedload(URL.html_content) @@ -204,7 +179,7 @@ async def get_next_url_for_relevance_annotation( url = await self.get_next_url_for_user_annotation( session, user_suggestion_model_to_exclude=UserRelevantSuggestion, - auto_suggestion_relationship=URL.auto_relevant_suggestions, + auto_suggestion_relationship=URL.auto_relevant_suggestion, user_id=user_id ) if url is None: @@ -215,18 +190,17 @@ async def get_next_url_for_relevance_annotation( url.html_content ) - # Get auto-suggestion if exists - if len(url.auto_relevant_suggestions) > 0: - auto_suggestion = url.auto_relevant_suggestions[0].relevant + if url.auto_relevant_suggestion is not None: + suggestion = url.auto_relevant_suggestion.relevant else: - auto_suggestion = None + suggestion = None return GetNextRelevanceAnnotationResponseInfo( url_info=URLMapping( url=url.url, url_id=url.id ), - suggested_relevant=auto_suggestion, + suggested_relevant=suggestion, html_info=html_response_info ) @@ -239,9 +213,49 @@ async def get_next_url_for_record_type_annotation( self, session: AsyncSession, user_id: int - ) = : + ) -> Optional[GetNextRecordTypeAnnotationResponseInfo]: + + url = await self.get_next_url_for_user_annotation( + session, + user_suggestion_model_to_exclude=UserRecordTypeSuggestion, + auto_suggestion_relationship=URL.auto_record_type_suggestion, + user_id=user_id + ) + if url is None: + return None + + # Next, get all HTML content for the URL + html_response_info = DTOConverter.html_content_list_to_html_response_info( + url.html_content + ) + + if url.auto_record_type_suggestion is not None: + suggestion = url.auto_record_type_suggestion.record_type + else: + suggestion = None + + return GetNextRecordTypeAnnotationResponseInfo( + url_info=URLMapping( + url=url.url, + url_id=url.id + ), + suggested_record_type=suggestion, + html_info=html_response_info + ) + @session_manager + async def add_auto_record_type_suggestions( + self, + session: AsyncSession, + url_and_record_type_list: list[tuple[int, RecordType]] + ): + for url_id, record_type in url_and_record_type_list: + suggestion = AutoRecordTypeSuggestion( + url_id=url_id, + record_type=record_type.value + ) + session.add(suggestion) @session_manager async def add_auto_record_type_suggestion( @@ -250,12 +264,26 @@ async def add_auto_record_type_suggestion( url_id: int, record_type: RecordType ): + suggestion = AutoRecordTypeSuggestion( url_id=url_id, record_type=record_type.value ) session.add(suggestion) + @session_manager + async def add_auto_relevance_suggestions( + self, + session: AsyncSession, + url_and_relevance_type_list: list[tuple[int, bool]] + ): + for url_id, relevant in url_and_relevance_type_list: + suggestion = AutoRelevantSuggestion( + url_id=url_id, + relevant=relevant + ) + session.add(suggestion) + @session_manager async def add_user_record_type_suggestion( self, @@ -264,6 +292,16 @@ async def add_user_record_type_suggestion( user_id: int, record_type: RecordType ): + prior_suggestion = await self.get_user_suggestion( + session, + model=UserRecordTypeSuggestion, + user_id=user_id, + url_id=url_id + ) + if prior_suggestion is not None: + prior_suggestion.record_type = record_type.value + return + suggestion = UserRecordTypeSuggestion( url_id=url_id, user_id=user_id, @@ -273,15 +311,6 @@ async def add_user_record_type_suggestion( #endregion record_type - @session_manager - async def add_url_metadata(self, session: AsyncSession, url_metadata_info: URLMetadataInfo) -> int: - result = await self._add_models(session, URLMetadata, [url_metadata_info]) - return result[0] - - @session_manager - async def add_url_metadatas(self, session: AsyncSession, url_metadata_infos: list[URLMetadataInfo]) -> list[int]: - return await self._add_models(session, URLMetadata, url_metadata_infos) - @session_manager async def add_url_error_infos(self, session: AsyncSession, url_error_infos: list[URLErrorPydanticInfo]): for url_error_info in url_error_infos: @@ -331,6 +360,79 @@ async def get_pending_urls_without_html_data(self, session: AsyncSession): scalar_result = await session.scalars(statement) return scalar_result.all() + async def get_urls_with_html_data_and_without_models( + self, + session: AsyncSession, + model: Type[Base] + ): + statement = (select(URL) + .options(selectinload(URL.html_content)) + .where(URL.outcome == URLStatus.PENDING.value)) + statement = self.statement_composer.exclude_urls_with_extant_model( + statement=statement, + model=model + ) + statement = statement.limit(100).order_by(URL.id) + raw_result = await session.execute(statement) + urls: list[URL] = raw_result.unique().scalars().all() + final_results = DTOConverter.url_list_to_url_with_html_list(urls) + + return final_results + + @session_manager + async def get_urls_with_html_data_and_without_auto_record_type_suggestion( + self, + session: AsyncSession + ): + return await self.get_urls_with_html_data_and_without_models( + session=session, + model=AutoRecordTypeSuggestion + ) + + @session_manager + async def get_urls_with_html_data_and_without_auto_relevant_suggestion( + self, + session: AsyncSession + ): + return await self.get_urls_with_html_data_and_without_models( + session=session, + model=AutoRelevantSuggestion + ) + + async def has_urls_with_html_data_and_without_models( + self, + session: AsyncSession, + model: Type[Base] + ) -> bool: + statement = (select(URL) + .join(URLHTMLContent) + .where(URL.outcome == URLStatus.PENDING.value)) + # Exclude URLs with auto suggested record types + statement = self.statement_composer.exclude_urls_with_extant_model( + statement=statement, + model=model + ) + statement = statement.limit(1) + scalar_result = await session.scalars(statement) + return bool(scalar_result.first()) + + + @session_manager + async def has_urls_with_html_data_and_without_auto_record_type_suggestion(self, session: AsyncSession) -> bool: + return await self.has_urls_with_html_data_and_without_models( + session=session, + model=AutoRecordTypeSuggestion + ) + + @session_manager + async def has_urls_with_html_data_and_without_auto_relevant_suggestion(self, session: AsyncSession) -> bool: + return await self.has_urls_with_html_data_and_without_models( + session=session, + model=AutoRelevantSuggestion + ) + + + #TODO: Slated for deletion @session_manager async def get_urls_with_html_data_and_without_metadata_type( self, @@ -339,13 +441,25 @@ async def get_urls_with_html_data_and_without_metadata_type( ) -> list[URLWithHTML]: # Get URLs with no relevancy metadata - statement = (select(URL.id, URL.url, URLHTMLContent). - join(URLHTMLContent). - where(URL.outcome == URLStatus.PENDING.value)) + statement = (select(URL) + .options(selectinload(URL.html_content)) + .where(URL.outcome == URLStatus.PENDING.value)) + # Exclude URLs with auto suggested record types + statement = self.statement_composer.exclude_urls_with_extant_model( + statement=statement, + model=AutoRecordTypeSuggestion + ) + statement = statement.limit(100).order_by(URL.id) + + + # TODO: The below can probably be generalized + + statement = self.statement_composer.exclude_urls_with_select_metadata( statement=statement, attribute=without_metadata_type ) + # TODO: Generalize statement = statement.limit(100).order_by(URL.id) raw_result = await session.execute(statement) result = raw_result.all() @@ -388,129 +502,7 @@ async def has_pending_urls_with_html_data_and_without_metadata_type( result = raw_result.all() return len(result) > 0 - @session_manager - async def get_urls_with_metadata( - self, - session: AsyncSession, - attribute: URLMetadataAttributeType, - validation_status: ValidationStatus, - offset: int = 0 - ) -> list[URLMetadataInfo]: - statement = (select(URL.id, URLMetadata.id). - join(URLMetadata). - where(URLMetadata.attribute == attribute.value). - where(URLMetadata.validation_status == validation_status.value). - limit(100). - offset(offset). - order_by(URL.id) - ) - - raw_result = await session.execute(statement) - result = raw_result.all() - final_results = [] - for url_id, url_metadata_id in result: - info = URLMetadataInfo( - url_id=url_id, - id=url_metadata_id, - ) - final_results.append(info) - - return final_results - - @session_manager - async def update_url_metadata_status(self, session: AsyncSession, metadata_ids: list[int], - validation_status: ValidationStatus): - for metadata_id in metadata_ids: - statement = select(URLMetadata).where(URLMetadata.id == metadata_id) - scalar_result = await session.scalars(statement) - url_metadata = scalar_result.first() - url_metadata.validation_status = validation_status - - @session_manager - async def get_next_url_for_annotation( - self, - session: AsyncSession, - user_id: int, - metadata_type: URLMetadataAttributeType - ) -> URLAnnotationInfo: - # Get a URL, its relevancy metadata ID, and HTML data - # For a URL which has not yet been annotated by this user id - # First, subquery retrieving URL and its metadata ID where its relevant metadata - # does not have an annotation for that user - subquery = ( - select( - URL.id.label("url_id"), - URL.url, - URLMetadata.id.label("metadata_id"), - URLMetadata.value, - ) - .join(URLMetadata) - # Metadata must be relevant - .where(URLMetadata.attribute == metadata_type.value) - # Metadata must not be validated - .where(URLMetadata.validation_status == ValidationStatus.PENDING_VALIDATION.value) - # URL must have HTML content entries - .where(exists(select(URLHTMLContent).where(URLHTMLContent.url_id == URL.id))) - # URL must not have been annotated by the user - .where(~exists( - select(MetadataAnnotation). - where( - MetadataAnnotation.metadata_id == URLMetadata.id, - MetadataAnnotation.user_id == user_id - ) - )) - .limit(1) - ) - - # Next, get all HTML content for the URL - - statement = ( - select( - subquery.c.url, - subquery.c.metadata_id, - subquery.c.value, - URLHTMLContent.content_type, - URLHTMLContent.content, - ) - .join(URLHTMLContent) - .where(subquery.c.url_id == URLHTMLContent.url_id) - ) - - raw_result = await session.execute(statement) - result = raw_result.all() - - if len(result) == 0: - # No available URLs to annotate - return None - - annotation_info = URLAnnotationInfo( - url=result[0][0], - metadata_id=result[0][1], - suggested_value=result[0][2], - html_infos=[] - ) - for _, _, _, content_type, content in result: - html_info = URLHTMLContentInfo( - content_type=content_type, - content=content - ) - annotation_info.html_infos.append(html_info) - return annotation_info - @session_manager - async def add_metadata_annotation( - self, - session: AsyncSession, - user_id: int, - metadata_id: int, - annotation: str - ): - annotation = MetadataAnnotation( - metadata_id=metadata_id, - user_id=user_id, - value=annotation - ) - session.add(annotation) # @session_manager # async def get_annotations_for_metadata_id( @@ -552,7 +544,7 @@ async def add_to_root_url_cache(self, session: AsyncSession, url: str, page_titl @session_manager async def get_urls(self, session: AsyncSession, page: int, errors: bool) -> GetURLsResponseInfo: statement = select(URL).options( - selectinload(URL.url_metadata), selectinload(URL.error_info) + selectinload(URL.error_info) ) if errors: # Only return URLs with errors @@ -566,18 +558,6 @@ async def get_urls(self, session: AsyncSession, page: int, errors: bool) -> GetU all_results = execute_result.scalars().all() final_results = [] for result in all_results: - metadata_results = [] - for metadata in result.url_metadata: - metadata_result = GetURLsResponseMetadataInfo( - id=metadata.id, - attribute=URLMetadataAttributeType(metadata.attribute), - value=metadata.value, - validation_status=ValidationStatus(metadata.validation_status), - validation_source=ValidationSource(metadata.validation_source), - created_at=metadata.created_at, - updated_at=metadata.updated_at - ) - metadata_results.append(metadata_result) error_results = [] for error in result.error_info: error_result = GetURLsResponseErrorInfo( @@ -596,7 +576,6 @@ async def get_urls(self, session: AsyncSession, page: int, errors: bool) -> GetU updated_at=result.updated_at, created_at=result.created_at, errors=error_results, - metadata=metadata_results ) ) @@ -765,7 +744,7 @@ async def has_urls_without_agency_suggestions( statement = ( select( URL.id - )) + ).where(URL.agency_id == None)) statement = self.statement_composer.exclude_urls_with_agency_suggestions(statement) raw_result = await session.execute(statement) result = raw_result.all() @@ -812,13 +791,11 @@ async def get_next_url_agency_for_annotation( # Select statement statement = ( select(URL.id, URL.url) - # Must not be a confirmed URL - .join(ConfirmedUrlAgency, isouter=True) + # Must not have a confirmed agency identifier. .where( - ~exists( - select(ConfirmedUrlAgency). - where(ConfirmedUrlAgency.url_id == URL.id). - correlate(URL) + and_( + URL.agency_id.is_(None), + URL.outcome == URLStatus.PENDING.value ) ) # Must not have been annotated by this user @@ -924,11 +901,9 @@ async def add_confirmed_agency_url_links( suggestions: list[URLAgencySuggestionInfo] ): for suggestion in suggestions: - confirmed_agency_url_link = ConfirmedUrlAgency( - agency_id=suggestion.pdap_agency_id, - url_id=suggestion.url_id - ) - session.add(confirmed_agency_url_link) + url = await session.execute(select(URL).where(URL.id == suggestion.url_id)) + url = url.scalar_one() + url.agency_id = suggestion.pdap_agency_id @session_manager async def add_agency_auto_suggestions( @@ -965,88 +940,74 @@ async def add_agency_manual_suggestion( ) session.add(url_agency_suggestion) + @session_manager + async def get_urls_with_confirmed_agencies(self, session: AsyncSession) -> list[URL]: + statement = select(URL).where(URL.agency_id != None) + results = await session.execute(statement) + return list(results.scalars().all()) + @session_manager async def get_next_url_for_final_review( self, session: AsyncSession ) -> Optional[GetNextURLForFinalReviewResponse]: - # Subqueries for ORDER clause - # Subqueries for Counting distinct annotations - # Count distinct auto annotations for metadata - distinct_auto_metadata_subquery = ( - select( - URLMetadata.url_id, - func.count(distinct(URLMetadata.attribute)).label("auto_count") - ). - group_by(URLMetadata.url_id).subquery() - ) - # Count distinct user annotations for metadata - distinct_user_metadata_subquery = ( - select( - URLMetadata.url_id, - func.count(distinct(URLMetadata.attribute)).label("user_count") - ).join(MetadataAnnotation). - where(MetadataAnnotation.user_id != None). - group_by(URLMetadata.url_id).subquery() - ) + def annotations_exist_subquery(model: Type[Base]): + return ( + select( + URL.id.label("url_id"), + case( + ( + exists().where(URL.id == model.url_id), 1 + ), + else_=0 + ).label("exists") + ).subquery() + ) - # Count whether agency auto annotations exist - # (Note: Can be either confirmed or auto suggestion) - agency_annotations_exist_subquery = ( - select( - URL.id, - case( - ( - exists().where(URL.id == ConfirmedUrlAgency.url_id), 1 - ), - ( - exists().where(URL.id == AutomatedUrlAgencySuggestion.url_id), 1 - ), - else_=0 - ).label("agency_annotations_exist") - ).subquery() - ) + def count_subquery(model: Type[Base]): + return ( + select( + model.url_id, + func.count(model.url_id).label("count") + ).group_by(model.url_id).subquery() + ) - # Count whether agency user annotations exist - agency_user_annotations_exist_subquery = ( - select( - URL.id, - case( - ( - exists().where(URL.id == UserUrlAgencySuggestion.url_id), 1 - ), - else_=0 - ).label("agency_user_annotations_exist") - ).subquery() - ) + models = [ + AutoRelevantSuggestion, + UserRelevantSuggestion, + AutoRecordTypeSuggestion, + UserRecordTypeSuggestion, + AutomatedUrlAgencySuggestion, + UserUrlAgencySuggestion + ] - # Subqueries for counting *all* annotations + exist_subqueries = [ + annotations_exist_subquery(model=model) + for model in models + ] - # Count all auto annotations for metadata - all_auto_metadata_subquery = ( - select( - URLMetadata.url_id, - func.count(URLMetadata.attribute).label("auto_count") - ).group_by(URLMetadata.url_id).subquery() - ) - # Count all user annotations for metadata - all_user_metadata_subquery = ( - select( - URLMetadata.url_id, - func.count(URLMetadata.attribute).label("user_count") - ).join(MetadataAnnotation). - where(MetadataAnnotation.user_id != None). - group_by(URLMetadata.url_id).subquery() + sum_of_exist_subqueries = ( + sum( + [ + subquery.c.exists + for subquery in exist_subqueries] + ) ) - # Count all user agency annotations - all_user_agency_annotations_subquery = ( - select( - UserUrlAgencySuggestion.url_id, - func.count(UserUrlAgencySuggestion.agency_id).label("user_count") - ).group_by(UserUrlAgencySuggestion.url_id).subquery() + count_subqueries = [ + count_subquery(model=model) + for model in models + ] + + sum_of_count_subqueries = ( + sum( + [ + subquery.c.count + for subquery in count_subqueries + ] + ) ) # Basic URL query @@ -1054,43 +1015,43 @@ async def get_next_url_for_final_review( select( URL, ( - func.coalesce(distinct_auto_metadata_subquery.c.auto_count, 0) + - func.coalesce(distinct_user_metadata_subquery.c.user_count, 0) + - func.coalesce(agency_annotations_exist_subquery.c.agency_annotations_exist, 0) + - func.coalesce(agency_user_annotations_exist_subquery.c.agency_user_annotations_exist, 0) + sum_of_exist_subqueries ).label("total_distinct_annotation_count"), ( - func.coalesce(all_auto_metadata_subquery.c.auto_count, 0) + - func.coalesce(all_user_metadata_subquery.c.user_count, 0) + - func.coalesce(all_user_agency_annotations_subquery.c.user_count, 0) + - func.coalesce(agency_annotations_exist_subquery.c.agency_annotations_exist, 0) + sum_of_count_subqueries ).label("total_overall_annotation_count") - ).outerjoin( - distinct_auto_metadata_subquery, URL.id == distinct_auto_metadata_subquery.c.url_id - ).outerjoin( - distinct_user_metadata_subquery, URL.id == distinct_user_metadata_subquery.c.url_id - ).outerjoin( - agency_annotations_exist_subquery, URL.id == agency_annotations_exist_subquery.c.id - ).outerjoin( - agency_user_annotations_exist_subquery, URL.id == agency_user_annotations_exist_subquery.c.id - ).outerjoin( - all_auto_metadata_subquery, URL.id == all_auto_metadata_subquery.c.url_id - ).outerjoin( - all_user_metadata_subquery, URL.id == all_user_metadata_subquery.c.url_id - ).outerjoin( - all_user_agency_annotations_subquery, URL.id == all_user_agency_annotations_subquery.c.url_id - ).where( - URL.outcome == URLStatus.PENDING.value ) ) + + for subquery in (exist_subqueries + count_subqueries): + url_query = url_query.outerjoin( + subquery, URL.id == subquery.c.url_id + ) + + url_query = url_query.where( + URL.outcome == URLStatus.PENDING.value + ) + + single_join_relationships = [ + URL.agency, + URL.html_content, + URL.auto_record_type_suggestion, + URL.auto_relevant_suggestion, + URL.user_relevant_suggestions, + URL.user_record_type_suggestions, + ] + options = [ - joinedload(URL.html_content), - joinedload(URL.url_metadata).joinedload(URLMetadata.annotations), - joinedload(URL.automated_agency_suggestions).joinedload(AutomatedUrlAgencySuggestion.agency), - joinedload(URL.user_agency_suggestions).joinedload(UserUrlAgencySuggestion.agency), - joinedload(URL.confirmed_agencies).joinedload(ConfirmedUrlAgency.agency), + joinedload(relationship) for relationship in single_join_relationships ] + double_join_relationships = [ + (URL.automated_agency_suggestions, AutomatedUrlAgencySuggestion.agency), + (URL.user_agency_suggestions, UserUrlAgencySuggestion.agency) + ] + for primary, secondary in double_join_relationships: + options.append(joinedload(primary).joinedload(secondary)) + # Apply options url_query = url_query.options(*options) @@ -1116,23 +1077,24 @@ async def get_next_url_for_final_review( html_content = result.html_content html_content_infos = [URLHTMLContentInfo(**html_info.__dict__) for html_info in html_content] - automated_agency_suggestions = result.automated_agency_suggestions - user_agency_suggestions = result.user_agency_suggestions - confirmed_agencies = result.confirmed_agencies - url_metadatas = result.url_metadata - # Return return GetNextURLForFinalReviewResponse( id=result.id, url=result.url, html_info=convert_to_response_html_info(html_content_infos), annotations=FinalReviewAnnotationInfo( - relevant=DTOConverter.final_review_annotation_relevant_info(url_metadatas), - record_type=DTOConverter.final_review_annotation_record_type_info(url_metadatas), + relevant=DTOConverter.final_review_annotation_relevant_info( + user_suggestions=result.user_relevant_suggestions, + auto_suggestion=result.auto_relevant_suggestion + ), + record_type=DTOConverter.final_review_annotation_record_type_info( + user_suggestions=result.user_record_type_suggestions, + auto_suggestion=result.auto_record_type_suggestion + ), agency=DTOConverter.final_review_annotation_agency_info( - automated_agency_suggestions=automated_agency_suggestions, - confirmed_agencies=confirmed_agencies, - user_agency_suggestions=user_agency_suggestions + automated_agency_suggestions=result.automated_agency_suggestions, + user_agency_suggestions=result.user_agency_suggestions, + confirmed_agency=result.agency ) ) ) @@ -1142,96 +1104,33 @@ async def approve_url( self, session: AsyncSession, url_id: int, - record_type: Optional[RecordType] = None, - relevant: Optional[bool] = None, + record_type: RecordType, + relevant: bool, agency_id: Optional[int] = None ) -> None: - async def set_approved_metadata( - attribute: URLMetadataAttributeType, - value: Optional[str] - ): - selected_metadata = None - for metadata in metadatas: - if metadata.attribute == attribute.value: - selected_metadata = metadata - break - - # If metadata doesn't exist, create it - if selected_metadata is None: - # If a value was not provided for this metadata, raise an error. - if value is None: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail=f"Must specify {attribute.value} value if URL does not already have a {attribute.value} metadata entry" - ) - - metadata_obj = URLMetadata( - attribute=attribute.value, - value=value, - validation_status=ValidationStatus.VALIDATED.value, - validation_source=ValidationSource.MANUAL.value, - url_id=url_id - ) - url.url_metadata.append(metadata_obj) - - else: - - # If value was provided, overwrite existing value. Otherwise, ignore - if value is not None: - selected_metadata.value = value - - # Mark metadata as validated - selected_metadata.validation_status = ValidationStatus.VALIDATED.value - selected_metadata.validation_source = ValidationSource.MANUAL.value - # Get URL query = ( Select(URL) .where(URL.id == url_id) - .options( - selectinload(URL.url_metadata), - selectinload(URL.confirmed_agencies) - ) ) url = await session.execute(query) url = url.scalars().first() - metadatas = url.url_metadata - - await set_approved_metadata( - attribute=URLMetadataAttributeType.RECORD_TYPE, - value=record_type - ) + url.record_type = record_type.value + url.relevant = relevant - await set_approved_metadata( - attribute=URLMetadataAttributeType.RELEVANT, - value=relevant - ) - - # Check if agency_id exists as confirmed agency - confirmed_agency = url.confirmed_agencies[0] if len(url.confirmed_agencies) > 0 else None - - # If it doesn't, create it - if confirmed_agency is None: - if agency_id is None: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="Must specify agency_id if URL does not already have a confirmed agency" - ) - - confirmed_agency = ConfirmedUrlAgency( - agency_id=agency_id, - url_id=url_id + if url.agency_id is None and agency_id is None: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="Must specify agency_id if URL does not already have a confirmed agency" ) - url.confirmed_agencies.append(confirmed_agency) - # If a different agency exists as confirmed, overwrite it - elif confirmed_agency.agency_id != agency_id and agency_id is not None: - confirmed_agency.agency_id = agency_id + if url.agency_id != agency_id and agency_id is not None: + url.agency_id = agency_id # If it does, do nothing - url.outcome = URLStatus.APPROVED.value + url.outcome = URLStatus.VALIDATED.value diff --git a/collector_db/DTOConverter.py b/collector_db/DTOConverter.py index 9b2b0d24..6bf9a967 100644 --- a/collector_db/DTOConverter.py +++ b/collector_db/DTOConverter.py @@ -1,6 +1,10 @@ -from collector_db.DTOs.URLHTMLContentInfo import HTMLContentType +from typing import Optional + +from collector_db.DTOs.URLHTMLContentInfo import HTMLContentType, URLHTMLContentInfo +from collector_db.DTOs.URLWithHTML import URLWithHTML from collector_db.enums import ValidationStatus, ValidationSource, URLMetadataAttributeType -from collector_db.models import AutomatedUrlAgencySuggestion, UserUrlAgencySuggestion, URLHTMLContent +from collector_db.models import AutomatedUrlAgencySuggestion, UserUrlAgencySuggestion, URLHTMLContent, URL, Agency, \ + AutoRecordTypeSuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion, AutoRelevantSuggestion from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo from core.DTOs.GetNextURLForFinalReviewResponse import FinalReviewAnnotationRelevantInfo, \ FinalReviewAnnotationRelevantUsersInfo, FinalReviewAnnotationRecordTypeInfo, FinalReviewAnnotationAgencyAutoInfo, \ @@ -8,91 +12,58 @@ from core.enums import RecordType, SuggestionType from html_tag_collector.DataClassTags import convert_to_response_html_info, ResponseHTMLInfo, ENUM_TO_ATTRIBUTE_MAPPING - -# -# def get_url_metadata( -# url_metadatas: list[URLMetadata], -# validation_status: ValidationStatus, -# validation_source: ValidationSource, -# attribute: URLMetadataAttributeType -# ): -# for url_metadata in url_metadatas: -# if url_metadata.validation_status != validation_status.value: -# continue -# if url_metadata.validation_source != validation_source.value: -# continue -# if url_metadata.attribute != attribute.value: -# continue -# return url_metadata -# - - class DTOConverter: """ Converts SQLAlchemy objects to DTOs """ - # - # @staticmethod - # def final_review_annotation_relevant_info( - # url_metadatas: list[URLMetadata] - # ) -> FinalReviewAnnotationRelevantInfo: - # relevant_metadata = get_url_metadata( - # url_metadatas=url_metadatas, - # validation_status=ValidationStatus.PENDING_VALIDATION, - # validation_source=ValidationSource.MACHINE_LEARNING, - # attribute=URLMetadataAttributeType.RELEVANT - # ) - # auto_value = relevant_metadata.value if relevant_metadata else None - # if auto_value is not None: - # auto_value = (auto_value == "True") - # - # - # annotations: list[MetadataAnnotation] = relevant_metadata.annotations if relevant_metadata else [] - # relevant_count = 0 - # not_relevant_count = 0 - # for annotation in annotations: - # if annotation.value == "True": - # relevant_count += 1 - # else: - # not_relevant_count += 1 - # return FinalReviewAnnotationRelevantInfo( - # auto=auto_value, - # users=FinalReviewAnnotationRelevantUsersInfo( - # relevant=relevant_count, - # not_relevant=not_relevant_count - # ) - # ) - # - # @staticmethod - # def final_review_annotation_record_type_info( - # url_metadata: list[URLMetadata] - # ): - # record_type_metadata = get_url_metadata( - # url_metadatas=url_metadata, - # validation_status=ValidationStatus.PENDING_VALIDATION, - # validation_source=ValidationSource.MACHINE_LEARNING, - # attribute=URLMetadataAttributeType.RECORD_TYPE - # ) - # user_count = {} - # if record_type_metadata is None: - # auto_value = None - # annotations = [] - # else: - # auto_value = RecordType(record_type_metadata.value) - # annotations = record_type_metadata.annotations - # for annotation in annotations: - # value = RecordType(annotation.value) - # if value not in user_count: - # user_count[value] = 0 - # user_count[value] += 1 - # # Sort users by count, descending - # user_count = dict(sorted(user_count.items(), key=lambda x: x[1], reverse=True)) - # - # return FinalReviewAnnotationRecordTypeInfo( - # auto=auto_value, - # users=user_count - # ) + + @staticmethod + def final_review_annotation_relevant_info( + user_suggestions: list[UserRelevantSuggestion], + auto_suggestion: AutoRelevantSuggestion + ) -> FinalReviewAnnotationRelevantInfo: + + auto_value = auto_suggestion.relevant if auto_suggestion else None + + relevant_count = 0 + not_relevant_count = 0 + for suggestion in user_suggestions: + if suggestion.relevant: + relevant_count += 1 + else: + not_relevant_count += 1 + return FinalReviewAnnotationRelevantInfo( + auto=auto_value, + users=FinalReviewAnnotationRelevantUsersInfo( + relevant=relevant_count, + not_relevant=not_relevant_count + ) + ) + + @staticmethod + def final_review_annotation_record_type_info( + user_suggestions: list[UserRecordTypeSuggestion], + auto_suggestion: AutoRecordTypeSuggestion + ): + + user_count = {} + if auto_suggestion is None: + auto_value = None + else: + auto_value = RecordType(auto_suggestion.record_type) + for suggestion in user_suggestions: + value = RecordType(suggestion.record_type) + if value not in user_count: + user_count[value] = 0 + user_count[value] += 1 + # Sort users by count, descending + user_count = dict(sorted(user_count.items(), key=lambda x: x[1], reverse=True)) + + return FinalReviewAnnotationRecordTypeInfo( + auto=auto_value, + users=user_count + ) @staticmethod def final_review_annotation_agency_auto_info( @@ -105,7 +76,6 @@ def final_review_annotation_agency_auto_info( suggestions=[] ) - if len(automated_agency_suggestions) == 1: suggestion = automated_agency_suggestions[0] unknown = suggestion.is_unknown @@ -160,44 +130,64 @@ def user_url_agency_suggestion_to_final_review_annotation_agency_user_info( # Return sorted return dict(sorted(d.items(), key=lambda x: x[1].count, reverse=True)) - # - # @staticmethod - # def final_review_annotation_agency_info( - # automated_agency_suggestions: list[AutomatedUrlAgencySuggestion], - # confirmed_agencies: list[ConfirmedUrlAgency], - # user_agency_suggestions: list[UserUrlAgencySuggestion] - # ): - # if len(confirmed_agencies) == 1: - # confirmed_agency = confirmed_agencies[0] - # confirmed_agency_info = GetNextURLForAgencyAgencyInfo( - # suggestion_type=SuggestionType.CONFIRMED, - # pdap_agency_id=confirmed_agency.agency_id, - # agency_name=confirmed_agency.agency.name, - # state=confirmed_agency.agency.state, - # county=confirmed_agency.agency.county, - # locality=confirmed_agency.agency.locality - # ) - # return FinalReviewAnnotationAgencyInfo( - # confirmed=confirmed_agency_info, - # users=None, - # auto=None - # ) - # - # - # agency_auto_info = DTOConverter.final_review_annotation_agency_auto_info( - # automated_agency_suggestions - # ) - # - # agency_user_info = DTOConverter.user_url_agency_suggestion_to_final_review_annotation_agency_user_info( - # user_agency_suggestions - # ) - # - # return FinalReviewAnnotationAgencyInfo( - # confirmed=None, - # users=agency_user_info, - # auto=agency_auto_info - # ) - # + + @staticmethod + def final_review_annotation_agency_info( + automated_agency_suggestions: list[AutomatedUrlAgencySuggestion], + confirmed_agency: Optional[Agency], + user_agency_suggestions: list[UserUrlAgencySuggestion] + ): + if confirmed_agency is not None: + confirmed_agency_info = GetNextURLForAgencyAgencyInfo( + suggestion_type=SuggestionType.CONFIRMED, + pdap_agency_id=confirmed_agency.agency_id, + agency_name=confirmed_agency.name, + state=confirmed_agency.state, + county=confirmed_agency.county, + locality=confirmed_agency.locality + ) + return FinalReviewAnnotationAgencyInfo( + confirmed=confirmed_agency_info, + users=None, + auto=None + ) + + agency_auto_info = DTOConverter.final_review_annotation_agency_auto_info( + automated_agency_suggestions + ) + + agency_user_info = DTOConverter.user_url_agency_suggestion_to_final_review_annotation_agency_user_info( + user_agency_suggestions + ) + + return FinalReviewAnnotationAgencyInfo( + confirmed=None, + users=agency_user_info, + auto=agency_auto_info + ) + + + @staticmethod + def url_list_to_url_with_html_list(url_list: list[URL]) -> list[URLWithHTML]: + return [DTOConverter.url_to_url_with_html(url) for url in url_list] + + @staticmethod + def url_to_url_with_html(url: URL) -> URLWithHTML: + url_val = url.url + url_id = url.id + html_infos = [] + for html_info in url.html_content: + html_infos.append( + URLHTMLContentInfo( + **html_info.__dict__ + ) + ) + + return URLWithHTML( + url=url_val, + url_id=url_id, + html_infos=html_infos + ) @staticmethod def html_content_list_to_html_response_info(html_content_list: list[URLHTMLContent]): diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index b3ab5312..d69dd078 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -1,3 +1,4 @@ +from typing import Any from sqlalchemy import Select, select, exists, Table, func, Subquery from sqlalchemy.orm import aliased @@ -19,6 +20,22 @@ def pending_urls_without_html_data() -> Select: where(URLHTMLContent.id == None). where(URL.outcome == URLStatus.PENDING.value)) + + + @staticmethod + def exclude_urls_with_extant_model( + statement: Select, + model: Any + ): + return (statement.where( + ~exists( + select(model.id). + where( + model.url_id == URL.id + ) + ) + )) + @staticmethod def exclude_urls_with_select_metadata( statement: Select, @@ -64,11 +81,9 @@ def exclude_urls_with_agency_suggestions( ): # Aliases for clarity AutomatedSuggestion = aliased(AutomatedUrlAgencySuggestion) - ConfirmedAgency = aliased(ConfirmedUrlAgency) statement = (statement .where(~exists().where(AutomatedSuggestion.url_id == URL.id)) # Exclude if automated suggestions exist - .where(~exists().where(ConfirmedAgency.url_id == URL.id)) ) # Exclude if confirmed agencies exist return statement diff --git a/collector_db/models.py b/collector_db/models.py index 8e3d2a7d..51fc4a2a 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -92,8 +92,7 @@ class URL(Base): postgresql.ENUM( 'pending', 'submitted', - 'human_labeling', - 'rejected', + 'validated', 'duplicate', 'error', name='url_status' @@ -116,63 +115,19 @@ class URL(Base): secondary="link_task_urls", back_populates="urls", ) - agency = relationship("Agency", back_populates="urls") - automated_agency_suggestions = relationship("AutomatedUrlAgencySuggestion", back_populates="url") - user_agency_suggestions = relationship("UserUrlAgencySuggestion", back_populates="url") - auto_record_type_suggestions = relationship("AutoRecordTypeSuggestion", back_populates="url") - user_record_type_suggestions = relationship("UserRecordTypeSuggestion", back_populates="url") - auto_relevant_suggestions = relationship("AutoRelevantSuggestion", back_populates="url") - user_relevant_suggestions = relationship("UserRelevantSuggestion", back_populates="url") - -# # URL Metadata table definition -# class URLMetadata(Base): -# __tablename__ = 'url_metadata' -# __table_args__ = (UniqueConstraint( -# "url_id", -# "attribute", -# name="uq_url_id_attribute"), -# ) -# -# id = Column(Integer, primary_key=True, autoincrement=True) -# url_id = Column(Integer, ForeignKey('urls.id', name='url_metadata_url_id_fkey'), nullable=False) -# attribute = Column( -# PGEnum('Record Type', 'Agency', 'Relevant', name='url_attribute'), -# nullable=False) -# value = Column(Text, nullable=False) -# validation_status = Column( -# PGEnum('Pending Validation', 'Validated', name='metadata_validation_status'), -# nullable=False) -# validation_source = Column( -# PGEnum('Machine Learning', 'Label Studio', 'Manual', name='validation_source'), -# nullable=False -# ) -# notes = Column(Text, nullable=True) -# -# -# # Timestamps -# created_at = Column(TIMESTAMP, nullable=False, server_default=func.now()) -# updated_at = Column(TIMESTAMP, nullable=False, server_default=func.now(), onupdate=func.now()) -# -# # Relationships -# url = relationship("URL", back_populates="url_metadata") -# annotations = relationship("MetadataAnnotation", back_populates="url_metadata") - -# class MetadataAnnotation(Base): -# __tablename__ = 'metadata_annotations' -# __table_args__ = (UniqueConstraint( -# "user_id", -# "metadata_id", -# name="metadata_annotations_uq_user_id_metadata_id"), -# ) -# -# id = Column(Integer, primary_key=True, autoincrement=True) -# user_id = Column(Integer, nullable=False) -# metadata_id = Column(Integer, ForeignKey('url_metadata.id'), nullable=False) -# value = Column(Text, nullable=False) -# created_at = Column(TIMESTAMP, nullable=False, server_default=func.now()) -# -# # Relationships -# url_metadata = relationship("URLMetadata", back_populates="annotations") + agency = relationship("Agency", uselist=False, back_populates="urls") + automated_agency_suggestions = relationship( + "AutomatedUrlAgencySuggestion", back_populates="url") + user_agency_suggestions = relationship( + "UserUrlAgencySuggestion", back_populates="url") + auto_record_type_suggestion = relationship( + "AutoRecordTypeSuggestion", uselist=False, back_populates="url") + user_record_type_suggestions = relationship( + "UserRecordTypeSuggestion", back_populates="url") + auto_relevant_suggestion = relationship( + "AutoRelevantSuggestion", uselist=False, back_populates="url") + user_relevant_suggestions = relationship( + "UserRelevantSuggestion", back_populates="url") class RootURL(Base): __tablename__ = 'root_url_cache' @@ -409,7 +364,7 @@ class AutoRelevantSuggestion(Base): # Relationships - url = relationship("URL", back_populates="auto_relevant_suggestions") + url = relationship("URL", back_populates="auto_relevant_suggestion") class AutoRecordTypeSuggestion(Base): @@ -427,7 +382,7 @@ class AutoRecordTypeSuggestion(Base): # Relationships - url = relationship("URL", back_populates="auto_record_type_suggestions") + url = relationship("URL", back_populates="auto_record_type_suggestion") class UserRelevantSuggestion(Base): __tablename__ = "user_relevant_suggestions" diff --git a/collector_manager/enums.py b/collector_manager/enums.py index b4289488..e90ee7db 100644 --- a/collector_manager/enums.py +++ b/collector_manager/enums.py @@ -12,8 +12,6 @@ class CollectorType(Enum): class URLStatus(Enum): PENDING = "pending" SUBMITTED = "submitted" - HUMAN_LABELING = "human_labeling" - REJECTED = "rejected" - DUPLICATE = "duplicate" + VALIDATED = "validated" ERROR = "error" - APPROVED = "approved" + DUPLICATE = "duplicate" diff --git a/core/AsyncCore.py b/core/AsyncCore.py index a4cea685..a576082f 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -8,6 +8,7 @@ from collector_db.DTOs.URLAnnotationInfo import URLAnnotationInfo from collector_db.enums import TaskType, URLMetadataAttributeType from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo +from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo @@ -131,50 +132,6 @@ async def handle_task_error(self, run_info: TaskOperatorRunInfo): await self.adb_client.update_task_status(task_id=run_info.task_id, status=BatchStatus.ERROR) await self.adb_client.add_task_error(task_id=run_info.task_id, error=run_info.message) - async def convert_to_annotation_request_info(self, url_info: URLAnnotationInfo) -> AnnotationRequestInfo: - response_html_info = convert_to_response_html_info( - html_content_infos=url_info.html_infos - ) - - return AnnotationRequestInfo( - url=url_info.url, - metadata_id=url_info.metadata_id, - html_info=response_html_info, - suggested_value=url_info.suggested_value - ) - - async def get_next_url_for_annotation(self, user_id: int, metadata_type: URLMetadataAttributeType) -> GetNextURLForAnnotationResponse: - response = GetNextURLForAnnotationResponse() - ua_info: URLAnnotationInfo = await self.adb_client.get_next_url_for_annotation( - user_id=user_id, - metadata_type=metadata_type - ) - if ua_info is None: - return response - # Format result - result = await self.convert_to_annotation_request_info(url_info=ua_info) - response.next_annotation = result - return response - - async def submit_and_get_next_url_for_annotation( - self, - user_id: int, - metadata_id: int, - annotation: str, - metadata_type: URLMetadataAttributeType - ) -> GetNextURLForAnnotationResponse: - await self.submit_url_annotation( - user_id=user_id, - metadata_id=metadata_id, - annotation=annotation, - metadata_type=metadata_type - ) - result = await self.get_next_url_for_annotation( - user_id=user_id, - metadata_type=metadata_type - ) - return result - async def submit_url_relevance_annotation( self, user_id: int, @@ -205,24 +162,16 @@ async def submit_url_record_type_annotation( url_id: int, record_type: RecordType ): - return await self.adb_client.add_user_record_type_suggestion( + await self.adb_client.add_user_record_type_suggestion( user_id=user_id, url_id=url_id, record_type=record_type ) + next_annotation = await self.adb_client.get_next_url_for_record_type_annotation(user_id=user_id) + return GetNextRecordTypeAnnotationResponseOuterInfo( + next_annotation=next_annotation + ) - async def submit_url_annotation( - self, - user_id: int, - metadata_id: int, - annotation: str, - metadata_type: URLMetadataAttributeType - ) -> GetNextURLForAnnotationResponse: - await self.adb_client.add_metadata_annotation( - user_id=user_id, - metadata_id=metadata_id, - annotation=annotation) - return await self.get_next_url_for_annotation(user_id=user_id, metadata_type=metadata_type) async def get_urls(self, page: int, errors: bool) -> GetURLsResponseInfo: return await self.adb_client.get_urls(page=page, errors=errors) diff --git a/core/DTOs/FinalReviewApprovalInfo.py b/core/DTOs/FinalReviewApprovalInfo.py index 96af2f87..210a07e3 100644 --- a/core/DTOs/FinalReviewApprovalInfo.py +++ b/core/DTOs/FinalReviewApprovalInfo.py @@ -9,12 +9,12 @@ class FinalReviewApprovalInfo(BaseModel): url_id: int = Field( title="The id of the URL." ) - record_type: Optional[RecordType] = Field( + record_type: RecordType = Field( title="The final record type of the URL." "If none, defers to the existing value from the auto-labeler only if it exists.", default=None ) - relevant: Optional[bool] = Field( + relevant: bool = Field( title="Final determination on whether the URL is relevant." "If none, defers to the existing value from the auto-labeler only if it exists.", default=None diff --git a/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py b/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py new file mode 100644 index 00000000..783b5516 --- /dev/null +++ b/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py @@ -0,0 +1,22 @@ +from typing import Optional + +from pydantic import Field, BaseModel + +from collector_db.DTOs.URLMapping import URLMapping +from core.enums import RecordType +from html_tag_collector.DataClassTags import ResponseHTMLInfo + + +class GetNextRecordTypeAnnotationResponseInfo(BaseModel): + url_info: URLMapping = Field( + title="Information about the URL" + ) + suggested_record_type: Optional[RecordType] = Field( + title="Whether the auto-labeler identified the URL as relevant or not" + ) + html_info: ResponseHTMLInfo = Field( + title="HTML information about the URL" + ) + +class GetNextRecordTypeAnnotationResponseOuterInfo(BaseModel): + next_annotation: Optional[GetNextRecordTypeAnnotationResponseInfo] diff --git a/core/DTOs/GetNextURLForFinalReviewResponse.py b/core/DTOs/GetNextURLForFinalReviewResponse.py index 8a7077a1..fad414af 100644 --- a/core/DTOs/GetNextURLForFinalReviewResponse.py +++ b/core/DTOs/GetNextURLForFinalReviewResponse.py @@ -2,7 +2,6 @@ from pydantic import BaseModel, Field -from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo from core.enums import RecordType from html_tag_collector.DataClassTags import ResponseHTMLInfo diff --git a/core/DTOs/GetURLsResponseInfo.py b/core/DTOs/GetURLsResponseInfo.py index 796b6494..162e92b5 100644 --- a/core/DTOs/GetURLsResponseInfo.py +++ b/core/DTOs/GetURLsResponseInfo.py @@ -29,7 +29,6 @@ class GetURLsResponseInnerInfo(BaseModel): updated_at: datetime.datetime created_at: datetime.datetime errors: list[GetURLsResponseErrorInfo] - metadata: list[GetURLsResponseMetadataInfo] class GetURLsResponseInfo(BaseModel): urls: list[GetURLsResponseInnerInfo] diff --git a/core/classes/URLRecordTypeTaskOperator.py b/core/classes/URLRecordTypeTaskOperator.py index 6287bcae..3f94811f 100644 --- a/core/classes/URLRecordTypeTaskOperator.py +++ b/core/classes/URLRecordTypeTaskOperator.py @@ -1,7 +1,6 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo -from collector_db.enums import URLMetadataAttributeType, TaskType, ValidationStatus, ValidationSource +from collector_db.enums import TaskType from core.DTOs.task_data_objects.URLRecordTypeTDO import URLRecordTypeTDO from core.classes.TaskOperatorBase import TaskOperatorBase from core.enums import RecordType @@ -23,14 +22,10 @@ def task_type(self): return TaskType.RECORD_TYPE async def meets_task_prerequisites(self): - return await self.adb_client.has_pending_urls_with_html_data_and_without_metadata_type( - without_metadata_type=URLMetadataAttributeType.RECORD_TYPE - ) + return await self.adb_client.has_urls_with_html_data_and_without_auto_record_type_suggestion() async def get_tdos(self) -> list[URLRecordTypeTDO]: - urls_with_html = await self.adb_client.get_urls_with_html_data_and_without_metadata_type( - without_metadata_type=URLMetadataAttributeType.RECORD_TYPE - ) + urls_with_html = await self.adb_client.get_urls_with_html_data_and_without_auto_record_type_suggestion() tdos = [URLRecordTypeTDO(url_with_html=url_with_html) for url_with_html in urls_with_html] return tdos @@ -58,18 +53,12 @@ async def update_errors_in_database(self, tdos: list[URLRecordTypeTDO]): await self.adb_client.add_url_error_infos(error_infos) async def put_results_into_database(self, tdos: list[URLRecordTypeTDO]): - url_metadatas = [] + suggestions = [] for tdo in tdos: - url_metadata = URLMetadataInfo( - url_id=tdo.url_with_html.url_id, - attribute=URLMetadataAttributeType.RECORD_TYPE, - value=str(tdo.record_type.value), - validation_status=ValidationStatus.PENDING_VALIDATION, - validation_source=ValidationSource.MACHINE_LEARNING, - notes=self.classifier.model_name - ) - url_metadatas.append(url_metadata) - await self.adb_client.add_url_metadatas(url_metadatas) + url_id = tdo.url_with_html.url_id + record_type = tdo.record_type + suggestions.append((url_id, record_type)) + await self.adb_client.add_auto_record_type_suggestions(suggestions) async def separate_success_and_error_subsets(self, tdos: list[URLRecordTypeTDO]): success_subset = [tdo for tdo in tdos if not tdo.is_errored()] diff --git a/core/classes/URLRelevanceHuggingfaceTaskOperator.py b/core/classes/URLRelevanceHuggingfaceTaskOperator.py index 2d54a856..e6ebdc3d 100644 --- a/core/classes/URLRelevanceHuggingfaceTaskOperator.py +++ b/core/classes/URLRelevanceHuggingfaceTaskOperator.py @@ -22,14 +22,12 @@ def task_type(self): return TaskType.RELEVANCY async def meets_task_prerequisites(self): - return await self.adb_client.has_pending_urls_with_html_data_and_without_metadata_type() + return await self.adb_client.has_urls_with_html_data_and_without_auto_relevant_suggestion() async def inner_task_logic(self): # Get pending urls from Source Collector # with HTML data and without Relevancy Metadata - tdos = await self.get_pending_url_info( - without_metadata_attribute=URLMetadataAttributeType.RELEVANT - ) + tdos = await self.get_pending_url_info() url_ids = [tdo.url_with_html.url_id for tdo in tdos] await self.link_urls_to_task(url_ids=url_ids) # Pipe into Huggingface @@ -39,17 +37,13 @@ async def inner_task_logic(self): await self.put_results_into_database(tdos) async def put_results_into_database(self, tdos): - url_metadatas = [] + suggestions: list[tuple[int, bool]] = [] for tdo in tdos: - url_metadata = URLMetadataInfo( - url_id=tdo.url_with_html.url_id, - attribute=URLMetadataAttributeType.RELEVANT, - value=str(tdo.relevant), - validation_status=ValidationStatus.PENDING_VALIDATION, - validation_source=ValidationSource.MACHINE_LEARNING - ) - url_metadatas.append(url_metadata) - await self.adb_client.add_url_metadatas(url_metadatas) + url_id = tdo.url_with_html.url_id + relevant = tdo.relevant + suggestions.append((url_id, relevant)) + + await self.adb_client.add_auto_relevance_suggestions(suggestions) async def add_huggingface_relevancy(self, tdos: list[URLRelevanceHuggingfaceTDO]): urls_with_html = [tdo.url_with_html for tdo in tdos] @@ -59,12 +53,9 @@ async def add_huggingface_relevancy(self, tdos: list[URLRelevanceHuggingfaceTDO] async def get_pending_url_info( self, - without_metadata_attribute: URLMetadataAttributeType ) -> list[URLRelevanceHuggingfaceTDO]: tdos = [] - pending_urls: list[URLWithHTML] = await self.adb_client.get_urls_with_html_data_and_without_metadata_type( - without_metadata_type=without_metadata_attribute - ) + pending_urls: list[URLWithHTML] = await self.adb_client.get_urls_with_html_data_and_without_auto_relevant_suggestion() for url_with_html in pending_urls: tdo = URLRelevanceHuggingfaceTDO( url_with_html=url_with_html diff --git a/local_database/DataDumper/dump.sh b/local_database/DataDumper/dump.sh index fd63c65f..fb514157 100644 --- a/local_database/DataDumper/dump.sh +++ b/local_database/DataDumper/dump.sh @@ -1,5 +1,5 @@ #!/bin/bash -set -e +#set -e # Variables (customize these or pass them as environment variables) DB_HOST=${DUMP_HOST:-"postgres_container"} DB_USER=${DUMP_USER:-"your_user"} diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index b33051b5..5288496b 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -15,7 +15,7 @@ from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource, TaskType from collector_manager.enums import CollectorType, URLStatus from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from core.enums import BatchStatus, SuggestionType +from core.enums import BatchStatus, SuggestionType, RecordType from tests.helpers.simple_test_data_functions import generate_test_urls @@ -85,6 +85,40 @@ async def auto_relevant_suggestions(self, url_id: int, relevant: bool = True): relevant=relevant ) + async def user_relevant_suggestion( + self, + url_id: int, + user_id: Optional[int] = None, + relevant: bool = True + ): + if user_id is None: + user_id = randint(1, 99999999) + await self.adb_client.add_user_relevant_suggestion( + url_id=url_id, + user_id=user_id, + relevant=relevant + ) + + async def user_record_type_suggestion( + self, + url_id: int, + record_type: RecordType, + user_id: Optional[int] = None, + ): + if user_id is None: + user_id = randint(1, 99999999) + await self.adb_client.add_user_record_type_suggestion( + url_id=url_id, + user_id=user_id, + record_type=record_type + ) + + async def auto_record_type_suggestions(self, url_id: int, record_type: RecordType): + await self.adb_client.add_auto_record_type_suggestion( + url_id=url_id, + record_type=record_type + ) + async def auto_suggestions( self, @@ -192,28 +226,6 @@ async def html_data(self, url_ids: list[int]): ) await self.adb_client.add_html_content_infos(html_content_infos) - async def metadata( - self, - url_ids: list[int], - attribute: URLMetadataAttributeType = URLMetadataAttributeType.RELEVANT, - value: str = "False", - validation_status: ValidationStatus = ValidationStatus.PENDING_VALIDATION, - validation_source: ValidationSource = ValidationSource.MACHINE_LEARNING - ) -> list[int]: - metadata_ids = [] - for url_id in url_ids: - metadata_id = await self.adb_client.add_url_metadata( - URLMetadataInfo( - url_id=url_id, - attribute=attribute, - value=value, - validation_status=validation_status, - validation_source=validation_source, - ) - ) - metadata_ids.append(metadata_id) - return metadata_ids - async def error_info( self, url_ids: list[int], @@ -231,19 +243,6 @@ async def error_info( error_infos.append(url_error_info) await self.adb_client.add_url_error_infos(error_infos) - async def user_annotation( - self, - metadata_id: int, - user_id: Optional[int] = None, - annotation: str = "test annotation" - ): - if user_id is None: - user_id = randint(1, 99999999) - await self.adb_client.add_metadata_annotation( - user_id=user_id, - metadata_id=metadata_id, - annotation=annotation - ) async def agency_auto_suggestions( self, diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index b45fb14a..44415090 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -18,14 +18,7 @@ async def setup_for_get_next_url_for_final_review( url_mapping = db_data_creator.urls(batch_id=batch_id, url_count=1).url_mappings[0] await db_data_creator.html_data([url_mapping.url_id]) - async def add_metadata_annotation(count: int, value: str, metadata_id: int): - for i in range(count): - await db_data_creator.user_annotation( - metadata_id=metadata_id, - annotation=value - ) - - async def add_user_suggestion(count: int): + async def add_agency_suggestion(count: int): agency_id = await db_data_creator.agency() for i in range(count): await db_data_creator.agency_user_suggestions( @@ -33,34 +26,41 @@ async def add_user_suggestion(count: int): agency_id=agency_id ) - relevant_metadata_ids = await db_data_creator.metadata( - url_ids=[url_mapping.url_id], - attribute=URLMetadataAttributeType.RELEVANT, - value="True", - validation_source=ValidationSource.MACHINE_LEARNING, - validation_status=ValidationStatus.PENDING_VALIDATION + async def add_record_type_suggestion(count: int, record_type: RecordType): + for i in range(count): + await db_data_creator.user_record_type_suggestion( + url_id=url_mapping.url_id, + record_type=record_type + ) + + async def add_relevant_suggestion(count: int, relevant: bool): + for i in range(count): + await db_data_creator.user_relevant_suggestion( + url_id=url_mapping.url_id, + relevant=relevant + ) + + await db_data_creator.auto_relevant_suggestions( + url_id=url_mapping.url_id, + relevant=True ) - relevant_metadata_id = relevant_metadata_ids[0] - record_type_metadata_ids = await db_data_creator.metadata( - url_ids=[url_mapping.url_id], - attribute=URLMetadataAttributeType.RECORD_TYPE, - value=RecordType.ARREST_RECORDS.value, - validation_source=ValidationSource.MACHINE_LEARNING, - validation_status=ValidationStatus.PENDING_VALIDATION + + await db_data_creator.auto_record_type_suggestions( + url_id=url_mapping.url_id, + record_type=RecordType.ARREST_RECORDS ) - record_type_metadata_id = record_type_metadata_ids[0] if include_user_annotations: - await add_metadata_annotation(annotation_count, "True", relevant_metadata_id) - await add_metadata_annotation(1, "False", relevant_metadata_id) - await add_metadata_annotation(3, RecordType.ARREST_RECORDS.value, record_type_metadata_id) - await add_metadata_annotation(2, RecordType.DISPATCH_RECORDINGS.value, record_type_metadata_id) - await add_metadata_annotation(1, RecordType.ACCIDENT_REPORTS.value, record_type_metadata_id) + await add_relevant_suggestion(annotation_count, True) + await add_relevant_suggestion(1, False) + await add_record_type_suggestion(3, RecordType.ARREST_RECORDS) + await add_record_type_suggestion(2, RecordType.DISPATCH_RECORDINGS) + await add_record_type_suggestion(1, RecordType.ACCIDENT_REPORTS) if include_user_annotations: # Add user suggestions for agencies, one suggested by 3 users, another by 2, another by 1 for i in range(annotation_count): - await add_user_suggestion(i + 1) + await add_agency_suggestion(i + 1) return url_mapping diff --git a/tests/manual/html_collector/test_html_tag_collector_integration.py b/tests/manual/html_collector/test_html_tag_collector_integration.py index 1673ca42..7018d5aa 100644 --- a/tests/manual/html_collector/test_html_tag_collector_integration.py +++ b/tests/manual/html_collector/test_html_tag_collector_integration.py @@ -1,4 +1,3 @@ -import polars as pl import pytest from collector_db.AsyncDatabaseClient import AsyncDatabaseClient diff --git a/tests/test_alembic/test_revisions.py b/tests/test_alembic/test_revisions.py index 343890df..9bc287d1 100644 --- a/tests/test_alembic/test_revisions.py +++ b/tests/test_alembic/test_revisions.py @@ -372,4 +372,9 @@ def test_revise_agency_suggestions(alembic_runner): assert not alembic_runner.tables_exist(tables_to_check) alembic_runner.upgrade("d7eb670edaf0") assert not alembic_runner.table_exists("url_agency_suggestions") - assert alembic_runner.tables_exist(tables_to_check) \ No newline at end of file + assert alembic_runner.tables_exist(tables_to_check) + +def test_full_upgrade_downgrade(alembic_runner): + # Both should run without error + alembic_runner.upgrade("head") + alembic_runner.downgrade("base") \ No newline at end of file diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index 8a7cd487..064e9912 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -12,6 +12,7 @@ from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse +from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo, \ GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ @@ -180,22 +181,22 @@ def get_next_relevance_annotation(self) -> GetNextRelevanceAnnotationResponseOut ) return GetNextRelevanceAnnotationResponseOuterInfo(**data) - def get_next_record_type_annotation(self) -> GetNextURLForAnnotationResponse: + def get_next_record_type_annotation(self) -> GetNextRecordTypeAnnotationResponseOuterInfo: data = self.get( url=f"/annotate/record-type" ) - return GetNextURLForAnnotationResponse(**data) + return GetNextRecordTypeAnnotationResponseOuterInfo(**data) def post_record_type_annotation_and_get_next( self, - metadata_id: int, + url_id: int, record_type_annotation_post_info: RecordTypeAnnotationPostInfo - ) -> GetNextURLForAnnotationResponse: + ) -> GetNextRecordTypeAnnotationResponseOuterInfo: data = self.post( - url=f"/annotate/record-type/{metadata_id}", + url=f"/annotate/record-type/{url_id}", json=record_type_annotation_post_info.model_dump(mode='json') ) - return GetNextURLForAnnotationResponse(**data) + return GetNextRecordTypeAnnotationResponseOuterInfo(**data) def post_relevance_annotation_and_get_next( self, diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/test_automated/integration/api/test_annotate.py index b90ad1cc..1530dcb1 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/test_automated/integration/api/test_annotate.py @@ -5,7 +5,8 @@ from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_db.DTOs.URLMapping import URLMapping from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource -from collector_db.models import UserUrlAgencySuggestion, UserRelevantSuggestion +from collector_db.models import UserUrlAgencySuggestion, UserRelevantSuggestion, UserRecordTypeSuggestion +from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import URLAgencyAnnotationPostInfo from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse @@ -29,83 +30,6 @@ def check_html_info_not_empty( assert html_info.description != "" assert html_info.title != "" -async def run_annotation_test( - api_test_helper, - submit_and_get_next_function: callable, - get_next_function: callable, - post_info: Any, - metadata_attribute: URLMetadataAttributeType, - expected_metadata_value: str -): - ath = api_test_helper - - # Create batch with status `in-process` and strategy `example` - batch_id = ath.db_data_creator.batch() - # Create 2 URLs with outcome `pending` - iui: InsertURLsInfo = ath.db_data_creator.urls(batch_id=batch_id, url_count=2) - - url_1 = iui.url_mappings[0] - url_2 = iui.url_mappings[1] - - kwargs = { - "attribute": metadata_attribute, - "validation_status": ValidationStatus.PENDING_VALIDATION, - "validation_source": ValidationSource.MACHINE_LEARNING - } - - # Add `Relevancy` attribute with value `True` to 1st URL - await ath.db_data_creator.metadata( - url_ids=[url_1.url_id], - **kwargs - ) - # and `Relevancy` attribute with value `False` to 2nd other URL - await ath.db_data_creator.metadata( - url_ids=[url_2.url_id], - **kwargs - ) - - # Add HTML data to both - await ath.db_data_creator.html_data([url_1.url_id, url_2.url_id]) - # Call `GET` `/annotate/url` and receive next URL - request_info_1: GetNextURLForAnnotationResponse = get_next_function() - inner_info_1 = request_info_1.next_annotation - - # Validate presence of HTML data in `html` field - assert inner_info_1.html_info.description != "" - assert inner_info_1.html_info.title != "" - - # Validate that the correct metadata value is returned - assert inner_info_1.suggested_value == "False" - - # Call `POST` `/annotate/url` with finished annotation, and receive next URL - request_info_2 = submit_and_get_next_function( - inner_info_1.metadata_id, - post_info - ) - inner_info_2 = request_info_2.next_annotation - # Confirm 2nd URL is distinct from 1st - assert inner_info_1.url != inner_info_2.url - - # Validate presence of appropriate HTML data in `html` field - assert inner_info_2.html_info.description != "" - assert inner_info_2.html_info.title != "" - - # Validation annotation is present in database - results = await api_test_helper.db_data_creator.adb_client.get_annotations_for_metadata_id( - metadata_id=inner_info_1.metadata_id - ) - assert len(results) == 1 - assert results[0].user_id == MOCK_USER_ID - assert results[0].value == expected_metadata_value - - # Submit this one in turn, and no subsequent annotation info should be returned - request_info_3 = submit_and_get_next_function( - inner_info_2.metadata_id, - post_info - ) - - assert request_info_3.next_annotation is None - @pytest.mark.asyncio async def test_annotate_relevancy(api_test_helper): ath = api_test_helper @@ -132,7 +56,7 @@ async def test_annotate_relevancy(api_test_helper): # Add HTML data to both await ath.db_data_creator.html_data([url_1.url_id, url_2.url_id]) - # Call `GET` `/annotate/url` and receive next URL + # Call `GET` `/annotate/relevance` and receive next URL request_info_1: GetNextRelevanceAnnotationResponseOuterInfo = api_test_helper.request_validator.get_next_relevance_annotation() inner_info_1 = request_info_1.next_annotation @@ -201,17 +125,94 @@ async def test_annotate_relevancy(api_test_helper): @pytest.mark.asyncio async def test_annotate_record_type(api_test_helper): - await run_annotation_test( - api_test_helper=api_test_helper, - submit_and_get_next_function=api_test_helper.request_validator.post_record_type_annotation_and_get_next, - get_next_function=api_test_helper.request_validator.get_next_record_type_annotation, - post_info=RecordTypeAnnotationPostInfo( - record_type=RecordType.ACCIDENT_REPORTS - ), - metadata_attribute=URLMetadataAttributeType.RECORD_TYPE, - expected_metadata_value=RecordType.ACCIDENT_REPORTS.value + ath = api_test_helper + + batch_id = ath.db_data_creator.batch() + + # Create 2 URLs with outcome `pending` + iui: InsertURLsInfo = ath.db_data_creator.urls(batch_id=batch_id, url_count=2) + + url_1 = iui.url_mappings[0] + url_2 = iui.url_mappings[1] + + # Add record type attribute with value `Accident Reports` to 1st URL + await ath.db_data_creator.auto_record_type_suggestions( + url_id=url_1.url_id, + record_type=RecordType.ACCIDENT_REPORTS + ) + + # Add 'Record Type' attribute with value `Dispatch Recordings` to 2nd URL + await ath.db_data_creator.auto_record_type_suggestions( + url_id=url_2.url_id, + record_type=RecordType.DISPATCH_RECORDINGS + ) + + # Add HTML data to both + await ath.db_data_creator.html_data([url_1.url_id, url_2.url_id]) + + # Call `GET` `/annotate/record-type` and receive next URL + request_info_1: GetNextRecordTypeAnnotationResponseOuterInfo = api_test_helper.request_validator.get_next_record_type_annotation() + inner_info_1 = request_info_1.next_annotation + + check_url_mappings_match(inner_info_1.url_info, url_1) + check_html_info_not_empty(inner_info_1.html_info) + + # Validate that the correct record type is returned + assert inner_info_1.suggested_record_type == RecordType.ACCIDENT_REPORTS + + # Annotate with value 'Personnel Records' and get next URL + request_info_2: GetNextRecordTypeAnnotationResponseOuterInfo = api_test_helper.request_validator.post_record_type_annotation_and_get_next( + url_id=inner_info_1.url_info.url_id, + record_type_annotation_post_info=RecordTypeAnnotationPostInfo( + record_type=RecordType.PERSONNEL_RECORDS + ) ) + inner_info_2 = request_info_2.next_annotation + + check_url_mappings_match(inner_info_2.url_info, url_2) + check_html_info_not_empty(inner_info_2.html_info) + + request_info_3: GetNextRecordTypeAnnotationResponseOuterInfo = api_test_helper.request_validator.post_record_type_annotation_and_get_next( + url_id=inner_info_2.url_info.url_id, + record_type_annotation_post_info=RecordTypeAnnotationPostInfo( + record_type=RecordType.ANNUAL_AND_MONTHLY_REPORTS + ) + ) + + assert request_info_3.next_annotation is None + + # Get all URL annotations. Confirm they exist for user + adb_client = ath.adb_client() + results: list[UserRecordTypeSuggestion] = await adb_client.get_all(UserRecordTypeSuggestion) + result_1 = results[0] + result_2 = results[1] + + assert result_1.url_id == inner_info_1.url_info.url_id + assert result_1.record_type == RecordType.PERSONNEL_RECORDS.value + + assert result_2.url_id == inner_info_2.url_info.url_id + assert result_2.record_type == RecordType.ANNUAL_AND_MONTHLY_REPORTS.value + + # If user submits annotation for same URL, the URL should be overwritten + + request_info_4: GetNextRecordTypeAnnotationResponseOuterInfo = api_test_helper.request_validator.post_record_type_annotation_and_get_next( + url_id=inner_info_1.url_info.url_id, + record_type_annotation_post_info=RecordTypeAnnotationPostInfo( + record_type=RecordType.BOOKING_REPORTS + ) + ) + + assert request_info_4.next_annotation is None + + results: list[UserRecordTypeSuggestion] = await adb_client.get_all(UserRecordTypeSuggestion) + assert len(results) == 2 + + for result in results: + if result.url_id == inner_info_1.url_info.url_id: + assert result.record_type == RecordType.BOOKING_REPORTS.value + + @pytest.mark.asyncio async def test_annotate_agency_multiple_auto_suggestions(api_test_helper): """ diff --git a/tests/test_automated/integration/api/test_url.py b/tests/test_automated/integration/api/test_url.py index 9ccc7e5f..fccd8e4e 100644 --- a/tests/test_automated/integration/api/test_url.py +++ b/tests/test_automated/integration/api/test_url.py @@ -21,9 +21,6 @@ async def test_get_urls(api_test_helper): url_id_1st = iui.url_mappings[0].url_id - # Add metadata - await db_data_creator.metadata(url_ids=[url_id_1st]) - # Get the latter 2 urls url_ids = [iui.url_mappings[1].url_id, iui.url_mappings[2].url_id] @@ -35,12 +32,10 @@ async def test_get_urls(api_test_helper): assert data.count == 3 assert len(data.urls) == 3 assert data.urls[0].url == iui.url_mappings[0].url - assert len(data.urls[0].metadata) == 1 for i in range(1, 3): assert data.urls[i].url == iui.url_mappings[i].url assert len(data.urls[i].errors) == 1 - assert len(data.urls[i].metadata) == 0 # Retrieve data again with errors only data: GetURLsResponseInfo = api_test_helper.request_validator.get_urls(errors=True) diff --git a/tests/test_automated/integration/collector_db/test_database_structure.py b/tests/test_automated/integration/collector_db/test_database_structure.py index 9c31c9cf..2b2fcbca 100644 --- a/tests/test_automated/integration/collector_db/test_database_structure.py +++ b/tests/test_automated/integration/collector_db/test_database_structure.py @@ -235,45 +235,6 @@ def test_url(db_data_creator: DBDataCreator): table_tester.run_column_tests() -def test_url_metadata(db_data_creator: DBDataCreator): - batch_id = db_data_creator.batch() - iui: InsertURLsInfo = db_data_creator.urls(batch_id=batch_id, url_count=1) - - - table_tester = TableTester( - table_name="url_metadata", - columns=[ - ColumnTester( - column_name="url_id", - type_=sa.Integer, - allowed_values=[iui.url_mappings[0].url_id] - ), - ColumnTester( - column_name="attribute", - type_=postgresql.ENUM, - allowed_values=["Record Type", "Agency", "Relevant"] - ), - ColumnTester( - column_name="value", - type_=sa.Text, - allowed_values=["Text"] - ), - ColumnTester( - column_name="validation_status", - type_=postgresql.ENUM, - allowed_values=["Pending Validation", "Validated"] - ), - ColumnTester( - column_name="validation_source", - type_=postgresql.ENUM, - allowed_values=["Machine Learning", "Label Studio", "Manual"] - ) - ], - engine=db_data_creator.db_client.engine - ) - - table_tester.run_column_tests() - def test_html_content(db_data_creator: DBDataCreator): batch_id = db_data_creator.batch() iui: InsertURLsInfo = db_data_creator.urls(batch_id=batch_id, url_count=1) diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 8d970d48..9ded2a28 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -9,7 +9,7 @@ from collector_db.DTOs.URLInfo import URLInfo from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource -from collector_db.models import ConfirmedUrlAgency, MetadataAnnotation, URL +from collector_db.models import URL from collector_manager.enums import URLStatus from core.enums import BatchStatus, RecordType, SuggestionType from tests.helpers.DBDataCreator import DBDataCreator @@ -111,25 +111,7 @@ def test_delete_url_updated_at(db_data_creator: DBDataCreator): url = db_client.get_urls_by_batch(batch_id=batch_id, page=1)[0] assert url.updated_at > old_updated_at -@pytest.mark.asyncio -async def test_get_url_metadata(db_data_creator: DBDataCreator): - batch_id = db_data_creator.batch() - url_id = db_data_creator.urls(batch_id=batch_id, url_count=1).url_mappings[0].url_id - - adb_client = AsyncDatabaseClient() - - await adb_client.add_url_metadata( - url_metadata_info=URLMetadataInfo( - url_id=url_id, - attribute=URLMetadataAttributeType.RELEVANT, - value="False", - validation_status=ValidationStatus.PENDING_VALIDATION, - validation_source=ValidationSource.MACHINE_LEARNING, - ) - ) - metadata = await adb_client.get_url_metadata_by_status(url_status=URLStatus.PENDING) - print(metadata) @pytest.mark.asyncio async def test_add_url_error_info(db_data_creator: DBDataCreator): @@ -162,40 +144,6 @@ async def test_add_url_error_info(db_data_creator: DBDataCreator): assert result.url_id in url_ids assert result.error == "test error" -@pytest.mark.asyncio -async def test_get_urls_with_html_data_and_no_relevancy_metadata( - db_data_creator: DBDataCreator, -): - batch_id = db_data_creator.batch() - url_mappings = db_data_creator.urls(batch_id=batch_id, url_count=3).url_mappings - url_ids = [url_info.url_id for url_info in url_mappings] - await db_data_creator.html_data(url_ids) - await db_data_creator.metadata([url_ids[0]]) - results = await db_data_creator.adb_client.get_urls_with_html_data_and_without_metadata_type( - without_metadata_type=URLMetadataAttributeType.RELEVANT - ) - - permitted_url_ids = [url_id for url_id in url_ids if url_id != url_ids[0]] - assert len(results) == 2 - for result in results: - assert result.url_id in permitted_url_ids - assert len(result.html_infos) == 2 - -@pytest.mark.asyncio -async def test_get_urls_with_metadata(db_data_creator: DBDataCreator): - batch_id = db_data_creator.batch() - url_mappings = db_data_creator.urls(batch_id=batch_id, url_count=3).url_mappings - url_ids = [url_info.url_id for url_info in url_mappings] - await db_data_creator.metadata([url_ids[0]]) - # Neither of these two URLs should be picked up - await db_data_creator.metadata([url_ids[1]], attribute=URLMetadataAttributeType.RECORD_TYPE) - await db_data_creator.metadata([url_ids[2]], validation_status=ValidationStatus.VALIDATED) - results = await db_data_creator.adb_client.get_urls_with_metadata( - attribute=URLMetadataAttributeType.RELEVANT, - validation_status=ValidationStatus.PENDING_VALIDATION - ) - assert len(results) == 1 - @pytest.mark.asyncio async def test_get_next_url_for_final_review_basic(db_data_creator: DBDataCreator): @@ -377,45 +325,19 @@ async def test_approve_url_basic(db_data_creator: DBDataCreator): adb_client = db_data_creator.adb_client # Approve URL. Only URL should be affected. No other properties should be changed. - await adb_client.approve_url(url_mapping.url_id) - - # Confirm same agency id is listed as confirmed - confirmed_agencies = await adb_client.get_all( - ConfirmedUrlAgency + await adb_client.approve_url( + url_mapping.url_id, + record_type=RecordType.ARREST_RECORDS, + relevant=True ) - assert len(confirmed_agencies) == 1 - confirmed_agency = confirmed_agencies[0] - assert confirmed_agency.url_id == url_mapping.url_id - assert confirmed_agency.agency_id == agency_id - - # Confirm two metadata entries - metadatas = await adb_client.get_all( - MetadataAnnotation - ) - assert len(metadatas) == 2 - record_type_metadata = None - relevant_metadata = None - for metadata in metadatas: - if metadata.attribute == URLMetadataAttributeType.RECORD_TYPE.value: - record_type_metadata = metadata - elif metadata.attribute == URLMetadataAttributeType.RELEVANT.value: - relevant_metadata = metadata - - # - One is Record Type, with record type as ARREST_RECORDS and set as approved - - assert record_type_metadata.value == RecordType.ARREST_RECORDS.value - assert record_type_metadata.validation_status == ValidationStatus.VALIDATED.value - - # - One is Relevant, and is set as TRUE and approved - assert relevant_metadata.value == "True" - assert relevant_metadata.validation_status == ValidationStatus.VALIDATED.value - - # Confirm URL - urls = await adb_client.get_all( - URL - ) + # Confirm same agency id is listed as confirmed + urls = await adb_client.get_all(URL) assert len(urls) == 1 url = urls[0] - assert url.status == URLStatus.APPROVED + assert url.id == url_mapping.url_id + assert url.agency_id == agency_id + assert url.record_type == RecordType.ARREST_RECORDS.value + assert url.relevant == True + assert url.outcome == URLStatus.VALIDATED.value diff --git a/tests/test_automated/integration/security_manager/test_security_manager.py b/tests/test_automated/integration/security_manager/test_security_manager.py index 010c3bf2..3dc676ad 100644 --- a/tests/test_automated/integration/security_manager/test_security_manager.py +++ b/tests/test_automated/integration/security_manager/test_security_manager.py @@ -17,7 +17,10 @@ def mock_get_secret_key(mocker): SECRET_KEY = "test_secret_key" VALID_TOKEN = "valid_token" INVALID_TOKEN = "invalid_token" -FAKE_PAYLOAD = {"sub": 1, "permissions": [Permissions.SOURCE_COLLECTOR.value]} +FAKE_PAYLOAD = { + "sub": 1, + "permissions": [Permissions.SOURCE_COLLECTOR.value] +} def test_api_with_valid_token(mock_get_secret_key): diff --git a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py index c8df809c..1c1289e7 100644 --- a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py +++ b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py @@ -7,7 +7,7 @@ from aiohttp import ClientSession from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponseType, AgencyLookupResponse -from collector_db.models import ConfirmedUrlAgency, Agency, AutomatedUrlAgencySuggestion +from collector_db.models import Agency, AutomatedUrlAgencySuggestion from collector_manager.enums import CollectorType from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo @@ -155,7 +155,7 @@ async def mock_run_subtask( # Check confirmed and auto suggestions adb_client = db_data_creator.adb_client - confirmed_suggestions = await adb_client.get_all(ConfirmedUrlAgency) + confirmed_suggestions = await adb_client.get_urls_with_confirmed_agencies() assert len(confirmed_suggestions) == 2 agencies = await adb_client.get_all(Agency) diff --git a/tests/test_automated/integration/tasks/test_url_record_type_task.py b/tests/test_automated/integration/tasks/test_url_record_type_task.py index cf4c8e0e..c56acec1 100644 --- a/tests/test_automated/integration/tasks/test_url_record_type_task.py +++ b/tests/test_automated/integration/tasks/test_url_record_type_task.py @@ -3,12 +3,11 @@ import pytest from collector_db.enums import TaskType -from collector_db.models import URLMetadata +from collector_db.models import AutoRecordTypeSuggestion from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator from core.enums import RecordType, BatchStatus from tests.helpers.DBDataCreator import DBDataCreator -from tests.helpers.assert_functions import assert_database_has_no_tasks from llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier @pytest.mark.asyncio @@ -51,8 +50,7 @@ async def test_url_record_type_task(db_data_creator: DBDataCreator): assert task.url_error_count == 1 # Get metadata - metadata_results = await db_data_creator.adb_client.get_all(URLMetadata) - for metadata_row in metadata_results: - assert metadata_row.notes == "test_notes" - assert metadata_row.value == RecordType.ACCIDENT_REPORTS.value + suggestions = await db_data_creator.adb_client.get_all(AutoRecordTypeSuggestion) + for suggestion in suggestions: + assert suggestion.record_type == RecordType.ACCIDENT_REPORTS.value diff --git a/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py b/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py index 188621b7..11ef770a 100644 --- a/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py +++ b/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py @@ -5,7 +5,8 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLWithHTML import URLWithHTML from collector_db.enums import ValidationStatus, ValidationSource -from collector_db.models import URLMetadata, Task +from collector_db.models import AutoRelevantSuggestion +from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator from tests.helpers.assert_functions import assert_database_has_no_tasks from hugging_face.HuggingFaceInterface import HuggingFaceInterface @@ -39,7 +40,8 @@ def mock_get_url_relevancy( adb_client=AsyncDatabaseClient(), huggingface_interface=mock_hf_interface ) - await task_operator.run_task(1) + meets_task_prerequisites = await task_operator.meets_task_prerequisites() + assert not meets_task_prerequisites await assert_database_has_no_tasks(db_data_creator.adb_client) @@ -47,15 +49,14 @@ def mock_get_url_relevancy( url_mappings = db_data_creator.urls(batch_id=batch_id, url_count=3).url_mappings url_ids = [url_info.url_id for url_info in url_mappings] await db_data_creator.html_data(url_ids) - await db_data_creator.metadata([url_ids[0]]) - await task_operator.run_task(1) + run_info: TaskOperatorRunInfo = await task_operator.run_task(1) + assert run_info.outcome == TaskOperatorOutcome.SUCCESS - results = await db_data_creator.adb_client.get_all(URLMetadata) + + results = await db_data_creator.adb_client.get_all(AutoRelevantSuggestion) assert len(results) == 3 for result in results: assert result.url_id in url_ids - assert result.value in ['True', 'False'] - assert result.validation_status == ValidationStatus.PENDING_VALIDATION.value - assert result.validation_source == ValidationSource.MACHINE_LEARNING.value \ No newline at end of file + assert result.relevant == num_to_bool(result.url_id % 2) diff --git a/util/alembic_helpers.py b/util/alembic_helpers.py new file mode 100644 index 00000000..d2120634 --- /dev/null +++ b/util/alembic_helpers.py @@ -0,0 +1,38 @@ +from alembic import op +import sqlalchemy as sa + +def switch_enum_type( + table_name, + column_name, + enum_name, + new_enum_values, + drop_old_enum=True +): + """ + Switches an ENUM type in a PostgreSQL column by: + 1. Renaming the old enum type. + 2. Creating the new enum type with the same name. + 3. Updating the column to use the new enum type. + 4. Dropping the old enum type. + + :param table_name: Name of the table containing the ENUM column. + :param column_name: Name of the column using the ENUM type. + :param enum_name: Name of the ENUM type in PostgreSQL. + :param new_enum_values: List of new ENUM values. + :param drop_old_enum: Whether to drop the old ENUM type. + """ + + # Rename old enum type + old_enum_temp_name = f"{enum_name}_old" + op.execute(f'ALTER TYPE "{enum_name}" RENAME TO "{old_enum_temp_name}"') + + # Create new enum type with the updated values + new_enum_type = sa.Enum(*new_enum_values, name=enum_name) + new_enum_type.create(op.get_bind()) + + # Alter the column type to use the new enum type + op.execute(f'ALTER TABLE "{table_name}" ALTER COLUMN "{column_name}" TYPE "{enum_name}" USING "{column_name}"::text::{enum_name}') + + # Drop the old enum type + if drop_old_enum: + op.execute(f'DROP TYPE "{old_enum_temp_name}"') From 6133f206c57222b5267c59fe9d8ca373c8ec4434 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 25 Feb 2025 12:06:19 -0500 Subject: [PATCH 059/244] build(api): add approve source endpoint and overhaul metadata Create `/review/approve-source` endpoint Overhaul annotation backend for better maintainability BREAKING CHANGE: Annotations no longer return metadata ids, but url ids. Approval or suggested annotations must now include url ids instead of metadata ids. --- .../integration/collector_db/test_db_client.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 9ded2a28..92a44dca 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -234,7 +234,10 @@ async def test_get_next_url_for_final_review_favor_more_components(db_data_creat @pytest.mark.asyncio -async def test_get_next_url_for_final_review_favor_more_annotations(db_data_creator: DBDataCreator): +async def test_get_next_url_for_final_review_favor_more_annotations( + db_data_creator: DBDataCreator, + wipe_database +): """ Test in the case of two URLs with the same number of components annotated, favoring the one with more total annotations """ From 0cbaf8d6c9e3f044fa4b7aa633db9db751685cb5 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 25 Feb 2025 12:22:23 -0500 Subject: [PATCH 060/244] build(api): add approve source endpoint and overhaul metadata Create `/review/approve-source` endpoint Overhaul annotation backend for better maintainability BREAKING CHANGE: Annotations no longer return metadata ids, but url ids. Approval or suggested annotations must now include url ids instead of metadata ids. --- collector_db/AsyncDatabaseClient.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index cf7f36cb..81d6dd02 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -5,6 +5,7 @@ from sqlalchemy import select, exists, func, case, desc, Select, not_, and_ from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import selectinload, joinedload, QueryableAttribute +from sqlalchemy.sql.functions import coalesce from starlette import status from collector_db.ConfigManager import ConfigManager @@ -1004,7 +1005,7 @@ def count_subquery(model: Type[Base]): sum_of_count_subqueries = ( sum( [ - subquery.c.count + coalesce(subquery.c.count, 0) for subquery in count_subqueries ] ) From 7bcce5c1e574cfcc8be01d0c71fbf0be949fb748 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 26 Feb 2025 11:37:50 -0500 Subject: [PATCH 061/244] build(api): add approve source endpoint and overhaul metadata Create `/review/approve-source` endpoint Overhaul annotation backend for better maintainability BREAKING CHANGE: Annotations no longer return metadata ids, but url ids. Approval or suggested annotations must now include url ids instead of metadata ids. --- api/routes/review.py | 18 +++++-- core/DTOs/GetNextURLForFinalReviewResponse.py | 5 ++ .../api/helpers/RequestValidator.py | 17 +++++-- .../integration/api/test_review.py | 47 ++++++++++++++++++- 4 files changed, 80 insertions(+), 7 deletions(-) diff --git a/api/routes/review.py b/api/routes/review.py index f1b7210a..0933d27d 100644 --- a/api/routes/review.py +++ b/api/routes/review.py @@ -2,7 +2,9 @@ from api.dependencies import get_async_core from core.AsyncCore import AsyncCore -from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo +from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, \ + GetNextURLForFinalReviewOuterResponse from security_manager.SecurityManager import AccessInfo, get_access_info review_router = APIRouter( @@ -15,5 +17,15 @@ async def get_next_source( core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), -) -> GetNextURLForFinalReviewResponse: - return await core.get_next_source_for_review() \ No newline at end of file +) -> GetNextURLForFinalReviewOuterResponse: + next_source = await core.get_next_source_for_review() + return GetNextURLForFinalReviewOuterResponse(next_source=next_source) + +@review_router.post("/approve-source") +async def approve_source( + core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info), + approval_info: FinalReviewApprovalInfo = FinalReviewApprovalInfo +) -> GetNextURLForFinalReviewOuterResponse: + next_source = await core.approve_and_get_next_source_for_review(approval_info) + return GetNextURLForFinalReviewOuterResponse(next_source=next_source) \ No newline at end of file diff --git a/core/DTOs/GetNextURLForFinalReviewResponse.py b/core/DTOs/GetNextURLForFinalReviewResponse.py index fad414af..df28040b 100644 --- a/core/DTOs/GetNextURLForFinalReviewResponse.py +++ b/core/DTOs/GetNextURLForFinalReviewResponse.py @@ -60,4 +60,9 @@ class GetNextURLForFinalReviewResponse(BaseModel): html_info: ResponseHTMLInfo = Field(title="The HTML content of the URL") annotations: FinalReviewAnnotationInfo = Field( title="The annotations for the URL, from both users and the auto-labeler", + ) + +class GetNextURLForFinalReviewOuterResponse(BaseModel): + next_source: Optional[GetNextURLForFinalReviewResponse] = Field( + title="The next source to be reviewed", ) \ No newline at end of file diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index 064e9912..e2c8a479 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -9,6 +9,7 @@ from collector_db.enums import TaskType from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.enums import CollectorType +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse @@ -18,7 +19,8 @@ from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse -from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse +from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, \ + GetNextURLForFinalReviewOuterResponse from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo @@ -259,9 +261,18 @@ def get_tasks( ) return GetTasksResponse(**data) - async def review_next_source(self) -> GetNextURLForFinalReviewResponse: + async def review_next_source(self) -> GetNextURLForFinalReviewOuterResponse: data = self.get( url=f"/review/next-source" ) - return GetNextURLForFinalReviewResponse(**data) + return GetNextURLForFinalReviewOuterResponse(**data) + async def approve_and_get_next_source_for_review( + self, + approval_info: FinalReviewApprovalInfo + ) -> GetNextURLForFinalReviewOuterResponse: + data = self.post( + url=f"/review/approve-source", + json=approval_info.model_dump(mode='json') + ) + return GetNextURLForFinalReviewOuterResponse(**data) diff --git a/tests/test_automated/integration/api/test_review.py b/tests/test_automated/integration/api/test_review.py index a69f474a..99af93e9 100644 --- a/tests/test_automated/integration/api/test_review.py +++ b/tests/test_automated/integration/api/test_review.py @@ -1,5 +1,9 @@ import pytest +from collector_db.models import URL +from collector_manager.enums import URLStatus +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo +from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse from core.enums import RecordType from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review @@ -19,7 +23,9 @@ async def test_review_next_source(api_test_helper): count=3 ) - result = await ath.request_validator.review_next_source() + outer_result = await ath.request_validator.review_next_source() + + result = outer_result.next_source assert result.url == url_mapping.url html_info = result.html_info @@ -53,3 +59,42 @@ async def test_review_next_source(api_test_helper): for i in range(3): assert user_agency_suggestions_as_list[i].count == 3 - i +@pytest.mark.asyncio +async def test_approve_and_get_next_source_for_review(api_test_helper): + ath = api_test_helper + db_data_creator = ath.db_data_creator + + url_mapping = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + + # Add confirmed agency + agency_id = await db_data_creator.agency_confirmed_suggestion( + url_id=url_mapping.url_id + ) + + result: GetNextURLForFinalReviewOuterResponse = await ath.request_validator.approve_and_get_next_source_for_review( + approval_info=FinalReviewApprovalInfo( + url_id=url_mapping.url_id, + record_type=RecordType.ARREST_RECORDS, + relevant=True, + agency_id=agency_id + ) + ) + + assert result.next_source is None + + adb_client = db_data_creator.adb_client + # Confirm same agency id is listed as confirmed + urls = await adb_client.get_all(URL) + assert len(urls) == 1 + url = urls[0] + assert url.id == url_mapping.url_id + assert url.agency_id == agency_id + assert url.record_type == RecordType.ARREST_RECORDS.value + assert url.relevant == True + assert url.outcome == URLStatus.VALIDATED.value + + From 048b3172dc6abd0d96fbb3b84bd2e997cdff1a93 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 11 Mar 2025 15:55:33 -0400 Subject: [PATCH 062/244] feat(app): add table to record users validating URLs. --- ...c4f56d4_create_approving_user_url_table.py | 34 +++++++++++++++++++ api/routes/review.py | 5 ++- collector_db/AsyncDatabaseClient.py | 12 +++++-- collector_db/models.py | 18 ++++++++++ core/AsyncCore.py | 7 ++-- .../collector_db/test_db_client.py | 10 ++++-- 6 files changed, 79 insertions(+), 7 deletions(-) create mode 100644 alembic/versions/2025_03_11_1539-69f7cc4f56d4_create_approving_user_url_table.py diff --git a/alembic/versions/2025_03_11_1539-69f7cc4f56d4_create_approving_user_url_table.py b/alembic/versions/2025_03_11_1539-69f7cc4f56d4_create_approving_user_url_table.py new file mode 100644 index 00000000..f38d33dc --- /dev/null +++ b/alembic/versions/2025_03_11_1539-69f7cc4f56d4_create_approving_user_url_table.py @@ -0,0 +1,34 @@ +"""Create approving_user_url table + +Revision ID: 69f7cc4f56d4 +Revises: 33421c0590bb +Create Date: 2025-03-11 15:39:27.563567 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '69f7cc4f56d4' +down_revision: Union[str, None] = '33421c0590bb' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + op.create_table( + 'approving_user_url', + sa.Column('id', sa.Integer(), nullable=False, primary_key=True), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('url_id', sa.Integer(), nullable=False), + sa.Column('created_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()')), + sa.ForeignKeyConstraint(['url_id'], ['urls.id'], ), + sa.UniqueConstraint('url_id', name='approving_user_url_uq_user_id_url_id') + ) + + +def downgrade() -> None: + op.drop_table('approving_user_url') diff --git a/api/routes/review.py b/api/routes/review.py index 0933d27d..61dccbbb 100644 --- a/api/routes/review.py +++ b/api/routes/review.py @@ -27,5 +27,8 @@ async def approve_source( access_info: AccessInfo = Depends(get_access_info), approval_info: FinalReviewApprovalInfo = FinalReviewApprovalInfo ) -> GetNextURLForFinalReviewOuterResponse: - next_source = await core.approve_and_get_next_source_for_review(approval_info) + next_source = await core.approve_and_get_next_source_for_review( + approval_info, + access_info=access_info + ) return GetNextURLForFinalReviewOuterResponse(next_source=next_source) \ No newline at end of file diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 81d6dd02..82fedc93 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -22,7 +22,7 @@ from collector_db.models import URL, URLErrorInfo, URLHTMLContent, Base, \ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ - UserRecordTypeSuggestion + UserRecordTypeSuggestion, ApprovingUserURL from collector_manager.enums import URLStatus, CollectorType from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo @@ -1107,7 +1107,8 @@ async def approve_url( url_id: int, record_type: RecordType, relevant: bool, - agency_id: Optional[int] = None + user_id: int, + agency_id: Optional[int] = None, ) -> None: # Get URL @@ -1135,3 +1136,10 @@ async def approve_url( # If it does, do nothing url.outcome = URLStatus.VALIDATED.value + + approving_user_url = ApprovingUserURL( + user_id=user_id, + url_id=url_id + ) + + session.add(approving_user_url) diff --git a/collector_db/models.py b/collector_db/models.py index 51fc4a2a..7990eb65 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -128,6 +128,24 @@ class URL(Base): "AutoRelevantSuggestion", uselist=False, back_populates="url") user_relevant_suggestions = relationship( "UserRelevantSuggestion", back_populates="url") + approving_users = relationship( + "ApprovingUserURL", back_populates="url") + +class ApprovingUserURL(Base): + __tablename__ = 'approving_user_url' + __table_args__ = ( + UniqueConstraint( + "url_id", + name="approving_user_url_uq_user_id_url_id"), + ) + + id = Column(Integer, primary_key=True) + user_id = Column(Integer, nullable=False) + url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) + created_at = get_created_at_column() + + # Relationships + url = relationship("URL", back_populates="approving_users") class RootURL(Base): __tablename__ = 'root_url_cache' diff --git a/core/AsyncCore.py b/core/AsyncCore.py index a576082f..4854926e 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -30,6 +30,7 @@ from llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier from pdap_api_client.AccessManager import AccessManager from pdap_api_client.PDAPClient import PDAPClient +from security_manager.SecurityManager import AccessInfo from util.helper_functions import get_from_env @@ -213,12 +214,14 @@ async def get_next_source_for_review(self): async def approve_and_get_next_source_for_review( self, - approval_info: FinalReviewApprovalInfo + approval_info: FinalReviewApprovalInfo, + access_info: AccessInfo ): await self.adb_client.approve_url( url_id=approval_info.url_id, record_type=approval_info.record_type, relevant=approval_info.relevant, - agency_id=approval_info.agency_id + agency_id=approval_info.agency_id, + user_id=access_info.user_id ) return await self.get_next_source_for_review() diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 92a44dca..b8ac56f1 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -9,7 +9,7 @@ from collector_db.DTOs.URLInfo import URLInfo from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource -from collector_db.models import URL +from collector_db.models import URL, ApprovingUserURL from collector_manager.enums import URLStatus from core.enums import BatchStatus, RecordType, SuggestionType from tests.helpers.DBDataCreator import DBDataCreator @@ -331,7 +331,8 @@ async def test_approve_url_basic(db_data_creator: DBDataCreator): await adb_client.approve_url( url_mapping.url_id, record_type=RecordType.ARREST_RECORDS, - relevant=True + relevant=True, + user_id=1 ) # Confirm same agency id is listed as confirmed @@ -344,3 +345,8 @@ async def test_approve_url_basic(db_data_creator: DBDataCreator): assert url.relevant == True assert url.outcome == URLStatus.VALIDATED.value + approving_user_urls = await adb_client.get_all(ApprovingUserURL) + assert len(approving_user_urls) == 1 + assert approving_user_urls[0].user_id == 1 + assert approving_user_urls[0].url_id == url_mapping.url_id + From 74247a70b71040188021ceea4e7fabff964e19f2 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sat, 15 Mar 2025 17:46:23 -0400 Subject: [PATCH 063/244] DRAFT --- ENV.md | 8 +++-- collector_db/enums.py | 1 + core/AsyncCore.py | 30 ++++++++++++++----- .../task_data_objects/SubmitApprovedURLTDO.py | 11 +++++++ core/README.md | 3 +- core/classes/SubmitApprovedURLTaskOperator.py | 28 +++++++++++++++++ pdap_api_client/AccessManager.py | 5 ++-- 7 files changed, 72 insertions(+), 14 deletions(-) create mode 100644 core/DTOs/task_data_objects/SubmitApprovedURLTDO.py create mode 100644 core/classes/SubmitApprovedURLTaskOperator.py diff --git a/ENV.md b/ENV.md index 68359348..92b7de31 100644 --- a/ENV.md +++ b/ENV.md @@ -14,11 +14,13 @@ Please ensure these are properly defined in a `.env` file in the root directory. |`POSTGRES_DB` | The database name for the test database | `source_collector_test_db` | |`POSTGRES_HOST` | The host for the test database | `127.0.0.1` | |`POSTGRES_PORT` | The port for the test database | `5432` | -|`DS_APP_SECRET_KEY`| The secret key used for decoding JWT tokens produced by the Data Sources App. Must match the secret token `JWT_SECRET_KEY` that is used in the Data Sources App for encoding. | `abc123` | +|`DS_APP_SECRET_KEY`| The secret key used for decoding JWT tokens produced by the Data Sources App. Must match the secret token `JWT_SECRET_KEY` that is used in the Data Sources App for encoding. | `abc123` | |`DEV`| Set to any value to run the application in development mode. | `true` | |`DEEPSEEK_API_KEY`| The API key required for accessing the DeepSeek API. | `abc123` | |`OPENAI_API_KEY`| The API key required for accessing the OpenAI API. | `abc123` | -|`PDAP_EMAIL`| An email address for accessing the PDAP API. | `abc123@test.com` | -|`PDAP_PASSWORD`| A password for accessing the PDAP API. | `abc123` | +|`PDAP_EMAIL`| An email address for accessing the PDAP API.[^1] | `abc123@test.com` | +|`PDAP_PASSWORD`| A password for accessing the PDAP API.[^1] | `abc123` | |`PDAP_API_KEY`| An API key for accessing the PDAP API. | `abc123` | +|`PDAP_API_URL`| The URL for the PDAP API| `https://data-sources-v2.pdap.dev/api`| +[^1:] The user account in question will require elevated permissions to access certain endpoints. At a minimum, the user will require the `source_collector` and `db_write` permissions. \ No newline at end of file diff --git a/collector_db/enums.py b/collector_db/enums.py index 2d82e87b..60b3df13 100644 --- a/collector_db/enums.py +++ b/collector_db/enums.py @@ -37,6 +37,7 @@ class TaskType(PyEnum): RELEVANCY = "Relevancy" RECORD_TYPE = "Record Type" AGENCY_IDENTIFICATION = "Agency Identification" + SUBMIT_APPROVED = "Submit Approved URLs" class PGEnum(TypeDecorator): impl = postgresql.ENUM diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 4854926e..08480a61 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -18,6 +18,7 @@ from core.DTOs.AnnotationRequestInfo import AnnotationRequestInfo from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome from core.classes.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator +from core.classes.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator from core.classes.TaskOperatorBase import TaskOperatorBase from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator @@ -51,6 +52,15 @@ def __init__( self.logger.addHandler(logging.StreamHandler()) self.logger.setLevel(logging.INFO) + async def get_pdap_client(self): + return PDAPClient( + access_manager=AccessManager( + email=get_from_env("PDAP_EMAIL"), + password=get_from_env("PDAP_PASSWORD"), + api_key=get_from_env("PDAP_API_KEY"), + ), + ) + async def get_url_html_task_operator(self): self.logger.info("Running URL HTML Task") operator = URLHTMLTaskOperator( @@ -76,13 +86,7 @@ async def get_url_record_type_task_operator(self): return operator async def get_agency_identification_task_operator(self): - pdap_client = PDAPClient( - access_manager=AccessManager( - email=get_from_env("PDAP_EMAIL"), - password=get_from_env("PDAP_PASSWORD"), - api_key=get_from_env("PDAP_API_KEY"), - ), - ) + pdap_client = await self.get_pdap_client() muckrock_api_interface = MuckrockAPIInterface() operator = AgencyIdentificationTaskOperator( adb_client=self.adb_client, @@ -91,12 +95,22 @@ async def get_agency_identification_task_operator(self): ) return operator + async def get_submit_approved_url_task_operator(self): + pdap_client = await self.get_pdap_client() + operator = SubmitApprovedURLTaskOperator( + adb_client=self.adb_client, + pdap_client=pdap_client + ) + return operator + + async def get_task_operators(self) -> list[TaskOperatorBase]: return [ await self.get_url_html_task_operator(), await self.get_url_relevance_huggingface_task_operator(), await self.get_url_record_type_task_operator(), - await self.get_agency_identification_task_operator() + await self.get_agency_identification_task_operator(), + await self.get_submit_approved_url_task_operator(), ] async def run_tasks(self): diff --git a/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py b/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py new file mode 100644 index 00000000..ee1b8dc6 --- /dev/null +++ b/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py @@ -0,0 +1,11 @@ +from typing import Optional + +from pydantic import BaseModel + +from core.enums import RecordType + + +class SubmitApprovedURLTDO(BaseModel): + url: str + record_type: RecordType + agency_id: Optional[int] \ No newline at end of file diff --git a/core/README.md b/core/README.md index 25b1cde3..9546f613 100644 --- a/core/README.md +++ b/core/README.md @@ -11,4 +11,5 @@ The Source Collector Core is a directory which integrates: - **Cycle**: Refers to the overall lifecycle for Each URL -- from initial retrieval in a Batch to either disposal or incorporation into the Data Sources App Database - **Task**: A semi-independent operation performed on a set of URLs. These include: Collection, retrieving HTML data, getting metadata via Machine Learning, and so on. - **Task Set**: Refers to a group of URLs that are operated on together as part of a single task. These URLs in a set are not necessarily all from the same batch. URLs in a task set should only be operated on in that task once. -- **Task Operator**: A class which performs a single task on a set of URLs. \ No newline at end of file +- **Task Operator**: A class which performs a single task on a set of URLs. +- **Subtask**: A subcomponent of a Task Operator which performs a single operation on a single URL. Often distinguished by the Collector Strategy used for that URL. \ No newline at end of file diff --git a/core/classes/SubmitApprovedURLTaskOperator.py b/core/classes/SubmitApprovedURLTaskOperator.py new file mode 100644 index 00000000..633f8c1e --- /dev/null +++ b/core/classes/SubmitApprovedURLTaskOperator.py @@ -0,0 +1,28 @@ +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_db.enums import TaskType +from core.classes.TaskOperatorBase import TaskOperatorBase +from pdap_api_client.PDAPClient import PDAPClient + + +class SubmitApprovedURLTaskOperator(TaskOperatorBase): + + def __init__( + self, + adb_client: AsyncDatabaseClient, + pdap_client: PDAPClient + ): + super().__init__(adb_client) + self.pdap_client = pdap_client + + @property + def task_type(self): + return TaskType.SUBMIT_APPROVED + + async def meets_task_prerequisites(self): + return await self.adb_client.has_validated_urls() + + async def inner_task_logic(self): + raise NotImplementedError + + async def update_errors_in_database(self, error_tdos: list[UrlHtmlTDO]): + raise NotImplementedError \ No newline at end of file diff --git a/pdap_api_client/AccessManager.py b/pdap_api_client/AccessManager.py index c39ba1e8..1020f365 100644 --- a/pdap_api_client/AccessManager.py +++ b/pdap_api_client/AccessManager.py @@ -5,8 +5,8 @@ from aiohttp import ClientSession from pdap_api_client.DTOs import RequestType, Namespaces, RequestInfo, ResponseInfo +from util.helper_functions import get_from_env -API_URL = "https://data-sources-v2.pdap.dev/api" request_methods = { RequestType.POST: ClientSession.post, RequestType.PUT: ClientSession.put, @@ -23,7 +23,8 @@ def build_url( namespace: Namespaces, subdomains: Optional[list[str]] = None ): - url = f"{API_URL}/{namespace.value}" + api_url = get_from_env('PDAP_API_URL') + url = f"{api_url}/{namespace.value}" if subdomains is not None: url = f"{url}/{'/'.join(subdomains)}" return url From d0522c33e5b5b478b250bb45ac7c92048a7bd8d9 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 25 Mar 2025 14:54:34 -0400 Subject: [PATCH 064/244] feat(app): Add Miscellaneous URL Metadata Task Add a task for adding miscellaneous URL metadata to the URL properties, utilizing metadata derived from the collector --- ..._add_name_description_and_url_optional_.py | 62 +++ apply_migrations.py | 7 +- collector_db/AsyncDatabaseClient.py | 155 +++---- collector_db/StatementComposer.py | 70 ++- collector_db/enums.py | 1 + collector_db/models.py | 41 +- core/AsyncCore.py | 11 +- .../URLMiscellaneousMetadataTDO.py | 16 + core/classes/TaskOperatorBase.py | 5 +- .../URLMiscellaneousMetadataTaskOperator.py | 62 +++ .../AutoGooglerMiscMetadataSubtask.py | 10 + .../CKANMiscMetadataSubtask.py | 13 + .../MiscellaneousMetadataSubtaskBase.py | 10 + .../MuckrockMiscMetadataSubtask.py | 10 + .../MiscellaneousMetadata}/__init__.py | 0 html_tag_collector/URLRequestInterface.py | 8 +- .../DTOs/LabelStudioTaskExportInfo.py | 39 -- .../LabelStudioAPIManager.py | 325 -------------- label_studio_interface/LabelStudioConfig.py | 32 -- .../PreAnnotationCreator.py | 88 ---- label_studio_interface/README.md | 28 -- label_studio_interface/__init__.py | 0 label_studio_interface/basic_demonstration.py | 126 ------ label_studio_interface/dev.env | 3 - local_database/DataDumper/dump.sh | 2 +- local_database/DataDumper/restore.sh | 8 +- start_mirrored_local_app.py | 402 ++++++++++++++++++ tests/helpers/DBDataCreator.py | 4 +- .../integration/tasks/test_url_html_task.py | 2 - .../test_url_miscellaneous_metadata_task.py | 143 +++++++ 30 files changed, 873 insertions(+), 810 deletions(-) create mode 100644 alembic/versions/2025_03_15_1745-6eb8084e2f48_add_name_description_and_url_optional_.py create mode 100644 core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py create mode 100644 core/classes/URLMiscellaneousMetadataTaskOperator.py create mode 100644 core/classes/subtasks/MiscellaneousMetadata/AutoGooglerMiscMetadataSubtask.py create mode 100644 core/classes/subtasks/MiscellaneousMetadata/CKANMiscMetadataSubtask.py create mode 100644 core/classes/subtasks/MiscellaneousMetadata/MiscellaneousMetadataSubtaskBase.py create mode 100644 core/classes/subtasks/MiscellaneousMetadata/MuckrockMiscMetadataSubtask.py rename {label_studio_interface/DTOs => core/classes/subtasks/MiscellaneousMetadata}/__init__.py (100%) delete mode 100644 label_studio_interface/DTOs/LabelStudioTaskExportInfo.py delete mode 100644 label_studio_interface/LabelStudioAPIManager.py delete mode 100644 label_studio_interface/LabelStudioConfig.py delete mode 100644 label_studio_interface/PreAnnotationCreator.py delete mode 100644 label_studio_interface/README.md delete mode 100644 label_studio_interface/__init__.py delete mode 100644 label_studio_interface/basic_demonstration.py delete mode 100644 label_studio_interface/dev.env create mode 100644 start_mirrored_local_app.py create mode 100644 tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py diff --git a/alembic/versions/2025_03_15_1745-6eb8084e2f48_add_name_description_and_url_optional_.py b/alembic/versions/2025_03_15_1745-6eb8084e2f48_add_name_description_and_url_optional_.py new file mode 100644 index 00000000..e8b542f9 --- /dev/null +++ b/alembic/versions/2025_03_15_1745-6eb8084e2f48_add_name_description_and_url_optional_.py @@ -0,0 +1,62 @@ +"""Add name, description, and url optional data source metadata + +Revision ID: 6eb8084e2f48 +Revises: 69f7cc4f56d4 +Create Date: 2025-03-15 17:45:46.619721 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +from util.alembic_helpers import switch_enum_type + +# revision identifiers, used by Alembic. +revision: str = '6eb8084e2f48' +down_revision: Union[str, None] = '69f7cc4f56d4' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # Add name and description columns to URL table + op.add_column('urls', sa.Column('name', sa.String(), nullable=True)) + op.add_column('urls', sa.Column('description', sa.String(), nullable=True)) + + # Create URL_optional_data_source_metadata + op.create_table( + 'url_optional_data_source_metadata', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('url_id', sa.Integer(), nullable=False), + sa.Column('record_formats', sa.ARRAY(sa.String()), nullable=True), + sa.Column('data_portal_type', sa.String(), nullable=True), + sa.Column('supplying_entity', sa.String(), nullable=True), + sa.ForeignKeyConstraint(['url_id'], ['urls.id'], ), + sa.PrimaryKeyConstraint('id') + ) + + # Add 'Misc Metadata' to TaskType enum + switch_enum_type( + table_name='tasks', + column_name='task_type', + enum_name='task_type', + new_enum_values=['HTML', 'Relevancy', 'Record Type', 'Agency Identification', 'Misc Metadata'] + ) + + +def downgrade() -> None: + # Remove name and description columns from URL table + op.drop_column('urls', 'name') + op.drop_column('urls', 'description') + + # Drop URL_optional_data_source_metadata + op.drop_table('url_optional_data_source_metadata') + + # Remove 'Misc Metadata' from TaskType enum + switch_enum_type( + table_name='tasks', + column_name='task_type', + enum_name='task_type', + new_enum_values=['HTML', 'Relevancy', 'Record Type', 'Agency Identification'] + ) diff --git a/apply_migrations.py b/apply_migrations.py index 5be4cd99..183e7d11 100644 --- a/apply_migrations.py +++ b/apply_migrations.py @@ -3,7 +3,7 @@ from collector_db.helper_functions import get_postgres_connection_string -if __name__ == "__main__": +def apply_migrations(): print("Applying migrations...") alembic_config = Config("alembic.ini") alembic_config.set_main_option( @@ -11,4 +11,7 @@ get_postgres_connection_string() ) command.upgrade(alembic_config, "head") - print("Migrations applied.") \ No newline at end of file + print("Migrations applied.") + +if __name__ == "__main__": + apply_migrations() \ No newline at end of file diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 82fedc93..41685a4b 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -2,7 +2,7 @@ from typing import Optional, Type from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, desc, Select, not_, and_ +from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, or_, update from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import selectinload, joinedload, QueryableAttribute from sqlalchemy.sql.functions import coalesce @@ -22,7 +22,7 @@ from collector_db.models import URL, URLErrorInfo, URLHTMLContent, Base, \ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ - UserRecordTypeSuggestion, ApprovingUserURL + UserRecordTypeSuggestion, ApprovingUserURL, URLOptionalDataSourceMetadata from collector_manager.enums import URLStatus, CollectorType from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo @@ -34,6 +34,7 @@ GetURLsResponseInnerInfo from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO +from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO from core.enums import BatchStatus, SuggestionType, RecordType from html_tag_collector.DataClassTags import convert_to_response_html_info @@ -353,6 +354,68 @@ async def has_pending_urls_without_html_data(self, session: AsyncSession) -> boo scalar_result = await session.scalars(statement) return bool(scalar_result.first()) + @session_manager + async def has_pending_urls_missing_miscellaneous_metadata(self, session: AsyncSession) -> bool: + query = StatementComposer.pending_urls_missing_miscellaneous_metadata_query() + query = query.limit(1) + + scalar_result = await session.scalars(query) + return bool(scalar_result.first()) + + @session_manager + async def get_pending_urls_missing_miscellaneous_metadata( + self, + session: AsyncSession + ) -> list[URLMiscellaneousMetadataTDO]: + query = StatementComposer.pending_urls_missing_miscellaneous_metadata_query() + query = ( + query.options( + selectinload(URL.batch), + ).limit(100).order_by(URL.id) + ) + + scalar_result = await session.scalars(query) + all_results = scalar_result.all() + final_results = [] + for result in all_results: + tdo = URLMiscellaneousMetadataTDO( + url_id=result.id, + collector_metadata=result.collector_metadata, + collector_type=CollectorType(result.batch.strategy), + ) + final_results.append(tdo) + return final_results + + @session_manager + async def add_miscellaneous_metadata(self, session: AsyncSession, tdos: list[URLMiscellaneousMetadataTDO]): + updates = [] + + for tdo in tdos: + update_query = update( + URL + ).where( + URL.id == tdo.url_id + ).values( + name=tdo.name, + description=tdo.description, + ) + + updates.append(update_query) + + for stmt in updates: + await session.execute(stmt) + + for tdo in tdos: + metadata_object = URLOptionalDataSourceMetadata( + url_id=tdo.url_id, + record_formats=tdo.record_formats, + data_portal_type=tdo.data_portal_type, + supplying_entity=tdo.supplying_entity + ) + session.add(metadata_object) + + + @session_manager async def get_pending_urls_without_html_data(self, session: AsyncSession): # TODO: Add test that includes some urls WITH html data. Check they're not returned @@ -433,97 +496,15 @@ async def has_urls_with_html_data_and_without_auto_relevant_suggestion(self, ses ) - #TODO: Slated for deletion - @session_manager - async def get_urls_with_html_data_and_without_metadata_type( - self, - session: AsyncSession, - without_metadata_type: URLMetadataAttributeType = URLMetadataAttributeType.RELEVANT - ) -> list[URLWithHTML]: - - # Get URLs with no relevancy metadata - statement = (select(URL) - .options(selectinload(URL.html_content)) - .where(URL.outcome == URLStatus.PENDING.value)) - # Exclude URLs with auto suggested record types - statement = self.statement_composer.exclude_urls_with_extant_model( - statement=statement, - model=AutoRecordTypeSuggestion - ) - statement = statement.limit(100).order_by(URL.id) - - - # TODO: The below can probably be generalized - - - statement = self.statement_composer.exclude_urls_with_select_metadata( - statement=statement, - attribute=without_metadata_type - ) - # TODO: Generalize - statement = statement.limit(100).order_by(URL.id) - raw_result = await session.execute(statement) - result = raw_result.all() - url_ids_to_urls = {url_id: url for url_id, url, _ in result} - url_ids_to_html_info = {url_id: [] for url_id, _, _ in result} - - for url_id, _, html_info in result: - url_ids_to_html_info[url_id].append( - URLHTMLContentInfo(**html_info.__dict__) - ) - - final_results = [] - for url_id, url in url_ids_to_urls.items(): - url_with_html = URLWithHTML( - url_id=url_id, - url=url, - html_infos=url_ids_to_html_info[url_id] - ) - final_results.append(url_with_html) - - return final_results - - @session_manager - async def has_pending_urls_with_html_data_and_without_metadata_type( - self, - session: AsyncSession, - without_metadata_type: URLMetadataAttributeType = URLMetadataAttributeType.RELEVANT - ) -> bool: - # TODO: Generalize this so that it can exclude based on other attributes - # Get URLs with no relevancy metadata - statement = (select(URL.id, URL.url, URLHTMLContent). - join(URLHTMLContent). - where(URL.outcome == URLStatus.PENDING.value)) - statement = self.statement_composer.exclude_urls_with_select_metadata( - statement=statement, - attribute=without_metadata_type - ) - statement = statement.limit(1) - raw_result = await session.execute(statement) - result = raw_result.all() - return len(result) > 0 - - - - # @session_manager - # async def get_annotations_for_metadata_id( - # self, - # session: AsyncSession, - # metadata_id: int - # ) -> list[MetadataAnnotation]: - # statement = (select(MetadataAnnotation). - # where(MetadataAnnotation.metadata_id == metadata_id)) - # scalar_result = await session.scalars(statement) - # all_results = scalar_result.all() - # return [MetadataAnnotationInfo(**result.__dict__) for result in all_results] - @session_manager - async def get_all(self, session, model: Base): + async def get_all(self, session, model: Base, order_by_attribute: Optional[str] = None) -> list[Base]: """ Get all records of a model Used primarily in testing """ statement = select(model) + if order_by_attribute: + statement = statement.order_by(getattr(model, order_by_attribute)) result = await session.execute(statement) return result.scalars().all() diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index d69dd078..88da61f3 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -1,11 +1,11 @@ from typing import Any -from sqlalchemy import Select, select, exists, Table, func, Subquery +from sqlalchemy import Select, select, exists, Table, func, Subquery, and_ from sqlalchemy.orm import aliased from collector_db.enums import URLMetadataAttributeType, ValidationStatus -from collector_db.models import URL, URLHTMLContent, AutomatedUrlAgencySuggestion -from collector_manager.enums import URLStatus +from collector_db.models import URL, URLHTMLContent, AutomatedUrlAgencySuggestion, URLOptionalDataSourceMetadata, Batch +from collector_manager.enums import URLStatus, CollectorType class StatementComposer: @@ -36,35 +36,7 @@ def exclude_urls_with_extant_model( ) )) - @staticmethod - def exclude_urls_with_select_metadata( - statement: Select, - attribute: URLMetadataAttributeType - ) -> Select: - return (statement.where( - ~exists( - select(URLMetadata.id). - where( - URLMetadata.url_id == URL.id, - URLMetadata.attribute == attribute.value - ) - ) - )) - @staticmethod - def exclude_url_annotated_by_user( - statement: Select, - user_id: int - ) -> Select: - return (statement.where( - ~exists( - select(MetadataAnnotation.id). - where( - MetadataAnnotation.metadata_id == URLMetadata.id, - MetadataAnnotation.user_id == user_id - ) - ) - )) @staticmethod @@ -88,19 +60,29 @@ def exclude_urls_with_agency_suggestions( return statement + @staticmethod - async def get_all_html_content_for_url(subquery) -> Select: - statement = ( - select( - subquery.c.url, - subquery.c.metadata_id, - subquery.c.value, - URLHTMLContent.content_type, - URLHTMLContent.content, + def pending_urls_missing_miscellaneous_metadata_query() -> Select: + query = select(URL).where( + and_( + URL.outcome == URLStatus.PENDING.value, + URL.name == None, + URL.description == None, + URLOptionalDataSourceMetadata.url_id == None, + Batch.strategy.in_( + [ + CollectorType.AUTO_GOOGLER.value, + CollectorType.CKAN.value, + CollectorType.MUCKROCK_ALL_SEARCH.value, + CollectorType.MUCKROCK_COUNTY_SEARCH.value, + CollectorType.MUCKROCK_SIMPLE_SEARCH.value + ] + ) + ) + ).outerjoin( + URLOptionalDataSourceMetadata + ).join( + Batch ) - .join(URLHTMLContent) - .where(subquery.c.url_id == URLHTMLContent.url_id) - ) - raw_result = await session.execute(statement) - result = raw_result.all() \ No newline at end of file + return query \ No newline at end of file diff --git a/collector_db/enums.py b/collector_db/enums.py index 2d82e87b..0dd956c5 100644 --- a/collector_db/enums.py +++ b/collector_db/enums.py @@ -37,6 +37,7 @@ class TaskType(PyEnum): RELEVANCY = "Relevancy" RECORD_TYPE = "Record Type" AGENCY_IDENTIFICATION = "Agency Identification" + MISC_METADATA = "Misc Metadata" class PGEnum(TypeDecorator): impl = postgresql.ENUM diff --git a/collector_db/models.py b/collector_db/models.py index 7990eb65..4a61be88 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -2,11 +2,11 @@ SQLAlchemy ORM models """ from sqlalchemy import func, Column, Integer, String, TIMESTAMP, Float, JSON, ForeignKey, Text, UniqueConstraint, \ - Boolean, DateTime + Boolean, DateTime, ARRAY from sqlalchemy.dialects import postgresql from sqlalchemy.orm import declarative_base, relationship -from collector_db.enums import PGEnum +from collector_db.enums import PGEnum, TaskType from core.enums import BatchStatus, RecordType from util.helper_functions import get_enum_values @@ -85,6 +85,8 @@ class URL(Base): # The batch this URL is associated with batch_id = Column(Integer, ForeignKey('batches.id', name='fk_url_batch_id'), nullable=False) url = Column(Text, unique=True) + name = Column(String) + description = Column(Text) # The metadata from the collector collector_metadata = Column(JSON) # The outcome of the URL: submitted, human_labeling, rejected, duplicate, etc. @@ -130,6 +132,20 @@ class URL(Base): "UserRelevantSuggestion", back_populates="url") approving_users = relationship( "ApprovingUserURL", back_populates="url") + optional_data_source_metadata = relationship( + "URLOptionalDataSourceMetadata", uselist=False, back_populates="url") + +class URLOptionalDataSourceMetadata(Base): + __tablename__ = 'url_optional_data_source_metadata' + + id = Column(Integer, primary_key=True) + url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) + record_formats = Column(ARRAY(String), nullable=True) + data_portal_type = Column(String, nullable=True) + supplying_entity = Column(String, nullable=True) + + # Relationships + url = relationship("URL", uselist=False, back_populates="optional_data_source_metadata") class ApprovingUserURL(Base): __tablename__ = 'approving_user_url' @@ -256,10 +272,7 @@ class Task(Base): id = Column(Integer, primary_key=True) task_type = Column( PGEnum( - 'HTML', - 'Relevancy', - 'Record Type', - 'Agency Identification', + *[task_type.value for task_type in TaskType], name='task_type' ), nullable=False) task_status = Column(batch_status_enum, nullable=False) @@ -319,22 +332,6 @@ class Agency(Base): automated_suggestions = relationship("AutomatedUrlAgencySuggestion", back_populates="agency") user_suggestions = relationship("UserUrlAgencySuggestion", back_populates="agency") - -# class ConfirmedUrlAgency(Base): -# __tablename__ = "confirmed_url_agency" -# -# id = Column(Integer, primary_key=True, autoincrement=True) -# agency_id = Column(Integer, ForeignKey("agencies.agency_id"), nullable=False) -# url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) -# -# agency = relationship("Agency", back_populates="confirmed_urls") -# url = relationship("URL", back_populates="confirmed_agencies") -# -# __table_args__ = ( -# UniqueConstraint("url_id", name="uq_confirmed_url_agency"), -# ) - - class AutomatedUrlAgencySuggestion(Base): __tablename__ = "automated_url_agency_suggestions" diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 4854926e..5317023b 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -20,6 +20,7 @@ from core.classes.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator from core.classes.TaskOperatorBase import TaskOperatorBase from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator +from core.classes.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator from core.enums import BatchStatus, SuggestionType, RecordType @@ -91,12 +92,19 @@ async def get_agency_identification_task_operator(self): ) return operator + async def get_url_miscellaneous_metadata_task_operator(self): + operator = URLMiscellaneousMetadataTaskOperator( + adb_client=self.adb_client + ) + return operator + async def get_task_operators(self) -> list[TaskOperatorBase]: return [ await self.get_url_html_task_operator(), await self.get_url_relevance_huggingface_task_operator(), await self.get_url_record_type_task_operator(), - await self.get_agency_identification_task_operator() + await self.get_agency_identification_task_operator(), + await self.get_url_miscellaneous_metadata_task_operator() ] async def run_tasks(self): @@ -225,3 +233,4 @@ async def approve_and_get_next_source_for_review( user_id=access_info.user_id ) return await self.get_next_source_for_review() + diff --git a/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py b/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py new file mode 100644 index 00000000..d57d1cba --- /dev/null +++ b/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py @@ -0,0 +1,16 @@ +from typing import Optional + +from pydantic import BaseModel + +from collector_manager.enums import CollectorType + + +class URLMiscellaneousMetadataTDO(BaseModel): + url_id: int + collector_metadata: dict + collector_type: CollectorType + name: Optional[str] = None + description: Optional[str] = None + record_formats: Optional[list[str]] = None + data_portal_type: Optional[str] = None + supplying_entity: Optional[str] = None diff --git a/core/classes/TaskOperatorBase.py b/core/classes/TaskOperatorBase.py index ece3bc81..e7c87dac 100644 --- a/core/classes/TaskOperatorBase.py +++ b/core/classes/TaskOperatorBase.py @@ -1,4 +1,4 @@ - +import traceback from abc import ABC, abstractmethod from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.enums import TaskType @@ -50,9 +50,10 @@ async def run_task(self, task_id: int) -> TaskOperatorRunInfo: await self.inner_task_logic() return await self.conclude_task() except Exception as e: + stack_trace = traceback.format_exc() return await self.run_info( outcome=TaskOperatorOutcome.ERROR, - message=str(e) + message=str(e) + "\n" + stack_trace ) async def run_info(self, outcome: TaskOperatorOutcome, message: str): diff --git a/core/classes/URLMiscellaneousMetadataTaskOperator.py b/core/classes/URLMiscellaneousMetadataTaskOperator.py new file mode 100644 index 00000000..38e7446a --- /dev/null +++ b/core/classes/URLMiscellaneousMetadataTaskOperator.py @@ -0,0 +1,62 @@ +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from collector_db.enums import TaskType +from collector_manager.enums import CollectorType +from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO +from core.classes.TaskOperatorBase import TaskOperatorBase +from core.classes.subtasks.MiscellaneousMetadata.AutoGooglerMiscMetadataSubtask import AutoGooglerMiscMetadataSubtask +from core.classes.subtasks.MiscellaneousMetadata.CKANMiscMetadataSubtask import CKANMiscMetadataSubtask +from core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ + MiscellaneousMetadataSubtaskBase +from core.classes.subtasks.MiscellaneousMetadata.MuckrockMiscMetadataSubtask import MuckrockMiscMetadataSubtask + + +class URLMiscellaneousMetadataTaskOperator(TaskOperatorBase): + + def __init__( + self, + adb_client: AsyncDatabaseClient + ): + super().__init__(adb_client) + + @property + def task_type(self): + return TaskType.MISC_METADATA + + async def meets_task_prerequisites(self): + return await self.adb_client.has_pending_urls_missing_miscellaneous_metadata() + + async def get_subtask(self, collector_type: CollectorType) -> MiscellaneousMetadataSubtaskBase: + match collector_type: + case CollectorType.MUCKROCK_SIMPLE_SEARCH: + return MuckrockMiscMetadataSubtask() + case CollectorType.MUCKROCK_COUNTY_SEARCH: + return MuckrockMiscMetadataSubtask() + case CollectorType.MUCKROCK_ALL_SEARCH: + return MuckrockMiscMetadataSubtask() + case CollectorType.AUTO_GOOGLER: + return AutoGooglerMiscMetadataSubtask() + case CollectorType.CKAN: + return CKANMiscMetadataSubtask() + case _: + raise Exception(f"Unknown collector type: {collector_type}") + + async def inner_task_logic(self): + tdos: list[URLMiscellaneousMetadataTDO] = await self.adb_client.get_pending_urls_missing_miscellaneous_metadata() + await self.link_urls_to_task(url_ids=[tdo.url_id for tdo in tdos]) + + error_infos = [] + for tdo in tdos: + subtask = await self.get_subtask(tdo.collector_type) + try: + subtask.process(tdo) + except Exception as e: + error_info = URLErrorPydanticInfo( + task_id=self.task_id, + url_id=tdo.url_id, + error=str(e), + ) + error_infos.append(error_info) + + await self.adb_client.add_miscellaneous_metadata(tdos) + await self.adb_client.add_url_error_infos(error_infos) \ No newline at end of file diff --git a/core/classes/subtasks/MiscellaneousMetadata/AutoGooglerMiscMetadataSubtask.py b/core/classes/subtasks/MiscellaneousMetadata/AutoGooglerMiscMetadataSubtask.py new file mode 100644 index 00000000..43659a9e --- /dev/null +++ b/core/classes/subtasks/MiscellaneousMetadata/AutoGooglerMiscMetadataSubtask.py @@ -0,0 +1,10 @@ +from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO +from core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ + MiscellaneousMetadataSubtaskBase + + +class AutoGooglerMiscMetadataSubtask(MiscellaneousMetadataSubtaskBase): + + def process(self, tdo: URLMiscellaneousMetadataTDO): + tdo.name = tdo.collector_metadata['title'] + tdo.description = tdo.collector_metadata['snippet'] \ No newline at end of file diff --git a/core/classes/subtasks/MiscellaneousMetadata/CKANMiscMetadataSubtask.py b/core/classes/subtasks/MiscellaneousMetadata/CKANMiscMetadataSubtask.py new file mode 100644 index 00000000..04ef7a0f --- /dev/null +++ b/core/classes/subtasks/MiscellaneousMetadata/CKANMiscMetadataSubtask.py @@ -0,0 +1,13 @@ +from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO +from core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ + MiscellaneousMetadataSubtaskBase + + +class CKANMiscMetadataSubtask(MiscellaneousMetadataSubtaskBase): + + def process(self, tdo: URLMiscellaneousMetadataTDO): + tdo.name = tdo.collector_metadata['submitted_name'] + tdo.description = tdo.collector_metadata['description'] + tdo.record_formats = tdo.collector_metadata['record_format'] + tdo.data_portal_type = tdo.collector_metadata['data_portal_type'] + tdo.supplying_entity = tdo.collector_metadata['supplying_entity'] diff --git a/core/classes/subtasks/MiscellaneousMetadata/MiscellaneousMetadataSubtaskBase.py b/core/classes/subtasks/MiscellaneousMetadata/MiscellaneousMetadataSubtaskBase.py new file mode 100644 index 00000000..7a0e7d1f --- /dev/null +++ b/core/classes/subtasks/MiscellaneousMetadata/MiscellaneousMetadataSubtaskBase.py @@ -0,0 +1,10 @@ +from abc import ABC, abstractmethod + +from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO + + +class MiscellaneousMetadataSubtaskBase(ABC): + + @abstractmethod + def process(self, tdo: URLMiscellaneousMetadataTDO): + raise NotImplementedError \ No newline at end of file diff --git a/core/classes/subtasks/MiscellaneousMetadata/MuckrockMiscMetadataSubtask.py b/core/classes/subtasks/MiscellaneousMetadata/MuckrockMiscMetadataSubtask.py new file mode 100644 index 00000000..1d599162 --- /dev/null +++ b/core/classes/subtasks/MiscellaneousMetadata/MuckrockMiscMetadataSubtask.py @@ -0,0 +1,10 @@ +from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO +from core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ + MiscellaneousMetadataSubtaskBase + + +class MuckrockMiscMetadataSubtask(MiscellaneousMetadataSubtaskBase): + + def process(self, tdo: URLMiscellaneousMetadataTDO): + tdo.name = tdo.collector_metadata['title'] + tdo.description = tdo.collector_metadata['title'] diff --git a/label_studio_interface/DTOs/__init__.py b/core/classes/subtasks/MiscellaneousMetadata/__init__.py similarity index 100% rename from label_studio_interface/DTOs/__init__.py rename to core/classes/subtasks/MiscellaneousMetadata/__init__.py diff --git a/html_tag_collector/URLRequestInterface.py b/html_tag_collector/URLRequestInterface.py index 2b135516..20ea1989 100644 --- a/html_tag_collector/URLRequestInterface.py +++ b/html_tag_collector/URLRequestInterface.py @@ -79,10 +79,8 @@ async def make_requests( self, urls: list[str], ) -> list[URLResponseInfo]: - try: - ensure_browsers_installed() - return await self.fetch_urls(urls) - except Exception as e: - return [] + ensure_browsers_installed() + return await self.fetch_urls(urls) + diff --git a/label_studio_interface/DTOs/LabelStudioTaskExportInfo.py b/label_studio_interface/DTOs/LabelStudioTaskExportInfo.py deleted file mode 100644 index 07c0562b..00000000 --- a/label_studio_interface/DTOs/LabelStudioTaskExportInfo.py +++ /dev/null @@ -1,39 +0,0 @@ -from pydantic import BaseModel - -from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType - - -class LabelStudioTaskExportInfo(BaseModel): - url: str - html_title: str = "" - meta_description: str = "" - h1: list[str] = [] - h2: list[str] = [] - h3: list[str] = [] - h4: list[str] = [] - h5: list[str] = [] - h6: list[str] = [] - div_text: str = "" - url_path: str = "" - http_response: int = -1 - url_source_info: str = "" - -ENUM_TO_ATTRIBUTE_MAPPING = { - HTMLContentType.TITLE: "html_title", - HTMLContentType.DESCRIPTION: "meta_description", - HTMLContentType.H1: "h1", - HTMLContentType.H2: "h2", - HTMLContentType.H3: "h3", - HTMLContentType.H4: "h4", - HTMLContentType.H5: "h5", - HTMLContentType.H6: "h6", - HTMLContentType.DIV: "div_text" -} - -def add_html_info_to_export_info( - export_info: LabelStudioTaskExportInfo, - html_content_info: URLHTMLContentInfo -): - attribute_name = ENUM_TO_ATTRIBUTE_MAPPING[html_content_info.content_type] - setattr(export_info, attribute_name, html_content_info.content) - diff --git a/label_studio_interface/LabelStudioAPIManager.py b/label_studio_interface/LabelStudioAPIManager.py deleted file mode 100644 index 138dd0cd..00000000 --- a/label_studio_interface/LabelStudioAPIManager.py +++ /dev/null @@ -1,325 +0,0 @@ -import copy -import json -import os -import random -import string -import sys -from enum import Enum -from typing import Annotated - -import requests - -from label_studio_interface.DTOs.LabelStudioTaskExportInfo import LabelStudioTaskExportInfo - -# The below code sets the working directory to be the root of the entire repository -# This is done to solve otherwise quite annoying import issues. -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) - -from label_studio_interface.LabelStudioConfig import LabelStudioConfig - -""" -This script contains code which interfaces with the Label Studio API. -To view the documentation for the Label Studio API, visit https://app.heartex.com/docs/api -""" - - -class Role(Enum): - """ - This class represents the roles that a user can have in an organization. - """ - OWNER = "OW" - ADMINISTRATOR = "AD" - MANAGER = "MA" - REVIEWER = "RE" - ANNOTATOR = "AN" - DEACTIVATED = "DI" - NONE = "NO" - -def generate_random_word(length): - letters = string.ascii_lowercase - return ''.join(random.choice(letters) for _ in range(length)) - - -class URLConstructor: - def __init__(self, scheme="http", domain=None): - self.scheme = scheme - self.domain = domain - self.path_segments = [] - self.query_params = {} - - def add_path_segment(self, segment): - self.path_segments.append(segment) - return self - - def add_query_param(self, key, value): - self.query_params[key] = value - return self - - def build(self): - path = "/".join(self.path_segments) - query_string = "&".join([f"{key}={value}" for key, value in self.query_params.items()]) - url = f"{self.scheme}://{self.domain}" - if path: - url += f"/{path}" - if query_string: - url += f"?{query_string}" - return url - - -class LabelStudioAPIURLConstructor: - """ - This class is responsible for constructing the URL for the Label Studio API. - """ - - def __init__(self, project_id: str = '58475', organization_id: str = '1'): - self.base_url_constructor = URLConstructor( - domain='app.heartex.com', - scheme='https' - ).add_path_segment('api') - self.project_id = project_id - self.organization_id = organization_id - # self.label_studio_api_root_url = 'https://app.heartex.com/api' - # self.label_studio_api_root_url = f'https://app.heartex.com/api/projects/{project_id}' - - def get_import_url(self) -> str: - """ - This method returns the URL for importing data into Label Studio. - Returns: str - """ - new_constructor = copy.deepcopy(self.base_url_constructor) - return (new_constructor - .add_path_segment('projects') - .add_path_segment(self.project_id) - .add_path_segment('import') - .add_query_param('return_task_ids', 'true') - .build() - ) - - def get_project_url(self) -> str: - """ - This method returns the URL for the project. - Returns: str - """ - new_constructor = copy.deepcopy(self.base_url_constructor) - return (new_constructor - .add_path_segment('projects') - .add_path_segment(self.project_id) - .build() - ) - - def delete_project_tasks_url(self) -> str: - """ - This method returns the URL for deleting all tasks in the project. - Returns: str - """ - new_constructor = copy.deepcopy(self.base_url_constructor) - return (new_constructor - .add_path_segment('projects') - .add_path_segment(self.project_id) - .add_path_segment('ground-truth-tasks') - .build() - ) - - def get_easy_export_url(self, all_tasks: bool) -> str: - """ - This method returns the URL for the easy export. - Returns: str - """ - new_constructor = copy.deepcopy(self.base_url_constructor) - return (new_constructor - .add_path_segment('projects') - .add_path_segment(self.project_id) - .add_path_segment('export') - .add_query_param('exportType', 'JSON') - .add_query_param('download_all_tasks', str(all_tasks).lower()) - .build() - ) - - def get_organization_membership_url(self) -> str: - """ - This method returns the URL for organization membership - Used for querying the members in the organization as well as updating the role of a member. - Returns: str - """ - new_constructor = copy.deepcopy(self.base_url_constructor) - return (new_constructor - .add_path_segment('organizations') - .add_path_segment(self.organization_id) - .add_path_segment('memberships') - .build() - ) - - -class LabelStudioAPIManager: - - def __init__( - self, - config: LabelStudioConfig = LabelStudioConfig(), - ): - """ - This class is responsible for managing the API requests to Label Studio. - Args: - config: The user's authorization token for the Label Studio API. - """ - self.config = config - self.api_url_constructor = LabelStudioAPIURLConstructor( - project_id=self.config.project_id, - organization_id=self.config.organization_id - ) - - # region Task Import/Export - def export_tasks_into_project( - self, - data: list[LabelStudioTaskExportInfo] - ) -> Annotated[list[int], "The task IDs"]: - """ - This method imports task input data into Label Studio. - https://labelstud.io/api#tag/Import/operation/api_projects_import_create - Args: - data: dict - The data to import into Label Studio. - This should be a list of dictionaries, each containing - the same keys, representing data for the task - Returns: requests.Response - """ - dict_data = [] - for task in data: - dict_data.append(task.model_dump()) - import_url = self.api_url_constructor.get_import_url() - response = requests.post( - url=import_url, - data=json.dumps(dict_data), - # TODO: Consider extracting header construction - headers={ - 'Content-Type': 'application/json', - 'Authorization': self.config.authorization_token - } - ) - response.raise_for_status() - return response.json()["task_ids"] - - def import_tasks_from_project(self, all_tasks: bool = False) -> requests.Response: - """ - This method exports the data from the project. - Args: - all_tasks: bool - Whether to export all tasks or just the annotated tasks. - output_filename: str - The filename to save the exported data to. - Returns: requests.Response - """ - export_url = self.api_url_constructor.get_easy_export_url(all_tasks=all_tasks) - response = requests.get( - url=export_url, - headers={ - 'Authorization': self.config.authorization_token - } - ) - response.raise_for_status() - return response - - # endregion - - # region Project Information - def get_project_info(self) -> requests.Response: - """ - This method retrieves information about the project. - Returns: requests.Response - """ - project_url = self.api_url_constructor.get_project_url() - response = requests.get( - url=project_url, - headers={ - 'Authorization': self.config.authorization_token - } - ) - return response - - def ping_project(self) -> bool: - """ - This method pings the project, returning True if the project is accessible. - Returns: bool - """ - project_url = self.api_url_constructor.get_project_url() - response = requests.get( - url=project_url, - headers={ - 'Authorization': self.config.authorization_token - } - ) - return response.status_code == 200 - - # endregion - - # region User Management - def get_members_in_organization(self) -> requests.Response: - """ - This method retrieves the members in the organization. - https://app.heartex.com/docs/api#tag/Organizations/operation/api_organizations_memberships_list - Returns: requests.Response - """ - membership_url = self.api_url_constructor.get_organization_membership_url() - response = requests.get( - url=membership_url, - headers={ - 'Authorization': self.config.authorization_token - } - ) - response.raise_for_status() - return response - - def update_member_role(self, user_id: int, role: Role) -> requests.Response: - """ - This method updates the role of a member in the organization. - Args: - user_id: str - The ID of the user to update the role for. - role: Role - The role to update the user to. - Returns: requests.Response - """ - membership_url = self.api_url_constructor.get_organization_membership_url() - response = requests.patch( - url=membership_url, - headers={ - 'Authorization': self.config.authorization_token, - 'Content-Type': 'application/json' - }, - json={ - "user_id": user_id, - "role": role.value - } - ) - return response - - def delete_project_tasks(self) -> requests.Response: - """ - This method deletes all tasks from the project. - Returns: requests.Response - """ - delete_url = self.api_url_constructor.delete_project_tasks_url() - response = requests.delete( - url=delete_url, - headers={ - 'Authorization': self.config.authorization_token - } - ) - return response - - # endregion - - -if __name__ == "__main__": - - # Example usage - api_manager = LabelStudioAPIManager(config=LabelStudioConfig()) - project_accessible = api_manager.ping_project() - if project_accessible: - print("Project is accessible") - - # Test export - # data = [{"url": f"https://example.com/{generate_random_word(10)}"} for _ in range(10)] - # - # response = api_manager.import_data(data) - # print(response.status_code) - # print(response.json()) - - # Test import - response = api_manager.import_tasks_from_project() - print(response.status_code) - print(response.json()) diff --git a/label_studio_interface/LabelStudioConfig.py b/label_studio_interface/LabelStudioConfig.py deleted file mode 100644 index 14e5cef1..00000000 --- a/label_studio_interface/LabelStudioConfig.py +++ /dev/null @@ -1,32 +0,0 @@ -import os - -from dotenv import load_dotenv - - -class LabelStudioConfig: - """ - This class is responsible for loading the configuration for the Label Studio API. - """ - def __init__(self, dotenv_file=".env"): - """ - - Args: - dotenv_file: the path to the .env file which contains the configuration for the Label Studio API - """ - load_dotenv(dotenv_file) - # Note that if the environment variables are not set, the default values, given below, are used - self._project_id = os.getenv('LABEL_STUDIO_PROJECT_ID', '58475') - self._organization_id = os.getenv('LABEL_STUDIO_ORGANIZATION_ID', '1') - self._authorization_token = f'Token {os.getenv("LABEL_STUDIO_ACCESS_TOKEN", "abc123")}' - - @property - def project_id(self): - return self._project_id - - @property - def authorization_token(self): - return self._authorization_token - - @property - def organization_id(self): - return self._organization_id diff --git a/label_studio_interface/PreAnnotationCreator.py b/label_studio_interface/PreAnnotationCreator.py deleted file mode 100644 index 9630d464..00000000 --- a/label_studio_interface/PreAnnotationCreator.py +++ /dev/null @@ -1,88 +0,0 @@ -""" -This class combines data with pre-annotation data, converting it into the requisite format for Label Studio -""" -from typing import Any - -class BaseResultInfo: - """ - Contains information required for every result - """ - def __init__(self, result_type: str, to_name: str, from_name: str, origin: str = "manual"): - """ - - Args: - result_type: One of the permitted Label Studio result types - to_name: Name of the entity being labeled - from_name: Source name of the result in the label configuration - origin: Where the result came from, defaults to "manual" - """ - self.result_type = result_type - self.to_name = to_name - self.from_name = from_name - self.origin = origin - -class TaxonomyResult: - - def __init__(self, base_info: BaseResultInfo, taxonomy_data: list[list[str]]): - self.base_info = base_info - self.taxonomy_data = taxonomy_data - - def to_dict(self) -> dict: - """ - Converts the taxonomy data to a dictionary - Returns: - - """ - return { - "type": self.base_info.result_type, - "value": { - "taxonomy": self.taxonomy_data - }, - "origin": self.base_info.origin, - "to_name": self.base_info.to_name, - "from_name": self.base_info.from_name - } - - - - -class PreAnnotationCreator: - - def __init__(self): - pass - - def add_taxonomy_data(self, raw_taxonomy_data: Any) -> list[list[str]]: - """ - This method adds taxonomy data to the pre-annotation data - - Taxonomy data exists as a list of lists - Each sub-list represents a single selection in the taxonomy - and is a list of strings representing each level of the taxonomy - with the first being the most superordinate, and the last being the most subordinate - Selections do not have to include all levels of the taxonomy - For example, in a taxonomy of animals, if "Dog" is selected, the selection is represented as ["Dog"] - However, a selection of a subordinate category entails selection of all relevant superordinate categories - For example, If "German Shepherd" is selected, the selection is represented as ["Dog", "German Shepherd"] - If "Dog" is also selected, that is included as a separate sub-list containing only ["Dog"] - - Example format: - [ - ["Dog", "German Shepherd"], - ["Dog"] - ] - - Args: - raw_taxonomy_data: Any: Taxonomy data to be converted into the requisite format for Label Studio - Returns: - list[list[str]]: The pre-annotation data with the taxonomy data added - - """ - - taxonomy_results = [] - - - - - # Note that for multi-hierarchical taxonomy data, - # any selection of the subordinate category - # will automatically entail selection of the superordinate category diff --git a/label_studio_interface/README.md b/label_studio_interface/README.md deleted file mode 100644 index 491ab4d8..00000000 --- a/label_studio_interface/README.md +++ /dev/null @@ -1,28 +0,0 @@ -This directory handles interfacing with -[Label Studio](https://labelstud.io/), a data labeling tool. It handles: -- Converting data from the format used by the rest of the pipeline to the format - used by Label Studio -- Uploading data to Label Studio -- Downloading labeled data from Label Studio -- Updating member roles in Label Studio - -# Environment Variables -For proper functioning of application, the following environment variables must be set in an `.env` file in the root directory: - -- LABEL_STUDIO_ACCESS_TOKEN: The access token for the Label Studio API. This can be - obtained by logging into Label Studio and navigating to the [user account section](https://app.heartex.com/user/account), where the access token can be copied. -- LABEL_STUDIO_PROJECT_ID: The project ID for the Label Studio API. This can be - obtained by logging into Label Studio and navigating to the relevant project, where the project id will be in the URL. -- LABEL_STUDIO_ORGANIZATION_ID: The organization ID for the Label Studio API. This can - be obtained by logging into Label Studio and navigating to the [Organization section](https://app.heartex.com/organization?page=1), where the organization ID can be copied. - -# To run basic demonstration -1. Set the environment variables as described above; in dev.env, all but LABEL_STUDIO_ACCESS_TOKEN are pre-set. -2. Install the required python libraries by running the following command (from the working directory): -```bash -pip install -r requirements.txt -``` -2. Run the following command (from the label_studio_interface_directory): -```bash -python basic_demonstration.py -``` \ No newline at end of file diff --git a/label_studio_interface/__init__.py b/label_studio_interface/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/label_studio_interface/basic_demonstration.py b/label_studio_interface/basic_demonstration.py deleted file mode 100644 index 17e3d327..00000000 --- a/label_studio_interface/basic_demonstration.py +++ /dev/null @@ -1,126 +0,0 @@ -""" -This script will serve as a basic demonstration of the functionality of -Label Studio and the Python configuration developed. - -The script will: - 1. Load the configuration for the Label Studio API - 2. Delete all task data from the associated project in Label Studio (if any exists) - 3. Import new task data into the project - 4. Prompt the user to access Label Studio and perform review and annotation tasks - 5. Export the annotated data from Label Studio and present it to the user - -The configuration for the Label Studio API will be loaded from the dev.env file within this directory -However, the access token in the file is not valid and will need to be replaced with a valid access token - -All actions will be performed on the 'Simple URL Labeler" project viewable at https://app.heartex.com/projects/58903/ -""" - -from LabelStudioAPIManager import LabelStudioAPIManager -from LabelStudioConfig import LabelStudioConfig - -# Simple URL Labeler project URL -project_url = "https://app.heartex.com/projects/58903/" - -# Load the configuration for the Label Studio API -config = LabelStudioConfig("dev.env") -if "REPLACE_WITH_YOUR_TOKEN" in config.authorization_token: - raise ValueError("Please replace the access token in dev.env with your own access token") - -# Create an API manager -api_manager = LabelStudioAPIManager(config) - -print("Deleting project tasks...") -# Delete all task data from the associated project in Label Studio (if any exists) -api_manager.delete_project_tasks() - -# Prompt the user to access Label Studio and confirm that the project has been cleared -print(f"Please access the project at {project_url} to confirm that the project has been cleared") - -# Wait for the user to confirm that the project has been cleared -input("Press Enter once confirmed...") -print("Continuing...") - -# Import new task data into the project -# Two tasks will be imported: one which has not been annotated and one which has been pre-annotated -# These tasks are provided in their final data form, -# but will need to be converted into this form in the eventual pipeline -data = [ - { - "data": { - "url": "https://test_data.gov/test/test-services/annual-test/" - } - }, - { - "data": { - "url": "www.example.com" - }, - "annotations": [ - { - "result": [ - { - "type": "taxonomy", - "value": { - "taxonomy": [ - [ - "Police Public Interactions" - ], - [ - "Police Public Interactions", - "Accident Reports" - ], - [ - "Police Public Interactions", - "Arrest Records" - ], - [ - "Agency Published Resources" - ], - [ - "Agency Published Resources", - "Crime Maps and Reports" - ], - [ - "Non-Criminal Justice" - ] - ] - }, - "origin": "manual", - "to_name": "url_text", - "from_name": "category" - }, - { - "type": "choices", - "value": { - "choices": [ - "Y" - ] - }, - "origin": "manual", - "to_name": "is_single_record", - "from_name": "single_record_checkbox" - } - ] - } - ] - } -] -api_manager.export_tasks_into_project(data) - -# Prompt the user to access Label Studio and perform review and annotation tasks -print(f"Please access the project at {project_url} to perform review and annotation tasks") - -# Wait for the user to complete the tasks -input("Press Enter when complete...") -print("Continuing...") - -# Import the annotated data from Label Studio and present it to the user -response = api_manager.import_tasks_from_project(all_tasks=True) -print("Presenting annotated data (showing only first results)...") -results = response.json() -for result in results: - print(f"Task URL: {result['data']['url']}") - if len(result['annotations']) == 0: - print("No annotations") - else: - print(f"Annotations: {result['annotations'][0]['result']}") - print("\n") diff --git a/label_studio_interface/dev.env b/label_studio_interface/dev.env deleted file mode 100644 index 5b603e4d..00000000 --- a/label_studio_interface/dev.env +++ /dev/null @@ -1,3 +0,0 @@ -LABEL_STUDIO_ACCESS_TOKEN=REPLACE_WITH_YOUR_TOKEN -LABEL_STUDIO_PROJECT_ID=58903 -LABEL_STUDIO_ORGANIZATION_ID=9876 \ No newline at end of file diff --git a/local_database/DataDumper/dump.sh b/local_database/DataDumper/dump.sh index fb514157..9c07c0ca 100644 --- a/local_database/DataDumper/dump.sh +++ b/local_database/DataDumper/dump.sh @@ -6,7 +6,7 @@ DB_USER=${DUMP_USER:-"your_user"} DB_PORT=${DUMP_PORT:-"5432"} # Default to 5432 if not provided DB_PASSWORD=${DUMP_PASSWORD:-"your_password"} DB_NAME=${DUMP_NAME:-"your_database"} -DUMP_FILE=${DUMP_FILE:-"/dump/db_dump.sql"} +DUMP_FILE="/dump/db_dump.sql" # Export password for pg_dump export PGPASSWORD=$DB_PASSWORD # Dump the database diff --git a/local_database/DataDumper/restore.sh b/local_database/DataDumper/restore.sh index ff62349e..1efbe242 100644 --- a/local_database/DataDumper/restore.sh +++ b/local_database/DataDumper/restore.sh @@ -15,10 +15,14 @@ MAINT_CONNECTION_STRING="postgresql://$DB_USER:$DB_PASSWORD@$DB_HOST:$DB_PORT/$M echo "Checking if database $NEW_DB_NAME exists on $DB_HOST:$DB_PORT..." psql -d $MAINT_CONNECTION_STRING -tc "SELECT 1 FROM pg_database WHERE datname = '$NEW_DB_NAME';" | grep -q 1 && { echo "Database $NEW_DB_NAME exists. Dropping it..." - # Terminate all connections to the database - psql -d $MAINT_CONNECTION_STRING -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$NEW_DB_NAME';" + psql -d $MAINT_CONNECTION_STRING -tAc "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'your_database_name' AND pid <> pg_backend_pid();" # Drop the database psql -d $MAINT_CONNECTION_STRING -c "DROP DATABASE $NEW_DB_NAME;" + echo "Waiting for connections to terminate..." + while psql -d $MAINT_CONNECTION_STRING -tAc "SELECT 1 FROM pg_stat_activity WHERE datname = '$NEW_DB_NAME';" | grep -q 1; do + sleep 1 + echo "Still waiting..." + done } # Create the new database echo "Creating new database $NEW_DB_NAME on $DB_HOST:$DB_PORT..." diff --git a/start_mirrored_local_app.py b/start_mirrored_local_app.py new file mode 100644 index 00000000..f88d2e9c --- /dev/null +++ b/start_mirrored_local_app.py @@ -0,0 +1,402 @@ +""" +Starts a local instance of the application utilizing a database +mirrored from production. + +Because this is used for testing only, the docker module is not included in +requirements.txt, and must be installed separately via +`pip install docker` +""" +import datetime +import os +import platform +import subprocess +import sys +import time +from pathlib import Path +from typing import Optional, Annotated +import uvicorn + +import docker +from docker.errors import APIError, NotFound +from docker.models.containers import Container +from pydantic import BaseModel, model_validator, AfterValidator + +from apply_migrations import apply_migrations +from util.helper_functions import get_from_env + +def is_absolute_path(path: str) -> str: + if len(path) == 0: + raise ValueError("Path is required") + if path[0] != "/": + raise ValueError("Container path must be absolute") + return path + +class VolumeInfo(BaseModel): + host_path: str + container_path: Annotated[str, AfterValidator(is_absolute_path)] + + def build_volumes(self): + return { + get_absolute_path(self.host_path): { + "bind": self.container_path, + "mode": "rw" + } + } + +def wait_for_pg_to_be_ready(container: Container): + for i in range(30): + exit_code, output = container.exec_run("pg_isready") + print(output) + if exit_code == 0: + return + time.sleep(1) + raise Exception("Timed out waiting for postgres to be ready") + +def get_absolute_path(relative_path: str) -> str: + """ + Get absolute path, using the current file as the point of reference + """ + current_dir = Path(__file__).parent + absolute_path = (current_dir / relative_path).resolve() + return str(absolute_path) + + +class DockerfileInfo(BaseModel): + image_tag: str + dockerfile_directory: Optional[str] = None + + + +class HealthCheckInfo(BaseModel): + test: list[str] + interval: int + timeout: int + retries: int + start_period: int + + def build_healthcheck(self) -> dict: + multiplicative_factor = 1000000000 # Assume 1 second + return { + "test": self.test, + "interval": self.interval * multiplicative_factor, + "timeout": self.timeout * multiplicative_factor, + "retries": self.retries, + "start_period": self.start_period * multiplicative_factor + } + +class DockerInfo(BaseModel): + dockerfile_info: DockerfileInfo + volume_info: Optional[VolumeInfo] = None + name: str + ports: Optional[dict] = None + environment: Optional[dict] + command: Optional[str] = None + entrypoint: Optional[list[str]] = None + health_check_info: Optional[HealthCheckInfo] = None + +def run_command_checked(command: list[str] or str, shell=False): + result = subprocess.run( + command, + check=True, + capture_output=True, + text=True, + shell=shell + ) + return result + +def is_docker_running(): + try: + client = docker.from_env() + client.ping() + return True + except docker.errors.DockerException as e: + print(f"Docker is not running: {e}") + return False + +def wait_for_health(container, timeout=30): + start = time.time() + while time.time() - start < timeout: + container.reload() # Refresh container state + state = container.attrs.get("State") + print(state) + health = container.attrs.get("State", {}).get("Health", {}) + status = health.get("Status") + print(f"Health status: {status}") + if status == "healthy": + print("Postgres is healthy.") + return + elif status == "unhealthy": + raise Exception("Postgres container became unhealthy.") + time.sleep(1) + raise TimeoutError("Timed out waiting for Postgres to become healthy.") + +def start_docker_engine(): + system = platform.system() + + match system: + case "Windows": + # Use PowerShell to start Docker Desktop on Windows + subprocess.run([ + "powershell", "-Command", + "Start-Process 'Docker Desktop' -Verb RunAs" + ]) + case "Darwin": + # MacOS: Docker Desktop must be started manually or with open + subprocess.run(["open", "-a", "Docker"]) + case "Linux": + # Most Linux systems use systemctl to manage Docker + subprocess.run(["sudo", "systemctl", "start", "docker"]) + case _: + print(f"Unsupported OS: {system}") + sys.exit(1) + +class DockerManager: + def __init__(self): + self.client = docker.from_env() + self.network_name = "my_network" + self.network = self.start_network() + + def run_command(self, command: str, container_id: str): + exec_id = self.client.api.exec_create( + container_id, + cmd=command, + tty=True, + stdin=False + ) + output_stream = self.client.api.exec_start(exec_id=exec_id, stream=True) + for line in output_stream: + print(line.decode().rstrip()) + + def start_network(self): + try: + self.client.networks.create(self.network_name, driver="bridge") + except APIError as e: + # Assume already exists + print(e) + return self.client.networks.get("my_network") + + def stop_network(self): + self.client.networks.get("my_network").remove() + + def get_image(self, dockerfile_info: DockerfileInfo): + if dockerfile_info.dockerfile_directory: + # Build image from Dockerfile + self.client.images.build( + path=get_absolute_path(dockerfile_info.dockerfile_directory), + tag=dockerfile_info.image_tag + ) + else: + # Pull or use existing image + self.client.images.pull(dockerfile_info.image_tag) + + + def run_container( + self, + docker_info: DockerInfo, + ): + print(f"Running container {docker_info.name}") + try: + container = self.client.containers.get(docker_info.name) + if container.status == 'running': + print(f"Container '{docker_info.name}' is already running") + return container + print("Restarting container...") + container.start() + return container + except NotFound: + # Container does not exist; proceed to build/pull image and run + pass + + self.get_image(docker_info.dockerfile_info) + + container = self.client.containers.run( + image=docker_info.dockerfile_info.image_tag, + volumes=docker_info.volume_info.build_volumes() if docker_info.volume_info is not None else None, + command=docker_info.command, + entrypoint=docker_info.entrypoint, + detach=True, + name=docker_info.name, + ports=docker_info.ports, + network=self.network_name, + environment=docker_info.environment, + stdout=True, + stderr=True, + tty=True, + healthcheck=docker_info.health_check_info.build_healthcheck() if docker_info.health_check_info is not None else None + ) + return container + + def run_dockerfile(self, command: str): + dockerfile_path = os.path.dirname(os.path.abspath(__file__)) + tag = "court_scraper" + self.client.images.build( + path=dockerfile_path, + tag=tag + ) + + # Create data directory if doesn't exist + data_directory = dockerfile_path + "/data" + if not os.path.exists(data_directory): + os.makedirs(data_directory) + + volumes = { + data_directory: { + "bind": "/app/data", + "mode": "rw" + } + } + # Stop if + self.stop_dockerfile() + + container = self.run_container( + tag=tag, + command=command, + volumes=volumes, + name="court_scraper", + ports={"5000/tcp": 5000}, + environment={ + "MONGO_URI": "mongodb://mongo:27017/" + } + ) + + for log in container.logs(stream=True, follow=True): # 'follow=True' ensures logs stop when the container stops + print(log.decode().strip()) + + return container + + def stop_dockerfile(self): + try: + self.client.containers.get("court_scraper") + except NotFound: + return + self.client.containers.get("court_scraper").stop() + self.client.containers.get("court_scraper").remove() + +class TimestampChecker: + def __init__(self): + self.last_run_time: Optional[datetime.datetime] = self.load_last_run_time() + + def load_last_run_time(self) -> Optional[datetime.datetime]: + # Check if file `last_run.txt` exists + # If it does, load the last run time + if os.path.exists("local_state/last_run.txt"): + with open("local_state/last_run.txt", "r") as f: + return datetime.datetime.strptime( + f.read(), + "%Y-%m-%d %H:%M:%S" + ) + return None + + def last_run_within_24_hours(self): + if self.last_run_time is None: + return False + return datetime.datetime.now() - self.last_run_time < datetime.timedelta(days=1) + + def set_last_run_time(self): + # If directory `local_state` doesn't exist, create it + if not os.path.exists("local_state"): + os.makedirs("local_state") + + with open("local_state/last_run.txt", "w") as f: + f.write(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + + + +def main(): + docker_manager = DockerManager() + # Ensure docker is running, and start if not + if not is_docker_running(): + start_docker_engine() + + + # Ensure Dockerfile for database is running, and if not, start it + database_docker_info = DockerInfo( + dockerfile_info=DockerfileInfo( + image_tag="postgres:15", + ), + # volume_info=VolumeInfo( + # host_path="dbscripts", + # container_path="/var/lib/postgresql/data" + # ), + name="data_source_identification_db", + ports={ + "5432/tcp": 5432 + }, + environment={ + "POSTGRES_PASSWORD": "HanviliciousHamiltonHilltops", + "POSTGRES_USER": "test_source_collector_user", + "POSTGRES_DB": "source_collector_test_db" + }, + health_check_info=HealthCheckInfo( + test=["pg_isready", "-U", "test_source_collector_user", "-h", "127.0.0.1", "-p", "5432"], + interval=1, + timeout=3, + retries=30, + start_period=2 + ) + ) + container = docker_manager.run_container(database_docker_info) + wait_for_pg_to_be_ready(container) + + + # Start dockerfile for Datadumper + data_dumper_docker_info = DockerInfo( + dockerfile_info=DockerfileInfo( + image_tag="datadumper", + dockerfile_directory="local_database/DataDumper" + ), + volume_info=VolumeInfo( + host_path="./local_database/DataDumper/dump", + container_path="/dump" + ), + name="datadumper", + environment={ + "DUMP_HOST": get_from_env("DUMP_HOST"), + "DUMP_USER": get_from_env("DUMP_USER"), + "DUMP_PASSWORD": get_from_env("DUMP_PASSWORD"), + "DUMP_NAME": get_from_env("DUMP_DB_NAME"), + "DUMP_PORT": get_from_env("DUMP_PORT"), + "RESTORE_HOST": "data_source_identification_db", + "RESTORE_USER": "test_source_collector_user", + "RESTORE_PORT": "5432", + "RESTORE_DB_NAME": "source_collector_test_db", + "RESTORE_PASSWORD": "HanviliciousHamiltonHilltops", + }, + command="bash" + ) + + # If not last run within 24 hours, run dump operation in Datadumper + # Check cache if exists and + checker = TimestampChecker() + container = docker_manager.run_container(data_dumper_docker_info) + if checker.last_run_within_24_hours(): + print("Last run within 24 hours, skipping dump...") + else: + docker_manager.run_command( + '/usr/local/bin/dump.sh', + container.id + ) + docker_manager.run_command( + "/usr/local/bin/restore.sh", + container.id + ) + print("Stopping datadumper container") + container.stop() + checker.set_last_run_time() + + # Upgrade using alembic + apply_migrations() + + # Run `fastapi dev main.py` + uvicorn.run( + "api.main:app", + host="0.0.0.0", + port=8000 + ) + + + + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 5288496b..8968555c 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -175,6 +175,7 @@ def urls( self, batch_id: int, url_count: int, + collector_metadata: Optional[dict] = None, outcome: URLStatus = URLStatus.PENDING ) -> InsertURLsInfo: raw_urls = generate_test_urls(url_count) @@ -183,7 +184,8 @@ def urls( url_infos.append( URLInfo( url=url, - outcome=outcome + outcome=outcome, + collector_metadata=collector_metadata ) ) diff --git a/tests/test_automated/integration/tasks/test_url_html_task.py b/tests/test_automated/integration/tasks/test_url_html_task.py index 75c46855..3839d0a6 100644 --- a/tests/test_automated/integration/tasks/test_url_html_task.py +++ b/tests/test_automated/integration/tasks/test_url_html_task.py @@ -7,9 +7,7 @@ from collector_db.enums import TaskType from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator -from core.enums import BatchStatus from tests.helpers.DBDataCreator import DBDataCreator -from tests.helpers.assert_functions import assert_database_has_no_tasks from html_tag_collector.DataClassTags import ResponseHTMLInfo from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.RootURLCache import RootURLCache diff --git a/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py b/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py new file mode 100644 index 00000000..71093b2e --- /dev/null +++ b/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py @@ -0,0 +1,143 @@ +from typing import Optional + +import pytest + +from collector_db.models import URL, URLOptionalDataSourceMetadata +from collector_manager.enums import CollectorType +from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome +from core.classes.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator +from helpers.DBDataCreator import DBDataCreator + + +def batch_and_url( + db_data_creator: DBDataCreator, + collector_type: CollectorType, + collector_metadata: Optional[dict] +): + batch_id = db_data_creator.batch(strategy=collector_type) + url_id = db_data_creator.urls( + batch_id=batch_id, + url_count=1, + collector_metadata=collector_metadata + ).url_mappings[0].url_id + return url_id + + +@pytest.mark.asyncio +async def test_url_miscellaneous_metadata_task(db_data_creator: DBDataCreator): + + operator = URLMiscellaneousMetadataTaskOperator(adb_client=db_data_creator.adb_client) + + # Currently, task should not meet prerequisites + meets_prereqs = await operator.meets_task_prerequisites() + assert not meets_prereqs + + # Add one URL for each of the following batches, with appropriate collector metadata: + # ckan + ckan_url_id = batch_and_url( + db_data_creator, + CollectorType.CKAN, + collector_metadata={ + "submitted_name": "Test CKAN Name", + "description": "Test CKAN Description", + "record_format": ["CSV", "JSON"], + "data_portal_type": "Test Data Portal Type", + "supplying_entity": "Test Supplying Entity" + } + ) + # muckrock_simple + muckrock_simple_url_id = batch_and_url( + db_data_creator, + CollectorType.MUCKROCK_SIMPLE_SEARCH, + collector_metadata={ + 'title': 'Test Muckrock Simple Title', + } + ) + # muckrock_county + muckrock_county_url_id = batch_and_url( + db_data_creator, + CollectorType.MUCKROCK_COUNTY_SEARCH, + collector_metadata={ + 'title': 'Test Muckrock County Title', + } + ) + # muckrock_all + muckrock_all_url_id = batch_and_url( + db_data_creator, + CollectorType.MUCKROCK_ALL_SEARCH, + collector_metadata={ + 'title': 'Test Muckrock All Title', + } + ) + # auto_googler + auto_googler_url_id = batch_and_url( + db_data_creator, + CollectorType.AUTO_GOOGLER, + collector_metadata={ + "title" : "Test Auto Googler Title", + "snippet" : "Test Auto Googler Snippet" + } + ) + # common_crawler + common_crawler_url_id = batch_and_url( + db_data_creator, + CollectorType.COMMON_CRAWLER, + collector_metadata=None + ) + # example + + # Check that task now meets prerequisites + meets_prereqs = await operator.meets_task_prerequisites() + assert meets_prereqs + + # Run task + run_info = await operator.run_task(1) + assert run_info.outcome == TaskOperatorOutcome.SUCCESS + + # Check that each URL has the expected name/description and optional metadata + expected_urls = { + common_crawler_url_id: (None, None), + auto_googler_url_id: ("Test Auto Googler Title", "Test Auto Googler Snippet"), + ckan_url_id: ("Test CKAN Name", "Test CKAN Description"), + muckrock_simple_url_id: ("Test Muckrock Simple Title", "Test Muckrock Simple Title"), + muckrock_county_url_id: ("Test Muckrock County Title", "Test Muckrock County Title"), + muckrock_all_url_id: ("Test Muckrock All Title", "Test Muckrock All Title"), + } + + urls: list[URL] = await db_data_creator.adb_client.get_all(URL) + assert len(urls) == len(expected_urls) + + seen_ids = set() + + for url in urls: + assert url.id not in seen_ids, f"Duplicate url.id found: {url.id}" + seen_ids.add(url.id) + + assert url.id in expected_urls, f"Unexpected url.id: {url.id}" + expected_name, expected_description = expected_urls[url.id] + assert url.name == expected_name, f"For url.id {url.id}, expected name {expected_name}, got {url.name}" + assert url.description == expected_description, f"For url.id {url.id}, expected description {expected_description}, got {url.description}" + + expected_urls = { + common_crawler_url_id: (None, None, None), + auto_googler_url_id: (None, None, None), + ckan_url_id: (["CSV", "JSON"], "Test Data Portal Type", "Test Supplying Entity"), + muckrock_simple_url_id: (None, None, None), + muckrock_county_url_id: (None, None, None), + muckrock_all_url_id: (None, None, None), + } + + metadatas: list[URLOptionalDataSourceMetadata] = await db_data_creator.adb_client.get_all(URLOptionalDataSourceMetadata) + seen_ids = set() + for metadata in metadatas: + assert metadata.url_id not in seen_ids, f"Duplicate url.id found: {metadata.url_id}" + seen_ids.add(metadata.url_id) + + assert metadata.url_id in expected_urls, f"Unexpected url.id: {metadata.url_id}" + expected_record_format, expected_data_portal_type, expected_supplying_entity = expected_urls[metadata.url_id] + assert metadata.record_formats == expected_record_format, f"For url.id {metadata.url_id}, expected record_format {expected_record_format}, got {metadata.url_id}" + assert metadata.data_portal_type == expected_data_portal_type, f"For url.id {metadata.url_id}, expected data_portal_type {expected_data_portal_type}, got {metadata.url_id}" + assert metadata.supplying_entity == expected_supplying_entity, f"For url.id {metadata.url_id}, expected supplying_entity {expected_supplying_entity}, got {metadata.url_id}" + + + From d8183a7f14b90045c0aa9937eefe85bc10227d98 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 25 Mar 2025 15:01:28 -0400 Subject: [PATCH 065/244] Correct bug in import addressing --- .../integration/tasks/test_url_miscellaneous_metadata_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py b/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py index 71093b2e..51f57da9 100644 --- a/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py +++ b/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py @@ -6,7 +6,7 @@ from collector_manager.enums import CollectorType from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator -from helpers.DBDataCreator import DBDataCreator +from tests.helpers.DBDataCreator import DBDataCreator def batch_and_url( From 590d719e7413f1305743378de663e718002445e5 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 26 Mar 2025 20:46:11 -0400 Subject: [PATCH 066/244] feat(app): Add additional information to Final Review Process --- collector_db/AsyncDatabaseClient.py | 100 ++++++++++++++++-- core/AsyncCore.py | 5 +- core/DTOs/FinalReviewApprovalInfo.py | 30 +++++- core/DTOs/GetNextURLForFinalReviewResponse.py | 20 +++- start_mirrored_local_app.py | 45 -------- tests/helpers/DBDataCreator.py | 27 +++++ tests/helpers/complex_test_data_functions.py | 10 +- .../integration/api/test_review.py | 26 ++++- .../collector_db/test_db_client.py | 75 ++++++++++++- 9 files changed, 267 insertions(+), 71 deletions(-) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 41685a4b..b8ba14a1 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -1,5 +1,5 @@ from functools import wraps -from typing import Optional, Type +from typing import Optional, Type, Any from fastapi import HTTPException from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, or_, update @@ -24,11 +24,13 @@ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ UserRecordTypeSuggestion, ApprovingUserURL, URLOptionalDataSourceMetadata from collector_manager.enums import URLStatus, CollectorType +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ GetNextURLForAgencyAgencyInfo, GetNextURLForAgencyAnnotationInnerResponse -from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, FinalReviewAnnotationInfo +from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, FinalReviewAnnotationInfo, \ + FinalReviewOptionalMetadata from core.DTOs.GetTasksResponse import GetTasksResponse, GetTasksResponseTaskInfo from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseErrorInfo, \ GetURLsResponseInnerInfo @@ -1014,6 +1016,7 @@ def count_subquery(model: Type[Base]): URL.outcome == URLStatus.PENDING.value ) + # The below relationships are joined directly to the URL single_join_relationships = [ URL.agency, URL.html_content, @@ -1021,12 +1024,14 @@ def count_subquery(model: Type[Base]): URL.auto_relevant_suggestion, URL.user_relevant_suggestions, URL.user_record_type_suggestions, + URL.optional_data_source_metadata ] options = [ joinedload(relationship) for relationship in single_join_relationships ] + # The below relationships are joined to entities that are joined to the URL double_join_relationships = [ (URL.automated_agency_suggestions, AutomatedUrlAgencySuggestion.agency), (URL.user_agency_suggestions, UserUrlAgencySuggestion.agency) @@ -1059,11 +1064,23 @@ def count_subquery(model: Type[Base]): html_content = result.html_content html_content_infos = [URLHTMLContentInfo(**html_info.__dict__) for html_info in html_content] + if result.optional_data_source_metadata is None: + optional_metadata = FinalReviewOptionalMetadata() + else: + optional_metadata = FinalReviewOptionalMetadata( + record_formats=result.optional_data_source_metadata.record_formats, + data_portal_type=result.optional_data_source_metadata.data_portal_type, + supplying_entity=result.optional_data_source_metadata.supplying_entity + ) + + # Return return GetNextURLForFinalReviewResponse( id=result.id, url=result.url, html_info=convert_to_response_html_info(html_content_infos), + name=result.name, + description=result.description, annotations=FinalReviewAnnotationInfo( relevant=DTOConverter.final_review_annotation_relevant_info( user_suggestions=result.user_relevant_suggestions, @@ -1078,33 +1095,63 @@ def count_subquery(model: Type[Base]): user_agency_suggestions=result.user_agency_suggestions, confirmed_agency=result.agency ) - ) + ), + optional_metadata=optional_metadata ) @session_manager async def approve_url( self, session: AsyncSession, - url_id: int, - record_type: RecordType, - relevant: bool, + approval_info: FinalReviewApprovalInfo, user_id: int, - agency_id: Optional[int] = None, ) -> None: # Get URL + def update_if_not_none( + model, + field, + value: Optional[Any], + required: bool=False + ): + if value is not None: + setattr(model, field, value) + return + if not required: + return + model_value = getattr(model, field, None) + if model_value is None: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"Must specify {field} if it does not already exist" + ) + query = ( Select(URL) - .where(URL.id == url_id) + .where(URL.id == approval_info.url_id) + .options( + joinedload(URL.optional_data_source_metadata), + ) ) url = await session.execute(query) url = url.scalars().first() - url.record_type = record_type.value - url.relevant = relevant + update_if_not_none( + url, + "record_type", + approval_info.record_type.value if approval_info.record_type is not None else None, + required=True + ) + update_if_not_none( + url, + "relevant", + approval_info.relevant, + required=True + ) + agency_id = approval_info.agency_id if url.agency_id is None and agency_id is None: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, @@ -1114,13 +1161,44 @@ async def approve_url( if url.agency_id != agency_id and agency_id is not None: url.agency_id = agency_id + + # If it does, do nothing url.outcome = URLStatus.VALIDATED.value + update_if_not_none(url, "name", approval_info.name, required=True) + update_if_not_none(url, "description", approval_info.description, required=True) + + optional_metadata = url.optional_data_source_metadata + if optional_metadata is None: + url.optional_data_source_metadata = URLOptionalDataSourceMetadata( + record_formats=approval_info.record_formats, + data_portal_type=approval_info.data_portal_type, + supplying_entity=approval_info.supplying_entity + ) + else: + update_if_not_none( + optional_metadata, + "record_formats", + approval_info.record_formats + ) + update_if_not_none( + optional_metadata, + "data_portal_type", + approval_info.data_portal_type + ) + update_if_not_none( + optional_metadata, + "supplying_entity", + approval_info.supplying_entity + ) + + # Add approving user + approving_user_url = ApprovingUserURL( user_id=user_id, - url_id=url_id + url_id=approval_info.url_id ) session.add(approving_user_url) diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 5317023b..8b422d7d 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -226,10 +226,7 @@ async def approve_and_get_next_source_for_review( access_info: AccessInfo ): await self.adb_client.approve_url( - url_id=approval_info.url_id, - record_type=approval_info.record_type, - relevant=approval_info.relevant, - agency_id=approval_info.agency_id, + approval_info=approval_info, user_id=access_info.user_id ) return await self.get_next_source_for_review() diff --git a/core/DTOs/FinalReviewApprovalInfo.py b/core/DTOs/FinalReviewApprovalInfo.py index 210a07e3..f0cb3733 100644 --- a/core/DTOs/FinalReviewApprovalInfo.py +++ b/core/DTOs/FinalReviewApprovalInfo.py @@ -9,12 +9,12 @@ class FinalReviewApprovalInfo(BaseModel): url_id: int = Field( title="The id of the URL." ) - record_type: RecordType = Field( + record_type: Optional[RecordType] = Field( title="The final record type of the URL." "If none, defers to the existing value from the auto-labeler only if it exists.", default=None ) - relevant: bool = Field( + relevant: Optional[bool] = Field( title="Final determination on whether the URL is relevant." "If none, defers to the existing value from the auto-labeler only if it exists.", default=None @@ -24,3 +24,29 @@ class FinalReviewApprovalInfo(BaseModel): "If none, defers to an existing confirmed agency only if that exists.", default=None ) + name: Optional[str] = Field( + title="The name of the source. " + "If none, defers to an existing name only if that exists.", + default=None + ) + description: Optional[str] = Field( + title="The description of the source. " + "If none, defers to an existing description only if that exists.", + default=None + ) + record_formats: Optional[list[str]] = Field( + title="The record formats of the source. " + "If none, defers to an existing record formats only if that exists.", + default=None + ) + data_portal_type: Optional[str] = Field( + title="The data portal type of the source. " + "If none, defers to an existing data portal type only if that exists.", + default=None + ) + supplying_entity: Optional[str] = Field( + title="The supplying entity of the source. " + "If none, defers to an existing supplying entity only if that exists.", + default=None + ) + diff --git a/core/DTOs/GetNextURLForFinalReviewResponse.py b/core/DTOs/GetNextURLForFinalReviewResponse.py index df28040b..70eb1301 100644 --- a/core/DTOs/GetNextURLForFinalReviewResponse.py +++ b/core/DTOs/GetNextURLForFinalReviewResponse.py @@ -6,7 +6,6 @@ from core.enums import RecordType from html_tag_collector.DataClassTags import ResponseHTMLInfo -# Todo: Add descriptions class FinalReviewAnnotationRelevantUsersInfo(BaseModel): relevant: int = Field(title="Number of users who marked the URL as relevant") @@ -54,13 +53,32 @@ class FinalReviewAnnotationInfo(BaseModel): title="User and auto annotations for agency", ) +class FinalReviewOptionalMetadata(BaseModel): + record_formats: Optional[list[str]] = Field( + title="The record formats of the source", + default=None + ) + data_portal_type: Optional[str] = Field( + title="The data portal type of the source", + default=None + ) + supplying_entity: Optional[str] = Field( + title="The supplying entity of the source", + default=None + ) + class GetNextURLForFinalReviewResponse(BaseModel): id: int = Field(title="The id of the URL") url: str = Field(title="The URL") + name: Optional[str] = Field(title="The name of the source") + description: Optional[str] = Field(title="The description of the source") html_info: ResponseHTMLInfo = Field(title="The HTML content of the URL") annotations: FinalReviewAnnotationInfo = Field( title="The annotations for the URL, from both users and the auto-labeler", ) + optional_metadata: FinalReviewOptionalMetadata = Field( + title="Optional metadata for the source", + ) class GetNextURLForFinalReviewOuterResponse(BaseModel): next_source: Optional[GetNextURLForFinalReviewResponse] = Field( diff --git a/start_mirrored_local_app.py b/start_mirrored_local_app.py index f88d2e9c..48859adc 100644 --- a/start_mirrored_local_app.py +++ b/start_mirrored_local_app.py @@ -226,51 +226,6 @@ def run_container( ) return container - def run_dockerfile(self, command: str): - dockerfile_path = os.path.dirname(os.path.abspath(__file__)) - tag = "court_scraper" - self.client.images.build( - path=dockerfile_path, - tag=tag - ) - - # Create data directory if doesn't exist - data_directory = dockerfile_path + "/data" - if not os.path.exists(data_directory): - os.makedirs(data_directory) - - volumes = { - data_directory: { - "bind": "/app/data", - "mode": "rw" - } - } - # Stop if - self.stop_dockerfile() - - container = self.run_container( - tag=tag, - command=command, - volumes=volumes, - name="court_scraper", - ports={"5000/tcp": 5000}, - environment={ - "MONGO_URI": "mongodb://mongo:27017/" - } - ) - - for log in container.logs(stream=True, follow=True): # 'follow=True' ensures logs stop when the container stops - print(log.decode().strip()) - - return container - - def stop_dockerfile(self): - try: - self.client.containers.get("court_scraper") - except NotFound: - return - self.client.containers.get("court_scraper").stop() - self.client.containers.get("court_scraper").remove() class TimestampChecker: def __init__(self): diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 8968555c..31afb7c4 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -15,6 +15,7 @@ from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource, TaskType from collector_manager.enums import CollectorType, URLStatus from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO from core.enums import BatchStatus, SuggestionType, RecordType from tests.helpers.simple_test_data_functions import generate_test_urls @@ -194,6 +195,32 @@ def urls( batch_id=batch_id, ) + async def url_miscellaneous_metadata( + self, + url_id: int, + name: str = "Test Name", + description: str = "Test Description", + record_formats: Optional[list[str]] = None, + data_portal_type: Optional[str] = "Test Data Portal Type", + supplying_entity: Optional[str] = "Test Supplying Entity" + ): + if record_formats is None: + record_formats = ["Test Record Format", "Test Record Format 2"] + + tdo = URLMiscellaneousMetadataTDO( + url_id=url_id, + collector_metadata={}, + collector_type=CollectorType.EXAMPLE, + record_formats=record_formats, + name=name, + description=description, + data_portal_type=data_portal_type, + supplying_entity=supplying_entity + ) + + await self.adb_client.add_miscellaneous_metadata([tdo]) + + def duplicate_urls(self, duplicate_batch_id: int, url_ids: list[int]): """ Create duplicates for all given url ids, and associate them diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index 44415090..4aa9a86f 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -6,7 +6,8 @@ async def setup_for_get_next_url_for_final_review( db_data_creator: DBDataCreator, annotation_count: int, - include_user_annotations: bool = True + include_user_annotations: bool = True, + include_miscellaneous_metadata: bool = True ): """ Sets up the database to test the final_review functions @@ -15,7 +16,12 @@ async def setup_for_get_next_url_for_final_review( """ batch_id = db_data_creator.batch() - url_mapping = db_data_creator.urls(batch_id=batch_id, url_count=1).url_mappings[0] + url_mapping = db_data_creator.urls( + batch_id=batch_id, + url_count=1 + ).url_mappings[0] + if include_miscellaneous_metadata: + await db_data_creator.url_miscellaneous_metadata(url_id=url_mapping.url_id) await db_data_creator.html_data([url_mapping.url_id]) async def add_agency_suggestion(count: int): diff --git a/tests/test_automated/integration/api/test_review.py b/tests/test_automated/integration/api/test_review.py index 99af93e9..715c6926 100644 --- a/tests/test_automated/integration/api/test_review.py +++ b/tests/test_automated/integration/api/test_review.py @@ -1,6 +1,6 @@ import pytest -from collector_db.models import URL +from collector_db.models import URL, URLOptionalDataSourceMetadata from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse @@ -27,6 +27,15 @@ async def test_review_next_source(api_test_helper): result = outer_result.next_source + assert result.name == "Test Name" + assert result.description == "Test Description" + + optional_metadata = result.optional_metadata + + assert optional_metadata.data_portal_type == "Test Data Portal Type" + assert optional_metadata.supplying_entity == "Test Supplying Entity" + assert optional_metadata.record_formats == ["Test Record Format", "Test Record Format 2"] + assert result.url == url_mapping.url html_info = result.html_info assert html_info.description == "test description" @@ -80,7 +89,12 @@ async def test_approve_and_get_next_source_for_review(api_test_helper): url_id=url_mapping.url_id, record_type=RecordType.ARREST_RECORDS, relevant=True, - agency_id=agency_id + agency_id=agency_id, + name="New Test Name", + description="New Test Description", + record_formats=["New Test Record Format", "New Test Record Format 2"], + data_portal_type="New Test Data Portal Type", + supplying_entity="New Test Supplying Entity" ) ) @@ -96,5 +110,13 @@ async def test_approve_and_get_next_source_for_review(api_test_helper): assert url.record_type == RecordType.ARREST_RECORDS.value assert url.relevant == True assert url.outcome == URLStatus.VALIDATED.value + assert url.name == "New Test Name" + assert url.description == "New Test Description" + + optional_metadata = await adb_client.get_all(URLOptionalDataSourceMetadata) + assert len(optional_metadata) == 1 + assert optional_metadata[0].data_portal_type == "New Test Data Portal Type" + assert optional_metadata[0].supplying_entity == "New Test Supplying Entity" + assert optional_metadata[0].record_formats == ["New Test Record Format", "New Test Record Format 2"] diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index b8ac56f1..cd2527b6 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -1,6 +1,8 @@ from datetime import datetime, timedelta import pytest +from _pytest.outcomes import fail +from fastapi import HTTPException from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.BatchInfo import BatchInfo @@ -9,8 +11,9 @@ from collector_db.DTOs.URLInfo import URLInfo from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource -from collector_db.models import URL, ApprovingUserURL +from collector_db.models import URL, ApprovingUserURL, URLOptionalDataSourceMetadata from collector_manager.enums import URLStatus +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.enums import BatchStatus, RecordType, SuggestionType from tests.helpers.DBDataCreator import DBDataCreator from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review @@ -329,9 +332,11 @@ async def test_approve_url_basic(db_data_creator: DBDataCreator): adb_client = db_data_creator.adb_client # Approve URL. Only URL should be affected. No other properties should be changed. await adb_client.approve_url( - url_mapping.url_id, - record_type=RecordType.ARREST_RECORDS, - relevant=True, + approval_info=FinalReviewApprovalInfo( + url_id=url_mapping.url_id, + record_type=RecordType.ARREST_RECORDS, + relevant=True, + ), user_id=1 ) @@ -344,9 +349,71 @@ async def test_approve_url_basic(db_data_creator: DBDataCreator): assert url.record_type == RecordType.ARREST_RECORDS.value assert url.relevant == True assert url.outcome == URLStatus.VALIDATED.value + assert url.name == "Test Name" + assert url.description == "Test Description" approving_user_urls = await adb_client.get_all(ApprovingUserURL) assert len(approving_user_urls) == 1 assert approving_user_urls[0].user_id == 1 assert approving_user_urls[0].url_id == url_mapping.url_id + optional_metadata = await adb_client.get_all(URLOptionalDataSourceMetadata) + assert len(optional_metadata) == 1 + assert optional_metadata[0].url_id == url_mapping.url_id + assert optional_metadata[0].record_formats == ["Test Record Format", "Test Record Format 2"] + assert optional_metadata[0].data_portal_type == "Test Data Portal Type" + assert optional_metadata[0].supplying_entity == "Test Supplying Entity" + +@pytest.mark.asyncio +async def test_approval_url_error(db_data_creator: DBDataCreator): + url_mapping = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True, + include_miscellaneous_metadata=False + ) + + # Set all required descriptors to none and receive an error + adb_client = db_data_creator.adb_client + with pytest.raises(HTTPException) as e: + await adb_client.approve_url( + approval_info=FinalReviewApprovalInfo( + url_id=url_mapping.url_id, + ), + user_id=1 + ) + assert e.value.status_code == 422 + + # Create kwarg dictionary with all required approval info fields + kwarg_dict = { + "record_type": RecordType.ARREST_RECORDS, + "agency_id": await db_data_creator.agency(), + "name": "Test Name", + "description": "Test Description", + } + # For each keyword, create a copy of the kwargs and set that one to none + # Confirm it produces the correct error + for kwarg in kwarg_dict: + kwarg_copy = kwarg_dict.copy() + kwarg_copy[kwarg] = None + with pytest.raises(HTTPException) as e: + await adb_client.approve_url( + approval_info=FinalReviewApprovalInfo( + url_id=url_mapping.url_id, + relevant=True, + **kwarg_copy + ), + user_id=1 + ) + pytest.fail(f"Expected error for kwarg {kwarg}") + + # Test that if all kwargs are set, no error is raised + await adb_client.approve_url( + approval_info=FinalReviewApprovalInfo( + url_id=url_mapping.url_id, + relevant=True, + **kwarg_dict + ), + user_id=1 + ) + From 0552310fb88b406720d0bb24da14024dcc203c05 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 28 Mar 2025 09:09:24 -0400 Subject: [PATCH 067/244] DRAFT --- ...ef_remove_agency_id_parameter_from_urls.py | 56 ++++++++++++++++++ collector_db/AsyncDatabaseClient.py | 57 +++++++++++++------ collector_db/DTOConverter.py | 43 ++++++++------ collector_db/models.py | 22 ++++++- core/DTOs/FinalReviewApprovalInfo.py | 4 +- core/DTOs/GetNextURLForFinalReviewResponse.py | 2 +- tests/helpers/DBDataCreator.py | 2 +- .../integration/api/test_review.py | 24 ++++++-- .../collector_db/test_db_client.py | 2 +- 9 files changed, 164 insertions(+), 48 deletions(-) create mode 100644 alembic/versions/2025_03_28_0807-5ea47dacd0ef_remove_agency_id_parameter_from_urls.py diff --git a/alembic/versions/2025_03_28_0807-5ea47dacd0ef_remove_agency_id_parameter_from_urls.py b/alembic/versions/2025_03_28_0807-5ea47dacd0ef_remove_agency_id_parameter_from_urls.py new file mode 100644 index 00000000..bc3f9bd3 --- /dev/null +++ b/alembic/versions/2025_03_28_0807-5ea47dacd0ef_remove_agency_id_parameter_from_urls.py @@ -0,0 +1,56 @@ +"""Remove agency_id parameter from URLs + +Revision ID: 5ea47dacd0ef +Revises: 6eb8084e2f48 +Create Date: 2025-03-28 08:07:24.442764 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '5ea47dacd0ef' +down_revision: Union[str, None] = '6eb8084e2f48' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # Remove agency ID column from URLs + op.drop_column( + 'urls', + 'agency_id' + ) + + op.create_table( + 'confirmed_url_agency', + sa.Column('id', sa.Integer(), primary_key=True), + sa.Column('url_id', sa.Integer(), sa.ForeignKey('urls.id', ondelete='CASCADE'), nullable=False), + sa.Column( + 'agency_id', + sa.Integer(), + sa.ForeignKey('agencies.agency_id', ondelete='CASCADE'), nullable=False), + sa.Column('created_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()')), + sa.Column('updated_at', sa.TIMESTAMP(), nullable=False, server_default=sa.text('now()'), onupdate=sa.text('now()')), + sa.UniqueConstraint( + 'url_id', 'agency_id', + name="uq_confirmed_url_agency" + ) + ) + + +def downgrade() -> None: + op.add_column( + 'urls', + sa.Column( + 'agency_id', + sa.Integer(), + sa.ForeignKey('agencies.agency_id', ondelete='NO ACTION'), + nullable=True + ) + ) + + op.drop_table('confirmed_url_agency') \ No newline at end of file diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index b8ba14a1..2d6f2efe 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -2,7 +2,7 @@ from typing import Optional, Type, Any from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, or_, update +from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, or_, update, Delete, Insert from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import selectinload, joinedload, QueryableAttribute from sqlalchemy.sql.functions import coalesce @@ -22,7 +22,7 @@ from collector_db.models import URL, URLErrorInfo, URLHTMLContent, Base, \ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ - UserRecordTypeSuggestion, ApprovingUserURL, URLOptionalDataSourceMetadata + UserRecordTypeSuggestion, ApprovingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency from collector_manager.enums import URLStatus, CollectorType from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseInfo @@ -775,10 +775,9 @@ async def get_next_url_agency_for_annotation( # Select statement statement = ( select(URL.id, URL.url) - # Must not have a confirmed agency identifier. + # Must not have confirmed agencies .where( and_( - URL.agency_id.is_(None), URL.outcome == URLStatus.PENDING.value ) ) @@ -803,6 +802,15 @@ async def get_next_url_agency_for_annotation( correlate(URL) ) ) + # Must not have confirmed agencies + .join(ConfirmedURLAgency, isouter=True) + .where( + ~exists( + select(ConfirmedURLAgency). + where(ConfirmedURLAgency.url_id == URL.id). + correlate(URL) + ) + ) ).limit(1) raw_result = await session.execute(statement) results = raw_result.all() @@ -885,9 +893,11 @@ async def add_confirmed_agency_url_links( suggestions: list[URLAgencySuggestionInfo] ): for suggestion in suggestions: - url = await session.execute(select(URL).where(URL.id == suggestion.url_id)) - url = url.scalar_one() - url.agency_id = suggestion.pdap_agency_id + confirmed_agency = ConfirmedURLAgency( + url_id=suggestion.url_id, + agency_id=suggestion.pdap_agency_id + ) + session.add(confirmed_agency) @session_manager async def add_agency_auto_suggestions( @@ -1018,13 +1028,12 @@ def count_subquery(model: Type[Base]): # The below relationships are joined directly to the URL single_join_relationships = [ - URL.agency, URL.html_content, URL.auto_record_type_suggestion, URL.auto_relevant_suggestion, URL.user_relevant_suggestions, URL.user_record_type_suggestions, - URL.optional_data_source_metadata + URL.optional_data_source_metadata, ] options = [ @@ -1034,7 +1043,8 @@ def count_subquery(model: Type[Base]): # The below relationships are joined to entities that are joined to the URL double_join_relationships = [ (URL.automated_agency_suggestions, AutomatedUrlAgencySuggestion.agency), - (URL.user_agency_suggestions, UserUrlAgencySuggestion.agency) + (URL.user_agency_suggestions, UserUrlAgencySuggestion.agency), + (URL.confirmed_agencies, ConfirmedURLAgency.agency) ] for primary, secondary in double_join_relationships: options.append(joinedload(primary).joinedload(secondary)) @@ -1093,7 +1103,7 @@ def count_subquery(model: Type[Base]): agency=DTOConverter.final_review_annotation_agency_info( automated_agency_suggestions=result.automated_agency_suggestions, user_agency_suggestions=result.user_agency_suggestions, - confirmed_agency=result.agency + confirmed_agencies=result.confirmed_agencies ) ), optional_metadata=optional_metadata @@ -1132,6 +1142,7 @@ def update_if_not_none( .where(URL.id == approval_info.url_id) .options( joinedload(URL.optional_data_source_metadata), + joinedload(URL.confirmed_agencies), ) ) @@ -1151,17 +1162,29 @@ def update_if_not_none( required=True ) - agency_id = approval_info.agency_id - if url.agency_id is None and agency_id is None: + # Get existing agency ids + existing_agency_ids = [agency.agency_id for agency in url.confirmed_agencies] + new_agency_ids = approval_info.agency_ids + if len(existing_agency_ids) == 0 and len(new_agency_ids) == 0: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Must specify agency_id if URL does not already have a confirmed agency" ) - # If a different agency exists as confirmed, overwrite it - if url.agency_id != agency_id and agency_id is not None: - url.agency_id = agency_id - + # Get any existing agency ids that are not in the new agency ids + for existing_agency in url.confirmed_agencies: + if existing_agency.id not in new_agency_ids: + # If the existing agency id is not in the new agency ids, delete it + await session.delete(existing_agency) + # Add any new agency ids that are not in the existing agency ids + for new_agency_id in new_agency_ids: + if new_agency_id not in existing_agency_ids: + # If the new agency id is not in the existing agency ids, add it + confirmed_url_agency = ConfirmedURLAgency( + url_id=approval_info.url_id, + agency_id=new_agency_id + ) + session.add(confirmed_url_agency) # If it does, do nothing diff --git a/collector_db/DTOConverter.py b/collector_db/DTOConverter.py index 6bf9a967..0d2856cf 100644 --- a/collector_db/DTOConverter.py +++ b/collector_db/DTOConverter.py @@ -4,7 +4,8 @@ from collector_db.DTOs.URLWithHTML import URLWithHTML from collector_db.enums import ValidationStatus, ValidationSource, URLMetadataAttributeType from collector_db.models import AutomatedUrlAgencySuggestion, UserUrlAgencySuggestion, URLHTMLContent, URL, Agency, \ - AutoRecordTypeSuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion, AutoRelevantSuggestion + AutoRecordTypeSuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion, AutoRelevantSuggestion, \ + ConfirmedURLAgency from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo from core.DTOs.GetNextURLForFinalReviewResponse import FinalReviewAnnotationRelevantInfo, \ FinalReviewAnnotationRelevantUsersInfo, FinalReviewAnnotationRecordTypeInfo, FinalReviewAnnotationAgencyAutoInfo, \ @@ -130,27 +131,35 @@ def user_url_agency_suggestion_to_final_review_annotation_agency_user_info( # Return sorted return dict(sorted(d.items(), key=lambda x: x[1].count, reverse=True)) + @staticmethod + def confirmed_agencies_to_final_review_annotation_agency_info( + confirmed_agencies: list[ConfirmedURLAgency] + ) -> list[GetNextURLForAgencyAgencyInfo]: + results = [] + for confirmed_agency in confirmed_agencies: + agency = confirmed_agency.agency + agency_info = GetNextURLForAgencyAgencyInfo( + suggestion_type=SuggestionType.CONFIRMED, + pdap_agency_id=agency.agency_id, + agency_name=agency.name, + state=agency.state, + county=agency.county, + locality=agency.locality + ) + results.append(agency_info) + return results + @staticmethod def final_review_annotation_agency_info( automated_agency_suggestions: list[AutomatedUrlAgencySuggestion], - confirmed_agency: Optional[Agency], + confirmed_agencies: list[ConfirmedURLAgency], user_agency_suggestions: list[UserUrlAgencySuggestion] ): - if confirmed_agency is not None: - confirmed_agency_info = GetNextURLForAgencyAgencyInfo( - suggestion_type=SuggestionType.CONFIRMED, - pdap_agency_id=confirmed_agency.agency_id, - agency_name=confirmed_agency.name, - state=confirmed_agency.state, - county=confirmed_agency.county, - locality=confirmed_agency.locality - ) - return FinalReviewAnnotationAgencyInfo( - confirmed=confirmed_agency_info, - users=None, - auto=None - ) + + confirmed_agency_info = DTOConverter.confirmed_agencies_to_final_review_annotation_agency_info( + confirmed_agencies + ) agency_auto_info = DTOConverter.final_review_annotation_agency_auto_info( automated_agency_suggestions @@ -161,7 +170,7 @@ def final_review_annotation_agency_info( ) return FinalReviewAnnotationAgencyInfo( - confirmed=None, + confirmed=confirmed_agency_info, users=agency_user_info, auto=agency_auto_info ) diff --git a/collector_db/models.py b/collector_db/models.py index 4a61be88..55b75af2 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -101,7 +101,6 @@ class URL(Base): ), nullable=False ) - agency_id = Column(Integer, ForeignKey('agencies.agency_id', name='fk_url_agency_id')) record_type = Column(postgresql.ENUM(*record_type_values, name='record_type'), nullable=True) relevant = Column(Boolean, nullable=True) created_at = get_created_at_column() @@ -117,7 +116,6 @@ class URL(Base): secondary="link_task_urls", back_populates="urls", ) - agency = relationship("Agency", uselist=False, back_populates="urls") automated_agency_suggestions = relationship( "AutomatedUrlAgencySuggestion", back_populates="url") user_agency_suggestions = relationship( @@ -134,6 +132,10 @@ class URL(Base): "ApprovingUserURL", back_populates="url") optional_data_source_metadata = relationship( "URLOptionalDataSourceMetadata", uselist=False, back_populates="url") + confirmed_agencies = relationship( + "ConfirmedURLAgency", + ) + class URLOptionalDataSourceMetadata(Base): __tablename__ = 'url_optional_data_source_metadata' @@ -328,9 +330,23 @@ class Agency(Base): updated_at = get_updated_at_column() # Relationships - urls = relationship("URL", back_populates="agency") automated_suggestions = relationship("AutomatedUrlAgencySuggestion", back_populates="agency") user_suggestions = relationship("UserUrlAgencySuggestion", back_populates="agency") + confirmed_urls = relationship("ConfirmedURLAgency", back_populates="agency") + +class ConfirmedURLAgency(Base): + __tablename__ = "confirmed_url_agency" + + id = Column(Integer, primary_key=True, autoincrement=True) + url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) + agency_id = Column(Integer, ForeignKey("agencies.agency_id"), nullable=False) + + url = relationship("URL", back_populates="confirmed_agencies") + agency = relationship("Agency", back_populates="confirmed_urls") + + __table_args__ = ( + UniqueConstraint("url_id", "agency_id", name="uq_confirmed_url_agency"), + ) class AutomatedUrlAgencySuggestion(Base): __tablename__ = "automated_url_agency_suggestions" diff --git a/core/DTOs/FinalReviewApprovalInfo.py b/core/DTOs/FinalReviewApprovalInfo.py index f0cb3733..e24c3c75 100644 --- a/core/DTOs/FinalReviewApprovalInfo.py +++ b/core/DTOs/FinalReviewApprovalInfo.py @@ -19,8 +19,8 @@ class FinalReviewApprovalInfo(BaseModel): "If none, defers to the existing value from the auto-labeler only if it exists.", default=None ) - agency_id: Optional[int] = Field( - title="The final confirmed agency for the URL. " + agency_ids: Optional[list[int]] = Field( + title="The final confirmed agencies for the URL. " "If none, defers to an existing confirmed agency only if that exists.", default=None ) diff --git a/core/DTOs/GetNextURLForFinalReviewResponse.py b/core/DTOs/GetNextURLForFinalReviewResponse.py index 70eb1301..422c38ab 100644 --- a/core/DTOs/GetNextURLForFinalReviewResponse.py +++ b/core/DTOs/GetNextURLForFinalReviewResponse.py @@ -33,7 +33,7 @@ class FinalReviewAnnotationAgencyAutoInfo(BaseModel): ) class FinalReviewAnnotationAgencyInfo(BaseModel): - confirmed: Optional[GetNextURLForAgencyAgencyInfo] = Field( + confirmed: Optional[list[GetNextURLForAgencyAgencyInfo]] = Field( title="The confirmed agency for the URL", ) auto: Optional[FinalReviewAnnotationAgencyAutoInfo] = Field( diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 31afb7c4..9f9719a7 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -298,7 +298,7 @@ async def agency_auto_suggestions( async def agency_confirmed_suggestion( self, url_id: int - ): + ) -> int: """ Creates a confirmed agency suggestion and returns the auto-generated pdap_agency_id diff --git a/tests/test_automated/integration/api/test_review.py b/tests/test_automated/integration/api/test_review.py index 715c6926..b43a3ae8 100644 --- a/tests/test_automated/integration/api/test_review.py +++ b/tests/test_automated/integration/api/test_review.py @@ -1,6 +1,6 @@ import pytest -from collector_db.models import URL, URLOptionalDataSourceMetadata +from collector_db.models import URL, URLOptionalDataSourceMetadata, ConfirmedURLAgency from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse @@ -22,6 +22,7 @@ async def test_review_next_source(api_test_helper): url_id=url_mapping.url_id, count=3 ) + confirmed_agency_id = await ath.db_data_creator.agency_confirmed_suggestion(url_id=url_mapping.url_id) outer_result = await ath.request_validator.review_next_source() @@ -68,6 +69,12 @@ async def test_review_next_source(api_test_helper): for i in range(3): assert user_agency_suggestions_as_list[i].count == 3 - i + # Check confirmed agencies exist + confirmed_agencies = agency_info.confirmed + assert len(confirmed_agencies) == 1 + confirmed_agency = confirmed_agencies[0] + assert confirmed_agency.pdap_agency_id == confirmed_agency_id + @pytest.mark.asyncio async def test_approve_and_get_next_source_for_review(api_test_helper): ath = api_test_helper @@ -80,16 +87,16 @@ async def test_approve_and_get_next_source_for_review(api_test_helper): ) # Add confirmed agency - agency_id = await db_data_creator.agency_confirmed_suggestion( - url_id=url_mapping.url_id - ) + confirmed_agency = await db_data_creator.confirmed_suggestions([url_mapping.url_id]) + + agency_ids = [await db_data_creator.agency() for _ in range(3)] result: GetNextURLForFinalReviewOuterResponse = await ath.request_validator.approve_and_get_next_source_for_review( approval_info=FinalReviewApprovalInfo( url_id=url_mapping.url_id, record_type=RecordType.ARREST_RECORDS, relevant=True, - agency_id=agency_id, + agency_ids=agency_ids, name="New Test Name", description="New Test Description", record_formats=["New Test Record Format", "New Test Record Format 2"], @@ -106,7 +113,6 @@ async def test_approve_and_get_next_source_for_review(api_test_helper): assert len(urls) == 1 url = urls[0] assert url.id == url_mapping.url_id - assert url.agency_id == agency_id assert url.record_type == RecordType.ARREST_RECORDS.value assert url.relevant == True assert url.outcome == URLStatus.VALIDATED.value @@ -119,4 +125,10 @@ async def test_approve_and_get_next_source_for_review(api_test_helper): assert optional_metadata[0].supplying_entity == "New Test Supplying Entity" assert optional_metadata[0].record_formats == ["New Test Record Format", "New Test Record Format 2"] + # Get agencies + agencies = await adb_client.get_all(ConfirmedURLAgency) + assert len(agencies) == 3 + for agency in agencies: + assert agency.agency_id in agency_ids + diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index cd2527b6..9eb49570 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -286,7 +286,7 @@ async def test_get_next_url_for_final_review_no_annotations(db_data_creator: DBD annotations = result.annotations agency = annotations.agency - assert agency.confirmed is None + assert agency.confirmed == [] assert agency.auto.unknown is True assert agency.auto.suggestions == [] From cc46ef74ae88f1d6deded7fc53f0696726564a69 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 28 Mar 2025 17:31:46 -0400 Subject: [PATCH 068/244] feat(app): Allow multiple confirmed agencies for URL --- collector_db/AsyncDatabaseClient.py | 21 ++++++++++++------- collector_db/StatementComposer.py | 13 +++++++----- .../collector_db/test_db_client.py | 10 ++++++--- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 2d6f2efe..bfd446b1 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -728,7 +728,9 @@ async def has_urls_without_agency_suggestions( statement = ( select( URL.id - ).where(URL.agency_id == None)) + ) + ) + statement = self.statement_composer.exclude_urls_with_agency_suggestions(statement) raw_result = await session.execute(statement) result = raw_result.all() @@ -936,7 +938,7 @@ async def add_agency_manual_suggestion( @session_manager async def get_urls_with_confirmed_agencies(self, session: AsyncSession) -> list[URL]: - statement = select(URL).where(URL.agency_id != None) + statement = select(URL).where(exists().where(ConfirmedURLAgency.url_id == URL.id)) results = await session.execute(statement) return list(results.scalars().all()) @@ -1163,8 +1165,9 @@ def update_if_not_none( ) # Get existing agency ids - existing_agency_ids = [agency.agency_id for agency in url.confirmed_agencies] - new_agency_ids = approval_info.agency_ids + existing_agencies = url.confirmed_agencies or [] + existing_agency_ids = [agency.agency_id for agency in existing_agencies] + new_agency_ids = approval_info.agency_ids or [] if len(existing_agency_ids) == 0 and len(new_agency_ids) == 0: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, @@ -1172,10 +1175,12 @@ def update_if_not_none( ) # Get any existing agency ids that are not in the new agency ids - for existing_agency in url.confirmed_agencies: - if existing_agency.id not in new_agency_ids: - # If the existing agency id is not in the new agency ids, delete it - await session.delete(existing_agency) + # If new agency ids are specified, overwrite existing + if len(new_agency_ids) != 0: + for existing_agency in existing_agencies: + if existing_agency.id not in new_agency_ids: + # If the existing agency id is not in the new agency ids, delete it + await session.delete(existing_agency) # Add any new agency ids that are not in the existing agency ids for new_agency_id in new_agency_ids: if new_agency_id not in existing_agency_ids: diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index 88da61f3..42dcf84c 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -4,7 +4,8 @@ from sqlalchemy.orm import aliased from collector_db.enums import URLMetadataAttributeType, ValidationStatus -from collector_db.models import URL, URLHTMLContent, AutomatedUrlAgencySuggestion, URLOptionalDataSourceMetadata, Batch +from collector_db.models import URL, URLHTMLContent, AutomatedUrlAgencySuggestion, URLOptionalDataSourceMetadata, Batch, \ + ConfirmedURLAgency from collector_manager.enums import URLStatus, CollectorType @@ -54,10 +55,12 @@ def exclude_urls_with_agency_suggestions( # Aliases for clarity AutomatedSuggestion = aliased(AutomatedUrlAgencySuggestion) - statement = (statement - .where(~exists().where(AutomatedSuggestion.url_id == URL.id)) # Exclude if automated suggestions exist - ) # Exclude if confirmed agencies exist - + statement = statement.where( + ~exists().where(AutomatedSuggestion.url_id == URL.id) + ) # Exclude if automated suggestions exist + statement = statement.where( + ~exists().where(ConfirmedURLAgency.url_id == URL.id) + ) return statement diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 9eb49570..fe6fad2f 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -11,7 +11,7 @@ from collector_db.DTOs.URLInfo import URLInfo from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource -from collector_db.models import URL, ApprovingUserURL, URLOptionalDataSourceMetadata +from collector_db.models import URL, ApprovingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.enums import BatchStatus, RecordType, SuggestionType @@ -345,13 +345,17 @@ async def test_approve_url_basic(db_data_creator: DBDataCreator): assert len(urls) == 1 url = urls[0] assert url.id == url_mapping.url_id - assert url.agency_id == agency_id assert url.record_type == RecordType.ARREST_RECORDS.value assert url.relevant == True assert url.outcome == URLStatus.VALIDATED.value assert url.name == "Test Name" assert url.description == "Test Description" + confirmed_agency = await adb_client.get_all(ConfirmedURLAgency) + assert len(confirmed_agency) == 1 + assert confirmed_agency[0].url_id == url_mapping.url_id + assert confirmed_agency[0].agency_id == agency_id + approving_user_urls = await adb_client.get_all(ApprovingUserURL) assert len(approving_user_urls) == 1 assert approving_user_urls[0].user_id == 1 @@ -387,7 +391,7 @@ async def test_approval_url_error(db_data_creator: DBDataCreator): # Create kwarg dictionary with all required approval info fields kwarg_dict = { "record_type": RecordType.ARREST_RECORDS, - "agency_id": await db_data_creator.agency(), + "agency_ids": [await db_data_creator.agency()], "name": "Test Name", "description": "Test Description", } From 852a3760f665e821f3432b343b623248fe9e30a6 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 28 Mar 2025 20:34:35 -0400 Subject: [PATCH 069/244] feat(app): `/review/approve-source` new agencies added to db Previously, agency ids not already in the database were rejected. Now these are permitted with a placeholder name --- collector_db/AsyncDatabaseClient.py | 16 ++++++++++++++++ collector_db/constants.py | 3 +++ .../integration/api/test_review.py | 19 +++++++++++++++---- 3 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 collector_db/constants.py diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index bfd446b1..06ad81bd 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -17,6 +17,7 @@ from collector_db.DTOs.URLMapping import URLMapping from collector_db.DTOs.URLWithHTML import URLWithHTML from collector_db.StatementComposer import StatementComposer +from collector_db.constants import PLACEHOLDER_AGENCY_NAME from collector_db.enums import URLMetadataAttributeType, TaskType from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import URL, URLErrorInfo, URLHTMLContent, Base, \ @@ -1184,6 +1185,21 @@ def update_if_not_none( # Add any new agency ids that are not in the existing agency ids for new_agency_id in new_agency_ids: if new_agency_id not in existing_agency_ids: + # Check if the new agency exists in the database + query = ( + select(Agency) + .where(Agency.agency_id == new_agency_id) + ) + existing_agency = await session.execute(query) + existing_agency = existing_agency.scalars().first() + if existing_agency is None: + # If not, create it + agency = Agency( + agency_id=new_agency_id, + name=PLACEHOLDER_AGENCY_NAME, + ) + session.add(agency) + # If the new agency id is not in the existing agency ids, add it confirmed_url_agency = ConfirmedURLAgency( url_id=approval_info.url_id, diff --git a/collector_db/constants.py b/collector_db/constants.py new file mode 100644 index 00000000..294c8fd9 --- /dev/null +++ b/collector_db/constants.py @@ -0,0 +1,3 @@ + + +PLACEHOLDER_AGENCY_NAME = "PLACEHOLDER_AGENCY_NAME" \ No newline at end of file diff --git a/tests/test_automated/integration/api/test_review.py b/tests/test_automated/integration/api/test_review.py index b43a3ae8..009a7638 100644 --- a/tests/test_automated/integration/api/test_review.py +++ b/tests/test_automated/integration/api/test_review.py @@ -1,6 +1,7 @@ import pytest -from collector_db.models import URL, URLOptionalDataSourceMetadata, ConfirmedURLAgency +from collector_db.constants import PLACEHOLDER_AGENCY_NAME +from collector_db.models import URL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse @@ -89,7 +90,11 @@ async def test_approve_and_get_next_source_for_review(api_test_helper): # Add confirmed agency confirmed_agency = await db_data_creator.confirmed_suggestions([url_mapping.url_id]) + # Additionally, include an agency not yet included in the database + additional_agency = 999999 + agency_ids = [await db_data_creator.agency() for _ in range(3)] + agency_ids.append(additional_agency) result: GetNextURLForFinalReviewOuterResponse = await ath.request_validator.approve_and_get_next_source_for_review( approval_info=FinalReviewApprovalInfo( @@ -126,9 +131,15 @@ async def test_approve_and_get_next_source_for_review(api_test_helper): assert optional_metadata[0].record_formats == ["New Test Record Format", "New Test Record Format 2"] # Get agencies - agencies = await adb_client.get_all(ConfirmedURLAgency) - assert len(agencies) == 3 - for agency in agencies: + confirmed_agencies = await adb_client.get_all(ConfirmedURLAgency) + assert len(confirmed_agencies) == 4 + for agency in confirmed_agencies: assert agency.agency_id in agency_ids + # Check that created agency has placeholder + agencies = await adb_client.get_all(Agency) + for agency in agencies: + if agency.agency_id == additional_agency: + assert agency.name == PLACEHOLDER_AGENCY_NAME + From d99d189de050092740df64f8f7d6d534a276111d Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sat, 29 Mar 2025 10:44:06 -0400 Subject: [PATCH 070/244] fix(database): Fix bug causing validated URLs to show up for some annotations --- collector_db/AsyncDatabaseClient.py | 1 + collector_db/StatementComposer.py | 4 +- .../collector_db/test_db_client.py | 68 ++++++++++++++++++- 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 06ad81bd..05006228 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -126,6 +126,7 @@ async def get_next_url_for_user_annotation( select( URL, ) + .where(URL.outcome == URLStatus.PENDING.value) .where(exists(select(URLHTMLContent).where(URLHTMLContent.url_id == URL.id))) # URL must not have metadata annotation by this user .where( diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index 42dcf84c..c80b83e5 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -55,9 +55,11 @@ def exclude_urls_with_agency_suggestions( # Aliases for clarity AutomatedSuggestion = aliased(AutomatedUrlAgencySuggestion) + # Exclude if automated suggestions exist statement = statement.where( ~exists().where(AutomatedSuggestion.url_id == URL.id) - ) # Exclude if automated suggestions exist + ) + # Exclude if confirmed agencies exist statement = statement.where( ~exists().where(ConfirmedURLAgency.url_id == URL.id) ) diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index fe6fad2f..a2cb25a9 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -6,12 +6,14 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.BatchInfo import BatchInfo +from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_db.DTOs.LogInfo import LogInfo from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.DTOs.URLInfo import URLInfo from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource -from collector_db.models import URL, ApprovingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency +from collector_db.models import URL, ApprovingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, \ + UserRelevantSuggestion from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.enums import BatchStatus, RecordType, SuggestionType @@ -421,3 +423,67 @@ async def test_approval_url_error(db_data_creator: DBDataCreator): user_id=1 ) +@pytest.mark.asyncio +async def test_get_next_url_for_user_relevance_annotation_pending( + db_data_creator: DBDataCreator +): + + batch_id = db_data_creator.batch() + + # Create 2 URLs with outcome `pending` + iui: InsertURLsInfo = db_data_creator.urls( + batch_id=batch_id, + url_count=1, + outcome=URLStatus.PENDING + ) + + url_1 = iui.url_mappings[0] + + # Add `Relevancy` attribute with value `True` + await db_data_creator.auto_relevant_suggestions( + url_id=url_1.url_id, + relevant=True + ) + + # Add HTML data + await db_data_creator.html_data([url_1.url_id]) + + adb_client = db_data_creator.adb_client + url = await adb_client.get_next_url_for_relevance_annotation( + user_id=1 + ) + assert url is not None + +@pytest.mark.asyncio +async def test_get_next_url_for_user_relevance_annotation_validated( + db_data_creator: DBDataCreator +): + """ + A validated URL should not turn up in get_next_url_for_user_annotation + """ + + batch_id = db_data_creator.batch() + + # Create 2 URLs with outcome `pending` + iui: InsertURLsInfo = db_data_creator.urls( + batch_id=batch_id, + url_count=1, + outcome=URLStatus.VALIDATED + ) + + url_1 = iui.url_mappings[0] + + # Add `Relevancy` attribute with value `True` + await db_data_creator.auto_relevant_suggestions( + url_id=url_1.url_id, + relevant=True + ) + + # Add HTML data + await db_data_creator.html_data([url_1.url_id]) + + adb_client = db_data_creator.adb_client + url = await adb_client.get_next_url_for_relevance_annotation( + user_id=1 + ) + assert url is None \ No newline at end of file From a3dedcd0574746a63ce1241e3527189078a52270 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 31 Mar 2025 19:52:24 -0400 Subject: [PATCH 071/244] DRAFT --- ..._add_data_source_id_column_to_url_table.py | 31 +++++++++++++++++++ collector_db/models.py | 1 + .../task_data_objects/SubmitApprovedURLTDO.py | 8 ++++- core/classes/SubmitApprovedURLTaskOperator.py | 1 + 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 alembic/versions/2025_03_29_1716-33a546c93441_add_data_source_id_column_to_url_table.py diff --git a/alembic/versions/2025_03_29_1716-33a546c93441_add_data_source_id_column_to_url_table.py b/alembic/versions/2025_03_29_1716-33a546c93441_add_data_source_id_column_to_url_table.py new file mode 100644 index 00000000..8e15dbf2 --- /dev/null +++ b/alembic/versions/2025_03_29_1716-33a546c93441_add_data_source_id_column_to_url_table.py @@ -0,0 +1,31 @@ +"""Add data source ID column to URL table + +Revision ID: 33a546c93441 +Revises: 5ea47dacd0ef +Create Date: 2025-03-29 17:16:11.863064 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '33a546c93441' +down_revision: Union[str, None] = '5ea47dacd0ef' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + op.add_column( + 'url', + sa.Column('data_source_id', sa.Integer(), nullable=True) + ) + # Add unique constraint to data_source_id column + op.create_unique_constraint('uq_data_source_id', 'url', ['data_source_id']) + + +def downgrade() -> None: + op.drop_column('url', 'data_source_id') diff --git a/collector_db/models.py b/collector_db/models.py index 55b75af2..4a82e68c 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -105,6 +105,7 @@ class URL(Base): relevant = Column(Boolean, nullable=True) created_at = get_created_at_column() updated_at = get_updated_at_column() + data_source_id = Column(Integer, nullable=True) # Relationships batch = relationship("Batch", back_populates="urls") diff --git a/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py b/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py index ee1b8dc6..fc6e789b 100644 --- a/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py +++ b/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py @@ -8,4 +8,10 @@ class SubmitApprovedURLTDO(BaseModel): url: str record_type: RecordType - agency_id: Optional[int] \ No newline at end of file + agency_id: Optional[int] + name: str + description: str + record_formats: Optional[list[str]] = None + data_portal_type: Optional[str] = None + supplying_entity: Optional[str] = None + data_source_id: Optional[int] = None \ No newline at end of file diff --git a/core/classes/SubmitApprovedURLTaskOperator.py b/core/classes/SubmitApprovedURLTaskOperator.py index 633f8c1e..06b28a18 100644 --- a/core/classes/SubmitApprovedURLTaskOperator.py +++ b/core/classes/SubmitApprovedURLTaskOperator.py @@ -1,5 +1,6 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.enums import TaskType +from core.DTOs.task_data_objects.UrlHtmlTDO import UrlHtmlTDO from core.classes.TaskOperatorBase import TaskOperatorBase from pdap_api_client.PDAPClient import PDAPClient From c5e75288a12345023487768c8c4f1924ad6412fa Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 1 Apr 2025 15:27:18 -0400 Subject: [PATCH 072/244] Set default for snippet if none exists. --- source_collectors/auto_googler/GoogleSearcher.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source_collectors/auto_googler/GoogleSearcher.py b/source_collectors/auto_googler/GoogleSearcher.py index 6f7b4cc8..7d599513 100644 --- a/source_collectors/auto_googler/GoogleSearcher.py +++ b/source_collectors/auto_googler/GoogleSearcher.py @@ -73,7 +73,7 @@ def get_query_results(self, query) -> list[GoogleSearchQueryResultsInnerDTO] or inner_dto = GoogleSearchQueryResultsInnerDTO( url=item["link"], title=item["title"], - snippet=item["snippet"] + snippet=item.get("snippet", ""), ) items.append(inner_dto) From bf756ac7d04187ae9a24a9c95e04ee689a555541 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 2 Apr 2025 11:49:22 -0400 Subject: [PATCH 073/244] DRAFT --- collector_db/AsyncDatabaseClient.py | 12 ++++++++++-- .../task_data_objects/URLMiscellaneousMetadataTDO.py | 4 ++++ core/classes/URLMiscellaneousMetadataTaskOperator.py | 7 +++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 05006228..5b057636 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -12,7 +12,7 @@ from collector_db.DTOConverter import DTOConverter from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType from collector_db.DTOs.URLInfo import URLInfo from collector_db.DTOs.URLMapping import URLMapping from collector_db.DTOs.URLWithHTML import URLWithHTML @@ -37,7 +37,7 @@ GetURLsResponseInnerInfo from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO -from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO +from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo from core.enums import BatchStatus, SuggestionType, RecordType from html_tag_collector.DataClassTags import convert_to_response_html_info @@ -375,6 +375,7 @@ async def get_pending_urls_missing_miscellaneous_metadata( query = ( query.options( selectinload(URL.batch), + selectinload(URL.html_content) ).limit(100).order_by(URL.id) ) @@ -387,6 +388,13 @@ async def get_pending_urls_missing_miscellaneous_metadata( collector_metadata=result.collector_metadata, collector_type=CollectorType(result.batch.strategy), ) + html_info = URLHTMLMetadataInfo() + for html_content in result.html_content: + if html_content.content_type == HTMLContentType.TITLE.value: + html_info.title = html_content.content + elif html_content.content_type == HTMLContentType.DESCRIPTION.value: + html_info.description = html_content.content + tdo.html_metadata_info = html_info final_results.append(tdo) return final_results diff --git a/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py b/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py index d57d1cba..ff173a8e 100644 --- a/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py +++ b/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py @@ -4,6 +4,9 @@ from collector_manager.enums import CollectorType +class URLHTMLMetadataInfo(BaseModel): + title: Optional[str] = None + description: Optional[str] = None class URLMiscellaneousMetadataTDO(BaseModel): url_id: int @@ -14,3 +17,4 @@ class URLMiscellaneousMetadataTDO(BaseModel): record_formats: Optional[list[str]] = None data_portal_type: Optional[str] = None supplying_entity: Optional[str] = None + html_metadata_info: Optional[URLHTMLMetadataInfo] = None diff --git a/core/classes/URLMiscellaneousMetadataTaskOperator.py b/core/classes/URLMiscellaneousMetadataTaskOperator.py index 38e7446a..4b9becdb 100644 --- a/core/classes/URLMiscellaneousMetadataTaskOperator.py +++ b/core/classes/URLMiscellaneousMetadataTaskOperator.py @@ -41,6 +41,12 @@ async def get_subtask(self, collector_type: CollectorType) -> MiscellaneousMetad case _: raise Exception(f"Unknown collector type: {collector_type}") + async def html_default_logic(self, tdo: URLMiscellaneousMetadataTDO): + if tdo.name is None: + tdo.name = tdo.html_metadata_info.title + if tdo.description is None: + tdo.description = tdo.html_metadata_info.description + async def inner_task_logic(self): tdos: list[URLMiscellaneousMetadataTDO] = await self.adb_client.get_pending_urls_missing_miscellaneous_metadata() await self.link_urls_to_task(url_ids=[tdo.url_id for tdo in tdos]) @@ -50,6 +56,7 @@ async def inner_task_logic(self): subtask = await self.get_subtask(tdo.collector_type) try: subtask.process(tdo) + await self.html_default_logic(tdo) except Exception as e: error_info = URLErrorPydanticInfo( task_id=self.task_id, From 8b33344fa286d8a1880aeec69b423ea85a292ab1 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 2 Apr 2025 15:49:13 -0400 Subject: [PATCH 074/244] feat(app): Add batch filtering for annotation requests --- api/routes/annotate.py | 63 ++++-- api/routes/review.py | 19 +- collector_db/AsyncDatabaseClient.py | 51 +++-- core/AsyncCore.py | 82 +++++--- tests/helpers/complex_test_data_functions.py | 42 +++- .../integration/api/test_review.py | 6 +- .../collector_db/test_db_client.py | 194 ++++++++++++++---- 7 files changed, 351 insertions(+), 106 deletions(-) diff --git a/api/routes/annotate.py b/api/routes/annotate.py index 53486d7d..84ba00e4 100644 --- a/api/routes/annotate.py +++ b/api/routes/annotate.py @@ -1,14 +1,13 @@ -from fastapi import APIRouter, Depends, Path +from typing import Optional + +from fastapi import APIRouter, Depends, Path, Query from api.dependencies import get_async_core -from collector_db.enums import URLMetadataAttributeType from core.AsyncCore import AsyncCore from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo -from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo, \ - GetNextRelevanceAnnotationResponseOuterInfo +from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo -from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo from security_manager.SecurityManager import get_access_info, AccessInfo @@ -24,11 +23,15 @@ async def get_next_url_for_relevance_annotation( access_info: AccessInfo = Depends(get_access_info), async_core: AsyncCore = Depends(get_async_core), + batch_id: Optional[int] = Query( + description="The batch id of the next URL to get. " + "If not specified, defaults to first qualifying URL", + default=None), ) -> GetNextRelevanceAnnotationResponseOuterInfo: - result = await async_core.get_next_url_for_relevance_annotation( + return await async_core.get_next_url_for_relevance_annotation( user_id=access_info.user_id, + batch_id=batch_id ) - return result @annotate_router.post("/relevance/{url_id}") @@ -36,7 +39,11 @@ async def annotate_url_for_relevance_and_get_next_url( relevance_annotation_post_info: RelevanceAnnotationPostInfo, url_id: int = Path(description="The URL id to annotate"), async_core: AsyncCore = Depends(get_async_core), - access_info: AccessInfo = Depends(get_access_info) + access_info: AccessInfo = Depends(get_access_info), + batch_id: Optional[int] = Query( + description="The batch id of the next URL to get. " + "If not specified, defaults to first qualifying URL", + default=None), ) -> GetNextRelevanceAnnotationResponseOuterInfo: """ Post URL annotation and get next URL to annotate @@ -48,51 +55,71 @@ async def annotate_url_for_relevance_and_get_next_url( ) return await async_core.get_next_url_for_relevance_annotation( user_id=access_info.user_id, + batch_id=batch_id ) @annotate_router.get("/record-type") async def get_next_url_for_record_type_annotation( access_info: AccessInfo = Depends(get_access_info), async_core: AsyncCore = Depends(get_async_core), + batch_id: Optional[int] = Query( + description="The batch id of the next URL to get. " + "If not specified, defaults to first qualifying URL", + default=None), ) -> GetNextRecordTypeAnnotationResponseOuterInfo: - result = await async_core.get_next_url_for_record_type_annotation( + return await async_core.get_next_url_for_record_type_annotation( user_id=access_info.user_id, + batch_id=batch_id ) - return result @annotate_router.post("/record-type/{url_id}") async def annotate_url_for_record_type_and_get_next_url( record_type_annotation_post_info: RecordTypeAnnotationPostInfo, url_id: int = Path(description="The URL id to annotate"), async_core: AsyncCore = Depends(get_async_core), - access_info: AccessInfo = Depends(get_access_info) + access_info: AccessInfo = Depends(get_access_info), + batch_id: Optional[int] = Query( + description="The batch id of the next URL to get. " + "If not specified, defaults to first qualifying URL", + default=None), ) -> GetNextRecordTypeAnnotationResponseOuterInfo: """ Post URL annotation and get next URL to annotate """ - result = await async_core.submit_url_record_type_annotation( + await async_core.submit_url_record_type_annotation( user_id=access_info.user_id, url_id=url_id, record_type=record_type_annotation_post_info.record_type, ) - return result + return await async_core.get_next_url_for_record_type_annotation( + user_id=access_info.user_id, + batch_id=batch_id + ) @annotate_router.get("/agency") async def get_next_url_for_agency_annotation( access_info: AccessInfo = Depends(get_access_info), async_core: AsyncCore = Depends(get_async_core), + batch_id: Optional[int] = Query( + description="The batch id of the next URL to get. " + "If not specified, defaults to first qualifying URL", + default=None), ) -> GetNextURLForAgencyAnnotationResponse: - result = await async_core.get_next_url_agency_for_annotation( + return await async_core.get_next_url_agency_for_annotation( user_id=access_info.user_id, + batch_id=batch_id ) - return result @annotate_router.post("/agency/{url_id}") async def annotate_url_for_agency_and_get_next_url( url_id: int, agency_annotation_post_info: URLAgencyAnnotationPostInfo, async_core: AsyncCore = Depends(get_async_core), - access_info: AccessInfo = Depends(get_access_info) + access_info: AccessInfo = Depends(get_access_info), + batch_id: Optional[int] = Query( + description="The batch id of the next URL to get. " + "If not specified, defaults to first qualifying URL", + default=None), ) -> GetNextURLForAgencyAnnotationResponse: """ Post URL annotation and get next URL to annotate @@ -102,7 +129,7 @@ async def annotate_url_for_agency_and_get_next_url( url_id=url_id, agency_post_info=agency_annotation_post_info ) - result = await async_core.get_next_url_agency_for_annotation( + return await async_core.get_next_url_agency_for_annotation( user_id=access_info.user_id, + batch_id=batch_id ) - return result \ No newline at end of file diff --git a/api/routes/review.py b/api/routes/review.py index 61dccbbb..25ac85e8 100644 --- a/api/routes/review.py +++ b/api/routes/review.py @@ -1,4 +1,6 @@ -from fastapi import APIRouter, Depends +from typing import Optional + +from fastapi import APIRouter, Depends, Query from api.dependencies import get_async_core from core.AsyncCore import AsyncCore @@ -17,18 +19,27 @@ async def get_next_source( core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), + batch_id: Optional[int] = Query( + description="The batch id of the next URL to get. " + "If not specified, defaults to first qualifying URL", + default=None), ) -> GetNextURLForFinalReviewOuterResponse: - next_source = await core.get_next_source_for_review() + next_source = await core.get_next_source_for_review(batch_id=batch_id) return GetNextURLForFinalReviewOuterResponse(next_source=next_source) @review_router.post("/approve-source") async def approve_source( core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), - approval_info: FinalReviewApprovalInfo = FinalReviewApprovalInfo + approval_info: FinalReviewApprovalInfo = FinalReviewApprovalInfo, + batch_id: Optional[int] = Query( + description="The batch id of the next URL to get. " + "If not specified, defaults to first qualifying URL", + default=None), ) -> GetNextURLForFinalReviewOuterResponse: next_source = await core.approve_and_get_next_source_for_review( approval_info, - access_info=access_info + access_info=access_info, + batch_id=batch_id ) return GetNextURLForFinalReviewOuterResponse(next_source=next_source) \ No newline at end of file diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 05006228..7ff5f8ad 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -2,7 +2,7 @@ from typing import Optional, Type, Any from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, or_, update, Delete, Insert +from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, or_, update, Delete, Insert, asc from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import selectinload, joinedload, QueryableAttribute from sqlalchemy.sql.functions import coalesce @@ -120,7 +120,8 @@ async def get_next_url_for_user_annotation( session: AsyncSession, user_suggestion_model_to_exclude: UserSuggestionModel, auto_suggestion_relationship: QueryableAttribute, - user_id: int + user_id: int, + batch_id: Optional[int] ) -> URL: url_query = ( select( @@ -139,12 +140,15 @@ async def get_next_url_for_user_annotation( ) ) ) - ).options( + ) + ) + if batch_id is not None: + url_query = url_query.where(URL.batch_id == batch_id) + + url_query = url_query.options( joinedload(auto_suggestion_relationship), joinedload(URL.html_content) - ). - limit(1) - ) + ).limit(1) raw_result = await session.execute(url_query) @@ -179,14 +183,16 @@ async def add_user_relevant_suggestion( async def get_next_url_for_relevance_annotation( self, session: AsyncSession, - user_id: int + user_id: int, + batch_id: Optional[int] ) -> Optional[GetNextRelevanceAnnotationResponseInfo]: url = await self.get_next_url_for_user_annotation( session, user_suggestion_model_to_exclude=UserRelevantSuggestion, auto_suggestion_relationship=URL.auto_relevant_suggestion, - user_id=user_id + user_id=user_id, + batch_id=batch_id ) if url is None: return None @@ -218,14 +224,16 @@ async def get_next_url_for_relevance_annotation( async def get_next_url_for_record_type_annotation( self, session: AsyncSession, - user_id: int + user_id: int, + batch_id: Optional[int] ) -> Optional[GetNextRecordTypeAnnotationResponseInfo]: url = await self.get_next_url_for_user_annotation( session, user_suggestion_model_to_exclude=UserRecordTypeSuggestion, auto_suggestion_relationship=URL.auto_record_type_suggestion, - user_id=user_id + user_id=user_id, + batch_id=batch_id ) if url is None: return None @@ -767,7 +775,10 @@ async def get_urls_without_agency_suggestions(self, session: AsyncSession) -> li @session_manager async def get_next_url_agency_for_annotation( - self, session: AsyncSession, user_id: int + self, + session: AsyncSession, + user_id: int, + batch_id: Optional[int] ) -> GetNextURLForAgencyAnnotationResponse: """ Retrieve URL for annotation @@ -785,8 +796,14 @@ async def get_next_url_agency_for_annotation( URL.outcome == URLStatus.PENDING.value ) ) - # Must not have been annotated by this user - .join(UserUrlAgencySuggestion, isouter=True) + ) + + if batch_id is not None: + statement = statement.where(URL.batch_id == batch_id) + + # Must not have been annotated by this user + statement = ( + statement.join(UserUrlAgencySuggestion, isouter=True) .where( ~exists( select(UserUrlAgencySuggestion). @@ -947,7 +964,8 @@ async def get_urls_with_confirmed_agencies(self, session: AsyncSession) -> list[ @session_manager async def get_next_url_for_final_review( self, - session: AsyncSession + session: AsyncSession, + batch_id: Optional[int] ) -> Optional[GetNextURLForFinalReviewResponse]: @@ -1029,6 +1047,10 @@ def count_subquery(model: Type[Base]): url_query = url_query.where( URL.outcome == URLStatus.PENDING.value ) + if batch_id is not None: + url_query = url_query.where( + URL.batch_id == batch_id + ) # The below relationships are joined directly to the URL single_join_relationships = [ @@ -1060,6 +1082,7 @@ def count_subquery(model: Type[Base]): url_query = url_query.order_by( desc("total_distinct_annotation_count"), desc("total_overall_annotation_count"), + asc(URL.id) ) # Apply limit diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 8b422d7d..43b81176 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -1,4 +1,5 @@ import logging +from typing import Optional from aiohttp import ClientSession @@ -52,6 +53,12 @@ def __init__( self.logger.addHandler(logging.StreamHandler()) self.logger.setLevel(logging.INFO) + + async def get_urls(self, page: int, errors: bool) -> GetURLsResponseInfo: + return await self.adb_client.get_urls(page=page, errors=errors) + + + #region Task Operators async def get_url_html_task_operator(self): self.logger.info("Running URL HTML Task") operator = URLHTMLTaskOperator( @@ -107,6 +114,9 @@ async def get_task_operators(self) -> list[TaskOperatorBase]: await self.get_url_miscellaneous_metadata_task_operator() ] + #endregion + + #region Tasks async def run_tasks(self): operators = await self.get_task_operators() for operator in operators: @@ -141,6 +151,17 @@ async def handle_task_error(self, run_info: TaskOperatorRunInfo): await self.adb_client.update_task_status(task_id=run_info.task_id, status=BatchStatus.ERROR) await self.adb_client.add_task_error(task_id=run_info.task_id, error=run_info.message) + async def get_task_info(self, task_id: int) -> TaskInfo: + return await self.adb_client.get_task_info(task_id=task_id) + + async def get_tasks(self, page: int, task_type: TaskType, task_status: BatchStatus) -> GetTasksResponse: + return await self.adb_client.get_tasks(page=page, task_type=task_type, task_status=task_status) + + + #endregion + + #region Annotations and Review + async def submit_url_relevance_annotation( self, user_id: int, @@ -153,14 +174,28 @@ async def submit_url_relevance_annotation( relevant=relevant ) - async def get_next_url_for_relevance_annotation(self, user_id: int) -> GetNextRelevanceAnnotationResponseOuterInfo: - next_annotation = await self.adb_client.get_next_url_for_relevance_annotation(user_id=user_id) + async def get_next_url_for_relevance_annotation( + self, + user_id: int, + batch_id: Optional[int] + ) -> GetNextRelevanceAnnotationResponseOuterInfo: + next_annotation = await self.adb_client.get_next_url_for_relevance_annotation( + user_id=user_id, + batch_id=batch_id + ) return GetNextRelevanceAnnotationResponseOuterInfo( next_annotation=next_annotation ) - async def get_next_url_for_record_type_annotation(self, user_id: int) -> GetNextRecordTypeAnnotationResponseOuterInfo: - next_annotation = await self.adb_client.get_next_url_for_record_type_annotation(user_id=user_id) + async def get_next_url_for_record_type_annotation( + self, + user_id: int, + batch_id: Optional[int] + ) -> GetNextRecordTypeAnnotationResponseOuterInfo: + next_annotation = await self.adb_client.get_next_url_for_record_type_annotation( + user_id=user_id, + batch_id=batch_id + ) return GetNextRecordTypeAnnotationResponseOuterInfo( next_annotation=next_annotation ) @@ -169,33 +204,24 @@ async def submit_url_record_type_annotation( self, user_id: int, url_id: int, - record_type: RecordType + record_type: RecordType, ): await self.adb_client.add_user_record_type_suggestion( user_id=user_id, url_id=url_id, record_type=record_type ) - next_annotation = await self.adb_client.get_next_url_for_record_type_annotation(user_id=user_id) - return GetNextRecordTypeAnnotationResponseOuterInfo( - next_annotation=next_annotation - ) - - async def get_urls(self, page: int, errors: bool) -> GetURLsResponseInfo: - return await self.adb_client.get_urls(page=page, errors=errors) - - async def get_task_info(self, task_id: int) -> TaskInfo: - return await self.adb_client.get_task_info(task_id=task_id) - - async def get_tasks(self, page: int, task_type: TaskType, task_status: BatchStatus) -> GetTasksResponse: - return await self.adb_client.get_tasks(page=page, task_type=task_type, task_status=task_status) async def get_next_url_agency_for_annotation( self, - user_id: int + user_id: int, + batch_id: Optional[int] ) -> GetNextURLForAgencyAnnotationResponse: - return await self.adb_client.get_next_url_agency_for_annotation(user_id=user_id) + return await self.adb_client.get_next_url_agency_for_annotation( + user_id=user_id, + batch_id=batch_id + ) async def submit_url_agency_annotation( self, @@ -217,17 +243,25 @@ async def submit_url_agency_annotation( is_new=agency_post_info.is_new, ) - async def get_next_source_for_review(self): - return await self.adb_client.get_next_url_for_final_review() + async def get_next_source_for_review( + self, + batch_id: Optional[int] + ): + return await self.adb_client.get_next_url_for_final_review( + batch_id=batch_id + ) async def approve_and_get_next_source_for_review( self, approval_info: FinalReviewApprovalInfo, - access_info: AccessInfo + access_info: AccessInfo, + batch_id: Optional[int] ): await self.adb_client.approve_url( approval_info=approval_info, user_id=access_info.user_id ) - return await self.get_next_source_for_review() + return await self.get_next_source_for_review( + batch_id=batch_id + ) diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index 4aa9a86f..104402c0 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -1,14 +1,44 @@ -from collector_db.enums import URLMetadataAttributeType, ValidationSource, ValidationStatus +from pydantic import BaseModel + +from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo +from collector_db.DTOs.URLMapping import URLMapping +from collector_manager.enums import URLStatus from core.enums import RecordType from tests.helpers.DBDataCreator import DBDataCreator +class AnnotationSetupInfo(BaseModel): + batch_id: int + insert_urls_info: InsertURLsInfo + +async def setup_for_get_next_url_for_annotation( + db_data_creator: DBDataCreator, + url_count: int, + outcome: URLStatus = URLStatus.PENDING +) -> AnnotationSetupInfo: + batch_id = db_data_creator.batch() + insert_urls_info = db_data_creator.urls( + batch_id=batch_id, + url_count=url_count, + outcome=outcome + ) + await db_data_creator.html_data( + [ + url.url_id for url in insert_urls_info.url_mappings + ] + ) + return AnnotationSetupInfo(batch_id=batch_id, insert_urls_info=insert_urls_info) + + +class FinalReviewSetupInfo(BaseModel): + batch_id: int + url_mapping: URLMapping async def setup_for_get_next_url_for_final_review( db_data_creator: DBDataCreator, annotation_count: int, include_user_annotations: bool = True, include_miscellaneous_metadata: bool = True -): +) -> FinalReviewSetupInfo: """ Sets up the database to test the final_review functions Auto-labels the URL with 'relevant=True' and 'record_type=ARREST_RECORDS' @@ -30,7 +60,7 @@ async def add_agency_suggestion(count: int): await db_data_creator.agency_user_suggestions( url_id=url_mapping.url_id, agency_id=agency_id - ) + ) async def add_record_type_suggestion(count: int, record_type: RecordType): for i in range(count): @@ -68,5 +98,7 @@ async def add_relevant_suggestion(count: int, relevant: bool): for i in range(annotation_count): await add_agency_suggestion(i + 1) - - return url_mapping + return FinalReviewSetupInfo( + batch_id=batch_id, + url_mapping=url_mapping + ) diff --git a/tests/test_automated/integration/api/test_review.py b/tests/test_automated/integration/api/test_review.py index 009a7638..b4a94387 100644 --- a/tests/test_automated/integration/api/test_review.py +++ b/tests/test_automated/integration/api/test_review.py @@ -13,11 +13,12 @@ async def test_review_next_source(api_test_helper): ath = api_test_helper - url_mapping = await setup_for_get_next_url_for_final_review( + setup_info = await setup_for_get_next_url_for_final_review( db_data_creator=ath.db_data_creator, annotation_count=3, include_user_annotations=True ) + url_mapping = setup_info.url_mapping await ath.db_data_creator.agency_auto_suggestions( url_id=url_mapping.url_id, @@ -81,11 +82,12 @@ async def test_approve_and_get_next_source_for_review(api_test_helper): ath = api_test_helper db_data_creator = ath.db_data_creator - url_mapping = await setup_for_get_next_url_for_final_review( + setup_info = await setup_for_get_next_url_for_final_review( db_data_creator=db_data_creator, annotation_count=3, include_user_annotations=True ) + url_mapping = setup_info.url_mapping # Add confirmed agency confirmed_agency = await db_data_creator.confirmed_suggestions([url_mapping.url_id]) diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index a2cb25a9..12031afa 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -17,6 +17,7 @@ from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.enums import BatchStatus, RecordType, SuggestionType +from helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation from tests.helpers.DBDataCreator import DBDataCreator from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review @@ -156,19 +157,23 @@ async def test_get_next_url_for_final_review_basic(db_data_creator: DBDataCreato Test that an annotated URL is returned """ - url_mapping = await setup_for_get_next_url_for_final_review( + setup_info = await setup_for_get_next_url_for_final_review( db_data_creator=db_data_creator, annotation_count=3, include_user_annotations=True ) + url_mapping = setup_info.url_mapping + await db_data_creator.agency_auto_suggestions( url_id=url_mapping.url_id, count=3 ) - result = await db_data_creator.adb_client.get_next_url_for_final_review() + result = await db_data_creator.adb_client.get_next_url_for_final_review( + batch_id=None + ) assert result.url == url_mapping.url html_info = result.html_info @@ -202,6 +207,36 @@ async def test_get_next_url_for_final_review_basic(db_data_creator: DBDataCreato for i in range(3): assert user_agency_suggestions_as_list[i].count == 3 - i +@pytest.mark.asyncio +async def test_get_next_url_for_final_review_batch_id_filtering(db_data_creator: DBDataCreator): + setup_info_1 = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + + setup_info_2 = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + + url_mapping_1 = setup_info_1.url_mapping + url_mapping_2 = setup_info_2.url_mapping + + # If a batch id is provided, return first valid URL with that batch id + result_with_batch_id =await db_data_creator.adb_client.get_next_url_for_final_review( + batch_id=setup_info_2.batch_id + ) + + assert result_with_batch_id.url == url_mapping_2.url + + # If no batch id is provided, return first valid URL + result_no_batch_id =await db_data_creator.adb_client.get_next_url_for_final_review( + batch_id=None + ) + + assert result_no_batch_id.url == url_mapping_1.url @pytest.mark.asyncio @@ -211,17 +246,19 @@ async def test_get_next_url_for_final_review_favor_more_components(db_data_creat i.e., if one has annotations for record type and agency id, that should be favored over one with just record type """ - url_mapping_without_user_anno = await setup_for_get_next_url_for_final_review( + setup_info_without_user_anno = await setup_for_get_next_url_for_final_review( db_data_creator=db_data_creator, annotation_count=3, include_user_annotations=False ) + url_mapping_without_user_anno = setup_info_without_user_anno.url_mapping - url_mapping_with_user_anno = await setup_for_get_next_url_for_final_review( + setup_info_with_user_anno = await setup_for_get_next_url_for_final_review( db_data_creator=db_data_creator, annotation_count=3, include_user_annotations=True ) + url_mapping_with_user_anno = setup_info_with_user_anno.url_mapping # Have both be listed as unknown @@ -232,7 +269,9 @@ async def test_get_next_url_for_final_review_favor_more_components(db_data_creat suggestion_type=SuggestionType.UNKNOWN ) - result = await db_data_creator.adb_client.get_next_url_for_final_review() + result = await db_data_creator.adb_client.get_next_url_for_final_review( + batch_id=None + ) assert result.id == url_mapping_with_user_anno.url_id @@ -246,24 +285,28 @@ async def test_get_next_url_for_final_review_favor_more_annotations( """ Test in the case of two URLs with the same number of components annotated, favoring the one with more total annotations """ - url_mapping_lower_count = await setup_for_get_next_url_for_final_review( + setup_info_lower_count = await setup_for_get_next_url_for_final_review( db_data_creator=db_data_creator, annotation_count=1, include_user_annotations=True ) + url_mapping_lower_count = setup_info_lower_count.url_mapping - url_mapping_higher_count = await setup_for_get_next_url_for_final_review( + setup_info_higher_count = await setup_for_get_next_url_for_final_review( db_data_creator=db_data_creator, annotation_count=3, include_user_annotations=True ) + url_mapping_higher_count = setup_info_higher_count.url_mapping for url_mapping in [url_mapping_lower_count, url_mapping_higher_count]: await db_data_creator.agency_confirmed_suggestion( url_id=url_mapping.url_id ) - result = await db_data_creator.adb_client.get_next_url_for_final_review() + result = await db_data_creator.adb_client.get_next_url_for_final_review( + batch_id=None + ) assert result.id == url_mapping_higher_count.url_id @@ -281,7 +324,9 @@ async def test_get_next_url_for_final_review_no_annotations(db_data_creator: DBD batch_id = db_data_creator.batch() url_mapping = db_data_creator.urls(batch_id=batch_id, url_count=1).url_mappings[0] - result = await db_data_creator.adb_client.get_next_url_for_final_review() + result = await db_data_creator.adb_client.get_next_url_for_final_review( + batch_id=None + ) assert result.id == url_mapping.url_id @@ -314,17 +359,20 @@ async def test_get_next_url_for_final_review_only_confirmed_urls(db_data_creator outcome=URLStatus.SUBMITTED ).url_mappings[0] - result = await db_data_creator.adb_client.get_next_url_for_final_review() + result = await db_data_creator.adb_client.get_next_url_for_final_review( + batch_id=None + ) assert result is None @pytest.mark.asyncio async def test_approve_url_basic(db_data_creator: DBDataCreator): - url_mapping = await setup_for_get_next_url_for_final_review( + setup_info = await setup_for_get_next_url_for_final_review( db_data_creator=db_data_creator, annotation_count=3, include_user_annotations=True ) + url_mapping = setup_info.url_mapping # Add confirmed agency agency_id = await db_data_creator.agency_confirmed_suggestion( @@ -343,7 +391,7 @@ async def test_approve_url_basic(db_data_creator: DBDataCreator): ) # Confirm same agency id is listed as confirmed - urls = await adb_client.get_all(URL) + urls: list[URL] = await adb_client.get_all(URL) assert len(urls) == 1 url = urls[0] assert url.id == url_mapping.url_id @@ -353,17 +401,17 @@ async def test_approve_url_basic(db_data_creator: DBDataCreator): assert url.name == "Test Name" assert url.description == "Test Description" - confirmed_agency = await adb_client.get_all(ConfirmedURLAgency) + confirmed_agency: list[ConfirmedURLAgency] = await adb_client.get_all(ConfirmedURLAgency) assert len(confirmed_agency) == 1 assert confirmed_agency[0].url_id == url_mapping.url_id assert confirmed_agency[0].agency_id == agency_id - approving_user_urls = await adb_client.get_all(ApprovingUserURL) + approving_user_urls: list[ApprovingUserURL] = await adb_client.get_all(ApprovingUserURL) assert len(approving_user_urls) == 1 assert approving_user_urls[0].user_id == 1 assert approving_user_urls[0].url_id == url_mapping.url_id - optional_metadata = await adb_client.get_all(URLOptionalDataSourceMetadata) + optional_metadata: list[URLOptionalDataSourceMetadata] = await adb_client.get_all(URLOptionalDataSourceMetadata) assert len(optional_metadata) == 1 assert optional_metadata[0].url_id == url_mapping.url_id assert optional_metadata[0].record_formats == ["Test Record Format", "Test Record Format 2"] @@ -372,12 +420,13 @@ async def test_approve_url_basic(db_data_creator: DBDataCreator): @pytest.mark.asyncio async def test_approval_url_error(db_data_creator: DBDataCreator): - url_mapping = await setup_for_get_next_url_for_final_review( + setup_info = await setup_for_get_next_url_for_final_review( db_data_creator=db_data_creator, annotation_count=3, include_user_annotations=True, include_miscellaneous_metadata=False ) + url_mapping = setup_info.url_mapping # Set all required descriptors to none and receive an error adb_client = db_data_creator.adb_client @@ -427,17 +476,12 @@ async def test_approval_url_error(db_data_creator: DBDataCreator): async def test_get_next_url_for_user_relevance_annotation_pending( db_data_creator: DBDataCreator ): - - batch_id = db_data_creator.batch() - - # Create 2 URLs with outcome `pending` - iui: InsertURLsInfo = db_data_creator.urls( - batch_id=batch_id, - url_count=1, - outcome=URLStatus.PENDING + setup_info = await setup_for_get_next_url_for_annotation( + db_data_creator=db_data_creator, + url_count=2 ) - url_1 = iui.url_mappings[0] + url_1 = setup_info.insert_urls_info.url_mappings[0] # Add `Relevancy` attribute with value `True` await db_data_creator.auto_relevant_suggestions( @@ -445,15 +489,91 @@ async def test_get_next_url_for_user_relevance_annotation_pending( relevant=True ) - # Add HTML data - await db_data_creator.html_data([url_1.url_id]) - adb_client = db_data_creator.adb_client url = await adb_client.get_next_url_for_relevance_annotation( - user_id=1 + user_id=1, + batch_id=None ) assert url is not None +@pytest.mark.asyncio +async def test_get_next_url_for_annotation_batch_filtering( + db_data_creator: DBDataCreator +): + """ + Test that for all annotation retrievals, batch filtering works as expected + """ + setup_info_1 = await setup_for_get_next_url_for_annotation( + db_data_creator=db_data_creator, + url_count=1 + ) + setup_info_2 = await setup_for_get_next_url_for_annotation( + db_data_creator=db_data_creator, + url_count=1 + ) + + url_1 = setup_info_1.insert_urls_info.url_mappings[0] + url_2 = setup_info_2.insert_urls_info.url_mappings[0] + + # Test for relevance + # If a batch id is provided, return first valid URL with that batch id + result_with_batch_id = await db_data_creator.adb_client.get_next_url_for_relevance_annotation( + user_id=1, + batch_id=setup_info_2.batch_id + ) + + assert result_with_batch_id.url_info.url == url_2.url + + # If no batch id is provided, return first valid URL + result_no_batch_id = await db_data_creator.adb_client.get_next_url_for_relevance_annotation( + user_id=1, + batch_id=None + ) + + assert result_no_batch_id.url_info.url == url_1.url + + # Test for record type + # If a batch id is provided, return first valid URL with that batch id + result_with_batch_id = await db_data_creator.adb_client.get_next_url_for_record_type_annotation( + user_id=1, + batch_id=setup_info_2.batch_id + ) + + assert result_with_batch_id.url_info.url == url_2.url + + # If no batch id is provided, return first valid URL + result_no_batch_id = await db_data_creator.adb_client.get_next_url_for_record_type_annotation( + user_id=1, + batch_id=None + ) + + assert result_no_batch_id.url_info.url == url_1.url + + # Test for agency + for url in [url_1, url_2]: + await db_data_creator.auto_suggestions( + url_ids=[url.url_id], + num_suggestions=2, + suggestion_type=SuggestionType.AUTO_SUGGESTION + ) + + # If a batch id is provided, return first valid URL with that batch id + result_with_batch_id = await db_data_creator.adb_client.get_next_url_agency_for_annotation( + user_id=1, + batch_id=setup_info_2.batch_id + ) + + assert result_with_batch_id.next_annotation.url == url_2.url + + # If no batch id is provided, return first valid URL + result_no_batch_id = await db_data_creator.adb_client.get_next_url_agency_for_annotation( + user_id=1, + batch_id=None + ) + + assert result_no_batch_id.next_annotation.url == url_1.url + + @pytest.mark.asyncio async def test_get_next_url_for_user_relevance_annotation_validated( db_data_creator: DBDataCreator @@ -462,16 +582,14 @@ async def test_get_next_url_for_user_relevance_annotation_validated( A validated URL should not turn up in get_next_url_for_user_annotation """ - batch_id = db_data_creator.batch() - - # Create 2 URLs with outcome `pending` - iui: InsertURLsInfo = db_data_creator.urls( - batch_id=batch_id, + setup_info = await setup_for_get_next_url_for_annotation( + db_data_creator=db_data_creator, url_count=1, outcome=URLStatus.VALIDATED ) - url_1 = iui.url_mappings[0] + + url_1 = setup_info.insert_urls_info.url_mappings[0] # Add `Relevancy` attribute with value `True` await db_data_creator.auto_relevant_suggestions( @@ -479,11 +597,9 @@ async def test_get_next_url_for_user_relevance_annotation_validated( relevant=True ) - # Add HTML data - await db_data_creator.html_data([url_1.url_id]) - adb_client = db_data_creator.adb_client url = await adb_client.get_next_url_for_relevance_annotation( - user_id=1 + user_id=1, + batch_id=None ) assert url is None \ No newline at end of file From eae4979c965f69de1414617fe5c78cf0c611c5b3 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 2 Apr 2025 16:01:48 -0400 Subject: [PATCH 075/244] fix(tests): fix import bug --- .../integration/collector_db/test_db_client.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 12031afa..09a27a73 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -1,23 +1,18 @@ from datetime import datetime, timedelta import pytest -from _pytest.outcomes import fail from fastapi import HTTPException from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.BatchInfo import BatchInfo -from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_db.DTOs.LogInfo import LogInfo from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.DTOs.URLInfo import URLInfo -from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo -from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource -from collector_db.models import URL, ApprovingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, \ - UserRelevantSuggestion +from collector_db.models import URL, ApprovingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.enums import BatchStatus, RecordType, SuggestionType -from helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation from tests.helpers.DBDataCreator import DBDataCreator from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review From b669eaba1696d556872b1b460baee041b37187bd Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 2 Apr 2025 21:23:21 -0400 Subject: [PATCH 076/244] feat(app): add `review/reject-source` endpoint Additionally, modify `review/approve-source` to no longer accept `relevant` key-value pair. --- ...-4c70177eba78_add_rejected_batch_status.py | 47 +++++++++++++++++++ ...rename_approving_user_url_to_reviewing_.py | 25 ++++++++++ ...8fe75d_remove_relevant_column_from_urls.py | 27 +++++++++++ api/routes/review.py | 23 +++++++-- collector_db/AsyncDatabaseClient.py | 37 +++++++++++---- collector_db/models.py | 12 ++--- collector_manager/enums.py | 1 + core/AsyncCore.py | 17 +++++-- core/DTOs/FinalReviewApprovalInfo.py | 10 ++-- .../api/helpers/RequestValidator.py | 20 +++++--- .../integration/api/test_review.py | 30 ++++++++++-- .../collector_db/test_db_client.py | 5 +- 12 files changed, 211 insertions(+), 43 deletions(-) create mode 100644 alembic/versions/2025_04_02_2040-4c70177eba78_add_rejected_batch_status.py create mode 100644 alembic/versions/2025_04_02_2051-e3fe6d099583_rename_approving_user_url_to_reviewing_.py create mode 100644 alembic/versions/2025_04_02_2114-45271f8fe75d_remove_relevant_column_from_urls.py diff --git a/alembic/versions/2025_04_02_2040-4c70177eba78_add_rejected_batch_status.py b/alembic/versions/2025_04_02_2040-4c70177eba78_add_rejected_batch_status.py new file mode 100644 index 00000000..fcb9821b --- /dev/null +++ b/alembic/versions/2025_04_02_2040-4c70177eba78_add_rejected_batch_status.py @@ -0,0 +1,47 @@ +"""Add rejected batch status + +Revision ID: 4c70177eba78 +Revises: 5ea47dacd0ef +Create Date: 2025-04-02 20:40:54.982954 + +""" +from typing import Sequence, Union + + +from util.alembic_helpers import switch_enum_type + +# revision identifiers, used by Alembic. +revision: str = '4c70177eba78' +down_revision: Union[str, None] = '5ea47dacd0ef' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + switch_enum_type( + table_name='urls', + column_name='outcome', + enum_name='url_status', + new_enum_values=[ + 'pending', + 'submitted', + 'validated', + 'duplicate', + 'rejected', + 'error' + ] + ) + +def downgrade() -> None: + switch_enum_type( + table_name='urls', + column_name='outcome', + enum_name='url_status', + new_enum_values=[ + 'pending', + 'submitted', + 'validated', + 'duplicate', + 'error', + ] + ) diff --git a/alembic/versions/2025_04_02_2051-e3fe6d099583_rename_approving_user_url_to_reviewing_.py b/alembic/versions/2025_04_02_2051-e3fe6d099583_rename_approving_user_url_to_reviewing_.py new file mode 100644 index 00000000..c9c4eec1 --- /dev/null +++ b/alembic/versions/2025_04_02_2051-e3fe6d099583_rename_approving_user_url_to_reviewing_.py @@ -0,0 +1,25 @@ +"""Rename approving_user_url to reviewing_user_url + +Revision ID: e3fe6d099583 +Revises: 4c70177eba78 +Create Date: 2025-04-02 20:51:10.738159 + +""" +from typing import Sequence, Union + +from alembic import op + + +# revision identifiers, used by Alembic. +revision: str = 'e3fe6d099583' +down_revision: Union[str, None] = '4c70177eba78' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + op.rename_table('approving_user_url', 'reviewing_user_url') + + +def downgrade() -> None: + op.rename_table('reviewing_user_url', 'approving_user_url') diff --git a/alembic/versions/2025_04_02_2114-45271f8fe75d_remove_relevant_column_from_urls.py b/alembic/versions/2025_04_02_2114-45271f8fe75d_remove_relevant_column_from_urls.py new file mode 100644 index 00000000..3f884391 --- /dev/null +++ b/alembic/versions/2025_04_02_2114-45271f8fe75d_remove_relevant_column_from_urls.py @@ -0,0 +1,27 @@ +"""Remove relevant column from urls + +Revision ID: 45271f8fe75d +Revises: e3fe6d099583 +Create Date: 2025-04-02 21:14:29.778488 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '45271f8fe75d' +down_revision: Union[str, None] = 'e3fe6d099583' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + op.drop_column('urls', 'relevant') + + + +def downgrade() -> None: + op.add_column('urls', sa.Column('relevant', sa.BOOLEAN(), nullable=True)) diff --git a/api/routes/review.py b/api/routes/review.py index 25ac85e8..649e0b39 100644 --- a/api/routes/review.py +++ b/api/routes/review.py @@ -4,7 +4,7 @@ from api.dependencies import get_async_core from core.AsyncCore import AsyncCore -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewBaseInfo from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, \ GetNextURLForFinalReviewOuterResponse from security_manager.SecurityManager import AccessInfo, get_access_info @@ -37,9 +37,26 @@ async def approve_source( "If not specified, defaults to first qualifying URL", default=None), ) -> GetNextURLForFinalReviewOuterResponse: - next_source = await core.approve_and_get_next_source_for_review( + await core.approve_url( approval_info, access_info=access_info, - batch_id=batch_id ) + next_source = await core.get_next_source_for_review(batch_id=batch_id) + return GetNextURLForFinalReviewOuterResponse(next_source=next_source) + +@review_router.post("/reject-source") +async def reject_source( + core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info), + review_info: FinalReviewBaseInfo = FinalReviewBaseInfo, + batch_id: Optional[int] = Query( + description="The batch id of the next URL to get. " + "If not specified, defaults to first qualifying URL", + default=None), +) -> GetNextURLForFinalReviewOuterResponse: + await core.reject_url( + url_id=review_info.url_id, + access_info=access_info, + ) + next_source = await core.get_next_source_for_review(batch_id=batch_id) return GetNextURLForFinalReviewOuterResponse(next_source=next_source) \ No newline at end of file diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 7ff5f8ad..e8105f55 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -23,7 +23,7 @@ from collector_db.models import URL, URLErrorInfo, URLHTMLContent, Base, \ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ - UserRecordTypeSuggestion, ApprovingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency + UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency from collector_manager.enums import URLStatus, CollectorType from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseInfo @@ -1182,12 +1182,6 @@ def update_if_not_none( approval_info.record_type.value if approval_info.record_type is not None else None, required=True ) - update_if_not_none( - url, - "relevant", - approval_info.relevant, - required=True - ) # Get existing agency ids existing_agencies = url.confirmed_agencies or [] @@ -1263,10 +1257,35 @@ def update_if_not_none( ) # Add approving user - - approving_user_url = ApprovingUserURL( + approving_user_url = ReviewingUserURL( user_id=user_id, url_id=approval_info.url_id ) session.add(approving_user_url) + + @session_manager + async def reject_url( + self, + session: AsyncSession, + url_id: int, + user_id: int + ) -> None: + + query = ( + Select(URL) + .where(URL.id == url_id) + ) + + url = await session.execute(query) + url = url.scalars().first() + + url.outcome = URLStatus.REJECTED.value + + # Add rejecting user + rejecting_user_url = ReviewingUserURL( + user_id=user_id, + url_id=url_id + ) + + session.add(rejecting_user_url) \ No newline at end of file diff --git a/collector_db/models.py b/collector_db/models.py index 55b75af2..e420961f 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -95,6 +95,7 @@ class URL(Base): 'pending', 'submitted', 'validated', + 'rejected', 'duplicate', 'error', name='url_status' @@ -102,7 +103,6 @@ class URL(Base): nullable=False ) record_type = Column(postgresql.ENUM(*record_type_values, name='record_type'), nullable=True) - relevant = Column(Boolean, nullable=True) created_at = get_created_at_column() updated_at = get_updated_at_column() @@ -128,8 +128,8 @@ class URL(Base): "AutoRelevantSuggestion", uselist=False, back_populates="url") user_relevant_suggestions = relationship( "UserRelevantSuggestion", back_populates="url") - approving_users = relationship( - "ApprovingUserURL", back_populates="url") + reviewing_users = relationship( + "ReviewingUserURL", back_populates="url") optional_data_source_metadata = relationship( "URLOptionalDataSourceMetadata", uselist=False, back_populates="url") confirmed_agencies = relationship( @@ -149,8 +149,8 @@ class URLOptionalDataSourceMetadata(Base): # Relationships url = relationship("URL", uselist=False, back_populates="optional_data_source_metadata") -class ApprovingUserURL(Base): - __tablename__ = 'approving_user_url' +class ReviewingUserURL(Base): + __tablename__ = 'reviewing_user_url' __table_args__ = ( UniqueConstraint( "url_id", @@ -163,7 +163,7 @@ class ApprovingUserURL(Base): created_at = get_created_at_column() # Relationships - url = relationship("URL", back_populates="approving_users") + url = relationship("URL", back_populates="reviewing_users") class RootURL(Base): __tablename__ = 'root_url_cache' diff --git a/collector_manager/enums.py b/collector_manager/enums.py index e90ee7db..692b97e5 100644 --- a/collector_manager/enums.py +++ b/collector_manager/enums.py @@ -15,3 +15,4 @@ class URLStatus(Enum): VALIDATED = "validated" ERROR = "error" DUPLICATE = "duplicate" + REJECTED = "rejected" diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 43b81176..28a14fa2 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -251,17 +251,24 @@ async def get_next_source_for_review( batch_id=batch_id ) - async def approve_and_get_next_source_for_review( + async def approve_url( self, approval_info: FinalReviewApprovalInfo, - access_info: AccessInfo, - batch_id: Optional[int] + access_info: AccessInfo ): await self.adb_client.approve_url( approval_info=approval_info, user_id=access_info.user_id ) - return await self.get_next_source_for_review( - batch_id=batch_id + + + async def reject_url( + self, + url_id: int, + access_info: AccessInfo, + ): + await self.adb_client.reject_url( + url_id=url_id, + user_id=access_info.user_id ) diff --git a/core/DTOs/FinalReviewApprovalInfo.py b/core/DTOs/FinalReviewApprovalInfo.py index e24c3c75..d87fb628 100644 --- a/core/DTOs/FinalReviewApprovalInfo.py +++ b/core/DTOs/FinalReviewApprovalInfo.py @@ -4,21 +4,17 @@ from core.enums import RecordType - -class FinalReviewApprovalInfo(BaseModel): +class FinalReviewBaseInfo(BaseModel): url_id: int = Field( title="The id of the URL." ) + +class FinalReviewApprovalInfo(FinalReviewBaseInfo): record_type: Optional[RecordType] = Field( title="The final record type of the URL." "If none, defers to the existing value from the auto-labeler only if it exists.", default=None ) - relevant: Optional[bool] = Field( - title="Final determination on whether the URL is relevant." - "If none, defers to the existing value from the auto-labeler only if it exists.", - default=None - ) agency_ids: Optional[list[int]] = Field( title="The final confirmed agencies for the URL. " "If none, defers to an existing confirmed agency only if that exists.", diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index e2c8a479..02a51b29 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -9,22 +9,18 @@ from collector_db.enums import TaskType from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.enums import CollectorType -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewBaseInfo from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo -from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo, \ - GetNextRelevanceAnnotationResponseOuterInfo +from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo -from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse -from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, \ - GetNextURLForFinalReviewOuterResponse +from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo -from core.DTOs.MessageCountResponse import MessageCountResponse from core.DTOs.MessageResponse import MessageResponse from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo @@ -276,3 +272,13 @@ async def approve_and_get_next_source_for_review( json=approval_info.model_dump(mode='json') ) return GetNextURLForFinalReviewOuterResponse(**data) + + async def reject_and_get_next_source_for_review( + self, + review_info: FinalReviewBaseInfo + ) -> GetNextURLForFinalReviewOuterResponse: + data = self.post( + url=f"/review/reject-source", + json=review_info.model_dump(mode='json') + ) + return GetNextURLForFinalReviewOuterResponse(**data) \ No newline at end of file diff --git a/tests/test_automated/integration/api/test_review.py b/tests/test_automated/integration/api/test_review.py index b4a94387..61b1ef7e 100644 --- a/tests/test_automated/integration/api/test_review.py +++ b/tests/test_automated/integration/api/test_review.py @@ -3,7 +3,7 @@ from collector_db.constants import PLACEHOLDER_AGENCY_NAME from collector_db.models import URL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency from collector_manager.enums import URLStatus -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewBaseInfo from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse from core.enums import RecordType from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review @@ -102,7 +102,6 @@ async def test_approve_and_get_next_source_for_review(api_test_helper): approval_info=FinalReviewApprovalInfo( url_id=url_mapping.url_id, record_type=RecordType.ARREST_RECORDS, - relevant=True, agency_ids=agency_ids, name="New Test Name", description="New Test Description", @@ -121,7 +120,6 @@ async def test_approve_and_get_next_source_for_review(api_test_helper): url = urls[0] assert url.id == url_mapping.url_id assert url.record_type == RecordType.ARREST_RECORDS.value - assert url.relevant == True assert url.outcome == URLStatus.VALIDATED.value assert url.name == "New Test Name" assert url.description == "New Test Description" @@ -144,4 +142,30 @@ async def test_approve_and_get_next_source_for_review(api_test_helper): if agency.agency_id == additional_agency: assert agency.name == PLACEHOLDER_AGENCY_NAME +@pytest.mark.asyncio +async def test_reject_and_get_next_source_for_review(api_test_helper): + ath = api_test_helper + db_data_creator = ath.db_data_creator + setup_info = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + url_mapping = setup_info.url_mapping + + result: GetNextURLForFinalReviewOuterResponse = await ath.request_validator.reject_and_get_next_source_for_review( + review_info=FinalReviewBaseInfo( + url_id=url_mapping.url_id, + ) + ) + + assert result.next_source is None + + adb_client = db_data_creator.adb_client + # Confirm same agency id is listed as rejected + urls = await adb_client.get_all(URL) + assert len(urls) == 1 + url = urls[0] + assert url.id == url_mapping.url_id + assert url.outcome == URLStatus.REJECTED.value \ No newline at end of file diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 09a27a73..67d27d09 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -8,7 +8,7 @@ from collector_db.DTOs.LogInfo import LogInfo from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.DTOs.URLInfo import URLInfo -from collector_db.models import URL, ApprovingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency +from collector_db.models import URL, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.enums import BatchStatus, RecordType, SuggestionType @@ -391,7 +391,6 @@ async def test_approve_url_basic(db_data_creator: DBDataCreator): url = urls[0] assert url.id == url_mapping.url_id assert url.record_type == RecordType.ARREST_RECORDS.value - assert url.relevant == True assert url.outcome == URLStatus.VALIDATED.value assert url.name == "Test Name" assert url.description == "Test Description" @@ -401,7 +400,7 @@ async def test_approve_url_basic(db_data_creator: DBDataCreator): assert confirmed_agency[0].url_id == url_mapping.url_id assert confirmed_agency[0].agency_id == agency_id - approving_user_urls: list[ApprovingUserURL] = await adb_client.get_all(ApprovingUserURL) + approving_user_urls: list[ReviewingUserURL] = await adb_client.get_all(ReviewingUserURL) assert len(approving_user_urls) == 1 assert approving_user_urls[0].user_id == 1 assert approving_user_urls[0].url_id == url_mapping.url_id From ea23d0c86f0611e6e7cea7ba200bb0423d494eae Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 4 Apr 2025 07:09:02 -0400 Subject: [PATCH 077/244] feat(database): Adjust annotation logic for URLs marked not relevant Now, URLs marked not relevant by a user should not show up for subsequent annotations such as record type or agency. --- collector_db/AsyncDatabaseClient.py | 33 +++++++++- .../collector_db/test_db_client.py | 61 ++++++++++++++++++- 2 files changed, 91 insertions(+), 3 deletions(-) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index e8105f55..7914e483 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -121,7 +121,8 @@ async def get_next_url_for_user_annotation( user_suggestion_model_to_exclude: UserSuggestionModel, auto_suggestion_relationship: QueryableAttribute, user_id: int, - batch_id: Optional[int] + batch_id: Optional[int], + check_if_annotated_not_relevant: bool = False ) -> URL: url_query = ( select( @@ -142,6 +143,21 @@ async def get_next_url_for_user_annotation( ) ) ) + + if check_if_annotated_not_relevant: + url_query = url_query.where( + not_( + exists( + select(UserRelevantSuggestion) + .where( + UserRelevantSuggestion.url_id == URL.id, + UserRelevantSuggestion.user_id == user_id, + UserRelevantSuggestion.relevant == False + ) + ) + ) + ) + if batch_id is not None: url_query = url_query.where(URL.batch_id == batch_id) @@ -233,7 +249,8 @@ async def get_next_url_for_record_type_annotation( user_suggestion_model_to_exclude=UserRecordTypeSuggestion, auto_suggestion_relationship=URL.auto_record_type_suggestion, user_id=user_id, - batch_id=batch_id + batch_id=batch_id, + check_if_annotated_not_relevant=True ) if url is None: return None @@ -832,6 +849,18 @@ async def get_next_url_agency_for_annotation( correlate(URL) ) ) + # Must not have been marked as "Not Relevant" by this user + .join(UserRelevantSuggestion, isouter=True) + .where( + ~exists( + select(UserRelevantSuggestion). + where( + (UserRelevantSuggestion.user_id == user_id) & + (UserRelevantSuggestion.url_id == URL.id) & + (UserRelevantSuggestion.relevant == False) + ).correlate(URL) + ) + ) ).limit(1) raw_result = await session.execute(statement) results = raw_result.all() diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 67d27d09..7af9d5a2 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -8,6 +8,7 @@ from collector_db.DTOs.LogInfo import LogInfo from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.DTOs.URLInfo import URLInfo +from collector_db.DTOs.URLMapping import URLMapping from collector_db.models import URL, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo @@ -596,4 +597,62 @@ async def test_get_next_url_for_user_relevance_annotation_validated( user_id=1, batch_id=None ) - assert url is None \ No newline at end of file + assert url is None + +@pytest.mark.asyncio +async def test_annotate_url_marked_not_relevant(db_data_creator: DBDataCreator): + """ + If a URL is marked not relevant by the user, they should not receive that URL + in calls to get an annotation for record type or agency + Other users should still receive the URL + """ + setup_info = await setup_for_get_next_url_for_annotation( + db_data_creator=db_data_creator, + url_count=2 + ) + adb_client = db_data_creator.adb_client + url_to_mark_not_relevant: URLMapping = setup_info.insert_urls_info.url_mappings[0] + url_to_mark_relevant: URLMapping = setup_info.insert_urls_info.url_mappings[1] + for url_mapping in setup_info.insert_urls_info.url_mappings: + await db_data_creator.agency_auto_suggestions( + url_id=url_mapping.url_id, + count=3 + ) + await adb_client.add_user_relevant_suggestion( + user_id=1, + url_id=url_to_mark_not_relevant.url_id, + relevant=False + ) + await adb_client.add_user_relevant_suggestion( + user_id=1, + url_id=url_to_mark_relevant.url_id, + relevant=True + ) + + # User should not receive the URL for record type annotation + record_type_annotation_info = await adb_client.get_next_url_for_record_type_annotation( + user_id=1, + batch_id=None + ) + assert record_type_annotation_info.url_info.url_id != url_to_mark_not_relevant.url_id + + # Other users should still receive the URL for record type annotation + record_type_annotation_info = await adb_client.get_next_url_for_record_type_annotation( + user_id=2, + batch_id=None + ) + assert record_type_annotation_info.url_info.url_id == url_to_mark_not_relevant.url_id + + # User should not receive the URL for agency annotation + agency_annotation_info = await adb_client.get_next_url_agency_for_annotation( + user_id=1, + batch_id=None + ) + assert agency_annotation_info.next_annotation.url_id != url_to_mark_not_relevant.url_id + + # Other users should still receive the URL for agency annotation + agency_annotation_info = await adb_client.get_next_url_agency_for_annotation( + user_id=2, + batch_id=None + ) + assert agency_annotation_info.next_annotation.url_id == url_to_mark_not_relevant.url_id From c20e8ac434b00a386354647f7d98a19f1b0acc5f Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 4 Apr 2025 07:45:26 -0400 Subject: [PATCH 078/244] feat(database): add agency not in database in annotate agencies Previously, the `/annotate/agencies` `POST` method would return a 500 error when an agency whose ID was not yet in the DBI database was submitted. This has been resolved. --- collector_db/AsyncDatabaseClient.py | 12 +++++ tests/helpers/complex_test_data_functions.py | 23 +++++++- .../integration/api/test_annotate.py | 53 +++++++------------ .../collector_db/test_db_client.py | 24 ++++++++- 4 files changed, 75 insertions(+), 37 deletions(-) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 7914e483..50fbc586 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -976,6 +976,18 @@ async def add_agency_manual_suggestion( ): if is_new and agency_id is not None: raise ValueError("agency_id must be None when is_new is True") + + # Check if agency exists in database -- if not, add with placeholder + if agency_id is not None: + statement = select(Agency).where(Agency.agency_id == agency_id) + result = await session.execute(statement) + if len(result.all()) == 0: + agency = Agency( + agency_id=agency_id, + name=PLACEHOLDER_AGENCY_NAME + ) + await session.merge(agency) + url_agency_suggestion = UserUrlAgencySuggestion( url_id=url_id, agency_id=agency_id, diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index 104402c0..febf4e35 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -3,7 +3,8 @@ from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_db.DTOs.URLMapping import URLMapping from collector_manager.enums import URLStatus -from core.enums import RecordType +from core.enums import RecordType, SuggestionType +from helpers.DBDataCreator import BatchURLCreationInfo from tests.helpers.DBDataCreator import DBDataCreator class AnnotationSetupInfo(BaseModel): @@ -28,6 +29,26 @@ async def setup_for_get_next_url_for_annotation( ) return AnnotationSetupInfo(batch_id=batch_id, insert_urls_info=insert_urls_info) +class AnnotateAgencySetupInfo(BaseModel): + batch_id: int + url_ids: list[int] + +async def setup_for_annotate_agency( + db_data_creator: DBDataCreator, + url_count: int, + suggestion_type: SuggestionType = SuggestionType.UNKNOWN +): + buci: BatchURLCreationInfo = await db_data_creator.batch_and_urls( + url_count=url_count, + with_html_content=True + ) + await db_data_creator.auto_suggestions( + url_ids=buci.url_ids, + num_suggestions=1, + suggestion_type=suggestion_type + ) + + return AnnotateAgencySetupInfo(batch_id=buci.batch_id, url_ids=buci.url_ids) class FinalReviewSetupInfo(BaseModel): batch_id: int diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/test_automated/integration/api/test_annotate.py index 1530dcb1..0bf4be11 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/test_automated/integration/api/test_annotate.py @@ -13,6 +13,7 @@ from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo from core.enums import RecordType, SuggestionType +from helpers.complex_test_data_functions import AnnotateAgencySetupInfo, setup_for_annotate_agency from html_tag_collector.DataClassTags import ResponseHTMLInfo from tests.helpers.DBDataCreator import BatchURLCreationInfo from tests.test_automated.integration.api.conftest import MOCK_USER_ID @@ -221,7 +222,6 @@ async def test_annotate_agency_multiple_auto_suggestions(api_test_helper): The user should receive all of the auto suggestions with full detail """ ath = api_test_helper - adb_client = ath.adb_client() buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( url_count=1, with_html_content=True @@ -264,7 +264,6 @@ async def test_annotate_agency_single_unknown_auto_suggestion(api_test_helper): The user should receive a single Unknown Auto Suggestion lacking other detail """ ath = api_test_helper - adb_client = ath.adb_client() buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( url_count=1, with_html_content=True @@ -306,7 +305,6 @@ async def test_annotate_agency_single_confirmed_agency(api_test_helper): The user should not receive this URL to annotate """ ath = api_test_helper - adb_client = ath.adb_client() buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( url_count=1, with_html_content=True @@ -325,20 +323,16 @@ async def test_annotate_agency_other_user_annotation(api_test_helper): Our user should still receive this URL to annotate """ ath = api_test_helper - adb_client = ath.adb_client() - buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( - url_count=1, - with_html_content=True - ) - await ath.db_data_creator.auto_suggestions( - url_ids=buci.url_ids, - num_suggestions=1, - suggestion_type=SuggestionType.UNKNOWN + setup_info: AnnotateAgencySetupInfo = await setup_for_annotate_agency( + db_data_creator=ath.db_data_creator, + url_count=1 ) + url_ids = setup_info.url_ids + await ath.db_data_creator.manual_suggestion( user_id=MOCK_USER_ID + 1, - url_id=buci.url_ids[0], + url_id=url_ids[0], ) response = await ath.request_validator.get_next_agency_annotation() @@ -346,7 +340,7 @@ async def test_annotate_agency_other_user_annotation(api_test_helper): assert response.next_annotation next_annotation = response.next_annotation # Check that url_id matches the one we inserted - assert next_annotation.url_id == buci.url_ids[0] + assert next_annotation.url_id == url_ids[0] # Check that html data is present assert next_annotation.html_info.description != "" @@ -364,20 +358,15 @@ async def test_annotate_agency_submit_and_get_next(api_test_helper): Until another relevant URL is added """ ath = api_test_helper - adb_client = ath.adb_client() - buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( - url_count=2, - with_html_content=True - ) - await ath.db_data_creator.auto_suggestions( - url_ids=buci.url_ids, - num_suggestions=1, - suggestion_type=SuggestionType.UNKNOWN + setup_info: AnnotateAgencySetupInfo = await setup_for_annotate_agency( + db_data_creator=ath.db_data_creator, + url_count=2 ) + url_ids = setup_info.url_ids # User should submit an annotation and receive the next response = await ath.request_validator.post_agency_annotation_and_get_next( - url_id=buci.url_ids[0], + url_id=url_ids[0], agency_annotation_post_info=URLAgencyAnnotationPostInfo( suggested_agency=await ath.db_data_creator.agency(), is_new=False @@ -388,7 +377,7 @@ async def test_annotate_agency_submit_and_get_next(api_test_helper): # User should submit this annotation and receive none for the next response = await ath.request_validator.post_agency_annotation_and_get_next( - url_id=buci.url_ids[1], + url_id=url_ids[1], agency_annotation_post_info=URLAgencyAnnotationPostInfo( suggested_agency=await ath.db_data_creator.agency(), is_new=False @@ -407,19 +396,15 @@ async def test_annotate_agency_submit_new(api_test_helper): """ ath = api_test_helper adb_client = ath.adb_client() - buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( - url_count=1, - with_html_content=True - ) - await ath.db_data_creator.auto_suggestions( - url_ids=buci.url_ids, - num_suggestions=1, - suggestion_type=SuggestionType.UNKNOWN + setup_info: AnnotateAgencySetupInfo = await setup_for_annotate_agency( + db_data_creator=ath.db_data_creator, + url_count=1 ) + url_ids = setup_info.url_ids # User should submit an annotation and mark it as New response = await ath.request_validator.post_agency_annotation_and_get_next( - url_id=buci.url_ids[0], + url_id=url_ids[0], agency_annotation_post_info=URLAgencyAnnotationPostInfo( suggested_agency=await ath.db_data_creator.agency(), is_new=True diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 7af9d5a2..6090aaf1 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -9,11 +9,12 @@ from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.DTOs.URLInfo import URLInfo from collector_db.DTOs.URLMapping import URLMapping -from collector_db.models import URL, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency +from collector_db.constants import PLACEHOLDER_AGENCY_NAME +from collector_db.models import URL, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.enums import BatchStatus, RecordType, SuggestionType -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation, setup_for_annotate_agency from tests.helpers.DBDataCreator import DBDataCreator from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review @@ -656,3 +657,22 @@ async def test_annotate_url_marked_not_relevant(db_data_creator: DBDataCreator): batch_id=None ) assert agency_annotation_info.next_annotation.url_id == url_to_mark_not_relevant.url_id + +@pytest.mark.asyncio +async def test_annotate_url_agency_agency_not_in_db(db_data_creator: DBDataCreator): + setup_info = await setup_for_annotate_agency( + db_data_creator, + url_count=1 + ) + + url_id = setup_info.url_ids[0] + await db_data_creator.adb_client.add_agency_manual_suggestion( + agency_id=1, + url_id=url_id, + user_id=1, + is_new=False + ) + + agencies = await db_data_creator.adb_client.get_all(Agency) + assert len(agencies) + assert agencies[0].name == PLACEHOLDER_AGENCY_NAME \ No newline at end of file From def484448b74b7f9e6ec4e6cc27dc12c99634192 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 4 Apr 2025 07:54:37 -0400 Subject: [PATCH 079/244] fix(tests): fix import bug --- tests/helpers/complex_test_data_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index febf4e35..57fd6b96 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -4,7 +4,7 @@ from collector_db.DTOs.URLMapping import URLMapping from collector_manager.enums import URLStatus from core.enums import RecordType, SuggestionType -from helpers.DBDataCreator import BatchURLCreationInfo +from tests.helpers.DBDataCreator import BatchURLCreationInfo from tests.helpers.DBDataCreator import DBDataCreator class AnnotationSetupInfo(BaseModel): From fcb9b2df57a2c33959d63dabb8839ffd823430f3 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 4 Apr 2025 08:00:46 -0400 Subject: [PATCH 080/244] fix(tests): fix import bug --- tests/test_automated/integration/api/test_annotate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/test_automated/integration/api/test_annotate.py index 0bf4be11..3d870371 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/test_automated/integration/api/test_annotate.py @@ -13,7 +13,7 @@ from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo from core.enums import RecordType, SuggestionType -from helpers.complex_test_data_functions import AnnotateAgencySetupInfo, setup_for_annotate_agency +from tests.helpers.complex_test_data_functions import AnnotateAgencySetupInfo, setup_for_annotate_agency from html_tag_collector.DataClassTags import ResponseHTMLInfo from tests.helpers.DBDataCreator import BatchURLCreationInfo from tests.test_automated.integration.api.conftest import MOCK_USER_ID From 443e76795d462113e095d9db56085313d2575275 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 4 Apr 2025 08:39:37 -0400 Subject: [PATCH 081/244] feat(api): require final review permission for review endpoints BREAKING CHANGE: All `/review/`endpoints now require the `source_collector_final_review` permission --- api/routes/review.py | 10 ++++++---- security_manager/SecurityManager.py | 16 +++++++++++++--- tests/test_automated/integration/api/conftest.py | 12 ++++++++++-- .../security_manager/test_security_manager.py | 4 ++-- 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/api/routes/review.py b/api/routes/review.py index 649e0b39..62bf5de6 100644 --- a/api/routes/review.py +++ b/api/routes/review.py @@ -7,7 +7,7 @@ from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewBaseInfo from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, \ GetNextURLForFinalReviewOuterResponse -from security_manager.SecurityManager import AccessInfo, get_access_info +from security_manager.SecurityManager import AccessInfo, get_access_info, require_permission, Permissions review_router = APIRouter( prefix="/review", @@ -15,10 +15,12 @@ responses={404: {"description": "Not found"}}, ) +requires_final_review_permission = require_permission(Permissions.SOURCE_COLLECTOR_FINAL_REVIEW) + @review_router.get("/next-source") async def get_next_source( core: AsyncCore = Depends(get_async_core), - access_info: AccessInfo = Depends(get_access_info), + access_info: AccessInfo = Depends(requires_final_review_permission), batch_id: Optional[int] = Query( description="The batch id of the next URL to get. " "If not specified, defaults to first qualifying URL", @@ -30,7 +32,7 @@ async def get_next_source( @review_router.post("/approve-source") async def approve_source( core: AsyncCore = Depends(get_async_core), - access_info: AccessInfo = Depends(get_access_info), + access_info: AccessInfo = Depends(requires_final_review_permission), approval_info: FinalReviewApprovalInfo = FinalReviewApprovalInfo, batch_id: Optional[int] = Query( description="The batch id of the next URL to get. " @@ -47,7 +49,7 @@ async def approve_source( @review_router.post("/reject-source") async def reject_source( core: AsyncCore = Depends(get_async_core), - access_info: AccessInfo = Depends(get_access_info), + access_info: AccessInfo = Depends(requires_final_review_permission), review_info: FinalReviewBaseInfo = FinalReviewBaseInfo, batch_id: Optional[int] = Query( description="The batch id of the next URL to get. " diff --git a/security_manager/SecurityManager.py b/security_manager/SecurityManager.py index 8d80f46c..92da2975 100644 --- a/security_manager/SecurityManager.py +++ b/security_manager/SecurityManager.py @@ -20,6 +20,7 @@ def get_secret_key(): class Permissions(Enum): SOURCE_COLLECTOR = "source_collector" + SOURCE_COLLECTOR_FINAL_REVIEW = "source_collector_final_review" class AccessInfo(BaseModel): user_id: int @@ -65,9 +66,13 @@ def get_relevant_permissions(raw_permissions: list[str]) -> list[Permissions]: continue return relevant_permissions - def check_access(self, token: str) -> AccessInfo: + def check_access( + self, + token: str, + permission: Permissions + ) -> AccessInfo: access_info = self.validate_token(token) - if not access_info.has_permission(Permissions.SOURCE_COLLECTOR): + if not access_info.has_permission(permission): raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="Access forbidden", @@ -80,4 +85,9 @@ def check_access(self, token: str) -> AccessInfo: def get_access_info( token: Annotated[str, Depends(oauth2_scheme)] ) -> AccessInfo: - return SecurityManager().check_access(token) \ No newline at end of file + return SecurityManager().check_access(token, Permissions.SOURCE_COLLECTOR) + +def require_permission(permission: Permissions): + def dependency(token: Annotated[str, Depends(oauth2_scheme)]) -> AccessInfo: + return SecurityManager().check_access(token, permission=permission) + return dependency \ No newline at end of file diff --git a/tests/test_automated/integration/api/conftest.py b/tests/test_automated/integration/api/conftest.py index d9a504a7..a0a46abf 100644 --- a/tests/test_automated/integration/api/conftest.py +++ b/tests/test_automated/integration/api/conftest.py @@ -6,8 +6,9 @@ from starlette.testclient import TestClient from api.main import app +from api.routes.review import requires_final_review_permission from core.SourceCollectorCore import SourceCollectorCore -from security_manager.SecurityManager import get_access_info, AccessInfo, Permissions +from security_manager.SecurityManager import get_access_info, AccessInfo, Permissions, require_permission from tests.helpers.DBDataCreator import DBDataCreator from tests.test_automated.integration.api.helpers.RequestValidator import RequestValidator @@ -27,12 +28,19 @@ def adb_client(self): def override_access_info() -> AccessInfo: - return AccessInfo(user_id=MOCK_USER_ID, permissions=[Permissions.SOURCE_COLLECTOR]) + return AccessInfo( + user_id=MOCK_USER_ID, + permissions=[ + Permissions.SOURCE_COLLECTOR, + Permissions.SOURCE_COLLECTOR_FINAL_REVIEW + ] + ) @pytest.fixture def client(db_client_test) -> Generator[TestClient, None, None]: with TestClient(app) as c: app.dependency_overrides[get_access_info] = override_access_info + app.dependency_overrides[requires_final_review_permission] = override_access_info core: SourceCollectorCore = c.app.state.core # core.shutdown() yield c diff --git a/tests/test_automated/unit/security_manager/test_security_manager.py b/tests/test_automated/unit/security_manager/test_security_manager.py index f827cc1b..fd03fee5 100644 --- a/tests/test_automated/unit/security_manager/test_security_manager.py +++ b/tests/test_automated/unit/security_manager/test_security_manager.py @@ -49,7 +49,7 @@ def test_validate_token_failure(mock_get_secret_key, mock_jwt_decode): def test_check_access_success(mock_get_secret_key, mock_jwt_decode): sm = SecurityManager() - sm.check_access(VALID_TOKEN) # Should not raise any exceptions. + sm.check_access(VALID_TOKEN, Permissions.SOURCE_COLLECTOR) # Should not raise any exceptions. def test_check_access_failure(mock_get_secret_key, mock_jwt_decode): @@ -57,7 +57,7 @@ def test_check_access_failure(mock_get_secret_key, mock_jwt_decode): with patch(get_patch_path("SecurityManager.validate_token"), return_value=AccessInfo(user_id=1, permissions=[])): sm = SecurityManager() with pytest.raises(HTTPException) as exc_info: - sm.check_access(VALID_TOKEN) + sm.check_access(VALID_TOKEN, Permissions.SOURCE_COLLECTOR) assert exc_info.value.status_code == 403 From 3b3253fd39edcfaf7b600c486626b2a371fdef13 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sat, 5 Apr 2025 08:52:36 -0400 Subject: [PATCH 082/244] feat(app): update misc metadata task to use html title description as defaults --- collector_db/AsyncDatabaseClient.py | 2 +- collector_db/StatementComposer.py | 11 +---------- core/classes/URLMiscellaneousMetadataTaskOperator.py | 12 +++++++++--- .../tasks/test_url_miscellaneous_metadata_task.py | 4 +++- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 172f8061..34ebe7f7 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -410,7 +410,7 @@ async def get_pending_urls_missing_miscellaneous_metadata( for result in all_results: tdo = URLMiscellaneousMetadataTDO( url_id=result.id, - collector_metadata=result.collector_metadata, + collector_metadata=result.collector_metadata or {}, collector_type=CollectorType(result.batch.strategy), ) html_info = URLHTMLMetadataInfo() diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index c80b83e5..b2b7e706 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -73,16 +73,7 @@ def pending_urls_missing_miscellaneous_metadata_query() -> Select: URL.outcome == URLStatus.PENDING.value, URL.name == None, URL.description == None, - URLOptionalDataSourceMetadata.url_id == None, - Batch.strategy.in_( - [ - CollectorType.AUTO_GOOGLER.value, - CollectorType.CKAN.value, - CollectorType.MUCKROCK_ALL_SEARCH.value, - CollectorType.MUCKROCK_COUNTY_SEARCH.value, - CollectorType.MUCKROCK_SIMPLE_SEARCH.value - ] - ) + URLOptionalDataSourceMetadata.url_id == None ) ).outerjoin( URLOptionalDataSourceMetadata diff --git a/core/classes/URLMiscellaneousMetadataTaskOperator.py b/core/classes/URLMiscellaneousMetadataTaskOperator.py index 4b9becdb..1cbebbc6 100644 --- a/core/classes/URLMiscellaneousMetadataTaskOperator.py +++ b/core/classes/URLMiscellaneousMetadataTaskOperator.py @@ -1,3 +1,5 @@ +from typing import Optional + from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.enums import TaskType @@ -26,7 +28,10 @@ def task_type(self): async def meets_task_prerequisites(self): return await self.adb_client.has_pending_urls_missing_miscellaneous_metadata() - async def get_subtask(self, collector_type: CollectorType) -> MiscellaneousMetadataSubtaskBase: + async def get_subtask( + self, + collector_type: CollectorType + ) -> Optional[MiscellaneousMetadataSubtaskBase]: match collector_type: case CollectorType.MUCKROCK_SIMPLE_SEARCH: return MuckrockMiscMetadataSubtask() @@ -39,7 +44,7 @@ async def get_subtask(self, collector_type: CollectorType) -> MiscellaneousMetad case CollectorType.CKAN: return CKANMiscMetadataSubtask() case _: - raise Exception(f"Unknown collector type: {collector_type}") + return None async def html_default_logic(self, tdo: URLMiscellaneousMetadataTDO): if tdo.name is None: @@ -55,7 +60,8 @@ async def inner_task_logic(self): for tdo in tdos: subtask = await self.get_subtask(tdo.collector_type) try: - subtask.process(tdo) + if subtask is not None: + subtask.process(tdo) await self.html_default_logic(tdo) except Exception as e: error_info = URLErrorPydanticInfo( diff --git a/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py b/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py index 51f57da9..818d5aef 100644 --- a/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py +++ b/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py @@ -84,6 +84,8 @@ async def test_url_miscellaneous_metadata_task(db_data_creator: DBDataCreator): CollectorType.COMMON_CRAWLER, collector_metadata=None ) + # Add URL HTML + await db_data_creator.html_data([common_crawler_url_id]) # example # Check that task now meets prerequisites @@ -96,7 +98,7 @@ async def test_url_miscellaneous_metadata_task(db_data_creator: DBDataCreator): # Check that each URL has the expected name/description and optional metadata expected_urls = { - common_crawler_url_id: (None, None), + common_crawler_url_id: ("test html content", "test description"), auto_googler_url_id: ("Test Auto Googler Title", "Test Auto Googler Snippet"), ckan_url_id: ("Test CKAN Name", "Test CKAN Description"), muckrock_simple_url_id: ("Test Muckrock Simple Title", "Test Muckrock Simple Title"), From 77c7dff9ed972b01ca679602f2f84ca97e2371c9 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 8 Apr 2025 20:34:53 -0400 Subject: [PATCH 083/244] DRAFT --- ..._add_data_source_id_column_to_url_table.py | 10 +- collector_db/AsyncDatabaseClient.py | 64 ++++++- .../task_data_objects/SubmitApprovedURLTDO.py | 3 +- core/classes/SubmitApprovedURLTaskOperator.py | 32 +++- pdap_api_client/DTOs.py | 1 + pdap_api_client/PDAPClient.py | 30 ++- tests/helpers/DBDataCreator.py | 5 +- .../tasks/test_submit_approved_url_task.py | 171 ++++++++++++++++++ 8 files changed, 302 insertions(+), 14 deletions(-) create mode 100644 tests/test_automated/integration/tasks/test_submit_approved_url_task.py diff --git a/alembic/versions/2025_03_29_1716-33a546c93441_add_data_source_id_column_to_url_table.py b/alembic/versions/2025_03_29_1716-33a546c93441_add_data_source_id_column_to_url_table.py index 8e15dbf2..b92fe1ef 100644 --- a/alembic/versions/2025_03_29_1716-33a546c93441_add_data_source_id_column_to_url_table.py +++ b/alembic/versions/2025_03_29_1716-33a546c93441_add_data_source_id_column_to_url_table.py @@ -1,7 +1,7 @@ """Add data source ID column to URL table Revision ID: 33a546c93441 -Revises: 5ea47dacd0ef +Revises: 45271f8fe75d Create Date: 2025-03-29 17:16:11.863064 """ @@ -13,19 +13,19 @@ # revision identifiers, used by Alembic. revision: str = '33a546c93441' -down_revision: Union[str, None] = '5ea47dacd0ef' +down_revision: Union[str, None] = '45271f8fe75d' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.add_column( - 'url', + 'urls', sa.Column('data_source_id', sa.Integer(), nullable=True) ) # Add unique constraint to data_source_id column - op.create_unique_constraint('uq_data_source_id', 'url', ['data_source_id']) + op.create_unique_constraint('uq_data_source_id', 'urls', ['data_source_id']) def downgrade() -> None: - op.drop_column('url', 'data_source_id') + op.drop_column('urls', 'data_source_id') diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 34ebe7f7..e74a28ec 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -15,7 +15,6 @@ from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType from collector_db.DTOs.URLInfo import URLInfo from collector_db.DTOs.URLMapping import URLMapping -from collector_db.DTOs.URLWithHTML import URLWithHTML from collector_db.StatementComposer import StatementComposer from collector_db.constants import PLACEHOLDER_AGENCY_NAME from collector_db.enums import URLMetadataAttributeType, TaskType @@ -37,6 +36,7 @@ GetURLsResponseInnerInfo from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO +from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo from core.enums import BatchStatus, SuggestionType, RecordType from html_tag_collector.DataClassTags import convert_to_response_html_info @@ -1337,4 +1337,64 @@ async def reject_url( url_id=url_id ) - session.add(rejecting_user_url) \ No newline at end of file + session.add(rejecting_user_url) + + @session_manager + async def has_validated_urls(self, session: AsyncSession) -> bool: + query = ( + select(URL) + .where(URL.outcome == URLStatus.VALIDATED.value) + ) + urls = await session.execute(query) + urls = urls.scalars().all() + return len(urls) > 0 + + @session_manager + async def get_validated_urls( + self, + session: AsyncSession + ) -> list[SubmitApprovedURLTDO]: + query = ( + select(URL) + .where(URL.outcome == URLStatus.VALIDATED.value) + .options( + selectinload(URL.optional_data_source_metadata), + selectinload(URL.confirmed_agencies) + ) + ) + urls = await session.execute(query) + urls = urls.scalars().all() + results: list[SubmitApprovedURLTDO] = [] + for url in urls: + agency_ids = [] + for agency in url.confirmed_agencies: + agency_ids.append(agency.agency_id) + tdo = SubmitApprovedURLTDO( + url_id=url.id, + url=url.url, + name=url.name, + agency_ids=agency_ids, + description=url.description, + record_type=url.record_type, + record_formats=url.optional_data_source_metadata.record_formats, + data_portal_type=url.optional_data_source_metadata.data_portal_type, + supplying_entity=url.optional_data_source_metadata.supplying_entity, + ) + results.append(tdo) + return results + + @session_manager + async def mark_urls_as_submitted(self, session: AsyncSession, tdos: list[SubmitApprovedURLTDO]): + for tdo in tdos: + url_id = tdo.url_id + data_source_id = tdo.data_source_id + query = ( + update(URL) + .where(URL.id == url_id) + .values( + data_source_id=data_source_id, + outcome=URLStatus.SUBMITTED.value + ) + ) + await session.execute(query) + diff --git a/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py b/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py index fc6e789b..45fa7daf 100644 --- a/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py +++ b/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py @@ -6,9 +6,10 @@ class SubmitApprovedURLTDO(BaseModel): + url_id: int url: str record_type: RecordType - agency_id: Optional[int] + agency_ids: list[int] name: str description: str record_formats: Optional[list[str]] = None diff --git a/core/classes/SubmitApprovedURLTaskOperator.py b/core/classes/SubmitApprovedURLTaskOperator.py index 06b28a18..2a308e7c 100644 --- a/core/classes/SubmitApprovedURLTaskOperator.py +++ b/core/classes/SubmitApprovedURLTaskOperator.py @@ -1,6 +1,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.enums import TaskType -from core.DTOs.task_data_objects.UrlHtmlTDO import UrlHtmlTDO +from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO from core.classes.TaskOperatorBase import TaskOperatorBase from pdap_api_client.PDAPClient import PDAPClient @@ -23,7 +24,30 @@ async def meets_task_prerequisites(self): return await self.adb_client.has_validated_urls() async def inner_task_logic(self): - raise NotImplementedError + # Retrieve all URLs that are validated and not submitted + tdos: list[SubmitApprovedURLTDO] = await self.adb_client.get_validated_urls() - async def update_errors_in_database(self, error_tdos: list[UrlHtmlTDO]): - raise NotImplementedError \ No newline at end of file + # Link URLs to this task + await self.link_urls_to_task(url_ids=[tdo.url_id for tdo in tdos]) + + # Submit each URL, recording errors if they exist + error_infos: list[URLErrorPydanticInfo] = [] + success_tdos: list[SubmitApprovedURLTDO] = [] + for tdo in tdos: + try: + data_source_id = await self.pdap_client.submit_url(tdo) + tdo.data_source_id = data_source_id + success_tdos.append(tdo) + except Exception as e: + error_info = URLErrorPydanticInfo( + task_id=self.task_id, + url_id=tdo.url_id, + error=str(e), + ) + error_infos.append(error_info) + + # Update the database for successful submissions + await self.adb_client.mark_urls_as_submitted(tdos=success_tdos) + + # Update the database for failed submissions + await self.adb_client.add_url_error_infos(error_infos) diff --git a/pdap_api_client/DTOs.py b/pdap_api_client/DTOs.py index 19255a35..37d7e857 100644 --- a/pdap_api_client/DTOs.py +++ b/pdap_api_client/DTOs.py @@ -36,6 +36,7 @@ class Namespaces(Enum): AUTH = "auth" MATCH = "match" CHECK = "check" + DATA_SOURCES = "data-sources" class RequestType(Enum): diff --git a/pdap_api_client/PDAPClient.py b/pdap_api_client/PDAPClient.py index b2b89564..8b1c5e82 100644 --- a/pdap_api_client/PDAPClient.py +++ b/pdap_api_client/PDAPClient.py @@ -1,5 +1,6 @@ from typing import Optional +from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO from pdap_api_client.AccessManager import build_url, AccessManager from pdap_api_client.DTOs import MatchAgencyInfo, UniqueURLDuplicateInfo, UniqueURLResponseInfo, Namespaces, \ RequestType, RequestInfo, MatchAgencyResponse @@ -21,7 +22,6 @@ async def match_agency( county: Optional[str] = None, locality: Optional[str] = None ) -> MatchAgencyResponse: - # TODO: Change to async """ Returns agencies, if any, that match or partially match the search criteria """ @@ -84,3 +84,31 @@ async def is_url_unique( is_unique=is_unique, duplicates=duplicates ) + + async def submit_url( + self, + tdo: SubmitApprovedURLTDO + ) -> int: + url = build_url( + namespace=Namespaces.DATA_SOURCES, + ) + headers = await self.access_manager.jwt_header() + request_info = RequestInfo( + type_=RequestType.POST, + url=url, + headers=headers, + json={ + "entry_data": { + "name": tdo.name, + "description": tdo.description, + "source_url": tdo.url, + "record_type_name": tdo.record_type.value, + "record_formats": tdo.record_formats, + "data_portal_type": tdo.data_portal_type, + "supplying_entity": tdo.supplying_entity + }, + "linked_agency_ids": tdo.agency_ids + } + ) + response_info = await self.access_manager.make_request(request_info) + return response_info.data["id"] diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 9f9719a7..dbf7072a 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -61,7 +61,10 @@ async def batch_and_urls( if with_html_content: await self.html_data(url_ids) - return BatchURLCreationInfo(batch_id=batch_id, url_ids=url_ids) + return BatchURLCreationInfo( + batch_id=batch_id, + url_ids=url_ids + ) async def agency(self) -> int: agency_id = randint(1, 99999999) diff --git a/tests/test_automated/integration/tasks/test_submit_approved_url_task.py b/tests/test_automated/integration/tasks/test_submit_approved_url_task.py new file mode 100644 index 00000000..75630af8 --- /dev/null +++ b/tests/test_automated/integration/tasks/test_submit_approved_url_task.py @@ -0,0 +1,171 @@ +from http import HTTPStatus +from unittest.mock import MagicMock, AsyncMock + +import pytest + +from collector_db.models import URL +from collector_manager.enums import URLStatus +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo +from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome +from core.classes.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator +from core.enums import RecordType +from helpers.DBDataCreator import BatchURLCreationInfo, DBDataCreator +from pdap_api_client.AccessManager import AccessManager +from pdap_api_client.DTOs import RequestInfo, RequestType, ResponseInfo +from pdap_api_client.PDAPClient import PDAPClient + + +@pytest.fixture +def mock_pdap_client(): + mock_access_manager = MagicMock( + spec=AccessManager + ) + mock_access_manager.make_request = AsyncMock( + side_effect=[ + ResponseInfo( + status_code=HTTPStatus.OK, + data={ + "id": 21 + } + ), + ResponseInfo( + status_code=HTTPStatus.OK, + data={ + "id": 34 + } + ) + ] + ) + mock_access_manager.jwt_header = AsyncMock( + return_value={"Authorization": "Bearer token"} + ) + pdap_client = PDAPClient( + access_manager=mock_access_manager + ) + return pdap_client + +async def setup_validated_urls(db_data_creator: DBDataCreator): + creation_info: BatchURLCreationInfo = await db_data_creator.batch_and_urls( + url_count=2, + with_html_content=True + ) + url_1 = creation_info.url_ids[0] + url_2 = creation_info.url_ids[1] + await db_data_creator.adb_client.approve_url( + approval_info=FinalReviewApprovalInfo( + url_id=url_1, + record_type=RecordType.ACCIDENT_REPORTS, + agency_ids=[1, 2], + name="URL 1 Name", + description="URL 1 Description", + record_formats=["Record Format 1", "Record Format 2"], + data_portal_type="Data Portal Type 1", + supplying_entity="Supplying Entity 1" + ), + user_id=1 + ) + await db_data_creator.adb_client.approve_url( + approval_info=FinalReviewApprovalInfo( + url_id=url_2, + record_type=RecordType.INCARCERATION_RECORDS, + agency_ids=[3, 4], + name="URL 2 Name", + description="URL 2 Description", + ), + user_id=1 + ) + +@pytest.mark.asyncio +async def test_submit_approved_url_task( + db_data_creator, + mock_pdap_client, + monkeypatch +): + monkeypatch.setenv("PDAP_API_URL", "http://localhost:8000") + + # Get Task Operator + operator = SubmitApprovedURLTaskOperator( + adb_client=db_data_creator.adb_client, + pdap_client=mock_pdap_client + ) + + # Check Task Operator does not yet meet pre-requisites + assert not await operator.meets_task_prerequisites() + + # Create URLs with status 'validated' in database and all requisite URL values + # Ensure they have optional metadata as well + await setup_validated_urls(db_data_creator) + + # Check Task Operator does meet pre-requisites + assert await operator.meets_task_prerequisites() + + # Run Task + run_info = await operator.run_task(task_id=1) + + # Check Task has been marked as completed + assert run_info.outcome == TaskOperatorOutcome.SUCCESS, run_info.message + + # Get URLs + urls = await db_data_creator.adb_client.get_all(URL, order_by_attribute="id") + url_1 = urls[0] + url_2 = urls[1] + + # Check URLs have been marked as 'submitted' + assert url_1.outcome == URLStatus.SUBMITTED.value + assert url_2.outcome == URLStatus.SUBMITTED.value + + # Check URLs now have data source ids + assert url_1.data_source_id == 21 + assert url_2.data_source_id == 34 + + # Check mock method was called twice with expected parameters + access_manager = mock_pdap_client.access_manager + assert access_manager.make_request.call_count == 2 + # Check first call + + + call_1 = access_manager.make_request.call_args_list[0][0][0] + expected_call_1 = RequestInfo( + type_=RequestType.POST, + url="http://localhost:8000/data-sources", + headers=access_manager.jwt_header.return_value, + json={ + "entry_data": { + "name": "URL 1 Name", + "source_url": url_1.url, + "record_type_name": "Accident Reports", + "description": "URL 1 Description", + "record_formats": ["Record Format 1", "Record Format 2"], + "data_portal_type": "Data Portal Type 1", + "supplying_entity": "Supplying Entity 1" + }, + "linked_agency_ids": [1, 2] + } + ) + assert call_1.type_ == expected_call_1.type_ + assert call_1.url == expected_call_1.url + assert call_1.headers == expected_call_1.headers + assert call_1.json == expected_call_1.json + # Check second call + call_2 = access_manager.make_request.call_args_list[1][0][0] + expected_call_2 = RequestInfo( + type_=RequestType.POST, + url="http://localhost:8000/data-sources", + headers=access_manager.jwt_header.return_value, + json={ + "entry_data": { + "name": "URL 2 Name", + "source_url": url_2.url, + "record_type_name": "Incarceration Records", + "description": "URL 2 Description", + "data_portal_type": None, + "supplying_entity": None, + "record_formats": None + }, + "linked_agency_ids": [3, 4] + } + ) + assert call_2.type_ == expected_call_2.type_ + assert call_2.url == expected_call_2.url + assert call_2.headers == expected_call_2.headers + assert call_2.json == expected_call_2.json \ No newline at end of file From 1b0e6c372d8b9d6f83b3cbb35439ea4d1f728440 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 8 Apr 2025 21:18:48 -0400 Subject: [PATCH 084/244] feat(app): allow retrieving URLs for annotation without html info --- collector_db/AsyncDatabaseClient.py | 1 - tests/conftest.py | 21 +++- .../AlembicRunner.py | 0 tests/helpers/complex_test_data_functions.py | 5 +- tests/test_alembic/conftest.py | 2 +- tests/test_alembic/helpers.py | 2 +- .../integration/api/test_annotate.py | 98 ++++++++++++++++++- 7 files changed, 120 insertions(+), 9 deletions(-) rename tests/{test_alembic => helpers}/AlembicRunner.py (100%) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 34ebe7f7..39dba50e 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -129,7 +129,6 @@ async def get_next_url_for_user_annotation( URL, ) .where(URL.outcome == URLStatus.PENDING.value) - .where(exists(select(URLHTMLContent).where(URLHTMLContent.url_id == URL.id))) # URL must not have metadata annotation by this user .where( not_( diff --git a/tests/conftest.py b/tests/conftest.py index 6181dd50..3e33d57a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,11 +1,13 @@ import pytest from alembic import command from alembic.config import Config -from sqlalchemy import create_engine +from sqlalchemy import create_engine, inspect, MetaData +from sqlalchemy.orm import scoped_session, sessionmaker from collector_db.DatabaseClient import DatabaseClient from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import Base +from helpers.AlembicRunner import AlembicRunner from tests.helpers.DBDataCreator import DBDataCreator @@ -19,7 +21,22 @@ def setup_and_teardown(): "sqlalchemy.url", get_postgres_connection_string() ) - command.upgrade(alembic_cfg, "head") + live_connection = engine.connect() + runner = AlembicRunner( + alembic_config=alembic_cfg, + inspector=inspect(live_connection), + metadata=MetaData(), + connection=live_connection, + session=scoped_session(sessionmaker(bind=live_connection)), + ) + try: + runner.upgrade("head") + except Exception as e: + runner.reset_schema() + runner.stamp("base") + runner.upgrade("head") + + live_connection.close() engine.dispose() yield diff --git a/tests/test_alembic/AlembicRunner.py b/tests/helpers/AlembicRunner.py similarity index 100% rename from tests/test_alembic/AlembicRunner.py rename to tests/helpers/AlembicRunner.py diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index 57fd6b96..18d3f92a 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -36,11 +36,12 @@ class AnnotateAgencySetupInfo(BaseModel): async def setup_for_annotate_agency( db_data_creator: DBDataCreator, url_count: int, - suggestion_type: SuggestionType = SuggestionType.UNKNOWN + suggestion_type: SuggestionType = SuggestionType.UNKNOWN, + with_html_content: bool = True ): buci: BatchURLCreationInfo = await db_data_creator.batch_and_urls( url_count=url_count, - with_html_content=True + with_html_content=with_html_content ) await db_data_creator.auto_suggestions( url_ids=buci.url_ids, diff --git a/tests/test_alembic/conftest.py b/tests/test_alembic/conftest.py index 11b75b92..ff0591d1 100644 --- a/tests/test_alembic/conftest.py +++ b/tests/test_alembic/conftest.py @@ -4,7 +4,7 @@ from sqlalchemy.orm import scoped_session, sessionmaker from collector_db.helper_functions import get_postgres_connection_string -from tests.test_alembic.AlembicRunner import AlembicRunner +from helpers.AlembicRunner import AlembicRunner @pytest.fixture() diff --git a/tests/test_alembic/helpers.py b/tests/test_alembic/helpers.py index d6b2bea4..32d67321 100644 --- a/tests/test_alembic/helpers.py +++ b/tests/test_alembic/helpers.py @@ -3,7 +3,7 @@ from sqlalchemy import text from sqlalchemy.orm import Session -from tests.test_alembic.AlembicRunner import AlembicRunner +from helpers.AlembicRunner import AlembicRunner def get_enum_values(enum_name: str, session: Session) -> list[str]: diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/test_automated/integration/api/test_annotate.py index 3d870371..0e462ba5 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/test_automated/integration/api/test_annotate.py @@ -28,8 +28,12 @@ def check_url_mappings_match( def check_html_info_not_empty( html_info: ResponseHTMLInfo ): - assert html_info.description != "" - assert html_info.title != "" + assert not html_info_empty(html_info) + +def html_info_empty( + html_info: ResponseHTMLInfo +) -> bool: + return html_info.description == "" and html_info.title == "" @pytest.mark.asyncio async def test_annotate_relevancy(api_test_helper): @@ -123,6 +127,36 @@ async def test_annotate_relevancy(api_test_helper): assert results[0].relevant is True +@pytest.mark.asyncio +async def test_annotate_relevancy_no_html(api_test_helper): + ath = api_test_helper + + batch_id = ath.db_data_creator.batch() + + # Create 2 URLs with outcome `pending` + iui: InsertURLsInfo = ath.db_data_creator.urls(batch_id=batch_id, url_count=2) + + url_1 = iui.url_mappings[0] + url_2 = iui.url_mappings[1] + + # Add `Relevancy` attribute with value `True` to 1st URL + await ath.db_data_creator.auto_relevant_suggestions( + url_id=url_1.url_id, + relevant=True + ) + + # Add 'Relevancy' attribute with value `False` to 2nd URL + await ath.db_data_creator.auto_relevant_suggestions( + url_id=url_2.url_id, + relevant=False + ) + + # Call `GET` `/annotate/relevance` and receive next URL + request_info_1: GetNextRelevanceAnnotationResponseOuterInfo = api_test_helper.request_validator.get_next_relevance_annotation() + inner_info_1 = request_info_1.next_annotation + + check_url_mappings_match(inner_info_1.url_info, url_1) + assert html_info_empty(inner_info_1.html_info) @pytest.mark.asyncio async def test_annotate_record_type(api_test_helper): @@ -213,6 +247,36 @@ async def test_annotate_record_type(api_test_helper): if result.url_id == inner_info_1.url_info.url_id: assert result.record_type == RecordType.BOOKING_REPORTS.value +@pytest.mark.asyncio +async def test_annotate_record_type_no_html_info(api_test_helper): + ath = api_test_helper + + batch_id = ath.db_data_creator.batch() + + # Create 2 URLs with outcome `pending` + iui: InsertURLsInfo = ath.db_data_creator.urls(batch_id=batch_id, url_count=2) + + url_1 = iui.url_mappings[0] + url_2 = iui.url_mappings[1] + + # Add record type attribute with value `Accident Reports` to 1st URL + await ath.db_data_creator.auto_record_type_suggestions( + url_id=url_1.url_id, + record_type=RecordType.ACCIDENT_REPORTS + ) + + # Add 'Record Type' attribute with value `Dispatch Recordings` to 2nd URL + await ath.db_data_creator.auto_record_type_suggestions( + url_id=url_2.url_id, + record_type=RecordType.DISPATCH_RECORDINGS + ) + + # Call `GET` `/annotate/record-type` and receive next URL + request_info_1: GetNextRecordTypeAnnotationResponseOuterInfo = api_test_helper.request_validator.get_next_record_type_annotation() + inner_info_1 = request_info_1.next_annotation + + check_url_mappings_match(inner_info_1.url_info, url_1) + assert html_info_empty(inner_info_1.html_info) @pytest.mark.asyncio async def test_annotate_agency_multiple_auto_suggestions(api_test_helper): @@ -256,6 +320,36 @@ async def test_annotate_agency_multiple_auto_suggestions(api_test_helper): assert agency_suggestion.locality is not None +@pytest.mark.asyncio +async def test_annotate_agency_multiple_auto_suggestions_no_html(api_test_helper): + """ + Test Scenario: Multiple Auto Suggestions + A URL has multiple Agency Auto Suggestion and has not been annotated by the User + The user should receive all of the auto suggestions with full detail + """ + ath = api_test_helper + buci: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( + url_count=1, + with_html_content=False + ) + await ath.db_data_creator.auto_suggestions( + url_ids=buci.url_ids, + num_suggestions=2, + suggestion_type=SuggestionType.AUTO_SUGGESTION + ) + + # User requests next annotation + response = await ath.request_validator.get_next_agency_annotation() + + assert response.next_annotation + next_annotation = response.next_annotation + # Check that url_id matches the one we inserted + assert next_annotation.url_id == buci.url_ids[0] + + # Check that html data is not present + assert next_annotation.html_info.description == "" + assert next_annotation.html_info.title == "" + @pytest.mark.asyncio async def test_annotate_agency_single_unknown_auto_suggestion(api_test_helper): """ From 27581eb9abd422cdd5effdf5e2e98367b75c50a9 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 8 Apr 2025 21:23:27 -0400 Subject: [PATCH 085/244] Fix import bug --- tests/test_alembic/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_alembic/conftest.py b/tests/test_alembic/conftest.py index ff0591d1..8cd1d0ab 100644 --- a/tests/test_alembic/conftest.py +++ b/tests/test_alembic/conftest.py @@ -4,7 +4,7 @@ from sqlalchemy.orm import scoped_session, sessionmaker from collector_db.helper_functions import get_postgres_connection_string -from helpers.AlembicRunner import AlembicRunner +from tests.helpers.AlembicRunner import AlembicRunner @pytest.fixture() From 0ba8dc14ff2907509fdb0a0c0b6e3e82a1fe74d8 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 8 Apr 2025 21:26:03 -0400 Subject: [PATCH 086/244] Fix import bug --- tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 3e33d57a..7cc4291c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -7,7 +7,7 @@ from collector_db.DatabaseClient import DatabaseClient from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import Base -from helpers.AlembicRunner import AlembicRunner +from tests.helpers.AlembicRunner import AlembicRunner from tests.helpers.DBDataCreator import DBDataCreator From 3275fe38af971bf555d502da09d20f9f3588dffe Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 8 Apr 2025 21:34:21 -0400 Subject: [PATCH 087/244] Fix import bug --- tests/test_alembic/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_alembic/helpers.py b/tests/test_alembic/helpers.py index 32d67321..dfebce07 100644 --- a/tests/test_alembic/helpers.py +++ b/tests/test_alembic/helpers.py @@ -3,7 +3,7 @@ from sqlalchemy import text from sqlalchemy.orm import Session -from helpers.AlembicRunner import AlembicRunner +from tests.helpers.AlembicRunner import AlembicRunner def get_enum_values(enum_name: str, session: Session) -> list[str]: From 753a06dd66dbc6cea64e32b458f00dcd912b5bd0 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 9 Apr 2025 20:57:37 -0400 Subject: [PATCH 088/244] Temporarily disable HTML Task Operator --- core/AsyncCore.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 28a14fa2..f8c42815 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -107,7 +107,7 @@ async def get_url_miscellaneous_metadata_task_operator(self): async def get_task_operators(self) -> list[TaskOperatorBase]: return [ - await self.get_url_html_task_operator(), + # await self.get_url_html_task_operator(), await self.get_url_relevance_huggingface_task_operator(), await self.get_url_record_type_task_operator(), await self.get_agency_identification_task_operator(), From 87c1057b5904d4bd04967ed533323ce955206f53 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 10 Apr 2025 07:45:44 -0400 Subject: [PATCH 089/244] Re-enable HTML Task Operator with logging on fetch_and_render --- html_tag_collector/URLRequestInterface.py | 1 + 1 file changed, 1 insertion(+) diff --git a/html_tag_collector/URLRequestInterface.py b/html_tag_collector/URLRequestInterface.py index 20ea1989..f55d9502 100644 --- a/html_tag_collector/URLRequestInterface.py +++ b/html_tag_collector/URLRequestInterface.py @@ -46,6 +46,7 @@ async def get_response(self, session: ClientSession, url: str) -> URLResponseInf return URLResponseInfo(success=False, exception=e) async def fetch_and_render(self, rr: RequestResources, url: str) -> URLResponseInfo: + print(f"Fetch and Rendering {url}") simple_response = await self.get_response(rr.session, url) if not simple_response.success: return simple_response From 0b7661e13cb8f3acc051bc5a77b6c50caed0762e Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 10 Apr 2025 07:51:56 -0400 Subject: [PATCH 090/244] Re-enable HTML Task Operator with logging on fetch_and_render --- core/AsyncCore.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/AsyncCore.py b/core/AsyncCore.py index f8c42815..28a14fa2 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -107,7 +107,7 @@ async def get_url_miscellaneous_metadata_task_operator(self): async def get_task_operators(self) -> list[TaskOperatorBase]: return [ - # await self.get_url_html_task_operator(), + await self.get_url_html_task_operator(), await self.get_url_relevance_huggingface_task_operator(), await self.get_url_record_type_task_operator(), await self.get_agency_identification_task_operator(), From c3a8511c25bda632ff7c961d457937ee0c53e2da Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 10 Apr 2025 08:03:24 -0400 Subject: [PATCH 091/244] Transition relevancy pipeline to lazy loading --- hugging_face/HuggingFaceInterface.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/hugging_face/HuggingFaceInterface.py b/hugging_face/HuggingFaceInterface.py index 4e37e9c4..87d88caf 100644 --- a/hugging_face/HuggingFaceInterface.py +++ b/hugging_face/HuggingFaceInterface.py @@ -1,12 +1,13 @@ from transformers import pipeline from collector_db.DTOs.URLWithHTML import URLWithHTML - +import gc class HuggingFaceInterface: - def __init__(self): - self.relevance_pipe = pipeline("text-classification", model="PDAP/url-relevance") + @staticmethod + def load_relevancy_model() -> pipeline: + return pipeline("text-classification", model="PDAP/url-relevance") def get_url_relevancy( self, @@ -14,7 +15,8 @@ def get_url_relevancy( threshold: float = 0.5 ) -> list[bool]: urls = [url_with_html.url for url_with_html in urls_with_html] - results: list[dict] = self.relevance_pipe(urls) + relevance_pipe = self.load_relevancy_model() + results: list[dict] = relevance_pipe(urls) bool_results = [] for result in results: @@ -23,6 +25,8 @@ def get_url_relevancy( bool_results.append(True) else: bool_results.append(False) + del relevance_pipe + gc.collect() return bool_results From eba18d1f16ee7febede84ceb4f4d092afc0ae33e Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 10 Apr 2025 08:05:40 -0400 Subject: [PATCH 092/244] Remove log for fetch and render --- html_tag_collector/URLRequestInterface.py | 1 - 1 file changed, 1 deletion(-) diff --git a/html_tag_collector/URLRequestInterface.py b/html_tag_collector/URLRequestInterface.py index f55d9502..20ea1989 100644 --- a/html_tag_collector/URLRequestInterface.py +++ b/html_tag_collector/URLRequestInterface.py @@ -46,7 +46,6 @@ async def get_response(self, session: ClientSession, url: str) -> URLResponseInf return URLResponseInfo(success=False, exception=e) async def fetch_and_render(self, rr: RequestResources, url: str) -> URLResponseInfo: - print(f"Fetch and Rendering {url}") simple_response = await self.get_response(rr.session, url) if not simple_response.success: return simple_response From d68ab306c7fcd4ddf648e60a5626280fc2df1f7c Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 10 Apr 2025 14:46:31 -0400 Subject: [PATCH 093/244] feat(app): enable task loop to repeat if prerequisites met The task loop has been modified such that, if prerequisites continue to be met, the same task loop will run again. In the case of the task looping more than 20 times, the task loop is set to break and discord notified as an indicator of potentially unwelcome activity. --- ENV.md | 1 + api/main.py | 4 ++ core/AsyncCore.py | 34 +++++++---- .../integration/api/conftest.py | 3 +- .../integration/core/test_async_core.py | 59 ++++++++++++++++--- .../security_manager/test_security_manager.py | 8 ++- util/DiscordNotifier.py | 13 ++++ 7 files changed, 98 insertions(+), 24 deletions(-) create mode 100644 util/DiscordNotifier.py diff --git a/ENV.md b/ENV.md index 68359348..cdedd288 100644 --- a/ENV.md +++ b/ENV.md @@ -21,4 +21,5 @@ Please ensure these are properly defined in a `.env` file in the root directory. |`PDAP_EMAIL`| An email address for accessing the PDAP API. | `abc123@test.com` | |`PDAP_PASSWORD`| A password for accessing the PDAP API. | `abc123` | |`PDAP_API_KEY`| An API key for accessing the PDAP API. | `abc123` | +|`DISCORD_WEBHOOK_URL`| The URL for the Discord webhook used for notifications| `abc123` | diff --git a/api/main.py b/api/main.py index 8feaa165..f39cc7f3 100644 --- a/api/main.py +++ b/api/main.py @@ -20,6 +20,7 @@ from html_tag_collector.RootURLCache import RootURLCache from html_tag_collector.URLRequestInterface import URLRequestInterface from hugging_face.HuggingFaceInterface import HuggingFaceInterface +from util.DiscordNotifier import DiscordPoster from util.helper_functions import get_from_env @@ -40,6 +41,9 @@ async def lifespan(app: FastAPI): url_request_interface=URLRequestInterface(), html_parser=HTMLResponseParser( root_url_cache=RootURLCache() + ), + discord_poster=DiscordPoster( + webhook_url=get_from_env("DISCORD_WEBHOOK_URL") ) ) async_scheduled_task_manager = AsyncScheduledTaskManager(async_core=async_core) diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 28a14fa2..d95efbfe 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -1,22 +1,18 @@ import logging from typing import Optional -from aiohttp import ClientSession from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.TaskInfo import TaskInfo -from collector_db.DTOs.URLAnnotationInfo import URLAnnotationInfo -from collector_db.enums import TaskType, URLMetadataAttributeType +from collector_db.enums import TaskType from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo -from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo -from core.DTOs.AnnotationRequestInfo import AnnotationRequestInfo from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome from core.classes.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator from core.classes.TaskOperatorBase import TaskOperatorBase @@ -24,8 +20,7 @@ from core.classes.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator -from core.enums import BatchStatus, SuggestionType, RecordType -from html_tag_collector.DataClassTags import convert_to_response_html_info +from core.enums import BatchStatus, RecordType from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.URLRequestInterface import URLRequestInterface from hugging_face.HuggingFaceInterface import HuggingFaceInterface @@ -33,8 +28,10 @@ from pdap_api_client.AccessManager import AccessManager from pdap_api_client.PDAPClient import PDAPClient from security_manager.SecurityManager import AccessInfo +from util.DiscordNotifier import DiscordPoster from util.helper_functions import get_from_env +TASK_REPEAT_THRESHOLD = 20 class AsyncCore: @@ -44,6 +41,7 @@ def __init__( huggingface_interface: HuggingFaceInterface, url_request_interface: URLRequestInterface, html_parser: HTMLResponseParser, + discord_poster: DiscordPoster ): self.adb_client = adb_client self.huggingface_interface = huggingface_interface @@ -52,6 +50,7 @@ def __init__( self.logger = logging.getLogger(__name__) self.logger.addHandler(logging.StreamHandler()) self.logger.setLevel(logging.INFO) + self.discord_poster = discord_poster async def get_urls(self, page: int, errors: bool) -> GetURLsResponseInfo: @@ -119,14 +118,23 @@ async def get_task_operators(self) -> list[TaskOperatorBase]: #region Tasks async def run_tasks(self): operators = await self.get_task_operators() + count = 0 for operator in operators: + meets_prereq = await operator.meets_task_prerequisites() - if not meets_prereq: - self.logger.info(f"Skipping {operator.task_type.value} Task") - continue - task_id = await self.initiate_task_in_db(task_type=operator.task_type) - run_info: TaskOperatorRunInfo = await operator.run_task(task_id) - await self.conclude_task(run_info) + while meets_prereq: + if count > TASK_REPEAT_THRESHOLD: + self.discord_poster.post_to_discord( + message=f"Task {operator.task_type.value} has been run" + f" more than {TASK_REPEAT_THRESHOLD} times in a row. " + f"Task loop terminated.") + break + task_id = await self.initiate_task_in_db(task_type=operator.task_type) + run_info: TaskOperatorRunInfo = await operator.run_task(task_id) + await self.conclude_task(run_info) + count += 1 + meets_prereq = await operator.meets_task_prerequisites() + async def conclude_task(self, run_info): await self.adb_client.link_urls_to_task(task_id=run_info.task_id, url_ids=run_info.linked_url_ids) diff --git a/tests/test_automated/integration/api/conftest.py b/tests/test_automated/integration/api/conftest.py index d9a504a7..2065463e 100644 --- a/tests/test_automated/integration/api/conftest.py +++ b/tests/test_automated/integration/api/conftest.py @@ -30,7 +30,8 @@ def override_access_info() -> AccessInfo: return AccessInfo(user_id=MOCK_USER_ID, permissions=[Permissions.SOURCE_COLLECTOR]) @pytest.fixture -def client(db_client_test) -> Generator[TestClient, None, None]: +def client(db_client_test, monkeypatch) -> Generator[TestClient, None, None]: + monkeypatch.setenv("DISCORD_WEBHOOK_URL", "https://discord.com") with TestClient(app) as c: app.dependency_overrides[get_access_info] = override_access_info core: SourceCollectorCore = c.app.state.core diff --git a/tests/test_automated/integration/core/test_async_core.py b/tests/test_automated/integration/core/test_async_core.py index 1bb09809..4aa51b77 100644 --- a/tests/test_automated/integration/core/test_async_core.py +++ b/tests/test_automated/integration/core/test_async_core.py @@ -1,5 +1,5 @@ import types -from unittest.mock import MagicMock, AsyncMock +from unittest.mock import MagicMock, AsyncMock, call import pytest @@ -27,7 +27,8 @@ async def test_conclude_task_success(db_data_creator: DBDataCreator): adb_client=ddc.adb_client, huggingface_interface=MagicMock(), url_request_interface=MagicMock(), - html_parser=MagicMock() + html_parser=MagicMock(), + discord_poster=MagicMock() ) await core.conclude_task(run_info=run_info) @@ -53,7 +54,8 @@ async def test_conclude_task_success(db_data_creator: DBDataCreator): adb_client=ddc.adb_client, huggingface_interface=MagicMock(), url_request_interface=MagicMock(), - html_parser=MagicMock() + html_parser=MagicMock(), + discord_poster=MagicMock() ) await core.conclude_task(run_info=run_info) @@ -80,7 +82,8 @@ async def test_conclude_task_error(db_data_creator: DBDataCreator): adb_client=ddc.adb_client, huggingface_interface=MagicMock(), url_request_interface=MagicMock(), - html_parser=MagicMock() + html_parser=MagicMock(), + discord_poster=MagicMock() ) await core.conclude_task(run_info=run_info) @@ -96,7 +99,8 @@ async def test_run_task_prereq_not_met(): adb_client=AsyncMock(), huggingface_interface=AsyncMock(), url_request_interface=AsyncMock(), - html_parser=AsyncMock() + html_parser=AsyncMock(), + discord_poster=MagicMock() ) mock_operator = AsyncMock() @@ -121,19 +125,22 @@ async def run_task(self, task_id: int) -> TaskOperatorRunInfo: adb_client=db_data_creator.adb_client, huggingface_interface=AsyncMock(), url_request_interface=AsyncMock(), - html_parser=AsyncMock() + html_parser=AsyncMock(), + discord_poster=MagicMock() ) core.conclude_task = AsyncMock() mock_operator = AsyncMock() - mock_operator.meets_task_prerequisites = AsyncMock(return_value=True) + mock_operator.meets_task_prerequisites = AsyncMock( + side_effect=[True, False] + ) mock_operator.task_type = TaskType.HTML mock_operator.run_task = types.MethodType(run_task, mock_operator) AsyncCore.get_task_operators = AsyncMock(return_value=[mock_operator]) await core.run_tasks() - mock_operator.meets_task_prerequisites.assert_called_once() + mock_operator.meets_task_prerequisites.assert_has_calls([call(), call()]) results = await db_data_creator.adb_client.get_all(Task) @@ -142,3 +149,39 @@ async def run_task(self, task_id: int) -> TaskOperatorRunInfo: core.conclude_task.assert_called_once() +@pytest.mark.asyncio +async def test_run_task_break_loop(db_data_creator: DBDataCreator): + """ + If the task loop for a single task runs more than 20 times in a row, + this is considered suspicious and possibly indicative of a bug. + In this case, the task loop should be terminated + and an alert should be sent to discord + """ + + async def run_task(self, task_id: int) -> TaskOperatorRunInfo: + return TaskOperatorRunInfo( + task_id=task_id, + outcome=TaskOperatorOutcome.SUCCESS, + linked_url_ids=[1, 2, 3] + ) + + core = AsyncCore( + adb_client=db_data_creator.adb_client, + huggingface_interface=AsyncMock(), + url_request_interface=AsyncMock(), + html_parser=AsyncMock(), + discord_poster=MagicMock() + ) + core.conclude_task = AsyncMock() + + mock_operator = AsyncMock() + mock_operator.meets_task_prerequisites = AsyncMock(return_value=True) + mock_operator.task_type = TaskType.HTML + mock_operator.run_task = types.MethodType(run_task, mock_operator) + + AsyncCore.get_task_operators = AsyncMock(return_value=[mock_operator]) + await core.run_tasks() + + core.discord_poster.post_to_discord.assert_called_once_with( + message="Task HTML has been run more than 20 times in a row. Task loop terminated." + ) diff --git a/tests/test_automated/integration/security_manager/test_security_manager.py b/tests/test_automated/integration/security_manager/test_security_manager.py index 3dc676ad..eb7e8506 100644 --- a/tests/test_automated/integration/security_manager/test_security_manager.py +++ b/tests/test_automated/integration/security_manager/test_security_manager.py @@ -18,12 +18,16 @@ def mock_get_secret_key(mocker): VALID_TOKEN = "valid_token" INVALID_TOKEN = "invalid_token" FAKE_PAYLOAD = { - "sub": 1, + "sub": "1", "permissions": [Permissions.SOURCE_COLLECTOR.value] } -def test_api_with_valid_token(mock_get_secret_key): +def test_api_with_valid_token( + mock_get_secret_key, + monkeypatch +): + monkeypatch.setenv("DISCORD_WEBHOOK_URL", "https://discord.com") token = jwt.encode(FAKE_PAYLOAD, SECRET_KEY, algorithm=ALGORITHM) # Create Test Client diff --git a/util/DiscordNotifier.py b/util/DiscordNotifier.py new file mode 100644 index 00000000..15e74020 --- /dev/null +++ b/util/DiscordNotifier.py @@ -0,0 +1,13 @@ +import logging + +import requests + + +class DiscordPoster: + def __init__(self, webhook_url: str): + if not webhook_url: + logging.error("WEBHOOK_URL environment variable not set") + raise ValueError("WEBHOOK_URL environment variable not set") + self.webhook_url = webhook_url + def post_to_discord(self, message): + requests.post(self.webhook_url, json={"content": message}) From e2575af65f462f27e47ed6b71ca04e0169fb7b8d Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sat, 12 Apr 2025 07:47:59 -0400 Subject: [PATCH 094/244] DRAFT --- api/main.py | 19 ++- api/routes/batch.py | 27 +-- api/routes/collector.py | 11 +- collector_db/AsyncDatabaseClient.py | 125 +++++++++++++- collector_manager/AsyncCollectorBase.py | 124 ++++++++++++++ collector_manager/AsyncCollectorManager.py | 84 ++++++++++ collector_manager/CollectorManager.py | 24 +-- collector_manager/ExampleCollector.py | 13 +- collector_manager/constants.py | 14 ++ core/AsyncCore.py | 69 +++++++- core/SourceCollectorCore.py | 13 +- requirements.txt | 15 +- source_collectors/auto_googler/AutoGoogler.py | 6 +- .../auto_googler/AutoGooglerCollector.py | 15 +- .../auto_googler/GoogleSearcher.py | 29 ++-- source_collectors/ckan/CKANAPIInterface.py | 63 ++++--- source_collectors/ckan/CKANCollector.py | 29 ++-- .../ckan/ckan_scraper_toolkit.py | 84 +++++----- source_collectors/ckan/main.py | 8 +- .../ckan/scrape_ckan_data_portals.py | 28 ++-- .../common_crawler/CommonCrawler.py | 78 +++++---- .../muckrock_fetchers/MuckrockFetcher.py | 32 +--- .../MuckrockIterFetcherBase.py | 13 +- .../lifecycle/test_auto_googler_lifecycle.py | 1 + .../source_collectors/test_ckan_collector.py | 17 +- .../test_common_crawler_collector.py | 1 + .../integration/api/conftest.py | 2 + .../integration/api/test_batch.py | 1 + .../integration/api/test_example_collector.py | 12 +- tests/test_automated/integration/conftest.py | 30 ++++ .../integration/core/test_async_core.py | 15 +- .../core/test_example_collector_lifecycle.py | 27 ++- .../test_example_collector.py | 45 ----- .../test_collector_manager.py | 154 ------------------ .../test_autogoogler_collector.py | 16 +- .../test_example_collector.py | 2 +- 36 files changed, 791 insertions(+), 455 deletions(-) create mode 100644 collector_manager/AsyncCollectorBase.py create mode 100644 collector_manager/AsyncCollectorManager.py create mode 100644 collector_manager/constants.py diff --git a/api/main.py b/api/main.py index f39cc7f3..a38ead34 100644 --- a/api/main.py +++ b/api/main.py @@ -1,6 +1,7 @@ from contextlib import asynccontextmanager import uvicorn +from adodbapi.ado_consts import adBSTR from fastapi import FastAPI from api.routes.annotate import annotate_router @@ -12,6 +13,8 @@ from api.routes.url import url_router from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DatabaseClient import DatabaseClient +from collector_manager.AsyncCollectorManager import AsyncCollectorManager +from collector_manager.CollectorManager import CollectorManager from core.AsyncCore import AsyncCore from core.CoreLogger import CoreLogger from core.ScheduledTaskManager import AsyncScheduledTaskManager @@ -28,15 +31,26 @@ async def lifespan(app: FastAPI): # Initialize shared dependencies db_client = DatabaseClient() + adb_client = AsyncDatabaseClient() await setup_database(db_client) + core_logger = CoreLogger(db_client=db_client) + collector_manager = CollectorManager( + logger=core_logger, + db_client=db_client, + ) + async_collector_manager = AsyncCollectorManager( + logger=core_logger, + adb_client=adb_client, + ) source_collector_core = SourceCollectorCore( core_logger=CoreLogger( db_client=db_client ), db_client=DatabaseClient(), + collector_manager=collector_manager ) async_core = AsyncCore( - adb_client=AsyncDatabaseClient(), + adb_client=adb_client, huggingface_interface=HuggingFaceInterface(), url_request_interface=URLRequestInterface(), html_parser=HTMLResponseParser( @@ -44,7 +58,8 @@ async def lifespan(app: FastAPI): ), discord_poster=DiscordPoster( webhook_url=get_from_env("DISCORD_WEBHOOK_URL") - ) + ), + collector_manager=async_collector_manager ) async_scheduled_task_manager = AsyncScheduledTaskManager(async_core=async_core) diff --git a/api/routes/batch.py b/api/routes/batch.py index 9405fec6..950b6931 100644 --- a/api/routes/batch.py +++ b/api/routes/batch.py @@ -1,11 +1,13 @@ from typing import Optional -from fastapi import Path, APIRouter +from fastapi import Path, APIRouter, HTTPException from fastapi.params import Query, Depends -from api.dependencies import get_core +from api.dependencies import get_core, get_async_core from collector_db.DTOs.BatchInfo import BatchInfo +from collector_manager.CollectorManager import InvalidCollectorError from collector_manager.enums import CollectorType +from core.AsyncCore import AsyncCore from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse @@ -46,24 +48,25 @@ def get_batch_status( @batch_router.get("/{batch_id}") -def get_batch_info( +async def get_batch_info( batch_id: int = Path(description="The batch id"), - core: SourceCollectorCore = Depends(get_core), + core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), ) -> BatchInfo: - return core.get_batch_info(batch_id) + result = await core.get_batch_info(batch_id) + return result @batch_router.get("/{batch_id}/urls") -def get_urls_by_batch( +async def get_urls_by_batch( batch_id: int = Path(description="The batch id"), page: int = Query( description="The page number", default=1 ), - core: SourceCollectorCore = Depends(get_core), + core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), ) -> GetURLsByBatchResponse: - return core.get_urls_by_batch(batch_id, page=page) + return await core.get_urls_by_batch(batch_id, page=page) @batch_router.get("/{batch_id}/duplicates") def get_duplicates_by_batch( @@ -90,9 +93,13 @@ def get_batch_logs( return core.get_batch_logs(batch_id) @batch_router.post("/{batch_id}/abort") -def abort_batch( +async def abort_batch( batch_id: int = Path(description="The batch id"), core: SourceCollectorCore = Depends(get_core), + async_core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), ) -> MessageResponse: - return core.abort_batch(batch_id) \ No newline at end of file + try: + return core.abort_batch(batch_id) + except InvalidCollectorError as e: + return await async_core.abort_batch(batch_id) \ No newline at end of file diff --git a/api/routes/collector.py b/api/routes/collector.py index b49d569c..18c488b8 100644 --- a/api/routes/collector.py +++ b/api/routes/collector.py @@ -1,9 +1,10 @@ from fastapi import APIRouter from fastapi.params import Depends -from api.dependencies import get_core +from api.dependencies import get_core, get_async_core from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.enums import CollectorType +from core.AsyncCore import AsyncCore from core.DTOs.CollectorStartInfo import CollectorStartInfo from core.SourceCollectorCore import SourceCollectorCore from security_manager.SecurityManager import AccessInfo, get_access_info @@ -22,13 +23,13 @@ @collector_router.post("/example") async def start_example_collector( dto: ExampleInputDTO, - core: SourceCollectorCore = Depends(get_core), + core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), ) -> CollectorStartInfo: """ Start the example collector """ - return core.initiate_collector( + return await core.initiate_collector( collector_type=CollectorType.EXAMPLE, dto=dto, user_id=access_info.user_id @@ -67,13 +68,13 @@ async def start_common_crawler_collector( @collector_router.post("/auto-googler") async def start_auto_googler_collector( dto: AutoGooglerInputDTO, - core: SourceCollectorCore = Depends(get_core), + core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), ) -> CollectorStartInfo: """ Start the auto googler collector """ - return core.initiate_collector( + return await core.initiate_collector( collector_type=CollectorType.AUTO_GOOGLER, dto=dto, user_id=access_info.user_id diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 39dba50e..60fdcdfe 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -1,8 +1,9 @@ from functools import wraps -from typing import Optional, Type, Any +from typing import Optional, Type, Any, List from fastapi import HTTPException from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, or_, update, Delete, Insert, asc +from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import selectinload, joinedload, QueryableAttribute from sqlalchemy.sql.functions import coalesce @@ -10,6 +11,9 @@ from collector_db.ConfigManager import ConfigManager from collector_db.DTOConverter import DTOConverter +from collector_db.DTOs.BatchInfo import BatchInfo +from collector_db.DTOs.DuplicateInfo import DuplicateInsertInfo +from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType @@ -23,7 +27,7 @@ from collector_db.models import URL, URLErrorInfo, URLHTMLContent, Base, \ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ - UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency + UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Duplicate from collector_manager.enums import URLStatus, CollectorType from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseInfo @@ -1336,4 +1340,119 @@ async def reject_url( url_id=url_id ) - session.add(rejecting_user_url) \ No newline at end of file + session.add(rejecting_user_url) + + @session_manager + async def get_batch_by_id(self, session, batch_id: int) -> Optional[BatchInfo]: + """Retrieve a batch by ID.""" + query = Select(Batch).where(Batch.id == batch_id) + result = await session.execute(query) + batch = result.scalars().first() + return BatchInfo(**batch.__dict__) + + @session_manager + async def get_urls_by_batch(self, session, batch_id: int, page: int = 1) -> List[URLInfo]: + """Retrieve all URLs associated with a batch.""" + query = Select(URL).where(URL.batch_id == batch_id).order_by(URL.id).limit(100).offset((page - 1) * 100) + result = await session.execute(query) + urls = result.scalars().all() + return ([URLInfo(**url.__dict__) for url in urls]) + + @session_manager + async def insert_url(self, session: AsyncSession, url_info: URLInfo) -> int: + """Insert a new URL into the database.""" + url_entry = URL( + batch_id=url_info.batch_id, + url=url_info.url, + collector_metadata=url_info.collector_metadata, + outcome=url_info.outcome.value + ) + session.add(url_entry) + await session.flush() + return url_entry.id + + @session_manager + async def get_url_info_by_url(self, session: AsyncSession, url: str) -> Optional[URLInfo]: + query = Select(URL).where(URL.url == url) + raw_result = await session.execute(query) + url = raw_result.scalars().first() + return URLInfo(**url.__dict__) + + @session_manager + async def insert_duplicates(self, session, duplicate_infos: list[DuplicateInsertInfo]): + for duplicate_info in duplicate_infos: + duplicate = Duplicate( + batch_id=duplicate_info.duplicate_batch_id, + original_url_id=duplicate_info.original_url_id, + ) + session.add(duplicate) + + @session_manager + async def insert_batch(self, session: AsyncSession, batch_info: BatchInfo) -> int: + """Insert a new batch into the database and return its ID.""" + batch = Batch( + strategy=batch_info.strategy, + user_id=batch_info.user_id, + status=batch_info.status.value, + parameters=batch_info.parameters, + total_url_count=batch_info.total_url_count, + original_url_count=batch_info.original_url_count, + duplicate_url_count=batch_info.duplicate_url_count, + compute_time=batch_info.compute_time, + strategy_success_rate=batch_info.strategy_success_rate, + metadata_success_rate=batch_info.metadata_success_rate, + agency_match_rate=batch_info.agency_match_rate, + record_type_match_rate=batch_info.record_type_match_rate, + record_category_match_rate=batch_info.record_category_match_rate, + ) + session.add(batch) + await session.flush() + return batch.id + + + async def insert_urls(self, url_infos: List[URLInfo], batch_id: int) -> InsertURLsInfo: + url_mappings = [] + duplicates = [] + for url_info in url_infos: + url_info.batch_id = batch_id + try: + url_id = await self.insert_url(url_info) + url_mappings.append(URLMapping(url_id=url_id, url=url_info.url)) + except IntegrityError: + orig_url_info = await self.get_url_info_by_url(url_info.url) + duplicate_info = DuplicateInsertInfo( + duplicate_batch_id=batch_id, + original_url_id=orig_url_info.id + ) + duplicates.append(duplicate_info) + await self.insert_duplicates(duplicates) + + return InsertURLsInfo( + url_mappings=url_mappings, + total_count=len(url_infos), + original_count=len(url_mappings), + duplicate_count=len(duplicates), + url_ids=[url_mapping.url_id for url_mapping in url_mappings] + ) + + @session_manager + async def update_batch_post_collection( + self, + session, + batch_id: int, + total_url_count: int, + original_url_count: int, + duplicate_url_count: int, + batch_status: BatchStatus, + compute_time: float = None, + ): + + query = Select(Batch).where(Batch.id == batch_id) + result = await session.execute(query) + batch = result.scalars().first() + + batch.total_url_count = total_url_count + batch.original_url_count = original_url_count + batch.duplicate_url_count = duplicate_url_count + batch.status = batch_status.value + batch.compute_time = compute_time diff --git a/collector_manager/AsyncCollectorBase.py b/collector_manager/AsyncCollectorBase.py new file mode 100644 index 00000000..672d9d9c --- /dev/null +++ b/collector_manager/AsyncCollectorBase.py @@ -0,0 +1,124 @@ +import abc +import asyncio +import time +from abc import ABC +from typing import Type, Optional + +from pydantic import BaseModel + +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo +from collector_db.DTOs.LogInfo import LogInfo +from collector_manager.enums import CollectorType +from core.CoreLogger import CoreLogger +from core.enums import BatchStatus +from core.preprocessors.PreprocessorBase import PreprocessorBase + + +class AsyncCollectorBase(ABC): + collector_type: CollectorType = None + preprocessor: Type[PreprocessorBase] = None + + + def __init__( + self, + batch_id: int, + dto: BaseModel, + logger: CoreLogger, + adb_client: AsyncDatabaseClient, + raise_error: bool = False + ) -> None: + self.batch_id = batch_id + self.adb_client = adb_client + self.dto = dto + self.data: Optional[BaseModel] = None + self.logger = logger + self.status = BatchStatus.IN_PROCESS + self.start_time = None + self.compute_time = None + self.raise_error = raise_error + + @abc.abstractmethod + async def run_implementation(self) -> None: + """ + This is the method that will be overridden by each collector + No other methods should be modified except for this one. + However, in each inherited class, new methods in addition to this one can be created + Returns: + + """ + raise NotImplementedError + + async def start_timer(self) -> None: + self.start_time = time.time() + + async def stop_timer(self) -> None: + self.compute_time = time.time() - self.start_time + + async def handle_error(self, e: Exception) -> None: + if self.raise_error: + raise e + await self.log(f"Error: {e}") + await self.adb_client.update_batch_post_collection( + batch_id=self.batch_id, + batch_status=self.status, + compute_time=self.compute_time, + total_url_count=0, + original_url_count=0, + duplicate_url_count=0 + ) + + async def process(self) -> None: + await self.log("Processing collector...", allow_abort=False) + preprocessor = self.preprocessor() + url_infos = preprocessor.preprocess(self.data) + await self.log(f"URLs processed: {len(url_infos)}", allow_abort=False) + + await self.log("Inserting URLs...", allow_abort=False) + insert_urls_info: InsertURLsInfo = await self.adb_client.insert_urls( + url_infos=url_infos, + batch_id=self.batch_id + ) + await self.log("Updating batch...", allow_abort=False) + await self.adb_client.update_batch_post_collection( + batch_id=self.batch_id, + total_url_count=insert_urls_info.total_count, + duplicate_url_count=insert_urls_info.duplicate_count, + original_url_count=insert_urls_info.original_count, + batch_status=self.status, + compute_time=self.compute_time + ) + await self.log("Done processing collector.", allow_abort=False) + + async def run(self) -> None: + try: + await self.start_timer() + await self.run_implementation() + await self.stop_timer() + await self.log("Collector completed successfully.") + await self.close() + await self.process() + except asyncio.CancelledError: + await self.stop_timer() + self.status = BatchStatus.ABORTED + await self.adb_client.update_batch_post_collection( + batch_id=self.batch_id, + batch_status=BatchStatus.ABORTED, + compute_time=self.compute_time, + total_url_count=0, + original_url_count=0, + duplicate_url_count=0 + ) + except Exception as e: + await self.stop_timer() + self.status = BatchStatus.ERROR + await self.handle_error(e) + + async def log(self, message: str, allow_abort = True) -> None: + self.logger.log(LogInfo( + batch_id=self.batch_id, + log=message + )) + + async def close(self) -> None: + self.status = BatchStatus.COMPLETE diff --git a/collector_manager/AsyncCollectorManager.py b/collector_manager/AsyncCollectorManager.py new file mode 100644 index 00000000..ecce57b6 --- /dev/null +++ b/collector_manager/AsyncCollectorManager.py @@ -0,0 +1,84 @@ +import asyncio +from http import HTTPStatus +from typing import Dict + +from fastapi import HTTPException +from pydantic import BaseModel + +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_manager.CollectorBase import CollectorBase +from collector_manager.CollectorManager import InvalidCollectorError +from collector_manager.collector_mapping import COLLECTOR_MAPPING +from collector_manager.enums import CollectorType +from core.CoreLogger import CoreLogger + + +class AsyncCollectorManager: + + def __init__( + self, + logger: CoreLogger, + adb_client: AsyncDatabaseClient, + dev_mode: bool = False + ): + self.collectors: Dict[int, CollectorBase] = {} + self.adb_client = adb_client + self.logger = logger + self.async_tasks: dict[int, asyncio.Task] = {} + self.dev_mode = dev_mode + + async def has_collector(self, cid: int) -> bool: + return cid in self.collectors + + async def start_async_collector( + self, + collector_type: CollectorType, + batch_id: int, + dto: BaseModel + ) -> None: + if batch_id in self.collectors: + raise ValueError(f"Collector with batch_id {batch_id} is already running.") + try: + collector_class = COLLECTOR_MAPPING[collector_type] + collector = collector_class( + batch_id=batch_id, + dto=dto, + logger=self.logger, + adb_client=self.adb_client, + raise_error=True if self.dev_mode else False + ) + except KeyError: + raise InvalidCollectorError(f"Collector {collector_type.value} not found.") + + self.collectors[batch_id] = collector + + task = asyncio.create_task(collector.run()) + self.async_tasks[batch_id] = task + + def try_getting_collector(self, cid): + collector = self.collectors.get(cid) + if collector is None: + raise InvalidCollectorError(f"Collector with CID {cid} not found.") + return collector + + async def abort_collector_async(self, cid: int) -> None: + task = self.async_tasks.get(cid) + if not task: + raise HTTPException(status_code=HTTPStatus.OK, detail="Task not found") + if task is not None: + task.cancel() + try: + await task # Await so cancellation propagates + except asyncio.CancelledError: + pass + + self.async_tasks.pop(cid) + + async def shutdown_all_collectors(self) -> None: + for cid, task in self.async_tasks.items(): + if task.done(): + try: + task.result() + except Exception as e: + raise e + await self.abort_collector_async(cid) \ No newline at end of file diff --git a/collector_manager/CollectorManager.py b/collector_manager/CollectorManager.py index 658b20a8..e37b47c5 100644 --- a/collector_manager/CollectorManager.py +++ b/collector_manager/CollectorManager.py @@ -3,12 +3,16 @@ Can start, stop, and get info on running collectors And manages the retrieval of collector info """ +import asyncio import threading from concurrent.futures import Future, ThreadPoolExecutor +from http import HTTPStatus from typing import Dict, List +from fastapi import HTTPException from pydantic import BaseModel +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DatabaseClient import DatabaseClient from collector_manager.CollectorBase import CollectorBase from collector_manager.collector_mapping import COLLECTOR_MAPPING @@ -38,12 +42,13 @@ def __init__( self.dev_mode = dev_mode self.executor = ThreadPoolExecutor(max_workers=self.max_workers) + async def has_collector(self, cid: int) -> bool: + return cid in self.collectors + + def restart_executor(self): self.executor = ThreadPoolExecutor(max_workers=self.max_workers) - def list_collectors(self) -> List[str]: - return [cm.value for cm in list(COLLECTOR_MAPPING.keys())] - def start_collector( self, collector_type: CollectorType, @@ -73,18 +78,6 @@ def start_collector( future = self.executor.submit(collector.run) self.futures[batch_id] = future - # thread = threading.Thread(target=collector.run) - # self.threads[batch_id] = thread - # thread.start() - - def get_info(self, cid: str) -> str: - collector = self.collectors.get(cid) - if not collector: - return f"Collector with CID {cid} not found." - logs = "\n".join(collector.logs[-3:]) # Show the last 3 logs - return f"{cid} ({collector.name}) - {collector.status}\nLogs:\n{logs}" - - def try_getting_collector(self, cid): collector = self.collectors.get(cid) if collector is None: @@ -93,6 +86,7 @@ def try_getting_collector(self, cid): def abort_collector(self, cid: int) -> None: collector = self.try_getting_collector(cid) + # Get collector thread thread = self.threads.get(cid) future = self.futures.get(cid) diff --git a/collector_manager/ExampleCollector.py b/collector_manager/ExampleCollector.py index c5c2a69c..2d54eced 100644 --- a/collector_manager/ExampleCollector.py +++ b/collector_manager/ExampleCollector.py @@ -3,27 +3,28 @@ Exists as a proof of concept for collector functionality """ +import asyncio import time -from collector_manager.CollectorBase import CollectorBase +from collector_manager.AsyncCollectorBase import AsyncCollectorBase from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.DTOs.ExampleOutputDTO import ExampleOutputDTO from collector_manager.enums import CollectorType from core.preprocessors.ExamplePreprocessor import ExamplePreprocessor -class ExampleCollector(CollectorBase): +class ExampleCollector(AsyncCollectorBase): collector_type = CollectorType.EXAMPLE preprocessor = ExamplePreprocessor - def run_implementation(self) -> None: + async def run_implementation(self) -> None: dto: ExampleInputDTO = self.dto sleep_time = dto.sleep_time for i in range(sleep_time): # Simulate a task - self.log(f"Step {i + 1}/{sleep_time}") - time.sleep(1) # Simulate work + await self.log(f"Step {i + 1}/{sleep_time}") + await asyncio.sleep(1) # Simulate work self.data = ExampleOutputDTO( message=f"Data collected by {self.batch_id}", urls=["https://example.com", "https://example.com/2"], parameters=self.dto.model_dump(), - ) + ) \ No newline at end of file diff --git a/collector_manager/constants.py b/collector_manager/constants.py new file mode 100644 index 00000000..444fad06 --- /dev/null +++ b/collector_manager/constants.py @@ -0,0 +1,14 @@ +from collector_manager.enums import CollectorType + +ASYNC_COLLECTORS = [ + CollectorType.AUTO_GOOGLER, + CollectorType.EXAMPLE +] + +SYNC_COLLECTORS = [ + CollectorType.MUCKROCK_SIMPLE_SEARCH, + CollectorType.MUCKROCK_COUNTY_SEARCH, + CollectorType.MUCKROCK_ALL_SEARCH, + CollectorType.CKAN, + CollectorType.COMMON_CRAWLER, +] \ No newline at end of file diff --git a/core/AsyncCore.py b/core/AsyncCore.py index d95efbfe..c7626111 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -1,18 +1,29 @@ import logging +from http import HTTPStatus +from http.client import HTTPException from typing import Optional +from pydantic import BaseModel from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_db.DTOs.BatchInfo import BatchInfo from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.enums import TaskType +from collector_manager.AsyncCollectorManager import AsyncCollectorManager +from collector_manager.CollectorManager import CollectorManager +from collector_manager.constants import ASYNC_COLLECTORS +from collector_manager.enums import CollectorType +from core.DTOs.CollectorStartInfo import CollectorStartInfo from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo from core.DTOs.GetTasksResponse import GetTasksResponse +from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo +from core.DTOs.MessageResponse import MessageResponse from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome from core.classes.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator from core.classes.TaskOperatorBase import TaskOperatorBase @@ -41,7 +52,8 @@ def __init__( huggingface_interface: HuggingFaceInterface, url_request_interface: URLRequestInterface, html_parser: HTMLResponseParser, - discord_poster: DiscordPoster + discord_poster: DiscordPoster, + collector_manager: AsyncCollectorManager ): self.adb_client = adb_client self.huggingface_interface = huggingface_interface @@ -51,11 +63,66 @@ def __init__( self.logger.addHandler(logging.StreamHandler()) self.logger.setLevel(logging.INFO) self.discord_poster = discord_poster + self.collector_manager = collector_manager async def get_urls(self, page: int, errors: bool) -> GetURLsResponseInfo: return await self.adb_client.get_urls(page=page, errors=errors) + async def shutdown(self): + await self.collector_manager.shutdown_all_collectors() + + #region Batch + async def get_batch_info(self, batch_id: int) -> BatchInfo: + return await self.adb_client.get_batch_by_id(batch_id) + + async def get_urls_by_batch(self, batch_id: int, page: int = 1) -> GetURLsByBatchResponse: + url_infos = await self.adb_client.get_urls_by_batch(batch_id, page) + return GetURLsByBatchResponse(urls=url_infos) + + async def abort_batch(self, batch_id: int) -> MessageResponse: + await self.collector_manager.abort_collector_async(cid=batch_id) + return MessageResponse(message=f"Batch aborted.") + + #endregion + + # region Collector + async def initiate_collector( + self, + collector_type: CollectorType, + user_id: int, + dto: Optional[BaseModel] = None, + ): + """ + Reserves a batch ID from the database + and starts the requisite collector + """ + if collector_type not in ASYNC_COLLECTORS: + raise HTTPException( + f"Collector type {collector_type} is not supported", + HTTPStatus.BAD_REQUEST + ) + + batch_info = BatchInfo( + strategy=collector_type.value, + status=BatchStatus.IN_PROCESS, + parameters=dto.model_dump(), + user_id=user_id + ) + + batch_id = await self.adb_client.insert_batch(batch_info) + await self.collector_manager.start_async_collector( + collector_type=collector_type, + batch_id=batch_id, + dto=dto + ) + return CollectorStartInfo( + batch_id=batch_id, + message=f"Started {collector_type.value} collector." + ) + + # endregion + #region Task Operators async def get_url_html_task_operator(self): diff --git a/core/SourceCollectorCore.py b/core/SourceCollectorCore.py index cf4ad3a3..585bcb52 100644 --- a/core/SourceCollectorCore.py +++ b/core/SourceCollectorCore.py @@ -21,27 +21,18 @@ class SourceCollectorCore: def __init__( self, core_logger: CoreLogger, + collector_manager: CollectorManager, db_client: DatabaseClient = DatabaseClient(), dev_mode: bool = False ): self.db_client = db_client self.core_logger = core_logger - self.collector_manager = CollectorManager( - logger=core_logger, - db_client=db_client - ) + self.collector_manager = collector_manager if not dev_mode: self.scheduled_task_manager = ScheduledTaskManager(db_client=db_client) else: self.scheduled_task_manager = None - def get_batch_info(self, batch_id: int) -> BatchInfo: - return self.db_client.get_batch_by_id(batch_id) - - def get_urls_by_batch(self, batch_id: int, page: int = 1) -> GetURLsByBatchResponse: - url_infos = self.db_client.get_urls_by_batch(batch_id, page) - return GetURLsByBatchResponse(urls=url_infos) - def get_duplicate_urls_by_batch(self, batch_id: int, page: int = 1) -> GetDuplicatesByBatchResponse: dup_infos = self.db_client.get_duplicates_by_batch_id(batch_id, page=page) return GetDuplicatesByBatchResponse(duplicates=dup_infos) diff --git a/requirements.txt b/requirements.txt index 48f86981..911e66fb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -requests~=2.31.0 +requests~=2.32.3 python-dotenv~=1.0.1 bs4~=0.0.2 tqdm>=4.64.1 @@ -9,7 +9,7 @@ psycopg2-binary~=2.9.6 pandas~=2.2.3 datasets~=2.19.1 # common_crawler only -huggingface-hub~=0.22.2 +huggingface-hub~=0.28.1 # html_tag_collector_only lxml~=5.1.0 @@ -19,13 +19,13 @@ beautifulsoup4>=4.12.3 from-root~=1.3.0 # Google Collector -google-api-python-client>=2.156.0 +google-api-python-client>=2.156.0 # TODO: Check for delete marshmallow~=3.23.2 sqlalchemy~=2.0.36 fastapi[standard]~=0.115.6 httpx~=0.28.1 -ckanapi~=4.8 +ckanapi~=4.8 # TODO: Check for delete psycopg[binary]~=3.1.20 APScheduler~=3.11.0 alembic~=1.14.0 @@ -46,4 +46,9 @@ PyJWT~=2.10.1 pytest-timeout~=2.3.1 openai~=1.60.1 -aiohttp~=3.11.11 \ No newline at end of file +aiohttp~=3.11.11 +uvicorn~=0.34.0 +pydantic~=2.10.6 +starlette~=0.45.3 +numpy~=1.26.4 +docker~=7.1.0 \ No newline at end of file diff --git a/source_collectors/auto_googler/AutoGoogler.py b/source_collectors/auto_googler/AutoGoogler.py index 937466be..368f75fb 100644 --- a/source_collectors/auto_googler/AutoGoogler.py +++ b/source_collectors/auto_googler/AutoGoogler.py @@ -1,3 +1,5 @@ +import asyncio + from source_collectors.auto_googler.DTOs import GoogleSearchQueryResultsInnerDTO from source_collectors.auto_googler.GoogleSearcher import GoogleSearcher from source_collectors.auto_googler.SearchConfig import SearchConfig @@ -16,14 +18,14 @@ def __init__(self, search_config: SearchConfig, google_searcher: GoogleSearcher) query : [] for query in search_config.queries } - def run(self) -> str: + async def run(self) -> str: """ Runs the AutoGoogler Yields status messages """ for query in self.search_config.queries: yield f"Searching for '{query}' ..." - results = self.google_searcher.search(query) + results = await self.google_searcher.search(query) yield f"Found {len(results)} results for '{query}'." if results is not None: self.data[query] = results diff --git a/source_collectors/auto_googler/AutoGooglerCollector.py b/source_collectors/auto_googler/AutoGooglerCollector.py index 189eaa11..b678f066 100644 --- a/source_collectors/auto_googler/AutoGooglerCollector.py +++ b/source_collectors/auto_googler/AutoGooglerCollector.py @@ -1,4 +1,6 @@ -from collector_manager.CollectorBase import CollectorBase +import asyncio + +from collector_manager.AsyncCollectorBase import AsyncCollectorBase from collector_manager.enums import CollectorType from core.preprocessors.AutoGooglerPreprocessor import AutoGooglerPreprocessor from source_collectors.auto_googler.AutoGoogler import AutoGoogler @@ -8,11 +10,11 @@ from util.helper_functions import get_from_env, base_model_list_dump -class AutoGooglerCollector(CollectorBase): +class AutoGooglerCollector(AsyncCollectorBase): collector_type = CollectorType.AUTO_GOOGLER preprocessor = AutoGooglerPreprocessor - def run_implementation(self) -> None: + async def run_to_completion(self) -> AutoGoogler: dto: AutoGooglerInputDTO = self.dto auto_googler = AutoGoogler( search_config=SearchConfig( @@ -24,8 +26,13 @@ def run_implementation(self) -> None: cse_id=get_from_env("GOOGLE_CSE_ID"), ) ) - for log in auto_googler.run(): + async for log in auto_googler.run(): self.log(log) + return auto_googler + + async def run_implementation(self) -> None: + + auto_googler = await self.run_to_completion() inner_data = [] for query in auto_googler.search_config.queries: diff --git a/source_collectors/auto_googler/GoogleSearcher.py b/source_collectors/auto_googler/GoogleSearcher.py index 7d599513..fe52ea45 100644 --- a/source_collectors/auto_googler/GoogleSearcher.py +++ b/source_collectors/auto_googler/GoogleSearcher.py @@ -1,5 +1,7 @@ +import asyncio from typing import Union +import aiohttp from googleapiclient.discovery import build from googleapiclient.errors import HttpError @@ -28,8 +30,7 @@ class GoogleSearcher: search results as dictionaries or None if the daily quota for the API has been exceeded. Raises a RuntimeError if any other error occurs during the search. """ - GOOGLE_SERVICE_NAME = "customsearch" - GOOGLE_SERVICE_VERSION = "v1" + GOOGLE_SEARCH_URL = "https://www.googleapis.com/customsearch/v1" def __init__( self, @@ -41,11 +42,7 @@ def __init__( self.api_key = api_key self.cse_id = cse_id - self.service = build(self.GOOGLE_SERVICE_NAME, - self.GOOGLE_SERVICE_VERSION, - developerKey=self.api_key) - - def search(self, query: str) -> Union[list[dict], None]: + async def search(self, query: str) -> Union[list[dict], None]: """ Searches for results using the specified query. @@ -56,7 +53,7 @@ def search(self, query: str) -> Union[list[dict], None]: If the daily quota is exceeded, None is returned. """ try: - return self.get_query_results(query) + return await self.get_query_results(query) # Process your results except HttpError as e: if "Quota exceeded" in str(e): @@ -64,11 +61,23 @@ def search(self, query: str) -> Union[list[dict], None]: else: raise RuntimeError(f"An error occurred: {str(e)}") - def get_query_results(self, query) -> list[GoogleSearchQueryResultsInnerDTO] or None: - results = self.service.cse().list(q=query, cx=self.cse_id).execute() + async def get_query_results(self, query) -> list[GoogleSearchQueryResultsInnerDTO] or None: + params = { + "key": self.api_key, + "cx": self.cse_id, + "q": query, + } + + async with aiohttp.ClientSession() as session: + async with session.get(self.GOOGLE_SEARCH_URL, params=params) as response: + response.raise_for_status() + results = await response.json() + if "items" not in results: return None + items = [] + for item in results["items"]: inner_dto = GoogleSearchQueryResultsInnerDTO( url=item["link"], diff --git a/source_collectors/ckan/CKANAPIInterface.py b/source_collectors/ckan/CKANAPIInterface.py index 551ed023..563d795d 100644 --- a/source_collectors/ckan/CKANAPIInterface.py +++ b/source_collectors/ckan/CKANAPIInterface.py @@ -1,13 +1,13 @@ +import asyncio from typing import Optional -from ckanapi import RemoteCKAN, NotFound +import aiohttp +from aiohttp import ContentTypeError class CKANAPIError(Exception): pass -# TODO: Maybe return Base Models? - class CKANAPIInterface: """ Interfaces with the CKAN API @@ -15,22 +15,47 @@ class CKANAPIInterface: def __init__(self, base_url: str): self.base_url = base_url - self.remote = RemoteCKAN(base_url, get_only=True) - - def package_search(self, query: str, rows: int, start: int, **kwargs): - return self.remote.action.package_search(q=query, rows=rows, start=start, **kwargs) - def get_organization(self, organization_id: str): + @staticmethod + def _serialize_params(params: dict) -> dict: + return { + k: str(v).lower() if isinstance(v, bool) else str(v) for k, v in params.items() + } + + async def _get(self, action: str, params: dict): + url = f"{self.base_url}/api/3/action/{action}" + serialized_params = self._serialize_params(params) + async with aiohttp.ClientSession() as session: + async with session.get(url, params=serialized_params) as response: + try: + data = await response.json() + if not data.get("success", False): + raise CKANAPIError(f"Request failed: {data}") + except ContentTypeError: + raise CKANAPIError(f"Request failed: {response.text()}") + return data["result"] + + async def package_search(self, query: str, rows: int, start: int, **kwargs): + return await self._get("package_search", { + "q": query, "rows": rows, "start": start, **kwargs + }) + + async def get_organization(self, organization_id: str): try: - return self.remote.action.organization_show(id=organization_id, include_datasets=True) - except NotFound as e: - raise CKANAPIError(f"Organization {organization_id} not found" - f" for url {self.base_url}. Original error: {e}") - - def get_group_package(self, group_package_id: str, limit: Optional[int]): + return await self._get("organization_show", { + "id": organization_id, "include_datasets": True + }) + except CKANAPIError as e: + raise CKANAPIError( + f"Organization {organization_id} not found for url {self.base_url}. {e}" + ) + + async def get_group_package(self, group_package_id: str, limit: Optional[int]): try: - return self.remote.action.group_package_show(id=group_package_id, limit=limit) - except NotFound as e: - raise CKANAPIError(f"Group Package {group_package_id} not found" - f" for url {self.base_url}. Original error: {e}") - + return await self._get("group_package_show", { + "id": group_package_id, "limit": limit + }) + except CKANAPIError as e: + raise CKANAPIError( + f"Group Package {group_package_id} not found for url {self.base_url}. {e}" + ) \ No newline at end of file diff --git a/source_collectors/ckan/CKANCollector.py b/source_collectors/ckan/CKANCollector.py index 24477aad..873a8593 100644 --- a/source_collectors/ckan/CKANCollector.py +++ b/source_collectors/ckan/CKANCollector.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from collector_manager.CollectorBase import CollectorBase +from collector_manager.AsyncCollectorBase import AsyncCollectorBase from collector_manager.enums import CollectorType from core.preprocessors.CKANPreprocessor import CKANPreprocessor from source_collectors.ckan.DTOs import CKANInputDTO @@ -16,30 +16,35 @@ "organization_search": ckan_package_search_from_organization } -class CKANCollector(CollectorBase): +class CKANCollector(AsyncCollectorBase): collector_type = CollectorType.CKAN preprocessor = CKANPreprocessor - def run_implementation(self): - results = self.get_results() + async def run_implementation(self): + results = await self.get_results() flat_list = get_flat_list(results) deduped_flat_list = deduplicate_entries(flat_list) - list_with_collection_child_packages = self.add_collection_child_packages(deduped_flat_list) + list_with_collection_child_packages = await self.add_collection_child_packages(deduped_flat_list) - filtered_results = list(filter(filter_result, list_with_collection_child_packages)) + filtered_results = list( + filter( + filter_result, + list_with_collection_child_packages + ) + ) parsed_results = list(map(parse_result, filtered_results)) self.data = {"results": parsed_results} - def add_collection_child_packages(self, deduped_flat_list): + async def add_collection_child_packages(self, deduped_flat_list): # TODO: Find a way to clearly indicate which parts call from the CKAN API list_with_collection_child_packages = [] count = len(deduped_flat_list) for idx, result in enumerate(deduped_flat_list): if "extras" in result.keys(): - self.log(f"Found collection ({idx + 1}/{count}): {result['id']}") - collections = get_collections(result) + await self.log(f"Found collection ({idx + 1}/{count}): {result['id']}") + collections = await get_collections(result) if collections: list_with_collection_child_packages += collections[0] continue @@ -47,16 +52,16 @@ def add_collection_child_packages(self, deduped_flat_list): list_with_collection_child_packages.append(result) return list_with_collection_child_packages - def get_results(self): + async def get_results(self): results = [] dto: CKANInputDTO = self.dto for search in SEARCH_FUNCTION_MAPPINGS.keys(): - self.log(f"Running search '{search}'...") + await self.log(f"Running search '{search}'...") sub_dtos: list[BaseModel] = getattr(dto, search) if sub_dtos is None: continue func = SEARCH_FUNCTION_MAPPINGS[search] - results = perform_search( + results = await perform_search( search_func=func, search_terms=base_model_list_dump(model_list=sub_dtos), results=results diff --git a/source_collectors/ckan/ckan_scraper_toolkit.py b/source_collectors/ckan/ckan_scraper_toolkit.py index 3d5c7296..641dec2a 100644 --- a/source_collectors/ckan/ckan_scraper_toolkit.py +++ b/source_collectors/ckan/ckan_scraper_toolkit.py @@ -1,16 +1,14 @@ """Toolkit of functions that use ckanapi to retrieve packages from CKAN data portals""" - +import asyncio import math import sys -import time -from concurrent.futures import as_completed, ThreadPoolExecutor from dataclasses import dataclass, field from datetime import datetime from typing import Any, Optional from urllib.parse import urljoin -import requests -from bs4 import BeautifulSoup +import aiohttp +from bs4 import BeautifulSoup, ResultSet, Tag from source_collectors.ckan.CKANAPIInterface import CKANAPIInterface @@ -46,7 +44,7 @@ def to_dict(self): } -def ckan_package_search( +async def ckan_package_search( base_url: str, query: Optional[str] = None, rows: Optional[int] = sys.maxsize, @@ -69,7 +67,7 @@ def ckan_package_search( while start < rows: num_rows = rows - start + offset - packages: dict = interface.package_search( + packages: dict = await interface.package_search( query=query, rows=num_rows, start=start, **kwargs ) add_base_url_to_packages(base_url, packages) @@ -94,7 +92,7 @@ def add_base_url_to_packages(base_url, packages): [package.update(base_url=base_url) for package in packages["results"]] -def ckan_package_search_from_organization( +async def ckan_package_search_from_organization( base_url: str, organization_id: str ) -> list[dict[str, Any]]: """Returns a list of CKAN packages from an organization. Only 10 packages are able to be returned. @@ -104,22 +102,22 @@ def ckan_package_search_from_organization( :return: List of dictionaries representing the packages associated with the organization. """ interface = CKANAPIInterface(base_url) - organization = interface.get_organization(organization_id) + organization = await interface.get_organization(organization_id) packages = organization["packages"] - results = search_for_results(base_url, packages) + results = await search_for_results(base_url, packages) return results -def search_for_results(base_url, packages): +async def search_for_results(base_url, packages): results = [] for package in packages: query = f"id:{package['id']}" - results += ckan_package_search(base_url=base_url, query=query) + results += await ckan_package_search(base_url=base_url, query=query) return results -def ckan_group_package_show( +async def ckan_group_package_show( base_url: str, id: str, limit: Optional[int] = sys.maxsize ) -> list[dict[str, Any]]: """Returns a list of CKAN packages from a group. @@ -130,13 +128,13 @@ def ckan_group_package_show( :return: List of dictionaries representing the packages associated with the group. """ interface = CKANAPIInterface(base_url) - results = interface.get_group_package(group_package_id=id, limit=limit) + results = await interface.get_group_package(group_package_id=id, limit=limit) # Add the base_url to each package [package.update(base_url=base_url) for package in results] return results -def ckan_collection_search(base_url: str, collection_id: str) -> list[Package]: +async def ckan_collection_search(base_url: str, collection_id: str) -> list[Package]: """Returns a list of CKAN packages from a collection. :param base_url: Base URL of the CKAN portal before the collection ID. e.g. "https://catalog.data.gov/dataset/" @@ -144,50 +142,36 @@ def ckan_collection_search(base_url: str, collection_id: str) -> list[Package]: :return: List of Package objects representing the packages associated with the collection. """ url = f"{base_url}?collection_package_id={collection_id}" - soup = _get_soup(url) + soup = await _get_soup(url) # Calculate the total number of pages of packages num_results = int(soup.find(class_="new-results").text.split()[0].replace(",", "")) pages = math.ceil(num_results / 20) - packages = get_packages(base_url, collection_id, pages) + packages = await get_packages(base_url, collection_id, pages) return packages -def get_packages(base_url, collection_id, pages): +async def get_packages(base_url, collection_id, pages): packages = [] for page in range(1, pages + 1): url = f"{base_url}?collection_package_id={collection_id}&page={page}" - soup = _get_soup(url) + soup = await _get_soup(url) - futures = get_futures(base_url, packages, soup) + packages = [] + for dataset_content in soup.find_all(class_="dataset-content"): + await asyncio.sleep(1) + package = await _collection_search_get_package_data(dataset_content, base_url) + packages.append(package) - # Take a break to avoid being timed out - if len(futures) >= 15: - time.sleep(10) return packages - -def get_futures(base_url: str, packages: list[Package], soup: BeautifulSoup) -> list[Any]: - """Returns a list of futures for the collection search.""" - with ThreadPoolExecutor(max_workers=10) as executor: - futures = [ - executor.submit( - _collection_search_get_package_data, dataset_content, base_url - ) - for dataset_content in soup.find_all(class_="dataset-content") - ] - - [packages.append(package.result()) for package in as_completed(futures)] - return futures - - -def _collection_search_get_package_data(dataset_content, base_url: str): +async def _collection_search_get_package_data(dataset_content, base_url: str): """Parses the dataset content and returns a Package object.""" package = Package() joined_url = urljoin(base_url, dataset_content.a.get("href")) - dataset_soup = _get_soup(joined_url) + dataset_soup = await _get_soup(joined_url) # Determine if the dataset url should be the linked page to an external site or the current site resources = get_resources(dataset_soup) button = get_button(resources) @@ -214,7 +198,9 @@ def get_data(dataset_soup): return dataset_soup.find(property="dct:modified").text.strip() -def get_button(resources): +def get_button(resources: ResultSet) -> Optional[Tag]: + if len(resources) == 0: + return None return resources[0].find(class_="btn-group") @@ -224,7 +210,12 @@ def get_resources(dataset_soup): ) -def set_url_and_data_portal_type(button, joined_url, package, resources): +def set_url_and_data_portal_type( + button: Optional[Tag], + joined_url: str, + package: Package, + resources: ResultSet +): if len(resources) == 1 and button is not None and button.a.text == "Visit page": package.url = button.a.get("href") else: @@ -255,8 +246,9 @@ def set_description(dataset_soup, package): package.description = dataset_soup.find(class_="notes").p.text -def _get_soup(url: str) -> BeautifulSoup: +async def _get_soup(url: str) -> BeautifulSoup: """Returns a BeautifulSoup object for the given URL.""" - time.sleep(1) - response = requests.get(url) - return BeautifulSoup(response.content, "lxml") + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + response.raise_for_status() + return BeautifulSoup(await response.text(), "lxml") diff --git a/source_collectors/ckan/main.py b/source_collectors/ckan/main.py index cc6f8da7..091d2642 100644 --- a/source_collectors/ckan/main.py +++ b/source_collectors/ckan/main.py @@ -6,24 +6,24 @@ -def main(): +async def main(): """ Main function. """ results = [] print("Gathering results...") - results = perform_search( + results = await perform_search( search_func=ckan_package_search, search_terms=package_search, results=results, ) - results = perform_search( + results = await perform_search( search_func=ckan_group_package_show, search_terms=group_search, results=results, ) - results = perform_search( + results = await perform_search( search_func=ckan_package_search_from_organization, search_terms=organization_search, results=results, diff --git a/source_collectors/ckan/scrape_ckan_data_portals.py b/source_collectors/ckan/scrape_ckan_data_portals.py index 9e0b2ff1..ad3d62e2 100644 --- a/source_collectors/ckan/scrape_ckan_data_portals.py +++ b/source_collectors/ckan/scrape_ckan_data_portals.py @@ -15,7 +15,7 @@ sys.path.insert(1, str(p)) -def perform_search( +async def perform_search( search_func: Callable, search_terms: list[dict[str, Any]], results: list[dict[str, Any]], @@ -34,14 +34,14 @@ def perform_search( for search in tqdm(search_terms): item_results = [] for item in search[key]: - item_result = search_func(search["url"], item) + item_result = await search_func(search["url"], item) item_results.append(item_result) results += item_results return results -def get_collection_child_packages( +async def get_collection_child_packages( results: list[dict[str, Any]] ) -> list[dict[str, Any]]: """Retrieves the child packages of each collection. @@ -53,7 +53,7 @@ def get_collection_child_packages( for result in tqdm(results): if "extras" in result.keys(): - collections = get_collections(result) + collections = await get_collections(result) if collections: new_list += collections[0] continue @@ -63,15 +63,17 @@ def get_collection_child_packages( return new_list -def get_collections(result): - collections = [ - ckan_collection_search( - base_url="https://catalog.data.gov/dataset/", - collection_id=result["id"], - ) - for extra in result["extras"] - if parent_package_has_no_resources(extra=extra, result=result) - ] +async def get_collections(result): + if "extras" not in result.keys(): + return [] + + collections = [] + for extra in result["extras"]: + if parent_package_has_no_resources(extra=extra, result=result): + collections.append(await ckan_collection_search( + base_url="https://catalog.data.gov/dataset/", + collection_id=result["id"], + )) return collections diff --git a/source_collectors/common_crawler/CommonCrawler.py b/source_collectors/common_crawler/CommonCrawler.py index 78d986cb..2bd2143c 100644 --- a/source_collectors/common_crawler/CommonCrawler.py +++ b/source_collectors/common_crawler/CommonCrawler.py @@ -1,64 +1,76 @@ +import asyncio import json import time from http import HTTPStatus +from typing import Union from urllib.parse import quote_plus -import requests +import aiohttp from source_collectors.common_crawler.utils import URLWithParameters - -def make_request(search_url: URLWithParameters) -> requests.Response: +async def async_make_request( + search_url: 'URLWithParameters' +) -> Union[aiohttp.ClientResponse, None]: """ - Makes the HTTP GET request to the given search URL. - Return the response if successful, None if rate-limited. + Makes the HTTP GET request to the given search URL using aiohttp. + Return the response if successful, None if rate-limited or failed. """ try: - response = requests.get(str(search_url)) - response.raise_for_status() - return response - except requests.exceptions.RequestException as e: - if ( - response.status_code == HTTPStatus.INTERNAL_SERVER_ERROR - and "SlowDown" in response.text - ): - return None - else: - print(f"Failed to get records: {e}") - return None - - -def process_response( - response: requests.Response, url: str, page: int -) -> list[str] or None: + async with aiohttp.ClientSession() as session: + async with session.get(str(search_url)) as response: + text = await response.text() + if ( + response.status == HTTPStatus.INTERNAL_SERVER_ERROR + and "SlowDown" in text + ): + return None + response.raise_for_status() + # simulate requests.Response interface for downstream compatibility + response.text_content = text # custom attribute for downstream use + response.status_code = response.status + return response + except aiohttp.ClientError as e: + print(f"Failed to get records: {e}") + return None + + +def make_request( + search_url: 'URLWithParameters' +) -> Union[aiohttp.ClientResponse, None]: + """Synchronous wrapper around the async function.""" + return asyncio.run(async_make_request(search_url)) + + +def process_response(response, url: str, page: int) -> Union[list[str], None]: """Processes the HTTP response and returns the parsed records if successful.""" + if response is None: + return None + if response.status_code == HTTPStatus.OK: - records = response.text.strip().split("\n") + records = response.text_content.strip().split("\n") print(f"Found {len(records)} records for {url} on page {page}") results = [] for record in records: d = json.loads(record) results.append(d["url"]) return results - if "First Page is 0, Last Page is 0" in response.text: + + if "First Page is 0, Last Page is 0" in response.text_content: print("No records exist in index matching the url search term") return None + print(f"Unexpected response: {response.status_code}") return None + def get_common_crawl_search_results( - search_url: URLWithParameters, + search_url: 'URLWithParameters', query_url: str, page: int -) -> list[str] or None: +) -> Union[list[str], None]: response = make_request(search_url) - processed_data = process_response( - response=response, - url=query_url, - page=page - ) - # TODO: POINT OF MOCK - return processed_data + return process_response(response, query_url, page) diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py b/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py index 72ce8336..466478c7 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py +++ b/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py @@ -1,7 +1,9 @@ import abc +import asyncio from abc import ABC import requests +import aiohttp from source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest @@ -12,30 +14,18 @@ class MuckrockNoMoreDataError(Exception): class MuckrockServerError(Exception): pass -def fetch_muckrock_data_from_url(url: str) -> dict | None: - response = requests.get(url) - try: - response.raise_for_status() - except requests.exceptions.HTTPError as e: - print(f"Failed to get records on request `{url}`: {e}") - # If code is 404, raise NoMoreData error - if e.response.status_code == 404: - raise MuckrockNoMoreDataError - if 500 <= e.response.status_code < 600: - raise MuckrockServerError - return None - - # TODO: POINT OF MOCK - data = response.json() - return data - class MuckrockFetcher(ABC): + async def get_async_request(self, url: str) -> dict | None: + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + response.raise_for_status() + return await response.json() + def fetch(self, request: FetchRequest) -> dict | None: url = self.build_url(request) - response = requests.get(url) try: - response.raise_for_status() + return asyncio.run(self.get_async_request(url)) except requests.exceptions.HTTPError as e: print(f"Failed to get records on request `{url}`: {e}") # If code is 404, raise NoMoreData error @@ -45,10 +35,6 @@ def fetch(self, request: FetchRequest) -> dict | None: raise MuckrockServerError return None - # TODO: POINT OF MOCK - data = response.json() - return data - @abc.abstractmethod def build_url(self, request: FetchRequest) -> str: pass diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py b/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py index 30024d36..7e5105d7 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py +++ b/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py @@ -1,5 +1,7 @@ +import asyncio from abc import ABC, abstractmethod +import aiohttp import requests from source_collectors.muckrock.classes.exceptions.RequestFailureException import RequestFailureException @@ -11,15 +13,18 @@ class MuckrockIterFetcherBase(ABC): def __init__(self, initial_request: FetchRequest): self.initial_request = initial_request + async def get_response_async(self, url) -> dict: + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + response.raise_for_status() + return await response.json() + def get_response(self, url) -> dict: - # TODO: POINT OF MOCK - response = requests.get(url) try: - response.raise_for_status() + return asyncio.run(self.get_response_async(url)) except requests.exceptions.HTTPError as e: print(f"Failed to get records on request `{url}`: {e}") raise RequestFailureException - return response.json() @abstractmethod def process_results(self, results: list[dict]): diff --git a/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py b/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py index c962e1e7..f2b2c098 100644 --- a/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py +++ b/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py @@ -10,6 +10,7 @@ def test_auto_googler_collector_lifecycle(test_core): + # TODO: Rework for Async ci = test_core db_client = api.dependencies.db_client diff --git a/tests/manual/source_collectors/test_ckan_collector.py b/tests/manual/source_collectors/test_ckan_collector.py index 0fbebfa4..53fb711d 100644 --- a/tests/manual/source_collectors/test_ckan_collector.py +++ b/tests/manual/source_collectors/test_ckan_collector.py @@ -1,7 +1,9 @@ -from unittest.mock import MagicMock +from unittest.mock import MagicMock, AsyncMock +import pytest from marshmallow import Schema, fields +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DatabaseClient import DatabaseClient from core.CoreLogger import CoreLogger from source_collectors.ckan.CKANCollector import CKANCollector @@ -18,8 +20,8 @@ class CKANSchema(Schema): data_portal_type = fields.String() source_last_updated = fields.String() - -def test_ckan_collector_default(): +@pytest.mark.asyncio +async def test_ckan_collector_default(): collector = CKANCollector( batch_id=1, dto=CKANInputDTO( @@ -30,15 +32,20 @@ def test_ckan_collector_default(): } ), logger=MagicMock(spec=CoreLogger), - db_client=MagicMock(spec=DatabaseClient), + adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) - collector.run() + await collector.run() schema = CKANSchema(many=True) schema.load(collector.data["results"]) + print(collector.data) def test_ckan_collector_custom(): + """ + Use this to test how CKAN behaves when using + something other than the default options provided + """ collector = CKANCollector( batch_id=1, dto=CKANInputDTO( diff --git a/tests/manual/source_collectors/test_common_crawler_collector.py b/tests/manual/source_collectors/test_common_crawler_collector.py index 9a7bc5d4..65ec778d 100644 --- a/tests/manual/source_collectors/test_common_crawler_collector.py +++ b/tests/manual/source_collectors/test_common_crawler_collector.py @@ -19,4 +19,5 @@ def test_common_crawler_collector(): db_client=MagicMock(spec=DatabaseClient) ) collector.run() + print(collector.data) CommonCrawlerSchema().load(collector.data) diff --git a/tests/test_automated/integration/api/conftest.py b/tests/test_automated/integration/api/conftest.py index 2065463e..c2e537b1 100644 --- a/tests/test_automated/integration/api/conftest.py +++ b/tests/test_automated/integration/api/conftest.py @@ -1,3 +1,4 @@ +import asyncio from dataclasses import dataclass from typing import Generator from unittest.mock import MagicMock @@ -39,6 +40,7 @@ def client(db_client_test, monkeypatch) -> Generator[TestClient, None, None]: yield c core.shutdown() + @pytest.fixture def api_test_helper(client: TestClient, db_data_creator, monkeypatch) -> APITestHelper: diff --git a/tests/test_automated/integration/api/test_batch.py b/tests/test_automated/integration/api/test_batch.py index 61c2a8b2..69c2fcab 100644 --- a/tests/test_automated/integration/api/test_batch.py +++ b/tests/test_automated/integration/api/test_batch.py @@ -1,3 +1,4 @@ +import asyncio import time from collector_db.DTOs.BatchInfo import BatchInfo diff --git a/tests/test_automated/integration/api/test_example_collector.py b/tests/test_automated/integration/api/test_example_collector.py index 2e7895d8..c31676b6 100644 --- a/tests/test_automated/integration/api/test_example_collector.py +++ b/tests/test_automated/integration/api/test_example_collector.py @@ -25,7 +25,9 @@ def test_example_collector(api_test_helper): assert batch_id is not None assert data["message"] == "Started example collector." - bsr: GetBatchStatusResponse = ath.request_validator.get_batch_statuses(status=BatchStatus.IN_PROCESS) + bsr: GetBatchStatusResponse = ath.request_validator.get_batch_statuses( + status=BatchStatus.IN_PROCESS + ) assert len(bsr.results) == 1 bsi: BatchStatusInfo = bsr.results[0] @@ -36,7 +38,10 @@ def test_example_collector(api_test_helper): time.sleep(2) - csr: GetBatchStatusResponse = ath.request_validator.get_batch_statuses(collector_type=CollectorType.EXAMPLE, status=BatchStatus.COMPLETE) + csr: GetBatchStatusResponse = ath.request_validator.get_batch_statuses( + collector_type=CollectorType.EXAMPLE, + status=BatchStatus.COMPLETE + ) assert len(csr.results) == 1 bsi: BatchStatusInfo = csr.results[0] @@ -57,7 +62,6 @@ def test_example_collector(api_test_helper): lr: GetBatchLogsResponse = ath.request_validator.get_batch_logs(batch_id=batch_id) - assert len(lr.logs) > 0 def test_example_collector_error(api_test_helper, monkeypatch): @@ -91,6 +95,8 @@ def test_example_collector_error(api_test_helper, monkeypatch): ath.core.core_logger.flush_all() + time.sleep(10) + gbl: GetBatchLogsResponse = ath.request_validator.get_batch_logs(batch_id=batch_id) assert gbl.logs[-1].log == "Error: Collector failed!" diff --git a/tests/test_automated/integration/conftest.py b/tests/test_automated/integration/conftest.py index 89e6b753..4377fd76 100644 --- a/tests/test_automated/integration/conftest.py +++ b/tests/test_automated/integration/conftest.py @@ -1,6 +1,11 @@ +from unittest.mock import MagicMock import pytest +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_manager.AsyncCollectorManager import AsyncCollectorManager +from collector_manager.CollectorManager import CollectorManager +from core.AsyncCore import AsyncCore from core.CoreLogger import CoreLogger from core.SourceCollectorCore import SourceCollectorCore @@ -12,9 +17,34 @@ def test_core(db_client_test): ) as logger: core = SourceCollectorCore( db_client=db_client_test, + collector_manager=CollectorManager( + db_client=db_client_test, + logger=logger + ), core_logger=logger, dev_mode=True ) yield core core.shutdown() + +@pytest.fixture +def test_async_core(db_client_test): + with CoreLogger( + db_client=db_client_test + ) as logger: + adb_client = AsyncDatabaseClient() + core = AsyncCore( + adb_client=adb_client, + huggingface_interface=MagicMock(), + url_request_interface=MagicMock(), + html_parser=MagicMock(), + discord_poster=MagicMock(), + collector_manager=AsyncCollectorManager( + adb_client=adb_client, + logger=logger, + dev_mode=True + ), + ) + yield core + core.shutdown() \ No newline at end of file diff --git a/tests/test_automated/integration/core/test_async_core.py b/tests/test_automated/integration/core/test_async_core.py index 4aa51b77..3fe10580 100644 --- a/tests/test_automated/integration/core/test_async_core.py +++ b/tests/test_automated/integration/core/test_async_core.py @@ -55,7 +55,8 @@ async def test_conclude_task_success(db_data_creator: DBDataCreator): huggingface_interface=MagicMock(), url_request_interface=MagicMock(), html_parser=MagicMock(), - discord_poster=MagicMock() + discord_poster=MagicMock(), + collector_manager=MagicMock() ) await core.conclude_task(run_info=run_info) @@ -83,7 +84,8 @@ async def test_conclude_task_error(db_data_creator: DBDataCreator): huggingface_interface=MagicMock(), url_request_interface=MagicMock(), html_parser=MagicMock(), - discord_poster=MagicMock() + discord_poster=MagicMock(), + collector_manager=MagicMock() ) await core.conclude_task(run_info=run_info) @@ -100,7 +102,8 @@ async def test_run_task_prereq_not_met(): huggingface_interface=AsyncMock(), url_request_interface=AsyncMock(), html_parser=AsyncMock(), - discord_poster=MagicMock() + discord_poster=MagicMock(), + collector_manager=MagicMock() ) mock_operator = AsyncMock() @@ -126,7 +129,8 @@ async def run_task(self, task_id: int) -> TaskOperatorRunInfo: huggingface_interface=AsyncMock(), url_request_interface=AsyncMock(), html_parser=AsyncMock(), - discord_poster=MagicMock() + discord_poster=MagicMock(), + collector_manager=MagicMock() ) core.conclude_task = AsyncMock() @@ -170,7 +174,8 @@ async def run_task(self, task_id: int) -> TaskOperatorRunInfo: huggingface_interface=AsyncMock(), url_request_interface=AsyncMock(), html_parser=AsyncMock(), - discord_poster=MagicMock() + discord_poster=MagicMock(), + collector_manager=MagicMock() ) core.conclude_task = AsyncMock() diff --git a/tests/test_automated/integration/core/test_example_collector_lifecycle.py b/tests/test_automated/integration/core/test_example_collector_lifecycle.py index 65b9cd6c..064a93a4 100644 --- a/tests/test_automated/integration/core/test_example_collector_lifecycle.py +++ b/tests/test_automated/integration/core/test_example_collector_lifecycle.py @@ -1,25 +1,33 @@ +import asyncio import time +import pytest + from collector_db.DTOs.BatchInfo import BatchInfo from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.enums import CollectorType, URLStatus +from core.AsyncCore import AsyncCore from core.DTOs.CollectorStartInfo import CollectorStartInfo from core.SourceCollectorCore import SourceCollectorCore from core.enums import BatchStatus - -def test_example_collector_lifecycle(test_core: SourceCollectorCore): +@pytest.mark.asyncio +async def test_example_collector_lifecycle( + test_core: SourceCollectorCore, + test_async_core: AsyncCore +): """ Test the flow of an example collector, which generates fake urls and saves them to the database """ + acore = test_async_core core = test_core db_client = core.db_client dto = ExampleInputDTO( example_field="example_value", sleep_time=1 ) - csi: CollectorStartInfo = core.initiate_collector( + csi: CollectorStartInfo = await acore.initiate_collector( collector_type=CollectorType.EXAMPLE, dto=dto, user_id=1 @@ -31,7 +39,7 @@ def test_example_collector_lifecycle(test_core: SourceCollectorCore): assert core.get_status(batch_id) == BatchStatus.IN_PROCESS print("Sleeping for 1.5 seconds...") - time.sleep(1.5) + await asyncio.sleep(1.5) print("Done sleeping...") assert core.get_status(batch_id) == BatchStatus.COMPLETE @@ -50,11 +58,16 @@ def test_example_collector_lifecycle(test_core: SourceCollectorCore): assert url_infos[0].url == "https://example.com" assert url_infos[1].url == "https://example.com/2" -def test_example_collector_lifecycle_multiple_batches(test_core: SourceCollectorCore): +@pytest.mark.asyncio +async def test_example_collector_lifecycle_multiple_batches( + test_core: SourceCollectorCore, + test_async_core: AsyncCore +): """ Test the flow of an example collector, which generates fake urls and saves them to the database """ + acore = test_async_core core = test_core csis: list[CollectorStartInfo] = [] for i in range(3): @@ -62,7 +75,7 @@ def test_example_collector_lifecycle_multiple_batches(test_core: SourceCollector example_field="example_value", sleep_time=1 ) - csi: CollectorStartInfo = core.initiate_collector( + csi: CollectorStartInfo = await acore.initiate_collector( collector_type=CollectorType.EXAMPLE, dto=dto, user_id=1 @@ -74,7 +87,7 @@ def test_example_collector_lifecycle_multiple_batches(test_core: SourceCollector print("Batch ID:", csi.batch_id) assert core.get_status(csi.batch_id) == BatchStatus.IN_PROCESS - time.sleep(6) + await asyncio.sleep(3) for csi in csis: assert core.get_status(csi.batch_id) == BatchStatus.COMPLETE diff --git a/tests/test_automated/integration/source_collectors/test_example_collector.py b/tests/test_automated/integration/source_collectors/test_example_collector.py index 0a6f9491..e69de29b 100644 --- a/tests/test_automated/integration/source_collectors/test_example_collector.py +++ b/tests/test_automated/integration/source_collectors/test_example_collector.py @@ -1,45 +0,0 @@ -import threading -import time - -from collector_db.DTOs.BatchInfo import BatchInfo -from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from collector_manager.ExampleCollector import ExampleCollector -from core.SourceCollectorCore import SourceCollectorCore -from core.enums import BatchStatus - - -def test_live_example_collector_abort(test_core: SourceCollectorCore): - core = test_core - db_client = core.db_client - - batch_id = db_client.insert_batch( - BatchInfo( - strategy="example", - status=BatchStatus.IN_PROCESS, - parameters={}, - user_id=1 - ) - ) - - - dto = ExampleInputDTO( - sleep_time=3 - ) - - collector = ExampleCollector( - batch_id=batch_id, - dto=dto, - logger=core.core_logger, - db_client=db_client, - raise_error=True - ) - # Run collector in separate thread - thread = threading.Thread(target=collector.run) - thread.start() - collector.abort() - time.sleep(2) - thread.join() - - - assert db_client.get_batch_status(batch_id) == BatchStatus.ABORTED - diff --git a/tests/test_automated/unit/collector_manager/test_collector_manager.py b/tests/test_automated/unit/collector_manager/test_collector_manager.py index 3a7b2fd9..e69de29b 100644 --- a/tests/test_automated/unit/collector_manager/test_collector_manager.py +++ b/tests/test_automated/unit/collector_manager/test_collector_manager.py @@ -1,154 +0,0 @@ -import threading -import time -from dataclasses import dataclass -from unittest.mock import Mock, MagicMock - -import pytest - -from collector_db.DatabaseClient import DatabaseClient -from collector_manager.CollectorManager import CollectorManager, InvalidCollectorError -from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from collector_manager.ExampleCollector import ExampleCollector -from collector_manager.enums import CollectorType -from core.CoreLogger import CoreLogger - - -@dataclass -class ExampleCollectorSetup: - type = CollectorType.EXAMPLE - dto = ExampleInputDTO( - example_field="example_value", sleep_time=1 - ) - manager = CollectorManager( - logger=Mock(spec=CoreLogger), - db_client=Mock(spec=DatabaseClient) - ) - - def start_collector(self, batch_id: int): - self.manager.start_collector(self.type, batch_id, self.dto) - - -@pytest.fixture -def ecs(): - ecs = ExampleCollectorSetup() - yield ecs - ecs.manager.shutdown_all_collectors() - - - -def test_start_collector(ecs: ExampleCollectorSetup): - manager = ecs.manager - - batch_id = 1 - ecs.start_collector(batch_id) - assert batch_id in manager.collectors, "Collector not added to manager." - future = manager.futures.get(batch_id) - assert future is not None, "Thread not started for collector." - # Check that future is running - assert future.running(), "Future is not running." - - - print("Test passed: Collector starts correctly.") - -def test_abort_collector(ecs: ExampleCollectorSetup): - batch_id = 2 - manager = ecs.manager - - ecs.start_collector(batch_id) - - # Try getting collector initially and succeed - collector = manager.try_getting_collector(batch_id) - assert collector is not None, "Collector not found after start." - - manager.abort_collector(batch_id) - - assert batch_id not in manager.collectors, "Collector not removed after closure." - assert batch_id not in manager.threads, "Thread not removed after closure." - - # Try getting collector after closure and fail - with pytest.raises(InvalidCollectorError) as e: - manager.try_getting_collector(batch_id) - - - -def test_invalid_collector(ecs: ExampleCollectorSetup): - invalid_batch_id = 999 - - with pytest.raises(InvalidCollectorError) as e: - ecs.manager.try_getting_collector(invalid_batch_id) - - -def test_concurrent_collectors(ecs: ExampleCollectorSetup): - manager = ecs.manager - - batch_ids = [1, 2, 3] - - threads = [] - for batch_id in batch_ids: - thread = threading.Thread(target=manager.start_collector, args=(ecs.type, batch_id, ecs.dto)) - threads.append(thread) - thread.start() - - for thread in threads: - thread.join() - - assert all(batch_id in manager.collectors for batch_id in batch_ids), "Not all collectors started." - assert all(manager.futures[batch_id].running() for batch_id in batch_ids), "Not all threads are running." - - print("Test passed: Concurrent collectors managed correctly.") - -def test_thread_safety(ecs: ExampleCollectorSetup): - import concurrent.futures - - manager = ecs.manager - - def start_and_close(batch_id): - ecs.start_collector(batch_id) - time.sleep(0.1) # Simulate some processing - manager.abort_collector(batch_id) - - batch_ids = [i for i in range(1, 6)] - - with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: - executor.map(start_and_close, batch_ids) - - assert not manager.collectors, "Some collectors were not cleaned up." - assert not manager.threads, "Some threads were not cleaned up." - - print("Test passed: Thread safety maintained under concurrent access.") - -def test_shutdown_all_collectors(ecs: ExampleCollectorSetup): - manager = ecs.manager - - batch_ids = [1, 2, 3] - - for batch_id in batch_ids: - ecs.start_collector(batch_id) - - manager.shutdown_all_collectors() - - assert not manager.collectors, "Not all collectors were removed." - assert not manager.threads, "Not all threads were cleaned up." - - print("Test passed: Shutdown cleans up all collectors and threads.") - - -def test_collector_manager_raises_exceptions(monkeypatch): - # Mock dependencies - logger = MagicMock() - db_client = MagicMock() - collector_manager = CollectorManager(logger=logger, db_client=db_client) - - dto = ExampleInputDTO(example_field="example_value", sleep_time=1) - - # Mock a collector type and DTO - batch_id = 1 - - # Patch the example collector run method to raise an exception - monkeypatch.setattr(ExampleCollector, 'run', MagicMock(side_effect=RuntimeError("Collector failed!"))) - - # Start the collector and expect an exception during shutdown - collector_manager.start_collector(CollectorType.EXAMPLE, batch_id, dto) - - with pytest.raises(RuntimeError, match="Collector failed!"): - collector_manager.shutdown_all_collectors() \ No newline at end of file diff --git a/tests/test_automated/unit/source_collectors/test_autogoogler_collector.py b/tests/test_automated/unit/source_collectors/test_autogoogler_collector.py index 673fcd42..050b1299 100644 --- a/tests/test_automated/unit/source_collectors/test_autogoogler_collector.py +++ b/tests/test_automated/unit/source_collectors/test_autogoogler_collector.py @@ -1,7 +1,8 @@ -from unittest.mock import MagicMock +from unittest.mock import AsyncMock import pytest +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLInfo import URLInfo from collector_db.DatabaseClient import DatabaseClient from core.CoreLogger import CoreLogger @@ -12,7 +13,7 @@ @pytest.fixture def patch_get_query_results(monkeypatch): patch_path = "source_collectors.auto_googler.GoogleSearcher.GoogleSearcher.get_query_results" - mock = MagicMock() + mock = AsyncMock() mock.side_effect = [ [GoogleSearchQueryResultsInnerDTO(url="https://include.com/1", title="keyword", snippet="snippet 1"),], None @@ -20,21 +21,22 @@ def patch_get_query_results(monkeypatch): monkeypatch.setattr(patch_path, mock) yield mock -def test_auto_googler_collector(patch_get_query_results): +@pytest.mark.asyncio +async def test_auto_googler_collector(patch_get_query_results): mock = patch_get_query_results collector = AutoGooglerCollector( batch_id=1, dto=AutoGooglerInputDTO( queries=["keyword"] ), - logger=MagicMock(spec=CoreLogger), - db_client=MagicMock(spec=DatabaseClient), + logger=AsyncMock(spec=CoreLogger), + adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) - collector.run() + await collector.run() mock.assert_called_once_with("keyword") - collector.db_client.insert_urls.assert_called_once_with( + collector.adb_client.insert_urls.assert_called_once_with( url_infos=[URLInfo(url="https://include.com/1", collector_metadata={"query": "keyword", "title": "keyword", "snippet": "snippet 1"})], batch_id=1 ) \ No newline at end of file diff --git a/tests/test_automated/unit/source_collectors/test_example_collector.py b/tests/test_automated/unit/source_collectors/test_example_collector.py index a0cf0c6f..17512a6f 100644 --- a/tests/test_automated/unit/source_collectors/test_example_collector.py +++ b/tests/test_automated/unit/source_collectors/test_example_collector.py @@ -13,7 +13,7 @@ def test_example_collector(): sleep_time=1 ), logger=MagicMock(spec=CoreLogger), - db_client=MagicMock(spec=DatabaseClient), + adb_client=MagicMock(spec=DatabaseClient), raise_error=True ) collector.run() \ No newline at end of file From cb3ed94b5413e089fbd1354512629a86b8dfabd1 Mon Sep 17 00:00:00 2001 From: maxachis Date: Sat, 12 Apr 2025 13:19:20 -0400 Subject: [PATCH 095/244] DRAFT --- api/main.py | 7 +- api/routes/batch.py | 5 +- api/routes/collector.py | 23 ++- collector_db/DatabaseClient.py | 84 ----------- collector_manager/AsyncCollectorManager.py | 4 +- collector_manager/CollectorBase.py | 139 ------------------ collector_manager/CollectorManager.py | 103 ------------- collector_manager/constants.py | 11 +- core/AsyncCore.py | 1 - core/SourceCollectorCore.py | 50 +------ .../common_crawler/CommonCrawler.py | 16 +- .../common_crawler/CommonCrawlerCollector.py | 12 +- .../muckrock/classes/FOIASearcher.py | 12 +- .../muckrock/classes/MuckrockCollector.py | 47 +++--- .../muckrock_fetchers/AgencyFetcher.py | 4 +- .../classes/muckrock_fetchers/FOIAFetcher.py | 4 +- .../JurisdictionByIDFetcher.py | 4 +- .../muckrock_fetchers/MuckrockFetcher.py | 4 +- .../MuckrockIterFetcherBase.py | 4 +- .../muckrock_fetchers/MuckrockLoopFetcher.py | 4 +- .../muckrock_fetchers/MuckrockNextFetcher.py | 4 +- .../generate_detailed_muckrock_csv.py | 8 +- tests/conftest.py | 8 + tests/helpers/DBDataCreator.py | 27 ++-- .../test_html_tag_collector_integration.py | 6 +- .../test_autogoogler_collector.py | 13 +- .../source_collectors/test_ckan_collector.py | 11 +- .../test_common_crawler_collector.py | 12 +- .../test_muckrock_collectors.py | 37 +++-- .../integration/api/test_example_collector.py | 2 +- .../collector_db/test_db_client.py | 9 +- tests/test_automated/integration/conftest.py | 5 - .../core/helpers/common_test_procedures.py | 27 ---- .../source_collectors/test_ckan_collector.py | 20 +-- .../test_collector_closes_properly.py | 71 --------- .../test_common_crawl_collector.py | 12 +- .../test_muckrock_collectors.py | 41 +++--- 37 files changed, 202 insertions(+), 649 deletions(-) delete mode 100644 collector_manager/CollectorBase.py delete mode 100644 tests/test_automated/integration/core/helpers/common_test_procedures.py delete mode 100644 tests/test_automated/unit/source_collectors/test_collector_closes_properly.py diff --git a/api/main.py b/api/main.py index a38ead34..37521822 100644 --- a/api/main.py +++ b/api/main.py @@ -14,7 +14,6 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DatabaseClient import DatabaseClient from collector_manager.AsyncCollectorManager import AsyncCollectorManager -from collector_manager.CollectorManager import CollectorManager from core.AsyncCore import AsyncCore from core.CoreLogger import CoreLogger from core.ScheduledTaskManager import AsyncScheduledTaskManager @@ -34,10 +33,6 @@ async def lifespan(app: FastAPI): adb_client = AsyncDatabaseClient() await setup_database(db_client) core_logger = CoreLogger(db_client=db_client) - collector_manager = CollectorManager( - logger=core_logger, - db_client=db_client, - ) async_collector_manager = AsyncCollectorManager( logger=core_logger, adb_client=adb_client, @@ -47,7 +42,6 @@ async def lifespan(app: FastAPI): db_client=db_client ), db_client=DatabaseClient(), - collector_manager=collector_manager ) async_core = AsyncCore( adb_client=adb_client, @@ -72,6 +66,7 @@ async def lifespan(app: FastAPI): yield # Code here runs before shutdown # Shutdown logic (if needed) + core_logger.shutdown() app.state.core.shutdown() # Clean up resources, close connections, etc. pass diff --git a/api/routes/batch.py b/api/routes/batch.py index 950b6931..23df2394 100644 --- a/api/routes/batch.py +++ b/api/routes/batch.py @@ -99,7 +99,4 @@ async def abort_batch( async_core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), ) -> MessageResponse: - try: - return core.abort_batch(batch_id) - except InvalidCollectorError as e: - return await async_core.abort_batch(batch_id) \ No newline at end of file + return await async_core.abort_batch(batch_id) \ No newline at end of file diff --git a/api/routes/collector.py b/api/routes/collector.py index 18c488b8..e2789443 100644 --- a/api/routes/collector.py +++ b/api/routes/collector.py @@ -1,12 +1,11 @@ from fastapi import APIRouter from fastapi.params import Depends -from api.dependencies import get_core, get_async_core +from api.dependencies import get_async_core from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.enums import CollectorType from core.AsyncCore import AsyncCore from core.DTOs.CollectorStartInfo import CollectorStartInfo -from core.SourceCollectorCore import SourceCollectorCore from security_manager.SecurityManager import AccessInfo, get_access_info from source_collectors.auto_googler.DTOs import AutoGooglerInputDTO from source_collectors.ckan.DTOs import CKANInputDTO @@ -38,13 +37,13 @@ async def start_example_collector( @collector_router.post("/ckan") async def start_ckan_collector( dto: CKANInputDTO, - core: SourceCollectorCore = Depends(get_core), + core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), ) -> CollectorStartInfo: """ Start the ckan collector """ - return core.initiate_collector( + return await core.initiate_collector( collector_type=CollectorType.CKAN, dto=dto, user_id=access_info.user_id @@ -53,13 +52,13 @@ async def start_ckan_collector( @collector_router.post("/common-crawler") async def start_common_crawler_collector( dto: CommonCrawlerInputDTO, - core: SourceCollectorCore = Depends(get_core), + core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), ) -> CollectorStartInfo: """ Start the common crawler collector """ - return core.initiate_collector( + return await core.initiate_collector( collector_type=CollectorType.COMMON_CRAWLER, dto=dto, user_id=access_info.user_id @@ -83,13 +82,13 @@ async def start_auto_googler_collector( @collector_router.post("/muckrock-simple") async def start_muckrock_collector( dto: MuckrockSimpleSearchCollectorInputDTO, - core: SourceCollectorCore = Depends(get_core), + core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), ) -> CollectorStartInfo: """ Start the muckrock collector """ - return core.initiate_collector( + return await core.initiate_collector( collector_type=CollectorType.MUCKROCK_SIMPLE_SEARCH, dto=dto, user_id=access_info.user_id @@ -98,13 +97,13 @@ async def start_muckrock_collector( @collector_router.post("/muckrock-county") async def start_muckrock_county_collector( dto: MuckrockCountySearchCollectorInputDTO, - core: SourceCollectorCore = Depends(get_core), + core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), ) -> CollectorStartInfo: """ Start the muckrock county level collector """ - return core.initiate_collector( + return await core.initiate_collector( collector_type=CollectorType.MUCKROCK_COUNTY_SEARCH, dto=dto, user_id=access_info.user_id @@ -113,13 +112,13 @@ async def start_muckrock_county_collector( @collector_router.post("/muckrock-all") async def start_muckrock_all_foia_collector( dto: MuckrockAllFOIARequestsCollectorInputDTO, - core: SourceCollectorCore = Depends(get_core), + core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), ) -> CollectorStartInfo: """ Start the muckrock collector for all FOIA requests """ - return core.initiate_collector( + return await core.initiate_collector( collector_type=CollectorType.MUCKROCK_ALL_SEARCH, dto=dto, user_id=access_info.user_id diff --git a/collector_db/DatabaseClient.py b/collector_db/DatabaseClient.py index 372cca8e..06107651 100644 --- a/collector_db/DatabaseClient.py +++ b/collector_db/DatabaseClient.py @@ -3,25 +3,19 @@ from typing import Optional, List from sqlalchemy import create_engine, Row -from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import sessionmaker, scoped_session, aliased from collector_db.ConfigManager import ConfigManager from collector_db.DTOs.BatchInfo import BatchInfo from collector_db.DTOs.DuplicateInfo import DuplicateInfo, DuplicateInsertInfo -from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_db.DTOs.LogInfo import LogInfo, LogOutputInfo from collector_db.DTOs.URLInfo import URLInfo -from collector_db.DTOs.URLMapping import URLMapping from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import Base, Batch, URL, Log, Duplicate from collector_manager.enums import CollectorType from core.enums import BatchStatus -# SQLAlchemy ORM models - - # Database Client class DatabaseClient: def __init__(self, db_url: str = get_postgres_connection_string()): @@ -79,54 +73,12 @@ def insert_batch(self, session, batch_info: BatchInfo) -> int: session.refresh(batch) return batch.id - @session_manager - def update_batch_post_collection( - self, - session, - batch_id: int, - total_url_count: int, - original_url_count: int, - duplicate_url_count: int, - batch_status: BatchStatus, - compute_time: float = None, - ): - batch = session.query(Batch).filter_by(id=batch_id).first() - batch.total_url_count = total_url_count - batch.original_url_count = original_url_count - batch.duplicate_url_count = duplicate_url_count - batch.status = batch_status.value - batch.compute_time = compute_time - @session_manager def get_batch_by_id(self, session, batch_id: int) -> Optional[BatchInfo]: """Retrieve a batch by ID.""" batch = session.query(Batch).filter_by(id=batch_id).first() return BatchInfo(**batch.__dict__) - def insert_urls(self, url_infos: List[URLInfo], batch_id: int) -> InsertURLsInfo: - url_mappings = [] - duplicates = [] - for url_info in url_infos: - url_info.batch_id = batch_id - try: - url_id = self.insert_url(url_info) - url_mappings.append(URLMapping(url_id=url_id, url=url_info.url)) - except IntegrityError: - orig_url_info = self.get_url_info_by_url(url_info.url) - duplicate_info = DuplicateInsertInfo( - duplicate_batch_id=batch_id, - original_url_id=orig_url_info.id - ) - duplicates.append(duplicate_info) - self.insert_duplicates(duplicates) - - return InsertURLsInfo( - url_mappings=url_mappings, - total_count=len(url_infos), - original_count=len(url_mappings), - duplicate_count=len(duplicates), - url_ids=[url_mapping.url_id for url_mapping in url_mappings] - ) @session_manager def insert_duplicates(self, session, duplicate_infos: list[DuplicateInsertInfo]): @@ -138,27 +90,6 @@ def insert_duplicates(self, session, duplicate_infos: list[DuplicateInsertInfo]) session.add(duplicate) - - @session_manager - def get_url_info_by_url(self, session, url: str) -> Optional[URLInfo]: - url = session.query(URL).filter_by(url=url).first() - return URLInfo(**url.__dict__) - - @session_manager - def insert_url(self, session, url_info: URLInfo) -> int: - """Insert a new URL into the database.""" - url_entry = URL( - batch_id=url_info.batch_id, - url=url_info.url, - collector_metadata=url_info.collector_metadata, - outcome=url_info.outcome.value - ) - session.add(url_entry) - session.commit() - session.refresh(url_entry) - return url_entry.id - - @session_manager def get_urls_by_batch(self, session, batch_id: int, page: int = 1) -> List[URLInfo]: """Retrieve all URLs associated with a batch.""" @@ -166,11 +97,6 @@ def get_urls_by_batch(self, session, batch_id: int, page: int = 1) -> List[URLIn .order_by(URL.id).limit(100).offset((page - 1) * 100).all()) return ([URLInfo(**url.__dict__) for url in urls]) - @session_manager - def is_duplicate_url(self, session, url: str) -> bool: - result = session.query(URL).filter_by(url=url).first() - return result is not None - @session_manager def insert_logs(self, session, log_infos: List[LogInfo]): for log_info in log_infos: @@ -189,16 +115,6 @@ def get_all_logs(self, session) -> List[LogInfo]: logs = session.query(Log).all() return ([LogInfo(**log.__dict__) for log in logs]) - @session_manager - def add_duplicate_info(self, session, duplicate_infos: list[DuplicateInfo]): - # TODO: Add test for this method when testing CollectorDatabaseProcessor - for duplicate_info in duplicate_infos: - duplicate = Duplicate( - batch_id=duplicate_info.original_batch_id, - original_url_id=duplicate_info.original_url_id, - ) - session.add(duplicate) - @session_manager def get_batch_status(self, session, batch_id: int) -> BatchStatus: batch = session.query(Batch).filter_by(id=batch_id).first() diff --git a/collector_manager/AsyncCollectorManager.py b/collector_manager/AsyncCollectorManager.py index ecce57b6..af875ddc 100644 --- a/collector_manager/AsyncCollectorManager.py +++ b/collector_manager/AsyncCollectorManager.py @@ -6,7 +6,7 @@ from pydantic import BaseModel from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_manager.CollectorBase import CollectorBase +from collector_manager.AsyncCollectorBase import AsyncCollectorBase from collector_manager.CollectorManager import InvalidCollectorError from collector_manager.collector_mapping import COLLECTOR_MAPPING from collector_manager.enums import CollectorType @@ -21,7 +21,7 @@ def __init__( adb_client: AsyncDatabaseClient, dev_mode: bool = False ): - self.collectors: Dict[int, CollectorBase] = {} + self.collectors: Dict[int, AsyncCollectorBase] = {} self.adb_client = adb_client self.logger = logger self.async_tasks: dict[int, asyncio.Task] = {} diff --git a/collector_manager/CollectorBase.py b/collector_manager/CollectorBase.py deleted file mode 100644 index 4fcb8f58..00000000 --- a/collector_manager/CollectorBase.py +++ /dev/null @@ -1,139 +0,0 @@ -""" -Base class for all collectors -""" -import abc -import threading -import time -from abc import ABC -from typing import Optional, Type - -from pydantic import BaseModel - -from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo -from collector_db.DTOs.LogInfo import LogInfo -from collector_db.DatabaseClient import DatabaseClient -from collector_manager.enums import CollectorType -from core.CoreLogger import CoreLogger -from core.enums import BatchStatus -from core.preprocessors.PreprocessorBase import PreprocessorBase - - -class CollectorAbortException(Exception): - pass - -class CollectorBase(ABC): - collector_type: CollectorType = None - preprocessor: Type[PreprocessorBase] = None - - def __init__( - self, - batch_id: int, - dto: BaseModel, - logger: CoreLogger, - db_client: DatabaseClient, - raise_error: bool = False, - ) -> None: - self.batch_id = batch_id - self.db_client = db_client - self.dto = dto - self.data: Optional[BaseModel] = None - self.logger = logger - self.status = BatchStatus.IN_PROCESS - self.start_time = None - self.compute_time = None - self.raise_error = raise_error - # # TODO: Determine how to update this in some of the other collectors - self._stop_event = threading.Event() - - @abc.abstractmethod - def run_implementation(self) -> None: - """ - This is the method that will be overridden by each collector - No other methods should be modified except for this one. - However, in each inherited class, new methods in addition to this one can be created - Returns: - - """ - raise NotImplementedError - - def start_timer(self) -> None: - self.start_time = time.time() - - def stop_timer(self) -> None: - self.compute_time = time.time() - self.start_time - - def handle_error(self, e: Exception) -> None: - if self.raise_error: - raise e - self.log(f"Error: {e}") - self.db_client.update_batch_post_collection( - batch_id=self.batch_id, - batch_status=self.status, - compute_time=self.compute_time, - total_url_count=0, - original_url_count=0, - duplicate_url_count=0 - ) - - def process(self) -> None: - self.log("Processing collector...", allow_abort=False) - preprocessor = self.preprocessor() - url_infos = preprocessor.preprocess(self.data) - self.log(f"URLs processed: {len(url_infos)}", allow_abort=False) - - self.log("Inserting URLs...", allow_abort=False) - insert_urls_info: InsertURLsInfo = self.db_client.insert_urls( - url_infos=url_infos, - batch_id=self.batch_id - ) - self.log("Updating batch...", allow_abort=False) - self.db_client.update_batch_post_collection( - batch_id=self.batch_id, - total_url_count=insert_urls_info.total_count, - duplicate_url_count=insert_urls_info.duplicate_count, - original_url_count=insert_urls_info.original_count, - batch_status=self.status, - compute_time=self.compute_time - ) - self.log("Done processing collector.", allow_abort=False) - - - def run(self) -> None: - try: - self.start_timer() - self.run_implementation() - self.stop_timer() - self.log("Collector completed successfully.") - self.close() - self.process() - except CollectorAbortException: - self.stop_timer() - self.status = BatchStatus.ABORTED - self.db_client.update_batch_post_collection( - batch_id=self.batch_id, - batch_status=BatchStatus.ABORTED, - compute_time=self.compute_time, - total_url_count=0, - original_url_count=0, - duplicate_url_count=0 - ) - except Exception as e: - self.stop_timer() - self.status = BatchStatus.ERROR - self.handle_error(e) - - def log(self, message: str, allow_abort = True) -> None: - if self._stop_event.is_set() and allow_abort: - raise CollectorAbortException - self.logger.log(LogInfo( - batch_id=self.batch_id, - log=message - )) - - def abort(self) -> None: - self._stop_event.set() # Signal the thread to stop - self.log("Collector was aborted.", allow_abort=False) - - def close(self) -> None: - self._stop_event.set() - self.status = BatchStatus.COMPLETE diff --git a/collector_manager/CollectorManager.py b/collector_manager/CollectorManager.py index e37b47c5..9fd5a428 100644 --- a/collector_manager/CollectorManager.py +++ b/collector_manager/CollectorManager.py @@ -3,109 +3,6 @@ Can start, stop, and get info on running collectors And manages the retrieval of collector info """ -import asyncio -import threading -from concurrent.futures import Future, ThreadPoolExecutor -from http import HTTPStatus -from typing import Dict, List - -from fastapi import HTTPException -from pydantic import BaseModel - -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DatabaseClient import DatabaseClient -from collector_manager.CollectorBase import CollectorBase -from collector_manager.collector_mapping import COLLECTOR_MAPPING -from collector_manager.enums import CollectorType -from core.CoreLogger import CoreLogger - class InvalidCollectorError(Exception): pass - -# Collector Manager Class -class CollectorManager: - def __init__( - self, - logger: CoreLogger, - db_client: DatabaseClient, - dev_mode: bool = False, - max_workers: int = 10 # Limit the number of concurrent threads - ): - self.collectors: Dict[int, CollectorBase] = {} - self.futures: Dict[int, Future] = {} - self.threads: Dict[int, threading.Thread] = {} - self.db_client = db_client - self.logger = logger - self.lock = threading.Lock() - self.max_workers = max_workers - self.dev_mode = dev_mode - self.executor = ThreadPoolExecutor(max_workers=self.max_workers) - - async def has_collector(self, cid: int) -> bool: - return cid in self.collectors - - - def restart_executor(self): - self.executor = ThreadPoolExecutor(max_workers=self.max_workers) - - def start_collector( - self, - collector_type: CollectorType, - batch_id: int, - dto: BaseModel - ) -> None: - with self.lock: - # If executor is shutdown, restart it - if self.executor._shutdown: - self.restart_executor() - - if batch_id in self.collectors: - raise ValueError(f"Collector with batch_id {batch_id} is already running.") - try: - collector_class = COLLECTOR_MAPPING[collector_type] - collector = collector_class( - batch_id=batch_id, - dto=dto, - logger=self.logger, - db_client=self.db_client, - raise_error=True if self.dev_mode else False - ) - except KeyError: - raise InvalidCollectorError(f"Collector {collector_type.value} not found.") - self.collectors[batch_id] = collector - - future = self.executor.submit(collector.run) - self.futures[batch_id] = future - - def try_getting_collector(self, cid): - collector = self.collectors.get(cid) - if collector is None: - raise InvalidCollectorError(f"Collector with CID {cid} not found.") - return collector - - def abort_collector(self, cid: int) -> None: - collector = self.try_getting_collector(cid) - - # Get collector thread - thread = self.threads.get(cid) - future = self.futures.get(cid) - collector.abort() - # thread.join(timeout=1) - self.collectors.pop(cid) - self.futures.pop(cid) - # self.threads.pop(cid) - - def shutdown_all_collectors(self) -> None: - with self.lock: - for cid, future in self.futures.items(): - if future.done(): - try: - future.result() - except Exception as e: - raise e - self.collectors[cid].abort() - - self.executor.shutdown(wait=True) - self.collectors.clear() - self.futures.clear() \ No newline at end of file diff --git a/collector_manager/constants.py b/collector_manager/constants.py index 444fad06..fde231d9 100644 --- a/collector_manager/constants.py +++ b/collector_manager/constants.py @@ -2,13 +2,10 @@ ASYNC_COLLECTORS = [ CollectorType.AUTO_GOOGLER, - CollectorType.EXAMPLE -] - -SYNC_COLLECTORS = [ + CollectorType.EXAMPLE, + CollectorType.CKAN, + CollectorType.COMMON_CRAWLER, CollectorType.MUCKROCK_SIMPLE_SEARCH, CollectorType.MUCKROCK_COUNTY_SEARCH, CollectorType.MUCKROCK_ALL_SEARCH, - CollectorType.CKAN, - CollectorType.COMMON_CRAWLER, -] \ No newline at end of file +] diff --git a/core/AsyncCore.py b/core/AsyncCore.py index c7626111..0b24e061 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -11,7 +11,6 @@ from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.enums import TaskType from collector_manager.AsyncCollectorManager import AsyncCollectorManager -from collector_manager.CollectorManager import CollectorManager from collector_manager.constants import ASYNC_COLLECTORS from collector_manager.enums import CollectorType from core.DTOs.CollectorStartInfo import CollectorStartInfo diff --git a/core/SourceCollectorCore.py b/core/SourceCollectorCore.py index 585bcb52..a0bb34fc 100644 --- a/core/SourceCollectorCore.py +++ b/core/SourceCollectorCore.py @@ -1,18 +1,12 @@ -from typing import Optional +from typing import Optional, Any -from pydantic import BaseModel -from collector_db.DTOs.BatchInfo import BatchInfo from collector_db.DatabaseClient import DatabaseClient -from collector_manager.CollectorManager import CollectorManager from collector_manager.enums import CollectorType from core.CoreLogger import CoreLogger -from core.DTOs.CollectorStartInfo import CollectorStartInfo from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse -from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse -from core.DTOs.MessageResponse import MessageResponse from core.ScheduledTaskManager import ScheduledTaskManager from core.enums import BatchStatus @@ -21,13 +15,12 @@ class SourceCollectorCore: def __init__( self, core_logger: CoreLogger, - collector_manager: CollectorManager, + collector_manager: Optional[Any] = None, db_client: DatabaseClient = DatabaseClient(), dev_mode: bool = False ): self.db_client = db_client self.core_logger = core_logger - self.collector_manager = collector_manager if not dev_mode: self.scheduled_task_manager = ScheduledTaskManager(db_client=db_client) else: @@ -53,50 +46,11 @@ def get_batch_statuses( def get_status(self, batch_id: int) -> BatchStatus: return self.db_client.get_batch_status(batch_id) - def initiate_collector( - self, - collector_type: CollectorType, - user_id: int, - dto: Optional[BaseModel] = None, - ): - """ - Reserves a batch ID from the database - and starts the requisite collector - """ - batch_info = BatchInfo( - strategy=collector_type.value, - status=BatchStatus.IN_PROCESS, - parameters=dto.model_dump(), - user_id=user_id - ) - batch_id = self.db_client.insert_batch(batch_info) - self.collector_manager.start_collector( - collector_type=collector_type, - batch_id=batch_id, - dto=dto - ) - return CollectorStartInfo( - batch_id=batch_id, - message=f"Started {collector_type.value} collector." - ) - def get_batch_logs(self, batch_id: int) -> GetBatchLogsResponse: logs = self.db_client.get_logs_by_batch_id(batch_id) return GetBatchLogsResponse(logs=logs) - def abort_batch(self, batch_id: int) -> MessageResponse: - self.collector_manager.abort_collector(cid=batch_id) - return MessageResponse(message=f"Batch aborted.") - - def restart(self): - self.collector_manager.shutdown_all_collectors() - self.collector_manager.restart_executor() - self.collector_manager.logger.restart() - - def shutdown(self): - self.collector_manager.shutdown_all_collectors() - self.collector_manager.logger.shutdown() if self.scheduled_task_manager is not None: self.scheduled_task_manager.shutdown() diff --git a/source_collectors/common_crawler/CommonCrawler.py b/source_collectors/common_crawler/CommonCrawler.py index 2bd2143c..db683611 100644 --- a/source_collectors/common_crawler/CommonCrawler.py +++ b/source_collectors/common_crawler/CommonCrawler.py @@ -35,11 +35,11 @@ async def async_make_request( return None -def make_request( +async def make_request( search_url: 'URLWithParameters' ) -> Union[aiohttp.ClientResponse, None]: """Synchronous wrapper around the async function.""" - return asyncio.run(async_make_request(search_url)) + return await async_make_request(search_url) def process_response(response, url: str, page: int) -> Union[list[str], None]: @@ -64,12 +64,12 @@ def process_response(response, url: str, page: int) -> Union[list[str], None]: return None -def get_common_crawl_search_results( +async def get_common_crawl_search_results( search_url: 'URLWithParameters', query_url: str, page: int ) -> Union[list[str], None]: - response = make_request(search_url) + response = await make_request(search_url) return process_response(response, query_url, page) @@ -100,10 +100,10 @@ def __init__( self.num_pages = num_pages self.url_results = None - def run(self): + async def run(self): url_results = [] for page in range(self.start_page, self.start_page + self.num_pages): - urls = self.search_common_crawl_index(query_url=self.url, page=page) + urls = await self.search_common_crawl_index(query_url=self.url, page=page) # If records were found, filter them and add to results if not urls: @@ -121,7 +121,7 @@ def run(self): self.url_results = url_results - def search_common_crawl_index( + async def search_common_crawl_index( self, query_url: str, page: int = 0, max_retries: int = 20 ) -> list[str] or None: """ @@ -144,7 +144,7 @@ def search_common_crawl_index( # put HTTP GET request in re-try loop in case of rate limiting. Once per second is nice enough per common crawl doc. while retries < max_retries: - results = get_common_crawl_search_results( + results = await get_common_crawl_search_results( search_url=search_url, query_url=query_url, page=page) if results is not None: return results diff --git a/source_collectors/common_crawler/CommonCrawlerCollector.py b/source_collectors/common_crawler/CommonCrawlerCollector.py index 71365680..eb28d545 100644 --- a/source_collectors/common_crawler/CommonCrawlerCollector.py +++ b/source_collectors/common_crawler/CommonCrawlerCollector.py @@ -1,15 +1,15 @@ -from collector_manager.CollectorBase import CollectorBase +from collector_manager.AsyncCollectorBase import AsyncCollectorBase from collector_manager.enums import CollectorType from core.preprocessors.CommonCrawlerPreprocessor import CommonCrawlerPreprocessor from source_collectors.common_crawler.CommonCrawler import CommonCrawler from source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO -class CommonCrawlerCollector(CollectorBase): +class CommonCrawlerCollector(AsyncCollectorBase): collector_type = CollectorType.COMMON_CRAWLER preprocessor = CommonCrawlerPreprocessor - def run_implementation(self) -> None: + async def run_implementation(self) -> None: print("Running Common Crawler...") dto: CommonCrawlerInputDTO = self.dto common_crawler = CommonCrawler( @@ -17,9 +17,9 @@ def run_implementation(self) -> None: url=dto.url, keyword=dto.search_term, start_page=dto.start_page, - num_pages=dto.total_pages + num_pages=dto.total_pages, ) - for status in common_crawler.run(): - self.log(status) + async for status in common_crawler.run(): + await self.log(status) self.data = {"urls": common_crawler.url_results} \ No newline at end of file diff --git a/source_collectors/muckrock/classes/FOIASearcher.py b/source_collectors/muckrock/classes/FOIASearcher.py index b4d3abaa..cb3af7e8 100644 --- a/source_collectors/muckrock/classes/FOIASearcher.py +++ b/source_collectors/muckrock/classes/FOIASearcher.py @@ -17,11 +17,11 @@ def __init__(self, fetcher: FOIAFetcher, search_term: Optional[str] = None): self.fetcher = fetcher self.search_term = search_term - def fetch_page(self) -> list[dict] | None: + async def fetch_page(self) -> list[dict] | None: """ Fetches the next page of results using the fetcher. """ - data = self.fetcher.fetch_next_page() + data = await self.fetcher.fetch_next_page() if data is None or data.get("results") is None: return None return data.get("results") @@ -43,7 +43,7 @@ def update_progress(self, pbar: tqdm, results: list[dict]) -> int: pbar.update(num_results) return num_results - def search_to_count(self, max_count: int) -> list[dict]: + async def search_to_count(self, max_count: int) -> list[dict]: """ Fetches and processes results up to a maximum count. """ @@ -52,7 +52,7 @@ def search_to_count(self, max_count: int) -> list[dict]: with tqdm(total=max_count, desc="Fetching results", unit="result") as pbar: while count > 0: try: - results = self.get_next_page_results() + results = await self.get_next_page_results() except SearchCompleteException: break @@ -61,11 +61,11 @@ def search_to_count(self, max_count: int) -> list[dict]: return all_results - def get_next_page_results(self) -> list[dict]: + async def get_next_page_results(self) -> list[dict]: """ Fetches and processes the next page of results. """ - results = self.fetch_page() + results = await self.fetch_page() if not results: raise SearchCompleteException return self.filter_results(results) diff --git a/source_collectors/muckrock/classes/MuckrockCollector.py b/source_collectors/muckrock/classes/MuckrockCollector.py index 8924b116..885c0369 100644 --- a/source_collectors/muckrock/classes/MuckrockCollector.py +++ b/source_collectors/muckrock/classes/MuckrockCollector.py @@ -1,6 +1,6 @@ import itertools -from collector_manager.CollectorBase import CollectorBase +from collector_manager.AsyncCollectorBase import AsyncCollectorBase from collector_manager.enums import CollectorType from core.preprocessors.MuckrockPreprocessor import MuckrockPreprocessor from source_collectors.muckrock.DTOs import MuckrockAllFOIARequestsCollectorInputDTO, \ @@ -15,7 +15,7 @@ from source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher import MuckrockNoMoreDataError -class MuckrockSimpleSearchCollector(CollectorBase): +class MuckrockSimpleSearchCollector(AsyncCollectorBase): """ Performs searches on MuckRock's database by matching a search string to title of request @@ -29,7 +29,7 @@ def check_for_count_break(self, count, max_count) -> None: if count >= max_count: raise SearchCompleteException - def run_implementation(self) -> None: + async def run_implementation(self) -> None: fetcher = FOIAFetcher() dto: MuckrockSimpleSearchCollectorInputDTO = self.dto searcher = FOIASearcher( @@ -41,7 +41,7 @@ def run_implementation(self) -> None: results_count = 0 for search_count in itertools.count(): try: - results = searcher.get_next_page_results() + results = await searcher.get_next_page_results() all_results.extend(results) results_count += len(results) self.check_for_count_break(results_count, max_count) @@ -64,19 +64,19 @@ def format_results(self, results: list[dict]) -> list[dict]: return formatted_results -class MuckrockCountyLevelSearchCollector(CollectorBase): +class MuckrockCountyLevelSearchCollector(AsyncCollectorBase): """ Searches for any and all requests in a certain county """ collector_type = CollectorType.MUCKROCK_COUNTY_SEARCH preprocessor = MuckrockPreprocessor - def run_implementation(self) -> None: - jurisdiction_ids = self.get_jurisdiction_ids() + async def run_implementation(self) -> None: + jurisdiction_ids = await self.get_jurisdiction_ids() if jurisdiction_ids is None: - self.log("No jurisdictions found") + await self.log("No jurisdictions found") return - all_data = self.get_foia_records(jurisdiction_ids) + all_data = await self.get_foia_records(jurisdiction_ids) formatted_data = self.format_data(all_data) self.data = {"urls": formatted_data} @@ -89,19 +89,17 @@ def format_data(self, all_data): }) return formatted_data - def get_foia_records(self, jurisdiction_ids): - # TODO: Mock results here and test separately + async def get_foia_records(self, jurisdiction_ids): all_data = [] for name, id_ in jurisdiction_ids.items(): - self.log(f"Fetching records for {name}...") + await self.log(f"Fetching records for {name}...") request = FOIALoopFetchRequest(jurisdiction=id_) fetcher = FOIALoopFetcher(request) - fetcher.loop_fetch() + await fetcher.loop_fetch() all_data.extend(fetcher.ffm.results) return all_data - def get_jurisdiction_ids(self): - # TODO: Mock results here and test separately + async def get_jurisdiction_ids(self): dto: MuckrockCountySearchCollectorInputDTO = self.dto parent_jurisdiction_id = dto.parent_jurisdiction_id request = JurisdictionLoopFetchRequest( @@ -110,40 +108,39 @@ def get_jurisdiction_ids(self): town_names=dto.town_names ) fetcher = JurisdictionGeneratorFetcher(initial_request=request) - for message in fetcher.generator_fetch(): - self.log(message) + async for message in fetcher.generator_fetch(): + await self.log(message) jurisdiction_ids = fetcher.jfm.jurisdictions return jurisdiction_ids -class MuckrockAllFOIARequestsCollector(CollectorBase): +class MuckrockAllFOIARequestsCollector(AsyncCollectorBase): """ Retrieves urls associated with all Muckrock FOIA requests """ collector_type = CollectorType.MUCKROCK_ALL_SEARCH preprocessor = MuckrockPreprocessor - def run_implementation(self) -> None: + async def run_implementation(self) -> None: dto: MuckrockAllFOIARequestsCollectorInputDTO = self.dto start_page = dto.start_page fetcher = FOIAFetcher( start_page=start_page, ) total_pages = dto.total_pages - all_page_data = self.get_page_data(fetcher, start_page, total_pages) + all_page_data = await self.get_page_data(fetcher, start_page, total_pages) all_transformed_data = self.transform_data(all_page_data) self.data = {"urls": all_transformed_data} - def get_page_data(self, fetcher, start_page, total_pages): - # TODO: Mock results here and test separately + async def get_page_data(self, fetcher, start_page, total_pages): all_page_data = [] for page in range(start_page, start_page + total_pages): - self.log(f"Fetching page {fetcher.current_page}") + await self.log(f"Fetching page {fetcher.current_page}") try: - page_data = fetcher.fetch_next_page() + page_data = await fetcher.fetch_next_page() except MuckrockNoMoreDataError: - self.log(f"No more data to fetch at page {fetcher.current_page}") + await self.log(f"No more data to fetch at page {fetcher.current_page}") break if page_data is None: continue diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/AgencyFetcher.py b/source_collectors/muckrock/classes/muckrock_fetchers/AgencyFetcher.py index d3e7364a..e73180df 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/AgencyFetcher.py +++ b/source_collectors/muckrock/classes/muckrock_fetchers/AgencyFetcher.py @@ -11,5 +11,5 @@ class AgencyFetcher(MuckrockFetcher): def build_url(self, request: AgencyFetchRequest) -> str: return f"{BASE_MUCKROCK_URL}/agency/{request.agency_id}/" - def get_agency(self, agency_id: int): - return self.fetch(AgencyFetchRequest(agency_id=agency_id)) \ No newline at end of file + async def get_agency(self, agency_id: int): + return await self.fetch(AgencyFetchRequest(agency_id=agency_id)) \ No newline at end of file diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetcher.py b/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetcher.py index 526698b7..3a057864 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetcher.py +++ b/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetcher.py @@ -30,12 +30,12 @@ def __init__(self, start_page: int = 1, per_page: int = 100): def build_url(self, request: FOIAFetchRequest) -> str: return f"{FOIA_BASE_URL}?page={request.page}&page_size={request.page_size}&format=json" - def fetch_next_page(self) -> dict | None: + async def fetch_next_page(self) -> dict | None: """ Fetches data from a specific page of the MuckRock FOIA API. """ page = self.current_page self.current_page += 1 request = FOIAFetchRequest(page=page, page_size=self.per_page) - return self.fetch(request) + return await self.fetch(request) diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionByIDFetcher.py b/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionByIDFetcher.py index c8c467a1..08db97dd 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionByIDFetcher.py +++ b/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionByIDFetcher.py @@ -11,5 +11,5 @@ class JurisdictionByIDFetcher(MuckrockFetcher): def build_url(self, request: JurisdictionByIDFetchRequest) -> str: return f"{BASE_MUCKROCK_URL}/jurisdiction/{request.jurisdiction_id}/" - def get_jurisdiction(self, jurisdiction_id: int) -> dict: - return self.fetch(request=JurisdictionByIDFetchRequest(jurisdiction_id=jurisdiction_id)) + async def get_jurisdiction(self, jurisdiction_id: int) -> dict: + return await self.fetch(request=JurisdictionByIDFetchRequest(jurisdiction_id=jurisdiction_id)) diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py b/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py index 466478c7..c1a6eecb 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py +++ b/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py @@ -22,10 +22,10 @@ async def get_async_request(self, url: str) -> dict | None: response.raise_for_status() return await response.json() - def fetch(self, request: FetchRequest) -> dict | None: + async def fetch(self, request: FetchRequest) -> dict | None: url = self.build_url(request) try: - return asyncio.run(self.get_async_request(url)) + return await self.get_async_request(url) except requests.exceptions.HTTPError as e: print(f"Failed to get records on request `{url}`: {e}") # If code is 404, raise NoMoreData error diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py b/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py index 7e5105d7..67253034 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py +++ b/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py @@ -19,9 +19,9 @@ async def get_response_async(self, url) -> dict: response.raise_for_status() return await response.json() - def get_response(self, url) -> dict: + async def get_response(self, url) -> dict: try: - return asyncio.run(self.get_response_async(url)) + return await self.get_response_async(url) except requests.exceptions.HTTPError as e: print(f"Failed to get records on request `{url}`: {e}") raise RequestFailureException diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockLoopFetcher.py b/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockLoopFetcher.py index 3558b7cd..2e4814a5 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockLoopFetcher.py +++ b/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockLoopFetcher.py @@ -7,11 +7,11 @@ class MuckrockLoopFetcher(MuckrockIterFetcherBase): - def loop_fetch(self): + async def loop_fetch(self): url = self.build_url(self.initial_request) while url is not None: try: - data = self.get_response(url) + data = await self.get_response(url) except RequestFailureException: break diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockNextFetcher.py b/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockNextFetcher.py index 7c5fd359..889e8446 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockNextFetcher.py +++ b/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockNextFetcher.py @@ -8,7 +8,7 @@ class MuckrockGeneratorFetcher(MuckrockIterFetcherBase): as a generator instead of a loop """ - def generator_fetch(self) -> str: + async def generator_fetch(self) -> str: """ Fetches data and yields status messages between requests """ @@ -16,7 +16,7 @@ def generator_fetch(self) -> str: final_message = "No more records found. Exiting..." while url is not None: try: - data = self.get_response(url) + data = await self.get_response(url) except RequestFailureException: final_message = "Request unexpectedly failed. Exiting..." break diff --git a/source_collectors/muckrock/generate_detailed_muckrock_csv.py b/source_collectors/muckrock/generate_detailed_muckrock_csv.py index 3cb884c0..94e0034f 100644 --- a/source_collectors/muckrock/generate_detailed_muckrock_csv.py +++ b/source_collectors/muckrock/generate_detailed_muckrock_csv.py @@ -67,22 +67,22 @@ def keys(self) -> list[str]: return list(self.model_dump().keys()) -def main(): +async def main(): json_filename = get_json_filename() json_data = load_json_file(json_filename) output_csv = format_filename_json_to_csv(json_filename) - agency_infos = get_agency_infos(json_data) + agency_infos = await get_agency_infos(json_data) write_to_csv(agency_infos, output_csv) -def get_agency_infos(json_data): +async def get_agency_infos(json_data): a_fetcher = AgencyFetcher() j_fetcher = JurisdictionByIDFetcher() agency_infos = [] # Iterate through the JSON data for item in json_data: print(f"Writing data for {item.get('title')}") - agency_data = a_fetcher.get_agency(agency_id=item.get("agency")) + agency_data = await a_fetcher.get_agency(agency_id=item.get("agency")) time.sleep(1) jurisdiction_data = j_fetcher.get_jurisdiction( jurisdiction_id=agency_data.get("jurisdiction") diff --git a/tests/conftest.py b/tests/conftest.py index 7cc4291c..fbe5dd50 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -4,6 +4,7 @@ from sqlalchemy import create_engine, inspect, MetaData from sqlalchemy.orm import scoped_session, sessionmaker +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DatabaseClient import DatabaseClient from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import Base @@ -63,6 +64,13 @@ def db_client_test(wipe_database) -> DatabaseClient: yield db_client db_client.engine.dispose() +@pytest.fixture +def adb_client_test(wipe_database) -> AsyncDatabaseClient: + conn = get_postgres_connection_string() + adb_client = AsyncDatabaseClient(db_url=conn) + yield adb_client + adb_client.engine.dispose() + @pytest.fixture def db_data_creator(db_client_test): db_data_creator = DBDataCreator(db_client=db_client_test) diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 9f9719a7..6964fb86 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -1,3 +1,4 @@ +import asyncio from random import randint from typing import List, Optional @@ -10,9 +11,8 @@ from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType from collector_db.DTOs.URLInfo import URLInfo -from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.DatabaseClient import DatabaseClient -from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource, TaskType +from collector_db.enums import TaskType from collector_manager.enums import CollectorType, URLStatus from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO @@ -190,10 +190,10 @@ def urls( ) ) - return self.db_client.insert_urls( + return asyncio.run(self.adb_client.insert_urls( url_infos=url_infos, batch_id=batch_id, - ) + )) async def url_miscellaneous_metadata( self, @@ -282,17 +282,24 @@ async def agency_auto_suggestions( if suggestion_type == SuggestionType.UNKNOWN: count = 1 # Can only be one auto suggestion if unknown - await self.adb_client.add_agency_auto_suggestions( - suggestions=[ - URLAgencySuggestionInfo( + suggestions = [] + for _ in range(count): + if suggestion_type == SuggestionType.UNKNOWN: + pdap_agency_id = None + else: + pdap_agency_id = await self.agency() + suggestion = URLAgencySuggestionInfo( url_id=url_id, suggestion_type=suggestion_type, - pdap_agency_id=None if suggestion_type == SuggestionType.UNKNOWN else await self.agency(), + pdap_agency_id=pdap_agency_id, state="Test State", county="Test County", locality="Test Locality" - ) for _ in range(count) - ] + ) + suggestions.append(suggestion) + + await self.adb_client.add_agency_auto_suggestions( + suggestions=suggestions ) async def agency_confirmed_suggestion( diff --git a/tests/manual/html_collector/test_html_tag_collector_integration.py b/tests/manual/html_collector/test_html_tag_collector_integration.py index 7018d5aa..8f1fc630 100644 --- a/tests/manual/html_collector/test_html_tag_collector_integration.py +++ b/tests/manual/html_collector/test_html_tag_collector_integration.py @@ -56,15 +56,15 @@ async def test_url_html_cycle( db_data_creator: DBDataCreator ): batch_id = db_data_creator.batch() - db_client = db_data_creator.db_client + adb_client: AsyncDatabaseClient = db_data_creator.adb_client url_infos = [] for url in URLS: url_infos.append(URLInfo(url=url)) - db_client.insert_urls(url_infos=url_infos, batch_id=batch_id) + await adb_client.insert_urls(url_infos=url_infos, batch_id=batch_id) operator = URLHTMLTaskOperator( - adb_client=AsyncDatabaseClient(), + adb_client=adb_client, url_request_interface=URLRequestInterface(), html_parser=HTMLResponseParser( root_url_cache=RootURLCache() diff --git a/tests/manual/source_collectors/test_autogoogler_collector.py b/tests/manual/source_collectors/test_autogoogler_collector.py index e2c2b8e1..78fc46d7 100644 --- a/tests/manual/source_collectors/test_autogoogler_collector.py +++ b/tests/manual/source_collectors/test_autogoogler_collector.py @@ -1,12 +1,15 @@ -from unittest.mock import MagicMock +from unittest.mock import MagicMock, AsyncMock +import pytest + +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DatabaseClient import DatabaseClient from core.CoreLogger import CoreLogger from source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector from source_collectors.auto_googler.DTOs import AutoGooglerInputDTO - -def test_autogoogler_collector(): +@pytest.mark.asyncio +async def test_autogoogler_collector(): collector = AutoGooglerCollector( batch_id=1, dto=AutoGooglerInputDTO( @@ -14,8 +17,8 @@ def test_autogoogler_collector(): queries=["police"], ), logger = MagicMock(spec=CoreLogger), - db_client=MagicMock(spec=DatabaseClient), + adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) - collector.run() + await collector.run() print(collector.data) \ No newline at end of file diff --git a/tests/manual/source_collectors/test_ckan_collector.py b/tests/manual/source_collectors/test_ckan_collector.py index 53fb711d..3bae5d88 100644 --- a/tests/manual/source_collectors/test_ckan_collector.py +++ b/tests/manual/source_collectors/test_ckan_collector.py @@ -34,14 +34,15 @@ async def test_ckan_collector_default(): logger=MagicMock(spec=CoreLogger), adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True - ) await collector.run() schema = CKANSchema(many=True) schema.load(collector.data["results"]) - print(collector.data) + print("Printing results") + print(collector.data["results"]) -def test_ckan_collector_custom(): +@pytest.mark.asyncio +async def test_ckan_collector_custom(): """ Use this to test how CKAN behaves when using something other than the default options provided @@ -80,9 +81,9 @@ def test_ckan_collector_custom(): } ), logger=MagicMock(spec=CoreLogger), - db_client=MagicMock(spec=DatabaseClient), + adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) - collector.run() + await collector.run() schema = CKANSchema(many=True) schema.load(collector.data["results"]) \ No newline at end of file diff --git a/tests/manual/source_collectors/test_common_crawler_collector.py b/tests/manual/source_collectors/test_common_crawler_collector.py index 65ec778d..6c9771f3 100644 --- a/tests/manual/source_collectors/test_common_crawler_collector.py +++ b/tests/manual/source_collectors/test_common_crawler_collector.py @@ -1,7 +1,9 @@ -from unittest.mock import MagicMock +from unittest.mock import MagicMock, AsyncMock +import pytest from marshmallow import Schema, fields +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DatabaseClient import DatabaseClient from core.CoreLogger import CoreLogger from source_collectors.common_crawler.CommonCrawlerCollector import CommonCrawlerCollector @@ -11,13 +13,15 @@ class CommonCrawlerSchema(Schema): urls = fields.List(fields.String()) -def test_common_crawler_collector(): +@pytest.mark.asyncio +async def test_common_crawler_collector(): collector = CommonCrawlerCollector( batch_id=1, dto=CommonCrawlerInputDTO(), logger=MagicMock(spec=CoreLogger), - db_client=MagicMock(spec=DatabaseClient) + adb_client=AsyncMock(spec=AsyncDatabaseClient), + raise_error=True ) - collector.run() + await collector.run() print(collector.data) CommonCrawlerSchema().load(collector.data) diff --git a/tests/manual/source_collectors/test_muckrock_collectors.py b/tests/manual/source_collectors/test_muckrock_collectors.py index 4689dbab..8fb80bc4 100644 --- a/tests/manual/source_collectors/test_muckrock_collectors.py +++ b/tests/manual/source_collectors/test_muckrock_collectors.py @@ -1,16 +1,20 @@ -from unittest.mock import MagicMock +from unittest.mock import MagicMock, AsyncMock -from collector_db.DatabaseClient import DatabaseClient +import pytest + +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from core.CoreLogger import CoreLogger from source_collectors.muckrock.DTOs import MuckrockSimpleSearchCollectorInputDTO, \ MuckrockCountySearchCollectorInputDTO, MuckrockAllFOIARequestsCollectorInputDTO from source_collectors.muckrock.classes.MuckrockCollector import MuckrockSimpleSearchCollector, \ MuckrockCountyLevelSearchCollector, MuckrockAllFOIARequestsCollector from source_collectors.muckrock.schemas import MuckrockURLInfoSchema -from test_automated.integration.core.helpers.constants import ALLEGHENY_COUNTY_MUCKROCK_ID, ALLEGHENY_COUNTY_TOWN_NAMES +from tests.test_automated.integration.core.helpers.constants import ALLEGHENY_COUNTY_MUCKROCK_ID, \ + ALLEGHENY_COUNTY_TOWN_NAMES -def test_muckrock_simple_search_collector(): +@pytest.mark.asyncio +async def test_muckrock_simple_search_collector(): collector = MuckrockSimpleSearchCollector( batch_id=1, @@ -19,16 +23,18 @@ def test_muckrock_simple_search_collector(): max_results=10 ), logger=MagicMock(spec=CoreLogger), - db_client=MagicMock(spec=DatabaseClient), + adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) - collector.run() + await collector.run() schema = MuckrockURLInfoSchema(many=True) schema.load(collector.data["urls"]) assert len(collector.data["urls"]) >= 10 + print(collector.data) -def test_muckrock_county_level_search_collector(): +@pytest.mark.asyncio +async def test_muckrock_county_level_search_collector(): collector = MuckrockCountyLevelSearchCollector( batch_id=1, dto=MuckrockCountySearchCollectorInputDTO( @@ -36,16 +42,19 @@ def test_muckrock_county_level_search_collector(): town_names=ALLEGHENY_COUNTY_TOWN_NAMES ), logger=MagicMock(spec=CoreLogger), - db_client=MagicMock(spec=DatabaseClient) + adb_client=AsyncMock(spec=AsyncDatabaseClient), + raise_error=True ) - collector.run() + await collector.run() schema = MuckrockURLInfoSchema(many=True) schema.load(collector.data["urls"]) assert len(collector.data["urls"]) >= 10 + print(collector.data) -def test_muckrock_full_search_collector(): +@pytest.mark.asyncio +async def test_muckrock_full_search_collector(): collector = MuckrockAllFOIARequestsCollector( batch_id=1, dto=MuckrockAllFOIARequestsCollectorInputDTO( @@ -53,9 +62,11 @@ def test_muckrock_full_search_collector(): total_pages=2 ), logger=MagicMock(spec=CoreLogger), - db_client=MagicMock(spec=DatabaseClient) + adb_client=AsyncMock(spec=AsyncDatabaseClient), + raise_error=True ) - collector.run() + await collector.run() assert len(collector.data["urls"]) >= 1 schema = MuckrockURLInfoSchema(many=True) - schema.load(collector.data["urls"]) \ No newline at end of file + schema.load(collector.data["urls"]) + print(collector.data) \ No newline at end of file diff --git a/tests/test_automated/integration/api/test_example_collector.py b/tests/test_automated/integration/api/test_example_collector.py index c31676b6..81207a28 100644 --- a/tests/test_automated/integration/api/test_example_collector.py +++ b/tests/test_automated/integration/api/test_example_collector.py @@ -58,7 +58,7 @@ def test_example_collector(api_test_helper): assert bi.user_id is not None # Flush early to ensure logs are written - ath.core.collector_manager.logger.flush_all() + ath.core.core_logger.flush_all() lr: GetBatchLogsResponse = ath.request_validator.get_batch_logs(batch_id=batch_id) diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 6090aaf1..c78bf57e 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -18,8 +18,11 @@ from tests.helpers.DBDataCreator import DBDataCreator from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review - -def test_insert_urls(db_client_test): +@pytest.mark.asyncio +async def test_insert_urls( + db_client_test, + adb_client_test +): # Insert batch batch_info = BatchInfo( strategy="ckan", @@ -43,7 +46,7 @@ def test_insert_urls(db_client_test): collector_metadata={"name": "example_duplicate"}, ) ] - insert_urls_info = db_client_test.insert_urls( + insert_urls_info = await adb_client_test.insert_urls( url_infos=urls, batch_id=batch_id ) diff --git a/tests/test_automated/integration/conftest.py b/tests/test_automated/integration/conftest.py index 4377fd76..8ffdc266 100644 --- a/tests/test_automated/integration/conftest.py +++ b/tests/test_automated/integration/conftest.py @@ -4,7 +4,6 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_manager.AsyncCollectorManager import AsyncCollectorManager -from collector_manager.CollectorManager import CollectorManager from core.AsyncCore import AsyncCore from core.CoreLogger import CoreLogger from core.SourceCollectorCore import SourceCollectorCore @@ -17,10 +16,6 @@ def test_core(db_client_test): ) as logger: core = SourceCollectorCore( db_client=db_client_test, - collector_manager=CollectorManager( - db_client=db_client_test, - logger=logger - ), core_logger=logger, dev_mode=True ) diff --git a/tests/test_automated/integration/core/helpers/common_test_procedures.py b/tests/test_automated/integration/core/helpers/common_test_procedures.py deleted file mode 100644 index d60c59d2..00000000 --- a/tests/test_automated/integration/core/helpers/common_test_procedures.py +++ /dev/null @@ -1,27 +0,0 @@ -import time - -from pydantic import BaseModel - -from collector_manager.enums import CollectorType -from core.SourceCollectorCore import SourceCollectorCore - - -def run_collector_and_wait_for_completion( - collector_type: CollectorType, - core: SourceCollectorCore, - dto: BaseModel -): - collector_name = collector_type.value - response = core.initiate_collector( - collector_type=collector_type, - dto=dto - ) - assert response == f"Started {collector_name} collector with CID: 1" - response = core.get_status(1) - while response == f"1 ({collector_name}) - RUNNING": - time.sleep(1) - response = core.get_status(1) - assert response == f"1 ({collector_name}) - COMPLETED", response - # TODO: Change this logic, since collectors close automatically - response = core.close_collector(1) - assert response.message == "Collector closed and data harvested successfully." diff --git a/tests/test_automated/unit/source_collectors/test_ckan_collector.py b/tests/test_automated/unit/source_collectors/test_ckan_collector.py index 21f469dc..b00ed434 100644 --- a/tests/test_automated/unit/source_collectors/test_ckan_collector.py +++ b/tests/test_automated/unit/source_collectors/test_ckan_collector.py @@ -1,9 +1,10 @@ import json import pickle -from unittest.mock import MagicMock +from unittest.mock import MagicMock, AsyncMock import pytest +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DatabaseClient import DatabaseClient from core.CoreLogger import CoreLogger from source_collectors.ckan.CKANCollector import CKANCollector @@ -12,13 +13,13 @@ @pytest.fixture def mock_ckan_collector_methods(monkeypatch): - mock = MagicMock() + mock = AsyncMock() mock_path = "source_collectors.ckan.CKANCollector.CKANCollector.get_results" with open("tests/test_data/ckan_get_result_test_data.json", "r", encoding="utf-8") as f: data = json.load(f) - mock.get_results = MagicMock() + mock.get_results = AsyncMock() mock.get_results.return_value = data monkeypatch.setattr(mock_path, mock.get_results) @@ -26,7 +27,7 @@ def mock_ckan_collector_methods(monkeypatch): with open("tests/test_data/ckan_add_collection_child_packages.pkl", "rb") as f: data = pickle.load(f) - mock.add_collection_child_packages = MagicMock() + mock.add_collection_child_packages = AsyncMock() mock.add_collection_child_packages.return_value = data monkeypatch.setattr(mock_path, mock.add_collection_child_packages) @@ -34,23 +35,24 @@ def mock_ckan_collector_methods(monkeypatch): yield mock -def test_ckan_collector(mock_ckan_collector_methods): +@pytest.mark.asyncio +async def test_ckan_collector(mock_ckan_collector_methods): mock = mock_ckan_collector_methods collector = CKANCollector( batch_id=1, dto=CKANInputDTO(), logger=MagicMock(spec=CoreLogger), - db_client=MagicMock(spec=DatabaseClient), + adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) - collector.run() + await collector.run() mock.get_results.assert_called_once() mock.add_collection_child_packages.assert_called_once() - collector.db_client.insert_urls.assert_called_once() - url_infos = collector.db_client.insert_urls.call_args[1]['url_infos'] + collector.adb_client.insert_urls.assert_called_once() + url_infos = collector.adb_client.insert_urls.call_args[1]['url_infos'] assert len(url_infos) == 2560 first_url_info = url_infos[0] assert first_url_info.url == 'https://catalog.data.gov/dataset/crash-reporting-drivers-data' diff --git a/tests/test_automated/unit/source_collectors/test_collector_closes_properly.py b/tests/test_automated/unit/source_collectors/test_collector_closes_properly.py deleted file mode 100644 index 386120a8..00000000 --- a/tests/test_automated/unit/source_collectors/test_collector_closes_properly.py +++ /dev/null @@ -1,71 +0,0 @@ -import threading -import time -from unittest.mock import Mock, MagicMock - -from collector_db.DTOs.LogInfo import LogInfo -from collector_db.DatabaseClient import DatabaseClient -from collector_manager.CollectorBase import CollectorBase -from collector_manager.enums import CollectorType -from core.CoreLogger import CoreLogger -from core.enums import BatchStatus - - -# Mock a subclass to implement the abstract method -class MockCollector(CollectorBase): - collector_type = CollectorType.EXAMPLE - preprocessor = MagicMock() - - def __init__(self, dto, **kwargs): - super().__init__( - batch_id=1, - dto=dto, - logger=Mock(spec=CoreLogger), - db_client=Mock(spec=DatabaseClient), - raise_error=True - ) - - def run_implementation(self): - while True: - time.sleep(0.1) # Simulate work - self.log("Working...") - -def test_collector_closes_properly(): - # Mock dependencies - mock_dto = Mock() - - # Initialize the collector - collector = MockCollector( - dto=mock_dto, - ) - - # Run the collector in a separate thread - thread = threading.Thread(target=collector.run) - thread.start() - - # Run the collector for a time - time.sleep(1) - # Signal the collector to stop - collector.abort() - - thread.join() - - - - # Assertions - # Check that multiple log calls have been made - assert collector.logger.log.call_count > 1 - # Check that last call to collector.logger.log was with the correct message - assert collector.logger.log.call_args[0][0] == LogInfo( - id=None, - log='Collector was aborted.', - batch_id=1, - created_at=None - ) - - assert not thread.is_alive(), "Thread is still alive after aborting." - assert collector._stop_event.is_set(), "Stop event was not set." - assert collector.status == BatchStatus.ABORTED, "Collector status is not ABORTED." - - print("Test passed: Collector closes properly.") - - diff --git a/tests/test_automated/unit/source_collectors/test_common_crawl_collector.py b/tests/test_automated/unit/source_collectors/test_common_crawl_collector.py index e0dbd144..74fe1052 100644 --- a/tests/test_automated/unit/source_collectors/test_common_crawl_collector.py +++ b/tests/test_automated/unit/source_collectors/test_common_crawl_collector.py @@ -2,6 +2,7 @@ import pytest +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLInfo import URLInfo from collector_db.DatabaseClient import DatabaseClient from core.CoreLogger import CoreLogger @@ -23,20 +24,21 @@ def mock_get_common_crawl_search_results(): mock_get_common_crawl_search_results.return_value = mock_results yield mock_get_common_crawl_search_results - -def test_common_crawl_collector(mock_get_common_crawl_search_results): +@pytest.mark.asyncio +async def test_common_crawl_collector(mock_get_common_crawl_search_results): collector = CommonCrawlerCollector( batch_id=1, dto=CommonCrawlerInputDTO( search_term="keyword", ), logger=mock.MagicMock(spec=CoreLogger), - db_client=mock.MagicMock(spec=DatabaseClient) + adb_client=mock.AsyncMock(spec=AsyncDatabaseClient), + raise_error=True ) - collector.run() + await collector.run() mock_get_common_crawl_search_results.assert_called_once() - collector.db_client.insert_urls.assert_called_once_with( + collector.adb_client.insert_urls.assert_called_once_with( url_infos=[ URLInfo(url="http://keyword.com"), URLInfo(url="http://keyword.com/page3") diff --git a/tests/test_automated/unit/source_collectors/test_muckrock_collectors.py b/tests/test_automated/unit/source_collectors/test_muckrock_collectors.py index 7dbb92c5..f74c651e 100644 --- a/tests/test_automated/unit/source_collectors/test_muckrock_collectors.py +++ b/tests/test_automated/unit/source_collectors/test_muckrock_collectors.py @@ -1,8 +1,9 @@ from unittest import mock -from unittest.mock import MagicMock, call +from unittest.mock import MagicMock, call, AsyncMock import pytest +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLInfo import URLInfo from collector_db.DatabaseClient import DatabaseClient from core.CoreLogger import CoreLogger @@ -24,15 +25,15 @@ def patch_muckrock_fetcher(monkeypatch): test_data = { "results": inner_test_data } - mock = MagicMock() + mock = AsyncMock() mock.return_value = test_data monkeypatch.setattr(patch_path, mock) return mock - -def test_muckrock_simple_collector(patch_muckrock_fetcher): +@pytest.mark.asyncio +async def test_muckrock_simple_collector(patch_muckrock_fetcher): collector = MuckrockSimpleSearchCollector( batch_id=1, dto=MuckrockSimpleSearchCollectorInputDTO( @@ -40,16 +41,16 @@ def test_muckrock_simple_collector(patch_muckrock_fetcher): max_results=2 ), logger=mock.MagicMock(spec=CoreLogger), - db_client=mock.MagicMock(spec=DatabaseClient), + adb_client=mock.AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) - collector.run() + await collector.run() patch_muckrock_fetcher.assert_has_calls( [ call(FOIAFetchRequest(page=1, page_size=100)), ] ) - collector.db_client.insert_urls.assert_called_once_with( + collector.adb_client.insert_urls.assert_called_once_with( url_infos=[ URLInfo( url='https://include.com/1', @@ -80,13 +81,14 @@ def patch_muckrock_county_level_search_collector_methods(monkeypatch): {"absolute_url": "https://include.com/3", "title": "lemon"}, ] mock = MagicMock() - mock.get_jurisdiction_ids = MagicMock(return_value=get_jurisdiction_ids_data) - mock.get_foia_records = MagicMock(return_value=get_foia_records_data) + mock.get_jurisdiction_ids = AsyncMock(return_value=get_jurisdiction_ids_data) + mock.get_foia_records = AsyncMock(return_value=get_foia_records_data) monkeypatch.setattr(patch_path_get_jurisdiction_ids, mock.get_jurisdiction_ids) monkeypatch.setattr(patch_path_get_foia_records, mock.get_foia_records) return mock -def test_muckrock_county_search_collector(patch_muckrock_county_level_search_collector_methods): +@pytest.mark.asyncio +async def test_muckrock_county_search_collector(patch_muckrock_county_level_search_collector_methods): mock_methods = patch_muckrock_county_level_search_collector_methods collector = MuckrockCountyLevelSearchCollector( @@ -96,15 +98,15 @@ def test_muckrock_county_search_collector(patch_muckrock_county_level_search_col town_names=["test"] ), logger=MagicMock(spec=CoreLogger), - db_client=MagicMock(spec=DatabaseClient), + adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) - collector.run() + await collector.run() mock_methods.get_jurisdiction_ids.assert_called_once() mock_methods.get_foia_records.assert_called_once_with({"Alpha": 1, "Beta": 2}) - collector.db_client.insert_urls.assert_called_once_with( + collector.adb_client.insert_urls.assert_called_once_with( url_infos=[ URLInfo( url='https://include.com/1', @@ -142,9 +144,9 @@ def patch_muckrock_full_search_collector(monkeypatch): } ] }] - mock = MagicMock() + mock = AsyncMock() mock.return_value = test_data - mock.get_page_data = MagicMock(return_value=test_data) + mock.get_page_data = AsyncMock(return_value=test_data) monkeypatch.setattr(patch_path, mock.get_page_data) patch_path = ("source_collectors.muckrock.classes.MuckrockCollector." @@ -155,7 +157,8 @@ def patch_muckrock_full_search_collector(monkeypatch): return mock -def test_muckrock_all_foia_requests_collector(patch_muckrock_full_search_collector): +@pytest.mark.asyncio +async def test_muckrock_all_foia_requests_collector(patch_muckrock_full_search_collector): mock = patch_muckrock_full_search_collector collector = MuckrockAllFOIARequestsCollector( batch_id=1, @@ -164,14 +167,14 @@ def test_muckrock_all_foia_requests_collector(patch_muckrock_full_search_collect total_pages=2 ), logger=MagicMock(spec=CoreLogger), - db_client=MagicMock(spec=DatabaseClient), + adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) - collector.run() + await collector.run() mock.get_page_data.assert_called_once_with(mock.foia_fetcher.return_value, 1, 2) - collector.db_client.insert_urls.assert_called_once_with( + collector.adb_client.insert_urls.assert_called_once_with( url_infos=[ URLInfo( url='https://include.com/1', From 7bfd1e4f76182489c5d0199a5b527cfe616e3597 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sat, 12 Apr 2025 17:41:25 -0400 Subject: [PATCH 096/244] DRAFT --- api/main.py | 18 +- collector_db/DatabaseClient.py | 58 ++++++ collector_manager/AsyncCollectorBase.py | 7 +- collector_manager/ExampleCollector.py | 1 - collector_manager/constants.py | 11 -- core/AsyncCore.py | 168 +++-------------- core/TaskManager.py | 177 ++++++++++++++++++ tests/conftest.py | 2 +- tests/helpers/DBDataCreator.py | 4 +- .../integration/api/test_example_collector.py | 2 + tests/test_automated/integration/conftest.py | 5 +- .../integration/core/test_async_core.py | 35 +--- 12 files changed, 288 insertions(+), 200 deletions(-) delete mode 100644 collector_manager/constants.py create mode 100644 core/TaskManager.py diff --git a/api/main.py b/api/main.py index 37521822..cc7e3fa2 100644 --- a/api/main.py +++ b/api/main.py @@ -18,6 +18,7 @@ from core.CoreLogger import CoreLogger from core.ScheduledTaskManager import AsyncScheduledTaskManager from core.SourceCollectorCore import SourceCollectorCore +from core.TaskManager import TaskManager from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.RootURLCache import RootURLCache from html_tag_collector.URLRequestInterface import URLRequestInterface @@ -45,13 +46,16 @@ async def lifespan(app: FastAPI): ) async_core = AsyncCore( adb_client=adb_client, - huggingface_interface=HuggingFaceInterface(), - url_request_interface=URLRequestInterface(), - html_parser=HTMLResponseParser( - root_url_cache=RootURLCache() - ), - discord_poster=DiscordPoster( - webhook_url=get_from_env("DISCORD_WEBHOOK_URL") + task_manager=TaskManager( + adb_client=adb_client, + huggingface_interface=HuggingFaceInterface(), + url_request_interface=URLRequestInterface(), + html_parser=HTMLResponseParser( + root_url_cache=RootURLCache() + ), + discord_poster=DiscordPoster( + webhook_url=get_from_env("DISCORD_WEBHOOK_URL") + ), ), collector_manager=async_collector_manager ) diff --git a/collector_db/DatabaseClient.py b/collector_db/DatabaseClient.py index 06107651..8d72ef0d 100644 --- a/collector_db/DatabaseClient.py +++ b/collector_db/DatabaseClient.py @@ -3,13 +3,16 @@ from typing import Optional, List from sqlalchemy import create_engine, Row +from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import sessionmaker, scoped_session, aliased from collector_db.ConfigManager import ConfigManager from collector_db.DTOs.BatchInfo import BatchInfo from collector_db.DTOs.DuplicateInfo import DuplicateInfo, DuplicateInsertInfo +from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_db.DTOs.LogInfo import LogInfo, LogOutputInfo from collector_db.DTOs.URLInfo import URLInfo +from collector_db.DTOs.URLMapping import URLMapping from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import Base, Batch, URL, Log, Duplicate from collector_manager.enums import CollectorType @@ -90,6 +93,61 @@ def insert_duplicates(self, session, duplicate_infos: list[DuplicateInsertInfo]) session.add(duplicate) + @session_manager + def get_url_info_by_url(self, session, url: str) -> Optional[URLInfo]: + url = session.query(URL).filter_by(url=url).first() + return URLInfo(**url.__dict__) + + @session_manager + def insert_url(self, session, url_info: URLInfo) -> int: + """Insert a new URL into the database.""" + url_entry = URL( + batch_id=url_info.batch_id, + url=url_info.url, + collector_metadata=url_info.collector_metadata, + outcome=url_info.outcome.value + ) + session.add(url_entry) + session.commit() + session.refresh(url_entry) + return url_entry.id + + @session_manager + def add_duplicate_info(self, session, duplicate_infos: list[DuplicateInfo]): + # TODO: Add test for this method when testing CollectorDatabaseProcessor + for duplicate_info in duplicate_infos: + duplicate = Duplicate( + batch_id=duplicate_info.original_batch_id, + original_url_id=duplicate_info.original_url_id, + ) + session.add(duplicate) + + + def insert_urls(self, url_infos: List[URLInfo], batch_id: int) -> InsertURLsInfo: + url_mappings = [] + duplicates = [] + for url_info in url_infos: + url_info.batch_id = batch_id + try: + url_id = self.insert_url(url_info) + url_mappings.append(URLMapping(url_id=url_id, url=url_info.url)) + except IntegrityError: + orig_url_info = self.get_url_info_by_url(url_info.url) + duplicate_info = DuplicateInsertInfo( + duplicate_batch_id=batch_id, + original_url_id=orig_url_info.id + ) + duplicates.append(duplicate_info) + self.insert_duplicates(duplicates) + + return InsertURLsInfo( + url_mappings=url_mappings, + total_count=len(url_infos), + original_count=len(url_mappings), + duplicate_count=len(duplicates), + url_ids=[url_mapping.url_id for url_mapping in url_mappings] + ) + @session_manager def get_urls_by_batch(self, session, batch_id: int, page: int = 1) -> List[URLInfo]: """Retrieve all URLs associated with a batch.""" diff --git a/collector_manager/AsyncCollectorBase.py b/collector_manager/AsyncCollectorBase.py index 672d9d9c..e93f97fc 100644 --- a/collector_manager/AsyncCollectorBase.py +++ b/collector_manager/AsyncCollectorBase.py @@ -11,6 +11,7 @@ from collector_db.DTOs.LogInfo import LogInfo from collector_manager.enums import CollectorType from core.CoreLogger import CoreLogger +from core.TaskManager import TaskManager from core.enums import BatchStatus from core.preprocessors.PreprocessorBase import PreprocessorBase @@ -26,8 +27,12 @@ def __init__( dto: BaseModel, logger: CoreLogger, adb_client: AsyncDatabaseClient, - raise_error: bool = False + raise_error: bool = False, + trigger_followup_tasks: bool = False, + task_manager: TaskManager = None ) -> None: + self.trigger_followup_tasks = trigger_followup_tasks + self.task_manager = task_manager self.batch_id = batch_id self.adb_client = adb_client self.dto = dto diff --git a/collector_manager/ExampleCollector.py b/collector_manager/ExampleCollector.py index 2d54eced..9f451732 100644 --- a/collector_manager/ExampleCollector.py +++ b/collector_manager/ExampleCollector.py @@ -4,7 +4,6 @@ """ import asyncio -import time from collector_manager.AsyncCollectorBase import AsyncCollectorBase from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO diff --git a/collector_manager/constants.py b/collector_manager/constants.py deleted file mode 100644 index fde231d9..00000000 --- a/collector_manager/constants.py +++ /dev/null @@ -1,11 +0,0 @@ -from collector_manager.enums import CollectorType - -ASYNC_COLLECTORS = [ - CollectorType.AUTO_GOOGLER, - CollectorType.EXAMPLE, - CollectorType.CKAN, - CollectorType.COMMON_CRAWLER, - CollectorType.MUCKROCK_SIMPLE_SEARCH, - CollectorType.MUCKROCK_COUNTY_SEARCH, - CollectorType.MUCKROCK_ALL_SEARCH, -] diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 0b24e061..971cd03d 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -1,17 +1,11 @@ -import logging -from http import HTTPStatus -from http.client import HTTPException from typing import Optional from pydantic import BaseModel -from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.BatchInfo import BatchInfo -from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.enums import TaskType from collector_manager.AsyncCollectorManager import AsyncCollectorManager -from collector_manager.constants import ASYNC_COLLECTORS from collector_manager.enums import CollectorType from core.DTOs.CollectorStartInfo import CollectorStartInfo from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo @@ -23,45 +17,22 @@ from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo from core.DTOs.MessageResponse import MessageResponse -from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome -from core.classes.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator -from core.classes.TaskOperatorBase import TaskOperatorBase -from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator -from core.classes.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator -from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator -from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator +from core.TaskManager import TaskManager from core.enums import BatchStatus, RecordType -from html_tag_collector.ResponseParser import HTMLResponseParser -from html_tag_collector.URLRequestInterface import URLRequestInterface -from hugging_face.HuggingFaceInterface import HuggingFaceInterface -from llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier -from pdap_api_client.AccessManager import AccessManager -from pdap_api_client.PDAPClient import PDAPClient from security_manager.SecurityManager import AccessInfo -from util.DiscordNotifier import DiscordPoster -from util.helper_functions import get_from_env -TASK_REPEAT_THRESHOLD = 20 class AsyncCore: def __init__( self, adb_client: AsyncDatabaseClient, - huggingface_interface: HuggingFaceInterface, - url_request_interface: URLRequestInterface, - html_parser: HTMLResponseParser, - discord_poster: DiscordPoster, - collector_manager: AsyncCollectorManager + collector_manager: AsyncCollectorManager, + task_manager: TaskManager ): + self.task_manager = task_manager self.adb_client = adb_client - self.huggingface_interface = huggingface_interface - self.url_request_interface = url_request_interface - self.html_parser = html_parser - self.logger = logging.getLogger(__name__) - self.logger.addHandler(logging.StreamHandler()) - self.logger.setLevel(logging.INFO) - self.discord_poster = discord_poster + self.collector_manager = collector_manager @@ -96,11 +67,6 @@ async def initiate_collector( Reserves a batch ID from the database and starts the requisite collector """ - if collector_type not in ASYNC_COLLECTORS: - raise HTTPException( - f"Collector type {collector_type} is not supported", - HTTPStatus.BAD_REQUEST - ) batch_info = BatchInfo( strategy=collector_type.value, @@ -122,117 +88,23 @@ async def initiate_collector( # endregion - - #region Task Operators - async def get_url_html_task_operator(self): - self.logger.info("Running URL HTML Task") - operator = URLHTMLTaskOperator( - adb_client=self.adb_client, - url_request_interface=self.url_request_interface, - html_parser=self.html_parser - ) - return operator - - async def get_url_relevance_huggingface_task_operator(self): - self.logger.info("Running URL Relevance Huggingface Task") - operator = URLRelevanceHuggingfaceTaskOperator( - adb_client=self.adb_client, - huggingface_interface=self.huggingface_interface - ) - return operator - - async def get_url_record_type_task_operator(self): - operator = URLRecordTypeTaskOperator( - adb_client=self.adb_client, - classifier=OpenAIRecordClassifier() - ) - return operator - - async def get_agency_identification_task_operator(self): - pdap_client = PDAPClient( - access_manager=AccessManager( - email=get_from_env("PDAP_EMAIL"), - password=get_from_env("PDAP_PASSWORD"), - api_key=get_from_env("PDAP_API_KEY"), - ), - ) - muckrock_api_interface = MuckrockAPIInterface() - operator = AgencyIdentificationTaskOperator( - adb_client=self.adb_client, - pdap_client=pdap_client, - muckrock_api_interface=muckrock_api_interface - ) - return operator - - async def get_url_miscellaneous_metadata_task_operator(self): - operator = URLMiscellaneousMetadataTaskOperator( - adb_client=self.adb_client - ) - return operator - - async def get_task_operators(self) -> list[TaskOperatorBase]: - return [ - await self.get_url_html_task_operator(), - await self.get_url_relevance_huggingface_task_operator(), - await self.get_url_record_type_task_operator(), - await self.get_agency_identification_task_operator(), - await self.get_url_miscellaneous_metadata_task_operator() - ] - - #endregion - - #region Tasks async def run_tasks(self): - operators = await self.get_task_operators() - count = 0 - for operator in operators: - - meets_prereq = await operator.meets_task_prerequisites() - while meets_prereq: - if count > TASK_REPEAT_THRESHOLD: - self.discord_poster.post_to_discord( - message=f"Task {operator.task_type.value} has been run" - f" more than {TASK_REPEAT_THRESHOLD} times in a row. " - f"Task loop terminated.") - break - task_id = await self.initiate_task_in_db(task_type=operator.task_type) - run_info: TaskOperatorRunInfo = await operator.run_task(task_id) - await self.conclude_task(run_info) - count += 1 - meets_prereq = await operator.meets_task_prerequisites() - - - async def conclude_task(self, run_info): - await self.adb_client.link_urls_to_task(task_id=run_info.task_id, url_ids=run_info.linked_url_ids) - await self.handle_outcome(run_info) - - async def initiate_task_in_db(self, task_type: TaskType) -> int: - self.logger.info(f"Initiating {task_type.value} Task") - task_id = await self.adb_client.initiate_task(task_type=task_type) - return task_id - - async def handle_outcome(self, run_info: TaskOperatorRunInfo): - match run_info.outcome: - case TaskOperatorOutcome.ERROR: - await self.handle_task_error(run_info) - case TaskOperatorOutcome.SUCCESS: - await self.adb_client.update_task_status( - task_id=run_info.task_id, - status=BatchStatus.COMPLETE - ) - - async def handle_task_error(self, run_info: TaskOperatorRunInfo): - await self.adb_client.update_task_status(task_id=run_info.task_id, status=BatchStatus.ERROR) - await self.adb_client.add_task_error(task_id=run_info.task_id, error=run_info.message) - - async def get_task_info(self, task_id: int) -> TaskInfo: - return await self.adb_client.get_task_info(task_id=task_id) - - async def get_tasks(self, page: int, task_type: TaskType, task_status: BatchStatus) -> GetTasksResponse: - return await self.adb_client.get_tasks(page=page, task_type=task_type, task_status=task_status) + await self.task_manager.run_tasks() + async def get_tasks( + self, + page: int, + task_type: TaskType, + task_status: BatchStatus + ) -> GetTasksResponse: + return await self.task_manager.get_tasks( + page=page, + task_type=task_type, + task_status=task_status + ) - #endregion + async def get_task_info(self, task_id): + return await self.task_manager.get_task_info(task_id) #region Annotations and Review @@ -346,3 +218,5 @@ async def reject_url( user_id=access_info.user_id ) + + diff --git a/core/TaskManager.py b/core/TaskManager.py new file mode 100644 index 00000000..003fda0f --- /dev/null +++ b/core/TaskManager.py @@ -0,0 +1,177 @@ +import logging + +from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_db.DTOs.TaskInfo import TaskInfo +from collector_db.enums import TaskType +from core.DTOs.GetTasksResponse import GetTasksResponse +from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome +from core.classes.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator +from core.classes.TaskOperatorBase import TaskOperatorBase +from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator +from core.classes.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator +from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator +from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator +from core.enums import BatchStatus +from html_tag_collector.ResponseParser import HTMLResponseParser +from html_tag_collector.URLRequestInterface import URLRequestInterface +from hugging_face.HuggingFaceInterface import HuggingFaceInterface +from llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier +from pdap_api_client.AccessManager import AccessManager +from pdap_api_client.PDAPClient import PDAPClient +from util.DiscordNotifier import DiscordPoster +from util.helper_functions import get_from_env + +TASK_REPEAT_THRESHOLD = 20 + +class TaskManager: + + def __init__( + self, + adb_client: AsyncDatabaseClient, + huggingface_interface: HuggingFaceInterface, + url_request_interface: URLRequestInterface, + html_parser: HTMLResponseParser, + discord_poster: DiscordPoster, + ): + self.adb_client = adb_client + self.huggingface_interface = huggingface_interface + self.url_request_interface = url_request_interface + self.html_parser = html_parser + self.discord_poster = discord_poster + self.logger = logging.getLogger(__name__) + self.logger.addHandler(logging.StreamHandler()) + self.logger.setLevel(logging.INFO) + + + + #region Task Operators + async def get_url_html_task_operator(self): + self.logger.info("Running URL HTML Task") + operator = URLHTMLTaskOperator( + adb_client=self.adb_client, + url_request_interface=self.url_request_interface, + html_parser=self.html_parser + ) + return operator + + async def get_url_relevance_huggingface_task_operator(self): + self.logger.info("Running URL Relevance Huggingface Task") + operator = URLRelevanceHuggingfaceTaskOperator( + adb_client=self.adb_client, + huggingface_interface=self.huggingface_interface + ) + return operator + + async def get_url_record_type_task_operator(self): + operator = URLRecordTypeTaskOperator( + adb_client=self.adb_client, + classifier=OpenAIRecordClassifier() + ) + return operator + + async def get_agency_identification_task_operator(self): + pdap_client = PDAPClient( + access_manager=AccessManager( + email=get_from_env("PDAP_EMAIL"), + password=get_from_env("PDAP_PASSWORD"), + api_key=get_from_env("PDAP_API_KEY"), + ), + ) + muckrock_api_interface = MuckrockAPIInterface() + operator = AgencyIdentificationTaskOperator( + adb_client=self.adb_client, + pdap_client=pdap_client, + muckrock_api_interface=muckrock_api_interface + ) + return operator + + async def get_url_miscellaneous_metadata_task_operator(self): + operator = URLMiscellaneousMetadataTaskOperator( + adb_client=self.adb_client + ) + return operator + + async def get_task_operators(self) -> list[TaskOperatorBase]: + return [ + await self.get_url_html_task_operator(), + await self.get_url_relevance_huggingface_task_operator(), + await self.get_url_record_type_task_operator(), + await self.get_agency_identification_task_operator(), + await self.get_url_miscellaneous_metadata_task_operator() + ] + + #endregion + + #region Tasks + async def run_tasks(self): + operators = await self.get_task_operators() + count = 0 + for operator in operators: + + meets_prereq = await operator.meets_task_prerequisites() + while meets_prereq: + if count > TASK_REPEAT_THRESHOLD: + self.discord_poster.post_to_discord( + message=f"Task {operator.task_type.value} has been run" + f" more than {TASK_REPEAT_THRESHOLD} times in a row. " + f"Task loop terminated.") + break + task_id = await self.initiate_task_in_db(task_type=operator.task_type) + run_info: TaskOperatorRunInfo = await operator.run_task(task_id) + await self.conclude_task(run_info) + count += 1 + meets_prereq = await operator.meets_task_prerequisites() + + + async def conclude_task(self, run_info): + await self.adb_client.link_urls_to_task( + task_id=run_info.task_id, + url_ids=run_info.linked_url_ids + ) + await self.handle_outcome(run_info) + + async def initiate_task_in_db(self, task_type: TaskType) -> int: + self.logger.info(f"Initiating {task_type.value} Task") + task_id = await self.adb_client.initiate_task(task_type=task_type) + return task_id + + async def handle_outcome(self, run_info: TaskOperatorRunInfo): + match run_info.outcome: + case TaskOperatorOutcome.ERROR: + await self.handle_task_error(run_info) + case TaskOperatorOutcome.SUCCESS: + await self.adb_client.update_task_status( + task_id=run_info.task_id, + status=BatchStatus.COMPLETE + ) + + async def handle_task_error(self, run_info: TaskOperatorRunInfo): + await self.adb_client.update_task_status( + task_id=run_info.task_id, + status=BatchStatus.ERROR) + await self.adb_client.add_task_error( + task_id=run_info.task_id, + error=run_info.message + ) + + async def get_task_info(self, task_id: int) -> TaskInfo: + return await self.adb_client.get_task_info(task_id=task_id) + + async def get_tasks( + self, + page: int, + task_type: TaskType, + task_status: BatchStatus + ) -> GetTasksResponse: + return await self.adb_client.get_tasks( + page=page, + task_type=task_type, + task_status=task_status + ) + + + #endregion + + + diff --git a/tests/conftest.py b/tests/conftest.py index fbe5dd50..8aeb6dc6 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -66,7 +66,7 @@ def db_client_test(wipe_database) -> DatabaseClient: @pytest.fixture def adb_client_test(wipe_database) -> AsyncDatabaseClient: - conn = get_postgres_connection_string() + conn = get_postgres_connection_string(is_async=True) adb_client = AsyncDatabaseClient(db_url=conn) yield adb_client adb_client.engine.dispose() diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 6964fb86..3cbdb11b 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -190,10 +190,10 @@ def urls( ) ) - return asyncio.run(self.adb_client.insert_urls( + return self.db_client.insert_urls( url_infos=url_infos, batch_id=batch_id, - )) + ) async def url_miscellaneous_metadata( self, diff --git a/tests/test_automated/integration/api/test_example_collector.py b/tests/test_automated/integration/api/test_example_collector.py index 81207a28..1a142651 100644 --- a/tests/test_automated/integration/api/test_example_collector.py +++ b/tests/test_automated/integration/api/test_example_collector.py @@ -60,6 +60,8 @@ def test_example_collector(api_test_helper): # Flush early to ensure logs are written ath.core.core_logger.flush_all() + time.sleep(10) + lr: GetBatchLogsResponse = ath.request_validator.get_batch_logs(batch_id=batch_id) assert len(lr.logs) > 0 diff --git a/tests/test_automated/integration/conftest.py b/tests/test_automated/integration/conftest.py index 8ffdc266..cd05cf6f 100644 --- a/tests/test_automated/integration/conftest.py +++ b/tests/test_automated/integration/conftest.py @@ -31,10 +31,7 @@ def test_async_core(db_client_test): adb_client = AsyncDatabaseClient() core = AsyncCore( adb_client=adb_client, - huggingface_interface=MagicMock(), - url_request_interface=MagicMock(), - html_parser=MagicMock(), - discord_poster=MagicMock(), + task_manager=MagicMock(), collector_manager=AsyncCollectorManager( adb_client=adb_client, logger=logger, diff --git a/tests/test_automated/integration/core/test_async_core.py b/tests/test_automated/integration/core/test_async_core.py index 3fe10580..de1b9b85 100644 --- a/tests/test_automated/integration/core/test_async_core.py +++ b/tests/test_automated/integration/core/test_async_core.py @@ -25,10 +25,8 @@ async def test_conclude_task_success(db_data_creator: DBDataCreator): core = AsyncCore( adb_client=ddc.adb_client, - huggingface_interface=MagicMock(), - url_request_interface=MagicMock(), - html_parser=MagicMock(), - discord_poster=MagicMock() + task_manager=MagicMock(), + collector_manager=MagicMock() ) await core.conclude_task(run_info=run_info) @@ -52,13 +50,10 @@ async def test_conclude_task_success(db_data_creator: DBDataCreator): core = AsyncCore( adb_client=ddc.adb_client, - huggingface_interface=MagicMock(), - url_request_interface=MagicMock(), - html_parser=MagicMock(), - discord_poster=MagicMock(), + task_manager=MagicMock(), collector_manager=MagicMock() ) - await core.conclude_task(run_info=run_info) + await core.task_manager.conclude_task(run_info=run_info) task_info = await ddc.adb_client.get_task_info(task_id=task_id) @@ -81,13 +76,10 @@ async def test_conclude_task_error(db_data_creator: DBDataCreator): core = AsyncCore( adb_client=ddc.adb_client, - huggingface_interface=MagicMock(), - url_request_interface=MagicMock(), - html_parser=MagicMock(), - discord_poster=MagicMock(), + task_manager=MagicMock(), collector_manager=MagicMock() ) - await core.conclude_task(run_info=run_info) + await core.task_manager.conclude_task(run_info=run_info) task_info = await ddc.adb_client.get_task_info(task_id=task_id) @@ -99,10 +91,7 @@ async def test_conclude_task_error(db_data_creator: DBDataCreator): async def test_run_task_prereq_not_met(): core = AsyncCore( adb_client=AsyncMock(), - huggingface_interface=AsyncMock(), - url_request_interface=AsyncMock(), - html_parser=AsyncMock(), - discord_poster=MagicMock(), + task_manager=MagicMock(), collector_manager=MagicMock() ) @@ -126,10 +115,7 @@ async def run_task(self, task_id: int) -> TaskOperatorRunInfo: core = AsyncCore( adb_client=db_data_creator.adb_client, - huggingface_interface=AsyncMock(), - url_request_interface=AsyncMock(), - html_parser=AsyncMock(), - discord_poster=MagicMock(), + task_manager=MagicMock(), collector_manager=MagicMock() ) core.conclude_task = AsyncMock() @@ -171,10 +157,7 @@ async def run_task(self, task_id: int) -> TaskOperatorRunInfo: core = AsyncCore( adb_client=db_data_creator.adb_client, - huggingface_interface=AsyncMock(), - url_request_interface=AsyncMock(), - html_parser=AsyncMock(), - discord_poster=MagicMock(), + task_manager=MagicMock(), collector_manager=MagicMock() ) core.conclude_task = AsyncMock() From 6c3fe10e168b593d53c703ceafa509b6f763b186 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 14 Apr 2025 15:35:45 -0400 Subject: [PATCH 097/244] feat(app): make collectors asynchronouns and add task trigger Collectors have now been designed to be asynchronous, rather than existing in separate threads. In addition, collectors are now set up to trigger tasks immediately after collection completion, in addition to occurring periodically. --- api/main.py | 34 +++++---- collector_manager/AsyncCollectorBase.py | 11 +-- collector_manager/AsyncCollectorManager.py | 10 ++- core/AsyncCore.py | 2 +- core/FunctionTrigger.py | 30 ++++++++ core/TaskManager.py | 5 ++ .../integration/api/conftest.py | 42 +++++++++-- .../integration/api/test_duplicates.py | 5 ++ .../integration/api/test_example_collector.py | 10 +++ .../integration/core/test_async_core.py | 75 +++++++++---------- .../core/test_example_collector_lifecycle.py | 1 - .../unit/test_function_trigger.py | 67 +++++++++++++++++ 12 files changed, 223 insertions(+), 69 deletions(-) create mode 100644 core/FunctionTrigger.py create mode 100644 tests/test_automated/unit/test_function_trigger.py diff --git a/api/main.py b/api/main.py index cc7e3fa2..79e31542 100644 --- a/api/main.py +++ b/api/main.py @@ -34,29 +34,33 @@ async def lifespan(app: FastAPI): adb_client = AsyncDatabaseClient() await setup_database(db_client) core_logger = CoreLogger(db_client=db_client) - async_collector_manager = AsyncCollectorManager( - logger=core_logger, - adb_client=adb_client, - ) + source_collector_core = SourceCollectorCore( core_logger=CoreLogger( db_client=db_client ), db_client=DatabaseClient(), ) - async_core = AsyncCore( + task_manager = TaskManager( adb_client=adb_client, - task_manager=TaskManager( - adb_client=adb_client, - huggingface_interface=HuggingFaceInterface(), - url_request_interface=URLRequestInterface(), - html_parser=HTMLResponseParser( - root_url_cache=RootURLCache() - ), - discord_poster=DiscordPoster( - webhook_url=get_from_env("DISCORD_WEBHOOK_URL") - ), + huggingface_interface=HuggingFaceInterface(), + url_request_interface=URLRequestInterface(), + html_parser=HTMLResponseParser( + root_url_cache=RootURLCache() ), + discord_poster=DiscordPoster( + webhook_url=get_from_env("DISCORD_WEBHOOK_URL") + ) + ) + async_collector_manager = AsyncCollectorManager( + logger=core_logger, + adb_client=adb_client, + post_collection_function_trigger=task_manager.task_trigger + ) + + async_core = AsyncCore( + adb_client=adb_client, + task_manager=task_manager, collector_manager=async_collector_manager ) async_scheduled_task_manager = AsyncScheduledTaskManager(async_core=async_core) diff --git a/collector_manager/AsyncCollectorBase.py b/collector_manager/AsyncCollectorBase.py index e93f97fc..ec53f4c6 100644 --- a/collector_manager/AsyncCollectorBase.py +++ b/collector_manager/AsyncCollectorBase.py @@ -11,7 +11,7 @@ from collector_db.DTOs.LogInfo import LogInfo from collector_manager.enums import CollectorType from core.CoreLogger import CoreLogger -from core.TaskManager import TaskManager +from core.FunctionTrigger import FunctionTrigger from core.enums import BatchStatus from core.preprocessors.PreprocessorBase import PreprocessorBase @@ -28,11 +28,9 @@ def __init__( logger: CoreLogger, adb_client: AsyncDatabaseClient, raise_error: bool = False, - trigger_followup_tasks: bool = False, - task_manager: TaskManager = None + post_collection_function_trigger: Optional[FunctionTrigger] = None, ) -> None: - self.trigger_followup_tasks = trigger_followup_tasks - self.task_manager = task_manager + self.post_collection_function_trigger = post_collection_function_trigger self.batch_id = batch_id self.adb_client = adb_client self.dto = dto @@ -95,6 +93,9 @@ async def process(self) -> None: ) await self.log("Done processing collector.", allow_abort=False) + if self.post_collection_function_trigger is not None: + await self.post_collection_function_trigger.trigger_or_rerun() + async def run(self) -> None: try: await self.start_timer() diff --git a/collector_manager/AsyncCollectorManager.py b/collector_manager/AsyncCollectorManager.py index af875ddc..bf338c88 100644 --- a/collector_manager/AsyncCollectorManager.py +++ b/collector_manager/AsyncCollectorManager.py @@ -11,6 +11,7 @@ from collector_manager.collector_mapping import COLLECTOR_MAPPING from collector_manager.enums import CollectorType from core.CoreLogger import CoreLogger +from core.FunctionTrigger import FunctionTrigger class AsyncCollectorManager: @@ -19,13 +20,15 @@ def __init__( self, logger: CoreLogger, adb_client: AsyncDatabaseClient, - dev_mode: bool = False + dev_mode: bool = False, + post_collection_function_trigger: FunctionTrigger = None ): self.collectors: Dict[int, AsyncCollectorBase] = {} self.adb_client = adb_client self.logger = logger self.async_tasks: dict[int, asyncio.Task] = {} self.dev_mode = dev_mode + self.post_collection_function_trigger = post_collection_function_trigger async def has_collector(self, cid: int) -> bool: return cid in self.collectors @@ -34,7 +37,7 @@ async def start_async_collector( self, collector_type: CollectorType, batch_id: int, - dto: BaseModel + dto: BaseModel, ) -> None: if batch_id in self.collectors: raise ValueError(f"Collector with batch_id {batch_id} is already running.") @@ -45,7 +48,8 @@ async def start_async_collector( dto=dto, logger=self.logger, adb_client=self.adb_client, - raise_error=True if self.dev_mode else False + raise_error=True if self.dev_mode else False, + post_collection_function_trigger=self.post_collection_function_trigger ) except KeyError: raise InvalidCollectorError(f"Collector {collector_type.value} not found.") diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 971cd03d..b17903db 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -89,7 +89,7 @@ async def initiate_collector( # endregion async def run_tasks(self): - await self.task_manager.run_tasks() + await self.task_manager.trigger_task_run() async def get_tasks( self, diff --git a/core/FunctionTrigger.py b/core/FunctionTrigger.py new file mode 100644 index 00000000..df85482a --- /dev/null +++ b/core/FunctionTrigger.py @@ -0,0 +1,30 @@ +import asyncio +from typing import Callable, Awaitable + +class FunctionTrigger: + """ + A small class used to trigger a function to run in a loop + If the trigger is used again while the task is running, the task will be rerun + """ + + def __init__(self, func: Callable[[], Awaitable[None]]): + self._func = func + self._lock = asyncio.Lock() + self._rerun_requested = False + self._loop_running = False + + async def trigger_or_rerun(self): + if self._loop_running: + self._rerun_requested = True + return + + async with self._lock: + self._loop_running = True + try: + while True: + self._rerun_requested = False + await self._func() + if not self._rerun_requested: + break + finally: + self._loop_running = False diff --git a/core/TaskManager.py b/core/TaskManager.py index 003fda0f..8ec259f5 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -6,6 +6,7 @@ from collector_db.enums import TaskType from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome +from core.FunctionTrigger import FunctionTrigger from core.classes.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator from core.classes.TaskOperatorBase import TaskOperatorBase from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator @@ -42,6 +43,7 @@ def __init__( self.logger = logging.getLogger(__name__) self.logger.addHandler(logging.StreamHandler()) self.logger.setLevel(logging.INFO) + self.task_trigger = FunctionTrigger(self.run_tasks) @@ -123,6 +125,9 @@ async def run_tasks(self): count += 1 meets_prereq = await operator.meets_task_prerequisites() + async def trigger_task_run(self): + await self.task_trigger.trigger_or_rerun() + async def conclude_task(self, run_info): await self.adb_client.link_urls_to_task( diff --git a/tests/test_automated/integration/api/conftest.py b/tests/test_automated/integration/api/conftest.py index c2e537b1..e51b05dc 100644 --- a/tests/test_automated/integration/api/conftest.py +++ b/tests/test_automated/integration/api/conftest.py @@ -1,12 +1,15 @@ import asyncio +import logging +import os from dataclasses import dataclass from typing import Generator -from unittest.mock import MagicMock +from unittest.mock import MagicMock, AsyncMock import pytest from starlette.testclient import TestClient from api.main import app +from core.AsyncCore import AsyncCore from core.SourceCollectorCore import SourceCollectorCore from security_manager.SecurityManager import get_access_info, AccessInfo, Permissions from tests.helpers.DBDataCreator import DBDataCreator @@ -17,6 +20,7 @@ class APITestHelper: request_validator: RequestValidator core: SourceCollectorCore + async_core: AsyncCore db_data_creator: DBDataCreator mock_huggingface_interface: MagicMock mock_label_studio_interface: MagicMock @@ -26,28 +30,54 @@ def adb_client(self): MOCK_USER_ID = 1 +def disable_task_trigger(ath: APITestHelper) -> None: + ath.async_core.collector_manager.post_collection_function_trigger = AsyncMock() + + + +async def fail_task_trigger() -> None: + raise Exception( + "Task Trigger is set to fail in tests by default, to catch unintentional calls." + "If this is not intended, either replace with a Mock or the expected task function." + ) def override_access_info() -> AccessInfo: return AccessInfo(user_id=MOCK_USER_ID, permissions=[Permissions.SOURCE_COLLECTOR]) -@pytest.fixture -def client(db_client_test, monkeypatch) -> Generator[TestClient, None, None]: - monkeypatch.setenv("DISCORD_WEBHOOK_URL", "https://discord.com") +@pytest.fixture(scope="session") +def client() -> Generator[TestClient, None, None]: + # Mock envioronment + _original_env = dict(os.environ) + os.environ["DISCORD_WEBHOOK_URL"] = "https://discord.com" with TestClient(app) as c: app.dependency_overrides[get_access_info] = override_access_info core: SourceCollectorCore = c.app.state.core + async_core: AsyncCore = c.app.state.async_core + + # Interfaces to the web should be mocked + task_manager = async_core.task_manager + task_manager.huggingface_interface = AsyncMock() + task_manager.url_request_interface = AsyncMock() + task_manager.discord_poster = AsyncMock() + # Disable Logger + task_manager.logger.disabled = True + # Set trigger to fail immediately if called, to force it to be manually specified in tests + task_manager.task_trigger._func = fail_task_trigger # core.shutdown() yield c core.shutdown() + # Reset environment variables back to original state + os.environ.clear() + os.environ.update(_original_env) @pytest.fixture def api_test_helper(client: TestClient, db_data_creator, monkeypatch) -> APITestHelper: - return APITestHelper( request_validator=RequestValidator(client=client), core=client.app.state.core, + async_core=client.app.state.async_core, db_data_creator=db_data_creator, mock_huggingface_interface=MagicMock(), mock_label_studio_interface=MagicMock() - ) \ No newline at end of file + ) diff --git a/tests/test_automated/integration/api/test_duplicates.py b/tests/test_automated/integration/api/test_duplicates.py index 292df507..a026d6a1 100644 --- a/tests/test_automated/integration/api/test_duplicates.py +++ b/tests/test_automated/integration/api/test_duplicates.py @@ -1,12 +1,17 @@ import time +from unittest.mock import AsyncMock from collector_db.DTOs.BatchInfo import BatchInfo from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO +from test_automated.integration.api.conftest import disable_task_trigger def test_duplicates(api_test_helper): ath = api_test_helper + # Temporarily disable task trigger + disable_task_trigger(ath) + dto = ExampleInputDTO( sleep_time=1 ) diff --git a/tests/test_automated/integration/api/test_example_collector.py b/tests/test_automated/integration/api/test_example_collector.py index 1a142651..2f05d1d5 100644 --- a/tests/test_automated/integration/api/test_example_collector.py +++ b/tests/test_automated/integration/api/test_example_collector.py @@ -9,11 +9,15 @@ from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.enums import BatchStatus +from test_automated.integration.api.conftest import disable_task_trigger def test_example_collector(api_test_helper): ath = api_test_helper + # Temporarily disable task trigger + disable_task_trigger(ath) + dto = ExampleInputDTO( sleep_time=1 ) @@ -66,6 +70,12 @@ def test_example_collector(api_test_helper): assert len(lr.logs) > 0 + # Check that task was triggered + ath.async_core.collector_manager.\ + post_collection_function_trigger.\ + trigger_or_rerun.assert_called_once() + + def test_example_collector_error(api_test_helper, monkeypatch): """ Test that when an error occurs in a collector, the batch is properly update diff --git a/tests/test_automated/integration/core/test_async_core.py b/tests/test_automated/integration/core/test_async_core.py index de1b9b85..b4b8e740 100644 --- a/tests/test_automated/integration/core/test_async_core.py +++ b/tests/test_automated/integration/core/test_async_core.py @@ -3,13 +3,28 @@ import pytest +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.enums import TaskType from collector_db.models import Task from core.AsyncCore import AsyncCore from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome +from core.TaskManager import TaskManager from core.enums import BatchStatus from tests.helpers.DBDataCreator import DBDataCreator +def setup_async_core(adb_client: AsyncDatabaseClient): + return AsyncCore( + adb_client=adb_client, + task_manager=TaskManager( + adb_client=adb_client, + huggingface_interface=AsyncMock(), + url_request_interface=AsyncMock(), + html_parser=AsyncMock(), + discord_poster=AsyncMock(), + ), + collector_manager=AsyncMock() + ) + @pytest.mark.asyncio async def test_conclude_task_success(db_data_creator: DBDataCreator): ddc = db_data_creator @@ -23,11 +38,7 @@ async def test_conclude_task_success(db_data_creator: DBDataCreator): outcome=TaskOperatorOutcome.SUCCESS, ) - core = AsyncCore( - adb_client=ddc.adb_client, - task_manager=MagicMock(), - collector_manager=MagicMock() - ) + core = setup_async_core(db_data_creator.adb_client) await core.conclude_task(run_info=run_info) task_info = await ddc.adb_client.get_task_info(task_id=task_id) @@ -48,11 +59,7 @@ async def test_conclude_task_success(db_data_creator: DBDataCreator): outcome=TaskOperatorOutcome.SUCCESS, ) - core = AsyncCore( - adb_client=ddc.adb_client, - task_manager=MagicMock(), - collector_manager=MagicMock() - ) + core = setup_async_core(db_data_creator.adb_client) await core.task_manager.conclude_task(run_info=run_info) task_info = await ddc.adb_client.get_task_info(task_id=task_id) @@ -74,11 +81,7 @@ async def test_conclude_task_error(db_data_creator: DBDataCreator): message="test error", ) - core = AsyncCore( - adb_client=ddc.adb_client, - task_manager=MagicMock(), - collector_manager=MagicMock() - ) + core = setup_async_core(db_data_creator.adb_client) await core.task_manager.conclude_task(run_info=run_info) task_info = await ddc.adb_client.get_task_info(task_id=task_id) @@ -89,15 +92,14 @@ async def test_conclude_task_error(db_data_creator: DBDataCreator): @pytest.mark.asyncio async def test_run_task_prereq_not_met(): - core = AsyncCore( - adb_client=AsyncMock(), - task_manager=MagicMock(), - collector_manager=MagicMock() - ) + """ + When a task pre-requisite is not met, the task should not be run + """ + core = setup_async_core(AsyncMock()) mock_operator = AsyncMock() mock_operator.meets_task_prerequisites = AsyncMock(return_value=False) - AsyncCore.get_task_operators = AsyncMock(return_value=[mock_operator]) + core.task_manager.get_task_operators = AsyncMock(return_value=[mock_operator]) await core.run_tasks() mock_operator.meets_task_prerequisites.assert_called_once() @@ -105,6 +107,10 @@ async def test_run_task_prereq_not_met(): @pytest.mark.asyncio async def test_run_task_prereq_met(db_data_creator: DBDataCreator): + """ + When a task pre-requisite is met, the task should be run + And a task entry should be created in the database + """ async def run_task(self, task_id: int) -> TaskOperatorRunInfo: return TaskOperatorRunInfo( @@ -113,12 +119,8 @@ async def run_task(self, task_id: int) -> TaskOperatorRunInfo: linked_url_ids=[1, 2, 3] ) - core = AsyncCore( - adb_client=db_data_creator.adb_client, - task_manager=MagicMock(), - collector_manager=MagicMock() - ) - core.conclude_task = AsyncMock() + core = setup_async_core(db_data_creator.adb_client) + core.task_manager.conclude_task = AsyncMock() mock_operator = AsyncMock() mock_operator.meets_task_prerequisites = AsyncMock( @@ -127,9 +129,10 @@ async def run_task(self, task_id: int) -> TaskOperatorRunInfo: mock_operator.task_type = TaskType.HTML mock_operator.run_task = types.MethodType(run_task, mock_operator) - AsyncCore.get_task_operators = AsyncMock(return_value=[mock_operator]) + core.task_manager.get_task_operators = AsyncMock(return_value=[mock_operator]) await core.run_tasks() + # There should be two calls to meets_task_prerequisites mock_operator.meets_task_prerequisites.assert_has_calls([call(), call()]) results = await db_data_creator.adb_client.get_all(Task) @@ -137,7 +140,7 @@ async def run_task(self, task_id: int) -> TaskOperatorRunInfo: assert len(results) == 1 assert results[0].task_status == BatchStatus.IN_PROCESS.value - core.conclude_task.assert_called_once() + core.task_manager.conclude_task.assert_called_once() @pytest.mark.asyncio async def test_run_task_break_loop(db_data_creator: DBDataCreator): @@ -155,21 +158,17 @@ async def run_task(self, task_id: int) -> TaskOperatorRunInfo: linked_url_ids=[1, 2, 3] ) - core = AsyncCore( - adb_client=db_data_creator.adb_client, - task_manager=MagicMock(), - collector_manager=MagicMock() - ) - core.conclude_task = AsyncMock() + core = setup_async_core(db_data_creator.adb_client) + core.task_manager.conclude_task = AsyncMock() mock_operator = AsyncMock() mock_operator.meets_task_prerequisites = AsyncMock(return_value=True) mock_operator.task_type = TaskType.HTML mock_operator.run_task = types.MethodType(run_task, mock_operator) - AsyncCore.get_task_operators = AsyncMock(return_value=[mock_operator]) - await core.run_tasks() + core.task_manager.get_task_operators = AsyncMock(return_value=[mock_operator]) + await core.task_manager.trigger_task_run() - core.discord_poster.post_to_discord.assert_called_once_with( + core.task_manager.discord_poster.post_to_discord.assert_called_once_with( message="Task HTML has been run more than 20 times in a row. Task loop terminated." ) diff --git a/tests/test_automated/integration/core/test_example_collector_lifecycle.py b/tests/test_automated/integration/core/test_example_collector_lifecycle.py index 064a93a4..abe8fb7a 100644 --- a/tests/test_automated/integration/core/test_example_collector_lifecycle.py +++ b/tests/test_automated/integration/core/test_example_collector_lifecycle.py @@ -1,5 +1,4 @@ import asyncio -import time import pytest diff --git a/tests/test_automated/unit/test_function_trigger.py b/tests/test_automated/unit/test_function_trigger.py new file mode 100644 index 00000000..37b3c948 --- /dev/null +++ b/tests/test_automated/unit/test_function_trigger.py @@ -0,0 +1,67 @@ +import asyncio +from collections import deque + +import pytest + +from core.FunctionTrigger import FunctionTrigger + + +@pytest.mark.asyncio +async def test_single_run(): + calls = [] + + async def task_fn(): + calls.append("run") + await asyncio.sleep(0.01) + + trigger = FunctionTrigger(task_fn) + + await trigger.trigger_or_rerun() + + assert calls == ["run"] + +@pytest.mark.asyncio +async def test_rerun_requested(): + call_log = deque() + + async def task_fn(): + call_log.append("start") + await asyncio.sleep(0.01) + call_log.append("end") + + trigger = FunctionTrigger(task_fn) + + # Start first run + task = asyncio.create_task(trigger.trigger_or_rerun()) + + await asyncio.sleep(0.005) # Ensure it's in the middle of first run + await trigger.trigger_or_rerun() # This should request a rerun + + await task + + # One full loop with rerun should call twice + assert list(call_log) == ["start", "end", "start", "end"] + +@pytest.mark.asyncio +async def test_multiple_quick_triggers_only_rerun_once(): + calls = [] + + async def task_fn(): + calls.append("run") + await asyncio.sleep(0.01) + + trigger = FunctionTrigger(task_fn) + + first = asyncio.create_task(trigger.trigger_or_rerun()) + await asyncio.sleep(0.002) + + # These three should all coalesce into one rerun, not three more + await asyncio.gather( + trigger.trigger_or_rerun(), + trigger.trigger_or_rerun(), + trigger.trigger_or_rerun() + ) + + await first + + assert calls == ["run", "run"] \ No newline at end of file From 24173fb405bc67c367204355ba14d0d9f9cab2b0 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 14 Apr 2025 15:46:31 -0400 Subject: [PATCH 098/244] fix(app): fix import bug --- api/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/api/main.py b/api/main.py index 79e31542..93e4521b 100644 --- a/api/main.py +++ b/api/main.py @@ -1,7 +1,6 @@ from contextlib import asynccontextmanager import uvicorn -from adodbapi.ado_consts import adBSTR from fastapi import FastAPI from api.routes.annotate import annotate_router From f001fb84a5c09e478ea5307dd0a1f1ba07e3c8b4 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 14 Apr 2025 15:48:57 -0400 Subject: [PATCH 099/244] fix(app): fix import bug --- tests/test_automated/integration/api/test_duplicates.py | 2 +- tests/test_automated/integration/api/test_example_collector.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_automated/integration/api/test_duplicates.py b/tests/test_automated/integration/api/test_duplicates.py index a026d6a1..c42b894d 100644 --- a/tests/test_automated/integration/api/test_duplicates.py +++ b/tests/test_automated/integration/api/test_duplicates.py @@ -3,7 +3,7 @@ from collector_db.DTOs.BatchInfo import BatchInfo from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from test_automated.integration.api.conftest import disable_task_trigger +from tests.test_automated.integration.api.conftest import disable_task_trigger def test_duplicates(api_test_helper): diff --git a/tests/test_automated/integration/api/test_example_collector.py b/tests/test_automated/integration/api/test_example_collector.py index 2f05d1d5..48c86145 100644 --- a/tests/test_automated/integration/api/test_example_collector.py +++ b/tests/test_automated/integration/api/test_example_collector.py @@ -9,7 +9,7 @@ from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.enums import BatchStatus -from test_automated.integration.api.conftest import disable_task_trigger +from tests.test_automated.integration.api.conftest import disable_task_trigger def test_example_collector(api_test_helper): From 0dbb987f6a5dd8cef0507cdcadcdcd2ba89efc56 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 14 Apr 2025 16:00:53 -0400 Subject: [PATCH 100/244] fix(tests): comment out inconsistent test --- .../integration/api/test_example_collector.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/test_automated/integration/api/test_example_collector.py b/tests/test_automated/integration/api/test_example_collector.py index 48c86145..acd321c5 100644 --- a/tests/test_automated/integration/api/test_example_collector.py +++ b/tests/test_automated/integration/api/test_example_collector.py @@ -62,13 +62,14 @@ def test_example_collector(api_test_helper): assert bi.user_id is not None # Flush early to ensure logs are written - ath.core.core_logger.flush_all() - - time.sleep(10) - - lr: GetBatchLogsResponse = ath.request_validator.get_batch_logs(batch_id=batch_id) - - assert len(lr.logs) > 0 + # Commented out due to inconsistency in execution + # ath.core.core_logger.flush_all() + # + # time.sleep(10) + # + # lr: GetBatchLogsResponse = ath.request_validator.get_batch_logs(batch_id=batch_id) + # + # assert len(lr.logs) > 0 # Check that task was triggered ath.async_core.collector_manager.\ From afe55d70b1c3a3a828ace44261a9f973e77c8826 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 14 Apr 2025 16:05:08 -0400 Subject: [PATCH 101/244] fix(tests): comment out inconsistent test --- .../integration/api/test_example_collector.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/test_automated/integration/api/test_example_collector.py b/tests/test_automated/integration/api/test_example_collector.py index acd321c5..c99119e7 100644 --- a/tests/test_automated/integration/api/test_example_collector.py +++ b/tests/test_automated/integration/api/test_example_collector.py @@ -105,14 +105,14 @@ def test_example_collector_error(api_test_helper, monkeypatch): assert bi.status == BatchStatus.ERROR - - ath.core.core_logger.flush_all() - - time.sleep(10) - - gbl: GetBatchLogsResponse = ath.request_validator.get_batch_logs(batch_id=batch_id) - assert gbl.logs[-1].log == "Error: Collector failed!" - - + # + # ath.core.core_logger.flush_all() + # + # time.sleep(10) + # + # gbl: GetBatchLogsResponse = ath.request_validator.get_batch_logs(batch_id=batch_id) + # assert gbl.logs[-1].log == "Error: Collector failed!" + # + # From 72caf70625ba664f3ee6982a507a01c0371c72c4 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 14 Apr 2025 18:35:16 -0400 Subject: [PATCH 102/244] feat(app): make logger async --- api/main.py | 14 ++-- collector_db/AsyncDatabaseClient.py | 11 ++- collector_manager/AsyncCollectorBase.py | 12 ++-- collector_manager/AsyncCollectorManager.py | 14 ++-- core/AsyncCoreLogger.py | 71 +++++++++++++++++++ core/SourceCollectorCore.py | 6 +- .../auto_googler/AutoGooglerCollector.py | 2 +- .../muckrock/classes/MuckrockCollector.py | 4 +- .../test_autogoogler_collector.py | 4 +- .../source_collectors/test_ckan_collector.py | 5 +- .../test_common_crawler_collector.py | 3 +- .../test_muckrock_collectors.py | 7 +- .../integration/api/conftest.py | 13 ++-- .../integration/api/test_batch.py | 2 - .../integration/api/test_example_collector.py | 61 ++++++++++------ tests/test_automated/integration/conftest.py | 32 +++++---- .../core/test_example_collector_lifecycle.py | 1 + .../test_autogoogler_collector.py | 3 +- .../source_collectors/test_ckan_collector.py | 3 +- .../test_common_crawl_collector.py | 3 +- .../test_example_collector.py | 7 +- .../test_muckrock_collectors.py | 7 +- 22 files changed, 199 insertions(+), 86 deletions(-) create mode 100644 core/AsyncCoreLogger.py diff --git a/api/main.py b/api/main.py index 93e4521b..19f8de8d 100644 --- a/api/main.py +++ b/api/main.py @@ -14,7 +14,7 @@ from collector_db.DatabaseClient import DatabaseClient from collector_manager.AsyncCollectorManager import AsyncCollectorManager from core.AsyncCore import AsyncCore -from core.CoreLogger import CoreLogger +from core.AsyncCoreLogger import AsyncCoreLogger from core.ScheduledTaskManager import AsyncScheduledTaskManager from core.SourceCollectorCore import SourceCollectorCore from core.TaskManager import TaskManager @@ -32,12 +32,10 @@ async def lifespan(app: FastAPI): db_client = DatabaseClient() adb_client = AsyncDatabaseClient() await setup_database(db_client) - core_logger = CoreLogger(db_client=db_client) + core_logger = AsyncCoreLogger(adb_client=adb_client) + source_collector_core = SourceCollectorCore( - core_logger=CoreLogger( - db_client=db_client - ), db_client=DatabaseClient(), ) task_manager = TaskManager( @@ -68,13 +66,15 @@ async def lifespan(app: FastAPI): app.state.core = source_collector_core app.state.async_core = async_core app.state.async_scheduled_task_manager = async_scheduled_task_manager + app.state.logger = core_logger # Startup logic yield # Code here runs before shutdown # Shutdown logic (if needed) - core_logger.shutdown() - app.state.core.shutdown() + await core_logger.shutdown() + await async_core.shutdown() + source_collector_core.shutdown() # Clean up resources, close connections, etc. pass diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 60fdcdfe..c8315fbe 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -14,6 +14,7 @@ from collector_db.DTOs.BatchInfo import BatchInfo from collector_db.DTOs.DuplicateInfo import DuplicateInsertInfo from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo +from collector_db.DTOs.LogInfo import LogInfo from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType @@ -27,7 +28,7 @@ from collector_db.models import URL, URLErrorInfo, URLHTMLContent, Base, \ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ - UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Duplicate + UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Duplicate, Log from collector_manager.enums import URLStatus, CollectorType from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseInfo @@ -1378,6 +1379,14 @@ async def get_url_info_by_url(self, session: AsyncSession, url: str) -> Optional url = raw_result.scalars().first() return URLInfo(**url.__dict__) + @session_manager + async def insert_logs(self, session, log_infos: List[LogInfo]): + for log_info in log_infos: + log = Log(log=log_info.log, batch_id=log_info.batch_id) + if log_info.created_at is not None: + log.created_at = log_info.created_at + session.add(log) + @session_manager async def insert_duplicates(self, session, duplicate_infos: list[DuplicateInsertInfo]): for duplicate_info in duplicate_infos: diff --git a/collector_manager/AsyncCollectorBase.py b/collector_manager/AsyncCollectorBase.py index ec53f4c6..fe260266 100644 --- a/collector_manager/AsyncCollectorBase.py +++ b/collector_manager/AsyncCollectorBase.py @@ -10,7 +10,7 @@ from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_db.DTOs.LogInfo import LogInfo from collector_manager.enums import CollectorType -from core.CoreLogger import CoreLogger +from core.AsyncCoreLogger import AsyncCoreLogger from core.FunctionTrigger import FunctionTrigger from core.enums import BatchStatus from core.preprocessors.PreprocessorBase import PreprocessorBase @@ -25,7 +25,7 @@ def __init__( self, batch_id: int, dto: BaseModel, - logger: CoreLogger, + logger: AsyncCoreLogger, adb_client: AsyncDatabaseClient, raise_error: bool = False, post_collection_function_trigger: Optional[FunctionTrigger] = None, @@ -120,8 +120,12 @@ async def run(self) -> None: self.status = BatchStatus.ERROR await self.handle_error(e) - async def log(self, message: str, allow_abort = True) -> None: - self.logger.log(LogInfo( + async def log( + self, + message: str, + allow_abort = True # Deprecated + ) -> None: + await self.logger.log(LogInfo( batch_id=self.batch_id, log=message )) diff --git a/collector_manager/AsyncCollectorManager.py b/collector_manager/AsyncCollectorManager.py index bf338c88..1851bfc9 100644 --- a/collector_manager/AsyncCollectorManager.py +++ b/collector_manager/AsyncCollectorManager.py @@ -10,7 +10,7 @@ from collector_manager.CollectorManager import InvalidCollectorError from collector_manager.collector_mapping import COLLECTOR_MAPPING from collector_manager.enums import CollectorType -from core.CoreLogger import CoreLogger +from core.AsyncCoreLogger import AsyncCoreLogger from core.FunctionTrigger import FunctionTrigger @@ -18,7 +18,7 @@ class AsyncCollectorManager: def __init__( self, - logger: CoreLogger, + logger: AsyncCoreLogger, adb_client: AsyncDatabaseClient, dev_mode: bool = False, post_collection_function_trigger: FunctionTrigger = None @@ -79,10 +79,16 @@ async def abort_collector_async(self, cid: int) -> None: self.async_tasks.pop(cid) async def shutdown_all_collectors(self) -> None: - for cid, task in self.async_tasks.items(): + while self.async_tasks: + cid, task = self.async_tasks.popitem() if task.done(): try: task.result() except Exception as e: raise e - await self.abort_collector_async(cid) \ No newline at end of file + else: + task.cancel() + try: + await task # Await so cancellation propagates + except asyncio.CancelledError: + pass \ No newline at end of file diff --git a/core/AsyncCoreLogger.py b/core/AsyncCoreLogger.py new file mode 100644 index 00000000..70ca06aa --- /dev/null +++ b/core/AsyncCoreLogger.py @@ -0,0 +1,71 @@ +import asyncio + +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_db.DTOs.LogInfo import LogInfo + + +class AsyncCoreLogger: + def __init__( + self, + adb_client: AsyncDatabaseClient, + flush_interval: float = 10, + batch_size: int = 100 + ): + self.adb_client = adb_client + self.flush_interval = flush_interval + self.batch_size = batch_size + + self.log_queue = asyncio.Queue() + self.lock = asyncio.Lock() + self._flush_task: asyncio.Task | None = None + self._stop_event = asyncio.Event() + + async def __aenter__(self): + self._stop_event.clear() + self._flush_task = asyncio.create_task(self._flush_logs()) + return self + + async def __aexit__(self, exc_type, exc_value, traceback): + await self.shutdown() + + async def log(self, log_info: LogInfo): + await self.log_queue.put(log_info) + + async def _flush_logs(self): + while not self._stop_event.is_set(): + await asyncio.sleep(self.flush_interval) + await self.flush() + + async def flush(self): + async with self.lock: + logs: list[LogInfo] = [] + + while not self.log_queue.empty() and len(logs) < self.batch_size: + try: + log = self.log_queue.get_nowait() + logs.append(log) + except asyncio.QueueEmpty: + break + + if logs: + await self.adb_client.insert_logs(log_infos=logs) + + async def clear_log_queue(self): + while not self.log_queue.empty(): + self.log_queue.get_nowait() + + async def flush_all(self): + while not self.log_queue.empty(): + await self.flush() + + async def restart(self): + await self.flush_all() + await self.shutdown() + self._stop_event.clear() + self._flush_task = asyncio.create_task(self._flush_logs()) + + async def shutdown(self): + self._stop_event.set() + if self._flush_task: + await self._flush_task + await self.flush_all() diff --git a/core/SourceCollectorCore.py b/core/SourceCollectorCore.py index a0bb34fc..8002717c 100644 --- a/core/SourceCollectorCore.py +++ b/core/SourceCollectorCore.py @@ -3,7 +3,6 @@ from collector_db.DatabaseClient import DatabaseClient from collector_manager.enums import CollectorType -from core.CoreLogger import CoreLogger from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse @@ -14,13 +13,12 @@ class SourceCollectorCore: def __init__( self, - core_logger: CoreLogger, - collector_manager: Optional[Any] = None, + core_logger: Optional[Any] = None, # Deprecated + collector_manager: Optional[Any] = None, # Deprecated db_client: DatabaseClient = DatabaseClient(), dev_mode: bool = False ): self.db_client = db_client - self.core_logger = core_logger if not dev_mode: self.scheduled_task_manager = ScheduledTaskManager(db_client=db_client) else: diff --git a/source_collectors/auto_googler/AutoGooglerCollector.py b/source_collectors/auto_googler/AutoGooglerCollector.py index b678f066..1748d911 100644 --- a/source_collectors/auto_googler/AutoGooglerCollector.py +++ b/source_collectors/auto_googler/AutoGooglerCollector.py @@ -27,7 +27,7 @@ async def run_to_completion(self) -> AutoGoogler: ) ) async for log in auto_googler.run(): - self.log(log) + await self.log(log) return auto_googler async def run_implementation(self) -> None: diff --git a/source_collectors/muckrock/classes/MuckrockCollector.py b/source_collectors/muckrock/classes/MuckrockCollector.py index 885c0369..0511a21d 100644 --- a/source_collectors/muckrock/classes/MuckrockCollector.py +++ b/source_collectors/muckrock/classes/MuckrockCollector.py @@ -47,9 +47,9 @@ async def run_implementation(self) -> None: self.check_for_count_break(results_count, max_count) except SearchCompleteException: break - self.log(f"Search {search_count}: Found {len(results)} results") + await self.log(f"Search {search_count}: Found {len(results)} results") - self.log(f"Search Complete. Total results: {results_count}") + await self.log(f"Search Complete. Total results: {results_count}") self.data = {"urls": self.format_results(all_results)} def format_results(self, results: list[dict]) -> list[dict]: diff --git a/tests/manual/source_collectors/test_autogoogler_collector.py b/tests/manual/source_collectors/test_autogoogler_collector.py index 78fc46d7..a51fc883 100644 --- a/tests/manual/source_collectors/test_autogoogler_collector.py +++ b/tests/manual/source_collectors/test_autogoogler_collector.py @@ -3,7 +3,7 @@ import pytest from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DatabaseClient import DatabaseClient +from core.AsyncCoreLogger import AsyncCoreLogger from core.CoreLogger import CoreLogger from source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector from source_collectors.auto_googler.DTOs import AutoGooglerInputDTO @@ -16,7 +16,7 @@ async def test_autogoogler_collector(): urls_per_result=5, queries=["police"], ), - logger = MagicMock(spec=CoreLogger), + logger = AsyncMock(spec=AsyncCoreLogger), adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) diff --git a/tests/manual/source_collectors/test_ckan_collector.py b/tests/manual/source_collectors/test_ckan_collector.py index 3bae5d88..f642fd8d 100644 --- a/tests/manual/source_collectors/test_ckan_collector.py +++ b/tests/manual/source_collectors/test_ckan_collector.py @@ -5,6 +5,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DatabaseClient import DatabaseClient +from core.AsyncCoreLogger import AsyncCoreLogger from core.CoreLogger import CoreLogger from source_collectors.ckan.CKANCollector import CKANCollector from source_collectors.ckan.DTOs import CKANInputDTO @@ -31,7 +32,7 @@ async def test_ckan_collector_default(): "organization_search": organization_search } ), - logger=MagicMock(spec=CoreLogger), + logger=AsyncMock(spec=AsyncCoreLogger), adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) @@ -80,7 +81,7 @@ async def test_ckan_collector_custom(): ] } ), - logger=MagicMock(spec=CoreLogger), + logger=AsyncMock(spec=AsyncCoreLogger), adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) diff --git a/tests/manual/source_collectors/test_common_crawler_collector.py b/tests/manual/source_collectors/test_common_crawler_collector.py index 6c9771f3..872b7710 100644 --- a/tests/manual/source_collectors/test_common_crawler_collector.py +++ b/tests/manual/source_collectors/test_common_crawler_collector.py @@ -5,6 +5,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DatabaseClient import DatabaseClient +from core.AsyncCoreLogger import AsyncCoreLogger from core.CoreLogger import CoreLogger from source_collectors.common_crawler.CommonCrawlerCollector import CommonCrawlerCollector from source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO @@ -18,7 +19,7 @@ async def test_common_crawler_collector(): collector = CommonCrawlerCollector( batch_id=1, dto=CommonCrawlerInputDTO(), - logger=MagicMock(spec=CoreLogger), + logger=AsyncMock(spec=AsyncCoreLogger), adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) diff --git a/tests/manual/source_collectors/test_muckrock_collectors.py b/tests/manual/source_collectors/test_muckrock_collectors.py index 8fb80bc4..bfd0ba26 100644 --- a/tests/manual/source_collectors/test_muckrock_collectors.py +++ b/tests/manual/source_collectors/test_muckrock_collectors.py @@ -3,6 +3,7 @@ import pytest from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from core.AsyncCoreLogger import AsyncCoreLogger from core.CoreLogger import CoreLogger from source_collectors.muckrock.DTOs import MuckrockSimpleSearchCollectorInputDTO, \ MuckrockCountySearchCollectorInputDTO, MuckrockAllFOIARequestsCollectorInputDTO @@ -22,7 +23,7 @@ async def test_muckrock_simple_search_collector(): search_string="police", max_results=10 ), - logger=MagicMock(spec=CoreLogger), + logger=AsyncMock(spec=AsyncCoreLogger), adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) @@ -41,7 +42,7 @@ async def test_muckrock_county_level_search_collector(): parent_jurisdiction_id=ALLEGHENY_COUNTY_MUCKROCK_ID, town_names=ALLEGHENY_COUNTY_TOWN_NAMES ), - logger=MagicMock(spec=CoreLogger), + logger=AsyncMock(spec=AsyncCoreLogger), adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) @@ -61,7 +62,7 @@ async def test_muckrock_full_search_collector(): start_page=1, total_pages=2 ), - logger=MagicMock(spec=CoreLogger), + logger=AsyncMock(spec=AsyncCoreLogger), adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) diff --git a/tests/test_automated/integration/api/conftest.py b/tests/test_automated/integration/api/conftest.py index e51b05dc..b466bfbb 100644 --- a/tests/test_automated/integration/api/conftest.py +++ b/tests/test_automated/integration/api/conftest.py @@ -6,10 +6,12 @@ from unittest.mock import MagicMock, AsyncMock import pytest +import pytest_asyncio from starlette.testclient import TestClient from api.main import app from core.AsyncCore import AsyncCore +from core.AsyncCoreLogger import AsyncCoreLogger from core.SourceCollectorCore import SourceCollectorCore from security_manager.SecurityManager import get_access_info, AccessInfo, Permissions from tests.helpers.DBDataCreator import DBDataCreator @@ -51,7 +53,6 @@ def client() -> Generator[TestClient, None, None]: os.environ["DISCORD_WEBHOOK_URL"] = "https://discord.com" with TestClient(app) as c: app.dependency_overrides[get_access_info] = override_access_info - core: SourceCollectorCore = c.app.state.core async_core: AsyncCore = c.app.state.async_core # Interfaces to the web should be mocked @@ -63,17 +64,16 @@ def client() -> Generator[TestClient, None, None]: task_manager.logger.disabled = True # Set trigger to fail immediately if called, to force it to be manually specified in tests task_manager.task_trigger._func = fail_task_trigger - # core.shutdown() yield c - core.shutdown() + # Reset environment variables back to original state os.environ.clear() os.environ.update(_original_env) -@pytest.fixture -def api_test_helper(client: TestClient, db_data_creator, monkeypatch) -> APITestHelper: - return APITestHelper( +@pytest_asyncio.fixture +async def api_test_helper(client: TestClient, db_data_creator, monkeypatch) -> APITestHelper: + yield APITestHelper( request_validator=RequestValidator(client=client), core=client.app.state.core, async_core=client.app.state.async_core, @@ -81,3 +81,4 @@ def api_test_helper(client: TestClient, db_data_creator, monkeypatch) -> APITest mock_huggingface_interface=MagicMock(), mock_label_studio_interface=MagicMock() ) + await client.app.state.async_core.collector_manager.logger.clear_log_queue() diff --git a/tests/test_automated/integration/api/test_batch.py b/tests/test_automated/integration/api/test_batch.py index 69c2fcab..604e2d67 100644 --- a/tests/test_automated/integration/api/test_batch.py +++ b/tests/test_automated/integration/api/test_batch.py @@ -20,8 +20,6 @@ def test_abort_batch(api_test_helper): assert response.message == "Batch aborted." - time.sleep(3) - bi: BatchInfo = ath.request_validator.get_batch_info(batch_id=batch_id) assert bi.status == BatchStatus.ABORTED diff --git a/tests/test_automated/integration/api/test_example_collector.py b/tests/test_automated/integration/api/test_example_collector.py index c99119e7..a235d8e8 100644 --- a/tests/test_automated/integration/api/test_example_collector.py +++ b/tests/test_automated/integration/api/test_example_collector.py @@ -1,10 +1,15 @@ +import asyncio import time -from unittest.mock import MagicMock +from unittest.mock import MagicMock, AsyncMock +import pytest + +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.BatchInfo import BatchInfo from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.ExampleCollector import ExampleCollector from collector_manager.enums import CollectorType +from core.AsyncCoreLogger import AsyncCoreLogger from core.DTOs.BatchStatusInfo import BatchStatusInfo from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse @@ -12,12 +17,17 @@ from tests.test_automated.integration.api.conftest import disable_task_trigger -def test_example_collector(api_test_helper): +@pytest.mark.asyncio +async def test_example_collector(api_test_helper): ath = api_test_helper # Temporarily disable task trigger disable_task_trigger(ath) + logger = AsyncCoreLogger(adb_client=AsyncDatabaseClient()) + await logger.__aenter__() + ath.async_core.collector_manager.logger = logger + dto = ExampleInputDTO( sleep_time=1 ) @@ -40,7 +50,7 @@ def test_example_collector(api_test_helper): assert bsi.strategy == CollectorType.EXAMPLE.value assert bsi.status == BatchStatus.IN_PROCESS - time.sleep(2) + await asyncio.sleep(2) csr: GetBatchStatusResponse = ath.request_validator.get_batch_statuses( collector_type=CollectorType.EXAMPLE, @@ -62,29 +72,33 @@ def test_example_collector(api_test_helper): assert bi.user_id is not None # Flush early to ensure logs are written - # Commented out due to inconsistency in execution - # ath.core.core_logger.flush_all() - # - # time.sleep(10) - # - # lr: GetBatchLogsResponse = ath.request_validator.get_batch_logs(batch_id=batch_id) - # - # assert len(lr.logs) > 0 + await logger.flush_all() + + + lr: GetBatchLogsResponse = ath.request_validator.get_batch_logs(batch_id=batch_id) + + assert len(lr.logs) > 0 # Check that task was triggered ath.async_core.collector_manager.\ post_collection_function_trigger.\ trigger_or_rerun.assert_called_once() + await logger.__aexit__(None, None, None) -def test_example_collector_error(api_test_helper, monkeypatch): +@pytest.mark.asyncio +async def test_example_collector_error(api_test_helper, monkeypatch): """ Test that when an error occurs in a collector, the batch is properly update """ ath = api_test_helper + logger = AsyncCoreLogger(adb_client=AsyncDatabaseClient()) + await logger.__aenter__() + ath.async_core.collector_manager.logger = logger + # Patch the collector to raise an exception during run_implementation - mock = MagicMock() + mock = AsyncMock() mock.side_effect = Exception("Collector failed!") monkeypatch.setattr(ExampleCollector, 'run_implementation', mock) @@ -99,20 +113,21 @@ def test_example_collector_error(api_test_helper, monkeypatch): assert batch_id is not None assert data["message"] == "Started example collector." - time.sleep(1) + await asyncio.sleep(1) bi: BatchInfo = ath.request_validator.get_batch_info(batch_id=batch_id) assert bi.status == BatchStatus.ERROR - # - # ath.core.core_logger.flush_all() - # - # time.sleep(10) - # - # gbl: GetBatchLogsResponse = ath.request_validator.get_batch_logs(batch_id=batch_id) - # assert gbl.logs[-1].log == "Error: Collector failed!" - # - # + # Check there are logs + assert not logger.log_queue.empty() + await logger.flush_all() + assert logger.log_queue.empty() + + gbl: GetBatchLogsResponse = ath.request_validator.get_batch_logs(batch_id=batch_id) + assert gbl.logs[-1].log == "Error: Collector failed!" + await logger.__aexit__(None, None, None) + + diff --git a/tests/test_automated/integration/conftest.py b/tests/test_automated/integration/conftest.py index cd05cf6f..6be03e86 100644 --- a/tests/test_automated/integration/conftest.py +++ b/tests/test_automated/integration/conftest.py @@ -5,6 +5,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_manager.AsyncCollectorManager import AsyncCollectorManager from core.AsyncCore import AsyncCore +from core.AsyncCoreLogger import AsyncCoreLogger from core.CoreLogger import CoreLogger from core.SourceCollectorCore import SourceCollectorCore @@ -24,19 +25,20 @@ def test_core(db_client_test): @pytest.fixture -def test_async_core(db_client_test): - with CoreLogger( - db_client=db_client_test - ) as logger: - adb_client = AsyncDatabaseClient() - core = AsyncCore( +def test_async_core(adb_client_test): + logger = AsyncCoreLogger( + adb_client=adb_client_test + ) + adb_client = AsyncDatabaseClient() + core = AsyncCore( + adb_client=adb_client, + task_manager=MagicMock(), + collector_manager=AsyncCollectorManager( adb_client=adb_client, - task_manager=MagicMock(), - collector_manager=AsyncCollectorManager( - adb_client=adb_client, - logger=logger, - dev_mode=True - ), - ) - yield core - core.shutdown() \ No newline at end of file + logger=logger, + dev_mode=True + ), + ) + yield core + core.shutdown() + logger.shutdown() \ No newline at end of file diff --git a/tests/test_automated/integration/core/test_example_collector_lifecycle.py b/tests/test_automated/integration/core/test_example_collector_lifecycle.py index abe8fb7a..d3f3f855 100644 --- a/tests/test_automated/integration/core/test_example_collector_lifecycle.py +++ b/tests/test_automated/integration/core/test_example_collector_lifecycle.py @@ -39,6 +39,7 @@ async def test_example_collector_lifecycle( assert core.get_status(batch_id) == BatchStatus.IN_PROCESS print("Sleeping for 1.5 seconds...") await asyncio.sleep(1.5) + await acore.collector_manager.logger.flush_all() print("Done sleeping...") assert core.get_status(batch_id) == BatchStatus.COMPLETE diff --git a/tests/test_automated/unit/source_collectors/test_autogoogler_collector.py b/tests/test_automated/unit/source_collectors/test_autogoogler_collector.py index 050b1299..2349afe2 100644 --- a/tests/test_automated/unit/source_collectors/test_autogoogler_collector.py +++ b/tests/test_automated/unit/source_collectors/test_autogoogler_collector.py @@ -5,6 +5,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLInfo import URLInfo from collector_db.DatabaseClient import DatabaseClient +from core.AsyncCoreLogger import AsyncCoreLogger from core.CoreLogger import CoreLogger from source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector from source_collectors.auto_googler.DTOs import GoogleSearchQueryResultsInnerDTO, AutoGooglerInputDTO @@ -29,7 +30,7 @@ async def test_auto_googler_collector(patch_get_query_results): dto=AutoGooglerInputDTO( queries=["keyword"] ), - logger=AsyncMock(spec=CoreLogger), + logger=AsyncMock(spec=AsyncCoreLogger), adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) diff --git a/tests/test_automated/unit/source_collectors/test_ckan_collector.py b/tests/test_automated/unit/source_collectors/test_ckan_collector.py index b00ed434..ef7dbee8 100644 --- a/tests/test_automated/unit/source_collectors/test_ckan_collector.py +++ b/tests/test_automated/unit/source_collectors/test_ckan_collector.py @@ -6,6 +6,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DatabaseClient import DatabaseClient +from core.AsyncCoreLogger import AsyncCoreLogger from core.CoreLogger import CoreLogger from source_collectors.ckan.CKANCollector import CKANCollector from source_collectors.ckan.DTOs import CKANInputDTO @@ -42,7 +43,7 @@ async def test_ckan_collector(mock_ckan_collector_methods): collector = CKANCollector( batch_id=1, dto=CKANInputDTO(), - logger=MagicMock(spec=CoreLogger), + logger=AsyncMock(spec=AsyncCoreLogger), adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) diff --git a/tests/test_automated/unit/source_collectors/test_common_crawl_collector.py b/tests/test_automated/unit/source_collectors/test_common_crawl_collector.py index 74fe1052..d1f0ccda 100644 --- a/tests/test_automated/unit/source_collectors/test_common_crawl_collector.py +++ b/tests/test_automated/unit/source_collectors/test_common_crawl_collector.py @@ -5,6 +5,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLInfo import URLInfo from collector_db.DatabaseClient import DatabaseClient +from core.AsyncCoreLogger import AsyncCoreLogger from core.CoreLogger import CoreLogger from source_collectors.common_crawler.CommonCrawlerCollector import CommonCrawlerCollector from source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO @@ -31,7 +32,7 @@ async def test_common_crawl_collector(mock_get_common_crawl_search_results): dto=CommonCrawlerInputDTO( search_term="keyword", ), - logger=mock.MagicMock(spec=CoreLogger), + logger=mock.AsyncMock(spec=AsyncCoreLogger), adb_client=mock.AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) diff --git a/tests/test_automated/unit/source_collectors/test_example_collector.py b/tests/test_automated/unit/source_collectors/test_example_collector.py index 17512a6f..26ca601d 100644 --- a/tests/test_automated/unit/source_collectors/test_example_collector.py +++ b/tests/test_automated/unit/source_collectors/test_example_collector.py @@ -1,8 +1,9 @@ -from unittest.mock import MagicMock +from unittest.mock import MagicMock, AsyncMock from collector_db.DatabaseClient import DatabaseClient from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.ExampleCollector import ExampleCollector +from core.AsyncCoreLogger import AsyncCoreLogger from core.CoreLogger import CoreLogger @@ -12,8 +13,8 @@ def test_example_collector(): dto=ExampleInputDTO( sleep_time=1 ), - logger=MagicMock(spec=CoreLogger), - adb_client=MagicMock(spec=DatabaseClient), + logger=AsyncMock(spec=AsyncCoreLogger), + adb_client=AsyncMock(spec=DatabaseClient), raise_error=True ) collector.run() \ No newline at end of file diff --git a/tests/test_automated/unit/source_collectors/test_muckrock_collectors.py b/tests/test_automated/unit/source_collectors/test_muckrock_collectors.py index f74c651e..7e533efa 100644 --- a/tests/test_automated/unit/source_collectors/test_muckrock_collectors.py +++ b/tests/test_automated/unit/source_collectors/test_muckrock_collectors.py @@ -6,6 +6,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLInfo import URLInfo from collector_db.DatabaseClient import DatabaseClient +from core.AsyncCoreLogger import AsyncCoreLogger from core.CoreLogger import CoreLogger from source_collectors.muckrock.DTOs import MuckrockSimpleSearchCollectorInputDTO, \ MuckrockCountySearchCollectorInputDTO, MuckrockAllFOIARequestsCollectorInputDTO @@ -40,7 +41,7 @@ async def test_muckrock_simple_collector(patch_muckrock_fetcher): search_string="keyword", max_results=2 ), - logger=mock.MagicMock(spec=CoreLogger), + logger=mock.AsyncMock(spec=AsyncCoreLogger), adb_client=mock.AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) @@ -97,7 +98,7 @@ async def test_muckrock_county_search_collector(patch_muckrock_county_level_sear parent_jurisdiction_id=1, town_names=["test"] ), - logger=MagicMock(spec=CoreLogger), + logger=AsyncMock(spec=AsyncCoreLogger), adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) @@ -166,7 +167,7 @@ async def test_muckrock_all_foia_requests_collector(patch_muckrock_full_search_c start_page=1, total_pages=2 ), - logger=MagicMock(spec=CoreLogger), + logger=AsyncMock(spec=AsyncCoreLogger), adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) From 5b3658fd1e7092a250d89a5ce186c9e1d6f13084 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 14 Apr 2025 19:26:05 -0400 Subject: [PATCH 103/244] feat(app): add task status endpoint --- api/routes/task.py | 11 ++++++++++- collector_db/DTOs/GetTaskStatusResponseInfo.py | 7 +++++++ collector_db/enums.py | 1 + core/AsyncCore.py | 3 +++ core/TaskManager.py | 10 ++++++++-- core/classes/URLHTMLTaskOperator.py | 1 - .../integration/api/helpers/RequestValidator.py | 9 ++++++++- tests/test_automated/integration/api/test_task.py | 14 ++++++++++++++ 8 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 collector_db/DTOs/GetTaskStatusResponseInfo.py diff --git a/api/routes/task.py b/api/routes/task.py index d9cdbeac..44971959 100644 --- a/api/routes/task.py +++ b/api/routes/task.py @@ -3,6 +3,7 @@ from fastapi import APIRouter, Depends, Query, Path from api.dependencies import get_async_core +from collector_db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.enums import TaskType from core.AsyncCore import AsyncCore @@ -39,6 +40,12 @@ async def get_tasks( task_status=task_status ) +@task_router.get("/status") +async def get_task_status( + async_core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info) +) -> GetTaskStatusResponseInfo: + return await async_core.get_current_task_status() @task_router.get("/{task_id}") async def get_task_info( @@ -46,4 +53,6 @@ async def get_task_info( async_core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info) ) -> TaskInfo: - return await async_core.get_task_info(task_id) \ No newline at end of file + return await async_core.get_task_info(task_id) + + diff --git a/collector_db/DTOs/GetTaskStatusResponseInfo.py b/collector_db/DTOs/GetTaskStatusResponseInfo.py new file mode 100644 index 00000000..f6a8d5fc --- /dev/null +++ b/collector_db/DTOs/GetTaskStatusResponseInfo.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel + +from collector_db.enums import TaskType + + +class GetTaskStatusResponseInfo(BaseModel): + status: TaskType \ No newline at end of file diff --git a/collector_db/enums.py b/collector_db/enums.py index 0dd956c5..c12cfde0 100644 --- a/collector_db/enums.py +++ b/collector_db/enums.py @@ -38,6 +38,7 @@ class TaskType(PyEnum): RECORD_TYPE = "Record Type" AGENCY_IDENTIFICATION = "Agency Identification" MISC_METADATA = "Misc Metadata" + IDLE = "Idle" class PGEnum(TypeDecorator): impl = postgresql.ENUM diff --git a/core/AsyncCore.py b/core/AsyncCore.py index b17903db..299a865e 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -4,6 +4,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.BatchInfo import BatchInfo +from collector_db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo from collector_db.enums import TaskType from collector_manager.AsyncCollectorManager import AsyncCollectorManager from collector_manager.enums import CollectorType @@ -87,6 +88,8 @@ async def initiate_collector( ) # endregion + async def get_current_task_status(self) -> GetTaskStatusResponseInfo: + return GetTaskStatusResponseInfo(status=self.task_manager.task_status) async def run_tasks(self): await self.task_manager.trigger_task_run() diff --git a/core/TaskManager.py b/core/TaskManager.py index 8ec259f5..64aa57e6 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -1,4 +1,5 @@ import logging +from typing import Optional from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface from collector_db.AsyncDatabaseClient import AsyncDatabaseClient @@ -44,12 +45,12 @@ def __init__( self.logger.addHandler(logging.StreamHandler()) self.logger.setLevel(logging.INFO) self.task_trigger = FunctionTrigger(self.run_tasks) + self.task_status: TaskType = TaskType.IDLE #region Task Operators async def get_url_html_task_operator(self): - self.logger.info("Running URL HTML Task") operator = URLHTMLTaskOperator( adb_client=self.adb_client, url_request_interface=self.url_request_interface, @@ -58,7 +59,6 @@ async def get_url_html_task_operator(self): return operator async def get_url_relevance_huggingface_task_operator(self): - self.logger.info("Running URL Relevance Huggingface Task") operator = URLRelevanceHuggingfaceTaskOperator( adb_client=self.adb_client, huggingface_interface=self.huggingface_interface @@ -106,13 +106,18 @@ async def get_task_operators(self) -> list[TaskOperatorBase]: #endregion #region Tasks + async def set_task_status(self, task_type: TaskType): + self.task_status = task_type + async def run_tasks(self): operators = await self.get_task_operators() count = 0 for operator in operators: + await self.set_task_status(task_type=operator.task_type) meets_prereq = await operator.meets_task_prerequisites() while meets_prereq: + print(f"Running {operator.task_type.value} Task") if count > TASK_REPEAT_THRESHOLD: self.discord_poster.post_to_discord( message=f"Task {operator.task_type.value} has been run" @@ -124,6 +129,7 @@ async def run_tasks(self): await self.conclude_task(run_info) count += 1 meets_prereq = await operator.meets_task_prerequisites() + await self.set_task_status(task_type=TaskType.IDLE) async def trigger_task_run(self): await self.task_trigger.trigger_or_rerun() diff --git a/core/classes/URLHTMLTaskOperator.py b/core/classes/URLHTMLTaskOperator.py index 63321635..ad279f9d 100644 --- a/core/classes/URLHTMLTaskOperator.py +++ b/core/classes/URLHTMLTaskOperator.py @@ -29,7 +29,6 @@ async def meets_task_prerequisites(self): return await self.adb_client.has_pending_urls_without_html_data() async def inner_task_logic(self): - print("Running URL HTML Task...") tdos = await self.get_pending_urls_without_html_data() url_ids = [task_info.url_info.id for task_info in tdos] await self.link_urls_to_task(url_ids=url_ids) diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index 02a51b29..f8ada6ae 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -5,6 +5,7 @@ from starlette.testclient import TestClient from collector_db.DTOs.BatchInfo import BatchInfo +from collector_db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.enums import TaskType from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO @@ -281,4 +282,10 @@ async def reject_and_get_next_source_for_review( url=f"/review/reject-source", json=review_info.model_dump(mode='json') ) - return GetNextURLForFinalReviewOuterResponse(**data) \ No newline at end of file + return GetNextURLForFinalReviewOuterResponse(**data) + + async def get_current_task_status(self) -> GetTaskStatusResponseInfo: + data = self.get( + url=f"/task/status" + ) + return GetTaskStatusResponseInfo(**data) \ No newline at end of file diff --git a/tests/test_automated/integration/api/test_task.py b/tests/test_automated/integration/api/test_task.py index d6e13b1f..547b0eb8 100644 --- a/tests/test_automated/integration/api/test_task.py +++ b/tests/test_automated/integration/api/test_task.py @@ -39,3 +39,17 @@ async def test_get_tasks(api_test_helper): assert task.type == TaskType.HTML assert task.url_count == 3 assert task.url_error_count == 1 + +@pytest.mark.asyncio +async def test_get_task_status(api_test_helper): + ath = api_test_helper + + response = await ath.request_validator.get_current_task_status() + + assert response.status == TaskType.IDLE + + for task in [task for task in TaskType]: + await ath.async_core.task_manager.set_task_status(task) + response = await ath.request_validator.get_current_task_status() + + assert response.status == task From 07a4a09a2a8a404cc69349404a3a36aa641bd9b3 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 14 Apr 2025 20:36:17 -0400 Subject: [PATCH 104/244] feat(app): add task status endpoint --- collector_db/StatementComposer.py | 21 +++++++++++++------ security_manager/SecurityManager.py | 1 - .../integration/api/test_example_collector.py | 4 ++-- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index b2b7e706..a84df5a1 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -3,10 +3,11 @@ from sqlalchemy import Select, select, exists, Table, func, Subquery, and_ from sqlalchemy.orm import aliased -from collector_db.enums import URLMetadataAttributeType, ValidationStatus +from collector_db.enums import URLMetadataAttributeType, ValidationStatus, TaskType from collector_db.models import URL, URLHTMLContent, AutomatedUrlAgencySuggestion, URLOptionalDataSourceMetadata, Batch, \ - ConfirmedURLAgency + ConfirmedURLAgency, LinkTaskURL, Task from collector_manager.enums import URLStatus, CollectorType +from core.enums import BatchStatus class StatementComposer: @@ -16,11 +17,19 @@ class StatementComposer: @staticmethod def pending_urls_without_html_data() -> Select: - return (select(URL). - outerjoin(URLHTMLContent). - where(URLHTMLContent.id == None). - where(URL.outcome == URLStatus.PENDING.value)) + subquery = (select(1). + select_from(LinkTaskURL). + join(Task, LinkTaskURL.task_id == Task.id). + where(LinkTaskURL.url_id == URL.id). + where(Task.task_type == TaskType.HTML.value). + where(Task.task_status == BatchStatus.COMPLETE.value) + ) + query = select(URL).where( + ~exists(subquery) + ) + + return query @staticmethod diff --git a/security_manager/SecurityManager.py b/security_manager/SecurityManager.py index 8d80f46c..18bc6a26 100644 --- a/security_manager/SecurityManager.py +++ b/security_manager/SecurityManager.py @@ -39,7 +39,6 @@ def __init__( def validate_token(self, token: str) -> AccessInfo: try: payload = jwt.decode(token, self.secret_key, algorithms=[ALGORITHM]) - print(payload) return self.payload_to_access_info(payload) except InvalidTokenError as e: raise HTTPException( diff --git a/tests/test_automated/integration/api/test_example_collector.py b/tests/test_automated/integration/api/test_example_collector.py index a235d8e8..d1466c8c 100644 --- a/tests/test_automated/integration/api/test_example_collector.py +++ b/tests/test_automated/integration/api/test_example_collector.py @@ -24,7 +24,7 @@ async def test_example_collector(api_test_helper): # Temporarily disable task trigger disable_task_trigger(ath) - logger = AsyncCoreLogger(adb_client=AsyncDatabaseClient()) + logger = AsyncCoreLogger(adb_client=AsyncDatabaseClient(), flush_interval=1) await logger.__aenter__() ath.async_core.collector_manager.logger = logger @@ -93,7 +93,7 @@ async def test_example_collector_error(api_test_helper, monkeypatch): """ ath = api_test_helper - logger = AsyncCoreLogger(adb_client=AsyncDatabaseClient()) + logger = AsyncCoreLogger(adb_client=AsyncDatabaseClient(), flush_interval=1) await logger.__aenter__() ath.async_core.collector_manager.logger = logger From 43f91784ab38556d12c5ecf737802a006290995a Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 14 Apr 2025 20:46:21 -0400 Subject: [PATCH 105/244] fix(app): fix bug with task repetition count --- core/TaskManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/TaskManager.py b/core/TaskManager.py index 64aa57e6..1440df89 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -111,8 +111,8 @@ async def set_task_status(self, task_type: TaskType): async def run_tasks(self): operators = await self.get_task_operators() - count = 0 for operator in operators: + count = 0 await self.set_task_status(task_type=operator.task_type) meets_prereq = await operator.meets_task_prerequisites() From c84a7bd9bfeca9f85832235df7360271a406e846 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 14 Apr 2025 21:27:31 -0400 Subject: [PATCH 106/244] fix(app): temporarily disable HTML Task Operator --- core/TaskManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/TaskManager.py b/core/TaskManager.py index 1440df89..21698156 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -96,7 +96,7 @@ async def get_url_miscellaneous_metadata_task_operator(self): async def get_task_operators(self) -> list[TaskOperatorBase]: return [ - await self.get_url_html_task_operator(), + # await self.get_url_html_task_operator(), await self.get_url_relevance_huggingface_task_operator(), await self.get_url_record_type_task_operator(), await self.get_agency_identification_task_operator(), From a4f3be78b41ddd96e96e4225c1509988569b12fc Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 15 Apr 2025 07:26:37 -0400 Subject: [PATCH 107/244] fix(app): fix bug with task repeating Also set it up so that if task errors out, it does not repeat, and logs to discord. --- collector_db/StatementComposer.py | 12 ++- core/CoreLogger.py | 97 ------------------- core/TaskManager.py | 6 +- .../test_autogoogler_collector.py | 1 - .../source_collectors/test_ckan_collector.py | 2 - .../test_common_crawler_collector.py | 2 - .../test_muckrock_collectors.py | 1 - tests/test_automated/integration/conftest.py | 17 ++-- .../integration/core/test_core_logger.py | 66 ------------- .../unit/collector_manager/__init__.py | 0 .../test_collector_manager.py | 0 .../unit/core/test_core_logger.py | 96 ++++-------------- .../test_autogoogler_collector.py | 2 - .../source_collectors/test_ckan_collector.py | 2 - .../test_common_crawl_collector.py | 2 - .../test_example_collector.py | 3 +- .../test_muckrock_collectors.py | 2 - 17 files changed, 39 insertions(+), 272 deletions(-) delete mode 100644 core/CoreLogger.py delete mode 100644 tests/test_automated/integration/core/test_core_logger.py delete mode 100644 tests/test_automated/unit/collector_manager/__init__.py delete mode 100644 tests/test_automated/unit/collector_manager/test_collector_manager.py diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index a84df5a1..d108a3fa 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -17,18 +17,22 @@ class StatementComposer: @staticmethod def pending_urls_without_html_data() -> Select: - subquery = (select(1). + exclude_subquery = (select(1). select_from(LinkTaskURL). join(Task, LinkTaskURL.task_id == Task.id). where(LinkTaskURL.url_id == URL.id). where(Task.task_type == TaskType.HTML.value). where(Task.task_status == BatchStatus.COMPLETE.value) ) - - query = select(URL).where( - ~exists(subquery) + query = ( + select(URL). + outerjoin(URLHTMLContent). + where(URLHTMLContent.id == None). + where(~exists(exclude_subquery)). + where(URL.outcome == URLStatus.PENDING.value) ) + return query diff --git a/core/CoreLogger.py b/core/CoreLogger.py deleted file mode 100644 index 79263c78..00000000 --- a/core/CoreLogger.py +++ /dev/null @@ -1,97 +0,0 @@ - - -import queue -import threading -import time -from concurrent.futures import Future -from concurrent.futures.thread import ThreadPoolExecutor - -from collector_db.DTOs.LogInfo import LogInfo -from collector_db.DatabaseClient import DatabaseClient - - -class CoreLogger: - def __init__( - self, - db_client: DatabaseClient, - flush_interval=10, - batch_size=100 - ): - self.db_client = db_client - self.flush_interval = flush_interval - self.batch_size = batch_size - - self.log_queue = queue.Queue() - self.lock = threading.Lock() - self.stop_event = threading.Event() - # Start the periodic flush task - self.executor = ThreadPoolExecutor(max_workers=1) - self.flush_future: Future = self.executor.submit(self._flush_logs) - - def __enter__(self): - """ - Start the logger for use in a context. - """ - return self - - def __exit__(self, exc_type, exc_value, traceback): - """ - Gracefully shut down the logger when exiting the context. - """ - self.shutdown() - - def log(self, log_info: LogInfo): - """ - Adds a log entry to the queue. - """ - self.log_queue.put(log_info) - - def _flush_logs(self): - """ - Periodically flushes logs from the queue to the database. - """ - while not self.stop_event.is_set(): - time.sleep(self.flush_interval) - self.flush() - - def flush(self): - """ - Flushes all logs from the queue to the database in batches. - """ - with self.lock: - logs: list[LogInfo] = [] - while not self.log_queue.empty() and len(logs) < self.batch_size: - try: - log = self.log_queue.get_nowait() - logs.append(log) - except queue.Empty: - break - - if logs: - try: - self.db_client.insert_logs(log_infos=logs) - except Exception as e: - # Handle logging database errors (e.g., save to fallback storage) - print(f"Error while flushing logs: {e}") - - def flush_all(self): - """ - Flushes all logs from the queue to the database. - """ - while not self.log_queue.empty(): - self.flush() - - def restart(self): - self.flush_all() - self.executor.shutdown(wait=False) - self.executor = ThreadPoolExecutor(max_workers=1) - self.flush_future = self.executor.submit(self._flush_logs) - - def shutdown(self): - """ - Stops the logger gracefully and flushes any remaining logs. - """ - self.stop_event.set() - # if self.flush_future and not self.flush_future.done(): - self.flush_future.result(timeout=10) - self.flush_all() # Flush remaining logs diff --git a/core/TaskManager.py b/core/TaskManager.py index 64aa57e6..77844d91 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -111,8 +111,8 @@ async def set_task_status(self, task_type: TaskType): async def run_tasks(self): operators = await self.get_task_operators() - count = 0 for operator in operators: + count = 0 await self.set_task_status(task_type=operator.task_type) meets_prereq = await operator.meets_task_prerequisites() @@ -127,6 +127,8 @@ async def run_tasks(self): task_id = await self.initiate_task_in_db(task_type=operator.task_type) run_info: TaskOperatorRunInfo = await operator.run_task(task_id) await self.conclude_task(run_info) + if run_info.outcome == TaskOperatorOutcome.ERROR: + break count += 1 meets_prereq = await operator.meets_task_prerequisites() await self.set_task_status(task_type=TaskType.IDLE) @@ -165,6 +167,8 @@ async def handle_task_error(self, run_info: TaskOperatorRunInfo): task_id=run_info.task_id, error=run_info.message ) + await self.discord_poster.post_to_discord( + message=f"Task {run_info.task_id} ({self.task_status.value}) failed with error.") async def get_task_info(self, task_id: int) -> TaskInfo: return await self.adb_client.get_task_info(task_id=task_id) diff --git a/tests/manual/source_collectors/test_autogoogler_collector.py b/tests/manual/source_collectors/test_autogoogler_collector.py index a51fc883..c9942106 100644 --- a/tests/manual/source_collectors/test_autogoogler_collector.py +++ b/tests/manual/source_collectors/test_autogoogler_collector.py @@ -4,7 +4,6 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from core.AsyncCoreLogger import AsyncCoreLogger -from core.CoreLogger import CoreLogger from source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector from source_collectors.auto_googler.DTOs import AutoGooglerInputDTO diff --git a/tests/manual/source_collectors/test_ckan_collector.py b/tests/manual/source_collectors/test_ckan_collector.py index f642fd8d..f9deaf02 100644 --- a/tests/manual/source_collectors/test_ckan_collector.py +++ b/tests/manual/source_collectors/test_ckan_collector.py @@ -4,9 +4,7 @@ from marshmallow import Schema, fields from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DatabaseClient import DatabaseClient from core.AsyncCoreLogger import AsyncCoreLogger -from core.CoreLogger import CoreLogger from source_collectors.ckan.CKANCollector import CKANCollector from source_collectors.ckan.DTOs import CKANInputDTO from source_collectors.ckan.search_terms import package_search, group_search, organization_search diff --git a/tests/manual/source_collectors/test_common_crawler_collector.py b/tests/manual/source_collectors/test_common_crawler_collector.py index 872b7710..cb1c4f78 100644 --- a/tests/manual/source_collectors/test_common_crawler_collector.py +++ b/tests/manual/source_collectors/test_common_crawler_collector.py @@ -4,9 +4,7 @@ from marshmallow import Schema, fields from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DatabaseClient import DatabaseClient from core.AsyncCoreLogger import AsyncCoreLogger -from core.CoreLogger import CoreLogger from source_collectors.common_crawler.CommonCrawlerCollector import CommonCrawlerCollector from source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO diff --git a/tests/manual/source_collectors/test_muckrock_collectors.py b/tests/manual/source_collectors/test_muckrock_collectors.py index bfd0ba26..49bfa5fb 100644 --- a/tests/manual/source_collectors/test_muckrock_collectors.py +++ b/tests/manual/source_collectors/test_muckrock_collectors.py @@ -4,7 +4,6 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from core.AsyncCoreLogger import AsyncCoreLogger -from core.CoreLogger import CoreLogger from source_collectors.muckrock.DTOs import MuckrockSimpleSearchCollectorInputDTO, \ MuckrockCountySearchCollectorInputDTO, MuckrockAllFOIARequestsCollectorInputDTO from source_collectors.muckrock.classes.MuckrockCollector import MuckrockSimpleSearchCollector, \ diff --git a/tests/test_automated/integration/conftest.py b/tests/test_automated/integration/conftest.py index 6be03e86..a0180800 100644 --- a/tests/test_automated/integration/conftest.py +++ b/tests/test_automated/integration/conftest.py @@ -6,22 +6,17 @@ from collector_manager.AsyncCollectorManager import AsyncCollectorManager from core.AsyncCore import AsyncCore from core.AsyncCoreLogger import AsyncCoreLogger -from core.CoreLogger import CoreLogger from core.SourceCollectorCore import SourceCollectorCore @pytest.fixture def test_core(db_client_test): - with CoreLogger( - db_client=db_client_test - ) as logger: - core = SourceCollectorCore( - db_client=db_client_test, - core_logger=logger, - dev_mode=True - ) - yield core - core.shutdown() + core = SourceCollectorCore( + db_client=db_client_test, + dev_mode=True + ) + yield core + core.shutdown() @pytest.fixture diff --git a/tests/test_automated/integration/core/test_core_logger.py b/tests/test_automated/integration/core/test_core_logger.py deleted file mode 100644 index 07a98000..00000000 --- a/tests/test_automated/integration/core/test_core_logger.py +++ /dev/null @@ -1,66 +0,0 @@ -import threading -import time - -from collector_db.DTOs.LogInfo import LogInfo -from core.CoreLogger import CoreLogger -from tests.helpers.DBDataCreator import DBDataCreator - - -def test_logger_integration(db_data_creator: DBDataCreator): - batch_id = db_data_creator.batch() - db_client = db_data_creator.db_client - with CoreLogger(flush_interval=1, db_client=db_client) as logger: - - # Simulate logging - logger.log(LogInfo(log="Integration Log 1", batch_id=batch_id)) - logger.log(LogInfo(log="Integration Log 2", batch_id=batch_id)) - - # Wait for the flush interval - time.sleep(1.5) - - # Verify logs in the database - logs = db_client.get_logs_by_batch_id(batch_id) - assert len(logs) == 2 - assert logs[0].log == "Integration Log 1" - - -def test_multithreaded_integration_with_live_db(db_data_creator: DBDataCreator): - # Ensure the database is empty - db_client = db_data_creator.db_client - db_client.delete_all_logs() - - batch_ids = [db_data_creator.batch() for _ in range(5)] - db_client = db_data_creator.db_client - logger = CoreLogger(flush_interval=1, db_client=db_client, batch_size=10) - - # Simulate multiple threads logging - def worker(thread_id): - batch_id = batch_ids[thread_id-1] - for i in range(10): # Each thread logs 10 messages - logger.log(LogInfo(log=f"Thread-{thread_id} Log-{i}", batch_id=batch_id)) - - # Start multiple threads - threads = [threading.Thread(target=worker, args=(i+1,)) for i in range(5)] # 5 threads - for t in threads: - t.start() - for t in threads: - t.join() - - # Allow the logger to flush - logger.shutdown() - time.sleep(10) - - # Verify logs in the database - logs = db_client.get_all_logs() - - # Optional: Print logs for manual inspection - for log in logs: - print(log.log) - - # Assertions - assert len(logs) == 50 # 5 threads * 10 messages each - for i in range(1,6): - for j in range(10): - assert any(log.log == f"Thread-{i} Log-{j}" for log in logs) - - diff --git a/tests/test_automated/unit/collector_manager/__init__.py b/tests/test_automated/unit/collector_manager/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/test_automated/unit/collector_manager/test_collector_manager.py b/tests/test_automated/unit/collector_manager/test_collector_manager.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/test_automated/unit/core/test_core_logger.py b/tests/test_automated/unit/core/test_core_logger.py index 22d08bfb..d91ce6cd 100644 --- a/tests/test_automated/unit/core/test_core_logger.py +++ b/tests/test_automated/unit/core/test_core_logger.py @@ -1,86 +1,28 @@ -import threading -import time -from unittest.mock import MagicMock +import asyncio +from unittest.mock import AsyncMock -from collector_db.DTOs.LogInfo import LogInfo -from core.CoreLogger import CoreLogger - - -def test_logger_flush(): - mock_db_client = MagicMock() - logger = CoreLogger(flush_interval=1, db_client=mock_db_client) - - # Add logs - logger.log(LogInfo(log="Log 1", batch_id=1)) - logger.log(LogInfo(log="Log 2", batch_id=1)) - - # Wait for the flush interval - time.sleep(1.5) - - # Verify logs were flushed - assert mock_db_client.insert_logs.called - flushed_logs = mock_db_client.insert_logs.call_args[1]['log_infos'] - assert len(flushed_logs) == 2 - assert flushed_logs[0].log == "Log 1" - - logger.shutdown() - -def test_logger_multithreading(): - mock_db_client = MagicMock() - logger = CoreLogger(flush_interval=1, db_client=mock_db_client, batch_size=10) - - def worker(thread_id): - for i in range(5): # Each thread logs 5 messages - logger.log(LogInfo(log=f"Thread-{thread_id} Log-{i}", batch_id=thread_id)) - - # Start multiple threads - threads = [threading.Thread(target=worker, args=(i,)) for i in range(5)] # 5 threads - for t in threads: - t.start() - for t in threads: - t.join() # Wait for all threads to finish - - # Allow the logger to flush - time.sleep(2) - logger.shutdown() - - # Verify all logs were flushed - assert mock_db_client.insert_logs.called - flushed_logs = [] - for call in mock_db_client.insert_logs.call_args_list: - flushed_logs.extend(call[1]['log_infos']) - - # Ensure all logs are present - assert len(flushed_logs) == 25 # 5 threads * 5 messages each - for i in range(5): - for j in range(5): - assert any(log.log == f"Thread-{i} Log-{j}" for log in flushed_logs) +import pytest +from collector_db.DTOs.LogInfo import LogInfo +from core.AsyncCoreLogger import AsyncCoreLogger -def test_logger_with_delays(): - mock_db_client = MagicMock() - logger = CoreLogger(flush_interval=1, db_client=mock_db_client, batch_size=10) - def worker(thread_id): - for i in range(10): # Each thread logs 10 messages - logger.log(LogInfo(log=f"Thread-{thread_id} Log-{i}", batch_id=thread_id)) - time.sleep(0.1) # Simulate delay between logs +@pytest.mark.asyncio +async def test_logger_flush(): + mock_adb_client = AsyncMock() + async with AsyncCoreLogger(flush_interval=1, adb_client=mock_adb_client) as logger: - # Start multiple threads - threads = [threading.Thread(target=worker, args=(i,)) for i in range(5)] # 5 threads - for t in threads: - t.start() - for t in threads: - t.join() # Wait for all threads to finish + # Add logs + await logger.log(LogInfo(log="Log 1", batch_id=1)) + await logger.log(LogInfo(log="Log 2", batch_id=1)) - # Allow the logger to flush - time.sleep(2) - logger.shutdown() + # Wait for the flush interval + await asyncio.sleep(1.5) - # Verify that all logs are eventually flushed - flushed_logs = [] - for call in mock_db_client.insert_logs.call_args_list: - flushed_logs.extend(call[1]['log_infos']) + # Verify logs were flushed + mock_adb_client.insert_logs.assert_called_once() + flushed_logs = mock_adb_client.insert_logs.call_args[1]['log_infos'] + assert len(flushed_logs) == 2 + assert flushed_logs[0].log == "Log 1" - assert len(flushed_logs) == 50 # 5 threads * 10 messages each diff --git a/tests/test_automated/unit/source_collectors/test_autogoogler_collector.py b/tests/test_automated/unit/source_collectors/test_autogoogler_collector.py index 2349afe2..c3fafa61 100644 --- a/tests/test_automated/unit/source_collectors/test_autogoogler_collector.py +++ b/tests/test_automated/unit/source_collectors/test_autogoogler_collector.py @@ -4,9 +4,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLInfo import URLInfo -from collector_db.DatabaseClient import DatabaseClient from core.AsyncCoreLogger import AsyncCoreLogger -from core.CoreLogger import CoreLogger from source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector from source_collectors.auto_googler.DTOs import GoogleSearchQueryResultsInnerDTO, AutoGooglerInputDTO diff --git a/tests/test_automated/unit/source_collectors/test_ckan_collector.py b/tests/test_automated/unit/source_collectors/test_ckan_collector.py index ef7dbee8..e0e9ee47 100644 --- a/tests/test_automated/unit/source_collectors/test_ckan_collector.py +++ b/tests/test_automated/unit/source_collectors/test_ckan_collector.py @@ -5,9 +5,7 @@ import pytest from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DatabaseClient import DatabaseClient from core.AsyncCoreLogger import AsyncCoreLogger -from core.CoreLogger import CoreLogger from source_collectors.ckan.CKANCollector import CKANCollector from source_collectors.ckan.DTOs import CKANInputDTO diff --git a/tests/test_automated/unit/source_collectors/test_common_crawl_collector.py b/tests/test_automated/unit/source_collectors/test_common_crawl_collector.py index d1f0ccda..1c5aa6ee 100644 --- a/tests/test_automated/unit/source_collectors/test_common_crawl_collector.py +++ b/tests/test_automated/unit/source_collectors/test_common_crawl_collector.py @@ -4,9 +4,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLInfo import URLInfo -from collector_db.DatabaseClient import DatabaseClient from core.AsyncCoreLogger import AsyncCoreLogger -from core.CoreLogger import CoreLogger from source_collectors.common_crawler.CommonCrawlerCollector import CommonCrawlerCollector from source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO diff --git a/tests/test_automated/unit/source_collectors/test_example_collector.py b/tests/test_automated/unit/source_collectors/test_example_collector.py index 26ca601d..b770d952 100644 --- a/tests/test_automated/unit/source_collectors/test_example_collector.py +++ b/tests/test_automated/unit/source_collectors/test_example_collector.py @@ -1,10 +1,9 @@ -from unittest.mock import MagicMock, AsyncMock +from unittest.mock import AsyncMock from collector_db.DatabaseClient import DatabaseClient from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.ExampleCollector import ExampleCollector from core.AsyncCoreLogger import AsyncCoreLogger -from core.CoreLogger import CoreLogger def test_example_collector(): diff --git a/tests/test_automated/unit/source_collectors/test_muckrock_collectors.py b/tests/test_automated/unit/source_collectors/test_muckrock_collectors.py index 7e533efa..100fbb6e 100644 --- a/tests/test_automated/unit/source_collectors/test_muckrock_collectors.py +++ b/tests/test_automated/unit/source_collectors/test_muckrock_collectors.py @@ -5,9 +5,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLInfo import URLInfo -from collector_db.DatabaseClient import DatabaseClient from core.AsyncCoreLogger import AsyncCoreLogger -from core.CoreLogger import CoreLogger from source_collectors.muckrock.DTOs import MuckrockSimpleSearchCollectorInputDTO, \ MuckrockCountySearchCollectorInputDTO, MuckrockAllFOIARequestsCollectorInputDTO from source_collectors.muckrock.classes.MuckrockCollector import MuckrockSimpleSearchCollector, \ From 82e65b9f13e008821c0de9ee429cefe9c0511cfa Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 15 Apr 2025 16:47:03 -0400 Subject: [PATCH 108/244] feat(app): add submit approved URL task --- ...3794fa4e9_add_submit_url_task_type_enum.py | 48 +++++ ...33d2e_revert_to_pending_validated_urls_.py | 42 +++++ api/main.py | 32 +++- api/routes/batch.py | 18 +- collector_db/AsyncDatabaseClient.py | 111 +++++++++-- collector_db/DTOs/URLInfo.py | 1 + collector_db/DatabaseClient.py | 96 +--------- collector_db/helper_functions.py | 13 +- collector_db/models.py | 6 +- core/AsyncCore.py | 29 ++- .../task_data_objects/SubmitApprovedURLTDO.py | 9 +- core/EnvVarManager.py | 76 ++++++++ core/SourceCollectorCore.py | 27 +-- core/TaskManager.py | 29 +-- core/classes/SubmitApprovedURLTaskOperator.py | 42 +++-- core/enums.py | 18 +- html_tag_collector/RootURLCache.py | 4 +- llm_api_logic/OpenAIRecordClassifier.py | 5 +- pdap_api_client/AccessManager.py | 4 +- pdap_api_client/DTOs.py | 1 + pdap_api_client/PDAPClient.py | 65 +++++-- start_mirrored_local_app.py | 62 ++++--- tests/conftest.py | 31 +++- tests/helpers/DBDataCreator.py | 12 +- .../integration/api/conftest.py | 12 +- .../integration/api/test_annotate.py | 3 - .../integration/api/test_duplicates.py | 3 +- .../collector_db/test_database_structure.py | 9 +- .../collector_db/test_db_client.py | 17 +- .../integration/core/test_async_core.py | 1 + .../tasks/test_submit_approved_url_task.py | 174 +++++++++++------- util/DiscordNotifier.py | 8 +- util/helper_functions.py | 13 ++ 33 files changed, 687 insertions(+), 334 deletions(-) create mode 100644 alembic/versions/2025_04_15_1338-b363794fa4e9_add_submit_url_task_type_enum.py create mode 100644 alembic/versions/2025_04_15_1532-ed06a5633d2e_revert_to_pending_validated_urls_.py create mode 100644 core/EnvVarManager.py diff --git a/alembic/versions/2025_04_15_1338-b363794fa4e9_add_submit_url_task_type_enum.py b/alembic/versions/2025_04_15_1338-b363794fa4e9_add_submit_url_task_type_enum.py new file mode 100644 index 00000000..e1d5b725 --- /dev/null +++ b/alembic/versions/2025_04_15_1338-b363794fa4e9_add_submit_url_task_type_enum.py @@ -0,0 +1,48 @@ +"""Add Submit URL Task Type Enum + +Revision ID: b363794fa4e9 +Revises: 33a546c93441 +Create Date: 2025-04-15 13:38:58.293627 + +""" +from typing import Sequence, Union + + +from util.alembic_helpers import switch_enum_type + +# revision identifiers, used by Alembic. +revision: str = 'b363794fa4e9' +down_revision: Union[str, None] = '33a546c93441' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + switch_enum_type( + table_name='tasks', + column_name='task_type', + enum_name='task_type', + new_enum_values=[ + "HTML", + "Relevancy", + "Record Type", + "Agency Identification", + "Misc Metadata", + "Submit Approved URLs" + ] + ) + + +def downgrade() -> None: + switch_enum_type( + table_name='tasks', + column_name='task_type', + enum_name='task_type', + new_enum_values=[ + "HTML", + "Relevancy", + "Record Type", + "Agency Identification", + "Misc Metadata", + ] + ) \ No newline at end of file diff --git a/alembic/versions/2025_04_15_1532-ed06a5633d2e_revert_to_pending_validated_urls_.py b/alembic/versions/2025_04_15_1532-ed06a5633d2e_revert_to_pending_validated_urls_.py new file mode 100644 index 00000000..82ce97a4 --- /dev/null +++ b/alembic/versions/2025_04_15_1532-ed06a5633d2e_revert_to_pending_validated_urls_.py @@ -0,0 +1,42 @@ +"""Revert to pending validated URLs without name and add constraint + +Revision ID: ed06a5633d2e +Revises: b363794fa4e9 +Create Date: 2025-04-15 15:32:26.465488 + +""" +from typing import Sequence, Union + +from alembic import op + + +# revision identifiers, used by Alembic. +revision: str = 'ed06a5633d2e' +down_revision: Union[str, None] = 'b363794fa4e9' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + + op.execute( + """ + UPDATE public.urls + SET OUTCOME = 'pending' + WHERE OUTCOME = 'validated' AND NAME IS NULL + """ + ) + + op.create_check_constraint( + 'url_name_not_null_when_validated', + 'urls', + "NAME IS NOT NULL OR OUTCOME != 'validated'" + ) + + +def downgrade() -> None: + op.drop_constraint( + 'url_name_not_null_when_validated', + 'urls', + type_='check' + ) diff --git a/api/main.py b/api/main.py index 19f8de8d..40970e4f 100644 --- a/api/main.py +++ b/api/main.py @@ -1,5 +1,6 @@ from contextlib import asynccontextmanager +import aiohttp import uvicorn from fastapi import FastAPI @@ -15,6 +16,7 @@ from collector_manager.AsyncCollectorManager import AsyncCollectorManager from core.AsyncCore import AsyncCore from core.AsyncCoreLogger import AsyncCoreLogger +from core.EnvVarManager import EnvVarManager from core.ScheduledTaskManager import AsyncScheduledTaskManager from core.SourceCollectorCore import SourceCollectorCore from core.TaskManager import TaskManager @@ -22,18 +24,27 @@ from html_tag_collector.RootURLCache import RootURLCache from html_tag_collector.URLRequestInterface import URLRequestInterface from hugging_face.HuggingFaceInterface import HuggingFaceInterface +from pdap_api_client.AccessManager import AccessManager +from pdap_api_client.PDAPClient import PDAPClient from util.DiscordNotifier import DiscordPoster -from util.helper_functions import get_from_env + @asynccontextmanager async def lifespan(app: FastAPI): + env_var_manager = EnvVarManager.get() + # Initialize shared dependencies - db_client = DatabaseClient() - adb_client = AsyncDatabaseClient() + db_client = DatabaseClient( + db_url=env_var_manager.get_postgres_connection_string() + ) + adb_client = AsyncDatabaseClient( + db_url=env_var_manager.get_postgres_connection_string(is_async=True) + ) await setup_database(db_client) core_logger = AsyncCoreLogger(adb_client=adb_client) + session = aiohttp.ClientSession() source_collector_core = SourceCollectorCore( db_client=DatabaseClient(), @@ -46,7 +57,15 @@ async def lifespan(app: FastAPI): root_url_cache=RootURLCache() ), discord_poster=DiscordPoster( - webhook_url=get_from_env("DISCORD_WEBHOOK_URL") + webhook_url=env_var_manager.discord_webhook_url + ), + pdap_client=PDAPClient( + access_manager=AccessManager( + email=env_var_manager.pdap_email, + password=env_var_manager.pdap_password, + api_key=env_var_manager.pdap_api_key, + session=session + ) ) ) async_collector_manager = AsyncCollectorManager( @@ -72,17 +91,17 @@ async def lifespan(app: FastAPI): yield # Code here runs before shutdown # Shutdown logic (if needed) + # Clean up resources, close connections, etc. await core_logger.shutdown() await async_core.shutdown() source_collector_core.shutdown() - # Clean up resources, close connections, etc. + await session.close() pass async def setup_database(db_client): # Initialize database if dev environment, otherwise apply migrations try: - get_from_env("DEV") db_client.init_db() except Exception as e: return @@ -95,6 +114,7 @@ async def setup_database(db_client): lifespan=lifespan ) + routers = [ root_router, collector_router, diff --git a/api/routes/batch.py b/api/routes/batch.py index 23df2394..9d4b62cc 100644 --- a/api/routes/batch.py +++ b/api/routes/batch.py @@ -25,7 +25,7 @@ @batch_router.get("") -def get_batch_status( +async def get_batch_status( collector_type: Optional[CollectorType] = Query( description="Filter by collector type", default=None @@ -38,13 +38,13 @@ def get_batch_status( description="The page number", default=1 ), - core: SourceCollectorCore = Depends(get_core), + core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), ) -> GetBatchStatusResponse: """ Get the status of recent batches """ - return core.get_batch_statuses(collector_type=collector_type, status=status, page=page) + return await core.get_batch_statuses(collector_type=collector_type, status=status, page=page) @batch_router.get("/{batch_id}") @@ -69,28 +69,28 @@ async def get_urls_by_batch( return await core.get_urls_by_batch(batch_id, page=page) @batch_router.get("/{batch_id}/duplicates") -def get_duplicates_by_batch( +async def get_duplicates_by_batch( batch_id: int = Path(description="The batch id"), page: int = Query( description="The page number", default=1 ), - core: SourceCollectorCore = Depends(get_core), + core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), ) -> GetDuplicatesByBatchResponse: - return core.get_duplicate_urls_by_batch(batch_id, page=page) + return await core.get_duplicate_urls_by_batch(batch_id, page=page) @batch_router.get("/{batch_id}/logs") -def get_batch_logs( +async def get_batch_logs( batch_id: int = Path(description="The batch id"), - core: SourceCollectorCore = Depends(get_core), + async_core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), ) -> GetBatchLogsResponse: """ Retrieve the logs for a recent batch. Note that for later batches, the logs may not be available. """ - return core.get_batch_logs(batch_id) + return await async_core.get_batch_logs(batch_id) @batch_router.post("/{batch_id}/abort") async def abort_batch( diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index c44468a4..98410b6f 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -5,16 +5,16 @@ from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, or_, update, Delete, Insert, asc from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker -from sqlalchemy.orm import selectinload, joinedload, QueryableAttribute +from sqlalchemy.orm import selectinload, joinedload, QueryableAttribute, aliased from sqlalchemy.sql.functions import coalesce from starlette import status from collector_db.ConfigManager import ConfigManager from collector_db.DTOConverter import DTOConverter from collector_db.DTOs.BatchInfo import BatchInfo -from collector_db.DTOs.DuplicateInfo import DuplicateInsertInfo +from collector_db.DTOs.DuplicateInfo import DuplicateInsertInfo, DuplicateInfo from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo -from collector_db.DTOs.LogInfo import LogInfo +from collector_db.DTOs.LogInfo import LogInfo, LogOutputInfo from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType @@ -41,8 +41,9 @@ GetURLsResponseInnerInfo from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO -from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO +from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO, SubmittedURLInfo from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo +from core.EnvVarManager import EnvVarManager from core.enums import BatchStatus, SuggestionType, RecordType from html_tag_collector.DataClassTags import convert_to_response_html_info @@ -58,7 +59,9 @@ def add_standard_limit_and_offset(statement, page, limit=100): class AsyncDatabaseClient: - def __init__(self, db_url: str = get_postgres_connection_string(is_async=True)): + def __init__(self, db_url: Optional[str] = None): + if db_url is None: + db_url = EnvVarManager.get().get_postgres_connection_string(is_async=True) self.engine = create_async_engine( url=db_url, echo=ConfigManager.get_sqlalchemy_echo(), @@ -1487,8 +1490,9 @@ async def get_validated_urls( .where(URL.outcome == URLStatus.VALIDATED.value) .options( selectinload(URL.optional_data_source_metadata), - selectinload(URL.confirmed_agencies) - ) + selectinload(URL.confirmed_agencies), + selectinload(URL.reviewing_user) + ).limit(100) ) urls = await session.execute(query) urls = urls.scalars().all() @@ -1497,6 +1501,17 @@ async def get_validated_urls( agency_ids = [] for agency in url.confirmed_agencies: agency_ids.append(agency.agency_id) + optional_metadata = url.optional_data_source_metadata + + if optional_metadata is None: + record_formats = None + data_portal_type = None + supplying_entity = None + else: + record_formats = optional_metadata.record_formats + data_portal_type = optional_metadata.data_portal_type + supplying_entity = optional_metadata.supplying_entity + tdo = SubmitApprovedURLTDO( url_id=url.id, url=url.url, @@ -1504,18 +1519,19 @@ async def get_validated_urls( agency_ids=agency_ids, description=url.description, record_type=url.record_type, - record_formats=url.optional_data_source_metadata.record_formats, - data_portal_type=url.optional_data_source_metadata.data_portal_type, - supplying_entity=url.optional_data_source_metadata.supplying_entity, + record_formats=record_formats, + data_portal_type=data_portal_type, + supplying_entity=supplying_entity, + approving_user_id=url.reviewing_user.user_id ) results.append(tdo) return results @session_manager - async def mark_urls_as_submitted(self, session: AsyncSession, tdos: list[SubmitApprovedURLTDO]): - for tdo in tdos: - url_id = tdo.url_id - data_source_id = tdo.data_source_id + async def mark_urls_as_submitted(self, session: AsyncSession, infos: list[SubmittedURLInfo]): + for info in infos: + url_id = info.url_id + data_source_id = info.data_source_id query = ( update(URL) .where(URL.id == url_id) @@ -1526,3 +1542,70 @@ async def mark_urls_as_submitted(self, session: AsyncSession, tdos: list[SubmitA ) await session.execute(query) + @session_manager + async def get_duplicates_by_batch_id(self, session, batch_id: int, page: int) -> List[DuplicateInfo]: + original_batch = aliased(Batch) + duplicate_batch = aliased(Batch) + + query = ( + Select( + URL.url.label("source_url"), + URL.id.label("original_url_id"), + duplicate_batch.id.label("duplicate_batch_id"), + duplicate_batch.parameters.label("duplicate_batch_parameters"), + original_batch.id.label("original_batch_id"), + original_batch.parameters.label("original_batch_parameters"), + ) + .select_from(Duplicate) + .join(URL, Duplicate.original_url_id == URL.id) + .join(duplicate_batch, Duplicate.batch_id == duplicate_batch.id) + .join(original_batch, URL.batch_id == original_batch.id) + .filter(duplicate_batch.id == batch_id) + .limit(100) + .offset((page - 1) * 100) + ) + raw_results = await session.execute(query) + results = raw_results.all() + final_results = [] + for result in results: + final_results.append( + DuplicateInfo( + source_url=result.source_url, + duplicate_batch_id=result.duplicate_batch_id, + duplicate_metadata=result.duplicate_batch_parameters, + original_batch_id=result.original_batch_id, + original_metadata=result.original_batch_parameters, + original_url_id=result.original_url_id + ) + ) + return final_results + + @session_manager + async def get_recent_batch_status_info( + self, + session, + page: int, + collector_type: Optional[CollectorType] = None, + status: Optional[BatchStatus] = None, + ) -> List[BatchInfo]: + # Get only the batch_id, collector_type, status, and created_at + limit = 100 + query = (Select(Batch) + .order_by(Batch.date_generated.desc())) + if collector_type: + query = query.filter(Batch.strategy == collector_type.value) + if status: + query = query.filter(Batch.status == status.value) + query = (query.limit(limit) + .offset((page - 1) * limit)) + raw_results = await session.execute(query) + batches = raw_results.scalars().all() + return [BatchInfo(**batch.__dict__) for batch in batches] + + @session_manager + async def get_logs_by_batch_id(self, session, batch_id: int) -> List[LogOutputInfo]: + query = Select(Log).filter_by(batch_id=batch_id).order_by(Log.created_at.asc()) + raw_results = await session.execute(query) + logs = raw_results.scalars().all() + return ([LogOutputInfo(**log.__dict__) for log in logs]) + diff --git a/collector_db/DTOs/URLInfo.py b/collector_db/DTOs/URLInfo.py index afe6c2f2..c47d2830 100644 --- a/collector_db/DTOs/URLInfo.py +++ b/collector_db/DTOs/URLInfo.py @@ -13,3 +13,4 @@ class URLInfo(BaseModel): collector_metadata: Optional[dict] = None outcome: URLStatus = URLStatus.PENDING updated_at: Optional[datetime.datetime] = None + name: Optional[str] = None diff --git a/collector_db/DatabaseClient.py b/collector_db/DatabaseClient.py index 8d72ef0d..b8547f1d 100644 --- a/collector_db/DatabaseClient.py +++ b/collector_db/DatabaseClient.py @@ -16,13 +16,17 @@ from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import Base, Batch, URL, Log, Duplicate from collector_manager.enums import CollectorType +from core.EnvVarManager import EnvVarManager from core.enums import BatchStatus # Database Client class DatabaseClient: - def __init__(self, db_url: str = get_postgres_connection_string()): + def __init__(self, db_url: Optional[str] = None): """Initialize the DatabaseClient.""" + if db_url is None: + db_url = EnvVarManager.get().get_postgres_connection_string(is_async=True) + self.engine = create_engine( url=db_url, echo=ConfigManager.get_sqlalchemy_echo(), @@ -49,10 +53,6 @@ def wrapper(self, *args, **kwargs): return wrapper - def row_to_dict(self, row: Row) -> dict: - return dict(row._mapping) - - @session_manager def insert_batch(self, session, batch_info: BatchInfo) -> int: """Insert a new batch into the database and return its ID.""" @@ -105,24 +105,14 @@ def insert_url(self, session, url_info: URLInfo) -> int: batch_id=url_info.batch_id, url=url_info.url, collector_metadata=url_info.collector_metadata, - outcome=url_info.outcome.value + outcome=url_info.outcome.value, + name=url_info.name ) session.add(url_entry) session.commit() session.refresh(url_entry) return url_entry.id - @session_manager - def add_duplicate_info(self, session, duplicate_infos: list[DuplicateInfo]): - # TODO: Add test for this method when testing CollectorDatabaseProcessor - for duplicate_info in duplicate_infos: - duplicate = Duplicate( - batch_id=duplicate_info.original_batch_id, - original_url_id=duplicate_info.original_url_id, - ) - session.add(duplicate) - - def insert_urls(self, url_infos: List[URLInfo], batch_id: int) -> InsertURLsInfo: url_mappings = [] duplicates = [] @@ -163,83 +153,11 @@ def insert_logs(self, session, log_infos: List[LogInfo]): log.created_at = log_info.created_at session.add(log) - @session_manager - def get_logs_by_batch_id(self, session, batch_id: int) -> List[LogOutputInfo]: - logs = session.query(Log).filter_by(batch_id=batch_id).order_by(Log.created_at.asc()).all() - return ([LogOutputInfo(**log.__dict__) for log in logs]) - - @session_manager - def get_all_logs(self, session) -> List[LogInfo]: - logs = session.query(Log).all() - return ([LogInfo(**log.__dict__) for log in logs]) - @session_manager def get_batch_status(self, session, batch_id: int) -> BatchStatus: batch = session.query(Batch).filter_by(id=batch_id).first() return BatchStatus(batch.status) - @session_manager - def get_recent_batch_status_info( - self, - session, - page: int, - collector_type: Optional[CollectorType] = None, - status: Optional[BatchStatus] = None, - ) -> List[BatchInfo]: - # Get only the batch_id, collector_type, status, and created_at - limit = 100 - query = (session.query(Batch) - .order_by(Batch.date_generated.desc())) - if collector_type: - query = query.filter(Batch.strategy == collector_type.value) - if status: - query = query.filter(Batch.status == status.value) - query = (query.limit(limit) - .offset((page - 1) * limit)) - batches = query.all() - return [BatchInfo(**batch.__dict__) for batch in batches] - - @session_manager - def get_duplicates_by_batch_id(self, session, batch_id: int, page: int) -> List[DuplicateInfo]: - original_batch = aliased(Batch) - duplicate_batch = aliased(Batch) - - query = ( - session.query( - URL.url.label("source_url"), - URL.id.label("original_url_id"), - duplicate_batch.id.label("duplicate_batch_id"), - duplicate_batch.parameters.label("duplicate_batch_parameters"), - original_batch.id.label("original_batch_id"), - original_batch.parameters.label("original_batch_parameters"), - ) - .select_from(Duplicate) - .join(URL, Duplicate.original_url_id == URL.id) - .join(duplicate_batch, Duplicate.batch_id == duplicate_batch.id) - .join(original_batch, URL.batch_id == original_batch.id) - .filter(duplicate_batch.id == batch_id) - .limit(100) - .offset((page - 1) * 100) - ) - results = query.all() - final_results = [] - for result in results: - final_results.append( - DuplicateInfo( - source_url=result.source_url, - duplicate_batch_id=result.duplicate_batch_id, - duplicate_metadata=result.duplicate_batch_parameters, - original_batch_id=result.original_batch_id, - original_metadata=result.original_batch_parameters, - original_url_id=result.original_url_id - ) - ) - return final_results - - @session_manager - def delete_all_logs(self, session): - session.query(Log).delete() - @session_manager def delete_old_logs(self, session): """ diff --git a/collector_db/helper_functions.py b/collector_db/helper_functions.py index dcb161b9..4f99556a 100644 --- a/collector_db/helper_functions.py +++ b/collector_db/helper_functions.py @@ -2,15 +2,8 @@ import dotenv +from core.EnvVarManager import EnvVarManager + def get_postgres_connection_string(is_async = False): - dotenv.load_dotenv() - username = os.getenv("POSTGRES_USER") - password = os.getenv("POSTGRES_PASSWORD") - host = os.getenv("POSTGRES_HOST") - port = os.getenv("POSTGRES_PORT") - database = os.getenv("POSTGRES_DB") - driver = "postgresql" - if is_async: - driver += "+asyncpg" - return f"{driver}://{username}:{password}@{host}:{port}/{database}" \ No newline at end of file + return EnvVarManager.get().get_postgres_connection_string(is_async) diff --git a/collector_db/models.py b/collector_db/models.py index e0fd1b88..e98ef437 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -129,8 +129,8 @@ class URL(Base): "AutoRelevantSuggestion", uselist=False, back_populates="url") user_relevant_suggestions = relationship( "UserRelevantSuggestion", back_populates="url") - reviewing_users = relationship( - "ReviewingUserURL", back_populates="url") + reviewing_user = relationship( + "ReviewingUserURL", uselist=False, back_populates="url") optional_data_source_metadata = relationship( "URLOptionalDataSourceMetadata", uselist=False, back_populates="url") confirmed_agencies = relationship( @@ -164,7 +164,7 @@ class ReviewingUserURL(Base): created_at = get_created_at_column() # Relationships - url = relationship("URL", back_populates="reviewing_users") + url = relationship("URL", uselist=False, back_populates="reviewing_user") class RootURL(Base): __tablename__ = 'root_url_cache' diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 85762c85..cb9a80bc 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -10,6 +10,9 @@ from collector_manager.enums import CollectorType from core.DTOs.CollectorStartInfo import CollectorStartInfo from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo +from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse +from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse +from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ @@ -17,11 +20,10 @@ from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo +from core.DTOs.MessageResponse import MessageResponse from core.TaskManager import TaskManager -from core.enums import BatchStatus, SuggestionType, RecordType +from core.enums import BatchStatus, RecordType -from pdap_api_client.AccessManager import AccessManager -from pdap_api_client.PDAPClient import PDAPClient from security_manager.SecurityManager import AccessInfo @@ -57,6 +59,27 @@ async def abort_batch(self, batch_id: int) -> MessageResponse: await self.collector_manager.abort_collector_async(cid=batch_id) return MessageResponse(message=f"Batch aborted.") + async def get_duplicate_urls_by_batch(self, batch_id: int, page: int = 1) -> GetDuplicatesByBatchResponse: + dup_infos = await self.adb_client.get_duplicates_by_batch_id(batch_id, page=page) + return GetDuplicatesByBatchResponse(duplicates=dup_infos) + + async def get_batch_statuses( + self, + collector_type: Optional[CollectorType], + status: Optional[BatchStatus], + page: int + ) -> GetBatchStatusResponse: + results = await self.adb_client.get_recent_batch_status_info( + collector_type=collector_type, + status=status, + page=page + ) + return GetBatchStatusResponse(results=results) + + async def get_batch_logs(self, batch_id: int) -> GetBatchLogsResponse: + logs = await self.adb_client.get_logs_by_batch_id(batch_id) + return GetBatchLogsResponse(logs=logs) + #endregion # region Collector diff --git a/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py b/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py index 45fa7daf..c5b002d0 100644 --- a/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py +++ b/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py @@ -12,7 +12,14 @@ class SubmitApprovedURLTDO(BaseModel): agency_ids: list[int] name: str description: str + approving_user_id: int record_formats: Optional[list[str]] = None data_portal_type: Optional[str] = None supplying_entity: Optional[str] = None - data_source_id: Optional[int] = None \ No newline at end of file + data_source_id: Optional[int] = None + request_error: Optional[str] = None + +class SubmittedURLInfo(BaseModel): + url_id: int + data_source_id: Optional[int] + request_error: Optional[str] \ No newline at end of file diff --git a/core/EnvVarManager.py b/core/EnvVarManager.py new file mode 100644 index 00000000..39e4ce83 --- /dev/null +++ b/core/EnvVarManager.py @@ -0,0 +1,76 @@ +import os + +class EnvVarManager: + _instance = None + _allow_direct_init = False # internal flag + + """ + A class for unified management of environment variables + """ + def __new__(cls, *args, **kwargs): + if not cls._allow_direct_init: + raise RuntimeError("Use `EnvVarManager.get()` or `EnvVarManager.override()` instead.") + return super().__new__(cls) + + def __init__(self, env: dict = os.environ): + self.env = env + self._load() + + def _load(self): + + self.google_api_key = self.require_env("GOOGLE_API_KEY") + self.google_cse_id = self.require_env("GOOGLE_CSE_ID") + + self.pdap_email = self.require_env("PDAP_EMAIL") + self.pdap_password = self.require_env("PDAP_PASSWORD") + self.pdap_api_key = self.require_env("PDAP_API_KEY") + self.pdap_api_url = self.require_env("PDAP_API_URL") + + self.discord_webhook_url = self.require_env("DISCORD_WEBHOOK_URL") + + self.openai_api_key = self.require_env("OPENAI_API_KEY") + + self.postgres_user = self.require_env("POSTGRES_USER") + self.postgres_password = self.require_env("POSTGRES_PASSWORD") + self.postgres_host = self.require_env("POSTGRES_HOST") + self.postgres_port = self.require_env("POSTGRES_PORT") + self.postgres_db = self.require_env("POSTGRES_DB") + + @classmethod + def get(cls): + """ + Get the singleton instance, loading from environment if not yet + instantiated + """ + if cls._instance is None: + cls._allow_direct_init = True + cls._instance = cls(os.environ) + cls._allow_direct_init = False + return cls._instance + + @classmethod + def override(cls, env: dict): + """ + Create singleton instance that + overrides the environment variables with injected values + """ + cls._allow_direct_init = True + cls._instance = cls(env) + cls._allow_direct_init = False + + @classmethod + def reset(cls): + cls._instance = None + + def get_postgres_connection_string(self, is_async = False): + driver = "postgresql" + if is_async: + driver += "+asyncpg" + return (f"{driver}://{self.postgres_user}:{self.postgres_password}" + f"@{self.postgres_host}:{self.postgres_port}/{self.postgres_db}") + + def require_env(self, key: str, allow_none: bool = False): + val = self.env.get(key) + if val is None and not allow_none: + raise ValueError(f"Environment variable {key} is not set") + return val \ No newline at end of file diff --git a/core/SourceCollectorCore.py b/core/SourceCollectorCore.py index 8002717c..4516ceb5 100644 --- a/core/SourceCollectorCore.py +++ b/core/SourceCollectorCore.py @@ -2,10 +2,6 @@ from collector_db.DatabaseClient import DatabaseClient -from collector_manager.enums import CollectorType -from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse -from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse -from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse from core.ScheduledTaskManager import ScheduledTaskManager from core.enums import BatchStatus @@ -15,38 +11,21 @@ def __init__( self, core_logger: Optional[Any] = None, # Deprecated collector_manager: Optional[Any] = None, # Deprecated - db_client: DatabaseClient = DatabaseClient(), + db_client: Optional[DatabaseClient] = None, dev_mode: bool = False ): + if db_client is None: + db_client = DatabaseClient() self.db_client = db_client if not dev_mode: self.scheduled_task_manager = ScheduledTaskManager(db_client=db_client) else: self.scheduled_task_manager = None - def get_duplicate_urls_by_batch(self, batch_id: int, page: int = 1) -> GetDuplicatesByBatchResponse: - dup_infos = self.db_client.get_duplicates_by_batch_id(batch_id, page=page) - return GetDuplicatesByBatchResponse(duplicates=dup_infos) - - def get_batch_statuses( - self, - collector_type: Optional[CollectorType], - status: Optional[BatchStatus], - page: int - ) -> GetBatchStatusResponse: - results = self.db_client.get_recent_batch_status_info( - collector_type=collector_type, - status=status, - page=page - ) - return GetBatchStatusResponse(results=results) def get_status(self, batch_id: int) -> BatchStatus: return self.db_client.get_batch_status(batch_id) - def get_batch_logs(self, batch_id: int) -> GetBatchLogsResponse: - logs = self.db_client.get_logs_by_batch_id(batch_id) - return GetBatchLogsResponse(logs=logs) def shutdown(self): if self.scheduled_task_manager is not None: diff --git a/core/TaskManager.py b/core/TaskManager.py index 624cb906..7796e80e 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -1,5 +1,4 @@ import logging -from typing import Optional from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface from collector_db.AsyncDatabaseClient import AsyncDatabaseClient @@ -9,6 +8,7 @@ from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome from core.FunctionTrigger import FunctionTrigger from core.classes.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator +from core.classes.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator from core.classes.TaskOperatorBase import TaskOperatorBase from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator from core.classes.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator @@ -19,10 +19,8 @@ from html_tag_collector.URLRequestInterface import URLRequestInterface from hugging_face.HuggingFaceInterface import HuggingFaceInterface from llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier -from pdap_api_client.AccessManager import AccessManager from pdap_api_client.PDAPClient import PDAPClient from util.DiscordNotifier import DiscordPoster -from util.helper_functions import get_from_env TASK_REPEAT_THRESHOLD = 20 @@ -35,12 +33,16 @@ def __init__( url_request_interface: URLRequestInterface, html_parser: HTMLResponseParser, discord_poster: DiscordPoster, + pdap_client: PDAPClient ): + # Dependencies self.adb_client = adb_client + self.pdap_client = pdap_client self.huggingface_interface = huggingface_interface self.url_request_interface = url_request_interface self.html_parser = html_parser self.discord_poster = discord_poster + self.logger = logging.getLogger(__name__) self.logger.addHandler(logging.StreamHandler()) self.logger.setLevel(logging.INFO) @@ -73,21 +75,21 @@ async def get_url_record_type_task_operator(self): return operator async def get_agency_identification_task_operator(self): - pdap_client = PDAPClient( - access_manager=AccessManager( - email=get_from_env("PDAP_EMAIL"), - password=get_from_env("PDAP_PASSWORD"), - api_key=get_from_env("PDAP_API_KEY"), - ), - ) muckrock_api_interface = MuckrockAPIInterface() operator = AgencyIdentificationTaskOperator( adb_client=self.adb_client, - pdap_client=pdap_client, + pdap_client=self.pdap_client, muckrock_api_interface=muckrock_api_interface ) return operator + async def get_submit_approved_url_task_operator(self): + operator = SubmitApprovedURLTaskOperator( + adb_client=self.adb_client, + pdap_client=self.pdap_client + ) + return operator + async def get_url_miscellaneous_metadata_task_operator(self): operator = URLMiscellaneousMetadataTaskOperator( adb_client=self.adb_client @@ -96,11 +98,12 @@ async def get_url_miscellaneous_metadata_task_operator(self): async def get_task_operators(self) -> list[TaskOperatorBase]: return [ - # await self.get_url_html_task_operator(), + await self.get_url_html_task_operator(), await self.get_url_relevance_huggingface_task_operator(), await self.get_url_record_type_task_operator(), await self.get_agency_identification_task_operator(), - await self.get_url_miscellaneous_metadata_task_operator() + await self.get_url_miscellaneous_metadata_task_operator(), + await self.get_submit_approved_url_task_operator() ] #endregion diff --git a/core/classes/SubmitApprovedURLTaskOperator.py b/core/classes/SubmitApprovedURLTaskOperator.py index 2a308e7c..81f0b242 100644 --- a/core/classes/SubmitApprovedURLTaskOperator.py +++ b/core/classes/SubmitApprovedURLTaskOperator.py @@ -31,23 +31,35 @@ async def inner_task_logic(self): await self.link_urls_to_task(url_ids=[tdo.url_id for tdo in tdos]) # Submit each URL, recording errors if they exist - error_infos: list[URLErrorPydanticInfo] = [] - success_tdos: list[SubmitApprovedURLTDO] = [] - for tdo in tdos: - try: - data_source_id = await self.pdap_client.submit_url(tdo) - tdo.data_source_id = data_source_id - success_tdos.append(tdo) - except Exception as e: - error_info = URLErrorPydanticInfo( - task_id=self.task_id, - url_id=tdo.url_id, - error=str(e), - ) - error_infos.append(error_info) + submitted_url_infos = await self.pdap_client.submit_urls(tdos) + + error_infos = await self.get_error_infos(submitted_url_infos) + success_infos = await self.get_success_infos(submitted_url_infos) # Update the database for successful submissions - await self.adb_client.mark_urls_as_submitted(tdos=success_tdos) + await self.adb_client.mark_urls_as_submitted(infos=success_infos) # Update the database for failed submissions await self.adb_client.add_url_error_infos(error_infos) + + async def get_success_infos(self, submitted_url_infos): + success_infos = [ + response_object for response_object in submitted_url_infos + if response_object.data_source_id is not None + ] + return success_infos + + async def get_error_infos(self, submitted_url_infos): + error_infos: list[URLErrorPydanticInfo] = [] + error_response_objects = [ + response_object for response_object in submitted_url_infos + if response_object.request_error is not None + ] + for error_response_object in error_response_objects: + error_info = URLErrorPydanticInfo( + task_id=self.task_id, + url_id=error_response_object.url_id, + error=error_response_object.request_error, + ) + error_infos.append(error_info) + return error_infos diff --git a/core/enums.py b/core/enums.py index 213db47c..cfccbb92 100644 --- a/core/enums.py +++ b/core/enums.py @@ -7,11 +7,10 @@ class BatchStatus(Enum): ERROR = "error" ABORTED = "aborted" -class LabelStudioTaskStatus(Enum): - PENDING = "pending" - COMPLETED = "completed" - class RecordType(Enum): + """ + All available URL record types + """ ACCIDENT_REPORTS = "Accident Reports" ARREST_RECORDS = "Arrest Records" CALLS_FOR_SERVICE = "Calls for Service" @@ -51,8 +50,19 @@ class RecordType(Enum): class SuggestionType(Enum): + """ + Identifies the specific kind of suggestion made for a URL + """ AUTO_SUGGESTION = "Auto Suggestion" MANUAL_SUGGESTION = "Manual Suggestion" UNKNOWN = "Unknown" NEW_AGENCY = "New Agency" CONFIRMED = "Confirmed" + +class SubmitResponseStatus(Enum): + """ + Response statuses from the /source-collector/data-sources endpoint + """ + SUCCESS = "success" + FAILURE = "FAILURE" + ALREADY_EXISTS = "already_exists" \ No newline at end of file diff --git a/html_tag_collector/RootURLCache.py b/html_tag_collector/RootURLCache.py index e306b6e1..165be89d 100644 --- a/html_tag_collector/RootURLCache.py +++ b/html_tag_collector/RootURLCache.py @@ -16,7 +16,9 @@ class RootURLCacheResponseInfo: exception: Optional[Exception] = None class RootURLCache: - def __init__(self, adb_client: AsyncDatabaseClient = AsyncDatabaseClient()): + def __init__(self, adb_client: Optional[AsyncDatabaseClient] = None): + if adb_client is None: + adb_client = AsyncDatabaseClient() self.adb_client = adb_client self.cache = None diff --git a/llm_api_logic/OpenAIRecordClassifier.py b/llm_api_logic/OpenAIRecordClassifier.py index fc20a0e2..cc0829b5 100644 --- a/llm_api_logic/OpenAIRecordClassifier.py +++ b/llm_api_logic/OpenAIRecordClassifier.py @@ -1,17 +1,16 @@ -from typing import Any from openai.types.chat import ParsedChatCompletion +from core.EnvVarManager import EnvVarManager from llm_api_logic.LLMRecordClassifierBase import RecordClassifierBase from llm_api_logic.RecordTypeStructuredOutput import RecordTypeStructuredOutput -from util.helper_functions import get_from_env class OpenAIRecordClassifier(RecordClassifierBase): @property def api_key(self): - return get_from_env("OPENAI_API_KEY") + return EnvVarManager.get().openai_api_key @property def model_name(self): diff --git a/pdap_api_client/AccessManager.py b/pdap_api_client/AccessManager.py index 1020f365..aadd8451 100644 --- a/pdap_api_client/AccessManager.py +++ b/pdap_api_client/AccessManager.py @@ -4,8 +4,8 @@ import requests from aiohttp import ClientSession +from core.EnvVarManager import EnvVarManager from pdap_api_client.DTOs import RequestType, Namespaces, RequestInfo, ResponseInfo -from util.helper_functions import get_from_env request_methods = { RequestType.POST: ClientSession.post, @@ -23,7 +23,7 @@ def build_url( namespace: Namespaces, subdomains: Optional[list[str]] = None ): - api_url = get_from_env('PDAP_API_URL') + api_url = EnvVarManager.get().pdap_api_url url = f"{api_url}/{namespace.value}" if subdomains is not None: url = f"{url}/{'/'.join(subdomains)}" diff --git a/pdap_api_client/DTOs.py b/pdap_api_client/DTOs.py index 37d7e857..93f67839 100644 --- a/pdap_api_client/DTOs.py +++ b/pdap_api_client/DTOs.py @@ -37,6 +37,7 @@ class Namespaces(Enum): MATCH = "match" CHECK = "check" DATA_SOURCES = "data-sources" + SOURCE_COLLECTOR = "source-collector" class RequestType(Enum): diff --git a/pdap_api_client/PDAPClient.py b/pdap_api_client/PDAPClient.py index 8b1c5e82..24b9d98c 100644 --- a/pdap_api_client/PDAPClient.py +++ b/pdap_api_client/PDAPClient.py @@ -1,6 +1,6 @@ from typing import Optional -from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO +from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO, SubmittedURLInfo from pdap_api_client.AccessManager import build_url, AccessManager from pdap_api_client.DTOs import MatchAgencyInfo, UniqueURLDuplicateInfo, UniqueURLResponseInfo, Namespaces, \ RequestType, RequestInfo, MatchAgencyResponse @@ -85,30 +85,59 @@ async def is_url_unique( duplicates=duplicates ) - async def submit_url( + async def submit_urls( self, - tdo: SubmitApprovedURLTDO - ) -> int: - url = build_url( - namespace=Namespaces.DATA_SOURCES, + tdos: list[SubmitApprovedURLTDO] + ) -> list[SubmittedURLInfo]: + """ + Submits URLs to Data Sources App, + modifying tdos in-place with data source id or error + """ + request_url = build_url( + namespace=Namespaces.SOURCE_COLLECTOR, + subdomains=["data-sources"] ) + + # Build url-id dictionary + url_id_dict = {} + for tdo in tdos: + url_id_dict[tdo.url] = tdo.url_id + + data_sources_json = [] + for tdo in tdos: + data_sources_json.append({ + "name": tdo.name, + "description": tdo.description, + "source_url": tdo.url, + "record_type": tdo.record_type.value, + "record_formats": tdo.record_formats, + "data_portal_type": tdo.data_portal_type, + "last_approval_editor": tdo.approving_user_id, + "supplying_entity": tdo.supplying_entity, + "agency_ids": tdo.agency_ids + }) + + headers = await self.access_manager.jwt_header() request_info = RequestInfo( type_=RequestType.POST, - url=url, + url=request_url, headers=headers, json={ - "entry_data": { - "name": tdo.name, - "description": tdo.description, - "source_url": tdo.url, - "record_type_name": tdo.record_type.value, - "record_formats": tdo.record_formats, - "data_portal_type": tdo.data_portal_type, - "supplying_entity": tdo.supplying_entity - }, - "linked_agency_ids": tdo.agency_ids + "data_sources": data_sources_json } ) response_info = await self.access_manager.make_request(request_info) - return response_info.data["id"] + data_sources_response_json = response_info.data["data_sources"] + + results = [] + for data_source in data_sources_response_json: + url = data_source["url"] + response_object = SubmittedURLInfo( + url_id=url_id_dict[url], + data_source_id=data_source["data_source_id"], + request_error=data_source["error"] + ) + results.append(response_object) + + return results diff --git a/start_mirrored_local_app.py b/start_mirrored_local_app.py index 48859adc..940c372e 100644 --- a/start_mirrored_local_app.py +++ b/start_mirrored_local_app.py @@ -19,7 +19,7 @@ import docker from docker.errors import APIError, NotFound from docker.models.containers import Container -from pydantic import BaseModel, model_validator, AfterValidator +from pydantic import BaseModel, AfterValidator from apply_migrations import apply_migrations from util.helper_functions import get_from_env @@ -193,7 +193,7 @@ def get_image(self, dockerfile_info: DockerfileInfo): def run_container( self, docker_info: DockerInfo, - ): + ) -> Container: print(f"Running container {docker_info.name}") try: container = self.client.containers.get(docker_info.name) @@ -255,24 +255,11 @@ def set_last_run_time(self): with open("local_state/last_run.txt", "w") as f: f.write(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - - -def main(): - docker_manager = DockerManager() - # Ensure docker is running, and start if not - if not is_docker_running(): - start_docker_engine() - - - # Ensure Dockerfile for database is running, and if not, start it - database_docker_info = DockerInfo( +def get_database_docker_info() -> DockerInfo: + return DockerInfo( dockerfile_info=DockerfileInfo( image_tag="postgres:15", ), - # volume_info=VolumeInfo( - # host_path="dbscripts", - # container_path="/var/lib/postgresql/data" - # ), name="data_source_identification_db", ports={ "5432/tcp": 5432 @@ -290,12 +277,9 @@ def main(): start_period=2 ) ) - container = docker_manager.run_container(database_docker_info) - wait_for_pg_to_be_ready(container) - - # Start dockerfile for Datadumper - data_dumper_docker_info = DockerInfo( +def get_data_dumper_docker_info() -> DockerInfo: + return DockerInfo( dockerfile_info=DockerfileInfo( image_tag="datadumper", dockerfile_directory="local_database/DataDumper" @@ -320,6 +304,21 @@ def main(): command="bash" ) +def main(): + docker_manager = DockerManager() + # Ensure docker is running, and start if not + if not is_docker_running(): + start_docker_engine() + + # Ensure Dockerfile for database is running, and if not, start it + database_docker_info = get_database_docker_info() + container = docker_manager.run_container(database_docker_info) + wait_for_pg_to_be_ready(container) + + + # Start dockerfile for Datadumper + data_dumper_docker_info = get_data_dumper_docker_info() + # If not last run within 24 hours, run dump operation in Datadumper # Check cache if exists and checker = TimestampChecker() @@ -343,11 +342,20 @@ def main(): apply_migrations() # Run `fastapi dev main.py` - uvicorn.run( - "api.main:app", - host="0.0.0.0", - port=8000 - ) + try: + uvicorn.run( + "api.main:app", + host="0.0.0.0", + port=8000 + ) + finally: + # Add feature to stop all running containers + print("Stopping containers...") + for container in docker_manager.client.containers.list(): + container.stop() + + print("Containers stopped.") + diff --git a/tests/conftest.py b/tests/conftest.py index 8aeb6dc6..d7b1bce7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,4 @@ import pytest -from alembic import command from alembic.config import Config from sqlalchemy import create_engine, inspect, MetaData from sqlalchemy.orm import scoped_session, sessionmaker @@ -8,12 +7,42 @@ from collector_db.DatabaseClient import DatabaseClient from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import Base +from core.EnvVarManager import EnvVarManager from tests.helpers.AlembicRunner import AlembicRunner from tests.helpers.DBDataCreator import DBDataCreator +from util.helper_functions import load_from_environment @pytest.fixture(autouse=True, scope="session") def setup_and_teardown(): + # Set up environment variables that must be defined + # outside of tests + required_env_vars: dict = load_from_environment( + keys=[ + "POSTGRES_USER", + "POSTGRES_PASSWORD", + "POSTGRES_HOST", + "POSTGRES_PORT", + "POSTGRES_DB", + ] + ) + # Add test environment variables + test_env_vars = [ + "GOOGLE_API_KEY", + "GOOGLE_CSE_ID", + "PDAP_EMAIL", + "PDAP_PASSWORD", + "PDAP_API_KEY", + "PDAP_API_URL", + "DISCORD_WEBHOOK_URL", + "OPENAI_API_KEY", + ] + all_env_vars = required_env_vars.copy() + for env_var in test_env_vars: + all_env_vars[env_var] = "TEST" + + EnvVarManager.override(all_env_vars) + conn = get_postgres_connection_string() engine = create_engine(conn) alembic_cfg = Config("alembic.ini") diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 60b873c4..613bfe4d 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -23,13 +23,17 @@ class BatchURLCreationInfo(BaseModel): batch_id: int url_ids: list[int] + urls: list[str] class DBDataCreator: """ Assists in the creation of test data """ - def __init__(self, db_client: DatabaseClient = DatabaseClient()): - self.db_client = db_client + def __init__(self, db_client: Optional[DatabaseClient] = None): + if db_client is not None: + self.db_client = db_client + else: + self.db_client = DatabaseClient() self.adb_client: AsyncDatabaseClient = AsyncDatabaseClient() def batch(self, strategy: CollectorType = CollectorType.EXAMPLE) -> int: @@ -63,7 +67,8 @@ async def batch_and_urls( return BatchURLCreationInfo( batch_id=batch_id, - url_ids=url_ids + url_ids=url_ids, + urls=[iui.url for iui in iuis.url_mappings] ) async def agency(self) -> int: @@ -189,6 +194,7 @@ def urls( URLInfo( url=url, outcome=outcome, + name="Test Name" if outcome == URLStatus.VALIDATED else None, collector_metadata=collector_metadata ) ) diff --git a/tests/test_automated/integration/api/conftest.py b/tests/test_automated/integration/api/conftest.py index b466bfbb..ae34b28e 100644 --- a/tests/test_automated/integration/api/conftest.py +++ b/tests/test_automated/integration/api/conftest.py @@ -1,9 +1,6 @@ -import asyncio -import logging -import os from dataclasses import dataclass from typing import Generator -from unittest.mock import MagicMock, AsyncMock +from unittest.mock import MagicMock, AsyncMock, patch import pytest import pytest_asyncio @@ -11,7 +8,6 @@ from api.main import app from core.AsyncCore import AsyncCore -from core.AsyncCoreLogger import AsyncCoreLogger from core.SourceCollectorCore import SourceCollectorCore from security_manager.SecurityManager import get_access_info, AccessInfo, Permissions from tests.helpers.DBDataCreator import DBDataCreator @@ -48,9 +44,7 @@ def override_access_info() -> AccessInfo: @pytest.fixture(scope="session") def client() -> Generator[TestClient, None, None]: - # Mock envioronment - _original_env = dict(os.environ) - os.environ["DISCORD_WEBHOOK_URL"] = "https://discord.com" + # Mock environment with TestClient(app) as c: app.dependency_overrides[get_access_info] = override_access_info async_core: AsyncCore = c.app.state.async_core @@ -67,8 +61,6 @@ def client() -> Generator[TestClient, None, None]: yield c # Reset environment variables back to original state - os.environ.clear() - os.environ.update(_original_env) @pytest_asyncio.fixture diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/test_automated/integration/api/test_annotate.py index 0e462ba5..0501ac1f 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/test_automated/integration/api/test_annotate.py @@ -1,15 +1,12 @@ -from typing import Any import pytest from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_db.DTOs.URLMapping import URLMapping -from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource from collector_db.models import UserUrlAgencySuggestion, UserRelevantSuggestion, UserRecordTypeSuggestion from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import URLAgencyAnnotationPostInfo -from core.DTOs.GetNextURLForAnnotationResponse import GetNextURLForAnnotationResponse from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo from core.enums import RecordType, SuggestionType diff --git a/tests/test_automated/integration/api/test_duplicates.py b/tests/test_automated/integration/api/test_duplicates.py index c42b894d..a5c77b29 100644 --- a/tests/test_automated/integration/api/test_duplicates.py +++ b/tests/test_automated/integration/api/test_duplicates.py @@ -1,5 +1,4 @@ import time -from unittest.mock import AsyncMock from collector_db.DTOs.BatchInfo import BatchInfo from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO @@ -30,7 +29,7 @@ def test_duplicates(api_test_helper): assert batch_id_2 is not None - time.sleep(2) + time.sleep(1.5) bi_1: BatchInfo = ath.request_validator.get_batch_info(batch_id_1) bi_2: BatchInfo = ath.request_validator.get_batch_info(batch_id_2) diff --git a/tests/test_automated/integration/collector_db/test_database_structure.py b/tests/test_automated/integration/collector_db/test_database_structure.py index 2b2fcbca..6d82631c 100644 --- a/tests/test_automated/integration/collector_db/test_database_structure.py +++ b/tests/test_automated/integration/collector_db/test_database_structure.py @@ -52,9 +52,11 @@ def __init__( self, columns: list[ColumnTester], table_name: str, - engine: sa.Engine = create_engine(get_postgres_connection_string()), + engine: Optional[sa.Engine] = None, constraints: Optional[list[ConstraintTester]] = None, ): + if engine is None: + engine = create_engine(get_postgres_connection_string(is_async=True)) self.columns = columns self.table_name = table_name self.constraints = constraints @@ -228,6 +230,11 @@ def test_url(db_data_creator: DBDataCreator): column_name="outcome", type_=postgresql.ENUM, allowed_values=get_enum_values(URLStatus) + ), + ColumnTester( + column_name="name", + type_=sa.String, + allowed_values=['test'], ) ], engine=db_data_creator.db_client.engine diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index c78bf57e..7b98728f 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -60,11 +60,12 @@ async def test_insert_urls( assert insert_urls_info.original_count == 2 assert insert_urls_info.duplicate_count == 1 - -def test_insert_logs(db_data_creator: DBDataCreator): +@pytest.mark.asyncio +async def test_insert_logs(db_data_creator: DBDataCreator): batch_id_1 = db_data_creator.batch() batch_id_2 = db_data_creator.batch() + adb_client = db_data_creator.adb_client db_client = db_data_creator.db_client db_client.insert_logs( log_infos=[ @@ -74,26 +75,28 @@ def test_insert_logs(db_data_creator: DBDataCreator): ] ) - logs = db_client.get_logs_by_batch_id(batch_id_1) + logs = await adb_client.get_logs_by_batch_id(batch_id_1) assert len(logs) == 2 - logs = db_client.get_logs_by_batch_id(batch_id_2) + logs = await adb_client.get_logs_by_batch_id(batch_id_2) assert len(logs) == 1 -def test_delete_old_logs(db_data_creator: DBDataCreator): +@pytest.mark.asyncio +async def test_delete_old_logs(db_data_creator: DBDataCreator): batch_id = db_data_creator.batch() old_datetime = datetime.now() - timedelta(days=1) db_client = db_data_creator.db_client + adb_client = db_data_creator.adb_client log_infos = [] for i in range(3): log_infos.append(LogInfo(log="test log", batch_id=batch_id, created_at=old_datetime)) db_client.insert_logs(log_infos=log_infos) - logs = db_client.get_logs_by_batch_id(batch_id=batch_id) + logs = await adb_client.get_logs_by_batch_id(batch_id=batch_id) assert len(logs) == 3 db_client.delete_old_logs() - logs = db_client.get_logs_by_batch_id(batch_id=batch_id) + logs = await adb_client.get_logs_by_batch_id(batch_id=batch_id) assert len(logs) == 0 def test_delete_url_updated_at(db_data_creator: DBDataCreator): diff --git a/tests/test_automated/integration/core/test_async_core.py b/tests/test_automated/integration/core/test_async_core.py index b4b8e740..ed314dfd 100644 --- a/tests/test_automated/integration/core/test_async_core.py +++ b/tests/test_automated/integration/core/test_async_core.py @@ -21,6 +21,7 @@ def setup_async_core(adb_client: AsyncDatabaseClient): url_request_interface=AsyncMock(), html_parser=AsyncMock(), discord_poster=AsyncMock(), + pdap_client=AsyncMock() ), collector_manager=AsyncMock() ) diff --git a/tests/test_automated/integration/tasks/test_submit_approved_url_task.py b/tests/test_automated/integration/tasks/test_submit_approved_url_task.py index 75630af8..04256de9 100644 --- a/tests/test_automated/integration/tasks/test_submit_approved_url_task.py +++ b/tests/test_automated/integration/tasks/test_submit_approved_url_task.py @@ -3,39 +3,54 @@ import pytest -from collector_db.models import URL +from collector_db.enums import TaskType +from collector_db.models import URL, URLErrorInfo from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator -from core.enums import RecordType +from core.enums import RecordType, SubmitResponseStatus from helpers.DBDataCreator import BatchURLCreationInfo, DBDataCreator from pdap_api_client.AccessManager import AccessManager from pdap_api_client.DTOs import RequestInfo, RequestType, ResponseInfo from pdap_api_client.PDAPClient import PDAPClient +def mock_make_request(pdap_client: PDAPClient, urls: list[str]): + assert len(urls) == 3, "Expected 3 urls" + pdap_client.access_manager.make_request = AsyncMock( + return_value=ResponseInfo( + status_code=HTTPStatus.OK, + data={ + "data_sources": [ + { + "url": urls[0], + "status": SubmitResponseStatus.SUCCESS, + "error": None, + "data_source_id": 21, + }, + { + "url": urls[1], + "status": SubmitResponseStatus.SUCCESS, + "error": None, + "data_source_id": 34, + }, + { + "url": urls[2], + "status": SubmitResponseStatus.FAILURE, + "error": "Test Error", + "data_source_id": None + } + ] + } + ) + ) + @pytest.fixture -def mock_pdap_client(): +def mock_pdap_client() -> PDAPClient: mock_access_manager = MagicMock( spec=AccessManager ) - mock_access_manager.make_request = AsyncMock( - side_effect=[ - ResponseInfo( - status_code=HTTPStatus.OK, - data={ - "id": 21 - } - ), - ResponseInfo( - status_code=HTTPStatus.OK, - data={ - "id": 34 - } - ) - ] - ) mock_access_manager.jwt_header = AsyncMock( return_value={"Authorization": "Bearer token"} ) @@ -44,13 +59,15 @@ def mock_pdap_client(): ) return pdap_client -async def setup_validated_urls(db_data_creator: DBDataCreator): +async def setup_validated_urls(db_data_creator: DBDataCreator) -> list[str]: creation_info: BatchURLCreationInfo = await db_data_creator.batch_and_urls( - url_count=2, + url_count=3, with_html_content=True ) + url_1 = creation_info.url_ids[0] url_2 = creation_info.url_ids[1] + url_3 = creation_info.url_ids[2] await db_data_creator.adb_client.approve_url( approval_info=FinalReviewApprovalInfo( url_id=url_1, @@ -72,16 +89,31 @@ async def setup_validated_urls(db_data_creator: DBDataCreator): name="URL 2 Name", description="URL 2 Description", ), - user_id=1 + user_id=2 + ) + await db_data_creator.adb_client.approve_url( + approval_info=FinalReviewApprovalInfo( + url_id=url_3, + record_type=RecordType.ACCIDENT_REPORTS, + agency_ids=[5, 6], + name="URL 3 Name", + description="URL 3 Description", + ), + user_id=3 ) + return creation_info.urls @pytest.mark.asyncio async def test_submit_approved_url_task( db_data_creator, - mock_pdap_client, + mock_pdap_client: PDAPClient, monkeypatch ): - monkeypatch.setenv("PDAP_API_URL", "http://localhost:8000") + """ + The submit_approved_url_task should submit + all validated URLs to the PDAP Data Sources App + """ + # Get Task Operator operator = SubmitApprovedURLTaskOperator( @@ -94,13 +126,17 @@ async def test_submit_approved_url_task( # Create URLs with status 'validated' in database and all requisite URL values # Ensure they have optional metadata as well - await setup_validated_urls(db_data_creator) + urls = await setup_validated_urls(db_data_creator) + mock_make_request(mock_pdap_client, urls) # Check Task Operator does meet pre-requisites assert await operator.meets_task_prerequisites() # Run Task - run_info = await operator.run_task(task_id=1) + task_id = await db_data_creator.adb_client.initiate_task( + task_type=TaskType.SUBMIT_APPROVED + ) + run_info = await operator.run_task(task_id=task_id) # Check Task has been marked as completed assert run_info.outcome == TaskOperatorOutcome.SUCCESS, run_info.message @@ -109,63 +145,73 @@ async def test_submit_approved_url_task( urls = await db_data_creator.adb_client.get_all(URL, order_by_attribute="id") url_1 = urls[0] url_2 = urls[1] + url_3 = urls[2] # Check URLs have been marked as 'submitted' assert url_1.outcome == URLStatus.SUBMITTED.value assert url_2.outcome == URLStatus.SUBMITTED.value + assert url_3.outcome == URLStatus.ERROR.value # Check URLs now have data source ids assert url_1.data_source_id == 21 assert url_2.data_source_id == 34 + assert url_3.data_source_id is None - # Check mock method was called twice with expected parameters - access_manager = mock_pdap_client.access_manager - assert access_manager.make_request.call_count == 2 - # Check first call + # Check that errored URL has entry in url_error_info + url_errors = await db_data_creator.adb_client.get_all(URLErrorInfo) + assert len(url_errors) == 1 + url_error = url_errors[0] + assert url_error.url_id == url_3.id + assert url_error.error == "Test Error" + # Check mock method was called expected parameters + access_manager = mock_pdap_client.access_manager + access_manager.make_request.assert_called_once() call_1 = access_manager.make_request.call_args_list[0][0][0] expected_call_1 = RequestInfo( type_=RequestType.POST, - url="http://localhost:8000/data-sources", + url="TEST/source-collector/data-sources", headers=access_manager.jwt_header.return_value, json={ - "entry_data": { - "name": "URL 1 Name", - "source_url": url_1.url, - "record_type_name": "Accident Reports", - "description": "URL 1 Description", - "record_formats": ["Record Format 1", "Record Format 2"], - "data_portal_type": "Data Portal Type 1", - "supplying_entity": "Supplying Entity 1" - }, - "linked_agency_ids": [1, 2] + "data_sources": [ + { + "name": "URL 1 Name", + "source_url": url_1.url, + "record_type": "Accident Reports", + "description": "URL 1 Description", + "record_formats": ["Record Format 1", "Record Format 2"], + "data_portal_type": "Data Portal Type 1", + "last_approval_editor": 1, + "supplying_entity": "Supplying Entity 1", + "agency_ids": [1, 2] + }, + { + "name": "URL 2 Name", + "source_url": url_2.url, + "record_type": "Incarceration Records", + "description": "URL 2 Description", + "last_approval_editor": 2, + "supplying_entity": None, + "record_formats": None, + "data_portal_type": None, + "agency_ids": [3, 4] + }, + { + "name": "URL 3 Name", + "source_url": url_3.url, + "record_type": "Accident Reports", + "description": "URL 3 Description", + "last_approval_editor": 3, + "supplying_entity": None, + "record_formats": None, + "data_portal_type": None, + "agency_ids": [5, 6] + } + ] } ) assert call_1.type_ == expected_call_1.type_ assert call_1.url == expected_call_1.url assert call_1.headers == expected_call_1.headers assert call_1.json == expected_call_1.json - # Check second call - call_2 = access_manager.make_request.call_args_list[1][0][0] - expected_call_2 = RequestInfo( - type_=RequestType.POST, - url="http://localhost:8000/data-sources", - headers=access_manager.jwt_header.return_value, - json={ - "entry_data": { - "name": "URL 2 Name", - "source_url": url_2.url, - "record_type_name": "Incarceration Records", - "description": "URL 2 Description", - "data_portal_type": None, - "supplying_entity": None, - "record_formats": None - }, - "linked_agency_ids": [3, 4] - } - ) - assert call_2.type_ == expected_call_2.type_ - assert call_2.url == expected_call_2.url - assert call_2.headers == expected_call_2.headers - assert call_2.json == expected_call_2.json \ No newline at end of file diff --git a/util/DiscordNotifier.py b/util/DiscordNotifier.py index 15e74020..6df1aa90 100644 --- a/util/DiscordNotifier.py +++ b/util/DiscordNotifier.py @@ -10,4 +10,10 @@ def __init__(self, webhook_url: str): raise ValueError("WEBHOOK_URL environment variable not set") self.webhook_url = webhook_url def post_to_discord(self, message): - requests.post(self.webhook_url, json={"content": message}) + try: + requests.post(self.webhook_url, json={"content": message}) + except Exception as e: + logging.error( + f"Error posting message to Discord: {e}." + f"\n\nMessage: {message}" + ) diff --git a/util/helper_functions.py b/util/helper_functions.py index bf72d39b..7d6c7f8d 100644 --- a/util/helper_functions.py +++ b/util/helper_functions.py @@ -16,6 +16,19 @@ def get_from_env(key: str, allow_none: bool = False): raise ValueError(f"Environment variable {key} is not set") return val +def load_from_environment(keys: list[str]) -> dict[str, str]: + """ + Load selected keys from environment, returning a dictionary + """ + original_environment = os.environ.copy() + try: + load_dotenv() + return {key: os.getenv(key) for key in keys} + finally: + # Restore the original environment + os.environ.clear() + os.environ.update(original_environment) + def base_model_list_dump(model_list: list[BaseModel]) -> list[dict]: return [model.model_dump() for model in model_list] From beae1b9885b0e2e94dfefad703bf4c02fb9fce3b Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 15 Apr 2025 16:53:48 -0400 Subject: [PATCH 109/244] fix(tests): fix import bug --- .../integration/tasks/test_submit_approved_url_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_automated/integration/tasks/test_submit_approved_url_task.py b/tests/test_automated/integration/tasks/test_submit_approved_url_task.py index 04256de9..b15ff9d5 100644 --- a/tests/test_automated/integration/tasks/test_submit_approved_url_task.py +++ b/tests/test_automated/integration/tasks/test_submit_approved_url_task.py @@ -10,7 +10,7 @@ from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator from core.enums import RecordType, SubmitResponseStatus -from helpers.DBDataCreator import BatchURLCreationInfo, DBDataCreator +from tests.helpers.DBDataCreator import BatchURLCreationInfo, DBDataCreator from pdap_api_client.AccessManager import AccessManager from pdap_api_client.DTOs import RequestInfo, RequestType, ResponseInfo from pdap_api_client.PDAPClient import PDAPClient From d134194cefcd9616677ca3199c0527167c728e39 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 16 Apr 2025 20:10:24 -0400 Subject: [PATCH 110/244] feat(database): allow one user annotation per url Previously, multiple users could annotate a single URL. Now, only one user can annotate a URL -- after that URL has been annotated, no other users can annotate it. --- ...72_set_user_annotation_tables_to_allow_.py | 61 ++++++ collector_db/AsyncDatabaseClient.py | 9 +- core/DTOs/GetNextURLForFinalReviewResponse.py | 2 + core/TaskManager.py | 14 +- .../AgencyIdentificationTaskOperator.py | 2 +- .../SubmitApprovedURLTaskOperator.py | 2 +- .../{ => task_operators}/TaskOperatorBase.py | 0 .../URLHTMLTaskOperator.py | 2 +- .../URLMiscellaneousMetadataTaskOperator.py | 2 +- .../URLRecordTypeTaskOperator.py | 2 +- .../URLRelevanceHuggingfaceTaskOperator.py | 5 +- core/classes/task_operators/__init__.py | 0 .../test_html_tag_collector_integration.py | 2 +- .../integration/api/test_annotate.py | 20 +- .../collector_db/test_db_client.py | 175 ++++++++++++++++-- .../tasks/test_agency_preannotation_task.py | 3 +- .../integration/tasks/test_example_task.py | 3 +- .../tasks/test_submit_approved_url_task.py | 2 +- .../integration/tasks/test_url_html_task.py | 2 +- .../test_url_miscellaneous_metadata_task.py | 2 +- .../tasks/test_url_record_type_task.py | 4 +- .../test_url_relevancy_huggingface_task.py | 3 +- 22 files changed, 266 insertions(+), 51 deletions(-) create mode 100644 alembic/versions/2025_04_16_1954-997f5bf53772_set_user_annotation_tables_to_allow_.py rename core/classes/{ => task_operators}/AgencyIdentificationTaskOperator.py (98%) rename core/classes/{ => task_operators}/SubmitApprovedURLTaskOperator.py (97%) rename core/classes/{ => task_operators}/TaskOperatorBase.py (100%) rename core/classes/{ => task_operators}/URLHTMLTaskOperator.py (98%) rename core/classes/{ => task_operators}/URLMiscellaneousMetadataTaskOperator.py (97%) rename core/classes/{ => task_operators}/URLRecordTypeTaskOperator.py (97%) rename core/classes/{ => task_operators}/URLRelevanceHuggingfaceTaskOperator.py (91%) create mode 100644 core/classes/task_operators/__init__.py diff --git a/alembic/versions/2025_04_16_1954-997f5bf53772_set_user_annotation_tables_to_allow_.py b/alembic/versions/2025_04_16_1954-997f5bf53772_set_user_annotation_tables_to_allow_.py new file mode 100644 index 00000000..775caddf --- /dev/null +++ b/alembic/versions/2025_04_16_1954-997f5bf53772_set_user_annotation_tables_to_allow_.py @@ -0,0 +1,61 @@ +"""Set user annotation tables to allow only one annotation per url + +Revision ID: 997f5bf53772 +Revises: ed06a5633d2e +Create Date: 2025-04-16 19:54:59.798580 + +""" +from typing import Sequence, Union + +from alembic import op + + +# revision identifiers, used by Alembic. +revision: str = '997f5bf53772' +down_revision: Union[str, None] = 'ed06a5633d2e' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # Delete entries with more than one annotation + # Relevance + op.execute(""" + with ranked as( + SELECT + id, + ROW_NUMBER() OVER (PARTITION BY URL_ID ORDER BY id) as rn + FROM + USER_RELEVANT_SUGGESTIONS + ) + DELETE FROM user_relevant_suggestions + USING ranked + WHERE USER_RELEVANT_SUGGESTIONS.id = ranked.id + and ranked.rn > 1 + """) + # Record Type + op.execute(""" + with ranked as( + SELECT + id, + ROW_NUMBER() OVER (PARTITION BY URL_ID ORDER BY id) as rn + FROM + USER_RECORD_TYPE_SUGGESTIONS + ) + DELETE FROM user_record_type_suggestions + USING ranked + WHERE USER_RECORD_TYPE_SUGGESTIONS.id = ranked.id + and ranked.rn > 1 + """) + + # Add unique constraint to url_id column + op.create_unique_constraint('uq_user_relevant_suggestions_url_id', 'user_relevant_suggestions', ['url_id']) + op.create_unique_constraint('uq_user_record_type_suggestions_url_id', 'user_record_type_suggestions', ['url_id']) + op.create_unique_constraint('uq_user_agency_suggestions_url_id', 'user_url_agency_suggestions', ['url_id']) + + + +def downgrade() -> None: + op.drop_constraint('uq_user_relevant_suggestions_url_id', 'user_relevant_suggestions', type_='unique') + op.drop_constraint('uq_user_record_type_suggestions_url_id', 'user_record_type_suggestions', type_='unique') + op.drop_constraint('uq_user_agency_suggestions_url_id', 'user_url_agency_suggestions', type_='unique') \ No newline at end of file diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 98410b6f..c8b4a204 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -137,14 +137,13 @@ async def get_next_url_for_user_annotation( URL, ) .where(URL.outcome == URLStatus.PENDING.value) - # URL must not have metadata annotation by this user + # URL must not have user suggestion .where( not_( exists( select(user_suggestion_model_to_exclude) .where( user_suggestion_model_to_exclude.url_id == URL.id, - user_suggestion_model_to_exclude.user_id == user_id ) ) ) @@ -158,7 +157,6 @@ async def get_next_url_for_user_annotation( select(UserRelevantSuggestion) .where( UserRelevantSuggestion.url_id == URL.id, - UserRelevantSuggestion.user_id == user_id, UserRelevantSuggestion.relevant == False ) ) @@ -833,15 +831,14 @@ async def get_next_url_agency_for_annotation( if batch_id is not None: statement = statement.where(URL.batch_id == batch_id) - # Must not have been annotated by this user + # Must not have been annotated by a user statement = ( statement.join(UserUrlAgencySuggestion, isouter=True) .where( ~exists( select(UserUrlAgencySuggestion). where( - (UserUrlAgencySuggestion.user_id == user_id) & - (UserUrlAgencySuggestion.url_id == URL.id) + UserUrlAgencySuggestion.url_id == URL.id ). correlate(URL) ) diff --git a/core/DTOs/GetNextURLForFinalReviewResponse.py b/core/DTOs/GetNextURLForFinalReviewResponse.py index 422c38ab..f7f44e32 100644 --- a/core/DTOs/GetNextURLForFinalReviewResponse.py +++ b/core/DTOs/GetNextURLForFinalReviewResponse.py @@ -23,6 +23,7 @@ class FinalReviewAnnotationRecordTypeInfo(BaseModel): title="A dictionary, sorted by size and omitting zero values, of all record types suggested by users", ) +# region Agency class FinalReviewAnnotationAgencyUserInfo(GetNextURLForAgencyAgencyInfo): count: int = Field(title="Number of times suggested by users") @@ -41,6 +42,7 @@ class FinalReviewAnnotationAgencyInfo(BaseModel): users: Optional[dict[int, FinalReviewAnnotationAgencyUserInfo]] = Field( title="A list, sorted by size, of all agencies suggested by users", ) +# endregion class FinalReviewAnnotationInfo(BaseModel): relevant: FinalReviewAnnotationRelevantInfo = Field( diff --git a/core/TaskManager.py b/core/TaskManager.py index 7796e80e..8a40b129 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -7,13 +7,13 @@ from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome from core.FunctionTrigger import FunctionTrigger -from core.classes.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator -from core.classes.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator -from core.classes.TaskOperatorBase import TaskOperatorBase -from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator -from core.classes.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator -from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator -from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator +from core.classes.task_operators.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator +from core.classes.task_operators.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator +from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase +from core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator +from core.classes.task_operators.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator +from core.classes.task_operators.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator +from core.classes.task_operators.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator from core.enums import BatchStatus from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.URLRequestInterface import URLRequestInterface diff --git a/core/classes/AgencyIdentificationTaskOperator.py b/core/classes/task_operators/AgencyIdentificationTaskOperator.py similarity index 98% rename from core/classes/AgencyIdentificationTaskOperator.py rename to core/classes/task_operators/AgencyIdentificationTaskOperator.py index 1589b96f..4c2d6f1b 100644 --- a/core/classes/AgencyIdentificationTaskOperator.py +++ b/core/classes/task_operators/AgencyIdentificationTaskOperator.py @@ -7,7 +7,7 @@ from collector_manager.enums import CollectorType from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO -from core.classes.TaskOperatorBase import TaskOperatorBase +from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase from core.classes.subtasks.AutoGooglerAgencyIdentificationSubtask import AutoGooglerAgencyIdentificationSubtask from core.classes.subtasks.CKANAgencyIdentificationSubtask import CKANAgencyIdentificationSubtask from core.classes.subtasks.CommonCrawlerAgencyIdentificationSubtask import CommonCrawlerAgencyIdentificationSubtask diff --git a/core/classes/SubmitApprovedURLTaskOperator.py b/core/classes/task_operators/SubmitApprovedURLTaskOperator.py similarity index 97% rename from core/classes/SubmitApprovedURLTaskOperator.py rename to core/classes/task_operators/SubmitApprovedURLTaskOperator.py index 81f0b242..86e0229e 100644 --- a/core/classes/SubmitApprovedURLTaskOperator.py +++ b/core/classes/task_operators/SubmitApprovedURLTaskOperator.py @@ -2,7 +2,7 @@ from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.enums import TaskType from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO -from core.classes.TaskOperatorBase import TaskOperatorBase +from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase from pdap_api_client.PDAPClient import PDAPClient diff --git a/core/classes/TaskOperatorBase.py b/core/classes/task_operators/TaskOperatorBase.py similarity index 100% rename from core/classes/TaskOperatorBase.py rename to core/classes/task_operators/TaskOperatorBase.py diff --git a/core/classes/URLHTMLTaskOperator.py b/core/classes/task_operators/URLHTMLTaskOperator.py similarity index 98% rename from core/classes/URLHTMLTaskOperator.py rename to core/classes/task_operators/URLHTMLTaskOperator.py index ad279f9d..f6cfa28a 100644 --- a/core/classes/URLHTMLTaskOperator.py +++ b/core/classes/task_operators/URLHTMLTaskOperator.py @@ -4,7 +4,7 @@ from collector_db.enums import TaskType from core.DTOs.task_data_objects.UrlHtmlTDO import UrlHtmlTDO from core.classes.HTMLContentInfoGetter import HTMLContentInfoGetter -from core.classes.TaskOperatorBase import TaskOperatorBase +from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.URLRequestInterface import URLRequestInterface diff --git a/core/classes/URLMiscellaneousMetadataTaskOperator.py b/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py similarity index 97% rename from core/classes/URLMiscellaneousMetadataTaskOperator.py rename to core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py index 1cbebbc6..68a3a243 100644 --- a/core/classes/URLMiscellaneousMetadataTaskOperator.py +++ b/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py @@ -5,7 +5,7 @@ from collector_db.enums import TaskType from collector_manager.enums import CollectorType from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO -from core.classes.TaskOperatorBase import TaskOperatorBase +from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase from core.classes.subtasks.MiscellaneousMetadata.AutoGooglerMiscMetadataSubtask import AutoGooglerMiscMetadataSubtask from core.classes.subtasks.MiscellaneousMetadata.CKANMiscMetadataSubtask import CKANMiscMetadataSubtask from core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ diff --git a/core/classes/URLRecordTypeTaskOperator.py b/core/classes/task_operators/URLRecordTypeTaskOperator.py similarity index 97% rename from core/classes/URLRecordTypeTaskOperator.py rename to core/classes/task_operators/URLRecordTypeTaskOperator.py index 3f94811f..ab1f1f08 100644 --- a/core/classes/URLRecordTypeTaskOperator.py +++ b/core/classes/task_operators/URLRecordTypeTaskOperator.py @@ -2,7 +2,7 @@ from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.enums import TaskType from core.DTOs.task_data_objects.URLRecordTypeTDO import URLRecordTypeTDO -from core.classes.TaskOperatorBase import TaskOperatorBase +from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase from core.enums import RecordType from llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier diff --git a/core/classes/URLRelevanceHuggingfaceTaskOperator.py b/core/classes/task_operators/URLRelevanceHuggingfaceTaskOperator.py similarity index 91% rename from core/classes/URLRelevanceHuggingfaceTaskOperator.py rename to core/classes/task_operators/URLRelevanceHuggingfaceTaskOperator.py index e6ebdc3d..4871a9f0 100644 --- a/core/classes/URLRelevanceHuggingfaceTaskOperator.py +++ b/core/classes/task_operators/URLRelevanceHuggingfaceTaskOperator.py @@ -1,9 +1,8 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.URLMetadataInfo import URLMetadataInfo from collector_db.DTOs.URLWithHTML import URLWithHTML -from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource, TaskType +from collector_db.enums import TaskType from core.DTOs.task_data_objects.URLRelevanceHuggingfaceTDO import URLRelevanceHuggingfaceTDO -from core.classes.TaskOperatorBase import TaskOperatorBase +from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase from hugging_face.HuggingFaceInterface import HuggingFaceInterface diff --git a/core/classes/task_operators/__init__.py b/core/classes/task_operators/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/manual/html_collector/test_html_tag_collector_integration.py b/tests/manual/html_collector/test_html_tag_collector_integration.py index 8f1fc630..3ffef203 100644 --- a/tests/manual/html_collector/test_html_tag_collector_integration.py +++ b/tests/manual/html_collector/test_html_tag_collector_integration.py @@ -2,7 +2,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLInfo import URLInfo -from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator +from core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator from helpers.DBDataCreator import DBDataCreator from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.RootURLCache import RootURLCache diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/test_automated/integration/api/test_annotate.py index 0501ac1f..d5b6dade 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/test_automated/integration/api/test_annotate.py @@ -68,6 +68,9 @@ async def test_annotate_relevancy(api_test_helper): # Validate that the correct relevant value is returned assert inner_info_1.suggested_relevant is True + # A second user should see the same URL + + # Annotate with value 'False' and get next URL request_info_2: GetNextRelevanceAnnotationResponseOuterInfo = api_test_helper.request_validator.post_relevance_annotation_and_get_next( url_id=inner_info_1.url_info.url_id, @@ -106,7 +109,6 @@ async def test_annotate_relevancy(api_test_helper): assert result_2.relevant is True # If user submits annotation for same URL, the URL should be overwritten - request_info_4: GetNextRelevanceAnnotationResponseOuterInfo = api_test_helper.request_validator.post_relevance_annotation_and_get_next( url_id=inner_info_1.url_info.url_id, relevance_annotation_post_info=RelevanceAnnotationPostInfo( @@ -420,12 +422,6 @@ async def test_annotate_agency_other_user_annotation(api_test_helper): ) url_ids = setup_info.url_ids - - await ath.db_data_creator.manual_suggestion( - user_id=MOCK_USER_ID + 1, - url_id=url_ids[0], - ) - response = await ath.request_validator.get_next_agency_annotation() assert response.next_annotation @@ -440,6 +436,16 @@ async def test_annotate_agency_other_user_annotation(api_test_helper): # Check that one agency_suggestion exists assert len(next_annotation.agency_suggestions) == 1 + # Test that another user can insert a suggestion + await ath.db_data_creator.manual_suggestion( + user_id=MOCK_USER_ID + 1, + url_id=url_ids[0], + ) + + # After this, text that our user does not receive this URL + response = await ath.request_validator.get_next_agency_annotation() + assert response.next_annotation is None + @pytest.mark.asyncio async def test_annotate_agency_submit_and_get_next(api_test_helper): """ diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 7b98728f..0de7e16c 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -167,7 +167,7 @@ async def test_get_next_url_for_final_review_basic(db_data_creator: DBDataCreato ) url_mapping = setup_info.url_mapping - + # Add agency auto suggestions await db_data_creator.agency_auto_suggestions( url_id=url_mapping.url_id, count=3 @@ -478,6 +478,11 @@ async def test_approval_url_error(db_data_creator: DBDataCreator): async def test_get_next_url_for_user_relevance_annotation_pending( db_data_creator: DBDataCreator ): + """ + Users should receive a valid URL to annotate + All users should receive the same next URL + Once any user annotates that URL, none of the users should receive it again + """ setup_info = await setup_for_get_next_url_for_annotation( db_data_creator=db_data_creator, url_count=2 @@ -492,11 +497,45 @@ async def test_get_next_url_for_user_relevance_annotation_pending( ) adb_client = db_data_creator.adb_client - url = await adb_client.get_next_url_for_relevance_annotation( + url_1 = await adb_client.get_next_url_for_relevance_annotation( user_id=1, batch_id=None ) - assert url is not None + assert url_1 is not None + + url_2 = await adb_client.get_next_url_for_relevance_annotation( + user_id=2, + batch_id=None + ) + assert url_2 is not None + + assert url_1.url_info.url == url_2.url_info.url + + # Annotate this URL, then check that the second URL is returned + await adb_client.add_user_relevant_suggestion( + url_id=url_1.url_info.url_id, + user_id=1, + relevant=True + ) + + url_3 = await adb_client.get_next_url_for_relevance_annotation( + user_id=1, + batch_id=None + ) + assert url_3 is not None + + assert url_1 != url_3 + + # Check that the second URL is also returned for another user + url_4 = await adb_client.get_next_url_for_relevance_annotation( + user_id=2, + batch_id=None + ) + assert url_4 is not None + + + assert url_4 == url_3 + @pytest.mark.asyncio async def test_get_next_url_for_annotation_batch_filtering( @@ -643,26 +682,27 @@ async def test_annotate_url_marked_not_relevant(db_data_creator: DBDataCreator): ) assert record_type_annotation_info.url_info.url_id != url_to_mark_not_relevant.url_id - # Other users should still receive the URL for record type annotation + # Other users also should not receive the URL for record type annotation record_type_annotation_info = await adb_client.get_next_url_for_record_type_annotation( user_id=2, batch_id=None ) - assert record_type_annotation_info.url_info.url_id == url_to_mark_not_relevant.url_id + assert record_type_annotation_info.url_info.url_id != \ + url_to_mark_not_relevant.url_id, "Other users should not receive the URL for record type annotation" # User should not receive the URL for agency annotation - agency_annotation_info = await adb_client.get_next_url_agency_for_annotation( + agency_annotation_info_user_1 = await adb_client.get_next_url_agency_for_annotation( user_id=1, batch_id=None ) - assert agency_annotation_info.next_annotation.url_id != url_to_mark_not_relevant.url_id + assert agency_annotation_info_user_1.next_annotation.url_id != url_to_mark_not_relevant.url_id - # Other users should still receive the URL for agency annotation - agency_annotation_info = await adb_client.get_next_url_agency_for_annotation( + # Other users also should not receive the URL for agency annotation + agency_annotation_info_user_2 = await adb_client.get_next_url_agency_for_annotation( user_id=2, batch_id=None ) - assert agency_annotation_info.next_annotation.url_id == url_to_mark_not_relevant.url_id + assert agency_annotation_info_user_1.next_annotation.url_id != url_to_mark_not_relevant.url_id @pytest.mark.asyncio async def test_annotate_url_agency_agency_not_in_db(db_data_creator: DBDataCreator): @@ -681,4 +721,117 @@ async def test_annotate_url_agency_agency_not_in_db(db_data_creator: DBDataCreat agencies = await db_data_creator.adb_client.get_all(Agency) assert len(agencies) - assert agencies[0].name == PLACEHOLDER_AGENCY_NAME \ No newline at end of file + assert agencies[0].name == PLACEHOLDER_AGENCY_NAME + +@pytest.mark.asyncio +async def test_get_next_url_for_user_record_type_annotation(db_data_creator: DBDataCreator): + """ + All users should receive the same next valid URL for record type annotation + Once any user annotates that URL, none of the users should receive it + """ + setup_info = await setup_for_get_next_url_for_annotation( + db_data_creator, + url_count=2 + ) + + # All users should receive the same URL + url_1 = setup_info.insert_urls_info.url_mappings[0] + url_2 = setup_info.insert_urls_info.url_mappings[1] + + adb_client = db_data_creator.adb_client + + url_user_1 = await adb_client.get_next_url_for_record_type_annotation( + user_id=1, + batch_id=None + ) + assert url_user_1 is not None + + url_user_2 = await adb_client.get_next_url_for_record_type_annotation( + user_id=2, + batch_id=None + ) + + assert url_user_2 is not None + + # Check that the URLs are the same + assert url_user_1 == url_user_2 + + # After annotating, both users should receive a different URL + await adb_client.add_user_record_type_suggestion( + user_id=1, + url_id=url_1.url_id, + record_type=RecordType.ARREST_RECORDS + ) + + next_url_user_1 = await adb_client.get_next_url_for_record_type_annotation( + user_id=1, + batch_id=None + ) + + next_url_user_2 = await adb_client.get_next_url_for_record_type_annotation( + user_id=2, + batch_id=None + ) + + assert next_url_user_1 != url_user_1 + assert next_url_user_1 == next_url_user_2 + + + + + +@pytest.mark.asyncio +async def test_get_next_url_for_user_agency_annotation(db_data_creator: DBDataCreator): + """ + All users should receive the same next valid URL for agency annotation + Once any user annotates that URL, none of the users should receive it + """ + setup_info = await setup_for_annotate_agency( + db_data_creator, + url_count=2 + ) + + # All users should receive the same URL + url_1 = setup_info.url_ids[0] + url_2 = setup_info.url_ids[1] + + adb_client = db_data_creator.adb_client + url_user_1 = await adb_client.get_next_url_agency_for_annotation( + user_id=1, + batch_id=None + ) + assert url_user_1 is not None + + url_user_2 = await adb_client.get_next_url_agency_for_annotation( + user_id=2, + batch_id=None + ) + + assert url_user_2 is not None + + # Check that the URLs are the same + assert url_user_1 == url_user_2 + + # Annotate the URL + await adb_client.add_agency_manual_suggestion( + url_id=url_1, + user_id=1, + is_new=True, + agency_id=None + ) + + # Both users should receive the next URL + next_url_user_1 = await adb_client.get_next_url_agency_for_annotation( + user_id=1, + batch_id=None + ) + assert next_url_user_1 is not None + + next_url_user_2 = await adb_client.get_next_url_agency_for_annotation( + user_id=2, + batch_id=None + ) + assert next_url_user_2 is not None + + assert url_user_1 != next_url_user_1 + assert next_url_user_1 == next_url_user_2 diff --git a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py index 1c1289e7..8fb9f4a5 100644 --- a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py +++ b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py @@ -1,4 +1,3 @@ -import types from copy import deepcopy from typing import Optional from unittest.mock import MagicMock, AsyncMock, patch @@ -11,7 +10,7 @@ from collector_manager.enums import CollectorType from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from core.classes.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator +from core.classes.task_operators.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator from core.classes.subtasks.AutoGooglerAgencyIdentificationSubtask import AutoGooglerAgencyIdentificationSubtask from core.classes.subtasks.CKANAgencyIdentificationSubtask import CKANAgencyIdentificationSubtask from core.classes.subtasks.CommonCrawlerAgencyIdentificationSubtask import CommonCrawlerAgencyIdentificationSubtask diff --git a/tests/test_automated/integration/tasks/test_example_task.py b/tests/test_automated/integration/tasks/test_example_task.py index 819d0dc0..2211458c 100644 --- a/tests/test_automated/integration/tasks/test_example_task.py +++ b/tests/test_automated/integration/tasks/test_example_task.py @@ -4,8 +4,7 @@ from collector_db.enums import TaskType from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from core.classes.TaskOperatorBase import TaskOperatorBase -from core.enums import BatchStatus +from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase from tests.helpers.DBDataCreator import DBDataCreator class ExampleTaskOperator(TaskOperatorBase): diff --git a/tests/test_automated/integration/tasks/test_submit_approved_url_task.py b/tests/test_automated/integration/tasks/test_submit_approved_url_task.py index b15ff9d5..2d3aa192 100644 --- a/tests/test_automated/integration/tasks/test_submit_approved_url_task.py +++ b/tests/test_automated/integration/tasks/test_submit_approved_url_task.py @@ -8,7 +8,7 @@ from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from core.classes.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator +from core.classes.task_operators.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator from core.enums import RecordType, SubmitResponseStatus from tests.helpers.DBDataCreator import BatchURLCreationInfo, DBDataCreator from pdap_api_client.AccessManager import AccessManager diff --git a/tests/test_automated/integration/tasks/test_url_html_task.py b/tests/test_automated/integration/tasks/test_url_html_task.py index 3839d0a6..4c33016b 100644 --- a/tests/test_automated/integration/tasks/test_url_html_task.py +++ b/tests/test_automated/integration/tasks/test_url_html_task.py @@ -6,7 +6,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.enums import TaskType from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from core.classes.URLHTMLTaskOperator import URLHTMLTaskOperator +from core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator from tests.helpers.DBDataCreator import DBDataCreator from html_tag_collector.DataClassTags import ResponseHTMLInfo from html_tag_collector.ResponseParser import HTMLResponseParser diff --git a/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py b/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py index 818d5aef..526efa70 100644 --- a/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py +++ b/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py @@ -5,7 +5,7 @@ from collector_db.models import URL, URLOptionalDataSourceMetadata from collector_manager.enums import CollectorType from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from core.classes.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator +from core.classes.task_operators.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator from tests.helpers.DBDataCreator import DBDataCreator diff --git a/tests/test_automated/integration/tasks/test_url_record_type_task.py b/tests/test_automated/integration/tasks/test_url_record_type_task.py index c56acec1..c941bcf7 100644 --- a/tests/test_automated/integration/tasks/test_url_record_type_task.py +++ b/tests/test_automated/integration/tasks/test_url_record_type_task.py @@ -5,8 +5,8 @@ from collector_db.enums import TaskType from collector_db.models import AutoRecordTypeSuggestion from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from core.classes.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator -from core.enums import RecordType, BatchStatus +from core.classes.task_operators.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator +from core.enums import RecordType from tests.helpers.DBDataCreator import DBDataCreator from llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier diff --git a/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py b/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py index 11ef770a..abe15965 100644 --- a/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py +++ b/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py @@ -4,10 +4,9 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLWithHTML import URLWithHTML -from collector_db.enums import ValidationStatus, ValidationSource from collector_db.models import AutoRelevantSuggestion from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome -from core.classes.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator +from core.classes.task_operators.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator from tests.helpers.assert_functions import assert_database_has_no_tasks from hugging_face.HuggingFaceInterface import HuggingFaceInterface From b5605945dab955087ffc81814f71753859cb0eab Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 16 Apr 2025 20:22:47 -0400 Subject: [PATCH 111/244] fix(tests): fix broken tests --- tests/helpers/complex_test_data_functions.py | 13 ++--- .../integration/api/test_review.py | 10 +--- .../collector_db/test_db_client.py | 47 ++----------------- 3 files changed, 9 insertions(+), 61 deletions(-) diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index 18d3f92a..955e1cf6 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -1,3 +1,5 @@ +from typing import Optional + from pydantic import BaseModel from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo @@ -57,7 +59,7 @@ class FinalReviewSetupInfo(BaseModel): async def setup_for_get_next_url_for_final_review( db_data_creator: DBDataCreator, - annotation_count: int, + annotation_count: Optional[int] = None, include_user_annotations: bool = True, include_miscellaneous_metadata: bool = True ) -> FinalReviewSetupInfo: @@ -109,16 +111,9 @@ async def add_relevant_suggestion(count: int, relevant: bool): ) if include_user_annotations: - await add_relevant_suggestion(annotation_count, True) await add_relevant_suggestion(1, False) - await add_record_type_suggestion(3, RecordType.ARREST_RECORDS) - await add_record_type_suggestion(2, RecordType.DISPATCH_RECORDINGS) await add_record_type_suggestion(1, RecordType.ACCIDENT_REPORTS) - - if include_user_annotations: - # Add user suggestions for agencies, one suggested by 3 users, another by 2, another by 1 - for i in range(annotation_count): - await add_agency_suggestion(i + 1) + await add_agency_suggestion(1) return FinalReviewSetupInfo( batch_id=batch_id, diff --git a/tests/test_automated/integration/api/test_review.py b/tests/test_automated/integration/api/test_review.py index 61b1ef7e..494765b6 100644 --- a/tests/test_automated/integration/api/test_review.py +++ b/tests/test_automated/integration/api/test_review.py @@ -15,7 +15,6 @@ async def test_review_next_source(api_test_helper): setup_info = await setup_for_get_next_url_for_final_review( db_data_creator=ath.db_data_creator, - annotation_count=3, include_user_annotations=True ) url_mapping = setup_info.url_mapping @@ -47,16 +46,13 @@ async def test_review_next_source(api_test_helper): annotation_info = result.annotations relevant_info = annotation_info.relevant assert relevant_info.auto == True - assert relevant_info.users.relevant == 3 assert relevant_info.users.not_relevant == 1 record_type_info = annotation_info.record_type assert record_type_info.auto == RecordType.ARREST_RECORDS user_d = record_type_info.users - assert user_d[RecordType.ARREST_RECORDS] == 3 - assert user_d[RecordType.DISPATCH_RECORDINGS] == 2 assert user_d[RecordType.ACCIDENT_REPORTS] == 1 - assert list(user_d.keys()) == [RecordType.ARREST_RECORDS, RecordType.DISPATCH_RECORDINGS, RecordType.ACCIDENT_REPORTS] + assert list(user_d.keys()) == [RecordType.ACCIDENT_REPORTS] agency_info = annotation_info.agency @@ -67,9 +63,7 @@ async def test_review_next_source(api_test_helper): # Check user agency suggestions exist and in descending order of count user_agency_suggestions = agency_info.users user_agency_suggestions_as_list = list(user_agency_suggestions.values()) - assert len(user_agency_suggestions_as_list) == 3 - for i in range(3): - assert user_agency_suggestions_as_list[i].count == 3 - i + assert len(user_agency_suggestions_as_list) == 1 # Check confirmed agencies exist confirmed_agencies = agency_info.confirmed diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 0de7e16c..71bed7b4 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -162,7 +162,7 @@ async def test_get_next_url_for_final_review_basic(db_data_creator: DBDataCreato setup_info = await setup_for_get_next_url_for_final_review( db_data_creator=db_data_creator, - annotation_count=3, + annotation_count=1, include_user_annotations=True ) @@ -186,16 +186,13 @@ async def test_get_next_url_for_final_review_basic(db_data_creator: DBDataCreato annotation_info = result.annotations relevant_info = annotation_info.relevant assert relevant_info.auto == True - assert relevant_info.users.relevant == 3 assert relevant_info.users.not_relevant == 1 record_type_info = annotation_info.record_type assert record_type_info.auto == RecordType.ARREST_RECORDS user_d = record_type_info.users - assert user_d[RecordType.ARREST_RECORDS] == 3 - assert user_d[RecordType.DISPATCH_RECORDINGS] == 2 assert user_d[RecordType.ACCIDENT_REPORTS] == 1 - assert list(user_d.keys()) == [RecordType.ARREST_RECORDS, RecordType.DISPATCH_RECORDINGS, RecordType.ACCIDENT_REPORTS] + assert list(user_d.keys()) == [RecordType.ACCIDENT_REPORTS] agency_info = annotation_info.agency @@ -206,9 +203,7 @@ async def test_get_next_url_for_final_review_basic(db_data_creator: DBDataCreato # Check user agency suggestions exist and in descending order of count user_agency_suggestions = agency_info.users user_agency_suggestions_as_list = list(user_agency_suggestions.values()) - assert len(user_agency_suggestions_as_list) == 3 - for i in range(3): - assert user_agency_suggestions_as_list[i].count == 3 - i + assert len(user_agency_suggestions_as_list) == 1 @pytest.mark.asyncio async def test_get_next_url_for_final_review_batch_id_filtering(db_data_creator: DBDataCreator): @@ -280,42 +275,6 @@ async def test_get_next_url_for_final_review_favor_more_components(db_data_creat -@pytest.mark.asyncio -async def test_get_next_url_for_final_review_favor_more_annotations( - db_data_creator: DBDataCreator, - wipe_database -): - """ - Test in the case of two URLs with the same number of components annotated, favoring the one with more total annotations - """ - setup_info_lower_count = await setup_for_get_next_url_for_final_review( - db_data_creator=db_data_creator, - annotation_count=1, - include_user_annotations=True - ) - url_mapping_lower_count = setup_info_lower_count.url_mapping - - setup_info_higher_count = await setup_for_get_next_url_for_final_review( - db_data_creator=db_data_creator, - annotation_count=3, - include_user_annotations=True - ) - url_mapping_higher_count = setup_info_higher_count.url_mapping - - for url_mapping in [url_mapping_lower_count, url_mapping_higher_count]: - await db_data_creator.agency_confirmed_suggestion( - url_id=url_mapping.url_id - ) - - result = await db_data_creator.adb_client.get_next_url_for_final_review( - batch_id=None - ) - - assert result.id == url_mapping_higher_count.url_id - - assert result.annotations.agency.confirmed is not None - - @pytest.mark.asyncio From 345a257410a33cd02e004c267c45128f77678ca8 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 17 Apr 2025 08:01:41 -0400 Subject: [PATCH 112/244] feat(api): adjust final review to reflect single user annotations Previously, the final review showed multiple user annotations for a URL. Now, because each URL can only have one user for each type of annotation, the endpoint has been updated. --- collector_db/AsyncDatabaseClient.py | 31 ++------ collector_db/DTOConverter.py | 78 +++++++------------ collector_db/models.py | 18 ++--- core/DTOs/GetNextURLForFinalReviewResponse.py | 23 +++--- tests/helpers/complex_test_data_functions.py | 50 ++++++------ .../integration/api/test_review.py | 16 ++-- .../collector_db/test_db_client.py | 19 ++--- 7 files changed, 92 insertions(+), 143 deletions(-) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index c8b4a204..8ceda774 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -1065,19 +1065,6 @@ def count_subquery(model: Type[Base]): ) ) - count_subqueries = [ - count_subquery(model=model) - for model in models - ] - - sum_of_count_subqueries = ( - sum( - [ - coalesce(subquery.c.count, 0) - for subquery in count_subqueries - ] - ) - ) # Basic URL query url_query = ( @@ -1086,13 +1073,10 @@ def count_subquery(model: Type[Base]): ( sum_of_exist_subqueries ).label("total_distinct_annotation_count"), - ( - sum_of_count_subqueries - ).label("total_overall_annotation_count") ) ) - for subquery in (exist_subqueries + count_subqueries): + for subquery in exist_subqueries: url_query = url_query.outerjoin( subquery, URL.id == subquery.c.url_id ) @@ -1110,8 +1094,8 @@ def count_subquery(model: Type[Base]): URL.html_content, URL.auto_record_type_suggestion, URL.auto_relevant_suggestion, - URL.user_relevant_suggestions, - URL.user_record_type_suggestions, + URL.user_relevant_suggestion, + URL.user_record_type_suggestion, URL.optional_data_source_metadata, ] @@ -1122,7 +1106,7 @@ def count_subquery(model: Type[Base]): # The below relationships are joined to entities that are joined to the URL double_join_relationships = [ (URL.automated_agency_suggestions, AutomatedUrlAgencySuggestion.agency), - (URL.user_agency_suggestions, UserUrlAgencySuggestion.agency), + (URL.user_agency_suggestion, UserUrlAgencySuggestion.agency), (URL.confirmed_agencies, ConfirmedURLAgency.agency) ] for primary, secondary in double_join_relationships: @@ -1134,7 +1118,6 @@ def count_subquery(model: Type[Base]): # Apply order clause url_query = url_query.order_by( desc("total_distinct_annotation_count"), - desc("total_overall_annotation_count"), asc(URL.id) ) @@ -1173,16 +1156,16 @@ def count_subquery(model: Type[Base]): description=result.description, annotations=FinalReviewAnnotationInfo( relevant=DTOConverter.final_review_annotation_relevant_info( - user_suggestions=result.user_relevant_suggestions, + user_suggestion=result.user_relevant_suggestion, auto_suggestion=result.auto_relevant_suggestion ), record_type=DTOConverter.final_review_annotation_record_type_info( - user_suggestions=result.user_record_type_suggestions, + user_suggestion=result.user_record_type_suggestion, auto_suggestion=result.auto_record_type_suggestion ), agency=DTOConverter.final_review_annotation_agency_info( automated_agency_suggestions=result.automated_agency_suggestions, - user_agency_suggestions=result.user_agency_suggestions, + user_agency_suggestion=result.user_agency_suggestion, confirmed_agencies=result.confirmed_agencies ) ), diff --git a/collector_db/DTOConverter.py b/collector_db/DTOConverter.py index 0d2856cf..2b6cf521 100644 --- a/collector_db/DTOConverter.py +++ b/collector_db/DTOConverter.py @@ -2,16 +2,15 @@ from collector_db.DTOs.URLHTMLContentInfo import HTMLContentType, URLHTMLContentInfo from collector_db.DTOs.URLWithHTML import URLWithHTML -from collector_db.enums import ValidationStatus, ValidationSource, URLMetadataAttributeType from collector_db.models import AutomatedUrlAgencySuggestion, UserUrlAgencySuggestion, URLHTMLContent, URL, Agency, \ AutoRecordTypeSuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion, AutoRelevantSuggestion, \ ConfirmedURLAgency from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo from core.DTOs.GetNextURLForFinalReviewResponse import FinalReviewAnnotationRelevantInfo, \ - FinalReviewAnnotationRelevantUsersInfo, FinalReviewAnnotationRecordTypeInfo, FinalReviewAnnotationAgencyAutoInfo, \ - FinalReviewAnnotationAgencyInfo, FinalReviewAnnotationAgencyUserInfo + FinalReviewAnnotationRecordTypeInfo, FinalReviewAnnotationAgencyAutoInfo, \ + FinalReviewAnnotationAgencyInfo from core.enums import RecordType, SuggestionType -from html_tag_collector.DataClassTags import convert_to_response_html_info, ResponseHTMLInfo, ENUM_TO_ATTRIBUTE_MAPPING +from html_tag_collector.DataClassTags import ResponseHTMLInfo, ENUM_TO_ATTRIBUTE_MAPPING class DTOConverter: @@ -21,49 +20,35 @@ class DTOConverter: @staticmethod def final_review_annotation_relevant_info( - user_suggestions: list[UserRelevantSuggestion], + user_suggestion: UserRelevantSuggestion, auto_suggestion: AutoRelevantSuggestion ) -> FinalReviewAnnotationRelevantInfo: auto_value = auto_suggestion.relevant if auto_suggestion else None - - relevant_count = 0 - not_relevant_count = 0 - for suggestion in user_suggestions: - if suggestion.relevant: - relevant_count += 1 - else: - not_relevant_count += 1 + user_value = user_suggestion.relevant if user_suggestion else None return FinalReviewAnnotationRelevantInfo( auto=auto_value, - users=FinalReviewAnnotationRelevantUsersInfo( - relevant=relevant_count, - not_relevant=not_relevant_count - ) + user=user_value ) @staticmethod def final_review_annotation_record_type_info( - user_suggestions: list[UserRecordTypeSuggestion], + user_suggestion: UserRecordTypeSuggestion, auto_suggestion: AutoRecordTypeSuggestion ): - user_count = {} if auto_suggestion is None: auto_value = None else: auto_value = RecordType(auto_suggestion.record_type) - for suggestion in user_suggestions: - value = RecordType(suggestion.record_type) - if value not in user_count: - user_count[value] = 0 - user_count[value] += 1 - # Sort users by count, descending - user_count = dict(sorted(user_count.items(), key=lambda x: x[1], reverse=True)) + if user_suggestion is None: + user_value = None + else: + user_value = RecordType(user_suggestion.record_type) return FinalReviewAnnotationRecordTypeInfo( auto=auto_value, - users=user_count + user=user_value ) @staticmethod @@ -109,27 +94,20 @@ def final_review_annotation_agency_auto_info( @staticmethod def user_url_agency_suggestion_to_final_review_annotation_agency_user_info( - user_url_agency_suggestions: list[UserUrlAgencySuggestion] - ) -> dict[int, FinalReviewAnnotationAgencyUserInfo]: - d = {} - for suggestion in user_url_agency_suggestions: - agency = suggestion.agency - agency_id = agency.agency_id - if agency.agency_id not in d: - d[agency_id] = FinalReviewAnnotationAgencyUserInfo( - suggestion_type=SuggestionType.MANUAL_SUGGESTION, - agency_name=agency.name, - pdap_agency_id=agency_id, - state=agency.state, - county=agency.county, - locality=agency.locality, - count=1 - ) - else: - d[agency_id].count += 1 + user_url_agency_suggestion: UserUrlAgencySuggestion + ) -> Optional[GetNextURLForAgencyAgencyInfo]: + suggestion = user_url_agency_suggestion + if suggestion is None: + return None + return GetNextURLForAgencyAgencyInfo( + suggestion_type=SuggestionType.MANUAL_SUGGESTION, + pdap_agency_id=suggestion.agency_id, + agency_name=suggestion.agency.name, + state=suggestion.agency.state, + county=suggestion.agency.county, + locality=suggestion.agency.locality + ) - # Return sorted - return dict(sorted(d.items(), key=lambda x: x[1].count, reverse=True)) @staticmethod def confirmed_agencies_to_final_review_annotation_agency_info( @@ -154,7 +132,7 @@ def confirmed_agencies_to_final_review_annotation_agency_info( def final_review_annotation_agency_info( automated_agency_suggestions: list[AutomatedUrlAgencySuggestion], confirmed_agencies: list[ConfirmedURLAgency], - user_agency_suggestions: list[UserUrlAgencySuggestion] + user_agency_suggestion: UserUrlAgencySuggestion ): confirmed_agency_info = DTOConverter.confirmed_agencies_to_final_review_annotation_agency_info( @@ -166,12 +144,12 @@ def final_review_annotation_agency_info( ) agency_user_info = DTOConverter.user_url_agency_suggestion_to_final_review_annotation_agency_user_info( - user_agency_suggestions + user_agency_suggestion ) return FinalReviewAnnotationAgencyInfo( confirmed=confirmed_agency_info, - users=agency_user_info, + user=agency_user_info, auto=agency_auto_info ) diff --git a/collector_db/models.py b/collector_db/models.py index e98ef437..4ac117d6 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -119,16 +119,16 @@ class URL(Base): ) automated_agency_suggestions = relationship( "AutomatedUrlAgencySuggestion", back_populates="url") - user_agency_suggestions = relationship( - "UserUrlAgencySuggestion", back_populates="url") + user_agency_suggestion = relationship( + "UserUrlAgencySuggestion", uselist=False, back_populates="url") auto_record_type_suggestion = relationship( "AutoRecordTypeSuggestion", uselist=False, back_populates="url") - user_record_type_suggestions = relationship( - "UserRecordTypeSuggestion", back_populates="url") + user_record_type_suggestion = relationship( + "UserRecordTypeSuggestion", uselist=False, back_populates="url") auto_relevant_suggestion = relationship( "AutoRelevantSuggestion", uselist=False, back_populates="url") - user_relevant_suggestions = relationship( - "UserRelevantSuggestion", back_populates="url") + user_relevant_suggestion = relationship( + "UserRelevantSuggestion", uselist=False, back_populates="url") reviewing_user = relationship( "ReviewingUserURL", uselist=False, back_populates="url") optional_data_source_metadata = relationship( @@ -375,7 +375,7 @@ class UserUrlAgencySuggestion(Base): is_new = Column(Boolean, nullable=True) agency = relationship("Agency", back_populates="user_suggestions") - url = relationship("URL", back_populates="user_agency_suggestions") + url = relationship("URL", back_populates="user_agency_suggestion") __table_args__ = ( UniqueConstraint("agency_id", "url_id", "user_id", name="uq_user_url_agency_suggestions"), @@ -432,7 +432,7 @@ class UserRelevantSuggestion(Base): # Relationships - url = relationship("URL", back_populates="user_relevant_suggestions") + url = relationship("URL", back_populates="user_relevant_suggestion") class UserRecordTypeSuggestion(Base): @@ -451,4 +451,4 @@ class UserRecordTypeSuggestion(Base): # Relationships - url = relationship("URL", back_populates="user_record_type_suggestions") \ No newline at end of file + url = relationship("URL", back_populates="user_record_type_suggestion") \ No newline at end of file diff --git a/core/DTOs/GetNextURLForFinalReviewResponse.py b/core/DTOs/GetNextURLForFinalReviewResponse.py index f7f44e32..c9e838b6 100644 --- a/core/DTOs/GetNextURLForFinalReviewResponse.py +++ b/core/DTOs/GetNextURLForFinalReviewResponse.py @@ -6,26 +6,21 @@ from core.enums import RecordType from html_tag_collector.DataClassTags import ResponseHTMLInfo - -class FinalReviewAnnotationRelevantUsersInfo(BaseModel): - relevant: int = Field(title="Number of users who marked the URL as relevant") - not_relevant: int = Field(title="Number of users who marked the URL as not relevant") - class FinalReviewAnnotationRelevantInfo(BaseModel): auto: Optional[bool] = Field(title="Whether the auto-labeler has marked the URL as relevant") - users: FinalReviewAnnotationRelevantUsersInfo = Field( - title="How users identified the relevancy of the source", + user: Optional[bool] = Field( + title="Whether a user has marked the URL as relevant", ) class FinalReviewAnnotationRecordTypeInfo(BaseModel): - auto: Optional[RecordType] = Field(title="The record type suggested by the auto-labeler") - users: dict[RecordType, int] = Field( - title="A dictionary, sorted by size and omitting zero values, of all record types suggested by users", + auto: Optional[RecordType] = Field( + title="The record type suggested by the auto-labeler" + ) + user: Optional[RecordType] = Field( + title="The record type suggested by a user", ) # region Agency -class FinalReviewAnnotationAgencyUserInfo(GetNextURLForAgencyAgencyInfo): - count: int = Field(title="Number of times suggested by users") class FinalReviewAnnotationAgencyAutoInfo(BaseModel): unknown: bool = Field(title="Whether the auto-labeler suggested the URL as unknown") @@ -39,8 +34,8 @@ class FinalReviewAnnotationAgencyInfo(BaseModel): ) auto: Optional[FinalReviewAnnotationAgencyAutoInfo] = Field( title="A single agency or a list of agencies suggested by the auto-labeler",) - users: Optional[dict[int, FinalReviewAnnotationAgencyUserInfo]] = Field( - title="A list, sorted by size, of all agencies suggested by users", + user: Optional[GetNextURLForAgencyAgencyInfo] = Field( + title="A single agency suggested by a user", ) # endregion diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index 955e1cf6..6f9ca7c3 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -56,6 +56,7 @@ async def setup_for_annotate_agency( class FinalReviewSetupInfo(BaseModel): batch_id: int url_mapping: URLMapping + user_agency_id: Optional[int] async def setup_for_get_next_url_for_final_review( db_data_creator: DBDataCreator, @@ -78,27 +79,25 @@ async def setup_for_get_next_url_for_final_review( await db_data_creator.url_miscellaneous_metadata(url_id=url_mapping.url_id) await db_data_creator.html_data([url_mapping.url_id]) - async def add_agency_suggestion(count: int): + async def add_agency_suggestion() -> int: agency_id = await db_data_creator.agency() - for i in range(count): - await db_data_creator.agency_user_suggestions( - url_id=url_mapping.url_id, - agency_id=agency_id - ) - - async def add_record_type_suggestion(count: int, record_type: RecordType): - for i in range(count): - await db_data_creator.user_record_type_suggestion( - url_id=url_mapping.url_id, - record_type=record_type - ) - - async def add_relevant_suggestion(count: int, relevant: bool): - for i in range(count): - await db_data_creator.user_relevant_suggestion( - url_id=url_mapping.url_id, - relevant=relevant - ) + await db_data_creator.agency_user_suggestions( + url_id=url_mapping.url_id, + agency_id=agency_id + ) + return agency_id + + async def add_record_type_suggestion(record_type: RecordType): + await db_data_creator.user_record_type_suggestion( + url_id=url_mapping.url_id, + record_type=record_type + ) + + async def add_relevant_suggestion(relevant: bool): + await db_data_creator.user_relevant_suggestion( + url_id=url_mapping.url_id, + relevant=relevant + ) await db_data_creator.auto_relevant_suggestions( url_id=url_mapping.url_id, @@ -111,11 +110,14 @@ async def add_relevant_suggestion(count: int, relevant: bool): ) if include_user_annotations: - await add_relevant_suggestion(1, False) - await add_record_type_suggestion(1, RecordType.ACCIDENT_REPORTS) - await add_agency_suggestion(1) + await add_relevant_suggestion(False) + await add_record_type_suggestion(RecordType.ACCIDENT_REPORTS) + user_agency_id = await add_agency_suggestion() + else: + user_agency_id = None return FinalReviewSetupInfo( batch_id=batch_id, - url_mapping=url_mapping + url_mapping=url_mapping, + user_agency_id=user_agency_id ) diff --git a/tests/test_automated/integration/api/test_review.py b/tests/test_automated/integration/api/test_review.py index 494765b6..1f427c61 100644 --- a/tests/test_automated/integration/api/test_review.py +++ b/tests/test_automated/integration/api/test_review.py @@ -46,14 +46,11 @@ async def test_review_next_source(api_test_helper): annotation_info = result.annotations relevant_info = annotation_info.relevant assert relevant_info.auto == True - assert relevant_info.users.not_relevant == 1 + assert relevant_info.user == False record_type_info = annotation_info.record_type assert record_type_info.auto == RecordType.ARREST_RECORDS - user_d = record_type_info.users - assert user_d[RecordType.ACCIDENT_REPORTS] == 1 - assert list(user_d.keys()) == [RecordType.ACCIDENT_REPORTS] - + assert record_type_info.user == RecordType.ACCIDENT_REPORTS agency_info = annotation_info.agency auto_agency_suggestions = agency_info.auto @@ -61,9 +58,9 @@ async def test_review_next_source(api_test_helper): assert len(auto_agency_suggestions.suggestions) == 3 # Check user agency suggestions exist and in descending order of count - user_agency_suggestions = agency_info.users - user_agency_suggestions_as_list = list(user_agency_suggestions.values()) - assert len(user_agency_suggestions_as_list) == 1 + user_agency_suggestion = agency_info.user + assert user_agency_suggestion.pdap_agency_id == setup_info.user_agency_id + # Check confirmed agencies exist confirmed_agencies = agency_info.confirmed @@ -78,13 +75,12 @@ async def test_approve_and_get_next_source_for_review(api_test_helper): setup_info = await setup_for_get_next_url_for_final_review( db_data_creator=db_data_creator, - annotation_count=3, include_user_annotations=True ) url_mapping = setup_info.url_mapping # Add confirmed agency - confirmed_agency = await db_data_creator.confirmed_suggestions([url_mapping.url_id]) + await db_data_creator.confirmed_suggestions([url_mapping.url_id]) # Additionally, include an agency not yet included in the database additional_agency = 999999 diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 71bed7b4..5ea0bee2 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -186,24 +186,20 @@ async def test_get_next_url_for_final_review_basic(db_data_creator: DBDataCreato annotation_info = result.annotations relevant_info = annotation_info.relevant assert relevant_info.auto == True - assert relevant_info.users.not_relevant == 1 + assert relevant_info.user == False record_type_info = annotation_info.record_type assert record_type_info.auto == RecordType.ARREST_RECORDS - user_d = record_type_info.users - assert user_d[RecordType.ACCIDENT_REPORTS] == 1 - assert list(user_d.keys()) == [RecordType.ACCIDENT_REPORTS] - + assert record_type_info.user == RecordType.ACCIDENT_REPORTS agency_info = annotation_info.agency auto_agency_suggestions = agency_info.auto assert auto_agency_suggestions.unknown == False assert len(auto_agency_suggestions.suggestions) == 3 - # Check user agency suggestions exist and in descending order of count - user_agency_suggestions = agency_info.users - user_agency_suggestions_as_list = list(user_agency_suggestions.values()) - assert len(user_agency_suggestions_as_list) == 1 + # Check user agency suggestion exists and is correct + assert agency_info.user.pdap_agency_id == setup_info.user_agency_id + @pytest.mark.asyncio async def test_get_next_url_for_final_review_batch_id_filtering(db_data_creator: DBDataCreator): @@ -301,12 +297,11 @@ async def test_get_next_url_for_final_review_no_annotations(db_data_creator: DBD record_type = annotations.record_type assert record_type.auto is None - assert record_type.users == {} + assert record_type.user is None relevant = annotations.relevant assert relevant.auto is None - assert relevant.users.relevant == 0 - assert relevant.users.not_relevant == 0 + assert relevant.user is None @pytest.mark.asyncio async def test_get_next_url_for_final_review_only_confirmed_urls(db_data_creator: DBDataCreator): From 6858bc0000f4d454b9c8ea228ff81ff76a8a5811 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 17 Apr 2025 09:21:23 -0400 Subject: [PATCH 113/244] feat(app): change batch status `completed` to `ready to label` --- ...hange_batch_completed_to_ready_to_label.py | 36 +++++++++++++++++++ collector_db/StatementComposer.py | 2 +- collector_db/models.py | 2 +- collector_manager/AsyncCollectorBase.py | 2 +- core/TaskManager.py | 2 +- core/enums.py | 2 +- .../lifecycle/test_auto_googler_lifecycle.py | 2 +- .../core/lifecycle/test_ckan_lifecycle.py | 2 +- .../test_common_crawler_lifecycle.py | 2 +- .../lifecycle/test_muckrock_lifecycles.py | 6 ++-- .../integration/api/test_example_collector.py | 6 ++-- .../integration/core/test_async_core.py | 4 +-- .../core/test_example_collector_lifecycle.py | 6 ++-- util/alembic_helpers.py | 13 ++++++- 14 files changed, 67 insertions(+), 20 deletions(-) create mode 100644 alembic/versions/2025_04_17_0909-e285e6e7cf71_change_batch_completed_to_ready_to_label.py diff --git a/alembic/versions/2025_04_17_0909-e285e6e7cf71_change_batch_completed_to_ready_to_label.py b/alembic/versions/2025_04_17_0909-e285e6e7cf71_change_batch_completed_to_ready_to_label.py new file mode 100644 index 00000000..882c2c5f --- /dev/null +++ b/alembic/versions/2025_04_17_0909-e285e6e7cf71_change_batch_completed_to_ready_to_label.py @@ -0,0 +1,36 @@ +"""Change batch completed to ready to label + +Revision ID: e285e6e7cf71 +Revises: 997f5bf53772 +Create Date: 2025-04-17 09:09:38.137131 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +from util.alembic_helpers import switch_enum_type, alter_enum_value + +# revision identifiers, used by Alembic. +revision: str = 'e285e6e7cf71' +down_revision: Union[str, None] = '997f5bf53772' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + alter_enum_value( + enum_name="batch_status", + old_value="complete", + new_value="ready to label" + ) + + + +def downgrade() -> None: + alter_enum_value( + enum_name="batch_status", + old_value="ready to label", + new_value="complete" + ) diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index d108a3fa..e25ba5d4 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -22,7 +22,7 @@ def pending_urls_without_html_data() -> Select: join(Task, LinkTaskURL.task_id == Task.id). where(LinkTaskURL.url_id == URL.id). where(Task.task_type == TaskType.HTML.value). - where(Task.task_status == BatchStatus.COMPLETE.value) + where(Task.task_status == BatchStatus.READY_TO_LABEL.value) ) query = ( select(URL). diff --git a/collector_db/models.py b/collector_db/models.py index 4ac117d6..42b113c6 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -17,7 +17,7 @@ CURRENT_TIME_SERVER_DEFAULT = func.now() -batch_status_enum = PGEnum('complete', 'error', 'in-process', 'aborted', name='batch_status') +batch_status_enum = PGEnum('ready to label', 'error', 'in-process', 'aborted', name='batch_status') record_type_values = get_enum_values(RecordType) diff --git a/collector_manager/AsyncCollectorBase.py b/collector_manager/AsyncCollectorBase.py index fe260266..099f5338 100644 --- a/collector_manager/AsyncCollectorBase.py +++ b/collector_manager/AsyncCollectorBase.py @@ -131,4 +131,4 @@ async def log( )) async def close(self) -> None: - self.status = BatchStatus.COMPLETE + self.status = BatchStatus.READY_TO_LABEL diff --git a/core/TaskManager.py b/core/TaskManager.py index 8a40b129..429375c2 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -159,7 +159,7 @@ async def handle_outcome(self, run_info: TaskOperatorRunInfo): case TaskOperatorOutcome.SUCCESS: await self.adb_client.update_task_status( task_id=run_info.task_id, - status=BatchStatus.COMPLETE + status=BatchStatus.READY_TO_LABEL ) async def handle_task_error(self, run_info: TaskOperatorRunInfo): diff --git a/core/enums.py b/core/enums.py index cfccbb92..714b1d03 100644 --- a/core/enums.py +++ b/core/enums.py @@ -2,7 +2,7 @@ class BatchStatus(Enum): - COMPLETE = "complete" + READY_TO_LABEL = "ready to label" IN_PROCESS = "in-process" ERROR = "error" ABORTED = "aborted" diff --git a/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py b/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py index f2b2c098..9e5c0e49 100644 --- a/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py +++ b/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py @@ -32,7 +32,7 @@ def test_auto_googler_collector_lifecycle(test_core): batch_info: BatchInfo = api.dependencies.db_client.get_batch_by_id(1) assert batch_info.strategy == "auto_googler" - assert batch_info.status == BatchStatus.COMPLETE + assert batch_info.status == BatchStatus.READY_TO_LABEL assert batch_info.total_url_count == 20 url_infos = db_client.get_urls_by_batch(1) diff --git a/tests/manual/core/lifecycle/test_ckan_lifecycle.py b/tests/manual/core/lifecycle/test_ckan_lifecycle.py index 575dedfa..4e87bbbd 100644 --- a/tests/manual/core/lifecycle/test_ckan_lifecycle.py +++ b/tests/manual/core/lifecycle/test_ckan_lifecycle.py @@ -24,7 +24,7 @@ def test_ckan_lifecycle(test_core): batch_info: BatchInfo = db_client.get_batch_by_id(1) assert batch_info.strategy == "ckan" - assert batch_info.status == BatchStatus.COMPLETE + assert batch_info.status == BatchStatus.READY_TO_LABEL assert batch_info.total_url_count >= 3000 url_infos = db_client.get_urls_by_batch(1) diff --git a/tests/manual/core/lifecycle/test_common_crawler_lifecycle.py b/tests/manual/core/lifecycle/test_common_crawler_lifecycle.py index d2ee4495..03fe5855 100644 --- a/tests/manual/core/lifecycle/test_common_crawler_lifecycle.py +++ b/tests/manual/core/lifecycle/test_common_crawler_lifecycle.py @@ -34,7 +34,7 @@ def test_common_crawler_lifecycle(test_core: SourceCollectorCore): batch_info = db_client.get_batch_by_id(1) assert batch_info.strategy == "common_crawler" - assert batch_info.status == BatchStatus.COMPLETE + assert batch_info.status == BatchStatus.READY_TO_LABEL assert batch_info.parameters == config url_infos = db_client.get_urls_by_batch(1) diff --git a/tests/manual/core/lifecycle/test_muckrock_lifecycles.py b/tests/manual/core/lifecycle/test_muckrock_lifecycles.py index b688b0a8..72d2d9fc 100644 --- a/tests/manual/core/lifecycle/test_muckrock_lifecycles.py +++ b/tests/manual/core/lifecycle/test_muckrock_lifecycles.py @@ -23,7 +23,7 @@ def test_muckrock_simple_search_collector_lifecycle(test_core): batch_info: BatchInfo = db_client.get_batch_by_id(1) assert batch_info.strategy == "muckrock_simple_search" - assert batch_info.status == BatchStatus.COMPLETE + assert batch_info.status == BatchStatus.READY_TO_LABEL assert batch_info.total_url_count >= 10 url_infos = db_client.get_urls_by_batch(1) @@ -45,7 +45,7 @@ def test_muckrock_county_level_search_collector_lifecycle(test_core): batch_info: BatchInfo = db_client.get_batch_by_id(1) assert batch_info.strategy == "muckrock_county_search" - assert batch_info.status == BatchStatus.COMPLETE + assert batch_info.status == BatchStatus.READY_TO_LABEL assert batch_info.total_url_count >= 10 url_infos = db_client.get_urls_by_batch(1) @@ -67,7 +67,7 @@ def test_muckrock_full_search_collector_lifecycle(test_core): batch_info: BatchInfo = db_client.get_batch_by_id(1) assert batch_info.strategy == CollectorType.MUCKROCK_ALL_SEARCH.value - assert batch_info.status == BatchStatus.COMPLETE + assert batch_info.status == BatchStatus.READY_TO_LABEL assert batch_info.total_url_count >= 1 url_infos = db_client.get_urls_by_batch(1) diff --git a/tests/test_automated/integration/api/test_example_collector.py b/tests/test_automated/integration/api/test_example_collector.py index d1466c8c..b13f7e31 100644 --- a/tests/test_automated/integration/api/test_example_collector.py +++ b/tests/test_automated/integration/api/test_example_collector.py @@ -54,7 +54,7 @@ async def test_example_collector(api_test_helper): csr: GetBatchStatusResponse = ath.request_validator.get_batch_statuses( collector_type=CollectorType.EXAMPLE, - status=BatchStatus.COMPLETE + status=BatchStatus.READY_TO_LABEL ) assert len(csr.results) == 1 @@ -62,10 +62,10 @@ async def test_example_collector(api_test_helper): assert bsi.id == batch_id assert bsi.strategy == CollectorType.EXAMPLE.value - assert bsi.status == BatchStatus.COMPLETE + assert bsi.status == BatchStatus.READY_TO_LABEL bi: BatchInfo = ath.request_validator.get_batch_info(batch_id=batch_id) - assert bi.status == BatchStatus.COMPLETE + assert bi.status == BatchStatus.READY_TO_LABEL assert bi.total_url_count == 2 assert bi.parameters == dto.model_dump() assert bi.strategy == CollectorType.EXAMPLE.value diff --git a/tests/test_automated/integration/core/test_async_core.py b/tests/test_automated/integration/core/test_async_core.py index ed314dfd..f2125865 100644 --- a/tests/test_automated/integration/core/test_async_core.py +++ b/tests/test_automated/integration/core/test_async_core.py @@ -44,7 +44,7 @@ async def test_conclude_task_success(db_data_creator: DBDataCreator): task_info = await ddc.adb_client.get_task_info(task_id=task_id) - assert task_info.task_status == BatchStatus.COMPLETE + assert task_info.task_status == BatchStatus.READY_TO_LABEL assert len(task_info.urls) == 3 @pytest.mark.asyncio @@ -65,7 +65,7 @@ async def test_conclude_task_success(db_data_creator: DBDataCreator): task_info = await ddc.adb_client.get_task_info(task_id=task_id) - assert task_info.task_status == BatchStatus.COMPLETE + assert task_info.task_status == BatchStatus.READY_TO_LABEL assert len(task_info.urls) == 3 @pytest.mark.asyncio diff --git a/tests/test_automated/integration/core/test_example_collector_lifecycle.py b/tests/test_automated/integration/core/test_example_collector_lifecycle.py index d3f3f855..a9c4900f 100644 --- a/tests/test_automated/integration/core/test_example_collector_lifecycle.py +++ b/tests/test_automated/integration/core/test_example_collector_lifecycle.py @@ -41,11 +41,11 @@ async def test_example_collector_lifecycle( await asyncio.sleep(1.5) await acore.collector_manager.logger.flush_all() print("Done sleeping...") - assert core.get_status(batch_id) == BatchStatus.COMPLETE + assert core.get_status(batch_id) == BatchStatus.READY_TO_LABEL batch_info: BatchInfo = db_client.get_batch_by_id(batch_id) assert batch_info.strategy == "example" - assert batch_info.status == BatchStatus.COMPLETE + assert batch_info.status == BatchStatus.READY_TO_LABEL assert batch_info.total_url_count == 2 assert batch_info.parameters == dto.model_dump() assert batch_info.compute_time > 1 @@ -90,4 +90,4 @@ async def test_example_collector_lifecycle_multiple_batches( await asyncio.sleep(3) for csi in csis: - assert core.get_status(csi.batch_id) == BatchStatus.COMPLETE + assert core.get_status(csi.batch_id) == BatchStatus.READY_TO_LABEL diff --git a/util/alembic_helpers.py b/util/alembic_helpers.py index d2120634..84cdbfa7 100644 --- a/util/alembic_helpers.py +++ b/util/alembic_helpers.py @@ -6,7 +6,8 @@ def switch_enum_type( column_name, enum_name, new_enum_values, - drop_old_enum=True + drop_old_enum=True, + cast_dict: dict = None ): """ Switches an ENUM type in a PostgreSQL column by: @@ -36,3 +37,13 @@ def switch_enum_type( # Drop the old enum type if drop_old_enum: op.execute(f'DROP TYPE "{old_enum_temp_name}"') + +def alter_enum_value( + enum_name, + old_value, + new_value +): + """ + Changes one value of an enum type + """ + op.execute(f"ALTER TYPE {enum_name} RENAME VALUE '{old_value}' TO '{new_value}'") \ No newline at end of file From c18bd686865312c44c9c97d35eccc1a90722209d Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 17 Apr 2025 14:33:33 -0400 Subject: [PATCH 114/244] feat(app): Add `/batch` filter for batches with pending URLs --- api/routes/batch.py | 14 +++- collector_db/AsyncDatabaseClient.py | 28 ++++++- core/AsyncCore.py | 4 +- tests/helpers/DBDataCreator.py | 31 ++++++-- .../api/helpers/RequestValidator.py | 10 ++- .../integration/api/test_batch.py | 77 +++++++++++++++++++ .../collector_db/test_db_client.py | 4 - 7 files changed, 148 insertions(+), 20 deletions(-) diff --git a/api/routes/batch.py b/api/routes/batch.py index 9d4b62cc..2c791503 100644 --- a/api/routes/batch.py +++ b/api/routes/batch.py @@ -1,11 +1,10 @@ from typing import Optional -from fastapi import Path, APIRouter, HTTPException +from fastapi import Path, APIRouter from fastapi.params import Query, Depends from api.dependencies import get_core, get_async_core from collector_db.DTOs.BatchInfo import BatchInfo -from collector_manager.CollectorManager import InvalidCollectorError from collector_manager.enums import CollectorType from core.AsyncCore import AsyncCore from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse @@ -34,6 +33,10 @@ async def get_batch_status( description="Filter by status", default=None ), + has_pending_urls: Optional[bool] = Query( + description="Filter by whether the batch has pending URLs", + default=None + ), page: int = Query( description="The page number", default=1 @@ -44,7 +47,12 @@ async def get_batch_status( """ Get the status of recent batches """ - return await core.get_batch_statuses(collector_type=collector_type, status=status, page=page) + return await core.get_batch_statuses( + collector_type=collector_type, + status=status, + has_pending_urls=has_pending_urls, + page=page + ) @batch_router.get("/{batch_id}") diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 8ceda774..957a4eb6 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -1567,17 +1567,37 @@ async def get_recent_batch_status_info( page: int, collector_type: Optional[CollectorType] = None, status: Optional[BatchStatus] = None, + has_pending_urls: Optional[bool] = None ) -> List[BatchInfo]: # Get only the batch_id, collector_type, status, and created_at limit = 100 - query = (Select(Batch) - .order_by(Batch.date_generated.desc())) + query = Select(Batch) + if has_pending_urls is not None: + if has_pending_urls: + # Query for all that have pending URLs + query = query.join(URL, Batch.id == URL.batch_id).filter(URL.outcome == URLStatus.PENDING.value) + else: + # Query for all that DO NOT have pending URLs + # (or that have no URLs at all) + query = query.join( + URL, + Batch.id == URL.batch_id, + isouter=True + ).filter( + or_( + URL.outcome != URLStatus.PENDING.value, + URL.outcome.is_(None) + ) + ) if collector_type: query = query.filter(Batch.strategy == collector_type.value) if status: query = query.filter(Batch.status == status.value) - query = (query.limit(limit) - .offset((page - 1) * limit)) + + query = (query. + order_by(Batch.date_generated.desc()). + limit(limit). + offset((page - 1) * limit)) raw_results = await session.execute(query) batches = raw_results.scalars().all() return [BatchInfo(**batch.__dict__) for batch in batches] diff --git a/core/AsyncCore.py b/core/AsyncCore.py index cb9a80bc..d436d3c9 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -67,12 +67,14 @@ async def get_batch_statuses( self, collector_type: Optional[CollectorType], status: Optional[BatchStatus], + has_pending_urls: Optional[bool], page: int ) -> GetBatchStatusResponse: results = await self.adb_client.get_recent_batch_status_info( collector_type=collector_type, status=status, - page=page + page=page, + has_pending_urls=has_pending_urls ) return GetBatchStatusResponse(results=results) diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 613bfe4d..28d8a573 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -36,11 +36,15 @@ def __init__(self, db_client: Optional[DatabaseClient] = None): self.db_client = DatabaseClient() self.adb_client: AsyncDatabaseClient = AsyncDatabaseClient() - def batch(self, strategy: CollectorType = CollectorType.EXAMPLE) -> int: + def batch( + self, + strategy: CollectorType = CollectorType.EXAMPLE, + batch_status: BatchStatus = BatchStatus.IN_PROCESS + ) -> int: return self.db_client.insert_batch( BatchInfo( strategy=strategy.value, - status=BatchStatus.IN_PROCESS, + status=batch_status, total_url_count=1, parameters={"test_key": "test_value"}, user_id=1 @@ -56,11 +60,26 @@ async def task(self, url_ids: Optional[list[int]] = None) -> int: async def batch_and_urls( self, strategy: CollectorType = CollectorType.EXAMPLE, - url_count: int = 1, - with_html_content: bool = False + url_count: int = 3, + with_html_content: bool = False, + batch_status: BatchStatus = BatchStatus.READY_TO_LABEL, + url_status: URLStatus = URLStatus.PENDING ) -> BatchURLCreationInfo: - batch_id = self.batch(strategy=strategy) - iuis: InsertURLsInfo = self.urls(batch_id=batch_id, url_count=url_count) + batch_id = self.batch( + strategy=strategy, + batch_status=batch_status + ) + if batch_status in (BatchStatus.ERROR, BatchStatus.ABORTED): + return BatchURLCreationInfo( + batch_id=batch_id, + url_ids=[], + urls=[] + ) + iuis: InsertURLsInfo = self.urls( + batch_id=batch_id, + url_count=url_count, + outcome=url_status + ) url_ids = [iui.url_id for iui in iuis.url_mappings] if with_html_content: await self.html_data(url_ids) diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index f8ada6ae..4a12bb0e 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -120,13 +120,19 @@ def delete( expected_response=expected_response, **kwargs) - def get_batch_statuses(self, collector_type: Optional[CollectorType] = None, status: Optional[BatchStatus] = None) -> GetBatchStatusResponse: + def get_batch_statuses( + self, + collector_type: Optional[CollectorType] = None, + status: Optional[BatchStatus] = None, + has_pending_urls: Optional[bool] = None + ) -> GetBatchStatusResponse: params = {} update_if_not_none( target=params, source={ "collector_type": collector_type.value if collector_type else None, - "status": status.value if status else None + "status": status.value if status else None, + "has_pending_urls": has_pending_urls } ) data = self.get( diff --git a/tests/test_automated/integration/api/test_batch.py b/tests/test_automated/integration/api/test_batch.py index 604e2d67..bc86dfec 100644 --- a/tests/test_automated/integration/api/test_batch.py +++ b/tests/test_automated/integration/api/test_batch.py @@ -1,11 +1,88 @@ import asyncio import time +import pytest + from collector_db.DTOs.BatchInfo import BatchInfo from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO +from collector_manager.enums import CollectorType, URLStatus from core.enums import BatchStatus +@pytest.mark.asyncio +async def test_get_batch_status_pending_url_filter(api_test_helper): + ath = api_test_helper + + # Add an errored out batch + batch_error = await ath.db_data_creator.batch_and_urls( + strategy=CollectorType.EXAMPLE, + url_count=1, + batch_status=BatchStatus.ERROR + ) + + # Add a batch with pending urls + batch_pending = await ath.db_data_creator.batch_and_urls( + strategy=CollectorType.EXAMPLE, + url_count=1, + batch_status=BatchStatus.READY_TO_LABEL, + with_html_content=True, + url_status=URLStatus.PENDING + ) + + # Add a batch with submitted URLs + batch_submitted = await ath.db_data_creator.batch_and_urls( + strategy=CollectorType.EXAMPLE, + url_count=1, + batch_status=BatchStatus.READY_TO_LABEL, + with_html_content=True, + url_status=URLStatus.SUBMITTED + ) + + # Add an aborted batch + batch_aborted = await ath.db_data_creator.batch_and_urls( + strategy=CollectorType.EXAMPLE, + url_count=1, + batch_status=BatchStatus.ABORTED + ) + + # Add a batch with validated URLs + batch_validated = await ath.db_data_creator.batch_and_urls( + strategy=CollectorType.EXAMPLE, + url_count=1, + batch_status=BatchStatus.READY_TO_LABEL, + with_html_content=True, + url_status=URLStatus.VALIDATED + ) + + # Test filter for pending URLs and only retrieve the second batch + pending_urls_results = ath.request_validator.get_batch_statuses( + has_pending_urls=True + ) + + assert len(pending_urls_results.results) == 1 + assert pending_urls_results.results[0].id == batch_pending.batch_id + + # Test filter without pending URLs and retrieve the other four batches + no_pending_urls_results = ath.request_validator.get_batch_statuses( + has_pending_urls=False + ) + + assert len(no_pending_urls_results.results) == 4 + for result in no_pending_urls_results.results: + assert result.id in [ + batch_error.batch_id, + batch_submitted.batch_id, + batch_validated.batch_id, + batch_aborted.batch_id + ] + + # Test no filter for pending URLs and retrieve all batches + no_filter_results = ath.request_validator.get_batch_statuses() + + assert len(no_filter_results.results) == 5 + + + def test_abort_batch(api_test_helper): ath = api_test_helper diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 5ea0bee2..5560577e 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -269,10 +269,6 @@ async def test_get_next_url_for_final_review_favor_more_components(db_data_creat assert result.id == url_mapping_with_user_anno.url_id - - - - @pytest.mark.asyncio async def test_get_next_url_for_final_review_no_annotations(db_data_creator: DBDataCreator): """ From 85a2883aef74df2fdccf87b4bc672d4465508e45 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 17 Apr 2025 15:20:33 -0400 Subject: [PATCH 115/244] fix(database): fix duplicate bug in `/batch` get for `has_pending_urls` Previously, `has_pending_urls` was returning multiple instances of the same batches in some cases. This has been resolved. --- collector_db/AsyncDatabaseClient.py | 24 ++++++++++++------- tests/helpers/DBDataCreator.py | 2 +- .../integration/api/test_batch.py | 10 ++++---- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 957a4eb6..9e1ab473 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -1573,20 +1573,26 @@ async def get_recent_batch_status_info( limit = 100 query = Select(Batch) if has_pending_urls is not None: + pending_url_subquery = Select(URL).where( + and_( + URL.batch_id == Batch.id, + URL.outcome == URLStatus.PENDING.value + ) + ) + if has_pending_urls: # Query for all that have pending URLs - query = query.join(URL, Batch.id == URL.batch_id).filter(URL.outcome == URLStatus.PENDING.value) + query = query.where(exists( + pending_url_subquery + )) else: # Query for all that DO NOT have pending URLs # (or that have no URLs at all) - query = query.join( - URL, - Batch.id == URL.batch_id, - isouter=True - ).filter( - or_( - URL.outcome != URLStatus.PENDING.value, - URL.outcome.is_(None) + query = query.where( + not_( + exists( + pending_url_subquery + ) ) ) if collector_type: diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 28d8a573..695a3c7a 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -2,7 +2,7 @@ from random import randint from typing import List, Optional -from pydantic import BaseModel +from pydantic import BaseModel, model_validator from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.BatchInfo import BatchInfo diff --git a/tests/test_automated/integration/api/test_batch.py b/tests/test_automated/integration/api/test_batch.py index bc86dfec..961b1a30 100644 --- a/tests/test_automated/integration/api/test_batch.py +++ b/tests/test_automated/integration/api/test_batch.py @@ -16,14 +16,14 @@ async def test_get_batch_status_pending_url_filter(api_test_helper): # Add an errored out batch batch_error = await ath.db_data_creator.batch_and_urls( strategy=CollectorType.EXAMPLE, - url_count=1, + url_count=2, batch_status=BatchStatus.ERROR ) # Add a batch with pending urls batch_pending = await ath.db_data_creator.batch_and_urls( strategy=CollectorType.EXAMPLE, - url_count=1, + url_count=2, batch_status=BatchStatus.READY_TO_LABEL, with_html_content=True, url_status=URLStatus.PENDING @@ -32,7 +32,7 @@ async def test_get_batch_status_pending_url_filter(api_test_helper): # Add a batch with submitted URLs batch_submitted = await ath.db_data_creator.batch_and_urls( strategy=CollectorType.EXAMPLE, - url_count=1, + url_count=2, batch_status=BatchStatus.READY_TO_LABEL, with_html_content=True, url_status=URLStatus.SUBMITTED @@ -41,14 +41,14 @@ async def test_get_batch_status_pending_url_filter(api_test_helper): # Add an aborted batch batch_aborted = await ath.db_data_creator.batch_and_urls( strategy=CollectorType.EXAMPLE, - url_count=1, + url_count=2, batch_status=BatchStatus.ABORTED ) # Add a batch with validated URLs batch_validated = await ath.db_data_creator.batch_and_urls( strategy=CollectorType.EXAMPLE, - url_count=1, + url_count=2, batch_status=BatchStatus.READY_TO_LABEL, with_html_content=True, url_status=URLStatus.VALIDATED From cfad874f3fb95a6dd9633a748f99227e59f0a1fc Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 17 Apr 2025 15:43:21 -0400 Subject: [PATCH 116/244] fix(app): Change suggestion type `MANUAL_SUGGESTION` to `USER_SUGGESTION` --- collector_db/DTOConverter.py | 2 +- core/enums.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/collector_db/DTOConverter.py b/collector_db/DTOConverter.py index 2b6cf521..b43fbbe9 100644 --- a/collector_db/DTOConverter.py +++ b/collector_db/DTOConverter.py @@ -100,7 +100,7 @@ def user_url_agency_suggestion_to_final_review_annotation_agency_user_info( if suggestion is None: return None return GetNextURLForAgencyAgencyInfo( - suggestion_type=SuggestionType.MANUAL_SUGGESTION, + suggestion_type=SuggestionType.USER_SUGGESTION, pdap_agency_id=suggestion.agency_id, agency_name=suggestion.agency.name, state=suggestion.agency.state, diff --git a/core/enums.py b/core/enums.py index 714b1d03..173c66e9 100644 --- a/core/enums.py +++ b/core/enums.py @@ -54,7 +54,7 @@ class SuggestionType(Enum): Identifies the specific kind of suggestion made for a URL """ AUTO_SUGGESTION = "Auto Suggestion" - MANUAL_SUGGESTION = "Manual Suggestion" + USER_SUGGESTION = "User Suggestion" UNKNOWN = "Unknown" NEW_AGENCY = "New Agency" CONFIRMED = "Confirmed" From 3519bf42f8948a7e15d52d2d08fac5dc59f9a703 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 17 Apr 2025 16:36:40 -0400 Subject: [PATCH 117/244] refactor(app): remove deprecated and unused code --- .github/workflows/common_crawler.yaml | 40 -- .github/workflows/populate_labelstudio.yml | 94 ----- ENV.md | 3 - agency_identifier/README.md | 40 -- agency_identifier/__init__.py | 0 agency_identifier/identifier.py | 234 ----------- api/routes/batch.py | 1 - collector_db/enums.py | 1 - collector_manager/AsyncCollectorBase.py | 11 +- core/SourceCollectorCore.py | 2 - core/TaskManager.py | 2 +- .../MuckrockAgencyIdentificationSubtask.py | 2 +- .../AgencyIdentificationTaskOperator.py | 2 +- source_collectors/ckan/README.md | 22 -- source_collectors/ckan/main.py | 44 --- source_collectors/ckan/requirements.txt | 6 - source_collectors/ckan/schemas.py | 6 - .../ckan/scrape_ckan_data_portals.py | 25 -- source_collectors/common_crawler/README.md | 87 ----- source_collectors/common_crawler/argparser.py | 95 ----- source_collectors/common_crawler/cache.py | 93 ----- source_collectors/common_crawler/config.ini | 19 - .../common_crawler/csv_manager.py | 79 ---- .../common_crawler/data/cache.json | 7 - .../common_crawler/data/urls.csv | 207 ---------- source_collectors/common_crawler/main.py | 366 ------------------ .../requirements_common_crawler_action.txt | 3 - source_collectors/common_crawler/schemas.py | 22 -- .../muckrock}/MuckrockAPIInterface.py | 0 source_collectors/muckrock/README.md | 82 ---- .../muckrock/classes/SQLiteClient.py | 38 -- source_collectors/muckrock/muck_get.py | 16 - source_collectors/muckrock/requirements.txt | 30 -- .../test_muckrock_api_interface.py | 2 +- tests/manual/unsorted/test_identifier_unit.py | 275 ------------- .../integration/api/conftest.py | 2 - .../tasks/test_agency_preannotation_task.py | 2 +- 37 files changed, 10 insertions(+), 1950 deletions(-) delete mode 100644 .github/workflows/common_crawler.yaml delete mode 100644 .github/workflows/populate_labelstudio.yml delete mode 100644 agency_identifier/README.md delete mode 100644 agency_identifier/__init__.py delete mode 100644 agency_identifier/identifier.py delete mode 100644 source_collectors/ckan/main.py delete mode 100644 source_collectors/ckan/requirements.txt delete mode 100644 source_collectors/ckan/schemas.py delete mode 100644 source_collectors/common_crawler/README.md delete mode 100644 source_collectors/common_crawler/argparser.py delete mode 100644 source_collectors/common_crawler/cache.py delete mode 100644 source_collectors/common_crawler/config.ini delete mode 100644 source_collectors/common_crawler/csv_manager.py delete mode 100644 source_collectors/common_crawler/data/cache.json delete mode 100644 source_collectors/common_crawler/data/urls.csv delete mode 100644 source_collectors/common_crawler/main.py delete mode 100644 source_collectors/common_crawler/requirements_common_crawler_action.txt delete mode 100644 source_collectors/common_crawler/schemas.py rename {agency_identifier => source_collectors/muckrock}/MuckrockAPIInterface.py (100%) delete mode 100644 source_collectors/muckrock/classes/SQLiteClient.py delete mode 100644 source_collectors/muckrock/muck_get.py delete mode 100644 source_collectors/muckrock/requirements.txt delete mode 100644 tests/manual/unsorted/test_identifier_unit.py diff --git a/.github/workflows/common_crawler.yaml b/.github/workflows/common_crawler.yaml deleted file mode 100644 index 52b4007d..00000000 --- a/.github/workflows/common_crawler.yaml +++ /dev/null @@ -1,40 +0,0 @@ -name: Common Crawler - -# Pull request will run every day at 1AM. -on: - workflow_dispatch: -env: - # The access token enabling write access to the Huggingface Database - HUGGINGFACE_ACCESS_TOKEN: ${{ secrets.HUGGINGFACE_ACCESS_TOKEN }} - -jobs: - build-and-commit: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - with: - # This is necessary to push commits back to the repository - persist-credentials: true - fetch-depth: 0 # Fetch all history for all tags and branches - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: 3.11.8 - - name: Upgrade pip - run: python -m pip install --upgrade pip - - name: Install dependencies - run: pip install -r source_collectors/common_crawler/requirements_common_crawler_action.txt - - name: Run script - run: python source_collectors/common_crawler/main.py CC-MAIN-2024-10 *.gov police --config source_collectors/common_crawler/config.ini --pages 20 - - name: Configure Git - run: | - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - - name: Add common_crawler cache and common_crawler batch_info - run: | - git add source_collectors/common_crawler/data/cache.json - git add source_collectors/common_crawler/data/batch_info.csv - - name: Commit changes - run: git commit -m "Update common_crawler cache and batch_info" - - name: Push changes - run: git push \ No newline at end of file diff --git a/.github/workflows/populate_labelstudio.yml b/.github/workflows/populate_labelstudio.yml deleted file mode 100644 index 09ca68b2..00000000 --- a/.github/workflows/populate_labelstudio.yml +++ /dev/null @@ -1,94 +0,0 @@ -name: Populate LabelStudio - -on: - workflow_dispatch: - inputs: - crawl_id: - description: 'Common Crawl Corpus' - required: true - default: 'CC-MAIN-2024-10' - url: - description: 'URL type' - required: true - default: '*.gov' - keyword: - description: 'keyword' - required: true - default: 'police' - pages: - description: 'num pages' - required: true - default: '2' - record_type: - description: 'record type' - required: false - - -jobs: - run-script: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - with: - ref: main - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.x' - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r annotation_pipeline/requirements.txt - - - name: Run main script - env: - HUGGINGFACE_ACCESS_TOKEN: ${{ secrets.HUGGINGFACE_ACCESS_TOKEN }} - LABEL_STUDIO_ACCESS_TOKEN: ${{ secrets.LABEL_STUDIO_ACCESS_TOKEN }} - LABEL_STUDIO_PROJECT_ID: ${{ secrets.LABEL_STUDIO_PROJECT_ID }} - LABEL_STUDIO_ORGANIZATION: ${{ secrets.LABEL_STUDIO_ORGANIZATION }} - run: | - if [ -n "${{ github.event.inputs.record_type }}" ]; then - python annotation_pipeline/populate_labelstudio.py ${{ github.event.inputs.crawl_id }} "${{ github.event.inputs.url }}" ${{ github.event.inputs.keyword }} --pages ${{ github.event.inputs.pages }} --record_type "${{ github.event.inputs.record_type }}" - else - python annotation_pipeline/populate_labelstudio.py ${{ github.event.inputs.crawl_id }} "${{ github.event.inputs.url }}" ${{ github.event.inputs.keyword }} --pages ${{ github.event.inputs.pages }} - fi - - - name: Check created/modified files - run: | - echo "Checking files in annotation_pipeline/data/" - ls -R annotation_pipeline/data/ - - - name: Create new branch - run: | - BRANCH_NAME=bot-update-$(date +%Y%m%d%H%M%S) - git checkout -b $BRANCH_NAME - echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV - - - name: Commit and push outputs - run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "action@github.com" - git add annotation_pipeline/data/batch_info.csv - git add annotation_pipeline/data/cache.json - if [ -d "annotation_pipeline/data/tag_collector" ]; then - git add annotation_pipeline/data/tag_collector/* - fi - git commit -m "Update batch info, cache, and collected urls & tags" - git log -1 --stat - git push --set-upstream origin $BRANCH_NAME - - - name: Create pull request - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH_NAME: ${{ env.BRANCH_NAME }} - run: | - PR_TITLE="Update batch info, cache, and collected urls & tags" - PR_BODY="This PR was created automatically by a GitHub Action." - echo "Creating PR from branch $BRANCH_NAME to main" - curl -X POST -H "Authorization: token $GITHUB_TOKEN" \ - -d "{\"title\":\"$PR_TITLE\",\"body\":\"$PR_BODY\",\"head\":\"$BRANCH_NAME\",\"base\":\"main\"}" \ - https://api.github.com/repos/${{ github.repository }}/pulls diff --git a/ENV.md b/ENV.md index 7c09fb64..5292320b 100644 --- a/ENV.md +++ b/ENV.md @@ -4,9 +4,6 @@ Please ensure these are properly defined in a `.env` file in the root directory. | Name | Description | Example | |----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------| -| `LABEL_STUDIO_ACCESS_TOKEN` | The access token for the Label Studio API. The access token for the Label Studio API. This can be obtained by logging into Label Studio and navigating to the [user account section](https://app.heartex.com/user/account), where the access token can be copied. | `abc123` | -| `LABEL_STUDIO_PROJECT_ID` | The project ID for the Label Studio API. This can be obtained by logging into Label Studio and navigating to the relevant project, where the project id will be in the URL, as in `https://app.heartex.com/projects/58475/` | `58475` | -| `LABEL_STUDIO_ORGANIZATION_ID` | The organization ID for the Label Studio API. This can be obtained by logging into Label Studio and navigating to the [Organization section](https://app.heartex.com/organization?page=1), where the organization ID can be copied. | `6758` | | `GOOGLE_API_KEY` | The API key required for accessing the Google Custom Search API | `abc123` | | `GOOGLE_CSE_ID` | The CSE ID required for accessing the Google Custom Search API | `abc123` | |`POSTGRES_USER` | The username for the test database | `test_source_collector_user` | diff --git a/agency_identifier/README.md b/agency_identifier/README.md deleted file mode 100644 index c1dadcf2..00000000 --- a/agency_identifier/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# Agency Identifier - -The Agency Identifier is a Python application that matches URLs with an agency from the PDAP database. It takes a list of URLs as input, either from a CSV file or a DataFrame, and returns a DataFrame with the matched agencies. - -## How to use - -### Running from the command line - -1. Clone the repository. -2. Create a CSV file containing a list of URLs to be identified. The URLs should be listed one per line, and the file should have at least a "url" column. -3. Run the command `python3 identifier.py [url_file]`, replacing `[url_file]` with the path to your CSV file. -4. The results will be written to a file named `results.csv` in the same directory. - -### Using the "identifier_main" function - -If you're using the Agency Identifier in your own Python code, you can import the `process_and_write_data` function. This function takes a DataFrame as an argument and returns a DataFrame with the matched agencies. - -Here's an example of how to use it: - -```python -import polar as pl -from identifier import process_and_write_data - -# Create a DataFrame with the URLs to be identified -df = pl.DataFrame({"url": ["http://agency1.com/page1", "http://agency2.com/page2"]}) - -# Call the identifier_main function -result = process_and_write_data(df) - -# Print the resulting DataFrame -print(result) -``` - -# Requirements - -- Python 3 -- urllib -- re -- polars -- requests \ No newline at end of file diff --git a/agency_identifier/__init__.py b/agency_identifier/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/agency_identifier/identifier.py b/agency_identifier/identifier.py deleted file mode 100644 index 786aeba6..00000000 --- a/agency_identifier/identifier.py +++ /dev/null @@ -1,234 +0,0 @@ -import os -import re -import sys -from urllib.parse import urlparse - -import polars -import requests - -API_URL = "https://data-sources.pdap.io/api/agencies/" - - -def get_page_data(page: int) -> dict: - """Fetches a page of data from the API. - - Args: - page (int): The page number to fetch. - - Returns: - dict: The data for the page. - """ - api_key = "Bearer " + os.getenv("VUE_APP_PDAP_API_KEY") - response = requests.get(f"{API_URL}{page}", headers={"Authorization": api_key}) - if response.status_code != 200: - raise Exception("Request to PDAP API failed. Response code:", response.status_code) - return response.json()["data"] - - -def get_agencies_data() -> polars.DataFrame: - """Retrives a list of agency dictionaries from file. - - Returns: - list: List of agency dictionaries. - """ - page = 1 - agencies_df = polars.DataFrame() - results = get_page_data(page) - - while results: - # Use list comprehension to clean results - clean_results = clean_page_data_results(results) - new_agencies_df = polars.DataFrame(clean_results) - if not new_agencies_df.is_empty(): - agencies_df = polars.concat([agencies_df, new_agencies_df]) - page += 1 - results = get_page_data(page) - - return agencies_df - - -def clean_page_data_results(results: list[dict[str, str]]) -> list[dict[str, str]]: - clean_results = [] - for result in results: - clean_result = {} - for k, v in result.items(): - if v is None: - clean_result[k] = "" - else: - clean_result[k] = v - clean_results.append(clean_result) - return clean_results - - -def parse_hostname(url: str) -> str: - """Retrieves the hostname (example.com) from a url string. - - Args: - url (str): Url to parse. - - Returns: - str: The url's hostname. - """ - try: - # Remove leading and trailing whitespaces and quotes - url = url.strip().strip('"') - - # Add "http://" to the url if it's not present - if not re.match(r'http(s)?://', url): - url = "http://" + url - - # Parse the url and retrieve the hostname - parsed_url = urlparse(url) - hostname = parsed_url.hostname - - # Remove "www." from the hostname - hostname = re.sub(r'^www\.', '', hostname) - except Exception as e: - print(f"An error occurred while parsing the URL: {e}") - raise e - return hostname - - -def remove_http(url: str) -> str: - """Removes http(s)://www. from a given url so that different protocols don't throw off the matcher. - - Args: - url (str): Url to remove http from. - - Returns: - str: The url without http(s)://www. - """ - try: - # Remove http(s)://www. and www. prefixes from the url - url = re.sub(r'^(http(s)?://)?(www\.)?', '', url) - # Ensure the url ends with a / - if not url.endswith('/'): - url += '/' - except Exception as e: - print(f"An error occurred while processing the URL: {e}") - raise e - return url - - -def match_agencies(agencies, agency_hostnames, url): - """Attempts to match a url with an agency. - - Args: - agencies (list): List of agency dictionaries. - agency_hostnames (list): List of corresponding agency hostnames. - url (str): Url to match. - - Returns: - dict: Dictionary of a match in the form {"url": url, "agency": matched_agency}. - """ - url = url.strip().strip('"') - url_hostname = parse_hostname(url) - - if url_hostname in agency_hostnames: - # All agencies with the same hostname as the url are found - matched_agency = [ - agencies[i] for i, agency_hostname in enumerate(agency_hostnames) if url_hostname == agency_hostname - ] - else: - return {"url": url, "agency": [], "status": "No match found"} - - # More than one agency was found - if len(matched_agency) > 1: - url_no_http = remove_http(url) - - for agency in matched_agency: - agency_homepage = remove_http(agency["homepage_url"]) - # It is assumed that if the url begins with the agency's url, then it belongs to that agency - if url_no_http.startswith(agency_homepage): - return {"url": url, "agency": agency, "status": "Match found"} - break - - return {"url": url, "agency": [], "status": "Contested match"} - - return {"url": url, "agency": matched_agency[0], "status": "Match found"} - - -def match_urls_to_agencies_and_clean_data(urls_df: polars.DataFrame) -> polars.DataFrame: - agencies_df = get_agencies_data() - # Filter out agencies without a homepage_url set - # Define column names as variables for flexibility - homepage_url_col = "homepage_url" - hostname_col = "hostname" - count_data_sources_col = "count_data_sources" - max_data_sources_col = "max_data_sources" - - # Perform operations on DataFrame - try: - agencies_df = ( - agencies_df - # Filter out rows without a homepage_url - .filter(polars.col(homepage_url_col).is_not_null()) - .filter(polars.col(homepage_url_col) != "") - # Add a new column 'hostname' by applying the parse_hostname function to 'homepage_url' - .with_columns(polars.col(homepage_url_col).map_elements(parse_hostname).alias(hostname_col), - polars.col(count_data_sources_col).fill_null(0)) - # Add a new column 'max_data_sources' which is the max of 'count_data_sources' over 'hostname' - .with_columns(polars.col(count_data_sources_col).max().over(hostname_col).alias(max_data_sources_col)) - # Filter rows where 'count_data_sources' equals 'max_data_sources' - .filter(polars.col(count_data_sources_col) == polars.col(max_data_sources_col)) - # Keep only unique rows based on 'homepage_url' - .unique(subset=[homepage_url_col]) - ) - print("Indentifying agencies...") - # Add a new column 'hostname' by applying the parse_hostname function to 'url' - urls_df = urls_df.with_columns(polars.col("url").map_elements(parse_hostname).alias("hostname")) - - # Join urls_df with agencies_df on 'hostname' - matched_agencies_df = urls_df.join(agencies_df, on="hostname", how="left") - - # Replace all null values with an empty string - matched_agencies_clean_df = matched_agencies_df.with_columns(polars.all().fill_null("")) - except Exception as e: - print(f"An error occurred while processing the data: {e}") - raise e - return matched_agencies_clean_df - - -def read_data(file_path: str) -> polars.DataFrame: - try: - return polars.read_csv(file_path) - except Exception as e: - print(f"An error occurred while reading the file: {e}") - raise e - - -def write_data(df: polars.DataFrame, file_path: str): - try: - df.write_csv(file_path) - print("Results written to results.csv") - except Exception as e: - print(f"An error occurred while writing to the file: {e}") - raise e - - -def process_data(urls_df: polars.DataFrame) -> polars.DataFrame: - matched_agencies_df = match_urls_to_agencies_and_clean_data(urls_df) - - # Filter out rows where the hostname is not null - matches_only = matched_agencies_df.filter(polars.col("hostname").is_not_null()) - num_matches = len(matches_only) - num_urls = len(urls_df) - percent_urls_matched = 100 * float(num_matches) / float(num_urls) - - # Print the number and percentage of URLs that were matched - print(f"\n{num_matches} / {num_urls} ({percent_urls_matched:0.1f}%) of urls identified") - - # Return the DataFrame containing only the matched URLs - return matches_only - - -def process_and_write_data(input_file: str, output_file: str): - urls_df = read_data(input_file) - matches_only = process_data(urls_df) - if not matches_only.is_empty(): - write_data(matches_only, output_file) - - -if __name__ == "__main__": - process_and_write_data(sys.argv[1], "results.csv") - print("Results written to results.csv") diff --git a/api/routes/batch.py b/api/routes/batch.py index 2c791503..7ba0a2a4 100644 --- a/api/routes/batch.py +++ b/api/routes/batch.py @@ -103,7 +103,6 @@ async def get_batch_logs( @batch_router.post("/{batch_id}/abort") async def abort_batch( batch_id: int = Path(description="The batch id"), - core: SourceCollectorCore = Depends(get_core), async_core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), ) -> MessageResponse: diff --git a/collector_db/enums.py b/collector_db/enums.py index a701a847..b28b6091 100644 --- a/collector_db/enums.py +++ b/collector_db/enums.py @@ -17,7 +17,6 @@ class ValidationStatus(PyEnum): class ValidationSource(PyEnum): MACHINE_LEARNING = "Machine Learning" - LABEL_STUDIO = "Label Studio" MANUAL = "Manual" diff --git a/collector_manager/AsyncCollectorBase.py b/collector_manager/AsyncCollectorBase.py index 099f5338..a842a9c0 100644 --- a/collector_manager/AsyncCollectorBase.py +++ b/collector_manager/AsyncCollectorBase.py @@ -72,17 +72,17 @@ async def handle_error(self, e: Exception) -> None: ) async def process(self) -> None: - await self.log("Processing collector...", allow_abort=False) + await self.log("Processing collector...") preprocessor = self.preprocessor() url_infos = preprocessor.preprocess(self.data) - await self.log(f"URLs processed: {len(url_infos)}", allow_abort=False) + await self.log(f"URLs processed: {len(url_infos)}") - await self.log("Inserting URLs...", allow_abort=False) + await self.log("Inserting URLs...") insert_urls_info: InsertURLsInfo = await self.adb_client.insert_urls( url_infos=url_infos, batch_id=self.batch_id ) - await self.log("Updating batch...", allow_abort=False) + await self.log("Updating batch...") await self.adb_client.update_batch_post_collection( batch_id=self.batch_id, total_url_count=insert_urls_info.total_count, @@ -91,7 +91,7 @@ async def process(self) -> None: batch_status=self.status, compute_time=self.compute_time ) - await self.log("Done processing collector.", allow_abort=False) + await self.log("Done processing collector.") if self.post_collection_function_trigger is not None: await self.post_collection_function_trigger.trigger_or_rerun() @@ -123,7 +123,6 @@ async def run(self) -> None: async def log( self, message: str, - allow_abort = True # Deprecated ) -> None: await self.logger.log(LogInfo( batch_id=self.batch_id, diff --git a/core/SourceCollectorCore.py b/core/SourceCollectorCore.py index 4516ceb5..6f05a3c4 100644 --- a/core/SourceCollectorCore.py +++ b/core/SourceCollectorCore.py @@ -9,8 +9,6 @@ class SourceCollectorCore: def __init__( self, - core_logger: Optional[Any] = None, # Deprecated - collector_manager: Optional[Any] = None, # Deprecated db_client: Optional[DatabaseClient] = None, dev_mode: bool = False ): diff --git a/core/TaskManager.py b/core/TaskManager.py index 429375c2..e72724fc 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -1,6 +1,6 @@ import logging -from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface +from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.TaskInfo import TaskInfo from collector_db.enums import TaskType diff --git a/core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py b/core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py index 03f2a064..a6222cf8 100644 --- a/core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py +++ b/core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py @@ -1,6 +1,6 @@ from typing import Optional -from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponse, AgencyLookupResponseType +from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponse, AgencyLookupResponseType from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.exceptions import MuckrockAPIError from core.helpers import process_match_agency_response_to_suggestions diff --git a/core/classes/task_operators/AgencyIdentificationTaskOperator.py b/core/classes/task_operators/AgencyIdentificationTaskOperator.py index 4c2d6f1b..b6e53955 100644 --- a/core/classes/task_operators/AgencyIdentificationTaskOperator.py +++ b/core/classes/task_operators/AgencyIdentificationTaskOperator.py @@ -1,6 +1,6 @@ from aiohttp import ClientSession -from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface +from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.enums import TaskType diff --git a/source_collectors/ckan/README.md b/source_collectors/ckan/README.md index be6c65cf..2afcbb28 100644 --- a/source_collectors/ckan/README.md +++ b/source_collectors/ckan/README.md @@ -19,28 +19,6 @@ Running the scraper will output a list of packages to a CSV file using the searc * `search_terms.py` - The search terms and CKAN portals to search from. * `ckan_scraper_toolkit.py` - Toolkit of functions that use ckanapi to retrieve packages from CKAN data portals. -## Setup - -1. In a terminal, navigate to the CKAN scraper folder - ```cmd - cd scrapers_library/data_portals/ckan/ - ``` -2. Create and activate a Python virtual environment - ```cmd - python -m venv venv - source venv/bin/activate - ``` - -3. Install the requirements - ```cmd - pip install -r requirements.txt - ``` -4. Run the multi-portal CKAN scraper - ```cmd - python scrape_ckan_data_portals.py - ``` -5. Review the generated `results.csv` file. - ## How can I tell if a website I want to scrape is hosted using CKAN? There's no easy way to tell, some websites will reference CKAN or link back to the CKAN documentation while others will not. There doesn't seem to be a database of all CKAN instances either. diff --git a/source_collectors/ckan/main.py b/source_collectors/ckan/main.py deleted file mode 100644 index 091d2642..00000000 --- a/source_collectors/ckan/main.py +++ /dev/null @@ -1,44 +0,0 @@ -from source_collectors.ckan.ckan_scraper_toolkit import ckan_package_search, ckan_group_package_show, \ - ckan_package_search_from_organization -from source_collectors.ckan.scrape_ckan_data_portals import perform_search, get_flat_list, deduplicate_entries, \ - get_collection_child_packages, filter_result, parse_result, write_to_csv -from source_collectors.ckan.search_terms import package_search, group_search, organization_search - - - -async def main(): - """ - Main function. - """ - results = [] - - print("Gathering results...") - results = await perform_search( - search_func=ckan_package_search, - search_terms=package_search, - results=results, - ) - results = await perform_search( - search_func=ckan_group_package_show, - search_terms=group_search, - results=results, - ) - results = await perform_search( - search_func=ckan_package_search_from_organization, - search_terms=organization_search, - results=results, - ) - - flat_list = get_flat_list(results) - # Deduplicate entries - flat_list = deduplicate_entries(flat_list) - print("\nRetrieving collections...") - flat_list = get_collection_child_packages(flat_list) - - filtered_results = list(filter(filter_result, flat_list)) - parsed_results = list(map(parse_result, filtered_results)) - - write_to_csv(parsed_results) - -if __name__ == "__main__": - main() diff --git a/source_collectors/ckan/requirements.txt b/source_collectors/ckan/requirements.txt deleted file mode 100644 index fc41154b..00000000 --- a/source_collectors/ckan/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -from_root -ckanapi -bs4 -lxml -tqdm -pandas \ No newline at end of file diff --git a/source_collectors/ckan/schemas.py b/source_collectors/ckan/schemas.py deleted file mode 100644 index 6aeecf09..00000000 --- a/source_collectors/ckan/schemas.py +++ /dev/null @@ -1,6 +0,0 @@ -from marshmallow import Schema, fields - - -class PackageSearchSchema(Schema): - count = fields.Int(required=True) - results = fields.List(fields.Str(), required=True) # TODO: What is the structure of this? \ No newline at end of file diff --git a/source_collectors/ckan/scrape_ckan_data_portals.py b/source_collectors/ckan/scrape_ckan_data_portals.py index ad3d62e2..3a292b02 100644 --- a/source_collectors/ckan/scrape_ckan_data_portals.py +++ b/source_collectors/ckan/scrape_ckan_data_portals.py @@ -4,7 +4,6 @@ from itertools import chain from typing import Any, Callable, Optional -import pandas as pd from from_root import from_root from tqdm import tqdm @@ -41,26 +40,6 @@ async def perform_search( return results -async def get_collection_child_packages( - results: list[dict[str, Any]] -) -> list[dict[str, Any]]: - """Retrieves the child packages of each collection. - - :param results: List of results. - :return: List of results containing child packages. - """ - new_list = [] - - for result in tqdm(results): - if "extras" in result.keys(): - collections = await get_collections(result) - if collections: - new_list += collections[0] - continue - - new_list.append(result) - - return new_list async def get_collections(result): @@ -265,7 +244,3 @@ def deduplicate_entries(flat_list): return flat_list -def write_to_csv(parsed_results): - df = pd.DataFrame(parsed_results) - df.to_csv("results.csv") - diff --git a/source_collectors/common_crawler/README.md b/source_collectors/common_crawler/README.md deleted file mode 100644 index 3701b5d5..00000000 --- a/source_collectors/common_crawler/README.md +++ /dev/null @@ -1,87 +0,0 @@ -# Common Crawler - -This module interfaces with the Common Crawl dataset to extract urls. - -## Installation - -Python Version Required: 3.11 - -To install all necessary dependencies, run the following command from the root directory: - -```bash -pip install -r requirements.txt -``` - - -## Usage Example - -### Environment Requirements - -Please ensure you have a `.env` file located in the root directory (not the `common_crawler` directory) -which contains the following environment variable: - -* HUGGINGFACE_ACCESS_TOKEN = The access token to enable writing to the associated PDAP dataset. -To obtain your access token, consult user settings at -and ensure you have write access to . -* LABEL_STUDIO_ACCESS_TOKEN = The access token for the Label Studio API. This can be - obtained by logging into Label Studio and navigating to the [user account section](https://app.heartex.com/user/account), where the access token can be copied. -* LABEL_STUDIO_PROJECT_ID = The project ID for the Label Studio API. This can be - obtained by logging into Label Studio and navigating to the relevant project, where the project id will be in the URL. - -### Instructions - -Run the following script from the root directory -```bash -python common_crawler/main.py CC-MAIN-2023-50 '*.gov' police --config common_crawler/config.ini --pages 2 -``` - -This example will crawl a single page (typically 15000 records) of the Common Crawl dataset with ID `CC-MAIN-2023-50` -and search for the term `police` in all the pages with the `.gov` domain. It will use the default configuration file `config.ini` -to determine the json cache location and the location of the output csv file. - -Note that the cache records the most recent page number that was used for given combination of Common Crawl ID, url search term, and keyword. -If the same command is run again, it will start from the next page. -If you want to reset the cache, you can use the `--reset-cache` flag. - -By default, the output csv file will be named `urls.csv` and will be located in the `data` directory of the module. -This csv file contains both the url and the parameters used to query it. - -### Parameters - -- **common_crawl_id**: Required. Specifies the Common Crawl Index to perform the search on. -- **url**: Required. Specifies the domain URL to query. Wildcard characters such as * can be used to expand the search. Note that the query must be contained within quotes (as in '*.gov') to prevent misinterpretation of wildcards -- **search_term**: Required. Specifies keyword within the url to search for. -- **-c or --config**: Optional. Specifies the configuration file to use. The default value is config.ini. -- **-p or --pages**: Optional. Specifies the number of pages to search. The default value is 1. -- **--reset-cache**: Optional. If set, it resets the cache before starting the crawl. - -### Configuration - -Several attributes are currently defined in `config.ini`: -- **cache_filename**: This is the name of the cache file. The default value is `cache`. The file will be saved with a `.json` extension. -- **output_filename**: This is the name of the output file. The default value is `urls`. The file will be saved with a `.csv` extension. -- **data_dir**: This is the directory where the cache and output files will be saved. The default value is `data`. -- **huggingface_repo_id**: This is the repository ID for the hugging face dataset which urls will be uploaded to - -## Code Structure - -The code is structured as follows: -- **main.py**: This is the main file that is used to run the module. It contains the logic to parse the command line arguments and call the necessary functions. -- **crawler.py**: This file contains the logic to interface with the Common Crawl dataset and extract urls. -- **cache.py**: This file contains the logic to read and write the cache file. -- **argparser.py**: This file contains the logic to parse the command line and config arguments. -- **csv_manager.py**: This file contains the logic to write the output csv file. -- **utils.py**: This file contains utility functions. -- **config.ini**: This file contains the default configuration values. -- **README.md**: This file contains the documentation for the module. You're reading it right now. Isn't that nifty! - -## Testing - -A suite of unit and integration tests were developed for this module. - -To run the tests, run the following command from this directory: - -```bash -pytest ../tests/test_common_crawler_integration.py -pytest ../tests/test_common_crawler_unit.py -``` \ No newline at end of file diff --git a/source_collectors/common_crawler/argparser.py b/source_collectors/common_crawler/argparser.py deleted file mode 100644 index 67f4a290..00000000 --- a/source_collectors/common_crawler/argparser.py +++ /dev/null @@ -1,95 +0,0 @@ -import argparse -import configparser -import re - -""" -This module contains the argument parser for command line arguments -for the Common Crawler script. -""" - - -def valid_common_crawl_id(common_crawl_id: str) -> bool: - """ - Validate the Common Crawl ID format. - The Common Crawl ID should be in the format CC-MAIN-YYYY-WW. - Args: - common_crawl_id: The Common Crawl ID to validate - Returns: - True if the Common Crawl ID is valid, False otherwise - """ - return re.match(r"CC-MAIN-\d{4}-\d{2}", common_crawl_id) is not None - - -def parse_args() -> argparse.Namespace: - """ - Parse the command line arguments for the Common Crawler script - as well as the configuration file. - Arguments parsed include: - - The Common Crawl ID - - The URL to query - - The search term - - The number of pages to search - - The configuration file (defaults to config.ini) - - A flag to reset the cache - Returns: The parsed arguments - """ - - parser = argparse.ArgumentParser( - description="Query the Common Crawl dataset and optionally save the results to a file." - ) - # Add the required arguments - parser.add_argument("common_crawl_id", type=str, help="The Common Crawl ID") - parser.add_argument("url", type=str, help="The URL to query") - parser.add_argument("keyword", type=str, help="The keyword to search in the url") - # Optional arguments for the number of pages and the output file, and a flag to reset the cache - parser.add_argument( - "-c", - "--config", - type=str, - default="config.ini", - help="The configuration file to use", - ) - parser.add_argument( - "-p", - "--pages", - type=int, - default=1, - help="The number of pages to search (default: 1)", - ) - parser.add_argument( - "--reset-cache", - action="store_true", - default=False, - help="Reset the cache before starting the crawl", - ) - - args = parser.parse_args() - - # Validate the Common Crawl ID format - if not valid_common_crawl_id(args.common_crawl_id): - parser.error( - "Invalid Common Crawl ID format. Expected format is CC-MAIN-YYYY-WW." - ) - - # Read the configuration file - config = configparser.ConfigParser() - config.read(args.config) - - # Combine parsed arguments with configuration file defaults - app_parser = argparse.ArgumentParser(parents=[parser], add_help=False) - app_parser.set_defaults(**config["DEFAULT"]) - - app_args = app_parser.parse_args() - - # Print arguments - print(f"--Common Crawl ID: {app_args.common_crawl_id}") - print(f"--URL: {app_args.url}") - print(f"--Keyword: {app_args.keyword}") - print(f"--Number of Pages: {app_args.pages}") - print(f"--Configuration File: {app_args.config}") - print(f"--Reset Cache: {app_args.reset_cache}") - print(f"--Output File: {app_args.output_filename}.csv") - print(f"--Cache File: {app_args.cache_filename}.json") - print(f"--Data Directory: {app_args.data_dir}") - - return app_args diff --git a/source_collectors/common_crawler/cache.py b/source_collectors/common_crawler/cache.py deleted file mode 100644 index 23d58819..00000000 --- a/source_collectors/common_crawler/cache.py +++ /dev/null @@ -1,93 +0,0 @@ -import json - -from util.miscellaneous_functions import get_file_path - -""" -This module contains classes for managing a cache of Common Crawl search results -These classes include: - - CommonCrawlerCache: a class for managing the cache logic of Common Crawl search results -""" - - -class CommonCrawlerCacheManager: - """ - A class for managing the cache of Common Crawl search results. - This class is responsible for adding, retrieving, and saving cache data. - """ - - def __init__(self, file_name: str = "cache", directory=None): - """ - Initializes the CacheStorage object with a file name and directory. - Args: - file_name: the name of the cache file - directory: the directory to store the cache file - """ - self.file_path = get_file_path(f"{file_name}.json", directory) - print(f"Cache file path: {self.file_path}") - self.cache = self.load_or_create_cache() - - def upsert(self, index: str, url: str, keyword: str, last_page: int) -> None: - """ - Updates the cache with the last page crawled for a given index, url, and keyword. - Or adds a new cache object if it does not exist. - Args: - index: the index of the common crawl - url: the url to search - keyword: the search term to use - last_page: the last page crawled - Returns: None - """ - if index not in self.cache: - self.cache[index] = {} - if url not in self.cache[index]: - self.cache[index][url] = {} - self.cache[index][url][keyword] = last_page - - def get(self, index, url, keyword) -> int: - """ - Retrieves a page number from the cache. - Args: - index: the index of the common crawl - url: the url to search - keyword: the search term to use - - Returns: int - the last page crawled - - """ - if ( - index in self.cache - and url in self.cache[index] - and keyword in self.cache[index][url] - ): - return self.cache[index][url][keyword] - # The cache object does not exist. Return 0 as the default value. - return 0 - - def load_or_create_cache(self) -> dict: - """ - Loads the cache from the configured file path. - If the file does not exist, an empty dictionary is returned. - Returns: dict - the cache data - """ - try: - with open(self.file_path, "r") as file: - return json.load(file) - except FileNotFoundError: - return {} - - def save_cache(self) -> None: - """ - Converts the cache object into a JSON-serializable format and saves it to the configured file path. - This method ensures the cache is stored in a readable and easily reloadable format, allowing for - persistence of crawl data across sessions. - """ - # Reformat cache data for JSON serialization - with open(self.file_path, "w") as file: - json.dump(self.cache, file, indent=4) - - def reset_cache(self) -> None: - """ - Resets the cache to an empty state. - """ - self.cache = {} - print("Cache has been reset.") diff --git a/source_collectors/common_crawler/config.ini b/source_collectors/common_crawler/config.ini deleted file mode 100644 index fc558303..00000000 --- a/source_collectors/common_crawler/config.ini +++ /dev/null @@ -1,19 +0,0 @@ -# This configuration file contains default settings for the Common Crawler application. -# Settings can be modified to suit different environments or testing needs. - -[DEFAULT] -# Filename for the cache. Stores which pages have been crawled -# at which combinations of index, url search term, and keyword -# to avoid re-crawling them. -cache_filename = cache - -# Directory where data files (both cache and output) are stored. -# Change as needed for different environments. -# Path is relative from working directory that executes common_crawler/main.py -data_dir = common_crawler/data - -# Filename for the output CSV containing crawled URLs. -output_filename = urls - -# Name of the huggingface repo -huggingface_repo_id = PDAP/unlabeled-urls \ No newline at end of file diff --git a/source_collectors/common_crawler/csv_manager.py b/source_collectors/common_crawler/csv_manager.py deleted file mode 100644 index 5a80aeaa..00000000 --- a/source_collectors/common_crawler/csv_manager.py +++ /dev/null @@ -1,79 +0,0 @@ -import csv -import os - -from util.miscellaneous_functions import get_file_path - - -class CSVManager: - """ - Manages a CSV file for storing URLs. - Creates the file if it doesn't exist, and provides a method for adding new rows. - """ - - def __init__(self, file_name: str, headers: list[str], directory=None): - """ - Args: - file_name: the name of the CSV file - headers: the headers for the CSV file - directory: the directory to store the CSV file - """ - self.file_path = get_file_path(f"{file_name}.csv", directory) - self.headers = headers - if not os.path.exists(self.file_path): - self.initialize_file() - - def add_row(self, row_values: list[str] | tuple[str]): - """ - Appends a new row of data to the CSV. - Args: - row_values: list of values to add to the csv, in order of their inclusion in the list - """ - if isinstance(row_values, str): - # Single values must be converted to a list format - row_values = [row_values] - try: - with open(self.file_path, mode="a", newline="", encoding="utf-8") as file: - writer = csv.writer(file) - writer.writerow(row_values) - except Exception as e: - print(f"An error occurred while trying to write to {self.file_path}: {e}") - - def add_rows(self, results: list[list[str]]) -> None: - """ - Appends multiple rows of data to the CSV as a list of lists of strings. - Args: - results: list[list[str] - a list of lists of strings, each inner list representing a row - Returns: None - """ - for result in results: - self.add_row(result) - print(f"{len(results)} URLs written to {self.file_path}") - - def initialize_file(self): - """ - Initializes the CSV file. - If the file doesn't exist, it creates it with the header row. - """ - # check if file exists - file_exists = os.path.isfile(self.file_path) - - if not file_exists: - with open(self.file_path, mode="a", newline="", encoding="utf-8") as file: - writer = csv.writer(file) - writer.writerow(self.headers) - else: - # Open and check that headers match - with open(self.file_path, mode="r", encoding="utf-8") as file: - header_row = next(csv.reader(file)) - if header_row != self.headers: - raise ValueError( - f"Header row in {self.file_path} does not match expected headers" - ) - print(f"CSV file initialized at {self.file_path}") - - def delete_file(self): - """ - Deletes the CSV file. - """ - os.remove(self.file_path) - print(f"CSV file deleted at {self.file_path}") diff --git a/source_collectors/common_crawler/data/cache.json b/source_collectors/common_crawler/data/cache.json deleted file mode 100644 index e12687ad..00000000 --- a/source_collectors/common_crawler/data/cache.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "CC-MAIN-2023-50": { - "*.gov": { - "police": 10 - } - } -} \ No newline at end of file diff --git a/source_collectors/common_crawler/data/urls.csv b/source_collectors/common_crawler/data/urls.csv deleted file mode 100644 index 6fc4dc6f..00000000 --- a/source_collectors/common_crawler/data/urls.csv +++ /dev/null @@ -1,207 +0,0 @@ -Index,Search Term,Keyword,Page,URL -CC-MAIN-2023-50,*.gov,police,2,https://acworth-ga.gov/administering-the-oath-of-office-to-a-newly-promoted-member-of-the-police-department/ -CC-MAIN-2023-50,*.gov,police,2,https://www.ada.gov/policevideo/policebroadbandgallery.htm -CC-MAIN-2023-50,*.gov,police,2,https://archive.ada.gov/franklintonpolice.htm -CC-MAIN-2023-50,*.gov,police,2,https://archive.ada.gov/illinois_state_police.htm -CC-MAIN-2023-50,*.gov,police,2,https://www.adamn.gov/p/other/police-department -CC-MAIN-2023-50,*.gov,police,2,https://www.adamscountypa.gov/police/earpd -CC-MAIN-2023-50,*.gov,police,2,https://www.aftonwyoming.gov/government/police_department/index.php -CC-MAIN-2023-50,*.gov,police,6,https://www.akronohio.gov/departments/police/community_relations.php -CC-MAIN-2023-50,*.gov,police,6,https://akronohio.gov/departments/police/community_relations.php -CC-MAIN-2023-50,*.gov,police,6,https://www.akronohio.gov/departments/police/crime_snapshot_statistics.php -CC-MAIN-2023-50,*.gov,police,6,https://akronohio.gov/departments/police/crime_snapshot_statistics.php -CC-MAIN-2023-50,*.gov,police,6,https://www.akronohio.gov/departments/police/index.php -CC-MAIN-2023-50,*.gov,police,6,https://akronohio.gov/departments/police/index.php -CC-MAIN-2023-50,*.gov,police,6,https://www.akronohio.gov/departments/police/investigative_subdivision.php -CC-MAIN-2023-50,*.gov,police,6,https://akronohio.gov/departments/police/investigative_subdivision.php -CC-MAIN-2023-50,*.gov,police,6,https://www.akronohio.gov/departments/police/procedures.php -CC-MAIN-2023-50,*.gov,police,6,https://akronohio.gov/departments/police/procedures.php -CC-MAIN-2023-50,*.gov,police,6,https://www.akronohio.gov/departments/police/recruiting/index.php -CC-MAIN-2023-50,*.gov,police,6,https://akronohio.gov/departments/police/recruiting/index.php -CC-MAIN-2023-50,*.gov,police,6,https://www.akronohio.gov/departments/police/services_subdivision.php -CC-MAIN-2023-50,*.gov,police,6,https://akronohio.gov/departments/police/services_subdivision.php -CC-MAIN-2023-50,*.gov,police,6,https://www.akronohio.gov/departments/police/transparency_hub.php -CC-MAIN-2023-50,*.gov,police,6,https://akronohio.gov/departments/police/transparency_hub.php -CC-MAIN-2023-50,*.gov,police,6,https://www.akronohio.gov/departments/police/uniform_subdivision.php -CC-MAIN-2023-50,*.gov,police,6,https://akronohio.gov/departments/police/uniform_subdivision.php -CC-MAIN-2023-50,*.gov,police,6,https://www.akronohio.gov/departments/police/zone_command.php -CC-MAIN-2023-50,*.gov,police,6,https://akronohio.gov/departments/police/zone_command.php -CC-MAIN-2023-50,*.gov,police,6,https://adeca.alabama.gov/2022/11/14/gov-ivey-announces-grant-to-help-auburn-police-deter-crime/ -CC-MAIN-2023-50,*.gov,police,7,https://governor.alabama.gov/newsroom/2020/02/kimberly-police-officer-nick-orear-flag-memo/ -CC-MAIN-2023-50,*.gov,police,7,https://www.revenue.alabama.gov/de/sales-use/2022-police-jurisdiction-annexations-deannexations-and-ordinances/ -CC-MAIN-2023-50,*.gov,police,7,https://www.revenue.alabama.gov/ko/sales-use/2022-police-jurisdiction-annexations-deannexations-and-ordinances/ -CC-MAIN-2023-50,*.gov,police,7,https://www.revenue.alabama.gov/ko/sales-use/police-jurisdictions/ -CC-MAIN-2023-50,*.gov,police,7,https://www.revenue.alabama.gov/ru/sales-use/2022-police-jurisdiction-annexations-deannexations-and-ordinances/ -CC-MAIN-2023-50,*.gov,police,7,https://www.revenue.alabama.gov/sales-use/2015-police-jurisdiction-annexations-deannexations-ordinances/ -CC-MAIN-2023-50,*.gov,police,7,https://www.revenue.alabama.gov/sales-use/2022-police-jurisdiction-annexations-deannexations-and-ordinances/ -CC-MAIN-2023-50,*.gov,police,7,https://www.revenue.alabama.gov/sales-use/2023-police-jurisdiction-deannexations-ordinances-and-maps/ -CC-MAIN-2023-50,*.gov,police,8,https://tourism.alabama.gov/tag/world-police-and-fire-games/ -CC-MAIN-2023-50,*.gov,police,8,https://www.alamedaca.gov/files/content/public/departments/police-department/community_resources_apd.pdf -CC-MAIN-2023-50,*.gov,police,8,https://www.alamedaca.gov/files/content/public/v/237/departments/police-department/community_resources_apd.pdf -CC-MAIN-2023-50,*.gov,police,8,https://www.alamedaca.gov/files/sharedassets/public/alameda/police/policy-manual.pdf -CC-MAIN-2023-50,*.gov,police,8,http://alamedaca.gov/sites/default/files/department-files/2016-02-02/alameda_police_department_alpr_policy_20160122.pdf -CC-MAIN-2023-50,*.gov,police,8,https://alamedaca.gov/sites/default/files/department-files/2016-02-02/alameda_police_department_alpr_policy_20160122.pdf -CC-MAIN-2023-50,*.gov,police,8,https://www.alamedaca.gov/sites/default/files/department-files/2016-02-02/alameda_police_department_alpr_policy_20160122.pdf -CC-MAIN-2023-50,*.gov,police,8,https://www.alamoheightstx.gov/departments/police/ -CC-MAIN-2023-50,*.gov,police,8,https://www.alamoheightstx.gov/news/stories/peace-officers-memorial-day-and-national-police-week/ -CC-MAIN-2023-50,*.gov,police,8,https://www.alamoheightstx.gov/public-safety/police/police-blotter/ -CC-MAIN-2023-50,*.gov,police,9,https://dot.alaska.gov/anc/airport-police-fire.shtml -CC-MAIN-2023-50,*.gov,police,9,https://dot.alaska.gov/anc/airport-police-fire.shtml -CC-MAIN-2023-50,*.gov,police,9,https://dot.alaska.gov/anc/business/policefire/index.shtml -CC-MAIN-2023-50,*.gov,police,9,https://dot.alaska.gov/anc/business/policefire/jobs/ -CC-MAIN-2023-50,*.gov,police,9,https://dot.alaska.gov/anc/contact-police-fire.shtml -CC-MAIN-2023-50,*.gov,police,9,https://dot.alaska.gov/anc/contact-police-fire.shtml -CC-MAIN-2023-50,*.gov,police,9,https://dot.alaska.gov/anc/police-fire-organization-chart.shtml -CC-MAIN-2023-50,*.gov,police,9,https://dot.alaska.gov/anc/police-fire-organization-chart.shtml -CC-MAIN-2023-50,*.gov,police,9,https://dot.alaska.gov/anc/police.shtml -CC-MAIN-2023-50,*.gov,police,9,https://dot.alaska.gov/faiiap/police-fire/index.shtml -CC-MAIN-2023-50,*.gov,police,10,https://gov.alaska.gov/a-proclamation-on-honoring-united-states-capitol-police-officers/ -CC-MAIN-2023-50,*.gov,police,10,https://geohub.albanyga.gov/datasets/corrected-police-beat -CC-MAIN-2023-50,*.gov,police,10,https://data.albanyny.gov/browse?tags=police+report -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/departments/police/contact-the-albany-police-department -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/departments/police/programs/medication-and-sharps-disposal -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/hr/salary-schedules/police-table -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/images/stories/police/apba/scholarship_packet.pdf -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/images/stories/police/forms/a18_alarm_user_permit_application.pdf -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/images/stories/police/forms/secondhand_dealer.pdf -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/images/stories/police/forms/Solicitor_License.pdf -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/images/stories/police/neighborhood-watch/2013_nw_brochure-update.pdf -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/images/stories/police/property/propertyinventoryrecord-fillable.pdf -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/images/stories/police/sm-smartcards/child_safety_smartcard.pdf -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/images/stories/police/sm-smartcards/facebook_smart_card.pdf -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/images/stories/police/sm-smartcards/linkedln_smart_card.pdf -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/images/stories/police/sm-smartcards/photosharingservices_smartcard.pdf -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/images/stories/police/sm-smartcards/smartphone_smartcard.pdf -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/images/stories/police/sm-smartcards/twitter_smart_card.pdf -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/ -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police -CC-MAIN-2023-50,*.gov,police,10,https://albanyoregon.gov/police -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/accreditation -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/accreditation -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/administration -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/apd-policies -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/apd-policies -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/communications-section -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/communications-section -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/community-resource-unit-cru -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/community-resource-unit-cru -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/community-resource-unit-cru -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/history -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/operations -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/operations -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/quarterly-report -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/quarterly-report -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/records-section -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/support-division -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/support-division -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/about/support-division -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/contact-apd -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/contact-apd -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/contact-apd -CC-MAIN-2023-50,*.gov,police,10,https://albanyoregon.gov/police/contact-apd -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/crime/cold-cases -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/crime/statistics-crime-analysis -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/crime/statistics-crime-analysis -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/crime/statistics-crime-analysis -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/crime/statistics-crime-analysis -CC-MAIN-2023-50,*.gov,police,10,https://albanyoregon.gov/police/crime/statistics-crime-analysis -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/forms -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/forms/2dogs -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/forms/2dogs -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/forms/apbascholarship -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/forms/apbascholarship -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/forms/filing-a-complaint -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/forms/filing-a-complaint -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/forms/home-security-alarm-permits -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/forms/home-security-alarm-permits -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/forms/patch-requests -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/forms/patch-requests -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/forms/property-inventory-record -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/forms/ride-along-requests -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/forms/ride-along-requests -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/animal-control -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/apba -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/community-police-academy -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/medication-and-sharps-disposal -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/national-night-out -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/national-night-out -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/national-night-out -CC-MAIN-2023-50,*.gov,police,10,https://albanyoregon.gov/police/programs/national-night-out -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/neighborhood-speed-watch -CC-MAIN-2023-50,*.gov,police,10,https://albanyoregon.gov/police/programs/neighborhood-speed-watch -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/neighborhood-watch-program -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/resources -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/resources -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/safe-and-secure-seniors-independent -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/safe-and-secure-seniors-independent -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/safereturn -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/safety-camp -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/safety-camp -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/tow -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/tow -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/victim-assistance -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/victim-assistance -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/programs/youthacademy -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/qrcode -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/robots.txt -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/safety/bicycle-theft-prevention-and-safety -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/safety/bicycle-theft-prevention-and-safety -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/safety/child-safety -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/safety/crime-prevention-through-environmental-design-cpted -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/safety/crime-prevention-through-environmental-design-cpted -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/safety/online-social-media-safety-tips -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/safety/protecting-your-business -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/safety/safe-exchange-zones -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/safety/safety-on-the-road -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/safety/vehicle -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/working-at-apd/cadet-program -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/working-at-apd/career-opportunities -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/working-at-apd/lateral-officers -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/working-at-apd/volunteer-program -CC-MAIN-2023-50,*.gov,police,10,https://www.albanyoregon.gov/police/working-at-apd/volunteer-program -CC-MAIN-2023-50,*.gov,police,11,https://alexandriava.gov/news-apd/2022-02-22/alexandria-police-department-makes-arrest-in-connection-to-shots-fired-incident -CC-MAIN-2023-50,*.gov,police,11,https://www.alexandriava.gov/news-apd/2022-03-15/alexandria-police-department-apprehends-assault-suspect -CC-MAIN-2023-50,*.gov,police,11,https://alexandriava.gov/news-apd/2022-03-22/alexandria-police-officer-arrested -CC-MAIN-2023-50,*.gov,police,11,https://alexandriava.gov/news-apd/2022-03-25/alexandria-police-department-investigates-first-homicide-of-the-year -CC-MAIN-2023-50,*.gov,police,11,https://alexandriava.gov/news-apd/2022-04-18/don-hayes-appointed-alexandria-police-chief -CC-MAIN-2023-50,*.gov,police,11,https://alexandriava.gov/news-apd/2022-06-06/alexandria-police-makes-arrest-in-fatal-shooting -CC-MAIN-2023-50,*.gov,police,11,https://www.alexandriava.gov/news-apd/2022-08-29/alexandria-police-department-investigates-serious-crash -CC-MAIN-2023-50,*.gov,police,11,https://www.alexandriava.gov/news-apd/2022-12-21/alexandria-police-department-investigates-shooting-incident -CC-MAIN-2023-50,*.gov,police,11,https://www.alexandriava.gov/news-apd/2023-09-29/apd-lt-graduates-from-dc-police-leadership-academy -CC-MAIN-2023-50,*.gov,police,11,https://www.alexandriava.gov/news-apd/2023-11-17/apd-assists-fairfax-county-police-in-apprehension-of-suspect-driving-stolen -CC-MAIN-2023-50,*.gov,police,11,https://alexandriava.gov/news-apd/2023-11-17/apd-assists-fairfax-county-police-in-apprehension-of-suspect-driving-stolen -CC-MAIN-2023-50,*.gov,police,11,https://alexandriava.gov/police/ -CC-MAIN-2023-50,*.gov,police,11,https://www.alexandriava.gov/police-department/community-police-academy -CC-MAIN-2023-50,*.gov,police,11,https://www.alexandriava.gov/police-department/criminal-investigation-division -CC-MAIN-2023-50,*.gov,police,11,https://www.alexandriava.gov/police-department/listing-page/apd-news-releases -CC-MAIN-2023-50,*.gov,police,11,https://www.alexandriava.gov/police-department/office-of-the-police-chief -CC-MAIN-2023-50,*.gov,police,11,https://www.alexandriava.gov/police-department/other-services -CC-MAIN-2023-50,*.gov,police,11,https://www.alexandriava.gov/police-department/police-services -CC-MAIN-2023-50,*.gov,police,11,http://www3.alexandriava.gov/police/crime_reports/reporter.php -CC-MAIN-2023-50,*.gov,police,11,https://www3.alexandriava.gov/police/crime_reports/reporter.php -CC-MAIN-2023-50,*.gov,police,11,https://www.alexandriava.gov/police/info/default.aspx?id=112991 -CC-MAIN-2023-50,*.gov,police,11,https://alexandriava.gov/police/info/default.aspx?id=24274 -CC-MAIN-2023-50,*.gov,police,11,https://www.alexandriava.gov/police/info/default.aspx?id=59358 -CC-MAIN-2023-50,*.gov,police,11,https://alexandriava.gov/police/info/news_policedisplay.aspx?id=27648 -CC-MAIN-2023-50,*.gov,police,11,https://alexandriava.gov/police/info/news_policedisplay.aspx?id=33624 -CC-MAIN-2023-50,*.gov,police,11,https://alexandriava.gov/police/info/news_policedisplay.aspx?id=68136 -CC-MAIN-2023-50,*.gov,police,11,https://wdc.alexandriava.gov/employment/special-police-officer-listing-3030.aspx -CC-MAIN-2023-50,*.gov,police,11,https://wdc.alexandriava.gov/employment/special-police-officer-listing-4122.aspx -CC-MAIN-2023-50,*.gov,police,11,https://aliquippapa.gov/events/light-up-night-at-the-aliquippa-police-station/ -CC-MAIN-2023-50,*.gov,police,11,https://www.almaarkansas.gov/police/ -CC-MAIN-2023-50,*.gov,police,11,https://www.almontmichigan.gov/departments/police-department/ -CC-MAIN-2023-50,*.gov,police,11,https://altoonapa.gov/contact-forms/departments/police/report-an-abandoned-vehicle-on-public-streets -CC-MAIN-2023-50,*.gov,police,11,https://www.altoonapa.gov/contacts/police/commander-of-criminal-investigation/lt-ashley-day -CC-MAIN-2023-50,*.gov,police,11,https://altoonapa.gov/departments/police/animal-control -CC-MAIN-2023-50,*.gov,police,11,https://altoonapa.gov/departments/police/directory -CC-MAIN-2023-50,*.gov,police,11,https://altoonapa.gov/departments/police/services -CC-MAIN-2023-50,*.gov,police,11,https://alvordtx.gov/police-documents/ -CC-MAIN-2023-50,*.gov,police,11,https://alvordtx.gov/police-staff/ -CC-MAIN-2023-50,*.gov,police,11,https://alvordtx.gov/question/how-do-i-file-a-police-report-2/ -CC-MAIN-2023-50,*.gov,police,11,https://alvordtx.gov/question/who-do-i-call-about-police-related-non-emergencies-2/ -CC-MAIN-2023-50,*.gov,police,11,https://alvordtx.gov/topics/police-courts/ -CC-MAIN-2023-50,*.gov,police,11,http://police.amarillo.gov/robots.txt -CC-MAIN-2023-50,*.gov,police,11,http://police.amarillo.gov/robots.txt -CC-MAIN-2023-50,*.gov,police,11,https://share.america.gov/ar/heres-police-held-accountable-shooting-incidents-video/ diff --git a/source_collectors/common_crawler/main.py b/source_collectors/common_crawler/main.py deleted file mode 100644 index 67bd4c45..00000000 --- a/source_collectors/common_crawler/main.py +++ /dev/null @@ -1,366 +0,0 @@ -import argparse -import collections -import dataclasses -import os -import re -import sys -from datetime import datetime - -from dotenv import load_dotenv - -from source_collectors.common_crawler.argparser import parse_args -from source_collectors.common_crawler.cache import CommonCrawlerCacheManager -from source_collectors.common_crawler.crawler import CommonCrawlResult, CommonCrawlerManager -from source_collectors.common_crawler.csv_manager import CSVManager - -# The below code sets the working directory to be the root of the entire repository -# This is done to solve otherwise quite annoying import issues. -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) - -from util.huggingface_api_manager import HuggingFaceAPIManager -from util.miscellaneous_functions import get_filename_friendly_timestamp -from label_studio_interface.LabelStudioConfig import LabelStudioConfig -from label_studio_interface.LabelStudioAPIManager import LabelStudioAPIManager - -""" -This module contains the main function for the Common Crawler script. -""" - - -@dataclasses.dataclass -class BatchInfo: - """ - Dataclass for batch info - """ - datetime: str - source: str - count: str - keywords: str - notes: str - filename: str - - -class LabelStudioError(Exception): - """Custom exception for Label Studio Errors""" - - pass - - -BATCH_HEADERS = ["Datetime", "Source", "Count", "Keywords", "Notes", "Filename"] - - -def get_current_time(): - """ - Returns the current time - """ - return str(datetime.now()) - - -def add_batch_info_to_csv( - common_crawl_result: CommonCrawlResult, args: argparse.Namespace, last_page: int -) -> BatchInfo: - """ - Adds batch info to CSV - """ - batch_info = BatchInfo( - datetime=get_current_time(), - source="Common Crawl", - count=str(len(common_crawl_result.url_results)), - keywords=f"{args.url} - {args.keyword}", - notes=f"{args.common_crawl_id}, {args.pages} pages, starting at {last_page + 1}", - filename=f"{args.output_filename}_{get_filename_friendly_timestamp()}", - ) - - batch_info_csv_manager = CSVManager( - file_name="batch_info", directory=args.data_dir, headers=BATCH_HEADERS - ) - batch_info_csv_manager.add_row(dataclasses.astuple(batch_info)) - - return batch_info - - -def main(): - """ - Main function - """ - # Parse the arguments - args = parse_args() - - # Initialize the Cache - cache_manager = CommonCrawlerCacheManager( - file_name=args.cache_filename, directory=args.data_dir - ) - - load_dotenv() - - # Initialize the HuggingFace API Manager - hf_access_token = os.getenv("HUGGINGFACE_ACCESS_TOKEN") - if not hf_access_token: - raise ValueError( - "HUGGINGFACE_ACCESS_TOKEN not accessible in .env file in root directory. " - "Please obtain access token from your personal account at " - "https://huggingface.co/settings/tokens and ensure you have write access to " - "https://huggingface.co/PDAP. Then include in .env file in root directory." - ) - huggingface_api_manager = HuggingFaceAPIManager( - access_token=hf_access_token, repo_id=args.huggingface_repo_id - ) - ls_access_token = os.getenv("LABEL_STUDIO_ACCESS_TOKEN") - if not ls_access_token: - raise ValueError( - "LABEL_STUDIO_ACCESS_TOKEN not accessible in .env file in root directory. " - "Please obtain access token from your personal account at " - "https://app.heartex.com/user/account and ensure you have read access to " - "https://app.heartex.com/projects/61550. Then include in .env file in root directory." - ) - ls_project_id = os.getenv("LABEL_STUDIO_PROJECT_ID") - if not ls_project_id: - raise ValueError( - "LABEL_STUDIO_PROJECT_ID not accessible in .env file in root directory. " - "Please obtain a project ID by navigating to the Label Studio project " - "where it will be visibile in the url. Then include in .env file in root directory." - ) - - try: - print("Retrieving Label Studio data for deduplication") - label_studio_results = get_ls_data() - if label_studio_results is None: - raise LabelStudioError("Failed to retrieve Label Studio Data") - print("Label Studio data retrieved successfully") - except LabelStudioError as e: - print(e) - raise - - if args.reset_cache: - cache_manager.reset_cache() - - try: - # Retrieve the last page from the cache, or 0 if it does not exist - last_page = cache_manager.get(args.common_crawl_id, args.url, args.keyword) - common_crawl_result = process_crawl_and_upload( - args, last_page, huggingface_api_manager, label_studio_results - ) - except ValueError as e: - print(f"Error during crawling: {e}") - return - - try: - cache_manager.upsert( - index=args.common_crawl_id, - url=args.url, - keyword=args.keyword, - last_page=common_crawl_result.last_page_search, - ) - cache_manager.save_cache() - - except ValueError as e: - print(f"Error while saving cache manager: {e}") - - -def handle_remote_results_error(remote_results): - """ - Handles errors in the remote results - - Args: remote_results (dict): The results from the label studio project - Raises: LabelStudioError: If an error is found in the remote results - """ - - status_code = remote_results.get("status_code") - if status_code == 401: - raise LabelStudioError("Invalid Label Studio token passed! Exiting...") - elif status_code == 404: - raise LabelStudioError("Invalid Label Studio Project ID! Exiting...") - else: - raise LabelStudioError(f"Unexpected error: {remote_results}") - - -def validate_remote_results(remote_results): - """ - Validates the remote results retrieved from the Label Studio project - - Args: remote_results (dict or list): The results from the Label Studio project - - Returns: - list[dict]: If the remote results are valid - None: If the remote results are invalid - """ - if isinstance(remote_results, list): - if not remote_results: - print("No data in Label Studio project.") - return [] - elif "url" not in remote_results[0]["data"]: - raise LabelStudioError( - "Column 'url' not present in Label Studio project. Exiting..." - ) - else: - return remote_results - elif isinstance(remote_results, dict): - handle_remote_results_error(remote_results) - else: - raise LabelStudioError("Unexpected response type.") - - -def get_ls_data() -> list[dict] | None: - """Retrieves data from a Label Studio project to be used in deduplication of common crawl results. - - Returns: - list[dict] | None: Data from the Labels Studio project or None if the result is invalid. - """ - # Retrieve the data from the Labels Studio project - config = LabelStudioConfig() - api_manager = LabelStudioAPIManager(config) - response = api_manager.import_tasks_from_project(all_tasks=True) - remote_results = response.json() - - return validate_remote_results(remote_results) - - -def strip_url(url: str) -> str: - """Strips http(s)://www. from the beginning of a url if applicable. - - Args: - url (str): The URL to strip. - - Returns: - str: The stripped URL. - """ - result = re.search(r"^(?:https?://)?(?:www\.)?(.*)$", url).group(1) - return result - - -def remove_local_duplicates(url_results: list[str]) -> list[str]: - """Removes duplicate URLs from a list, ignoring http(s)://www. - - Args: - url_results (list[str]): List of URLs to deduplicate. - - Returns: - list[str]: List of unique URLs. - """ - stripped_url_results = [strip_url(url) for url in url_results] - unique_urls = collections.deque() - adjust = 0 - - for index, url in enumerate(stripped_url_results): - if url in unique_urls: - del url_results[index - adjust] - adjust += 1 - else: - unique_urls.appendleft(url) - - return url_results - - -def remove_remote_duplicates( - url_results: list[str], label_studio_data: list[dict] -) -> list[str]: - """Removes URLs from a list that are already present in the Label Studio project, ignoring http(s)://www. - - Args: - url_results (list[str]): List of URLs to deduplicate. - label_studio_data (list[dict]): Label Studio project data to check for duplicates. - - Returns: - list[str]: List of remaining URLs not present in the Label Studio project. - """ - try: - remote_urls = [strip_url(task["data"]["url"]) for task in label_studio_data] - except TypeError: - print( - "Invalid Label Studio credentials. Database could not be checked for duplicates." - ) - return url_results - remote_urls = set(remote_urls) - - stripped_url_results = [strip_url(url) for url in url_results] - adjust = 0 - - for index, url in enumerate(stripped_url_results): - if url in remote_urls: - del url_results[index - adjust] - adjust += 1 - - return url_results - - -def handle_csv_and_upload( - common_crawl_result: CommonCrawlResult, - huggingface_api_manager: HuggingFaceAPIManager, - args: argparse.Namespace, - last_page: int, -): - """ - Handles the CSV file and uploads it to Hugging Face repository. - Args: - common_crawl_result: The result from Common Crawl. - huggingface_api_manager: The Hugging Face API manager. - args: The command-line arguments. - last_page: last page crawled - - """ - batch_info = add_batch_info_to_csv(common_crawl_result, args, last_page) - - csv_manager = CSVManager( - file_name=batch_info.filename, headers=["url"], directory=args.data_dir - ) - csv_manager.add_rows(common_crawl_result.url_results) - huggingface_api_manager.upload_file( - local_file_path=csv_manager.file_path, - repo_file_path=f"{args.output_filename}/{csv_manager.file_path.name}", - ) - print( - f"Uploaded file to Hugging Face repo {huggingface_api_manager.repo_id} at {args.output_filename}/{csv_manager.file_path.name}" - ) - csv_manager.delete_file() - - -def process_crawl_and_upload( - args: argparse.Namespace, - last_page: int, - huggingface_api_manager: HuggingFaceAPIManager, - label_studio_data: list[dict], -) -> CommonCrawlResult: - """ - Processes a crawl and uploads the results to Hugging Face. - """ - # Initialize the CommonCrawlerManager - crawler_manager = CommonCrawlerManager(args.common_crawl_id) - # Determine the pages to search, based on the last page searched - start_page = last_page + 1 - # Use the parsed arguments - common_crawl_result: CommonCrawlResult = crawler_manager.crawl( - search_term=args.url, - keyword=args.keyword, - num_pages=args.pages, - start_page=start_page, - ) - # Logic should conclude here if no results are found - if not common_crawl_result.url_results: - print("No url results found. Ceasing main execution.") - add_batch_info_to_csv(common_crawl_result, args, last_page) - return common_crawl_result - - print("Removing urls already in the database") - common_crawl_result.url_results = remove_local_duplicates( - common_crawl_result.url_results - ) - common_crawl_result.url_results = remove_remote_duplicates( - common_crawl_result.url_results, label_studio_data - ) - if not common_crawl_result.url_results: - print( - "No urls not already present in the database found. Ceasing main execution." - ) - add_batch_info_to_csv(common_crawl_result, args, last_page) - return common_crawl_result - - handle_csv_and_upload(common_crawl_result, huggingface_api_manager, args, last_page) - - return common_crawl_result - - -if __name__ == "__main__": - # Example usage: python main.py CC-MAIN-2023-50 *.gov "police" - # Usage with optional arguments: python main.py CC-MAIN-2023-50 *.gov "police" -p 2 -o police_urls.txt - print("Running Common Crawler...") - main() diff --git a/source_collectors/common_crawler/requirements_common_crawler_action.txt b/source_collectors/common_crawler/requirements_common_crawler_action.txt deleted file mode 100644 index 22823fd0..00000000 --- a/source_collectors/common_crawler/requirements_common_crawler_action.txt +++ /dev/null @@ -1,3 +0,0 @@ -requests~=2.31.0 -python-dotenv~=1.0.1 -huggingface-hub~=0.22.2 \ No newline at end of file diff --git a/source_collectors/common_crawler/schemas.py b/source_collectors/common_crawler/schemas.py deleted file mode 100644 index 608f9632..00000000 --- a/source_collectors/common_crawler/schemas.py +++ /dev/null @@ -1,22 +0,0 @@ -from marshmallow import Schema, fields - - -class CommonCrawlerConfigSchema(Schema): - common_crawl_id = fields.String( - required=True, - description="The Common Crawl ID", - example="CC-MAIN-2022-10" - ) - url = fields.String(required=True, description="The URL to query", example="*.gov") - keyword = fields.String(required=True, description="The keyword to search in the url", example="police") - start_page = fields.Integer(required=False, description="The page to start from", example=1) - pages = fields.Integer(required=False, description="The number of pages to search", example=1) - -class CommonCrawlerOutputSchema(Schema): - urls = fields.List( - fields.String( - required=True - ), - required=True, - description="The list of URLs found in the search" - ) \ No newline at end of file diff --git a/agency_identifier/MuckrockAPIInterface.py b/source_collectors/muckrock/MuckrockAPIInterface.py similarity index 100% rename from agency_identifier/MuckrockAPIInterface.py rename to source_collectors/muckrock/MuckrockAPIInterface.py diff --git a/source_collectors/muckrock/README.md b/source_collectors/muckrock/README.md index 43bae80d..a7e75b71 100644 --- a/source_collectors/muckrock/README.md +++ b/source_collectors/muckrock/README.md @@ -4,85 +4,3 @@ This repo provides tools for searching Muckrock FOIA requests, it includes scripts for downloading data from MuckRock, generating CSV files per PDAP database requirements, and automatic labeling -## Installation - -### 1. Clone the `scrapers` repository and navigate to the `muckrock_tools` directory. - -``` -git clone git@github.com:Police-Data-Accessibility-Project/scrapers.git -cd scrapers/scrapers_library/data_portals/muckrock/muckrock_tools -``` - -### 2. Create a virtual environment. - -If you don't already have virtualenv, install the package: - -``` - -pip install virtualenv - -``` - -Then run the following command to create a virtual environment (ensure the python version is as below): - -``` - -virtualenv -p python3.12 venv - -``` - -### 3. Activate the virtual environment. - -``` - -source venv/bin/activate - -``` - -### 4. Install dependencies. - -``` - -pip install -r requirements.txt - -``` - -## Uses - -### 1. Simple Search Term - -- `muck_get.py` -- script to perform searches on MuckRock's database, by matching a search string to title of request. Search is slow due to rate limiting (cannot multi thread around it). - -### 2. Clone Muckrock database & search locally - -- scripts to clone the MuckRock foia requests collection for fast local querying (total size <2GB at present) - -- `create_foia_data_db.py` creates and populates a SQLite database (`foia_data.db`) with all MuckRock foia requests. Various errors outside the scope of this script may occur; a counter (`last_page_fetched.txt`) is created to keep track of the most recent page fetched and inserted into the database. If the program exits prematurely, simply run `create_foia_data_db.py` again to continue where you left off. A log file is created to capture errors for later reference. - -- After `foia_data.db` is created, run `search_foia_data_db.py`, which receives a search string as input and outputs a JSON file with all related FOIA requests for later processing by `generate_detailed_muckrock_csv.py`. For example, - -``` -python3 create_foia_data_db.py - -python3 search_foia_data_db.py --search_for "use of force" -``` - -produces 'use_of_force.json'. - -### 3. County Level Search - -- `get_allegheny_foias.py`, `allegheny_county_towns.txt` -- To search for any and all requests in a certain county (e.g. Allegheny in this case) you must provide a list of all municipalities contained within the county. Muckrock stores geographic info in tiers, from Federal, State, and local level. At the local level, e.g. Pittsburgh and Allegheny County are in the same tier, with no way to determine which municipalities reside within a county (without providing it yourself). - -The `get_allegheny_foias.py` script will find the jurisdiction ID for each municipality in `allegheny_county_towns.txt`, then find all completed FOIA requests for those jurisdictions. - -### 4. Generate detailed FOIA data in PDAP database format - -- `generate_detailed_muckrock_csv.py` -- Once you have a json of relevant FOIA's, run it through this script to generate a CSV that fulfills PDAP database requirements. - -### 5. ML Labeling - -- `muckrock_ml_labeler.py` -- A tool for auto labeling MuckRock sources. This script is using [fine-url-classifier](https://huggingface.co/PDAP/fine-url-classifier) to assign 1 of 36 record type labels. At present, script is expecting each source to have associated header tags, provided via `html-tag-collector/collector.py`. (TODO: For muckrock sources, `collector.py` insufficient, does not grab main text of the request) diff --git a/source_collectors/muckrock/classes/SQLiteClient.py b/source_collectors/muckrock/classes/SQLiteClient.py deleted file mode 100644 index 96a59d82..00000000 --- a/source_collectors/muckrock/classes/SQLiteClient.py +++ /dev/null @@ -1,38 +0,0 @@ -import logging -import sqlite3 - - -class SQLClientError(Exception): - pass - - -class SQLiteClient: - - def __init__(self, db_path: str) -> None: - self.conn = sqlite3.connect(db_path) - - def execute_query(self, query: str, many=None): - - try: - if many is not None: - self.conn.executemany(query, many) - else: - self.conn.execute(query) - self.conn.commit() - except sqlite3.Error as e: - print(f"SQLite error: {e}") - error_msg = f"Failed to execute query due to SQLite error: {e}" - logging.error(error_msg) - self.conn.rollback() - raise SQLClientError(error_msg) - -class SQLiteClientContextManager: - - def __init__(self, db_path: str) -> None: - self.client = SQLiteClient(db_path) - - def __enter__(self): - return self.client - - def __exit__(self, exc_type, exc_value, traceback): - self.client.conn.close() \ No newline at end of file diff --git a/source_collectors/muckrock/muck_get.py b/source_collectors/muckrock/muck_get.py deleted file mode 100644 index b958b61c..00000000 --- a/source_collectors/muckrock/muck_get.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -A straightforward standalone script for downloading data from MuckRock -and searching for it with a specific search string. -""" -from source_collectors.muckrock.classes.FOIASearcher import FOIASearcher -from source_collectors.muckrock.classes.muckrock_fetchers import FOIAFetcher -from source_collectors.muckrock.utils import save_json_file - -if __name__ == "__main__": - search_term = "use of force" - fetcher = FOIAFetcher() - searcher = FOIASearcher(fetcher=fetcher, search_term=search_term) - results = searcher.search_to_count(20) - json_out_file = search_term.replace(" ", "_") + ".json" - save_json_file(file_path=json_out_file, data=results) - print(f"List dumped into {json_out_file}") diff --git a/source_collectors/muckrock/requirements.txt b/source_collectors/muckrock/requirements.txt deleted file mode 100644 index babb4f3e..00000000 --- a/source_collectors/muckrock/requirements.txt +++ /dev/null @@ -1,30 +0,0 @@ -certifi==2024.8.30 -charset-normalizer==3.4.0 -filelock==3.16.1 -fsspec==2024.10.0 -huggingface-hub==0.26.1 -idna==3.10 -Jinja2==3.1.4 -logging==0.4.9.6 -MarkupSafe==3.0.2 -mpmath==1.3.0 -networkx==3.4.2 -numpy==2.1.2 -packaging==24.1 -pandas==2.2.3 -python-dateutil==2.9.0.post0 -pytz==2024.2 -PyYAML==6.0.2 -regex==2024.9.11 -requests==2.32.3 -safetensors==0.4.5 -setuptools==75.2.0 -six==1.16.0 -sympy==1.13.1 -tokenizers==0.20.1 -torch==2.5.0 -tqdm==4.66.5 -transformers==4.46.0 -typing_extensions==4.12.2 -tzdata==2024.2 -urllib3==2.2.3 diff --git a/tests/manual/agency_identifier/test_muckrock_api_interface.py b/tests/manual/agency_identifier/test_muckrock_api_interface.py index 2dac6bd4..e3a86ed9 100644 --- a/tests/manual/agency_identifier/test_muckrock_api_interface.py +++ b/tests/manual/agency_identifier/test_muckrock_api_interface.py @@ -1,7 +1,7 @@ import pytest from aiohttp import ClientSession -from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface +from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface @pytest.mark.asyncio diff --git a/tests/manual/unsorted/test_identifier_unit.py b/tests/manual/unsorted/test_identifier_unit.py deleted file mode 100644 index a6dcc1fb..00000000 --- a/tests/manual/unsorted/test_identifier_unit.py +++ /dev/null @@ -1,275 +0,0 @@ -import tempfile -from unittest.mock import patch - -import pytest -import requests_mock - -from agency_identifier.identifier import * - - -@pytest.fixture -def mock_env(monkeypatch): - monkeypatch.setenv("VUE_APP_PDAP_API_KEY", "test_api_key") - - -def test_get_page_data_success(mock_env): - with requests_mock.Mocker() as m: - m.get("https://data-sources.pdap.io/api/agencies/1", json={"data": "test_data"}, status_code=200) - data = get_page_data(1) - assert data == "test_data" - - -def test_get_page_data_failure(mock_env): - with requests_mock.Mocker() as m: - m.get("https://data-sources.pdap.io/api/agencies/1", status_code=404) - with pytest.raises(Exception): - get_page_data(1) - - -@pytest.mark.parametrize("url,expected", [ - ("http://www.example.com", "example.com"), - ("https://example.com", "example.com"), - ("example.com", "example.com"), - ("www.example.com", "example.com"), -]) -def test_parse_hostname(url, expected): - assert parse_hostname(url) == expected - - -@pytest.mark.parametrize("url", [ - "http:///www.example.com", # Invalid URL - "://example.com", # Missing scheme -]) -def test_parse_hostname_failure(url): - with pytest.raises(Exception): - parse_hostname(url) - - -@pytest.mark.parametrize("url,expected", [ - ("http://www.example.com", "example.com/"), - ("https://example.com", "example.com/"), - ("http://example.com/path/to/page", "example.com/path/to/page/"), - ("www.example.com", "example.com/"), - ("example.com/", "example.com/"), -]) -def test_remove_http(url, expected): - assert remove_http(url) == expected - - -@pytest.fixture -def agencies_and_hostnames(): - return ( - [{"name": "Agency 1", "homepage_url": "https://agency1.com"}], - ["agency1.com"] - ) - - -def test_match_agencies_found(agencies_and_hostnames): - agencies, agency_hostnames = agencies_and_hostnames - match = match_agencies(agencies, agency_hostnames, "http://www.agency1.com/page") - assert match["status"] == "Match found" - assert match["agency"]["name"] == "Agency 1" - - -def test_match_agencies_no_match(agencies_and_hostnames): - agencies, agency_hostnames = agencies_and_hostnames - match = match_agencies(agencies, agency_hostnames, "http://www.nonexistentagency.com") - assert match["status"] == "No match found" - assert match["agency"] == [] - -@pytest.fixture -def agencies_with_same_hostname(): - return ( - [ - {"name": "Agency 1", "homepage_url": "http://agency.com/path1"}, - {"name": "Agency 2", "homepage_url": "http://agency.com/path2"} - ], - ["agency.com", "agency.com"] - ) - -def test_match_agencies_multiple_found(agencies_with_same_hostname): - agencies, agency_hostnames = agencies_with_same_hostname - # A URL that matches the first agency more closely - match = match_agencies(agencies, agency_hostnames, "http://agency.com/path1/page") - assert match["status"] == "Match found" - assert match["agency"]["name"] == "Agency 1" - - # A URL that doesn't closely match either agency's homepage URL path - contested_match = match_agencies(agencies, agency_hostnames, "http://agency.com/otherpath/page") - assert contested_match["status"] == "Contested match" - assert contested_match["agency"] == [] - - # A URL that matches the second agency more closely - match_second = match_agencies(agencies, agency_hostnames, "http://agency.com/path2/anotherpage") - assert match_second["status"] == "Match found" - assert match_second["agency"]["name"] == "Agency 2" - -@patch('agency_identifier.identifier.get_page_data') -def test_get_agencies_data(mock_get_page_data, mock_env): - # Mock get_page_data to return a dictionary on the first call and an empty dictionary on the second call - mock_get_page_data.side_effect = [ - [{"name": "Agency 1", "homepage_url": "https://agency1.com", "id": "1"}], # First page data - [] # Indicates no more pages - ] - - df = get_agencies_data() - assert not df.is_empty() - assert len(df) == 1 - assert df["name"][0] == "Agency 1" - assert df["homepage_url"][0] == "https://agency1.com" - - -# Sample data to simulate what `match_urls_to_agencies_and_clean_data` might return -sample_agencies_data = polars.DataFrame({ - "url": ["http://agency1.com", "http://agency2.com", "http://nonexistentagency.com"], - "homepage_url": ["http://agency1.com", "http://agency2.com", None], - "hostname": ["agency1.com", "agency2.com", None], -}) - -# Sample input URLs DataFrame -sample_urls_df = polars.DataFrame({ - "url": ["http://agency1.com/page1", "http://agency2.com/page2", "http://nonexistentagency.com/page"] -}) - - -@pytest.fixture -def mock_match_urls_to_agencies_and_clean_data(): - with patch('agency_identifier.identifier.match_urls_to_agencies_and_clean_data') as mock: - mock.return_value = sample_agencies_data - yield mock - - -def test_process_data(mock_match_urls_to_agencies_and_clean_data): - processed_df = process_data(sample_urls_df) - - # Verify that the mock was called once with the sample_urls_df - mock_match_urls_to_agencies_and_clean_data.assert_called_once_with(sample_urls_df) - - # Check that the processed DataFrame has filtered out the unmatched URLs - assert len(processed_df) == 2 # Expecting only matched URLs to be present - - # Check if the 'hostname' column exists and has no null values in the result - assert "hostname" in processed_df.columns - assert processed_df.filter(polars.col("hostname").is_null()).height == 0 - - # You might also want to check specific values if necessary - assert processed_df["url"].to_list() == ["http://agency1.com", "http://agency2.com"] - - -# Sample data to simulate what `get_agencies_data` might return -sample_get_agencies_data = polars.DataFrame({ - "homepage_url": ["http://agency1.com", "http://agency2.com"], - "name": ["Agency 1", "Agency 2"], - "count_data_sources": [10, 15], - "hostname": ["agency1.com", "agency2.com"], # Assume this is added by the function -}) - - -@pytest.fixture -def mock_get_agencies_data(): - with patch('agency_identifier.identifier.get_agencies_data') as mock: - mock.return_value = sample_get_agencies_data - yield mock - - -def test_match_urls_to_agencies_and_clean_data(mock_get_agencies_data): - matched_df = match_urls_to_agencies_and_clean_data(sample_urls_df) - - # Verify that `get_agencies_data` was called - mock_get_agencies_data.assert_called_once() - - # Verify the structure and content of the matched DataFrame - # Expect that each URL is matched with the correct agency based on the hostname - # Additionally, check for the addition of any new columns or transformations you apply - assert "homepage_url" in matched_df.columns - assert len(matched_df) == len(sample_urls_df) # Ensure all URLs are processed - - # Verify that URLs are correctly matched or not matched to agencies - # This assumes that the function annotates the DataFrame with match results - assert matched_df.filter(polars.col("url") == "http://agency1.com/page1").select("name")["name"][0] == "Agency 1" - assert matched_df.filter(polars.col("url") == "http://nonexistentagency.com/page").select("name")["name"][0] == "" - - -def test_read_data_success(): - # Create a temporary file with some CSV content - with tempfile.NamedTemporaryFile(mode='w', delete=False) as tmp: - tmp.write("column1,column2\nvalue1,value2") - tmp_path = tmp.name - - # Attempt to read the file with read_data - try: - df = read_data(tmp_path) - assert not df.is_empty() - assert "column1" in df.columns - assert df.shape == (1, 2) - finally: - # Clean up the temporary file - os.remove(tmp_path) - -def test_read_data_failure(): - # Test reading a non-existent file should raise an exception - with pytest.raises(Exception): - read_data("non_existent_file.csv") - - -def test_write_data_success(): - # Create a DataFrame to write - df = polars.DataFrame({"column1": ["value1"], "column2": ["value2"]}) - - # Use a temporary file to write the DataFrame - with tempfile.NamedTemporaryFile(mode='w', delete=False) as tmp: - tmp_path = tmp.name - - # Write the DataFrame and verify the file contents - try: - write_data(df, tmp_path) - - # Read back the file to verify contents - with open(tmp_path, 'r') as f: - content = f.read() - assert "column1,column2" in content - assert "value1,value2" in content - finally: - # Clean up the temporary file - os.remove(tmp_path) - - -def test_write_data_failure(monkeypatch): - # Simulate an error by patching the `write_csv` method to raise an exception - with monkeypatch.context() as m: - m.setattr(polars.DataFrame, "write_csv", - lambda self, file_path: (_ for _ in ()).throw(Exception("Mock write failure"))) - with pytest.raises(Exception) as exc_info: - df = polars.DataFrame({"column1": ["value1"], "column2": ["value2"]}) - write_data(df, "path/to/non_writable_directory/file.csv") - assert "Mock write failure" in str(exc_info.value) - -@patch('agency_identifier.identifier.write_data') -@patch('agency_identifier.identifier.process_data') -@patch('agency_identifier.identifier.read_data') -def test_process_and_write_data_success(mock_read_data, mock_process_data, mock_write_data): - # Setup mock return values - mock_read_data.return_value = polars.DataFrame({"url": ["http://example.com"]}) - processed_df = polars.DataFrame({"url": ["http://example.com"], "processed": [True]}) - mock_process_data.return_value = processed_df - - # Call the function with mocked input and output file paths - process_and_write_data("input_file.csv", "output_file.csv") - - # Verify that read_data and write_data were called correctly - mock_read_data.assert_called_once_with("input_file.csv") - mock_process_data.assert_called_once_with(mock_read_data.return_value) - mock_write_data.assert_called_once_with(processed_df, "output_file.csv") - -@pytest.mark.parametrize("side_effect,expected_exception", [ - (FileNotFoundError, FileNotFoundError), - (PermissionError, PermissionError), -]) -@patch('agency_identifier.identifier.write_data') -@patch('agency_identifier.identifier.process_data') -@patch('agency_identifier.identifier.read_data') -def test_process_and_write_data_failure(mock_read_data, mock_process_data, mock_write_data, side_effect, expected_exception): - mock_read_data.side_effect = side_effect - - with pytest.raises(expected_exception): - process_and_write_data("input_file.csv", "output_file.csv") \ No newline at end of file diff --git a/tests/test_automated/integration/api/conftest.py b/tests/test_automated/integration/api/conftest.py index ae34b28e..1dc05b44 100644 --- a/tests/test_automated/integration/api/conftest.py +++ b/tests/test_automated/integration/api/conftest.py @@ -21,7 +21,6 @@ class APITestHelper: async_core: AsyncCore db_data_creator: DBDataCreator mock_huggingface_interface: MagicMock - mock_label_studio_interface: MagicMock def adb_client(self): return self.db_data_creator.adb_client @@ -71,6 +70,5 @@ async def api_test_helper(client: TestClient, db_data_creator, monkeypatch) -> A async_core=client.app.state.async_core, db_data_creator=db_data_creator, mock_huggingface_interface=MagicMock(), - mock_label_studio_interface=MagicMock() ) await client.app.state.async_core.collector_manager.logger.clear_log_queue() diff --git a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py index 8fb9f4a5..cd9556cb 100644 --- a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py +++ b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py @@ -5,7 +5,7 @@ import pytest from aiohttp import ClientSession -from agency_identifier.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponseType, AgencyLookupResponse +from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponseType, AgencyLookupResponse from collector_db.models import Agency, AutomatedUrlAgencySuggestion from collector_manager.enums import CollectorType from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome From c239567f3905b270dcb7d771d42acc9284653348 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 17 Apr 2025 16:44:02 -0400 Subject: [PATCH 118/244] fix(build): remove nonexistent directory from dockerfile --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index dfcb1392..6718a121 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,6 @@ RUN playwright install chromium RUN playwright install-deps chromium # Copy project files -COPY agency_identifier ./agency_identifier COPY api ./api COPY collector_db ./collector_db COPY collector_manager ./collector_manager From 333baf58e42da3861b719b63d668450f366ca970 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 17 Apr 2025 16:57:37 -0400 Subject: [PATCH 119/244] docs(api): Change `/docs` to `/api` for API display Additionally, add redirect at `/docs` endpoint to redirect user to `/api` route. --- api/main.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/api/main.py b/api/main.py index 40970e4f..c993b941 100644 --- a/api/main.py +++ b/api/main.py @@ -3,6 +3,7 @@ import aiohttp import uvicorn from fastapi import FastAPI +from starlette.responses import RedirectResponse from api.routes.annotate import annotate_router from api.routes.batch import batch_router @@ -110,10 +111,15 @@ async def setup_database(db_client): app = FastAPI( title="Source Collector API", description="API for collecting data sources", + docs_url='/api', version="0.1.0", lifespan=lifespan ) +@app.get("/docs", include_in_schema=False) +async def redirect_docs(): + return RedirectResponse(url="/api") + routers = [ root_router, From 1830b16a05d0da8d99ee7c91d8c8a27f3ba9e435 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 18 Apr 2025 07:55:52 -0400 Subject: [PATCH 120/244] refactor(app): consolidate environment variable usage Consolidate environment variable usage through a centralized class, to enable easy mocking and tracking of environment variables. --- source_collectors/auto_googler/AutoGooglerCollector.py | 9 +++++---- .../integration/source_collectors/__init__.py | 0 .../source_collectors/test_example_collector.py | 0 3 files changed, 5 insertions(+), 4 deletions(-) delete mode 100644 tests/test_automated/integration/source_collectors/__init__.py delete mode 100644 tests/test_automated/integration/source_collectors/test_example_collector.py diff --git a/source_collectors/auto_googler/AutoGooglerCollector.py b/source_collectors/auto_googler/AutoGooglerCollector.py index 1748d911..01387d0b 100644 --- a/source_collectors/auto_googler/AutoGooglerCollector.py +++ b/source_collectors/auto_googler/AutoGooglerCollector.py @@ -1,13 +1,13 @@ -import asyncio from collector_manager.AsyncCollectorBase import AsyncCollectorBase from collector_manager.enums import CollectorType +from core.EnvVarManager import EnvVarManager from core.preprocessors.AutoGooglerPreprocessor import AutoGooglerPreprocessor from source_collectors.auto_googler.AutoGoogler import AutoGoogler from source_collectors.auto_googler.DTOs import AutoGooglerInputDTO, AutoGooglerInnerOutputDTO from source_collectors.auto_googler.GoogleSearcher import GoogleSearcher from source_collectors.auto_googler.SearchConfig import SearchConfig -from util.helper_functions import get_from_env, base_model_list_dump +from util.helper_functions import base_model_list_dump class AutoGooglerCollector(AsyncCollectorBase): @@ -16,14 +16,15 @@ class AutoGooglerCollector(AsyncCollectorBase): async def run_to_completion(self) -> AutoGoogler: dto: AutoGooglerInputDTO = self.dto + env_var_manager = EnvVarManager.get() auto_googler = AutoGoogler( search_config=SearchConfig( urls_per_result=dto.urls_per_result, queries=dto.queries, ), google_searcher=GoogleSearcher( - api_key=get_from_env("GOOGLE_API_KEY"), - cse_id=get_from_env("GOOGLE_CSE_ID"), + api_key=env_var_manager.google_api_key, + cse_id=env_var_manager.google_cse_id, ) ) async for log in auto_googler.run(): diff --git a/tests/test_automated/integration/source_collectors/__init__.py b/tests/test_automated/integration/source_collectors/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/test_automated/integration/source_collectors/test_example_collector.py b/tests/test_automated/integration/source_collectors/test_example_collector.py deleted file mode 100644 index e69de29b..00000000 From 06406bdaded60121a9b0df113f515f0a6fae2c96 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 18 Apr 2025 10:34:53 -0400 Subject: [PATCH 121/244] refactor(app): refactor to reduce memory strain from huggingface task --- .../URLRelevanceHuggingfaceTaskOperator.py | 2 +- hugging_face/HuggingFaceInterface.py | 48 +++++++++---------- hugging_face/relevancy_worker.py | 15 ++++++ .../test_hugging_face_interface.py | 8 ++-- 4 files changed, 45 insertions(+), 28 deletions(-) create mode 100644 hugging_face/relevancy_worker.py diff --git a/core/classes/task_operators/URLRelevanceHuggingfaceTaskOperator.py b/core/classes/task_operators/URLRelevanceHuggingfaceTaskOperator.py index 4871a9f0..49aa7aa0 100644 --- a/core/classes/task_operators/URLRelevanceHuggingfaceTaskOperator.py +++ b/core/classes/task_operators/URLRelevanceHuggingfaceTaskOperator.py @@ -46,7 +46,7 @@ async def put_results_into_database(self, tdos): async def add_huggingface_relevancy(self, tdos: list[URLRelevanceHuggingfaceTDO]): urls_with_html = [tdo.url_with_html for tdo in tdos] - results = self.huggingface_interface.get_url_relevancy(urls_with_html) + results = await self.huggingface_interface.get_url_relevancy_async(urls_with_html) for tdo, result in zip(tdos, results): tdo.relevant = result diff --git a/hugging_face/HuggingFaceInterface.py b/hugging_face/HuggingFaceInterface.py index 87d88caf..9ad11d0b 100644 --- a/hugging_face/HuggingFaceInterface.py +++ b/hugging_face/HuggingFaceInterface.py @@ -1,34 +1,34 @@ -from transformers import pipeline +import asyncio +import json +import sys +from typing import List from collector_db.DTOs.URLWithHTML import URLWithHTML -import gc class HuggingFaceInterface: @staticmethod - def load_relevancy_model() -> pipeline: - return pipeline("text-classification", model="PDAP/url-relevance") - - def get_url_relevancy( - self, - urls_with_html: list[URLWithHTML], - threshold: float = 0.5 - ) -> list[bool]: - urls = [url_with_html.url for url_with_html in urls_with_html] - relevance_pipe = self.load_relevancy_model() - results: list[dict] = relevance_pipe(urls) - - bool_results = [] - for result in results: - score = result["score"] - if score >= threshold: - bool_results.append(True) - else: - bool_results.append(False) - del relevance_pipe - gc.collect() - return bool_results + async def get_url_relevancy_async(urls_with_html: List[URLWithHTML]) -> List[bool]: + urls = [u.url for u in urls_with_html] + input_data = json.dumps(urls) + proc = await asyncio.create_subprocess_exec( + sys.executable, "hugging_face/relevancy_worker.py", + stdin=asyncio.subprocess.PIPE, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + stdout, stderr = await proc.communicate(input=input_data.encode("utf-8")) + raw_output = stdout.decode("utf-8").strip() + + # Try to extract the actual JSON line + for line in raw_output.splitlines(): + try: + return json.loads(line) + except json.JSONDecodeError: + continue + + raise RuntimeError(f"Could not parse JSON from subprocess: {raw_output}") diff --git a/hugging_face/relevancy_worker.py b/hugging_face/relevancy_worker.py new file mode 100644 index 00000000..5d07d10f --- /dev/null +++ b/hugging_face/relevancy_worker.py @@ -0,0 +1,15 @@ +import sys +import json +from transformers import pipeline + +def main(): + urls = json.loads(sys.stdin.read()) + + pipe = pipeline("text-classification", model="PDAP/url-relevance") + results = pipe(urls) + bools = [r["score"] >= 0.5 for r in results] + + print(json.dumps(bools)) + +if __name__ == "__main__": + main() diff --git a/tests/manual/huggingface/test_hugging_face_interface.py b/tests/manual/huggingface/test_hugging_face_interface.py index b1b86350..08ce8ccd 100644 --- a/tests/manual/huggingface/test_hugging_face_interface.py +++ b/tests/manual/huggingface/test_hugging_face_interface.py @@ -1,13 +1,15 @@ +import pytest + from collector_db.DTOs.URLWithHTML import URLWithHTML from hugging_face.HuggingFaceInterface import HuggingFaceInterface - -def test_get_url_relevancy(): +@pytest.mark.asyncio +async def test_get_url_relevancy(): hfi = HuggingFaceInterface() def package_url(url: str) -> URLWithHTML: return URLWithHTML(url=url, url_id=1, html_infos=[]) - result = hfi.get_url_relevancy([ + result = await hfi.get_url_relevancy_async([ package_url("https://coloradosprings.gov/police-department/article/news/i-25-traffic-safety-deployment-after-stop"), package_url("https://example.com"), package_url("https://police.com") From 0c902809910408c7835e4d602668bbade7331b41 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 18 Apr 2025 10:41:38 -0400 Subject: [PATCH 122/244] fix(tests): fix broken test --- .../tasks/test_url_relevancy_huggingface_task.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py b/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py index abe15965..95fb5fc7 100644 --- a/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py +++ b/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py @@ -21,7 +21,7 @@ def num_to_bool(num: int) -> bool: else: return False - def mock_get_url_relevancy( + async def mock_get_url_relevancy( urls_with_html: list[URLWithHTML], threshold: float = 0.8 ) -> list[bool]: @@ -33,7 +33,7 @@ def mock_get_url_relevancy( return results mock_hf_interface = MagicMock(spec=HuggingFaceInterface) - mock_hf_interface.get_url_relevancy = mock_get_url_relevancy + mock_hf_interface.get_url_relevancy_async = mock_get_url_relevancy task_operator = URLRelevanceHuggingfaceTaskOperator( adb_client=AsyncDatabaseClient(), @@ -50,7 +50,7 @@ def mock_get_url_relevancy( await db_data_creator.html_data(url_ids) run_info: TaskOperatorRunInfo = await task_operator.run_task(1) - assert run_info.outcome == TaskOperatorOutcome.SUCCESS + assert run_info.outcome == TaskOperatorOutcome.SUCCESS, run_info.message results = await db_data_creator.adb_client.get_all(AutoRelevantSuggestion) From 36d8b5d815645e2e9b667ca504e50f0af670afa4 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 18 Apr 2025 13:57:55 -0400 Subject: [PATCH 123/244] refactor(tests): reduce time required to run time-bound tests implement techniques to simulate extended periods of time, instead of simply running things for those periods of time. --- collector_manager/ExampleCollector.py | 9 ++++-- tests/helpers/AwaitableBarrier.py | 13 ++++++++ tests/helpers/patch_functions.py | 10 +++++++ .../integration/api/test_duplicates.py | 5 +--- .../integration/api/test_example_collector.py | 25 +++++++++++----- .../core/test_example_collector_lifecycle.py | 30 ++++++++++++++----- .../unit/core/test_core_logger.py | 4 +-- 7 files changed, 73 insertions(+), 23 deletions(-) create mode 100644 tests/helpers/AwaitableBarrier.py create mode 100644 tests/helpers/patch_functions.py diff --git a/collector_manager/ExampleCollector.py b/collector_manager/ExampleCollector.py index 9f451732..7bc8a583 100644 --- a/collector_manager/ExampleCollector.py +++ b/collector_manager/ExampleCollector.py @@ -21,9 +21,14 @@ async def run_implementation(self) -> None: sleep_time = dto.sleep_time for i in range(sleep_time): # Simulate a task await self.log(f"Step {i + 1}/{sleep_time}") - await asyncio.sleep(1) # Simulate work + await self.sleep() self.data = ExampleOutputDTO( message=f"Data collected by {self.batch_id}", urls=["https://example.com", "https://example.com/2"], parameters=self.dto.model_dump(), - ) \ No newline at end of file + ) + + @staticmethod + async def sleep(): + # Simulate work + await asyncio.sleep(1) \ No newline at end of file diff --git a/tests/helpers/AwaitableBarrier.py b/tests/helpers/AwaitableBarrier.py new file mode 100644 index 00000000..8bf65a11 --- /dev/null +++ b/tests/helpers/AwaitableBarrier.py @@ -0,0 +1,13 @@ +import asyncio + + +class AwaitableBarrier: + def __init__(self): + self._event = asyncio.Event() + + async def __call__(self, *args, **kwargs): + await self._event.wait() + + def release(self): + self._event.set() + diff --git a/tests/helpers/patch_functions.py b/tests/helpers/patch_functions.py new file mode 100644 index 00000000..bb805d29 --- /dev/null +++ b/tests/helpers/patch_functions.py @@ -0,0 +1,10 @@ +from tests.helpers.AwaitableBarrier import AwaitableBarrier + + +async def block_sleep(monkeypatch) -> AwaitableBarrier: + barrier = AwaitableBarrier() + monkeypatch.setattr( + "collector_manager.ExampleCollector.ExampleCollector.sleep", + barrier + ) + return barrier diff --git a/tests/test_automated/integration/api/test_duplicates.py b/tests/test_automated/integration/api/test_duplicates.py index a5c77b29..babffeba 100644 --- a/tests/test_automated/integration/api/test_duplicates.py +++ b/tests/test_automated/integration/api/test_duplicates.py @@ -12,7 +12,7 @@ def test_duplicates(api_test_helper): disable_task_trigger(ath) dto = ExampleInputDTO( - sleep_time=1 + sleep_time=0 ) batch_id_1 = ath.request_validator.example_collector( @@ -21,15 +21,12 @@ def test_duplicates(api_test_helper): assert batch_id_1 is not None - time.sleep(1) - batch_id_2 = ath.request_validator.example_collector( dto=dto )["batch_id"] assert batch_id_2 is not None - time.sleep(1.5) bi_1: BatchInfo = ath.request_validator.get_batch_info(batch_id_1) bi_2: BatchInfo = ath.request_validator.get_batch_info(batch_id_2) diff --git a/tests/test_automated/integration/api/test_example_collector.py b/tests/test_automated/integration/api/test_example_collector.py index b13f7e31..d7ec88fd 100644 --- a/tests/test_automated/integration/api/test_example_collector.py +++ b/tests/test_automated/integration/api/test_example_collector.py @@ -1,6 +1,5 @@ import asyncio -import time -from unittest.mock import MagicMock, AsyncMock +from unittest.mock import AsyncMock import pytest @@ -14,24 +13,29 @@ from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.enums import BatchStatus +from tests.helpers.patch_functions import block_sleep from tests.test_automated.integration.api.conftest import disable_task_trigger @pytest.mark.asyncio -async def test_example_collector(api_test_helper): +async def test_example_collector(api_test_helper, monkeypatch): ath = api_test_helper + barrier = await block_sleep(monkeypatch) + # Temporarily disable task trigger disable_task_trigger(ath) + logger = AsyncCoreLogger(adb_client=AsyncDatabaseClient(), flush_interval=1) await logger.__aenter__() ath.async_core.collector_manager.logger = logger dto = ExampleInputDTO( - sleep_time=1 - ) + sleep_time=1 + ) + # Request Example Collector data = ath.request_validator.example_collector( dto=dto ) @@ -39,10 +43,14 @@ async def test_example_collector(api_test_helper): assert batch_id is not None assert data["message"] == "Started example collector." + # Yield control so coroutine runs up to the barrier + await asyncio.sleep(0) + + + # Check that batch currently shows as In Process bsr: GetBatchStatusResponse = ath.request_validator.get_batch_statuses( status=BatchStatus.IN_PROCESS ) - assert len(bsr.results) == 1 bsi: BatchStatusInfo = bsr.results[0] @@ -50,7 +58,8 @@ async def test_example_collector(api_test_helper): assert bsi.strategy == CollectorType.EXAMPLE.value assert bsi.status == BatchStatus.IN_PROCESS - await asyncio.sleep(2) + # Release the barrier to resume execution + barrier.release() csr: GetBatchStatusResponse = ath.request_validator.get_batch_statuses( collector_type=CollectorType.EXAMPLE, @@ -113,7 +122,7 @@ async def test_example_collector_error(api_test_helper, monkeypatch): assert batch_id is not None assert data["message"] == "Started example collector." - await asyncio.sleep(1) + await asyncio.sleep(0) bi: BatchInfo = ath.request_validator.get_batch_info(batch_id=batch_id) diff --git a/tests/test_automated/integration/core/test_example_collector_lifecycle.py b/tests/test_automated/integration/core/test_example_collector_lifecycle.py index a9c4900f..65ffc001 100644 --- a/tests/test_automated/integration/core/test_example_collector_lifecycle.py +++ b/tests/test_automated/integration/core/test_example_collector_lifecycle.py @@ -9,11 +9,14 @@ from core.DTOs.CollectorStartInfo import CollectorStartInfo from core.SourceCollectorCore import SourceCollectorCore from core.enums import BatchStatus +from tests.helpers.patch_functions import block_sleep + @pytest.mark.asyncio async def test_example_collector_lifecycle( test_core: SourceCollectorCore, - test_async_core: AsyncCore + test_async_core: AsyncCore, + monkeypatch ): """ Test the flow of an example collector, which generates fake urls @@ -22,6 +25,9 @@ async def test_example_collector_lifecycle( acore = test_async_core core = test_core db_client = core.db_client + + barrier = await block_sleep(monkeypatch) + dto = ExampleInputDTO( example_field="example_value", sleep_time=1 @@ -36,11 +42,13 @@ async def test_example_collector_lifecycle( batch_id = csi.batch_id + # Yield control so coroutine runs up to the barrier + await asyncio.sleep(0) + assert core.get_status(batch_id) == BatchStatus.IN_PROCESS - print("Sleeping for 1.5 seconds...") - await asyncio.sleep(1.5) + # Release the barrier to resume execution + barrier.release() await acore.collector_manager.logger.flush_all() - print("Done sleeping...") assert core.get_status(batch_id) == BatchStatus.READY_TO_LABEL batch_info: BatchInfo = db_client.get_batch_by_id(batch_id) @@ -48,7 +56,7 @@ async def test_example_collector_lifecycle( assert batch_info.status == BatchStatus.READY_TO_LABEL assert batch_info.total_url_count == 2 assert batch_info.parameters == dto.model_dump() - assert batch_info.compute_time > 1 + assert batch_info.compute_time > 0 url_infos = db_client.get_urls_by_batch(batch_id) assert len(url_infos) == 2 @@ -61,15 +69,19 @@ async def test_example_collector_lifecycle( @pytest.mark.asyncio async def test_example_collector_lifecycle_multiple_batches( test_core: SourceCollectorCore, - test_async_core: AsyncCore + test_async_core: AsyncCore, + monkeypatch ): """ Test the flow of an example collector, which generates fake urls and saves them to the database """ + barrier = await block_sleep(monkeypatch) acore = test_async_core core = test_core csis: list[CollectorStartInfo] = [] + + for i in range(3): dto = ExampleInputDTO( example_field="example_value", @@ -82,12 +94,16 @@ async def test_example_collector_lifecycle_multiple_batches( ) csis.append(csi) + await asyncio.sleep(0) for csi in csis: print("Batch ID:", csi.batch_id) assert core.get_status(csi.batch_id) == BatchStatus.IN_PROCESS - await asyncio.sleep(3) + barrier.release() + + await asyncio.sleep(0.15) for csi in csis: assert core.get_status(csi.batch_id) == BatchStatus.READY_TO_LABEL + diff --git a/tests/test_automated/unit/core/test_core_logger.py b/tests/test_automated/unit/core/test_core_logger.py index d91ce6cd..b0d52055 100644 --- a/tests/test_automated/unit/core/test_core_logger.py +++ b/tests/test_automated/unit/core/test_core_logger.py @@ -10,14 +10,14 @@ @pytest.mark.asyncio async def test_logger_flush(): mock_adb_client = AsyncMock() - async with AsyncCoreLogger(flush_interval=1, adb_client=mock_adb_client) as logger: + async with AsyncCoreLogger(flush_interval=0.01, adb_client=mock_adb_client) as logger: # Add logs await logger.log(LogInfo(log="Log 1", batch_id=1)) await logger.log(LogInfo(log="Log 2", batch_id=1)) # Wait for the flush interval - await asyncio.sleep(1.5) + await asyncio.sleep(0.02) # Verify logs were flushed mock_adb_client.insert_logs.assert_called_once() From f7a96064c0bc4c73ef2cbe9eee341cf28993cbf2 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 18 Apr 2025 14:03:23 -0400 Subject: [PATCH 124/244] refactor(tests): reduce time required to run time-bound tests implement techniques to simulate extended periods of time, instead of simply running things for those periods of time. --- tests/test_automated/integration/api/test_example_collector.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_automated/integration/api/test_example_collector.py b/tests/test_automated/integration/api/test_example_collector.py index d7ec88fd..92a42317 100644 --- a/tests/test_automated/integration/api/test_example_collector.py +++ b/tests/test_automated/integration/api/test_example_collector.py @@ -60,6 +60,7 @@ async def test_example_collector(api_test_helper, monkeypatch): # Release the barrier to resume execution barrier.release() + await asyncio.sleep(0) csr: GetBatchStatusResponse = ath.request_validator.get_batch_statuses( collector_type=CollectorType.EXAMPLE, From d2cfc83b4a76cd68531bb81629c2b1fa8a3e3a04 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 18 Apr 2025 14:04:46 -0400 Subject: [PATCH 125/244] refactor(tests): reduce time required to run time-bound tests implement techniques to simulate extended periods of time, instead of simply running things for those periods of time. --- tests/test_automated/integration/api/test_duplicates.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/test_automated/integration/api/test_duplicates.py b/tests/test_automated/integration/api/test_duplicates.py index babffeba..e4c8af24 100644 --- a/tests/test_automated/integration/api/test_duplicates.py +++ b/tests/test_automated/integration/api/test_duplicates.py @@ -1,11 +1,15 @@ +import asyncio import time +import pytest + from collector_db.DTOs.BatchInfo import BatchInfo from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from tests.test_automated.integration.api.conftest import disable_task_trigger -def test_duplicates(api_test_helper): +@pytest.mark.asyncio +async def test_duplicates(api_test_helper): ath = api_test_helper # Temporarily disable task trigger @@ -27,6 +31,8 @@ def test_duplicates(api_test_helper): assert batch_id_2 is not None + await asyncio.sleep(0.1) + bi_1: BatchInfo = ath.request_validator.get_batch_info(batch_id_1) bi_2: BatchInfo = ath.request_validator.get_batch_info(batch_id_2) From 569b46c3cb749e64438c4992a574fdea746a85a2 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 18 Apr 2025 14:07:42 -0400 Subject: [PATCH 126/244] refactor(tests): reduce time required to run time-bound tests implement techniques to simulate extended periods of time, instead of simply running things for those periods of time. --- tests/test_automated/integration/api/test_example_collector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_automated/integration/api/test_example_collector.py b/tests/test_automated/integration/api/test_example_collector.py index 92a42317..00361cd0 100644 --- a/tests/test_automated/integration/api/test_example_collector.py +++ b/tests/test_automated/integration/api/test_example_collector.py @@ -60,7 +60,7 @@ async def test_example_collector(api_test_helper, monkeypatch): # Release the barrier to resume execution barrier.release() - await asyncio.sleep(0) + await asyncio.sleep(0.1) csr: GetBatchStatusResponse = ath.request_validator.get_batch_statuses( collector_type=CollectorType.EXAMPLE, From 55fe581dce901058c2cc68cb1a1fb83b1c5ae3f7 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 18 Apr 2025 14:55:54 -0400 Subject: [PATCH 127/244] refactor(tests): reduce time required to run time-bound tests implement techniques to simulate extended periods of time, instead of simply running things for those periods of time. --- tests/test_automated/integration/api/test_example_collector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_automated/integration/api/test_example_collector.py b/tests/test_automated/integration/api/test_example_collector.py index 00361cd0..c001963a 100644 --- a/tests/test_automated/integration/api/test_example_collector.py +++ b/tests/test_automated/integration/api/test_example_collector.py @@ -60,7 +60,7 @@ async def test_example_collector(api_test_helper, monkeypatch): # Release the barrier to resume execution barrier.release() - await asyncio.sleep(0.1) + await asyncio.sleep(0.3) csr: GetBatchStatusResponse = ath.request_validator.get_batch_statuses( collector_type=CollectorType.EXAMPLE, From 9b58948ac71c94ea63066a0a3701fc377d22b8a5 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 18 Apr 2025 16:32:16 -0400 Subject: [PATCH 128/244] refactor(tests): reduce time required to run time-bound tests implement techniques to simulate extended periods of time, instead of simply running things for those periods of time. --- api/main.py | 1 + tests/test_automated/integration/api/conftest.py | 16 +++++++++++++++- .../integration/api/test_duplicates.py | 2 +- .../integration/api/test_example_collector.py | 6 +++--- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/api/main.py b/api/main.py index c993b941..6c5e2018 100644 --- a/api/main.py +++ b/api/main.py @@ -1,3 +1,4 @@ +import asyncio from contextlib import asynccontextmanager import aiohttp diff --git a/tests/test_automated/integration/api/conftest.py b/tests/test_automated/integration/api/conftest.py index 00ee7473..73f0c8ab 100644 --- a/tests/test_automated/integration/api/conftest.py +++ b/tests/test_automated/integration/api/conftest.py @@ -1,6 +1,7 @@ +import asyncio from dataclasses import dataclass from typing import Generator -from unittest.mock import MagicMock, AsyncMock, patch +from unittest.mock import MagicMock, AsyncMock import pytest import pytest_asyncio @@ -9,7 +10,9 @@ from api.main import app from core.AsyncCore import AsyncCore from api.routes.review import requires_final_review_permission +from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.SourceCollectorCore import SourceCollectorCore +from core.enums import BatchStatus from security_manager.SecurityManager import get_access_info, AccessInfo, Permissions, require_permission from tests.helpers.DBDataCreator import DBDataCreator from tests.test_automated.integration.api.helpers.RequestValidator import RequestValidator @@ -26,6 +29,17 @@ class APITestHelper: def adb_client(self): return self.db_data_creator.adb_client + async def wait_for_all_batches_to_complete(self): + for i in range(20): + data: GetBatchStatusResponse = self.request_validator.get_batch_statuses( + status=BatchStatus.IN_PROCESS + ) + if len(data.results) == 0: + return + print("Waiting...") + await asyncio.sleep(0.1) + raise ValueError("Batches did not complete in expected time") + MOCK_USER_ID = 1 def disable_task_trigger(ath: APITestHelper) -> None: diff --git a/tests/test_automated/integration/api/test_duplicates.py b/tests/test_automated/integration/api/test_duplicates.py index e4c8af24..6c6c42ce 100644 --- a/tests/test_automated/integration/api/test_duplicates.py +++ b/tests/test_automated/integration/api/test_duplicates.py @@ -31,7 +31,7 @@ async def test_duplicates(api_test_helper): assert batch_id_2 is not None - await asyncio.sleep(0.1) + await ath.wait_for_all_batches_to_complete() bi_1: BatchInfo = ath.request_validator.get_batch_info(batch_id_1) diff --git a/tests/test_automated/integration/api/test_example_collector.py b/tests/test_automated/integration/api/test_example_collector.py index c001963a..0b3cf30f 100644 --- a/tests/test_automated/integration/api/test_example_collector.py +++ b/tests/test_automated/integration/api/test_example_collector.py @@ -60,7 +60,8 @@ async def test_example_collector(api_test_helper, monkeypatch): # Release the barrier to resume execution barrier.release() - await asyncio.sleep(0.3) + + await ath.wait_for_all_batches_to_complete() csr: GetBatchStatusResponse = ath.request_validator.get_batch_statuses( collector_type=CollectorType.EXAMPLE, @@ -84,7 +85,6 @@ async def test_example_collector(api_test_helper, monkeypatch): # Flush early to ensure logs are written await logger.flush_all() - lr: GetBatchLogsResponse = ath.request_validator.get_batch_logs(batch_id=batch_id) assert len(lr.logs) > 0 @@ -123,7 +123,7 @@ async def test_example_collector_error(api_test_helper, monkeypatch): assert batch_id is not None assert data["message"] == "Started example collector." - await asyncio.sleep(0) + await ath.wait_for_all_batches_to_complete() bi: BatchInfo = ath.request_validator.get_batch_info(batch_id=batch_id) From 48f33e62a68daa3d66c44c5bf58848b7e0d66854 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 18 Apr 2025 18:15:41 -0400 Subject: [PATCH 129/244] feat(app): make delete logs job an asynchronous scheduled task Additionally, because now the Scheduled Task Manager is no longer in use, it has been removed and references to it removed. --- api/main.py | 1 - collector_db/AsyncDatabaseClient.py | 15 ++++++- collector_db/DatabaseClient.py | 9 ----- core/ScheduledTaskManager.py | 40 ++++--------------- core/SourceCollectorCore.py | 21 ---------- .../collector_db/test_db_client.py | 2 +- tests/test_automated/integration/conftest.py | 2 - 7 files changed, 23 insertions(+), 67 deletions(-) diff --git a/api/main.py b/api/main.py index 6c5e2018..ae74c914 100644 --- a/api/main.py +++ b/api/main.py @@ -96,7 +96,6 @@ async def lifespan(app: FastAPI): # Clean up resources, close connections, etc. await core_logger.shutdown() await async_core.shutdown() - source_collector_core.shutdown() await session.close() pass diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 9e1ab473..eb68735c 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -1,8 +1,9 @@ +from datetime import datetime, timedelta from functools import wraps from typing import Optional, Type, Any, List from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, or_, update, Delete, Insert, asc +from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, or_, update, Delete, Insert, asc, delete from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import selectinload, joinedload, QueryableAttribute, aliased @@ -1615,3 +1616,15 @@ async def get_logs_by_batch_id(self, session, batch_id: int) -> List[LogOutputIn logs = raw_results.scalars().all() return ([LogOutputInfo(**log.__dict__) for log in logs]) + @session_manager + async def delete_old_logs(self, session): + """ + Delete logs older than a day + """ + statement = delete(Log).where( + Log.created_at < datetime.now() - timedelta(days=1) + ) + await session.execute(statement) + + + diff --git a/collector_db/DatabaseClient.py b/collector_db/DatabaseClient.py index b8547f1d..3999dbc9 100644 --- a/collector_db/DatabaseClient.py +++ b/collector_db/DatabaseClient.py @@ -158,15 +158,6 @@ def get_batch_status(self, session, batch_id: int) -> BatchStatus: batch = session.query(Batch).filter_by(id=batch_id).first() return BatchStatus(batch.status) - @session_manager - def delete_old_logs(self, session): - """ - Delete logs older than a day - """ - session.query(Log).filter( - Log.created_at < datetime.now() - timedelta(days=1) - ).delete() - @session_manager def update_url(self, session, url_info: URLInfo): url = session.query(URL).filter_by(id=url_info.id).first() diff --git a/core/ScheduledTaskManager.py b/core/ScheduledTaskManager.py index 5b2ff0a7..0a407d9e 100644 --- a/core/ScheduledTaskManager.py +++ b/core/ScheduledTaskManager.py @@ -1,41 +1,9 @@ from datetime import datetime, timedelta from apscheduler.schedulers.asyncio import AsyncIOScheduler -from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.triggers.interval import IntervalTrigger - -from collector_db.DatabaseClient import DatabaseClient from core.AsyncCore import AsyncCore - -class ScheduledTaskManager: - - def __init__(self, db_client: DatabaseClient): - # Dependencies - self.db_client = db_client - - # Main objects - self.scheduler = BackgroundScheduler() - self.scheduler.start() - self.add_scheduled_tasks() - - # Jobs - self.delete_old_logs_job = None - - - def add_scheduled_tasks(self): - self.delete_old_logs_job = self.scheduler.add_job( - self.db_client.delete_old_logs, - trigger=IntervalTrigger( - days=1, - start_date=datetime.now() + timedelta(minutes=10) - ) - ) - - def shutdown(self): - if self.scheduler.running: - self.scheduler.shutdown() - class AsyncScheduledTaskManager: def __init__(self, async_core: AsyncCore): @@ -49,6 +17,7 @@ def __init__(self, async_core: AsyncCore): # Jobs self.run_cycles_job = None + self.delete_logs_job = None def add_scheduled_tasks(self): self.run_cycles_job = self.scheduler.add_job( @@ -59,6 +28,13 @@ def add_scheduled_tasks(self): ), misfire_grace_time=60 ) + self.delete_logs_job = self.scheduler.add_job( + self.async_core.adb_client.delete_old_logs, + trigger=IntervalTrigger( + days=1, + start_date=datetime.now() + timedelta(minutes=10) + ) + ) def shutdown(self): if self.scheduler.running: diff --git a/core/SourceCollectorCore.py b/core/SourceCollectorCore.py index 6f05a3c4..a4699bf6 100644 --- a/core/SourceCollectorCore.py +++ b/core/SourceCollectorCore.py @@ -2,7 +2,6 @@ from collector_db.DatabaseClient import DatabaseClient -from core.ScheduledTaskManager import ScheduledTaskManager from core.enums import BatchStatus @@ -10,30 +9,10 @@ class SourceCollectorCore: def __init__( self, db_client: Optional[DatabaseClient] = None, - dev_mode: bool = False ): if db_client is None: db_client = DatabaseClient() self.db_client = db_client - if not dev_mode: - self.scheduled_task_manager = ScheduledTaskManager(db_client=db_client) - else: - self.scheduled_task_manager = None - def get_status(self, batch_id: int) -> BatchStatus: return self.db_client.get_batch_status(batch_id) - - - def shutdown(self): - if self.scheduled_task_manager is not None: - self.scheduled_task_manager.shutdown() - - - - - -""" -TODO: Add logic for batch processing - -""" \ No newline at end of file diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 5560577e..93edb3ed 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -94,7 +94,7 @@ async def test_delete_old_logs(db_data_creator: DBDataCreator): db_client.insert_logs(log_infos=log_infos) logs = await adb_client.get_logs_by_batch_id(batch_id=batch_id) assert len(logs) == 3 - db_client.delete_old_logs() + await adb_client.delete_old_logs() logs = await adb_client.get_logs_by_batch_id(batch_id=batch_id) assert len(logs) == 0 diff --git a/tests/test_automated/integration/conftest.py b/tests/test_automated/integration/conftest.py index a0180800..70c79c22 100644 --- a/tests/test_automated/integration/conftest.py +++ b/tests/test_automated/integration/conftest.py @@ -13,10 +13,8 @@ def test_core(db_client_test): core = SourceCollectorCore( db_client=db_client_test, - dev_mode=True ) yield core - core.shutdown() @pytest.fixture From 22aa07e0b7c74bd95fd4945b1a57e8f2dc6e59cf Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 21 Apr 2025 13:15:36 -0400 Subject: [PATCH 130/244] feat(app): Create `/annotation/all` endpoints Create endpoints for receiving and submitting all annotations for a URL at once. --- api/routes/annotate.py | 62 ++++-- collector_db/AsyncDatabaseClient.py | 198 +++++++++++++----- collector_db/StatementComposer.py | 26 ++- core/AsyncCore.py | 22 ++ core/DTOs/AllAnnotationPostInfo.py | 35 ++++ ...GetNextRecordTypeAnnotationResponseInfo.py | 2 +- .../GetNextURLForAllAnnotationResponse.py | 24 +++ core/DTOs/GetNextURLForAnnotationResponse.py | 9 - core/exceptions.py | 10 + .../api/helpers/RequestValidator.py | 37 +++- .../integration/api/test_annotate.py | 138 +++++++++++- tests/test_automated/unit/dto/__init__.py | 0 .../unit/dto/test_all_annotation_post_info.py | 37 ++++ 13 files changed, 513 insertions(+), 87 deletions(-) create mode 100644 core/DTOs/AllAnnotationPostInfo.py create mode 100644 core/DTOs/GetNextURLForAllAnnotationResponse.py delete mode 100644 core/DTOs/GetNextURLForAnnotationResponse.py create mode 100644 tests/test_automated/unit/dto/__init__.py create mode 100644 tests/test_automated/unit/dto/test_all_annotation_post_info.py diff --git a/api/routes/annotate.py b/api/routes/annotate.py index 84ba00e4..95512a0b 100644 --- a/api/routes/annotate.py +++ b/api/routes/annotate.py @@ -4,10 +4,12 @@ from api.dependencies import get_async_core from core.AsyncCore import AsyncCore +from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo +from core.DTOs.GetNextURLForAllAnnotationResponse import GetNextURLForAllAnnotationResponse from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo from security_manager.SecurityManager import get_access_info, AccessInfo @@ -18,6 +20,11 @@ responses={404: {"description": "Not found"}}, ) +batch_query = Query( + description="The batch id of the next URL to get. " + "If not specified, defaults to first qualifying URL", + default=None +) @annotate_router.get("/relevance") async def get_next_url_for_relevance_annotation( @@ -40,10 +47,7 @@ async def annotate_url_for_relevance_and_get_next_url( url_id: int = Path(description="The URL id to annotate"), async_core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), - batch_id: Optional[int] = Query( - description="The batch id of the next URL to get. " - "If not specified, defaults to first qualifying URL", - default=None), + batch_id: Optional[int] = batch_query ) -> GetNextRelevanceAnnotationResponseOuterInfo: """ Post URL annotation and get next URL to annotate @@ -62,10 +66,7 @@ async def annotate_url_for_relevance_and_get_next_url( async def get_next_url_for_record_type_annotation( access_info: AccessInfo = Depends(get_access_info), async_core: AsyncCore = Depends(get_async_core), - batch_id: Optional[int] = Query( - description="The batch id of the next URL to get. " - "If not specified, defaults to first qualifying URL", - default=None), + batch_id: Optional[int] = batch_query ) -> GetNextRecordTypeAnnotationResponseOuterInfo: return await async_core.get_next_url_for_record_type_annotation( user_id=access_info.user_id, @@ -78,10 +79,7 @@ async def annotate_url_for_record_type_and_get_next_url( url_id: int = Path(description="The URL id to annotate"), async_core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), - batch_id: Optional[int] = Query( - description="The batch id of the next URL to get. " - "If not specified, defaults to first qualifying URL", - default=None), + batch_id: Optional[int] = batch_query ) -> GetNextRecordTypeAnnotationResponseOuterInfo: """ Post URL annotation and get next URL to annotate @@ -100,10 +98,7 @@ async def annotate_url_for_record_type_and_get_next_url( async def get_next_url_for_agency_annotation( access_info: AccessInfo = Depends(get_access_info), async_core: AsyncCore = Depends(get_async_core), - batch_id: Optional[int] = Query( - description="The batch id of the next URL to get. " - "If not specified, defaults to first qualifying URL", - default=None), + batch_id: Optional[int] = batch_query ) -> GetNextURLForAgencyAnnotationResponse: return await async_core.get_next_url_agency_for_annotation( user_id=access_info.user_id, @@ -116,10 +111,7 @@ async def annotate_url_for_agency_and_get_next_url( agency_annotation_post_info: URLAgencyAnnotationPostInfo, async_core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), - batch_id: Optional[int] = Query( - description="The batch id of the next URL to get. " - "If not specified, defaults to first qualifying URL", - default=None), + batch_id: Optional[int] = batch_query ) -> GetNextURLForAgencyAnnotationResponse: """ Post URL annotation and get next URL to annotate @@ -133,3 +125,33 @@ async def annotate_url_for_agency_and_get_next_url( user_id=access_info.user_id, batch_id=batch_id ) + +@annotate_router.get("/all") +async def get_next_url_for_all_annotations( + access_info: AccessInfo = Depends(get_access_info), + async_core: AsyncCore = Depends(get_async_core), + batch_id: Optional[int] = batch_query +) -> GetNextURLForAllAnnotationResponse: + return await async_core.get_next_url_for_all_annotations( + batch_id=batch_id + ) + +@annotate_router.post("/all/{url_id}") +async def annotate_url_for_all_annotations_and_get_next_url( + url_id: int, + all_annotation_post_info: AllAnnotationPostInfo, + async_core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info), + batch_id: Optional[int] = batch_query +) -> GetNextURLForAllAnnotationResponse: + """ + Post URL annotation and get next URL to annotate + """ + await async_core.submit_url_for_all_annotations( + user_id=access_info.user_id, + url_id=url_id, + post_info=all_annotation_post_info + ) + return await async_core.get_next_url_for_all_annotations( + batch_id=batch_id + ) \ No newline at end of file diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index eb68735c..46cd89db 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -3,11 +3,10 @@ from typing import Optional, Type, Any, List from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, or_, update, Delete, Insert, asc, delete +from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, update, asc, delete from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import selectinload, joinedload, QueryableAttribute, aliased -from sqlalchemy.sql.functions import coalesce from starlette import status from collector_db.ConfigManager import ConfigManager @@ -23,18 +22,20 @@ from collector_db.DTOs.URLMapping import URLMapping from collector_db.StatementComposer import StatementComposer from collector_db.constants import PLACEHOLDER_AGENCY_NAME -from collector_db.enums import URLMetadataAttributeType, TaskType -from collector_db.helper_functions import get_postgres_connection_string +from collector_db.enums import TaskType from collector_db.models import URL, URLErrorInfo, URLHTMLContent, Base, \ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Duplicate, Log from collector_manager.enums import URLStatus, CollectorType +from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ GetNextURLForAgencyAgencyInfo, GetNextURLForAgencyAnnotationInnerResponse +from core.DTOs.GetNextURLForAllAnnotationResponse import GetNextURLForAllAnnotationResponse, \ + GetNextURLForAllAnnotationInnerResponse from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, FinalReviewAnnotationInfo, \ FinalReviewOptionalMetadata from core.DTOs.GetTasksResponse import GetTasksResponse, GetTasksResponseTaskInfo @@ -129,7 +130,6 @@ async def get_next_url_for_user_annotation( session: AsyncSession, user_suggestion_model_to_exclude: UserSuggestionModel, auto_suggestion_relationship: QueryableAttribute, - user_id: int, batch_id: Optional[int], check_if_annotated_not_relevant: bool = False ) -> URL: @@ -140,14 +140,7 @@ async def get_next_url_for_user_annotation( .where(URL.outcome == URLStatus.PENDING.value) # URL must not have user suggestion .where( - not_( - exists( - select(user_suggestion_model_to_exclude) - .where( - user_suggestion_model_to_exclude.url_id == URL.id, - ) - ) - ) + StatementComposer.user_suggestion_not_exists(user_suggestion_model_to_exclude) ) ) @@ -213,7 +206,6 @@ async def get_next_url_for_relevance_annotation( session, user_suggestion_model_to_exclude=UserRelevantSuggestion, auto_suggestion_relationship=URL.auto_relevant_suggestion, - user_id=user_id, batch_id=batch_id ) if url is None: @@ -254,7 +246,6 @@ async def get_next_url_for_record_type_annotation( session, user_suggestion_model_to_exclude=UserRecordTypeSuggestion, auto_suggestion_relationship=URL.auto_record_type_suggestion, - user_id=user_id, batch_id=batch_id, check_if_annotated_not_relevant=True ) @@ -823,9 +814,7 @@ async def get_next_url_agency_for_annotation( select(URL.id, URL.url) # Must not have confirmed agencies .where( - and_( - URL.outcome == URLStatus.PENDING.value - ) + URL.outcome == URLStatus.PENDING.value ) ) @@ -838,9 +827,7 @@ async def get_next_url_agency_for_annotation( .where( ~exists( select(UserUrlAgencySuggestion). - where( - UserUrlAgencySuggestion.url_id == URL.id - ). + where(UserUrlAgencySuggestion.url_id == URL.id). correlate(URL) ) ) @@ -885,37 +872,8 @@ async def get_next_url_agency_for_annotation( result = results[0] url_id = result[0] url = result[1] - # Get relevant autosuggestions and agency info, if an associated agency exists - statement = ( - select( - AutomatedUrlAgencySuggestion.agency_id, - AutomatedUrlAgencySuggestion.is_unknown, - Agency.name, - Agency.state, - Agency.county, - Agency.locality - ) - .join(Agency, isouter=True) - .where(AutomatedUrlAgencySuggestion.url_id == url_id) - ) - raw_autosuggestions = await session.execute(statement) - autosuggestions = raw_autosuggestions.all() - agency_suggestions = [] - for autosuggestion in autosuggestions: - agency_id = autosuggestion[0] - is_unknown = autosuggestion[1] - name = autosuggestion[2] - state = autosuggestion[3] - county = autosuggestion[4] - locality = autosuggestion[5] - agency_suggestions.append(GetNextURLForAgencyAgencyInfo( - suggestion_type=SuggestionType.AUTO_SUGGESTION if not is_unknown else SuggestionType.UNKNOWN, - pdap_agency_id=agency_id, - agency_name=name, - state=state, - county=county, - locality=locality - )) + + agency_suggestions = await self.get_agency_suggestions(session, url_id=url_id) # Get HTML content info html_content_infos = await self.get_html_content_info(url_id) @@ -1626,5 +1584,141 @@ async def delete_old_logs(self, session): ) await session.execute(statement) + async def get_agency_suggestions(self, session, url_id: int) -> List[GetNextURLForAgencyAgencyInfo]: + # Get relevant autosuggestions and agency info, if an associated agency exists + + statement = ( + select( + AutomatedUrlAgencySuggestion.agency_id, + AutomatedUrlAgencySuggestion.is_unknown, + Agency.name, + Agency.state, + Agency.county, + Agency.locality + ) + .join(Agency, isouter=True) + .where(AutomatedUrlAgencySuggestion.url_id == url_id) + ) + raw_autosuggestions = await session.execute(statement) + autosuggestions = raw_autosuggestions.all() + agency_suggestions = [] + for autosuggestion in autosuggestions: + agency_id = autosuggestion[0] + is_unknown = autosuggestion[1] + name = autosuggestion[2] + state = autosuggestion[3] + county = autosuggestion[4] + locality = autosuggestion[5] + agency_suggestions.append(GetNextURLForAgencyAgencyInfo( + suggestion_type=SuggestionType.AUTO_SUGGESTION if not is_unknown else SuggestionType.UNKNOWN, + pdap_agency_id=agency_id, + agency_name=name, + state=state, + county=county, + locality=locality + )) + return agency_suggestions + + @session_manager + async def get_next_url_for_all_annotations(self, session, batch_id: Optional[int] = None) -> GetNextURLForAllAnnotationResponse: + query = ( + Select(URL) + .where( + and_( + URL.outcome == URLStatus.PENDING.value, + StatementComposer.user_suggestion_not_exists(UserUrlAgencySuggestion), + StatementComposer.user_suggestion_not_exists(UserRecordTypeSuggestion), + StatementComposer.user_suggestion_not_exists(UserRelevantSuggestion), + ) + ) + ) + if batch_id is not None: + query = query.where(URL.batch_id == batch_id) + + load_options = [ + URL.html_content, + URL.automated_agency_suggestions, + URL.auto_relevant_suggestion, + URL.auto_record_type_suggestion + ] + select_in_loads = [selectinload(load_option) for load_option in load_options] + + # Add load options + query = query.options( + *select_in_loads + ) + + query = query.order_by(URL.id.asc()).limit(1) + raw_results = await session.execute(query) + url = raw_results.scalars().one_or_none() + if url is None: + return GetNextURLForAllAnnotationResponse( + next_annotation=None + ) + + html_response_info = DTOConverter.html_content_list_to_html_response_info( + url.html_content + ) + + if url.auto_relevant_suggestion is not None: + auto_relevant = url.auto_relevant_suggestion.relevant + else: + auto_relevant = None + + if url.auto_record_type_suggestion is not None: + auto_record_type = url.auto_record_type_suggestion.record_type + else: + auto_record_type = None + + agency_suggestions = await self.get_agency_suggestions(session, url_id=url.id) + + return GetNextURLForAllAnnotationResponse( + next_annotation=GetNextURLForAllAnnotationInnerResponse( + url_id=url.id, + url=url.url, + html_info=html_response_info, + suggested_relevant=auto_relevant, + suggested_record_type=auto_record_type, + agency_suggestions=agency_suggestions + ) + ) + + @session_manager + async def add_all_annotations_to_url( + self, + session, + user_id: int, + url_id: int, + post_info: AllAnnotationPostInfo + ): + + # Add relevant annotation + relevant_suggestion = UserRelevantSuggestion( + url_id=url_id, + user_id=user_id, + relevant=post_info.is_relevant + ) + session.add(relevant_suggestion) + + # If not relevant, do nothing else + if not post_info.is_relevant: + return + + record_type_suggestion = UserRecordTypeSuggestion( + url_id=url_id, + user_id=user_id, + record_type=post_info.record_type.value + ) + session.add(record_type_suggestion) + + agency_suggestion = UserUrlAgencySuggestion( + url_id=url_id, + user_id=user_id, + agency_id=post_info.agency.suggested_agency, + is_new=post_info.agency.is_new + ) + session.add(agency_suggestion) + + diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index e25ba5d4..ca66f6ba 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -1,11 +1,11 @@ from typing import Any -from sqlalchemy import Select, select, exists, Table, func, Subquery, and_ +from sqlalchemy import Select, select, exists, Table, func, Subquery, and_, not_, ColumnElement from sqlalchemy.orm import aliased from collector_db.enums import URLMetadataAttributeType, ValidationStatus, TaskType from collector_db.models import URL, URLHTMLContent, AutomatedUrlAgencySuggestion, URLOptionalDataSourceMetadata, Batch, \ - ConfirmedURLAgency, LinkTaskURL, Task + ConfirmedURLAgency, LinkTaskURL, Task, UserUrlAgencySuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion from collector_manager.enums import URLStatus, CollectorType from core.enums import BatchStatus @@ -94,4 +94,24 @@ def pending_urls_missing_miscellaneous_metadata_query() -> Select: Batch ) - return query \ No newline at end of file + return query + + + @staticmethod + def user_suggestion_not_exists( + model_to_exclude: UserUrlAgencySuggestion or + UserRecordTypeSuggestion or + UserRelevantSuggestion + ) -> ColumnElement[bool]: + # + + subquery = not_( + exists( + select(model_to_exclude) + .where( + model_to_exclude.url_id == URL.id, + ) + ) + ) + + return subquery \ No newline at end of file diff --git a/core/AsyncCore.py b/core/AsyncCore.py index d436d3c9..92f097db 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -8,6 +8,7 @@ from collector_db.enums import TaskType from collector_manager.AsyncCollectorManager import AsyncCollectorManager from collector_manager.enums import CollectorType +from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo from core.DTOs.CollectorStartInfo import CollectorStartInfo from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse @@ -17,6 +18,7 @@ from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo +from core.DTOs.GetNextURLForAllAnnotationResponse import GetNextURLForAllAnnotationResponse from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo @@ -227,6 +229,26 @@ async def get_next_source_for_review( batch_id=batch_id ) + async def get_next_url_for_all_annotations( + self, + batch_id: Optional[int] + ) -> GetNextURLForAllAnnotationResponse: + return await self.adb_client.get_next_url_for_all_annotations( + batch_id=batch_id + ) + + async def submit_url_for_all_annotations( + self, + user_id: int, + url_id: int, + post_info: AllAnnotationPostInfo + ): + await self.adb_client.add_all_annotations_to_url( + user_id=user_id, + url_id=url_id, + post_info=post_info + ) + async def approve_url( self, approval_info: FinalReviewApprovalInfo, diff --git a/core/DTOs/AllAnnotationPostInfo.py b/core/DTOs/AllAnnotationPostInfo.py new file mode 100644 index 00000000..a462b40b --- /dev/null +++ b/core/DTOs/AllAnnotationPostInfo.py @@ -0,0 +1,35 @@ +from http import HTTPStatus +from typing import Optional + +from fastapi import HTTPException +from pydantic import BaseModel, model_validator + +from core.DTOs.GetNextURLForAgencyAnnotationResponse import URLAgencyAnnotationPostInfo +from core.enums import RecordType +from core.exceptions import FailedValidationException + + +class AllAnnotationPostInfo(BaseModel): + is_relevant: bool + record_type: Optional[RecordType] = None + agency: Optional[URLAgencyAnnotationPostInfo] = None + + @model_validator(mode="before") + def allow_record_type_and_agency_only_if_relevant(cls, values): + is_relevant = values.get("is_relevant") + record_type = values.get("record_type") + agency = values.get("agency") + + if not is_relevant: + if record_type is not None: + raise FailedValidationException("record_type must be None if is_relevant is False") + + if agency is not None: + raise FailedValidationException("agency must be None if is_relevant is False") + return values + # Similarly, if relevant, record_type and agency must be provided + if record_type is None: + raise FailedValidationException("record_type must be provided if is_relevant is True") + if agency is None: + raise FailedValidationException("agency must be provided if is_relevant is True") + return values \ No newline at end of file diff --git a/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py b/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py index 783b5516..4280e00d 100644 --- a/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py +++ b/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py @@ -12,7 +12,7 @@ class GetNextRecordTypeAnnotationResponseInfo(BaseModel): title="Information about the URL" ) suggested_record_type: Optional[RecordType] = Field( - title="Whether the auto-labeler identified the URL as relevant or not" + title="What record type, if any, the auto-labeler identified the URL as" ) html_info: ResponseHTMLInfo = Field( title="HTML information about the URL" diff --git a/core/DTOs/GetNextURLForAllAnnotationResponse.py b/core/DTOs/GetNextURLForAllAnnotationResponse.py new file mode 100644 index 00000000..f4fa4bb8 --- /dev/null +++ b/core/DTOs/GetNextURLForAllAnnotationResponse.py @@ -0,0 +1,24 @@ +from typing import Optional + +from pydantic import Field, BaseModel + +from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo +from core.enums import RecordType +from html_tag_collector.DataClassTags import ResponseHTMLInfo + + +class GetNextURLForAllAnnotationInnerResponse(BaseModel): + url_id: int + url: str + html_info: ResponseHTMLInfo + agency_suggestions: Optional[list[GetNextURLForAgencyAgencyInfo]] + suggested_relevant: Optional[bool] = Field( + title="Whether the auto-labeler identified the URL as relevant or not" + ) + suggested_record_type: Optional[RecordType] = Field( + title="What record type, if any, the auto-labeler identified the URL as" + ) + + +class GetNextURLForAllAnnotationResponse(BaseModel): + next_annotation: Optional[GetNextURLForAllAnnotationInnerResponse] \ No newline at end of file diff --git a/core/DTOs/GetNextURLForAnnotationResponse.py b/core/DTOs/GetNextURLForAnnotationResponse.py deleted file mode 100644 index b4bc1087..00000000 --- a/core/DTOs/GetNextURLForAnnotationResponse.py +++ /dev/null @@ -1,9 +0,0 @@ -from typing import Optional - -from pydantic import BaseModel - -from core.DTOs.AnnotationRequestInfo import AnnotationRequestInfo - - -class GetNextURLForAnnotationResponse(BaseModel): - next_annotation: Optional[AnnotationRequestInfo] = None diff --git a/core/exceptions.py b/core/exceptions.py index d9685245..e3e93e55 100644 --- a/core/exceptions.py +++ b/core/exceptions.py @@ -1,3 +1,8 @@ +from http import HTTPStatus + +from fastapi import HTTPException + + class InvalidPreprocessorError(Exception): pass @@ -8,3 +13,8 @@ class MuckrockAPIError(Exception): class MatchAgencyError(Exception): pass + + +class FailedValidationException(HTTPException): + def __init__(self, detail: str): + super().__init__(status_code=HTTPStatus.BAD_REQUEST, detail=detail) \ No newline at end of file diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index 4a12bb0e..28e4b4a3 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -10,6 +10,7 @@ from collector_db.enums import TaskType from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.enums import CollectorType +from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewBaseInfo from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse @@ -18,6 +19,7 @@ from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo +from core.DTOs.GetNextURLForAllAnnotationResponse import GetNextURLForAllAnnotationResponse from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse @@ -294,4 +296,37 @@ async def get_current_task_status(self) -> GetTaskStatusResponseInfo: data = self.get( url=f"/task/status" ) - return GetTaskStatusResponseInfo(**data) \ No newline at end of file + return GetTaskStatusResponseInfo(**data) + + async def get_next_url_for_all_annotations( + self, + batch_id: Optional[int] = None + ) -> GetNextURLForAllAnnotationResponse: + params = {} + update_if_not_none( + target=params, + source={"batch_id": batch_id} + ) + data = self.get( + url=f"/annotate/all", + params=params + ) + return GetNextURLForAllAnnotationResponse(**data) + + async def post_all_annotations_and_get_next( + self, + url_id: int, + all_annotations_post_info: AllAnnotationPostInfo, + batch_id: Optional[int] = None, + ) -> GetNextURLForAllAnnotationResponse: + params = {} + update_if_not_none( + target=params, + source={"batch_id": batch_id} + ) + data = self.post( + url=f"/annotate/all/{url_id}", + params=params, + json=all_annotations_post_info.model_dump(mode='json') + ) + return GetNextURLForAllAnnotationResponse(**data) \ No newline at end of file diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/test_automated/integration/api/test_annotate.py index d5b6dade..a03540a1 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/test_automated/integration/api/test_annotate.py @@ -1,16 +1,20 @@ +from http import HTTPStatus import pytest from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_db.DTOs.URLMapping import URLMapping from collector_db.models import UserUrlAgencySuggestion, UserRelevantSuggestion, UserRecordTypeSuggestion +from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import URLAgencyAnnotationPostInfo from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo from core.enums import RecordType, SuggestionType -from tests.helpers.complex_test_data_functions import AnnotateAgencySetupInfo, setup_for_annotate_agency +from core.exceptions import FailedValidationException +from tests.helpers.complex_test_data_functions import AnnotateAgencySetupInfo, setup_for_annotate_agency, \ + setup_for_get_next_url_for_final_review from html_tag_collector.DataClassTags import ResponseHTMLInfo from tests.helpers.DBDataCreator import BatchURLCreationInfo from tests.test_automated.integration.api.conftest import MOCK_USER_ID @@ -514,3 +518,135 @@ async def test_annotate_agency_submit_new(api_test_helper): assert len(all_manual_suggestions) == 1 assert all_manual_suggestions[0].is_new +@pytest.mark.asyncio +async def test_annotate_all(api_test_helper): + """ + Test the happy path workflow for the all-annotations endpoint + The user should be able to get a valid URL (filtering on batch id if needed), + submit a full annotation, and receive another URL + """ + ath = api_test_helper + adb_client = ath.adb_client() + setup_info_1 = await setup_for_get_next_url_for_final_review( + db_data_creator=ath.db_data_creator, include_user_annotations=False + ) + url_mapping_1 = setup_info_1.url_mapping + setup_info_2 = await setup_for_get_next_url_for_final_review( + db_data_creator=ath.db_data_creator, include_user_annotations=False + ) + url_mapping_2 = setup_info_2.url_mapping + + # First, get a valid URL to annotate + get_response_1 = await ath.request_validator.get_next_url_for_all_annotations() + + # Apply the second batch id as a filter and see that a different URL is returned + get_response_2 = await ath.request_validator.get_next_url_for_all_annotations( + batch_id=setup_info_2.batch_id + ) + + assert get_response_1.next_annotation.url_id != get_response_2.next_annotation.url_id + + # Annotate the first and submit + agency_id = await ath.db_data_creator.agency() + post_response_1 = await ath.request_validator.post_all_annotations_and_get_next( + url_id=url_mapping_1.url_id, + all_annotations_post_info=AllAnnotationPostInfo( + is_relevant=True, + record_type=RecordType.ACCIDENT_REPORTS, + agency=URLAgencyAnnotationPostInfo( + is_new=False, + suggested_agency=agency_id + ) + ) + ) + assert post_response_1.next_annotation is not None + + # Confirm the second is received + assert post_response_1.next_annotation.url_id == url_mapping_2.url_id + + # Upon submitting the second, confirm that no more URLs are returned through either POST or GET + post_response_2 = await ath.request_validator.post_all_annotations_and_get_next( + url_id=url_mapping_2.url_id, + all_annotations_post_info=AllAnnotationPostInfo( + is_relevant=False, + ) + ) + assert post_response_2.next_annotation is None + + get_response_3 = await ath.request_validator.get_next_url_for_all_annotations() + assert get_response_3.next_annotation is None + + + # Check that all annotations are present in the database + + # Should be two relevance annotations, one True and one False + all_relevance_suggestions = await adb_client.get_all(UserRelevantSuggestion) + assert len(all_relevance_suggestions) == 2 + assert all_relevance_suggestions[0].relevant == True + assert all_relevance_suggestions[1].relevant == False + + # Should be one agency + all_agency_suggestions = await adb_client.get_all(UserUrlAgencySuggestion) + assert len(all_agency_suggestions) == 1 + assert all_agency_suggestions[0].is_new == False + assert all_agency_suggestions[0].agency_id == agency_id + + # Should be one record type + all_record_type_suggestions = await adb_client.get_all(UserRecordTypeSuggestion) + assert len(all_record_type_suggestions) == 1 + assert all_record_type_suggestions[0].record_type == RecordType.ACCIDENT_REPORTS.value + +@pytest.mark.asyncio +async def test_annotate_all_post_batch_filtering(api_test_helper): + """ + Batch filtering should also work when posting annotations + """ + ath = api_test_helper + adb_client = ath.adb_client() + setup_info_1 = await setup_for_get_next_url_for_final_review( + db_data_creator=ath.db_data_creator, include_user_annotations=False + ) + url_mapping_1 = setup_info_1.url_mapping + setup_info_2 = await setup_for_get_next_url_for_final_review( + db_data_creator=ath.db_data_creator, include_user_annotations=False + ) + setup_info_3 = await setup_for_get_next_url_for_final_review( + db_data_creator=ath.db_data_creator, include_user_annotations=False + ) + url_mapping_3 = setup_info_3.url_mapping + + # Submit the first annotation, using the third batch id, and receive the third URL + post_response_1 = await ath.request_validator.post_all_annotations_and_get_next( + url_id=url_mapping_1.url_id, + batch_id=setup_info_3.batch_id, + all_annotations_post_info=AllAnnotationPostInfo( + is_relevant=True, + record_type=RecordType.ACCIDENT_REPORTS, + agency=URLAgencyAnnotationPostInfo( + is_new=True + ) + ) + ) + + assert post_response_1.next_annotation.url_id == url_mapping_3.url_id + + +@pytest.mark.asyncio +async def test_annotate_all_validation_error(api_test_helper): + """ + Validation errors in the PostInfo DTO should result in a 400 BAD REQUEST response + """ + ath = api_test_helper + setup_info_1 = await setup_for_get_next_url_for_final_review( + db_data_creator=ath.db_data_creator, include_user_annotations=False + ) + url_mapping_1 = setup_info_1.url_mapping + + with pytest.raises(FailedValidationException) as e: + response = await ath.request_validator.post_all_annotations_and_get_next( + url_id=url_mapping_1.url_id, + all_annotations_post_info=AllAnnotationPostInfo( + is_relevant=False, + record_type=RecordType.ACCIDENT_REPORTS + ) + ) diff --git a/tests/test_automated/unit/dto/__init__.py b/tests/test_automated/unit/dto/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/test_automated/unit/dto/test_all_annotation_post_info.py b/tests/test_automated/unit/dto/test_all_annotation_post_info.py new file mode 100644 index 00000000..3e5cbab4 --- /dev/null +++ b/tests/test_automated/unit/dto/test_all_annotation_post_info.py @@ -0,0 +1,37 @@ +import pytest +from pydantic import ValidationError + +from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo +from core.enums import RecordType +from core.exceptions import FailedValidationException + +# Mock values to pass +mock_record_type = RecordType.ARREST_RECORDS.value # replace with valid RecordType if Enum +mock_agency = {"is_new": False, "suggested_agency": 1} # replace with a valid dict for the URLAgencyAnnotationPostInfo model + +@pytest.mark.parametrize( + "is_relevant, record_type, agency, should_raise", + [ + (True, mock_record_type, mock_agency, False), # valid + (True, None, mock_agency, True), # missing record_type + (True, mock_record_type, None, True), # missing agency + (True, None, None, True), # missing both + (False, None, None, False), # valid + (False, mock_record_type, None, True), # record_type present + (False, None, mock_agency, True), # agency present + (False, mock_record_type, mock_agency, True), # both present + ] +) +def test_all_annotation_post_info_validation(is_relevant, record_type, agency, should_raise): + data = { + "is_relevant": is_relevant, + "record_type": record_type, + "agency": agency + } + + if should_raise: + with pytest.raises(FailedValidationException): + AllAnnotationPostInfo(**data) + else: + model = AllAnnotationPostInfo(**data) + assert model.is_relevant == is_relevant From 72ed9c9d0ae4a5f42e2f17c7536eff064287ba9b Mon Sep 17 00:00:00 2001 From: maxachis Date: Mon, 21 Apr 2025 16:40:12 -0400 Subject: [PATCH 131/244] DRAFT --- local_database/docker/initdb.d/create-dbs.sql | 3 ++ local_database/docker/initdb.d/setup-fdw.sql | 15 ++++++++ local_database/setup_fdw.sh | 38 +++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 local_database/docker/initdb.d/create-dbs.sql create mode 100644 local_database/docker/initdb.d/setup-fdw.sql create mode 100644 local_database/setup_fdw.sh diff --git a/local_database/docker/initdb.d/create-dbs.sql b/local_database/docker/initdb.d/create-dbs.sql new file mode 100644 index 00000000..1c66dec9 --- /dev/null +++ b/local_database/docker/initdb.d/create-dbs.sql @@ -0,0 +1,3 @@ +-- Creates both logical DBs in one Postgres cluster +CREATE DATABASE data_sources_test_db; +CREATE DATABASE source_collector_test_db; diff --git a/local_database/docker/initdb.d/setup-fdw.sql b/local_database/docker/initdb.d/setup-fdw.sql new file mode 100644 index 00000000..1dd94b4c --- /dev/null +++ b/local_database/docker/initdb.d/setup-fdw.sql @@ -0,0 +1,15 @@ +-- This script connects to db_b and sets up FDW access to db_a +\connect source_collector_test_db; + +CREATE EXTENSION IF NOT EXISTS postgres_fdw; + +CREATE SERVER db_a_server + FOREIGN DATA WRAPPER postgres_fdw + OPTIONS (host 'localhost', dbname 'db_a'); + +CREATE USER MAPPING FOR test_source_collector_user + SERVER db_a_server + OPTIONS (user 'test_source_collector_user', password 'HanviliciousHamiltonHilltops'); + +-- Example: import tables from db_a (assuming public schema exists and has tables) +IMPORT FOREIGN SCHEMA public FROM SERVER db_a_server INTO foreign_a; diff --git a/local_database/setup_fdw.sh b/local_database/setup_fdw.sh new file mode 100644 index 00000000..139dedc7 --- /dev/null +++ b/local_database/setup_fdw.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +set -euo pipefail + +# Defaults (can be overridden) +POSTGRES_HOST="${POSTGRES_HOST:-localhost}" +POSTGRES_PORT="${POSTGRES_PORT:-5432}" +POSTGRES_USER="${POSTGRES_USER:-postgres}" +POSTGRES_PASSWORD="${POSTGRES_PASSWORD:-postgres}" +DB_A="${DB_A:-db_a}" +DB_B="${DB_B:-db_b}" + +export PGPASSWORD="$POSTGRES_PASSWORD" + +echo "Creating databases $DB_A and $DB_B..." +psql -h "$POSTGRES_HOST" -U "$POSTGRES_USER" -d postgres -p "$POSTGRES_PORT" -c "CREATE DATABASE $DB_A;" || echo "$DB_A already exists" +psql -h "$POSTGRES_HOST" -U "$POSTGRES_USER" -d postgres -p "$POSTGRES_PORT" -c "CREATE DATABASE $DB_B;" || echo "$DB_B already exists" + +echo "Setting up FDW in $DB_B to access $DB_A..." +psql -h "$POSTGRES_HOST" -U "$POSTGRES_USER" -d "$DB_B" -p "$POSTGRES_PORT" < Date: Tue, 22 Apr 2025 09:15:03 -0400 Subject: [PATCH 132/244] Refactor Docker Logic and add Data Sources Dumper Logic --- .github/workflows/test_app.yml | 7 + ...3f1272f94b9_set_up_foreign_data_wrapper.py | 250 ++++++++++++++ local_database/DTOs.py | 52 +++ local_database/DataDumper/dump.sh | 25 +- local_database/DockerInfos.py | 83 +++++ local_database/classes/DockerClient.py | 81 +++++ local_database/classes/DockerContainer.py | 28 ++ local_database/classes/DockerManager.py | 73 ++++ local_database/classes/TimestampChecker.py | 32 ++ local_database/classes/__init__.py | 0 local_database/constants.py | 5 + local_database/create_database.py | 65 ++++ local_database/docker/initdb.d/create-dbs.sql | 3 - local_database/docker/initdb.d/setup-fdw.sql | 15 - local_database/dump_data_sources_schema.py | 18 + local_database/local_db_util.py | 18 + local_database/setup.py | 52 +++ local_database/setup_fdw.sh | 38 --- start_mirrored_local_app.py | 322 +----------------- 19 files changed, 797 insertions(+), 370 deletions(-) create mode 100644 alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py create mode 100644 local_database/DTOs.py create mode 100644 local_database/DockerInfos.py create mode 100644 local_database/classes/DockerClient.py create mode 100644 local_database/classes/DockerContainer.py create mode 100644 local_database/classes/DockerManager.py create mode 100644 local_database/classes/TimestampChecker.py create mode 100644 local_database/classes/__init__.py create mode 100644 local_database/constants.py create mode 100644 local_database/create_database.py delete mode 100644 local_database/docker/initdb.d/create-dbs.sql delete mode 100644 local_database/docker/initdb.d/setup-fdw.sql create mode 100644 local_database/dump_data_sources_schema.py create mode 100644 local_database/local_db_util.py create mode 100644 local_database/setup.py delete mode 100644 local_database/setup_fdw.sh diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index e16d1771..28a41e29 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -35,6 +35,13 @@ jobs: --health-retries 5 steps: + - name: Set up FDW + run: | + ./local_database/setup_fdw.sh + env: + POSTGRES_HOST: postgres + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres - name: Checkout repository uses: actions/checkout@v4 - name: Install dependencies diff --git a/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py b/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py new file mode 100644 index 00000000..5c1adf18 --- /dev/null +++ b/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py @@ -0,0 +1,250 @@ +"""Set up foreign data wrapper + +Revision ID: 13f1272f94b9 +Revises: e285e6e7cf71 +Create Date: 2025-04-21 18:17:34.593973 + +""" +import os +from typing import Sequence, Union + +from alembic import op +from dotenv import load_dotenv + +# revision identifiers, used by Alembic. +revision: str = '13f1272f94b9' +down_revision: Union[str, None] = 'e285e6e7cf71' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + + load_dotenv() + remote_host = os.getenv("DATA_SOURCES_HOST") + user = os.getenv("DATA_SOURCES_USER") + password = os.getenv("DATA_SOURCES_PASSWORD") + db_name = os.getenv("DATA_SOURCES_DB") + port = os.getenv("DATA_SOURCES_PORT") + + op.execute(f"CREATE EXTENSION IF NOT EXISTS postgres_fdw;") + + op.execute(f""" + CREATE SERVER data_sources_server + FOREIGN DATA WRAPPER postgres_fdw + OPTIONS (host '{remote_host}', dbname '{db_name}', port '{port}'); + """) + + op.execute(f""" + CREATE USER MAPPING FOR {user} + SERVER data_sources_server + OPTIONS (user '{user}', password '{password}'); + """) + + op.execute('CREATE SCHEMA if not exists "remote";') + + # Users table + op.execute(""" + CREATE FOREIGN TABLE IF NOT EXISTS "remote".users + ( + id bigint, + created_at timestamp with time zone, + updated_at timestamp with time zone, + email text, + password_digest text, + api_key character varying, + role text + ) + SERVER data_sources_server + OPTIONS ( + schema_name 'public', + table_name 'users' + ); + """) + + # Agencies + # -Enums + # --Jurisdiction Type + op.execute(""" + CREATE TYPE jurisdiction_type AS ENUM + ('school', 'county', 'local', 'port', 'tribal', 'transit', 'state', 'federal'); + """) + # --Agency Type + op.execute(""" + CREATE TYPE agency_type AS ENUM + ('incarceration', 'law enforcement', 'aggregated', 'court', 'unknown'); + """) + + # -Table + op.execute(""" + CREATE FOREIGN TABLE IF NOT EXISTS "remote".agencies + ( + name character , + homepage_url character , + jurisdiction_type jurisdiction_type , + lat double precision, + lng double precision, + defunct_year character , + airtable_uid character , + agency_type agency_type , + multi_agency boolean , + no_web_presence boolean , + airtable_agency_last_modified timestamp with time zone, + rejection_reason character , + last_approval_editor character , + submitter_contact character, + agency_created timestamp with time zone, + id integer, + approval_status text, + creator_user_id integer + ) + SERVER data_sources_server + OPTIONS ( + schema_name 'public', + table_name 'agencies' + ); + """) + + # Locations Table + # -Enums + # --Location Type + op.execute(""" + CREATE TYPE location_type AS ENUM + ('State', 'County', 'Locality'); + """) + + # -Table + op.execute(""" + CREATE FOREIGN TABLE IF NOT EXISTS "remote".locations + ( + id bigint, + type location_type, + state_id bigint, + county_id bigint, + locality_id bigint + ) + SERVER data_sources_server + OPTIONS ( + schema_name 'public', + table_name 'locations' + ); + """) + + # Data Sources Table + + # -Enums + # -- access_type + op.execute(""" + CREATE TYPE access_type AS ENUM + ('Download', 'Webpage', 'API'); + """) + + # -- agency_aggregation + op.execute(""" + CREATE TYPE agency_aggregation AS ENUM + ('county', 'local', 'state', 'federal'); + """) + # -- update_method + op.execute(""" + CREATE TYPE update_method AS ENUM + ('Insert', 'No updates', 'Overwrite'); + """) + + # -- detail_level + op.execute(""" + CREATE TYPE detail_level AS ENUM + ('Individual record', 'Aggregated records', 'Summarized totals'); + """) + + # -- retention_schedule + op.execute(""" + CREATE TYPE retention_schedule AS ENUM + ('< 1 day', '1 day', '< 1 week', '1 week', '1 month', '< 1 year', '1-10 years', '> 10 years', 'Future only'); + """) + + # -Table + op.execute(""" + CREATE FOREIGN TABLE IF NOT EXISTS "remote".data_sources + ( + name character varying , + description character , + source_url character , + agency_supplied boolean, + supplying_entity character , + agency_originated boolean, + agency_aggregation agency_aggregation, + coverage_start date, + coverage_end date, + updated_at timestamp with time zone , + detail_level detail_level, + record_download_option_provided boolean, + data_portal_type character , + update_method update_method, + readme_url character , + originating_entity character , + retention_schedule retention_schedule, + airtable_uid character , + scraper_url character , + created_at timestamp with time zone , + submission_notes character , + rejection_note character , + submitter_contact_info character , + agency_described_not_in_database character , + data_portal_type_other character , + data_source_request character , + broken_source_url_as_of timestamp with time zone, + access_notes text , + url_status text , + approval_status text , + record_type_id integer, + access_types access_type[], + tags text[] , + record_formats text[] , + id integer, + approval_status_updated_at timestamp with time zone , + last_approval_editor bigint + ) + SERVER data_sources_server + OPTIONS ( + schema_name 'public', + table_name 'data_sources' + ); + """) + + + +def downgrade() -> None: + # Drop foreign schema + op.execute('DROP SCHEMA IF EXISTS "remote" CASCADE;') + + # Drop enums + enums = [ + "jurisdiction_type", + "agency_type", + "location_type", + "access_type", + "agency_aggregation", + "update_method", + "detail_level", + "retention_schedule", + ] + for enum in enums: + op.execute(f""" + DROP TYPE IF EXISTS {enum}; + """) + + # Drop user mapping + user = os.getenv("DATA_SOURCES_USER") + op.execute(f""" + DROP USER MAPPING FOR {user} SERVER data_sources_server; + """) + + # Drop server + op.execute(""" + DROP SERVER IF EXISTS data_sources_server CASCADE; + """) + + # Drop FDW + op.execute(""" + DROP EXTENSION IF EXISTS postgres_fdw CASCADE; + """) diff --git a/local_database/DTOs.py b/local_database/DTOs.py new file mode 100644 index 00000000..c4c5ff80 --- /dev/null +++ b/local_database/DTOs.py @@ -0,0 +1,52 @@ +from typing import Annotated, Optional + +from pydantic import BaseModel, AfterValidator + +from local_database.local_db_util import is_absolute_path, get_absolute_path + + +class VolumeInfo(BaseModel): + host_path: str + container_path: Annotated[str, AfterValidator(is_absolute_path)] + + def build_volumes(self): + return { + get_absolute_path(self.host_path): { + "bind": self.container_path, + "mode": "rw" + } + } + + +class DockerfileInfo(BaseModel): + image_tag: str + dockerfile_directory: Optional[str] = None + + +class HealthCheckInfo(BaseModel): + test: list[str] + interval: int + timeout: int + retries: int + start_period: int + + def build_healthcheck(self) -> dict: + multiplicative_factor = 1000000000 # Assume 1 second + return { + "test": self.test, + "interval": self.interval * multiplicative_factor, + "timeout": self.timeout * multiplicative_factor, + "retries": self.retries, + "start_period": self.start_period * multiplicative_factor + } + + +class DockerInfo(BaseModel): + dockerfile_info: DockerfileInfo + volume_info: Optional[VolumeInfo] = None + name: str + ports: Optional[dict] = None + environment: Optional[dict] + command: Optional[str] = None + entrypoint: Optional[list[str]] = None + health_check_info: Optional[HealthCheckInfo] = None diff --git a/local_database/DataDumper/dump.sh b/local_database/DataDumper/dump.sh index 9c07c0ca..482a3ca1 100644 --- a/local_database/DataDumper/dump.sh +++ b/local_database/DataDumper/dump.sh @@ -1,15 +1,28 @@ #!/bin/bash #set -e + # Variables (customize these or pass them as environment variables) DB_HOST=${DUMP_HOST:-"postgres_container"} DB_USER=${DUMP_USER:-"your_user"} -DB_PORT=${DUMP_PORT:-"5432"} # Default to 5432 if not provided +DB_PORT=${DUMP_PORT:-"5432"} DB_PASSWORD=${DUMP_PASSWORD:-"your_password"} DB_NAME=${DUMP_NAME:-"your_database"} -DUMP_FILE="/dump/db_dump.sql" +DUMP_FILE=${DUMP_FILE:-"/dump/db_dump.sql"} +DUMP_SCHEMA_ONLY=${DUMP_SCHEMA_ONLY:-false} # Set to "true" to dump only schema + # Export password for pg_dump export PGPASSWORD=$DB_PASSWORD -# Dump the database -echo "Dumping database $DB_NAME from $DB_HOST:$DB_PORT..." -pg_dump -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME --no-owner --no-acl -F c -f $DUMP_FILE -echo "Dump completed. File saved to $DUMP_FILE." \ No newline at end of file + +# Determine pg_dump flags +PG_DUMP_FLAGS="--no-owner --no-acl -F c" +if [[ "$DUMP_SCHEMA_ONLY" == "true" ]]; then + PG_DUMP_FLAGS="$PG_DUMP_FLAGS --schema-only" + echo "Dumping schema only..." +else + echo "Dumping full database..." +fi + +# Run pg_dump +pg_dump -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME $PG_DUMP_FLAGS -f $DUMP_FILE + +echo "Dump completed. File saved to $DUMP_FILE." diff --git a/local_database/DockerInfos.py b/local_database/DockerInfos.py new file mode 100644 index 00000000..aecff2b7 --- /dev/null +++ b/local_database/DockerInfos.py @@ -0,0 +1,83 @@ +from local_database.DTOs import DockerInfo, DockerfileInfo, HealthCheckInfo, VolumeInfo +from local_database.constants import LOCAL_DATA_SOURCES_DB_NAME +from util.helper_functions import get_from_env + + +def get_database_docker_info() -> DockerInfo: + return DockerInfo( + dockerfile_info=DockerfileInfo( + image_tag="postgres:15", + ), + name="data_source_identification_db", + ports={ + "5432/tcp": 5432 + }, + environment={ + "POSTGRES_PASSWORD": "HanviliciousHamiltonHilltops", + "POSTGRES_USER": "test_source_collector_user", + "POSTGRES_DB": "source_collector_test_db" + }, + health_check_info=HealthCheckInfo( + test=["pg_isready", "-U", "test_source_collector_user", "-h", "127.0.0.1", "-p", "5432"], + interval=1, + timeout=3, + retries=30, + start_period=2 + ) + ) + + +def get_data_sources_data_dumper_info() -> DockerInfo: + return DockerInfo( + dockerfile_info=DockerfileInfo( + image_tag="datadumper", + dockerfile_directory="DataDumper" + ), + volume_info=VolumeInfo( + host_path="./DataDumper/dump", + container_path="/dump" + ), + name="datadumper", + environment={ + "DUMP_HOST": get_from_env("PROD_DATA_SOURCES_HOST"), + "DUMP_USER": get_from_env("PROD_DATA_SOURCES_USER"), + "DUMP_PASSWORD": get_from_env("PROD_DATA_SOURCES_PASSWORD"), + "DUMP_NAME": get_from_env("PROD_DATA_SOURCES_DB"), + "DUMP_PORT": get_from_env("PROD_DATA_SOURCES_PORT"), + "RESTORE_HOST": get_from_env("POSTGRES_HOST"), + "RESTORE_USER": get_from_env("POSTGRES_USER"), + "RESTORE_PORT": get_from_env("POSTGRES_PORT"), + "RESTORE_DB_NAME": LOCAL_DATA_SOURCES_DB_NAME, + "RESTORE_PASSWORD": get_from_env("POSTGRES_PASSWORD"), + "DUMP_FILE": "/dump/data_sources_db_dump.sql", + "DUMP_SCHEMA_ONLY": "true" + }, + command="bash" + ) + + +def get_source_collector_data_dumper_info() -> DockerInfo: + return DockerInfo( + dockerfile_info=DockerfileInfo( + image_tag="datadumper", + dockerfile_directory="DataDumper" + ), + volume_info=VolumeInfo( + host_path="./DataDumper/dump", + container_path="/dump" + ), + name="datadumper", + environment={ + "DUMP_HOST": get_from_env("DUMP_HOST"), + "DUMP_USER": get_from_env("DUMP_USER"), + "DUMP_PASSWORD": get_from_env("DUMP_PASSWORD"), + "DUMP_NAME": get_from_env("DUMP_DB_NAME"), + "DUMP_PORT": get_from_env("DUMP_PORT"), + "RESTORE_HOST": "data_source_identification_db", + "RESTORE_USER": "test_source_collector_user", + "RESTORE_PORT": "5432", + "RESTORE_DB_NAME": "source_collector_test_db", + "RESTORE_PASSWORD": "HanviliciousHamiltonHilltops", + }, + command="bash" + ) diff --git a/local_database/classes/DockerClient.py b/local_database/classes/DockerClient.py new file mode 100644 index 00000000..bb452748 --- /dev/null +++ b/local_database/classes/DockerClient.py @@ -0,0 +1,81 @@ +import docker +from docker.errors import NotFound, APIError + +from local_database.DTOs import DockerfileInfo, DockerInfo +from local_database.local_db_util import get_absolute_path + + +class DockerClient: + + def __init__(self): + self.client = docker.from_env() + + def run_command(self, command: str, container_id: str): + exec_id = self.client.api.exec_create( + container_id, + cmd=command, + tty=True, + stdin=False + ) + output_stream = self.client.api.exec_start(exec_id=exec_id, stream=True) + for line in output_stream: + print(line.decode().rstrip()) + + def start_network(self, network_name): + try: + self.client.networks.create(network_name, driver="bridge") + except APIError as e: + # Assume already exists + print(e) + return self.client.networks.get(network_name) + + def stop_network(self, network_name): + self.client.networks.get(network_name).remove() + + def get_image(self, dockerfile_info: DockerfileInfo): + if dockerfile_info.dockerfile_directory: + # Build image from Dockerfile + self.client.images.build( + path=get_absolute_path(dockerfile_info.dockerfile_directory), + tag=dockerfile_info.image_tag + ) + else: + # Pull or use existing image + self.client.images.pull(dockerfile_info.image_tag) + + def run_container( + self, + docker_info: DockerInfo, + network_name: str + ): + print(f"Running container {docker_info.name}") + try: + container = self.client.containers.get(docker_info.name) + if container.status == 'running': + print(f"Container '{docker_info.name}' is already running") + return container + print("Restarting container...") + container.start() + return container + except NotFound: + # Container does not exist; proceed to build/pull image and run + pass + + self.get_image(docker_info.dockerfile_info) + + container = self.client.containers.run( + image=docker_info.dockerfile_info.image_tag, + volumes=docker_info.volume_info.build_volumes() if docker_info.volume_info is not None else None, + command=docker_info.command, + entrypoint=docker_info.entrypoint, + detach=True, + name=docker_info.name, + ports=docker_info.ports, + network=network_name, + environment=docker_info.environment, + stdout=True, + stderr=True, + tty=True, + healthcheck=docker_info.health_check_info.build_healthcheck() if docker_info.health_check_info is not None else None + ) + return container diff --git a/local_database/classes/DockerContainer.py b/local_database/classes/DockerContainer.py new file mode 100644 index 00000000..ee2ecba9 --- /dev/null +++ b/local_database/classes/DockerContainer.py @@ -0,0 +1,28 @@ +import time + +from docker.models.containers import Container + +from local_database.classes.DockerClient import DockerClient + + +class DockerContainer: + + def __init__(self, dc: DockerClient, container: Container): + self.dc = dc + self.container = container + + def run_command(self, command: str): + self.dc.run_command(command, self.container.id) + + def stop(self): + self.container.stop() + + def wait_for_pg_to_be_ready(self): + for i in range(30): + exit_code, output = self.container.exec_run("pg_isready") + print(output) + if exit_code == 0: + return + time.sleep(1) + raise Exception("Timed out waiting for postgres to be ready") + diff --git a/local_database/classes/DockerManager.py b/local_database/classes/DockerManager.py new file mode 100644 index 00000000..ab43f852 --- /dev/null +++ b/local_database/classes/DockerManager.py @@ -0,0 +1,73 @@ +import platform +import subprocess +import sys + +import docker +from docker.errors import APIError + +from local_database.DTOs import DockerfileInfo, DockerInfo +from local_database.classes.DockerClient import DockerClient +from local_database.classes.DockerContainer import DockerContainer + + +class DockerManager: + def __init__(self): + if not self.is_docker_running(): + self.start_docker_engine() + + self.client = DockerClient() + self.network_name = "my_network" + self.network = self.start_network() + + @staticmethod + def start_docker_engine(): + system = platform.system() + + match system: + case "Windows": + # Use PowerShell to start Docker Desktop on Windows + subprocess.run([ + "powershell", "-Command", + "Start-Process 'Docker Desktop' -Verb RunAs" + ]) + case "Darwin": + # MacOS: Docker Desktop must be started manually or with open + subprocess.run(["open", "-a", "Docker"]) + case "Linux": + # Most Linux systems use systemctl to manage Docker + subprocess.run(["sudo", "systemctl", "start", "docker"]) + case _: + print(f"Unsupported OS: {system}") + sys.exit(1) + + @staticmethod + def is_docker_running(): + try: + client = docker.from_env() + client.ping() + return True + except docker.errors.DockerException as e: + print(f"Docker is not running: {e}") + return False + + def run_command(self, command: str, container_id: str): + self.client.run_command(command, container_id) + + def start_network(self): + return self.client.start_network(self.network_name) + + def stop_network(self): + self.client.stop_network(self.network_name) + + def get_image(self, dockerfile_info: DockerfileInfo): + self.client.get_image(dockerfile_info) + + def run_container( + self, + docker_info: DockerInfo, + ) -> DockerContainer: + raw_container = self.client.run_container(docker_info, self.network_name) + return DockerContainer(self.client, raw_container) + + def get_containers(self): + return self.client.client.containers.list() \ No newline at end of file diff --git a/local_database/classes/TimestampChecker.py b/local_database/classes/TimestampChecker.py new file mode 100644 index 00000000..56779fd4 --- /dev/null +++ b/local_database/classes/TimestampChecker.py @@ -0,0 +1,32 @@ +import datetime +import os +from typing import Optional + + +class TimestampChecker: + def __init__(self): + self.last_run_time: Optional[datetime.datetime] = self.load_last_run_time() + + def load_last_run_time(self) -> Optional[datetime.datetime]: + # Check if file `last_run.txt` exists + # If it does, load the last run time + if os.path.exists("local_state/last_run.txt"): + with open("local_state/last_run.txt", "r") as f: + return datetime.datetime.strptime( + f.read(), + "%Y-%m-%d %H:%M:%S" + ) + return None + + def last_run_within_24_hours(self): + if self.last_run_time is None: + return False + return datetime.datetime.now() - self.last_run_time < datetime.timedelta(days=1) + + def set_last_run_time(self): + # If directory `local_state` doesn't exist, create it + if not os.path.exists("local_state"): + os.makedirs("local_state") + + with open("local_state/last_run.txt", "w") as f: + f.write(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) diff --git a/local_database/classes/__init__.py b/local_database/classes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/local_database/constants.py b/local_database/constants.py new file mode 100644 index 00000000..d5c96e72 --- /dev/null +++ b/local_database/constants.py @@ -0,0 +1,5 @@ +LOCAL_DATA_SOURCES_DB_NAME = "test_data_sources_db" +LOCAL_SOURCE_COLLECTOR_DB_NAME = "source_collector_test_db" + +DUMP_SH_DOCKER_PATH = "/usr/local/bin/dump.sh" +RESTORE_SH_DOCKER_PATH = "/usr/local/bin/restore.sh" \ No newline at end of file diff --git a/local_database/create_database.py b/local_database/create_database.py new file mode 100644 index 00000000..b23cc6d2 --- /dev/null +++ b/local_database/create_database.py @@ -0,0 +1,65 @@ +import os +import psycopg2 +from psycopg2 import sql + +from local_database.constants import LOCAL_DATA_SOURCES_DB_NAME, LOCAL_SOURCE_COLLECTOR_DB_NAME + +# Defaults (can be overridden via environment variables) +POSTGRES_HOST = os.getenv("POSTGRES_HOST", "host.docker.internal") +POSTGRES_PORT = int(os.getenv("POSTGRES_PORT", "5432")) +POSTGRES_USER = os.getenv("POSTGRES_USER", "test_source_collector_user") +POSTGRES_PASSWORD = os.getenv("POSTGRES_PASSWORD", "HanviliciousHamiltonHilltops") + + +# Connect to the default 'postgres' database to create other databases +def connect(database="postgres", autocommit=True): + conn = psycopg2.connect( + dbname=database, + user=POSTGRES_USER, + password=POSTGRES_PASSWORD, + host=POSTGRES_HOST, + port=POSTGRES_PORT + ) + if autocommit: + conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT) + return conn + +def create_database(db_name): + conn = connect("postgres") + with conn.cursor() as cur: + cur.execute(sql.SQL(""" + SELECT pg_terminate_backend(pid) + FROM pg_stat_activity + WHERE datname = %s AND pid <> pg_backend_pid() + """), [db_name]) + + # Drop the database if it exists + cur.execute(sql.SQL("DROP DATABASE IF EXISTS {}").format(sql.Identifier(db_name))) + print(f"🗑️ Dropped existing database: {db_name}") + + try: + cur.execute(sql.SQL("CREATE DATABASE {}").format(sql.Identifier(db_name))) + print(f"✅ Created database: {db_name}") + except psycopg2.errors.DuplicateDatabase: + print(f"⚠️ Database {db_name} already exists") + except Exception as e: + print(f"❌ Failed to create {db_name}: {e}") + +def create_database_tables(): + conn = connect(LOCAL_DATA_SOURCES_DB_NAME) + with conn.cursor() as cur: + cur.execute(""" + CREATE TABLE IF NOT EXISTS test_table ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL + ) + """) + conn.commit() + +def main(): + print("Creating databases...") + create_database(LOCAL_DATA_SOURCES_DB_NAME) + create_database(LOCAL_SOURCE_COLLECTOR_DB_NAME) + +if __name__ == "__main__": + main() diff --git a/local_database/docker/initdb.d/create-dbs.sql b/local_database/docker/initdb.d/create-dbs.sql deleted file mode 100644 index 1c66dec9..00000000 --- a/local_database/docker/initdb.d/create-dbs.sql +++ /dev/null @@ -1,3 +0,0 @@ --- Creates both logical DBs in one Postgres cluster -CREATE DATABASE data_sources_test_db; -CREATE DATABASE source_collector_test_db; diff --git a/local_database/docker/initdb.d/setup-fdw.sql b/local_database/docker/initdb.d/setup-fdw.sql deleted file mode 100644 index 1dd94b4c..00000000 --- a/local_database/docker/initdb.d/setup-fdw.sql +++ /dev/null @@ -1,15 +0,0 @@ --- This script connects to db_b and sets up FDW access to db_a -\connect source_collector_test_db; - -CREATE EXTENSION IF NOT EXISTS postgres_fdw; - -CREATE SERVER db_a_server - FOREIGN DATA WRAPPER postgres_fdw - OPTIONS (host 'localhost', dbname 'db_a'); - -CREATE USER MAPPING FOR test_source_collector_user - SERVER db_a_server - OPTIONS (user 'test_source_collector_user', password 'HanviliciousHamiltonHilltops'); - --- Example: import tables from db_a (assuming public schema exists and has tables) -IMPORT FOREIGN SCHEMA public FROM SERVER db_a_server INTO foreign_a; diff --git a/local_database/dump_data_sources_schema.py b/local_database/dump_data_sources_schema.py new file mode 100644 index 00000000..49627bc3 --- /dev/null +++ b/local_database/dump_data_sources_schema.py @@ -0,0 +1,18 @@ +from local_database.DockerInfos import get_data_sources_data_dumper_info +from local_database.classes.DockerManager import DockerManager +from local_database.constants import DUMP_SH_DOCKER_PATH + + +def main(): + docker_manager = DockerManager() + data_sources_docker_info = get_data_sources_data_dumper_info() + container = docker_manager.run_container(data_sources_docker_info) + try: + container.run_command(DUMP_SH_DOCKER_PATH) + finally: + container.stop() + + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/local_database/local_db_util.py b/local_database/local_db_util.py new file mode 100644 index 00000000..7bc5bb12 --- /dev/null +++ b/local_database/local_db_util.py @@ -0,0 +1,18 @@ +from pathlib import Path + + +def get_absolute_path(relative_path: str) -> str: + """ + Get absolute path, using the current file as the point of reference + """ + current_dir = Path(__file__).parent + absolute_path = (current_dir / relative_path).resolve() + return str(absolute_path) + + +def is_absolute_path(path: str) -> str: + if len(path) == 0: + raise ValueError("Path is required") + if path[0] != "/": + raise ValueError("Container path must be absolute") + return path diff --git a/local_database/setup.py b/local_database/setup.py new file mode 100644 index 00000000..a720ebc2 --- /dev/null +++ b/local_database/setup.py @@ -0,0 +1,52 @@ +import subprocess +import time +import sys + +POSTGRES_SERVICE_NAME = "postgres" +FOLLOWUP_SCRIPT = "py create_database.py" +MAX_RETRIES = 20 +SLEEP_SECONDS = 1 + +def run_command(cmd, check=True, capture_output=False, **kwargs): + try: + return subprocess.run(cmd, shell=True, check=check, capture_output=capture_output, text=True, **kwargs) + except subprocess.CalledProcessError as e: + print(f"Command '{cmd}' failed: {e}") + sys.exit(1) + +def get_postgres_container_id(): + result = run_command(f"docker-compose ps -q {POSTGRES_SERVICE_NAME}", capture_output=True) + container_id = result.stdout.strip() + if not container_id: + print("Error: Could not find Postgres container.") + sys.exit(1) + return container_id + +def wait_for_postgres(container_id): + print("Waiting for Postgres to be ready...") + for i in range(MAX_RETRIES): + try: + run_command(f"docker exec {container_id} pg_isready -U postgres", check=True) + print("Postgres is ready!") + return + except subprocess.CalledProcessError: + print(f"Still waiting... ({i+1}/{MAX_RETRIES})") + time.sleep(SLEEP_SECONDS) + print("Postgres did not become ready in time.") + sys.exit(1) + +def main(): + print("Stopping Docker Compose...") + run_command("docker-compose down") + + print("Starting Docker Compose...") + run_command("docker-compose up -d") + + container_id = get_postgres_container_id() + wait_for_postgres(container_id) + + print("Running follow-up script...") + run_command(FOLLOWUP_SCRIPT) + +if __name__ == "__main__": + main() diff --git a/local_database/setup_fdw.sh b/local_database/setup_fdw.sh deleted file mode 100644 index 139dedc7..00000000 --- a/local_database/setup_fdw.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -# Defaults (can be overridden) -POSTGRES_HOST="${POSTGRES_HOST:-localhost}" -POSTGRES_PORT="${POSTGRES_PORT:-5432}" -POSTGRES_USER="${POSTGRES_USER:-postgres}" -POSTGRES_PASSWORD="${POSTGRES_PASSWORD:-postgres}" -DB_A="${DB_A:-db_a}" -DB_B="${DB_B:-db_b}" - -export PGPASSWORD="$POSTGRES_PASSWORD" - -echo "Creating databases $DB_A and $DB_B..." -psql -h "$POSTGRES_HOST" -U "$POSTGRES_USER" -d postgres -p "$POSTGRES_PORT" -c "CREATE DATABASE $DB_A;" || echo "$DB_A already exists" -psql -h "$POSTGRES_HOST" -U "$POSTGRES_USER" -d postgres -p "$POSTGRES_PORT" -c "CREATE DATABASE $DB_B;" || echo "$DB_B already exists" - -echo "Setting up FDW in $DB_B to access $DB_A..." -psql -h "$POSTGRES_HOST" -U "$POSTGRES_USER" -d "$DB_B" -p "$POSTGRES_PORT" < str: - if len(path) == 0: - raise ValueError("Path is required") - if path[0] != "/": - raise ValueError("Container path must be absolute") - return path - -class VolumeInfo(BaseModel): - host_path: str - container_path: Annotated[str, AfterValidator(is_absolute_path)] - - def build_volumes(self): - return { - get_absolute_path(self.host_path): { - "bind": self.container_path, - "mode": "rw" - } - } - -def wait_for_pg_to_be_ready(container: Container): - for i in range(30): - exit_code, output = container.exec_run("pg_isready") - print(output) - if exit_code == 0: - return - time.sleep(1) - raise Exception("Timed out waiting for postgres to be ready") - -def get_absolute_path(relative_path: str) -> str: - """ - Get absolute path, using the current file as the point of reference - """ - current_dir = Path(__file__).parent - absolute_path = (current_dir / relative_path).resolve() - return str(absolute_path) - - -class DockerfileInfo(BaseModel): - image_tag: str - dockerfile_directory: Optional[str] = None - - - -class HealthCheckInfo(BaseModel): - test: list[str] - interval: int - timeout: int - retries: int - start_period: int - - def build_healthcheck(self) -> dict: - multiplicative_factor = 1000000000 # Assume 1 second - return { - "test": self.test, - "interval": self.interval * multiplicative_factor, - "timeout": self.timeout * multiplicative_factor, - "retries": self.retries, - "start_period": self.start_period * multiplicative_factor - } - -class DockerInfo(BaseModel): - dockerfile_info: DockerfileInfo - volume_info: Optional[VolumeInfo] = None - name: str - ports: Optional[dict] = None - environment: Optional[dict] - command: Optional[str] = None - entrypoint: Optional[list[str]] = None - health_check_info: Optional[HealthCheckInfo] = None - -def run_command_checked(command: list[str] or str, shell=False): - result = subprocess.run( - command, - check=True, - capture_output=True, - text=True, - shell=shell - ) - return result - -def is_docker_running(): - try: - client = docker.from_env() - client.ping() - return True - except docker.errors.DockerException as e: - print(f"Docker is not running: {e}") - return False - -def wait_for_health(container, timeout=30): - start = time.time() - while time.time() - start < timeout: - container.reload() # Refresh container state - state = container.attrs.get("State") - print(state) - health = container.attrs.get("State", {}).get("Health", {}) - status = health.get("Status") - print(f"Health status: {status}") - if status == "healthy": - print("Postgres is healthy.") - return - elif status == "unhealthy": - raise Exception("Postgres container became unhealthy.") - time.sleep(1) - raise TimeoutError("Timed out waiting for Postgres to become healthy.") - -def start_docker_engine(): - system = platform.system() - - match system: - case "Windows": - # Use PowerShell to start Docker Desktop on Windows - subprocess.run([ - "powershell", "-Command", - "Start-Process 'Docker Desktop' -Verb RunAs" - ]) - case "Darwin": - # MacOS: Docker Desktop must be started manually or with open - subprocess.run(["open", "-a", "Docker"]) - case "Linux": - # Most Linux systems use systemctl to manage Docker - subprocess.run(["sudo", "systemctl", "start", "docker"]) - case _: - print(f"Unsupported OS: {system}") - sys.exit(1) - -class DockerManager: - def __init__(self): - self.client = docker.from_env() - self.network_name = "my_network" - self.network = self.start_network() +from local_database.DockerInfos import get_database_docker_info, get_source_collector_data_dumper_info +from local_database.classes.DockerManager import DockerManager +from local_database.classes.TimestampChecker import TimestampChecker +from local_database.constants import RESTORE_SH_DOCKER_PATH, DUMP_SH_DOCKER_PATH - def run_command(self, command: str, container_id: str): - exec_id = self.client.api.exec_create( - container_id, - cmd=command, - tty=True, - stdin=False - ) - output_stream = self.client.api.exec_start(exec_id=exec_id, stream=True) - for line in output_stream: - print(line.decode().rstrip()) - - def start_network(self): - try: - self.client.networks.create(self.network_name, driver="bridge") - except APIError as e: - # Assume already exists - print(e) - return self.client.networks.get("my_network") - - def stop_network(self): - self.client.networks.get("my_network").remove() - - def get_image(self, dockerfile_info: DockerfileInfo): - if dockerfile_info.dockerfile_directory: - # Build image from Dockerfile - self.client.images.build( - path=get_absolute_path(dockerfile_info.dockerfile_directory), - tag=dockerfile_info.image_tag - ) - else: - # Pull or use existing image - self.client.images.pull(dockerfile_info.image_tag) - - - def run_container( - self, - docker_info: DockerInfo, - ) -> Container: - print(f"Running container {docker_info.name}") - try: - container = self.client.containers.get(docker_info.name) - if container.status == 'running': - print(f"Container '{docker_info.name}' is already running") - return container - print("Restarting container...") - container.start() - return container - except NotFound: - # Container does not exist; proceed to build/pull image and run - pass - - self.get_image(docker_info.dockerfile_info) - - container = self.client.containers.run( - image=docker_info.dockerfile_info.image_tag, - volumes=docker_info.volume_info.build_volumes() if docker_info.volume_info is not None else None, - command=docker_info.command, - entrypoint=docker_info.entrypoint, - detach=True, - name=docker_info.name, - ports=docker_info.ports, - network=self.network_name, - environment=docker_info.environment, - stdout=True, - stderr=True, - tty=True, - healthcheck=docker_info.health_check_info.build_healthcheck() if docker_info.health_check_info is not None else None - ) - return container - - -class TimestampChecker: - def __init__(self): - self.last_run_time: Optional[datetime.datetime] = self.load_last_run_time() - - def load_last_run_time(self) -> Optional[datetime.datetime]: - # Check if file `last_run.txt` exists - # If it does, load the last run time - if os.path.exists("local_state/last_run.txt"): - with open("local_state/last_run.txt", "r") as f: - return datetime.datetime.strptime( - f.read(), - "%Y-%m-%d %H:%M:%S" - ) - return None - - def last_run_within_24_hours(self): - if self.last_run_time is None: - return False - return datetime.datetime.now() - self.last_run_time < datetime.timedelta(days=1) - - def set_last_run_time(self): - # If directory `local_state` doesn't exist, create it - if not os.path.exists("local_state"): - os.makedirs("local_state") - - with open("local_state/last_run.txt", "w") as f: - f.write(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - -def get_database_docker_info() -> DockerInfo: - return DockerInfo( - dockerfile_info=DockerfileInfo( - image_tag="postgres:15", - ), - name="data_source_identification_db", - ports={ - "5432/tcp": 5432 - }, - environment={ - "POSTGRES_PASSWORD": "HanviliciousHamiltonHilltops", - "POSTGRES_USER": "test_source_collector_user", - "POSTGRES_DB": "source_collector_test_db" - }, - health_check_info=HealthCheckInfo( - test=["pg_isready", "-U", "test_source_collector_user", "-h", "127.0.0.1", "-p", "5432"], - interval=1, - timeout=3, - retries=30, - start_period=2 - ) - ) - -def get_data_dumper_docker_info() -> DockerInfo: - return DockerInfo( - dockerfile_info=DockerfileInfo( - image_tag="datadumper", - dockerfile_directory="local_database/DataDumper" - ), - volume_info=VolumeInfo( - host_path="./local_database/DataDumper/dump", - container_path="/dump" - ), - name="datadumper", - environment={ - "DUMP_HOST": get_from_env("DUMP_HOST"), - "DUMP_USER": get_from_env("DUMP_USER"), - "DUMP_PASSWORD": get_from_env("DUMP_PASSWORD"), - "DUMP_NAME": get_from_env("DUMP_DB_NAME"), - "DUMP_PORT": get_from_env("DUMP_PORT"), - "RESTORE_HOST": "data_source_identification_db", - "RESTORE_USER": "test_source_collector_user", - "RESTORE_PORT": "5432", - "RESTORE_DB_NAME": "source_collector_test_db", - "RESTORE_PASSWORD": "HanviliciousHamiltonHilltops", - }, - command="bash" - ) def main(): docker_manager = DockerManager() - # Ensure docker is running, and start if not - if not is_docker_running(): - start_docker_engine() # Ensure Dockerfile for database is running, and if not, start it database_docker_info = get_database_docker_info() - container = docker_manager.run_container(database_docker_info) - wait_for_pg_to_be_ready(container) + db_container = docker_manager.run_container(database_docker_info) + db_container.wait_for_pg_to_be_ready() # Start dockerfile for Datadumper - data_dumper_docker_info = get_data_dumper_docker_info() + data_dumper_docker_info = get_source_collector_data_dumper_info() # If not last run within 24 hours, run dump operation in Datadumper # Check cache if exists and checker = TimestampChecker() - container = docker_manager.run_container(data_dumper_docker_info) + data_dump_container = docker_manager.run_container(data_dumper_docker_info) if checker.last_run_within_24_hours(): print("Last run within 24 hours, skipping dump...") else: - docker_manager.run_command( - '/usr/local/bin/dump.sh', - container.id + data_dump_container.run_command( + DUMP_SH_DOCKER_PATH, ) - docker_manager.run_command( - "/usr/local/bin/restore.sh", - container.id + data_dump_container.run_command( + RESTORE_SH_DOCKER_PATH, ) print("Stopping datadumper container") - container.stop() + data_dump_container.stop() checker.set_last_run_time() # Upgrade using alembic @@ -351,7 +57,7 @@ def main(): finally: # Add feature to stop all running containers print("Stopping containers...") - for container in docker_manager.client.containers.list(): + for container in docker_manager.get_containers(): container.stop() print("Containers stopped.") From ca27fdbe6a2252b0615267687fb10508f9c9e3cf Mon Sep 17 00:00:00 2001 From: maxachis Date: Tue, 22 Apr 2025 11:01:17 -0400 Subject: [PATCH 133/244] add .gitattributes --- .gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..dfdb8b77 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.sh text eol=lf From 0e1eb394ba580c247c6fb422e92b90847503ce33 Mon Sep 17 00:00:00 2001 From: maxachis Date: Tue, 22 Apr 2025 13:28:05 -0400 Subject: [PATCH 134/244] DRAFT --- ENV.md | 12 +++- local_database/DTOs.py | 2 +- local_database/DockerInfos.py | 24 +++++-- local_database/classes/DockerClient.py | 83 ++++++++++++++++------ local_database/classes/DockerManager.py | 7 +- local_database/dump_data_sources_schema.py | 5 +- util/helper_functions.py | 10 +++ 7 files changed, 111 insertions(+), 32 deletions(-) diff --git a/ENV.md b/ENV.md index 5292320b..3452ef7c 100644 --- a/ENV.md +++ b/ENV.md @@ -21,4 +21,14 @@ Please ensure these are properly defined in a `.env` file in the root directory. |`PDAP_API_URL`| The URL for the PDAP API| `https://data-sources-v2.pdap.dev/api`| |`DISCORD_WEBHOOK_URL`| The URL for the Discord webhook used for notifications| `abc123` | -[^1:] The user account in question will require elevated permissions to access certain endpoints. At a minimum, the user will require the `source_collector` and `db_write` permissions. \ No newline at end of file +[^1:] The user account in question will require elevated permissions to access certain endpoints. At a minimum, the user will require the `source_collector` and `db_write` permissions. + +## Data Dumper + +``` +PROD_DATA_SOURCES_HOST=pdap-production-v2-do-user-8463429-0.k.db.ondigitalocean.com # The host of the production Data Sources Database +PROD_DATA_SOURCES_PORT=25060 # The port of the production Data Sources Database +PROD_DATA_SOURCES_USER=dump_user # The username for the production Data Sources Database +PROD_DATA_SOURCES_PASSWORD=GeriatricGeronimoGentrification # The password for the production Data Sources Database +PROD_DATA_SOURCES_DB=pdap_prod_v2_db # The database name for the production Data Sources Database +``` \ No newline at end of file diff --git a/local_database/DTOs.py b/local_database/DTOs.py index c4c5ff80..f222e5ba 100644 --- a/local_database/DTOs.py +++ b/local_database/DTOs.py @@ -11,7 +11,7 @@ class VolumeInfo(BaseModel): def build_volumes(self): return { - get_absolute_path(self.host_path): { + self.host_path: { "bind": self.container_path, "mode": "rw" } diff --git a/local_database/DockerInfos.py b/local_database/DockerInfos.py index aecff2b7..3b1c071b 100644 --- a/local_database/DockerInfos.py +++ b/local_database/DockerInfos.py @@ -1,6 +1,6 @@ from local_database.DTOs import DockerInfo, DockerfileInfo, HealthCheckInfo, VolumeInfo from local_database.constants import LOCAL_DATA_SOURCES_DB_NAME -from util.helper_functions import get_from_env +from util.helper_functions import get_from_env, project_path def get_database_docker_info() -> DockerInfo: @@ -31,10 +31,17 @@ def get_data_sources_data_dumper_info() -> DockerInfo: return DockerInfo( dockerfile_info=DockerfileInfo( image_tag="datadumper", - dockerfile_directory="DataDumper" + dockerfile_directory=str(project_path( + "local_database", + "DataDumper" + )) ), volume_info=VolumeInfo( - host_path="./DataDumper/dump", + host_path=str(project_path( + "local_database", + "DataDumper", + "dump" + )), container_path="/dump" ), name="datadumper", @@ -60,10 +67,17 @@ def get_source_collector_data_dumper_info() -> DockerInfo: return DockerInfo( dockerfile_info=DockerfileInfo( image_tag="datadumper", - dockerfile_directory="DataDumper" + dockerfile_directory=str(project_path( + "local_database", + "DataDumper" + )) ), volume_info=VolumeInfo( - host_path="./DataDumper/dump", + host_path=str(project_path( + "local_database", + "DataDumper", + "dump" + )), container_path="/dump" ), name="datadumper", diff --git a/local_database/classes/DockerClient.py b/local_database/classes/DockerClient.py index bb452748..bfcc49df 100644 --- a/local_database/classes/DockerClient.py +++ b/local_database/classes/DockerClient.py @@ -2,7 +2,6 @@ from docker.errors import NotFound, APIError from local_database.DTOs import DockerfileInfo, DockerInfo -from local_database.local_db_util import get_absolute_path class DockerClient: @@ -26,42 +25,50 @@ def start_network(self, network_name): self.client.networks.create(network_name, driver="bridge") except APIError as e: # Assume already exists - print(e) + if e.response.status_code != 409: + raise e + print("Network already exists") return self.client.networks.get(network_name) def stop_network(self, network_name): self.client.networks.get(network_name).remove() - def get_image(self, dockerfile_info: DockerfileInfo): + def get_image( + self, + dockerfile_info: DockerfileInfo, + force_rebuild: bool = False + ): if dockerfile_info.dockerfile_directory: # Build image from Dockerfile self.client.images.build( - path=get_absolute_path(dockerfile_info.dockerfile_directory), - tag=dockerfile_info.image_tag + path=dockerfile_info.dockerfile_directory, + tag=dockerfile_info.image_tag, + nocache=force_rebuild, + rm=True # Remove intermediate images ) - else: - # Pull or use existing image + return + + if force_rebuild: + # Even if not from Dockerfile, re-pull to ensure freshness self.client.images.pull(dockerfile_info.image_tag) + return - def run_container( - self, - docker_info: DockerInfo, - network_name: str - ): - print(f"Running container {docker_info.name}") try: - container = self.client.containers.get(docker_info.name) - if container.status == 'running': - print(f"Container '{docker_info.name}' is already running") - return container - print("Restarting container...") - container.start() - return container + self.client.images.get(dockerfile_info.image_tag) + except NotFound: + self.client.images.pull(dockerfile_info.image_tag) + + def get_existing_container(self, docker_info_name: str): + try: + return self.client.containers.get(docker_info_name) except NotFound: - # Container does not exist; proceed to build/pull image and run - pass + return None - self.get_image(docker_info.dockerfile_info) + def create_container(self, docker_info: DockerInfo, network_name: str, force_rebuild: bool = False): + self.get_image( + docker_info.dockerfile_info, + force_rebuild=force_rebuild + ) container = self.client.containers.run( image=docker_info.dockerfile_info.image_tag, @@ -79,3 +86,33 @@ def run_container( healthcheck=docker_info.health_check_info.build_healthcheck() if docker_info.health_check_info is not None else None ) return container + + + def run_container( + self, + docker_info: DockerInfo, + network_name: str, + force_rebuild: bool = False + ): + print(f"Running container {docker_info.name}") + container = self.get_existing_container(docker_info.name) + if container is None: + return self.create_container( + docker_info=docker_info, + network_name=network_name, + force_rebuild=force_rebuild + ) + if force_rebuild: + print("Rebuilding container...") + container.remove(force=True) + return self.create_container( + docker_info=docker_info, + network_name=network_name, + force_rebuild=force_rebuild + ) + if container.status == 'running': + print(f"Container '{docker_info.name}' is already running") + return container + container.start() + return container + diff --git a/local_database/classes/DockerManager.py b/local_database/classes/DockerManager.py index ab43f852..ac294dc1 100644 --- a/local_database/classes/DockerManager.py +++ b/local_database/classes/DockerManager.py @@ -65,8 +65,13 @@ def get_image(self, dockerfile_info: DockerfileInfo): def run_container( self, docker_info: DockerInfo, + force_rebuild: bool = False ) -> DockerContainer: - raw_container = self.client.run_container(docker_info, self.network_name) + raw_container = self.client.run_container( + docker_info, + network_name=self.network_name, + force_rebuild=force_rebuild + ) return DockerContainer(self.client, raw_container) def get_containers(self): diff --git a/local_database/dump_data_sources_schema.py b/local_database/dump_data_sources_schema.py index 49627bc3..65079f53 100644 --- a/local_database/dump_data_sources_schema.py +++ b/local_database/dump_data_sources_schema.py @@ -6,7 +6,10 @@ def main(): docker_manager = DockerManager() data_sources_docker_info = get_data_sources_data_dumper_info() - container = docker_manager.run_container(data_sources_docker_info) + container = docker_manager.run_container( + data_sources_docker_info, + force_rebuild=True + ) try: container.run_command(DUMP_SH_DOCKER_PATH) finally: diff --git a/util/helper_functions.py b/util/helper_functions.py index 7d6c7f8d..deb6830b 100644 --- a/util/helper_functions.py +++ b/util/helper_functions.py @@ -1,10 +1,20 @@ import os from enum import Enum +from pathlib import Path from typing import Type from dotenv import load_dotenv from pydantic import BaseModel +def get_project_root(marker_files=(".project-root",)) -> Path: + current = Path(__file__).resolve() + for parent in [current] + list(current.parents): + if any((parent / marker).exists() for marker in marker_files): + return parent + raise FileNotFoundError("No project root found (missing marker files)") + +def project_path(*parts: str) -> Path: + return get_project_root().joinpath(*parts) def get_enum_values(enum: Type[Enum]): return [item.value for item in enum] From fbb329e6a6bd94cf5dea765badfc9e0a27e81ab1 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 22 Apr 2025 15:04:52 -0400 Subject: [PATCH 135/244] DRAFT --- .github/workflows/test_app.yml | 21 ++++--- ENV.md | 8 +-- .../DataDumper/dump/data_sources_db_dump.sql | Bin 0 -> 183850 bytes local_database/classes/DockerClient.py | 2 +- local_database/create_database.py | 57 ++++++++++++++---- local_database/setup.py | 5 +- 6 files changed, 66 insertions(+), 27 deletions(-) create mode 100644 local_database/DataDumper/dump/data_sources_db_dump.sql diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index 28a41e29..1dfdd466 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -35,19 +35,19 @@ jobs: --health-retries 5 steps: - - name: Set up FDW - run: | - ./local_database/setup_fdw.sh - env: - POSTGRES_HOST: postgres - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - name: Checkout repository uses: actions/checkout@v4 + + - name: Install PostgreSQL client tools + run: | + apt-get update + apt-get install -y postgresql-client + - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt + python -m local_database.create_database --use-shell - name: Run tests run: | pytest tests/test_automated @@ -55,8 +55,13 @@ jobs: env: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres - POSTGRES_DB: postgres + POSTGRES_DB: source_collector_test_db POSTGRES_HOST: postgres POSTGRES_PORT: 5432 + DATA_SOURCES_HOST: postgres + DATA_SOURCES_PORT: 5432 + DATA_SOURCES_USER: postgres + DATA_SOURCES_PASSWORD: postgres + DATA_SOURCES_DB: test_data_sources_db GOOGLE_API_KEY: TEST GOOGLE_CSE_ID: TEST diff --git a/ENV.md b/ENV.md index 3452ef7c..f145e20e 100644 --- a/ENV.md +++ b/ENV.md @@ -26,9 +26,9 @@ Please ensure these are properly defined in a `.env` file in the root directory. ## Data Dumper ``` -PROD_DATA_SOURCES_HOST=pdap-production-v2-do-user-8463429-0.k.db.ondigitalocean.com # The host of the production Data Sources Database -PROD_DATA_SOURCES_PORT=25060 # The port of the production Data Sources Database +PROD_DATA_SOURCES_HOST=127.0.0.1 # The host of the production Data Sources Database +PROD_DATA_SOURCES_PORT=1234 # The port of the production Data Sources Database PROD_DATA_SOURCES_USER=dump_user # The username for the production Data Sources Database -PROD_DATA_SOURCES_PASSWORD=GeriatricGeronimoGentrification # The password for the production Data Sources Database -PROD_DATA_SOURCES_DB=pdap_prod_v2_db # The database name for the production Data Sources Database +PROD_DATA_SOURCES_PASSWORD=password # The password for the production Data Sources Database +PROD_DATA_SOURCES_DB=db_name # The database name for the production Data Sources Database ``` \ No newline at end of file diff --git a/local_database/DataDumper/dump/data_sources_db_dump.sql b/local_database/DataDumper/dump/data_sources_db_dump.sql new file mode 100644 index 0000000000000000000000000000000000000000..aa27b60a2bd866ef4228dfc2af49a72617b141a3 GIT binary patch literal 183850 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 Isu&ah2SePWi2wiq literal 0 HcmV?d00001 diff --git a/local_database/classes/DockerClient.py b/local_database/classes/DockerClient.py index bfcc49df..ca9d535b 100644 --- a/local_database/classes/DockerClient.py +++ b/local_database/classes/DockerClient.py @@ -13,7 +13,7 @@ def run_command(self, command: str, container_id: str): exec_id = self.client.api.exec_create( container_id, cmd=command, - tty=True, + tty=False, stdin=False ) output_stream = self.client.api.exec_start(exec_id=exec_id, stream=True) diff --git a/local_database/create_database.py b/local_database/create_database.py index b23cc6d2..ea345fe0 100644 --- a/local_database/create_database.py +++ b/local_database/create_database.py @@ -1,8 +1,13 @@ +import argparse import os +import subprocess + import psycopg2 from psycopg2 import sql -from local_database.constants import LOCAL_DATA_SOURCES_DB_NAME, LOCAL_SOURCE_COLLECTOR_DB_NAME +from local_database.DockerInfos import get_data_sources_data_dumper_info +from local_database.classes.DockerManager import DockerManager +from local_database.constants import LOCAL_DATA_SOURCES_DB_NAME, LOCAL_SOURCE_COLLECTOR_DB_NAME, RESTORE_SH_DOCKER_PATH # Defaults (can be overridden via environment variables) POSTGRES_HOST = os.getenv("POSTGRES_HOST", "host.docker.internal") @@ -45,17 +50,6 @@ def create_database(db_name): except Exception as e: print(f"❌ Failed to create {db_name}: {e}") -def create_database_tables(): - conn = connect(LOCAL_DATA_SOURCES_DB_NAME) - with conn.cursor() as cur: - cur.execute(""" - CREATE TABLE IF NOT EXISTS test_table ( - id SERIAL PRIMARY KEY, - name VARCHAR(255) NOT NULL - ) - """) - conn.commit() - def main(): print("Creating databases...") create_database(LOCAL_DATA_SOURCES_DB_NAME) @@ -63,3 +57,42 @@ def main(): if __name__ == "__main__": main() + parser = argparse.ArgumentParser() + + parser.add_argument( + "--use-shell", + action="store_true", + help="Use shell to run restore script" + ) + + args = parser.parse_args() + + if args.use_shell: + subprocess.run( + [ + "bash", + "-c", + RESTORE_SH_DOCKER_PATH + ], + env={ + "RESTORE_HOST": POSTGRES_HOST, + "RESTORE_USER": POSTGRES_USER, + "RESTORE_PORT": POSTGRES_PORT, + "RESTORE_DB_NAME": LOCAL_DATA_SOURCES_DB_NAME, + "RESTORE_PASSWORD": POSTGRES_PASSWORD + } + ) + os.system(RESTORE_SH_DOCKER_PATH) + exit(0) + + docker_manager = DockerManager() + data_sources_docker_info = get_data_sources_data_dumper_info() + container = docker_manager.run_container( + data_sources_docker_info, + force_rebuild=True + ) + try: + container.run_command(RESTORE_SH_DOCKER_PATH) + finally: + container.stop() + diff --git a/local_database/setup.py b/local_database/setup.py index a720ebc2..99ff1da9 100644 --- a/local_database/setup.py +++ b/local_database/setup.py @@ -29,8 +29,9 @@ def wait_for_postgres(container_id): run_command(f"docker exec {container_id} pg_isready -U postgres", check=True) print("Postgres is ready!") return - except subprocess.CalledProcessError: - print(f"Still waiting... ({i+1}/{MAX_RETRIES})") + except subprocess.CalledProcessError as e: + print(f"Still waiting... ({i + 1}/{MAX_RETRIES}) Exit code: {e.returncode}") + print(f"Output: {e.output if hasattr(e, 'output') else 'N/A'}") time.sleep(SLEEP_SECONDS) print("Postgres did not become ready in time.") sys.exit(1) From e3c00918c6ae571b64c144cde786399114f9bd0d Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 22 Apr 2025 15:08:39 -0400 Subject: [PATCH 136/244] DRAFT --- .github/workflows/test_app.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index 1dfdd466..8730d331 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -48,6 +48,17 @@ jobs: python -m pip install --upgrade pip pip install -r requirements.txt python -m local_database.create_database --use-shell + env: + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + POSTGRES_DB: source_collector_test_db + POSTGRES_HOST: postgres + POSTGRES_PORT: 5432 + DATA_SOURCES_HOST: postgres + DATA_SOURCES_PORT: 5432 + DATA_SOURCES_USER: postgres + DATA_SOURCES_PASSWORD: postgres + DATA_SOURCES_DB: test_data_sources_db - name: Run tests run: | pytest tests/test_automated From 27ef0068d0f40089be6bd6b1e738c87ca53a1b6a Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 22 Apr 2025 15:13:28 -0400 Subject: [PATCH 137/244] DRAFT --- .github/workflows/test_app.yml | 56 ++++++++++------------------------ 1 file changed, 16 insertions(+), 40 deletions(-) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index 8730d331..c3c54b83 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -1,21 +1,6 @@ -# This workflow will test the Source Collector App -# Utilizing the docker-compose file in the root directory name: Test Source Collector App -on: pull_request -#jobs: -# build: -# runs-on: ubuntu-latest -# steps: -# - name: Checkout repository -# uses: actions/checkout@v4 -# - name: Run docker-compose -# uses: hoverkraft-tech/compose-action@v2.0.1 -# with: -# compose-file: "docker-compose.yml" -# - name: Execute tests in the running service -# run: | -# docker ps -a && docker exec data-source-identification-app-1 pytest /app/tests/test_automated +on: pull_request jobs: container-job: @@ -34,6 +19,20 @@ jobs: --health-timeout 5s --health-retries 5 + env: # <-- Consolidated env block here + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + POSTGRES_DB: source_collector_test_db + POSTGRES_HOST: postgres + POSTGRES_PORT: 5432 + DATA_SOURCES_HOST: postgres + DATA_SOURCES_PORT: 5432 + DATA_SOURCES_USER: postgres + DATA_SOURCES_PASSWORD: postgres + DATA_SOURCES_DB: test_data_sources_db + GOOGLE_API_KEY: TEST + GOOGLE_CSE_ID: TEST + steps: - name: Checkout repository uses: actions/checkout@v4 @@ -48,31 +47,8 @@ jobs: python -m pip install --upgrade pip pip install -r requirements.txt python -m local_database.create_database --use-shell - env: - POSTGRES_PASSWORD: postgres - POSTGRES_USER: postgres - POSTGRES_DB: source_collector_test_db - POSTGRES_HOST: postgres - POSTGRES_PORT: 5432 - DATA_SOURCES_HOST: postgres - DATA_SOURCES_PORT: 5432 - DATA_SOURCES_USER: postgres - DATA_SOURCES_PASSWORD: postgres - DATA_SOURCES_DB: test_data_sources_db + - name: Run tests run: | pytest tests/test_automated pytest tests/test_alembic - env: - POSTGRES_PASSWORD: postgres - POSTGRES_USER: postgres - POSTGRES_DB: source_collector_test_db - POSTGRES_HOST: postgres - POSTGRES_PORT: 5432 - DATA_SOURCES_HOST: postgres - DATA_SOURCES_PORT: 5432 - DATA_SOURCES_USER: postgres - DATA_SOURCES_PASSWORD: postgres - DATA_SOURCES_DB: test_data_sources_db - GOOGLE_API_KEY: TEST - GOOGLE_CSE_ID: TEST From f4d41345806031dc0775fe2f64ea30620bd93f51 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 22 Apr 2025 15:16:16 -0400 Subject: [PATCH 138/244] DRAFT --- local_database/create_database.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/local_database/create_database.py b/local_database/create_database.py index ea345fe0..58b15508 100644 --- a/local_database/create_database.py +++ b/local_database/create_database.py @@ -77,7 +77,7 @@ def main(): env={ "RESTORE_HOST": POSTGRES_HOST, "RESTORE_USER": POSTGRES_USER, - "RESTORE_PORT": POSTGRES_PORT, + "RESTORE_PORT": str(POSTGRES_PORT), "RESTORE_DB_NAME": LOCAL_DATA_SOURCES_DB_NAME, "RESTORE_PASSWORD": POSTGRES_PASSWORD } From 861ea7198147ee38973f8059ca433b4e8f7c2dbe Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 22 Apr 2025 16:34:20 -0400 Subject: [PATCH 139/244] feat(database): begin setting up FDW - initial link --- ENV.md | 20 ++++++++++++++----- ...3f1272f94b9_set_up_foreign_data_wrapper.py | 10 +++++----- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/ENV.md b/ENV.md index f145e20e..fdd7d029 100644 --- a/ENV.md +++ b/ENV.md @@ -23,12 +23,22 @@ Please ensure these are properly defined in a `.env` file in the root directory. [^1:] The user account in question will require elevated permissions to access certain endpoints. At a minimum, the user will require the `source_collector` and `db_write` permissions. +## Foreign Data Wrapper (FDW) +``` +FDW_DATA_SOURCES_HOST=127.0.0.1 # The host of the Data Sources Database, used for FDW setup +FDW_DATA_SOURCES_PORT=1234 # The port of the Data Sources Database, used for FDW setup +FDW_DATA_SOURCES_USER=fdw_user # The username for the Data Sources Database, used for FDW setup +FDW_DATA_SOURCES_PASSWORD=password # The password for the Data Sources Database, used for FDW setup +FDW_DATA_SOURCES_DB=db_name # The database name for the Data Sources Database, used for FDW setup + +``` + ## Data Dumper ``` -PROD_DATA_SOURCES_HOST=127.0.0.1 # The host of the production Data Sources Database -PROD_DATA_SOURCES_PORT=1234 # The port of the production Data Sources Database -PROD_DATA_SOURCES_USER=dump_user # The username for the production Data Sources Database -PROD_DATA_SOURCES_PASSWORD=password # The password for the production Data Sources Database -PROD_DATA_SOURCES_DB=db_name # The database name for the production Data Sources Database +PROD_DATA_SOURCES_HOST=127.0.0.1 # The host of the production Data Sources Database, used for Data Dumper +PROD_DATA_SOURCES_PORT=1234 # The port of the production Data Sources Database, used for Data Dumper +PROD_DATA_SOURCES_USER=dump_user # The username for the production Data Sources Database, used for Data Dumper +PROD_DATA_SOURCES_PASSWORD=password # The password for the production Data Sources Database, used for Data Dumper +PROD_DATA_SOURCES_DB=db_name # The database name for the production Data Sources Database, used for Data Dumper ``` \ No newline at end of file diff --git a/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py b/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py index 5c1adf18..1b73f5f4 100644 --- a/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py +++ b/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py @@ -21,11 +21,11 @@ def upgrade() -> None: load_dotenv() - remote_host = os.getenv("DATA_SOURCES_HOST") - user = os.getenv("DATA_SOURCES_USER") - password = os.getenv("DATA_SOURCES_PASSWORD") - db_name = os.getenv("DATA_SOURCES_DB") - port = os.getenv("DATA_SOURCES_PORT") + remote_host = os.getenv("FDW_DATA_SOURCES_HOST") + user = os.getenv("FDW_DATA_SOURCES_USER") + password = os.getenv("FDW_DATA_SOURCES_PASSWORD") + db_name = os.getenv("FDW_DATA_SOURCES_DB") + port = os.getenv("FDW_DATA_SOURCES_PORT") op.execute(f"CREATE EXTENSION IF NOT EXISTS postgres_fdw;") From 8e47a33fdd9b9c20cbca934f21b59bf8874567e2 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 22 Apr 2025 16:36:17 -0400 Subject: [PATCH 140/244] feat(database): begin setting up FDW - initial link --- .github/workflows/test_app.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index c3c54b83..c869304a 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -30,6 +30,11 @@ jobs: DATA_SOURCES_USER: postgres DATA_SOURCES_PASSWORD: postgres DATA_SOURCES_DB: test_data_sources_db + FDW_DATA_SOURCES_HOST: postgres + FDW_DATA_SOURCES_PORT: 5432 + FDW_DATA_SOURCES_USER: postgres + FDW_DATA_SOURCES_PASSWORD: postgres + FDW_DATA_SOURCES_DB: test_data_sources_db GOOGLE_API_KEY: TEST GOOGLE_CSE_ID: TEST From f12ef61dafbc74c018d935f67dadc853d8e8afb2 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 22 Apr 2025 16:52:19 -0400 Subject: [PATCH 141/244] feat(database): begin setting up FDW - initial link --- .../2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py b/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py index 1b73f5f4..fc90db70 100644 --- a/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py +++ b/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py @@ -36,7 +36,7 @@ def upgrade() -> None: """) op.execute(f""" - CREATE USER MAPPING FOR {user} + CREATE USER MAPPING FOR PUBLIC SERVER data_sources_server OPTIONS (user '{user}', password '{password}'); """) From af7f0e05b5d7395888e4bf3061a76f238dded085 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 22 Apr 2025 16:57:31 -0400 Subject: [PATCH 142/244] feat(database): begin setting up FDW - initial link --- .../2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py b/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py index fc90db70..737b49a0 100644 --- a/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py +++ b/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py @@ -236,7 +236,7 @@ def downgrade() -> None: # Drop user mapping user = os.getenv("DATA_SOURCES_USER") op.execute(f""" - DROP USER MAPPING FOR {user} SERVER data_sources_server; + DROP USER MAPPING FOR PUBLIC SERVER data_sources_server; """) # Drop server From b8d33223d880c2d92d4e343ef70b6830ad590978 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 22 Apr 2025 17:38:10 -0400 Subject: [PATCH 143/244] fix(remove FDW setup): --- ...3f1272f94b9_set_up_foreign_data_wrapper.py | 250 ------------------ 1 file changed, 250 deletions(-) delete mode 100644 alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py diff --git a/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py b/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py deleted file mode 100644 index 737b49a0..00000000 --- a/alembic/versions/2025_04_21_1817-13f1272f94b9_set_up_foreign_data_wrapper.py +++ /dev/null @@ -1,250 +0,0 @@ -"""Set up foreign data wrapper - -Revision ID: 13f1272f94b9 -Revises: e285e6e7cf71 -Create Date: 2025-04-21 18:17:34.593973 - -""" -import os -from typing import Sequence, Union - -from alembic import op -from dotenv import load_dotenv - -# revision identifiers, used by Alembic. -revision: str = '13f1272f94b9' -down_revision: Union[str, None] = 'e285e6e7cf71' -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - - load_dotenv() - remote_host = os.getenv("FDW_DATA_SOURCES_HOST") - user = os.getenv("FDW_DATA_SOURCES_USER") - password = os.getenv("FDW_DATA_SOURCES_PASSWORD") - db_name = os.getenv("FDW_DATA_SOURCES_DB") - port = os.getenv("FDW_DATA_SOURCES_PORT") - - op.execute(f"CREATE EXTENSION IF NOT EXISTS postgres_fdw;") - - op.execute(f""" - CREATE SERVER data_sources_server - FOREIGN DATA WRAPPER postgres_fdw - OPTIONS (host '{remote_host}', dbname '{db_name}', port '{port}'); - """) - - op.execute(f""" - CREATE USER MAPPING FOR PUBLIC - SERVER data_sources_server - OPTIONS (user '{user}', password '{password}'); - """) - - op.execute('CREATE SCHEMA if not exists "remote";') - - # Users table - op.execute(""" - CREATE FOREIGN TABLE IF NOT EXISTS "remote".users - ( - id bigint, - created_at timestamp with time zone, - updated_at timestamp with time zone, - email text, - password_digest text, - api_key character varying, - role text - ) - SERVER data_sources_server - OPTIONS ( - schema_name 'public', - table_name 'users' - ); - """) - - # Agencies - # -Enums - # --Jurisdiction Type - op.execute(""" - CREATE TYPE jurisdiction_type AS ENUM - ('school', 'county', 'local', 'port', 'tribal', 'transit', 'state', 'federal'); - """) - # --Agency Type - op.execute(""" - CREATE TYPE agency_type AS ENUM - ('incarceration', 'law enforcement', 'aggregated', 'court', 'unknown'); - """) - - # -Table - op.execute(""" - CREATE FOREIGN TABLE IF NOT EXISTS "remote".agencies - ( - name character , - homepage_url character , - jurisdiction_type jurisdiction_type , - lat double precision, - lng double precision, - defunct_year character , - airtable_uid character , - agency_type agency_type , - multi_agency boolean , - no_web_presence boolean , - airtable_agency_last_modified timestamp with time zone, - rejection_reason character , - last_approval_editor character , - submitter_contact character, - agency_created timestamp with time zone, - id integer, - approval_status text, - creator_user_id integer - ) - SERVER data_sources_server - OPTIONS ( - schema_name 'public', - table_name 'agencies' - ); - """) - - # Locations Table - # -Enums - # --Location Type - op.execute(""" - CREATE TYPE location_type AS ENUM - ('State', 'County', 'Locality'); - """) - - # -Table - op.execute(""" - CREATE FOREIGN TABLE IF NOT EXISTS "remote".locations - ( - id bigint, - type location_type, - state_id bigint, - county_id bigint, - locality_id bigint - ) - SERVER data_sources_server - OPTIONS ( - schema_name 'public', - table_name 'locations' - ); - """) - - # Data Sources Table - - # -Enums - # -- access_type - op.execute(""" - CREATE TYPE access_type AS ENUM - ('Download', 'Webpage', 'API'); - """) - - # -- agency_aggregation - op.execute(""" - CREATE TYPE agency_aggregation AS ENUM - ('county', 'local', 'state', 'federal'); - """) - # -- update_method - op.execute(""" - CREATE TYPE update_method AS ENUM - ('Insert', 'No updates', 'Overwrite'); - """) - - # -- detail_level - op.execute(""" - CREATE TYPE detail_level AS ENUM - ('Individual record', 'Aggregated records', 'Summarized totals'); - """) - - # -- retention_schedule - op.execute(""" - CREATE TYPE retention_schedule AS ENUM - ('< 1 day', '1 day', '< 1 week', '1 week', '1 month', '< 1 year', '1-10 years', '> 10 years', 'Future only'); - """) - - # -Table - op.execute(""" - CREATE FOREIGN TABLE IF NOT EXISTS "remote".data_sources - ( - name character varying , - description character , - source_url character , - agency_supplied boolean, - supplying_entity character , - agency_originated boolean, - agency_aggregation agency_aggregation, - coverage_start date, - coverage_end date, - updated_at timestamp with time zone , - detail_level detail_level, - record_download_option_provided boolean, - data_portal_type character , - update_method update_method, - readme_url character , - originating_entity character , - retention_schedule retention_schedule, - airtable_uid character , - scraper_url character , - created_at timestamp with time zone , - submission_notes character , - rejection_note character , - submitter_contact_info character , - agency_described_not_in_database character , - data_portal_type_other character , - data_source_request character , - broken_source_url_as_of timestamp with time zone, - access_notes text , - url_status text , - approval_status text , - record_type_id integer, - access_types access_type[], - tags text[] , - record_formats text[] , - id integer, - approval_status_updated_at timestamp with time zone , - last_approval_editor bigint - ) - SERVER data_sources_server - OPTIONS ( - schema_name 'public', - table_name 'data_sources' - ); - """) - - - -def downgrade() -> None: - # Drop foreign schema - op.execute('DROP SCHEMA IF EXISTS "remote" CASCADE;') - - # Drop enums - enums = [ - "jurisdiction_type", - "agency_type", - "location_type", - "access_type", - "agency_aggregation", - "update_method", - "detail_level", - "retention_schedule", - ] - for enum in enums: - op.execute(f""" - DROP TYPE IF EXISTS {enum}; - """) - - # Drop user mapping - user = os.getenv("DATA_SOURCES_USER") - op.execute(f""" - DROP USER MAPPING FOR PUBLIC SERVER data_sources_server; - """) - - # Drop server - op.execute(""" - DROP SERVER IF EXISTS data_sources_server CASCADE; - """) - - # Drop FDW - op.execute(""" - DROP EXTENSION IF EXISTS postgres_fdw CASCADE; - """) From 8e013bb75f3e5fab40ab9b2a634d71e4cd055661 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 22 Apr 2025 17:39:15 -0400 Subject: [PATCH 144/244] fix(database): Remove FDW setup and tests --- .github/workflows/test_app.yml | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index c869304a..ab1edff9 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -25,16 +25,6 @@ jobs: POSTGRES_DB: source_collector_test_db POSTGRES_HOST: postgres POSTGRES_PORT: 5432 - DATA_SOURCES_HOST: postgres - DATA_SOURCES_PORT: 5432 - DATA_SOURCES_USER: postgres - DATA_SOURCES_PASSWORD: postgres - DATA_SOURCES_DB: test_data_sources_db - FDW_DATA_SOURCES_HOST: postgres - FDW_DATA_SOURCES_PORT: 5432 - FDW_DATA_SOURCES_USER: postgres - FDW_DATA_SOURCES_PASSWORD: postgres - FDW_DATA_SOURCES_DB: test_data_sources_db GOOGLE_API_KEY: TEST GOOGLE_CSE_ID: TEST @@ -42,16 +32,10 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Install PostgreSQL client tools - run: | - apt-get update - apt-get install -y postgresql-client - - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt - python -m local_database.create_database --use-shell - name: Run tests run: | From fac193107618b6b76ecca24e991dbb4c3e7a2ac8 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 22 Apr 2025 17:42:08 -0400 Subject: [PATCH 145/244] fix(database): Remove FDW setup and tests --- .github/workflows/test_app.yml | 2 +- .../DataDumper/dump/data_sources_db_dump.sql | Bin 183850 -> 0 bytes local_database/DockerInfos.py | 38 --------------- local_database/constants.py | 1 - local_database/create_database.py | 44 +----------------- local_database/dump_data_sources_schema.py | 21 --------- 6 files changed, 2 insertions(+), 104 deletions(-) delete mode 100644 local_database/DataDumper/dump/data_sources_db_dump.sql delete mode 100644 local_database/dump_data_sources_schema.py diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index ab1edff9..73bc5738 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -19,7 +19,7 @@ jobs: --health-timeout 5s --health-retries 5 - env: # <-- Consolidated env block here + env: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres POSTGRES_DB: source_collector_test_db diff --git a/local_database/DataDumper/dump/data_sources_db_dump.sql b/local_database/DataDumper/dump/data_sources_db_dump.sql deleted file mode 100644 index aa27b60a2bd866ef4228dfc2af49a72617b141a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183850 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 Isu&ah2SePWi2wiq diff --git a/local_database/DockerInfos.py b/local_database/DockerInfos.py index 3b1c071b..17180bab 100644 --- a/local_database/DockerInfos.py +++ b/local_database/DockerInfos.py @@ -1,5 +1,4 @@ from local_database.DTOs import DockerInfo, DockerfileInfo, HealthCheckInfo, VolumeInfo -from local_database.constants import LOCAL_DATA_SOURCES_DB_NAME from util.helper_functions import get_from_env, project_path @@ -26,43 +25,6 @@ def get_database_docker_info() -> DockerInfo: ) ) - -def get_data_sources_data_dumper_info() -> DockerInfo: - return DockerInfo( - dockerfile_info=DockerfileInfo( - image_tag="datadumper", - dockerfile_directory=str(project_path( - "local_database", - "DataDumper" - )) - ), - volume_info=VolumeInfo( - host_path=str(project_path( - "local_database", - "DataDumper", - "dump" - )), - container_path="/dump" - ), - name="datadumper", - environment={ - "DUMP_HOST": get_from_env("PROD_DATA_SOURCES_HOST"), - "DUMP_USER": get_from_env("PROD_DATA_SOURCES_USER"), - "DUMP_PASSWORD": get_from_env("PROD_DATA_SOURCES_PASSWORD"), - "DUMP_NAME": get_from_env("PROD_DATA_SOURCES_DB"), - "DUMP_PORT": get_from_env("PROD_DATA_SOURCES_PORT"), - "RESTORE_HOST": get_from_env("POSTGRES_HOST"), - "RESTORE_USER": get_from_env("POSTGRES_USER"), - "RESTORE_PORT": get_from_env("POSTGRES_PORT"), - "RESTORE_DB_NAME": LOCAL_DATA_SOURCES_DB_NAME, - "RESTORE_PASSWORD": get_from_env("POSTGRES_PASSWORD"), - "DUMP_FILE": "/dump/data_sources_db_dump.sql", - "DUMP_SCHEMA_ONLY": "true" - }, - command="bash" - ) - - def get_source_collector_data_dumper_info() -> DockerInfo: return DockerInfo( dockerfile_info=DockerfileInfo( diff --git a/local_database/constants.py b/local_database/constants.py index d5c96e72..51147717 100644 --- a/local_database/constants.py +++ b/local_database/constants.py @@ -1,4 +1,3 @@ -LOCAL_DATA_SOURCES_DB_NAME = "test_data_sources_db" LOCAL_SOURCE_COLLECTOR_DB_NAME = "source_collector_test_db" DUMP_SH_DOCKER_PATH = "/usr/local/bin/dump.sh" diff --git a/local_database/create_database.py b/local_database/create_database.py index 58b15508..67eae70b 100644 --- a/local_database/create_database.py +++ b/local_database/create_database.py @@ -5,9 +5,7 @@ import psycopg2 from psycopg2 import sql -from local_database.DockerInfos import get_data_sources_data_dumper_info -from local_database.classes.DockerManager import DockerManager -from local_database.constants import LOCAL_DATA_SOURCES_DB_NAME, LOCAL_SOURCE_COLLECTOR_DB_NAME, RESTORE_SH_DOCKER_PATH +from local_database.constants import LOCAL_SOURCE_COLLECTOR_DB_NAME, RESTORE_SH_DOCKER_PATH # Defaults (can be overridden via environment variables) POSTGRES_HOST = os.getenv("POSTGRES_HOST", "host.docker.internal") @@ -52,47 +50,7 @@ def create_database(db_name): def main(): print("Creating databases...") - create_database(LOCAL_DATA_SOURCES_DB_NAME) create_database(LOCAL_SOURCE_COLLECTOR_DB_NAME) if __name__ == "__main__": main() - parser = argparse.ArgumentParser() - - parser.add_argument( - "--use-shell", - action="store_true", - help="Use shell to run restore script" - ) - - args = parser.parse_args() - - if args.use_shell: - subprocess.run( - [ - "bash", - "-c", - RESTORE_SH_DOCKER_PATH - ], - env={ - "RESTORE_HOST": POSTGRES_HOST, - "RESTORE_USER": POSTGRES_USER, - "RESTORE_PORT": str(POSTGRES_PORT), - "RESTORE_DB_NAME": LOCAL_DATA_SOURCES_DB_NAME, - "RESTORE_PASSWORD": POSTGRES_PASSWORD - } - ) - os.system(RESTORE_SH_DOCKER_PATH) - exit(0) - - docker_manager = DockerManager() - data_sources_docker_info = get_data_sources_data_dumper_info() - container = docker_manager.run_container( - data_sources_docker_info, - force_rebuild=True - ) - try: - container.run_command(RESTORE_SH_DOCKER_PATH) - finally: - container.stop() - diff --git a/local_database/dump_data_sources_schema.py b/local_database/dump_data_sources_schema.py deleted file mode 100644 index 65079f53..00000000 --- a/local_database/dump_data_sources_schema.py +++ /dev/null @@ -1,21 +0,0 @@ -from local_database.DockerInfos import get_data_sources_data_dumper_info -from local_database.classes.DockerManager import DockerManager -from local_database.constants import DUMP_SH_DOCKER_PATH - - -def main(): - docker_manager = DockerManager() - data_sources_docker_info = get_data_sources_data_dumper_info() - container = docker_manager.run_container( - data_sources_docker_info, - force_rebuild=True - ) - try: - container.run_command(DUMP_SH_DOCKER_PATH) - finally: - container.stop() - - - -if __name__ == "__main__": - main() \ No newline at end of file From 4799d7eb8763f4776cd6ffb378c32bcb3d5cfdbf Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 22 Apr 2025 17:42:45 -0400 Subject: [PATCH 146/244] fix(database): Remove FDW setup and tests --- .github/workflows/test_app.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index 73bc5738..ae0bb121 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -22,7 +22,7 @@ jobs: env: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres - POSTGRES_DB: source_collector_test_db + POSTGRES_DB: postgres POSTGRES_HOST: postgres POSTGRES_PORT: 5432 GOOGLE_API_KEY: TEST From 79ccfba9fd1c2a87d172defc55cd9b0366e006aa Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 2 May 2025 18:07:31 -0400 Subject: [PATCH 147/244] Update test_app.yml to use uv --- .github/workflows/test_app.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index ae0bb121..a14541f0 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -35,7 +35,8 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -r requirements.txt + pip install uv + uv pip install -r requirements.txt - name: Run tests run: | From 2f7abc220b267ec30923a724406f5f1caf94ddf6 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 2 May 2025 18:11:55 -0400 Subject: [PATCH 148/244] Update test_app.yml to use uv --- .github/workflows/test_app.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index a14541f0..c7283ec3 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -36,7 +36,7 @@ jobs: run: | python -m pip install --upgrade pip pip install uv - uv pip install -r requirements.txt + uv --system pip install -r requirements.txt - name: Run tests run: | From e8575eb6562b2212041dbfde986fbe01bac5aa29 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 2 May 2025 18:13:18 -0400 Subject: [PATCH 149/244] Update test_app.yml to use uv --- .github/workflows/test_app.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index c7283ec3..63e33382 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -35,8 +35,8 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install uv - uv --system pip install -r requirements.txt + pip install uv --system + uv system pip install -r requirements.txt - name: Run tests run: | From d8671056a341cdba0a208b8ad704b734e6d8ac52 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 2 May 2025 18:15:45 -0400 Subject: [PATCH 150/244] Update test_app.yml to use uv --- .github/workflows/test_app.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index 63e33382..a14541f0 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -35,8 +35,8 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install uv --system - uv system pip install -r requirements.txt + pip install uv + uv pip install -r requirements.txt - name: Run tests run: | From 88bad7c035fa74720f91151410f888492539df88 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 2 May 2025 18:21:31 -0400 Subject: [PATCH 151/244] Update test_app.yml to use uv --- .github/workflows/test_app.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index a14541f0..e34ed390 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -36,8 +36,7 @@ jobs: run: | python -m pip install --upgrade pip pip install uv - uv pip install -r requirements.txt - + uv pip install --system -r requirements.txt - name: Run tests run: | pytest tests/test_automated From a6c79aa77bcfa8190866d6edcded19caeeff8f97 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 2 May 2025 18:28:08 -0400 Subject: [PATCH 152/244] Update test_app.yml to use uv --- .github/workflows/test_app.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index e34ed390..ea3ef6fc 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -32,11 +32,16 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Install uv + - name: Install uv and set the python version + uses: astral-sh/setup-uv@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies run: | - python -m pip install --upgrade pip - pip install uv uv pip install --system -r requirements.txt + - name: Run tests run: | pytest tests/test_automated From babcde8ffeb9bbc955213d58a71c973f53357b67 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 2 May 2025 18:07:31 -0400 Subject: [PATCH 153/244] Update test_app.yml to use uv --- .github/workflows/test_app.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index ae0bb121..ea3ef6fc 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -32,10 +32,15 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Install uv + - name: Install uv and set the python version + uses: astral-sh/setup-uv@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies run: | - python -m pip install --upgrade pip - pip install -r requirements.txt + uv pip install --system -r requirements.txt - name: Run tests run: | From 7a8b3736f770a5d9c39e0b4c3c30846b70cd23a3 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 2 May 2025 18:31:06 -0400 Subject: [PATCH 154/244] Update test_app.yml to use uv --- .github/workflows/test_app.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index ea3ef6fc..5b4da872 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -32,7 +32,6 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Install uv - name: Install uv and set the python version uses: astral-sh/setup-uv@v5 with: From ac85798660aa7e74e704738e9ea7e9c0635c9e18 Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 2 May 2025 18:36:13 -0400 Subject: [PATCH 155/244] Update Dockerfile to use uv --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 6718a121..5352bc99 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,7 @@ # Dockerfile for Source Collector FastAPI app FROM python:3.11.9-slim +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ # Set working directory WORKDIR /app @@ -8,7 +9,7 @@ WORKDIR /app COPY requirements.txt ./requirements.txt # Install dependencies -RUN pip install --no-cache-dir --prefer-binary -r requirements.txt +RUN uv pip install --system -r requirements.txt RUN playwright install chromium RUN playwright install-deps chromium From 220c3196705aac9d9e47939b0391d86a98c7b4fa Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 2 May 2025 21:22:27 -0400 Subject: [PATCH 156/244] DRAFT --- api/routes/collector.py | 15 ++++++ collector_db/AsyncDatabaseClient.py | 53 +++++++++++++++++++ collector_db/DatabaseClient.py | 13 ++--- collector_manager/enums.py | 1 + core/AsyncCore.py | 12 ++++- core/DTOs/ManualBatchInputDTO.py | 24 +++++++++ core/DTOs/ManualBatchOutputDTO.py | 6 +++ pyproject.toml | 3 ++ .../integration/api/test_manual_batch.py | 18 +++++++ 9 files changed, 138 insertions(+), 7 deletions(-) create mode 100644 core/DTOs/ManualBatchInputDTO.py create mode 100644 core/DTOs/ManualBatchOutputDTO.py create mode 100644 pyproject.toml create mode 100644 tests/test_automated/integration/api/test_manual_batch.py diff --git a/api/routes/collector.py b/api/routes/collector.py index e2789443..b7628c4f 100644 --- a/api/routes/collector.py +++ b/api/routes/collector.py @@ -6,6 +6,7 @@ from collector_manager.enums import CollectorType from core.AsyncCore import AsyncCore from core.DTOs.CollectorStartInfo import CollectorStartInfo +from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO from security_manager.SecurityManager import AccessInfo, get_access_info from source_collectors.auto_googler.DTOs import AutoGooglerInputDTO from source_collectors.ckan.DTOs import CKANInputDTO @@ -122,4 +123,18 @@ async def start_muckrock_all_foia_collector( collector_type=CollectorType.MUCKROCK_ALL_SEARCH, dto=dto, user_id=access_info.user_id + ) + +@collector_router.post("/manual") +async def upload_manual_collector( + dto: ManualBatchInputDTO, + core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info), +) -> CollectorStartInfo: + """ + Uploads a manual "collector" with existing data + """ + return await core.upload_manual_batch( + dto=dto, + user_id=access_info.user_id ) \ No newline at end of file diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 46cd89db..4bc60de7 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -41,6 +41,8 @@ from core.DTOs.GetTasksResponse import GetTasksResponse, GetTasksResponseTaskInfo from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseErrorInfo, \ GetURLsResponseInnerInfo +from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO +from core.DTOs.ManualBatchOutputDTO import ManualBatchOutputDTO from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO, SubmittedURLInfo @@ -1719,6 +1721,57 @@ async def add_all_annotations_to_url( ) session.add(agency_suggestion) + @session_manager + async def upload_manual_batch( + self, + session: AsyncSession, + user_id: int, + dto: ManualBatchInputDTO + ) -> ManualBatchOutputDTO: + batch = Batch( + strategy=CollectorType.MANUAL.value, + status=BatchStatus.READY_TO_LABEL.value, + parameters={ + "name": dto.name + }, + user_id=user_id + ) + session.add(batch) + await session.flush() + + batch_id = batch.id + url_ids = [] + + for entry in dto.entries: + url = URL( + url=entry.url, + name=entry.name, + description=entry.description, + batch_id=batch_id, + collector_metadata=entry.collector_metadata, + outcome=URLStatus.PENDING.value, + record_type=entry.record_type.value if entry.record_type is not None else None, + ) + + session.add(url) + try: + await session.flush() + except IntegrityError: + await session.rollback() + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"URL already exists: {entry.url}" + ) + await session.flush() + optional_metadata = URLOptionalDataSourceMetadata( + url_id=url.id, + record_formats=entry.record_formats, + data_portal_type=entry.data_portal_type, + supplying_entity=entry.supplying_entity, + ) + session.add(optional_metadata) + url_ids.append(url.id) + return ManualBatchOutputDTO(batch_id=batch_id, urls=url_ids) diff --git a/collector_db/DatabaseClient.py b/collector_db/DatabaseClient.py index 3999dbc9..43ec9628 100644 --- a/collector_db/DatabaseClient.py +++ b/collector_db/DatabaseClient.py @@ -1,21 +1,22 @@ -from datetime import datetime, timedelta from functools import wraps from typing import Optional, List -from sqlalchemy import create_engine, Row +from sqlalchemy import create_engine from sqlalchemy.exc import IntegrityError -from sqlalchemy.orm import sessionmaker, scoped_session, aliased +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import sessionmaker, scoped_session from collector_db.ConfigManager import ConfigManager from collector_db.DTOs.BatchInfo import BatchInfo -from collector_db.DTOs.DuplicateInfo import DuplicateInfo, DuplicateInsertInfo +from collector_db.DTOs.DuplicateInfo import DuplicateInsertInfo from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo -from collector_db.DTOs.LogInfo import LogInfo, LogOutputInfo +from collector_db.DTOs.LogInfo import LogInfo from collector_db.DTOs.URLInfo import URLInfo from collector_db.DTOs.URLMapping import URLMapping -from collector_db.helper_functions import get_postgres_connection_string from collector_db.models import Base, Batch, URL, Log, Duplicate from collector_manager.enums import CollectorType +from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO +from core.DTOs.ManualBatchOutputDTO import ManualBatchOutputDTO from core.EnvVarManager import EnvVarManager from core.enums import BatchStatus diff --git a/collector_manager/enums.py b/collector_manager/enums.py index 692b97e5..5b89ffe2 100644 --- a/collector_manager/enums.py +++ b/collector_manager/enums.py @@ -8,6 +8,7 @@ class CollectorType(Enum): MUCKROCK_COUNTY_SEARCH = "muckrock_county_search" MUCKROCK_ALL_SEARCH = "muckrock_all_search" CKAN = "ckan" + MANUAL = "manual" class URLStatus(Enum): PENDING = "pending" diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 92f097db..2eba5d04 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -22,6 +22,8 @@ from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo +from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO +from core.DTOs.ManualBatchOutputDTO import ManualBatchOutputDTO from core.DTOs.MessageResponse import MessageResponse from core.TaskManager import TaskManager from core.enums import BatchStatus, RecordType @@ -270,5 +272,13 @@ async def reject_url( user_id=access_info.user_id ) - + async def upload_manual_batch( + self, + dto: ManualBatchInputDTO, + user_id: int + ) -> ManualBatchOutputDTO: + return await self.adb_client.upload_manual_batch( + user_id=user_id, + dto=dto + ) diff --git a/core/DTOs/ManualBatchInputDTO.py b/core/DTOs/ManualBatchInputDTO.py new file mode 100644 index 00000000..9bb98755 --- /dev/null +++ b/core/DTOs/ManualBatchInputDTO.py @@ -0,0 +1,24 @@ +from typing import Optional + +from pydantic import BaseModel, Field + +from core.enums import RecordType + + +class ManualBatchInnerInputDTO(BaseModel): + url: str + name: Optional[str] = None + description: Optional[str] = None + collector_metadata: Optional[dict] = None + record_type: Optional[RecordType] = None + record_formats: Optional[list[str]] = None + data_portal_type: Optional[str] = None + supplying_entity: Optional[str] = None + + +class ManualBatchInputDTO(BaseModel): + name: str + entries: list[ManualBatchInnerInputDTO] = Field( + min_length=1, + max_length=1000 + ) \ No newline at end of file diff --git a/core/DTOs/ManualBatchOutputDTO.py b/core/DTOs/ManualBatchOutputDTO.py new file mode 100644 index 00000000..119359a6 --- /dev/null +++ b/core/DTOs/ManualBatchOutputDTO.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel + + +class ManualBatchOutputDTO(BaseModel): + batch_id: int + urls: list[int] \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..161cc214 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,3 @@ +[project] +name="source-collector" +version="0.1.0" \ No newline at end of file diff --git a/tests/test_automated/integration/api/test_manual_batch.py b/tests/test_automated/integration/api/test_manual_batch.py new file mode 100644 index 00000000..82fb4d91 --- /dev/null +++ b/tests/test_automated/integration/api/test_manual_batch.py @@ -0,0 +1,18 @@ +import pytest + + +@pytest.mark.asyncio +async def test_manual_batch(api_test_helper): + + manual_batch_name = "test_manual_batch" + + # Create 50 entries with just URL + + + # Create 50 entries with URL and all optional fields + + + # TODO: Continue later + + + raise NotImplementedError \ No newline at end of file From 25ced55b6af67688d1773f916e4c74c9f39db5ae Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sat, 3 May 2025 10:18:05 -0400 Subject: [PATCH 157/244] feat(app): Add `/collector/manual` endpoint --- ..._add_manual_strategy_to_batch_strategy_.py | 54 +++++++ api/routes/collector.py | 3 +- collector_db/AsyncDatabaseClient.py | 6 +- collector_db/DatabaseClient.py | 2 +- collector_db/models.py | 1 + core/AsyncCore.py | 4 +- ...OutputDTO.py => ManualBatchResponseDTO.py} | 2 +- .../api/helpers/RequestValidator.py | 60 ++++++- .../integration/api/test_manual_batch.py | 148 +++++++++++++++++- 9 files changed, 267 insertions(+), 13 deletions(-) create mode 100644 alembic/versions/2025_05_03_0956-028565b77b9e_add_manual_strategy_to_batch_strategy_.py rename core/DTOs/{ManualBatchOutputDTO.py => ManualBatchResponseDTO.py} (63%) diff --git a/alembic/versions/2025_05_03_0956-028565b77b9e_add_manual_strategy_to_batch_strategy_.py b/alembic/versions/2025_05_03_0956-028565b77b9e_add_manual_strategy_to_batch_strategy_.py new file mode 100644 index 00000000..c5af4d33 --- /dev/null +++ b/alembic/versions/2025_05_03_0956-028565b77b9e_add_manual_strategy_to_batch_strategy_.py @@ -0,0 +1,54 @@ +"""Add manual strategy to Batch strategy enum + +Revision ID: 028565b77b9e +Revises: e285e6e7cf71 +Create Date: 2025-05-03 09:56:51.134406 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +from util.alembic_helpers import switch_enum_type + +# revision identifiers, used by Alembic. +revision: str = '028565b77b9e' +down_revision: Union[str, None] = 'e285e6e7cf71' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + switch_enum_type( + table_name="batches", + column_name="strategy", + enum_name="batch_strategy", + new_enum_values=[ + "example", + "ckan", + "muckrock_county_search", + "auto_googler", + "muckrock_all_search", + "muckrock_simple_search", + "common_crawler", + "manual" + ], + ) + + +def downgrade() -> None: + switch_enum_type( + table_name="batches", + column_name="strategy", + enum_name="batch_strategy", + new_enum_values=[ + "example", + "ckan", + "muckrock_county_search", + "auto_googler", + "muckrock_all_search", + "muckrock_simple_search", + "common_crawler" + ], + ) diff --git a/api/routes/collector.py b/api/routes/collector.py index b7628c4f..16f5a900 100644 --- a/api/routes/collector.py +++ b/api/routes/collector.py @@ -7,6 +7,7 @@ from core.AsyncCore import AsyncCore from core.DTOs.CollectorStartInfo import CollectorStartInfo from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO +from core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO from security_manager.SecurityManager import AccessInfo, get_access_info from source_collectors.auto_googler.DTOs import AutoGooglerInputDTO from source_collectors.ckan.DTOs import CKANInputDTO @@ -130,7 +131,7 @@ async def upload_manual_collector( dto: ManualBatchInputDTO, core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), -) -> CollectorStartInfo: +) -> ManualBatchResponseDTO: """ Uploads a manual "collector" with existing data """ diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 4bc60de7..b110c614 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -42,7 +42,7 @@ from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseErrorInfo, \ GetURLsResponseInnerInfo from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO -from core.DTOs.ManualBatchOutputDTO import ManualBatchOutputDTO +from core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO, SubmittedURLInfo @@ -1727,7 +1727,7 @@ async def upload_manual_batch( session: AsyncSession, user_id: int, dto: ManualBatchInputDTO - ) -> ManualBatchOutputDTO: + ) -> ManualBatchResponseDTO: batch = Batch( strategy=CollectorType.MANUAL.value, status=BatchStatus.READY_TO_LABEL.value, @@ -1773,5 +1773,5 @@ async def upload_manual_batch( url_ids.append(url.id) - return ManualBatchOutputDTO(batch_id=batch_id, urls=url_ids) + return ManualBatchResponseDTO(batch_id=batch_id, urls=url_ids) diff --git a/collector_db/DatabaseClient.py b/collector_db/DatabaseClient.py index 43ec9628..94320fbc 100644 --- a/collector_db/DatabaseClient.py +++ b/collector_db/DatabaseClient.py @@ -16,7 +16,7 @@ from collector_db.models import Base, Batch, URL, Log, Duplicate from collector_manager.enums import CollectorType from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO -from core.DTOs.ManualBatchOutputDTO import ManualBatchOutputDTO +from core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO from core.EnvVarManager import EnvVarManager from core.enums import BatchStatus diff --git a/collector_db/models.py b/collector_db/models.py index 42b113c6..b5e70cdc 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -41,6 +41,7 @@ class Batch(Base): 'muckrock_all_search', 'muckrock_simple_search', 'common_crawler', + 'manual', name='batch_strategy'), nullable=False) user_id = Column(Integer, nullable=False) diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 2eba5d04..59a892ef 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -23,7 +23,7 @@ from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO -from core.DTOs.ManualBatchOutputDTO import ManualBatchOutputDTO +from core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO from core.DTOs.MessageResponse import MessageResponse from core.TaskManager import TaskManager from core.enums import BatchStatus, RecordType @@ -276,7 +276,7 @@ async def upload_manual_batch( self, dto: ManualBatchInputDTO, user_id: int - ) -> ManualBatchOutputDTO: + ) -> ManualBatchResponseDTO: return await self.adb_client.upload_manual_batch( user_id=user_id, dto=dto diff --git a/core/DTOs/ManualBatchOutputDTO.py b/core/DTOs/ManualBatchResponseDTO.py similarity index 63% rename from core/DTOs/ManualBatchOutputDTO.py rename to core/DTOs/ManualBatchResponseDTO.py index 119359a6..f656fda0 100644 --- a/core/DTOs/ManualBatchOutputDTO.py +++ b/core/DTOs/ManualBatchResponseDTO.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -class ManualBatchOutputDTO(BaseModel): +class ManualBatchResponseDTO(BaseModel): batch_id: int urls: list[int] \ No newline at end of file diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index 28e4b4a3..07de3c95 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -1,6 +1,7 @@ from http import HTTPStatus from typing import Optional, Annotated +from fastapi import HTTPException from pydantic import BaseModel from starlette.testclient import TestClient @@ -24,6 +25,8 @@ from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo +from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO +from core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO from core.DTOs.MessageResponse import MessageResponse from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo @@ -32,7 +35,11 @@ class ExpectedResponseInfo(BaseModel): - status_code: Annotated[HTTPStatus, "The expected status code"] = HTTPStatus.OK + status_code: Annotated[ + HTTPStatus, + "The expected status code" + ] = HTTPStatus.OK + message: Optional[str] = None class RequestValidator: """ @@ -64,6 +71,31 @@ def open( assert response.status_code == expected_response.status_code, response.text return response.json() + def open_v2( + self, + method: str, + url: str, + params: Optional[dict] = None, + **kwargs + ) -> dict: + """ + Variation on open that raises an exception rather than check the status code + """ + if params: + kwargs["params"] = params + response = self.client.request( + method=method, + url=url, + headers={"Authorization": "Bearer token"}, # Fake authentication that is overridden during testing + **kwargs + ) + if response.status_code != HTTPStatus.OK: + raise HTTPException( + status_code=response.status_code, + detail=response.json() + ) + return response.json() + def get( self, url: str, @@ -94,6 +126,20 @@ def post( **kwargs ) + def post_v2( + self, + url: str, + params: Optional[dict] = None, + **kwargs + ) -> dict: + return self.open_v2( + method="POST", + url=url, + params=params, + **kwargs + ) + + def put( self, url: str, @@ -329,4 +375,14 @@ async def post_all_annotations_and_get_next( params=params, json=all_annotations_post_info.model_dump(mode='json') ) - return GetNextURLForAllAnnotationResponse(**data) \ No newline at end of file + return GetNextURLForAllAnnotationResponse(**data) + + async def submit_manual_batch( + self, + dto: ManualBatchInputDTO, + ) -> ManualBatchResponseDTO: + data = self.post_v2( + url="/collector/manual", + json=dto.model_dump(mode='json'), + ) + return ManualBatchResponseDTO(**data) \ No newline at end of file diff --git a/tests/test_automated/integration/api/test_manual_batch.py b/tests/test_automated/integration/api/test_manual_batch.py index 82fb4d91..e7c34af1 100644 --- a/tests/test_automated/integration/api/test_manual_batch.py +++ b/tests/test_automated/integration/api/test_manual_batch.py @@ -1,18 +1,160 @@ + import pytest +from fastapi import HTTPException + +from collector_db.models import Batch, URL, URLOptionalDataSourceMetadata +from collector_manager.enums import CollectorType +from core.DTOs.ManualBatchInputDTO import ManualBatchInnerInputDTO, ManualBatchInputDTO +from core.enums import RecordType @pytest.mark.asyncio async def test_manual_batch(api_test_helper): + ath = api_test_helper manual_batch_name = "test_manual_batch" # Create 50 entries with just URL - + dtos = [] + for i in range(50): + dto = ManualBatchInnerInputDTO( + url=f"https://example.com/{i}", + ) + dtos.append(dto) # Create 50 entries with URL and all optional fields + for i in range(50): + dto = ManualBatchInnerInputDTO( + url=f"https://example.com/{i+50}", + name=manual_batch_name, + description=f"Description {i}", + collector_metadata={ + "name": f"Name {i}", + }, + record_type=RecordType.ARREST_RECORDS, + record_formats=[f"Record Format {i}"], + data_portal_type=f"Data Portal Type {i}", + supplying_entity=f"Supplying Entity {i}" + ) + dtos.append(dto) + + input_dto = ManualBatchInputDTO( + name=manual_batch_name, + entries=dtos + ) + + # Submit batch successfully + response = await ath.request_validator.submit_manual_batch(input_dto) + + # Check 100 URLs in url attribute + assert len(response.urls) == 100 + + # Get batch from database + adb_client = ath.adb_client() + batches = await adb_client.get_all(Batch) + + # Confirm only one batch + assert len(batches) == 1 + + batch: Batch = batches[0] + # Assert batch id matches response's batch id + assert batch.id == response.batch_id + # Assert strategy of manual + assert batch.strategy == CollectorType.MANUAL.value + # Assert parameters has name value of `test_manual_batch` + assert batch.parameters["name"] == manual_batch_name + # Assert has expected user id + assert batch.user_id == 1 + + # Get URLs from database + urls: list[URL] = await adb_client.get_all(URL) + + # Confirm 100 URLs + assert len(urls) == 100 + + def check_attributes( + object: URL or URLOptionalDataSourceMetadata, + attributes: list[str], + attributes_are_none: bool + ): + for attr in attributes: + if attributes_are_none: + if getattr(object, attr) is not None: + return False + else: + if getattr(object, attr) is None: + return False + return True + + def check_url(url: URL, url_only: bool): + assert url.batch_id == batch.id + assert url.url is not None + other_attributes = ["name", "description", "collector_metadata", "record_type"] + return check_attributes(url, other_attributes, url_only) + + + # Confirm 50 have only name value + count_only_name = 0 + for url in urls: + if check_url(url, True): + count_only_name += 1 + assert count_only_name == 50 + # Confirm 50 have all optional fields + count_all = 0 + for url in urls: + if check_url(url, False): + count_all += 1 + assert count_all == 50 + + # Get Optional URL Metadata from Database + opt_metadata: list[URLOptionalDataSourceMetadata] = await adb_client.get_all(URLOptionalDataSourceMetadata) + + # Confirm 100 + assert len(opt_metadata) == 100 + + def check_opt_metadata(metadata: URLOptionalDataSourceMetadata, no_optional: bool): + assert metadata.url_id is not None + other_attributes = ["record_formats", "data_portal_type", "supplying_entity"] + return check_attributes(metadata, other_attributes, no_optional) + + # Confirm 50 have nothing but URL id + count_only_url_id = 0 + for metadata in opt_metadata: + if check_opt_metadata(metadata, True): + count_only_url_id += 1 + assert count_only_url_id == 50 + + # Confirm 50 have all optional fields + count_all = 0 + for metadata in opt_metadata: + if check_opt_metadata(metadata, False): + count_all += 1 + assert count_all == 50 + # Insert another batch including good urls and one duplicate + more_dtos = [] + for i in range(49): + dto = ManualBatchInnerInputDTO( + url=f"https://example.com/{i+100}", + ) + more_dtos.append(dto) - # TODO: Continue later + dto = ManualBatchInnerInputDTO( + url=f"https://example.com/1", + ) + more_dtos.append(dto) + duplicate_input_dto = ManualBatchInputDTO( + name=manual_batch_name, + entries=more_dtos + ) - raise NotImplementedError \ No newline at end of file + # Submit batch + try: + response = await ath.request_validator.submit_manual_batch(duplicate_input_dto) + except HTTPException as e: + # Confirm got a BAD REQUEST error identifying the correct duplicate URL + assert e.status_code == 400 + assert e.detail == { + "detail": 'URL already exists: https://example.com/1' + } From addc5f57df3bdd6f361654bfc60d1e8c98e17914 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sat, 3 May 2025 10:28:52 -0400 Subject: [PATCH 158/244] feat(app): Add `/collector/manual` endpoint --- collector_db/AsyncDatabaseClient.py | 23 ++++++++------- core/DTOs/ManualBatchResponseDTO.py | 3 +- .../integration/api/test_manual_batch.py | 28 ++++++++++--------- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index b110c614..d6d949ea 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -1741,6 +1741,7 @@ async def upload_manual_batch( batch_id = batch.id url_ids = [] + duplicate_urls = [] for entry in dto.entries: url = URL( @@ -1753,15 +1754,13 @@ async def upload_manual_batch( record_type=entry.record_type.value if entry.record_type is not None else None, ) - session.add(url) - try: - await session.flush() - except IntegrityError: - await session.rollback() - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail=f"URL already exists: {entry.url}" - ) + async with session.begin_nested(): + try: + session.add(url) + await session.flush() + except IntegrityError: + duplicate_urls.append(entry.url) + continue await session.flush() optional_metadata = URLOptionalDataSourceMetadata( url_id=url.id, @@ -1773,5 +1772,9 @@ async def upload_manual_batch( url_ids.append(url.id) - return ManualBatchResponseDTO(batch_id=batch_id, urls=url_ids) + return ManualBatchResponseDTO( + batch_id=batch_id, + urls=url_ids, + duplicate_urls=duplicate_urls + ) diff --git a/core/DTOs/ManualBatchResponseDTO.py b/core/DTOs/ManualBatchResponseDTO.py index f656fda0..b572fbb2 100644 --- a/core/DTOs/ManualBatchResponseDTO.py +++ b/core/DTOs/ManualBatchResponseDTO.py @@ -3,4 +3,5 @@ class ManualBatchResponseDTO(BaseModel): batch_id: int - urls: list[int] \ No newline at end of file + urls: list[int] + duplicate_urls: list[str] \ No newline at end of file diff --git a/tests/test_automated/integration/api/test_manual_batch.py b/tests/test_automated/integration/api/test_manual_batch.py index e7c34af1..e9a101eb 100644 --- a/tests/test_automated/integration/api/test_manual_batch.py +++ b/tests/test_automated/integration/api/test_manual_batch.py @@ -1,6 +1,5 @@ import pytest -from fastapi import HTTPException from collector_db.models import Batch, URL, URLOptionalDataSourceMetadata from collector_manager.enums import CollectorType @@ -139,10 +138,12 @@ def check_opt_metadata(metadata: URLOptionalDataSourceMetadata, no_optional: boo ) more_dtos.append(dto) - dto = ManualBatchInnerInputDTO( - url=f"https://example.com/1", - ) - more_dtos.append(dto) + for i in range(2): + dto = ManualBatchInnerInputDTO( + url=f"https://example.com/{i+1}", + ) + more_dtos.append(dto) + duplicate_input_dto = ManualBatchInputDTO( name=manual_batch_name, @@ -150,11 +151,12 @@ def check_opt_metadata(metadata: URLOptionalDataSourceMetadata, no_optional: boo ) # Submit batch - try: - response = await ath.request_validator.submit_manual_batch(duplicate_input_dto) - except HTTPException as e: - # Confirm got a BAD REQUEST error identifying the correct duplicate URL - assert e.status_code == 400 - assert e.detail == { - "detail": 'URL already exists: https://example.com/1' - } + response = await ath.request_validator.submit_manual_batch(duplicate_input_dto) + # Check duplicate URLs + assert len(response.duplicate_urls) == 2 + assert response.duplicate_urls == ['https://example.com/1', 'https://example.com/2'] + assert len(response.urls) == 49 + + # Check 149 URLs in database + urls: list[URL] = await adb_client.get_all(URL) + assert len(urls) == 149 From 060bc11cce5650d00eaf48cc76d9c770c6544ed8 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sat, 3 May 2025 10:32:19 -0400 Subject: [PATCH 159/244] feat(app): Add `/collector/manual` endpoint --- collector_db/AsyncDatabaseClient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index d6d949ea..52ab2c9c 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -563,7 +563,7 @@ async def add_to_root_url_cache(self, session: AsyncSession, url: str, page_titl async def get_urls(self, session: AsyncSession, page: int, errors: bool) -> GetURLsResponseInfo: statement = select(URL).options( selectinload(URL.error_info) - ) + ).order_by(URL.id) if errors: # Only return URLs with errors statement = statement.where( From 02f7b3a43a2db4f76ee620c08fc92d2c30ce5cc6 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sat, 3 May 2025 21:23:30 -0400 Subject: [PATCH 160/244] Comment out URL relevance Huggingface Task Operator call --- core/TaskManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/TaskManager.py b/core/TaskManager.py index e72724fc..7bba4c67 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -99,7 +99,7 @@ async def get_url_miscellaneous_metadata_task_operator(self): async def get_task_operators(self) -> list[TaskOperatorBase]: return [ await self.get_url_html_task_operator(), - await self.get_url_relevance_huggingface_task_operator(), + # await self.get_url_relevance_huggingface_task_operator(), await self.get_url_record_type_task_operator(), await self.get_agency_identification_task_operator(), await self.get_url_miscellaneous_metadata_task_operator(), From 18be3c9506bb4b64971ebed2536214ce8bd19f9d Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sat, 3 May 2025 21:43:42 -0400 Subject: [PATCH 161/244] Comment out URL relevance Huggingface Task Operator call --- core/TaskManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/TaskManager.py b/core/TaskManager.py index 7bba4c67..4761a62b 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -101,7 +101,7 @@ async def get_task_operators(self) -> list[TaskOperatorBase]: await self.get_url_html_task_operator(), # await self.get_url_relevance_huggingface_task_operator(), await self.get_url_record_type_task_operator(), - await self.get_agency_identification_task_operator(), + # await self.get_agency_identification_task_operator(), await self.get_url_miscellaneous_metadata_task_operator(), await self.get_submit_approved_url_task_operator() ] From 1fcc9493bb58185932abd8fbefc03829b0908ad9 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sun, 4 May 2025 09:08:35 -0400 Subject: [PATCH 162/244] feat(app): Add `/search/url` endpoint --- api/main.py | 4 +++- api/routes/search.py | 20 ++++++++++++++++ collector_db/AsyncDatabaseClient.py | 16 +++++++++++++ core/AsyncCore.py | 3 +++ core/DTOs/SearchURLResponse.py | 8 +++++++ .../api/helpers/RequestValidator.py | 10 +++++++- .../integration/api/test_search.py | 23 +++++++++++++++++++ 7 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 api/routes/search.py create mode 100644 core/DTOs/SearchURLResponse.py create mode 100644 tests/test_automated/integration/api/test_search.py diff --git a/api/main.py b/api/main.py index ae74c914..1b80716e 100644 --- a/api/main.py +++ b/api/main.py @@ -11,6 +11,7 @@ from api.routes.collector import collector_router from api.routes.review import review_router from api.routes.root import root_router +from api.routes.search import search_router from api.routes.task import task_router from api.routes.url import url_router from collector_db.AsyncDatabaseClient import AsyncDatabaseClient @@ -128,7 +129,8 @@ async def redirect_docs(): annotate_router, url_router, task_router, - review_router + review_router, + search_router ] for router in routers: diff --git a/api/routes/search.py b/api/routes/search.py new file mode 100644 index 00000000..4513bb2f --- /dev/null +++ b/api/routes/search.py @@ -0,0 +1,20 @@ +from fastapi import APIRouter, Query, Depends + +from api.dependencies import get_async_core +from core.AsyncCore import AsyncCore +from core.DTOs.SearchURLResponse import SearchURLResponse +from security_manager.SecurityManager import get_access_info, AccessInfo + +search_router = APIRouter(prefix="/search", tags=["search"]) + + +@search_router.get("/url") +async def search_url( + url: str = Query(description="The URL to search for"), + access_info: AccessInfo = Depends(get_access_info), + async_core: AsyncCore = Depends(get_async_core), +) -> SearchURLResponse: + """ + Search for a URL in the database + """ + return await async_core.search_for_url(url) \ No newline at end of file diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 52ab2c9c..85d74146 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -43,6 +43,7 @@ GetURLsResponseInnerInfo from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO from core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO +from core.DTOs.SearchURLResponse import SearchURLResponse from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO, SubmittedURLInfo @@ -1778,3 +1779,18 @@ async def upload_manual_batch( duplicate_urls=duplicate_urls ) + @session_manager + async def search_for_url(self, session: AsyncSession, url: str) -> SearchURLResponse: + query = select(URL).where(URL.url == url) + raw_results = await session.execute(query) + url = raw_results.scalars().one_or_none() + if url is None: + return SearchURLResponse( + found=False, + url_id=None + ) + return SearchURLResponse( + found=True, + url_id=url.id + ) + diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 59a892ef..f1d69fb2 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -25,6 +25,7 @@ from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO from core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO from core.DTOs.MessageResponse import MessageResponse +from core.DTOs.SearchURLResponse import SearchURLResponse from core.TaskManager import TaskManager from core.enums import BatchStatus, RecordType @@ -282,3 +283,5 @@ async def upload_manual_batch( dto=dto ) + async def search_for_url(self, url: str) -> SearchURLResponse: + return await self.adb_client.search_for_url(url) diff --git a/core/DTOs/SearchURLResponse.py b/core/DTOs/SearchURLResponse.py new file mode 100644 index 00000000..1a46c0be --- /dev/null +++ b/core/DTOs/SearchURLResponse.py @@ -0,0 +1,8 @@ +from typing import Optional + +from pydantic import BaseModel + + +class SearchURLResponse(BaseModel): + found: bool + url_id: Optional[int] = None \ No newline at end of file diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index 07de3c95..c2d246f5 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -30,6 +30,7 @@ from core.DTOs.MessageResponse import MessageResponse from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo +from core.DTOs.SearchURLResponse import SearchURLResponse from core.enums import BatchStatus from util.helper_functions import update_if_not_none @@ -385,4 +386,11 @@ async def submit_manual_batch( url="/collector/manual", json=dto.model_dump(mode='json'), ) - return ManualBatchResponseDTO(**data) \ No newline at end of file + return ManualBatchResponseDTO(**data) + + async def search_url(self, url: str) -> SearchURLResponse: + data = self.get( + url=f"/search/url", + params={"url": url} + ) + return SearchURLResponse(**data) \ No newline at end of file diff --git a/tests/test_automated/integration/api/test_search.py b/tests/test_automated/integration/api/test_search.py new file mode 100644 index 00000000..917690fc --- /dev/null +++ b/tests/test_automated/integration/api/test_search.py @@ -0,0 +1,23 @@ +import pytest + +from core.DTOs.SearchURLResponse import SearchURLResponse + + +@pytest.mark.asyncio +async def test_search_url(api_test_helper): + ath = api_test_helper + + # Create a batch with 1 URL + creation_info = await ath.db_data_creator.batch_and_urls(url_count=1, with_html_content=False) + + # Search for that URL and locate it + response: SearchURLResponse = await ath.request_validator.search_url(url=creation_info.urls[0]) + + assert response.found + assert response.url_id == creation_info.url_ids[0] + + # Search for a non-existent URL + response: SearchURLResponse = await ath.request_validator.search_url(url="http://doesnotexist.com") + + assert not response.found + assert response.url_id is None \ No newline at end of file From e090cadb617c1d393d2019d648857e6313ae82bd Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sun, 4 May 2025 10:56:02 -0400 Subject: [PATCH 163/244] feat(app): Add special error message for annotation user conflict --- core/AsyncCore.py | 36 +++++++---- core/classes/ErrorManager.py | 44 +++++++++++++ core/enums.py | 5 ++ core/helpers.py | 4 ++ .../api/helpers/RequestValidator.py | 4 +- .../integration/api/test_annotate.py | 62 +++++++++++++++++++ 6 files changed, 142 insertions(+), 13 deletions(-) create mode 100644 core/classes/ErrorManager.py diff --git a/core/AsyncCore.py b/core/AsyncCore.py index f1d69fb2..46ccca0d 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -1,6 +1,7 @@ from typing import Optional from pydantic import BaseModel +from sqlalchemy.exc import IntegrityError from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.BatchInfo import BatchInfo @@ -27,7 +28,8 @@ from core.DTOs.MessageResponse import MessageResponse from core.DTOs.SearchURLResponse import SearchURLResponse from core.TaskManager import TaskManager -from core.enums import BatchStatus, RecordType +from core.classes.ErrorManager import ErrorManager +from core.enums import BatchStatus, RecordType, AnnotationType from security_manager.SecurityManager import AccessInfo @@ -149,11 +151,17 @@ async def submit_url_relevance_annotation( url_id: int, relevant: bool ): - return await self.adb_client.add_user_relevant_suggestion( - user_id=user_id, - url_id=url_id, - relevant=relevant - ) + try: + return await self.adb_client.add_user_relevant_suggestion( + user_id=user_id, + url_id=url_id, + relevant=relevant + ) + except IntegrityError as e: + return await ErrorManager.raise_annotation_exists_error( + annotation_type=AnnotationType.RELEVANCE, + url_id=url_id + ) async def get_next_url_for_relevance_annotation( self, @@ -187,11 +195,17 @@ async def submit_url_record_type_annotation( url_id: int, record_type: RecordType, ): - await self.adb_client.add_user_record_type_suggestion( - user_id=user_id, - url_id=url_id, - record_type=record_type - ) + try: + return await self.adb_client.add_user_record_type_suggestion( + user_id=user_id, + url_id=url_id, + record_type=record_type + ) + except IntegrityError as e: + return await ErrorManager.raise_annotation_exists_error( + annotation_type=AnnotationType.RECORD_TYPE, + url_id=url_id + ) async def get_next_url_agency_for_annotation( diff --git a/core/classes/ErrorManager.py b/core/classes/ErrorManager.py new file mode 100644 index 00000000..ba763054 --- /dev/null +++ b/core/classes/ErrorManager.py @@ -0,0 +1,44 @@ +from enum import Enum +from http import HTTPStatus + +from fastapi import HTTPException +from pydantic import BaseModel + +from core.enums import AnnotationType + + +class ErrorTypes(Enum): + ANNOTATION_EXISTS = "ANNOTATION_EXISTS" + +class ErrorFormat(BaseModel): + code: ErrorTypes + message: str + + +class ErrorManager: + + @staticmethod + async def raise_error( + error_type: ErrorTypes, + message: str, + status_code: HTTPStatus = HTTPStatus.BAD_REQUEST + ): + raise HTTPException( + status_code=status_code, + detail=ErrorFormat( + code=error_type, + message=message + ).model_dump(mode='json') + ) + + @staticmethod + async def raise_annotation_exists_error( + annotation_type: AnnotationType, + url_id: int + ): + await ErrorManager.raise_error( + error_type=ErrorTypes.ANNOTATION_EXISTS, + message=f"Annotation of type {annotation_type.value} already exists" + f" for url {url_id}", + status_code=HTTPStatus.CONFLICT + ) diff --git a/core/enums.py b/core/enums.py index 173c66e9..019572b8 100644 --- a/core/enums.py +++ b/core/enums.py @@ -1,5 +1,10 @@ from enum import Enum +class AnnotationType(Enum): + RELEVANCE = "RELEVANCE" + RECORD_TYPE = "RECORD_TYPE" + AGENCY = "AGENCY" + class BatchStatus(Enum): READY_TO_LABEL = "ready to label" diff --git a/core/helpers.py b/core/helpers.py index bac603bd..1fc51cde 100644 --- a/core/helpers.py +++ b/core/helpers.py @@ -1,3 +1,7 @@ +from http import HTTPStatus + +from fastapi import HTTPException + from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.enums import SuggestionType from core.exceptions import MatchAgencyError diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index c2d246f5..91d27729 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -246,7 +246,7 @@ def post_record_type_annotation_and_get_next( url_id: int, record_type_annotation_post_info: RecordTypeAnnotationPostInfo ) -> GetNextRecordTypeAnnotationResponseOuterInfo: - data = self.post( + data = self.post_v2( url=f"/annotate/record-type/{url_id}", json=record_type_annotation_post_info.model_dump(mode='json') ) @@ -257,7 +257,7 @@ def post_relevance_annotation_and_get_next( url_id: int, relevance_annotation_post_info: RelevanceAnnotationPostInfo ) -> GetNextRelevanceAnnotationResponseOuterInfo: - data = self.post( + data = self.post_v2( url=f"/annotate/relevance/{url_id}", json=relevance_annotation_post_info.model_dump(mode='json') ) diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/test_automated/integration/api/test_annotate.py index a03540a1..03088cd7 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/test_automated/integration/api/test_annotate.py @@ -1,6 +1,7 @@ from http import HTTPStatus import pytest +from fastapi import HTTPException from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_db.DTOs.URLMapping import URLMapping @@ -11,6 +12,7 @@ from core.DTOs.GetNextURLForAgencyAnnotationResponse import URLAgencyAnnotationPostInfo from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo +from core.classes.ErrorManager import ErrorTypes from core.enums import RecordType, SuggestionType from core.exceptions import FailedValidationException from tests.helpers.complex_test_data_functions import AnnotateAgencySetupInfo, setup_for_annotate_agency, \ @@ -130,6 +132,36 @@ async def test_annotate_relevancy(api_test_helper): assert results[0].relevant is True +@pytest.mark.asyncio +async def test_annotate_relevancy_already_annotated_by_different_user( + api_test_helper +): + ath = api_test_helper + + creation_info: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( + url_count=1 + ) + + await ath.db_data_creator.user_relevant_suggestion( + url_id=creation_info.url_ids[0], + user_id=2, + relevant=True + ) + + # Annotate with different user (default is 1) and get conflict error + try: + response = await ath.request_validator.post_relevance_annotation_and_get_next( + url_id=creation_info.url_ids[0], + relevance_annotation_post_info=RelevanceAnnotationPostInfo( + is_relevant=False + ) + ) + except HTTPException as e: + assert e.status_code == HTTPStatus.CONFLICT + assert e.detail["detail"]["code"] == ErrorTypes.ANNOTATION_EXISTS.value + assert e.detail["detail"]["message"] == f"Annotation of type RELEVANCE already exists for url {creation_info.url_ids[0]}" + + @pytest.mark.asyncio async def test_annotate_relevancy_no_html(api_test_helper): ath = api_test_helper @@ -250,6 +282,36 @@ async def test_annotate_record_type(api_test_helper): if result.url_id == inner_info_1.url_info.url_id: assert result.record_type == RecordType.BOOKING_REPORTS.value +@pytest.mark.asyncio +async def test_annotate_record_type_already_annotated_by_different_user( + api_test_helper +): + ath = api_test_helper + + creation_info: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( + url_count=1 + ) + + await ath.db_data_creator.user_record_type_suggestion( + url_id=creation_info.url_ids[0], + user_id=2, + record_type=RecordType.ACCIDENT_REPORTS + ) + + # Annotate with different user (default is 1) and get conflict error + try: + response = await ath.request_validator.post_record_type_annotation_and_get_next( + url_id=creation_info.url_ids[0], + record_type_annotation_post_info=RecordTypeAnnotationPostInfo( + record_type=RecordType.ANNUAL_AND_MONTHLY_REPORTS + ) + ) + except HTTPException as e: + assert e.status_code == HTTPStatus.CONFLICT + assert e.detail["detail"]["code"] == ErrorTypes.ANNOTATION_EXISTS.value + assert e.detail["detail"]["message"] == f"Annotation of type RECORD_TYPE already exists for url {creation_info.url_ids[0]}" + + @pytest.mark.asyncio async def test_annotate_record_type_no_html_info(api_test_helper): ath = api_test_helper From 154895e2044791de8ae85ff43ad81b3d5deb7dfa Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 6 May 2025 09:20:50 -0400 Subject: [PATCH 164/244] DRAFT --- ...5e16e0738f_create_backlogsnapshot_table.py | 31 ++ ...e17c04_create_url_annotation_flags_view.py | 47 +++ api/main.py | 4 +- api/routes/metrics.py | 63 ++++ collector_db/AsyncDatabaseClient.py | 313 +++++++++++++++++- collector_db/StatementComposer.py | 10 +- collector_db/models.py | 9 +- core/AsyncCore.py | 24 ++ core/DTOs/GetMetricsBacklogResponse.py | 10 + .../GetMetricsBatchesAggregatedResponseDTO.py | 22 ++ .../GetMetricsBatchesBreakdownResponseDTO.py | 19 ++ .../GetMetricsURLsAggregatedResponseDTO.py | 14 + ...tMetricsURLsBreakdownPendingResponseDTO.py | 12 + ...etricsURLsBreakdownSubmittedResponseDTO.py | 10 + core/ScheduledTaskManager.py | 8 + 15 files changed, 591 insertions(+), 5 deletions(-) create mode 100644 alembic/versions/2025_05_06_0816-e55e16e0738f_create_backlogsnapshot_table.py create mode 100644 alembic/versions/2025_05_06_0919-f25852e17c04_create_url_annotation_flags_view.py create mode 100644 api/routes/metrics.py create mode 100644 core/DTOs/GetMetricsBacklogResponse.py create mode 100644 core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py create mode 100644 core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py create mode 100644 core/DTOs/GetMetricsURLsAggregatedResponseDTO.py create mode 100644 core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py create mode 100644 core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py diff --git a/alembic/versions/2025_05_06_0816-e55e16e0738f_create_backlogsnapshot_table.py b/alembic/versions/2025_05_06_0816-e55e16e0738f_create_backlogsnapshot_table.py new file mode 100644 index 00000000..d6b118fb --- /dev/null +++ b/alembic/versions/2025_05_06_0816-e55e16e0738f_create_backlogsnapshot_table.py @@ -0,0 +1,31 @@ +"""Create BacklogSnapshot Table + +Revision ID: e55e16e0738f +Revises: 028565b77b9e +Create Date: 2025-05-06 08:16:29.385305 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'e55e16e0738f' +down_revision: Union[str, None] = '028565b77b9e' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + op.create_table( + 'backlog_snapshot', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('count_pending_total', sa.Integer(), nullable=False), + sa.Column('created_at', sa.DateTime(), nullable=False), + ) + + +def downgrade() -> None: + op.drop_table('backlog_snapshot') diff --git a/alembic/versions/2025_05_06_0919-f25852e17c04_create_url_annotation_flags_view.py b/alembic/versions/2025_05_06_0919-f25852e17c04_create_url_annotation_flags_view.py new file mode 100644 index 00000000..f0250c06 --- /dev/null +++ b/alembic/versions/2025_05_06_0919-f25852e17c04_create_url_annotation_flags_view.py @@ -0,0 +1,47 @@ +"""Create URL Annotation Flags View + +Revision ID: f25852e17c04 +Revises: e55e16e0738f +Create Date: 2025-05-06 09:19:54.000410 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'f25852e17c04' +down_revision: Union[str, None] = 'e55e16e0738f' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + op.execute(""" + CREATE VIEW url_annotation_flags AS + SELECT + u.id, + u.outcome, + CASE WHEN arts.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_auto_record_type_suggestion, + CASE WHEN ars.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_auto_relevant_suggestion, + CASE WHEN auas.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_auto_agency_suggestion, + CASE WHEN urts.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_user_record_type_suggestion, + CASE WHEN urs.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_user_relevant_suggestion, + CASE WHEN uuas.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_user_agency_suggestion, + CASE WHEN ruu.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS was_reviewed + FROM urls u + LEFT JOIN public.auto_record_type_suggestions arts ON u.id = arts.url_id + LEFT JOIN public.auto_relevant_suggestions ars ON u.id = ars.url_id + LEFT JOIN public.automated_url_agency_suggestions auas ON u.id = auas.url_id + LEFT JOIN public.user_record_type_suggestions urts ON u.id = urts.url_id + LEFT JOIN public.user_relevant_suggestions urs ON u.id = urs.url_id + LEFT JOIN public.user_url_agency_suggestions uuas ON u.id = uuas.url_id + LEFT JOIN public.reviewing_user_url ruu ON u.id = ruu.url_id; + + """) + + +def downgrade() -> None: + op.execute("DROP VIEW url_annotation_flags;") diff --git a/api/main.py b/api/main.py index 1b80716e..94b52cd2 100644 --- a/api/main.py +++ b/api/main.py @@ -9,6 +9,7 @@ from api.routes.annotate import annotate_router from api.routes.batch import batch_router from api.routes.collector import collector_router +from api.routes.metrics import metrics_router from api.routes.review import review_router from api.routes.root import root_router from api.routes.search import search_router @@ -130,7 +131,8 @@ async def redirect_docs(): url_router, task_router, review_router, - search_router + search_router, + metrics_router ] for router in routers: diff --git a/api/routes/metrics.py b/api/routes/metrics.py new file mode 100644 index 00000000..ab548437 --- /dev/null +++ b/api/routes/metrics.py @@ -0,0 +1,63 @@ +from fastapi import APIRouter +from fastapi.params import Query + +from core.AsyncCore import AsyncCore +from core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO +from core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO +from core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO +from core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO +from core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO +from core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO +from security_manager.SecurityManager import AccessInfo + +metrics_router = APIRouter( + prefix="/metrics", + tags=["Metrics"], +) + + +@metrics_router.get("/batches/aggregated") +async def get_batches_aggregated_metrics( + core: AsyncCore, + access_info: AccessInfo +) -> GetMetricsBatchesAggregatedResponseDTO: + return await core.get_batches_aggregated_metrics() + +@metrics_router.get("/batches/breakdown") +async def get_batches_breakdown_metrics( + core: AsyncCore, + access_info: AccessInfo, + page: int = Query( + description="The page number", + default=1 + ) +) -> GetMetricsBatchesBreakdownResponseDTO: + return await core.get_batches_breakdown_metrics(page=page) + +@metrics_router.get("/urls/aggregate") +async def get_urls_aggregated_metrics( + core: AsyncCore, + access_info: AccessInfo +) -> GetMetricsURLsAggregatedResponseDTO: + return await core.get_urls_aggregated_metrics() + +@metrics_router.get("/urls/breakdown/submitted") +async def get_urls_breakdown_submitted_metrics( + core: AsyncCore, + access_info: AccessInfo +) -> GetMetricsURLsBreakdownSubmittedResponseDTO: + return await core.get_urls_breakdown_submitted_metrics() + +@metrics_router.get("/urls/breakdown/pending") +async def get_urls_breakdown_pending_metrics( + core: AsyncCore, + access_info: AccessInfo +) -> GetMetricsURLsBreakdownPendingResponseDTO: + return await core.get_urls_breakdown_pending_metrics() + +@metrics_router.get("/backlog") +async def get_backlog_metrics( + core: AsyncCore, + access_info: AccessInfo +) -> GetMetricsBacklogResponseDTO: + return await core.get_backlog_metrics() \ No newline at end of file diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 85d74146..cf3cb47f 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -3,7 +3,7 @@ from typing import Optional, Type, Any, List from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, update, asc, delete +from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, update, asc, delete, insert from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import selectinload, joinedload, QueryableAttribute, aliased @@ -26,10 +26,19 @@ from collector_db.models import URL, URLErrorInfo, URLHTMLContent, Base, \ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ - UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Duplicate, Log + UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Duplicate, Log, \ + BacklogSnapshot from collector_manager.enums import URLStatus, CollectorType from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo +from core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO, GetMetricsBacklogResponseInnerDTO +from core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO, \ + GetMetricsBatchesAggregatedInnerResponseDTO +from core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO, \ + GetMetricsBatchesBreakdownInnerResponseDTO +from core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO +from core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO +from core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ @@ -1794,3 +1803,303 @@ async def search_for_url(self, session: AsyncSession, url: str) -> SearchURLResp url_id=url.id ) + @session_manager + async def get_batches_aggregated_metrics(self, session: AsyncSession) -> GetMetricsBatchesAggregatedResponseDTO: + sc = StatementComposer + + # First, get all batches broken down by collector type and status + def batch_column(status: BatchStatus, label): + return sc.count_distinct( + case( + (Batch.status == status.value, + Batch.id) + ), + label=label + ) + + batch_count_subquery = select( + batch_column(BatchStatus.READY_TO_LABEL, label="done_count"), + batch_column(BatchStatus.ERROR, label="error_count"), + Batch.strategy, + ).group_by(Batch.strategy).subquery("batch_count") + + def url_column(status: URLStatus, label): + return sc.count_distinct( + case( + (URL.outcome == status.value, + URL.id) + ), + label=label + ) + + # Next, count urls + url_count_subquery = select( + Batch.strategy, + url_column(URLStatus.PENDING, label="pending_count"), + url_column(URLStatus.ERROR, label="error_count"), + url_column(URLStatus.SUBMITTED, label="submitted_count"), + url_column(URLStatus.REJECTED, label="rejected_count"), + ).join( + Batch, Batch.id == URL.batch_id + ).group_by( + Batch.strategy + ).subquery("url_count") + + # Combine + query = select( + Batch.strategy, + batch_count_subquery.c.done_count, + batch_count_subquery.c.error_count, + url_count_subquery.c.pending_count, + url_count_subquery.c.error_count, + url_count_subquery.c.submitted_count, + url_count_subquery.c.rejected_count, + ).join( + batch_count_subquery, + Batch.strategy == batch_count_subquery.c.strategy + ).join( + url_count_subquery, + Batch.strategy == url_count_subquery.c.strategy + ) + raw_results = await session.execute(query) + results = raw_results.all() + d: dict[CollectorType, GetMetricsBatchesAggregatedInnerResponseDTO] = {} + for result in results: + d[CollectorType(result.strategy)] = GetMetricsBatchesAggregatedInnerResponseDTO( + count_successful_batches=result.done_count, + count_failed_batches=result.error_count, + count_urls=result.pending_count + result.submitted_count + result.rejected_count + result.error_count, + count_urls_pending=result.pending_count, + count_urls_submitted=result.submitted_count, + count_urls_rejected=result.rejected_count, + count_urls_errors=result.error_count + ) + + total_batch_query = await session.execute( + select( + sc.count_distinct(Batch.id, label="count") + ) + ) + total_batch_count = total_batch_query.scalars().one_or_none() + if total_batch_count is None: + total_batch_count = 0 + + return GetMetricsBatchesAggregatedResponseDTO( + total_batches=total_batch_count, + by_strategy=d + ) + + @session_manager + async def get_batches_breakdown_metrics( + self, + session: AsyncSession, + page: int + ) -> GetMetricsBatchesBreakdownResponseDTO: + sc = StatementComposer + + main_query = select( + Batch.strategy, + Batch.id, + Batch.date_generated.label("created_at"), + ) + + def url_column(status: URLStatus, label): + return sc.count_distinct( + case( + (URL.outcome == status.value, + URL.id) + ), + label=label + ) + + count_query = select( + URL.batch_id, + sc.count_distinct(URL.id, label="count_total"), + url_column(URLStatus.PENDING, label="count_pending"), + url_column(URLStatus.SUBMITTED, label="count_submitted"), + url_column(URLStatus.REJECTED, label="count_rejected"), + url_column(URLStatus.ERROR, label="count_error"), + ).group_by( + URL.batch_id + ).subquery("url_count") + + query = (select( + main_query.c.strategy, + main_query.c.id, + main_query.c.created_at, + count_query.c.count_total, + count_query.c.count_pending, + count_query.c.count_submitted, + count_query.c.count_rejected, + count_query.c.count_error, + ).join( + count_query, + main_query.c.id == count_query.c.batch_id + ).offset( + (page - 1) * 100 + ).order_by( + main_query.c.created_at.asc() + )) + + raw_results = await session.execute(query) + results = raw_results.all() + batches: list[GetMetricsBatchesBreakdownInnerResponseDTO] = [] + for result in results: + dto = GetMetricsBatchesBreakdownInnerResponseDTO( + batch_id=str(result.id), + strategy=CollectorType(result.strategy), + created_at=result.created_at, + count_url_total=result.count_total, + count_url_pending=result.count_pending, + count_url_submitted=result.count_submitted, + count_url_rejected=result.count_rejected, + count_url_error=result.count_error, + ) + batches.append(dto) + return GetMetricsBatchesBreakdownResponseDTO( + batches=batches, + ) + + @session_manager + async def get_urls_breakdown_submitted_metrics( + self, + session: AsyncSession + ) -> GetMetricsURLsBreakdownSubmittedResponseDTO: + pass + + @session_manager + async def get_urls_aggregated_metrics( + self, + session: AsyncSession + ) -> GetMetricsURLsAggregatedResponseDTO: + sc = StatementComposer + + oldest_pending_url_query = select( + URL.id, + URL.created_at + ).where( + URL.outcome == URLStatus.PENDING.value + ).order_by( + URL.created_at.asc() + ).limit(1) + + oldest_pending_url = await session.execute(oldest_pending_url_query) + oldest_pending_url = oldest_pending_url.scalars().one_or_none() + if oldest_pending_url is None: + oldest_pending_url_id = None + oldest_pending_created_at = None + else: + oldest_pending_url_id = oldest_pending_url.id + oldest_pending_created_at = oldest_pending_url.created_at + + def case_column(status: URLStatus, label): + return sc.count_distinct( + case( + (URL.outcome == status.value, + URL.id) + ), + label=label + ) + + count_query = select( + sc.count_distinct(URL.id, label="count"), + case_column(URLStatus.PENDING, label="count_pending"), + case_column(URLStatus.SUBMITTED, label="count_submitted"), + case_column(URLStatus.VALIDATED, label="count_validated"), + case_column(URLStatus.REJECTED, label="count_rejected"), + case_column(URLStatus.ERROR, label="count_error"), + ) + raw_results = await session.execute(count_query) + results = raw_results.all() + + return GetMetricsURLsAggregatedResponseDTO( + count_urls_total=results[0].count, + count_urls_pending=results[0].count_pending, + count_urls_submitted=results[0].count_submitted, + count_urls_validated=results[0].count_validated, + count_urls_rejected=results[0].count_rejected, + count_urls_errors=results[0].count_error, + oldest_pending_url_id=oldest_pending_url_id, + oldest_pending_url_created_at=oldest_pending_created_at, + ) + + @session_manager + async def get_urls_breakdown_pending_metrics( + self, + session: AsyncSession + ) -> GetMetricsURLsBreakdownPendingResponseDTO: + # I will need to get ways to identify the status of each url + + # Probably would benefit from a view of some sort + + + + pass + + @session_manager + async def get_backlog_metrics( + self, + session: AsyncSession + ) -> GetMetricsBacklogResponseDTO: + # 1. Create a subquery that assigns row_number() partitioned by week + weekly_snapshots_subq = ( + select( + BacklogSnapshot.id, + BacklogSnapshot.created_at, + BacklogSnapshot.count_pending_total, + func.date_trunc('week', BacklogSnapshot.created_at).label("week_start"), + func.row_number() + .over( + partition_by=func.date_trunc('week', BacklogSnapshot.created_at), + order_by=BacklogSnapshot.created_at.desc() + ) + .label("row_number") + ) + .subquery() + ) + + # 2. Filter for the top (most recent) row in each week + stmt = ( + select( + weekly_snapshots_subq.c.week_start, + weekly_snapshots_subq.c.created_at, + weekly_snapshots_subq.c.count_pending_total + ) + .where(weekly_snapshots_subq.c.row_number == 1) + .order_by(weekly_snapshots_subq.c.week_start) + ) + + raw_result = await session.execute(stmt) + results = raw_result.all() + final_results = [] + for result in results: + final_results.append( + GetMetricsBacklogResponseInnerDTO( + week_of=result.week_start, + count_pending_total=result.count_pending_total, + ) + ) + + return GetMetricsBacklogResponseDTO(entries=final_results) + + + @session_manager + async def populate_backlog_snapshot( + self, + session: AsyncSession + ): + sc = StatementComposer + # Get count of pending URLs + query = select( + sc.count_distinct(URL.id, label="count") + ).where( + URL.outcome == URLStatus.PENDING.value + ).subquery("pending_count") + + # insert count into snapshot + await session.execute( + insert(BacklogSnapshot).values( + count=query.c.count + ) + ) + diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index ca66f6ba..42c77ef7 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -114,4 +114,12 @@ def user_suggestion_not_exists( ) ) - return subquery \ No newline at end of file + return subquery + + @staticmethod + def count_distinct(field, label): + return func.count(func.distinct(field)).label(label) + + @staticmethod + def sum_distinct(field, label): + return func.sum(func.distinct(field)).label(label) \ No newline at end of file diff --git a/collector_db/models.py b/collector_db/models.py index b5e70cdc..d3c9b916 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -452,4 +452,11 @@ class UserRecordTypeSuggestion(Base): # Relationships - url = relationship("URL", back_populates="user_record_type_suggestion") \ No newline at end of file + url = relationship("URL", back_populates="user_record_type_suggestion") + +class BacklogSnapshot(Base): + __tablename__ = "backlog_snapshot" + + id = Column(Integer, primary_key=True, autoincrement=True) + count_pending_total = Column(Integer, nullable=False) + created_at = get_created_at_column() diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 46ccca0d..e7b7f534 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -15,6 +15,12 @@ from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse +from core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO +from core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO +from core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO +from core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO +from core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO +from core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ @@ -299,3 +305,21 @@ async def upload_manual_batch( async def search_for_url(self, url: str) -> SearchURLResponse: return await self.adb_client.search_for_url(url) + + async def get_batches_aggregated_metrics(self) -> GetMetricsBatchesAggregatedResponseDTO: + return await self.adb_client.get_batches_aggregated_metrics() + + async def get_batches_breakdown_metrics(self, page: int) -> GetMetricsBatchesBreakdownResponseDTO: + return await self.adb_client.get_batches_breakdown_metrics(page=page) + + async def get_urls_breakdown_submitted_metrics(self) -> GetMetricsURLsBreakdownSubmittedResponseDTO: + return await self.adb_client.get_urls_breakdown_submitted_metrics() + + async def get_urls_aggregated_metrics(self) -> GetMetricsURLsAggregatedResponseDTO: + return await self.adb_client.get_urls_aggregated_metrics() + + async def get_urls_breakdown_pending_metrics(self) -> GetMetricsURLsBreakdownPendingResponseDTO: + return await self.adb_client.get_urls_breakdown_pending_metrics() + + async def get_backlog_metrics(self) -> GetMetricsBacklogResponseDTO: + return await self.adb_client.get_backlog_metrics() \ No newline at end of file diff --git a/core/DTOs/GetMetricsBacklogResponse.py b/core/DTOs/GetMetricsBacklogResponse.py new file mode 100644 index 00000000..0df38324 --- /dev/null +++ b/core/DTOs/GetMetricsBacklogResponse.py @@ -0,0 +1,10 @@ +import datetime + +from pydantic import BaseModel + +class GetMetricsBacklogResponseInnerDTO(BaseModel): + week_of: datetime.date + count_pending_total: int + +class GetMetricsBacklogResponseDTO(BaseModel): + entries: list[GetMetricsBacklogResponseInnerDTO] \ No newline at end of file diff --git a/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py b/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py new file mode 100644 index 00000000..565ab208 --- /dev/null +++ b/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py @@ -0,0 +1,22 @@ +from pydantic import BaseModel + +from collector_manager.enums import CollectorType + + +class GetMetricsBatchesAggregatedInnerResponseDTO(BaseModel): + count_successful_batches: int + count_failed_batches: int + count_urls: int + count_urls_pending: int + count_urls_submitted: int + count_urls_rejected: int + count_urls_errors: int + + + +class GetMetricsBatchesAggregatedResponseDTO(BaseModel): + total_batches: int + by_strategy: dict[ + CollectorType, + GetMetricsBatchesAggregatedInnerResponseDTO + ] \ No newline at end of file diff --git a/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py b/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py new file mode 100644 index 00000000..5797ab54 --- /dev/null +++ b/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py @@ -0,0 +1,19 @@ +import datetime + +from pydantic import BaseModel + +from collector_manager.enums import CollectorType + + +class GetMetricsBatchesBreakdownInnerResponseDTO(BaseModel): + batch_id: str + strategy: CollectorType + created_at: datetime.datetime + count_url_total: int + count_url_pending: int + count_url_submitted: int + count_url_rejected: int + count_url_error: int + +class GetMetricsBatchesBreakdownResponseDTO(BaseModel): + batches: list[GetMetricsBatchesBreakdownInnerResponseDTO] \ No newline at end of file diff --git a/core/DTOs/GetMetricsURLsAggregatedResponseDTO.py b/core/DTOs/GetMetricsURLsAggregatedResponseDTO.py new file mode 100644 index 00000000..66009223 --- /dev/null +++ b/core/DTOs/GetMetricsURLsAggregatedResponseDTO.py @@ -0,0 +1,14 @@ +import datetime + +from pydantic import BaseModel + + +class GetMetricsURLsAggregatedResponseDTO(BaseModel): + count_urls_total: int + count_urls_pending: int + count_urls_submitted: int + count_urls_rejected: int + count_urls_validated: int + count_urls_errors: int + oldest_pending_url_created_at: datetime.datetime + oldest_pending_url_id: int \ No newline at end of file diff --git a/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py b/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py new file mode 100644 index 00000000..88b2a404 --- /dev/null +++ b/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py @@ -0,0 +1,12 @@ +from pydantic import BaseModel + +class GetMetricsURLsBreakdownPendingResponseInnerDTO(BaseModel): + week_created_at: str + count_pending_total: int + count_pending_relevant: int + count_pending_record_type: int + count_pending_agency: int + count_pending_final: int + +class GetMetricsURLsBreakdownPendingResponseDTO(BaseModel): + entries: list[GetMetricsURLsBreakdownPendingResponseInnerDTO] \ No newline at end of file diff --git a/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py b/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py new file mode 100644 index 00000000..7e17effe --- /dev/null +++ b/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py @@ -0,0 +1,10 @@ +from datetime import datetime + +from pydantic import BaseModel + +class GetMetricsURLsBreakdownSubmittedInnerDTO(BaseModel): + week_of: datetime.date + count_submitted: int + +class GetMetricsURLsBreakdownSubmittedResponseDTO(BaseModel): + entries: list \ No newline at end of file diff --git a/core/ScheduledTaskManager.py b/core/ScheduledTaskManager.py index 0a407d9e..e0b87247 100644 --- a/core/ScheduledTaskManager.py +++ b/core/ScheduledTaskManager.py @@ -18,6 +18,7 @@ def __init__(self, async_core: AsyncCore): # Jobs self.run_cycles_job = None self.delete_logs_job = None + self.populate_backlog_snapshot_job = None def add_scheduled_tasks(self): self.run_cycles_job = self.scheduler.add_job( @@ -35,6 +36,13 @@ def add_scheduled_tasks(self): start_date=datetime.now() + timedelta(minutes=10) ) ) + self.populate_backlog_snapshot_job = self.scheduler.add_job( + self.async_core.adb_client.populate_backlog_snapshot, + trigger=IntervalTrigger( + days=1, + start_date=datetime.now() + timedelta(minutes=20) + ) + ) def shutdown(self): if self.scheduler.running: From ee4489e5d91be0e5690087e7877f9b1ba996babd Mon Sep 17 00:00:00 2001 From: maxachis Date: Tue, 6 May 2025 12:43:57 -0400 Subject: [PATCH 165/244] DRAFT --- ...e17c04_create_url_annotation_flags_view.py | 5 +- ...007bbcce3_create_url_data_sources_table.py | 129 ++++++++++++++++++ collector_db/AsyncDatabaseClient.py | 73 +++++++++- collector_db/models.py | 48 ++++++- ...tMetricsURLsBreakdownPendingResponseDTO.py | 7 +- .../integration/api/test_metrics.py | 39 ++++++ 6 files changed, 285 insertions(+), 16 deletions(-) create mode 100644 alembic/versions/2025_05_06_1115-6f2007bbcce3_create_url_data_sources_table.py create mode 100644 tests/test_automated/integration/api/test_metrics.py diff --git a/alembic/versions/2025_05_06_0919-f25852e17c04_create_url_annotation_flags_view.py b/alembic/versions/2025_05_06_0919-f25852e17c04_create_url_annotation_flags_view.py index f0250c06..0da22094 100644 --- a/alembic/versions/2025_05_06_0919-f25852e17c04_create_url_annotation_flags_view.py +++ b/alembic/versions/2025_05_06_0919-f25852e17c04_create_url_annotation_flags_view.py @@ -8,7 +8,6 @@ from typing import Sequence, Union from alembic import op -import sqlalchemy as sa # revision identifiers, used by Alembic. @@ -22,8 +21,7 @@ def upgrade() -> None: op.execute(""" CREATE VIEW url_annotation_flags AS SELECT - u.id, - u.outcome, + u.id as url_id, CASE WHEN arts.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_auto_record_type_suggestion, CASE WHEN ars.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_auto_relevant_suggestion, CASE WHEN auas.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_auto_agency_suggestion, @@ -39,7 +37,6 @@ def upgrade() -> None: LEFT JOIN public.user_relevant_suggestions urs ON u.id = urs.url_id LEFT JOIN public.user_url_agency_suggestions uuas ON u.id = uuas.url_id LEFT JOIN public.reviewing_user_url ruu ON u.id = ruu.url_id; - """) diff --git a/alembic/versions/2025_05_06_1115-6f2007bbcce3_create_url_data_sources_table.py b/alembic/versions/2025_05_06_1115-6f2007bbcce3_create_url_data_sources_table.py new file mode 100644 index 00000000..da896c1c --- /dev/null +++ b/alembic/versions/2025_05_06_1115-6f2007bbcce3_create_url_data_sources_table.py @@ -0,0 +1,129 @@ +"""Create url_data_sources table + +Revision ID: 6f2007bbcce3 +Revises: f25852e17c04 +Create Date: 2025-05-06 11:15:24.485465 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision: str = '6f2007bbcce3' +down_revision: Union[str, None] = 'f25852e17c04' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # Create url_data_sources_table table + op.create_table( + 'url_data_sources', + sa.Column( + 'id', + sa.Integer(), + primary_key=True + ), + sa.Column( + 'url_id', + sa.Integer(), + sa.ForeignKey( + 'urls.id', + ondelete='CASCADE' + ), + nullable=False + ), + sa.Column( + 'data_source_id', + sa.Integer(), + nullable=False + ), + sa.Column( + 'created_at', + sa.TIMESTAMP(), + nullable=False, + server_default=sa.text('now()') + ), + sa.UniqueConstraint('url_id', name='uq_url_id'), + sa.UniqueConstraint('data_source_id', name='uq_data_source_id') + ) + + # Migrate existing urls with a data source ID + op.execute(""" + INSERT INTO url_data_sources + (url_id, data_source_id) + SELECT id, data_source_id + FROM urls + WHERE data_source_id IS NOT NULL + """) + + # Drop existing data source ID column from urls table + op.drop_column('urls', 'data_source_id') + + # Add trigger to ensure linked URL has status of submitted + op.execute(""" + CREATE FUNCTION check_url_is_submitted() RETURNS trigger AS $$ + BEGIN + IF EXISTS ( + SELECT 1 FROM urls WHERE id = NEW.url_id AND outcome != 'submitted' + ) THEN + RAISE EXCEPTION 'URL status is not submitted '; + END IF; + RETURN NEW; + END; + $$ LANGUAGE plpgsql; + """) + + op.execute(""" + CREATE TRIGGER check_url_is_submitted + BEFORE INSERT OR UPDATE ON url_data_sources + FOR EACH ROW + EXECUTE FUNCTION check_url_is_submitted(); + """) + + op.execute(""" + CREATE FUNCTION prevent_status_change_if_data_source_exists() RETURNS trigger AS $$ + BEGIN + IF OLD.outcome = 'submitted' AND NEW.outcome IS DISTINCT FROM OLD.status THEN + IF EXISTS ( + SELECT 1 FROM url_data_sources WHERE url_id = OLD.id + ) THEN + RAISE EXCEPTION 'Cannot change status from submitted: related child records exist.'; + END IF; + END IF; + RETURN NEW; + END; + $$ LANGUAGE plpgsql; + """) + + op.execute(""" + CREATE TRIGGER check_status_change + BEFORE UPDATE ON urls + FOR EACH ROW + EXECUTE FUNCTION prevent_status_change_if_data_source_exists(); + """) + + +def downgrade() -> None: + # Drop new trigger and function on URLS + op.execute(""" + DROP TRIGGER IF EXISTS check_url_is_submitted ON urls; + DROP FUNCTION IF EXISTS check_url_is_submitted; + DROP TRIGGER IF EXISTS check_status_change ON urls; + DROP FUNCTION IF EXISTS prevent_status_change_if_data_source_exists; + """) + + op.drop_table('url_data_sources') + + op.add_column( + 'urls', + sa.Column( + 'data_source_id', + sa.Integer(), + nullable=True + ) + ) + + diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index cf3cb47f..458cf75c 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -27,7 +27,7 @@ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Duplicate, Log, \ - BacklogSnapshot + BacklogSnapshot, URLAnnotationFlag, URLDataSource from collector_manager.enums import URLStatus, CollectorType from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo @@ -37,8 +37,10 @@ from core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO, \ GetMetricsBatchesBreakdownInnerResponseDTO from core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO -from core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO -from core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO +from core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO, \ + GetMetricsURLsBreakdownPendingResponseInnerDTO +from core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO, \ + GetMetricsURLsBreakdownSubmittedInnerDTO from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ @@ -1965,7 +1967,33 @@ async def get_urls_breakdown_submitted_metrics( self, session: AsyncSession ) -> GetMetricsURLsBreakdownSubmittedResponseDTO: - pass + # TODO: Wrong submitted at time: The created at does not indicate when it was submitted + + + # Build the query + week = func.date_trunc('week', URLDataSource.created_at) + query = ( + select( + week.label('week'), + func.count(URLDataSource.id).label('count_submitted'), + ) + .group_by(week) + .order_by(week.asc()) + ) + + # Execute the query + raw_results = await session.execute(query) + results = raw_results.all() + final_results: list[GetMetricsURLsBreakdownSubmittedInnerDTO] = [] + for result in results: + dto = GetMetricsURLsBreakdownSubmittedInnerDTO( + week_of=result.week, + count_submitted=result.count_submitted + ) + final_results.append(dto) + return GetMetricsURLsBreakdownSubmittedResponseDTO( + entries=final_results + ) @session_manager async def get_urls_aggregated_metrics( @@ -2028,13 +2056,44 @@ async def get_urls_breakdown_pending_metrics( self, session: AsyncSession ) -> GetMetricsURLsBreakdownPendingResponseDTO: - # I will need to get ways to identify the status of each url - # Probably would benefit from a view of some sort + flags = URLAnnotationFlag + url = URL + + week = func.date_trunc('week', url.created_at) + # Build the query + query = ( + select( + week.label('week'), + func.count(url.id).label('count_total'), + func.count(case((flags.has_user_record_type_annotation == True, 1))).label('user_record_type_count'), + func.count(case((flags.has_user_relevant_annotation == True, 1))).label('user_relevant_count'), + func.count(case((flags.has_user_agency_annotation == True, 1))).label('user_agency_count'), + ) + .where(url.outcome == URLStatus.PENDING.value) + .join(flags.url) + .group_by(week) + .order_by(week.asc()) + ) + # Execute the query and return the results + results = await session.execute(query) + all_results = results.scalars().all() + final_results: list[GetMetricsURLsBreakdownPendingResponseInnerDTO] = [] - pass + for result in all_results: + dto = GetMetricsURLsBreakdownPendingResponseInnerDTO( + week_created_at=result.week, + count_pending_total=result.count_total, + count_pending_relevant_user=result.auto_record_type_count, + count_pending_record_type_user=result.auto_relevant_count, + count_pending_agency_user=result.auto_agency_count, + ) + final_results.append(dto) + return GetMetricsURLsBreakdownPendingResponseDTO( + entries=final_results, + ) @session_manager async def get_backlog_metrics( diff --git a/collector_db/models.py b/collector_db/models.py index d3c9b916..375e5203 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -106,7 +106,6 @@ class URL(Base): record_type = Column(postgresql.ENUM(*record_type_values, name='record_type'), nullable=True) created_at = get_created_at_column() updated_at = get_updated_at_column() - data_source_id = Column(Integer, nullable=True) # Relationships batch = relationship("Batch", back_populates="urls") @@ -137,6 +136,15 @@ class URL(Base): confirmed_agencies = relationship( "ConfirmedURLAgency", ) + annotation_flags = relationship( + "URLAnnotationFlag", + back_populates="url" + ) + data_source = relationship( + "URLDataSource", + back_populates="url", + uselist=False + ) class URLOptionalDataSourceMetadata(Base): @@ -460,3 +468,41 @@ class BacklogSnapshot(Base): id = Column(Integer, primary_key=True, autoincrement=True) count_pending_total = Column(Integer, nullable=False) created_at = get_created_at_column() + +class URLAnnotationFlag(Base): + __tablename__ = "url_annotation_flags" + + url_id = Column( + Integer, + ForeignKey("urls.id"), + primary_key=True, + nullable=False + ) + has_auto_record_type_annotation = Column(Boolean, nullable=False) + has_auto_relevant_annotation = Column(Boolean, nullable=False) + has_auto_agency_annotation = Column(Boolean, nullable=False) + has_user_record_type_annotation = Column(Boolean, nullable=False) + has_user_relevant_annotation = Column(Boolean, nullable=False) + has_user_agency_annotation = Column(Boolean, nullable=False) + was_reviewed = Column(Boolean, nullable=False) + + # Relationships + url = relationship( + "URL", + back_populates="annotation_flags" + ) + +class URLDataSource(Base): + __tablename__ = "url_data_sources" + + id = Column(Integer, primary_key=True, autoincrement=True) + url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) + data_source_id = Column(Integer, nullable=False) + created_at = get_created_at_column() + + # Relationships + url = relationship( + "URL", + back_populates="data_source", + uselist=False + ) \ No newline at end of file diff --git a/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py b/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py index 88b2a404..304555b0 100644 --- a/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py +++ b/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py @@ -3,10 +3,9 @@ class GetMetricsURLsBreakdownPendingResponseInnerDTO(BaseModel): week_created_at: str count_pending_total: int - count_pending_relevant: int - count_pending_record_type: int - count_pending_agency: int - count_pending_final: int + count_pending_relevant_user: int + count_pending_record_type_user: int + count_pending_agency_user: int class GetMetricsURLsBreakdownPendingResponseDTO(BaseModel): entries: list[GetMetricsURLsBreakdownPendingResponseInnerDTO] \ No newline at end of file diff --git a/tests/test_automated/integration/api/test_metrics.py b/tests/test_automated/integration/api/test_metrics.py new file mode 100644 index 00000000..de5da4d3 --- /dev/null +++ b/tests/test_automated/integration/api/test_metrics.py @@ -0,0 +1,39 @@ +import pytest + + +@pytest.mark.asyncio +async def test_get_batches_aggregated_metrics(api_test_helper): + + + raise NotImplementedError + +@pytest.mark.asyncio +async def test_get_batches_breakdown_metrics(api_test_helper): + raise NotImplementedError + +@pytest.mark.asyncio +async def test_get_urls_breakdown_submitted_metrics(api_test_helper): + # Create URLs with submitted status, broken down in different amounts by different weeks + # And ensure the URLs are + +@pytest.mark.asyncio +async def test_get_urls_breakdown_pending_metrics(api_test_helper): + # Build URLs, broken down into three separate weeks, + # with each week having a different number of pending URLs + # with a different number of kinds of annotations per URLs + + # Additionally, add some URLs that are submitted, + # validated, errored, and ensure they are not counted + + + raise NotImplementedError + +@pytest.mark.asyncio +async def test_get_backlog_metrics(api_test_helper): + # Populate the backlog table and test that backlog metrics returned on a weekly basis + + # Ensure that multiple days in each week are added to the backlog table, with different values + + # Test that the count closest to the beginning of the week is returned for each week + + raise NotImplementedError From c6c829900fcd1c7b0f05370ad4f7f85ab48d0e15 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 7 May 2025 14:07:21 -0400 Subject: [PATCH 166/244] DRAFT --- collector_db/AsyncDatabaseClient.py | 4 ++++ collector_db/DTOs/URLInfo.py | 1 + tests/test_automated/integration/api/test_metrics.py | 2 ++ 3 files changed, 7 insertions(+) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 458cf75c..d30d4aeb 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -1324,6 +1324,8 @@ async def insert_url(self, session: AsyncSession, url_info: URLInfo) -> int: collector_metadata=url_info.collector_metadata, outcome=url_info.outcome.value ) + if url_info.created_at is not None: + url_entry.created_at = url_info.created_at session.add(url_entry) await session.flush() return url_entry.id @@ -1370,6 +1372,8 @@ async def insert_batch(self, session: AsyncSession, batch_info: BatchInfo) -> in record_type_match_rate=batch_info.record_type_match_rate, record_category_match_rate=batch_info.record_category_match_rate, ) + if batch_info.date_generated is not None: + batch.date_generated = batch_info.date_generated session.add(batch) await session.flush() return batch.id diff --git a/collector_db/DTOs/URLInfo.py b/collector_db/DTOs/URLInfo.py index c47d2830..5a1d2221 100644 --- a/collector_db/DTOs/URLInfo.py +++ b/collector_db/DTOs/URLInfo.py @@ -13,4 +13,5 @@ class URLInfo(BaseModel): collector_metadata: Optional[dict] = None outcome: URLStatus = URLStatus.PENDING updated_at: Optional[datetime.datetime] = None + created_at: Optional[datetime.datetime] = None name: Optional[str] = None diff --git a/tests/test_automated/integration/api/test_metrics.py b/tests/test_automated/integration/api/test_metrics.py index de5da4d3..44eff414 100644 --- a/tests/test_automated/integration/api/test_metrics.py +++ b/tests/test_automated/integration/api/test_metrics.py @@ -3,7 +3,9 @@ @pytest.mark.asyncio async def test_get_batches_aggregated_metrics(api_test_helper): + # Create successful batches with URLs of different statuses + # Create failed batches raise NotImplementedError From 8d62278720d72f9812860b12ec44666c26b4accd Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 7 May 2025 15:03:47 -0400 Subject: [PATCH 167/244] Convert to full uv/pyproject dependency management --- .github/workflows/test_app.yml | 4 - Dockerfile | 10 +- README.md | 6 + pyproject.toml | 53 +- requirements.txt | 54 - start_mirrored_local_app.py | 4 - uv.lock | 2824 ++++++++++++++++++++++++++++++++ 7 files changed, 2887 insertions(+), 68 deletions(-) delete mode 100644 requirements.txt create mode 100644 uv.lock diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index 5b4da872..5cff8696 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -37,10 +37,6 @@ jobs: with: python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: | - uv pip install --system -r requirements.txt - - name: Run tests run: | pytest tests/test_automated diff --git a/Dockerfile b/Dockerfile index 5352bc99..58111591 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,12 +6,14 @@ COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ # Set working directory WORKDIR /app -COPY requirements.txt ./requirements.txt +COPY pyproject.toml uv.lock ./ # Install dependencies -RUN uv pip install --system -r requirements.txt -RUN playwright install chromium -RUN playwright install-deps chromium +RUN uv sync +# Must call from the root directory because uv does not add playwright to path +RUN /app/.venv/bin/playwright install-deps chromium +RUN /app/.venv/bin/playwright install chromium + # Copy project files COPY api ./api diff --git a/README.md b/README.md index 5a39d2bd..78b6fbfe 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,12 @@ core | A module which integrates other components, such as collector_manager and api | API for interacting with collector_manager, core, and collector_db local_database | Resources for setting up a test database for local development +## Installation + +``` +uv sync +``` + ## How to use 1. Create an .env file in this directory with these contents, or set the environment variable another way: `VUE_APP_PDAP_API_KEY=KeyGoesHere` diff --git a/pyproject.toml b/pyproject.toml index 161cc214..de0abfcd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,52 @@ [project] -name="source-collector" -version="0.1.0" \ No newline at end of file +name = "data-source-identification" +version = "0.1.0" +requires-python = ">=3.11" +dependencies = [ + "aiohttp~=3.11.11", + "alembic~=1.14.0", + "apscheduler~=3.11.0", + "asyncpg~=0.30.0", + "beautifulsoup4>=4.12.3", + "bs4~=0.0.2", + "ckanapi~=4.8", + "datasets~=2.19.1", + "docker~=7.1.0", + "fastapi[standard]~=0.115.6", + "from-root~=1.3.0", + "google-api-python-client>=2.156.0", + "httpx~=0.28.1", + "huggingface-hub~=0.28.1", + "keras~=2.15.0", + "lxml~=5.1.0", + "marshmallow~=3.23.2", + "numpy~=1.26.4", + "openai~=1.60.1", + "pandas~=2.2.3", + "playwright~=1.49.1", + "psycopg2-binary~=2.9.6", + "psycopg[binary]~=3.1.20", + "pydantic~=2.10.6", + "pyjwt~=2.10.1", + "python-dotenv~=1.0.1", + "requests~=2.32.3", + "sqlalchemy~=2.0.36", + "starlette~=0.45.3", + "tensorflow-cpu~=2.15.1", + "tensorflow-io-gcs-filesystem==0.31.0", + "tqdm>=4.64.1", + "transformers~=4.40.2", + "urllib3~=1.26.18", + "uvicorn~=0.34.0", +] + +[dependency-groups] +dev = [ + "docker>=7.1.0", + "pytest>=7.2.2", + "pytest-asyncio~=0.25.2", + "pytest-mock==3.12.0", + "pytest-timeout~=2.3.1", +] + + diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 911e66fb..00000000 --- a/requirements.txt +++ /dev/null @@ -1,54 +0,0 @@ -requests~=2.32.3 -python-dotenv~=1.0.1 -bs4~=0.0.2 -tqdm>=4.64.1 -pytest>=7.2.2 -pytest-mock==3.12.0 -urllib3~=1.26.18 -psycopg2-binary~=2.9.6 -pandas~=2.2.3 -datasets~=2.19.1 -# common_crawler only -huggingface-hub~=0.28.1 - -# html_tag_collector_only -lxml~=5.1.0 -beautifulsoup4>=4.12.3 - -# CKAN Collector -from-root~=1.3.0 - -# Google Collector -google-api-python-client>=2.156.0 # TODO: Check for delete -marshmallow~=3.23.2 - -sqlalchemy~=2.0.36 -fastapi[standard]~=0.115.6 -httpx~=0.28.1 -ckanapi~=4.8 # TODO: Check for delete -psycopg[binary]~=3.1.20 -APScheduler~=3.11.0 -alembic~=1.14.0 -asyncpg~=0.30.0 -pytest-asyncio~=0.25.2 -transformers~=4.40.2 -tensorflow-cpu~=2.15.1 -keras~=2.15.0 - - -# HTML Collector -playwright~=1.49.1 - -# Security Manager -PyJWT~=2.10.1 - -# Tests -pytest-timeout~=2.3.1 - -openai~=1.60.1 -aiohttp~=3.11.11 -uvicorn~=0.34.0 -pydantic~=2.10.6 -starlette~=0.45.3 -numpy~=1.26.4 -docker~=7.1.0 \ No newline at end of file diff --git a/start_mirrored_local_app.py b/start_mirrored_local_app.py index 236030d0..7bcd573f 100644 --- a/start_mirrored_local_app.py +++ b/start_mirrored_local_app.py @@ -1,10 +1,6 @@ """ Starts a local instance of the application utilizing a database mirrored from production. - -Because this is used for testing only, the docker module is not included in -requirements.txt, and must be installed separately via -`pip install docker` """ import uvicorn diff --git a/uv.lock b/uv.lock new file mode 100644 index 00000000..f2ea60ae --- /dev/null +++ b/uv.lock @@ -0,0 +1,2824 @@ +version = 1 +revision = 2 +requires-python = ">=3.11" +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version == '3.12.*'", + "python_full_version < '3.12'", +] + +[[package]] +name = "absl-py" +version = "2.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/f0/e6342091061ed3a46aadc116b13edd7bb5249c3ab1b3ef07f24b0c248fc3/absl_py-2.2.2.tar.gz", hash = "sha256:bf25b2c2eed013ca456918c453d687eab4e8309fba81ee2f4c1a6aa2494175eb", size = 119982, upload_time = "2025-04-03T12:41:04.55Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/d4/349f7f4bd5ea92dab34f5bb0fe31775ef6c311427a14d5a5b31ecb442341/absl_py-2.2.2-py3-none-any.whl", hash = "sha256:e5797bc6abe45f64fd95dc06394ca3f2bedf3b5d895e9da691c9ee3397d70092", size = 135565, upload_time = "2025-04-03T12:41:03.172Z" }, +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload_time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload_time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.11.18" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/e7/fa1a8c00e2c54b05dc8cb5d1439f627f7c267874e3f7bb047146116020f9/aiohttp-3.11.18.tar.gz", hash = "sha256:ae856e1138612b7e412db63b7708735cff4d38d0399f6a5435d3dac2669f558a", size = 7678653, upload_time = "2025-04-21T09:43:09.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/10/fd9ee4f9e042818c3c2390054c08ccd34556a3cb209d83285616434cf93e/aiohttp-3.11.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:427fdc56ccb6901ff8088544bde47084845ea81591deb16f957897f0f0ba1be9", size = 712088, upload_time = "2025-04-21T09:40:55.776Z" }, + { url = "https://files.pythonhosted.org/packages/22/eb/6a77f055ca56f7aae2cd2a5607a3c9e7b9554f1497a069dcfcb52bfc9540/aiohttp-3.11.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c828b6d23b984255b85b9b04a5b963a74278b7356a7de84fda5e3b76866597b", size = 471450, upload_time = "2025-04-21T09:40:57.301Z" }, + { url = "https://files.pythonhosted.org/packages/78/dc/5f3c0d27c91abf0bb5d103e9c9b0ff059f60cf6031a5f06f456c90731f42/aiohttp-3.11.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c2eaa145bb36b33af1ff2860820ba0589e165be4ab63a49aebfd0981c173b66", size = 457836, upload_time = "2025-04-21T09:40:59.322Z" }, + { url = "https://files.pythonhosted.org/packages/49/7b/55b65af9ef48b9b811c91ff8b5b9de9650c71147f10523e278d297750bc8/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d518ce32179f7e2096bf4e3e8438cf445f05fedd597f252de9f54c728574756", size = 1690978, upload_time = "2025-04-21T09:41:00.795Z" }, + { url = "https://files.pythonhosted.org/packages/a2/5a/3f8938c4f68ae400152b42742653477fc625d6bfe02e764f3521321c8442/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0700055a6e05c2f4711011a44364020d7a10fbbcd02fbf3e30e8f7e7fddc8717", size = 1745307, upload_time = "2025-04-21T09:41:02.89Z" }, + { url = "https://files.pythonhosted.org/packages/b4/42/89b694a293333ef6f771c62da022163bcf44fb03d4824372d88e3dc12530/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bd1cde83e4684324e6ee19adfc25fd649d04078179890be7b29f76b501de8e4", size = 1780692, upload_time = "2025-04-21T09:41:04.461Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ce/1a75384e01dd1bf546898b6062b1b5f7a59b6692ef802e4dd6db64fed264/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73b8870fe1c9a201b8c0d12c94fe781b918664766728783241a79e0468427e4f", size = 1676934, upload_time = "2025-04-21T09:41:06.728Z" }, + { url = "https://files.pythonhosted.org/packages/a5/31/442483276e6c368ab5169797d9873b5875213cbcf7e74b95ad1c5003098a/aiohttp-3.11.18-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25557982dd36b9e32c0a3357f30804e80790ec2c4d20ac6bcc598533e04c6361", size = 1621190, upload_time = "2025-04-21T09:41:08.293Z" }, + { url = "https://files.pythonhosted.org/packages/7b/83/90274bf12c079457966008a58831a99675265b6a34b505243e004b408934/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e889c9df381a2433802991288a61e5a19ceb4f61bd14f5c9fa165655dcb1fd1", size = 1658947, upload_time = "2025-04-21T09:41:11.054Z" }, + { url = "https://files.pythonhosted.org/packages/91/c1/da9cee47a0350b78fdc93670ebe7ad74103011d7778ab4c382ca4883098d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9ea345fda05bae217b6cce2acf3682ce3b13d0d16dd47d0de7080e5e21362421", size = 1654443, upload_time = "2025-04-21T09:41:13.213Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f2/73cbe18dc25d624f79a09448adfc4972f82ed6088759ddcf783cd201956c/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9f26545b9940c4b46f0a9388fd04ee3ad7064c4017b5a334dd450f616396590e", size = 1644169, upload_time = "2025-04-21T09:41:14.827Z" }, + { url = "https://files.pythonhosted.org/packages/5b/32/970b0a196c4dccb1b0cfa5b4dc3b20f63d76f1c608f41001a84b2fd23c3d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3a621d85e85dccabd700294494d7179ed1590b6d07a35709bb9bd608c7f5dd1d", size = 1728532, upload_time = "2025-04-21T09:41:17.168Z" }, + { url = "https://files.pythonhosted.org/packages/0b/50/b1dc810a41918d2ea9574e74125eb053063bc5e14aba2d98966f7d734da0/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9c23fd8d08eb9c2af3faeedc8c56e134acdaf36e2117ee059d7defa655130e5f", size = 1750310, upload_time = "2025-04-21T09:41:19.353Z" }, + { url = "https://files.pythonhosted.org/packages/95/24/39271f5990b35ff32179cc95537e92499d3791ae82af7dcf562be785cd15/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9e6b0e519067caa4fd7fb72e3e8002d16a68e84e62e7291092a5433763dc0dd", size = 1691580, upload_time = "2025-04-21T09:41:21.868Z" }, + { url = "https://files.pythonhosted.org/packages/6b/78/75d0353feb77f041460564f12fe58e456436bbc00cbbf5d676dbf0038cc2/aiohttp-3.11.18-cp311-cp311-win32.whl", hash = "sha256:122f3e739f6607e5e4c6a2f8562a6f476192a682a52bda8b4c6d4254e1138f4d", size = 417565, upload_time = "2025-04-21T09:41:24.78Z" }, + { url = "https://files.pythonhosted.org/packages/ed/97/b912dcb654634a813f8518de359364dfc45976f822116e725dc80a688eee/aiohttp-3.11.18-cp311-cp311-win_amd64.whl", hash = "sha256:e6f3c0a3a1e73e88af384b2e8a0b9f4fb73245afd47589df2afcab6b638fa0e6", size = 443652, upload_time = "2025-04-21T09:41:26.48Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d2/5bc436f42bf4745c55f33e1e6a2d69e77075d3e768e3d1a34f96ee5298aa/aiohttp-3.11.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:63d71eceb9cad35d47d71f78edac41fcd01ff10cacaa64e473d1aec13fa02df2", size = 706671, upload_time = "2025-04-21T09:41:28.021Z" }, + { url = "https://files.pythonhosted.org/packages/fe/d0/2dbabecc4e078c0474abb40536bbde717fb2e39962f41c5fc7a216b18ea7/aiohttp-3.11.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d1929da615840969929e8878d7951b31afe0bac883d84418f92e5755d7b49508", size = 466169, upload_time = "2025-04-21T09:41:29.783Z" }, + { url = "https://files.pythonhosted.org/packages/70/84/19edcf0b22933932faa6e0be0d933a27bd173da02dc125b7354dff4d8da4/aiohttp-3.11.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d0aebeb2392f19b184e3fdd9e651b0e39cd0f195cdb93328bd124a1d455cd0e", size = 457554, upload_time = "2025-04-21T09:41:31.327Z" }, + { url = "https://files.pythonhosted.org/packages/32/d0/e8d1f034ae5624a0f21e4fb3feff79342ce631f3a4d26bd3e58b31ef033b/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3849ead845e8444f7331c284132ab314b4dac43bfae1e3cf350906d4fff4620f", size = 1690154, upload_time = "2025-04-21T09:41:33.541Z" }, + { url = "https://files.pythonhosted.org/packages/16/de/2f9dbe2ac6f38f8495562077131888e0d2897e3798a0ff3adda766b04a34/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e8452ad6b2863709f8b3d615955aa0807bc093c34b8e25b3b52097fe421cb7f", size = 1733402, upload_time = "2025-04-21T09:41:35.634Z" }, + { url = "https://files.pythonhosted.org/packages/e0/04/bd2870e1e9aef990d14b6df2a695f17807baf5c85a4c187a492bda569571/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b8d2b42073611c860a37f718b3d61ae8b4c2b124b2e776e2c10619d920350ec", size = 1783958, upload_time = "2025-04-21T09:41:37.456Z" }, + { url = "https://files.pythonhosted.org/packages/23/06/4203ffa2beb5bedb07f0da0f79b7d9039d1c33f522e0d1a2d5b6218e6f2e/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fbf91f6a0ac317c0a07eb328a1384941872f6761f2e6f7208b63c4cc0a7ff6", size = 1695288, upload_time = "2025-04-21T09:41:39.756Z" }, + { url = "https://files.pythonhosted.org/packages/30/b2/e2285dda065d9f29ab4b23d8bcc81eb881db512afb38a3f5247b191be36c/aiohttp-3.11.18-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ff5625413fec55216da5eaa011cf6b0a2ed67a565914a212a51aa3755b0009", size = 1618871, upload_time = "2025-04-21T09:41:41.972Z" }, + { url = "https://files.pythonhosted.org/packages/57/e0/88f2987885d4b646de2036f7296ebea9268fdbf27476da551c1a7c158bc0/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7f33a92a2fde08e8c6b0c61815521324fc1612f397abf96eed86b8e31618fdb4", size = 1646262, upload_time = "2025-04-21T09:41:44.192Z" }, + { url = "https://files.pythonhosted.org/packages/e0/19/4d2da508b4c587e7472a032290b2981f7caeca82b4354e19ab3df2f51d56/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:11d5391946605f445ddafda5eab11caf310f90cdda1fd99865564e3164f5cff9", size = 1677431, upload_time = "2025-04-21T09:41:46.049Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ae/047473ea50150a41440f3265f53db1738870b5a1e5406ece561ca61a3bf4/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3cc314245deb311364884e44242e00c18b5896e4fe6d5f942e7ad7e4cb640adb", size = 1637430, upload_time = "2025-04-21T09:41:47.973Z" }, + { url = "https://files.pythonhosted.org/packages/11/32/c6d1e3748077ce7ee13745fae33e5cb1dac3e3b8f8787bf738a93c94a7d2/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f421843b0f70740772228b9e8093289924359d306530bcd3926f39acbe1adda", size = 1703342, upload_time = "2025-04-21T09:41:50.323Z" }, + { url = "https://files.pythonhosted.org/packages/c5/1d/a3b57bfdbe285f0d45572d6d8f534fd58761da3e9cbc3098372565005606/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e220e7562467dc8d589e31c1acd13438d82c03d7f385c9cd41a3f6d1d15807c1", size = 1740600, upload_time = "2025-04-21T09:41:52.111Z" }, + { url = "https://files.pythonhosted.org/packages/a5/71/f9cd2fed33fa2b7ce4d412fb7876547abb821d5b5520787d159d0748321d/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab2ef72f8605046115bc9aa8e9d14fd49086d405855f40b79ed9e5c1f9f4faea", size = 1695131, upload_time = "2025-04-21T09:41:53.94Z" }, + { url = "https://files.pythonhosted.org/packages/97/97/d1248cd6d02b9de6aa514793d0dcb20099f0ec47ae71a933290116c070c5/aiohttp-3.11.18-cp312-cp312-win32.whl", hash = "sha256:12a62691eb5aac58d65200c7ae94d73e8a65c331c3a86a2e9670927e94339ee8", size = 412442, upload_time = "2025-04-21T09:41:55.689Z" }, + { url = "https://files.pythonhosted.org/packages/33/9a/e34e65506e06427b111e19218a99abf627638a9703f4b8bcc3e3021277ed/aiohttp-3.11.18-cp312-cp312-win_amd64.whl", hash = "sha256:364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8", size = 439444, upload_time = "2025-04-21T09:41:57.977Z" }, + { url = "https://files.pythonhosted.org/packages/0a/18/be8b5dd6b9cf1b2172301dbed28e8e5e878ee687c21947a6c81d6ceaa15d/aiohttp-3.11.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:474215ec618974054cf5dc465497ae9708543cbfc312c65212325d4212525811", size = 699833, upload_time = "2025-04-21T09:42:00.298Z" }, + { url = "https://files.pythonhosted.org/packages/0d/84/ecdc68e293110e6f6f6d7b57786a77555a85f70edd2b180fb1fafaff361a/aiohttp-3.11.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ced70adf03920d4e67c373fd692123e34d3ac81dfa1c27e45904a628567d804", size = 462774, upload_time = "2025-04-21T09:42:02.015Z" }, + { url = "https://files.pythonhosted.org/packages/d7/85/f07718cca55884dad83cc2433746384d267ee970e91f0dcc75c6d5544079/aiohttp-3.11.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d9f6c0152f8d71361905aaf9ed979259537981f47ad099c8b3d81e0319814bd", size = 454429, upload_time = "2025-04-21T09:42:03.728Z" }, + { url = "https://files.pythonhosted.org/packages/82/02/7f669c3d4d39810db8842c4e572ce4fe3b3a9b82945fdd64affea4c6947e/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a35197013ed929c0aed5c9096de1fc5a9d336914d73ab3f9df14741668c0616c", size = 1670283, upload_time = "2025-04-21T09:42:06.053Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/b82a12f67009b377b6c07a26bdd1b81dab7409fc2902d669dbfa79e5ac02/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:540b8a1f3a424f1af63e0af2d2853a759242a1769f9f1ab053996a392bd70118", size = 1717231, upload_time = "2025-04-21T09:42:07.953Z" }, + { url = "https://files.pythonhosted.org/packages/a6/38/d5a1f28c3904a840642b9a12c286ff41fc66dfa28b87e204b1f242dbd5e6/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9e6710ebebfce2ba21cee6d91e7452d1125100f41b906fb5af3da8c78b764c1", size = 1769621, upload_time = "2025-04-21T09:42:09.855Z" }, + { url = "https://files.pythonhosted.org/packages/53/2d/deb3749ba293e716b5714dda06e257f123c5b8679072346b1eb28b766a0b/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8af2ef3b4b652ff109f98087242e2ab974b2b2b496304063585e3d78de0b000", size = 1678667, upload_time = "2025-04-21T09:42:11.741Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a8/04b6e11683a54e104b984bd19a9790eb1ae5f50968b601bb202d0406f0ff/aiohttp-3.11.18-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28c3f975e5ae3dbcbe95b7e3dcd30e51da561a0a0f2cfbcdea30fc1308d72137", size = 1601592, upload_time = "2025-04-21T09:42:14.137Z" }, + { url = "https://files.pythonhosted.org/packages/5e/9d/c33305ae8370b789423623f0e073d09ac775cd9c831ac0f11338b81c16e0/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c28875e316c7b4c3e745172d882d8a5c835b11018e33432d281211af35794a93", size = 1621679, upload_time = "2025-04-21T09:42:16.056Z" }, + { url = "https://files.pythonhosted.org/packages/56/45/8e9a27fff0538173d47ba60362823358f7a5f1653c6c30c613469f94150e/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:13cd38515568ae230e1ef6919e2e33da5d0f46862943fcda74e7e915096815f3", size = 1656878, upload_time = "2025-04-21T09:42:18.368Z" }, + { url = "https://files.pythonhosted.org/packages/84/5b/8c5378f10d7a5a46b10cb9161a3aac3eeae6dba54ec0f627fc4ddc4f2e72/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0e2a92101efb9f4c2942252c69c63ddb26d20f46f540c239ccfa5af865197bb8", size = 1620509, upload_time = "2025-04-21T09:42:20.141Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2f/99dee7bd91c62c5ff0aa3c55f4ae7e1bc99c6affef780d7777c60c5b3735/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e6d3e32b8753c8d45ac550b11a1090dd66d110d4ef805ffe60fa61495360b3b2", size = 1680263, upload_time = "2025-04-21T09:42:21.993Z" }, + { url = "https://files.pythonhosted.org/packages/03/0a/378745e4ff88acb83e2d5c884a4fe993a6e9f04600a4560ce0e9b19936e3/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ea4cf2488156e0f281f93cc2fd365025efcba3e2d217cbe3df2840f8c73db261", size = 1715014, upload_time = "2025-04-21T09:42:23.87Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0b/b5524b3bb4b01e91bc4323aad0c2fcaebdf2f1b4d2eb22743948ba364958/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d4df95ad522c53f2b9ebc07f12ccd2cb15550941e11a5bbc5ddca2ca56316d7", size = 1666614, upload_time = "2025-04-21T09:42:25.764Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b7/3d7b036d5a4ed5a4c704e0754afe2eef24a824dfab08e6efbffb0f6dd36a/aiohttp-3.11.18-cp313-cp313-win32.whl", hash = "sha256:cdd1bbaf1e61f0d94aced116d6e95fe25942f7a5f42382195fd9501089db5d78", size = 411358, upload_time = "2025-04-21T09:42:27.558Z" }, + { url = "https://files.pythonhosted.org/packages/1e/3c/143831b32cd23b5263a995b2a1794e10aa42f8a895aae5074c20fda36c07/aiohttp-3.11.18-cp313-cp313-win_amd64.whl", hash = "sha256:bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01", size = 437658, upload_time = "2025-04-21T09:42:29.209Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424, upload_time = "2024-12-13T17:10:40.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597, upload_time = "2024-12-13T17:10:38.469Z" }, +] + +[[package]] +name = "alembic" +version = "1.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mako" }, + { name = "sqlalchemy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/09/f844822e4e847a3f0bd41797f93c4674cd4d2462a3f6c459aa528cdf786e/alembic-1.14.1.tar.gz", hash = "sha256:496e888245a53adf1498fcab31713a469c65836f8de76e01399aa1c3e90dd213", size = 1918219, upload_time = "2025-01-19T23:15:30.12Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/7e/ac0991d1745f7d755fc1cd381b3990a45b404b4d008fc75e2a983516fbfe/alembic-1.14.1-py3-none-any.whl", hash = "sha256:1acdd7a3a478e208b0503cd73614d5e4c6efafa4e73518bb60e4f2846a37b1c5", size = 233565, upload_time = "2025-01-19T23:15:32.523Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload_time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload_time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload_time = "2025-03-17T00:02:54.77Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload_time = "2025-03-17T00:02:52.713Z" }, +] + +[[package]] +name = "apscheduler" +version = "3.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzlocal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4e/00/6d6814ddc19be2df62c8c898c4df6b5b1914f3bd024b780028caa392d186/apscheduler-3.11.0.tar.gz", hash = "sha256:4c622d250b0955a65d5d0eb91c33e6d43fd879834bf541e0a18661ae60460133", size = 107347, upload_time = "2024-11-24T19:39:26.463Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/ae/9a053dd9229c0fde6b1f1f33f609ccff1ee79ddda364c756a924c6d8563b/APScheduler-3.11.0-py3-none-any.whl", hash = "sha256:fc134ca32e50f5eadcc4938e3a4545ab19131435e851abb40b34d63d5141c6da", size = 64004, upload_time = "2024-11-24T19:39:24.442Z" }, +] + +[[package]] +name = "astunparse" +version = "1.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, + { name = "wheel" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/af/4182184d3c338792894f34a62672919db7ca008c89abee9b564dd34d8029/astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872", size = 18290, upload_time = "2019-12-22T18:12:13.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/03/13dde6512ad7b4557eb792fbcf0c653af6076b81e5941d36ec61f7ce6028/astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8", size = 12732, upload_time = "2019-12-22T18:12:11.297Z" }, +] + +[[package]] +name = "asyncpg" +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/4c/7c991e080e106d854809030d8584e15b2e996e26f16aee6d757e387bc17d/asyncpg-0.30.0.tar.gz", hash = "sha256:c551e9928ab6707602f44811817f82ba3c446e018bfe1d3abecc8ba5f3eac851", size = 957746, upload_time = "2024-10-20T00:30:41.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/0e/f5d708add0d0b97446c402db7e8dd4c4183c13edaabe8a8500b411e7b495/asyncpg-0.30.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5e0511ad3dec5f6b4f7a9e063591d407eee66b88c14e2ea636f187da1dcfff6a", size = 674506, upload_time = "2024-10-20T00:29:27.988Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a0/67ec9a75cb24a1d99f97b8437c8d56da40e6f6bd23b04e2f4ea5d5ad82ac/asyncpg-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:915aeb9f79316b43c3207363af12d0e6fd10776641a7de8a01212afd95bdf0ed", size = 645922, upload_time = "2024-10-20T00:29:29.391Z" }, + { url = "https://files.pythonhosted.org/packages/5c/d9/a7584f24174bd86ff1053b14bb841f9e714380c672f61c906eb01d8ec433/asyncpg-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c198a00cce9506fcd0bf219a799f38ac7a237745e1d27f0e1f66d3707c84a5a", size = 3079565, upload_time = "2024-10-20T00:29:30.832Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d7/a4c0f9660e333114bdb04d1a9ac70db690dd4ae003f34f691139a5cbdae3/asyncpg-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3326e6d7381799e9735ca2ec9fd7be4d5fef5dcbc3cb555d8a463d8460607956", size = 3109962, upload_time = "2024-10-20T00:29:33.114Z" }, + { url = "https://files.pythonhosted.org/packages/3c/21/199fd16b5a981b1575923cbb5d9cf916fdc936b377e0423099f209e7e73d/asyncpg-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:51da377487e249e35bd0859661f6ee2b81db11ad1f4fc036194bc9cb2ead5056", size = 3064791, upload_time = "2024-10-20T00:29:34.677Z" }, + { url = "https://files.pythonhosted.org/packages/77/52/0004809b3427534a0c9139c08c87b515f1c77a8376a50ae29f001e53962f/asyncpg-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc6d84136f9c4d24d358f3b02be4b6ba358abd09f80737d1ac7c444f36108454", size = 3188696, upload_time = "2024-10-20T00:29:36.389Z" }, + { url = "https://files.pythonhosted.org/packages/52/cb/fbad941cd466117be58b774a3f1cc9ecc659af625f028b163b1e646a55fe/asyncpg-0.30.0-cp311-cp311-win32.whl", hash = "sha256:574156480df14f64c2d76450a3f3aaaf26105869cad3865041156b38459e935d", size = 567358, upload_time = "2024-10-20T00:29:37.915Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0a/0a32307cf166d50e1ad120d9b81a33a948a1a5463ebfa5a96cc5606c0863/asyncpg-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:3356637f0bd830407b5597317b3cb3571387ae52ddc3bca6233682be88bbbc1f", size = 629375, upload_time = "2024-10-20T00:29:39.987Z" }, + { url = "https://files.pythonhosted.org/packages/4b/64/9d3e887bb7b01535fdbc45fbd5f0a8447539833b97ee69ecdbb7a79d0cb4/asyncpg-0.30.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c902a60b52e506d38d7e80e0dd5399f657220f24635fee368117b8b5fce1142e", size = 673162, upload_time = "2024-10-20T00:29:41.88Z" }, + { url = "https://files.pythonhosted.org/packages/6e/eb/8b236663f06984f212a087b3e849731f917ab80f84450e943900e8ca4052/asyncpg-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aca1548e43bbb9f0f627a04666fedaca23db0a31a84136ad1f868cb15deb6e3a", size = 637025, upload_time = "2024-10-20T00:29:43.352Z" }, + { url = "https://files.pythonhosted.org/packages/cc/57/2dc240bb263d58786cfaa60920779af6e8d32da63ab9ffc09f8312bd7a14/asyncpg-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c2a2ef565400234a633da0eafdce27e843836256d40705d83ab7ec42074efb3", size = 3496243, upload_time = "2024-10-20T00:29:44.922Z" }, + { url = "https://files.pythonhosted.org/packages/f4/40/0ae9d061d278b10713ea9021ef6b703ec44698fe32178715a501ac696c6b/asyncpg-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1292b84ee06ac8a2ad8e51c7475aa309245874b61333d97411aab835c4a2f737", size = 3575059, upload_time = "2024-10-20T00:29:46.891Z" }, + { url = "https://files.pythonhosted.org/packages/c3/75/d6b895a35a2c6506952247640178e5f768eeb28b2e20299b6a6f1d743ba0/asyncpg-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0f5712350388d0cd0615caec629ad53c81e506b1abaaf8d14c93f54b35e3595a", size = 3473596, upload_time = "2024-10-20T00:29:49.201Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e7/3693392d3e168ab0aebb2d361431375bd22ffc7b4a586a0fc060d519fae7/asyncpg-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:db9891e2d76e6f425746c5d2da01921e9a16b5a71a1c905b13f30e12a257c4af", size = 3641632, upload_time = "2024-10-20T00:29:50.768Z" }, + { url = "https://files.pythonhosted.org/packages/32/ea/15670cea95745bba3f0352341db55f506a820b21c619ee66b7d12ea7867d/asyncpg-0.30.0-cp312-cp312-win32.whl", hash = "sha256:68d71a1be3d83d0570049cd1654a9bdfe506e794ecc98ad0873304a9f35e411e", size = 560186, upload_time = "2024-10-20T00:29:52.394Z" }, + { url = "https://files.pythonhosted.org/packages/7e/6b/fe1fad5cee79ca5f5c27aed7bd95baee529c1bf8a387435c8ba4fe53d5c1/asyncpg-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:9a0292c6af5c500523949155ec17b7fe01a00ace33b68a476d6b5059f9630305", size = 621064, upload_time = "2024-10-20T00:29:53.757Z" }, + { url = "https://files.pythonhosted.org/packages/3a/22/e20602e1218dc07692acf70d5b902be820168d6282e69ef0d3cb920dc36f/asyncpg-0.30.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05b185ebb8083c8568ea8a40e896d5f7af4b8554b64d7719c0eaa1eb5a5c3a70", size = 670373, upload_time = "2024-10-20T00:29:55.165Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b3/0cf269a9d647852a95c06eb00b815d0b95a4eb4b55aa2d6ba680971733b9/asyncpg-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c47806b1a8cbb0a0db896f4cd34d89942effe353a5035c62734ab13b9f938da3", size = 634745, upload_time = "2024-10-20T00:29:57.14Z" }, + { url = "https://files.pythonhosted.org/packages/8e/6d/a4f31bf358ce8491d2a31bfe0d7bcf25269e80481e49de4d8616c4295a34/asyncpg-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b6fde867a74e8c76c71e2f64f80c64c0f3163e687f1763cfaf21633ec24ec33", size = 3512103, upload_time = "2024-10-20T00:29:58.499Z" }, + { url = "https://files.pythonhosted.org/packages/96/19/139227a6e67f407b9c386cb594d9628c6c78c9024f26df87c912fabd4368/asyncpg-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46973045b567972128a27d40001124fbc821c87a6cade040cfcd4fa8a30bcdc4", size = 3592471, upload_time = "2024-10-20T00:30:00.354Z" }, + { url = "https://files.pythonhosted.org/packages/67/e4/ab3ca38f628f53f0fd28d3ff20edff1c975dd1cb22482e0061916b4b9a74/asyncpg-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9110df111cabc2ed81aad2f35394a00cadf4f2e0635603db6ebbd0fc896f46a4", size = 3496253, upload_time = "2024-10-20T00:30:02.794Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5f/0bf65511d4eeac3a1f41c54034a492515a707c6edbc642174ae79034d3ba/asyncpg-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04ff0785ae7eed6cc138e73fc67b8e51d54ee7a3ce9b63666ce55a0bf095f7ba", size = 3662720, upload_time = "2024-10-20T00:30:04.501Z" }, + { url = "https://files.pythonhosted.org/packages/e7/31/1513d5a6412b98052c3ed9158d783b1e09d0910f51fbe0e05f56cc370bc4/asyncpg-0.30.0-cp313-cp313-win32.whl", hash = "sha256:ae374585f51c2b444510cdf3595b97ece4f233fde739aa14b50e0d64e8a7a590", size = 560404, upload_time = "2024-10-20T00:30:06.537Z" }, + { url = "https://files.pythonhosted.org/packages/c8/a4/cec76b3389c4c5ff66301cd100fe88c318563ec8a520e0b2e792b5b84972/asyncpg-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:f59b430b8e27557c3fb9869222559f7417ced18688375825f8f12302c34e915e", size = 621623, upload_time = "2024-10-20T00:30:09.024Z" }, +] + +[[package]] +name = "attrs" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload_time = "2025-03-13T11:10:22.779Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload_time = "2025-03-13T11:10:21.14Z" }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload_time = "2025-04-15T17:05:13.836Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload_time = "2025-04-15T17:05:12.221Z" }, +] + +[[package]] +name = "bs4" +version = "0.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/aa/4acaf814ff901145da37332e05bb510452ebed97bc9602695059dd46ef39/bs4-0.0.2.tar.gz", hash = "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925", size = 698, upload_time = "2024-01-17T18:15:47.371Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/bb/bf7aab772a159614954d84aa832c129624ba6c32faa559dfb200a534e50b/bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc", size = 1189, upload_time = "2024-01-17T18:15:48.613Z" }, +] + +[[package]] +name = "cachetools" +version = "5.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380, upload_time = "2025-02-20T21:01:19.524Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080, upload_time = "2025-02-20T21:01:16.647Z" }, +] + +[[package]] +name = "certifi" +version = "2025.4.26" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705, upload_time = "2025-04-26T02:12:29.51Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618, upload_time = "2025-04-26T02:12:27.662Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload_time = "2025-05-02T08:34:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload_time = "2025-05-02T08:32:11.945Z" }, + { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload_time = "2025-05-02T08:32:13.946Z" }, + { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload_time = "2025-05-02T08:32:15.873Z" }, + { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload_time = "2025-05-02T08:32:17.283Z" }, + { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload_time = "2025-05-02T08:32:18.807Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload_time = "2025-05-02T08:32:20.333Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload_time = "2025-05-02T08:32:21.86Z" }, + { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload_time = "2025-05-02T08:32:23.434Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload_time = "2025-05-02T08:32:24.993Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload_time = "2025-05-02T08:32:26.435Z" }, + { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload_time = "2025-05-02T08:32:28.376Z" }, + { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload_time = "2025-05-02T08:32:30.281Z" }, + { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload_time = "2025-05-02T08:32:32.191Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload_time = "2025-05-02T08:32:33.712Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload_time = "2025-05-02T08:32:35.768Z" }, + { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload_time = "2025-05-02T08:32:37.284Z" }, + { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload_time = "2025-05-02T08:32:38.803Z" }, + { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload_time = "2025-05-02T08:32:40.251Z" }, + { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload_time = "2025-05-02T08:32:41.705Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload_time = "2025-05-02T08:32:43.709Z" }, + { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload_time = "2025-05-02T08:32:46.197Z" }, + { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload_time = "2025-05-02T08:32:48.105Z" }, + { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload_time = "2025-05-02T08:32:49.719Z" }, + { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload_time = "2025-05-02T08:32:51.404Z" }, + { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload_time = "2025-05-02T08:32:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload_time = "2025-05-02T08:32:54.573Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload_time = "2025-05-02T08:32:56.363Z" }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload_time = "2025-05-02T08:32:58.551Z" }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload_time = "2025-05-02T08:33:00.342Z" }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload_time = "2025-05-02T08:33:02.081Z" }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload_time = "2025-05-02T08:33:04.063Z" }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload_time = "2025-05-02T08:33:06.418Z" }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload_time = "2025-05-02T08:33:08.183Z" }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload_time = "2025-05-02T08:33:09.986Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload_time = "2025-05-02T08:33:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload_time = "2025-05-02T08:33:13.707Z" }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload_time = "2025-05-02T08:33:15.458Z" }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload_time = "2025-05-02T08:33:17.06Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload_time = "2025-05-02T08:33:18.753Z" }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload_time = "2025-05-02T08:34:40.053Z" }, +] + +[[package]] +name = "ckanapi" +version = "4.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docopt" }, + { name = "python-slugify" }, + { name = "requests" }, + { name = "setuptools" }, + { name = "simplejson" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/31/c0131cfe3cdae242699c2889d20016fbe2444dcaf86070ee03863d1035ba/ckanapi-4.8.tar.gz", hash = "sha256:3a98d81e6cb7480883eb1d031740205d3e94176376e9d284d218829d81d0afed", size = 37633, upload_time = "2024-04-04T15:46:09.451Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/ac/626837e55aeb17f8e3982128a25fbf5f7880a397039eb7a1b5cebaca7fa4/ckanapi-4.8-py3-none-any.whl", hash = "sha256:a6ac36b55321368cf39d70f701542276fe098484517e339adf18595f30c076b8", size = 46316, upload_time = "2024-04-04T15:46:07.725Z" }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload_time = "2024-12-21T18:38:44.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload_time = "2024-12-21T18:38:41.666Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload_time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload_time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "data-source-identification" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "aiohttp" }, + { name = "alembic" }, + { name = "apscheduler" }, + { name = "asyncpg" }, + { name = "beautifulsoup4" }, + { name = "bs4" }, + { name = "ckanapi" }, + { name = "datasets" }, + { name = "docker" }, + { name = "fastapi", extra = ["standard"] }, + { name = "from-root" }, + { name = "google-api-python-client" }, + { name = "httpx" }, + { name = "huggingface-hub" }, + { name = "keras" }, + { name = "lxml" }, + { name = "marshmallow" }, + { name = "numpy" }, + { name = "openai" }, + { name = "pandas" }, + { name = "playwright" }, + { name = "psycopg", extra = ["binary"] }, + { name = "psycopg2-binary" }, + { name = "pydantic" }, + { name = "pyjwt" }, + { name = "python-dotenv" }, + { name = "requests" }, + { name = "sqlalchemy" }, + { name = "starlette" }, + { name = "tensorflow-cpu" }, + { name = "tensorflow-io-gcs-filesystem" }, + { name = "tqdm" }, + { name = "transformers" }, + { name = "urllib3" }, + { name = "uvicorn" }, +] + +[package.dev-dependencies] +dev = [ + { name = "docker" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "pytest-mock" }, + { name = "pytest-timeout" }, +] + +[package.metadata] +requires-dist = [ + { name = "aiohttp", specifier = "~=3.11.11" }, + { name = "alembic", specifier = "~=1.14.0" }, + { name = "apscheduler", specifier = "~=3.11.0" }, + { name = "asyncpg", specifier = "~=0.30.0" }, + { name = "beautifulsoup4", specifier = ">=4.12.3" }, + { name = "bs4", specifier = "~=0.0.2" }, + { name = "ckanapi", specifier = "~=4.8" }, + { name = "datasets", specifier = "~=2.19.1" }, + { name = "docker", specifier = "~=7.1.0" }, + { name = "fastapi", extras = ["standard"], specifier = "~=0.115.6" }, + { name = "from-root", specifier = "~=1.3.0" }, + { name = "google-api-python-client", specifier = ">=2.156.0" }, + { name = "httpx", specifier = "~=0.28.1" }, + { name = "huggingface-hub", specifier = "~=0.28.1" }, + { name = "keras", specifier = "~=2.15.0" }, + { name = "lxml", specifier = "~=5.1.0" }, + { name = "marshmallow", specifier = "~=3.23.2" }, + { name = "numpy", specifier = "~=1.26.4" }, + { name = "openai", specifier = "~=1.60.1" }, + { name = "pandas", specifier = "~=2.2.3" }, + { name = "playwright", specifier = "~=1.49.1" }, + { name = "psycopg", extras = ["binary"], specifier = "~=3.1.20" }, + { name = "psycopg2-binary", specifier = "~=2.9.6" }, + { name = "pydantic", specifier = "~=2.10.6" }, + { name = "pyjwt", specifier = "~=2.10.1" }, + { name = "python-dotenv", specifier = "~=1.0.1" }, + { name = "requests", specifier = "~=2.32.3" }, + { name = "sqlalchemy", specifier = "~=2.0.36" }, + { name = "starlette", specifier = "~=0.45.3" }, + { name = "tensorflow-cpu", specifier = "~=2.15.1" }, + { name = "tensorflow-io-gcs-filesystem", specifier = "==0.31.0" }, + { name = "tqdm", specifier = ">=4.64.1" }, + { name = "transformers", specifier = "~=4.40.2" }, + { name = "urllib3", specifier = "~=1.26.18" }, + { name = "uvicorn", specifier = "~=0.34.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "docker", specifier = ">=7.1.0" }, + { name = "pytest", specifier = ">=7.2.2" }, + { name = "pytest-asyncio", specifier = "~=0.25.2" }, + { name = "pytest-mock", specifier = "==3.12.0" }, + { name = "pytest-timeout", specifier = "~=2.3.1" }, +] + +[[package]] +name = "datasets" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "dill" }, + { name = "filelock" }, + { name = "fsspec", extra = ["http"] }, + { name = "huggingface-hub" }, + { name = "multiprocess" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "pyarrow-hotfix" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "xxhash" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/e7/6ee66732f74e4fb1c8915e58b3c253aded777ad0fa457f3f831dd0cd09b4/datasets-2.19.2.tar.gz", hash = "sha256:eccb82fb3bb5ee26ccc6d7a15b7f1f834e2cc4e59b7cff7733a003552bad51ef", size = 2215337, upload_time = "2024-06-03T05:11:44.756Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/59/46818ebeb708234a60e42ccf409d20709e482519d2aa450b501ddbba4594/datasets-2.19.2-py3-none-any.whl", hash = "sha256:e07ff15d75b1af75c87dd96323ba2a361128d495136652f37fd62f918d17bb4e", size = 542113, upload_time = "2024-06-03T05:11:41.151Z" }, +] + +[[package]] +name = "dill" +version = "0.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/17/4d/ac7ffa80c69ea1df30a8aa11b3578692a5118e7cd1aa157e3ef73b092d15/dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", size = 184847, upload_time = "2024-01-27T23:42:16.145Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252, upload_time = "2024-01-27T23:42:14.239Z" }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload_time = "2023-12-24T09:54:32.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload_time = "2023-12-24T09:54:30.421Z" }, +] + +[[package]] +name = "dnspython" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197, upload_time = "2024-10-05T20:14:59.362Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632, upload_time = "2024-10-05T20:14:57.687Z" }, +] + +[[package]] +name = "docker" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "requests" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834, upload_time = "2024-05-23T11:13:57.216Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774, upload_time = "2024-05-23T11:13:55.01Z" }, +] + +[[package]] +name = "docopt" +version = "0.6.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491", size = 25901, upload_time = "2014-06-16T11:18:57.406Z" } + +[[package]] +name = "email-validator" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967, upload_time = "2024-06-20T11:30:30.034Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521, upload_time = "2024-06-20T11:30:28.248Z" }, +] + +[[package]] +name = "fastapi" +version = "0.115.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236, upload_time = "2025-03-23T22:55:43.822Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164, upload_time = "2025-03-23T22:55:42.101Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "email-validator" }, + { name = "fastapi-cli", extra = ["standard"] }, + { name = "httpx" }, + { name = "jinja2" }, + { name = "python-multipart" }, + { name = "uvicorn", extra = ["standard"] }, +] + +[[package]] +name = "fastapi-cli" +version = "0.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "rich-toolkit" }, + { name = "typer" }, + { name = "uvicorn", extra = ["standard"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753, upload_time = "2024-12-15T14:28:10.028Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705, upload_time = "2024-12-15T14:28:06.18Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "uvicorn", extra = ["standard"] }, +] + +[[package]] +name = "filelock" +version = "3.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload_time = "2025-03-14T07:11:40.47Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload_time = "2025-03-14T07:11:39.145Z" }, +] + +[[package]] +name = "flatbuffers" +version = "25.2.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/30/eb5dce7994fc71a2f685d98ec33cc660c0a5887db5610137e60d8cbc4489/flatbuffers-25.2.10.tar.gz", hash = "sha256:97e451377a41262f8d9bd4295cc836133415cc03d8cb966410a4af92eb00d26e", size = 22170, upload_time = "2025-02-11T04:26:46.257Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/25/155f9f080d5e4bc0082edfda032ea2bc2b8fab3f4d25d46c1e9dd22a1a89/flatbuffers-25.2.10-py2.py3-none-any.whl", hash = "sha256:ebba5f4d5ea615af3f7fd70fc310636fbb2bbd1f566ac0a23d98dd412de50051", size = 30953, upload_time = "2025-02-11T04:26:44.484Z" }, +] + +[[package]] +name = "from-root" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/30/5259cfafc8372df008a5605ca19aba9d560285471ee043f39cbc5a7b7fa2/from_root-1.3.0.tar.gz", hash = "sha256:da1359f5faabca367f685cac927cb2f307bb35c488fdd0361f963d6f1cd2674f", size = 4858, upload_time = "2022-12-27T12:41:25.78Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/a8/451d0294d5d9ead3d26c25837df0588d1bcdd9235abf91e0ded629369921/from_root-1.3.0-py3-none-any.whl", hash = "sha256:7446a9b6481e668329cc11ad0a234fe4c83c63468c652e037d02846a75c726f8", size = 5489, upload_time = "2022-12-27T12:41:23.989Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/f4/d744cba2da59b5c1d88823cf9e8a6c74e4659e2b27604ed973be2a0bf5ab/frozenlist-1.6.0.tar.gz", hash = "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68", size = 42831, upload_time = "2025-04-17T22:38:53.099Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/b5/bc883b5296ec902115c00be161da93bf661199c465ec4c483feec6ea4c32/frozenlist-1.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae8337990e7a45683548ffb2fee1af2f1ed08169284cd829cdd9a7fa7470530d", size = 160912, upload_time = "2025-04-17T22:36:17.235Z" }, + { url = "https://files.pythonhosted.org/packages/6f/93/51b058b563d0704b39c56baa222828043aafcac17fd3734bec5dbeb619b1/frozenlist-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c952f69dd524558694818a461855f35d36cc7f5c0adddce37e962c85d06eac0", size = 124315, upload_time = "2025-04-17T22:36:18.735Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e0/46cd35219428d350558b874d595e132d1c17a9471a1bd0d01d518a261e7c/frozenlist-1.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f5fef13136c4e2dee91bfb9a44e236fff78fc2cd9f838eddfc470c3d7d90afe", size = 122230, upload_time = "2025-04-17T22:36:20.6Z" }, + { url = "https://files.pythonhosted.org/packages/d1/0f/7ad2ce928ad06d6dd26a61812b959ded573d3e9d0ee6109d96c2be7172e9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:716bbba09611b4663ecbb7cd022f640759af8259e12a6ca939c0a6acd49eedba", size = 314842, upload_time = "2025-04-17T22:36:22.088Z" }, + { url = "https://files.pythonhosted.org/packages/34/76/98cbbd8a20a5c3359a2004ae5e5b216af84a150ccbad67c8f8f30fb2ea91/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7b8c4dc422c1a3ffc550b465090e53b0bf4839047f3e436a34172ac67c45d595", size = 304919, upload_time = "2025-04-17T22:36:24.247Z" }, + { url = "https://files.pythonhosted.org/packages/9a/fa/258e771ce3a44348c05e6b01dffc2bc67603fba95761458c238cd09a2c77/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b11534872256e1666116f6587a1592ef395a98b54476addb5e8d352925cb5d4a", size = 324074, upload_time = "2025-04-17T22:36:26.291Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a4/047d861fd8c538210e12b208c0479912273f991356b6bdee7ea8356b07c9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c6eceb88aaf7221f75be6ab498dc622a151f5f88d536661af3ffc486245a626", size = 321292, upload_time = "2025-04-17T22:36:27.909Z" }, + { url = "https://files.pythonhosted.org/packages/c0/25/cfec8af758b4525676cabd36efcaf7102c1348a776c0d1ad046b8a7cdc65/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62c828a5b195570eb4b37369fcbbd58e96c905768d53a44d13044355647838ff", size = 301569, upload_time = "2025-04-17T22:36:29.448Z" }, + { url = "https://files.pythonhosted.org/packages/87/2f/0c819372fa9f0c07b153124bf58683b8d0ca7bb73ea5ccde9b9ef1745beb/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1c6bd2c6399920c9622362ce95a7d74e7f9af9bfec05fff91b8ce4b9647845a", size = 313625, upload_time = "2025-04-17T22:36:31.55Z" }, + { url = "https://files.pythonhosted.org/packages/50/5f/f0cf8b0fdedffdb76b3745aa13d5dbe404d63493cc211ce8250f2025307f/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49ba23817781e22fcbd45fd9ff2b9b8cdb7b16a42a4851ab8025cae7b22e96d0", size = 312523, upload_time = "2025-04-17T22:36:33.078Z" }, + { url = "https://files.pythonhosted.org/packages/e1/6c/38c49108491272d3e84125bbabf2c2d0b304899b52f49f0539deb26ad18d/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:431ef6937ae0f853143e2ca67d6da76c083e8b1fe3df0e96f3802fd37626e606", size = 322657, upload_time = "2025-04-17T22:36:34.688Z" }, + { url = "https://files.pythonhosted.org/packages/bd/4b/3bd3bad5be06a9d1b04b1c22be80b5fe65b502992d62fab4bdb25d9366ee/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9d124b38b3c299ca68433597ee26b7819209cb8a3a9ea761dfe9db3a04bba584", size = 303414, upload_time = "2025-04-17T22:36:36.363Z" }, + { url = "https://files.pythonhosted.org/packages/5b/89/7e225a30bef6e85dbfe22622c24afe932e9444de3b40d58b1ea589a14ef8/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:118e97556306402e2b010da1ef21ea70cb6d6122e580da64c056b96f524fbd6a", size = 320321, upload_time = "2025-04-17T22:36:38.16Z" }, + { url = "https://files.pythonhosted.org/packages/22/72/7e3acef4dd9e86366cb8f4d8f28e852c2b7e116927e9722b31a6f71ea4b0/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb3b309f1d4086b5533cf7bbcf3f956f0ae6469664522f1bde4feed26fba60f1", size = 323975, upload_time = "2025-04-17T22:36:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/d8/85/e5da03d20507e13c66ce612c9792b76811b7a43e3320cce42d95b85ac755/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54dece0d21dce4fdb188a1ffc555926adf1d1c516e493c2914d7c370e454bc9e", size = 316553, upload_time = "2025-04-17T22:36:42.045Z" }, + { url = "https://files.pythonhosted.org/packages/ac/8e/6c609cbd0580ae8a0661c408149f196aade7d325b1ae7adc930501b81acb/frozenlist-1.6.0-cp311-cp311-win32.whl", hash = "sha256:654e4ba1d0b2154ca2f096bed27461cf6160bc7f504a7f9a9ef447c293caf860", size = 115511, upload_time = "2025-04-17T22:36:44.067Z" }, + { url = "https://files.pythonhosted.org/packages/f2/13/a84804cfde6de12d44ed48ecbf777ba62b12ff09e761f76cdd1ff9e14bb1/frozenlist-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e911391bffdb806001002c1f860787542f45916c3baf764264a52765d5a5603", size = 120863, upload_time = "2025-04-17T22:36:45.465Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8a/289b7d0de2fbac832ea80944d809759976f661557a38bb8e77db5d9f79b7/frozenlist-1.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1", size = 160193, upload_time = "2025-04-17T22:36:47.382Z" }, + { url = "https://files.pythonhosted.org/packages/19/80/2fd17d322aec7f430549f0669f599997174f93ee17929ea5b92781ec902c/frozenlist-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29", size = 123831, upload_time = "2025-04-17T22:36:49.401Z" }, + { url = "https://files.pythonhosted.org/packages/99/06/f5812da431273f78c6543e0b2f7de67dfd65eb0a433978b2c9c63d2205e4/frozenlist-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25", size = 121862, upload_time = "2025-04-17T22:36:51.899Z" }, + { url = "https://files.pythonhosted.org/packages/d0/31/9e61c6b5fc493cf24d54881731204d27105234d09878be1a5983182cc4a5/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576", size = 316361, upload_time = "2025-04-17T22:36:53.402Z" }, + { url = "https://files.pythonhosted.org/packages/9d/55/22ca9362d4f0222324981470fd50192be200154d51509ee6eb9baa148e96/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8", size = 307115, upload_time = "2025-04-17T22:36:55.016Z" }, + { url = "https://files.pythonhosted.org/packages/ae/39/4fff42920a57794881e7bb3898dc7f5f539261711ea411b43bba3cde8b79/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9", size = 322505, upload_time = "2025-04-17T22:36:57.12Z" }, + { url = "https://files.pythonhosted.org/packages/55/f2/88c41f374c1e4cf0092a5459e5f3d6a1e17ed274c98087a76487783df90c/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e", size = 322666, upload_time = "2025-04-17T22:36:58.735Z" }, + { url = "https://files.pythonhosted.org/packages/75/51/034eeb75afdf3fd03997856195b500722c0b1a50716664cde64e28299c4b/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590", size = 302119, upload_time = "2025-04-17T22:37:00.512Z" }, + { url = "https://files.pythonhosted.org/packages/2b/a6/564ecde55ee633270a793999ef4fd1d2c2b32b5a7eec903b1012cb7c5143/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103", size = 316226, upload_time = "2025-04-17T22:37:02.102Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/6c0682c32377f402b8a6174fb16378b683cf6379ab4d2827c580892ab3c7/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c", size = 312788, upload_time = "2025-04-17T22:37:03.578Z" }, + { url = "https://files.pythonhosted.org/packages/b6/b8/10fbec38f82c5d163ca1750bfff4ede69713badf236a016781cf1f10a0f0/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821", size = 325914, upload_time = "2025-04-17T22:37:05.213Z" }, + { url = "https://files.pythonhosted.org/packages/62/ca/2bf4f3a1bd40cdedd301e6ecfdbb291080d5afc5f9ce350c0739f773d6b9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70", size = 305283, upload_time = "2025-04-17T22:37:06.985Z" }, + { url = "https://files.pythonhosted.org/packages/09/64/20cc13ccf94abc2a1f482f74ad210703dc78a590d0b805af1c9aa67f76f9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f", size = 319264, upload_time = "2025-04-17T22:37:08.618Z" }, + { url = "https://files.pythonhosted.org/packages/20/ff/86c6a2bbe98cfc231519f5e6d712a0898488ceac804a917ce014f32e68f6/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046", size = 326482, upload_time = "2025-04-17T22:37:10.196Z" }, + { url = "https://files.pythonhosted.org/packages/2f/da/8e381f66367d79adca245d1d71527aac774e30e291d41ef161ce2d80c38e/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770", size = 318248, upload_time = "2025-04-17T22:37:12.284Z" }, + { url = "https://files.pythonhosted.org/packages/39/24/1a1976563fb476ab6f0fa9fefaac7616a4361dbe0461324f9fd7bf425dbe/frozenlist-1.6.0-cp312-cp312-win32.whl", hash = "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc", size = 115161, upload_time = "2025-04-17T22:37:13.902Z" }, + { url = "https://files.pythonhosted.org/packages/80/2e/fb4ed62a65f8cd66044706b1013f0010930d8cbb0729a2219561ea075434/frozenlist-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878", size = 120548, upload_time = "2025-04-17T22:37:15.326Z" }, + { url = "https://files.pythonhosted.org/packages/6f/e5/04c7090c514d96ca00887932417f04343ab94904a56ab7f57861bf63652d/frozenlist-1.6.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e", size = 158182, upload_time = "2025-04-17T22:37:16.837Z" }, + { url = "https://files.pythonhosted.org/packages/e9/8f/60d0555c61eec855783a6356268314d204137f5e0c53b59ae2fc28938c99/frozenlist-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117", size = 122838, upload_time = "2025-04-17T22:37:18.352Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a7/d0ec890e3665b4b3b7c05dc80e477ed8dc2e2e77719368e78e2cd9fec9c8/frozenlist-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4", size = 120980, upload_time = "2025-04-17T22:37:19.857Z" }, + { url = "https://files.pythonhosted.org/packages/cc/19/9b355a5e7a8eba903a008579964192c3e427444752f20b2144b10bb336df/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3", size = 305463, upload_time = "2025-04-17T22:37:21.328Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8d/5b4c758c2550131d66935ef2fa700ada2461c08866aef4229ae1554b93ca/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1", size = 297985, upload_time = "2025-04-17T22:37:23.55Z" }, + { url = "https://files.pythonhosted.org/packages/48/2c/537ec09e032b5865715726b2d1d9813e6589b571d34d01550c7aeaad7e53/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c", size = 311188, upload_time = "2025-04-17T22:37:25.221Z" }, + { url = "https://files.pythonhosted.org/packages/31/2f/1aa74b33f74d54817055de9a4961eff798f066cdc6f67591905d4fc82a84/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45", size = 311874, upload_time = "2025-04-17T22:37:26.791Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f0/cfec18838f13ebf4b37cfebc8649db5ea71a1b25dacd691444a10729776c/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f", size = 291897, upload_time = "2025-04-17T22:37:28.958Z" }, + { url = "https://files.pythonhosted.org/packages/ea/a5/deb39325cbbea6cd0a46db8ccd76150ae2fcbe60d63243d9df4a0b8c3205/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85", size = 305799, upload_time = "2025-04-17T22:37:30.889Z" }, + { url = "https://files.pythonhosted.org/packages/78/22/6ddec55c5243a59f605e4280f10cee8c95a449f81e40117163383829c241/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8", size = 302804, upload_time = "2025-04-17T22:37:32.489Z" }, + { url = "https://files.pythonhosted.org/packages/5d/b7/d9ca9bab87f28855063c4d202936800219e39db9e46f9fb004d521152623/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f", size = 316404, upload_time = "2025-04-17T22:37:34.59Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3a/1255305db7874d0b9eddb4fe4a27469e1fb63720f1fc6d325a5118492d18/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f", size = 295572, upload_time = "2025-04-17T22:37:36.337Z" }, + { url = "https://files.pythonhosted.org/packages/2a/f2/8d38eeee39a0e3a91b75867cc102159ecccf441deb6ddf67be96d3410b84/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6", size = 307601, upload_time = "2025-04-17T22:37:37.923Z" }, + { url = "https://files.pythonhosted.org/packages/38/04/80ec8e6b92f61ef085422d7b196822820404f940950dde5b2e367bede8bc/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188", size = 314232, upload_time = "2025-04-17T22:37:39.669Z" }, + { url = "https://files.pythonhosted.org/packages/3a/58/93b41fb23e75f38f453ae92a2f987274c64637c450285577bd81c599b715/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e", size = 308187, upload_time = "2025-04-17T22:37:41.662Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a2/e64df5c5aa36ab3dee5a40d254f3e471bb0603c225f81664267281c46a2d/frozenlist-1.6.0-cp313-cp313-win32.whl", hash = "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4", size = 114772, upload_time = "2025-04-17T22:37:43.132Z" }, + { url = "https://files.pythonhosted.org/packages/a0/77/fead27441e749b2d574bb73d693530d59d520d4b9e9679b8e3cb779d37f2/frozenlist-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd", size = 119847, upload_time = "2025-04-17T22:37:45.118Z" }, + { url = "https://files.pythonhosted.org/packages/df/bd/cc6d934991c1e5d9cafda83dfdc52f987c7b28343686aef2e58a9cf89f20/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64", size = 174937, upload_time = "2025-04-17T22:37:46.635Z" }, + { url = "https://files.pythonhosted.org/packages/f2/a2/daf945f335abdbfdd5993e9dc348ef4507436936ab3c26d7cfe72f4843bf/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91", size = 136029, upload_time = "2025-04-17T22:37:48.192Z" }, + { url = "https://files.pythonhosted.org/packages/51/65/4c3145f237a31247c3429e1c94c384d053f69b52110a0d04bfc8afc55fb2/frozenlist-1.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd", size = 134831, upload_time = "2025-04-17T22:37:50.485Z" }, + { url = "https://files.pythonhosted.org/packages/77/38/03d316507d8dea84dfb99bdd515ea245628af964b2bf57759e3c9205cc5e/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2", size = 392981, upload_time = "2025-04-17T22:37:52.558Z" }, + { url = "https://files.pythonhosted.org/packages/37/02/46285ef9828f318ba400a51d5bb616ded38db8466836a9cfa39f3903260b/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506", size = 371999, upload_time = "2025-04-17T22:37:54.092Z" }, + { url = "https://files.pythonhosted.org/packages/0d/64/1212fea37a112c3c5c05bfb5f0a81af4836ce349e69be75af93f99644da9/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0", size = 392200, upload_time = "2025-04-17T22:37:55.951Z" }, + { url = "https://files.pythonhosted.org/packages/81/ce/9a6ea1763e3366e44a5208f76bf37c76c5da570772375e4d0be85180e588/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0", size = 390134, upload_time = "2025-04-17T22:37:57.633Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/939738b0b495b2c6d0c39ba51563e453232813042a8d908b8f9544296c29/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e", size = 365208, upload_time = "2025-04-17T22:37:59.742Z" }, + { url = "https://files.pythonhosted.org/packages/b4/8b/939e62e93c63409949c25220d1ba8e88e3960f8ef6a8d9ede8f94b459d27/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c", size = 385548, upload_time = "2025-04-17T22:38:01.416Z" }, + { url = "https://files.pythonhosted.org/packages/62/38/22d2873c90102e06a7c5a3a5b82ca47e393c6079413e8a75c72bff067fa8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b", size = 391123, upload_time = "2025-04-17T22:38:03.049Z" }, + { url = "https://files.pythonhosted.org/packages/44/78/63aaaf533ee0701549500f6d819be092c6065cb5c577edb70c09df74d5d0/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad", size = 394199, upload_time = "2025-04-17T22:38:04.776Z" }, + { url = "https://files.pythonhosted.org/packages/54/45/71a6b48981d429e8fbcc08454dc99c4c2639865a646d549812883e9c9dd3/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215", size = 373854, upload_time = "2025-04-17T22:38:06.576Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f3/dbf2a5e11736ea81a66e37288bf9f881143a7822b288a992579ba1b4204d/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2", size = 395412, upload_time = "2025-04-17T22:38:08.197Z" }, + { url = "https://files.pythonhosted.org/packages/b3/f1/c63166806b331f05104d8ea385c4acd511598568b1f3e4e8297ca54f2676/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911", size = 394936, upload_time = "2025-04-17T22:38:10.056Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ea/4f3e69e179a430473eaa1a75ff986526571215fefc6b9281cdc1f09a4eb8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497", size = 391459, upload_time = "2025-04-17T22:38:11.826Z" }, + { url = "https://files.pythonhosted.org/packages/d3/c3/0fc2c97dea550df9afd072a37c1e95421652e3206bbeaa02378b24c2b480/frozenlist-1.6.0-cp313-cp313t-win32.whl", hash = "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f", size = 128797, upload_time = "2025-04-17T22:38:14.013Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f5/79c9320c5656b1965634fe4be9c82b12a3305bdbc58ad9cb941131107b20/frozenlist-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348", size = 134709, upload_time = "2025-04-17T22:38:15.551Z" }, + { url = "https://files.pythonhosted.org/packages/71/3e/b04a0adda73bd52b390d730071c0d577073d3d26740ee1bad25c3ad0f37b/frozenlist-1.6.0-py3-none-any.whl", hash = "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191", size = 12404, upload_time = "2025-04-17T22:38:51.668Z" }, +] + +[[package]] +name = "fsspec" +version = "2024.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/b8/e3ba21f03c00c27adc9a8cd1cab8adfb37b6024757133924a9a4eab63a83/fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9", size = 170742, upload_time = "2024-03-18T19:35:13.995Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/6d/66d48b03460768f523da62a57a7e14e5e95fdf339d79e996ce3cecda2cdb/fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512", size = 171991, upload_time = "2024-03-18T19:35:11.259Z" }, +] + +[package.optional-dependencies] +http = [ + { name = "aiohttp" }, +] + +[[package]] +name = "gast" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/14/c566f5ca00c115db7725263408ff952b8ae6d6a4e792ef9c84e77d9af7a1/gast-0.6.0.tar.gz", hash = "sha256:88fc5300d32c7ac6ca7b515310862f71e6fdf2c029bbec7c66c0f5dd47b6b1fb", size = 27708, upload_time = "2024-06-27T20:31:49.527Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/61/8001b38461d751cd1a0c3a6ae84346796a5758123f3ed97a1b121dfbf4f3/gast-0.6.0-py3-none-any.whl", hash = "sha256:52b182313f7330389f72b069ba00f174cfe2a06411099547288839c6cbafbd54", size = 21173, upload_time = "2024-07-09T13:15:15.615Z" }, +] + +[[package]] +name = "google-api-core" +version = "2.24.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-auth" }, + { name = "googleapis-common-protos" }, + { name = "proto-plus" }, + { name = "protobuf" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/5c/085bcb872556934bb119e5e09de54daa07873f6866b8f0303c49e72287f7/google_api_core-2.24.2.tar.gz", hash = "sha256:81718493daf06d96d6bc76a91c23874dbf2fac0adbbf542831b805ee6e974696", size = 163516, upload_time = "2025-03-10T15:55:26.201Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/95/f472d85adab6e538da2025dfca9e976a0d125cc0af2301f190e77b76e51c/google_api_core-2.24.2-py3-none-any.whl", hash = "sha256:810a63ac95f3c441b7c0e43d344e372887f62ce9071ba972eacf32672e072de9", size = 160061, upload_time = "2025-03-10T15:55:24.386Z" }, +] + +[[package]] +name = "google-api-python-client" +version = "2.169.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core" }, + { name = "google-auth" }, + { name = "google-auth-httplib2" }, + { name = "httplib2" }, + { name = "uritemplate" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4f/e6/787c24738fc7c99de9289abe60bd64591800ae1cdf60db7b87e0e6ef9cdd/google_api_python_client-2.169.0.tar.gz", hash = "sha256:0585bb97bd5f5bf3ed8d4bf624593e4c5a14d06c811d1952b07a1f94b4d12c51", size = 12811341, upload_time = "2025-04-29T15:46:05.603Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/bd/6aa93c38756cc9fc63262e0dc3d3f1ff7241ce6f413a25ad6e4a9c98b473/google_api_python_client-2.169.0-py3-none-any.whl", hash = "sha256:dae3e882dc0e6f28e60cf09c1f13fedfd881db84f824dd418aa9e44def2fe00d", size = 13323742, upload_time = "2025-04-29T15:46:02.521Z" }, +] + +[[package]] +name = "google-auth" +version = "2.40.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cachetools" }, + { name = "pyasn1-modules" }, + { name = "rsa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/a5/38c21d0e731bb716cffcf987bd9a3555cb95877ab4b616cfb96939933f20/google_auth-2.40.1.tar.gz", hash = "sha256:58f0e8416a9814c1d86c9b7f6acf6816b51aba167b2c76821965271bac275540", size = 280975, upload_time = "2025-05-07T01:04:55.3Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/b1/1272c6e80847ba5349f5ccb7574596393d1e222543f5003cb810865c3575/google_auth-2.40.1-py2.py3-none-any.whl", hash = "sha256:ed4cae4f5c46b41bae1d19c036e06f6c371926e97b19e816fc854eff811974ee", size = 216101, upload_time = "2025-05-07T01:04:53.612Z" }, +] + +[[package]] +name = "google-auth-httplib2" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-auth" }, + { name = "httplib2" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/be/217a598a818567b28e859ff087f347475c807a5649296fb5a817c58dacef/google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05", size = 10842, upload_time = "2023-12-12T17:40:30.722Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/8a/fe34d2f3f9470a27b01c9e76226965863f153d5fbe276f83608562e49c04/google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d", size = 9253, upload_time = "2023-12-12T17:40:13.055Z" }, +] + +[[package]] +name = "google-auth-oauthlib" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-auth" }, + { name = "requests-oauthlib" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/87/e10bf24f7bcffc1421b84d6f9c3377c30ec305d082cd737ddaa6d8f77f7c/google_auth_oauthlib-1.2.2.tar.gz", hash = "sha256:11046fb8d3348b296302dd939ace8af0a724042e8029c1b872d87fabc9f41684", size = 20955, upload_time = "2025-04-22T16:40:29.172Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/84/40ee070be95771acd2f4418981edb834979424565c3eec3cd88b6aa09d24/google_auth_oauthlib-1.2.2-py3-none-any.whl", hash = "sha256:fd619506f4b3908b5df17b65f39ca8d66ea56986e5472eb5978fd8f3786f00a2", size = 19072, upload_time = "2025-04-22T16:40:28.174Z" }, +] + +[[package]] +name = "google-pasta" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/4a/0bd53b36ff0323d10d5f24ebd67af2de10a1117f5cf4d7add90df92756f1/google-pasta-0.2.0.tar.gz", hash = "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e", size = 40430, upload_time = "2020-03-13T18:57:50.34Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl", hash = "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed", size = 57471, upload_time = "2020-03-13T18:57:48.872Z" }, +] + +[[package]] +name = "googleapis-common-protos" +version = "1.70.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/24/33db22342cf4a2ea27c9955e6713140fedd51e8b141b5ce5260897020f1a/googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257", size = 145903, upload_time = "2025-04-14T10:17:02.924Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/f1/62a193f0227cf15a920390abe675f386dec35f7ae3ffe6da582d3ade42c7/googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8", size = 294530, upload_time = "2025-04-14T10:17:01.271Z" }, +] + +[[package]] +name = "greenlet" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/ff/df5fede753cc10f6a5be0931204ea30c35fa2f2ea7a35b25bdaf4fe40e46/greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", size = 186022, upload_time = "2024-09-20T18:21:04.506Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/62/1c2665558618553c42922ed47a4e6d6527e2fa3516a8256c2f431c5d0441/greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70", size = 272479, upload_time = "2024-09-20T17:07:22.332Z" }, + { url = "https://files.pythonhosted.org/packages/76/9d/421e2d5f07285b6e4e3a676b016ca781f63cfe4a0cd8eaecf3fd6f7a71ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159", size = 640404, upload_time = "2024-09-20T17:36:45.588Z" }, + { url = "https://files.pythonhosted.org/packages/e5/de/6e05f5c59262a584e502dd3d261bbdd2c97ab5416cc9c0b91ea38932a901/greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e", size = 652813, upload_time = "2024-09-20T17:39:19.052Z" }, + { url = "https://files.pythonhosted.org/packages/49/93/d5f93c84241acdea15a8fd329362c2c71c79e1a507c3f142a5d67ea435ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1", size = 648517, upload_time = "2024-09-20T17:44:24.101Z" }, + { url = "https://files.pythonhosted.org/packages/15/85/72f77fc02d00470c86a5c982b8daafdf65d38aefbbe441cebff3bf7037fc/greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383", size = 647831, upload_time = "2024-09-20T17:08:40.577Z" }, + { url = "https://files.pythonhosted.org/packages/f7/4b/1c9695aa24f808e156c8f4813f685d975ca73c000c2a5056c514c64980f6/greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a", size = 602413, upload_time = "2024-09-20T17:08:31.728Z" }, + { url = "https://files.pythonhosted.org/packages/76/70/ad6e5b31ef330f03b12559d19fda2606a522d3849cde46b24f223d6d1619/greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511", size = 1129619, upload_time = "2024-09-20T17:44:14.222Z" }, + { url = "https://files.pythonhosted.org/packages/f4/fb/201e1b932e584066e0f0658b538e73c459b34d44b4bd4034f682423bc801/greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395", size = 1155198, upload_time = "2024-09-20T17:09:23.903Z" }, + { url = "https://files.pythonhosted.org/packages/12/da/b9ed5e310bb8b89661b80cbcd4db5a067903bbcd7fc854923f5ebb4144f0/greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39", size = 298930, upload_time = "2024-09-20T17:25:18.656Z" }, + { url = "https://files.pythonhosted.org/packages/7d/ec/bad1ac26764d26aa1353216fcbfa4670050f66d445448aafa227f8b16e80/greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", size = 274260, upload_time = "2024-09-20T17:08:07.301Z" }, + { url = "https://files.pythonhosted.org/packages/66/d4/c8c04958870f482459ab5956c2942c4ec35cac7fe245527f1039837c17a9/greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", size = 649064, upload_time = "2024-09-20T17:36:47.628Z" }, + { url = "https://files.pythonhosted.org/packages/51/41/467b12a8c7c1303d20abcca145db2be4e6cd50a951fa30af48b6ec607581/greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", size = 663420, upload_time = "2024-09-20T17:39:21.258Z" }, + { url = "https://files.pythonhosted.org/packages/27/8f/2a93cd9b1e7107d5c7b3b7816eeadcac2ebcaf6d6513df9abaf0334777f6/greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", size = 658035, upload_time = "2024-09-20T17:44:26.501Z" }, + { url = "https://files.pythonhosted.org/packages/57/5c/7c6f50cb12be092e1dccb2599be5a942c3416dbcfb76efcf54b3f8be4d8d/greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", size = 660105, upload_time = "2024-09-20T17:08:42.048Z" }, + { url = "https://files.pythonhosted.org/packages/f1/66/033e58a50fd9ec9df00a8671c74f1f3a320564c6415a4ed82a1c651654ba/greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", size = 613077, upload_time = "2024-09-20T17:08:33.707Z" }, + { url = "https://files.pythonhosted.org/packages/19/c5/36384a06f748044d06bdd8776e231fadf92fc896bd12cb1c9f5a1bda9578/greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", size = 1135975, upload_time = "2024-09-20T17:44:15.989Z" }, + { url = "https://files.pythonhosted.org/packages/38/f9/c0a0eb61bdf808d23266ecf1d63309f0e1471f284300ce6dac0ae1231881/greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", size = 1163955, upload_time = "2024-09-20T17:09:25.539Z" }, + { url = "https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", size = 299655, upload_time = "2024-09-20T17:21:22.427Z" }, + { url = "https://files.pythonhosted.org/packages/f3/57/0db4940cd7bb461365ca8d6fd53e68254c9dbbcc2b452e69d0d41f10a85e/greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", size = 272990, upload_time = "2024-09-20T17:08:26.312Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ec/423d113c9f74e5e402e175b157203e9102feeb7088cee844d735b28ef963/greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", size = 649175, upload_time = "2024-09-20T17:36:48.983Z" }, + { url = "https://files.pythonhosted.org/packages/a9/46/ddbd2db9ff209186b7b7c621d1432e2f21714adc988703dbdd0e65155c77/greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", size = 663425, upload_time = "2024-09-20T17:39:22.705Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f9/9c82d6b2b04aa37e38e74f0c429aece5eeb02bab6e3b98e7db89b23d94c6/greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", size = 657736, upload_time = "2024-09-20T17:44:28.544Z" }, + { url = "https://files.pythonhosted.org/packages/d9/42/b87bc2a81e3a62c3de2b0d550bf91a86939442b7ff85abb94eec3fc0e6aa/greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", size = 660347, upload_time = "2024-09-20T17:08:45.56Z" }, + { url = "https://files.pythonhosted.org/packages/37/fa/71599c3fd06336cdc3eac52e6871cfebab4d9d70674a9a9e7a482c318e99/greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", size = 615583, upload_time = "2024-09-20T17:08:36.85Z" }, + { url = "https://files.pythonhosted.org/packages/4e/96/e9ef85de031703ee7a4483489b40cf307f93c1824a02e903106f2ea315fe/greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", size = 1133039, upload_time = "2024-09-20T17:44:18.287Z" }, + { url = "https://files.pythonhosted.org/packages/87/76/b2b6362accd69f2d1889db61a18c94bc743e961e3cab344c2effaa4b4a25/greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", size = 1160716, upload_time = "2024-09-20T17:09:27.112Z" }, + { url = "https://files.pythonhosted.org/packages/1f/1b/54336d876186920e185066d8c3024ad55f21d7cc3683c856127ddb7b13ce/greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", size = 299490, upload_time = "2024-09-20T17:17:09.501Z" }, + { url = "https://files.pythonhosted.org/packages/5f/17/bea55bf36990e1638a2af5ba10c1640273ef20f627962cf97107f1e5d637/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", size = 643731, upload_time = "2024-09-20T17:36:50.376Z" }, + { url = "https://files.pythonhosted.org/packages/78/d2/aa3d2157f9ab742a08e0fd8f77d4699f37c22adfbfeb0c610a186b5f75e0/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", size = 649304, upload_time = "2024-09-20T17:39:24.55Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8e/d0aeffe69e53ccff5a28fa86f07ad1d2d2d6537a9506229431a2a02e2f15/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", size = 646537, upload_time = "2024-09-20T17:44:31.102Z" }, + { url = "https://files.pythonhosted.org/packages/05/79/e15408220bbb989469c8871062c97c6c9136770657ba779711b90870d867/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", size = 642506, upload_time = "2024-09-20T17:08:47.852Z" }, + { url = "https://files.pythonhosted.org/packages/18/87/470e01a940307796f1d25f8167b551a968540fbe0551c0ebb853cb527dd6/greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", size = 602753, upload_time = "2024-09-20T17:08:38.079Z" }, + { url = "https://files.pythonhosted.org/packages/e2/72/576815ba674eddc3c25028238f74d7b8068902b3968cbe456771b166455e/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", size = 1122731, upload_time = "2024-09-20T17:44:20.556Z" }, + { url = "https://files.pythonhosted.org/packages/ac/38/08cc303ddddc4b3d7c628c3039a61a3aae36c241ed01393d00c2fd663473/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", size = 1142112, upload_time = "2024-09-20T17:09:28.753Z" }, +] + +[[package]] +name = "grpcio" +version = "1.71.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/95/aa11fc09a85d91fbc7dd405dcb2a1e0256989d67bf89fa65ae24b3ba105a/grpcio-1.71.0.tar.gz", hash = "sha256:2b85f7820475ad3edec209d3d89a7909ada16caab05d3f2e08a7e8ae3200a55c", size = 12549828, upload_time = "2025-03-10T19:28:49.203Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/04/a085f3ad4133426f6da8c1becf0749872a49feb625a407a2e864ded3fb12/grpcio-1.71.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:d6aa986318c36508dc1d5001a3ff169a15b99b9f96ef5e98e13522c506b37eef", size = 5210453, upload_time = "2025-03-10T19:24:33.342Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d5/0bc53ed33ba458de95020970e2c22aa8027b26cc84f98bea7fcad5d695d1/grpcio-1.71.0-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:d2c170247315f2d7e5798a22358e982ad6eeb68fa20cf7a820bb74c11f0736e7", size = 11347567, upload_time = "2025-03-10T19:24:35.215Z" }, + { url = "https://files.pythonhosted.org/packages/e3/6d/ce334f7e7a58572335ccd61154d808fe681a4c5e951f8a1ff68f5a6e47ce/grpcio-1.71.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:e6f83a583ed0a5b08c5bc7a3fe860bb3c2eac1f03f1f63e0bc2091325605d2b7", size = 5696067, upload_time = "2025-03-10T19:24:37.988Z" }, + { url = "https://files.pythonhosted.org/packages/05/4a/80befd0b8b1dc2b9ac5337e57473354d81be938f87132e147c4a24a581bd/grpcio-1.71.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4be74ddeeb92cc87190e0e376dbc8fc7736dbb6d3d454f2fa1f5be1dee26b9d7", size = 6348377, upload_time = "2025-03-10T19:24:40.361Z" }, + { url = "https://files.pythonhosted.org/packages/c7/67/cbd63c485051eb78663355d9efd1b896cfb50d4a220581ec2cb9a15cd750/grpcio-1.71.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd0dfbe4d5eb1fcfec9490ca13f82b089a309dc3678e2edabc144051270a66e", size = 5940407, upload_time = "2025-03-10T19:24:42.685Z" }, + { url = "https://files.pythonhosted.org/packages/98/4b/7a11aa4326d7faa499f764eaf8a9b5a0eb054ce0988ee7ca34897c2b02ae/grpcio-1.71.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a2242d6950dc892afdf9e951ed7ff89473aaf744b7d5727ad56bdaace363722b", size = 6030915, upload_time = "2025-03-10T19:24:44.463Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a2/cdae2d0e458b475213a011078b0090f7a1d87f9a68c678b76f6af7c6ac8c/grpcio-1.71.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0fa05ee31a20456b13ae49ad2e5d585265f71dd19fbd9ef983c28f926d45d0a7", size = 6648324, upload_time = "2025-03-10T19:24:46.287Z" }, + { url = "https://files.pythonhosted.org/packages/27/df/f345c8daaa8d8574ce9869f9b36ca220c8845923eb3087e8f317eabfc2a8/grpcio-1.71.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3d081e859fb1ebe176de33fc3adb26c7d46b8812f906042705346b314bde32c3", size = 6197839, upload_time = "2025-03-10T19:24:48.565Z" }, + { url = "https://files.pythonhosted.org/packages/f2/2c/cd488dc52a1d0ae1bad88b0d203bc302efbb88b82691039a6d85241c5781/grpcio-1.71.0-cp311-cp311-win32.whl", hash = "sha256:d6de81c9c00c8a23047136b11794b3584cdc1460ed7cbc10eada50614baa1444", size = 3619978, upload_time = "2025-03-10T19:24:50.518Z" }, + { url = "https://files.pythonhosted.org/packages/ee/3f/cf92e7e62ccb8dbdf977499547dfc27133124d6467d3a7d23775bcecb0f9/grpcio-1.71.0-cp311-cp311-win_amd64.whl", hash = "sha256:24e867651fc67717b6f896d5f0cac0ec863a8b5fb7d6441c2ab428f52c651c6b", size = 4282279, upload_time = "2025-03-10T19:24:52.313Z" }, + { url = "https://files.pythonhosted.org/packages/4c/83/bd4b6a9ba07825bd19c711d8b25874cd5de72c2a3fbf635c3c344ae65bd2/grpcio-1.71.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:0ff35c8d807c1c7531d3002be03221ff9ae15712b53ab46e2a0b4bb271f38537", size = 5184101, upload_time = "2025-03-10T19:24:54.11Z" }, + { url = "https://files.pythonhosted.org/packages/31/ea/2e0d90c0853568bf714693447f5c73272ea95ee8dad107807fde740e595d/grpcio-1.71.0-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:b78a99cd1ece4be92ab7c07765a0b038194ded2e0a26fd654591ee136088d8d7", size = 11310927, upload_time = "2025-03-10T19:24:56.1Z" }, + { url = "https://files.pythonhosted.org/packages/ac/bc/07a3fd8af80467390af491d7dc66882db43884128cdb3cc8524915e0023c/grpcio-1.71.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:dc1a1231ed23caac1de9f943d031f1bc38d0f69d2a3b243ea0d664fc1fbd7fec", size = 5654280, upload_time = "2025-03-10T19:24:58.55Z" }, + { url = "https://files.pythonhosted.org/packages/16/af/21f22ea3eed3d0538b6ef7889fce1878a8ba4164497f9e07385733391e2b/grpcio-1.71.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6beeea5566092c5e3c4896c6d1d307fb46b1d4bdf3e70c8340b190a69198594", size = 6312051, upload_time = "2025-03-10T19:25:00.682Z" }, + { url = "https://files.pythonhosted.org/packages/49/9d/e12ddc726dc8bd1aa6cba67c85ce42a12ba5b9dd75d5042214a59ccf28ce/grpcio-1.71.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5170929109450a2c031cfe87d6716f2fae39695ad5335d9106ae88cc32dc84c", size = 5910666, upload_time = "2025-03-10T19:25:03.01Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e9/38713d6d67aedef738b815763c25f092e0454dc58e77b1d2a51c9d5b3325/grpcio-1.71.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5b08d03ace7aca7b2fadd4baf291139b4a5f058805a8327bfe9aece7253b6d67", size = 6012019, upload_time = "2025-03-10T19:25:05.174Z" }, + { url = "https://files.pythonhosted.org/packages/80/da/4813cd7adbae6467724fa46c952d7aeac5e82e550b1c62ed2aeb78d444ae/grpcio-1.71.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f903017db76bf9cc2b2d8bdd37bf04b505bbccad6be8a81e1542206875d0e9db", size = 6637043, upload_time = "2025-03-10T19:25:06.987Z" }, + { url = "https://files.pythonhosted.org/packages/52/ca/c0d767082e39dccb7985c73ab4cf1d23ce8613387149e9978c70c3bf3b07/grpcio-1.71.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:469f42a0b410883185eab4689060a20488a1a0a00f8bbb3cbc1061197b4c5a79", size = 6186143, upload_time = "2025-03-10T19:25:08.877Z" }, + { url = "https://files.pythonhosted.org/packages/00/61/7b2c8ec13303f8fe36832c13d91ad4d4ba57204b1c723ada709c346b2271/grpcio-1.71.0-cp312-cp312-win32.whl", hash = "sha256:ad9f30838550695b5eb302add33f21f7301b882937460dd24f24b3cc5a95067a", size = 3604083, upload_time = "2025-03-10T19:25:10.736Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7c/1e429c5fb26122055d10ff9a1d754790fb067d83c633ff69eddcf8e3614b/grpcio-1.71.0-cp312-cp312-win_amd64.whl", hash = "sha256:652350609332de6dac4ece254e5d7e1ff834e203d6afb769601f286886f6f3a8", size = 4272191, upload_time = "2025-03-10T19:25:13.12Z" }, + { url = "https://files.pythonhosted.org/packages/04/dd/b00cbb45400d06b26126dcfdbdb34bb6c4f28c3ebbd7aea8228679103ef6/grpcio-1.71.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:cebc1b34ba40a312ab480ccdb396ff3c529377a2fce72c45a741f7215bfe8379", size = 5184138, upload_time = "2025-03-10T19:25:15.101Z" }, + { url = "https://files.pythonhosted.org/packages/ed/0a/4651215983d590ef53aac40ba0e29dda941a02b097892c44fa3357e706e5/grpcio-1.71.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:85da336e3649a3d2171e82f696b5cad2c6231fdd5bad52616476235681bee5b3", size = 11310747, upload_time = "2025-03-10T19:25:17.201Z" }, + { url = "https://files.pythonhosted.org/packages/57/a3/149615b247f321e13f60aa512d3509d4215173bdb982c9098d78484de216/grpcio-1.71.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f9a412f55bb6e8f3bb000e020dbc1e709627dcb3a56f6431fa7076b4c1aab0db", size = 5653991, upload_time = "2025-03-10T19:25:20.39Z" }, + { url = "https://files.pythonhosted.org/packages/ca/56/29432a3e8d951b5e4e520a40cd93bebaa824a14033ea8e65b0ece1da6167/grpcio-1.71.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47be9584729534660416f6d2a3108aaeac1122f6b5bdbf9fd823e11fe6fbaa29", size = 6312781, upload_time = "2025-03-10T19:25:22.823Z" }, + { url = "https://files.pythonhosted.org/packages/a3/f8/286e81a62964ceb6ac10b10925261d4871a762d2a763fbf354115f9afc98/grpcio-1.71.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9c80ac6091c916db81131d50926a93ab162a7e97e4428ffc186b6e80d6dda4", size = 5910479, upload_time = "2025-03-10T19:25:24.828Z" }, + { url = "https://files.pythonhosted.org/packages/35/67/d1febb49ec0f599b9e6d4d0d44c2d4afdbed9c3e80deb7587ec788fcf252/grpcio-1.71.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:789d5e2a3a15419374b7b45cd680b1e83bbc1e52b9086e49308e2c0b5bbae6e3", size = 6013262, upload_time = "2025-03-10T19:25:26.987Z" }, + { url = "https://files.pythonhosted.org/packages/a1/04/f9ceda11755f0104a075ad7163fc0d96e2e3a9fe25ef38adfc74c5790daf/grpcio-1.71.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:1be857615e26a86d7363e8a163fade914595c81fec962b3d514a4b1e8760467b", size = 6643356, upload_time = "2025-03-10T19:25:29.606Z" }, + { url = "https://files.pythonhosted.org/packages/fb/ce/236dbc3dc77cf9a9242adcf1f62538734ad64727fabf39e1346ad4bd5c75/grpcio-1.71.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:a76d39b5fafd79ed604c4be0a869ec3581a172a707e2a8d7a4858cb05a5a7637", size = 6186564, upload_time = "2025-03-10T19:25:31.537Z" }, + { url = "https://files.pythonhosted.org/packages/10/fd/b3348fce9dd4280e221f513dd54024e765b21c348bc475516672da4218e9/grpcio-1.71.0-cp313-cp313-win32.whl", hash = "sha256:74258dce215cb1995083daa17b379a1a5a87d275387b7ffe137f1d5131e2cfbb", size = 3601890, upload_time = "2025-03-10T19:25:33.421Z" }, + { url = "https://files.pythonhosted.org/packages/be/f8/db5d5f3fc7e296166286c2a397836b8b042f7ad1e11028d82b061701f0f7/grpcio-1.71.0-cp313-cp313-win_amd64.whl", hash = "sha256:22c3bc8d488c039a199f7a003a38cb7635db6656fa96437a8accde8322ce2366", size = 4273308, upload_time = "2025-03-10T19:25:35.79Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload_time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload_time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "h5py" +version = "3.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/03/2e/a22d6a8bfa6f8be33e7febd985680fba531562795f0a9077ed1eb047bfb0/h5py-3.13.0.tar.gz", hash = "sha256:1870e46518720023da85d0895a1960ff2ce398c5671eac3b1a41ec696b7105c3", size = 414876, upload_time = "2025-02-18T16:04:01.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/2b/50b15fdefb577d073b49699e6ea6a0a77a3a1016c2b67e2149fc50124a10/h5py-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8a8e38ef4ceb969f832cc230c0cf808c613cc47e31e768fd7b1106c55afa1cb8", size = 3422922, upload_time = "2025-02-18T16:02:36.376Z" }, + { url = "https://files.pythonhosted.org/packages/94/59/36d87a559cab9c59b59088d52e86008d27a9602ce3afc9d3b51823014bf3/h5py-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f35640e81b03c02a88b8bf99fb6a9d3023cc52f7c627694db2f379e0028f2868", size = 2921619, upload_time = "2025-02-18T16:02:40.722Z" }, + { url = "https://files.pythonhosted.org/packages/37/ef/6f80b19682c0b0835bbee7b253bec9c16af9004f2fd6427b1dd858100273/h5py-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:337af114616f3656da0c83b68fcf53ecd9ce9989a700b0883a6e7c483c3235d4", size = 4259366, upload_time = "2025-02-18T16:02:44.544Z" }, + { url = "https://files.pythonhosted.org/packages/03/71/c99f662d4832c8835453cf3476f95daa28372023bda4aa1fca9e97c24f09/h5py-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:782ff0ac39f455f21fd1c8ebc007328f65f43d56718a89327eec76677ebf238a", size = 4509058, upload_time = "2025-02-18T16:02:49.035Z" }, + { url = "https://files.pythonhosted.org/packages/56/89/e3ff23e07131ff73a72a349be9639e4de84e163af89c1c218b939459a98a/h5py-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:22ffe2a25770a2d67213a1b94f58006c14dce06933a42d2aaa0318c5868d1508", size = 2966428, upload_time = "2025-02-18T16:02:52.061Z" }, + { url = "https://files.pythonhosted.org/packages/d8/20/438f6366ba4ded80eadb38f8927f5e2cd6d2e087179552f20ae3dbcd5d5b/h5py-3.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:477c58307b6b9a2509c59c57811afb9f598aedede24a67da808262dfa0ee37b4", size = 3384442, upload_time = "2025-02-18T16:02:56.545Z" }, + { url = "https://files.pythonhosted.org/packages/10/13/cc1cb7231399617d9951233eb12fddd396ff5d4f7f057ee5d2b1ca0ee7e7/h5py-3.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:57c4c74f627c616f02b7aec608a8c706fe08cb5b0ba7c08555a4eb1dde20805a", size = 2917567, upload_time = "2025-02-18T16:03:00.079Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d9/aed99e1c858dc698489f916eeb7c07513bc864885d28ab3689d572ba0ea0/h5py-3.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:357e6dc20b101a805ccfd0024731fbaf6e8718c18c09baf3b5e4e9d198d13fca", size = 4669544, upload_time = "2025-02-18T16:03:05.675Z" }, + { url = "https://files.pythonhosted.org/packages/a7/da/3c137006ff5f0433f0fb076b1ebe4a7bf7b5ee1e8811b5486af98b500dd5/h5py-3.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6f13f9b5ce549448c01e4dfe08ea8d1772e6078799af2c1c8d09e941230a90d", size = 4932139, upload_time = "2025-02-18T16:03:10.129Z" }, + { url = "https://files.pythonhosted.org/packages/25/61/d897952629cae131c19d4c41b2521e7dd6382f2d7177c87615c2e6dced1a/h5py-3.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:21daf38171753899b5905f3d82c99b0b1ec2cbbe282a037cad431feb620e62ec", size = 2954179, upload_time = "2025-02-18T16:03:13.716Z" }, + { url = "https://files.pythonhosted.org/packages/60/43/f276f27921919a9144074320ce4ca40882fc67b3cfee81c3f5c7df083e97/h5py-3.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e520ec76de00943dd017c8ea3f354fa1d2f542eac994811943a8faedf2a7d5cb", size = 3358040, upload_time = "2025-02-18T16:03:20.579Z" }, + { url = "https://files.pythonhosted.org/packages/1b/86/ad4a4cf781b08d4572be8bbdd8f108bb97b266a14835c640dc43dafc0729/h5py-3.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e79d8368cd9295045956bfb436656bea3f915beaa11d342e9f79f129f5178763", size = 2892766, upload_time = "2025-02-18T16:03:26.831Z" }, + { url = "https://files.pythonhosted.org/packages/69/84/4c6367d6b58deaf0fa84999ec819e7578eee96cea6cbd613640d0625ed5e/h5py-3.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56dd172d862e850823c4af02dc4ddbc308f042b85472ffdaca67f1598dff4a57", size = 4664255, upload_time = "2025-02-18T16:03:31.903Z" }, + { url = "https://files.pythonhosted.org/packages/fd/41/bc2df86b72965775f6d621e0ee269a5f3ac23e8f870abf519de9c7d93b4d/h5py-3.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be949b46b7388074c5acae017fbbe3e5ba303fd9daaa52157fdfef30bbdacadd", size = 4927580, upload_time = "2025-02-18T16:03:36.429Z" }, + { url = "https://files.pythonhosted.org/packages/97/34/165b87ea55184770a0c1fcdb7e017199974ad2e271451fd045cfe35f3add/h5py-3.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:4f97ecde7ac6513b21cd95efdfc38dc6d19f96f6ca6f2a30550e94e551458e0a", size = 2940890, upload_time = "2025-02-18T16:03:41.037Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload_time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload_time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httplib2" +version = "0.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/ad/2371116b22d616c194aa25ec410c9c6c37f23599dcd590502b74db197584/httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81", size = 351116, upload_time = "2023-03-21T22:29:37.214Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/6c/d2fbdaaa5959339d53ba38e94c123e4e84b8fbc4b84beb0e70d7c1608486/httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc", size = 96854, upload_time = "2023-03-21T22:29:35.683Z" }, +] + +[[package]] +name = "httptools" +version = "0.6.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639, upload_time = "2024-10-16T19:45:08.902Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/26/bb526d4d14c2774fe07113ca1db7255737ffbb119315839af2065abfdac3/httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069", size = 199029, upload_time = "2024-10-16T19:44:18.427Z" }, + { url = "https://files.pythonhosted.org/packages/a6/17/3e0d3e9b901c732987a45f4f94d4e2c62b89a041d93db89eafb262afd8d5/httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a", size = 103492, upload_time = "2024-10-16T19:44:19.515Z" }, + { url = "https://files.pythonhosted.org/packages/b7/24/0fe235d7b69c42423c7698d086d4db96475f9b50b6ad26a718ef27a0bce6/httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975", size = 462891, upload_time = "2024-10-16T19:44:21.067Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2f/205d1f2a190b72da6ffb5f41a3736c26d6fa7871101212b15e9b5cd8f61d/httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636", size = 459788, upload_time = "2024-10-16T19:44:22.958Z" }, + { url = "https://files.pythonhosted.org/packages/6e/4c/d09ce0eff09057a206a74575ae8f1e1e2f0364d20e2442224f9e6612c8b9/httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721", size = 433214, upload_time = "2024-10-16T19:44:24.513Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/84c9e23edbccc4a4c6f96a1b8d99dfd2350289e94f00e9ccc7aadde26fb5/httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988", size = 434120, upload_time = "2024-10-16T19:44:26.295Z" }, + { url = "https://files.pythonhosted.org/packages/d0/46/4d8e7ba9581416de1c425b8264e2cadd201eb709ec1584c381f3e98f51c1/httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17", size = 88565, upload_time = "2024-10-16T19:44:29.188Z" }, + { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683, upload_time = "2024-10-16T19:44:30.175Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337, upload_time = "2024-10-16T19:44:31.786Z" }, + { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796, upload_time = "2024-10-16T19:44:32.825Z" }, + { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837, upload_time = "2024-10-16T19:44:33.974Z" }, + { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289, upload_time = "2024-10-16T19:44:35.111Z" }, + { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779, upload_time = "2024-10-16T19:44:36.253Z" }, + { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634, upload_time = "2024-10-16T19:44:37.357Z" }, + { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214, upload_time = "2024-10-16T19:44:38.738Z" }, + { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431, upload_time = "2024-10-16T19:44:39.818Z" }, + { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121, upload_time = "2024-10-16T19:44:41.189Z" }, + { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805, upload_time = "2024-10-16T19:44:42.384Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858, upload_time = "2024-10-16T19:44:43.959Z" }, + { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042, upload_time = "2024-10-16T19:44:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682, upload_time = "2024-10-16T19:44:46.46Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload_time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload_time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "huggingface-hub" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/ce/a734204aaae6c35a22f9956ebcd8d8708ae5b842e15d6f42bd6f49e634a4/huggingface_hub-0.28.1.tar.gz", hash = "sha256:893471090c98e3b6efbdfdacafe4052b20b84d59866fb6f54c33d9af18c303ae", size = 387074, upload_time = "2025-01-30T13:45:41.519Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/da/6c2bea5327b640920267d3bf2c9fc114cfbd0a5de234d81cda80cc9e33c8/huggingface_hub-0.28.1-py3-none-any.whl", hash = "sha256:aa6b9a3ffdae939b72c464dbb0d7f99f56e649b55c3d52406f49e0a5a620c0a7", size = 464068, upload_time = "2025-01-30T13:45:39.514Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload_time = "2024-09-15T18:07:39.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload_time = "2024-09-15T18:07:37.964Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload_time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload_time = "2025-03-19T20:10:01.071Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload_time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload_time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jiter" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/c2/e4562507f52f0af7036da125bb699602ead37a2332af0788f8e0a3417f36/jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893", size = 162604, upload_time = "2025-03-10T21:37:03.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/44/e241a043f114299254e44d7e777ead311da400517f179665e59611ab0ee4/jiter-0.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6c4d99c71508912a7e556d631768dcdef43648a93660670986916b297f1c54af", size = 314654, upload_time = "2025-03-10T21:35:23.939Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/a7e5e42db9fa262baaa9489d8d14ca93f8663e7f164ed5e9acc9f467fc00/jiter-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f60fb8ce7df529812bf6c625635a19d27f30806885139e367af93f6e734ef58", size = 320909, upload_time = "2025-03-10T21:35:26.127Z" }, + { url = "https://files.pythonhosted.org/packages/60/bf/8ebdfce77bc04b81abf2ea316e9c03b4a866a7d739cf355eae4d6fd9f6fe/jiter-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51c4e1a4f8ea84d98b7b98912aa4290ac3d1eabfde8e3c34541fae30e9d1f08b", size = 341733, upload_time = "2025-03-10T21:35:27.94Z" }, + { url = "https://files.pythonhosted.org/packages/a8/4e/754ebce77cff9ab34d1d0fa0fe98f5d42590fd33622509a3ba6ec37ff466/jiter-0.9.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f4c677c424dc76684fea3e7285a7a2a7493424bea89ac441045e6a1fb1d7b3b", size = 365097, upload_time = "2025-03-10T21:35:29.605Z" }, + { url = "https://files.pythonhosted.org/packages/32/2c/6019587e6f5844c612ae18ca892f4cd7b3d8bbf49461ed29e384a0f13d98/jiter-0.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2221176dfec87f3470b21e6abca056e6b04ce9bff72315cb0b243ca9e835a4b5", size = 406603, upload_time = "2025-03-10T21:35:31.696Z" }, + { url = "https://files.pythonhosted.org/packages/da/e9/c9e6546c817ab75a1a7dab6dcc698e62e375e1017113e8e983fccbd56115/jiter-0.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c7adb66f899ffa25e3c92bfcb593391ee1947dbdd6a9a970e0d7e713237d572", size = 396625, upload_time = "2025-03-10T21:35:33.182Z" }, + { url = "https://files.pythonhosted.org/packages/be/bd/976b458add04271ebb5a255e992bd008546ea04bb4dcadc042a16279b4b4/jiter-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c98d27330fdfb77913c1097a7aab07f38ff2259048949f499c9901700789ac15", size = 351832, upload_time = "2025-03-10T21:35:35.394Z" }, + { url = "https://files.pythonhosted.org/packages/07/51/fe59e307aaebec9265dbad44d9d4381d030947e47b0f23531579b9a7c2df/jiter-0.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eda3f8cc74df66892b1d06b5d41a71670c22d95a1ca2cbab73654745ce9d0419", size = 384590, upload_time = "2025-03-10T21:35:37.171Z" }, + { url = "https://files.pythonhosted.org/packages/db/55/5dcd2693794d8e6f4889389ff66ef3be557a77f8aeeca8973a97a7c00557/jiter-0.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd5ab5ddc11418dce28343123644a100f487eaccf1de27a459ab36d6cca31043", size = 520690, upload_time = "2025-03-10T21:35:38.717Z" }, + { url = "https://files.pythonhosted.org/packages/54/d5/9f51dc90985e9eb251fbbb747ab2b13b26601f16c595a7b8baba964043bd/jiter-0.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42f8a68a69f047b310319ef8e2f52fdb2e7976fb3313ef27df495cf77bcad965", size = 512649, upload_time = "2025-03-10T21:35:40.157Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e5/4e385945179bcf128fa10ad8dca9053d717cbe09e258110e39045c881fe5/jiter-0.9.0-cp311-cp311-win32.whl", hash = "sha256:a25519efb78a42254d59326ee417d6f5161b06f5da827d94cf521fed961b1ff2", size = 206920, upload_time = "2025-03-10T21:35:41.72Z" }, + { url = "https://files.pythonhosted.org/packages/4c/47/5e0b94c603d8e54dd1faab439b40b832c277d3b90743e7835879ab663757/jiter-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:923b54afdd697dfd00d368b7ccad008cccfeb1efb4e621f32860c75e9f25edbd", size = 210119, upload_time = "2025-03-10T21:35:43.46Z" }, + { url = "https://files.pythonhosted.org/packages/af/d7/c55086103d6f29b694ec79156242304adf521577530d9031317ce5338c59/jiter-0.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7b46249cfd6c48da28f89eb0be3f52d6fdb40ab88e2c66804f546674e539ec11", size = 309203, upload_time = "2025-03-10T21:35:44.852Z" }, + { url = "https://files.pythonhosted.org/packages/b0/01/f775dfee50beb420adfd6baf58d1c4d437de41c9b666ddf127c065e5a488/jiter-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:609cf3c78852f1189894383cf0b0b977665f54cb38788e3e6b941fa6d982c00e", size = 319678, upload_time = "2025-03-10T21:35:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/ab/b8/09b73a793714726893e5d46d5c534a63709261af3d24444ad07885ce87cb/jiter-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d726a3890a54561e55a9c5faea1f7655eda7f105bd165067575ace6e65f80bb2", size = 341816, upload_time = "2025-03-10T21:35:47.856Z" }, + { url = "https://files.pythonhosted.org/packages/35/6f/b8f89ec5398b2b0d344257138182cc090302854ed63ed9c9051e9c673441/jiter-0.9.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2e89dc075c1fef8fa9be219e249f14040270dbc507df4215c324a1839522ea75", size = 364152, upload_time = "2025-03-10T21:35:49.397Z" }, + { url = "https://files.pythonhosted.org/packages/9b/ca/978cc3183113b8e4484cc7e210a9ad3c6614396e7abd5407ea8aa1458eef/jiter-0.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04e8ffa3c353b1bc4134f96f167a2082494351e42888dfcf06e944f2729cbe1d", size = 406991, upload_time = "2025-03-10T21:35:50.745Z" }, + { url = "https://files.pythonhosted.org/packages/13/3a/72861883e11a36d6aa314b4922125f6ae90bdccc225cd96d24cc78a66385/jiter-0.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:203f28a72a05ae0e129b3ed1f75f56bc419d5f91dfacd057519a8bd137b00c42", size = 395824, upload_time = "2025-03-10T21:35:52.162Z" }, + { url = "https://files.pythonhosted.org/packages/87/67/22728a86ef53589c3720225778f7c5fdb617080e3deaed58b04789418212/jiter-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fca1a02ad60ec30bb230f65bc01f611c8608b02d269f998bc29cca8619a919dc", size = 351318, upload_time = "2025-03-10T21:35:53.566Z" }, + { url = "https://files.pythonhosted.org/packages/69/b9/f39728e2e2007276806d7a6609cda7fac44ffa28ca0d02c49a4f397cc0d9/jiter-0.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:237e5cee4d5d2659aaf91bbf8ec45052cc217d9446070699441a91b386ae27dc", size = 384591, upload_time = "2025-03-10T21:35:54.95Z" }, + { url = "https://files.pythonhosted.org/packages/eb/8f/8a708bc7fd87b8a5d861f1c118a995eccbe6d672fe10c9753e67362d0dd0/jiter-0.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:528b6b71745e7326eed73c53d4aa57e2a522242320b6f7d65b9c5af83cf49b6e", size = 520746, upload_time = "2025-03-10T21:35:56.444Z" }, + { url = "https://files.pythonhosted.org/packages/95/1e/65680c7488bd2365dbd2980adaf63c562d3d41d3faac192ebc7ef5b4ae25/jiter-0.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9f48e86b57bc711eb5acdfd12b6cb580a59cc9a993f6e7dcb6d8b50522dcd50d", size = 512754, upload_time = "2025-03-10T21:35:58.789Z" }, + { url = "https://files.pythonhosted.org/packages/78/f3/fdc43547a9ee6e93c837685da704fb6da7dba311fc022e2766d5277dfde5/jiter-0.9.0-cp312-cp312-win32.whl", hash = "sha256:699edfde481e191d81f9cf6d2211debbfe4bd92f06410e7637dffb8dd5dfde06", size = 207075, upload_time = "2025-03-10T21:36:00.616Z" }, + { url = "https://files.pythonhosted.org/packages/cd/9d/742b289016d155f49028fe1bfbeb935c9bf0ffeefdf77daf4a63a42bb72b/jiter-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:099500d07b43f61d8bd780466d429c45a7b25411b334c60ca875fa775f68ccb0", size = 207999, upload_time = "2025-03-10T21:36:02.366Z" }, + { url = "https://files.pythonhosted.org/packages/e7/1b/4cd165c362e8f2f520fdb43245e2b414f42a255921248b4f8b9c8d871ff1/jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7", size = 308197, upload_time = "2025-03-10T21:36:03.828Z" }, + { url = "https://files.pythonhosted.org/packages/13/aa/7a890dfe29c84c9a82064a9fe36079c7c0309c91b70c380dc138f9bea44a/jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b", size = 318160, upload_time = "2025-03-10T21:36:05.281Z" }, + { url = "https://files.pythonhosted.org/packages/6a/38/5888b43fc01102f733f085673c4f0be5a298f69808ec63de55051754e390/jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69", size = 341259, upload_time = "2025-03-10T21:36:06.716Z" }, + { url = "https://files.pythonhosted.org/packages/3d/5e/bbdbb63305bcc01006de683b6228cd061458b9b7bb9b8d9bc348a58e5dc2/jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103", size = 363730, upload_time = "2025-03-10T21:36:08.138Z" }, + { url = "https://files.pythonhosted.org/packages/75/85/53a3edc616992fe4af6814c25f91ee3b1e22f7678e979b6ea82d3bc0667e/jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635", size = 405126, upload_time = "2025-03-10T21:36:10.934Z" }, + { url = "https://files.pythonhosted.org/packages/ae/b3/1ee26b12b2693bd3f0b71d3188e4e5d817b12e3c630a09e099e0a89e28fa/jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4", size = 393668, upload_time = "2025-03-10T21:36:12.468Z" }, + { url = "https://files.pythonhosted.org/packages/11/87/e084ce261950c1861773ab534d49127d1517b629478304d328493f980791/jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d", size = 352350, upload_time = "2025-03-10T21:36:14.148Z" }, + { url = "https://files.pythonhosted.org/packages/f0/06/7dca84b04987e9df563610aa0bc154ea176e50358af532ab40ffb87434df/jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3", size = 384204, upload_time = "2025-03-10T21:36:15.545Z" }, + { url = "https://files.pythonhosted.org/packages/16/2f/82e1c6020db72f397dd070eec0c85ebc4df7c88967bc86d3ce9864148f28/jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5", size = 520322, upload_time = "2025-03-10T21:36:17.016Z" }, + { url = "https://files.pythonhosted.org/packages/36/fd/4f0cd3abe83ce208991ca61e7e5df915aa35b67f1c0633eb7cf2f2e88ec7/jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d", size = 512184, upload_time = "2025-03-10T21:36:18.47Z" }, + { url = "https://files.pythonhosted.org/packages/a0/3c/8a56f6d547731a0b4410a2d9d16bf39c861046f91f57c98f7cab3d2aa9ce/jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53", size = 206504, upload_time = "2025-03-10T21:36:19.809Z" }, + { url = "https://files.pythonhosted.org/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7", size = 204943, upload_time = "2025-03-10T21:36:21.536Z" }, + { url = "https://files.pythonhosted.org/packages/78/0f/77a63ca7aa5fed9a1b9135af57e190d905bcd3702b36aca46a01090d39ad/jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001", size = 317281, upload_time = "2025-03-10T21:36:22.959Z" }, + { url = "https://files.pythonhosted.org/packages/f9/39/a3a1571712c2bf6ec4c657f0d66da114a63a2e32b7e4eb8e0b83295ee034/jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a", size = 350273, upload_time = "2025-03-10T21:36:24.414Z" }, + { url = "https://files.pythonhosted.org/packages/ee/47/3729f00f35a696e68da15d64eb9283c330e776f3b5789bac7f2c0c4df209/jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf", size = 206867, upload_time = "2025-03-10T21:36:25.843Z" }, +] + +[[package]] +name = "keras" +version = "2.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/03/80072f4ee46e3c77e95b06d684fadf90a67759e4e9f1d86a563e0965c71a/keras-2.15.0.tar.gz", hash = "sha256:81871d298c064dc4ac6b58440fdae67bfcf47c8d7ad28580fab401834c06a575", size = 1252015, upload_time = "2023-11-07T00:39:57.716Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/a7/0d4490de967a67f68a538cc9cdb259bff971c4b5787f7765dc7c8f118f71/keras-2.15.0-py3-none-any.whl", hash = "sha256:2dcc6d2e30cf9c951064b63c1f4c404b966c59caf09e01f3549138ec8ee0dd1f", size = 1710438, upload_time = "2023-11-07T00:39:55.57Z" }, +] + +[[package]] +name = "libclang" +version = "18.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/5c/ca35e19a4f142adffa27e3d652196b7362fa612243e2b916845d801454fc/libclang-18.1.1.tar.gz", hash = "sha256:a1214966d08d73d971287fc3ead8dfaf82eb07fb197680d8b3859dbbbbf78250", size = 39612, upload_time = "2024-03-17T16:04:37.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/49/f5e3e7e1419872b69f6f5e82ba56e33955a74bd537d8a1f5f1eff2f3668a/libclang-18.1.1-1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:0b2e143f0fac830156feb56f9231ff8338c20aecfe72b4ffe96f19e5a1dbb69a", size = 25836045, upload_time = "2024-06-30T17:40:31.646Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e5/fc61bbded91a8830ccce94c5294ecd6e88e496cc85f6704bf350c0634b70/libclang-18.1.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:6f14c3f194704e5d09769108f03185fce7acaf1d1ae4bbb2f30a72c2400cb7c5", size = 26502641, upload_time = "2024-03-18T15:52:26.722Z" }, + { url = "https://files.pythonhosted.org/packages/db/ed/1df62b44db2583375f6a8a5e2ca5432bbdc3edb477942b9b7c848c720055/libclang-18.1.1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:83ce5045d101b669ac38e6da8e58765f12da2d3aafb3b9b98d88b286a60964d8", size = 26420207, upload_time = "2024-03-17T15:00:26.63Z" }, + { url = "https://files.pythonhosted.org/packages/1d/fc/716c1e62e512ef1c160e7984a73a5fc7df45166f2ff3f254e71c58076f7c/libclang-18.1.1-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:c533091d8a3bbf7460a00cb6c1a71da93bffe148f172c7d03b1c31fbf8aa2a0b", size = 24515943, upload_time = "2024-03-17T16:03:45.942Z" }, + { url = "https://files.pythonhosted.org/packages/3c/3d/f0ac1150280d8d20d059608cf2d5ff61b7c3b7f7bcf9c0f425ab92df769a/libclang-18.1.1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:54dda940a4a0491a9d1532bf071ea3ef26e6dbaf03b5000ed94dd7174e8f9592", size = 23784972, upload_time = "2024-03-17T16:12:47.677Z" }, + { url = "https://files.pythonhosted.org/packages/fe/2f/d920822c2b1ce9326a4c78c0c2b4aa3fde610c7ee9f631b600acb5376c26/libclang-18.1.1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:cf4a99b05376513717ab5d82a0db832c56ccea4fd61a69dbb7bccf2dfb207dbe", size = 20259606, upload_time = "2024-03-17T16:17:42.437Z" }, + { url = "https://files.pythonhosted.org/packages/2d/c2/de1db8c6d413597076a4259cea409b83459b2db997c003578affdd32bf66/libclang-18.1.1-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:69f8eb8f65c279e765ffd28aaa7e9e364c776c17618af8bff22a8df58677ff4f", size = 24921494, upload_time = "2024-03-17T16:14:20.132Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2d/3f480b1e1d31eb3d6de5e3ef641954e5c67430d5ac93b7fa7e07589576c7/libclang-18.1.1-py2.py3-none-win_amd64.whl", hash = "sha256:4dd2d3b82fab35e2bf9ca717d7b63ac990a3519c7e312f19fa8e86dcc712f7fb", size = 26415083, upload_time = "2024-03-17T16:42:21.703Z" }, + { url = "https://files.pythonhosted.org/packages/71/cf/e01dc4cc79779cd82d77888a88ae2fa424d93b445ad4f6c02bfc18335b70/libclang-18.1.1-py2.py3-none-win_arm64.whl", hash = "sha256:3f0e1f49f04d3cd198985fea0511576b0aee16f9ff0e0f0cad7f9c57ec3c20e8", size = 22361112, upload_time = "2024-03-17T16:42:59.565Z" }, +] + +[[package]] +name = "lxml" +version = "5.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/73/a6/0730ff6cbb87e42e1329a486fe4ccbd3f8f728cb629c2671b0d093a85918/lxml-5.1.1.tar.gz", hash = "sha256:42a8aa957e98bd8b884a8142175ec24ce4ef0a57760e8879f193bfe64b757ca9", size = 3838907, upload_time = "2024-03-29T06:46:52.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/01/977ac832ec441dbde7b373faef715d8f58c4052cc88ae01070be7f3d7907/lxml-5.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:906966babd374fdfe46e130fc656488003f0d0d63b7cba612aa5a796c8804283", size = 8756105, upload_time = "2024-03-29T06:43:08.757Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0a/8ef5c87c72ba4d9a8765c829d1abc28c8482ade37735c7c2725221243d3d/lxml-5.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9c03f3715c68fc707d9383d56e482d95d198ba07cb3dad4aee9e5a5ca06b2536", size = 4751802, upload_time = "2024-03-29T06:43:13.165Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2a/9096d632371ce48dafcd0459520c9afd60d3b26b6c00a5d3f8e93fdb089d/lxml-5.1.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d26243d994d4077a50056e9008848e5b421be0c6f0fd4e932a9463e1d89fc42b", size = 5202069, upload_time = "2024-03-29T06:43:16.426Z" }, + { url = "https://files.pythonhosted.org/packages/7e/03/dea246cbe3d959062751ec1aa031972e61680ae4a60c67df08bb1305b465/lxml-5.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de00750318ae6869b9dfa6429a4f82b8ecad043049414547474d09db549c2ee", size = 4921442, upload_time = "2024-03-29T06:43:19.842Z" }, + { url = "https://files.pythonhosted.org/packages/84/71/0d510fe3f99a8ddb776d7b803ed1f41b9eb64b30c5f945f241edf238adfa/lxml-5.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29b2771b4eec4e85063f10294facdd9829d010e6cc9668040d0cf936dc56733a", size = 5084186, upload_time = "2024-03-29T06:43:23.7Z" }, + { url = "https://files.pythonhosted.org/packages/de/c3/9fb0276ad05f3dc454d2f8165181039da4cbfb605f53816d7f34d5e93cca/lxml-5.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d9358f7268c161dc0a1c3216018f26c04954b5dd47ba6dead79da6598f4725d4", size = 4962146, upload_time = "2024-03-29T06:43:27.312Z" }, + { url = "https://files.pythonhosted.org/packages/eb/4f/533dd6ece9f4aa2c8455244c074f61facb23944271cc82bcceccc1eca8a1/lxml-5.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8a943826e7a9254eed661a7134fcde3c832a9fecd989d0f47c6e08c7b769cb2c", size = 5094316, upload_time = "2024-03-29T06:43:30.877Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bd/62cc8a995bd34b1f44fc3706bab0c21bde489dc56482a5f4c9a6bb11ff65/lxml-5.1.1-cp311-cp311-win32.whl", hash = "sha256:74d0967c6f91eec6fe91159f9e8ccb3720fa0fbf9f462109c7bef62550df397c", size = 3560964, upload_time = "2024-03-29T06:43:34.609Z" }, + { url = "https://files.pythonhosted.org/packages/02/7e/af62091cc2c3096573458cec140a914b54f4b36892f549449cc556ed34cb/lxml-5.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:26974096654241df08a30dc2eb0e139c1ad5653660aa4b2ced66000230e96c14", size = 3909680, upload_time = "2024-03-29T06:43:38.221Z" }, + { url = "https://files.pythonhosted.org/packages/e3/0a/3901402aef812c57c27d1bb5405a29abb345fbd7e1b595d060bb065e46c6/lxml-5.1.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:55e13a19829dcdbf0c5233062977aeb6daf72e65124909128045976f659164e8", size = 8786323, upload_time = "2024-03-29T06:43:42.886Z" }, + { url = "https://files.pythonhosted.org/packages/04/92/74df36e8ccecdc96260531f0cbbf849ed25d3ff77a5655a3c89d588e982d/lxml-5.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:adedfb61be862f48907218e3a24bf051fd2ecca53358f3958b0bdb17d7881c20", size = 4764866, upload_time = "2024-03-29T06:43:46.476Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b2/5dfbbec91014ffac561d51d4e3467587a646572f111fd7ddd076568d34c7/lxml-5.1.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77425482e4311d1cff119a2b5ab26c52ec209d2a3d728a54db3223ab91995e20", size = 5153741, upload_time = "2024-03-29T06:43:50.444Z" }, + { url = "https://files.pythonhosted.org/packages/5b/cf/3da2e345dd19b509c9d269000f16888f4ef50f8ca742c268f8142a7e0b84/lxml-5.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d380f183bd03ab827899753ea96dabe27d2025eb0bfd4f2ac0eee4afa0f351d", size = 4853573, upload_time = "2024-03-29T06:43:53.449Z" }, + { url = "https://files.pythonhosted.org/packages/67/78/aad9c76bf995febcacd836e12ecc670c89737502ebe44f69c472918c8ffd/lxml-5.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8682af96b5ad5093aab9eee5e4ff24cb7a9796c78699d914dd456ebfe7484a6", size = 5035899, upload_time = "2024-03-29T06:43:57.342Z" }, + { url = "https://files.pythonhosted.org/packages/7e/88/d0cb086fb1b72fec96bb45aad1058ec31b9df3b146245747c0601490428b/lxml-5.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68eed33377a9925aed7ba56c8611d50aaa1e45638c07a92b4b4b0a0436cc2dd2", size = 4896851, upload_time = "2024-03-29T06:44:00.471Z" }, + { url = "https://files.pythonhosted.org/packages/5d/69/8cb0a076851dcc5fa185042d3f19e61edb596d677280085873fd49043529/lxml-5.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7c1d2f6e9c7a1c4478146ee38d16dbe0eb3be998424bc0f01346c671c38b86d", size = 5048250, upload_time = "2024-03-29T06:44:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d7/a3d5f104c46231060d3e177ad946bf5c0bbc5652f960fbf2dedb66f0f9f7/lxml-5.1.1-cp312-cp312-win32.whl", hash = "sha256:81107c8de3e463052ae8fd05fd31b97c371c7a9ce4a189b8bb5f45b0b3545fb9", size = 3571032, upload_time = "2024-03-29T06:44:07.247Z" }, + { url = "https://files.pythonhosted.org/packages/d6/6b/a7c513c461b1448122d27faeb8f4b61150777816303a21fa6f9bb8be3266/lxml-5.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:0e46181d15fae102c53621bed9356b7a599a1e837b978c934a350dd00842b1d9", size = 3909299, upload_time = "2024-03-29T06:44:11.354Z" }, +] + +[[package]] +name = "mako" +version = "1.3.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/38/bd5b78a920a64d708fe6bc8e0a2c075e1389d53bef8413725c63ba041535/mako-1.3.10.tar.gz", hash = "sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28", size = 392474, upload_time = "2025-04-10T12:44:31.16Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59", size = 78509, upload_time = "2025-04-10T12:50:53.297Z" }, +] + +[[package]] +name = "markdown" +version = "3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/15/222b423b0b88689c266d9eac4e61396fe2cc53464459d6a37618ac863b24/markdown-3.8.tar.gz", hash = "sha256:7df81e63f0df5c4b24b7d156eb81e4690595239b7d70937d0409f1b0de319c6f", size = 360906, upload_time = "2025-04-11T14:42:50.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/3f/afe76f8e2246ffbc867440cbcf90525264df0e658f8a5ca1f872b3f6192a/markdown-3.8-py3-none-any.whl", hash = "sha256:794a929b79c5af141ef5ab0f2f642d0f7b1872981250230e72682346f7cc90dc", size = 106210, upload_time = "2025-04-11T14:42:49.178Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload_time = "2023-06-03T06:41:14.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload_time = "2023-06-03T06:41:11.019Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload_time = "2024-10-18T15:21:54.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload_time = "2024-10-18T15:21:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload_time = "2024-10-18T15:21:02.941Z" }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload_time = "2024-10-18T15:21:03.953Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload_time = "2024-10-18T15:21:06.495Z" }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload_time = "2024-10-18T15:21:07.295Z" }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload_time = "2024-10-18T15:21:08.073Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload_time = "2024-10-18T15:21:09.318Z" }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload_time = "2024-10-18T15:21:10.185Z" }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload_time = "2024-10-18T15:21:11.005Z" }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload_time = "2024-10-18T15:21:12.911Z" }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload_time = "2024-10-18T15:21:13.777Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload_time = "2024-10-18T15:21:14.822Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload_time = "2024-10-18T15:21:15.642Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload_time = "2024-10-18T15:21:17.133Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload_time = "2024-10-18T15:21:18.064Z" }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload_time = "2024-10-18T15:21:18.859Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload_time = "2024-10-18T15:21:19.671Z" }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload_time = "2024-10-18T15:21:20.971Z" }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload_time = "2024-10-18T15:21:22.646Z" }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload_time = "2024-10-18T15:21:23.499Z" }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload_time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload_time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload_time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload_time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload_time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload_time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload_time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload_time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload_time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload_time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload_time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload_time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload_time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload_time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload_time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload_time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload_time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload_time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload_time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload_time = "2024-10-18T15:21:42.784Z" }, +] + +[[package]] +name = "marshmallow" +version = "3.23.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/c0/d674c9de69227beafa41e1601b0c48b8b51060212abc231d4332e4b1e794/marshmallow-3.23.3.tar.gz", hash = "sha256:d586c8685ebdb80bf754e1f96e3f305aaf30951f1fc69175b977453633467e76", size = 175606, upload_time = "2025-01-03T20:18:41.52Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/82/d8c37cc92948ce11e5d8d71602bbac7ac4257f9e1f918fd91b1ddac4ec97/marshmallow-3.23.3-py3-none-any.whl", hash = "sha256:20c0f8c613f68bcb45b2a0d3282e2f172575560170bf220d67aafb42717910e4", size = 48911, upload_time = "2025-01-03T20:18:39.62Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload_time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "ml-dtypes" +version = "0.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/7d/8d85fcba868758b3a546e6914e727abd8f29ea6918079f816975c9eecd63/ml_dtypes-0.3.2.tar.gz", hash = "sha256:533059bc5f1764fac071ef54598db358c167c51a718f68f5bb55e3dee79d2967", size = 692014, upload_time = "2024-01-03T19:21:23.615Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/a4/6aabb78f1569550fd77c74d2c1d008b502c8ce72776bd88b14ea6c182c9e/ml_dtypes-0.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:763697ab8a88d47443997a7cdf3aac7340049aed45f7521f6b0ec8a0594821fe", size = 389791, upload_time = "2024-01-03T19:21:02.844Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ed/211bf2e1c66e4ec9b712c3be848a876185c7f0d5e94bf647b60e64ef32eb/ml_dtypes-0.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b89b194e9501a92d289c1ffd411380baf5daafb9818109a4f49b0a1b6dce4462", size = 2185796, upload_time = "2024-01-03T19:21:04.291Z" }, + { url = "https://files.pythonhosted.org/packages/77/a0/d4ee9e3aca5b9101c590b58555820618e8201c2ccb7004eabb417ec046ac/ml_dtypes-0.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c34f2ba9660b21fe1034b608308a01be82bbef2a92fb8199f24dc6bad0d5226", size = 2164071, upload_time = "2024-01-03T19:21:05.78Z" }, + { url = "https://files.pythonhosted.org/packages/a4/db/1784b87285588788170f87e987bfb4bda218d62a70a81ebb66c94e7f9b95/ml_dtypes-0.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:6604877d567a29bfe7cc02969ae0f2425260e5335505cf5e7fefc3e5465f5655", size = 127681, upload_time = "2024-01-03T19:21:07.337Z" }, + { url = "https://files.pythonhosted.org/packages/ad/2d/57a8aa1ba7472a93a675bfba3f0c90d9396d01d040617a5345ce87884330/ml_dtypes-0.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:93b78f53431c93953f7850bb1b925a17f0ab5d97527e38a7e865b5b4bc5cfc18", size = 393571, upload_time = "2024-01-03T19:21:08.836Z" }, + { url = "https://files.pythonhosted.org/packages/6a/05/ec30199c791cf0d788a26f56d8efb8ee4133ede79a9680fd8cc05e706404/ml_dtypes-0.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a17ef2322e60858d93584e9c52a5be7dd6236b056b7fa1ec57f1bb6ba043e33", size = 2180925, upload_time = "2024-01-03T19:21:10.87Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/93219c44bae4017e6e43391fa4433592de08e05def9d885227d3596f21a5/ml_dtypes-0.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8505946df1665db01332d885c2020b4cb9e84a8b1241eb4ba69d59591f65855", size = 2160573, upload_time = "2024-01-03T19:21:12.775Z" }, + { url = "https://files.pythonhosted.org/packages/47/f3/847da54c3d243ff2aa778078ecf09da199194d282744718ef325dd8afd41/ml_dtypes-0.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:f47619d978ab1ae7dfdc4052ea97c636c6263e1f19bd1be0e42c346b98d15ff4", size = 128649, upload_time = "2024-01-03T19:21:14.312Z" }, +] + +[[package]] +name = "multidict" +version = "6.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/2c/e367dfb4c6538614a0c9453e510d75d66099edf1c4e69da1b5ce691a1931/multidict-6.4.3.tar.gz", hash = "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", size = 89372, upload_time = "2025-04-10T22:20:17.956Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/e0/53cf7f27eda48fffa53cfd4502329ed29e00efb9e4ce41362cbf8aa54310/multidict-6.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", size = 65259, upload_time = "2025-04-10T22:17:59.632Z" }, + { url = "https://files.pythonhosted.org/packages/44/79/1dcd93ce7070cf01c2ee29f781c42b33c64fce20033808f1cc9ec8413d6e/multidict-6.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", size = 38451, upload_time = "2025-04-10T22:18:01.202Z" }, + { url = "https://files.pythonhosted.org/packages/f4/35/2292cf29ab5f0d0b3613fad1b75692148959d3834d806be1885ceb49a8ff/multidict-6.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad", size = 37706, upload_time = "2025-04-10T22:18:02.276Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d1/6b157110b2b187b5a608b37714acb15ee89ec773e3800315b0107ea648cd/multidict-6.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", size = 226669, upload_time = "2025-04-10T22:18:03.436Z" }, + { url = "https://files.pythonhosted.org/packages/40/7f/61a476450651f177c5570e04bd55947f693077ba7804fe9717ee9ae8de04/multidict-6.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", size = 223182, upload_time = "2025-04-10T22:18:04.922Z" }, + { url = "https://files.pythonhosted.org/packages/51/7b/eaf7502ac4824cdd8edcf5723e2e99f390c879866aec7b0c420267b53749/multidict-6.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", size = 235025, upload_time = "2025-04-10T22:18:06.274Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f6/facdbbd73c96b67a93652774edd5778ab1167854fa08ea35ad004b1b70ad/multidict-6.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", size = 231481, upload_time = "2025-04-10T22:18:07.742Z" }, + { url = "https://files.pythonhosted.org/packages/70/57/c008e861b3052405eebf921fd56a748322d8c44dcfcab164fffbccbdcdc4/multidict-6.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", size = 223492, upload_time = "2025-04-10T22:18:09.095Z" }, + { url = "https://files.pythonhosted.org/packages/30/4d/7d8440d3a12a6ae5d6b202d6e7f2ac6ab026e04e99aaf1b73f18e6bc34bc/multidict-6.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", size = 217279, upload_time = "2025-04-10T22:18:10.474Z" }, + { url = "https://files.pythonhosted.org/packages/7f/e7/bca0df4dd057597b94138d2d8af04eb3c27396a425b1b0a52e082f9be621/multidict-6.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", size = 228733, upload_time = "2025-04-10T22:18:11.793Z" }, + { url = "https://files.pythonhosted.org/packages/88/f5/383827c3f1c38d7c92dbad00a8a041760228573b1c542fbf245c37bbca8a/multidict-6.4.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", size = 218089, upload_time = "2025-04-10T22:18:13.153Z" }, + { url = "https://files.pythonhosted.org/packages/36/8a/a5174e8a7d8b94b4c8f9c1e2cf5d07451f41368ffe94d05fc957215b8e72/multidict-6.4.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", size = 225257, upload_time = "2025-04-10T22:18:14.654Z" }, + { url = "https://files.pythonhosted.org/packages/8c/76/1d4b7218f0fd00b8e5c90b88df2e45f8af127f652f4e41add947fa54c1c4/multidict-6.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", size = 234728, upload_time = "2025-04-10T22:18:16.236Z" }, + { url = "https://files.pythonhosted.org/packages/64/44/18372a4f6273fc7ca25630d7bf9ae288cde64f29593a078bff450c7170b6/multidict-6.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", size = 230087, upload_time = "2025-04-10T22:18:17.979Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/28728c314a698d8a6d9491fcacc897077348ec28dd85884d09e64df8a855/multidict-6.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", size = 223137, upload_time = "2025-04-10T22:18:19.362Z" }, + { url = "https://files.pythonhosted.org/packages/22/50/785bb2b3fe16051bc91c70a06a919f26312da45c34db97fc87441d61e343/multidict-6.4.3-cp311-cp311-win32.whl", hash = "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", size = 34959, upload_time = "2025-04-10T22:18:20.728Z" }, + { url = "https://files.pythonhosted.org/packages/2f/63/2a22e099ae2f4d92897618c00c73a09a08a2a9aa14b12736965bf8d59fd3/multidict-6.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", size = 38541, upload_time = "2025-04-10T22:18:22.001Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bb/3abdaf8fe40e9226ce8a2ba5ecf332461f7beec478a455d6587159f1bf92/multidict-6.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", size = 64019, upload_time = "2025-04-10T22:18:23.174Z" }, + { url = "https://files.pythonhosted.org/packages/7e/b5/1b2e8de8217d2e89db156625aa0fe4a6faad98972bfe07a7b8c10ef5dd6b/multidict-6.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", size = 37925, upload_time = "2025-04-10T22:18:24.834Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e2/3ca91c112644a395c8eae017144c907d173ea910c913ff8b62549dcf0bbf/multidict-6.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", size = 37008, upload_time = "2025-04-10T22:18:26.069Z" }, + { url = "https://files.pythonhosted.org/packages/60/23/79bc78146c7ac8d1ac766b2770ca2e07c2816058b8a3d5da6caed8148637/multidict-6.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", size = 224374, upload_time = "2025-04-10T22:18:27.714Z" }, + { url = "https://files.pythonhosted.org/packages/86/35/77950ed9ebd09136003a85c1926ba42001ca5be14feb49710e4334ee199b/multidict-6.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", size = 230869, upload_time = "2025-04-10T22:18:29.162Z" }, + { url = "https://files.pythonhosted.org/packages/49/97/2a33c6e7d90bc116c636c14b2abab93d6521c0c052d24bfcc231cbf7f0e7/multidict-6.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", size = 231949, upload_time = "2025-04-10T22:18:30.679Z" }, + { url = "https://files.pythonhosted.org/packages/56/ce/e9b5d9fcf854f61d6686ada7ff64893a7a5523b2a07da6f1265eaaea5151/multidict-6.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", size = 231032, upload_time = "2025-04-10T22:18:32.146Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ac/7ced59dcdfeddd03e601edb05adff0c66d81ed4a5160c443e44f2379eef0/multidict-6.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", size = 223517, upload_time = "2025-04-10T22:18:33.538Z" }, + { url = "https://files.pythonhosted.org/packages/db/e6/325ed9055ae4e085315193a1b58bdb4d7fc38ffcc1f4975cfca97d015e17/multidict-6.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", size = 216291, upload_time = "2025-04-10T22:18:34.962Z" }, + { url = "https://files.pythonhosted.org/packages/fa/84/eeee6d477dd9dcb7691c3bb9d08df56017f5dd15c730bcc9383dcf201cf4/multidict-6.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", size = 228982, upload_time = "2025-04-10T22:18:36.443Z" }, + { url = "https://files.pythonhosted.org/packages/82/94/4d1f3e74e7acf8b0c85db350e012dcc61701cd6668bc2440bb1ecb423c90/multidict-6.4.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", size = 226823, upload_time = "2025-04-10T22:18:37.924Z" }, + { url = "https://files.pythonhosted.org/packages/09/f0/1e54b95bda7cd01080e5732f9abb7b76ab5cc795b66605877caeb2197476/multidict-6.4.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", size = 222714, upload_time = "2025-04-10T22:18:39.807Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a2/f6cbca875195bd65a3e53b37ab46486f3cc125bdeab20eefe5042afa31fb/multidict-6.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", size = 233739, upload_time = "2025-04-10T22:18:41.341Z" }, + { url = "https://files.pythonhosted.org/packages/79/68/9891f4d2b8569554723ddd6154375295f789dc65809826c6fb96a06314fd/multidict-6.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", size = 230809, upload_time = "2025-04-10T22:18:42.817Z" }, + { url = "https://files.pythonhosted.org/packages/e6/72/a7be29ba1e87e4fc5ceb44dabc7940b8005fd2436a332a23547709315f70/multidict-6.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", size = 226934, upload_time = "2025-04-10T22:18:44.311Z" }, + { url = "https://files.pythonhosted.org/packages/12/c1/259386a9ad6840ff7afc686da96808b503d152ac4feb3a96c651dc4f5abf/multidict-6.4.3-cp312-cp312-win32.whl", hash = "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", size = 35242, upload_time = "2025-04-10T22:18:46.193Z" }, + { url = "https://files.pythonhosted.org/packages/06/24/c8fdff4f924d37225dc0c56a28b1dca10728fc2233065fafeb27b4b125be/multidict-6.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", size = 38635, upload_time = "2025-04-10T22:18:47.498Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4b/86fd786d03915c6f49998cf10cd5fe6b6ac9e9a071cb40885d2e080fb90d/multidict-6.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", size = 63831, upload_time = "2025-04-10T22:18:48.748Z" }, + { url = "https://files.pythonhosted.org/packages/45/05/9b51fdf7aef2563340a93be0a663acba2c428c4daeaf3960d92d53a4a930/multidict-6.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", size = 37888, upload_time = "2025-04-10T22:18:50.021Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/53fc25394386c911822419b522181227ca450cf57fea76e6188772a1bd91/multidict-6.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", size = 36852, upload_time = "2025-04-10T22:18:51.246Z" }, + { url = "https://files.pythonhosted.org/packages/8a/68/7b99c751e822467c94a235b810a2fd4047d4ecb91caef6b5c60116991c4b/multidict-6.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", size = 223644, upload_time = "2025-04-10T22:18:52.965Z" }, + { url = "https://files.pythonhosted.org/packages/80/1b/d458d791e4dd0f7e92596667784fbf99e5c8ba040affe1ca04f06b93ae92/multidict-6.4.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", size = 230446, upload_time = "2025-04-10T22:18:54.509Z" }, + { url = "https://files.pythonhosted.org/packages/e2/46/9793378d988905491a7806d8987862dc5a0bae8a622dd896c4008c7b226b/multidict-6.4.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", size = 231070, upload_time = "2025-04-10T22:18:56.019Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b8/b127d3e1f8dd2a5bf286b47b24567ae6363017292dc6dec44656e6246498/multidict-6.4.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", size = 229956, upload_time = "2025-04-10T22:18:59.146Z" }, + { url = "https://files.pythonhosted.org/packages/0c/93/f70a4c35b103fcfe1443059a2bb7f66e5c35f2aea7804105ff214f566009/multidict-6.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", size = 222599, upload_time = "2025-04-10T22:19:00.657Z" }, + { url = "https://files.pythonhosted.org/packages/63/8c/e28e0eb2fe34921d6aa32bfc4ac75b09570b4d6818cc95d25499fe08dc1d/multidict-6.4.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", size = 216136, upload_time = "2025-04-10T22:19:02.244Z" }, + { url = "https://files.pythonhosted.org/packages/72/f5/fbc81f866585b05f89f99d108be5d6ad170e3b6c4d0723d1a2f6ba5fa918/multidict-6.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", size = 228139, upload_time = "2025-04-10T22:19:04.151Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ba/7d196bad6b85af2307d81f6979c36ed9665f49626f66d883d6c64d156f78/multidict-6.4.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", size = 226251, upload_time = "2025-04-10T22:19:06.117Z" }, + { url = "https://files.pythonhosted.org/packages/cc/e2/fae46a370dce79d08b672422a33df721ec8b80105e0ea8d87215ff6b090d/multidict-6.4.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", size = 221868, upload_time = "2025-04-10T22:19:07.981Z" }, + { url = "https://files.pythonhosted.org/packages/26/20/bbc9a3dec19d5492f54a167f08546656e7aef75d181d3d82541463450e88/multidict-6.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", size = 233106, upload_time = "2025-04-10T22:19:09.5Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8d/f30ae8f5ff7a2461177f4d8eb0d8f69f27fb6cfe276b54ec4fd5a282d918/multidict-6.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", size = 230163, upload_time = "2025-04-10T22:19:11Z" }, + { url = "https://files.pythonhosted.org/packages/15/e9/2833f3c218d3c2179f3093f766940ded6b81a49d2e2f9c46ab240d23dfec/multidict-6.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", size = 225906, upload_time = "2025-04-10T22:19:12.875Z" }, + { url = "https://files.pythonhosted.org/packages/f1/31/6edab296ac369fd286b845fa5dd4c409e63bc4655ed8c9510fcb477e9ae9/multidict-6.4.3-cp313-cp313-win32.whl", hash = "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", size = 35238, upload_time = "2025-04-10T22:19:14.41Z" }, + { url = "https://files.pythonhosted.org/packages/23/57/2c0167a1bffa30d9a1383c3dab99d8caae985defc8636934b5668830d2ef/multidict-6.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", size = 38799, upload_time = "2025-04-10T22:19:15.869Z" }, + { url = "https://files.pythonhosted.org/packages/c9/13/2ead63b9ab0d2b3080819268acb297bd66e238070aa8d42af12b08cbee1c/multidict-6.4.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", size = 68642, upload_time = "2025-04-10T22:19:17.527Z" }, + { url = "https://files.pythonhosted.org/packages/85/45/f1a751e1eede30c23951e2ae274ce8fad738e8a3d5714be73e0a41b27b16/multidict-6.4.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", size = 40028, upload_time = "2025-04-10T22:19:19.465Z" }, + { url = "https://files.pythonhosted.org/packages/a7/29/fcc53e886a2cc5595cc4560df333cb9630257bda65003a7eb4e4e0d8f9c1/multidict-6.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", size = 39424, upload_time = "2025-04-10T22:19:20.762Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f0/056c81119d8b88703971f937b371795cab1407cd3c751482de5bfe1a04a9/multidict-6.4.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", size = 226178, upload_time = "2025-04-10T22:19:22.17Z" }, + { url = "https://files.pythonhosted.org/packages/a3/79/3b7e5fea0aa80583d3a69c9d98b7913dfd4fbc341fb10bb2fb48d35a9c21/multidict-6.4.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", size = 222617, upload_time = "2025-04-10T22:19:23.773Z" }, + { url = "https://files.pythonhosted.org/packages/06/db/3ed012b163e376fc461e1d6a67de69b408339bc31dc83d39ae9ec3bf9578/multidict-6.4.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", size = 227919, upload_time = "2025-04-10T22:19:25.35Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/0433c104bca380989bc04d3b841fc83e95ce0c89f680e9ea4251118b52b6/multidict-6.4.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", size = 226097, upload_time = "2025-04-10T22:19:27.183Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/910db2618175724dd254b7ae635b6cd8d2947a8b76b0376de7b96d814dab/multidict-6.4.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", size = 220706, upload_time = "2025-04-10T22:19:28.882Z" }, + { url = "https://files.pythonhosted.org/packages/d1/af/aa176c6f5f1d901aac957d5258d5e22897fe13948d1e69063ae3d5d0ca01/multidict-6.4.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", size = 211728, upload_time = "2025-04-10T22:19:30.481Z" }, + { url = "https://files.pythonhosted.org/packages/e7/42/d51cc5fc1527c3717d7f85137d6c79bb7a93cd214c26f1fc57523774dbb5/multidict-6.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", size = 226276, upload_time = "2025-04-10T22:19:32.454Z" }, + { url = "https://files.pythonhosted.org/packages/28/6b/d836dea45e0b8432343ba4acf9a8ecaa245da4c0960fb7ab45088a5e568a/multidict-6.4.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", size = 212069, upload_time = "2025-04-10T22:19:34.17Z" }, + { url = "https://files.pythonhosted.org/packages/55/34/0ee1a7adb3560e18ee9289c6e5f7db54edc312b13e5c8263e88ea373d12c/multidict-6.4.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", size = 217858, upload_time = "2025-04-10T22:19:35.879Z" }, + { url = "https://files.pythonhosted.org/packages/04/08/586d652c2f5acefe0cf4e658eedb4d71d4ba6dfd4f189bd81b400fc1bc6b/multidict-6.4.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", size = 226988, upload_time = "2025-04-10T22:19:37.434Z" }, + { url = "https://files.pythonhosted.org/packages/82/e3/cc59c7e2bc49d7f906fb4ffb6d9c3a3cf21b9f2dd9c96d05bef89c2b1fd1/multidict-6.4.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", size = 220435, upload_time = "2025-04-10T22:19:39.005Z" }, + { url = "https://files.pythonhosted.org/packages/e0/32/5c3a556118aca9981d883f38c4b1bfae646f3627157f70f4068e5a648955/multidict-6.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", size = 221494, upload_time = "2025-04-10T22:19:41.447Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3b/1599631f59024b75c4d6e3069f4502409970a336647502aaf6b62fb7ac98/multidict-6.4.3-cp313-cp313t-win32.whl", hash = "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", size = 41775, upload_time = "2025-04-10T22:19:43.707Z" }, + { url = "https://files.pythonhosted.org/packages/e8/4e/09301668d675d02ca8e8e1a3e6be046619e30403f5ada2ed5b080ae28d02/multidict-6.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", size = 45946, upload_time = "2025-04-10T22:19:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/96/10/7d526c8974f017f1e7ca584c71ee62a638e9334d8d33f27d7cdfc9ae79e4/multidict-6.4.3-py3-none-any.whl", hash = "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", size = 10400, upload_time = "2025-04-10T22:20:16.445Z" }, +] + +[[package]] +name = "multiprocess" +version = "0.70.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/ae/04f39c5d0d0def03247c2893d6f2b83c136bf3320a2154d7b8858f2ba72d/multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1", size = 1772603, upload_time = "2024-01-28T18:52:34.85Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/f7/7ec7fddc92e50714ea3745631f79bd9c96424cb2702632521028e57d3a36/multiprocess-0.70.16-py310-none-any.whl", hash = "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02", size = 134824, upload_time = "2024-01-28T18:52:26.062Z" }, + { url = "https://files.pythonhosted.org/packages/50/15/b56e50e8debaf439f44befec5b2af11db85f6e0f344c3113ae0be0593a91/multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a", size = 143519, upload_time = "2024-01-28T18:52:28.115Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7d/a988f258104dcd2ccf1ed40fdc97e26c4ac351eeaf81d76e266c52d84e2f/multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e", size = 146741, upload_time = "2024-01-28T18:52:29.395Z" }, + { url = "https://files.pythonhosted.org/packages/ea/89/38df130f2c799090c978b366cfdf5b96d08de5b29a4a293df7f7429fa50b/multiprocess-0.70.16-py38-none-any.whl", hash = "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435", size = 132628, upload_time = "2024-01-28T18:52:30.853Z" }, + { url = "https://files.pythonhosted.org/packages/da/d9/f7f9379981e39b8c2511c9e0326d212accacb82f12fbfdc1aa2ce2a7b2b6/multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3", size = 133351, upload_time = "2024-01-28T18:52:31.981Z" }, +] + +[[package]] +name = "numpy" +version = "1.26.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129, upload_time = "2024-02-06T00:26:44.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554, upload_time = "2024-02-05T23:51:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127, upload_time = "2024-02-05T23:52:15.314Z" }, + { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994, upload_time = "2024-02-05T23:52:47.569Z" }, + { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005, upload_time = "2024-02-05T23:53:15.637Z" }, + { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297, upload_time = "2024-02-05T23:53:42.16Z" }, + { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567, upload_time = "2024-02-05T23:54:11.696Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812, upload_time = "2024-02-05T23:54:26.453Z" }, + { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913, upload_time = "2024-02-05T23:54:53.933Z" }, + { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901, upload_time = "2024-02-05T23:55:32.801Z" }, + { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868, upload_time = "2024-02-05T23:55:56.28Z" }, + { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109, upload_time = "2024-02-05T23:56:20.368Z" }, + { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613, upload_time = "2024-02-05T23:56:56.054Z" }, + { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172, upload_time = "2024-02-05T23:57:21.56Z" }, + { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643, upload_time = "2024-02-05T23:57:56.585Z" }, + { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803, upload_time = "2024-02-05T23:58:08.963Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload_time = "2024-02-05T23:58:36.364Z" }, +] + +[[package]] +name = "oauthlib" +version = "3.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/fa/fbf4001037904031639e6bfbfc02badfc7e12f137a8afa254df6c4c8a670/oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918", size = 177352, upload_time = "2022-10-17T20:04:27.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", size = 151688, upload_time = "2022-10-17T20:04:24.037Z" }, +] + +[[package]] +name = "openai" +version = "1.60.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/ae/8d9706b8ff2363287b4a8807de2dd29cdbdad5424e9d05d345df724320f5/openai-1.60.2.tar.gz", hash = "sha256:a8f843e10f2855713007f491d96afb2694b11b5e02cb97c7d01a0be60bc5bb51", size = 348185, upload_time = "2025-01-27T19:37:03.72Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/5a/d5474ca67a547dde9b87b5bc8a8f90eadf29f523d410f2ba23d63c9b82ec/openai-1.60.2-py3-none-any.whl", hash = "sha256:993bd11b96900b9098179c728026f016b4982ded7ee30dfcf4555eab1171fff9", size = 456107, upload_time = "2025-01-27T19:37:01.065Z" }, +] + +[[package]] +name = "opt-einsum" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/b9/2ac072041e899a52f20cf9510850ff58295003aa75525e58343591b0cbfb/opt_einsum-3.4.0.tar.gz", hash = "sha256:96ca72f1b886d148241348783498194c577fa30a8faac108586b14f1ba4473ac", size = 63004, upload_time = "2024-09-26T14:33:24.483Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl", hash = "sha256:69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd", size = 71932, upload_time = "2024-09-26T14:33:23.039Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload_time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload_time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "pandas" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213, upload_time = "2024-09-20T13:10:04.827Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222, upload_time = "2024-09-20T13:08:56.254Z" }, + { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274, upload_time = "2024-09-20T13:08:58.645Z" }, + { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836, upload_time = "2024-09-20T19:01:57.571Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505, upload_time = "2024-09-20T13:09:01.501Z" }, + { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420, upload_time = "2024-09-20T19:02:00.678Z" }, + { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457, upload_time = "2024-09-20T13:09:04.105Z" }, + { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166, upload_time = "2024-09-20T13:09:06.917Z" }, + { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893, upload_time = "2024-09-20T13:09:09.655Z" }, + { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475, upload_time = "2024-09-20T13:09:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645, upload_time = "2024-09-20T19:02:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445, upload_time = "2024-09-20T13:09:17.621Z" }, + { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235, upload_time = "2024-09-20T19:02:07.094Z" }, + { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756, upload_time = "2024-09-20T13:09:20.474Z" }, + { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248, upload_time = "2024-09-20T13:09:23.137Z" }, + { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643, upload_time = "2024-09-20T13:09:25.522Z" }, + { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573, upload_time = "2024-09-20T13:09:28.012Z" }, + { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085, upload_time = "2024-09-20T19:02:10.451Z" }, + { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809, upload_time = "2024-09-20T13:09:30.814Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316, upload_time = "2024-09-20T19:02:13.825Z" }, + { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055, upload_time = "2024-09-20T13:09:33.462Z" }, + { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175, upload_time = "2024-09-20T13:09:35.871Z" }, + { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650, upload_time = "2024-09-20T13:09:38.685Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177, upload_time = "2024-09-20T13:09:41.141Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526, upload_time = "2024-09-20T19:02:16.905Z" }, + { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013, upload_time = "2024-09-20T13:09:44.39Z" }, + { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620, upload_time = "2024-09-20T19:02:20.639Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436, upload_time = "2024-09-20T13:09:48.112Z" }, +] + +[[package]] +name = "playwright" +version = "1.49.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet" }, + { name = "pyee" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/be/01025581052e43eb698092c4328d7497ca62bcb5c83f15a611d4a71b4b92/playwright-1.49.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:1041ffb45a0d0bc44d698d3a5aa3ac4b67c9bd03540da43a0b70616ad52592b8", size = 39559859, upload_time = "2024-12-10T17:32:14.907Z" }, + { url = "https://files.pythonhosted.org/packages/79/25/ef1010a42cc7d576282015d983c5451d73e369b198b6eb32a177fae281f8/playwright-1.49.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9f38ed3d0c1f4e0a6d1c92e73dd9a61f8855133249d6f0cec28648d38a7137be", size = 38808973, upload_time = "2024-12-10T17:32:22.516Z" }, + { url = "https://files.pythonhosted.org/packages/70/4b/3930cf10f303a10d493a382e4448aaff898b4065698b3b8d92f902e53e08/playwright-1.49.1-py3-none-macosx_11_0_universal2.whl", hash = "sha256:3be48c6d26dc819ca0a26567c1ae36a980a0303dcd4249feb6f59e115aaddfb8", size = 39559863, upload_time = "2024-12-10T17:32:29.12Z" }, + { url = "https://files.pythonhosted.org/packages/9a/c1/ea765e72a746dc7ec2ce155ffea29d454e7171db78f3c09185e888387246/playwright-1.49.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:753ca90ee31b4b03d165cfd36e477309ebf2b4381953f2a982ff612d85b147d2", size = 44163300, upload_time = "2024-12-10T17:32:35.647Z" }, + { url = "https://files.pythonhosted.org/packages/5a/52/95efac704bf36b770a2522d88a6dee298042845d10bfb35f7ca0fcc36d91/playwright-1.49.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd9bc8dab37aa25198a01f555f0a2e2c3813fe200fef018ac34dfe86b34994b9", size = 43744353, upload_time = "2024-12-10T17:32:43.189Z" }, + { url = "https://files.pythonhosted.org/packages/f9/97/a3fccc9aaa6da83890772e9980703b0ea6b1e1ad42042fb50df3aef6c641/playwright-1.49.1-py3-none-win32.whl", hash = "sha256:43b304be67f096058e587dac453ece550eff87b8fbed28de30f4f022cc1745bb", size = 34060663, upload_time = "2024-12-10T17:32:49.904Z" }, + { url = "https://files.pythonhosted.org/packages/71/a9/bd88ac0bd498c91aab3aba2e393d1fa59f72a7243e9265ccbf4861ca4f64/playwright-1.49.1-py3-none-win_amd64.whl", hash = "sha256:47b23cb346283278f5b4d1e1990bcb6d6302f80c0aa0ca93dd0601a1400191df", size = 34060667, upload_time = "2024-12-10T17:32:56.459Z" }, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload_time = "2024-04-20T21:34:42.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload_time = "2024-04-20T21:34:40.434Z" }, +] + +[[package]] +name = "propcache" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/c8/fdc6686a986feae3541ea23dcaa661bd93972d3940460646c6bb96e21c40/propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", size = 43651, upload_time = "2025-03-26T03:06:12.05Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/0f/5a5319ee83bd651f75311fcb0c492c21322a7fc8f788e4eef23f44243427/propcache-0.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", size = 80243, upload_time = "2025-03-26T03:04:01.912Z" }, + { url = "https://files.pythonhosted.org/packages/ce/84/3db5537e0879942783e2256616ff15d870a11d7ac26541336fe1b673c818/propcache-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", size = 46503, upload_time = "2025-03-26T03:04:03.704Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c8/b649ed972433c3f0d827d7f0cf9ea47162f4ef8f4fe98c5f3641a0bc63ff/propcache-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", size = 45934, upload_time = "2025-03-26T03:04:05.257Z" }, + { url = "https://files.pythonhosted.org/packages/59/f9/4c0a5cf6974c2c43b1a6810c40d889769cc8f84cea676cbe1e62766a45f8/propcache-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", size = 233633, upload_time = "2025-03-26T03:04:07.044Z" }, + { url = "https://files.pythonhosted.org/packages/e7/64/66f2f4d1b4f0007c6e9078bd95b609b633d3957fe6dd23eac33ebde4b584/propcache-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", size = 241124, upload_time = "2025-03-26T03:04:08.676Z" }, + { url = "https://files.pythonhosted.org/packages/aa/bf/7b8c9fd097d511638fa9b6af3d986adbdf567598a567b46338c925144c1b/propcache-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", size = 240283, upload_time = "2025-03-26T03:04:10.172Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c9/e85aeeeaae83358e2a1ef32d6ff50a483a5d5248bc38510d030a6f4e2816/propcache-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", size = 232498, upload_time = "2025-03-26T03:04:11.616Z" }, + { url = "https://files.pythonhosted.org/packages/8e/66/acb88e1f30ef5536d785c283af2e62931cb934a56a3ecf39105887aa8905/propcache-0.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", size = 221486, upload_time = "2025-03-26T03:04:13.102Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f9/233ddb05ffdcaee4448508ee1d70aa7deff21bb41469ccdfcc339f871427/propcache-0.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", size = 222675, upload_time = "2025-03-26T03:04:14.658Z" }, + { url = "https://files.pythonhosted.org/packages/98/b8/eb977e28138f9e22a5a789daf608d36e05ed93093ef12a12441030da800a/propcache-0.3.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", size = 215727, upload_time = "2025-03-26T03:04:16.207Z" }, + { url = "https://files.pythonhosted.org/packages/89/2d/5f52d9c579f67b8ee1edd9ec073c91b23cc5b7ff7951a1e449e04ed8fdf3/propcache-0.3.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", size = 217878, upload_time = "2025-03-26T03:04:18.11Z" }, + { url = "https://files.pythonhosted.org/packages/7a/fd/5283e5ed8a82b00c7a989b99bb6ea173db1ad750bf0bf8dff08d3f4a4e28/propcache-0.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", size = 230558, upload_time = "2025-03-26T03:04:19.562Z" }, + { url = "https://files.pythonhosted.org/packages/90/38/ab17d75938ef7ac87332c588857422ae126b1c76253f0f5b1242032923ca/propcache-0.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", size = 233754, upload_time = "2025-03-26T03:04:21.065Z" }, + { url = "https://files.pythonhosted.org/packages/06/5d/3b921b9c60659ae464137508d3b4c2b3f52f592ceb1964aa2533b32fcf0b/propcache-0.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", size = 226088, upload_time = "2025-03-26T03:04:22.718Z" }, + { url = "https://files.pythonhosted.org/packages/54/6e/30a11f4417d9266b5a464ac5a8c5164ddc9dd153dfa77bf57918165eb4ae/propcache-0.3.1-cp311-cp311-win32.whl", hash = "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", size = 40859, upload_time = "2025-03-26T03:04:24.039Z" }, + { url = "https://files.pythonhosted.org/packages/1d/3a/8a68dd867da9ca2ee9dfd361093e9cb08cb0f37e5ddb2276f1b5177d7731/propcache-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", size = 45153, upload_time = "2025-03-26T03:04:25.211Z" }, + { url = "https://files.pythonhosted.org/packages/41/aa/ca78d9be314d1e15ff517b992bebbed3bdfef5b8919e85bf4940e57b6137/propcache-0.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", size = 80430, upload_time = "2025-03-26T03:04:26.436Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d8/f0c17c44d1cda0ad1979af2e593ea290defdde9eaeb89b08abbe02a5e8e1/propcache-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", size = 46637, upload_time = "2025-03-26T03:04:27.932Z" }, + { url = "https://files.pythonhosted.org/packages/ae/bd/c1e37265910752e6e5e8a4c1605d0129e5b7933c3dc3cf1b9b48ed83b364/propcache-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", size = 46123, upload_time = "2025-03-26T03:04:30.659Z" }, + { url = "https://files.pythonhosted.org/packages/d4/b0/911eda0865f90c0c7e9f0415d40a5bf681204da5fd7ca089361a64c16b28/propcache-0.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", size = 243031, upload_time = "2025-03-26T03:04:31.977Z" }, + { url = "https://files.pythonhosted.org/packages/0a/06/0da53397c76a74271621807265b6eb61fb011451b1ddebf43213df763669/propcache-0.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", size = 249100, upload_time = "2025-03-26T03:04:33.45Z" }, + { url = "https://files.pythonhosted.org/packages/f1/eb/13090e05bf6b963fc1653cdc922133ced467cb4b8dab53158db5a37aa21e/propcache-0.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", size = 250170, upload_time = "2025-03-26T03:04:35.542Z" }, + { url = "https://files.pythonhosted.org/packages/3b/4c/f72c9e1022b3b043ec7dc475a0f405d4c3e10b9b1d378a7330fecf0652da/propcache-0.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", size = 245000, upload_time = "2025-03-26T03:04:37.501Z" }, + { url = "https://files.pythonhosted.org/packages/e8/fd/970ca0e22acc829f1adf5de3724085e778c1ad8a75bec010049502cb3a86/propcache-0.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", size = 230262, upload_time = "2025-03-26T03:04:39.532Z" }, + { url = "https://files.pythonhosted.org/packages/c4/42/817289120c6b9194a44f6c3e6b2c3277c5b70bbad39e7df648f177cc3634/propcache-0.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", size = 236772, upload_time = "2025-03-26T03:04:41.109Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9c/3b3942b302badd589ad6b672da3ca7b660a6c2f505cafd058133ddc73918/propcache-0.3.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", size = 231133, upload_time = "2025-03-26T03:04:42.544Z" }, + { url = "https://files.pythonhosted.org/packages/98/a1/75f6355f9ad039108ff000dfc2e19962c8dea0430da9a1428e7975cf24b2/propcache-0.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", size = 230741, upload_time = "2025-03-26T03:04:44.06Z" }, + { url = "https://files.pythonhosted.org/packages/67/0c/3e82563af77d1f8731132166da69fdfd95e71210e31f18edce08a1eb11ea/propcache-0.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", size = 244047, upload_time = "2025-03-26T03:04:45.983Z" }, + { url = "https://files.pythonhosted.org/packages/f7/50/9fb7cca01532a08c4d5186d7bb2da6c4c587825c0ae134b89b47c7d62628/propcache-0.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5", size = 246467, upload_time = "2025-03-26T03:04:47.699Z" }, + { url = "https://files.pythonhosted.org/packages/a9/02/ccbcf3e1c604c16cc525309161d57412c23cf2351523aedbb280eb7c9094/propcache-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", size = 241022, upload_time = "2025-03-26T03:04:49.195Z" }, + { url = "https://files.pythonhosted.org/packages/db/19/e777227545e09ca1e77a6e21274ae9ec45de0f589f0ce3eca2a41f366220/propcache-0.3.1-cp312-cp312-win32.whl", hash = "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", size = 40647, upload_time = "2025-03-26T03:04:50.595Z" }, + { url = "https://files.pythonhosted.org/packages/24/bb/3b1b01da5dd04c77a204c84e538ff11f624e31431cfde7201d9110b092b1/propcache-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", size = 44784, upload_time = "2025-03-26T03:04:51.791Z" }, + { url = "https://files.pythonhosted.org/packages/58/60/f645cc8b570f99be3cf46714170c2de4b4c9d6b827b912811eff1eb8a412/propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", size = 77865, upload_time = "2025-03-26T03:04:53.406Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d4/c1adbf3901537582e65cf90fd9c26fde1298fde5a2c593f987112c0d0798/propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", size = 45452, upload_time = "2025-03-26T03:04:54.624Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b5/fe752b2e63f49f727c6c1c224175d21b7d1727ce1d4873ef1c24c9216830/propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", size = 44800, upload_time = "2025-03-26T03:04:55.844Z" }, + { url = "https://files.pythonhosted.org/packages/62/37/fc357e345bc1971e21f76597028b059c3d795c5ca7690d7a8d9a03c9708a/propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", size = 225804, upload_time = "2025-03-26T03:04:57.158Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f1/16e12c33e3dbe7f8b737809bad05719cff1dccb8df4dafbcff5575002c0e/propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", size = 230650, upload_time = "2025-03-26T03:04:58.61Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a2/018b9f2ed876bf5091e60153f727e8f9073d97573f790ff7cdf6bc1d1fb8/propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", size = 234235, upload_time = "2025-03-26T03:05:00.599Z" }, + { url = "https://files.pythonhosted.org/packages/45/5f/3faee66fc930dfb5da509e34c6ac7128870631c0e3582987fad161fcb4b1/propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", size = 228249, upload_time = "2025-03-26T03:05:02.11Z" }, + { url = "https://files.pythonhosted.org/packages/62/1e/a0d5ebda5da7ff34d2f5259a3e171a94be83c41eb1e7cd21a2105a84a02e/propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", size = 214964, upload_time = "2025-03-26T03:05:03.599Z" }, + { url = "https://files.pythonhosted.org/packages/db/a0/d72da3f61ceab126e9be1f3bc7844b4e98c6e61c985097474668e7e52152/propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", size = 222501, upload_time = "2025-03-26T03:05:05.107Z" }, + { url = "https://files.pythonhosted.org/packages/18/6d/a008e07ad7b905011253adbbd97e5b5375c33f0b961355ca0a30377504ac/propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", size = 217917, upload_time = "2025-03-26T03:05:06.59Z" }, + { url = "https://files.pythonhosted.org/packages/98/37/02c9343ffe59e590e0e56dc5c97d0da2b8b19fa747ebacf158310f97a79a/propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", size = 217089, upload_time = "2025-03-26T03:05:08.1Z" }, + { url = "https://files.pythonhosted.org/packages/53/1b/d3406629a2c8a5666d4674c50f757a77be119b113eedd47b0375afdf1b42/propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", size = 228102, upload_time = "2025-03-26T03:05:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/cd/a7/3664756cf50ce739e5f3abd48febc0be1a713b1f389a502ca819791a6b69/propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", size = 230122, upload_time = "2025-03-26T03:05:11.408Z" }, + { url = "https://files.pythonhosted.org/packages/35/36/0bbabaacdcc26dac4f8139625e930f4311864251276033a52fd52ff2a274/propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", size = 226818, upload_time = "2025-03-26T03:05:12.909Z" }, + { url = "https://files.pythonhosted.org/packages/cc/27/4e0ef21084b53bd35d4dae1634b6d0bad35e9c58ed4f032511acca9d4d26/propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", size = 40112, upload_time = "2025-03-26T03:05:14.289Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", size = 44034, upload_time = "2025-03-26T03:05:15.616Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a8/0a4fd2f664fc6acc66438370905124ce62e84e2e860f2557015ee4a61c7e/propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", size = 82613, upload_time = "2025-03-26T03:05:16.913Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e5/5ef30eb2cd81576256d7b6caaa0ce33cd1d2c2c92c8903cccb1af1a4ff2f/propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", size = 47763, upload_time = "2025-03-26T03:05:18.607Z" }, + { url = "https://files.pythonhosted.org/packages/87/9a/87091ceb048efeba4d28e903c0b15bcc84b7c0bf27dc0261e62335d9b7b8/propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", size = 47175, upload_time = "2025-03-26T03:05:19.85Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2f/854e653c96ad1161f96194c6678a41bbb38c7947d17768e8811a77635a08/propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", size = 292265, upload_time = "2025-03-26T03:05:21.654Z" }, + { url = "https://files.pythonhosted.org/packages/40/8d/090955e13ed06bc3496ba4a9fb26c62e209ac41973cb0d6222de20c6868f/propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", size = 294412, upload_time = "2025-03-26T03:05:23.147Z" }, + { url = "https://files.pythonhosted.org/packages/39/e6/d51601342e53cc7582449e6a3c14a0479fab2f0750c1f4d22302e34219c6/propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", size = 294290, upload_time = "2025-03-26T03:05:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/3b/4d/be5f1a90abc1881884aa5878989a1acdafd379a91d9c7e5e12cef37ec0d7/propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", size = 282926, upload_time = "2025-03-26T03:05:26.459Z" }, + { url = "https://files.pythonhosted.org/packages/57/2b/8f61b998c7ea93a2b7eca79e53f3e903db1787fca9373af9e2cf8dc22f9d/propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", size = 267808, upload_time = "2025-03-26T03:05:28.188Z" }, + { url = "https://files.pythonhosted.org/packages/11/1c/311326c3dfce59c58a6098388ba984b0e5fb0381ef2279ec458ef99bd547/propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", size = 290916, upload_time = "2025-03-26T03:05:29.757Z" }, + { url = "https://files.pythonhosted.org/packages/4b/74/91939924b0385e54dc48eb2e4edd1e4903ffd053cf1916ebc5347ac227f7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", size = 262661, upload_time = "2025-03-26T03:05:31.472Z" }, + { url = "https://files.pythonhosted.org/packages/c2/d7/e6079af45136ad325c5337f5dd9ef97ab5dc349e0ff362fe5c5db95e2454/propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", size = 264384, upload_time = "2025-03-26T03:05:32.984Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d5/ba91702207ac61ae6f1c2da81c5d0d6bf6ce89e08a2b4d44e411c0bbe867/propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", size = 291420, upload_time = "2025-03-26T03:05:34.496Z" }, + { url = "https://files.pythonhosted.org/packages/58/70/2117780ed7edcd7ba6b8134cb7802aada90b894a9810ec56b7bb6018bee7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", size = 290880, upload_time = "2025-03-26T03:05:36.256Z" }, + { url = "https://files.pythonhosted.org/packages/4a/1f/ecd9ce27710021ae623631c0146719280a929d895a095f6d85efb6a0be2e/propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", size = 287407, upload_time = "2025-03-26T03:05:37.799Z" }, + { url = "https://files.pythonhosted.org/packages/3e/66/2e90547d6b60180fb29e23dc87bd8c116517d4255240ec6d3f7dc23d1926/propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", size = 42573, upload_time = "2025-03-26T03:05:39.193Z" }, + { url = "https://files.pythonhosted.org/packages/cb/8f/50ad8599399d1861b4d2b6b45271f0ef6af1b09b0a2386a46dbaf19c9535/propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", size = 46757, upload_time = "2025-03-26T03:05:40.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376, upload_time = "2025-03-26T03:06:10.5Z" }, +] + +[[package]] +name = "proto-plus" +version = "1.26.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/ac/87285f15f7cce6d4a008f33f1757fb5a13611ea8914eb58c3d0d26243468/proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012", size = 56142, upload_time = "2025-03-10T15:54:38.843Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/6d/280c4c2ce28b1593a19ad5239c8b826871fc6ec275c21afc8e1820108039/proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", size = 50163, upload_time = "2025-03-10T15:54:37.335Z" }, +] + +[[package]] +name = "protobuf" +version = "4.25.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/74/63/84fdeac1f03864c2b8b9f0b7fe711c4af5f95759ee281d2026530086b2f5/protobuf-4.25.7.tar.gz", hash = "sha256:28f65ae8c14523cc2c76c1e91680958700d3eac69f45c96512c12c63d9a38807", size = 380612, upload_time = "2025-04-24T02:56:58.685Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/ed/9a58076cfb8edc237c92617f1d3744660e9b4457d54f3c2fdf1a4bbae5c7/protobuf-4.25.7-cp310-abi3-win32.whl", hash = "sha256:dc582cf1a73a6b40aa8e7704389b8d8352da616bc8ed5c6cc614bdd0b5ce3f7a", size = 392457, upload_time = "2025-04-24T02:56:40.798Z" }, + { url = "https://files.pythonhosted.org/packages/28/b3/e00870528029fe252cf3bd6fa535821c276db3753b44a4691aee0d52ff9e/protobuf-4.25.7-cp310-abi3-win_amd64.whl", hash = "sha256:cd873dbddb28460d1706ff4da2e7fac175f62f2a0bebc7b33141f7523c5a2399", size = 413446, upload_time = "2025-04-24T02:56:44.199Z" }, + { url = "https://files.pythonhosted.org/packages/60/1d/f450a193f875a20099d4492d2c1cb23091d65d512956fb1e167ee61b4bf0/protobuf-4.25.7-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:4c899f09b0502eb39174c717ccf005b844ea93e31137c167ddcacf3e09e49610", size = 394248, upload_time = "2025-04-24T02:56:45.75Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b8/ea88e9857484a0618c74121618b9e620fc50042de43cdabbebe1b93a83e0/protobuf-4.25.7-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:6d2f5dede3d112e573f0e5f9778c0c19d9f9e209727abecae1d39db789f522c6", size = 293717, upload_time = "2025-04-24T02:56:47.427Z" }, + { url = "https://files.pythonhosted.org/packages/a7/81/d0b68e9a9a76804113b6dedc6fffed868b97048bbe6f1bedc675bdb8523c/protobuf-4.25.7-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:d41fb7ae72a25fcb79b2d71e4247f0547a02e8185ed51587c22827a87e5736ed", size = 294636, upload_time = "2025-04-24T02:56:48.976Z" }, + { url = "https://files.pythonhosted.org/packages/17/d7/1e7c80cb2ea2880cfe38580dcfbb22b78b746640c9c13fc3337a6967dc4c/protobuf-4.25.7-py3-none-any.whl", hash = "sha256:e9d969f5154eaeab41404def5dcf04e62162178f4b9de98b2d3c1c70f5f84810", size = 156468, upload_time = "2025-04-24T02:56:56.957Z" }, +] + +[[package]] +name = "psycopg" +version = "3.1.20" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/6d/0939210f3ba089b360cf0d3741494719152567bc81303cca2c0f1e67c78a/psycopg-3.1.20.tar.gz", hash = "sha256:32f5862ab79f238496236f97fe374a7ab55b4b4bb839a74802026544735f9a07", size = 147567, upload_time = "2024-06-30T17:03:55.421Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/e9/126bbfd5dded758bb109526c5f5f2c2538fe293b15b6fa208db7078c72c4/psycopg-3.1.20-py3-none-any.whl", hash = "sha256:898a29f49ac9c903d554f5a6cdc44a8fc564325557c18f82e51f39c1f4fc2aeb", size = 179473, upload_time = "2024-06-30T16:57:04.093Z" }, +] + +[package.optional-dependencies] +binary = [ + { name = "psycopg-binary", marker = "implementation_name != 'pypy'" }, +] + +[[package]] +name = "psycopg-binary" +version = "3.1.20" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/1c/45e5f240765e80076b08c3ed02c5dfeb5e97d549769b81f8382485d70a15/psycopg_binary-3.1.20-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:802989350fcbc783732bfef660afb34439a62727642a05e8bb9acf7d68993627", size = 3350503, upload_time = "2024-06-30T16:58:27.18Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/acf96d388692d0bbf2346286f8b175778bc24046aca9181f50d9df9f4714/psycopg_binary-3.1.20-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:01b0e39128715fc37fed6cdc50ab58278eacb75709af503eb607654030975f09", size = 3480091, upload_time = "2024-06-30T16:58:33.872Z" }, + { url = "https://files.pythonhosted.org/packages/41/d4/20604282ff08823d0e90cf092738ea21b339f56a172d8583565b272fc4be/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77af1086bedfa0729465565c636de3519079ba523d7b7ee6e8b9486beb1ee905", size = 4434555, upload_time = "2024-06-30T16:58:40.795Z" }, + { url = "https://files.pythonhosted.org/packages/73/e0/3917b766508bb749e08225492d45ba7463b559de1c8a41d3f8f3cf0927cb/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9b9562395d441e225f354e8c6303ee6993a93aaeb0dbb5b94368f3249ab2388", size = 4231402, upload_time = "2024-06-30T16:58:48.586Z" }, + { url = "https://files.pythonhosted.org/packages/b4/9b/251435896f7459beda355ef3e3919b6b20d067582cd6838ba248d3cff188/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e814d69e5447a93e7b98117ec95a8ce606d3742092fd120960551ed67c376fea", size = 4484218, upload_time = "2024-06-30T16:58:56.911Z" }, + { url = "https://files.pythonhosted.org/packages/a1/12/b2057f9bb8b5f408139266a5b48bfd7578340296d7314d964b9f09e5b18f/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf1c2061600235ae9b11d7ad357cab89ac583a76bdb0199f7a29ac947939c20", size = 4176668, upload_time = "2024-06-30T16:59:02.496Z" }, + { url = "https://files.pythonhosted.org/packages/80/9c/a62fe4167427a06e69882d274ba90903507afc89caf6bcc3671790a20875/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:50f1d807b4167f973a6f67bca39bf656b737f7426be158a1dc9cb0000d020744", size = 3102502, upload_time = "2024-06-30T16:59:07.216Z" }, + { url = "https://files.pythonhosted.org/packages/98/83/bceca23dd830d4069949e70dec9feb03c114cc551b104f0e2b48b1e598c6/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4cf6ec1490232a5b208dae94a8269dc739e6762684c8658a0f3570402db934ae", size = 3080005, upload_time = "2024-06-30T16:59:14.927Z" }, + { url = "https://files.pythonhosted.org/packages/fc/83/bab7c8495e0eb11bf710663afb2849c2d3c91a2bf61b2bd597941f57f80b/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:309c09ec50a9c5c8492c2922ee666df1e30a08b08a9b63083d0daa414eccd09c", size = 3182315, upload_time = "2024-06-30T16:59:21.18Z" }, + { url = "https://files.pythonhosted.org/packages/ca/9b/bd4970faed24ae4a850ee8c6ebd621e98fd86e2962e13038603a726e2504/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e2c33a01799f93ef8c11a023df66280e39ca3c3249a2581adb2a0e5e80801088", size = 3222552, upload_time = "2024-06-30T16:59:27.663Z" }, + { url = "https://files.pythonhosted.org/packages/5d/0b/7ab0744f282df53968f5066d5fd8bf3f994f90bf2a8003ab40278818d0f2/psycopg_binary-3.1.20-cp311-cp311-win_amd64.whl", hash = "sha256:2c67532057fda72579b02d9d61e9cc8975982844bd5c3c9dc7f84ce8bcac859c", size = 2899115, upload_time = "2024-06-30T16:59:35.512Z" }, + { url = "https://files.pythonhosted.org/packages/94/12/6e909d3a20f7bfa6915c1fdf64ab47bb9ca44b837adb468841aad51bab6c/psycopg_binary-3.1.20-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ef08de60f1b8503a6f6b6f5bee612de36373c09bc0e3f84409fab09e1ff72107", size = 3326944, upload_time = "2024-06-30T16:59:41.783Z" }, + { url = "https://files.pythonhosted.org/packages/e1/4e/dc425f5c8c102045486f2fa39c3cb379b073557d6bd2cf5d06de81036d7c/psycopg_binary-3.1.20-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a4847fa31c8d3a6dd3536cf1e130dfcc454ed26be471ef274e4358bf7f709cda", size = 3475444, upload_time = "2024-06-30T16:59:48.547Z" }, + { url = "https://files.pythonhosted.org/packages/cd/cd/6484cbdb82dc29bfe43ae8c401a0be309402c304d1aaabcccf1e21908663/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b72e9c8c79dcc30e34e996079cfe0374b7c7233d2b5f6f25a0bc8872fe2babef", size = 4412872, upload_time = "2024-06-30T16:59:54.853Z" }, + { url = "https://files.pythonhosted.org/packages/25/d3/d403dc61f9d8b56683a6a1db47ab156807d2e1c442b044fba5763e786893/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836246f3c486ef7edfce6cf6cc760173e244826ebecd54c1b63c91d4cc0341f7", size = 4216654, upload_time = "2024-06-30T16:59:58.935Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ff/389198638ad10ec0e80fcc97b5c8092987214d9ac529b1224bf0f7e221da/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:015f70b17539ec0ecfb0f87bcaface0c7fa1289b6e7e2313dc7cdfdc513e3235", size = 4451310, upload_time = "2024-06-30T17:00:05.647Z" }, + { url = "https://files.pythonhosted.org/packages/84/94/9ae70af00caf9ce98f857a883ff64c5d236dfea5b7b4b8528d28e80515aa/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f52498dc7b41fee74e971823ede4519e3a9597d416f7a2044dbe4b98cc61ff35", size = 4153667, upload_time = "2024-06-30T17:00:12.309Z" }, + { url = "https://files.pythonhosted.org/packages/b8/57/b8a34174803683ef0f3f2fe18304f7048d31bab431f21cf511598b894ed7/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:92b61bae0ac881580faa1c89bf2167db7041cb01cc0bd686244f9c20a010036a", size = 3081906, upload_time = "2024-06-30T17:00:17.223Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e7/5df8c4794f13004787cd7ddfe456eec90f49d1b99f1a10947f7ba2a67487/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3532b8677666aadb64a4e31f6e97fe4ab71b862ab100d337faf497198339fd4d", size = 3061376, upload_time = "2024-06-30T17:00:22.232Z" }, + { url = "https://files.pythonhosted.org/packages/8e/c6/ec4abb814f54af4b659896ce10386be0c538dad8111b3daeaf672b4daa03/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f7df27f50a7db84c28e58be3df41f39618161096c3379ad68bc665a454c53e93", size = 3150174, upload_time = "2024-06-30T17:00:26.982Z" }, + { url = "https://files.pythonhosted.org/packages/0c/50/7b4382e5f5d256ac720ee0bd6470c7aa7d28f78570bd44d5e0b1c29eeb96/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:12b33c511f0be79d5a68231a10972ef9c68d954d30d176679472057ecc22891a", size = 3198871, upload_time = "2024-06-30T17:00:32.17Z" }, + { url = "https://files.pythonhosted.org/packages/76/2f/eda1b86c01d2803ac05714b94283af1e5012437dcc63dfe0679cc4d445ad/psycopg_binary-3.1.20-cp312-cp312-win_amd64.whl", hash = "sha256:6f3c0b05fc3cbd4d99aaacf5c7afa13b086df5777b9fefb78d31bf81fc70bd04", size = 2884414, upload_time = "2024-06-30T17:00:40.26Z" }, +] + +[[package]] +name = "psycopg2-binary" +version = "2.9.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/0e/bdc8274dc0585090b4e3432267d7be4dfbfd8971c0fa59167c711105a6bf/psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2", size = 385764, upload_time = "2024-10-16T11:24:58.126Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/8f/9feb01291d0d7a0a4c6a6bab24094135c2b59c6a81943752f632c75896d6/psycopg2_binary-2.9.10-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff", size = 3043397, upload_time = "2024-10-16T11:19:40.033Z" }, + { url = "https://files.pythonhosted.org/packages/15/30/346e4683532011561cd9c8dfeac6a8153dd96452fee0b12666058ab7893c/psycopg2_binary-2.9.10-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1a6784f0ce3fec4edc64e985865c17778514325074adf5ad8f80636cd029ef7c", size = 3274806, upload_time = "2024-10-16T11:19:43.5Z" }, + { url = "https://files.pythonhosted.org/packages/66/6e/4efebe76f76aee7ec99166b6c023ff8abdc4e183f7b70913d7c047701b79/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f86c56eeb91dc3135b3fd8a95dc7ae14c538a2f3ad77a19645cf55bab1799c", size = 2851370, upload_time = "2024-10-16T11:19:46.986Z" }, + { url = "https://files.pythonhosted.org/packages/7f/fd/ff83313f86b50f7ca089b161b8e0a22bb3c319974096093cd50680433fdb/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b3d2491d4d78b6b14f76881905c7a8a8abcf974aad4a8a0b065273a0ed7a2cb", size = 3080780, upload_time = "2024-10-16T11:19:50.242Z" }, + { url = "https://files.pythonhosted.org/packages/e6/c4/bfadd202dcda8333a7ccafdc51c541dbdfce7c2c7cda89fa2374455d795f/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2286791ececda3a723d1910441c793be44625d86d1a4e79942751197f4d30341", size = 3264583, upload_time = "2024-10-16T11:19:54.424Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f1/09f45ac25e704ac954862581f9f9ae21303cc5ded3d0b775532b407f0e90/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:512d29bb12608891e349af6a0cccedce51677725a921c07dba6342beaf576f9a", size = 3019831, upload_time = "2024-10-16T11:19:57.762Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2e/9beaea078095cc558f215e38f647c7114987d9febfc25cb2beed7c3582a5/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5a507320c58903967ef7384355a4da7ff3f28132d679aeb23572753cbf2ec10b", size = 2871822, upload_time = "2024-10-16T11:20:04.693Z" }, + { url = "https://files.pythonhosted.org/packages/01/9e/ef93c5d93f3dc9fc92786ffab39e323b9aed066ba59fdc34cf85e2722271/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d4fa1079cab9018f4d0bd2db307beaa612b0d13ba73b5c6304b9fe2fb441ff7", size = 2820975, upload_time = "2024-10-16T11:20:11.401Z" }, + { url = "https://files.pythonhosted.org/packages/a5/f0/049e9631e3268fe4c5a387f6fc27e267ebe199acf1bc1bc9cbde4bd6916c/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:851485a42dbb0bdc1edcdabdb8557c09c9655dfa2ca0460ff210522e073e319e", size = 2919320, upload_time = "2024-10-16T11:20:17.959Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9a/bcb8773b88e45fb5a5ea8339e2104d82c863a3b8558fbb2aadfe66df86b3/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:35958ec9e46432d9076286dda67942ed6d968b9c3a6a2fd62b48939d1d78bf68", size = 2957617, upload_time = "2024-10-16T11:20:24.711Z" }, + { url = "https://files.pythonhosted.org/packages/e2/6b/144336a9bf08a67d217b3af3246abb1d027095dab726f0687f01f43e8c03/psycopg2_binary-2.9.10-cp311-cp311-win32.whl", hash = "sha256:ecced182e935529727401b24d76634a357c71c9275b356efafd8a2a91ec07392", size = 1024618, upload_time = "2024-10-16T11:20:27.718Z" }, + { url = "https://files.pythonhosted.org/packages/61/69/3b3d7bd583c6d3cbe5100802efa5beacaacc86e37b653fc708bf3d6853b8/psycopg2_binary-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:ee0e8c683a7ff25d23b55b11161c2663d4b099770f6085ff0a20d4505778d6b4", size = 1163816, upload_time = "2024-10-16T11:20:30.777Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/465cc9795cf76f6d329efdafca74693714556ea3891813701ac1fee87545/psycopg2_binary-2.9.10-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0", size = 3044771, upload_time = "2024-10-16T11:20:35.234Z" }, + { url = "https://files.pythonhosted.org/packages/8b/31/6d225b7b641a1a2148e3ed65e1aa74fc86ba3fee850545e27be9e1de893d/psycopg2_binary-2.9.10-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a", size = 3275336, upload_time = "2024-10-16T11:20:38.742Z" }, + { url = "https://files.pythonhosted.org/packages/30/b7/a68c2b4bff1cbb1728e3ec864b2d92327c77ad52edcd27922535a8366f68/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539", size = 2851637, upload_time = "2024-10-16T11:20:42.145Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b1/cfedc0e0e6f9ad61f8657fd173b2f831ce261c02a08c0b09c652b127d813/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526", size = 3082097, upload_time = "2024-10-16T11:20:46.185Z" }, + { url = "https://files.pythonhosted.org/packages/18/ed/0a8e4153c9b769f59c02fb5e7914f20f0b2483a19dae7bf2db54b743d0d0/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1", size = 3264776, upload_time = "2024-10-16T11:20:50.879Z" }, + { url = "https://files.pythonhosted.org/packages/10/db/d09da68c6a0cdab41566b74e0a6068a425f077169bed0946559b7348ebe9/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e", size = 3020968, upload_time = "2024-10-16T11:20:56.819Z" }, + { url = "https://files.pythonhosted.org/packages/94/28/4d6f8c255f0dfffb410db2b3f9ac5218d959a66c715c34cac31081e19b95/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f", size = 2872334, upload_time = "2024-10-16T11:21:02.411Z" }, + { url = "https://files.pythonhosted.org/packages/05/f7/20d7bf796593c4fea95e12119d6cc384ff1f6141a24fbb7df5a668d29d29/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00", size = 2822722, upload_time = "2024-10-16T11:21:09.01Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e4/0c407ae919ef626dbdb32835a03b6737013c3cc7240169843965cada2bdf/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5", size = 2920132, upload_time = "2024-10-16T11:21:16.339Z" }, + { url = "https://files.pythonhosted.org/packages/2d/70/aa69c9f69cf09a01da224909ff6ce8b68faeef476f00f7ec377e8f03be70/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47", size = 2959312, upload_time = "2024-10-16T11:21:25.584Z" }, + { url = "https://files.pythonhosted.org/packages/d3/bd/213e59854fafe87ba47814bf413ace0dcee33a89c8c8c814faca6bc7cf3c/psycopg2_binary-2.9.10-cp312-cp312-win32.whl", hash = "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64", size = 1025191, upload_time = "2024-10-16T11:21:29.912Z" }, + { url = "https://files.pythonhosted.org/packages/92/29/06261ea000e2dc1e22907dbbc483a1093665509ea586b29b8986a0e56733/psycopg2_binary-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0", size = 1164031, upload_time = "2024-10-16T11:21:34.211Z" }, + { url = "https://files.pythonhosted.org/packages/3e/30/d41d3ba765609c0763505d565c4d12d8f3c79793f0d0f044ff5a28bf395b/psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d", size = 3044699, upload_time = "2024-10-16T11:21:42.841Z" }, + { url = "https://files.pythonhosted.org/packages/35/44/257ddadec7ef04536ba71af6bc6a75ec05c5343004a7ec93006bee66c0bc/psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb", size = 3275245, upload_time = "2024-10-16T11:21:51.989Z" }, + { url = "https://files.pythonhosted.org/packages/1b/11/48ea1cd11de67f9efd7262085588790a95d9dfcd9b8a687d46caf7305c1a/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7", size = 2851631, upload_time = "2024-10-16T11:21:57.584Z" }, + { url = "https://files.pythonhosted.org/packages/62/e0/62ce5ee650e6c86719d621a761fe4bc846ab9eff8c1f12b1ed5741bf1c9b/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d", size = 3082140, upload_time = "2024-10-16T11:22:02.005Z" }, + { url = "https://files.pythonhosted.org/packages/27/ce/63f946c098611f7be234c0dd7cb1ad68b0b5744d34f68062bb3c5aa510c8/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73", size = 3264762, upload_time = "2024-10-16T11:22:06.412Z" }, + { url = "https://files.pythonhosted.org/packages/43/25/c603cd81402e69edf7daa59b1602bd41eb9859e2824b8c0855d748366ac9/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673", size = 3020967, upload_time = "2024-10-16T11:22:11.583Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d6/8708d8c6fca531057fa170cdde8df870e8b6a9b136e82b361c65e42b841e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f", size = 2872326, upload_time = "2024-10-16T11:22:16.406Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ac/5b1ea50fc08a9df82de7e1771537557f07c2632231bbab652c7e22597908/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909", size = 2822712, upload_time = "2024-10-16T11:22:21.366Z" }, + { url = "https://files.pythonhosted.org/packages/c4/fc/504d4503b2abc4570fac3ca56eb8fed5e437bf9c9ef13f36b6621db8ef00/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1", size = 2920155, upload_time = "2024-10-16T11:22:25.684Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d1/323581e9273ad2c0dbd1902f3fb50c441da86e894b6e25a73c3fda32c57e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567", size = 2959356, upload_time = "2024-10-16T11:22:30.562Z" }, + { url = "https://files.pythonhosted.org/packages/08/50/d13ea0a054189ae1bc21af1d85b6f8bb9bbc5572991055d70ad9006fe2d6/psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142", size = 2569224, upload_time = "2025-01-04T20:09:19.234Z" }, +] + +[[package]] +name = "pyarrow" +version = "20.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187, upload_time = "2025-04-27T12:34:23.264Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/a2/b7930824181ceadd0c63c1042d01fa4ef63eee233934826a7a2a9af6e463/pyarrow-20.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:24ca380585444cb2a31324c546a9a56abbe87e26069189e14bdba19c86c049f0", size = 30856035, upload_time = "2025-04-27T12:28:40.78Z" }, + { url = "https://files.pythonhosted.org/packages/9b/18/c765770227d7f5bdfa8a69f64b49194352325c66a5c3bb5e332dfd5867d9/pyarrow-20.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:95b330059ddfdc591a3225f2d272123be26c8fa76e8c9ee1a77aad507361cfdb", size = 32309552, upload_time = "2025-04-27T12:28:47.051Z" }, + { url = "https://files.pythonhosted.org/packages/44/fb/dfb2dfdd3e488bb14f822d7335653092dde150cffc2da97de6e7500681f9/pyarrow-20.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f0fb1041267e9968c6d0d2ce3ff92e3928b243e2b6d11eeb84d9ac547308232", size = 41334704, upload_time = "2025-04-27T12:28:55.064Z" }, + { url = "https://files.pythonhosted.org/packages/58/0d/08a95878d38808051a953e887332d4a76bc06c6ee04351918ee1155407eb/pyarrow-20.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8ff87cc837601532cc8242d2f7e09b4e02404de1b797aee747dd4ba4bd6313f", size = 42399836, upload_time = "2025-04-27T12:29:02.13Z" }, + { url = "https://files.pythonhosted.org/packages/f3/cd/efa271234dfe38f0271561086eedcad7bc0f2ddd1efba423916ff0883684/pyarrow-20.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:7a3a5dcf54286e6141d5114522cf31dd67a9e7c9133d150799f30ee302a7a1ab", size = 40711789, upload_time = "2025-04-27T12:29:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/46/1f/7f02009bc7fc8955c391defee5348f510e589a020e4b40ca05edcb847854/pyarrow-20.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a6ad3e7758ecf559900261a4df985662df54fb7fdb55e8e3b3aa99b23d526b62", size = 42301124, upload_time = "2025-04-27T12:29:17.187Z" }, + { url = "https://files.pythonhosted.org/packages/4f/92/692c562be4504c262089e86757a9048739fe1acb4024f92d39615e7bab3f/pyarrow-20.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6bb830757103a6cb300a04610e08d9636f0cd223d32f388418ea893a3e655f1c", size = 42916060, upload_time = "2025-04-27T12:29:24.253Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ec/9f5c7e7c828d8e0a3c7ef50ee62eca38a7de2fa6eb1b8fa43685c9414fef/pyarrow-20.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:96e37f0766ecb4514a899d9a3554fadda770fb57ddf42b63d80f14bc20aa7db3", size = 44547640, upload_time = "2025-04-27T12:29:32.782Z" }, + { url = "https://files.pythonhosted.org/packages/54/96/46613131b4727f10fd2ffa6d0d6f02efcc09a0e7374eff3b5771548aa95b/pyarrow-20.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3346babb516f4b6fd790da99b98bed9708e3f02e734c84971faccb20736848dc", size = 25781491, upload_time = "2025-04-27T12:29:38.464Z" }, + { url = "https://files.pythonhosted.org/packages/a1/d6/0c10e0d54f6c13eb464ee9b67a68b8c71bcf2f67760ef5b6fbcddd2ab05f/pyarrow-20.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:75a51a5b0eef32727a247707d4755322cb970be7e935172b6a3a9f9ae98404ba", size = 30815067, upload_time = "2025-04-27T12:29:44.384Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e2/04e9874abe4094a06fd8b0cbb0f1312d8dd7d707f144c2ec1e5e8f452ffa/pyarrow-20.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:211d5e84cecc640c7a3ab900f930aaff5cd2702177e0d562d426fb7c4f737781", size = 32297128, upload_time = "2025-04-27T12:29:52.038Z" }, + { url = "https://files.pythonhosted.org/packages/31/fd/c565e5dcc906a3b471a83273039cb75cb79aad4a2d4a12f76cc5ae90a4b8/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba3cf4182828be7a896cbd232aa8dd6a31bd1f9e32776cc3796c012855e1199", size = 41334890, upload_time = "2025-04-27T12:29:59.452Z" }, + { url = "https://files.pythonhosted.org/packages/af/a9/3bdd799e2c9b20c1ea6dc6fa8e83f29480a97711cf806e823f808c2316ac/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c3a01f313ffe27ac4126f4c2e5ea0f36a5fc6ab51f8726cf41fee4b256680bd", size = 42421775, upload_time = "2025-04-27T12:30:06.875Z" }, + { url = "https://files.pythonhosted.org/packages/10/f7/da98ccd86354c332f593218101ae56568d5dcedb460e342000bd89c49cc1/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a2791f69ad72addd33510fec7bb14ee06c2a448e06b649e264c094c5b5f7ce28", size = 40687231, upload_time = "2025-04-27T12:30:13.954Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1b/2168d6050e52ff1e6cefc61d600723870bf569cbf41d13db939c8cf97a16/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4250e28a22302ce8692d3a0e8ec9d9dde54ec00d237cff4dfa9c1fbf79e472a8", size = 42295639, upload_time = "2025-04-27T12:30:21.949Z" }, + { url = "https://files.pythonhosted.org/packages/b2/66/2d976c0c7158fd25591c8ca55aee026e6d5745a021915a1835578707feb3/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:89e030dc58fc760e4010148e6ff164d2f44441490280ef1e97a542375e41058e", size = 42908549, upload_time = "2025-04-27T12:30:29.551Z" }, + { url = "https://files.pythonhosted.org/packages/31/a9/dfb999c2fc6911201dcbf348247f9cc382a8990f9ab45c12eabfd7243a38/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6102b4864d77102dbbb72965618e204e550135a940c2534711d5ffa787df2a5a", size = 44557216, upload_time = "2025-04-27T12:30:36.977Z" }, + { url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b", size = 25660496, upload_time = "2025-04-27T12:30:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501, upload_time = "2025-04-27T12:30:48.351Z" }, + { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895, upload_time = "2025-04-27T12:30:55.238Z" }, + { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322, upload_time = "2025-04-27T12:31:05.587Z" }, + { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441, upload_time = "2025-04-27T12:31:15.675Z" }, + { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027, upload_time = "2025-04-27T12:31:24.631Z" }, + { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473, upload_time = "2025-04-27T12:31:31.311Z" }, + { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897, upload_time = "2025-04-27T12:31:39.406Z" }, + { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847, upload_time = "2025-04-27T12:31:45.997Z" }, + { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219, upload_time = "2025-04-27T12:31:54.11Z" }, + { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957, upload_time = "2025-04-27T12:31:59.215Z" }, + { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972, upload_time = "2025-04-27T12:32:05.369Z" }, + { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434, upload_time = "2025-04-27T12:32:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648, upload_time = "2025-04-27T12:32:20.766Z" }, + { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853, upload_time = "2025-04-27T12:32:28.1Z" }, + { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743, upload_time = "2025-04-27T12:32:35.792Z" }, + { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441, upload_time = "2025-04-27T12:32:46.64Z" }, + { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279, upload_time = "2025-04-27T12:32:56.503Z" }, + { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982, upload_time = "2025-04-27T12:33:04.72Z" }, +] + +[[package]] +name = "pyarrow-hotfix" +version = "0.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/ed/c3e8677f7abf3981838c2af7b5ac03e3589b3ef94fcb31d575426abae904/pyarrow_hotfix-0.7.tar.gz", hash = "sha256:59399cd58bdd978b2e42816a4183a55c6472d4e33d183351b6069f11ed42661d", size = 9910, upload_time = "2025-04-25T10:17:06.247Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/c3/94ade4906a2f88bc935772f59c934013b4205e773bcb4239db114a6da136/pyarrow_hotfix-0.7-py3-none-any.whl", hash = "sha256:3236f3b5f1260f0e2ac070a55c1a7b339c4bb7267839bd2015e283234e758100", size = 7923, upload_time = "2025-04-25T10:17:05.224Z" }, +] + +[[package]] +name = "pyasn1" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload_time = "2024-09-10T22:41:42.55Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload_time = "2024-09-11T16:00:36.122Z" }, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload_time = "2025-03-28T02:41:22.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload_time = "2025-03-28T02:41:19.028Z" }, +] + +[[package]] +name = "pydantic" +version = "2.10.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681, upload_time = "2025-01-24T01:42:12.693Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696, upload_time = "2025-01-24T01:42:10.371Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.27.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443, upload_time = "2024-12-18T11:31:54.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421, upload_time = "2024-12-18T11:27:55.409Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998, upload_time = "2024-12-18T11:27:57.252Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167, upload_time = "2024-12-18T11:27:59.146Z" }, + { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071, upload_time = "2024-12-18T11:28:02.625Z" }, + { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244, upload_time = "2024-12-18T11:28:04.442Z" }, + { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470, upload_time = "2024-12-18T11:28:07.679Z" }, + { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291, upload_time = "2024-12-18T11:28:10.297Z" }, + { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613, upload_time = "2024-12-18T11:28:13.362Z" }, + { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355, upload_time = "2024-12-18T11:28:16.587Z" }, + { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661, upload_time = "2024-12-18T11:28:18.407Z" }, + { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261, upload_time = "2024-12-18T11:28:21.471Z" }, + { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361, upload_time = "2024-12-18T11:28:23.53Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484, upload_time = "2024-12-18T11:28:25.391Z" }, + { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102, upload_time = "2024-12-18T11:28:28.593Z" }, + { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127, upload_time = "2024-12-18T11:28:30.346Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340, upload_time = "2024-12-18T11:28:32.521Z" }, + { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900, upload_time = "2024-12-18T11:28:34.507Z" }, + { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177, upload_time = "2024-12-18T11:28:36.488Z" }, + { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046, upload_time = "2024-12-18T11:28:39.409Z" }, + { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386, upload_time = "2024-12-18T11:28:41.221Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060, upload_time = "2024-12-18T11:28:44.709Z" }, + { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870, upload_time = "2024-12-18T11:28:46.839Z" }, + { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822, upload_time = "2024-12-18T11:28:48.896Z" }, + { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364, upload_time = "2024-12-18T11:28:50.755Z" }, + { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303, upload_time = "2024-12-18T11:28:54.122Z" }, + { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064, upload_time = "2024-12-18T11:28:56.074Z" }, + { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046, upload_time = "2024-12-18T11:28:58.107Z" }, + { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092, upload_time = "2024-12-18T11:29:01.335Z" }, + { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709, upload_time = "2024-12-18T11:29:03.193Z" }, + { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273, upload_time = "2024-12-18T11:29:05.306Z" }, + { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027, upload_time = "2024-12-18T11:29:07.294Z" }, + { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888, upload_time = "2024-12-18T11:29:09.249Z" }, + { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738, upload_time = "2024-12-18T11:29:11.23Z" }, + { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138, upload_time = "2024-12-18T11:29:16.396Z" }, + { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025, upload_time = "2024-12-18T11:29:20.25Z" }, + { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633, upload_time = "2024-12-18T11:29:23.877Z" }, + { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404, upload_time = "2024-12-18T11:29:25.872Z" }, + { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130, upload_time = "2024-12-18T11:29:29.252Z" }, + { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946, upload_time = "2024-12-18T11:29:31.338Z" }, + { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387, upload_time = "2024-12-18T11:29:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453, upload_time = "2024-12-18T11:29:35.533Z" }, + { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186, upload_time = "2024-12-18T11:29:37.649Z" }, +] + +[[package]] +name = "pyee" +version = "12.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d2/a7/8faaa62a488a2a1e0d56969757f087cbd2729e9bcfa508c230299f366b4c/pyee-12.0.0.tar.gz", hash = "sha256:c480603f4aa2927d4766eb41fa82793fe60a82cbfdb8d688e0d08c55a534e145", size = 29675, upload_time = "2024-08-30T19:40:43.555Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/0d/95993c08c721ec68892547f2117e8f9dfbcef2ca71e098533541b4a54d5f/pyee-12.0.0-py3-none-any.whl", hash = "sha256:7b14b74320600049ccc7d0e0b1becd3b4bd0a03c745758225e31a59f4095c990", size = 14831, upload_time = "2024-08-30T19:40:42.132Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload_time = "2025-01-06T17:26:30.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload_time = "2025-01-06T17:26:25.553Z" }, +] + +[[package]] +name = "pyjwt" +version = "2.10.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload_time = "2024-11-28T03:43:29.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload_time = "2024-11-28T03:43:27.893Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608, upload_time = "2025-03-25T05:01:28.114Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload_time = "2025-03-25T05:01:24.908Z" }, +] + +[[package]] +name = "pytest" +version = "8.3.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload_time = "2025-03-02T12:54:54.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload_time = "2025-03-02T12:54:52.069Z" }, +] + +[[package]] +name = "pytest-asyncio" +version = "0.25.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f2/a8/ecbc8ede70921dd2f544ab1cadd3ff3bf842af27f87bbdea774c7baa1d38/pytest_asyncio-0.25.3.tar.gz", hash = "sha256:fc1da2cf9f125ada7e710b4ddad05518d4cee187ae9412e9ac9271003497f07a", size = 54239, upload_time = "2025-01-28T18:37:58.729Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/17/3493c5624e48fd97156ebaec380dcaafee9506d7e2c46218ceebbb57d7de/pytest_asyncio-0.25.3-py3-none-any.whl", hash = "sha256:9e89518e0f9bd08928f97a3482fdc4e244df17529460bc038291ccaf8f85c7c3", size = 19467, upload_time = "2025-01-28T18:37:56.798Z" }, +] + +[[package]] +name = "pytest-mock" +version = "3.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/96/25588c55fbe330b751bd7c7d723c3544957566bc090f6d506551b514f488/pytest-mock-3.12.0.tar.gz", hash = "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9", size = 32139, upload_time = "2023-10-19T16:25:57.7Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/25/b29fd10dd062cf41e66787a7951b3842881a2a2d7e3a41fcbb58a8466046/pytest_mock-3.12.0-py3-none-any.whl", hash = "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f", size = 9771, upload_time = "2023-10-19T16:25:55.764Z" }, +] + +[[package]] +name = "pytest-timeout" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/93/0d/04719abc7a4bdb3a7a1f968f24b0f5253d698c9cc94975330e9d3145befb/pytest-timeout-2.3.1.tar.gz", hash = "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9", size = 17697, upload_time = "2024-03-07T21:04:01.069Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/27/14af9ef8321f5edc7527e47def2a21d8118c6f329a9342cc61387a0c0599/pytest_timeout-2.3.1-py3-none-any.whl", hash = "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e", size = 14148, upload_time = "2024-03-07T21:03:58.764Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload_time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload_time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115, upload_time = "2024-01-23T06:33:00.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863, upload_time = "2024-01-23T06:32:58.246Z" }, +] + +[[package]] +name = "python-multipart" +version = "0.0.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload_time = "2024-12-16T19:45:46.972Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload_time = "2024-12-16T19:45:44.423Z" }, +] + +[[package]] +name = "python-slugify" +version = "8.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "text-unidecode" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload_time = "2024-02-08T18:32:45.488Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload_time = "2024-02-08T18:32:43.911Z" }, +] + +[[package]] +name = "pytz" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload_time = "2025-03-25T02:25:00.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload_time = "2025-03-25T02:24:58.468Z" }, +] + +[[package]] +name = "pywin32" +version = "310" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284, upload_time = "2025-03-17T00:55:53.124Z" }, + { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748, upload_time = "2025-03-17T00:55:55.203Z" }, + { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941, upload_time = "2025-03-17T00:55:57.048Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239, upload_time = "2025-03-17T00:55:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839, upload_time = "2025-03-17T00:56:00.8Z" }, + { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470, upload_time = "2025-03-17T00:56:02.601Z" }, + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384, upload_time = "2025-03-17T00:56:04.383Z" }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039, upload_time = "2025-03-17T00:56:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload_time = "2025-03-17T00:56:07.819Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload_time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload_time = "2024-08-06T20:32:03.408Z" }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload_time = "2024-08-06T20:32:04.926Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload_time = "2024-08-06T20:32:06.459Z" }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload_time = "2024-08-06T20:32:08.338Z" }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload_time = "2024-08-06T20:32:14.124Z" }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload_time = "2024-08-06T20:32:16.17Z" }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload_time = "2024-08-06T20:32:18.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload_time = "2024-08-06T20:32:19.889Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload_time = "2024-08-06T20:32:21.273Z" }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload_time = "2024-08-06T20:32:25.131Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload_time = "2024-08-06T20:32:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload_time = "2024-08-06T20:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload_time = "2024-08-06T20:32:30.058Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload_time = "2024-08-06T20:32:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload_time = "2024-08-06T20:32:37.083Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload_time = "2024-08-06T20:32:38.898Z" }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload_time = "2024-08-06T20:32:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload_time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload_time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload_time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload_time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload_time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload_time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload_time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload_time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload_time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload_time = "2024-08-06T20:33:04.33Z" }, +] + +[[package]] +name = "regex" +version = "2024.11.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494, upload_time = "2024-11-06T20:12:31.635Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/58/7e4d9493a66c88a7da6d205768119f51af0f684fe7be7bac8328e217a52c/regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638", size = 482669, upload_time = "2024-11-06T20:09:31.064Z" }, + { url = "https://files.pythonhosted.org/packages/34/4c/8f8e631fcdc2ff978609eaeef1d6994bf2f028b59d9ac67640ed051f1218/regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7", size = 287684, upload_time = "2024-11-06T20:09:32.915Z" }, + { url = "https://files.pythonhosted.org/packages/c5/1b/f0e4d13e6adf866ce9b069e191f303a30ab1277e037037a365c3aad5cc9c/regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20", size = 284589, upload_time = "2024-11-06T20:09:35.504Z" }, + { url = "https://files.pythonhosted.org/packages/25/4d/ab21047f446693887f25510887e6820b93f791992994f6498b0318904d4a/regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114", size = 792121, upload_time = "2024-11-06T20:09:37.701Z" }, + { url = "https://files.pythonhosted.org/packages/45/ee/c867e15cd894985cb32b731d89576c41a4642a57850c162490ea34b78c3b/regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3", size = 831275, upload_time = "2024-11-06T20:09:40.371Z" }, + { url = "https://files.pythonhosted.org/packages/b3/12/b0f480726cf1c60f6536fa5e1c95275a77624f3ac8fdccf79e6727499e28/regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f", size = 818257, upload_time = "2024-11-06T20:09:43.059Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ce/0d0e61429f603bac433910d99ef1a02ce45a8967ffbe3cbee48599e62d88/regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0", size = 792727, upload_time = "2024-11-06T20:09:48.19Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c1/243c83c53d4a419c1556f43777ccb552bccdf79d08fda3980e4e77dd9137/regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55", size = 780667, upload_time = "2024-11-06T20:09:49.828Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f4/75eb0dd4ce4b37f04928987f1d22547ddaf6c4bae697623c1b05da67a8aa/regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89", size = 776963, upload_time = "2024-11-06T20:09:51.819Z" }, + { url = "https://files.pythonhosted.org/packages/16/5d/95c568574e630e141a69ff8a254c2f188b4398e813c40d49228c9bbd9875/regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d", size = 784700, upload_time = "2024-11-06T20:09:53.982Z" }, + { url = "https://files.pythonhosted.org/packages/8e/b5/f8495c7917f15cc6fee1e7f395e324ec3e00ab3c665a7dc9d27562fd5290/regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34", size = 848592, upload_time = "2024-11-06T20:09:56.222Z" }, + { url = "https://files.pythonhosted.org/packages/1c/80/6dd7118e8cb212c3c60b191b932dc57db93fb2e36fb9e0e92f72a5909af9/regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d", size = 852929, upload_time = "2024-11-06T20:09:58.642Z" }, + { url = "https://files.pythonhosted.org/packages/11/9b/5a05d2040297d2d254baf95eeeb6df83554e5e1df03bc1a6687fc4ba1f66/regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45", size = 781213, upload_time = "2024-11-06T20:10:00.867Z" }, + { url = "https://files.pythonhosted.org/packages/26/b7/b14e2440156ab39e0177506c08c18accaf2b8932e39fb092074de733d868/regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9", size = 261734, upload_time = "2024-11-06T20:10:03.361Z" }, + { url = "https://files.pythonhosted.org/packages/80/32/763a6cc01d21fb3819227a1cc3f60fd251c13c37c27a73b8ff4315433a8e/regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60", size = 274052, upload_time = "2024-11-06T20:10:05.179Z" }, + { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781, upload_time = "2024-11-06T20:10:07.07Z" }, + { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455, upload_time = "2024-11-06T20:10:09.117Z" }, + { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759, upload_time = "2024-11-06T20:10:11.155Z" }, + { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976, upload_time = "2024-11-06T20:10:13.24Z" }, + { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077, upload_time = "2024-11-06T20:10:15.37Z" }, + { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160, upload_time = "2024-11-06T20:10:19.027Z" }, + { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896, upload_time = "2024-11-06T20:10:21.85Z" }, + { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997, upload_time = "2024-11-06T20:10:24.329Z" }, + { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725, upload_time = "2024-11-06T20:10:28.067Z" }, + { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481, upload_time = "2024-11-06T20:10:31.612Z" }, + { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896, upload_time = "2024-11-06T20:10:34.054Z" }, + { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138, upload_time = "2024-11-06T20:10:36.142Z" }, + { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692, upload_time = "2024-11-06T20:10:38.394Z" }, + { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135, upload_time = "2024-11-06T20:10:40.367Z" }, + { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567, upload_time = "2024-11-06T20:10:43.467Z" }, + { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525, upload_time = "2024-11-06T20:10:45.19Z" }, + { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324, upload_time = "2024-11-06T20:10:47.177Z" }, + { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617, upload_time = "2024-11-06T20:10:49.312Z" }, + { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023, upload_time = "2024-11-06T20:10:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072, upload_time = "2024-11-06T20:10:52.926Z" }, + { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130, upload_time = "2024-11-06T20:10:54.828Z" }, + { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857, upload_time = "2024-11-06T20:10:56.634Z" }, + { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006, upload_time = "2024-11-06T20:10:59.369Z" }, + { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650, upload_time = "2024-11-06T20:11:02.042Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545, upload_time = "2024-11-06T20:11:03.933Z" }, + { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045, upload_time = "2024-11-06T20:11:06.497Z" }, + { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182, upload_time = "2024-11-06T20:11:09.06Z" }, + { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733, upload_time = "2024-11-06T20:11:11.256Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122, upload_time = "2024-11-06T20:11:13.161Z" }, + { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545, upload_time = "2024-11-06T20:11:15Z" }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload_time = "2024-05-29T15:37:49.536Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload_time = "2024-05-29T15:37:47.027Z" }, +] + +[[package]] +name = "requests-oauthlib" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "oauthlib" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650, upload_time = "2024-03-22T20:32:29.939Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179, upload_time = "2024-03-22T20:32:28.055Z" }, +] + +[[package]] +name = "rich" +version = "14.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload_time = "2025-03-30T14:15:14.23Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload_time = "2025-03-30T14:15:12.283Z" }, +] + +[[package]] +name = "rich-toolkit" +version = "0.14.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/24/f0678256fbe0643b4ba00a460f4b736ef07042e459f8d4087c8b7011ab81/rich_toolkit-0.14.5.tar.gz", hash = "sha256:1cb7a3fa0bdbf35793460708664f3f797e8b18cedec9cd41a7e6125e4bc6272b", size = 104799, upload_time = "2025-05-05T10:19:24.521Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/13/621cc551b72de51e6e5cb7cfc510a141e1858bd380ee3c8108fbda4a6be0/rich_toolkit-0.14.5-py3-none-any.whl", hash = "sha256:2fe9846ecbf5d0cdf236c7f43452b68d9da1436a81594aba6b79b3c48b05703b", size = 24791, upload_time = "2025-05-05T10:19:23.346Z" }, +] + +[[package]] +name = "rsa" +version = "4.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload_time = "2025-04-16T09:51:18.218Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload_time = "2025-04-16T09:51:17.142Z" }, +] + +[[package]] +name = "safetensors" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/71/7e/2d5d6ee7b40c0682315367ec7475693d110f512922d582fef1bd4a63adc3/safetensors-0.5.3.tar.gz", hash = "sha256:b6b0d6ecacec39a4fdd99cc19f4576f5219ce858e6fd8dbe7609df0b8dc56965", size = 67210, upload_time = "2025-02-26T09:15:13.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/ae/88f6c49dbd0cc4da0e08610019a3c78a7d390879a919411a410a1876d03a/safetensors-0.5.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd20eb133db8ed15b40110b7c00c6df51655a2998132193de2f75f72d99c7073", size = 436917, upload_time = "2025-02-26T09:15:03.702Z" }, + { url = "https://files.pythonhosted.org/packages/b8/3b/11f1b4a2f5d2ab7da34ecc062b0bc301f2be024d110a6466726bec8c055c/safetensors-0.5.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:21d01c14ff6c415c485616b8b0bf961c46b3b343ca59110d38d744e577f9cce7", size = 418419, upload_time = "2025-02-26T09:15:01.765Z" }, + { url = "https://files.pythonhosted.org/packages/5d/9a/add3e6fef267658075c5a41573c26d42d80c935cdc992384dfae435feaef/safetensors-0.5.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11bce6164887cd491ca75c2326a113ba934be596e22b28b1742ce27b1d076467", size = 459493, upload_time = "2025-02-26T09:14:51.812Z" }, + { url = "https://files.pythonhosted.org/packages/df/5c/bf2cae92222513cc23b3ff85c4a1bb2811a2c3583ac0f8e8d502751de934/safetensors-0.5.3-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4a243be3590bc3301c821da7a18d87224ef35cbd3e5f5727e4e0728b8172411e", size = 472400, upload_time = "2025-02-26T09:14:53.549Z" }, + { url = "https://files.pythonhosted.org/packages/58/11/7456afb740bd45782d0f4c8e8e1bb9e572f1bf82899fb6ace58af47b4282/safetensors-0.5.3-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8bd84b12b1670a6f8e50f01e28156422a2bc07fb16fc4e98bded13039d688a0d", size = 522891, upload_time = "2025-02-26T09:14:55.717Z" }, + { url = "https://files.pythonhosted.org/packages/57/3d/fe73a9d2ace487e7285f6e157afee2383bd1ddb911b7cb44a55cf812eae3/safetensors-0.5.3-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:391ac8cab7c829452175f871fcaf414aa1e292b5448bd02620f675a7f3e7abb9", size = 537694, upload_time = "2025-02-26T09:14:57.036Z" }, + { url = "https://files.pythonhosted.org/packages/a6/f8/dae3421624fcc87a89d42e1898a798bc7ff72c61f38973a65d60df8f124c/safetensors-0.5.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cead1fa41fc54b1e61089fa57452e8834f798cb1dc7a09ba3524f1eb08e0317a", size = 471642, upload_time = "2025-02-26T09:15:00.544Z" }, + { url = "https://files.pythonhosted.org/packages/ce/20/1fbe16f9b815f6c5a672f5b760951e20e17e43f67f231428f871909a37f6/safetensors-0.5.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1077f3e94182d72618357b04b5ced540ceb71c8a813d3319f1aba448e68a770d", size = 502241, upload_time = "2025-02-26T09:14:58.303Z" }, + { url = "https://files.pythonhosted.org/packages/5f/18/8e108846b506487aa4629fe4116b27db65c3dde922de2c8e0cc1133f3f29/safetensors-0.5.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:799021e78287bac619c7b3f3606730a22da4cda27759ddf55d37c8db7511c74b", size = 638001, upload_time = "2025-02-26T09:15:05.79Z" }, + { url = "https://files.pythonhosted.org/packages/82/5a/c116111d8291af6c8c8a8b40628fe833b9db97d8141c2a82359d14d9e078/safetensors-0.5.3-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df26da01aaac504334644e1b7642fa000bfec820e7cef83aeac4e355e03195ff", size = 734013, upload_time = "2025-02-26T09:15:07.892Z" }, + { url = "https://files.pythonhosted.org/packages/7d/ff/41fcc4d3b7de837963622e8610d998710705bbde9a8a17221d85e5d0baad/safetensors-0.5.3-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:32c3ef2d7af8b9f52ff685ed0bc43913cdcde135089ae322ee576de93eae5135", size = 670687, upload_time = "2025-02-26T09:15:09.979Z" }, + { url = "https://files.pythonhosted.org/packages/40/ad/2b113098e69c985a3d8fbda4b902778eae4a35b7d5188859b4a63d30c161/safetensors-0.5.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:37f1521be045e56fc2b54c606d4455573e717b2d887c579ee1dbba5f868ece04", size = 643147, upload_time = "2025-02-26T09:15:11.185Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0c/95aeb51d4246bd9a3242d3d8349c1112b4ee7611a4b40f0c5c93b05f001d/safetensors-0.5.3-cp38-abi3-win32.whl", hash = "sha256:cfc0ec0846dcf6763b0ed3d1846ff36008c6e7290683b61616c4b040f6a54ace", size = 296677, upload_time = "2025-02-26T09:15:16.554Z" }, + { url = "https://files.pythonhosted.org/packages/69/e2/b011c38e5394c4c18fb5500778a55ec43ad6106126e74723ffaee246f56e/safetensors-0.5.3-cp38-abi3-win_amd64.whl", hash = "sha256:836cbbc320b47e80acd40e44c8682db0e8ad7123209f69b093def21ec7cafd11", size = 308878, upload_time = "2025-02-26T09:15:14.99Z" }, +] + +[[package]] +name = "setuptools" +version = "80.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/dc/3976b322de9d2e87ed0007cf04cc7553969b6c7b3f48a565d0333748fbcd/setuptools-80.3.1.tar.gz", hash = "sha256:31e2c58dbb67c99c289f51c16d899afedae292b978f8051efaf6262d8212f927", size = 1315082, upload_time = "2025-05-04T18:47:04.397Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/7e/5d8af3317ddbf9519b687bd1c39d8737fde07d97f54df65553faca5cffb1/setuptools-80.3.1-py3-none-any.whl", hash = "sha256:ea8e00d7992054c4c592aeb892f6ad51fe1b4d90cc6947cc45c45717c40ec537", size = 1201172, upload_time = "2025-05-04T18:47:02.575Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload_time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload_time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "simplejson" +version = "3.20.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/92/51b417685abd96b31308b61b9acce7ec50d8e1de8fbc39a7fd4962c60689/simplejson-3.20.1.tar.gz", hash = "sha256:e64139b4ec4f1f24c142ff7dcafe55a22b811a74d86d66560c8815687143037d", size = 85591, upload_time = "2025-02-15T05:18:53.15Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/59/74bc90d1c051bc2432c96b34bd4e8036875ab58b4fcbe4d6a5a76985f853/simplejson-3.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:325b8c107253d3217e89d7b50c71015b5b31e2433e6c5bf38967b2f80630a8ca", size = 92132, upload_time = "2025-02-15T05:16:15.743Z" }, + { url = "https://files.pythonhosted.org/packages/71/c7/1970916e0c51794fff89f76da2f632aaf0b259b87753c88a8c409623d3e1/simplejson-3.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88a7baa8211089b9e58d78fbc1b0b322103f3f3d459ff16f03a36cece0d0fcf0", size = 74956, upload_time = "2025-02-15T05:16:17.062Z" }, + { url = "https://files.pythonhosted.org/packages/c8/0d/98cc5909180463f1d75fac7180de62d4cdb4e82c4fef276b9e591979372c/simplejson-3.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:299b1007b8101d50d95bc0db1bf5c38dc372e85b504cf77f596462083ee77e3f", size = 74772, upload_time = "2025-02-15T05:16:19.204Z" }, + { url = "https://files.pythonhosted.org/packages/e1/94/a30a5211a90d67725a3e8fcc1c788189f2ae2ed2b96b63ed15d0b7f5d6bb/simplejson-3.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ec618ed65caab48e81e3ed29586236a8e57daef792f1f3bb59504a7e98cd10", size = 143575, upload_time = "2025-02-15T05:16:21.337Z" }, + { url = "https://files.pythonhosted.org/packages/ee/08/cdb6821f1058eb5db46d252de69ff7e6c53f05f1bae6368fe20d5b51d37e/simplejson-3.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2cdead1d3197f0ff43373cf4730213420523ba48697743e135e26f3d179f38", size = 153241, upload_time = "2025-02-15T05:16:22.859Z" }, + { url = "https://files.pythonhosted.org/packages/4c/2d/ca3caeea0bdc5efc5503d5f57a2dfb56804898fb196dfada121323ee0ccb/simplejson-3.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3466d2839fdc83e1af42e07b90bc8ff361c4e8796cd66722a40ba14e458faddd", size = 141500, upload_time = "2025-02-15T05:16:25.068Z" }, + { url = "https://files.pythonhosted.org/packages/e1/33/d3e0779d5c58245e7370c98eb969275af6b7a4a5aec3b97cbf85f09ad328/simplejson-3.20.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d492ed8e92f3a9f9be829205f44b1d0a89af6582f0cf43e0d129fa477b93fe0c", size = 144757, upload_time = "2025-02-15T05:16:28.301Z" }, + { url = "https://files.pythonhosted.org/packages/54/53/2d93128bb55861b2fa36c5944f38da51a0bc6d83e513afc6f7838440dd15/simplejson-3.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f924b485537b640dc69434565463fd6fc0c68c65a8c6e01a823dd26c9983cf79", size = 144409, upload_time = "2025-02-15T05:16:29.687Z" }, + { url = "https://files.pythonhosted.org/packages/99/4c/dac310a98f897ad3435b4bdc836d92e78f09e38c5dbf28211ed21dc59fa2/simplejson-3.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e8eacf6a3491bf76ea91a8d46726368a6be0eb94993f60b8583550baae9439e", size = 146082, upload_time = "2025-02-15T05:16:31.064Z" }, + { url = "https://files.pythonhosted.org/packages/ee/22/d7ba958cfed39827335b82656b1c46f89678faecda9a7677b47e87b48ee6/simplejson-3.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d04bf90b4cea7c22d8b19091633908f14a096caa301b24c2f3d85b5068fb8", size = 154339, upload_time = "2025-02-15T05:16:32.719Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c8/b072b741129406a7086a0799c6f5d13096231bf35fdd87a0cffa789687fc/simplejson-3.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:69dd28d4ce38390ea4aaf212902712c0fd1093dc4c1ff67e09687c3c3e15a749", size = 147915, upload_time = "2025-02-15T05:16:34.291Z" }, + { url = "https://files.pythonhosted.org/packages/6c/46/8347e61e9cf3db5342a42f7fd30a81b4f5cf85977f916852d7674a540907/simplejson-3.20.1-cp311-cp311-win32.whl", hash = "sha256:dfe7a9da5fd2a3499436cd350f31539e0a6ded5da6b5b3d422df016444d65e43", size = 73972, upload_time = "2025-02-15T05:16:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/01/85/b52f24859237b4e9d523d5655796d911ba3d46e242eb1959c45b6af5aedd/simplejson-3.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:896a6c04d7861d507d800da7642479c3547060bf97419d9ef73d98ced8258766", size = 75595, upload_time = "2025-02-15T05:16:36.957Z" }, + { url = "https://files.pythonhosted.org/packages/8d/eb/34c16a1ac9ba265d024dc977ad84e1659d931c0a700967c3e59a98ed7514/simplejson-3.20.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f31c4a3a7ab18467ee73a27f3e59158255d1520f3aad74315edde7a940f1be23", size = 93100, upload_time = "2025-02-15T05:16:38.801Z" }, + { url = "https://files.pythonhosted.org/packages/41/fc/2c2c007d135894971e6814e7c0806936e5bade28f8db4dd7e2a58b50debd/simplejson-3.20.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:884e6183d16b725e113b83a6fc0230152ab6627d4d36cb05c89c2c5bccfa7bc6", size = 75464, upload_time = "2025-02-15T05:16:40.905Z" }, + { url = "https://files.pythonhosted.org/packages/0f/05/2b5ecb33b776c34bb5cace5de5d7669f9b60e3ca13c113037b2ca86edfbd/simplejson-3.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03d7a426e416fe0d3337115f04164cd9427eb4256e843a6b8751cacf70abc832", size = 75112, upload_time = "2025-02-15T05:16:42.246Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/1f3609a2792f06cd4b71030485f78e91eb09cfd57bebf3116bf2980a8bac/simplejson-3.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:000602141d0bddfcff60ea6a6e97d5e10c9db6b17fd2d6c66199fa481b6214bb", size = 150182, upload_time = "2025-02-15T05:16:43.557Z" }, + { url = "https://files.pythonhosted.org/packages/2f/b0/053fbda38b8b602a77a4f7829def1b4f316cd8deb5440a6d3ee90790d2a4/simplejson-3.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af8377a8af78226e82e3a4349efdde59ffa421ae88be67e18cef915e4023a595", size = 158363, upload_time = "2025-02-15T05:16:45.748Z" }, + { url = "https://files.pythonhosted.org/packages/d1/4b/2eb84ae867539a80822e92f9be4a7200dffba609275faf99b24141839110/simplejson-3.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15c7de4c88ab2fbcb8781a3b982ef883696736134e20b1210bca43fb42ff1acf", size = 148415, upload_time = "2025-02-15T05:16:47.861Z" }, + { url = "https://files.pythonhosted.org/packages/e0/bd/400b0bd372a5666addf2540c7358bfc3841b9ce5cdbc5cc4ad2f61627ad8/simplejson-3.20.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:455a882ff3f97d810709f7b620007d4e0aca8da71d06fc5c18ba11daf1c4df49", size = 152213, upload_time = "2025-02-15T05:16:49.25Z" }, + { url = "https://files.pythonhosted.org/packages/50/12/143f447bf6a827ee9472693768dc1a5eb96154f8feb140a88ce6973a3cfa/simplejson-3.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc0f523ce923e7f38eb67804bc80e0a028c76d7868500aa3f59225574b5d0453", size = 150048, upload_time = "2025-02-15T05:16:51.5Z" }, + { url = "https://files.pythonhosted.org/packages/5e/ea/dd9b3e8e8ed710a66f24a22c16a907c9b539b6f5f45fd8586bd5c231444e/simplejson-3.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76461ec929282dde4a08061071a47281ad939d0202dc4e63cdd135844e162fbc", size = 151668, upload_time = "2025-02-15T05:16:53Z" }, + { url = "https://files.pythonhosted.org/packages/99/af/ee52a8045426a0c5b89d755a5a70cc821815ef3c333b56fbcad33c4435c0/simplejson-3.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19c2da8c043607bde4d4ef3a6b633e668a7d2e3d56f40a476a74c5ea71949f", size = 158840, upload_time = "2025-02-15T05:16:54.851Z" }, + { url = "https://files.pythonhosted.org/packages/68/db/ab32869acea6b5de7d75fa0dac07a112ded795d41eaa7e66c7813b17be95/simplejson-3.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b2578bedaedf6294415197b267d4ef678fea336dd78ee2a6d2f4b028e9d07be3", size = 154212, upload_time = "2025-02-15T05:16:56.318Z" }, + { url = "https://files.pythonhosted.org/packages/fa/7a/e3132d454977d75a3bf9a6d541d730f76462ebf42a96fea2621498166f41/simplejson-3.20.1-cp312-cp312-win32.whl", hash = "sha256:339f407373325a36b7fd744b688ba5bae0666b5d340ec6d98aebc3014bf3d8ea", size = 74101, upload_time = "2025-02-15T05:16:57.746Z" }, + { url = "https://files.pythonhosted.org/packages/bc/5d/4e243e937fa3560107c69f6f7c2eed8589163f5ed14324e864871daa2dd9/simplejson-3.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:627d4486a1ea7edf1f66bb044ace1ce6b4c1698acd1b05353c97ba4864ea2e17", size = 75736, upload_time = "2025-02-15T05:16:59.017Z" }, + { url = "https://files.pythonhosted.org/packages/c4/03/0f453a27877cb5a5fff16a975925f4119102cc8552f52536b9a98ef0431e/simplejson-3.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:71e849e7ceb2178344998cbe5ade101f1b329460243c79c27fbfc51c0447a7c3", size = 93109, upload_time = "2025-02-15T05:17:00.377Z" }, + { url = "https://files.pythonhosted.org/packages/74/1f/a729f4026850cabeaff23e134646c3f455e86925d2533463420635ae54de/simplejson-3.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b63fdbab29dc3868d6f009a59797cefaba315fd43cd32ddd998ee1da28e50e29", size = 75475, upload_time = "2025-02-15T05:17:02.544Z" }, + { url = "https://files.pythonhosted.org/packages/e2/14/50a2713fee8ff1f8d655b1a14f4a0f1c0c7246768a1b3b3d12964a4ed5aa/simplejson-3.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1190f9a3ce644fd50ec277ac4a98c0517f532cfebdcc4bd975c0979a9f05e1fb", size = 75112, upload_time = "2025-02-15T05:17:03.875Z" }, + { url = "https://files.pythonhosted.org/packages/45/86/ea9835abb646755140e2d482edc9bc1e91997ed19a59fd77ae4c6a0facea/simplejson-3.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1336ba7bcb722ad487cd265701ff0583c0bb6de638364ca947bb84ecc0015d1", size = 150245, upload_time = "2025-02-15T05:17:06.899Z" }, + { url = "https://files.pythonhosted.org/packages/12/b4/53084809faede45da829fe571c65fbda8479d2a5b9c633f46b74124d56f5/simplejson-3.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e975aac6a5acd8b510eba58d5591e10a03e3d16c1cf8a8624ca177491f7230f0", size = 158465, upload_time = "2025-02-15T05:17:08.707Z" }, + { url = "https://files.pythonhosted.org/packages/a9/7d/d56579468d1660b3841e1f21c14490d103e33cf911886b22652d6e9683ec/simplejson-3.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a6dd11ee282937ad749da6f3b8d87952ad585b26e5edfa10da3ae2536c73078", size = 148514, upload_time = "2025-02-15T05:17:11.323Z" }, + { url = "https://files.pythonhosted.org/packages/19/e3/874b1cca3d3897b486d3afdccc475eb3a09815bf1015b01cf7fcb52a55f0/simplejson-3.20.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab980fcc446ab87ea0879edad41a5c28f2d86020014eb035cf5161e8de4474c6", size = 152262, upload_time = "2025-02-15T05:17:13.543Z" }, + { url = "https://files.pythonhosted.org/packages/32/84/f0fdb3625292d945c2bd13a814584603aebdb38cfbe5fe9be6b46fe598c4/simplejson-3.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f5aee2a4cb6b146bd17333ac623610f069f34e8f31d2f4f0c1a2186e50c594f0", size = 150164, upload_time = "2025-02-15T05:17:15.021Z" }, + { url = "https://files.pythonhosted.org/packages/95/51/6d625247224f01eaaeabace9aec75ac5603a42f8ebcce02c486fbda8b428/simplejson-3.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:652d8eecbb9a3b6461b21ec7cf11fd0acbab144e45e600c817ecf18e4580b99e", size = 151795, upload_time = "2025-02-15T05:17:16.542Z" }, + { url = "https://files.pythonhosted.org/packages/7f/d9/bb921df6b35be8412f519e58e86d1060fddf3ad401b783e4862e0a74c4c1/simplejson-3.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8c09948f1a486a89251ee3a67c9f8c969b379f6ffff1a6064b41fea3bce0a112", size = 159027, upload_time = "2025-02-15T05:17:18.083Z" }, + { url = "https://files.pythonhosted.org/packages/03/c5/5950605e4ad023a6621cf4c931b29fd3d2a9c1f36be937230bfc83d7271d/simplejson-3.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cbbd7b215ad4fc6f058b5dd4c26ee5c59f72e031dfda3ac183d7968a99e4ca3a", size = 154380, upload_time = "2025-02-15T05:17:20.334Z" }, + { url = "https://files.pythonhosted.org/packages/66/ad/b74149557c5ec1e4e4d55758bda426f5d2ec0123cd01a53ae63b8de51fa3/simplejson-3.20.1-cp313-cp313-win32.whl", hash = "sha256:ae81e482476eaa088ef9d0120ae5345de924f23962c0c1e20abbdff597631f87", size = 74102, upload_time = "2025-02-15T05:17:22.475Z" }, + { url = "https://files.pythonhosted.org/packages/db/a9/25282fdd24493e1022f30b7f5cdf804255c007218b2bfaa655bd7ad34b2d/simplejson-3.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:1b9fd15853b90aec3b1739f4471efbf1ac05066a2c7041bf8db821bb73cd2ddc", size = 75736, upload_time = "2025-02-15T05:17:24.122Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/00f02a0a921556dd5a6db1ef2926a1bc7a8bbbfb1c49cfed68a275b8ab2b/simplejson-3.20.1-py3-none-any.whl", hash = "sha256:8a6c1bbac39fa4a79f83cbf1df6ccd8ff7069582a9fd8db1e52cea073bc2c697", size = 57121, upload_time = "2025-02-15T05:18:51.243Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload_time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload_time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload_time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload_time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "soupsieve" +version = "2.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload_time = "2025-04-20T18:50:08.518Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload_time = "2025-04-20T18:50:07.196Z" }, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.40" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/c3/3f2bfa5e4dcd9938405fe2fab5b6ab94a9248a4f9536ea2fd497da20525f/sqlalchemy-2.0.40.tar.gz", hash = "sha256:d827099289c64589418ebbcaead0145cd19f4e3e8a93919a0100247af245fa00", size = 9664299, upload_time = "2025-03-27T17:52:31.876Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/7e/55044a9ec48c3249bb38d5faae93f09579c35e862bb318ebd1ed7a1994a5/sqlalchemy-2.0.40-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f6bacab7514de6146a1976bc56e1545bee247242fab030b89e5f70336fc0003e", size = 2114025, upload_time = "2025-03-27T18:49:29.456Z" }, + { url = "https://files.pythonhosted.org/packages/77/0f/dcf7bba95f847aec72f638750747b12d37914f71c8cc7c133cf326ab945c/sqlalchemy-2.0.40-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5654d1ac34e922b6c5711631f2da497d3a7bffd6f9f87ac23b35feea56098011", size = 2104419, upload_time = "2025-03-27T18:49:30.75Z" }, + { url = "https://files.pythonhosted.org/packages/75/70/c86a5c20715e4fe903dde4c2fd44fc7e7a0d5fb52c1b954d98526f65a3ea/sqlalchemy-2.0.40-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35904d63412db21088739510216e9349e335f142ce4a04b69e2528020ee19ed4", size = 3222720, upload_time = "2025-03-27T18:44:29.871Z" }, + { url = "https://files.pythonhosted.org/packages/12/cf/b891a8c1d0c27ce9163361664c2128c7a57de3f35000ea5202eb3a2917b7/sqlalchemy-2.0.40-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c7a80ed86d6aaacb8160a1caef6680d4ddd03c944d985aecee940d168c411d1", size = 3222682, upload_time = "2025-03-27T18:55:20.097Z" }, + { url = "https://files.pythonhosted.org/packages/15/3f/7709d8c8266953d945435a96b7f425ae4172a336963756b58e996fbef7f3/sqlalchemy-2.0.40-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:519624685a51525ddaa7d8ba8265a1540442a2ec71476f0e75241eb8263d6f51", size = 3159542, upload_time = "2025-03-27T18:44:31.333Z" }, + { url = "https://files.pythonhosted.org/packages/85/7e/717eaabaf0f80a0132dc2032ea8f745b7a0914451c984821a7c8737fb75a/sqlalchemy-2.0.40-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2ee5f9999a5b0e9689bed96e60ee53c3384f1a05c2dd8068cc2e8361b0df5b7a", size = 3179864, upload_time = "2025-03-27T18:55:21.784Z" }, + { url = "https://files.pythonhosted.org/packages/e4/cc/03eb5dfcdb575cbecd2bd82487b9848f250a4b6ecfb4707e834b4ce4ec07/sqlalchemy-2.0.40-cp311-cp311-win32.whl", hash = "sha256:c0cae71e20e3c02c52f6b9e9722bca70e4a90a466d59477822739dc31ac18b4b", size = 2084675, upload_time = "2025-03-27T18:48:55.915Z" }, + { url = "https://files.pythonhosted.org/packages/9a/48/440946bf9dc4dc231f4f31ef0d316f7135bf41d4b86aaba0c0655150d370/sqlalchemy-2.0.40-cp311-cp311-win_amd64.whl", hash = "sha256:574aea2c54d8f1dd1699449f332c7d9b71c339e04ae50163a3eb5ce4c4325ee4", size = 2110099, upload_time = "2025-03-27T18:48:57.45Z" }, + { url = "https://files.pythonhosted.org/packages/92/06/552c1f92e880b57d8b92ce6619bd569b25cead492389b1d84904b55989d8/sqlalchemy-2.0.40-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9d3b31d0a1c44b74d3ae27a3de422dfccd2b8f0b75e51ecb2faa2bf65ab1ba0d", size = 2112620, upload_time = "2025-03-27T18:40:00.071Z" }, + { url = "https://files.pythonhosted.org/packages/01/72/a5bc6e76c34cebc071f758161dbe1453de8815ae6e662393910d3be6d70d/sqlalchemy-2.0.40-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:37f7a0f506cf78c80450ed1e816978643d3969f99c4ac6b01104a6fe95c5490a", size = 2103004, upload_time = "2025-03-27T18:40:04.204Z" }, + { url = "https://files.pythonhosted.org/packages/bf/fd/0e96c8e6767618ed1a06e4d7a167fe13734c2f8113c4cb704443e6783038/sqlalchemy-2.0.40-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bb933a650323e476a2e4fbef8997a10d0003d4da996aad3fd7873e962fdde4d", size = 3252440, upload_time = "2025-03-27T18:51:25.624Z" }, + { url = "https://files.pythonhosted.org/packages/cd/6a/eb82e45b15a64266a2917a6833b51a334ea3c1991728fd905bfccbf5cf63/sqlalchemy-2.0.40-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6959738971b4745eea16f818a2cd086fb35081383b078272c35ece2b07012716", size = 3263277, upload_time = "2025-03-27T18:50:28.142Z" }, + { url = "https://files.pythonhosted.org/packages/45/97/ebe41ab4530f50af99e3995ebd4e0204bf1b0dc0930f32250dde19c389fe/sqlalchemy-2.0.40-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:110179728e442dae85dd39591beb74072ae4ad55a44eda2acc6ec98ead80d5f2", size = 3198591, upload_time = "2025-03-27T18:51:27.543Z" }, + { url = "https://files.pythonhosted.org/packages/e6/1c/a569c1b2b2f5ac20ba6846a1321a2bf52e9a4061001f282bf1c5528dcd69/sqlalchemy-2.0.40-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8040680eaacdce4d635f12c55c714f3d4c7f57da2bc47a01229d115bd319191", size = 3225199, upload_time = "2025-03-27T18:50:30.069Z" }, + { url = "https://files.pythonhosted.org/packages/8f/91/87cc71a6b10065ca0209d19a4bb575378abda6085e72fa0b61ffb2201b84/sqlalchemy-2.0.40-cp312-cp312-win32.whl", hash = "sha256:650490653b110905c10adac69408380688cefc1f536a137d0d69aca1069dc1d1", size = 2082959, upload_time = "2025-03-27T18:45:57.574Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/14c511cda174aa1ad9b0e42b64ff5a71db35d08b0d80dc044dae958921e5/sqlalchemy-2.0.40-cp312-cp312-win_amd64.whl", hash = "sha256:2be94d75ee06548d2fc591a3513422b873490efb124048f50556369a834853b0", size = 2108526, upload_time = "2025-03-27T18:45:58.965Z" }, + { url = "https://files.pythonhosted.org/packages/8c/18/4e3a86cc0232377bc48c373a9ba6a1b3fb79ba32dbb4eda0b357f5a2c59d/sqlalchemy-2.0.40-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:915866fd50dd868fdcc18d61d8258db1bf9ed7fbd6dfec960ba43365952f3b01", size = 2107887, upload_time = "2025-03-27T18:40:05.461Z" }, + { url = "https://files.pythonhosted.org/packages/cb/60/9fa692b1d2ffc4cbd5f47753731fd332afed30137115d862d6e9a1e962c7/sqlalchemy-2.0.40-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a4c5a2905a9ccdc67a8963e24abd2f7afcd4348829412483695c59e0af9a705", size = 2098367, upload_time = "2025-03-27T18:40:07.182Z" }, + { url = "https://files.pythonhosted.org/packages/4c/9f/84b78357ca641714a439eb3fbbddb17297dacfa05d951dbf24f28d7b5c08/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55028d7a3ebdf7ace492fab9895cbc5270153f75442a0472d8516e03159ab364", size = 3184806, upload_time = "2025-03-27T18:51:29.356Z" }, + { url = "https://files.pythonhosted.org/packages/4b/7d/e06164161b6bfce04c01bfa01518a20cccbd4100d5c951e5a7422189191a/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cfedff6878b0e0d1d0a50666a817ecd85051d12d56b43d9d425455e608b5ba0", size = 3198131, upload_time = "2025-03-27T18:50:31.616Z" }, + { url = "https://files.pythonhosted.org/packages/6d/51/354af20da42d7ec7b5c9de99edafbb7663a1d75686d1999ceb2c15811302/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bb19e30fdae77d357ce92192a3504579abe48a66877f476880238a962e5b96db", size = 3131364, upload_time = "2025-03-27T18:51:31.336Z" }, + { url = "https://files.pythonhosted.org/packages/7a/2f/48a41ff4e6e10549d83fcc551ab85c268bde7c03cf77afb36303c6594d11/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:16d325ea898f74b26ffcd1cf8c593b0beed8714f0317df2bed0d8d1de05a8f26", size = 3159482, upload_time = "2025-03-27T18:50:33.201Z" }, + { url = "https://files.pythonhosted.org/packages/33/ac/e5e0a807163652a35be878c0ad5cfd8b1d29605edcadfb5df3c512cdf9f3/sqlalchemy-2.0.40-cp313-cp313-win32.whl", hash = "sha256:a669cbe5be3c63f75bcbee0b266779706f1a54bcb1000f302685b87d1b8c1500", size = 2080704, upload_time = "2025-03-27T18:46:00.193Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cb/f38c61f7f2fd4d10494c1c135ff6a6ddb63508d0b47bccccd93670637309/sqlalchemy-2.0.40-cp313-cp313-win_amd64.whl", hash = "sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad", size = 2104564, upload_time = "2025-03-27T18:46:01.442Z" }, + { url = "https://files.pythonhosted.org/packages/d1/7c/5fc8e802e7506fe8b55a03a2e1dab156eae205c91bee46305755e086d2e2/sqlalchemy-2.0.40-py3-none-any.whl", hash = "sha256:32587e2e1e359276957e6fe5dad089758bc042a971a8a09ae8ecf7a8fe23d07a", size = 1903894, upload_time = "2025-03-27T18:40:43.796Z" }, +] + +[[package]] +name = "starlette" +version = "0.45.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/fb/2984a686808b89a6781526129a4b51266f678b2d2b97ab2d325e56116df8/starlette-0.45.3.tar.gz", hash = "sha256:2cbcba2a75806f8a41c722141486f37c28e30a0921c5f6fe4346cb0dcee1302f", size = 2574076, upload_time = "2025-01-24T11:17:36.535Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl", hash = "sha256:dfb6d332576f136ec740296c7e8bb8c8a7125044e7c6da30744718880cdd059d", size = 71507, upload_time = "2025-01-24T11:17:34.182Z" }, +] + +[[package]] +name = "tensorboard" +version = "2.15.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "absl-py" }, + { name = "google-auth" }, + { name = "google-auth-oauthlib" }, + { name = "grpcio" }, + { name = "markdown" }, + { name = "numpy" }, + { name = "protobuf" }, + { name = "requests" }, + { name = "setuptools" }, + { name = "six" }, + { name = "tensorboard-data-server" }, + { name = "werkzeug" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/12/f6e9b9dcc310263cbd3948274e286538bd6800fd0c268850788f14a0c6d0/tensorboard-2.15.2-py3-none-any.whl", hash = "sha256:a6f6443728064d962caea6d34653e220e34ef8df764cb06a8212c17e1a8f0622", size = 5539713, upload_time = "2024-02-09T10:39:25.636Z" }, +] + +[[package]] +name = "tensorboard-data-server" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl", hash = "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb", size = 2356, upload_time = "2023-10-23T21:23:32.16Z" }, + { url = "https://files.pythonhosted.org/packages/b7/85/dabeaf902892922777492e1d253bb7e1264cadce3cea932f7ff599e53fea/tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60", size = 4823598, upload_time = "2023-10-23T21:23:33.714Z" }, + { url = "https://files.pythonhosted.org/packages/73/c6/825dab04195756cf8ff2e12698f22513b3db2f64925bdd41671bfb33aaa5/tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530", size = 6590363, upload_time = "2023-10-23T21:23:35.583Z" }, +] + +[[package]] +name = "tensorflow-cpu" +version = "2.15.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "absl-py" }, + { name = "astunparse" }, + { name = "flatbuffers" }, + { name = "gast" }, + { name = "google-pasta" }, + { name = "grpcio" }, + { name = "h5py" }, + { name = "keras" }, + { name = "libclang" }, + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "opt-einsum" }, + { name = "packaging" }, + { name = "protobuf" }, + { name = "setuptools" }, + { name = "six" }, + { name = "tensorboard" }, + { name = "tensorflow-estimator" }, + { name = "tensorflow-io-gcs-filesystem" }, + { name = "termcolor" }, + { name = "typing-extensions" }, + { name = "wrapt" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/6c/dc0642ce2656637d8f31ba9c618a41bf14e38428ba77e4e0a9359be39436/tensorflow_cpu-2.15.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:ee3bb114c6031d471d891c761e7eda2c80bea19bb318abcd3d5bab92ccfaf9aa", size = 236482774, upload_time = "2024-03-08T23:52:40.963Z" }, + { url = "https://files.pythonhosted.org/packages/5b/00/af89cb211fc96ffdebb52a687dad7f83b0b1d82bc057f65309fa03a89911/tensorflow_cpu-2.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54660c074d7241a503e81edfd9f5ef5af88f64051b72e2945f26318c790f2d26", size = 207208420, upload_time = "2024-03-08T23:48:30.479Z" }, + { url = "https://files.pythonhosted.org/packages/51/8a/ff2fc9bad8edc68ef4cd63963c10b320de03d3496def83d2a9b1635c6831/tensorflow_cpu-2.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:dc75baf4c08a6e8ab7ceec97f002bb993508a5b58f13fac5283ee976a71a3c67", size = 2133, upload_time = "2024-03-08T23:53:47.249Z" }, +] + +[[package]] +name = "tensorflow-estimator" +version = "2.15.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/c8/2f823c8958d5342eafc6dd3e922f0cc4fcf8c2e0460284cc462dae3b60a0/tensorflow_estimator-2.15.0-py2.py3-none-any.whl", hash = "sha256:aedf21eec7fb2dc91150fc91a1ce12bc44dbb72278a08b58e79ff87c9e28f153", size = 441974, upload_time = "2023-11-07T01:10:10.812Z" }, +] + +[[package]] +name = "tensorflow-io-gcs-filesystem" +version = "0.31.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/00/900ca310ff2e46eb3127f8f54af0b0000a6cc786be6a54dc2cfe841f4683/tensorflow_io_gcs_filesystem-0.31.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:8909c4344b0e96aa356230ab460ffafe5900c33c1aaced65fafae71d177a1966", size = 1642401, upload_time = "2023-02-25T19:31:40.204Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c4/0d44ef93add3432ce43f37fe0c205cc7b6fd685fca80054fb4a646a9dbe3/tensorflow_io_gcs_filesystem-0.31.0-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e417faf8755aafe52d8f8c6b5ae5bae6e4fae8326ee3acd5e9181b83bbfbae87", size = 2381673, upload_time = "2023-02-25T19:31:41.992Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2b/3064195efa016fff942009fe965ecbbbbd7d70bf34ee22d4ff31a0f3443a/tensorflow_io_gcs_filesystem-0.31.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37c40e3c4ee1f8dda3b545deea6b8839192c82037d8021db9f589908034ad975", size = 2572150, upload_time = "2023-02-25T19:31:43.874Z" }, + { url = "https://files.pythonhosted.org/packages/ac/4e/9566a313927be582ca99455a9523a097c7888fc819695bdc08415432b202/tensorflow_io_gcs_filesystem-0.31.0-cp311-cp311-win_amd64.whl", hash = "sha256:4bb37d23f21c434687b11059cb7ffd094d52a7813368915ba1b7057e3c16e414", size = 1486315, upload_time = "2023-02-25T19:31:45.641Z" }, +] + +[[package]] +name = "termcolor" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/6c/3d75c196ac07ac8749600b60b03f4f6094d54e132c4d94ebac6ee0e0add0/termcolor-3.1.0.tar.gz", hash = "sha256:6a6dd7fbee581909eeec6a756cff1d7f7c376063b14e4a298dc4980309e55970", size = 14324, upload_time = "2025-04-30T11:37:53.791Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/bd/de8d508070629b6d84a30d01d57e4a65c69aa7f5abe7560b8fad3b50ea59/termcolor-3.1.0-py3-none-any.whl", hash = "sha256:591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa", size = 7684, upload_time = "2025-04-30T11:37:52.382Z" }, +] + +[[package]] +name = "text-unidecode" +version = "1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload_time = "2019-08-30T21:36:45.405Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload_time = "2019-08-30T21:37:03.543Z" }, +] + +[[package]] +name = "tokenizers" +version = "0.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/04/2071c150f374aab6d5e92aaec38d0f3c368d227dd9e0469a1f0966ac68d1/tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3", size = 321039, upload_time = "2024-04-17T21:40:41.849Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/d6/6e1d728d765eb4102767f071bf7f6439ab10d7f4a975c9217db65715207a/tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059", size = 2533448, upload_time = "2024-04-17T21:36:38.61Z" }, + { url = "https://files.pythonhosted.org/packages/90/79/d17a0f491d10817cd30f1121a07aa09c8e97a81114b116e473baf1577f09/tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14", size = 2440254, upload_time = "2024-04-17T21:36:40.398Z" }, + { url = "https://files.pythonhosted.org/packages/c7/28/2d11c3ff94f9d42eceb2ea549a06e3f166fe391c5a025e5d96fac898a3ac/tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594", size = 3684971, upload_time = "2024-04-17T21:36:43.115Z" }, + { url = "https://files.pythonhosted.org/packages/36/c6/537f22b57e6003904d35d07962dbde2f2e9bdd791d0241da976a4c7f8194/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc", size = 3568894, upload_time = "2024-04-17T21:36:45.011Z" }, + { url = "https://files.pythonhosted.org/packages/af/ef/3c1deed14ec59b2c8e7e2fa27b2a53f7d101181277a43b89ab17d891ef2e/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2", size = 3426873, upload_time = "2024-04-17T21:36:47.001Z" }, + { url = "https://files.pythonhosted.org/packages/06/db/c0320c4798ac6bd12d2ef895bec9d10d216a3b4d6fff10e9d68883ea7edc/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe", size = 3965050, upload_time = "2024-04-17T21:36:49.202Z" }, + { url = "https://files.pythonhosted.org/packages/4c/8a/a166888d6cb14db55f5eb7ce0b1d4777d145aa27cbf4f945712cf6c29935/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d", size = 4047855, upload_time = "2024-04-17T21:36:52.864Z" }, + { url = "https://files.pythonhosted.org/packages/a7/03/fb50fc03f86016b227a967c8d474f90230c885c0d18f78acdfda7a96ce56/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa", size = 3608228, upload_time = "2024-04-17T21:36:55.7Z" }, + { url = "https://files.pythonhosted.org/packages/5b/cd/0385e1026e1e03732fd398e964792a3a8433918b166748c82507e014d748/tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6", size = 9633115, upload_time = "2024-04-17T21:36:58.299Z" }, + { url = "https://files.pythonhosted.org/packages/25/50/8f8ad0bbdaf09d04b15e6502d1fa1c653754ed7e016e4ae009726aa1a4e4/tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b", size = 9949062, upload_time = "2024-04-17T21:37:01.947Z" }, + { url = "https://files.pythonhosted.org/packages/db/11/31be66710f1d14526f3588a441efadeb184e1e68458067007b20ead03c59/tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256", size = 2041039, upload_time = "2024-04-17T21:37:05.607Z" }, + { url = "https://files.pythonhosted.org/packages/65/8e/6d7d72b28f22c422cff8beae10ac3c2e4376b9be721ef8167b7eecd1da62/tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66", size = 2220386, upload_time = "2024-04-17T21:37:08.295Z" }, + { url = "https://files.pythonhosted.org/packages/63/90/2890cd096898dcdb596ee172cde40c0f54a9cf43b0736aa260a5501252af/tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153", size = 2530580, upload_time = "2024-04-17T21:37:10.688Z" }, + { url = "https://files.pythonhosted.org/packages/74/d1/f4e1e950adb36675dfd8f9d0f4be644f3f3aaf22a5677a4f5c81282b662e/tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a", size = 2436682, upload_time = "2024-04-17T21:37:12.966Z" }, + { url = "https://files.pythonhosted.org/packages/ed/30/89b321a16c58d233e301ec15072c0d3ed5014825e72da98604cd3ab2fba1/tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95", size = 3693494, upload_time = "2024-04-17T21:37:14.755Z" }, + { url = "https://files.pythonhosted.org/packages/05/40/fa899f32de483500fbc78befd378fd7afba4270f17db707d1a78c0a4ddc3/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266", size = 3566541, upload_time = "2024-04-17T21:37:17.067Z" }, + { url = "https://files.pythonhosted.org/packages/67/14/e7da32ae5fb4971830f1ef335932fae3fa57e76b537e852f146c850aefdf/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52", size = 3430792, upload_time = "2024-04-17T21:37:19.055Z" }, + { url = "https://files.pythonhosted.org/packages/f2/4b/aae61bdb6ab584d2612170801703982ee0e35f8b6adacbeefe5a3b277621/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f", size = 3962812, upload_time = "2024-04-17T21:37:21.008Z" }, + { url = "https://files.pythonhosted.org/packages/0a/b6/f7b7ef89c4da7b20256e6eab23d3835f05d1ca8f451d31c16cbfe3cd9eb6/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840", size = 4024688, upload_time = "2024-04-17T21:37:23.659Z" }, + { url = "https://files.pythonhosted.org/packages/80/54/12047a69f5b382d7ee72044dc89151a2dd0d13b2c9bdcc22654883704d31/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3", size = 3610961, upload_time = "2024-04-17T21:37:26.234Z" }, + { url = "https://files.pythonhosted.org/packages/52/b7/1e8a913d18ac28feeda42d4d2d51781874398fb59cd1c1e2653a4b5742ed/tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea", size = 9631367, upload_time = "2024-04-17T21:37:28.752Z" }, + { url = "https://files.pythonhosted.org/packages/ac/3d/2284f6d99f8f21d09352b88b8cfefa24ab88468d962aeb0aa15c20d76b32/tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c", size = 9950121, upload_time = "2024-04-17T21:37:31.741Z" }, + { url = "https://files.pythonhosted.org/packages/2a/94/ec3369dbc9b7200c14c8c7a1a04c78b7a7398d0c001e1b7d1ffe30eb93a0/tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57", size = 2044069, upload_time = "2024-04-17T21:37:35.672Z" }, + { url = "https://files.pythonhosted.org/packages/0c/97/80bff6937e0c67d30c0facacd4f0bcf4254e581aa4995c73cef8c8640e56/tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a", size = 2214527, upload_time = "2024-04-17T21:37:39.19Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload_time = "2024-11-24T20:12:22.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload_time = "2024-11-24T20:12:19.698Z" }, +] + +[[package]] +name = "transformers" +version = "4.40.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "regex" }, + { name = "requests" }, + { name = "safetensors" }, + { name = "tokenizers" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/ef/d877998c9ab04ecb8eeda495e1c64f2f6bb6724b0634f7d0d6aca2cdc6af/transformers-4.40.2.tar.gz", hash = "sha256:657b6054a2097671398d976ad46e60836e7e15f9ea9551631a96e33cb9240649", size = 7797669, upload_time = "2024-05-06T16:08:02.166Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/23/ba02efa28518557e0cfe0ce5c1170000dd7501ed02ac865fc90cbe3daa93/transformers-4.40.2-py3-none-any.whl", hash = "sha256:71cb94301ec211a2e1d4b8c8d18dcfaa902dfa00a089dceca167a8aa265d6f2d", size = 8999918, upload_time = "2024-05-06T16:07:56.121Z" }, +] + +[[package]] +name = "typer" +version = "0.15.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/1a/5f36851f439884bcfe8539f6a20ff7516e7b60f319bbaf69a90dc35cc2eb/typer-0.15.3.tar.gz", hash = "sha256:818873625d0569653438316567861899f7e9972f2e6e0c16dab608345ced713c", size = 101641, upload_time = "2025-04-28T21:40:59.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/20/9d953de6f4367163d23ec823200eb3ecb0050a2609691e512c8b95827a9b/typer-0.15.3-py3-none-any.whl", hash = "sha256:c86a65ad77ca531f03de08d1b9cb67cd09ad02ddddf4b34745b5008f43b239bd", size = 45253, upload_time = "2025-04-28T21:40:56.269Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload_time = "2025-04-10T14:19:05.416Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload_time = "2025-04-10T14:19:03.967Z" }, +] + +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload_time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload_time = "2025-03-23T13:54:41.845Z" }, +] + +[[package]] +name = "tzlocal" +version = "5.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload_time = "2025-03-05T21:17:41.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d", size = 18026, upload_time = "2025-03-05T21:17:39.857Z" }, +] + +[[package]] +name = "uritemplate" +version = "4.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/5a/4742fdba39cd02a56226815abfa72fe0aa81c33bed16ed045647d6000eba/uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0", size = 273898, upload_time = "2021-10-13T11:15:14.84Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/c0/7461b49cd25aeece13766f02ee576d1db528f1c37ce69aee300e075b485b/uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e", size = 10356, upload_time = "2021-10-13T11:15:12.316Z" }, +] + +[[package]] +name = "urllib3" +version = "1.26.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/e8/6ff5e6bc22095cfc59b6ea711b687e2b7ed4bdb373f7eeec370a97d7392f/urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32", size = 307380, upload_time = "2024-08-29T15:43:11.37Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/cf/8435d5a7159e2a9c83a95896ed596f68cf798005fe107cc655b5c5c14704/urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e", size = 144225, upload_time = "2024-08-29T15:43:08.921Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815, upload_time = "2025-04-19T06:02:50.101Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483, upload_time = "2025-04-19T06:02:48.42Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "httptools" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "uvloop" +version = "0.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741, upload_time = "2024-10-14T23:38:35.489Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/a7/4cf0334105c1160dd6819f3297f8700fda7fc30ab4f61fbf3e725acbc7cc/uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8", size = 1447410, upload_time = "2024-10-14T23:37:33.612Z" }, + { url = "https://files.pythonhosted.org/packages/8c/7c/1517b0bbc2dbe784b563d6ab54f2ef88c890fdad77232c98ed490aa07132/uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0", size = 805476, upload_time = "2024-10-14T23:37:36.11Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ea/0bfae1aceb82a503f358d8d2fa126ca9dbdb2ba9c7866974faec1cb5875c/uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e", size = 3960855, upload_time = "2024-10-14T23:37:37.683Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ca/0864176a649838b838f36d44bf31c451597ab363b60dc9e09c9630619d41/uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb", size = 3973185, upload_time = "2024-10-14T23:37:40.226Z" }, + { url = "https://files.pythonhosted.org/packages/30/bf/08ad29979a936d63787ba47a540de2132169f140d54aa25bc8c3df3e67f4/uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6", size = 3820256, upload_time = "2024-10-14T23:37:42.839Z" }, + { url = "https://files.pythonhosted.org/packages/da/e2/5cf6ef37e3daf2f06e651aae5ea108ad30df3cb269102678b61ebf1fdf42/uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d", size = 3937323, upload_time = "2024-10-14T23:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284, upload_time = "2024-10-14T23:37:47.833Z" }, + { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349, upload_time = "2024-10-14T23:37:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089, upload_time = "2024-10-14T23:37:51.703Z" }, + { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770, upload_time = "2024-10-14T23:37:54.122Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321, upload_time = "2024-10-14T23:37:55.766Z" }, + { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022, upload_time = "2024-10-14T23:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123, upload_time = "2024-10-14T23:38:00.688Z" }, + { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325, upload_time = "2024-10-14T23:38:02.309Z" }, + { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806, upload_time = "2024-10-14T23:38:04.711Z" }, + { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068, upload_time = "2024-10-14T23:38:06.385Z" }, + { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428, upload_time = "2024-10-14T23:38:08.416Z" }, + { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018, upload_time = "2024-10-14T23:38:10.888Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/03/e2/8ed598c42057de7aa5d97c472254af4906ff0a59a66699d426fc9ef795d7/watchfiles-1.0.5.tar.gz", hash = "sha256:b7529b5dcc114679d43827d8c35a07c493ad6f083633d573d81c660abc5979e9", size = 94537, upload_time = "2025-04-08T10:36:26.722Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/f4/41b591f59021786ef517e1cdc3b510383551846703e03f204827854a96f8/watchfiles-1.0.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:237f9be419e977a0f8f6b2e7b0475ababe78ff1ab06822df95d914a945eac827", size = 405336, upload_time = "2025-04-08T10:34:59.359Z" }, + { url = "https://files.pythonhosted.org/packages/ae/06/93789c135be4d6d0e4f63e96eea56dc54050b243eacc28439a26482b5235/watchfiles-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0da39ff917af8b27a4bdc5a97ac577552a38aac0d260a859c1517ea3dc1a7c4", size = 395977, upload_time = "2025-04-08T10:35:00.522Z" }, + { url = "https://files.pythonhosted.org/packages/d2/db/1cd89bd83728ca37054512d4d35ab69b5f12b8aa2ac9be3b0276b3bf06cc/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfcb3952350e95603f232a7a15f6c5f86c5375e46f0bd4ae70d43e3e063c13d", size = 455232, upload_time = "2025-04-08T10:35:01.698Z" }, + { url = "https://files.pythonhosted.org/packages/40/90/d8a4d44ffe960517e487c9c04f77b06b8abf05eb680bed71c82b5f2cad62/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68b2dddba7a4e6151384e252a5632efcaa9bc5d1c4b567f3cb621306b2ca9f63", size = 459151, upload_time = "2025-04-08T10:35:03.358Z" }, + { url = "https://files.pythonhosted.org/packages/6c/da/267a1546f26465dead1719caaba3ce660657f83c9d9c052ba98fb8856e13/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95cf944fcfc394c5f9de794ce581914900f82ff1f855326f25ebcf24d5397418", size = 489054, upload_time = "2025-04-08T10:35:04.561Z" }, + { url = "https://files.pythonhosted.org/packages/b1/31/33850dfd5c6efb6f27d2465cc4c6b27c5a6f5ed53c6fa63b7263cf5f60f6/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf6cd9f83d7c023b1aba15d13f705ca7b7d38675c121f3cc4a6e25bd0857ee9", size = 523955, upload_time = "2025-04-08T10:35:05.786Z" }, + { url = "https://files.pythonhosted.org/packages/09/84/b7d7b67856efb183a421f1416b44ca975cb2ea6c4544827955dfb01f7dc2/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:852de68acd6212cd6d33edf21e6f9e56e5d98c6add46f48244bd479d97c967c6", size = 502234, upload_time = "2025-04-08T10:35:07.187Z" }, + { url = "https://files.pythonhosted.org/packages/71/87/6dc5ec6882a2254cfdd8b0718b684504e737273903b65d7338efaba08b52/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5730f3aa35e646103b53389d5bc77edfbf578ab6dab2e005142b5b80a35ef25", size = 454750, upload_time = "2025-04-08T10:35:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6c/3786c50213451a0ad15170d091570d4a6554976cf0df19878002fc96075a/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:18b3bd29954bc4abeeb4e9d9cf0b30227f0f206c86657674f544cb032296acd5", size = 631591, upload_time = "2025-04-08T10:35:10.64Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b3/1427425ade4e359a0deacce01a47a26024b2ccdb53098f9d64d497f6684c/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba5552a1b07c8edbf197055bc9d518b8f0d98a1c6a73a293bc0726dce068ed01", size = 625370, upload_time = "2025-04-08T10:35:12.412Z" }, + { url = "https://files.pythonhosted.org/packages/15/ba/f60e053b0b5b8145d682672024aa91370a29c5c921a88977eb565de34086/watchfiles-1.0.5-cp311-cp311-win32.whl", hash = "sha256:2f1fefb2e90e89959447bc0420fddd1e76f625784340d64a2f7d5983ef9ad246", size = 277791, upload_time = "2025-04-08T10:35:13.719Z" }, + { url = "https://files.pythonhosted.org/packages/50/ed/7603c4e164225c12c0d4e8700b64bb00e01a6c4eeea372292a3856be33a4/watchfiles-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:b6e76ceb1dd18c8e29c73f47d41866972e891fc4cc7ba014f487def72c1cf096", size = 291622, upload_time = "2025-04-08T10:35:15.071Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c2/99bb7c96b4450e36877fde33690ded286ff555b5a5c1d925855d556968a1/watchfiles-1.0.5-cp311-cp311-win_arm64.whl", hash = "sha256:266710eb6fddc1f5e51843c70e3bebfb0f5e77cf4f27129278c70554104d19ed", size = 283699, upload_time = "2025-04-08T10:35:16.732Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8c/4f0b9bdb75a1bfbd9c78fad7d8854369283f74fe7cf03eb16be77054536d/watchfiles-1.0.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5eb568c2aa6018e26da9e6c86f3ec3fd958cee7f0311b35c2630fa4217d17f2", size = 401511, upload_time = "2025-04-08T10:35:17.956Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4e/7e15825def77f8bd359b6d3f379f0c9dac4eb09dd4ddd58fd7d14127179c/watchfiles-1.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a04059f4923ce4e856b4b4e5e783a70f49d9663d22a4c3b3298165996d1377f", size = 392715, upload_time = "2025-04-08T10:35:19.202Z" }, + { url = "https://files.pythonhosted.org/packages/58/65/b72fb817518728e08de5840d5d38571466c1b4a3f724d190cec909ee6f3f/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e380c89983ce6e6fe2dd1e1921b9952fb4e6da882931abd1824c092ed495dec", size = 454138, upload_time = "2025-04-08T10:35:20.586Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a4/86833fd2ea2e50ae28989f5950b5c3f91022d67092bfec08f8300d8b347b/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fe43139b2c0fdc4a14d4f8d5b5d967f7a2777fd3d38ecf5b1ec669b0d7e43c21", size = 458592, upload_time = "2025-04-08T10:35:21.87Z" }, + { url = "https://files.pythonhosted.org/packages/38/7e/42cb8df8be9a37e50dd3a818816501cf7a20d635d76d6bd65aae3dbbff68/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee0822ce1b8a14fe5a066f93edd20aada932acfe348bede8aa2149f1a4489512", size = 487532, upload_time = "2025-04-08T10:35:23.143Z" }, + { url = "https://files.pythonhosted.org/packages/fc/fd/13d26721c85d7f3df6169d8b495fcac8ab0dc8f0945ebea8845de4681dab/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0dbcb1c2d8f2ab6e0a81c6699b236932bd264d4cef1ac475858d16c403de74d", size = 522865, upload_time = "2025-04-08T10:35:24.702Z" }, + { url = "https://files.pythonhosted.org/packages/a1/0d/7f9ae243c04e96c5455d111e21b09087d0eeaf9a1369e13a01c7d3d82478/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a2014a2b18ad3ca53b1f6c23f8cd94a18ce930c1837bd891262c182640eb40a6", size = 499887, upload_time = "2025-04-08T10:35:25.969Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0f/a257766998e26aca4b3acf2ae97dff04b57071e991a510857d3799247c67/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f6ae86d5cb647bf58f9f655fcf577f713915a5d69057a0371bc257e2553234", size = 454498, upload_time = "2025-04-08T10:35:27.353Z" }, + { url = "https://files.pythonhosted.org/packages/81/79/8bf142575a03e0af9c3d5f8bcae911ee6683ae93a625d349d4ecf4c8f7df/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1a7bac2bde1d661fb31f4d4e8e539e178774b76db3c2c17c4bb3e960a5de07a2", size = 630663, upload_time = "2025-04-08T10:35:28.685Z" }, + { url = "https://files.pythonhosted.org/packages/f1/80/abe2e79f610e45c63a70d271caea90c49bbf93eb00fa947fa9b803a1d51f/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ab626da2fc1ac277bbf752446470b367f84b50295264d2d313e28dc4405d663", size = 625410, upload_time = "2025-04-08T10:35:30.42Z" }, + { url = "https://files.pythonhosted.org/packages/91/6f/bc7fbecb84a41a9069c2c6eb6319f7f7df113adf113e358c57fc1aff7ff5/watchfiles-1.0.5-cp312-cp312-win32.whl", hash = "sha256:9f4571a783914feda92018ef3901dab8caf5b029325b5fe4558c074582815249", size = 277965, upload_time = "2025-04-08T10:35:32.023Z" }, + { url = "https://files.pythonhosted.org/packages/99/a5/bf1c297ea6649ec59e935ab311f63d8af5faa8f0b86993e3282b984263e3/watchfiles-1.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:360a398c3a19672cf93527f7e8d8b60d8275119c5d900f2e184d32483117a705", size = 291693, upload_time = "2025-04-08T10:35:33.225Z" }, + { url = "https://files.pythonhosted.org/packages/7f/7b/fd01087cc21db5c47e5beae507b87965db341cce8a86f9eb12bf5219d4e0/watchfiles-1.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:1a2902ede862969077b97523987c38db28abbe09fb19866e711485d9fbf0d417", size = 283287, upload_time = "2025-04-08T10:35:34.568Z" }, + { url = "https://files.pythonhosted.org/packages/c7/62/435766874b704f39b2fecd8395a29042db2b5ec4005bd34523415e9bd2e0/watchfiles-1.0.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0b289572c33a0deae62daa57e44a25b99b783e5f7aed81b314232b3d3c81a11d", size = 401531, upload_time = "2025-04-08T10:35:35.792Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a6/e52a02c05411b9cb02823e6797ef9bbba0bfaf1bb627da1634d44d8af833/watchfiles-1.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a056c2f692d65bf1e99c41045e3bdcaea3cb9e6b5a53dcaf60a5f3bd95fc9763", size = 392417, upload_time = "2025-04-08T10:35:37.048Z" }, + { url = "https://files.pythonhosted.org/packages/3f/53/c4af6819770455932144e0109d4854437769672d7ad897e76e8e1673435d/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9dca99744991fc9850d18015c4f0438865414e50069670f5f7eee08340d8b40", size = 453423, upload_time = "2025-04-08T10:35:38.357Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d1/8e88df58bbbf819b8bc5cfbacd3c79e01b40261cad0fc84d1e1ebd778a07/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:894342d61d355446d02cd3988a7326af344143eb33a2fd5d38482a92072d9563", size = 458185, upload_time = "2025-04-08T10:35:39.708Z" }, + { url = "https://files.pythonhosted.org/packages/ff/70/fffaa11962dd5429e47e478a18736d4e42bec42404f5ee3b92ef1b87ad60/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab44e1580924d1ffd7b3938e02716d5ad190441965138b4aa1d1f31ea0877f04", size = 486696, upload_time = "2025-04-08T10:35:41.469Z" }, + { url = "https://files.pythonhosted.org/packages/39/db/723c0328e8b3692d53eb273797d9a08be6ffb1d16f1c0ba2bdbdc2a3852c/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6f9367b132078b2ceb8d066ff6c93a970a18c3029cea37bfd7b2d3dd2e5db8f", size = 522327, upload_time = "2025-04-08T10:35:43.289Z" }, + { url = "https://files.pythonhosted.org/packages/cd/05/9fccc43c50c39a76b68343484b9da7b12d42d0859c37c61aec018c967a32/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2e55a9b162e06e3f862fb61e399fe9f05d908d019d87bf5b496a04ef18a970a", size = 499741, upload_time = "2025-04-08T10:35:44.574Z" }, + { url = "https://files.pythonhosted.org/packages/23/14/499e90c37fa518976782b10a18b18db9f55ea73ca14641615056f8194bb3/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0125f91f70e0732a9f8ee01e49515c35d38ba48db507a50c5bdcad9503af5827", size = 453995, upload_time = "2025-04-08T10:35:46.336Z" }, + { url = "https://files.pythonhosted.org/packages/61/d9/f75d6840059320df5adecd2c687fbc18960a7f97b55c300d20f207d48aef/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:13bb21f8ba3248386337c9fa51c528868e6c34a707f729ab041c846d52a0c69a", size = 629693, upload_time = "2025-04-08T10:35:48.161Z" }, + { url = "https://files.pythonhosted.org/packages/fc/17/180ca383f5061b61406477218c55d66ec118e6c0c51f02d8142895fcf0a9/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:839ebd0df4a18c5b3c1b890145b5a3f5f64063c2a0d02b13c76d78fe5de34936", size = 624677, upload_time = "2025-04-08T10:35:49.65Z" }, + { url = "https://files.pythonhosted.org/packages/bf/15/714d6ef307f803f236d69ee9d421763707899d6298d9f3183e55e366d9af/watchfiles-1.0.5-cp313-cp313-win32.whl", hash = "sha256:4a8ec1e4e16e2d5bafc9ba82f7aaecfeec990ca7cd27e84fb6f191804ed2fcfc", size = 277804, upload_time = "2025-04-08T10:35:51.093Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b4/c57b99518fadf431f3ef47a610839e46e5f8abf9814f969859d1c65c02c7/watchfiles-1.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:f436601594f15bf406518af922a89dcaab416568edb6f65c4e5bbbad1ea45c11", size = 291087, upload_time = "2025-04-08T10:35:52.458Z" }, +] + +[[package]] +name = "websockets" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload_time = "2025-03-05T20:03:41.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload_time = "2025-03-05T20:01:56.276Z" }, + { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload_time = "2025-03-05T20:01:57.563Z" }, + { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload_time = "2025-03-05T20:01:59.063Z" }, + { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload_time = "2025-03-05T20:02:00.305Z" }, + { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883, upload_time = "2025-03-05T20:02:03.148Z" }, + { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload_time = "2025-03-05T20:02:05.29Z" }, + { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload_time = "2025-03-05T20:02:07.458Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958, upload_time = "2025-03-05T20:02:09.842Z" }, + { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload_time = "2025-03-05T20:02:11.968Z" }, + { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388, upload_time = "2025-03-05T20:02:13.32Z" }, + { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828, upload_time = "2025-03-05T20:02:14.585Z" }, + { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload_time = "2025-03-05T20:02:16.706Z" }, + { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload_time = "2025-03-05T20:02:18.832Z" }, + { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload_time = "2025-03-05T20:02:20.187Z" }, + { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload_time = "2025-03-05T20:02:22.286Z" }, + { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096, upload_time = "2025-03-05T20:02:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload_time = "2025-03-05T20:02:25.669Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload_time = "2025-03-05T20:02:26.99Z" }, + { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165, upload_time = "2025-03-05T20:02:30.291Z" }, + { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload_time = "2025-03-05T20:02:31.634Z" }, + { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395, upload_time = "2025-03-05T20:02:33.017Z" }, + { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841, upload_time = "2025-03-05T20:02:34.498Z" }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload_time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload_time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload_time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload_time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload_time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload_time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload_time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload_time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload_time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload_time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload_time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload_time = "2025-03-05T20:03:39.41Z" }, +] + +[[package]] +name = "werkzeug" +version = "3.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/69/83029f1f6300c5fb2471d621ab06f6ec6b3324685a2ce0f9777fd4a8b71e/werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746", size = 806925, upload_time = "2024-11-08T15:52:18.093Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", size = 224498, upload_time = "2024-11-08T15:52:16.132Z" }, +] + +[[package]] +name = "wheel" +version = "0.45.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload_time = "2024-11-23T00:18:23.513Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload_time = "2024-11-23T00:18:21.207Z" }, +] + +[[package]] +name = "wrapt" +version = "1.14.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/eb/e06e77394d6cf09977d92bff310cb0392930c08a338f99af6066a5a98f92/wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d", size = 50890, upload_time = "2022-05-02T05:28:31.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/f9/8c078b4973604cd968b23eb3dff52028b5c48f2a02c4f1f975f4d5e344d1/wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55", size = 35432, upload_time = "2023-10-07T08:29:58.387Z" }, + { url = "https://files.pythonhosted.org/packages/6e/79/aec8185eefe20e8f49e5adeb0c2e20e016d5916d10872c17705ddac41be2/wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9", size = 36219, upload_time = "2023-10-07T08:30:01.249Z" }, + { url = "https://files.pythonhosted.org/packages/d1/71/8d68004e5d5a676177342a56808af51e1df3b0e54b203e3295a8cd96b53b/wrapt-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335", size = 78509, upload_time = "2023-10-07T08:30:03.544Z" }, + { url = "https://files.pythonhosted.org/packages/5a/27/604d6ad71fe5935446df1b7512d491b47fe2aef8c95e9813d03d78024a28/wrapt-1.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9", size = 70972, upload_time = "2023-10-07T08:30:05.619Z" }, + { url = "https://files.pythonhosted.org/packages/7f/1b/e0439eec0db6520968c751bc7e12480bb80bb8d939190e0e55ed762f3c7a/wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8", size = 78402, upload_time = "2023-10-07T08:30:07.408Z" }, + { url = "https://files.pythonhosted.org/packages/b9/45/2cc612ff64061d4416baf8d0daf27bea7f79f0097638ddc2af51a3e647f3/wrapt-1.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf", size = 83373, upload_time = "2023-10-07T08:30:09.317Z" }, + { url = "https://files.pythonhosted.org/packages/ad/b7/332692b8d0387922da0f1323ad36a14e365911def3c78ea0d102f83ac592/wrapt-1.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a", size = 76299, upload_time = "2023-10-07T08:30:10.723Z" }, + { url = "https://files.pythonhosted.org/packages/f2/31/cbce966b6760e62d005c237961e839a755bf0c907199248394e2ee03ab05/wrapt-1.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be", size = 83361, upload_time = "2023-10-07T08:30:11.98Z" }, + { url = "https://files.pythonhosted.org/packages/9a/aa/ab46fb18072b86e87e0965a402f8723217e8c0312d1b3e2a91308df924ab/wrapt-1.14.1-cp311-cp311-win32.whl", hash = "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204", size = 33454, upload_time = "2023-10-07T08:30:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/ba/7e/14113996bc6ee68eb987773b4139c87afd3ceff60e27e37648aa5eb2798a/wrapt-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224", size = 35616, upload_time = "2023-10-07T08:30:14.868Z" }, +] + +[[package]] +name = "xxhash" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/5e/d6e5258d69df8b4ed8c83b6664f2b47d30d2dec551a29ad72a6c69eafd31/xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f", size = 84241, upload_time = "2024-08-17T09:20:38.972Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/c7/afed0f131fbda960ff15eee7f304fa0eeb2d58770fade99897984852ef23/xxhash-3.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02c2e816896dc6f85922ced60097bcf6f008dedfc5073dcba32f9c8dd786f3c1", size = 31969, upload_time = "2024-08-17T09:18:00.852Z" }, + { url = "https://files.pythonhosted.org/packages/8c/0c/7c3bc6d87e5235672fcc2fb42fd5ad79fe1033925f71bf549ee068c7d1ca/xxhash-3.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6027dcd885e21581e46d3c7f682cfb2b870942feeed58a21c29583512c3f09f8", size = 30800, upload_time = "2024-08-17T09:18:01.863Z" }, + { url = "https://files.pythonhosted.org/packages/04/9e/01067981d98069eec1c20201f8c145367698e9056f8bc295346e4ea32dd1/xxhash-3.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1308fa542bbdbf2fa85e9e66b1077eea3a88bef38ee8a06270b4298a7a62a166", size = 221566, upload_time = "2024-08-17T09:18:03.461Z" }, + { url = "https://files.pythonhosted.org/packages/d4/09/d4996de4059c3ce5342b6e1e6a77c9d6c91acce31f6ed979891872dd162b/xxhash-3.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c28b2fdcee797e1c1961cd3bcd3d545cab22ad202c846235197935e1df2f8ef7", size = 201214, upload_time = "2024-08-17T09:18:05.616Z" }, + { url = "https://files.pythonhosted.org/packages/62/f5/6d2dc9f8d55a7ce0f5e7bfef916e67536f01b85d32a9fbf137d4cadbee38/xxhash-3.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:924361811732ddad75ff23e90efd9ccfda4f664132feecb90895bade6a1b4623", size = 429433, upload_time = "2024-08-17T09:18:06.957Z" }, + { url = "https://files.pythonhosted.org/packages/d9/72/9256303f10e41ab004799a4aa74b80b3c5977d6383ae4550548b24bd1971/xxhash-3.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89997aa1c4b6a5b1e5b588979d1da048a3c6f15e55c11d117a56b75c84531f5a", size = 194822, upload_time = "2024-08-17T09:18:08.331Z" }, + { url = "https://files.pythonhosted.org/packages/34/92/1a3a29acd08248a34b0e6a94f4e0ed9b8379a4ff471f1668e4dce7bdbaa8/xxhash-3.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:685c4f4e8c59837de103344eb1c8a3851f670309eb5c361f746805c5471b8c88", size = 208538, upload_time = "2024-08-17T09:18:10.332Z" }, + { url = "https://files.pythonhosted.org/packages/53/ad/7fa1a109663366de42f724a1cdb8e796a260dbac45047bce153bc1e18abf/xxhash-3.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbd2ecfbfee70bc1a4acb7461fa6af7748ec2ab08ac0fa298f281c51518f982c", size = 216953, upload_time = "2024-08-17T09:18:11.707Z" }, + { url = "https://files.pythonhosted.org/packages/35/02/137300e24203bf2b2a49b48ce898ecce6fd01789c0fcd9c686c0a002d129/xxhash-3.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25b5a51dc3dfb20a10833c8eee25903fd2e14059e9afcd329c9da20609a307b2", size = 203594, upload_time = "2024-08-17T09:18:13.799Z" }, + { url = "https://files.pythonhosted.org/packages/23/03/aeceb273933d7eee248c4322b98b8e971f06cc3880e5f7602c94e5578af5/xxhash-3.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a8fb786fb754ef6ff8c120cb96629fb518f8eb5a61a16aac3a979a9dbd40a084", size = 210971, upload_time = "2024-08-17T09:18:15.824Z" }, + { url = "https://files.pythonhosted.org/packages/e3/64/ed82ec09489474cbb35c716b189ddc1521d8b3de12b1b5ab41ce7f70253c/xxhash-3.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a905ad00ad1e1c34fe4e9d7c1d949ab09c6fa90c919860c1534ff479f40fd12d", size = 415050, upload_time = "2024-08-17T09:18:17.142Z" }, + { url = "https://files.pythonhosted.org/packages/71/43/6db4c02dcb488ad4e03bc86d70506c3d40a384ee73c9b5c93338eb1f3c23/xxhash-3.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:963be41bcd49f53af6d795f65c0da9b4cc518c0dd9c47145c98f61cb464f4839", size = 192216, upload_time = "2024-08-17T09:18:18.779Z" }, + { url = "https://files.pythonhosted.org/packages/22/6d/db4abec29e7a567455344433d095fdb39c97db6955bb4a2c432e486b4d28/xxhash-3.5.0-cp311-cp311-win32.whl", hash = "sha256:109b436096d0a2dd039c355fa3414160ec4d843dfecc64a14077332a00aeb7da", size = 30120, upload_time = "2024-08-17T09:18:20.009Z" }, + { url = "https://files.pythonhosted.org/packages/52/1c/fa3b61c0cf03e1da4767213672efe186b1dfa4fc901a4a694fb184a513d1/xxhash-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:b702f806693201ad6c0a05ddbbe4c8f359626d0b3305f766077d51388a6bac58", size = 30003, upload_time = "2024-08-17T09:18:21.052Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8e/9e6fc572acf6e1cc7ccb01973c213f895cb8668a9d4c2b58a99350da14b7/xxhash-3.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:c4dcb4120d0cc3cc448624147dba64e9021b278c63e34a38789b688fd0da9bf3", size = 26777, upload_time = "2024-08-17T09:18:22.809Z" }, + { url = "https://files.pythonhosted.org/packages/07/0e/1bfce2502c57d7e2e787600b31c83535af83746885aa1a5f153d8c8059d6/xxhash-3.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:14470ace8bd3b5d51318782cd94e6f94431974f16cb3b8dc15d52f3b69df8e00", size = 31969, upload_time = "2024-08-17T09:18:24.025Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d6/8ca450d6fe5b71ce521b4e5db69622383d039e2b253e9b2f24f93265b52c/xxhash-3.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59aa1203de1cb96dbeab595ded0ad0c0056bb2245ae11fac11c0ceea861382b9", size = 30787, upload_time = "2024-08-17T09:18:25.318Z" }, + { url = "https://files.pythonhosted.org/packages/5b/84/de7c89bc6ef63d750159086a6ada6416cc4349eab23f76ab870407178b93/xxhash-3.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08424f6648526076e28fae6ea2806c0a7d504b9ef05ae61d196d571e5c879c84", size = 220959, upload_time = "2024-08-17T09:18:26.518Z" }, + { url = "https://files.pythonhosted.org/packages/fe/86/51258d3e8a8545ff26468c977101964c14d56a8a37f5835bc0082426c672/xxhash-3.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61a1ff00674879725b194695e17f23d3248998b843eb5e933007ca743310f793", size = 200006, upload_time = "2024-08-17T09:18:27.905Z" }, + { url = "https://files.pythonhosted.org/packages/02/0a/96973bd325412feccf23cf3680fd2246aebf4b789122f938d5557c54a6b2/xxhash-3.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f2c61bee5844d41c3eb015ac652a0229e901074951ae48581d58bfb2ba01be", size = 428326, upload_time = "2024-08-17T09:18:29.335Z" }, + { url = "https://files.pythonhosted.org/packages/11/a7/81dba5010f7e733de88af9555725146fc133be97ce36533867f4c7e75066/xxhash-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d32a592cac88d18cc09a89172e1c32d7f2a6e516c3dfde1b9adb90ab5df54a6", size = 194380, upload_time = "2024-08-17T09:18:30.706Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7d/f29006ab398a173f4501c0e4977ba288f1c621d878ec217b4ff516810c04/xxhash-3.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70dabf941dede727cca579e8c205e61121afc9b28516752fd65724be1355cc90", size = 207934, upload_time = "2024-08-17T09:18:32.133Z" }, + { url = "https://files.pythonhosted.org/packages/8a/6e/6e88b8f24612510e73d4d70d9b0c7dff62a2e78451b9f0d042a5462c8d03/xxhash-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e5d0ddaca65ecca9c10dcf01730165fd858533d0be84c75c327487c37a906a27", size = 216301, upload_time = "2024-08-17T09:18:33.474Z" }, + { url = "https://files.pythonhosted.org/packages/af/51/7862f4fa4b75a25c3b4163c8a873f070532fe5f2d3f9b3fc869c8337a398/xxhash-3.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e5b5e16c5a480fe5f59f56c30abdeba09ffd75da8d13f6b9b6fd224d0b4d0a2", size = 203351, upload_time = "2024-08-17T09:18:34.889Z" }, + { url = "https://files.pythonhosted.org/packages/22/61/8d6a40f288f791cf79ed5bb113159abf0c81d6efb86e734334f698eb4c59/xxhash-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149b7914451eb154b3dfaa721315117ea1dac2cc55a01bfbd4df7c68c5dd683d", size = 210294, upload_time = "2024-08-17T09:18:36.355Z" }, + { url = "https://files.pythonhosted.org/packages/17/02/215c4698955762d45a8158117190261b2dbefe9ae7e5b906768c09d8bc74/xxhash-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:eade977f5c96c677035ff39c56ac74d851b1cca7d607ab3d8f23c6b859379cab", size = 414674, upload_time = "2024-08-17T09:18:38.536Z" }, + { url = "https://files.pythonhosted.org/packages/31/5c/b7a8db8a3237cff3d535261325d95de509f6a8ae439a5a7a4ffcff478189/xxhash-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa9f547bd98f5553d03160967866a71056a60960be00356a15ecc44efb40ba8e", size = 192022, upload_time = "2024-08-17T09:18:40.138Z" }, + { url = "https://files.pythonhosted.org/packages/78/e3/dd76659b2811b3fd06892a8beb850e1996b63e9235af5a86ea348f053e9e/xxhash-3.5.0-cp312-cp312-win32.whl", hash = "sha256:f7b58d1fd3551b8c80a971199543379be1cee3d0d409e1f6d8b01c1a2eebf1f8", size = 30170, upload_time = "2024-08-17T09:18:42.163Z" }, + { url = "https://files.pythonhosted.org/packages/d9/6b/1c443fe6cfeb4ad1dcf231cdec96eb94fb43d6498b4469ed8b51f8b59a37/xxhash-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:fa0cafd3a2af231b4e113fba24a65d7922af91aeb23774a8b78228e6cd785e3e", size = 30040, upload_time = "2024-08-17T09:18:43.699Z" }, + { url = "https://files.pythonhosted.org/packages/0f/eb/04405305f290173acc0350eba6d2f1a794b57925df0398861a20fbafa415/xxhash-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:586886c7e89cb9828bcd8a5686b12e161368e0064d040e225e72607b43858ba2", size = 26796, upload_time = "2024-08-17T09:18:45.29Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b8/e4b3ad92d249be5c83fa72916c9091b0965cb0faeff05d9a0a3870ae6bff/xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6", size = 31795, upload_time = "2024-08-17T09:18:46.813Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d8/b3627a0aebfbfa4c12a41e22af3742cf08c8ea84f5cc3367b5de2d039cce/xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5", size = 30792, upload_time = "2024-08-17T09:18:47.862Z" }, + { url = "https://files.pythonhosted.org/packages/c3/cc/762312960691da989c7cd0545cb120ba2a4148741c6ba458aa723c00a3f8/xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc", size = 220950, upload_time = "2024-08-17T09:18:49.06Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e9/cc266f1042c3c13750e86a535496b58beb12bf8c50a915c336136f6168dc/xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3", size = 199980, upload_time = "2024-08-17T09:18:50.445Z" }, + { url = "https://files.pythonhosted.org/packages/bf/85/a836cd0dc5cc20376de26b346858d0ac9656f8f730998ca4324921a010b9/xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c", size = 428324, upload_time = "2024-08-17T09:18:51.988Z" }, + { url = "https://files.pythonhosted.org/packages/b4/0e/15c243775342ce840b9ba34aceace06a1148fa1630cd8ca269e3223987f5/xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb", size = 194370, upload_time = "2024-08-17T09:18:54.164Z" }, + { url = "https://files.pythonhosted.org/packages/87/a1/b028bb02636dfdc190da01951d0703b3d904301ed0ef6094d948983bef0e/xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f", size = 207911, upload_time = "2024-08-17T09:18:55.509Z" }, + { url = "https://files.pythonhosted.org/packages/80/d5/73c73b03fc0ac73dacf069fdf6036c9abad82de0a47549e9912c955ab449/xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7", size = 216352, upload_time = "2024-08-17T09:18:57.073Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2a/5043dba5ddbe35b4fe6ea0a111280ad9c3d4ba477dd0f2d1fe1129bda9d0/xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326", size = 203410, upload_time = "2024-08-17T09:18:58.54Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b2/9a8ded888b7b190aed75b484eb5c853ddd48aa2896e7b59bbfbce442f0a1/xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf", size = 210322, upload_time = "2024-08-17T09:18:59.943Z" }, + { url = "https://files.pythonhosted.org/packages/98/62/440083fafbc917bf3e4b67c2ade621920dd905517e85631c10aac955c1d2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7", size = 414725, upload_time = "2024-08-17T09:19:01.332Z" }, + { url = "https://files.pythonhosted.org/packages/75/db/009206f7076ad60a517e016bb0058381d96a007ce3f79fa91d3010f49cc2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c", size = 192070, upload_time = "2024-08-17T09:19:03.007Z" }, + { url = "https://files.pythonhosted.org/packages/1f/6d/c61e0668943a034abc3a569cdc5aeae37d686d9da7e39cf2ed621d533e36/xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637", size = 30172, upload_time = "2024-08-17T09:19:04.355Z" }, + { url = "https://files.pythonhosted.org/packages/96/14/8416dce965f35e3d24722cdf79361ae154fa23e2ab730e5323aa98d7919e/xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43", size = 30041, upload_time = "2024-08-17T09:19:05.435Z" }, + { url = "https://files.pythonhosted.org/packages/27/ee/518b72faa2073f5aa8e3262408d284892cb79cf2754ba0c3a5870645ef73/xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b", size = 26801, upload_time = "2024-08-17T09:19:06.547Z" }, +] + +[[package]] +name = "yarl" +version = "1.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/51/c0edba5219027f6eab262e139f73e2417b0f4efffa23bf562f6e18f76ca5/yarl-1.20.0.tar.gz", hash = "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307", size = 185258, upload_time = "2025-04-17T00:45:14.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/82/a59d8e21b20ffc836775fa7daedac51d16bb8f3010c4fcb495c4496aa922/yarl-1.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fdb5204d17cb32b2de2d1e21c7461cabfacf17f3645e4b9039f210c5d3378bf3", size = 145178, upload_time = "2025-04-17T00:42:04.511Z" }, + { url = "https://files.pythonhosted.org/packages/ba/81/315a3f6f95947cfbf37c92d6fbce42a1a6207b6c38e8c2b452499ec7d449/yarl-1.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eaddd7804d8e77d67c28d154ae5fab203163bd0998769569861258e525039d2a", size = 96859, upload_time = "2025-04-17T00:42:06.43Z" }, + { url = "https://files.pythonhosted.org/packages/ad/17/9b64e575583158551b72272a1023cdbd65af54fe13421d856b2850a6ddb7/yarl-1.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:634b7ba6b4a85cf67e9df7c13a7fb2e44fa37b5d34501038d174a63eaac25ee2", size = 94647, upload_time = "2025-04-17T00:42:07.976Z" }, + { url = "https://files.pythonhosted.org/packages/2c/29/8f291e7922a58a21349683f6120a85701aeefaa02e9f7c8a2dc24fe3f431/yarl-1.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d409e321e4addf7d97ee84162538c7258e53792eb7c6defd0c33647d754172e", size = 355788, upload_time = "2025-04-17T00:42:09.902Z" }, + { url = "https://files.pythonhosted.org/packages/26/6d/b4892c80b805c42c228c6d11e03cafabf81662d371b0853e7f0f513837d5/yarl-1.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ea52f7328a36960ba3231c6677380fa67811b414798a6e071c7085c57b6d20a9", size = 344613, upload_time = "2025-04-17T00:42:11.768Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0e/517aa28d3f848589bae9593717b063a544b86ba0a807d943c70f48fcf3bb/yarl-1.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8703517b924463994c344dcdf99a2d5ce9eca2b6882bb640aa555fb5efc706a", size = 370953, upload_time = "2025-04-17T00:42:13.983Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9b/5bd09d2f1ad6e6f7c2beae9e50db78edd2cca4d194d227b958955573e240/yarl-1.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:077989b09ffd2f48fb2d8f6a86c5fef02f63ffe6b1dd4824c76de7bb01e4f2e2", size = 369204, upload_time = "2025-04-17T00:42:16.386Z" }, + { url = "https://files.pythonhosted.org/packages/9c/85/d793a703cf4bd0d4cd04e4b13cc3d44149470f790230430331a0c1f52df5/yarl-1.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0acfaf1da020253f3533526e8b7dd212838fdc4109959a2c53cafc6db611bff2", size = 358108, upload_time = "2025-04-17T00:42:18.622Z" }, + { url = "https://files.pythonhosted.org/packages/6f/54/b6c71e13549c1f6048fbc14ce8d930ac5fb8bafe4f1a252e621a24f3f1f9/yarl-1.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4230ac0b97ec5eeb91d96b324d66060a43fd0d2a9b603e3327ed65f084e41f8", size = 346610, upload_time = "2025-04-17T00:42:20.9Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1a/d6087d58bdd0d8a2a37bbcdffac9d9721af6ebe50d85304d9f9b57dfd862/yarl-1.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a6a1e6ae21cdd84011c24c78d7a126425148b24d437b5702328e4ba640a8902", size = 365378, upload_time = "2025-04-17T00:42:22.926Z" }, + { url = "https://files.pythonhosted.org/packages/02/84/e25ddff4cbc001dbc4af76f8d41a3e23818212dd1f0a52044cbc60568872/yarl-1.20.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:86de313371ec04dd2531f30bc41a5a1a96f25a02823558ee0f2af0beaa7ca791", size = 356919, upload_time = "2025-04-17T00:42:25.145Z" }, + { url = "https://files.pythonhosted.org/packages/04/76/898ae362353bf8f64636495d222c8014c8e5267df39b1a9fe1e1572fb7d0/yarl-1.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dd59c9dd58ae16eaa0f48c3d0cbe6be8ab4dc7247c3ff7db678edecbaf59327f", size = 364248, upload_time = "2025-04-17T00:42:27.475Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b0/9d9198d83a622f1c40fdbf7bd13b224a6979f2e1fc2cf50bfb1d8773c495/yarl-1.20.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a0bc5e05f457b7c1994cc29e83b58f540b76234ba6b9648a4971ddc7f6aa52da", size = 378418, upload_time = "2025-04-17T00:42:29.333Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ce/1f50c1cc594cf5d3f5bf4a9b616fca68680deaec8ad349d928445ac52eb8/yarl-1.20.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c9471ca18e6aeb0e03276b5e9b27b14a54c052d370a9c0c04a68cefbd1455eb4", size = 383850, upload_time = "2025-04-17T00:42:31.668Z" }, + { url = "https://files.pythonhosted.org/packages/89/1e/a59253a87b35bfec1a25bb5801fb69943330b67cfd266278eb07e0609012/yarl-1.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40ed574b4df723583a26c04b298b283ff171bcc387bc34c2683235e2487a65a5", size = 381218, upload_time = "2025-04-17T00:42:33.523Z" }, + { url = "https://files.pythonhosted.org/packages/85/b0/26f87df2b3044b0ef1a7cf66d321102bdca091db64c5ae853fcb2171c031/yarl-1.20.0-cp311-cp311-win32.whl", hash = "sha256:db243357c6c2bf3cd7e17080034ade668d54ce304d820c2a58514a4e51d0cfd6", size = 86606, upload_time = "2025-04-17T00:42:35.873Z" }, + { url = "https://files.pythonhosted.org/packages/33/46/ca335c2e1f90446a77640a45eeb1cd8f6934f2c6e4df7db0f0f36ef9f025/yarl-1.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c12cd754d9dbd14204c328915e23b0c361b88f3cffd124129955e60a4fbfcfb", size = 93374, upload_time = "2025-04-17T00:42:37.586Z" }, + { url = "https://files.pythonhosted.org/packages/c3/e8/3efdcb83073df978bb5b1a9cc0360ce596680e6c3fac01f2a994ccbb8939/yarl-1.20.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f", size = 147089, upload_time = "2025-04-17T00:42:39.602Z" }, + { url = "https://files.pythonhosted.org/packages/60/c3/9e776e98ea350f76f94dd80b408eaa54e5092643dbf65fd9babcffb60509/yarl-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e", size = 97706, upload_time = "2025-04-17T00:42:41.469Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/45cdfb64a3b855ce074ae607b9fc40bc82e7613b94e7612b030255c93a09/yarl-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e", size = 95719, upload_time = "2025-04-17T00:42:43.666Z" }, + { url = "https://files.pythonhosted.org/packages/2d/4e/929633b249611eeed04e2f861a14ed001acca3ef9ec2a984a757b1515889/yarl-1.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33", size = 343972, upload_time = "2025-04-17T00:42:45.391Z" }, + { url = "https://files.pythonhosted.org/packages/49/fd/047535d326c913f1a90407a3baf7ff535b10098611eaef2c527e32e81ca1/yarl-1.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58", size = 339639, upload_time = "2025-04-17T00:42:47.552Z" }, + { url = "https://files.pythonhosted.org/packages/48/2f/11566f1176a78f4bafb0937c0072410b1b0d3640b297944a6a7a556e1d0b/yarl-1.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f", size = 353745, upload_time = "2025-04-17T00:42:49.406Z" }, + { url = "https://files.pythonhosted.org/packages/26/17/07dfcf034d6ae8837b33988be66045dd52f878dfb1c4e8f80a7343f677be/yarl-1.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae", size = 354178, upload_time = "2025-04-17T00:42:51.588Z" }, + { url = "https://files.pythonhosted.org/packages/15/45/212604d3142d84b4065d5f8cab6582ed3d78e4cc250568ef2a36fe1cf0a5/yarl-1.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018", size = 349219, upload_time = "2025-04-17T00:42:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e0/a10b30f294111c5f1c682461e9459935c17d467a760c21e1f7db400ff499/yarl-1.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672", size = 337266, upload_time = "2025-04-17T00:42:55.49Z" }, + { url = "https://files.pythonhosted.org/packages/33/a6/6efa1d85a675d25a46a167f9f3e80104cde317dfdf7f53f112ae6b16a60a/yarl-1.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8", size = 360873, upload_time = "2025-04-17T00:42:57.895Z" }, + { url = "https://files.pythonhosted.org/packages/77/67/c8ab718cb98dfa2ae9ba0f97bf3cbb7d45d37f13fe1fbad25ac92940954e/yarl-1.20.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7", size = 360524, upload_time = "2025-04-17T00:43:00.094Z" }, + { url = "https://files.pythonhosted.org/packages/bd/e8/c3f18660cea1bc73d9f8a2b3ef423def8dadbbae6c4afabdb920b73e0ead/yarl-1.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594", size = 365370, upload_time = "2025-04-17T00:43:02.242Z" }, + { url = "https://files.pythonhosted.org/packages/c9/99/33f3b97b065e62ff2d52817155a89cfa030a1a9b43fee7843ef560ad9603/yarl-1.20.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6", size = 373297, upload_time = "2025-04-17T00:43:04.189Z" }, + { url = "https://files.pythonhosted.org/packages/3d/89/7519e79e264a5f08653d2446b26d4724b01198a93a74d2e259291d538ab1/yarl-1.20.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1", size = 378771, upload_time = "2025-04-17T00:43:06.609Z" }, + { url = "https://files.pythonhosted.org/packages/3a/58/6c460bbb884abd2917c3eef6f663a4a873f8dc6f498561fc0ad92231c113/yarl-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b", size = 375000, upload_time = "2025-04-17T00:43:09.01Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/dd7ed1aa23fea996834278d7ff178f215b24324ee527df53d45e34d21d28/yarl-1.20.0-cp312-cp312-win32.whl", hash = "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64", size = 86355, upload_time = "2025-04-17T00:43:11.311Z" }, + { url = "https://files.pythonhosted.org/packages/ca/c6/333fe0338305c0ac1c16d5aa7cc4841208d3252bbe62172e0051006b5445/yarl-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c", size = 92904, upload_time = "2025-04-17T00:43:13.087Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6f/514c9bff2900c22a4f10e06297714dbaf98707143b37ff0bcba65a956221/yarl-1.20.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f", size = 145030, upload_time = "2025-04-17T00:43:15.083Z" }, + { url = "https://files.pythonhosted.org/packages/4e/9d/f88da3fa319b8c9c813389bfb3463e8d777c62654c7168e580a13fadff05/yarl-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3", size = 96894, upload_time = "2025-04-17T00:43:17.372Z" }, + { url = "https://files.pythonhosted.org/packages/cd/57/92e83538580a6968b2451d6c89c5579938a7309d4785748e8ad42ddafdce/yarl-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d", size = 94457, upload_time = "2025-04-17T00:43:19.431Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ee/7ee43bd4cf82dddd5da97fcaddb6fa541ab81f3ed564c42f146c83ae17ce/yarl-1.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0", size = 343070, upload_time = "2025-04-17T00:43:21.426Z" }, + { url = "https://files.pythonhosted.org/packages/4a/12/b5eccd1109e2097bcc494ba7dc5de156e41cf8309fab437ebb7c2b296ce3/yarl-1.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501", size = 337739, upload_time = "2025-04-17T00:43:23.634Z" }, + { url = "https://files.pythonhosted.org/packages/7d/6b/0eade8e49af9fc2585552f63c76fa59ef469c724cc05b29519b19aa3a6d5/yarl-1.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc", size = 351338, upload_time = "2025-04-17T00:43:25.695Z" }, + { url = "https://files.pythonhosted.org/packages/45/cb/aaaa75d30087b5183c7b8a07b4fb16ae0682dd149a1719b3a28f54061754/yarl-1.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d", size = 353636, upload_time = "2025-04-17T00:43:27.876Z" }, + { url = "https://files.pythonhosted.org/packages/98/9d/d9cb39ec68a91ba6e66fa86d97003f58570327d6713833edf7ad6ce9dde5/yarl-1.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0", size = 348061, upload_time = "2025-04-17T00:43:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/72/6b/103940aae893d0cc770b4c36ce80e2ed86fcb863d48ea80a752b8bda9303/yarl-1.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a", size = 334150, upload_time = "2025-04-17T00:43:31.742Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b2/986bd82aa222c3e6b211a69c9081ba46484cffa9fab2a5235e8d18ca7a27/yarl-1.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2", size = 362207, upload_time = "2025-04-17T00:43:34.099Z" }, + { url = "https://files.pythonhosted.org/packages/14/7c/63f5922437b873795d9422cbe7eb2509d4b540c37ae5548a4bb68fd2c546/yarl-1.20.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9", size = 361277, upload_time = "2025-04-17T00:43:36.202Z" }, + { url = "https://files.pythonhosted.org/packages/81/83/450938cccf732466953406570bdb42c62b5ffb0ac7ac75a1f267773ab5c8/yarl-1.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5", size = 364990, upload_time = "2025-04-17T00:43:38.551Z" }, + { url = "https://files.pythonhosted.org/packages/b4/de/af47d3a47e4a833693b9ec8e87debb20f09d9fdc9139b207b09a3e6cbd5a/yarl-1.20.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877", size = 374684, upload_time = "2025-04-17T00:43:40.481Z" }, + { url = "https://files.pythonhosted.org/packages/62/0b/078bcc2d539f1faffdc7d32cb29a2d7caa65f1a6f7e40795d8485db21851/yarl-1.20.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e", size = 382599, upload_time = "2025-04-17T00:43:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/74/a9/4fdb1a7899f1fb47fd1371e7ba9e94bff73439ce87099d5dd26d285fffe0/yarl-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384", size = 378573, upload_time = "2025-04-17T00:43:44.797Z" }, + { url = "https://files.pythonhosted.org/packages/fd/be/29f5156b7a319e4d2e5b51ce622b4dfb3aa8d8204cd2a8a339340fbfad40/yarl-1.20.0-cp313-cp313-win32.whl", hash = "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62", size = 86051, upload_time = "2025-04-17T00:43:47.076Z" }, + { url = "https://files.pythonhosted.org/packages/52/56/05fa52c32c301da77ec0b5f63d2d9605946fe29defacb2a7ebd473c23b81/yarl-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c", size = 92742, upload_time = "2025-04-17T00:43:49.193Z" }, + { url = "https://files.pythonhosted.org/packages/d4/2f/422546794196519152fc2e2f475f0e1d4d094a11995c81a465faf5673ffd/yarl-1.20.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051", size = 163575, upload_time = "2025-04-17T00:43:51.533Z" }, + { url = "https://files.pythonhosted.org/packages/90/fc/67c64ddab6c0b4a169d03c637fb2d2a212b536e1989dec8e7e2c92211b7f/yarl-1.20.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d", size = 106121, upload_time = "2025-04-17T00:43:53.506Z" }, + { url = "https://files.pythonhosted.org/packages/6d/00/29366b9eba7b6f6baed7d749f12add209b987c4cfbfa418404dbadc0f97c/yarl-1.20.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229", size = 103815, upload_time = "2025-04-17T00:43:55.41Z" }, + { url = "https://files.pythonhosted.org/packages/28/f4/a2a4c967c8323c03689383dff73396281ced3b35d0ed140580825c826af7/yarl-1.20.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1", size = 408231, upload_time = "2025-04-17T00:43:57.825Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a1/66f7ffc0915877d726b70cc7a896ac30b6ac5d1d2760613603b022173635/yarl-1.20.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb", size = 390221, upload_time = "2025-04-17T00:44:00.526Z" }, + { url = "https://files.pythonhosted.org/packages/41/15/cc248f0504610283271615e85bf38bc014224122498c2016d13a3a1b8426/yarl-1.20.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00", size = 411400, upload_time = "2025-04-17T00:44:02.853Z" }, + { url = "https://files.pythonhosted.org/packages/5c/af/f0823d7e092bfb97d24fce6c7269d67fcd1aefade97d0a8189c4452e4d5e/yarl-1.20.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de", size = 411714, upload_time = "2025-04-17T00:44:04.904Z" }, + { url = "https://files.pythonhosted.org/packages/83/70/be418329eae64b9f1b20ecdaac75d53aef098797d4c2299d82ae6f8e4663/yarl-1.20.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5", size = 404279, upload_time = "2025-04-17T00:44:07.721Z" }, + { url = "https://files.pythonhosted.org/packages/19/f5/52e02f0075f65b4914eb890eea1ba97e6fd91dd821cc33a623aa707b2f67/yarl-1.20.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a", size = 384044, upload_time = "2025-04-17T00:44:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/6a/36/b0fa25226b03d3f769c68d46170b3e92b00ab3853d73127273ba22474697/yarl-1.20.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9", size = 416236, upload_time = "2025-04-17T00:44:11.734Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3a/54c828dd35f6831dfdd5a79e6c6b4302ae2c5feca24232a83cb75132b205/yarl-1.20.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145", size = 402034, upload_time = "2025-04-17T00:44:13.975Z" }, + { url = "https://files.pythonhosted.org/packages/10/97/c7bf5fba488f7e049f9ad69c1b8fdfe3daa2e8916b3d321aa049e361a55a/yarl-1.20.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda", size = 407943, upload_time = "2025-04-17T00:44:16.052Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a4/022d2555c1e8fcff08ad7f0f43e4df3aba34f135bff04dd35d5526ce54ab/yarl-1.20.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f", size = 423058, upload_time = "2025-04-17T00:44:18.547Z" }, + { url = "https://files.pythonhosted.org/packages/4c/f6/0873a05563e5df29ccf35345a6ae0ac9e66588b41fdb7043a65848f03139/yarl-1.20.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd", size = 423792, upload_time = "2025-04-17T00:44:20.639Z" }, + { url = "https://files.pythonhosted.org/packages/9e/35/43fbbd082708fa42e923f314c24f8277a28483d219e049552e5007a9aaca/yarl-1.20.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f", size = 422242, upload_time = "2025-04-17T00:44:22.851Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f7/f0f2500cf0c469beb2050b522c7815c575811627e6d3eb9ec7550ddd0bfe/yarl-1.20.0-cp313-cp313t-win32.whl", hash = "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac", size = 93816, upload_time = "2025-04-17T00:44:25.491Z" }, + { url = "https://files.pythonhosted.org/packages/3f/93/f73b61353b2a699d489e782c3f5998b59f974ec3156a2050a52dfd7e8946/yarl-1.20.0-cp313-cp313t-win_amd64.whl", hash = "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe", size = 101093, upload_time = "2025-04-17T00:44:27.418Z" }, + { url = "https://files.pythonhosted.org/packages/ea/1f/70c57b3d7278e94ed22d85e09685d3f0a38ebdd8c5c73b65ba4c0d0fe002/yarl-1.20.0-py3-none-any.whl", hash = "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124", size = 46124, upload_time = "2025-04-17T00:45:12.199Z" }, +] From 6a9464a2c5510b956965181458fb5d6ab9e57ca2 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 7 May 2025 15:07:34 -0400 Subject: [PATCH 168/244] Convert to full uv/pyproject dependency management --- .github/workflows/test_app.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index 5cff8696..340aa110 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -37,6 +37,9 @@ jobs: with: python-version: ${{ matrix.python-version }} + - name: Install the project + run: uv sync --locked --all-extras --dev + - name: Run tests run: | pytest tests/test_automated From 2e00141ccd238691eed1ba2e1a28f051484200be Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 7 May 2025 15:09:24 -0400 Subject: [PATCH 169/244] Convert to full uv/pyproject dependency management --- .github/workflows/test_app.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index 340aa110..64bf664e 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -42,5 +42,5 @@ jobs: - name: Run tests run: | - pytest tests/test_automated - pytest tests/test_alembic + uv run pytest tests/test_automated + uv run pytest tests/test_alembic From 9d9ca7049d9ee606d1df48f99acba5b7e869c771 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 7 May 2025 15:15:45 -0400 Subject: [PATCH 170/244] Convert to full uv/pyproject dependency management --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 58111591..70a54a83 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ WORKDIR /app COPY pyproject.toml uv.lock ./ # Install dependencies -RUN uv sync +RUN uv sync --no-dev # Must call from the root directory because uv does not add playwright to path RUN /app/.venv/bin/playwright install-deps chromium RUN /app/.venv/bin/playwright install chromium From 1faba4ebbfd6edc5e99151cc8666ebf4ef1505ee Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 7 May 2025 15:23:04 -0400 Subject: [PATCH 171/244] Convert to full uv/pyproject dependency management --- Dockerfile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 70a54a83..42736a8e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,10 +9,11 @@ WORKDIR /app COPY pyproject.toml uv.lock ./ # Install dependencies -RUN uv sync --no-dev +ENV UV_PROJECT_ENVIRONMENT="/usr/local/" +RUN uv sync --locked --no-dev # Must call from the root directory because uv does not add playwright to path -RUN /app/.venv/bin/playwright install-deps chromium -RUN /app/.venv/bin/playwright install chromium +RUN playwright install-deps chromium +RUN playwright install chromium # Copy project files From fb1acf283ee70773683463a3d73e870daf41bdd6 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 9 May 2025 09:39:29 -0400 Subject: [PATCH 172/244] DRAFT --- ...e17c04_create_url_annotation_flags_view.py | 25 ++- ...007bbcce3_create_url_data_sources_table.py | 54 +---- api/routes/metrics.py | 29 +-- collector_db/AsyncDatabaseClient.py | 68 ++++-- collector_db/DatabaseClient.py | 2 + collector_db/StatementComposer.py | 42 +++- collector_db/models.py | 27 --- .../GetMetricsBatchesAggregatedResponseDTO.py | 5 +- .../GetMetricsBatchesBreakdownResponseDTO.py | 9 +- ...etricsURLsBreakdownSubmittedResponseDTO.py | 4 +- .../task_data_objects/SubmitApprovedURLTDO.py | 5 +- pyproject.toml | 2 + tests/conftest.py | 15 +- tests/helpers/DBDataCreator.py | 121 ++++++++++- tests/helpers/complex_test_data_functions.py | 1 + .../helpers/test_batch_creation_parameters.py | 71 ++++++ .../api/helpers/RequestValidator.py | 31 ++- .../integration/api/test_metrics.py | 202 +++++++++++++++++- .../tasks/test_submit_approved_url_task.py | 18 +- uv.lock | 60 ++++++ 20 files changed, 639 insertions(+), 152 deletions(-) create mode 100644 tests/helpers/test_batch_creation_parameters.py diff --git a/alembic/versions/2025_05_06_0919-f25852e17c04_create_url_annotation_flags_view.py b/alembic/versions/2025_05_06_0919-f25852e17c04_create_url_annotation_flags_view.py index 0da22094..09f8d825 100644 --- a/alembic/versions/2025_05_06_0919-f25852e17c04_create_url_annotation_flags_view.py +++ b/alembic/versions/2025_05_06_0919-f25852e17c04_create_url_annotation_flags_view.py @@ -19,16 +19,17 @@ def upgrade() -> None: op.execute(""" - CREATE VIEW url_annotation_flags AS - SELECT - u.id as url_id, - CASE WHEN arts.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_auto_record_type_suggestion, - CASE WHEN ars.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_auto_relevant_suggestion, - CASE WHEN auas.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_auto_agency_suggestion, - CASE WHEN urts.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_user_record_type_suggestion, - CASE WHEN urs.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_user_relevant_suggestion, - CASE WHEN uuas.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_user_agency_suggestion, - CASE WHEN ruu.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS was_reviewed + CREATE OR REPLACE VIEW url_annotation_flags AS + ( + SELECT u.id, + CASE WHEN arts.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_auto_record_type_suggestion, + CASE WHEN ars.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_auto_relevant_suggestion, + CASE WHEN auas.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_auto_agency_suggestion, + CASE WHEN urts.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_user_record_type_suggestion, + CASE WHEN urs.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_user_relevant_suggestion, + CASE WHEN uuas.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_user_agency_suggestion, + CASE WHEN cua.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS has_confirmed_agency, + CASE WHEN ruu.url_id IS NOT NULL THEN TRUE ELSE FALSE END AS was_reviewed FROM urls u LEFT JOIN public.auto_record_type_suggestions arts ON u.id = arts.url_id LEFT JOIN public.auto_relevant_suggestions ars ON u.id = ars.url_id @@ -36,7 +37,9 @@ def upgrade() -> None: LEFT JOIN public.user_record_type_suggestions urts ON u.id = urts.url_id LEFT JOIN public.user_relevant_suggestions urs ON u.id = urs.url_id LEFT JOIN public.user_url_agency_suggestions uuas ON u.id = uuas.url_id - LEFT JOIN public.reviewing_user_url ruu ON u.id = ruu.url_id; + LEFT JOIN public.reviewing_user_url ruu ON u.id = ruu.url_id + LEFT JOIN public.confirmed_url_agency cua on u.id = cua.url_id + ) """) diff --git a/alembic/versions/2025_05_06_1115-6f2007bbcce3_create_url_data_sources_table.py b/alembic/versions/2025_05_06_1115-6f2007bbcce3_create_url_data_sources_table.py index da896c1c..499de2e4 100644 --- a/alembic/versions/2025_05_06_1115-6f2007bbcce3_create_url_data_sources_table.py +++ b/alembic/versions/2025_05_06_1115-6f2007bbcce3_create_url_data_sources_table.py @@ -46,8 +46,8 @@ def upgrade() -> None: nullable=False, server_default=sa.text('now()') ), - sa.UniqueConstraint('url_id', name='uq_url_id'), - sa.UniqueConstraint('data_source_id', name='uq_data_source_id') + sa.UniqueConstraint('url_id', name='uq_url_data_sources_url_id'), + sa.UniqueConstraint('data_source_id', name='uq_url_data_sources_data_source_id') ) # Migrate existing urls with a data source ID @@ -62,58 +62,8 @@ def upgrade() -> None: # Drop existing data source ID column from urls table op.drop_column('urls', 'data_source_id') - # Add trigger to ensure linked URL has status of submitted - op.execute(""" - CREATE FUNCTION check_url_is_submitted() RETURNS trigger AS $$ - BEGIN - IF EXISTS ( - SELECT 1 FROM urls WHERE id = NEW.url_id AND outcome != 'submitted' - ) THEN - RAISE EXCEPTION 'URL status is not submitted '; - END IF; - RETURN NEW; - END; - $$ LANGUAGE plpgsql; - """) - - op.execute(""" - CREATE TRIGGER check_url_is_submitted - BEFORE INSERT OR UPDATE ON url_data_sources - FOR EACH ROW - EXECUTE FUNCTION check_url_is_submitted(); - """) - - op.execute(""" - CREATE FUNCTION prevent_status_change_if_data_source_exists() RETURNS trigger AS $$ - BEGIN - IF OLD.outcome = 'submitted' AND NEW.outcome IS DISTINCT FROM OLD.status THEN - IF EXISTS ( - SELECT 1 FROM url_data_sources WHERE url_id = OLD.id - ) THEN - RAISE EXCEPTION 'Cannot change status from submitted: related child records exist.'; - END IF; - END IF; - RETURN NEW; - END; - $$ LANGUAGE plpgsql; - """) - - op.execute(""" - CREATE TRIGGER check_status_change - BEFORE UPDATE ON urls - FOR EACH ROW - EXECUTE FUNCTION prevent_status_change_if_data_source_exists(); - """) - def downgrade() -> None: - # Drop new trigger and function on URLS - op.execute(""" - DROP TRIGGER IF EXISTS check_url_is_submitted ON urls; - DROP FUNCTION IF EXISTS check_url_is_submitted; - DROP TRIGGER IF EXISTS check_status_change ON urls; - DROP FUNCTION IF EXISTS prevent_status_change_if_data_source_exists; - """) op.drop_table('url_data_sources') diff --git a/api/routes/metrics.py b/api/routes/metrics.py index ab548437..d81aa2e6 100644 --- a/api/routes/metrics.py +++ b/api/routes/metrics.py @@ -1,6 +1,7 @@ from fastapi import APIRouter -from fastapi.params import Query +from fastapi.params import Query, Depends +from api.dependencies import get_async_core from core.AsyncCore import AsyncCore from core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO from core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO @@ -8,7 +9,7 @@ from core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO from core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO from core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO -from security_manager.SecurityManager import AccessInfo +from security_manager.SecurityManager import AccessInfo, get_access_info metrics_router = APIRouter( prefix="/metrics", @@ -18,15 +19,15 @@ @metrics_router.get("/batches/aggregated") async def get_batches_aggregated_metrics( - core: AsyncCore, - access_info: AccessInfo + core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info) ) -> GetMetricsBatchesAggregatedResponseDTO: return await core.get_batches_aggregated_metrics() @metrics_router.get("/batches/breakdown") async def get_batches_breakdown_metrics( - core: AsyncCore, - access_info: AccessInfo, + core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info), page: int = Query( description="The page number", default=1 @@ -36,28 +37,28 @@ async def get_batches_breakdown_metrics( @metrics_router.get("/urls/aggregate") async def get_urls_aggregated_metrics( - core: AsyncCore, - access_info: AccessInfo + core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info) ) -> GetMetricsURLsAggregatedResponseDTO: return await core.get_urls_aggregated_metrics() @metrics_router.get("/urls/breakdown/submitted") async def get_urls_breakdown_submitted_metrics( - core: AsyncCore, - access_info: AccessInfo + core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info) ) -> GetMetricsURLsBreakdownSubmittedResponseDTO: return await core.get_urls_breakdown_submitted_metrics() @metrics_router.get("/urls/breakdown/pending") async def get_urls_breakdown_pending_metrics( - core: AsyncCore, - access_info: AccessInfo + core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info) ) -> GetMetricsURLsBreakdownPendingResponseDTO: return await core.get_urls_breakdown_pending_metrics() @metrics_router.get("/backlog") async def get_backlog_metrics( - core: AsyncCore, - access_info: AccessInfo + core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info) ) -> GetMetricsBacklogResponseDTO: return await core.get_backlog_metrics() \ No newline at end of file diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index d30d4aeb..422d1d20 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -7,6 +7,7 @@ from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import selectinload, joinedload, QueryableAttribute, aliased +from sqlalchemy.sql.functions import coalesce from starlette import status from collector_db.ConfigManager import ConfigManager @@ -27,7 +28,7 @@ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Duplicate, Log, \ - BacklogSnapshot, URLAnnotationFlag, URLDataSource + BacklogSnapshot, URLDataSource from collector_manager.enums import URLStatus, CollectorType from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo @@ -1489,14 +1490,24 @@ async def mark_urls_as_submitted(self, session: AsyncSession, infos: list[Submit for info in infos: url_id = info.url_id data_source_id = info.data_source_id + query = ( update(URL) .where(URL.id == url_id) .values( - data_source_id=data_source_id, outcome=URLStatus.SUBMITTED.value ) ) + + url_data_source_object = URLDataSource( + url_id=url_id, + data_source_id=data_source_id + ) + if info.submitted_at is not None: + url_data_source_object.created_at = info.submitted_at + session.add(url_data_source_object) + + await session.execute(query) @session_manager @@ -1843,9 +1854,11 @@ def url_column(status: URLStatus, label): Batch.strategy, url_column(URLStatus.PENDING, label="pending_count"), url_column(URLStatus.ERROR, label="error_count"), + url_column(URLStatus.VALIDATED, label="validated_count"), url_column(URLStatus.SUBMITTED, label="submitted_count"), url_column(URLStatus.REJECTED, label="rejected_count"), - ).join( + + ).outerjoin( Batch, Batch.id == URL.batch_id ).group_by( Batch.strategy @@ -1854,16 +1867,17 @@ def url_column(status: URLStatus, label): # Combine query = select( Batch.strategy, - batch_count_subquery.c.done_count, - batch_count_subquery.c.error_count, - url_count_subquery.c.pending_count, - url_count_subquery.c.error_count, - url_count_subquery.c.submitted_count, - url_count_subquery.c.rejected_count, + batch_count_subquery.c.done_count.label("batch_done_count"), + batch_count_subquery.c.error_count.label("batch_error_count"), + coalesce(url_count_subquery.c.pending_count, 0).label("pending_count"), + coalesce(url_count_subquery.c.error_count, 0).label("error_count"), + coalesce(url_count_subquery.c.submitted_count, 0).label("submitted_count"), + coalesce(url_count_subquery.c.rejected_count, 0).label("rejected_count"), + coalesce(url_count_subquery.c.validated_count, 0).label("validated_count") ).join( batch_count_subquery, Batch.strategy == batch_count_subquery.c.strategy - ).join( + ).outerjoin( url_count_subquery, Batch.strategy == url_count_subquery.c.strategy ) @@ -1872,10 +1886,13 @@ def url_column(status: URLStatus, label): d: dict[CollectorType, GetMetricsBatchesAggregatedInnerResponseDTO] = {} for result in results: d[CollectorType(result.strategy)] = GetMetricsBatchesAggregatedInnerResponseDTO( - count_successful_batches=result.done_count, - count_failed_batches=result.error_count, - count_urls=result.pending_count + result.submitted_count + result.rejected_count + result.error_count, + count_successful_batches=result.batch_done_count, + count_failed_batches=result.batch_error_count, + count_urls=result.pending_count + result.submitted_count + + result.rejected_count + result.error_count + + result.validated_count, count_urls_pending=result.pending_count, + count_urls_validated=result.validated_count, count_urls_submitted=result.submitted_count, count_urls_rejected=result.rejected_count, count_urls_errors=result.error_count @@ -1906,6 +1923,7 @@ async def get_batches_breakdown_metrics( main_query = select( Batch.strategy, Batch.id, + Batch.status, Batch.date_generated.label("created_at"), ) @@ -1925,6 +1943,7 @@ def url_column(status: URLStatus, label): url_column(URLStatus.SUBMITTED, label="count_submitted"), url_column(URLStatus.REJECTED, label="count_rejected"), url_column(URLStatus.ERROR, label="count_error"), + url_column(URLStatus.VALIDATED, label="count_validated"), ).group_by( URL.batch_id ).subquery("url_count") @@ -1933,12 +1952,14 @@ def url_column(status: URLStatus, label): main_query.c.strategy, main_query.c.id, main_query.c.created_at, - count_query.c.count_total, - count_query.c.count_pending, - count_query.c.count_submitted, - count_query.c.count_rejected, - count_query.c.count_error, - ).join( + main_query.c.status, + coalesce(count_query.c.count_total, 0).label("count_total"), + coalesce(count_query.c.count_pending, 0).label("count_pending"), + coalesce(count_query.c.count_submitted, 0).label("count_submitted"), + coalesce(count_query.c.count_rejected, 0).label("count_rejected"), + coalesce(count_query.c.count_error, 0).label("count_error"), + coalesce(count_query.c.count_validated, 0).label("count_validated"), + ).outerjoin( count_query, main_query.c.id == count_query.c.batch_id ).offset( @@ -1952,14 +1973,16 @@ def url_column(status: URLStatus, label): batches: list[GetMetricsBatchesBreakdownInnerResponseDTO] = [] for result in results: dto = GetMetricsBatchesBreakdownInnerResponseDTO( - batch_id=str(result.id), + batch_id=result.id, strategy=CollectorType(result.strategy), + status=BatchStatus(result.status), created_at=result.created_at, count_url_total=result.count_total, count_url_pending=result.count_pending, count_url_submitted=result.count_submitted, count_url_rejected=result.count_rejected, count_url_error=result.count_error, + count_url_validated=result.count_validated ) batches.append(dto) return GetMetricsBatchesBreakdownResponseDTO( @@ -1971,7 +1994,8 @@ async def get_urls_breakdown_submitted_metrics( self, session: AsyncSession ) -> GetMetricsURLsBreakdownSubmittedResponseDTO: - # TODO: Wrong submitted at time: The created at does not indicate when it was submitted + # TODO: Wrong submitted at time: The created at does not indicate + # when it was submitted # Build the query @@ -2061,6 +2085,8 @@ async def get_urls_breakdown_pending_metrics( session: AsyncSession ) -> GetMetricsURLsBreakdownPendingResponseDTO: + + # TODO: Replace with CTE flags = URLAnnotationFlag url = URL diff --git a/collector_db/DatabaseClient.py b/collector_db/DatabaseClient.py index 94320fbc..112e5689 100644 --- a/collector_db/DatabaseClient.py +++ b/collector_db/DatabaseClient.py @@ -72,6 +72,8 @@ def insert_batch(self, session, batch_info: BatchInfo) -> int: record_type_match_rate=batch_info.record_type_match_rate, record_category_match_rate=batch_info.record_category_match_rate, ) + if batch_info.date_generated is not None: + batch.date_generated = batch_info.date_generated session.add(batch) session.commit() session.refresh(batch) diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index 42c77ef7..648e44f2 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -1,11 +1,12 @@ from typing import Any -from sqlalchemy import Select, select, exists, Table, func, Subquery, and_, not_, ColumnElement +from sqlalchemy import Select, select, exists, Table, func, Subquery, and_, not_, ColumnElement, case, literal from sqlalchemy.orm import aliased from collector_db.enums import URLMetadataAttributeType, ValidationStatus, TaskType from collector_db.models import URL, URLHTMLContent, AutomatedUrlAgencySuggestion, URLOptionalDataSourceMetadata, Batch, \ - ConfirmedURLAgency, LinkTaskURL, Task, UserUrlAgencySuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion + ConfirmedURLAgency, LinkTaskURL, Task, UserUrlAgencySuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion, \ + AutoRecordTypeSuggestion, AutoRelevantSuggestion, ReviewingUserURL from collector_manager.enums import URLStatus, CollectorType from core.enums import BatchStatus @@ -122,4 +123,39 @@ def count_distinct(field, label): @staticmethod def sum_distinct(field, label): - return func.sum(func.distinct(field)).label(label) \ No newline at end of file + return func.sum(func.distinct(field)).label(label) + + @staticmethod + def url_annotation_flags_query() -> Select: + stmt = ( + select( + URL.id.label("url_id"), + case((AutoRecordTypeSuggestion.url_id != None, literal(True)), else_=literal(False)).label( + "has_auto_record_type_suggestion" + ), + case((AutoRelevantSuggestion.url_id != None, literal(True)), else_=literal(False)).label( + "has_auto_relevant_suggestion" + ), + case((AutomatedUrlAgencySuggestion.url_id != None, literal(True)), else_=literal(False)).label( + "has_auto_agency_suggestion" + ), + case((UserRecordTypeSuggestion.url_id != None, literal(True)), else_=literal(False)).label( + "has_user_record_type_suggestion" + ), + case((UserRelevantSuggestion.url_id != None, literal(True)), else_=literal(False)).label( + "has_user_relevant_suggestion" + ), + case((UserUrlAgencySuggestion.url_id != None, literal(True)), else_=literal(False)).label( + "has_user_agency_suggestion" + ), + case((ReviewingUserURL.url_id != None, literal(True)), else_=literal(False)).label("was_reviewed"), + ) + .outerjoin(AutoRecordTypeSuggestion, URL.id == AutoRecordTypeSuggestion.url_id) + .outerjoin(AutoRelevantSuggestion, URL.id == AutoRelevantSuggestion.url_id) + .outerjoin(AutomatedUrlAgencySuggestion, URL.id == AutomatedUrlAgencySuggestion.url_id) + .outerjoin(UserRecordTypeSuggestion, URL.id == UserRecordTypeSuggestion.url_id) + .outerjoin(UserRelevantSuggestion, URL.id == UserRelevantSuggestion.url_id) + .outerjoin(UserUrlAgencySuggestion, URL.id == UserUrlAgencySuggestion.url_id) + .outerjoin(ReviewingUserURL, URL.id == ReviewingUserURL.url_id) + ) + return stmt \ No newline at end of file diff --git a/collector_db/models.py b/collector_db/models.py index 375e5203..b38243dd 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -136,10 +136,6 @@ class URL(Base): confirmed_agencies = relationship( "ConfirmedURLAgency", ) - annotation_flags = relationship( - "URLAnnotationFlag", - back_populates="url" - ) data_source = relationship( "URLDataSource", back_populates="url", @@ -469,29 +465,6 @@ class BacklogSnapshot(Base): count_pending_total = Column(Integer, nullable=False) created_at = get_created_at_column() -class URLAnnotationFlag(Base): - __tablename__ = "url_annotation_flags" - - url_id = Column( - Integer, - ForeignKey("urls.id"), - primary_key=True, - nullable=False - ) - has_auto_record_type_annotation = Column(Boolean, nullable=False) - has_auto_relevant_annotation = Column(Boolean, nullable=False) - has_auto_agency_annotation = Column(Boolean, nullable=False) - has_user_record_type_annotation = Column(Boolean, nullable=False) - has_user_relevant_annotation = Column(Boolean, nullable=False) - has_user_agency_annotation = Column(Boolean, nullable=False) - was_reviewed = Column(Boolean, nullable=False) - - # Relationships - url = relationship( - "URL", - back_populates="annotation_flags" - ) - class URLDataSource(Base): __tablename__ = "url_data_sources" diff --git a/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py b/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py index 565ab208..37535f2d 100644 --- a/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py +++ b/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py @@ -1,3 +1,5 @@ +from typing import Dict + from pydantic import BaseModel from collector_manager.enums import CollectorType @@ -8,6 +10,7 @@ class GetMetricsBatchesAggregatedInnerResponseDTO(BaseModel): count_failed_batches: int count_urls: int count_urls_pending: int + count_urls_validated: int count_urls_submitted: int count_urls_rejected: int count_urls_errors: int @@ -16,7 +19,7 @@ class GetMetricsBatchesAggregatedInnerResponseDTO(BaseModel): class GetMetricsBatchesAggregatedResponseDTO(BaseModel): total_batches: int - by_strategy: dict[ + by_strategy: Dict[ CollectorType, GetMetricsBatchesAggregatedInnerResponseDTO ] \ No newline at end of file diff --git a/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py b/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py index 5797ab54..6572f49f 100644 --- a/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py +++ b/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py @@ -1,19 +1,22 @@ -import datetime +from datetime import datetime from pydantic import BaseModel from collector_manager.enums import CollectorType +from core.enums import BatchStatus class GetMetricsBatchesBreakdownInnerResponseDTO(BaseModel): - batch_id: str + batch_id: int strategy: CollectorType - created_at: datetime.datetime + status: BatchStatus + created_at: datetime count_url_total: int count_url_pending: int count_url_submitted: int count_url_rejected: int count_url_error: int + count_url_validated: int class GetMetricsBatchesBreakdownResponseDTO(BaseModel): batches: list[GetMetricsBatchesBreakdownInnerResponseDTO] \ No newline at end of file diff --git a/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py b/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py index 7e17effe..687c34c8 100644 --- a/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py +++ b/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py @@ -1,9 +1,9 @@ -from datetime import datetime +from datetime import date from pydantic import BaseModel class GetMetricsURLsBreakdownSubmittedInnerDTO(BaseModel): - week_of: datetime.date + week_of: date count_submitted: int class GetMetricsURLsBreakdownSubmittedResponseDTO(BaseModel): diff --git a/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py b/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py index c5b002d0..be26d3a8 100644 --- a/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py +++ b/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py @@ -3,7 +3,7 @@ from pydantic import BaseModel from core.enums import RecordType - +from datetime import datetime class SubmitApprovedURLTDO(BaseModel): url_id: int @@ -22,4 +22,5 @@ class SubmitApprovedURLTDO(BaseModel): class SubmittedURLInfo(BaseModel): url_id: int data_source_id: Optional[int] - request_error: Optional[str] \ No newline at end of file + request_error: Optional[str] + submitted_at: Optional[datetime] = None \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index de0abfcd..5d2269c7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,6 +12,7 @@ dependencies = [ "ckanapi~=4.8", "datasets~=2.19.1", "docker~=7.1.0", + "environs>=14.1.1", "fastapi[standard]~=0.115.6", "from-root~=1.3.0", "google-api-python-client>=2.156.0", @@ -43,6 +44,7 @@ dependencies = [ [dependency-groups] dev = [ "docker>=7.1.0", + "pendulum>=3.1.0", "pytest>=7.2.2", "pytest-asyncio~=0.25.2", "pytest-mock==3.12.0", diff --git a/tests/conftest.py b/tests/conftest.py index d7b1bce7..c8f4bd64 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -62,13 +62,24 @@ def setup_and_teardown(): try: runner.upgrade("head") except Exception as e: + print("Exception while upgrading: ", e) + print("Resetting schema") runner.reset_schema() runner.stamp("base") runner.upgrade("head") - live_connection.close() - engine.dispose() + yield + try: + runner.downgrade("base") + except Exception as e: + print("Exception while downgrading: ", e) + print("Resetting schema") + runner.reset_schema() + runner.stamp("base") + finally: + live_connection.close() + engine.dispose() @pytest.fixture def wipe_database(): diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 695a3c7a..2fad7b0f 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -1,4 +1,5 @@ import asyncio +from datetime import datetime from random import randint from typing import List, Optional @@ -11,15 +12,28 @@ from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType from collector_db.DTOs.URLInfo import URLInfo +from collector_db.DTOs.URLMapping import URLMapping from collector_db.DatabaseClient import DatabaseClient from collector_db.enums import TaskType from collector_manager.enums import CollectorType, URLStatus +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmittedURLInfo from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO from core.enums import BatchStatus, SuggestionType, RecordType +from helpers.test_batch_creation_parameters import TestBatchCreationParameters, AnnotationInfo from tests.helpers.simple_test_data_functions import generate_test_urls +class URLCreationInfo(BaseModel): + url_mappings: list[URLMapping] + outcome: URLStatus + annotation_info: AnnotationInfo + +class BatchURLCreationInfoV2(BaseModel): + batch_id: int + url_creation_infos: dict[URLStatus, URLCreationInfo] + class BatchURLCreationInfo(BaseModel): batch_id: int url_ids: list[int] @@ -37,9 +51,10 @@ def __init__(self, db_client: Optional[DatabaseClient] = None): self.adb_client: AsyncDatabaseClient = AsyncDatabaseClient() def batch( - self, - strategy: CollectorType = CollectorType.EXAMPLE, - batch_status: BatchStatus = BatchStatus.IN_PROCESS + self, + strategy: CollectorType = CollectorType.EXAMPLE, + batch_status: BatchStatus = BatchStatus.IN_PROCESS, + created_at: Optional[datetime] = None ) -> int: return self.db_client.insert_batch( BatchInfo( @@ -47,7 +62,8 @@ def batch( status=batch_status, total_url_count=1, parameters={"test_key": "test_value"}, - user_id=1 + user_id=1, + date_generated=created_at ) ) @@ -57,6 +73,49 @@ async def task(self, url_ids: Optional[list[int]] = None) -> int: await self.adb_client.link_urls_to_task(task_id=task_id, url_ids=url_ids) return task_id + async def batch_v2( + self, + parameters: TestBatchCreationParameters + ) -> BatchURLCreationInfoV2: + batch_id = self.batch( + strategy=parameters.strategy, + batch_status=parameters.outcome, + created_at=parameters.created_at + ) + if parameters.outcome in (BatchStatus.ERROR, BatchStatus.ABORTED): + return BatchURLCreationInfoV2( + batch_id=batch_id, + url_creation_infos={} + ) + + d: dict[URLStatus, URLCreationInfo] = {} + for url_parameters in parameters.urls: + iui: InsertURLsInfo = self.urls( + batch_id=batch_id, + url_count=url_parameters.count, + outcome=url_parameters.status, + created_at=parameters.created_at + ) + url_ids = [iui.url_id for iui in iui.url_mappings] + if url_parameters.with_html_content: + await self.html_data(url_ids) + if url_parameters.annotation_info.has_annotations(): + for url_id in url_ids: + await self.annotate( + url_id=url_id, + annotation_info=url_parameters.annotation_info + ) + + d[url_parameters.status] = URLCreationInfo( + url_mappings=iui.url_mappings, + outcome=url_parameters.status, + annotation_info=url_parameters.annotation_info + ) + return BatchURLCreationInfoV2( + batch_id=batch_id, + url_creation_infos=d + ) + async def batch_and_urls( self, strategy: CollectorType = CollectorType.EXAMPLE, @@ -113,6 +172,41 @@ async def auto_relevant_suggestions(self, url_id: int, relevant: bool = True): relevant=relevant ) + async def annotate(self, url_id: int, annotation_info: AnnotationInfo): + info = annotation_info + if info.user_relevant is not None: + await self.user_relevant_suggestion(url_id=url_id, relevant=info.user_relevant) + if info.auto_relevant is not None: + await self.auto_relevant_suggestions(url_id=url_id, relevant=info.auto_relevant) + if info.user_record_type is not None: + await self.user_record_type_suggestion(url_id=url_id, record_type=info.user_record_type) + if info.auto_record_type is not None: + await self.auto_record_type_suggestions(url_id=url_id, record_type=info.auto_record_type) + if info.user_agency is not None: + await self.agency_user_suggestions(url_id=url_id, agency_id=info.user_agency) + if info.auto_agency is not None: + await self.agency_auto_suggestions(url_id=url_id, count=1, suggestion_type=SuggestionType.AUTO_SUGGESTION) + if info.confirmed_agency is not None: + await self.agency_auto_suggestions(url_id=url_id, count=1, suggestion_type=SuggestionType.CONFIRMED) + if info.final_review_approved is not None: + if info.final_review_approved: + final_review_approval_info = FinalReviewApprovalInfo( + url_id=url_id, + record_type=annotation_info.user_record_type, + agency_ids=[annotation_info.user_agency] if annotation_info.user_agency is not None else None, + description="Test Description", + ) + await self.adb_client.approve_url( + approval_info=final_review_approval_info, + user_id=1 + ) + else: + await self.adb_client.reject_url( + url_id=url_id, + user_id=1 + ) + + async def user_relevant_suggestion( self, url_id: int, @@ -204,7 +298,8 @@ def urls( batch_id: int, url_count: int, collector_metadata: Optional[dict] = None, - outcome: URLStatus = URLStatus.PENDING + outcome: URLStatus = URLStatus.PENDING, + created_at: Optional[datetime] = None ) -> InsertURLsInfo: raw_urls = generate_test_urls(url_count) url_infos: List[URLInfo] = [] @@ -214,10 +309,24 @@ def urls( url=url, outcome=outcome, name="Test Name" if outcome == URLStatus.VALIDATED else None, - collector_metadata=collector_metadata + collector_metadata=collector_metadata, + created_at=created_at ) ) + # If outcome is submitted, also add entry to DataSourceURL + if outcome == URLStatus.SUBMITTED: + submitted_url_infos = [] + for url_info in url_infos: + submitted_url_info = SubmittedURLInfo( + url_id=url_info.url_id, + data_source_id=url_info.url_id, # Use same ID for convenience, + request_error=None, + submitted_at=created_at + ) + asyncio.run(self.adb_client.mark_urls_as_submitted(submitted_url_infos)) + + return self.db_client.insert_urls( url_infos=url_infos, batch_id=batch_id, diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index 6f9ca7c3..bc03020f 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -121,3 +121,4 @@ async def add_relevant_suggestion(relevant: bool): url_mapping=url_mapping, user_agency_id=user_agency_id ) + diff --git a/tests/helpers/test_batch_creation_parameters.py b/tests/helpers/test_batch_creation_parameters.py new file mode 100644 index 00000000..ef8400b9 --- /dev/null +++ b/tests/helpers/test_batch_creation_parameters.py @@ -0,0 +1,71 @@ +import datetime +from typing import Optional + +from pydantic import BaseModel, model_validator + +from collector_manager.enums import URLStatus, CollectorType +from core.enums import BatchStatus, AnnotationType, RecordType + + +class AnnotationInfo(BaseModel): + user_relevant: Optional[bool] = None + auto_relevant: Optional[bool] = None + user_record_type: Optional[RecordType] = None + auto_record_type: Optional[RecordType] = None + user_agency: Optional[int] = None + auto_agency: Optional[int] = None + confirmed_agency: Optional[int] = None + final_review_approved: Optional[bool] = None + + def has_annotations(self): + return any([ + self.user_relevant, + self.auto_relevant, + self.user_record_type, + self.auto_record_type, + self.user_agency, + self.auto_agency, + self.confirmed_agency, + self.final_review_approved + ]) + +class TestURLCreationParameters(BaseModel): + count: int + status: URLStatus = URLStatus.PENDING + with_html_content: bool = False + annotation_info: AnnotationInfo = AnnotationInfo() + + @model_validator(mode='after') + def validate_annotation_info(self): + if self.status == URLStatus.REJECTED: + self.annotation_info.final_review_approved = False + return self + if self.status != URLStatus.VALIDATED: + return self + + # Assume is validated + self.annotation_info.final_review_approved = True + if self.annotation_info.user_record_type is None: + self.annotation_info.user_record_type = RecordType.ARREST_RECORDS + if self.annotation_info.user_agency is None: + self.annotation_info.user_agency = 1 + + + return self + +class TestBatchCreationParameters(BaseModel): + created_at: Optional[datetime.datetime] = None + outcome: BatchStatus = BatchStatus.READY_TO_LABEL + strategy: CollectorType = CollectorType.EXAMPLE + urls: Optional[list[TestURLCreationParameters]] = None + + @model_validator(mode='after') + def validate_urls(self): + if self.outcome != BatchStatus.READY_TO_LABEL: + if self.urls is not None: + raise ValueError('URLs cannot be provided if outcome is not READY_TO_LABEL') + return self + + if self.urls is None: + self.urls = [TestURLCreationParameters(count=1)] + return self \ No newline at end of file diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index 91d27729..a61679d5 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -16,6 +16,9 @@ from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse +from core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO +from core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO +from core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ @@ -140,6 +143,19 @@ def post_v2( **kwargs ) + def get_v2( + self, + url: str, + params: Optional[dict] = None, + **kwargs + ) -> dict: + return self.open_v2( + method="GET", + url=url, + params=params, + **kwargs + ) + def put( self, @@ -393,4 +409,17 @@ async def search_url(self, url: str) -> SearchURLResponse: url=f"/search/url", params={"url": url} ) - return SearchURLResponse(**data) \ No newline at end of file + return SearchURLResponse(**data) + + async def get_batches_aggregated_metrics(self) -> GetMetricsBatchesAggregatedResponseDTO: + data = self.get_v2( + url="/metrics/batches/aggregated" + ) + return GetMetricsBatchesAggregatedResponseDTO(**data) + + async def get_batches_breakdown_metrics(self, page: int) -> GetMetricsBatchesBreakdownResponseDTO: + data = self.get_v2( + url="/metrics/batches/breakdown", + params={"page": page} + ) + return GetMetricsBatchesBreakdownResponseDTO(**data) \ No newline at end of file diff --git a/tests/test_automated/integration/api/test_metrics.py b/tests/test_automated/integration/api/test_metrics.py index 44eff414..d2f4adc6 100644 --- a/tests/test_automated/integration/api/test_metrics.py +++ b/tests/test_automated/integration/api/test_metrics.py @@ -1,22 +1,220 @@ +import pendulum import pytest +from collector_manager.enums import URLStatus, CollectorType +from core.enums import BatchStatus +from helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters + @pytest.mark.asyncio async def test_get_batches_aggregated_metrics(api_test_helper): + ath = api_test_helper # Create successful batches with URLs of different statuses + all_params = [] + for i in range(3): + params = TestBatchCreationParameters( + strategy=CollectorType.MANUAL, + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.PENDING + ), + TestURLCreationParameters( + count=2, + status=URLStatus.SUBMITTED + ), + TestURLCreationParameters( + count=3, + status=URLStatus.REJECTED + ), + TestURLCreationParameters( + count=4, + status=URLStatus.ERROR + ), + TestURLCreationParameters( + count=5, + status=URLStatus.VALIDATED + ) + ] + ) + all_params.append(params) + # Create failed batches + for i in range(2): + params = TestBatchCreationParameters( + outcome=BatchStatus.ERROR + ) + all_params.append(params) + + for params in all_params: + await ath.db_data_creator.batch_v2(params) + + dto = await ath.request_validator.get_batches_aggregated_metrics() + assert dto.total_batches == 5 + inner_dto_example = dto.by_strategy[CollectorType.EXAMPLE] + assert inner_dto_example.count_urls == 0 + assert inner_dto_example.count_successful_batches == 0 + assert inner_dto_example.count_failed_batches == 2 + assert inner_dto_example.count_urls_pending == 0 + assert inner_dto_example.count_urls_submitted == 0 + assert inner_dto_example.count_urls_rejected == 0 + assert inner_dto_example.count_urls_errors == 0 + assert inner_dto_example.count_urls_validated == 0 + + inner_dto_manual = dto.by_strategy[CollectorType.MANUAL] + assert inner_dto_manual.count_urls == 45 + assert inner_dto_manual.count_successful_batches == 3 + assert inner_dto_manual.count_failed_batches == 0 + assert inner_dto_manual.count_urls_pending == 3 + assert inner_dto_manual.count_urls_submitted == 6 + assert inner_dto_manual.count_urls_rejected == 9 + assert inner_dto_manual.count_urls_errors == 12 + assert inner_dto_manual.count_urls_validated == 15 - raise NotImplementedError @pytest.mark.asyncio async def test_get_batches_breakdown_metrics(api_test_helper): - raise NotImplementedError + # Create a different batch for each week, with different URLs + today = pendulum.today() + ath = api_test_helper + + batch_1_params = TestBatchCreationParameters( + strategy=CollectorType.MANUAL, + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.PENDING + ), + TestURLCreationParameters( + count=2, + status=URLStatus.SUBMITTED + ), + ] + ) + batch_1 = await ath.db_data_creator.batch_v2(batch_1_params) + batch_2_params = TestBatchCreationParameters( + strategy=CollectorType.EXAMPLE, + outcome=BatchStatus.ERROR, + created_at=today.subtract(weeks=1), + ) + batch_2 = await ath.db_data_creator.batch_v2(batch_2_params) + batch_3_params = TestBatchCreationParameters( + strategy=CollectorType.AUTO_GOOGLER, + created_at=today.subtract(weeks=2), + urls=[ + TestURLCreationParameters( + count=3, + status=URLStatus.REJECTED + ), + TestURLCreationParameters( + count=4, + status=URLStatus.ERROR + ), + TestURLCreationParameters( + count=5, + status=URLStatus.VALIDATED + ), + ] + ) + batch_3 = await ath.db_data_creator.batch_v2(batch_3_params) + + dto_1 = await ath.request_validator.get_batches_breakdown_metrics( + page=1 + ) + assert len(dto_1.batches) == 3 + dto_batch_1 = dto_1.batches[2] + assert dto_batch_1.batch_id == batch_1.batch_id + assert dto_batch_1.strategy == CollectorType.MANUAL + assert dto_batch_1.status == BatchStatus.READY_TO_LABEL + assert pendulum.instance(dto_batch_1.created_at) > today + assert dto_batch_1.count_url_total == 3 + assert dto_batch_1.count_url_pending == 1 + assert dto_batch_1.count_url_submitted == 2 + assert dto_batch_1.count_url_rejected == 0 + assert dto_batch_1.count_url_error == 0 + assert dto_batch_1.count_url_validated == 0 + + dto_batch_2 = dto_1.batches[1] + assert dto_batch_2.batch_id == batch_2.batch_id + assert dto_batch_2.status == BatchStatus.ERROR + assert dto_batch_2.strategy == CollectorType.EXAMPLE + assert pendulum.instance(dto_batch_2.created_at) == today.subtract(weeks=1) + assert dto_batch_2.count_url_total == 0 + assert dto_batch_2.count_url_submitted == 0 + assert dto_batch_2.count_url_pending == 0 + assert dto_batch_2.count_url_rejected == 0 + assert dto_batch_2.count_url_error == 0 + assert dto_batch_2.count_url_validated == 0 + + dto_batch_3 = dto_1.batches[0] + assert dto_batch_3.batch_id == batch_3.batch_id + assert dto_batch_3.status == BatchStatus.READY_TO_LABEL + assert dto_batch_3.strategy == CollectorType.AUTO_GOOGLER + assert pendulum.instance(dto_batch_3.created_at) == today.subtract(weeks=2) + assert dto_batch_3.count_url_total == 12 + assert dto_batch_3.count_url_pending == 0 + assert dto_batch_3.count_url_submitted == 0 + assert dto_batch_3.count_url_rejected == 3 + assert dto_batch_3.count_url_error == 4 + assert dto_batch_3.count_url_validated == 5 + + dto_2 = await ath.request_validator.get_batches_breakdown_metrics( + page=2 + ) + assert len(dto_2.batches) == 0 @pytest.mark.asyncio async def test_get_urls_breakdown_submitted_metrics(api_test_helper): # Create URLs with submitted status, broken down in different amounts by different weeks # And ensure the URLs are + today = pendulum.today() + ath = api_test_helper + + batch_1_params = TestBatchCreationParameters( + strategy=CollectorType.MANUAL, + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.PENDING + ), + TestURLCreationParameters( + count=2, + status=URLStatus.SUBMITTED + ), + ] + ) + batch_1 = await ath.db_data_creator.batch_v2(batch_1_params) + batch_2_params = TestBatchCreationParameters( + strategy=CollectorType.EXAMPLE, + urls=[ + TestURLCreationParameters( + count=3, + status=URLStatus.REJECTED + ) + ], + created_at=today.subtract(weeks=1), + ) + batch_2 = await ath.db_data_creator.batch_v2(batch_2_params) + batch_3_params = TestBatchCreationParameters( + strategy=CollectorType.AUTO_GOOGLER, + created_at=today.subtract(weeks=1), + urls=[ + TestURLCreationParameters( + count=3, + status=URLStatus.REJECTED + ), + TestURLCreationParameters( + count=4, + status=URLStatus.ERROR + ), + TestURLCreationParameters( + count=5, + status=URLStatus.VALIDATED + ), + ] + ) + batch_3 = await ath.db_data_creator.batch_v2(batch_3_params) @pytest.mark.asyncio async def test_get_urls_breakdown_pending_metrics(api_test_helper): diff --git a/tests/test_automated/integration/tasks/test_submit_approved_url_task.py b/tests/test_automated/integration/tasks/test_submit_approved_url_task.py index 2d3aa192..32dc765c 100644 --- a/tests/test_automated/integration/tasks/test_submit_approved_url_task.py +++ b/tests/test_automated/integration/tasks/test_submit_approved_url_task.py @@ -4,7 +4,7 @@ import pytest from collector_db.enums import TaskType -from collector_db.models import URL, URLErrorInfo +from collector_db.models import URL, URLErrorInfo, URLDataSource from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome @@ -152,10 +152,18 @@ async def test_submit_approved_url_task( assert url_2.outcome == URLStatus.SUBMITTED.value assert url_3.outcome == URLStatus.ERROR.value - # Check URLs now have data source ids - assert url_1.data_source_id == 21 - assert url_2.data_source_id == 34 - assert url_3.data_source_id is None + # Get URL Data Source Links + url_data_sources = await db_data_creator.adb_client.get_all(URLDataSource) + assert len(url_data_sources) == 2 + + url_data_source_1 = url_data_sources[0] + url_data_source_2 = url_data_sources[1] + + assert url_data_source_1.url_id == url_1.id + assert url_data_source_1.data_source_id == 21 + + assert url_data_source_2.url_id == url_2.id + assert url_data_source_2.data_source_id == 34 # Check that errored URL has entry in url_error_info url_errors = await db_data_creator.adb_client.get_all(URLErrorInfo) diff --git a/uv.lock b/uv.lock index f2ea60ae..bb269479 100644 --- a/uv.lock +++ b/uv.lock @@ -348,6 +348,7 @@ dependencies = [ { name = "ckanapi" }, { name = "datasets" }, { name = "docker" }, + { name = "environs" }, { name = "fastapi", extra = ["standard"] }, { name = "from-root" }, { name = "google-api-python-client" }, @@ -379,6 +380,7 @@ dependencies = [ [package.dev-dependencies] dev = [ { name = "docker" }, + { name = "pendulum" }, { name = "pytest" }, { name = "pytest-asyncio" }, { name = "pytest-mock" }, @@ -396,6 +398,7 @@ requires-dist = [ { name = "ckanapi", specifier = "~=4.8" }, { name = "datasets", specifier = "~=2.19.1" }, { name = "docker", specifier = "~=7.1.0" }, + { name = "environs", specifier = ">=14.1.1" }, { name = "fastapi", extras = ["standard"], specifier = "~=0.115.6" }, { name = "from-root", specifier = "~=1.3.0" }, { name = "google-api-python-client", specifier = ">=2.156.0" }, @@ -427,6 +430,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ { name = "docker", specifier = ">=7.1.0" }, + { name = "pendulum", specifier = ">=3.1.0" }, { name = "pytest", specifier = ">=7.2.2" }, { name = "pytest-asyncio", specifier = "~=0.25.2" }, { name = "pytest-mock", specifier = "==3.12.0" }, @@ -519,6 +523,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521, upload_time = "2024-06-20T11:30:28.248Z" }, ] +[[package]] +name = "environs" +version = "14.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "marshmallow" }, + { name = "python-dotenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/d3/e82bdbb8cc332e751f67a3f668c5d134d57f983497d9f3a59a375b6e8fd8/environs-14.1.1.tar.gz", hash = "sha256:03db7ee2d50ec697b68814cd175a3a05a7c7954804e4e419ca8b570dc5a835cf", size = 32050, upload_time = "2025-02-10T20:24:26.437Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/1c/ab9752f02d32d981d647c05822be9ff93809be8953dacea2da2bec9a9de9/environs-14.1.1-py3-none-any.whl", hash = "sha256:45bc56f1d53bbc59d8dd69bba97377dd88ec28b8229d81cedbd455b21789445b", size = 15566, upload_time = "2025-02-10T20:24:22.116Z" }, +] + [[package]] name = "fastapi" version = "0.115.12" @@ -1441,6 +1458,49 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436, upload_time = "2024-09-20T13:09:48.112Z" }, ] +[[package]] +name = "pendulum" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/23/7c/009c12b86c7cc6c403aec80f8a4308598dfc5995e5c523a5491faaa3952e/pendulum-3.1.0.tar.gz", hash = "sha256:66f96303560f41d097bee7d2dc98ffca716fbb3a832c4b3062034c2d45865015", size = 85930, upload_time = "2025-04-19T14:30:01.675Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/6e/d28d3c22e6708b819a94c05bd05a3dfaed5c685379e8b6dc4b34b473b942/pendulum-3.1.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:61a03d14f8c64d13b2f7d5859e4b4053c4a7d3b02339f6c71f3e4606bfd67423", size = 338596, upload_time = "2025-04-19T14:01:11.306Z" }, + { url = "https://files.pythonhosted.org/packages/e1/e6/43324d58021d463c2eeb6146b169d2c935f2f840f9e45ac2d500453d954c/pendulum-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e674ed2d158afa5c361e60f1f67872dc55b492a10cacdaa7fcd7b7da5f158f24", size = 325854, upload_time = "2025-04-19T14:01:13.156Z" }, + { url = "https://files.pythonhosted.org/packages/b0/a7/d2ae79b960bfdea94dab67e2f118697b08bc9e98eb6bd8d32c4d99240da3/pendulum-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c75377eb16e58bbe7e03ea89eeea49be6fc5de0934a4aef0e263f8b4fa71bc2", size = 344334, upload_time = "2025-04-19T14:01:15.151Z" }, + { url = "https://files.pythonhosted.org/packages/96/94/941f071212e23c29aae7def891fb636930c648386e059ce09ea0dcd43933/pendulum-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:656b8b0ce070f0f2e5e2668247d3c783c55336534aa1f13bd0969535878955e1", size = 382259, upload_time = "2025-04-19T14:01:16.924Z" }, + { url = "https://files.pythonhosted.org/packages/51/ad/a78a701656aec00d16fee636704445c23ca11617a0bfe7c3848d1caa5157/pendulum-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48962903e6c1afe1f13548cb6252666056086c107d59e3d64795c58c9298bc2e", size = 436361, upload_time = "2025-04-19T14:01:18.796Z" }, + { url = "https://files.pythonhosted.org/packages/da/93/83f59ccbf4435c29dca8c63a6560fcbe4783079a468a5f91d9f886fd21f0/pendulum-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d364ec3f8e65010fefd4b0aaf7be5eb97e5df761b107a06f5e743b7c3f52c311", size = 353653, upload_time = "2025-04-19T14:01:20.159Z" }, + { url = "https://files.pythonhosted.org/packages/6f/0f/42d6644ec6339b41066f594e52d286162aecd2e9735aaf994d7e00c9e09d/pendulum-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd52caffc2afb86612ec43bbeb226f204ea12ebff9f3d12f900a7d3097210fcc", size = 524567, upload_time = "2025-04-19T14:01:21.457Z" }, + { url = "https://files.pythonhosted.org/packages/de/45/d84d909202755ab9d3379e5481fdf70f53344ebefbd68d6f5803ddde98a6/pendulum-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d439fccaa35c91f686bd59d30604dab01e8b5c1d0dd66e81648c432fd3f8a539", size = 525571, upload_time = "2025-04-19T14:01:23.329Z" }, + { url = "https://files.pythonhosted.org/packages/0d/e0/4de160773ce3c2f7843c310db19dd919a0cd02cc1c0384866f63b18a6251/pendulum-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:43288773a86d9c5c0ddb645f88f615ff6bd12fd1410b34323662beccb18f3b49", size = 260259, upload_time = "2025-04-19T14:01:24.689Z" }, + { url = "https://files.pythonhosted.org/packages/c1/7f/ffa278f78112c6c6e5130a702042f52aab5c649ae2edf814df07810bbba5/pendulum-3.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:569ea5072ae0f11d625e03b36d865f8037b76e838a3b621f6967314193896a11", size = 253899, upload_time = "2025-04-19T14:01:26.442Z" }, + { url = "https://files.pythonhosted.org/packages/7a/d7/b1bfe15a742f2c2713acb1fdc7dc3594ff46ef9418ac6a96fcb12a6ba60b/pendulum-3.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4dfd53e7583ccae138be86d6c0a0b324c7547df2afcec1876943c4d481cf9608", size = 336209, upload_time = "2025-04-19T14:01:27.815Z" }, + { url = "https://files.pythonhosted.org/packages/eb/87/0392da0c603c828b926d9f7097fbdddaafc01388cb8a00888635d04758c3/pendulum-3.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6a6e06a28f3a7d696546347805536f6f38be458cb79de4f80754430696bea9e6", size = 323130, upload_time = "2025-04-19T14:01:29.336Z" }, + { url = "https://files.pythonhosted.org/packages/c0/61/95f1eec25796be6dddf71440ee16ec1fd0c573fc61a73bd1ef6daacd529a/pendulum-3.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e68d6a51880708084afd8958af42dc8c5e819a70a6c6ae903b1c4bfc61e0f25", size = 341509, upload_time = "2025-04-19T14:01:31.1Z" }, + { url = "https://files.pythonhosted.org/packages/b5/7b/eb0f5e6aa87d5e1b467a1611009dbdc92f0f72425ebf07669bfadd8885a6/pendulum-3.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e3f1e5da39a7ea7119efda1dd96b529748c1566f8a983412d0908455d606942", size = 378674, upload_time = "2025-04-19T14:01:32.974Z" }, + { url = "https://files.pythonhosted.org/packages/29/68/5a4c1b5de3e54e16cab21d2ec88f9cd3f18599e96cc90a441c0b0ab6b03f/pendulum-3.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9af1e5eeddb4ebbe1b1c9afb9fd8077d73416ade42dd61264b3f3b87742e0bb", size = 436133, upload_time = "2025-04-19T14:01:34.349Z" }, + { url = "https://files.pythonhosted.org/packages/87/5d/f7a1d693e5c0f789185117d5c1d5bee104f5b0d9fbf061d715fb61c840a8/pendulum-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20f74aa8029a42e327bfc150472e0e4d2358fa5d795f70460160ba81b94b6945", size = 351232, upload_time = "2025-04-19T14:01:35.669Z" }, + { url = "https://files.pythonhosted.org/packages/30/77/c97617eb31f1d0554edb073201a294019b9e0a9bd2f73c68e6d8d048cd6b/pendulum-3.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cf6229e5ee70c2660148523f46c472e677654d0097bec010d6730f08312a4931", size = 521562, upload_time = "2025-04-19T14:01:37.05Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/0d0ef3393303877e757b848ecef8a9a8c7627e17e7590af82d14633b2cd1/pendulum-3.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:350cabb23bf1aec7c7694b915d3030bff53a2ad4aeabc8c8c0d807c8194113d6", size = 523221, upload_time = "2025-04-19T14:01:38.444Z" }, + { url = "https://files.pythonhosted.org/packages/99/f3/aefb579aa3cebd6f2866b205fc7a60d33e9a696e9e629024752107dc3cf5/pendulum-3.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:42959341e843077c41d47420f28c3631de054abd64da83f9b956519b5c7a06a7", size = 260502, upload_time = "2025-04-19T14:01:39.814Z" }, + { url = "https://files.pythonhosted.org/packages/02/74/4332b5d6e34c63d4df8e8eab2249e74c05513b1477757463f7fdca99e9be/pendulum-3.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:006758e2125da2e624493324dfd5d7d1b02b0c44bc39358e18bf0f66d0767f5f", size = 253089, upload_time = "2025-04-19T14:01:41.171Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1f/af928ba4aa403dac9569f787adcf024005e7654433d71f7a84e608716837/pendulum-3.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:28658b0baf4b30eb31d096a375983cfed033e60c0a7bbe94fa23f06cd779b50b", size = 336209, upload_time = "2025-04-19T14:01:42.775Z" }, + { url = "https://files.pythonhosted.org/packages/b6/16/b010643007ba964c397da7fa622924423883c1bbff1a53f9d1022cd7f024/pendulum-3.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b114dcb99ce511cb8f5495c7b6f0056b2c3dba444ef1ea6e48030d7371bd531a", size = 323132, upload_time = "2025-04-19T14:01:44.577Z" }, + { url = "https://files.pythonhosted.org/packages/64/19/c3c47aeecb5d9bceb0e89faafd800d39809b696c5b7bba8ec8370ad5052c/pendulum-3.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2404a6a54c80252ea393291f0b7f35525a61abae3d795407f34e118a8f133a18", size = 341509, upload_time = "2025-04-19T14:01:46.084Z" }, + { url = "https://files.pythonhosted.org/packages/38/cf/c06921ff6b860ff7e62e70b8e5d4dc70e36f5abb66d168bd64d51760bc4e/pendulum-3.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d06999790d9ee9962a1627e469f98568bf7ad1085553fa3c30ed08b3944a14d7", size = 378674, upload_time = "2025-04-19T14:01:47.727Z" }, + { url = "https://files.pythonhosted.org/packages/62/0b/a43953b9eba11e82612b033ac5133f716f1b76b6108a65da6f408b3cc016/pendulum-3.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94751c52f6b7c306734d1044c2c6067a474237e1e5afa2f665d1fbcbbbcf24b3", size = 436133, upload_time = "2025-04-19T14:01:49.126Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a0/ec3d70b3b96e23ae1d039f132af35e17704c22a8250d1887aaefea4d78a6/pendulum-3.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5553ac27be05e997ec26d7f004cf72788f4ce11fe60bb80dda604a64055b29d0", size = 351232, upload_time = "2025-04-19T14:01:50.575Z" }, + { url = "https://files.pythonhosted.org/packages/f4/97/aba23f1716b82f6951ba2b1c9178a2d107d1e66c102762a9bf19988547ea/pendulum-3.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f8dee234ca6142bf0514368d01a72945a44685aaa2fc4c14c98d09da9437b620", size = 521563, upload_time = "2025-04-19T14:01:51.9Z" }, + { url = "https://files.pythonhosted.org/packages/01/33/2c0d5216cc53d16db0c4b3d510f141ee0a540937f8675948541190fbd48b/pendulum-3.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7378084fe54faab4ee481897a00b710876f2e901ded6221671e827a253e643f2", size = 523221, upload_time = "2025-04-19T14:01:53.275Z" }, + { url = "https://files.pythonhosted.org/packages/51/89/8de955c339c31aeae77fd86d3225509b998c81875e9dba28cb88b8cbf4b3/pendulum-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:8539db7ae2c8da430ac2515079e288948c8ebf7eb1edd3e8281b5cdf433040d6", size = 260501, upload_time = "2025-04-19T14:01:54.749Z" }, + { url = "https://files.pythonhosted.org/packages/15/c3/226a3837363e94f8722461848feec18bfdd7d5172564d53aa3c3397ff01e/pendulum-3.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:1ce26a608e1f7387cd393fba2a129507c4900958d4f47b90757ec17656856571", size = 253087, upload_time = "2025-04-19T14:01:55.998Z" }, + { url = "https://files.pythonhosted.org/packages/6e/23/e98758924d1b3aac11a626268eabf7f3cf177e7837c28d47bf84c64532d0/pendulum-3.1.0-py3-none-any.whl", hash = "sha256:f9178c2a8e291758ade1e8dd6371b1d26d08371b4c7730a6e9a3ef8b16ebae0f", size = 111799, upload_time = "2025-04-19T14:02:34.739Z" }, +] + [[package]] name = "playwright" version = "1.49.1" From 1084d647a447083856080cedbd0f4e80e40cbd0d Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 9 May 2025 15:04:34 -0400 Subject: [PATCH 173/244] feat(app): Create metrics endpoints --- ..._add_manual_strategy_to_batch_strategy_.py | 6 + ...5e16e0738f_create_backlogsnapshot_table.py | 2 +- collector_db/AsyncDatabaseClient.py | 67 +++-- collector_db/DatabaseClient.py | 39 ++- collector_db/StatementComposer.py | 27 +- ...tMetricsURLsBreakdownPendingResponseDTO.py | 3 +- ...etricsURLsBreakdownSubmittedResponseDTO.py | 2 +- tests/helpers/DBDataCreator.py | 21 +- .../helpers/test_batch_creation_parameters.py | 2 +- .../api/helpers/RequestValidator.py | 29 +- .../integration/api/test_metrics.py | 255 +++++++++++++++++- 11 files changed, 391 insertions(+), 62 deletions(-) diff --git a/alembic/versions/2025_05_03_0956-028565b77b9e_add_manual_strategy_to_batch_strategy_.py b/alembic/versions/2025_05_03_0956-028565b77b9e_add_manual_strategy_to_batch_strategy_.py index c5af4d33..9ec86fee 100644 --- a/alembic/versions/2025_05_03_0956-028565b77b9e_add_manual_strategy_to_batch_strategy_.py +++ b/alembic/versions/2025_05_03_0956-028565b77b9e_add_manual_strategy_to_batch_strategy_.py @@ -38,6 +38,12 @@ def upgrade() -> None: def downgrade() -> None: + # Delete all batches with manual strategy + op.execute(""" + DELETE FROM BATCHES + WHERE STRATEGY = 'manual' + """) + switch_enum_type( table_name="batches", column_name="strategy", diff --git a/alembic/versions/2025_05_06_0816-e55e16e0738f_create_backlogsnapshot_table.py b/alembic/versions/2025_05_06_0816-e55e16e0738f_create_backlogsnapshot_table.py index d6b118fb..4d2fe7c5 100644 --- a/alembic/versions/2025_05_06_0816-e55e16e0738f_create_backlogsnapshot_table.py +++ b/alembic/versions/2025_05_06_0816-e55e16e0738f_create_backlogsnapshot_table.py @@ -21,7 +21,7 @@ def upgrade() -> None: op.create_table( 'backlog_snapshot', - sa.Column('id', sa.Integer(), nullable=False), + sa.Column('id', sa.Integer(), nullable=False, primary_key=True), sa.Column('count_pending_total', sa.Integer(), nullable=False), sa.Column('created_at', sa.DateTime(), nullable=False), ) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 422d1d20..e9438c5b 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -3,7 +3,8 @@ from typing import Optional, Type, Any, List from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, update, asc, delete, insert +from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, update, asc, delete, insert, CTE +from sqlalchemy.dialects import postgresql from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import selectinload, joinedload, QueryableAttribute, aliased @@ -1994,9 +1995,6 @@ async def get_urls_breakdown_submitted_metrics( self, session: AsyncSession ) -> GetMetricsURLsBreakdownSubmittedResponseDTO: - # TODO: Wrong submitted at time: The created at does not indicate - # when it was submitted - # Build the query week = func.date_trunc('week', URLDataSource.created_at) @@ -2040,7 +2038,7 @@ async def get_urls_aggregated_metrics( ).limit(1) oldest_pending_url = await session.execute(oldest_pending_url_query) - oldest_pending_url = oldest_pending_url.scalars().one_or_none() + oldest_pending_url = oldest_pending_url.one_or_none() if oldest_pending_url is None: oldest_pending_url_id = None oldest_pending_created_at = None @@ -2079,46 +2077,56 @@ def case_column(status: URLStatus, label): oldest_pending_url_created_at=oldest_pending_created_at, ) + def compile(self, statement): + compiled_sql = statement.compile(dialect=postgresql.dialect(), compile_kwargs={"literal_binds": True}) + return compiled_sql + @session_manager async def get_urls_breakdown_pending_metrics( self, session: AsyncSession ) -> GetMetricsURLsBreakdownPendingResponseDTO: + sc = StatementComposer + flags: CTE = sc.url_annotation_flags_query( + status=URLStatus.PENDING + ) - # TODO: Replace with CTE - flags = URLAnnotationFlag - url = URL - week = func.date_trunc('week', url.created_at) + week = func.date_trunc('week', URL.created_at) # Build the query query = ( select( week.label('week'), - func.count(url.id).label('count_total'), - func.count(case((flags.has_user_record_type_annotation == True, 1))).label('user_record_type_count'), - func.count(case((flags.has_user_relevant_annotation == True, 1))).label('user_relevant_count'), - func.count(case((flags.has_user_agency_annotation == True, 1))).label('user_agency_count'), - ) - .where(url.outcome == URLStatus.PENDING.value) - .join(flags.url) + func.count(URL.id).label('count_total'), + func.count(case( + (flags.c.has_user_record_type_annotation == True, 1)) + ).label('user_record_type_count'), + func.count(case( + (flags.c.has_user_relevant_annotation == True, 1)) + ).label('user_relevant_count'), + func.count(case( + (flags.c.has_user_agency_annotation == True, 1)) + ).label('user_agency_count'), + ) + .join(flags, flags.c.url_id == URL.id) .group_by(week) .order_by(week.asc()) ) # Execute the query and return the results results = await session.execute(query) - all_results = results.scalars().all() + all_results = results.all() final_results: list[GetMetricsURLsBreakdownPendingResponseInnerDTO] = [] for result in all_results: dto = GetMetricsURLsBreakdownPendingResponseInnerDTO( week_created_at=result.week, count_pending_total=result.count_total, - count_pending_relevant_user=result.auto_record_type_count, - count_pending_record_type_user=result.auto_relevant_count, - count_pending_agency_user=result.auto_agency_count, + count_pending_relevant_user=result.user_relevant_count, + count_pending_record_type_user=result.user_record_type_count, + count_pending_agency_user=result.user_agency_count, ) final_results.append(dto) return GetMetricsURLsBreakdownPendingResponseDTO( @@ -2175,7 +2183,8 @@ async def get_backlog_metrics( @session_manager async def populate_backlog_snapshot( self, - session: AsyncSession + session: AsyncSession, + dt: Optional[datetime] = None ): sc = StatementComposer # Get count of pending URLs @@ -2183,12 +2192,18 @@ async def populate_backlog_snapshot( sc.count_distinct(URL.id, label="count") ).where( URL.outcome == URLStatus.PENDING.value - ).subquery("pending_count") + ) + + raw_result = await session.execute(query) + count = raw_result.one()[0] # insert count into snapshot - await session.execute( - insert(BacklogSnapshot).values( - count=query.c.count - ) + snapshot = BacklogSnapshot( + count_pending_total=count ) + if dt is not None: + snapshot.created_at = dt + + session.add(snapshot) + diff --git a/collector_db/DatabaseClient.py b/collector_db/DatabaseClient.py index 112e5689..8bd8105f 100644 --- a/collector_db/DatabaseClient.py +++ b/collector_db/DatabaseClient.py @@ -1,10 +1,10 @@ from functools import wraps from typing import Optional, List -from sqlalchemy import create_engine +from sqlalchemy import create_engine, update from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import AsyncSession -from sqlalchemy.orm import sessionmaker, scoped_session +from sqlalchemy.orm import sessionmaker, scoped_session, Session from collector_db.ConfigManager import ConfigManager from collector_db.DTOs.BatchInfo import BatchInfo @@ -13,10 +13,11 @@ from collector_db.DTOs.LogInfo import LogInfo from collector_db.DTOs.URLInfo import URLInfo from collector_db.DTOs.URLMapping import URLMapping -from collector_db.models import Base, Batch, URL, Log, Duplicate -from collector_manager.enums import CollectorType +from collector_db.models import Base, Batch, URL, Log, Duplicate, URLDataSource +from collector_manager.enums import CollectorType, URLStatus from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO from core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO +from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmittedURLInfo from core.EnvVarManager import EnvVarManager from core.enums import BatchStatus @@ -111,6 +112,8 @@ def insert_url(self, session, url_info: URLInfo) -> int: outcome=url_info.outcome.value, name=url_info.name ) + if url_info.created_at is not None: + url_entry.created_at = url_info.created_at session.add(url_entry) session.commit() session.refresh(url_entry) @@ -166,6 +169,34 @@ def update_url(self, session, url_info: URLInfo): url = session.query(URL).filter_by(id=url_info.id).first() url.collector_metadata = url_info.collector_metadata + @session_manager + def mark_urls_as_submitted( + self, + session: Session, + infos: list[SubmittedURLInfo] + ): + for info in infos: + url_id = info.url_id + data_source_id = info.data_source_id + + query = ( + update(URL) + .where(URL.id == url_id) + .values( + outcome=URLStatus.SUBMITTED.value + ) + ) + + url_data_source_object = URLDataSource( + url_id=url_id, + data_source_id=data_source_id + ) + if info.submitted_at is not None: + url_data_source_object.created_at = info.submitted_at + session.add(url_data_source_object) + + session.execute(query) + if __name__ == "__main__": client = DatabaseClient() print("Database client initialized.") diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index 648e44f2..23c817b1 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -1,6 +1,6 @@ -from typing import Any +from typing import Any, Optional -from sqlalchemy import Select, select, exists, Table, func, Subquery, and_, not_, ColumnElement, case, literal +from sqlalchemy import Select, select, exists, Table, func, Subquery, and_, not_, ColumnElement, case, literal, CTE from sqlalchemy.orm import aliased from collector_db.enums import URLMetadataAttributeType, ValidationStatus, TaskType @@ -126,27 +126,29 @@ def sum_distinct(field, label): return func.sum(func.distinct(field)).label(label) @staticmethod - def url_annotation_flags_query() -> Select: + def url_annotation_flags_query( + status: Optional[URLStatus] = None + ) -> CTE: stmt = ( select( URL.id.label("url_id"), case((AutoRecordTypeSuggestion.url_id != None, literal(True)), else_=literal(False)).label( - "has_auto_record_type_suggestion" + "has_auto_record_type_annotation" ), case((AutoRelevantSuggestion.url_id != None, literal(True)), else_=literal(False)).label( - "has_auto_relevant_suggestion" + "has_auto_relevant_annotation" ), case((AutomatedUrlAgencySuggestion.url_id != None, literal(True)), else_=literal(False)).label( - "has_auto_agency_suggestion" + "has_auto_agency_annotation" ), case((UserRecordTypeSuggestion.url_id != None, literal(True)), else_=literal(False)).label( - "has_user_record_type_suggestion" + "has_user_record_type_annotation" ), case((UserRelevantSuggestion.url_id != None, literal(True)), else_=literal(False)).label( - "has_user_relevant_suggestion" + "has_user_relevant_annotation" ), case((UserUrlAgencySuggestion.url_id != None, literal(True)), else_=literal(False)).label( - "has_user_agency_suggestion" + "has_user_agency_annotation" ), case((ReviewingUserURL.url_id != None, literal(True)), else_=literal(False)).label("was_reviewed"), ) @@ -158,4 +160,9 @@ def url_annotation_flags_query() -> Select: .outerjoin(UserUrlAgencySuggestion, URL.id == UserUrlAgencySuggestion.url_id) .outerjoin(ReviewingUserURL, URL.id == ReviewingUserURL.url_id) ) - return stmt \ No newline at end of file + if status is not None: + stmt = stmt.where( + URL.outcome == status.value + ) + + return stmt.cte("url_annotation_flags") \ No newline at end of file diff --git a/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py b/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py index 304555b0..22235e45 100644 --- a/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py +++ b/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py @@ -1,7 +1,8 @@ from pydantic import BaseModel +from datetime import datetime class GetMetricsURLsBreakdownPendingResponseInnerDTO(BaseModel): - week_created_at: str + week_created_at: datetime count_pending_total: int count_pending_relevant_user: int count_pending_record_type_user: int diff --git a/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py b/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py index 687c34c8..d5c1dde5 100644 --- a/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py +++ b/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py @@ -7,4 +7,4 @@ class GetMetricsURLsBreakdownSubmittedInnerDTO(BaseModel): count_submitted: int class GetMetricsURLsBreakdownSubmittedResponseDTO(BaseModel): - entries: list \ No newline at end of file + entries: list[GetMetricsURLsBreakdownSubmittedInnerDTO] \ No newline at end of file diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 2fad7b0f..71338d84 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -21,7 +21,7 @@ from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmittedURLInfo from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO from core.enums import BatchStatus, SuggestionType, RecordType -from helpers.test_batch_creation_parameters import TestBatchCreationParameters, AnnotationInfo +from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, AnnotationInfo from tests.helpers.simple_test_data_functions import generate_test_urls @@ -314,23 +314,26 @@ def urls( ) ) + url_insert_info = self.db_client.insert_urls( + url_infos=url_infos, + batch_id=batch_id, + ) + # If outcome is submitted, also add entry to DataSourceURL if outcome == URLStatus.SUBMITTED: submitted_url_infos = [] - for url_info in url_infos: + for url_id in url_insert_info.url_ids: submitted_url_info = SubmittedURLInfo( - url_id=url_info.url_id, - data_source_id=url_info.url_id, # Use same ID for convenience, + url_id=url_id, + data_source_id=url_id, # Use same ID for convenience, request_error=None, submitted_at=created_at ) - asyncio.run(self.adb_client.mark_urls_as_submitted(submitted_url_infos)) + submitted_url_infos.append(submitted_url_info) + self.db_client.mark_urls_as_submitted(submitted_url_infos) - return self.db_client.insert_urls( - url_infos=url_infos, - batch_id=batch_id, - ) + return url_insert_info async def url_miscellaneous_metadata( self, diff --git a/tests/helpers/test_batch_creation_parameters.py b/tests/helpers/test_batch_creation_parameters.py index ef8400b9..cfb4805e 100644 --- a/tests/helpers/test_batch_creation_parameters.py +++ b/tests/helpers/test_batch_creation_parameters.py @@ -18,7 +18,7 @@ class AnnotationInfo(BaseModel): final_review_approved: Optional[bool] = None def has_annotations(self): - return any([ + return any(value is not None for value in [ self.user_relevant, self.auto_relevant, self.user_record_type, diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index a61679d5..9207305a 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -19,6 +19,9 @@ from core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO from core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO from core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO +from core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO +from core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO +from core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ @@ -422,4 +425,28 @@ async def get_batches_breakdown_metrics(self, page: int) -> GetMetricsBatchesBre url="/metrics/batches/breakdown", params={"page": page} ) - return GetMetricsBatchesBreakdownResponseDTO(**data) \ No newline at end of file + return GetMetricsBatchesBreakdownResponseDTO(**data) + + async def get_urls_breakdown_submitted_metrics(self) -> GetMetricsURLsBreakdownSubmittedResponseDTO: + data = self.get_v2( + url="/metrics/urls/breakdown/submitted" + ) + return GetMetricsURLsBreakdownSubmittedResponseDTO(**data) + + async def get_urls_breakdown_pending_metrics(self) -> GetMetricsURLsBreakdownPendingResponseDTO: + data = self.get_v2( + url="/metrics/urls/breakdown/pending" + ) + return GetMetricsURLsBreakdownPendingResponseDTO(**data) + + async def get_backlog_metrics(self) -> GetMetricsBacklogResponseDTO: + data = self.get_v2( + url="/metrics/backlog" + ) + return GetMetricsBacklogResponseDTO(**data) + + async def get_urls_aggregated_metrics(self) -> GetMetricsURLsAggregatedResponseDTO: + data = self.get_v2( + url="/metrics/urls/aggregate", + ) + return GetMetricsURLsAggregatedResponseDTO(**data) \ No newline at end of file diff --git a/tests/test_automated/integration/api/test_metrics.py b/tests/test_automated/integration/api/test_metrics.py index d2f4adc6..fc45ad0b 100644 --- a/tests/test_automated/integration/api/test_metrics.py +++ b/tests/test_automated/integration/api/test_metrics.py @@ -2,8 +2,9 @@ import pytest from collector_manager.enums import URLStatus, CollectorType -from core.enums import BatchStatus -from helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters +from core.enums import BatchStatus, RecordType +from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters, \ + AnnotationInfo @pytest.mark.asyncio @@ -190,7 +191,7 @@ async def test_get_urls_breakdown_submitted_metrics(api_test_helper): urls=[ TestURLCreationParameters( count=3, - status=URLStatus.REJECTED + status=URLStatus.SUBMITTED ) ], created_at=today.subtract(weeks=1), @@ -202,7 +203,7 @@ async def test_get_urls_breakdown_submitted_metrics(api_test_helper): urls=[ TestURLCreationParameters( count=3, - status=URLStatus.REJECTED + status=URLStatus.SUBMITTED ), TestURLCreationParameters( count=4, @@ -216,24 +217,262 @@ async def test_get_urls_breakdown_submitted_metrics(api_test_helper): ) batch_3 = await ath.db_data_creator.batch_v2(batch_3_params) + dto = await ath.request_validator.get_urls_breakdown_submitted_metrics() + assert len(dto.entries) == 2 + + entry_1 = dto.entries[0] + assert entry_1.count_submitted == 6 + + entry_2 = dto.entries[1] + assert entry_2.count_submitted == 2 + + @pytest.mark.asyncio async def test_get_urls_breakdown_pending_metrics(api_test_helper): # Build URLs, broken down into three separate weeks, # with each week having a different number of pending URLs # with a different number of kinds of annotations per URLs + + today = pendulum.today() + ath = api_test_helper + + agency_id = await ath.db_data_creator.agency() # Additionally, add some URLs that are submitted, # validated, errored, and ensure they are not counted + batch_1_params = TestBatchCreationParameters( + strategy=CollectorType.MANUAL, + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.PENDING, + annotation_info=AnnotationInfo( + user_relevant=False + ) + ), + TestURLCreationParameters( + count=2, + status=URLStatus.SUBMITTED + ), + ] + ) + batch_1 = await ath.db_data_creator.batch_v2(batch_1_params) + batch_2_params = TestBatchCreationParameters( + strategy=CollectorType.EXAMPLE, + urls=[ + TestURLCreationParameters( + count=3, + status=URLStatus.PENDING, + annotation_info=AnnotationInfo( + user_relevant=True, + user_record_type=RecordType.CALLS_FOR_SERVICE + ) + ) + ], + created_at=today.subtract(weeks=1), + ) + batch_2 = await ath.db_data_creator.batch_v2(batch_2_params) + batch_3_params = TestBatchCreationParameters( + strategy=CollectorType.AUTO_GOOGLER, + created_at=today.subtract(weeks=1), + urls=[ + TestURLCreationParameters( + count=3, + status=URLStatus.SUBMITTED + ), + TestURLCreationParameters( + count=4, + status=URLStatus.ERROR + ), + TestURLCreationParameters( + count=5, + status=URLStatus.PENDING, + annotation_info=AnnotationInfo( + user_relevant=True, + user_record_type=RecordType.INCARCERATION_RECORDS, + user_agency=agency_id + ) + ), + ] + ) + batch_3 = await ath.db_data_creator.batch_v2(batch_3_params) + + dto = await ath.request_validator.get_urls_breakdown_pending_metrics() + assert len(dto.entries) == 2 + + entry_1 = dto.entries[0] + assert entry_1.count_pending_total == 8 + assert entry_1.count_pending_relevant_user == 8 + assert entry_1.count_pending_record_type_user == 8 + assert entry_1.count_pending_agency_user == 5 + + entry_2 = dto.entries[1] + assert entry_2.count_pending_total == 1 + assert entry_2.count_pending_relevant_user == 1 + assert entry_2.count_pending_record_type_user == 0 + assert entry_2.count_pending_agency_user == 0 + +@pytest.mark.asyncio +async def test_get_urls_aggregate_metrics(api_test_helper): + ath = api_test_helper + today = pendulum.today() + + batch_0_params = TestBatchCreationParameters( + strategy=CollectorType.MANUAL, + created_at=today.subtract(days=1), + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.PENDING, + ), + ] + ) + batch_0 = await ath.db_data_creator.batch_v2(batch_0_params) + oldest_url_id = batch_0.url_creation_infos[URLStatus.PENDING].url_mappings[0].url_id + + + batch_1_params = TestBatchCreationParameters( + strategy=CollectorType.MANUAL, + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.PENDING, + ), + TestURLCreationParameters( + count=2, + status=URLStatus.SUBMITTED + ), + ] + ) + batch_1 = await ath.db_data_creator.batch_v2(batch_1_params) + + batch_2_params = TestBatchCreationParameters( + strategy=CollectorType.AUTO_GOOGLER, + urls=[ + TestURLCreationParameters( + count=4, + status=URLStatus.PENDING, + ), + TestURLCreationParameters( + count=2, + status=URLStatus.ERROR + ), + TestURLCreationParameters( + count=1, + status=URLStatus.VALIDATED + ), + TestURLCreationParameters( + count=5, + status=URLStatus.REJECTED + ), + ] + ) + batch_2 = await ath.db_data_creator.batch_v2(batch_2_params) + + dto = await ath.request_validator.get_urls_aggregated_metrics() + + assert dto.oldest_pending_url_id == oldest_url_id + assert dto.oldest_pending_url_created_at == today.subtract(days=1).in_timezone('UTC').naive() + assert dto.count_urls_pending == 6 + assert dto.count_urls_rejected == 5 + assert dto.count_urls_errors == 2 + assert dto.count_urls_validated == 1 + assert dto.count_urls_submitted == 2 + assert dto.count_urls_total == 16 - raise NotImplementedError @pytest.mark.asyncio async def test_get_backlog_metrics(api_test_helper): - # Populate the backlog table and test that backlog metrics returned on a weekly basis + today = pendulum.today() + + ath = api_test_helper + adb_client = ath.adb_client() + + # Populate the backlog table and test that backlog metrics returned on a weekly basis # Ensure that multiple days in each week are added to the backlog table, with different values - # Test that the count closest to the beginning of the week is returned for each week - raise NotImplementedError + batch_1_params = TestBatchCreationParameters( + strategy=CollectorType.MANUAL, + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.PENDING, + annotation_info=AnnotationInfo( + user_relevant=False + ) + ), + TestURLCreationParameters( + count=2, + status=URLStatus.SUBMITTED + ), + ] + ) + batch_1 = await ath.db_data_creator.batch_v2(batch_1_params) + + await adb_client.populate_backlog_snapshot( + dt=today.subtract(weeks=3).naive() + ) + + await adb_client.populate_backlog_snapshot( + dt=today.subtract(weeks=2, days=3).naive() + ) + + batch_2_params = TestBatchCreationParameters( + strategy=CollectorType.AUTO_GOOGLER, + urls=[ + TestURLCreationParameters( + count=4, + status=URLStatus.PENDING, + annotation_info=AnnotationInfo( + user_relevant=False + ) + ), + TestURLCreationParameters( + count=2, + status=URLStatus.ERROR + ), + ] + ) + batch_2 = await ath.db_data_creator.batch_v2(batch_2_params) + + await adb_client.populate_backlog_snapshot( + dt=today.subtract(weeks=2).naive() + ) + + await adb_client.populate_backlog_snapshot( + dt=today.subtract(weeks=1, days=4).naive() + ) + + batch_3_params = TestBatchCreationParameters( + strategy=CollectorType.AUTO_GOOGLER, + urls=[ + TestURLCreationParameters( + count=7, + status=URLStatus.PENDING, + annotation_info=AnnotationInfo( + user_relevant=False + ) + ), + TestURLCreationParameters( + count=5, + status=URLStatus.VALIDATED + ), + ] + ) + batch_3 = await ath.db_data_creator.batch_v2(batch_3_params) + + await adb_client.populate_backlog_snapshot( + dt=today.subtract(weeks=1).naive() + ) + + dto = await ath.request_validator.get_backlog_metrics() + + assert len(dto.entries) == 3 + + # Test that the count closest to the beginning of the week is returned for each week + assert dto.entries[0].count_pending_total == 1 + assert dto.entries[1].count_pending_total == 5 + assert dto.entries[2].count_pending_total == 12 \ No newline at end of file From 7de9c50a90532bf3db3c3a44bca32db29a3f451c Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sun, 11 May 2025 10:54:53 -0400 Subject: [PATCH 174/244] DRAFT --- ...ebe_set_default_created_at_for_backlog_.py | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 alembic/versions/2025_05_11_1054-9d4002437ebe_set_default_created_at_for_backlog_.py diff --git a/alembic/versions/2025_05_11_1054-9d4002437ebe_set_default_created_at_for_backlog_.py b/alembic/versions/2025_05_11_1054-9d4002437ebe_set_default_created_at_for_backlog_.py new file mode 100644 index 00000000..76431bb3 --- /dev/null +++ b/alembic/versions/2025_05_11_1054-9d4002437ebe_set_default_created_at_for_backlog_.py @@ -0,0 +1,38 @@ +"""Set default created_at for backlog_snapshot + +Revision ID: 9d4002437ebe +Revises: 6f2007bbcce3 +Create Date: 2025-05-11 10:54:22.797147 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '9d4002437ebe' +down_revision: Union[str, None] = '6f2007bbcce3' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + op.alter_column( + table_name='backlog_snapshots', + column_name='created_at', + existing_type=sa.DateTime(), + nullable=False, + server_default=sa.text('now()') + ) + + +def downgrade() -> None: + op.alter_column( + table_name='backlog_snapshots', + column_name='created_at', + existing_type=sa.DateTime(), + nullable=False, + server_default=None + ) From c61d9149e8d03417f340ebdb5001a94bdfeade96 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sun, 11 May 2025 16:23:43 -0400 Subject: [PATCH 175/244] DRAFT --- ..._11_1054-9d4002437ebe_set_default_created_at_for_backlog_.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alembic/versions/2025_05_11_1054-9d4002437ebe_set_default_created_at_for_backlog_.py b/alembic/versions/2025_05_11_1054-9d4002437ebe_set_default_created_at_for_backlog_.py index 76431bb3..f45fee4b 100644 --- a/alembic/versions/2025_05_11_1054-9d4002437ebe_set_default_created_at_for_backlog_.py +++ b/alembic/versions/2025_05_11_1054-9d4002437ebe_set_default_created_at_for_backlog_.py @@ -20,7 +20,7 @@ def upgrade() -> None: op.alter_column( - table_name='backlog_snapshots', + table_name='backlog_snapshot', column_name='created_at', existing_type=sa.DateTime(), nullable=False, From 1281e408f3f94325227cffd6a47cde08bd322a84 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 12 May 2025 16:48:50 -0400 Subject: [PATCH 176/244] Fix bug in `get_urls_breakdown_pending_metrics` --- collector_db/AsyncDatabaseClient.py | 25 +++++++++++++---- collector_db/StatementComposer.py | 42 ----------------------------- 2 files changed, 20 insertions(+), 47 deletions(-) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index e9438c5b..de0bd36a 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -3,7 +3,7 @@ from typing import Optional, Type, Any, List from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, update, asc, delete, insert, CTE +from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, update, asc, delete, insert, CTE, literal from sqlalchemy.dialects import postgresql from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker @@ -2088,9 +2088,23 @@ async def get_urls_breakdown_pending_metrics( ) -> GetMetricsURLsBreakdownPendingResponseDTO: sc = StatementComposer - flags: CTE = sc.url_annotation_flags_query( - status=URLStatus.PENDING - ) + flags = ( + select( + URL.id.label("url_id"), + case((UserRecordTypeSuggestion.url_id != None, literal(True)), else_=literal(False)).label( + "has_user_record_type_annotation" + ), + case((UserRelevantSuggestion.url_id != None, literal(True)), else_=literal(False)).label( + "has_user_relevant_annotation" + ), + case((UserUrlAgencySuggestion.url_id != None, literal(True)), else_=literal(False)).label( + "has_user_agency_annotation" + ), + ) + .outerjoin(UserRecordTypeSuggestion, URL.id == UserRecordTypeSuggestion.url_id) + .outerjoin(UserRelevantSuggestion, URL.id == UserRelevantSuggestion.url_id) + .outerjoin(UserUrlAgencySuggestion, URL.id == UserUrlAgencySuggestion.url_id) + ).cte("flags") week = func.date_trunc('week', URL.created_at) @@ -2110,7 +2124,8 @@ async def get_urls_breakdown_pending_metrics( (flags.c.has_user_agency_annotation == True, 1)) ).label('user_agency_count'), ) - .join(flags, flags.c.url_id == URL.id) + .outerjoin(flags, flags.c.url_id == URL.id) + .where(URL.outcome == URLStatus.PENDING.value) .group_by(week) .order_by(week.asc()) ) diff --git a/collector_db/StatementComposer.py b/collector_db/StatementComposer.py index 23c817b1..2ea33c5f 100644 --- a/collector_db/StatementComposer.py +++ b/collector_db/StatementComposer.py @@ -124,45 +124,3 @@ def count_distinct(field, label): @staticmethod def sum_distinct(field, label): return func.sum(func.distinct(field)).label(label) - - @staticmethod - def url_annotation_flags_query( - status: Optional[URLStatus] = None - ) -> CTE: - stmt = ( - select( - URL.id.label("url_id"), - case((AutoRecordTypeSuggestion.url_id != None, literal(True)), else_=literal(False)).label( - "has_auto_record_type_annotation" - ), - case((AutoRelevantSuggestion.url_id != None, literal(True)), else_=literal(False)).label( - "has_auto_relevant_annotation" - ), - case((AutomatedUrlAgencySuggestion.url_id != None, literal(True)), else_=literal(False)).label( - "has_auto_agency_annotation" - ), - case((UserRecordTypeSuggestion.url_id != None, literal(True)), else_=literal(False)).label( - "has_user_record_type_annotation" - ), - case((UserRelevantSuggestion.url_id != None, literal(True)), else_=literal(False)).label( - "has_user_relevant_annotation" - ), - case((UserUrlAgencySuggestion.url_id != None, literal(True)), else_=literal(False)).label( - "has_user_agency_annotation" - ), - case((ReviewingUserURL.url_id != None, literal(True)), else_=literal(False)).label("was_reviewed"), - ) - .outerjoin(AutoRecordTypeSuggestion, URL.id == AutoRecordTypeSuggestion.url_id) - .outerjoin(AutoRelevantSuggestion, URL.id == AutoRelevantSuggestion.url_id) - .outerjoin(AutomatedUrlAgencySuggestion, URL.id == AutomatedUrlAgencySuggestion.url_id) - .outerjoin(UserRecordTypeSuggestion, URL.id == UserRecordTypeSuggestion.url_id) - .outerjoin(UserRelevantSuggestion, URL.id == UserRelevantSuggestion.url_id) - .outerjoin(UserUrlAgencySuggestion, URL.id == UserUrlAgencySuggestion.url_id) - .outerjoin(ReviewingUserURL, URL.id == ReviewingUserURL.url_id) - ) - if status is not None: - stmt = stmt.where( - URL.outcome == status.value - ) - - return stmt.cte("url_annotation_flags") \ No newline at end of file From 04e455160265ead326231c5ea7210a4c169bbd5d Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 12 May 2025 18:33:18 -0400 Subject: [PATCH 177/244] fix(app): Address bug in agency identification Previously, agency identification was erroneously pulling up URLs that had an error status. This has been addressed. --- ...ebe_set_default_created_at_for_backlog_.py | 2 +- collector_db/AsyncDatabaseClient.py | 3 +++ core/TaskManager.py | 9 +++---- hugging_face/HuggingFaceInterface.py | 8 +++++- hugging_face/relevancy_worker.py | 8 ++++++ local_database/classes/DockerContainer.py | 6 +++++ tests/helpers/DBDataCreator.py | 4 +-- .../tasks/test_agency_preannotation_task.py | 26 ++++++++++++++++--- 8 files changed, 53 insertions(+), 13 deletions(-) diff --git a/alembic/versions/2025_05_11_1054-9d4002437ebe_set_default_created_at_for_backlog_.py b/alembic/versions/2025_05_11_1054-9d4002437ebe_set_default_created_at_for_backlog_.py index f45fee4b..fbdb5645 100644 --- a/alembic/versions/2025_05_11_1054-9d4002437ebe_set_default_created_at_for_backlog_.py +++ b/alembic/versions/2025_05_11_1054-9d4002437ebe_set_default_created_at_for_backlog_.py @@ -30,7 +30,7 @@ def upgrade() -> None: def downgrade() -> None: op.alter_column( - table_name='backlog_snapshots', + table_name='backlog_snapshot', column_name='created_at', existing_type=sa.DateTime(), nullable=False, diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index de0bd36a..5d28f70f 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -776,6 +776,8 @@ async def has_urls_without_agency_suggestions( statement = ( select( URL.id + ).where( + URL.outcome == URLStatus.PENDING.value ) ) @@ -797,6 +799,7 @@ async def get_urls_without_agency_suggestions(self, session: AsyncSession) -> li statement = ( select(URL.id, URL.collector_metadata, Batch.strategy) + .where(URL.outcome == URLStatus.PENDING.value) .join(Batch) ) statement = self.statement_composer.exclude_urls_with_agency_suggestions(statement) diff --git a/core/TaskManager.py b/core/TaskManager.py index 4761a62b..052bdbc8 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -101,7 +101,7 @@ async def get_task_operators(self) -> list[TaskOperatorBase]: await self.get_url_html_task_operator(), # await self.get_url_relevance_huggingface_task_operator(), await self.get_url_record_type_task_operator(), - # await self.get_agency_identification_task_operator(), + await self.get_agency_identification_task_operator(), await self.get_url_miscellaneous_metadata_task_operator(), await self.get_submit_approved_url_task_operator() ] @@ -122,10 +122,9 @@ async def run_tasks(self): while meets_prereq: print(f"Running {operator.task_type.value} Task") if count > TASK_REPEAT_THRESHOLD: - self.discord_poster.post_to_discord( - message=f"Task {operator.task_type.value} has been run" - f" more than {TASK_REPEAT_THRESHOLD} times in a row. " - f"Task loop terminated.") + message = f"Task {operator.task_type.value} has been run more than {TASK_REPEAT_THRESHOLD} times in a row. Task loop terminated." + print(message) + self.discord_poster.post_to_discord(message=message) break task_id = await self.initiate_task_in_db(task_type=operator.task_type) run_info: TaskOperatorRunInfo = await operator.run_task(task_id) diff --git a/hugging_face/HuggingFaceInterface.py b/hugging_face/HuggingFaceInterface.py index 9ad11d0b..3dff8ccd 100644 --- a/hugging_face/HuggingFaceInterface.py +++ b/hugging_face/HuggingFaceInterface.py @@ -1,5 +1,6 @@ import asyncio import json +import os import sys from typing import List @@ -17,17 +18,22 @@ async def get_url_relevancy_async(urls_with_html: List[URLWithHTML]) -> List[boo stdin=asyncio.subprocess.PIPE, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, + env=os.environ.copy(), # ⬅️ ensure env variables are inherited ) stdout, stderr = await proc.communicate(input=input_data.encode("utf-8")) + print(stderr) raw_output = stdout.decode("utf-8").strip() + if proc.returncode != 0: + raise RuntimeError(f"Error running HuggingFace: {stderr}/{raw_output}") + # Try to extract the actual JSON line for line in raw_output.splitlines(): try: return json.loads(line) - except json.JSONDecodeError: + except json.JSONDecodeError as e: continue raise RuntimeError(f"Could not parse JSON from subprocess: {raw_output}") diff --git a/hugging_face/relevancy_worker.py b/hugging_face/relevancy_worker.py index 5d07d10f..dd158898 100644 --- a/hugging_face/relevancy_worker.py +++ b/hugging_face/relevancy_worker.py @@ -1,3 +1,4 @@ +import os import sys import json from transformers import pipeline @@ -7,6 +8,13 @@ def main(): pipe = pipeline("text-classification", model="PDAP/url-relevance") results = pipe(urls) + + print("Executable:", sys.executable, file=sys.stderr) + print("sys.path:", sys.path, file=sys.stderr) + print("PYTHONPATH:", os.getenv("PYTHONPATH"), file=sys.stderr) + + if len(results) != len(urls): + raise RuntimeError(f"Expected {len(urls)} results, got {len(results)}") bools = [r["score"] >= 0.5 for r in results] print(json.dumps(bools)) diff --git a/local_database/classes/DockerContainer.py b/local_database/classes/DockerContainer.py index ee2ecba9..33b71ce0 100644 --- a/local_database/classes/DockerContainer.py +++ b/local_database/classes/DockerContainer.py @@ -17,6 +17,12 @@ def run_command(self, command: str): def stop(self): self.container.stop() + def log_to_file(self): + logs = self.container.logs(stdout=True, stderr=True) + container_name = self.container.name + with open(f"{container_name}.log", "wb") as f: + f.write(logs) + def wait_for_pg_to_be_ready(self): for i in range(30): exit_code, output = self.container.exec_run("pg_isready") diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 71338d84..38d70cfe 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -28,7 +28,7 @@ class URLCreationInfo(BaseModel): url_mappings: list[URLMapping] outcome: URLStatus - annotation_info: AnnotationInfo + annotation_info: Optional[AnnotationInfo] = None class BatchURLCreationInfoV2(BaseModel): batch_id: int @@ -109,7 +109,7 @@ async def batch_v2( d[url_parameters.status] = URLCreationInfo( url_mappings=iui.url_mappings, outcome=url_parameters.status, - annotation_info=url_parameters.annotation_info + annotation_info=url_parameters.annotation_info if url_parameters.annotation_info.has_annotations() else None ) return BatchURLCreationInfoV2( batch_id=batch_id, diff --git a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py index cd9556cb..87c8efe0 100644 --- a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py +++ b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py @@ -5,9 +5,10 @@ import pytest from aiohttp import ClientSession +from helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponseType, AgencyLookupResponse from collector_db.models import Agency, AutomatedUrlAgencySuggestion -from collector_manager.enums import CollectorType +from collector_manager.enums import CollectorType, URLStatus from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.classes.task_operators.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator @@ -20,7 +21,7 @@ from pdap_api_client.DTOs import MatchAgencyResponse, MatchAgencyInfo from pdap_api_client.PDAPClient import PDAPClient from pdap_api_client.enums import MatchAgencyResponseStatus -from tests.helpers.DBDataCreator import DBDataCreator, BatchURLCreationInfo +from tests.helpers.DBDataCreator import DBDataCreator, BatchURLCreationInfo, BatchURLCreationInfoV2 sample_agency_suggestions = [ URLAgencySuggestionInfo( @@ -103,8 +104,25 @@ async def mock_run_subtask( CollectorType.MUCKROCK_ALL_SEARCH, CollectorType.CKAN ]: - creation_info: BatchURLCreationInfo = await db_data_creator.batch_and_urls(strategy=strategy, url_count=1, with_html_content=True) - d[strategy] = creation_info.url_ids[0] + # Create two URLs for each, one pending and one errored + creation_info: BatchURLCreationInfoV2 = await db_data_creator.batch_v2( + parameters=TestBatchCreationParameters( + strategy=strategy, + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.PENDING, + with_html_content=True + ), + TestURLCreationParameters( + count=1, + status=URLStatus.ERROR, + with_html_content=True + ) + ] + ) + ) + d[strategy] = creation_info.url_creation_infos[URLStatus.PENDING].url_mappings[0].url_id # Confirm meets prerequisites From bd27536cb9f6875fa378a0524b0282d08a93a834 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 12 May 2025 18:37:30 -0400 Subject: [PATCH 178/244] fix(app): Address bug in agency identification Previously, agency identification was erroneously pulling up URLs that had an error status. This has been addressed. --- .../integration/tasks/test_agency_preannotation_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py index 87c8efe0..6818c683 100644 --- a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py +++ b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py @@ -5,7 +5,7 @@ import pytest from aiohttp import ClientSession -from helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters +from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponseType, AgencyLookupResponse from collector_db.models import Agency, AutomatedUrlAgencySuggestion from collector_manager.enums import CollectorType, URLStatus From dd643b648cb79237bfd42707202db8dad6218bd3 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 13 May 2025 08:16:06 -0400 Subject: [PATCH 179/244] feat(app): add url duplicate check task operator --- ..._create_url_checked_for_duplicate_table.py | 78 +++++++++++++++ collector_db/AsyncDatabaseClient.py | 47 ++++++++- collector_db/enums.py | 1 + collector_db/models.py | 14 +++ .../DTOs/task_data_objects/URLDuplicateTDO.py | 9 ++ core/TaskManager.py | 9 ++ .../URLDuplicateTaskOperator.py | 33 +++++++ pdap_api_client/DTOs.py | 2 +- pdap_api_client/PDAPClient.py | 11 +-- .../integration/tasks/conftest.py | 20 ++++ .../tasks/test_submit_approved_url_task.py | 13 +-- .../tasks/test_url_duplicate_task.py | 98 +++++++++++++++++++ 12 files changed, 314 insertions(+), 21 deletions(-) create mode 100644 alembic/versions/2025_05_13_0704-864107b703ae_create_url_checked_for_duplicate_table.py create mode 100644 core/DTOs/task_data_objects/URLDuplicateTDO.py create mode 100644 core/classes/task_operators/URLDuplicateTaskOperator.py create mode 100644 tests/test_automated/integration/tasks/conftest.py create mode 100644 tests/test_automated/integration/tasks/test_url_duplicate_task.py diff --git a/alembic/versions/2025_05_13_0704-864107b703ae_create_url_checked_for_duplicate_table.py b/alembic/versions/2025_05_13_0704-864107b703ae_create_url_checked_for_duplicate_table.py new file mode 100644 index 00000000..2719d33c --- /dev/null +++ b/alembic/versions/2025_05_13_0704-864107b703ae_create_url_checked_for_duplicate_table.py @@ -0,0 +1,78 @@ +"""Create url_checked_for_duplicate table + +Revision ID: 864107b703ae +Revises: 9d4002437ebe +Create Date: 2025-05-13 07:04:22.592396 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +from util.alembic_helpers import switch_enum_type + +# revision identifiers, used by Alembic. +revision: str = '864107b703ae' +down_revision: Union[str, None] = '9d4002437ebe' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + op.create_table( + 'url_checked_for_duplicate', + sa.Column( + 'id', + sa.Integer(), + primary_key=True + ), + sa.Column( + 'url_id', + sa.Integer(), + sa.ForeignKey( + 'urls.id', + ondelete='CASCADE' + ), + nullable=False + ), + sa.Column( + 'created_at', + sa.DateTime(), + nullable=False, + server_default=sa.text('now()') + ), + ) + + switch_enum_type( + table_name='tasks', + column_name='task_type', + enum_name='task_type', + new_enum_values=[ + "HTML", + "Relevancy", + "Record Type", + "Agency Identification", + "Misc Metadata", + "Submit Approved URLs", + "Duplicate Detection" + ] + ) + + +def downgrade() -> None: + op.drop_table('url_checked_for_duplicate') + + switch_enum_type( + table_name='tasks', + column_name='task_type', + enum_name='task_type', + new_enum_values=[ + "HTML", + "Relevancy", + "Record Type", + "Agency Identification", + "Misc Metadata", + "Submit Approved URLs", + ] + ) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 5d28f70f..03c652c9 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -29,7 +29,7 @@ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Duplicate, Log, \ - BacklogSnapshot, URLDataSource + BacklogSnapshot, URLDataSource, URLCheckedForDuplicate from collector_manager.enums import URLStatus, CollectorType from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo @@ -60,6 +60,7 @@ from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO, SubmittedURLInfo +from core.DTOs.task_data_objects.URLDuplicateTDO import URLDuplicateTDO from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo from core.EnvVarManager import EnvVarManager from core.enums import BatchStatus, SuggestionType, RecordType @@ -2224,4 +2225,48 @@ async def populate_backlog_snapshot( session.add(snapshot) + @session_manager + async def has_pending_urls_not_checked_for_duplicates(self, session: AsyncSession) -> bool: + query = (select( + URL.id + ).outerjoin( + URLCheckedForDuplicate, + URL.id == URLCheckedForDuplicate.url_id + ).where( + URL.outcome == URLStatus.PENDING.value, + URLCheckedForDuplicate.id == None + ).limit(1) + ) + raw_result = await session.execute(query) + result = raw_result.one_or_none() + return result is not None + + @session_manager + async def get_pending_urls_not_checked_for_duplicates(self, session: AsyncSession) -> List[URLDuplicateTDO]: + query = (select( + URL + ).outerjoin( + URLCheckedForDuplicate, + URL.id == URLCheckedForDuplicate.url_id + ).where( + URL.outcome == URLStatus.PENDING.value, + URLCheckedForDuplicate.id == None + ).limit(100) + ) + + raw_result = await session.execute(query) + urls = raw_result.scalars().all() + return [URLDuplicateTDO(url=url.url, url_id=url.id) for url in urls] + + + @session_manager + async def mark_all_as_duplicates(self, session: AsyncSession, url_ids: List[int]): + query = update(URL).where(URL.id.in_(url_ids)).values(outcome=URLStatus.DUPLICATE.value) + await session.execute(query) + + @session_manager + async def mark_as_checked_for_duplicates(self, session: AsyncSession, url_ids: list[int]): + for url_id in url_ids: + url_checked_for_duplicate = URLCheckedForDuplicate(url_id=url_id) + session.add(url_checked_for_duplicate) diff --git a/collector_db/enums.py b/collector_db/enums.py index b28b6091..d6b3ec0f 100644 --- a/collector_db/enums.py +++ b/collector_db/enums.py @@ -38,6 +38,7 @@ class TaskType(PyEnum): AGENCY_IDENTIFICATION = "Agency Identification" MISC_METADATA = "Misc Metadata" SUBMIT_APPROVED = "Submit Approved URLs" + DUPLICATE_DETECTION = "Duplicate Detection" IDLE = "Idle" class PGEnum(TypeDecorator): diff --git a/collector_db/models.py b/collector_db/models.py index b38243dd..b2a86e9c 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -141,7 +141,21 @@ class URL(Base): back_populates="url", uselist=False ) + checked_for_duplicate = relationship( + "URLCheckedForDuplicate", + uselist=False, + back_populates="url" + ) + +class URLCheckedForDuplicate(Base): + __tablename__ = 'url_checked_for_duplicate' + id = Column(Integer, primary_key=True) + url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) + created_at = get_created_at_column() + + # Relationships + url = relationship("URL", uselist=False, back_populates="checked_for_duplicate") class URLOptionalDataSourceMetadata(Base): __tablename__ = 'url_optional_data_source_metadata' diff --git a/core/DTOs/task_data_objects/URLDuplicateTDO.py b/core/DTOs/task_data_objects/URLDuplicateTDO.py new file mode 100644 index 00000000..af00ce38 --- /dev/null +++ b/core/DTOs/task_data_objects/URLDuplicateTDO.py @@ -0,0 +1,9 @@ +from typing import Optional + +from pydantic import BaseModel + + +class URLDuplicateTDO(BaseModel): + url_id: int + url: str + is_duplicate: Optional[bool] = None diff --git a/core/TaskManager.py b/core/TaskManager.py index 052bdbc8..1dcc9bb5 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -1,5 +1,6 @@ import logging +from core.classes.task_operators.URLDuplicateTaskOperator import URLDuplicateTaskOperator from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.TaskInfo import TaskInfo @@ -96,9 +97,17 @@ async def get_url_miscellaneous_metadata_task_operator(self): ) return operator + async def get_url_duplicate_task_operator(self): + operator = URLDuplicateTaskOperator( + adb_client=self.adb_client, + pdap_client=self.pdap_client + ) + return operator + async def get_task_operators(self) -> list[TaskOperatorBase]: return [ await self.get_url_html_task_operator(), + await self.get_url_duplicate_task_operator(), # await self.get_url_relevance_huggingface_task_operator(), await self.get_url_record_type_task_operator(), await self.get_agency_identification_task_operator(), diff --git a/core/classes/task_operators/URLDuplicateTaskOperator.py b/core/classes/task_operators/URLDuplicateTaskOperator.py new file mode 100644 index 00000000..32cea432 --- /dev/null +++ b/core/classes/task_operators/URLDuplicateTaskOperator.py @@ -0,0 +1,33 @@ +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_db.enums import TaskType +from core.DTOs.task_data_objects.URLDuplicateTDO import URLDuplicateTDO +from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase +from pdap_api_client.PDAPClient import PDAPClient + + +class URLDuplicateTaskOperator(TaskOperatorBase): + + def __init__( + self, + adb_client: AsyncDatabaseClient, + pdap_client: PDAPClient + ): + super().__init__(adb_client) + self.pdap_client = pdap_client + + @property + def task_type(self): + return TaskType.DUPLICATE_DETECTION + + async def meets_task_prerequisites(self): + return await self.adb_client.has_pending_urls_not_checked_for_duplicates() + + async def inner_task_logic(self): + tdos: list[URLDuplicateTDO] = await self.adb_client.get_pending_urls_not_checked_for_duplicates() + url_ids = [tdo.url_id for tdo in tdos] + await self.link_urls_to_task(url_ids=url_ids) + for tdo in tdos: + tdo.is_duplicate = await self.pdap_client.is_url_duplicate(tdo.url) + duplicate_url_ids = [tdo.url_id for tdo in tdos if tdo.is_duplicate] + await self.adb_client.mark_all_as_duplicates(duplicate_url_ids) + await self.adb_client.mark_as_checked_for_duplicates(url_ids) diff --git a/pdap_api_client/DTOs.py b/pdap_api_client/DTOs.py index 93f67839..342ad948 100644 --- a/pdap_api_client/DTOs.py +++ b/pdap_api_client/DTOs.py @@ -25,7 +25,7 @@ class ApprovalStatus(Enum): class UniqueURLDuplicateInfo(BaseModel): original_url: str approval_status: ApprovalStatus - rejection_note: str + rejection_note: Optional[str] = None class UniqueURLResponseInfo(BaseModel): is_unique: bool diff --git a/pdap_api_client/PDAPClient.py b/pdap_api_client/PDAPClient.py index 24b9d98c..ad3c74ea 100644 --- a/pdap_api_client/PDAPClient.py +++ b/pdap_api_client/PDAPClient.py @@ -59,10 +59,10 @@ async def match_agency( ) - async def is_url_unique( + async def is_url_duplicate( self, url_to_check: str - ) -> UniqueURLResponseInfo: + ) -> bool: """ Check if a URL is unique. Returns duplicate info otherwise """ @@ -79,11 +79,8 @@ async def is_url_unique( ) response_info = await self.access_manager.make_request(request_info) duplicates = [UniqueURLDuplicateInfo(**entry) for entry in response_info.data["duplicates"]] - is_unique = (len(duplicates) == 0) - return UniqueURLResponseInfo( - is_unique=is_unique, - duplicates=duplicates - ) + is_duplicate = (len(duplicates) != 0) + return is_duplicate async def submit_urls( self, diff --git a/tests/test_automated/integration/tasks/conftest.py b/tests/test_automated/integration/tasks/conftest.py new file mode 100644 index 00000000..6a925cc5 --- /dev/null +++ b/tests/test_automated/integration/tasks/conftest.py @@ -0,0 +1,20 @@ +from unittest.mock import MagicMock, AsyncMock + +import pytest + +from pdap_api_client.AccessManager import AccessManager +from pdap_api_client.PDAPClient import PDAPClient + + +@pytest.fixture +def mock_pdap_client() -> PDAPClient: + mock_access_manager = MagicMock( + spec=AccessManager + ) + mock_access_manager.jwt_header = AsyncMock( + return_value={"Authorization": "Bearer token"} + ) + pdap_client = PDAPClient( + access_manager=mock_access_manager + ) + return pdap_client \ No newline at end of file diff --git a/tests/test_automated/integration/tasks/test_submit_approved_url_task.py b/tests/test_automated/integration/tasks/test_submit_approved_url_task.py index 32dc765c..c8aa86eb 100644 --- a/tests/test_automated/integration/tasks/test_submit_approved_url_task.py +++ b/tests/test_automated/integration/tasks/test_submit_approved_url_task.py @@ -46,18 +46,7 @@ def mock_make_request(pdap_client: PDAPClient, urls: list[str]): ) ) -@pytest.fixture -def mock_pdap_client() -> PDAPClient: - mock_access_manager = MagicMock( - spec=AccessManager - ) - mock_access_manager.jwt_header = AsyncMock( - return_value={"Authorization": "Bearer token"} - ) - pdap_client = PDAPClient( - access_manager=mock_access_manager - ) - return pdap_client + async def setup_validated_urls(db_data_creator: DBDataCreator) -> list[str]: creation_info: BatchURLCreationInfo = await db_data_creator.batch_and_urls( diff --git a/tests/test_automated/integration/tasks/test_url_duplicate_task.py b/tests/test_automated/integration/tasks/test_url_duplicate_task.py new file mode 100644 index 00000000..886e91a3 --- /dev/null +++ b/tests/test_automated/integration/tasks/test_url_duplicate_task.py @@ -0,0 +1,98 @@ +from http import HTTPStatus +from unittest.mock import MagicMock + +import pytest + +from collector_db.DTOs.URLMapping import URLMapping +from collector_db.models import URL, URLCheckedForDuplicate +from collector_manager.enums import CollectorType, URLStatus +from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome +from core.classes.task_operators.URLDuplicateTaskOperator import URLDuplicateTaskOperator +from helpers.DBDataCreator import DBDataCreator +from helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters +from pdap_api_client.DTOs import ResponseInfo +from pdap_api_client.PDAPClient import PDAPClient + + +@pytest.mark.asyncio +async def test_url_duplicate_task( + db_data_creator: DBDataCreator, + mock_pdap_client: PDAPClient +): + + + operator = URLDuplicateTaskOperator( + adb_client=db_data_creator.adb_client, + pdap_client=mock_pdap_client + ) + + assert not await operator.meets_task_prerequisites() + make_request_mock: MagicMock = mock_pdap_client.access_manager.make_request + + make_request_mock.assert_not_called() + + # Add three URLs to the database, one of which is in error, the other two pending + creation_info = await db_data_creator.batch_v2( + parameters=TestBatchCreationParameters( + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.ERROR + ), + TestURLCreationParameters( + count=2, + status=URLStatus.PENDING + ), + ] + ) + ) + pending_urls: list[URLMapping] = creation_info.url_creation_infos[URLStatus.PENDING].url_mappings + duplicate_url = pending_urls[0] + non_duplicate_url = pending_urls[1] + assert await operator.meets_task_prerequisites() + make_request_mock.assert_not_called() + + make_request_mock.side_effect = [ + ResponseInfo( + data={ + "duplicates": [ + { + "original_url": duplicate_url.url, + "approval_status": "approved" + } + ], + }, + status_code=HTTPStatus.OK + ), + ResponseInfo( + data={ + "duplicates": [], + }, + status_code=HTTPStatus.OK + ), + ] + run_info = await operator.run_task(1) + assert run_info.outcome == TaskOperatorOutcome.SUCCESS, run_info.message + assert make_request_mock.call_count == 2 + + adb_client = db_data_creator.adb_client + urls: list[URL] = await adb_client.get_all(URL) + assert len(urls) == 3 + url_ids = [url.id for url in urls] + assert duplicate_url.url_id in url_ids + for url in urls: + if url.id == duplicate_url.url_id: + assert url.outcome == URLStatus.DUPLICATE.value + + checked_for_duplicates: list[URLCheckedForDuplicate] = await adb_client.get_all(URLCheckedForDuplicate) + assert len(checked_for_duplicates) == 2 + checked_for_duplicate_url_ids = [url.url_id for url in checked_for_duplicates] + assert duplicate_url.url_id in checked_for_duplicate_url_ids + assert non_duplicate_url.url_id in checked_for_duplicate_url_ids + + assert not await operator.meets_task_prerequisites() + + + + + From 845cb1be00e418202d255c1656f4b85a410e321a Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 13 May 2025 08:19:27 -0400 Subject: [PATCH 180/244] feat(app): add url duplicate check task operator --- .../integration/tasks/test_url_duplicate_task.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_automated/integration/tasks/test_url_duplicate_task.py b/tests/test_automated/integration/tasks/test_url_duplicate_task.py index 886e91a3..1b3e77d8 100644 --- a/tests/test_automated/integration/tasks/test_url_duplicate_task.py +++ b/tests/test_automated/integration/tasks/test_url_duplicate_task.py @@ -8,8 +8,8 @@ from collector_manager.enums import CollectorType, URLStatus from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.task_operators.URLDuplicateTaskOperator import URLDuplicateTaskOperator -from helpers.DBDataCreator import DBDataCreator -from helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters +from tests.helpers.DBDataCreator import DBDataCreator +from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters from pdap_api_client.DTOs import ResponseInfo from pdap_api_client.PDAPClient import PDAPClient From b4326d6fdf399f71b3fff5edc3b7ca9629e62293 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 13 May 2025 09:59:36 -0400 Subject: [PATCH 181/244] feat(app): replace in-project access manager with `pdap_access_manager` --- ..._create_url_checked_for_duplicate_table.py | 3 + api/main.py | 3 +- pdap_api_client/AccessManager.py | 159 --------------- pdap_api_client/DTOs.py | 47 ----- pdap_api_client/PDAPClient.py | 88 ++++---- pyproject.toml | 4 +- .../manual/pdap_client/test_access_manager.py | 6 +- tests/manual/pdap_client/test_pdap_client.py | 22 +- .../integration/tasks/conftest.py | 5 +- .../tasks/test_agency_preannotation_task.py | 2 +- .../tasks/test_submit_approved_url_task.py | 16 +- .../tasks/test_url_duplicate_task.py | 4 +- uv.lock | 190 ++++++++++++------ 13 files changed, 224 insertions(+), 325 deletions(-) delete mode 100644 pdap_api_client/AccessManager.py diff --git a/alembic/versions/2025_05_13_0704-864107b703ae_create_url_checked_for_duplicate_table.py b/alembic/versions/2025_05_13_0704-864107b703ae_create_url_checked_for_duplicate_table.py index 2719d33c..e2e5947f 100644 --- a/alembic/versions/2025_05_13_0704-864107b703ae_create_url_checked_for_duplicate_table.py +++ b/alembic/versions/2025_05_13_0704-864107b703ae_create_url_checked_for_duplicate_table.py @@ -63,6 +63,9 @@ def upgrade() -> None: def downgrade() -> None: op.drop_table('url_checked_for_duplicate') + # Delete tasks of type "Duplicate Detection" + op.execute("DELETE FROM TASKS WHERE TASK_TYPE = 'Duplicate Detection';") + switch_enum_type( table_name='tasks', column_name='task_type', diff --git a/api/main.py b/api/main.py index 94b52cd2..eeb3e8a8 100644 --- a/api/main.py +++ b/api/main.py @@ -1,4 +1,3 @@ -import asyncio from contextlib import asynccontextmanager import aiohttp @@ -28,7 +27,7 @@ from html_tag_collector.RootURLCache import RootURLCache from html_tag_collector.URLRequestInterface import URLRequestInterface from hugging_face.HuggingFaceInterface import HuggingFaceInterface -from pdap_api_client.AccessManager import AccessManager +from pdap_access_manager import AccessManager from pdap_api_client.PDAPClient import PDAPClient from util.DiscordNotifier import DiscordPoster diff --git a/pdap_api_client/AccessManager.py b/pdap_api_client/AccessManager.py deleted file mode 100644 index aadd8451..00000000 --- a/pdap_api_client/AccessManager.py +++ /dev/null @@ -1,159 +0,0 @@ -from http import HTTPStatus -from typing import Optional - -import requests -from aiohttp import ClientSession - -from core.EnvVarManager import EnvVarManager -from pdap_api_client.DTOs import RequestType, Namespaces, RequestInfo, ResponseInfo - -request_methods = { - RequestType.POST: ClientSession.post, - RequestType.PUT: ClientSession.put, - RequestType.GET: ClientSession.get, - RequestType.DELETE: ClientSession.delete, -} - - -class CustomHTTPException(Exception): - pass - - -def build_url( - namespace: Namespaces, - subdomains: Optional[list[str]] = None -): - api_url = EnvVarManager.get().pdap_api_url - url = f"{api_url}/{namespace.value}" - if subdomains is not None: - url = f"{url}/{'/'.join(subdomains)}" - return url - - -class AccessManager: - """ - Manages login, api key, access and refresh tokens - """ - def __init__( - self, - email: str, - password: str, - session: Optional[ClientSession] = None, - api_key: Optional[str] = None, - ): - self.session = session - self._access_token = None - self._refresh_token = None - self.api_key = api_key - self.email = email - self.password = password - - @property - async def access_token(self): - if self._access_token is None: - await self.login( - email=self.email, - password=self.password - ) - return self._access_token - - @property - async def refresh_token(self): - if self._refresh_token is None: - await self.login( - email=self.email, - password=self.password - ) - return self._refresh_token - - # TODO: Add means to refresh if token expired. - - async def load_api_key(self): - url = build_url( - namespace=Namespaces.AUTH, - subdomains=["api-key"] - ) - request_info = RequestInfo( - type_ = RequestType.POST, - url=url, - headers=await self.jwt_header() - ) - response_info = await self.make_request(request_info) - self.api_key = response_info.data["api_key"] - - async def refresh_access_token(self): - url = build_url( - namespace=Namespaces.AUTH, - subdomains=["refresh-session"], - ) - refresh_token = await self.refresh_token - rqi = RequestInfo( - type_=RequestType.POST, - url=url, - json={"refresh_token": refresh_token}, - headers=await self.jwt_header() - ) - rsi = await self.make_request(rqi) - data = rsi.data - self._access_token = data['access_token'] - self._refresh_token = data['refresh_token'] - - async def make_request(self, ri: RequestInfo) -> ResponseInfo: - try: - method = getattr(self.session, ri.type_.value.lower()) - async with method(**ri.kwargs()) as response: - response.raise_for_status() - json = await response.json() - return ResponseInfo( - status_code=HTTPStatus(response.status), - data=json - ) - except requests.RequestException as e: - # TODO: Precise string matching here is brittle. Consider changing later. - if json.message == "Token is expired. Please request a new token.": - await self.refresh_access_token() - return await self.make_request(ri) - else: - raise CustomHTTPException(f"Error making {ri.type_} request to {ri.url}: {e}") - - - async def login(self, email: str, password: str): - url = build_url( - namespace=Namespaces.AUTH, - subdomains=["login"] - ) - request_info = RequestInfo( - type_=RequestType.POST, - url=url, - json={ - "email": email, - "password": password - } - ) - response_info = await self.make_request(request_info) - data = response_info.data - self._access_token = data["access_token"] - self._refresh_token = data["refresh_token"] - - - async def jwt_header(self) -> dict: - """ - Retrieve JWT header - Returns: Dictionary of Bearer Authorization with JWT key - """ - access_token = await self.access_token - return { - "Authorization": f"Bearer {access_token}" - } - - def api_key_header(self): - """ - Retrieve API key header - Returns: Dictionary of Basic Authorization with API key - - """ - if self.api_key is None: - self.load_api_key() - return { - "Authorization": f"Basic {self.api_key}" - } diff --git a/pdap_api_client/DTOs.py b/pdap_api_client/DTOs.py index 342ad948..23d240d7 100644 --- a/pdap_api_client/DTOs.py +++ b/pdap_api_client/DTOs.py @@ -1,5 +1,4 @@ from enum import Enum -from http import HTTPStatus from typing import Optional, List from pydantic import BaseModel @@ -20,57 +19,11 @@ class ApprovalStatus(Enum): PENDING = "pending" NEEDS_IDENTIFICATION = "needs identification" - - class UniqueURLDuplicateInfo(BaseModel): original_url: str approval_status: ApprovalStatus rejection_note: Optional[str] = None -class UniqueURLResponseInfo(BaseModel): - is_unique: bool - duplicates: list[UniqueURLDuplicateInfo] - - -class Namespaces(Enum): - AUTH = "auth" - MATCH = "match" - CHECK = "check" - DATA_SOURCES = "data-sources" - SOURCE_COLLECTOR = "source-collector" - - -class RequestType(Enum): - POST = "POST" - PUT = "PUT" - GET = "GET" - DELETE = "DELETE" - - -class RequestInfo(BaseModel): - type_: RequestType - url: str - json: Optional[dict] = None - headers: Optional[dict] = None - params: Optional[dict] = None - timeout: Optional[int] = 10 - - def kwargs(self) -> dict: - d = { - "url": self.url, - } - if self.json is not None: - d['json'] = self.json - if self.headers is not None: - d['headers'] = self.headers - return d - - -class ResponseInfo(BaseModel): - status_code: HTTPStatus - data: Optional[dict] - - class MatchAgencyResponse(BaseModel): status: MatchAgencyResponseStatus matches: List[MatchAgencyInfo] diff --git a/pdap_api_client/PDAPClient.py b/pdap_api_client/PDAPClient.py index ad3c74ea..491b7c3b 100644 --- a/pdap_api_client/PDAPClient.py +++ b/pdap_api_client/PDAPClient.py @@ -1,41 +1,42 @@ from typing import Optional from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO, SubmittedURLInfo -from pdap_api_client.AccessManager import build_url, AccessManager -from pdap_api_client.DTOs import MatchAgencyInfo, UniqueURLDuplicateInfo, UniqueURLResponseInfo, Namespaces, \ - RequestType, RequestInfo, MatchAgencyResponse +from pdap_api_client.DTOs import MatchAgencyInfo, UniqueURLDuplicateInfo, \ + MatchAgencyResponse from pdap_api_client.enums import MatchAgencyResponseStatus +from pdap_access_manager import AccessManager, DataSourcesNamespaces, RequestInfo, RequestType class PDAPClient: def __init__( - self, - access_manager: AccessManager, + self, + access_manager: AccessManager, ): self.access_manager = access_manager async def match_agency( - self, - name: str, - state: Optional[str] = None, - county: Optional[str] = None, - locality: Optional[str] = None + self, + name: str, + state: Optional[str] = None, + county: Optional[str] = None, + locality: Optional[str] = None ) -> MatchAgencyResponse: """ Returns agencies, if any, that match or partially match the search criteria """ - url = build_url( - namespace=Namespaces.MATCH, + url = self.access_manager.build_url( + namespace=DataSourcesNamespaces.MATCH, subdomains=["agency"] ) + headers = await self.access_manager.jwt_header() headers['Content-Type'] = "application/json" request_info = RequestInfo( type_=RequestType.POST, url=url, headers=headers, - json={ + json_={ "name": name, "state": state, "county": county, @@ -43,22 +44,24 @@ async def match_agency( } ) response_info = await self.access_manager.make_request(request_info) - - matches = [ - MatchAgencyInfo( - id = agency['id'], - submitted_name=agency['name'], - state=agency['state'], - county=agency['county'], - locality=agency['locality'] + matches = [] + for agency in response_info.data["agencies"]: + mai = MatchAgencyInfo( + id=agency['id'], + submitted_name=agency['name'] ) - for agency in response_info.data["agencies"]] + if len(agency['locations']) > 0: + first_location = agency['locations'][0] + mai.state = first_location['state'] + mai.county = first_location['county'] + mai.locality = first_location['locality'] + matches.append(mai) + return MatchAgencyResponse( status=MatchAgencyResponseStatus(response_info.data["status"]), matches=matches ) - async def is_url_duplicate( self, url_to_check: str @@ -66,8 +69,8 @@ async def is_url_duplicate( """ Check if a URL is unique. Returns duplicate info otherwise """ - url = build_url( - namespace=Namespaces.CHECK, + url = self.access_manager.build_url( + namespace=DataSourcesNamespaces.CHECK, subdomains=["unique-url"] ) request_info = RequestInfo( @@ -83,15 +86,15 @@ async def is_url_duplicate( return is_duplicate async def submit_urls( - self, - tdos: list[SubmitApprovedURLTDO] + self, + tdos: list[SubmitApprovedURLTDO] ) -> list[SubmittedURLInfo]: """ Submits URLs to Data Sources App, modifying tdos in-place with data source id or error """ - request_url = build_url( - namespace=Namespaces.SOURCE_COLLECTOR, + request_url = self.access_manager.build_url( + namespace=DataSourcesNamespaces.SOURCE_COLLECTOR, subdomains=["data-sources"] ) @@ -102,25 +105,26 @@ async def submit_urls( data_sources_json = [] for tdo in tdos: - data_sources_json.append({ - "name": tdo.name, - "description": tdo.description, - "source_url": tdo.url, - "record_type": tdo.record_type.value, - "record_formats": tdo.record_formats, - "data_portal_type": tdo.data_portal_type, - "last_approval_editor": tdo.approving_user_id, - "supplying_entity": tdo.supplying_entity, - "agency_ids": tdo.agency_ids - }) - + data_sources_json.append( + { + "name": tdo.name, + "description": tdo.description, + "source_url": tdo.url, + "record_type": tdo.record_type.value, + "record_formats": tdo.record_formats, + "data_portal_type": tdo.data_portal_type, + "last_approval_editor": tdo.approving_user_id, + "supplying_entity": tdo.supplying_entity, + "agency_ids": tdo.agency_ids + } + ) headers = await self.access_manager.jwt_header() request_info = RequestInfo( type_=RequestType.POST, url=request_url, headers=headers, - json={ + json_={ "data_sources": data_sources_json } ) diff --git a/pyproject.toml b/pyproject.toml index 5d2269c7..8a2b1187 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,10 +24,11 @@ dependencies = [ "numpy~=1.26.4", "openai~=1.60.1", "pandas~=2.2.3", + "pdap-access-manager==0.3.5", "playwright~=1.49.1", "psycopg2-binary~=2.9.6", "psycopg[binary]~=3.1.20", - "pydantic~=2.10.6", + "pydantic~=2.11.3", "pyjwt~=2.10.1", "python-dotenv~=1.0.1", "requests~=2.32.3", @@ -43,6 +44,7 @@ dependencies = [ [dependency-groups] dev = [ + "deepdiff>=8.5.0", "docker>=7.1.0", "pendulum>=3.1.0", "pytest>=7.2.2", diff --git a/tests/manual/pdap_client/test_access_manager.py b/tests/manual/pdap_client/test_access_manager.py index ff08ee0e..b1245eca 100644 --- a/tests/manual/pdap_client/test_access_manager.py +++ b/tests/manual/pdap_client/test_access_manager.py @@ -1,7 +1,7 @@ import pytest from aiohttp import ClientSession -from pdap_api_client.AccessManager import AccessManager +from pdap_access_manager import AccessManager from util.helper_functions import get_from_env @@ -9,8 +9,8 @@ async def test_refresh_session(): async with ClientSession() as session: access_manager = AccessManager( - email=get_from_env("PDAP_EMAIL"), - password=get_from_env("PDAP_PASSWORD"), + email=get_from_env("PDAP_PROD_EMAIL"), + password=get_from_env("PDAP_PROD_PASSWORD"), api_key=get_from_env("PDAP_API_KEY", allow_none=True), session=session ) diff --git a/tests/manual/pdap_client/test_pdap_client.py b/tests/manual/pdap_client/test_pdap_client.py index b1232244..5d10037c 100644 --- a/tests/manual/pdap_client/test_pdap_client.py +++ b/tests/manual/pdap_client/test_pdap_client.py @@ -1,7 +1,7 @@ import pytest from aiohttp import ClientSession -from pdap_api_client.AccessManager import AccessManager +from pdap_access_manager import AccessManager from pdap_api_client.PDAPClient import PDAPClient from util.helper_functions import get_from_env @@ -11,8 +11,8 @@ async def test_match_agency(): async with ClientSession() as session: access_manager = AccessManager( - email=get_from_env("PDAP_EMAIL"), - password=get_from_env("PDAP_PASSWORD"), + email=get_from_env("PDAP_PROD_EMAIL"), + password=get_from_env("PDAP_PROD_PASSWORD"), api_key=get_from_env("PDAP_API_KEY", allow_none=True), session=session ) @@ -21,3 +21,19 @@ async def test_match_agency(): response = await pdap_client.match_agency(name="police") print(response) + +@pytest.mark.asyncio +async def test_check_for_duplicate(): + + async with ClientSession() as session: + access_manager = AccessManager( + email=get_from_env("PDAP_PROD_EMAIL"), + password=get_from_env("PDAP_PROD_PASSWORD"), + api_key=get_from_env("PDAP_API_KEY", allow_none=True), + session=session + ) + pdap_client = PDAPClient(access_manager=access_manager) + + response = await pdap_client.is_url_duplicate(url_to_check="https://example.com") + + print(response) \ No newline at end of file diff --git a/tests/test_automated/integration/tasks/conftest.py b/tests/test_automated/integration/tasks/conftest.py index 6a925cc5..a4136b20 100644 --- a/tests/test_automated/integration/tasks/conftest.py +++ b/tests/test_automated/integration/tasks/conftest.py @@ -2,7 +2,7 @@ import pytest -from pdap_api_client.AccessManager import AccessManager +from pdap_access_manager import AccessManager from pdap_api_client.PDAPClient import PDAPClient @@ -11,6 +11,9 @@ def mock_pdap_client() -> PDAPClient: mock_access_manager = MagicMock( spec=AccessManager ) + mock_access_manager.build_url = MagicMock( + return_value="http://example.com" + ) mock_access_manager.jwt_header = AsyncMock( return_value={"Authorization": "Bearer token"} ) diff --git a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py index 6818c683..e6278292 100644 --- a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py +++ b/tests/test_automated/integration/tasks/test_agency_preannotation_task.py @@ -17,7 +17,7 @@ from core.classes.subtasks.CommonCrawlerAgencyIdentificationSubtask import CommonCrawlerAgencyIdentificationSubtask from core.classes.subtasks.MuckrockAgencyIdentificationSubtask import MuckrockAgencyIdentificationSubtask from core.enums import SuggestionType -from pdap_api_client.AccessManager import AccessManager +from pdap_access_manager import AccessManager from pdap_api_client.DTOs import MatchAgencyResponse, MatchAgencyInfo from pdap_api_client.PDAPClient import PDAPClient from pdap_api_client.enums import MatchAgencyResponseStatus diff --git a/tests/test_automated/integration/tasks/test_submit_approved_url_task.py b/tests/test_automated/integration/tasks/test_submit_approved_url_task.py index c8aa86eb..1477915f 100644 --- a/tests/test_automated/integration/tasks/test_submit_approved_url_task.py +++ b/tests/test_automated/integration/tasks/test_submit_approved_url_task.py @@ -2,6 +2,7 @@ from unittest.mock import MagicMock, AsyncMock import pytest +from deepdiff import DeepDiff from collector_db.enums import TaskType from collector_db.models import URL, URLErrorInfo, URLDataSource @@ -11,8 +12,7 @@ from core.classes.task_operators.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator from core.enums import RecordType, SubmitResponseStatus from tests.helpers.DBDataCreator import BatchURLCreationInfo, DBDataCreator -from pdap_api_client.AccessManager import AccessManager -from pdap_api_client.DTOs import RequestInfo, RequestType, ResponseInfo +from pdap_access_manager import RequestInfo, RequestType, ResponseInfo, DataSourcesNamespaces from pdap_api_client.PDAPClient import PDAPClient @@ -164,13 +164,17 @@ async def test_submit_approved_url_task( # Check mock method was called expected parameters access_manager = mock_pdap_client.access_manager access_manager.make_request.assert_called_once() + access_manager.build_url.assert_called_with( + namespace=DataSourcesNamespaces.SOURCE_COLLECTOR, + subdomains=['data-sources'] + ) call_1 = access_manager.make_request.call_args_list[0][0][0] expected_call_1 = RequestInfo( type_=RequestType.POST, - url="TEST/source-collector/data-sources", + url="http://example.com", headers=access_manager.jwt_header.return_value, - json={ + json_={ "data_sources": [ { "name": "URL 1 Name", @@ -209,6 +213,6 @@ async def test_submit_approved_url_task( } ) assert call_1.type_ == expected_call_1.type_ - assert call_1.url == expected_call_1.url assert call_1.headers == expected_call_1.headers - assert call_1.json == expected_call_1.json + diff = DeepDiff(call_1.json_, expected_call_1.json_, ignore_order=True) + assert diff == {}, f"Differences found: {diff}" diff --git a/tests/test_automated/integration/tasks/test_url_duplicate_task.py b/tests/test_automated/integration/tasks/test_url_duplicate_task.py index 1b3e77d8..d66cfe27 100644 --- a/tests/test_automated/integration/tasks/test_url_duplicate_task.py +++ b/tests/test_automated/integration/tasks/test_url_duplicate_task.py @@ -5,12 +5,12 @@ from collector_db.DTOs.URLMapping import URLMapping from collector_db.models import URL, URLCheckedForDuplicate -from collector_manager.enums import CollectorType, URLStatus +from collector_manager.enums import URLStatus from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.task_operators.URLDuplicateTaskOperator import URLDuplicateTaskOperator from tests.helpers.DBDataCreator import DBDataCreator from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters -from pdap_api_client.DTOs import ResponseInfo +from pdap_access_manager import ResponseInfo from pdap_api_client.PDAPClient import PDAPClient diff --git a/uv.lock b/uv.lock index bb269479..773fee9e 100644 --- a/uv.lock +++ b/uv.lock @@ -218,6 +218,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload_time = "2025-04-15T17:05:12.221Z" }, ] +[[package]] +name = "boltons" +version = "25.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/63/54/71a94d8e02da9a865587fb3fff100cb0fc7aa9f4d5ed9ed3a591216ddcc7/boltons-25.0.0.tar.gz", hash = "sha256:e110fbdc30b7b9868cb604e3f71d4722dd8f4dcb4a5ddd06028ba8f1ab0b5ace", size = 246294, upload_time = "2025-02-03T05:57:59.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/7f/0e961cf3908bc4c1c3e027de2794f867c6c89fb4916fc7dba295a0e80a2d/boltons-25.0.0-py3-none-any.whl", hash = "sha256:dc9fb38bf28985715497d1b54d00b62ea866eca3938938ea9043e254a3a6ca62", size = 194210, upload_time = "2025-02-03T05:57:56.705Z" }, +] + [[package]] name = "bs4" version = "0.0.2" @@ -315,14 +324,14 @@ wheels = [ [[package]] name = "click" -version = "8.1.8" +version = "8.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload_time = "2024-12-21T18:38:44.339Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/0f/62ca20172d4f87d93cf89665fbaedcd560ac48b465bd1d92bfc7ea6b0a41/click-8.2.0.tar.gz", hash = "sha256:f5452aeddd9988eefa20f90f05ab66f17fce1ee2a36907fd30b05bbb5953814d", size = 235857, upload_time = "2025-05-10T22:21:03.111Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload_time = "2024-12-21T18:38:41.666Z" }, + { url = "https://files.pythonhosted.org/packages/a2/58/1f37bf81e3c689cc74ffa42102fa8915b59085f54a6e4a80bc6265c0f6bf/click-8.2.0-py3-none-any.whl", hash = "sha256:6b303f0b2aa85f1cb4e5303078fadcbcd4e476f114fab9b5007005711839325c", size = 102156, upload_time = "2025-05-10T22:21:01.352Z" }, ] [[package]] @@ -360,6 +369,7 @@ dependencies = [ { name = "numpy" }, { name = "openai" }, { name = "pandas" }, + { name = "pdap-access-manager" }, { name = "playwright" }, { name = "psycopg", extra = ["binary"] }, { name = "psycopg2-binary" }, @@ -379,6 +389,7 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "deepdiff" }, { name = "docker" }, { name = "pendulum" }, { name = "pytest" }, @@ -410,10 +421,11 @@ requires-dist = [ { name = "numpy", specifier = "~=1.26.4" }, { name = "openai", specifier = "~=1.60.1" }, { name = "pandas", specifier = "~=2.2.3" }, + { name = "pdap-access-manager", specifier = "==0.3.5" }, { name = "playwright", specifier = "~=1.49.1" }, { name = "psycopg", extras = ["binary"], specifier = "~=3.1.20" }, { name = "psycopg2-binary", specifier = "~=2.9.6" }, - { name = "pydantic", specifier = "~=2.10.6" }, + { name = "pydantic", specifier = "~=2.11.3" }, { name = "pyjwt", specifier = "~=2.10.1" }, { name = "python-dotenv", specifier = "~=1.0.1" }, { name = "requests", specifier = "~=2.32.3" }, @@ -429,6 +441,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ + { name = "deepdiff", specifier = ">=8.5.0" }, { name = "docker", specifier = ">=7.1.0" }, { name = "pendulum", specifier = ">=3.1.0" }, { name = "pytest", specifier = ">=7.2.2" }, @@ -463,6 +476,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3f/59/46818ebeb708234a60e42ccf409d20709e482519d2aa450b501ddbba4594/datasets-2.19.2-py3-none-any.whl", hash = "sha256:e07ff15d75b1af75c87dd96323ba2a361128d495136652f37fd62f918d17bb4e", size = 542113, upload_time = "2024-06-03T05:11:41.151Z" }, ] +[[package]] +name = "deepdiff" +version = "8.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "orderly-set" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/0f/9cd2624f7dcd755cbf1fa21fb7234541f19a1be96a56f387ec9053ebe220/deepdiff-8.5.0.tar.gz", hash = "sha256:a4dd3529fa8d4cd5b9cbb6e3ea9c95997eaa919ba37dac3966c1b8f872dc1cd1", size = 538517, upload_time = "2025-05-09T18:44:10.035Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/3b/2e0797200c51531a6d8c97a8e4c9fa6fb56de7e6e2a15c1c067b6b10a0b0/deepdiff-8.5.0-py3-none-any.whl", hash = "sha256:d4599db637f36a1c285f5fdfc2cd8d38bde8d8be8636b65ab5e425b67c54df26", size = 85112, upload_time = "2025-05-09T18:44:07.784Z" }, +] + [[package]] name = "dill" version = "0.3.8" @@ -1408,6 +1433,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl", hash = "sha256:69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd", size = 71932, upload_time = "2024-09-26T14:33:23.039Z" }, ] +[[package]] +name = "orderly-set" +version = "5.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/4a/38030da31c13dcd5a531490006e63a0954083fb115113be9393179738e25/orderly_set-5.4.1.tar.gz", hash = "sha256:a1fb5a4fdc5e234e9e8d8e5c1bbdbc4540f4dfe50d12bf17c8bc5dbf1c9c878d", size = 20943, upload_time = "2025-05-06T22:34:13.512Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/bc/e0dfb4db9210d92b44e49d6e61ba5caefbd411958357fa9d7ff489eeb835/orderly_set-5.4.1-py3-none-any.whl", hash = "sha256:b5e21d21680bd9ef456885db800c5cb4f76a03879880c0175e1b077fb166fd83", size = 12339, upload_time = "2025-05-06T22:34:12.564Z" }, +] + [[package]] name = "packaging" version = "25.0" @@ -1458,6 +1492,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436, upload_time = "2024-09-20T13:09:48.112Z" }, ] +[[package]] +name = "pdap-access-manager" +version = "0.3.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "boltons" }, + { name = "pydantic" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/54/c0e76d1d54ff2f542f18b289db96c417d3bcd7e8e948de07921b492717e7/pdap_access_manager-0.3.5.tar.gz", hash = "sha256:5f8bbe0f25ef68810a0936ca22d40d3869d77391bae3c8ba1c885f8fe74154bd", size = 4120, upload_time = "2025-05-13T13:40:24.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/01/d4ba10d0d7be759e59011f4235c533b1bc31d5e99db86424cfd82284ce53/pdap_access_manager-0.3.5-py3-none-any.whl", hash = "sha256:b53a006e535d7733ca884560f41aa305068fec648c89524e397967a21e69a0d0", size = 4980, upload_time = "2025-05-13T13:40:23.223Z" }, +] + [[package]] name = "pendulum" version = "3.1.0" @@ -1793,69 +1842,82 @@ wheels = [ [[package]] name = "pydantic" -version = "2.10.6" +version = "2.11.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, + { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681, upload_time = "2025-01-24T01:42:12.693Z" } +sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513, upload_time = "2025-04-08T13:27:06.399Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696, upload_time = "2025-01-24T01:42:10.371Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591, upload_time = "2025-04-08T13:27:03.789Z" }, ] [[package]] name = "pydantic-core" -version = "2.27.2" +version = "2.33.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443, upload_time = "2024-12-18T11:31:54.917Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421, upload_time = "2024-12-18T11:27:55.409Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998, upload_time = "2024-12-18T11:27:57.252Z" }, - { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167, upload_time = "2024-12-18T11:27:59.146Z" }, - { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071, upload_time = "2024-12-18T11:28:02.625Z" }, - { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244, upload_time = "2024-12-18T11:28:04.442Z" }, - { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470, upload_time = "2024-12-18T11:28:07.679Z" }, - { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291, upload_time = "2024-12-18T11:28:10.297Z" }, - { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613, upload_time = "2024-12-18T11:28:13.362Z" }, - { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355, upload_time = "2024-12-18T11:28:16.587Z" }, - { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661, upload_time = "2024-12-18T11:28:18.407Z" }, - { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261, upload_time = "2024-12-18T11:28:21.471Z" }, - { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361, upload_time = "2024-12-18T11:28:23.53Z" }, - { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484, upload_time = "2024-12-18T11:28:25.391Z" }, - { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102, upload_time = "2024-12-18T11:28:28.593Z" }, - { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127, upload_time = "2024-12-18T11:28:30.346Z" }, - { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340, upload_time = "2024-12-18T11:28:32.521Z" }, - { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900, upload_time = "2024-12-18T11:28:34.507Z" }, - { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177, upload_time = "2024-12-18T11:28:36.488Z" }, - { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046, upload_time = "2024-12-18T11:28:39.409Z" }, - { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386, upload_time = "2024-12-18T11:28:41.221Z" }, - { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060, upload_time = "2024-12-18T11:28:44.709Z" }, - { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870, upload_time = "2024-12-18T11:28:46.839Z" }, - { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822, upload_time = "2024-12-18T11:28:48.896Z" }, - { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364, upload_time = "2024-12-18T11:28:50.755Z" }, - { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303, upload_time = "2024-12-18T11:28:54.122Z" }, - { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064, upload_time = "2024-12-18T11:28:56.074Z" }, - { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046, upload_time = "2024-12-18T11:28:58.107Z" }, - { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092, upload_time = "2024-12-18T11:29:01.335Z" }, - { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709, upload_time = "2024-12-18T11:29:03.193Z" }, - { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273, upload_time = "2024-12-18T11:29:05.306Z" }, - { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027, upload_time = "2024-12-18T11:29:07.294Z" }, - { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888, upload_time = "2024-12-18T11:29:09.249Z" }, - { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738, upload_time = "2024-12-18T11:29:11.23Z" }, - { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138, upload_time = "2024-12-18T11:29:16.396Z" }, - { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025, upload_time = "2024-12-18T11:29:20.25Z" }, - { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633, upload_time = "2024-12-18T11:29:23.877Z" }, - { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404, upload_time = "2024-12-18T11:29:25.872Z" }, - { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130, upload_time = "2024-12-18T11:29:29.252Z" }, - { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946, upload_time = "2024-12-18T11:29:31.338Z" }, - { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387, upload_time = "2024-12-18T11:29:33.481Z" }, - { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453, upload_time = "2024-12-18T11:29:35.533Z" }, - { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186, upload_time = "2024-12-18T11:29:37.649Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395, upload_time = "2025-04-02T09:49:41.8Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/7f/c6298830cb780c46b4f46bb24298d01019ffa4d21769f39b908cd14bbd50/pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", size = 2044224, upload_time = "2025-04-02T09:47:04.199Z" }, + { url = "https://files.pythonhosted.org/packages/a8/65/6ab3a536776cad5343f625245bd38165d6663256ad43f3a200e5936afd6c/pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", size = 1858845, upload_time = "2025-04-02T09:47:05.686Z" }, + { url = "https://files.pythonhosted.org/packages/e9/15/9a22fd26ba5ee8c669d4b8c9c244238e940cd5d818649603ca81d1c69861/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", size = 1910029, upload_time = "2025-04-02T09:47:07.042Z" }, + { url = "https://files.pythonhosted.org/packages/d5/33/8cb1a62818974045086f55f604044bf35b9342900318f9a2a029a1bec460/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", size = 1997784, upload_time = "2025-04-02T09:47:08.63Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ca/49958e4df7715c71773e1ea5be1c74544923d10319173264e6db122543f9/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", size = 2141075, upload_time = "2025-04-02T09:47:10.267Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a6/0b3a167a9773c79ba834b959b4e18c3ae9216b8319bd8422792abc8a41b1/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", size = 2745849, upload_time = "2025-04-02T09:47:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/0b/60/516484135173aa9e5861d7a0663dce82e4746d2e7f803627d8c25dfa5578/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", size = 2005794, upload_time = "2025-04-02T09:47:13.099Z" }, + { url = "https://files.pythonhosted.org/packages/86/70/05b1eb77459ad47de00cf78ee003016da0cedf8b9170260488d7c21e9181/pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", size = 2123237, upload_time = "2025-04-02T09:47:14.355Z" }, + { url = "https://files.pythonhosted.org/packages/c7/57/12667a1409c04ae7dc95d3b43158948eb0368e9c790be8b095cb60611459/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", size = 2086351, upload_time = "2025-04-02T09:47:15.676Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/cc6d1d1c1664b58fdd6ecc64c84366c34ec9b606aeb66cafab6f4088974c/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", size = 2258914, upload_time = "2025-04-02T09:47:17Z" }, + { url = "https://files.pythonhosted.org/packages/d1/0a/edb137176a1f5419b2ddee8bde6a0a548cfa3c74f657f63e56232df8de88/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", size = 2257385, upload_time = "2025-04-02T09:47:18.631Z" }, + { url = "https://files.pythonhosted.org/packages/26/3c/48ca982d50e4b0e1d9954919c887bdc1c2b462801bf408613ccc641b3daa/pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", size = 1923765, upload_time = "2025-04-02T09:47:20.34Z" }, + { url = "https://files.pythonhosted.org/packages/33/cd/7ab70b99e5e21559f5de38a0928ea84e6f23fdef2b0d16a6feaf942b003c/pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", size = 1950688, upload_time = "2025-04-02T09:47:22.029Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ae/db1fc237b82e2cacd379f63e3335748ab88b5adde98bf7544a1b1bd10a84/pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", size = 1908185, upload_time = "2025-04-02T09:47:23.385Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ce/3cb22b07c29938f97ff5f5bb27521f95e2ebec399b882392deb68d6c440e/pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", size = 2026640, upload_time = "2025-04-02T09:47:25.394Z" }, + { url = "https://files.pythonhosted.org/packages/19/78/f381d643b12378fee782a72126ec5d793081ef03791c28a0fd542a5bee64/pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", size = 1852649, upload_time = "2025-04-02T09:47:27.417Z" }, + { url = "https://files.pythonhosted.org/packages/9d/2b/98a37b80b15aac9eb2c6cfc6dbd35e5058a352891c5cce3a8472d77665a6/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", size = 1892472, upload_time = "2025-04-02T09:47:29.006Z" }, + { url = "https://files.pythonhosted.org/packages/4e/d4/3c59514e0f55a161004792b9ff3039da52448f43f5834f905abef9db6e4a/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", size = 1977509, upload_time = "2025-04-02T09:47:33.464Z" }, + { url = "https://files.pythonhosted.org/packages/a9/b6/c2c7946ef70576f79a25db59a576bce088bdc5952d1b93c9789b091df716/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", size = 2128702, upload_time = "2025-04-02T09:47:34.812Z" }, + { url = "https://files.pythonhosted.org/packages/88/fe/65a880f81e3f2a974312b61f82a03d85528f89a010ce21ad92f109d94deb/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", size = 2679428, upload_time = "2025-04-02T09:47:37.315Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ff/4459e4146afd0462fb483bb98aa2436d69c484737feaceba1341615fb0ac/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", size = 2008753, upload_time = "2025-04-02T09:47:39.013Z" }, + { url = "https://files.pythonhosted.org/packages/7c/76/1c42e384e8d78452ededac8b583fe2550c84abfef83a0552e0e7478ccbc3/pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", size = 2114849, upload_time = "2025-04-02T09:47:40.427Z" }, + { url = "https://files.pythonhosted.org/packages/00/72/7d0cf05095c15f7ffe0eb78914b166d591c0eed72f294da68378da205101/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", size = 2069541, upload_time = "2025-04-02T09:47:42.01Z" }, + { url = "https://files.pythonhosted.org/packages/b3/69/94a514066bb7d8be499aa764926937409d2389c09be0b5107a970286ef81/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", size = 2239225, upload_time = "2025-04-02T09:47:43.425Z" }, + { url = "https://files.pythonhosted.org/packages/84/b0/e390071eadb44b41f4f54c3cef64d8bf5f9612c92686c9299eaa09e267e2/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", size = 2248373, upload_time = "2025-04-02T09:47:44.979Z" }, + { url = "https://files.pythonhosted.org/packages/d6/b2/288b3579ffc07e92af66e2f1a11be3b056fe1214aab314748461f21a31c3/pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", size = 1907034, upload_time = "2025-04-02T09:47:46.843Z" }, + { url = "https://files.pythonhosted.org/packages/02/28/58442ad1c22b5b6742b992ba9518420235adced665513868f99a1c2638a5/pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", size = 1956848, upload_time = "2025-04-02T09:47:48.404Z" }, + { url = "https://files.pythonhosted.org/packages/a1/eb/f54809b51c7e2a1d9f439f158b8dd94359321abcc98767e16fc48ae5a77e/pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", size = 1903986, upload_time = "2025-04-02T09:47:49.839Z" }, + { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551, upload_time = "2025-04-02T09:47:51.648Z" }, + { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785, upload_time = "2025-04-02T09:47:53.149Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758, upload_time = "2025-04-02T09:47:55.006Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109, upload_time = "2025-04-02T09:47:56.532Z" }, + { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159, upload_time = "2025-04-02T09:47:58.088Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222, upload_time = "2025-04-02T09:47:59.591Z" }, + { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980, upload_time = "2025-04-02T09:48:01.397Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840, upload_time = "2025-04-02T09:48:03.056Z" }, + { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518, upload_time = "2025-04-02T09:48:04.662Z" }, + { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025, upload_time = "2025-04-02T09:48:06.226Z" }, + { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991, upload_time = "2025-04-02T09:48:08.114Z" }, + { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262, upload_time = "2025-04-02T09:48:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626, upload_time = "2025-04-02T09:48:11.288Z" }, + { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590, upload_time = "2025-04-02T09:48:12.861Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963, upload_time = "2025-04-02T09:48:14.553Z" }, + { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896, upload_time = "2025-04-02T09:48:16.222Z" }, + { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810, upload_time = "2025-04-02T09:48:17.97Z" }, + { url = "https://files.pythonhosted.org/packages/0b/76/1794e440c1801ed35415238d2c728f26cd12695df9057154ad768b7b991c/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", size = 2042858, upload_time = "2025-04-02T09:49:03.419Z" }, + { url = "https://files.pythonhosted.org/packages/73/b4/9cd7b081fb0b1b4f8150507cd59d27b275c3e22ad60b35cb19ea0977d9b9/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", size = 1873745, upload_time = "2025-04-02T09:49:05.391Z" }, + { url = "https://files.pythonhosted.org/packages/e1/d7/9ddb7575d4321e40d0363903c2576c8c0c3280ebea137777e5ab58d723e3/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", size = 1904188, upload_time = "2025-04-02T09:49:07.352Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/3194ccfe461bb08da19377ebec8cb4f13c9bd82e13baebc53c5c7c39a029/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", size = 2083479, upload_time = "2025-04-02T09:49:09.304Z" }, + { url = "https://files.pythonhosted.org/packages/42/c7/84cb569555d7179ca0b3f838cef08f66f7089b54432f5b8599aac6e9533e/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", size = 2118415, upload_time = "2025-04-02T09:49:11.25Z" }, + { url = "https://files.pythonhosted.org/packages/3b/67/72abb8c73e0837716afbb58a59cc9e3ae43d1aa8677f3b4bc72c16142716/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", size = 2079623, upload_time = "2025-04-02T09:49:13.292Z" }, + { url = "https://files.pythonhosted.org/packages/0b/cd/c59707e35a47ba4cbbf153c3f7c56420c58653b5801b055dc52cccc8e2dc/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", size = 2250175, upload_time = "2025-04-02T09:49:15.597Z" }, + { url = "https://files.pythonhosted.org/packages/84/32/e4325a6676b0bed32d5b084566ec86ed7fd1e9bcbfc49c578b1755bde920/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", size = 2254674, upload_time = "2025-04-02T09:49:17.61Z" }, + { url = "https://files.pythonhosted.org/packages/12/6f/5596dc418f2e292ffc661d21931ab34591952e2843e7168ea5a52591f6ff/pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", size = 2080951, upload_time = "2025-04-02T09:49:19.559Z" }, ] [[package]] @@ -2146,16 +2208,16 @@ wheels = [ [[package]] name = "rich-toolkit" -version = "0.14.5" +version = "0.14.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/24/f0678256fbe0643b4ba00a460f4b736ef07042e459f8d4087c8b7011ab81/rich_toolkit-0.14.5.tar.gz", hash = "sha256:1cb7a3fa0bdbf35793460708664f3f797e8b18cedec9cd41a7e6125e4bc6272b", size = 104799, upload_time = "2025-05-05T10:19:24.521Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/31/b6d055f291a660a7bcaec4bcc9457b9fef8ecb6293e527b1eef1840aefd4/rich_toolkit-0.14.6.tar.gz", hash = "sha256:9dbd40e83414b84e828bf899115fff8877ce5951b73175f44db142902f07645d", size = 110805, upload_time = "2025-05-12T19:19:15.284Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/13/621cc551b72de51e6e5cb7cfc510a141e1858bd380ee3c8108fbda4a6be0/rich_toolkit-0.14.5-py3-none-any.whl", hash = "sha256:2fe9846ecbf5d0cdf236c7f43452b68d9da1436a81594aba6b79b3c48b05703b", size = 24791, upload_time = "2025-05-05T10:19:23.346Z" }, + { url = "https://files.pythonhosted.org/packages/2e/3c/7a824c0514e87c61000583ac22c8321da6dc8e58a93d5f56e583482a2ee0/rich_toolkit-0.14.6-py3-none-any.whl", hash = "sha256:764f3a5f9e4b539ce805596863299e8982599514906dc5e3ccc2d390ef74c301", size = 24815, upload_time = "2025-05-12T19:19:13.713Z" }, ] [[package]] @@ -2194,11 +2256,11 @@ wheels = [ [[package]] name = "setuptools" -version = "80.3.1" +version = "80.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/dc/3976b322de9d2e87ed0007cf04cc7553969b6c7b3f48a565d0333748fbcd/setuptools-80.3.1.tar.gz", hash = "sha256:31e2c58dbb67c99c289f51c16d899afedae292b978f8051efaf6262d8212f927", size = 1315082, upload_time = "2025-05-04T18:47:04.397Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/0cc40fe41fd2adb80a2f388987f4f8db3c866c69e33e0b4c8b093fdf700e/setuptools-80.4.0.tar.gz", hash = "sha256:5a78f61820bc088c8e4add52932ae6b8cf423da2aff268c23f813cfbb13b4006", size = 1315008, upload_time = "2025-05-09T20:42:27.972Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/53/7e/5d8af3317ddbf9519b687bd1c39d8737fde07d97f54df65553faca5cffb1/setuptools-80.3.1-py3-none-any.whl", hash = "sha256:ea8e00d7992054c4c592aeb892f6ad51fe1b4d90cc6947cc45c45717c40ec537", size = 1201172, upload_time = "2025-05-04T18:47:02.575Z" }, + { url = "https://files.pythonhosted.org/packages/b1/93/dba5ed08c2e31ec7cdc2ce75705a484ef0be1a2fecac8a58272489349de8/setuptools-80.4.0-py3-none-any.whl", hash = "sha256:6cdc8cb9a7d590b237dbe4493614a9b75d0559b888047c1f67d49ba50fc3edb2", size = 1200812, upload_time = "2025-05-09T20:42:25.325Z" }, ] [[package]] @@ -2529,6 +2591,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload_time = "2025-04-10T14:19:03.967Z" }, ] +[[package]] +name = "typing-inspection" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222, upload_time = "2025-02-25T17:27:59.638Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125, upload_time = "2025-02-25T17:27:57.754Z" }, +] + [[package]] name = "tzdata" version = "2025.2" From b4a445f7628a056855595c50f2753aeecb857f24 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 13 May 2025 11:01:31 -0400 Subject: [PATCH 182/244] feat(app): Change metrics endpoints from per week to per month --- collector_db/AsyncDatabaseClient.py | 44 ++++++++++--------- core/DTOs/GetMetricsBacklogResponse.py | 17 +++++-- ...tMetricsURLsBreakdownPendingResponseDTO.py | 14 +++++- ...etricsURLsBreakdownSubmittedResponseDTO.py | 17 +++++-- .../integration/api/test_metrics.py | 28 ++++++------ 5 files changed, 77 insertions(+), 43 deletions(-) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 03c652c9..ac6216d6 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -2001,14 +2001,14 @@ async def get_urls_breakdown_submitted_metrics( ) -> GetMetricsURLsBreakdownSubmittedResponseDTO: # Build the query - week = func.date_trunc('week', URLDataSource.created_at) + month = func.date_trunc('month', URLDataSource.created_at) query = ( select( - week.label('week'), + month.label('month'), func.count(URLDataSource.id).label('count_submitted'), ) - .group_by(week) - .order_by(week.asc()) + .group_by(month) + .order_by(month.asc()) ) # Execute the query @@ -2017,7 +2017,7 @@ async def get_urls_breakdown_submitted_metrics( final_results: list[GetMetricsURLsBreakdownSubmittedInnerDTO] = [] for result in results: dto = GetMetricsURLsBreakdownSubmittedInnerDTO( - week_of=result.week, + month=result.month.strftime("%B %Y"), count_submitted=result.count_submitted ) final_results.append(dto) @@ -2111,12 +2111,12 @@ async def get_urls_breakdown_pending_metrics( ).cte("flags") - week = func.date_trunc('week', URL.created_at) + month = func.date_trunc('month', URL.created_at) # Build the query query = ( select( - week.label('week'), + month.label('month'), func.count(URL.id).label('count_total'), func.count(case( (flags.c.has_user_record_type_annotation == True, 1)) @@ -2130,8 +2130,8 @@ async def get_urls_breakdown_pending_metrics( ) .outerjoin(flags, flags.c.url_id == URL.id) .where(URL.outcome == URLStatus.PENDING.value) - .group_by(week) - .order_by(week.asc()) + .group_by(month) + .order_by(month.asc()) ) # Execute the query and return the results @@ -2141,7 +2141,7 @@ async def get_urls_breakdown_pending_metrics( for result in all_results: dto = GetMetricsURLsBreakdownPendingResponseInnerDTO( - week_created_at=result.week, + month=result.month.strftime("%B %Y"), count_pending_total=result.count_total, count_pending_relevant_user=result.user_relevant_count, count_pending_record_type_user=result.user_record_type_count, @@ -2157,16 +2157,18 @@ async def get_backlog_metrics( self, session: AsyncSession ) -> GetMetricsBacklogResponseDTO: - # 1. Create a subquery that assigns row_number() partitioned by week - weekly_snapshots_subq = ( + month = func.date_trunc('month', BacklogSnapshot.created_at) + + # 1. Create a subquery that assigns row_number() partitioned by month + monthly_snapshot_subq = ( select( BacklogSnapshot.id, BacklogSnapshot.created_at, BacklogSnapshot.count_pending_total, - func.date_trunc('week', BacklogSnapshot.created_at).label("week_start"), + month.label("month_start"), func.row_number() .over( - partition_by=func.date_trunc('week', BacklogSnapshot.created_at), + partition_by=month, order_by=BacklogSnapshot.created_at.desc() ) .label("row_number") @@ -2174,15 +2176,15 @@ async def get_backlog_metrics( .subquery() ) - # 2. Filter for the top (most recent) row in each week + # 2. Filter for the top (most recent) row in each month stmt = ( select( - weekly_snapshots_subq.c.week_start, - weekly_snapshots_subq.c.created_at, - weekly_snapshots_subq.c.count_pending_total + monthly_snapshot_subq.c.month_start, + monthly_snapshot_subq.c.created_at, + monthly_snapshot_subq.c.count_pending_total ) - .where(weekly_snapshots_subq.c.row_number == 1) - .order_by(weekly_snapshots_subq.c.week_start) + .where(monthly_snapshot_subq.c.row_number == 1) + .order_by(monthly_snapshot_subq.c.month_start) ) raw_result = await session.execute(stmt) @@ -2191,7 +2193,7 @@ async def get_backlog_metrics( for result in results: final_results.append( GetMetricsBacklogResponseInnerDTO( - week_of=result.week_start, + month=result.month_start.strftime("%B %Y"), count_pending_total=result.count_pending_total, ) ) diff --git a/core/DTOs/GetMetricsBacklogResponse.py b/core/DTOs/GetMetricsBacklogResponse.py index 0df38324..8193e385 100644 --- a/core/DTOs/GetMetricsBacklogResponse.py +++ b/core/DTOs/GetMetricsBacklogResponse.py @@ -1,10 +1,21 @@ -import datetime +from datetime import datetime + +from pydantic import BaseModel, field_validator -from pydantic import BaseModel class GetMetricsBacklogResponseInnerDTO(BaseModel): - week_of: datetime.date + month: str count_pending_total: int + @field_validator("month") + @classmethod + def validate_month_format(cls, v: str) -> str: + try: + # This will raise ValueError if format doesn't match + datetime.strptime(v, "%B %Y") + except ValueError: + raise ValueError("month must be in the format 'MonthName YYYY' (e.g., 'May 2025')") + return v + class GetMetricsBacklogResponseDTO(BaseModel): entries: list[GetMetricsBacklogResponseInnerDTO] \ No newline at end of file diff --git a/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py b/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py index 22235e45..16e596d5 100644 --- a/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py +++ b/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py @@ -1,12 +1,22 @@ -from pydantic import BaseModel +from pydantic import BaseModel, field_validator from datetime import datetime class GetMetricsURLsBreakdownPendingResponseInnerDTO(BaseModel): - week_created_at: datetime + month: str count_pending_total: int count_pending_relevant_user: int count_pending_record_type_user: int count_pending_agency_user: int + @field_validator("month") + @classmethod + def validate_month_format(cls, v: str) -> str: + try: + # This will raise ValueError if format doesn't match + datetime.strptime(v, "%B %Y") + except ValueError: + raise ValueError("month must be in the format 'MonthName YYYY' (e.g., 'May 2025')") + return v + class GetMetricsURLsBreakdownPendingResponseDTO(BaseModel): entries: list[GetMetricsURLsBreakdownPendingResponseInnerDTO] \ No newline at end of file diff --git a/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py b/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py index d5c1dde5..2ac4e768 100644 --- a/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py +++ b/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py @@ -1,10 +1,21 @@ -from datetime import date +from datetime import datetime + +from pydantic import BaseModel, field_validator -from pydantic import BaseModel class GetMetricsURLsBreakdownSubmittedInnerDTO(BaseModel): - week_of: date + month: str count_submitted: int + @field_validator("month") + @classmethod + def validate_month_format(cls, v: str) -> str: + try: + # This will raise ValueError if format doesn't match + datetime.strptime(v, "%B %Y") + except ValueError: + raise ValueError("month must be in the format 'MonthName YYYY' (e.g., 'May 2025')") + return v + class GetMetricsURLsBreakdownSubmittedResponseDTO(BaseModel): entries: list[GetMetricsURLsBreakdownSubmittedInnerDTO] \ No newline at end of file diff --git a/tests/test_automated/integration/api/test_metrics.py b/tests/test_automated/integration/api/test_metrics.py index fc45ad0b..b8eb6ca6 100644 --- a/tests/test_automated/integration/api/test_metrics.py +++ b/tests/test_automated/integration/api/test_metrics.py @@ -76,8 +76,8 @@ async def test_get_batches_aggregated_metrics(api_test_helper): @pytest.mark.asyncio async def test_get_batches_breakdown_metrics(api_test_helper): - # Create a different batch for each week, with different URLs - today = pendulum.today() + # Create a different batch for each month, with different URLs + today = pendulum.parse('2021-01-01') ath = api_test_helper batch_1_params = TestBatchCreationParameters( @@ -169,7 +169,7 @@ async def test_get_batches_breakdown_metrics(api_test_helper): async def test_get_urls_breakdown_submitted_metrics(api_test_helper): # Create URLs with submitted status, broken down in different amounts by different weeks # And ensure the URLs are - today = pendulum.today() + today = pendulum.parse('2021-01-01') ath = api_test_helper batch_1_params = TestBatchCreationParameters( @@ -234,7 +234,7 @@ async def test_get_urls_breakdown_pending_metrics(api_test_helper): # with a different number of kinds of annotations per URLs - today = pendulum.today() + today = pendulum.parse('2021-01-01') ath = api_test_helper agency_id = await ath.db_data_creator.agency() @@ -315,7 +315,7 @@ async def test_get_urls_breakdown_pending_metrics(api_test_helper): @pytest.mark.asyncio async def test_get_urls_aggregate_metrics(api_test_helper): ath = api_test_helper - today = pendulum.today() + today = pendulum.parse('2021-01-01') batch_0_params = TestBatchCreationParameters( strategy=CollectorType.MANUAL, @@ -384,14 +384,14 @@ async def test_get_urls_aggregate_metrics(api_test_helper): @pytest.mark.asyncio async def test_get_backlog_metrics(api_test_helper): - today = pendulum.today() + today = pendulum.parse('2021-01-01') ath = api_test_helper adb_client = ath.adb_client() - # Populate the backlog table and test that backlog metrics returned on a weekly basis - # Ensure that multiple days in each week are added to the backlog table, with different values + # Populate the backlog table and test that backlog metrics returned on a monthly basis + # Ensure that multiple days in each month are added to the backlog table, with different values batch_1_params = TestBatchCreationParameters( @@ -413,11 +413,11 @@ async def test_get_backlog_metrics(api_test_helper): batch_1 = await ath.db_data_creator.batch_v2(batch_1_params) await adb_client.populate_backlog_snapshot( - dt=today.subtract(weeks=3).naive() + dt=today.subtract(months=3).naive() ) await adb_client.populate_backlog_snapshot( - dt=today.subtract(weeks=2, days=3).naive() + dt=today.subtract(months=2, days=3).naive() ) batch_2_params = TestBatchCreationParameters( @@ -439,11 +439,11 @@ async def test_get_backlog_metrics(api_test_helper): batch_2 = await ath.db_data_creator.batch_v2(batch_2_params) await adb_client.populate_backlog_snapshot( - dt=today.subtract(weeks=2).naive() + dt=today.subtract(months=2).naive() ) await adb_client.populate_backlog_snapshot( - dt=today.subtract(weeks=1, days=4).naive() + dt=today.subtract(months=1, days=4).naive() ) batch_3_params = TestBatchCreationParameters( @@ -465,14 +465,14 @@ async def test_get_backlog_metrics(api_test_helper): batch_3 = await ath.db_data_creator.batch_v2(batch_3_params) await adb_client.populate_backlog_snapshot( - dt=today.subtract(weeks=1).naive() + dt=today.subtract(months=1).naive() ) dto = await ath.request_validator.get_backlog_metrics() assert len(dto.entries) == 3 - # Test that the count closest to the beginning of the week is returned for each week + # Test that the count closest to the beginning of the month is returned for each month assert dto.entries[0].count_pending_total == 1 assert dto.entries[1].count_pending_total == 5 assert dto.entries[2].count_pending_total == 12 \ No newline at end of file From 2813c278e52bfc45a1439c78b6ce494207be39fb Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 13 May 2025 12:29:44 -0400 Subject: [PATCH 183/244] fix(app): Update URL Duplicate Task to better handle 429 TOO MANY REQUESTS --- .../URLDuplicateTaskOperator.py | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/core/classes/task_operators/URLDuplicateTaskOperator.py b/core/classes/task_operators/URLDuplicateTaskOperator.py index 32cea432..060c07c7 100644 --- a/core/classes/task_operators/URLDuplicateTaskOperator.py +++ b/core/classes/task_operators/URLDuplicateTaskOperator.py @@ -1,3 +1,7 @@ +from http import HTTPStatus + +from aiohttp import ClientResponseError + from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.enums import TaskType from core.DTOs.task_data_objects.URLDuplicateTDO import URLDuplicateTDO @@ -26,8 +30,18 @@ async def inner_task_logic(self): tdos: list[URLDuplicateTDO] = await self.adb_client.get_pending_urls_not_checked_for_duplicates() url_ids = [tdo.url_id for tdo in tdos] await self.link_urls_to_task(url_ids=url_ids) + checked_tdos = [] for tdo in tdos: - tdo.is_duplicate = await self.pdap_client.is_url_duplicate(tdo.url) - duplicate_url_ids = [tdo.url_id for tdo in tdos if tdo.is_duplicate] + try: + tdo.is_duplicate = await self.pdap_client.is_url_duplicate(tdo.url) + checked_tdos.append(tdo) + except ClientResponseError as e: + print("ClientResponseError:", e.status) + if e.status == HTTPStatus.TOO_MANY_REQUESTS: + break + raise e + + duplicate_url_ids = [tdo.url_id for tdo in checked_tdos if tdo.is_duplicate] + checked_url_ids = [tdo.url_id for tdo in checked_tdos] await self.adb_client.mark_all_as_duplicates(duplicate_url_ids) - await self.adb_client.mark_as_checked_for_duplicates(url_ids) + await self.adb_client.mark_as_checked_for_duplicates(checked_url_ids) From a2d6f97444207b8f9e3b14c358dfe1fa84d78d7a Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 15 May 2025 16:44:05 -0400 Subject: [PATCH 184/244] feat(app): Add 404 Probe Task Additionally update HTML Task to add 404 status to URL where 404s are returned --- ...cb_create_url_probed_for_404_table_and_.py | 137 +++++++++++++++ collector_db/AsyncDatabaseClient.py | 87 +++++++++- collector_db/DTOConverter.py | 19 +++ collector_db/enums.py | 1 + collector_db/models.py | 16 ++ collector_manager/enums.py | 1 + core/DTOs/task_data_objects/URL404ProbeTDO.py | 9 + core/DTOs/task_data_objects/UrlHtmlTDO.py | 6 +- core/TaskManager.py | 9 + .../task_operators/URL404ProbeTaskOperator.py | 63 +++++++ .../task_operators/URLHTMLTaskOperator.py | 31 +++- html_tag_collector/URLRequestInterface.py | 45 +++-- .../test_html_tag_collector_integration.py | 20 ++- .../integration/tasks/test_url_404_probe.py | 161 ++++++++++++++++++ .../integration/tasks/test_url_html_task.py | 34 +++- util/alembic_helpers.py | 8 +- 16 files changed, 614 insertions(+), 33 deletions(-) create mode 100644 alembic/versions/2025_05_13_1234-b5f079b6b8cb_create_url_probed_for_404_table_and_.py create mode 100644 core/DTOs/task_data_objects/URL404ProbeTDO.py create mode 100644 core/classes/task_operators/URL404ProbeTaskOperator.py create mode 100644 tests/test_automated/integration/tasks/test_url_404_probe.py diff --git a/alembic/versions/2025_05_13_1234-b5f079b6b8cb_create_url_probed_for_404_table_and_.py b/alembic/versions/2025_05_13_1234-b5f079b6b8cb_create_url_probed_for_404_table_and_.py new file mode 100644 index 00000000..f8868b02 --- /dev/null +++ b/alembic/versions/2025_05_13_1234-b5f079b6b8cb_create_url_probed_for_404_table_and_.py @@ -0,0 +1,137 @@ +"""Create url_probed_for_404 table and adjust logic for 404 probe + +Revision ID: b5f079b6b8cb +Revises: 864107b703ae +Create Date: 2025-05-13 12:34:46.846656 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +from util.alembic_helpers import switch_enum_type + +# revision identifiers, used by Alembic. +revision: str = 'b5f079b6b8cb' +down_revision: Union[str, None] = '864107b703ae' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + op.create_table( + 'url_probed_for_404', + sa.Column('id', sa.Integer(), nullable=False, primary_key=True), + sa.Column('url_id', sa.Integer(), nullable=False), + sa.Column('last_probed_at', sa.DateTime(), nullable=False, server_default=sa.text('now()')), + ) + + # Add unique constraint to url_id column + op.create_unique_constraint('uq_url_probed_for_404_url_id', 'url_probed_for_404', ['url_id']) + # Add unique constraint for url_id column in url_checked_for_duplicate table + op.create_unique_constraint('uq_url_checked_for_duplicates_url_id', 'url_checked_for_duplicate', ['url_id']) + + # Create new `404 Not Found` URL Status + switch_enum_type( + table_name='urls', + column_name='outcome', + enum_name='url_status', + new_enum_values=[ + 'pending', + 'submitted', + 'validated', + 'duplicate', + 'rejected', + 'error', + '404 not found', + ], + check_constraints_to_drop=['url_name_not_null_when_validated'] + ) + + # Add '404 Probe' to TaskType Enum + switch_enum_type( + table_name='tasks', + column_name='task_type', + enum_name='task_type', + new_enum_values=[ + 'HTML', + 'Relevancy', + 'Record Type', + 'Agency Identification', + 'Misc Metadata', + 'Submit Approved URLs', + 'Duplicate Detection', + '404 Probe' + ] + ) + + op.execute( + """ + ALTER TABLE urls + ADD CONSTRAINT url_name_not_null_when_validated + CHECK ((name IS NOT NULL) OR (outcome <> 'validated'::url_status)) + """ + ) + + # Update existing error URLs with an error message of 404 Not Found + op.execute(""" + UPDATE urls + SET outcome = '404 not found' + FROM url_error_info uei + WHERE urls.id = uei.url_id + AND urls.outcome = 'error' + AND uei.error LIKE '%404%'; + """) + + +def downgrade() -> None: + op.drop_table('url_probed_for_404') + + # Drop unique constraint for url_id column in url_checked_for_duplicate table + op.drop_constraint('uq_url_checked_for_duplicates_url_id', 'url_checked_for_duplicate', type_='unique') + + # Drop `404 Not Found` URL Status + op.execute(""" + UPDATE urls + SET outcome = 'error' + WHERE outcome = '404 not found'; + """) + + switch_enum_type( + table_name='urls', + column_name='outcome', + enum_name='url_status', + new_enum_values=[ + 'pending', + 'submitted', + 'validated', + 'duplicate', + 'rejected', + 'error', + ], + check_constraints_to_drop=['url_name_not_null_when_validated'] + ) + + op.execute( + """ + ALTER TABLE urls + ADD CONSTRAINT url_name_not_null_when_validated + CHECK ((name IS NOT NULL) OR (outcome <> 'validated'::url_status)) + """ + ) + + switch_enum_type( + table_name='tasks', + column_name='task_type', + enum_name='task_type', + new_enum_values=[ + 'HTML', + 'Relevancy', + 'Record Type', + 'Agency Identification', + 'Misc Metadata', + 'Submit Approved URLs', + 'Duplicate Detection', + ] + ) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index ac6216d6..2fad609d 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -1,5 +1,6 @@ from datetime import datetime, timedelta from functools import wraps +from operator import or_ from typing import Optional, Type, Any, List from fastapi import HTTPException @@ -29,7 +30,7 @@ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Duplicate, Log, \ - BacklogSnapshot, URLDataSource, URLCheckedForDuplicate + BacklogSnapshot, URLDataSource, URLCheckedForDuplicate, URLProbedFor404 from collector_manager.enums import URLStatus, CollectorType from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo @@ -60,6 +61,7 @@ from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO, SubmittedURLInfo +from core.DTOs.task_data_objects.URL404ProbeTDO import URL404ProbeTDO from core.DTOs.task_data_objects.URLDuplicateTDO import URLDuplicateTDO from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo from core.EnvVarManager import EnvVarManager @@ -468,12 +470,14 @@ async def add_miscellaneous_metadata(self, session: AsyncSession, tdos: list[URL @session_manager - async def get_pending_urls_without_html_data(self, session: AsyncSession): + async def get_pending_urls_without_html_data(self, session: AsyncSession) -> list[URLInfo]: # TODO: Add test that includes some urls WITH html data. Check they're not returned statement = self.statement_composer.pending_urls_without_html_data() statement = statement.limit(100).order_by(URL.id) scalar_result = await session.scalars(statement) - return scalar_result.all() + results: list[URL] = scalar_result.all() + return DTOConverter.url_list_to_url_info_list(results) + async def get_urls_with_html_data_and_without_models( self, @@ -1343,6 +1347,13 @@ async def get_url_info_by_url(self, session: AsyncSession, url: str) -> Optional url = raw_result.scalars().first() return URLInfo(**url.__dict__) + @session_manager + async def get_url_info_by_id(self, session: AsyncSession, url_id: int) -> Optional[URLInfo]: + query = Select(URL).where(URL.id == url_id) + raw_result = await session.execute(query) + url = raw_result.scalars().first() + return URLInfo(**url.__dict__) + @session_manager async def insert_logs(self, session, log_infos: List[LogInfo]): for log_info in log_infos: @@ -2267,8 +2278,78 @@ async def mark_all_as_duplicates(self, session: AsyncSession, url_ids: List[int] query = update(URL).where(URL.id.in_(url_ids)).values(outcome=URLStatus.DUPLICATE.value) await session.execute(query) + @session_manager + async def mark_all_as_404(self, session: AsyncSession, url_ids: List[int]): + query = update(URL).where(URL.id.in_(url_ids)).values(outcome=URLStatus.NOT_FOUND.value) + await session.execute(query) + + @session_manager + async def mark_all_as_recently_probed_for_404( + self, + session: AsyncSession, + url_ids: List[int], + dt: datetime = func.now() + ): + from sqlalchemy.dialects.postgresql import insert as pg_insert + values = [ + {"url_id": url_id, "last_probed_at": dt} for url_id in url_ids + ] + stmt = pg_insert(URLProbedFor404).values(values) + update_stmt = stmt.on_conflict_do_update( + index_elements=['url_id'], + set_={"last_probed_at": dt} + ) + await session.execute(update_stmt) + + @session_manager async def mark_as_checked_for_duplicates(self, session: AsyncSession, url_ids: list[int]): for url_id in url_ids: url_checked_for_duplicate = URLCheckedForDuplicate(url_id=url_id) session.add(url_checked_for_duplicate) + + @session_manager + async def has_pending_urls_not_recently_probed_for_404(self, session: AsyncSession) -> bool: + month_ago = func.now() - timedelta(days=30) + query = ( + select( + URL.id + ).outerjoin( + URLProbedFor404 + ).where( + and_( + URL.outcome == URLStatus.PENDING.value, + or_( + URLProbedFor404.id == None, + URLProbedFor404.last_probed_at < month_ago + ) + ) + ).limit(1) + ) + + raw_result = await session.execute(query) + result = raw_result.one_or_none() + return result is not None + + @session_manager + async def get_pending_urls_not_recently_probed_for_404(self, session: AsyncSession) -> List[URL404ProbeTDO]: + month_ago = func.now() - timedelta(days=30) + query = ( + select( + URL + ).outerjoin( + URLProbedFor404 + ).where( + and_( + URL.outcome == URLStatus.PENDING.value, + or_( + URLProbedFor404.id == None, + URLProbedFor404.last_probed_at < month_ago + ) + ) + ).limit(100) + ) + + raw_result = await session.execute(query) + urls = raw_result.scalars().all() + return [URL404ProbeTDO(url=url.url, url_id=url.id) for url in urls] \ No newline at end of file diff --git a/collector_db/DTOConverter.py b/collector_db/DTOConverter.py index b43fbbe9..307e8f85 100644 --- a/collector_db/DTOConverter.py +++ b/collector_db/DTOConverter.py @@ -1,6 +1,7 @@ from typing import Optional from collector_db.DTOs.URLHTMLContentInfo import HTMLContentType, URLHTMLContentInfo +from collector_db.DTOs.URLInfo import URLInfo from collector_db.DTOs.URLWithHTML import URLWithHTML from collector_db.models import AutomatedUrlAgencySuggestion, UserUrlAgencySuggestion, URLHTMLContent, URL, Agency, \ AutoRecordTypeSuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion, AutoRelevantSuggestion, \ @@ -158,6 +159,24 @@ def final_review_annotation_agency_info( def url_list_to_url_with_html_list(url_list: list[URL]) -> list[URLWithHTML]: return [DTOConverter.url_to_url_with_html(url) for url in url_list] + @staticmethod + def url_list_to_url_info_list(urls: list[URL]) -> list[URLInfo]: + results = [] + for url in urls: + url_info = URLInfo( + id=url.id, + batch_id=url.batch_id, + url=url.url, + collector_metadata=url.collector_metadata, + outcome=url.outcome, + created_at=url.created_at, + updated_at=url.updated_at, + name=url.name + ) + results.append(url_info) + + return results + @staticmethod def url_to_url_with_html(url: URL) -> URLWithHTML: url_val = url.url diff --git a/collector_db/enums.py b/collector_db/enums.py index d6b3ec0f..2ea65aef 100644 --- a/collector_db/enums.py +++ b/collector_db/enums.py @@ -40,6 +40,7 @@ class TaskType(PyEnum): SUBMIT_APPROVED = "Submit Approved URLs" DUPLICATE_DETECTION = "Duplicate Detection" IDLE = "Idle" + PROBE_404 = "404 Probe" class PGEnum(TypeDecorator): impl = postgresql.ENUM diff --git a/collector_db/models.py b/collector_db/models.py index b2a86e9c..de4dedae 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -99,6 +99,7 @@ class URL(Base): 'rejected', 'duplicate', 'error', + '404 not found', name='url_status' ), nullable=False @@ -146,6 +147,11 @@ class URL(Base): uselist=False, back_populates="url" ) + probed_for_404 = relationship( + "URLProbedFor404", + uselist=False, + back_populates="url" + ) class URLCheckedForDuplicate(Base): __tablename__ = 'url_checked_for_duplicate' @@ -157,6 +163,16 @@ class URLCheckedForDuplicate(Base): # Relationships url = relationship("URL", uselist=False, back_populates="checked_for_duplicate") +class URLProbedFor404(Base): + __tablename__ = 'url_probed_for_404' + + id = Column(Integer, primary_key=True) + url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) + last_probed_at = get_created_at_column() + + # Relationships + url = relationship("URL", uselist=False, back_populates="probed_for_404") + class URLOptionalDataSourceMetadata(Base): __tablename__ = 'url_optional_data_source_metadata' diff --git a/collector_manager/enums.py b/collector_manager/enums.py index 5b89ffe2..3e852b24 100644 --- a/collector_manager/enums.py +++ b/collector_manager/enums.py @@ -17,3 +17,4 @@ class URLStatus(Enum): ERROR = "error" DUPLICATE = "duplicate" REJECTED = "rejected" + NOT_FOUND = "404 not found" diff --git a/core/DTOs/task_data_objects/URL404ProbeTDO.py b/core/DTOs/task_data_objects/URL404ProbeTDO.py new file mode 100644 index 00000000..f24cd7b3 --- /dev/null +++ b/core/DTOs/task_data_objects/URL404ProbeTDO.py @@ -0,0 +1,9 @@ +from typing import Optional + +from pydantic import BaseModel + + +class URL404ProbeTDO(BaseModel): + url_id: int + url: str + is_404: Optional[bool] = None \ No newline at end of file diff --git a/core/DTOs/task_data_objects/UrlHtmlTDO.py b/core/DTOs/task_data_objects/UrlHtmlTDO.py index 05e9caf2..ca5b8a50 100644 --- a/core/DTOs/task_data_objects/UrlHtmlTDO.py +++ b/core/DTOs/task_data_objects/UrlHtmlTDO.py @@ -1,13 +1,13 @@ -from dataclasses import dataclass from typing import Optional +from pydantic import BaseModel + from collector_db.DTOs.URLInfo import URLInfo from html_tag_collector.DataClassTags import ResponseHTMLInfo from html_tag_collector.URLRequestInterface import URLResponseInfo -@dataclass -class UrlHtmlTDO: +class UrlHtmlTDO(BaseModel): url_info: URLInfo url_response_info: Optional[URLResponseInfo] = None html_tag_info: Optional[ResponseHTMLInfo] = None diff --git a/core/TaskManager.py b/core/TaskManager.py index 1dcc9bb5..0c67e7a8 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -1,5 +1,6 @@ import logging +from core.classes.task_operators.URL404ProbeTaskOperator import URL404ProbeTaskOperator from core.classes.task_operators.URLDuplicateTaskOperator import URLDuplicateTaskOperator from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface from collector_db.AsyncDatabaseClient import AsyncDatabaseClient @@ -104,10 +105,18 @@ async def get_url_duplicate_task_operator(self): ) return operator + async def get_url_404_probe_task_operator(self): + operator = URL404ProbeTaskOperator( + adb_client=self.adb_client, + url_request_interface=self.url_request_interface + ) + return operator + async def get_task_operators(self) -> list[TaskOperatorBase]: return [ await self.get_url_html_task_operator(), await self.get_url_duplicate_task_operator(), + await self.get_url_404_probe_task_operator(), # await self.get_url_relevance_huggingface_task_operator(), await self.get_url_record_type_task_operator(), await self.get_agency_identification_task_operator(), diff --git a/core/classes/task_operators/URL404ProbeTaskOperator.py b/core/classes/task_operators/URL404ProbeTaskOperator.py new file mode 100644 index 00000000..bcfd7a1d --- /dev/null +++ b/core/classes/task_operators/URL404ProbeTaskOperator.py @@ -0,0 +1,63 @@ +from http import HTTPStatus + +from pydantic import BaseModel + +from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from collector_db.enums import TaskType +from core.DTOs.task_data_objects.URL404ProbeTDO import URL404ProbeTDO +from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase +from html_tag_collector.URLRequestInterface import URLRequestInterface + + +class URL404ProbeTDOSubsets(BaseModel): + successful: list[URL404ProbeTDO] + is_404: list[URL404ProbeTDO] + + + +class URL404ProbeTaskOperator(TaskOperatorBase): + + def __init__( + self, + url_request_interface: URLRequestInterface, + adb_client: AsyncDatabaseClient, + ): + super().__init__(adb_client) + self.url_request_interface = url_request_interface + + @property + def task_type(self): + return TaskType.DUPLICATE_DETECTION + + async def meets_task_prerequisites(self): + return await self.adb_client.has_pending_urls_not_recently_probed_for_404() + + async def probe_urls_for_404(self, tdos: list[URL404ProbeTDO]): + responses = await self.url_request_interface.make_simple_requests( + urls=[tdo.url for tdo in tdos] + ) + for tdo, response in zip(tdos, responses): + if response.status is None: + continue + tdo.is_404 = response.status == HTTPStatus.NOT_FOUND + + + async def inner_task_logic(self): + tdos = await self.get_pending_urls_not_recently_probed_for_404() + url_ids = [task_info.url_id for task_info in tdos] + await self.link_urls_to_task(url_ids=url_ids) + await self.probe_urls_for_404(tdos) + url_ids_404 = [tdo.url_id for tdo in tdos if tdo.is_404] + + await self.update_404s_in_database(url_ids_404) + await self.mark_as_recently_probed_for_404(url_ids) + + async def get_pending_urls_not_recently_probed_for_404(self) -> list[URL404ProbeTDO]: + return await self.adb_client.get_pending_urls_not_recently_probed_for_404() + + async def update_404s_in_database(self, url_ids_404: list[int]): + await self.adb_client.mark_all_as_404(url_ids_404) + + async def mark_as_recently_probed_for_404(self, url_ids: list[int]): + await self.adb_client.mark_all_as_recently_probed_for_404(url_ids) + diff --git a/core/classes/task_operators/URLHTMLTaskOperator.py b/core/classes/task_operators/URLHTMLTaskOperator.py index f6cfa28a..17f383c7 100644 --- a/core/classes/task_operators/URLHTMLTaskOperator.py +++ b/core/classes/task_operators/URLHTMLTaskOperator.py @@ -1,3 +1,5 @@ +from http import HTTPStatus + from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo from collector_db.DTOs.URLInfo import URLInfo @@ -34,7 +36,9 @@ async def inner_task_logic(self): await self.link_urls_to_task(url_ids=url_ids) await self.get_raw_html_data_for_urls(tdos) success_subset, error_subset = await self.separate_success_and_error_subsets(tdos) - await self.update_errors_in_database(error_subset) + non_404_error_subset, is_404_error_subset = await self.separate_error_and_404_subsets(error_subset) + await self.update_errors_in_database(non_404_error_subset) + await self.update_404s_in_database(is_404_error_subset) await self.process_html_data(success_subset) await self.update_html_data_in_database(success_subset) @@ -53,7 +57,7 @@ async def get_pending_urls_without_html_data(self): async def get_raw_html_data_for_urls(self, tdos: list[UrlHtmlTDO]): just_urls = await self.get_just_urls(tdos) - url_response_infos = await self.url_request_interface.make_requests(just_urls) + url_response_infos = await self.url_request_interface.make_requests_with_html(just_urls) for tdto, url_response_info in zip(tdos, url_response_infos): tdto.url_response_info = url_response_info @@ -73,6 +77,29 @@ async def separate_success_and_error_subsets( successful_tdos.append(tdto) return successful_tdos, errored_tdos + async def separate_error_and_404_subsets( + self, + tdos: list[UrlHtmlTDO] + ) -> tuple[ + list[UrlHtmlTDO], # Error + list[UrlHtmlTDO] # 404 + ]: + tdos_error = [] + tdos_404 = [] + for tdo in tdos: + if tdo.url_response_info.status is None: + tdos_error.append(tdo) + continue + if tdo.url_response_info.status == HTTPStatus.NOT_FOUND: + tdos_404.append(tdo) + else: + tdos_error.append(tdo) + return tdos_error, tdos_404 + + async def update_404s_in_database(self, tdos_404: list[UrlHtmlTDO]): + url_ids = [tdo.url_info.id for tdo in tdos_404] + await self.adb_client.mark_all_as_404(url_ids) + async def update_errors_in_database(self, error_tdos: list[UrlHtmlTDO]): error_infos = [] for error_tdo in error_tdos: diff --git a/html_tag_collector/URLRequestInterface.py b/html_tag_collector/URLRequestInterface.py index 20ea1989..fb0eeb9f 100644 --- a/html_tag_collector/URLRequestInterface.py +++ b/html_tag_collector/URLRequestInterface.py @@ -1,21 +1,24 @@ import asyncio +from http import HTTPStatus from typing import Optional -from aiohttp import ClientSession +from aiohttp import ClientSession, ClientResponseError from playwright.async_api import async_playwright from dataclasses import dataclass +from pydantic import BaseModel from tqdm.asyncio import tqdm MAX_CONCURRENCY = 5 -@dataclass -class URLResponseInfo: +class URLResponseInfo(BaseModel): success: bool + status: Optional[HTTPStatus] = None html: Optional[str] = None content_type: Optional[str] = None - exception: Optional[Exception] = None + exception: Optional[str] = None + @dataclass class RequestResources: @@ -23,10 +26,6 @@ class RequestResources: browser: async_playwright semaphore: asyncio.Semaphore = asyncio.Semaphore(MAX_CONCURRENCY) -def ensure_browsers_installed(): - # TODO: Slated for destruction - pass - HTML_CONTENT_TYPE = "text/html" class URLRequestInterface: @@ -39,13 +38,16 @@ async def get_response(self, session: ClientSession, url: str) -> URLResponseInf return URLResponseInfo( success=True, html=text, - content_type=response.headers.get("content-type") + content_type=response.headers.get("content-type"), + status=HTTPStatus(response.status) ) + except ClientResponseError as e: + return URLResponseInfo(success=False, status=HTTPStatus(e.status), exception=str(e)) except Exception as e: print(f"An error occurred while fetching {url}: {e}") - return URLResponseInfo(success=False, exception=e) + return URLResponseInfo(success=False, exception=str(e)) - async def fetch_and_render(self, rr: RequestResources, url: str) -> URLResponseInfo: + async def fetch_and_render(self, rr: RequestResources, url: str) -> Optional[URLResponseInfo]: simple_response = await self.get_response(rr.session, url) if not simple_response.success: return simple_response @@ -53,6 +55,9 @@ async def fetch_and_render(self, rr: RequestResources, url: str) -> URLResponseI if simple_response.content_type != HTML_CONTENT_TYPE: return simple_response + await self.get_dynamic_html_content(rr, url) + + async def get_dynamic_html_content(self, rr, url): # For HTML responses, attempt to load the page to check for dynamic html content async with rr.semaphore: page = await rr.browser.new_page() @@ -60,9 +65,14 @@ async def fetch_and_render(self, rr: RequestResources, url: str) -> URLResponseI await page.goto(url) await page.wait_for_load_state("networkidle") html_content = await page.content() - return URLResponseInfo(success=True, html=html_content, content_type=HTML_CONTENT_TYPE) + return URLResponseInfo( + success=True, + html=html_content, + content_type=HTML_CONTENT_TYPE, + status=HTTPStatus.OK + ) except Exception as e: - return URLResponseInfo(success=False, exception=e) + return URLResponseInfo(success=False, exception=str(e)) finally: await page.close() @@ -75,12 +85,17 @@ async def fetch_urls(self, urls: list[str]) -> list[URLResponseInfo]: results = await tqdm.gather(*tasks) return results - async def make_requests( + async def make_requests_with_html( self, urls: list[str], ) -> list[URLResponseInfo]: - ensure_browsers_installed() return await self.fetch_urls(urls) + async def make_simple_requests(self, urls: list[str]) -> list[URLResponseInfo]: + async with ClientSession() as session: + tasks = [self.get_response(session, url) for url in urls] + results = await tqdm.gather(*tasks) + return results + diff --git a/tests/manual/html_collector/test_html_tag_collector_integration.py b/tests/manual/html_collector/test_html_tag_collector_integration.py index 3ffef203..228f4b68 100644 --- a/tests/manual/html_collector/test_html_tag_collector_integration.py +++ b/tests/manual/html_collector/test_html_tag_collector_integration.py @@ -3,7 +3,7 @@ from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.DTOs.URLInfo import URLInfo from core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator -from helpers.DBDataCreator import DBDataCreator +from tests.helpers.DBDataCreator import DBDataCreator from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.RootURLCache import RootURLCache from html_tag_collector.URLRequestInterface import URLRequestInterface @@ -13,7 +13,8 @@ "https://pdapio.io", "https://pdap.dev", "https://pdap.io/404test", - "https://books.toscrape.com/catalogue/category/books/womens-fiction_9/index.html" + "https://books.toscrape.com/catalogue/category/books/womens-fiction_9/index.html", + ] sample_json_data = [ @@ -27,13 +28,24 @@ @pytest.mark.asyncio async def test_get_response(): uri = URLRequestInterface() - results = await uri.make_requests(URLS) + results = await uri.make_requests_with_html(URLS) print(results) @pytest.mark.asyncio async def test_get_response_with_javascript(): uri = URLRequestInterface() - results = await uri.make_requests(URLS) + results = await uri.make_requests_with_html(URLS) + print(results) + + +@pytest.mark.asyncio +async def test_get_response_with_javascript_404(): + uri = URLRequestInterface() + results = await uri.make_requests_with_html( + [ + 'https://data.tempe.gov/apps/tempegov::1-05-feeling-of-safety-in-your-neighborhood-dashboard' + ] + ) print(results) @pytest.mark.asyncio diff --git a/tests/test_automated/integration/tasks/test_url_404_probe.py b/tests/test_automated/integration/tasks/test_url_404_probe.py new file mode 100644 index 00000000..e248363a --- /dev/null +++ b/tests/test_automated/integration/tasks/test_url_404_probe.py @@ -0,0 +1,161 @@ +import types +from http import HTTPStatus + +import pendulum +import pytest +from aiohttp import ClientResponseError, RequestInfo + +from collector_db.models import URLProbedFor404, URL +from collector_manager.enums import URLStatus +from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome +from core.classes.task_operators.URL404ProbeTaskOperator import URL404ProbeTaskOperator +from html_tag_collector.URLRequestInterface import URLResponseInfo, URLRequestInterface +from tests.helpers.DBDataCreator import DBDataCreator +from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters + + +@pytest.mark.asyncio +async def test_url_404_probe_task(db_data_creator: DBDataCreator): + + mock_html_content = "" + mock_content_type = "text/html" + adb_client = db_data_creator.adb_client + + async def mock_make_simple_requests(self, urls: list[str]) -> list[URLResponseInfo]: + """ + Mock make_simple_requests so that + - the first url returns a 200 + - the second url returns a 404 + - the third url returns a general error + + """ + results = [] + for idx, url in enumerate(urls): + if idx == 1: + results.append( + URLResponseInfo( + success=False, + content_type=mock_content_type, + exception=str(ClientResponseError( + request_info=RequestInfo( + url=url, + method="GET", + real_url=url, + headers={}, + ), + code=HTTPStatus.NOT_FOUND.value, + history=(None,), + )), + status=HTTPStatus.NOT_FOUND + ) + ) + elif idx == 2: + results.append( + URLResponseInfo( + success=False, + exception=str(ValueError("test error")), + content_type=mock_content_type + ) + ) + else: + results.append(URLResponseInfo( + html=mock_html_content, success=True, content_type=mock_content_type)) + return results + + url_request_interface = URLRequestInterface() + url_request_interface.make_simple_requests = types.MethodType(mock_make_simple_requests, url_request_interface) + + operator = URL404ProbeTaskOperator( + url_request_interface=url_request_interface, + adb_client=adb_client + ) + # Check that initially prerequisites aren't met + meets_prereqs = await operator.meets_task_prerequisites() + assert not meets_prereqs + + # Add 4 URLs, 3 pending, 1 error + creation_info = await db_data_creator.batch_v2( + parameters=TestBatchCreationParameters( + urls=[ + TestURLCreationParameters( + count=3, + status=URLStatus.PENDING, + with_html_content=True + ), + TestURLCreationParameters( + count=1, + status=URLStatus.ERROR, + with_html_content=False + ), + ] + ) + ) + + meets_prereqs = await operator.meets_task_prerequisites() + assert meets_prereqs + + # Run task and validate results + run_info = await operator.run_task(task_id=1) + assert run_info.outcome == TaskOperatorOutcome.SUCCESS, run_info.message + + + pending_url_mappings = creation_info.url_creation_infos[URLStatus.PENDING].url_mappings + url_id_success = pending_url_mappings[0].url_id + url_id_404 = pending_url_mappings[1].url_id + url_id_error = pending_url_mappings[2].url_id + + url_id_initial_error = creation_info.url_creation_infos[URLStatus.ERROR].url_mappings[0].url_id + + # Check that URLProbedFor404 has been appropriately populated + probed_for_404_objects: list[URLProbedFor404] = await db_data_creator.adb_client.get_all(URLProbedFor404) + + assert len(probed_for_404_objects) == 3 + assert probed_for_404_objects[0].url_id == url_id_success + assert probed_for_404_objects[1].url_id == url_id_404 + assert probed_for_404_objects[2].url_id == url_id_error + + # Check that the URLs have been updated appropriated + urls: list[URL] = await adb_client.get_all(URL) + + def find_url(url_id: int) -> URL: + for url in urls: + if url.id == url_id: + return url + raise Exception(f"URL with id {url_id} not found") + + assert find_url(url_id_success).outcome == URLStatus.PENDING.value + assert find_url(url_id_404).outcome == URLStatus.NOT_FOUND.value + assert find_url(url_id_error).outcome == URLStatus.PENDING.value + assert find_url(url_id_initial_error).outcome == URLStatus.ERROR.value + + # Check that meets_task_prerequisites now returns False + meets_prereqs = await operator.meets_task_prerequisites() + assert not meets_prereqs + + # Check that meets_task_prerequisites returns True + # After setting the last probed for 404 date to 2 months ago + two_months_ago = pendulum.now().subtract(months=2).naive() + await adb_client.mark_all_as_recently_probed_for_404( + [url_id_404, url_id_error], + dt=two_months_ago + ) + + meets_prereqs = await operator.meets_task_prerequisites() + assert meets_prereqs + + # Run the task and Ensure all but the URL previously marked as 404 have been checked again + run_info = await operator.run_task(task_id=2) + assert run_info.outcome == TaskOperatorOutcome.SUCCESS, run_info.message + + probed_for_404_objects: list[URLProbedFor404] = await db_data_creator.adb_client.get_all(URLProbedFor404) + + assert len(probed_for_404_objects) == 3 + assert probed_for_404_objects[0].last_probed_at != two_months_ago + assert probed_for_404_objects[1].last_probed_at == two_months_ago + assert probed_for_404_objects[2].last_probed_at != two_months_ago + + + + + + diff --git a/tests/test_automated/integration/tasks/test_url_html_task.py b/tests/test_automated/integration/tasks/test_url_html_task.py index 4c33016b..aeb0db7f 100644 --- a/tests/test_automated/integration/tasks/test_url_html_task.py +++ b/tests/test_automated/integration/tasks/test_url_html_task.py @@ -1,10 +1,13 @@ import types +from http import HTTPStatus from typing import Optional import pytest +from aiohttp import ClientError, ClientResponseError, RequestInfo from collector_db.AsyncDatabaseClient import AsyncDatabaseClient from collector_db.enums import TaskType +from collector_manager.enums import URLStatus from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator from tests.helpers.DBDataCreator import DBDataCreator @@ -23,11 +26,31 @@ async def test_url_html_task(db_data_creator: DBDataCreator): async def mock_make_requests(self, urls: list[str]) -> list[URLResponseInfo]: results = [] for idx, url in enumerate(urls): + if idx == 1: + results.append( + URLResponseInfo( + success=False, + content_type=mock_content_type, + exception=str(ClientResponseError( + request_info=RequestInfo( + url=url, + method="GET", + real_url=url, + headers={}, + ), + code=HTTPStatus.NOT_FOUND.value, + history=(None,), + )), + status=HTTPStatus.NOT_FOUND + ) + ) + continue + if idx == 2: results.append( URLResponseInfo( success=False, - exception=ValueError("test error"), + exception=str(ValueError("test error")), content_type=mock_content_type )) else: @@ -49,7 +72,7 @@ async def mock_get_from_cache(self, url: str) -> Optional[str]: # Add mock methods or mock classes url_request_interface = URLRequestInterface() - url_request_interface.make_requests = types.MethodType(mock_make_requests, url_request_interface) + url_request_interface.make_requests_with_html = types.MethodType(mock_make_requests, url_request_interface) mock_root_url_cache = RootURLCache() mock_root_url_cache.get_from_cache = types.MethodType(mock_get_from_cache, mock_root_url_cache) @@ -94,11 +117,12 @@ async def mock_get_from_cache(self, url: str) -> Optional[str]: assert task_info.url_errors[0].error == "test error" adb = db_data_creator.adb_client - # Check that both success urls have two rows of HTML data + # Check that success url has two rows of HTML data await adb.link_urls_to_task(task_id=run_info.task_id, url_ids=run_info.linked_url_ids) hci = await adb.get_html_content_info(url_id=url_ids[0]) assert len(hci) == 2 - hci = await adb.get_html_content_info(url_id=url_ids[1]) - assert len(hci) == 2 + # Check that 404 url has status of 404 + url_info_404 = await adb.get_url_info_by_id(url_id=url_ids[1]) + assert url_info_404.outcome == URLStatus.NOT_FOUND # Check that errored url has error info diff --git a/util/alembic_helpers.py b/util/alembic_helpers.py index 84cdbfa7..822b4cd9 100644 --- a/util/alembic_helpers.py +++ b/util/alembic_helpers.py @@ -7,7 +7,7 @@ def switch_enum_type( enum_name, new_enum_values, drop_old_enum=True, - cast_dict: dict = None + check_constraints_to_drop: list[str] = None, ): """ Switches an ENUM type in a PostgreSQL column by: @@ -23,6 +23,12 @@ def switch_enum_type( :param drop_old_enum: Whether to drop the old ENUM type. """ + # 1. Drop check constraints that reference the enum + if check_constraints_to_drop is not None: + for constraint in check_constraints_to_drop: + op.execute(f'ALTER TABLE "{table_name}" DROP CONSTRAINT IF EXISTS "{constraint}"') + + # Rename old enum type old_enum_temp_name = f"{enum_name}_old" op.execute(f'ALTER TYPE "{enum_name}" RENAME TO "{old_enum_temp_name}"') From cd325248d343e0b71742c1940e55c14f1137dabb Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 15 May 2025 22:03:27 -0400 Subject: [PATCH 185/244] fix(app): fix task type for Probe Task Operator to `PROBE_404` --- core/classes/task_operators/URL404ProbeTaskOperator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/classes/task_operators/URL404ProbeTaskOperator.py b/core/classes/task_operators/URL404ProbeTaskOperator.py index bcfd7a1d..08f513f8 100644 --- a/core/classes/task_operators/URL404ProbeTaskOperator.py +++ b/core/classes/task_operators/URL404ProbeTaskOperator.py @@ -27,7 +27,7 @@ def __init__( @property def task_type(self): - return TaskType.DUPLICATE_DETECTION + return TaskType.PROBE_404 async def meets_task_prerequisites(self): return await self.adb_client.has_pending_urls_not_recently_probed_for_404() From 3e5f5ca171f6f0f8dbf00c1e06e1511f74697acd Mon Sep 17 00:00:00 2001 From: maxachis Date: Fri, 16 May 2025 11:06:23 -0400 Subject: [PATCH 186/244] DRAFT --- ...031-00cc949e0347_update_relevancy_logic.py | 160 ++++++++++++++++++ collector_db/AsyncDatabaseClient.py | 8 +- collector_db/models.py | 14 +- collector_manager/enums.py | 3 +- core/enums.py | 11 +- tests/helpers/DBDataCreator.py | 7 + .../helpers/test_batch_creation_parameters.py | 2 +- .../integration/api/test_metrics.py | 6 +- .../integration/api/test_review.py | 2 +- 9 files changed, 200 insertions(+), 13 deletions(-) create mode 100644 alembic/versions/2025_05_16_1031-00cc949e0347_update_relevancy_logic.py diff --git a/alembic/versions/2025_05_16_1031-00cc949e0347_update_relevancy_logic.py b/alembic/versions/2025_05_16_1031-00cc949e0347_update_relevancy_logic.py new file mode 100644 index 00000000..faac0ac6 --- /dev/null +++ b/alembic/versions/2025_05_16_1031-00cc949e0347_update_relevancy_logic.py @@ -0,0 +1,160 @@ +"""Update relevancy logic + +- Add new status to URL Status outcome: `individual record` +- Change URL Status value `rejected` to `not relevant` , for specificity +- Create `user_suggested_status` enum +- ` Add `suggested_status` column to `user_relevant_suggestions` +- Migrate `user_relevant_suggestions:relevant` to `user_relevant_suggestions:user_suggested_status` + +Revision ID: 00cc949e0347 +Revises: b5f079b6b8cb +Create Date: 2025-05-16 10:31:04.417203 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +from util.alembic_helpers import switch_enum_type + +# revision identifiers, used by Alembic. +revision: str = '00cc949e0347' +down_revision: Union[str, None] = 'b5f079b6b8cb' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +suggested_status_enum = sa.Enum( + 'relevant', + 'not relevant', + 'individual record', + 'broken page/404 not found', + name='user_suggested_status' +) + +def upgrade() -> None: + # Replace `relevant` column with `suggested_status` column + op.add_column( + 'user_relevant_suggestions', + sa.Column( + 'suggested_status', + suggested_status_enum, + nullable=True + ) + ) + # Migrate existing entries + op.execute(""" + UPDATE user_relevant_suggestions + SET suggested_status = 'relevant' + WHERE relevant = true + """) + op.execute(""" + UPDATE user_relevant_suggestions + SET suggested_status = 'not relevant' + WHERE relevant = false + """) + op.alter_column( + 'user_relevant_suggestions', + 'suggested_status', + nullable=False + ) + op.drop_column( + 'user_relevant_suggestions', + 'relevant' + ) + + # Update `url_status` enum to include + # `individual record` + # And change `rejected` to `not relevant` + op.execute(""" + ALTER TYPE url_status RENAME VALUE 'rejected' TO 'not relevant'; + """) + switch_enum_type( + table_name='urls', + column_name='outcome', + enum_name='url_status', + new_enum_values=[ + 'pending', + 'submitted', + 'validated', + 'duplicate', + 'not relevant', + 'error', + '404 not found', + 'individual record' + ], + check_constraints_to_drop=['url_name_not_null_when_validated'] + ) + op.execute( + """ + ALTER TABLE urls + ADD CONSTRAINT url_name_not_null_when_validated + CHECK ((name IS NOT NULL) OR (outcome <> 'validated'::url_status)) + """ + ) + + +def downgrade() -> None: + # Update `url_status` enum to remove + # `individual record` + # And change `not relevant` to `rejected` + op.execute(""" + ALTER TYPE url_status RENAME VALUE 'not relevant' TO 'rejected'; + """) + op.execute(""" + UPDATE urls + SET outcome = 'not relevant' + WHERE outcome = 'individual record' + """) + switch_enum_type( + table_name='urls', + column_name='outcome', + enum_name='url_status', + new_enum_values=[ + 'pending', + 'submitted', + 'validated', + 'duplicate', + 'not relevant', + 'error', + '404 not found', + ], + check_constraints_to_drop=['url_name_not_null_when_validated'] + ) + op.execute( + """ + ALTER TABLE urls + ADD CONSTRAINT url_name_not_null_when_validated + CHECK ((name IS NOT NULL) OR (outcome <> 'validated'::url_status)) + """ + ) + + # Replace `suggested_status` column with `relevant` column + op.add_column( + 'user_relevant_suggestions', + sa.Column( + 'relevant', + sa.BOOLEAN(), + nullable=True + ) + ) + op.execute(""" + UPDATE user_relevant_suggestions + SET relevant = true + WHERE suggested_status = 'relevant' + """) + op.execute(""" + UPDATE user_relevant_suggestions + SET relevant = false + WHERE suggested_status = 'not relevant' + """) + op.alter_column( + 'user_relevant_suggestions', + 'relevant', + nullable=False + ) + op.drop_column( + 'user_relevant_suggestions', + 'suggested_status' + ) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 2fad609d..4f7a4b17 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -1299,7 +1299,7 @@ async def reject_url( url = await session.execute(query) url = url.scalars().first() - url.outcome = URLStatus.REJECTED.value + url.outcome = URLStatus.NOT_RELEVANT.value # Add rejecting user rejecting_user_url = ReviewingUserURL( @@ -1872,7 +1872,7 @@ def url_column(status: URLStatus, label): url_column(URLStatus.ERROR, label="error_count"), url_column(URLStatus.VALIDATED, label="validated_count"), url_column(URLStatus.SUBMITTED, label="submitted_count"), - url_column(URLStatus.REJECTED, label="rejected_count"), + url_column(URLStatus.NOT_RELEVANT, label="rejected_count"), ).outerjoin( Batch, Batch.id == URL.batch_id @@ -1957,7 +1957,7 @@ def url_column(status: URLStatus, label): sc.count_distinct(URL.id, label="count_total"), url_column(URLStatus.PENDING, label="count_pending"), url_column(URLStatus.SUBMITTED, label="count_submitted"), - url_column(URLStatus.REJECTED, label="count_rejected"), + url_column(URLStatus.NOT_RELEVANT, label="count_rejected"), url_column(URLStatus.ERROR, label="count_error"), url_column(URLStatus.VALIDATED, label="count_validated"), ).group_by( @@ -2075,7 +2075,7 @@ def case_column(status: URLStatus, label): case_column(URLStatus.PENDING, label="count_pending"), case_column(URLStatus.SUBMITTED, label="count_submitted"), case_column(URLStatus.VALIDATED, label="count_validated"), - case_column(URLStatus.REJECTED, label="count_rejected"), + case_column(URLStatus.NOT_RELEVANT, label="count_rejected"), case_column(URLStatus.ERROR, label="count_error"), ) raw_results = await session.execute(count_query) diff --git a/collector_db/models.py b/collector_db/models.py index de4dedae..9134a0ad 100644 --- a/collector_db/models.py +++ b/collector_db/models.py @@ -96,10 +96,11 @@ class URL(Base): 'pending', 'submitted', 'validated', - 'rejected', + 'not relevant', 'duplicate', 'error', '404 not found', + 'individual record', name='url_status' ), nullable=False @@ -457,7 +458,16 @@ class UserRelevantSuggestion(Base): id = Column(Integer, primary_key=True, autoincrement=True) url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) user_id = Column(Integer, nullable=False) - relevant = Column(Boolean, nullable=False) + suggested_status = Column( + postgresql.ENUM( + 'relevant', + 'not relevant', + 'individual record', + 'broken page/404 not found', + name='suggested_status' + ), + nullable=True + ) created_at = get_created_at_column() updated_at = get_updated_at_column() diff --git a/collector_manager/enums.py b/collector_manager/enums.py index 3e852b24..1732bd19 100644 --- a/collector_manager/enums.py +++ b/collector_manager/enums.py @@ -16,5 +16,6 @@ class URLStatus(Enum): VALIDATED = "validated" ERROR = "error" DUPLICATE = "duplicate" - REJECTED = "rejected" + NOT_RELEVANT = "not relevant" NOT_FOUND = "404 not found" + INDIVIDUAL_RECORD = "individual record" diff --git a/core/enums.py b/core/enums.py index 019572b8..c6f90c80 100644 --- a/core/enums.py +++ b/core/enums.py @@ -70,4 +70,13 @@ class SubmitResponseStatus(Enum): """ SUCCESS = "success" FAILURE = "FAILURE" - ALREADY_EXISTS = "already_exists" \ No newline at end of file + ALREADY_EXISTS = "already_exists" + +class SuggestedStatus(Enum): + """ + Possible values for user_relevant_suggestions:suggested_status + """ + RELEVANT = "relevant" + NOT_RELEVANT = "not relevant" + INDIVIDUAL_RECORD = "individual record" + BROKEN_PAGE_404 = "broken page/404 not found" \ No newline at end of file diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 38d70cfe..b4826a60 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -221,6 +221,13 @@ async def user_relevant_suggestion( relevant=relevant ) + async def user_relevant_suggestion_v2( + self, + url_id: int, + user_id: Optional[int] = None, + + ) + async def user_record_type_suggestion( self, url_id: int, diff --git a/tests/helpers/test_batch_creation_parameters.py b/tests/helpers/test_batch_creation_parameters.py index cfb4805e..0c6b48ef 100644 --- a/tests/helpers/test_batch_creation_parameters.py +++ b/tests/helpers/test_batch_creation_parameters.py @@ -37,7 +37,7 @@ class TestURLCreationParameters(BaseModel): @model_validator(mode='after') def validate_annotation_info(self): - if self.status == URLStatus.REJECTED: + if self.status == URLStatus.NOT_RELEVANT: self.annotation_info.final_review_approved = False return self if self.status != URLStatus.VALIDATED: diff --git a/tests/test_automated/integration/api/test_metrics.py b/tests/test_automated/integration/api/test_metrics.py index b8eb6ca6..0ce88f72 100644 --- a/tests/test_automated/integration/api/test_metrics.py +++ b/tests/test_automated/integration/api/test_metrics.py @@ -26,7 +26,7 @@ async def test_get_batches_aggregated_metrics(api_test_helper): ), TestURLCreationParameters( count=3, - status=URLStatus.REJECTED + status=URLStatus.NOT_RELEVANT ), TestURLCreationParameters( count=4, @@ -106,7 +106,7 @@ async def test_get_batches_breakdown_metrics(api_test_helper): urls=[ TestURLCreationParameters( count=3, - status=URLStatus.REJECTED + status=URLStatus.NOT_RELEVANT ), TestURLCreationParameters( count=4, @@ -363,7 +363,7 @@ async def test_get_urls_aggregate_metrics(api_test_helper): ), TestURLCreationParameters( count=5, - status=URLStatus.REJECTED + status=URLStatus.NOT_RELEVANT ), ] ) diff --git a/tests/test_automated/integration/api/test_review.py b/tests/test_automated/integration/api/test_review.py index 1f427c61..17ee9fe1 100644 --- a/tests/test_automated/integration/api/test_review.py +++ b/tests/test_automated/integration/api/test_review.py @@ -158,4 +158,4 @@ async def test_reject_and_get_next_source_for_review(api_test_helper): assert len(urls) == 1 url = urls[0] assert url.id == url_mapping.url_id - assert url.outcome == URLStatus.REJECTED.value \ No newline at end of file + assert url.outcome == URLStatus.NOT_RELEVANT.value \ No newline at end of file From 7935ac2a8a4667f08bce5cda9fc1839c60dc516e Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 16 May 2025 14:57:45 -0400 Subject: [PATCH 187/244] feat(app): Overhaul rejection/relevancy annotation logic Update `/annotate/relevance/{url_id}` to accept `relevant`, `not relevant`, `broken page`, `single_record` entries Update `/annotate/all/{url_id}` to do the same Update `/review/reject-source` to allow specification of a `rejection_reason` including `not relevant`, `broken page`, and `single record` Update database such that URL have status `rejected` replaced with `not relevant` and add additional status `individual record` --- ...031-00cc949e0347_update_relevancy_logic.py | 8 ++- api/routes/annotate.py | 2 +- api/routes/review.py | 5 +- collector_db/AsyncDatabaseClient.py | 34 ++++++--- collector_db/DTOConverter.py | 2 +- core/AsyncCore.py | 12 ++-- core/DTOs/AllAnnotationPostInfo.py | 28 ++++---- core/DTOs/FinalReviewApprovalInfo.py | 9 +++ core/DTOs/GetNextURLForFinalReviewResponse.py | 6 +- core/DTOs/RelevanceAnnotationPostInfo.py | 4 +- tests/helpers/DBDataCreator.py | 21 +++--- .../helpers/test_batch_creation_parameters.py | 4 +- .../api/helpers/RequestValidator.py | 4 +- .../integration/api/test_annotate.py | 69 +++++++++++++++---- .../integration/api/test_metrics.py | 14 ++-- .../integration/api/test_review.py | 47 ++++++++++--- .../collector_db/test_db_client.py | 10 +-- .../unit/dto/test_all_annotation_post_info.py | 27 ++++---- 18 files changed, 204 insertions(+), 102 deletions(-) diff --git a/alembic/versions/2025_05_16_1031-00cc949e0347_update_relevancy_logic.py b/alembic/versions/2025_05_16_1031-00cc949e0347_update_relevancy_logic.py index faac0ac6..5ba1240f 100644 --- a/alembic/versions/2025_05_16_1031-00cc949e0347_update_relevancy_logic.py +++ b/alembic/versions/2025_05_16_1031-00cc949e0347_update_relevancy_logic.py @@ -30,10 +30,11 @@ 'not relevant', 'individual record', 'broken page/404 not found', - name='user_suggested_status' + name='suggested_status' ) def upgrade() -> None: + suggested_status_enum.create(op.get_bind()) # Replace `relevant` column with `suggested_status` column op.add_column( 'user_relevant_suggestions', @@ -104,7 +105,7 @@ def downgrade() -> None: """) op.execute(""" UPDATE urls - SET outcome = 'not relevant' + SET outcome = 'rejected' WHERE outcome = 'individual record' """) switch_enum_type( @@ -116,7 +117,7 @@ def downgrade() -> None: 'submitted', 'validated', 'duplicate', - 'not relevant', + 'rejected', 'error', '404 not found', ], @@ -158,3 +159,4 @@ def downgrade() -> None: 'user_relevant_suggestions', 'suggested_status' ) + suggested_status_enum.drop(op.get_bind(), checkfirst=True) diff --git a/api/routes/annotate.py b/api/routes/annotate.py index 95512a0b..7cb5fa65 100644 --- a/api/routes/annotate.py +++ b/api/routes/annotate.py @@ -55,7 +55,7 @@ async def annotate_url_for_relevance_and_get_next_url( await async_core.submit_url_relevance_annotation( user_id=access_info.user_id, url_id=url_id, - relevant=relevance_annotation_post_info.is_relevant + suggested_status=relevance_annotation_post_info.suggested_status ) return await async_core.get_next_url_for_relevance_annotation( user_id=access_info.user_id, diff --git a/api/routes/review.py b/api/routes/review.py index 62bf5de6..ac937701 100644 --- a/api/routes/review.py +++ b/api/routes/review.py @@ -4,7 +4,7 @@ from api.dependencies import get_async_core from core.AsyncCore import AsyncCore -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewBaseInfo +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewBaseInfo, FinalReviewRejectionInfo from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, \ GetNextURLForFinalReviewOuterResponse from security_manager.SecurityManager import AccessInfo, get_access_info, require_permission, Permissions @@ -50,7 +50,7 @@ async def approve_source( async def reject_source( core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(requires_final_review_permission), - review_info: FinalReviewBaseInfo = FinalReviewBaseInfo, + review_info: FinalReviewRejectionInfo = FinalReviewRejectionInfo, batch_id: Optional[int] = Query( description="The batch id of the next URL to get. " "If not specified, defaults to first qualifying URL", @@ -59,6 +59,7 @@ async def reject_source( await core.reject_url( url_id=review_info.url_id, access_info=access_info, + rejection_reason=review_info.rejection_reason ) next_source = await core.get_next_source_for_review(batch_id=batch_id) return GetNextURLForFinalReviewOuterResponse(next_source=next_source) \ No newline at end of file diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index 4f7a4b17..b47f9ae4 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -33,7 +33,7 @@ BacklogSnapshot, URLDataSource, URLCheckedForDuplicate, URLProbedFor404 from collector_manager.enums import URLStatus, CollectorType from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason from core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO, GetMetricsBacklogResponseInnerDTO from core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO, \ GetMetricsBatchesAggregatedInnerResponseDTO @@ -65,7 +65,7 @@ from core.DTOs.task_data_objects.URLDuplicateTDO import URLDuplicateTDO from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo from core.EnvVarManager import EnvVarManager -from core.enums import BatchStatus, SuggestionType, RecordType +from core.enums import BatchStatus, SuggestionType, RecordType, SuggestedStatus from html_tag_collector.DataClassTags import convert_to_response_html_info # Type Hints @@ -170,7 +170,7 @@ async def get_next_url_for_user_annotation( select(UserRelevantSuggestion) .where( UserRelevantSuggestion.url_id == URL.id, - UserRelevantSuggestion.relevant == False + UserRelevantSuggestion.suggested_status != SuggestedStatus.RELEVANT.value ) ) ) @@ -194,7 +194,7 @@ async def add_user_relevant_suggestion( session: AsyncSession, url_id: int, user_id: int, - relevant: bool + suggested_status: SuggestedStatus ): prior_suggestion = await self.get_user_suggestion( session, @@ -203,13 +203,13 @@ async def add_user_relevant_suggestion( url_id=url_id ) if prior_suggestion is not None: - prior_suggestion.relevant = relevant + prior_suggestion.suggested_status = suggested_status.value return suggestion = UserRelevantSuggestion( url_id=url_id, user_id=user_id, - relevant=relevant + suggested_status=suggested_status.value ) session.add(suggestion) @@ -881,7 +881,7 @@ async def get_next_url_agency_for_annotation( where( (UserRelevantSuggestion.user_id == user_id) & (UserRelevantSuggestion.url_id == URL.id) & - (UserRelevantSuggestion.relevant == False) + (UserRelevantSuggestion.suggested_status != SuggestedStatus.RELEVANT.value) ).correlate(URL) ) ) @@ -1288,7 +1288,8 @@ async def reject_url( self, session: AsyncSession, url_id: int, - user_id: int + user_id: int, + rejection_reason: RejectionReason ) -> None: query = ( @@ -1299,7 +1300,18 @@ async def reject_url( url = await session.execute(query) url = url.scalars().first() - url.outcome = URLStatus.NOT_RELEVANT.value + match rejection_reason: + case RejectionReason.INDIVIDUAL_RECORD: + url.outcome = URLStatus.INDIVIDUAL_RECORD.value + case RejectionReason.BROKEN_PAGE_404: + url.outcome = URLStatus.NOT_FOUND.value + case RejectionReason.NOT_RELEVANT: + url.outcome = URLStatus.NOT_RELEVANT.value + case _: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="Invalid rejection reason" + ) # Add rejecting user rejecting_user_url = ReviewingUserURL( @@ -1741,12 +1753,12 @@ async def add_all_annotations_to_url( relevant_suggestion = UserRelevantSuggestion( url_id=url_id, user_id=user_id, - relevant=post_info.is_relevant + suggested_status=post_info.suggested_status.value ) session.add(relevant_suggestion) # If not relevant, do nothing else - if not post_info.is_relevant: + if not post_info.suggested_status == SuggestedStatus.RELEVANT: return record_type_suggestion = UserRecordTypeSuggestion( diff --git a/collector_db/DTOConverter.py b/collector_db/DTOConverter.py index 307e8f85..d06ac6de 100644 --- a/collector_db/DTOConverter.py +++ b/collector_db/DTOConverter.py @@ -26,7 +26,7 @@ def final_review_annotation_relevant_info( ) -> FinalReviewAnnotationRelevantInfo: auto_value = auto_suggestion.relevant if auto_suggestion else None - user_value = user_suggestion.relevant if user_suggestion else None + user_value = user_suggestion.suggested_status if user_suggestion else None return FinalReviewAnnotationRelevantInfo( auto=auto_value, user=user_value diff --git a/core/AsyncCore.py b/core/AsyncCore.py index e7b7f534..651cd3ba 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -11,7 +11,7 @@ from collector_manager.enums import CollectorType from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo from core.DTOs.CollectorStartInfo import CollectorStartInfo -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse @@ -35,7 +35,7 @@ from core.DTOs.SearchURLResponse import SearchURLResponse from core.TaskManager import TaskManager from core.classes.ErrorManager import ErrorManager -from core.enums import BatchStatus, RecordType, AnnotationType +from core.enums import BatchStatus, RecordType, AnnotationType, SuggestedStatus from security_manager.SecurityManager import AccessInfo @@ -155,13 +155,13 @@ async def submit_url_relevance_annotation( self, user_id: int, url_id: int, - relevant: bool + suggested_status: SuggestedStatus ): try: return await self.adb_client.add_user_relevant_suggestion( user_id=user_id, url_id=url_id, - relevant=relevant + suggested_status=suggested_status ) except IntegrityError as e: return await ErrorManager.raise_annotation_exists_error( @@ -287,10 +287,12 @@ async def reject_url( self, url_id: int, access_info: AccessInfo, + rejection_reason: RejectionReason ): await self.adb_client.reject_url( url_id=url_id, - user_id=access_info.user_id + user_id=access_info.user_id, + rejection_reason=rejection_reason ) async def upload_manual_batch( diff --git a/core/DTOs/AllAnnotationPostInfo.py b/core/DTOs/AllAnnotationPostInfo.py index a462b40b..2a81be78 100644 --- a/core/DTOs/AllAnnotationPostInfo.py +++ b/core/DTOs/AllAnnotationPostInfo.py @@ -5,31 +5,31 @@ from pydantic import BaseModel, model_validator from core.DTOs.GetNextURLForAgencyAnnotationResponse import URLAgencyAnnotationPostInfo -from core.enums import RecordType +from core.enums import RecordType, SuggestedStatus from core.exceptions import FailedValidationException class AllAnnotationPostInfo(BaseModel): - is_relevant: bool + suggested_status: SuggestedStatus record_type: Optional[RecordType] = None agency: Optional[URLAgencyAnnotationPostInfo] = None - @model_validator(mode="before") - def allow_record_type_and_agency_only_if_relevant(cls, values): - is_relevant = values.get("is_relevant") - record_type = values.get("record_type") - agency = values.get("agency") + @model_validator(mode="after") + def allow_record_type_and_agency_only_if_relevant(self): + suggested_status = self.suggested_status + record_type = self.record_type + agency = self.agency - if not is_relevant: + if suggested_status != SuggestedStatus.RELEVANT: if record_type is not None: - raise FailedValidationException("record_type must be None if is_relevant is False") + raise FailedValidationException("record_type must be None if suggested_status is not relevant") if agency is not None: - raise FailedValidationException("agency must be None if is_relevant is False") - return values + raise FailedValidationException("agency must be None if suggested_status is not relevant") + return self # Similarly, if relevant, record_type and agency must be provided if record_type is None: - raise FailedValidationException("record_type must be provided if is_relevant is True") + raise FailedValidationException("record_type must be provided if suggested_status is relevant") if agency is None: - raise FailedValidationException("agency must be provided if is_relevant is True") - return values \ No newline at end of file + raise FailedValidationException("agency must be provided if suggested_status is relevant") + return self \ No newline at end of file diff --git a/core/DTOs/FinalReviewApprovalInfo.py b/core/DTOs/FinalReviewApprovalInfo.py index d87fb628..5e4a19d6 100644 --- a/core/DTOs/FinalReviewApprovalInfo.py +++ b/core/DTOs/FinalReviewApprovalInfo.py @@ -1,3 +1,4 @@ +from enum import Enum from typing import Optional from pydantic import BaseModel, Field @@ -9,6 +10,14 @@ class FinalReviewBaseInfo(BaseModel): title="The id of the URL." ) +class RejectionReason(Enum): + NOT_RELEVANT = "NOT_RELEVANT" + BROKEN_PAGE_404 = "BROKEN_PAGE" + INDIVIDUAL_RECORD = "INDIVIDUAL_RECORD" + +class FinalReviewRejectionInfo(FinalReviewBaseInfo): + rejection_reason: RejectionReason = RejectionReason.NOT_RELEVANT + class FinalReviewApprovalInfo(FinalReviewBaseInfo): record_type: Optional[RecordType] = Field( title="The final record type of the URL." diff --git a/core/DTOs/GetNextURLForFinalReviewResponse.py b/core/DTOs/GetNextURLForFinalReviewResponse.py index c9e838b6..f7e84d1f 100644 --- a/core/DTOs/GetNextURLForFinalReviewResponse.py +++ b/core/DTOs/GetNextURLForFinalReviewResponse.py @@ -3,13 +3,13 @@ from pydantic import BaseModel, Field from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo -from core.enums import RecordType +from core.enums import RecordType, SuggestedStatus from html_tag_collector.DataClassTags import ResponseHTMLInfo class FinalReviewAnnotationRelevantInfo(BaseModel): auto: Optional[bool] = Field(title="Whether the auto-labeler has marked the URL as relevant") - user: Optional[bool] = Field( - title="Whether a user has marked the URL as relevant", + user: Optional[SuggestedStatus] = Field( + title="The status marked by a user, if any", ) class FinalReviewAnnotationRecordTypeInfo(BaseModel): diff --git a/core/DTOs/RelevanceAnnotationPostInfo.py b/core/DTOs/RelevanceAnnotationPostInfo.py index 1aec0d51..29d0e764 100644 --- a/core/DTOs/RelevanceAnnotationPostInfo.py +++ b/core/DTOs/RelevanceAnnotationPostInfo.py @@ -1,5 +1,7 @@ from pydantic import BaseModel +from core.enums import SuggestedStatus + class RelevanceAnnotationPostInfo(BaseModel): - is_relevant: bool \ No newline at end of file + suggested_status: SuggestedStatus \ No newline at end of file diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index b4826a60..85716c7d 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -20,7 +20,7 @@ from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmittedURLInfo from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO -from core.enums import BatchStatus, SuggestionType, RecordType +from core.enums import BatchStatus, SuggestionType, RecordType, SuggestedStatus from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, AnnotationInfo from tests.helpers.simple_test_data_functions import generate_test_urls @@ -175,7 +175,7 @@ async def auto_relevant_suggestions(self, url_id: int, relevant: bool = True): async def annotate(self, url_id: int, annotation_info: AnnotationInfo): info = annotation_info if info.user_relevant is not None: - await self.user_relevant_suggestion(url_id=url_id, relevant=info.user_relevant) + await self.user_relevant_suggestion_v2(url_id=url_id, suggested_status=info.user_relevant) if info.auto_relevant is not None: await self.auto_relevant_suggestions(url_id=url_id, relevant=info.auto_relevant) if info.user_record_type is not None: @@ -213,20 +213,25 @@ async def user_relevant_suggestion( user_id: Optional[int] = None, relevant: bool = True ): - if user_id is None: - user_id = randint(1, 99999999) - await self.adb_client.add_user_relevant_suggestion( + await self.user_relevant_suggestion_v2( url_id=url_id, user_id=user_id, - relevant=relevant + suggested_status=SuggestedStatus.RELEVANT if relevant else SuggestedStatus.NOT_RELEVANT ) async def user_relevant_suggestion_v2( self, url_id: int, user_id: Optional[int] = None, - - ) + suggested_status: SuggestedStatus = SuggestedStatus.RELEVANT + ): + if user_id is None: + user_id = randint(1, 99999999) + await self.adb_client.add_user_relevant_suggestion( + url_id=url_id, + user_id=user_id, + suggested_status=suggested_status + ) async def user_record_type_suggestion( self, diff --git a/tests/helpers/test_batch_creation_parameters.py b/tests/helpers/test_batch_creation_parameters.py index 0c6b48ef..5d679569 100644 --- a/tests/helpers/test_batch_creation_parameters.py +++ b/tests/helpers/test_batch_creation_parameters.py @@ -4,11 +4,11 @@ from pydantic import BaseModel, model_validator from collector_manager.enums import URLStatus, CollectorType -from core.enums import BatchStatus, AnnotationType, RecordType +from core.enums import BatchStatus, AnnotationType, RecordType, SuggestedStatus class AnnotationInfo(BaseModel): - user_relevant: Optional[bool] = None + user_relevant: Optional[SuggestedStatus] = None auto_relevant: Optional[bool] = None user_record_type: Optional[RecordType] = None auto_record_type: Optional[RecordType] = None diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/test_automated/integration/api/helpers/RequestValidator.py index 9207305a..3717da50 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/test_automated/integration/api/helpers/RequestValidator.py @@ -12,7 +12,7 @@ from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.enums import CollectorType from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewBaseInfo +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewBaseInfo, FinalReviewRejectionInfo from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse @@ -350,7 +350,7 @@ async def approve_and_get_next_source_for_review( async def reject_and_get_next_source_for_review( self, - review_info: FinalReviewBaseInfo + review_info: FinalReviewRejectionInfo ) -> GetNextURLForFinalReviewOuterResponse: data = self.post( url=f"/review/reject-source", diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/test_automated/integration/api/test_annotate.py index 03088cd7..90181951 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/test_automated/integration/api/test_annotate.py @@ -13,7 +13,7 @@ from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo from core.classes.ErrorManager import ErrorTypes -from core.enums import RecordType, SuggestionType +from core.enums import RecordType, SuggestionType, SuggestedStatus from core.exceptions import FailedValidationException from tests.helpers.complex_test_data_functions import AnnotateAgencySetupInfo, setup_for_annotate_agency, \ setup_for_get_next_url_for_final_review @@ -81,7 +81,7 @@ async def test_annotate_relevancy(api_test_helper): request_info_2: GetNextRelevanceAnnotationResponseOuterInfo = api_test_helper.request_validator.post_relevance_annotation_and_get_next( url_id=inner_info_1.url_info.url_id, relevance_annotation_post_info=RelevanceAnnotationPostInfo( - is_relevant=False + suggested_status=SuggestedStatus.NOT_RELEVANT ) ) @@ -96,7 +96,7 @@ async def test_annotate_relevancy(api_test_helper): request_info_3: GetNextRelevanceAnnotationResponseOuterInfo = api_test_helper.request_validator.post_relevance_annotation_and_get_next( url_id=inner_info_2.url_info.url_id, relevance_annotation_post_info=RelevanceAnnotationPostInfo( - is_relevant=True + suggested_status=SuggestedStatus.RELEVANT ) ) @@ -109,16 +109,16 @@ async def test_annotate_relevancy(api_test_helper): result_2 = results[1] assert result_1.url_id == inner_info_1.url_info.url_id - assert result_1.relevant is False + assert result_1.suggested_status == SuggestedStatus.NOT_RELEVANT.value assert result_2.url_id == inner_info_2.url_info.url_id - assert result_2.relevant is True + assert result_2.suggested_status == SuggestedStatus.RELEVANT.value # If user submits annotation for same URL, the URL should be overwritten request_info_4: GetNextRelevanceAnnotationResponseOuterInfo = api_test_helper.request_validator.post_relevance_annotation_and_get_next( url_id=inner_info_1.url_info.url_id, relevance_annotation_post_info=RelevanceAnnotationPostInfo( - is_relevant=True + suggested_status=SuggestedStatus.RELEVANT ) ) @@ -129,8 +129,47 @@ async def test_annotate_relevancy(api_test_helper): for result in results: if result.url_id == inner_info_1.url_info.url_id: - assert results[0].relevant is True + assert results[0].suggested_status == SuggestedStatus.RELEVANT.value +async def post_and_validate_relevancy_annotation(ath, url_id, annotation: SuggestedStatus): + response = ath.request_validator.post_relevance_annotation_and_get_next( + url_id=url_id, + relevance_annotation_post_info=RelevanceAnnotationPostInfo( + suggested_status=annotation + ) + ) + + assert response.next_annotation is None + + results: list[UserRelevantSuggestion] = await ath.adb_client().get_all(UserRelevantSuggestion) + assert len(results) == 1 + assert results[0].suggested_status == annotation.value + +@pytest.mark.asyncio +async def test_annotate_relevancy_broken_page(api_test_helper): + ath = api_test_helper + + creation_info = await ath.db_data_creator.batch_and_urls(url_count=1, with_html_content=False) + + await post_and_validate_relevancy_annotation( + ath, + url_id=creation_info.url_ids[0], + annotation=SuggestedStatus.BROKEN_PAGE_404 + ) + +@pytest.mark.asyncio +async def test_annotate_relevancy_individual_record(api_test_helper): + ath = api_test_helper + + creation_info: BatchURLCreationInfo = await ath.db_data_creator.batch_and_urls( + url_count=1 + ) + + await post_and_validate_relevancy_annotation( + ath, + url_id=creation_info.url_ids[0], + annotation=SuggestedStatus.INDIVIDUAL_RECORD + ) @pytest.mark.asyncio async def test_annotate_relevancy_already_annotated_by_different_user( @@ -153,7 +192,7 @@ async def test_annotate_relevancy_already_annotated_by_different_user( response = await ath.request_validator.post_relevance_annotation_and_get_next( url_id=creation_info.url_ids[0], relevance_annotation_post_info=RelevanceAnnotationPostInfo( - is_relevant=False + suggested_status=SuggestedStatus.NOT_RELEVANT ) ) except HTTPException as e: @@ -613,7 +652,7 @@ async def test_annotate_all(api_test_helper): post_response_1 = await ath.request_validator.post_all_annotations_and_get_next( url_id=url_mapping_1.url_id, all_annotations_post_info=AllAnnotationPostInfo( - is_relevant=True, + suggested_status=SuggestedStatus.RELEVANT, record_type=RecordType.ACCIDENT_REPORTS, agency=URLAgencyAnnotationPostInfo( is_new=False, @@ -630,7 +669,7 @@ async def test_annotate_all(api_test_helper): post_response_2 = await ath.request_validator.post_all_annotations_and_get_next( url_id=url_mapping_2.url_id, all_annotations_post_info=AllAnnotationPostInfo( - is_relevant=False, + suggested_status=SuggestedStatus.NOT_RELEVANT, ) ) assert post_response_2.next_annotation is None @@ -642,10 +681,10 @@ async def test_annotate_all(api_test_helper): # Check that all annotations are present in the database # Should be two relevance annotations, one True and one False - all_relevance_suggestions = await adb_client.get_all(UserRelevantSuggestion) + all_relevance_suggestions: list[UserRelevantSuggestion] = await adb_client.get_all(UserRelevantSuggestion) assert len(all_relevance_suggestions) == 2 - assert all_relevance_suggestions[0].relevant == True - assert all_relevance_suggestions[1].relevant == False + assert all_relevance_suggestions[0].suggested_status == SuggestedStatus.RELEVANT.value + assert all_relevance_suggestions[1].suggested_status == SuggestedStatus.NOT_RELEVANT.value # Should be one agency all_agency_suggestions = await adb_client.get_all(UserUrlAgencySuggestion) @@ -682,7 +721,7 @@ async def test_annotate_all_post_batch_filtering(api_test_helper): url_id=url_mapping_1.url_id, batch_id=setup_info_3.batch_id, all_annotations_post_info=AllAnnotationPostInfo( - is_relevant=True, + suggested_status=SuggestedStatus.RELEVANT, record_type=RecordType.ACCIDENT_REPORTS, agency=URLAgencyAnnotationPostInfo( is_new=True @@ -708,7 +747,7 @@ async def test_annotate_all_validation_error(api_test_helper): response = await ath.request_validator.post_all_annotations_and_get_next( url_id=url_mapping_1.url_id, all_annotations_post_info=AllAnnotationPostInfo( - is_relevant=False, + suggested_status=SuggestedStatus.NOT_RELEVANT, record_type=RecordType.ACCIDENT_REPORTS ) ) diff --git a/tests/test_automated/integration/api/test_metrics.py b/tests/test_automated/integration/api/test_metrics.py index 0ce88f72..7d0fadfc 100644 --- a/tests/test_automated/integration/api/test_metrics.py +++ b/tests/test_automated/integration/api/test_metrics.py @@ -2,7 +2,7 @@ import pytest from collector_manager.enums import URLStatus, CollectorType -from core.enums import BatchStatus, RecordType +from core.enums import BatchStatus, RecordType, SuggestedStatus from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters, \ AnnotationInfo @@ -247,7 +247,7 @@ async def test_get_urls_breakdown_pending_metrics(api_test_helper): count=1, status=URLStatus.PENDING, annotation_info=AnnotationInfo( - user_relevant=False + user_relevant=SuggestedStatus.NOT_RELEVANT ) ), TestURLCreationParameters( @@ -264,7 +264,7 @@ async def test_get_urls_breakdown_pending_metrics(api_test_helper): count=3, status=URLStatus.PENDING, annotation_info=AnnotationInfo( - user_relevant=True, + user_relevant=SuggestedStatus.RELEVANT, user_record_type=RecordType.CALLS_FOR_SERVICE ) ) @@ -288,7 +288,7 @@ async def test_get_urls_breakdown_pending_metrics(api_test_helper): count=5, status=URLStatus.PENDING, annotation_info=AnnotationInfo( - user_relevant=True, + user_relevant=SuggestedStatus.RELEVANT, user_record_type=RecordType.INCARCERATION_RECORDS, user_agency=agency_id ) @@ -401,7 +401,7 @@ async def test_get_backlog_metrics(api_test_helper): count=1, status=URLStatus.PENDING, annotation_info=AnnotationInfo( - user_relevant=False + user_relevant=SuggestedStatus.NOT_RELEVANT ) ), TestURLCreationParameters( @@ -427,7 +427,7 @@ async def test_get_backlog_metrics(api_test_helper): count=4, status=URLStatus.PENDING, annotation_info=AnnotationInfo( - user_relevant=False + user_relevant=SuggestedStatus.NOT_RELEVANT ) ), TestURLCreationParameters( @@ -453,7 +453,7 @@ async def test_get_backlog_metrics(api_test_helper): count=7, status=URLStatus.PENDING, annotation_info=AnnotationInfo( - user_relevant=False + user_relevant=SuggestedStatus.NOT_RELEVANT ) ), TestURLCreationParameters( diff --git a/tests/test_automated/integration/api/test_review.py b/tests/test_automated/integration/api/test_review.py index 17ee9fe1..31f93a56 100644 --- a/tests/test_automated/integration/api/test_review.py +++ b/tests/test_automated/integration/api/test_review.py @@ -3,9 +3,10 @@ from collector_db.constants import PLACEHOLDER_AGENCY_NAME from collector_db.models import URL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency from collector_manager.enums import URLStatus -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewBaseInfo +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewBaseInfo, RejectionReason, \ + FinalReviewRejectionInfo from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse -from core.enums import RecordType +from core.enums import RecordType, SuggestedStatus from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review @@ -46,7 +47,7 @@ async def test_review_next_source(api_test_helper): annotation_info = result.annotations relevant_info = annotation_info.relevant assert relevant_info.auto == True - assert relevant_info.user == False + assert relevant_info.user == SuggestedStatus.NOT_RELEVANT record_type_info = annotation_info.record_type assert record_type_info.auto == RecordType.ARREST_RECORDS @@ -132,8 +133,12 @@ async def test_approve_and_get_next_source_for_review(api_test_helper): if agency.agency_id == additional_agency: assert agency.name == PLACEHOLDER_AGENCY_NAME -@pytest.mark.asyncio -async def test_reject_and_get_next_source_for_review(api_test_helper): + +async def test_rejection( + api_test_helper, + rejection_reason: RejectionReason, + url_status: URLStatus +): ath = api_test_helper db_data_creator = ath.db_data_creator @@ -145,8 +150,9 @@ async def test_reject_and_get_next_source_for_review(api_test_helper): url_mapping = setup_info.url_mapping result: GetNextURLForFinalReviewOuterResponse = await ath.request_validator.reject_and_get_next_source_for_review( - review_info=FinalReviewBaseInfo( + review_info=FinalReviewRejectionInfo( url_id=url_mapping.url_id, + rejection_reason=rejection_reason ) ) @@ -154,8 +160,33 @@ async def test_reject_and_get_next_source_for_review(api_test_helper): adb_client = db_data_creator.adb_client # Confirm same agency id is listed as rejected - urls = await adb_client.get_all(URL) + urls: list[URL] = await adb_client.get_all(URL) assert len(urls) == 1 url = urls[0] assert url.id == url_mapping.url_id - assert url.outcome == URLStatus.NOT_RELEVANT.value \ No newline at end of file + assert url.outcome == url_status.value + +@pytest.mark.asyncio +async def test_rejection_not_relevant(api_test_helper): + await test_rejection( + api_test_helper, + rejection_reason=RejectionReason.NOT_RELEVANT, + url_status=URLStatus.NOT_RELEVANT + ) + +@pytest.mark.asyncio +async def test_rejection_broken_page(api_test_helper): + await test_rejection( + api_test_helper, + rejection_reason=RejectionReason.BROKEN_PAGE_404, + url_status=URLStatus.NOT_FOUND + ) + +@pytest.mark.asyncio +async def test_rejection_individual_record(api_test_helper): + await test_rejection( + api_test_helper, + rejection_reason=RejectionReason.INDIVIDUAL_RECORD, + url_status=URLStatus.INDIVIDUAL_RECORD + ) + diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index 93edb3ed..e5454343 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -13,7 +13,7 @@ from collector_db.models import URL, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo -from core.enums import BatchStatus, RecordType, SuggestionType +from core.enums import BatchStatus, RecordType, SuggestionType, SuggestedStatus from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation, setup_for_annotate_agency from tests.helpers.DBDataCreator import DBDataCreator from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review @@ -186,7 +186,7 @@ async def test_get_next_url_for_final_review_basic(db_data_creator: DBDataCreato annotation_info = result.annotations relevant_info = annotation_info.relevant assert relevant_info.auto == True - assert relevant_info.user == False + assert relevant_info.user == SuggestedStatus.NOT_RELEVANT record_type_info = annotation_info.record_type assert record_type_info.auto == RecordType.ARREST_RECORDS @@ -465,7 +465,7 @@ async def test_get_next_url_for_user_relevance_annotation_pending( await adb_client.add_user_relevant_suggestion( url_id=url_1.url_info.url_id, user_id=1, - relevant=True + suggested_status=SuggestedStatus.RELEVANT ) url_3 = await adb_client.get_next_url_for_relevance_annotation( @@ -617,12 +617,12 @@ async def test_annotate_url_marked_not_relevant(db_data_creator: DBDataCreator): await adb_client.add_user_relevant_suggestion( user_id=1, url_id=url_to_mark_not_relevant.url_id, - relevant=False + suggested_status=SuggestedStatus.NOT_RELEVANT ) await adb_client.add_user_relevant_suggestion( user_id=1, url_id=url_to_mark_relevant.url_id, - relevant=True + suggested_status=SuggestedStatus.RELEVANT ) # User should not receive the URL for record type annotation diff --git a/tests/test_automated/unit/dto/test_all_annotation_post_info.py b/tests/test_automated/unit/dto/test_all_annotation_post_info.py index 3e5cbab4..1b35234a 100644 --- a/tests/test_automated/unit/dto/test_all_annotation_post_info.py +++ b/tests/test_automated/unit/dto/test_all_annotation_post_info.py @@ -1,8 +1,7 @@ import pytest -from pydantic import ValidationError from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo -from core.enums import RecordType +from core.enums import RecordType, SuggestedStatus from core.exceptions import FailedValidationException # Mock values to pass @@ -10,21 +9,21 @@ mock_agency = {"is_new": False, "suggested_agency": 1} # replace with a valid dict for the URLAgencyAnnotationPostInfo model @pytest.mark.parametrize( - "is_relevant, record_type, agency, should_raise", + "suggested_status, record_type, agency, should_raise", [ - (True, mock_record_type, mock_agency, False), # valid - (True, None, mock_agency, True), # missing record_type - (True, mock_record_type, None, True), # missing agency - (True, None, None, True), # missing both - (False, None, None, False), # valid - (False, mock_record_type, None, True), # record_type present - (False, None, mock_agency, True), # agency present - (False, mock_record_type, mock_agency, True), # both present + (SuggestedStatus.RELEVANT, mock_record_type, mock_agency, False), # valid + (SuggestedStatus.RELEVANT, None, mock_agency, True), # missing record_type + (SuggestedStatus.RELEVANT, mock_record_type, None, True), # missing agency + (SuggestedStatus.RELEVANT, None, None, True), # missing both + (SuggestedStatus.NOT_RELEVANT, None, None, False), # valid + (SuggestedStatus.NOT_RELEVANT, mock_record_type, None, True), # record_type present + (SuggestedStatus.NOT_RELEVANT, None, mock_agency, True), # agency present + (SuggestedStatus.NOT_RELEVANT, mock_record_type, mock_agency, True), # both present ] ) -def test_all_annotation_post_info_validation(is_relevant, record_type, agency, should_raise): +def test_all_annotation_post_info_validation(suggested_status, record_type, agency, should_raise): data = { - "is_relevant": is_relevant, + "suggested_status": suggested_status.value, "record_type": record_type, "agency": agency } @@ -34,4 +33,4 @@ def test_all_annotation_post_info_validation(is_relevant, record_type, agency, s AllAnnotationPostInfo(**data) else: model = AllAnnotationPostInfo(**data) - assert model.is_relevant == is_relevant + assert model.suggested_status == suggested_status From 6334f5ac0f5ab71d913607af503e48daaf2da17c Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 16 May 2025 15:07:58 -0400 Subject: [PATCH 188/244] fix(tests): fix breaking tests --- tests/helpers/DBDataCreator.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 85716c7d..2ccf47fa 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -16,7 +16,7 @@ from collector_db.DatabaseClient import DatabaseClient from collector_db.enums import TaskType from collector_manager.enums import CollectorType, URLStatus -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo +from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmittedURLInfo from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO @@ -203,7 +203,8 @@ async def annotate(self, url_id: int, annotation_info: AnnotationInfo): else: await self.adb_client.reject_url( url_id=url_id, - user_id=1 + user_id=1, + rejection_reason=RejectionReason.NOT_RELEVANT ) From b72a810dfdb5875640547652fad9807a396d0f7a Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 16 May 2025 15:14:03 -0400 Subject: [PATCH 189/244] fix(tests): fix breaking tests --- tests/test_automated/integration/api/test_review.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_automated/integration/api/test_review.py b/tests/test_automated/integration/api/test_review.py index 31f93a56..facd6926 100644 --- a/tests/test_automated/integration/api/test_review.py +++ b/tests/test_automated/integration/api/test_review.py @@ -134,7 +134,7 @@ async def test_approve_and_get_next_source_for_review(api_test_helper): assert agency.name == PLACEHOLDER_AGENCY_NAME -async def test_rejection( +async def run_rejection_test( api_test_helper, rejection_reason: RejectionReason, url_status: URLStatus @@ -168,7 +168,7 @@ async def test_rejection( @pytest.mark.asyncio async def test_rejection_not_relevant(api_test_helper): - await test_rejection( + await run_rejection_test( api_test_helper, rejection_reason=RejectionReason.NOT_RELEVANT, url_status=URLStatus.NOT_RELEVANT @@ -176,7 +176,7 @@ async def test_rejection_not_relevant(api_test_helper): @pytest.mark.asyncio async def test_rejection_broken_page(api_test_helper): - await test_rejection( + await run_rejection_test( api_test_helper, rejection_reason=RejectionReason.BROKEN_PAGE_404, url_status=URLStatus.NOT_FOUND @@ -184,7 +184,7 @@ async def test_rejection_broken_page(api_test_helper): @pytest.mark.asyncio async def test_rejection_individual_record(api_test_helper): - await test_rejection( + await run_rejection_test( api_test_helper, rejection_reason=RejectionReason.INDIVIDUAL_RECORD, url_status=URLStatus.INDIVIDUAL_RECORD From 2a587654454e2cba2bb22af13a196f039cddb71d Mon Sep 17 00:00:00 2001 From: Max Chis Date: Fri, 16 May 2025 17:09:40 -0400 Subject: [PATCH 190/244] feat(app): remove huggingface logic --- Dockerfile | 3 - README.md | 1 - api/main.py | 2 - .../URLRelevanceHuggingfaceTDO.py | 10 - core/TaskManager.py | 14 +- .../URLRelevanceHuggingfaceTaskOperator.py | 63 - hugging_face/HuggingFaceInterface.py | 40 - hugging_face/README.md | 58 - hugging_face/__init__.py | 0 hugging_face/example/__init__.py | 0 hugging_face/example/huggingface_test.py | 53 - hugging_face/example/labels.txt | 28 - hugging_face/example/split_data.py | 43 - hugging_face/example/test-urls.csv | 201 - hugging_face/example/train-urls.csv | 2533 ------- hugging_face/relevancy_worker.py | 23 - hugging_face/requirements.txt | 9 - hugging_face/testing/__init__.py | 0 hugging_face/testing/data/coarse_labels.txt | 8 - .../testing/data/labeled-source-text.csv | 6307 ----------------- .../testing/data/labeled-urls-headers_all.csv | 5235 -------------- hugging_face/testing/hf_trainer.py | 85 - .../url_record_type_labeling/__init__.py | 0 hugging_face/url_relevance/README.md | 28 - hugging_face/url_relevance/__init__.py | 0 .../url_relevance/clean-data-example.csv | 11 - hugging_face/url_relevance/clean_data.py | 59 - hugging_face/url_relevance/constants.py | 18 - .../dataclasses/TrainTestDataframes.py | 12 - .../url_relevance/dataclasses/__init__.py | 0 .../url_relevance/huggingface_relevance.py | 111 - .../url_relevance/huggingface_relevance_2.py | 30 - hugging_face/url_relevance/models/__init__.py | 0 .../models/urls_only/__init__.py | 0 .../urls_only/tf_idf_logistic_regression.py | 41 - .../models/urls_with_html_data/__init__.py | 0 hugging_face/url_relevance/util.py | 26 - pyproject.toml | 7 - tests/manual/huggingface/__init__.py | 0 .../test_hugging_face_interface.py | 19 - tests/manual/huggingface/test_pipelines.py | 8 - .../test_common_crawler_integration.py | 125 - tests/manual/unsorted/test_util_unit.py | 25 - .../integration/api/conftest.py | 3 - .../integration/core/test_async_core.py | 1 - .../test_url_relevancy_huggingface_task.py | 61 - util/huggingface_api_manager.py | 45 - uv.lock | 492 -- 48 files changed, 1 insertion(+), 15837 deletions(-) delete mode 100644 core/DTOs/task_data_objects/URLRelevanceHuggingfaceTDO.py delete mode 100644 core/classes/task_operators/URLRelevanceHuggingfaceTaskOperator.py delete mode 100644 hugging_face/HuggingFaceInterface.py delete mode 100644 hugging_face/README.md delete mode 100644 hugging_face/__init__.py delete mode 100644 hugging_face/example/__init__.py delete mode 100644 hugging_face/example/huggingface_test.py delete mode 100644 hugging_face/example/labels.txt delete mode 100644 hugging_face/example/split_data.py delete mode 100644 hugging_face/example/test-urls.csv delete mode 100644 hugging_face/example/train-urls.csv delete mode 100644 hugging_face/relevancy_worker.py delete mode 100644 hugging_face/requirements.txt delete mode 100644 hugging_face/testing/__init__.py delete mode 100644 hugging_face/testing/data/coarse_labels.txt delete mode 100644 hugging_face/testing/data/labeled-source-text.csv delete mode 100644 hugging_face/testing/data/labeled-urls-headers_all.csv delete mode 100644 hugging_face/testing/hf_trainer.py delete mode 100644 hugging_face/url_record_type_labeling/__init__.py delete mode 100644 hugging_face/url_relevance/README.md delete mode 100644 hugging_face/url_relevance/__init__.py delete mode 100644 hugging_face/url_relevance/clean-data-example.csv delete mode 100644 hugging_face/url_relevance/clean_data.py delete mode 100644 hugging_face/url_relevance/constants.py delete mode 100644 hugging_face/url_relevance/dataclasses/TrainTestDataframes.py delete mode 100644 hugging_face/url_relevance/dataclasses/__init__.py delete mode 100644 hugging_face/url_relevance/huggingface_relevance.py delete mode 100644 hugging_face/url_relevance/huggingface_relevance_2.py delete mode 100644 hugging_face/url_relevance/models/__init__.py delete mode 100644 hugging_face/url_relevance/models/urls_only/__init__.py delete mode 100644 hugging_face/url_relevance/models/urls_only/tf_idf_logistic_regression.py delete mode 100644 hugging_face/url_relevance/models/urls_with_html_data/__init__.py delete mode 100644 hugging_face/url_relevance/util.py delete mode 100644 tests/manual/huggingface/__init__.py delete mode 100644 tests/manual/huggingface/test_hugging_face_interface.py delete mode 100644 tests/manual/huggingface/test_pipelines.py delete mode 100644 tests/manual/unsorted/test_util_unit.py delete mode 100644 tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py delete mode 100644 util/huggingface_api_manager.py diff --git a/Dockerfile b/Dockerfile index 42736a8e..258a3a31 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,9 +22,6 @@ COPY collector_db ./collector_db COPY collector_manager ./collector_manager COPY core ./core COPY html_tag_collector ./html_tag_collector -COPY hugging_face/url_relevance ./hugging_face/url_relevance -COPY hugging_face/url_record_type_labeling ./hugging_face/url_record_type_labeling -COPY hugging_face/HuggingFaceInterface.py ./hugging_face/HuggingFaceInterface.py COPY source_collectors ./source_collectors COPY util ./util COPY alembic.ini ./alembic.ini diff --git a/README.md b/README.md index 78b6fbfe..33c11cb8 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,6 @@ name | description of purpose agency_identifier | Matches URLs with an agency from the PDAP database annotation_pipeline | Automated pipeline for generating training data in our ML data source identification models. Manages common crawl, HTML tag collection, and Label Studio import/export html_tag_collector | Collects HTML header, meta, and title tags and appends them to a JSON file. The idea is to make a richer dataset for algorithm training and data labeling. -hugging_face | Utilities for interacting with our machine learning space at [Hugging Face](https://huggingface.co/PDAP) identification_pipeline.py | The core python script uniting this modular pipeline. More details below. openai-playground | Scripts for accessing the openai API on PDAP's shared account source_collectors| Tools for extracting metadata from different sources, including CKAN data portals and Common Crawler diff --git a/api/main.py b/api/main.py index eeb3e8a8..a7ee2c67 100644 --- a/api/main.py +++ b/api/main.py @@ -26,7 +26,6 @@ from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.RootURLCache import RootURLCache from html_tag_collector.URLRequestInterface import URLRequestInterface -from hugging_face.HuggingFaceInterface import HuggingFaceInterface from pdap_access_manager import AccessManager from pdap_api_client.PDAPClient import PDAPClient from util.DiscordNotifier import DiscordPoster @@ -54,7 +53,6 @@ async def lifespan(app: FastAPI): ) task_manager = TaskManager( adb_client=adb_client, - huggingface_interface=HuggingFaceInterface(), url_request_interface=URLRequestInterface(), html_parser=HTMLResponseParser( root_url_cache=RootURLCache() diff --git a/core/DTOs/task_data_objects/URLRelevanceHuggingfaceTDO.py b/core/DTOs/task_data_objects/URLRelevanceHuggingfaceTDO.py deleted file mode 100644 index 33311a9b..00000000 --- a/core/DTOs/task_data_objects/URLRelevanceHuggingfaceTDO.py +++ /dev/null @@ -1,10 +0,0 @@ -from typing import Optional - -from pydantic import BaseModel - -from collector_db.DTOs.URLWithHTML import URLWithHTML - - -class URLRelevanceHuggingfaceTDO(BaseModel): - url_with_html: URLWithHTML - relevant: Optional[bool] = None diff --git a/core/TaskManager.py b/core/TaskManager.py index 0c67e7a8..a2a4dc61 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -15,11 +15,9 @@ from core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator from core.classes.task_operators.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator from core.classes.task_operators.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator -from core.classes.task_operators.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator from core.enums import BatchStatus from html_tag_collector.ResponseParser import HTMLResponseParser from html_tag_collector.URLRequestInterface import URLRequestInterface -from hugging_face.HuggingFaceInterface import HuggingFaceInterface from llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier from pdap_api_client.PDAPClient import PDAPClient from util.DiscordNotifier import DiscordPoster @@ -31,16 +29,14 @@ class TaskManager: def __init__( self, adb_client: AsyncDatabaseClient, - huggingface_interface: HuggingFaceInterface, url_request_interface: URLRequestInterface, html_parser: HTMLResponseParser, discord_poster: DiscordPoster, - pdap_client: PDAPClient + pdap_client: PDAPClient, ): # Dependencies self.adb_client = adb_client self.pdap_client = pdap_client - self.huggingface_interface = huggingface_interface self.url_request_interface = url_request_interface self.html_parser = html_parser self.discord_poster = discord_poster @@ -62,13 +58,6 @@ async def get_url_html_task_operator(self): ) return operator - async def get_url_relevance_huggingface_task_operator(self): - operator = URLRelevanceHuggingfaceTaskOperator( - adb_client=self.adb_client, - huggingface_interface=self.huggingface_interface - ) - return operator - async def get_url_record_type_task_operator(self): operator = URLRecordTypeTaskOperator( adb_client=self.adb_client, @@ -117,7 +106,6 @@ async def get_task_operators(self) -> list[TaskOperatorBase]: await self.get_url_html_task_operator(), await self.get_url_duplicate_task_operator(), await self.get_url_404_probe_task_operator(), - # await self.get_url_relevance_huggingface_task_operator(), await self.get_url_record_type_task_operator(), await self.get_agency_identification_task_operator(), await self.get_url_miscellaneous_metadata_task_operator(), diff --git a/core/classes/task_operators/URLRelevanceHuggingfaceTaskOperator.py b/core/classes/task_operators/URLRelevanceHuggingfaceTaskOperator.py deleted file mode 100644 index 49aa7aa0..00000000 --- a/core/classes/task_operators/URLRelevanceHuggingfaceTaskOperator.py +++ /dev/null @@ -1,63 +0,0 @@ -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.URLWithHTML import URLWithHTML -from collector_db.enums import TaskType -from core.DTOs.task_data_objects.URLRelevanceHuggingfaceTDO import URLRelevanceHuggingfaceTDO -from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from hugging_face.HuggingFaceInterface import HuggingFaceInterface - - -class URLRelevanceHuggingfaceTaskOperator(TaskOperatorBase): - - def __init__( - self, - adb_client: AsyncDatabaseClient, - huggingface_interface: HuggingFaceInterface - ): - super().__init__(adb_client) - self.huggingface_interface = huggingface_interface - - @property - def task_type(self): - return TaskType.RELEVANCY - - async def meets_task_prerequisites(self): - return await self.adb_client.has_urls_with_html_data_and_without_auto_relevant_suggestion() - - async def inner_task_logic(self): - # Get pending urls from Source Collector - # with HTML data and without Relevancy Metadata - tdos = await self.get_pending_url_info() - url_ids = [tdo.url_with_html.url_id for tdo in tdos] - await self.link_urls_to_task(url_ids=url_ids) - # Pipe into Huggingface - await self.add_huggingface_relevancy(tdos) - - # Put results into Database - await self.put_results_into_database(tdos) - - async def put_results_into_database(self, tdos): - suggestions: list[tuple[int, bool]] = [] - for tdo in tdos: - url_id = tdo.url_with_html.url_id - relevant = tdo.relevant - suggestions.append((url_id, relevant)) - - await self.adb_client.add_auto_relevance_suggestions(suggestions) - - async def add_huggingface_relevancy(self, tdos: list[URLRelevanceHuggingfaceTDO]): - urls_with_html = [tdo.url_with_html for tdo in tdos] - results = await self.huggingface_interface.get_url_relevancy_async(urls_with_html) - for tdo, result in zip(tdos, results): - tdo.relevant = result - - async def get_pending_url_info( - self, - ) -> list[URLRelevanceHuggingfaceTDO]: - tdos = [] - pending_urls: list[URLWithHTML] = await self.adb_client.get_urls_with_html_data_and_without_auto_relevant_suggestion() - for url_with_html in pending_urls: - tdo = URLRelevanceHuggingfaceTDO( - url_with_html=url_with_html - ) - tdos.append(tdo) - return tdos diff --git a/hugging_face/HuggingFaceInterface.py b/hugging_face/HuggingFaceInterface.py deleted file mode 100644 index 3dff8ccd..00000000 --- a/hugging_face/HuggingFaceInterface.py +++ /dev/null @@ -1,40 +0,0 @@ -import asyncio -import json -import os -import sys -from typing import List - -from collector_db.DTOs.URLWithHTML import URLWithHTML - -class HuggingFaceInterface: - - @staticmethod - async def get_url_relevancy_async(urls_with_html: List[URLWithHTML]) -> List[bool]: - urls = [u.url for u in urls_with_html] - input_data = json.dumps(urls) - - proc = await asyncio.create_subprocess_exec( - sys.executable, "hugging_face/relevancy_worker.py", - stdin=asyncio.subprocess.PIPE, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - env=os.environ.copy(), # ⬅️ ensure env variables are inherited - ) - - stdout, stderr = await proc.communicate(input=input_data.encode("utf-8")) - print(stderr) - - raw_output = stdout.decode("utf-8").strip() - - if proc.returncode != 0: - raise RuntimeError(f"Error running HuggingFace: {stderr}/{raw_output}") - - # Try to extract the actual JSON line - for line in raw_output.splitlines(): - try: - return json.loads(line) - except json.JSONDecodeError as e: - continue - - raise RuntimeError(f"Could not parse JSON from subprocess: {raw_output}") - diff --git a/hugging_face/README.md b/hugging_face/README.md deleted file mode 100644 index b7adb405..00000000 --- a/hugging_face/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# URL Classifier Test - -This is a test model for URL classification related to criminal justice. - -You can view the model repository on Hugging Face here: [https://huggingface.co/PDAP/url-classifier-test](https://huggingface.co/PDAP/url-classifier-test) - -## Models - -The models used for training are: - -- BERT (bert-base-uncased) - [https://huggingface.co/docs/transformers/model_doc/bert](https://huggingface.co/docs/transformers/model_doc/bert) -- DistilBERT (distilbert-base-uncased) - [https://huggingface.co/docs/transformers/model_doc/distilbert](https://huggingface.co/docs/transformers/model_doc/distilbert) - -Training a model with BERT took about 17 hours for 2 epochs (training time is affected by hardware used and can be more or less depending on it). DistilBERT is a lightweight version of BERT and took about 6 hours of training for 1.4 epochs while only losing a few percentage points of accuracy. For testing purposes we can use DistilBERT for speedier training and BERT to further refine the model if necessary. - -## Accuracy - -The model accuracy is currently about 60% when predicting from a pool of 28 labels. - -You can view accuracy and various other training metrics on the model page here: [https://huggingface.co/PDAP/url-classifier-test/tensorboard](https://huggingface.co/PDAP/url-classifier-test/tensorboard) - -Things that can increase accuracy include: - -- Training with BERT -- Increasing the `max_steps` parameter of the `TrainingArguments()` function -- Expanding the database, especially having more training examples available for the less used labels -- Adding HTML headers for websites into the mix to give the model more information to work with -- MAYBE: use the 'precision' evaluation strategy instead of 'accuracy' - more testing will be required if this would improve overall accuracy - -Most of these methods will come at the cost of training time. - -`MAX_STEPS` is set to 500 by default, or about 1.4 epochs of training; at this point in the training the accuracy would increase by about 1% per 200 steps, meaning much more training time would be needed to increase the accuracy significantly and may have a point where it plateaus and cannot get any more accurate. - -## Dataset - -The dataset used for training can be found here [https://huggingface.co/datasets/PDAP/urls](https://huggingface.co/datasets/PDAP/urls) - -One dataset is for training data and the other is for accuracy testing - -## Files - -- `huggingface_test.py` - Script that starts the model training process -- `labels.txt` - Text file containing all possible labels that are used for prediction. If a label does not appear in the dataset, it may cause and error. If a label appears in the dataset and is not in the labels file, it will cause an error -- `clean_data.py` - Takes a CSV file and splits it into two, one for training and the other for evaluation -- `train-urls.csv` - CSV of URLs used for model training -- `test-urls.csv` - CSV of URLs used for model accuracy evaluation - -## How to Run - -### Training script - -You can run the training script by installing the libraries in `requirements.txt` and running `python3 huggingface_test.py`. Everythning should be setup and ready to go. You can change the training model by editing the `MODEL` variable and number of training steps with the `MAX_STEPS` variable. - -### Using the trained model - -You can test the trained model by entering one link at a time in the Inference API GUI box on the model's [homepage](https://huggingface.co/PDAP/url-classifier-test). - -You can also consume the trained model programmatically using Hugging Face's Inference API. Learn more about that here: [https://huggingface.co/docs/api-inference/quicktour](https://huggingface.co/docs/api-inference/quicktour) diff --git a/hugging_face/__init__.py b/hugging_face/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/hugging_face/example/__init__.py b/hugging_face/example/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/hugging_face/example/huggingface_test.py b/hugging_face/example/huggingface_test.py deleted file mode 100644 index 014ea0ec..00000000 --- a/hugging_face/example/huggingface_test.py +++ /dev/null @@ -1,53 +0,0 @@ -import evaluate -import numpy as np -from datasets import ClassLabel -from datasets import load_dataset -from transformers import AutoModelForSequenceClassification -from transformers import AutoTokenizer -from transformers import TrainingArguments, Trainer -from transformers import pipeline - -MODEL = "distilbert-base-uncased" -MAX_STEPS = 500 - -dataset = load_dataset("PDAP/urls") -tokenizer = AutoTokenizer.from_pretrained(MODEL) -labels = ClassLabel(names_file="labels.txt") - -def tokenize_function(batch): - tokens = tokenizer(batch["url"], padding="max_length", truncation=False) - tokens["label"] = labels.str2int(batch["label"]) - return tokens - -tokenized_datasets = dataset.map(tokenize_function, batched=True) -# Add custom labels to the results -tokenized_datasets = tokenized_datasets.cast_column("label", labels) - -# Shuffles the dataset, a smaller range can be selected to speed up training -# Selecting a smaller range may come at the cost of accuracy and may cause errors if some labels end up being excluded from the dataset -train_dataset = tokenized_datasets["train"].shuffle(seed=42)#.select(range(1000)) -eval_dataset = tokenized_datasets["test"].shuffle(seed=42)#.select(range(1000)) - -classifier = pipeline("text-classification", model=MODEL, framework="pt", tokenizer=tokenizer) -model = AutoModelForSequenceClassification.from_pretrained(MODEL, num_labels=28) -training_args = TrainingArguments(output_dir="test_trainer_1.1", evaluation_strategy="epoch", max_steps=MAX_STEPS)#, push_to_hub=True) -metric = evaluate.load("accuracy") - -def compute_metrics(eval_pred): - logits, labels = eval_pred - predictions = np.argmax(logits, axis=-1) - return metric.compute(predictions=predictions, references=labels) - -trainer = Trainer( - model=model, - args=training_args, - train_dataset=train_dataset, - eval_dataset=eval_dataset, - compute_metrics=compute_metrics -) - -trainer.train() - -# These will push a new model version to the Hugging Face Hub upon training completion -#trainer.push_to_hub("PDAP/url-classifier-test") -#tokenizer.push_to_hub("PDAP/url-classifier-test") diff --git a/hugging_face/example/labels.txt b/hugging_face/example/labels.txt deleted file mode 100644 index ce5f22d9..00000000 --- a/hugging_face/example/labels.txt +++ /dev/null @@ -1,28 +0,0 @@ -Accident Reports -Annual & Monthly Reports -Arrest Records -Calls for Service -Contact Info & Agency Meta -Complaints & Misconduct -Court Cases -Crime Maps & Reports -Crime Statistics -Daily Activity Logs -Dispatch Logs -Dispatch Recordings -Field Contacts -Geographic -Incident Reports -List of Data Sources -Media Bulletins -Misc Police Activity -Not Criminal Justice Related -Officer Involved Shootings -Personnel Records -Policies & Contracts -Poor Data Source -Records Request Info -Resources -Sex Offender Registry -Training & Hiring Info -Wanted Persons \ No newline at end of file diff --git a/hugging_face/example/split_data.py b/hugging_face/example/split_data.py deleted file mode 100644 index aa6728ff..00000000 --- a/hugging_face/example/split_data.py +++ /dev/null @@ -1,43 +0,0 @@ -import csv -import random -import sys - - -""" This script randomly seperates a csv into a train and test split for use in training. - The script will filter out rows containing multiple labels and preservve at least one unique label for the test script. -""" - - -labels = set() -csv.field_size_limit(sys.maxsize) - -with open("labeled-urls-headers_all.csv", newline="") as csvfile: - reader = csv.DictReader(csvfile) - # result = sorted(reader, key=lambda d: int(d["id"])) - with open("train-urls.csv", "w", newline="") as writefile: - writer = csv.writer(writefile) - writer.writerow(["url", "label"]) - - vd_writer = csv.writer(open("test-urls.csv", "w", newline="")) - vd_writer.writerow(["url", "label"]) - - for row in reader: - label = row["label"] - - if "#" in label: - continue - - url = row["url"] - - if not url: - continue - - rand = random.randint(1, 13) - - if label not in labels: - labels.add(label) - writer.writerow([url, row["label"]]) - elif rand != 1: - writer.writerow([url, row["label"]]) - else: - vd_writer.writerow([url, row["label"]]) diff --git a/hugging_face/example/test-urls.csv b/hugging_face/example/test-urls.csv deleted file mode 100644 index efdfdb99..00000000 --- a/hugging_face/example/test-urls.csv +++ /dev/null @@ -1,201 +0,0 @@ -url,label -https://www.southamptontownnypolice.gov/faq.aspx?qid=120,Not Criminal Justice Related -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0442/,Complaints & Misconduct -https://mukilteowa.gov/news/mukilteo-police-department-public-safety-community-survey/,Media Bulletins -http://www.lafayettepolice.us/771/tactical-rescue-team,Contact Info & Agency Meta -https://hutchinsonmn.gov/departmentsfacilities/police-services/annual-report/,Annual & Monthly Reports -https://alpha.austin.gov/police-oversight/formal-complaint-purpose-and-scope-impartial-attitude-and-courtesy-secure-and-identify-witnesses-and-other-policy-violations/,Complaints & Misconduct -https://www.southamptontownnypolice.gov/1370/2020-budgets,List of Data Sources -https://www.coppelltx.gov/1083/sunshine-room,Not Criminal Justice Related -https://www.jacksontn.gov/government/departments/police/command_staff/captain_jeff_shepard,Personnel Records -https://www.antioch.il.gov/wpfb-file/12-06-14-police-and-fire-agenda-pdf-3/,Poor Data Source -https://delcopa.gov/treasurer/propertyassessment.html,Not Criminal Justice Related -https://delcopa.gov/ojs/ojsforms/rulesconfidentiality.pdf,Records Request Info -https://virginiabeach.gov/whats-up/whats-new/commonwealth-v-jasper-miles-wynn-60-years-to-serve-for-shooting-at-police-following-7-eleven-robbery,Not Criminal Justice Related -http://www.ryepolice.us/chief/attachment/chiefphoto,Poor Data Source -https://police.greenvillesc.gov/faq.aspx?qid=213,Not Criminal Justice Related -https://www.stpaul.gov/news/mayor-melvin-carter-statement-saint-paul-police-officer-involved-shooting-midway-neighborhood,Media Bulletins -http://www.lafayettepolice.us/753/process-overview,Not Criminal Justice Related -https://alpha.austin.gov/en/police-oversight/formal-complaint-responsibility-to-know-and-comply-and-ot/,Poor Data Source -https://www.foxcrossingwi.gov/departments/police-department/resources/tmpd-burg-prev-pers-safe-home-svc-safe/,Poor Data Source -https://www.memphistn.gov/government/city-court-clerk/ticket-prices/ridgeway-police-station/,Poor Data Source -https://www.coppelltx.gov/417/investigations-division,Contact Info & Agency Meta -https://delcopa.gov/ich/resources/covid19/businesspresentation.html,Poor Data Source -https://delcopa.gov/planning/pubs/osrgp/vol-iii_chapter3glenprovidencecountypark.pdf,Not Criminal Justice Related -https://spdblotter.seattle.gov/2017/06/07/police-seize-two-guns-arrest-wanted-felon/,Media Bulletins -https://chandlerazpd.gov/2019/12/chandler-police-investigate-animal-cruelty/,Media Bulletins -https://www.hayward-ca.gov/discover/news/apr21/police-blotter-april-18-24-2021,Annual & Monthly Reports -https://spdblotter.seattle.gov/2022/07/18/police-arrest-security-guard-in-capitol-hill-after-he-fights-stabs-trespasser/,Media Bulletins -https://www.hayward-ca.gov/police-department/crime-prevention/hate-crimes,Contact Info & Agency Meta -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0487/,Poor Data Source -http://police.portlandmaine.gov/596/winter-operations,Not Criminal Justice Related -http://www.ryepolice.us/logs/police-logs-12-15-21-12-21-21,Daily Activity Logs -https://roxburynj.us/721/how-do-i-obtain-a-police-report,Records Request Info -https://www.milpitas.gov/milpitas/departments/police/department-training/,Poor Data Source -https://detroitmi.gov/departments/police-department/dpd-surveillance-technology-reports-documents,List of Data Sources -https://www.sandiego.gov/police/services/child-abuse,Resources -https://www.southbendin.gov/transparency-and-performance/police-transparency-hub/sbpd-compliments-and-complaints-data/,Complaints & Misconduct -https://barnegatpolice.us/download/codis-dna-refusal-form/,Not Criminal Justice Related -https://www.antioch.il.gov/wpfb-file/15th-annual-cop-on-a-rooftop-pdf-5/,Poor Data Source -https://champaignil.gov/2015/05/01/champaign-police-arrest-armed-robbery-suspect/,Media Bulletins -https://police.greenvillesc.gov/430/historical-archives,List of Data Sources -https://delcopa.gov/vote/pdf/2020/brdmeetinglegalnotice_09172020.pdf,Not Criminal Justice Related -https://delcopa.gov/publicrelations/releases/2019/chronicdiseaseselfmanagement.html,Not Criminal Justice Related -https://www.mass.gov/doc/2014-reading-list-for-brookline-police-sergeant-lieutenant-and-captain-promotional-examinations/download,Not Criminal Justice Related -https://detroitmi.gov/departments/police-department/detroit-rewards-tv/about-rewards-tv,Not Criminal Justice Related -https://delcopa.gov/planning/pdf/demodata/populationchange2010-2020.pdf,Poor Data Source -https://council.seattle.gov/2012/02/27/seattle-police-department-is-hiring-police-officers/,Media Bulletins -https://police.greenvillesc.gov/faq.aspx?qid=131,Resources -https://ose.louisiana.gov/event/police-lieutenant-44/,Poor Data Source -http://police.portlandmaine.gov/278/safety-tips,Not Criminal Justice Related -https://police.greenvillesc.gov/faq.aspx?qid=591,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/traffic-fatality-shoreline-dr-and-710-fwy/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-enforcement-operations-planned-this-weekend-2-/,Media Bulletins -http://beaverpolice.us/wp-sitemap-posts-ai1ec_event-1.xml,List of Data Sources -https://coloradosprings.gov/police-department/article/news/homicide-investigation-2001-e-platte-ave,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-21-/,Media Bulletins -https://oceancitymd.gov/oc/ocean-city-police-investigating-fatal-pedestrian-collision/,Media Bulletins -https://www.sandiego.gov/department-document/police-chief-recruitment-process-update-august-22-2017,Training & Hiring Info -https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2016_archived_news/december_2016/volunteer_for_arlington_police_department_s_dog,Not Criminal Justice Related -https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0721/,Poor Data Source -http://www.longbeach.gov/police/press-releases/officer-involved-shooting3/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality---lakewood-blvd-and-sb-405-fwy/,Media Bulletins -https://www.wakeforestnc.gov/police/public-information,Resources -https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2017_archived_news/march_2017/february_2017_arlington_police_community,Media Bulletins -http://www.tampa.gov/news/tampa-police-investigate-shooting-genesee-st-76411,Media Bulletins -https://cityofpowell.us/powell-police-officer-audrey-wilt-named-2022-cit-officer-of-the-year-by-delaware-morrow-mental-health-recovery-services-board/,Media Bulletins -https://www.sandiego.gov/police/about/chief,Personnel Records -https://southamptontownnypolice.gov/1624/public-information,Not Criminal Justice Related -https://www.somervillema.gov/policebodycameras,Media Bulletins -https://www.richmondindiana.gov/news/chief-of-police-michael-britt-officer-seara-burton,Media Bulletins -https://www.ci.san-bernardino.ca.us/city_hall/police_department/department_goals/improve_quality_of_life,Crime Statistics -http://www.longbeach.gov/police/press-releases/officer-involved-shooting-6-/,Media Bulletins -https://detroitmi.gov/es/departments/departamento-de-agua-y-alcantarillado/atencion-al-cliente/que-hacer-si-tiene-una-copia-de-seguridad-de-alcantarillado,Not Criminal Justice Related -https://bouldercolorado.gov/events/police-oversight-panel-0,Poor Data Source -https://delcopa.gov/pdf/animalshelterrfpfinal.pdf,Not Criminal Justice Related -https://www.scribner-ne.gov/wp-content/uploads/helicopter-3.jpg,Poor Data Source -https://www.montgomeryohio.gov/police-resources/,Poor Data Source -https://www.southamptontownnypolice.gov/878/deer-protection-and-management-advisory-,Not Criminal Justice Related -https://www.ci.bellefontaine.oh.us/announcements/bellefontaine-police-accepting-lateral-transfer-applicants,Training & Hiring Info -https://www.lehi-ut.gov/departments/police/lehi-police-ride-along/,Misc Police Activity -https://delcopa.gov/council/2015minutes/081215minutes.pdf,Not Criminal Justice Related -https://hilliardohio.gov/coffee-with-a-cop-2/,Poor Data Source -https://southamptontownnypolice.gov/335/services-programs,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/arrest-made-in-murder-case-2-/,Media Bulletins -https://bouldercolorado.gov/police-master-plan-process-subcommittee,Policies & Contracts -https://www.naperville.il.us/2022-news-articles/naperville-police-investigate-personal-injury-hit-and-run-crash/,Media Bulletins -https://cityofyuma.colorado.gov/departments/emergency-services/police-department,List of Data Sources -http://police.byram-ms.us/wpt_slider/sro/,Poor Data Source -https://www.lincolnca.gov/en/living-here/police-department.aspx?_mid_=484,Resources -https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-courtesy-department-issued-bwc/,Poor Data Source -https://covington.va.us/city-government/city-departments/police/police-patrol/,Misc Police Activity -https://www.desmoineswa.gov/departments/police/forms_documents,Resources -https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/bwc-dmav-vendors-glossary-and-additional-information/,Poor Data Source -http://lafayettepolice.us/1585/concessions-nearby-restaurants,Not Criminal Justice Related -https://www.rentonwa.gov/city_hall/police/patrol_operations/false_alarm_reduction_program,Misc Police Activity -https://spdblotter.seattle.gov/2014/10/20/police-investigating-collision-between-vehicle-and-pedestrian-in-northgate-area/,Media Bulletins -https://champaignil.gov/2014/08/11/champaign-police-investigate-domestic-battery-shooting/,Media Bulletins -https://www.mass.gov/doc/attachment-a-police-departments/download,Poor Data Source -https://delcopa.gov/ems/pdfdocs/initialcertificationeducationtesting/emsinstructorchecklist.doc,Not Criminal Justice Related -https://www.mass.gov/info-details/audit-of-the-massachusetts-rehabilitation-commission-objectives-scope-and-methodology,Media Bulletins -https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/may-19-activity-report/,Annual & Monthly Reports -https://delcopa.gov/publicrelations/releases/2021/primary_electiondayguide.html,Not Criminal Justice Related -https://www.memphistn.gov/news/category/police/,Media Bulletins -http://police.byram-ms.us/contact-us/recordsrequest/,Records Request Info -https://delcopa.gov/clerk/boardpositions/sustainability.html,Poor Data Source -https://delcopa.gov/publicrelations/releases/2021/healthyfortheholidays.html,Not Criminal Justice Related -https://pharr-tx.gov/animated-columns/pharr-police/,Poor Data Source -http://lafayettepolice.us/1672/internships,Training & Hiring Info -http://www.lafayettepolice.us/faq.aspx?qid=122,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/traffic-fatality-4-/,Media Bulletins -https://rexburg.us/unified-police-locate-person-of-interest-in-suspicious-death-in-taylorsville/,Poor Data Source -https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2021_news_releases/w_i_l_e_a_g_re-_accreditation,Media Bulletins -https://www.mass.gov/doc/semexant-jeffrey-v-boston-police-department-52121/download,Court Cases -https://www.mass.gov/doc/beauregard-david-v-city-of-chicopee-4920/download,Court Cases -http://www.longbeach.gov/police/about-the-lbpd/,Contact Info & Agency Meta -https://www.wakeforestnc.gov/news/joyner-park-restrooms-destroyed-vandals-police-seek-public%e2%80%99s-help-identifying-culprits,Media Bulletins -https://detroitmi.gov/departments/law-department/submit-foia-request/non-routine-or-complex-police-foia-request,Poor Data Source -https://townofeaton.colorado.gov/departments/police-department,Resources -https://delcopa.gov/publicrelations/releases/2021/wellnesscenteropening.html,Not Criminal Justice Related -https://www.antioch.il.gov/wpfb-file/04-09-13-police-pension-agenda-pdf/,Poor Data Source -https://www.jacksonms.gov/meetings/personnel-management-administration-police-and-fire/,Resources -https://sf.gov/departments/department-police-accountability,Resources -https://alpha.austin.gov/es/police-oversight/formal-complaint-obedience-to-orders/,Poor Data Source -https://www.southamptontownnypolice.gov/953/lyzon-hat-shop,Not Criminal Justice Related -https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-4/,Poor Data Source -http://www.longbeach.gov/police/press-releases/murder-37-/,Media Bulletins -https://www.belen-nm.gov/wp-content/uploads/2021/01/120193874_3263039293803054_6835373498020090735_o-copy.jpg,Poor Data Source -https://www.coppelltx.gov/faq.aspx?qid=232,Resources -https://spdblotter.seattle.gov/2017/12/05/police-need-your-help-identifying-man-who-robbed-two-lower-queen-anne-businesses/,Media Bulletins -https://www.mass.gov/info-details/oig-annual-report-2019-division-of-state-police-oversight,Annual & Monthly Reports -https://www.hayward-ca.gov/police-department/public-services/crisis-intervention,Resources -http://www.longbeach.gov/police/press-releases/celebrate-the-4th-of-july-holiday-responsibly/,Media Bulletins -https://www.pinevillenc.gov/government/departments/police/join-ppd/,Training & Hiring Info -https://delcopa.gov/sustainability/commission/otherpdfs/sustcommmtg_slidedeck_2021-8-19.pdf,Poor Data Source -https://coloradosprings.gov/police-department/page/alternate-education-program,Resources -https://www.tukwilawa.gov/departments/police/command-staff-bios/pd-boyd-kraig-bio-pic/,Media Bulletins -https://coloradosprings.gov/police-department/article/news/adrian-vasquez-serve-interim-police-chief,Media Bulletins -https://www.gurnee.il.us/government/departments/police-department/community-involvement/gurnee-citizen-police-academy/gurnee-citizen-police-academy/week-6,Training & Hiring Info -https://delcopa.gov/council/2018minutes/050218minutes.pdf,Not Criminal Justice Related -https://brookfieldil.gov/brookfields-police-and-fire-chiefs-safety-talk-for-seniors-9-19-19/mtc-2019-poster-3/,Poor Data Source -https://alpha.austin.gov/police-oversight/joint-report-analysis-of-apd-racial-profiling-data/,Poor Data Source -https://delcopa.gov/publicrelations/releases/2020/delcocares_sept1.html,Not Criminal Justice Related -https://www.milpitas.gov/milpitas/departments/police/community-relations/citizen-volunteer-and-explorer-applications/,Poor Data Source -https://www.mass.gov/news/governor-baker-signs-police-reform-legislation,Poor Data Source -https://frederica.delaware.gov/tag/police-officer/,Training & Hiring Info -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0250/,Poor Data Source -https://alpha.austin.gov/police-oversight/formal-complaint-obedience-to-orders-insubordination/,Poor Data Source -http://www.tampa.gov/fire-and-police-pension/info/meeting-notices,List of Data Sources -http://www.longbeach.gov/police/contact-us/,Contact Info & Agency Meta -http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-two-arrests-3-/,Media Bulletins -https://dagsboro.delaware.gov/police-department/police-department/nick-disciullo-promotion-2019-2/,Poor Data Source -https://www.sandiego.gov/department-document/police-arrest-suspect-encanto-homicide,Media Bulletins -https://wildwoodpolice-fl.gov/attempt_to_identify_type-sitemap.xml,Poor Data Source -https://police.greenvillesc.gov/faq.aspx?qid=359,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/critical-missing-juvenile---michael-veal/,Media Bulletins -https://delcopa.gov/vote/votebymail.html,Not Criminal Justice Related -https://www.dps.nm.gov/blog/2021/02/10/update-cancel-amber-alert-albuquerque-police-department/,Media Bulletins -https://oceancitymd.gov/oc/ocean-city-police-arrest-two-individuals-after-a-serious-assault/,Media Bulletins -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0674/,Poor Data Source -https://delcopa.gov/planning/pdf/agendas/2020/agenda202010.pdf,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/traffic-fatality-pico-and-pier-c/,Media Bulletins -https://townofspringfield.colorado.gov/departments/police-department/winter-vehicle-safety-kits,Poor Data Source -http://www.longbeach.gov/police/press-releases/traffic-fatality-7-/,Media Bulletins -https://ose.louisiana.gov/event/police-corporal-14/,Poor Data Source -https://delcopa.gov/planning/pdf/currentprojects/rosetreeplayoverallsiteloc.pdf,Not Criminal Justice Related -https://delcopa.gov/publicrelations/releases/2022/www.vaccines.gov,Poor Data Source -http://www.longbeach.gov/police/press-releases/murder-ruled-self-defense/,Media Bulletins -http://www.lafayettepolice.us/1/home,Poor Data Source -https://beaumonttexas.gov/beaumont-police-arrest-port-arthur-man-for-murder/,Media Bulletins -https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-28/,Poor Data Source -https://rexburg.us/police-man-sexually-abused-hairstylist-in-ogden-barbershop/,Media Bulletins -http://www.longbeach.gov/police/press-releases/two-suspects-arrested-in-murder-case/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-drivers-license-checkpoint-planned-this-weekend-1-/,Media Bulletins -https://delcopa.gov/arpa/pdf/20220731annualarpareportfiled7-29-22final.pdf,Annual & Monthly Reports -https://brookfieldil.gov/publication/072512-july-25-2012-brookfield-police-pension-board/,Poor Data Source -https://southamptontownnypolice.gov/1370/2020-budgets,List of Data Sources -http://www.longbeach.gov/police/press-releases/protect-yourself-from-fraud-this-holiday-season/,Media Bulletins -https://delcopa.gov/courts/pdf/emergencyjudicialorders/fifthemergencyorderextendingearlyparolereviewandsuchpossiblerelease.pdf,Court Cases -http://www.longbeach.gov/police/press-releases/juvenile-investigations-operation-results-in-6-arrests/,Media Bulletins -https://barnegatpolice.us/barnegat-police-department-2/professional-standards/,Policies & Contracts -http://www.longbeach.gov/police/press-releases/charges-filed-in-attempt-murder-case/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality27/,Media Bulletins -https://www.ci.neenah.wi.us/departments/police/police-annual-reports/survey-results/,List of Data Sources -http://www.longbeach.gov/press-releases/robert-g--luna-appointed-police-chief-of-long-beach/,Media Bulletins -http://www.longbeach.gov/police/press-releases/long-beach-police-are-asking-for-the-public-s-help/,Media Bulletins -http://www.longbeach.gov/police/press-releases/officer-involved-shooting-2800-block-15th/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-checkpoint-results/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-44-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/identity-theft-suspect-charged-with-11-felony-counts/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-proves-effective-2-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-proves-effective-7-/,Media Bulletins -https://springfield-or.gov/event/springfield-police-advisory-committee-meeting/,Poor Data Source -http://www.longbeach.gov/police/press-releases/traffic-fatality7/,Media Bulletins -http://www.longbeach.gov/police/press-releases/national-night-out-set-for-august-4th/,Media Bulletins -http://www.longbeach.gov/police/press-releases/human-trafficking-charges-filed-and-additional-victims-sought/,Media Bulletins -http://www.longbeach.gov/police/press-releases/police---fire-memorial-ceremony-1-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-drivers-license-checkpoint-planned/,Media Bulletins -https://coloradosprings.gov/police-department/webform/community-outreach-request,Resources -http://www.longbeach.gov/police/press-releases/traffic-fatality-pch-and-studebaker-rd/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-6-/,Media Bulletins -https://ose.louisiana.gov/event/police-records-clerk-3/,Poor Data Source diff --git a/hugging_face/example/train-urls.csv b/hugging_face/example/train-urls.csv deleted file mode 100644 index 5354a4fe..00000000 --- a/hugging_face/example/train-urls.csv +++ /dev/null @@ -1,2533 +0,0 @@ -url,label -https://delcopa.gov/council/2016minutes/101216minutes.pdf,Policies & Contracts -https://www.mass.gov/doc/coping-with-overdose-fatalities/download,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/murder-7-/,Media Bulletins -https://www.lynchburgvapolice.gov/wp-content/uploads/2021/05/img_1545.jpg,Poor Data Source -http://police.portlandmaine.gov/526/permit-license-fees,Resources -https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2012_and_prior_archived_news/police_graduate_18_recruits,Personnel Records -https://police.greenvillesc.gov/1996/getting-here-parking,Contact Info & Agency Meta -http://lafayettepolice.us/3386/donate,Resources -http://www.lafayettepolice.us/2111/youth-classes-and-weekend-workshops,Misc Police Activity -https://norfolkne.gov/assets/site/documentcentral/police/archived-arrests/2020-arrests/may-arrests.pdf,Arrest Records -http://www.longbeach.gov/police/press-releases/murder-18-/,Media Bulletins -https://www.edmondswa.gov/government/departments/police_department/anonymous_tip,Contact Info & Agency Meta -https://www.southamptontownnypolice.gov/1698/calissa-restaurant,Not Criminal Justice Related -https://ose.louisiana.gov/event/police-communications-officer-i-5/,Poor Data Source -https://www.mass.gov/doc/essential-functions-for-municipal-police-officers/download,Policies & Contracts -https://www.jacksonms.gov/documents/mayoral-executive-order-amending-the-city-of-jackson-police-departments-use-of-force-policy/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-600-block-of-e-9th-street/,Media Bulletins -https://www.dps.arkansas.gov/law-enforcement/arkansas-state-police/divisions/highway-patrol/troop-c-commander/,Personnel Records -https://www.roseville.ca.us/government/departments/police_department/community_services/my_neighborhood_officer/neighborhood_officer_program_information,Misc Police Activity -https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2021_news_releases/arrest_leads_to_officer_injury,Media Bulletins -https://cityofmebanenc.gov/documents/police-officer-2/police-officer-updated-2-21-2022/,Resources -https://www.eutawal.gov/policeman/,Poor Data Source -http://www.longbeach.gov/police/press-releases/murder-investigation4/,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/090921blotter.pdf,Dispatch Logs -https://delcopa.gov/planning/programsandinitiatives/heritagecommission/historyofhcpreservationawards.pdf,Not Criminal Justice Related -https://www.antioch.il.gov/wpfb-file/12-13-11-police-pension-fund-agenda-pdf/,Poor Data Source -https://www.bedminster.us/government/police/history,Contact Info & Agency Meta -https://www.ci.neenah.wi.us/departments/police/neighborhood-policing/,Policies & Contracts -http://www.lafayettepolice.us/1635/learning-adventures-camps-ages-5-7,Not Criminal Justice Related -https://www.sheridanwy.gov/faq_s/police_department,Contact Info & Agency Meta -https://www.sandyspringsgapolice.gov/category/uncategorized/,Poor Data Source -https://mukilteowa.gov/news/mukilteo-seeks-new-police-chief/,Personnel Records -https://www.foxcrossingwi.gov/departments/police-department/community-policing/tricom/,Poor Data Source -https://www.edmondswa.gov/government/departments/police_department/public_information/can_you_i_d_me_,Wanted Persons -https://www.lynchburgvapolice.gov/traffic-safety-information/,List of Data Sources -http://chico.ca.us/post/police-community-advisory-board-pcab,Media Bulletins -http://www.lafayettepolice.us/488/swimming-lessons,Not Criminal Justice Related -https://alpha.austin.gov/police-oversight/written-reprimand-of-officer-jason-goodman/,Complaints & Misconduct -https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2013_archived_news/december_2013/arlington_police_remind_safe_holiday_season,Media Bulletins -https://www.antioch.il.gov/police-department/,List of Data Sources -https://decaturil.gov/decatur-police-department-to-host-coffee-with-a-cop-on-august-8-2018/,Misc Police Activity -https://www.newcastlewa.gov/departments/police/solicitors,Not Criminal Justice Related -https://www.hayward-ca.gov/discover/news/mar21/hayward-police-departments-community-academy-goes-virtual-april,Misc Police Activity -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/031422summary.pdf,Daily Activity Logs -https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-4/,Complaints & Misconduct -https://alpha.austin.gov/es/police-oversight/2020-06-30-7/,Complaints & Misconduct -https://spdblotter.seattle.gov/2013/05/02/man-leads-police-on-chase-in-stolen-patrol-car-after-attacking-bus-riders-officers/,Media Bulletins -http://www.ryepolice.us/announcements/dmv-phone-scam,Media Bulletins -https://www.mass.gov/doc/2021-foxborough-police-sergeant-sole-assessment-center-examination-in-title-employment-verification-form/download,Training & Hiring Info -https://www.pleasantprairiewi.gov/news/2017_news/1_20_2017___shop_with_a_cop,Media Bulletins -https://www.bedminster.us/government/police/tips,Contact Info & Agency Meta -https://champaignil.gov/2019/02/20/champaign-police-investigating-tuesday-night-shooting/,Misc Police Activity -https://champaignil.gov/2012/04/05/champaign-police-officers-cook-with-%e2%80%9ckids-in-the-kitchen%e2%80%9d/,Media Bulletins -https://www.gurnee.il.us/government/departments/police-department/community-involvement/parking,Policies & Contracts -https://www.ci.auburn.in.us/wp-content/uploads/2019/08/police-rad-class-2.jpg,Poor Data Source -https://delcopa.gov/treasurer/pdf/2021reassessmentvalues/25.pdf,Not Criminal Justice Related -https://delcopa.gov/departments/liveworkplay.html,Not Criminal Justice Related -https://www.stcharlesil.gov/events/public-meetings/police-pension-board/10889,Policies & Contracts -https://coloradosprings.gov/police-department/article/news/man-posing-realtor-arrested,Media Bulletins -https://police.greenvillesc.gov/160/services,Resources -https://cheswold.delaware.gov/cheswold-police-department-policy-and-procedure-manual/snow-energency-plan/,Policies & Contracts -http://boro.dormont.pa.us/labor-agreements/police_union_contract_-_extended/,Policies & Contracts -https://coloradosprings.gov/police-department/article/news/motorcyclist-identified-austin-bluffs,Media Bulletins -https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-agencies/1923-police-benevolent-association-new-york-state-inc-pbanys-dues-increase,Misc Police Activity -https://www.arlingtontx.gov/city_hall/departments/police/recruiting/internships,Resources -https://www.coppelltx.gov/faq.aspx?qid=351,Not Criminal Justice Related -https://cityofpowell.us/police-agency/traffic-surveys/traffic-survey-report-1-3-18/,Misc Police Activity -https://www.bristolri.gov/departments/police/public-safety-services/police-detail-request/,Resources -https://takomaparkmd.gov/government/police/crime-prevention/burglary-prevention/,Media Bulletins -https://fenwickisland.delaware.gov/comprehensive-plan/town-of-fenwick-island-fi-comp-plan_cleancopy_version6/,Not Criminal Justice Related -https://delcopa.gov/employment/jobpostings/deputydirector_workforcedevelopment.html,Not Criminal Justice Related -https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scope-24/,Poor Data Source -https://coloradosprings.gov/police-department/article/news/cspd-asks-communitys-help-fatal-crash,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-22-/,Media Bulletins -https://delcopa.gov/publicrelations/releases/2021/covidtesting_darbyfeb3.html,Not Criminal Justice Related -https://raleighnc.gov/safety/police-administrative-services-division,Resources -https://coloradosprings.gov/police-department/article/news/cspd-conduct-abandoned-or-out-compliance,Media Bulletins -https://es.carpinteriaca.gov/wp-content/uploads/2022/11/palms-copy-scaled.jpg,Poor Data Source -https://coloradosprings.gov/police-department/article/news/i-25-traffic-safety-deployment-after-stop,Media Bulletins -https://dccouncil.gov/judiciary-public-safety/copy-of-ag0-fy-2019-proposed-schedule-a-two-position-changes-1/,Annual & Monthly Reports -https://barnegatpolice.us/warrant-arrest-2/,Arrest Records -https://www.mass.gov/doc/606-cmr-1500-clean-copy/download,Not Criminal Justice Related -https://training.detroitmi.gov/bn/departments/paulaisa-baibhaaga/detroit-police-department-shield-program/paraogaraama-ebam-saebaa,Poor Data Source -https://www.mass.gov/info-details/audit-of-the-massachusetts-commission-on-the-status-of-women-objectives-scope-and-methodology,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/pursuit-with-traffic-fatality---3rd-street-and-temple-avenue/,Media Bulletins -http://www.ryepolice.us/logs/police-logs-for-6-3-20-6-9-20,Daily Activity Logs -http://www.ryepolice.us/logs/police-logs-for-11216-11816,Daily Activity Logs -https://delcopa.gov/sheriff/pdf/atf_letter.pdf,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/010322arrests.pdf,Arrest Records -https://www.sandiego.gov/department-document/police-investigate-homicide-lincoln-park-0,Media Bulletins -https://alpha.austin.gov/es/police-oversight/2020-08-26-2/,Poor Data Source -https://wyoming.delaware.gov/police-department/irma/,Poor Data Source -http://www.princetoniowa.us/chapter-30---police-department.html,Resources -https://rexburg.us/police-identify-man-who-died-in-shooting-at-taylorsville-apartment-complex/,Poor Data Source -https://bouldercolorado.gov/news/boulder-police-searching-additional-victims-witnesses-investigation,Media Bulletins -https://www.villageofallouezwi.gov/depts/police/prescription-drug-collections/,Resources -https://www.southamptontownnypolice.gov/439/southampton-shinnecock-hills-tuckahoe-ca,Resources -https://cityofpowell.us/powell-police-officer-audrey-wilt-named-2022-cit-officer-of-the-year-by-delaware-morrow-mental-health-recovery-services-board/hrytzikwilt22citofficeroftheyear/,Poor Data Source -https://southamptontownnypolice.gov/1702/lake-agawam--injection-well-prb-sh-villa,Not Criminal Justice Related -https://www.mass.gov/event/jlmc-17-6105-watertown-police-association-3a-hearing-open-meeting-notice-05-09-2018-2018-05-09t100000-0400-2018-05-09t170000-0400,Misc Police Activity -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/090721blotter.pdf,Calls for Service -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/012222blotter.pdf,Poor Data Source -https://www.coppelltx.gov/939/events-activities,Not Criminal Justice Related -https://alpha.austin.gov/es/police-oversight/temporary-suspension-of-officer-william-norrell/,Poor Data Source -https://alpha.austin.gov/police-oversight/2020-08-17-9/,Poor Data Source -https://bouldercolorado.gov/news/police-chief-maris-herold-op-ed-police-reform,Media Bulletins -https://ose.louisiana.gov/event/police-communications-officer-20/,Poor Data Source -https://www.stpaul.gov/departments/police/administration-office-chief/community-engagement-division/community-partnerships,Contact Info & Agency Meta -https://www.woburnma.gov/government/recreation/spring-summer-brochure-2018-final-copy/,Not Criminal Justice Related -https://southamptontownnypolice.gov/faq.aspx?qid=270,Contact Info & Agency Meta -https://brooklynwi.gov/open-house-brooklyn-police-dane-county-sheriffs-office-april-8-at-6pm-or-april-9-at-6pm-at-community-bldg/,Poor Data Source -https://alpha.austin.gov/en/police-oversight/documents-regarding-the-use-of-racial-profiling-in-policin/,Poor Data Source -https://ridgelandsc.gov/police-department/daily-arrest-reports-may,Arrest Records -https://www.mass.gov/doc/maldenpolicesergeant3554rtf/download,Poor Data Source -https://spdblotter.seattle.gov/2018/05/21/detective-cookies-urban-youth-chess-club-announces-kids-vs-cops-chess-rumble-tournament/,Misc Police Activity -https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0439/,Poor Data Source -https://delcopa.gov/planning/programsandinitiatives/commissionsandtaskforces.html,Contact Info & Agency Meta -https://coloradosprings.gov/police-department/page/cases-interest-randy-bishop,Officer Involved Shootings -https://www.wakeforestnc.gov/news/police-department-turkey-drive-continues-through-november-20,Media Bulletins -https://delcopa.gov/row/pdf/2020/informationforcouplesgettingmarriedform.pdf,Not Criminal Justice Related -https://coloradosprings.gov/police-department/article/news/traffic-fatality-3500-block-austin-bluffs,Media Bulletins -https://delcopa.gov/courts/pdf/mdjlistmuni01jan2018.pdf,Contact Info & Agency Meta -https://www.mooresville.in.gov/event/police-commission-3/,Poor Data Source -https://delcopa.gov/planning/pdf/demodata/minoritypopulation2020map.pdf,Not Criminal Justice Related -http://lafayettepolice.us/208/police-officer-lateral-entry-program,Training & Hiring Info -https://www.pleasantprairiewi.gov/news/2016_news/shop_with_a_cop__firefighter,Misc Police Activity -https://delcopa.gov/health/news/dchdtorelocatecovid19vaccinationclinics.html,Not Criminal Justice Related -https://spdblotter.seattle.gov/2018/06/01/seattle-police-officer-charged-with-assault/,Poor Data Source -https://delcopa.gov/meo/careers/forensicinvestigator.html,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/motorcycle-safety-operation-proves-effective/,Media Bulletins -https://council.seattle.gov/2011/12/16/justice-department-findings-on-seattle-police/,Poor Data Source -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/110221summary.pdf,Dispatch Logs -https://www.mass.gov/doc/jlm-17-5884-city-of-quincy-and-quincy-police-patrol-officers-association-february-8-2019/download,Policies & Contracts -https://www.mass.gov/doc/2022-tewksbury-police-lieutenant-sole-assessment-employment-verification-form/download,Training & Hiring Info -https://www.newcastlewa.gov/departments/police/safe_place_program,Resources -https://www.roseville.ca.us/government/departments/police_department/crime_log/crime_log_feb_15_-_feb_28__2020,Crime Maps & Reports -https://springfield-or.gov/event/springfield-police-advisory-committee-spac-19/,Poor Data Source -https://delcopa.gov/departments/history.html,Not Criminal Justice Related -https://www.stcharlesil.gov/events/public-meetings/2018-01-08-230000/regular-meeting-board-fire-and-police-commissioners,Poor Data Source -https://www.mass.gov/doc/christine-kennedy-v-city-of-chicopee-school-dept/download,Court Cases -https://delcopa.gov/publicrelations/releases/2019/passportmonth.html,Not Criminal Justice Related -https://detroitmi.gov/departments/police-department/detroit-police-department-office-civil-rights/definitions-consent-decree,Policies & Contracts -https://delcopa.gov/publicrelations/releases/2020/delcoraterminated2.html,Not Criminal Justice Related -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0376-3/,Complaints & Misconduct -http://www.lafayettepolice.us/152/animal-control,Contact Info & Agency Meta -http://www.longbeach.gov/police/press-releases/murder-2300-blk-spaulding/,Poor Data Source -https://police.greenvillesc.gov/faq.aspx?qid=443,Not Criminal Justice Related -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/112821blotter.pdf,Dispatch Logs -http://www.lafayettepolice.us/2338/housing,Not Criminal Justice Related -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/051521blotter.pdf,Dispatch Logs -https://www.mass.gov/doc/jlm-13-2733-city-of-beverly-and-beverly-police-superiors-association-july-29-2015/download,Policies & Contracts -https://townofnederland.colorado.gov/police,Contact Info & Agency Meta -http://www.lafayettepolice.us/296/compliments-concerns,Poor Data Source -http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-results-1-/,Media Bulletins -https://chandlerazpd.gov/police-facilities/desert-breeze-substation/,Contact Info & Agency Meta -https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2019_news_releases/police_arrest_three_zion_men_in_kidnapping_event,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder---6400-block-of-coronado-avenue/,Media Bulletins -https://www.townofhamburgny.gov/citizens-police-academy/,Training & Hiring Info -https://delcopa.gov/vote/pdf/2022/p2022-write-in-cumulation-request.pdf,Not Criminal Justice Related -https://www.roseville.ca.us/government/departments/police_department/crime_log/crime_log_oct_03_-_oct_16__2020,Crime Maps & Reports -https://www.clarkstown.gov/police/child-safety-seats/,Media Bulletins -https://detroitmi.gov/departments/police-department/abandoned-vehicle,Policies & Contracts -http://www.lafayettepolice.us/1879/water-tips,Not Criminal Justice Related -https://springfield-or.gov/copy-of-springfield-police-seeking-community-input-via-online-survey/,Poor Data Source -https://hollister.ca.gov/government/city-departments/police/social-networking/,Contact Info & Agency Meta -https://www.antioch.il.gov/wpfb-file/03-10-17-police-and-fire-agenda-pdf-3/,Poor Data Source -https://www.mass.gov/doc/anderson-deborah-v-boston-police-department-71510/download,Court Cases -https://spdblotter.seattle.gov/2012/08/28/two-arrested-for-trying-to-pimp-undercover-cops-at-westlake/,Media Bulletins -http://www.tampa.gov/police/recruit-scholarship-program,Resources -http://lafayettepolice.us/340/guard-rail-repair-replacement,Not Criminal Justice Related -https://www.montgomeryohio.gov/topics/police-safety-programs/,Poor Data Source -https://chandlerazpd.gov/2013/07/prescription-medication-drop-boxes-now-accessible-in-all-chandler-police-stations/,Media Bulletins -https://www.mass.gov/doc/2022-dalton-police-sergeant-sole-assessment-center-examination-employment-verification-form/download,Training & Hiring Info -https://southamptontownnypolice.gov/775/county-road-39-corridor,Not Criminal Justice Related -https://www.stcharlesil.gov/news/2018/07/25/police-bike-patrol-unit-patrols-where-cars-can%e2%80%99t,Poor Data Source -https://www.mass.gov/doc/appendix-x-family-assistance-copayments-and-deductibles-0/download,Not Criminal Justice Related -https://www.elburn.il.us/event/board-of-police-commissioners-2022-09-22/,Poor Data Source -https://www.coppelltx.gov/faq.aspx?qid=142,Not Criminal Justice Related -https://www.montebelloca.gov/departments/police/divisions/patrol/district_policing,Contact Info & Agency Meta -https://www.mass.gov/doc/randolph-covered-police-firefighterpdf/download,Poor Data Source -https://brookfieldil.gov/village-manager-selects-new-police-chief/petrak-press-release/,Media Bulletins -https://delcopa.gov/courts/judges/pileggi.html,Poor Data Source -https://pittsburghpa.gov/files/police/orders/ch4/43-10.01-juvenile-policy-legal-mandates-regarding-child-abuse.pdf,Poor Data Source -https://www.providenceri.gov/hr/wellness/cop-manage-anxiety-9-11/,Poor Data Source -https://spdblotter.seattle.gov/2017/01/07/police-respond-to-three-fatal-heroin-overdoses-remind-public-of-good-samaritan-law/,Media Bulletins -https://champaignil.gov/2012/05/14/police-respond-to-weapon-call-central-high-school-610-w-university-ave/,Media Bulletins -https://www.ci.plymouth.mi.us/services/police,Poor Data Source -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0202/,Poor Data Source -https://www.rentonwa.gov/city_hall/police/police_services/special_operations,Contact Info & Agency Meta -https://alpha.austin.gov/es/police-oversight/2020-06-05-13/,Poor Data Source -https://dagsboro.delaware.gov/ngg_tag/new-police-cars/,Poor Data Source -https://norfolkne.gov/government/departments/police-division/press-releases/may-13th-press-release.html,Media Bulletins -https://www.coppelltx.gov/faq.aspx?qid=106,Not Criminal Justice Related -https://police.bixbyok.gov/faq.aspx?qid=83,Resources -https://beaumonttexas.gov/beaumont-police-arrest-3-for-aggravated-sexual-assault-aggravated-robbery-and-aggravated-kidnapping-1155-ih-10-n/,Poor Data Source -https://police.crystalmn.gov/police/services/request_a_report,Records Request Info -https://www.southamptontownnypolice.gov/608/animal-control,Not Criminal Justice Related -https://www.lomalinda-ca.gov/services/police_department/tips,Resources -https://www.mass.gov/doc/sco-pace-disenrol-scopdf/download,Not Criminal Justice Related -https://www.mass.gov/doc/unit-5-cops-salary-chart-effective-742021/download,Poor Data Source -https://www.fortworthtexas.gov/departments/police/events/police-chief-finalist,Poor Data Source -https://www.antioch.il.gov/wpfb-file/police-blotter-02-01-21-to-02-07-21-pdf/,Arrest Records -http://www.cityofpataskalaohio.gov/cop_people/tom-lee/,Not Criminal Justice Related -https://hutchinsonmn.gov/document_category/police/,Poor Data Source -https://www.mass.gov/doc/gardnerpolicesergeant2119rtf/download,Training & Hiring Info -https://www.ci.oakley.ca.us/police-accident-reports/,Accident Reports -https://delcopa.gov/jdboard/index.html,Contact Info & Agency Meta -https://barnegatpolice.us/wpdmpro-sitemap.xml,Poor Data Source -https://www.ci.san-bernardino.ca.us/city_hall/police_department/over_100_years_of_service/historical_photos,Not Criminal Justice Related -https://delcopa.gov/council/2018minutes/103118minutes.pdf,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/civilian-employee-arrested/,Media Bulletins -https://hollister.ca.gov/government/city-departments/police/incident-reports/,Resources -"https://norfolkne.gov/government/departments/police-division/press-releases/february-14,-2022-press-release.html",Media Bulletins -https://www.southamptontownnypolice.gov/faq.aspx?qid=138,Training & Hiring Info -http://www.lafayettepolice.us/714/city-website-policy,Not Criminal Justice Related -https://www.bedminster.us/government/police/vision__mission___core_values/body_camera,Poor Data Source -https://www.mass.gov/doc/tavares-bruce-v-fall-river-police-department-51707/download,Court Cases -https://delcopa.gov/vote/pdf/2021/delco-boe-meeting-notice_certification-municipal-primary-results_6-7-2021.pdf,Not Criminal Justice Related -https://delcopa.gov/sheriff/pdf/list1.pdf,Not Criminal Justice Related -http://www.lafayettepolice.us/3469/gis-zoning-maps,Resources -https://www.east-windsor.nj.us/police-athletic-league,Misc Police Activity -http://www.longbeach.gov/police/press-releases/murder2/,Media Bulletins -https://www.tukwilawa.gov/departments/police/annual-reports/pd-2004report/,Poor Data Source -https://springfield-or.gov/city/police-department/patrol/k9-team/,Contact Info & Agency Meta -https://www.stpaul.gov/departments/police/administration-office-chief/community-engagement-division/special-events-application-sppd,Not Criminal Justice Related -https://www.lynchburgvapolice.gov/wp-content/uploads/2021/06/lpd-seal-e1662580813573.png,Poor Data Source -https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/citations-for-summary-of-policy-language-recommendations/,Poor Data Source -https://detroitmi.gov/departments/police-department/detroit-police-department-shield-program/detroit-police-shield-partners,Contact Info & Agency Meta -https://www.mass.gov/info-details/audit-of-the-office-for-refugees-and-immigrants-objectives-scope-and-methodology,Not Criminal Justice Related -https://delcopa.gov/dropbox/,Not Criminal Justice Related -https://delcopa.gov/sustainability/presentations/22/06ruthabbe.pptx,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/public-s-help-needed-in-hit-and-run-investigation/,Media Bulletins -https://takomaparkmd.gov/government/police/covid-19-info-resources/,Not Criminal Justice Related -https://www.southamptontownnypolice.gov/faq.aspx?qid=259,Not Criminal Justice Related -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/arrests/092322arrests.pdf,Poor Data Source -http://www.lafayettepolice.us/456/special-events,Not Criminal Justice Related -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/082621summary.pdf,Daily Activity Logs -https://www.mass.gov/doc/handout-for-the-may-24-2018-design-public-hearing-in-chicopee/download,Not Criminal Justice Related -https://oceancitymd.gov/oc/ocean-city-police-sergeant-retires-after-27-years-of-service/,Media Bulletins -https://delcopa.gov/sustainability/commission/meetingminutes/sustainabilitycommissionkick-offmeetingminutesoct2020.pdf,Poor Data Source -https://delcopa.gov/publicrelations/publicrelations/releases/2020/herobowlboard.html,Poor Data Source -https://www.mass.gov/doc/minutes-of-april-2019-chicopee/download,Not Criminal Justice Related -https://www.roseville.ca.us/government/departments/police_department/divisions/police_explorers,Resources -https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-130-2010-state-police-expertise-pay,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/080822summary.pdf,Poor Data Source -https://www.antioch.il.gov/wpfb-file/10-22-13-police-and-fire-agenda-pdf-3/,Poor Data Source -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/053022blotter.pdf,Poor Data Source -https://www.lynchburgvapolice.gov/news-updates/homicide-1100-blk-of-15th-street/,Media Bulletins -https://www.antioch.il.gov/wpfb-file/04-19-16-police-pension-agenda-pdf/,Media Bulletins -https://delcopa.gov/publicrelations/releases/2020/pdf/citizencorpsorienationfeb21.pdf,Not Criminal Justice Related -https://piedmont.ca.gov/services___departments/police/transparency_portal/training_materials,Policies & Contracts -https://police.birminghamal.gov/command-staff/lieutenant-richard-haluska/,Contact Info & Agency Meta -https://cityofgulfbreeze.us/staff/police-general/,Contact Info & Agency Meta -https://southamptontownnypolice.gov/1151/sustainability---transportation,Not Criminal Justice Related -https://spdblotter.seattle.gov/2014/07/02/ive-got-a-pistol-too-man-tells-police-before-officer-involved-shooting/,Media Bulletins -https://www.southamptontownnypolice.gov/137/town-council-office,Not Criminal Justice Related -https://spdblotter.seattle.gov/2008/10/02/seattle-police-investigate-possible-attempt-abduction/,Media Bulletins -https://sanfordfl.gov/wp-content/uploads/2020/07/police_employment.jpg,Poor Data Source -https://harrington.delaware.gov/links-forms/citizens-police-academy-flyer/,Poor Data Source -https://spdblotter.seattle.gov/2013/07/23/police-investigating-gunfire-in-rainier-beach/,Media Bulletins -https://chandlerazpd.gov/2013/01/chandler-police-explorers-host-competition-2/,Media Bulletins -https://dps.georgia.gov/job-vacancy-announcement-georgia-capitol-police-officer-four-positions-0,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-investigation6/,Media Bulletins -https://police.greenvillesc.gov/faq.aspx?qid=317,Resources -https://southamptontownnypolice.gov/722/great-east-end-cleanup---2022,Poor Data Source -http://www.ryepolice.us/parking/attachment/parkingappeal-2,Resources -https://www.roseville.ca.us/government/departments/electric_utility/about_us/building_and_renovation_copy/request_for_proposal_archived,Poor Data Source -https://www.knoxvilletn.gov/archived_news_stories/2009/knoxville_police_prepared_for_holiday_traffic,Media Bulletins -https://coloradosprings.gov/police-department/article/news/colorado-springs-police-departments-k9-zev,Media Bulletins -https://rexburg.us/police-identify-woman-killed-in-9-vehicle-crash-in-sandy/,Poor Data Source -https://beaumonttexas.gov/beaumont-police-investigating-homicide-4300-woodlawn/,Poor Data Source -https://delcopa.gov/sustainability/pdf/raise/trailplanappendixe.pdf,Poor Data Source -https://www.mass.gov/doc/chaves-david-v-boston-police-department-related-superior-court-order-42711/download,Court Cases -https://www.ci.vallejo.ca.us/our_city/departments_divisions/police_department,Contact Info & Agency Meta -https://www.mass.gov/doc/shackford-michael-v-boston-police-department-72414/download,Court Cases -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/041422blotter.pdf,Poor Data Source -https://www.ci.san-bernardino.ca.us/city_hall/police_department/emergency_management/cert/cert_basic_training,Not Criminal Justice Related -https://beaumonttexas.gov/beaumont-police-investigating-aggravated-robbery-2568-college/,Poor Data Source -https://police.crystalmn.gov/police/community_outreach/run_for_leo,Misc Police Activity -https://wyoming.delaware.gov/wp-content/uploads/sites/33/nggallery/3rd-annual-wyoming-police-department-fishing-derby/p1010878.jpg,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/robbery-suspects-arrestd-and-charged/,Media Bulletins -https://www.huntsvilleal.gov/huntsville-police-launch-summer-slowdown-campaign/,Media Bulletins -https://ose.louisiana.gov/event/supervisor-of-police-records/,Poor Data Source -https://alpha.austin.gov/es/police-oversight/2021-03-05-7/,Poor Data Source -https://alpha.austin.gov/police-oversight/formal-complaint-follow-up-investigations/,Poor Data Source -http://www.ryepolice.us/logs/police-logs-for-4-8-20-4-15-20,Daily Activity Logs -http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested-and-charges-filed/,Media Bulletins -https://delcopa.gov/ich/resources/healthclinics.html,Not Criminal Justice Related -https://www.mass.gov/doc/revocation-establishment-and-merging-of-police-promotional-eligible-lists-4/download,Policies & Contracts -https://champaignil.gov/tag/coffee-with-a-cop/,Misc Police Activity -https://coloradosprings.gov/police-department/article/news/update-attempted-homicide-4300-block,Media Bulletins -https://www.sanramon.ca.gov/our_city/departments_and_divisions/police/srpd_calendar,Poor Data Source -https://alpha.austin.gov/es/police-oversight/formal-complaint-family-violence-involving-mental-illness-and-other-policy-violations/,Poor Data Source -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0765/,Poor Data Source -https://delcopa.gov/publicrelations/releases/2021/covid_vaccinebooster.html,Media Bulletins -https://ridgelandsc.gov/police-department/daily-crime-reports-may,Crime Maps & Reports -https://alpha.austin.gov/police-oversight/formal-complaints-de-escalation-of-potential/,Poor Data Source -https://delcopa.gov/courts/pdf/emergencyjudicialorders/fourthorderextendingstayofresidentialpropertyejectment.pdf,Court Cases -https://delcopa.gov/publicrelations/releases/2020/councilreforms.html,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested---charges-filed/,Media Bulletins -https://champaignil.gov/tag/champaign-police-officers/,Poor Data Source -https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-25-fitness-payment,Media Bulletins -https://delcopa.gov/planning/pdf/applicationforact247review.pdf,Not Criminal Justice Related -http://www.police.wallingfordct.gov/divisions/,Contact Info & Agency Meta -http://lafayettepolice.us/3391/census-2020,Not Criminal Justice Related -https://mattoon.illinois.gov/government/police-department/police-officer-hiring/,Training & Hiring Info -https://www.elburn.il.us/village-staff-directory/name/police-and-fire-emergencies/,Poor Data Source -http://lafayettepolice.us/3469/gis-zoning-maps,Not Criminal Justice Related -https://www.antioch.il.gov/event/police-and-fire-commission/,Poor Data Source -http://www.rocklin.ca.us/news/rocklin-appoints-police-chief-chad-butler-interim-city-manager,Media Bulletins -https://www.rentonwa.gov/city_hall/police/administrative_services/community_programs/renton_police_safe_place,Resources -https://police.greenvillesc.gov/1757/reserve-a-conference-room,Not Criminal Justice Related -https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/march-16-activity-report/,Incident Reports -https://alpha.austin.gov/police-oversight/formal-complaint-acts-bringing-discredit-4/,Poor Data Source -https://coloradosprings.gov/police-department/page/colorado-springs-police-cadet-program-0,Resources -https://delcopa.gov/employment/jobpostings/dba.html,Not Criminal Justice Related -https://champaignil.gov/2020/08/18/chief-of-police-anthony-cobb-issues-statement-regarding-vandalism-of-champaign-police-department/,Media Bulletins -https://champaignil.gov/police/news-data/police-body-cameras/,Media Bulletins -https://biloxi.ms.us/podcast/meet-biloxi-police-fire-at-a-fun-event/,Poor Data Source -https://delcopa.gov/planning/planningeducation.html,Not Criminal Justice Related -https://claytonca.gov/police/community-youth-outreach/smart911/,Media Bulletins -https://www.arlingtonva.us/government/programs/housing/housing-arlington-latest-news/county-board-reviews-scope-and-charge-for-missing-middle-housing-study,Not Criminal Justice Related -http://lafayettepolice.us/1693/fountain-plaza-and-sculptures,Not Criminal Justice Related -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0716/,Poor Data Source -https://sanramon.ca.gov/our_city/departments_and_divisions/police/community_programs/youth_services/police_explorers,Misc Police Activity -http://lafayettepolice.us/455/aquatics,Not Criminal Justice Related -http://police.portlandmaine.gov/396/tickets,Contact Info & Agency Meta -https://www.normanok.gov/public-safety/police-department/divisions/investigations/registered-offenders,Resources -https://delcopa.gov/vote/pdf/2021/delcoboardelections_meeting_legalnotice_0407-2021.pdf,Not Criminal Justice Related -https://www.mooresville.in.gov/event/mpd-police-commission-meeting-3/,Poor Data Source -https://coloradosprings.gov/city-council/article/public-notice/police-cso-graduation,Media Bulletins -https://www.coppelltx.gov/340/get-involved,Resources -https://alpha.austin.gov/es/police-oversight/2020-08-14-3/,Poor Data Source -https://www.knoxvilletn.gov/archived_news_stories/2010/knoxville_police_prepared_for_increase_of_holiday_,Media Bulletins -http://www.lafayettepolice.us/faq.aspx?qid=142,Not Criminal Justice Related -https://police.kingstontn.gov/events/categories/,Poor Data Source -https://www.plymouthmi.gov/government/departments/police/preliminary_breath_tests,Contact Info & Agency Meta -https://www.minneapolismn.gov/government/departments/police/professional-standards/discipline-matrix/,Policies & Contracts -https://cityofpowell.us/powell-police-searching-for-suspect-after-attempted-home-robbery/41-3/,Poor Data Source -https://ci.san-bernardino.ca.us/city_hall/police_department/online_reports,Poor Data Source -https://delcopa.gov/treasurer/pdf/2021reassessmentvalues/03.pdf,Poor Data Source -https://delcopa.gov/publicrelations/releases/2019/domesticviolenceawareness.html,Media Bulletins -https://virginiabeach.gov/whats-up/whats-new/commonwealth-v-nathaniel-lee-campbell-maximum-sentence-of-10-years-for-man-who-killed-military-police-officer-in-crash,Media Bulletins -http://www.lafayettepolice.us/759/burn-leaves-on-a-city-street,Media Bulletins -https://cityofpowell.us/government/employment-opportunities/police-officer-selection-process/,Training & Hiring Info -https://www.normanok.gov/public-safety/police-department/community-outreach/citizens-police-academy,Poor Data Source -https://www.dps.arkansas.gov/law-enforcement/arkansas-state-police/divisions/crimes-against-children/,Contact Info & Agency Meta -http://lafayettepolice.us/3532/schools-out-day-camps,Media Bulletins -https://www.lasalle-il.gov/shared-police-services-committee-4,Poor Data Source -https://www.minneapolismn.gov/government/programs-initiatives/community-safety/focus-areas/alternatives-police-response/new-pilot-response/,Policies & Contracts -https://delcopa.gov/purchasing/bidsprops/cp081921_addendum4.pdf,Poor Data Source -https://www.mass.gov/doc/summary-results-of-recent-lead-and-copper-drinking-water-testing-at-massachusetts-schools/download,Not Criminal Justice Related -http://www.cityofpataskalaohio.gov/city-of-pataskala-careers/ordinance-2021-4399-exhibit-a-full-time-police-clerk-2/,Poor Data Source -https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/july-2021-activity-report/,Crime Maps & Reports -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/072521blotter.pdf,Dispatch Logs -https://delcopa.gov/publicrelations/releases/2021/deppublichearing_0922.html,Not Criminal Justice Related -http://www.lafayettepolice.us/1716/emu,Not Criminal Justice Related -https://www.coppelltx.gov/530/virtual-recreation,Poor Data Source -https://coloradosprings.gov/police-department/article/news/shooting-investigation-1800-block-monterey,Media Bulletins -https://www.antioch.il.gov/wpfb-file/01-14-14-police-and-fire-agenda-pdf-2/,Poor Data Source -https://www.gov.ca.gov/2022/02/27/governor-newsom-statement-on-death-of-salinas-police-officer-2-27-22/,Media Bulletins -https://www.southamptontownnypolice.gov/1446/hampton-resorts-atlantic-hotel-ia-system,Not Criminal Justice Related -https://delcopa.gov/departments/emergencyservices.html,Not Criminal Justice Related -https://www.roundrocktexas.gov/news/police-arrest-two-suspects-series-vehicle-burglaries/,Media Bulletins -https://www.coronadelmar.us/residents-show-support-for-the-newport-beach-police-department-media-4/,Poor Data Source -https://santabarbaraca.gov/government/departments/police-department/funciones-miscelaneos,Misc Police Activity -https://www.antioch.il.gov/wpfb-file/04-08-14-police-pension-agenda-pdf-3/,Poor Data Source -http://www.ryepolice.us/event/makn-llc-dba-mission-portsmouth,Not Criminal Justice Related -https://www.kenedytx.gov/2022/04/18/kenedy-police-departments-k9-robbie-to-get-donation-of-body-armor/,Media Bulletins -http://www.lafayettepolice.us/873/fire-stopping,Not Criminal Justice Related -https://www.antioch.il.gov/wpfb-file/04-10-18-police-and-fire-agenda-pdf/,Poor Data Source -http://lafayettepolice.us/2144/events,Not Criminal Justice Related -https://delcopa.gov/vote/pdf/2021/minutes01_15_2021.pdf,Poor Data Source -https://delcopa.gov/planning/pubs/osrgp/vol-iii_chapter7uplandcountypark.pdf,Not Criminal Justice Related -https://cityofyuma.colorado.gov/departments/emergency-services/police-department/police-department-staff,Personnel Records -https://www.mass.gov/doc/mptc-police-standards-subcommittee-open-meeting-notice-060821/download,Policies & Contracts -https://delcopa.gov/vote/candidatelist.html,Not Criminal Justice Related -https://delcopa.gov/purchasing/bidsprops/delcomicrowavekmz.zip,Not Criminal Justice Related -https://www.mass.gov/doc/woburnpolicelieutenant5802rtf/download,Training & Hiring Info -https://delcopa.gov/employment/jobpostings/communityengagementspecialist.html,Training & Hiring Info -https://police.crystalmn.gov/g_o_v_e_r_n_m_e_n_t/departments_a-_z/administration,Contact Info & Agency Meta -https://coloradosprings.gov/police-department/article/news/public-assistance-needed-identify-sexual,Media Bulletins -https://delcopa.gov/publicrelations/releases/2019/girlsspark.html,Not Criminal Justice Related -https://www.providenceri.gov/providence-police-department-deploy-axon-2-body-worn-cameras/police-body-camera/,Poor Data Source -https://southamptontownnypolice.gov/1/home,Not Criminal Justice Related -http://police.portlandmaine.gov/638/nathan-clifford-re-use-advisory-task-for,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality---palo-verde-ave-and-los-coyotes-diagonal/,Media Bulletins -https://www.southamptontownnypolice.gov/442/community-preservation-advisory-board,Media Bulletins -https://spdblotter.seattle.gov/2015/03/24/police-arrest-suspect-in-violent-robbery-at-rainier-beach-doughnut-shop/,Media Bulletins -https://delcopa.gov/treasurer/forms/2023appealformscommercial.pdf,Poor Data Source -https://www.lynchburgvapolice.gov/wp-content/uploads/2021/03/dsc0161-scaled.jpg,Poor Data Source -http://www.longbeach.gov/police/press-releases/traffic-fatality-pacific-coast-highway-and-lime-avenue/,Media Bulletins -https://alpha.austin.gov/police-oversight/2020-11-12/,Poor Data Source -http://www.longbeach.gov/police/press-releases/arrests-made-in-two-robberies--charges-filed/,Media Bulletins -http://www.lafayettepolice.us/list.aspx,Resources -https://www.coppelltx.gov/faq.aspx?qid=432,Resources -https://www.hayward-ca.gov/discover/news/may21/hayward-police-department-maintains-national-law-enforcement-accreditation-calea,Media Bulletins -https://delcopa.gov/council/2019minutes/111319minutes.pdf,Not Criminal Justice Related -https://www.lynchburgvapolice.gov/wp-content/uploads/2022/02/cotw-1-e1644350006495.jpg,Poor Data Source -https://www.stcharlesil.gov/news/2021/04/01/welcome-new-police-officers,Media Bulletins -https://alpha.austin.gov/en/police-oversight/written-reprimand-of-officer-david-lara/,Poor Data Source -http://www.longbeach.gov/police/press-releases/suspect-arrested-for-murder-of-high-school-student/,Media Bulletins -https://alpha.austin.gov/es/police-oversight/formal-complaint-purpose-and-scope-and-other-policy-violations-9/,Poor Data Source -https://www.hermonmaine.gov/departments/police-department/gallery/,Poor Data Source -https://delcopa.gov/departments/recorderofdeeds.html,Contact Info & Agency Meta -https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-8/,Poor Data Source -https://www.tukwilawa.gov/event/virtual-town-hall-with-chief-of-police/,Poor Data Source -https://www.coppelltx.gov/faq.aspx?qid=119,Resources -http://www.longbeach.gov/police/,Contact Info & Agency Meta -https://www.warracres-ok.gov/police-department-history/warr-acres-pd-first-patch/,Poor Data Source -https://police.greenvillesc.gov/faq.aspx?qid=382,Not Criminal Justice Related -https://www.southamptontownnypolice.gov/faq.aspx?qid=421,Not Criminal Justice Related -https://ose.louisiana.gov/event/police-sergeant-18/,Poor Data Source -https://www.providenceri.gov/officer-louis-salinaro-k-9-gero-locate-apprehend-subject-wanted-police-hiding-basement/press-release-k9/,Poor Data Source -http://www.ryepolice.us/logs/police-logs-11-09-22-11-15-22,Daily Activity Logs -https://delcopa.gov/planning/pubs/connectivityranking.pdf,Not Criminal Justice Related -https://www.sandiego.gov/department-document/commission-police-practices-members-psln-committee-re-list-recommendations,Resources -https://www.stpaul.gov/departments/police/21st-century-policing-report/pillar-1-trust-and-legitimacy/report-7,Media Bulletins -https://www.grovecityohio.gov/division-of-police/coin-survey/,Not Criminal Justice Related -https://www.antioch.il.gov/wpfb-file/11-16-10-police-pension-fund-agenda-pdf-4/,Poor Data Source -http://www.longbeach.gov/globalassets/police/media-library/images/press-releases/2015/thumb_bobbysketch-.jpg,Poor Data Source -http://www.longbeach.gov/police/press-releases/robbery-suspects-arrested--charged/,Media Bulletins -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0372/,Poor Data Source -https://champaignil.gov/tag/police-continue-to-seek-suspect-in-september-12-bank-robbery-regions-bank/,Media Bulletins -https://www.dps.arkansas.gov/law-enforcement/arkansas-state-police/directors-office/asp-commission/,Contact Info & Agency Meta -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0455/,Poor Data Source -https://coloradosprings.gov/police-department/page/investigations-division,Poor Data Source -https://www.rentonwa.gov/city_hall/police/investigations/domestic_violence/cycle_of_violence,Media Bulletins -https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2019_news_releases/release_of_sex_offender_into_community_-_navarro,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/091421arrests.pdf,Arrest Records -https://data.charlottenc.gov/datasets/cmpd-police-wrecker-zones,Poor Data Source -http://www.lafayettepolice.us/614/find,Resources -http://www.longbeach.gov/police/press-releases/lbpd-joins-crackdown-on-texting---hand-held-cell-use-behind-the-wheel/,Media Bulletins -https://www.ashevillenc.gov/wp-content/uploads/2019/03/crime-scene-investigation-police2.jpg,Poor Data Source -https://champaignil.gov/2019/09/29/champaign-police-investigating-shooting-2/,Media Bulletins -https://alpha.austin.gov/en/police-oversight/community-police-review-commission-memo-2019-0267/,Poor Data Source -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-1022/,Poor Data Source -https://spdblotter.seattle.gov/2012/08/03/seattle-neighborhood-group-and-seattle-police-department-team-up-to-tackle-graffiti-in-little-saigon/,Media Bulletins -https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scope-and-other-policy-violations-9/,Complaints & Misconduct -https://normandyparkwa.gov/city-news/police-department/happy-thanksgiving/,Not Criminal Justice Related -https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-1/,Complaints & Misconduct -https://www.hendersonvillenc.gov/police-department/information-crime-safety-tips/winter-safety-tips,Poor Data Source -https://www.mass.gov/doc/notification-of-copper-algaecide-application/download,Not Criminal Justice Related -https://champaignil.gov/2010/05/04/champaign-police-celebrates-olympic-champion/,Not Criminal Justice Related -https://alpha.austin.gov/es/police-oversight/2020-08-10-3/,Complaints & Misconduct -http://lafayettepolice.us/765/request-a-report,Not Criminal Justice Related -https://www.antioch.il.gov/event/police-fire-commission-cancelled/,Not Criminal Justice Related -https://www.lynchburgvapolice.gov/wp-content/uploads/2021/06/lpd-seal-e1662580813573.png,Poor Data Source -https://osp.maryland.gov/2020/01/17/january-17-2020-greensboro-police-chief-pleads-guilty-to-misconduct-in-office/,Media Bulletins -https://ci.new-hope.mn.us/city_hall/police_department/records_division/temporary_permit_to_purchase_procedure,Poor Data Source -https://www.austintexas.gov/blog/good-police-work,Media Bulletins -http://sheriff.co.seneca.ny.us/the-department/copy-of-biography-the-chief-deputy-2/,Contact Info & Agency Meta -https://hollister.ca.gov/government/city-departments/police/,List of Data Sources -https://delcopa.gov/courts/juvenilecourt/upperdarbyprobation.html,Contact Info & Agency Meta -http://www.ryepolice.us/wp-content/uploads/lynch_dan.jpg,Poor Data Source -https://delcopa.gov/council/2017minutes/012517minutes.pdf,Not Criminal Justice Related -https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-46/,Complaints & Misconduct -https://champaignil.gov/tag/police-request-community-assistance-in-fatal-shooting-investigation/,Media Bulletins -https://alpha.austin.gov/es/police-oversight/community-feedback-and-final-recommendations-ban-chokeholds-and-strangleholds/,Poor Data Source -https://coloradosprings.gov/police-department/article/calendar-event/holiday-hill,Misc Police Activity -https://www.naperville.il.us/services/naperville-police-department/community-education-and-crime-prevention/paws-on-patrol/,Resources -https://www.police.wallingfordct.gov/careers/current-employment-opportunities/,Resources -https://www.coppelltx.gov/376/command-staff,Contact Info & Agency Meta -https://alpha.austin.gov/es/police-oversight/8-26-20-3/,Complaints & Misconduct -https://coloradosprings.gov/police-department/article/news/officer-involved-shooting-i25-and-north,Media Bulletins -https://www.arlingtontx.gov/news/my_arlington_t_x/news_stories/police_chief_al_jones,Media Bulletins -https://www.sandiego.gov/risk-management/flexible-benefits/fbp-police-safety-members-fy2022,Policies & Contracts -https://hamiltonma.gov/events/event/police-training-gun-club-3/,Poor Data Source -https://brookfieldil.gov/2021-04-28-regular-police-pension-board-meeting-agenda-for-posting/,Poor Data Source -http://www.longbeach.gov/police/press-releases/charges-filed-on-carjacking-suspect--a-convicted-felon-on-post-release-community-supervision/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-1300-block-of-wesley-drive/,Media Bulletins -http://www.longbeach.gov/police/press-releases/this-labor-day-and-every-day-drive-sober-or-get-pulled-over/,Media Bulletins -https://coloradosprings.gov/police-department/article/news/fatal-crash-marksheffel-road-and-dublin-0,Media Bulletins -https://www.roundrocktexas.gov/city-departments/police/divisions/training-division/,Contact Info & Agency Meta -https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0486/,Complaints & Misconduct -https://alpha.austin.gov/government-business/connect-with-city/contribute-to-police-oversight/complaint-process/,Policies & Contracts -https://delcopa.gov/sheriff/realestate.html,Not Criminal Justice Related -https://delcopa.gov/publicrelations/releases/2021/pdf/phonescam.pdf,Not Criminal Justice Related -https://www.ci.rohnert-park.ca.us/city_hall/departments/development_services/copy_of_downtown/demo_downtown_news,Not Criminal Justice Related -https://townofcampbellwi.gov/public-safety/police/contact-an-officer/,Contact Info & Agency Meta -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/080421arrests.pdf,Arrest Records -https://whitestown.in.gov/news/whitestown-police-detectives-arrest-local-man-on-child-molestation-charges/,Media Bulletins -http://lafayettepolice.us/456/special-events,Not Criminal Justice Related -https://www.clarkstown.gov/police/surveillance-camera-registration/,Resources -https://delcopa.gov/publicrelations/releases/2022/delcoartsweek.html,Not Criminal Justice Related -https://spdblotter.seattle.gov/2013/05/02/mayor-council-signal-intent-to-site-and-build-new-police-station-for-north-precinct/,Media Bulletins -https://www.coronadelmar.us/safes-cash-pricey-watches-and-jewelry-police-documents-reveal-items-stolen-in-rash-of/,Media Bulletins -https://www.knoxvilletn.gov/government/mayors_office/c_o_v_i_d-19___coronavirus_/stress_and_coping/knox_well/kid___parent_resources/general_adult_resources,Resources -https://oceancitymd.gov/oc/ocean-city-police-captain-austin-retires-after-31-years-of-service/,Media Bulletins -https://www.rolesvillenc.gov/police,Contact Info & Agency Meta -https://www.prescott-az.gov/services-safety/police/reporting/accident-reports-on-line/,Contact Info & Agency Meta -https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-40/,Complaints & Misconduct -https://delcopa.gov/controller/pdf/2020/dccwfinal-signed.pdf,Not Criminal Justice Related -https://www.antioch.il.gov/wpfb_file_category/commissions-police-and-fire-commission-agendas-2014-commissions-police-and-fire-commission-agendas-commissions-police-and-fire-commission-commissions/,Poor Data Source -https://alpha.austin.gov/es/police-oversight/2020-06-12-11/,Complaints & Misconduct -http://www.lafayettepolice.us/214/application-process,Policies & Contracts -https://www.knightdalenc.gov/departments/police/crime-prevention/crime-stoppers,Contact Info & Agency Meta -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0255/,Complaints & Misconduct -https://www.sandiego.gov/department-document/commission-police-practices-makes-recommendations-san-diego-police-department%e2%80%99s,Policies & Contracts -https://www.casperwy.gov/news/news/newsroom/casper_police_officer_involved_shooting,Poor Data Source -http://www.ryepolice.us/logs/police-logs-for-8-8-18-8-14-18,Dispatch Logs -https://delcopa.gov/planning/programsandinitiatives/heritagecommission/upcomingevents.html,Not Criminal Justice Related -https://www.mass.gov/doc/municipal-police-training-committee-mptc-open-meeting-notice-061522/download,Media Bulletins -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-1002/,Poor Data Source -https://www.sandiego.gov/police/contact,Contact Info & Agency Meta -https://delcopa.gov/publicrelations/releases/2021/votebymail1018.html,Not Criminal Justice Related -https://dps.iowa.gov/dci-and-ames-police-department-investigate-suspicious-death,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-checkpoint/,Media Bulletins -https://training.detroitmi.gov/departments/police-department/project-green-light-detroit/agreements,Media Bulletins -https://www.antioch.il.gov/wpfb-file/10-11-11-police-and-fire-agenda-pdf-5/,Poor Data Source -http://cityofcanalfulton-oh.gov/police-department-hiring-entry-level-police-officer/,Training & Hiring Info -https://police.crystalmn.gov/r_e_s_i_d_e_n_t/public_works,Not Criminal Justice Related -https://www.ci.plymouth.mi.us/government/departments/police/history,Not Criminal Justice Related -https://rexburg.us/police-ask-for-help-finding-man-who-left-for-work-and-hasnt-been-seen-since/,Media Bulletins -https://spdblotter.seattle.gov/2014/12/17/police-increasing-patrols-after-early-morning-gunfire-near-south-seattle-school/,Media Bulletins -https://coloradosprings.gov/police-department/article/news/multiple-arrests-internet-crimes-against,Media Bulletins -https://www.lynchburgvapolice.gov/news-updates/2124/,Media Bulletins -https://www.mass.gov/event/2022-pittsfield-police-department-open-house-5-pm-2022-01-11t170000-0500-2022-01-11t180000-0500,Resources -https://brookfieldil.gov/publication/july-1-2020-board-of-fire-and-police-commissioners/,Poor Data Source -https://delcopa.gov/sustainability/pdf/raise/potentialeconomicimptwaterfront.pdf,Not Criminal Justice Related -https://www.providenceri.gov/police/explorers-program/attention/,Poor Data Source -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/021121summary.pdf,Dispatch Logs -https://piedmont.ca.gov/services___departments/police/services/social_media,Contact Info & Agency Meta -https://gonzalesca.gov/services/police/how-do-i/learn-what-crime-rate-gonzales,Resources -https://council.seattle.gov/2022/08/19/west-seattle-bridge-police-recruitment-and-incentives-bill-passes-abortion-access-bill-signing-metropolitan-parks-district-public-hearing-small-tenant-improvement-fund-seattle-restored-program/,Policies & Contracts -https://estespark.colorado.gov/departments/police/operations/patrol/code-enforcement/report-a-potential-code-violation,Not Criminal Justice Related -https://oceancitymd.gov/oc/worcester-county-law-enforcement-agencies-to-co-host-citizens-police-academy/,Misc Police Activity -https://delcopa.gov/ich/pdfs/covid_govwolf_march12.pdf,Not Criminal Justice Related -http://www.longbeach.gov/police/news/south-division-forum/,Media Bulletins -https://delcopa.gov/departments/heatplan/heatsafetytips.pdf,Media Bulletins -"https://norfolkne.gov/government/departments/police-division/press-releases/march-11,-2021-press-release.html",Media Bulletins -https://www.newhopemn.gov/news___features/now_recruiting_police_reserves,Training & Hiring Info -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/arrests/083022arrests.pdf,Arrest Records -https://rockfordil.gov/police-lgbtqia-liaison/,Contact Info & Agency Meta -https://www.sandiego.gov/police/community,Resources -https://www.naperville.il.us/services/naperville-police-department/programs-and-services/fingerprinting/,Resources -https://spdblotter.seattle.gov/2013/02/25/if-you-see-a-handcuffed-man-walking-around-near-harborview-give-police-a-call/,Media Bulletins -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0421/,Poor Data Source -https://coloradosprings.gov/police-department/page/falcon-division,Contact Info & Agency Meta -https://wyoming.delaware.gov/police-department/policedepartmentapplication2017/,Training & Hiring Info -http://lafayettepolice.us/149/departments-a---f,Contact Info & Agency Meta -https://delcopa.gov/sustainability/sustainabilityplan.html,Not Criminal Justice Related -https://hollister.ca.gov/government/city-departments/police/,Contact Info & Agency Meta -https://spdblotter.seattle.gov/2022/05/26/police-arrest-one-seize-gun-drugs-cash-downtown-thursday-evening/,Media Bulletins -http://www.longbeach.gov/police/press-releases/l-b-p-d--receives-grant-for-special-traffic-enforce----crash-prevention/,Media Bulletins -https://ci.san-bernardino.ca.us/city_hall/police_department/public_safety/traffic_safety_programs/alpr_statistics,Poor Data Source -https://www.knoxvilletn.gov/government/city_departments_offices/police_department/field_operations_bureau/community_partnership_officers/c_p_t_e_d_security_surveys,Resources -https://www.mass.gov/news/environmental-police-officer-ab-exam-update,Training & Hiring Info -https://coloradosprings.gov/tag/police,Media Bulletins -https://www.lasalle-il.gov/departments/police-department,Contact Info & Agency Meta -https://www.sandiego.gov/event/community-coffee-cop,Poor Data Source -https://www.mass.gov/doc/police-standards-subcommittee-open-meeting-notice-agenda/download,Poor Data Source -https://www.dps.nm.gov/blog/2022/04/12/update-cancel-silver-alert-belen-nm-sally-krieger-has-been-located-and-is-safe-please-refer-all-inquiries-and-questions-to-belen-police-department-at-505-865-9130/,Media Bulletins -http://www.longbeach.gov/press-releases/jason-campbell-appointed-police-administration-bureau-chief/,Media Bulletins -http://www.tampa.gov/news/tampa-police-work-identify-battery-suspect-64991,Media Bulletins -https://cityofgulfbreeze.us/departments/police/faqs-2/,Resources -https://spdblotter.seattle.gov/2014/03/08/citizens-respond-to-a-woman-in-distress-and-hold-down-robbery-suspect-until-police-arrive/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-anaheim-st-and-long-beach-blv/,Media Bulletins -http://www.longbeach.gov/police/press-releases/sexual-assault-suspect-arrested--additional-victims-sought/,Media Bulletins -https://delcopa.gov/publicrelations/releases/2019/pdf/nationalcrimevictimsrightsweekeventflyer2019.pdf,Poor Data Source -https://www.rolesvillenc.gov/police/frequently-asked-questions,Contact Info & Agency Meta -https://ethics.ny.gov/news/jcope-settles-lobbyist-alleged-lobbying-law-gift-violation,Media Bulletins -https://spdblotter.seattle.gov/2017/06/05/police-conducting-death-investigation-at-sr-509-encampment/,Media Bulletins -https://alpha.austin.gov/es/police-oversight/2020-06-4-8/,Poor Data Source -https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-22/,Poor Data Source -https://delcopa.gov/publicrelations/releases/2020/votingdemo_canceled.html,Media Bulletins -https://delcopa.gov/publicrelations/releases/2018/jurorphonesscam.pdf,Media Bulletins -https://www.waynesvillenc.gov/departments/police/about-us,Contact Info & Agency Meta -https://beaumonttexas.gov/beaumont-police-investigating-fatality-accident-2400-block-of-s-mlk/,Poor Data Source -https://www.knoxvilletn.gov/government/city_departments_offices/police_department/management_services_bureau/recruitment_job_opportunities/basic_info_for_becoming_a_police_cadet,Training & Hiring Info -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0103/,Poor Data Source -http://www.ryepolice.us/pressrelease/pioneer-rd-closed-due-to-crash,Not Criminal Justice Related -http://www.lafayettepolice.us/faq.aspx?qid=183,Not Criminal Justice Related -https://riag.ri.gov/press-releases/state-federal-and-law-enforcement-leaders-announce-16-million-grants-police,Media Bulletins -https://www.stmatthewsky.gov/police/srt-vehicle/,Poor Data Source -https://www.ci.corcoran.mn.us/public_services/police/training_and_safety/emergency_preparedness_guide,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/traffic-fatality-artesia-and-myrtle1/,Media Bulletins -http://www.ryepolice.us/logs/police-logs-for-71316-71916,Daily Activity Logs -http://www.longbeach.gov/police/press-releases/dui-checkpoint-proves-effective-4-/,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/111522blotter.pdf,Poor Data Source -https://www.huntsvilleal.gov/videos/huntsville-police-departments-captain-mccarver-lets-grow-together/,Poor Data Source -http://www.ryepolice.us/pressrelease/positive-covid-19-case-at-rye-recycling-center/attachment/ryerecyclecase-2020-dhhs-edits-covid-09282020,Not Criminal Justice Related -https://police.greenvillesc.gov/313/trails-bikes,Not Criminal Justice Related -http://www.lafayettepolice.us/851/fire-resistance-rated-construction,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/arrests-made-in-murder-case/,Media Bulletins -https://cityoflakewood.us/police-homepage/lakewood-police-apply-for-a-job/,Poor Data Source -http://lafayettepolice.us/3547/e-sports,Not Criminal Justice Related -https://www.lynchburgvapolice.gov/news-updates/update-child-found-wandering-on-linkhorne-road-mother-located/,Media Bulletins -https://spdblotter.seattle.gov/2019/07/25/police-arrest-suspected-heroin-dealer-arrested-downtown/,Media Bulletins -https://spdblotter.seattle.gov/2021/08/19/police-arrest-woman-for-violating-court-order-protecting-mayor-durkan/,Media Bulletins -http://www.police.wallingfordct.gov/police-station-project/,Contact Info & Agency Meta -https://www.floresvilletx.gov/departments/police/complaints-commendations/,Contact Info & Agency Meta -https://delcopa.gov/ojs/efileforms/court admin forms for efile/writofexecutionnotice.pdf,Poor Data Source -http://www.longbeach.gov/police/press-releases/police-seek-public-s-help-with-identifying-financial-crimes-suspect/,Media Bulletins -https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2019_news_releases/coffee_with_a_cop,Media Bulletins -https://police.greenvillesc.gov/599/paratransit-information,Not Criminal Justice Related -https://www.fultoncountyga.gov/news/2021/07/23/fulton-county-police-observe-national-night-out,Media Bulletins -https://www.sandiego.gov/department-document/march242009100-16th-streetaudioofficer-k-copeland-walkthroughredactedkmwav,Misc Police Activity -https://delcopa.gov/publicrelations/releases/2020/babyitempickup_june19.html,Not Criminal Justice Related -https://broadview-il.gov/events/police-and-fire-committee-meeting/,Poor Data Source -https://jamestownnd.gov/event/public-works-police-fire-committees-2-2023-06-22/,Poor Data Source -https://police.birminghamal.gov/command-staff/captains/,Contact Info & Agency Meta -http://www.longbeach.gov/police/press-releases/long-beach-police-seeking-the-public-s-help-in-identifying-armed-robbery-suspect---video-footage-available--/,Media Bulletins -http://lafayettepolice.us/316/housing-information-and-application,Not Criminal Justice Related -https://spdblotter.seattle.gov/2020/05/30/police-respond-to-protests-property-damage-arrest-seven/,Media Bulletins -https://southamptontownnypolice.gov/205/adopt-a-planting-program,Not Criminal Justice Related -https://townofpaonia.colorado.gov/paonia-police-department-employment-application,Training & Hiring Info -https://delcopa.gov/controller/pdf/2017andolder/sheriffaudit2017.pdf,Policies & Contracts -http://www.longbeach.gov/police/press-releases/holiday-toy-drive-collection/,Media Bulletins -https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0825/,Poor Data Source -https://police.greenvillesc.gov/faq.aspx?qid=445,Poor Data Source -https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/january-2020-activity-report/,Annual & Monthly Reports -https://delcopa.gov/sustainability/conference.html,Not Criminal Justice Related -https://www.wakeforestnc.gov/police/crime-prevention/reporting-suspicious-activity,Resources -https://ose.louisiana.gov/event/police-sergeant-80/,Contact Info & Agency Meta -https://pittsburghpa.gov/files/police/orders/ch6/68-02-grafitti-tracking-system.pdf,Poor Data Source -http://www.tampa.gov/events/national-coffee-cop-day/105796,Poor Data Source -"https://norfolkne.gov/government/departments/police-division/press-releases/april-27,-2021-press-release.html",Media Bulletins -https://police.birminghamal.gov/wp-content/uploads/2020/01/dsc_2278-225.jpg,Poor Data Source -https://delcopa.gov/vote/pdf/2021/delco_boe-meeting-notice_04-28-2021.pdf,Not Criminal Justice Related -https://delcopa.gov/vote/becomingapollworker.html,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/undetermined-death-investigation-2-/,Media Bulletins -https://ci.san-bernardino.ca.us/city_hall/police_department/crime_statistics/about_ucr_statistics/part_2_crimes,Poor Data Source -https://police.greenvillesc.gov/2025/project-safe-neighborhoods,Resources -https://delcopa.gov/publicrelations/releases/2022/pdf/vetresourcefair.pdf,Not Criminal Justice Related -http://www.ryepolice.us/event/annies-angels-rye-by-the-sea-duathlon-2,Not Criminal Justice Related -https://southamptontownnypolice.gov/faq.aspx?qid=437,Resources -https://frederica.delaware.gov/2016/06/27/ad-for-part-time-police-office/townoffred-50-121467-1/,Media Bulletins -https://www.knoxvilletn.gov/government/city_departments_offices/police_department/management_services_bureau/community_police_academy,Media Bulletins -https://www.southamptontownnypolice.gov/493/pump-out-boat-program,Not Criminal Justice Related -https://www.sandiego.gov/form/get-it-done-police,Contact Info & Agency Meta -https://www.minneapolismn.gov/government/departments/police/,Contact Info & Agency Meta -https://council.seattle.gov/2016/09/15/councilmember-johnsons-statement-on-the-north-precinct-police-station/,Not Criminal Justice Related -https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-29/,Poor Data Source -https://www.cityofrc.us/news/rancho-cucamonga-welcomes-new-police-chief,Media Bulletins -https://arcadia-fl.gov/departments/police/,Contact Info & Agency Meta -https://delcopa.gov/weightsmeasures/pdf/complaintform.pdf,Complaints & Misconduct -https://www.ci.san-bernardino.ca.us/city_hall/police_department/crime_statistics/about_ucr_statistics/arrest_statistics/arrest_statistics_-_2008,Crime Maps & Reports -https://www.mass.gov/doc/gardnerpolicelieutenant2374rtf/download,Training & Hiring Info -https://www.coronadelmar.us/newport-beach-police-department-issues-citations-for-selling-alcohol-to-minors/,Media Bulletins -https://www.sandiego.gov/police/news-center/cold-cases/sleiman-hallak,Wanted Persons -https://www.dps.arkansas.gov/news/settlement-agreement-in-civil-action-against-state-police/,Media Bulletins -https://cheswold.delaware.gov/2015/03/06/cheswold-police-department-dea-sponsoring-national-take-back-day-sept-27-2014/,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/murder3/,Media Bulletins -https://pharr-tx.gov/ngg_tag/pharr-police-department-athletic-league/,Not Criminal Justice Related -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/102821summary.pdf,Dispatch Logs -https://www.southamptontownnypolice.gov/faq.aspx?qid=249,Not Criminal Justice Related -https://delcopa.gov/heroin/tipsforprevention.html,Poor Data Source -https://www.woburnma.gov/government/police/police-records-request/arrest-records/,Arrest Records -http://www.longbeach.gov/police/press-releases/dui-saturation-patrol/,Media Bulletins -https://police.greenvillesc.gov/874/transparency-portal,Resources -http://www.longbeach.gov/police/press-releases/fatal-traffic-accident-1-/,Media Bulletins -https://coloradosprings.gov/police-department/page/commander-rigdon,Poor Data Source -https://lockhavenpa.gov/government/manager/personnel/lifeins_ft_police/,Not Criminal Justice Related -https://www.newarknj.gov/news/mayor-ras-j-barakas-statement-on-police-chief-darnell-henry,Media Bulletins -https://alpha.austin.gov/es/police-oversight/2020-09-17-08/,Poor Data Source -http://www.longbeach.gov/police/press-releases/k-9-officer-is-partnered-with-new-police-service-dog/,Media Bulletins -https://columbiacitypolice.us/documents/publiccomplaint.pdf,Complaints & Misconduct -https://www.southamptontownnypolice.gov/1695/2022-tentative-roll-assessment-rolls,List of Data Sources -https://www.corcoranmn.gov/public_services/police/press_releases_records_and_complaint_recognition/press_releases,List of Data Sources -http://lafayettepolice.us/1079/staff,Contact Info & Agency Meta -https://delcopa.gov/publicrelations/releases/2021/covid_countiesvaccinestatement.html,Not Criminal Justice Related -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0838/,Poor Data Source -http://www.longbeach.gov/police/about-the-lbpd/bureaus/investigations-bureau/detective-division/auto-theft-detail-and-t.r.a.p/,Resources -https://delcopa.gov/ich/resources/covid19/pdf/coronavirustestingifnohealthcareprovider.pdf,Poor Data Source -https://rocklandmaine.gov/police-department/officer-duhamel-promoted-to-patrol-sergeant/attachment/f45111ed-37de-4a3d-b8e7-099f09cad7fb-15/,Poor Data Source -https://www.madera.gov/wp-content/uploads/2016/05/madera-south-copy.jpg,Poor Data Source -https://www.fortworthtexas.gov/departments/police/public-safety/fw-pd-central-hemphill,Contact Info & Agency Meta -https://delcopa.gov/publicrelations/releases/2019/pdf/2019stateofthecounty.pdf,Media Bulletins -https://police.greenvillesc.gov/304/health-wellness,Not Criminal Justice Related -https://champaignil.gov/2010/08/05/champaign-police-hosts-pool-party-for-youth/,Media Bulletins -https://police.bixbyok.gov/faq.aspx?qid=79,Resources -https://spdblotter.seattle.gov/2018/12/02/theater-cancels-matinee-police-investigate-after-theater-employees-discover-threats-on-facebook/,Media Bulletins -https://www.mass.gov/info-details/audit-of-the-massachusetts-cultural-council-objectives-scope-and-methodology,Not Criminal Justice Related -https://www.montebelloca.gov/departments/police/services/pay_a_parking_ticket,Poor Data Source -https://delcopa.gov/publicrelations/releases/2020/covid_twoadditionaldeaths.html,Not Criminal Justice Related -https://www.foxcrossingwi.gov/foxcrossingwi.gov/police/,Annual & Monthly Reports -https://www.troyny.gov/photos-troy-community-commemorates-retirement-of-troy-police-chief-john-tedesco/,Poor Data Source -https://delcopa.gov/vetaffairs/forms/instructionsforfilingaclaim.pdf,Not Criminal Justice Related -https://www.littlerock.gov/media/5607/05-22-19-police.pdf,Media Bulletins -https://dccouncil.gov/judiciary-public-safety/copy-of-fb0-fy19-attachment-i-contracts-and-grants/,Policies & Contracts -https://northbrunswicknj.gov/wp-content/uploads/2020/09/national-police-week-2.jpg,Poor Data Source -https://www.coppelltx.gov/faq.aspx?qid=155,Not Criminal Justice Related -https://spdblotter.seattle.gov/2021/06/08/police-seize-five-firearms-following-crisis-call-arrest-man-for-earlier-drive-by-shooting/,Media Bulletins -http://www.longbeach.gov/police/press-releases/fatality-1-/,Media Bulletins -https://www.sandiego.gov/department-document/san-diego-kicks-community-conversations-about-next-police-chief,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-20-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality---palo-verde-ave-and-los-coyotes-diagonal/,Media Bulletins -https://norfolkne.gov/government/departments/police-division/press-releases/may-21st-press-release.html,Media Bulletins -https://alpha.austin.gov/police-oversight/formal-complaint-when-department-issued-bwc-system-use-is-required/,Poor Data Source -https://www.southamptontownnypolice.gov/1469/kenyatta-nash,Poor Data Source -https://www.elburn.il.us/police-department/,Personnel Records -https://ci.san-bernardino.ca.us/city_hall/police_department/contacting_sbpd,Contact Info & Agency Meta -http://www.tampa.gov/police/memorial/thank-you,Media Bulletins -http://www.longbeach.gov/police/press-releases/update---arrest-made-in-murder-5900-block-of-l-b--blvd-/,Media Bulletins -https://southamptontownnypolice.gov/1139/office-of-sustainability,Poor Data Source -https://police.bixbyok.gov/faq.aspx?qid=77,Resources -https://delcopa.gov/prison/pdfs/wardensreportapril2022.pdf,Poor Data Source -https://www.antioch.il.gov/wpfb-file/08-11-10-police-and-fire-commission-minutes-pdf/,Poor Data Source -https://delcopa.gov/planning/pdf/mapping/colwyn.pdf,Poor Data Source -http://www.ryepolice.us/logs/police-logs-for-1-9-19-1-15-19,Daily Activity Logs -https://champaignil.gov/police/news-data/traffic/,Contact Info & Agency Meta -https://www.minneapolismn.gov/resident-services/public-safety/police-public-safety/police-reports-and-data-requests/frequently-requested/critical-incidents/feb-2-2022-officer-involved-shooting/,Media Bulletins -http://www.tampa.gov/news/tampa-police-officer-killed-line-duty-66406,Media Bulletins -http://www.cityofpataskalaohio.gov/government/clerk-of-council/public-notices/advertisement-of-legislation-passed-september-5-2017-copy/,Not Criminal Justice Related -http://www.ryepolice.us/wp-content/uploads/scannerpd@town.rye_.nh_.us_20180430_142152_001.jpg,Media Bulletins -https://delcopa.gov/ich/resources/covid19/pdf/spcapressrelease.pdf,Not Criminal Justice Related -https://www.antioch.il.gov/wpfb-file/01-24-12-police-and-fire-agenda-pdf-5/,Poor Data Source -https://bouldercolorado.gov/events/police-chief-town-hall-person-virtual-1,Contact Info & Agency Meta -https://florence-ky.gov/police-department-easter-drive-thru/,Not Criminal Justice Related -https://health.wyo.gov/healthcarefin/chip/kid-care-chip-copays/providers-handout-light/,Not Criminal Justice Related -https://chandlerazpd.gov/2015/02/chandler-police-department-offering-non-emergency-text-messaging/,Media Bulletins -http://www.longbeach.gov/police/press-releases/graduation-and-summer-break-safety-tips-1-/,Resources -https://coloradosprings.gov/police-department/article/news/community-assistance-bank-robbery-suspects,Media Bulletins -https://coloradosprings.gov/police-department/article/news/motorcyclist-identified-fountain-boulevard,Media Bulletins -https://www.hickoryhillspd.us/2016/09/message-from-the-chief-of-police-2/,Media Bulletins -https://www.mass.gov/doc/01222016-dmf-scoping-meeting-scheduled-for-february-8-2016-potential-changes-to-summertime/download,Not Criminal Justice Related -https://police.birminghamal.gov/contacts/,Contact Info & Agency Meta -https://sanramon.ca.gov/police/victim,Resources -https://delcopa.gov/ich/resources/covid19/pdf/contactidentification.pdf,Poor Data Source -https://delcopa.gov/publicrelations/releases/2022/delcolaunchesfreefraudsleuthsoftwaretohelpfightpropertyfraud.html,Not Criminal Justice Related -https://spdblotter.seattle.gov/2022/08/26/police-investigating-fatal-shooting-on-aurora/,Media Bulletins -http://www.lafayettepolice.us/faq.aspx?qid=247,Training & Hiring Info -https://covington.va.us/city-government/city-departments/police/police-patrol/tfrydare/,Misc Police Activity -https://www.sandiego.gov/department-document/copy-resolution-no-79288,Not Criminal Justice Related -http://police.portlandmaine.gov/668/finance-committee,Not Criminal Justice Related -http://www.police.wallingfordct.gov/divisions/records-division/,Records Request Info -https://rocklandmaine.gov/events/police-review-committee-meeting-14/,Not Criminal Justice Related -https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-3/,Complaints & Misconduct -https://sanfordfl.gov/wp-content/uploads/2020/07/police_employment.jpg,Poor Data Source -"https://norfolkne.gov/government/departments/police-division/press-releases/january-12,-2022-press-release.html",Media Bulletins -https://dagsboro.delaware.gov/wp-content/blogs.dir/106/files/police-department/newpolicecars2008-001.jpg,Poor Data Source -https://www.ashevillenc.gov/news/asheville-police-be-a-connection-for-children-during-child-abuse-prevention-month/,Resources -https://policeanalysis.tucsonaz.gov/items/9fb161581d264cf99cc9e6da47dafa36,Poor Data Source -https://www.clintonvillewi.gov/government/departments/police/use_of_force_policies,Policies & Contracts -https://www.auburnwa.gov/city_hall/police/community_programs/crime_prevention/crime_prevention_through_environmental_design,Resources -https://www.newhopemn.gov/city_hall/police_department/community_services_crime_prevention,Resources -https://www.gurnee.il.us/events/2022/05/12/default-calendar/police-department-blood-drive,Misc Police Activity -https://delcopa.gov/courts/pretrialbail.html,Contact Info & Agency Meta -https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2017_archived_news/january_2017/citizens_can_help_police_keep_neighborhoods,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-7th-and-santiago/,Poor Data Source -https://police.bixbyok.gov/faq.aspx?qid=107,Not Criminal Justice Related -https://www.coronadelmar.us/nb-police-department-says-drive-sober-or-get-pulled-over/,Poor Data Source -https://spdblotter.seattle.gov/2016/03/31/police-investigating-two-overnight-shootings-in-rainier-valley/,Media Bulletins -http://www.longbeach.gov/police/press-releases/police-seek-additional-indecent-exposure-victims-1-/,Media Bulletins -https://delcopa.gov/vote/pdf/2022/mail-in-ballot-application_delco(spanish).pdf,Not Criminal Justice Related -https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-27/,Complaints & Misconduct -https://cityofpowell.us/police-agency/traffic-surveys/ridge-side-dr/,Not Criminal Justice Related -https://www.mass.gov/doc/walpolepolicelieutenant6835rtf/download,Training & Hiring Info -http://lafayettepolice.us/826/fire-blocking,Not Criminal Justice Related -https://spdblotter.seattle.gov/2021/05/04/police-arrest-two-felons-in-stolen-car-with-drugs-and-gun-in-cid/,Media Bulletins -https://delcopa.gov/planning/demodata/ridleyparkborough.html,Poor Data Source -https://chandlerazpd.gov/police-leadership/chris-perez/,Personnel Records -https://www.stpaul.gov/departments/police/level-ii-notifications,Resources -https://www.mass.gov/doc/plaza-justiniano-v-boston-police-department-related-superior-court-decision-81909/download,Court Cases -https://council.seattle.gov/2014/05/22/police-chief-confirmation-schedule-updated/,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/traffic-fatality9/,Media Bulletins -https://www.mass.gov/doc/cordeiro-jeffrey-v-boston-police-department-related-superior-court-decision-13111/download,Court Cases -https://www.stcharlesil.gov/departments/police/overview/tactical-response-unit-tru,Contact Info & Agency Meta -https://southamptontownnypolice.gov/206/printable-permit-applications,Not Criminal Justice Related -https://coloradosprings.gov/police-department/article/news/colorado-springs-police-department-0,Not Criminal Justice Related -https://www.clermontpolice.in.gov/post/traffic-alert-town-parade,Media Bulletins -https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/august-17-activity-report/,Annual & Monthly Reports -https://cityofvanalstyne.us/departments/police/emergency-preparedness/,Resources -https://beaumonttexas.gov/beaumont-police-investigating-aggravated-assault-400-block-of-giles/,Media Bulletins -https://champaignil.gov/2022/02/20/champaign-police-investigating-overnight-battery-shooting/,Media Bulletins -https://coloradosprings.gov/police-department/article/news/cspd-takes-part-calea-accreditation,Media Bulletins -https://www.stmatthewsky.gov/police/how-do-i-submit/,Records Request Info -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0264/,Complaints & Misconduct -https://johnstown.colorado.gov/news-article/johnstown-police-department-is-participating-in-7-11s-operation-chill,Media Bulletins -https://coloradosprings.gov/police-department/article/news/update-officer-involved-shooting,Media Bulletins -https://www.ashevillenc.gov/department/police/office-of-the-chief/submit-a-commendation/,Contact Info & Agency Meta -https://delcopa.gov/prison/21job.html,Misc Police Activity -https://www.austintexas.gov/content/firefighters-and-police-officers-and-emergency-medical-services-personnel-civil-service-commission-2013-meetings-page-1,Misc Police Activity -http://www.longbeach.gov/police/press-releases/felony-suspects-arrested-and-charged/,Media Bulletins -http://police.portlandmaine.gov/788/sound-oversight-committee,Misc Police Activity -https://www.lasalle-il.gov/shared-police-services-committee-0,Misc Police Activity -https://dps.georgia.gov/press-releases/2008-02-08/gsp-and-atlanta-police-announce-new-partnership,Poor Data Source -https://www.mass.gov/doc/emergencycarrulespromulgated02062008red-linedcopypdf/download,Not Criminal Justice Related -https://www.cityofauburnwa.gov/city_hall/police/dispute_resolution,Not Criminal Justice Related -https://southamptontownnypolice.gov/325/duties-responsibilities,Not Criminal Justice Related -https://icjia.illinois.gov/about/publications/a-profile-of-the-illinois-state-police-motor-vehicle-theft-intelligence-clearinghouse/,Poor Data Source -https://www.colma.ca.gov/documents/executive-assistant-chief-police/,Training & Hiring Info -https://delcopa.gov/publicrelations/releases/2020/votingsystemdemo.html,Not Criminal Justice Related -https://santabarbaraca.gov/press-releases/community-members-help-santa-barbara-police-apprehend-reckless-driver,Media Bulletins -https://www.southamptontownnypolice.gov/faq.aspx?qid=322,Not Criminal Justice Related -https://www.mass.gov/lists/don-northeast-endoscopy,Not Criminal Justice Related -https://delcopa.gov/prison/pdfs/dresscodevisitors2022.pdf,Poor Data Source -http://www.lafayettepolice.us/2067/residential-projects,Not Criminal Justice Related -https://southamptontownnypolice.gov/456/planning-policy-advisory-committee,Not Criminal Justice Related -https://www.sandiego.gov/police/news-center/cold-cases/carole-defleice,Poor Data Source -https://delcopa.gov/publicrelations/releases/2019/htf_communityday.html,Not Criminal Justice Related -http://lafayettepolice.us/1846/berlowitz-development-area-master-plan,Not Criminal Justice Related -https://champaignil.gov/police/about-us/recruitment/,Training & Hiring Info -https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0364/,Complaints & Misconduct -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/040921blotter.pdf,Dispatch Logs -http://www.ryepolice.us/wp-content/uploads/storm-preparedness-1.jpg,Not Criminal Justice Related -https://champaignil.gov/2013/11/25/champaign-police-respond-to-check-welfare-and-shots-heard-call-2000-block-of-cynthia-drive/,Media Bulletins -https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-4/,Complaints & Misconduct -http://www.longbeach.gov/police/news/$10-000-reward-issued-in-fatal-hit-and-run-case/,Media Bulletins -https://www.antioch.il.gov/wpfb-file/02-14-12-police-pension-agenda-pdf-5/,Poor Data Source -https://police.greenvillesc.gov/faq.aspx?qid=156,Poor Data Source -https://coloradosprings.gov/police-department/article/news/cspd-accident-alert-status-may-7-11-2021,Media Bulletins -https://dccouncil.gov/judiciary-public-safety/copy-of-fi0_fy19_attachment-i/,Not Criminal Justice Related -https://www.coppelltx.gov/268/cpr-aed-courses,Not Criminal Justice Related -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/062121summary.pdf,Dispatch Logs -https://police.bixbyok.gov/formcenter,Contact Info & Agency Meta -https://www.lynchburgvapolice.gov/wp-content/uploads/2022/02/id-2.png,Poor Data Source -https://spdblotter.seattle.gov/2017/10/27/police-recover-gun-stolen-car-and-arrest-two-prowlers/,Media Bulletins -https://delcopa.gov/courts/judges/scanlon.html,Not Criminal Justice Related -http://www.ryepolice.us/logs/police-logs-for-62817-7417,Calls for Service -https://www.east-windsor.nj.us/police-reports,Resources -https://www.ci.san-bernardino.ca.us/city_hall/police_department/records_bureau,Records Request Info -https://www.rosslynfarmspa.gov/police-activity-reports/november-police-activity-report-2021/,Annual & Monthly Reports -https://delcopa.gov/row/notices.html,Not Criminal Justice Related -https://www.pleasantprairiewi.gov/news/2022_news/police_and_fire_station_design_contracts,Poor Data Source -http://lafayettepolice.us/faq.aspx?qid=92,Media Bulletins -https://bolivar.mo.us/shop-with-a-copr/img_1198-2/,Poor Data Source -https://champaignil.gov/2012/10/25/life-as-a-police-officer/,Misc Police Activity -https://alpha.austin.gov/en/police-oversight/formal-complaint-acts-bringing-discredit-upon-the-department-and-employee-domestic-violence/,Poor Data Source -https://springfield-or.gov/city/police-department/open-data/,List of Data Sources -https://www.mass.gov/info-details/audit-of-the-norfolk-sheriffs-office-civil-process-division-objectives-scope-and-methodology,Resources -https://champaignil.gov/2019/05/11/police-investigating-two-overnight-shootings/,Media Bulletins -https://www.doj.state.or.us/venue/portland-police-bureau/,Contact Info & Agency Meta -https://www.mass.gov/doc/regional-assessment-center-initiative-memo-police-chief-and-deputy-police-chief-0/download,Policies & Contracts -https://www.mass.gov/info-details/audit-of-the-quinsigamond-community-college-foundation-objectives-scope-and-methodology,Not Criminal Justice Related -https://www.roseville.ca.us/government/departments/police_department/press_releases,Media Bulletins -https://ose.louisiana.gov/event/police-forensic-scientist-3/,Training & Hiring Info -https://detroitmi.gov/departments/police-department/detroit-police-department-shield-program/faith-based-partners,Resources -https://www.ci.rohnert-park.ca.us/i_want_to__/police_transparency,List of Data Sources -https://delcopa.gov/sustainability/pdf/raise/populationforecast-2015-2045_2016.pdf,Not Criminal Justice Related -https://cityofpowell.us/police-agency/traffic-surveys/traffic-survey-report-4-2-18-1/,Poor Data Source -https://spdblotter.seattle.gov/2019/06/22/police-arrest-man-in-greenwood-following-saturday-morning-stabbing/,Media Bulletins -https://delcopa.gov/council/2016minutes/062216minutes.pdf,Not Criminal Justice Related -https://police.birminghamal.gov/services/,Resources -https://www.stpaul.gov/departments/police/21st-century-policing-report/pillar-2-policy-and-oversight/report-4,List of Data Sources -https://www.coppelltx.gov/faq.aspx?qid=439,Not Criminal Justice Related -https://delcopa.gov/publicrelations/releases/2019/pdf/recoveryeventflyer.pdf,Not Criminal Justice Related -https://cityofmebanenc.gov/police-staff/officer-s-r-jones-min/,Poor Data Source -https://www.southamptontownnypolice.gov/786/2015-budgets,Not Criminal Justice Related -https://spdblotter.seattle.gov/2016/06/19/police-wound-knife-wielding-domestic-violence-suspect-during-confrontation-in-jackson-place-neighborhood/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality----pacific-coast-highway710-freeway-overpass/,Media Bulletins -https://www.mass.gov/doc/chicopee-maximum-capacity-sports-bar-grille-violation-4-8-13/download,Media Bulletins -https://www.montebelloca.gov/departments/police/news/all_news_articles/etch_catch,Misc Police Activity -https://delcopa.gov/employment/jobpostings/senioradministrativespecialist.html,Not Criminal Justice Related -https://linden-nj.gov/parent-university-helping-cope-with-anxiety-in-your-children/,Not Criminal Justice Related -https://bouldercolorado.gov/events/police-oversight-panel-18,Resources -https://cityofpowell.us/police-agency/traffic-surveys/traffic-survey-report-5-15-18/,Poor Data Source -https://www.sandiego.gov/department-document/san-diego-police-announce-arrest-balboa-park-sexual-assault-case,Media Bulletins -http://www.longbeach.gov/police/press-releases/critical-missing-person---edward-merrill-dephore/,Media Bulletins -http://police.portlandmaine.gov/623/green-packaging-working-group,Not Criminal Justice Related -https://delcopa.gov/ojs/ojsforms/divorcefees.pdf,Contact Info & Agency Meta -http://boro.dormont.pa.us/wp-content/uploads/2022/04/5j3a9282-10-copy-scaled.jpg,Not Criminal Justice Related -https://delcopa.gov/publicrelations/releases/2020/gamingauthoritymeeting.html,Not Criminal Justice Related -https://wyoming.delaware.gov/wp-content/uploads/sites/33/nggallery/3rd-annual-wyoming-police-department-fishing-derby/p1010883.jpg,Poor Data Source -https://townoflandisnc.gov/departments/public-safety/police-department/faqs/,Resources -http://www.longbeach.gov/police/press-releases/motorcycle-safety-operation-proves-effective-2-/,Media Bulletins -https://www.wakeforestnc.gov/police/operations/special-operations/tactical-services-unit,Contact Info & Agency Meta -https://jordanmn.gov/city-departments/jordan-police-department/frequently-used-forms/,Training & Hiring Info -https://delcopa.gov/planning/forms.html,Not Criminal Justice Related -https://delcopa.gov/courts/domesticrelations/forms.html,Not Criminal Justice Related -https://delcopa.gov/planning/pdf/greenspace/taskforce/andrew bunting.pdf,Not Criminal Justice Related -https://www.stpaul.gov/departments/police/administration-office-chief/support-services-administration/police-impound-lot-1,Resources -https://www.sandiego.gov/police/news-center/cold-cases/dave-earl-carr,Media Bulletins -https://bolivar.mo.us/shop-with-a-copr/img_1184-2/,Poor Data Source -https://coloradosprings.gov/police-department/article/news/update-december-21-officer-involved,Officer Involved Shootings -https://www.lakewoodoh.gov/coffee-with-a-cop-set-for-friday-december-1st/,Misc Police Activity -https://www.mass.gov/doc/lynn-police-credit-union-cra-public-evaluation-0/download,Poor Data Source -https://www.southamptontownnypolice.gov/1197/hampton-hills-association---bulkhead,Not Criminal Justice Related -https://coloradosprings.gov/police-department/page/patrol-bureau,Contact Info & Agency Meta -https://norfolkne.gov/government/departments/police-division/press-releases/august-14-press-release.html,Media Bulletins -https://bouldercolorado.gov/news/boulder-police-looking-unlawful-sexual-contact-suspect,Media Bulletins -http://police.portlandmaine.gov/225/fire-department-careers,Not Criminal Justice Related -https://www.arlingtontx.gov/news/my_arlington_t_x/police_news_releases/fatality_crash_report__2019-00690088,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/031621summary.pdf,Dispatch Logs -http://www.ryepolice.us/announcements/state-of-new-hampshire-department-of-safety-press-release-extreme-heat/attachment/heat-press-release,Media Bulletins -http://www.ryepolice.us/logs/police-logs-for-3-6-19-3-12-19,Daily Activity Logs -https://delcopa.gov/planning/programsandinitiatives/bicyclemasterplans.html,Not Criminal Justice Related -https://delcopa.gov/council/2015minutes/092315minutes.pdf,Not Criminal Justice Related -https://www.littlerock.gov/news/new-little-rock-police-department-chief-to-hold-public-meetings-in-all-city-wards/,Media Bulletins -https://www.mass.gov/event/scoping-meeting-ma-response-to-anticipated-changes-to-federal-atlantic-large-whale-take-reduction-plan-affecting-trap-fisheries-2020-02-19t180000-0500-2020-02-19t200000-0500,Not Criminal Justice Related -https://wrightstown.us/police-reports/11-29-2015-12-05-2015/,Media Bulletins -https://sanramon.ca.gov/our_city/departments_and_divisions/police/alarms,Policies & Contracts -http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-3-/,Media Bulletins -https://www.stcharlesil.gov/departments/police/overview/bike-patrol,Media Bulletins -https://ridgelandsc.gov/police-department/daily-arrest-reports-december-2019,Arrest Records -https://barnegatpolice.us/wp-content/uploads/2018/05/contactuspageheader-300x135.jpg,Poor Data Source -https://www.bedminster.us/police_fire_rescue/far_hills__bedminster_fire_dept,Not Criminal Justice Related -https://brewermaine.gov/news/brewer-police-pull-woman-from-joshua-chamberlain-bridge/bridges-1gd-jpg/,Poor Data Source -https://www.mass.gov/how-to/register-for-cops-on-bicycles-with-education-for-bicyclists-cobweb,Misc Police Activity -https://ijjc.illinois.gov/newsroom/mayor-emanuel-chicago-police-department-department-family-and-support-services-announce-40/,Poor Data Source -https://www.kennesaw-ga.gov/business-resources/copy-of-buttons-for-business-assistance/,Not Criminal Justice Related -https://www.lynchburgvapolice.gov/news-updates/shots-fired-on-hillside-court/,Media Bulletins -https://delcopa.gov/planning/pdf/mapping/norwood.pdf,Not Criminal Justice Related -https://delcopa.gov/sustainability/commission/meetingminutes/sustcommmtg_minutes_2021-9-17.pdf,Not Criminal Justice Related -https://delcopa.gov/ich/resources/covid19/pdf/govwolf_dangersofnoprotection.pdf,Poor Data Source -http://lafayettepolice.us/754/indiana-building-code-occupancy-classifi,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-one-arrest1/,Media Bulletins -https://alpha.austin.gov/es/police-oversight/indefinite-suspension-of-officer-bryan-black-and-appeals-finding/,Poor Data Source -https://delcopa.gov/council/2017minutes/121317minutes.pdf,Not Criminal Justice Related -http://www.ryepolice.us/pressrelease/stolen-f-350-with-dump-trailer,Media Bulletins -https://www.williamsaz.gov/departments_and_services/police_department/forms,Poor Data Source -https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2017_archived_news/october_2017/arlington_polices_national_night_out_continues,Poor Data Source -http://lafayettepolice.us/144/find,Resources -http://www.longbeach.gov/insidelb/blogs/conversations-with-a-long-beach-police-department-crime-analyst/,Poor Data Source -https://www.dps.ms.gov/capitol-police/patrol-division,Contact Info & Agency Meta -http://police.portlandmaine.gov/1125/neighborhoods-islands-directory,Not Criminal Justice Related -http://www.lafayettepolice.us/1122/rent-a-pool,Not Criminal Justice Related -https://delcopa.gov/sustainability/pdf/raise/highlandavetod2009.pdf,Not Criminal Justice Related -http://www.ryepolice.us/logs/police-logs-for-11-7-18-11-13-18,Daily Activity Logs -https://champaignil.gov/police-slide-sitemap.xml,Poor Data Source -https://www.stpaul.gov/departments/police/saint-paul-police-manual/10000-department-policy,Policies & Contracts -https://coloradosprings.gov/police-department/article/news/motorcycle-driver-fatal-accident,Media Bulletins -https://dccouncil.gov/judiciary-public-safety/copy-of-ag0_fy_2019-schedule-a-1/,Not Criminal Justice Related -https://hilliardohio.gov/hilliard-schools-and-police-collaborate-with-attorney-general-to-prevent-school-violence/,Media Bulletins -https://spdblotter.seattle.gov/2019/08/13/police-investigating-after-woman-pepper-sprays-employee-at-university-district-store/,Media Bulletins -https://www.huntsvilleal.gov/videos/never-forgotten-huntsville-police-remembers-fallen-officers/,Poor Data Source -https://northbrunswicknj.gov/programs_and_service/obtain-a-police-incident-report/,Resources -https://www.pullman-wa.gov/government/departments/police_department/news___statistics/national_public_safety_telecommunicators_week_2022,Media Bulletins -https://www.huntsvilleal.gov/videos/huntsville-police-honor-fallen-officers-with-remembrance-ceremony/,Poor Data Source -https://champaignil.gov/2012/04/25/police-investigate-shooting-clock-st-bellefontaine-st/,Media Bulletins -https://www.coppelltx.gov/916/interlibrary-loan,Not Criminal Justice Related -https://www.southamptontownnypolice.gov/bids.aspx,Poor Data Source -https://www.coppelltx.gov/389/crime-prevention,Resources -https://www.giddingspolice-tx.us/join-the-force,Training & Hiring Info -https://delcopa.gov/council/2021minutes/040721minutes.pdf,Not Criminal Justice Related -https://icjia.illinois.gov/about/publications/community-policing-accountability-in-management-in-the-chicago-police-department/,Policies & Contracts -https://dps.georgia.gov/job-vacancy-announcement-georgia-capitol-police-officer-5,Media Bulletins -https://ose.louisiana.gov/event/police-officer-first-class-11/,Training & Hiring Info -https://www.bristolri.gov/departments/police/police-branches/honor-guard/,Poor Data Source -https://police.greenvillesc.gov/424/explore-downtown,Not Criminal Justice Related -http://lafayettepolice.us/595/business-owners,Not Criminal Justice Related -https://delcopa.gov/vote/pdf/2020/pollworkers/howtovotewiththescannerposter.pdf,Not Criminal Justice Related -https://columbiacitypolice.us/photogallary.html,Poor Data Source -https://www.mass.gov/doc/david-casey-v-town-of-natick-police-department/download,Court Cases -http://www.ryepolice.us/announcements/rye-public-safety-building-open-house,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/missing-child-found/,Media Bulletins -https://coloradosprings.gov/police-department/article/news/drug-take-back-april-24th-2021,Media Bulletins -https://alpha.austin.gov/en/police-oversight/2020-06-08-4/,Poor Data Source -https://unioncitypa.us/police/uc-police-employment-application-2022/,Training & Hiring Info -https://www.ci.northville.mi.us/services/police_department/service_fees,Policies & Contracts -https://rockymountnc.gov/police/,Contact Info & Agency Meta -https://ci.piedmont.ca.us/services___departments/police/transparency_portal/department_policies,Poor Data Source -http://www.longbeach.gov/police/press-releases/murder-investigation3/,Media Bulletins -https://champaignil.gov/2013/12/04/champaign-police-make-arrest-in-roper-street-homicide/,Media Bulletins -http://www.longbeach.gov/police/press-releases/don-t-spend-the-holidays-in-jail--drive-safely-or-get-pulled-over/,Media Bulletins -https://portorchardwa.gov/press-releases/pr-22-003-police-investigate-shooting-related-to-stolen-vehicle/,Media Bulletins -http://www.ryepolice.us/wp-content/uploads/harbor-rd-closure.png,Poor Data Source -https://police.greenvillesc.gov/736/heritage-green,Not Criminal Justice Related -https://delcopa.gov/publicrelations/releases/2019/emergencypreparedness.html,Not Criminal Justice Related -http://www.lafayettepolice.us/1798/accessibility,Not Criminal Justice Related -https://www.lynchburgvapolice.gov/department-information/,Contact Info & Agency Meta -https://police.greenvillesc.gov/faq.aspx?qid=575,Not Criminal Justice Related -https://delcopa.gov/publicrelations/releases/2020/keepthecheerhere.html,Not Criminal Justice Related -https://champaignil.gov/police/resources/bullying-prevention/,Resources -https://www.foxcrossingwi.gov/departments/police-department/resources/bullies/,Poor Data Source -http://lafayettepolice.us/761/location-of-smoke-detectors,Not Criminal Justice Related -https://sf.gov/get-copy-confidential-marriage-certificate,Resources -https://www.mass.gov/doc/westfordpolicesergeant5443rtf/download,Training & Hiring Info -https://www.mass.gov/doc/chicopee-city-hall-april-2007-0/download,Not Criminal Justice Related -https://joinstatepolice.ny.gov/15-mile-run,Training & Hiring Info -https://estespark.colorado.gov/departments/police/operations-landing-page,Contact Info & Agency Meta -https://delcopa.gov/planning/pdf/mapping/brookhaven.pdf,Not Criminal Justice Related -https://www.mass.gov/doc/instructions-dcamm-scoping-form-for-maab-compliance/download,Not Criminal Justice Related -https://www.jacksontn.gov/government/departments/police/citizen_engagement/national_night_out,Misc Police Activity -https://westplains.gov/first-annual-community-police-academy/,Poor Data Source -https://chandlerazpd.gov/2011/02/police-need-help-identifying-burglary-and-fraud-suspects/,Media Bulletins -https://www.southamptontownnypolice.gov/faq.aspx?qid=284,Not Criminal Justice Related -https://www.sandiego.gov/department-document/san-diego-police-arrest-suspect-horton-plaza-homicide,Media Bulletins -https://www.providenceri.gov/police-city-officials-announce-progress-continued-efforts-related-illegal-vehicles/press-release-illegal-vehicles/,Poor Data Source -https://delcopa.gov/publicrelations/releases/2019/emergencypreparedness.html,Not Criminal Justice Related -https://beaumonttexas.gov/bpd-police-memorial-ceremony-thursday-may-19-2022-at-900-am/,Poor Data Source -https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-103-fitness-bonus-payment-fiscal-year-2007-08,Training & Hiring Info -http://www.longbeach.gov/police/press-releases/two-cited-during-undercover-vice-operation/,Media Bulletins -https://www.jerseycitynj.gov/news/pressreleases20182017/jersey_city_police_department_reaches_record_numbe,Media Bulletins -https://delcopa.gov/publicrelations/releases/2019/pdf/youthmentalhealthfirstaiddec3.pdf,Not Criminal Justice Related -https://www.roseville.ca.us/government/departments/police_department/resources/crime___arrest_information/neighborhood_police_activity_digests,Poor Data Source -https://delcopa.gov/council/index.html,Not Criminal Justice Related -https://www.waynesvillenc.gov/services/file-police-report,Contact Info & Agency Meta -https://sanramon.ca.gov/our_city/departments_and_divisions/police/divisions_and_units/youth_and_family/youth_resource_officer,Contact Info & Agency Meta -https://www.mass.gov/locations/chicopee-retirement-system/locations,Not Criminal Justice Related -https://martinsville.in.gov/departments-services/police-department/,Contact Info & Agency Meta -https://champaignil.gov/2020/10/22/champaign-police-seeking-armed-robbery-suspect/,Media Bulletins -https://alpha.austin.gov/en/police-oversight/formal-complaint-arrest-requirement-assaultive-offenses-and-other-policy-violations/,Poor Data Source -https://camptonhills.illinois.gov/village-of-campton-hills-police-department/request-for-public-records-form/,Records Request Info -https://southamptontownnypolice.gov/1000/adopted-studies,Not Criminal Justice Related -https://www.antioch.il.gov/wpfb-file/12-11-12-police-pension-agenda-pdf-4/,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/040621blotter.pdf,Dispatch Logs -https://delcopa.gov/courts/judges/scanlon.html,Poor Data Source -https://www.mass.gov/doc/opencompetitiveeducationandexperienceratingworksheetforpoliceofficerdoc/download,Training & Hiring Info -https://www.troyny.gov/troy-police-seek-publics-help-in-solving-double-homicide-case/,Poor Data Source -https://www.sandyspringsgapolice.gov/apartment-safety-checker/,Resources -http://www.lafayettepolice.us/782/recruitment,Training & Hiring Info -https://coloradosprings.gov/police-department/page/meth-lab-cleanup,Poor Data Source -https://training.detroitmi.gov/departments/police-department/detroit-police-department-office-civil-rights/definitions-consent-decree,Policies & Contracts -http://police.portlandmaine.gov/676/design-manual-overhaul-2021,Not Criminal Justice Related -https://www.antioch.il.gov/event/police-pension-board-special-meeting-2/,Poor Data Source -https://detroitmi.gov/bn/departments/paulaisa-baibhaaga/detroit-police-department-shield-program/paraogaraama-ebam-saebaa,Poor Data Source -https://www.newarknj.gov/news/mayor-barak-and-public-safety-director-ambrose-release-details-on-stepped-up-police-presence-for-new-years-eve,Media Bulletins -https://www.huntsvilleal.gov/city-calendar-event/deadline-apply-58th-session-huntsville-police-academy/,Training & Hiring Info -https://champaignil.gov/2022/05/19/police-department-hosts-employee-awards-ceremony/,Not Criminal Justice Related -https://www.antiochca.gov/police/animal-services/animal-services-faqs/,Poor Data Source -http://police.portlandmaine.gov/449/contact-us,Contact Info & Agency Meta -https://hollister.ca.gov/government/city-departments/police/comments/,Contact Info & Agency Meta -https://delcopa.gov/employment/jobpostings/clerktypist2_childrenservices.html,Not Criminal Justice Related -https://newtownohio.gov/police/department-news/,Media Bulletins -https://www.stpaul.gov/departments/police/projects,Not Criminal Justice Related -https://www.coppelltx.gov/faq.aspx?qid=396,Not Criminal Justice Related -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/062121blotter.pdf,Dispatch Logs -https://www.southamptontownnypolice.gov/1696/2022-wqip---applications-proposal-summar,Not Criminal Justice Related -https://www.mass.gov/doc/municipal-police-training-committee-mptc-meeting-minutes-042022/download,Training & Hiring Info -https://delcopa.gov/publicrelations/releases/2019/mumps.html,Not Criminal Justice Related -https://port-orange.us/2014/11/18/vehicle-break-ins-rise-port-orange-police-warn-residents/,Media Bulletins -https://delcopa.gov/courts/judges/capuzzi.html,Poor Data Source -https://www.mass.gov/doc/monteiro-lencol-v-boston-police-department-101614/download,Court Cases -http://www.lafayettepolice.us/321/landlordowner-information,Not Criminal Justice Related -https://delcopa.gov/electionsbureau/absenteevoting.html,Not Criminal Justice Related -https://coloradosprings.gov/police-department/article/news/traffic-fatality-s-chelton-road-and,Media Bulletins -https://strafford.nh.gov/event/police-chief-search-committee-3/,Training & Hiring Info -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/050321blotter.pdf,Daily Activity Logs -https://delcopa.gov/controller/pdf/retirement/2018/0523retirementboardminutes.pdf,Not Criminal Justice Related -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/060421blotter.pdf,Dispatch Recordings -https://www.knoxvilletn.gov/government/mayors_office/c_o_v_i_d-19___coronavirus_/stress_and_coping/knox_well/general_adult_resources/kid___parent_resources,Not Criminal Justice Related -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/060521summary.pdf,Dispatch Logs -https://southcoffeyvilleok.gov/police-department/city-hall-south-coffeyville/,Not Criminal Justice Related -https://champaignil.gov/2017/12/22/police-investigate-shooting-2400-block-n-neil-street/,Media Bulletins -http://police.portlandmaine.gov/279/general-assistance-reports,Poor Data Source -https://sheriff.berkeleycountysc.gov/community/citizen-police-academy/,Training & Hiring Info -https://www.sandiego.gov/department-document/copy-sublease-3,Not Criminal Justice Related -https://www.hayward-ca.gov/discover/news/apr21/police-blotter-april-4-10-2021-0,Crime Maps & Reports -https://ose.louisiana.gov/event/police-communications-officer-57/,Poor Data Source -https://www.southamptontownnypolice.gov/466/emergency-notifications,Not Criminal Justice Related -https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-34-2000-holiday-bonus-pay,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-enforcement-operation-1-/,Media Bulletins -https://pharr-tx.gov/individual-arrested-by-pharr-police-dies-at-hospital/,Media Bulletins -http://www.longbeach.gov/police/press-releases/fireworks-seized/,Media Bulletins -https://www.minneapolismn.gov/government/programs-initiatives/police-explorers/police-explorer-form/,Resources -https://www.antiochca.gov/police/child-safety-programs-events/,Misc Police Activity -https://delcopa.gov/purchasing/bidsprops/delcomicrowavekmz.zip,Not Criminal Justice Related -https://www.lynchburgvapolice.gov/news-updates/crime-of-the-week-may-18-2021/,Media Bulletins -https://champaignil.gov/2015/04/21/2014-police-department-employee-awards/,Misc Police Activity -https://www.sandiego.gov/department-document/sdpd-investigate-attempted-murder-police-officer-jamacha-lolita,Media Bulletins -https://southamptontownnypolice.gov/faq.aspx?qid=257,Not Criminal Justice Related -https://www.hayward-ca.gov/discover/news/may21/police-blotter-may-16-22-2021,Crime Maps & Reports -https://www.lakewoodoh.gov/coffee-with-a-cop-set-for-friday-october-26th/,Misc Police Activity -https://rexburg.us/police-ask-for-help-finding-woman-who-went-missing-tuesday-in-juab-county/,Media Bulletins -https://www.minneapolismn.gov/government/programs-initiatives/community-safety/focus-areas/alternatives-police-response/new-pilot-response/,Policies & Contracts -https://www.minneapolismn.gov/government/departments/police/precincts/precinct-4/,Contact Info & Agency Meta -https://sanfordfl.gov/government/police/,Contact Info & Agency Meta -https://columbiacitypolice.us/documents/firearm responsibility.pdf,Resources -https://santabarbaraca.gov/press-releases/magical-winter-wonderland-experience-deserving-families-hosted-santa-barbara-police,Not Criminal Justice Related -https://www.burienwa.gov/residents/public_safety/police/lead_program,Resources -https://chandlerazpd.gov/2019/11/vehicle-burglary-crew-arrested-after-fleeing-from-police/,Media Bulletins -https://www.southamptontownnypolice.gov/182/teen-assessment-project,Resources -https://alpha.austin.gov/police-oversight/2020-08-17-2/,Poor Data Source -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0021/,Poor Data Source -https://rockfordil.gov/calendars/category/police-department/,Poor Data Source -https://delcopa.gov/council/2019minutes/121819minutes.pdf,Not Criminal Justice Related -https://www.mass.gov/service-details/becoming-an-environmental-police-officer,Training & Hiring Info -https://www.roundrocktexas.gov/wp-content/uploads/2021/12/recycling-wide-copy-1.jpg,Poor Data Source -https://www.huntsvilleal.gov/city-calendar-event/apply-to-be-a-huntsville-police-officer/,Training & Hiring Info -https://coloradosprings.gov/police-department/page/cspd-salary-benefits,Resources -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0680/,Poor Data Source -https://www.mass.gov/doc/municipal-police-training-committee-mptc-meeting-minutes-62119/download,Not Criminal Justice Related -https://delcopa.gov/courts/pdf/emergencyjudicialorders/presidentjudgeadministrativeorderfamilysectionoperationalandschedulingprotocols.pdf,Court Cases -https://alpha.austin.gov/es/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/bwc-dmav-data-analysis-methodology/,Poor Data Source -https://www.goldenbeach.us/documents/reso-1550-03-authorizing-the-donation-of-an-obsolete-police-vehicle-light-bar/,Not Criminal Justice Related -https://www.doravillepolice.us/join-dpd/requirements/,Training & Hiring Info -http://www.longbeach.gov/police/press-releases/arrest-made-in-2-murder-cases/,Media Bulletins -https://www.mass.gov/doc/robert-dececcopdf/download,Poor Data Source -https://delcopa.gov/recycle/paint.html,Poor Data Source -https://www.pinevillenc.gov/government/departments/police/services/,Resources -https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0800/,Poor Data Source -https://www.coppelltx.gov/203/election-information,Not Criminal Justice Related -https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/october-14-activity-report/,Incident Reports -http://www.longbeach.gov/police/press-releases/$10000-reward-issued-in-fatal-hit---run-investigation/,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/031522summary.pdf,Poor Data Source -http://www.lafayettepolice.us/faq.aspx?qid=168,Not Criminal Justice Related -https://www.hayward-ca.gov/police-department/programs/hayward-eyes,Resources -https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/may-17-activity-report/,Daily Activity Logs -https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/bwc-dmav-data-analysis-additional-information/,Poor Data Source -https://delcopa.gov/publicrelations/releases/2020/blooddrive.html,Not Criminal Justice Related -http://www.ryepolice.us/wp-content/uploads/deterra-intro.jpg,Poor Data Source -https://www.mass.gov/doc/merging-of-police-officer-list-memorandum-to-police-appointing-authorities/download,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/arrest-made-in-sexual-assault-case/,Media Bulletins -https://www.roundrocktexas.gov/news/police-identify-victim-fatal-auto-pedestrian-crash-mays-street/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-26-/,Media Bulletins -https://alpha.austin.gov/en/police-oversight/formal-complaint-opo-declines-to-make-a-recommendation-5/,Poor Data Source -https://www.mass.gov/news/dighton-police-chief-robert-macdonald-pays-7000-civil-penalty-for-conflict-of-interest-law-violations,Media Bulletins -https://www.mass.gov/doc/ung-dararith-v-lowell-police-department-82009/download,Court Cases -https://www.coppelltx.gov/482/water-backflow-prevention,Not Criminal Justice Related -http://www.hickoryhillspd.us/2022/05/the-hickory-hills-police-departments-distracted-driving-enforcement-results/,Resources -http://www.longbeach.gov/police/press-releases/charges-filed-in-murder-case/,Media Bulletins -https://www.antioch.il.gov/wpfb-file/11-29-10-police-and-fire-agenda-pdf-2/,Poor Data Source -https://delcopa.gov/council/2015minutes/042215minutes.pdf,Policies & Contracts -https://santabarbaraca.gov/press-releases/santa-barbara-police-department-promotes-three-officers,Personnel Records -https://www.ci.bonney-lake.wa.us/news/what_s_new/message_from_the_police_chief_on_2021_legislation,Poor Data Source -https://springfield-or.gov/event/springfield-police-advisory-committee-spac-21/,Not Criminal Justice Related -https://www.rockvillecentrepolice.us/situational-awareness/,Media Bulletins -https://www.minneapolismn.gov/government/departments/police/precincts/,Geographic -https://alpha.austin.gov/es/police-oversight/official-complaint-documents-related-to-protests/,Poor Data Source -https://delcopa.gov/publicrelations/releases/2020/spottedlanternflytreatment.html,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/murder-suicide-investigation/,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/022722blotter.pdf,Poor Data Source -https://pittsburghpa.gov/files/police/orders/ch6/69-05-pictures-videos-&-audio-recordings-of-police-officers-while-in-public-spaces.pdf,Poor Data Source -https://www.southamptontownnypolice.gov/366/skate-parks,Resources -http://www.longbeach.gov/police/press-releases/attempt-murder-suspect-arrested/,Media Bulletins -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0201/,Poor Data Source -https://pittsburghpa.gov/police/task-force-police-reform,Resources -https://pittsburghpa.gov/police/police-zone4,Contact Info & Agency Meta -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/092522summary.pdf,Poor Data Source -https://www.littlerock.gov/media/4332/robert-ryan-hunter-copy.png?width=204&height=248,Poor Data Source -https://sanfordfl.gov/wp-content/uploads/2021/10/rateourservice_police.png,Poor Data Source -http://www.lafayettepolice.us/faq.aspx?qid=116,Complaints & Misconduct -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/071921summary.pdf,Poor Data Source -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/063021summary.pdf,Dispatch Logs -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0967/,Poor Data Source -http://www.longbeach.gov/police/press-releases/traffic-fatality---harvy-way-and-bellflower-blvd/,Media Bulletins -https://hilliardohio.gov/remembering-hilliard-police-officer-sean-johnson/,Not Criminal Justice Related -https://www.mass.gov/doc/william-j-wagner-president-chicopee-savings-bank/download,Not Criminal Justice Related -https://www.mass.gov/locations/state-police-boston-barracks/locations,Geographic -https://www.mass.gov/doc/lynch-matthew-v-bridgewater-police-department-121913/download,Court Cases -http://www.lafayettepolice.us/1587/cpz-history,Not Criminal Justice Related -https://police.crystalmn.gov/g_o_v_e_r_n_m_e_n_t/departments_a-_z/assessing,Not Criminal Justice Related -https://broadview-il.gov/documents/police-department-board-report-may-2022/,Poor Data Source -https://statepatrol.nebraska.gov/nsp-investigating-milford-police-officer-involved-shooting,Poor Data Source -http://www.longbeach.gov/police/press-releases/traffic-fatality-wardlow-and-magnolia/,Media Bulletins -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0973/,Poor Data Source -https://data.naperville.il.us/datasets/police-department-accidents,Poor Data Source -https://www.southamptontownnypolice.gov/292/sag-harbor,Not Criminal Justice Related -https://www.sandyspringsgapolice.gov/intelligence-and-technology-division/,Contact Info & Agency Meta -https://www.colma.ca.gov/documents/executive-assistant-chief-police/jd-executive-assistant-to-chief-of-police-6-24/,Media Bulletins -https://brookfieldil.gov/publication/05510-may-5-2010-fire-and-police-commission/,Poor Data Source -https://delcopa.gov/publicrelations/releases/2021/hurricaneida.html,Not Criminal Justice Related -https://www.goldenbeach.us/police-department/beach-patrol/,Misc Police Activity -https://www.southbendin.gov/job/police-officer-lateral-entry-in-south-bend/,Training & Hiring Info -https://delcopa.gov/treasurer/forms/bingo_law.pdf,Not Criminal Justice Related -https://www.stpaul.gov/departments/police/blueprint-safety,Policies & Contracts -https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations55/,Complaints & Misconduct -https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-141-fitness-bonus-payment-state-fiscal-year-2011-12,Media Bulletins -https://cityofsalemnj.gov/police-fire-ems/,Contact Info & Agency Meta -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0547/,Complaints & Misconduct -https://www.southamptontownnypolice.gov/faq.aspx?qid=505,Poor Data Source -https://manitowoccountywi.gov/departments/joint-dispatch-center/policefireems-contact-information/,Contact Info & Agency Meta -http://www.lafayettepolice.us/2201/outdoor-maintenance,Resources -https://www.edmondswa.gov/government/departments/police_department/security_camera_registration,Resources -https://police.crystalmn.gov/police/contact_us/crime_report,Poor Data Source -https://delcopa.gov/treasurer/pdf/2021reassessmentvalues/10.pdf,Annual & Monthly Reports -https://www.dps.nm.gov/blog/2021/12/08/update-cancel-silver-alert-rio-rancho-police-department-eric-engquist/,Incident Reports -https://www.lynchburgvapolice.gov/news-updates/e-c-glass-on-lockdown-due-to-suspicious-phone-call/,Media Bulletins -https://delcopa.gov/prison/mail.html,Poor Data Source -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0868/,Poor Data Source -http://www.longbeach.gov/police/press-releases/roadway-safety-is-important-for-everyone-to-follow/,Policies & Contracts -http://www.tampa.gov/police/info/domestic-violence/options,Resources -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/052722summary.pdf,Daily Activity Logs -https://www.roseville.ca.us/government/departments/police_department/crime_log/crime_log_may_14__2021_-_june_04__2021,Poor Data Source -https://champaignil.gov/police/community-engagement/neighborhood-watch/,Resources -https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-59-dues-increase-rehired-retirees-who-are-members-police-benevolent,Media Bulletins -https://cityofpowell.us/government/building-department/city-of-powell-commercial-building/checklist-cop-comm-tent-01-08-19/,Resources -https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0900/,Poor Data Source -https://www.mass.gov/doc/fas-31-2018-hcpcs-code-revisions-new-prior-authorization-requirement-for-knee-arthroscopy/download,Not Criminal Justice Related -https://www.coppelltx.gov/1051/s-belt-line-reconstruction-updates,Not Criminal Justice Related -https://delcopa.gov/planning/pubs/delco2035economicdevelopmentplan.html,Not Criminal Justice Related -https://www.farmingtonmn.gov/government/departments/police/divisions/crime_scene_unit,Resources -https://cityofpowell.us/reports/auto-draft-91/07-2017-police-report/,Annual & Monthly Reports -https://beaumonttexas.gov/beaumont-police-investigating-aggravated-robbery-grant-irving-intersection/,Media Bulletins -https://www.roseville.ca.us/government/departments/police_department/contact_roseville_police/ride-_along_application,Poor Data Source -https://www.stpaul.gov/departments/police/department-history,Not Criminal Justice Related -https://police.greenvillesc.gov/526/colonel-elias-earle-historic-district,Not Criminal Justice Related -https://delcopa.gov/jdboard/pdfs/agenda_2021_12_21.pdf,Poor Data Source -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/010622summary.pdf,Daily Activity Logs -https://www.harrisonburgva.gov/online-police-reporting-faq,Poor Data Source -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/bike-patrol.pdf,Media Bulletins -https://edenny.gov/honoring-edens-police-chief-and-lieutenant/,Media Bulletins -http://www.longbeach.gov/police/press-releases/toddlers-found-alone--police-asking-for-help-in-determining-their-identity-and-locating-parents/,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/070121arrests.pdf,Arrest Records -https://www.florenceaz.gov/florence-police-department-citizen-academy/,Resources -https://coloradosprings.gov/police-department/article/news/homicide-investigation-3200-block-heather,Media Bulletins -https://www.arlingtonva.us/government/projects/plans-studies/land-use/crystal-city-building-heights-study/process-scope-timeline,Media Bulletins -https://cityofspoonerwi.gov/spooner-police-ordinances/,Resources -https://www.antioch.il.gov/wpfb-file/01-17-12-police-and-fire-agenda-pdf-3/,Poor Data Source -https://www.sandyspringsgapolice.gov/chatcomm911/,Resources -https://training.detroitmi.gov/departments/police-department/project-green-light-detroit/agreements,Not Criminal Justice Related -https://delcopa.gov/publicrelations/releases/2021/mailballotrequestdeadline.html,Media Bulletins -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0204/,Complaints & Misconduct -https://www.dps.nm.gov/blog/2022/03/05/update-3-nmsp-investigates-fatal-crash-on-i-25-involving-the-santa-fe-police-department-during-pursuit-of-carjacking-and-kidnapping-suspect/,Media Bulletins -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0481/,Complaints & Misconduct -https://delcopa.gov/planning/education/plannersportfolios/plannersportfolioaginginplace.html,Not Criminal Justice Related -https://www.mass.gov/doc/boston-police-department-drug-test-appeals-related-superior-court-decision-8222/download,Misc Police Activity -https://www.montgomerycountymd.gov/ccm/mcpolicebeat.html,Media Bulletins -https://southamptontownnypolice.gov/faq.aspx?qid=546,Resources -https://southamptontownnypolice.gov/187/youth-advisory-committee,Resources -https://delcopa.gov/vote/news/20emergencyabsenteeballots.html,Not Criminal Justice Related -https://www.antiochca.gov/police/alarm-registration/,Resources -https://coloradosprings.gov/police-department/article/news/recovered-property-february-2021,Media Bulletins -https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0868/,Complaints & Misconduct -https://delcopa.gov/hcd/pdfs/leadinformationforhomeowners.pdf,Not Criminal Justice Related -https://www.sandiego.gov/department-document/police-identify-attempted-murder-victim-oak-park,Media Bulletins -https://ci.san-bernardino.ca.us/news/archived_news/downtown_specific_plan_scoping_meeting,Not Criminal Justice Related -https://springfield-or.gov/coffee-with-a-cop-scheduled-for-afternoon-on-november-4th/,Media Bulletins -https://alpha.austin.gov/police-oversight/2020-08-17/,Poor Data Source -https://coloradosprings.gov/police-department/article/news/update-homicide-investigation-200-block-e,Incident Reports -https://normandyparkwa.gov/police-services/,Media Bulletins -https://www.southamptontownnypolice.gov/1557/southampton-sustainability-drawdown-east,Poor Data Source -https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_releases/police_investigate_1993_john_doe_case,Media Bulletins -https://www.roundrocktexas.gov/wp-content/uploads/2020/02/rrpd_police_patch.png,Poor Data Source -https://police.greenvillesc.gov/faq.aspx?qid=546,Not Criminal Justice Related -https://southamptontownnypolice.gov/891/dune-road-reconstruction,Not Criminal Justice Related -http://www.ryepolice.us/./pressrelease,Media Bulletins -https://www.waterloo.il.us/departments/police-department/,Media Bulletins -https://townofspringfield.colorado.gov/police-department-9,Resources -https://ose.louisiana.gov/event/police-lieutenant-10/,Poor Data Source -https://coloradosprings.gov/police-department/article/news/seeking-community-assistance,Media Bulletins -https://coloradosprings.gov/police-department/article/news/homicide-investigation-2001-e-platte-ave,Media Bulletins -https://alpha.austin.gov/en/police-oversight/2020-06-08-6/,Poor Data Source -http://lafayettepolice.us/9/how-do-i,Not Criminal Justice Related -https://www.hickoryhillspd.us/2018/10/police-chief-announces-his-retirement/,Media Bulletins -https://mukilteowa.gov/news/mukilteo-police-brings-awareness-to-domestic-violence/,Media Bulletins -https://www.desmoineswa.gov/departments/police/programs_services/his_victim_notification_program,Resources -https://www.arlingtontx.gov/news/my_arlington_t_x/news_stories/police_chief_community_welcome,Media Bulletins -https://www.austintexas.gov/blog/austin-green-business-leader-featured-member-st-andrews-episcopal-school,Not Criminal Justice Related -https://vpd.vernonia-or.gov/blotter/2019/02/01/january-2019-police-blotter/,Dispatch Logs -https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-201-2019-state-police-hazardous-duty-pay,Media Bulletins -http://www.longbeach.gov/police/press-releases/motorcycle-safety-operation-a-success/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder---900-block-of-elm/,Media Bulletins -http://www.police.wallingfordct.gov/,Resources -https://norfolkne.gov/assets/site/documentcentral/police/archived-calls-for-service/2020-calls-for-service/5.pdf,Dispatch Logs -https://www.scribner-ne.gov/help-define-our-schools-future/copy-of-scribner-profile-pics-2020/,Poor Data Source -https://cityofpowell.us/reports/auto-draft-223/04-2019-police-department/,Annual & Monthly Reports -http://lafayettepolice.us/faq.aspx?qid=125,Not Criminal Justice Related -https://www.sandiego.gov/police/contact/meeting-request,Contact Info & Agency Meta -https://hilliardohio.gov/introducing-newest-police-officer-k9-jawaak/,Media Bulletins -https://www.sandiego.gov/police/data-transparency/crime-statistics/annual-crime-reports,Crime Maps & Reports -https://www.lynchburgvapolice.gov/lpd-policies-and-procedures/,Poor Data Source -https://delcopa.gov/courts/pdf/emergencyjudicialorders/secondemergencyorderextensionandamendments_juveniledelinquencyanddependencymatters.pdf,Court Cases -http://www.longbeach.gov/police/press-releases/long-beach-police-seeking-the-public-s-help-in-identifying-armed-robbery-suspect---video-footage-available--/,Wanted Persons -https://cityofgulfbreeze.us/departments/police/divisions/,Resources -https://www.austintexas.gov/blog/office-police-oversight-community-event-apd-use-force,Media Bulletins -http://www.lafayettepolice.us/1598/castaway-bay,Not Criminal Justice Related -https://delcopa.gov/treasurer/pdf/2021reassessmentvalues/39.pdf,Not Criminal Justice Related -https://www.westmayfieldborough.us/cropped-white-blank-header-banner-copy1-jpg/,Poor Data Source -https://delcopa.gov/publicrelations/publicrelations/releases/2020/index.html,Poor Data Source -https://alpha.austin.gov/police-oversight/formal-complaint-de-escalation-of-potential-force-encount-3/,Poor Data Source -https://delcopa.gov/planning/pubs/portfolio-14_foodsystems.pdf,Not Criminal Justice Related -https://www.mass.gov/doc/copleydental2013-003rfd/download,Not Criminal Justice Related -https://brecknocktownship.us/police-and-emergency-services/,Contact Info & Agency Meta -https://gonzalesca.gov/services/police/police-department-staff,Contact Info & Agency Meta -https://bolivar.mo.us/shop-with-a-copr/img_1333-2/,Poor Data Source -https://www.rentonwa.gov/city_hall/police/police_services/8_can_t_wait/require_use_of_force_continuum,Policies & Contracts -https://chester-ny.gov/town-departments/police/house-check-request/,Resources -https://www.mass.gov/doc/reference-copy-of-2016-massdep-municipal-solid-waste-recycling-survey/download,Not Criminal Justice Related -https://www.minneapolismn.gov/resident-services/public-safety/police-public-safety/police-reports-and-data-requests/frequently-requested/critical-incidents/feb-2-2022-officer-involved-shooting/,Officer Involved Shootings -https://www.lynchburgvapolice.gov/wp-content/uploads/2022/05/pwm-2-4.jpg,Poor Data Source -https://directory.arkansas.gov/agency/department-of-public-safety/arkansas-state-police/news/crack-down-on-speeders-part-of-statewide-traffic-safety-blitz-obey-the-sign-or-pay-the-fine/,Poor Data Source -https://www.coppelltx.gov/faq.aspx?qid=218,Not Criminal Justice Related -https://dccouncil.gov/donation-disclosures/copy-of-april-2018-donation-disclosure-2/,Not Criminal Justice Related -https://alpha.austin.gov/es/police-oversight/memo-changes-to-apd-impartial-attitude-and-courtesyper/,Poor Data Source -https://www.santamonica.gov/press/2022/09/21/santa-monica-police-holding-motorcycle-safety-enforcement-operation-september-23-2022,Media Bulletins -https://www.providenceri.gov/hr/wellness/cop-9-elements-of-longevity-flyer-10-23/,Poor Data Source -https://delcopa.gov/planning/pdf/mapping/media.pdf,Not Criminal Justice Related -https://police.crystalmn.gov/emergency_center,Media Bulletins -https://www.dps.nm.gov/blog/2021/07/07/state-police-officer-attacked-by-felon-with-a-loaded-gun-in-pecos-nm/,Media Bulletins -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0473/,Complaints & Misconduct -https://police.birminghamal.gov/bureaus/administrative/,Contact Info & Agency Meta -https://www.southamptontownnypolice.gov/faq.aspx?qid=463,Not Criminal Justice Related -https://www.goldenbeach.us/documents/reso-2034-09-authorizing-the-purchase-of-two-new-police-patrol-boat-motors/,Media Bulletins -http://www.longbeach.gov/police/how-do-i/permits-fees-and-licensing/~/link/dea878b9816040a8afeeaa7799933a7f.aspx,Poor Data Source -https://police.greenvillesc.gov/513/parking,Not Criminal Justice Related -https://delcopa.gov/departments/parks/sagelife.com/plush-mills/,Poor Data Source -https://delcopa.gov/publicrelations/releases/2021/statement_capitolbuildingviolencejan6.html,Media Bulletins -http://www.longbeach.gov/police/press-releases/undetermined-death2/,Media Bulletins -https://police.bixbyok.gov/1260/communications,Contact Info & Agency Meta -http://www.longbeach.gov/police/press-releases/murder-locust-and-12th/,Media Bulletins -https://ridgelandsc.gov/police-department/daily-arrest-reports-april,Poor Data Source -https://www.sandiego.gov/department-document/copy-agreement,Poor Data Source -http://www.tampa.gov/police/online-reporting,Resources -http://www.lafayettepolice.us/faq.aspx?qid=150,Not Criminal Justice Related -https://southamptontownnypolice.gov/786/2015-budgets,Poor Data Source -https://delcopa.gov/planning/greenspace/greenspaceroe.html,Not Criminal Justice Related -https://delcopa.gov/publicrelations/releases/2019/narcanatdccc.html,Resources -http://www.longbeach.gov/police/press-releases/spring-break-safety-tips-1-/,Media Bulletins -http://www.lafayettepolice.us/2319/travel,Not Criminal Justice Related -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0792/,Poor Data Source -https://bouldercolorado.gov/news/boulder-police-investigating-fatal-traffic-crash-friday,Media Bulletins -https://www.hayward-ca.gov/discover/news/oct16/turn-your-prescription-drugs-hayward-police-department-1022,Poor Data Source -https://www.lasalle-il.gov/departments/police-department/registered-sex-offenders,Sex Offender Registry -https://www.hayward-ca.gov/your-government/departments/police,Resources -https://delcopa.gov/courts/judges/brennan.html,Contact Info & Agency Meta -https://delcopa.gov/publicrelations/releases/2021/covid_popupvaccinationprogram.html,Not Criminal Justice Related -https://delcopa.gov/publicrelations/releases/2022/gwhgraduation.html,Media Bulletins -https://www.southamptontownnypolice.gov/faq.aspx?qid=373,Not Criminal Justice Related -https://pittsburghpa.gov/files/police/orders/ch1/16-01-standards-of-conduct.pdf,Poor Data Source -http://police.portlandmaine.gov/1167/ocean-gateway,Not Criminal Justice Related -https://www.ci.san-bernardino.ca.us/news/archived_news/downtown_specific_plan_scoping_meeting,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/traffic-fatality---burnett-street-and-pacific-avenue/,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/011322blotter.pdf,Media Bulletins -https://alpha.austin.gov/police-oversight/formal-complaint-incident-reporting-and-other-policy-violations/,Poor Data Source -http://www.longbeach.gov/police/press-releases/reward-issued-in-2013-murder-investigation/,Media Bulletins -http://chico.ca.us/post/chico-police-utilize-grant-money-dui-enforcement,Media Bulletins -https://www.southamptontownnypolice.gov/faq.aspx?qid=400,Not Criminal Justice Related -https://hilliardohio.gov/hilliard-officer-named-central-ohios-top-cop/,Poor Data Source -https://www.knoxvilletn.gov/government/city_departments_offices/police_department/field_operations_bureau/inspections_unit/taxi_limo_services/application_for_certificate_of_public_convenience_and_necessity___p_d_f_,Not Criminal Justice Related -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/041222blotter.pdf,Poor Data Source -http://www.longbeach.gov/police/press-releases/halloween-safety-tips2/,Media Bulletins -https://delcopa.gov/employment/jobpostings/clerical.html,Training & Hiring Info -https://alpha.austin.gov/police-oversight/body-worn-cameras-and-dashboard-cameras-final-recommendations-report/,Poor Data Source -https://delcopa.gov/vote/news/20nov5update.html,Not Criminal Justice Related -https://londonky.gov/london-police-promote-officers/,Personnel Records -http://www.cityofpataskalaohio.gov/cop_folder/minutes-2015/,List of Data Sources -https://www.sandiego.gov/police/recruiting/volunteer/sddcrt-application-submit,Poor Data Source -https://police.greenvillesc.gov/653/benefits-and-incentives-for-firefighters,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/buzzed-driving-is-drunk-driving/,Media Bulletins -https://www.southamptontownnypolice.gov/1450/southampton-village---agawam-pond-phase-,Not Criminal Justice Related -https://www.mass.gov/info-details/situational-analysis-of-municipal-police-in-service-training-in-the-commonwealth,Training & Hiring Info -https://detroitmi.gov/es/departments/aeropuerto-internacional-coleman-young/mi-vuelo-paseos-en-helicoptero,Poor Data Source -https://www.providenceri.gov/police/providence-police-recruitment-application/clements_e-sig/,Poor Data Source -https://www.lakewoodoh.gov/coffee-with-a-cop-set-for-may-4th/,Not Criminal Justice Related -https://bolivar.mo.us/shop-with-a-copr/img_1293-2/,Poor Data Source -http://www.longbeach.gov/police/press-releases/september-is-california-pedestrian-safety-month/,Media Bulletins -https://www.mass.gov/regulations/118-cmr-100-scope-and-authority,Court Cases -https://southamptontownnypolice.gov/faq.aspx?qid=490,Resources -http://www.longbeach.gov/police/press-releases/l.b.p.d2.-promotes-new-leaders/,Media Bulletins -https://police.greenvillesc.gov/faq.aspx?qid=598,Resources -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/080521blotter.pdf,Dispatch Logs -https://www.poconopa.gov/police/,Contact Info & Agency Meta -https://cityofyuma.colorado.gov/departments/emergency-services/police-department/police-department-staff,Personnel Records -https://delcopa.gov/council/newsletter/index.html,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/murder---3100-block-e-artesia-blvd/,Media Bulletins -https://www.memphistn.gov/news/wpfd_file/resolution-requesting-the-memphis-police-department-to-enforce-the-curfews-of-the-child-curfew-act-of-1995-and-work-with-the-city-of-memphis-administration-on-a-proposal-for-a-designated-curfew-center/,Poor Data Source -https://police.bixbyok.gov/faq.aspx?qid=94,Resources -https://cityofyuma.colorado.gov/departments/emergency-services/police-department/police-department-fees,Resources -https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0182/,Poor Data Source -http://www.longbeach.gov/police/press-releases/juvenile-investigations-operation-results-in-6-arrests/,Media Bulletins -https://www.mass.gov/regulations/700-cmr-600-use-of-road-flaggers-and-police-details-on-public-works-projects,Misc Police Activity -https://delcopa.gov/publicrelations/releases/2020/passportservicesresumejuly6.html,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/lbpd-swat-officers-shot-at-during-search-warrant-service/,Media Bulletins -https://www.lynchburgvapolice.gov/resources/,Resources -https://delcopa.gov/planning/pubs/delco2035/historicplan.pdf,Not Criminal Justice Related -https://spdblotter.seattle.gov/2021/01/27/police-arrest-u-district-rape-suspect/,Media Bulletins -https://beaumonttexas.gov/beaumont-police-investigating-overnight-shooting-at-2550-ih-10-east/,Poor Data Source -https://ose.louisiana.gov/event/police-communications-officer-ii/,Poor Data Source -http://www.longbeach.gov/police/how-do-i/prevent-crime/general-guidelines-for-retail-stores/,Resources -https://alpha.austin.gov/es/police-oversight/2020-06-17-7/,Poor Data Source -http://www.lafayettepolice.us/faq.aspx?qid=68,Not Criminal Justice Related -https://www.mass.gov/info-details/audit-of-mount-wachusett-community-college-objectives-scope-and-methodology,Not Criminal Justice Related -http://lafayettepolice.us/faq.aspx?qid=80,Resources -https://columbiacitypolice.us/photos/group 2017.jpg,Poor Data Source -https://police.greenvillesc.gov/faq.aspx?qid=140,Resources -https://www.coronadelmar.us/newport-beach-mourns-locals-killed-in-helicopter-crash/,Not Criminal Justice Related -https://www.mass.gov/doc/municipal-police-training-committee-meeting-minutes-091521/download,Training & Hiring Info -https://www.madera.gov/tr-accordion/police-programs/,Not Criminal Justice Related -https://mountpocono-pa.gov/question/how-do-i-reach-the-police-department-with-a-non-emergency/,Contact Info & Agency Meta -https://champaignil.gov/2021/04/03/champaign-police-investigating-overnight-shooting-2/,Media Bulletins -https://alpha.austin.gov/en/police-oversight/2020-11-01/,Poor Data Source -https://southamptontownnypolice.gov/256/town-law-200-procedure,Resources -https://www.somervillema.gov/news/femino-named-interim-acting-chief-police,Personnel Records -https://police.greenvillesc.gov/faq.aspx,Resources -"https://norfolkne.gov/government/departments/police-division/press-releases/january-4,-2021-press-release.html",Media Bulletins -https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-42-permanent-rank-sergeant-payment-employees-represented-nys-police,Media Bulletins -https://www.mass.gov/doc/municipal-police-training-committee-mptc-meeting-agenda-71719/download,Misc Police Activity -http://www.ryepolice.us/logs/police-logs-for-12517-13117,Daily Activity Logs -https://police.greenvillesc.gov/994/crisis-intervention,Resources -https://alvordtx.gov/question/how-can-i-obtain-a-copy-of-the-municipal-codes/,Resources -http://www.longbeach.gov/police/press-releases/murder-investigation---wardlow--orange/,Media Bulletins -https://louisvilleky.gov/news/louisville-metro-police-foundation-endorses-louisville-affordable-housing-trust-fund,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/murder-1600-block-of-pine-avenue/,Media Bulletins -https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0415/,Poor Data Source -https://delcopa.gov/publicrelations/releases/18pdfs/18emergencypreparednessmonth.pdf,Media Bulletins -http://lafayettepolice.us/773/foam-systems,Not Criminal Justice Related -https://www.newarknj.gov/news/mayor-ras-j-barakas-statement-on-appointment-of-brian-ohara-as-deputy-mayor-of-strategic-initiatives-for-police-services-public-safety,Personnel Records -https://mtcb.colorado.gov/departments-services/police,Contact Info & Agency Meta -http://www.lafayettepolice.us/725/fireworks-safety,Not Criminal Justice Related -https://www.cityofrc.us/public-safety/police/crime-mapping,Crime Maps & Reports -https://delcopa.gov/courts/pdf/jd/2017preareport.pdf,Annual & Monthly Reports -https://delcopa.gov/publicrelations/releases/2020/pdf/govwolf_indoorrestaurants50percent.pdf,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-8-/,Media Bulletins -https://delcopa.gov/prison/pdfs/wardereports/2021/wardensreportmay2021.pdf,Annual & Monthly Reports -https://www.goldenbeach.us/documents/resolution-2219-12-authorizing-the-participation-in-a-lease-agreement-for-two-police-motorcycles/,Policies & Contracts -https://felton.delaware.gov/police/request-for-security-check-form/,Resources -https://delcopa.gov/publicrelations/releases/2021/covid_jan15update.html,Not Criminal Justice Related -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0391/,Poor Data Source -https://www.southamptontownnypolice.gov/1084/ia-owts-requirements,Not Criminal Justice Related -https://brookfieldil.gov/publication/special-fire-police-commission-meeting-august-23-2017/,Poor Data Source -https://delcopa.gov/employment/jobpostings/caseworker2_oid.html,Poor Data Source -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/022621blotter.pdf,Dispatch Logs -http://police.portlandmaine.gov/660/cdbg-priority-task-force,Not Criminal Justice Related -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0756/,Poor Data Source -https://alpha.austin.gov/es/police-oversight/indefinite-suspension-of-officer-jordan-wagstaff/,Poor Data Source -https://port-orange.us/2013/08/07/volusia-co-sheriffs-helicopter-makes-emergency-landing-on-beach/,Media Bulletins -https://brookfieldil.gov/calendar/police-pension-fund-board-of-trustees-meeting/,Poor Data Source -https://mountpocono-pa.gov/topics/police-courts/,Resources -https://cityofpowell.us/government/employment-opportunities/police-officer-selection-process-6/,Resources -https://delcopa.gov/ems/pdfdocs/initialcertificationeducationtesting/2022regionalemslistmap.pdf,Geographic -http://chico.ca.us/police-department-volunteers,Media Bulletins -http://www.longbeach.gov/police/press-releases/two-arrested-and-numerous-guns-seized/,Media Bulletins -http://www.lafayettepolice.us/faq.aspx?qid=208,Not Criminal Justice Related -https://alpha.austin.gov/es/police-oversight/temporary-suspension-of-officer-jeremy-bohannon/,Poor Data Source -https://alpha.austin.gov/police-oversight/temporary-suspension-of-officer-ryan-seweryn-2/,Poor Data Source -https://www.ci.san-bernardino.ca.us/city_hall/police_department/crime_statistics/about_ucr_statistics/arrest_statistics/arrest_statistics-2009,Crime Statistics -https://www.mass.gov/locations/state-police-millbury-barracks/locations,Geographic -https://www.coppelltx.gov/faq.aspx?qid=309,Not Criminal Justice Related -https://southcoffeyvilleok.gov/police-department/screen-shot-2016-09-27-at-4-41-47-pm/,Poor Data Source -http://www.longbeach.gov/police/press-releases/halloween-safety-tips/,Media Bulletins -http://www.ryepolice.us/logs/police-logs-for-21716-22316,Calls for Service -https://www.southbendin.gov/police/,Contact Info & Agency Meta -https://beaumonttexas.gov/beaumont-police-investigating-officer-involved-shooting-lindbergh-overpass/,Poor Data Source -https://police.greenvillesc.gov/324/business-assistance,Not Criminal Justice Related -https://www.wakeforestnc.gov/police/about-us/police-jobs/police-officer-employment,Training & Hiring Info -https://spdblotter.seattle.gov/2019/01/25/police-arrest-man-following-stabbing-in-pioneer-square-neighborhood/,Media Bulletins -https://www.mass.gov/doc/2020-chelmsford-police-lieutenant-sole-assessment-center-examination-in-title-employment/download,Training & Hiring Info -http://www.longbeach.gov/police/press-releases/fatal-traffic-collision/,Media Bulletins -https://oceansprings-ms.gov/form-pdf/ospd-police-reserve-application/,Poor Data Source -https://www.alamoheightstx.gov/public-safety/police/services/solicitor-information/,Resources -https://elkhartlakewi.gov/departments/police/meet-us/,Personnel Records -https://www.sanramon.ca.gov/our_city/departments_and_divisions/police/police_news/weekly_arrest_log,Arrest Records -https://www.dps.nm.gov/blog/2022/10/22/silver-alert-alamogordo-police-department-ralph-magruder/,Resources -https://www.ashevillenc.gov/news/asheville-police-department-to-add-patrol-district-realign-existing-districts-in-2020/,Media Bulletins -https://www.naperville.il.us/services/naperville-police-department/programs-and-services/police-department-tours/,Resources -https://southamptontownnypolice.gov/faq.aspx?qid=499,Resources -https://spdblotter.seattle.gov/2014/05/16/police-bolstering-patrols-as-detectives-investigate-recent-shootings/,Media Bulletins -https://www.newlexingtonohio.gov/resources/forms/police-department-public-records-request-form/,Records Request Info -https://champaignil.gov/police/resources/gun-violence-prevention-and-response/,Resources -https://townofkremmling.colorado.gov/departments/police,Resources -http://www.longbeach.gov/police/press-releases/murder-23-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-pch-and-pacific/,Media Bulletins -https://champaignil.gov/2014/03/24/police-arrest-one-suspect-in-home-invasion/,Media Bulletins -https://www.mass.gov/doc/rossi-cully-v-duxbury-police-department-related-superior-court-decision-52710/download,Court Cases -https://galenaks.gov/view-more-http-emjophotography-pass-us-galenapolicedepartment2018-8/,Poor Data Source -http://www.longbeach.gov/police/press-releases/significant-crime-reduction-during-first-year-metro-blue-line-contract/,Media Bulletins -https://southamptontownnypolice.gov/faq.aspx?qid=297,Resources -https://www.mass.gov/doc/copper-in-drinking-water-faq-english-0/download,Not Criminal Justice Related -https://police.beaumonttexas.gov/taxonomy-template/,Poor Data Source -http://www.longbeach.gov/police/press-releases/directed-enforcement-patrols-and-bicycle-theft-sting-results-in-arrests/,Media Bulletins -http://www.lafayettepolice.us/354/juvenile-investigations,Resources -https://www.mass.gov/directive/directive-93-7-exempt-sales-of-copying-machines-and-related-items,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/defendant-sentenced-to-45-years-for-charges-relating-to-human-trafficking/,Media Bulletins -https://delcopa.gov/publicrelations/releases/2018/2019doglicenses.html,Resources -https://www.knoxvilletn.gov/government/mayors_office/c_o_v_i_d-19___coronavirus_/stress_and_coping/knox_well/kid___parent_resources,Resources -https://spdblotter.seattle.gov/2016/08/17/police-search-for-leads-on-teen-girls-suspected-in-south-seattle-bleach-attacks/,Media Bulletins -https://www.chesterfield.in.gov/departments/police/,Resources -https://www.mass.gov/doc/fitchburgpolicesergeant7929rtf/download,Training & Hiring Info -http://www.tampa.gov/police/info/honoring-our-heroes/curtis-and-kocab/david-curtis,Personnel Records -https://www.antioch.il.gov/wpfb-file/08-03-11-police-and-fire-agenda-pdf/,Media Bulletins -https://www.southamptontownnypolice.gov/1782/2023-budgets,Resources -https://alpha.austin.gov/es/police-oversight/2020-06-30-2/,Poor Data Source -https://www.coronadelmar.us/procession-honors-newport-beach-police-detective/,Not Criminal Justice Related -https://coloradosprings.gov/police-department/article/news/las-vegas-street-and-south-tejon-street,Media Bulletins -https://rocklandmaine.gov/events/police-review-committee-meeting-18/,Poor Data Source -https://coloradosprings.gov/police-department/article/news/city-ordinance-area-expanded,Media Bulletins -https://delcopa.gov/publicrelations/releases/2022/delcohonoredtoreceivegovernersawardforlocalgovtexcellence.html,Media Bulletins -https://delcopa.gov/health/pages/animalbites.html,Resources -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/011321arrests.pdf,Arrest Records -http://www.longbeach.gov/police/press-releases/dui-drivers-license-checkpoint/,Media Bulletins -https://www.mass.gov/doc/perry-brian-v-boston-police-department-92012/download,Court Cases -https://www.memphistn.gov/government/police-department/in-memoriam/,Poor Data Source -https://www.mass.gov/doc/hamm-brendan-v-boston-police-department-111308/download,Court Cases -https://www.coppelltx.gov/666/sustainability-data,Poor Data Source -https://edenny.gov/town-of-eden-police-reform-plan/,Contact Info & Agency Meta -https://police.crystalmn.gov/r_e_s_i_d_e_n_t/community_development/permits_and_inspections,Resources -https://www.mass.gov/news/police-arrest-juvenile-for-homicide-in-adams-death,Media Bulletins -https://www.roseville.ca.us/government/departments/police_department/social_services/shop_with_a_cop,Misc Police Activity -https://alpha.austin.gov/en/police-oversight/2020-06-12-3/,Poor Data Source -https://www.mass.gov/regulations/515-cmr-500-standards-of-skill-for-special-state-police-officers,Training & Hiring Info -https://www.ci.rohnert-park.ca.us/city_hall/departments/public_safety/police_services/permits___licensing/solicitors_peddlers_permit,Resources -https://council.seattle.gov/2011/07/14/seattle-city-council-seeking-candidates-for-police-accountability-review-board/,Media Bulletins -https://directory.arkansas.gov/agency/arkansas-fire-and-police-pension-review-board/questions/,Poor Data Source -https://www.mass.gov/doc/pdf-copy-of-the-field-auditor-i-performance-audits-chicopee-job-description-2020-05-06/download,Training & Hiring Info -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0031-2/,Poor Data Source -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/081722blotter.pdf,Poor Data Source -https://edmonstonmd.gov/prince-georges-county-news-police-chief-town-hall-beautification/,Not Criminal Justice Related -https://www.dps.nm.gov/blog/2022/03/24/new-mexico-state-police-arrest-fugitive-tennessee-murder-suspects/,Media Bulletins -https://www.southamptontownnypolice.gov/943/the-hills---deis-april-2016,Resources -https://www.florenceaz.gov/police-hosting-a-town-hall-meeting-on-december-9th/,Misc Police Activity -https://www.hayward-ca.gov/discover/news/sep21/police-blotter-august-22-28-2021,Media Bulletins -http://police.portlandmaine.gov/552/peaks-island-services,Not Criminal Justice Related -https://beaumonttexas.gov/beaumont-police-arrest-hike-bike-auto-burglar-6450-folsom/,Poor Data Source -http://www.ryepolice.us/logs/police-logs-07-27-2022-08-02-2022,Daily Activity Logs -https://alpha.austin.gov/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/office-of-police-oversight-official-reports/,Poor Data Source -https://coloradosprings.gov/police-department/page/vin-verification-services,Resources -https://hollister.ca.gov/government/city-departments/police/join-our-team/,Training & Hiring Info -https://www.mass.gov/doc/fitzgibbon-daniel-v-boston-police-department-related-superior-court-decision-32113/download,Court Cases -https://delcopa.gov/pdf/2021budget.pdf,Policies & Contracts -http://www.longbeach.gov/police/about-the-lbpd/bureaus/investigations-bureau/detective-division/auto-theft-detail-and-t.r.a.p/,Resources -https://www.ci.san-ramon.ca.us/our_city/departments_and_divisions/police/srpd-downloads,Poor Data Source -https://www.antioch.il.gov/event/police-fire-commission-special-meeting-4/,Poor Data Source -http://www.longbeach.gov/police/press-releases/murder-investigation---2300-block-of-elm-avenue/,Media Bulletins -https://dps.iowa.gov/former-clarksville-police-officer-arrested,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-checkpoint-1-/,Media Bulletins -https://alpha.austin.gov/es/police-oversight/formal-complaint-de-escalation-of-potential-force-encounters-and-other-policy-violations-3/,Poor Data Source -https://www.southamptontownnypolice.gov/faq.aspx?qid=554,Resources -https://www.southamptontownnypolice.gov/faq.aspx?qid=78,Resources -http://www.longbeach.gov/police/press-releases/charges-filed-against-robbery-suspects/,Media Bulletins -http://www.longbeach.gov/police/press-releases/improving-motorcycle-safety-aim-of-l-b-p-d--operation-2-/,Media Bulletins -https://bouldercolorado.gov/events/police-oversight-panel-community-engagement-committee-meeting-0,Misc Police Activity -http://police.portlandmaine.gov/650/needle-exchange-program,Resources -https://delcopa.gov/departments/parks/pdf/redwoodmonthlyschedule.pdf,Poor Data Source -https://delcopa.gov/publicrelations/releases/2018/hopefortheholidays.html,Media Bulletins -https://detroitmi.gov/es/departments/departamento-de-policia/detroit-police-department-shield-program/recursos-de-socios-comunitarios,Poor Data Source -https://www.normanok.gov/public-safety/police-department/divisions/professional-standards,Complaints & Misconduct -http://www.longbeach.gov/police/press-releases/traffic-fatality7/,Media Bulletins -https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/contribute-to-police-oversight/file-a-complaint-about-an-austin-police-officer/,Poor Data Source -https://pittsburghpa.gov/police/police-administration,Poor Data Source -http://www.longbeach.gov/police/press-releases/dui-enforcement-operations-planned-this-weekend-3-/,Media Bulletins -https://www.mass.gov/event/2022-lowell-police-open-house-2022-01-10t170000-0500-2022-01-10t190000-0500,Poor Data Source -https://www.lynchburgvapolice.gov/wp-content/uploads/2022/10/suspect-express-lane-76-gas-10.27.2022-e1666893965762.png,Poor Data Source -https://southcoffeyvilleok.gov/police-department/contact/,Contact Info & Agency Meta -https://www.pleasantprairiewi.gov/departments/police/retail_theft_reporting,Resources -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/042622summary.pdf,Poor Data Source -https://delcopa.gov/council/2020minutes/05202020minutes.pdf,Poor Data Source -https://www.sandiego.gov/department-document/mayor-glorias-appointment-citizens-advisory-board-policecommunity-relations,Media Bulletins -https://www.mass.gov/doc/chicopee-district-court/download,Misc Police Activity -https://delcopa.gov/controller/pdf/2022/faq-changetothecustodialbankfordelawarecountyretirementaccounts.pdf,Resources -https://www.troyny.gov/mayor-madden-announces-the-promotion-of-steven-barker-to-the-rank-of-assistant-chief-of-police/,Poor Data Source -http://www.longbeach.gov/police/press-releases/traffic-fatality-5-/,Media Bulletins -https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/january-16-activity-report/,Incident Reports -https://delcopa.gov/courts/judges/kelly.html,Personnel Records -https://www.mass.gov/doc/the-challenging-investment-climate-how-to-cope/download,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested-and-charged-2-/,Media Bulletins -https://twp.northfield.il.us/coffee-with-a-cop-northbrook/,Poor Data Source -https://delcopa.gov/publicrelations/releases/2021/pdf/delcoerainpersonflyer.pdf,Not Criminal Justice Related -https://www.naperville.il.us/services/naperville-police-department/programs-and-services/false-alarm-reduction-program/,Resources -https://alpha.austin.gov/police-oversight/2020-06-4-18/,Poor Data Source -https://www.va.gov/martinsburg-health-care/stories/martinsburg-vamc-premiers-use-of-disposable-duodenoscopes/,Not Criminal Justice Related -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0460/,Poor Data Source -https://spdblotter.seattle.gov/2012/03/02/south-seattle-residents-police-team-up-to-take-back-rainier-beach/,Misc Police Activity -https://delcopa.gov/publicrelations/releases/2019/prisonboardmeetingcancelled.html,Poor Data Source -https://delcopa.gov/ojs/efileforms/ojs forms for efile/writofsummons.pdf,Poor Data Source -https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/summary-of-overarching-recommendations/,Poor Data Source -https://delcopa.gov/workshops/,Not Criminal Justice Related -https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scoperesponsibility-to-the-community-and-other-policy-violations-1/,Poor Data Source -https://ose.louisiana.gov/event/chief-of-police/,Poor Data Source -http://www.longbeach.gov/police/press-releases/l-b-p-d--offers-holiday-safety-tips/,Media Bulletins -https://www.sandiego.gov/department-document/police-identify-emerald-hills-homicide-victim,Media Bulletins -https://rocklandmaine.gov/police-department/pedestrian-safety-crosswalk-safety/attachment/crosswalk-enforcement-2/,Poor Data Source -https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-6/,Poor Data Source -https://ci.piedmont.ca.us/services___departments/police/services/request_a_report,Resources -http://www.longbeach.gov/police/press-releases/dui---driver-s-license-checkpoint-planned-this-weekend-2147407661/,Media Bulletins -http://www.longbeach.gov/police/press-releases/sexual-assault-suspect-arrested--additional-victims-sought/,Media Bulletins -https://www.southamptontownnypolice.gov/1560/candle-light-vigil,Misc Police Activity -https://www.southamptontownnypolice.gov/faq.aspx?qid=425,Resources -http://www.tampa.gov/police/info/honoring-our-heroes/1998/detective-randy-bell,Media Bulletins -https://alpha.austin.gov/es/police-oversight/formal-complaint-2020-1346/,Poor Data Source -http://www.longbeach.gov/police/press-releases/officer-involved-shootings-occur-after-suspect-fires-at-officers--leads-police-on-vehicle-pursuit/,Media Bulletins -https://www.coppelltx.gov/903/coppell-recreation-and-development-corpo,Not Criminal Justice Related -https://www.sanramon.ca.gov/our_city/departments_and_divisions/police/victims_rights_information/domestic_violence,Resources -https://www.mass.gov/doc/cruceta-neysa-v-boston-police-department-4512/download,Court Cases -https://www.montgomeryohio.gov/police-department-2020-annual-report/office-otte-sro/,Poor Data Source -https://dccouncil.gov/donation-disclosures/copy-of-april-2018-donation-disclosure-4/,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/092421arrests.pdf,Arrest Records -https://champaignil.gov/2014/04/23/fire-and-police-memorial-public-dedication-ceremony/,Not Criminal Justice Related -https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0976/,Poor Data Source -https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2017_news_releases/police_continue_missing_person_investigation,Media Bulletins -https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0129/,Poor Data Source -http://www.longbeach.gov/police/press-releases/business-license-operation-conducted/,Media Bulletins -https://www.antioch.il.gov/wpfb-file/08-11-10-police-and-fire-commission-minutes-pdf-2/,Not Criminal Justice Related -https://delcopa.gov/publicrelations/releases/2020/staythecourse.html,Media Bulletins -http://www.longbeach.gov/police/press-releases/robbery-suspects-arrested/,Media Bulletins -https://delcopa.gov/jdboard/pdfs/minutes_2021_09_21.pdf,Misc Police Activity -https://police.kingstontn.gov/team/raymond-gold/,Poor Data Source -https://www.montebelloca.gov/departments/police/news/all_news_articles/national_night_out_2021,Misc Police Activity -https://www.lynchburgvapolice.gov/wp-content/uploads/2021/05/headlamp-2940-scaled.jpg,Poor Data Source -http://www.ryepolice.us/logs/police-logs-for-4-22-20-4-28-20,Daily Activity Logs -https://mtcb.colorado.gov/police/animal-regulations-ordinances,Resources -http://www.ryepolice.us/logs/police-logs-for-52516-53116,Daily Activity Logs -https://delcopa.gov/ich/resources/covid19/pdf/delcocovid19vaccinationsites.pdf,Poor Data Source -https://delcopa.gov/publicrelations/releases/2019/energyefficiency.html,Not Criminal Justice Related -https://cheswold.delaware.gov/cheswold-police-department-policy-and-procedure-manual/reports/,Policies & Contracts -http://police.portlandmaine.gov/400/payments,Resources -https://delcopa.gov/courts/pdf/emergencyjudicialorders/sixthemergencyextensionorder_criminalsection.pdf,Court Cases -https://www.mass.gov/doc/cspolicechiefeeinstructions2010doc/download,Poor Data Source -https://www.mass.gov/doc/011718-public-scoping-meeting-commercial-menhaden-management/download,Not Criminal Justice Related -https://delcopa.gov/pollingplace/,Not Criminal Justice Related -https://police.greenvillesc.gov/1826/laurens-road-transit-study,Not Criminal Justice Related -http://lafayettepolice.us/1099/operations,Poor Data Source -https://www.mass.gov/doc/2021-hanover-police-lieutenant-sole-assessment-center-examination-employment-verification-form/download,Not Criminal Justice Related -http://www.ryepolice.us/logs/police-logs-for-7-25-18-7-31-18,Daily Activity Logs -https://hollister.ca.gov/government/city-departments/police/,Media Bulletins -https://www.foxcrossingwi.gov/departments/police-department/patrol/wreck/,Poor Data Source -https://www.lakewoodoh.gov/coffee-with-a-cop-set-for-friday-january-12th/,Misc Police Activity -https://www.panynj.gov/police/en/about/leadership.html#main,Personnel Records -https://gonzalesca.gov/services/police/how-do-i/learn-what-do-if-i-become-victim-crime,Resources -https://southamptontownnypolice.gov/faq.aspx?qid=323,Not Criminal Justice Related -https://www.hayward-ca.gov/police-department/public-services/youth-family-services-bureau/contact,Resources -http://lafayettepolice.us/3400/enrichment-and-training-programs,Not Criminal Justice Related -https://delcopa.gov/vetaffairs/forms/va26-1880-are.pdf,Not Criminal Justice Related -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0034/,Poor Data Source -https://champaignil.gov/tag/police-chief-recruitment/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-8-/,Media Bulletins -https://southamptontownnypolice.gov/faq.aspx?qid=485,Not Criminal Justice Related -https://www.antioch.il.gov/2017/09/18/police-department-media-release-2/,Media Bulletins -https://www.southamptontownnypolice.gov/faq.aspx?qid=443,Resources -https://delcopa.gov/publicrelations/releases/18pdfs/18opioidmentalsummit.pdf,Misc Police Activity -https://www.huntsvilleal.gov/huntsville-police-department-honors-12-fallen-officers-2/,Media Bulletins -https://alpha.austin.gov/police-oversight/formal-complaint-purpose-and-scope-10/,Poor Data Source -https://council.seattle.gov/2016/09/15/our-north-seattle-police-precinct/,Policies & Contracts -https://www.southamptontownnypolice.gov/1629/nitrogen-reducing-biofilter-incarnation-,Not Criminal Justice Related -https://spdblotter.seattle.gov/2011/03/04/one-day-community-police-academy/,Media Bulletins -https://southamptontownnypolice.gov/faq.aspx?qid=266,Complaints & Misconduct -https://norfolkne.gov/assets/site/documentcentral/police/archived-arrests/2017-arrests/oct-2017-arrests.pdf,Arrest Records -https://owd.boston.gov/wp-content/uploads/2022/06/davidramos3-1-copy.jpg,Poor Data Source -https://delcopa.gov/courts/domesticrelations/forms/directdepositenrollment.pdf,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/traffic-fatality3/,Media Bulletins -https://www.knoxvilletn.gov/government/city_departments_offices/community_empowerment/police_advisory_review_committee,Misc Police Activity -https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2018_archived_news/september_2018/two_arlington_police_officers_honored_by_governor,Media Bulletins -https://www.colma.ca.gov/question/how-do-i-get-a-copy-of-a-birth-certificate/,Resources -https://beaumonttexas.gov/beaumont-police-traffic-division-investigating-a-fatality-crash-eastex-frwy-and-chinn-ln/,Poor Data Source -http://www.longbeach.gov/police/press-releases/lbpd-recruit-academy-graduation-ceremony-held-today/,Media Bulletins -http://beaverpolice.us/event/beaver-county-symphonic-wind-ensemble-concert/,Not Criminal Justice Related -https://hilliardohio.gov/tag/police-recruitment/,Poor Data Source -https://brookfieldil.gov/publication/050609-may-6-2009-fire-and-police-commission/,Poor Data Source -https://www.southamptontownnypolice.gov/faq.aspx?qid=262,Not Criminal Justice Related -https://www.sandiego.gov/department-document/police-identify-burned-homicide-victim-bay-park,Media Bulletins -https://delcopa.gov/council/2018minutes/101718minutes.pdf,Not Criminal Justice Related -https://hollister.ca.gov/government/city-departments/police/,Personnel Records -https://alpha.austin.gov/es/police-oversight/2020-06-09-14/,Poor Data Source -https://delcopa.gov/sustainability/presentations/22/12_victordonnay_v2.pptx,Not Criminal Justice Related -https://coloradosprings.gov/police-department/page/cspd-community-survey,Poor Data Source -http://chico.ca.us/post/chico-police-officer-mark-bass-honored-chico-noon-exchange-74th-annual-peace-officer-year,Media Bulletins -https://www.roseville.ca.us/government/departments/police_department/community_services/my_neighborhood_officer/beat_4,Resources -http://www.longbeach.gov/police/press-releases/murder-suicide-1500-block-of-park-avenue/,Media Bulletins -https://www.happyvalleyor.gov/services/police-department/reporting-accidents/,Resources -https://www.gov.ca.gov/2020/04/02/governor-newsom-statement-on-death-of-santa-rosa-police-detective/,Poor Data Source -https://www.milpitas.gov/milpitas/departments/police/recruitment-training/,Poor Data Source -http://www.longbeach.gov/police/press-releases/arsonist-sought-in-flag-burning-case/,Media Bulletins -https://delcopa.gov/departments/womenscommission/20history.html,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/traffic-fatality-spring-street-west-of-el-dorado-park/,Media Bulletins -https://www.southamptontownnypolice.gov/faq.aspx?qid=510,Resources -https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-42/,Poor Data Source -https://ci.newcastle.wa.us/departments/police/e-_alerts,Resources -http://www.longbeach.gov/police/press-releases/traffic-fatality-pch--myrtle-ave/,Media Bulletins -https://www.mass.gov/doc/05-14-15-police-and-school-officials-attend-da-morrisseys-safe-and-supportive-schools-0/download,Not Criminal Justice Related -https://www.mass.gov/doc/emergencywaiverpcopdf/download,Poor Data Source -https://www.antioch.il.gov/wpfb-file/12-13-11-police-pension-fund-agenda-pdf-4/,Policies & Contracts -https://www.mass.gov/doc/state-police-academy-rules-and-regulations/download,Training & Hiring Info -https://www.crystalmn.gov/how_do_i____/contact/police_department,Contact Info & Agency Meta -https://www.roundrocktexas.gov/news/police-investigate-new-years-eve-auto-pedestrian-collision/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-investigation8/,Media Bulletins -https://www.roseville.ca.us/news/archive_news/2017_archive_news/police_digest_120117,Poor Data Source -https://www.huntsvilleal.gov/organizer/huntsville-police-department/,Misc Police Activity -https://brimfieldohio.gov/event/bpd-coffee-with-a-cop/,Misc Police Activity -https://shelbycity.oh.gov/wp-content/uploads/2020/03/downtown-flag-dark-copy-150x150.jpg,Poor Data Source -https://delcopa.gov/ampembed?url=https://delcowebmedia2-usea.streaming.media.azure.net/79bc7ec7-9862-4100-bfd8-06a71de3d5af/delaware county covid-19 memoria.ism/manifest,Poor Data Source -https://police.greenvillesc.gov/faq.aspx?qid=63,Resources -https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-courtesy-department-issued-bwc/,Poor Data Source -http://edmonstonmd.gov/departments-services/police/photo-enforcement/,Resources -https://health.wyo.gov/publichealth/office-of-performance-improvement-and-health-equity/sha/health-improvement-strategy/copy-of-ship-access-cga-video-es/,Resources -https://www.mass.gov/doc/flaherty-and-mccarthy-v-boston-police-department-12909/download,Court Cases -https://www.mass.gov/doc/municipal-police-training-committee-cjt/download,Poor Data Source -https://delcopa.gov/council/2016minutes/080316minutes.pdf,Not Criminal Justice Related -https://www.lynchburgvapolice.gov/wp-content/uploads/2021/05/headlamp-2940-scaled.jpg,Poor Data Source -https://coloradosprings.gov/police-department/article/news/traffic-fatality-1200-block-north-academy,Media Bulletins -https://delcopa.gov/planning/pubs/saldoappenixcpreliminary.pdf,Not Criminal Justice Related -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/040421summary.pdf,Daily Activity Logs -http://www.longbeach.gov/police/press-releases/found---critical-missing-person---/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-2-/,Media Bulletins -https://www.mass.gov/info-details/audit-of-the-worcester-state-university-objectives-scope-and-methodology,Not Criminal Justice Related -https://wrightstown.us/police-crime-prevention-programs/neighborhood-watch/img_2876/,Poor Data Source -https://southamptontownnypolice.gov/214/transportation-traffic-safety,Not Criminal Justice Related -https://www.rentonwa.gov/city_hall/police/staff_services,Resources -http://beaverpolice.us/staff-members/eric-schwartz/,Poor Data Source -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0159/,Poor Data Source -http://www.ryepolice.us/announcements/new-rye-animal-control-instragram/attachment/dumpster-divers,Poor Data Source -https://www.wakeforestnc.gov/police/public-information/firing-range,Resources -https://www.antioch.il.gov/wpfb-file/coffee-with-the-cop-oct-pdf/,Misc Police Activity -https://www.coronadelmar.us/police-investigating-social-media-threat-against-newport-mesa-unified-high-schools/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-investigation---4th-street-and-pacific-avenue/,Media Bulletins -https://www.coronadelmar.us/newport-beach-mourns-locals-killed-in-helicopter-crash-media-6/,Not Criminal Justice Related -https://southamptontownnypolice.gov/439/southampton-shinnecock-hills-tuckahoe-ca,Not Criminal Justice Related -https://santabarbaraca.gov/news/santa-barbara-police-requesting-assistance-locating-attempt-murder-suspect,Media Bulletins -https://www.hickoryhillspd.us/2014/06/message-from-the-chief-of-police/,Poor Data Source -https://www.woodvillageor.gov/departments/public-safety/police-law-enforcement/,Resources -https://www.mass.gov/info-details/the-massachusetts-port-authority-audit-objectives-scope-and-methodology,Policies & Contracts -https://www.coppelltx.gov/faq.aspx?qid=249,Resources -https://www.hayward-ca.gov/police-department/programs/business-watch-program,Resources -http://www.longbeach.gov/police/press-releases/residential-burglary-suspect-arrested/,Media Bulletins -https://www.burienwa.gov/news_events/city_newsroom/news_announcements/burien_police_chief_promoted_within_kcso,Media Bulletins -https://www.lynchburgvapolice.gov/news-updates/update-news-release-incident-involving-lpd-officer/,Media Bulletins -https://delcopa.gov/vsc/,Not Criminal Justice Related -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/arrests/070722arrests.pdf,Poor Data Source -http://www.ryepolice.us/westnile,Not Criminal Justice Related -https://www.ashevillenc.gov/news/asheville-police-department-launches-online-reporting-as-part-of-upgraded-police-to-citizen-tool/,Media Bulletins -https://delcopa.gov/courts/juror/eresponse.html,Resources -https://www.mass.gov/doc/public-meeting-ma-state-police-lower-basin-barracks-modernization/download,Not Criminal Justice Related -https://norfolkne.gov/assets/site/documentcentral/police/archived-calls-for-service/2017-calls-for-service/march2017cfs.pdf,Calls for Service -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/111821summary.pdf,Dispatch Logs -http://www.greenvillenc.gov/government/police/mental-health-crisis-services,Poor Data Source -https://www.roseville.ca.us/government/departments/electric_utility/rebates___energy_savings/your_trusted_solar_advisor_copy,Not Criminal Justice Related -https://delcopa.gov/publicrelations/releases/2020/covidtesting_canceledmillbournesept.html,Not Criminal Justice Related -https://www.lynchburgvapolice.gov/wp-content/uploads/2021/06/lynchburg-police-patch-new-w-red.png,Poor Data Source -http://www.longbeach.gov/police/press-releases/charges-filed-in-2002-murder/,Media Bulletins -https://www.gurnee.il.us/events/2017/06/10/default-calendar/2017-outrun-the-cops!,Not Criminal Justice Related -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/092921blotter.pdf,Dispatch Logs -https://santabarbaraca.gov/government/departments/santa-barbara-police-department,Contact Info & Agency Meta -https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2019_news_releases/19-_year-_old_suffers_fatal_gunshot_wound_update,Not Criminal Justice Related -https://www.prescott-az.gov/services-safety/police/police-program-and-services/,Contact Info & Agency Meta -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/060721summary1.pdf,Dispatch Logs -https://delcopa.gov/planning/programsandinitiatives/naturalresourceprotection.html,Resources -https://www.edmondswa.gov/services/police,Contact Info & Agency Meta -https://www.southamptontownnypolice.gov/faq.aspx?qid=79,Not Criminal Justice Related -https://coloradosprings.gov/police-department/page/coffee-cop,Not Criminal Justice Related -https://www.wheelingwv.gov/policejobs,Training & Hiring Info -http://www.ryepolice.us/announcements/aquarion-water-company-boil-order-8-23-19,Not Criminal Justice Related -https://delcopa.gov/delcoready/involved.html,Resources -https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0889/,Poor Data Source -https://delcopa.gov/publicrelations/releases/2019/airforceflagraising.html,Not Criminal Justice Related -https://police.birminghamal.gov/command-staff/lieutenants/,Personnel Records -https://www.mass.gov/info-details/audit-of-the-massachusetts-bay-transportation-authority-objectives-scope-and-methodology,Not Criminal Justice Related -https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0765/,Poor Data Source -http://www.longbeach.gov/police/press-releases/fatal-hit-and-run/,Media Bulletins -https://ose.louisiana.gov/event/police-communications-officer-34/,Poor Data Source -https://www.ci.san-ramon.ca.us/our_city/departments_and_divisions/police/victims_rights_information/hate_violence,Poor Data Source -https://delcopa.gov/planning/pdf/demodata/povertystatus.pdf,Not Criminal Justice Related -https://www.lynchburgvapolice.gov/wp-content/uploads/2022/02/20220201_162001000_ios.jpg,Poor Data Source -http://www.longbeach.gov/police/press-releases/murder-1200-block-of-e--17th-street/,Media Bulletins -https://www.mass.gov/doc/municipal-police-training-committee-mptc-meeting-minutes-101619/download,Misc Police Activity -https://www.arlingtontx.gov/news/my_arlington_t_x/news_stories/arlington_police_chief_announces_retirement,Media Bulletins -https://coloradosprings.gov/article/news/balltoberfest-collects-donated-sports-balls-police-departments-play-cos,Not Criminal Justice Related -https://www.florenceaz.gov/jobs/police-records-clerk/,Poor Data Source -https://coloradosprings.gov/police-department/article/news/homicide-investigation-3500-block-south,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder--9th-st----locust-ave--/,Media Bulletins -https://www.pleasantprairiewi.gov/news/2021_news/police_department_celebrates_50_years_of_service,Media Bulletins -https://www.sandiego.gov/department-document/san-diego-police-announce-arrests-home-invasion-series,Media Bulletins -http://www.ryepolice.us/pressrelease/birchwood-drive-reckless-conduct-press-release/attachment/hordon,Poor Data Source -https://champaignil.gov/police/about-us/policies-and-procedures/,Policies & Contracts -http://www.longbeach.gov/police/press-releases/dui-enforcement-operation-planned-st--patrick-s-day/,Media Bulletins -https://civicpride.jacksontn.gov/government/public_notices___press_releases/newjpdchiefofpolice,Not Criminal Justice Related -https://police.greenvillesc.gov/1643/photo-gallery,Resources -https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scoperesponsibility-to-the-community-and-other-policy-violations-13/,Poor Data Source -https://delcopa.gov/council/2015minutes/032515minutes.pdf,Not Criminal Justice Related -https://norfolkne.gov/government/departments/police-division/press-releases/,List of Data Sources -http://www.lafayettepolice.us/175/physical-tactics-room,Training & Hiring Info -http://www.longbeach.gov/police/press-releases/officer-involved-shooting2/,Media Bulletins -https://www.douglas.co.us/documents/how-to-open-a-copy-account-with-douglas-county.pdf/,Records Request Info -https://www.ashevillenc.gov/news/asheville-police-release-citizen-complaint-and-9-1-1-call-data-on-open-data-portal/,Resources -http://www.longbeach.gov/police/press-releases/crime-continues-to-decrease-in-long-beach/,Media Bulletins -https://www.michigan.gov/som/government/state-license-search/l/law-enforcement-officer-police,Poor Data Source -https://www.colma.ca.gov/documents/jd-police-commander/,Training & Hiring Info -https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/how-to-use-official-documents/,Poor Data Source -https://civicpride.jacksontn.gov/government/departments/police/divisions/administrative/law_enforcement_technologies,Not Criminal Justice Related -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/arrests/021622arrests.pdf,Poor Data Source -https://delcopa.gov/ojs/ojsforms/cifinfosheet.pdf,Resources -http://www.longbeach.gov/police/press-releases/l-b-p-d--academy-graduation-ceremony-held-today/,Media Bulletins -https://ethics.ny.gov/news/jcope-settles-public-officers-law-violation-former-mta-employee,Media Bulletins -https://sanramon.ca.gov/our_city/departments_and_divisions/police/community_programs/youth_services/station_tours,Resources -http://police.portlandmaine.gov/293/elder-services,Resources -https://www.ci.san-ramon.ca.us/our_city/departments_and_divisions/police/fee_and_forms/violation_of_city_ordinance,Resources -https://www.mass.gov/doc/wallace-patrick-v-beverly-police-department-11608/download,Court Cases -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/093021blotter.pdf,Dispatch Logs -https://www.lasalle-il.gov/about-la-salle/city-governance/city-committees/police-judiciary,Contact Info & Agency Meta -https://spdblotter.seattle.gov/2015/08/26/police-need-your-help-to-find-missing-toddler-kevin-szal/,Media Bulletins -https://www.sandiego.gov/department-document/update-police-investigate-murder-clairemont,Media Bulletins -https://www.mass.gov/doc/bcntsaplymouthreverecopperamendmentpdf/download,Poor Data Source -http://www.ryepolice.us/pressrelease/rye-beaches-reopening-june-1-2020-press-release/attachment/press-release_0001,Media Bulletins -https://detroitmi.gov/departments/police-department/detroit-police-department-shield-program/community-partner-resources,Misc Police Activity -https://www.southamptontownnypolice.gov/faq.aspx?qid=539,Not Criminal Justice Related -https://www.lynchburgvapolice.gov/news-updates/attempted-armed-robbery-at-att-store/,Media Bulletins -https://delcopa.gov/publicrelations/releases/2020/blackhistorymonth.html,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/traffic-fatality-14-/,Media Bulletins -https://www.foxcrossingwi.gov/departments/police-department/history/badge1/,Poor Data Source -https://www.knoxvilletn.gov/archived_news_stories/2008/police_explorer_class_orientation,Not Criminal Justice Related -https://coloradosprings.gov/police-department/article/news/officer-involved-shooting-march-7-2022,Officer Involved Shootings -https://coloradosprings.gov/police-department/article/news/cspd-accident-alert-status-may-7-11-2021,Media Bulletins -http://www.longbeach.gov/police/press-releases/felony-robbery-suspect-arrested-and-charged-1-/,Media Bulletins -https://www.osc.state.ny.us/local-government/audits/fire-company-or-department/2015/12/18/copenhagen-fire-department-controls-over-financial-activities,Not Criminal Justice Related -https://hilliardohio.gov/hilliard-polices-sgt-higgins-retires-april/,Media Bulletins -https://delcopa.gov/courts/specialtycourts/pdf/drugtreatment/treatment court - general rules.pdf,Resources -https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2018_archived_news/july_2018/july_2018_arlington_police_community_newsletter,Media Bulletins -http://www.longbeach.gov/police/how-do-i/get-inmate-information/,Resources -http://www.lafayettepolice.us/726/home-emergency-plans,Contact Info & Agency Meta -https://delcopa.gov/council/2019minutes/010919minutes.pdf,Not Criminal Justice Related -https://covington.va.us/city-government/city-departments/police/,Media Bulletins -https://www.southamptontownnypolice.gov/899/law-enforcement-career-exploring-program,Training & Hiring Info -https://delcopa.gov/sustainability/presentations/22/11_kellysanders_v1.pptx,Not Criminal Justice Related -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0725/,Poor Data Source -https://www.lynchburgvapolice.gov/news-updates/shooting-scene-on-golf-park-drive/,Media Bulletins -https://www.montgomeryohio.gov/historic-photos/police-officers-1970_50506081303_o/,Poor Data Source -https://www.montgomeryohio.gov/police-department-citizen-complaint-notice/,Complaints & Misconduct -https://www.doj.state.or.us/events/predicting-intimate-partner-violence-injuries-based-on-police-reports/,Poor Data Source -https://alpha.austin.gov/es/police-oversight/formal-complaint-de-escalation-of-potential-force-encounters-and-other-policy-violations-7/,Poor Data Source -https://alpha.austin.gov/es/police-oversight/9-17-20-3/,Poor Data Source -https://delcopa.gov/planning/pdf/mapping/tinicum.pdf,Poor Data Source -https://detroitmi.gov/departments/police-department/senior-citizens-911-profile,Resources -https://pittsburghpa.gov/police/ssd,Poor Data Source -http://www.longbeach.gov/police/press-releases/in-custody-death-1-/,Media Bulletins -https://www.hayward-ca.gov/police-department/public-services/youth-family-services-bureau//curfew-violations,Media Bulletins -https://dccouncil.gov/judiciary-public-safety/copy-of-fo0_fy19_attachment-iv/,Annual & Monthly Reports -http://www.longbeach.gov/police/press-releases/deceased-infant-found-in-alley/,Media Bulletins -https://toddmissiontx.gov/mp_teams/police-department/,Contact Info & Agency Meta -https://police.birminghamal.gov/bureaus/patrol/tactical-operations-precinct/,Contact Info & Agency Meta -https://www.mass.gov/doc/jlm-13-2559-city-of-springfield-and-international-brotherhood-of-police-officers-local-364/download,Misc Police Activity -https://www.southamptontownnypolice.gov/1340/endangered-species-resolutions,Not Criminal Justice Related -https://alpha.austin.gov/es/police-oversight/recommendations-for-improving-apds-policy-development-practices/,Poor Data Source -http://www.lafayettepolice.us/1618/research-participation-spotlight,Not Criminal Justice Related -https://spdblotter.seattle.gov/2012/07/03/spd-taking-applications-for-autumn-community-police-academy/,Media Bulletins -http://www.tampa.gov/news/tampa-police-conduct-death-investigation-interstate-275-76591,Poor Data Source -https://champaignil.gov/2012/03/22/police-officer-written-exam/,Training & Hiring Info -https://audgen.michigan.gov/complete-projects/michigan-state-police-retirement-system/r071015416/,List of Data Sources -https://cityofpowell.us/reports/auto-draft-322/2020-08-police-department/,Annual & Monthly Reports -http://police.portlandmaine.gov/652/portland-community-free-clinic,Resources -https://barnegatpolice.us/download/missing-person-report-ncic/,Resources -https://delcopa.gov/courts/domesticrelations/changeofaddress.html,Resources -https://www.newcarrolltonmd.gov/government/departments/police_department/how_do_i__/vehicle_release,Contact Info & Agency Meta -https://www.colma.ca.gov/document_taxonomy/police-department/,List of Data Sources -https://www.fortworthtexas.gov/departments/police/professional-standards,List of Data Sources -https://brookfieldil.gov/police-pension-board-012920/,Poor Data Source -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0373/,Poor Data Source -https://alpha.austin.gov/en/police-oversight/temporary-suspension-of-police-sergeant-jeffrey-dwyer/,Poor Data Source -http://www.longbeach.gov/police/press-releases/murder-46-/,Media Bulletins -https://www.southamptontownnypolice.gov/1325/mill-pond-association,Not Criminal Justice Related -https://www.southamptontownnypolice.gov/1323/village-of-sag-harbor---green-infrastruc,Not Criminal Justice Related -https://elkhartlakewi.gov/departments/police/,Contact Info & Agency Meta -https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scoperesponsibility-to-the-community-and-other-policy-violations-7/,Poor Data Source -https://columbiacitypolice.us/documents/daily stats/3.23.21.pdf,Poor Data Source -http://police.portlandmaine.gov/844/friends-of-woodfords-corner,Not Criminal Justice Related -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0145/,Poor Data Source -http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-nets-3-arrest/,Media Bulletins -https://www.southamptontownnypolice.gov/154/forms-applications,Resources -https://www.antioch.il.gov/wpfb-file/04-14-15-police-and-fire-agenda-pdf-3/,Poor Data Source -https://delcopa.gov/planning/pubs/delco2035transportationplan.html,Not Criminal Justice Related -https://www.antioch.il.gov/wpfb-file/nicorcoppernotice-pdf-3/,Not Criminal Justice Related -https://www.giddingspolice-tx.us/about-1,Complaints & Misconduct -http://lafayettepolice.us/441/how-you-can-help,Not Criminal Justice Related -https://www.woburnma.gov/government/police/policies-and-procedures-for-issuing-a-ltc-with-application/,Training & Hiring Info -http://www.longbeach.gov/police/press-releases/murder-anaheim-st.--walnut-ave/,Media Bulletins -https://www.ci.rohnert-park.ca.us/services/emergency_services/police_and_fire_services,Resources -http://www.longbeach.gov/police/press-releases/critical-missing-person-rosa-ella-brady/,Media Bulletins -https://cityofpowell.us/powell-police-chief-stephen-hrytzik-elected-section-iv-representative-of-fbi-national-academy-associates/chiefhrytzik_credit_klattephotography/,Contact Info & Agency Meta -http://police.byram-ms.us/news/,Poor Data Source -https://delcopa.gov/courts/domesticrelations/copiesoforder.html,Resources -https://riag.ri.gov/press-releases/pawtucket-police-officer-charged-west-greenwich-shooting-incident,Officer Involved Shootings -https://alpha.austin.gov/en/police-oversight/formal-complaint-insubordination-and-other-policy-violations/,Poor Data Source -https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scoperesponsibility-to-the-community-and-other-policy-violations-5/,Poor Data Source -https://www.antioch.il.gov/wpfb-file/09-09-11-police-pension-fund-agenda-pdf-2/,Poor Data Source -http://www.longbeach.gov/police/press-releases/traffic-fatality-5-/,Media Bulletins -https://www.mass.gov/doc/proposed-amendments-to-115-cmr-100-scope-and-authority-0/download,Policies & Contracts -https://delcopa.gov/publicrelations/releases/18pdfs/18hearthealthwearred .pdf,Not Criminal Justice Related -https://cityofpowell.us/government/building-department/city-of-powell-commercial-building/checklist-cop-comm-change-of-occ-01-08-19/,Resources -https://www.stpaul.gov/departments/police/administration-office-chief/operations-division/canine-k-9-unit,Training & Hiring Info -https://coloradosprings.gov/police-department/page/colorado-springs-police-department-birthday,Not Criminal Justice Related -https://alpha.austin.gov/es/police-oversight/message-from-the-office-of-police-oversight-director/,Poor Data Source -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/102122summary.pdf,Poor Data Source -https://norfolkne.gov/assets/site/documentcentral/police/statistical-reports/ytd-mayor-030120.pdf,Annual & Monthly Reports -https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/may-2018-activity-report/,Annual & Monthly Reports -https://www.mass.gov/how-to/submit-a-public-records-request-to-the-municipal-police-training-committee,Resources -https://ose.louisiana.gov/event/police-communications-officer-52/,Poor Data Source -https://www.minneapolismn.gov/government/programs-initiatives/community-safety/background/police-operational-assessment/mpd-operational-assessment-contract/,Policies & Contracts -https://delcopa.gov/courts/districtjudges/index.html,Media Bulletins -http://www.cityofpataskalaohio.gov/cop_folder/minutes-2015/january-5-2015-council-public-hearing/,Not Criminal Justice Related -https://delcopa.gov/publicrelations/releases/2020/flushot_broomall.html,Not Criminal Justice Related -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0323/,Poor Data Source -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/092022blotter.pdf,Dispatch Logs -https://www.roseville.ca.us/government/departments/police_department/divisions/k-9,Misc Police Activity -http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-one-arrest2/,Media Bulletins -https://alpha.austin.gov/police-oversight/know-your-rights-video-series/,Poor Data Source -https://toddmissiontx.gov/departments/police-department/mission-statement/,Policies & Contracts -https://delcopa.gov/planning/demodata/municipalinformation.html,Poor Data Source -https://alpha.austin.gov/en/police-oversight/written-reprimand-of-officer-david-freston/,Poor Data Source -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/122421blotter.pdf,Dispatch Logs -https://www.pleasantprairiewi.gov/news/2014_news/police_department_live,Poor Data Source -https://delcopa.gov/publicrelations/releases/2021/emergencybroadbandbenefitprogram.html,Not Criminal Justice Related -https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-216-april-2021-increases-location-pay-supplemental-location-pay-expanded,Media Bulletins -https://cityofpowell.us/police-agency/traffic-surveys/traffic-survey-report-1-13-20-2/,Contact Info & Agency Meta -https://townofcampbellwi.gov/public-safety/police/forms/,Poor Data Source -https://alpha.austin.gov/es/police-oversight/formal-complaint-search-protocol/,Poor Data Source -https://www.antioch.il.gov/wpfb-file/12-11-12-police-pension-agenda-pdf-5/,Poor Data Source -https://delcopa.gov/planning/calendar/eventcalendar_june.html,Misc Police Activity -https://www.mass.gov/doc/chelmsford-police-department-promotion-investigation-report/download,Court Cases -https://www.troyny.gov/photos-troy-police-department-appoints-new-officers/,Media Bulletins -http://www.paloshillspolice.us/wp-content/uploads/2013/05/redlight.jpg,Poor Data Source -https://www.bedminster.us/police_fire_rescue/police_department,Contact Info & Agency Meta -https://scrantonpa.gov/your-government/police-department/juvenile-unit/,Contact Info & Agency Meta -http://www.longbeach.gov/police/press-releases/applications-for-volunteer-senior-police-partners-program-now-being-accepted/,Media Bulletins -https://www.va.gov/eastern-oklahoma-health-care/stories/va-suicide-prevention-program-recognizes-tulsa-police-officer/,Media Bulletins -https://champaignil.gov/2017/09/07/now-cgtv-champaign-police-department-employee-awards-ceremony/,Not Criminal Justice Related -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0647/,Complaints & Misconduct -http://www.longbeach.gov/police/about-the-lbpd/employment/long-beach-mounted-police/,Misc Police Activity -https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2016_archived_news/may_2016/arlington_honors_police_salutes_sacrifice,Media Bulletins -https://delcopa.gov/sustainability/pdf/raise/eastcostgreenwaytrailfeasibilitystudy_2009.pdf,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/murder-1600-block-of-pine-avenue/,Media Bulletins -https://spdblotter.seattle.gov/2010/08/09/john-diaz-confirmed-as-new-chief-of-police/,Media Bulletins -https://spdblotter.seattle.gov/2010/02/01/police-arrest-grab-n-go-bandit/,Media Bulletins -https://www.sandiego.gov/department-document/san-diego-police-arrest-two-suspects-multiple-car-burglaries,Media Bulletins -https://www.antioch.il.gov/2019/11/21/police-fire-commission-special-meeting/,Misc Police Activity -http://www.longbeach.gov/police/press-releases/police-seek-publics-help/,Media Bulletins -https://www.mass.gov/regulations/273-cmr-400-scope-of-practice,Not Criminal Justice Related -https://champaignil.gov/tag/youth-police-academy/,Media Bulletins -https://delcopa.gov/planning/pubs/delco2035.html,Not Criminal Justice Related -https://www.sandiego.gov/department-document/resolution-no-115919-copy,Poor Data Source -https://southamptontownnypolice.gov/faq.aspx?qid=237,Not Criminal Justice Related -https://champaignil.gov/police/about-us/level-up-experienced-officer-interest-form/,Contact Info & Agency Meta -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/052421arrests.pdf,Arrest Records -https://www.londonohio.gov/copy-of-city-ordances,Poor Data Source -https://estespark.colorado.gov/departments/police/operations/patrol,Contact Info & Agency Meta -https://www.tukwilawa.gov/departments/police/police-department-services/online-reporting/,Resources -https://www.sandiego.gov/police/recruiting/contact,Contact Info & Agency Meta -https://delcopa.gov/publicrelations/releases/2021/sheriffsofficeaccreditation.html,Media Bulletins -https://www.roseville.ca.us/news/what_s_happening_in_roseville/police_thank_local_community,Media Bulletins -http://www.longbeach.gov/police/press-releases/l-b-p-d--dui-checkpoint-proves-effective/,Media Bulletins -https://www.sandiego.gov/department-document/police-officer-cleared-shooting-jury-finds-actions-were-reasonable,Officer Involved Shootings -https://www.roundrocktexas.gov/news/police-seek-assistance-locating-robbery-suspect-3/,Media Bulletins -https://www.plymouthmi.gov/government/departments/police/forms_and_documents/i_c_m_a_public_safety_reports,Annual & Monthly Reports -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0351/,Complaints & Misconduct -https://www.stpaul.gov/departments/police/connect-with-department/minnesota-crime-alert-network,Contact Info & Agency Meta -https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scope-12/,Poor Data Source -https://pittsburghpa.gov/files/police/orders/ch3/35-03-infectious-disease-kits.pdf,Poor Data Source -https://www.minneapolismn.gov/news/2022/september/new-police-chief-/,Poor Data Source -https://coloradosprings.gov/police-department/article/news/traffic-fatality-briargate-parkway-and-1,Media Bulletins -http://www.lafayettepolice.us/3537/report-an-issue,Resources -https://coloradosprings.gov/police-department/article/news/cspd-asks-communitys-help-fatal-crash,Media Bulletins -http://police.portlandmaine.gov/1170/maine-state-pier,Not Criminal Justice Related -https://alpha.austin.gov/en/police-oversight/2020-08-26-12/,Complaints & Misconduct -https://www.roundrocktexas.gov/news/round-rock-police-investigate-suspicious-death-subject-in-custody/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-3500-block-of-faust-ave/,Media Bulletins -https://www.antioch.il.gov/wpfb-file/national-coffee-with-a-cop-flyer-template-ppt-pdf/,Misc Police Activity -http://www.longbeach.gov/police/press-releases/murder-19-/,Media Bulletins -https://pittsburghpa.gov/files/police/orders/ch2/25-02-reinstatement-voluntary-break-in-service.pdf,Poor Data Source -http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-one-arrest---numerous-citations/,Media Bulletins -https://dccouncil.gov/donation-disclosures/copy-of-december-2018-donation-disclosures-3/,Not Criminal Justice Related -https://www.sandyspringsgapolice.gov/north-metro-s-w-a-t/,Contact Info & Agency Meta -https://www.ashevillenc.gov/news/three-promoted-in-asheville-police-dept/,Media Bulletins -https://www.east-windsor.nj.us//police/cpanel,Poor Data Source -https://www.dps.nm.gov/blog/2021/04/14/new-mexico-state-police-arrests-driver-for-vehicular-homicide-in-chaves-county/,Media Bulletins -https://cityofpowell.us/police-agency/traffic-surveys/traffic-survey-report-11-13-17-2/,Not Criminal Justice Related -https://ose.louisiana.gov/event/police-officer-20/,Poor Data Source -https://delcopa.gov/publicrelations/releases/2021/covid_vaccineupdate0217.html,Media Bulletins -http://www.longbeach.gov/police/press-releases/police-asking-for-publics-help-in-identifying-person-of-interest-in-sexual-battery/,Media Bulletins -http://www.longbeach.gov/police/press-releases/fireworks-seized/,Media Bulletins -https://alpha.austin.gov/es/police-oversight/formal-complaint-responsibility-to-the-community-2/,Poor Data Source -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0014/,Complaints & Misconduct -https://www.ci.san-ramon.ca.us/our_city/departments_and_divisions/police/victims_rights_information/survivor_of_sexual_assault,Resources -https://www.elrenook.gov/departments/police-department/services-resources/resource-numbers/,Contact Info & Agency Meta -https://www.attorneygeneral.utah.gov/wp-content/uploads/2015/03/img_7489-copy-2.jpg,Media Bulletins -https://www.mass.gov/doc/october-30-1996-out-of-state-domestic-violence-restraining-orders-with-a-copy-of-memorandum/download,Policies & Contracts -https://www.alamoheightstx.gov/public-safety/police/divisions/,Contact Info & Agency Meta -https://delcopa.gov/planning/pubs/portfolio-12_tacticalplacemaking.pdf,Not Criminal Justice Related -https://icjia.illinois.gov/researchhub/articles/law-enforcement-response-to-mental-health-crisis-incidents-a-survey-of-illinois-police-and-sheriff-s-departments/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-20-/,Media Bulletins -https://southamptontownnypolice.gov/1663/2022-adopted-budget-operating,List of Data Sources -https://delcopa.gov/purchasing/bidsprops/kyo878.pdf,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/murder-investigation/,Media Bulletins -https://www.fortworthtexas.gov/departments/hr/administration/prr/police-prr,Policies & Contracts -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/022622blotter.pdf,Poor Data Source -https://joinmpd.dc.gov/metropolitan-police/reserve-police-officer,Training & Hiring Info -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0932/,Poor Data Source -https://delcopa.gov/ojs/ojsforms/praecipetosettlediscontinue.pdf,Resources -http://www.longbeach.gov/police/about-the-lbpd/bureaus/investigations-bureau/officer-involved-shooting-investigation-process/,Policies & Contracts -https://delcopa.gov/council/2020minutes/10072020minutes.pdf,Not Criminal Justice Related -https://www.ci.rohnert-park.ca.us/city_hall/departments/public_works/drainage___stormwater/creeks__environmental_information/copeland_test,Not Criminal Justice Related -https://champaignil.gov/2022/08/27/champaign-police-investigating-overnight-shooting-incidents/,Media Bulletins -https://delcopa.gov/publicrelations/releases/2020/pdf/delawarecountynovemberflushotclinics_mercyfitz.pdf,Not Criminal Justice Related -https://www.jacksontn.gov/government/departments/police/daily_arrest_reports,Poor Data Source -https://alpha.austin.gov/police-oversight/2020-06-4-17/,Poor Data Source -https://louisvilleky.gov/police/forms/submit-crime-tip,Resources -https://bolivar.mo.us/shop-with-a-copr/img_3318/,Poor Data Source -https://www.farmingtonmn.gov/government/departments/police/staff_directory,Poor Data Source -https://delcopa.gov/vote/pdf/2021/delco-boe_legal-notice_public-meeting_9-20-2021.pdf,Not Criminal Justice Related -https://www.panynj.gov/police/en/about/leadership.html,Personnel Records -https://rexburg.us/police-investigating-road-rage-after-man-killed-in-box-elder-county-rollover-thursday/,Poor Data Source -https://cheswold.delaware.gov/cheswold-police-department-policy-and-procedure-manual/directive-10-2-43-naloxone-programs/,Policies & Contracts -https://policing.cityofpleasantonca.gov/police-department-faqs/,Resources -https://delcopa.gov/health/pdf/agendaminutes/bohagenda_jan_6_22.pdf,Not Criminal Justice Related -https://alpha.austin.gov/en/police-oversight/bwc-dmav-the-role-of-vendors-and-community-input-in-policy/,Poor Data Source -https://champaignil.gov/tag/champaign-police-arrest-kidnapping-suspect/,Media Bulletins -https://delcopa.gov/hcd/cdbg.html,Not Criminal Justice Related -https://delcopa.gov/ich/pdfs/covid_govwolf_medicaidchip.pdf,Poor Data Source -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0328/,Poor Data Source -http://www.longbeach.gov/police/press-releases/murder-31-/,Media Bulletins -https://www.knoxvilletn.gov/government/boards_commissions/police_advisory_review_committee_parc/p_a_r_c_20th_anniversary/history_of_p_a_r_c___p_d_f_,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/arrest-made-in-2007-murder-case/,Media Bulletins -https://www.southamptontownnypolice.gov/1056/xeriscaping,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/update---companion-dog-taken-in-vehicle-theft/,Media Bulletins -https://delcopa.gov/vote/pdf/2022/2022primary-electiondayguidedigitaleditionv-rev1.pdf,Not Criminal Justice Related -https://dccouncil.gov/judiciary-public-safety/copy-of-ag0_fy19_-attachment-iv/,Annual & Monthly Reports -http://www.longbeach.gov/police/press-releases/undetermined-deaths--possibly-related-to-carbon-monoxide-poisoning/,Media Bulletins -https://www.cityofladue-mo.gov/departments/police-department/annual-reports-158,Annual & Monthly Reports -"https://norfolkne.gov/government/departments/police-division/press-releases/march-4,-2021-press-release.html",Media Bulletins -http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested--charges-filed/,Media Bulletins -https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-and-courtesy-13/,Poor Data Source -http://www.longbeach.gov/police/press-releases/dui-checkpoint/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality---long-beach-blvd.--cambridge-st/,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/071421blotter.pdf,Dispatch Logs -http://www.longbeach.gov/police/press-releases/halloween-safety-tips-1-/,Media Bulletins -https://www.ashevillenc.gov/wp-content/uploads/2016/08/citizens-police-academy.jpg,Poor Data Source -https://www.lyndhurstohio.gov/police-crime-prevention-run-hide-fight.html,Poor Data Source -https://www.hayward-ca.gov/discover/news/feb19/applicants-sought-new-police-community-advisory-panel,Training & Hiring Info -https://southamptontownnypolice.gov/169/parent-resources,Resources -https://www.mass.gov/doc/essential-functions-of-a-police-officer/download,Poor Data Source -http://www.longbeach.gov/police/press-releases/l.b.p.d2.-promotes-new-leaders/,Media Bulletins -https://www.jacksonms.gov/meetings/bid-opening-jpd-november-30-2021/jpd-rfp-catering-services-for-the-city-of-jackson-police-training-academy/,Not Criminal Justice Related -https://www.stpaul.gov/departments/police/21st-century-policing-report/pillar-2-policy-and-oversight/report-0,List of Data Sources -https://delcopa.gov/publicrelations/releases/2020/pdf/citizencorptrainingaug27.pdf,Media Bulletins -http://www.longbeach.gov/police/press-releases/l.b.p.d.-seizes-large-quantity-of-fireworks/,Media Bulletins -https://www.coppelltx.gov/217/emergency-notification-system-notifycopp,Resources -https://www.sandiego.gov/police/news-center/cold-cases/frank-lee-foust,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-results/,Media Bulletins -http://www.lafayettepolice.us/2356/photos,Not Criminal Justice Related -https://wyomingohio.gov/departments/police-department-2/coyote-information/,Poor Data Source -http://www.longbeach.gov/police/press-releases/l-b-p-d--seeks-public-s-help-in-robbery-being-investigated-as-hate-crime/,Media Bulletins -https://alpha.austin.gov/es/police-oversight/formal-complaint-acts-bringing-discredit-upon-the-department/,Poor Data Source -https://www.roundrocktexas.gov/news/police-looking-witnesses-fatal-collision/,Media Bulletins -https://champaignil.gov/2015/03/02/champaign-police-investigate-downtown-shooting/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-6700-block-gardenia/,Media Bulletins -https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0876/,Poor Data Source -http://www.longbeach.gov/police/press-releases/residential-robbery-suspects-charged/,Media Bulletins -https://mukilteowa.gov/departments/police/gun-safety-class-scholarship-program/,Resources -https://police.birminghamal.gov/command-staff/captain-raymond-hollis-crutchfield/,Poor Data Source -https://www.arlingtontx.gov/city_hall/departments/police/community/crime_prevention,Poor Data Source -http://www.longbeach.gov/police/press-releases/automotive-business-compliance-checks-conducted/,Media Bulletins -https://alpha.austin.gov/es/police-oversight/2020-09-17-7/,Poor Data Source -https://www.ci.san-bernardino.ca.us/city_hall/police_department/online_services,Resources -https://www.foxcrossingwi.gov/departments/police-department/history/30712442_10155740250625958_5846323570807930880_n/,Poor Data Source -https://www.mass.gov/doc/riva-albert-v-boston-police-department-related-superior-court-decision-21210/download,Court Cases -https://police.crystalmn.gov/our_city/boards_and_commissions/parks___recreation_commission,Not Criminal Justice Related -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0871/,Poor Data Source -http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested-and-charged-2-/,Media Bulletins -http://lafayettepolice.us/faq.aspx?qid=131,Not Criminal Justice Related -https://www.mass.gov/doc/berrios-crystal-v-boston-police-department-3316/download,Court Cases -https://www.stmatthewsky.gov/public-works/application-for-employment-current-copy/,Training & Hiring Info -https://www.austintexas.gov/page/commend-austin-police-officer,Contact Info & Agency Meta -http://www.longbeach.gov/police/press-releases/students-returning-to-school-motorists-urged-to-drive-carefully/,Media Bulletins -https://coloradosprings.gov/police-department/page/commander-howard,Poor Data Source -https://www.minneapolismn.gov/resident-services/public-safety/police-public-safety/police-reports-and-data-requests/sex-offender-community-notification/,Resources -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0003/,Poor Data Source -http://www.longbeach.gov/police/press-releases/graduation-and-summer-break-safety-tips2/,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/060721arrests.pdf,Arrest Records -https://norfolkne.gov/assets/site/documentcentral/police/statistical-reports/2021-statistical/mayormonthly050121.pdf,Annual & Monthly Reports -https://delcopa.gov/planning/pdf/agendas/2021/agenda202107.pdf,Not Criminal Justice Related -https://www.lynchburgvapolice.gov/news-updates/update-suspect-sought-in-cornerstone-street-homicide/,Media Bulletins -https://www.coppelltx.gov/1045/connect-with-oncor,Not Criminal Justice Related -https://www.mass.gov/info-details/2022-audit-of-the-bridgewater-state-university-objectives-scope-and-methodology,Annual & Monthly Reports -https://police.birminghamal.gov/command-staff/captain-james-jackson/,Personnel Records -https://delcopa.gov/vote/military-overseas.html,Not Criminal Justice Related -https://spdblotter.seattle.gov/2014/12/30/police-arrest-christmas-day-bank-burglar/,Media Bulletins -https://alpha.austin.gov/es/police-oversight/2020-06-05-1/,Not Criminal Justice Related -https://delcopa.gov/courts/pdf/21noticetothebarpublic_boardofmanagers_juveniledetentioncenter.pdf,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/juvenile-held-in-connection-with-robbery-case/,Media Bulletins -http://www.longbeach.gov/police/press-releases/significant-crime-reduction-during-first-year-metro-blue-line-contract/,Media Bulletins -https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2017_news_releases/police_launch_community_camera_partnership_program,Media Bulletins -https://spdblotter.seattle.gov/2017/03/13/suspected-prowler-arrested-after-police-spot-him-peering-into-cars-at-downtown-garage/,Media Bulletins -http://www.norwoodma.gov/departments/police/report_a_tip.php,Resources -http://www.longbeach.gov/police/press-releases/murder-36-/,Media Bulletins -https://delcopa.gov/publicrelations/releases/2020/thankyoufirstresponders.html,Media Bulletins -https://delcopa.gov/courts/judges/kelly.html,Personnel Records -https://cityofsweetwater.fl.gov/event/sweetwater-police-pension-plan-board-of-trustees-meeting/,Policies & Contracts -https://coloradosprings.gov/police-department/article/news/update-homicide-investigation-3125-sinton,Media Bulletins -https://hilliardohio.gov/hpd-partners-with-neighboring-police-agencies-for-career-day/,Misc Police Activity -https://alpha.austin.gov/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/bwc-dmav-data-analysis-data-cleaning-operations/,Poor Data Source -https://ridgelandsc.gov/police-department/daily-crime-reports-march-2022,Crime Maps & Reports -http://www.longbeach.gov/police/press-releases/motorcycle-safety-operation-results/,Media Bulletins -https://spdblotter.seattle.gov/2022/06/30/police-arrest-woman-for-shooting-outside-capitol-hill-apartment/,Media Bulletins -https://www.mass.gov/info-details/audit-of-the-office-of-the-commissioner-of-probation-objectives-scope-and-methodology,Not Criminal Justice Related -https://www.mass.gov/doc/national-environmental-policy-act-review-scoping-summary-report-i-90-allston-multimodal-project/download,Not Criminal Justice Related -https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2020_news_releases/police_continue_manhunt,Media Bulletins -http://www.longbeach.gov/police/press-releases/felony-suspect-arrested/,Media Bulletins -https://southamptontownnypolice.gov/1543/policies-for-the-zba,Policies & Contracts -https://whitestown.in.gov/news/christmas-with-a-cop/,Media Bulletins -http://www.longbeach.gov/police/press-releases/identity-theft-suspect-charged-with-11-felony-counts/,Media Bulletins -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0718/,Poor Data Source -http://www.longbeach.gov/police/press-releases/murder-13-/,Media Bulletins -https://delcopa.gov/heroin/tipsforprevention.html,Poor Data Source -https://www.roseville.ca.us/government/departments/police_department/crime_log/crime_log_feb_18_-_march_3__2019,Poor Data Source -https://www.lehi-ut.gov/departments/police/,Contact Info & Agency Meta -https://spdblotter.seattle.gov/2020/07/25/police-make-dozens-of-arrests-after-explosion-damages-east-precinct-and-march-turns-to-riot/,Media Bulletins -https://www.almaarkansas.gov/downloads/alma-police-car/,Poor Data Source -http://www.ryepolice.us/logs/police-logs-for-4-3-19-4-9-19,Daily Activity Logs -https://www.coppelltx.gov/555/nancy-monroe,Not Criminal Justice Related -http://www.ryepolice.us/wp-content/uploads/wallis-sands-half-marathon-route.jpg,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/murder-orange-and-washington/,Media Bulletins -https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2014_archived_news/october_2014/uta_spotlight_arlington_police_students_celebrate,Media Bulletins -https://police.greenvillesc.gov/faq.aspx?qid=222,Complaints & Misconduct -https://beaumonttexas.gov/police-investigating-aggravated-assault-4600-block-detroit/,Poor Data Source -https://rexburg.us/police-identify-man-killed-in-motorcycle-crash-in-logan-canyon/,Poor Data Source -https://champaignil.gov/tag/copper-road/,List of Data Sources -https://www.police.wallingfordct.gov/about-us/history/,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/traffic-fatality---willow-st.-and-golden-ave/,Media Bulletins -https://www.townofnewhartfordny.gov/police-commission-minutes,Poor Data Source -https://barnegatpolice.us/six-arrested-drug-charges/,Media Bulletins -https://chandlerazpd.gov/2014/09/chandler-police-looking-for-g-a-i-n-participants-4/,Media Bulletins -https://wrightstown.us/police-community-information/driving-in-school-zones/,Resources -https://delcopa.gov/planning/pubs/index.html,Poor Data Source -http://www.cityofpataskalaohio.gov/cop_folder/2015-legislation-under-public-notices/advertisement-of-legislation-passed-december-1-2014-2/,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/weapon-crusher/,Media Bulletins -https://alpha.austin.gov/en/police-oversight/policy-review-and-recommendations-8-cant-wait/,Poor Data Source -https://dps.iowa.gov/marshalltown-police-department-makes-arrest-part-death-investigation,Media Bulletins -https://www.mass.gov/news/reminders-being-issued-by-massdot-eopss-massachusetts-state-police-and-transportation-partners,Media Bulletins -https://southamptontownnypolice.gov/1034/2017-adopted-budget---capital,Annual & Monthly Reports -https://www.foxcrossingwi.gov/departments/police-department/history/,Misc Police Activity -https://rocklandmaine.gov/events/police-review-committee/,Poor Data Source -http://www.longbeach.gov/police/press-releases/murder-1300-block-11th/,Media Bulletins -https://coloradosprings.gov/police-department/page/metro-crime-lab,Misc Police Activity -http://www.longbeach.gov/police/press-releases/dui-saturation-patrols-planned-this-weekend/,Media Bulletins -https://delcopa.gov/publicrelations/releases/2020/covidtesting_lansdowneaug.html,Not Criminal Justice Related -https://balharbourfl.gov/departments/police/request-crash-report/,Accident Reports -https://spdblotter.seattle.gov/2015/04/30/barefoot-felon-ditches-stolen-car-gun-at-mcdonalds-leads-police-on-chase/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-drivers-license-checkpoint-planned-this-weekend-2147438636/,Media Bulletins -http://www.longbeach.gov/police/press-releases/assault-investigation-leads-to-firearm-discharge/,Media Bulletins -https://alpha.austin.gov/police-oversight/2020-06-12-5/,Poor Data Source -https://www.memphistn.gov/news/wpfd_file/police-services-18/,Poor Data Source -http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested-2-/,Media Bulletins -https://delcopa.gov/sustainability/pdf/raise/ihpinterprativesignageguidelinesvoliidesignhandbook_2013.pdf,Poor Data Source -https://directory.arkansas.gov/agency/secretary-of-state/state-capitol-police/employees/john-watt/,List of Data Sources -https://delcopa.gov/planning/pdf/programsandinitiatives/implementingenforcingfloodplainordinance.pdf,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/traffic-fatality4/,Media Bulletins -https://www.southamptontownnypolice.gov/agendacenter,Not Criminal Justice Related -http://police.portlandmaine.gov/499/cemeteries,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-three-arrests2/,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/052721summary.pdf,Dispatch Logs -https://bolivar.mo.us/shop-with-a-copr/p1018068/,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/murder-investigation---atlantic-ave.-and-south-st/,Media Bulletins -https://www.antioch.il.gov/wpfb_file_category/commissions-police-pension-fund-agendas-2011-commissions-police-pension-fund-agendas-commissions-police-pension-fund-commissions-commissions-police-pension-fund/,List of Data Sources -https://delcopa.gov/planning/mapping/custommaprequests.html,Poor Data Source -http://www.longbeach.gov/police/press-releases/second-warrant-clearing-event/,Media Bulletins -https://delcopa.gov/publicrelations/releases/2020/earthday.html,Not Criminal Justice Related -https://www.antiochca.gov/police/oes/,Resources -https://www.naperville.il.us/services/naperville-police-department/programs-and-services/internship-program/,Training & Hiring Info -https://www.antioch.il.gov/wpfb-file/11-02-16-police-pension-agenda-pdf-3/,Poor Data Source -https://police.crystalmn.gov/how_do_i_/report_an_issue/street_light_outage,Not Criminal Justice Related -https://www.gurnee.il.us/government/departments/police-department/community-involvement/gurnee-citizen-police-academy/gurnee-citizen-police-academy/week-12,Training & Hiring Info -https://biloxi.ms.us/police-fire-showcase-is-saturday-at-point-cadet/,Not Criminal Justice Related -https://www.southamptontownnypolice.gov/faq.aspx?qid=413,Resources -http://www.longbeach.gov/police/press-releases/traffic-fatality-3-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/---located----critical-missing-person/,Media Bulletins -http://www.longbeach.gov/police/press-releases/fatality-1-/,Media Bulletins -https://www.mass.gov/event/police-standards-subcommittee-open-meeting-2022-07-12t090000-0400-2022-07-12t100000-0400,Media Bulletins -https://www.hayward-ca.gov/discover/news/jul22/police-blotter-july-10-16-2022,Media Bulletins -https://dps.iowa.gov/former-pleasantville-police-officer-charged-sexual-abuse-minor,Media Bulletins -http://www.longbeach.gov/police/press-releases/arrests-made-in-illegal-firework-investigation/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality--cherry-ave---cherry-circle/,Media Bulletins -https://www.hayward-ca.gov/discover/news/jul21/police-blotter-june-27-july-3-2021,Media Bulletins -http://lafayettepolice.us/3404/census-2020,Not Criminal Justice Related -"https://norfolkne.gov/government/departments/police-division/press-releases/july-11,-2021-press-release.html",Media Bulletins -https://www.mass.gov/doc/draft-scope-of-work-2016-cd-debris-industry-study/download,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/shooting-200-block-of-artesia/,Media Bulletins -https://coloradosprings.gov/police-department/article/news/traffic-fatality-woodman-road-and-campus,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/080321summary.pdf,Daily Activity Logs -http://www.longbeach.gov/police/press-releases/dui---driver-s-license-checkpoint-planned-this-weekend/,Media Bulletins -https://alpha.austin.gov/police-oversight/formal-complaint-responsibility-to-know-and-compl-2/,Poor Data Source -https://www.gurnee.il.us/government/departments/police-department/community-involvement/gurnee-citizen-police-academy/gurnee-citizen-police-academy/week-4,Media Bulletins -https://www.roundrocktexas.gov/wp-content/uploads/2019/12/coffee_cop.png,Poor Data Source -http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested-and-charged-1-/,Media Bulletins -https://wyomingohio.gov/departments/police-department-2/commend-an-officer/,Poor Data Source -https://coloradosprings.gov/police-department/article/news/shooting-investigation-1800-block-monterey,Media Bulletins -https://police.birminghamal.gov/bureaus/support-operations/records/,Resources -https://norfolkne.gov/government/departments/police-division/press-releases/october-3rd-press-release-2022.html,Media Bulletins -https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-53/,Poor Data Source -http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-5-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/robberymurder-investigation---1900-block-of-pacific-ave/,Media Bulletins -https://delcopa.gov/courts/familycourtadvisory.html,Resources -https://delcopa.gov/publicrelations/releases/18pdfs/18efilingprogramoct11.pdf,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/traffic-fatality-7th-and-olive/,Media Bulletins -https://www.antioch.il.gov/wpfb-file/11-07-16-police-and-fire-agenda-pdf-5/,Poor Data Source -https://sanramon.ca.gov/policenews,List of Data Sources -https://spdblotter.seattle.gov/2015/06/19/police-sting-blackmailer-after-she-tries-to-extort-woman-over-lurid-cellphone-pics/,Media Bulletins -https://www.dps.arkansas.gov/law-enforcement/arkansas-state-police/divisions/highway-patrol/troop-j-commander/,Personnel Records -http://www.longbeach.gov/police/press-releases/click-it-or-ticket-campaign-starts-may-22/,Media Bulletins -http://lafayettepolice.us/735/youth-fire-setter-program,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/murder-and-weapons-charges-filed-in-january-homicide/,Media Bulletins -https://estespark.colorado.gov/departments/police/support-services/auxiliary-unit,Training & Hiring Info -http://www.longbeach.gov/police/press-releases/traffic-fatality--lb-blvd----market-street-/,Media Bulletins -http://www.paloshillspolice.us/wp-content/uploads/2017/02/bozen_17.jpg,Poor Data Source -http://www.longbeach.gov/police/press-releases/officerinvolvedshooting/,Media Bulletins -https://champaignil.gov/tag/champaign-police-department-releases-holiday-traffic-enforcement-numbers/,Media Bulletins -http://police.portlandmaine.gov/805/orders-as-passed-fiscal-year-2017-to-201,List of Data Sources -https://www.southamptontownnypolice.gov/faq.aspx?qid=452,Not Criminal Justice Related -https://www.milpitas.gov/milpitas/departments/police/investigations/,Poor Data Source -https://police.birminghamal.gov/aboutfuture/,Contact Info & Agency Meta -https://coloradosprings.gov/police-department/page/police-blotter,Media Bulletins -https://www.pinevillenc.gov/organizer/pineville-police-2/,Poor Data Source -http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-7-/,Media Bulletins -http://police.byram-ms.us/bradford-place-auto-burglary/,Media Bulletins -https://delcopa.gov/publicrelations/releases/2022/pacareerlinkdelcohostsfreecareerworkshopthroughjune.html,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/reward-issued-in-2014-case/,Media Bulletins -https://www.hayward-ca.gov/discover/news/may21/police-blotter-may-2-8-2021,Media Bulletins -https://www.knoxvilletn.gov/government/city_departments_offices/police_department/investigations_bureau/special_crimes_unit/domestic_violence_help,Resources -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/042021blotter.pdf,Media Bulletins -https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2021_news_releases/police_announce_promotions,Media Bulletins -https://www.lynchburgvapolice.gov/wp-content/uploads/2021/06/lpd-seal-e1662580813573.png,Poor Data Source -https://www.knoxvilletn.gov/government/city_departments_offices/civil_service_department/how_to_apply_for_police,Training & Hiring Info -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/020921blotter.pdf,Media Bulletins -https://delcopa.gov/planning/developmentreview.html,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/murder-investigation---1400-blk-pacific-ave/,Media Bulletins -https://www.ashevillenc.gov/news/asheville-police-urge-motorcycle-caution-on-town-mountain-road/,Media Bulletins -https://delcopa.gov/controller/pdf/unclaimed/unclaimedfundslist.pdf,Resources -https://www.southamptontownnypolice.gov/faq.aspx?qid=288,Resources -http://www.longbeach.gov/police/press-releases/national-pharmaceutical-take-back-event/,Media Bulletins -http://www.longbeach.gov/police/press-releases/police-seek-public-s-help-with-july-2014-murder-case--sketches-of-persons-of-interest-released/,Media Bulletins -https://pittsburghpa.gov/police/police-contacts,Poor Data Source -http://www.longbeach.gov/police/about-the-lbpd/employment/join-lbpd/step-8/,Training & Hiring Info -http://www.longbeach.gov/police/press-releases/murder-1300-block-of-wesley-drive/,Media Bulletins -https://controller.phila.gov/office-of-the-city-controller-announces-community-council-members-to-support-review-of-the-philadelphia-police-department/,Media Bulletins -https://alpha.austin.gov/police-oversight/formal-complaint-arrest-requirement-for-assaultive-offenses-and-responsibility-to-know-and-comply/,Poor Data Source -http://www.longbeach.gov/police/press-releases/police-seek-additional-indecent-exposure-victims/,Media Bulletins -https://www.prospertx.gov/residents/police/police-department/about-the-department/,Poor Data Source -https://www.antioch.il.gov/wpfb-file/04-10-12-police-pension-agenda-pdf-5/,Poor Data Source -https://cheswold.delaware.gov/cheswold-police-department-yearly-traffic-statistics/march-2021-traffic-stop-report/,Annual & Monthly Reports -https://police.greenvillesc.gov/1719/internships,Resources -http://www.longbeach.gov/police/press-releases/murder-investigation4/,Media Bulletins -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0714/,Poor Data Source -https://coloradosprings.gov/police-department/article/news/update-officer-involved-shooting-hwy-115,Officer Involved Shootings -http://www.longbeach.gov/police/press-releases/pedestrian-safety-operation-a-success/,Media Bulletins -http://www.longbeach.gov/police/press-releases/l.b.p.d.-promotes-assistant-chief/,Media Bulletins -https://delcopa.gov/departments/parks/pdf/dogparkapplication.pdf,Resources -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/010122blotter.pdf,Daily Activity Logs -http://www.ryepolice.us/pressrelease/press-release-burglary-suspect,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/092722summary.pdf,Poor Data Source -https://www.coppelltx.gov/644/pay-bills-fines,Resources -https://police.greenvillesc.gov/1865/credit-union,Not Criminal Justice Related -http://www.lafayettepolice.us/826/fire-blocking,Not Criminal Justice Related -https://dccouncil.gov/donation-disclosures/copy-of-april-2019-donation-disclosures-2/,Policies & Contracts -https://alpha.austin.gov/es/police-oversight/2020-06-4-15/,Poor Data Source -https://www.lynchburgvapolice.gov/wp-content/uploads/2022/01/veh-3.jpg,Poor Data Source -https://www.cityofladue-mo.gov/departments/police-department/community/maps-167,Not Criminal Justice Related -https://www.antioch.il.gov/wpfb-file/12-09-14-police-pension-agenda-pdf/,Poor Data Source -https://www.coppelltx.gov/592/hotel-occupancy-tax,Not Criminal Justice Related -https://www.montgomeryohio.gov/meet-steve-coppel-a-diversity-inclusion-committee-member/steve-coppel/,Not Criminal Justice Related -https://ci.guadalupe.ca.us/documents/police-officer/,Training & Hiring Info -http://www.longbeach.gov/police/press-releases/undetermined-death-investigation3/,Media Bulletins -https://barnegatpolice.us/download/field-check/,Field Contacts -https://www.cityofpinebluff-ar.gov/copycred,Not Criminal Justice Related -https://delcopa.gov/publicrelations/releases/2021/whatvoterscanexpect.html,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/five-cited-during-undercover-vice-operation/,Media Bulletins -https://www.foxcrossingwi.gov/departments/police-department/resources/83-07_use-of-force/,Poor Data Source -http://www.longbeach.gov/police/press-releases/two-arrested--drugs--cash-and-guns-seized-in-connection-with-drug-trafficking/,Media Bulletins -http://www.ryepolice.us/announcements/holiday-parade,Not Criminal Justice Related -https://www.coronadelmar.us/gambler-left-puppy-in-hot-car-with-mouth-taped-shut-at-vegas-casino-police-say/,Media Bulletins -https://delcopa.gov/vote/pdf/latecontributions_24hourreport.pdf,Not Criminal Justice Related -https://police.greenvillesc.gov/232/jury-duty,Not Criminal Justice Related -https://brookfieldil.gov/publication/fire-and-police-commission-special-meeting-december-17-2015/,Poor Data Source -https://www.mass.gov/doc/2016-deputy-police-chief-employmentexperience-form-for-attleboro-examination-0/download,Training & Hiring Info -https://www.warracres-ok.gov/police-department-history/warr-acres-old4/,Poor Data Source -https://www.sandiego.gov/police/recruiting/contact/dispatch,Training & Hiring Info -https://www.eutawal.gov/news/national-police-week-2022/,Poor Data Source -https://www.coppelltx.gov/929/earthfest,Not Criminal Justice Related -https://police.greenvillesc.gov/427/minoritywoman-owned-business-enterprise-,Not Criminal Justice Related -https://police.bixbyok.gov/256/find-laws-pertaining-to-the-city-of-bixb,Not Criminal Justice Related -https://coloradosprings.gov/police-department/webform/chiefs-youth-advisory-council-application,Resources -https://coloradosprings.gov/police-department/article/news/traffic-fatality-marksheffel-road-and-0,Media Bulletins -https://springfield-or.gov/event/springfield-police-advisory-committee-spac-13/,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/fumigation-burglaries/,Media Bulletins -https://delcopa.gov/planning/pubs/openspaceplanvoliii.html,Not Criminal Justice Related -http://www.longbeach.gov/press-releases/city-manager-announces-potential-recruitment-process-for-police-chief/,Media Bulletins -http://www.longbeach.gov/police/press-releases/warrant--expungement-servicing-event/,Media Bulletins -http://www.longbeach.gov/police/press-releases/police-seeking-the-public-s-help-with-identifying-armed-robbery-suspect-from-video/,Media Bulletins -http://www.longbeach.gov/police/press-releases/click-it-or-ticket-campaign-starts-may-21st/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-checkpoint-proves-effective-2-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-200-block-of-liberty-court/,Media Bulletins -http://www.longbeach.gov/police/press-releases/super-bowl-driving-impaired-enforcement/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-14-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-tomorrow/,Media Bulletins -http://www.longbeach.gov/police/press-releases/click-it-or-ticket-campaign-begins-may-18th/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder---3100-block-e-artesia-blvd/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality--ocean-blvd----710-transition-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality---obispo-ave-and-broadway/,Media Bulletins -http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-this-weekend7/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-enforcement-operations-planned-this-weekend-6-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/checkpoint/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-nets-four-arrests/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-proves-effective-6-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality3/,Media Bulletins -http://www.longbeach.gov/police/press-releases/charges-filed-against-three-suspects-for-brutal-crime/,Media Bulletins -http://www.longbeach.gov/police/press-releases/distracting-driving-will-be-enforced/,Media Bulletins -http://www.longbeach.gov/police/press-releases/robbery-suspects-arrestd-and-charged/,Media Bulletins -http://www.longbeach.gov/police/press-releases/arrest-made-and-charges-filed-in-human-trafficking-of-a-minor-case/,Media Bulletins -http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-this-weekend4/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-2-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-marina-dr---studebaker/,Media Bulletins -http://www.longbeach.gov/police/press-releases/bird-theft-suspect-arrested--two-others-remain-outstanding/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-1100-block-locust/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-nets-five-arrests/,Media Bulletins -http://www.longbeach.gov/police/press-releases/frequently-requested-lbpd-policies-available-on-website/,Media Bulletins -http://www.longbeach.gov/police/press-releases/graduation-and-summer-break-safety-tips-1-/,Media Bulletins -http://www.longbeach.gov/press-releases/long-beach-police-lieutenant-reunites-with-resident-he-helped/,Media Bulletins -http://www.longbeach.gov/police/press-releases/three-suspects-arrested-for-2013-murder/,Media Bulletins -https://www.coppelltx.gov/524/state-of-the-city,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/motorcycle-safety-operation/,Media Bulletins -https://southamptontownnypolice.gov/faq.aspx?qid=299,Contact Info & Agency Meta -https://coloradosprings.gov/police-department/article/news/suspect-multiple-armed-robberies-arrested,Media Bulletins -https://alpha.austin.gov/en/police-oversight/formal-complaints-opo-processed-on-june-5-purpose-and-scopecommunity-policing-and-other-policy-violations/,Poor Data Source -http://www.longbeach.gov/police/press-releases/murder-investigation---1200-block-of-chestnut/,Media Bulletins -https://www.desmoineswa.gov/departments/police/online_crime_reporting/spanish_online_police_reporting,Poor Data Source -https://www.trinidad.co.gov/police-department,Poor Data Source -https://www.newcarrolltonmd.gov/government/departments/police_department/ncpd_news,List of Data Sources -http://lafayettepolice.us/616/commercial-kitchen-operations,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/2014-robbery-victim-dies--reward-renewed/,Media Bulletins -http://www.longbeach.gov/police/press-releases/motorcycle-safety-is-aim-of-l-b-p-d--operation/,Media Bulletins -http://www.longbeach.gov/police/press-releases/human-sex-trafficking-task-force-operation/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-10-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/charges-filed-against-former-police-officer/,Media Bulletins -http://www.longbeach.gov/police/press-releases/critical-missing---beltran-carmelo/,Media Bulletins -http://www.longbeach.gov/police/press-releases/update--excavation-to-be-conducted-in-missing-person-cold-case-investigation/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-1900-block-chestnut-ave/,Media Bulletins -http://www.longbeach.gov/police/press-releases/tailgates-being-targeted--community-encouraged-to-take-precautions/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-14-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/donut-boy-visits-l.b.p2.d/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-proves-effective-10-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality---pacific-avenue-and-burnett-street/,Media Bulletins -http://www.longbeach.gov/police/press-releases/long-beach-police-dui-checkpoint-proves-effective-2-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/human-trafficking-suspect-arrested/,Media Bulletins -http://www.longbeach.gov/police/press-releases/halloween-safety-tips-2-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/police-seek-additional-indecent-exposure-victims-1-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/publics-help-needed-to-identify-hit-and-run-suspects/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-15-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-one-arrest2/,Media Bulletins -http://www.longbeach.gov/police/press-releases/arrest-made---charges-filed-in-2013-shooting-case/,Media Bulletins -http://www.longbeach.gov/police/press-releases/winter-break-safety-tips-for-youth/,Media Bulletins -http://www.longbeach.gov/police/press-releases/police---fire-memorial-ceremony/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-charges-filed/,Media Bulletins -http://www.longbeach.gov/police/press-releases/robbery-suspects-arrested-and-charged/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder2/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality---cherry-and-carson/,Media Bulletins -http://www.longbeach.gov/police/press-releases/l-b-p-d--offers-holiday-safety-tips/,Media Bulletins -https://www.elburn.il.us/police-department/vacation-watch/,Poor Data Source -https://www.foxcrossingwi.gov/departments/police-department/resources/vine/,Poor Data Source -https://spdblotter.seattle.gov/2021/10/03/driver-of-stolen-vehicle-arrested-after-ramming-police-cars-gas-station/,Media Bulletins -https://spdblotter.seattle.gov/2011/06/14/anti-police-graffiti-incident/,Media Bulletins -http://www.longbeach.gov/police/press-releases/arrests-made-in-the-kidnapping-murder-of-3-week-old-eliza-delacruz/,Media Bulletins -http://www.longbeach.gov/police/press-releases/don-t-be-a-victim-of-fraud-this-holiday-season/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality---pacific-avenue-and-burnett-street/,Media Bulletins -http://www.longbeach.gov/police/press-releases/students-return-to-school-motorists-urged-to-drive-carefully/,Media Bulletins -http://www.longbeach.gov/press-releases/city-of-long-beach-initiates-outside-review-of-police-department-direct-messaging-application/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-investigation/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-investigation---2300-block-of-elm-avenue/,Media Bulletins -http://www.longbeach.gov/police/press-releases/critical-missing-person/,Media Bulletins -http://www.longbeach.gov/police/press-releases/homicide-investigation/,Media Bulletins -http://www.longbeach.gov/police/press-releases/long-beach-police-investigate-attempt-murder-of-chp-officer-following-pursuit/,Media Bulletins -http://www.longbeach.gov/police/press-releases/annual-police-and-fire-memorial-ceremony-will-include-addition-of-officer-william-h--waggoner/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality---lakewood-blvd-and-sb-405-fwy/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-600-block-burnett/,Media Bulletins -http://www.longbeach.gov/police/press-releases/l.b.p.d.-announces-appointment-of-new-commanders--changes-in-command-staff-assignments/,Media Bulletins -http://www.longbeach.gov/police/press-releases/five-cited-during-undercover-vice-operation/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality---woodruff-avenue--conant-street/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-25-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/long-beach-police-announce-appointment-of-new-commander-and-assignment-of-next-west-division-commander/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-investigation----1000-block-of-east-11th-street/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality---woodruff-avenue--conant-street/,Media Bulletins -http://www.longbeach.gov/press-releases/jason-campbell-appointed-police-administration-bureau-chief/,Media Bulletins -http://www.longbeach.gov/police/press-releases/officer-involved-shooting---2500-lb-blvd/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality---willow-st.-and-golden-ave/,Media Bulletins -http://www.longbeach.gov/police/press-releases/critical-missing-person--douglas-grant/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-investigation-market-st--orange-ave/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-36-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/improving-motorcycle-safety-aim-of-l-b-p-d--operation/,Media Bulletins -http://www.longbeach.gov/police/press-releases/improving-motorcycle-safety-aim-of-operation/,Media Bulletins -http://www.longbeach.gov/police/press-releases/lbpd-academy-graduation-ceremony/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-1900-block-pch/,Media Bulletins -http://www.longbeach.gov/press-releases/long-beach-police-department-south-division-to-host-open-house/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-investigation2/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-artesia-and-myrtle/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality---cherry-and-carson/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-8-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-44-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/charges-filed-in-murder-investigation/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-investigation---600-block-of-cedar-ave/,Media Bulletins -http://www.longbeach.gov/police/press-releases/parents-arrested-for-murder-in-2013-suspicious-death-of-1-month-old-infant/,Media Bulletins -http://www.longbeach.gov/police/press-releases/operation-results-in-multiple-arrests--confiscation-of-numerous-firearms/,Media Bulletins -http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-this-weekend3/,Media Bulletins -http://www.longbeach.gov/police/press-releases/assault-investigation-leads-to-firearm-discharge/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-shoreline-dr-and-710-fwy/,Media Bulletins -http://www.longbeach.gov/police/press-releases/in-custody-death/,Media Bulletins -http://www.longbeach.gov/police/press-releases/publics-help-sought-in-indecent-exposure/,Media Bulletins -https://delcopa.gov/treasurer/pdf/2021reassessmentvalues/36.pdf,Not Criminal Justice Related -https://www.mass.gov/doc/2017-police-officer-and-state-trooper-exam-poster/download,Training & Hiring Info -https://coloradosprings.gov/mayors-office/article/news/mayor-and-police-statements-about-bailey-civil,Media Bulletins -http://www.lafayettepolice.us/493/sports-programs,Not Criminal Justice Related -https://www.newarknj.gov/resources/instructions-for-crane-or-helicopter-lift,Not Criminal Justice Related -https://www.sandiego.gov/police/news-center/cold-cases/maria-cortes,Crime Maps & Reports -https://delcopa.gov/publicrelations/releases/2018/18redribbonweek.html,Not Criminal Justice Related -https://www.coppelltx.gov/953/lifelong-learning,Not Criminal Justice Related -https://wildwoodpolice-fl.gov/wpd-history/,Poor Data Source -https://cityofsweetwater.fl.gov/event/sweetwater-police-pension-plan-board-of-trustees-meeting-3/,Not Criminal Justice Related -https://www.mass.gov/doc/cancer-cervical-chicopee/download,Not Criminal Justice Related -https://dccouncil.gov/donation-disclosures/copy-of-august-2018-donation-disclosures-5/,Not Criminal Justice Related -https://ose.louisiana.gov/event/police-lieutenant/,Poor Data Source -https://delcopa.gov/departments/pdfs/2020adoptedbudget.pdf,Annual & Monthly Reports -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/082321arrests.pdf,Arrest Records -https://www.mass.gov/letter-ruling/letter-ruling-81-13-printing-and-photocopying-equipment,Not Criminal Justice Related -https://www.mass.gov/doc/case-study-city-of-chicopee/download,Not Criminal Justice Related -http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-arrests/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-100-block-48th/,Media Bulletins -http://www.longbeach.gov/police/press-releases/undetermined-death-investigation-1-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-clark-and-eagle/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-5400-block-atlantic/,Media Bulletins -http://www.longbeach.gov/police/press-releases/l.b.p.d.-announces-appointment-of-new-commanders--changes-in-command-staff-assignments/,Media Bulletins -http://www.longbeach.gov/police/press-releases/undetermined-deaths-do-not-appear-related/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-investigation---800-block-of-alamitos-avenue/,Media Bulletins -http://www.longbeach.gov/globalassets/police/media-library/images/press-releases/2016/thumb_halloween---kids-in-costume.png,Poor Data Source -http://www.longbeach.gov/police/press-releases/missing-person---kylexia-newman/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-checkpoint-proves-effective-1-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-22-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/felony-robbery-suspect-arrested/,Media Bulletins -http://www.longbeach.gov/police/press-releases/two-arrested---charged-in-two-shootings/,Media Bulletins -http://www.longbeach.gov/police/press-releases/---located---missing-3-week-old-infant-found-deceased-in-san-diego-county/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-1300-block-wesley-dr/,Media Bulletins -http://www.longbeach.gov/police/press-releases/fatality-7-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/publics-help-sought-in-locating-hit--run-suspect/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-spring-street-west-of-el-dorado-park/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-proves-effective-1-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/robbery-suspects-arrested-1-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-1300-block-of-pine/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-28-/,Media Bulletins -http://www.longbeach.gov/attorney/press-releases/court-dismisses-lawsuits-by-two-long-beach-police-officers-against-the-city-of-long-beach/,Media Bulletins -http://www.longbeach.gov/police/press-releases/fatality-3-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/police-impersonator/,Media Bulletins -http://www.longbeach.gov/police/press-releases/publics-help-needed-to-identify-robbery-suspects/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality---ocean-blvd-and-ca-47/,Media Bulletins -http://www.longbeach.gov/police/press-releases/arrest-made-in-sexual-assault-case-1-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/body-found-1000-block-of-w--carson-street/,Media Bulletins -http://www.longbeach.gov/police/press-releases/three-arrested-and-charged-with-murder/,Media Bulletins -http://www.longbeach.gov/police/press-releases/l.b.p.d-announces-appointment-of-new-commander/,Media Bulletins -http://www.longbeach.gov/police/press-releases/police-seek-public-s-help-to-identify-burglary-suspect/,Media Bulletins -http://www.longbeach.gov/police/press-releases/results-of-saturday-s-l-b-p-d--s-driving-under-the-influence-saturation-patrol/,Media Bulletins -http://www.longbeach.gov/attorney/press-releases/court-dismisses-lawsuits-by-two-long-beach-police-officers-against-the-city-of-long-beach/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-2200-block-of-golden-ave/,Media Bulletins -http://www.longbeach.gov/police/press-releases/found---critical-missing-person----1-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality--4th---obispo-/,Media Bulletins -http://www.longbeach.gov/press-releases/long-beach-police-department-awarded-blue-line-security-contract/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-22-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/store-clerk-struck-by-gunfire-during-robbery--public-s-help-sought-to-identify-suspect/,Media Bulletins -http://www.longbeach.gov/police/press-releases/officer-involved-shooting-4-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-enforcement-operation-planned-this-weekend/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-checkpoint-planned-this-weekend-1-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-this-weekend6/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-enforcement-operation-planned-for-long-beach-pride/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-checkpoint-2-/,Media Bulletins -http://www.longbeach.gov/press-releases/outside-review-of-police-department-direct-messaging-application-complete/,Media Bulletins -http://www.longbeach.gov/police/press-releases/two-suspects-arrested-for-string-of-commercial-burglaries/,Media Bulletins -http://www.longbeach.gov/press-releases/long-beach-police-lieutenant-reunites-with-resident-he-helped/,Media Bulletins -http://www.longbeach.gov/police/press-releases/search-warrant-operation/,Media Bulletins -http://www.longbeach.gov/press-releases/long-beach-city-council-restores-paramedic-rescue-12--reinstates-police-academy-operations-with-measure-a-funding/,Media Bulletins -http://www.longbeach.gov/police/press-releases/st-patricks-day-saturation-patrol/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-1300-block-11th/,Media Bulletins -https://www.southamptontownnypolice.gov/1767/liberty-gardens,List of Data Sources -http://www.longbeach.gov/police/press-releases/academy-graduation---class-90/,Media Bulletins -http://www.longbeach.gov/police/press-releases/operation-results-in-multiple-arrests--confiscation-of-numerous-firearms/,Media Bulletins -http://www.longbeach.gov/press-releases/richard-rocchi-appointed-deputy-police-chief/,Media Bulletins -http://www.longbeach.gov/police/press-releases/fatality-2-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/lbpd-promotes-new-leaders/,Media Bulletins -http://www.longbeach.gov/police/press-releases/publics-help-sought-in-locating-hit--run-suspect/,Media Bulletins -http://www.longbeach.gov/police/press-releases/police-seek-public-s-help-to-identify-vehicle-theft-suspects/,Media Bulletins -http://www.longbeach.gov/police/press-releases/felony-suspects-arrested-and-charged/,Media Bulletins -http://www.longbeach.gov/police/press-releases/police-seek-help/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality-6-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/arrest-made-in-sexual-assault-case/,Media Bulletins -http://www.longbeach.gov/police/press-releases/suspect-arrested-and-charged-for-1996-murder/,Media Bulletins -http://www.longbeach.gov/police/press-releases/traffic-fatality---harvy-way-and-bellflower-blvd/,Media Bulletins -http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-this-weekend7/,Media Bulletins -http://www.longbeach.gov/police/press-releases/arrest-made-and-charges-filed-in-july-4th-murder/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-nets-five-arrests/,Media Bulletins -http://www.longbeach.gov/police/press-releases/officer-involved-shooting--no-injuries-sustained/,Media Bulletins -http://www.longbeach.gov/police/press-releases/long-beach-police-inspect-37-businesses-for-alcohol-sales-compliance/,Media Bulletins -https://coloradosprings.gov/police-department/page/report-traffic-complaint,Calls for Service -http://www.longbeach.gov/press-releases/robert-g-luna-to-be-sworn-in-as-chief-of-police-for-city-of-long-beach-on-saturday-november-22/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder---6300-block-of-knight-avenue/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-results/,Media Bulletins -http://www.longbeach.gov/police/press-releases/the-north-patrol-division-directed-enforcement-team-cracks-down-on-criminal-street-gang/,Media Bulletins -http://www.longbeach.gov/police/press-releases/police-asking-for-public-s-help-in-identifying-person-of-interest-in-sexual-battery/,Media Bulletins -http://www.longbeach.gov/police/press-releases/students-return-to-school--motorists-urged-to-drive-carefully/,Media Bulletins -http://www.longbeach.gov/police/press-releases/drug-lab-discovered-at-residence--two-suspects-in-custody/,Media Bulletins -http://www.longbeach.gov/police/press-releases/officer-involved-shooting-1700-block-of-marine-avenu-wilmington/,Media Bulletins -http://www.longbeach.gov/police/press-releases/murder-investigation---4th-street-and-pacific-avenue/,Media Bulletins -http://www.longbeach.gov/police/press-releases/trafficfatality-2-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-7-/,Media Bulletins -http://www.longbeach.gov/police/press-releases/search-and-rescue-orientation-meeting/,Media Bulletins -http://www.longbeach.gov/police/press-releases/l-b-p-d--saturation-patrol-proves-effective/,Media Bulletins -http://www.longbeach.gov/police/press-releases/dui-drivers-license-checkpoint-planned-this-weekend/,Media Bulletins -http://www.longbeach.gov/police/press-releases/robbery-suspects-arrested/,Media Bulletins -https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2017_archived_news/september_2017/national_night_out_arlington_police_on_oct_3_2017,Media Bulletins -https://www.columbus.in.gov/event/columbus-police-review-board/,Poor Data Source -https://spdblotter.seattle.gov/2012/02/06/the-seattle-police-foundation-thanks-the-seattle-hotel-association-for-hosting-the-evening-of-hope-gala/,Media Bulletins -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/arrests/081622arrests.pdf,Poor Data Source -https://alpha.austin.gov/en/police-oversight/oral-reprimand-of-officer-ivan-figueroa/,Poor Data Source -https://www.orovalleyaz.gov/government/news/oro-valley-town-council-to-vote-on-police-chief-appointment-february-5,Media Bulletins -https://www.richmondindiana.gov/docs/current-city-police-districts-map,Geographic -https://delcopa.gov/publicrelations/releases/2022/delcopollingplacesfinalizedformay17primary.html,Not Criminal Justice Related -https://brookfieldil.gov/publication/42413-april-24-2013-police-pension-board/,Poor Data Source -https://ci.san-bernardino.ca.us/city_hall/police_department/crime_statistics/about_ucr_statistics/arson_statistics/arson_statistics-2018,Crime Statistics -https://www.roseville.ca.us/news/archive_news/2017_archive_news/police_digest__december_15__2017,Poor Data Source -http://www.greenvillenc.gov/government/police/community-services-and-crime-prevention/cops-and-barbers,Contact Info & Agency Meta -https://delcopa.gov/publicrelations/releases/2020/courtsgovcenter.html,Not Criminal Justice Related -https://coloradosprings.gov/police-department/article/news/homicide-investigation-6600-block-bugle-dr,Media Bulletins -https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0725/,Poor Data Source -https://alpha.austin.gov/police-oversight/formal-complaint-de-escalation-of-potential-force-6/,Poor Data Source -https://delcopa.gov/ems/pdfdocs/licensureprogramco/alsambulanceinspchklst.xls,Not Criminal Justice Related -https://www.woodvillageor.gov/departments/public-safety/police-law-enforcement/,Poor Data Source -https://www.madera.gov/home/departments/police/,Annual & Monthly Reports -https://brookfieldil.gov/publication/11613-november-6-2013-fire-and-police-commission/,Poor Data Source -https://beaverpa.us/a-message-from-the-police-department-2/,Poor Data Source -https://delcopa.gov/ojs/ojsforms/15noticeofproposedrelocation.pdf,Not Criminal Justice Related -http://lafayettepolice.us/2359/brown-street,Not Criminal Justice Related -https://www.bedminster.us/police_fire_rescue/pottersville_volunteer_fire_co_,Not Criminal Justice Related -https://brookfieldil.gov/publication/043009-april-30-2009-police-pension-board/,Poor Data Source -https://www.goldenbeach.us/police-department/k-9-unit/,Contact Info & Agency Meta -https://www.wakeforestnc.gov/communications/town-news/police-news,Media Bulletins -https://southbethany.delaware.gov/police-department/instruction-page-for-ticket-or-summons/,Poor Data Source -https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/102521summary1.pdf,Crime Statistics -https://www.roundrocktexas.gov/city-departments/police/divisions/,Contact Info & Agency Meta -https://delcopa.gov/planning/pdf/agendas/2022/agenda202201.pdf,Not Criminal Justice Related -https://www.ci.northville.mi.us/services/police_department/police_news/joashua_clines_joins_police_dept_,Media Bulletins -https://southamptontownnypolice.gov/faq.aspx?qid=102,Not Criminal Justice Related -https://www.ci.auburn.in.us/wp-content/uploads/2017/11/auburnpolicecar-1000x650.jpg,Poor Data Source -https://delcopa.gov/controller/pdf/retirement/2021/210310minutes.pdf,Not Criminal Justice Related -https://www.hayward-ca.gov/discover/news/jun22/police-blotter-may-22-28-2022,Crime Statistics -https://www.mass.gov/doc/camacho-michael-v-mass-environmental-police-1815/download,Court Cases -https://camptonhills.illinois.gov/police-pension-fund-board/,Contact Info & Agency Meta -https://beaumonttexas.gov/beaumont-police-arrest-a-man-and-woman-after-committing-an-aggravated-robbery-at-6155-eastex/,Poor Data Source -https://ci.san-bernardino.ca.us/city_hall/police_department/sb_978/new_patrol_rifle_powerpoint_complete,Policies & Contracts -https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-47/,Poor Data Source -https://coloradosprings.gov/police-department/page/professional-standards-division,Poor Data Source -https://delcopa.gov/courts/admininstration/lap.html,Contact Info & Agency Meta -https://www.foxcrossingwi.gov/event/police-fire-commission/,Poor Data Source -https://southamptontownnypolice.gov/1387/final-supplemental-geis,Not Criminal Justice Related -http://www.lafayettepolice.us/438/online-crime-reporting,Contact Info & Agency Meta -https://delcopa.gov/publicrelations/releases/2019/newvotingsystem.html,Not Criminal Justice Related -https://delcopa.gov/purchasing/bidsprops/cadserver_e-102121.pdf,Not Criminal Justice Related -https://scrantonpa.gov/wpdm-package/police-union-collective-bargaining-agreement-exp-2021/,Poor Data Source -http://www.longbeach.gov/police/press-releases/shooting-200-block-of-artesia/,Media Bulletins -https://www.danversma.gov/documents/records-and-billings-clerk-police-department/,Poor Data Source -https://beaumonttexas.gov/beaumont-police-detectives-charge-2-in-august-25-2021-homicide-aggravated-robbery/,Poor Data Source -https://health.wyo.gov/publichealth/immunization/influenza-flu/stethoscope-3/,Not Criminal Justice Related -https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0348/,Poor Data Source -http://lafayettepolice.us/1086/i-want-to,Not Criminal Justice Related -https://police.bixbyok.gov/224/submit-a-tip,Contact Info & Agency Meta -https://www.deerpark-oh.gov/departments/police-department/police-department-contacts/,Contact Info & Agency Meta -https://delcopa.gov/planning/pdf/mapping/eddystone.pdf,Poor Data Source -https://www.coppelltx.gov/1054/special-interest-funding,Poor Data Source -https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/043022summary.pdf,Poor Data Source -https://delcopa.gov/council/2018minutes/080818minutes.pdf,Not Criminal Justice Related -https://delcopa.gov/planning/pdf/agendas/2019/agenda201910.pdf,Poor Data Source -https://delcopa.gov/courts/index.html,Resources -https://www.mass.gov/doc/2022-police-sergeant-3yp-442-exam-poster/download,Training & Hiring Info -https://www.southamptontownnypolice.gov/faq.aspx?qid=126,Not Criminal Justice Related -https://delcopa.gov/publicrelations/releases/2018/18spottedlanternfly.pdf,Not Criminal Justice Related diff --git a/hugging_face/relevancy_worker.py b/hugging_face/relevancy_worker.py deleted file mode 100644 index dd158898..00000000 --- a/hugging_face/relevancy_worker.py +++ /dev/null @@ -1,23 +0,0 @@ -import os -import sys -import json -from transformers import pipeline - -def main(): - urls = json.loads(sys.stdin.read()) - - pipe = pipeline("text-classification", model="PDAP/url-relevance") - results = pipe(urls) - - print("Executable:", sys.executable, file=sys.stderr) - print("sys.path:", sys.path, file=sys.stderr) - print("PYTHONPATH:", os.getenv("PYTHONPATH"), file=sys.stderr) - - if len(results) != len(urls): - raise RuntimeError(f"Expected {len(urls)} results, got {len(results)}") - bools = [r["score"] >= 0.5 for r in results] - - print(json.dumps(bools)) - -if __name__ == "__main__": - main() diff --git a/hugging_face/requirements.txt b/hugging_face/requirements.txt deleted file mode 100644 index d467a675..00000000 --- a/hugging_face/requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -# hugging_face only -torch>=2.2.0 -evaluate>=0.4.1 -transformers>=4.38.0 -datasets>=3.2.0 -accelerate>=0.27.2 -numpy>=1.26.4 -multimodal-transformers>=0.3.1 -scikit-learn~=1.5.2 \ No newline at end of file diff --git a/hugging_face/testing/__init__.py b/hugging_face/testing/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/hugging_face/testing/data/coarse_labels.txt b/hugging_face/testing/data/coarse_labels.txt deleted file mode 100644 index 19d55cee..00000000 --- a/hugging_face/testing/data/coarse_labels.txt +++ /dev/null @@ -1,8 +0,0 @@ -Police & Public Interactions -Info About Officers -Info About Agencies -Agency-Published Resources -Jails & Courts Specific -Other -Poor Data Source -Not Criminal Justice Related diff --git a/hugging_face/testing/data/labeled-source-text.csv b/hugging_face/testing/data/labeled-source-text.csv deleted file mode 100644 index 28076788..00000000 --- a/hugging_face/testing/data/labeled-source-text.csv +++ /dev/null @@ -1,6307 +0,0 @@ -id,url,label,coarse_label,html_title,meta_description,http_response,root_page_title,h1,h2,h3,h4,h5,h6,div_text -1,https://delcopa.gov/council/2016minutes/101216minutes.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -2,https://www.mass.gov/doc/coping-with-overdose-fatalities/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,Mass.gov,[],[],[],[],[],[],"" -3,http://www.longbeach.gov/police/press-releases/murder-7-/,Media Bulletins,Agency-Published Resources,MURDER(7),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/29/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 VICTIM'S AGE WAS CORRECTED TO 25-YEARS-OLD On Friday, July 25, 2014, at approximately 11:00 p.m., Long Beach Police responded to a shooting in the 3200 block of Baltic Avenue, which ultimately led to the death of a male adult. Officers arrived and located a male adult who had been struck in the torso by gunfire. He was transported to a local hospital and listed in critical condition. Their preliminary investigation indicated that the victim and some friends were sitting in front of a residence when a vehicle drove by, and an occupant of the vehicle fired multiple rounds at the group, striking the victim. The vehicle then fled northbound on Baltic Avenue. Last night, July 28, 2014, Long Beach Police were notified that the victim, identified as 25-year-old Olatag Filemoni of Long Beach, had succumbed to his injuries. It doesn't appear the victim was affiliated with any gangs and a motive for the shooting is unknown and under investigation. No suspect information is available at this time. Anyone who may have information regarding this incident is urged to contact Long Beach Police Homicide Detectives Mark McGuire and Greg Krabbe at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -4,https://www.lynchburgvapolice.gov/wp-content/uploads/2021/05/img_1545.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -5,http://police.portlandmaine.gov/526/permit-license-fees,Resources,Agency-Published Resources,"Permit & License Fees | Portland, ME - Official Website",See a list of permit and license fees.,200,"Portland, ME - Official Website | Official Website","[""Permit & License Fees""]",[],[],[],[],[],Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government Departments Public Works Street Openings Permit & License Fees Permit & License Fees Permit & License Fees Permit Types Traffic Control Plan Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Public Works Street Openings Permit & License Fees Permit & License Fees Permit & License Fees Permit Types Traffic Control Plan Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Public Works Street Openings Permit & License Fees Permit & License Fees Permit & License Fees Permit Types Traffic Control Plan Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Public Works Street Openings Permit & License Fees Permit & License Fees Permit & License Fees Permit Types Traffic Control Plan Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Public Works Street Openings Permit & License Fees Permit & License Fees Permit & License Fees Permit Types Traffic Control Plan Home Your Government Departments Public Works Street Openings Permit & License Fees Permit & License Fees Permit & License Fees Permit Types Traffic Control Plan Home Your Government Departments Public Works Street Openings Permit & License Fees Permit & License Fees Permit & License Fees Permit Types Traffic Control Plan Home Your Government Departments Public Works Street Openings Permit & License Fees Permit & License Fees Home Your Government Departments Public Works Street Openings Permit & License Fees Permit & License Fees Home Your Government Departments Public Works Street Openings Permit & License Fees Permit & License Fees Permit & License Fees Permit & License Fees Permit Types Traffic Control Plan Permit & License Fees Permit Types Traffic Control Plan Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® -6,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2012_and_prior_archived_news/police_graduate_18_recruits,Personnel Records,Info About Officers,Police Graduate 18 Recruits - City of Arlington,"",200,Just a moment...,"[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Police Graduate 18 Recruits""]",[],[],[],[],Skip to Content Skip to Content -7,https://police.greenvillesc.gov/1996/getting-here-parking,Contact Info & Agency Meta,Info About Agencies,"Getting Here & Parking | Greenville, SC - Official Website","Find location information, directions and parking for Unity Park.",200,"Police Department | Greenville, SC - Official Website","[""Getting Here & Parking""]","[""WEEKEND TROLLEY""]","[""GETTING HERE"", ""Parking"", ""click map for downloadable pdf"", ""Loading""]","[""Parking Garages"", ""Swamp Rabbit Trail""]",[],[],"Skip to Main Content Visit Rentals & Reservations About the Park Donate Contact Search Home Departments Parks, Recreation & Tourism Unity Park Visit Getting Here & Parking Getting Here & Parking GETTING HERE 320 S. Hudson Street Greenville, SC 29601 WEEKEND TROLLEY The Route 903 trolley serves Unity Park on Fridays, Saturdays and Sundays. To board the trolley, passengers must stand near one of the trolley stop signs. Service will be be approximately every 30 minutes. This route operates seasonally from April to September. Friday from 4 p.m. - 11 p.m. Saturday from 10 a.m. - 11 p.m. Sunday from 10 a.m. to 8 p.m. West End Route Map (PDF) Parking Complimentary public parking is available. Please park in designated parking spots only. Parking Garages Unity Park can be accessed via the Swamp Rabbit Trail from any of downtown Greenville’s parking garages. Current Map of Parking Garage Locations Swamp Rabbit Trail Unity Park can be accessed via the Swamp Rabbit Trail System . click map for downloadable pdf Destinations Playgrounds & Splash Pad Prisma Health Welcome Center Trails & Bridges Art in the Park The Holloway Trail The Reedy River Wetlands Honor Tower Nearby Vendors Legacy College Basketball Courts Greenspaces Hours & Park Guidelines Getting Here & Parking FAQs Field Trips Unity Park Map Tour Unity Park Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate " -8,http://lafayettepolice.us/3386/donate,Resources,Agency-Published Resources,"","",404,"","","","","","","","" -9,http://www.lafayettepolice.us/2111/youth-classes-and-weekend-workshops,Misc Police Activity,Police & Public Interactions,"Youth Classes and Weekend Workshops | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Youth Classes and Weekend Workshops""]",[],"[""Select a Program:"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About the Zoo Get Involved Education Programs Special Events I Want To... Home Government Departments H - W Parks & Recreation Facilities Columbian Park Zoo Education Programs Family & Youth Programs Youth Classes and Weekend Workshops Youth Classes and Weekend Workshops Learning comes to life with these fun and exciting classes and weekend workshops. Select a Program: AGES: 5-7 YEARS AGES: 8-11 YEARS Critter Classes Wildlife Workshops Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About the Zoo Get Involved Education Programs Special Events I Want To... Home Government Departments H - W Parks & Recreation Facilities Columbian Park Zoo Education Programs Family & Youth Programs Youth Classes and Weekend Workshops Youth Classes and Weekend Workshops Learning comes to life with these fun and exciting classes and weekend workshops. Select a Program: AGES: 5-7 YEARS AGES: 8-11 YEARS Critter Classes Wildlife Workshops Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -10,https://norfolkne.gov/assets/site/documentcentral/police/archived-arrests/2020-arrests/may-arrests.pdf,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -11,http://www.longbeach.gov/police/press-releases/murder-18-/,Media Bulletins,Agency-Published Resources,MURDER(18),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/17/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MURDER Contact: Media Relations (562) 570-5273 On Tuesday, January 13, 2015, at approximately 9:00 p.m., Long Beach Police responded to the 2300 block of east 10th street regarding shots fired. When officers arrived, they learned that a suspect walked up to a group of individuals who were gathered in a yard of a residence and opened fire, striking a male adult in the upper body. Long Beach Fire Department paramedics responded and transported the victim to a local hospital where he remained in critical condition. Due to the seriousness of the victim’s injuries, homicide detectives responded to the scene to investigate. Last night, January 16, 2015, the victim succumbed to his injuries and was pronounced deceased.  The victim has been identified as 22-year-old Jose De Jesus Cabral Orozco of Long Beach.  The motive for this shooting is still unclear and no suspect is in custody at this time. The investigation remains ongoing. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detectives Hugo Cortes and Oscar Valenzuela at (562) 570-7244.  Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -12,https://www.edmondswa.gov/government/departments/police_department/anonymous_tip,Contact Info & Agency Meta,Info About Agencies,"Anonymous Tip - City of Edmonds, WA","",200,Just a moment...,"[""City of Edmonds - Washington""]","[""Anonymous Tip""]","[""Edmonds Police Department"", ""Recruitment and Hiring""]",[],[],[],Skip to Content -13,https://www.southamptontownnypolice.gov/1698/calissa-restaurant,Not Criminal Justice Related,Not Criminal Justice Related,"Calissa Restaurant | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Calissa Restaurant""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]","[""Summary Sheet"", ""WQIPP - Fund Application""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Community Preservation Fund (CPF) WQIPP - Plan/Checklist/App 2022 WQIP - Applications & Proposal Summaries Calissa Restaurant Calissa Restaurant Summary Sheet Calissa Restaurant Septic Improvement Project-Sheet-2022 WQIPP - Fund Application Calissa Restaurant - Application Submitted Calissa Restaurant - Documents Submitted Old Town Pond Watershed Bioswales (SH Village) Phillips Pond Watershed Bioswales (SH Village) Wickapogue Pond Watershed Bioswales (SH Village) Lake Agawam Stormwater - Trustees Armin and Judy Calissa Restaurant Peconic Land Trust Bridge Gardens Quogue Wildlife Refuge Constructed Wetland Riverside Sewer System Sag Harbor - Sewer Expansion (Sewersheds K & L) Harbour House (Library Avenue Owners Corp.) Lake Agawam Algae Harvesting Phase - (SH Village) Mecox Bay Inlet - Trustees Old Town Pond Dredging (SH Village) Sagaponack Pond Aquatic Habitat Restoration - Trustees Emma Elliston Park - Rain Gardens (SH Town) Lake Agawam- Injection Well PRB (SH Village) Poxabogue Pond-Groundwater Seepage and Nutrient Input West Main Street Bioswale (SH Village) Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -14,https://ose.louisiana.gov/event/police-communications-officer-i-5/,Poor Data Source,Poor Data Source,Police Communications Officer I | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Police Communications Officer I""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Police Communications Officer I Competitive Level Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Police Communications Officer I Competitive Level Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Communications Officer I Competitive Level Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Communications Officer I Competitive Level Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Application This event has passed. Police Communications Officer I Competitive Level Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Application This event has passed. Police Communications Officer I Competitive Level Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Application This event has passed. Police Communications Officer I Competitive Level Competitive Level Competitive Level Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Posting Period 01/15/2021 - 02/01/21 Posting Period Application Deadline 02/01/21 Application Deadline Jurisdiction Shreveport Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -15,https://www.mass.gov/doc/essential-functions-for-municipal-police-officers/download,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -16,https://www.jacksonms.gov/documents/mayoral-executive-order-amending-the-city-of-jackson-police-departments-use-of-force-policy/,Media Bulletins,Agency-Published Resources,"MAYORAL EXECUTIVE ORDER AMENDING THE CITY OF JACKSON POLICE DEPARTMENT'S USE OF FORCE POLICY - Jackson, MS","",200,"City of Jackson - Jackson, MS","[""MAYORAL EXECUTIVE ORDER AMENDING THE CITY OF JACKSON POLICE DEPARTMENT’S USE OF FORCE POLICY""]","[""Primary menu links"", ""Action toolbar"", ""Documents and forms"", ""Contact"", ""Subscribe"", ""Connect""]",[],[],"[""""]",[],"Jackson, MS Primary menu links Residents Businesses Visitors Government News Contact Action toolbar Answers Payments Report Issue Search Primary menu links Residents Businesses Visitors Government News Contact Action toolbar Answers Payments Report Issue Search Jackson, MS Jackson, MS Jackson, MS Proclamation of Local Emergency ___________________________________________________________________________________________________________________________________ The City of Jackson’s Water and Sewer Business Administration is now JXN Water. Click here . _____________________________________________________________________________________________________________________________________ PEG Network Off-Air Announcement: PEG Network is currently off the air as we undergo a relocation. We appreciate your patience during this transition. In the meantime, you can stay connected with PEG Network here or visit our YouTube channel at www.youtube.com/@JacksonPEGNetwork Documents and forms MAYORAL EXECUTIVE ORDER AMENDING THE CITY OF JACKSON POLICE DEPARTMENT’S USE OF FORCE POLICY June 26, 2020 PDF 116 KB Download Documents and forms MAYORAL EXECUTIVE ORDER AMENDING THE CITY OF JACKSON POLICE DEPARTMENT’S USE OF FORCE POLICY June 26, 2020 PDF 116 KB Download Documents and forms June 26, 2020 PDF 116 KB Download June 26, 2020 PDF 116 KB Download June 26, 2020 Helpful Share Facebook Twitter Email Size + Reset a − Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Contact Jackson City Hall 219 S. President St. Jackson, MS 39201 Employee Login Employee Handbook Contact Links Directory Feedback Access Links Accessibility Sitemap Subscribe Enter email Comments This field is for validation purposes and should be left unchanged. Connect Facebook Instagram Twitter Youtube Contact Jackson City Hall 219 S. President St. Jackson, MS 39201 Employee Login Employee Handbook Contact Links Directory Feedback Access Links Accessibility Sitemap Subscribe Enter email Comments This field is for validation purposes and should be left unchanged. Connect Facebook Instagram Twitter Youtube " -17,http://www.longbeach.gov/police/press-releases/murder-600-block-of-e-9th-street/,Media Bulletins,Agency-Published Resources,MURDER 600 block of E 9th Street,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/1/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER 600 BLOCK OF EAST 9TH STREET Contact: Media Relation Detail (562) 570-5273 UPDATE (11/15/2016): On November 11, 2016, police arrested 36-year-old Jorge Omar Chavez of Long Beach in connection with this investigation. Related news release Original News Release (11/1/2016): On November 1, 2016, at approximately 02:10 a.m., officers were dispatched to the 600 block of 9th Street regarding a possible victim of a shooting. Upon arrival officers found a male adult suffering from a gunshot wound to his upper torso. Long Beach Fire Department personnel responded and determined the subject was deceased. The Homicide detail responded and is handling the investigation. The victim has been identified as 18 year-old Long Beach resident Manuel Arechiga. It is unknown at this time if the incident is gang related. Anyone with information is urged to call Homicide Detectives Scott Lasch, Michael Hubbard or Teryl Hubert at (562) 570-7244. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -18,https://www.dps.arkansas.gov/law-enforcement/arkansas-state-police/divisions/highway-patrol/troop-c-commander/,Personnel Records,Info About Officers,Troop C Commander - Arkansas Department of Public Safety,"",200,Home - Arkansas Department of Public Safety,"[""Flag Status""]","[""Troop C Commander"", ""Contact ASP"", ""Helpful ASP links"", ""Connect with ASP"", ""Respect. Integrity. CUSTOMER SERVICE. TEAMWORK. SERVANT LEADERSHIP. CONTINUOUS IMPROVEMENT"", """", ""© 2024 All rights Reserved. Arkansas.gov""]","[""Captain John Carter""]",[],"[""About DPS"", ""DPS Links"", ""DPS Address"", ""Your Arkansas.gov"", ""Top Online Services"", ""Helpful Information""]",[],"" -19,https://www.roseville.ca.us/government/departments/police_department/community_services/my_neighborhood_officer/neighborhood_officer_program_information,Misc Police Activity,Police & Public Interactions,Neighborhood Officer Program Information - City of Roseville,Reasons for Neighborhood Officer program and scheduling information,200,Just a moment...,"[""City of Roseville""]","[""Neighborhood Officer Program Information""]","[""Roseville Police Department""]",[],[],[],"" -20,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2021_news_releases/arrest_leads_to_officer_injury,Media Bulletins,Agency-Published Resources,Arrest Leads to Officer Injury - Village of Pleasant Prairie,"",200,Just a moment...,[],"[""Arrest Leads to Officer Injury""]","[""Follow Us on Social Media""]",[],[],[],"" -21,https://cityofmebanenc.gov/documents/police-officer-2/police-officer-updated-2-21-2022/,Resources,Agency-Published Resources,"Police Officer (Updated 2-21-2022) - Mebane, NC","",200,"Welcome - Mebane, NC","[""Police Officer (Updated 2-21-2022)""]","[""Primary menu links"", ""Action toolbar"", ""Recent news"", ""Welcome"", ""Engage"", ""Help""]","[""Request for Qualifications – City of Mebane Asset Inventory and Assessment Sewer Collections System"", ""Request for Bids: Lake Michael Dam Spillway Replacement"", ""Request for Proposals – Comprehensive Land Development Plan Update"", ""Request for Bids: N. Second Street Sidewalk Improvements"", ""Request for Bids: Elevated Water Storage Tank""]",[],[],[],"Mebane, NC Primary menu links Residents Businesses Visitors Events Government Departments Contact Action toolbar Answers Payments Report Issue Search Primary menu links Residents Businesses Visitors Events Government Departments Contact Action toolbar Answers Payments Report Issue Search Mebane, NC Mebane, NC Mebane, NC Police Officer (Updated 2-21-2022) Posted on February 21, 2022 Police Officer (Updated 2-21-2022) Recent news Request for Qualifications – City of Mebane Asset Inventory and Assessment Sewer Collections System Posted on March 18, 2024 Request for Bids: Lake Michael Dam Spillway Replacement Posted on March 4, 2024 Request for Proposals – Comprehensive Land Development Plan Update Posted on March 1, 2024 Request for Bids: N. Second Street Sidewalk Improvements Posted on January 29, 2024 Request for Bids: Elevated Water Storage Tank Posted on August 4, 2023 All news » Police Officer (Updated 2-21-2022) Posted on February 21, 2022 Police Officer (Updated 2-21-2022) Recent news Request for Qualifications – City of Mebane Asset Inventory and Assessment Sewer Collections System Posted on March 18, 2024 Request for Bids: Lake Michael Dam Spillway Replacement Posted on March 4, 2024 Request for Proposals – Comprehensive Land Development Plan Update Posted on March 1, 2024 Request for Bids: N. Second Street Sidewalk Improvements Posted on January 29, 2024 Request for Bids: Elevated Water Storage Tank Posted on August 4, 2023 All news » Police Officer (Updated 2-21-2022) Recent news Request for Qualifications – City of Mebane Asset Inventory and Assessment Sewer Collections System Posted on March 18, 2024 Request for Bids: Lake Michael Dam Spillway Replacement Posted on March 4, 2024 Request for Proposals – Comprehensive Land Development Plan Update Posted on March 1, 2024 Request for Bids: N. Second Street Sidewalk Improvements Posted on January 29, 2024 Request for Bids: Elevated Water Storage Tank Posted on August 4, 2023 All news » Police Officer (Updated 2-21-2022) Recent news Request for Qualifications – City of Mebane Asset Inventory and Assessment Sewer Collections System Posted on March 18, 2024 Request for Bids: Lake Michael Dam Spillway Replacement Posted on March 4, 2024 Request for Proposals – Comprehensive Land Development Plan Update Posted on March 1, 2024 Request for Bids: N. Second Street Sidewalk Improvements Posted on January 29, 2024 Request for Bids: Elevated Water Storage Tank Posted on August 4, 2023 All news » " -22,https://www.eutawal.gov/policeman/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -23,http://www.longbeach.gov/police/press-releases/murder-investigation4/,Media Bulletins,Agency-Published Resources,MURDER INVESTIGATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/29/2018 FOR IMMEDIATE RELEASE Press Release # Subject: MURDER INVESTIGATION Contact: Media Relations (562) 570-5273 On June 28, 2018, at approximately 9:50 p.m., officers were dispatched to the 1900 block of Martin Luther King Avenue regarding a shooting, which resulted in the death of a male adult. Officers arrived and located a male adult victim with a gunshot wound to his upper torso. Long Beach Fire Department responded and determined the victim deceased at the scene. The victim has been identified as 42-year-old Ellis Spillman of Long Beach. The victim was inside a residence when a single male suspect confronted him with gunfire. The incident appears to be gang-related. A motive for the shooting is unknown and the investigation remains ongoing. Anyone with information is asked to contact the LBPD Homicide Detectives Mark Mattia and Don Collier at (562) 570-7244. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -24,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/090921blotter.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -25,https://delcopa.gov/planning/programsandinitiatives/heritagecommission/historyofhcpreservationawards.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -26,https://www.antioch.il.gov/wpfb-file/12-13-11-police-pension-fund-agenda-pdf/,Poor Data Source,Poor Data Source,"12-13-11 Police Pension Fund Agenda - Antioch, IL",8426 12 13 11 police pension fund agenda pdf commissions agendas 2011 1323382236 7fbda0786265e371ec5e6ffad4bd173e 217x300 _ppssu55rtwkq thumb jpg 08 17 10 36 0 pdf application page_text num_pages pdf_pages pdf_2text timings,200,"Home - Antioch, IL","[""12-13-11 Police Pension Fund Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -27,https://www.bedminster.us/government/police/history,Contact Info & Agency Meta,Info About Agencies,History - Township of Bedminster,"",200,Just a moment...,"[""Bedminster Township""]","[""History""]","[""Bedminster Township""]",[],[],[],"" -28,https://www.ci.neenah.wi.us/departments/police/neighborhood-policing/,Policies & Contracts,Info About Agencies,Neighborhood Policing – City of Neenah,"",200,403 Forbidden,"[""Neighborhood Policing""]","[""In This Department""]","[""Neighborhood Policing: Partnerships that Work""]",[],[],[],"" -29,http://www.lafayettepolice.us/1635/learning-adventures-camps-ages-5-7,Not Criminal Justice Related,Not Criminal Justice Related,"Learning Adventures Camps (ages 5-7) | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Learning Adventures Camps (ages 5-7)""]","[""About Learning Adventures Camps"", ""Registration for 2024 Zoo Camps opens February 1, 2024!"", ""2024 Learning Adventures (ages 5-7) Camp Schedule: *Please note, while we try to keep this schedule and open/closed status as current as possible, there may be delays in website updates."", ""Learning Adventures (ages 5-7) Camp Fees:"", ""Questions?  Please call the Education Department at (765) 807-1540 or email zooeducation@lafayette.in.gov.""]","[""If your desired session is full, you can join the wait list on our registration portal."", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]","[""Please review before registering:"", ""Already registered? Download your required camp forms here.""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About the Zoo Get Involved Education Programs Special Events I Want To... Home Government Departments H - W Parks & Recreation Facilities Columbian Park Zoo Education Programs Family & Youth Programs Zoo Camps Summer Camps Learning Adventures Camps (ages 5-7) Learning Adventures Camps (ages 5-7) About Learning Adventures Camps Because learning never takes a vacation!  These day camps each highlight a different nature-based topic and provide hands-on, brains-on explorations into the wild world of animals!  Each session is designed to meet the developmental and social needs of its participants.  Games, crafts, and STEM (Science, Technology, Engineering, and Math) activities make for a fun-filled week of learning adventure.  All sessions include several encounters with live animals!  Supervised excursions to zoo exhibits and behind-the-scenes areas which complement the lesson, may be included. Registration for 2024 Zoo Camps opens February 1, 2024! 2024 Learning Adventures (ages 5-7) Camp Schedule: *Please note, while we try to keep this schedule and open/closed status as current as possible, there may be delays in website updates. Camp Title Dates Times Status What's For Dinner? June 3-7 9:00am-12:00pm FULL/Wait List Available Zoo Clues June 10-14 9:00am-12:00pm FULL/Wait List Available Pika-ZOO Trainer June 17-June 21 9:00am-12:00pm FULL/Wait List Available Animals Red, White, and Blue *modified fee - see registration portal for details July 1-3 (3-days only) 9:00am-12:00pm OPEN Dinosaur Roar July 8-12 9:00am-12:00pm FULL/Wait List Available Animal Transformers July 15-19 9:00am-12:00pm FULL/Wait List Available Medieval Myths July 22-26 9:00am-12:00pm FULL/Wait List Available Zoo Olympics July 29-Aug 2 9:00am-12:00pm FULL/Wait List Available Dr. Zoolittle Aug 5-9 9:00am-12:00pm OPEN If your desired session is full, you can join the wait list on our registration portal. Learning Adventures (ages 5-7) Camp Fees: $125 Non-Members (Members save 15%) Extended care is available for an additional $15 per child per week and runs 7:30am-9:00am only for morning camp sessions *NOTE: some camp sessions may have modified fees and/or not include extended care - see registration portal for details Please review before registering: Zoo Education Programs Participation Agreement Hold Harmless and Cancellation Policy Already registered? Download your required camp forms here. Zoo Emergency Contact and Pick Up Permissions Form Zoo Health Advisory and Accommodation Form Interested in becoming a member? Click here for more info or to join today! Questions?  Please call the Education Department at (765) 807-1540 or email zooeducation@lafayette.in.gov. Learning Adventures Camps (ages 5-7) Learning Adventures Camps (ages 8-11) Learning Adventures Camps (ages 12-14) Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -30,https://www.sheridanwy.gov/faq_s/police_department,Contact Info & Agency Meta,Info About Agencies,"Police Department FAQ - City of Sheridan, WY","",200,Just a moment...,"[""City of Sheridan""]","[""Police Department FAQ"", """"]",[],[],[],[],Skip to Content -31,https://www.sandyspringsgapolice.gov/category/uncategorized/,Poor Data Source,Poor Data Source,Uncategorized – Sandy Springs Police Department,"",200,Sandy Springs Police Department,"[""Nothing Found""]",[],[],[],[],[],Emergency: Dial 911 | Non-Emergency: Phone Directory | Police Reports | Events Emergency: Dial 911 | Non-Emergency: Phone Directory | Police Reports | Events Menu Menu About SSPD Police Chief Command Staff Districts Careers with SSPD Contact Us Visit Police HQ Higher Learning Statement on Use of Force & Community Engagement SSPD Most Wanted In Memoriam Sandy Springs Police Benevolent Fund SSPD’s Social Media Policy Divisions and Units Patrol Division Special Operations Division Criminal Investigation Division Administration Division Intelligence and Technology Division Internal Affairs Training and Background Unit Property & Evidence Unit Specialized Units North Metro S.W.A.T. Quick Response Force Street Crimes Unit K-9 Unit Traffic Traffic Response Vehicle Bicycle Patrol CSI Unit Crisis Negotiation Team River Patrol Unit Honor Guard Drone Program Community Part Time / Reserve Officers Task Forces Organizational Chart Citizen Services Alarm Information Alcohol Pouring Permits Apartment Safety Checker ChatComm911 Criminal History Reports and Record Restrictions Event Map ⤤ Domestic Violence Resources Home and Business Checks Mental Health & Substance Abuse Municipal Court Off-Duty Officer Requests Open Records Requests Police Reports Report a Crime & Crime Tips Sex Offender Registry Vehicle Release VIN Verification Weapons Carry License Crime Prevention Crime Statistics Neighborhood Watch Home and Business Security Citizen Participation SSPD Events Citizens Police Academy (CPA) Women’s Self Defense Classes Handgun Safety Class Volunteer Programs Citizens On Patrol (COPS) Law Enforcement Explorers Youth Program Internship Program VIPS (Volunteers in Police Service) Chaplains Program Camera Registry Program Menu About SSPD Police Chief Command Staff Districts Careers with SSPD Contact Us Visit Police HQ Higher Learning Statement on Use of Force & Community Engagement SSPD Most Wanted In Memoriam Sandy Springs Police Benevolent Fund SSPD’s Social Media Policy Divisions and Units Patrol Division Special Operations Division Criminal Investigation Division Administration Division Intelligence and Technology Division Internal Affairs Training and Background Unit Property & Evidence Unit Specialized Units North Metro S.W.A.T. Quick Response Force Street Crimes Unit K-9 Unit Traffic Traffic Response Vehicle Bicycle Patrol CSI Unit Crisis Negotiation Team River Patrol Unit Honor Guard Drone Program Community Part Time / Reserve Officers Task Forces Organizational Chart Citizen Services Alarm Information Alcohol Pouring Permits Apartment Safety Checker ChatComm911 Criminal History Reports and Record Restrictions Event Map ⤤ Domestic Violence Resources Home and Business Checks Mental Health & Substance Abuse Municipal Court Off-Duty Officer Requests Open Records Requests Police Reports Report a Crime & Crime Tips Sex Offender Registry Vehicle Release VIN Verification Weapons Carry License Crime Prevention Crime Statistics Neighborhood Watch Home and Business Security Citizen Participation SSPD Events Citizens Police Academy (CPA) Women’s Self Defense Classes Handgun Safety Class Volunteer Programs Citizens On Patrol (COPS) Law Enforcement Explorers Youth Program Internship Program VIPS (Volunteers in Police Service) Chaplains Program Camera Registry Program -32,https://mukilteowa.gov/news/mukilteo-seeks-new-police-chief/,Personnel Records,Info About Officers,"City of Mukilteo - | Mukilteo Seeks New Police Chief - City of Mukilteo","",200,403 Forbidden,"[""Mukilteo Seeks New Police Chief""]","[""Sign up for notifications""]",[],[],[],[],COVID-19 Alert - City of Mukilteo Response COVID-19 Alert - City of Mukilteo Response -33,https://www.foxcrossingwi.gov/departments/police-department/community-policing/tricom/,Poor Data Source,Poor Data Source,tricom - Fox Crossing Fox Crossing,"",200,Fox Crossing - Bridging the Fox Cities Fox Crossing,[],"[""Community Policing » tricom""]",[],[],[],[],"Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing Community Policing » tricom This entry was posted on Tuesday, March 20th, 2012 at 9:49 am and is filed under . - You can follow any responses to this entry through the RSS 2.0 feed. - - Responses are currently closed, but you can trackback from your own site. Comments are closed. Copyright © 2010 - 2024 Fox Crossing, All Rights Reserved. Professional Web Site Design by Sandstone Digital. Disclaimer Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing Community Policing » tricom This entry was posted on Tuesday, March 20th, 2012 at 9:49 am and is filed under . - You can follow any responses to this entry through the RSS 2.0 feed. - - Responses are currently closed, but you can trackback from your own site. Comments are closed. Copyright © 2010 - 2024 Fox Crossing, All Rights Reserved. Professional Web Site Design by Sandstone Digital. Disclaimer " -34,https://www.edmondswa.gov/government/departments/police_department/public_information/can_you_i_d_me_,Wanted Persons,Agency-Published Resources,Can You ID Me - Home,"",200,Just a moment...,"[""CAN YOU ID ME?"", ""504""]","[""Subjects Identified"", ""DO YOU KNOW THESE PEOPLE?""]","[""CanYouID.me is Washington State’s most comprehensive unknown subject identification site.""]",[],"[""DO YOU RECOGNIZE ANYONE IN THESE PHOTOGRAPHS?"", ""DO YOU RECOGNIZE ANYONE IN THESE PHOTOGRAPHS?""]",[],New Detectives Join Here Detective Login Follow Us New Detectives Join Here Detective Login Follow Us clear clear clear clear clear Home Participating Agencies Contact Detective Login External Links: Puget Sound Crime Stoppers Crime Stoppers of Washington State Washington’s Most Wanted Follow Us Home Participating Agencies Contact Detective Login External Links: Puget Sound Crime Stoppers Crime Stoppers of Washington State Washington’s Most Wanted Follow Us Home Participating Agencies Contact Detective Login External Links: Puget Sound Crime Stoppers Crime Stoppers of Washington State Washington’s Most Wanted Home Participating Agencies Contact Detective Login Home Participating Agencies Contact Detective Login External Links: Puget Sound Crime Stoppers Crime Stoppers of Washington State Washington’s Most Wanted External Links: Puget Sound Crime Stoppers Crime Stoppers of Washington State Washington’s Most Wanted CAN YOU ID ME? CanYouID.me is Washington State’s most comprehensive unknown subject identification site. Select a participating agency to view cases from their area. Select a participating agency to view cases from their area. Select a participating agency to view cases from their area. CanYouID.me was created as a location for all Washington State police investigators to post photographs of people captured on video that they could not identify. 504 Subjects Identified CanYouID.me was created as a location for all Washington State police investigators to post photographs of people captured on video that they could not identify. 504 Subjects Identified CanYouID.me was created as a location for all Washington State police investigators to post photographs of people captured on video that they could not identify. 504 Subjects Identified CanYouID.me was created as a location for all Washington State police investigators to post photographs of people captured on video that they could not identify. CanYouID.me was created as a location for all Washington State police investigators to post photographs of people captured on video that they could not identify. 504 Subjects Identified 504 Subjects Identified -35,https://www.lynchburgvapolice.gov/traffic-safety-information/,List of Data Sources,Info About Agencies,Traffic Safety Information - Lynchburg Police Department,"",200,403 Forbidden,"[""Traffic Safety Information""]","[""Traffic Safety Links""]",[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],"[""LPD Traffic Data"", ""Virginia State Police H.E.A.T. Program (Help Eliminate Auto Theft)"", ""Virginia Drive Smart"", ""Smart, Safe, and Sober"", ""Virginia Department of Motor Vehicles – Highway Safety"", ""Virginia’s Child Safety Belt Laws"", ""Child Safety Seat Guidelines"", ""Teen Driving"", ""Virginia DMV Practice Driver’s License Tests"", ""Virginia DMV Motorcycle Safety"", ""Work Zone Safety Info""]","" -36,http://chico.ca.us/post/police-community-advisory-board-pcab,Media Bulletins,Agency-Published Resources,City of Chico - Site Search,"",200,City of Chico - Home,"[""City of Chico"", ""City of Chico""]","[""Site Search""]","[""Contact Us"", ""Quicklinks"", ""City Resources"", ""Stay Connected"", ""Contact Us"", ""Quicklinks"", ""Follow\n \n City of Chico""]",[],[],[],skip to main content -37,http://www.lafayettepolice.us/488/swimming-lessons,Not Criminal Justice Related,Not Criminal Justice Related,"Swimming Lessons | Lafayette, IN - Official Website",Sign up for swimming lessons at the Castaway Bay Aquatic Center in Lafayette.,200,"Police Department | Lafayette, IN - Official Website","[""Swimming Lessons""]","[""Youth Swimming Lessons"", ""Fees"", ""Register"", ""Adult Swimming Lessons"", ""Jim Sharp""]","[""Schedule"", ""Class Times"", """", ""Contact Us"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About Us Special Events Programs I Want To... Home Government Departments H - W Parks & Recreation Facilities Aquatics Programs Swimming Lessons Swimming Lessons Youth Swimming Lessons Youth swimming lessons will once again take place at Castaway Bay in Armstrong Park in 2023. Lessons are offered through Swim America . Schedule June 19-30 July 10-21 Class Times TBD ONLY MORNING SESSIONS WILL BE OFFERED THIS SUMMER - Sessions will meet on Monday - Thursday of each week. Fridays mornings will be used for weather-related make-up sessions. There will be a maximum of 30 students per class period. Fees Number of Children Price 1st Child $60 2nd Child $55 3rd Child $50 4th Child Free Register Visit the Lafayette Swim America parent portal to register. Email info@lafayetteswimamerica.com with questions. Adult Swimming Lessons It's never too late to learn how to swim. Coach Jim Sharp and his staff are here to help you learn. ""Miracle Swimming"" adult swimming lessons will help you to be in control in the water and prevent panic. Sessions are available by request. Contact Us Jim Sharp Personal Email Work Email Phone: 765-427-8447 Birthday Parties Swimming Lessons Lifeguard Certification Course Workreation Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -38,https://alpha.austin.gov/police-oversight/written-reprimand-of-officer-jason-goodman/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -39,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2013_archived_news/december_2013/arlington_police_remind_safe_holiday_season,Media Bulletins,Agency-Published Resources,Arlington Police Remind Motorists to Have Safe Holiday Season - City of Arlington,"",200,Just a moment...,"[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Arlington Police Remind Motorists to Have Safe Holiday Season""]",[],[],[],[],Skip to Content Skip to Content -40,https://www.antioch.il.gov/police-department/,List of Data Sources,Info About Agencies,"Police Department - Antioch, IL","",200,"Home - Antioch, IL","[""Police Department""]",[],[],"[""Employment"", ""Press Releases"", ""Police Blotter"", ""Juvenile Law Enforcement Record Automatic Expungement"", ""Citizen Complaint"", ""9-1-1 Dispatch Center"", ""Antioch Police Drone Use Policy""]",[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -41,https://decaturil.gov/decatur-police-department-to-host-coffee-with-a-cop-on-august-8-2018/,Misc Police Activity,Police & Public Interactions,"","",404,"","","","","","","","" -42,https://www.newcastlewa.gov/departments/police/solicitors,Not Criminal Justice Related,Not Criminal Justice Related,Solicitor Permits - City of Newcastle,"",200,Just a moment...,[],"[""City of Newcastle""]","[""2023 Active Solicitor Permits""]","[""City of Newcastle Washington""]",[],[],"" -43,https://www.hayward-ca.gov/discover/news/mar21/hayward-police-departments-community-academy-goes-virtual-april,Misc Police Activity,Police & Public Interactions,Hayward Police Department’s Community Academy goes virtual in April | City of Hayward - Official website,Community Academy.png The Hayward Police Department is offering special online sessions of its Community Academy program in English and Spanish over four weeks this April.The Hayward Police Department’s Community Academy is a certified educational program designed to give community members a working knowledge of how the Police Department is organized and operates in Hayward.,200,City of Hayward - Official website,"[""Hayward Police Department’s Community Academy goes virtual in April""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""Community Academy.png"", ""You are here. So is everything else."", ""Search form"", ""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment""]",[],"[""Do you need help paying energy bills? You may qualify for federal aid."", ""Hayward Receives Grant for Safe Routes to Schools Infrastructure and Bicycle Incentives"", ""Hayward Celebrates Earth Day at Weekes Park!"", ""Spring 2024 Compost Giveaway"", ""Sustainable Solutions for Celebrating Easter"", ""City Hall and Nonessential Services Closure: Monday, Apr. 01, 2024"", ""Presidential Primary Election: Tuesday, Mar. 5, 2024"", ""Library Closure: February 12 and February 19, 2024."", ""City Hall and Nonessential Services Closures: Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""YOU ARE HERE. SO IS EVERYTHING ELSE."", ""Related News"", ""Alameda County Housing Authority will open waitlists soon for housing and housing vouchers"", ""Phase 2 of improvements to State Route 92-Clawiter Road interchange"", ""Application period open for Hayward Youth Commission"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],Skip to main content -44,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/031422summary.pdf,Daily Activity Logs,Info About Officers,"","",404,"","","","","","","","" -45,https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-4/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -46,https://alpha.austin.gov/es/police-oversight/2020-06-30-7/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -47,https://spdblotter.seattle.gov/2013/05/02/man-leads-police-on-chase-in-stolen-patrol-car-after-attacking-bus-riders-officers/,Media Bulletins,Agency-Published Resources,"Man Leads Police On Chase In Stolen Patrol Car After Attacking Bus Rider, Officers (Updated) - SPD Blotter","",200,403 Forbidden,"[""Man Leads Police On Chase In Stolen Patrol Car After Attacking Bus Rider, Officers (Updated)""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics Search Search Search Search Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports -48,http://www.ryepolice.us/announcements/dmv-phone-scam,Media Bulletins,Agency-Published Resources,Rye Police Department DMV Phone Scam - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""DMV Phone Scam""]","[""DMV Phone Scam""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"­ Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search DMV Phone Scam Home Announcements DMV Phone Scam DMV Phone Scam September 13, 2017 In Announcements We have gotten word that a resident received a phone call from the ""DMV"" last night, September 12, stating that the resident's registration would be expiring at the end of September, and that they (DMV) would be willing to re-register the vehicle for the resident.  They requested all of the necessary information for registering a car, to include personal information.  This call was NOT from the DMV.  DMV does not place calls to people.  All correspondence will be within the postal service.  Please remember to NEVER give out your personal information unless you are certain about who you are actually speaking with.  Please share this with your friends and neighbors, so that no one becomes victim to this crime.  Thank you! Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 " -49,https://www.mass.gov/doc/2021-foxborough-police-sergeant-sole-assessment-center-examination-in-title-employment-verification-form/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -50,https://www.pleasantprairiewi.gov/news/2017_news/1_20_2017___shop_with_a_cop,Media Bulletins,Agency-Published Resources,1/20/2017 | Shop With a Cop - Village of Pleasant Prairie,"",200,Just a moment...,[],"[""1/20/2017 | Shop With a Cop""]","[""Follow Us on Social Media""]",[],[],[],"" -51,https://www.bedminster.us/government/police/tips,Contact Info & Agency Meta,Info About Agencies,Tips - Township of Bedminster,"",200,Just a moment...,"[""Bedminster Township""]","[""Tips""]","[""Bedminster Township""]",[],[],[],"" -52,https://champaignil.gov/2019/02/20/champaign-police-investigating-tuesday-night-shooting/,Misc Police Activity,Police & Public Interactions,Champaign Police Investigating Tuesday Night Shooting - City of Champaign,"On Tuesday, Feb. 19, 2019, at approximately 9:32 p.m., a Champaign Police Officer responded to the 1200 block of W Beardsley Avenue after hearing apparent gun shots while on patrol, which was followed by a citizen report of shots heard in the same area.",200,403 Forbidden,"[""Champaign Police Investigating Tuesday Night Shooting""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Champaign Police Investigating Tuesday Night Shooting Search Posted on February 20, 2019 On Tuesday, Feb. 19, 2019, at approximately 9:32 p.m., a Champaign Police Officer responded to the 1200 block of W Beardsley Avenue after hearing apparent gun shots while on patrol, which was followed by a citizen report of shots heard in the same area. Upon arrival, officers located evidence of a shooting. Soon thereafter, Champaign Police learned an 18-year-old male victim arrived at a local hospital suffering from multiple non-life-threatening gunshot wounds. Champaign Police are processing evidence and actively working to identify the circumstances leading up to the incident. While the investigation remains in its early stages, this is not believed to be a random act of violence. If any resident in the 1200 block area of W Beardsley Avenue has exterior home surveillance camera systems, please contact the police department. It is believed video footage from Tuesday evening may be of investigative assistance. Future updates may be provided as they become available. Police ask anyone who may have information or who was in the area at the time of the shooting to contact police at 217-351-4545. Arrangements can be made for information to be shared privately with police. Anyone wishing to remain anonymous may also submit tips to Crime Stoppers by phone at: 217-373-8477 (TIPS); online at 373tips.com; or the “P3 Tips” mobile app. Champaign Police reminds citizens that information submitted to Crime Stoppers is completely anonymous. Calls are routed to a third-party national call center that receives your information, completes a tips information form, and then passes the information to the appropriate law enforcement agency. Caller ID tracking is not utilized by Crime Stoppers and conversations are not recorded. Crime Stoppers will pay a reward of $1,000 for information leading to the arrest of the person(s) responsible for this crime. Categories: Police Department Press Releases Tags: Beardsley Avenue , Champaign Police Investigating Tuesday Night Shooting , shots heard Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy Powered by Translate " -53,https://champaignil.gov/2012/04/05/champaign-police-officers-cook-with-%e2%80%9ckids-in-the-kitchen%e2%80%9d/,Media Bulletins,Agency-Published Resources,Champaign Police Officers Cook with “Kids in the Kitchen” - City of Champaign,"",200,403 Forbidden,"[""Champaign Police Officers Cook with “Kids in the Kitchen”""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Champaign Police Officers Cook with “Kids in the Kitchen” Search Posted on April 5, 2012 Police Officers spent the day participating in the “Kids in the Kitchen” event; a program aimed at educating young children about physical activity and nutrition. The theme for the event was “Everyday Heroes” which provided youth an opportunity to learn about how being physically fit helps police officers do their jobs well. The event was held at the Wesley Foundation on March 29, 2012. Categories: General Press Releases , Police Department News Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works " -54,https://www.gurnee.il.us/government/departments/police-department/community-involvement/parking,Policies & Contracts,Info About Agencies,Parking,"",200," - Village of Gurnee -","[""Police Department""]","[""Parking on Village Streets""]","[""Village Hall""]",[],[],[],search edit file-word file-empty angle-left angle-right angle-up angle-down dollar calendar-check-o printer search2 briefcase circle-up circle-right circle-down circle-left share2 mail4 facebook twitter youtube file-pdf search edit file-word file-empty angle-left angle-right angle-up angle-down dollar calendar-check-o printer search2 briefcase circle-up circle-right circle-down circle-left share2 mail4 facebook twitter youtube file-pdf -55,https://www.ci.auburn.in.us/wp-content/uploads/2019/08/police-rad-class-2.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -56,https://delcopa.gov/treasurer/pdf/2021reassessmentvalues/25.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -57,https://delcopa.gov/departments/liveworkplay.html,Not Criminal Justice Related,Not Criminal Justice Related,"Live, Work & Play - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Live, Work and Play in Delco, PA""]","[""Delco is a great place to live, work and play!""]","[""Live"", ""Work"", ""Play"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Live, Work and Play in Delco, PA Home / Live, Work and Play Delco is a great place to live, work and play! Live Diverse Population Population Demographics - County and by township Great K-12 Schools Access to world class Colleges and Universities Public Transportation Excellent Healthcare Work Doing Business in Delaware County Central Location Productive Workforce Business and Real Estate Incentives Access to Transportation Play Hiking and Biking Trails World Class Dining Historical Sites 6 County Parks and a Ridley Creek State Park Arts in Delco Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Live, Work and Play in Delco, PA Home / Live, Work and Play Live, Work and Play in Delco, PA Home / Live, Work and Play Live, Work and Play in Delco, PA Home / Live, Work and Play Delco is a great place to live, work and play! Live Diverse Population Population Demographics - County and by township Great K-12 Schools Access to world class Colleges and Universities Public Transportation Excellent Healthcare Work Doing Business in Delaware County Central Location Productive Workforce Business and Real Estate Incentives Access to Transportation Play Hiking and Biking Trails World Class Dining Historical Sites 6 County Parks and a Ridley Creek State Park Arts in Delco Delco is a great place to live, work and play! Live Diverse Population Population Demographics - County and by township Great K-12 Schools Access to world class Colleges and Universities Public Transportation Excellent Healthcare Work Doing Business in Delaware County Central Location Productive Workforce Business and Real Estate Incentives Access to Transportation Play Hiking and Biking Trails World Class Dining Historical Sites 6 County Parks and a Ridley Creek State Park Arts in Delco " -58,https://www.stcharlesil.gov/events/public-meetings/police-pension-board/10889,Policies & Contracts,Info About Agencies,"Police Pension Board 12/6/2017 | Events | City of St Charles, IL",Police Pension Board on 12/6/2017,200,"City of St. Charles, Illinois","[""City of St. Charles, Illinois"", ""Police Pension Board""]","[""You are here"", ""Committee/Commission"", ""View more events"", ""Documents on this site"", ""Accessibility"", ""Key Resources"", ""Connect With Us""]",[],[],[],[],"" -59,https://coloradosprings.gov/police-department/article/news/man-posing-realtor-arrested,Media Bulletins,Agency-Published Resources,Man Posing as Realtor Arrested | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Man Posing as Realtor Arrested""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -60,https://police.greenvillesc.gov/160/services,Resources,Agency-Published Resources,"Services | Greenville, SC - Official Website",Explore the services that the Police Department provides to the City of Greenville.,200,"Police Department | Greenville, SC - Official Website","[""Services""]",[],"[""Loading""]","[""Animal Control"", ""FAQs"", ""GRAVITY"", ""Neighborhoods"", ""Heroes Softball Game"", ""Crime Prevention Services"", ""Hire an Officer"", ""Victim Services"", ""Community Care Program"", ""Citizens Academy"", ""Resources"", ""Pedestrian and Bicycle Safety"", ""Traffic Safety""]",[],[],"Skip to Main Content Careers About Us Divisions News Services I Want To... Search Home Departments Police Department Services Services 9 1 1 2 Animal Control Learn about animal and wildlife law within the city. FAQs Police Department frequently asked questions GRAVITY The GRAVITY program is designed to offer programs and support to at-risk youth of all ages. Neighborhoods Learn about GPD's community policing strategy. Heroes Softball Game Come to Fluor Field to cheer on your favorite heroes from the Greenville City Fire Department and Greenville Police Department, and support Shriners Children's Greenville by donating in their honor. Crime Prevention Services The Crime Prevention Unit promotes the prevention and deterrence of crime by providing information and preventative materials and works to enhance community involvement in the identification and resolution of criminal activity by the development, implementation and maintenance of community-oriented programs. Hire an Officer The city of Greenville hosts almost 200 event days a year, and all gatherings such as concerts, parades, races and festivals that take place on public property must be permitted through the City’s Public Information and Events Department. Victim Services Information for victims of violence, from the state of South Carolina Community Care Program The ElderCare program is a free service offered to those persons who need periodic contact to ensure their safety and security. Citizens Academy Learn about a free 12-week program designed to help citizens learn more about the Greenville Police Department. Resources Learn about the different services offered by the Police Department. Pedestrian and Bicycle Safety To ensure the safety of Greenville's pedestrians and cyclists, the Greenville Police Department strictly enforces all traffic laws. Traffic Safety Information on traffic safety. Animal Control Wildlife & Rabies Control FAQs GRAVITY Annual Officer Allen Jacobs Summer Camp Project Safe Neighborhoods Neighborhoods Heroes Softball Game Crime Prevention Services Auto Theft & Break-Ins SafeWatch Cameras Protecting Your Home Fraud and Identity Theft Resources Bicycle Registration Program Hire an Officer Victim Services Community Care Program Citizens Academy Citizens Police Academy Alumni Association Resources Domestic Violence Emergency Notifications Location Caution Request How To Get Involved Pedestrian and Bicycle Safety Traffic Safety my Neighborhood Become a Police Officer alarm registration compliments & complaints crime stoppers Emergency Notifications Contact Us | Accessibility | Web Policy and Copyright | Website by CivicPlus® City of Greenville, SC, Police Department  |  4 McGee St., Greenville, SC 29601  |  Police Non-Emergency: 864-271-5333 Back to Top Enable Google Translate " -61,https://cheswold.delaware.gov/cheswold-police-department-policy-and-procedure-manual/snow-energency-plan/,Policies & Contracts,Info About Agencies,Snow Energency Plan - Town of Cheswold,"",200,"Home - Town of Cheswold - Kent County, Delaware","[""Cheswold""]","[""Delaware"", ""Snow Energency Plan""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[],"Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Cheswold Delaware Listen Snow Energency Plan Snow Energency Plan Cheswold Delaware Listen Snow Energency Plan Snow Energency Plan Listen Snow Energency Plan Snow Energency Plan Listen Snow Energency Plan Snow Energency Plan Listen Snow Energency Plan Snow Energency Plan Listen Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form " -62,http://boro.dormont.pa.us/labor-agreements/police_union_contract_-_extended/,Policies & Contracts,Info About Agencies,Police_Union_Contract_-_Extended | Borough of Dormont,"",200,Borough of Dormont | Home,"[""Police_Union_Contract_-_Extended""]",[],[],"[""Popular Resources"", ""Departments"", ""Resources""]",[],[],"1444 Hillsdale Avenue Pittsburgh, PA 15216 412-561-8900 Facebook X RSS Contact MENU MENU Home About Dormont History of Dormont Dormont Demographics Voter Information Bids & Proposals Geographical Information System (GIS) Job Postings Report an Issue – Access Dormont FAQs Public Transportation Directory Administration Meet the Mayor Borough Council Council Attendance/Voting Records Committees of Council Tax Collector Community Contact Listings Board & Commissions Human Relations Commission Safe Mobility Commission Animal Control Building & Zoning Department Code Enforcement Public Safety Police Helpful Links The D.A.R.E. Program Fees & Services Fire Department Medical Rescue Team South Area - MRTSA Access Dormont & Code Red – Emergency Notification System Public Safety/Public Service Announcements Government Meeting Agendas, Packets, Minutes, and Videos Agendas, Minutes, and Videos - Pre-September 2022 Dormont Borough Code Planning 2021-2026 Strategic Plan Safe Mobility Plan 2013 Strategic Plan Comprehensive Plan Finance Annual Financial Audits Budget Documents Fee Resolutions LGA Study Pension Plan Information Long-Range Financial Planning Warrant Lists Labor Agreements Stormwater Information Environmental Information Redevelopment Street Sweeping Garbage & Recycling 2024-2028 Garbage and Recycling Parks & Recreation Dormont Pool Doggie Dip Lifeguards Dormont Pool Season Passes Dormont Pool Party Rentals About Dormont Pool Dormont Street & Music Festival DSMF Entertainment and Performance Application Entertainment Vendors Dormont Summer Camp Summer Camp Staff Parks Recreation Rental Information Shared Streets Summer Block Party Information News & Information Breaking News Calendar of Events Community Links Newsletters Online Documents Select Page Police_Union_Contract_-_Extended Police_Union_Contract_-_Extended Popular Resources Calendar of Events 2024-2028 Garbage and Recycling Budget Documents Pay Parking Tickets Online Newsletters FAQs Access Dormont & Code Red – Emergency Notification System Online Documents Departments Administration Police Dept. Volunteer Fire Dept. Code Enforcement Building & Zoning Resources Breaking News Community Events Calendar of Events Community Links Online Documents Tweets by DormontBoro Facebook X RSS ©2018 Borough of Dormont | Web Design by GovUnity Websites 1444 Hillsdale Avenue Pittsburgh, PA 15216 412-561-8900 Facebook X RSS Contact 1444 Hillsdale Avenue Pittsburgh, PA 15216 412-561-8900 Facebook X RSS Contact 1444 Hillsdale Avenue Pittsburgh, PA 15216 412-561-8900 Facebook X RSS Contact " -63,https://coloradosprings.gov/police-department/article/news/motorcyclist-identified-austin-bluffs,Media Bulletins,Agency-Published Resources,Motorcyclist identified from Austin Bluffs Fatal Crash | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Motorcyclist identified from Austin Bluffs Fatal Crash""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -64,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-agencies/1923-police-benevolent-association-new-york-state-inc-pbanys-dues-increase,Misc Police Activity,Police & Public Interactions,State Agencies Bulletin No. 1923 | Office of the New York State Comptroller,State Agencies Bulletin No. 1923,200,Office of the New York State Comptroller | Thomas P. DiNapoli,"[""State Agencies Bulletin No. 1923"", """"]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Effective Dates"", ""OSC Actions"", ""Agency Actions"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[],"" -65,https://www.arlingtontx.gov/city_hall/departments/police/recruiting/internships,Resources,Agency-Published Resources,"","",404,"","","","","","","","" -66,https://www.coppelltx.gov/faq.aspx?qid=351,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Will the rate structure change result in additional r,"",200,"Coppell, TX | Official Website",[],"[""▼ Utility Billing - Rates & Increasing Block Rate Structure"", ""Contact a Plumber & Obtain a Permit""]","[""Categories"", ""Example: Customer A"", ""Example: Customer B"", ""Example: Customer C"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -67,https://cityofpowell.us/police-agency/traffic-surveys/traffic-survey-report-1-3-18/,Misc Police Activity,Police & Public Interactions,"City of Powell, Ohio | Traffic Survey Report 1-3-18","",200,"City of Powell, Ohio","[""Traffic Survey Report 1-3-18""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -68,https://www.bristolri.gov/departments/police/public-safety-services/police-detail-request/,Resources,Agency-Published Resources,"","",404,"","","","","","","","" -69,https://takomaparkmd.gov/government/police/crime-prevention/burglary-prevention/,Media Bulletins,Agency-Published Resources,Burglary Prevention | City of Takoma Park,"",200,City of Takoma Park | The City of Takoma Park,"[""Burglary Prevention""]","[""Crime Prevention & Safety Tips Sections""]",[],"[""Library Renovations: Updated: March 14, 2024 - Construction Moves to the Front of Community Center - Pedestrian Bridge Impacts"", ""Still looking? Try searching for what you need."", ""Still looking? Try searching for what you need."", ""Still looking? Try searching for what you need."", ""Still looking? Try searching for what you need."", ""Still looking? Try searching for what you need."", ""Still looking? Try searching for what you need.""]",[],"[""Government"", ""Services"", ""Initiatives"", ""News"", ""About Takoma Park"", ""Events & Meetings""]","Library Renovations: Updated: March 14, 2024 - Construction Moves to the Front of Community Center - Pedestrian Bridge Impacts The scheduling of demolition and construction timelines are pending weather. More Information Active Alerts Library Renovations: Updated: March 14, 2024 - Construction Moves to the Front of Community Center - Pedestrian Bridge Impacts The scheduling of demolition and construction timelines are pending weather. More Information Library Renovations: Updated: March 14, 2024 - Construction Moves to the Front of Community Center - Pedestrian Bridge Impacts The scheduling of demolition and construction timelines are pending weather. More Information Library Renovations: Updated: March 14, 2024 - Construction Moves to the Front of Community Center - Pedestrian Bridge Impacts The scheduling of demolition and construction timelines are pending weather. More Information Library Renovations: Updated: March 14, 2024 - Construction Moves to the Front of Community Center - Pedestrian Bridge Impacts The scheduling of demolition and construction timelines are pending weather. More Information Active Alerts " -70,https://fenwickisland.delaware.gov/comprehensive-plan/town-of-fenwick-island-fi-comp-plan_cleancopy_version6/,Not Criminal Justice Related,Not Criminal Justice Related,town-of-fenwick-island-fi-comp-plan_cleancopy_version6 - Fenwick Island,"",200,"Home - Fenwick Island - Sussex County, Delaware",[],"[""town-of-fenwick-island-fi-comp-plan_cleancopy_version6""]","[""Menu""]",[],[],[],Skip to Content Skip to Footer Toggle navigation Menu Government Town Council Town Code & Charter Board of Adjustment Planning Commission Overview Committees Meeting Minutes Taxes Elections FOIA Requests Career Opportunities Departments/Contact Administrative Staff Building Official (Code Enforcement and Building Permits) Finance Public Works Police Police Department Mission Statement FIPD Staff Community Programs Real Time Public Safety Notifications (CodeRED) Parking Permits Career Opportunities & Training Beach Patrol Community Visitors Residents Utilities Waste Collection Services Bonfires Special Events Resiliency & Flood Information Contact Us Skip to Content Skip to Footer Toggle navigation Menu Government Town Council Town Code & Charter Board of Adjustment Planning Commission Overview Committees Meeting Minutes Taxes Elections FOIA Requests Career Opportunities Departments/Contact Administrative Staff Building Official (Code Enforcement and Building Permits) Finance Public Works Police Police Department Mission Statement FIPD Staff Community Programs Real Time Public Safety Notifications (CodeRED) Parking Permits Career Opportunities & Training Beach Patrol Community Visitors Residents Utilities Waste Collection Services Bonfires Special Events Resiliency & Flood Information Contact Us Skip to Content Skip to Footer Toggle navigation Menu Government Town Council Town Code & Charter Board of Adjustment Planning Commission Overview Committees Meeting Minutes Taxes Elections FOIA Requests Career Opportunities Departments/Contact Administrative Staff Building Official (Code Enforcement and Building Permits) Finance Public Works Police Police Department Mission Statement FIPD Staff Community Programs Real Time Public Safety Notifications (CodeRED) Parking Permits Career Opportunities & Training Beach Patrol Community Visitors Residents Utilities Waste Collection Services Bonfires Special Events Resiliency & Flood Information Contact Us Listen town-of-fenwick-island-fi-comp-plan_cleancopy_version6 town-of-fenwick-island-fi-comp-plan_cleancopy_version6 << Mar 2024 >> S M T W T F S 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 Like Us on Facebook! Follow Us on Instagram! Newsletter Listen town-of-fenwick-island-fi-comp-plan_cleancopy_version6 town-of-fenwick-island-fi-comp-plan_cleancopy_version6 << Mar 2024 >> S M T W T F S 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 Like Us on Facebook! Follow Us on Instagram! Newsletter Listen town-of-fenwick-island-fi-comp-plan_cleancopy_version6 town-of-fenwick-island-fi-comp-plan_cleancopy_version6 << Mar 2024 >> S M T W T F S 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 Like Us on Facebook! Follow Us on Instagram! Newsletter -71,https://delcopa.gov/employment/jobpostings/deputydirector_workforcedevelopment.html,Not Criminal Justice Related,Not Criminal Justice Related,"Deputy Director Workforce Development - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Deputy Director Workforce Development""]",[],"[""Duties of Position"", ""QUALIFICATIONS / REQUIREMENTS"", ""Delco Jobs Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""StrategicPlanning:"", ""Labor Market Data:"", ""Workforce System Oversight:"", ""Supervisory Responsibilities:"", ""Leadership"", ""Administrative:"", ""Contact""]",[],[],"" -72,https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scope-24/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -73,https://coloradosprings.gov/police-department/article/news/cspd-asks-communitys-help-fatal-crash,Media Bulletins,Agency-Published Resources,CSPD Asks for the Community’s Help in Fatal Crash | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""CSPD Asks for the Community’s Help in Fatal Crash""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -74,http://www.longbeach.gov/police/press-releases/traffic-fatality-22-/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY(22),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/21/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Monday, June 20, 2016, at approx. 9:55 p.m., officers were dispatched to 7th Street and Newport Avenue regarding an injury traffic collision between a motorcycle and a pick-up truck. When officers arrived, they discovered the motorcyclist lying unconscious in the roadway in front of the pick-up truck. Officers began performing lifesaving medical aid on the motorcyclist, however, he was determined deceased at the scene by Long Beach Fire Department paramedics. The preliminary investigation revealed that a 2000 Toyota Tacoma, being driven by a 70-year-old male resident of Long Beach, was travelling west on 7th Street and attempted to turn left on Newport Avenue, and collided with a 2008 Harley Davidson Sportster motorcycle. The motorcycle was travelling east and being driven by a 33-year-old male resident of Commerce. The motorcyclist’s identification is being withheld pending notification of next of kin. Anyone who may have information regarding this incident is asked to call Long Beach Police Department Collision Investigation Detail Detective Steve Fox at (562) 570-7355. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -75,https://delcopa.gov/publicrelations/releases/2021/covidtesting_darbyfeb3.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Conducting Drive-Thru COVID-19 Testing in Darby during the Week of February 15 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Conducting Drive-Thru COVID-19 Testing in Darby during the Week of February 15""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County Conducting Drive-Thru COVID-19 Testing in Darby during the Week of February 15 Home / Departments / Public Relations Releases / Delaware County Conducting Drive-Thru COVID-19 Testing in Darby during the Week of February 15 Released: February 12, 2021 Delaware County will conduct public drive-thru COVID-19 testing at Mercy Fitzgerald Hospital in Darby from Monday, February 15 through Friday, February 19. Testing will be available for insured and uninsured individuals 12 years of age or older who live or work in Delaware County and have COVID-19 symptoms, were exposed to COVID-19, or are considered critical/essential workers. Individuals must pre-register at www.delcopa.gov/testing to receive a test. If you have health insurance, please bring your insurance card to the test site. However, there are no out-of-pocket costs or co-pays for COVID-19 testing. Masks or face coverings must be worn. COVID-19 test results typically take between 4-7 days. Additional testing information, including details regarding how to obtain faster results and the locations of additional public and private COVID-19 test sites, can be found on the link listed above. Please note: If you have a positive test result, you may be called by the Chester County Health Department Disease Investigation team to complete an investigation. Location: Mercy Fitzgerald Hospital 1500 Lansdowne Avenue Darby, PA 19023 Monday, Feb 15: 3 p.m. – 6 p.m. Tuesday, Feb 16: 1 p.m. – 6 p.m. Wednesday, Feb 17: 1 p.m. – 6 p.m. Thursday, Feb 18: 1 p.m. – 6 p.m. Friday, Feb 19: 3 p.m. – 6 p.m. Please note that testing will not be conducted at the US Army Reserve in Upland during this week. Residents can call Delaware County’s Department of Intercommunity Health at (610) 891-6129 with any questions regarding COVID-19 testing. For the latest vaccine information, visit delcopa.gov/covid . Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu " -76,https://raleighnc.gov/safety/police-administrative-services-division,Resources,Agency-Published Resources,Police Administrative Services Division | Raleighnc.gov,"",200,RaleighNC.gov | Raleighnc.gov,"[""Police Administrative Services Division""]","[""Main navigation"", ""Secondary"", ""Main navigation"", ""Share"", ""Contact"", ""Subscribe"", ""City of Raleigh/s social media accounts"", ""Select Language""]",[],[],[],[],"" -77,https://coloradosprings.gov/police-department/article/news/cspd-conduct-abandoned-or-out-compliance,Media Bulletins,Agency-Published Resources,CSPD to conduct Abandoned or Out of Compliance Vehicle Deployment | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""CSPD to conduct Abandoned or Out of Compliance Vehicle Deployment""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -78,https://es.carpinteriaca.gov/wp-content/uploads/2022/11/palms-copy-scaled.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -79,https://coloradosprings.gov/police-department/article/news/i-25-traffic-safety-deployment-after-stop,Media Bulletins,Agency-Published Resources,I-25 Traffic Safety Deployment- After the Stop | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""I-25 Traffic Safety Deployment- After the Stop""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -80,https://dccouncil.gov/judiciary-public-safety/copy-of-ag0-fy-2019-proposed-schedule-a-two-position-changes-1/,Annual & Monthly Reports,Info About Agencies,Copy of AG0 FY 2019 Proposed Schedule A (Two Position Changes)-1 • Council of the District of Columbia,"",200,Home • Council of the District of Columbia,"[""Copy of AG0 FY 2019 Proposed Schedule A (Two Position Changes)-1""]",[],[],[],[],[],"Federal Tax Counter: $1,297,934,697 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Federal Tax Counter: $1,297,934,697 What is this? Get Updates RSS Press Center facebook twitter youtube Federal Tax Counter: $1,297,934,697 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Council of the District of Columbia Copy of AG0 FY 2019 Proposed Schedule A (Two Position Changes)-1 October 10, 2018 Loading... Copy of AG0 FY 2019 Proposed Schedule A (Two Position Changes)-1 October 10, 2018 Loading... Loading... Loading... DC Council seal About the Council Open Government Register to Vote Council Updates Jobs Council Directory Privacy Policy Commemorative D.C. Flag Program Ethics Visit the Wilson Building facebook twitter youtube Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Search facebook twitter youtube Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate " -81,https://barnegatpolice.us/warrant-arrest-2/,Arrest Records,Police & Public Interactions,Warrant Arrest - Barnegat Township Police Department,"",200,Barnegat Township Police Department - Barnegat Township Police Department,"[""Warrant Arrest""]","[""Warrant Arrest""]","[""About the Author: BTPD"", ""Related Posts""]","[""Share This Story, Choose Your Platform!"", ""Robbery Arrest"", ""DWI Arrest"", ""DWI Arrest"", ""Robbery Investigation Leads to Multiple Arrests, Recovery of Handgun"", ""DWI Arrests"", ""Resources"", ""Directions"", ""Quick Links""]",[],[],"609-698-5000 Facebook Twitter Search for: Home FAQ About Us Accreditation Department Divisions Department History Mission and Values Professional Standards Recruiting Current News Neighborhood Policing Resources Contact Us Crime Reporting Contact Firearms Unit Contact Records Contact Traffic Safety Tip Line Go to... Home FAQ About Us Accreditation Department Divisions Department History Mission and Values Professional Standards Recruiting Current News Neighborhood Policing Resources Contact Us Crime Reporting Contact Firearms Unit Contact Records Contact Traffic Safety Tip Line Warrant Arrest Home / Current News / Warrant Arrest Previous Next Warrant Arrest On September 29th at 11:15am, Patrolman Nicholas Venuto arrested Brian Jerden, 38, of Hampton, PA on a $5,541 child support warrant issued by the Ocean County Sheriffs Department. Ptl. Venuto located Jerden on Anchor Rd after the department received an anonymous tip that Jerden was in that area. Jerden was lodged in the Ocean County Jail in default of bail. By BTPD | 2013-10-02T20:01:56+00:00 October 2nd, 2013 | Current News | 0 Comments Share This Story, Choose Your Platform! Facebook Twitter Reddit LinkedIn Tumblr Pinterest Vk Email About the Author: BTPD Related Posts Robbery Arrest Robbery Arrest DWI Arrest DWI Arrest DWI Arrest DWI Arrest Robbery Investigation Leads to Multiple Arrests, Recovery of Handgun Robbery Investigation Leads to Multiple Arrests, Recovery of Handgun DWI Arrests DWI Arrests Resources Barnegat Township Police Department 900 West Bay Avenue Barnegat, NJ 08005 609-698-5000 Directions Quick Links About Us Crime Reporting Resources Contact Us Tip Line Copyright 2018 Content, Barnegat Township Police Department | All Rights Reserved Copyright 2018 Website Design | Web Alliance International Agency, LLC. | All Rights Reserved Facebook Twitter " -82,https://www.mass.gov/doc/606-cmr-1500-clean-copy/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,Mass.gov,[],[],[],[],[],[],"" -83,https://training.detroitmi.gov/bn/departments/paulaisa-baibhaaga/detroit-police-department-shield-program/paraogaraama-ebam-saebaa,Poor Data Source,Poor Data Source,প্রোগ্রাম এবং সেবা | City of Detroit,"DPD SHIELD প্রোগ্রামটি বিভিন্ন শ্রোতাদের আলিঙ্গন করার জন্য ডিজাইন করা হয়েছে যেমন নিরাপত্তা পরিচালক, নিরাপত্তা ব্যবস্থাপক, সম্প্রদায়ের নেতা, ব্যবসায়িক নির্বাহী, ব্যবসার মালিক, শিক্ষাবিদ, বিশ্বাস-ভিত্তিক সম্প্রদায় এবং অন্যান্য যাদের নিজ নিজ কর্মীদের নিরাপত্তা নিশ্চিত করার দায়িত্ব রয়েছে। ব্যবসা বা প্রতিষ্ঠান। একটি সফল প্রোগ্রামের চাবিকাঠি এবং সেইসাথে আমাদের সম্প্রদায়গুলিকে সুরক্ষিত করা হল তথ্যের পারস্পরিক প্রবাহকে উত্সাহিত করা। DPD SHIELD প্রোগ্রাম তার অংশীদারদের অবগত এবং স্থিতিস্থাপক রাখতে গুরুত্বপূর্ণ সংস্থান এবং প্রশিক্ষণ প্রদান করে।",200,City of Detroit | Opportunity Rising,"[""প্রোগ্রাম এবং সেবা""]","[""Top Links"", ""Site Menu"", ""ডেট্রয়েট পুলিশ শিল্ড FAQs""]",[],"[""পরিচিতি"", ""ডিপার্টমেন্ট মেনু""]",[],[],"এটি প্রশিক্ষণের ওয়েবসাইট। বর্তমান তথ্যের জন্য অনুগ্রহ করে detroitmi.gov দেখুন Top Links Buses চাকরি পানি পে বিভাগ সরকার English Español Bengali العربية More অনুসন্ধান Site Menu MENU অনুসন্ধান বিভাগ BACK বিমানবন্দর, কোলম্যান এ। ইয়ং ইন্টারন্যাশনাল বিল্ডিং, সুরক্ষা প্রকৌশল ও পরিবেশ বিভাগ নাগরিক অধিকার, অন্তর্ভুক্তি ও সুযোগ বিভাগ গণপূর্ত বিভাগ আপিল ও শুনানি বিভাগ উদ্ভাবন ও প্রযুক্তি বিভাগ প্রতিবেশী বিভাগ ডেট্রয়েট বিল্ডিং অথরিটি আইন বিভাগ আবাসন ও পুনরুজ্জীবন বিভাগ চিফ ফিনান্সিয়াল অফিসারের অফিস ডেট্রয়েট পরিবহন বিভাগ ডেট্রয়েট ফায়ার ডিপার্টমেন্ট ডেট্রয়েট স্বাস্থ্য বিভাগ নির্বাচন পরিকল্পনা ও উন্নয়ন বিভাগ পানি ও নর্দমা ব্যবস্থা বিভাগ পার্ক এবং বিনোদন পুলিশ বিভাগ পেনশন বিভাগ পৌর পার্কিং বিভাগ মানব সম্পদ বিভাগ মিডিয়া সার্ভিস বিভাগ যুব সেবা সাধারণ পরিষেবা বিভাগ হোমল্যান্ড সিকিউরিটি অ্যান্ড ইমারজেন্সি ম্যানেজমেন্ট, ডেট্রয়েট সরকার BACK অডিটর জেনারেল অফিস কমিশন নগর পরিষদ ন্যায়পাল বোর্ড মহাপরিদর্শক অফিস মেয়রের কার্যালয় সিটি ক্লার্ক আদমশুমারি BACK আদমশুমারি কি? কেন আদমশুমারির বিষয়টি গুরুত্বপূর্ণ তুমি কিভাবে সাহায্য করতে পার আদমশুমারি সম্পদ আমি কিভাবে করবো BACK অনুদানের তথ্য পান অনুরোধ নথি আবেদন কিছু সন্ধান করুন ক্রয় চাকরীর জন্য সন্ধান করুন বা আবেদন করুন জরিমানা, বিল বা কর প্রদান করুন তথ্য অনুসন্ধান কর নিবন্ধন নিবন্ধন করুন পরিষেবা বা সহায়তার জন্য অনুরোধ করুন পারমিট বা শংসাপত্রের জন্য বা পুনর্নবীকরণের জন্য আবেদন করুন যুব প্রোগ্রামগুলি সন্ধান করুন লাইসেন্সের জন্য আবেদন করুন বা নবায়ন করুন শহরের সাথে ব্যবসা করুন সমস্যা রিপোর্ট করুন স্বেচ্ছাসেবক বাস চাকরি পে পানি ঘটনাবলী খবর নির্দেশিকা কাগজপত্র ফরম নীড়পাতা পুলিশ বিভাগ Detroit Police Department Shield Program প্রোগ্রাম এবং সেবা DPD SHIELD প্রোগ্রামটি বিভিন্ন শ্রোতাদের আলিঙ্গন করার জন্য ডিজাইন করা হয়েছে যেমন নিরাপত্তা পরিচালক, নিরাপত্তা ব্যবস্থাপক, সম্প্রদায়ের নেতা, ব্যবসায়িক নির্বাহী, ব্যবসার মালিক, শিক্ষাবিদ, বিশ্বাস-ভিত্তিক সম্প্রদায় এবং অন্যান্য যাদের নিজ নিজ কর্মীদের নিরাপত্তা নিশ্চিত করার দায়িত্ব রয়েছে। ব্যবসা বা প্রতিষ্ঠান। একটি সফল প্রোগ্রামের চাবিকাঠি এবং সেইসাথে আমাদের সম্প্রদায়গুলিকে সুরক্ষিত করা হল তথ্যের পারস্পরিক প্রবাহকে উত্সাহিত করা। DPD SHIELD প্রোগ্রাম তার অংশীদারদের অবগত এবং স্থিতিস্থাপক রাখতে গুরুত্বপূর্ণ সংস্থান এবং প্রশিক্ষণ প্রদান করে। ব্যক্তিগত অংশীদার সম্পদ ব্যক্তিগত অংশীদারদের জন্য সম্পদ পি বিশ্বাস-ভিত্তিক অংশীদার সম্পদ বিশ্বাস-ভিত্তিক অংশীদারদের জন্য সম্পদ সম্প্রদায় অংশীদার সম্পদ সম্প্রদায় অংশীদারদের জন্য সম্পদ CRASE প্রশিক্ষণের জন্য নিবন্ধন করুন CRASE প্রশিক্ষণের জন্য নিবন্ধন করুন সন্দেহজনক কার্যকলাপ রিপোর্ট সন্দেহজনক কার্যকলাপ রিপোর্ট পরিচিতি Detroit Shield Program (313) 596-2250 Detroit Public Safety Headquarters - 1301 3rd Street Detroit, MI 48226 Detroit Police Shield Detroit Police Shield Detroit Police Shield ডিপার্টমেন্ট মেনু ভিডিও কাগজপত্র ফরম প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী DPD Shield CRASE PLAYING https://www.youtube.com/watch?v=OMAZQKFR4CQ DPD Shield CRASE PLAYING https://www.youtube.com/watch?v=4NJ4N6JXRMQ DHS 8 Signs PLAYING https://www.youtube.com/watch?v=j0It68YxLQQ&t=56s Alert ডেট্রয়েট পুলিশ শিল্ড FAQs নিউজলেটার সদস্যতা কপিরাইট 2001 - 2022 সিটি অফ ডেট্রয়েট দ্বারা সিটি অফ ডেট্রয়েটের ওয়েব সাইট সম্পর্কে তথ্যের জন্য, ওয়েব সম্পাদককে ইমেল করুন। সমস্ত উপাদান ডেট্রয়েট শহরের সম্পত্তি এবং শুধুমাত্র অনুমতির সাথে ব্যবহার করা যেতে পারে। গোপনীয়তা নীতি / দাবিত্যাগ আমাদের অনুসরণ করো টুইটার ফেসবুক ইউটিউব লিঙ্কডইন-ইন ইনস্টাগ্রাম ডেটা ডেট্রয়েট ডেট্রয়েটের ওপেন ডেটা পোর্টাল এটি প্রশিক্ষণের ওয়েবসাইট। বর্তমান তথ্যের জন্য অনুগ্রহ করে detroitmi.gov দেখুন এটি প্রশিক্ষণের ওয়েবসাইট। বর্তমান তথ্যের জন্য অনুগ্রহ করে detroitmi.gov দেখুন এটি প্রশিক্ষণের ওয়েবসাইট। বর্তমান তথ্যের জন্য অনুগ্রহ করে detroitmi.gov দেখুন এটি প্রশিক্ষণের ওয়েবসাইট। বর্তমান তথ্যের জন্য অনুগ্রহ করে detroitmi.gov দেখুন এটি প্রশিক্ষণের ওয়েবসাইট। " -84,https://www.mass.gov/info-details/audit-of-the-massachusetts-commission-on-the-status-of-women-objectives-scope-and-methodology,Not Criminal Justice Related,Not Criminal Justice Related,"Audit of the Massachusetts Commission on the Status of Women Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Massachusetts Commission on the Status of Women.,200,Mass.gov,"[""Audit of the Massachusetts Commission on the Status of Women Objectives, Scope, and Methodology""]","[""Table of Contents for the audit, Audit of the Massachusetts Commission on the Status of Women (MCSW)"", ""Table of Contents"", ""Overview"", ""Commissioner Appointments"", ""Open Meeting Law Compliance"", ""Certification of Online Training Program Completion"", ""MCSW Regional Commission Bylaws"", ""Data Reliability"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[],"" -85,http://www.longbeach.gov/police/press-releases/pursuit-with-traffic-fatality---3rd-street-and-temple-avenue/,Media Bulletins,Agency-Published Resources,PURSUIT WITH TRAFFIC FATALITY - 3RD STREET AND TEMPLE AVENUE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -86,http://www.ryepolice.us/logs/police-logs-for-6-3-20-6-9-20,Daily Activity Logs,Info About Officers,Rye Police Department Police Logs for 6/3/20-6/9/20 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs for 6/3/20-6/9/20""]","[""Police Logs for 6/3/20-6/9/20""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -87,http://www.ryepolice.us/logs/police-logs-for-11216-11816,Daily Activity Logs,Info About Officers,Rye Police Department Police Logs for 11/2/16-11/8/16 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs for 11/2/16-11/8/16""]","[""Police Logs for 11/2/16-11/8/16""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -88,https://delcopa.gov/sheriff/pdf/atf_letter.pdf,Media Bulletins,Agency-Published Resources,"","",200,"","","","","","","","" -89,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/010322arrests.pdf,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -90,https://www.sandiego.gov/department-document/police-investigate-homicide-lincoln-park-0,Media Bulletins,Agency-Published Resources,Police Investigate Homicide In Lincoln Park | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Police Investigate Homicide In Lincoln Park"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -91,https://alpha.austin.gov/es/police-oversight/2020-08-26-2/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -92,https://wyoming.delaware.gov/police-department/irma/,Poor Data Source,Poor Data Source,Irma - Town of Wyoming,"",200,Home - Town of Wyoming - Kent County Delaware,"[""Wyoming""]","[""Delaware"", ""Irma""]","[""Menu"", ""Contact Us""]",[],[],[],"Skip to Content Skip to Footer Toggle navigation Menu Government Town Council Town Staff Budgets Ordinances Charter Meetings & Events Past Minutes & Agendas Committees Planning & Zoning Water & Sewer Board of Adjustments Peach Festival Info Emergency Services Police Department Fire Department Building Inspection License Applications & Permits Forms Public Notice Street Sweeping Schedule Trash and Recycling Schedule Important Links Community Town Life History Park Reservations Wyoming Park Local Organizations Photo Gallery Newsletter News Meetings & Events Contact Us Contact Information Contact Form FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Town Council Town Staff Budgets Ordinances Charter Meetings & Events Past Minutes & Agendas Committees Planning & Zoning Water & Sewer Board of Adjustments Peach Festival Info Emergency Services Police Department Fire Department Building Inspection License Applications & Permits Forms Public Notice Street Sweeping Schedule Trash and Recycling Schedule Important Links Community Town Life History Park Reservations Wyoming Park Local Organizations Photo Gallery Newsletter News Meetings & Events Contact Us Contact Information Contact Form FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Town Council Town Staff Budgets Ordinances Charter Meetings & Events Past Minutes & Agendas Committees Planning & Zoning Water & Sewer Board of Adjustments Peach Festival Info Emergency Services Police Department Fire Department Building Inspection License Applications & Permits Forms Public Notice Street Sweeping Schedule Trash and Recycling Schedule Important Links Community Town Life History Park Reservations Wyoming Park Local Organizations Photo Gallery Newsletter News Meetings & Events Contact Us Contact Information Contact Form FOIA Form Town Hall will be closed Friday March 29, 2024 in observance of Good Friday. Office will reopen on Monday April 1st. More Info Wyoming Delaware Listen Irma Wyoming Delaware Listen Irma Listen Irma Listen Irma Listen Irma Listen Contact Us Phone Icon for Town Hall Phone Number (302) 697-2966 Map Marker Icon for Town Hall Directions 120 W. Camden Wyoming Ave. Wyoming, DE 19934 Envelope Icon for Contacting Town Hall Contact Form FOIA Form Facebook Icon Like Us Original design and concept by the Delaware GIC Copyright © 2024 Government Information Center Contact Us Phone Icon for Town Hall Phone Number (302) 697-2966 Map Marker Icon for Town Hall Directions 120 W. Camden Wyoming Ave. Wyoming, DE 19934 Envelope Icon for Contacting Town Hall Contact Form FOIA Form Facebook Icon Like Us Original design and concept by the Delaware GIC Copyright © 2024 Government Information Center Phone Icon for Town Hall Phone Number (302) 697-2966 Map Marker Icon for Town Hall Directions 120 W. Camden Wyoming Ave. Wyoming, DE 19934 Envelope Icon for Contacting Town Hall Contact Form FOIA Form Facebook Icon Like Us Original design and concept by the Delaware GIC Copyright © 2024 Government Information Center Phone Icon for Town Hall Phone Number (302) 697-2966 Map Marker Icon for Town Hall Directions 120 W. Camden Wyoming Ave. Wyoming, DE 19934 Envelope Icon for Contacting Town Hall Contact Form FOIA Form Facebook Icon Like Us " -93,http://www.princetoniowa.us/chapter-30---police-department.html,Resources,Agency-Published Resources,CHAPTER 30 - Police Department,"",200,Home,[],"[""Return to Table of Contents""]",[],[],[],[],WELCOME TO PRINCETON ON THE MISSISSIPPI Home City Services and Government Agendas and Minutes Community Resources Employment Opportunities Online Payments Calendar History Contact Us Aging and Senior Care Resources Return to Table of Contents Proudly powered by Weebly Home City Services and Government Agendas and Minutes Community Resources Employment Opportunities Online Payments Calendar History Contact Us Aging and Senior Care Resources Back City Services and Government City Staff Mayor and Council Boards and Committees Committee Meeting Times Board of Adjustments Annual City Budget Proposals Summer Fest City Code Zoning City Forms and Permits City Hall Police Department Fire Department Princeton Community Visioning Project Back Agendas and Minutes City Council Minutes Council Meeting Agendas Back Community Resources Community Center Library Parks Churches Businesses Schools WELCOME TO PRINCETON ON THE MISSISSIPPI WELCOME TO PRINCETON ON THE MISSISSIPPI Home City Services and Government Agendas and Minutes Community Resources Employment Opportunities Online Payments Calendar History Contact Us Aging and Senior Care Resources Return to Table of Contents Proudly powered by Weebly Home City Services and Government Agendas and Minutes Community Resources Employment Opportunities Online Payments Calendar History Contact Us Aging and Senior Care Resources Return to Table of Contents Home City Services and Government Agendas and Minutes Community Resources Employment Opportunities Online Payments Calendar History Contact Us Aging and Senior Care Resources Return to Table of Contents Return to Table of Contents Return to Table of Contents Return to Table of Contents Return to Table of Contents Return to Table of Contents Return to Table of Contents Proudly powered by Weebly Proudly powered by Weebly Proudly powered by Weebly Proudly powered by Weebly Home City Services and Government Agendas and Minutes Community Resources Employment Opportunities Online Payments Calendar History Contact Us Aging and Senior Care Resources Back City Services and Government City Staff Mayor and Council Boards and Committees Committee Meeting Times Board of Adjustments Annual City Budget Proposals Summer Fest City Code Zoning City Forms and Permits City Hall Police Department Fire Department Princeton Community Visioning Project Back Agendas and Minutes City Council Minutes Council Meeting Agendas Back Community Resources Community Center Library Parks Churches Businesses Schools Home City Services and Government Agendas and Minutes Community Resources Employment Opportunities Online Payments Calendar History Contact Us Aging and Senior Care Resources Back City Services and Government City Staff Mayor and Council Boards and Committees Committee Meeting Times Board of Adjustments Annual City Budget Proposals Summer Fest City Code Zoning City Forms and Permits City Hall Police Department Fire Department Princeton Community Visioning Project Back Agendas and Minutes City Council Minutes Council Meeting Agendas Back Community Resources Community Center Library Parks Churches Businesses Schools -94,https://rexburg.us/police-identify-man-who-died-in-shooting-at-taylorsville-apartment-complex/,Poor Data Source,Poor Data Source,"","",522,"","","","","","","","" -95,https://bouldercolorado.gov/news/boulder-police-searching-additional-victims-witnesses-investigation,Media Bulletins,Agency-Published Resources,"Boulder Police Searching for Additional Victims, Witnesses in Investigation | City of Boulder","",200,Home | City of Boulder,"[""Boulder Police Searching for Additional Victims, Witnesses in Investigation""]","[""Breadcrumb"", ""Details"", ""Keep Reading""]","[""Body of Unidentified White Male Found in Boulder Creek, No Indications of Foul Play"", ""Boulder Police Department Seeks New Volunteers to Become Victim Advocates"", ""Boulder Police Investigating Fatal Traffic Crash"", ""Boulder Police Release More Information About Dog Attack""]",[],[],[],"Calendar Jobs Contact Us Search English 繁體中文 Français Deutsch 한국어 Русский Español नेपाली en Locations Services Projects Government News Toggle Menu City of Boulder Locations Services Projects Government News Calendar Jobs Contact Us Search Breadcrumb Home News Boulder Police Searching for Additional Victims, Witnesses in Investigation Image Details Dionne Waugh, Media Relations, 303-518-1894 waughd@bouldercolorado.gov Published Date Sep 29, 2022 Boulder Police Searching for Additional Victims, Witnesses in Investigation BOULDER, Colo. – The Boulder Police Department is seeking more information from the community regarding an ongoing investigation. Boulder Police detectives are looking for more information, including possible witnesses and victims, who may have had interactions with Ilir ""Jack"" Sokolaj. Sokolaj has worked at Brooklyn Pizza, located at 1647 Arapahoe Road, on and off since 2018. During that time, he had numerous contacts with students from Boulder High School. During the summer of 2019, Sokolaj, then 19 years old, engaged in sexual acts with girls who were 14 years old. He was arrested in May 2022 on one count of Sexual Assault on a Child, one count of Internet Exploitation of a Child, and one count of Unlawful Sexual Contact stemming from this investigation and is currently awaiting trial. Anyone who has any information related to this investigation or other possible incidents is asked to call Detective Flynn at 303-441-1850 reference case 21-08531. As in every criminal case, these charges are an accusation, and the defendant is presumed innocent unless or until proven guilty. . Keep Reading Body of Unidentified White Male Found in Boulder Creek, No Indications of Foul Play March 22, 2024 Boulder Police Department Seeks New Volunteers to Become Victim Advocates March 5, 2024 Boulder Police Investigating Fatal Traffic Crash February 7, 2024 Boulder Police Release More Information About Dog Attack January 29, 2024 Calendar Locations Services News Government Accessibility 1777 Broadway Boulder , CO 80302 Contact Us YouTube Twitter Facebook Instagram LinkedIn Nextdoor © 2024 City of Boulder. All Rights Reserved. Privacy Policy " -96,https://www.villageofallouezwi.gov/depts/police/prescription-drug-collections/,Resources,Agency-Published Resources,Prescription Drug Collection - Allouez WI,See a list of ongoing collection sites. Proper disposal of prescription drug collections is necessary to insure the drugs are completely destroyed.,200,403 Forbidden,"[""Prescription Drug Collections""]","[""Preparing Items for Drop Off"", ""Alternative Medication Drop Off Sites"", ""Public Safety Forms""]",[],"[""Allouez Village Hall"", ""How to Package Items for Drop Off"", ""Collected"", ""Not Collected"", ""PUBLIC SAFETY PAGES"", ""POLICE DEPARTMENT"", ""FIRE DEPARTMENT"", ""House Check Request""]","[""Subscribe to Village Updates""]",[],"" -97,https://www.southamptontownnypolice.gov/439/southampton-shinnecock-hills-tuckahoe-ca,Resources,Agency-Published Resources,"Southampton / Shinnecock Hills / Tuckahoe CAC | Southampton, NY - Official Website",Find out more about the Southampton / Shinnecock Hills / Tuckahoe Citizen Advisory Committee.,200,"Police | Southampton, NY - Official Website","[""Southampton / Shinnecock Hills / Tuckahoe CAC""]","[""Meetings"", ""Members""]","[""Site Tools"", ""Quick Links"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Boards & Committees Advisory Boards & Committees Citizen Advisory Committees Southampton / Shinnecock Hills / Tuckahoe CAC Southampton / Shinnecock Hills / Tuckahoe CAC Meetings 6:30 p.m. First Tuesday of each month Cooper Hall at Roger’s Memorial Library 91 Coopers Farm Rd, Southampton, NY Members Elaine Bodtmann - Co-Chair Peter Callos John Cerrato - Co-Chair Christopher Deveau Lorraine Duryea - Co-Chair Janice Eaton Debbie Harrington Susan Manley Renee Morrison Theresa Romano Each member serves a one-year term. Quick Links Hamlets Master Plans News & Events Town Code Town Studies & Reports View All /QuickLinks.aspx CAC Minutes Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Boards & Committees Advisory Boards & Committees Citizen Advisory Committees Southampton / Shinnecock Hills / Tuckahoe CAC Southampton / Shinnecock Hills / Tuckahoe CAC Meetings 6:30 p.m. First Tuesday of each month Cooper Hall at Roger’s Memorial Library 91 Coopers Farm Rd, Southampton, NY Members Elaine Bodtmann - Co-Chair Peter Callos John Cerrato - Co-Chair Christopher Deveau Lorraine Duryea - Co-Chair Janice Eaton Debbie Harrington Susan Manley Renee Morrison Theresa Romano Each member serves a one-year term. Quick Links Hamlets Master Plans News & Events Town Code Town Studies & Reports View All /QuickLinks.aspx CAC Minutes Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... " -98,https://cityofpowell.us/powell-police-officer-audrey-wilt-named-2022-cit-officer-of-the-year-by-delaware-morrow-mental-health-recovery-services-board/hrytzikwilt22citofficeroftheyear/,Poor Data Source,Poor Data Source,"City of Powell, Ohio | HrytzikWilt22CITOfficeroftheYear","",200,"City of Powell, Ohio","[""HrytzikWilt22CITOfficeroftheYear""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -99,https://southamptontownnypolice.gov/1702/lake-agawam--injection-well-prb-sh-villa,Not Criminal Justice Related,Not Criminal Justice Related,"Lake Agawam- Injection Well PRB (SH Village) | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Lake Agawam- Injection Well PRB (SH Village)""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]","[""Summary Sheet"", ""WQIPP - Fund Application""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Community Preservation Fund (CPF) WQIPP - Plan/Checklist/App 2022 WQIP - Applications & Proposal Summaries Lake Agawam- Injection Well PRB (SH Village) Lake Agawam- Injection Well PRB (SH Village) Summary Sheet Lake Agawam Injection Well-Sheet-2022 WQIPP - Fund Application Lake Agawam- Injection Well PRB (SH Village) - Application Submitted Lake Agawam- Injection Well PRB (SH Village) - Site Plans Submitted Old Town Pond Watershed Bioswales (SH Village) Phillips Pond Watershed Bioswales (SH Village) Wickapogue Pond Watershed Bioswales (SH Village) Lake Agawam Stormwater - Trustees Armin and Judy Calissa Restaurant Peconic Land Trust Bridge Gardens Quogue Wildlife Refuge Constructed Wetland Riverside Sewer System Sag Harbor - Sewer Expansion (Sewersheds K & L) Harbour House (Library Avenue Owners Corp.) Lake Agawam Algae Harvesting Phase - (SH Village) Mecox Bay Inlet - Trustees Old Town Pond Dredging (SH Village) Sagaponack Pond Aquatic Habitat Restoration - Trustees Emma Elliston Park - Rain Gardens (SH Town) Lake Agawam- Injection Well PRB (SH Village) Poxabogue Pond-Groundwater Seepage and Nutrient Input West Main Street Bioswale (SH Village) Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -100,https://www.mass.gov/event/jlmc-17-6105-watertown-police-association-3a-hearing-open-meeting-notice-05-09-2018-2018-05-09t100000-0400-2018-05-09t170000-0400,Misc Police Activity,Police & Public Interactions,JLMC-17-6105 Watertown Police Association 3(A) Hearing Open Meeting Notice 05-09-2018 | Mass.gov,JLMC-17-6105 Watertown Police Association 3(A) Hearing Open Meeting Notice 05-09-2018,200,Mass.gov,"[""JLMC-17-6105 Watertown Police Association 3(A) Hearing Open Meeting Notice 05-09-2018""]","[""Address"", ""Overview of JLMC-17-6105 Watertown Police Association 3(A) Hearing Open Meeting Notice 05-09-2018"", ""Additional Resources for JLMC-17-6105 Watertown Police Association 3(A) Hearing Open Meeting Notice 05-09-2018"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[],"" -101,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/090721blotter.pdf,Calls for Service,Police & Public Interactions,"","",404,"","","","","","","","" -102,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/012222blotter.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -103,https://www.coppelltx.gov/939/events-activities,Not Criminal Justice Related,Not Criminal Justice Related,"Events & Activities | Coppell, TX","",200,"Coppell, TX | Official Website","[""Events & Activities""]","[""Register for Classes!"", ""ADA Notice""]","[""How to Register for Classes"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Parks & Trails Facilities Rentals Activities Home Government City Departments Community Experiences Facilities Senior & Community Center at Grapevine Springs Events & Activities Events & Activities Register for Classes! Stay active with C oppell Community Experiences classes and other programs! From sports and fitness, to environmental education and creative arts, we offer fun for all ages and interests. Take a look at our Winter/Spring 2024 Activity Guide , which features classes for all ages (including seniors!) in one guide, and register for a class. ( Click to view the accessible catalog ) How to Register for Classes Go to coppellactivities.com If you don't have one, create a new account! Find your activity and Add to Cart . Proceed to Checkout to complete your transaction. A receipt will be emailed to you. ADA Notice The City of Coppell acknowledges its responsibility to comply with the Americans with Disabilities Act of 1990. Thus, in order to assist individuals with disabilities who require special services (i.e. sign interpretative services, alternative audio/visual devices, and amanuenses) for participation in or access to the City of Coppell sponsored public programs, services, and/or meetings, the City requests that individuals makes requests for these services seventy-two (72) hours – three (3) business days ahead of the scheduled program, service, and/or meeting. To make arrangements, contact Kori Allen, ADA Coordinator, or other designated official at 972-462-0022, or (TDD 1-800-RELAY, TX 1-800-735-2989). Rentals Events & Activities Agendas & Minutes Alert Sign-Up Citizen Report E-News Pay Water Bill Permits 255 E. Parkway Blvd., P.O. Box 9478, Coppell, TX 75019 Phone: 972-462-0022 | Email us Site Map Contact Us Accessibility Copyright Notices Privacy Policy Employee Login /QuickLinks.aspx Government Websites by CivicPlus® " -104,https://alpha.austin.gov/es/police-oversight/temporary-suspension-of-officer-william-norrell/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -105,https://alpha.austin.gov/police-oversight/2020-08-17-9/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -106,https://bouldercolorado.gov/news/police-chief-maris-herold-op-ed-police-reform,Media Bulletins,Agency-Published Resources,Police Chief Maris Herold Op-Ed on Police Reform | City of Boulder,"",200,Home | City of Boulder,"[""Police Chief Maris Herold Op-Ed on Police Reform""]","[""Breadcrumb"", ""Details"", ""Holistic governance is key to police reform"", ""Keep Reading""]","[""Body of Unidentified White Male Found in Boulder Creek, No Indications of Foul Play"", ""Boulder Police Department Seeks New Volunteers to Become Victim Advocates"", ""Boulder Police Investigating Fatal Traffic Crash"", ""Boulder Police Release More Information About Dog Attack""]",[],[],[],"" -107,https://ose.louisiana.gov/event/police-communications-officer-20/,Poor Data Source,Poor Data Source,Police Communications Officer | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Police Communications Officer""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Police Communications Officer Competitive Level Posting Period 07/23/2020 - 08/23/20 Application Deadline 08/23/20 Jurisdiction Baton Rouge Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Police Communications Officer Competitive Level Posting Period 07/23/2020 - 08/23/20 Application Deadline 08/23/20 Jurisdiction Baton Rouge Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Communications Officer Competitive Level Posting Period 07/23/2020 - 08/23/20 Application Deadline 08/23/20 Jurisdiction Baton Rouge Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Communications Officer Competitive Level Posting Period 07/23/2020 - 08/23/20 Application Deadline 08/23/20 Jurisdiction Baton Rouge Application This event has passed. Police Communications Officer Competitive Level Posting Period 07/23/2020 - 08/23/20 Application Deadline 08/23/20 Jurisdiction Baton Rouge Application This event has passed. Police Communications Officer Competitive Level Posting Period 07/23/2020 - 08/23/20 Application Deadline 08/23/20 Jurisdiction Baton Rouge Application This event has passed. Police Communications Officer Competitive Level Competitive Level Competitive Level Posting Period 07/23/2020 - 08/23/20 Application Deadline 08/23/20 Jurisdiction Baton Rouge Posting Period 07/23/2020 - 08/23/20 Application Deadline 08/23/20 Jurisdiction Baton Rouge Posting Period 07/23/2020 - 08/23/20 Application Deadline 08/23/20 Jurisdiction Baton Rouge Posting Period 07/23/2020 - 08/23/20 Posting Period Application Deadline 08/23/20 Application Deadline Jurisdiction Baton Rouge Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -108,https://www.stpaul.gov/departments/police/administration-office-chief/community-engagement-division/community-partnerships,Contact Info & Agency Meta,Info About Agencies,Community Partnerships Unit | Saint Paul Minnesota,Overview The City Wide Services Unit is part of the Operations Division of the Saint Paul Police Department and consists of the following seven (7) functio,200,Home | Saint Paul Minnesota,"[""Community Partnerships Unit""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""In This Section"", ""Overview"", ""A Community Outreach Program (A.C.O.P.)"", ""Contact Us"", ""Footer""]","[""You are using an unsupported browser. Please use Microsoft Edge."", ""Contact The City"", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[],"" -109,https://www.woburnma.gov/government/recreation/spring-summer-brochure-2018-final-copy/,Not Criminal Justice Related,Not Criminal Justice Related,Spring & Summer Brochure 2018 - City of Woburn,"",200,"City of Woburn, Massachusetts","[""Spring & Summer Brochure 2018""]",[],"[""Get Text & Email Updates!""]","[""Post Details""]",[],[],"Economic Development View our latest info here Pay Where Do I Go For Economic Development View our latest info here Pay Where Do I Go For Economic Development View our latest info here Pay Where Do I Go For Economic Development View our latest info here Pay Where Do I Go For MENU MENU Residents Moving to Woburn Resources Click here to view helpful resources for new or current Woburn residents. News Library Public Schools Recreation Report a Concern Woburn Senior Center Traffic & Parking Veterans Voting & Elections Woburn Public Media Center Trash & Recycling Businesses Economic Development Click here to view our latest info. Apply for Business Certificate Licenses & Permits Food Service Retail Food Mobile Food Municipal Lien Certificates Swimming Pool & Spa Tanning Establishment Temporary Food Service Government Departments & Boards Search through all Departments, Boards and Commissions A-Z. Mayor’s Office City Council Departments & Boards A-Z Employment Opportunities About Woburn History Minutes & Agendas Archive Upcoming Public Meetings Ordinances / Code Bid Postings Public Schools Services Pay a Bill Click here to pay your bill quickly and efficiently. Assessors Database Change Your Mailing Address Forms Open Checkbook Subscribe Pay A Bill Register a Vehicle Register to Vote Report a Concern Events Quick Actions MENU MENU Residents Moving to Woburn Resources Click here to view helpful resources for new or current Woburn residents. News Library Public Schools Recreation Report a Concern Woburn Senior Center Traffic & Parking Veterans Voting & Elections Woburn Public Media Center Trash & Recycling Businesses Economic Development Click here to view our latest info. Apply for Business Certificate Licenses & Permits Food Service Retail Food Mobile Food Municipal Lien Certificates Swimming Pool & Spa Tanning Establishment Temporary Food Service Government Departments & Boards Search through all Departments, Boards and Commissions A-Z. Mayor’s Office City Council Departments & Boards A-Z Employment Opportunities About Woburn History Minutes & Agendas Archive Upcoming Public Meetings Ordinances / Code Bid Postings Public Schools Services Pay a Bill Click here to pay your bill quickly and efficiently. Assessors Database Change Your Mailing Address Forms Open Checkbook Subscribe Pay A Bill Register a Vehicle Register to Vote Report a Concern Events Quick Actions " -110,https://southamptontownnypolice.gov/faq.aspx?qid=270,Contact Info & Agency Meta,Info About Agencies,FAQs • Do I have to renew operating permits every year?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Public Safety - Fire Prevention""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -111,https://brooklynwi.gov/open-house-brooklyn-police-dane-county-sheriffs-office-april-8-at-6pm-or-april-9-at-6pm-at-community-bldg/,Poor Data Source,Poor Data Source,Open House – Brooklyn Police – Dane County Sheriff’s Office – April 8 at 6pm or April 9 at 6pm at Community Bldg - Village of Brooklyn,"",200,Home - Village of Brooklyn,[],"[""Open House – Brooklyn Police – Dane County Sheriff’s Office – April 8 at 6pm or April 9 at 6pm at Community Bldg"", ""Post navigation""]","[""Contact Us"", ""Office Hours"", ""Department Contacts""]",[],[],[],Today Week Detailed 55°F Today 55°F Tue 52°F Wed 43°F Thu 48°F Fri 55°F Sat 57°F Sun 50°F Today Week Detailed 55°F Today 55°F Tue 52°F Wed 43°F Thu 48°F Fri 55°F Sat 57°F Sun 50°F Today Week Detailed 55°F Today 55°F Tue 52°F Wed 43°F Thu 48°F Fri 55°F Sat 57°F Sun 50°F Today Week Detailed 55°F Today 55°F Tue 52°F Wed 43°F Thu 48°F Fri 55°F Sat 57°F Sun 50°F Today Week Detailed 55°F Today 55°F Tue 52°F Wed 43°F Thu 48°F Fri 55°F Sat 57°F Sun 50°F Today Week Detailed 55°F Today 55°F Tue 52°F Wed 43°F Thu 48°F Fri 55°F Sat 57°F Sun 50°F Today Week Detailed 55°F Today 55°F Tue 52°F Wed 43°F Thu 48°F Fri 55°F Sat 57°F Sun 50°F Today Week Detailed 55°F Today 55°F Tue 52°F Wed 43°F Thu 48°F Fri 55°F Sat 57°F Sun 50°F Today Week Detailed 55°F Today 55°F Tue 52°F Wed 43°F Thu 48°F Fri 55°F Sat 57°F Sun 50°F 55°F Today 55°F Tue 52°F Wed 43°F Thu 48°F Fri 55°F Sat 57°F Sun 50°F 55°F Today 55°F Tue 52°F Wed 43°F Thu 48°F Fri 55°F Sat 57°F Sun 50°F Home Government Agendas & Minutes Calendar of Events Budget Elections Committee Descriptions Economic Develop Committee Community Profile Brooklyn Business Cmpx Ordinances Village Board Members Departments Clerk’s Office Agendas & Minutes Calendar Forms & Permits News & Notices Emergency Management Emergency Management Department Emergency Weather Radios Nixle Emergency Alerts Tornado Safety Police Department Police Department Law of the Month Police Activity Reports Public Works Public Works Helpful Links Latest News Water/Sewer Information Water Hardness Information Brooklyn Fire/EMS District Brooklyn Recreation Community Cemetery Info Community Resources Employment Frequently Asked Questions New Resident Forms & Permits Links Newsletters Parks/Community Building Recycling Urban Forest Site History Brooklyn Garden Club About our Name Brooklyns Beginnings Capital Chair Edmund Andrew House Elderly Gents John Bell Labor Day Celebrations The Chair Factory Old Village Hall Site of Former Feed Mill Subscribe to Updates Contact Us Home Government Agendas & Minutes Calendar of Events Budget Elections Committee Descriptions Economic Develop Committee Community Profile Brooklyn Business Cmpx Ordinances Village Board Members Departments Clerk’s Office Agendas & Minutes Calendar Forms & Permits News & Notices Emergency Management Emergency Management Department Emergency Weather Radios Nixle Emergency Alerts Tornado Safety Police Department Police Department Law of the Month Police Activity Reports Public Works Public Works Helpful Links Latest News Water/Sewer Information Water Hardness Information Brooklyn Fire/EMS District Brooklyn Recreation Community Cemetery Info Community Resources Employment Frequently Asked Questions New Resident Forms & Permits Links Newsletters Parks/Community Building Recycling Urban Forest Site History Brooklyn Garden Club About our Name Brooklyns Beginnings Capital Chair Edmund Andrew House Elderly Gents John Bell Labor Day Celebrations The Chair Factory Old Village Hall Site of Former Feed Mill Subscribe to Updates Contact Us -112,https://alpha.austin.gov/en/police-oversight/documents-regarding-the-use-of-racial-profiling-in-policin/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -113,https://ridgelandsc.gov/police-department/daily-arrest-reports-may,Arrest Records,Police & Public Interactions,Town of Ridgeland,Town of Ridgeland,200,Town of Ridgeland,"[""Police Department""]","[""Daily Arrest Reports - May""]",[],[],[],[],"HOME GOVERNMENT Government Mayor Town Council Boards & Commissions Board, Commission, & Committee Vacancies Town Council Meeting Agendas Town Council Videos Resources Bid Opportunities Public Meeting Agendas Financial Documents DEPARTMENTS Executive Finance, HR and Risk Management Municipal Court Planning and Community Development Police Department Fire Department Water & Sewer BUSINESS Bid Opportunities Building Permits & Forms Business License Information Economic Development Opening a Business Public Meeting Agendas Resources Zoning Maps COMMUNITY About Ridgeland Battle of Honey Hill Community Events Job Opportunities Maps Gallery News & Information Ordinances Parks & Trails Public Safety/Utilities Schools Services Town of Ridgeland Farmers Market I WANT TO... Contact a Staff Member File a FOIA Request Find Out About Trash Collection Service Find the Police Department Find the Fire Department Find Town Hall Find Zoning Maps Learn About Services Pay a Traffic Fine Pay My Water Bill I Want Water/Sewer Service Rent Lakeside at Blue Heron HOME GOVERNMENT Government Mayor Town Council Boards & Commissions Board, Commission, & Committee Vacancies Town Council Meeting Agendas Town Council Videos Resources Bid Opportunities Public Meeting Agendas Financial Documents DEPARTMENTS Executive Finance, HR and Risk Management Municipal Court Planning and Community Development Police Department Fire Department Water & Sewer BUSINESS Bid Opportunities Building Permits & Forms Business License Information Economic Development Opening a Business Public Meeting Agendas Resources Zoning Maps COMMUNITY About Ridgeland Battle of Honey Hill Community Events Job Opportunities Maps Gallery News & Information Ordinances Parks & Trails Public Safety/Utilities Schools Services Town of Ridgeland Farmers Market I WANT TO... Contact a Staff Member File a FOIA Request Find Out About Trash Collection Service Find the Police Department Find the Fire Department Find Town Hall Find Zoning Maps Learn About Services Pay a Traffic Fine Pay My Water Bill I Want Water/Sewer Service Rent Lakeside at Blue Heron HOME GOVERNMENT Government Mayor Town Council Boards & Commissions Board, Commission, & Committee Vacancies Town Council Meeting Agendas Town Council Videos Resources Bid Opportunities Public Meeting Agendas Financial Documents DEPARTMENTS Executive Finance, HR and Risk Management Municipal Court Planning and Community Development Police Department Fire Department Water & Sewer BUSINESS Bid Opportunities Building Permits & Forms Business License Information Economic Development Opening a Business Public Meeting Agendas Resources Zoning Maps COMMUNITY About Ridgeland Battle of Honey Hill Community Events Job Opportunities Maps Gallery News & Information Ordinances Parks & Trails Public Safety/Utilities Schools Services Town of Ridgeland Farmers Market I WANT TO... Contact a Staff Member File a FOIA Request Find Out About Trash Collection Service Find the Police Department Find the Fire Department Find Town Hall Find Zoning Maps Learn About Services Pay a Traffic Fine Pay My Water Bill I Want Water/Sewer Service Rent Lakeside at Blue Heron " -114,https://www.mass.gov/doc/maldenpolicesergeant3554rtf/download,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -115,https://spdblotter.seattle.gov/2018/05/21/detective-cookies-urban-youth-chess-club-announces-kids-vs-cops-chess-rumble-tournament/,Misc Police Activity,Police & Public Interactions,Detective Cookie's Urban Youth Chess Club Announces “Kids Vs. Cops” Chess Rumble Tournament - SPD Blotter,"",200,403 Forbidden,"[""Detective Cookie’s Urban Youth Chess Club Announces “Kids Vs. Cops” Chess Rumble Tournament""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -116,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0439/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -117,https://delcopa.gov/planning/programsandinitiatives/commissionsandtaskforces.html,Contact Info & Agency Meta,Info About Agencies,Commissions and Task Forces,"",200,"Delaware County, Pennsylvania","[""Commissions and Task Forces""]",[],"[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Commissions and Task Forces Home / Departments / Planning Department / Municipal Programs & Initiatives / Commissions and Task Forces Multi-institutional efforts supported by the staff of the Delaware County Planning Department. Delaware County initiatives often evolve into broader efforts that are collaborative in nature. Stakeholders frequently include the State of Pennsylvania, municipalities, non-profits and citizens. The Planning Department currently supports the following Commissions and Task Forces. Coastal Zone Task Force Heritage Commission Delaware County Planning Commission Questions about Commissions and Task Forces? Contact the Planning Department at 610-891-5200 or Planning_Department@co.delaware.pa.us . Planning Department Navigation Access the Data and Mapping Innovation Hub About Planning Calendar Current Projects Delaware County 2035 Demographic Data Development Review Forms Funding Green Space and Trails Project Mapping Municipal Programs & Initiatives Planning Education Publications Gina Burritt, Director Planning Department 2 W. Baltimore Avenue Suite 202 Media, PA 19063 Phone: 610-891-5200 Fax: 610-891-5203 Email: Planning_Department@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2023 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Commissions and Task Forces Home / Departments / Planning Department / Municipal Programs & Initiatives / Commissions and Task Forces Commissions and Task Forces Home / Departments / Planning Department / Municipal Programs & Initiatives / Commissions and Task Forces Commissions and Task Forces Home / Departments / Planning Department / Municipal Programs & Initiatives / Commissions and Task Forces " -118,https://coloradosprings.gov/police-department/page/cases-interest-randy-bishop,Officer Involved Shootings,Police & Public Interactions,Cases of Interest: Randy Bishop | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Cases of Interest: Randy Bishop""]","[""Search"", ""CSPD Case of Interest: Randy Bishop Officer Involved Shooting"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],"[""Memorial Hospital Redacted Arrest Warrant for Randy Bishop"", ""Officer Becker Body Worn Camera: 01/11/2020, 11:57 PM"", """", """", ""Officer Becker Body Worn Camera: 01/12/2020, 12:02 AM"", """", """", """", ""Officer Mattox Body Worn Camera: 01/11/2020, 11:59 PM"", """", """", """", ""Officer Involved Shooting Redacted Arrest Warrant"", ""Officer Colliver, Murphy, Weems, and Owen's Body Worn Camera: 01/26/2020, 12:07 PM"", ""Redacted POWPO Arrest Warrant."", ""Court Conclusion""]","[""REPORT ONLINE""]",[],"" -119,https://www.wakeforestnc.gov/news/police-department-turkey-drive-continues-through-november-20,Media Bulletins,Agency-Published Resources,"Police Department Turkey Drive continues through November 20 | Town of Wake Forest, NC","The Wake Forest Police Department (WFPD) is accepting monetary donations through Saturday, Nov. 20, as part of its 15th Annual Turkey Drive. Area residents can support this worthy cause by submitting online donations via PayPal at http://bit.ly/WFPDTurkeyDrive.Cash and checks written to the Wake Forest Police Department are also accepted. Anyone wishing to contribute cash or",200,"Town of Wake Forest, NC","[""Police Department Turkey Drive continues through November 20""]","[""fnow_jun09-45.jpg"", ""Town Hall Closed Friday, March 29"", ""Search form"", ""You are here""]",[],[],[],[],Skip to main content -120,https://delcopa.gov/row/pdf/2020/informationforcouplesgettingmarriedform.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -121,https://coloradosprings.gov/police-department/article/news/traffic-fatality-3500-block-austin-bluffs,Media Bulletins,Agency-Published Resources,Traffic Fatality 3500 Block of Austin Bluffs Parkway | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Traffic Fatality 3500 Block of Austin Bluffs Parkway""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -122,https://delcopa.gov/courts/pdf/mdjlistmuni01jan2018.pdf,Contact Info & Agency Meta,Info About Agencies,"","",200,"","","","","","","","" -123,https://www.mooresville.in.gov/event/police-commission-3/,Poor Data Source,Poor Data Source,Police Commission - Town of Mooresville,"",200,403 Forbidden,"[""Police Commission""]","[""November 18, 2022 @ 5:00 pm - 6:00 pm"", ""Details"", ""Venue""]",[],[],[],[],"Town Calendar Indiana Gateway Employee Portal About Mooresville About Mooresville Town History Visiting Mooresville Community Community Links Community News Online Services Online Documents Center Ordinances and Resolutions Minutes Town Meeting Recordings Sewer Bill Payment Code of Ordinances Departments Parks and Rec Fire Department Police Department Public Works Building Department Clerk/Treasurer Departments – Other I want to… Report a Pothole or Streets Problem Find Zoning Info Pay or View Sewer Bill View all FAQs Apply For… Building Permit Sewer Permit Solicitor’s Permit Street Cut Permit Elected Officials Main in Motion Select Page About Mooresville About Mooresville Town History Visiting Mooresville Community Community Links Community News Online Services Online Documents Center Ordinances and Resolutions Minutes Town Meeting Recordings Sewer Bill Payment Code of Ordinances Departments Parks and Rec Fire Department Police Department Public Works Building Department Clerk/Treasurer Departments – Other I want to… Report a Pothole or Streets Problem Find Zoning Info Pay or View Sewer Bill View all FAQs Apply For… Building Permit Sewer Permit Solicitor’s Permit Street Cut Permit Elected Officials Main in Motion Town Calendar Indiana Gateway Employee Portal « All Events This event has passed. Police Commission November 18, 2022 @ 5:00 pm - 6:00 pm « Police Commission Executive Meeting Thanksgiving – Government Center Closed » Add to calendar Google Calendar iCalendar Outlook 365 Outlook Live Details Date: November 18, 2022 Time: 5:00 pm - 6:00 pm Venue Police Station « Police Commission Executive Meeting Thanksgiving – Government Center Closed » Facebook X RSS Designed and Managed by C2IT Consulting, Inc. Town Calendar Indiana Gateway Employee Portal Town Calendar Indiana Gateway Employee Portal Town Calendar Indiana Gateway Employee Portal About Mooresville About Mooresville Town History Visiting Mooresville Community Community Links Community News Online Services Online Documents Center Ordinances and Resolutions Minutes Town Meeting Recordings Sewer Bill Payment Code of Ordinances Departments Parks and Rec Fire Department Police Department Public Works Building Department Clerk/Treasurer Departments – Other I want to… Report a Pothole or Streets Problem Find Zoning Info Pay or View Sewer Bill View all FAQs Apply For… Building Permit Sewer Permit Solicitor’s Permit Street Cut Permit Elected Officials Main in Motion Select Page About Mooresville About Mooresville Town History Visiting Mooresville Community Community Links Community News Online Services Online Documents Center Ordinances and Resolutions Minutes Town Meeting Recordings Sewer Bill Payment Code of Ordinances Departments Parks and Rec Fire Department Police Department Public Works Building Department Clerk/Treasurer Departments – Other I want to… Report a Pothole or Streets Problem Find Zoning Info Pay or View Sewer Bill View all FAQs Apply For… Building Permit Sewer Permit Solicitor’s Permit Street Cut Permit Elected Officials Main in Motion Town Calendar Indiana Gateway Employee Portal " -124,https://delcopa.gov/planning/pdf/demodata/minoritypopulation2020map.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -125,http://lafayettepolice.us/208/police-officer-lateral-entry-program,Training & Hiring Info,Info About Officers,"Police Officer Lateral Entry Program | Lafayette, IN - Official Website",The Lafayette Police Department has long recognized the value of those applicants who have law enforcement experience and provides starting salary/pay incentives commensurate with an applicant's experience.,200,"Police Department | Lafayette, IN - Official Website","[""Police Officer Lateral Entry Program""]","[""We Are Actively Looking For Lateral Police Officers To Join Us."", ""Transferring Officers""]","[""Requirements"", ""About the Program"", ""Salary"", ""Paid Time Off"", ""Contact Us"", ""Lieutenant Randy Sherer"", ""Administrative Services Division"", """", """", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Your LPD Career Opportunities Community Outreach Training Center How Do I… Police Officer Lateral Entry Program We Are Actively Looking For Lateral Police Officers To Join Us. Qualified Lateral Applicants Will Enjoy the Following Benefits: Accelerate FTO Program Skip the Basic Law Enforcement Academy Excellent Salary and Benefits Career Advancement Opportunities Retirement Benefits Medical, Dental and Vision Plans Franciscan HEALTHeACCESS Company Clinic Off-Duty Employment Opportunities Tuition Reimbursement Program Years of Service from Previous Agency is Counted Towards Vacation and Wages Transferring Officers The Lafayette Police Department recognizes the value of applicants with previous law enforcement experience.  To benefit transferring officers, LPD provides incentives to the starting salary and paid time off. Requirements To be considered for employment with the department, applicants must meet all the established pre-employment minimum requirements, as well as successfully complete all testing, screening, and background screening components. To be eligible or qualify for consideration in the ""Lateral Entry Program"", the applicant must possess an Indiana Law Enforcement Academy Certification or be a successful applicant to the I.L.E.A. Waiver Requirement process. Lateral entry officers cannot apply for the waiver until employed by the department. The effective pay rate will commence upon the completion of the Field Training Program. Certified law enforcement experience is defined as: employment with a local, county, state or federal agency that has primary responsibility for law enforcement and arrest powers.  For purposes of the Lateral Entry Program, military experience does not qualify. About the Program The Lateral Entry Program will provide accelerated salary/pay and Paid Time Off (PTO) incentives for qualified candidates.  Calculation for years of service will not include partial/seasonal years of service, or non-certified law enforcement.  The Lateral Entry Program does not recognize rank or seniority ""rights"" from the officer's prior employment. Salary All approved laterals will jump to first class pay upon the completion of FTO. Paid Time Off Qualified candidates shall be annually granted PTO based upon their total years of certified law enforcement employment. Contact Us Lieutenant Randy Sherer Email Administrative Services Division 601 Columbia St. Lafayette, IN 47901 Phone: 765-807-1222 Fax: 765-807-1201 Emergency: 911 Police App LPD Combine Day Salary & Benefits Moral Character Issues Police Officer Lateral Entry Program College Internship Program Career Opportunities Report a Crime Thank an Officer Stay Connected Alarm Reduction Contact Us 601 Columbia Street Lafayette, IN  47901 Phone: 765-807-1200 FAQs What is the number to the jail? Can you tell me if someone is wanted on warrant? How do I obtain a handgun permit? How can I request a street closure for a special event? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -126,https://www.pleasantprairiewi.gov/news/2016_news/shop_with_a_cop__firefighter,Misc Police Activity,Police & Public Interactions,Shop with a Cop/Firefighter - Village of Pleasant Prairie,"",200,Just a moment...,[],"[""Shop with a Cop/Firefighter""]","[""Follow Us on Social Media""]",[],[],[],"" -127,https://delcopa.gov/health/news/dchdtorelocatecovid19vaccinationclinics.html,Not Criminal Justice Related,Not Criminal Justice Related,"Environmental Health - Health Department - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Division of Environmental Health""]",[],"["""", ""Health Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Division of Environmental Health Home / Departments / Health Department / Environmental Health Released: May 3, 2022 The Delaware County Health Department will relocate its free COVID-19 vaccine clinics from the Watkins Avenue Senior Center in Upper Darby, and the Keystone First Wellness and Opportunity Center in Chester to the Department’s new clinic locations: the Delaware County Wellness Center in Yeadon, PA., and the DCHD- Chester Clinic in Chester, PA. In partnership with Delaware County Council and the COVID-19 Task Force, the Keystone First Wellness and Opportunity Center in Chester began offering COVID-19 vaccinations on February 25, 2021. Since its opening, more than 14,000 vaccinations and boosters have been administrated at the Keystone First Wellness Center. The Watkins Avenue Senior Center in Upper Darby began offering COVID-19 vaccinations on February 15, 2021, and has provided more than 300 vaccinations and boosters to residents. “We are incredibly grateful to the community members and our partners at the Watkins Avenue Senior Center and Keystone First,” said Delaware County Health Department Deputy Director Lora Werner. “We are thankful to them for making these clinics a success and for contributing to the health and safety of our communities!” Beginning on Thursday, May 5residents can receive a COVID-19 vaccination or booster at the newly renovated Delaware County Wellness Center located at125 Chester Avenue, Yeadon PA.,19050. Vaccinations will be available every other Thursday at the Wellness Center. Beginning on Monday, May 9 residents can visit DCHD-Chester at 151 W. 5th Street, Chester PA., 19013 to receive a COVID- 19 vaccination or booster. Vaccinations and boosters will be available at DCHD-Chester every other Monday. Walk-ins are welcome at each location and appointments can be scheduled via: WEB: www.delcopa.gov/vax PHONE: (484) 276-2100 EMAIL: DelcoWellness@co.delaware.pa.us Residents are encouraged to learn more about the Delaware County Health Department by visiting: www.DelcoPa.gov/health For more information and assistance, the Delaware County Health Department Wellness Line is available 24 hours a day, 7 days a week. In addition to responding to phone calls, the Wellness Line also responds to email inquiries. Phone: (484) 276-2100 (Available 24/7) Email: DelcoWellness@co.delaware.pa.us Health Department Navigation Home About/Locations A to Z Board of Health COVID News Wellness Clinics Rules and Regulations Environmental Health Division 1510 Chester Pike Suite 700 Eddystone PA 19022 Phone: 484-276-2100 Email: DelcoWellness@co.delaware.pa.us Hours: 8:30 AM to 4:30 PM Monday to Friday Except County Holidays Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll " -128,https://spdblotter.seattle.gov/2018/06/01/seattle-police-officer-charged-with-assault/,Poor Data Source,Poor Data Source,UPDATED: Seattle Police Officer Charged With Assault - SPD Blotter,"",200,403 Forbidden,"[""UPDATED: Seattle Police Officer Charged With Assault""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -129,https://delcopa.gov/meo/careers/forensicinvestigator.html,Not Criminal Justice Related,Not Criminal Justice Related,"Forensic Investigator - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Forensic Investigator""]",[],"[""Qualifications"", ""Preferred Qualifications"", ""Responsibilities include but are not limited to"", ""Certifications"", ""Medical Examiner Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -130,http://www.longbeach.gov/police/press-releases/motorcycle-safety-operation-proves-effective/,Media Bulletins,Agency-Published Resources,MOTORCYCLE SAFETY OPERATION PROVES EFFECTIVE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 8/18/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: MOTORCYCLE SAFETY OPERATION PROVES EFFECTIVE Contact: Media Relations Detail (562) 570-5273 On Saturday, August 16, and Sunday, August 17, 2014, the Long Beach Police Department’s Traffic Section conducted a Motorcycle Safety Operation. During the five-hour operation each day, motor officers patrolled throughout the city looking for unsafe driving by motorcyclists as well as drivers who were operating vehicles unsafely around motorcycle riders. Officers took the following enforcement actions: Cited thirty-four (34) motorcyclists for unsafe driving Cited fourteen (14) drivers for unsafe driving Cited fifteen (15) motorcyclists for non-DOT approved motorcycle helmets Cited four (4) motorcyclists for not having a motorcycle endorsement on their license Cited six (6) motorcyclists for suspended licenses Cited three (3) drivers for not having a driver’s license Motorcycle fatalities in California saw a phenomenal drop of 37% from 2008 to 2010, but then rose 23% by 2012. Operations like this are aimed at curbing rises in motorcycle deaths and sending the numbers back downward. In Long Beach, there were 295 motorcyclists injured and 19 motorcycle fatalities during a three-year period from January 2011 to December 2013. California collision data reveals that primary causes of motorcycle-involved crashes include speeding, unsafe turning, and impairment due to alcohol and other drugs. The Long Beach Police Department reminds all motorists to always be alert and watch for motorcycles, especially when turning and changing lanes. Drivers should be aware that motorcycle lane splitting is not illegal if done in a safe and prudent manner. Motorcycle riders should consult the Lane Splitting General Guidelines to learn more – www.ots.ca.gov/lanesplittinggeneralguidelines.pdf . Riders may seek training through the California Motorcyclist Safety Program. Information and training locations are available online or 1-877 RIDE 411 or 1-877-743-3411. Funding for this program is provided by a grant from the California Office of Traffic Safety through the National Highway Traffic Safety Administration. The message to all drivers and motorcyclists is: share in the responsibility and do your part by safely “sharing the road.” This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -131,https://council.seattle.gov/2011/12/16/justice-department-findings-on-seattle-police/,Poor Data Source,Poor Data Source,Justice Department Findings on Seattle Police - Seattle City Council Blog,"",200,403 Forbidden,"[""Justice Department Findings on Seattle Police""]",[],"[""HELPFUL LINKS"", ""Make your voice heard"", ""Councilmembers""]",[],[],[],"" -132,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/110221summary.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -133,https://www.mass.gov/doc/jlm-17-5884-city-of-quincy-and-quincy-police-patrol-officers-association-february-8-2019/download,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -134,https://www.mass.gov/doc/2022-tewksbury-police-lieutenant-sole-assessment-employment-verification-form/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -135,https://www.newcastlewa.gov/departments/police/safe_place_program,Resources,Agency-Published Resources,Safe Place Program - City of Newcastle,"",200,Just a moment...,[],"[""City of Newcastle""]",[],"[""City of Newcastle Washington""]",[],[],"" -136,https://www.roseville.ca.us/government/departments/police_department/crime_log/crime_log_feb_15_-_feb_28__2020,Crime Maps & Reports,Agency-Published Resources,"","",404,"","","","","","","","" -137,https://springfield-or.gov/event/springfield-police-advisory-committee-spac-19/,Poor Data Source,Poor Data Source,Springfield Police Advisory Committee (SPAC) – City of Springfield Oregon,"",200,City of Springfield Oregon,[],"[""Springfield Police Advisory Committee (SPAC)""]","[""December 1, 2022 @ 6:00 pm - 7:30 pm"", ""Event Navigation""]","[""Share This Story, Choose Your Platform!"", ""Details"", ""Venue"", ""Organizer""]",[],[],"" -138,https://delcopa.gov/departments/history.html,Not Criminal Justice Related,Not Criminal Justice Related,"History - At a Glance - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Your County at a Glance: History""]",[],"[""The History of Delaware County"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -139,https://www.stcharlesil.gov/events/public-meetings/2018-01-08-230000/regular-meeting-board-fire-and-police-commissioners,Poor Data Source,Poor Data Source,"Regular Meeting of the Board of Fire and Police Commissioners 1/8/2018 | Events | City of St Charles, IL",Regular Meeting of the Board of Fire and Police Commissioners on 1/8/2018,200,"City of St. Charles, Illinois","[""City of St. Charles, Illinois"", ""Regular Meeting of the Board of Fire and Police Commissioners""]","[""You are here"", ""2nd Floor Fire Department Training Conference Room"", ""Committee/Commission"", ""View more events"", ""Documents on this site"", ""Accessibility"", ""Key Resources"", ""Connect With Us""]",[],[],[],[],"" -140,https://www.mass.gov/doc/christine-kennedy-v-city-of-chicopee-school-dept/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -141,https://delcopa.gov/publicrelations/releases/2019/passportmonth.html,Not Criminal Justice Related,Not Criminal Justice Related,"September is National Passport Month - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""September is National Passport Month""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play September is National Passport Month Home / Departments / Public Relations Releases / September is National Passport Month Delco’s Passport Office extends its hours on Sept. 21 September is National Passport Month, created by the State Department to educate and inform travelers. Residents planning to travel in 2020 are urged to learn more about the passport process in order to save time and money and avoid unnecessary stress. In recognition of Passport Month, many Passport Offices which are not normally open on Saturdays will open on Sept. 21 to make the process of applying for a passport easier and more convenient. Delaware County’s Passport Division, which has normal Saturday hours from 9:00 a.m. to noon will have extended hours of 9:00 a.m. to 2:00 p.m. on Sept. 21. The extended hours on Sept. 21 offer some residents a more convenient time to apply for a passport. It also allows parents to more easily bring their school-age children since both parents must be present when applying for a passport for a child. National Passport Month is also a reminder for residents to not wait until the last minute to apply for a passport. Some people wait until the last minute to apply, which can cause stress and unnecessary fees to expedite the paperwork. Additionally, many countries require your passport to be valid for at least six months before a trip. Information including applying for a passport, fees and office hours can be found here: www.delcopa.gov/ojs/passports.html Delaware County’s Passport Division is located in the Office of Judicial Support, Room 126 of the Government Center, 201 West Front Street, Media, PA 19063. Normal hours are Monday through Friday from 8:30 a.m. to 4:00 p.m. and Saturdays from 9:00 a.m. to noon with the exceptions of holiday weekends. Appointments are not needed. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu " -142,https://detroitmi.gov/departments/police-department/detroit-police-department-office-civil-rights/definitions-consent-decree,Policies & Contracts,Info About Agencies,Definitions of Consent Decree | City of Detroit,"On July 18, 2003 the Detroit Police Department, the City of Detroit and the United States Department of Justice entered into two consent decrees. The first consent decree deals with the Use of Force, Arrest and Witness Detention. The second decree concerns the Conditions of Confinement in our holding facilities.        1.  As used in this Agreement: a. The term “actively resisting” means the subject is making physically evasive movements to defeat an officer's attempt at control, including bracing, tensing, pulling away, or pushing.  b. The term “arrest” means a seizure of greater scope or duration than an investigatory or Terry stop. An arrest is lawful when supported by probable cause. c. The term “auditable form” or “auditable log” means a discrete record of the relevant information maintained separate and independent of blotters and other forms maintained by the DPD. d. The term “canine apprehension” means any time a canine is deployed and plays a clear and well-documented role in the capture of a person. The mere presence of a canine at the scene of an arrest shall not be counted as an apprehension. e. The term “canine bite ratio” means the number of apprehensions accomplished by means of a dog bite divided by the total number of apprehensions (both with and without a bite). f. The term “canine deployment” means any situation, except in cases involving an on-leash article search only, in which a canine is brought to the scene and either: i) the canine is released from the police car in furtherance of the police action; or ii) the suspect gives up immediately after an announcement is made that if he/she does not surrender the canine will be released. g. The term “City” means the City of Detroit, including its agents, officers and employees. h. The term “Collective Bargaining Agreements” means the labor agreements by and between the City and the Detroit Police Officers Association, the Detroit Police Lieutenants and Sergeants Association, the Detroit Police Command Officers Association, the Police Officer Labor Council, and Local 2394 of the American Federation of State, County, and Municipal Employees in effect on the effective date of this Agreement. i. The term “command investigation” means an investigation conducted by a DPD officer’s or employee’s supervisor. j. The term “complaint” means an allegation from any source of any misconduct by DPD personnel. k. The term “conveyance” means any instance when the DPD transports a non-DPD employee for any purpose. l. The term “critical firearm discharge” means each discharge of a firearm by a DPD officer with the exception of range and training discharges and discharges at animals. m. The term “DOJ” means the United States Department of Justice and its agents and employees. n. The term “DPD” means the Detroit Police Department, its agents and its employees (both sworn and unsworn). o. The term “DPD unit” means any officially designated organization of officers within the DPD, including precincts and specialized units. p. The term “discipline” means a written reprimand, suspension, demotion or dismissal. q. The term “effective date” means the day this Agreement is entered by the Court. r. The term “escorting” means the use of light physical pressure to guide a person, or keep a person in place. s. The term “FTO” means a field training officer. t. The term “force” means the following actions by an officer: any physical strike or instrumental contact with a person; any intentional attempted physical strike or instrumental contact that does not take effect; or any significant physical contact that restricts the movement of a person. The term includes the discharge of firearms; the use of chemical spray, choke holds or hard hands; the taking of a subject to the ground; or the deployment of a canine. The term does not include escorting or handcuffing a person, with no or minimal resistance. Use of force is lawful if it is objectively reasonable under the circumstances and the minimum amount of force necessary to effect an arrest or protect the officer or other person. u. The term “hard hands” means using physical pressure to force a person against an object or the ground, or the use of physical strength or skill that causes pain or leaves a mark. v. The term “hold” means any outstanding charge(s) or warrant(s) other than those which serve as the predicate for the current arrest. w. The term “IAD” means the section of the DPD that investigates serious uses of force and allegations of criminal misconduct by DPD employees. x. The term “including” means “including, but not limited to.” y. The term “injury” means any impairment of physical condition or pain. z. The term “investigatory stop,” or “Terry stop,” means a limited seizure. An investigatory stop is lawful when supported by reasonable suspicion and narrowly tailored in scope and duration to the reasons supporting the seizure. aa. The term “material witness” means a witness subpoenaed to testify in a criminal case. bb. The term “misconduct” means any conduct by a DPD employee that violates DPD policy or the law. cc. The term “non-disciplinary corrective action” means counseling, training or other action apart from discipline taken by a DPD supervisor to enable or encourage an officer to modify or improve his or her performance. dd. The term “OCI” means the Office of the Chief Investigator, which has responsibility for investigating external complaints. ee. The term “parties” means the DOJ, the City and the DPD. ff. The term “police officer” or “officer” means any law enforcement officer employed by the DPD, including supervisors. gg. The term “prisoner injury” means an injury, or complaint of injury, that occurs in the course of taking or after an individual was taken into DPD custody that is not attributed to a use of force by a DPD employee. hh. The term “probable cause” means a reasonable belief that an individual has committed, is committing, or is about to commit an offense. ii. The term “prompt judicial review” means the presentment of an arrestee before a court of appropriate jurisdiction for a probable cause determination as soon after an arrest as is reasonably feasible. A reasonably feasible time period is the period of time necessary to schedule the arraignment and complete the administrative processing of the arrestee and shall not exceed 48 hours of the arrest, absent extraordinary circumstances. jj. The term “proper use of force decision making” means the use of reasonable force, including proper tactics, and de-escalation techniques. kk. The term “reasonable suspicion” means the specific facts and reasonable inferences drawn from those facts to convince an ordinarily prudent person that criminality is at hand. ll. The term “seizure,” or “detention,” means any restriction on the liberty interest of an individual. A seizure occurs when an officer's words or actions convey to a reasonable person that he or she is not free to leave. mm. The term “serious bodily injury” means an injury that involves a loss of consciousness, extreme physical pain, protracted and obvious disfigurement, protracted loss or impairment of the function of a body part or organ, or a substantial risk of death. nn. The term “serious use of force” means any action by a DPD officer that involves: i) the use of deadly force, including all critical firearms discharges; ii) a use of force in which the person suffers serious bodily injury or requires hospital admission; iii) a canine bite; and iv) the use of chemical spray against a restrained person. oo. The term “shall” means that the provision imposes a mandatory duty. pp. The term “supervisor” means a sworn DPD employee at the rank of sergeant or above and non-sworn employees with oversight responsibility for DPD employees.",200,City of Detroit | Opportunity Rising,"[""Definitions of Consent Decree""]","[""Top Links"", ""Site Menu""]","[""""]",[],[],[],"" -143,https://delcopa.gov/publicrelations/releases/2020/delcoraterminated2.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Council Terminates DELCORA - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Council Terminates DELCORA""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""In a 4-0 vote, County Council terminated DELCORA and returned control to County taxpayers""]",[],[],"" -144,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0376-3/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -145,http://www.lafayettepolice.us/152/animal-control,Contact Info & Agency Meta,Info About Agencies,"Animal Control | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Animal Control""]","[""Officer Hours"", ""Reporting Issues & Concerns""]","[""Contact Us"", ""Animal Control Office"", ""Hours"", ""Quick Links"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -146,http://www.longbeach.gov/police/press-releases/murder-2300-blk-spaulding/,Poor Data Source,Poor Data Source,MURDER 2300 BLK SPAULDING,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/6/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER 2300 BLK OF SPAULDING Contact: Media Relations Detail (562) 570-5273 UPDATE (11/15/2016): On November 11, 2016, police arrested 36-year-old Jorge Omar Chavez of Long Beach in connection with this investigation. Related news release Original News Release (11/6/2016): On 11/05/16 at approximately 9:55 p.m., officers were dispatched to the 2300 block of Spaulding regarding a hit shooting victim. Upon arrival officers found a male adult suffering from a gunshot wound to the upper torso. Victim was transported to a local hospital by LB Fire where he was pronounced deceased. Homicide detectives responded to handle the investigation. Incident is being investigated as possibly gang related Anyone with information is urged to contact Homicide Detectives Mark Mattia and Shea Robertson at (562) 570-7244. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -147,https://police.greenvillesc.gov/faq.aspx?qid=443,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • One of the “nodes” is close to where I live. How soon,"",200,"Police Department | Greenville, SC - Official Website",[],"[""▼ GVL2040 Comprehensive Plan - Report to the Community FAQs""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -148,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/112821blotter.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -149,http://www.lafayettepolice.us/2338/housing,Not Criminal Justice Related,Not Criminal Justice Related,"Housing | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Housing""]","[""Realtor John Townsend - Trueblood Real Estate"", ""FirstOption Mortgage"", ""Bradford Place Apartments"", ""James Management Group""]","[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency CustomLinks_14 Housing Housing Realtor John Townsend - Trueblood Real Estate Details 1.5% off your home listing EXCLUSIVE access to John's Air BnB's (2 homes) @ 30% off PLUS no cleaning fees FREE Comparative Market Analysis of your home. Scheduled quarterly real estate Q&A sessions (mortgages, buying, selling, etc.) Phone: (765) 250-0050 Email: j.townsend@truebloodre.com Website: https://www.truebloodre.com/john-townsend FirstOption Mortgage Details Free home appraisals for Military, Police, Fire, Health Care, and Teachers Flier: Homes for Heroes Contact: Steve Stemick Phone: 765-637-9771 Email: sstemick@myfirstoption.com Bradford Place Apartments Details Contact to learn about current discounts Phone: 844-848-1366 Website: https://www.bradfordplace-apts.com/ James Management Group Details Contact to learn about current discounts Properties: Georgetown South, Shoshone Apartments, Vantage Pointe Phone: 765-337-5246 Website: https://www.jamesmgt.com/ City Perks! Amusement Parks Automotive / Car Rental Banking Batteries Cellular Phone and TV Service Clothing/Shoe Stores Computers Confections Entertainment Events Fitness Florist Grocery Stores Hair Salon/Spa Services Health & Wellness Heating & Cooling Services Home Services, Parts & Paints Housing Pet Services/Supplies Restaurants Sports Travel TicketsatWork Other Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -150,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/051521blotter.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -151,https://www.mass.gov/doc/jlm-13-2733-city-of-beverly-and-beverly-police-superiors-association-july-29-2015/download,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -152,https://townofnederland.colorado.gov/police,Contact Info & Agency Meta,Info About Agencies,Law Enforcement | Town of Nederland,"",200,Home | Town of Nederland,"[""Law Enforcement""]","[""Police Services""]","[""Pay a Fine or Ticket"", ""Police Records Request"", ""Kudos and Concerns"", ""Colorado Sex Offender Registry"", ""Notice: Fingerprinting Services Discontinued""]",[],[],"[""Contact Info"", ""Want to leave some feedback for an officer? Fill out the form below with as much information as you would like, and we will send it to the Boulder County Sheriff Office for review. You can leave contact information, or leave it black if you wish to remain anonymous.""]","" -153,http://www.lafayettepolice.us/296/compliments-concerns,Poor Data Source,Poor Data Source,"Compliments & Concerns | Lafayette, IN - Official Website",We encourage citizens to send in their commendations and complaints so that we can continue growing with our community.,200,"Police Department | Lafayette, IN - Official Website","[""Compliments & Concerns""]","[""Commendations""]","[""Ways to Send a Compliment"", ""Reasons For Commendation"", ""Received Commendations"", ""Contact Us"", ""Captain Brian Gossard"", """", ""Police Department"", """", ""FAQs"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Your LPD Career Opportunities Community Outreach Training Center How Do I… Compliments & Concerns Commendations Everyone enjoys receiving recognition for their efforts and there is no question that most of the 140 employees of the Lafayette Police Department are doing an outstanding job in our fast growing city. We realize that many of our residents would like to know how to compliment our employees for a job well done. Ways to Send a Compliment Compliments and Commendations, either verbal or written, are 1 of the best ways to let our employees know that you appreciate their good work and extraordinary customer service. A commendation for an employee of the Lafayette Police Department is most often sent to the Chief of Police. You may also advise the employee's supervisor or Commanding Officer. Your compliments may be made: By email By phone Fax In person Informal note Letter Reasons For Commendation A compliment or commendation may address any event that you feel demonstrates any effort on the part of the employee that deserves special recognition. This may include such acts as: Significant life saving measures Unusual courtesy or compassion Other extraordinary acts Received Commendations All compliments and commendations are formally documented and the effected employees and their supervisors will be notified. Contact Us Captain Brian Gossard Email Police Department 601 Columbia Street Lafayette, IN 47901 Phone: 765-807-1200 Fax: 765-807-1281 Emergency: 911 FAQs What is a complaint? Who can make a complaint? How can a complaint be made? View All FAQs /FAQ.aspx Stay Connected LPD Podcast Citizens Police Academy D.A.R.E. Program Crime Prevention Camera Registration Crime Prevention Bulletin Online Crime Reporting Alarm Reduction Links Civil Service Commission Forms & Applications Graffiti Eradication Ride-Along Compliments & Concerns FAQs Public Safety Center and Parking Garage Public Safety Center and Parking Garage FAQ LPD Newsletter Sign-Up Career Opportunities Report a Crime Thank an Officer Stay Connected Alarm Reduction Contact Us 601 Columbia Street Lafayette, IN  47901 Phone: 765-807-1200 FAQs What is the number to the jail? Can you tell me if someone is wanted on warrant? How do I obtain a handgun permit? How can I request a street closure for a special event? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -154,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-results-1-/,Media Bulletins,Agency-Published Resources,DUI SATURATION PATROL RESULTS(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/5/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: DUI SATURATION PATROL NETS TWO ARRESTS Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department Traffic Unit conducted a DUI Saturation Patrol on Saturday, December 3, 2016, between the hours of 6:00 p.m. and 2:00 a.m. High visibility enforcement efforts like this have a deterrent effect, lowering the incidents of impaired driving. The operation resulted in: 32 vehicle enforcement stops 2 DUI-alcohol suspects arrested 1 driver cited/arrested for operating a vehicle unlicensed or while suspended/revoked 22 citations issued for unsafe driving Studies of California drivers have shown that 30 percent of drivers in fatal crashes had one or more drugs in their systems. A study of active drivers showed more tested positive for drugs that may impair driving (14 percent) than did for alcohol (7.3 percent). Of the drugs, marijuana was most prevalent, at 7.4 percent, slightly more than alcohol. Drivers caught driving impaired can expect the impact of a DUI arrest to include jail time, fines, fees, DUI classes, license suspension and other expenses that can exceed $10,000, not to mention the embarrassment when friends and family find out. Drivers are encouraged to download the Designated Driver VIP, or “DDVIP,” free mobile app for Android or iPhone. The DDVIP app helps find nearby bars and restaurants that feature free incentives for the designated sober driver, from free non-alcoholic drinks to free appetizers and more. The feature-packed app even has social media tie-ins and even a tab for the non-DD to call Uber, Lyft or Curb. Long Beach Police Department will conduct a DUI/Drivers License Checkpoint on Friday, December 16, 2016, as part of our ongoing commitment to lowering deaths and injuries upon our streets and highways. The DUI Saturation Patrol was funded by a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration, reminding everyone to ‘Report Drunk Drivers: Call 9-1-1.’ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -155,https://chandlerazpd.gov/police-facilities/desert-breeze-substation/,Contact Info & Agency Meta,Info About Agencies,Desert Breeze Substation – Chandler Police Department,"",200,Chandler Police Department,"[""Desert Breeze Substation""]",[],"[""Precinct Leadership"", ""Precinct Headquarters"", ""Quick Links"", ""Police Facilities"", """", """", """", """"]","[""Zac Cummard - Commander"", ""Contact"", ""About the Department"", ""Latest News"", ""Courage, Pride, Dedication © 2024 Chandler Police Department""]",[],[],"The Chandler Police Department main lobby will be closed for renovations. Please see below for further. The Chandler Police Department main lobby will be closed for renovations. Please see below for further. Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Home Police Facilities Desert Breeze Substation Home Police Facilities Desert Breeze Substation Search for: Desert Breeze Substation The Desert Breeze substation serves west Chandler. The precinct includes police beats 1-6. Precinct Leadership Zac Cummard - Commander 480.782.4153 Precinct Headquarters 251 N Desert Breeze Blvd W Chandler, Arizona 85226 Google Maps (480) 782-4800 Public Hours M-Th 8am to 5pm. Closed Holidays. The Chandler Police Department’s Desert Breeze Precinct is supervised by Commander Zac Cummard . The precinct is organized into two districts:  District One and District Two.  District One is composed of beats one through three and District Two is composed of beats four through six. The Desert Breeze station houses all of the patrol officers, and their supervisors, who work in Districts One and Two.  These officers are responsible for an area that is approximately 21 square miles with a population of 87,000 residents.  The Department’s Traffic Unit also works out of this facility, along with the Impound Hearing Office .  In addition, one Crime Prevention Officer is assigned to the precinct. This Precinct is a mix of master-planned residential communities, multi-housing complexes, retail centers, and business establishments.  Notable retail centers include the Chandler Pavilions, Chandler Gateway, Chandler Fashion Center, and Chandler Festival.  Large multi-national corporations such as: Intel’s main campus, Freescale Semiconductor, Paypal, Iridium, and Americredit conduct their business in this area of Chandler with a number of small to mid-size companies.  Chandler Regional Medical Center is also located in this Precinct along with Valley Christian and Seton High Schools, and the Arizona College Preparatory Academy’s Erie Campus. Search for: Quick Links About the Department Office of the Chief Interim Chief Of Police Melissa Deanda Assistant Chief Of Police Dave Ramer Department Events My Precinct Fingerprinting Services Request a Police Report Bicycle Registration General Orders/Accreditation Alarm Information Registered Sex Offenders Citizen Observer (Ride-Along) Vehicle Impounds Barking Dog Police Open Data Public Demonstration Guidelines Police Facilities Chandler Heights Substation Property and Evidence Desert Breeze Substation Downtown Station " -156,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2019_news_releases/police_arrest_three_zion_men_in_kidnapping_event,Media Bulletins,Agency-Published Resources,Police Arrest Three Zion Men in Kidnapping Event - Village of Pleasant Prairie,"",200,Just a moment...,[],"[""Police Arrest Three Zion Men in Kidnapping Event""]","[""Follow Us on Social Media""]",[],[],[],"" -157,http://www.longbeach.gov/police/press-releases/murder---6400-block-of-coronado-avenue/,Media Bulletins,Agency-Published Resources,MURDER - 6400 block of Coronado Avenue,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/9/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER - 6400 BLOCK OF CORONADO AVENUE Contact: Media Relations Detail (562) 570-5273 On June 9, 2016, at approximately 04:00 a.m., Officers responded to a shots call in the 6400 block of Coronado Avenue. Upon their arrival they found two adult male victims suffering from gunshot wounds to the upper torso. One victim was transported to a local hospital and is in stable condition with a non-life threatening injury. The other victim was determined deceased at the scene by Long Beach Fire. The deceased victim has been identified as Wylee Pritchett a 20 year-old resident of Lakewood. The motive of the shooting is still under investigation, and is not believed to be gang related. Anyone with information regarding the incident is urged to call Homicide Detectives at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -158,https://www.townofhamburgny.gov/citizens-police-academy/,Training & Hiring Info,Info About Officers,"","",404,"","","","","","","","" -159,https://delcopa.gov/vote/pdf/2022/p2022-write-in-cumulation-request.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -160,https://www.roseville.ca.us/government/departments/police_department/crime_log/crime_log_oct_03_-_oct_16__2020,Crime Maps & Reports,Agency-Published Resources,"","",404,"","","","","","","","" -161,https://www.clarkstown.gov/police/child-safety-seats/,Media Bulletins,Agency-Published Resources,Child Safety Seats – Town of Clarkstown,"",200," - Town of Clarkstown – New City, NY ","[""Child Safety Seats""]","[""Town of Clarkstown"", ""Town of Clarkstown"", ""Child Safety Seats"", ""Schedule A Car Seat Appointment"", ""NYS Child Restaint Law FAQ"", ""Thanks for signing up!"", ""Clarkstown eNews"", ""Government"", ""How Do I?"", ""Quick Links""]","[""Town of Clarkstown"", ""Town of Clarkstown"", ""Town of Clarkstown"", ""Sign up for our Newsletter"", ""© 2021 Town of Clarkstown""]",[],"[""The next child seat event will be on Sunday February 19th from 9am till 12pm at the Bardonia Fire House.""]","[""Departments"", ""Sign Up"", ""Find"", ""Apply"", ""Report"", ""Pay For""]","+1 (845) 639-2000 10 Maple Ave., New City, NY Search Search Close this search box. Search Search Close this search box. Town of Clarkstown Town Hall Town Supervisor Town Leadership & Administration Town Council Meeting & Council Member Information Town Clerk Public Inquires & Compliance Highway Department Road Maintenance, Yard Waste & Leaf Pickup Town Calendar What’s Happening in Clarkstown Agenda & Minutes Town Board Agenda & Minutes Boards & Commissions Boards & Commissions Members, Agendas, Minutes News Recent Press Releases & Town News Archive Town Code Local Laws, Ordinances & Resolutions Town History Read About The Town’s History Departments Assessor Attorney Building Engineering and Facilities Management Justice Court Mini Trans Personnel Planning Police Purchasing Parks & Recreation How Do I? Sign Up Community Pass eAlerts Ready Clarkstown Find Agenda & Minutes Official Town Map Permits, Applications, Flyers Town Code Town History Town Zoning Map Apply Building Permits Certificates of Occupancy Conservation License Disabled Parking Permits Employment Foil Request Dog License Fire Permits Marriage License Nanuet Train Station Tax Exemption Report Crime Code Violation Flooding Garbage & Recycling Street Lights & Potholes Pay For View or Pay Taxes Recreation Programs Pay For Tickets Residents 311 Request Report, Submit, Track & View Service Requests Building Permits Electrical, Plumbing & Structural Permits Parks & Recreation Recreation Programs, Parks, Centers, Pools & More Animal Care & Control Domestic Animals & Wildlife Compliance Senior Citizens Senior Programs, Clubs & Calendar Town Code Local Laws, Ordinances & Resolutions Recycling Recycling Guidelines & Tips Town of Clarkstown 10 Maple Avenue New City, NY 10956 (845) 639-2000 Business Building Permits Electrical, Plumbing, or Structural Permits Tourism Map Clarkstown Tourism Map Town Code Local Laws, Ordinances & Resolutions Boards & Commissions Boards & Commissions Members, Agendas, Minutes Planning Board Projects Current Planning Board Projects Under Review New City Chamber of Commerce Nanuet Chamber of Commerce Town of Clarkstown 10 Maple Avenue New City, NY 10956 (845) 639-2000 Community Libraries Clarkstown Local Free Libraries Schools Clarkstown Local School Districts Utilities Water & Electric Local Support Organizations Experiencing Hardship or Need Help? Senior Citizens Senior Programs, Clubs & Calendar Volunteer Fire & Ambulance Local Volunteer First Responders Town of Clarkstown 10 Maple Avenue New City, NY 10956 (845) 639-2000 Grievance Day, May 24, 2022, For Procedures Click Here " -162,https://detroitmi.gov/departments/police-department/abandoned-vehicle,Policies & Contracts,Info About Agencies,Abandoned Vehicle | City of Detroit,"Abandoned vehicles create community problems. Street cleaning and snow removal become difficult tasks with abandoned vehicles in the way. Abandoned vehicles in yards are possible fire hazards. Abandoned vehicles project a negative image of our city. Together, we can give Detroit the necessary makeover to produce clean streets. If the vehicle is your own: move it, have it towed, or donate it. If the vehicle is not yours; REPORT it to your local police precinct. City Ord. - Sec. 55-6-85. When are vehicles deemed abandoned. The following conditions are required before any vehicle shall be deemed to be an abandoned vehicle: (1) The vehicle shall be abandoned when it has remained on a public street, highway, alley or public place for a period of forty-eight (48) continuous hours or more and from its condition and the surrounding circumstances, shall reasonably appear to be unclaimed, discarded, deserted or abandoned. (2) A vehicle is deemed abandoned on private property when it has remained on the private property for a period of forty-eight (48) continuous hours or more without the consent of the owner or lessee of the property, or for a period of forty-eight (48) continuous hours or more after the consent of the owner has been revoked. (Code 1964, § 38-15-2)",200,City of Detroit | Opportunity Rising,"[""Abandoned Vehicle""]","[""Top Links"", ""Site Menu"", ""News & Events"", ""Contacts""]",[],[],[],[],"" -163,http://www.lafayettepolice.us/1879/water-tips,Not Criminal Justice Related,Not Criminal Justice Related,"Water Tips | Lafayette, IN - Official Website",Tips on water consumption and water equipment.,200,"Police Department | Lafayette, IN - Official Website","[""Water Tips""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home Government Departments H - W Water Works Water Tips Water Tips Keep meter pits uncovered from grass, dirt, or any kind of debris in case we need to get in the pit. Know where your inside shut off valve is located and exercise it occasionally. If you notice discolored water, attempt to flush by running the cold water in the bathtub for up to 20 minutes before calling.  This will generally clear up any issue you may have. If you have a leak or broken pipe in your house turn off your inside shut off valve first to see if this stops the flow of water.  If this does not stop the flow call 765-807-1100 to request a Customer Service Tech be sent to shut off water in the meter pit. Lafayette Water Works is responsible for the service lines that run from the water main to the meter.  The service lines from the meter to the house are the customer's responsibility. If you notice a foul smell coming from your hot water, but not from the cold, it is most likely a problem with your water heater. If you just moved into your residence make sure your inside shut off valve is on before calling to set up service. Reports Meter Change-out Staff Upgrades Water's Path to You Water Tips Wellhead Protection Program Wellhead Protection Program Brochures Water Works Waivers Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -164,https://springfield-or.gov/copy-of-springfield-police-seeking-community-input-via-online-survey/,Poor Data Source,Poor Data Source,Springfield Police Seeking Community Input Via Online Survey – City of Springfield Oregon,"",200,City of Springfield Oregon,"[""Springfield Police Seeking Community Input Via Online Survey""]",[],[],[],[],[],"" -165,https://hollister.ca.gov/government/city-departments/police/social-networking/,Contact Info & Agency Meta,Info About Agencies,"Social Networking – City of Hollister, California","",200,"City of Hollister, California",[],[],"[""Follow Us on..."", ""Follow HPD…."", ""Hollister Police Social Media Guide"", ""We are Hiring"", ""Follow Us on....""]",[],[],[],"" -166,https://www.antioch.il.gov/wpfb-file/03-10-17-police-and-fire-agenda-pdf-3/,Poor Data Source,Poor Data Source,"03-10-17 Police And Fire Agenda - Antioch, IL",9106 03 10 17 police and fire agenda pdf commissions commission agendas 2017 1489012459 ab4ffd3c187e6425c1be0346d2cb25ab 219x300 _3ldvcho1f1gc thumb jpg 08 34 19 0 pdf application trustees mary c dominiak ed macek jerry t johnson scott a pierce jay jozwiak ted p poulos lawrence m hanson mayor lori k romine village clerk notice of public meeting,200,"Home - Antioch, IL","[""03-10-17 Police And Fire Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -167,https://www.mass.gov/doc/anderson-deborah-v-boston-police-department-71510/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -168,https://spdblotter.seattle.gov/2012/08/28/two-arrested-for-trying-to-pimp-undercover-cops-at-westlake/,Media Bulletins,Agency-Published Resources,Two Arrested For Trying to Pimp Undercover Cops At Westlake - SPD Blotter,"",200,403 Forbidden,"[""Two Arrested For Trying to Pimp Undercover Cops At Westlake""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -169,http://www.tampa.gov/police/recruit-scholarship-program,Resources,Agency-Published Resources,Police Recruit Scholarship Program | City of Tampa,"The Tampa Police Department seeks the best possible candidates to become police officers with our agency. The department seeks those who have an interest in law enforcement and have no prior law enforcement certification. In order to attract the best-qualified candidates, the department developed the Police Recruit Scholarship Program. Those selected for this program are enrolled in the local Police Academy.",200,City of Tampa,"[""Police Recruit Scholarship Program""]","[""Police Department"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[],"" -170,http://lafayettepolice.us/340/guard-rail-repair-replacement,Not Criminal Justice Related,Not Criminal Justice Related,"Guard Rail Repair & Replacement | Lafayette, IN - Official Website",The Lafayette Street Department maintains and repairs publicly owned guard rails within the City. ,200,"Police Department | Lafayette, IN - Official Website","[""Guard Rail Repair & Replacement""]",[],"[""Contact Us"", """", ""Dan Crowell"", ""Street Department"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home Government Departments H - W Street Department Report Problems Guard Rail Repair & Replacement Guard Rail Repair & Replacement The Lafayette Street Department maintains and repairs publicly owned guard rails within the City. Contact Us “Keeping roadways in tip-top shape, sprucing up right-of-way areas, removing snow and picking up leaves—it’s all in a day’s work for your city Street Department.” - Dan Crowell, Street Commissioner Dan Crowell Street Commissioner Email Street Department 260 S 3rd Street Lafayette, IN 47901 Phone: 765-807-1410 Asphalt & Concrete Repair Graffiti Removal Guard Rail Repair & Replacement Right of Way Mowing Snow Removal Street Light Outages Submit a Request Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home Government Departments H - W Street Department Report Problems Guard Rail Repair & Replacement Guard Rail Repair & Replacement The Lafayette Street Department maintains and repairs publicly owned guard rails within the City. Contact Us “Keeping roadways in tip-top shape, sprucing up right-of-way areas, removing snow and picking up leaves—it’s all in a day’s work for your city Street Department.” - Dan Crowell, Street Commissioner Dan Crowell Street Commissioner Email Street Department 260 S 3rd Street Lafayette, IN 47901 Phone: 765-807-1410 Asphalt & Concrete Repair Graffiti Removal Guard Rail Repair & Replacement Right of Way Mowing Snow Removal Street Light Outages Submit a Request Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -171,https://www.montgomeryohio.gov/topics/police-safety-programs/,Poor Data Source,Poor Data Source,"Police Safety Programs Toggle Archives - Montgomery, Ohio","",200,"Welcome - Montgomery, Ohio","[""FAQ Topic: Police Safety Programs Toggle""]","[""Primary menu links"", ""Action toolbar"", ""Speaker Requests"", ""Safety Village"", ""Safe Zone for Online Purchases"", ""Neighborhood Watch"", ""HomeSafe Checks"", ""Fingerprinting"", ""Community Emergency Response Team (CERT)1"", ""Background Record Check"", ""Welcome"", ""Engage"", ""Help"", ""Mental Health Resource""]",[],[],[],[],"Montgomery, Ohio Primary menu links Services Community Government Events News Contact Action toolbar Answers Report Issue Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Search Primary menu links Services Community Government Events News Contact Action toolbar Answers Report Issue Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Search Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Montgomery, Ohio Montgomery, Ohio Montgomery, Ohio " -172,https://chandlerazpd.gov/2013/07/prescription-medication-drop-boxes-now-accessible-in-all-chandler-police-stations/,Media Bulletins,Agency-Published Resources,Prescription Medication Drop-Boxes Now Accessible In All Chandler Police Stations – Chandler Police Department,"",200,Chandler Police Department,"[""Prescription Medication Drop-Boxes Now Accessible In All Chandler Police Stations""]",[],"[""Quick Links"", ""News Archives"", """", """", """", """"]","[""July 26, 2013"", ""Contact"", ""About the Department"", ""Latest News"", ""Courage, Pride, Dedication © 2024 Chandler Police Department""]",[],[],"The Chandler Police Department main lobby will be closed for renovations. Please see below for further. The Chandler Police Department main lobby will be closed for renovations. Please see below for further. Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Home Highlight Prescription Medication Drop-Boxes Now Accessible In All Chandler Police Stations Home Highlight Prescription Medication Drop-Boxes Now Accessible In All Chandler Police Stations Search for: Prescription Medication Drop-Boxes Now Accessible In All Chandler Police Stations July 26, 2013 By Sergeant J. Favazzo The Chandler Police Department has installed new MedReturn drop-boxes in the lobby of each station.  These boxes offer a way for residents to anonymously dispose of unwanted or expired prescription drugs. The items that will be accepted for safe disposal include prescriptions, prescription patches, prescription medications, prescription ointments, over-the-counter medications, vitamins, medication samples and medications for pets.  Items that cannot be accepted include sharp needles, thermometers, hydrogen peroxide, inhalers, aerosol cans, medication from businesses or clinics, and ointments, lotions or liquids. The MedReturn drop-boxes are located in the lobby area at each of the following Chandler Police Department buildings: Main Station 250 E. Chicago St. Open 24/7 Desert Breeze Substation 251 North Desert Breeze Blvd. Open Monday-Friday, 8:00 a.m. to 5:00 p.m. only Chandler Heights Substation 4040 E. Chandler Heights Rd. Open Monday-Friday, 8:00 a.m. to 5:00 p.m. only The purpose of the collection program is to provide a consistent system to remove unneeded medications from homes and to help curb the habit of disposing these products by flushing them into the City sewer system. For more information, please contact Sergeant Greg Howarth in the Police Crime Prevention Unit at 480-782-4928. Search for: Quick Links About the Department Office of the Chief Interim Chief Of Police Melissa Deanda Assistant Chief Of Police Dave Ramer Department Events My Precinct Fingerprinting Services Request a Police Report Bicycle Registration General Orders/Accreditation Alarm Information Registered Sex Offenders Citizen Observer (Ride-Along) Vehicle Impounds Barking Dog Police Open Data Public Demonstration Guidelines News Archives August 2022 September 2021 July 2021 September 2020 August 2020 June 2020 May 2020 April 2020 March 2020 February 2020 January 2020 December 2019 " -173,https://www.mass.gov/doc/2022-dalton-police-sergeant-sole-assessment-center-examination-employment-verification-form/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -174,https://southamptontownnypolice.gov/775/county-road-39-corridor,Not Criminal Justice Related,Not Criminal Justice Related,"County Road 39 Corridor Land Use Plan | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""County Road 39 Corridor Land Use Plan""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Master Plans - Town Wide (Adopted) County Road 39 Corridor County Road 39 Corridor Land Use Plan County Road 39 - Design Guidelines (PDF) County Road 39 Corridor - Plan (PDF) County Road 39 Corridor Quadrant Map (PDF) County Road 39 Recommendations Maps (PDF) County Road 39 Zoning Maps (PDF) 1970 Master Plan 1999 Comprehensive Plan Climate Action Plan Coastal Res. & Water Prot. Plan Comprehensive Plan Transportation County Road 39 Corridor Master Plans By Hamlets (Adopted) Sustainability Plan Wireless Communications Plan Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Master Plans - Town Wide (Adopted) County Road 39 Corridor County Road 39 Corridor Land Use Plan County Road 39 - Design Guidelines (PDF) County Road 39 Corridor - Plan (PDF) County Road 39 Corridor Quadrant Map (PDF) County Road 39 Recommendations Maps (PDF) County Road 39 Zoning Maps (PDF) 1970 Master Plan 1999 Comprehensive Plan Climate Action Plan Coastal Res. & Water Prot. Plan Comprehensive Plan Transportation County Road 39 Corridor Master Plans By Hamlets (Adopted) Sustainability Plan Wireless Communications Plan Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -175,https://www.stcharlesil.gov/news/2018/07/25/police-bike-patrol-unit-patrols-where-cars-can%e2%80%99t,Poor Data Source,Poor Data Source,"Police Bike Patrol Unit Patrols Where Cars Can’t | News | City of St Charles, IL",City news: Police Bike Patrol Unit Patrols Where Cars Can’t,200,"City of St. Charles, Illinois","[""City of St. Charles, Illinois"", ""Police Bike Patrol Unit Patrols Where Cars Can’t""]","[""You are here"", ""Key Resources"", ""Connect With Us""]",[],[],[],[],"" -176,https://www.mass.gov/doc/appendix-x-family-assistance-copayments-and-deductibles-0/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -177,https://www.elburn.il.us/event/board-of-police-commissioners-2022-09-22/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -178,https://www.coppelltx.gov/faq.aspx?qid=142,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Can I have a birthday party at Life Safety Park?,"",200,"Coppell, TX | Official Website",[],"[""▼ Life Safety Park"", ""About the Park"", ""Teachers"", ""Parents/Caregivers"", ""Helpful Resources"", ""Teachers"", ""Parents/Caregivers""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -179,https://www.montebelloca.gov/departments/police/divisions/patrol/district_policing,Contact Info & Agency Meta,Info About Agencies,"","",200,"","","","","","","","" -180,https://www.mass.gov/doc/randolph-covered-police-firefighterpdf/download,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -181,https://brookfieldil.gov/village-manager-selects-new-police-chief/petrak-press-release/,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -182,https://delcopa.gov/courts/judges/pileggi.html,Poor Data Source,Poor Data Source,Judge Dominic F. Pileggi - Delaware County Court of Common Pleas,"",200,"Delaware County, Pennsylvania","[""Judge Dominic F. Pileggi""]",[],"[""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[],"Menu A to Z Court Departments Local Rules FAQ Government Center Judge Dominic F. Pileggi Home / Court Departments / Board of Judges / Judge Dominic F. Pileggi Judge Dominic F. Pileggi was elected in November 2015 and sworn in January 4, 2016 to a ten-year term on the Delaware County Court of Common Pleas. Judge Pileggi previously served in the Family Law Section and is currently assigned to the Criminal Law Section. Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 delcocourts@co.delaware.pa.us Courts Quick Links Juror eResponse PA Law Help Self Help - Custody Self Help - Divorce Juror Handbook Language Access Family Court Self Represented Litigant Guide Government Center Quick Links Marriage Licenses Crisis Connection Certified Recovery Specialist Public Access Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Judge Dominic F. Pileggi Home / Court Departments / Board of Judges / Judge Dominic F. Pileggi Judge Dominic F. Pileggi Home / Court Departments / Board of Judges / Judge Dominic F. Pileggi Judge Dominic F. Pileggi Home / Court Departments / Board of Judges / Judge Dominic F. Pileggi Judge Dominic F. Pileggi was elected in November 2015 and sworn in January 4, 2016 to a ten-year term on the Delaware County Court of Common Pleas. Judge Pileggi previously served in the Family Law Section and is currently assigned to the Criminal Law Section. Judge Dominic F. Pileggi was elected in November 2015 and sworn in January 4, 2016 to a ten-year term on the Delaware County Court of Common Pleas. Judge Pileggi previously served in the Family Law Section and is currently assigned to the Criminal Law Section. Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 delcocourts@co.delaware.pa.us Courts Quick Links Juror eResponse PA Law Help Self Help - Custody Self Help - Divorce Juror Handbook Language Access Family Court Self Represented Litigant Guide Government Center Quick Links Marriage Licenses Crisis Connection Certified Recovery Specialist Public Access Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more " -183,https://pittsburghpa.gov/files/police/orders/ch4/43-10.01-juvenile-policy-legal-mandates-regarding-child-abuse.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -184,https://www.providenceri.gov/hr/wellness/cop-manage-anxiety-9-11/,Poor Data Source,Poor Data Source,City of Providence CoP Manage Anxiety 9.11 - City of Providence,"",200,Sucuri WebSite Firewall - Access Denied,"[""CoP Manage Anxiety 9.11""]","[""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español"", ""Lists *""]",[],[],[],"Skip To Menu Skip To Content Skip To Accessibility Options Language Language Arabic Chinese (Traditional) English Khemer Portuguese Spanish City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley City Of Providence Mayor Brett Smiley Search Accessibility CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation PVD 311 CITY HALL I Want to … MAYOR BRETT P. SMILEY Departments City Council Find a Meeting Agenda Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Running a Business Starting a Business Purchasing EVENTS NEWS EXPLORE Explore Providence Parks Recreation ACCESSIBILITY CoP Manage Anxiety 9.11 CoP Manage Anxiety 9.11 Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn CoP Manage Anxiety 9.11 CoP Manage Anxiety 9.11 Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn CoP Manage Anxiety 9.11 Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * " -185,https://spdblotter.seattle.gov/2017/01/07/police-respond-to-three-fatal-heroin-overdoses-remind-public-of-good-samaritan-law/,Media Bulletins,Agency-Published Resources,"Police Respond to Three Fatal Heroin Overdoses, Remind Public of ""Good Samaritan"" Law - SPD Blotter","",200,403 Forbidden,"[""Police Respond to Three Fatal Heroin Overdoses, Remind Public of “Good Samaritan” Law""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -186,https://champaignil.gov/2012/05/14/police-respond-to-weapon-call-central-high-school-610-w-university-ave/,Media Bulletins,Agency-Published Resources,"Police Respond to Weapon Call (Central High School, 610 W. University Ave.) - City of Champaign","",200,403 Forbidden,"[""Police Respond to Weapon Call (Central High School, 610 W. University Ave.)""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Police Respond to Weapon Call (Central High School, 610 W. University Ave.) Search Posted on May 14, 2012 At approximately 12:51 p.m. Friday, officers responded to Central High School for a report of a weapon after a student reported seeing a possible handgun in a student’s possession. A student at Central High School reported to school staff that a gun had been spotted in another student’s backpack. The staff located the student, but not the backpack. He was questioned by police and subsequently released. During the investigation, it was reported to police that another student, a 16 year-old male, had taken the backpack away from the original student and left the area with it. He was also questioned by police and released. After conducting a thorough search of the school, an Airsoft gun was found in a second floor classroom. Additional information led police to Westside Park, where the pellets for the Airsoft gun were located in the park’s Gazebo. “The students’ willingness to provide information to police and the school district’s timely response to this incident resulted in recovery of the Airsoft gun. The staff at Central took appropriate action and kept the students safe during the incident. Thankfully, no students were harmed,” says Deputy Chief Gallo. Categories: Police Department Press Releases Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs " -187,https://www.ci.plymouth.mi.us/services/police,Poor Data Source,Poor Data Source,"Police - City of Plymouth, MI","",200,Just a moment...,"[""Police""]",[],[],[],[],[],"" -188,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0202/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -189,https://www.rentonwa.gov/city_hall/police/police_services/special_operations,Contact Info & Agency Meta,Info About Agencies,Special Operations - City of Renton,"",200,Just a moment...,"[""CITY OF RENTON WASHINGTON""]","[""Special Operations""]",[],"[""SWAT"", ""Directed Enforcement Team (DET)"", ""Special Enforcement Team (SET)"", ""Drug Activity and Reporting""]",[],[],Skip navigation -190,https://alpha.austin.gov/es/police-oversight/2020-06-05-13/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -191,https://dagsboro.delaware.gov/ngg_tag/new-police-cars/,Poor Data Source,Poor Data Source,New Police Cars Archives - Town of Dagsboro,"",200,Home - Town of Dagsboro - Sussex County Delaware,[],"[""Images tagged \""new-police-cars\""""]","[""Menu"", ""Online Payments"", ""Agendas & Minutes"", ""Contact Us"", ""Connect With Us!""]",[],[],[],"Skip to Content Skip to Footer Toggle navigation Menu Home Departments Town Hall Police Department Water Department Government Town Council Town Council Members Planning Commission Town Zoning Map Town Code Board of Adjustment Members Budgets Town Elections Community General Town Information History Fire Department Taxes & Utilities Prince George’s Chapel Prince George’s Chapel Cemetery Comprehensive Land Use Plan Houses of Worship Cable Services Hurricane Preparedness Flood Zone Information Christmas Events Forms Contact Us Skip to Content Skip to Footer Toggle navigation Menu Home Departments Town Hall Police Department Water Department Government Town Council Town Council Members Planning Commission Town Zoning Map Town Code Board of Adjustment Members Budgets Town Elections Community General Town Information History Fire Department Taxes & Utilities Prince George’s Chapel Prince George’s Chapel Cemetery Comprehensive Land Use Plan Houses of Worship Cable Services Hurricane Preparedness Flood Zone Information Christmas Events Forms Contact Us Skip to Content Skip to Footer Toggle navigation Menu Home Departments Town Hall Police Department Water Department Government Town Council Town Council Members Planning Commission Town Zoning Map Town Code Board of Adjustment Members Budgets Town Elections Community General Town Information History Fire Department Taxes & Utilities Prince George’s Chapel Prince George’s Chapel Cemetery Comprehensive Land Use Plan Houses of Worship Cable Services Hurricane Preparedness Flood Zone Information Christmas Events Forms Contact Us Listen Images tagged ""new-police-cars"" << Mar 2024 >> S M T W T F S 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 Online Payments Agendas & Minutes Contact Us Connect With Us! Listen Images tagged ""new-police-cars"" << Mar 2024 >> S M T W T F S 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 Online Payments Agendas & Minutes Contact Us Connect With Us! Listen Images tagged ""new-police-cars"" << Mar 2024 >> S M T W T F S 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 Online Payments Agendas & Minutes Contact Us Connect With Us! Listen Images tagged ""new-police-cars"" << Mar 2024 >> S M T W T F S 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 Online Payments Agendas & Minutes Contact Us Connect With Us! " -192,https://norfolkne.gov/government/departments/police-division/press-releases/may-13th-press-release.html,Media Bulletins,Agency-Published Resources,"May 13th Press Release - City of Norfolk, NE","",200,"Welcome to Norfolk, NE - City of Norfolk, NE","[""City of Norfolk, NE"", ""Police Division"", ""May 13th Press Release"", ""City of Norfolk, NE""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]","" -193,https://www.coppelltx.gov/faq.aspx?qid=106,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Is it legal to burn trash in Coppell?,"",200,"Coppell, TX | Official Website",[],"[""▼ Fire Department - Services & Education"", ""Helpful Resources"", ""Helpful Resources"", ""Helpful Resources"", ""Helpful Resources"", ""Emergency Medical Services ( EMS ) Patient Medical Records and/or Medical Billing Records""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -194,https://police.bixbyok.gov/faq.aspx?qid=83,Resources,Agency-Published Resources,FAQs • How do I change my password?,"",200,"Bixby Police Department, OK | Official Website",[],"[""▼ Nixle Alert System""]","[""Categories"", ""Live Edit"", ""Helpful Links"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -195,https://beaumonttexas.gov/beaumont-police-arrest-3-for-aggravated-sexual-assault-aggravated-robbery-and-aggravated-kidnapping-1155-ih-10-n/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -196,https://police.crystalmn.gov/police/services/request_a_report,Records Request Info,Agency-Published Resources,Request a Report - City of Crystal-Police,"",200,Just a moment...,"[""Request a Report""]",[],"[""Sign up for a city newsletter or notification."", ""Police Department"", ""Lobby Hours:""]","[""Report requests will be processed within 10 business days."", ""Monday - Friday""]",[],[],"" -197,https://www.southamptontownnypolice.gov/608/animal-control,Not Criminal Justice Related,Not Criminal Justice Related,"Animal Control | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Animal Control""]","[""Cruelty & Neglect Complaints"", ""Resources"", ""SPCAs, Humane Societies & Shelters"", ""Government Agencies"", ""Law Enforcement Sites"", ""Animal Control Agencies"", ""Miscellaneous Local Links"", ""Dog Licenses""]","[""Site Tools"", ""Contact Us"", ""Animal Control Office"", ""Ryan Murphy"", """", ""Hours:"", ""FAQs"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Public Safety Animal Control Animal Control Cruelty & Neglect Complaints Southampton residents, please contact the Suffolk County SPCA for cruelty and neglect complaints Resources United State Department of Agriculture Animal Welfare Act SPCAs, Humane Societies & Shelters American Humane Association American Society for the Prevention of Cruelty to Animals Animal Rescue Fund of the Hamptons Bide-A-Wee Home Association Suffolk County, New York SPCA The Humane Society of the United States Southampton Animal Shelter Foundation Government Agencies New York State Assembly Bills - Get the latest updates on pending legislation New York State Department of Agriculture and Markets Suffolk County Government - Lists Suffolk government agencies online U.S. Department of Agriculture U.S.D.A. Animal and Plant Health Inspection Service U.S. Fish and Wildlife Service Home Page New York State Department of Environmental Conservation Law Enforcement Sites Southampton Town, New York Police Department East Hampton Town, New York Police Department Southampton Village, New York Police Department Suffolk County, New York Police Home Page Suffolk County Sheriff's Department, New York Home Page New York City Police New York State Police U.S. Department Of Justice U.S. Drug Enforcement Agency Animal Control Agencies Babylon, New York Animal Control Brookhaven, New York Animal Control National Animal Control Association New York City Animal Care and Control Center Riverhead, New York Animal Control Smithtown, New York Animal Control Miscellaneous Local Links Hamptons Online East Hampton Star Newspaper Dan's Papers Southampton Press Newspaper Wildlife Rescue Center of the Hamptons The Wildlife Rescue Center of the Hamptons, Inc is a not-for-profit corporation dedicated to the rehabilitation of wild animals accidentally impacted Riverhead Foundation Rescue Center - Long Island Aquarium Contact Us Animal Control Office Ryan Murphy Public Safety Emergency Management Administrator 27 Ponquogue Ave Hampton Bays, NY 11946 Ph: 631-702-2915 Fx: 631-283-2694 Hours: Monday-Friday 8:30 am – 4:00 pm Dog Licenses Dog License Information (PDF) Dog License Application (PDF) Dog License Status Change Online Form FAQs How do I contact Animal Control and where are you located? What do I do if I have an animal emergency when Animal Control is closed? View All /FAQ.aspx Southampton Animal Shelter Foundation Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -198,https://www.lomalinda-ca.gov/services/police_department/tips,Resources,Agency-Published Resources,Tips - City of Loma Linda,"",200,Just a moment...,"[""Tips""]",[],[],"[""City Hall Hours:"", ""Building & Safety Hours:"", ""Quick Links:""]",[],[],"" -199,https://www.mass.gov/doc/sco-pace-disenrol-scopdf/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -200,https://www.mass.gov/doc/unit-5-cops-salary-chart-effective-742021/download,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -201,https://www.fortworthtexas.gov/departments/police/events/police-chief-finalist,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -202,https://www.antioch.il.gov/wpfb-file/police-blotter-02-01-21-to-02-07-21-pdf/,Arrest Records,Police & Public Interactions,"Police Blotter 02-01-21 To 02-07-21 - Antioch, IL",17529 police blotter 02 01 21 to 07 pdf police_department police_blotters 2021 1625764667 887817471521d7d07cbd900fcd6c9e7e c0831aa0de873faa40423ef928807e829deda5db0008083727a1946e5c9c09fc 300x160 _crkpbiaiahbd thumb jpg 03 16 08 52 34 0 207 46 13 189 23 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17 pagefailed_18 pagefailed_19 pagefailed_20 pagefailed_21 pagefailed_22,200,"Home - Antioch, IL","[""Police Blotter 02-01-21 To 02-07-21""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -203,http://www.cityofpataskalaohio.gov/cop_people/tom-lee/,Not Criminal Justice Related,Not Criminal Justice Related,Tom Lee - City Of Pataskala,Official Website,200,Home - City Of Pataskala,"[""City Of Pataskala"", ""Tom Lee""]","[""Official Website""]",[],"[""Tom Lee Council Member Ward 1""]",[],[],Document Library Calendar Public Services Pay Court Ticket Online City Of Pataskala Official Website Blog Community Police Obtain Fingerprints Solicitor’s Permit Citizens Police Academy Important Links/Resources Prescription Drug Drop Off Police Officer Job Application History of the Pataskala Police Department Curfew Vacation House Check Form Fire School Districts Residents Taxes in Pataskala RITA Tax Local Animal Shelter/Lost Pets Dog License BMV Info Licking County Health Department Register to Vote Report a Gas Emergency New to Pataskala? Good Neighbor Guidelines Outdoor Activities Attractions City Departments Mayor Administration Garage Sale Permit Adopt-A-Street Program Rent a Park Shelter Current Bids and RFQ’s Outdoor Activity/Event Permit Parade-Assembly Form Parks and Recreation Economic Development Human Resources Utilities Utility Rates Water and Sewer Billing/ E-Billing Interesting Facts and Information Storm Water Management Program Report a Water Leak Finance Pataskala’s Income Tax Budget Financial Reports Popular Annual Financial Report (PAFR) Annual Comprehensive Financial Reports Financial Condition Reports 2023 Financial Condition Reports 2022 Financial Condition Reports 2021 Financial Condition Reports 2020 Financial Condition Reports 2019 Financial Condition Reports 2018 Financial Condition Reports 2017 Financial Condition Reports 2016 Financial Condition Reports 2015 Financial Condition Reports 2014 Financial Condition Reports 2013 Financial Condition Reports 2012 Financial Condition Reports Audited Financial Reports Pataskala Open Checkbook Mayor’s Court Important Traffic Violation Info Pay Fines or Search Case Files How to Pay Fines Traffic and General Offense Codes Plea Descriptions Court Appearance Times Your Rights in the Pataskala’s Mayor’s Court Downloadable Forms Sealing a Record Informational Court Links Mayor’s Court Prosecutor Pataskala’s Mayors Court Magistrate Mayor’s Court Rules Criminal/Traffic Diversion Bond Schedule Fine Schedule Legal Public Service/Streets Pothole Repair Report a Pothole Right of Way Snow Removal Traffic Signals & Street Lights Drainage/Ditches Issues Planning & Zoning Permit Questions Planning & Zoning Fee Schedule Discharge Map Zoning Maps Permits Comprehensive Plan Properties With Posted Code Violations Government City Council Ward Map Tom H. Lee – Ward 1 Mary Hite – Ward 2 Deborah Kohman – Ward 3 Brandon Galik – Ward 4 Dustin Epperson – At-Large Jude Hampshire – At-Large Andy Walther – At Large Clerk of Council Council Packet Public Notices Agendas Meeting Minutes Audio/Video Recordings Legislation Approved Ordinances & Resolutions 2024 Resolutions 2024 Ordinances 2023 Resolutions 2023 Ordinances 2022 Resolutions 2022 Ordinances 2021 Resolutions 2021 Ordinances 2020 Resolutions 2020 Ordinances 2019 Resolutions 2019 Ordinances 2018 Resolutions 2018 Ordinances 2017 Resolutions 2017 Ordinances 2016 Resolutions 2016 Ordinances 2015 Resolutions 2015 Ordinances Codified Ordinances Charter Public Records Request Information Boards and Commissions Personnel Board of Review Planning and Zoning Commission Board of Zoning Appeals Parks and Recreation Advisory Board Planning & Zoning Commission Board of Zoning Appeals Document Library Calendar Public Services Pay Court Ticket Online -204,https://hutchinsonmn.gov/document_category/police/,Poor Data Source,Poor Data Source,Police Archives - City of Hutchinson,"",200,403 Forbidden,"[""Police""]","[""Footer""]",[],[],[],[],"" -205,https://www.mass.gov/doc/gardnerpolicesergeant2119rtf/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -206,https://www.ci.oakley.ca.us/police-accident-reports/,Accident Reports,Police & Public Interactions,Police Accident Reports - City of Oakley,"",200,City of Oakley - City of Oakley,"[""Police Accident Reports""]",[],[],[],[],[],"Skip to content Community Animal Services ARPA Updates Civic Center and Laurel Road Message Board Emergency Services Evacuation Information Hospitals/ Clinics Housing Job Openings Library Oakley Election 2022 Schools Seniors Transportation Utilities Veterans How Do I? Departments Building City Attorney City Clerk City Council City Manager’s Office Code Enforcement Economic Development Finance Human Resources Planning & Zoning Police Public Works and Engineering Recreation About Oakley Contact Us News and Announcements Municipal Code Oakley’s Vision Moving to Oakley Recreation Online Registration Community Resources Events & Classes Halloween Decorating Contest Junior Recreation Leader Program Recreation Guide Summer Camps Taste of Oakley Volunteer Opportunities More City Meetings City Council Agenda and Videos Planning Commission Agenda and Videos City Council Meeting Schedule Planning Commission Meeting Schedule Strategic Plan Public Comment Form for Meetings Business Open Bids Request for Proposals/Qualifications Search Home Police Accident Reports Police Accident Reports Municipal Code Events News Job Openings Contact Us Classes / Programs FAQ Make a Complaint Building Permits Departments City Code of Ethics Starting a Business City Hall Hours 8:00 - 12:00 pm Monday - Thursday City Hall is open by appointment after 12:00 PM M-TH and by appointment on Fridays City Offices are closed on the 1st and 3rd Friday of each month The Oakley Police Department is open from 8:30 AM to 5:00 PM Monday through Friday 3231 Main Street, Oakley, CA 94561 (925) 625-7000 info@ci.oakley.ca.us Copyright © 2015 by City of Oakley. All rights reserved. Designed and developed by Digital Gear Community Animal Services ARPA Updates Civic Center and Laurel Road Message Board Emergency Services Evacuation Information Hospitals/ Clinics Housing Job Openings Library Oakley Election 2022 Schools Seniors Transportation Utilities Veterans How Do I? Departments Building City Attorney City Clerk City Council City Manager’s Office Code Enforcement Economic Development Finance Human Resources Planning & Zoning Police Public Works and Engineering Recreation About Oakley Contact Us News and Announcements Municipal Code Oakley’s Vision Moving to Oakley Recreation Online Registration Community Resources Events & Classes Halloween Decorating Contest Junior Recreation Leader Program Recreation Guide Summer Camps Taste of Oakley Volunteer Opportunities More City Meetings City Council Agenda and Videos Planning Commission Agenda and Videos City Council Meeting Schedule Planning Commission Meeting Schedule Strategic Plan Public Comment Form for Meetings Business Open Bids Request for Proposals/Qualifications Search " -207,https://delcopa.gov/jdboard/index.html,Contact Info & Agency Meta,Info About Agencies,"Board of Managers of Juvenile Detention - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Board of Managers of Juvenile Detention""]",[],"[""Mission"", ""Board Members"", ""MEETING SCHEDULE"", ""BYLAWS"", ""ORDINANCE"", ""HELPFUL RESOURCES"", ""NEWS RELEASES"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""2024""]",[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Board of Managers of Juvenile Detention Home / Board of Managers of Juvenile Detention Email the Board of Managers of Juvenile Detention: JDBOM@co.delaware.pa.us . Mission Delaware County is dedicated to ensuring that all citizens live in safety, which is a commitment consistent with the County's Juvenile Detention Board of Managers mission that juvenile offenders are held accountable for their offenses while promoting a positive social change for their rehabilitation. Board Members Three Delaware County Council Members: Kevin Madden - Chair Elaine Schaefer Dr. Monica Taylor Delaware County Controller: Joanne Phillips Appointments by Delaware County Chair: Chris Eiserman Chekemma J. Fulmore Townsend Marie N. Williams - Vice Chai r Appointments by County President Judge: Candice L. Linehan James E. Turner Nathaniel C. Nichols MEETING SCHEDULE Members of the public have the option of attending the meeting in person or watching it live here on the Board’s web page. Public meetings are held the third Tuesday of each month from 5:30 – 7:00 P.M. in the County Council Meeting Room (located on the first floor of the Government Center Building - please use the entrance at Orange and Second Street, as the building's main entrance closes at 4:30pm ) on the following dates: 2024 Date Agenda Minutes Video Other January 16 Agenda Minutes Video February 20 Agenda Minutes Video March 19 Agenda Video April 16 Video May 21 Video June 17* Video July 16 Video August 20 Video September 17 Video October 15 Video November 19 Video December 17 Video *change of day due to a holiday meeting shift this week Meetings Archive BYLAWS Bylaws (approved July 20, 2021) ORDINANCE See Ordinance No. 2021-4 that provides for the creation of a Board of Managers for the Juvenile Detention. HELPFUL RESOURCES In June 2021, the Pennsylvania Juvenile Justice Task Force issued a 64-page report outlining its recommendations.  The report can be viewed at: https://www.pacourts.us/Storage/media/pdfs/20210622/152647-pajuvenilejusticetaskforcereportandrecommendations_final.pdf NEWS RELEASES Department of Juvenile Detention and Rehabilitation Hold Community Collaboration Meetings - 2/7/2023 Juvenile Detention Board of Managers Holds First Meeting July 20 - 7/15/2021 Delaware County Council Appoints New Board of Managers forJuvenile Detention - June 3, 2021 Delaware County Announces Creation of New Board of Managers for Juvenile Detention - May 5, 2021 Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play " -208,https://barnegatpolice.us/wpdmpro-sitemap.xml,Poor Data Source,Poor Data Source,XML Sitemap,"",200,Barnegat Township Police Department - Barnegat Township Police Department,"[""XML Sitemap""]",[],[],[],[],[],"XML Sitemap Generated by Yoast SEO , this is an XML Sitemap, meant for consumption by search engines. You can find more information about XML sitemaps on sitemaps.org . This XML Sitemap contains 6 URLs. URL Images Last Mod. https://barnegatpolice.us/download/burke-dre/ 0 2024-03-25 06:34 +00:00 https://barnegatpolice.us/download/burke-hgn/ 0 2024-03-25 06:35 +00:00 https://barnegatpolice.us/download/burke-alcotest/ 0 2024-03-25 06:36 +00:00 https://barnegatpolice.us/download/calicchio-alcotest/ 0 2024-03-25 06:36 +00:00 https://barnegatpolice.us/download/roman-hgn/ 0 2024-03-25 06:55 +00:00 https://barnegatpolice.us/download/calicchio-hgn/ 0 2024-03-25 07:03 +00:00 " -209,https://www.ci.san-bernardino.ca.us/city_hall/police_department/over_100_years_of_service/historical_photos,Not Criminal Justice Related,Not Criminal Justice Related,Historical Photos - City of San Bernardino,"",200,Just a moment...,"[""City of San Bernardino California""]","[""Historical Photos""]",[],[],[],[],Skip to Content -210,https://delcopa.gov/council/2018minutes/103118minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -211,http://www.longbeach.gov/police/press-releases/civilian-employee-arrested/,Media Bulletins,Agency-Published Resources,CIVILIAN POLICE DEPARTMENT ARRESTED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/5/2018 FOR IMMEDIATE RELEASE Press Release # 2018 Subject: CIVILIAN POLICE DEPARTMENT EMPLOYEE ARRESTED Contact: Media Relations Detail (562) 570-5273 On Friday, June 29, 2018, an employee of the Long Beach Police Department observed suspicious activity in the men’s restroom on the 2nd floor of the Public Safety Building, located at 400 W. Broadway. The employee reported the information to his supervisor and the department immediately initiated an investigation. Within hours of the initial report, detectives discovered that a civilian Police Department employee had been photographing and videotaping other employees in the same restroom. The employee was arrested and booked for recording people in a restroom without their knowledge, at the Signal Hill Police Department, to avoid a conflict of interest with his work site. The employee has been identified as Clerk Typist Sergio Nieto, a 28-year-old resident of Downey. His court date has been set for Wednesday, July 25, 2018, in Long Beach Superior Court. He has also been placed on summary suspension pending the results of the criminal and administrative investigations. Detectives are actively investigating this case to determine the scope of the illegal activity. All Police Department employees have been notified of the arrest and the ongoing investigation. Any employee who believes they may have been a victim, or who may have observed suspicious activity related to this investigation have been asked to contact Detective Rodney Brown in the Sex Crimes Detail at (562) 570-7368. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -212,https://hollister.ca.gov/government/city-departments/police/incident-reports/,Resources,Agency-Published Resources,"Incident Reports – City of Hollister, California","",200,"City of Hollister, California",[],[],"[""Follow Us on..."", ""Hollister Police Incident Report"", ""Incident Reporting"", ""We are Hiring"", ""Follow Us on....""]",[],[],[],"" -213,"https://norfolkne.gov/government/departments/police-division/press-releases/february-14,-2022-press-release.html",Media Bulletins,Agency-Published Resources,"February 14, 2022 Press Release - City of Norfolk, NE","",200,"Welcome to Norfolk, NE - City of Norfolk, NE","[""City of Norfolk, NE"", ""Police Division"", ""February 14, 2022 Press Release"", ""City of Norfolk, NE""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]","" -214,https://www.southamptontownnypolice.gov/faq.aspx?qid=138,Training & Hiring Info,Info About Officers,FAQs • How can I find out about any job opportunities?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Human Resources""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -215,http://www.lafayettepolice.us/714/city-website-policy,Not Criminal Justice Related,Not Criminal Justice Related,"City Website Policy | Lafayette, IN - Official Website","The City of Lafayette, IN local government agency is committed to protecting the rights of all our website visitors. We recognize our obligation to keep sensitive information secure and have created this privacy statement to share our information gathering and dissemination practices for this website. ",200,"Police Department | Lafayette, IN - Official Website","[""City Website Policy""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -216,https://www.bedminster.us/government/police/vision__mission___core_values/body_camera,Poor Data Source,Poor Data Source,Body Camera - Township of Bedminster,"",200,Just a moment...,"[""Bedminster Township""]","[""Body Camera""]","[""Bedminster Township""]",[],[],[],"" -217,https://www.mass.gov/doc/tavares-bruce-v-fall-river-police-department-51707/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -218,https://delcopa.gov/vote/pdf/2021/delco-boe-meeting-notice_certification-municipal-primary-results_6-7-2021.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -219,https://delcopa.gov/sheriff/pdf/list1.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -220,http://www.lafayettepolice.us/3469/gis-zoning-maps,Resources,Agency-Published Resources,"GIS & Zoning Maps | Lafayette, IN - Official Website","Check whether you are in city limits, what your zoning is and property owner information.",200,"Police Department | Lafayette, IN - Official Website","[""GIS & Zoning Maps""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home Government Departments A - F Engineering & Public Works Permits & Licensing GIS & Zoning Maps GIS & Zoning Maps County GIS & Zoning Maps - Check your zoning. City Limits Map - Check whether your property is in city limits. Beacon - Check property owner information. Applications Building Permits Commercial Projects Residential Projects Online Services Construction Guidelines and Standards Electrical Licenses GIS & Zoning Maps License, Bonding & Insurance Information Permit Fees Permit Report - Monthly Permit Report - Weekly Policy and Guidance Regulations and Codes Search Permit Records Online Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home Government Departments A - F Engineering & Public Works Permits & Licensing GIS & Zoning Maps GIS & Zoning Maps County GIS & Zoning Maps - Check your zoning. City Limits Map - Check whether your property is in city limits. Beacon - Check property owner information. Applications Building Permits Commercial Projects Residential Projects Online Services Construction Guidelines and Standards Electrical Licenses GIS & Zoning Maps License, Bonding & Insurance Information Permit Fees Permit Report - Monthly Permit Report - Weekly Policy and Guidance Regulations and Codes Search Permit Records Online Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -221,https://www.east-windsor.nj.us/police-athletic-league,Misc Police Activity,Police & Public Interactions,"Official Website of East Windsor Township, New Jersey - Police Athletic League","",200,"Official Website of East Windsor Township, New Jersey - Home",[],"[""Police Athletic League""]",[],[],[],[],Township of EAST WINDSOR TOWNSHIP Navigation Menu Departments Clerk Council Meetings Construction Court Economic Development Finance Tax Assessor Tax Collector Health Department Health Services Retail Food Licensing Vital Statistics Registrar Mayor Planning Department Planning Board Zoning Board Police Department Police Department Structure Personnel Directory I Want To Police Reports Medicine Drop Box Firearms/Fingerprinting Animal Control Towing & Storage of Vehicles Bicycle Safety Domestic Violence Victim Response Team Police Employment Recruitment Plan Police Information/Links Internal Affairs Public Works Garbage Collection Curbside Collection Bulk Goods Curbside Pick-Up Recycling Curbside Recycling Electronics Recycling White Goods Recycling Cellular Phone Recycling Other Recycling Services Recycling Events Organic Waste Chipping and Brush Grass Disposal Leaf Collection Street Index Snow Removal Services Parks Parks - List of Parks and Pathways Picnic Area and Field Reservations Submit a Request or Complaint Recreation Pay Recreation Fees Online Current Programs and Activities East Windsor Township Summer Camps Community Event Sponsorship Event Photos and Videos Township Parks Youth Activity Directory Senior Services Senior Service Directory Senior Center Newsletters Community Bus Information Senior Center Community Bus Schedule Senior Center Exercise Schedule Mercer County Trade Transportation Tax Assessor Tax Collector Township Manager Welfare EWMUA Staff Directory Government Mayor Elected Officials Boards & Commissions Council Meetings Planning Department Township Ordinances - Introduced Township Ordinances - Adopted Municipal Code Book Financial Statements Municipal Budget Sustainable Policies Notice to Bidders Fair & Open Notices Bid Requests Employment Opportunities E-News Township Newsletters Spotlight East Windsor Press Releases Community Area Information Township History Community Events Recreation Pay Recreation Fees Online After School Programs East Windsor Township Summer Camps Parks Youth Activity Directory Senior Services Senior Service Directory Senior Center Newsletters Senior Nutrition Calendar Senior Center Calendar Senior Center Community Bus Schedules Community Bus Information Senior Center Classes Mercer County Trade Transportation East Windsor Municipal Alliance for the Prevention of Substance Abuse (EWMAPSA) Medicine Drop Box Fire Companies Rescue Squads Local Libraries Affordable Housing Transportation Township Map Press Releases State and Federal Contacts Community Links Township Map Business Doing Business in East Windsor Why Choose East Windsor One Stop Permit Processing Events for Business Business Assistance Directory Township Code Planning Studies Major Area Employers Transportation Business News Business Awards Business Videos Township Map I Want To Submit a Request Township of EAST WINDSOR TOWNSHIP Township of EAST WINDSOR TOWNSHIP Township of EAST WINDSOR TOWNSHIP -222,http://www.longbeach.gov/police/press-releases/murder2/,Media Bulletins,Agency-Published Resources,MURDER (HARBOR AVE & 15TH ST.),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/5/2019 FOR IMMEDIATE RELEASE Press Release # 2018 Subject: *UPDATE* MURDER SUSPECTS ARRESTED Contact: Media Relations Detail (562) 570-5273 LBPDMediaRelations@longbeach.gov Update 12/5/2019: On Tuesday, December 3, 2019, deputies from the U.S. Marshals Service assisted the Long Beach Police Department by locating and arresting two murder suspects in Placerville, CA. Daniel Castro Fernandez, 22-years-old, and Jason Hernan Cortes, 20-years-old, both residents of Corning, CA, were taken into custody and transported to the Long Beach City jail where they were each booked on one count of murder and held on $2,000,000 bond. Homicide detectives believe the suspects planned to rob the victim and the robbery quickly escalated to murder. The victim and suspect Cortes were relatives and known to each other. Detectives delivered their case today to the Los Angeles County District Attorney’s office for filing consideration. Original Release 7/7/2018: On July 6, 2018, at approx. 7:10 p.m., officers were dispatched to the area of Harbor Avenue & 15th Street in regards to an unknown trouble call, which resulted in officers locating the body of a deceased male adult. When officers arrived, they located the man inside a motorhome, who had sustained stab wounds to the upper torso. The victim had been found by family members who called police Long Beach Fire Department paramedics responded and determined the victim, identified as 41-year-old Hernan Cortez of Long Beach, deceased at the scene. Victim Cortez had been living in his motorhome in that area. During their investigation, Homicide detectives learned that someone in the area reported seeing the victim on the morning of 7/6/18 at approx. 5:30-6:00 a.m. Therefore, they believe the stabbing occurred sometime between then and when the victim was discovered by family. A motive for the stabbing is unknown and the investigation remains ongoing. Anyone with any information regarding the incident is urged to contact LBPD Homicide Detectives Malcolm Evans and Robert Gonzalez at (562) 570-7244 .  Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple app store or Google Play), or by visiting www.crimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -223,https://www.tukwilawa.gov/departments/police/annual-reports/pd-2004report/,Poor Data Source,Poor Data Source,PD-2004report - City of Tukwila,"",200,Home - City of Tukwila,"[""City of Tukwila News""]","[""PD-2004report""]",[],"[""City of Tukwila""]","[""I am a..."", ""Online Services"", ""Most Requested Forms""]",[],"" -224,https://springfield-or.gov/city/police-department/patrol/k9-team/,Contact Info & Agency Meta,Info About Agencies,K-9 Program – City of Springfield Oregon,"",200,City of Springfield Oregon,"[""Springfield Police K-9 Program""]",[],[],"[""Police""]",[],[],"" -225,https://www.stpaul.gov/departments/police/administration-office-chief/community-engagement-division/special-events-application-sppd,Not Criminal Justice Related,Not Criminal Justice Related,Special Events Application (SPPD) | Saint Paul Minnesota,"Please read and follow all directions to ensure processing and permit submissions are complete. Incomplete applications will not be processed. Click on each link below in sequential order:Per City Ordinance, all recurring events are required to submit their application ninety (90) days in advance of the event. NEW events must submit no less than sixty (60) days prior. If your event is happening within that 60 day window, please call first to determine whether the application can be processed.",200,Home | Saint Paul Minnesota,"[""Special Events Application (SPPD)""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Footer""]","[""You are using an unsupported browser. Please use Microsoft Edge."", ""Please read and follow all directions to ensure processing and permit submissions are complete. Incomplete applications will not be processed. Click on each link below in sequential order:"", ""2024 Event Applications:"", ""Contact The City"", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[],"" -226,https://www.lynchburgvapolice.gov/wp-content/uploads/2021/06/lpd-seal-e1662580813573.png,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -227,https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/citations-for-summary-of-policy-language-recommendations/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -228,https://detroitmi.gov/departments/police-department/detroit-police-department-shield-program/detroit-police-shield-partners,Contact Info & Agency Meta,Info About Agencies,Detroit Police Shield Partners | City of Detroit,"",200,City of Detroit | Opportunity Rising,"[""Detroit Police Shield Partners""]","[""Top Links"", ""Site Menu""]",[],"[""CONTACTS""]",[],[],"Top Links Buses Departments Government Jobs Pay Water English Español Bengali العربية More Site Menu MENU search Departments BACK Airport, Coleman A. Young International Buildings, Safety Engineering and Environmental Department Civil Rights, Inclusion & Opportunity Department Department of Public Works Department of Appeals and Hearings Department of Innovation and Technology Department of Neighborhoods Detroit Building Authority Detroit Department of Transportation Detroit Fire Department Detroit Health Department Elections General Services Department Homeland Security & Emergency Management, Detroit Housing and Revitalization Department Human Resources Department Law Department Media Services Department Municipal Parking Department Office of the Chief Financial Officer Parks & Recreation Pension Department Planning and Development Department Police Department Water and Sewerage Department Youth Services Government BACK Boards City Clerk City Council Commissions Mayor's Office Office of Inspector General Office of the Auditor General Ombudsman Census BACK What is the Census Why the Census Matters How You Can Help Census Resources How Do I BACK Appeal Apply for or renew license Apply for or renew permit or certification Do Business with the City Find Youth Programs Find information Find or apply for employment Locate something Obtain Grant Information Pay fine, bill or tax Purchase Register Report problem Request document Request service or assistance Sign up Volunteer Buses Jobs Pay Water Events News Directory Documents Forms Home Police Department Detroit Police Department Shield Program Detroit Police Shield Partners CONTACTS Detroit Shield Program (313) 596-2250 Detroit Public Safety Headquarters - 1301 3rd Street Detroit, MI 48226 Detroit Police Shield Detroit Police Shield Detroit Police Shield Anne Arundel County,MD Antwerp Belgium Baltimore County, MD Boston Boston BRIC City of Baltimore, MD Global Shield Network Hanover County Hennepin County Intelligence Bureau NY NYPD Shield,NY Oakland County, MI Seattle, WA Stafford County York County, VA Subscribe to Newsletters Copyright 2001-2024 by City of Detroit For information about the City of Detroit's Web site, email the Web Editor . All material is the property of the City of Detroit and may only be used with permission. Privacy Policy / Disclaimer Follow Us twitter facebook youtube linkedin-in instagram DATA DETROIT Detroit's Open Data Portal " -229,https://www.mass.gov/info-details/audit-of-the-office-for-refugees-and-immigrants-objectives-scope-and-methodology,Not Criminal Justice Related,Not Criminal Justice Related,"Audit of the Office for Refugees and Immigrants Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Office for Refugees and Immigrants.,200,Mass.gov,"[""Audit of the Office for Refugees and Immigrants Objectives, Scope, and Methodology""]","[""Table of Contents for the audit, Audit of the Office for Refugees and Immigrants"", ""Appendix"", ""Table of Contents"", ""Overview"", ""Data Reliability"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[],"" -230,https://delcopa.gov/dropbox/,Not Criminal Justice Related,Not Criminal Justice Related,Untitled Document,"",200,"Delaware County, Pennsylvania",[],[],[],[],[],[],"" -231,https://delcopa.gov/sustainability/presentations/22/06ruthabbe.pptx,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -232,http://www.longbeach.gov/police/press-releases/public-s-help-needed-in-hit-and-run-investigation/,Media Bulletins,Agency-Published Resources,Public's Help Needed in Hit and Run Investigation,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/13/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: PUBLIC'S HELP NEEDED IN HIT AND RUN INVESTIGATION Contact: Media Relations Detail (562)570-5273 UPDATE (9/18/16): On September 17,2016, Maria Mendoza passed away at a local hospital from injuries sustained in the hit and run collision. UPDATE (9/15/16): On September 15, 1016, at approximately 11:00 a.m., Long Beach Police Collision Investigations Detectives made an arrest in the hit and run collision that left Maria Mendoza in critical condition. Detectives arrested 83-year-old Edward Peterson of Long Beach, at his residence. He was booked into the Long Beach Jail for felony hit and run with bail set at $50,000.00. The involved vehicle, registered to Peterson, was located at his residence and impounded as evidence. Detectives were able to locate Peterson after receiving a tip from the public. The Long Beach Police Department would like to thank the media for sharing this information with the public. The investigation remains ongoing. Victim Maria Mendoza Actual Suspect Vehicle Link To Video of Suspect Vehicle: https://www.youtube.com/watch?v=lqkTJX1BCvI On Saturday, September 10, 2016 at approximately 1814 hours, officers were dispatched to Willow Street and Long Beach Boulevard regarding an injury hit and run traffic collision between a vehicle and a pedestrian, which resulted in the critical injury of the pedestrian. When Officers arrived on scene, they discovered the pedestrian lying unconscious on Willow Street being treated by Good Samaritans already on scene. The pedestrian was transported by Long Beach Fire Department Paramedics to a local hospital where she is listed in ""Very Critical Condition"". The preliminary investigation revealed that a champagne or beige colored smaller SUV struck the pedestrian in the crosswalk. After viewing video from surveillance cameras in the area it was determined that vehicle, was possibly a Toyota Rav-4, with no cover on spare tire. It also appears that the vehicle failed to stop for the red light while traveling west on Willow Street at Long Beach Boulevard and eventually striking the pedestrian while she crossed southbound Long Beach Bl. west of Willow Street. Witnesses on scene described the driver of the vehicle to be an elderly male white with gray hair. The pedestrian has been identified as Maria Mendoza a 59-year-old female resident of Compton. She remains in very critical condition at a local hospital. Anyone who may have information regarding this incident is asked to call Long Beach Police Department Collision Investigation Detail Detective Steve Fox at (562) 570-7355. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -233,https://takomaparkmd.gov/government/police/covid-19-info-resources/,Not Criminal Justice Related,Not Criminal Justice Related,"","",404,"","","","","","","","" -234,https://www.southamptontownnypolice.gov/faq.aspx?qid=259,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Does the shelter have a veterinary clinic?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Public Safety - Animal Shelter""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -235,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/arrests/092322arrests.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -236,http://www.lafayettepolice.us/456/special-events,Not Criminal Justice Related,Not Criminal Justice Related,"Facilities | Lafayette, IN - Official Website",View the 3 different aquatic facilities that open to the public.,200,"Police Department | Lafayette, IN - Official Website",[],[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]","[""Castaway Bay"", ""Tropicanoe Cove""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About Us Special Events Programs I Want To... Home Government Departments H - W Parks & Recreation Facilities Aquatics Special Events 9 2 1 2 Castaway Bay Explore the amenities and fees for the Castaway Bay Aquatic Center. Pooch Plunge Tropicanoe Cove Get ready to explore all the great amenities of Tropicanoe Cove. Event Days Castaway Bay Pooch Plunge Tropicanoe Cove Event Days Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About Us Special Events Programs I Want To... Home Government Departments H - W Parks & Recreation Facilities Aquatics Special Events 9 2 1 2 Castaway Bay Explore the amenities and fees for the Castaway Bay Aquatic Center. Pooch Plunge Tropicanoe Cove Get ready to explore all the great amenities of Tropicanoe Cove. Event Days Castaway Bay Pooch Plunge Tropicanoe Cove Event Days Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About Us Special Events Programs I Want To... Home Government Departments H - W Parks & Recreation Facilities Aquatics Special Events 9 2 1 2 Castaway Bay Explore the amenities and fees for the Castaway Bay Aquatic Center. Pooch Plunge Tropicanoe Cove Get ready to explore all the great amenities of Tropicanoe Cove. Event Days Castaway Bay Pooch Plunge Tropicanoe Cove Event Days Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -237,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/082621summary.pdf,Daily Activity Logs,Info About Officers,"","",404,"","","","","","","","" -238,https://www.mass.gov/doc/handout-for-the-may-24-2018-design-public-hearing-in-chicopee/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -239,https://oceancitymd.gov/oc/ocean-city-police-sergeant-retires-after-27-years-of-service/,Media Bulletins,Agency-Published Resources,"Ocean City Police Sergeant Retires After 27+ Years of Service – Town of Ocean City, Maryland","",200,"Town of Ocean City, Maryland – A Vibrant Coastal Resort Community","[""Ocean City Police Sergeant Retires After 27+ Years of Service""]","[""Post navigation""]","[""Related posts""]",[],[],[],"" -240,https://delcopa.gov/sustainability/commission/meetingminutes/sustainabilitycommissionkick-offmeetingminutesoct2020.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -241,https://delcopa.gov/publicrelations/publicrelations/releases/2020/herobowlboard.html,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -242,https://www.mass.gov/doc/minutes-of-april-2019-chicopee/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -243,https://www.roseville.ca.us/government/departments/police_department/divisions/police_explorers,Resources,Agency-Published Resources,Police Explorers - City of Roseville,"",200,Just a moment...,"[""City of Roseville""]","[""Police Explorers""]","[""Roseville Police Department""]",[],[],[],"" -244,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-130-2010-state-police-expertise-pay,Media Bulletins,Agency-Published Resources,State Police Bulletin No. SP-130 | Office of the New York State Comptroller,To notify the Division of State Police of the new Additional Pay code and procedures for processing Expertise Pay,200,Office of the New York State Comptroller | Thomas P. DiNapoli,"[""State Police Bulletin No. SP-130"", """"]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Background"", ""Effective Date(s)"", ""Payment Information and Eligibility Criteria"", ""OSC Actions"", ""Control-D Report"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]","[""NPAY770 One Time Payment Report""]",[],"" -245,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/080822summary.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -246,https://www.antioch.il.gov/wpfb-file/10-22-13-police-and-fire-agenda-pdf-3/,Poor Data Source,Poor Data Source,"10-22-13 Police And Fire Agenda - Antioch, IL",9062 10 22 13 police and fire agenda pdf commissions commission agendas 2013 1381956042 206c0dca275a24506b8ab566c4ad85f9 213x300 _kkntdsgansvd thumb jpg 16 15 40 42 0 pdf application trustees dennis b crosby scott a pierce mary c dominiak ted p poulos jerry t johnson george sakas lawrence m hanson mayor lori k folbrick village clerk notice of,200,"Home - Antioch, IL","[""10-22-13 Police And Fire Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -247,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/053022blotter.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -248,https://www.lynchburgvapolice.gov/news-updates/homicide-1100-blk-of-15th-street/,Media Bulletins,Agency-Published Resources,HOMICIDE 1100-BLK OF 15TH STREET - Lynchburg Police Department,"",200,403 Forbidden,"[""HOMICIDE 1100-BLK OF 15TH STREET""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[],"" -249,https://www.antioch.il.gov/wpfb-file/04-19-16-police-pension-agenda-pdf/,Media Bulletins,Agency-Published Resources,"04-19-16 Police Pension Agenda - Antioch, IL",8427 04 19 16 police pension agenda pdf commissions fund agendas 2016 1460742126 02c861b2676b01cc56cb3a86703c52d6 213x300 _extdmrzqpxvu thumb jpg 15 12 42 06 0 pdf application trustees mary c dominiak ed macek jerry t johnson scott a pierce jay jozwiak ted p poulos lawrence m hanson mayor lori k folbrick village clerk agenda of antioch lake,200,"Home - Antioch, IL","[""04-19-16 Police Pension Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -250,https://delcopa.gov/publicrelations/releases/2020/pdf/citizencorpsorienationfeb21.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -251,https://piedmont.ca.gov/services___departments/police/transparency_portal/training_materials,Policies & Contracts,Info About Agencies,Training Materials - City of Piedmont,"",200,Just a moment...,"[""City of Piedmont""]",[],[],[],[],[],"Skip navigation City of Piedmont How Do I? {1} ##LOC[OK]## Services Building Inspections Building Permits Business Licenses Facility Rentals Garbage, Recycling, and Organic Waste Parks and Fields Permits & Licenses Preschool Recreation Programs Schoolmates Street Sweeping Departments Careers & Human Resources City Administrator City Clerk Finance Fire Planning & Building Police Public Works Recreation Government Americans with Disabilities Act Charter & City Code City Council Commissions & Committees Elections Forms & Applications Meeting Videos Bid and Proposal Opportunities City Projects News & Events News Events Stay Informed KCOM-TV About Piedmont Federal, State, & County Representatives Community Resources Schools Houses of Worship Public Transit Utilities Directions to City Hall Services Building Inspections Building Permits Business Licenses Facility Rentals Garbage, Recycling, and Organic Waste Parks and Fields Permits & Licenses Preschool Recreation Programs Schoolmates Street Sweeping Departments Careers & Human Resources City Administrator City Clerk Finance Fire Planning & Building Police Public Works Recreation Government Americans with Disabilities Act Charter & City Code City Council Commissions & Committees Elections Forms & Applications Meeting Videos Bid and Proposal Opportunities City Projects News & Events News Events Stay Informed KCOM-TV About Piedmont Federal, State, & County Representatives Community Resources Schools Houses of Worship Public Transit Utilities Directions to City Hall /UserFiles/Servers/Server_13659739/Image/Banner%20image%20-%20alternative.jpg Skip Sidebar Navigation Training Materials Transparency Portal Training Materials Use of Force Policy Last item for navigation City of Piedmont » Departments » Police » Transparency Portal » Training Materials Share This Print Page A+ Increase Font A- decrease font Piedmont Police Department training materials are made available to the public in compliance with Senate Bill 978. Police Officer Field Training Manual Communications Training Manual Investigations Training Manual Defensive Tactics Training Firearms Training City of Piedmont 120 Vista Avenue Piedmont, CA 94611 (510) 420-3040 Home Services & Departments Government Community & Events About Piedmont Calendar Stay Connected Youtube Facebook Page Twitter Page Instagram Page Linkedin Page City of Piedmont | All Rights Reserved | Powered by CivicLive | © 2024 Civiclive. Skip navigation City of Piedmont How Do I? City of Piedmont How Do I? City of Piedmont How Do I? City of Piedmont How Do I? " -252,https://police.birminghamal.gov/command-staff/lieutenant-richard-haluska/,Contact Info & Agency Meta,Info About Agencies,Lieutenant Richard Haluska | Birmingham Police Department,"",200,"Home | Police Department - Birmingham, AL","[""Birmingham Police Department Commitment | Excellence | Integrity""]","[""Putting People First"", ""Lieutenant Richard Haluska""]",[],"[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[],Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Search -253,https://cityofgulfbreeze.us/staff/police-general/,Contact Info & Agency Meta,Info About Agencies,Police General - City of Gulf Breeze,"",200,Home - City of Gulf Breeze,"[""Police General""]","[""What can we help you find?"", ""Mobile Menu"", ""Before Header"", ""Header Right"", ""Police General"", ""Primary Sidebar"", ""Footer""]","[""Colleagues"", ""Police Redlight"", ""Police Permits"", ""No Active Advisories"", ""City Projects"", ""Get Text Updates"", ""City of Gulf Breeze"", ""Most Requested"", ""County Agencies"", ""State Sites""]","[""South Santa Rosa Beneficial Reclaim Strategic Plan (BSRP) – Phase III"", ""Highpoint Water Main Replacement"", ""Eufaula Outfall Treatment Unit – RESTORE"", ""City Hall""]",[],[],"(850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos " -254,https://southamptontownnypolice.gov/1151/sustainability---transportation,Not Criminal Justice Related,Not Criminal Justice Related,"","",404,"","","","","","","","" -255,https://spdblotter.seattle.gov/2014/07/02/ive-got-a-pistol-too-man-tells-police-before-officer-involved-shooting/,Media Bulletins,Agency-Published Resources,"""I've Got a Pistol, Too"" Man Tells Police Before Officer-Involved Shooting - SPD Blotter","",200,403 Forbidden,"[""“I’ve Got a Pistol, Too” Man Tells Police Before Officer-Involved Shooting""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -256,https://www.southamptontownnypolice.gov/137/town-council-office,Not Criminal Justice Related,Not Criminal Justice Related,"Town Council Office | Southampton, NY - Official Website",Meet the town's council members.,200,"Police | Southampton, NY - Official Website","[""Town Council Office""]","[""Members"", ""About the Council""]","[""Site Tools"", ""Legal Authority"", ""Contact Us"", ""Paula Godfrey"", """", ""Tajea Anderson"", ""Hours:"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Town Council Office Town Council Office Members The supervisor delegates legislative and special committee assignments among the four councilpersons, and each councilperson is responsible for overseeing the legislative, community outreach, and constituent services and departmental coordination that is associated with each assignment. Constituents regularly seek the assistance of the Town Council office to act as advocates and to help resolve problems. Michael A. Iasilli Cyndi McNamara William Pell IV Tommy John Schiavoni About the Council The Town Council establishes policy and determines appropriate actions in response to the needs of the Town of Southampton and its residents. These decisions are put into effect by resolution and cover the following: citizen advocacy work, legislation, general town affairs, public buildings and property, health and sanitation, business and building restrictions, protection of persons and property, traffic and highways, and numerous other duties / issues. Legal Authority Pursuant to Town Law §60, the four elected Town Council members, together with the Town Supervisor, constitute the Town Board. The Town Board, pursuant to Town Law §64, among other things, exercises general management and control of Town finances, authorizes the acquisition and conveyance of any Town-owned property, manages Town property, fills vacancies in Town offices and awards Town contracts. Contact Us Paula Godfrey Legislative Aide Email Paula Godfrey Tajea Anderson Legislative Aide Email Tajea Anderson Ph: 631-287-5745 Hours: Monday-Friday 8:30 am – 4:00 pm Staff Directory Michael A. Iasilli, Councilperson William Pell IV, Councilperson Cyndi McNamara, Councilperson Tommy John Schiavoni, Councilperson Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -257,https://spdblotter.seattle.gov/2008/10/02/seattle-police-investigate-possible-attempt-abduction/,Media Bulletins,Agency-Published Resources,Seattle Police Investigate Possible Attempt Abduction - SPD Blotter,"",200,403 Forbidden,"[""Seattle Police Investigate Possible Attempt Abduction""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -258,https://sanfordfl.gov/wp-content/uploads/2020/07/police_employment.jpg,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -259,https://harrington.delaware.gov/links-forms/citizens-police-academy-flyer/,Poor Data Source,Poor Data Source,Citizen’s Police Academy Flyer - City of Harrington,"",200,Home - City of Harrington - Kent County Delaware,"[""HARRINGTON""]","[""Citizen’s Police Academy Flyer""]","[""Menu""]","["""", ""Quick Links"", ""To view City of Harrington Meeting Agendas, click on the Civic Web Logo above""]",[],[],Skip to Content Skip to Footer Toggle navigation Menu Home Government Mayor’s Corner City Council Meeting Minutes Past City Council Meeting Minutes Committees & Boards City Code Ordinances & Resolutions Departments City Hall Parks & Recreation Price Center Rentals Harrington Public Library Planning & Inspections Public Works Waste Water Info History Water Report Events Comprehensive Land Use Plan Maps Employment Opportunites News Trash & Recycling Important Links Business Listings Utilities & Tax Info Forms Vacant Commercial Lots Schools Churches & Religious Centers Community Cats Program Harrington Happenings Newsletter Harrington Historical Society Downtown District Map & Property Information Incentives Resources District Plan Presentations Police Mission & Goals Harrington Police Department Police Administrative Staff Chief’s Corner History of Police Chiefs Police Units Officer of the Year Sex Offender Registry Links & Forms Contact FOIA Request Contact Us Skip to Content Skip to Footer Toggle navigation Menu Home Government Mayor’s Corner City Council Meeting Minutes Past City Council Meeting Minutes Committees & Boards City Code Ordinances & Resolutions Departments City Hall Parks & Recreation Price Center Rentals Harrington Public Library Planning & Inspections Public Works Waste Water Info History Water Report Events Comprehensive Land Use Plan Maps Employment Opportunites News Trash & Recycling Important Links Business Listings Utilities & Tax Info Forms Vacant Commercial Lots Schools Churches & Religious Centers Community Cats Program Harrington Happenings Newsletter Harrington Historical Society Downtown District Map & Property Information Incentives Resources District Plan Presentations Police Mission & Goals Harrington Police Department Police Administrative Staff Chief’s Corner History of Police Chiefs Police Units Officer of the Year Sex Offender Registry Links & Forms Contact FOIA Request Contact Us Skip to Content Skip to Footer Toggle navigation Menu Home Government Mayor’s Corner City Council Meeting Minutes Past City Council Meeting Minutes Committees & Boards City Code Ordinances & Resolutions Departments City Hall Parks & Recreation Price Center Rentals Harrington Public Library Planning & Inspections Public Works Waste Water Info History Water Report Events Comprehensive Land Use Plan Maps Employment Opportunites News Trash & Recycling Important Links Business Listings Utilities & Tax Info Forms Vacant Commercial Lots Schools Churches & Religious Centers Community Cats Program Harrington Happenings Newsletter Harrington Historical Society Downtown District Map & Property Information Incentives Resources District Plan Presentations Police Mission & Goals Harrington Police Department Police Administrative Staff Chief’s Corner History of Police Chiefs Police Units Officer of the Year Sex Offender Registry Links & Forms Contact FOIA Request Contact Us CITY OF HARRINGTON DELAWARE CITY OF HARRINGTON DELAWARE CITY OF HARRINGTON DELAWARE CITY OF HARRINGTON DELAWARE -260,https://spdblotter.seattle.gov/2013/07/23/police-investigating-gunfire-in-rainier-beach/,Media Bulletins,Agency-Published Resources,Police Investigating Gunfire In Rainier Beach - SPD Blotter,"",200,403 Forbidden,"[""Police Investigating Gunfire In Rainier Beach""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -261,https://chandlerazpd.gov/2013/01/chandler-police-explorers-host-competition-2/,Media Bulletins,Agency-Published Resources,Chandler Police Explorers Host Competition – Chandler Police Department,"",200,Chandler Police Department,"[""Chandler Police Explorers Host Competition""]",[],"[""Quick Links"", ""News Archives"", """", """", """", """"]","[""January 17, 2013"", ""Contact"", ""About the Department"", ""Latest News"", ""Courage, Pride, Dedication © 2024 Chandler Police Department""]",[],[],"The Chandler Police Department main lobby will be closed for renovations. Please see below for further. The Chandler Police Department main lobby will be closed for renovations. Please see below for further. Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Home News Chandler Police Explorers Host Competition Home News Chandler Police Explorers Host Competition Search for: Chandler Police Explorers Host Competition January 17, 2013 By Sergeant J. Favazzo The Chandler Police Explorers Post will be hosting their annual Law Enforcement Explorer Tactical Competition throughout the City on Saturday, January 19, 2013, from 8:00 AM to 10:00 PM and on Sunday January 20, 2013, from 8:00 AM to 3:00 PM. The Command Center for the event will be at the Chandler Fire Academy, located at 3550 S. Dobson Road.  Information about various competitions and maps to the venues will be made available at the command center. The Chandler Police Explorers annual competition began in 1999 and has experienced continued and growing success each year.  Explorer Posts from around the state of Arizona and throughout the United States will be competing in this year’s events.  The competitions include police tactics such as hostage negotiations, building searches, pistol shooting, and other team and individual events.  Explorers will be able to use new firearms training technology, new to law enforcement and will debut at this year’s event. The law enforcement explorer programs are sponsored through their affiliated agencies as well as through Learning for Life, a subsidiary of the Boy Scouts of America.  The explorer program is for youth ages 14 to 20 interested in pursuing a career in law enforcement. Search for: Quick Links About the Department Office of the Chief Interim Chief Of Police Melissa Deanda Assistant Chief Of Police Dave Ramer Department Events My Precinct Fingerprinting Services Request a Police Report Bicycle Registration General Orders/Accreditation Alarm Information Registered Sex Offenders Citizen Observer (Ride-Along) Vehicle Impounds Barking Dog Police Open Data Public Demonstration Guidelines News Archives August 2022 September 2021 July 2021 September 2020 August 2020 June 2020 May 2020 April 2020 March 2020 February 2020 January 2020 December 2019 " -262,https://dps.georgia.gov/job-vacancy-announcement-georgia-capitol-police-officer-four-positions-0,Media Bulletins,Agency-Published Resources,Job Vacancy Announcement-Georgia Capitol Police Officer (Four Positions) | Georgia Department of Public Safety,Job Vacancy Announcement: Georgia Capitol Police Officer (Four Positions)Location: Capitol Police Division- Capitol Hill- Atlanta (Fulton County),200,Georgia Department of Public Safety,"[""Job Vacancy Announcement-Georgia Capitol Police Officer (Four Positions)""]","[""Main navigation"", ""Search this site"", ""Breadcrumb"", ""How can we help?"", ""About Us"", ""Get in Touch""]","[""Popular searches"", ""Call Us"", ""Visit"", ""Mail"", ""Hours""]",[],[],[],"" -263,http://www.longbeach.gov/police/press-releases/murder-investigation6/,Media Bulletins,Agency-Published Resources,MURDER INVESTIGATION (500 BLOCK OF RHEA STREET),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/8/2018 FOR IMMEDIATE RELEASE Press Release # 2018 Subject: MURDER INVESTIGATION (500 BLOCK OF RHEA STREET) Contact: Media Relations Detail (562) 570-7244 On Saturday, September 8, 2018, at approx. 2:00 a.m., officers were dispatched to the 500 block of Rhea Street to assist the Long Beach Fire Department with a person down call, which resulted in the death of male adult. When officers arrived, they located the victim on the sidewalk in front a residence, who had been struck in the upper torso by gunfire. The victim was determined deceased at the scene by Long Beach Fire. The Los Angeles County Coroner’s Office will determine the identity of the victim, and make notification to next of kin. There is no suspect information available. A motive or whether the shooting is gang-related is unknown and remains under investigation. Anyone with information regarding the incident is urged to call Long Beach Police Homicide Detectives Malcolm Evans and Robert Gonzales at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -264,https://police.greenvillesc.gov/faq.aspx?qid=317,Resources,Agency-Published Resources,FAQs • Where are you located?,"",200,"Police Department | Greenville, SC - Official Website",[],"[""▼ Municipal Court - General""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -265,https://southamptontownnypolice.gov/722/great-east-end-cleanup---2022,Poor Data Source,Poor Data Source,"Great East End Cleanup - 2024 | Southampton, NY - Official Website",Discover how to help clear up debris caused by illegal dumping.,200,"Police | Southampton, NY - Official Website","[""Great East End Cleanup - 2024"", ""Join Councilwoman Cyndi McNamara, for the 2024 Great East End Clean-Up, taking place on Saturday, April 27th and Sunday, April 28th"", ""Click Here to Register Registration Begins, March 1st""]",[],"[""Site Tools"", ""Download Instructions and Flyer"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Municipal Works - Waste Management Services & Programs Great East End Cleanup - 2024 Great East End Cleanup - 2024 Join Councilwoman Cyndi McNamara, for the 2024 Great East End Clean-Up, taking place on Saturday, April 27th and Sunday, April 28th Click Here to Register Registration Begins, March 1st Individuals and community groups are welcome to participate. Southampton Town will provide the garbage bags and a free pass to the Town recycling centers to dispose of the refuse. If you would like to participate − and we hope you do − all you need to do is select an area of public property such as a park, beach, trail, or roadside that is in need of cleaning. Then, complete the registration form online, by Wednesday, April 24. I emphasize that the site you select must be publicly maintained. The Town provides garbage bags and disposal passes for the Town recycling centers. Registrants may get these materials on: Monday, April 1st-Friday, April 26th between 8:30 am - 3:30 pm Southampton Town Hall, Citizens' Response Center - 116 Hampton Road, Southampton Public Safety & Emergency Management office - 27 Ponquogue Ave, Hampton Bays Download Instructions and Flyer 2024 Great East End Clean Up Poster 2024 Volunteer Instructions Guest Speaker STOP Program (Hazardous Waste) Public Education & Outreach Tours Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -266,http://www.ryepolice.us/parking/attachment/parkingappeal-2,Resources,Agency-Published Resources,Rye Police Department Parking Appeal Form - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Parking Appeal Form""]","[""Parking Appeal Form""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search Parking Appeal Form Home Parking Appeal Form Parking Appeal Form May 14, 2014 Parking Appeal Form Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers Posting.... Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search Parking Appeal Form Home Parking Appeal Form Parking Appeal Form May 14, 2014 Parking Appeal Form Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers Parking Appeal Form Home Parking Appeal Form Home Parking Appeal Form Parking Appeal Form May 14, 2014 Parking Appeal Form Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us " -267,https://www.roseville.ca.us/government/departments/electric_utility/about_us/building_and_renovation_copy/request_for_proposal_archived,Poor Data Source,Poor Data Source,Bids & RFP's - City of Roseville,"",200,Just a moment...,"[""City of Roseville""]","[""Bids & RFP's""]","[""City of Roseville""]",[],[],[],"" -268,https://www.knoxvilletn.gov/archived_news_stories/2009/knoxville_police_prepared_for_holiday_traffic,Media Bulletins,Agency-Published Resources,Knoxville Police Prepared For Holiday Traffic - City of Knoxville,communications*,200,Just a moment...,"[""Knoxville Police Prepared For Holiday Traffic"", ""Communications Director"", ""Knoxville Police Prepared For Holiday Traffic""]",[],[],[],[],[],Skip navigation {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## -269,https://coloradosprings.gov/police-department/article/news/colorado-springs-police-departments-k9-zev,Media Bulletins,Agency-Published Resources,Colorado Springs Police Department’s K9 Zev to get donation of body armor | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Colorado Springs Police Department’s K9 Zev to get donation of body armor""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -270,https://rexburg.us/police-identify-woman-killed-in-9-vehicle-crash-in-sandy/,Poor Data Source,Poor Data Source,"","",522,"","","","","","","","" -271,https://beaumonttexas.gov/beaumont-police-investigating-homicide-4300-woodlawn/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -272,https://delcopa.gov/sustainability/pdf/raise/trailplanappendixe.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -273,https://www.mass.gov/doc/chaves-david-v-boston-police-department-related-superior-court-order-42711/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -274,https://www.ci.vallejo.ca.us/our_city/departments_divisions/police_department,Contact Info & Agency Meta,Info About Agencies,Home - City of Vallejo Police Department,"",200,Just a moment...,"[""Our mission""]",[],"[""Vallejo Police Department""]",[],[],[],"" -275,https://www.mass.gov/doc/shackford-michael-v-boston-police-department-72414/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -276,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/041422blotter.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -277,https://www.ci.san-bernardino.ca.us/city_hall/police_department/emergency_management/cert/cert_basic_training,Not Criminal Justice Related,Not Criminal Justice Related,CERT Basic Training - City of San Bernardino,"",200,Just a moment...,"[""City of San Bernardino California""]","[""CERT Basic Training""]",[],[],[],[],Skip to Content -278,https://beaumonttexas.gov/beaumont-police-investigating-aggravated-robbery-2568-college/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -279,https://police.crystalmn.gov/police/community_outreach/run_for_leo,Misc Police Activity,Police & Public Interactions,"","",404,"","","","","","","","" -280,https://wyoming.delaware.gov/wp-content/uploads/sites/33/nggallery/3rd-annual-wyoming-police-department-fishing-derby/p1010878.jpg,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -281,http://www.longbeach.gov/police/press-releases/robbery-suspects-arrestd-and-charged/,Media Bulletins,Agency-Published Resources,ROBBERY SUSPECTS ARRESTD and CHARGED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/30/2017 FOR IMMEDIATE RELEASE Press Release # Subject: ROBBERY SUSPECTS ARRESTED and CHARGED Contact: Media Relations Detail (562) 570-5273 On November 30, 2017, felony charges were filed against a 23-year-old male and a 26-year-old male for their involvement in a robbery to a female motorist. On October 1, 2017, at approximately 10:00 PM, officers were dispatched to the 5200 block of East 2 nd Street regarding a female screaming.  The preliminary investigation found that a suspect, armed with a handgun, approached the victim, and demanded her property.  The suspect grabbed the victim’s purse and fled to an awaiting vehicle.  Fortunately, the victim was not injured during the robbery. Through their investigation, detectives learned that some of the loss was used at a convenience store in the City of Los Angeles.  After reviewing the video footage, detectives were able to identify the suspects . On November 28, 2017, detectives arrested 23-year-old Servando Hernandez in the 10000 block of San Anselmo in the city of South Gate.  Detectives also executed a search warrant at the suspect’s residence and recovered evidence, including a loaded handgun. On November 29, 2017, detectives arrested 26-year-old Wuilver Yovani Flores in 7900 block of Morton Avenue in the city of Los Angeles.  Detectives executed a search warrant at the suspect’s residence, recovering evidence related to the robbery. Today, the case was presented to the Los Angeles County District Attorney’s Office, which filed one count of robbery against Servando Hernandez and one count of robbery against Wuilver Yovani Flores.  Both suspects are being held at the Long Beach city jail.  Hernandez’s bail is $50,000 and Flores’s bail is $85,000.  Flores also had $35,000.00 in outstanding arrest warrants for charges related to narcotics and traffic violations. Anyone with information regarding this investigation is encouraged to call Robbery Detective JJ Johnson at (562) 570-5731. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -282,https://www.huntsvilleal.gov/huntsville-police-launch-summer-slowdown-campaign/,Media Bulletins,Agency-Published Resources,Huntsville Police Launch Summer Slowdown Campaign - City of Huntsville,"",200,403 Forbidden,"[""Huntsville Police Launch Summer Slowdown Campaign""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],"[""WATCH Summer Slowdown: Construction Zones"", ""Summer Slowdown: Daily Commute"", ""Summer Slowdown: Neighborhoods"", """"]","[""Browse By Month"", ""Browse By Category"", ""Share & Print""]",[],Main Menu Main Menu Residents Back Residents Animal Services Neighborhoods Public Safety Volunteer Cemeteries Pay a Ticket Streets & Transportation Water & Sewer Garbage & Recycling Parks & Recreation Resident Toolkit Business Back Business About Huntsville Big Picture GIS Maps & Data Employment Bid A Project Codes & Ordinances Economic Development File A Claim E-Bids Pay Taxes Licensing & Permits Development Back Development Bid A Project Economic Development MPO Streets & Roadwork Building & Construction GIS Maps Planning Water & Sewer Big Picture Master Plan Historic Preservation ePlans Submittal Environment Back Environment Air Quality Garbage & Recycling Noise Sustainability Find A Park Nature Preserves Recreation Water Trails & Greenways Pets Lost & Found Green Team Government Back Government Boards & Commissions City Council Finances & Budget Media Center City Calendar Departments Mayor's Office Municipal Court Vote Find A Job Codes & Ordinances Services Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate -283,https://ose.louisiana.gov/event/supervisor-of-police-records/,Poor Data Source,Poor Data Source,Supervisor of Police Records | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Supervisor of Police Records""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Supervisor of Police Records Promotional Level Posting Period 02/18/2022 - 03/07/22 Application Deadline 03/07/22 Jurisdiction Monroe Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Supervisor of Police Records Promotional Level Posting Period 02/18/2022 - 03/07/22 Application Deadline 03/07/22 Jurisdiction Monroe Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Supervisor of Police Records Promotional Level Posting Period 02/18/2022 - 03/07/22 Application Deadline 03/07/22 Jurisdiction Monroe Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Supervisor of Police Records Promotional Level Posting Period 02/18/2022 - 03/07/22 Application Deadline 03/07/22 Jurisdiction Monroe Application This event has passed. Supervisor of Police Records Promotional Level Posting Period 02/18/2022 - 03/07/22 Application Deadline 03/07/22 Jurisdiction Monroe Application This event has passed. Supervisor of Police Records Promotional Level Posting Period 02/18/2022 - 03/07/22 Application Deadline 03/07/22 Jurisdiction Monroe Application This event has passed. Supervisor of Police Records Promotional Level Promotional Level Promotional Level Posting Period 02/18/2022 - 03/07/22 Application Deadline 03/07/22 Jurisdiction Monroe Posting Period 02/18/2022 - 03/07/22 Application Deadline 03/07/22 Jurisdiction Monroe Posting Period 02/18/2022 - 03/07/22 Application Deadline 03/07/22 Jurisdiction Monroe Posting Period 02/18/2022 - 03/07/22 Posting Period Application Deadline 03/07/22 Application Deadline Jurisdiction Monroe Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -284,https://alpha.austin.gov/es/police-oversight/2021-03-05-7/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -285,https://alpha.austin.gov/police-oversight/formal-complaint-follow-up-investigations/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -286,http://www.ryepolice.us/logs/police-logs-for-4-8-20-4-15-20,Daily Activity Logs,Info About Officers,Rye Police Department Police Logs for 4/8/20-4/15/20 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs for 4/8/20-4/15/20""]","[""Police Logs for 4/8/20-4/15/20""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"" -287,http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested-and-charges-filed/,Media Bulletins,Agency-Published Resources,ROBBERY SUSPECT ARRESTED AND CHARGES FILED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/9/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: ROBBERY SUSPECT ARRESTED; CHARGES FILED Contact: Media Relations Detail (562) 570-5273 On July 7, 2015, felony charges were filed against a 20-year-old Long Beach man in connection with a residential robbery and burglary. On June 17, 2015, around 10:00 a.m., Long Beach Police were dispatched to a burglary in the 6600 block of Indiana Avenue. Their preliminary investigation revealed that the victim had come home and was startled with the presence of a suspect. The suspect immediately pointed a handgun at the victim. Believing he was going to be shot, the victim fled. The suspect exited the residence. Fortunately, the victim was not injured. During the investigation, Robbery detectives learned that the same suspect also committed a burglary in the 6600 block of Indiana Avenue earlier in the day. While investigating the matter, detectives were able to identify 20-year-old Tajiye Muhommad. On Friday, July 3, 2015, detectives received an anonymous tip that the suspect frequents the area of Locust Avenue and 21 Street and subsequently arrested Tajiye Muhommad without incident. As detectives continued investigating the matter, they learned that a residence in the 11000 block of Centralia Road in Hawaiian Gardens had evidence related to the robbery. On July 7, 2015, SWAT officers executed a search warrant in the City of Hawaiian Gardens and located three firearms. The case was presented to the Los Angeles County District Attorney’s Office for review and on July 7, 2015, Muhommad was charged with one count of residential robbery, one count of residential burglary, and one count of possession of a firearm by a felon. Tajiye Muhommad remains in the Los Angeles County Jail without bail. Anyone with information regarding this investigation is encouraged to call the Long Beach Police Department Robbery Detail at (562) 570-7464. Anyone wishing to remain anonymous may call 1-800-22-TIPS (8477),or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -288,https://delcopa.gov/ich/resources/healthclinics.html,Not Criminal Justice Related,Not Criminal Justice Related,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -289,https://www.mass.gov/doc/revocation-establishment-and-merging-of-police-promotional-eligible-lists-4/download,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -290,https://champaignil.gov/tag/coffee-with-a-cop/,Misc Police Activity,Police & Public Interactions,Coffee with a Cop Archives - City of Champaign,"",200,403 Forbidden,"[""Items tagged: Coffee with a Cop""]","[""Champaign Police Join Community for Coffee with a Cop"", ""Champaign Police Pull Up a Chair for Coffee with a Cop"", ""Champaign Police Announces Return of “Coffee with a Cop”"", ""Champaign Police Invite Community Members for Coffee and Conversation"", ""Champaign Police Invite Community Members for Coffee and Conversation"", ""News Releases"", ""Department News""]",[],[],[],[],"" -291,https://coloradosprings.gov/police-department/article/news/update-attempted-homicide-4300-block,Media Bulletins,Agency-Published Resources,Update: Attempted Homicide 4300 block of Airport Road | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Update: Attempted Homicide 4300 block of Airport Road""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -292,https://www.sanramon.ca.gov/our_city/departments_and_divisions/police/srpd_calendar,Poor Data Source,Poor Data Source,SRPD Calendar - City of San Ramon,"",200,Just a moment...,"[""SRPD Calendar""]","[""Contact Us"", ""Useful Links""]",[],[],[],[],"" -293,https://alpha.austin.gov/es/police-oversight/formal-complaint-family-violence-involving-mental-illness-and-other-policy-violations/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -294,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0765/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -295,https://delcopa.gov/publicrelations/releases/2021/covid_vaccinebooster.html,Media Bulletins,Agency-Published Resources,"Delaware County COVID-19 Task Force Offering COVID-19 Vaccine Booster Beginning Sept. 28 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County COVID-19 Task Force Offering COVID-19 Vaccine Booster Beginning Sept. 28""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -296,https://ridgelandsc.gov/police-department/daily-crime-reports-may,Crime Maps & Reports,Agency-Published Resources,Town of Ridgeland,Town of Ridgeland,200,Town of Ridgeland,"[""Police Department""]","[""Daily Crime Reports - May""]",[],[],[],[],"HOME GOVERNMENT Government Mayor Town Council Boards & Commissions Board, Commission, & Committee Vacancies Town Council Meeting Agendas Town Council Videos Resources Bid Opportunities Public Meeting Agendas Financial Documents DEPARTMENTS Executive Finance, HR and Risk Management Municipal Court Planning and Community Development Police Department Fire Department Water & Sewer BUSINESS Bid Opportunities Building Permits & Forms Business License Information Economic Development Opening a Business Public Meeting Agendas Resources Zoning Maps COMMUNITY About Ridgeland Battle of Honey Hill Community Events Job Opportunities Maps Gallery News & Information Ordinances Parks & Trails Public Safety/Utilities Schools Services Town of Ridgeland Farmers Market I WANT TO... Contact a Staff Member File a FOIA Request Find Out About Trash Collection Service Find the Police Department Find the Fire Department Find Town Hall Find Zoning Maps Learn About Services Pay a Traffic Fine Pay My Water Bill I Want Water/Sewer Service Rent Lakeside at Blue Heron HOME GOVERNMENT Government Mayor Town Council Boards & Commissions Board, Commission, & Committee Vacancies Town Council Meeting Agendas Town Council Videos Resources Bid Opportunities Public Meeting Agendas Financial Documents DEPARTMENTS Executive Finance, HR and Risk Management Municipal Court Planning and Community Development Police Department Fire Department Water & Sewer BUSINESS Bid Opportunities Building Permits & Forms Business License Information Economic Development Opening a Business Public Meeting Agendas Resources Zoning Maps COMMUNITY About Ridgeland Battle of Honey Hill Community Events Job Opportunities Maps Gallery News & Information Ordinances Parks & Trails Public Safety/Utilities Schools Services Town of Ridgeland Farmers Market I WANT TO... Contact a Staff Member File a FOIA Request Find Out About Trash Collection Service Find the Police Department Find the Fire Department Find Town Hall Find Zoning Maps Learn About Services Pay a Traffic Fine Pay My Water Bill I Want Water/Sewer Service Rent Lakeside at Blue Heron HOME GOVERNMENT Government Mayor Town Council Boards & Commissions Board, Commission, & Committee Vacancies Town Council Meeting Agendas Town Council Videos Resources Bid Opportunities Public Meeting Agendas Financial Documents DEPARTMENTS Executive Finance, HR and Risk Management Municipal Court Planning and Community Development Police Department Fire Department Water & Sewer BUSINESS Bid Opportunities Building Permits & Forms Business License Information Economic Development Opening a Business Public Meeting Agendas Resources Zoning Maps COMMUNITY About Ridgeland Battle of Honey Hill Community Events Job Opportunities Maps Gallery News & Information Ordinances Parks & Trails Public Safety/Utilities Schools Services Town of Ridgeland Farmers Market I WANT TO... Contact a Staff Member File a FOIA Request Find Out About Trash Collection Service Find the Police Department Find the Fire Department Find Town Hall Find Zoning Maps Learn About Services Pay a Traffic Fine Pay My Water Bill I Want Water/Sewer Service Rent Lakeside at Blue Heron " -297,https://alpha.austin.gov/police-oversight/formal-complaints-de-escalation-of-potential/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -298,https://delcopa.gov/courts/pdf/emergencyjudicialorders/fourthorderextendingstayofresidentialpropertyejectment.pdf,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -299,https://delcopa.gov/publicrelations/releases/2020/councilreforms.html,Not Criminal Justice Related,Not Criminal Justice Related,"During Their First Public Meeting Delaware County Council Announces Reforms to Make Government More Open and Accessible to Residents and Workers - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""County Council Announces Reforms""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],"["""", ""New Majority Announces Public Process to Develop and \n\t\t Implement Broad Ethics and Government""]",[],"" -300,http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested---charges-filed/,Media Bulletins,Agency-Published Resources,ROBBERY SUSPECT ARRESTED & CHARGES FILED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/31/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: ROBBERY SUSPECT ARRESTED & CHARGES FILED Contact: Media Relations Detail (562) 570-5273 On October 30, 2014, multiple felony charges were filed against 36-year-old Long Beach resident Kendrick Chester for his involvement in an armed street robbery and criminal threats. On October 21, 2014, Chester entered a business in the area of Pine Avenue and Pacific Coast Highway and threatened to harm the business owner. While threatening the business owner, the suspect simulated he had a firearm. The suspect later fled the business. On October 24, 2014, while armed with a handgun, Chester approached a victim in the 2100 block of Pine Avenue and demanded property from the victim. In fear of his life, the victim gave the suspect his property. While fleeing the scene, West Division Patrol Officers located the suspect and arrested him. The victim’s loss and a loaded firearm were recovered. While Robbery Detective Collier was assigned to investigate the robbery arrest, the suspect bailed out of jail. On October 28, 2014, Patrol Officers were dispatched to a “shots call” in the 200 block of East Burnett. While investigating the call, officers located Chester and when they attempted to speak to him, he ran. Patrol Officers subsequently located and arrested Chester. During the course of their investigation, officers located a loaded firearm near the suspect. The investigation remains ongoing. On October 30, 2014, Robbery Detectives presented the case to the Los Angeles County District Attorney’s Office, which charged one count of armed robbery and criminal threats against Chester. Kendrick D. Chester is currently being held in Los Angeles County Jail on $250,000 bail. Anyone who may have been the victim of a robbery, or have information regarding these crimes is asked to contact Long Beach Robbery Detective Don Collier at (562) 570-5537. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -301,https://champaignil.gov/tag/champaign-police-officers/,Poor Data Source,Poor Data Source,Champaign Police Officers Archives - City of Champaign,"",200,403 Forbidden,"[""Items tagged: Champaign Police Officers""]","[""Champaign Police Respond to Call for Service; Two Officers Shot, Suspect Deceased"", ""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Items tagged: Champaign Police Officers Search Champaign Police Respond to Call for Service; Two Officers Shot, Suspect Deceased Posted: May 19, 2021 On May 19, 2021, at approximately 3:24 a.m., Champaign Police responded to the 2400 block of North Neil Street for a domestic disturbance. Upon arrival, two Champaign Police Officers exited their vehicles, and the preliminary investigation indicates they encountered an armed individual and gunfire was exchanged. The suspect was fatally wounded and pronounced deceased on […] Categories: Police Department Press Releases | Tags: Champaign County Sheriff’s Office. , Champaign Police Officers , Illinois State Police , Officers sustained gunshot wounds , University of Illinois Police Department , Urbana Police Department Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works " -302,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-25-fitness-payment,Media Bulletins,Agency-Published Resources,State Police Bulletin No. SP-25 | Office of the New York State Comptroller,Investigators and Senior Investigators in bargaining unit 62 are entitled to their final fitness payment,200,Office of the New York State Comptroller | Thomas P. DiNapoli,"[""State Police Bulletin No. SP-25"", """"]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Employees Affected"", ""Payroll Register/Check Stub"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[],"" -303,https://delcopa.gov/planning/pdf/applicationforact247review.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -304,http://www.police.wallingfordct.gov/divisions/,Contact Info & Agency Meta,Info About Agencies,"Divisions | Wallingford, CT Police Department","The Wallingford Police Department consists of six divisions as well as several units, each with their own area of responsibility in keeping our town safe.",200,"Wallingford, CT Police Department","[""Divisions""]",[],[],[],[],[],"‹ Close Menu About Us Our Team Who We Serve Our History Police Station Project Divisions Records Division Traffic Division Investigative Services Division Professional Standards & Training Division Patrol Division Community Impact Unit Public Safety Communications Center Emergency Response Team Field Training & Evaluation Program How Do I? Pistol Permits Fingerprinting Accident Reports Case Reports Traffic Violations Pay a Parking Ticket Hire a Cop Alarm Registration Careers Current Employment Opportunities Forms & Resources Bingo, Bazaar & Raffle Documents Precious Metal Application Secondhand Application Pawnbroker Application Vending Application News & Events Road Closures & Detours Agency Events & Programs Press Releases Photo Gallery Video Gallery Wallingford PBA Contact Divisions Divisions The Wallingford Police Department consists of the following divisions: Records Division Traffic Division Investigative Services Division Professional Standards & Training Division Patrol Division Community Impact Unit Public Safety Communications Center (Dispatch) Emergency Response Team Field Training & Evaluation Program The Wallingford Police Department consists of the following divisions: Records Division Traffic Division Investigative Services Division Professional Standards & Training Division Patrol Division Community Impact Unit Public Safety Communications Center (Dispatch) Emergency Response Team Field Training & Evaluation Program Location: 135 North Main Street Wallingford, CT 06492 Tel: (203) 294-2800 Fax: (203) 294-2882 Administrative Office: Monday through Friday 8 am – 4 pm Site Map Privacy Policy Accessibility Statement Anonymous Tip Form Town of Wallingford Location: 135 North Main Street Wallingford, CT 06492 Tel: (203) 294-2800 Fax: (203) 294-2882 Administrative Office: Monday through Friday 8 am – 4 pm Site Map Privacy Policy Accessibility Statement Anonymous Tip Form Town of Wallingford Web Solutions © 2022 – 2024 Wallingford Police Department. All rights reserved. Web Solutions © 2022 – 2024 Wallingford Police Department. All rights reserved. " -305,http://lafayettepolice.us/3391/census-2020,Not Criminal Justice Related,Not Criminal Justice Related,"Census 2020 | Lafayette, IN - Official Website",Complete Count Committee resources,200,"Police Department | Lafayette, IN - Official Website","[""Census 2020"", ""The Census: Your Response Matters!"", ""CENSUS IS HIRING IN GREATER LAFAYETTE!""]","[""Health clinics. Fire departments. Schools. Even roads and highways. The census can shape many different aspects of your community."", ""Learn more about the Census and why it’s so important""]","[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home Our Community Census 2020 Census 2020 The Census: Your Response Matters! Health clinics. Fire departments. Schools. Even roads and highways. The census can shape many different aspects of your community. Check back for a link to complete your form online! CENSUS IS HIRING IN GREATER LAFAYETTE! The U.S. Census Bureau is actively recruiting people for a variety of temporary jobs in Tippecanoe County, including census takers, recruiting assistants, and more. Candidates must complete an online job application. The application includes assessment questions about your education, work, and other experience. Qualified candidates must be at least 18 years of age and pass a background check. For more information, please visit: 2020 Census Jobs or call 1-855-JOB-2020. Learn more about the Census and why it’s so important Video: What is the 2020 Census? Video: How Will 2020 Census Data Be Used? Video: How Does the 2020 Census Affect Representation? Video: How Do I Take the 2020 Census? Video: Is My 2020 Census Data Safe? Factsheet: Census Safety and Security Factsheet: Census Confidentiality ACCESS LOCAL DATA Learn about our community, county, state and the U.S. Aquatics Greater Lafayette Climate Action Plan Columbian Park Zoo Community Events Community Information Area Neighborhoods Arts & Entertainment Awards Garage Sale Permit Lafayette Schools & High Schools Parking & Traffic Services Special Event Permit Application & Rules Snow Removal Visit Lafayette / West Lafayette Community Voice Contractors & Designers Digital Media Center Demolition Ordinance Fire Safety Practices Historic Home Repairs Homeless & Community Outreach Housing & Urban Development Lafayette Downtown Lafayette in Bloom Large Items: Trash Pickup Information Leaf Collection Neighborhood Services Open Burn Policy Parks & Facilities Rain Barrels Rain Gardens Recycling Report a Concern Water Wisdom Did You Know Combined Sewer Overflow (CSO) Right of Way Mowing Road Updates SIA Playground Smoke Alarms & Detectors Snow Removal Surfing the Internet Safely Trash Collection Schedule Unique Trash Items: Disposal & Recycling Water & Sewer Rates Weight & Fitness Pass Fees Wild Tykes Play Zone Amusement Area Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -306,https://mattoon.illinois.gov/government/police-department/police-officer-hiring/,Training & Hiring Info,Info About Officers,"Police Officer Hiring Information - City of Mattoon, Illinois","Becoming a Police Officer Candidates are hired from a list maintained by the Police & Fire Board, created from a pool of applicants who participate in a series of tests. Applications to participate in a test are accepted for a period of time prior to each test. Look for open application periods on the",200,"Official Website - City of Mattoon, Illinois","[""Becoming a Police Officer""]",[],"[""Mattoon Police Department Contact Information"", ""Police Department Links"", ""City Departments""]","[""Popular Links"", ""Business"", ""City Employees"", ""Residents"", ""Mattoon City Info""]",[],[],"Official Government Website for the City of Mattoon, Illinois Official Government Website for the City of Mattoon, Illinois Jump to... Home Government Residents Visitors Business Bids/RFPs About Utilities Make a Payment Public Notices Info Contact Police Officer Hiring Information Municipal Staff 2021-08-21T18:41:36-05:00 Home Government Police Department Police Officer Hiring Information Becoming a Police Officer Candidates are hired from a list maintained by the Police & Fire Board, created from a pool of applicants who participate in a series of tests. Applications to participate in a test are accepted for a period of time prior to each test. Look for open application periods on the City’s Employment Opportunities page . The application process is managed by IOS Solutions . The Mattoon Police Department has an application period open as of December 11, 2021. Learn more on the Police Officer Employment Opportunity page , or download the 2021 Application Process Details (PDF) . Search for: Mattoon Police Department Contact Information Chief of Police: Sam Gaines Deputy Chief: Ryan Hurst Emergency – Dial 911 Non-Emergency Phone: 217-235-5451 Administration: 217-258-7901 1710 Wabash Avenue Mattoon, Illinois 61938 Find the Mattoon Police Department on Facebook Police Department Links Burglary Prevention Tips Coles County Crimestoppers Fraudulent Checks Halloween Safety Tips Identity Theft Tips Illinois State Police Sex Offender Registry School Campus Safety Guide City Departments City Administrator City Attorney City Clerk City Council Code Enforcement Dodge Grove Cemetery Finance Department Finance Director Fire Department Mattoon Public Library Mayor Parks & Recreation Police Department Public Works Department Tourism Department Mattoon City Hall 208 North 19th Street Mattoon, Illinois 61938 Phone: 217-235-5654 Open Monday – Friday 8:00 a.m. – 4:30 p.m. Popular Links Pay My Bill Lakes Government Information & Documents Residents Police Department City Council Meetings Visitors Code of Ordinances Home Business Bids/RFPs TIF Info & Business Maps Chamber of Commerce TIF and BDD Programs City Employees City E-mail Human Resources Files Employment Residents Contact Pay Your Water Bill Activate Water Service Disconnect Water Service Recycling Program Suspended Parks & Recreation Report a Problem Ask a Question Mattoon City Info News Map of the City FOIA Requests Mattoon Arts Council Churches Clubs & Organizations Utilities © 2019- City of Mattoon, Illinois. All rights reserved. Website designed & hosted by Blue Heron Website Design . Sitemap | Privacy Policy " -307,https://www.elburn.il.us/village-staff-directory/name/police-and-fire-emergencies/,Poor Data Source,Poor Data Source,"Police and Fire Emergencies | Village Staff Directory | Village of Elburn, Illinois","",200,"Home | Village of Elburn, Illinois","[""Police and Fire Emergencies | Village Staff Directory""]","[""Police and Fire Emergencies""]",[],[],"[""Links"", ""Main Contact Info"", ""Follow Us""]",[],"Village of Elburn | (630) 365-5060 | M-F 7:00AM - 3:30PM View/Pay Water Bill Report A Problem Contact Us MENU MENU Home Government Administration Village Administrator Village Code Finance & Human Resources Clerk & Treasurer Police Department Auto Stickers & Parking Permits Child Safety Seat Crime Prevention Forms and Documents Laws/Ordinances Links of Interest Metra Information Metra FAQ Online Reporting Registered Sex Offenders Police Department FAQ Building & Zoning Homeowner Improvement Codes & Ordinances Commercial Permits Construction Benchmarks Digging? Call Julie Public Works Direct Debit Enrollment Water Bill Payment Water Reports Water Restrictions Water & Sewer Rates NPDES Phase II Economic Development Comprehensive Plan Demographics Escrow Policies Consultants Boards & Commissions Agendas & Minutes Village Board Planning/Zoning Board Tree Board Parks Commission Police Commission Police Pension Board Transparency Annual Meeting Calendar Agendas & Minutes Administrator Contact Info Village Board Contact Info FOIA Requests Budgets & Financial Audits Salary & Benefits Info Treasure's Reports Employer Cost & Participation Info Bills Lists Elburn Property Taxes Sales & Other Taxes Document Library Business & Development Available Space Available Commercial Space Available Industrial Space Business Resources Downtown Facade Program Elburn Chamber of Commerce Places for Eating Tax Illinois Gaming Tax Sales Tax Rates in Elburn For Residents Services Child Safety Seat Certified Installation CodeRED Community Notifications Town & Country Public Library Utility Contacts Utility Tax Rebate for Seniors Vacation Watch Waste & Recycling Property Taxes Homeowner and Senior Citizen Exemptions Property Tax Extension Limitation Law Sample Tax Bill Special Service Areas Real Estate Transfer Taxes Enjoy Elburn Festivals, Parades & More History of Elburn Recreation & Leisure How Do I Apply For Bike Rack Installation Block Party/Special Event Permit Building Permits Employment FOIA Request Recommending Commission or Board Residential Parking Permit Find Agendas & Minutes Bids & Projects Child Safety Seat Certified Installation Codes & Ordinances Document Library Meetings & Events Metra FAQ Police Dept. FAQ Water Bill Online Contact Report an ADA Grievance Report A Problem Police for Non-Emergencies Utility Contacts Village Department Directory Pay Ordinance or Parking Citation Taxes Water Bill Police and Fire Emergencies | Village Staff Directory Home Police and Fire Emergencies | Village Staff... Go back to directory. Add to Address Book. Police and Fire Emergencies Work ELBURN IL 60119 work Work Phone : 9-1-1 work No Image Available We are and shall be an innovative community that maintains small town values while working to: Enhance the quality of life of our residents; Promote and Support our businesses; and Welcome new opportunities which enable the Village of Elburn to be the ideal place to live, work, worship, and play. Links Agendas & Meeting Minutes Bids & Projects Building & Zoning Codes & Ordinances Employment Events & Meetings FOIA Latest News View/Pay Water Bill Main Contact Info Hours: Mon-Fri: 7:00am - 3:30pm Phone: (630) 365-5060 Fax: 630-365-5063 301 E. North St., Elburn, IL 60119 Follow Us Village of Elburn © 2024 All Rights Reserved.  All images are Copyrighted.  Images cannot be printed, used, downloaded, or screenshot. " -308,http://lafayettepolice.us/3469/gis-zoning-maps,Not Criminal Justice Related,Not Criminal Justice Related,"GIS & Zoning Maps | Lafayette, IN - Official Website","Check whether you are in city limits, what your zoning is and property owner information.",200,"Police Department | Lafayette, IN - Official Website","[""GIS & Zoning Maps""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home Government Departments A - F Engineering & Public Works Permits & Licensing GIS & Zoning Maps GIS & Zoning Maps County GIS & Zoning Maps - Check your zoning. City Limits Map - Check whether your property is in city limits. Beacon - Check property owner information. Applications Building Permits Commercial Projects Residential Projects Online Services Construction Guidelines and Standards Electrical Licenses GIS & Zoning Maps License, Bonding & Insurance Information Permit Fees Permit Report - Monthly Permit Report - Weekly Policy and Guidance Regulations and Codes Search Permit Records Online Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home Government Departments A - F Engineering & Public Works Permits & Licensing GIS & Zoning Maps GIS & Zoning Maps County GIS & Zoning Maps - Check your zoning. City Limits Map - Check whether your property is in city limits. Beacon - Check property owner information. Applications Building Permits Commercial Projects Residential Projects Online Services Construction Guidelines and Standards Electrical Licenses GIS & Zoning Maps License, Bonding & Insurance Information Permit Fees Permit Report - Monthly Permit Report - Weekly Policy and Guidance Regulations and Codes Search Permit Records Online Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -309,https://www.antioch.il.gov/event/police-and-fire-commission/,Poor Data Source,Poor Data Source,"Police and Fire Commission - Antioch, IL","",200,"Home - Antioch, IL","[""Police and Fire Commission""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -310,http://www.rocklin.ca.us/news/rocklin-appoints-police-chief-chad-butler-interim-city-manager,Media Bulletins,Agency-Published Resources,Rocklin Appoints Police Chief Chad Butler as Interim City Manager - City of Rocklin,"",200,City of Rocklin - The Official Site of the City of Rocklin,"[""City of Rocklin"", ""Rocklin Appoints Police Chief Chad Butler as Interim City Manager""]","[""Facebook"", ""Twitter"", ""Instagram"", ""Contact Us"", ""Agendas & Minutes"", ""Calendar"", ""Departments"", ""Municipal Code"", ""Public Hearing Notices"", ""Transparency"", ""Website Feedback"", ""Share this page"", ""This item appears in"", ""Locations"", ""City Hall"", ""Corp Yard"", ""Historical Sites"", ""Fire Administration"", ""Parks"", ""Police Station"", ""Quarry Park"", ""Resources"", ""Accessibility / ADA Information"", ""Employment"", ""Bids and RFPs"", ""Sitemap"", ""Volunteer"", ""Web Policies"", ""Connect"", ""Contact Us"", ""City Newsroom"", ""City Phone Numbers"", ""eNewsletter Signup"", ""Social Media"", ""Get Started"", ""City Council Agendas"", ""Agendas & Public Notices"", ""Quarry Park"", ""Job Openings"", ""Rent a Venue"", ""Report a Community Issue"", ""View Traffic Alerts"", ""Police Department"", ""Proud Partners"", ""Quarry Park"", ""Astound Broadband"", ""Rocklin, California"", ""Commands"", ""Log in""]",[],[],[],[],Skip to main content Skip to site navigation -311,https://www.rentonwa.gov/city_hall/police/administrative_services/community_programs/renton_police_safe_place,Resources,Agency-Published Resources,Renton Police Safe Place - City of Renton,"",200,Just a moment...,"[""CITY OF RENTON WASHINGTON""]","[""Renton Police Safe Place""]",[],"[""How It Works"", ""The Importance of Reporting Hate Crimes"", ""Ways to Report Hate Crimes"", ""Information for Participating Businesses and Organizations"", ""How can my business or organization participate?"", ""What are my responsibilities?"", ""Our Partners""]","[""Renton PD Safe Place Program Liaison""]","[""Ofcr. Roseanne Hynes""]",Skip navigation -312,https://police.greenvillesc.gov/1757/reserve-a-conference-room,Not Criminal Justice Related,Not Criminal Justice Related,"My Account • Greenville, SC • CivicEngage","Engage your community – connect to news, events and information you care about.",200,"Police Department | Greenville, SC - Official Website","[""Website Sign In""]","[""Sign In""]","[""Loading""]",[],[],[],"Skip to Main Content Government Departments Business Visitors Residents Search Home My Account Website Sign In For a more interactive experience please sign in. Sign In When using an existing account, you will be redirected to the CivicPlus sign in page. Existing Account Create An Account Sign In with SSO Facebook Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility Site Map Web Policy and Copyright Webmail /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Home My Account Website Sign In For a more interactive experience please sign in. Sign In When using an existing account, you will be redirected to the CivicPlus sign in page. Existing Account Create An Account Sign In with SSO Facebook Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility Site Map Web Policy and Copyright Webmail /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Home My Account Website Sign In For a more interactive experience please sign in. Sign In When using an existing account, you will be redirected to the CivicPlus sign in page. Existing Account Create An Account Sign In with SSO Facebook Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility Site Map Web Policy and Copyright Webmail /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Home My Account Website Sign In For a more interactive experience please sign in. Sign In When using an existing account, you will be redirected to the CivicPlus sign in page. Existing Account Create An Account Sign In with SSO Facebook Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility Site Map Web Policy and Copyright Webmail /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Government Departments Business Visitors Residents Search Government Departments Business Visitors Residents Search Search Search Search Search Search Search Search Search Home My Account Website Sign In For a more interactive experience please sign in. Sign In When using an existing account, you will be redirected to the CivicPlus sign in page. Existing Account Create An Account Sign In with SSO Facebook Home My Account Website Sign In For a more interactive experience please sign in. Sign In When using an existing account, you will be redirected to the CivicPlus sign in page. Existing Account Create An Account Sign In with SSO Facebook " -313,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/march-16-activity-report/,Incident Reports,Police & Public Interactions,March 16 Activity Report - Town of Cheswold,"",200,"Home - Town of Cheswold - Kent County, Delaware","[""Cheswold""]","[""Delaware"", ""March 16 Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[],"Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Cheswold Delaware Listen March 16 Activity Report March 16 Activity Report Cheswold Delaware Listen March 16 Activity Report March 16 Activity Report Listen March 16 Activity Report March 16 Activity Report Listen March 16 Activity Report March 16 Activity Report Listen March 16 Activity Report March 16 Activity Report Listen Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form " -314,https://alpha.austin.gov/police-oversight/formal-complaint-acts-bringing-discredit-4/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -315,https://coloradosprings.gov/police-department/page/colorado-springs-police-cadet-program-0,Resources,Agency-Published Resources,Colorado Springs Police Cadet Program | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Colorado Springs Police Cadet Program""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],"["""", """", ""Colorado Springs Police Cadet Program"", ""Program Requirements"", ""Activities"", ""Training"", ""Application""]","[""REPORT ONLINE""]",[],"" -316,https://delcopa.gov/employment/jobpostings/dba.html,Not Criminal Justice Related,Not Criminal Justice Related,"Database Administrator - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Database Administrator""]",[],"[""Delco Jobs Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Summary"", ""Essential Duties"", ""Qualifications"", ""Contact""]",[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Database Administrator Home / Departments / Delco Jobs / Database Administrator Job Opening: Database Administrator Department: Information Technology Posting Date: August 3, 2022 Salary: $93,000 annual Summary The Database Administrator will utilize their experience in database administration, database performing tuning, and SQL high availability features to manage databases withing our current environment. The Database Administrator will provide recommendations for architecture changes, standard maintenance routines, and provide details for creating redundancy in the SQL environment. The Database Administrator will also be responsible for day-to-day support, troubleshooting, performing required updates to SQL, and participation on project teams. This position will be performed via a combination of on-site and remote work. Experience with Access and Oracle databases. Managing and migrating databases to cloud a big plus (Azure or AWS). Essential Duties Provides hands-on operational support to databases Configures and maintains database servers and processes, including monitoring of system health and performance Deploy SQL High Availability features to ensure database redundancy for production applications Identifies performance issues and carries out Performance Tuning Experience with managing or migrating database environments to the cloud. Deploy new databases\database servers as needed Refines and automates regular processes, tracks issues, and documents changes Shares technical expertise, providing technical mentorship and cross-training to other peers and team members Document all routine procedures Other duties as assigned Qualifications At least 5 years of experience as a SQL DBA Experience with High Availability features in SQL Proficient with Windows servers and Active Directory Ability to deploy and troubleshoot SQL servers in a virtual environment Proficient with Stored Procedures, creating and altering tables Experience with backups and restores Excellent written and verbal communication Knowledge of backup solutions Residence Requirement: The County of Delaware has a residency requirement for employees. Anyone applying for this job must reside in Delaware County or be willing to move to the County within three months of starting employment. Contact To apply, please fill out our online application form . Delco Jobs Navigation By Title By Location How to Submit an Application Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu " -317,https://champaignil.gov/2020/08/18/chief-of-police-anthony-cobb-issues-statement-regarding-vandalism-of-champaign-police-department/,Media Bulletins,Agency-Published Resources,Chief of Police Anthony Cobb Issues Statement Regarding Vandalism of Champaign Police Department - City of Champaign,"",200,403 Forbidden,"[""Chief of Police Anthony Cobb Issues Statement Regarding Vandalism of Champaign Police Department""]","[""News Releases"", ""Department News""]",[],[],[],[],"" -318,https://champaignil.gov/police/news-data/police-body-cameras/,Media Bulletins,Agency-Published Resources,Police Body Cameras - City of Champaign,"",200,403 Forbidden,"[""Police Body Cameras"", ""Frequently Asked Questions"", ""Policy and Reports""]","[""Police Department"", ""Quick Links"", ""Police Department News"", ""Contact Us""]",[],"[""Q: Do all CPD Officers wear body cameras?"", ""Q: Where are body cameras placed on the officer’s uniform?"", ""Q: Does the officer need to ask my consent to record?"", ""Q: What if I don’t want to be recorded?"", ""Q: Are police body cameras on at all times?"", ""Q: When is an officer able to turn his or her body camera off?"", ""Q: Will the Department now have a full account of what takes place during an incident?"", ""Q: How will the video recordings be stored and how long do you keep them?"", ""Q: Will the Department continue its use of in-car cameras?"", ""Q: Who do I contact if I have a question or complaint about an officer’s decision to activate or deactivate his or her body camera?""]",[],[],"" -319,https://biloxi.ms.us/podcast/meet-biloxi-police-fire-at-a-fun-event/,Poor Data Source,Poor Data Source,City of Biloxi | The Official Website of the City of Biloxi,"",200,City of Biloxi | The Official Website of the City of Biloxi,[],[],"[""News from the City of Biloxi""]",[],[],[],"Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate 71°F overcast clouds Skip to content Home E-Services Calendar Visitor Info City Maps COVID Photos/Videos Traffic Contact Us Residents City Council Agenda Forms / Permits Hospitals Keesler Air Force Base Libraries Major Projects Parks & Recreation Planning / Zoning Public Education Public Housing Public Meetings Transportation Utilities Voter Information Water Quality Visitors Airport Attractions Beaches Bicycle Rental Casinos Fishing History Lodging Main Street Museums Tours Visitors Center More Info? × search News from the City of Biloxi • Biloxi A to Z: Sports, Ward 7, and St. Patrick's parade 3/15/2024 • Crews preparing Savarro, Migues parks for youth leagues 3/13/2024 • Biloxi A to Z: State of the City, Hibernia Marching Society, and more 3/08/2024 • Biloxi A to Z: March BNews, State of the City, and more 3/01/2024 • Shoemaker sweeps Ward 7 seat 2/27/2024 • Biloxi Sports Hall of Fame requesting nominees 2/26/2024 • Biloxi A to Z: Road openings, closings; absentee voting; and more 2/23/2024 • Biloxi A to Z: Birthday cake, Mardi Gras cleanup crewe, and more 2/16/2024 • Biloxi celebrates 325th birthday on Mardi Gras 2/12/2024 • Neptune, Gulf Coast Carnival parade reminders 2/08/2024 • Biloxi A to Z: February BNews, Shuckers, Pafford 2/02/2024 • Biloxi A to Z: Pafford, Ward 7 election, and more 1/26/2024 • Special election set for Feb. 27 to fill Ward 7 seat 1/25/2024 • Biloxi A to Z: Winter fire safety, weekend events, and more 1/19/2024 • Biloxi A to Z: Mardi Gras, MLK, and more 1/12/2024 • Sign up now for Children's Mardi Gras Walking Parade 1/09/2024 • MLK events set in Biloxi 1/08/2024 See more news stories viagra bayan azdırıcı damla geciktirici Departments Mayor City Council CAO Accounting Community Development Engineering Fire Harbors/Marinas/Piers Human Resources Legal Municipal Clerk Municipal Court Parks & Recreation Police Public Affairs Public Works Resources BNews Monthly Cemetery Census Data Code of Ordinances Federal Programs Financial Report Forms / Permits Gaming Revenues GIS Mapping Int. Building Code Main Street Major Projects Market Analysis Publications Regional Planning Rental Facilities Restore Biloxi Weekly Reports City of Biloxi Privacy Policy · Trademark Policy 71°F overcast clouds Skip to content Home E-Services Calendar Visitor Info City Maps COVID Photos/Videos Traffic Contact Us 71°F overcast clouds 71°F overcast clouds 71°F overcast clouds 71°F overcast clouds 71°F overcast clouds Skip to content Home E-Services Calendar Visitor Info City Maps COVID Photos/Videos Traffic Contact Us Skip to content Home E-Services Calendar Visitor Info City Maps COVID Photos/Videos Traffic Contact Us " -320,https://delcopa.gov/planning/planningeducation.html,Not Criminal Justice Related,Not Criminal Justice Related,Planning Education,"",200,"Delaware County, Pennsylvania","[""Planning Education""]",[],"[""I’m interested in…"", ""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Planning Education Home / Departments / Planning Department / Planning Education The Delaware County Planning Department offers educational resources to assist in problem-solving and traversing complex planning topics. The Department provides educational information to municipalities and local residents throughout the year to help introduce new planning techniques, explain complex concepts, and spread the word about the planning discipline. These pages offer more information on planning related topics, educational workshops, and other guides and models to help build a more engaged and informed community. I’m interested in… Learning about planning-related topics through a Planner's Portfolio Enrolling in a Pennsylvania Municipal Planning Education Institute course Looking at Model Ordinance Guides Exploring other Regional Partners Finding Planning Publications Examining Demographic Data Questions about Planning Education? Contact the Planning Department at 610-891-5200 or Planning_Department@co.delaware.pa.us . Planning Department Navigation Access the Data and Mapping Innovation Hub About Planning Calendar Current Projects Delaware County 2035 Demographic Data Development Review Forms Funding Green Space and Trails Project Mapping Municipal Programs & Initiatives Planning Education Publications Gina Burritt, Director Planning Department 2 W. Baltimore Avenue Suite 202 Media, PA 19063 Phone: 610-891-5200 Fax: 610-891-5203 Email: Planning_Department@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2023 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Planning Education Home / Departments / Planning Department / Planning Education Planning Education Home / Departments / Planning Department / Planning Education Planning Education Home / Departments / Planning Department / Planning Education " -321,https://claytonca.gov/police/community-youth-outreach/smart911/,Media Bulletins,Agency-Published Resources,Smart911 – City of Clayton,"",200,City of Clayton,"[""Smart911""]",[],"[""Apply for"", ""View"", ""Rent/Reserve"", ""Report"", ""Learn About"", ""Request"", ""Register"", ""Press Release"", ""How Does Smart911 Help?"", ""Fact Sheet"", ""Frequently Asked Questions"", ""City Offices are located at:"", ""Clayton City Hall 6000 Heritage Trail, Clayton, CA 94517"", """", ""Staff is available during our office hours:"", ""Monday to Thursday 9:00 a.m. to 5:00 p.m."", """", ""Telephone: (925) 673-7300"", ""Fax: (925) 672-4917"", ""Online: City Hall Form"", """", ""More Contact Information""]",[],[],[],"OUR CITY History of Clayton Meet Joel Clayton Twinning City Annual Events Community Calendar Community News Organizations Vacancies and Volunteering Opportunities SERVICES Business Services Home Business Licenses City Administration City Clerk Community Development City Engineering Finance Human Resources Library Maintenance Parks and Recreation Police Department Solid Waste GOVERNMENT Boards and Commissions City Council Geological Hazard Abatement Planning Commission Successor Agency Trails & Landscape Committee Vacancies and Volunteer Opportunities HOW DO I Apply for Building Permit Business License Construction Activity Permit Encroachment Permit Employment Home Occupation Permit Noise Permit RV Parking Permit Transportation Permit Tree Removal Permit Solicitors Permit Construction & Demolition Permit View ClearGov Checkbook Instructions Enterprise Systems Catalog Meetings & Agendas Municipal Code Current Planning Projects Street Sweeping Schedule Garbage Service Calendar Job Descriptions, Salaries Financial Documents Rent/Reserve Ball Fields at Community Park Picnic Areas at Community Park City Hall Conference Room Hoyer Hall (Library Meeting Room) Endeavor Hall Clayton Community Gym The Grove Park City Hall Courtyard Report Code Enforcement Problem Abandoned Shopping Carts Animal Problems File a Claim Graffiti Sewer Issues Street Problem Street Signs/Markings Street Light Issue Traffic Signal Issue Irrigation Leak Overgrown Vegetation Learn About Clayton’s History Crime Prevention Volunteer Opportunities Schools Organizations Hazardous Waste Disposal Stormwater Medical Facilities Recreational Opportunities Request Copy of a Police Report Building Inspection RV Parking Permit E-Notifications Register Security Alarm Vacation House Watch RESIDENTS Community Calendar News and Alerts Organizations Building Permits Code Enforcement E-Notifications New Residents Parks and Recreation SEARCH OUR CITY History of Clayton Meet Joel Clayton Twinning City Annual Events Community Calendar Community News Organizations Vacancies and Volunteering Opportunities SERVICES Business Services Home Business Licenses City Administration City Clerk Community Development City Engineering Finance Human Resources Library Maintenance Parks and Recreation Police Department Solid Waste GOVERNMENT Boards and Commissions City Council Geological Hazard Abatement Planning Commission Successor Agency Trails & Landscape Committee Vacancies and Volunteer Opportunities HOW DO I RESIDENTS Community Calendar News and Alerts Organizations Building Permits Code Enforcement E-Notifications New Residents Parks and Recreation SEARCH Clayton Police Department Community & Youth Outreach Smart911 Contact Us Forms & Permits Vacation House Watch Police / Community & Youth Outreach / Smart911 / Smart911 Smart911 is now available to all residents and travelers of Clayton.  Smart911 is a free service that allows individuals and families to sign up online to provide key information to 9-1-1 call takers during an emergency. The Smart911 platform provides valuable new tools and the information listed in Safety Profiles enables a faster more informed response. Press Release How Does Smart911 Help? Fact Sheet Frequently Asked Questions City Offices are located at: Clayton City Hall 6000 Heritage Trail, Clayton, CA 94517 Staff is available during our office hours: Monday to Thursday 9:00 a.m. to 5:00 p.m. Telephone: (925) 673-7300 Fax: (925) 672-4917 Online: City Hall Form More Contact Information OUR CITY SERVICES GOVERNMENT HOW DO I RESIDENTS SITE MAP All content © 1964-2024 City of Clayton, California and its representatives. All rights reserved. Site design © 1997-2024 DIGITAL services. All rights reserved. " -322,https://www.arlingtonva.us/government/programs/housing/housing-arlington-latest-news/county-board-reviews-scope-and-charge-for-missing-middle-housing-study,Not Criminal Justice Related,Not Criminal Justice Related,County Board Reviews Scope and Charge for Missing Middle Housing Study – Official Website of Arlington County Virginia Government,"September 23, 2020 | Updated: October 2, 2020 PROGRAM NEWS:Study Kick Off Scheduled for Oct. 28 at 7 p.m.At a work session on Sept. 22, the County Board reviewed and discussed a revised Missing Middle Housing Study Scope and Charge, which was shaped by community feedback and...",200,Home – Official Website of Arlington County Virginia Government,"[""County Board Reviews Scope and Charge for Missing Middle Housing Study""]",[],"[""CONTACT US"", ""QUICK LINKS"", ""CONNECT"", ""STAY INFORMED""]",[],[],[],opens in new tab or window -323,http://lafayettepolice.us/1693/fountain-plaza-and-sculptures,Not Criminal Justice Related,Not Criminal Justice Related,"Fountain Plaza and Sculptures | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Fountain Plaza and Sculptures""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About the Zoo Get Involved Education Programs Special Events I Want To... Home Government Departments H - W Parks & Recreation Facilities Columbian Park Zoo About the Zoo Exhibits and Animals Fountain Plaza and Sculptures Fountain Plaza and Sculptures Interactive Fountain and Entry Plaza A forty-two inch solid granite sphere emblazoned with a map of the world and supported by a water base greets visitors to the Zoo. It rotates on the same axis as our planet, and the lightest touch will send it spinning in another direction. Next you will see a meandering river, populated by beautiful bronze sculptures. The seven sculptures feature one representative from each of the seven continents: a bear cub, platypus, orangutan, penguin, caiman, gecko, and baby elephants. The sphere fountain is a product of Kusser Fountain Works in Germany. The bronze animal sculptures were created by Texas artist Darrell Davis, whose work can also be seen at Lincoln Park Zoo in Chicago. The entryway, interactive fountain, and animal sculptures have been generously funded by a gift from The McAllister Foundation. Sculptures Other sculptures around the zoo include: Galapagos Tortoise Sculpture River Otter Sculpture Butterfly Sculpture Garden Totem Pole Sculpture Penguin Sculptures Americas Barn Owl Turkey Vulture Black-tailed Praire Dogs North American Porcupine North American River Otter Galapagos Tortoise Bald Eagle Australia New Guinea Singing Dog Bennett's Wallaby Emu Laughing Kookaburra Butterfly Garden Family Farm American Miniature Horse Llama Nigerian Dwarf Goat Pot-Bellied Pig Fountain Plaza and Sculptures Historic Animal House White-Handed Gibbon Black-Handed Spider Monkey Penguin Cove Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -324,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0716/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -325,https://sanramon.ca.gov/our_city/departments_and_divisions/police/community_programs/youth_services/police_explorers,Misc Police Activity,Police & Public Interactions,Police Explorers - City of San Ramon,"",200,Just a moment...,"[""Police Explorers""]","[""Contact Us"", ""Police Explorers"", ""Contact Us"", ""Useful Links""]",[],[],[],[],"" -326,http://lafayettepolice.us/455/aquatics,Not Criminal Justice Related,Not Criminal Justice Related,"Aquatics | Lafayette, IN - Official Website","Take a look at the 3 different aquatic centers open to the public and find out how to book a private party, sign up for programs and more.",200,"Police Department | Lafayette, IN - Official Website","[""Aquatics""]",[],"[""News Flash"", ""March 2024"", ""Alerts"", ""FAQs"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]","[""Parks Department is Hiring Seasonal Positions!"", ""2024 Lifeguard Certification Course Registration Open Now!""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About Us Special Events Programs I Want To... Home Government Departments H - W Parks & Recreation Facilities Aquatics Aquatics Tropicanoe Cove Castaway Bay Rentals Vinton Pool News Calendar Alerts News News Flash Parks Department is Hiring Seasonal Positions! Read on... 2024 Lifeguard Certification Course Registration Open Now! Read on... View All News /CivicAlerts.aspx Calendar March 2024 Sun Mon Tue Wed Thu Fri Sat 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 There are no published events in current month. View All Events /Calendar.aspx Alerts Alerts There are no alerts at this time. FAQs What is your severe weather policy? Does Tropicanoe Cove take debit or credit card? Can I take a cooler in to Tropicanoe Cove? Can we leave the pool and return later in the day? What age children need to be accompanied by an adult at Lafayette Parks aquatic facilities? Do you have lifeguards monitoring the slides? Are “floaties” or flotation devices allowed? Are lifejackets provided? Does my infant have to wear swim pants? Is swimwear required? View All FAQs /FAQ.aspx Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -327,http://police.portlandmaine.gov/396/tickets,Contact Info & Agency Meta,Info About Agencies,"Tickets | Portland, ME - Official Website","Welcome to the beautiful historic City of Portland. We hope you enjoy your visit. We encourage you to make use of our many conveniently located parking garages and lots. For your convenience, we’ve included a link to view the downtown Portland.",200,"Portland, ME - Official Website | Official Website","[""Tickets""]",[],[],[],[],[],Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government Departments Parking Tickets Tickets Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Parking Tickets Tickets Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Parking Tickets Tickets Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Parking Tickets Tickets Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Parking Tickets Tickets Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Home Your Government Departments Parking Tickets Tickets Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Home Your Government Departments Parking Tickets Tickets Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Home Your Government Departments Parking Tickets Tickets Home Your Government Departments Parking Tickets Tickets Home Your Government Departments Parking Tickets Tickets Tickets Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® -328,https://www.normanok.gov/public-safety/police-department/divisions/investigations/registered-offenders,Resources,Agency-Published Resources,We've got some trouble | 404 - Resource not found,"",200,"Welcome to the City of Norman, OK | City of Norman, OK","[""Resource not found Error 404""]",[],[],[],[],[],Resource not found Error 404 The requested resource could not be found. -329,https://delcopa.gov/vote/pdf/2021/delcoboardelections_meeting_legalnotice_0407-2021.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -330,https://www.mooresville.in.gov/event/mpd-police-commission-meeting-3/,Poor Data Source,Poor Data Source,MPD Police Commission Meeting – Cancelled - Town of Mooresville,"",200,403 Forbidden,"[""MPD Police Commission Meeting – Cancelled""]","[""May 21, 2020 @ 6:00 pm - 7:00 pm"", ""Details"", ""Organizer"", ""Venue""]",[],[],[],[],"Town Calendar Indiana Gateway Employee Portal About Mooresville About Mooresville Town History Visiting Mooresville Community Community Links Community News Online Services Online Documents Center Ordinances and Resolutions Minutes Town Meeting Recordings Sewer Bill Payment Code of Ordinances Departments Parks and Rec Fire Department Police Department Public Works Building Department Clerk/Treasurer Departments – Other I want to… Report a Pothole or Streets Problem Find Zoning Info Pay or View Sewer Bill View all FAQs Apply For… Building Permit Sewer Permit Solicitor’s Permit Street Cut Permit Elected Officials Main in Motion Select Page About Mooresville About Mooresville Town History Visiting Mooresville Community Community Links Community News Online Services Online Documents Center Ordinances and Resolutions Minutes Town Meeting Recordings Sewer Bill Payment Code of Ordinances Departments Parks and Rec Fire Department Police Department Public Works Building Department Clerk/Treasurer Departments – Other I want to… Report a Pothole or Streets Problem Find Zoning Info Pay or View Sewer Bill View all FAQs Apply For… Building Permit Sewer Permit Solicitor’s Permit Street Cut Permit Elected Officials Main in Motion Town Calendar Indiana Gateway Employee Portal « All Events This event has passed. MPD Police Commission Meeting – Cancelled May 21, 2020 @ 6:00 pm - 7:00 pm « Town Council Meeting Memorial Day – Government Center Closed » Add to calendar Google Calendar iCalendar Outlook 365 Outlook Live Details Date: May 21, 2020 Time: 6:00 pm - 7:00 pm Organizer Police Commission Venue Police Station « Town Council Meeting Memorial Day – Government Center Closed » Facebook X RSS Designed and Managed by C2IT Consulting, Inc. Town Calendar Indiana Gateway Employee Portal Town Calendar Indiana Gateway Employee Portal Town Calendar Indiana Gateway Employee Portal About Mooresville About Mooresville Town History Visiting Mooresville Community Community Links Community News Online Services Online Documents Center Ordinances and Resolutions Minutes Town Meeting Recordings Sewer Bill Payment Code of Ordinances Departments Parks and Rec Fire Department Police Department Public Works Building Department Clerk/Treasurer Departments – Other I want to… Report a Pothole or Streets Problem Find Zoning Info Pay or View Sewer Bill View all FAQs Apply For… Building Permit Sewer Permit Solicitor’s Permit Street Cut Permit Elected Officials Main in Motion Select Page About Mooresville About Mooresville Town History Visiting Mooresville Community Community Links Community News Online Services Online Documents Center Ordinances and Resolutions Minutes Town Meeting Recordings Sewer Bill Payment Code of Ordinances Departments Parks and Rec Fire Department Police Department Public Works Building Department Clerk/Treasurer Departments – Other I want to… Report a Pothole or Streets Problem Find Zoning Info Pay or View Sewer Bill View all FAQs Apply For… Building Permit Sewer Permit Solicitor’s Permit Street Cut Permit Elected Officials Main in Motion Town Calendar Indiana Gateway Employee Portal " -331,https://coloradosprings.gov/city-council/article/public-notice/police-cso-graduation,Media Bulletins,Agency-Published Resources,Police CSO Graduation | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Police CSO Graduation""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -332,https://www.coppelltx.gov/340/get-involved,Resources,Agency-Published Resources,"Get Involved | Coppell, TX",There are a variety of ways that you can volunteer with the Cozby Library and Community Commons or other community organizations.,200,"Coppell, TX | Official Website","[""Get Involved""]","[""Library Volunteers""]","[""Adult Volunteers"", ""Friends of the Cozby Library & Community Commons"", ""Teen Volunteers"", ""Volunteer Opportunities in DFW"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Children Services Teen Services Adult Services How Do I Home Government City Departments Cozby Library & Community Commons About Us Get Involved Get Involved Library Volunteers Adult Volunteers Volunteer opportunities for adults at the Cozby Library are extremely limited in available positions and tasks. Training may be required for certain tasks. There are many volunteer opportunities available through other City of Coppell facilities. Volunteers must be age 18 and over and pass a background check. A signed waiver is also required. The online volunteer application along with a list of volunteer opportunities available city-wide can be found on the Coppell Volunteers page. Friends of the Cozby Library & Community Commons The Friends of the Coppell Public Library actively promote library programs and increase library resources through a variety of activities. Friends also volunteer to help out at local community events and library programs. The Friends have a vision to build a community of library advocates in order to enhance the Cozby Library experience. It is their mission to enhance the library experience by creating public awareness, fostering community spirit, and bringing new programs to the library. Want to join the Friends? Visit the Coppell Friends website to learn more and to join the Friends of the Coppell Public Library! Teen Volunteers Volunteer opportunities for teens at the Cozby Library are offered through the Teen Volunteers in Coppell program. Teen Volunteers in Coppell allows eligible teens to complete a single application and approval process to be accepted to volunteer at multiple city facilities. Eligibility requirements: Age 13-17 Must be a Coppell resident or CISD student Requirements: Complete online application Submit parental consent waiver Complete Customer Service Training (available online, required annually) Questions about Teen Volunteers in Coppell should be emailed to teenvolunteers@coppelltx.gov . Volunteer Opportunities in DFW Looking for more volunteer opportunities? We have collected the contact information from various volunteer organizations in DFW. Pick up a copy at the front desk or view volunteer opportunities here. This list is updated once a year after our Volunteer Fair. Hours and Location 50th Anniversary History of the Library Mission Americans with Disabilities Act (ADA) Diversity Statement Library Facility Guidelines Get Involved Community Builders Donations Local Author Collection Art Exhibit Video Tutorials Agendas & Minutes Alert Sign-Up Citizen Report E-News Pay Water Bill Permits 255 E. Parkway Blvd., P.O. Box 9478, Coppell, TX 75019 Phone: 972-462-0022 | Email us Site Map Contact Us Accessibility Copyright Notices Privacy Policy Employee Login /QuickLinks.aspx Government Websites by CivicPlus® " -333,https://alpha.austin.gov/es/police-oversight/2020-08-14-3/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -334,https://www.knoxvilletn.gov/archived_news_stories/2010/knoxville_police_prepared_for_increase_of_holiday_,Media Bulletins,Agency-Published Resources,Knoxville Police Prepared for Increase of Holiday Traffic - City of Knoxville,communications*,200,Just a moment...,"[""Knoxville Police Prepared for Increase of Holiday Traffic"", ""Communications Director"", ""Knoxville Police Prepared for Increase of Holiday Traffic""]",[],[],[],[],[],Skip navigation {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## -335,http://www.lafayettepolice.us/faq.aspx?qid=142,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • What are the benefits of designating my property as p,"",200,"Police Department | Lafayette, IN - Official Website",[],"[""▼ Historic Preservation Commission""]","[""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -336,https://police.kingstontn.gov/events/categories/,Poor Data Source,Poor Data Source,Categories – Kingston Police Department,"",200,Sucuri WebSite Firewall - Access Denied,"[""Categories""]",[],[],[],[],[],"> Watch Live > Online Payments > Sign up for Alerts > Report a Concern 865.376.6584 Menu Government Mayor & City Council City Manager Close Departments Finance Dept. Pay a Bill Licenses & Permits Taxes Bids Audit Report Staff & Contacts Fire Dept Services Burn Permits Become a Volunteer Smoke Detector Program Public Works Dept Work Orders/Service Requests Street Maintenance Snow Removal Brush Removal Other Services Police Dept Pay a Citation Crime Tips Watch Programs Records Request Resources Park & Greenway Map Reserve Officer Program/Police Explorers City Court Animal Control Press Releases Traffic School Parks & Recreation Dept Community Pool Registration > Facilities > Sports Calendar Sponsors Programs Special Events Park Rules & Safety Staff Press Releases Water Dept FAQS I Want To: Pay a Bill > View Water & Sewer Ordinances > Check Water Rates > Report a Break Distribution & Collection Wastewater Treatment Plant Water Treatment Plant Water Service Application Close Live History of Kingston Schools Citizen Resources Real Estate Information Close Work Resources Employment Close Play Attractions Events Public Library Project Bids Photo Gallery Close How Do I? Frequently Asked Questions Online Payments Report a Concern Sign up for Alerts Close Menu Government Mayor & City Council City Manager Close Departments Finance Dept. Pay a Bill Licenses & Permits Taxes Bids Audit Report Staff & Contacts Fire Dept Services Burn Permits Become a Volunteer Smoke Detector Program Public Works Dept Work Orders/Service Requests Street Maintenance Snow Removal Brush Removal Other Services Police Dept Pay a Citation Crime Tips Watch Programs Records Request Resources Park & Greenway Map Reserve Officer Program/Police Explorers City Court Animal Control Press Releases Traffic School Parks & Recreation Dept Community Pool Registration > Facilities > Sports Calendar Sponsors Programs Special Events Park Rules & Safety Staff Press Releases Water Dept FAQS I Want To: Pay a Bill > View Water & Sewer Ordinances > Check Water Rates > Report a Break Distribution & Collection Wastewater Treatment Plant Water Treatment Plant Water Service Application Close Live History of Kingston Schools Citizen Resources Real Estate Information Close Work Resources Employment Close Play Attractions Events Public Library Project Bids Photo Gallery Close How Do I? Frequently Asked Questions Online Payments Report a Concern Sign up for Alerts Close Categories Home / Events / Categories CONTENTS Kingston, TN Location © 2017. City of Kingston. All Rights Reserved. | Powered by Konki Digital Watch Live Pay a Bill Contact Us " -337,https://www.plymouthmi.gov/government/departments/police/preliminary_breath_tests,Contact Info & Agency Meta,Info About Agencies,"Preliminary Breath Tests - City of Plymouth, MI","",200,Just a moment...,"[""Preliminary Breath Tests""]",[],[],[],[],[],"" -338,https://www.minneapolismn.gov/government/departments/police/professional-standards/discipline-matrix/,Policies & Contracts,Info About Agencies,Discipline Matrix and Narrative - City of Minneapolis,You can read how the Minneapolis Police Department (MPD) imposes employee discipline. ,200,City of Minneapolis,"[""Discipline matrix and narrative"", ""Need help? We're here for you.""]","[""A snow emergency is not currently in effect. Normal parking rules apply."", ""What to know"", ""Documents"", ""Contact us""]","[""Discipline matrix and narrative"", ""Minneapolis Police Department"", ""Connect with the Minneapolis Police Department""]","[""Request accessible format""]",[],[],"" -339,https://cityofpowell.us/powell-police-searching-for-suspect-after-attempted-home-robbery/41-3/,Poor Data Source,Poor Data Source,"City of Powell, Ohio | 41.3","",200,"City of Powell, Ohio","[""41.3""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -340,https://ci.san-bernardino.ca.us/city_hall/police_department/online_reports,Poor Data Source,Poor Data Source,Online Reports - City of San Bernardino,"",200,Just a moment...,"[""City of San Bernardino California""]","[""Online Reports""]",[],[],[],[],Skip to Content -341,https://delcopa.gov/treasurer/pdf/2021reassessmentvalues/03.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -342,https://delcopa.gov/publicrelations/releases/2019/domesticviolenceawareness.html,Media Bulletins,Agency-Published Resources,"Recognizing October as Domestic Violence Awareness Month - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Recognizing October as Domestic Violence Awareness Month""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -343,https://virginiabeach.gov/whats-up/whats-new/commonwealth-v-nathaniel-lee-campbell-maximum-sentence-of-10-years-for-man-who-killed-military-police-officer-in-crash,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -344,http://www.lafayettepolice.us/759/burn-leaves-on-a-city-street,Media Bulletins,Agency-Published Resources,"Burn Leaves on a City Street | Lafayette, IN - Official Website",Can I burn leaves on a City street?,200,"Police Department | Lafayette, IN - Official Website","[""Burn Leaves on a City Street""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Operations Prevention Recruitment How Do I... Home Government Departments A - F Fire Department Prevention Fire Safety Practices Open Burn Policy Burn Leaves on a City Street Burn Leaves on a City Street It is unlawful to kindle or maintain any bonfire or rubbish fire or authorize any such fire to be kindled or maintained on or in any public street, alley, or other public ground within the city without consent from the Fire Department. Lafayette City Municipal Code 3.05 - Burning of leaves prohibited - No person shall burn leaves, refuse or any other similar substance except by the express written approval of the Lafayette Fire Department. You can also see: Article 4. Burning Regulations Rule 1. Open Burning 326 IAC 4-1-0.5 Definitions Authority: IC 13-15-2-1; IC 13-17-3-4 Affected: IC 13-12; IC 13-17-9; IC 36-9-27-2 Burn Leaves on a City Street Community Outreach Fire Stations Submit a Request History Photo Gallery Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Operations Prevention Recruitment How Do I... Home Government Departments A - F Fire Department Prevention Fire Safety Practices Open Burn Policy Burn Leaves on a City Street Burn Leaves on a City Street It is unlawful to kindle or maintain any bonfire or rubbish fire or authorize any such fire to be kindled or maintained on or in any public street, alley, or other public ground within the city without consent from the Fire Department. Lafayette City Municipal Code 3.05 - Burning of leaves prohibited - No person shall burn leaves, refuse or any other similar substance except by the express written approval of the Lafayette Fire Department. You can also see: Article 4. Burning Regulations Rule 1. Open Burning 326 IAC 4-1-0.5 Definitions Authority: IC 13-15-2-1; IC 13-17-3-4 Affected: IC 13-12; IC 13-17-9; IC 36-9-27-2 Burn Leaves on a City Street Community Outreach Fire Stations Submit a Request History Photo Gallery Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -345,https://cityofpowell.us/government/employment-opportunities/police-officer-selection-process/,Training & Hiring Info,Info About Officers,"City of Powell, Ohio | Police Officer Selection Process","",200,"City of Powell, Ohio","[""Police Officer Selection Process""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -346,https://www.normanok.gov/public-safety/police-department/community-outreach/citizens-police-academy,Poor Data Source,Poor Data Source,We've got some trouble | 404 - Resource not found,"",200,"Welcome to the City of Norman, OK | City of Norman, OK","[""Resource not found Error 404""]",[],[],[],[],[],Resource not found Error 404 The requested resource could not be found. -347,https://www.dps.arkansas.gov/law-enforcement/arkansas-state-police/divisions/crimes-against-children/,Contact Info & Agency Meta,Info About Agencies,Crimes Against Children - Arkansas Department of Public Safety,"",200,Home - Arkansas Department of Public Safety,"[""Flag Status""]","[""Crimes Against Children"", ""Reports of Child Maltreatment"", ""Crimes Against Children Division Commander & Staff"", ""Crimes Against Children Division Administrators"", ""Crimes Against Children Area Administrators"", ""Contact ASP"", ""Helpful ASP links"", ""Connect with ASP"", ""Respect. Integrity. CUSTOMER SERVICE. TEAMWORK. SERVANT LEADERSHIP. CONTINUOUS IMPROVEMENT"", """", ""© 2024 All rights Reserved. Arkansas.gov""]","[""Major Jeffrey Drew"", ""Dan Mack"", ""Kalika Rogers"", ""Tonya Tackett"", ""Sara King"", ""Jamey Nesbitt"", ""Lee Ann Stidham"", ""Tara Flute"", ""Michelle Gatlin"", ""Lorra Wicker"", ""Andrea Carter"", ""Laurie Stephens"", ""Pamela Meeks""]",[],"[""About DPS"", ""DPS Links"", ""DPS Address"", ""Your Arkansas.gov"", ""Top Online Services"", ""Helpful Information""]",[],"" -348,http://lafayettepolice.us/3532/schools-out-day-camps,Media Bulletins,Agency-Published Resources,"School's Out Day Camps | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""School's Out Day Camps""]","[""2024 School's Out Day Camp Dates"", ""Questions?  Please contact the Education Department at zooeducation@lafayette.in.gov or (765) 807-1540.""]","[""LOOKING FOR SPRING BREAK INFO? Click here for our Spring Break Safari Camp page."", ""Online Registration Portal"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]","[""Please review before registering:""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About the Zoo Get Involved Education Programs Special Events I Want To... Home Government Departments H - W Parks & Recreation Facilities Columbian Park Zoo Education Programs Family & Youth Programs Zoo Camps School's Out Day Camps School's Out Day Camps School's out, so come hang out at the Zoo!  During select planned days off for Lafayette, Tippecanoe, and/or West Lafayette Community Schools, the Zoo will hold a one day camp session. Kids can spend the day exploring the wild world of animals through games, crafts, STEM (Science, Technology, Engineering, and Math) activities and close-up encounters with live Animal Ambassadors! These sessions are full day, drop-off camp sessions from 9:00am-4:00pm with an optional Extended Care service available at an additional charge. Please note that some dates may be adjacent to one another, but each day requires individual registration to allow you flexibility in scheduling around your family's needs, and to insulate against snow make-up day impacts. Our normal Cancellation Policy applies to School's Out Day Camps, with the additional consideration that if your school district determines that a snow make-up day will occur on the date of the program we will refund you in full for your registration fee. 2024 School's Out Day Camp Dates Date Ages Times Fee (per child) Status Monday, April 8, 2024 (Total Eclipse Day) - FREE EXTENDED CARE 5-11 9:00am-4:00pm $50 OPEN TBD TBD TBD Please check your school's calendar before registering as each district's days off vary.  Additional dates may be added as needed and availability allows. If your preferred session is full, please contact us at zooeducation@lafayette.in.gov to be added to a wait list. LOOKING FOR SPRING BREAK INFO? Click here for our Spring Break Safari Camp page. Please review before registering: Zoo Education Programs Participation Agreement Hold Harmless and Cancellation Policy Online Registration Portal Interested in becoming a member? Click here for more info or to join today! Questions?  Please contact the Education Department at zooeducation@lafayette.in.gov or (765) 807-1540. Spring Break Camp Summer Camps Learning Adventures Camps (ages 5-7) Learning Adventures Camps (ages 8-11) Learning Adventures Camps (ages 12-14) School's Out Day Camps Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -349,https://www.lasalle-il.gov/shared-police-services-committee-4,Poor Data Source,Poor Data Source,Shared Police Services Committee | City of La Salle,"",200,"Error retrieving title: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))","[""Shared Police Services Committee""]","[""Main navigation"", ""Main Menu"", ""Important Info""]",[],[],[],[],"Search Phone: 815-223-3755 Fax: 815-223-9508 Contact Us Main navigation MENU About La Salle Our Mission Event Calendar Historical Tour City Profile » Tourism Ward Map Canal Corridor Association City Services Municipal Information Directory City Government City Mayor City Clerk/Deputy Clerk City Officials City Committees La Salle Promotional & Advisory Committee (LPAC) Ordinances & Codes Departments Building Department Frequently Asked Questions Engineering Frequently Asked Questions Finance/Utility Billing Annual Audits Budget/Appropriations Labor Contracts What We Do Utility Billing Water & Sewer Rates Fire Department Department Overview Department History ISO Rating Apparatus Showcase Public Education Disaster Preparedness Storm Ready Community Fire Department Links Knox Box System Parks & Recreation Interactive Park Map La Salle Parks Information Pollinator Park Police Department Patrol Division Detective Division Communications Division School Resource Officer Program Community Programs TRI-DENT Crime Free Housing Registered Sex Offenders Moving to Town Safety Tips Important Phone Numbers Public Works Frequently Asked Questions What We Do Development Properties Available Properties Business Development Economic Development Development Incentives » TIF Districts Enterprise Zone Redevelopment Incentive Program Hotels & Short Term Rentals Community COVID-19 Info Businesses Dining Health Care Senior Services Worship Education Farmer's Market Public Library Illinois Valley YMCA NewsTribune La Salle Business Association (LBA) Job Market Information Online Services Shared Police Services Committee Where: Peru Municipal Building When Tuesday, November 27, 2018 Agenda November 27, 2018 Agenda City Offices: 745 Second Street La Salle, Illinois 61301 Phone: 815-223-3755 Fax: 815-223-9508 Email the City Office City Office Hours: Monday - Friday: 7:30 a.m. - 4:00 p.m. Main Menu Home About La Salle Departments Development Community Contact Us Sitemap Important Info Privacy Policy External Site Policy FOIA Information USA.gov HHS.gov Accessibility Plugins Find Us On Facebook Copyright © 2017-2018 City of LaSalle. All Rights Reserved. La Salle Web Design by Anttix, Inc. " -350,https://www.minneapolismn.gov/government/programs-initiatives/community-safety/focus-areas/alternatives-police-response/new-pilot-response/,Policies & Contracts,Info About Agencies,Community Safety Work - City of Minneapolis,We're focusing on three key areas to improve community safety in our city.,200,City of Minneapolis,"[""Community safety work"", ""Need help? We're here for you.""]","[""A snow emergency is not currently in effect. Normal parking rules apply."", ""Overview"", ""Key areas"", ""Related links"", ""Community safety in different languages from 2021"", ""Contact us""]","[""Alternatives to police response"", ""Violence prevention"", ""Police policy reform"", ""Unarmed public safety responses"", ""Public health approach to violence"", ""Behavioral crisis response"", ""See language translation pages"", ""Alternatives to police response"", ""Police policy reform"", ""Community Safety Office""]","[""Learn more"", ""Learn more"", ""Learn more""]",[],[],"" -351,https://delcopa.gov/purchasing/bidsprops/cp081921_addendum4.pdf,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -352,https://www.mass.gov/doc/summary-results-of-recent-lead-and-copper-drinking-water-testing-at-massachusetts-schools/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -353,http://www.cityofpataskalaohio.gov/city-of-pataskala-careers/ordinance-2021-4399-exhibit-a-full-time-police-clerk-2/,Poor Data Source,Poor Data Source,Ordinance-2021-4399-Exhibit-A-Full-Time-Police-Clerk - City Of Pataskala,Official Website,200,Home - City Of Pataskala,"[""City Of Pataskala""]","[""Official Website""]",[],[],[],[],Document Library Calendar Public Services Pay Court Ticket Online City Of Pataskala Official Website Blog Community Police Obtain Fingerprints Solicitor’s Permit Citizens Police Academy Important Links/Resources Prescription Drug Drop Off Police Officer Job Application History of the Pataskala Police Department Curfew Vacation House Check Form Fire School Districts Residents Taxes in Pataskala RITA Tax Local Animal Shelter/Lost Pets Dog License BMV Info Licking County Health Department Register to Vote Report a Gas Emergency New to Pataskala? Good Neighbor Guidelines Outdoor Activities Attractions City Departments Mayor Administration Garage Sale Permit Adopt-A-Street Program Rent a Park Shelter Current Bids and RFQ’s Outdoor Activity/Event Permit Parade-Assembly Form Parks and Recreation Economic Development Human Resources Utilities Utility Rates Water and Sewer Billing/ E-Billing Interesting Facts and Information Storm Water Management Program Report a Water Leak Finance Pataskala’s Income Tax Budget Financial Reports Popular Annual Financial Report (PAFR) Annual Comprehensive Financial Reports Financial Condition Reports 2023 Financial Condition Reports 2022 Financial Condition Reports 2021 Financial Condition Reports 2020 Financial Condition Reports 2019 Financial Condition Reports 2018 Financial Condition Reports 2017 Financial Condition Reports 2016 Financial Condition Reports 2015 Financial Condition Reports 2014 Financial Condition Reports 2013 Financial Condition Reports 2012 Financial Condition Reports Audited Financial Reports Pataskala Open Checkbook Mayor’s Court Important Traffic Violation Info Pay Fines or Search Case Files How to Pay Fines Traffic and General Offense Codes Plea Descriptions Court Appearance Times Your Rights in the Pataskala’s Mayor’s Court Downloadable Forms Sealing a Record Informational Court Links Mayor’s Court Prosecutor Pataskala’s Mayors Court Magistrate Mayor’s Court Rules Criminal/Traffic Diversion Bond Schedule Fine Schedule Legal Public Service/Streets Pothole Repair Report a Pothole Right of Way Snow Removal Traffic Signals & Street Lights Drainage/Ditches Issues Planning & Zoning Permit Questions Planning & Zoning Fee Schedule Discharge Map Zoning Maps Permits Comprehensive Plan Properties With Posted Code Violations Government City Council Ward Map Tom H. Lee – Ward 1 Mary Hite – Ward 2 Deborah Kohman – Ward 3 Brandon Galik – Ward 4 Dustin Epperson – At-Large Jude Hampshire – At-Large Andy Walther – At Large Clerk of Council Council Packet Public Notices Agendas Meeting Minutes Audio/Video Recordings Legislation Approved Ordinances & Resolutions 2024 Resolutions 2024 Ordinances 2023 Resolutions 2023 Ordinances 2022 Resolutions 2022 Ordinances 2021 Resolutions 2021 Ordinances 2020 Resolutions 2020 Ordinances 2019 Resolutions 2019 Ordinances 2018 Resolutions 2018 Ordinances 2017 Resolutions 2017 Ordinances 2016 Resolutions 2016 Ordinances 2015 Resolutions 2015 Ordinances Codified Ordinances Charter Public Records Request Information Boards and Commissions Personnel Board of Review Planning and Zoning Commission Board of Zoning Appeals Parks and Recreation Advisory Board Planning & Zoning Commission Board of Zoning Appeals Document Library Calendar Public Services Pay Court Ticket Online -354,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/july-2021-activity-report/,Crime Maps & Reports,Agency-Published Resources,July 2021 - Activity Report - Town of Cheswold,"",200,"Home - Town of Cheswold - Kent County, Delaware","[""Cheswold""]","[""Delaware"", ""July 2021 – Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[],"Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Cheswold Delaware Listen July 2021 – Activity Report July 2021 - Activity Report Cheswold Delaware Listen July 2021 – Activity Report July 2021 - Activity Report Listen July 2021 – Activity Report July 2021 - Activity Report Listen July 2021 – Activity Report July 2021 - Activity Report Listen July 2021 – Activity Report July 2021 - Activity Report Listen Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form " -355,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/072521blotter.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -356,https://delcopa.gov/publicrelations/releases/2021/deppublichearing_0922.html,Not Criminal Justice Related,Not Criminal Justice Related,"DEP Holds Public Hearing Regarding Covanta on Sept. 22 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""DEP Holds Public Hearing Regarding Covanta on Sept. 22""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play DEP Holds Public Hearing Regarding Covanta on Sept. 22 Home / Departments / Public Relations Releases / DEP Holds Public Hearing Regarding Covanta on Sept. 22 Released: September 8, 2021 On September 3, the Department of Environmental Protection announced it will receive public comments and host a virtual public hearing regarding a Title V/State Operating Permit renewal request for Covanta Delaware Valley, LP, a waste to energy facility in the City of Chester, Delaware County. The public is invited to participate in this process through a public comment period and a virtual public hearing. The virtual public hearing will be held on Wednesday, September 22 beginning at 6:30 p.m. Individuals wishing to provide testimony must contact DEP Community Relations Coordinator John Repetz at jrepetz@pa.gov or 717-705-4904 to register at least 24 hours prior to the hearing. Additional information will be provided to testifiers upon registration. The hearing will be accessible by both Internet and phone to ensure all stakeholders have access. The WebEx information for the virtual public hearing is available on DEP’s Virtual Public Hearings page. DEP is also accepting written public comments on these amendments, which may be submitted to RA-EPSEROAQpubcom@pa.gov or mailed to the Southeast Regional Office, Air Quality Program, 2 E. Main St. Norristown, PA 19401 until close of business on Monday, October 4, 2021. To assist with mail routing, it is requested that mailed comments contain the following on the envelope: “Comments on Covanta Del Val.” All comments, whether received in writing or spoken at the hearing, carry equal weight and consideration before DEP. Covanta Delaware Valley, LP is a permitted waste-to-energy facility currently seeking renewal of its five-year Title V/State Operating Permit. These permits are required under the federal Clean Air Act for any large or major source of air pollution. Covanta submitted its renewal application in December 2020; DEP deemed the application administratively complete in February 2021 and commenced a technical review. The proposed Title V Operating Permit Renewal contains all applicable requirements including monitoring, recordkeeping, reporting, and work practices. It does not authorize any increase in air emissions of regulated pollutants above the previously approved levels. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll " -357,http://www.lafayettepolice.us/1716/emu,Not Criminal Justice Related,Not Criminal Justice Related,"Emu | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Emu""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About the Zoo Get Involved Education Programs Special Events I Want To... Home Government Departments H - W Parks & Recreation Facilities Columbian Park Zoo About the Zoo Exhibits and Animals Australia Emu Emu Emu Dromaius novaehollandiae Conservation Status: Least Concern Range: Widespread across Australia Habitat: Grasslands, open forests, farmlands Size: 5-6 feet tall; ~100 pounds Diet in the Wild: Seeds, flowers, grass shoots, fruit, insects Diet in the Zoo: Formulated grain, hay, lettuce Lifespan: 10-20 years in the wild; 35+ years in captivity The emu is the second largest bird in the world (the ostrich is the largest). Too heavy to fly, the emu's feathers are adapted for warmth, giving them a fluffy appearance. Emu tail feathers are stiff and can be rattled together to scare off potential predators such as dingoes and wild dogs. Fun Facts! Emu have a pouch in their throat the can be used to make a deep drumming sound to communicate with other emu! Emu can run up to 30 mph with an almost 9 foot stride! Emu are the only birds that have calf muscles! New Guinea Singing Dog Bennett's Wallaby Emu Laughing Kookaburra Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -358,https://www.coppelltx.gov/530/virtual-recreation,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -359,https://coloradosprings.gov/police-department/article/news/shooting-investigation-1800-block-monterey,Media Bulletins,Agency-Published Resources,Shooting Investigation 1800 Block Monterey Road | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Shooting Investigation 1800 Block Monterey Road""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -360,https://www.antioch.il.gov/wpfb-file/01-14-14-police-and-fire-agenda-pdf-2/,Poor Data Source,Poor Data Source,"01-14-14 Police And Fire Agenda - Antioch, IL",01 14 police and fire agenda pdf commissions commission agendas 2014 08 17 51 0000,200,"Home - Antioch, IL","[""01-14-14 Police And Fire Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -361,https://www.gov.ca.gov/2022/02/27/governor-newsom-statement-on-death-of-salinas-police-officer-2-27-22/,Media Bulletins,Agency-Published Resources,Governor Newsom Statement on Death of Salinas Police Officer 2.27.22 | California Governor,SACRAMENTO – Governor Gavin Newsom today issued the following statement regarding the death of Salinas Police Department Officer Jorge David Alvarado: “Our…,200,403 Forbidden,"[""Governor Newsom Statement on Death of Salinas Police Officer 2.27.22""]",[],[],"[""Recent News"", ""Archives"", ""Categories""]",[],[],Skip to Main Content CA.gov Home Share via Facebook Share via Instagram TikTok Share via Twitter Share via YouTube Settings CA.gov Home Share via Facebook Share via Instagram TikTok Share via Twitter Share via YouTube Settings CA.gov Home Share via Facebook Share via Instagram TikTok Share via Twitter Share via YouTube Settings CA.gov Home Share via Facebook Share via Instagram TikTok Share via Twitter Share via YouTube CA.gov Settings Default High Contrast Reset Increase Font Size Font Increase Decrease Font Size Font Decrease Dyslexic font × Default High Contrast Reset Increase Font Size Font Increase Decrease Font Size Font Decrease Dyslexic font × Default High Contrast Default High Contrast Reset Increase Font Size Font Increase Decrease Font Size Font Decrease Reset Increase Font Size Font Increase Decrease Font Size Font Decrease Dyslexic font Search Menu Search Menu Home About Governor Newsom First Partner Newsroom Appointments Appointments Judicial First Partner First Partner Jennifer Siebel Newsom California For All Women California For All Kids #MetoWe Contact Contact Scheduling Request Custom Google Search Submit Close Search About Governor Newsom First Partner Governor Newsom First Partner Appointments Appointments Judicial Appointments Judicial First Partner First Partner Jennifer Siebel Newsom California For All Women California For All Kids #MetoWe First Partner Jennifer Siebel Newsom California For All Women California For All Kids #MetoWe Contact Contact Scheduling Request Contact Scheduling Request Custom Google Search Submit Close Search Custom Google Search Submit Close Search Close Search -362,https://www.southamptontownnypolice.gov/1446/hampton-resorts-atlantic-hotel-ia-system,Not Criminal Justice Related,Not Criminal Justice Related,"Hampton Resorts (Atlantic Hotel) IA System | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Hampton Resorts (Atlantic Hotel) IA System""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]","[""WQIP - Fund Application"", ""Summary Sheet""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Community Preservation Fund (CPF) WQIPP - Plan/Checklist/App 2020 WQIP - Applications & Proposal Summaries Hampton Resorts (Atlantic Hotel) IA System Hampton Resorts (Atlantic Hotel) IA System WQIP - Fund Application Hampton Resorts, LLC-aka Atlantic Hotel - WQI Application Summary Sheet Hampton Resorts Atlantic Hotel IA System Cornell Cooperative Extension-Shellfish & Habitat Flying Point Comfort Station Hampton Resorts (Atlantic Hotel) IA System Mashashimuett Park NRB for Residences Pump Out Program-Waste Water Treatment- Trustees Sag Harbor Village- Sewer Master Plan Southampton Village - Agawam Pond-Phase II Southampton Village - WQIP Southampton Village-Old Town Pond Westhampton Beach Sewer Treatment Project Woodhull Fish Passage Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Community Preservation Fund (CPF) WQIPP - Plan/Checklist/App 2020 WQIP - Applications & Proposal Summaries Hampton Resorts (Atlantic Hotel) IA System Hampton Resorts (Atlantic Hotel) IA System WQIP - Fund Application Hampton Resorts, LLC-aka Atlantic Hotel - WQI Application Summary Sheet Hampton Resorts Atlantic Hotel IA System Cornell Cooperative Extension-Shellfish & Habitat Flying Point Comfort Station Hampton Resorts (Atlantic Hotel) IA System Mashashimuett Park NRB for Residences Pump Out Program-Waste Water Treatment- Trustees Sag Harbor Village- Sewer Master Plan Southampton Village - Agawam Pond-Phase II Southampton Village - WQIP Southampton Village-Old Town Pond Westhampton Beach Sewer Treatment Project Woodhull Fish Passage Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... " -363,https://delcopa.gov/departments/emergencyservices.html,Not Criminal Justice Related,Not Criminal Justice Related,"Emergency Services - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Emergency Services""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -364,https://www.roundrocktexas.gov/news/police-arrest-two-suspects-series-vehicle-burglaries/,Media Bulletins,Agency-Published Resources,Police arrest two suspects for series of vehicle burglaries - City of Round Rock,"",200,403 Forbidden,[],[],"[""Police arrest two suspects for series of vehicle burglaries""]","[""Site Search"", ""Follow Us""]",[],[],"" -365,https://www.coronadelmar.us/residents-show-support-for-the-newport-beach-police-department-media-4/,Poor Data Source,Poor Data Source,Residents Show Support for the Newport Beach Police Department-media-4 | Corona del Mar California,"",200,Corona del Mar California,"[""Residents Show Support for the Newport Beach Police Department-media-4""]","[""Menu"", ""Be First to Comment"", ""Subscribe"", """", """"]","[""Leave a Reply Cancel reply"", """"]",[],[],[],"Search Search Corona del Mar California Corona del Mar California March 25, 2024 The Quintessential California Beach Town open menu Back Corona del Mar open menu Privacy Policy United States Post Office News Local Jobs Our Beaches open menu Big Corona Little Corona Restaurants open menu Gallo’s Italian Deli Nagisa Sushi Restaurant Gina’s Pizza Pirozzi Corona del Mar Zinc Cafe Market Bandara Rose Bakery Cafe The Quiet Woman Starbucks Coast Highway Menu Corona del Mar Privacy Policy United States Post Office News Nagisa Sushi Restaurant Restaurants The Quiet Woman Rose Bakery Cafe Zinc Cafe Market Pirozzi Corona del Mar Gina’s Pizza Starbucks Coast Highway Bandara Gallo’s Italian Deli Our Beaches Little Corona Big Corona Local Jobs Baseball Game Preview: Corona del Mar Sea Kings vs. Valley View Eagles – MaxPreps.com By The Citizen Both teams have allowed few runs on average, (Corona del Mar: 3.6, Valley View: 4) so any runs scored will be well earned. Last Thursday,... Leave a Comment Baseball Game Preview: Valley View Eagles vs. Corona del Mar Sea Kings – MaxPreps.com By The Citizen Meanwhile, Corona del Mar sure made it a nail-biter, but they managed to escape with a 2-1 victory over San Clemente on Thursday. Valley View's... Leave a Comment University boys tennis takes second at All-American team tournament – Orange County Register By The Citizen University opened its week Wednesday by defeating previously undefeated Corona del Mar ... The Trojans defeated Corona del Mar in the regional final ... Source: Google Leave a Comment Orangewood Academy's loss ends five-game winning streak at home – MaxPreps.com By The Citizen They'll take on Corona del Mar at 4:00 p.m. on April 4th. As for Western Christian, they will head out on the road to square... Leave a Comment Savanna multi-sport coach and co-athletic director Alex Ramirez receives layoff notice from district By The Citizen High School Sports | · Fryer: Corona del Mar's Ava Simos sticks to all-events approach as long as she can · High School Sports |... Leave a Comment Residents Show Support for the Newport Beach Police Department-media-4 Previous Image Next Image Be First to Comment Leave a Reply Cancel reply Your email address will not be published. Required fields are marked * Comment Name* Email* Website Δ Subscribe Email Address Subscribe Join 1 other subscriber Corona del Mar California The Quintessential California Beach Town © www.coronadelmar.us 2024 " -366,https://santabarbaraca.gov/government/departments/police-department/funciones-miscelaneos,Misc Police Activity,Police & Public Interactions,Funciones Misceláneos | City of Santa Barbara,• Permisos de alarma El Departamento de Policía de Santa Barbara responde anualmente a miles de llamadas de alarmas falsas. Estas respuestas innecesarias resultan en una enorme carga de mano de obra y gastos; lo que a su vez reduce el tiempo disponible para responder a emergencias urgentes.,200,City of Santa Barbara,"[""Funciones Misceláneos""]","[""Learn about Cookies"", ""[#IABV2_TITLE#]"", ""Breadcrumb"", ""This is the prefooter section"", ""Main Footer"", ""City Hall"", ""Mailing Address"", ""Newsletters""]",[],[],[],[],"" -367,https://www.antioch.il.gov/wpfb-file/04-08-14-police-pension-agenda-pdf-3/,Poor Data Source,Poor Data Source,"04-08-14 Police Pension Agenda - Antioch, IL",10574 04 08 14 police pension agenda pdf commissions fund agendas 2014 1396623746 2c4916e7dd6a45db57ba715eb2e88686 213x300 _npkxhbratshx thumb jpg 10 02 26 0 pdf application trustees dennis b crosby jay jozwiak mary c dominiak scott a pierce jerry t johnson ted p poulos lawrence m hanson mayor lori k folbrick village clerk agenda of antioch lake,200,"Home - Antioch, IL","[""04-08-14 Police Pension Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -368,http://www.ryepolice.us/event/makn-llc-dba-mission-portsmouth,Not Criminal Justice Related,Not Criminal Justice Related,"Rye Police Department MAKN, LLC dba Mission Portsmouth - Rye Police Department","",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"["""", ""MAKN, LLC dba Mission Portsmouth""]","[""June 15, 2017 @ 5:00 am - October 15, 2017 @ 7:00 am"", ""Details"", ""Organizer"", ""Venue""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"­ Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Home « All Events This event has passed. MAKN, LLC dba Mission Portsmouth June 15, 2017 @ 5:00 am - October 15, 2017 @ 7:00 am « GYROKINESIS ® Lessons Namaste NH Beach Yoga » Fitness Classes/Yoga on the beach - Mindy Anderson LOCATION: Foss Beach or Wallis Rd Ext @ High Tide Monday-Friday 5:00AM-7:00AM + Google Calendar + iCal Export Details Start: June 15, 2017 @ 5:00 am End: October 15, 2017 @ 7:00 am Event Category: Beach Permits Website: http://www.missionportsmouth.com/ Organizer Mindy Anderson Venue Foss Beach « GYROKINESIS ® Lessons Namaste NH Beach Yoga » Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search " -369,https://www.kenedytx.gov/2022/04/18/kenedy-police-departments-k9-robbie-to-get-donation-of-body-armor/,Media Bulletins,Agency-Published Resources,Kenedy Police Department’s K9 Robbie to get donation of body armor,"Kenedy Police Department’s K9 Robbie to get donation of body armor . Kenedy is a small town with big opportunities, located in the heart of the South Texas.",200,"City of Kenedy, Texas - Official Website","[""Kenedy Police Department’s K9 Robbie to get donation of body armor""]",[],"[""Resources & Links"", ""Recent City News"", ""City News Archives"", ""Recent Meeting Agendas"", ""Kenedy Weather"", ""Featured News"", ""Transparency & Documents"", ""Recent Documents"", ""About Kenedy"", ""Recent City News"", ""Recent Documents"", ""Contact Us""]","[""March 25, 2024 Kenedy 4B EDC Regular Meeting"", ""March 26, 2024 Public Hearing regarding the Texas Community Development Block Grant Program (TxCDBG)"", ""March 19, 2024 Parks & Recreation Meeting Agenda"", ""Local Time"", ""Today"", ""Saturday"", ""Sunday"", ""Monday"", ""Kenedy Economic Development Corporation (4B) Website Launches"", ""March 26, 2024 Special Kenedy City Council Meeting"", ""March 25, 2024 Kenedy 4B EDC Regular Meeting"", ""March 26, 2024 Public Hearing regarding the Texas Community Development Block Grant Program (TxCDBG)"", ""March 19, 2024 Parks & Recreation Meeting Agenda"", ""Water Plant Operator"", ""March 12, 2024 Kenedy Regional Airport Board Regular Meeting Agenda"", ""March 12, 2024 Kenedy City Council Regular Meeting Agenda"", ""March 26, 2024 Special Kenedy City Council Meeting"", ""March 25, 2024 Kenedy 4B EDC Regular Meeting"", ""March 26, 2024 Public Hearing regarding the Texas Community Development Block Grant Program (TxCDBG)"", ""March 19, 2024 Parks & Recreation Meeting Agenda"", ""Water Plant Operator""]","[""March 22, 2024"", ""March 23, 2024"", ""March 24, 2024"", ""March 25, 2024""]","[""Previous"", ""Next""]","" -370,http://www.lafayettepolice.us/873/fire-stopping,Not Criminal Justice Related,Not Criminal Justice Related,"Fire Stopping | Lafayette, IN - Official Website",Find out more about fire-stopping materials and practices.,200,"Police Department | Lafayette, IN - Official Website","[""Fire Stopping""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Operations Prevention Recruitment How Do I... Home Government Departments A - F Fire Department Prevention Contractors & Designers Resources & Inspections Fire Stopping Fire Stopping Fire stopping is the containment of fire or smoke through rated assemblies by the application of tested fire rated assemblies. There are 4 primary types of openings or joints associated with fire and smoke resistive rated assemblies, to which tested fire-stopping systems may be applied to prevent the spread of fire, smoke or gases: Joints - Joints between fire-rated construction components (e.g. wall to wall, wall to floor, wall to ceiling) Floor Perimeters - Slab edge / exterior wall cavity (curtain wall) Penetrations - Openings containing mechanical, electrical, structural, security, communication, piping or wiring Electrical boxes whose combined openings exceed 100 square inches in 100 square feet of wall Fire-Stopping a Penetration There are 5 important things to consider when deciding how to fire-stop a penetration. What is the assembly you are penetrating made of (gypsum, wood, concrete)? What is the item that is penetrating it (PVC, iron pipe, EMT, wiring)? What is the annular space (minimum and maximum)? What is the size of the opening? What is the hourly rating of the assembly? Fires topping is not synonymous with fire blocking . Fire-Stopping Materials ""Intumescent"" means that the material expands when exposed to fire or heat to fill a void in the penetration caused by the deformation or combustion of the penetration item. ""Elastomeric"" products are flexible and prevent passage of heat and gases while permitting movement of the assembly. There are several fire-stopping material manufacturers. Each manufacturer has their material tested and listed for specific applications. Not all materials are interchangeable with other ""brands"" or systems. Some examples of materials or ""components"" found in tested and listed systems: ""Muffins"" Caulk Flexible wraps Mineral or Stone Wool Putty Spray Glossary Tested & Listed Fire Stop Systems Community Outreach Fire Stations Submit a Request History Photo Gallery Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -371,https://www.antioch.il.gov/wpfb-file/04-10-18-police-and-fire-agenda-pdf/,Poor Data Source,Poor Data Source,"04-10-18 Police And Fire Agenda - Antioch, IL",15646 04 10 18 police and fire agenda pdf commissions commission agendas 2018 1625758283 fe2413af4681e60c033482af6dde0466 7a26e41a326bbad9ee17487303d2ac31b426c4983a4edb45e9909830d1136370 219x300 _zug308fuvbmx thumb jpg 06 15 13 49 0 66 249 64 133 2021 07 02 24 28 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17 pagefailed_18,200,"Home - Antioch, IL","[""04-10-18 Police And Fire Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -372,http://lafayettepolice.us/2144/events,Not Criminal Justice Related,Not Criminal Justice Related,"Events | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Events""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]","[""Boo at the Zoo"", ""Reindeer Rendezvous""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About the Zoo Get Involved Education Programs Special Events I Want To... Home Government Departments H - W Parks & Recreation Facilities Columbian Park Zoo Special Events Events Events 9 1 1 1 Boo at the Zoo This ""hauntingly-friendly"" event is perfect for your pre-school and elementary school-aged children! Link to page Reindeer Rendezvous The Columbian Park Zoo has announced a brand-new holiday event coming this season! Link to page Boo at the Zoo Reindeer Rendezvous Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About the Zoo Get Involved Education Programs Special Events I Want To... Home Government Departments H - W Parks & Recreation Facilities Columbian Park Zoo Special Events Events Events 9 1 1 1 Boo at the Zoo This ""hauntingly-friendly"" event is perfect for your pre-school and elementary school-aged children! Link to page Reindeer Rendezvous The Columbian Park Zoo has announced a brand-new holiday event coming this season! Link to page Boo at the Zoo Reindeer Rendezvous Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -373,https://delcopa.gov/vote/pdf/2021/minutes01_15_2021.pdf,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -374,https://delcopa.gov/planning/pubs/osrgp/vol-iii_chapter7uplandcountypark.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -375,https://cityofyuma.colorado.gov/departments/emergency-services/police-department/police-department-staff,Personnel Records,Info About Officers,Police Department Staff | City of Yuma,                   ,200,Home | City of Yuma,"[""Police Department Staff""]","[""Police Department Staff""]","[""Police Chief Jerry Thompson"", ""Sergeant James Thomson"", ""Sergeant Curtis Witte"", ""Patrol Officer Cameron Josh"", ""Patrol Officer Patrick Laybourn""]",[],[],[],"Skip to main content Visit ""Where can I get vaccinated"" or call 1-877-COVAXCO (1-877-268-2926) for vaccine information. Site Search Search Main Navigation - Top Bar Menu Home City Information » Vision and Mission City Holidays Permits and Information City of Yuma Municipal Codes Comprehensive Plan Historic Preservation Committee Economic Development Job Opportunities Local Event Information Marijuana Products Manufacturing Facility License Information Yuma Junction Departments » Animal Control » Animal Shelter Trap Neuter Return (TNR) Program Building Inspection City Clerk and Treasurer » Financial Information Vital Records City Manager Code Enforcement Emergency Services » Ambulance Fire Department Police Department » Crime Prevention Ordinances and Permits Police Department Fees Police Department Staff Municipal Court Parks & Recreation » Parks » Our Parks Recreation » Emergency Information Swimming Pool Recycling Sanitation Streets » Certification Of Streets Snow Removal Routes Street Sweeping Schedule Utility Services » Electric » Electric Meters Energy Consumption Calculator History of City of Yuma Electrical System What is an Electric Power Pole? Wastewater Water » Consumer Confidence Reports Customer Service - Water Division Source Water Protection Plan Water Conservation Water Distribution Water Production Yuma's Water History Yuma Community and Enrichment Center Yuma Public Library City Council » Agendas Minutes Agenda Item Comment Form Annual Budgets City Annual Audits City of Yuma Org/Pay Chart Online Payments COVID-19 Contact Us Home City Information » Vision and Mission City Holidays Permits and Information City of Yuma Municipal Codes Comprehensive Plan Historic Preservation Committee Economic Development Job Opportunities Local Event Information Marijuana Products Manufacturing Facility License Information Yuma Junction Departments » Animal Control » Animal Shelter Trap Neuter Return (TNR) Program Building Inspection City Clerk and Treasurer » Financial Information Vital Records City Manager Code Enforcement Emergency Services » Ambulance Fire Department Police Department » Crime Prevention Ordinances and Permits Police Department Fees Police Department Staff Municipal Court Parks & Recreation » Parks » Our Parks Recreation » Emergency Information Swimming Pool Recycling Sanitation Streets » Certification Of Streets Snow Removal Routes Street Sweeping Schedule Utility Services » Electric » Electric Meters Energy Consumption Calculator History of City of Yuma Electrical System What is an Electric Power Pole? Wastewater Water » Consumer Confidence Reports Customer Service - Water Division Source Water Protection Plan Water Conservation Water Distribution Water Production Yuma's Water History Yuma Community and Enrichment Center Yuma Public Library City Council » Agendas Minutes Agenda Item Comment Form Annual Budgets City Annual Audits City of Yuma Org/Pay Chart Online Payments COVID-19 Contact Us 0 Home Departments Emergency Services Police Department Police Department Staff Police Department Staff #FFFFFF Police Department Staff #FFFFFF Police Chief Jerry Thompson Sergeant James Thomson Sergeant Curtis Witte Patrol Officer Cameron Josh Patrol Officer Patrick Laybourn placeholder © 2024 State of Colorado Transparency Online Support Colorado Official State Web Portal " -376,https://www.mass.gov/doc/mptc-police-standards-subcommittee-open-meeting-notice-060821/download,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -377,https://delcopa.gov/vote/candidatelist.html,Not Criminal Justice Related,Not Criminal Justice Related,Election Ballot Offices,"",200,"Delaware County, Pennsylvania",[],[],[],[],[],[],"" -378,https://delcopa.gov/purchasing/bidsprops/delcomicrowavekmz.zip,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -379,https://www.mass.gov/doc/woburnpolicelieutenant5802rtf/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -380,https://delcopa.gov/employment/jobpostings/communityengagementspecialist.html,Training & Hiring Info,Info About Officers,"Community Engagement Specialist - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Community Engagement Specialist""]",[],"[""Delco Jobs Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Position Description"", ""Essential Duties"", ""Skills"", ""Qualifications"", ""Contact""]",[],[],"" -381,https://police.crystalmn.gov/g_o_v_e_r_n_m_e_n_t/departments_a-_z/administration,Contact Info & Agency Meta,Info About Agencies,Administration - City of Crystal,Links and information about the City of Crystal Administration Department.,200,Just a moment...,"[""Administration""]","[""City Hall""]","[""Sign up for a city newsletter or notification."", ""City Hall"", ""Regular Hours:""]","[""Monday - Friday""]",[],[],"" -382,https://coloradosprings.gov/police-department/article/news/public-assistance-needed-identify-sexual,Media Bulletins,Agency-Published Resources,Public Assistance Needed to Identify Sexual Assault Suspect | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Public Assistance Needed to Identify Sexual Assault Suspect""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -383,https://delcopa.gov/publicrelations/releases/2019/girlsspark.html,Not Criminal Justice Related,Not Criminal Justice Related,"County Council Recognizing the Girls Spark Conference - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""County Council Recognizing the Girls Spark Conference""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play County Council Recognizing the Girls Spark Conference Home / Departments / Public Relations Releases / County Council Recognizing the Girls Spark Conference Delaware County Council recognized Julia Kasper, founder of the Girls Spark Conference during the public council meeting held at the Thornbury Township Building on May 29. At just 16 years old, Julia Kasper created Girls Spark, a one-day empowering conference for high school girls to learn about, collaborate on, take action, and feel safe talking about the unique set of social, physical and emotional challenges they face during their teenage years and brainstorm ways to combat those challenges. The conference was held on April 6 at Delaware County Community College and was attended by over 150 young women. Delaware County Council Vice Chair Colleen Morrone had the privilege of attending and speaking to the bright and energized young women. “It was truly an empowering day for the young women who attended and a place where they could safely share the challenges and adversity they face and support one another,” said Morrone. “I was inspired by their honesty and their support and compassion for one another.” The event was organized by a core leadership group of area high school girls and an adult steering committee of women mentors. The Friends of the Delaware County Women’s Commission and other local groups served as sponsors and featured speakers. Topics included mental health, sexuality, body image, self-confidence, self-defense, sexual harassment and the transition to college or a career after high school. Council commended Julia Kasper and the entire Girls Spark team for hosting the event for young women in the county and presented them with a resolution commending their efforts. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play " -384,https://www.providenceri.gov/providence-police-department-deploy-axon-2-body-worn-cameras/police-body-camera/,Poor Data Source,Poor Data Source,City of Providence Providence Police Body Camera - City of Providence,"",200,Sucuri WebSite Firewall - Access Denied,"[""Providence Police Body Camera""]","[""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español"", ""Lists *""]",[],[],[],"Skip To Menu Skip To Content Skip To Accessibility Options Language Language Arabic Chinese (Traditional) English Khemer Portuguese Spanish City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley City Of Providence Mayor Brett Smiley Search Accessibility CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation PVD 311 CITY HALL I Want to … MAYOR BRETT P. SMILEY Departments City Council Find a Meeting Agenda Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Running a Business Starting a Business Purchasing EVENTS NEWS EXPLORE Explore Providence Parks Recreation ACCESSIBILITY Providence Police Body Camera Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn Providence Police Body Camera Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * " -385,https://southamptontownnypolice.gov/1/home,Not Criminal Justice Related,Not Criminal Justice Related,"Southampton, NY - Official Website | Official Website","",200,"Police | Southampton, NY - Official Website","[""Latest News"", ""Special Announcements"", ""Popular Links"", ""Upcoming Events""]",[],"[""Site Tools"", ""News Flash"", ""Calendar"", ""March 2024"", ""Calendar"", ""March 2024"", ""Contact Us"", ""Site Links"", ""Loading""]","[""Community Information Sessions - US Army Corps of Engineers"", ""Just Transition Southampton: Survey and Community Meeting #1"", ""Habitat for Humanity to Collect Reusable Household Items: North Sea & Hampton Bays Transfer Stations"", ""Town Conducts Brand Integrity Training with UL Solutions"", ""Town Launches Canoe Place Traffic Reduction Program"", ""Got Drugs? Operation Medicine Cabinet 4-27-2024"", ""April 15 Deadline to Order Banners for the 2024 Hometown Hero Program"", ""Join Councilwoman McNamara for the Great East End Clean-Up, April 27 and April 28"", ""Southampton Town Police Department's Annual Awards & Recognition Ceremony"", ""Councilmember Iasilli Sponsors Legislation to Designate Adopt a Pet Day in the Town of Southampton"", ""2024 Landmarks Maintenance Program Announced"", ""Councilmember Iasilli Establishes Traffic Mitigation and Safety Task Force"", ""Edith Windsor Heart Program"", ""280 David Whites - Special Announcement"", ""Hometown Hero Banner Program"", ""2024 Leaf Cleanup"", ""2024 Great East End Clean-Up"", ""March 26"", ""March 27"", ""March 28"", ""March 29"", ""March 25"", ""March 26"", ""March 28"", ""March 29""]",[],[],Skip to Main Content -386,http://police.portlandmaine.gov/638/nathan-clifford-re-use-advisory-task-for,Media Bulletins,Agency-Published Resources,"Nathan Clifford Re-Use Advisory Task Force | Portland, ME - Official Website","On December 17, 2012, the Portland City Council voted to approve the recommendations of the Nathan Clifford Re-Use Advisory Task Force.",200,"Portland, ME - Official Website | Official Website","[""Nathan Clifford Re-Use Advisory Task Force""]",[],[],[],[],[],"Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Completed Task Forces Nathan Clifford Re-Use Advisory Task Force Nathan Clifford Re-Use Advisory Task Force 2020 Charter Commission Ad Hoc Committee Ad Hoc ReCode Committee Broadband Planning Committee Congress Square Redesign Study Group Continuum of Care Council Appointee Subcommittee Fire / Code Inspections Task Force Franklin Street Committee Phase 2 Committee Members, City Staff & Consultants Vision Statement Green Building Incentive Task Force Green Packaging Working Group Hall School Building Committee Healthy Sustainable Food Systems Initiative Homelessness Prevention Task Force Libbytown Traffic Circulation & Streetscape Study Project Understanding Martin Luther King Recognition Task Force MLK Memorial Selection Committee Nathan Clifford Re-Use Advisory Task Force Past Housing Committee Pesticide & Fertilizer Task Force Portland Charter Commission Background Materials Portland Disability Advisory Committee Celebrating 30 Years of the ADA Get to know the PDAC Members Portland Open Space Vision & Implementation Plan Portland Youth Council Racial Equity Steering Committee School Facilities Ad Hoc Committee Solid Waste Task Force Spring Street - Free Street Area Streetscape Plan Members, City Staff & Consultants State & High Street Study Sustainable Storm Water Funding Task Force Task Forces CDBG Priority Task Force CDBG Working Group Waterfront Working Group Transforming Forest Avenue Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Completed Task Forces Nathan Clifford Re-Use Advisory Task Force Nathan Clifford Re-Use Advisory Task Force 2020 Charter Commission Ad Hoc Committee Ad Hoc ReCode Committee Broadband Planning Committee Congress Square Redesign Study Group Continuum of Care Council Appointee Subcommittee Fire / Code Inspections Task Force Franklin Street Committee Phase 2 Committee Members, City Staff & Consultants Vision Statement Green Building Incentive Task Force Green Packaging Working Group Hall School Building Committee Healthy Sustainable Food Systems Initiative Homelessness Prevention Task Force Libbytown Traffic Circulation & Streetscape Study Project Understanding Martin Luther King Recognition Task Force MLK Memorial Selection Committee Nathan Clifford Re-Use Advisory Task Force Past Housing Committee Pesticide & Fertilizer Task Force Portland Charter Commission Background Materials Portland Disability Advisory Committee Celebrating 30 Years of the ADA Get to know the PDAC Members Portland Open Space Vision & Implementation Plan Portland Youth Council Racial Equity Steering Committee School Facilities Ad Hoc Committee Solid Waste Task Force Spring Street - Free Street Area Streetscape Plan Members, City Staff & Consultants State & High Street Study Sustainable Storm Water Funding Task Force Task Forces CDBG Priority Task Force CDBG Working Group Waterfront Working Group Transforming Forest Avenue Government Websites by CivicPlus® " -387,http://www.longbeach.gov/police/press-releases/traffic-fatality---palo-verde-ave-and-los-coyotes-diagonal/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY - PALO VERDE AVE AND LOS COYOTES DIAGONAL,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/30/2019 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY - PALO VERDE AVE AND LOS COYOTES DIAGONAL Contact: Media Relations Detail (562) 570-5273 lbpdmediarelations@longbeach.gov On Wednesday, January 30, 2019, at approximately 11:00 a.m., officers responded to the area of Palo Verde Avenue and Los Coyotes Diagonal regarding a traffic collision involving a motor vehicle and a bicyclist, which resulted in the death of the bicyclist. Upon arrival, officers located the collision in the southbound lanes of Los Coyotes Diagonal south of Palo Verde Avenue, and the bicyclist, a 62-year-old male resident of Long Beach, laying in the roadway. The Long Beach Fire Department transported the bicyclist to a local hospital with life threatening injuries, where he was pronounced deceased. The preliminary investigation revealed the bicyclist was traveling in the northbound bike lane of Los Coyotes Diagonal approaching Palo Verde Avenue on a green light, when just before entering the intersection and south of the crosswalk, the bicyclist made an unsafe lane change across all lanes of traffic in a northwesterly direction and collided with a 2015 Toyota Corolla that was travelling southbound on Los Coyotes Diagonal in the #2 lane. The driver of the Toyota Corolla, a 88-year-old male resident of Long Beach, remained at the scene and cooperated with the investigation.  At this time no criminal charges are pending. The identity of the bicyclist is being withheld pending notification of next of kin. Anyone who may have witnessed this incident is asked call Detective David Lauro of the Long Beach Police Department’s Collision Investigation Detail at 562-570-7355. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -388,https://www.southamptontownnypolice.gov/442/community-preservation-advisory-board,Media Bulletins,Agency-Published Resources,"Community Preservation Advisory Board | Southampton, NY - Official Website",View the members of the Community Preservation Advisory Board.,200,"Police | Southampton, NY - Official Website","[""Community Preservation Advisory Board""]","[""Meetings"", ""Members""]","[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Boards & Committees Advisory Boards & Committees Community Preservation Advisory Board Community Preservation Advisory Board Meetings 8:00 a.m. Third Wednesday of each month Hampton Bays Senior Center 25 Ponqougue Ave, Hampton Bays, NY Members Robert Anrig Bruce Doscher Adam Halsey William Sickles Elena Williams Scott Wilson John v.H. Halsey, Peconic Land Trust, or designee - ex officio Kevin McDonald, The Nature Conservancy, or designee - ex officio Hank Kraszewski, or designee - ex-officio William B. White, or designee - ex-officio Each member serves a one-year term. Addiction and Recovery/Behavioral Health Committee Affirmative Action Task Force Airport Noise Advisory Committee Anti-Bias Task Force Agricultural Advisory Committee Audit Advisory Committee Budget & Finance Advisory Committee Citizen Advisory Committees East Quogue CAC Agendas & Minutes Hampton Bays CAC Agendas & Minutes North Sea CAC Agendas & Minutes Noyac CAC Agendas & Minutes Southampton / Shinnecock Hills / Tuckahoe CAC CAC Minutes Water Mill CAC Agendas & Minutes Westhampton, Speonk-Remsenburg, Eastport, Quiogue Agendas & Minutes Community Housing Fund Advisory Board Community Preservation Advisory Board Dark Skies Committee Deer Protection and Management Advisory Committee Disability Advisory Committee Emergency Medical Services Advisory Committee Facilities / Infrastructure Committee Fire Advisory Committee Historic Burying Ground Committee Labor-Management Committee Planning Policy Advisory Committee Police Department/Labor Relations Advisory Road Review Committee Safety & Risk Management Committee SEA-TV Channel Committee Solid Waste Advisory Committee Southampton Arts and Culture Committee (SHACC) Sustainable Southampton Green Advisory Committee Trades Advisory Committee Traffic Mitigation and Safety Task Force Trails Advisory Board Veterans Affairs Water Mill Park District Budget Steering Advisory Wind Energy Conversion Systems Advisory Committee Water Quality Advisory Committee Workplace Violence Prevention Committee Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -389,https://spdblotter.seattle.gov/2015/03/24/police-arrest-suspect-in-violent-robbery-at-rainier-beach-doughnut-shop/,Media Bulletins,Agency-Published Resources,Police Arrest Suspect In Violent Robbery At Rainier Beach Doughnut Shop - SPD Blotter,"",200,403 Forbidden,"[""Police Arrest Suspect In Violent Robbery At Rainier Beach Doughnut Shop""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -390,https://delcopa.gov/treasurer/forms/2023appealformscommercial.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -391,https://www.lynchburgvapolice.gov/wp-content/uploads/2021/03/dsc0161-scaled.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -392,http://www.longbeach.gov/police/press-releases/traffic-fatality-pacific-coast-highway-and-lime-avenue/,Media Bulletins,Agency-Published Resources,Traffic Fatality: Pacific Coast Highway and Lime Avenue,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/3/2017 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY - PACIFIC COAST HIGHWAY & LIME AVENUE Contact: Media Relations Detail (562) 570-5273 On Thursday, November 2, 2017, at approx. 6:40 p.m., officers were dispatched to the intersection of Pacific Coast Highway and Lime Avenue regarding a vehicle versus pedestrian injury traffic collision. Upon arrival officers determined that two vehicles had collided with a female pedestrian who had sustained major body trauma. Long Beach Fire Deparment responded and transported the victim to a local area hospital where she was later pronounced deceased. The preliminary investigation revealed that the unidentified female pedestrian, approx. 40-50 years old, was traveling on a skateboard southbound across Pacific Coast Highway (P.C.H.) at Lime Avenue. The pedestrian was outside of the unmarked crosswalk when a 1991 Nissan Pathfinder, driven by a 55-year-old male resident of Long Beach, collided with the pedestrian in the #2 eastbound lane of P.C.H., east of Lime Avenue. The force of the impact caused the pedestrian to land in the #1 eastbound lane of P.C.H. where she was run over by a 2005 Toyota Sienna, driven by a 62-year-old female resident of Long Beach. Both vehicles remained at the scene and the drivers cooperated in the investigation. They were later released from the scene, pending further investigation. Anyone who may have witnessed this incident is asked to call Detective Sirilo Garcia of the Long Beach Police Department's Collision Investigation Detail at (562) 570-7355. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -393,https://alpha.austin.gov/police-oversight/2020-11-12/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -394,http://www.longbeach.gov/police/press-releases/arrests-made-in-two-robberies--charges-filed/,Media Bulletins,Agency-Published Resources,ARRESTS MADE IN TWO ROBBERIES; CHARGES FILED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -395,http://www.lafayettepolice.us/list.aspx,Resources,Agency-Published Resources,"Notify Me • Lafayette, IN • CivicEngage","",200,"Police Department | Lafayette, IN - Official Website","[""Notify Me®""]","[""Please sign in to subscribe, unsubscribe, or manage your subscriptions"", ""Your Profile Information"", ""▼ Notify Me"", ""▼ Agenda Center"", ""▼ Alert Center"", ""▼ Bid Postings"", ""▼ Calendar"", ""▼ Government Jobs"", ""▼ News Flash""]","[""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -396,https://www.coppelltx.gov/faq.aspx?qid=432,Resources,Agency-Published Resources,"","",404,"","","","","","","","" -397,https://www.hayward-ca.gov/discover/news/may21/hayward-police-department-maintains-national-law-enforcement-accreditation-calea,Media Bulletins,Agency-Published Resources,Hayward Police Department Maintains National Law Enforcement Accreditation by CALEA | City of Hayward - Official website,"Hayward Police Department Maintains National Law Enforcement Accreditation by CALEAÒGainesville, VA – The Hayward Police Department was awarded national accreditation on March 27, 2021 by the Commission on Accreditation for Law Enforcement Agencies, Inc. (CALEAÒ) in the Advanced Law Enforcement Accredtation program.",200,City of Hayward - Official website,"[""Hayward Police Department Maintains National Law Enforcement Accreditation by CALEA""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form"", ""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment""]",[],"[""Do you need help paying energy bills? You may qualify for federal aid."", ""Hayward Receives Grant for Safe Routes to Schools Infrastructure and Bicycle Incentives"", ""Hayward Celebrates Earth Day at Weekes Park!"", ""Spring 2024 Compost Giveaway"", ""Sustainable Solutions for Celebrating Easter"", ""City Hall and Nonessential Services Closure: Monday, Apr. 01, 2024"", ""Presidential Primary Election: Tuesday, Mar. 5, 2024"", ""Library Closure: February 12 and February 19, 2024."", ""City Hall and Nonessential Services Closures: Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""YOU ARE HERE. SO IS EVERYTHING ELSE."", ""Related News"", ""Press Release - Homicide Investigation"", ""Celebrate this St. Patrick’s Day Responsibly: Designate a Sober Driver, Your Lucky Charm"", ""Hayward Police Department Holding DUI Checkpoint March 28, 2024"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],Skip to main content -398,https://delcopa.gov/council/2019minutes/111319minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -399,https://www.lynchburgvapolice.gov/wp-content/uploads/2022/02/cotw-1-e1644350006495.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -400,https://www.stcharlesil.gov/news/2021/04/01/welcome-new-police-officers,Media Bulletins,Agency-Published Resources,City News and Events | City of St. Charles IL,"Overview of the latest news and events for the City of St. Charles, IL",200,"City of St. Charles, Illinois","[""City of St. Charles, Illinois"", ""News & Events""]","[""You are here"", ""News Menu ☰"", ""First Fox River Dam Joint Task Force Meeting Announced"", ""Spring Hydrant Flushing Begins April 1"", ""City of St. Charles Offers Free Yard Waste Pick Up"", ""St. Charles Visitors Cultural Commission Soliciting Requests for Funding"", ""The March City News is Out!"", ""St. Charles Police Offer Free Narcan and Sharps Collection"", ""New Utility Billing System Launched"", ""S. Riverside Ave. Lane Closure"", ""2023 City Highlights"", ""St. Charles Police Announce New C.A.R.E.S. Program for Residents at Risk"", ""Coming up"", ""Equity & Inclusion Commission Meeting"", ""Fox River Dam Joint Task Force"", ""Zoning Board of Appeals"", ""Youth Commission Meeting"", ""City Council Meeting"", ""Government Operations Committee Meeting"", ""Government Services Committee Meeting"", ""Plan Commission Meeting"", ""Historic Preservation Commission Meeting"", ""Foreign FIre Insurance Tax Board Regular Meeting"", ""View more events"", ""Key Resources"", ""Connect With Us""]",[],[],[],[],"" -401,https://alpha.austin.gov/en/police-oversight/written-reprimand-of-officer-david-lara/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -402,http://www.longbeach.gov/police/press-releases/suspect-arrested-for-murder-of-high-school-student/,Media Bulletins,Agency-Published Resources,SUSPECT ARRESTED FOR MURDER OF HIGH SCHOOL STUDENT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/12/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: SUSPECT ARRESTED FOR MURDER OF HIGH SCHOOL STUDENT Contact: Media Relations Detail (562) 570-7244 VICTIM KESHAWN BROOKS On Thursday, March 12, 2015, at approximately 3:25 p.m., Long Beach Police received a 9-1-1 call from a community member regarding an assault with a deadly weapon call in the 2800 block of Santa Fe Avenue, which resulted in the death of a 15-year-old young man. The victim, identified as 15-year-old Keyshawn Brooks of Long Beach, was walking home from Cabrillo High School when he was confronted by a male suspect who attempted to grab his backpack. During the confrontation, the suspect stabbed Keyshawn and ran from the location. Officers arrived on scene within two minutes of being dispatched and located Keyshawn who had sustained serious injuries. Community members had begun administering first aid to Keyshawn until medical assistance arrived.  He was transported to a local hospital by Long Beach Fire Department paramedics, and pronounced deceased shortly thereafter. Officers at the scene quickly developed leads on the suspect's whereabouts, which led them to a residence in the 1700 block of W. Columbia Avenue, where he was apprehended. The suspect has been identified as 18-year-old Giovanny Montelongo of Long Beach.  He is currently being interviewed by detectives and will be booked at the conclusion. A motive for this incident is unknown and still under investigation. This incident occurred across the street from Stephens Middle School at the time school was letting out and numerous parents were in the area picking-up their kids. Therefore, detectives believe many parents witnessed some or all of the incident, and would like them to come forward. Although this incident did not occur on a school campus, the Police Department is working closely with the Long Beach Unified School District.  The district will be providing grief counseling support to any students in need. Anyone with information should contact Long Beach Police Homicide Detectives Malcolm Evans and Mark Bigel Guarino at (562) 570-7244.  Anonymous tips may be submitted by calling 1-800-222-tips (8477), texting TIPLA plus your tip to crimes or (274637), or by visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -403,https://alpha.austin.gov/es/police-oversight/formal-complaint-purpose-and-scope-and-other-policy-violations-9/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -404,https://www.hermonmaine.gov/departments/police-department/gallery/,Poor Data Source,Poor Data Source,Gallery | Hermon,  Prescription Drug Take Back Hermon Harvest & Homecoming. Prescription Drug Take Back at the Hermon Harvest & Homecoming. Marijuana Plant Seiz ...,200,Welcome to Hermon! | Hermon,"[""Gallery""]","[""Penobscot County Sheriff's Department""]",[],[],[],[],"The Town Office will be CLOSED on Wednesday, March 27, 2024 from 11:15 to 1:45 Business Calendar FAQS Online Services RFP’S & Forms Job Openings I want to … Register my Vehicle Register My Dog Register My Boat Find Out About My Curbside Pickup and Waste Disposal Get a Burn Permit Bid on Hermon Projects CodeRED Community Notification Enrollment Page Purchase Veteran’s Memorial Brick Track Committee Search for: Office : 207-848-1010 Fax : 207-848-3316 Hours : Monday–Friday, 8am–4pm 333 Billings Road, Hermon, ME 04401 Menu Town Council & Commitees Planning Board Staff Directory Town Committees Town Council Meetings Departments Assessing Code Enforcement Economic & Community Development Finance Office Fire Department Parks & Recreation Department Penobscot County Sheriff’s Department Public Works Taxes & Tax Collector Town Clerk Government Annual Town Audits Annual Town Reports Bids & Proposals Budget Information Charter, Code of Ordinances, Comp Plan & Bylaws Election & Town Meeting Town Manager Life Calendar Hermon Street Map Resources Schools The Hermon Connection Visiting Upcoming Events & News Public Notice Contact Us Hermon’s Legislature Contacts Map & Directions Staff Directory Gallery Prescription Drug Take Back Hermon Harvest & Homecoming. Prescription Drug Take Back at the Hermon Harvest & Homecoming. Marijuana Plant Seizure Hermon Town Council proclaimed September 11, 2016 in honor of Law Enforcement, Fire Fighters and Emergency Medical Personnel. Blue Iris Scan of children at the Kid’s Carnival. PCSO Honor Guard Women’s Self Defense Class Hermon Hawks “Kickoff With A Cop” Sheriff Troy Morton and Deputies are all organized with former NFL star Mike Devito of the Kansas City Chiefs for Kickoff with a Cop. Mike Devito autographing a football for an up and coming Hermon Hawk. PCSO saluting the American Flag during the National Anthem. Penobscot County Sheriff's Department About Us Animal Control Contact Us Deputies Frauds and Scams Gallery Police Alert Roadway Parking Send An Anonymous Tip to the Hermon PD © 2024 Hermon | Privacy Policy | Designed by Sutherland • Weston The Town Office will be CLOSED on Wednesday, March 27, 2024 from 11:15 to 1:45 The Town Office will be CLOSED on Wednesday, March 27, 2024 from 11:15 to 1:45 Business Calendar FAQS Online Services RFP’S & Forms Job Openings I want to … Register my Vehicle Register My Dog Register My Boat Find Out About My Curbside Pickup and Waste Disposal Get a Burn Permit Bid on Hermon Projects CodeRED Community Notification Enrollment Page Purchase Veteran’s Memorial Brick Track Committee Search for: Business Calendar FAQS Online Services RFP’S & Forms Job Openings I want to … Register my Vehicle Register My Dog Register My Boat Find Out About My Curbside Pickup and Waste Disposal Get a Burn Permit Bid on Hermon Projects CodeRED Community Notification Enrollment Page Purchase Veteran’s Memorial Brick Track Committee Search for: " -405,https://delcopa.gov/departments/recorderofdeeds.html,Contact Info & Agency Meta,Info About Agencies,"Recorder of Deeds - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Recorder of Deeds""]",[],"[""DOCUMENT TYPES"", ""Forms"", ""Frequently Asked Questions"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""ATTENTION: CLOUD SEARCH is now live."", ""Update as of January 2024."", ""E-RECORDING IN DELAWARE COUNTY :""]",[],[],"" -406,https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-8/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -407,https://www.tukwilawa.gov/event/virtual-town-hall-with-chief-of-police/,Poor Data Source,Poor Data Source,Virtual Town Hall with Chief of Police - City of Tukwila,"",200,Home - City of Tukwila,"[""Virtual Town Hall with Chief of Police""]","[""June 15, 2021 @ 6:00 pm - 8:00 pm"", ""Details"", ""Related Events""]","[""Finance & Governance Committee"", ""Transportation & Infrastructure Services Committee"", ""City Council Committee of the Whole Meeting""]","[""City of Tukwila""]","[""I am a..."", ""Online Services"", ""Most Requested Forms""]",[],"" -408,https://www.coppelltx.gov/faq.aspx?qid=119,Resources,Agency-Published Resources,FAQs • Where can I find maps?,"",200,"Coppell, TX | Official Website",[],"[""▼ Planning""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -409,http://www.longbeach.gov/police/,Contact Info & Agency Meta,Info About Agencies,Police,Long Beach Police Department,200,City of Long Beach,"[""Police Department""]",[],"[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""Police Department"", ""We're Hiring! Join LBPD Today!"", ""Latest News"", ""Phone Numbers"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", """", """", """", """", ""Crime Lab Survey"", """"]",[],"" -410,https://www.warracres-ok.gov/police-department-history/warr-acres-pd-first-patch/,Poor Data Source,Poor Data Source,Warr Acres PD First Patch - City of Warr Acres,"",200,Home - City of Warr Acres,"[""Warr Acres PD First Patch""]","[""Primary menu links"", ""Action toolbar"", ""Contact""]",[],[],"[""Can I park a motor home or trailer in the grass?""]",[],"City of Warr Acres Primary menu links Home Businesses Commercial Property Available Economic Development Residents Helpful Numbers Online Forms News City Newsletter City Maps City Parks Contact your city History of Warr Acres Recycling Report an Issue Sanitation & Sewer Newsletter Contact Employees Employee Email Job Listings Staff Only AFLAC BlueCross BlueShield Deferred Comp Action toolbar Answers Payments Report Issue Search Primary menu links Home Businesses Commercial Property Available Economic Development Residents Helpful Numbers Online Forms News City Newsletter City Maps City Parks Contact your city History of Warr Acres Recycling Report an Issue Sanitation & Sewer Newsletter Contact Employees Employee Email Job Listings Staff Only AFLAC BlueCross BlueShield Deferred Comp Action toolbar Answers Payments Report Issue Search City of Warr Acres City of Warr Acres City of Warr Acres Warr Acres PD First Patch Warr Acres PD First Patch Warr Acres PD First Patch Share Facebook Twitter Email Size + Reset a − Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu City of Warr Acres Contact City of Warr Acres Phone: 405-789-2892 4301 N Ann Arbor Ave. Warr Acres, Oklahoma 73122 Contact Links Directory Feedback Access Links Accessibility Sitemap Can I park a motor home or trailer in the grass? Parking on the grass is prohibited in Warr Acres. In addition municipal ordinance limits what types of vehicles can be parked in the residential areas. Vehicles with three or more axles and commercial vehicles are prohibited in residential areas.  For detailed ordinance visit the municipal code . See the entire answer " -411,https://police.greenvillesc.gov/faq.aspx?qid=382,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Are figure skates available?,"",200,"Police Department | Greenville, SC - Official Website",[],"[""▼ Ice on Main""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -412,https://www.southamptontownnypolice.gov/faq.aspx?qid=421,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • What happens if there is bad weather?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ SFCC - South Fork Commuter Connection""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -413,https://ose.louisiana.gov/event/police-sergeant-18/,Poor Data Source,Poor Data Source,Police Sergeant | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Police Sergeant""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Police Sergeant Promotional Level Application Deadline TBD Jurisdiction Baker Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Police Sergeant Promotional Level Application Deadline TBD Jurisdiction Baker Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Sergeant Promotional Level Application Deadline TBD Jurisdiction Baker Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Sergeant Promotional Level Application Deadline TBD Jurisdiction Baker Application This event has passed. Police Sergeant Promotional Level Application Deadline TBD Jurisdiction Baker Application This event has passed. Police Sergeant Promotional Level Application Deadline TBD Jurisdiction Baker Application This event has passed. Police Sergeant Promotional Level Promotional Level Promotional Level Application Deadline TBD Jurisdiction Baker Application Deadline TBD Jurisdiction Baker Application Deadline TBD Jurisdiction Baker Application Deadline TBD Application Deadline Jurisdiction Baker Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -414,https://www.providenceri.gov/officer-louis-salinaro-k-9-gero-locate-apprehend-subject-wanted-police-hiding-basement/press-release-k9/,Poor Data Source,Poor Data Source,City of Providence K9-Gero - City of Providence,"",200,Sucuri WebSite Firewall - Access Denied,"[""K9-Gero""]","[""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español"", ""Lists *""]",[],[],[],"Skip To Menu Skip To Content Skip To Accessibility Options Language Language Arabic Chinese (Traditional) English Khemer Portuguese Spanish City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley City Of Providence Mayor Brett Smiley Search Accessibility CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation PVD 311 CITY HALL I Want to … MAYOR BRETT P. SMILEY Departments City Council Find a Meeting Agenda Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Running a Business Starting a Business Purchasing EVENTS NEWS EXPLORE Explore Providence Parks Recreation ACCESSIBILITY K9-Gero Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn K9-Gero Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * " -415,http://www.ryepolice.us/logs/police-logs-11-09-22-11-15-22,Daily Activity Logs,Info About Officers,Rye Police Department Police Logs 11/09/22-11/15/22 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs 11/09/22-11/15/22""]","[""Police Logs 11/09/22-11/15/22""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -416,https://delcopa.gov/planning/pubs/connectivityranking.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -417,https://www.sandiego.gov/department-document/commission-police-practices-members-psln-committee-re-list-recommendations,Resources,Agency-Published Resources,Commission on Police Practices to Members of the PS&LN Committee Re: List of Recommendations for Implementation Ordinance | City of San Diego Official Website,Memo 12/1/21 Commission Timeline,200,City of San Diego Official Website,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Commission on Police Practices to Members of the PS&LN Committee Re: List of Recommendations for Implementation Ordinance"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -418,https://www.stpaul.gov/departments/police/21st-century-policing-report/pillar-1-trust-and-legitimacy/report-7,Media Bulletins,Agency-Published Resources,Report Recommendation 1.9 | Saint Paul Minnesota,Law enforcement agencies should build relationships based on trust with immigrant communities.,200,Home | Saint Paul Minnesota,"[""Report Recommendation 1.9""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Footer""]","[""You are using an unsupported browser. Please use Microsoft Edge."", ""SPPD is committed to community"", ""SPPD is committed to racial equity"", ""SPPD supports our immigrant communities"", ""SPPD serves and protects all of our communities regardless of immigration status"", ""SPPD serves all victims"", ""SPPD employs officers fluent in community languages"", ""SPPD is committed to equal access"", ""SPPD publishes in five languages and is committed to more"", ""SPPD partners with diverse community services"", ""SPPD Response"", ""Contact The City"", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured"", ""Reference Data"", ""Reference Data"", ""Reference Data"", ""Reference Data"", ""Reference Data""]",[],[],"" -419,https://www.grovecityohio.gov/division-of-police/coin-survey/,Not Criminal Justice Related,Not Criminal Justice Related,"","",404,"","","","","","","","" -420,https://www.antioch.il.gov/wpfb-file/11-16-10-police-pension-fund-agenda-pdf-4/,Poor Data Source,Poor Data Source,"11-16-10 Police Pension Fund Agenda - Antioch, IL",13482 11 16 10 police pension fund agenda pdf commissions agendas 2010 1625758337 5ae0d0488d071428938164121e27df1d 2ef1356bfc60a11d27041adfb24a51b133cf753a2322a8741f57a4d30267ac55 224x300 _wrnjqxl1aexj thumb jpg 2017 05 17 08 41 32 0 40 77 167 25 2021 06 38 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17 pagefailed_18 pagefailed_19,200,"Home - Antioch, IL","[""11-16-10 Police Pension Fund Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -421,http://www.longbeach.gov/globalassets/police/media-library/images/press-releases/2015/thumb_bobbysketch-.jpg,Poor Data Source,Poor Data Source,City of Long Beach,"",200,City of Long Beach,[],"[""Page Not Found""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[],"" -422,http://www.longbeach.gov/police/press-releases/robbery-suspects-arrested--charged/,Media Bulletins,Agency-Published Resources,ROBBERY SUSPECTS ARRESTED & CHARGED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/12/2017 FOR IMMEDIATE RELEASE Press Release # Subject: ROBBERY SUSPECTS ARRESTED & CHARGED Contact: Media Relations (562) 570-5273 On December 11, 2017, felony charges were filed against a 35-year-old female and a 48-year-old male for their involvement in multiple robberies in Long Beach. On December 7, 2017, detectives arrested 35-year-old Meleny Ann Rivera and 48-year-old Anthony Montez in the 300 block of West Sepulveda, in the City of San Pedro. Detectives executed a search warrant at the suspects’ residence recovering a pellet gun, a knife and more than 800 articles of clothing. Between July 27, 2017 through November 20, 2017, an armed robbery took place in the 2000 block of Pacific Avenue, and another robbery in the 900 block of Long Beach Blvd. The preliminary investigation indicated that the suspects, armed with a handgun or a knife, would enter the stores and remove several articles of clothing. As the employees approached the suspects, the suspects pointed a handgun or knife at the clerks, fleeing the locations with the clothing. No employees were injured during the robberies. Through their investigation, detectives were able to view video footage of the robberies and identified the suspects. Yesterday, the case was presented to the Los Angeles County District Attorney’s Office, which filed three counts of robbery against Meleny Ann Rivera and five counts of robbery against Anthony Montez. Rivera is being held at the Long Beach City Jail, on $150,000 bail. Montez is currently being held at the Los Angeles County Jail, on $310,000 bail. Montez also had $30,000 in outstanding warrants for theft related charges. Both suspects are believed to have committed similar robberies in Los Angeles and Orange Counties. Anyone with information regarding this investigation is encouraged to call Robbery Detective Parkhill at (562) 570-5535. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -423,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0372/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -424,https://champaignil.gov/tag/police-continue-to-seek-suspect-in-september-12-bank-robbery-regions-bank/,Media Bulletins,Agency-Published Resources,Police Continue to Seek Suspect in September 12 Bank Robbery – Regions Bank Archives - City of Champaign,"",200,403 Forbidden,"[""Items tagged: Police Continue to Seek Suspect in September 12 Bank Robbery – Regions Bank""]","[""Police Continue to Seek Suspect in September 12 Bank Robbery – Regions Bank"", ""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Items tagged: Police Continue to Seek Suspect in September 12 Bank Robbery – Regions Bank Search Police Continue to Seek Suspect in September 12 Bank Robbery – Regions Bank Posted: September 25, 2017 Champaign Police have received a number of tips associated with the September 12 bank robbery of Regions Bank (111 S. State St.) and request additional support to locate the suspect, 38-year-old Derek L. Watson of Champaign. A more recent photo of Watson is being provided to aid in citizen identification. According to reports, Watson entered […] Categories: General Press Releases , Police Department Press Releases | Tags: Champaign County Crime Stoppers , Police Continue to Seek Suspect in September 12 Bank Robbery – Regions Bank Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works " -425,https://www.dps.arkansas.gov/law-enforcement/arkansas-state-police/directors-office/asp-commission/,Contact Info & Agency Meta,Info About Agencies,ASP Commission - Arkansas Department of Public Safety,"",200,Home - Arkansas Department of Public Safety,"[""Flag Status""]","[""ASP Commission"", ""Meeting Minutes"", ""Commission Rules"", ""Contact ASP"", ""Helpful ASP links"", ""Connect with ASP"", ""Respect. Integrity. CUSTOMER SERVICE. TEAMWORK. SERVANT LEADERSHIP. CONTINUOUS IMPROVEMENT"", """", ""© 2024 All rights Reserved. Arkansas.gov""]","[""Jeffery Teague"", ""John Allison"", ""Jim Hinkle"", ""Ken Reeves"", ""Neff Basore"", ""Mike Akin"", ""Stephen Edwards""]",[],"[""About DPS"", ""DPS Links"", ""DPS Address"", ""Your Arkansas.gov"", ""Top Online Services"", ""Helpful Information""]",[],"" -426,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0455/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -427,https://coloradosprings.gov/police-department/page/investigations-division,Poor Data Source,Poor Data Source,"","",403,"","","","","","","","" -428,https://www.rentonwa.gov/city_hall/police/investigations/domestic_violence/cycle_of_violence,Media Bulletins,Agency-Published Resources,Cycle of Violence - City of Renton,"",200,Just a moment...,"[""CITY OF RENTON WASHINGTON""]","[""Cycle of Violence""]",[],"[""Phase 1: Tension Building Phase"", ""Batterer may:"", ""Partner may:"", ""Phase 2: Crisis Phase"", ""Batterer may:"", ""Partner may:"", ""Phase 3: Calmer Phase"", ""Batterer may:"", ""Partner may:""]","[""""]","[""Domestic Violence Victim Advocate""]",Skip navigation -429,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2019_news_releases/release_of_sex_offender_into_community_-_navarro,Media Bulletins,Agency-Published Resources,Release of Sex Offender into Community - Navarro - Village of Pleasant Prairie,"",200,Just a moment...,[],"[""Release of Sex Offender into Community - Navarro""]","[""Follow Us on Social Media""]",[],[],[],"" -430,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/091421arrests.pdf,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -431,https://data.charlottenc.gov/datasets/cmpd-police-wrecker-zones,Poor Data Source,Poor Data Source,City of Charlotte Open Data Portal,"Charlotte's Open Data Portal, The City of Charlotte's Open Data Portal allows users to search, explore and discover relevant datasets that are served out by the City of Charlotte, NC.",200,City of Charlotte Open Data Portal,[],[],[],[],[],[],"" -432,http://www.lafayettepolice.us/614/find,Resources,Agency-Published Resources,"Find | Lafayette, IN - Official Website","Find links to BuyCrash.com, forms and applications, fugitive search, the police memorial wall, and the honor guard.",200,"Police Department | Lafayette, IN - Official Website","[""Find""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]","[""Forms & Applications"", ""BuyCrash.com""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Your LPD Career Opportunities Community Outreach Training Center How Do I… Find 9 1 1 2 Forms & Applications Browse through a list of Police Department forms and applications. BuyCrash.com Visit the BuyCrash.com website to search for and purchase a police crash report. Forms & Applications BuyCrash.com Career Opportunities Report a Crime Thank an Officer Stay Connected Alarm Reduction Contact Us 601 Columbia Street Lafayette, IN  47901 Phone: 765-807-1200 FAQs What is the number to the jail? Can you tell me if someone is wanted on warrant? How do I obtain a handgun permit? How can I request a street closure for a special event? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Your LPD Career Opportunities Community Outreach Training Center How Do I… Find 9 1 1 2 Forms & Applications Browse through a list of Police Department forms and applications. BuyCrash.com Visit the BuyCrash.com website to search for and purchase a police crash report. Forms & Applications BuyCrash.com Career Opportunities Report a Crime Thank an Officer Stay Connected Alarm Reduction Contact Us 601 Columbia Street Lafayette, IN  47901 Phone: 765-807-1200 FAQs What is the number to the jail? Can you tell me if someone is wanted on warrant? How do I obtain a handgun permit? How can I request a street closure for a special event? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Your LPD Career Opportunities Community Outreach Training Center How Do I… Find 9 1 1 2 Forms & Applications Browse through a list of Police Department forms and applications. BuyCrash.com Visit the BuyCrash.com website to search for and purchase a police crash report. Forms & Applications BuyCrash.com Career Opportunities Report a Crime Thank an Officer Stay Connected Alarm Reduction Contact Us 601 Columbia Street Lafayette, IN  47901 Phone: 765-807-1200 FAQs What is the number to the jail? Can you tell me if someone is wanted on warrant? How do I obtain a handgun permit? How can I request a street closure for a special event? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -433,http://www.longbeach.gov/police/press-releases/lbpd-joins-crackdown-on-texting---hand-held-cell-use-behind-the-wheel/,Media Bulletins,Agency-Published Resources,LBPD JOINS CRACKDOWN ON TEXTING & HAND-HELD CELL USE BEHIND THE WHEEL,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -434,https://www.ashevillenc.gov/wp-content/uploads/2019/03/crime-scene-investigation-police2.jpg,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -435,https://champaignil.gov/2019/09/29/champaign-police-investigating-shooting-2/,Media Bulletins,Agency-Published Resources,Champaign Police Investigating Shooting - City of Champaign,"",200,403 Forbidden,"[""Champaign Police Investigating Shooting""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Champaign Police Investigating Shooting Search Posted on September 29, 2019 On Sept. 29, 2019, at approximately 1:58 p.m., Champaign Police were called to the 1300 block of Summit Ridge Road for a report of a shooting. Upon arrival, police discovered a 23-year-old male victim suffering from a gunshot wound. The victim was transported to an area hospital for injuries not believed to be life-threatening at this time. The preliminary investigation suggests the victim was shot while walking alongside the road. There is information that a black vehicle may have been involved in the shooting. There is currently no available suspect information and no arrests have been made at this time. If any resident or business in the nearby area has exterior surveillance camera systems, please contact the police department. It is believed video footage may be of investigative assistance. The investigation continues and future updates may be provided as they become available. Anyone with information about this incident is asked to please to contact police at 217-351-4545. Arrangements may be made for information to be shared privately. If you wish to remain anonymous you may also submit tips to Crime Stoppers by phone at: 217-373-8477 (TIPS); online at 373tips.com; or the “P3 Tips” mobile app. Champaign Police reminds citizens that information submitted to Crime Stoppers is completely anonymous. Calls are routed to a third-party national call center that receives your information, completes a tips information form, and then passes the information to the appropriate law enforcement agency. Caller ID tracking is not utilized by Crime Stoppers and conversations are not recorded. Crime Stoppers will pay a reward up to $1,000 for information leading to the arrest of the person(s) responsible for this crime. Categories: Police Department Press Releases Tags: Champaign Police Investigating Shooting , Summit Ridge Road Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign " -436,https://alpha.austin.gov/en/police-oversight/community-police-review-commission-memo-2019-0267/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -437,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-1022/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -438,https://spdblotter.seattle.gov/2012/08/03/seattle-neighborhood-group-and-seattle-police-department-team-up-to-tackle-graffiti-in-little-saigon/,Media Bulletins,Agency-Published Resources,Seattle Neighborhood Group and Seattle Police Department team up to tackle graffiti in Little Saigon - SPD Blotter,"",200,403 Forbidden,"[""Seattle Neighborhood Group and Seattle Police Department team up to tackle graffiti in Little Saigon""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -439,https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scope-and-other-policy-violations-9/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -440,https://normandyparkwa.gov/city-news/police-department/happy-thanksgiving/,Not Criminal Justice Related,Not Criminal Justice Related,Happy Thanksgiving - City of Normandy Park,"Happy Thanksgiving! Speaking of thankful, if you really want the community to be thankful please donate your blood next week at Normandy Park...",200,City of Normandy Park,"[""Happy Thanksgiving""]","[""Save a life today!"", ""TOYS FOR TOTS"", ""Normandy Park February Blood Drive"", ""Normandy Park Paws on Patrol"", ""Receive news & updates"", ""Success!"", ""Subscribe To Our Newsletter"", ""You have Successfully Subscribed!""]",[],"[""Normandy Park City Hall"", ""City Hall Hours""]","[""Dan Yourkoski, Police Chief""]",[],"" -441,https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-1/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -442,https://www.hendersonvillenc.gov/police-department/information-crime-safety-tips/winter-safety-tips,Poor Data Source,Poor Data Source,"Winter Safety Tips | City of Hendersonville, NC | Official Website","Winter Weather Terms WatchesWinter Storm Watch: Issued for the possibility of severe life-threatening winter weather conditions including: heavy snow, heavy ice and/or near blizzard conditions. Forecasters are typically 50 percent confident that severe winter weather will materialize when a watch is issued. Blizzard Watch: Issued for the possibility of blizzard conditions.",200,"City of Hendersonville, NC | Official Website","[""Winter Safety Tips""]","[""Search form"", ""You are here""]",[],"[""Winter Weather Terms"", ""Home Safety"", ""Neighbors Helping Neighbors""]",[],[],Skip to main content -443,https://www.mass.gov/doc/notification-of-copper-algaecide-application/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,Mass.gov,[],[],[],[],[],[],"" -444,https://champaignil.gov/2010/05/04/champaign-police-celebrates-olympic-champion/,Not Criminal Justice Related,Not Criminal Justice Related,Champaign Police Celebrates Olympic Champion - City of Champaign,"",200,403 Forbidden,"[""Champaign Police Celebrates Olympic Champion""]","[""News Releases"", ""Department News""]","[""The Police Benevolent & Protective Association Hosts a Meet and Greet for Olympic Champion Katherine Reutter""]",[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Champaign Police Celebrates Olympic Champion Search Posted on May 4, 2010 The Police Benevolent & Protective Association Hosts a Meet and Greet for Olympic Champion Katherine Reutter WHO: Katherine Reutter, Olympic Speed Skater The Champaign Police Benevolent & Protective Association (PBPA) Champaign Police Department Employees WHAT: The Champaign Police Benevolent & Protective Association (PBPA) Unit #7 is hosting a meet and greet for Katherine Reuter at El Toro Bravo restaurant where she will display her Olympic and World Cup medals, sign autographs and share stories with employees of the Champaign Police Department. WHEN: Tuesday, May 4, 2010, 6:00 p.m. WHERE: El Toro Bravo, 2561 W. Springfield Avenue, Champaign Katherine will also sign autographs at Market Place Mall on Saturday, May 8, 2010, from 10 a.m. – 2 p.m. Photos will be sold for $5.00 as a fundraiser for the Champaign Cops for Kids. The PBPA was the first “official” sponsor to back Katherine as she trained for the Olympics and has supported her over the last four years with contributions totaling over $20,000. Categories: General Press Releases , Police Department Press Releases Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions " -445,https://alpha.austin.gov/es/police-oversight/2020-08-10-3/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -446,http://lafayettepolice.us/765/request-a-report,Not Criminal Justice Related,Not Criminal Justice Related,"Request a Report | Lafayette, IN - Official Website","To request a fire report, please complete the report request form and email it or stop by our office.",200,"Police Department | Lafayette, IN - Official Website","[""Request a Report""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Operations Prevention Recruitment How Do I... Home Government Departments A - F Fire Department Prevention Investigations Request a Report Request a Report Fire Report Request To request a fire report, please complete the report request form (PDF) and email it to our office. You can also obtain a fire report by coming to our office located at: 443 N 4th Street Lafayette, IN 47901 Note: Please bring the completed form (PDF) with you so that we can find the report in a timely manner. Request a Report Report Arson Community Outreach Fire Stations Submit a Request History Photo Gallery Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Operations Prevention Recruitment How Do I... Home Government Departments A - F Fire Department Prevention Investigations Request a Report Request a Report Fire Report Request To request a fire report, please complete the report request form (PDF) and email it to our office. You can also obtain a fire report by coming to our office located at: 443 N 4th Street Lafayette, IN 47901 Note: Please bring the completed form (PDF) with you so that we can find the report in a timely manner. Request a Report Report Arson Community Outreach Fire Stations Submit a Request History Photo Gallery Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -447,https://www.antioch.il.gov/event/police-fire-commission-cancelled/,Not Criminal Justice Related,Not Criminal Justice Related,"Police & Fire Commission – Cancelled - Antioch, IL","",200,"Home - Antioch, IL","[""Police & Fire Commission – Cancelled""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -449,https://osp.maryland.gov/2020/01/17/january-17-2020-greensboro-police-chief-pleads-guilty-to-misconduct-in-office/,Media Bulletins,Agency-Published Resources,"January 17, 2020: Greensboro Police Chief Pleads Guilty to Misconduct in Office","",200,Home,[],"[""Quick Links"", ""January 17, 2020: Greensboro Police Chief Pleads Guilty to Misconduct in Office"", ""Google Translate Disclaimer"", ""Exención de Responsabilidad del Traductor Google"", ""Google翻译免责声明"", ""Google翻譯免責聲明""]",[],[],[],[],"Skip to Main Content Menu Maryland.gov State Directory State Agencies Online Services Maryland.gov Home Search Facebook Twitter Instagram LinkedIn Home Leadership FILE A COMPLAINT Press Releases Social Media Careers Contact Us Notice: JavaScript is not available in your browser. Some enhanced features will not be available until JavaScript is enabled. Quick Links OSP Annual Reports Maryland Judiciary Case Search State Board of Elections State Ethics Commission Attorney Grievance Commission January 17, 2020: Greensboro Police Chief Pleads Guilty to Misconduct in Office January 17, 2020 GREENSBORO POLICE CHIEF PLEADS GUILTY TO MISCONDUCT IN OFFICE Maryland State Prosecutor Charlton Howard announced today that Michael Petyo, former Police Chief of the Greensboro Police Department in Caroline County, Maryland, pleaded guilty on January 17, 2020, to one count of misconduct in office for making factual misrepresentations in an Application for Certification, which he filed on behalf of one of his police officers. An Application for Certification is filed with the Maryland Police and Correctional Training Commission to certify police officers throughout the State of Maryland. Officers must be certified to be allowed to carry out their duties. According to the Statement of Facts read at the guilty plea, Petyo, while serving as Greensboro Police Chief, submitted an Application of Certification on behalf of Thomas Webster to the Commission for certification as a Greensboro police officer. In his submission, Petyo made several intentional misrepresentations and factual omissions to the Commission. Petyo was sentenced to a period of two years’ incarceration, all suspended, with three years’ supervised probation by The Honorable Paul M. Bowman. “Honest and thorough reporting to the Maryland Police and Correctional Training Commission is an essential responsibility of Police Chiefs throughout the State of Maryland to ensure that individuals who apply for certification, and are consequently employed as law enforcement officers, are properly screened and evaluated,” said Howard. “I commend the investigators and attorneys at the Office of the State Prosecutor for their outstanding work on this case.” The Office of State Prosecutor would like to thank the Maryland Police and Correctional Training Commission and the Delaware Department of Justice with their assistance in this investigation. Contact Us Report Fraud 300 East Joppa Road, Suite 410, Towson, MD 21286 (800) 695-4058 (toll free) | (410) 321-4067 | (410) 321-3851 (Fax) info.osp@maryland.gov Facebook Twitter Instagram LinkedIn doit-ewspw-W02 Skip to Main Content Menu Maryland.gov State Directory State Agencies Online Services Maryland.gov Home Search Facebook Twitter Instagram LinkedIn Home Leadership FILE A COMPLAINT Press Releases Social Media Careers Contact Us Menu Maryland.gov State Directory State Agencies Online Services Menu Maryland.gov State Directory State Agencies Online Services Menu Maryland.gov State Directory State Agencies Online Services Menu Menu Maryland.gov State Directory State Agencies Online Services Maryland.gov State Directory State Agencies Online Services Maryland.gov Home Search Facebook Twitter Instagram LinkedIn Maryland.gov Home Search Facebook Twitter Instagram LinkedIn Maryland.gov Home Search Facebook Twitter Instagram LinkedIn Maryland.gov Home Search Facebook Twitter Instagram LinkedIn Maryland.gov Home Search Facebook Twitter Instagram LinkedIn Maryland.gov Home Search Facebook Twitter Instagram LinkedIn Maryland.gov Home Maryland.gov Home " -450,https://ci.new-hope.mn.us/city_hall/police_department/records_division/temporary_permit_to_purchase_procedure,Poor Data Source,Poor Data Source,Temporary Permit to Purchase Procedure - City of New Hope,"",200,Just a moment...,"[""City of New Hope"", ""City of New Hope Minnesota""]","[""Temporary Permit to Purchase Procedure""]",[],[],[],[],"" -451,https://www.austintexas.gov/blog/good-police-work,Media Bulletins,Agency-Published Resources,Good Police Work | AustinTexas.gov,Gentleman: I know you both are quite busy managing and keeping our City safe.,200,Home | AustinTexas.gov,"[""Good Police Work""]","[""Action Navigation"", ""GTranslate"", ""Main menu"", ""Frequently Viewed Departments"", ""Make a Difference"", ""Share"", ""About this blog"", ""Archives"", ""Pagination"", ""Footer Menu"", ""Second Footer Menu""]","[""Resident"", ""Business"", ""Government"", ""Departments"", ""Connect"", ""Good Police Work"", ""2021 February"", ""2020 January"", ""2020 January"", ""2020 January"", ""2020 January"", ""2020 January"", ""2019 December"", ""2019 December"", ""2019 November"", ""2019 November""]",[],[],[],"austintexas.gov Action Navigation 3-1-1 GTranslate Translate English Arabic Bulgarian Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch Finnish French German Greek Hindi Italian Japanese Korean Norwegian Polish Portuguese Romanian Russian Spanish Swedish Catalan Filipino Hebrew Indonesian Latvian Lithuanian Serbian Slovak Slovenian Ukrainian Vietnamese Albanian Estonian Galician Hungarian Maltese Thai Turkish Persian Afrikaans Malay Swahili Irish Welsh Belarusian Icelandic Macedonian Yiddish Armenian Azerbaijani Basque Georgian Haitian Creole Urdu Bengali Bosnian Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba Zulu austintexas . gov Filter Toggle navigation Menu Close Search Main menu Home Resident Resident Open the Resident page Open the Resident page Household Getting a Home Utilities Trash and Recycling Gardening and Home Improvements Home Improvements Pets and Adoption Open the Household page Neighborhoods Education Libraries Families Neighborhood Issues Open the Neighborhoods page Health Animals Public Health Open the Health page Public Safety Crime Courts Fire Safety Emergency Preparedness Public Safety Employment Open the Public Safety page Arts and Leisure Arts, History and Culture Outdoor, Nature and Wildlife Events City Venues and Facilities Film and Music Open the Arts and Leisure page Environmental City Programs and Initiatives Conservation and Recycling Animals and Wildlife Parks Open the Environmental page Transportation Car/Bus Aviation Bicycle/Pedestrian Streets/Maps Open the Transportation page City of Austin About Austin Voting and Elections Get Involved City Jobs Records and Documents Open the City of Austin page Business Business Open the Business page Open the Business page Doing Business Utilities Doing Business with the City Taxes MBE/WBE Program City Code Food Establishments Permits Day Labor Records and Documents Open the Doing Business page Starting Out Starting a Business Relocating a Business Incentives and Grants Open the Starting Out page City Contracts Small Business Centers Small Business Development Incentives and Grants Open the Small Business Centers page Austin Center for Events Nonprofits Grants Open the Nonprofits page Green Resources Government Government Open the Government page Open the Government page City Council City Manager's Office Boards and Commissions City Council meeting information City Hall Jobs Public Records Departments Departments View full directory of departments Frequently Viewed Departments View full directory of departments Visit Airport Visitors Bureau Convention Center Utilities Austin Energy Austin Water Resource Recovery Education & Recreation Library Parks and Recreation Safety Police Other Animal Services Development Services Economic Development Connect Connect Open the Connect page Share ideas online about improving Austin Participate in the City Sign up for email updates City contact information " -452,http://sheriff.co.seneca.ny.us/the-department/copy-of-biography-the-chief-deputy-2/,Contact Info & Agency Meta,Info About Agencies,"Biography: The Chief Deputy – Seneca County Sheriff, New York","",200,"Seneca County Sheriff, New York – A New York State Sheriffs' Association Accredited Agency","[""Biography: The Chief Deputy""]",[],[],[],[],[],"Skip to content Seneca County Sheriff New York Menu Divisions expand child menu Road Patrol expand child menu K-9 Unit Underwater Search and Rescue Team Emergency Response Team Criminal Investigations Corrections expand child menu Visitation Commissary Bail & Fines Packages and Allowable Items Contraband Inmate Programs Centralized Arraignment Court Navigations Civil/Records expand child menu FAQ & More Fees Records expand child menu Pistol Permits FAQ – Pistol Permit Transactions Court Security Facilities expand child menu Solar Field Programs expand child menu NYS Sheriffs Camp Crime Victim Alerts Accreditation Citizens Academy F.A.I.R. D.A.R.E. McGruff Child Safety Seats Operation: Safe Child Boater Safety The Yellow Dot Sex Offender Registry Search/Alert Sign Up SAVIN-NY Project Lifesaver Hyper-Reach How Can We Help You? expand child menu Police Tip Form Property Check Form Citizens Comment Form Administration expand child menu Biography: The Sheriff Biography: The Undersheriff Biography: The Chief Deputy Mission Statements expand child menu Law Enforcement Division Corrections Division Civil Division History of the SCSO Accreditation Employment & Recruitment Annual Reports Community Policing Policy Page 6150 Route 96, Romulus, New York For Emergencies Dial 9-1-1 Biography: The Chief Deputy SCSO Chief Deputy - Kip Goodman Officer Goodman joined the Sheriff’s Office as a Uniform Deputy in 1992. In 1993 he was promoted to Investigator and was assigned to the Juvenile Division where he concentrated on crimes against children and youth programs. Goodman is a certified DARE Instructor, Hostage Negotiator, Crime Scene Specialist and Police Instructor. Throughout his tenure Goodman has received numerous awards for his work apprehending child predators. In 2013 he received Special Congressional Recognition in appreciation for his outstanding efforts on behalf of victims of crime. In Marck of 2016 Goodman was promoted to the rank of Chief Deputy. Copyright © 1999-2024 – Seneca County Sheriffs Office – All Rights Reserved Powered by FingerLakes1.com Website Development " -453,https://hollister.ca.gov/government/city-departments/police/,List of Data Sources,Info About Agencies,"Police – City of Hollister, California","",200,"City of Hollister, California","[""San Benito County Opioid Task Force""]",[],"[""Follow Us on..."", ""A Message from Chief Reynoso"", ""San Benito County Public Safety PSA"", ""HPD Values and Vision"", ""Follow Us on....""]",[],[],[],"" -454,https://delcopa.gov/courts/juvenilecourt/upperdarbyprobation.html,Contact Info & Agency Meta,Info About Agencies,Havertown (Upper Darby) Juvenile Probation Office - Delaware County Court of Common Pleas,"",200,"Delaware County, Pennsylvania","[""Havertown (Upper Darby) Juvenile Probation Office""]",[],"[""Juvenile Court & Probation Services Navigation"", ""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[],"Menu A to Z Court Departments Local Rules FAQ Government Center Havertown (Upper Darby) Juvenile Probation Office Home / Court Departments / Juvenile Court & Probation Services / Office Locations / Havertown (Upper Darby) Juvenile Probation Office 525 West Chester Pike Lower Level Havertown, PA 19083 Judith Cola, Office Coordinator Phone: 610-713-2550/2551/2546; Fax: 610-713-2552 Michelle Washington, Supervisor Office Phone: 610-713-2554 Danise Hightower Office Phone: 610-713-2550 Stacey Mills, Probation Officer Office Phone: 610-713-2560 Elizabeth Leventhal, Probation Officer Office Phone: 610-713-2206 Robin Monaghan, Probation Officer Office Phone: 610-713-2258 Andrew Rauenzahn, Probation Officer Office Phone: 610-713-2568 Courtney (Watson) Scalia Office Phone: 610-713-2563 Patricia White, Probation Officer Office Phone: 610-713-2079 Shannon Gallop, Regional Supervisor Office Phone: 610-713-2562 Mercedes Bedolla Ollvera Office Phone: 610-713-2550 Jennifer Swayngim, Probation Officer Office Phone: 610-713-2205 Lauren Matthias, Probation Officer Office Phone: 610-713-2598 Jennifer Hudrick, Probation Officer Office Phone: 610-713-2557 Edward Hally, Probation Officer Office Phone: 610-713-2556 Gina White, Probation Officer Alternative Location: Upper Darby High School Office Phone: 610-713-2559 Alternative Phone: 610-622-7000 X2403 Juvenile Court & Probation Services Navigation Office Locations Contact Staff Inquires Court Forms System Map Emergency Extension Orders Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 delcocourts@co.delaware.pa.us Courts Quick Links Juror eResponse PA Law Help Self Help - Custody Self Help - Divorce Juror Handbook Language Access Family Court Self Represented Litigant Guide Government Center Quick Links Marriage Licenses Crisis Connection Certified Recovery Specialist Public Access Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Havertown (Upper Darby) Juvenile Probation Office Home / Court Departments / Juvenile Court & Probation Services / Office Locations / Havertown (Upper Darby) Juvenile Probation Office Havertown (Upper Darby) Juvenile Probation Office Home / Court Departments / Juvenile Court & Probation Services / Office Locations / Havertown (Upper Darby) Juvenile Probation Office Havertown (Upper Darby) Juvenile Probation Office Home / Court Departments / Juvenile Court & Probation Services / Office Locations / Havertown (Upper Darby) Juvenile Probation Office " -455,http://www.ryepolice.us/wp-content/uploads/lynch_dan.jpg,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -456,https://delcopa.gov/council/2017minutes/012517minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -457,https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-46/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -458,https://champaignil.gov/tag/police-request-community-assistance-in-fatal-shooting-investigation/,Media Bulletins,Agency-Published Resources,Police Request Community Assistance in Fatal Shooting Investigation Archives - City of Champaign,"",200,403 Forbidden,"[""Items tagged: Police Request Community Assistance in Fatal Shooting Investigation""]","[""UPDATE: Police Request Community Assistance in Fatal Shooting Investigation"", ""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Items tagged: Police Request Community Assistance in Fatal Shooting Investigation Search UPDATE: Police Request Community Assistance in Fatal Shooting Investigation Posted: October 14, 2018 The Champaign Police Department is asking for assistance from residents that live in the area between Kirby to Springfield Avenue, and between Duncan and Kenwood Road. If any resident has exterior home camera surveillance systems, please contact the police department. It is believed video footage between the hours of midnight-3 a.m. may be of investigative assistance. Police are especially interested in residents with home surveillance systems […] Categories: General Press Releases , Police Department Press Releases | Tags: Police Request Community Assistance in Fatal Shooting Investigation Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works " -459,https://alpha.austin.gov/es/police-oversight/community-feedback-and-final-recommendations-ban-chokeholds-and-strangleholds/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -460,https://coloradosprings.gov/police-department/article/calendar-event/holiday-hill,Misc Police Activity,Police & Public Interactions,Holiday on the Hill | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Holiday on the Hill""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -461,https://www.naperville.il.us/services/naperville-police-department/community-education-and-crime-prevention/paws-on-patrol/,Resources,Agency-Published Resources,Paws on Patrol | The City of Naperville,Paws on Patrol is a dog walker watch program that encourages residents to act as extra eyes and ears while out walking their dogs and report suspicious activity in their neighborhoods to police.,200,Home | The City of Naperville,"[""Paws on Patrol""]","[""Community Education and Crime Prevention"", ""Watch NCTV17 Coverage of Paws on Patrol"", ""Sniff out criminal activity while on your daily walks!"", ""Get involved!"", ""Naperville Police Department""]","[""Explore""]",[],"[""Helping Residents Build a Better Community"", ""Resources for Doing Business in Naperville""]",[],"Menu Search Menu Search Search Main Menu Navigation About Naperville + An Award-Winning Community Demographics and Key Facts Education Historic Preservation in Naperville Projects in Naperville Transportation and Parking Townships Government + Boards and Commissions City Leadership Team City Finances Annual Budget and Financial Reports Purchasing and Bids Taxes and Financial Forms Utility Services and Billing General Billing Water Street TIF District Coronavirus Resources Diversity, Equity and Inclusion A Community of Belonging DEI Defined DEI Timeline Youth Involvement Embracing Community Environmental Sustainability in Naperville Grants Meetings and Agendas Legislative Priorities Meeting Room Reservations Meet Your City Council Mayor Scott A. Wehrli Councilman Ian Holzhauer Councilman Patrick Kelly Councilman Paul Leong Councilwoman Allison Longenbaugh Councilman Josh McBroom Councilwoman Jennifer Bruzan Taylor Councilman Dr. Benjamin M. White Councilman Nate Wilson Municipal Center Municipal Code Open Data Proclamations Strategic Plan Task Forces Voting and Voter Registration Services + Brush, Leaf & Yard Waste Curbside Bulk Brush Collection Leaf Collection Yard Waste Collection Electric Utility Your Electric Service Electrical Safety Powering Our Community for the Future FOIA Request Garbage and Recycling Residential Garbage Collection Garbage Carts Curbside Recycling Program Recycling Carts Recycling Drop-Off Center Household Hazardous Waste Facility Electronics Recycling Holiday Lights Recycling Naperville Fire Department About the Fire Department Emergency Preparedness Inspections and Permits Programs and Services Safety and Public Education Naperville Police Department About the Police Department Programs and Services Community Education and Crime Prevention Office of the Chief of Police Investigations Division Patrol Division Join NPD Permits and Licenses Senior Services and Resources Services and Resources for People with Disabilities Snow and Ice Removal Snow Plowing and Salting Mailboxes and Parkway Sod Winter Updates Water/Wastewater Utility Your Water Service Maintaining Our System Common Water Issues Residents + Helping Residents Build a Better Community You can find a collection of city information relevant to everyone in Naperville, from new residents to long-time community members. Go to this section Businesses + Resources for Doing Business in Naperville Whether you're starting, running or visiting a Naperville business - find resources to help you. Go to this section Enjoy Naperville + Biking Maps, Guides and Plans Commander Dan Shanower September 11 Memorial Explore the Community Festivals and Parades Millennium Wall Naperville Community Concert Center Naperville Riverwalk Naper Settlement & Homestead Von Oven Scout Reservation Walks and Runs + + + + Helping Residents Build a Better Community You can find a collection of city information relevant to everyone in Naperville, from new residents to long-time community members. Go to this section + Resources for Doing Business in Naperville Whether you're starting, running or visiting a Naperville business - find resources to help you. Go to this section + " -462,https://www.police.wallingfordct.gov/careers/current-employment-opportunities/,Resources,Agency-Published Resources,Current Employment Opportunities | Wallingford Police Department,Current Employment Opportunities,200,"Wallingford, CT Police Department","[""Current Employment Opportunities""]",[],[],[],[],[],"‹ Close Menu About Us Our Team Who We Serve Our History Police Station Project Divisions Records Division Traffic Division Investigative Services Division Professional Standards & Training Division Patrol Division Community Impact Unit Public Safety Communications Center Emergency Response Team Field Training & Evaluation Program How Do I? Pistol Permits Fingerprinting Accident Reports Case Reports Traffic Violations Pay a Parking Ticket Hire a Cop Alarm Registration Careers Current Employment Opportunities Forms & Resources Bingo, Bazaar & Raffle Documents Precious Metal Application Secondhand Application Pawnbroker Application Vending Application News & Events Road Closures & Detours Agency Events & Programs Press Releases Photo Gallery Video Gallery Wallingford PBA Contact Current Employment Opportunities Current Employment Opportunities Current Employment Opportunities Application Form (Use for Civilian/Dispatcher Postions) Entry-Level Police Officer Posting Wallingford Police Department Dispatcher Opening Location: 135 North Main Street Wallingford, CT 06492 Tel: (203) 294-2800 Fax: (203) 294-2882 Administrative Office: Monday through Friday 8 am – 4 pm Site Map Privacy Policy Accessibility Statement Anonymous Tip Form Town of Wallingford Location: 135 North Main Street Wallingford, CT 06492 Tel: (203) 294-2800 Fax: (203) 294-2882 Administrative Office: Monday through Friday 8 am – 4 pm Site Map Privacy Policy Accessibility Statement Anonymous Tip Form Town of Wallingford Web Solutions © 2022 – 2024 Wallingford Police Department. All rights reserved. Web Solutions © 2022 – 2024 Wallingford Police Department. All rights reserved. " -463,https://www.coppelltx.gov/376/command-staff,Contact Info & Agency Meta,Info About Agencies,"Command Staff | Coppell, TX",Meet the Coppell Police Department Command Staff.,200,"Coppell, TX | Official Website","[""Command Staff""]",[],"[""Contact Us"", ""Loading""]","[""Police Department""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Divisions Services & Programs Education How Do I City Home Home Government City Departments Police Department About Us Command Staff Command Staff Danny Barton, Chief of Police Sammy Lujan, Deputy Chief Captain John Rebman, Patrol Division Commander Captain Eric Louderback, Investigations Division Commander Contact Us Police Department Email the Police Department Physical Address View Map 130 Town Center Boulevard Coppell Justice Center Coppell , TX 75019 130 Town Center Boulevard Coppell Justice Center Coppell TX 75019 Directions Mailing Address P.O. Box 9478 Coppell , TX 75019 Phone: 469-289-3270 Fax: 972-304-3535 Emergency Phone: 911 Directory Command Staff File a Compliment or Complaint In Memoriam Police Recruiting Racial Profiling Policy Services & Programs Animal Services Submit A Tip Crime Statistics Join Us Compliment /Complaint For Non Emergencies: 469-289-3270 . You can also contact non-emergency dispatch by dialing *247 from your cellular phone. For Emergencies: 911 Coppell Justice Center 130 Town Center Boulevard / P.O. Box 9478 Coppell, TX 75019 Phone: 972-304-3620 (Records Department) Fax: 972-304-3535 Email Government Websites by CivicPlus® Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Divisions Services & Programs Education How Do I City Home Home Government City Departments Police Department About Us Command Staff Command Staff Danny Barton, Chief of Police Sammy Lujan, Deputy Chief Captain John Rebman, Patrol Division Commander Captain Eric Louderback, Investigations Division Commander Contact Us Police Department Email the Police Department Physical Address View Map 130 Town Center Boulevard Coppell Justice Center Coppell , TX 75019 130 Town Center Boulevard Coppell Justice Center Coppell TX 75019 Directions Mailing Address P.O. Box 9478 Coppell , TX 75019 Phone: 469-289-3270 Fax: 972-304-3535 Emergency Phone: 911 Directory Command Staff File a Compliment or Complaint In Memoriam Police Recruiting Racial Profiling Policy Services & Programs Animal Services Submit A Tip Crime Statistics Join Us Compliment /Complaint For Non Emergencies: 469-289-3270 . You can also contact non-emergency dispatch by dialing *247 from your cellular phone. For Emergencies: 911 Coppell Justice Center 130 Town Center Boulevard / P.O. Box 9478 Coppell, TX 75019 Phone: 972-304-3620 (Records Department) Fax: 972-304-3535 Email Government Websites by CivicPlus® Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -464,https://alpha.austin.gov/es/police-oversight/8-26-20-3/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -465,https://coloradosprings.gov/police-department/article/news/officer-involved-shooting-i25-and-north,Media Bulletins,Agency-Published Resources,Officer Involved Shooting I25 and North Academy Boulevard | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Officer Involved Shooting I25 and North Academy Boulevard""]","[""Search"", ""Update:"", ""Original post:"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -466,https://www.arlingtontx.gov/news/my_arlington_t_x/news_stories/police_chief_al_jones,Media Bulletins,Agency-Published Resources,Al Jones Appointed as New Arlington Police Chief - City of Arlington,"",200,Just a moment...,"[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Al Jones Appointed as New Arlington Police Chief""]",[],[],[],[],Skip to Content Skip to Content -467,https://www.sandiego.gov/risk-management/flexible-benefits/fbp-police-safety-members-fy2022,Policies & Contracts,Info About Agencies,Flexible Benefits Plan Options for Police Safety Members FY 2022 and Short Plan Year 2022 | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""Flexible Benefits Plan Options for Police Safety Members FY 2022 and Short Plan Year 2022""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""FBP Credits"", ""FBP Options"", ""Sharp Plan Additional Information"", ""Services"", ""Contact Info"", ""Orientation Materials"", ""Additional Resources"", ""Forms"", ""Footer"", ""Accessibility Tools""]","[""Medical Plans"", ""Kaiser Permanente Traditional (HMO) Information"", ""Kaiser Permanente Traditional (HMO) Premiums"", ""Kaiser Permanente Deductible (HMO) Information"", ""Kaiser Permanente Deductible (HMO) Premiums"", ""Kaiser Partner Site"", ""Kaiser Additional Information"", ""Cigna (HMO) Information"", ""Cigna (HMO) Premiums"", ""Cigna Scripps Select (HMO) Premiums"", ""Cigna Open Access Plan (OAP) PPO Information"", ""Cigna Open Access Plan (OAP) PPO Premiums"", ""Cigna Additional Information"", ""Cigna Partnersite"", ""SDPEBA/Sharp Classic (HMO) Information"", ""SDPEBA/Sharp Classic (HMO) Premiums"", ""SDPEBA/Sharp Select (HMO) Information"", ""SDPEBA/Sharp Select (HMO) Premiums"", ""SDPEBA/Sharp Saver Deductible (HMO) Information"", ""SDPEBA/Sharp Saver Deductible (HMO) Premiums"", ""POA ALADS California Care Basic (HMO - No Dental) Information"", ""POA ALADS California Care Basic (HMO - No Dental) Premiums"", ""POA ALADS California Care Premier (HMO - with Dental) Information"", ""POA ALADS California Care Premier (HMO - with Dental) Premiums"", ""Dental Plans (Optional)"", ""Delta Dental (DHMO) Information"", ""Delta Dental (DHMO) Premiums"", ""Delta Dental (DPO) Information"", ""Delta Dental (DPO) Premiums"", ""Delta Dental Additional Information"", ""Delta Dental Partner Site"", ""Vision Plans (Optional)"", ""City VSP Information"", ""City VSP Premiums"", ""City VSP Partnersites"", ""Life Insurance Plans""]","[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -468,https://hamiltonma.gov/events/event/police-training-gun-club-3/,Poor Data Source,Poor Data Source,"Police Training @ Gun Club - Town of Hamilton, MA","",200,"Town of Hamilton - Town of Hamilton, MA","[""Police Training @ Gun Club""]",[],"[""Stay Connected"", ""About Hamilton"", ""Contact"", ""Useful Links""]","[""Event Details"", ""Give Feedback""]","[""Where Do I Go For..."", ""Shop Local""]","[""Today: March 25, 2024"", ""Where Do I Go For... More""]","Main: 978-468-5570 DPW: 978-626-5227 Water: 978-626-5226 Email Translate A Decrease font size. A Reset font size. A Increase font size. Search Main: 978-468-5570 DPW: 978-626-5227 Water: 978-626-5226 Email Translate A Decrease font size. A Reset font size. A Increase font size. Search Main: 978-468-5570 DPW: 978-626-5227 Water: 978-626-5226 Email Translate A Decrease font size. A Reset font size. A Increase font size. Search Main: 978-468-5570 DPW: 978-626-5227 Water: 978-626-5226 Email Translate A Decrease font size. A Reset font size. A Increase font size. Search Translate A Decrease font size. A Reset font size. A Increase font size. Search Search MENU CLOSE History Government Your Government All Boards & Departments Meetings Minutes & Agendas Town Clerk Town Manager Town By-Laws Zoning By-Laws Voting and Elections Join A Committee/Board Where Do I Go For... Unsure of where to find the information you are looking for? Check our A-Z directory of all departments, applications and other general information. A-Z Directory Community Your Community Local Cable TV Cultural Council Hamilton Foundation Housing Authority School Directory Library Directory Latest News Shop Local For a small community, Hamilton offers an amazing amount of shops and businesses conveniently located just blocks from the commuter train line ready to serve you. Find a Local Business Events Quicklinks MENU CLOSE History Government Your Government All Boards & Departments Meetings Minutes & Agendas Town Clerk Town Manager Town By-Laws Zoning By-Laws Voting and Elections Join A Committee/Board Where Do I Go For... Unsure of where to find the information you are looking for? Check our A-Z directory of all departments, applications and other general information. A-Z Directory Community Your Community Local Cable TV Cultural Council Hamilton Foundation Housing Authority School Directory Library Directory Latest News Shop Local For a small community, Hamilton offers an amazing amount of shops and businesses conveniently located just blocks from the commuter train line ready to serve you. Find a Local Business Events Quicklinks MENU CLOSE History Government Your Government All Boards & Departments Meetings Minutes & Agendas Town Clerk Town Manager Town By-Laws Zoning By-Laws Voting and Elections Join A Committee/Board Where Do I Go For... Unsure of where to find the information you are looking for? Check our A-Z directory of all departments, applications and other general information. A-Z Directory Community Your Community Local Cable TV Cultural Council Hamilton Foundation Housing Authority School Directory Library Directory Latest News Shop Local For a small community, Hamilton offers an amazing amount of shops and businesses conveniently located just blocks from the commuter train line ready to serve you. Find a Local Business Events MENU CLOSE MENU CLOSE MENU CLOSE Your Government Where Do I Go For... Unsure of where to find the information you are looking for? Check our A-Z directory of all departments, applications and other general information. A-Z Directory Where Do I Go For... Unsure of where to find the information you are looking for? Check our A-Z directory of all departments, applications and other general information. A-Z Directory " -469,https://brookfieldil.gov/2021-04-28-regular-police-pension-board-meeting-agenda-for-posting/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -470,http://www.longbeach.gov/police/press-releases/charges-filed-on-carjacking-suspect--a-convicted-felon-on-post-release-community-supervision/,Media Bulletins,Agency-Published Resources,CHARGES FILED ON CARJACKING SUSPECT; A CONVICTED FELON ON POST RELEASE COMMUNITY SUPERVISION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -471,http://www.longbeach.gov/police/press-releases/murder-1300-block-of-wesley-drive/,Media Bulletins,Agency-Published Resources,MURDER 1300 BLOCK OF WESLEY DRIVE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -472,http://www.longbeach.gov/police/press-releases/this-labor-day-and-every-day-drive-sober-or-get-pulled-over/,Media Bulletins,Agency-Published Resources,"THIS LABOR DAY, AND EVERY DAY: DRIVE SOBER OR GET PULLED OVER","",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -473,https://coloradosprings.gov/police-department/article/news/fatal-crash-marksheffel-road-and-dublin-0,Media Bulletins,Agency-Published Resources,Fatal Crash Marksheffel Road and Dublin Boulevard | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Fatal Crash Marksheffel Road and Dublin Boulevard""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -474,https://www.roundrocktexas.gov/city-departments/police/divisions/training-division/,Contact Info & Agency Meta,Info About Agencies,Training Division - City of Round Rock,"",200,403 Forbidden,"[""Training Division""]",[],"[""Training Division Contacts"", ""Round Rock Police Department""]","[""Lt. Woody Sitz"", ""Sgt. Aaron Mitchell"", ""Sgt. Jason Huf"", ""Site Search"", ""Follow Us""]",[],[],"Home News Jobs Calendar Menu Home News Jobs Calendar Police About 9-1-1 Divisions Community Affairs Community Events Community Services Open Carry Information Public Outreach Request Round Rock Operation Blue Santa Volunteer Information Criminal Investigations Division Office of the Chief Internal Affairs Reports and Accreditation Officer Oath of Office Patrol Division Special Operations Division Animal Control Graffiti Abatement Towing Information Traffic Victim Assistance Support Services Nuisance Alarm Unit Training Division Recruiting Officer Whites Memorial Contact RRPD Menu Police About 9-1-1 Divisions Community Affairs Community Events Community Services Open Carry Information Public Outreach Request Round Rock Operation Blue Santa Volunteer Information Criminal Investigations Division Office of the Chief Internal Affairs Reports and Accreditation Officer Oath of Office Patrol Division Special Operations Division Animal Control Graffiti Abatement Towing Information Traffic Victim Assistance Support Services Nuisance Alarm Unit Training Division Recruiting Officer Whites Memorial Contact RRPD Training Division Home » Departments » Police » Divisions » Training Division Facebook Instagram Phone-alt Comment-alt Exclamation Fingerprint For emergencies, call 911 Commander Melissa Grubbs Serving since 2003 mgrubbs@roundrocktexas.gov (512) 218-5586 The Training Division is responsible for developing and providing advanced continuing education to the Round Rock Police Department. It is our goal to provide the latest training in law enforcement knowledge and skills, enhance leadership abilities, and promote a solid ethical foundation to our workforce. We actively search for the most qualified police and civilian candidates to apply for our department. As a member you will work for one of the safest cities in America, and one of the most prestigious departments in the United States. You will have the opportunity to be highly trained, actively interact with citizens, and have a positive impact on a diverse community. View Training Calendar View Recruiting Site Training Division Contacts Lt. Woody Sitz Training Coordinator 512-218-5519 EMAIL Sgt. Aaron Mitchell Recruiting & Academy 512-341-3119 EMAIL Sgt. Jason Huf Facility, Range, and Continuing Education 512-671-2795 EMAIL Round Rock Police Department 2701 North Mays Street Round Rock, Texas 78665 Emergencies: 9-1-1 Non-emergency Line: 512-218-5500 File a Report: 512-218-5500 Victim Assistance: 512-341-3124 VIEW POLICE CONTACT INFO Home About Services Departments Businesses Menu Home About Services Departments Businesses Quick Links News Calendar Jobs City Council Sitemap Website Feedback Services Service Request Service Directory Payment Center Development/Permit Tracker Open Records Center Public Notices Stay Connected Staff Directory Mobile Apps Alerts Sign Up E-Subscribe City of Round Rock 221 East Main Street Round Rock, TX 78664 512-218-5400 Site Search Search Search Follow Us Facebook Home Youtube Instagram " -475,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0486/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -476,https://alpha.austin.gov/government-business/connect-with-city/contribute-to-police-oversight/complaint-process/,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -477,https://delcopa.gov/sheriff/realestate.html,Not Criminal Justice Related,Not Criminal Justice Related,"Real Estate Department - Sheriff Sales - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Real Estate Department - Sheriff Sales""]","[""Fax the Warrant Division 610-891-5255""]","[""Frequently Asked Questions"", ""Sheriff's Office Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""When do the Sheriff's Sales take place?"", ""Where are the Sheriff's Sales held?"", ""Can I obtain a list of the properties to be sold?"", ""If I see a property I want to buy, can I inspect it before the sale?"", ""How do I buy a property at Sheriff's Sale?"", ""What is hand money?"", ""When do I have to pay the rest of the money?"", ""Why does the Sheriff's Office highly recommend that you consult your own attorney for advice about how to purchase property at Sheriff's Sale?"", ""Do Sheriff's Sales differ from Tax Sales or Judicial Sales?""]",[],[],"" -478,https://delcopa.gov/publicrelations/releases/2021/pdf/phonescam.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -479,https://www.ci.rohnert-park.ca.us/city_hall/departments/development_services/copy_of_downtown/demo_downtown_news,Not Criminal Justice Related,Not Criminal Justice Related,Demo Downtown News - City of Rohnert Park,"",200,Just a moment...,"[""City of Rohnert Park""]","[""Rohnert Park""]","[""Demo Downtown News""]",[],[],[],"" -480,https://townofcampbellwi.gov/public-safety/police/contact-an-officer/,Contact Info & Agency Meta,Info About Agencies,Contact an Officer - Town of Campbell,"",200,"Town of Campbell - Welcome to the Town of Campbell, found on French Island between the Mississippi and Black Rivers, near La Crosse Wisconsin. Visitors will find a variety of things to do, including outdoor recreation, shopping, and restaurants.","[""Contact an Officer""]",[],"[""Quick Links"", ""About"", ""Government"", ""Services"", ""Public Safety""]",[],[],[],Town of Campbell: (608) 783-0050 Emergency Dial 911 Fire (608) 783-0561 Police: (608) 783-1050 Home About Calendar Businesses Employment Opportunities News Government Town Board Planning and Zoning Commission Board of Adjustment Street and Roads Committee Ordinances Taxes Zoning Elections and Voting Request for Proposals/Bids Services Recycling and Garbage Brush Chipping Library Maintenance Community Center Stormwater Management Recreational Landings Public Safety Fire Police Welcome Letter from Chief Stratman Contact an Officer Police Department Forms Register a Camera Transparency First Responders Permits & Forms Licenses Contact Contact an Officer The agency email is campbellpd@townofcampbellwi.gov Police Facebook Page – www.facebook.com/campbellpolice Chief Trisha Stratman – tstratman@townofcampbellwi.gov Officer Nathan Casper – ncasper@townofcampbellwi.gov Investigator Josh Czys – jczys@townofcampbellwi.gov Officer Shelby Palmer – spalmer@townofcampbellwi.gov Officer Robert Cale – rcale@townofcampbellwi.gov Karla Pleau (Admin) – kpleau@townofcampbellwi.gov Quick Links Calendar Recycling and Garbage Agendas and Minutes Report a Problem Zoning Ordinances Town of Campbell: (608) 783-0050 Emergency Dial 911 Fire (608) 783-0561 Police: (608) 783-1050 Home About Calendar Businesses Employment Opportunities News Government Town Board Planning and Zoning Commission Board of Adjustment Street and Roads Committee Ordinances Taxes Zoning Elections and Voting Request for Proposals/Bids Services Recycling and Garbage Brush Chipping Library Maintenance Community Center Stormwater Management Recreational Landings Public Safety Fire Police Welcome Letter from Chief Stratman Contact an Officer Police Department Forms Register a Camera Transparency First Responders Permits & Forms Licenses Contact Town of Campbell: (608) 783-0050 Emergency Dial 911 Fire (608) 783-0561 Police: (608) 783-1050 Home About Calendar Businesses Employment Opportunities News Government Town Board Planning and Zoning Commission Board of Adjustment Street and Roads Committee Ordinances Taxes Zoning Elections and Voting Request for Proposals/Bids Services Recycling and Garbage Brush Chipping Library Maintenance Community Center Stormwater Management Recreational Landings Public Safety Fire Police Welcome Letter from Chief Stratman Contact an Officer Police Department Forms Register a Camera Transparency First Responders Permits & Forms Licenses Contact Town of Campbell: (608) 783-0050 Emergency Dial 911 Fire (608) 783-0561 Police: (608) 783-1050 Town of Campbell: (608) 783-0050 Emergency Dial 911 Fire (608) 783-0561 Police: (608) 783-1050 Home About Calendar Businesses Employment Opportunities News Government Town Board Planning and Zoning Commission Board of Adjustment Street and Roads Committee Ordinances Taxes Zoning Elections and Voting Request for Proposals/Bids Services Recycling and Garbage Brush Chipping Library Maintenance Community Center Stormwater Management Recreational Landings Public Safety Fire Police Welcome Letter from Chief Stratman Contact an Officer Police Department Forms Register a Camera Transparency First Responders Permits & Forms Licenses Contact Contact an Officer The agency email is campbellpd@townofcampbellwi.gov Police Facebook Page – www.facebook.com/campbellpolice Chief Trisha Stratman – tstratman@townofcampbellwi.gov Officer Nathan Casper – ncasper@townofcampbellwi.gov Investigator Josh Czys – jczys@townofcampbellwi.gov Officer Shelby Palmer – spalmer@townofcampbellwi.gov Officer Robert Cale – rcale@townofcampbellwi.gov Karla Pleau (Admin) – kpleau@townofcampbellwi.gov Quick Links Calendar Recycling and Garbage Agendas and Minutes Report a Problem Zoning Ordinances -481,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/080421arrests.pdf,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -482,https://whitestown.in.gov/news/whitestown-police-detectives-arrest-local-man-on-child-molestation-charges/,Media Bulletins,Agency-Published Resources,Whitestown Police Detectives Arrest Local Man on Child Molestation Charges - Town of Whitestown,"",200,403 Forbidden,"[""Recent News"", ""Whitestown Police Detectives Arrest Local Man on Child Molestation Charges""]","[""Recent News Articles"", ""Whitestown Annual Easter Egg Hunt Returns"", ""Tips to Prepare for the Total Solar Eclipse in Whitestown"", ""Visit Us"", ""Contact Us"", ""Stay Connected"", ""How can we help?""]",[],[],[],[],"" -483,http://lafayettepolice.us/456/special-events,Not Criminal Justice Related,Not Criminal Justice Related,"Facilities | Lafayette, IN - Official Website",View the 3 different aquatic facilities that open to the public.,200,"Police Department | Lafayette, IN - Official Website",[],[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]","[""Castaway Bay"", ""Tropicanoe Cove""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About Us Special Events Programs I Want To... Home Government Departments H - W Parks & Recreation Facilities Aquatics Special Events 9 2 1 2 Castaway Bay Explore the amenities and fees for the Castaway Bay Aquatic Center. Pooch Plunge Tropicanoe Cove Get ready to explore all the great amenities of Tropicanoe Cove. Event Days Castaway Bay Pooch Plunge Tropicanoe Cove Event Days Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About Us Special Events Programs I Want To... Home Government Departments H - W Parks & Recreation Facilities Aquatics Special Events 9 2 1 2 Castaway Bay Explore the amenities and fees for the Castaway Bay Aquatic Center. Pooch Plunge Tropicanoe Cove Get ready to explore all the great amenities of Tropicanoe Cove. Event Days Castaway Bay Pooch Plunge Tropicanoe Cove Event Days Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About Us Special Events Programs I Want To... Home Government Departments H - W Parks & Recreation Facilities Aquatics Special Events 9 2 1 2 Castaway Bay Explore the amenities and fees for the Castaway Bay Aquatic Center. Pooch Plunge Tropicanoe Cove Get ready to explore all the great amenities of Tropicanoe Cove. Event Days Castaway Bay Pooch Plunge Tropicanoe Cove Event Days Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -484,https://www.clarkstown.gov/police/surveillance-camera-registration/,Resources,Agency-Published Resources,Surveillance Camera Registration – Town of Clarkstown,"",200," - Town of Clarkstown – New City, NY ","[""Surveillance Camera Registration""]","[""Town of Clarkstown"", ""Town of Clarkstown"", ""Thanks for signing up!"", ""Clarkstown eNews"", ""Government"", ""How Do I?"", ""Quick Links""]","[""Town of Clarkstown"", ""Town of Clarkstown"", ""Town of Clarkstown"", ""Sign up for our Newsletter"", ""© 2021 Town of Clarkstown""]",[],[],"[""Departments"", ""Sign Up"", ""Find"", ""Apply"", ""Report"", ""Pay For""]","+1 (845) 639-2000 10 Maple Ave., New City, NY Search Search Close this search box. Search Search Close this search box. Town of Clarkstown Town Hall Town Supervisor Town Leadership & Administration Town Council Meeting & Council Member Information Town Clerk Public Inquires & Compliance Highway Department Road Maintenance, Yard Waste & Leaf Pickup Town Calendar What’s Happening in Clarkstown Agenda & Minutes Town Board Agenda & Minutes Boards & Commissions Boards & Commissions Members, Agendas, Minutes News Recent Press Releases & Town News Archive Town Code Local Laws, Ordinances & Resolutions Town History Read About The Town’s History Departments Assessor Attorney Building Engineering and Facilities Management Justice Court Mini Trans Personnel Planning Police Purchasing Parks & Recreation How Do I? Sign Up Community Pass eAlerts Ready Clarkstown Find Agenda & Minutes Official Town Map Permits, Applications, Flyers Town Code Town History Town Zoning Map Apply Building Permits Certificates of Occupancy Conservation License Disabled Parking Permits Employment Foil Request Dog License Fire Permits Marriage License Nanuet Train Station Tax Exemption Report Crime Code Violation Flooding Garbage & Recycling Street Lights & Potholes Pay For View or Pay Taxes Recreation Programs Pay For Tickets Residents 311 Request Report, Submit, Track & View Service Requests Building Permits Electrical, Plumbing & Structural Permits Parks & Recreation Recreation Programs, Parks, Centers, Pools & More Animal Care & Control Domestic Animals & Wildlife Compliance Senior Citizens Senior Programs, Clubs & Calendar Town Code Local Laws, Ordinances & Resolutions Recycling Recycling Guidelines & Tips Town of Clarkstown 10 Maple Avenue New City, NY 10956 (845) 639-2000 Business Building Permits Electrical, Plumbing, or Structural Permits Tourism Map Clarkstown Tourism Map Town Code Local Laws, Ordinances & Resolutions Boards & Commissions Boards & Commissions Members, Agendas, Minutes Planning Board Projects Current Planning Board Projects Under Review New City Chamber of Commerce Nanuet Chamber of Commerce Town of Clarkstown 10 Maple Avenue New City, NY 10956 (845) 639-2000 Community Libraries Clarkstown Local Free Libraries Schools Clarkstown Local School Districts Utilities Water & Electric Local Support Organizations Experiencing Hardship or Need Help? Senior Citizens Senior Programs, Clubs & Calendar Volunteer Fire & Ambulance Local Volunteer First Responders Town of Clarkstown 10 Maple Avenue New City, NY 10956 (845) 639-2000 Grievance Day, May 24, 2022, For Procedures Click Here " -485,https://delcopa.gov/publicrelations/releases/2022/delcoartsweek.html,Not Criminal Justice Related,Not Criminal Justice Related,"The Arts Come Alive in Delco This Fall! - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""The Arts Come Alive in Delco This Fall!""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Delco Arts Week being held October 1 through October 9""]",[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play The Arts Come Alive in Delco This Fall! Home / Departments / Public Relations Releases / The Arts Come Alive in Delco This Fall! Released: September 29, 2022 Delco Arts Week being held October 1 through October 9 Delaware County Council Vice Chair Elaine Paul Schaefer joined members of the Delaware County Arts Consortium on State Street in Media on September 27 to present a resolution declaring October 1-9 to be the 4th annual Delco Arts Week. During this week, 65 different performances, exhibits, workshops, concerts, tours, and other events will be taking place at over 30 venues throughout Delaware County. “Delaware County is rich in culture, and we have many talented artists and performers who enhance the fabric of our community,” said Vice Chair Schaefer. “The arts are thriving in Delaware County, and Delco Arts Week brings an exciting assortment of art, music, theater, and dance, to our community.” Some of the events include productions at the Hedgerow Theater, Media Theatre, the Players Club of Swarthmore, and Villanova Theatre, performances by the Delaware County Symphony, cellist Jason Calloway, a Musical Instrument Petting Zoo along the Chester Waterfront, an Art Gallery at the Darlington Arts Center, free admission to the Brandywine River Museum of Art, an Arts on the Avenue Festival in Lansdowne, and more. A complete list of the events planned during Delco Arts Week can be found at http://delcoarts.org/ The Delaware County Arts Consortium, formed in 2009, has representatives from ten different Delaware County organizations and the Greater Philadelphia Cultural Alliance. They strive to advance the economic vitality of the nonprofit arts and culture community and promote the value of Delaware County’s cultural resources to the local community and beyond. The group has worked to create Delco Arts Week to showcase the arts in Delco and engage and introduce residents to the many unique artistic venues and experiences that Delaware County has to offer. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the Delaware County Health Department Wellness Line: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play " -486,https://spdblotter.seattle.gov/2013/05/02/mayor-council-signal-intent-to-site-and-build-new-police-station-for-north-precinct/,Media Bulletins,Agency-Published Resources,"Mayor, Council Signal Intent to Site and Build New Police Station for North Precinct - SPD Blotter","",200,403 Forbidden,"[""Mayor, Council Signal Intent to Site and Build New Police Station for North Precinct""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -487,https://www.coronadelmar.us/safes-cash-pricey-watches-and-jewelry-police-documents-reveal-items-stolen-in-rash-of/,Media Bulletins,Agency-Published Resources,"Safes, cash, pricey watches and jewelry — police documents reveal items stolen in rash of … | Corona del Mar California","",200,Corona del Mar California,"[""Safes, cash, pricey watches and jewelry — police documents reveal items stolen in rash of …""]","[""Menu"", ""Be First to Comment"", ""Subscribe"", """", """"]","[""Share this:"", ""Like this:"", ""Related"", ""Leave a Reply Cancel reply"", """"]",[],[],[],"" -488,https://www.knoxvilletn.gov/government/mayors_office/c_o_v_i_d-19___coronavirus_/stress_and_coping/knox_well/kid___parent_resources/general_adult_resources,Resources,Agency-Published Resources,General Adult Resources - City of Knoxville,covid19*,200,Just a moment...,"[""General Adult Resources"", """"]",[],[],[],[],[],Skip navigation {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## -489,https://oceancitymd.gov/oc/ocean-city-police-captain-austin-retires-after-31-years-of-service/,Media Bulletins,Agency-Published Resources,"Ocean City Police Captain Austin Retires After 31 Years of Service – Town of Ocean City, Maryland","",200,"Town of Ocean City, Maryland – A Vibrant Coastal Resort Community",[],"[""Post navigation""]","[""Related posts""]",[],[],[],"" -490,https://www.rolesvillenc.gov/police,Contact Info & Agency Meta,Info About Agencies,"Police | Town of Rolesville, NC","",200,"Town of Rolesville, NC","[""Police""]","[""Support Menu"", ""Social Media"", ""Main navigation"", ""Social Media"", ""Footer""]",[],[],"[""Connect with us""]",[],"tab start Menu Departments Open submenu Your Government Open submenu Residents & Visitors Open submenu Business Open submenu Close submenu Departments Communications Economic Development Finance Open submenu Fire Human Resources Open submenu Parks & Recreation Open submenu Planning Open submenu Police Open submenu Public Works Open submenu Town Clerk Open submenu Town Management Close submenu Finance Bid Opportunities Doing Business with the Town Financial Documents Solid Waste Billing Close submenu Human Resources Benefits Employment Opportunities Frequently Asked Questions Close submenu Parks & Recreation Adopted Plans Athletics Open submenu Cultural Programs Open submenu Forms and Permits Open submenu Parks and Facilities Open submenu Program Scholarships Special Events Open submenu Sponsors Staff Directory Volunteers Wake County Senior Games Close submenu Athletics Adult Softball Equipment Swap Outdoor 3 on 3 Basketball Youth Baseball & Softball Youth Basketball Youth Flag Football Youth Soccer Close submenu Cultural Programs Visual Arts Performing Arts S.T.E.M./S.T.E.A.M. Fitness Senior Nature/Outdoors Day Camps Trips Family Activities Close submenu Forms and Permits Commercial Use Of Park Property Photography Permit Special Event Permits Close submenu Parks and Facilities Main Street Park Mill Bridge Nature Park Redford Place Park Community Center Greenways Future Facilities Town of Rolesville Park Rules Close submenu Special Events 4th of July Arbor Day Blood Drive Egg Rush Fall FunFest Holiday Tree Lighting Juneteenth Celebration Litter Sweep Memorial Day Movies at the Middle Music at Mill Bridge Shred Event Trail Art Veterans Day Community Outreach Close submenu Planning * Submittal Process * Frequently Asked Questions Helpful Links Land Development Ordinance Technical Review Commitee Forms and Applications Development Projects Land Use and Zoning What are ""Development Applications"" ? Adopted Policy Plans What's New? Plans in Progress Helpful Links Signs Permits Public Hearings Utility Permits Fees - Development Applications Traffic Impact Analysis Board of Adjustment Pre-Construction Meetings Planning Board Close submenu Police Community Outreach Community Resources House Check Requests Police Reports Recruitment Police Department Assessment Close submenu Public Works Solid Waste Open submenu Stormwater Open submenu Street Maintenance Close submenu Solid Waste Garbage and Recycling Loose Leaves Other Waste Yard Waste Close submenu Stormwater Stormwater Mapping Project Close submenu Town Clerk Public Records Request Public/Legislative Hearings Close submenu Your Government Agendas & Minutes Boards & Commissions Open submenu Capital Projects Open submenu Locations & Hours Meetings Broadcast Strategic Plan Code of Ordinances Close submenu Boards & Commissions Mayor's Message Board of Adjustment Parks & Recreation Advisory Board Planning Board Close submenu Capital Projects Town Campus Plans Close submenu Residents & Visitors Calendar Community Resources Open submenu New to Rolesville News Town Events Close submenu Community Resources Community Group Funding Food Security Public Transportation Things to Do Veterans Resources Open submenu Close submenu Veterans Resources Military Banners May 2023 Close submenu Business Economic Development Open submenu Development Services Main Street Vision Available Buildings & Sites Bid Opportunities Chamber of Commerce Close submenu Economic Development Small Business Resources Why Rolesville? tab end " -491,https://www.prescott-az.gov/services-safety/police/reporting/accident-reports-on-line/,Contact Info & Agency Meta,Info About Agencies,Prescott Police Department - City of Prescott AZ,"",200,Home - City of Prescott AZ,"[""Police""]","[""Prescott Police Department""]","[""Public Safety Services"", ""Contact Prescott Police""]","[""city of prescott"", ""Stay informed"", ""Quick Access"", ""citizen inquiry""]",[],[],Open toolbar Accessibility Accessibility Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Sitemap Sitemap Accessibility Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Sitemap Sitemap Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government departments Search Search Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government dept Search Search Search Search Close this search box. Search Search Departments Residents Visitors Business Government Residents Visitors Business Government Police Home Departments Prescott Police Department Prescott Police Department Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government departments Search Search Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government dept Search Search Search Search Close this search box. Search Search Departments Residents Visitors Business Government Residents Visitors Business Government Police Home Departments Prescott Police Department Prescott Police Department Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government departments Search Search Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government dept Search Search Search Search Close this search box. Search Search Departments Residents Visitors Business Government Residents Visitors Business Government Police Home Departments Prescott Police Department Prescott Police Department Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government departments Search Search Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government dept Search Search Search Search Close this search box. Search Search Departments Residents Visitors Business Government Residents Visitors Business Government Police Home Departments Prescott Police Department Prescott Police Department Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government departments Search Search Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government dept Search Search Search Search Close this search box. Search Search Departments Residents Visitors Business Government Residents Visitors Business Government Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government departments Search Search Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government dept Search Search Search Search Close this search box. Search Search Departments Residents Visitors Business Government Residents Visitors Business Government Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government departments Search Search Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government dept Search Search Search Search Close this search box. Search Search Departments Residents Visitors Business Government Residents Visitors Business Government Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government departments Search Search Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government dept Search Search Search Search Close this search box. Search Search Departments Residents Visitors Business Government Residents Visitors Business Government -492,https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-40/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -493,https://delcopa.gov/controller/pdf/2020/dccwfinal-signed.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -494,https://www.antioch.il.gov/wpfb_file_category/commissions-police-and-fire-commission-agendas-2014-commissions-police-and-fire-commission-agendas-commissions-police-and-fire-commission-commissions/,Poor Data Source,Poor Data Source,"2014 - Antioch, IL","",200,"Home - Antioch, IL","[""Archives: 2014""]",[],"[""12-06-14 Police And Fire Agenda"", ""11-15-14 Police And Fire Agenda"", ""11-01-14 Police And Fire Agenda"", ""10-23-14 Police And Fire Agenda"", ""10-14-14 Police And Fire Agenda"", ""08-04-14 Police And Fire Agenda"", ""07-08-14 Police And Fire Agenda""]",[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -495,https://alpha.austin.gov/es/police-oversight/2020-06-12-11/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -496,http://www.lafayettepolice.us/214/application-process,Policies & Contracts,Info About Agencies,"Application/Appointment Process | Lafayette, IN - Official Website",Learn about the application and appointment process for becoming a police officer in Lafayette.,200,"Police Department | Lafayette, IN - Official Website","[""Application/Appointment Process""]","[""The Lafayette Police Force is An Equal Opportunity Employer"", ""Application/Appointment Process""]","[""Appointment Steps"", ""Probationary Period"", ""Availability Constraints"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Your LPD Career Opportunities Community Outreach Training Center How Do I… Application/Appointment Process The Lafayette Police Force is An Equal Opportunity Employer It is the policy of the City of Lafayette to provide equal opportunity to all employees and applicants without regard to race, sex, religion, national origin, age, sexual orientation, marital status, veteran status, or physical or mental disability. This same non-discriminatory consideration will guide all personnel actions including, but not limited to recruitment, hiring, training and promotion decisions in all job classifications. Furthermore, compensation, benefits, transfers, education or tuition assistance and social and recreational programs will be administered in a non-discriminatory fashion. Application/Appointment Process Applicants must submit a completed application via PoliceApp, along with all requested documentation to be considered eligible for the next written exam date. The test pool shall consist of those applicants taking the written aptitude test. Any applicant who fails to qualify at any phase of the application process may re-apply after sitting out one calendar year. Appointment Steps An applicant's appointment is conditional upon meeting the provisions for membership in the 1977 Police Pension and Disability Fund (PERF) under IC 36-8-8-1 et. seq. (IC 36-8-3-21) . After extending a conditional offer of employment to an applicant a physical examination and psychological evaluation will be completed (at no cost to the applicant) and results of those examinations will be presented 1st to the local Pension Board for their review and a brief interview with the applicant and finally to PERF for their approval. Approval from PERF can take up to 4 weeks. Probationary Period The employment of any applicant is considered probationary for a period of 1 year and that period may be extended for a period not to exceed 6 additional months, upon the recommendation of the Chief. Availability Constraints Prospective applicants should consider their availability to attend each step in the process prior to filing an application. Travel arrangements are the responsibility of the applicant. It is recommended that applicants complete military and educational obligations prior to applying to the department due to these constraints. Police App LPD Combine Day Salary & Benefits Moral Character Issues Police Officer Lateral Entry Program College Internship Program Career Opportunities Report a Crime Thank an Officer Stay Connected Alarm Reduction Contact Us 601 Columbia Street Lafayette, IN  47901 Phone: 765-807-1200 FAQs What is the number to the jail? Can you tell me if someone is wanted on warrant? How do I obtain a handgun permit? How can I request a street closure for a special event? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -497,https://www.knightdalenc.gov/departments/police/crime-prevention/crime-stoppers,Contact Info & Agency Meta,Info About Agencies,"Crime Stoppers | Town of Knightdale, NC","",200,"Town of Knightdale, NC","[""Crime Stoppers""]","[""Main navigation"", ""Social"", ""Footer Menu""]","[""Town of Knightdale, NC""]",[],[],[],"" -498,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0255/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -499,https://www.sandiego.gov/department-document/commission-police-practices-makes-recommendations-san-diego-police-department%e2%80%99s,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -500,https://www.casperwy.gov/news/news/newsroom/casper_police_officer_involved_shooting,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -501,http://www.ryepolice.us/logs/police-logs-for-8-8-18-8-14-18,Dispatch Logs,Police & Public Interactions,Rye Police Department Police Logs for 8/8/18-8/14/18 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs for 8/8/18-8/14/18""]","[""Police Logs for 8/8/18-8/14/18""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -502,https://delcopa.gov/planning/programsandinitiatives/heritagecommission/upcomingevents.html,Not Criminal Justice Related,Not Criminal Justice Related,Heritage Commission of Delaware County - Upcoming Events,"",200,"Delaware County, Pennsylvania","[""Heritage Commission of Delaware County - Upcoming Events""]","[""Upcoming Events""]","[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Heritage Commission of Delaware County - Upcoming Events Home / Departments / Planning Department / Partners / Heritage Commission of Delaware County - Upcoming Events Upcoming Events All events and meetings are open to the public and are generally held on the first Tuesday of the month unless otherwise noted. April 2, 2024 Heritage Commission Meeting, 7 pm, Hybrid May 5, 2024 Heritage Commission Awards Ceremony- 1-3 pm, Redwood Community Center, Upland County Park June 2024 Visit to historic site, TBD No meetings July or August If you would like to attend via Zoom, please email cliffordk@co.delaware.pa.us. In person address: 2 W. Baltimore Avenue, Suite 202, Media, PA 19063 Planning Department Navigation Access the Data and Mapping Innovation Hub About Planning Calendar Current Projects Delaware County 2035 Demographic Data Development Review Forms Funding Green Space and Trails Project Mapping Municipal Programs & Initiatives Planning Education Publications Gina Burritt, Director Planning Department 2 W. Baltimore Avenue Suite 202 Media, PA 19063 Phone: 610-891-5200 Fax: 610-891-5203 Email: Planning_Department@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2023 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Heritage Commission of Delaware County - Upcoming Events Home / Departments / Planning Department / Partners / Heritage Commission of Delaware County - Upcoming Events Heritage Commission of Delaware County - Upcoming Events Home / Departments / Planning Department / Partners / Heritage Commission of Delaware County - Upcoming Events Heritage Commission of Delaware County - Upcoming Events Home / Departments / Planning Department / Partners / Heritage Commission of Delaware County - Upcoming Events " -503,https://www.mass.gov/doc/municipal-police-training-committee-mptc-open-meeting-notice-061522/download,Media Bulletins,Agency-Published Resources,"","",200,"","","","","","","","" -504,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-1002/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -505,https://www.sandiego.gov/police/contact,Contact Info & Agency Meta,Info About Agencies,Contact | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""Contact""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Liaisons"", ""Directory"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government"", ""Pagination""]",[],[],"" -506,https://delcopa.gov/publicrelations/releases/2021/votebymail1018.html,Not Criminal Justice Related,Not Criminal Justice Related,"Municipal Election Vote-by-Mail Ballots Due to Arrive by Monday, October 18 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Municipal Election Vote-by-Mail Ballots Due to Arrive by Monday, October 18""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Voters advised to disregard erroneous PA Department of State ballot mail dates""]",[],[],"" -507,https://dps.iowa.gov/dci-and-ames-police-department-investigate-suspicious-death,Media Bulletins,Agency-Published Resources,DCI and Ames Police Department Investigate Suspicious Death | Iowa Department of Public Safety,"February 21, 2021 AMES, Iowa - This is not a press release from the Iowa Department of Public Safety. It is being distributed on behalf of the Ames Police Department as a result of the Division of Criminal Investigation's assistance to local authorities in this case.",200,Iowa Department of Public Safety | Iowa Department of Public Safety,"[""Iowa Department of Public Safety"", ""DCI and Ames Police Department Investigate Suspicious Death""]",[],[],[],[],[],"Skip to main content Iowa Department of Public Safety DCI and Ames Police Department Investigate Suspicious Death Jason Tuttle Commander, Ames Police Department 515.239.5312 jason.tuttle@cityofames.org February 21, 2021 AMES, Iowa - This is not a press release from the Iowa Department of Public Safety. It is being distributed on behalf of the Ames Police Department as a result of the Division of Criminal Investigation's assistance to local authorities in this case. ABOUT THE IOWA DEPARTMENT OF PUBLIC SAFETY The Iowa Department of Public Safety (DPS) is the largest law enforcement agency in the state. It includes six divisions and several bureaus, all working together with local, state and federal government agencies and the private sector, to keep Iowa a safe place by following our core values: leadership, integrity, professionalism, courtesy, service and protection. Divisions within the Iowa DPS: Iowa Division of Criminal Investigation, Iowa Division of Narcotics Enforcement, Iowa State Patrol, Iowa State Fire Marshal Division, Iowa Division of Intelligence and Fusion Center, and Administrative Services Division. The Department of Public Safety is led by the Commissioner who is appointed by the Governor. Iowa Department of Public Safety 215 E 7th St Des Moines IA 50319 https://dps.iowa.gov Iowa Department of Public Safety DCI and Ames Police Department Investigate Suspicious Death Jason Tuttle Commander, Ames Police Department 515.239.5312 jason.tuttle@cityofames.org February 21, 2021 AMES, Iowa - This is not a press release from the Iowa Department of Public Safety. It is being distributed on behalf of the Ames Police Department as a result of the Division of Criminal Investigation's assistance to local authorities in this case. ABOUT THE IOWA DEPARTMENT OF PUBLIC SAFETY The Iowa Department of Public Safety (DPS) is the largest law enforcement agency in the state. It includes six divisions and several bureaus, all working together with local, state and federal government agencies and the private sector, to keep Iowa a safe place by following our core values: leadership, integrity, professionalism, courtesy, service and protection. Divisions within the Iowa DPS: Iowa Division of Criminal Investigation, Iowa Division of Narcotics Enforcement, Iowa State Patrol, Iowa State Fire Marshal Division, Iowa Division of Intelligence and Fusion Center, and Administrative Services Division. The Department of Public Safety is led by the Commissioner who is appointed by the Governor. Iowa Department of Public Safety 215 E 7th St Des Moines IA 50319 https://dps.iowa.gov " -508,http://www.longbeach.gov/police/press-releases/dui-checkpoint/,Media Bulletins,Agency-Published Resources,DUI Checkpoint,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/26/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: DUI CHECKPOINT NETS THREE ARRESTS Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department Traffic Section conducted a DUI/Driver’s License checkpoint on January 24, 2015, on northbound Cherry Avenue at 59th St., between the hours of 7:00 p.m. and 3:00 a.m. Checkpoints are placed in locations that have the greatest opportunity for achieving drunk and drugged driving deterrence and provide the greatest safety for officers and the public. DUI/Drivers License checkpoints have been shown to lower DUI deaths and injuries. A major component of these checkpoints are the deterrent effects it has on those who might drive drunk or drugged impaired, bringing about more awareness and encouraging everyone to use sober designated drivers. According to the National Highway Traffic Safety Administration (NHTSA), checkpoints have provided the most effective documented results of any of the DUI enforcement strategies, while also yielding considerable cost savings of $6 for every $1 spent. Ninety percent of California drivers approve of checkpoints. During the eight-hour operation, which was aided by Long Beach Police Explorers and Long Beach Search and Rescue, 1,219 vehicles passed through the checkpoint with 319 drivers being screened for driving under the influence and the following results: Three (3) Standardized Field Sobriety Tests conducted Three (3) drivers arrested for DUI Seven (7) drivers cited for unlicensed driving One (1) driver cited for suspended license Six (6) drivers cited for traffic violations One (1) vehicle stored The Long Beach Police Department will conduct a Driving Under the Influence (DUI) Saturation Patrol on January 30, 2015 in our ongoing commitment to lowering deaths and injuries upon our streets and highways. The checkpoint and saturation patrol are funded by a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration. Report Drunk Drivers – Call 9-1-1! This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -509,https://training.detroitmi.gov/departments/police-department/project-green-light-detroit/agreements,Media Bulletins,Agency-Published Resources,Agreements | City of Detroit,"Memorandum of Understanding Project Green Light Detroit Agreement This Memorandum of Understanding (“MOU”) is made and entered into as of [Date], by and among the City of Detroit Police Department (“DPD”), the City of Detroit acting by and through its Office of the Mayor (“City”), and [Company Name] (“Entity”). DPD, the City, and the Entity are individually referred to as a “Party” and jointly as “Parties.” RECITALS A. As historical data indicates, a sizable amount of criminal activity in Detroit takes place at businesses open late into the evening. In the first half of 2015, for instance, approximately 25% of violent crimes in Detroit reported between 10PM and 8AM took place within 500 feet of a gas station. In light of these and other statistics, on January 1, 2016, DPD and the City launched “Project Green Light Detroit,” a public-private-community effort centered on developing real-time surveillance connections between DPD and local businesses.    B. “Project Green Light Detroit” launched with a pilot cohort of eight gasoline stations. As “Project Green Light Detroit Participants,” these eight stations all made firm commitments to provide for, install, and maintain high-quality cameras, robust lighting, and numerous pieces of “Project Green Light Detroit” signage, in addition to fulfilling other requirements in line with those set out in this MOU. In return, DPD monitors the stations’ cameras, allows the stations to leverage the “Project Green Light Detroit” brand, supports the stations through a city-wide media campaign, and organizes public safety meetings for the stations with community groups and DPD and City personnel. C. Looking forward, DPD and the City intend to increase the number of “Project Green Light Detroit Participants,” and to expand its scope to other entities, such as schools, retail, food service establishments, multi-family dwellings, and mixed-use developments. In so doing, DPD and the City aim to improve neighborhood safety, promote the revitalization and growth of local businesses, and strengthening DPD’s efforts to deter, identify, and solve crime. D. With the foregoing goals in mind, the Parties will enter into this MOU outlining the inclusion of the Entity as a “Project Green Light Detroit Participant.”   ARTICLE I RESPONSIBILITIES OF THE ENTITY 1.1. Cameras. At the Entity’s sole cost and expense, the Entity will provide for, install, and maintain, with the aid of an installer approved by DPD and the City, a set of at least four (4) network-based (i.e., “IP”) surveillance cameras (“cameras”). Each camera will have an AXIS approved SD Card installed in the camera; the Entity will not remove, or cause to be removed, any such SD Card. All cameras will at all times meet the following minimum requirements and specifications; provided, however, that DPD and the City may at any time alter the minimum requirements and specifications related to the cameras, including, but not limited to, the exact number of cameras to be maintained: a) Coverage. All cameras will be positioned as determined by DPD and the City. Cameras positioned outdoors will cover all areas generally accessible by the public on and near the Entity’s property. Cameras positioned outdoors will also be positioned such that they will legibly capture the license plates of automobiles passing through the Entity’s property and such that the cameras are located away from obstructing light sources. Among the cameras positioned indoors, at least one (1) will directly face all regularly-used entrances of the Entity from the inside. b) Resolution. All cameras will produce a resolution of at least 1080p. c) Visibility. All cameras will produce clear videos with discernible images under all lighting conditions at all times of the day and night. All cameras will possess wide dynamic range capabilities and support both normal and low light environments. d) Durability. All cameras will be encompassed by IP66-rated encasing. e) Hardware. All cameras will feature RJ45 connectors, physical slots for SD/SHDC storage cards, and edge storage capabilities. All cameras will meet the specifications as determined by DPD. f) Brand and Model. All cameras will be manufactured by brands compatible with DPD’s surveillance software provider. All camera brands and models will be approved by DPD and the City. 1.2. Network. At the Entity’s sole cost and expense, the Entity will provide for a high-speed internet connection capable of consistently producing upload speeds at all times of at least ten (10) megabytes per second. At the Entity’s sole cost and expense, the Entity will also provide for a network switch that will be approved by DPD and the City. Additionally, the Entity will authorize its vendor to provide information and account review access to DPD should the Entity be in arrears to the vendor. 1.3. Storage. At the Entity’s sole cost and expense, the Entity will ensure that footage from all cameras is stored on an Axis approved SD/SDHC card, and for at least thirty (30) days via a network-attached storage device (“NAS”) or cloud-based storage that will be compatible with DPD’s surveillance software provider. 1.4. Cloud Subscription. At the Entity’s sole cost and expense, the Entity will continuously provide for any cloud-related subscription services required to connect the cameras to DPD’s surveillance software provider. Additionally, the Entity will authorize its vendor to provide information and account review access to DPD should the Entity be in arrears to the vendor. 1.5. Lighting. At the Entity’s sole cost and expense, the Entity will provide for, install, and maintain external lighting, with the aid of an installer approved by DPD and the City, that will at all times meet the following minimum requirements, standards, and specifications, unless otherwise agreed to by the Parties: a) Illumination Generally. The Entity’s external lighting willfully and continuously illuminate all property areas generally accessible by the public in accordance with the footcandle requirements set under subsection (b) below; provided, however, that the illumination requirements set under subsection (b) may, if a variance is requested and with the consent of all Parties, be modified by Appendix A to this MOU. The Entity’s external lighting will provide sufficient lighting so that all cameras produce clear videos with discernible images at all times of the day and night. b) Illumination Requirements. The Entity will be designated, in the sole discretion of DPD and the City, a “Gas Station”, a “Small Parking Lot Entity,” or a “Large Parking Lot Entity.” A “Small Parking Lot Entity” is an establishment that has an uncovered parking area of less than 20 parking spots. A “Large Parking Lot Entity” is an establishment that has an uncovered parking area of more than 20 parking spots. Depending on its designation, the Entity will ensure that, in all outdoor areas frequented by members of the general public, its external lighting averages a horizontal illuminance level, at grade, according to the following standards: For a “Gas Station,” at least twenty (20) footcandles in all outdoor areas; For a “Small Parking Lot Entity,” at least fifteen (15) footcandles. The 15 footcandle requirement is limited to the parking area; the entrance area must maintain a 20 footcandle footprint. For a “Large Parking Lot Entity,” at least ten (10) footcandles. The 10 footcandle requirement is limited to the parking area; the entrance area must maintain a 20 footcandle footprint. External lighting at all other property areas will average a horizontal illuminance, at grade, of at least five (5) footcandles, including at the Entity’s property line. If the Entity believes that its establishment maintains adequate lighting, but it does not meet the illumination requirements outlined in this subsection, it may request a variance from DPD. The decision whether to grant a variance will be made by DPD in its sole discretion. c) Other. The Entity’s external lighting will meet ASHRAE/IESNA 90.1 2013 standards. The Entity’s external lighting will be composed of components listed on the DesignLights Consortium Qualified Products List. The light uniformity ratio on the Entity’s property will be no greater than four-to-one (4:1). 1.6. Electrical. At the Entity’s sole cost and expense, the Entity will provide for a supply of electricity that will at all times ensure for the continuous operation of all the Entity’s cameras and external lighting. 1.7. Signs and Green Light. At the Entity’s sole cost and expense, the Entity will provide for, install, and maintain, with the aid of an installer approved by DPD and the City, the following external signs and fixtures: a) Green Light. The Entity will provide for, install, and maintain one (1) green light (flashing or steady glow), approved by DPD and the City, for external placement in a location visible from passerby vehicles 24 hours a day.   1) For multi-unit temporary or permanent residential facilities, a single flashing green light is allowed, multiple lights must be approved by DPD.   2) For locations determined to be a “corridor,” no green light will be installed.  The alternate usage of the Illuminated Corridor Sign will be required, the number and placement of which will be determined by the City. b) Wall Sign. The Entity will provide for, install, and maintain one (1) aluminum sign affixed to the Entity’s exterior wall in a location prominently visible to the general public. The sign will measure 18” by 24” and feature the “Project Green Light Detroit” logo.   1) For locations determined to be a plaza, one (1) exterior wall sign will be required, unless additional wall signs are deemed necessary based on the plaza’s size.  Generally, any plaza with more than four (4) store fronts will require one (1) wall sign at each end.   2) For corridors, Illuminated Corridor Signs will be utilized, not the aluminum exterior wall signs.  The number and placement of which will be determined by the City. c) Flag Signs. The Entity will provide for, install, and maintain a set of aluminum two-sided flag signs.  The need for, and exact number of signs needed, will be determined by DPD and the City, and will be affixed to the Entity’s exterior walls in locations prominently visible to the general public. The signs will measure 12” by 18” and feature the “Project Green Light Detroit” logo on both sides. d) Door Decals. The Entity will provide for, install, and maintain one (1) window decal affixed to each side of any door commonly utilized by the public or by residents of a facility or location.  The decals will measure 5” by 5” or 7” by 22” and feature the “Project Green Light Detroit” logo. e) Generally. The specifications and installation locations of the green light and all other signs relating to the Entity’s participation including, but not limited to, all signs expressly discussed in this MOU and all other signs featuring the text “Project Green Light Detroit” or the “Project Green Light Detroit” logo and related trade dress, will be approved by DPD and the City. 1.8. Access. The Entity will allow DPD to remotely access live and recorded video footage from all cameras at all times. 1.9. Clear View. The Entity will ensure that its windows and doors are, at all times, not obstructed by objects, fixtures, or signs such that there will be a clear view into, and out from, the Entity, as determined by DPD and the City. The Entity will also ensure that there are no obstructing objects, fixtures, or signs limiting the views of any cameras, or the presentation of any signs, provided for under this MOU. 1.10. Partner is responsible for any and all expenses incurred due to program changes or equipment updates and for bringing the site into compliance. 1.11. At any time, DPD and/or the City may, in their sole discretion, determine that the technical specifications outlined in Article 1.1, 1.2, 1.3, 1.4, or 1.5 of this MOU warrant revision. If DPD and/or the City conclude that such technical specifications warrant revision, DPD shall provide the Entity with the revised specifications as determined by DPD and/or the City. The Entity will implement those revised specifications within thirty (30) days of DPD providing the revised specifications. 1.12. If the Entity fails to comply with any of the provisions of this Article, DPD and/or the City may, in their sole discretion, immediately terminate this MOU and the Entity’s participation in the Project Green Light program. ARTICLE II SURVEILLANCE, MEETINGS, AND PATROLS 2.1. Surveillance. At DPD’s discretion, it will monitor the Entity’s cameras, including, but not limited to, during emergencies and other exigent circumstances. In the event a 9-1-1 call is placed by the Entity to DPD, DPD will make its best effort to monitor the Entity’s cameras until DPD deems that the premises are secure. This MOU does not oblige DPD to monitor the Entity’s cameras at any time.  2.2. Meetings. At DPD’s discretion, the Entity, a designated DPD representative, City personnel, and community members may meet to discuss public safety issues concerning the Entity and its surrounding neighborhood. 2.3. Patrols. At DPD’s discretion based on the totality of circumstances, DPD may coordinate visits that may encompass, but are not limited to, the following: entering into the Entity, signing in at the Entity, patrolling parking lots and other parts of the Entity’s property, engaging loiterers, and working with Entity employees for the purpose of furthering law enforcement efforts. ARTICLE III TERM AND TERMINATION 3.1. On an annual basis, if there are changes to the MOU, DPD will provide notice to participants via email. At that time, participants will have the opportunity to accept or provide written objections to said changes.  Failure to renew the MOU shall be grounds for termination of participation in the Project Green Light partnership. Notwithstanding the foregoing, however, this MOU will remain in existence, with respect to all Parties, until and unless it is superseded by a different agreement, subject to a change in local law, or terminated expressly by any Party. Any Party may terminate this MOU without cause with thirty (30) days’ written notice. DPD and the City may terminate this MOU with cause so long as reasonable notice is given, and may at any time terminate this MOU if DPD and/or the City believe, in their sole discretion, that the Entity is failing to abide by the terms of this MOU; is acting in bad faith; or is not in compliance with applicable laws, rules, or regulations. In the event this MOU is terminated, the Entity will immediately remove any and all sign or decals affiliated with “Project Green Light Detroit,” including the light(s) and sign(s) or decals as described under Article I of this MOU. No changes may be made to this MOU unless agreed to by all Parties. ARTICLE IV MISCELLANEOUS 4.1. Disclaimers. This MOU does not create a joint venture or legal partnership among the Parties. No Party has the authorization or right to bind any other Party to any obligation without such Party’s express written consent. This MOU does not make the Entity a state actor or a non-state actor acting under the color of law. The purpose of this MOU is to assist the Parties in coordinating their activities by providing a written memorandum of their intentions stated in good faith and with as much accuracy as possible. It is not the intent of the Parties that this document will constitute a contract or provide the basis for a legal claim by any Party. Any obligations under this MOU requiring approval by the City Council are contingent on the approval of the City Council. 4.2. Assignment and Subcontracts. No Party will have the right, power, or authority to assign this MOU, or any portion of this MOU, or to delegate or subcontract any of its duties or obligations arising hereunder, either voluntarily or involuntarily, or by operation of law, without the prior written approval of the other Parties.   APPENDIX A TO MEMORANDUM OF UNDERSTANDING PROJECT GREEN LIGHT DETROIT AGREEMENT             All Parties hereby agree that the Illumination Requirements provided for in subsection 1.5(b) of the Project Green Light MOU shall be modified to provide that Entity shall not be required to maintain the required horizontal illuminance level in the following areas of its property:   1. 2. 3. 4. 5.",200,City of Detroit | Opportunity Rising,"[""Agreements""]","[""Top Links"", ""Site Menu"", ""Memorandum of Understanding Project Green Light Detroit Agreement""]","[""Tier One Installer Agreement"", ""Corridor Agreement"", ""Tier Two Installer Agreement"", ""Partnership Agreement""]","[""CONTACTS"", ""Sections""]",[],[],"" -510,https://www.antioch.il.gov/wpfb-file/10-11-11-police-and-fire-agenda-pdf-5/,Poor Data Source,Poor Data Source,"10-11-11 Police And Fire Agenda - Antioch, IL",10 11 police and fire agenda pdf commissions commission agendas 2011 2017 05 17 08 41 32 0000,200,"Home - Antioch, IL","[""10-11-11 Police And Fire Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -511,http://cityofcanalfulton-oh.gov/police-department-hiring-entry-level-police-officer/,Training & Hiring Info,Info About Officers,"","",404,"","","","","","","","" -512,https://police.crystalmn.gov/r_e_s_i_d_e_n_t/public_works,Not Criminal Justice Related,Not Criminal Justice Related,Public Works - City of Crystal,Links and information related to the City of Crystal Public Works Department.,200,Just a moment...,"[""Public Works""]","[""Crystal Public Works""]","[""Sign up for a city newsletter or notification."", ""City Hall"", ""Regular Hours:""]","[""Monday - Friday""]",[],[],"" -513,https://www.ci.plymouth.mi.us/government/departments/police/history,Not Criminal Justice Related,Not Criminal Justice Related,"History - City of Plymouth, MI","",200,Just a moment...,"[""History""]",[],[],[],[],[],"" -514,https://rexburg.us/police-ask-for-help-finding-man-who-left-for-work-and-hasnt-been-seen-since/,Media Bulletins,Agency-Published Resources,"","",522,"","","","","","","","" -515,https://spdblotter.seattle.gov/2014/12/17/police-increasing-patrols-after-early-morning-gunfire-near-south-seattle-school/,Media Bulletins,Agency-Published Resources,Police Increasing Patrols After Early Morning Gunfire Near South Seattle School - SPD Blotter,"",200,403 Forbidden,"[""Police Increasing Patrols After Early Morning Gunfire Near South Seattle School""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -516,https://coloradosprings.gov/police-department/article/news/multiple-arrests-internet-crimes-against,Media Bulletins,Agency-Published Resources,Multiple Arrests by Internet Crimes Against Children Task Force | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Multiple Arrests by Internet Crimes Against Children Task Force""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -517,https://www.lynchburgvapolice.gov/news-updates/2124/,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -518,https://www.mass.gov/event/2022-pittsfield-police-department-open-house-5-pm-2022-01-11t170000-0500-2022-01-11t180000-0500,Resources,Agency-Published Resources,2022 Pittsfield Police Department Open House - 5 PM | Mass.gov,"",200,Mass.gov,"[""2022 Pittsfield Police Department Open House - 5 PM""]","[""Overview of 2022 Pittsfield Police Department Open House - 5 PM"", ""Additional Resources for 2022 Pittsfield Police Department Open House - 5 PM"", ""Participating Organizations"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[],"" -519,https://brookfieldil.gov/publication/july-1-2020-board-of-fire-and-police-commissioners/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -520,https://delcopa.gov/sustainability/pdf/raise/potentialeconomicimptwaterfront.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -521,https://www.providenceri.gov/police/explorers-program/attention/,Poor Data Source,Poor Data Source,City of Providence Attention - City of Providence,"",200,Sucuri WebSite Firewall - Access Denied,"[""Attention""]","[""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español"", ""Lists *""]",[],[],[],"Skip To Menu Skip To Content Skip To Accessibility Options Language Language Arabic Chinese (Traditional) English Khemer Portuguese Spanish City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley City Of Providence Mayor Brett Smiley Search Accessibility CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation PVD 311 CITY HALL I Want to … MAYOR BRETT P. SMILEY Departments City Council Find a Meeting Agenda Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Running a Business Starting a Business Purchasing EVENTS NEWS EXPLORE Explore Providence Parks Recreation ACCESSIBILITY Attention Attention Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn Attention Attention Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn Attention Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * " -522,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/021121summary.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -523,https://piedmont.ca.gov/services___departments/police/services/social_media,Contact Info & Agency Meta,Info About Agencies,Social Media - City of Piedmont,"",200,Just a moment...,"[""City of Piedmont""]",[],[],[],[],[],"Skip navigation City of Piedmont How Do I? {1} ##LOC[OK]## Services Building Inspections Building Permits Business Licenses Facility Rentals Garbage, Recycling, and Organic Waste Parks and Fields Permits & Licenses Preschool Recreation Programs Schoolmates Street Sweeping Departments Careers & Human Resources City Administrator City Clerk Finance Fire Planning & Building Police Public Works Recreation Government Americans with Disabilities Act Charter & City Code City Council Commissions & Committees Elections Forms & Applications Meeting Videos Bid and Proposal Opportunities City Projects News & Events News Events Stay Informed KCOM-TV About Piedmont Federal, State, & County Representatives Community Resources Schools Houses of Worship Public Transit Utilities Directions to City Hall Services Building Inspections Building Permits Business Licenses Facility Rentals Garbage, Recycling, and Organic Waste Parks and Fields Permits & Licenses Preschool Recreation Programs Schoolmates Street Sweeping Departments Careers & Human Resources City Administrator City Clerk Finance Fire Planning & Building Police Public Works Recreation Government Americans with Disabilities Act Charter & City Code City Council Commissions & Committees Elections Forms & Applications Meeting Videos Bid and Proposal Opportunities City Projects News & Events News Events Stay Informed KCOM-TV About Piedmont Federal, State, & County Representatives Community Resources Schools Houses of Worship Public Transit Utilities Directions to City Hall Skip Sidebar Navigation Last item for navigation City of Piedmont » Departments » Police » Services » Social Media Share This Print Page A+ Increase Font A- decrease font City of Piedmont 120 Vista Avenue Piedmont, CA 94611 (510) 420-3040 Home Services & Departments Government Community & Events About Piedmont Calendar Stay Connected Youtube Facebook Page Twitter Page Instagram Page Linkedin Page City of Piedmont | All Rights Reserved | Powered by CivicLive | © 2024 Civiclive. Skip navigation City of Piedmont How Do I? City of Piedmont How Do I? City of Piedmont How Do I? City of Piedmont How Do I? " -524,https://gonzalesca.gov/services/police/how-do-i/learn-what-crime-rate-gonzales,Resources,Agency-Published Resources,Learn what the crime rate is in Gonzales? | City of Gonzales,"Official City of Gonzales, CA website. Find the latest news, events, and information for residents and businesses....",200,City of Gonzales,"[""The City of Gonzales, California"", ""The City of Gonzales, California""]","[""Top menu"", ""Learn what the crime rate is in Gonzales?""]",[],"[""CITY OF GONZALES""]",[],[],"" -525,https://council.seattle.gov/2022/08/19/west-seattle-bridge-police-recruitment-and-incentives-bill-passes-abortion-access-bill-signing-metropolitan-parks-district-public-hearing-small-tenant-improvement-fund-seattle-restored-program/,Policies & Contracts,Info About Agencies,West Seattle Bridge; Police Recruitment and Incentives Bill Passes; Abortion Access Bill Signing; Metropolitan Parks District Public Hearing; Small Tenant Improvement Fund; Seattle Restored Program – Landlords and Artists/Entrepreneurs Can Apply; King County Assessor Valuations and Appeals; No Newsletter Next Two Weeks - Seattle City Council Blog,"",200,403 Forbidden,[],"[""West Seattle Bridge; Police Recruitment and Incentives Bill Passes; Abortion Access Bill Signing; Metropolitan Parks District Public Hearing; Small Tenant Improvement Fund; Seattle Restored Program – Landlords and Artists/Entrepreneurs Can Apply; King County Assessor Valuations and Appeals; No Newsletter Next Two Weeks"", ""More posts""]","[""West Seattle Bridge"", ""Police Recruitment and Incentives Bill Passes"", ""Abortion Access Bill Signing"", ""Metropolitan Parks District Public Hearing"", ""Small Tenant Improvement Fund"", ""Seattle Restored Program – Landlords and Artists/Entrepreneurs Can Apply"", ""King County Assessor Valuations and Appeals"", ""No Newsletter Next Two Weeks"", ""Seattle City Council statement on today’s Council meeting"", ""Seattle Councilmember Rob Saka joins SDOT to fill potholes"", ""Seattle City Council observes week of remembrance for Japanese American incarceration"", ""HELPFUL LINKS"", ""Make your voice heard"", ""Councilmembers""]",[],[],[],"" -526,https://estespark.colorado.gov/departments/police/operations/patrol/code-enforcement/report-a-potential-code-violation,Not Criminal Justice Related,Not Criminal Justice Related,Report a Potential Code Violation | Town of Estes Park,"",200,Home | Town of Estes Park,"[""Report a Potential Code Violation""]",[],"[""Language Translation""]",[],[],[],"" -527,https://oceancitymd.gov/oc/worcester-county-law-enforcement-agencies-to-co-host-citizens-police-academy/,Misc Police Activity,Police & Public Interactions,"Worcester County Law Enforcement Agencies to Co-Host Citizens Police Academy – Town of Ocean City, Maryland","",200,"Town of Ocean City, Maryland – A Vibrant Coastal Resort Community","[""Worcester County Law Enforcement Agencies to Co-Host Citizens Police Academy""]","[""Post navigation""]","[""Related posts""]",[],[],[],"" -528,https://delcopa.gov/ich/pdfs/covid_govwolf_march12.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -529,http://www.longbeach.gov/police/news/south-division-forum/,Media Bulletins,Agency-Published Resources,South Division Forum,"Join South Patrol Division Commander Michael Lewis for the next Community Forum on Wednesday, June 21, 2017, 6:00 p.m., to 8:00 p.m.",200,City of Long Beach,"[""Police Department"", ""South Division Commander's Community Forum""]",[],"[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", """", """", """", """", ""Crime Lab Survey"", """"]",[],"" -530,https://delcopa.gov/departments/heatplan/heatsafetytips.pdf,Media Bulletins,Agency-Published Resources,"","",200,"","","","","","","","" -531,"https://norfolkne.gov/government/departments/police-division/press-releases/march-11,-2021-press-release.html",Media Bulletins,Agency-Published Resources,"March 11, 2021 Press Release - City of Norfolk, NE","",200,"Welcome to Norfolk, NE - City of Norfolk, NE","[""City of Norfolk, NE"", ""Police Division"", ""March 11, 2021 Press Release"", ""City of Norfolk, NE""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]","" -532,https://www.newhopemn.gov/news___features/now_recruiting_police_reserves,Training & Hiring Info,Info About Officers,"","",404,"","","","","","","","" -533,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/arrests/083022arrests.pdf,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -534,https://rockfordil.gov/police-lgbtqia-liaison/,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -535,https://www.sandiego.gov/police/community,Resources,Agency-Published Resources,Community | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""Community""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Community"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -536,https://www.naperville.il.us/services/naperville-police-department/programs-and-services/fingerprinting/,Resources,Agency-Published Resources,Fingerprinting | The City of Naperville,The Naperville Police Department offers fingerprinting services to Naperville residents for a $10.00 fee.,200,Home | The City of Naperville,"[""Fingerprinting""]","[""Programs and Services"", ""Naperville Police Department""]","[""Explore""]",[],"[""Helping Residents Build a Better Community"", ""Resources for Doing Business in Naperville""]",[],"Menu Search Menu Search Search Main Menu Navigation About Naperville + An Award-Winning Community Demographics and Key Facts Education Historic Preservation in Naperville Projects in Naperville Transportation and Parking Townships Government + Boards and Commissions City Leadership Team City Finances Annual Budget and Financial Reports Purchasing and Bids Taxes and Financial Forms Utility Services and Billing General Billing Water Street TIF District Coronavirus Resources Diversity, Equity and Inclusion A Community of Belonging DEI Defined DEI Timeline Youth Involvement Embracing Community Environmental Sustainability in Naperville Grants Meetings and Agendas Legislative Priorities Meeting Room Reservations Meet Your City Council Mayor Scott A. Wehrli Councilman Ian Holzhauer Councilman Patrick Kelly Councilman Paul Leong Councilwoman Allison Longenbaugh Councilman Josh McBroom Councilwoman Jennifer Bruzan Taylor Councilman Dr. Benjamin M. White Councilman Nate Wilson Municipal Center Municipal Code Open Data Proclamations Strategic Plan Task Forces Voting and Voter Registration Services + Brush, Leaf & Yard Waste Curbside Bulk Brush Collection Leaf Collection Yard Waste Collection Electric Utility Your Electric Service Electrical Safety Powering Our Community for the Future FOIA Request Garbage and Recycling Residential Garbage Collection Garbage Carts Curbside Recycling Program Recycling Carts Recycling Drop-Off Center Household Hazardous Waste Facility Electronics Recycling Holiday Lights Recycling Naperville Fire Department About the Fire Department Emergency Preparedness Inspections and Permits Programs and Services Safety and Public Education Naperville Police Department About the Police Department Programs and Services Community Education and Crime Prevention Office of the Chief of Police Investigations Division Patrol Division Join NPD Permits and Licenses Senior Services and Resources Services and Resources for People with Disabilities Snow and Ice Removal Snow Plowing and Salting Mailboxes and Parkway Sod Winter Updates Water/Wastewater Utility Your Water Service Maintaining Our System Common Water Issues Residents + Helping Residents Build a Better Community You can find a collection of city information relevant to everyone in Naperville, from new residents to long-time community members. Go to this section Businesses + Resources for Doing Business in Naperville Whether you're starting, running or visiting a Naperville business - find resources to help you. Go to this section Enjoy Naperville + Biking Maps, Guides and Plans Commander Dan Shanower September 11 Memorial Explore the Community Festivals and Parades Millennium Wall Naperville Community Concert Center Naperville Riverwalk Naper Settlement & Homestead Von Oven Scout Reservation Walks and Runs + + + + Helping Residents Build a Better Community You can find a collection of city information relevant to everyone in Naperville, from new residents to long-time community members. Go to this section + Resources for Doing Business in Naperville Whether you're starting, running or visiting a Naperville business - find resources to help you. Go to this section + " -537,https://spdblotter.seattle.gov/2013/02/25/if-you-see-a-handcuffed-man-walking-around-near-harborview-give-police-a-call/,Media Bulletins,Agency-Published Resources,"If You See a Handcuffed Man Walking Around Near Harborview, Give Police a Call - SPD Blotter","",200,403 Forbidden,"[""If You See a Handcuffed Man Walking Around Near Harborview, Give Police a Call""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -538,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0421/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -539,https://coloradosprings.gov/police-department/page/falcon-division,Contact Info & Agency Meta,Info About Agencies,Falcon Division | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Falcon Division""]","[""Search"", ""Falcon Division (Northwest)"", ""About Falcon"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],"[""HOURS:""]","[""REPORT ONLINE""]",[],"" -540,https://wyoming.delaware.gov/police-department/policedepartmentapplication2017/,Training & Hiring Info,Info About Officers,PoliceDepartmentApplication - Town of Wyoming,"",200,Home - Town of Wyoming - Kent County Delaware,"[""Wyoming""]","[""Delaware"", ""PoliceDepartmentApplication""]","[""Menu"", ""Contact Us""]",[],[],[],"Skip to Content Skip to Footer Toggle navigation Menu Government Town Council Town Staff Budgets Ordinances Charter Meetings & Events Past Minutes & Agendas Committees Planning & Zoning Water & Sewer Board of Adjustments Peach Festival Info Emergency Services Police Department Fire Department Building Inspection License Applications & Permits Forms Public Notice Street Sweeping Schedule Trash and Recycling Schedule Important Links Community Town Life History Park Reservations Wyoming Park Local Organizations Photo Gallery Newsletter News Meetings & Events Contact Us Contact Information Contact Form FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Town Council Town Staff Budgets Ordinances Charter Meetings & Events Past Minutes & Agendas Committees Planning & Zoning Water & Sewer Board of Adjustments Peach Festival Info Emergency Services Police Department Fire Department Building Inspection License Applications & Permits Forms Public Notice Street Sweeping Schedule Trash and Recycling Schedule Important Links Community Town Life History Park Reservations Wyoming Park Local Organizations Photo Gallery Newsletter News Meetings & Events Contact Us Contact Information Contact Form FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Town Council Town Staff Budgets Ordinances Charter Meetings & Events Past Minutes & Agendas Committees Planning & Zoning Water & Sewer Board of Adjustments Peach Festival Info Emergency Services Police Department Fire Department Building Inspection License Applications & Permits Forms Public Notice Street Sweeping Schedule Trash and Recycling Schedule Important Links Community Town Life History Park Reservations Wyoming Park Local Organizations Photo Gallery Newsletter News Meetings & Events Contact Us Contact Information Contact Form FOIA Form Town Hall will be closed Friday March 29, 2024 in observance of Good Friday. Office will reopen on Monday April 1st. More Info Wyoming Delaware Listen PoliceDepartmentApplication PoliceDepartmentApplication Wyoming Delaware Listen PoliceDepartmentApplication PoliceDepartmentApplication Listen PoliceDepartmentApplication PoliceDepartmentApplication Listen PoliceDepartmentApplication PoliceDepartmentApplication Listen PoliceDepartmentApplication PoliceDepartmentApplication Listen Contact Us Phone Icon for Town Hall Phone Number (302) 697-2966 Map Marker Icon for Town Hall Directions 120 W. Camden Wyoming Ave. Wyoming, DE 19934 Envelope Icon for Contacting Town Hall Contact Form FOIA Form Facebook Icon Like Us Original design and concept by the Delaware GIC Copyright © 2024 Government Information Center Contact Us Phone Icon for Town Hall Phone Number (302) 697-2966 Map Marker Icon for Town Hall Directions 120 W. Camden Wyoming Ave. Wyoming, DE 19934 Envelope Icon for Contacting Town Hall Contact Form FOIA Form Facebook Icon Like Us Original design and concept by the Delaware GIC Copyright © 2024 Government Information Center Phone Icon for Town Hall Phone Number (302) 697-2966 Map Marker Icon for Town Hall Directions 120 W. Camden Wyoming Ave. Wyoming, DE 19934 Envelope Icon for Contacting Town Hall Contact Form FOIA Form Facebook Icon Like Us Original design and concept by the Delaware GIC Copyright © 2024 Government Information Center Phone Icon for Town Hall Phone Number (302) 697-2966 Map Marker Icon for Town Hall Directions 120 W. Camden Wyoming Ave. Wyoming, DE 19934 Envelope Icon for Contacting Town Hall Contact Form FOIA Form Facebook Icon Like Us " -541,http://lafayettepolice.us/149/departments-a---f,Contact Info & Agency Meta,Info About Agencies,"Departments A - F | Lafayette, IN - Official Website",Learn about the departments and divisions A - F that make up the city government. ,200,"Police Department | Lafayette, IN - Official Website","[""Departments A - F""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]","[""Animal Control"", ""City Attorney"", ""City Clerk"", ""City Controller"", ""Communications and Marketing"", ""Economic Development"", ""Engineering & Public Works"", ""Facilities"", ""Fire Department"", ""Fleet Maintenance""]",[],[],Skip to Main Content -542,https://delcopa.gov/sustainability/sustainabilityplan.html,Not Criminal Justice Related,Not Criminal Justice Related,Sustain Delco: A Sustainability Plan for Delaware County,"",200,"Delaware County, Pennsylvania","[""Sustain Delco: A Sustainability Plan for Delaware County""]",[],"[""Office of Sustainability Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Sustain Delco: A Sustainability Plan for Delaware County, Pennsylvania""]",[],"[""What is a Sustainability and Climate Action Plan?"", ""Why is a Sustainability and Climate Action Plan Important for Delaware County?"", ""EXPLORE SUSTAIN DELCO: A SUSTAINABILITY PLAN FOR DELAWARE COUNTY""]","" -544,https://spdblotter.seattle.gov/2022/05/26/police-arrest-one-seize-gun-drugs-cash-downtown-thursday-evening/,Media Bulletins,Agency-Published Resources,"Police Arrest One, Seize Gun, Drugs, Cash Downtown Thursday Evening - SPD Blotter","",200,403 Forbidden,"[""Police Arrest One, Seize Gun, Drugs, Cash Downtown Thursday Evening""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -545,http://www.longbeach.gov/police/press-releases/l-b-p-d--receives-grant-for-special-traffic-enforce----crash-prevention/,Media Bulletins,Agency-Published Resources,L.B.P.D. Receives Grant for Special Traffic Enforce. & Crash Prevention,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/24/2016 FOR IMMEDIATE RELEASE Press Release # Subject: L.B.P.D. RECEIVES GRANT FOR SPECIAL TRAFFIC ENFORCEMENT & CRASH PREVENTION Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department has been awarded a $400,000 grant from the California Office of Traffic Safety (OTS) for a year-long program of special enforcements and public awareness efforts to prevent traffic related deaths and injuries. The Long Beach Police Department will use the funding as part of the city’s ongoing commitment to keep our roadways safe and improve the quality of life through both enforcement and education. “This funding, through our valuable partnership with OTS, will play a vital role in enhancing our efforts to increase the safety of our roads,” stated Long Beach Police Chief Robert Luna. “We will continue our mission to raise awareness of traffic related concerns, which cause collisions that are often preventable, through both educational and enforcement measures.” After falling to a ten year low in 2010, the number of persons killed has climbed nearly 17% across the state with 3,176 killed in 2015 according to the National Highway Traffic Safety Administration. Particularly alarming is the six year rise in pedestrian and bicycle fatalities, along with the growing dangers of distracting technologies, and the emergence of drug-impaired driving as a major problem. This grant funding will provide opportunities to combat these and other devastating problems such as drunk driving, speeding and crashes at intersections. “Years of research tell us that enforcement and education work best jointly to combat unsafe driving,” said OTS Director Rhonda Craft. “This grant brings both tactics together, with the Office of Traffic Safety and the Long Beach Police Department working in concert to help keep the streets and highways safe across Long Beach and the state.” Activities that the grant will fund include: • Educational presentations • DUI checkpoints • DUI saturation patrols • Bicycle and pedestrian safety enforcement • Motorcycle safety enforcement • Distracted driving enforcement • Seat belt and child safety seat enforcement • Speed, red light, and stop sign enforcement • Compilation of DUI “Hot Sheets,” identifying worst-of-the-worst DUI offenders • Specialized DUI and drugged driving training such as Standardized Field Sobriety Testing (SFST), Advanced Roadside Impaired Driving Enforcement (ARIDE), and Drug Recognition Evaluator (DRE) Funding for this program is from the California Office of Traffic Safety through the National Highway Traffic Safety Administration. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -546,https://ci.san-bernardino.ca.us/city_hall/police_department/public_safety/traffic_safety_programs/alpr_statistics,Poor Data Source,Poor Data Source,ALPR Statistics - City of San Bernardino,"",200,Just a moment...,"[""City of San Bernardino California""]","[""ALPR Statistics""]",[],[],[],[],Skip to Content -547,https://www.knoxvilletn.gov/government/city_departments_offices/police_department/field_operations_bureau/community_partnership_officers/c_p_t_e_d_security_surveys,Resources,Agency-Published Resources,CPTED Security Surveys - City of Knoxville,police*,200,Just a moment...,"[""CPTED Security Surveys"", ""Police Chief""]",[],[],[],[],[],Skip navigation {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## -548,https://www.mass.gov/news/environmental-police-officer-ab-exam-update,Training & Hiring Info,Info About Officers,Environmental Police Officer A/B Exam Update | Mass.gov,"Eligible List Establishment Date: January 15, 2021",200,Mass.gov,"[""News Environmental Police Officer A/B Exam Update""]","[""Civil Service"", ""Related to Environmental Police Officer A/B Exam Update"", ""Help Us Improve Mass.gov with your feedback""]",[],"[""2020 Environmental Police Officer A/B Exam""]",[],[],"" -549,https://coloradosprings.gov/tag/police,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -550,https://www.lasalle-il.gov/departments/police-department,Contact Info & Agency Meta,Info About Agencies,Police Department | City of La Salle,"The mission of the LaSalle Police Department, in cooperation with our community, is to protect life and property, and enhance the quality of life for all our citizens.",200,"Error retrieving title: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))","[""Police Department""]","[""Main navigation"", ""Breadcrumb"", ""Mission Statement"", ""The Illinois Valley's Finest"", ""Police Department Information"", ""Main Menu"", ""Important Info""]",[],[],[],[],"" -551,https://www.sandiego.gov/event/community-coffee-cop,Poor Data Source,Poor Data Source,"","",403,"","","","","","","","" -552,https://www.mass.gov/doc/police-standards-subcommittee-open-meeting-notice-agenda/download,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -553,https://www.dps.nm.gov/blog/2022/04/12/update-cancel-silver-alert-belen-nm-sally-krieger-has-been-located-and-is-safe-please-refer-all-inquiries-and-questions-to-belen-police-department-at-505-865-9130/,Media Bulletins,Agency-Published Resources,"UPDATE: CANCEL Silver Alert - Belen, NM - Sally Krieger has been located and is safe. Please refer all inquiries and questions to Belen Police Department at (505) 865-9130. - NM Department of Public Safety","",200,Home - NM Department of Public Safety,"[""UPDATE: CANCEL Silver Alert – Belen, NM – Sally Krieger has been located and is safe. Please refer all inquiries and questions to Belen Police Department at (505) 865-9130.""]",[],"[""Location"", ""Sitemap"", ""Quick Links"", ""Social Media Links""]",[],[],[],"Manage Cookie Consent We use cookies to optimize our website and our service. Functional Functional Always active The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network. Preferences Preferences The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user. Statistics Statistics The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you. Marketing Marketing The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes. Manage options Manage services Manage {vendor_count} vendors Read more about these purposes Accept Deny Preferences Save preferences Preferences Cookie Policy Privacy Statement {title} Manage Cookie Consent We use cookies to optimize our website and our service. Functional Functional Always active The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network. Preferences Preferences The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user. Statistics Statistics The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you. Marketing Marketing The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes. Manage options Manage services Manage {vendor_count} vendors Read more about these purposes Accept Deny Preferences Save preferences Preferences Cookie Policy Privacy Statement {title} Manage Cookie Consent Manage Cookie Consent " -554,http://www.longbeach.gov/press-releases/jason-campbell-appointed-police-administration-bureau-chief/,Media Bulletins,Agency-Published Resources,Jason Campbell Appointed Police Administration Bureau Chief,"",200,City of Long Beach,"[""PRESS RELEASE""]",[],[],[],[],[],"A- A A+ PRESS RELEASE City of Long Beach Public Information Office 411 W. Ocean Blvd, Long Beach, CA 90802 6/14/2016 FOR IMMEDIATE RELEASE Press Release # CM: 061416 Subject: Jason Campbell Appointed Police Administration Bureau Chief Contact: Robert Luna Chief of Police 562.570.7301 Robert.Luna@longbeach.gov Long Beach City Manager Patrick H. West and Police Chief Robert Luna today announced the appointment of Jason S. Campbell as Administration Bureau Chief of the Long Beach Police Department . He fills the vacancy created by the retirement of Braden Phillips. “I welcome Administration Bureau Chief Jason Campbell to the Police Department,” said Chief Robert Luna. “His extensive education, work history and legal background will be a great addition to the executive team.” Bureau Chief Campbell most recently served as Executive Officer of the California Board of Podiatric Medicine. Previously he was employed by the Los Angeles County Metropolitan Transportation Authority (MTA), where he served as a Senior Ethics Officer, Acting Principal Hearing Officer and Customer Communication Manager. Prior to the MTA, he was a compliance officer for the City of Los Angeles Office of Finance, and also an attorney in private practice. “I’m grateful for the opportunity to be a part of Long Beach Police Department and advancing our mission of Public Safety Through Partnerships ,” said Bureau Chief Campbell. “To that end, I look forward to building relationships with community members throughout Long Beach.” The Administration Bureau is responsible for managing the Police Department's fleet; records; information technology; personnel and payroll services; Business Desk operations; Live Scan services; Media Relations Detail; and volunteer opportunities. For more news, pictures, videos and announcements of what’s happening in Long Beach, follow us on Facebook , Twitter , Instagram and YouTube . " -555,http://www.tampa.gov/news/tampa-police-work-identify-battery-suspect-64991,Media Bulletins,Agency-Published Resources,Tampa Police Work to Identify Battery Suspect | City of Tampa,                ,200,City of Tampa,"[""Tampa Police Work to Identify Battery Suspect""]","[""Information Resources"", ""Latest News"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[],"" -556,https://cityofgulfbreeze.us/departments/police/faqs-2/,Resources,Agency-Published Resources,FAQS - City of Gulf Breeze,Question: How do I obtain a Crash report? Answer: Obtain Crash Report Online It’s now possible to obtain a copy of a crash report online. The following information is required to request the report: Date of collision Driver’s last name Crash report number Name of agency investigating the crash Simply visit FLHSMV's website and enter the,200,Home - City of Gulf Breeze,"[""FAQS""]","[""What can we help you find?"", ""Mobile Menu"", ""Before Header"", ""Header Right"", ""Primary Sidebar"", ""Footer""]","[""Departments"", ""No Active Advisories"", ""City Projects"", ""Get Text Updates"", ""City of Gulf Breeze"", ""Most Requested"", ""County Agencies"", ""State Sites""]","[""Question: How do I obtain a Crash report?"", ""Answer:"", ""Question: How do I obtain a police report?"", ""Question: How can I get fingerprinted or obtain a V.I.N. verification?"", ""Question: I have had several phone calls from people representing themselves as police officers and asking for donations. Are these police officers and what is the money used for?"", ""Question: I received a call from a company claiming I had won a trip, but in order to claim my prize, I have to give them my bank account number, social security number, credit card number or some money. What should I do? Is this a scam?"", ""Question: Can you tell me if there’s a warrant out for my arrest?"", ""Question: Can you tell me if someone is in jail?"", ""Question: What can I do about speeding in my neighborhood?"", ""Question: How can I become a police officer?"", ""Question: I received a traffic citation I do not agree with. What can I do about it?"", ""Question: I saw a strange car in my neighborhood, but am unsure about calling the police when something like that happens."", ""Question: How do I recover my personal property from the Police Department?"", ""Question: I am going out of town; Can I have an officer check on my house while I am gone?"", ""Question: What does the Police Department do with found property that is turned in by the public or submitted by officers?"", ""South Santa Rosa Beneficial Reclaim Strategic Plan (BSRP) – Phase III"", ""Highpoint Water Main Replacement"", ""Eufaula Outfall Treatment Unit – RESTORE"", ""City Hall""]",[],[],"What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos " -557,https://spdblotter.seattle.gov/2014/03/08/citizens-respond-to-a-woman-in-distress-and-hold-down-robbery-suspect-until-police-arrive/,Media Bulletins,Agency-Published Resources,Citizens Respond To A Woman In Distress And Hold Down Robbery Suspect Until Police Arrive - SPD Blotter,"",200,403 Forbidden,"[""Citizens Respond To A Woman In Distress And Hold Down Robbery Suspect Until Police Arrive""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -558,http://www.longbeach.gov/police/press-releases/traffic-fatality-anaheim-st-and-long-beach-blv/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY ANAHEIM ST AND LONG BEACH BLV,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/1/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: TRAFFIC FATALITY ANAHEIM ST AND LONG BEACH BLV Contact: Media Relations Detail (562) 570-5273 On July 1, 2017 at 4:35 A.M. Officers from the Long Beach Police Department responded to Anaheim Street and Long Beach Boulevard on a report of a traffic collision. Upon Officers arrival they found that this collision involved two vehicles that had collided in the intersection. One vehicle a Silver 2011 Nissan Sentra was stopped in the intersection of Anaheim Street and Long Beach Boulevard. The other involved vehicle a 1999 Lexus RX300 was stopped on its right side on the northeast corner of the intersection. A 26-year-old female resident of Los Angeles was driving the 1999 Lexus. There were three passengers in the vehicle at the time of this collision all of which were transported to local hospitals for treatment. While at the Hospital the rear passenger of the vehicle a 21-year-old male resident of Los Angeles succumbed to his injuries and was pronounced dead. His name is being withheld until next of kin can be notified. The driver of the 2011 Nissan was found to be a 36-year-old male resident of Long Beach. There was also a passenger in the vehicle and both driver and passenger were transported to a local hospital for injuries they suffered as a result of this collision. Both are currently in stable condition. This collision is still under investigation, but it is believed that the 2011 Nissan was traveling eastbound Anaheim Street and the 1999 Lexus was traveling northbound Long Beach Boulevard. What is unknown is the phasing of the traffic control signal at the time of the collision. Anyone who may have witnessed this collision is asked to contact Collision Investigation Detective David Lauro at (562) 570-7355. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 TIPS” app to your smart phone (available at the Apple App store and Google Play), or visiting http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -559,http://www.longbeach.gov/police/press-releases/sexual-assault-suspect-arrested--additional-victims-sought/,Media Bulletins,Agency-Published Resources,SEXUAL ASSAULT SUSPECT ARRESTED; ADDITIONAL VICTIMS SOUGHT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/8/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: SEXUAL ASSAULT SUSPECT ARRESTED; ADDITIONAL VICTIMS SOUGHT Contact: Media Relations Detail (562) 570-5273 Long Beach and Signal Hill Police arrested a male suspect in connection with two sexual assault cases and it is believed that additional victims may exist. On June 29, 2014, around 11:30 p.m., Long Beach Police were dispatched to an alley in the area of Del Amo and Long Beach Boulevards and found a 31-year-old victim who had been beaten and sexually assaulted. It appeared the suspect followed the victim from a nearby bus depot prior to the assault. Long Beach Fire Department transported the victim to a local hospital. During their investigation, detectives obtained a photo of a possible suspect and learned Signal Hill Police Department was investigating a sexual assault incident with similar suspect description. In both cases, investigators believed the suspect used a handgun to assault the victims. Long Beach Police detectives and North Division Patrol officers worked closely to identify the suspect. Long Beach Sex Crimes Detail and Vice Detail detectives with Signal Hill Police detectives served a search warrant on July 3, 2014, and arrested 20-year-old Raymond Demetrius Howard of Long Beach at his residence. On July 8, 2014, Long Beach and Signal Hill Police detectives presented their cases to the Los Angeles District Attorney's office for filing consideration. The District Attorney’s Office filed charges of assault with a deadly weapon, mayhem, attempted human trafficking, robbery, criminal threats, rape, and other sexual assault related charges. Howard is currently being held on $5,650,000 bail. Investigators believe there may be additional victims who have never contacted police. If you have been a victim of an unreported crime or have any information regarding the incident, please contact Long Beach Police Sex Crimes Detective Luis Galvan at (562) 570-6407. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -560,https://delcopa.gov/publicrelations/releases/2019/pdf/nationalcrimevictimsrightsweekeventflyer2019.pdf,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -561,https://www.rolesvillenc.gov/police/frequently-asked-questions,Contact Info & Agency Meta,Info About Agencies,"Frequently Asked Questions | Town of Rolesville, NC","",200,"Town of Rolesville, NC","[""Frequently Asked Questions""]","[""Support Menu"", ""Social Media"", ""Main navigation"", ""Social Media"", ""Footer""]","[""NEEDING ASSISTANCE"", ""TRAFFIC ACCIDENTS"", ""FIREARMS"", ""FINGERPRINTING"", ""RESTRAINING ORDERS"", ""ANIMAL COMPLAINTS"", ""TRAFFIC TICKETS"", ""CAR SEATS"", ""COMPLIMENTS & COMPLAINTS"", ""CIVIL CITATIONS""]","[""When do I call 911?"", ""Should I call the police if I see something suspicious or unusual?"", ""What do I do if I am involved in a traffic crash?"", ""I was involved in a traffic crash.  How can I get a copy of the report?"", ""How do I obtain a firearm purchase permit or concealed carry permit?"", ""I need to be fingerprinted for a job. Can I visit the police station to have this done?"", ""How do I file a restraining order or domestic violence protection order against someone?"", ""Does the Rolesville Police Department handle animal complaints?"", ""I received a traffic ticket, but I forgot my court date. How can I found out when I’m supposed to go to court?"", ""I received a warning ticket for a traffic violation. How do I handle this?"", ""How can I found out if my child is still required to ride in the car with a booster seat?"", ""How can I go about complimenting an officer or filing a complaint?"", ""I received a civil citation from a Rolesville officer, how do I make an appeal?""]","[""Connect with us""]",[],"tab start Menu Departments Open submenu Your Government Open submenu Residents & Visitors Open submenu Business Open submenu Close submenu Departments Communications Economic Development Finance Open submenu Fire Human Resources Open submenu Parks & Recreation Open submenu Planning Open submenu Police Open submenu Public Works Open submenu Town Clerk Open submenu Town Management Close submenu Finance Bid Opportunities Doing Business with the Town Financial Documents Solid Waste Billing Close submenu Human Resources Benefits Employment Opportunities Frequently Asked Questions Close submenu Parks & Recreation Adopted Plans Athletics Open submenu Cultural Programs Open submenu Forms and Permits Open submenu Parks and Facilities Open submenu Program Scholarships Special Events Open submenu Sponsors Staff Directory Volunteers Wake County Senior Games Close submenu Athletics Adult Softball Equipment Swap Outdoor 3 on 3 Basketball Youth Baseball & Softball Youth Basketball Youth Flag Football Youth Soccer Close submenu Cultural Programs Visual Arts Performing Arts S.T.E.M./S.T.E.A.M. Fitness Senior Nature/Outdoors Day Camps Trips Family Activities Close submenu Forms and Permits Commercial Use Of Park Property Photography Permit Special Event Permits Close submenu Parks and Facilities Main Street Park Mill Bridge Nature Park Redford Place Park Community Center Greenways Future Facilities Town of Rolesville Park Rules Close submenu Special Events 4th of July Arbor Day Blood Drive Egg Rush Fall FunFest Holiday Tree Lighting Juneteenth Celebration Litter Sweep Memorial Day Movies at the Middle Music at Mill Bridge Shred Event Trail Art Veterans Day Community Outreach Close submenu Planning * Submittal Process * Frequently Asked Questions Helpful Links Land Development Ordinance Technical Review Commitee Forms and Applications Development Projects Land Use and Zoning What are ""Development Applications"" ? Adopted Policy Plans What's New? Plans in Progress Helpful Links Signs Permits Public Hearings Utility Permits Fees - Development Applications Traffic Impact Analysis Board of Adjustment Pre-Construction Meetings Planning Board Close submenu Police Community Outreach Community Resources House Check Requests Police Reports Recruitment Police Department Assessment Close submenu Public Works Solid Waste Open submenu Stormwater Open submenu Street Maintenance Close submenu Solid Waste Garbage and Recycling Loose Leaves Other Waste Yard Waste Close submenu Stormwater Stormwater Mapping Project Close submenu Town Clerk Public Records Request Public/Legislative Hearings Close submenu Your Government Agendas & Minutes Boards & Commissions Open submenu Capital Projects Open submenu Locations & Hours Meetings Broadcast Strategic Plan Code of Ordinances Close submenu Boards & Commissions Mayor's Message Board of Adjustment Parks & Recreation Advisory Board Planning Board Close submenu Capital Projects Town Campus Plans Close submenu Residents & Visitors Calendar Community Resources Open submenu New to Rolesville News Town Events Close submenu Community Resources Community Group Funding Food Security Public Transportation Things to Do Veterans Resources Open submenu Close submenu Veterans Resources Military Banners May 2023 Close submenu Business Economic Development Open submenu Development Services Main Street Vision Available Buildings & Sites Bid Opportunities Chamber of Commerce Close submenu Economic Development Small Business Resources Why Rolesville? tab end " -562,https://ethics.ny.gov/news/jcope-settles-lobbyist-alleged-lobbying-law-gift-violation,Media Bulletins,Agency-Published Resources,Attention Required! | Cloudflare,"",200,Home Page | New York State Commission on Ethics and Lobbying in Government,"[""Sorry, you have been blocked""]","[""You are unable to access ny.gov"", ""Why have I been blocked?"", ""What can I do to resolve this?""]",[],[],[],[],"Please enable cookies. Sorry, you have been blocked You are unable to access ny.gov Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. What can I do to resolve this? You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page. Cloudflare Ray ID: 86a147088fad3b9a • Your IP: Click to reveal 209.6.137.20 • Performance & security by Cloudflare Please enable cookies. Sorry, you have been blocked You are unable to access ny.gov Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. What can I do to resolve this? You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page. Cloudflare Ray ID: 86a147088fad3b9a • Your IP: Click to reveal 209.6.137.20 • Performance & security by Cloudflare Sorry, you have been blocked You are unable to access ny.gov Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. What can I do to resolve this? You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page. Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. What can I do to resolve this? You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page. Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. " -563,https://spdblotter.seattle.gov/2017/06/05/police-conducting-death-investigation-at-sr-509-encampment/,Media Bulletins,Agency-Published Resources,(UPDATE) Two Men Arrested Following Death Investigation at SR-509 Encampment - SPD Blotter,"",200,403 Forbidden,"[""(UPDATE) Two Men Arrested Following Death Investigation at SR-509 Encampment""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -564,https://alpha.austin.gov/es/police-oversight/2020-06-4-8/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -565,https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-22/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -566,https://delcopa.gov/publicrelations/releases/2020/votingdemo_canceled.html,Media Bulletins,Agency-Published Resources,"Delaware County Cancels Voting Machine Demonstrations - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Cancels Voting Machine Demonstrations""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Demonstrations cancelled to adhere to social distancing guidance to prevent the spread of COVID-19""]",[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County Cancels Voting Machine Demonstrations Home / Departments / Public Relations Releases / Delaware County Cancels Voting Machine Demonstrations Demonstrations cancelled to adhere to social distancing guidance to prevent the spread of COVID-19 Public health officials have issued guidance for residents to avoid large gatherings and exercise social distancing as a preventive measure to reduce the spread of 2019 Novel Coronavirus (COVID-19.) In an effort to eliminate large gatherings and allow for social distancing, the County is cancelling the voting machine demonstrations that had been set up across the County in March and April. Residents can visit the County’s website to watch a tutorial on the new machines: www.delcopa.gov/electionsbureau/index.html As we move towards social distancing and announce cancellations and possible closures, Delaware County will be working to offer services and communications to residents by phone and online. The County has created a website dedicated to information on the Coronavirus, including prevention, resources and a FAQ section with link to the PA Health Department and CDC. The website is: www.delcopa.gov/ich/resources/coronavirus.html Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County Cancels Voting Machine Demonstrations Home / Departments / Public Relations Releases / Delaware County Cancels Voting Machine Demonstrations Delaware County Cancels Voting Machine Demonstrations Home / Departments / Public Relations Releases / Delaware County Cancels Voting Machine Demonstrations Delaware County Cancels Voting Machine Demonstrations Home / Departments / Public Relations Releases / Delaware County Cancels Voting Machine Demonstrations " -567,https://delcopa.gov/publicrelations/releases/2018/jurorphonesscam.pdf,Media Bulletins,Agency-Published Resources,"","",200,"","","","","","","","" -568,https://www.waynesvillenc.gov/departments/police/about-us,Contact Info & Agency Meta,Info About Agencies,"About Us | The Town of Waynesville, NC",Mission Statement  “Our mission is to provide a safe environment for all citizens through the collective contributions of the community. Pride and integrity reflect our dedication to community values”. Statement of Values The Waynesville Police Department holds forth professional integrity as our most fundamental value. Professional integrity includes:,200,"Home Page | The Town of Waynesville, NC","[""About Us""]","[""Secondary navigation"", ""Main navigation"", ""Breadcrumb"", ""Waynesville Police""]","[""Mission Statement"", ""Statement of Values"", """", ""Three divisions"", ""Communications""]","[""Personal Integrity"", ""Professionalism"", ""Respect"", ""Fairness"", ""Loyalty"", ""Contact Information"", ""Stay Connected""]",[],[],"" -569,https://beaumonttexas.gov/beaumont-police-investigating-fatality-accident-2400-block-of-s-mlk/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -570,https://www.knoxvilletn.gov/government/city_departments_offices/police_department/management_services_bureau/recruitment_job_opportunities/basic_info_for_becoming_a_police_cadet,Training & Hiring Info,Info About Officers,Become a Cadet - Join Knoxville Police Department,"",200,Just a moment...,"[""Become A Cadet""]","[""Feel drawn to a career as a police officer but not yet 21?""]","[""Cadet Benefits and Compensations"", ""DO I QUALIFY?""]",[],[],"[""Health insurance with prescription, dental, and vision"", ""Health insurance with prescription, dental, and vision"", ""Long-term disability insurance"", ""Long-term disability insurance"", ""Life insurance and longevity pay"", ""Life insurance and longevity pay"", ""Up to $3,000 per year in tuition reimbursement"", ""Up to $3,000 per year in tuition reimbursement"", ""457B retirement plan (deferred compensation)"", ""457B retirement plan (deferred compensation)"", ""YMCA membership discount"", ""YMCA membership discount"", ""Health insurance with prescription, dental, and vision"", ""Health insurance with prescription, dental, and vision"", ""Our Ideal Candidate""]","JOIN KNOXPD No Better Place To Live No Better Place To Serve JOIN THE TEAM Become an Officer Become a Cadet Become an Explorer Civilian Positions Lateral Transfer APPLY NOW No Better Place To Live No Better Place To Serve JOIN THE TEAM Become an Officer Become a Cadet Become an Explorer Civilian Positions Lateral Transfer APPLY NOW Become A Cadet A GATEWAY TO YOUR CAREER Feel drawn to a career as a police officer but not yet 21? The Police Cadet Program is a fantastic alternative. Open to those 18 and older, Cadets handle non-enforcement activities while receiving law enforcement training. After completing the Cadet training, you’ll be put on assignments ranging from bicycle patrols, traffic control at special events (like UT games!), parking enforcement and sobriety checkpoints. Cadets also take part in on-duty physical fitness training. Cadet Benefits and Compensations Health insurance with prescription, dental, and vision Civilian Health insurance with prescription, dental, and vision Civilian Long-term disability insurance Civilian Long-term disability insurance Civilian Life insurance and longevity pay Civilian Life insurance and longevity pay Civilian Up to $3,000 per year in tuition reimbursement Civilian Up to $3,000 per year in tuition reimbursement Civilian 457B retirement plan (deferred compensation) Civilian 457B retirement plan (deferred compensation) Civilian YMCA membership discount Civilian YMCA membership discount Civilian Health insurance with prescription, dental, and vision Cadet Health insurance with prescription, dental, and vision Cadet DO I QUALIFY? Our Ideal Candidate Is 18 years old and not have reached 21st birthday upon entry into the Cadet program. Applicant must be a U.S. Citizen or a Permanent Legal Resident of the U.S. who applies for or obtains U.S. Citizenship within six years of hiring. Has a valid driver’s license. Is a high school graduate or its equivalent. Has no felony convictions. Above all, shows integrity and good moral character. More questions ? Just ask a Recruiter Contact No Better Place to Live Contact Apply Now No Better Place to Serve Salary & Benefits FAQ An Equal Opportunity Employer/Drug Free Workplace " -571,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0103/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -572,http://www.ryepolice.us/pressrelease/pioneer-rd-closed-due-to-crash,Not Criminal Justice Related,Not Criminal Justice Related,Rye Police Department Pioneer Rd Closed Due to Crash - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Pioneer Rd Closed Due to Crash""]","[""Pioneer Rd Closed Due to Crash""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"­ Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Pioneer Rd Closed Due to Crash Home Press Releases Pioneer Rd Closed Due to Crash Pioneer Rd Closed Due to Crash May 25, 2015 In Press Releases Pioneer Rd (Rt. 1A) is closed between Bracket Rd and Sagamore Rd due to a motor vehicle crash with entrapment. The vehicle struck and snapped a utility pole. Please seek an alternate route. Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search " -573,http://www.lafayettepolice.us/faq.aspx?qid=183,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • What locations need a Class K extinguisher?,"",200,"Police Department | Lafayette, IN - Official Website",[],"[""▼ Fire Extinguishers""]","[""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -574,https://riag.ri.gov/press-releases/state-federal-and-law-enforcement-leaders-announce-16-million-grants-police,Media Bulletins,Agency-Published Resources,"State, federal, and law enforcement leaders announce $16 million in grants for police departments statewide for body-worn cameras | Rhode Island Attorney General's Office","",200,Welcome | Rhode Island Attorney General's Office,"[""State, federal, and law enforcement leaders announce $16 million in grants for police departments statewide for body-worn cameras""]",[],[],[],[],[],"" -575,https://www.stmatthewsky.gov/police/srt-vehicle/,Poor Data Source,Poor Data Source,SRT Vehicle - City of St Matthews,"",200,403 Forbidden,"[""SRT Vehicle""]",[],[],[],[],[],"Facebook Search Menu Home Community About St. Matthews Area Organizations Churches History Lodging Points of Interest Schools Shopping Farmers Markets Library Friends of the Library Citizens Group Louisville Metro Free Public Library Main St. Matthews Eline Library Branch Recreation & Parks Amazing Microscopic Park Photos Arthur K. Draut Park Brown Park Community Park Holzheimer Park Pavilions & Ball Fields St. Matthews Baseball Warwick Park Outstanding Neighbor Seasonal City Events Halloween In Brown Park Light Up St. Matthews Potato Festival Rentals / Reservations City Hall Meeting Rooms The Arterburn Event Venue Government Boards Ethics City Map Codes & Ordinances Communications Contact Us Newsletters Reach Alert Notification LENsAlert (Louisville Emergency Notification System) Departments Alcohol Beverage Control Arborist Business License / Tax City Clerk & Treasurer Code Enforcement IT Communications Occupational Tax Planning & Design Police Property Tax / Real Estate Public Works Signs Solicitation Finance Ad Valorem Audit Budget Expenditures Local / State / Federal Offices & Organization Elected Representatives Jefferson County League of Cities Kentucky League of Cities Voter Registration Mayor & Council About the Mayor Agenda, Minutes City Council Members Standing Committees Ethics Complaint Form Open Records Request Staff Directory Services Police About SMPD Provided Services Events Transparency How Do I… Public Works Electronic Speed Signs Graffiti Green Up / Vehicle Pull Off Leaf Collection Sidewalks Snow Treatment Speed Humps Street Damage / Potholes Tree Planting Resources Ambulance (EMS) Animal Control Driver’s Liscenses Fire Protection District First Hour Grief Response Hazardous Waste Disposal Health Department – Louisville Hospitals Prescription Drug Disposal Public Transportation Bus Routes (TARC) St. Matthews Area Ministries (STMAM) Seniors & Disabled Citizens Utilities Drainage – Surface Waters Electric Company (LG&E) Street Lights Metropolitan Sewer District (MSD) Water Service (Louisville Water Co.) Waste Disposal Go Green Junk Disposal Recycle Program Sanitation Yard Waste – Storm Debris Business Forms Alcohol Application for Rentals Alcohol Beverage Control Basic License Alcohol Beverage Temporary License Arterburn Contract Business License Application Employers Annual Reconciliation Employers Quarterly Report Ethics Complaint Form Facility Alcohol for Rentals Golf Cart / ATV Application Grant Application Form Letter of Compliance Occupational Tax Application Occupational Tax Refund Opens Record Request Form Portable Storage Container Request a Tree Right-of-Way Permit Application Sign Permit Application Solicitation Certificate Application Special Events Application Street Party Petition Tent Permit Application Vehicle Pull Off (VPO) Application Permits Building Golf Cart / ATV Portable Storage Sign Special Events Street Party Tents Walk/Run Events Rentals / Reservations Ball Field – Warwick Park City Hall Meeting Rooms Park Pavilions The Arterburn Event Venue Chamber of St. Matthews Contact Us Select Page SRT Vehicle Site Map Contact Us Website Designed and Optimized by: 301 Interactive Marketing Facebook Facebook Search Facebook Search Facebook Search " -576,https://www.ci.corcoran.mn.us/public_services/police/training_and_safety/emergency_preparedness_guide,Not Criminal Justice Related,Not Criminal Justice Related,Emergency Preparedness Guide - City of Corcoran,"",200,Just a moment...,"[""Emergency Preparedness Guide""]",[],[],[],[],[],"" -577,http://www.longbeach.gov/police/press-releases/traffic-fatality-artesia-and-myrtle1/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY ARTESIA AND MYRTLE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/2/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: TRAFFIC FATALITY ARTESIA AND MYRTLE Contact: Media Relations Detail (562) 570-5273 On Monday, May 29, 2017 at approximately 3:51p.m., officers from the Long Beach Police Department were dispatched to Artesia Boulevard and Myrtle Avenue regarding an injury traffic collision between two vehicles. When Officers arrived on scene, they discovered the unconscious 16-year-old female passenger trapped inside a 2012 Nissan Altima. Long Beach Fire Department paramedics responded and transported, the female along with two adults and two other juveniles who were also in the Altima to local hospitals for treatment. The preliminary investigation revealed that a 33-year-old male resident of Long Beach, was driving his 2013 Chevrolet Camaro west on Artesia Boulevard and in the process of turning south onto Myrtle Avenue. At the same time, the Altima being driven by 22-year-old female resident of Victorville, was traveling east on Artesia Boulevard. As the Chevrolet turned south, the two vehicles struck each other causing the Altima to ricochet south striking the metal traffic control light pole. It was determined that the driver of the Chevrolet was wearing his seatbelt and uninjured. However, all five occupants in the Altima did not appear to have their seatbelts fastened causing traumatic injuries to all occupants. The other occupants of the Altima included three males ages 19, 16 and 14. The driver of the Chevrolet had a suspended driver’s license and valid proof of insurance. The driver of the Altima had a valid driver’s license and proof of insurance. Alcohol did not appear to be a factor in the collision. On Friday, June 2, 2017, the Police Department was informed that the 16-year-old female passenger of the Altima passed away from a traumatic head injury caused in the collision. The deceased, the driver and the and 14 year-old male were siblings, and the other two occupants were friends. Anyone who may have information regarding this incident is asked to call Long Beach Police Department Collision Investigation Detail Detective Steve Fox at (562) 570-7355. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -578,http://www.ryepolice.us/logs/police-logs-for-71316-71916,Daily Activity Logs,Info About Officers,Rye Police Department Police Logs for 7/13/16-7/19/16 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs for 7/13/16-7/19/16""]","[""Police Logs for 7/13/16-7/19/16""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -579,http://www.longbeach.gov/police/press-releases/dui-checkpoint-proves-effective-4-/,Media Bulletins,Agency-Published Resources,DUI CHECKPOINT PROVES EFFECTIVE(4),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 8/13/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: DUI CHECKPOINT PROVES EFFECTIVE Contact: Media Relations Detail (562) 570-5273 On Saturday, August 9, 2014, the Long Beach Police Department’s Traffic Section conducted a Driving Under the Influence/Driver License Checkpoint on 7th Street and Federation Drive, from 7 p.m. until 3 a.m. During the eight-hour operation, which was aided by Long Beach Police Explorers, Long Beach Search and Rescue and officers from the California Department of Alcoholic Beverage Control, 2,790 vehicles passed through the checkpoint with 542 drivers being screened, resulting in the following statistics: Four (4) Standardized Field Sobriety Tests conducted Two (2) drivers arrested for DUI One (1) driver arrested for DUI drug Three (3) drivers cited for unlicensed driving One (1) driver cited for suspended license Eighteen (18) drivers cited for unsafe driving DUI checkpoints are a vital component in the fight against both impaired and unlicensed driving. Nationally, impaired driving caused by alcohol and/or drugs causes one death every 33 minutes. The average American has a 30% chance of being killed or injured by a driver under the influence. Sobriety checkpoints have been proven to reduce these types of driving-related collisions by removing such drivers from our streets. Funding for this program was provided by a grant from the California Office of Traffic Safety, through the National Highway Safety Administration. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -580,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/111522blotter.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -581,https://www.huntsvilleal.gov/videos/huntsville-police-departments-captain-mccarver-lets-grow-together/,Poor Data Source,Poor Data Source,Huntsville Police Department's Captain McCarver: Let's Grow Together - City of Huntsville,"",200,403 Forbidden,"[""Huntsville Police Department’s Captain McCarver: Let’s Grow Together""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],[],[],[],"Main Menu Main Menu Residents Back Residents Animal Services Neighborhoods Public Safety Volunteer Cemeteries Pay a Ticket Streets & Transportation Water & Sewer Garbage & Recycling Parks & Recreation Resident Toolkit Business Back Business About Huntsville Big Picture GIS Maps & Data Employment Bid A Project Codes & Ordinances Economic Development File A Claim E-Bids Pay Taxes Licensing & Permits Development Back Development Bid A Project Economic Development MPO Streets & Roadwork Building & Construction GIS Maps Planning Water & Sewer Big Picture Master Plan Historic Preservation ePlans Submittal Environment Back Environment Air Quality Garbage & Recycling Noise Sustainability Find A Park Nature Preserves Recreation Water Trails & Greenways Pets Lost & Found Green Team Government Back Government Boards & Commissions City Council Finances & Budget Media Center City Calendar Departments Mayor's Office Municipal Court Vote Find A Job Codes & Ordinances Services Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Toggle Menu City of Huntsville Search Search for: City Video Closed captioning provided for all videos. Video Category Browse By Category… City Council Meetings Inside Huntsville with Brenda Martin Impact with Kenny Anderson State of the City Planning Commission Meetings City Videos Historic Preservation Commission Meetings COVID-19 Updates Poll Workers Video Department Browse By Department… Animal Services Huntsville Police Department Parks & Recreation Community Development Big Picture Planning Huntsville Fire & Rescue Public Works Traffic Engineering Public Transit Parking Media Center City Video Huntsville Police Department’s Captain McCarver: Let’s Grow Together Share & Print Twitter Facebook Email Print Categories: City Videos Top Requests Pay A Ticket Get A Permit Business License Municipal Court Police Fire & Rescue Public Transit – Orbit Huntsville Connect City Jobs HSV TV City News Mar 22 Conveniently distracted: Hands-free devices often perilous for drivers Mar 21 Kitten Season is coming – beat the heat by spaying and neutering your cat Mar 21 Arts Huntsville Announces Panoply Arts Festival 2024 Highlights Mar 19 All systems go: Huntsville’s first major music festival to launch in September Mar 19 Why Where Matters: Huntsville to host GeoResilience Summit on April 3 Contact Us (256) 427-5000 Huntsville City Hall 308 Fountain Circle Huntsville, Alabama 35801 Facebook Twitter Instagram Social Directory © 2022 | City of Huntsville, Alabama ADA Privacy Policy Intranet Webmail COH ESS Website Feedback Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Toggle Menu Search Search Search for: Search for: Search for: Search for: Search for: Search for: City Video City Video City Video City Video City Video " -582,http://www.ryepolice.us/pressrelease/positive-covid-19-case-at-rye-recycling-center/attachment/ryerecyclecase-2020-dhhs-edits-covid-09282020,Not Criminal Justice Related,Not Criminal Justice Related,Rye Police Department RyeRecycleCase-2020-DHHS edits Covid 09282020 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""RyeRecycleCase-2020-DHHS edits Covid 09282020""]","[""RyeRecycleCase-2020-DHHS edits Covid 09282020""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"­ Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search RyeRecycleCase-2020-DHHS edits Covid 09282020 Home RyeRecycleCase-2020-DHHS edits Covid 09282020 RyeRecycleCase-2020-DHHS edits Covid 09282020 September 28, 2020 Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search " -583,https://police.greenvillesc.gov/313/trails-bikes,Not Criminal Justice Related,Not Criminal Justice Related,"Trails & Bikes | Greenville, SC - Official Website","Learn all about the Greenways Master Plan, and find your way around Greenville using our systems of trails and greenways.",200,"Police Department | Greenville, SC - Official Website","[""Trails & Bikes""]","[""Trails & Greenways: A Top Priority"", ""Augusta Street Bike Boulevard""]","[""Loading""]",[],[],[],"Skip to Main Content Falls Park Unity Park Parks & Trails Recreation Rentals Get Involved Search Home Departments Parks, Recreation & Tourism Parks & Trails Trails & Bikes Trails & Bikes Trails & Greenways: A Top Priority The development of a Trails and Greenways Master Plan (PDF) was a ""Top Priority"" project as identified by Greenville City Council's 2006 Management Agenda. Over the course of the next year, two public meetings were held, more than 450 public comments were received via an on-line survey and the master plan was presented to council in September, 2007. On January 28, 2008 City Council adopted the Trails and Greenway's Master Plan. By doing so they formally recognized the importance of connecting residents and visitors alike to popular destinations throughout the City of Greenville. The Master Plan, amongst other things, encourages physical activity, promotes safe and sustainable transportation, stimulates economic growth and helps to protect environmental quality of open spaces and creek and river corridors. The City of Greenville is actively working to implement the Trails and Greenways Master Plan (PDF) and promote the use of trails throughout the City. Please take time to browse this site to learn more about our existing Trails System and upcoming projects. Augusta Street Bike Boulevard The Augusta Street Bicycle Boulevard is designed to get bicyclists off of Augusta Street while simultaneously providing orientation and wayfinding throughout the adjacent neighborhoods. Signage assists bicyclists in routing to neighborhood parks, schools, the Kroc Center, and the Swamp Rabbit Trail. Swamp Rabbit Trail Green Line Extension Laurens Road Trail Spurs Swamp Rabbit Trail Interactive Map Trails Rules & Etiquette Park Trails Master Plans Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate " -584,http://www.lafayettepolice.us/851/fire-resistance-rated-construction,Not Criminal Justice Related,Not Criminal Justice Related,"Fire Resistance Rated Construction | Lafayette, IN - Official Website",Fire-Resistance-Rated Construction is building construction in which the structural members are used for the separation of adjacent spaces to safeguard against the spread of fire and smoke within a building.,200,"Police Department | Lafayette, IN - Official Website","[""Fire Resistance Rated Construction""]",[],"[""Contact Us"", ""Brian Alkire"", ""Fire Prevention Bureau"", ""Hours"", ""FAQs"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Operations Prevention Recruitment How Do I... Home Government Departments A - F Fire Department Prevention Contractors & Designers Resources & Inspections Fire Resistance Rated Construction Fire Resistance Rated Construction Penetrations & Openings Doors, windows and other penetrations of the rated assembly have to be addressed. Fire rated doors, glass and penetration fire-stop systems and products must be installed to maintain the tested rating. Also, reference Indiana Building Code Section 712: Penetrations, and Section 715: Opening Protectives. Joints & Seams Joints installed in or between fire-resistance-rated walls, floor or floor/ceiling assemblies and roofs or roof/ceiling assemblies shall be protected by an approved fire-resistant joint system designed to resist the passage of fire for a time period not less than the required fire-resistance rating of the wall, floor or roof in or between which it is installed. Also, reference Indiana Building Code Section 713: Fire-Resistant Joint Systems. Inspection An inspector will need to inspect the wall or ceiling assembly prior to enclosing and after all building services have been installed such as HVAC ducts, electrical circuit wiring, plumbing, etc. Inspection Items Assembly (wall, floor/ceiling) been constructed in accordance with the tested design specification. See ASTM E 119 Assembly UL listing or design detail sheet on site for inspection Floor/ceiling sheathing - Type X gypsum or listed base layer/face layer sheathing Opening protection - Rated doors and frames, rated glass and glazing Penetrations filled or protected with fire-stopping system - UL listing or design sheet and product sample on site for inspection Proper fasteners - Nail / screw size and location Proper insulation - Fiberglass or mineral wool, mineral fiber Sheathing - Type X gypsum board - vertical joints over studs Wall (other than sheathing) Always consult with the Building or Fire Code Official if you have questions. Contact Us Brian Alkire Assistant Chief of Fire Prevention Email Fire Prevention Bureau 443 N. 4th Street Lafayette, IN -47901 Phone: 765-807-1600 Hours Monday - Friday 8 a.m. - 4:30 p.m. FAQs What is Fire-Resistance-Rated Construction? Why is Fire Resistance Rated Construction important? How is it constructed/rated? What's the difference between a fire wall and a fire barrier? View All FAQs /FAQ.aspx Directories & Additional Information Links & Resources Community Outreach Fire Stations Submit a Request History Photo Gallery Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -585,http://www.longbeach.gov/police/press-releases/arrests-made-in-murder-case/,Media Bulletins,Agency-Published Resources,ARRESTS MADE IN MURDER CASE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/8/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: ARRESTS MADE IN MURDER CASE Contact: Media Relations Detail (562) 570-5273 View original news release Long Beach Police arrested three adults and a juvenile in connection with a murder that occurred last month. On November 10, 2015, around 9:00 p.m., officers were dispatched to the area of 14th Street and Gundry Avenue regarding a shooting call, which resulted in the death of 26-year-old Jeffrey Keo of Long Beach. Several individuals, including one who was later identified as the suspect, were detained and transported to police headquarters to be interviewed. At the conclusion of the interviews, a 17-year-old male resident of Long Beach was booked for murder and a gang enhancement. On November 13, 2015, the Los Angeles County District Attorney’s Office filed charges against the 17-year-old. The defendant is being tried as an adult. In addition to the murder and gang enhancement charges, the defendant was charged with one count of robbery for an unrelated incident that occurred on November 8, 2015. On December 3, 2015, Long Beach Police arrested 18-year-old Angel Campo of Long Beach on an unrelated assault charge. The next day, he was additionally booked on an arrest warrant for the murder of Jeffrey Keo. Defendant Campo was arraigned on December 7, 2015. He is being held in Los Angeles County Jail on $2,000,000 bail. On December 5, 2015, Long Beach Police arrested 28-year-old Hector Montiel of Long Beach and booked him on an arrest warrant for the murder of Jeffrey Keo. Defendant Montiel was arraigned on December 7, 2015. He is being held in Los Angeles County Jail on $2,000,000 bail. On December 5, 2015, Long Beach Police arrested 19-year-old Esteban Panchi of Long Beach and booked him for murder. Defendant Panchi was arraigned today. He is being held in Long Beach City Jail on $2,000,000 bail. The investigation remains ongoing. Anyone with information regarding the murder is urged to contact Long Beach Police Homicide Detectives S. Lasch, T. Hubert, and M. Hubbard at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -586,https://cityoflakewood.us/police-homepage/lakewood-police-apply-for-a-job/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -587,http://lafayettepolice.us/3547/e-sports,Not Criminal Justice Related,Not Criminal Justice Related,"","",404,"","","","","","","","" -588,https://www.lynchburgvapolice.gov/news-updates/update-child-found-wandering-on-linkhorne-road-mother-located/,Media Bulletins,Agency-Published Resources,[UPDATE] Child Found Wandering on Linkhorne Road - Mother Located - Lynchburg Police Department,"",200,403 Forbidden,"[""[UPDATE] Child Found Wandering on Linkhorne Road – Mother Located""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[],"" -589,https://spdblotter.seattle.gov/2019/07/25/police-arrest-suspected-heroin-dealer-arrested-downtown/,Media Bulletins,Agency-Published Resources,Suspected Heroin Dealer Arrested Downtown - SPD Blotter,"",200,403 Forbidden,"[""Suspected Heroin Dealer Arrested Downtown""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -590,https://spdblotter.seattle.gov/2021/08/19/police-arrest-woman-for-violating-court-order-protecting-mayor-durkan/,Media Bulletins,Agency-Published Resources,Police Arrest Woman for Violating Court Order Protecting Mayor Durkan - SPD Blotter,"",200,403 Forbidden,"[""Police Arrest Woman for Violating Court Order Protecting Mayor Durkan""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -591,http://www.police.wallingfordct.gov/police-station-project/,Contact Info & Agency Meta,Info About Agencies,Police Station Project | Wallingford Police Department,Police Station Project,200,"Wallingford, CT Police Department","[""2022 Police Station Project"", ""New Police Headquarters Construction Photos"", ""New Police Headquarters Construction Photos"", ""New Police Headquarters Construction Photos"", ""Work Continues on Design of New Wallingford Police Station"", ""Wallingford Acquires Former 3M Building for New Police Station"", ""Wallingford Town Council Approves Purchase of Site for New Police Station""]","[""RSS Feed""]",[],[],[],[],"‹ Close Menu About Us Our Team Who We Serve Our History Police Station Project Divisions Records Division Traffic Division Investigative Services Division Professional Standards & Training Division Patrol Division Community Impact Unit Public Safety Communications Center Emergency Response Team Field Training & Evaluation Program How Do I? Pistol Permits Fingerprinting Accident Reports Case Reports Traffic Violations Pay a Parking Ticket Hire a Cop Alarm Registration Careers Current Employment Opportunities Forms & Resources Bingo, Bazaar & Raffle Documents Precious Metal Application Secondhand Application Pawnbroker Application Vending Application News & Events Road Closures & Detours Agency Events & Programs Press Releases Photo Gallery Video Gallery Wallingford PBA Contact 2022 Police Station Project 2022 Police Station Project New Police Headquarters Construction Photos 5/8/2023 View PDF New Police Headquarters Construction Photos 4/25/2023 View PDF New Police Headquarters Construction Photos 4/18/2023 View PDF Work Continues on Design of New Wallingford Police Station 1/25/2022 Wallingford Acquires Former 3M Building for New Police Station 7/13/2021 Wallingford Town Council Approves Purchase of Site for New Police Station 4/13/2021 RSS Feed Subscribe to this Page Our Team Who We Serve Our History Police Station Project New Police Headquarters Construction Photos 5/8/2023 View PDF New Police Headquarters Construction Photos 4/25/2023 View PDF New Police Headquarters Construction Photos 4/18/2023 View PDF Work Continues on Design of New Wallingford Police Station 1/25/2022 Wallingford Acquires Former 3M Building for New Police Station 7/13/2021 Wallingford Town Council Approves Purchase of Site for New Police Station 4/13/2021 RSS Feed Subscribe to this Page New Police Headquarters Construction Photos 5/8/2023 View PDF New Police Headquarters Construction Photos 4/25/2023 View PDF New Police Headquarters Construction Photos 4/18/2023 View PDF Work Continues on Design of New Wallingford Police Station 1/25/2022 Wallingford Acquires Former 3M Building for New Police Station 7/13/2021 Wallingford Town Council Approves Purchase of Site for New Police Station 4/13/2021 RSS Feed Subscribe to this Page New Police Headquarters Construction Photos 5/8/2023 View PDF New Police Headquarters Construction Photos 4/25/2023 View PDF New Police Headquarters Construction Photos 4/18/2023 View PDF Work Continues on Design of New Wallingford Police Station 1/25/2022 Wallingford Acquires Former 3M Building for New Police Station 7/13/2021 Wallingford Town Council Approves Purchase of Site for New Police Station 4/13/2021 Location: 135 North Main Street Wallingford, CT 06492 Tel: (203) 294-2800 Fax: (203) 294-2882 Administrative Office: Monday through Friday 8 am – 4 pm Site Map Privacy Policy Accessibility Statement Anonymous Tip Form Town of Wallingford Location: 135 North Main Street Wallingford, CT 06492 Tel: (203) 294-2800 Fax: (203) 294-2882 Administrative Office: Monday through Friday 8 am – 4 pm Site Map Privacy Policy Accessibility Statement Anonymous Tip Form Town of Wallingford Web Solutions © 2022 – 2024 Wallingford Police Department. All rights reserved. Web Solutions © 2022 – 2024 Wallingford Police Department. All rights reserved. " -592,https://www.floresvilletx.gov/departments/police/complaints-commendations/,Contact Info & Agency Meta,Info About Agencies,Complaints & Commendations - Police Department - City of Floresville,Our complaint system and disciplinary procedures subject Floresville police officers to corrective action and protect them from unwarranted criticism.,200,City of Floresville,"[""Complaints & Commendations""]","[""I’m looking for...""]","[""Internal Affairs"", ""Reporting Procedure"", ""Types of Complaints"", ""Complaint Investigation and Disposition Process"", ""Complaint Disposition"", ""Note"", ""Commendations"", ""Police Pages"", ""Government"", ""Departments"", ""Community"", ""Contact & Feedback""]",[],[],[],"Menu Home Government City Council FEDC Boards & Committees Agendas & Minutes Meeting Videos Notices Press Releases & RFQs Bid Notices Finance, Budget, Transparency City Documents Code of Ordinances Elections Employment Opportunities Forms & Applications City News Departments City Manager Assistant City Manager City Secretary Buildings & Permits Code Enforcement Community Development Cemetery Finance Fire & EMS Human Resources Municipal Court Police Public Works Utility Administration Water Wastewater Community About Floresville Calendar of Events Event Center Map Parks & Recreation Pool Photo Galleries Videos Resources & Links Contact & Feedback Citizen Complaints Open Records Requests Comments & Questions Contact Information I Want To… Pay Water/Garbage Bill See Event Calendar Find a Job Apply for a Permit Read Meeting Agendas Contact City Hall Visit Floresville Live in Floresville Do Business in Floresville Facebook Twitter Menu Home Government City Council FEDC Boards & Committees Agendas & Minutes Meeting Videos Notices Press Releases & RFQs Bid Notices Finance, Budget, Transparency City Documents Code of Ordinances Elections Employment Opportunities Forms & Applications City News Departments City Manager Assistant City Manager City Secretary Buildings & Permits Code Enforcement Community Development Cemetery Finance Fire & EMS Human Resources Municipal Court Police Public Works Utility Administration Water Wastewater Community About Floresville Calendar of Events Event Center Map Parks & Recreation Pool Photo Galleries Videos Resources & Links Contact & Feedback Citizen Complaints Open Records Requests Comments & Questions Contact Information I Want To… Pay Water/Garbage Bill See Event Calendar Find a Job Apply for a Permit Read Meeting Agendas Contact City Hall Visit Floresville Live in Floresville Do Business in Floresville Facebook Twitter Menu Home Government City Council FEDC Boards & Committees Agendas & Minutes Meeting Videos Notices Press Releases & RFQs Bid Notices Finance, Budget, Transparency City Documents Code of Ordinances Elections Employment Opportunities Forms & Applications City News Departments City Manager Assistant City Manager City Secretary Buildings & Permits Code Enforcement Community Development Cemetery Finance Fire & EMS Human Resources Municipal Court Police Public Works Utility Administration Water Wastewater Community About Floresville Calendar of Events Event Center Map Parks & Recreation Pool Photo Galleries Videos Resources & Links Contact & Feedback Citizen Complaints Open Records Requests Comments & Questions Contact Information I Want To… Pay Water/Garbage Bill See Event Calendar Find a Job Apply for a Permit Read Meeting Agendas Contact City Hall Visit Floresville Live in Floresville Do Business in Floresville Facebook Twitter " -593,https://delcopa.gov/ojs/efileforms/court admin forms for efile/writofexecutionnotice.pdf,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -594,http://www.longbeach.gov/police/press-releases/police-seek-public-s-help-with-identifying-financial-crimes-suspect/,Media Bulletins,Agency-Published Resources,Police Seek Public's Help with Identifying Financial Crimes Suspect,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/18/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: POLICE SEEK PUBLIC'S HELP WITH IDENTIFYING FINANCIAL CRIMES SUSPECT; PHOTOS PROVIDED Contact: Media Relations (562) 570-5273 On Tuesday, June 2, 2015, the suspect (depicted in the photographs provided) applied for an auto loan with a lending company located in central Long Beach. The suspect used an altered Department of Motor Vehicles Certificate of Title form, along with fraudulent documents including a driver’s license, utility bill, proof of insurance, and paystubs. He also used an unsuspecting victim’s name, date of birth and social security number. The suspect was able to obtain a $15,000 loan under these false pretenses. Once the loan was approved, the suspect went to a money transfer business in the City of Torrance and received the loan proceeds in cash. The individual in the photographs is suspected of committing multiple felony crimes including identity theft, forgery, perjury, conspiracy, grand theft and burglary. Anyone who recognizes this individual, or has information regarding this incident is urged to contact Long Beach Police Financial Crimes Detective Dominick Scaccia at (562) 570-7391. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -595,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2019_news_releases/coffee_with_a_cop,Media Bulletins,Agency-Published Resources,Coffee with a Cop - Village of Pleasant Prairie,"",200,Just a moment...,[],"[""Coffee with a Cop""]","[""Follow Us on Social Media""]",[],[],[],"" -596,https://police.greenvillesc.gov/599/paratransit-information,Not Criminal Justice Related,Not Criminal Justice Related,"Paratransit Information | Greenville, SC - Official Website","Greenville Area Paratransit (GAP) is an American with Disabilities Act paratransit service provided for individuals who, because of their disability, are unable to use Greenlink's fixed route bus service. Learn all about eligibility, service hours, and service area. From this page you can also schedule rides and file appeals.",200,"Police Department | Greenville, SC - Official Website","[""Paratransit Information""]",[],"[""Begin the process by downloading an application."", ""Loading""]","[""Download the GAP Rider's Handbook"", ""ADA Grievance Form""]",[],[],"Skip to Main Content About Bus Service Paratransit Service Trolley Service Initiatives Employment Search Home Departments Greenlink Transit Paratransit Service Paratransit Information Paratransit Information Greenville Area Paratransit (GAP) is an Americans with Disabilities Act paratransit service provided for individuals who, because of their disabilities, are unable to use Greenlink's fixed route bus and trolley service. This does not include disabilities that only make the use of accessible transit service difficult or inconvenient. GAP provides comparable service to the regular fixed route bus and trolley in terms of shared rides, origin-to-destination pickup, service area, and hours and days of service. Learn more about: GAP Eligibility Riding GAP Scheduling A Ride Hours and Service Area Responsibilities Of Riding GAP GAP Suspension Begin the process by downloading an application. GAP Eligibility Determination Application (PDF) GAP Información General y Formularios de Aplicación o Solicitud (PDF) GAP Eligibility Determination Application (Chinese) (PDF) Download the GAP Rider's Handbook GAP Handbook (PDF) ADA Grievance Form City of Greenville ADA Grievance Form (PDF) Eligibility Service Hours & Area Scheduling A Ride Riding GAP Responsibilities Suspension of Service Appeals Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate About Bus Service Paratransit Service Trolley Service Initiatives Employment Search Home Departments Greenlink Transit Paratransit Service Paratransit Information Paratransit Information Greenville Area Paratransit (GAP) is an Americans with Disabilities Act paratransit service provided for individuals who, because of their disabilities, are unable to use Greenlink's fixed route bus and trolley service. This does not include disabilities that only make the use of accessible transit service difficult or inconvenient. GAP provides comparable service to the regular fixed route bus and trolley in terms of shared rides, origin-to-destination pickup, service area, and hours and days of service. Learn more about: GAP Eligibility Riding GAP Scheduling A Ride Hours and Service Area Responsibilities Of Riding GAP GAP Suspension Begin the process by downloading an application. GAP Eligibility Determination Application (PDF) GAP Información General y Formularios de Aplicación o Solicitud (PDF) GAP Eligibility Determination Application (Chinese) (PDF) Download the GAP Rider's Handbook GAP Handbook (PDF) ADA Grievance Form City of Greenville ADA Grievance Form (PDF) Eligibility Service Hours & Area Scheduling A Ride Riding GAP Responsibilities Suspension of Service Appeals Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate " -597,https://www.fultoncountyga.gov/news/2021/07/23/fulton-county-police-observe-national-night-out,Media Bulletins,Agency-Published Resources,Fulton County Police Observe National Night Out,"",200,403 - Forbidden: Access is denied.,"[""Fulton County Police Observe National Night Out"", ""Fulton County Police Observe National Night Out""]",[],"[""Share This Story""]","[""Contact Us"", ""Helpful Links""]",[],"[""License & Certificates"", ""License & Certificates"", ""Voting & Elections"", ""Voting & Elections"", ""Health Services"", ""Health Services"", ""Libraries & Arts"", ""Libraries & Arts"", ""Animal Services"", ""Animal Services"", ""Youth"", ""Youth"", ""Seniors"", ""Seniors"", ""Water"", ""Water"", ""Public Safety"", ""Public Safety"", ""Courts"", ""Courts"", ""Human Services"", ""Human Services"", ""Other"", ""Other"", ""Property"", ""Property"", ""Vehicles"", ""Vehicles"", ""Water"", ""Water"", ""Doing Business with FC"", ""Doing Business with FC"", ""Bid Opportunities"", ""Bid Opportunities"", ""Economic Development"", ""Economic Development"", ""Permits and Inspections"", ""Permits and Inspections"", ""Courts"", ""Courts"", ""Justice Agencies"", ""Justice Agencies"", ""Court Services"", ""Court Services"", ""Board of Commissioners"", ""Board of Commissioners"", ""Clerk to the Commission"", ""Clerk to the Commission"", ""BOC Meeting Schedule"", ""BOC Meeting Schedule"", ""Agendas and Minutes"", ""Agendas and Minutes"", ""Watch Previous Board Meetings"", ""Watch Previous Board Meetings"", ""Citizen Engagement"", ""Citizen Engagement"", ""CourtWatch"", ""CourtWatch"", ""Tours and Requests"", ""Tours and Requests"", ""Volunteer Opportunities"", ""Volunteer Opportunities"", ""Youth Programs"", ""Youth Programs"", ""About Fulton County"", ""About Fulton County"", ""Executive Leadership"", ""Executive Leadership"", ""Fulton County Departments"", ""Fulton County Departments"", ""Fulton County Initiatives"", ""Fulton County Initiatives"", ""Open Government"", ""Open Government""]",Follow Us Twitter Instagram Facebook Twitter Instagram Facebook Search Created with Sketch. -598,https://www.sandiego.gov/department-document/march242009100-16th-streetaudioofficer-k-copeland-walkthroughredactedkmwav,Misc Police Activity,Police & Public Interactions,"","",404,"","","","","","","","" -599,https://delcopa.gov/publicrelations/releases/2020/babyitempickup_june19.html,Not Criminal Justice Related,Not Criminal Justice Related,"Baby Item Pick Up to be held June 19 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Baby Item Pick Up to be held June 19""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Baby Item Pick Up to be held June 19 Home / Departments / Public Relations Releases / Baby Item Pick Up to be held June 19 Delaware County Council, the Department of Human Services, Individuals Aiding in Emergencies Foundation and Multicultural Community Family Services are sponsoring a baby item pick up event on Friday, June 19 from noon to 2pm at 250 Sharon Ave. in Sharon Hill. Newborn to size 6 diapers, formula, baby food, and other baby items are available free of charge for families in need. We ask that residents attending this event please wear a mask as well as practice social distancing. First come first serve. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Baby Item Pick Up to be held June 19 Home / Departments / Public Relations Releases / Baby Item Pick Up to be held June 19 Baby Item Pick Up to be held June 19 Home / Departments / Public Relations Releases / Baby Item Pick Up to be held June 19 Baby Item Pick Up to be held June 19 Home / Departments / Public Relations Releases / Baby Item Pick Up to be held June 19 " -600,https://broadview-il.gov/events/police-and-fire-committee-meeting/,Poor Data Source,Poor Data Source,Police and Fire Committee Meeting | Broadview,"",200,Home | A Balanced Community,"[""Police and Fire Committee Meeting""]",[],"[""Leave a Reply Cancel reply"", ""I Want To"", ""Upcoming Events"", ""About Broadview, IL"", ""Phone Numbers"", ""Join Our Newsletter"", ""Broadview Municipal Building""]","[""Bowties & Tutus"", ""Drive-By Community Shred Day"", ""Walk with the Mayor"", ""Juneteenth Celebration 2024""]",[],[],"Menu Home Residents Events Village Board Meetings Report A Concern Curfew Parking Local Schools Receive Robo Calls Newsletter Archives Departments Water Pay My Water Bill Water Bill Rates How To Read Your Water Bill Water Billing Penalty Phase Waste & Yard Stickers Finance Financial Reports Property Tax Rates Financial Statements Compensation Packet Police Chief Of Police Thomas Mills Vision Operation Division Patrol Bureau Detective Bureau Administrative Services (Police) 911 Communications Truck Enforcement Initiative Police Reports Broadview Annual Police Reports General Information And Tips Sex Offender Registry Identity Theft Resources Vacation Checks For Your Home Block Party Request Form/Signature Form Community Feedback Organizational Structure Broadview Police Department Recruiting Fire Fire Chief Matthew Martin Fire Department Team About Us (Fire) Fire Suppression Emergency Medical Services Pre-Fire Planning Fire Inspector Martin Scafidi Fire Training Division Emergency Preparedness CPR Registration MyID Program Residential Knox Box Fire Prevention Bureau and Public Education Fire Annual Report Home Fire Safety Checklist Building Building Department Safety Committee Information Sheet Code Zoning Adjudication Downloadable Forms Solar Guideline, Checklists, and Permitting Public Works Public Works Department Refuse Broadview Capital Improvement Plan FAQ Public Works Website Links Water Quality Reports MS4 Annual Reports Village RFQ Government About Broadview Broadview History Village Government Village Code Village Board Meetings Village Directory Village Clerk Village Official Records Voter Registration FOIA Request Duties Important dates for November election Village Administrator Broadview Westchester Joint Water Agency Job Opportunities Alliance for Sustainability Solar Guidelines, Checklists & Permitting Solar Energy Resources Community Solar Unity Solar Group SBC Waste Hauler Juneteenth Festival Juneteenth Festival Archive Broadview Initiatives Elevating Aging-in-Community in Bellwood & Broadview English Spanish English Ask Broadview Map " -601,https://jamestownnd.gov/event/public-works-police-fire-committees-2-2023-06-22/,Poor Data Source,Poor Data Source,Public Works; Police & Fire Committees - City of Jamestown,"",200,Home - City of Jamestown,"["""", ""Public Works; Police & Fire Committees"", ""City Hall Offices""]","[""June 22, 2023 @ 4:00 PM"", ""Details"", ""Venue""]","[""Event Navigation"", ""Event Navigation"", ""Social"", ""Menu""]",[],[],[],"MENU MENU Home Departments ADMINISTRATION & FINANCE UTILITY BILLING ASSESSMENT CITY ATTORNEY CIVIC CENTER FORESTRY HUMAN RESOURCES PUBLIC SAFETY FIRE MUNICIPAL COURT POLICE PUBLIC WORKS BUILDING ENGINEERING INSPECTIONS PLANNING & ZONING RECYCLING SANITATION & SOLID WASTE STORM WATER MANAGEMENT STREET VECTOR CONTROL WASTEWATER WATER Government BIDS & PROPOSALS CITY COMMITTEES MEET THE MAYOR MEET THE COUNCIL MINUTES & AGENDAS CITY COUNCIL COMMITTEES MUNICIPAL CODE PUBLIC NOTICES UPCOMING SPECIAL ASSESSMENTS VOTING & ELECTIONS How Do I? APPLY FOR A CITY JOB OPENING A PERMIT/LICENSE CONTACT CITY COUNCIL FIND BID POSTINGS CITY BUDGET INFORMATION CITY MAPS CURRENT PSA'S ONLINE FORMS PROPERTY TAX INFO UPCOMING EVENTS SIGN UP FOR STUTSMAN ALERTS SUBMIT A GENERAL CONCERN ONLINE PAYMENTS Events Reach Us Home Public Works; Police & Fire Committees Home Public Works; Police & Fire Committees « All Events This event has passed. Public Works; Police & Fire Committees June 22, 2023 @ 4:00 PM Event Navigation « City Finance & Legal; Building, Planning & Zoning; Civic Center & Promotion Committees Special City Council Meeting » The meeting is scheduled at City Hall, 102 3rd Ave SE, Jamestown, ND.  The meeting is open to the public.   You may access an agenda on the Agenda & Minutes page of  www.JamestownND.gov or contact 701-252-5900 or email info@JamestownND.gov. + Google Calendar + iCal Export Details Date: June 22, 2023 Time: 4:00 PM Venue 102 3rd Ave SE Jamestown , ND 58401 United States + Google Map Phone: 701-252-5900 Event Navigation « City Finance & Legal; Building, Planning & Zoning; Civic Center & Promotion Committees Special City Council Meeting » City Hall Offices 102 3rd Ave SE Jamestown, ND 58401 (701) 252-5900 (701) 252-5903 Social Menu MENU MENU Home Departments Government How Do I? Events Reach Us Employee Logon © 2024 City Of Jamestown MENU MENU Home Departments ADMINISTRATION & FINANCE UTILITY BILLING ASSESSMENT CITY ATTORNEY CIVIC CENTER FORESTRY HUMAN RESOURCES PUBLIC SAFETY FIRE MUNICIPAL COURT POLICE PUBLIC WORKS BUILDING ENGINEERING INSPECTIONS PLANNING & ZONING RECYCLING SANITATION & SOLID WASTE STORM WATER MANAGEMENT STREET VECTOR CONTROL WASTEWATER WATER Government BIDS & PROPOSALS CITY COMMITTEES MEET THE MAYOR MEET THE COUNCIL MINUTES & AGENDAS CITY COUNCIL COMMITTEES MUNICIPAL CODE PUBLIC NOTICES UPCOMING SPECIAL ASSESSMENTS VOTING & ELECTIONS How Do I? APPLY FOR A CITY JOB OPENING A PERMIT/LICENSE CONTACT CITY COUNCIL FIND BID POSTINGS CITY BUDGET INFORMATION CITY MAPS CURRENT PSA'S ONLINE FORMS PROPERTY TAX INFO UPCOMING EVENTS SIGN UP FOR STUTSMAN ALERTS SUBMIT A GENERAL CONCERN ONLINE PAYMENTS Events Reach Us " -602,https://police.birminghamal.gov/command-staff/captains/,Contact Info & Agency Meta,Info About Agencies,Captains | Birmingham Police Department,"",200,"Home | Police Department - Birmingham, AL","[""Birmingham Police Department Commitment | Excellence | Integrity""]","[""Putting People First"", ""Captains""]",[],"[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[],"Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Search Captains In This Section BPD Organization Chart Chief Scott Thurmond Assistant Chief La’Quaylin Parhm Mack Deputy Chief Shelia Frazier-Finney Deputy Chief Onree J. Pruitt Jr. Captains Lieutenants Captain Frank Alexander II – Custody Services Division Commander Captain Janice Blackwell – Community Engagement Liaison Captain Raymond Cochran – Vice/Narcotics Commander Captain Harry Greenberg – Forensic Science Division Commander Captain Thomas Hanks – North Precinct Commander Captain James Jackson – Executive Assistant to the Assistant Chief of Police Captain Torry Mack – Tactical Operations Precinct Commander Captain Curtis Mitchell, Jr. – West Precinct Commander Captain Michelle Pruitt – Property and Records Management Division Commander Captain Julie J. Quigley-Vining – East Precinct Commander Captain Joe Roberts – South Precinct Commander Captain David Rockett – Internal Affairs Division Commander Captain Michael Sellers- Crimes Against Person Division Commander Captains In This Section BPD Organization Chart Chief Scott Thurmond Assistant Chief La’Quaylin Parhm Mack Deputy Chief Shelia Frazier-Finney Deputy Chief Onree J. Pruitt Jr. Captains Lieutenants Captain Frank Alexander II – Custody Services Division Commander Captain Janice Blackwell – Community Engagement Liaison Captain Raymond Cochran – Vice/Narcotics Commander Captain Harry Greenberg – Forensic Science Division Commander Captain Thomas Hanks – North Precinct Commander Captain James Jackson – Executive Assistant to the Assistant Chief of Police Captain Torry Mack – Tactical Operations Precinct Commander Captain Curtis Mitchell, Jr. – West Precinct Commander Captain Michelle Pruitt – Property and Records Management Division Commander Captain Julie J. Quigley-Vining – East Precinct Commander Captain Joe Roberts – South Precinct Commander Captain David Rockett – Internal Affairs Division Commander Captain Michael Sellers- Crimes Against Person Division Commander In This Section BPD Organization Chart Chief Scott Thurmond Assistant Chief La’Quaylin Parhm Mack Deputy Chief Shelia Frazier-Finney Deputy Chief Onree J. Pruitt Jr. Captains Lieutenants In This Section BPD Organization Chart Chief Scott Thurmond Assistant Chief La’Quaylin Parhm Mack Deputy Chief Shelia Frazier-Finney Deputy Chief Onree J. Pruitt Jr. Captains Lieutenants Captain Frank Alexander II – Custody Services Division Commander Captain Janice Blackwell – Community Engagement Liaison Captain Raymond Cochran – Vice/Narcotics Commander Captain Harry Greenberg – Forensic Science Division Commander Captain Thomas Hanks – North Precinct Commander Captain James Jackson – Executive Assistant to the Assistant Chief of Police Captain Torry Mack – Tactical Operations Precinct Commander Captain Curtis Mitchell, Jr. – West Precinct Commander Captain Michelle Pruitt – Property and Records Management Division Commander Captain Julie J. Quigley-Vining – East Precinct Commander Captain Joe Roberts – South Precinct Commander Captain David Rockett – Internal Affairs Division Commander Captain Michael Sellers- Crimes Against Person Division Commander " -603,http://www.longbeach.gov/police/press-releases/long-beach-police-seeking-the-public-s-help-in-identifying-armed-robbery-suspect---video-footage-available--/,Media Bulletins,Agency-Published Resources,LONG BEACH POLICE SEEKING THE PUBLIC'S HELP IN IDENTIFYING ARMED ROBBERY SUSPECT --VIDEO FOOTAGE AVAILABLE--,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/16/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: LONG BEACH POLICE SEEKING THE PUBLIC'S HELP IN IDENTIFYING ARMED ROBBERY SUSPECT --VIDEO FOOTAGE AVAILABLE-- Contact: Media Relations (562) 570-5273 VIEW VIDEO FOOTAGE **Suspect seen in video at start and at end.** The Long Beach Police Department is asking for the public’s help in identifying a suspect who committed a robbery to a local business. On Wednesday, July 9, 2014, at approximately 6:30 P.M., the suspect entered a local business in the 100 block of Linden Avenue. The suspect approached one of the employees and had a brief conversation with the employee. During the course of the conversation, the suspect brandished a knife and demanded money from the employee. The employee was in immediate fear for their safety, opened the cash register and handed the suspect money. Thankfully, the employee was not injured. The suspect was last seen running north on Linden Avenue from the business. During the course of the investigation detectives obtained videotape evidence of the suspect entering the business. The suspect is described as a Male Black, approximately 50 years old, wearing a black cap, a blue and white plaid colored shirt and blue jeans. Anyone with information on the suspect or his whereabouts is urged to contact Long Beach Police Robbery Detective Don Collier at (562) 570-7464 or (562) 570-5537. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -604,http://lafayettepolice.us/316/housing-information-and-application,Not Criminal Justice Related,Not Criminal Justice Related,"Housing Choice Voucher Application Information | Lafayette, IN - Official Website",Applications are currently being accepted.,200,"Police Department | Lafayette, IN - Official Website","[""Housing Choice Voucher Application Information""]","[""Michelle Reynolds""]","[""Contact Us"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -605,https://spdblotter.seattle.gov/2020/05/30/police-respond-to-protests-property-damage-arrest-seven/,Media Bulletins,Agency-Published Resources,"Police Respond to Protests, Property Damage, Arrest Seven - SPD Blotter","",200,403 Forbidden,"[""Police Respond to Protests, Property Damage, Arrest Seven""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics Search Search Search Search Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports -606,https://southamptontownnypolice.gov/205/adopt-a-planting-program,Not Criminal Justice Related,Not Criminal Justice Related,"Adopt a Planting Program | Southampton, NY - Official Website",Discover how to take part in the Adopt a Planting Program and help maintain a planting area.,200,"Police | Southampton, NY - Official Website","[""Adopt a Planting Program""]","[""Adopt A Planting Program""]","[""Site Tools"", ""Contact Us"", ""Charles McArdle"", ""Hours"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Highway Adopt a Planting Program Adopt a Planting Program Adopt A Planting Program We are lucky enough to have many beautiful plantings throughout the Town of Southampton. During our peek summer and fall seasons, we are unable to keep these plantings weeded and pruned to keep them in top shape. We are looking for people or organizations willing to adopt these planting areas and maintain, them. Please help! Call us at 631-728-3600, ext. 11, for more information. Contact Us Charles McArdle Superintendent of Highways Email Charles McArdle 20 Jackson Ave. Hampton Bays, NY 11946 Ph: 631-728-3600 Fx: 631-728-3605 Hours ( Excluding Holidays ) Monday - Friday 7:00 a.m. - 3:00 p.m. Adopt a Planting Program Adopt a Road Agreement (PDF) Printable Permit Applications Snow & Ice Control Policy (PDF) Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -607,https://townofpaonia.colorado.gov/paonia-police-department-employment-application,Training & Hiring Info,Info About Officers,Paonia Police Department Employment Application | Town of Paonia,"",200,Home | Town of Paonia,"[""Paonia Police Department Employment Application""]",[],[],[],[],[],"" -608,https://delcopa.gov/controller/pdf/2017andolder/sheriffaudit2017.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -609,http://www.longbeach.gov/police/press-releases/holiday-toy-drive-collection/,Media Bulletins,Agency-Published Resources,HOLIDAY TOY DRIVE COLLECTION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/30/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: L.B.P.D. KICKS OFF ANNUAL HOLIDAY TOY DRIVE COLLECTION Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department, in partnership with the Long Beach Police Foundation, has begun collecting donations of new unwrapped toys for the annual ‘Toy Patrol’ holiday toy drive. Officers regularly come into contact with families and children who are less fortunate due to circumstances beyond their control. Police employees, with firsthand knowledge of a family in need, submit the family’s information for consideration. No outside referrals are accepted. L.B.P.D. and the Police Foundation invite you to join us in spreading the joy of the holiday season by donating to this worthy cause. Each year, we are especially in need of toys for boys and girls ages 12 and up. Monetary donations and/or gift cards are also being accepted through the Long Beach Police Foundation, a 501(c)(3) non-profit organization. Please mail donations to LBPF, P.O. Box 15418, Long Beach, CA 90815, and mark your donation “Toy Patrol” on the memo line. For more information or to request a collection box, please call (562) 570-7212. Collection boxes are available at the below police facilities, as well as all City of Long Beach libraries, all Farmers & Merchants bank branches in Long Beach, and in a variety of businesses throughout the City. Police Facilities : Police Headquarters, 400 West Broadway East Division, 4800 Los Coyotes Diagonal North Division, 4891 Atlantic Avenue West Division, 1835 Santa Fe Avenue This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -610,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0825/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -611,https://police.greenvillesc.gov/faq.aspx?qid=445,Poor Data Source,Poor Data Source,FAQs • Where will all of this new affordable housing go? Who,"",200,"Police Department | Greenville, SC - Official Website",[],"[""▼ GVL2040 Comprehensive Plan - Report to the Community FAQs""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -612,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/january-2020-activity-report/,Annual & Monthly Reports,Info About Agencies,January 2020 - Activity Report - Town of Cheswold,"",200,"Home - Town of Cheswold - Kent County, Delaware","[""Cheswold""]","[""Delaware"", ""January 2020 – Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[],"Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Cheswold Delaware Listen January 2020 – Activity Report January 2020 - Activity Report Cheswold Delaware Listen January 2020 – Activity Report January 2020 - Activity Report Listen January 2020 – Activity Report January 2020 - Activity Report Listen January 2020 – Activity Report January 2020 - Activity Report Listen January 2020 – Activity Report January 2020 - Activity Report Listen Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form " -613,https://delcopa.gov/sustainability/conference.html,Not Criminal Justice Related,Not Criminal Justice Related,3rd Annual Delaware County Sustainability Conference,"",200,"Delaware County, Pennsylvania","[""3rd Annual Delaware County Sustainability Conference""]","[""Welcome to Delaware County's 3rd Annual Sustainability Conference""]","[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Event Details:""]","[""NOTE: Conference space is very limited"", ""Pre-registration is required""]","[""D  ate: Thursday, May 30, 2024"", ""TIME : REGISTRATION WILL OPEN AT 8:00 AM WITH A complimentary BREAKFAST. PROGRAMMING WILL BEGIN AT 9:00 AM. LUNCH, with Grilled, vegan, and allergen-free options, WILL BE SERVED AT 12:15 PM. THE DAY WILL CONCLUDE AT 3:00 PM."", ""L  ocation: WIDENER UNIVERSITY, university center, 1 UNIVERSITY PLACE, CHESTER, PA 19013""]","" -614,https://www.wakeforestnc.gov/police/crime-prevention/reporting-suspicious-activity,Resources,Agency-Published Resources,"Reporting Suspicious Activity | Town of Wake Forest, NC","Prevention is everyone's responsibility.We are one neighborhood, one state, one nation;and it is the responsibility of all to remain vigilantand to report suspicious behavior.One call can make a difference. Reporting Suspicious Activity Police Emergency Number - 919-556-9111 or 911 If you suspect that the suspicious behavior that you detected is actually a crime-in-progress,",200,"Town of Wake Forest, NC","[""Reporting Suspicious Activity""]","[""img_0371.jpg"", ""Town Hall Closed Friday, March 29"", ""Search form"", ""You are here""]",[],[],[],[],Skip to main content -615,https://ose.louisiana.gov/event/police-sergeant-80/,Contact Info & Agency Meta,Info About Agencies,Police Sergeant | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Police Sergeant""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Police Sergeant Promotional Level Posting Period 10/24/2022 - 11/04/22 Application Deadline 11/04/22 Jurisdiction Franklin Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Police Sergeant Promotional Level Posting Period 10/24/2022 - 11/04/22 Application Deadline 11/04/22 Jurisdiction Franklin Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Sergeant Promotional Level Posting Period 10/24/2022 - 11/04/22 Application Deadline 11/04/22 Jurisdiction Franklin Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Sergeant Promotional Level Posting Period 10/24/2022 - 11/04/22 Application Deadline 11/04/22 Jurisdiction Franklin Application This event has passed. Police Sergeant Promotional Level Posting Period 10/24/2022 - 11/04/22 Application Deadline 11/04/22 Jurisdiction Franklin Application This event has passed. Police Sergeant Promotional Level Posting Period 10/24/2022 - 11/04/22 Application Deadline 11/04/22 Jurisdiction Franklin Application This event has passed. Police Sergeant Promotional Level Promotional Level Promotional Level Posting Period 10/24/2022 - 11/04/22 Application Deadline 11/04/22 Jurisdiction Franklin Posting Period 10/24/2022 - 11/04/22 Application Deadline 11/04/22 Jurisdiction Franklin Posting Period 10/24/2022 - 11/04/22 Application Deadline 11/04/22 Jurisdiction Franklin Posting Period 10/24/2022 - 11/04/22 Posting Period Application Deadline 11/04/22 Application Deadline Jurisdiction Franklin Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -616,https://pittsburghpa.gov/files/police/orders/ch6/68-02-grafitti-tracking-system.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -617,http://www.tampa.gov/events/national-coffee-cop-day/105796,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -618,"https://norfolkne.gov/government/departments/police-division/press-releases/april-27,-2021-press-release.html",Media Bulletins,Agency-Published Resources,"April 27, 2021 Press Release - City of Norfolk, NE","",200,"Welcome to Norfolk, NE - City of Norfolk, NE","[""City of Norfolk, NE"", ""Police Division"", ""April 27, 2021 Press Release"", ""City of Norfolk, NE""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]","" -619,https://police.birminghamal.gov/wp-content/uploads/2020/01/dsc_2278-225.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -620,https://delcopa.gov/vote/pdf/2021/delco_boe-meeting-notice_04-28-2021.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -621,https://delcopa.gov/vote/becomingapollworker.html,Not Criminal Justice Related,Not Criminal Justice Related,"Becoming a Poll Worker - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Becoming a Poll Worker""]",[],"[""How to Become a Poll Worker"", ""Poll Worker Requirements"", ""Student Poll Worker Program"", ""Poll Worker Positions"", ""Poll Worker Pay: Election Day"", ""Poll Worker Pay: Training Pay"", ""Filling Vacancies in an Election Board: Vacancy Kits"", ""Filling Vacancies in an Election Board: Emergency Appointments"", ""Questions?"", ""Delco Votes!"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -622,http://www.longbeach.gov/police/press-releases/undetermined-death-investigation-2-/,Media Bulletins,Agency-Published Resources,UNDETERMINED DEATH INVESTIGATION(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/11/2017 FOR IMMEDIATE RELEASE Press Release # Subject: UPDATE - UNDETERMINED DEATH INVESTIGATION Contact: Media Relations Detail (562) 570-5273 UPDATE (4/11/2017) : The victim has -been identified as 17-year-old Leslie Hernandez of Santa Monica. Based on the -initial results of the investigation, which includes the preliminary findings -of the LA County Coroner’s Office, this case is being investigated as a -possible drug overdose. The details surrounding why her -remains were at that location are still under investigation. ORIGINAL NEWS RELEASE (4/6/2017) : On Thursday, April 6, 2017, at 1:30 a.m., Long Beach Police were dispatched to the Los Angeles riverbed near the Ocean Boulevard Bridge after a caller indicated a body had been found. The preliminary investigation revealed that when officers arrived, they located the body of a deceased female victim, unknown age, along the waterline of the riverbed. The caller also indicated a vehicle had been seen leaving the area, and patrol officers conducted a traffic stop of a vehicle matching the vehicle’s description. The occupants were questioned, however, no arrests have been made relating to this case. The Public Safety Dive Team and Long Beach Search & -Rescue responded to the scene to search for any potential evidence. The Los -Angeles County Coroner's Office also responded and will determine the identity -of the victim and the official cause of death. Due to the ongoing investigation, no additional details are being released at this time. Anyone with information regarding the incident should contact L.B.P.D. Homicide Detectives Donald Goodman and Mark Mattia at (562) 570-7244.  Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -623,https://ci.san-bernardino.ca.us/city_hall/police_department/crime_statistics/about_ucr_statistics/part_2_crimes,Poor Data Source,Poor Data Source,Part 2 Crimes - City of San Bernardino,"",200,Just a moment...,"[""City of San Bernardino California""]","[""Part 2 Crimes""]",[],[],[],[],Skip to Content -624,https://police.greenvillesc.gov/2025/project-safe-neighborhoods,Resources,Agency-Published Resources,"Project Safe Neighborhoods | Greenville, SC - Official Website","Project Safe Neighborhoods is designed to build strong partnerships between the community, service providers and law enforcement to reduce firearm violence and prevent youth from becoming involved in gangs.",200,"Police Department | Greenville, SC - Official Website","[""Project Safe Neighborhoods""]",[],"[""Project Safe Neighborhoods Kick Off Event"", ""Loading""]",[],[],[],"Skip to Main Content Careers About Us Divisions News Services I Want To... Search Home Departments Police Department Services GRAVITY Project Safe Neighborhoods Project Safe Neighborhoods The Nicholtown community is working to make their neighborhood an even safer place. Project Safe Neighborhoods is designed to build strong partnerships between the community, service providers and law enforcement to reduce firearm violence and prevent youth from becoming involved in gangs. The program will be piloted in the Nicholtown neighborhood, which was selected, in part, due to its active neighborhood association and the number of resources and services already in place. Ultimately, the goal is to develop a framework for expanding Project Safe Neighborhoods to neighborhoods throughout the city. In October 2021, the U.S. Department of Justice’s Office of Community Oriented Policing Services awarded the Greenville Police Department (GPD) $112,800 for the Project Safe Neighborhoods initiative. The Office of Community Oriented Policing Services provides funding to law enforcement agencies seeking to develop or enhance programs that focus on building trust and legitimacy between law enforcement and the communities they serve. As part of the grant, GPD is working with experts from the National Network for Safe Communities (NNSC), whose mission is to reduce violence, build trust and transform public safety in partnership with communities around the world. Project Safe Neighborhoods Kick-off Event Held in August 2022 To kick off Project Safe Neighborhoods, the Nicholtown Neighborhood Association partnered with the City of Greenville to host a two-day event facilitated by representatives from NNSC. Project Safe Neighborhoods Kick Off Event Members of the Nicholtown Neighborhood Association give a history tour of the area to GPD Officers and Project Safe Neighborhood stakeholders. Yvonne Reeder of Nicholtown gives opening remarks. Annie Allen, of Asset Based Community Development, listens during the Nicholtown tour. Neighborhood president Alan Mitchell leads a discussion. Participants in the Project Safe Neighborhood kickoff event were asked to map out Nicholtown's assets. 1 2 3 4 5 Annual Officer Allen Jacobs Summer Camp Project Safe Neighborhoods my Neighborhood Become a Police Officer alarm registration compliments & complaints crime stoppers Emergency Notifications Contact Us | Accessibility | Web Policy and Copyright | Website by CivicPlus® City of Greenville, SC, Police Department  |  4 McGee St., Greenville, SC 29601  |  Police Non-Emergency: 864-271-5333 Back to Top Enable Google Translate " -625,https://delcopa.gov/publicrelations/releases/2022/pdf/vetresourcefair.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -626,http://www.ryepolice.us/event/annies-angels-rye-by-the-sea-duathlon-2,Not Criminal Justice Related,Not Criminal Justice Related,Rye Police Department Annie's Angels Rye by the Sea Duathlon - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"["""", ""Annie’s Angels Rye by the Sea Duathlon""]","[""June 1, 2019 @ 8:00 am - 11:00 am"", ""Details"", ""Organizer""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search Home « All Events This event has passed. Annie’s Angels Rye by the Sea Duathlon June 1, 2019 @ 8:00 am - 11:00 am « Rye Beach Yoga, LLC Rye Beach Market, LLC » On Saturday, June 1, the Annie's Angels Rye by the Sea Duathlon will travel through Rye during the morning hours of approximately 8:00AM-11:00AM.  The race consists of a run and bike ride. Please use caution and allot extra time to reach destinations.  There will be officers posted to aid with traffic throughout the route. + Google Calendar + iCal Export Details Date: June 1, 2019 Time: 8:00 am - 11:00 am Event Category: Event Permits Organizer Bill DaGiau-Annie’s Angels Website: https://anniesangels.org/get-in-touch/ « Rye Beach Yoga, LLC Rye Beach Market, LLC » Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search " -627,https://southamptontownnypolice.gov/faq.aspx?qid=437,Resources,Agency-Published Resources,FAQs • How much are the permits this year?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ FAQ (COVID-19) | Southampton Town Beaches""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -628,https://frederica.delaware.gov/2016/06/27/ad-for-part-time-police-office/townoffred-50-121467-1/,Media Bulletins,Agency-Published Resources,Ad for Part Time Police Officer - Frederica,"",200,"Home - Frederica - Kent County, Delaware","[""Frederica""]","[""Delaware"", ""Ad for Part Time Police Officer""]","[""Menu"", ""Online Bill Pay"", ""Connect With Us!""]",[],[],[],"Skip to Content Skip to Footer Toggle navigation Menu Home Government Town Hall Town Council & Employees Town Charter Town Code Planning & Zoning Meetings & Events Past Meeting Minutes & Agendas Flag Status Info Additional Resources Finance Fire Company Forms & Reports Police Department Trash & Recycling Water Dept./Public Works Community Places Around Town History Photo Gallery Town Newsletters News & Notices Online Bill Pay Contact Us Contact Form FOIA Form Utility Contact Form Skip to Content Skip to Footer Toggle navigation Menu Home Government Town Hall Town Council & Employees Town Charter Town Code Planning & Zoning Meetings & Events Past Meeting Minutes & Agendas Flag Status Info Additional Resources Finance Fire Company Forms & Reports Police Department Trash & Recycling Water Dept./Public Works Community Places Around Town History Photo Gallery Town Newsletters News & Notices Online Bill Pay Contact Us Contact Form FOIA Form Utility Contact Form Skip to Content Skip to Footer Toggle navigation Menu Home Government Town Hall Town Council & Employees Town Charter Town Code Planning & Zoning Meetings & Events Past Meeting Minutes & Agendas Flag Status Info Additional Resources Finance Fire Company Forms & Reports Police Department Trash & Recycling Water Dept./Public Works Community Places Around Town History Photo Gallery Town Newsletters News & Notices Online Bill Pay Contact Us Contact Form FOIA Form Utility Contact Form Frederica Delaware Frederica Delaware Frederica Delaware Frederica Delaware Listen Ad for Part Time Police Officer Date Posted: Monday, June 27th, 2016 Ad for Part Time Police Officer << Mar 2024 >> S M T W T F S 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 Sign Up for Emergency Notifications Today! Online Bill Pay Connect With Us! Listen Ad for Part Time Police Officer Date Posted: Monday, June 27th, 2016 Ad for Part Time Police Officer << Mar 2024 >> S M T W T F S 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 Sign Up for Emergency Notifications Today! Online Bill Pay Connect With Us! Listen Ad for Part Time Police Officer Date Posted: Monday, June 27th, 2016 Ad for Part Time Police Officer << Mar 2024 >> S M T W T F S 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 Sign Up for Emergency Notifications Today! Online Bill Pay Connect With Us! " -629,https://www.knoxvilletn.gov/government/city_departments_offices/police_department/management_services_bureau/community_police_academy,Media Bulletins,Agency-Published Resources,Community Police Academy - City of Knoxville,police*,200,Just a moment...,"[""Community Police Academy"", ""Police Chief""]",[],[],[],[],[],Skip navigation {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## -630,https://www.southamptontownnypolice.gov/493/pump-out-boat-program,Not Criminal Justice Related,Not Criminal Justice Related,"Pump Out Boat Program | Southampton, NY - Official Website",Discover how the Pump Out Boat Program helps protect the town's shellfish beds and keep the waters safe and clean for swimming and recreation. ,200,"Police | Southampton, NY - Official Website","[""Pump Out Boat Program""]","[""Availability""]","[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Town Services Town Trustees Pump Out Boat Program Pump Out Boat Program Due to the implementation of the Pump Out Boat Program by the Southampton Town Board of Trustees, Peconic and South Shore Estuaries were designated as Vessel Waste No Discharge Zones (NDZ). This program was put into place in order to help protect our shellfish beds and keep our waters safe and clean for swimming and recreation. During the 2009 season, the boats pumped 105,079 gallons of waste that potentially could have been discharged into our local waterways. Availability There are currently six boats that work out of Mill Creek, Cold Spring, Westhampton, North Sea, Hampton Bays, and Sag Harbor and are available from Memorial Day until October 31. Recreational boaters in need of waste disposal need only to contact them on marine radio CH 73 and arrange a meeting place. PUBLIC PUMP OUT BOAT SCHEDULE 2018 IMPORTANT PHONE NUMBERS: VHF Channel: 73 Marine Maintenance: 631-728-1612 Bay Constables Office: 631-702-2268 Sag Harbor Harbormaster: 631-725-2368 Town Trustees Office: 631-287-5717 Coast Guard: 631-728-0078 Endangered Species Resolutions Parks & Recreation Forms & Applications Public Information Center Pump Out Boat Program Rules & Regulations Shellfish Threatened & Endangered Species Program Trustees Budget Trustees Studies & Reports Marine Resource Protection & Management Plan (PDF) Mill Pond Restoration Project 2020 Report - DRAFT Mecox Bay Management Plan Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -631,https://www.sandiego.gov/form/get-it-done-police,Contact Info & Agency Meta,Info About Agencies,Get It Done - Police | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""Get It Done - Police""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -632,https://www.minneapolismn.gov/government/departments/police/,Contact Info & Agency Meta,Info About Agencies,Police - City of Minneapolis,We in the Minneapolis Police Department gain our authority from the community. We recognize that public safety is not just the absence of crime but the presence of justice.,200,City of Minneapolis,"[""Police Department"", ""Need help? We're here for you.""]","[""A snow emergency is not currently in effect. Normal parking rules apply."", ""Join the Minneapolis Police Department"", ""I want to"", ""Explore this section"", ""Staff and volunteers"", ""Bureaus"", ""Related programs and initiatives"", ""Stay Informed"", ""Related links"", ""Access to police services"", ""Report an issue"", ""Contact us""]","[""Read and give feedback on police policies"", ""File an online police report"", ""Apply for a police job"", ""Minneapolis police precincts"", ""Police auctions"", ""Reclaim property"", ""Gun permits"", ""Policy and Procedure Manual"", ""Oath of Office"", ""Police chief and administration"", ""Crime prevention specialists"", ""Chaplains"", ""Police Reserve"", ""Investigations"", ""Patrol"", ""Professional Standards"", ""National Night Out"", ""Police Explorers"", ""U and T visa"", ""Women's Leadership Academy"", ""View data and reports"", ""File online"", ""View resources"", ""Minneapolis Police Department"", ""Connect with the Minneapolis Police Department""]",[],[],[],"" -633,https://council.seattle.gov/2016/09/15/councilmember-johnsons-statement-on-the-north-precinct-police-station/,Not Criminal Justice Related,Not Criminal Justice Related,Councilmember Johnson’s Statement on the North Precinct Police Station - Seattle City Council Blog,"",200,403 Forbidden,"[""Councilmember Johnson’s Statement on the North Precinct Police Station""]",[],"[""HELPFUL LINKS"", ""Make your voice heard"", ""Councilmembers""]",[],[],[],"Home News Press Releases Video Councilmembers Rob Saka Tammy J. Morales Joy Hollingsworth Maritza Rivera Cathy Moore Dan Strauss Robert Kettle Tanya Woo Sara Nelson Councilmembers (2022-2024) About Councilmember Johnson’s Statement on the North Precinct Police Station Home » Councilmember Johnson’s Statement on the North Precinct Police Station Johnson , News Releases September 15, 2016 January 6, 2023 By City Council News Releases Councilmember Rob Johnson (District 4, Northeast Seattle) issued the following statement following the announcement that the North Precinct Police Station project will be revisited: “I fully believe that the decision to forego the current $149M design for the new North Precinct is more than prudent. As I’ve stated before, $149M is far too large a sum for one building. “I continue to look forward to the use of the Racial Equity Toolkit’s incorporation into the next design of the new North Precinct, as well as using this facility as a pilot for the City Capital Projects Oversight Committee that Councilmember Herbold and I called for back in August.” HELPFUL LINKS Meet the Council Mayor’s Office Council Calendar Council Agendas Council Committees Watch Council Live Make your voice heard Find Your Council District Contact the Council Sign up for Public Comment Register to Vote Councilmembers Rob Saka Tammy J. Morales Joy Hollingsworth Maritza Rivera Cathy Moore Dan Strauss Robert Kettle Teresa Mosqueda Sara Nelson The official blog of the Seattle City Council Home News Press Releases Video Councilmembers Rob Saka Tammy J. Morales Joy Hollingsworth Maritza Rivera Cathy Moore Dan Strauss Robert Kettle Tanya Woo Sara Nelson Councilmembers (2022-2024) About Councilmember Johnson’s Statement on the North Precinct Police Station Home » Councilmember Johnson’s Statement on the North Precinct Police Station Johnson , News Releases September 15, 2016 January 6, 2023 By City Council News Releases Councilmember Rob Johnson (District 4, Northeast Seattle) issued the following statement following the announcement that the North Precinct Police Station project will be revisited: “I fully believe that the decision to forego the current $149M design for the new North Precinct is more than prudent. As I’ve stated before, $149M is far too large a sum for one building. “I continue to look forward to the use of the Racial Equity Toolkit’s incorporation into the next design of the new North Precinct, as well as using this facility as a pilot for the City Capital Projects Oversight Committee that Councilmember Herbold and I called for back in August.” HELPFUL LINKS Meet the Council Mayor’s Office Council Calendar Council Agendas Council Committees Watch Council Live Make your voice heard Find Your Council District Contact the Council Sign up for Public Comment Register to Vote Councilmembers Rob Saka Tammy J. Morales Joy Hollingsworth Maritza Rivera Cathy Moore Dan Strauss Robert Kettle Teresa Mosqueda Sara Nelson Home News Press Releases Video Councilmembers Rob Saka Tammy J. Morales Joy Hollingsworth Maritza Rivera Cathy Moore Dan Strauss Robert Kettle Tanya Woo Sara Nelson Councilmembers (2022-2024) About " -634,https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-29/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -635,https://www.cityofrc.us/news/rancho-cucamonga-welcomes-new-police-chief,Media Bulletins,Agency-Published Resources,Rancho Cucamonga Welcomes New Police Chief | City of Rancho Cucamonga, ,200,Home | City of Rancho Cucamonga,"[""Rancho Cucamonga Welcomes New Police Chief""]","[""Utility Menu"", ""Breadcrumb"", ""Footer Menu"", ""Main navigation""]",[],[],[],[],"Select Language English 繁體中文 Français हिन्दी 日本語 한국어 Español Filipino Tiếng Việt ไทย Utility Menu Translate Text Size (Decrease) Text Size (Normal) Text Size (Increase) Contact Us Menu Search Breadcrumb Home News Rancho Cucamonga Welcomes New Police Chief Rancho Cucamonga Welcomes New Police Chief April 27, 2023 | By City of RC Rancho Cucamonga Welcomes New Police Chief. With the recent promotion of Captain Perez to Deputy Chief with the San Bernardino County Sheriff’s Department, we are pleased to share the news that Lieutenant Mike Smith has been promoted to Captain and is the new Chief of Police for the Rancho Cucamonga Police Department, effective March 25, 2023. Mike Smith, a 24-year veteran of the San Bernardino County Sheriff’s Department, began his career in 1999. As a Deputy Sheriff, Captain Smith worked at the West Valley Detention Center and held his first patrol assignment in Rancho Cucamonga in 2002. He was promoted to Detective/Corporal in 2008 and worked at Central Station until he transferred to the Specialized Investigations Division in 2009. Captain Smith promoted to Sergeant in 2012 and held assignments at the High Desert Detention Center, West Valley Detention Center, Fontana Station, and the Coroner’s Division. In 2018, Captain Smith promoted to Lieutenant at the Coroner’s Division and transferred to the Rancho Cucamonga Station in 2019 and oversaw both administrative and operational positions for the station. In addition to his years of service to the Rancho Cucamonga community, Captain Smith is also a longtime resident of our beloved city and takes great pride in serving the community he calls home. Please join us in congratulating Captain Smith on his new role as the Chief of Police for the Rancho Cucamonga Police Department. Footer Menu RC2GO Employment Opportunities Privacy Policy Contact Us Rate Your Experience Close Enter your keywords: Document Search Main navigation Home Everything We Do Animal Center Community Services Community Development Economic Development Healthy RC Library Public Safety RCMU Your Government Select Language English 繁體中文 Français हिन्दी 日本語 한국어 Español Filipino Tiếng Việt ไทย Utility Menu Translate Text Size (Decrease) Text Size (Normal) Text Size (Increase) Contact Us Select Language English 繁體中文 Français हिन्दी 日本語 한국어 Español Filipino Tiếng Việt ไทย Utility Menu Translate Text Size (Decrease) Text Size (Normal) Text Size (Increase) Contact Us Select Language English 繁體中文 Français हिन्दी 日本語 한국어 Español Filipino Tiếng Việt ไทย Select Language English 繁體中文 Français हिन्दी 日本語 한국어 Español Filipino Tiếng Việt ไทย Menu Search Menu Search Menu Search Menu Search " -636,https://arcadia-fl.gov/departments/police/,Contact Info & Agency Meta,Info About Agencies,Arcadia Police Department – City of Arcadia,"",200,City of Arcadia – See our famous historic downtown antique district.,"[""City of Arcadia, Florida"", ""Arcadia Police Department""]","[""Upcoming Events""]","[""Arcadia Police – (863) 494-2222 for Non-Emergency – Call 9-1-1 for Emergencies Only"", ""City Council Meeting"", ""City Council Meeting"", ""City Council Meeting"", ""City Council Meeting"", ""City Council Meeting"", ""Address"", ""Get in touch"", ""Contact""]","[""Search This Site"", ""Contact the Arcadia Police"", ""Pay Utilities Bill Online"", ""Follow the Arcadia Police on Facebook"", ""Search for Loved Ones in the Cemetery"", ""Follow us on Facebook"", ""Quick Links"", ""Helpful Websites"", ""Categories""]",[],[],"City of Arcadia, Florida City of Arcadia, Florida City of Arcadia, Florida City of Arcadia, Florida City of Arcadia, Florida City of Arcadia, Florida City of Arcadia, Florida City of Arcadia, Florida City of Arcadia, Florida City Council Agendas & Minutes Council Meeting Dates News COVID-19 Departments Administration City Clerk Finance Human Resources Job Listings Community Development Code Enforcement Planning & Zoning Arcadia Airport Golf Course Public Works Streets Division Solid Waste Division Parks Division Mobile Home Park Division Cemetery Division Utilities Pay Your Utilities Bill Water Treatment Plant Division Waste Water Treatment Plant Division Water & Sewer System Division Utility Billing Division State Road and City Lighting Division Police Send an Anonymous Tip Biographies Apply for Employment Documents Residents & Visitors Pay Your Utilities Bill Directions Parks Division Events FAQ Code Enforcement Police Arcadia Municipal Golf Course Arcadia Airport – X06 COVID-19 Contact Contact Departments Contact City Council City Council Agendas & Minutes Council Meeting Dates Council Members News COVID-19 Departments Administration City Clerk General Finance Human Resources Job Listings Community Development General Code Enforcement Planning & Zoning Arcadia Airport Golf Course Public Works General Streets Division Solid Waste Division Parks Division Mobile Home Park Division Cemetery Division Utilities General Pay Your Utilities Bill Water Treatment Plant Division Waste Water Treatment Plant Division Water & Sewer System Division Utility Billing Division State Road and City Lighting Division Police General Send an Anonymous Tip Biographies Apply for Employment Documents Residents & Visitors Pay Your Utilities Bill Directions Parks Division Events FAQ Code Enforcement Police Golf Course Arcadia Airport – X06 COVID-19 Contact Contact Departments Contact City Council City Council Agendas & Minutes Council Meeting Dates News COVID-19 Departments Administration City Clerk Finance Human Resources Job Listings Community Development Code Enforcement Planning & Zoning Arcadia Airport Golf Course Public Works Streets Division Solid Waste Division Parks Division Mobile Home Park Division Cemetery Division Utilities Pay Your Utilities Bill Water Treatment Plant Division Waste Water Treatment Plant Division Water & Sewer System Division Utility Billing Division State Road and City Lighting Division Police Send an Anonymous Tip Biographies Apply for Employment Documents Residents & Visitors Pay Your Utilities Bill Directions Parks Division Events FAQ Code Enforcement Police Arcadia Municipal Golf Course Arcadia Airport – X06 COVID-19 Contact Contact Departments Contact City Council City Council Agendas & Minutes Council Meeting Dates Council Members News COVID-19 Departments Administration City Clerk General Finance Human Resources Job Listings Community Development General Code Enforcement Planning & Zoning Arcadia Airport Golf Course Public Works General Streets Division Solid Waste Division Parks Division Mobile Home Park Division Cemetery Division Utilities General Pay Your Utilities Bill Water Treatment Plant Division Waste Water Treatment Plant Division Water & Sewer System Division Utility Billing Division State Road and City Lighting Division Police General Send an Anonymous Tip Biographies Apply for Employment Documents Residents & Visitors Pay Your Utilities Bill Directions Parks Division Events FAQ Code Enforcement Police Golf Course Arcadia Airport – X06 COVID-19 Contact Contact Departments Contact City Council " -637,https://delcopa.gov/weightsmeasures/pdf/complaintform.pdf,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -638,https://www.ci.san-bernardino.ca.us/city_hall/police_department/crime_statistics/about_ucr_statistics/arrest_statistics/arrest_statistics_-_2008,Crime Maps & Reports,Agency-Published Resources,Arrest Statistics - 2008 - City of San Bernardino,"",200,Just a moment...,"[""City of San Bernardino California""]","[""Arrest Statistics - 2008""]",[],[],[],[],Skip to Content -639,https://www.mass.gov/doc/gardnerpolicelieutenant2374rtf/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -640,https://www.coronadelmar.us/newport-beach-police-department-issues-citations-for-selling-alcohol-to-minors/,Media Bulletins,Agency-Published Resources,Newport Beach Police Department Issues Citations for Selling Alcohol to Minors | Corona del Mar California,"",200,Corona del Mar California,"[""Newport Beach Police Department Issues Citations for Selling Alcohol to Minors""]","[""Menu"", ""Be First to Comment"", ""Subscribe"", """", """"]","[""Share this:"", ""Like this:"", ""Related"", ""Leave a Reply Cancel reply"", """"]",[],[],[],"" -641,https://www.sandiego.gov/police/news-center/cold-cases/sleiman-hallak,Wanted Persons,Agency-Published Resources,Sleiman Hallak | City of San Diego Official Website,"Sleiman Hallak owned the Moonlight Market at Skyline and Meadowbrook for more than twenty years. He was known around the neighborhood as Pops. On Wednesday, April 17, 1996, at about 10:30 a.m., Hallak was working at the store counter waiting on a cigarette dealer when a black male armed with a gun entered the store and demanded that Hallak give up the money. When Hallak did not respond quickly enough, the suspect shot him to death and stole the money from the register and a handgun from the store.",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""Cold Case: Sleiman Hallak""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""News Center"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -642,https://www.dps.arkansas.gov/news/settlement-agreement-in-civil-action-against-state-police/,Media Bulletins,Agency-Published Resources,SETTLEMENT AGREEMENT IN CIVIL ACTION AGAINST STATE POLICE - Arkansas Department of Public Safety,"",200,Home - Arkansas Department of Public Safety,"[""Flag Status""]","[""NEWS"", ""SETTLEMENT AGREEMENT IN CIVIL ACTION AGAINST STATE POLICE"", ""Respect. Integrity. CUSTOMER SERVICE. TEAMWORK. SERVANT LEADERSHIP. CONTINUOUS IMPROVEMENT"", """", ""© 2024 All rights Reserved. Arkansas.gov""]",[],"[""Share this post""]","[""About DPS"", ""DPS Links"", ""DPS Address"", ""Your Arkansas.gov"", ""Top Online Services"", ""Helpful Information""]",[],"" -643,https://cheswold.delaware.gov/2015/03/06/cheswold-police-department-dea-sponsoring-national-take-back-day-sept-27-2014/,Not Criminal Justice Related,Not Criminal Justice Related,"Cheswold Police Department /DEA Sponsoring National Take Back Day Sept. 27, 2014 - Town of Cheswold - Kent County, Delaware","",200,"Home - Town of Cheswold - Kent County, Delaware","[""Cheswold""]","[""Delaware"", ""Cheswold Police Department /DEA Sponsoring National Take Back Day Sept. 27, 2014""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[],Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form -644,http://www.longbeach.gov/police/press-releases/murder3/,Media Bulletins,Agency-Published Resources,MURDER (900 Block of Hoffman),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/9/2018 FOR IMMEDIATE RELEASE Press Release # 2018 Subject: MURDER INVESTIGATION (900 BLOCK OF HOFFMAN AVENUE) Contact: Media Relations Detail (562) 570-5273 On July 8, 2018, at approx. 11:00 p.m., officers responded to the 900 block of Hoffman Avenue regarding reports of a shooting, which resulted in the death of a female adult, and the injuring of a male adult. When officers arrived, they located two gunshot victims in front of a residence. A female subject had been struck in the upper torso, and a male subject had been struck in the lower torso. Both victims were transported to a local hospital by LBFD paramedics, where the female was later pronounced deceased. The male victim was listed in stable condition. The deceased victim is only being identified as a 22-year-old female resident of Long Beach, pending notification of next of kin. The second victim is only being identified as a 25-year-old resident of Long Beach. The incident is being investigated as possibly gang-related, however, a motive has not yet been determined. Anyone who witnessed or has information regarding this incident is urged to contact LBPD Homicide Detectives Malcolm Evans and Shea Robertson at (562) 570-7244. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -645,https://pharr-tx.gov/ngg_tag/pharr-police-department-athletic-league/,Not Criminal Justice Related,Not Criminal Justice Related,Pharr Police Department Athletic League – City of Pharr,"",200,403 Forbidden,"[""Images tagged \""pharr-police-department-athletic-league\""""]",[],[],[],[],[],"" -646,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/102821summary.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -647,https://www.southamptontownnypolice.gov/faq.aspx?qid=249,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • What are the hours of operation for the Southampton A,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Public Safety - Animal Control""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -648,https://delcopa.gov/heroin/tipsforprevention.html,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -649,https://www.woburnma.gov/government/police/police-records-request/arrest-records/,Arrest Records,Police & Public Interactions,Arrest Records - City of Woburn,"",200,"City of Woburn, Massachusetts","[""Arrest Records""]",[],"[""Get Text & Email Updates!""]",[],[],[],"Economic Development View our latest info here Pay Where Do I Go For Economic Development View our latest info here Pay Where Do I Go For Economic Development View our latest info here Pay Where Do I Go For Economic Development View our latest info here Pay Where Do I Go For MENU MENU Residents Moving to Woburn Resources Click here to view helpful resources for new or current Woburn residents. News Library Public Schools Recreation Report a Concern Woburn Senior Center Traffic & Parking Veterans Voting & Elections Woburn Public Media Center Trash & Recycling Businesses Economic Development Click here to view our latest info. Apply for Business Certificate Licenses & Permits Food Service Retail Food Mobile Food Municipal Lien Certificates Swimming Pool & Spa Tanning Establishment Temporary Food Service Government Departments & Boards Search through all Departments, Boards and Commissions A-Z. Mayor’s Office City Council Departments & Boards A-Z Employment Opportunities About Woburn History Minutes & Agendas Archive Upcoming Public Meetings Ordinances / Code Bid Postings Public Schools Services Pay a Bill Click here to pay your bill quickly and efficiently. Assessors Database Change Your Mailing Address Forms Open Checkbook Subscribe Pay A Bill Register a Vehicle Register to Vote Report a Concern Events Quick Actions MENU MENU Residents Moving to Woburn Resources Click here to view helpful resources for new or current Woburn residents. News Library Public Schools Recreation Report a Concern Woburn Senior Center Traffic & Parking Veterans Voting & Elections Woburn Public Media Center Trash & Recycling Businesses Economic Development Click here to view our latest info. Apply for Business Certificate Licenses & Permits Food Service Retail Food Mobile Food Municipal Lien Certificates Swimming Pool & Spa Tanning Establishment Temporary Food Service Government Departments & Boards Search through all Departments, Boards and Commissions A-Z. Mayor’s Office City Council Departments & Boards A-Z Employment Opportunities About Woburn History Minutes & Agendas Archive Upcoming Public Meetings Ordinances / Code Bid Postings Public Schools Services Pay a Bill Click here to pay your bill quickly and efficiently. Assessors Database Change Your Mailing Address Forms Open Checkbook Subscribe Pay A Bill Register a Vehicle Register to Vote Report a Concern Events Quick Actions " -650,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol/,Media Bulletins,Agency-Published Resources,DUI Saturation Patrol,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/16/2015 FOR IMMEDIATE RELEASE Press Release # Subject: DUI SATURATION PATROL NETS THREE ARRESTS Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department’s Traffic Section conducted a DUI Saturation Patrol on Saturday, November 14, between the hours of 7:00 p.m. and 3:00 a.m. High visibility DUI enforcement efforts have a deterrent effect lowering the incidents of impaired driving and will continue thanks to special funding for extra officers to patrol for this deadly crime. 58 vehicle enforcement stops 3 DUI-alcohol suspects arrested 2 drivers cited/arrested for operating a vehicle unlicensed or while suspended/revoked 13 citations issued Law Enforcement emphasizes the preventable nature of drunk driving reminding everyone that all it takes is a little planning ahead. Designate a sober driver or call a cab. But whatever you do, don’t drink and drive. The California Office of Traffic Safety DDVIP (Designated Driver VIP) mobile app is now available for free download on iOS and Android devices. Launched last year, the new DDVIP app offers enhanced features, allowing users to “Map a Spot” with their current location to find DDVIP partnering establishments in their area or a “List of Spots” to search all participating bars and restaurants throughout California. Users will be offered free incentives at each bar to celebrate their life saving role. They can stay up-to-date with the latest from DDVIP and see what other users are saying via its social tab. Also through the app, for those who want to imbibe but also make it a point to plan ahead, users can easily order a sober ride from one of several ride sharing services – all from one screen. Drivers caught driving impaired can expect the impact of their DUI arrest to include jail time, fines, fees, DUI classes, other expenses that can exceed $10,000 not to mention the embarrassment when friends and family find out. The Long Beach Police Department will be conducting a DUI/Driver’s License Checkpoint on Saturday, November 21, 2015, in the Department’s ongoing commitment to lowering deaths and injuries upon the city’s streets and highways. The DUI Saturation Patrol was funded by a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration, reminding everyone to ‘Report Drunk Driver – Call 9-1-1’. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -651,https://police.greenvillesc.gov/874/transparency-portal,Resources,Agency-Published Resources,"Transparency | Greenville, SC - Official Website",The City of Greenville is committed to an open government.,200,"Police Department | Greenville, SC - Official Website","[""Transparency""]","[""Subscribe""]","[""Loading""]",[],[],[],"Skip to Main Content Government Departments Business Visitors Residents Search Home Government Transparency Transparency We hope this website improves your access to information, your ability to participate in City events, and your communication with the City of Greenville. Please contact us with any questions or requests. Agendas and Minutes Boards, Commissions, and Committees Building Permit and Site Grading Reports Business License Reports City Council Elections Employment eNewsletters Financial Publications Freedom of Information (FOIA) Requests Code of Ordinances Planning Project Applications Subscribe Stay informed about city news, information and events by subscribing to our city newsletters. More about e-communication City Council District Map Redistricting City Council Meeting Schedule Mayor Knox White Mayor's Corner John DeWorken - District 1 Lillian Brock Flemming - District 2 Ken Gibson - District 3 Wil Brasington - District 4 Dorothy Dowe - At Large Russell Stall - At Large Find Your Elected Officials Map City Manager Online Meetings Boards and Commissions Meeting Agendas & Minutes Meeting Calendar Annual Notice of Meetings (PDF) Elections Code of Ordinances Financial Publications Transparency Newsroom Week in Review Greenville on YouTube Social Media Subscribe to Enews News Archive Road Closure Map Emergency Information Title VI Plan Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Home Government Transparency Transparency We hope this website improves your access to information, your ability to participate in City events, and your communication with the City of Greenville. Please contact us with any questions or requests. Agendas and Minutes Boards, Commissions, and Committees Building Permit and Site Grading Reports Business License Reports City Council Elections Employment eNewsletters Financial Publications Freedom of Information (FOIA) Requests Code of Ordinances Planning Project Applications Subscribe Stay informed about city news, information and events by subscribing to our city newsletters. More about e-communication City Council District Map Redistricting City Council Meeting Schedule Mayor Knox White Mayor's Corner John DeWorken - District 1 Lillian Brock Flemming - District 2 Ken Gibson - District 3 Wil Brasington - District 4 Dorothy Dowe - At Large Russell Stall - At Large Find Your Elected Officials Map City Manager Online Meetings Boards and Commissions Meeting Agendas & Minutes Meeting Calendar Annual Notice of Meetings (PDF) Elections Code of Ordinances Financial Publications Transparency Newsroom Week in Review Greenville on YouTube Social Media Subscribe to Enews News Archive Road Closure Map Emergency Information Title VI Plan Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate " -652,http://www.longbeach.gov/police/press-releases/fatal-traffic-accident-1-/,Media Bulletins,Agency-Published Resources,FATAL TRAFFIC ACCIDENT(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/19/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: FATAL TRAFFIC ACCIDENT Contact: Media Relations Detail (562) 570-5273 On March 19, 2016, at approximately 11:49 p.m., officers from the Long Beach Police Department were dispatched to the 3300 block of South Street regarding an injury traffic collision between a vehicle and a pedestrian. Upon arrival, Officers observed Los Angeles County Fire Department Paramedics performing lifesaving medical aid on the pedestrian. That pedestrian was later transported to a local hospital where he remained in critical condition. The preliminary investigation revealed the pedestrian, a 28-year-old male resident of Huntington Beach, was crossing southbound across South Street west of Downey Avenue. He was not in a crosswalk when he was struck by a 1997 Honda Accord that was traveling eastbound on South Street being driven by a 32-year-old resident of Bellflower. The driver of the Honda remained at the scene, was interviewed and later released. On March 20, 2016, the pedestrian succumbed to his injuries at the local hospital. The pedestrian's identification is being withheld pending notification of the next of kin. Anyone who may have information regarding this incident is asked to call Long Beach Police Department Collision Investigation Detail Detective Steve Fox at (562) 570-7355. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -653,https://coloradosprings.gov/police-department/page/commander-rigdon,Poor Data Source,Poor Data Source,"","",403,"","","","","","","","" -654,https://lockhavenpa.gov/government/manager/personnel/lifeins_ft_police/,Not Criminal Justice Related,Not Criminal Justice Related,"Group Life: Full-time Police - City of Lock Haven, PA","",200,"City of Lock Haven, PA - Official Site","[""City of Lock Haven, PA"", ""Group Life: Full-time Police""]","[""""]","[""Quick Links"", ""River (Latest Observation)"", ""Archives"", ""Categories"", ""Meta""]",[],[],[],"City of Lock Haven, PA Menu Skip to content Home Residents Resources Bicycle Safety Open Burning Recycling Fall Leaf Collection Sidewalk Replacement Program Pesticides & Herbicides Emergency Preparedness Government Sustainability Diversity, Equity and Inclusion Education Energy Use, Conservation and Green Building Environmental Stewardship Governance and Community Engagement Healthy Communities Housing Land Use and Transportation City Council Agenda & Minutes Boards & Commissions Elected Officials City Manager Financial Administration Local Services Tax Real Estate Tax Personnel Administration Health Newsletters Workplace Safety New Hire & Annual Safety Training Open Enrollment Investment Administration Ethics Administration Lock Haven City Authority Forest Management Area Flood Protection Authority Levee Easement Redevelopment Authority Right to Know Employment Opportunities Full-time Semi-Skilled Laborer Assistant City Manager Departments Public Works Castanea Township Project Service Line Warranty Sewer Treatment Airport Operations Fire Department Streets Department Community Services Streets & Bridges Water Department 2023 Water Quality Report 2022 Water Quality Report 2021 Water Quality Report 2020 Water Quality Report 2019 Water Quality Report 2018 Water Quality Report 2017 Water Quality Report 2016 Water Quality Report WATER CONSERVATION Code Enforcement Building & Construction Health & Food Zoning Rental Property Registration Engineering GIS/GPS Mapping Map Room Fire Department Fire Dept Advisory Board Parking Downtown Parking Parking Fines Parking Permits Parks & Recreation Locations Programs City Beach Summer Recreation Program Planning 2020 Census Destination Lock Haven ADA Accessibility Community Development Block Grants Citizen Complaint Process Housing Rehabilitation Program Police Community Services Community Services Organization & Records Department Roster Policies Press Release Business & Development Open for Business Commercial Loan Program Commercial Recycling Forms & Publications Ordinances Public Notices Web Accessibility Community Food Trucks and Vendors Summer Concert Series Floating Stage Triangle Park Outdoor Movie Series Events Contact Us FAQ’s Location Search for: . пин ап официальный сайт – это современное онлайн-казино, которое предлагает широкий ассортимент азартных игр, включая слоты, настольные игры и игры с живыми дилерами. . Vavada Casino new players are welcome: bonus 150 free spins + 100% to the deposit. Increase your success! Group Life: Full-time Police Group Life: Full-time Police Quick Links 2023 WATER EMERGENCY SEARCH THE CITY ORDINANCES PAY YOUR WATER/SEWER BILL ONLINE PAY YOUR PARKING TICKET ONLINE LIVE RIVER WEBCAM Sponsored by Downtown Lock Haven, Inc. Airport Operations Right to Know Lock Haven Civil Space Employment Opportunities River (Latest Observation) Observation - LHVP1 - West Branch Susquehanna River at Lock Haven (Pennsylvania) Flood Categories Primary (ft) Action : 17 ft Minor : 21 ft Moderate : 23 ft Major : 25 ft Secondary (kcfs) Action : Not Set Minor : Not Set Moderate : Not Set Major : Not Set Gauge Data Latest Observation Category: Normal Latest Observation: 9.19 ft Latest Observation (Secondary): 5.38 kcfs Observation Time: […] Select photos used by permission, © David B. Kawchak. Search for: Archives Categories No categories Meta Log in Entries feed Comments feed WordPress.org " -655,https://www.newarknj.gov/news/mayor-ras-j-barakas-statement-on-police-chief-darnell-henry,Media Bulletins,Agency-Published Resources,News: MAYOR RAS J. BARAKA’S STATEMENT ON POLICE CHIEF DARNELL HENRY,"Official Page of Newark, NJ News: MAYOR RAS J. BARAKA’S STATEMENT ON POLICE CHIEF DARNELL HENRY",200,City of Newark,"[""City of"", ""NEWARK"", ""September 3, 2020"", ""MAYOR RAS J. BARAKA’S STATEMENT ON POLICE CHIEF DARNELL HENRY"", ""City of"", ""NEWARK""]","[""News"", ""Mayor Ras j baraka""]",[],[],[],[],"City of NEWARK DEPARTMENTS Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities News Events Forms mayor City Mayor Council Members Contact Knowledge Contact us City of NEWARK DEPARTMENTS Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities News Events Forms mayor City Mayor Council Members Contact Knowledge Contact us City of NEWARK DEPARTMENTS Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities DEPARTMENTS DEPARTMENTS Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities mayor City Mayor Council Members mayor mayor Contact Knowledge Contact us Contact Contact News News News News " -656,https://alpha.austin.gov/es/police-oversight/2020-09-17-08/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -657,http://www.longbeach.gov/police/press-releases/k-9-officer-is-partnered-with-new-police-service-dog/,Media Bulletins,Agency-Published Resources,K-9 Officer is Partnered with New Police Service Dog,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/22/2016 FOR IMMEDIATE RELEASE Press Release # Subject: K-9 OFFICER IS PARTNERED WITH NEW POLICE SERVICE DOG Contact: Media Relations Detail (562) 570-5273 CLICK ON IMAGES TO ENLARGE VIEW VIDEO CLIP OF STORM IN ACTION K-9 Officer Mike Parcells has acquired a new police service dog after his former dog “Credo” was fatally injured following a June 28, 2016 SWAT call-out involving a barricaded suspect. This week, Officer Parcells began field patrol with his new K-9 partner “Storm.” Storm, a 1 ½ year-old male Belgian Malinois, was imported from Holland where he received pre-training, before being received and trained by the Vohne Liche Kennels, a training facility in Indiana. In August 2016, Officer Parcells travelled to Indiana where he interacted with 25 dogs, before zeroing in on Storm. Once Storm was selected, he traveled back to Long Beach with Officer Parcells to begin several weeks of patrol training, which included: search techniques, verbal commands, obedience, agility, and evidence searches. In all, Storm has undergone 200+ hours of training, and was certified for field duty on November 11, 2016. Given his young age, Officer Parcells has described Storm as puppy-like and compared him to having a 2-year-old toddler, but is confident in what he has seen in his abilities. He acknowledged that losing Credo was extremely difficult and no other dog could take his place, but is excited to have Storm as his new partner and knows this is the beginning of a new journey. Storm is Officer Parcells’ sixth police service dog. Storm was funded by the Long Beach K-9 Officers Association (LBK9OA), a non-profit organization established by members of the community with the goal of promoting and supporting the LBPD’s K-9 Unit. The LBK9OA has also covered the cost of professionally fitted and upgraded tactical vests for LBPD police service dogs. To learn more about the LBK9OA or to make a contribution, visit their website at www.lbk9oa.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -658,https://columbiacitypolice.us/documents/publiccomplaint.pdf,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -659,https://www.southamptontownnypolice.gov/1695/2022-tentative-roll-assessment-rolls,List of Data Sources,Info About Agencies,"2023 Tentative Roll Assessment Roll | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""2023 Tentative Roll Assessment Roll""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Assessor's Office Assessment Roll - Tentative (2023) 2023 Tentative Roll Assessment Roll North Haven 473601 Quogue 473603 Southampton 473605 Westhampton Beach 473607 Sag Harbor 473609 Westhampton Dunes-473613 Sagaponack-473615 473689 001-473689 033 473689 033-473689 069 473689 070-473689 110 473689 111-473689 145 473689 145-473689 206 473689 206-473689 258 473689 258-473689 297 473689 297-473689 351 473689 351-473689 381 473689 381-473689 500 Roll Sections 3-5-6-8 Grand-Totals Agricultural Assessment Information Applications & Instructions Assessment Rolls - Final (2023/2024) Assessment Roll - Tentative (2023) Grievance Day Account Lookup Grievance Day Information Grievance Facts Interactive Sales Map Property Tax Freeze Credit Small Claims Assessment Review STAR Information Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Assessor's Office Assessment Roll - Tentative (2023) 2023 Tentative Roll Assessment Roll North Haven 473601 Quogue 473603 Southampton 473605 Westhampton Beach 473607 Sag Harbor 473609 Westhampton Dunes-473613 Sagaponack-473615 473689 001-473689 033 473689 033-473689 069 473689 070-473689 110 473689 111-473689 145 473689 145-473689 206 473689 206-473689 258 473689 258-473689 297 473689 297-473689 351 473689 351-473689 381 473689 381-473689 500 Roll Sections 3-5-6-8 Grand-Totals Agricultural Assessment Information Applications & Instructions Assessment Rolls - Final (2023/2024) Assessment Roll - Tentative (2023) Grievance Day Account Lookup Grievance Day Information Grievance Facts Interactive Sales Map Property Tax Freeze Credit Small Claims Assessment Review STAR Information Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... " -660,https://www.corcoranmn.gov/public_services/police/press_releases_records_and_complaint_recognition/press_releases,List of Data Sources,Info About Agencies,Press Releases - City of Corcoran,"",200,Just a moment...,"[""Press Releases""]",[],[],[],[],[],"" -661,http://lafayettepolice.us/1079/staff,Contact Info & Agency Meta,Info About Agencies,"Staff | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Staff""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home Government Departments H - W Water Works Staff Staff Steve Moore-Superintendent Ron Hurst-Assistant Superintendent Jay Schnebly-Chief of Distribution and Customer Service Chuck Reynolds-Chief of Operations and Maintenance John Burks-Water Works Public Works Inspector Rick Ross-Water Works Public Works Inspector Joe Davenport-Backflow/Cross Connection Inspector Jennifer Murray-Inventory Cost Account Manager Christy Schutter-Administrative Assistant Reports Meter Change-out Staff Upgrades Water's Path to You Water Tips Wellhead Protection Program Wellhead Protection Program Brochures Water Works Waivers Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home Government Departments H - W Water Works Staff Staff Steve Moore-Superintendent Ron Hurst-Assistant Superintendent Jay Schnebly-Chief of Distribution and Customer Service Chuck Reynolds-Chief of Operations and Maintenance John Burks-Water Works Public Works Inspector Rick Ross-Water Works Public Works Inspector Joe Davenport-Backflow/Cross Connection Inspector Jennifer Murray-Inventory Cost Account Manager Christy Schutter-Administrative Assistant Reports Meter Change-out Staff Upgrades Water's Path to You Water Tips Wellhead Protection Program Wellhead Protection Program Brochures Water Works Waivers Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -662,https://delcopa.gov/publicrelations/releases/2021/covid_countiesvaccinestatement.html,Not Criminal Justice Related,Not Criminal Justice Related,"Southeast Pennsylvania Counties Issue Statement on COVID-19 Vaccine Distribution - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Southeast Pennsylvania Counties Issue Statement on COVID-19 Vaccine Distribution""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -663,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0838/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -664,http://www.longbeach.gov/police/about-the-lbpd/bureaus/investigations-bureau/detective-division/auto-theft-detail-and-t.r.a.p/,Resources,Agency-Published Resources,Auto Theft Detail and T.R.A.P.,"",200,City of Long Beach,"[""Police Department""]","[""Auto Theft Detail And T.R.A.P""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""TASK FORCE FOR REGIONAL AUTO THEFT PREVENTION (T.R.A.P.)"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk"", ""REPORTING AUTO THEFT"", ""CHECKING YOUR AUTO THEFT CASE STATUS"", ""RENTAL CAR THEFTS AND EMBEZZLEMENT"", ""FAILURE TO RETURN A BORROWED CAR"", ""LAWS PERTAINING TO AUTO THEFT""]","[""Long Beach Police non-emergency (562) 435-6711"", ""Long Beach Police business desks:"", ""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", """", """", """", """", ""Crime Lab Survey"", """"]",[],"" -665,https://delcopa.gov/ich/resources/covid19/pdf/coronavirustestingifnohealthcareprovider.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -666,https://rocklandmaine.gov/police-department/officer-duhamel-promoted-to-patrol-sergeant/attachment/f45111ed-37de-4a3d-b8e7-099f09cad7fb-15/,Poor Data Source,Poor Data Source,"F45111ED-37DE-4A3D-B8E7-099F09CAD7FB.jpeg | The City of Rockland, Maine","",200,403 Forbidden,"[""F45111ED-37DE-4A3D-B8E7-099F09CAD7FB.jpeg""]",[],"[""All Current Alerts & Announcements"", ""Current Weather"", ""City of Rockland""]",[],[],[],"All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Current Weather Now loading... All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Current Weather Now loading... All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Current Weather Now loading... All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! " -667,https://www.madera.gov/wp-content/uploads/2016/05/madera-south-copy.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -668,https://www.fortworthtexas.gov/departments/police/public-safety/fw-pd-central-hemphill,Contact Info & Agency Meta,Info About Agencies,Welcome to the Fort Worth Police Department,"",200,Error retrieving title: 'NoneType' object has no attribute 'text',"[""Police Department""]","[""Learn what we're doing with the #FortWorthSafe Strategy"", ""Accident Reports"", ""Online Reporting"", ""Search One Address. Find Everything ."", ""Executive Staff"", ""Inside FWPD"", ""Patrol Commanders"", ""Help Us Solve a Crime"", ""Community Camera Program"", ""Most Wanted"", ""CrimeMapping.com""]","[""#FortWorthSafe Strategy"", ""Professional Standards"", ""Procedural Justice"", ""Chief of Police Neil Noakes"", ""Executive Assistant Chief Robert Alldredge"", ""Assistant Chief Julie Swearingin"", ""Assistant Chief David Carabajal"", ""Deputy Chief Buck Wheeler"", ""Deputy Chief Mark Barthen"", ""Deputy Chief Pedro \""Kiki\"" Criado"", ""Deputy Chief Chad Mahaffey"", ""Deputy Chief Monica Martin"", ""Deputy Chief Chris Daniels"", ""Assistant Police Director Leo Luna"", ""Assistant Police Director Keith Morris"", ""Central Commander - Robert Stewart"", ""East Commander - Antione Williams"", ""North Commander - Sean Kenjura"", ""Northwest Commander - Jason Kim"", ""South Commander - Andre Smith"", ""West Commander - Stefanie RIcks"", ""Catherine Davis, 24 years old"", ""Felicita Olguin, 81 years old"", ""Eduardo Lopez, 18 years old"", ""Derek Locke, 30 years old"", ""Miguel Ruiz, DOB: 05/14/1997"", ""Nestor Moreno, DOB: 02/26/1973"", ""Jaylnn Brooks, DOB: 03/14/2001"", ""Eric Sosa, DOB: 12/30/1981"", ""Draylon Gowans, DOB: 12/01/2000"", ""Paul Roman Aleman, DOB: 06/14/1996"", ""Johnathon Baughan, DOB: 09/01/1982"", ""Passion Crawford, DOB: 03/12/1992"", ""Ruben Buckner, DOB: 07/28/1968"", ""Reginald McDowell, DOB: 08/19/1996"", ""Resources"", ""Helpful Links"", ""Connect With FWPD""]",[],[],[],Learn what we're doing with the #FortWorthSafe Strategy -669,https://delcopa.gov/publicrelations/releases/2019/pdf/2019stateofthecounty.pdf,Media Bulletins,Agency-Published Resources,"","",200,"","","","","","","","" -670,https://police.greenvillesc.gov/304/health-wellness,Not Criminal Justice Related,Not Criminal Justice Related,"Employee Health Center | Greenville, SC - Official Website",Learn about the City's initiatives to promote healthy lifestyles and read about the award-winning Health and Wellness Program.,200,"Police Department | Greenville, SC - Official Website","[""Employee Health Center""]","[""On-site Walk-in Clinic"", ""Award Winning Health and Wellness Program"", ""Annual Physicals"", ""Lunch and Learns"", ""Award Winning On-site Tobacco Cessation Program"", ""Bicycle Commuter Tax Provision"", ""Employee Assistance Program (EAP)"", ""Mobile RN Program"", ""Nurse Practitioner"", ""Vaccinations"", ""Vaccinations"", ""Other Wellness Programs""]","[""Contacts"", ""Loading""]","[""Human Resources""]",[],[],Skip to Main Content -671,https://champaignil.gov/2010/08/05/champaign-police-hosts-pool-party-for-youth/,Media Bulletins,Agency-Published Resources,Champaign Police Hosts Pool Party for Youth - City of Champaign,"",200,403 Forbidden,"[""Champaign Police Hosts Pool Party for Youth""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Champaign Police Hosts Pool Party for Youth Search Posted on August 5, 2010 The Champaign Police Department, with the assistance of the Champaign Park District, Don Moyer Boys & Girls Club and local community members, will host an outreach event at Sholem Pool for local youth, age 12 – 17 y/o. When: Thursday, August 12, 2010 Where: Sholem Aquatic Center 2200 Sangamon Drive, Champaign Time: Grilling, 7– 8 p.m. Pool Party with games and prizes, 8 – 10 p.m. All youth must register at one of the following locations to receive a wristband for entry: Don Moyer Boys & Girls Club First Christian Church (Staley Road) The Church of the Living God The Leonhard Recreation Center The Douglass Community Center For more information, please contact Officer Katherine Thompson at Katherine.Thompson@ci.champaign.il.us or (217) 351-4545. Pool Party Flyer Categories: General Press Releases , Police Department Press Releases Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works " -672,https://police.bixbyok.gov/faq.aspx?qid=79,Resources,Agency-Published Resources,FAQs • Can I limit the number of SMS (text) messages I recei,"",200,"Bixby Police Department, OK | Official Website",[],"[""▼ Nixle Alert System""]","[""Categories"", ""Live Edit"", ""Helpful Links"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -673,https://spdblotter.seattle.gov/2018/12/02/theater-cancels-matinee-police-investigate-after-theater-employees-discover-threats-on-facebook/,Media Bulletins,Agency-Published Resources,"Theater Cancels Matinee, Police Investigate After Theater Employees Discover Threats on Facebook - SPD Blotter","",200,403 Forbidden,"[""Theater Cancels Matinee, Police Investigate After Theater Employees Discover Threats on Facebook""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -674,https://www.mass.gov/info-details/audit-of-the-massachusetts-cultural-council-objectives-scope-and-methodology,Not Criminal Justice Related,Not Criminal Justice Related,"Audit of the Massachusetts Cultural Council Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Massachusetts Cultural Council,200,Mass.gov,"[""Audit of the Massachusetts Cultural Council Objectives, Scope, and Methodology""]","[""Table of Contents for the audit, Audit of the Massachusetts Cultural Council"", ""Appendix"", ""Table of Contents"", ""Overview"", ""Grants to Individuals"", ""Cultural Organization Economic Recovery Program Grants"", ""ICP"", ""Cybersecurity Awareness Training"", ""Data Reliability"", ""Help Us Improve Mass.gov with your feedback""]","[""Go Smart"", ""Pearl"", ""MMARS""]",[],[],[],"" -675,https://www.montebelloca.gov/departments/police/services/pay_a_parking_ticket,Poor Data Source,Poor Data Source,Pay a Parking Ticket - City of Montebello,"",200,Just a moment...,"[""City of Montebello""]","[""Pay a Parking Ticket""]","[""FREQUENTLY ASKED QUESTIONS / PAY A PARKING TICKET""]",[],[],[],Skip to Content -676,https://delcopa.gov/publicrelations/releases/2020/covid_twoadditionaldeaths.html,Not Criminal Justice Related,Not Criminal Justice Related,"Two Additional COVID-19 Related Deaths Reported in Delaware County - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Two Additional COVID-19 Related Deaths Reported in Delaware County""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Two Additional COVID-19 Related Deaths Reported in Delaware County Home / Departments / Public Relations Releases / Two Additional COVID-19 Related Deaths Reported in Delaware County Sadly, there are two additional COVID-19 related deaths in Delaware County, bringing the total number of deaths to four in the County. The Chester County Health Department has confirmed a 70- year- old female from Ridley Township and a 63-year-old male from Middletown Township have passed away from COVID-19. Delaware County Council extends its deepest condolences to their families. As we as a community combat this pandemic together, this loss affects all of us and we are deeply saddened by the news. Delaware County Council continues to urge residents to follow Governor Wolf’s Stay at Home Order, which will help prevent the spread of the virus and protect our community. The order took effect on Monday, March 23 and will continue until April 6. Individuals may leave their residence only to perform allowable individual activities and allowable essential travel. More information about the order can be found here: https://www.governor.pa.gov/newsroom/governor-wolf-and-health-secretary-issue-stay-at-home-orders-to-7-counties-to-mitigate-spread-of-covid-19/ (link no longer active) Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Two Additional COVID-19 Related Deaths Reported in Delaware County Home / Departments / Public Relations Releases / Two Additional COVID-19 Related Deaths Reported in Delaware County Two Additional COVID-19 Related Deaths Reported in Delaware County Home / Departments / Public Relations Releases / Two Additional COVID-19 Related Deaths Reported in Delaware County Two Additional COVID-19 Related Deaths Reported in Delaware County Home / Departments / Public Relations Releases / Two Additional COVID-19 Related Deaths Reported in Delaware County " -677,https://www.foxcrossingwi.gov/foxcrossingwi.gov/police/,Annual & Monthly Reports,Info About Agencies,Police Archives - Fox Crossing Fox Crossing,"",200,Fox Crossing - Bridging the Fox Cities Fox Crossing,"[""""]",[],[],[],[],[],"Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing 2022 Annual Report 2021 Annual Report 2020 Annual Report Administration Organizational Chart Community Policing Divisions Patrol Investigations Support Services Directory History Municipal Code Book Parking Ticket Payments Resources & Online Forms                         Copyright © 2010 - 2024 Fox Crossing, All Rights Reserved. Professional Web Site Design by Sandstone Digital. Disclaimer Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing 2022 Annual Report 2021 Annual Report 2020 Annual Report Administration Organizational Chart Community Policing Divisions Patrol Investigations Support Services Directory History Municipal Code Book Parking Ticket Payments Resources & Online Forms                         " -678,https://www.troyny.gov/photos-troy-community-commemorates-retirement-of-troy-police-chief-john-tedesco/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -679,https://delcopa.gov/vetaffairs/forms/instructionsforfilingaclaim.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -680,https://www.littlerock.gov/media/5607/05-22-19-police.pdf,Media Bulletins,Agency-Published Resources,"","",200,"","","","","","","","" -681,https://dccouncil.gov/judiciary-public-safety/copy-of-fb0-fy19-attachment-i-contracts-and-grants/,Policies & Contracts,Info About Agencies,Copy of FB0 - FY19 - Attachment I - Contracts and Grants • Council of the District of Columbia,"",200,Home • Council of the District of Columbia,"[""Copy of FB0 – FY19 – Attachment I – Contracts and Grants""]",[],[],[],[],[],"Federal Tax Counter: $1,298,117,639 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Federal Tax Counter: $1,298,117,639 What is this? Get Updates RSS Press Center facebook twitter youtube Federal Tax Counter: $1,298,117,639 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Council of the District of Columbia Copy of FB0 – FY19 – Attachment I – Contracts and Grants October 10, 2018 Loading... Copy of FB0 – FY19 – Attachment I – Contracts and Grants October 10, 2018 Loading... Loading... Loading... DC Council seal About the Council Open Government Register to Vote Council Updates Jobs Council Directory Privacy Policy Commemorative D.C. Flag Program Ethics Visit the Wilson Building facebook twitter youtube Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Search facebook twitter youtube Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate " -682,https://northbrunswicknj.gov/wp-content/uploads/2020/09/national-police-week-2.jpg,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -683,https://www.coppelltx.gov/faq.aspx?qid=155,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • What Minimum Control Measures (MCMs) will the City of,"",200,"Coppell, TX | Official Website",[],"[""Annual Report"", ""▼ Stormwater Management"", ""More Information"", ""Annual Report""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -684,https://spdblotter.seattle.gov/2021/06/08/police-seize-five-firearms-following-crisis-call-arrest-man-for-earlier-drive-by-shooting/,Media Bulletins,Agency-Published Resources,"Police Seize Five Firearms Following Crisis Call, Arrest Man For Earlier Drive-By Shooting - SPD Blotter","",200,403 Forbidden,"[""Police Seize Five Firearms Following Crisis Call, Arrest Man For Earlier Drive-By Shooting""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -685,http://www.longbeach.gov/police/press-releases/fatality-1-/,Media Bulletins,Agency-Published Resources,FATALITY(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/19/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: FATALITY Contact: Media Relations (562) 570-5273 Today, the Long Beach Police Department was notified a person involved in a collision with a Los Angeles Metro Blue Line train last Friday has died. Robert Lee Mills, an 89-year-old resident of Signal Hill, had sufferd major injuries from the collision and was pronounced deceased early this morning. On Friday, September 12, 2014, at approximately 9:28 p.m., Long Beach Police responded to the area of Long Beach Boulevard and Burnett Street for reports of an injury traffic collision involving a Metro train and a vehicle. When officers arrived, they discovered a 2005 Cadillac CTS had been broadsided on the drivers side by the train. Mills, who was the sole person in the vehicle, was found in the drivers seat. Long Beach Fire Department paramedics responded to the scene and extracted Mills from his vehicle. Mills was transported to a local hospital and was admitted for his injuries. Based on witness statements and evidence at the scene, the preliminary investigation indicates Mills was stopped in the left turn lane of southbound Long Beach Boulevard for a red left turn arrow. Southbound vehicular and train traffic had the green light to go south on Long Beach Boulevard across Burnett Street. As the train alerted its horn and proceeded to cross Burnett Street, Mills drove into the intersection to make his left turn. The train broadsided Mills' vehicle and pushed the vehicle approximately 50 feet through the intersection. There were no injuries reported by the train operator or any train passengers. The train operator was questioned and released. It does not appear any charges will be filed. Anyone with additional information regarding this incident is asked to call Long Beach Police Collision Investigation Detective Steve Fox at (562) 570-7355. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -686,https://www.sandiego.gov/department-document/san-diego-kicks-community-conversations-about-next-police-chief,Media Bulletins,Agency-Published Resources,San Diego Kicks Off Community Conversations About Next Police Chief | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""San Diego Kicks Off Community Conversations About Next Police Chief"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -687,http://www.longbeach.gov/police/press-releases/murder-20-/,Media Bulletins,Agency-Published Resources,MURDER(20),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/5/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MURDER Contact: Media Relation (562) 570-7523 On Saturday, April 04, 2015, at approximately 10:53 P.M., Long Beach Police responded to the 2700 block of East South Street for reports of a person who had been shot. When officers arrived, they discovered a male adult down on the street with a gunshot wound. Long Beach Fire Department paramedics responded and pronounced the victim deceased at the scene. The victim has been identified as 47-year-old Lawrence Lee Casados of Los Alamitos . The preliminary investigation indicates the victim was socializing in the alleyway when the suspect approached the victim on foot and fired upon him. No suspect information is available at this time. The investigation remains ongoing. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detectives Greg Krabbe and Michael Hubbard at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -689,https://norfolkne.gov/government/departments/police-division/press-releases/may-21st-press-release.html,Media Bulletins,Agency-Published Resources,"May 21st Press Release - City of Norfolk, NE","",200,"Welcome to Norfolk, NE - City of Norfolk, NE","[""City of Norfolk, NE"", ""Police Division"", ""May 21st Press Release"", ""City of Norfolk, NE""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]","" -690,https://alpha.austin.gov/police-oversight/formal-complaint-when-department-issued-bwc-system-use-is-required/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -691,https://www.southamptontownnypolice.gov/1469/kenyatta-nash,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -692,https://www.elburn.il.us/police-department/,Personnel Records,Info About Officers,"Police Department | Village of Elburn, Illinois","",200,"Home | Village of Elburn, Illinois","[""Police Department"", ""AUTO STICKERS"", ""CHILD SAFETY SEAT CERTIFIED INSTALLATION"", ""CRIME PREVENTION"", ""FORMS AND DOCUMENTS"", ""LAWS/ORDINANCES"", ""LINKS OF INTEREST"", ""METRA INFORMATION"", ""METRA FAQ"", ""ONLINE REPORTING"", ""POLICE DEPARTMENT FAQ"", ""REGISTERED SEX OFFENDERS"", ""SCHOOL ZONE SAFETY"", ""STATE’S ATTORNEY’S OFFICE"", ""VACATION WATCH"", ""PROPOSED POLICE STATION INFO""]",[],"["""", """", """", """", """", """"]","[""Chief’s Message"", ""NEWS & PRESS RELEASES"", ""IMPORTANT LINKS"", ""Department Overview""]","[""Solicitor and Itinerant Merchant Permits Issued"", ""Proposed Police Station Updates"", ""ComEd Prepares for Ice Storms in Northern Illinois"", ""Links"", ""Main Contact Info"", ""Follow Us""]",[],"" -693,https://ci.san-bernardino.ca.us/city_hall/police_department/contacting_sbpd,Contact Info & Agency Meta,Info About Agencies,Contacting SBPD - City of San Bernardino,"",200,Just a moment...,"[""City of San Bernardino California""]","[""Contacting SBPD""]",[],[],[],[],Skip to Content -694,http://www.tampa.gov/police/memorial/thank-you,Media Bulletins,Agency-Published Resources,A Message of Thanks - August 2009 | City of Tampa,Citizens of Tampa Tampa Fire Rescue Mayor Iorio Hillsborough County Sheriffs Office Tampa Business Community THANK YOU!,200,City of Tampa,"[""A Message of Thanks - August 2009""]","[""Police Department"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[],"" -695,http://www.longbeach.gov/police/press-releases/update---arrest-made-in-murder-5900-block-of-l-b--blvd-/,Media Bulletins,Agency-Published Resources,MURDER - UPDATE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/25/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: MURDER - UPDATE Contact: Media Relations Detail (562) 570-5273 UPDATE: On May 24, 2017, detectives made an arrest in a murder investigation from April 21, 2017. The suspect has been identified as Terry Moore a 29 year-old resident of Compton. The arrest was made in the city of Lancaster. Moore was booked into the Long Beach Jail for murder and an outstanding warrant for violating his post release conditions for domestic violence. He is being held without bail and will be arraigned in Long Beach Superior Court on Friday May 26, 2017, in Department one. The victim was later identified as Lanette Washington a 32 year-old, with a prior residence in Victorville. Original News Release: On Friday, April 21, 2017, at approx. 9:50 a.m., officers responded to a motel in the 5900 block of Long Beach Boulevard regarding a shooting, which resulted in the death of a female adult. When officers arrived, they located the victim inside a room, who had been struck by gunfire Long Beach Fire Department paramedics responded and transported to her to a local hospital in serious condition. The victim was pronounced deceased shortly thereafter. Her identity is being withheld pending notification of next of kin. Information officers gathered indicated the suspect fled into the nearby neighborhood, and a containment area that included: Gordon Street to Allington Street, and Long Beach Boulevard to the 710 Freeway was established. SWAT was activated and K-9 also responded to assist in the search. Residents in the affected area were evacuated to a nearby school that was not in session due to Spring Break. The suspect was described as a male African-American in his 20’s, wearing a red shirt and jeans. Detectives believe the shooting may have happened as a result of a dispute, and the investigation continues. Anyone who has any information regarding the incident should contact Long Beach Police Homicide Detectives Peter Lackovic and Sean Irving at (562) 570-5273. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -696,https://southamptontownnypolice.gov/1139/office-of-sustainability,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -697,https://police.bixbyok.gov/faq.aspx?qid=77,Resources,Agency-Published Resources,FAQs • Can I register with an international telephone number,"",200,"Bixby Police Department, OK | Official Website",[],"[""▼ Nixle Alert System""]","[""Categories"", ""Live Edit"", ""Helpful Links"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -698,https://delcopa.gov/prison/pdfs/wardensreportapril2022.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -699,https://www.antioch.il.gov/wpfb-file/08-11-10-police-and-fire-commission-minutes-pdf/,Poor Data Source,Poor Data Source,"08-11-10 Police And Fire Commission Minutes - Antioch, IL",8006 08 11 10 police and fire commission minutes pdf commissions 2010 1284749388 415e95087ff8cdaefd2217d9ff094969 213x300 _clxydlrnkv7j thumb jpg 09 17 13 49 48 0 pdf application num_pages pdf_pages timings,200,"Home - Antioch, IL","[""08-11-10 Police And Fire Commission Minutes""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -700,https://delcopa.gov/planning/pdf/mapping/colwyn.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -701,http://www.ryepolice.us/logs/police-logs-for-1-9-19-1-15-19,Daily Activity Logs,Info About Officers,Rye Police Department Police Logs for 1/9/19-1/15/19 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs for 1/9/19-1/15/19""]","[""Police Logs for 1/9/19-1/15/19""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -702,https://champaignil.gov/police/news-data/traffic/,Contact Info & Agency Meta,Info About Agencies,Traffic - City of Champaign,"",200,403 Forbidden,[],"[""Police Department"", ""Quick Links"", ""Police Department News"", ""Contact Us""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Police Department Search About The Department Department Overview Mission and Vision Strategic Plan Divisions Meet the Command Staff Recruitment Policies and Procedures IACP and NAACP Shared Principles Agreement Employee Recognition Honoring Our Fallen File an Online Report File a Report Missing Persons Open Homicide Investigations Crime Stoppers Employee Conduct Neighborhood Traffic Concern Department Services Alarm Permits & Renewals Background Check BEST Security Training Car Seat Safety Inspections Emergency Notification for Businesses Fingerprint Services Freedom of Information Act (FOIA) Request Parking Permit Project ChildSafe Request Copy of a Police Report Security Camera Registration Services Overview Special Event Application 21st Century Policing Community Engagement Community Involvement at Champaign Police Community Conversations Overview Champaign County Community Coalition Coffee with a Cop Community Outreach Request Neighborhood Watch Police Department Tours Police Liaisons Risk Watch Program School Resource Officer Program Youth Police Explorer Post 258 Youth Police Academy Community Police Academy News & Data Overview News Releases Police Media Reports Police Body Cameras Automated License Plate Readers Gunshot Detection Annual Employee Conduct Report Use of Force Review Citizen Review of Police Complaints Working Group Annual Report Resources Overview Crime Prevention and Safety Community Resources Curfew for Minors Door-to-Door Soliciting Federal Property Disclosure Gun Violence Prevention and Response Premise Alert Sex Offender Registry VOICES Act Youth Assessment Center Contact Us Meet the Staff News & Data News Releases Police Media Reports Police Body Cameras Automated License Plate Readers Gunshot Detection Annual Employee Conduct Report Use of Force Review Citizen Review Subcommittee Citizen Review of Police Complaints Working Group Annual Report Quick Links Join Our Team Police Newsroom Gun Violence Prevention & Response File a Police Report Crime Stoppers Alarm Permits Police Department News Shooting Investigation – 1400 Block of N. Hickory Street Shooting Investigation – 2500 Block of W. Springfield Avenue Shooting Investigation – 700 Block of W. Vine Street Contact Us Champaign Police Department 82 E. University Ave. Champaign, IL 61820 Emergency: 9-1-1 Non-emergency: 217-333-8911 Front Desk: 217-351-4545 217-403-6904 (fax) police@champaignil.gov City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy Powered by Translate City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign " -703,https://www.minneapolismn.gov/resident-services/public-safety/police-public-safety/police-reports-and-data-requests/frequently-requested/critical-incidents/feb-2-2022-officer-involved-shooting/,Media Bulletins,Agency-Published Resources,"February 2, 2022 Officer-Involved Shooting - City of Minneapolis","Public data gathered by the Minneapolis Police Department related to the February 2, 2022 officer-involved shooting.",200,City of Minneapolis,"[""February 2, 2022 officer-involved shooting"", ""Need help? We're here for you.""]","[""A snow emergency is not currently in effect. Normal parking rules apply."", ""Body-worn camera video - Incident 22-022798"", ""Citations"", ""Documents"", ""Officer involved in incident"", ""Note about Officer complaints and discipline"", ""Body Camera, Street Camera, and Squad Camera Footage""]","[""Still image from body-worn camera video - Incident 22-022798"", ""Hennepin County Medical Examiner Press Release Report"", ""22-022798 General Offense Public Information Report"", ""22-022798 Incident Detail Report"", ""22-0004855 Fire Incident Detail Report"", ""22-0004855 Fire Incident Report"", ""MPD News Release"", ""MPD News Release Photo 1"", ""MPD News Release Photo 2"", ""Public Personnel File for Mark Hanneman"", ""Employee Complaint Summary for Mark Hanneman""]","[""Request accessible format"", ""Request accessible format"", ""Request accessible format"", ""Request accessible format"", ""Request accessible format"", ""Request accessible format"", ""Request accessible format"", ""Request accessible format"", ""Request accessible format"", ""Request accessible format"", ""Request accessible format""]",[],[],"" -704,http://www.tampa.gov/news/tampa-police-officer-killed-line-duty-66406,Media Bulletins,Agency-Published Resources,Tampa Police Officer Killed in the Line of Duty | City of Tampa,"Master Patrol Officer Jesse Madsen was killed early Tuesday morning when his police vehicle was struck by a wrong way driver on Interstate 275. Just before 1:00 AM on Tuesday morning, Tampa Police began receiving calls about a white vehicle driving southbound in the northbound lanes of I275 at a high rate of speed and swerving through the lanes. Within a minute of the original call, the vehicle crashed into Officer Madsen’s police vehicle between the Hillsborough and Sligh Avenue exits. The impact killed both Jesse and the driver of the white sedan.",200,City of Tampa,"[""Tampa Police Officer Killed in the Line of Duty""]","[""Information Resources"", ""Latest News"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[],"" -705,http://www.cityofpataskalaohio.gov/government/clerk-of-council/public-notices/advertisement-of-legislation-passed-september-5-2017-copy/,Not Criminal Justice Related,Not Criminal Justice Related,"Advertisement of Legislation passed September 5, 2017 - Copy - City Of Pataskala",Official Website,200,Home - City Of Pataskala,"[""City Of Pataskala""]","[""Official Website""]",[],[],[],[],Document Library Calendar Public Services Pay Court Ticket Online City Of Pataskala Official Website Blog Community Police Obtain Fingerprints Solicitor’s Permit Citizens Police Academy Important Links/Resources Prescription Drug Drop Off Police Officer Job Application History of the Pataskala Police Department Curfew Vacation House Check Form Fire School Districts Residents Taxes in Pataskala RITA Tax Local Animal Shelter/Lost Pets Dog License BMV Info Licking County Health Department Register to Vote Report a Gas Emergency New to Pataskala? Good Neighbor Guidelines Outdoor Activities Attractions City Departments Mayor Administration Garage Sale Permit Adopt-A-Street Program Rent a Park Shelter Current Bids and RFQ’s Outdoor Activity/Event Permit Parade-Assembly Form Parks and Recreation Economic Development Human Resources Utilities Utility Rates Water and Sewer Billing/ E-Billing Interesting Facts and Information Storm Water Management Program Report a Water Leak Finance Pataskala’s Income Tax Budget Financial Reports Popular Annual Financial Report (PAFR) Annual Comprehensive Financial Reports Financial Condition Reports 2023 Financial Condition Reports 2022 Financial Condition Reports 2021 Financial Condition Reports 2020 Financial Condition Reports 2019 Financial Condition Reports 2018 Financial Condition Reports 2017 Financial Condition Reports 2016 Financial Condition Reports 2015 Financial Condition Reports 2014 Financial Condition Reports 2013 Financial Condition Reports 2012 Financial Condition Reports Audited Financial Reports Pataskala Open Checkbook Mayor’s Court Important Traffic Violation Info Pay Fines or Search Case Files How to Pay Fines Traffic and General Offense Codes Plea Descriptions Court Appearance Times Your Rights in the Pataskala’s Mayor’s Court Downloadable Forms Sealing a Record Informational Court Links Mayor’s Court Prosecutor Pataskala’s Mayors Court Magistrate Mayor’s Court Rules Criminal/Traffic Diversion Bond Schedule Fine Schedule Legal Public Service/Streets Pothole Repair Report a Pothole Right of Way Snow Removal Traffic Signals & Street Lights Drainage/Ditches Issues Planning & Zoning Permit Questions Planning & Zoning Fee Schedule Discharge Map Zoning Maps Permits Comprehensive Plan Properties With Posted Code Violations Government City Council Ward Map Tom H. Lee – Ward 1 Mary Hite – Ward 2 Deborah Kohman – Ward 3 Brandon Galik – Ward 4 Dustin Epperson – At-Large Jude Hampshire – At-Large Andy Walther – At Large Clerk of Council Council Packet Public Notices Agendas Meeting Minutes Audio/Video Recordings Legislation Approved Ordinances & Resolutions 2024 Resolutions 2024 Ordinances 2023 Resolutions 2023 Ordinances 2022 Resolutions 2022 Ordinances 2021 Resolutions 2021 Ordinances 2020 Resolutions 2020 Ordinances 2019 Resolutions 2019 Ordinances 2018 Resolutions 2018 Ordinances 2017 Resolutions 2017 Ordinances 2016 Resolutions 2016 Ordinances 2015 Resolutions 2015 Ordinances Codified Ordinances Charter Public Records Request Information Boards and Commissions Personnel Board of Review Planning and Zoning Commission Board of Zoning Appeals Parks and Recreation Advisory Board Planning & Zoning Commission Board of Zoning Appeals Document Library Calendar Public Services Pay Court Ticket Online -706,http://www.ryepolice.us/wp-content/uploads/scannerpd@town.rye_.nh_.us_20180430_142152_001.jpg,Media Bulletins,Agency-Published Resources,"","",200,"","","","","","","","" -707,https://delcopa.gov/ich/resources/covid19/pdf/spcapressrelease.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -708,https://www.antioch.il.gov/wpfb-file/01-24-12-police-and-fire-agenda-pdf-5/,Poor Data Source,Poor Data Source,"01-24-12 Police And Fire Agenda - Antioch, IL",13144 01 24 12 police and fire agenda pdf commissions commission agendas 2012 1625758258 b0e21da6b80d9f67c4c403d35dad9303 7e7aa0fe814a0af3daa3feb9bbf49ac8d0d6f1c32554399c92c72dff4c5a8f53 213x300 _moswe3wb2frl thumb jpg 2017 05 17 08 41 32 0 66 249 146 2021 06 28 15 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17 pagefailed_18,200,"Home - Antioch, IL","[""01-24-12 Police And Fire Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -709,https://bouldercolorado.gov/events/police-chief-town-hall-person-virtual-1,Contact Info & Agency Meta,Info About Agencies,Police Chief Town Hall (in person & virtual) | City of Boulder,"",200,Home | City of Boulder,"[""Police Chief Town Hall (in person & virtual)"", ""Boulder Police Department Virtual Town Halls""]","[""Breadcrumb"", ""Details"", ""Meeting Details"", ""More Resources""]",[],[],[],[],"Calendar Jobs Contact Us Search English 繁體中文 Français Deutsch 한국어 Русский Español नेपाली en Locations Services Projects Government News Toggle Menu City of Boulder Locations Services Projects Government News Calendar Jobs Contact Us Search Breadcrumb Home Events Police Chief Town Hall (in person & virtual) Canceled Details Date Wednesday, September 14, 2022 Time 5:00 PM - 6:00 PM Locations 1805 33rd Street Boulder , CO 80301 United States Boulder Police Department Virtual Town Halls These briefings will take place on the second Thursday rotating between a start time of 4 p.m. and 5 p.m. Add to Calendar Police Chief Town Hall (in person & virtual) America/Denver

Boulder, CO
-United States

MM/DD/YYYY CONFIRMED OPAQUE Meeting Details Advance registration is required. A meeting link will be posted in this event by the first of each month. Once you register for one meeting you will continue to automatically receive information about future meetings. Register for upcoming Police Chief Town Hall meetings More Resources About Police Department Town Halls Register for BPD Town Halls Inscríbase Para La Asamblea Pública Con La Policía De Boulder See All Events in Series Calendar Locations Services News Government Accessibility 1777 Broadway Boulder , CO 80302 Contact Us YouTube Twitter Facebook Instagram LinkedIn Nextdoor © 2024 City of Boulder. All Rights Reserved. Privacy Policy Calendar Jobs Contact Us Search English 繁體中文 Français Deutsch 한국어 Русский Español नेपाली en Locations Services Projects Government News Toggle Menu City of Boulder Locations Services Projects Government News Calendar Jobs Contact Us Search Breadcrumb Home Events Police Chief Town Hall (in person & virtual) Canceled Details Date Wednesday, September 14, 2022 Time 5:00 PM - 6:00 PM Locations 1805 33rd Street Boulder , CO 80301 United States Boulder Police Department Virtual Town Halls These briefings will take place on the second Thursday rotating between a start time of 4 p.m. and 5 p.m. Add to Calendar Police Chief Town Hall (in person & virtual) America/Denver

Boulder, CO
-United States

MM/DD/YYYY CONFIRMED OPAQUE Meeting Details Advance registration is required. A meeting link will be posted in this event by the first of each month. Once you register for one meeting you will continue to automatically receive information about future meetings. Register for upcoming Police Chief Town Hall meetings More Resources About Police Department Town Halls Register for BPD Town Halls Inscríbase Para La Asamblea Pública Con La Policía De Boulder See All Events in Series Calendar Locations Services News Government Accessibility 1777 Broadway Boulder , CO 80302 Contact Us YouTube Twitter Facebook Instagram LinkedIn Nextdoor © 2024 City of Boulder. All Rights Reserved. Privacy Policy " -710,https://florence-ky.gov/police-department-easter-drive-thru/,Not Criminal Justice Related,Not Criminal Justice Related,Police Department Easter Drive Thru - City of Florence,"",200,Home - City of Florence,"[""Police Department Easter Drive Thru""]","[""Recent News"", ""Florence Community Band Concerts"", ""City of Florence – Blood Drive"", ""Skyhawks Sports Camps coming to Florence this spring!"", ""Sign Up for Our Newsletter""]",[],[],[],[],"Our Government Our Government Mayor City Council City Clerk Ordinances Boards & Commissions Agendas and Minutes History Our Services Our Services Administration Finance Fire/EMS Police Public Services Recruitment Residents Residents Pay Water Bills Forms and Documents Community Events City of Florence Park Directory Nature Park Facilities & Park Shelter Reservations Boone/Florence Skate Park Deanna and Hugh Skees Senior Activity Center Florence Family Aquatic Center Florence Y'alls Homebuyer Assistance Program Businesses Businesses Forms and Documents Opening a Business Incentives Alcohol License Short Term Rentals Visitors Visitors Shopping Food & Drink Hotels Things To Do News Mayor Our Government Mayor City Council City Clerk Ordinances Boards & Commissions Agendas and Minutes History Our Services Administration Finance Fire/EMS Police Public Services Recruitment Residents Pay Water Bills Forms and Documents Community Events City of Florence Park Directory Nature Park Facilities & Park Shelter Reservations Boone/Florence Skate Park Deanna and Hugh Skees Senior Activity Center Florence Family Aquatic Center Florence Y'alls Homebuyer Assistance Program Businesses Forms and Documents Opening a Business Incentives Alcohol License Short Term Rentals Visitors Shopping Food & Drink Hotels Things To Do Less 8100 Ewing Boulevard Florence, KY 41042 859.371.5491 Path Our Government Mayor City Council City Clerk Ordinances Boards & Commissions Agendas and Minutes History Our Services Administration Finance Fire/EMS Police Public Services Residents Florence Family Aquatic Center Community Events City of Florence Park Directory Deanna and Hugh Skees Senior Activity Center Nature Park Facilities & Park Shelter Reservations Businesses Opening a Business Occupational Licenses Incentives Alcohol License Available Properties Visitors Shopping Food & Drink Hotels Things To Do News About 8100 Ewing Boulevard Florence, KY 41042 859.371.5491 Path Our Government Mayor City Council City Clerk Ordinances Boards & Commissions Agendas and Minutes History Our Services Administration Finance Fire/EMS Police Public Services Residents Florence Family Aquatic Center Community Events City of Florence Park Directory Deanna and Hugh Skees Senior Activity Center Nature Park Facilities & Park Shelter Reservations Businesses Opening a Business Occupational Licenses Incentives Alcohol License Available Properties Visitors Shopping Food & Drink Hotels Things To Do News About 8100 Ewing Boulevard Florence, KY 41042 859.371.5491 Path Path Our Government Mayor City Council City Clerk Ordinances Boards & Commissions Agendas and Minutes History Our Services Administration Finance Fire/EMS Police Public Services Residents Florence Family Aquatic Center Community Events City of Florence Park Directory Deanna and Hugh Skees Senior Activity Center Nature Park Facilities & Park Shelter Reservations Businesses Opening a Business Occupational Licenses Incentives Alcohol License Available Properties Visitors Shopping Food & Drink Hotels Things To Do News About Police Department Easter Drive Thru 04/01/2021 Police Department Easter Drive Thru 04/01/2021 Police Department Easter Drive Thru 04/01/2021 Recent News Florence Community Band Concerts 03/19/2024 City of Florence – Blood Drive 03/18/2024 Skyhawks Sports Camps coming to Florence this spring! 03/11/2024 Florence Community Band Concerts 03/19/2024 City of Florence – Blood Drive 03/18/2024 Skyhawks Sports Camps coming to Florence this spring! 03/11/2024 Florence Community Band Concerts 03/19/2024 Florence Community Band Concerts 03/19/2024 Florence Community Band Concerts 03/19/2024 03/19/2024 " -711,https://health.wyo.gov/healthcarefin/chip/kid-care-chip-copays/providers-handout-light/,Not Criminal Justice Related,Not Criminal Justice Related,Providers Handout light - Wyoming Department of Health,"",200,403 Forbidden,"[""Providers Handout light""]","[""Kid Care CHIP""]",[],[],"[""Contact Info:""]","[""Contact Us""]","" -712,https://chandlerazpd.gov/2015/02/chandler-police-department-offering-non-emergency-text-messaging/,Media Bulletins,Agency-Published Resources,Chandler Police Department Offering Non-Emergency Text Messaging – Chandler Police Department,"",200,Chandler Police Department,"[""Chandler Police Department Offering Non-Emergency Text Messaging""]",[],"[""Quick Links"", ""News Archives"", """", """", """", """"]","[""February 18, 2015"", ""Contact"", ""About the Department"", ""Latest News"", ""Courage, Pride, Dedication © 2024 Chandler Police Department""]",[],[],"The Chandler Police Department main lobby will be closed for renovations. Please see below for further. The Chandler Police Department main lobby will be closed for renovations. Please see below for further. Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Home Highlight Chandler Police Department Offering Non-Emergency Text Messaging Home Highlight Chandler Police Department Offering Non-Emergency Text Messaging Search for: Chandler Police Department Offering Non-Emergency Text Messaging February 18, 2015 By Sergeant J. Favazzo The Chandler Police Department recently deployed non-emergency text messaging capabilities in our communications center in an effort to provide our citizens with an alternative means to contact the department. While many people utilize text messages for every day communication, it is also useful for those who have difficulty communicating such as those who are deaf, hard of hearing, and those who have speech disabilities. Text messaging is also a quick and anonymous means of communication for those who do not feel comfortable or are simply unable to make a voice call. Providing non-emergency text messaging capabilities is also preparing our department and the community for the implementation of Next Generation 911, which provides text and video messaging to 911. It also allows operators to process information more expediently, handling voice calls and text messages simultaneously. Citizens who wish to communicate with the police department through text message may do so by sending a message to our non-emergency number (480) 782-4130. We ask that you state the location and nature of your request and be prepared to answer any follow up questions that the call taker or dispatcher may ask. Text to non-emergency is a complement to, not a substitute for, existing voice based services. So, if text messaging is unavailable citizens should make a voice call to contact the department. Text messaging is not available for 911 at this time. Citizens who are experiencing an emergency must still make a voice call to 911 for assistance. Search for: Quick Links About the Department Office of the Chief Interim Chief Of Police Melissa Deanda Assistant Chief Of Police Dave Ramer Department Events My Precinct Fingerprinting Services Request a Police Report Bicycle Registration General Orders/Accreditation Alarm Information Registered Sex Offenders Citizen Observer (Ride-Along) Vehicle Impounds Barking Dog Police Open Data Public Demonstration Guidelines News Archives August 2022 September 2021 July 2021 September 2020 August 2020 June 2020 May 2020 April 2020 March 2020 February 2020 January 2020 December 2019 " -713,http://www.longbeach.gov/police/press-releases/graduation-and-summer-break-safety-tips-1-/,Resources,Agency-Published Resources,GRADUATION AND SUMMER BREAK SAFETY TIPS(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -714,https://coloradosprings.gov/police-department/article/news/community-assistance-bank-robbery-suspects,Media Bulletins,Agency-Published Resources,"","",403,"","","","","","","","" -715,https://coloradosprings.gov/police-department/article/news/motorcyclist-identified-fountain-boulevard,Media Bulletins,Agency-Published Resources,Motorcyclist identified from Fountain Boulevard and Highway 24 bypass crash | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Motorcyclist identified from Fountain Boulevard and Highway 24 bypass crash""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -716,https://www.hickoryhillspd.us/2016/09/message-from-the-chief-of-police-2/,Media Bulletins,Agency-Published Resources,Message From The Chief of Police,"",200,"Error retrieving title: HTTPSConnectionPool(host='www.hickoryhillspd.us', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1129)')))","[""Message From The Chief of Police""]","["""", ""Post navigation""]",[],"[""Report a Concern"", ""Investigative Tip Line"", ""Hot Links"", ""Contact Information""]",[],[],"" -717,https://www.mass.gov/doc/01222016-dmf-scoping-meeting-scheduled-for-february-8-2016-potential-changes-to-summertime/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -718,https://police.birminghamal.gov/contacts/,Contact Info & Agency Meta,Info About Agencies,Contacts | Birmingham Police Department,"",200,"Home | Police Department - Birmingham, AL","[""Birmingham Police Department Commitment | Excellence | Integrity""]","[""Putting People First"", ""Contacts""]","[""Division/Precinct"", ""Address"", ""Phone Number""]","[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[],"Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Search Contacts Division/Precinct Address Phone Number Emergency Birmingham, AL 911 Non-Emergency Birmingham, AL 205-328-9311 Community Services Birmingham, AL 205-933-4175 Crimestoppers 2200 8th Avenue North Birmingham, AL 35203 205-254-7777 Central Headquarters 1710 1st Avenue North Birmingham, AL 35203 205-254-1700 Custody Services Division 425 6th Avenue South Birmingham, AL 35205 205-254-6369 North Precinct 2600 31st Avenue North Birmingham, Alabama 35207 205-254-2860 South Precinct 1320 19th Street South Birmingham, Alabama 35205 205-254-2793 East Precinct 600 Red Lane Road Birmingham, Alabama 35206 205-254-2685 West Precinct 2236 47th Street Ensley, Birmingham, AL 35208 205-254-2683 Vice Narcotics Birmingham, Alabama 205-254-6416 Airport Substation 5900 Airport Highway Birmingham, AL 35212 205-599-0517 Southwest Substation Birmingham, Alabama 205-426-2453 Internal Affairs Birmingham, Alabama 205-254-1745 BPD_IAD@birminghamal.gov Robbery/Homicide 1710 1st Ave North Birmingham, AL 35203 205-254-1764 Crimes Against Property 1710 1st Ave North Birmingham, AL 35203 205-254-1769 Police Academy 401 6th Ave South Birmingham, AL 35205 205-254-6356 Sgt. Heather Campbell, LGBTQ Liaison 1710 1st Ave North Birmingham, AL 35203 205-254-6459 Keaira Turner, Public Relations Manager 1710 1st Ave North Birmingham, AL 35203 205-279-8937 1710 1st Ave North Birmingham, AL 35203 Webmaster 1710 1st Ave North Birmingham, AL 35203 BPDSuggestions@birminghamal.gov This website is not monitored 24 hours a day. Please call 911 for emergencies. This agency provides 24-hour, toll-free voice and TDD telephone access or an equivalent system for emergency calls for service. Police Headquarters 1710 1st Avenue North Birmingham, AL 35203 (205) 254-1700 " -719,https://sanramon.ca.gov/police/victim,Resources,Agency-Published Resources,Victim's Rights Information - City of San Ramon,"",200,Just a moment...,"[""Victim's Rights Information""]","[""Contact Us"", ""Victim's Rights"", ""Contact Us"", ""Useful Links""]",[],[],[],[],"" -720,https://delcopa.gov/ich/resources/covid19/pdf/contactidentification.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -721,https://delcopa.gov/publicrelations/releases/2022/delcolaunchesfreefraudsleuthsoftwaretohelpfightpropertyfraud.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Launches Free FraudSleuth® Software to Help Residents Fight Property Fraud - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Launches Free FraudSleuth® Software to Help Residents Fight Property Fraud""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -722,https://spdblotter.seattle.gov/2022/08/26/police-investigating-fatal-shooting-on-aurora/,Media Bulletins,Agency-Published Resources,Police Investigating Fatal Shooting on Aurora - SPD Blotter,"",200,403 Forbidden,"[""Police Investigating Fatal Shooting on Aurora""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -723,http://www.lafayettepolice.us/faq.aspx?qid=247,Training & Hiring Info,Info About Officers,FAQs • What are the age requirements to be hired with the LP,"",200,"Police Department | Lafayette, IN - Official Website",[],"[""▼ Police Employment FAQs""]","[""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -724,https://covington.va.us/city-government/city-departments/police/police-patrol/tfrydare/,Misc Police Activity,Police & Public Interactions,Tfrydare - Covington City,"",200,Home - Covington City,"[""Tfrydare""]","[""TOP ONLINE LINKS""]","[""Leave a Comment""]",[],[],[],Home About Covington Events Calendar Area Attractions Schools Census QuickFacts Directions to City Hall History Maps District Map GIS Maps Street Map Google Map Videos Freedom of Information Act Privacy Policy & Disclaimer Report A Concern Photo Gallery City Government Calendar City Council Agendas & Minutes City Code District Map Financial Information City Services City Departments Central Accounting City Manager City Attorney City Clerk Treasurer Finance & Human Resources Commissioner of Revenue Development Services Wastewater Treatment Water Plant Cedar Hill Cemetery Public Works Police Police Administration Police Patrol Police E911 Fire EMS Registrar Housing Authority Parks & Recreation FAQ’s Download Forms Organizational Chart Small Business Coordinator Joint Services Alleghany Highlands Regional Library Clerk of Court Commonwealth Attorney Cooperative Extension Office Health Department Sheriff Social Services Area Schools City Projects for Bid Employment Monthly Financial Summary July 2019 Financial Summary Community Info Area Links Alleghany Highlands Regional Library Alleghany Foundation Area Governments Alleghany County Bath County Clifton Forge Banks Boys Home Churches Entertainment & Leisure Health Alleghany Regional HCA VA Alleghany Highlands Community Services Housing Authority Lodging News & Radio Realtors Recycling Restaurants Senior Navigator Overnight Package Delivery Transportation Live Well Utilities Industrial Development WestRock Economic Development AHEDC Chamber of Commerce Olde Town Covington Roanoke Regional Partnership Roanoke Valley Alleghany Regional Commission Industrial/Real Estate Properties The Advancement Foundation Home About Covington Events Calendar Area Attractions Schools Census QuickFacts Directions to City Hall History Maps District Map GIS Maps Street Map Google Map Photo Gallery Videos Freedom of Information Act Privacy Policy & Disclaimer Report A Concern City Government Calendar City Council City Services City Departments Cedar Hill Cemetery Central Accounting City Manager City Attorney City Clerk Treasurer Finance & Human Resources Commissioner of Revenue Development Services Wastewater Treatment Water Plant Public Works Police Police Administration Police Patrol Police E911 Fire EMS Registrar Housing Authority Parks & Recreation FAQ’s Joint Services Alleghany Highlands Regional Library Clerk of Court Commonwealth Attorney Cooperative Extension Office Health Department Sheriff Social Services Area Schools City Code Agendas & Minutes Financial Information District Map Organizational Chart Download Forms City Projects for Bid Employment Monthly Financial Summary July 2019 Financial Summary Community Info Area Links Alleghany Highlands Regional Library Alleghany Foundation Area Governments Alleghany County Bath County Clifton Forge Banks Boys Home Churches Entertainment & Leisure Health Alleghany Regional HCA VA Alleghany Highlands Community Services Housing Authority Lodging News & Radio Realtors Recycling Restaurants Senior Navigator Overnight Package Delivery Transportation Utilities Industrial Development WestRock Live Well Economic Development AHEDC Chamber of Commerce Olde Town Covington Roanoke Regional Partnership Roanoke Valley Alleghany Regional Commission Industrial/Real Estate Properties The Advancement Foundation Tfrydare Leave a Comment You must be logged in to post a comment. TOP ONLINE LINKS DOWNLOAD FORMS BUDGET PROCESS COVID-19 HEALTH PLAN CITY DIRECTORY MONTHLY FINANCE SUMMARY CITIES COMPREHENSIVE PLAN JOINT SCHOOL SERVICES FAQ'S © 2024 Covington City. All Rights Reserved. Website by COV Designs -725,https://www.sandiego.gov/department-document/copy-resolution-no-79288,Not Criminal Justice Related,Not Criminal Justice Related,"","",404,"","","","","","","","" -726,http://police.portlandmaine.gov/668/finance-committee,Not Criminal Justice Related,Not Criminal Justice Related,"Finance Committee | Portland, ME - Official Website",The Finance Committee reviews the city manager’s recommended operating and capital budgets and the school superintendent’s operating budget and makes recommendations to the City Council regarding those budgets.,200,"Portland, ME - Official Website | Official Website","[""Finance Committee""]",[],[],[],[],[],Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Council Committees Finance Committee Finance Committee Ad Hoc Rules Committee Ethics Committee Finance Committee Health & Human Services & Public Safety Committee Housing & Economic Development Committee Legislative / Nominating Committee Sustainability & Transportation Committee Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Council Committees Finance Committee Finance Committee Ad Hoc Rules Committee Ethics Committee Finance Committee Health & Human Services & Public Safety Committee Housing & Economic Development Committee Legislative / Nominating Committee Sustainability & Transportation Committee Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Council Committees Finance Committee Finance Committee Ad Hoc Rules Committee Ethics Committee Finance Committee Health & Human Services & Public Safety Committee Housing & Economic Development Committee Legislative / Nominating Committee Sustainability & Transportation Committee Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Council Committees Finance Committee Finance Committee Ad Hoc Rules Committee Ethics Committee Finance Committee Health & Human Services & Public Safety Committee Housing & Economic Development Committee Legislative / Nominating Committee Sustainability & Transportation Committee Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Council Committees Finance Committee Finance Committee Ad Hoc Rules Committee Ethics Committee Finance Committee Health & Human Services & Public Safety Committee Housing & Economic Development Committee Legislative / Nominating Committee Sustainability & Transportation Committee Home Your Government Boards & Committees Council Committees Finance Committee Finance Committee Ad Hoc Rules Committee Ethics Committee Finance Committee Health & Human Services & Public Safety Committee Housing & Economic Development Committee Legislative / Nominating Committee Sustainability & Transportation Committee Home Your Government Boards & Committees Council Committees Finance Committee Finance Committee Ad Hoc Rules Committee Ethics Committee Finance Committee Health & Human Services & Public Safety Committee Housing & Economic Development Committee Legislative / Nominating Committee Sustainability & Transportation Committee Home Your Government Boards & Committees Council Committees Finance Committee Finance Committee Home Your Government Boards & Committees Council Committees Finance Committee Finance Committee Home Your Government Boards & Committees Council Committees Finance Committee Finance Committee Finance Committee Ad Hoc Rules Committee Ethics Committee Finance Committee Health & Human Services & Public Safety Committee Housing & Economic Development Committee Legislative / Nominating Committee Sustainability & Transportation Committee Ad Hoc Rules Committee Ethics Committee Finance Committee Health & Human Services & Public Safety Committee Housing & Economic Development Committee Legislative / Nominating Committee Sustainability & Transportation Committee Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® -727,http://www.police.wallingfordct.gov/divisions/records-division/,Records Request Info,Agency-Published Resources,"Records Division | Wallingford, CT Police Department","The WPD's Records Division is responsible for maintaining investigatory reports, evidence, found property and criminal history information.",200,"Wallingford, CT Police Department","[""Records Division""]","[""The Records Division is Responsible For:"", ""Records Division Members""]",[],[],[],[],"‹ Close Menu About Us Our Team Who We Serve Our History Police Station Project Divisions Records Division Traffic Division Investigative Services Division Professional Standards & Training Division Patrol Division Community Impact Unit Public Safety Communications Center Emergency Response Team Field Training & Evaluation Program How Do I? Pistol Permits Fingerprinting Accident Reports Case Reports Traffic Violations Pay a Parking Ticket Hire a Cop Alarm Registration Careers Current Employment Opportunities Forms & Resources Bingo, Bazaar & Raffle Documents Precious Metal Application Secondhand Application Pawnbroker Application Vending Application News & Events Road Closures & Detours Agency Events & Programs Press Releases Photo Gallery Video Gallery Wallingford PBA Contact Records Division Records Division The Records Division is a special service support function of the Wallingford Police Department staffed with a Division Commander, who is a Lieutenant, a court officer, a property officer, and clerical support staff. Records Division Tel: (203) 294-2810 Fax Number: (203) 294-2874 Email: reports@wallingfordpd.org Office Hours: Mon thru Fri, 8 am - 4 pm The Records Division is Responsible For: Serving as the repository for the records of the department and maintains investigatory reports, evidence, found property and criminal history information Disseminating any records-related information from the Wallingford Police Department Creating and disseminating NIBRS/UCR reports Processing and issuing various state and municipal permits The administration of the Town of Wallingford’s parking ticket program Public fingerprinting The Records Division is delegated with the responsibility and authority necessary to protect the privacy and physical security of all department records and ensures that the department complies with all state and federal regulations concerning the retention and destruction of department records. Records Division Members Supervisor: Lieutenant Stacy Sacharko Officers: Court Officer Andrew Decusati Evidence Officer John Newberry Records Clerks: Clerk Deborah Sigmon Clerk Jennifer Fanton Clerk Mary Kris Ryan Records Division Traffic Division Investigative Services Division Professional Standards & Training Division Patrol Division Community Impact Unit Public Safety Communications Center Emergency Response Team Field Training & Evaluation Program " -728,https://rocklandmaine.gov/events/police-review-committee-meeting-14/,Not Criminal Justice Related,Not Criminal Justice Related,"Police Review Committee Meeting | The City of Rockland, Maine","Monday, 13 June 2022 - 430pm Zoom Meeting Link - https://us02web.zoom.us/j/5040315241?pwd=eFhHaWJ4ZmhNakRmQ0VIQko4VmlKUT09 Facilitator: Emily Note Taker: Angela",200,403 Forbidden,"[""Police Review Committee Meeting"", ""Police Review Committee Meeting""]",[],"[""All Current Alerts & Announcements"", ""Current Weather"", ""Date"", ""Time"", ""Leave a Comment Cancel reply"", ""City of Rockland""]",[],[],[],"All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Current Weather Now loading... All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Current Weather Now loading... All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Current Weather Now loading... All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! " -729,https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-3/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -731,"https://norfolkne.gov/government/departments/police-division/press-releases/january-12,-2022-press-release.html",Media Bulletins,Agency-Published Resources,"January 12, 2022 Press Release - City of Norfolk, NE","",200,"Welcome to Norfolk, NE - City of Norfolk, NE","[""City of Norfolk, NE"", ""Police Division"", ""January 12, 2022 Press Release"", ""City of Norfolk, NE""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]","" -732,https://dagsboro.delaware.gov/wp-content/blogs.dir/106/files/police-department/newpolicecars2008-001.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -733,https://www.ashevillenc.gov/news/asheville-police-be-a-connection-for-children-during-child-abuse-prevention-month/,Resources,Agency-Published Resources,ERROR: The request could not be satisfied,"",200,The City of Asheville - Your Asheville,"[""403 ERROR""]","[""The request could not be satisfied.""]",[],[],[],[],"" -734,https://policeanalysis.tucsonaz.gov/items/9fb161581d264cf99cc9e6da47dafa36,Poor Data Source,Poor Data Source,Tucson Police Data & Analysis,"As part of our commitment to transparency and accountability, the Tucson Police Department is empowering community members to explore and download policing data.",200,Tucson Police Data & Analysis,[],[],[],[],[],[],"" -735,https://www.clintonvillewi.gov/government/departments/police/use_of_force_policies,Policies & Contracts,Info About Agencies,Use of Force Policies - City of Clintonville,"",200,Just a moment...,"[""City of Clintonville Trucker Pride"", ""USE OF FORCE POLICY USE OF LESS LETHAL WEAPONS POLICY USE OF DEADLY FORCE POLICY""]","[""Use of Force Policies""]","[""City of Clintonville"", ""City Hall Hours of Operation""]",[],[],[],"" -736,https://www.auburnwa.gov/city_hall/police/community_programs/crime_prevention/crime_prevention_through_environmental_design,Resources,Agency-Published Resources,"","",404,"","","","","","","","" -737,https://www.newhopemn.gov/city_hall/police_department/community_services_crime_prevention,Resources,Agency-Published Resources,Community Services & Crime Prevention - City of New Hope,"",200,Just a moment...,"[""City of New Hope"", ""City of New Hope Minnesota""]","[""Community Services & Crime Prevention"", """", ""Annual Bike Rodeo"", ""Prevent Bike Theft""]","[""Contact:""]",[],[],[],"" -738,https://www.gurnee.il.us/events/2022/05/12/default-calendar/police-department-blood-drive,Misc Police Activity,Police & Public Interactions,Gurnee Police Department Blood Drive,"",200," - Village of Gurnee -","[""Events"", ""Events View Calendar""]","[""Gurnee Police Department Blood Drive""]","[""Village Hall""]",[],[],[],search edit file-word file-empty angle-left angle-right angle-up angle-down dollar calendar-check-o printer search2 briefcase circle-up circle-right circle-down circle-left share2 mail4 facebook twitter youtube file-pdf search edit file-word file-empty angle-left angle-right angle-up angle-down dollar calendar-check-o printer search2 briefcase circle-up circle-right circle-down circle-left share2 mail4 facebook twitter youtube file-pdf -739,https://delcopa.gov/courts/pretrialbail.html,Contact Info & Agency Meta,Info About Agencies,Bail Agency/Pre-Trial Bail - Delaware County Court of Common Pleas,"",200,"Delaware County, Pennsylvania","[""Bail Agency/Pre-Trial Bail""]",[],"[""Mission Statement"", ""Bail Agency Procedures"", ""Video Teleconferencing"", ""Pre-Trial Services"", ""Hearings"", ""Veterans Court"", ""Technology Databases"", ""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[],"" -740,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2017_archived_news/january_2017/citizens_can_help_police_keep_neighborhoods,Media Bulletins,Agency-Published Resources,Citizens Can Help Police Keep Neighborhoods Safe Through Dog Walker Watch Program - City of Arlington,"",200,Just a moment...,"[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Citizens Can Help Police Keep Neighborhoods Safe Through Dog Walker Watch Program""]","[""Dog Walker Watch Training Schedule""]",[],[],[],Skip to Content Skip to Content -741,http://www.longbeach.gov/police/press-releases/traffic-fatality-7th-and-santiago/,Poor Data Source,Poor Data Source,TRAFFIC FATALITY 7TH AND SANTIAGO,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/17/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Saturday, July 16, 2016, at approximately 6:42 p.m., Long Beach Police were dispatched to 7th Street and Santiago Avenue regarding an injury traffic collision involving two vehicles. At approximately 6:57 p.m., while officers were investigating the incident, a second collision occurred in the same intersection, which resulted in the death of a male adult. Upon hearing the second collision, officers discovered an unconscious motorcyclist lying in the middle of the intersection, behind a vehicle. Long Beach Fire Department paramedics, who were already on scene, transported the motorcyclist to a local hospital where he succumbed to his injuries. The preliminary investigation revealed a 2013 Volvo S60, being driven by a 36-year-old female resident of Beverly Hills, was traveling westbound on 7th Street. The driver stopped in the intersection in the left turn lane and waited to complete the turn. While the vehicle was stopped, a Long Beach Fire engine which was responding to the original collision, and traveling southbound Santiago Avenue, approached the intersection. According to witnesses, the fire engine arrived at the intersection with its red lights and siren activated. The traffic control light had cycled to yellow and the driver, who observed eastbound traffic stopping for the light, began to turn to move out of the way for the fire engine when the motorcycle broadsided the vehicle. At the time of the collision, a 28-year-old male resident of Long Beach was riding a 2003 Triumph Bonneville motorcycle and traveling eastbound on 7th Street. The Los Angeles County Coroner will notify next of kin and release the victim’s identity. Anyone with information regarding this incident is asked to contact Detective Steve Fox of the Collision Investigation Detail at (562) 570-7355. Anyone wishing to remain anonymous, may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -742,https://police.bixbyok.gov/faq.aspx?qid=107,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • What times is Bixhoma Lake open?,"",200,"Bixby Police Department, OK | Official Website",[],"[""▼ Parks-Lake Bixhoma""]","[""Categories"", ""Live Edit"", ""Helpful Links"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -743,https://www.coronadelmar.us/nb-police-department-says-drive-sober-or-get-pulled-over/,Poor Data Source,Poor Data Source,NB Police Department Says ‘Drive Sober or Get Pulled Over’ | Corona del Mar California,"",200,Corona del Mar California,"[""NB Police Department Says ‘Drive Sober or Get Pulled Over’""]","[""Menu"", ""Be First to Comment"", ""Subscribe"", """", """"]","[""Share this:"", ""Like this:"", ""Related"", ""Leave a Reply Cancel reply"", """"]",[],[],[],"" -744,https://spdblotter.seattle.gov/2016/03/31/police-investigating-two-overnight-shootings-in-rainier-valley/,Media Bulletins,Agency-Published Resources,Police Investigating Two Overnight Shootings In Rainier Valley - SPD Blotter,"",200,403 Forbidden,"[""Police Investigating Two Overnight Shootings In Rainier Valley""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -745,http://www.longbeach.gov/police/press-releases/police-seek-additional-indecent-exposure-victims-1-/,Media Bulletins,Agency-Published Resources,POLICE SEEK ADDITIONAL INDECENT EXPOSURE VICTIMS(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/3/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: POLICE SEEK ADDITIONAL INDECENT EXPOSURE VICTIMS Contact: Media Relations Detail (562) 570-5273 Suspect Ryan McClain On October 2, 2015, Long Beach Police arrested a suspect on an indecent exposure warrant. Detectives believe additional victims may exist and hope they will come forward. From May 2015 through September 2015, the police department received several calls from residents in the area of Cherry Avenue and 3rd Street regarding a male subject exposing himself. Victims reported a suspect entered the apartment courtyard after he broke the entry gate lock. During the night, the suspect would stand in front of the victims’ windows as he masturbated, then fled utilizing surrounding alleys to escape. Officers increased area patrols in attempts to locate the suspect. On September 24, 2015, West Division officers located a suspicious person lurking in an alley and forwarded the information to detectives as the investigation intensified. Through their investigation, detectives were able to identify the suspect as 24-year-old Ryan McClain of Long Beach. Detectives presented their case to the Long Beach City Prosecutor’s Office for filing consideration. The City Prosecutor’s Office filed the case and issued a warrant for McClain’s arrest. On October 2, 2015, East Division Directed Enforcement Officers located McClain in the area of Broadway and Cherry Avenue and took him into custody on the outstanding warrant. Ryan McClain is currently being held at Los Angeles County Jail on $75,000 bail, pending arraignment. The investigation is ongoing and detectives are attempting to identify additional victims. Anyone who has been a victim and has not yet reported the incident to police, or anyone who has information regarding this case, is encouraged to contact Long Beach Police Special Victims Section Detectives Stacey Holdredge and Patrick Jennings at (562) 570-7368. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -746,https://delcopa.gov/vote/pdf/2022/mail-in-ballot-application_delco(spanish).pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -747,https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-27/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -748,https://cityofpowell.us/police-agency/traffic-surveys/ridge-side-dr/,Not Criminal Justice Related,Not Criminal Justice Related,"City of Powell, Ohio | Ridge Side Dr","",200,"City of Powell, Ohio","[""Ridge Side Dr""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -749,https://www.mass.gov/doc/walpolepolicelieutenant6835rtf/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -750,http://lafayettepolice.us/826/fire-blocking,Not Criminal Justice Related,Not Criminal Justice Related,"Fire Blocking | Lafayette, IN - Official Website","In combustible construction, fire blocking shall be installed to cut off concealed draft openings (both vertical and horizontal) and shall form an effective barrier between floors, between a top story and a roof or attic space.",200,"Police Department | Lafayette, IN - Official Website","[""Fire Blocking""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Operations Prevention Recruitment How Do I... Home Government Departments A - F Fire Department Prevention Contractors & Designers Resources & Inspections Fire Blocking Fire Blocking Fire blocking is not synonymous with fire stopping. In combustible construction, fire blocking shall be installed to cut off concealed draft openings (both vertical and horizontal) and shall form an effective barrier between floors, between a top story and a roof or attic space. Fire blocking shall be installed in the locations specified in Sections 717.2.2 through 717.2.7 of the Indiana Building Code. Fire blocking is found in non fire-rated wood construction assemblies. Where to Install Fire blocking shall be installed at openings around vents, pipes, ducts, chimneys and fireplaces at ceiling and floor levels, with an approved material to resist the free passage of flame and the products of combustion. Factory-built chimneys and fireplaces shall be fire blocked in accordance with UL 103 and UL 127. In wood-frame construction, fire blocking should be provided in the following locations: Penetrations in the stud walls and partitions at the top plate and floor level (multilevel); Horizontal communication, within a wall, at 10 foot intervals Interconnections between concealed spaces that occur at soffits, drop or cove ceilings; Concealed spaces between stair stringers at the top and bottom of run; Penetrations Penetrations of fire blocking - refer to the Indiana Building Code, Penetrations - 712.4.2 Non-fire-resistance-rated assemblies When a fire block is penetrated for the trades to run their wires, pipes, and other mechanical penetrating items, the integrity of the wood fire blocks is compromised and they must be protected with a material that is equal to or greater than the burn time of the blocking material. The integrity of fire blocks shall be maintained. Material Needed Using a material that meets ASTM-E 136 test criteria fulfills the code requirements for fire blocking penetrations because the material is tested and is equivalent in performance to the fire blocking material. Material tested in accordance with ASTM-E 84 and ASTM-E 814 may also maintain the integrity of the fire blocking. (Fire caulk used as a fire blocking material is acceptable) Verification of the material should been done prior to installation. Review with the AHJ. Spray-Foam Insulation Community Outreach Fire Stations Submit a Request History Photo Gallery Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -751,https://spdblotter.seattle.gov/2021/05/04/police-arrest-two-felons-in-stolen-car-with-drugs-and-gun-in-cid/,Media Bulletins,Agency-Published Resources,"Police Arrest Two Felons in Stolen Car with Drugs, and Gun in CID - SPD Blotter","",200,403 Forbidden,"[""Police Arrest Two Felons in Stolen Car with Drugs, and Gun in CID""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -752,https://delcopa.gov/planning/demodata/ridleyparkborough.html,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -753,https://chandlerazpd.gov/police-leadership/chris-perez/,Personnel Records,Info About Officers,Chris Pérez – Chandler Police Department,"",200,Chandler Police Department,"[""Commander Chris Pérez""]",[],"[""Quick Links"", ""Police Administration"", ""Police Leadership"", """", """", """", """"]","[""Contact"", ""About the Department"", ""Latest News"", ""Courage, Pride, Dedication © 2024 Chandler Police Department""]",[],[],The Chandler Police Department main lobby will be closed for renovations. Please see below for further. The Chandler Police Department main lobby will be closed for renovations. Please see below for further. Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Home Police Leadership Chris Pérez Home Police Leadership Chris Pérez -754,https://www.stpaul.gov/departments/police/level-ii-notifications,Resources,Agency-Published Resources,Level II Notifications | Saint Paul Minnesota,Thank you for your request Thank you for submitting your request to receive notification regarding offenders assigned to risk level II. A confirmation emai,200,Home | Saint Paul Minnesota,"[""Level II Notifications""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Footer""]","[""You are using an unsupported browser. Please use Microsoft Edge."", ""Contact The City"", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[],"" -755,https://www.mass.gov/doc/plaza-justiniano-v-boston-police-department-related-superior-court-decision-81909/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -756,https://council.seattle.gov/2014/05/22/police-chief-confirmation-schedule-updated/,Not Criminal Justice Related,Not Criminal Justice Related,Police Chief confirmation schedule updated - Seattle City Council Blog,"",200,403 Forbidden,"[""Police Chief confirmation schedule updated""]",[],"[""HELPFUL LINKS"", ""Make your voice heard"", ""Councilmembers""]",[],[],[],"Home News Press Releases Video Councilmembers Rob Saka Tammy J. Morales Joy Hollingsworth Maritza Rivera Cathy Moore Dan Strauss Robert Kettle Tanya Woo Sara Nelson Councilmembers (2022-2024) About Police Chief confirmation schedule updated Home » Police Chief confirmation schedule updated Councilmember Harrell , News Releases May 22, 2014 January 6, 2023 By City Council News Releases FOR IMMEDIATE RELEASE: 5/22/2014 Councilmember Bruce Harrell Police Chief confirmation schedule updated SEATTLE – Councilmember Bruce Harrell , chair of the Council’s Public Safety, Civil Rights and Technology Committee , announced an updated Police Chief confirmation timeline today: Wednesday, June 4, 2:00 p.m. in Council Chambers Public Safety, Civil Rights, and Technology Committee Kathleen O’Toole will appear, make opening comments, and respond to initial questions from Councilmembers. Public comment will be accepted at the beginning of the meeting. Wednesday, June 11, 5:30 p.m. at offsite neighborhood location, TBD Public Safety, Civil Rights, and Technology Committee Public Hearing on appointment Thursday, June 12, 3:00 p.m. in Council Chambers Kathleen O’Toole will appear and complete final round of questioning from Councilmembers. Public Safety, Civil Rights, and Technology Committee will vote on confirmation . Monday, June 23, 2:00 p.m. in Council Chambers Full Council Final Action on Confirmation Public Safety, Civil Rights, and Technology Chief of Police Webpage Statement by Councilmember Harrell on Mayor’s appointment of Kathleen O’Toole as Chief of Police released on Monday, May 19 . [View in Council Newsroom] HELPFUL LINKS Meet the Council Mayor’s Office Council Calendar Council Agendas Council Committees Watch Council Live Make your voice heard Find Your Council District Contact the Council Sign up for Public Comment Register to Vote Councilmembers Rob Saka Tammy J. Morales Joy Hollingsworth Maritza Rivera Cathy Moore Dan Strauss Robert Kettle Teresa Mosqueda Sara Nelson The official blog of the Seattle City Council " -757,http://www.longbeach.gov/police/press-releases/traffic-fatality9/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/3/2018 FOR IMMEDIATE RELEASE Press Release # 2018 Subject: TRAFFIC FATALITY - WEST SHORELINE DRIVE Contact: Media Relations Detail (562) 570-5273 On Wednesday, May 2, 2018, at approximately 4:45 p.m., officers from the Long Beach Police Department were dispatched to the area of the northbound 710 freeway at the West 9th Street exit regarding an injury traffic collision. When officers arrived on scene it was determined that collision occurred on West Shoreline Drive just north of the 7th Street on ramp. Upon arrival officers found the driver had been ejected from the vehicle and was lying in the roadway just north of his vehicle. There were no other occupants in the vehicle. Long Beach Fire personnel responded and determined the driver deceased at the scene. The preliminary investigation revealed that a 39-year-old male resident of Long Beach was driving a 2009 Kia Sportage SUV north on West Shoreline Drive at a high rate of speed. As the road veered to the left, the driver continued straight and struck the curb at the gore point where 6th Street merges onto West Shoreline Drive. The contact with the curb caused his front right tire to go flat and the vehicle overturned tumbling twice before landing on it’s wheels and ejecting the driver who was not seat-belted. The driver had a valid driver’s license and it is unknown if drugs or alcohol were a factor in the collision. Anyone with information regarding the collision are asked to contact Detective S. Fox of the Long Beach Police Department Collision Investigation Detail at (562) 570-7355. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -758,https://www.mass.gov/doc/cordeiro-jeffrey-v-boston-police-department-related-superior-court-decision-13111/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -759,https://www.stcharlesil.gov/departments/police/overview/tactical-response-unit-tru,Contact Info & Agency Meta,Info About Agencies,"Tactical Response Unit (TRU) | City of St Charles, IL","In late 2007 the Police Department merged its Tactical Response Unit (TRU) with the Kane County Sheriff's Office Special Weapons and Tactics (SWAT) team. The TRU had been operating since 1994; it successfully handled such high-profile cases as the Halloween shooting of trick-or-treaters in 2003, as well as high-risk incidents such as barricaded subjects, hostages, and",200,"City of St. Charles, Illinois","[""City of St. Charles, Illinois"", ""Tactical Response Unit (TRU)""]","[""You are here"", ""Police Department"", ""Key Resources"", ""Connect With Us""]",[],[],[],[],"" -760,https://southamptontownnypolice.gov/206/printable-permit-applications,Not Criminal Justice Related,Not Criminal Justice Related,"Printable Permit Applications | Southampton, NY - Official Website",View an explanation of different permits and how you can apply for them.,200,"Police | Southampton, NY - Official Website","[""Printable Permit Applications""]","[""Explanation of Permits""]","[""Site Tools"", ""Contact Us"", ""Charles McArdle"", ""Hours"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -761,https://coloradosprings.gov/police-department/article/news/colorado-springs-police-department-0,Not Criminal Justice Related,Not Criminal Justice Related,Colorado Springs Police Department recognized for prestigious interactive media award | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Colorado Springs Police Department recognized for prestigious interactive media award""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]","[""About the Horizon Interactive Awards""]",[],"[""REPORT ONLINE""]",[],"" -762,https://www.clermontpolice.in.gov/post/traffic-alert-town-parade,Media Bulletins,Agency-Published Resources,Traffic Alert: Town Parade,"",200,HOME | Clermont Police,[],[],[],[],[],[],"" -763,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/august-17-activity-report/,Annual & Monthly Reports,Info About Agencies,August 17 Activity Report - Town of Cheswold,"",200,"Home - Town of Cheswold - Kent County, Delaware","[""Cheswold""]","[""Delaware"", ""August 17 Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[],"Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Cheswold Delaware Listen August 17 Activity Report August 17 Activity Report Cheswold Delaware Listen August 17 Activity Report August 17 Activity Report Listen August 17 Activity Report August 17 Activity Report Listen August 17 Activity Report August 17 Activity Report Listen August 17 Activity Report August 17 Activity Report Listen Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form " -764,https://cityofvanalstyne.us/departments/police/emergency-preparedness/,Resources,Agency-Published Resources,"Emergency Preparedness – CodeRED – City of Van Alstyne, Texas","",200,"City of Van Alstyne, Texas – Official Government Site – City of Van Alstyne, Texas","[""Emergency Preparedness – CodeRED""]","[""Seconds Count in an Emergency"", ""Are you in the Database?"", ""VAN ALSTYNE POLICE"", ""MORE VAPD NEWS ON OUR FACEBOOK PAGE:"", ""Contact VAPD:"", ""REACHING CITY HALL:""]",[],"[""For Emergencies Call 9-1-1""]",[],[],NEWS City Events Library VAFD VAPD YouTube NEWS City Events Library VAFD VAPD YouTube NEWS City Events Library VAFD VAPD YouTube Menu MENU MENU About Community Links Demographics Economic Development Facilities Community Center Senior Center Location Schools Departments City Manager City Manager's Report Human Resources – Careers City Secretary Elections Open Records Requests Finance Budget Financial Transparency Local Taxes Unclaimed Property Utilities Trash Service Recycling Utility Billing Pay your Water Bill Water/Wastewater Rates Development Services Planning Building & Permitting Code Compliance / Animal Control Engineering Public Works Streets & Bridges Streetlights Water Conservation Plan More... Parks and Recreation Parks and Facilities Events Recreation Staff More ... Library Library Cards Location & Hours FAQs Services & Programs More... Fire and EMS Controlled Burn Inspections Pay my Ambulance Bill VAFD Employment More... Police Communications Submit a Code Violation Complaint Submit a Crime Tip Request Reports More... Municipal Court Court Appearances Court Dates Court Location Resolve my Citation More... Government Council Meetings City Council Agendas and Minutes Council Members Mayor Charter Commission Ordinances Open Government Public Notices and Hearings Boards & Commissions Apply to Serve on a Board How do I? Resident Business Calendar Contact MENU MENU About Community Links Demographics Economic Development Facilities Community Center Senior Center Location Schools Departments City Manager City Manager's Report Human Resources – Careers City Secretary Elections Open Records Requests Finance Budget Financial Transparency Local Taxes Unclaimed Property Utilities Trash Service Recycling Utility Billing Pay your Water Bill Water/Wastewater Rates Development Services Planning Building & Permitting Code Compliance / Animal Control Engineering Public Works Streets & Bridges Streetlights Water Conservation Plan More... Parks and Recreation Parks and Facilities Events Recreation Staff More ... Library Library Cards Location & Hours FAQs Services & Programs More... Fire and EMS Controlled Burn Inspections Pay my Ambulance Bill VAFD Employment More... Police Communications Submit a Code Violation Complaint Submit a Crime Tip Request Reports More... Municipal Court Court Appearances Court Dates Court Location Resolve my Citation More... Government Council Meetings City Council Agendas and Minutes Council Members Mayor Charter Commission Ordinances Open Government Public Notices and Hearings Boards & Commissions Apply to Serve on a Board How do I? Resident Business Calendar Contact MENU MENU MENU MENU MENU MENU -765,https://beaumonttexas.gov/beaumont-police-investigating-aggravated-assault-400-block-of-giles/,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -766,https://champaignil.gov/2022/02/20/champaign-police-investigating-overnight-battery-shooting/,Media Bulletins,Agency-Published Resources,"Champaign Police Investigating Overnight Battery, Shooting - City of Champaign","",200,403 Forbidden,"[""Champaign Police Investigating Overnight Battery, Shooting""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Champaign Police Investigating Overnight Battery, Shooting Search Posted on February 20, 2022 On February 20, 2022, at approximately 1:47 a.m., Champaign Police responded to the 200 block of West Clark Street for a report of a battery, followed by shots fired. Upon arrival, officers learned of a fight that left a 41-year-old male injured and discovered evidence of gunfire. Soon thereafter, officers learned a 27-year-old male arrived at a local hospital by personal transport with a non-life-threatening gunshot wound to his leg. The preliminary investigation indicates a physical altercation occurred and may have escalated into the incident of shots fired. There is presently no property damage reported from the incident. Any resident or business in the nearby area with exterior surveillance camera systems is encouraged to notify the police department. It is believed video footage may be of investigative assistance. No arrests have been made at this time and the investigation is ongoing. Future updates may be provided as they become available. Champaign Police ask that anyone who has additional information to please contact police at 217-351-4545. Arrangements can be made for information to be shared privately. Anyone wishing to remain anonymous may also submit tips to Crime Stoppers by phone at: 217-373-8477 (TIPS); online at 373tips.com; or the “P3 Tips” mobile app. Citizens are reminded that information submitted to Crime Stoppers is completely anonymous. Calls are routed to a third-party national call center that receives your information, completes a tips information form, and then passes the information to the appropriate law enforcement agency. Caller ID tracking is not utilized by Crime Stoppers and conversations are not recorded. Crime Stoppers will pay a reward of $1,000 for information leading to the arrest of the person(s) responsible for this crime. Categories: Police Department Press Releases Tags: Battery , cpd , police , Shooting Incident , shots fired Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy " -767,https://coloradosprings.gov/police-department/article/news/cspd-takes-part-calea-accreditation,Media Bulletins,Agency-Published Resources,CSPD takes part in CALEA accreditation assessment | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""CSPD takes part in CALEA accreditation assessment""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -768,https://www.stmatthewsky.gov/police/how-do-i-submit/,Records Request Info,Agency-Published Resources,How Do I Submit - City of St Matthews,"",200,403 Forbidden,"[""How Do I Submit""]",[],"[""Open Records Request"", ""Citizen Feedback"", ""Complaint on an Officer""]",[],[],[],"" -769,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0264/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -770,https://johnstown.colorado.gov/news-article/johnstown-police-department-is-participating-in-7-11s-operation-chill,Media Bulletins,Agency-Published Resources,Johnstown Police Department is Participating in 7-11's Operation Chill | Town of Johnstown,Law Enforcement Officers in Johnstown to Reward Local Kids for Good Behavior with Free 7-Eleven Slurpee® Drink Coupons ,200,Home | Town of Johnstown,"[""Johnstown Police Department is Participating in 7-11's Operation Chill""]","[""Recent""]","[""Johnstown Presses Pause on Downtown Wayfinding Signage Project"", ""Johnstown Announces Local Property Tax Rebate for Residential Homeowners"", ""Johnstown Approves Changes to Land Use and Development Code""]",[],[],[],"" -771,https://coloradosprings.gov/police-department/article/news/update-officer-involved-shooting,Media Bulletins,Agency-Published Resources,Update – Officer Involved Shooting | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Update – Officer Involved Shooting""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -772,https://www.ashevillenc.gov/department/police/office-of-the-chief/submit-a-commendation/,Contact Info & Agency Meta,Info About Agencies,ERROR: The request could not be satisfied,"",200,The City of Asheville - Your Asheville,"[""403 ERROR""]","[""The request could not be satisfied.""]",[],[],[],[],"" -773,https://delcopa.gov/prison/21job.html,Misc Police Activity,Police & Public Interactions,"2021 Jail Oversight Board Meetings - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""2021 Jail Oversight Board Meetings""]",[],"[""George Hill Correctional Facility Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 2021 Jail Oversight Board Meetings Home / George W. Hill Correctional Facility / 2021 Jail Oversight Board Meetings January 12 | Agenda | Minutes | Video | February 9 | Agenda | Minutes | Video | March 9 | Agenda | Minutes | Video | April 1 at 10:00 a.m. (Special Meeting) | Minutes | Video | De-Privatization Financial Report | De-Privatization Feasibility Assessment Presentation | Letter from the GEO Group | Public Comments at April 1 Meeting | Consultants CGL and Alta Management response to Letter from the GEO Group | April 13 | Agenda | Minutes | Video | May 11 | Agenda | Minutes | Video | June 8 | Agenda | Minutes | Video | July 13 | Agenda | Minutes | Video | August 10 | Agenda | Minutes | Video | September 14 | Agenda | Minutes | Video | September 28 | Agenda | Minutes | Video | October 12 | Agenda | Minutes | Video | November 9 | Agenda | Minutes | Video | December 14 | Agenda | Minutes | Video | George Hill Correctional Facility Navigation About Leadership and Staff Programs and Support Visitation PREA and Resources Records Criminal Justice System Voting Rights Bail and Releases FAQs Careers Mail Jail Oversight Board (JOB) Media Inquiries Contact: Location: 500 Cheyney Road Thornton, PA 19373 Mailing Address: P.O. Box 23 Thornton, PA 19373 Phone Directory Main Phone: 610-361-3200, Ext 255 Fax: 610-361-9689 Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 2021 Jail Oversight Board Meetings Home / George W. Hill Correctional Facility / 2021 Jail Oversight Board Meetings 2021 Jail Oversight Board Meetings Home / George W. Hill Correctional Facility / 2021 Jail Oversight Board Meetings 2021 Jail Oversight Board Meetings Home / George W. Hill Correctional Facility / 2021 Jail Oversight Board Meetings " -774,https://www.austintexas.gov/content/firefighters-and-police-officers-and-emergency-medical-services-personnel-civil-service-commission-2013-meetings-page-1,Misc Police Activity,Police & Public Interactions,Firefighters and Police Officers and Emergency Medical Services Personnel Civil Service Commission - 2013 Meetings - Page 1 | AustinTexas.gov,"",200,Home | AustinTexas.gov,"[""Firefighters and Police Officers and Emergency Medical Services Personnel Civil Service Commission - 2013 Meetings - Page 1"", ""2013 Meetings: Firefighters' and Police Officers' and Emergency Medical Services Personnel Civil Service Commission""]","[""Action Navigation"", ""GTranslate"", ""Main menu"", ""Frequently Viewed Departments"", ""City Clerk"", ""2013 Meetings: Page 1 of 2 ."", ""Go to page: 1 2 ."", ""2013 Meetings: Page 1 of 2 ."", ""Go to page: 1 2 ."", ""Footer Menu"", ""Second Footer Menu""]","[""Resident"", ""Business"", ""Government"", ""Departments"", ""Connect""]",[],"[""April 1, 2013"", ""Regular Meeting of the Firefighters' and Police Officers' and Emergency Medical Services Personnel Civil Service Commission - Regular Meeting"", ""Agenda (96KB)"", ""March 21, 2013"", ""Event - Temporary Suspension hearing - Officer Kevin DeLaRue"", ""Event Notice - Temporary Suspension - Officer DeLaRue (26KB)"", ""March 4, 2013 (Cancelled)"", ""Regular Meeting of the Firefighters' and Police Officers' and Emergency Medical Services Personnel Civil Service Commission - Regular Meeting Canceled"", ""Cancellation Notice - Regular meeting canceled (107KB)"", ""February 11, 2013"", ""Event - Civil Service Hearing - Temporary Suspension Appeal - Fire Captain Daniel O'Dell"", ""Event Notice (70KB)"", ""February 11, 2013"", ""Special Called Meeting of the Firefighters' and Police Officers' and Emergency Medical Services Personnel Civil Service Commission - CIVIL SERVICE COMMISSION SPECIAL CALLED MEETING"", ""Agenda (98KB)"", ""February 4, 2013 (Cancelled)"", ""Regular Meeting of the Firefighters' and Police Officers' and Emergency Medical Services Personnel Civil Service Commission - Regular Meeting Canceled"", ""Cancellation Notice - Regular Meeting Cancelled (107KB)"", ""January 31, 2013"", ""Event - Civil Service Hearing - Temporary Suspension Appeal - Firefighter Marja Juraschek"", ""Event Notice (71KB)"", ""January 18, 2013"", ""Special Called Meeting of the Firefighters' and Police Officers' and Emergency Medical Services Personnel Civil Service Commission - CIVIL SERVICE COMMISSION SPECIAL CALLED MEETING"", ""Agenda - CIVIL SERVICE COMMISSION SPECIAL CALLED MEETING (97KB)"", ""Approved Minutes (98KB)""]",[],"austintexas.gov Action Navigation 3-1-1 GTranslate Translate English Arabic Bulgarian Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch Finnish French German Greek Hindi Italian Japanese Korean Norwegian Polish Portuguese Romanian Russian Spanish Swedish Catalan Filipino Hebrew Indonesian Latvian Lithuanian Serbian Slovak Slovenian Ukrainian Vietnamese Albanian Estonian Galician Hungarian Maltese Thai Turkish Persian Afrikaans Malay Swahili Irish Welsh Belarusian Icelandic Macedonian Yiddish Armenian Azerbaijani Basque Georgian Haitian Creole Urdu Bengali Bosnian Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba Zulu austintexas . gov Filter Toggle navigation Menu Close Search Main menu Home Resident Resident Open the Resident page Open the Resident page Household Getting a Home Utilities Trash and Recycling Gardening and Home Improvements Home Improvements Pets and Adoption Open the Household page Neighborhoods Education Libraries Families Neighborhood Issues Open the Neighborhoods page Health Animals Public Health Open the Health page Public Safety Crime Courts Fire Safety Emergency Preparedness Public Safety Employment Open the Public Safety page Arts and Leisure Arts, History and Culture Outdoor, Nature and Wildlife Events City Venues and Facilities Film and Music Open the Arts and Leisure page Environmental City Programs and Initiatives Conservation and Recycling Animals and Wildlife Parks Open the Environmental page Transportation Car/Bus Aviation Bicycle/Pedestrian Streets/Maps Open the Transportation page City of Austin About Austin Voting and Elections Get Involved City Jobs Records and Documents Open the City of Austin page Business Business Open the Business page Open the Business page Doing Business Utilities Doing Business with the City Taxes MBE/WBE Program City Code Food Establishments Permits Day Labor Records and Documents Open the Doing Business page Starting Out Starting a Business Relocating a Business Incentives and Grants Open the Starting Out page City Contracts Small Business Centers Small Business Development Incentives and Grants Open the Small Business Centers page Austin Center for Events Nonprofits Grants Open the Nonprofits page Green Resources Government Government Open the Government page Open the Government page City Council City Manager's Office Boards and Commissions City Council meeting information City Hall Jobs Public Records Departments Departments View full directory of departments Frequently Viewed Departments View full directory of departments Visit Airport Visitors Bureau Convention Center Utilities Austin Energy Austin Water Resource Recovery Education & Recreation Library Parks and Recreation Safety Police Other Animal Services Development Services Economic Development Connect Connect Open the Connect page Share ideas online about improving Austin Participate in the City Sign up for email updates City contact information " -775,http://www.longbeach.gov/police/press-releases/felony-suspects-arrested-and-charged/,Media Bulletins,Agency-Published Resources,FELONY SUSPECTS ARRESTED AND CHARGED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/26/2019 FOR IMMEDIATE RELEASE Press Release # Subject: FELONY ROBBERY SUSPECTS ARRESTED AND CHARGED Contact: Media Relations Detail (562) 570-5273 lbpdmediarelations@longbeach.gov On February 25, 2019, felony charges were filed against two suspects for their involvement in an armed commercial robbery in Long Beach. On February 9, 2019, at approximately 2:30 a.m., patrol officers were dispatched to an armed robbery call at a business in the 1700 block of Palo Verde Avenue. While en route, patrol units were notified that a Long Beach State University (LBSU) Police officer was in a vehicle pursuit of the suspects. The suspect’s vehicle was later involved in a collision on campus. The suspects then fled the collision scene on foot. The reported loss was cash and no injuries were reported from the collision or the robbery. Through their investigation, detectives learned that 21-year-old Adrian Martinez, a resident of Compton, was trying to report his vehicle stolen. It was later determined that this subject was involved in the robbery and subsequently arrested. As detectives continued their investigation, they were able to identify two additional suspects involved with the armed robbery. On February 19, 2019, detectives arrested a 16-year-old juvenile in the 1100 block of North Oleander Avenue in the City of Compton. On February 21, 2019, detectives arrested 19-year-old Alexander Gomez in the 7300 block of Emile Lane in the City of Downey. Last week, the case was presented to the Los Angeles County District Attorney’s Office for filing consideration. Yesterday, the Los Angeles County District Attorney’s Office filed one count of robbery against Martinez and one count of robbery with a gun enhancement against Gomez. Martinez is being held at the Twin Towers Jail on $100,000 bail. Gomez is being held at the LASD Inmate Reception Center on $100,000 bail. The District Attorney’s Office also filed a detained petition against the juvenile subject. Anyone with information regarding this investigation is encouraged to call LBPD Robbery Detectives Fermin Gonzalez or Brian Greene at (562) 570-7464. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -776,http://police.portlandmaine.gov/788/sound-oversight-committee,Misc Police Activity,Police & Public Interactions,"Sound Oversight Committee | Portland, ME - Official Website","The Sound Oversight Committee meets on an as needed basis, as issues arise with entertainment licenses within the City of Portland.",200,"Portland, ME - Official Website | Official Website","[""Sound Oversight Committee""]",[],[],[],[],[],Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Standing Committees Sound Oversight Committee Sound Oversight Committee Noise Complaint Process Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Standing Committees Sound Oversight Committee Sound Oversight Committee Noise Complaint Process Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Standing Committees Sound Oversight Committee Sound Oversight Committee Noise Complaint Process Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Standing Committees Sound Oversight Committee Sound Oversight Committee Noise Complaint Process Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Standing Committees Sound Oversight Committee Sound Oversight Committee Noise Complaint Process Home Your Government Boards & Committees Standing Committees Sound Oversight Committee Sound Oversight Committee Noise Complaint Process Home Your Government Boards & Committees Standing Committees Sound Oversight Committee Sound Oversight Committee Noise Complaint Process Home Your Government Boards & Committees Standing Committees Sound Oversight Committee Sound Oversight Committee Home Your Government Boards & Committees Standing Committees Sound Oversight Committee Sound Oversight Committee Home Your Government Boards & Committees Standing Committees Sound Oversight Committee Sound Oversight Committee Sound Oversight Committee Noise Complaint Process Noise Complaint Process Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® -777,https://www.lasalle-il.gov/shared-police-services-committee-0,Misc Police Activity,Police & Public Interactions,Shared Police Services Committee | City of La Salle,"",200,"Error retrieving title: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))","[""Shared Police Services Committee""]","[""Main navigation"", ""Main Menu"", ""Important Info""]",[],[],[],[],"Search Phone: 815-223-3755 Fax: 815-223-9508 Contact Us Main navigation MENU About La Salle Our Mission Event Calendar Historical Tour City Profile » Tourism Ward Map Canal Corridor Association City Services Municipal Information Directory City Government City Mayor City Clerk/Deputy Clerk City Officials City Committees La Salle Promotional & Advisory Committee (LPAC) Ordinances & Codes Departments Building Department Frequently Asked Questions Engineering Frequently Asked Questions Finance/Utility Billing Annual Audits Budget/Appropriations Labor Contracts What We Do Utility Billing Water & Sewer Rates Fire Department Department Overview Department History ISO Rating Apparatus Showcase Public Education Disaster Preparedness Storm Ready Community Fire Department Links Knox Box System Parks & Recreation Interactive Park Map La Salle Parks Information Pollinator Park Police Department Patrol Division Detective Division Communications Division School Resource Officer Program Community Programs TRI-DENT Crime Free Housing Registered Sex Offenders Moving to Town Safety Tips Important Phone Numbers Public Works Frequently Asked Questions What We Do Development Properties Available Properties Business Development Economic Development Development Incentives » TIF Districts Enterprise Zone Redevelopment Incentive Program Hotels & Short Term Rentals Community COVID-19 Info Businesses Dining Health Care Senior Services Worship Education Farmer's Market Public Library Illinois Valley YMCA NewsTribune La Salle Business Association (LBA) Job Market Information Online Services Shared Police Services Committee Where: Peru Municipal Building When Tuesday, July 31, 2018 Agenda 7-31-2018 Agenda Minutes July 31, 2018 Minutes City Offices: 745 Second Street La Salle, Illinois 61301 Phone: 815-223-3755 Fax: 815-223-9508 Email the City Office City Office Hours: Monday - Friday: 7:30 a.m. - 4:00 p.m. Main Menu Home About La Salle Departments Development Community Contact Us Sitemap Important Info Privacy Policy External Site Policy FOIA Information USA.gov HHS.gov Accessibility Plugins Find Us On Facebook Copyright © 2017-2018 City of LaSalle. All Rights Reserved. La Salle Web Design by Anttix, Inc. " -778,https://dps.georgia.gov/press-releases/2008-02-08/gsp-and-atlanta-police-announce-new-partnership,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -779,https://www.mass.gov/doc/emergencycarrulespromulgated02062008red-linedcopypdf/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -780,https://www.cityofauburnwa.gov/city_hall/police/dispute_resolution,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -781,https://southamptontownnypolice.gov/325/duties-responsibilities,Not Criminal Justice Related,Not Criminal Justice Related,"Duties & Responsibilities | Southampton, NY - Official Website",Review the duties and responsibilities of the Landmarks and Historic District Board.,200,"Police | Southampton, NY - Official Website","[""Duties & Responsibilities""]","[""I. Landmarks & Historic Districts ( See ST Code 330-320 )"", ""II. Certificate of Appropriateness ( See ST Code 330-322 through 330-324 )"", ""III. Hamlet Heritage Resource Areas ( See ST Code 330-331 )"", ""IV. Demolition and Construction Applications for Structures Built Before 1941"", ""Landmarks Board"", ""Town Hall - Department of Land Management""]","[""Site Tools"", ""Contact Us"", ""Quick Links"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -782,https://icjia.illinois.gov/about/publications/a-profile-of-the-illinois-state-police-motor-vehicle-theft-intelligence-clearinghouse/,Poor Data Source,Poor Data Source,ICJIA |,Illinois Criminal Justice Information Authority,200,ICJIA | Illinois Criminal Justice Information Authority,[],[],[],[],[],[],Skip to content MENU ILLINOIS CRIMINAL JUSTICE INFORMATION AUTHORITY About arrow_drop_down Research arrow_drop_down Grant Resources arrow_drop_down Partners arrow_drop_down About Research Grant Resources Partners ICJIA  » ICJIA Overview Overview Translate this site About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact View all publications » About Contact Employment Events Funding Grant Status Request Meetings News & Information Press Research Training About | Contact | Document Archive | FOIA | Language Access Request | Privacy | Grant Status Request | Subscribe to CJ Dispatch © 2024 Illinois Criminal Justice Information Authority Skip to content MENU ILLINOIS CRIMINAL JUSTICE INFORMATION AUTHORITY About arrow_drop_down Research arrow_drop_down Grant Resources arrow_drop_down Partners arrow_drop_down About Research Grant Resources Partners ICJIA  » ICJIA Overview Overview Translate this site About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact View all publications » About Contact Employment Events Funding Grant Status Request Meetings News & Information Press Research Training About | Contact | Document Archive | FOIA | Language Access Request | Privacy | Grant Status Request | Subscribe to CJ Dispatch © 2024 Illinois Criminal Justice Information Authority MENU ILLINOIS CRIMINAL JUSTICE INFORMATION AUTHORITY About arrow_drop_down Research arrow_drop_down Grant Resources arrow_drop_down Partners arrow_drop_down MENU ILLINOIS CRIMINAL JUSTICE INFORMATION AUTHORITY About arrow_drop_down Research arrow_drop_down Grant Resources arrow_drop_down Partners arrow_drop_down MENU MENU ILLINOIS CRIMINAL JUSTICE INFORMATION AUTHORITY About Research Grant Resources Partners About Research Grant Resources Partners About Research Grant Resources Partners About About About About About Research Research Research Research Research Grant Resources Grant Resources Grant Resources Grant Resources Grant Resources Partners Partners Partners Partners Partners ICJIA  » ICJIA Overview Overview Translate this site About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact View all publications » ICJIA  » ICJIA Overview Overview Translate this site About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact ICJIA  » ICJIA Overview Overview Translate this site About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact View all publications » View all publications » View all publications » View all publications » View all publications » View all publications » About Contact Employment Events Funding Grant Status Request Meetings News & Information Press Research Training About Contact Employment Events Funding Grant Status Request Meetings News & Information Press Research Training -783,https://www.colma.ca.gov/documents/executive-assistant-chief-police/,Training & Hiring Info,Info About Officers,Executive Assistant to Chief of Police - Town of Colma,"",200,Home - Town of Colma,"[""Executive Assistant to Chief of Police""]","[""Primary menu links"", ""Action toolbar"", ""Documents and forms"", ""Contact"", ""Subscribe"", ""Connect""]",[],[],[],[],"Town of Colma Primary menu links About Residents Businesses Visitors City Council Departments Events News Contact Action toolbar Search Primary menu links About Residents Businesses Visitors City Council Departments Events News Contact Action toolbar Search Town of Colma Town of Colma Town of Colma Documents and forms Executive Assistant to Chief of Police Human Resources Job Descriptions December 12, 2017 PDF 225 KB Download Documents and forms Executive Assistant to Chief of Police Human Resources Job Descriptions December 12, 2017 PDF 225 KB Download Documents and forms Human Resources Job Descriptions December 12, 2017 PDF 225 KB Download Human Resources Job Descriptions December 12, 2017 PDF 225 KB Download December 12, 2017 Helpful Share Facebook Twitter Email Size + Reset a − Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Contact Town of Colma 1198 El Camino Real Colma, CA 94014 (650) 997-8300 (650) 997-8308 (fax) Contact Links Directory Feedback Access Links Accessibility Sitemap Subscribe Connect Twitter Facebook Contact Town of Colma 1198 El Camino Real Colma, CA 94014 (650) 997-8300 (650) 997-8308 (fax) Contact Links Directory Feedback Access Links Accessibility Sitemap Subscribe Connect Twitter Facebook Contact Town of Colma 1198 El Camino Real Colma, CA 94014 (650) 997-8300 (650) 997-8308 (fax) Contact Links Directory Feedback Access Links Accessibility Sitemap Subscribe Connect Twitter Facebook Powered by Powered by This content is for decoration only skip decoration . Close window This content is for decoration only skip decoration . This content is for decoration only skip decoration . This content is for decoration only skip decoration . Search Site Search Close window Search Site Search Search Site Search " -784,https://delcopa.gov/publicrelations/releases/2020/votingsystemdemo.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Holds Demonstration of New Voting System - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Holds Demonstration of New Voting System""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Hart Verity 2.3.4 Voting System on display at Courthouse Feb. 10-14""]",[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County Holds Demonstration of New Voting System Home / Departments / Public Relations Releases / Delaware County Holds Demonstration of New Voting System Hart Verity 2.3.4 Voting System on display at Courthouse Feb. 10-14 Delaware County’s new voting machines will be on display for the public in the lobby of the Government Center (201 W. Front St., Media, PA) from noon to 2:00p.m. Monday, Feb. 10 through Friday, Feb. 14. The public is invited to view and test the Hart Verity 2.3.4 system. Trainers will be available to answer questions. Delaware County Council unanimously voted to purchase the Hart Verity 2.3.4 Voting System in October 2019, following a recommendation by the County’s Board of Elections. The system, certified by the PA Department of State, meets the Governor’s mandate for a verifiable paper trail. It includes plain text which voters can read to verify their vote before casting their ballot. The new voting machines will be used in the 2020 Primary, as mandated by Governor Wolf. The County’s Board of Elections, Delaware County Council and the County’s Executive Director began researching new voting systems in 2017 to identify systems that would meet the new federal and state requirements. In Pennsylvania, every voting system and paper ballot must include plain text that voters can read to verify their choices before casting their ballot. Election officials will also use the plain text to perform pre-election testing and post-election audits and recounts. Additional demonstrations and trainings will be held around the County to educate residents and train poll workers for the 2020 Primary. If a group or organization wants to host a machine demonstration, please contact: 610-891-4673 Videos on the Hart Verity 2.3.4 Voting System can be found here: www.delcopa.gov/electionsbureau/index.html Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play " -785,https://santabarbaraca.gov/press-releases/community-members-help-santa-barbara-police-apprehend-reckless-driver,Media Bulletins,Agency-Published Resources,Community Members Help Santa Barbara Police Apprehend Reckless Driver | City of Santa Barbara,"On July 14, 2021, around 0930am, a Santa Barbara Police Officer was on patrol in the area of Cabrillo Blvd. and Stearns Wharf when he was flagged-down by a community member regarding a subject trying to instigate numerous physical altercations in the area of the Wharf. The Officer attempted to conduct a traffic stop of the subject who was driving a vehicle. The suspect fled west on Cabrillo Blvd in their vehicle, away from the Officer. The Officer lost sight of the vehicle, and responding police units set up a perimeter in the Natoma Avenue neighborhood.",200,City of Santa Barbara,"[""Community Members Help Santa Barbara Police Apprehend Reckless Driver""]","[""Learn about Cookies"", ""[#IABV2_TITLE#]"", ""Breadcrumb"", ""Contact"", ""This is the prefooter section"", ""Main Footer"", ""City Hall"", ""Mailing Address"", ""Newsletters""]",[],[],[],[],"" -786,https://www.southamptontownnypolice.gov/faq.aspx?qid=322,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • When is deer hunting season in the Town of Southampto,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Hunting Season""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -787,https://www.mass.gov/lists/don-northeast-endoscopy,Not Criminal Justice Related,Not Criminal Justice Related,DoN - Northeast Endoscopy | Mass.gov,Determination of Need application materials received by the Department of Public Health for Northeast Endoscopy.,200,Mass.gov,"[""DoN - Northeast Endoscopy""]","[""Table of Contents"", ""Application documents"", ""Decision letter"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[],"" -788,https://delcopa.gov/prison/pdfs/dresscodevisitors2022.pdf,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -789,http://www.lafayettepolice.us/2067/residential-projects,Not Criminal Justice Related,Not Criminal Justice Related,"Residential Projects | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Residential Projects""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home Government Departments A - F Engineering & Public Works Permits & Licensing Building Permits Residential Projects Residential Projects All residential projects require the following to be submitted: Building Permit Application * Site Plan (new structures and additions only) Includes dimensions of all structures (existing and proposed) and setbacks of all structures (existing and proposed) For examples click here To check setback requirements click here (you will need to know your zoning classification, if not known click here ) Set of Plans Includes side view drawing (bottom of footer to top of roof) and/or a scope of work including materials list For example of a side view drawing click here List of Contractors (for license and insurance requirements click here ) Owners Authorization The property owner must sign the application or complete the owner's authorization form ( click here to check the listed owner of your property) *Depending on the project additional fees and permit applications may be required. Click here to visit our Applications and Forms page. Commercial Projects Residential Projects Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -790,https://southamptontownnypolice.gov/456/planning-policy-advisory-committee,Not Criminal Justice Related,Not Criminal Justice Related,"Planning Policy Advisory Committee | Southampton, NY - Official Website",View the members of the Planning Policy Advisory Committee.,200,"Police | Southampton, NY - Official Website","[""Planning Policy Advisory Committee""]","[""Members""]","[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Boards & Committees Advisory Boards & Committees Planning Policy Advisory Committee Planning Policy Advisory Committee Members Maria Z. Moore, Supervisor, Chairperson Town Council Member, to serve on rotating basis by meeting date Frank Zappone, Deputy Supervisor Town Planning and Development Administrator Town Attorney, or designee Southampton Town Housing Authority, or designee Planning Board Chair or designee Community Representative, CAC-West Community Representative, Water Mill Community Representative, North Sea Aram Terchunian, Development Representative James Hulme, Development Representative Civic / CAC Organizations, or designee as appointed by Town Board Environmental Advocacy Organization, or designee as appointed by Town Board Each member serves a one-year term. Addiction and Recovery/Behavioral Health Committee Affirmative Action Task Force Airport Noise Advisory Committee Anti-Bias Task Force Agricultural Advisory Committee Audit Advisory Committee Budget & Finance Advisory Committee Citizen Advisory Committees East Quogue CAC Agendas & Minutes Hampton Bays CAC Agendas & Minutes North Sea CAC Agendas & Minutes Noyac CAC Agendas & Minutes Southampton / Shinnecock Hills / Tuckahoe CAC CAC Minutes Water Mill CAC Agendas & Minutes Westhampton, Speonk-Remsenburg, Eastport, Quiogue Agendas & Minutes Community Housing Fund Advisory Board Community Preservation Advisory Board Dark Skies Committee Deer Protection and Management Advisory Committee Disability Advisory Committee Emergency Medical Services Advisory Committee Facilities / Infrastructure Committee Fire Advisory Committee Historic Burying Ground Committee Labor-Management Committee Planning Policy Advisory Committee Police Department/Labor Relations Advisory Road Review Committee Safety & Risk Management Committee SEA-TV Channel Committee Solid Waste Advisory Committee Southampton Arts and Culture Committee (SHACC) Sustainable Southampton Green Advisory Committee Trades Advisory Committee Traffic Mitigation and Safety Task Force Trails Advisory Board Veterans Affairs Water Mill Park District Budget Steering Advisory Wind Energy Conversion Systems Advisory Committee Water Quality Advisory Committee Workplace Violence Prevention Committee Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -791,https://www.sandiego.gov/police/news-center/cold-cases/carole-defleice,Poor Data Source,Poor Data Source,Carole DeFleice | City of San Diego Official Website,"Carole DeFleice, also known as Nina Star, had been in San Diego for about six weeks prior to her murder. During this time she had been working as a prostitute along El Cajon Boulevard. She was living at the Sea Point Motel and taking her dates to the Aztec Motel at the dead-end of 4400 Camino Del Rio South. DeFleice was last seen alive on El Cajon Boulevard at around 9 p.m. on Friday night, February 25, 1984. DeFleice told a close friend she had plans to get picked up for a date at about 11:00 p.m.",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""Cold Case: Carole DeFleice""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""News Center"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -792,https://delcopa.gov/publicrelations/releases/2019/htf_communityday.html,Not Criminal Justice Related,Not Criminal Justice Related,"Community Day celebrates recovery, recognizes partners in drug prevention - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Community Day celebrates recovery, recognizes partners in drug prevention""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -793,http://lafayettepolice.us/1846/berlowitz-development-area-master-plan,Not Criminal Justice Related,Not Criminal Justice Related,"Berlowitz Development Area Master Plan | Lafayette, IN - Official Website",Berlowitz Development Area Master Plan,200,"Police Department | Lafayette, IN - Official Website","[""Berlowitz Development Area Master Plan""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home Government Departments A - F Engineering & Public Works Plans and Studies Berlowitz Development Area Master Plan Berlowitz Development Area Master Plan Upper Berlowitz Regulated Drain The Julius Berlowitz Regulated Drain watershed is located on the east side of Lafayette, Tippecanoe County, Indiana.  The approximately 0.9 square mile watershed drains from southwest to northeast and is tributary to the South Fork of Wildcat Creek.  The Master Plan report specifically addresses the “Upper” Berlowitz Regulated Drain watershed, an approximately 600-acre area located in the southwest portion of the overall watershed. Berlowitz Final Report Conceptual Design Exhibits & Drawings Alexander Ross Master Plan Americans with Disabilities Act Transition Plan Area Plan Commission (APC) Berlowitz Development Area Master Plan Bicycle Master Plan Trails and Greenways Master Plan Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home Government Departments A - F Engineering & Public Works Plans and Studies Berlowitz Development Area Master Plan Berlowitz Development Area Master Plan Upper Berlowitz Regulated Drain The Julius Berlowitz Regulated Drain watershed is located on the east side of Lafayette, Tippecanoe County, Indiana.  The approximately 0.9 square mile watershed drains from southwest to northeast and is tributary to the South Fork of Wildcat Creek.  The Master Plan report specifically addresses the “Upper” Berlowitz Regulated Drain watershed, an approximately 600-acre area located in the southwest portion of the overall watershed. Berlowitz Final Report Conceptual Design Exhibits & Drawings Alexander Ross Master Plan Americans with Disabilities Act Transition Plan Area Plan Commission (APC) Berlowitz Development Area Master Plan Bicycle Master Plan Trails and Greenways Master Plan Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -794,https://champaignil.gov/police/about-us/recruitment/,Training & Hiring Info,Info About Officers,Recruitment - City of Champaign,"",200,403 Forbidden,"[""Police Recruitment"", ""Join Champaign PD"", ""Experienced Police Officer"", ""Entry Level Police Officer""]","[""Police Department"", ""Quick Links"", ""Police Department News"", ""Contact Us""]",[],"[""About Champaign"", ""Applying to the Champaign Police Department"", ""Experienced Officer Incentive Program"", ""Basic Requirements"", ""Hiring Process"", ""Salary & Benefits"", ""Basic Requirements"", ""Hiring Process"", ""Important Dates"", ""Salary & Benefits"", ""Frequently Asked Questions""]",[],[],"" -795,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0364/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -796,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/040921blotter.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -797,http://www.ryepolice.us/wp-content/uploads/storm-preparedness-1.jpg,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -798,https://champaignil.gov/2013/11/25/champaign-police-respond-to-check-welfare-and-shots-heard-call-2000-block-of-cynthia-drive/,Media Bulletins,Agency-Published Resources,Champaign Police Respond to Check Welfare and Shots Heard Call (2000 Block of Cynthia Drive) - City of Champaign,"",200,403 Forbidden,"[""Champaign Police Respond to Check Welfare and Shots Heard Call (2000 Block of Cynthia Drive)""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Champaign Police Respond to Check Welfare and Shots Heard Call (2000 Block of Cynthia Drive) Search Posted on November 25, 2013 On November 23, 2013, at approximately 11:50 AM, Champaign Police officers responded to a “check welfare” call due to loud noises and possible gunshots heard coming from an apartment, located in the 2000 block of Cynthia Drive. Upon arrival, officers also heard sounds coming from the apartment which resembled gunshots and attempted to make contact with the resident of the apartment. When officers could not determine if an armed subject was inside the apartment, a perimeter was established around the apartment complex and several residents were evacuated from their residences, as a safety precaution. Cynthia Drive at Bloomington Road and Anita Drive were blocked off to motorists and the Department’s Negotiations and Special Weapons and Tactics (SWAT) teams were summoned to the scene to make further attempts at contacting the resident. The Champaign-Urbana Mass Transit District provided two buses to shelter evacuated residents and the Champaign Unit 4 School District provided snacks and the use of facilities within Garden Hills Elementary school. During the event, the Metro Swat Team, comprised of officers from the Champaign County Sheriff’s Office, Urbana Police Department, University of Illinois Department of Public Safety and the Rantoul Police Department, provided assistance to the Champaign SWAT team. The property’s management staff helped police to gain entry into the resident’s apartment, which was found with extensive damages and believed to be the source of the loud noises heard by residents. At 5:04 PM, officers made contact with a male subject, who was in the residence alone and who did not appear to be fully oriented to his surroundings. He was transported by ambulance, without incident, to Presence Covenant Medical Center for an evaluation. No weapon was located at the scene and no arrest was made. Categories: Police Department Press Releases Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy " -799,https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-4/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -800,http://www.longbeach.gov/police/news/$10-000-reward-issued-in-fatal-hit-and-run-case/,Media Bulletins,Agency-Published Resources,"$10,000 REWARD ISSUED IN FATAL HIT AND RUN CASE","The fatal hit & run collision of disabled man occurred on February 13, 2015.  Anyone with information is urged to call the LBPD Collision Investigation Detail at (562) 570-7355.",200,City of Long Beach,"[""Police Department"", ""$10,000 REWARD ISSUED IN FATAL HIT AND RUN CASE""]",[],"[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", """", """", """", """", ""Crime Lab Survey"", """"]",[],"" -801,https://www.antioch.il.gov/wpfb-file/02-14-12-police-pension-agenda-pdf-5/,Poor Data Source,Poor Data Source,"02-14-12 Police Pension Agenda - Antioch, IL",02 14 12 police pension agenda pdf commissions fund agendas 2012 2017 05 17 08 41 32 0000,200,"Home - Antioch, IL","[""02-14-12 Police Pension Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -802,https://police.greenvillesc.gov/faq.aspx?qid=156,Poor Data Source,Poor Data Source,"FAQs • I know I can't talk to the judge, but you're ni","",200,"Police Department | Greenville, SC - Official Website",[],"[""▼ Municipal Court - Judicial Communications""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -803,https://coloradosprings.gov/police-department/article/news/cspd-accident-alert-status-may-7-11-2021,Media Bulletins,Agency-Published Resources,"CSPD on Accident Alert Status from May 7 – 11, 2021 | City of Colorado Springs","",200,Home Page | City of Colorado Springs,"[""CSPD on Accident Alert Status from May 7 – 11, 2021""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -804,https://dccouncil.gov/judiciary-public-safety/copy-of-fi0_fy19_attachment-i/,Not Criminal Justice Related,Not Criminal Justice Related,Copy of FI0_FY19_Attachment I • Council of the District of Columbia,"",200,Home • Council of the District of Columbia,"[""Copy of FI0_FY19_Attachment I""]",[],[],[],[],[],"Federal Tax Counter: $1,298,158,645 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Federal Tax Counter: $1,298,158,645 What is this? Get Updates RSS Press Center facebook twitter youtube Federal Tax Counter: $1,298,158,645 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Council of the District of Columbia Copy of FI0_FY19_Attachment I October 10, 2018 Loading... Copy of FI0_FY19_Attachment I October 10, 2018 Loading... Loading... Loading... DC Council seal About the Council Open Government Register to Vote Council Updates Jobs Council Directory Privacy Policy Commemorative D.C. Flag Program Ethics Visit the Wilson Building facebook twitter youtube Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Search facebook twitter youtube Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate " -805,https://www.coppelltx.gov/268/cpr-aed-courses,Not Criminal Justice Related,Not Criminal Justice Related,"CPR-AED Courses​​ | Coppell, TX",CPR classes are held once a month at the Life Safety Park. ,200,"Coppell, TX | Official Website","[""CPR-AED Courses​​""]","[""Fire Station #1"", ""Fire Station #2"", ""Fire Station #3"", ""Fire Station #4""]","[""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search How Do I? Fire Prevention Emergency Management Life Safety Park About Us City Home Home Government City Departments Fire Department Life Safety Park Classes & Training CPR-AED Courses​​ CPR-AED Courses​​ Cardiopulmonary Resuscitation (CPR) training classes are held once a month at Life Safety Park. The class, intended for an adult audience, is free and tends to fill up fast. Register online today! Please note that this class does not provide the certification needed for some professions, such as healthcare or childcare. Car Seat Inspections CPR-AED Courses​​ Seasonal Classes ​Joint LSP / BEC Study Trips Life Safety Study Trips Scouting Courses Training Requests Volunteer Opportunities Contact Us Services EMS Report Medical Billing Fire Incident Report Notify Coppell Fire Administration 265 Parkway Boulevard P.O. Box 9478 Coppell, TX 75019 Life Safety Park 820 South Coppell Road Coppell, TX 75019 Mon-Fri, 7:00 am - 4:00 pm  Phone: 972-304-3512 Fax: 972-745-4517 Email Fire Station #1 520 Southwestern Boulevard Coppell, TX 75019 Fire Station #2 366 South MacArthur Boulevard Coppell, TX 75019 Fire Station #3 133 Parkway Boulevard Coppell, TX 75019 Fire Station #4 440 Northpoint Drive Coppell, TX 75019 To report an emergency situation, call 9-1-1 . To report an arson or suspected arson, call the Fire Marshal's Office at 972-304-7055 . For non-emergency requests, call non-emergency dispatch 24 hours at 469-289-3270 . You can also contact non-emergency dispatch by dialing *247 from your cellular phone. Government Websites by CivicPlus® " -806,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/062121summary.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -807,https://police.bixbyok.gov/formcenter,Contact Info & Agency Meta,Info About Agencies,"Form Center • Bixby Police Department, OK • CivicEngage","",200,"Bixby Police Department, OK | Official Website","[""Form Center""]","[""▼ Police Department""]","[""Search Forms:"", ""Helpful Links"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Police Services Community Services Emergency Management How Do I... Home Form Center Form Center Search Forms: Search Forms Select a Category All Categories Police Department By signing in or creating an account , some fields will auto-populate with your information. ▼ Police Department Alive at 25 Program Enrollment Code Enforcement Complaint Form The Code Enforcement Complaint Online Report Form option has been setup for our citizens’ convenience to report complaints. Contact Community Emergency Response Team Contact Department The City of Bixby will attempt to reply to email messages when the name and email address of the sender are included with the request... More… The City of Bixby will attempt to reply to email messages when the name and email address of the sender are included with the request to reply. Requests for reply which are time-sensitive should be made by telephone or fax. Less… Contact Investigations Division Form Contact Nuisance & Abatement Officer Contact our Honor Guard Team Form Contact Records Contact Supervisors Form Contact the Chief’s of Police Office Contact Watch Programs Online Tip Form Request a Tour of the Police Department Traffic Enforcement Request Form Alive at 25 Program Questions Contact Animal Control Form Contact Community Relations Contact Emergency Management Office Contact Junior Police Academy Form Contact or Submit Application Citizens Police Academy Form Contact Public Affairs Officer The City of Bixby will attempt to reply to email messages when the name and email address of the sender are included with the request... More… The City of Bixby will attempt to reply to email messages when the name and email address of the sender are included with the request to reply. Requests for reply which are time-sensitive should be made by telephone or fax. Less… Contact School Resource Officers Form Contact the Assistant Chief of Police's Office Contact Us About Property File an Online Report The Police Report Online Form option has been setup for our citizens’ convenience to report certain crimes that do not require the... More… The Police Report Online Form option has been setup for our citizens’ convenience to report certain crimes that do not require the presence of a police officer. Less… Open Records Request Submit Application for Junior Police Academy Watch Order Request Safety Tips Recruitment File a Report Community Relations City of Bixby offender lookup Records Request Bixby City Codes Submit a Tip Nixle Alerts FAQs Helpful Links Animal Control Car Seat Checks Forms Records /QuickLinks.aspx FAQs Does the City of Bixby have any Curfew Laws? How can I get Traffic enforcement or the speed trailer in my area? Will Bixby Fire or Police Department assist me in the installation of my child car seat? /FAQ.aspx Site Links Home Site Map Accessibility Disclaimer Copyright Notices /QuickLinks.aspx 116 W Needles, P.O. Box 70 Bixby, OK 74008 Phone: 918-366-8294 Fax: 918-366-2050 Government Websites by CivicPlus® " -808,https://www.lynchburgvapolice.gov/wp-content/uploads/2022/02/id-2.png,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -809,https://spdblotter.seattle.gov/2017/10/27/police-recover-gun-stolen-car-and-arrest-two-prowlers/,Media Bulletins,Agency-Published Resources,"Police Recover Gun, Stolen Car and Arrest Two Prowlers - SPD Blotter","",200,403 Forbidden,"[""Police Recover Gun, Stolen Car and Arrest Two Prowlers""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -810,https://delcopa.gov/courts/judges/scanlon.html,Not Criminal Justice Related,Not Criminal Justice Related,Judge Anthony D. Scanlon - Delaware County Court of Common Pleas,"",200,"Delaware County, Pennsylvania","[""Judge Anthony D. Scanlon""]",[],"[""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[],"Menu A to Z Court Departments Local Rules FAQ Government Center Judge Anthony D. Scanlon Home / Court Departments / Board of Judges / Judge Anthony D. Scanlon Judge Anthony D. Scanlon was appointed to the Court of Common Pleas by Governor Tom Corbett and swore his Oath of Judicial Office on July 17, 2014. Judge Scanlon was elected to a full ten-year term as Judge of the Court of Common Pleas in November, 2015. Judge Scanlon is a 1978 graduate of Pennsylvania State University with a Bachelor of Science degree and a 1984 graduate of Widener University with a Master in Business Administration degree. He obtained his Juris Doctor from Temple Law School in 1988. He was admitted to practice law before the U.S. Supreme Court, Supreme Court of Pennsylvania, Superior Court of Pennsylvania, Commonwealth Court of Pennsylvania, Common Pleas courts of Pennsylvania and the U.S. District Court for the Eastern District of Pennsylvania and New Jersey. Prior to his Appointment to the Court of Common Pleas Judge Scanlon served as a Staff Attorney in the Municipal Court Unit for the Philadelphia District Attorney's Office from 1987 to 1989. He also was Mental Health and Drug and Alcohol Solicitor for Delaware County from 1992 to 2004 while also serving as Trial Attorney for the Public Defender's Office of Delaware County. In 2004, Judge Scanlon was elected as Magisterial District Judge of Springfield Township and held that position until his appointment to the Court of Common Pleas of Delaware County. Judge Scanlon is currently assigned to the Criminal Section of the Court. Judge Scanlon and his wife, Barbara, have three sons. Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 delcocourts@co.delaware.pa.us Courts Quick Links Juror eResponse PA Law Help Self Help - Custody Self Help - Divorce Juror Handbook Language Access Family Court Self Represented Litigant Guide Government Center Quick Links Marriage Licenses Crisis Connection Certified Recovery Specialist Public Access Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Judge Anthony D. Scanlon Home / Court Departments / Board of Judges / Judge Anthony D. Scanlon Judge Anthony D. Scanlon Home / Court Departments / Board of Judges / Judge Anthony D. Scanlon Judge Anthony D. Scanlon Home / Court Departments / Board of Judges / Judge Anthony D. Scanlon " -811,http://www.ryepolice.us/logs/police-logs-for-62817-7417,Calls for Service,Police & Public Interactions,Rye Police Department Police Logs for 6/28/17-7/4/17 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs for 6/28/17-7/4/17""]","[""Police Logs for 6/28/17-7/4/17""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -812,https://www.east-windsor.nj.us/police-reports,Resources,Agency-Published Resources,"Official Website of East Windsor Township, New Jersey - Police Reports","",200,"Official Website of East Windsor Township, New Jersey - Home",[],"[""Police Reports""]","[""RECORDS FEE SCHEDULE"", ""ALL FEES LISTED BELOW MUST BE PAID IN FULL PRIOR TO BEING SENT BY MAIL OR FACSIMILE - NO EXCEPTIONS"", ""I.  INCIDENT (INVESTIGATION) REPORTS:"", ""II.  ACCIDENT REPORTS:"", ""III. DISCOVERY Requests from Attorneys/Defendants via mail"", ""IV. PERSONAL RECORDS (BACKGROUND) CHECK:"", ""V. ADDITIONAL REPRODUCTION FEES (In addition to fees listed above)""]",[],[],[],Township of EAST WINDSOR TOWNSHIP Navigation Menu Departments Clerk Council Meetings Construction Court Economic Development Finance Tax Assessor Tax Collector Health Department Health Services Retail Food Licensing Vital Statistics Registrar Mayor Planning Department Planning Board Zoning Board Police Department Police Department Structure Personnel Directory I Want To Police Reports Medicine Drop Box Firearms/Fingerprinting Animal Control Towing & Storage of Vehicles Bicycle Safety Domestic Violence Victim Response Team Police Employment Recruitment Plan Police Information/Links Internal Affairs Public Works Garbage Collection Curbside Collection Bulk Goods Curbside Pick-Up Recycling Curbside Recycling Electronics Recycling White Goods Recycling Cellular Phone Recycling Other Recycling Services Recycling Events Organic Waste Chipping and Brush Grass Disposal Leaf Collection Street Index Snow Removal Services Parks Parks - List of Parks and Pathways Picnic Area and Field Reservations Submit a Request or Complaint Recreation Pay Recreation Fees Online Current Programs and Activities East Windsor Township Summer Camps Community Event Sponsorship Event Photos and Videos Township Parks Youth Activity Directory Senior Services Senior Service Directory Senior Center Newsletters Community Bus Information Senior Center Community Bus Schedule Senior Center Exercise Schedule Mercer County Trade Transportation Tax Assessor Tax Collector Township Manager Welfare EWMUA Staff Directory Government Mayor Elected Officials Boards & Commissions Council Meetings Planning Department Township Ordinances - Introduced Township Ordinances - Adopted Municipal Code Book Financial Statements Municipal Budget Sustainable Policies Notice to Bidders Fair & Open Notices Bid Requests Employment Opportunities E-News Township Newsletters Spotlight East Windsor Press Releases Community Area Information Township History Community Events Recreation Pay Recreation Fees Online After School Programs East Windsor Township Summer Camps Parks Youth Activity Directory Senior Services Senior Service Directory Senior Center Newsletters Senior Nutrition Calendar Senior Center Calendar Senior Center Community Bus Schedules Community Bus Information Senior Center Classes Mercer County Trade Transportation East Windsor Municipal Alliance for the Prevention of Substance Abuse (EWMAPSA) Medicine Drop Box Fire Companies Rescue Squads Local Libraries Affordable Housing Transportation Township Map Press Releases State and Federal Contacts Community Links Township Map Business Doing Business in East Windsor Why Choose East Windsor One Stop Permit Processing Events for Business Business Assistance Directory Township Code Planning Studies Major Area Employers Transportation Business News Business Awards Business Videos Township Map I Want To Submit a Request Township of EAST WINDSOR TOWNSHIP Township of EAST WINDSOR TOWNSHIP Township of EAST WINDSOR TOWNSHIP -813,https://www.ci.san-bernardino.ca.us/city_hall/police_department/records_bureau,Records Request Info,Agency-Published Resources,Records Bureau - City of San Bernardino,"",200,Just a moment...,"[""City of San Bernardino California""]","[""Records Bureau""]",[],[],[],[],Skip to Content -814,https://www.rosslynfarmspa.gov/police-activity-reports/november-police-activity-report-2021/,Annual & Monthly Reports,Info About Agencies,Police Activity Report November 2021 - Police Activity Reports - Borough of Rosslyn Farms,"",200,Borough of Rosslyn Farms | Rosslyn Farms PA,"[""Police Activity Report November 2021""]","[""Post navigation"", ""Special Notices"", ""Council News"", ""Police Activity Reports"", ""Today’s Events"", ""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]",[],[],[],[],"Skip to content Main Menu Home About Menu Toggle A Brief History of Rosslyn Farms Rosslyn Farms Demographic Profile Community Menu Toggle Community Center Community Club Garden Club Park, Tennis Court, & Soccer Field Swimming Pool Borough Calendar Services Menu Toggle Emergency Services Street Department Trash & Recycling Yard Waste Disposal Forms & Applications Government Menu Toggle Elected Officials Boards & Commissions Council Meeting Information Borough Ordinances & Zoning Map Public Records & Right to Know Law Forms & Applications Agendas & Minutes Links Contact Police Activity Report November 2021 Police Activity Reports / By admin Rosslyn Farms continues to be a quiet place with respect to police activity. In November, Scott Twp. police responded to a report that a lost motorist damaged some ornamental rocks in a resident’s yard while trying to find the Parkway. They were also notified of a suspicious vehicle sitting on Old Farm Rd. This turned out to be a limousine that was waiting to pick up a student at a high school. Police helped with a deer carcass on one of the streets and moved it to the side of the road until our road crew could remove it. Post navigation ← Previous Post Next Post → Special Notices Notice Of Hearing- The Borough Of Rosslyn Farms Zoning Hearing Board November 20, 2018 NOTICE is […] Council News Council Report June 2021 Council Report April 2021 Council Report March 2021 Council Report February 2021 Council Report December 2020 Police Activity Reports Police Activity Report July 2022 Police Activity Report March 2022 Police Activity Report February 2022 Police Activity Report November 2021 Police Activity Report June 2021 Today’s Events No Events Search for: Recent Posts Police Activity Report July 2022 Police Activity Report March 2022 Police Activity Report February 2022 Police Activity Report November 2021 Police Activity Report June 2021 Archives November 2022 May 2022 April 2022 September 2021 May 2021 April 2021 March 2021 February 2021 December 2020 November 2020 October 2020 September 2020 July 2020 May 2020 March 2020 February 2020 January 2020 December 2019 November 2019 October 2019 September 2019 August 2019 June 2019 May 2019 April 2019 March 2019 February 2019 January 2019 December 2018 November 2018 September 2018 August 2018 July 2018 Categories Borough Council News Hearing Notice Police Activity Reports Traffic Logix Reports Meta Log in Entries feed Comments feed WordPress.org Copyright © 2024 Borough of Rosslyn Farms | Website Holt Marketing Group Main Menu Home About Menu Toggle A Brief History of Rosslyn Farms Rosslyn Farms Demographic Profile Community Menu Toggle Community Center Community Club Garden Club Park, Tennis Court, & Soccer Field Swimming Pool Borough Calendar Services Menu Toggle Emergency Services Street Department Trash & Recycling Yard Waste Disposal Forms & Applications Government Menu Toggle Elected Officials Boards & Commissions Council Meeting Information Borough Ordinances & Zoning Map Public Records & Right to Know Law Forms & Applications Agendas & Minutes Links Contact " -815,https://delcopa.gov/row/notices.html,Not Criminal Justice Related,Not Criminal Justice Related,"Notices - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Notices""]",[],"[""Register of Wills Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Notices Home / Departments / Register of Wills & Clerk of Orphans' Court Division / Orphans' Court / Notices Important Message about the New Public Access Policy - effective 1/6/18 Important Notice for Judicial Computer System Fees Notice of Language Rights Notice of Language Rights Policy - effective 1/31/18 Register of Wills Navigation ROW Home Probates and Estates Inheritance Tax Marriage License Online Systems E-Commerce Store Orphans' Court Adoption Records Phone Directory Vincent A. Rongione, Esq. Register of Wills & Clerk of Orphans' Court Government Center 201 W. Front St. Media, PA 19063 Phone: 610-891-4400 Fax: 610-891-4812 RegOfWills@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Notices Home / Departments / Register of Wills & Clerk of Orphans' Court Division / Orphans' Court / Notices Notices Home / Departments / Register of Wills & Clerk of Orphans' Court Division / Orphans' Court / Notices Notices Home / Departments / Register of Wills & Clerk of Orphans' Court Division / Orphans' Court / Notices Important Message about the New Public Access Policy - effective 1/6/18 Important Notice for Judicial Computer System Fees Notice of Language Rights Notice of Language Rights Policy - effective 1/31/18 Register of Wills Navigation ROW Home Probates and Estates Inheritance Tax Marriage License Online Systems E-Commerce Store Orphans' Court Adoption Records Phone Directory Vincent A. Rongione, Esq. Register of Wills & Clerk of Orphans' Court Government Center 201 W. Front St. Media, PA 19063 Phone: 610-891-4400 Fax: 610-891-4812 RegOfWills@co.delaware.pa.us Important Message about the New Public Access Policy - effective 1/6/18 Important Notice for Judicial Computer System Fees Notice of Language Rights Notice of Language Rights Policy - effective 1/31/18 Register of Wills Navigation ROW Home Probates and Estates Inheritance Tax Marriage License Online Systems E-Commerce Store Orphans' Court Adoption Records Phone Directory Vincent A. Rongione, Esq. Register of Wills & Clerk of Orphans' Court Government Center 201 W. Front St. Media, PA 19063 Phone: 610-891-4400 Fax: 610-891-4812 RegOfWills@co.delaware.pa.us " -816,https://www.pleasantprairiewi.gov/news/2022_news/police_and_fire_station_design_contracts,Poor Data Source,Poor Data Source,Police and Fire Station Design Contracts - Village of Pleasant Prairie,"",200,Just a moment...,[],"[""Police and Fire Station Design Contracts""]","[""Follow Us on Social Media""]",[],[],[],"" -817,http://lafayettepolice.us/faq.aspx?qid=92,Media Bulletins,Agency-Published Resources,FAQs • I really hate the color and design of our license pla,"",200,"Police Department | Lafayette, IN - Official Website",[],"[""▼ Police""]","[""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -818,https://bolivar.mo.us/shop-with-a-copr/img_1198-2/,Poor Data Source,Poor Data Source,"IMG_1198 - City of Bolivar, Missouri","",200,"Welcome to Bolivar - Where Liberty Flows - City of Bolivar, Missouri","[""IMG_1198""]",[],[],[],[],[],"Skip to content DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us IMG_1198 Home Departments Police Shop with a Cop® IMG_1198 12 Dec 2014 by City Administrator WordPress Theme - Total by HashThemes DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us IMG_1198 Home Departments Police Shop with a Cop® IMG_1198 12 Dec 2014 by City Administrator IMG_1198 Home Departments Police Shop with a Cop® IMG_1198 IMG_1198 Home Departments Police Shop with a Cop® IMG_1198 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator WordPress Theme - Total by HashThemes WordPress Theme - Total by HashThemes WordPress Theme - Total by HashThemes " -819,https://champaignil.gov/2012/10/25/life-as-a-police-officer/,Misc Police Activity,Police & Public Interactions,“Life as a Police Officer” - City of Champaign,"",200,403 Forbidden,"[""“Life as a Police Officer”""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs “Life as a Police Officer” Search Posted on October 25, 2012 Champaign Police Officer Rob Wills gave a presentation to the citizens of “Strattonville” on October 24. Since February 2012, the focus of students at Stratton Leadership and Microsociety Magnet School has been learning about society and democracy and designing their own. Officer Wills’ presentation informed students about the “Life of a Police Officer.” Categories: Police Department News Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works " -820,https://alpha.austin.gov/en/police-oversight/formal-complaint-acts-bringing-discredit-upon-the-department-and-employee-domestic-violence/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -821,https://springfield-or.gov/city/police-department/open-data/,List of Data Sources,Info About Agencies,Open Data – City of Springfield Oregon,"",200,City of Springfield Oregon,"[""""]",[],[],"[""Police""]",[],[],"" -822,https://www.mass.gov/info-details/audit-of-the-norfolk-sheriffs-office-civil-process-division-objectives-scope-and-methodology,Resources,Agency-Published Resources,"Audit of the Norfolk Sheriff’s Office—Civil Process Division Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Norfolk Sheriff’s Office—Civil Process Division,200,Mass.gov,"[""Audit of the Norfolk Sheriff’s Office—Civil Process Division Objectives, Scope, and Methodology""]","[""Table of Contents for the audit, Audit of the Norfolk Sheriff’s Office—Civil Process Division"", ""Table of Contents"", ""Overview"", ""Collection of Fees for the Delivery of Legal Services"", ""Contracting Process for Goods and Services"", ""Administration of Non-Payroll Expenses"", ""Reconciling Bank Accounts"", ""Authorizing Payments to Deputy Sheriffs"", ""Data Reliability"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[],"" -823,https://champaignil.gov/2019/05/11/police-investigating-two-overnight-shootings/,Media Bulletins,Agency-Published Resources,Police Investigating Two Overnight Shootings - City of Champaign,"",200,403 Forbidden,"[""Police Investigating Two Overnight Shootings""]","[""News Releases"", ""Department News""]",[],[],[],[],"" -824,https://www.doj.state.or.us/venue/portland-police-bureau/,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -825,https://www.mass.gov/doc/regional-assessment-center-initiative-memo-police-chief-and-deputy-police-chief-0/download,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -826,https://www.mass.gov/info-details/audit-of-the-quinsigamond-community-college-foundation-objectives-scope-and-methodology,Not Criminal Justice Related,Not Criminal Justice Related,"Audit of the Quinsigamond Community College Foundation Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Quinsigamond Community College Foundation.,200,Mass.gov,"[""Audit of the Quinsigamond Community College Foundation Objectives, Scope, and Methodology""]","[""Table of Contents for the audit, Audit of the Quinsigamond Community College Foundation"", ""Table of Contents"", ""Overview"", ""Data Reliability"", ""Conclusion"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[],"" -827,https://www.roseville.ca.us/government/departments/police_department/press_releases,Media Bulletins,Agency-Published Resources,Press Releases - City of Roseville,"",200,Just a moment...,"[""City of Roseville""]","[""Press Releases""]","[""Roseville Police Department""]",[],[],[],"" -828,https://ose.louisiana.gov/event/police-forensic-scientist-3/,Training & Hiring Info,Info About Officers,Police Forensic Scientist | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Police Forensic Scientist""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Police Forensic Scientist Competitive Level Posting Period 01/26/2022 - 02/15/22 Application Deadline 02/15/22 Jurisdiction Baton Rouge Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Police Forensic Scientist Competitive Level Posting Period 01/26/2022 - 02/15/22 Application Deadline 02/15/22 Jurisdiction Baton Rouge Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Forensic Scientist Competitive Level Posting Period 01/26/2022 - 02/15/22 Application Deadline 02/15/22 Jurisdiction Baton Rouge Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Forensic Scientist Competitive Level Posting Period 01/26/2022 - 02/15/22 Application Deadline 02/15/22 Jurisdiction Baton Rouge Application This event has passed. Police Forensic Scientist Competitive Level Posting Period 01/26/2022 - 02/15/22 Application Deadline 02/15/22 Jurisdiction Baton Rouge Application This event has passed. Police Forensic Scientist Competitive Level Posting Period 01/26/2022 - 02/15/22 Application Deadline 02/15/22 Jurisdiction Baton Rouge Application This event has passed. Police Forensic Scientist Competitive Level Competitive Level Competitive Level Posting Period 01/26/2022 - 02/15/22 Application Deadline 02/15/22 Jurisdiction Baton Rouge Posting Period 01/26/2022 - 02/15/22 Application Deadline 02/15/22 Jurisdiction Baton Rouge Posting Period 01/26/2022 - 02/15/22 Application Deadline 02/15/22 Jurisdiction Baton Rouge Posting Period 01/26/2022 - 02/15/22 Posting Period Application Deadline 02/15/22 Application Deadline Jurisdiction Baton Rouge Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -829,https://detroitmi.gov/departments/police-department/detroit-police-department-shield-program/faith-based-partners,Resources,Agency-Published Resources,Faith-Based Partners | City of Detroit,"Why Join SHIELD?  The Detroit Police Department Shield program is committed to an open line of communication between faith-based leaders and law enforcement agencies to effectively deter terrorism, homegrown violent extremists, and crimes that affect houses of worship.  Benefits of DPD SHIELD Partnership  We have a shared responsibility to provide for the safety and security of our community. The DPD SHIELD Program serves as the tool to accomplish this task; however, only by collaborating can we achieve success. As a member of the DPD SHIELD Program, you will have an opportunity to take an active role in helping to make Detroit a wonderful place to live, work, and raise a family.       Resources Faith-Based Community Resources The Cybersecurity and Infrastructure Security Agency (CISA) in partnership with the Department of Homeland Security for Faith-Based and Neighborhood Partnerships and the Faith-Based Information Sharing and Analysis Organization have developed resources that assist in securing faith-based organization’s physical and cybersecurity.  CISA (5) Ways to Improve the Safety and Security of Your Place of Worship or Community Spaces CISA Security Self-Assessment DHS Center for Faith-Based and Neighborhood Partnerships Resources The Power of Hello Guide for Houses of Worship Additional Resources The Faith-Based Information Sharing & Analysis Organization (FB-ISAO) CAIR - Best Practices for Mosque and Community Safety Synagogue Security Toolkit Secure Community Network    ",200,City of Detroit | Opportunity Rising,"[""Faith-Based Partners""]","[""Top Links"", ""Site Menu"", ""Detroit Police Shield FAQs""]","[""Why Join SHIELD?"", ""Benefits of DPD SHIELD Partnership"", ""Resources""]","[""CONTACTS""]",[],[],"" -830,https://www.ci.rohnert-park.ca.us/i_want_to__/police_transparency,List of Data Sources,Info About Agencies,Transparency - City of Rohnert Park,"",200,Just a moment...,"[""City of Rohnert Park""]","[""Rohnert Park""]","[""Transparency""]",[],[],"[""The Rohnert Park Department of Public Safety believes in open and accessible government, meaningful engagement, and mutual accountability.""]","" -831,https://delcopa.gov/sustainability/pdf/raise/populationforecast-2015-2045_2016.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -832,https://cityofpowell.us/police-agency/traffic-surveys/traffic-survey-report-4-2-18-1/,Poor Data Source,Poor Data Source,"City of Powell, Ohio | Traffic Survey Report 4-2-18 (1)","",200,"City of Powell, Ohio","[""Traffic Survey Report 4-2-18 (1)""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -833,https://spdblotter.seattle.gov/2019/06/22/police-arrest-man-in-greenwood-following-saturday-morning-stabbing/,Media Bulletins,Agency-Published Resources,Police Arrest Man in Greenwood Following Saturday Morning Stabbing - SPD Blotter,"",200,403 Forbidden,"[""Police Arrest Man in Greenwood Following Saturday Morning Stabbing""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -834,https://delcopa.gov/council/2016minutes/062216minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -835,https://police.birminghamal.gov/services/,Resources,Agency-Published Resources,Services | Birmingham Police Department,"",200,"Home | Police Department - Birmingham, AL","[""Birmingham Police Department Commitment | Excellence | Integrity""]","[""Putting People First"", ""Services""]","[""Accident, incident, offense $5"", ""Archived reports $25"", ""Background Checks (Local), $10"", ""Fingerprinting – Fingerprinting services are suspended until further notice."", ""Sex Offender Fee $10/mo"", ""Taxi License – (Initial, Renewal) $30"", """", """"]","[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[],"Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Search Services Accident, incident, offense $5 Archived reports $25 Background Checks (Local), $10 Fingerprinting – Fingerprinting services are suspended until further notice. Sex Offender Fee $10/mo Taxi License – (Initial, Renewal) $30 Services Accident, incident, offense $5 Archived reports $25 Background Checks (Local), $10 Fingerprinting – Fingerprinting services are suspended until further notice. Sex Offender Fee $10/mo Taxi License – (Initial, Renewal) $30 Hours & Info Police Headquarters 1710 1st Avenue North Birmingham, AL 35203 (205) 254-1765 BPDSuggestions@birminghamal.gov BPDHiring@birminghamal.gov For media inquires: bpdmedia@birminghamal.gov Monday-Friday: 8:00 AM – 5:00 PM Upcoming Events Next Academy Class: March 2024 We are still looking for many good men and women to join our team!  Applications may be filled out on line at www.jobsquest.org .  For further information, please visit Join the Team or contact the Birmingham Police Department Hiring Unit. Birmingham Police Department Hiring Unit: 205-254-1712 – Office, 205-254-6546 – Fax CRIMESTOPPERS Remain Anonymous Rewards Up to $5,000.00 Tip Line 24/7: (205) 254-7777 Submit a Tip Online at: www.crimestoppersmetroal.com Every tip is treated seriously. We welcome all tips. Hours & Info Police Headquarters 1710 1st Avenue North Birmingham, AL 35203 (205) 254-1765 BPDSuggestions@birminghamal.gov BPDHiring@birminghamal.gov For media inquires: bpdmedia@birminghamal.gov Monday-Friday: 8:00 AM – 5:00 PM Upcoming Events Next Academy Class: March 2024 We are still looking for many good men and women to join our team!  Applications may be filled out on line at www.jobsquest.org .  For further information, please visit Join the Team or contact the Birmingham Police Department Hiring Unit. Birmingham Police Department Hiring Unit: 205-254-1712 – Office, 205-254-6546 – Fax CRIMESTOPPERS Remain Anonymous Rewards Up to $5,000.00 Tip Line 24/7: (205) 254-7777 Submit a Tip Online at: www.crimestoppersmetroal.com Every tip is treated seriously. We welcome all tips. Hours & Info Police Headquarters 1710 1st Avenue North Birmingham, AL 35203 (205) 254-1765 BPDSuggestions@birminghamal.gov BPDHiring@birminghamal.gov For media inquires: bpdmedia@birminghamal.gov Monday-Friday: 8:00 AM – 5:00 PM Upcoming Events Next Academy Class: March 2024 We are still looking for many good men and women to join our team!  Applications may be filled out on line at www.jobsquest.org .  For further information, please visit Join the Team or contact the Birmingham Police Department Hiring Unit. Birmingham Police Department Hiring Unit: 205-254-1712 – Office, 205-254-6546 – Fax CRIMESTOPPERS Remain Anonymous Rewards Up to $5,000.00 Tip Line 24/7: (205) 254-7777 Submit a Tip Online at: www.crimestoppersmetroal.com Every tip is treated seriously. We welcome all tips. " -836,https://www.stpaul.gov/departments/police/21st-century-policing-report/pillar-2-policy-and-oversight/report-4,List of Data Sources,Info About Agencies,Report Recommendation 2.6 | Saint Paul Minnesota,"Collect, maintain, and analyze demographic data on detentions (stops, frisks, searches, summons, and arrests), disaggregated by school and non-school contacts.",200,Home | Saint Paul Minnesota,"[""Report Recommendation 2.6""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Footer""]","[""You are using an unsupported browser. Please use Microsoft Edge."", ""SPPD is committed to transparency"", ""SPPD Response"", ""Contact The City"", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured"", ""Reference Data"", ""Reference Data""]",[],[],"" -837,https://www.coppelltx.gov/faq.aspx?qid=439,Not Criminal Justice Related,Not Criminal Justice Related,"","",404,"","","","","","","","" -838,https://delcopa.gov/publicrelations/releases/2019/pdf/recoveryeventflyer.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -839,https://cityofmebanenc.gov/police-staff/officer-s-r-jones-min/,Poor Data Source,Poor Data Source,"Officer Jones - Mebane, NC","",200,"Welcome - Mebane, NC","[""Officer Jones""]","[""Primary menu links"", ""Action toolbar"", ""Welcome"", ""Engage"", ""Help""]",[],[],[],[],"Mebane, NC Primary menu links Residents Businesses Visitors Events Government Departments Contact Action toolbar Answers Payments Report Issue Search Primary menu links Residents Businesses Visitors Events Government Departments Contact Action toolbar Answers Payments Report Issue Search Mebane, NC Mebane, NC Mebane, NC Officer Jones Officer Jones Officer Jones Helpful Share Facebook Twitter Email Size + Reset a − Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Welcome About Community News Events Thank You, Chief Louis Engage Connect Feedback Help Departments Contact Directory Accessibility Sitemap Privacy Policy Welcome About Community News Events Thank You, Chief Louis Engage Connect Feedback Help Departments Contact Directory Accessibility Sitemap Privacy Policy Welcome About Community News Events Thank You, Chief Louis About Community News Events Thank You, Chief Louis Engage Connect Feedback Connect Feedback Help Departments Contact Directory Accessibility Sitemap Privacy Policy Departments Contact Directory Accessibility Sitemap Privacy Policy Powered by Powered by This content is for decoration only skip decoration . Close window This content is for decoration only skip decoration . This content is for decoration only skip decoration . This content is for decoration only skip decoration . Search Site Search Close window Search Site Search Search Site Search " -840,https://www.southamptontownnypolice.gov/786/2015-budgets,Not Criminal Justice Related,Not Criminal Justice Related,"","",404,"","","","","","","","" -841,https://spdblotter.seattle.gov/2016/06/19/police-wound-knife-wielding-domestic-violence-suspect-during-confrontation-in-jackson-place-neighborhood/,Media Bulletins,Agency-Published Resources,Police Wound Knife-Wielding Domestic Violence Suspect During Confrontation in Jackson Place Neighborhood - SPD Blotter,"",200,403 Forbidden,"[""Police Wound Knife-Wielding Domestic Violence Suspect During Confrontation in Jackson Place Neighborhood""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -842,http://www.longbeach.gov/police/press-releases/traffic-fatality----pacific-coast-highway710-freeway-overpass/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY - PACIFIC COAST HIGHWAY &710 FREEWAY OVERPASS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/21/2019 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY - PACIFIC COAST HIGHWAY & 710 FREEWAY OVERPASS Contact: LBPD Media Relations (562) 570-5273 LBPDMediaRelations@longbeach.gov On Friday, January 18, 2019 at approximately 6:15 p.m., officers were dispatched to Pacific Coast Highway and the 710 Freeway overpass regarding an injury hit-and-run between a vehicle and pedestrian that resulted in the death of an adult female. Upon arrival, officers located the pedestrian victim, a 58-year-old female resident of Carson, non-responsive and lying along the south curb of the eastbound lanes of Pacific Coast Highway just east of the 710 North off ramp for east traffic. The Long Beach Fire Department arrived on scene and transported the victim to a local hospital, where she died from her injuries on Saturday, January 19, 2019.  Her identity is being withheld at this time pending notification to next of kin. The preliminary investigation revealed that a vehicle struck the victim while she was crossing Pacific Coast Highway near the 710 Freeway off-ramps.  The victim was not in a crosswalk at the time of the collision.  After the collision, the vehicle fled the scene. The vehicle is being described as a blue, 2001-2003 Honda Civic. Anyone with information regarding the collision are asked to contact Detective Steve Fox of the Long Beach Police Department’s Collision Investigation Detail at (562) 570-7110. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -843,https://www.mass.gov/doc/chicopee-maximum-capacity-sports-bar-grille-violation-4-8-13/download,Media Bulletins,Agency-Published Resources,"","",200,"","","","","","","","" -844,https://www.montebelloca.gov/departments/police/news/all_news_articles/etch_catch,Misc Police Activity,Police & Public Interactions,Etch & Catch - City of Montebello,"",200,Just a moment...,"[""City of Montebello""]","[""Etch & Catch""]",[],[],[],[],Skip to Content -845,https://delcopa.gov/employment/jobpostings/senioradministrativespecialist.html,Not Criminal Justice Related,Not Criminal Justice Related,"Senior Administrative Specialist - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Senior Administrative Specialist""]",[],"[""Delco Jobs Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Summary"", ""Essential Duties"", ""Qualifications"", ""Contact""]",[],[],"" -846,https://linden-nj.gov/parent-university-helping-cope-with-anxiety-in-your-children/,Not Criminal Justice Related,Not Criminal Justice Related,Parent University – Helping Cope With Anxiety In Your Child(ren) – City of Linden,"",200,City of Linden – Community. Diversity. Progress.,"[""Parent University – Helping Cope With Anxiety In Your Child(ren)""]",[],"[""Side Menu"", ""Weather Info"", ""Coat Drive 2021"", ""LHS 2024 Senior Class Fundraiser"", ""Nixle Alerts"", ""Recent Public Notices"", ""New Online Forms & Applications"", ""Upcoming Events"", ""About Linden"", ""Upcoming Events"", ""Important Forms, Docs & Applications"", ""Linden City Hall""]","[""Local Time"", ""Today"", ""Tuesday"", ""Wednesday"", ""Thursday"", ""Coat Drive 2021"", ""Public Notice for the Request for Proposals for Linden Opioid Abatement and Substance Abuse Eradication and Substance Abuse Eradication and Redirection Program-Prevention Consultants"", ""Public Notice for the Request for Proposals for Linden Opioid Abatement and Substance Abuse Eradication and Substance Abuse Eradication and Redirection Program-Lead Consultants"", ""Public Notice for the Request for Qualifications for Public Information Officer"", ""Public Notice for the Request for Qualifications for The Provision of Third Party Claims Administration Services for Workers Compensation"", ""Public Notice for the Request for Qualifications for Appraisal Services"", ""Robot Makers: Start Making Moves"", ""Dance"", ""Adult Pilates"", ""Senior Citizen Arts & Crafts"", ""Robot Makers: Start Making Moves"", ""Dance"", ""Guidance for Lead Hazard Evaluation Program in Pre-1978 Residential Rentals"", ""Lead Hazard Owner Registration & Exemptions""]","[""March 25, 2024"", ""March 26, 2024"", ""March 27, 2024"", ""March 28, 2024""]","[""Previous"", ""Next""]","" -847,https://bouldercolorado.gov/events/police-oversight-panel-18,Resources,Agency-Published Resources,Police Oversight Panel | City of Boulder,"",200,Home | City of Boulder,"[""Police Oversight Panel"", ""Police Oversight Panel Meetings""]","[""Breadcrumb"", ""Details"", ""Meeting Details"", ""More Resources""]","[""Police Oversight Panel: Co-Chairs/IPM Meeting"", ""Police Oversight Panel: BPOP/Interim Chief of Police Meeting"", ""Police Oversight Panel: Subcommittee Community Engagement & Communications Meeting"", ""Police Oversight Panel: All Panel Meeting"", ""Police Oversight Panel: Co-Chairs/IPM Meeting"", ""Police Oversight Panel: Subcommittee Governance Meeting""]",[],[],[],"Calendar Jobs Contact Us Search English 繁體中文 Français Deutsch 한국어 Русский Español नेपाली en Locations Services Projects Government News Toggle Menu City of Boulder Locations Services Projects Government News Calendar Jobs Contact Us Search Breadcrumb Home Events Police Oversight Panel Details Date Thursday, October 13, 2022 Time 6:30 PM - 8:30 PM Locations Virtual Police Oversight Panel Meetings Boulder’s Police Oversight Panel meets on the second Thursday of every month. Add to Calendar Police Oversight Panel America/Denver

Boulder, CO
-United States

MM/DD/YYYY CONFIRMED OPAQUE Meeting Details Join online at https://tinyurl.com/wc4f29yk or join by phone 719 359 4580 Meeting ID: 894 9862 1296 Passcode: 589092 More Resources For panel-related inquiries, please contact: Florence Finkle finklef@bouldercolorado.gov (310) 906-0529 About the Police Oversight Panel Meeting Materials Archive Police Oversight Panel: Co-Chairs/IPM Meeting Virtual Fri Mar 29 2024 Police Oversight Panel: BPOP/Interim Chief of Police Meeting Virtual Mon Apr 1 2024 Police Oversight Panel: Subcommittee Community Engagement & Communications Meeting Virtual Thu Apr 4 2024 Police Oversight Panel: All Panel Meeting Penfield Tate II Municipal Building Virtual Wed Apr 10 2024 Police Oversight Panel: Co-Chairs/IPM Meeting Virtual Fri Apr 12 2024 Police Oversight Panel: Subcommittee Governance Meeting Virtual Tue Apr 16 2024 See All Events in Series Calendar Locations Services News Government Accessibility 1777 Broadway Boulder , CO 80302 Contact Us YouTube Twitter Facebook Instagram LinkedIn Nextdoor © 2024 City of Boulder. All Rights Reserved. Privacy Policy Calendar Jobs Contact Us Search English 繁體中文 Français Deutsch 한국어 Русский Español नेपाली en Locations Services Projects Government News Toggle Menu City of Boulder Locations Services Projects Government News Calendar Jobs Contact Us Search Breadcrumb Home Events Police Oversight Panel Details Date Thursday, October 13, 2022 Time 6:30 PM - 8:30 PM Locations Virtual Police Oversight Panel Meetings Boulder’s Police Oversight Panel meets on the second Thursday of every month. Add to Calendar Police Oversight Panel America/Denver

Boulder, CO
-United States

MM/DD/YYYY CONFIRMED OPAQUE Meeting Details Join online at https://tinyurl.com/wc4f29yk or join by phone 719 359 4580 Meeting ID: 894 9862 1296 Passcode: 589092 More Resources For panel-related inquiries, please contact: Florence Finkle finklef@bouldercolorado.gov (310) 906-0529 About the Police Oversight Panel Meeting Materials Archive Police Oversight Panel: Co-Chairs/IPM Meeting Virtual Fri Mar 29 2024 Police Oversight Panel: BPOP/Interim Chief of Police Meeting Virtual Mon Apr 1 2024 Police Oversight Panel: Subcommittee Community Engagement & Communications Meeting Virtual Thu Apr 4 2024 Police Oversight Panel: All Panel Meeting Penfield Tate II Municipal Building Virtual Wed Apr 10 2024 Police Oversight Panel: Co-Chairs/IPM Meeting Virtual Fri Apr 12 2024 Police Oversight Panel: Subcommittee Governance Meeting Virtual Tue Apr 16 2024 See All Events in Series Calendar Locations Services News Government Accessibility 1777 Broadway Boulder , CO 80302 Contact Us YouTube Twitter Facebook Instagram LinkedIn Nextdoor © 2024 City of Boulder. All Rights Reserved. Privacy Policy " -848,https://cityofpowell.us/police-agency/traffic-surveys/traffic-survey-report-5-15-18/,Poor Data Source,Poor Data Source,"City of Powell, Ohio | Traffic Survey Report 5-15-18","",200,"City of Powell, Ohio","[""Traffic Survey Report 5-15-18""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -849,https://www.sandiego.gov/department-document/san-diego-police-announce-arrest-balboa-park-sexual-assault-case,Media Bulletins,Agency-Published Resources,San Diego Police Announce Arrest in Balboa Park Sexual Assault Case | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""San Diego Police Announce Arrest in Balboa Park Sexual Assault Case"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -850,http://www.longbeach.gov/police/press-releases/critical-missing-person---edward-merrill-dephore/,Media Bulletins,Agency-Published Resources,CRITICAL MISSING PERSON - EDWARD MERRILL DEPHORE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/28/2019 FOR IMMEDIATE RELEASE Press Release # Subject: *UPDATE* LOCATED CRITICAL MISSING PERSON - EDWARD MERRILL DEPHOURE Contact: Media Relations Detail (562) 570-5273 LBPDMediaRelations@longbeach.gov UPDATE: On Wednesday, March 27, 2019, at approximately 7:20 p.m., critical missing person Edward Merrill Dephoure was located in the Belmont Shore area of Long Beach. He was found unharmed and was transported to his residence. Original News Release 3/27/19: ClICK ON PHOTO TO ENLARGE The Long Beach Police Department (LBPD) is seeking the public’s help with locating critical missing person Edward Merrill Dephoure, who was last seen on March 26, 2019, at approximately 12:00 p.m., by staff at a care facility on the 6500 block of Lemon Avenue. Yesterday at 2:00 p.m., the care facility received a call from an unknown calling party who stated he was with Dephoure in the City of Los Angeles, but was unable to stay with Dephoure. The care facility contacted LBPD and reported Dephoure missing. Dephoure is known to use public transportation on his own. The Critical Missing Person is described as follows: Age: 80 years old Gender: Male Race: White Height: 5’10” Weight: 120 lbs Hair: Grey Eyes: Brown Clothing: Grey Sweater, Jeans and Grey Tennis Shoes Scars/Marks/Tattoos: None Jewelry: None Visible Dental Work: None Medical Alerts: Suffers from medical condition(s) and may become disoriented Anyone with information regarding this missing person is urged to call the LBPD Missing Persons Detail at (562) 570-7246 or Police Dispatch at (562) 435-6711. Anyone wishing to remain anonymous may submit a tip through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -851,http://police.portlandmaine.gov/623/green-packaging-working-group,Not Criminal Justice Related,Not Criminal Justice Related,"Green Packaging Working Group | Portland, ME - Official Website",The Portland City Council has formed the Green Packaging Working Group to investigate the possibility of reducing or eliminating the use of plastic packaging in the city.,200,"Portland, ME - Official Website | Official Website","[""Green Packaging Working Group""]",[],[],[],[],[],"Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Completed Task Forces Green Packaging Working Group Green Packaging Working Group 2020 Charter Commission Ad Hoc Committee Ad Hoc ReCode Committee Broadband Planning Committee Congress Square Redesign Study Group Continuum of Care Council Appointee Subcommittee Fire / Code Inspections Task Force Franklin Street Committee Phase 2 Committee Members, City Staff & Consultants Vision Statement Green Building Incentive Task Force Green Packaging Working Group Hall School Building Committee Healthy Sustainable Food Systems Initiative Homelessness Prevention Task Force Libbytown Traffic Circulation & Streetscape Study Project Understanding Martin Luther King Recognition Task Force MLK Memorial Selection Committee Nathan Clifford Re-Use Advisory Task Force Past Housing Committee Pesticide & Fertilizer Task Force Portland Charter Commission Background Materials Portland Disability Advisory Committee Celebrating 30 Years of the ADA Get to know the PDAC Members Portland Open Space Vision & Implementation Plan Portland Youth Council Racial Equity Steering Committee School Facilities Ad Hoc Committee Solid Waste Task Force Spring Street - Free Street Area Streetscape Plan Members, City Staff & Consultants State & High Street Study Sustainable Storm Water Funding Task Force Task Forces CDBG Priority Task Force CDBG Working Group Waterfront Working Group Transforming Forest Avenue Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Completed Task Forces Green Packaging Working Group Green Packaging Working Group 2020 Charter Commission Ad Hoc Committee Ad Hoc ReCode Committee Broadband Planning Committee Congress Square Redesign Study Group Continuum of Care Council Appointee Subcommittee Fire / Code Inspections Task Force Franklin Street Committee Phase 2 Committee Members, City Staff & Consultants Vision Statement Green Building Incentive Task Force Green Packaging Working Group Hall School Building Committee Healthy Sustainable Food Systems Initiative Homelessness Prevention Task Force Libbytown Traffic Circulation & Streetscape Study Project Understanding Martin Luther King Recognition Task Force MLK Memorial Selection Committee Nathan Clifford Re-Use Advisory Task Force Past Housing Committee Pesticide & Fertilizer Task Force Portland Charter Commission Background Materials Portland Disability Advisory Committee Celebrating 30 Years of the ADA Get to know the PDAC Members Portland Open Space Vision & Implementation Plan Portland Youth Council Racial Equity Steering Committee School Facilities Ad Hoc Committee Solid Waste Task Force Spring Street - Free Street Area Streetscape Plan Members, City Staff & Consultants State & High Street Study Sustainable Storm Water Funding Task Force Task Forces CDBG Priority Task Force CDBG Working Group Waterfront Working Group Transforming Forest Avenue Government Websites by CivicPlus® " -852,https://delcopa.gov/ojs/ojsforms/divorcefees.pdf,Contact Info & Agency Meta,Info About Agencies,"","",200,"","","","","","","","" -853,http://boro.dormont.pa.us/wp-content/uploads/2022/04/5j3a9282-10-copy-scaled.jpg,Not Criminal Justice Related,Not Criminal Justice Related,"","",404,"","","","","","","","" -854,https://delcopa.gov/publicrelations/releases/2020/gamingauthoritymeeting.html,Not Criminal Justice Related,Not Criminal Justice Related,"Streaming of the Gaming Authority Meeting – 11-16-2020 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Streaming of the Gaming Authority Meeting – 11-16-2020""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Streaming of the Gaming Authority Meeting – 11-16-2020 Home / Departments / Public Relations Releases / Streaming of the Gaming Authority Meeting – 11-16-2020 Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Streaming of the Gaming Authority Meeting – 11-16-2020 Home / Departments / Public Relations Releases / Streaming of the Gaming Authority Meeting – 11-16-2020 Streaming of the Gaming Authority Meeting – 11-16-2020 Home / Departments / Public Relations Releases / Streaming of the Gaming Authority Meeting – 11-16-2020 Streaming of the Gaming Authority Meeting – 11-16-2020 Home / Departments / Public Relations Releases / Streaming of the Gaming Authority Meeting – 11-16-2020 Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Public Relations Navigation Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us " -855,https://wyoming.delaware.gov/wp-content/uploads/sites/33/nggallery/3rd-annual-wyoming-police-department-fishing-derby/p1010883.jpg,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -856,https://townoflandisnc.gov/departments/public-safety/police-department/faqs/,Resources,Agency-Published Resources,"FAQ's - Town of Landis, NC","",200,"Home - Town of Landis, NC","[""Landis Police FAQ’s""]","[""Frequently Asked Questions"", ""ATTENTION! PLEASE SHARE!"", ""Due to the rain in the upcoming weekend forecast, our Easter Egg-stravaganza event will be held SUNDAY March 24th from 2:00-4:00!""]","[""How Do I Contact the Police?"", ""How do I get a Police Report?"", ""How do I get a Gun Permit?"", ""How do I register an alarm system?""]","[""Patch Requests"", ""How Can We Help You?"", ""Other Helpful Links"", ""Contact Town of Landis""]",[],[],"" -857,http://www.longbeach.gov/police/press-releases/motorcycle-safety-operation-proves-effective-2-/,Media Bulletins,Agency-Published Resources,MOTORCYCLE SAFETY OPERATION PROVES EFFECTIVE(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/26/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MOTORCYCLE SAFETY OPERATION PROVES EFFECTIVE Contact: Media Relations Detail (562) 570-5273 On Sunday, May 24, 2015, the Long Beach Police -Department’s Traffic Section conducted a Motorcycle Safety Operation. During -the five-hour operation, motor officers patrolled throughout the city looking -for unsafe driving by motorcyclists as well as drivers who were operating -vehicles unsafely around motorcycle riders.  -Officers took the following enforcement actions: Cited thirty-five (35) motorcyclists for unsafe driving and/or non - DOT approved helmet Cited four (4) motorcyclists for not possessing a motorcycle - license endorsement Conducted two (2) Standardized Field Sobriety Tests to - motorcyclists Cited sixteen (16) drivers for unsafe driving Motorcycle fatalities saw a phenomenal drop of 37% from -2008 to 2010, but then rose 23% by 2012.  -Operations like this are aimed at curbing any more raises in motorcycle -deaths and sending the numbers back downward. Over the course of the past three -years, motorcycle involved collisions have resulted in 15 fatal and -approximately 277 injury crashes in the Long Breach. California collision data revealed that primary -causes of motorcycle-involved crashes include speeding, unsafe turning, and -impairment due to alcohol and other drugs by both riders and drivers -alike. Safety tips for riders – See -and Be Seen: Ride -with lights on during daylight hours Use -your lane position to increase visibility; change lanes only when there is -ample room Match -your speed to surrounding traffic Always -wear a DOT compliant helmet and brightly colored, protective clothing Safety tips for drivers – -Share the Road: Look -twice for motorcyclists, especially when entering the roadway, turning or -changing lanes Motorcyclist -are allowed in HOV lanes unless prohibited by signage Riders are urged to obtain training through the -California Motorcyclist Safety Program. Information and training locations are -available online or 1-877 RIDE 411 (1-877-743-3411). Funding for this program is provided by a grant from the -California Office of Traffic Safety through the National Highway Traffic Safety -Administration. The message to all drivers and motorcyclists is:  share in the responsibility and do your part -by safely “sharing the road.” This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -858,https://www.wakeforestnc.gov/police/operations/special-operations/tactical-services-unit,Contact Info & Agency Meta,Info About Agencies,"Tactical Services Unit | Town of Wake Forest, NC","The Tactical Service Unit is a part-time tactical unit trained and equipped to respond to critical incidents. Members of the Tactical Service Unit are trained in several high risk areas such as, high risk warrant service, barricaded subjects, and hostage rescue.The Tactical Service Unit, which includes two fully-trained snipers/observers, was created in the summer of 1998 and",200,"Town of Wake Forest, NC","[""Tactical Services Unit""]","[""greenways.jpg"", ""Town Hall Closed Friday, March 29"", ""Search form"", ""You are here""]",[],[],[],[],Skip to main content -859,https://jordanmn.gov/city-departments/jordan-police-department/frequently-used-forms/,Training & Hiring Info,Info About Officers,"Frequently Used Forms – City of Jordan, Minnesota","",200,403 Forbidden,"[""Frequently Used Forms""]",[],"[""Live Shop Dine Jordan"", ""CONTACT US"", ""USEFUL LINKS"", ""Notices"", ""Upcoming Events"", ""About Jordan"", ""Phone Numbers"", ""Join Our Newsletter"", ""City of Jordan City Hall""]","[""Public Notice – 1st Reading Ordinance 2024-03"", ""Public Notice – 1st Reading Ordinance 2024-02"", ""HELP WANTED- ELECTION JUDGES – 2024 ELECTION"", ""Public Notice – Ordinance 2023-09"", ""Public Hearing Notice- Second Reading of Ordinance 2023-08""]",[],[],"Menu City Government City Council Meetings Mayor and City Council Meeting Information City Council Minutes Jordan City Code City Charter Document Parks Economic Development Authority Meeting Meetings Planning Commission Minutes Parks and Recreation Commission Minutes Parks, Trails, & Park Documents News Events FAQ Helpful Links Jordan School District Scott County State of Minnesota Sustainability GreenStep Cities Floodplain Information Resources for Residents Solar Panels Garbage and Recycling Elections City Departments Administration City Clerk Deputy Registrar Economic Development Cannabis Information New Residential Development Jobs in Jordan Engineering-Bolton & Menk, Inc 2021 Road work MnDOT Projects Finance Jordan Fire Facebook Page Planning and Zoning Zoning Permits, Applications, & Forms Maps Planning Documents Floodplain Information Residential Rental Licensing and Inspection Solar Panels Jordan Police Department Community Crime Map and Alerts Police Services and Events Tip411- Submit a Tip Crime Stoppers Crime Free Multi-Housing Training Frequently Used Forms Annual Reports and Statistics Protecting Yourself: Informational Packets and Helpful Tips Police Department Staff Winter Parking and Snow Removal Regulations Police Patch Collectors Scott County Drug Prevention Task Force Take It To The Box Safe Disposal Jordan Police Department Minnesota POST Mandated Polices Jordan Police Department on Facebook Public Works City Jobs For Visitors Getting Around Explore Our Parks Tourism Utility Billing Pay Your Water Bill Online Monthly Billing Options For Residents About Mission and Value Statements History Tourism Explore Our Parks FAQ What’s cool about Jordan? New Residents Jordan Public Schools Jordan Library Code Red Newsletters Garbage and Recycling Garbage Recycling Household Organics + Yard Waste Drop-Off Site Other Yard Waste Options Scott County Environmental Health and Inspection Department Permits, Applications, & Forms Beyond the Yellow Ribbon – South of the River City Jobs Utility Contacts Map " -860,https://delcopa.gov/planning/forms.html,Not Criminal Justice Related,Not Criminal Justice Related,Forms,"",200,"Delaware County, Pennsylvania","[""Forms""]",[],"[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Forms Home / Departments / Planning Department / Forms Commonly used applications and forms requested by the Delaware County Planning Department can be found on this page. For certain review services, the Planning Department requires accurate completion of official forms, as mandated by the Pennsylvania Municipalities Planning Code. Other forms provide Department staff with the information needed to more quickly process requests. This page provides a central repository for forms found throughout the website. The Act 247 Application is for development and ordinance proposals. Please be sure that this application contains the original signatures of the developer/applicant and designated municipal official and is submitted to the Planning Department along with a minimum of 3 sets of plans. For more information, see ""Submit a Plan or Ordinance for Review."" Act 247 (Development Review) Application The Planning Department is the County agency responsible for processing form Component 4B – County Planning Agency Review of Pennsylvania Department of Environmental Protection (DEP) Act 537 Sewage Facility Planning Modules . See DEP’s Act 537 review process and electronic forms . Developers and applicants submitting planning modules to the Planning Department for review should review the required information to ensure a timely review. For more information, see "" Submit a Sewage Module for Review."" Act 537 (Sewage Module) Application The Department can support funding applications that are consistent with County planning goals. In order to provide support letters to grants, we need to know about your project. The Grant Support Letter Form gives us the information we need to provide a letter of support and send it to the appropriate place. Please submit this form no later than 10 days prior to your grant deadline . For more information, see ""Funding Assistance."" Grant Support Letter Form Questions about finding or completing Forms? Contact the Planning Department at 610-891-5200 or Planning_Department@co.delaware.pa.us . Planning Department Navigation Access the Data and Mapping Innovation Hub About Planning Calendar Current Projects Delaware County 2035 Demographic Data Development Review Forms Funding Green Space and Trails Project Mapping Municipal Programs & Initiatives Planning Education Publications Gina Burritt, Director Planning Department 2 W. Baltimore Avenue Suite 202 Media, PA 19063 Phone: 610-891-5200 Fax: 610-891-5203 Email: Planning_Department@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2023 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play " -861,https://delcopa.gov/courts/domesticrelations/forms.html,Not Criminal Justice Related,Not Criminal Justice Related,"Forms - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Forms""]",[],"[""Domestic Relations Navigation"", ""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[],"Menu A to Z Court Departments Local Rules FAQ Government Center Forms Home / Court Departments / Domestic Relations / Forms The following forms are available in Adobe Acrobat PDF format : Application for Telephonic Hearing Praecipe for Entry of Appearance Entry of Appearance as a Self-Represented Party Document Request Form PA SCDU Direct Deposit Enrollment Form Physician’s Information Unreimbursed Medical Expense Form Emancipation Inquiry Domestic Relations Navigation How do I... Apply for Support Services Prepare for my Conference/Hearing Comply with my Support Order Pay my Support Get Payment for Medical Bills Modify my Support Order Get Copies of my Court Order Change my Address Close my Support Case Legal Services Forms Family Court Self Represented Litigant Guide Patricia Coacher, Esquire Director Domestic Relations Chief Counsel Curran Building County Courthouse Complex 2nd & Orange Streets Media, PA 19063 Phone: 610-891-4314 Press 1 for IVR Press 2 to speak to a Client Information Representative Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 delcocourts@co.delaware.pa.us Courts Quick Links Juror eResponse PA Law Help Self Help - Custody Self Help - Divorce Juror Handbook Language Access Family Court Self Represented Litigant Guide Government Center Quick Links Marriage Licenses Crisis Connection Certified Recovery Specialist Public Access Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Forms Home / Court Departments / Domestic Relations / Forms Forms Home / Court Departments / Domestic Relations / Forms Forms Home / Court Departments / Domestic Relations / Forms The following forms are available in Adobe Acrobat PDF format : Application for Telephonic Hearing Praecipe for Entry of Appearance Entry of Appearance as a Self-Represented Party Document Request Form PA SCDU Direct Deposit Enrollment Form Physician’s Information Unreimbursed Medical Expense Form Emancipation Inquiry Domestic Relations Navigation How do I... Apply for Support Services Prepare for my Conference/Hearing Comply with my Support Order Pay my Support Get Payment for Medical Bills Modify my Support Order Get Copies of my Court Order Change my Address Close my Support Case Legal Services Forms Family Court Self Represented Litigant Guide Patricia Coacher, Esquire Director Domestic Relations Chief Counsel Curran Building County Courthouse Complex 2nd & Orange Streets Media, PA 19063 Phone: 610-891-4314 Press 1 for IVR Press 2 to speak to a Client Information Representative " -862,https://delcopa.gov/planning/pdf/greenspace/taskforce/andrew bunting.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -863,https://www.stpaul.gov/departments/police/administration-office-chief/support-services-administration/police-impound-lot-1,Resources,Agency-Published Resources,Online Auction | Saint Paul Minnesota,Selected Impound vehicles are sent to an online auction: Please go to the following site to look at current auctions - www.CrankyApe.com Lake Elmo Loaction,200,Home | Saint Paul Minnesota,"[""Online Auction""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Footer""]","[""You are using an unsupported browser. Please use Microsoft Edge."", ""Contact The City"", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[],"" -864,https://www.sandiego.gov/police/news-center/cold-cases/dave-earl-carr,Media Bulletins,Agency-Published Resources,Dave Earl Carr | City of San Diego Official Website,"On May 12, 1994 SDPD officers responded to a shooting at 5114 El Cajon Blvd. and found the victim Dale Carr unconscious and suffering from a gunshot wound. Carr was rushed to a hospital but died from his injury. An investigation developed the following information: Carr had a prostitute working out of his apartment. Earlier that evening, a customer had visited Carr's apartment. Carr accepted the customers payment up front, but later argued with him over the amount of change due. Carr refused to back down and the man left angry.",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""Cold Case: Dave Earl Carr""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""News Center"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -865,https://bolivar.mo.us/shop-with-a-copr/img_1184-2/,Poor Data Source,Poor Data Source,"IMG_1184 - City of Bolivar, Missouri","",200,"Welcome to Bolivar - Where Liberty Flows - City of Bolivar, Missouri","[""IMG_1184""]",[],[],[],[],[],"Skip to content DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us IMG_1184 Home Departments Police Shop with a Cop® IMG_1184 12 Dec 2014 by City Administrator WordPress Theme - Total by HashThemes DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us IMG_1184 Home Departments Police Shop with a Cop® IMG_1184 12 Dec 2014 by City Administrator IMG_1184 Home Departments Police Shop with a Cop® IMG_1184 IMG_1184 Home Departments Police Shop with a Cop® IMG_1184 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator WordPress Theme - Total by HashThemes WordPress Theme - Total by HashThemes WordPress Theme - Total by HashThemes " -866,https://coloradosprings.gov/police-department/article/news/update-december-21-officer-involved,Officer Involved Shootings,Police & Public Interactions,Update: December 21 officer involved shooting | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Update: December 21 officer involved shooting""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -867,https://www.lakewoodoh.gov/coffee-with-a-cop-set-for-friday-december-1st/,Misc Police Activity,Police & Public Interactions,"Coffee With A Cop set for Friday, December 1st | The City of Lakewood, Ohio","The Lakewood Police Department will host another ""Coffee With A Cop"" event on Friday, December 1, 2017 from 8:00 a.m. to 10:00 a.m. at Playgrounds, 15715",200,"The City of Lakewood, Ohio","[""Coffee With A Cop set for Friday, December 1st""]",[],"[""Recent News"", ""Upcoming Events"", ""Most Popular Pages""]",[],[],[],"Search for: Search Facebook Twitter YouTube Instagram News Minutes/Agendas A-Z Index Contact City Hall FAQs Apply / Register Apply For A Job Autism Safety Roster Block Party Permits Boards / commissions Building Permits Contractor registration Donation Box Permit Do-Not-Knock Registry Food Trucks Housing Assistance Housing Assistance Housing License Landlord Training Seminar Pavilion Rentals Solicitor’s License Summer Sprinkling Prg Vendors Payments / Taxes Pay your water bill Pay your EMS bill Pay Your Parking Ticket Taxes Calendar City Council Court Departments Boards/commissions Community Development Early Childhood Family & Youth Services Finance Fire Department Housing & Building Human Resources Human Services Law Mayor’s Office Municipal Income Tax Planning & Development Police Department Purchasing Division Public Works Engineering Parks Refuse & Recycling Streets & Forestry Water & Wastewater Collection Wastewater Treatment Senior Services Vital Statistics Report A Problem Coffee With A Cop set for Friday, December 1st November 14, 2017 The Lakewood Police Department will host another “Coffee With A Cop” event on Friday, December 1,  2017  from 8:00 a.m. to 10:00 a.m. at Playgrounds, 15715 Madison Ave. Join members of the department for coffee and conversation.  There will be no agenda or speeches — just a chance to ask questions and to get to know your neighborhood officers. The participating officers won’t provide coffee, but they will have some tokens to give away to those who stop by. This will hopefully help to strengthen the relationship between residents and the police, and also help a business out in the process. The Lakewood Police Department’s “Coffee With A Cop” event is part of a national movement.  For more information, please visit coffeewithacop.com . Recent News No Refuse & Recycling Collection on Monday, April 1st March 22, 2024 Lakewood Tax Office To Offer Extended Hours March 18, 2024 H2O Summer Service Camp Registration Begins Tuesday, March 19th March 15, 2024 Upcoming Events Monday Drop-In March 25, 2024 Housing, Planning & Development Committee Meeting March 25, 2024 Toddler Tuesday March 26, 2024 Most Popular Pages Heritage Home Loan Prgm Eclipse Infomation E-Newsletter Sign-Up Safe Place Initiative Lakewood Life Newsletter Downtown Development Frequently Asked Questions Lkwd Park Waterfront Feasibility Study Interceptor Tunnel Rehabilitation Project Birth/Death Certificates Minutes/Agendas Public Record Requests Clean Water Lakewood Pavilion Rentals Public Art Accountability & Sound Governance Lakewood City Hall: 12650 Detroit Ave. Lakewood, OH 44107 (216) 521-7580 Hours: 8:00 AM to 4:30 PM Read Website Policy>> Receive Lakewood City News & Updates Email * Example: Yes, I would like to receive emails from The City of Lakewood, Ohio. (You can unsubscribe anytime) Constant Contact Use. By submitting this form, you are consenting to receive marketing emails from: The City of Lakewood Ohio, 12650 Detroit Avenue, Lakewood, OH, 44107, https://lakewoodoh.gov. You can revoke your consent to receive emails at any time by using the SafeUnsubscribe® link, found at the bottom of every email. Emails are serviced by Constant Contact Read Disclosure » Facebook Twitter YouTube Instagram " -868,https://www.mass.gov/doc/lynn-police-credit-union-cra-public-evaluation-0/download,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -869,https://www.southamptontownnypolice.gov/1197/hampton-hills-association---bulkhead,Not Criminal Justice Related,Not Criminal Justice Related,"Hampton Hills Association | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Hampton Hills Association""]","[""WQIP - Committee Interview""]","[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]","[""WQIP - Proposal Summary"", ""WQIP - Fund Application""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Community Preservation Fund (CPF) WQIPP - Plan/Checklist/App 2018 WQIP - Applications & Proposal Summaries Hampton Hills Association - Bulkhead Hampton Hills Association WQIP - Proposal Summary WQIP Proposal Summary Sheet - Hampton Hill Association WQIP - Fund Application WQIP Fund Application - Hampton Hill Association WQIP - Committee Interview WQIP Application Interview - Hampton Hill Association Southampton Town - Round Pond Stormwater Hampton Hills Association - Bulkhead Village of Southampton - Lake Agawam Stormwater Village of Westhampton Beach - Stormwater Proposal Village of Westhampton Beach - Sewer System Phase Town Trustees - Mecox Bay- Aquatic Restoration Village of Sag Harbor - Green Infrastructure Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Community Preservation Fund (CPF) WQIPP - Plan/Checklist/App 2018 WQIP - Applications & Proposal Summaries Hampton Hills Association - Bulkhead Hampton Hills Association WQIP - Proposal Summary WQIP Proposal Summary Sheet - Hampton Hill Association WQIP - Fund Application WQIP Fund Application - Hampton Hill Association WQIP - Committee Interview WQIP Application Interview - Hampton Hill Association Southampton Town - Round Pond Stormwater Hampton Hills Association - Bulkhead Village of Southampton - Lake Agawam Stormwater Village of Westhampton Beach - Stormwater Proposal Village of Westhampton Beach - Sewer System Phase Town Trustees - Mecox Bay- Aquatic Restoration Village of Sag Harbor - Green Infrastructure Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -870,https://coloradosprings.gov/police-department/page/patrol-bureau,Contact Info & Agency Meta,Info About Agencies,Patrol Bureau | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Patrol Bureau""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]","[""Stetson Hills (Northeast)"", ""Stetson Hills (Northeast)"", ""Sand Creek (Southeast)"", ""Sand Creek (Southeast)"", ""Gold Hill (Southwest)"", ""Gold Hill (Southwest)"", ""Falcon (Northwest)"", ""Falcon (Northwest)"", ""School Resource Unit"", ""School Resource Unit"", ""Community Service Officer Unit (CSO)"", ""Community Service Officer Unit (CSO)"", ""DUI Unit"", ""DUI Unit"", ""Divisional Property Crimes Detectives"", ""Divisional Property Crimes Detectives"", ""Crime Prevention Officers"", ""Crime Prevention Officers"", ""The Homeless Outreach Team (HOT)"", ""The Homeless Outreach Team (HOT)"", ""Gang Unit"", ""Gang Unit"", ""Community Response Team"", ""Community Response Team""]","[""Patrol Bureau""]","[""REPORT ONLINE""]",[],"" -871,https://norfolkne.gov/government/departments/police-division/press-releases/august-14-press-release.html,Media Bulletins,Agency-Published Resources,"August 14 Press Release - City of Norfolk, NE","",200,"Welcome to Norfolk, NE - City of Norfolk, NE","[""City of Norfolk, NE"", ""Police Division"", ""August 14 Press Release"", ""City of Norfolk, NE""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]","" -872,https://bouldercolorado.gov/news/boulder-police-looking-unlawful-sexual-contact-suspect,Media Bulletins,Agency-Published Resources,Boulder Police Looking for Unlawful Sexual Contact Suspect | City of Boulder,"",200,Home | City of Boulder,"[""Boulder Police Looking for Unlawful Sexual Contact Suspect""]","[""Breadcrumb"", ""Details"", ""Boulder Police are working to identify a man that assaulted an adult woman"", ""Keep Reading""]","[""Body of Unidentified White Male Found in Boulder Creek, No Indications of Foul Play"", ""Boulder Police Department Seeks New Volunteers to Become Victim Advocates"", ""Boulder Police Investigating Fatal Traffic Crash"", ""Boulder Police Release More Information About Dog Attack""]",[],[],[],"Calendar Jobs Contact Us Search English 繁體中文 Français Deutsch 한국어 Русский Español नेपाली en Locations Services Projects Government News Toggle Menu City of Boulder Locations Services Projects Government News Calendar Jobs Contact Us Search Breadcrumb Home News Boulder Police Looking for Unlawful Sexual Contact Suspect Image Details Shannon Aulabaugh, Media Relations, 720-484-9903 AulabaughS@bouldercolorado.gov Published Date Jul 20, 2021 Shannon Aulabaugh, Media Relations, 720-484-9903 AulabaughS@bouldercolorado.gov Boulder Police are working to identify a man that assaulted an adult woman Boulder Police are working to identify a man that assaulted an adult woman in the 1900 block of Grove Street on July 18 at approximately 2:30 a.m. The victim was attempting to enter her home when a man grabbed her from behind. The victim screamed and the suspect fled on foot. The suspect is described as a white male between 5’6” and 5’09” with a medium build. At the time of the incident, he was wearing a black hooded Champion sweatshirt, a black stocking cap beanie, gray face mask and gray pants. The entire assault was captured on surveillance video. Anyone who may have information on this case is asked to call Detective Starks at 303-441-3067 reference case 21-6209. Those who have information but wish to remain anonymous may contact the Northern Colorado Crime Stoppers at 1-800-222-TIPS (8477). Tips may also be submitted through the Crime Stoppers website at crimeshurt.com Keep Reading Body of Unidentified White Male Found in Boulder Creek, No Indications of Foul Play March 22, 2024 Boulder Police Department Seeks New Volunteers to Become Victim Advocates March 5, 2024 Boulder Police Investigating Fatal Traffic Crash February 7, 2024 Boulder Police Release More Information About Dog Attack January 29, 2024 Calendar Locations Services News Government Accessibility 1777 Broadway Boulder , CO 80302 Contact Us YouTube Twitter Facebook Instagram LinkedIn Nextdoor © 2024 City of Boulder. All Rights Reserved. Privacy Policy " -873,http://police.portlandmaine.gov/225/fire-department-careers,Not Criminal Justice Related,Not Criminal Justice Related,"Fire Department Careers | Portland, ME - Official Website","The Portland Fire Department accepts employment applications when the need for an eligibility list is determined, which typically occurs on an annual basis. Hiring information and applications will be available on the HR website when the application period is open.",200,"Portland, ME - Official Website | Official Website","[""Fire Department Careers""]",[],[],[],[],[],Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government Departments Fire Fire Department Careers Fire Department Careers Minimum Qualifications PAT Test PAT Preparation (PDF) Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Fire Fire Department Careers Fire Department Careers Minimum Qualifications PAT Test PAT Preparation (PDF) Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Fire Fire Department Careers Fire Department Careers Minimum Qualifications PAT Test PAT Preparation (PDF) Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Fire Fire Department Careers Fire Department Careers Minimum Qualifications PAT Test PAT Preparation (PDF) Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Fire Fire Department Careers Fire Department Careers Minimum Qualifications PAT Test PAT Preparation (PDF) Home Your Government Departments Fire Fire Department Careers Fire Department Careers Minimum Qualifications PAT Test PAT Preparation (PDF) Home Your Government Departments Fire Fire Department Careers Fire Department Careers Minimum Qualifications PAT Test PAT Preparation (PDF) Home Your Government Departments Fire Fire Department Careers Fire Department Careers Home Your Government Departments Fire Fire Department Careers Fire Department Careers Home Your Government Departments Fire Fire Department Careers Fire Department Careers Fire Department Careers Minimum Qualifications PAT Test PAT Preparation (PDF) Minimum Qualifications PAT Test PAT Preparation (PDF) Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® -874,https://www.arlingtontx.gov/news/my_arlington_t_x/police_news_releases/fatality_crash_report__2019-00690088,Media Bulletins,Agency-Published Resources,Fatality Crash Report #2019-00690088 - City of Arlington,"",200,Just a moment...,"[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Fatality Crash Report #2019-00690088""]",[],[],[],[],Skip to Content Skip to Content -875,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/031621summary.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -876,http://www.ryepolice.us/announcements/state-of-new-hampshire-department-of-safety-press-release-extreme-heat/attachment/heat-press-release,Media Bulletins,Agency-Published Resources,Rye Police Department Heat Press Release - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Heat Press Release""]","[""Heat Press Release""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"­ Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Heat Press Release Home Heat Press Release Heat Press Release July 19, 2019 Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search " -877,http://www.ryepolice.us/logs/police-logs-for-3-6-19-3-12-19,Daily Activity Logs,Info About Officers,Rye Police Department Police Logs for 3/6/19-3/12/19 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs for 3/6/19-3/12/19""]","[""Police Logs for 3/6/19-3/12/19""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -878,https://delcopa.gov/planning/programsandinitiatives/bicyclemasterplans.html,Not Criminal Justice Related,Not Criminal Justice Related,BicycleMaster Plans,"",200,"Delaware County, Pennsylvania","[""Bicycle Master Plans""]","[""Create a Bicycle Master Plan"", ""Funding Assistance"", ""Find Bicycle Routes and Trails""]","[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Bicycle Master Plans Home / Departments / Planning Department / Municipal Programs & Initiatives / Bicycle Master Plans Delaware County Planning advocates for the safety of travel for all users, including cyclists, throughout roadways and trails in our region. Bicycling is a viable transportation option for many residents of Delaware County, based on increased national and regional levels of commuter and recreational bicycling. The Planning Department offers its services and expertise in transportation planning to assist municipal planning efforts to make bicycling a safer, more efficient mode choice for traveling. Questions about Bicycle Master Plans? Contact the Planning Department at 610-891-5200 or Planning_Department@co.delaware.pa.us . Create a Bicycle Master Plan Best suited for a municipal or multi-municipal planning effort, Bicycle Master Plans recommend roadways apt for bicycling by identifying corridors for enhancing bicycle travel and suggesting appropriate facility type improvements to expand and integrate local and regional bicycle networks. Bicycle Master Plans may suggest solutions ranging from traditional on-road bicycle improvements to protected bicycle boulevards and cycle tracks. Funding Assistance Regional and state funding sources may be available to support your request for creating a Bicycle Master Plan. For currently available funding assistance programs, see the Funding page. Find Bicycle Routes and Trails The Bicyclists’ Baltimore Pike route is an on road bicycle route that gives bicyclists a less traffic heavy option to parallel Baltimore Pike. The Circuit provides information on already existing bicycle routes and multi-use trails. You can also review the County’s adopted Bicycle Plan here . Planning Department Navigation Access the Data and Mapping Innovation Hub About Planning Calendar Current Projects Delaware County 2035 Demographic Data Development Review Forms Funding Green Space and Trails Project Mapping Municipal Programs & Initiatives Planning Education Publications Gina Burritt, Director Planning Department 2 W. Baltimore Avenue Suite 202 Media, PA 19063 Phone: 610-891-5200 Fax: 610-891-5203 Email: Planning_Department@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2023 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Bicycle Master Plans Home / Departments / Planning Department / Municipal Programs & Initiatives / Bicycle Master Plans " -879,https://delcopa.gov/council/2015minutes/092315minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -880,https://www.littlerock.gov/news/new-little-rock-police-department-chief-to-hold-public-meetings-in-all-city-wards/,Media Bulletins,Agency-Published Resources,New Little Rock Police Department Chief to Hold Public Meetings in All City Wards | City of Little Rock,"",200,"City of Little Rock, Arkansas - Capital City - Pulaski County | City of Little Rock",[],"[""Media Release""]",[],[],[],[],We use cookies to give you the best online experience. Please review our use of cookies and accept to continue. Learn more Accept Accept -881,https://www.mass.gov/event/scoping-meeting-ma-response-to-anticipated-changes-to-federal-atlantic-large-whale-take-reduction-plan-affecting-trap-fisheries-2020-02-19t180000-0500-2020-02-19t200000-0500,Not Criminal Justice Related,Not Criminal Justice Related,Scoping Meeting: MA Response to Anticipated Changes to Federal Atlantic Large Whale Take Reduction Plan Affecting Trap Fisheries | Mass.gov,DMF has scheduled two scoping meetings to discuss the state’s response to anticipated changes to the federal Atlantic Large Whale Take Reduction Plan (ALWTRP).,200,Mass.gov,"[""Public Meeting Notice Scoping Meeting: MA Response to Anticipated Changes to Federal Atlantic Large Whale Take Reduction Plan Affecting Trap Fisheries""]","[""Address"", ""Contact for Scoping Meeting: MA Response to Anticipated Changes to Federal Atlantic Large Whale Take Reduction Plan Affecting Trap Fisheries"", ""Overview of Scoping Meeting: MA Response to Anticipated Changes to Federal Atlantic Large Whale Take Reduction Plan Affecting Trap Fisheries"", ""Additional Resources for Scoping Meeting: MA Response to Anticipated Changes to Federal Atlantic Large Whale Take Reduction Plan Affecting Trap Fisheries"", ""Contact for Scoping Meeting: MA Response to Anticipated Changes to Federal Atlantic Large Whale Take Reduction Plan Affecting Trap Fisheries"", ""Participating Organizations"", ""Contact for Scoping Meeting: MA Response to Anticipated Changes to Federal Atlantic Large Whale Take Reduction Plan Affecting Trap Fisheries"", ""Upcoming Events for Scoping Meeting: MA Response to Anticipated Changes to Federal Atlantic Large Whale Take Reduction Plan Affecting Trap Fisheries"", ""Help Us Improve Mass.gov with your feedback""]","[""Division of Marine Fisheries"", ""Division of Marine Fisheries"", ""Division of Marine Fisheries""]","[""Phone"", ""Online"", ""Fax"", ""Phone"", ""Online"", ""Fax"", ""Phone"", ""Online"", ""Fax""]",[],[],"" -882,https://wrightstown.us/police-reports/11-29-2015-12-05-2015/,Media Bulletins,Agency-Published Resources,11-29-2015 - 12-05-2015 - Village of Wrightstown,"",200,"Village of Wrightstown, Wisconsin ~ Official Website","[""11-29-2015 – 12-05-2015""]","[""Recent News"", ""Upcoming Events""]","[""Good Friday"", ""Easter"", ""April Fool’s Day"", ""Easter Monday"", ""Earth Day""]","[""Village Hall"", ""Public Works"", ""Police Department"", ""Fire Department"", ""Join Us on Social Media""]",[],[],"920-532-5567 info@wrightstown.us Job Opportunities Map Upcoming Events Recent News Village Photos Menu Home Government History Mission Statement, Vision Statement, and Code of Ethics Municipal Court History of Wrightstown Municipal Court Municipal Court Procedures Municipal Court FAQ’s Municipal Court Payments Municipal Court Forms Municipal Court Public Records Request Close Close Departments Clerk / Treasurer Assessor Building Permits/Inspections Building Permit Application Elections Dog Licenses Operator’s License Agendas 2024 Budgets 2023 Minutes 2024 Minutes Minutes Archive Police Police Vision • Mission • Values Police Community Information Driving in School Zones Fireworks Safety Snowmobile Information Sex Offender Information Close Police Department Employees Police Crime Prevention Programs Coffee with a Cop Prescription Drug Drop Off Neighborhood Watch Property Watch Close Salvage Vehicle Inspection Program Police Reports Open Records Request Police FAQ’s Police Helpful Links Police Job Opportunities Public Works & Utilities Water Utility Sewer Utility Water & Sewer Rates Brush Chipping, Compost & Yard Waste Site Parks & Recreation Storm Water Collection Solid Waste & Recycling Street Operations Administration Planning / Zoning 2016 Comprehensive Plan Municipal Codes Fire Department Burning Permit Application Employment Application Fire Inspections Frequently Asked Questions Close Residents & Visitor Info Business Contact Select Page 11-29-2015 – 12-05-2015 11-29-2015 - 12-05-2015 Recent News New DPW Garage & Compost Site 886 Mallard Rd March 12, 2024 Dog Licenses due March 31st February 13, 2024 2024 Annual Boat Launch Stickers February 2, 2024 Winter News 2023 December 13, 2023 All-Night Parking Restrictions Nov. 1-Mar. 31 November 1, 2023 Upcoming Events Mar 29 All day Good Friday Mar 31 All day Easter Apr 1 All day April Fool’s Day Apr 1 All day Easter Monday Apr 22 All day Earth Day View Calendar Village Hall 352 High Street Wrightstown, WI 54180 Phone: 920-532-5567 Mon, Wed, Thur: 8:00am – 4:30pm Tues: 8:00am – 6:00pm Friday 8:00am to Noon Public Works 101 Washington Street Wrightstown, WI 54180 Phone: 920-532-0434 Monday – Friday 7:00am – 3:30p After Hours On Call Phone 920-606-6426 Police Department 352 High Street Wrightstown, WI 54180 911 for emergencies Phone: 920-532-6007 for non-emergencies and other police related issues Fire Department 961 Broadway Street Wrightstown, WI 54180 911 for emergencies Phone: 920-532-4556 for non-emergencies Join Us on Social Media Home History Map Business Event Calendar Recent News Contact Wrightstown Web Mail Village of Wrightstown © All Rights Reserved | Established in 1901 | Fox River Valley • Wisconsin | Website Design & Development: Fox Valley Web Design LLC 920-532-5567 info@wrightstown.us Job Opportunities Map Upcoming Events Recent News Village Photos 920-532-5567 info@wrightstown.us Job Opportunities Map Upcoming Events Recent News Village Photos 920-532-5567 info@wrightstown.us Job Opportunities Map Upcoming Events Recent News Village Photos " -883,https://sanramon.ca.gov/our_city/departments_and_divisions/police/alarms,Policies & Contracts,Info About Agencies,Alarm Registration Program - City of San Ramon,"",200,Just a moment...,"[""Alarm Registration Program""]","[""Contact Us"", ""Alarm Registration Program"", ""Contact Us"", ""Useful Links""]",[],[],[],[],"" -884,http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-3-/,Media Bulletins,Agency-Published Resources,DUI-DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND(3),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -885,https://www.stcharlesil.gov/departments/police/overview/bike-patrol,Media Bulletins,Agency-Published Resources,"Bike Patrol | City of St Charles, IL","The St. Charles bicycle patrol unit is an ""as needed"" unit that was started in May of 1993 with the help of the staff from the Bike Rack here in St. Charles. The bicycle patrol is used to supplement the three patrol shifts during the summer months.",200,"City of St. Charles, Illinois","[""City of St. Charles, Illinois"", ""Bike Patrol""]","[""You are here"", ""Police Department"", ""Key Resources"", ""Connect With Us""]",[],[],[],[],"" -886,https://ridgelandsc.gov/police-department/daily-arrest-reports-december-2019,Arrest Records,Police & Public Interactions,Town of Ridgeland,Town of Ridgeland,200,Town of Ridgeland,"[""Police Department""]","[""Daily Arrest Reports - December 2019""]",[],[],[],[],"HOME GOVERNMENT Government Mayor Town Council Boards & Commissions Board, Commission, & Committee Vacancies Town Council Meeting Agendas Town Council Videos Resources Bid Opportunities Public Meeting Agendas Financial Documents DEPARTMENTS Executive Finance, HR and Risk Management Municipal Court Planning and Community Development Police Department Fire Department Water & Sewer BUSINESS Bid Opportunities Building Permits & Forms Business License Information Economic Development Opening a Business Public Meeting Agendas Resources Zoning Maps COMMUNITY About Ridgeland Battle of Honey Hill Community Events Job Opportunities Maps Gallery News & Information Ordinances Parks & Trails Public Safety/Utilities Schools Services Town of Ridgeland Farmers Market I WANT TO... Contact a Staff Member File a FOIA Request Find Out About Trash Collection Service Find the Police Department Find the Fire Department Find Town Hall Find Zoning Maps Learn About Services Pay a Traffic Fine Pay My Water Bill I Want Water/Sewer Service Rent Lakeside at Blue Heron HOME GOVERNMENT Government Mayor Town Council Boards & Commissions Board, Commission, & Committee Vacancies Town Council Meeting Agendas Town Council Videos Resources Bid Opportunities Public Meeting Agendas Financial Documents DEPARTMENTS Executive Finance, HR and Risk Management Municipal Court Planning and Community Development Police Department Fire Department Water & Sewer BUSINESS Bid Opportunities Building Permits & Forms Business License Information Economic Development Opening a Business Public Meeting Agendas Resources Zoning Maps COMMUNITY About Ridgeland Battle of Honey Hill Community Events Job Opportunities Maps Gallery News & Information Ordinances Parks & Trails Public Safety/Utilities Schools Services Town of Ridgeland Farmers Market I WANT TO... Contact a Staff Member File a FOIA Request Find Out About Trash Collection Service Find the Police Department Find the Fire Department Find Town Hall Find Zoning Maps Learn About Services Pay a Traffic Fine Pay My Water Bill I Want Water/Sewer Service Rent Lakeside at Blue Heron HOME GOVERNMENT Government Mayor Town Council Boards & Commissions Board, Commission, & Committee Vacancies Town Council Meeting Agendas Town Council Videos Resources Bid Opportunities Public Meeting Agendas Financial Documents DEPARTMENTS Executive Finance, HR and Risk Management Municipal Court Planning and Community Development Police Department Fire Department Water & Sewer BUSINESS Bid Opportunities Building Permits & Forms Business License Information Economic Development Opening a Business Public Meeting Agendas Resources Zoning Maps COMMUNITY About Ridgeland Battle of Honey Hill Community Events Job Opportunities Maps Gallery News & Information Ordinances Parks & Trails Public Safety/Utilities Schools Services Town of Ridgeland Farmers Market I WANT TO... Contact a Staff Member File a FOIA Request Find Out About Trash Collection Service Find the Police Department Find the Fire Department Find Town Hall Find Zoning Maps Learn About Services Pay a Traffic Fine Pay My Water Bill I Want Water/Sewer Service Rent Lakeside at Blue Heron " -887,https://barnegatpolice.us/wp-content/uploads/2018/05/contactuspageheader-300x135.jpg,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -888,https://www.bedminster.us/police_fire_rescue/far_hills__bedminster_fire_dept,Not Criminal Justice Related,Not Criminal Justice Related,Far Hills-Bedminster Fire Dept. - Township of Bedminster,"",200,Just a moment...,"[""Bedminster Township""]","[""Far Hills-Bedminster Fire Dept.""]","[""Bedminster Township""]",[],[],[],"" -889,https://brewermaine.gov/news/brewer-police-pull-woman-from-joshua-chamberlain-bridge/bridges-1gd-jpg/,Poor Data Source,Poor Data Source,"• The City of Brewer, Maine","",200,403 Forbidden,"[""Brewer News""]",[],[],[],[],[],"Skip to content Search Primary Menu Search Home Departments Assessing – GIS Assessing Procedures Property Values Online Database Commitment & Tax Records Exemptions & Tax Relief Programs GIS Maps Tax Maps City Clerk Meetings, Agendas, and Minutes Ordinances Boards & Committees Licenses & Fee Schedule Vital Records Elections City Manager City Organizational Chart Civil Rights Compliance Employment Opportunities General Assistance City Hall Hours & Holiday Schedule Code Enforcement Online Permit Application & Search Permit Application / Vacant Property Registration Application Forms / Fee Schedule Codes Site Plans Ordinances Land Use Code Zoning Health Officer Economic Development 2023 Brewer Retail Consumer Survey Why Brewer? Starting a Business Business Assistance Licensing & Permitting Brewer Business Alliance Engineering Construction Project Updates Map & Reference Information Posted Road Information Street Light Conversion Environmental Services Water Pollution Control Facility Permit & Performance Data WPCF Brochure Solid Waste Programs Curbside Collection Brewer Landfill Household Hazardous Waste Program Universal Waste Program Leaf Collection & Composting Program Private On-Site Septic Systems Public Education Program Sewer/Water: Billing & Payment Stormwater Program Dig Safe Notification Finance Online Services Property Tax: Billing & Payment Sewer/Water: Billing & Payment Motor Vehicle Registration Boat, ATV, & Snowmobile Registration Fish & Game Licenses Dog Licenses Yard Sale Permits Bond Ratings & Audits Financial Policies Fire Fire Prevention Burn Permit Public Safety Museum Library Library Cards & Circulation Policies Online Catalog Passport Information Programs Online & Streaming Brewer Library Academy Parks & Recreation Joseph L. Ferris Community Center Fitness Park Instruction Videos Online Registration Parks & Cemeteries Seasonal Recreation Planning Comprehensive Plan Land Use Code Zoning Brewer Land Trust Site Plans Impact Fees State & Federal Permitting Police Divisions FAQ Mission & Vision Public Safety Museum Public Works Projects Winter Parking Rules Curbside Trash / Recycling Collection Brewer Landfill Dig Safe Notification Technology Water Customer Information & Application Water Rates Online Tax & Utility Payments Consumer Confidence Reports Dig Safe Notification Backflow/Cross Connection Program Testing Lab Water Main Flushing Doing Business Why Brewer? Starting a Business Relocate a Business Business Assistance Doing Business with Brewer & RFPs Licensing & Permitting Community Brewer News Brewer Farmers Market Brewer History Brewer Historical Society Brewer Land Trust Brewer Riverwalk City Online Services Community Connector / Bus Fitness Park Instruction Videos Parks & Cemeteries Performing Arts Center Places to Eat Public Safety Museum School Department Street Map Veterans Memorial City Council Meetings, Agendas, and Minutes Ordinances Boards & Committees Meet the City Councilors Employment Opportunities Brewer Meetings & Events Join Notify Brewer Brewer News Back to archive Home / Brewer police pull woman from Joshua Chamberlain Bridge Share Facebook Twitter E-mail Print Print The Joshua Chamberlain Bridge in Bangor. (Bangor Daily News/Gabor Degre) Prev Close × Disclaimer Privacy Policy © 2024 The City of Brewer, Maine. All Rights Reserved. Search Primary Menu Search Search " -890,https://www.mass.gov/how-to/register-for-cops-on-bicycles-with-education-for-bicyclists-cobweb,Misc Police Activity,Police & Public Interactions,"","",403,"","","","","","","","" -891,https://ijjc.illinois.gov/newsroom/mayor-emanuel-chicago-police-department-department-family-and-support-services-announce-40/,Poor Data Source,Poor Data Source,"Mayor Emanuel, Chicago Police Department, Department of Family and Support Services Announce a 40 Percent Decrease in Youth Violence in 2013 – Illinois Juvenile Justice Commission","",200,403 Forbidden,"[""Mayor Emanuel, Chicago Police Department, Department of Family and Support Services Announce a 40 Percent Decrease in Youth Violence in 2013""]",[],[],[],[],[],"Illinois Juvenile Justice Commission Main Menu About Menu Toggle IJJC Principles Menu Toggle The Role of the Illinois Juvenile Justice Commission Strategies & Activities Core Value: Fundamental Fairness Core Value: Recognizing Youth-Adult Differences Core Value: Individual Differences Core Value: Youth Potential Core Value: Family Engagement Core Value: Community Engagement Core Value: Community Safety Core Value: Accountability Core Value: Cost Effectiveness Commission Members Committees Meeting Minutes Menu Toggle Illinois Juvenile Justice Commission Meeting Minutes Executive Committee Meeting Minutes Planning & Grants Committee Meeting Minutes Juvenile Detention Alternatives Initiative (JDAI) Committee Meeting Minutes Racial and Ethnic Disparities (RED) Committee Meeting Minutes Grants Menu Toggle Apply for Funding Title II Grants Resources Menu Toggle Publications Menu Toggle Reports Educational Webinars Juvenile Justice Resources Juvenile Justice Glossary Fact Sheets Newsroom Calendar Contact Mayor Emanuel, Chicago Police Department, Department of Family and Support Services Announce a 40 Percent Decrease in Youth Violence in 2013 January 28, 2014 Mayor Emanuel, Chicago Police Department, Department of Family and Support Services Announce a 40 Percent Decrease in Youth Violence in 2013 To read ths article on the City of Chicago website, click here . Mayor Rahm Emanuel, Chicago Police Superintendent Garry McCarthy, and Department of Family and Support Services (DFSS) Commissioner Evelyn Diaz announced today a 40 percent decrease in youth violence through a coordinated effort across City departments, sister agencies and community partners. Over the past two years, the City has increased investment in evidence-based violence prevention programs, strategic policing, and school-based reforms. Combined, this strategy has had a significant impact on youth violence. Post navigation ← Previous Post Next Post → Contact This Website is funded through a grant from the Office of Juvenile Justice and Delinquency Prevention, Office of Justice Programs, U.S. Department of Justice. Neither the U.S. Department of Justice nor any of its components operate, control, are responsible for, or necessarily endorse, this Website (including, without limitation, its content, technical infrastructure, and policies, and any services or tools provided). © 2024 Illinois Juvenile Justice Commission Accessibility Website Designed by ePageCity Illinois Juvenile Justice Commission Main Menu About Menu Toggle IJJC Principles Menu Toggle The Role of the Illinois Juvenile Justice Commission Strategies & Activities Core Value: Fundamental Fairness Core Value: Recognizing Youth-Adult Differences Core Value: Individual Differences Core Value: Youth Potential Core Value: Family Engagement Core Value: Community Engagement Core Value: Community Safety Core Value: Accountability Core Value: Cost Effectiveness Commission Members Committees Meeting Minutes Menu Toggle Illinois Juvenile Justice Commission Meeting Minutes Executive Committee Meeting Minutes Planning & Grants Committee Meeting Minutes Juvenile Detention Alternatives Initiative (JDAI) Committee Meeting Minutes Racial and Ethnic Disparities (RED) Committee Meeting Minutes Grants Menu Toggle Apply for Funding Title II Grants Resources Menu Toggle Publications Menu Toggle Reports Educational Webinars Juvenile Justice Resources Juvenile Justice Glossary Fact Sheets Newsroom Calendar Contact " -892,https://www.kennesaw-ga.gov/business-resources/copy-of-buttons-for-business-assistance/,Not Criminal Justice Related,Not Criminal Justice Related,Copy of Buttons for Business Assistance - City of Kennesaw,"",200,Home - City of Kennesaw,"[""Copy of Buttons for Business Assistance""]","[""Upcoming Events""]","[""Mayor & Council Work Session"", ""Sensory Friendly Afternoon"", ""Community Development Offices – Ribbon Cutting & Grand Opening"", ""Networking Event"", ""Gentle Flow Yoga""]","[""Contact Us""]",[],[],"Facebook Twitter LinkedIn YouTube Instagram Menu About I Want To… Resident Pay a Bill/Property Tax View Trash Schedule View Careers View Agendas & Minutes Vacation House Check Submit an Open Records Request Business Open a Business Get Business License View Building Services Download Permits & Applications View Pending Zoning Applications Review Bids, RFPs & Sales View Documents Report a Concern Read FAQs View Road Conditions View SPLOST View Maps City Services Departments Parks & Recreation Police Department Kennesaw Acworth 911 Public Works Building Services Planning & Zoning Economic Development GIS City Manager Finance Property Tax Municipal Court Communication Human Resources Information Technology Government Mayor City Council Boards & Commissions City Clerk Code of Ordinances Elections City Cemetery Things To Do Parks Parks & Recreation Swift-Cantrell Park Recreation Center Kennesaw Skatepark Adams Park Depot Park Wellness Station Splash Pad Dog Park Trails Art & Culture Smith-Gilbert Gardens Southern Museum Community Center Historic Kennesaw at the Depot Farmers Market Local Downtown Kennesaw Kennesaw State University Athletics Kennesaw Mountain National Battlefield Park Cobb Travel & Tourism ATL UTD 2 Atlanta Braves News & Events Kennesaw News E-Newsletter Signup Events Calendar Mobile App Search Search Copy of Buttons for Business Assistance Upcoming Events Mar 25 6:30 pm - 8:30 pm Recurring Mayor & Council Work Session @ City Hall, Council Chambers March 25 @ 6:30 pm Mar 26 2:00 pm - 5:00 pm Recurring Sensory Friendly Afternoon @ Southern Museum March 26 @ 2:00 pm Mar 26 4:00 pm - 5:00 pm Community Development Offices – Ribbon Cutting & Grand Opening @ Dale Burrell Government Complex March 26 @ 4:00 pm Mar 27 8:00 am - 10:00 am Networking Event @ Honeysuckle Biscuits and Bakery March 27 @ 8:00 am Mar 27 10:00 am - 11:00 am Gentle Flow Yoga @ Smith-Gilbert Gardens March 27 @ 10:00 am View Calendar City Notifications Kennesaw Police Department Online Payment Portal Public Works Property Tax Careers Strategic Goals (2022-2024) Parks & Recreation Things to Do Events Calendar Agendas & Minutes SPLOST Annual Report 2022 Contact Us 2529 J O Stephenson Ave Kennesaw, GA 30144 Phone: 770-424-8274 Facebook Twitter LinkedIn YouTube Instagram © 2021 Kennesaw, GA | Website by AndiSites Inc. " -893,https://www.lynchburgvapolice.gov/news-updates/shots-fired-on-hillside-court/,Media Bulletins,Agency-Published Resources,Shots Fired on Hillside Court  - Lynchburg Police Department,"",200,403 Forbidden,"[""Shots Fired on Hillside Court""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[],"" -894,https://delcopa.gov/planning/pdf/mapping/norwood.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -895,https://delcopa.gov/sustainability/commission/meetingminutes/sustcommmtg_minutes_2021-9-17.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -896,https://delcopa.gov/ich/resources/covid19/pdf/govwolf_dangersofnoprotection.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -897,http://lafayettepolice.us/754/indiana-building-code-occupancy-classifi,Not Criminal Justice Related,Not Criminal Justice Related,"Indiana Building Code Occupancy Classifications | Lafayette, IN - Official Website",Structures or portions of structures shall be classified with respect to occupancy in one or more of the groups listed.,200,"Police Department | Lafayette, IN - Official Website","[""Indiana Building Code Occupancy Classifications""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Operations Prevention Recruitment How Do I... Home Government Departments A - F Fire Department Prevention Contractors & Designers Process Overview Indiana Building Code Occupancy Classifications Indiana Building Code Occupancy Classifications Structures or portions of structures shall be classified with respect to occupancy in one or more of the groups listed below. A room or space that is intended to be occupied at different times for different purposes shall comply with all of the requirements that are applicable to each of the purposes for which the room or space will be occupied. Structures with multiple occupancies or uses shall comply with Section 508. Where a structure is proposed for a purpose that is not specifically provided for in this code, such structure shall be classified in the group that the occupancy most nearly resembles, according to the fire safety and relative hazard involved. Assembly (see Section 303): Groups A-1, A-2, A-3, A-4 and A-5 Business (see Section 304): Group B Educational (see Section 305): Group E Factory and Industrial (see Section 306): Groups F-1 and F-2 High Hazard (see Section 307): Groups H-1, H-2, H-3, H-4 and H-5 Institutional (see Section 308): Groups I-1, I-2, I-3 and I-4 Mercantile (see Section 309): Group M Residential (see Section 310): Groups R-1, R-2, R-3 and R-4 Storage (see Section 311): Groups S-1 and S-2 Utility and Miscellaneous (see Section 312): Group U Indiana Building Code Occupancy Classifications Community Outreach Fire Stations Submit a Request History Photo Gallery Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -898,http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-one-arrest1/,Media Bulletins,Agency-Published Resources,DUI CHECKPOINT NETS ONE ARREST,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/27/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: DUI CHECKPOINT NETS ONE ARREST Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department Traffic Section conducted a DUI/Drivers License checkpoint on Saturday, February 25, 2017. The checkpoint was located at the intersection of Ocean Boulevard and Cherry Avenue, between the hours of 7:00 p.m. and 3:00 a.m. Checkpoints are placed in locations that have the greatest opportunity for achieving drunk and drugged driving deterrence and provide the greatest safety for officers and the public. High Visibility Enforcement operations, which include DUI/Drivers License checkpoints, have been shown to lower DUI deaths and injuries. Major components of these checkpoints are the deterrent effect on those who might drive alcohol or drug impaired, bringing about more awareness, and encouraging everyone to use sober designated drivers. The checkpoint resulted in: · 1566 vehicles through the checkpoint · 367 vehicles screened · 1 DUI-Alcohol suspect arrested · 7 drivers cited/arrested for operating a vehicle unlicensed or while license suspended/revoked · 5 citations issued for unsafe driving Drivers are encouraged to download the Designated Driver VIP, or “DDVIP,” free mobile app for Android or iPhone. The DDVIP app helps find nearby bars and restaurants that feature free incentives for the designated sober driver, from free non-alcoholic drinks to free appetizers and more. The feature-packed app even has social media tie-ins and even a tab for the non-DD to call a ride-sharing service. Studies of California drivers have shown that 30% of drivers in fatal crashes had one or more drugs in their systems. A study of active drivers showed more tested positive for drugs that may impair driving (14%) than did for alcohol (7.3%). Of the drugs, marijuana was most prevalent, at 7.4%, slightly more than alcohol. Drivers caught driving impaired can expect the impact of a DUI arrest to include jail time, fines, fees, DUI classes, license suspension and other expenses that can exceed $10,000, not to mention the embarrassment when friends and family find out. The checkpoint was funded by a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration, reminding everyone to ‘Report Drunk Driver – Call 9-1-1’. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -899,https://alpha.austin.gov/es/police-oversight/indefinite-suspension-of-officer-bryan-black-and-appeals-finding/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -900,https://delcopa.gov/council/2017minutes/121317minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -901,http://www.ryepolice.us/pressrelease/stolen-f-350-with-dump-trailer,Media Bulletins,Agency-Published Resources,Rye Police Department Stolen F-350 with Dump Trailer - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Stolen F-350 with Dump Trailer""]","[""Stolen F-350 with Dump Trailer""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"­ Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Stolen F-350 with Dump Trailer Home Press Releases Stolen F-350 with Dump Trailer Stolen F-350 with Dump Trailer May 10, 2021 In Press Releases On the morning of 5/10/2021, the Rye Police Department took an auto theft report from a South Rd resident. It was discovered that sometime overnight, a black 1997 Ford F-350 truck (NH 4770211), along with a utility dump trailer (NH T623011) were stolen. If anyone has information regarding these vehicles, please contact Officer Dan Fuglestad at 603-964-5522 or dfuglestad@town.rye.nh.us. Anonymous tips can be made by contacting Seacoast Crime Stoppers at 603-431-1199 or seacoastcrimestoppers.com. Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search " -902,https://www.williamsaz.gov/departments_and_services/police_department/forms,Poor Data Source,Poor Data Source,"Forms - City of Williams, AZ","",200,Just a moment...,"[""City of Williams, Arizona""]","[""Forms""]","[""City of Williams, AZ""]",[],[],[],"Skip navigation City of Williams, Arizona {1} ##LOC[OK]## MENU Government About Williams City Code General Plan General Plan Maps Meetings Airport Advisory Commission Arizona Theme Park Board City Council Golf Committee Historic Preservation Commission Parks and Recreation Commission Planning & Zoning Commission Volunteer Fire Pension Board Vision, Mission and Goals Visitors Calendar of Events Golf Course Experience Williams Library Residents Departments and Services Administration/Human Resources Airport Building Department Finance Fire Department Photo Gallery WFD Station Locations Parks and Recreation Planning and Zoning Police Department 911 Dos and Don'ts Animal Control Alerts and Anonymous Tips Lost and Found Property Forms and Records Requests Links to Other Resources News and Announcements Scam and Fraud Warnings Links to Other Resources Emergency Notification System Crime Prevention Identity Theft and Internet Fraud Auto Theft Avoid Being Conned Forms SILENT WITNESS Sanitation Streets Water & Wastewater Doing Business Bid Documents What to do if? Official Payments - Pay Online Tickets Pay4Water Setting Up Utility Service Contact Us Government About Williams City Code General Plan General Plan Maps Meetings Airport Advisory Commission Arizona Theme Park Board City Council Golf Committee Historic Preservation Commission Parks and Recreation Commission Planning & Zoning Commission Volunteer Fire Pension Board Vision, Mission and Goals Visitors Calendar of Events Golf Course Experience Williams Library Residents Departments and Services Administration/Human Resources Airport Building Department Finance Fire Department Photo Gallery WFD Station Locations Parks and Recreation Planning and Zoning Police Department 911 Dos and Don'ts Animal Control Alerts and Anonymous Tips Lost and Found Property Forms and Records Requests Links to Other Resources News and Announcements Scam and Fraud Warnings Links to Other Resources Emergency Notification System Crime Prevention Identity Theft and Internet Fraud Auto Theft Avoid Being Conned Forms SILENT WITNESS Sanitation Streets Water & Wastewater Doing Business Bid Documents What to do if? Official Payments - Pay Online Tickets Pay4Water Setting Up Utility Service Contact Us City of Williams, AZ » Departments and Services » Police Department » Forms Forms City of Williams, AZ 113 South 1st Street, Williams, AZ 86046 Phone 928-635-4451 | Fax 928-635-4495 City of Williams, AZ | All Rights Reserved | Powered by CivicLive | © 2024 Civiclive. Skip navigation " -903,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2017_archived_news/october_2017/arlington_polices_national_night_out_continues,Poor Data Source,Poor Data Source,"Despite the Rain, Arlington Police’s National Night Out Continues to Shine - City of Arlington","",200,Just a moment...,"[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Despite the Rain, Arlington Police’s National Night Out Continues to Shine""]",[],[],[],[],Skip to Content Skip to Content -904,http://lafayettepolice.us/144/find,Resources,Agency-Published Resources,"Find | Lafayette, IN - Official Website",Find quick access to pages that are viewed most often.,200,"Police Department | Lafayette, IN - Official Website","[""Find""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]","[""Apartment Safety"", ""Carbon Monoxide Detectors"", ""Home Emergency Plans"", ""Live Council Meetings"", ""LPD Memorial Wall"", ""Police Honor Guard""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home How Do I... Find Find 9 1 1 2 Apartment Safety Find step by step instructions on what you need to do in case there is a fire in your apartment building. Carbon Monoxide Detectors Learn about the importance of having a carbon monoxide detector in your home. Home Emergency Plans Make a fire escape plan and practice the safe ways to get out of the house if there is a fire. Live Council Meetings You can view our City Council meetings live online. LPD Memorial Wall The Memorial Wall web page is a replication of the plaque that hangs in the lobby of the department and displays the names of those officers who retired from the department and have passed away. Police Honor Guard Browse through pictures of the Police Honor Guard at ceremonies, community events, and their uniforms. Apartment Safety Carbon Monoxide Detectors Home Emergency Plans Live Council Meetings LPD Memorial Wall Police Honor Guard Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -905,http://www.longbeach.gov/insidelb/blogs/conversations-with-a-long-beach-police-department-crime-analyst/,Poor Data Source,Poor Data Source,Crime Analyst Helps Increase Safety in Long Beach Thanks To Measure A,"",200,City of Long Beach,"[""InsideLB"", ""Crime Analyst Helps Increase Safety In Long Beach Thanks To Measure A""]",[],"[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""Series"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[],"" -906,https://www.dps.ms.gov/capitol-police/patrol-division,Contact Info & Agency Meta,Info About Agencies,Capitol Police Patrol Division | Mississippi Department of Public Safety,"The Capitol Police Patrol Division is comprised of men and women who are committed to providing a safe and secure environment for elected officials, state employees and visitors to the Capitol and its associated buildings within the Capitol Complex Improvement District. These men and women provide law enforcement and security services by providing a uniformed presence to the Capitol Building and throughout the Capitol Complex District. These services are delivered through active and directed patrols, security checkpoints and random inspections.",200,| Mississippi Department of Public Safety,"[""Capitol Police Patrol Division""]","[""Divisions Menu"", ""Resources Menu"", ""Capitol Police Patrol Division"", ""Capitol Police Menu"", ""Footer menu""]",[],"[""DPS Home Capitol Police Capitol Police Patrol Division""]",[],[],"Divisions Menu Divisions Driver Service Bureau (Driver License) Highway Patrol Bureau of Investigation Bureau of Narcotics Homeland Security Office of Forensic Laboratories Law Enforcement Officers' Training Academy Public Safety Planning Crime Stoppers Capitol Police Commercial Transportation Enforcement Resources Menu Resources General Information Related Links Search Search Click here for information regarding the Premium Pay Program for first responders. DPS Home Capitol Police Capitol Police Patrol Division Capitol Police Patrol Division The Capitol Police Patrol Division is comprised of men and women who are committed to providing a safe and secure environment for elected officials, state employees and visitors to the Capitol and its associated buildings within the Capitol Complex Improvement District. These men and women provide law enforcement and security services by providing a uniformed presence to the Capitol Building and throughout the Capitol Complex District. These services are delivered through active and directed patrols, security checkpoints and random inspections. The Patrol Division is the heart of the department and the most visible to the general public. The Patrol Division provides year round emergency response, 24 hours a day, seven days a week. Patrol officers remain committed to providing high quality, professional law enforcement services with an emphasis on problem solving and public relations. The Patrol Division takes a proactive approach to law enforcement as a crime prevention effort, as opposed to being reactive (only) after crimes have already occurred. The Patrol Division consists of Vehicle and Foot patrol methods of crime prevention. The law enforcement jurisdiction of the Capitol Police Department includes all surrounding streets, roadways, and parking areas of the buildings and properties included in the Capitol Complex, State Legislative Statutes. Capitol Police Menu Patrol Division Communications Division Investigations Division Records Division Special Operations Jurisdiction Safety Tips Command Staff Facebook Twitter Linkedin Footer menu Disclaimer Bid/RFP Notices Amber Alert Initial Reporting Form Silver Alert Initial Reporting Form Blue Alert Initial Reporting Form Public Records Request Complaints transparency.ms © 2021 Mississippi Department of Public Safety Divisions Menu Divisions Driver Service Bureau (Driver License) Highway Patrol Bureau of Investigation Bureau of Narcotics Homeland Security Office of Forensic Laboratories Law Enforcement Officers' Training Academy Public Safety Planning Crime Stoppers Capitol Police Commercial Transportation Enforcement Resources Menu Resources General Information Related Links Search Search Divisions Menu Divisions Driver Service Bureau (Driver License) Highway Patrol Bureau of Investigation Bureau of Narcotics Homeland Security Office of Forensic Laboratories Law Enforcement Officers' Training Academy Public Safety Planning Crime Stoppers Capitol Police Commercial Transportation Enforcement Resources Menu Resources General Information Related Links Divisions Menu Divisions Driver Service Bureau (Driver License) Highway Patrol Bureau of Investigation Bureau of Narcotics Homeland Security Office of Forensic Laboratories Law Enforcement Officers' Training Academy Public Safety Planning Crime Stoppers Capitol Police Commercial Transportation Enforcement Resources Menu Resources General Information Related Links " -907,http://police.portlandmaine.gov/1125/neighborhoods-islands-directory,Not Criminal Justice Related,Not Criminal Justice Related,"Neighborhoods & Islands Directory | Portland, ME - Official Website",A listing of neighborhoods & islands.,200,"Portland, ME - Official Website | Official Website","[""Neighborhoods & Islands Directory""]",[],[],"[""About the Portland Neighborhood Connector Project"", ""Back Cove Neighborhood Association"", ""Bayside Neighborhood Association"", ""Deering Center Neighborhood Association"", ""Deering Highlands Neighborhood Association"", ""East Bayside Neighborhood Organization"", ""East Deering Neighborhood Association"", ""Friends of Allen's Corner"", ""Friends of Morrill's Corner"", ""Friends of Woodfords Corner"", ""Hobart Street Wildlife Sanctuary"", ""India Street Neighborhood Association"", ""Island Services"", ""Libbytown Neighborhood Association"", ""Munjoy Hill Neighborhood Organization"", ""Nason's Corner Neighborhood Association"", ""Neighborhood Association Contact List (PDF)"", ""North Deering Neighborhood Association"", ""Parkside Neighborhood Association"", ""Peaks Island Council"", ""Riverton Community Association"", ""Saint John Valley Neighborhood Association"", ""Stroudwater Neighborhood Association"", ""University Neighborhood Organization (UNO)"", ""West End Neighborhood Association"", ""Western Promenade Neighborhood Association"", ""Woodfords-Oakdale Neighborhood Association""]",[],[],Skip to Main Content -908,http://www.lafayettepolice.us/1122/rent-a-pool,Not Criminal Justice Related,Not Criminal Justice Related,"Rent A Pool | Lafayette, IN - Official Website",Rent A Pool,200,"Police Department | Lafayette, IN - Official Website","[""Rent A Pool""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]","[""Private Rentals""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About Us Special Events Programs I Want To... Home Government Departments H - W Parks & Recreation Facilities Aquatics I Want To... Rent A Pool Rent A Pool 9 1 1 2 Private Rentals Private Rentals Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About Us Special Events Programs I Want To... Home Government Departments H - W Parks & Recreation Facilities Aquatics I Want To... Rent A Pool Rent A Pool 9 1 1 2 Private Rentals Private Rentals Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About Us Special Events Programs I Want To... Home Government Departments H - W Parks & Recreation Facilities Aquatics I Want To... Rent A Pool Rent A Pool 9 1 1 2 Private Rentals Private Rentals Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -909,https://delcopa.gov/sustainability/pdf/raise/highlandavetod2009.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -910,http://www.ryepolice.us/logs/police-logs-for-11-7-18-11-13-18,Daily Activity Logs,Info About Officers,Rye Police Department Police Logs for 11/7/18-11/13/18 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs for 11/7/18-11/13/18""]","[""Police Logs for 11/7/18-11/13/18""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -911,https://champaignil.gov/police-slide-sitemap.xml,Poor Data Source,Poor Data Source,XML Sitemap,"",200,403 Forbidden,"[""XML Sitemap""]",[],[],[],[],[],"XML Sitemap Generated by Yoast SEO , this is an XML Sitemap, meant for consumption by search engines. You can find more information about XML sitemaps on sitemaps.org . This XML Sitemap contains 2 URLs. URL Images Last Mod. https://champaignil.gov/police-slide/ 0 2022-02-03 17:10 +00:00 https://champaignil.gov/police-slide/cpd-honor-guard/ 1 2022-02-03 17:10 +00:00 " -912,https://www.stpaul.gov/departments/police/saint-paul-police-manual/10000-department-policy,Policies & Contracts,Info About Agencies,100.00 Department Policy | Saint Paul Minnesota,"The Saint Paul Police Department has published this online policy manual as part of our commitment to transparency.The online manual should be used for informational purposes only. Certain not public data have been redacted according to the Minnesota Government Data Practices Act, including sections 13.82 and 13.37. The Saint Paul Police Department manual is a living document that is updated and amended as needed, and the online manual will be updated to reflect current official policy.",200,Home | Saint Paul Minnesota,"[""100.00 Department Policy""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""The Saint Paul Police Department has published this online policy manual as part of our commitment to transparency."", ""100.00 Department Policy"", ""Footer""]","[""You are using an unsupported browser. Please use Microsoft Edge."", ""110.00 Department Functions"", ""120.00 Law Enforcement Code of Ethics"", ""121.00 Oath of Office"", ""131.00 Purpose"", ""132.00 Primary Objective"", ""133.01 Prevention of Crime"", ""133.02 Deterrence of Crime"", ""133.03 Apprehension of Offenders"", ""133.04 Recovery and Return of Property"", ""133.05 Movement of Traffic"", ""133.06 Public Service"", ""150.01 Loyalty"", ""150.02 Conduct Unbecoming an Officer"", ""150.03 Respect for Constitutional Rights"", ""150.05 Integrity"", ""150.06 Courtesy"", ""150.07 Compliance with Lawful Orders"", ""150.08 Use of Intoxicants"", ""150.09 Attention to Duty"", ""150.10 Financial Obligations"", ""150.11 Outside Employment"", ""150.12 Employee Grievances"", ""150.13 Commendations"", ""150.14 Discipline"", ""160.01 General Provisions"", ""160.02 Individual Dignity"", ""160.03 Role of the Individual Officer"", ""160.04 Equality of Enforcement"", ""160.045 Avoiding Racial Profiling"", ""160.05 Responsiveness to the Community"", ""160.06 Openness of Operation"", ""160.07 Interpersonal Communication"", ""160.08 Training in Human and Community Relations"", ""170.00 Discretion"", ""170.01 Police Action Based on Legal Justification"", ""170.02 Alternatives to Arrest"", ""180.11 On-Duty, Within City, Fully Responsible"", ""180.12 On-Duty, Outside of City, Fully Responsible"", ""180.20 Off-Duty, Within City, Fully Responsible"", ""180.21 Off-Duty, Outside of City, Limited Police Authority"", ""180.30 No Peace Officer Authority Outside State"", ""180.40 Duty Status"", ""180.50 Injured On Duty"", ""190.01 Traffic Enforcement Objective"", ""190.02 Violator Contact"", ""190.03 Non-Resident Violators"", ""190.04 Enforcement of Parking Regulations"", ""190.05 Strategic Traffic Enforcement"", ""190.06 Visible and Covert Patrol"", ""190.07 Crash Investigation"", ""191.00 Vice Enforcement and Organized Crime Suppression"", ""192.00 Narcotic Enforcement"", ""193.00 Administration"", ""193.01 Command Responsibility"", ""193.02 Transfer of Command"", ""193.03 Command Concerns for Welfare"", ""193.04 Community Liaison by Unit Heads"", ""193.05 Planning Responsibility"", ""193.08 Completed Staff Work"", ""193.09 Department Directives"", ""193.10 Administration of Discipline"", ""193.11 Organizational Principles"", ""193.13 Inspection and Control"", ""193.14 Personnel"", ""193.15 Training"", ""193.16 Civilian Employees"", ""193.17 Budgeting"", ""193.18 Supervision"", ""193.19 Field Supervision"", ""193.20 Authority Commensurate with Responsibility"", ""Contact The City"", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[],"" -913,https://coloradosprings.gov/police-department/article/news/motorcycle-driver-fatal-accident,Media Bulletins,Agency-Published Resources,Motorcycle Driver of Fatal Accident Identified | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Motorcycle Driver of Fatal Accident Identified""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -914,https://dccouncil.gov/judiciary-public-safety/copy-of-ag0_fy_2019-schedule-a-1/,Not Criminal Justice Related,Not Criminal Justice Related,Copy of AG0_FY_2019 Schedule A-1 • Council of the District of Columbia,"",200,Home • Council of the District of Columbia,"[""Copy of AG0_FY_2019 Schedule A-1""]",[],[],[],[],[],"Federal Tax Counter: $1,298,193,544 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Federal Tax Counter: $1,298,193,544 What is this? Get Updates RSS Press Center facebook twitter youtube Federal Tax Counter: $1,298,193,544 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Council of the District of Columbia Copy of AG0_FY_2019 Schedule A-1 October 10, 2018 Loading... Copy of AG0_FY_2019 Schedule A-1 October 10, 2018 Loading... Loading... Loading... DC Council seal About the Council Open Government Register to Vote Council Updates Jobs Council Directory Privacy Policy Commemorative D.C. Flag Program Ethics Visit the Wilson Building facebook twitter youtube Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Search facebook twitter youtube Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate " -915,https://hilliardohio.gov/hilliard-schools-and-police-collaborate-with-attorney-general-to-prevent-school-violence/,Media Bulletins,Agency-Published Resources,Hilliard Schools and Police Collaborate with Attorney General to Prevent School Violence - City of Hilliard,Hilliard City Schools and Hilliard Division of Police joined Ohio Attorney General Dave Yost Wednesday in announcing new curriculum tools that can help,200,403 Forbidden,"[""Hilliard Schools and Police Collaborate with Attorney General to Prevent School Violence""]","[""Residents"", ""It’s a place you can be proud to call home."", ""Government"", ""We exhibit a heart for service, dedication to excellence, and strength in teamwork."", ""Recreation & Parks"", ""We believe in health, wellness, and vibrant quality of life for our community."", ""Police & Courts"", ""Our badge shows we protect and serve. Our approach shows we're part of the community."", ""FAQ"", ""How can we assist you?"", ""Related News"", ""HPD Honors Employees of the Year"", ""No Injuries Reported from Overnight Storm"", ""HPD Taking the Plunge For Special Olympics"", ""LET'S CHAT!"", ""City of Hilliard"", ""Hilliard Police"", ""Rec & Parks"", ""Hilliard Newsletter""]",[],[],[],"[""Click the ‘x’ to opt out.""]",About Hilliard Accessing the Last Mile Aging in Place Committee Annual Events Available Properties Boards and Commissions Application Bridging The Digital Divide Building Standards Division Business Card Order Form Business Media Business Permitting Business Resources City Charter City Manager City of Hilliard – Home Collaborations for Technology Community Garden Community Resources Community Services and Programs Comprehensive Plan Contact the City Contact Us Demographics Designated Outdoor Refreshment Area (DORA) Disc Golf Discrimination Form Downtown Hilliard Downtown Hilliard Map Economic Development Electric Aggregation Engineering Division Ephemeral Wildflowers in Hilliard Fall Festival Feral Cats Fiber To The Home File a Report Online Food Waste Composting Program Forms and Applications HiFiO Hilliard City Lab Hilliard Development Corporation Hilliard Express Hilliard Public Arts Commission Hilliard Trails Hilliard’s Parks History Important Documents Incentives & Programs Information Technology Join the HPD Team Leaf Collection Lifestyle Major Employers Mapping Ohio’s Connectivity Mosquitos Neighborhood Crime Mapping Non Discrimination Now Hiring: Seasonal and Part-Time Positions Operations Department Opportunity Hilliard Personnel Review Board Planning Division Police Transparency in Policing Police Public Records Request Program Guide Public Bids Public Records Recreation and Parks – WebTrac RecTrac User Guide Recycling Roundabouts SAFE Sidewalk Program Sanitary Backflow Program Senior Programs Senior Resources Smart Streets Smart911 Social Investment Sponsorship Stationary Order Form Stormwater Management Street Maintenance & Rehabilitation Program Styrofoam Recycling Summer Rec Camp Sustainability Taxes The Well – Hilliard Recreation and Wellness Center Traffic Calming Traffic Enforcement Requests Transportation & Mobility Division Transportation Planning Trees Vacation House Check Victims Rights Videos Volunteer WebTrac Login Winter Weather Yard Waste Your Hilliard Residents Resident Resources Hilliard 311 Thank you Newsletter Signup Trash Rec & Parks Classes & Camps Rentals Master Parks Plan Pools & Passes The Senior Center Senior Citizen Hall of Fame Sports Government Newsroom Boards & Commissions Planning & Zoning Recreation and Parks Advisory Committee Records Commission Shade Tree Commission Environmental Sustainability Commission Keep Hilliard Beautiful Zoning Appeals Agendas & Minutes City Council Mayor’s Court Departments Community Development Finance Human Resources Law Q & A Business Communication Economic Development Emergency Alerts Fire Holidays HR Mayor’s Court Old Hilliard Police Rec & Parks Solicitation Taxes Trash Q&A Trees Q&A Reporting Online Library Norwich Township Schools Visit Hotels Old Hilliard News Privacy & Usage Policy Sitemap Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Accessibility by WAH Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Font Resize A- A+ Font Resize A- A+ Keyboard navigation Keyboard navigation Readable Font Readable Font Contrast Choose color black white green blue red orange yellow navi Contrast Choose color black white green blue red orange yellow navi black white green blue red orange yellow navi Clear cookies Clear cookies Accessibility by WAH Accessibility by WAH -916,https://spdblotter.seattle.gov/2019/08/13/police-investigating-after-woman-pepper-sprays-employee-at-university-district-store/,Media Bulletins,Agency-Published Resources,Police Investigating After Woman Pepper Sprays Employee at University District Store - SPD Blotter,"",200,403 Forbidden,"[""Police Investigating After Woman Pepper Sprays Employee at University District Store""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics Search Search Search Search Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports -917,https://www.huntsvilleal.gov/videos/never-forgotten-huntsville-police-remembers-fallen-officers/,Poor Data Source,Poor Data Source,Never Forgotten: Huntsville Police remembers fallen officers - City of Huntsville,"",200,403 Forbidden,"[""Never Forgotten: Huntsville Police remembers fallen officers""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],[],[],[],"Main Menu Main Menu Residents Back Residents Animal Services Neighborhoods Public Safety Volunteer Cemeteries Pay a Ticket Streets & Transportation Water & Sewer Garbage & Recycling Parks & Recreation Resident Toolkit Business Back Business About Huntsville Big Picture GIS Maps & Data Employment Bid A Project Codes & Ordinances Economic Development File A Claim E-Bids Pay Taxes Licensing & Permits Development Back Development Bid A Project Economic Development MPO Streets & Roadwork Building & Construction GIS Maps Planning Water & Sewer Big Picture Master Plan Historic Preservation ePlans Submittal Environment Back Environment Air Quality Garbage & Recycling Noise Sustainability Find A Park Nature Preserves Recreation Water Trails & Greenways Pets Lost & Found Green Team Government Back Government Boards & Commissions City Council Finances & Budget Media Center City Calendar Departments Mayor's Office Municipal Court Vote Find A Job Codes & Ordinances Services Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Toggle Menu City of Huntsville Search Search for: City Video Closed captioning provided for all videos. Video Category Browse By Category… City Council Meetings Inside Huntsville with Brenda Martin Impact with Kenny Anderson State of the City Planning Commission Meetings City Videos Historic Preservation Commission Meetings COVID-19 Updates Poll Workers Video Department Browse By Department… Animal Services Huntsville Police Department Parks & Recreation Community Development Big Picture Planning Huntsville Fire & Rescue Public Works Traffic Engineering Public Transit Parking Media Center City Video Never Forgotten: Huntsville Police remembers fallen officers Share & Print Twitter Facebook Email Print Categories: City Videos Department: Huntsville Police Department Top Requests Pay A Ticket Get A Permit Business License Municipal Court Police Fire & Rescue Public Transit – Orbit Huntsville Connect City Jobs HSV TV City News Mar 22 Conveniently distracted: Hands-free devices often perilous for drivers Mar 21 Kitten Season is coming – beat the heat by spaying and neutering your cat Mar 21 Arts Huntsville Announces Panoply Arts Festival 2024 Highlights Mar 19 All systems go: Huntsville’s first major music festival to launch in September Mar 19 Why Where Matters: Huntsville to host GeoResilience Summit on April 3 Contact Us (256) 427-5000 Huntsville City Hall 308 Fountain Circle Huntsville, Alabama 35801 Facebook Twitter Instagram Social Directory © 2022 | City of Huntsville, Alabama ADA Privacy Policy Intranet Webmail COH ESS Website Feedback Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Toggle Menu Search Search Search for: Search for: Search for: Search for: Search for: Search for: City Video City Video City Video City Video City Video " -918,https://northbrunswicknj.gov/programs_and_service/obtain-a-police-incident-report/,Resources,Agency-Published Resources,Obtain a Police Incident Report - Township of North Brunswick,"",200,Home - Township of North Brunswick,"[""Obtain a Police Incident Report""]",[],[],"[""Police Records Bureau""]","[""Department Page""]",[],Township of North Brunswick Videos Events Contact Select Language Chinese (Simplified) English Spanish Facebook Government Mayor’s Office Council Council Meetings & Agendas Boards & Committees Departments Careers Services Services & Programs Directory Lookup News & Events Events News & Notices In the news Social Media Sign-up for E-Alerts Resources Discover North Brunswick COVID-19 Information Assistance Programs Videos Photo Gallery Forms Reports & Plans Maps Code Book Videos Events Contact Select Language Chinese (Simplified) English Spanish Facebook Government Mayor’s Office Council Council Meetings & Agendas Boards & Committees Departments Careers Services Services & Programs Directory Lookup News & Events Events News & Notices In the news Social Media Sign-up for E-Alerts Resources Discover North Brunswick COVID-19 Information Assistance Programs Videos Photo Gallery Forms Reports & Plans Maps Code Book Select Language Chinese (Simplified) English Spanish Select Language Chinese (Simplified) English Spanish Facebook Programs & Services Obtain a Police Incident Report Obtain a Police Incident Report Programs & Services Obtain a Police Incident Report Obtain a Police Incident Report Obtain a Police Incident Report Police Incident Reports can be obtained in person during Records Bureau operating hours. You may also contact us to discuss contactless receipt options. Police Records Bureau Main : (732) 545-3200 ext 415 Hours M-F : 8:30 am - 4:00 pm Department Page Police Incident Reports can be obtained in person during Records Bureau operating hours. You may also contact us to discuss contactless receipt options. Police Records Bureau Main : (732) 545-3200 ext 415 Hours M-F : 8:30 am - 4:00 pm Department Page Police Incident Reports can be obtained in person during Records Bureau operating hours. You may also contact us to discuss contactless receipt options. Police Records Bureau Main : (732) 545-3200 ext 415 Hours M-F : 8:30 am - 4:00 pm Department Page Police Incident Reports can be obtained in person during Records Bureau operating hours. You may also contact us to discuss contactless receipt options. Police Records Bureau Main : (732) 545-3200 ext 415 Hours M-F : 8:30 am - 4:00 pm Department Page Police Incident Reports can be obtained in person during Records Bureau operating hours. You may also contact us to discuss contactless receipt options. Police Records Bureau Main : (732) 545-3200 ext 415 Hours M-F : 8:30 am - 4:00 pm Department Page Police Incident Reports can be obtained in person during Records Bureau operating hours. You may also contact us to discuss contactless receipt options. Police Records Bureau Main : (732) 545-3200 ext 415 Hours M-F : 8:30 am - 4:00 pm Department Page Police Incident Reports can be obtained in person during Records Bureau operating hours. You may also contact us to discuss contactless receipt options. Police Records Bureau Main : (732) 545-3200 ext 415 Hours M-F : 8:30 am - 4:00 pm Department Page Police Incident Reports can be obtained in person during Records Bureau operating hours. You may also contact us to discuss contactless receipt options. -919,https://www.pullman-wa.gov/government/departments/police_department/news___statistics/national_public_safety_telecommunicators_week_2022,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -920,https://www.huntsvilleal.gov/videos/huntsville-police-honor-fallen-officers-with-remembrance-ceremony/,Poor Data Source,Poor Data Source,Huntsville Police Honor Fallen Officers with Remembrance Ceremony - City of Huntsville,"",200,403 Forbidden,"[""Huntsville Police Honor Fallen Officers with Remembrance Ceremony""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],[],[],[],"Main Menu Main Menu Residents Back Residents Animal Services Neighborhoods Public Safety Volunteer Cemeteries Pay a Ticket Streets & Transportation Water & Sewer Garbage & Recycling Parks & Recreation Resident Toolkit Business Back Business About Huntsville Big Picture GIS Maps & Data Employment Bid A Project Codes & Ordinances Economic Development File A Claim E-Bids Pay Taxes Licensing & Permits Development Back Development Bid A Project Economic Development MPO Streets & Roadwork Building & Construction GIS Maps Planning Water & Sewer Big Picture Master Plan Historic Preservation ePlans Submittal Environment Back Environment Air Quality Garbage & Recycling Noise Sustainability Find A Park Nature Preserves Recreation Water Trails & Greenways Pets Lost & Found Green Team Government Back Government Boards & Commissions City Council Finances & Budget Media Center City Calendar Departments Mayor's Office Municipal Court Vote Find A Job Codes & Ordinances Services Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Toggle Menu City of Huntsville Search Search for: City Video Closed captioning provided for all videos. Video Category Browse By Category… City Council Meetings Inside Huntsville with Brenda Martin Impact with Kenny Anderson State of the City Planning Commission Meetings City Videos Historic Preservation Commission Meetings COVID-19 Updates Poll Workers Video Department Browse By Department… Animal Services Huntsville Police Department Parks & Recreation Community Development Big Picture Planning Huntsville Fire & Rescue Public Works Traffic Engineering Public Transit Parking Media Center City Video Huntsville Police Honor Fallen Officers with Remembrance Ceremony Share & Print Twitter Facebook Email Print Categories: City Videos Top Requests Pay A Ticket Get A Permit Business License Municipal Court Police Fire & Rescue Public Transit – Orbit Huntsville Connect City Jobs HSV TV City News Mar 22 Conveniently distracted: Hands-free devices often perilous for drivers Mar 21 Kitten Season is coming – beat the heat by spaying and neutering your cat Mar 21 Arts Huntsville Announces Panoply Arts Festival 2024 Highlights Mar 19 All systems go: Huntsville’s first major music festival to launch in September Mar 19 Why Where Matters: Huntsville to host GeoResilience Summit on April 3 Contact Us (256) 427-5000 Huntsville City Hall 308 Fountain Circle Huntsville, Alabama 35801 Facebook Twitter Instagram Social Directory © 2022 | City of Huntsville, Alabama ADA Privacy Policy Intranet Webmail COH ESS Website Feedback Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Toggle Menu Search Search Search for: Search for: Search for: Search for: Search for: Search for: City Video City Video City Video City Video City Video " -921,https://champaignil.gov/2012/04/25/police-investigate-shooting-clock-st-bellefontaine-st/,Media Bulletins,Agency-Published Resources,Police Investigate Shooting (Clock St./Bellefontaine St.) - City of Champaign,"",200,403 Forbidden,"[""Police Investigate Shooting (Clock St./Bellefontaine St.)""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Police Investigate Shooting (Clock St./Bellefontaine St.) Search Posted on April 25, 2012 Yesterday evening, at approximately 7:45 p.m., Champaign police officers were dispatched to the intersection of Clock Street and Bellefontaine Street, in reference to multiple gunshots heard in the area. Upon arrival, officers searched the area and were unable to locate the scene of a shooting. Within minutes, officers were informed that two male gunshot victims, ages 23 and 27, had arrived by car at Carle Hospital’s Emergency Room. Officers later received information from witnesses that two males were observed standing near the corner of Bellefontaine and Clock Streets when a dark-colored vehicle stopped along the curb in front of them. A black male passenger in the vehicle then leaned out of the window and began firing multiple rounds at the two males. At the hospital, officers made contact with one of the victims, who reported being in the area of Clock and Bellefontaine when he was shot by a male subject driving a dark-colored vehicle. The second victim was receiving medical treatment at the time of police interviews. Police do not believe that this crime was a random act of violence, and are seeking information from the public that may lead to the arrest of the shooter. Anyone with information about this crime can contact the Champaign Police Department by calling (217) 351-4545, or callers can remain anonymous by calling Crime Stoppers at 373-8477 (TIPS.) Information can also be sent by anonymous web tip by going to: www.373tips.com by texting keyword “CCTIP” plus the information to 274637 (CRIMES). Categories: Police Department Press Releases Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign " -922,https://www.coppelltx.gov/916/interlibrary-loan,Not Criminal Justice Related,Not Criminal Justice Related,"InterLibrary Loan | Coppell, TX",Interlibrary loan is a service that provides access to library materials that are not available at this library. ,200,"Coppell, TX | Official Website","[""InterLibrary Loan""]",[],"[""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Children Services Teen Services Adult Services How Do I Home Government City Departments Cozby Library & Community Commons How Do I Request InterLibrary Loan InterLibrary Loan Interlibrary Loans are available to Coppell residents with a Cozby Library card. Interlibrary loans allow you to borrow books from other libraries. The books are sent to our library for easy access. When you are finished with the item, you return it to the Cozby Library. There is a limit of seven items on request for each library card. You will be notified by email when your items have been approved or denied. Interlibrary Loan Instructions (PDF) Place Interlibrary Loan Request Room Reservations Purchase Request Form InterLibrary Loan TexShare Card Book Recommendations Host a Program Agendas & Minutes Alert Sign-Up Citizen Report E-News Pay Water Bill Permits 255 E. Parkway Blvd., P.O. Box 9478, Coppell, TX 75019 Phone: 972-462-0022 | Email us Site Map Contact Us Accessibility Copyright Notices Privacy Policy Employee Login /QuickLinks.aspx Government Websites by CivicPlus® Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Children Services Teen Services Adult Services How Do I Home Government City Departments Cozby Library & Community Commons How Do I Request InterLibrary Loan InterLibrary Loan Interlibrary Loans are available to Coppell residents with a Cozby Library card. Interlibrary loans allow you to borrow books from other libraries. The books are sent to our library for easy access. When you are finished with the item, you return it to the Cozby Library. There is a limit of seven items on request for each library card. You will be notified by email when your items have been approved or denied. Interlibrary Loan Instructions (PDF) Place Interlibrary Loan Request Room Reservations Purchase Request Form InterLibrary Loan TexShare Card Book Recommendations Host a Program Agendas & Minutes Alert Sign-Up Citizen Report E-News Pay Water Bill Permits 255 E. Parkway Blvd., P.O. Box 9478, Coppell, TX 75019 Phone: 972-462-0022 | Email us Site Map Contact Us Accessibility Copyright Notices Privacy Policy Employee Login /QuickLinks.aspx Government Websites by CivicPlus® Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -923,https://www.southamptontownnypolice.gov/bids.aspx,Poor Data Source,Poor Data Source,"Bid Postings • Southampton, NY • CivicEngage","",200,"Police | Southampton, NY - Official Website",[],[],"[""Site Tools"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Bid Postings Sign up to receive a text message or email when new bids are added! Learn about current bid and contract opportunities available to consultants, service providers, contractors, vendors, or suppliers. Show Me Open Bids Sorted By Category Bid Title Closing Date Bid Number (Ascending) Bid Number (Descending) Show Closed/Awarded/Cancelled Bids: The following is a listing of various bid postings. Click on any of the titles for the details on that particular bid. There are no open bid postings at this time. Live Edit Applications, Forms & Fees Current Agendas Notify Me® Online Services For Assistance Phone Directory Southampton Online Solutions (SOS) Town Code Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Bid Postings Sign up to receive a text message or email when new bids are added! Learn about current bid and contract opportunities available to consultants, service providers, contractors, vendors, or suppliers. Show Me Open Bids Sorted By Category Bid Title Closing Date Bid Number (Ascending) Bid Number (Descending) Show Closed/Awarded/Cancelled Bids: The following is a listing of various bid postings. Click on any of the titles for the details on that particular bid. There are no open bid postings at this time. Live Edit Applications, Forms & Fees Current Agendas Notify Me® Online Services For Assistance Phone Directory Southampton Online Solutions (SOS) Town Code Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -924,https://www.coppelltx.gov/389/crime-prevention,Resources,Agency-Published Resources,"Crime Prevention | Coppell, TX",Access information on how to protect yourself and your community from crime.,200,"Coppell, TX | Official Website","[""Crime Prevention""]",[],"[""Quick Links"", ""Loading""]","[""Computer Crime"", ""Credit Card Fraud"", ""Curfew Hours for Minors"", ""Drugs: Shatter the Myths (PDF)"", ""Fraud Crimes & Identity Theft FAQs"", ""Helpful Links"", ""Operation Secure Car"", ""Fentanyl Resources""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Divisions Services & Programs Education How Do I City Home Home Government City Departments Police Department Education Crime Prevention Crime Prevention 9 1 1 2 Computer Crime While there is no way to completely protect the data stored on your computer, taking these steps will help you protect yourself from victimization. Credit Card Fraud Read some helpful credit card fraud prevention tips. Curfew Hours for Minors The City of Coppell has an established City Ordinance for curfew hours for minors. A minor is a person between 10 years of age and 16 years of age. Drugs: Shatter the Myths (PDF) View the ""Drugs: Shatter the Myths"" presentation by Christina Thomas, Public Health Educator for the North Texas Poison Center. Fraud Crimes & Identity Theft FAQs Get answers to frequently asked questions regarding identity theft and how to combat fraud. Helpful Links Find links to helpful crime prevention resources such as the Internet Crime Complainant Center, Annual Credit Report, and the United States Postal Inspection Service. Operation Secure Car Not everyone ""shops"" the legal way. Some people might just break into your car and help themselves! Help us help you reduce car burglaries and vehicle thefts by following these simple rules. Fentanyl Resources Fentanyl resources Quick Links Annual Credit Report Attorney General of Texas Federal Trade Commission Internal Revenue Service Internet Crime Complainant Center Little Black Book of Scams (PDF) Social Security Administration United States Postal Inspection Service View All Links /QuickLinks.aspx Computer Crime Credit Card Fraud Curfew Hours for Minors Drugs: Shatter the Myths (PDF) Fraud Crimes & Identity Theft FAQs Helpful Links Operation Secure Car Fentanyl Resources Services & Programs Animal Services Submit A Tip Crime Statistics Join Us Compliment /Complaint For Non Emergencies: 469-289-3270 . You can also contact non-emergency dispatch by dialing *247 from your cellular phone. For Emergencies: 911 Coppell Justice Center 130 Town Center Boulevard / P.O. Box 9478 Coppell, TX 75019 Phone: 972-304-3620 (Records Department) Fax: 972-304-3535 Email Government Websites by CivicPlus® " -925,https://www.giddingspolice-tx.us/join-the-force,Training & Hiring Info,Info About Officers,Join the Force | Giddings Police Department,"",200,Home | Giddings Police Department,[],[],[],[],[],[],"" -926,https://delcopa.gov/council/2021minutes/040721minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -927,https://icjia.illinois.gov/about/publications/community-policing-accountability-in-management-in-the-chicago-police-department/,Policies & Contracts,Info About Agencies,ICJIA |,Illinois Criminal Justice Information Authority,200,ICJIA | Illinois Criminal Justice Information Authority,[],[],[],[],[],[],Skip to content MENU ILLINOIS CRIMINAL JUSTICE INFORMATION AUTHORITY About arrow_drop_down Research arrow_drop_down Grant Resources arrow_drop_down Partners arrow_drop_down About Research Grant Resources Partners ICJIA  » ICJIA Overview Overview Translate this site About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact View all publications » About Contact Employment Events Funding Grant Status Request Meetings News & Information Press Research Training About | Contact | Document Archive | FOIA | Language Access Request | Privacy | Grant Status Request | Subscribe to CJ Dispatch © 2024 Illinois Criminal Justice Information Authority Skip to content MENU ILLINOIS CRIMINAL JUSTICE INFORMATION AUTHORITY About arrow_drop_down Research arrow_drop_down Grant Resources arrow_drop_down Partners arrow_drop_down About Research Grant Resources Partners ICJIA  » ICJIA Overview Overview Translate this site About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact View all publications » About Contact Employment Events Funding Grant Status Request Meetings News & Information Press Research Training About | Contact | Document Archive | FOIA | Language Access Request | Privacy | Grant Status Request | Subscribe to CJ Dispatch © 2024 Illinois Criminal Justice Information Authority MENU ILLINOIS CRIMINAL JUSTICE INFORMATION AUTHORITY About arrow_drop_down Research arrow_drop_down Grant Resources arrow_drop_down Partners arrow_drop_down MENU ILLINOIS CRIMINAL JUSTICE INFORMATION AUTHORITY About arrow_drop_down Research arrow_drop_down Grant Resources arrow_drop_down Partners arrow_drop_down MENU MENU ILLINOIS CRIMINAL JUSTICE INFORMATION AUTHORITY About Research Grant Resources Partners About Research Grant Resources Partners About Research Grant Resources Partners About About About About About Research Research Research Research Research Grant Resources Grant Resources Grant Resources Grant Resources Grant Resources Partners Partners Partners Partners Partners ICJIA  » ICJIA Overview Overview Translate this site About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact View all publications » ICJIA  » ICJIA Overview Overview Translate this site About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact ICJIA  » ICJIA Overview Overview Translate this site About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact About ICJIA Composition & Membership Staff Organization Values Committees Publications Death in Custody Reporting FOIA Employment Contact View all publications » View all publications » View all publications » View all publications » View all publications » View all publications » About Contact Employment Events Funding Grant Status Request Meetings News & Information Press Research Training About Contact Employment Events Funding Grant Status Request Meetings News & Information Press Research Training -928,https://dps.georgia.gov/job-vacancy-announcement-georgia-capitol-police-officer-5,Media Bulletins,Agency-Published Resources,Job Vacancy Announcement-Georgia Capitol Police Officer | Georgia Department of Public Safety,Job Vacancy Announcement-Georgia Capitol Police Officer ,200,Georgia Department of Public Safety,"[""Job Vacancy Announcement-Georgia Capitol Police Officer""]","[""Main navigation"", ""Search this site"", ""Breadcrumb"", ""How can we help?"", ""About Us"", ""Get in Touch""]","[""Popular searches"", ""Call Us"", ""Visit"", ""Mail"", ""Hours""]",[],[],[],"" -929,https://ose.louisiana.gov/event/police-officer-first-class-11/,Training & Hiring Info,Info About Officers,Police Officer First Class | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Police Officer First Class""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Police Officer First Class Promotional Level Posting Period 12/28/2020 - 01/28/21 Application Deadline 01/28/21 Jurisdiction Pineville Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Police Officer First Class Promotional Level Posting Period 12/28/2020 - 01/28/21 Application Deadline 01/28/21 Jurisdiction Pineville Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Officer First Class Promotional Level Posting Period 12/28/2020 - 01/28/21 Application Deadline 01/28/21 Jurisdiction Pineville Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Officer First Class Promotional Level Posting Period 12/28/2020 - 01/28/21 Application Deadline 01/28/21 Jurisdiction Pineville Application This event has passed. Police Officer First Class Promotional Level Posting Period 12/28/2020 - 01/28/21 Application Deadline 01/28/21 Jurisdiction Pineville Application This event has passed. Police Officer First Class Promotional Level Posting Period 12/28/2020 - 01/28/21 Application Deadline 01/28/21 Jurisdiction Pineville Application This event has passed. Police Officer First Class Promotional Level Promotional Level Promotional Level Posting Period 12/28/2020 - 01/28/21 Application Deadline 01/28/21 Jurisdiction Pineville Posting Period 12/28/2020 - 01/28/21 Application Deadline 01/28/21 Jurisdiction Pineville Posting Period 12/28/2020 - 01/28/21 Application Deadline 01/28/21 Jurisdiction Pineville Posting Period 12/28/2020 - 01/28/21 Posting Period Application Deadline 01/28/21 Application Deadline Jurisdiction Pineville Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -930,https://www.bristolri.gov/departments/police/police-branches/honor-guard/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -931,https://police.greenvillesc.gov/424/explore-downtown,Not Criminal Justice Related,Not Criminal Justice Related,"Downtown Greenville | Greenville, SC - Official Website",Downtown Greenville has become a favorite destination for upstate diners and shoppers who want to experience a unique variety of dining experiences unmatched in the region. ,200,"Police Department | Greenville, SC - Official Website","[""Downtown Greenville""]","[""Find Parking Downtown"", ""Falls Park on the Reedy"", ""THE GREENVILLE STORY""]","[""Downtown Map & Directory: Click to View"", ""Loading""]",[],[],[],"Skip to Main Content Government Departments Business Visitors Residents Search Home Visitors Explore Downtown Downtown Greenville Greenville's downtown has long been one of the Upstate's most popular destinations for shopping, dining and entertainment , and over the past few years, has amassed a multitude of accolades and awards from national publications. Livability recently ranked it one of the Top 10 Best Downtowns in the country, and The New York Times called Greenville ""a national model for a pedestrian-friendly city center."" Greenville has focused on creating a vibrant downtown that is authentic, sustainable and most importantly, for people. With wide sidewalks, outdoor plazas and streetside dining, downtown Greenville offers a pedestrian-friendly atmosphere that has been compared to that of a European city. Downtown Map & Directory: Click to View Find Parking Downtown iFrames are not supported on this page. Falls Park on the Reedy Known for its exceptional beauty, the two most distinctive natural features of downtown Greenville are its lush, tree-lined Main Street and the stunning Reedy River Falls, located in the heart of Falls Park . The award-winning Liberty Bridge in Falls Park serves as Greenville's signature postcard setting, and downtown's extensive collection of public artwork adds beauty and energy to its public spaces. During the day, downtown is home to over 20,000 employees. At night, area residents and visitors flock to downtown to take advantage of its extensive offering of cultural, entertainment and dining options. Not surprisingly, downtown has also become one of the most desirable residential districts in and around Greenville, giving the area an even more well-rounded character. Shopping and Dining Downtown is also a shopper's paradise, with more than 115 retailers, including a variety of art galleries and specialty stores. You'll also find everything from local designer boutiques to national favorites such as Anthropologie and Orvis. With more than 110 independent restaurants in a 10-block stretch, downtown's lively dining scene has sparked Greenville's emerging reputation as a foodie's paradise. Most are locally owned one-of-a-kind eateries, with cuisine for every taste and price range. More about shopping and dining 1 2 3 4 5 6 THE GREENVILLE STORY Downtown Greenville's development over the past four decades is the result of a series of momentous achievements, each signifying a milestone on a journey that took the declining city center and made it into one of America's best downtowns. Use our interactive map to explore Downtown Reborn , and learn how Greenville's transformation happened. Downtown Visitors' Map (PDF) Parking Falls Park Public Art Trolley Downtown Reborn Story Map Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate " -932,http://lafayettepolice.us/595/business-owners,Not Criminal Justice Related,Not Criminal Justice Related,"Business Owners | Lafayette, IN - Official Website",Our fire inspectors have the responsibility to inspect existing businesses on a frequent basis to insure the building meets minimum fire and life safety requirements.,200,"Police Department | Lafayette, IN - Official Website","[""Business Owners""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -933,https://delcopa.gov/vote/pdf/2020/pollworkers/howtovotewiththescannerposter.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -934,https://columbiacitypolice.us/photogallary.html,Poor Data Source,Poor Data Source,Columbia City Police Department:Home,"",200, Columbia City Police Department:Home ,"[""Photo Gallery""]",[],[],"[""Quick Links""]",[],[],Home Personnel Activity Logs Communications Safety Tips Victim Services General Info Golf Carts Applications and Forms Kids Page Photo Gallery Statistics FAQ Photo Gallery Officers thru the years Vehicles thru the years Other Quick Links City Website City Ordinances Whitley County Sheriff Indiana State Police Travel Advisories Whitley County Court Clerk IC Codes Firearms Licensing Purchase Crash Report Sex Offender Registry Amber Alert Indiana Criminal History Federal Criminal History Copyright© 2013. Columbia City Police Department. All Rights Reserved Home Personnel Activity Logs Communications Safety Tips Victim Services General Info Golf Carts Applications and Forms Kids Page Photo Gallery Statistics FAQ -935,https://www.mass.gov/doc/david-casey-v-town-of-natick-police-department/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -936,http://www.ryepolice.us/announcements/rye-public-safety-building-open-house,Not Criminal Justice Related,Not Criminal Justice Related,Rye Police Department Rye Public Safety Building Open House - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Rye Public Safety Building Open House""]","[""Rye Public Safety Building Open House""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"­ Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Rye Public Safety Building Open House Home Announcements Rye Public Safety Building Open House Rye Public Safety Building Open House October 4, 2016 In Announcements It's that time of year again! Time to come meet your local police, fire, and EMS personnel! Swing in to the Public Safety Building on Sunday, 10/9/16 from 12pm-2pm to check out trucks, cruisers and equipment.  We will be handing out Trick or Treat bags for the kids! Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search " -937,http://www.longbeach.gov/police/press-releases/missing-child-found/,Media Bulletins,Agency-Published Resources,MISSING CHILD FOUND,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/10/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: MISSING CHILD FOUND Contact: Media Relations Detail (562) 570-5273 Long Beach Police and the U.S. Marshals Fugitive Task Force located missing child Nicholas Johnston, today, in Oceanside. He was found unharmed and will be reunited with his father. The 12-year-old was abducted by his non-custodial parent, Sri Ann Johnston, on March 5, 2014. He was last seen when his mother picked him up from his Long Beach school, on March 5, 2014, around 3:30 p.m., for his scheduled overnight visit. On March 6, 2014, the custodial parent received a second party call advising that the child may be in the Oceanside area. Believing the child would be returned home, the father didn’t report him missing to law enforcement until Friday evening around 9:15 p.m. The Long Beach Police Department began searching for the victim, alerting local hospitals, area law enforcement, and public transportation agencies. The incident did not meet Amber Alert criteria at the time of the initial report, as there was nothing to substantiate any risk of any physical harm to the child. LBPD continued actively searching for the child throughout the weekend with the assistance of the U.S. Marshals Fugitive Task Force. On March 10, 2014, detectives met with the Los Angeles County District Attorney’s Office to present their case for filing consideration. Detectives also provided the DA’s Office with new information, which developed over the weekend, prompting them to request California Highway Patrol issue an Amber Alert. On March 10, 2014, around 2:20 p.m., the U.S. Marshals Fugitive Task Force located both Nicholas and Sri Johnston in the 2700 block of Vista Way, in Oceanside, California. Sri Johnston was taken into custody. Nicholas Johnston will be reunited with his father later today. Sri Ann Johnston was booked on a kidnapping warrant and is being held at the Long Beach City Jail on $500,000 bail. The investigation is ongoing. Anyone with information regarding this incident should contact Long Beach Child Abuse Detective Rodney Brown at (562) 570-7321. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -938,https://coloradosprings.gov/police-department/article/news/drug-take-back-april-24th-2021,Media Bulletins,Agency-Published Resources,Drug Take Back April 24th 2021 | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Drug Take Back April 24th 2021""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -939,https://alpha.austin.gov/en/police-oversight/2020-06-08-4/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -940,https://unioncitypa.us/police/uc-police-employment-application-2022/,Training & Hiring Info,Info About Officers,"UC Police Employment Application 2022 | Union City, Pennsylvania",Download Application Packet,200,Home,"[""UC Police Employment Application 2022""]",[],"[""Recent News"", ""Categories""]","[""admin""]",[],[],"Home About About History Attractions Contact Us Borough Borough Information Borough Council Minutes Borough Ordinances Proposed Ordinances Union City Pride, Inc. Relocating Services Businesses Automotive Farm/Garden Financial Florists Food and Drink Industries Medical Restaurants Retail Stores Business Services All Businesses Add A Business Listing Organizations Local Groups Churches Add an Organization Project Updates Videos Home About About History Attractions Contact Us Borough Borough Information Borough Council Minutes Borough Ordinances Proposed Ordinances Union City Pride, Inc. Relocating Services Businesses Automotive Farm/Garden Financial Florists Food and Drink Industries Medical Restaurants Retail Stores Business Services All Businesses Add A Business Listing Organizations Local Groups Churches Add an Organization Project Updates Videos Home About About History Attractions Contact Us Borough Borough Information Borough Council Minutes Borough Ordinances Proposed Ordinances Union City Pride, Inc. Relocating Services Businesses Automotive Farm/Garden Financial Florists Food and Drink Industries Medical Restaurants Retail Stores Business Services All Businesses Add A Business Listing Organizations Local Groups Churches Add an Organization Project Updates Videos UC Police Employment Application 2022 Download Application Packet admin Author archive March 12, 2021 Police Previous post Next post Coming Events Garbage Collection Moving Here? Renaissance Grant Application Borough Ordinances Act 137 Affordable Housing Fund Program UC Police Employment Application 2022 Download Application Packet admin Author archive March 12, 2021 Police Previous post Next post Coming Events Garbage Collection Moving Here? Renaissance Grant Application Borough Ordinances Act 137 Affordable Housing Fund Program UC Police Employment Application 2022 Download Application Packet admin Author archive March 12, 2021 Police Previous post Next post UC Police Employment Application 2022 Download Application Packet admin Author archive March 12, 2021 Police Previous post Next post UC Police Employment Application 2022 Download Application Packet Download Application Packet admin Author archive March 12, 2021 Police Previous post Next post admin Author archive admin Author archive Author archive March 12, 2021 Police Previous post Next post Previous post Next post Coming Events Garbage Collection Moving Here? Renaissance Grant Application Borough Ordinances Act 137 Affordable Housing Fund Program Coming Events Coming Events Coming Events Coming Events Garbage Collection Garbage Collection Garbage Collection Garbage Collection Moving Here? Moving Here? Moving Here? Moving Here? Renaissance Grant Application Renaissance Grant Application Renaissance Grant Application Renaissance Grant Application Borough Ordinances Borough Ordinances Borough Ordinances Borough Ordinances Act 137 Affordable Housing Fund Program Act 137 Affordable Housing Fund Program Act 137 Affordable Housing Fund Program Act 137 Affordable Housing Fund Program Recent News Erie County Affordable Housing Fund Program Union City Pride, Inc. Announces Call For Artists For Downtown Murals 2023 French Creek Festival New 2023 Orders for HomeTown Heroes Military Banners Garbage Service 2023 Union City Borough Council Anonymous Tips Emergency Management Information French Creek Trail Plan Categories Borough Festival of Trees Little League Museum News Parks and Recreation Police Reference Township Union City Family Support Center Water Department Permits " -941,https://www.ci.northville.mi.us/services/police_department/service_fees,Policies & Contracts,Info About Agencies,"Fee schedule - City of Northville, MI","",200,Just a moment...,"[""Fee schedule""]",[],[],[],[],[],Skip to Content -942,https://rockymountnc.gov/police/,Contact Info & Agency Meta,Info About Agencies,Police | Rocky Mount NC,"",200,Rocky Mount NC | The Center of it All,"[""Police Department""]","[""Robert Hassell""]","[""City raises starting salary for police officers to $60,000 annually""]","[""Police Department Menu""]",[],[],"Events Services Departments Resources Attractions Feedback Select Page Events Services Departments Resources Attractions Feedback Police Department Police Department Menu Police Crime Careers Business Camera Program Divisions Police Permits & Forms Animal Services Community Programs Annual Report Contact Us We, the members of the Rocky Mount Police Department, are committed to providing the highest level of police service. We will improve the quality of life in the community by building partnerships that reduce crime, maintain order, and create a safe environment while upholding the laws of North Carolina and the United States Constitution. We adhere to the principles of integrity, professionalism, respect, and fairness. We have integrity. We are committed to the highest professional and ethical standards. We are accountable for our actions to the community and each other. We foster public trust by being honest, fair, and consistent. We are professional. We are dedicated to providing quality service by being progressive, well trained, disciplined, and highly motivated employees. We serve as role models for the community by projecting a positive image with a spirit of cooperation and teamwork. We are respectful. We are duty bound to uphold the rights and liberties of all people. We are sensitive to the needs of everyone. We treat everyone with dignity, understanding, and compassion in a way we want to be treated. We are fair. We deliver consistent service to a culturally diverse community through understanding, open-mindedness, and non-prejudicial judgement. We are equally responsive to the needs of all people. Robert Hassell Chief of Police P: 252-972-1471 F: 252-972-1528 330 South Church Street PO Box 1180 Rocky Mount, NC 27802 Click to Email City raises starting salary for police officers to $60,000 annually Police Salary News Release Contact Want to learn more? Get in touch with us. We look forward to hearing from you. Click Here Crime Do you have information about a crime? You can submit an annonymous tip. Click Here Careers Learn about Career Opportunities with the Rocky Mount Police Department. Click Here Divisions The Rocky Mount Chief of Police oversees four major divisions in addition to other staff. Click Here  Subscribe to our Newsletter Today! City of Rocky Mount, NC 331 S. Franklin St., PO Box 1180 Rocky Mount, NC 27802-1180 Phone: 252-972-1111 Budget Office Business & Collections Services Central Services City Clerk City Manager Communications, Marketing, & Public Relations Community Development Development Services Energy Resources Finance Fire Internal Audit Human Relations Human Resources Parks & Recreation Police Public Works Technology Services Water Resources Follow Follow Follow Follow Follow Employee Intranet Login | Employee Self Service (ESS) | Privacy Statements | Disclaimers City of Rocky Mount © All Rights Reserved " -943,https://ci.piedmont.ca.us/services___departments/police/transparency_portal/department_policies,Poor Data Source,Poor Data Source,Department Policies - City of Piedmont,"",200,Just a moment...,"[""City of Piedmont""]",[],[],[],[],[],"Skip navigation City of Piedmont How Do I? {1} ##LOC[OK]## Services Building Inspections Building Permits Business Licenses Facility Rentals Garbage, Recycling, and Organic Waste Parks and Fields Permits & Licenses Preschool Recreation Programs Schoolmates Street Sweeping Departments Careers & Human Resources City Administrator City Clerk Finance Fire Planning & Building Police Public Works Recreation Government Americans with Disabilities Act Charter & City Code City Council Commissions & Committees Elections Forms & Applications Meeting Videos Bid and Proposal Opportunities City Projects News & Events News Events Stay Informed KCOM-TV About Piedmont Federal, State, & County Representatives Community Resources Schools Houses of Worship Public Transit Utilities Directions to City Hall Services Building Inspections Building Permits Business Licenses Facility Rentals Garbage, Recycling, and Organic Waste Parks and Fields Permits & Licenses Preschool Recreation Programs Schoolmates Street Sweeping Departments Careers & Human Resources City Administrator City Clerk Finance Fire Planning & Building Police Public Works Recreation Government Americans with Disabilities Act Charter & City Code City Council Commissions & Committees Elections Forms & Applications Meeting Videos Bid and Proposal Opportunities City Projects News & Events News Events Stay Informed KCOM-TV About Piedmont Federal, State, & County Representatives Community Resources Schools Houses of Worship Public Transit Utilities Directions to City Hall Skip Sidebar Navigation Last item for navigation City of Piedmont » Departments » Police » Transparency Portal » Department Policies Share This Print Page A+ Increase Font A- decrease font City of Piedmont 120 Vista Avenue Piedmont, CA 94611 (510) 420-3040 Home Services & Departments Government Community & Events About Piedmont Calendar Stay Connected Youtube Facebook Page Twitter Page Instagram Page Linkedin Page City of Piedmont | All Rights Reserved | Powered by CivicLive | © 2024 Civiclive. Skip navigation City of Piedmont How Do I? City of Piedmont How Do I? City of Piedmont How Do I? City of Piedmont How Do I? " -944,http://www.longbeach.gov/police/press-releases/murder-investigation3/,Media Bulletins,Agency-Published Resources,Murder Investigation,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/11/2018 FOR IMMEDIATE RELEASE Press Release # 2018 Subject: ARREST MADE IN MURDER INVESTIGATION Contact: Media Relations Detail (562) 570-5273 UPDATE: On May 10, 2018, Detectives arrested 54-year-old Theresa Dargan of Long Beach for the April 14 th murder of Olympia Riley. Dargan has been charged with one count of murder and is being held on $2,000,000.00 bail. Victim Riley was suspect Dargan’s caregiver at the time of the murder. On April 14, 2018, at approx. 3:00 a.m., officers were dispatched to an apartment complex in the 1400 block of Walnut Avenue to assist the Long Beach Fire Department with an unresponsive female adult, who was subsequently determined deceased at the scene. When officers arrived, they observed suspicious circumstances, and it was determined the woman had sustained a stab wound to the lower body. With the assistance of the Los Angeles County Coroner’s Office, detectives began conducting a murder investigation. The victim has been identified as 51-year-old Olympia Riley of Long Beach. Anyone with information regarding this this incident is urged to contact Long Beach Police Homicide Detectives Mark Mattia and Don Goodman at (562) 570-7244. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police. Follow us on social media to stay connected: Facebook, Twitter, and Instagram. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -945,https://champaignil.gov/2013/12/04/champaign-police-make-arrest-in-roper-street-homicide/,Media Bulletins,Agency-Published Resources,Champaign Police Make Arrest in Roper Street Homicide - City of Champaign,"",200,403 Forbidden,"[""Champaign Police Make Arrest in Roper Street Homicide""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Champaign Police Make Arrest in Roper Street Homicide Search Posted on December 4, 2013 On December 4, 2013, at approximately 9:25 a.m., Champaign Police arrested Darmel L. Smith, 33, of Urbana, Illinois, for his involvement in the murder of Sheena Williams. Mr. Smith was arrested in the 200 block of South Mattis on a Champaign County warrant for Murder/Intent to Kill/Injure.  Mr. Smith’s bail has been set at $2,000,000. On September 6, the Champaign police responded to a home in the 100 block of Roper Street to check the welfare of Sheena Williams.  Ms. Williams was later found deceased inside her residence with stab wounds that did not appear to be self-inflicted.  The Champaign Police Department’s homicide investigation led them to Mr. Smith who had a previous dating relationship with Ms. Williams. Anyone with additional information about this crime is asked to call Champaign Police at 217-351-4545 or callers can remain anonymous by calling Crime Stoppers at 217-373-8477 (TIPS).  Tips can also be submitted through www.373tips.com or text by sending CCTIP plus the information to 274637 (CRIMES). -30- Categories: Police Department News , Police Department Press Releases Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs " -946,http://www.longbeach.gov/police/press-releases/don-t-spend-the-holidays-in-jail--drive-safely-or-get-pulled-over/,Media Bulletins,Agency-Published Resources,DON'T SPEND THE HOLIDAYS IN JAIL; DRIVE SAFELY OR GET PULLED OVER,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -947,https://portorchardwa.gov/press-releases/pr-22-003-police-investigate-shooting-related-to-stolen-vehicle/,Media Bulletins,Agency-Published Resources,PR 22-003 - Police Investigate Shooting Related to Stolen Vehicle - Port Orchard,"",200,Home - Port Orchard,"[""PR 22-003 – Police Investigate Shooting Related to Stolen Vehicle""]","[""Primary menu links"", ""Action toolbar"", ""Contact"", ""Subscribe"", ""Connect""]",[],[],[],[],"Port Orchard Primary menu links Community Visitors Businesses News Government Events Contact Action toolbar Answers Payments Report Issue Search Primary menu links Community Visitors Businesses News Government Events Contact Action toolbar Answers Payments Report Issue Search Port Orchard Port Orchard Port Orchard Attention!! New Locations of City Staff and Services. Click here for information. PR 22-003 – Police Investigate Shooting Related to Stolen Vehicle PR 22-003 - Police Investigate Shooting Related to Stolen Vehicle PR 22-003 – Police Investigate Shooting Related to Stolen Vehicle PR 22-003 - Police Investigate Shooting Related to Stolen Vehicle PR 22-003 – Police Investigate Shooting Related to Stolen Vehicle Helpful Share Facebook Twitter Email Size + Reset a − Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Contact 216 Prospect Street Port Orchard, WA 98366 Phone: (360) 876-4407 Hours: 8:00 a.m. - 4:30 p.m. Monday-Friday Privacy Policy Contact Links Directory Feedback Access Links Accessibility Sitemap Subscribe Subscribe to our general news & public notices. Subscribe to more lists > Enter email Email This field is for validation purposes and should be left unchanged. Connect Facebook Youtube Contact 216 Prospect Street Port Orchard, WA 98366 Phone: (360) 876-4407 Hours: 8:00 a.m. - 4:30 p.m. Monday-Friday Privacy Policy Contact Links Directory Feedback Access Links Accessibility Sitemap Subscribe Subscribe to our general news & public notices. Subscribe to more lists > Enter email Email This field is for validation purposes and should be left unchanged. Connect Facebook Youtube Contact 216 Prospect Street Port Orchard, WA 98366 Phone: (360) 876-4407 Hours: 8:00 a.m. - 4:30 p.m. Monday-Friday Privacy Policy Contact Links Directory Feedback Access Links Accessibility Sitemap " -948,http://www.ryepolice.us/wp-content/uploads/harbor-rd-closure.png,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -949,https://police.greenvillesc.gov/736/heritage-green,Not Criminal Justice Related,Not Criminal Justice Related,"Heritage Green | Greenville, SC - Official Website","Nestled in the heart of downtown Greenville, South Carolina, Heritage Green is urban arts and cultural campus. Heritage Green is located on College Street, just past Academy Street, three blocks from the Hyatt Regency.",200,"Police Department | Greenville, SC - Official Website","[""Heritage Green""]",[],"[""Loading""]",[],[],[],"Skip to Main Content Government Departments Business Visitors Residents Search Home Visitors Entertainment Venues Heritage Green Heritage Green Nestled in the heart of downtown Greenville, South Carolina, Heritage Green is an urban arts and cultural campus. Heritage Green is located on College Street, just past Academy Street, three blocks from the Hyatt Regency. Heritage Green includes: Greenville County Museum of Art Greenville Theatre Greenville County Library System - Hughes Main Library The Children's Museum of the Upstate Upcountry History Museum Sigal Music Museum Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Home Visitors Entertainment Venues Heritage Green Heritage Green Nestled in the heart of downtown Greenville, South Carolina, Heritage Green is an urban arts and cultural campus. Heritage Green is located on College Street, just past Academy Street, three blocks from the Hyatt Regency. Heritage Green includes: Greenville County Museum of Art Greenville Theatre Greenville County Library System - Hughes Main Library The Children's Museum of the Upstate Upcountry History Museum Sigal Music Museum Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Home Visitors Entertainment Venues Heritage Green Heritage Green Nestled in the heart of downtown Greenville, South Carolina, Heritage Green is an urban arts and cultural campus. Heritage Green is located on College Street, just past Academy Street, three blocks from the Hyatt Regency. Heritage Green includes: Greenville County Museum of Art Greenville Theatre Greenville County Library System - Hughes Main Library The Children's Museum of the Upstate Upcountry History Museum Sigal Music Museum Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Home Visitors Entertainment Venues Heritage Green Heritage Green Nestled in the heart of downtown Greenville, South Carolina, Heritage Green is an urban arts and cultural campus. Heritage Green is located on College Street, just past Academy Street, three blocks from the Hyatt Regency. Heritage Green includes: Greenville County Museum of Art Greenville Theatre Greenville County Library System - Hughes Main Library The Children's Museum of the Upstate Upcountry History Museum Sigal Music Museum Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Government Departments Business Visitors Residents Search " -950,https://delcopa.gov/publicrelations/releases/2019/emergencypreparedness.html,Not Criminal Justice Related,Not Criminal Justice Related,"September Recognized as National Emergency Preparedness Month - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""September Recognized as National Emergency Preparedness Month""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Delco residents urged to take steps to prepare for a disaster or emergency""]",[],[],"" -951,http://www.lafayettepolice.us/1798/accessibility,Not Criminal Justice Related,Not Criminal Justice Related,"Accessibility | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Accessibility""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -952,https://www.lynchburgvapolice.gov/department-information/,Contact Info & Agency Meta,Info About Agencies,Department Information - Lynchburg Police Department,"",200,403 Forbidden,"[""Department Information""]",[],"[""About the LPD"", ""Opportunities""]","[""Annual Budget"", ""Grants"", """", ""Training"", """", ""Officer Demographics"", ""Contact Us"", ""Site Links"", ""Site Links""]",[],"[""LPD Officers receive 880 hours of training in the police basic school. Each year, our officers complete more than 8,000 cumulative hours of training. This includes de-escalation training, firearms qualification, bias-free policing, Crisis Intervention Training, and more."", ""The LPD wants our officers to reflect the diverse fabric of our community. This remains an ongoing effort of the department."", """", ""White Officers: 84%"", ""Black Officers: 12%"", ""Hispanic Officers: 4%"", ""Female Officers: 18%"", ""Male Officers: 82%"", """"]","" -953,https://police.greenvillesc.gov/faq.aspx?qid=575,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Where can I park?,"",200,"Police Department | Greenville, SC - Official Website",[],"[""▼ Clemson MBA Fireworks on the Fourth""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -954,https://delcopa.gov/publicrelations/releases/2020/keepthecheerhere.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delco Launches Keep the Cheer Here Social Media Campaign - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delco Launches Keep the Cheer Here Social Media Campaign""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Residents encouraged to tag a local Delco business on social media and win a gift card !""]",[],[],"" -955,https://champaignil.gov/police/resources/bullying-prevention/,Resources,Agency-Published Resources,Bullying Prevention - City of Champaign,"",200,403 Forbidden,"[""Bullying Prevention""]","[""Police Department"", ""Quick Links"", ""Police Department News"", ""Contact Us""]",[],"[""Types of Bullying Behavior"", ""What Bullying is Not"", ""Bullying - The Experience"", ""Responding to Bullying"", ""Addressing Bullying"", ""The Criminal Consequences of Bullying""]",[],[],"" -956,https://www.foxcrossingwi.gov/departments/police-department/resources/bullies/,Poor Data Source,Poor Data Source,Bullies - Fox Crossing Fox Crossing,"",200,Fox Crossing - Bridging the Fox Cities Fox Crossing,"["""", """", ""Bullies""]",[],[],[],[],[],"Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing Spring Recycling Event April 27th Informational Announcement – Outstanding Absentee Ballots for the April 2, 2024 Presidential Preference Primary & Spring Election Deadlines for April 2nd Spring Election & Presidential Preference Primary Spring/Summer Recreation Programs Signup for Village Notifications Current Job Opportunities Fox Crossing 2000 Municipal Drive Neenah, WI 54956 920-720-7100 . Bullies Copyright © 2010 - 2024 Fox Crossing, All Rights Reserved. Professional Web Site Design by Sandstone Digital. Disclaimer Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing Spring Recycling Event April 27th Informational Announcement – Outstanding Absentee Ballots for the April 2, 2024 Presidential Preference Primary & Spring Election Deadlines for April 2nd Spring Election & Presidential Preference Primary Spring/Summer Recreation Programs Signup for Village Notifications Current Job Opportunities Fox Crossing 2000 Municipal Drive Neenah, WI 54956 920-720-7100 . Bullies " -957,http://lafayettepolice.us/761/location-of-smoke-detectors,Not Criminal Justice Related,Not Criminal Justice Related,"Location of Smoke Detectors | Lafayette, IN - Official Website",Where should smoke detectors/alarms be located?,200,"Police Department | Lafayette, IN - Official Website","[""Location of Smoke Detectors""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Operations Prevention Recruitment How Do I... Home Government Departments A - F Fire Department Prevention Fire Safety Practices Smoke Alarms & Detectors Location of Smoke Detectors Location of Smoke Detectors Areas of Placement Because smoke rises, you should place alarms on the ceiling. If you cannot do this, place them high up on a wall according to manufacturer's instructions. Most importantly, read the installation instructions that come with the alarm. Smoke alarms should be mounted on the ceiling at least 4 inches from a wall or on a wall with the top of the alarm not less than 4 inches, or more than 12 inches, below the ceiling. Areas to Avoid There are certain locations to avoid such as near bathrooms, heating appliances, windows, or close to ceiling fans. False Alarm Don't place smoke detectors/alarms in kitchens, bathrooms, furnace rooms, workshops, garages, or in other spaces where temperatures can fall below 32°F, or exceed 100°F. These areas are subject to fumes, steam, dust and smoke, which can generate false alarms and contaminate the alarm. Delay Alarm Don't install alarms where air movement can delay the alarm. This means they should be away from windows and at least 3 feet from warm or cold air ducts or return ducts. Also, don't install them between an air return and a bedroom door. Smoke alarms should not be located within 3 feet of doors to a kitchen or bathroom with tub or shower. Installation Tips Don't place alarms where it is inconvenient or unsafe to test them, like in tall foyers or high over a stairway. If smoke alarms are placed in a room with sloped ceilings, the alarm should be located on the high side of the ceiling. A smoke alarm installed in a stairwell must be located in such a way that smoke rising in the stairwell cannot be prevented from reaching the alarm by an intervening door or obstruction. A smoke alarm installed to detect a fire in the basement must be located close to the stairway leading to the floor above. Location of Smoke Detectors Smoke Alarms Sound Types of Smoke Alarms Free Smoke Alarm Program Community Outreach Fire Stations Submit a Request History Photo Gallery Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -958,https://sf.gov/get-copy-confidential-marriage-certificate,Resources,Agency-Published Resources,Get a copy of a confidential marriage certificate | San Francisco,"If you had a confidential marriage in San Francisco, get a copy of your marriage certificate from the County Clerk.",200,City and County of San Francisco,"[""Get a copy of a confidential marriage certificate""]","[""What to do"", ""Get help"", ""Footer menu"", ""Footer Bottom""]","[""1. Wait 4 weeks after the license has been returned for registration"", ""2. Prepare your payment"", ""3. Request a copy of your confidential marriage certificate"", ""In-Person"", ""Mail"", ""Office of the County Clerk"", ""Phone""]","["""", ""Departments""]",[],[],"" -959,https://www.mass.gov/doc/westfordpolicesergeant5443rtf/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -960,https://www.mass.gov/doc/chicopee-city-hall-april-2007-0/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -961,https://joinstatepolice.ny.gov/15-mile-run,Training & Hiring Info,Info About Officers,Attention Required! | Cloudflare,"",200,Become a Trooper Home Page | Join the State Police,"[""Sorry, you have been blocked""]","[""You are unable to access ny.gov"", ""Why have I been blocked?"", ""What can I do to resolve this?""]",[],[],[],[],"Please enable cookies. Sorry, you have been blocked You are unable to access ny.gov Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. What can I do to resolve this? You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page. Cloudflare Ray ID: 86a1586d1e378fed • Your IP: Click to reveal 209.6.137.20 • Performance & security by Cloudflare Please enable cookies. Sorry, you have been blocked You are unable to access ny.gov Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. What can I do to resolve this? You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page. Cloudflare Ray ID: 86a1586d1e378fed • Your IP: Click to reveal 209.6.137.20 • Performance & security by Cloudflare Sorry, you have been blocked You are unable to access ny.gov Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. What can I do to resolve this? You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page. Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. What can I do to resolve this? You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page. Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. " -962,https://estespark.colorado.gov/departments/police/operations-landing-page,Contact Info & Agency Meta,Info About Agencies,Operations- Landing Page | Town of Estes Park,"",200,Home | Town of Estes Park,"[""Operations- Landing Page""]","[""Serving the Estes Park Community for Over 100 Years"", ""Branches of Operations"", ""Services""]","[""Language Translation""]",[],[],[],"" -963,https://delcopa.gov/planning/pdf/mapping/brookhaven.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -964,https://www.mass.gov/doc/instructions-dcamm-scoping-form-for-maab-compliance/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -965,https://www.jacksontn.gov/government/departments/police/citizen_engagement/national_night_out,Misc Police Activity,Police & Public Interactions,"","",404,"","","","","","","","" -966,https://westplains.gov/first-annual-community-police-academy/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -967,https://chandlerazpd.gov/2011/02/police-need-help-identifying-burglary-and-fraud-suspects/,Media Bulletins,Agency-Published Resources,Police Need Help Identifying Burglary and Fraud Suspects – Chandler Police Department,"",200,Chandler Police Department,"[""Police Need Help Identifying Burglary and Fraud Suspects""]",[],"[""Quick Links"", ""News Archives"", """", """", """", """"]","[""February 11, 2011"", ""Contact"", ""About the Department"", ""Latest News"", ""Courage, Pride, Dedication © 2024 Chandler Police Department""]",[],[],"The Chandler Police Department main lobby will be closed for renovations. Please see below for further. The Chandler Police Department main lobby will be closed for renovations. Please see below for further. Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Home News Police Need Help Identifying Burglary and Fraud Suspects Home News Police Need Help Identifying Burglary and Fraud Suspects Search for: Police Need Help Identifying Burglary and Fraud Suspects February 11, 2011 By Sergeant J. Favazzo CHANDLER, AZ –  Since November of 2010, there has been a series of vehicle burglaries across the valley where victims’ purses have been stolen, many times when the victim has left her purse in the car while dropping off a child at day-care or while visiting City parks.  Witnesses have reported seeing a white mini-van, possibly a Dodge Grand Caravan, leaving the area immediately after the burglaries occur. The suspects then use stolen ID’s, checks, and bank cards to cash forged checks at various bank drive-through locations in Chandler and across the valley, employing wigs and other items to make themselves appear more like the person whose stolen ID they are using. One vehicle used during the commission of some of these crimes is a white 2009 Kia Borrego SUV; another is a black, newer-model Mazda CX9 crossover SUV. The Chandler Police Department has identified seventeen different victims, to date, whose names have appeared on the forged checks. The Chandler Police Department encourages anyone with information about this case to call 480-782-4130. Search for: Quick Links About the Department Office of the Chief Interim Chief Of Police Melissa Deanda Assistant Chief Of Police Dave Ramer Department Events My Precinct Fingerprinting Services Request a Police Report Bicycle Registration General Orders/Accreditation Alarm Information Registered Sex Offenders Citizen Observer (Ride-Along) Vehicle Impounds Barking Dog Police Open Data Public Demonstration Guidelines News Archives August 2022 September 2021 July 2021 September 2020 August 2020 June 2020 May 2020 April 2020 March 2020 February 2020 January 2020 December 2019 " -968,https://www.southamptontownnypolice.gov/faq.aspx?qid=284,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • What type of vital records are available from the Tow,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Town Clerk - Records""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -969,https://www.sandiego.gov/department-document/san-diego-police-arrest-suspect-horton-plaza-homicide,Media Bulletins,Agency-Published Resources,San Diego Police Arrest Suspect in Horton Plaza Homicide | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""San Diego Police Arrest Suspect in Horton Plaza Homicide"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -970,https://www.providenceri.gov/police-city-officials-announce-progress-continued-efforts-related-illegal-vehicles/press-release-illegal-vehicles/,Poor Data Source,Poor Data Source,City of Providence Press-Release-illegal-vehicles - City of Providence,"",200,Sucuri WebSite Firewall - Access Denied,"[""Press-Release-illegal-vehicles""]","[""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español"", ""Lists *""]",[],[],[],"Skip To Menu Skip To Content Skip To Accessibility Options Language Language Arabic Chinese (Traditional) English Khemer Portuguese Spanish City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley City Of Providence Mayor Brett Smiley Search Accessibility CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation PVD 311 CITY HALL I Want to … MAYOR BRETT P. SMILEY Departments City Council Find a Meeting Agenda Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Running a Business Starting a Business Purchasing EVENTS NEWS EXPLORE Explore Providence Parks Recreation ACCESSIBILITY Press-Release-illegal-vehicles Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn Press-Release-illegal-vehicles Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * " -972,https://beaumonttexas.gov/bpd-police-memorial-ceremony-thursday-may-19-2022-at-900-am/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -973,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-103-fitness-bonus-payment-fiscal-year-2007-08,Training & Hiring Info,Info About Officers,State Police Bulletin No. SP-103 | Office of the New York State Comptroller,To notify the Division of State Police of the procedures for processing Fitness Bonus Payments,200,Office of the New York State Comptroller | Thomas P. DiNapoli,"[""State Police Bulletin No. SP-103"", """"]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Background"", ""Effective Date(s)"", ""Eligibility"", ""Agency Actions"", ""Deduction Information"", ""Undeliverable Checks"", ""Payroll Register and Employee’s Paycheck/Advice"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[],"" -974,http://www.longbeach.gov/police/press-releases/two-cited-during-undercover-vice-operation/,Media Bulletins,Agency-Published Resources,TWO CITED DURING UNDERCOVER VICE OPERATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/21/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: TWO CITED DURING UNDERCOVER VICE OPERATION Contact: Media Relations Detail (562) 570-5273 On Saturday, April 18, 2015, the Long Beach Police Department's Vice Investigations Section, in cooperation with investigators from the Department of Alcoholic Beverage Control (ABC), participated in a Shoulder Tap Operation. The operation focused on individuals who knowingly purchased alcohol for minors. Minors under the age of 21, under the supervision of the L.B.P.D, approached customers outside a business. The minors told the individuals they were too young to buy alcohol and requested alcohol be purchased on their behalf. Two customers who purchased alcohol for a minor were identified and subsequently issued a misdemeanor citation for unlawfully furnishing alcohol to a minor. The businesses were unaware that an undercover operation was underway. These operations are conducted with the community's safety in mind.  The L.B.P.D. will continue to enforce ABC laws at all establishments throughout the city and wants to remind everyone that there are consequences for contributing to the delinquency of a minor. Anyone wishing to report illegal behavior relating to the unlawful sale of alcohol should contact the Vice Investigations Section at (562) 570-7219. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -975,https://www.jerseycitynj.gov/news/pressreleases20182017/jersey_city_police_department_reaches_record_numbe,Media Bulletins,Agency-Published Resources,JCPD Reaches Record Numbers - City of Jersey City,"",200,Just a moment...,"[""Jersey City""]","[""JCPD Reaches Record Numbers""]",[],[],[],[],Skip to Content -976,https://delcopa.gov/publicrelations/releases/2019/pdf/youthmentalhealthfirstaiddec3.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -977,https://www.roseville.ca.us/government/departments/police_department/resources/crime___arrest_information/neighborhood_police_activity_digests,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -978,https://delcopa.gov/council/index.html,Not Criminal Justice Related,Not Criminal Justice Related,"County Council - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""County Council""]",[],"[""MEMBERS OF THE DELAWARE COUNTY COUNCIL"", ""Helpful County Council Links"", ""County Council Function"", ""County Council Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -979,https://www.waynesvillenc.gov/services/file-police-report,Contact Info & Agency Meta,Info About Agencies,"File a Police Report | The Town of Waynesville, NC","To file a police report, please call 828-456-5363 to arrange to have an officer meet you at the scene of the crime, or come into the Police Station at 9 South Main St and meet with an officer. Call 911 only for emergencies.",200,"Home Page | The Town of Waynesville, NC","[""File a Police Report""]","[""Secondary navigation"", ""Main navigation"", ""Breadcrumb""]",[],"[""Contact Information"", ""Stay Connected""]",[],[],"Menu Menu Menu Secondary navigation About News Events Contact Jobs Menu Main navigation Services Toggle menu Administration Toggle menu Bids Clerk of Court Jobs Register of Deeds Administration Bids Clerk of Court Jobs Register of Deeds Development Services Toggle menu Code Enforcement Permits Development Services Code Enforcement Permits Finance Toggle menu Bill Pay Business Licenses Tax Lookup Utility Applications and Forms Vendor Registration Finance Bill Pay Business Licenses Tax Lookup Utility Applications and Forms Vendor Registration Police Toggle menu Crime Tips File a Police Report Request for Public Records Special Needs Registry Application Vacation Security Check Police Crime Tips File a Police Report Request for Public Records Special Needs Registry Application Vacation Security Check Public Services Toggle menu Electricity Report an Outage Service Trash Pickup Water Public Services Electricity Report an Outage Service Trash Pickup Water Residents Toggle menu New To Town Connecting People with Art Visitors Toggle menu Arts and Leisure Downtown Waynesville Association Folkmoot The Natural Beauty of WNC Visit NC Smokies Businesses Toggle menu Business Information Business Licenses Opening a Business Departments Toggle menu Administration Development Services Finance Fire Human Resources Parks & Recreation Police Public Services Government Toggle menu Mayor and Town Council Toggle menu Mayor and Town Council Agendas and Minutes Public Comment Policy Mayor and Town Council Mayor and Town Council Agendas and Minutes Public Comment Policy Resources Toggle menu Resolutions and Proclamations Code of Ordinances Public Hearings Holiday Schedule Other Governments Resources Resolutions and Proclamations Code of Ordinances Public Hearings Holiday Schedule Other Governments Advisory Boards Toggle menu Advisory Boards Current Vacancies ABC Board Board of Adjustment Cemetery Committee Historic Preservation Commission Planning Board Public Art Commission Recreation and Parks Advisory Commission Waynesville Housing Authority Community Appearance Commission (defunct) Task Force on Homelessness Advisory Boards Advisory Boards Current Vacancies ABC Board Board of Adjustment Cemetery Committee Historic Preservation Commission Planning Board Public Art Commission Recreation and Parks Advisory Commission Waynesville Housing Authority Community Appearance Commission (defunct) Task Force on Homelessness Breadcrumb Home Services File a Police Report To file a police report, please call 828-456-5363 to arrange to have an officer meet you at the scene of the crime, or come into the Police Station at 9 South Main St and meet with an officer. Call 911 only for emergencies. Components / Atoms / Logo / Primary Created with Sketch. 16 South Main Street, PO Box 100 Waynesville NC 28786 Phone: +1.828.452.2491 Get Directions Provide your address in the field above to generate directions. Contact Information 16 South Main Street, PO Box 100 Waynesville NC 28786 +1.828.452.2491 Signup for Notifications Stay Connected Connect with us on facebook Connect with us on twitter Connect with us on youtube © Copyright 2024 The Town of Waynesville, NC Terms and Conditions Site Map Employees Website by Avid New Media logo--white " -980,https://sanramon.ca.gov/our_city/departments_and_divisions/police/divisions_and_units/youth_and_family/youth_resource_officer,Contact Info & Agency Meta,Info About Agencies,Youth Resource Officer - City of San Ramon,"",200,Just a moment...,"[""Youth Resource Officer""]","[""Contact Us"", ""Youth Resource Officer"", ""Contact Us"", ""Useful Links""]",[],[],[],[],"" -981,https://www.mass.gov/locations/chicopee-retirement-system/locations,Not Criminal Justice Related,Not Criminal Justice Related,Locations | Mass.gov,"",200,Mass.gov,"[""Other locations related to Chicopee Retirement System""]","[""""]",[],[],[],[],"" -982,https://martinsville.in.gov/departments-services/police-department/,Contact Info & Agency Meta,Info About Agencies,"Police Department | Martinsville, IN","It is the mission of the Martinsville Police Department to safeguard the lives and property of the people we serve, to reduce the incidence and fear of crime and to enhance public safety while working with our community to improve the quality of life.",200,"Martinsville, IN | Official Website","[""Police Department""]","[""Programs"", ""Services"", ""Golf Cart Inspections"", ""Connect with the Martinsville Police Department""]","[""Curfew & Code Enforcement"", ""Operation Sheepdog"", ""Citizens Police Academy"", ""National Night out"", ""Coffee with a Cop"", ""Clothe a Child Project"", ""Dual Credit Partnership"", ""DARE Program"", ""Fraud Protection Presentations"", ""K9 Demonstrations for Students"", ""Free Home Safety Visits"", ""Vacation Watches"", ""Nuisance, Suspected Drug House"", ""Speed Trailer"", ""VIN Inspections"", ""Firearms License"", ""Parking Tickets"", ""Crash / Incident Reports"", ""Contact Us"", ""Hours"", ""Contact Us"", ""Quick Links"", ""Helpful Links"", ""Loading""]","[""Police Department""]",[],[],Skip to Main Content -983,https://champaignil.gov/2020/10/22/champaign-police-seeking-armed-robbery-suspect/,Media Bulletins,Agency-Published Resources,Champaign Police Seeking Armed Robbery Suspect - City of Champaign,"",200,403 Forbidden,"[""Champaign Police Seeking Armed Robbery Suspect""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Champaign Police Seeking Armed Robbery Suspect Search Posted on October 22, 2020 The Champaign Police Department is looking to identify a suspect who is believed to be involved in two recent armed robberies to the CVS at 107 W. Green Street. The robberies occurred on Oct. 4 at approximately 7:30 p.m. and on Oct. 13 at approximately 9 p.m. In both incidents, the offender arrived on a bicycle and entered the store in possession of an apparent long gun. The offender demanded currency and threatened to shoot the store clerk. After obtaining an undisclosed amount of currency, the offender fled westbound on the bicycle. The offender is described as a white male in his 30s or 40s. He is approximately 6 feet tall with a medium build and broad shoulders. He was reported to have tobacco-like staining on his right fingertips, indicating he is a possible smoker. In both robberies the offender was carrying a green or olive colored book bag that has dark-colored shoulder straps. The long gun observed in the armed robberies is believed to have a wooden stock. Suspect photo 1 Suspect photo 2 Suspect photo 3 Champaign Police are actively investigating these incidents. If you know the whereabouts or identity of this person, please contact police at 217-351-4545. Arrangements can be made for information to be shared privately. Anyone wishing to remain anonymous may also submit tips to Crime Stoppers by phone at: 217-373-8477 (TIPS); online at 373tips.com; or the “P3 Tips” mobile app. Champaign Police reminds citizens that information submitted to Crime Stoppers is completely anonymous. Calls are routed to a third-party national call center that receives your information, completes a tips information form, and then passes the information to the appropriate law enforcement agency. Caller ID tracking is not utilized by Crime Stoppers and conversations are not recorded. Crime Stoppers will pay a reward up to $1,000 for information leading to the arrest of the person(s) responsible for this crime. Categories: Police Department Press Releases Tags: 107 W. Green Street , Armed Robbery , CVS Robbery Suspect Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy " -984,https://alpha.austin.gov/en/police-oversight/formal-complaint-arrest-requirement-assaultive-offenses-and-other-policy-violations/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -985,https://camptonhills.illinois.gov/village-of-campton-hills-police-department/request-for-public-records-form/,Records Request Info,Agency-Published Resources,Request for Public Records Form – Village of Campton Hills,"",200,Village of Campton Hills – Village of Campton Hills Website,[],"[""Request for Public Records Form"", ""© 2024 All Rights Reserved Village of Campton Hills.""]",[],"[""Recognition"", ""Follow Us"", ""Important Links"", ""Contact Us""]",[],[],"(630) 584-5700 M-F  9AM - 4PM Report A Concern | CONTACT US MENU MENU Government Committees & Commissions Community Relations Commission Finance Committee Fire & Police Commission IT Adhoc Committee Plan Commission/Zoning Board of Appeals Police Pension Fund Board Public Works Committee Village Board Zoning Commission Departments Administration & Finance Building & Zoning Police Department Codes, Ordinances & Resolutions Village Code Village Ordinances Village Resolutions Transparency Agendas & Meeting Minutes Annual Budgets & Audits Annual Financial Reports Annual Meeting Calendar Bids & Requests for Proposals Compensation & Benefits Contact Directory IMRF Employer Cost and Participation Information Contracts Public Information (FOIA) Lobbying Taxes & Fees Treasurer’s Reports and Warrants Planning Reports Volunteer Committee Volunteer Form Police Department Police Department Home Page Adjudication Hearing Officer & Information Animal Control Chief Of Police Reports Code Red Community Notifications Crash Report Employment Opportunities K9 Unit Meet the Officers Letters of Appreciation Sex Offender Registration & Map Programs & Services Alice Training Citizen Police Academy Community Crisis Center Illinois Premise Alert Program IL Sec. of State’s Emergency Contact Database Project ChildSafe Information Ride-Along Program Ring Neighbors App Too Good For Drugs Forms & Permits Alarm Registration Form Application for Letter of Good Conduct Civil/Ordinance Violation Local Records Search Request Officer Commendation & Complaint Information Overweight/Oversize Permits Public Records Request (FOIA) Vacation Check Form Business & Development Business Directory Forms Liquor License Application Peddlers, Solicitors & Mobile Food Vendor Licenses Resources Zoning Code Update Project 2022 For Residents Campton Community About the Community & Events School Districts, Colleges & Universities Welcome Booklet Forms Building Permit Application Resources Building Permit Info Campton Township Highway District Coronavirus Resources Electricity Aggregation Emergency Preparedness Emergency Volunteers Training Fire Districts Election Information Polling Place Lookup Issued Solicitors Permits Kane County GIS Map Mental Health and Substance Use Resources Utilities & Services How Do I Contact Directory Fire Protection Districts Police Department Utilities & Services Village Board Members Village Hall Find Agendas & Meeting Minutes Bids & Requests for Proposals Document Library Employment Opportunities Peddlers, Solicitors & Mobile Food Vendor Licenses Village Calendar File/Apply Alarm Registration Form Application for Letter of Good Conduct Building Permit Application Civil/Ordinance Violation Local Records Search Request Committee Volunteer Form Public Records Request (FOIA) Officer Commendation & Complaint Report A Concern Form Solicitors Permit Applications Stormwater/Drainage Concern Form Subscribe to Community Counts Newsletter Vacation Check Form Search Search " -986,https://southamptontownnypolice.gov/1000/adopted-studies,Not Criminal Justice Related,Not Criminal Justice Related,"Adopted Studies | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Adopted Studies""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]","[""Community Preservation Plan (Adopted August 1998)"", ""Deer Protection & Mngmt Plan"", ""Housing Plan (CHF Referendum)"", ""Sag Harbor Gateway Plan (Adopted Mar. 2009) (PDF)""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Town Studies & Reports Adopted Studies Adopted Studies 9 1 1 2 Community Preservation Plan (Adopted August 1998) Read through the documents related to the Community Preservation Project Plan. Deer Protection & Mngmt Plan View the adopt Deer Protection and Management Plan. Housing Plan (CHF Referendum) Sag Harbor Gateway Plan (Adopted Mar. 2009) (PDF) Peruse through the pages of the Sag Harbor Gateway Plan. Community Preservation Plan (Adopted August 1998) Deer Protection & Mngmt Plan Housing Plan (CHF Referendum) Sag Harbor Gateway Plan (Adopted Mar. 2009) (PDF) Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Town Studies & Reports Adopted Studies Adopted Studies 9 1 1 2 Community Preservation Plan (Adopted August 1998) Read through the documents related to the Community Preservation Project Plan. Deer Protection & Mngmt Plan View the adopt Deer Protection and Management Plan. Housing Plan (CHF Referendum) Sag Harbor Gateway Plan (Adopted Mar. 2009) (PDF) Peruse through the pages of the Sag Harbor Gateway Plan. Community Preservation Plan (Adopted August 1998) Deer Protection & Mngmt Plan Housing Plan (CHF Referendum) Sag Harbor Gateway Plan (Adopted Mar. 2009) (PDF) Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -987,https://www.antioch.il.gov/wpfb-file/12-11-12-police-pension-agenda-pdf-4/,Media Bulletins,Agency-Published Resources,"12-11-12 Police Pension Agenda - Antioch, IL",13516 12 11 police pension agenda pdf commissions fund agendas 2012 1625758338 34a3f5b920003b78ea472a9fa24dae0a a7cc2c799489b8cddb7e99d7bd8c51436f44ae62c5f317b119f38278dad9de70 213x300 _jyolygdyi9gj thumb jpg 2017 05 17 08 41 32 0 40 77 167 2021 06 26 15 51 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17 pagefailed_18 pagefailed_19,200,"Home - Antioch, IL","[""12-11-12 Police Pension Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -988,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/040621blotter.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -990,https://www.mass.gov/doc/opencompetitiveeducationandexperienceratingworksheetforpoliceofficerdoc/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -991,https://www.troyny.gov/troy-police-seek-publics-help-in-solving-double-homicide-case/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -992,https://www.sandyspringsgapolice.gov/apartment-safety-checker/,Resources,Agency-Published Resources,Apartment Safety Checker – Sandy Springs Police Department,"",200,Sandy Springs Police Department,"[""Apartment Safety Checker""]",[],[],[],[],[],Emergency: Dial 911 | Non-Emergency: Phone Directory | Police Reports | Events Emergency: Dial 911 | Non-Emergency: Phone Directory | Police Reports | Events Menu Menu About SSPD Police Chief Command Staff Districts Careers with SSPD Contact Us Visit Police HQ Higher Learning Statement on Use of Force & Community Engagement SSPD Most Wanted In Memoriam Sandy Springs Police Benevolent Fund SSPD’s Social Media Policy Divisions and Units Patrol Division Special Operations Division Criminal Investigation Division Administration Division Intelligence and Technology Division Internal Affairs Training and Background Unit Property & Evidence Unit Specialized Units North Metro S.W.A.T. Quick Response Force Street Crimes Unit K-9 Unit Traffic Traffic Response Vehicle Bicycle Patrol CSI Unit Crisis Negotiation Team River Patrol Unit Honor Guard Drone Program Community Part Time / Reserve Officers Task Forces Organizational Chart Citizen Services Alarm Information Alcohol Pouring Permits Apartment Safety Checker ChatComm911 Criminal History Reports and Record Restrictions Event Map ⤤ Domestic Violence Resources Home and Business Checks Mental Health & Substance Abuse Municipal Court Off-Duty Officer Requests Open Records Requests Police Reports Report a Crime & Crime Tips Sex Offender Registry Vehicle Release VIN Verification Weapons Carry License Crime Prevention Crime Statistics Neighborhood Watch Home and Business Security Citizen Participation SSPD Events Citizens Police Academy (CPA) Women’s Self Defense Classes Handgun Safety Class Volunteer Programs Citizens On Patrol (COPS) Law Enforcement Explorers Youth Program Internship Program VIPS (Volunteers in Police Service) Chaplains Program Camera Registry Program Menu About SSPD Police Chief Command Staff Districts Careers with SSPD Contact Us Visit Police HQ Higher Learning Statement on Use of Force & Community Engagement SSPD Most Wanted In Memoriam Sandy Springs Police Benevolent Fund SSPD’s Social Media Policy Divisions and Units Patrol Division Special Operations Division Criminal Investigation Division Administration Division Intelligence and Technology Division Internal Affairs Training and Background Unit Property & Evidence Unit Specialized Units North Metro S.W.A.T. Quick Response Force Street Crimes Unit K-9 Unit Traffic Traffic Response Vehicle Bicycle Patrol CSI Unit Crisis Negotiation Team River Patrol Unit Honor Guard Drone Program Community Part Time / Reserve Officers Task Forces Organizational Chart Citizen Services Alarm Information Alcohol Pouring Permits Apartment Safety Checker ChatComm911 Criminal History Reports and Record Restrictions Event Map ⤤ Domestic Violence Resources Home and Business Checks Mental Health & Substance Abuse Municipal Court Off-Duty Officer Requests Open Records Requests Police Reports Report a Crime & Crime Tips Sex Offender Registry Vehicle Release VIN Verification Weapons Carry License Crime Prevention Crime Statistics Neighborhood Watch Home and Business Security Citizen Participation SSPD Events Citizens Police Academy (CPA) Women’s Self Defense Classes Handgun Safety Class Volunteer Programs Citizens On Patrol (COPS) Law Enforcement Explorers Youth Program Internship Program VIPS (Volunteers in Police Service) Chaplains Program Camera Registry Program -993,http://www.lafayettepolice.us/782/recruitment,Training & Hiring Info,Info About Officers,"Recruitment | Lafayette, IN - Official Website",Review the Lafayette Fire Department recruitment process so you know what to expect when the next opening comes around.,200,"Police Department | Lafayette, IN - Official Website","[""Recruitment""]","[""Lafayette Fire Department Recruitment Process"", ""Application / Appointment Process""]","[""Pre-Employment"", ""Contact Us"", ""Brian Alkire"", ""Fire Department"", ""Hours"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -994,https://coloradosprings.gov/police-department/page/meth-lab-cleanup,Poor Data Source,Poor Data Source,"","",403,"","","","","","","","" -995,https://training.detroitmi.gov/departments/police-department/detroit-police-department-office-civil-rights/definitions-consent-decree,Policies & Contracts,Info About Agencies,Definitions of Consent Decree | City of Detroit,"On July 18, 2003 the Detroit Police Department, the City of Detroit and the United States Department of Justice entered into two consent decrees. The first consent decree deals with the Use of Force, Arrest and Witness Detention. The second decree concerns the Conditions of Confinement in our holding facilities.        1.  As used in this Agreement: a. The term “actively resisting” means the subject is making physically evasive movements to defeat an officer's attempt at control, including bracing, tensing, pulling away, or pushing.  b. The term “arrest” means a seizure of greater scope or duration than an investigatory or Terry stop. An arrest is lawful when supported by probable cause. c. The term “auditable form” or “auditable log” means a discrete record of the relevant information maintained separate and independent of blotters and other forms maintained by the DPD. d. The term “canine apprehension” means any time a canine is deployed and plays a clear and well-documented role in the capture of a person. The mere presence of a canine at the scene of an arrest shall not be counted as an apprehension. e. The term “canine bite ratio” means the number of apprehensions accomplished by means of a dog bite divided by the total number of apprehensions (both with and without a bite). f. The term “canine deployment” means any situation, except in cases involving an on-leash article search only, in which a canine is brought to the scene and either: i) the canine is released from the police car in furtherance of the police action; or ii) the suspect gives up immediately after an announcement is made that if he/she does not surrender the canine will be released. g. The term “City” means the City of Detroit, including its agents, officers and employees. h. The term “Collective Bargaining Agreements” means the labor agreements by and between the City and the Detroit Police Officers Association, the Detroit Police Lieutenants and Sergeants Association, the Detroit Police Command Officers Association, the Police Officer Labor Council, and Local 2394 of the American Federation of State, County, and Municipal Employees in effect on the effective date of this Agreement. i. The term “command investigation” means an investigation conducted by a DPD officer’s or employee’s supervisor. j. The term “complaint” means an allegation from any source of any misconduct by DPD personnel. k. The term “conveyance” means any instance when the DPD transports a non-DPD employee for any purpose. l. The term “critical firearm discharge” means each discharge of a firearm by a DPD officer with the exception of range and training discharges and discharges at animals. m. The term “DOJ” means the United States Department of Justice and its agents and employees. n. The term “DPD” means the Detroit Police Department, its agents and its employees (both sworn and unsworn). o. The term “DPD unit” means any officially designated organization of officers within the DPD, including precincts and specialized units. p. The term “discipline” means a written reprimand, suspension, demotion or dismissal. q. The term “effective date” means the day this Agreement is entered by the Court. r. The term “escorting” means the use of light physical pressure to guide a person, or keep a person in place. s. The term “FTO” means a field training officer. t. The term “force” means the following actions by an officer: any physical strike or instrumental contact with a person; any intentional attempted physical strike or instrumental contact that does not take effect; or any significant physical contact that restricts the movement of a person. The term includes the discharge of firearms; the use of chemical spray, choke holds or hard hands; the taking of a subject to the ground; or the deployment of a canine. The term does not include escorting or handcuffing a person, with no or minimal resistance. Use of force is lawful if it is objectively reasonable under the circumstances and the minimum amount of force necessary to effect an arrest or protect the officer or other person. u. The term “hard hands” means using physical pressure to force a person against an object or the ground, or the use of physical strength or skill that causes pain or leaves a mark. v. The term “hold” means any outstanding charge(s) or warrant(s) other than those which serve as the predicate for the current arrest. w. The term “IAD” means the section of the DPD that investigates serious uses of force and allegations of criminal misconduct by DPD employees. x. The term “including” means “including, but not limited to.” y. The term “injury” means any impairment of physical condition or pain. z. The term “investigatory stop,” or “Terry stop,” means a limited seizure. An investigatory stop is lawful when supported by reasonable suspicion and narrowly tailored in scope and duration to the reasons supporting the seizure. aa. The term “material witness” means a witness subpoenaed to testify in a criminal case. bb. The term “misconduct” means any conduct by a DPD employee that violates DPD policy or the law. cc. The term “non-disciplinary corrective action” means counseling, training or other action apart from discipline taken by a DPD supervisor to enable or encourage an officer to modify or improve his or her performance. dd. The term “OCI” means the Office of the Chief Investigator, which has responsibility for investigating external complaints. ee. The term “parties” means the DOJ, the City and the DPD. ff. The term “police officer” or “officer” means any law enforcement officer employed by the DPD, including supervisors. gg. The term “prisoner injury” means an injury, or complaint of injury, that occurs in the course of taking or after an individual was taken into DPD custody that is not attributed to a use of force by a DPD employee. hh. The term “probable cause” means a reasonable belief that an individual has committed, is committing, or is about to commit an offense. ii. The term “prompt judicial review” means the presentment of an arrestee before a court of appropriate jurisdiction for a probable cause determination as soon after an arrest as is reasonably feasible. A reasonably feasible time period is the period of time necessary to schedule the arraignment and complete the administrative processing of the arrestee and shall not exceed 48 hours of the arrest, absent extraordinary circumstances. jj. The term “proper use of force decision making” means the use of reasonable force, including proper tactics, and de-escalation techniques. kk. The term “reasonable suspicion” means the specific facts and reasonable inferences drawn from those facts to convince an ordinarily prudent person that criminality is at hand. ll. The term “seizure,” or “detention,” means any restriction on the liberty interest of an individual. A seizure occurs when an officer's words or actions convey to a reasonable person that he or she is not free to leave. mm. The term “serious bodily injury” means an injury that involves a loss of consciousness, extreme physical pain, protracted and obvious disfigurement, protracted loss or impairment of the function of a body part or organ, or a substantial risk of death. nn. The term “serious use of force” means any action by a DPD officer that involves: i) the use of deadly force, including all critical firearms discharges; ii) a use of force in which the person suffers serious bodily injury or requires hospital admission; iii) a canine bite; and iv) the use of chemical spray against a restrained person. oo. The term “shall” means that the provision imposes a mandatory duty. pp. The term “supervisor” means a sworn DPD employee at the rank of sergeant or above and non-sworn employees with oversight responsibility for DPD employees.",200,City of Detroit | Opportunity Rising,"[""Definitions of Consent Decree""]","[""Top Links"", ""Site Menu""]","[""""]",[],[],[],"" -996,http://police.portlandmaine.gov/676/design-manual-overhaul-2021,Not Criminal Justice Related,Not Criminal Justice Related,"Design Manual Overhaul 2021 | Portland, ME - Official Website",The Planning and Urban Development Department is reviewing and revising the City of Portland Design Manual. The Design Manual regulations apply to Site Plan applications in certain zones and are in addition to the zoning requirements.,200,"Portland, ME - Official Website | Official Website","[""Design Manual Overhaul 2021""]",[],[],[],[],[],Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government Departments Planning & Urban Development Long Range Planning Projects Design Manual Overhaul 2021 Design Manual Overhaul 2021 Design Manual Overhaul 2021 ReCode Phase II Historic Preservation Impact Study Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Planning & Urban Development Long Range Planning Projects Design Manual Overhaul 2021 Design Manual Overhaul 2021 Design Manual Overhaul 2021 ReCode Phase II Historic Preservation Impact Study Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Planning & Urban Development Long Range Planning Projects Design Manual Overhaul 2021 Design Manual Overhaul 2021 Design Manual Overhaul 2021 ReCode Phase II Historic Preservation Impact Study Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Planning & Urban Development Long Range Planning Projects Design Manual Overhaul 2021 Design Manual Overhaul 2021 Design Manual Overhaul 2021 ReCode Phase II Historic Preservation Impact Study Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Planning & Urban Development Long Range Planning Projects Design Manual Overhaul 2021 Design Manual Overhaul 2021 Design Manual Overhaul 2021 ReCode Phase II Historic Preservation Impact Study Home Your Government Departments Planning & Urban Development Long Range Planning Projects Design Manual Overhaul 2021 Design Manual Overhaul 2021 Design Manual Overhaul 2021 ReCode Phase II Historic Preservation Impact Study Home Your Government Departments Planning & Urban Development Long Range Planning Projects Design Manual Overhaul 2021 Design Manual Overhaul 2021 Design Manual Overhaul 2021 ReCode Phase II Historic Preservation Impact Study Home Your Government Departments Planning & Urban Development Long Range Planning Projects Design Manual Overhaul 2021 Design Manual Overhaul 2021 Home Your Government Departments Planning & Urban Development Long Range Planning Projects Design Manual Overhaul 2021 Design Manual Overhaul 2021 Home Your Government Departments Planning & Urban Development Long Range Planning Projects Design Manual Overhaul 2021 Design Manual Overhaul 2021 Design Manual Overhaul 2021 Design Manual Overhaul 2021 ReCode Phase II Historic Preservation Impact Study Design Manual Overhaul 2021 ReCode Phase II Historic Preservation Impact Study Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® -997,https://www.antioch.il.gov/event/police-pension-board-special-meeting-2/,Poor Data Source,Poor Data Source,"Police Pension Board Special Meeting - Antioch, IL","",200,"Home - Antioch, IL","[""Police Pension Board Special Meeting""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -998,https://detroitmi.gov/bn/departments/paulaisa-baibhaaga/detroit-police-department-shield-program/paraogaraama-ebam-saebaa,Poor Data Source,Poor Data Source,প্রোগ্রাম এবং সেবা | City of Detroit,"DPD SHIELD প্রোগ্রামটি বিভিন্ন শ্রোতাদের আলিঙ্গন করার জন্য ডিজাইন করা হয়েছে যেমন নিরাপত্তা পরিচালক, নিরাপত্তা ব্যবস্থাপক, সম্প্রদায়ের নেতা, ব্যবসায়িক নির্বাহী, ব্যবসার মালিক, শিক্ষাবিদ, বিশ্বাস-ভিত্তিক সম্প্রদায় এবং অন্যান্য যাদের নিজ নিজ কর্মীদের নিরাপত্তা নিশ্চিত করার দায়িত্ব রয়েছে। ব্যবসা বা প্রতিষ্ঠান। একটি সফল প্রোগ্রামের চাবিকাঠি এবং সেইসাথে আমাদের সম্প্রদায়গুলিকে সুরক্ষিত করা হল তথ্যের পারস্পরিক প্রবাহকে উত্সাহিত করা। DPD SHIELD প্রোগ্রাম তার অংশীদারদের অবগত এবং স্থিতিস্থাপক রাখতে গুরুত্বপূর্ণ সংস্থান এবং প্রশিক্ষণ প্রদান করে।",200,City of Detroit | Opportunity Rising,"[""প্রোগ্রাম এবং সেবা""]","[""Top Links"", ""Site Menu"", ""ডেট্রয়েট পুলিশ শিল্ড FAQs""]",[],"[""পরিচিতি"", ""ডিপার্টমেন্ট মেনু""]",[],[],"Top Links Buses চাকরি পানি পে বিভাগ সরকার English Español Bengali العربية More অনুসন্ধান Site Menu MENU অনুসন্ধান বিভাগ BACK বিমানবন্দর, কোলম্যান এ। ইয়ং ইন্টারন্যাশনাল বিল্ডিং, সুরক্ষা প্রকৌশল ও পরিবেশ বিভাগ নাগরিক অধিকার, অন্তর্ভুক্তি ও সুযোগ বিভাগ গণপূর্ত বিভাগ আপিল ও শুনানি বিভাগ উদ্ভাবন ও প্রযুক্তি বিভাগ প্রতিবেশী বিভাগ ডেট্রয়েট বিল্ডিং অথরিটি আইন বিভাগ আবাসন ও পুনরুজ্জীবন বিভাগ চিফ ফিনান্সিয়াল অফিসারের অফিস ডেট্রয়েট পরিবহন বিভাগ ডেট্রয়েট ফায়ার ডিপার্টমেন্ট ডেট্রয়েট স্বাস্থ্য বিভাগ নির্বাচন পরিকল্পনা ও উন্নয়ন বিভাগ পানি ও নর্দমা ব্যবস্থা বিভাগ পার্ক এবং বিনোদন পুলিশ বিভাগ পেনশন বিভাগ পৌর পার্কিং বিভাগ মানব সম্পদ বিভাগ মিডিয়া সার্ভিস বিভাগ যুব সেবা সাধারণ পরিষেবা বিভাগ হোমল্যান্ড সিকিউরিটি অ্যান্ড ইমারজেন্সি ম্যানেজমেন্ট, ডেট্রয়েট সরকার BACK অডিটর জেনারেল অফিস কমিশন নগর পরিষদ ন্যায়পাল বোর্ড মহাপরিদর্শক অফিস মেয়রের কার্যালয় সিটি ক্লার্ক আদমশুমারি BACK আদমশুমারি কি? কেন আদমশুমারির বিষয়টি গুরুত্বপূর্ণ তুমি কিভাবে সাহায্য করতে পার আদমশুমারি সম্পদ আমি কিভাবে করবো BACK অনুদানের তথ্য পান অনুরোধ নথি আবেদন কিছু সন্ধান করুন ক্রয় চাকরীর জন্য সন্ধান করুন বা আবেদন করুন জরিমানা, বিল বা কর প্রদান করুন তথ্য অনুসন্ধান কর নিবন্ধন নিবন্ধন করুন পরিষেবা বা সহায়তার জন্য অনুরোধ করুন পারমিট বা শংসাপত্রের জন্য বা পুনর্নবীকরণের জন্য আবেদন করুন যুব প্রোগ্রামগুলি সন্ধান করুন লাইসেন্সের জন্য আবেদন করুন বা নবায়ন করুন শহরের সাথে ব্যবসা করুন সমস্যা রিপোর্ট করুন স্বেচ্ছাসেবক বাস চাকরি পে পানি ঘটনাবলী খবর নির্দেশিকা কাগজপত্র ফরম নীড়পাতা পুলিশ বিভাগ Detroit Police Department Shield Program প্রোগ্রাম এবং সেবা DPD SHIELD প্রোগ্রামটি বিভিন্ন শ্রোতাদের আলিঙ্গন করার জন্য ডিজাইন করা হয়েছে যেমন নিরাপত্তা পরিচালক, নিরাপত্তা ব্যবস্থাপক, সম্প্রদায়ের নেতা, ব্যবসায়িক নির্বাহী, ব্যবসার মালিক, শিক্ষাবিদ, বিশ্বাস-ভিত্তিক সম্প্রদায় এবং অন্যান্য যাদের নিজ নিজ কর্মীদের নিরাপত্তা নিশ্চিত করার দায়িত্ব রয়েছে। ব্যবসা বা প্রতিষ্ঠান। একটি সফল প্রোগ্রামের চাবিকাঠি এবং সেইসাথে আমাদের সম্প্রদায়গুলিকে সুরক্ষিত করা হল তথ্যের পারস্পরিক প্রবাহকে উত্সাহিত করা। DPD SHIELD প্রোগ্রাম তার অংশীদারদের অবগত এবং স্থিতিস্থাপক রাখতে গুরুত্বপূর্ণ সংস্থান এবং প্রশিক্ষণ প্রদান করে। ব্যক্তিগত অংশীদার সম্পদ ব্যক্তিগত অংশীদারদের জন্য সম্পদ পি বিশ্বাস-ভিত্তিক অংশীদার সম্পদ বিশ্বাস-ভিত্তিক অংশীদারদের জন্য সম্পদ সম্প্রদায় অংশীদার সম্পদ সম্প্রদায় অংশীদারদের জন্য সম্পদ CRASE প্রশিক্ষণের জন্য নিবন্ধন করুন CRASE প্রশিক্ষণের জন্য নিবন্ধন করুন সন্দেহজনক কার্যকলাপ রিপোর্ট সন্দেহজনক কার্যকলাপ রিপোর্ট পরিচিতি Detroit Shield Program (313) 596-2250 Detroit Public Safety Headquarters - 1301 3rd Street Detroit, MI 48226 Detroit Police Shield Detroit Police Shield Detroit Police Shield ডিপার্টমেন্ট মেনু ভিডিও কাগজপত্র ফরম প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী DPD Shield CRASE PLAYING https://www.youtube.com/watch?v=OMAZQKFR4CQ DPD Shield CRASE PLAYING https://www.youtube.com/watch?v=4NJ4N6JXRMQ DHS 8 Signs PLAYING https://www.youtube.com/watch?v=j0It68YxLQQ&t=56s Alert ডেট্রয়েট পুলিশ শিল্ড FAQs নিউজলেটার সদস্যতা কপিরাইট 2001 - 2022 সিটি অফ ডেট্রয়েট দ্বারা সিটি অফ ডেট্রয়েটের ওয়েব সাইট সম্পর্কে তথ্যের জন্য, ওয়েব সম্পাদককে ইমেল করুন। সমস্ত উপাদান ডেট্রয়েট শহরের সম্পত্তি এবং শুধুমাত্র অনুমতির সাথে ব্যবহার করা যেতে পারে। গোপনীয়তা নীতি / দাবিত্যাগ আমাদের অনুসরণ করো টুইটার ফেসবুক ইউটিউব লিঙ্কডইন-ইন ইনস্টাগ্রাম ডেটা ডেট্রয়েট ডেট্রয়েটের ওপেন ডেটা পোর্টাল " -999,https://www.newarknj.gov/news/mayor-barak-and-public-safety-director-ambrose-release-details-on-stepped-up-police-presence-for-new-years-eve,Media Bulletins,Agency-Published Resources,News: Mayor Baraka and Public Safety Director Ambrose Release Details on Stepped up Police Presence for New Year's Eve,"Official Page of Newark, NJ News: Mayor Baraka and Public Safety Director Ambrose Release Details on Stepped up Police Presence for New Year's Eve",200,City of Newark,"[""City of"", ""NEWARK"", ""January 2, 2017"", ""Mayor Baraka and Public Safety Director Ambrose Release Details on Stepped up Police Presence for New Year's Eve"", ""City of"", ""NEWARK""]","[""News"", ""Mayor Ras j baraka""]",[],[],[],[],"City of NEWARK DEPARTMENTS Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities News Events Forms mayor City Mayor Council Members Contact Knowledge Contact us City of NEWARK DEPARTMENTS Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities News Events Forms mayor City Mayor Council Members Contact Knowledge Contact us City of NEWARK DEPARTMENTS Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities DEPARTMENTS DEPARTMENTS Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities mayor City Mayor Council Members mayor mayor Contact Knowledge Contact us Contact Contact News News News News " -1000,https://www.huntsvilleal.gov/city-calendar-event/deadline-apply-58th-session-huntsville-police-academy/,Training & Hiring Info,Info About Officers,Deadline to Apply for 58th Session of Huntsville Police Academy - City of Huntsville,"",200,403 Forbidden,"[""Deadline to Apply for 58th Session of Huntsville Police Academy""]","[""Event Details:"", ""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]","[""Huntsville Police Academy""]",[],[],[],"Main Menu Main Menu Residents Back Residents Animal Services Neighborhoods Public Safety Volunteer Cemeteries Pay a Ticket Streets & Transportation Water & Sewer Garbage & Recycling Parks & Recreation Resident Toolkit Business Back Business About Huntsville Big Picture GIS Maps & Data Employment Bid A Project Codes & Ordinances Economic Development File A Claim E-Bids Pay Taxes Licensing & Permits Development Back Development Bid A Project Economic Development MPO Streets & Roadwork Building & Construction GIS Maps Planning Water & Sewer Big Picture Master Plan Historic Preservation ePlans Submittal Environment Back Environment Air Quality Garbage & Recycling Noise Sustainability Find A Park Nature Preserves Recreation Water Trails & Greenways Pets Lost & Found Green Team Government Back Government Boards & Commissions City Council Finances & Budget Media Center City Calendar Departments Mayor's Office Municipal Court Vote Find A Job Codes & Ordinances Services Toggle Menu City of Huntsville Search Search for: Government City Calendar Deadline to Apply for 58th Session of Huntsville Police Academy This event has passed. Event Details: Date October 2, 2017 Time 5:00 pm Categories City News , Police Department To apply or for more information: https://www.huntsvilleal.gov/residents/public-safety/huntsville-police/join-police-force/join-police-force/ Add to calendar Google Calendar iCalendar Outlook 365 Outlook Live Huntsville Police Academy 5365 Triana Blvd. SW Huntsville , AL 35805 United States + Google Map Phone: 256-746-4409 « Bid Opening – MidCity Open Space Improvements, Project No. 71-17-SP46 Art in the Preserve » Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Toggle Menu Search Search Search for: Search for: Search for: Search for: Search for: Search for: Government City Calendar Deadline to Apply for 58th Session of Huntsville Police Academy This event has passed. Event Details: Date October 2, 2017 Time 5:00 pm Categories City News , Police Department To apply or for more information: https://www.huntsvilleal.gov/residents/public-safety/huntsville-police/join-police-force/join-police-force/ Add to calendar Google Calendar iCalendar Outlook 365 Outlook Live Huntsville Police Academy 5365 Triana Blvd. SW Huntsville , AL 35805 United States + Google Map Phone: 256-746-4409 « Bid Opening – MidCity Open Space Improvements, Project No. 71-17-SP46 Art in the Preserve » Government City Calendar Deadline to Apply for 58th Session of Huntsville Police Academy This event has passed. Event Details: Date October 2, 2017 Time 5:00 pm Categories City News , Police Department To apply or for more information: https://www.huntsvilleal.gov/residents/public-safety/huntsville-police/join-police-force/join-police-force/ Add to calendar Google Calendar iCalendar Outlook 365 Outlook Live Huntsville Police Academy 5365 Triana Blvd. SW Huntsville , AL 35805 United States + Google Map Phone: 256-746-4409 « Bid Opening – MidCity Open Space Improvements, Project No. 71-17-SP46 Art in the Preserve » " -1001,https://champaignil.gov/2022/05/19/police-department-hosts-employee-awards-ceremony/,Not Criminal Justice Related,Not Criminal Justice Related,Police Department Hosts Employee Awards Ceremony - City of Champaign,"",200,403 Forbidden,"[""Police Department Hosts Employee Awards Ceremony""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Police Department Hosts Employee Awards Ceremony Search Posted on May 19, 2022 On May 18, 2022, the Champaign Police Department held their annual Police Employee Awards Ceremony. Award recipients for 2021 include: Officer of the Year: Officer Douglas Wendt Employee of the Year: Kyle Hayden, Police Services Representative Life Saving Award: Officer Jeff Thomas, Officer Anderson Agudelo, and Officer Jordan Wooten Distinguished Leadership Award: Sgt. Dennis Baltzell and Sgt. John Lieb Medal of Valor: Officer Jonathan Kristensen and Officer Phil McDonald Commendation Awards: Officer Brad Atkinson, Officer Tim Atteberry, Officer Corey Barnes, Officer Caleb Billingsley, Officer Doug Bluhm, Officer Jherion Broadnax, Officer Jeremy Canales, Officer Richard Carroll, Detective Jody Cherry, Officer Tyler Darling, Sergeant Kaitlin Fisher, Mr. G. David Frye, Officer Danielle Griffet, Officer Austin Hamblin, Officer Molly Hedrick, Detective James Hobson, Officer Dillon Holloway, Officer Erik Kaldahl, Officer Jonathan Kristensen, Officer Kyle Langenderfer, Officer Clinton Lebeau, Sergeant John Lieb, Lieutenant Greg Manzana, Officer Phil McDonald, Detective Art Miller, Sergeant David Monahan, Lieutenant Ben Newell, Officer Kevin Pesavento, Officer Jeff Pickett, Sergeant Justin Prosser, Officer Kyle Reilly, Officer Adam Repp, Detective Tim Rivest, Sergeant Ed Sebestik, Officer Matt Silver, Officer Jonathan Tatum, K-9 Officer Tina Trock & K9 Lando, Detective Steve Vogel, Officer Mason Voges, Officer Devon Watkins, UIPD Investigator Jim Scheel, Lauren Schweizer, UIPD Investigator Ryan Snow, Michael Talbott, Special Agent Trevor Waite, Jim Warren Click here to see photos and learn more about this year’s Police Employee Award Winners Categories: Police Department News Tags: Hayden , Police Awards , Police Department , Wendt Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy Powered by Translate City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign " -1002,https://www.antiochca.gov/police/animal-services/animal-services-faqs/,Poor Data Source,Poor Data Source,"Animal Services FAQs – City of Antioch, California","",200,"City of Antioch, California",[],"[""Animal Services"", ""Related Links"", ""Contact Info""]","[""Animal Services FAQs""]","[""Send Message""]","[""Brian Addington"", ""Acting Chief of Police"", ""Catriona Cottle"", ""Acting Animal Services Manager""]",[],"" -1003,http://police.portlandmaine.gov/449/contact-us,Contact Info & Agency Meta,Info About Agencies,"Contact Us | Portland, ME - Official Website","Discover contact information for the Parks, Recreation, and Facilities Department.",200,"Portland, ME - Official Website | Official Website","[""Contact Us""]",[],[],[],[],[],"Skip to Main Content Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities About Us Contact Us Contact Us Applications, Registrations & Policies Contact Us Employment Featured Donation Opportunities Join Our Newsletters Love Portland Gift Catalog Make a Donation Meet the Team Government Websites by CivicPlus® Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities About Us Contact Us Contact Us Applications, Registrations & Policies Contact Us Employment Featured Donation Opportunities Join Our Newsletters Love Portland Gift Catalog Make a Donation Meet the Team Government Websites by CivicPlus® Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities About Us Contact Us Contact Us Applications, Registrations & Policies Contact Us Employment Featured Donation Opportunities Join Our Newsletters Love Portland Gift Catalog Make a Donation Meet the Team Government Websites by CivicPlus® Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities About Us Contact Us Contact Us Applications, Registrations & Policies Contact Us Employment Featured Donation Opportunities Join Our Newsletters Love Portland Gift Catalog Make a Donation Meet the Team Government Websites by CivicPlus® Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities About Us Contact Us Contact Us Applications, Registrations & Policies Contact Us Employment Featured Donation Opportunities Join Our Newsletters Love Portland Gift Catalog Make a Donation Meet the Team Home Your Government Departments Parks, Recreation & Facilities About Us Contact Us Contact Us Applications, Registrations & Policies Contact Us Employment Featured Donation Opportunities Join Our Newsletters Love Portland Gift Catalog Make a Donation Meet the Team Home Your Government Departments Parks, Recreation & Facilities About Us Contact Us Contact Us Applications, Registrations & Policies Contact Us Employment Featured Donation Opportunities Join Our Newsletters Love Portland Gift Catalog Make a Donation Meet the Team Home Your Government Departments Parks, Recreation & Facilities About Us Contact Us Contact Us Home Your Government Departments Parks, Recreation & Facilities About Us Contact Us Contact Us Home Your Government Departments Parks, Recreation & Facilities About Us Contact Us Contact Us Contact Us Applications, Registrations & Policies Contact Us Employment Featured Donation Opportunities Join Our Newsletters Love Portland Gift Catalog Make a Donation Meet the Team Applications, Registrations & Policies Contact Us Employment Featured Donation Opportunities Join Our Newsletters Love Portland Gift Catalog Make a Donation Meet the Team Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® " -1004,https://hollister.ca.gov/government/city-departments/police/comments/,Contact Info & Agency Meta,Info About Agencies,"Comments – City of Hollister, California","",200,"City of Hollister, California",[],[],"[""Follow Us on..."", ""Hollister Police Comments / Feedback"", ""We are Hiring"", ""Follow Us on....""]","[""Commendations / Complaints""]",[],[],"" -1005,https://delcopa.gov/employment/jobpostings/clerktypist2_childrenservices.html,Not Criminal Justice Related,Not Criminal Justice Related,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -1006,https://newtownohio.gov/police/department-news/,Media Bulletins,Agency-Published Resources,"Department News - Newtown, Ohio","",200,403 Forbidden,"[""Newtown, Ohio"", ""Police Department News""]",[],"[""Police Department""]",[],[],[],"MENU MENU Police Department Contact Us The Village of Newtown, Ohio MENU MENU MENU MENU Home Events 5k Run & Walk Submit an Event Mayor & Council Mayor’s Welcome Council Members Upcoming Meetings Council Minutes Newtown News Ordinances Mayor’s Court Departments Administration Police Employment/ Active Job Announcements Fire Dept Finance/Income Tax Building & Zoning Property Management Mayor’s Court Public Works Streets & Maintenance Utilities Trash & Recycling Leaf Tree & Branch Pick-up Community American Indian Education Center Civic Organizations Parks & Rec Moundview House Flag Spring Cemetery Little Miami Scenic Trail/Bike Trail Churches & Schools Neighborhoods CRA Program Businesses Local Business Directory Anderson Township Chamber of Commerce Business Development Police Department Contact Us Alerts Employment/ Active Job Announcements Services Vacation Check Emergency Business Contact Form Special Needs Awareness Community Training Crime Prevention Submit a Tip Annual Reports Mayor’s Court Recruiting Department News Ordinances Request Police Report Compliments or Complaints FIREWORKS - New State Law (Effective 7/1/2022) - fireworks remains ILLEGAL under local ordinance Administrative - 513.561.7097 Call first to drop off Building and Zoning Info. Police Department News Content Needed MENU MENU Police Department Contact Us The Village of Newtown, Ohio MENU MENU MENU MENU Home Events 5k Run & Walk Submit an Event Mayor & Council Mayor’s Welcome Council Members Upcoming Meetings Council Minutes Newtown News Ordinances Mayor’s Court Departments Administration Police Employment/ Active Job Announcements Fire Dept Finance/Income Tax Building & Zoning Property Management Mayor’s Court Public Works Streets & Maintenance Utilities Trash & Recycling Leaf Tree & Branch Pick-up Community American Indian Education Center Civic Organizations Parks & Rec Moundview House Flag Spring Cemetery Little Miami Scenic Trail/Bike Trail Churches & Schools Neighborhoods CRA Program Businesses Local Business Directory Anderson Township Chamber of Commerce Business Development MENU MENU Police Department Contact Us MENU MENU Police Department Contact Us MENU MENU Police Department Contact Us MENU MENU Police Department Contact Us MENU MENU Police Department Contact Us MENU MENU Police Department Contact Us MENU MENU Police Department Contact Us MENU MENU MENU MENU MENU MENU The Village of Newtown, Ohio MENU MENU MENU MENU Home Events 5k Run & Walk Submit an Event Mayor & Council Mayor’s Welcome Council Members Upcoming Meetings Council Minutes Newtown News Ordinances Mayor’s Court Departments Administration Police Employment/ Active Job Announcements Fire Dept Finance/Income Tax Building & Zoning Property Management Mayor’s Court Public Works Streets & Maintenance Utilities Trash & Recycling Leaf Tree & Branch Pick-up Community American Indian Education Center Civic Organizations Parks & Rec Moundview House Flag Spring Cemetery Little Miami Scenic Trail/Bike Trail Churches & Schools Neighborhoods CRA Program Businesses Local Business Directory Anderson Township Chamber of Commerce Business Development " -1007,https://www.stpaul.gov/departments/police/projects,Not Criminal Justice Related,Not Criminal Justice Related,Projects | Saint Paul Minnesota,Overview The following items highlight special programs that are of interest to the community. Blueprint for Safety Juvenile Drug Testing Parent Educationa,200,Home | Saint Paul Minnesota,"[""Projects""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Overview"", ""IL3CP concentration on curfew and community"", ""Footer""]","[""You are using an unsupported browser. Please use Microsoft Edge."", ""Contact The City"", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[],"" -1008,https://www.coppelltx.gov/faq.aspx?qid=396,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Do I need to register for an account if I don’t pay m,"",200,"Coppell, TX | Official Website",[],"[""▼ Citizen Self Service Utility Payment Portal""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -1009,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/062121blotter.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -1010,https://www.southamptontownnypolice.gov/1696/2022-wqip---applications-proposal-summar,Not Criminal Justice Related,Not Criminal Justice Related,"2022 WQIP - Applications & Proposal Summaries | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""2022 WQIP - Applications & Proposal Summaries""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]","[""Old Town Pond Watershed Bioswales (SH Village)"", ""Phillips Pond Watershed Bioswales (SH Village)"", ""Wickapogue Pond Watershed Bioswales (SH Village)"", ""Lake Agawam Stormwater - Trustees"", ""Armin and Judy"", ""Calissa Restaurant"", ""Peconic Land Trust Bridge Gardens"", ""Quogue Wildlife Refuge Constructed Wetland"", ""Riverside Sewer System"", ""Sag Harbor - Sewer Expansion (Sewersheds K & L)"", ""Harbour House (Library Avenue Owners Corp.)"", ""Lake Agawam Algae Harvesting Phase - (SH Village)"", ""Mecox Bay Inlet - Trustees"", ""Old Town Pond Dredging (SH Village)"", ""Sagaponack Pond Aquatic Habitat Restoration - Trustees"", ""Emma Elliston Park - Rain Gardens (SH Town)"", ""Lake Agawam- Injection Well PRB (SH Village)"", ""Poxabogue Pond-Groundwater Seepage and Nutrient Input"", ""West Main Street Bioswale (SH Village)""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Community Preservation Fund (CPF) WQIPP - Plan/Checklist/App 2022 WQIP - Applications & Proposal Summaries 2022 WQIP - Applications & Proposal Summaries 9 1 1 1 Old Town Pond Watershed Bioswales (SH Village) Link to page Phillips Pond Watershed Bioswales (SH Village) Link to page Wickapogue Pond Watershed Bioswales (SH Village) Link to page Lake Agawam Stormwater - Trustees Link to page Armin and Judy Link to page Calissa Restaurant Link to page Peconic Land Trust Bridge Gardens Link to page Quogue Wildlife Refuge Constructed Wetland Link to page Riverside Sewer System Link to page Sag Harbor - Sewer Expansion (Sewersheds K & L) Link to page Harbour House (Library Avenue Owners Corp.) Link to page Lake Agawam Algae Harvesting Phase - (SH Village) Link to page Mecox Bay Inlet - Trustees Link to page Old Town Pond Dredging (SH Village) Link to page Sagaponack Pond Aquatic Habitat Restoration - Trustees Link to page Emma Elliston Park - Rain Gardens (SH Town) Link to page Lake Agawam- Injection Well PRB (SH Village) Link to page Poxabogue Pond-Groundwater Seepage and Nutrient Input Link to page West Main Street Bioswale (SH Village) Link to page Old Town Pond Watershed Bioswales (SH Village) Phillips Pond Watershed Bioswales (SH Village) Wickapogue Pond Watershed Bioswales (SH Village) Lake Agawam Stormwater - Trustees Armin and Judy Calissa Restaurant Peconic Land Trust Bridge Gardens Quogue Wildlife Refuge Constructed Wetland Riverside Sewer System Sag Harbor - Sewer Expansion (Sewersheds K & L) Harbour House (Library Avenue Owners Corp.) Lake Agawam Algae Harvesting Phase - (SH Village) Mecox Bay Inlet - Trustees Old Town Pond Dredging (SH Village) Sagaponack Pond Aquatic Habitat Restoration - Trustees Emma Elliston Park - Rain Gardens (SH Town) Lake Agawam- Injection Well PRB (SH Village) Poxabogue Pond-Groundwater Seepage and Nutrient Input West Main Street Bioswale (SH Village) Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -1011,https://www.mass.gov/doc/municipal-police-training-committee-mptc-meeting-minutes-042022/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -1012,https://delcopa.gov/publicrelations/releases/2019/mumps.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Provides Update on Recent Outbreak of Mumps - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Provides Update on Recent Outbreak of Mumps""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Senior Medial Advisor urges residents to get vaccinated""]",[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County Provides Update on Recent Outbreak of Mumps Home / Departments / Public Relations Releases / Delaware County Provides Update on Recent Outbreak of Mumps Senior Medial Advisor urges residents to get vaccinated Delaware County's Senior Medical Advisor, Dr. George Avetian provided the community with an update on the mumps outbreak and recommendation on vaccinations. The CDC reports that from January 1 to September 13, 2019, 47 states and the District of Columbia reported mumps infections in 2,363 people. Mumps outbreaks can still occur in communities of people who previously had one or two doses of MMR vaccine. This is particularly common in close-contact settings. “High vaccination coverage helps limit the size, duration, and spread of mumps outbreaks,” said Dr. George Avetian, Delaware County's Senior Medical Advisor. “Mumps vaccine is the best way to protect children against mumps.” The vaccine is usually given as part of a combination vaccine that protects against three diseases: measles, mumps, and rubella. This vaccine is only licensed for use in children who are 12 months through 12 years of age. Children should get two doses of MMR vaccine: The first dose at 12 through 15 months of age. The second dose at 4 through 6 years of age. Anyone born during or after 1957 who has never had mumps or has never been vaccinated is at risk for mumps. It’s recommended that those born during or after 1957 get at least one dose of the MMR vaccine. More information on mumps can be found here: https://www.cdc.gov/mumps/index.html Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County Provides Update on Recent Outbreak of Mumps Home / Departments / Public Relations Releases / Delaware County Provides Update on Recent Outbreak of Mumps " -1013,https://port-orange.us/2014/11/18/vehicle-break-ins-rise-port-orange-police-warn-residents/,Media Bulletins,Agency-Published Resources,"","",-1,"","","","","","","","" -1014,https://delcopa.gov/courts/judges/capuzzi.html,Poor Data Source,Poor Data Source,"Judge John P. Capuzzi, Sr - Delaware County Court of Common Pleas","",200,"Delaware County, Pennsylvania","[""Judge John P. Capuzzi, Sr""]",[],"[""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[],"Menu A to Z Court Departments Local Rules FAQ Government Center Judge John P. Capuzzi, Sr Home / Court Departments / Board of Judges / Judge John P. Capuzzi, Sr Rules and Pretrial Order Trial date Order in PDF Judge John P. Capuzzi, Sr. was sworn in January 3, 2012 to a ten-year term on the Delaware County Court of Common Pleas. Judge Capuzzi earned a BA and MBA at LaSalle University. He obtained his Juris Doctor from the Delaware Law School of Widener University in 1988. Judge Capuzzi is admitted before the Supreme Court of the United States, the Pennsylvania Supreme Court, and the Federal Court for the Eastern District of Pennsylvania. Judge Capuzzi is a Life Member and Past President of Yeadon Fire Company No. 1. He served as President of Yeadon Borough Council from 1982 through 1989 and as the First Ward Commissioner for Marple Township from 2000 through 2005. Judge Capuzzi has served as President of the Guy G. de Furia American Inn of Court. In 2012, Judge Capuzzi was presented with the Guy G. de Furia Award in recognition of his outstanding legal ability, professionalism and high ethical standards. From 1988 through 2005, Judge Capuzzi served as a Deputy Attorney General in the Torts Litigation Section of the Pennsylvania Office of Attorney General. During that time, he litigated major, complex cases for various state agencies. Starting in 2006, Judge Capuzzi served as the Magisterial District Judge for Marple Township and Haverford Township. From 2006 to 2011, he was a partner in the law firm of Imperatrice, Amarant, Capuzzi & Bell, P.C. As a practicing attorney, Judge Capuzzi was AV rated (highest legal ability and ethical standards) in Martindale Hubbell. Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 delcocourts@co.delaware.pa.us Courts Quick Links Juror eResponse PA Law Help Self Help - Custody Self Help - Divorce Juror Handbook Language Access Family Court Self Represented Litigant Guide Government Center Quick Links Marriage Licenses Crisis Connection Certified Recovery Specialist Public Access Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Judge John P. Capuzzi, Sr Home / Court Departments / Board of Judges / Judge John P. Capuzzi, Sr Judge John P. Capuzzi, Sr Home / Court Departments / Board of Judges / Judge John P. Capuzzi, Sr Judge John P. Capuzzi, Sr Home / Court Departments / Board of Judges / Judge John P. Capuzzi, Sr " -1015,https://www.mass.gov/doc/monteiro-lencol-v-boston-police-department-101614/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -1016,http://www.lafayettepolice.us/321/landlordowner-information,Not Criminal Justice Related,Not Criminal Justice Related,"Owner Information | Lafayette, IN - Official Website",The Housing Authority pays the landlord directly each month on behalf of the participant. ,200,"Police Department | Lafayette, IN - Official Website","[""Owner Information""]","[""Michelle Reynolds""]","[""Contact Us"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home Government Departments H - W Housing Authority Landlord/Owner Information Owner Information Rent Payments & Increases The Housing Authority pays the landlord directly each month on behalf of the participant. The owner retains private property rights and responsibilities including screening tenants and evictions. Reasonable rent increases are allowed in accordance with Housing and Urban Development (HUD) regulations and rent reasonableness guidelines. Property Qualifications All types of rental housing may qualify for the program. The units must be located in the Cities of Lafayette or West Lafayette or within a five-mile radius of the city limits. Landlord Requirements A participating landlord is to provide a decent, safe and sanitary unit to tenants that meet the rent criteria established by HUD. The landlord is expected to provide the services agreed to as part of the lease with the participant. The unit must pass the standards adopted by the Housing Authority and maintain the unit up to those standards as long as the owner receives housing assistance payments. The unit must be safe from lead-based paint hazards. Housing Choice Voucher landlord information can be found here . Contact Us “The Lafayette Housing Authority administers federal housing assistance for families with very low-income, people who are elderly and people with disabilities in Lafayette, West Lafayette and the five-mile radius surrounding the cities.” -- Michelle Reynolds, Executive Director, Lafayette Housing Authority Michelle Reynolds Executive Director Lafayette Housing Authority 2601 Greenbush St. Lafayette, Indiana 47904 (765) 771-1300 Phone: 765-771-1300 Fax: 765-771-1313 HUD About LHA Mission Goals & Objectives Portals Board of Commissioners Housing Information and Application Housing Choice Voucher Program Wait List Eligibility Participant Responsibilities Family Briefing Income Limits Portability Portals Report Change New Job Lost Job Change In Pay Or Hours Local Preference Change Veteran Assistance HUD-VASH Veteran Affairs Supportive Housing Report Fraud Landlord/Owner Information Federal Grant Administration HOME & CDBG FAQs Applicant Landlord Participant Lead Hazards Fair Housing Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -1017,https://delcopa.gov/electionsbureau/absenteevoting.html,Not Criminal Justice Related,Not Criminal Justice Related,Untitled Document,"",200,"Delaware County, Pennsylvania",[],[],[],[],[],[],"" -1018,https://coloradosprings.gov/police-department/article/news/traffic-fatality-s-chelton-road-and,Media Bulletins,Agency-Published Resources,Traffic Fatality S. Chelton Road and Zebulon Drive | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Traffic Fatality S. Chelton Road and Zebulon Drive""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -1019,https://strafford.nh.gov/event/police-chief-search-committee-3/,Training & Hiring Info,Info About Officers,Police Chief Search Committee | Town of Strafford NH,"",200,"Town of Strafford NH | Strafford, NH 03815","[""Police Chief Search Committee""]","[""November 22, 2022 @ 5:30 pm"", ""Details""]","[""STRAFFORD NH MAP"", ""STRAFFORD TOWN HALL""]",[],[],[],"Search for: Follow Follow Search for: Home About Bow Lake Strafford Boards & Commissions Board of Selectmen Cell Tower Conservation Commission Master Plan - Subcommittees Planning Board Zoning Board of Adjustment Town Offices Appointed & Elected Town Report & Meeting Minutes Community Services Strafford Fire Department Emergency 911 Bow Lake Station (603)664-6863 Strafford Police Department Emergency 911 Dispatch (603) 664-5644 Business Line (603) 664-7462 Community Links Hill Library Recycling Center Strafford Fire, Rescue & Burn Permits Strafford Police Department Strafford Post Office Strafford Schools Strafford School Board Departments Administrator/Board of Selectmen Building Inspectors E-911 Administration Emergency Management Health Officer Human Services Notary Services Planning & Zoning Office Property Assessor’s Office Town Offices Directory & Hours Tax Collector Town Clerk Hours: Monday & Wednesday 8:30am - 2:00pm Tuesday & Thursday 1:30pm - 7:00pm I WANT TO…… « All Events This event has passed. Police Chief Search Committee November 22, 2022 @ 5:30 pm « Zoning Board of Adjustment Meeting Town Hall Closed In Observance of Thanksgiving Day » Add to calendar Google Calendar iCalendar Outlook 365 Outlook Live Details Date: November 22, 2022 Time: 5:30 pm « Zoning Board of Adjustment Meeting Town Hall Closed In Observance of Thanksgiving Day » STRAFFORD NH MAP (Click to view pdf) Follow Follow STRAFFORD TOWN HALL 12 Mountain View Drive Strafford, NH 03884 Mailing Address: PO Box 23 Ctr. Strafford, NH 03815 Phone: 603-664-2192 Fax: 603-664-7276 E-Mail: townclerk@strafford.nh.gov © 2024 All Rights Reserved | Town of Strafford NH | Website developed and hosted by CharlesWorks " -1020,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/050321blotter.pdf,Daily Activity Logs,Info About Officers,"","",404,"","","","","","","","" -1021,https://delcopa.gov/controller/pdf/retirement/2018/0523retirementboardminutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1022,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/060421blotter.pdf,Dispatch Recordings,Police & Public Interactions,"","",404,"","","","","","","","" -1023,https://www.knoxvilletn.gov/government/mayors_office/c_o_v_i_d-19___coronavirus_/stress_and_coping/knox_well/general_adult_resources/kid___parent_resources,Not Criminal Justice Related,Not Criminal Justice Related,Kid & Parent Resources - City of Knoxville,nothing*,200,Just a moment...,"[""Kid & Parent Resources""]",[],[],[],[],[],Skip navigation {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## -1024,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/060521summary.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -1025,https://southcoffeyvilleok.gov/police-department/city-hall-south-coffeyville/,Not Criminal Justice Related,Not Criminal Justice Related,City Hall South Coffeyville Oklahoma -,"",200,403 Forbidden,[],"[""City Hall South Coffeyville Oklahoma""]","[""Contact Town of South Coffeyville"", """"]",[],[],[],"Town Alert ***************Boil Water Alert************* click here for more information Town Alert ***************Boil Water Alert************* click here for more information Town Alert ***************Boil Water Alert************* click here for more information Town Alert ***************Boil Water Alert************* click here for more information 2017 Water Report Town News Town Calendar Town Directory Town Help Desk Town Jobs Council Agendas & Minutes South Coffeyville Public Schools OK Union Public Schools OK Helpline BILL PAY Pay Utilities Pay Citations Pay Property Taxes Popular Resources My Town News Town History Project Government Town Council Town Clerk Court Clerk Deputy Treasurer Agendas & Minutes Ordinances Voting Public Meetings Town Utilities City Court Maintenance Dept. Police Department Fire Department Animal Control Permits & Licenses Business Business Directory Community Data Permits Relocate Here South Town Center Contact Town HOME Popular Resources Town Government Town Utilities Maintenance Dept. Police Department City Court Business News Town Help Desk Contact Town City Hall South Coffeyville Oklahoma Contact Town of South Coffeyville PO Box 100 419 Willow Street South Coffeyville, OK 74072 City Hall: (918) 255-6045 Fax: (918) 255-6430 Directions to City Hall Town Directory Economic Development Pay Utility Bill FEMA Disaster Assistance Section 508 Accessibility Privacy Policy Legal Disclaimer 2017 Water Report Town News Town Calendar Town Directory Town Help Desk Town Jobs Council Agendas & Minutes South Coffeyville Public Schools OK Union Public Schools OK Helpline BILL PAY Pay Utilities Pay Citations Pay Property Taxes Popular Resources My Town News Town History Project Government Town Council Town Clerk Court Clerk Deputy Treasurer Agendas & Minutes Ordinances Voting Public Meetings Town Utilities City Court Maintenance Dept. Police Department Fire Department Animal Control Permits & Licenses Business Business Directory Community Data Permits Relocate Here South Town Center Contact Town 2017 Water Report Town News Town Calendar Town Directory Town Help Desk Town Jobs Council Agendas & Minutes South Coffeyville Public Schools OK Union Public Schools OK Helpline BILL PAY Pay Utilities Pay Citations Pay Property Taxes Popular Resources My Town News Town History Project Government Town Council Town Clerk Court Clerk Deputy Treasurer Agendas & Minutes Ordinances Voting Public Meetings Town Utilities City Court Maintenance Dept. Police Department Fire Department Animal Control Permits & Licenses Business Business Directory Community Data Permits Relocate Here South Town Center Contact Town 2017 Water Report Town News Town Calendar Town Directory Town Help Desk Town Jobs Council Agendas & Minutes South Coffeyville Public Schools OK Union Public Schools OK Helpline BILL PAY Pay Utilities Pay Citations Pay Property Taxes Popular Resources My Town News Town History Project Government Town Council Town Clerk Court Clerk Deputy Treasurer Agendas & Minutes Ordinances Voting Public Meetings Town Utilities City Court Maintenance Dept. Police Department Fire Department Animal Control Permits & Licenses Business Business Directory Community Data Permits Relocate Here South Town Center Contact Town 2017 Water Report Town News Town Calendar Town Directory Town Help Desk Town Jobs Council Agendas & Minutes South Coffeyville Public Schools OK Union Public Schools OK Helpline " -1026,https://champaignil.gov/2017/12/22/police-investigate-shooting-2400-block-n-neil-street/,Media Bulletins,Agency-Published Resources,Police Investigate Shooting - 2400 Block of N. Neil Street - City of Champaign,"",200,403 Forbidden,"[""Police Investigate Shooting – 2400 Block of N. Neil Street""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Police Investigate Shooting – 2400 Block of N. Neil Street Search Posted on December 22, 2017 Last night, at approximately 6:09 PM, Champaign Police responded to the 2400 Block of N. Neil St., for a reported shooting. Upon arrival to the scene, police located a 35-year-old male suffering from multiple gunshot wounds.  The shooting victim was immediately transported to an area hospital, where he is receiving medical treatment, with serious injuries. Police identified multiple shell casings at the scene of the incident and preliminary investigations suggests that more than one shooter may have been involved in an exchange of gunfire. The investigation reveals that structural damage to nearby properties also occurred as a result of the shooting. Champaign Police are processing evidence from the scene and interviewing potential witnesses.  Anyone with information regarding the shooting is urged to contact the Champaign Police Investigations Division by calling 217-351-4545. Anonymous tips may also be submitted to Crime Stoppers by phone at: (217) 373-8477 (TIPS); online at www.373tips.com ; or the “P3 Tips” mobile app. Champaign Police reminds citizens that information submitted to Crime Stoppers is completely anonymous.  Calls are routed to a third-party national call center that receives your information, completes a tips information form, and then passes the information to the appropriate law enforcement agency. Caller ID tracking is not utilized by Crime Stoppers and conversations are not recorded. Crime Stoppers will pay a reward of up to $1,000 for information leading to an arrest. Categories: Police Department Press Releases Tags: Champaign County Crime Stoppers , Police Investigate Shooting - 2400 Block of N. Neil Street Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign " -1027,http://police.portlandmaine.gov/279/general-assistance-reports,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1028,https://sheriff.berkeleycountysc.gov/community/citizen-police-academy/,Training & Hiring Info,Info About Officers,Citizen Police Academy – Berkeley County Sheriff's Office,"",200,Berkeley County Sheriff's Office,[],"[""Citizen Police Academy""]",[],[],[],[],Berkeley County South Carolina Sheriff's Office EN English French Spanish Arabic CONTACT US (843) 719‑4465 EMERGENCY Call 911 FILE AN INCIDENT REPORT Vacation Request Community Prevention Crime Prevention Financial Protection Home and Property Safety Personal Safety Protecting Against Sexual Assault Suicide Prevention Trailer Theft Prevention Citizen Police Academy Young People Police Explorers Sheriff’s “Summer Camps” Neighborhood Watch Program Special Services Information Animal Control Detention Center Homeland Security Office Internal Affairs Records Management Office Sex Offender Registry Additional Links Request Extra Duty Security Nonferrous Metal Permits Oversize Load Traffic Escorts Parade / Assembly Application Patrol Request Report Commendations Citizen Complaint Give us a Tip File an Incident Report/ Report a Crime School Zone Traffic Violations Report About Annual Report Location and Phone numbers Mission and Goals Who’s Who Districts / Divisions Apply Patrol Deputies detention center deputies Citizen Connect MENU Community ► Prevention ► Crime Prevention Financial Protection Home and Property Safety Personal Safety Protecting Against Sexual Assault Suicide Prevention Trailer Theft Prevention Citizen Police Academy Young People ► Police Explorers Sheriff’s “Summer Camps” Neighborhood Watch Program Special Services Information ► Animal Control Detention Center Homeland Security Office Internal Affairs Records Management Office Sex Offender Registry Additional Links Request ► Extra Duty Security Nonferrous Metal Permits Oversize Load Traffic Escorts Parade / Assembly Application Patrol Request Report ► Commendations Citizen Complaint Give us a Tip File an Incident Report/ Report a Crime School Zone Traffic Violations Report About ► Annual Report Location and Phone numbers Mission and Goals Who’s Who Districts / Divisions Apply ► Patrol Deputies detention center deputies Citizen Connect Berkeley County South Carolina Sheriff's Office EN English French Spanish Arabic Berkeley County South Carolina Sheriff's Office EN English French Spanish Arabic Berkeley County South Carolina Sheriff's Office EN English French Spanish Arabic Berkeley County South Carolina Sheriff's Office EN English French Spanish Arabic Berkeley County South Carolina Sheriff's Office EN English French Spanish Arabic EN English French Spanish Arabic -1029,https://www.sandiego.gov/department-document/copy-sublease-3,Not Criminal Justice Related,Not Criminal Justice Related,"","",404,"","","","","","","","" -1030,https://www.hayward-ca.gov/discover/news/apr21/police-blotter-april-4-10-2021-0,Crime Maps & Reports,Agency-Published Resources,"Police Blotter: April 4-10, 2021 | City of Hayward - Official website","STATISTICAL HIGHLIGHTSApril 4-10, 2021 Weekly Arrests (Includes cite/released):61 Homicide 0Weekly Calls for Service: 2,064 Assault—Great Bodily Injury 3Weekly Reports Taken:224 Burglary— Nonresidential 1Weekly Complaints(against HPD):0 Burglary—Residential 1Weekly Calls Received:6,023 Theft 26This data is subject to change and based on crimes that were reported to have",200,City of Hayward - Official website,"[""Police Blotter: April 4-10, 2021""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form"", ""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment""]",[],"[""STATISTICAL HIGHLIGHTS"", ""April 4-10, 2021"", """", """", """", ""Significant Incidents"", ""Do you need help paying energy bills? You may qualify for federal aid."", ""Hayward Receives Grant for Safe Routes to Schools Infrastructure and Bicycle Incentives"", ""Hayward Celebrates Earth Day at Weekes Park!"", ""Spring 2024 Compost Giveaway"", ""Sustainable Solutions for Celebrating Easter"", ""City Hall and Nonessential Services Closure: Monday, Apr. 01, 2024"", ""Presidential Primary Election: Tuesday, Mar. 5, 2024"", ""Library Closure: February 12 and February 19, 2024."", ""City Hall and Nonessential Services Closures: Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""YOU ARE HERE. SO IS EVERYTHING ELSE."", ""Related News"", ""Police Blotter - February 25-March 2, 2024"", ""Weekly Blotter - February 18-24, 2024"", ""Police Blotter - February 11-17, 2024"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],Skip to main content -1031,https://ose.louisiana.gov/event/police-communications-officer-57/,Poor Data Source,Poor Data Source,Police Communications Officer | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Police Communications Officer""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Police Communications Officer Competitive Level Posting Period 08/09/2022 - 09/01/22 Application Deadline 09/01/22 Jurisdiction Natchitoches Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Police Communications Officer Competitive Level Posting Period 08/09/2022 - 09/01/22 Application Deadline 09/01/22 Jurisdiction Natchitoches Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Communications Officer Competitive Level Posting Period 08/09/2022 - 09/01/22 Application Deadline 09/01/22 Jurisdiction Natchitoches Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Communications Officer Competitive Level Posting Period 08/09/2022 - 09/01/22 Application Deadline 09/01/22 Jurisdiction Natchitoches Application This event has passed. Police Communications Officer Competitive Level Posting Period 08/09/2022 - 09/01/22 Application Deadline 09/01/22 Jurisdiction Natchitoches Application This event has passed. Police Communications Officer Competitive Level Posting Period 08/09/2022 - 09/01/22 Application Deadline 09/01/22 Jurisdiction Natchitoches Application This event has passed. Police Communications Officer Competitive Level Competitive Level Competitive Level Posting Period 08/09/2022 - 09/01/22 Application Deadline 09/01/22 Jurisdiction Natchitoches Posting Period 08/09/2022 - 09/01/22 Application Deadline 09/01/22 Jurisdiction Natchitoches Posting Period 08/09/2022 - 09/01/22 Application Deadline 09/01/22 Jurisdiction Natchitoches Posting Period 08/09/2022 - 09/01/22 Posting Period Application Deadline 09/01/22 Application Deadline Jurisdiction Natchitoches Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -1032,https://www.southamptontownnypolice.gov/466/emergency-notifications,Not Criminal Justice Related,Not Criminal Justice Related,"Emergency Notifications Systems | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Emergency Notifications Systems""]","[""Facebook & Twitter"", ""Southampton Town Emergency Management""]","[""Site Tools"", ""Contact Us"", ""Ryan Murphy"", ""Code Enforcement"", ""Hours:"", ""Emergency Management Team"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Community Info Emergency Preparedness Emergency Notifications Emergency Notifications Systems Suffolk County SMART911 1 2 3 4 Facebook & Twitter The Town’s Citizens’ Response Center (CRC) can now provide “followers” and “friends” with real-time updates about emergencies and important announcements. These update notices will include public service announcements, notifications about road closures, extreme traffic situations, as well as other information of importance to citizens. Contact Us Southampton Town Emergency Management Ryan Murphy Public Safety Emergency Management Administrator Code Enforcement Ph: 631-702-1700 Fx: 631-283-2694 Hours: Monday-Friday 8:30 am – 4:00 pm Emergency Management Team Ph: 631-728-3400 27 Ponquogue Avenue. Hampton Bays, NY 11946 Suffolk County Emergency Notification Notify Me® Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Community Info Emergency Preparedness Emergency Notifications Emergency Notifications Systems Suffolk County SMART911 1 2 3 4 Facebook & Twitter The Town’s Citizens’ Response Center (CRC) can now provide “followers” and “friends” with real-time updates about emergencies and important announcements. These update notices will include public service announcements, notifications about road closures, extreme traffic situations, as well as other information of importance to citizens. Contact Us Southampton Town Emergency Management Ryan Murphy Public Safety Emergency Management Administrator Code Enforcement Ph: 631-702-1700 Fx: 631-283-2694 Hours: Monday-Friday 8:30 am – 4:00 pm Emergency Management Team Ph: 631-728-3400 27 Ponquogue Avenue. Hampton Bays, NY 11946 Suffolk County Emergency Notification Notify Me® Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -1033,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-34-2000-holiday-bonus-pay,Media Bulletins,Agency-Published Resources,State Police Bulletin No. SP-34 | Office of the New York State Comptroller,To provide agency procedures for processing the payment,200,Office of the New York State Comptroller | Thomas P. DiNapoli,"[""State Police Bulletin No. SP-34"", """"]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Effective Date"", ""Background"", ""Payment Amount and Eligibility Criteria"", ""Processing Instructions"", ""Additional Taxes"", ""Payroll Register and Employee's Check Stub"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[],"" -1034,http://www.longbeach.gov/police/press-releases/dui-enforcement-operation-1-/,Media Bulletins,Agency-Published Resources,DUI ENFORCEMENT OPERATION(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1035,https://pharr-tx.gov/individual-arrested-by-pharr-police-dies-at-hospital/,Media Bulletins,Agency-Published Resources,Individual arrested by Pharr police dies at hospital – City of Pharr,"",200,403 Forbidden,"[""Individual arrested by Pharr police dies at hospital""]","["""", ""Individual arrested by Pharr police dies at hospital""]",[],[],[],[],"" -1036,http://www.longbeach.gov/police/press-releases/fireworks-seized/,Media Bulletins,Agency-Published Resources,FIREWORKS SEIZED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/24/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: FIREWORKS SEIZED Contact: Media Relations Detail (562) 570-5273 (Click on photo to enlarge) On June 22, 2014, Directed Enforcement officers from the North Division began working an investigation into the sale of illegal fireworks, which resulted in the confiscation of a large quantity of fireworks. Officers located an online advertisement regarding illegal fireworks that were available for sale in the Long Beach area. Their investigation led them to the City of Compton, where a male adult suspect was located and fireworks were found in his possession. A subsequent search of the suspect's residence turned up a cache of fireworks, which totaled 454 pounds of assorted high caliber pyrotechnics, with a street value of over $5,000. The suspect, identified as 30-year old Derek Quinata of Compton, was cited and will be required to appear in court. All fireworks, including those marked as ""Safe and Sane"" are illegal in the City of Long Beach. Anyone cited or arrested for fireworks violations may be faced with a $1,000 fine, sentenced to six months in jail, or both. The fines and penalties may increase depending on the fireworks’ classification. Fireworks may be voluntarily disposed of at collection bins located at Lifeguard Headquarters, 2100 E. Ocean Boulevard (on the West side of the Junipero lot), and at all police stations. If you 'See Something, Say Something!’ Call Long Beach Police Dispatch at (562) 435-6711 or 9-1-1 if an immediate police response is necessary. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1037,https://www.minneapolismn.gov/government/programs-initiatives/police-explorers/police-explorer-form/,Resources,Agency-Published Resources,Police Explorer Form - City of Minneapolis,You can complete this form to tell us you are interested in becoming an Explorer. ,200,City of Minneapolis,"[""Police Explorer form"", ""Need help? We're here for you.""]","[""A snow emergency is not currently in effect. Normal parking rules apply."", ""What to do"", ""Police Explorer Form"", ""Contact us""]","[""Request accessible format"", ""Police Explorer Advisors""]",[],[],[],"" -1038,https://www.antiochca.gov/police/child-safety-programs-events/,Misc Police Activity,Police & Public Interactions,"Child Safety – City of Antioch, California","",200,"City of Antioch, California",[],"[""Contact Info""]","[""Child Safety Programs and Events""]","[""Send Message""]","[""Brian Addington"", ""Acting Chief of Police"", ""Captain Morefield"", ""Field Services"", ""Lt. Mellone"", ""Professional Standards""]",[],"" -1040,https://www.lynchburgvapolice.gov/news-updates/crime-of-the-week-may-18-2021/,Media Bulletins,Agency-Published Resources,"Crime of the Week - May 18, 2021 - Lynchburg Police Department","",200,403 Forbidden,"[""Crime of the Week – May 18, 2021""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[],"" -1041,https://champaignil.gov/2015/04/21/2014-police-department-employee-awards/,Misc Police Activity,Police & Public Interactions,2014 Police Department Employee Awards - City of Champaign,"",200,403 Forbidden,"[""2014 Police Department Employee Awards""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs 2014 Police Department Employee Awards Search Posted on April 21, 2015 A message from the Chief… The role that each of our employees play on behalf of the Champaign Police Department, as committed representatives of our community, is not a simple one, yet each day they show up for the challenge.  I am proud to say that we are made up of a great group of men and women who showcase a great demonstration of service, trust, integrity, and results.  I’d like to take this time to especially recognize the members of our team that have been peer-nominated as demonstrating exceptional work performance.  A huge thank you and congratulations goes out to these following individuals for their diligence, stewardship, and positive impacts on our organizational and community success. Respectfully, Chief Cobb OFFICER OF THE YEAR : Jerad Gale VOLUNTEER RECOGNITION: Jim Lang LEADERSHIP Tom Frost Nate Rath COMMENDATION AWARDS Chris Aikman Dave Allen Jim Clark Andre Davis Patrick Funkhouser Jordan Hagemann Marshall Henry Patrick Kelly Brad Krauel Art Miller Robb Morris Kevin Olmstead Amy Petrilli Patrick Simons Heather Watson Teri Weems Robert Wills Categories: Police Department News Tags: 2014 CPD Employee Awards Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs " -1042,https://www.sandiego.gov/department-document/sdpd-investigate-attempted-murder-police-officer-jamacha-lolita,Media Bulletins,Agency-Published Resources,SDPD Investigate Attempted Murder Of Police Officer In Jamacha Lolita | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""SDPD Investigate Attempted Murder Of Police Officer In Jamacha Lolita"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -1043,https://southamptontownnypolice.gov/faq.aspx?qid=257,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Can I board my dog or cat at the shelter?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Public Safety - Animal Shelter""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1044,https://www.hayward-ca.gov/discover/news/may21/police-blotter-may-16-22-2021,Crime Maps & Reports,Agency-Published Resources,"Police Blotter: May 16-22, 2021 | City of Hayward - Official website","STATISTICAL HIGHLIGHTSMay 16 - 22, 2021 Weekly Arrests (Includes cite/released):45 Homicide 0Weekly Calls for Service: 1,960 Assault—Great Bodily Injury 0Weekly Reports Taken:204 Burglary— Nonresidential 4Weekly Complaints(against HPD):0 Burglary—Residential 2Weekly Calls Received:5,418 Theft 29This data is subject to change and based on crimes that were reported to have",200,City of Hayward - Official website,"[""Police Blotter: May 16-22, 2021""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form"", ""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment""]",[],"[""STATISTICAL HIGHLIGHTS"", ""May 16 - 22, 2021"", """", """", """", ""Significant Incidents"", ""Do you need help paying energy bills? You may qualify for federal aid."", ""Hayward Receives Grant for Safe Routes to Schools Infrastructure and Bicycle Incentives"", ""Hayward Celebrates Earth Day at Weekes Park!"", ""Spring 2024 Compost Giveaway"", ""Sustainable Solutions for Celebrating Easter"", ""City Hall and Nonessential Services Closure: Monday, Apr. 01, 2024"", ""Presidential Primary Election: Tuesday, Mar. 5, 2024"", ""Library Closure: February 12 and February 19, 2024."", ""City Hall and Nonessential Services Closures: Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""YOU ARE HERE. SO IS EVERYTHING ELSE."", ""Related News"", ""Police Blotter - February 25-March 2, 2024"", ""Weekly Blotter - February 18-24, 2024"", ""Police Blotter - February 11-17, 2024"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],Skip to main content -1045,https://www.lakewoodoh.gov/coffee-with-a-cop-set-for-friday-october-26th/,Misc Police Activity,Police & Public Interactions,"Coffee with a Cop set for Friday, October 26th | The City of Lakewood, Ohio","The Lakewood Police Department will host another ""Coffee With A Cop"" event on Friday, October 26, 2018 from 8:00 a.m. to 10:00 a.m. at Dunkin Donuts, 17609",200,"The City of Lakewood, Ohio","[""Coffee with a Cop set for Friday, October 26th""]",[],"[""Recent News"", ""Upcoming Events"", ""Most Popular Pages""]",[],[],[],"Search for: Search Facebook Twitter YouTube Instagram News Minutes/Agendas A-Z Index Contact City Hall FAQs Apply / Register Apply For A Job Autism Safety Roster Block Party Permits Boards / commissions Building Permits Contractor registration Donation Box Permit Do-Not-Knock Registry Food Trucks Housing Assistance Housing Assistance Housing License Landlord Training Seminar Pavilion Rentals Solicitor’s License Summer Sprinkling Prg Vendors Payments / Taxes Pay your water bill Pay your EMS bill Pay Your Parking Ticket Taxes Calendar City Council Court Departments Boards/commissions Community Development Early Childhood Family & Youth Services Finance Fire Department Housing & Building Human Resources Human Services Law Mayor’s Office Municipal Income Tax Planning & Development Police Department Purchasing Division Public Works Engineering Parks Refuse & Recycling Streets & Forestry Water & Wastewater Collection Wastewater Treatment Senior Services Vital Statistics Report A Problem Coffee with a Cop set for Friday, October 26th October 12, 2018 The Lakewood Police Department will host another “Coffee With A Cop” event on Friday, October 26, 2018  from 8:00 a.m. to 10:00 a.m. at Dunkin Donuts, 17609 Detroit Avenue. Join members of the department for coffee and conversation.  There will be no agenda or speeches — just a chance to ask questions and to get to know your neighborhood officers. The participating officers won’t provide coffee, but they will have some tokens to give away to those who stop by. This will hopefully help to strengthen the relationship between residents and the police, and also help a business out in the process. The Lakewood Police Department’s “Coffee With A Cop” event is part of a national movement.  For more information, please visit coffeewithacop.com . Recent News No Refuse & Recycling Collection on Monday, April 1st March 22, 2024 Lakewood Tax Office To Offer Extended Hours March 18, 2024 H2O Summer Service Camp Registration Begins Tuesday, March 19th March 15, 2024 Upcoming Events Monday Drop-In March 25, 2024 Housing, Planning & Development Committee Meeting March 25, 2024 Toddler Tuesday March 26, 2024 Most Popular Pages Heritage Home Loan Prgm Eclipse Infomation E-Newsletter Sign-Up Safe Place Initiative Lakewood Life Newsletter Downtown Development Frequently Asked Questions Lkwd Park Waterfront Feasibility Study Interceptor Tunnel Rehabilitation Project Birth/Death Certificates Minutes/Agendas Public Record Requests Clean Water Lakewood Pavilion Rentals Public Art Accountability & Sound Governance Lakewood City Hall: 12650 Detroit Ave. Lakewood, OH 44107 (216) 521-7580 Hours: 8:00 AM to 4:30 PM Read Website Policy>> Receive Lakewood City News & Updates Email * Example: Yes, I would like to receive emails from The City of Lakewood, Ohio. (You can unsubscribe anytime) Constant Contact Use. By submitting this form, you are consenting to receive marketing emails from: The City of Lakewood Ohio, 12650 Detroit Avenue, Lakewood, OH, 44107, https://lakewoodoh.gov. You can revoke your consent to receive emails at any time by using the SafeUnsubscribe® link, found at the bottom of every email. Emails are serviced by Constant Contact Read Disclosure » Facebook Twitter YouTube Instagram " -1046,https://rexburg.us/police-ask-for-help-finding-woman-who-went-missing-tuesday-in-juab-county/,Media Bulletins,Agency-Published Resources,"","",522,"","","","","","","","" -1048,https://www.minneapolismn.gov/government/departments/police/precincts/precinct-4/,Contact Info & Agency Meta,Info About Agencies,Precinct 4 - City of Minneapolis,The 4th precinct is headquarters for Patrol Officers and Precinct Investigations. The precinct also has a Community Response team and Community Crime Prevention unit.,200,City of Minneapolis,"[""4th Precinct"", ""Need help? We're here for you.""]","[""A snow emergency is not currently in effect. Normal parking rules apply."", ""4th Precinct"", ""Access to police services"", ""Contact us""]","[""4th Precinct""]",[],[],[],"" -1049,https://sanfordfl.gov/government/police/,Contact Info & Agency Meta,Info About Agencies,"Police | Sanford, FL","It is the mission of the Sanford Police Department to enhance the quality of life in our city by working in partnership with the community, to enforce the laws, preserve the peace, reduce fear, and provide a safe environment.",200,"Home | Sanford, FL","[""Police""]","[""Accreditation""]","[""Message from the Chief""]","[""Connect With Us"", ""Most Requested"", ""Explore"", ""Stay Connected"", ""City of Sanford, FL | The Friendly City""]",[],[],Close Clear cookies Table of contents. ✖ Dark/light scheme Vision Impaired Profile Vision Impaired Profile description Cognitive Disability Profile Keyboard navigation Underline all links on this page Monochrome Enable monochrome view. Fonts settings Readable Font Color adjustment settings Background Colors Title Colors Text Colors Link Colors Letter spacing Enable letter spacing mode. Enable line height mode. Underline links Underline all links on this page Highlight Links Highlight all links on this page Images Greyscale Greyscale images on this page Large mouse cursor Enable large cursor mode. Close Close Clear cookies Table of contents. ✖ Dark/light scheme Vision Impaired Profile Vision Impaired Profile description Cognitive Disability Profile Keyboard navigation Underline all links on this page Monochrome Enable monochrome view. Fonts settings Readable Font Color adjustment settings Background Colors Title Colors Text Colors Link Colors Letter spacing Enable letter spacing mode. Enable line height mode. Underline links Underline all links on this page Highlight Links Highlight all links on this page Images Greyscale Greyscale images on this page Large mouse cursor Enable large cursor mode. Close Table of contents. Table of contents. ✖ ✖ Dark/light scheme Dark/light scheme Vision Impaired Profile Vision Impaired Profile description Cognitive Disability Profile Keyboard navigation Underline all links on this page Monochrome Enable monochrome view. Vision Impaired Profile Vision Impaired Profile description Vision Impaired Profile Vision Impaired Profile description Cognitive Disability Profile Cognitive Disability Profile Keyboard navigation Underline all links on this page Keyboard navigation Underline all links on this page Monochrome Enable monochrome view. Monochrome Enable monochrome view. Fonts settings Readable Font Fonts settings Readable Font Fonts settings Readable Font Fonts settings Color adjustment settings Color adjustment settings Background Colors Title Colors Text Colors Link Colors Background Colors Background Colors Background Colors Title Colors Title Colors Title Colors Text Colors Text Colors Text Colors Link Colors Link Colors Link Colors Letter spacing Enable letter spacing mode. Enable line height mode. Letter spacing Enable letter spacing mode. Letter spacing Enable letter spacing mode. Enable line height mode. Enable line height mode. Underline links Underline all links on this page Highlight Links Highlight all links on this page Images Greyscale Greyscale images on this page Large mouse cursor Enable large cursor mode. Underline links Underline all links on this page Underline links Underline all links on this page Highlight Links Highlight all links on this page Highlight Links Highlight all links on this page Images Greyscale Greyscale images on this page Images Greyscale Greyscale images on this page Large mouse cursor Enable large cursor mode. Large mouse cursor Enable large cursor mode. -1050,https://columbiacitypolice.us/documents/firearm responsibility.pdf,Resources,Agency-Published Resources,"","",200,"","","","","","","","" -1051,https://santabarbaraca.gov/press-releases/magical-winter-wonderland-experience-deserving-families-hosted-santa-barbara-police,Not Criminal Justice Related,Not Criminal Justice Related,Magical Winter Wonderland Experience for Deserving Families hosted by the Santa Barbara Police Activities League | City of Santa Barbara,"The Santa Barbara Police Department and the Santa Barbara Police Activities League (PAL) would like to formally invite all members of the media to attend the 21st annual Winter Wonderland Event on Thursday, December 15, 2021. The event will be held between 6:00-8:00pm at the Carousel House located on Cabrillo Blvd.",200,City of Santa Barbara,"[""Magical Winter Wonderland Experience for Deserving Families hosted by the Santa Barbara Police Activities League""]","[""Learn about Cookies"", ""[#IABV2_TITLE#]"", ""Breadcrumb"", ""Contact"", ""This is the prefooter section"", ""Main Footer"", ""City Hall"", ""Mailing Address"", ""Newsletters""]",[],[],[],[],"" -1052,https://www.burienwa.gov/residents/public_safety/police/lead_program,Resources,Agency-Published Resources,LEAD Program - City of Burien,"",200,Just a moment...,"[""City of Burien""]","[""Apply For"", ""Contact"", ""Locate"", ""Report"", ""Watch"", ""Schedule"", ""Volunteer"", ""Submit Public Comment"", ""Request"", ""LEAD Program""]",[],[],[],[],"" -1053,https://chandlerazpd.gov/2019/11/vehicle-burglary-crew-arrested-after-fleeing-from-police/,Media Bulletins,Agency-Published Resources,Vehicle Burglary Crew Arrested After Fleeing From Police – Chandler Police Department,"",200,Chandler Police Department,"[""Vehicle Burglary Crew Arrested After Fleeing From Police""]",[],"[""Quick Links"", ""News Archives"", """", """", """", """"]","[""November 12, 2019"", ""Contact"", ""About the Department"", ""Latest News"", ""Courage, Pride, Dedication © 2024 Chandler Police Department""]",[],[],"The Chandler Police Department main lobby will be closed for renovations. Please see below for further. The Chandler Police Department main lobby will be closed for renovations. Please see below for further. Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Home Highlight Vehicle Burglary Crew Arrested After Fleeing From Police Home Highlight Vehicle Burglary Crew Arrested After Fleeing From Police Search for: Vehicle Burglary Crew Arrested After Fleeing From Police November 12, 2019 By Detective Seth Tyler On November 12, 2019 around 2:00 am police were dispatched to the 4900 block of West Buffalo Street regarding multiple subjects burglarizing vehicles.  Officers arrived in the area and located the suspect vehicle, occupied by four males, leaving the area.  A traffic stop was attempted but the vehicle failed to stop traveling eastbound on Chandler Boulevard at a high rate of speed.  A short time later the suspect vehicle crashed near Price Road and Chandler Boulevard and all four occupants abandoned the vehicle. Chad Colyer After an extensive search the four suspects were taken into custody, one of whom was bitten by a K-9.  The suspect vehicle, a 2008 Ford F150, was stolen out of the City of Phoenix.  The suspects were identified as Desmond Cruz Ortiz Jr (20), Jorge Hernandez (18), Chad Granado Colyer (18), and a juvenile male. Desmond Ortiz, Jr. Ortiz Jr, Hernandez, and Colyer were all booked into the 4 th Avenue Jail on various felony charges including 3 rd Degree Burglary, Unlawful Use of Means of Transportation, Unlawful Flight from Law Enforcement, and Hindering Prosecution.  The juvenile male was released to the custody of his parents and will have charges filed at a later date. Jorge Hernandez Search for: Quick Links About the Department Office of the Chief Interim Chief Of Police Melissa Deanda Assistant Chief Of Police Dave Ramer Department Events My Precinct Fingerprinting Services Request a Police Report Bicycle Registration General Orders/Accreditation Alarm Information Registered Sex Offenders Citizen Observer (Ride-Along) Vehicle Impounds Barking Dog Police Open Data Public Demonstration Guidelines News Archives August 2022 September 2021 July 2021 September 2020 August 2020 June 2020 May 2020 April 2020 March 2020 February 2020 January 2020 December 2019 " -1054,https://www.southamptontownnypolice.gov/182/teen-assessment-project,Resources,Agency-Published Resources,"Teen Assessment Project | Southampton, NY - Official Website","The Teen Assessment Project (TAP) survey asks lifestyle questions of students in grades 8, 10, and 12.",200,"Police | Southampton, NY - Official Website","[""Teen Assessment Project""]",[],"[""Site Tools"", ""Contact Us"", """", ""Contact Us"", ""Site Links"", ""Loading""]","[""TAP Reports""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Housing and Community Services Youth Bureau Teen Assessment Project Teen Assessment Project Southampton Youth Bureau, with the cooperation of local school districts, conducted the Teen Assessment Project (TAP) survey, asking lifestyle questions of students in grades 8, 10, and 12. The resulting database supplies insight into the students’ lives, behaviors, and how to effectively support their healthy development. Below view the final report (PDF) of this survey. TAP Reports TAP Survey 2020 Report TAP Survey 2018 Report TAP Survey 2015 Report TAP Survey 2012 Report Contact Us DAVID W. CROHAN COMMUNITY CENTER (Lower Level) 655 Flanders Rd, Flanders, NY 11901 Ph: 631-702-2425 Tracy Kolsin, LCSW Youth Services Coordinator Staff Directory Join Our Mailing List Annual Reports Programs & Services Broader Horizons Community Collaborations DUNE (Drug Use Never Empowers) East End Partnership for Youth Riverhead CAP Coalition - SAFE in Sag Harbor Special Events Seasonal Programs Youth Board Youth Advisory Committee Youth Court Youth and Family Counseling and Support Youth & Government Register & Pay Online Refund Policy Resource Pages Bullying Resources Vaping and E-Cigarettes TEENS Vaping and E-Cigarette VIDEOS PARENTS - PARENTS - Vaping and E-cigarettes Parent Resources Teen Resources Community Service Guide Teen Assessment Project Youth Centers 2023 Creative Art Show Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -1055,https://alpha.austin.gov/police-oversight/2020-08-17-2/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1056,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0021/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1057,https://rockfordil.gov/calendars/category/police-department/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1058,https://delcopa.gov/council/2019minutes/121819minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1059,https://www.mass.gov/service-details/becoming-an-environmental-police-officer,Training & Hiring Info,Info About Officers,Becoming an Environmental Police Officer | Mass.gov,"Learn about the duties and requirements, including exams, for environmental police officers.",200,Mass.gov,"[""Becoming an Environmental Police Officer""]","[""Duties"", ""Entrance Requirements"", ""Help Us Improve Mass.gov with your feedback""]","[""Additional Resources""]",[],[],[],"" -1060,https://www.roundrocktexas.gov/wp-content/uploads/2021/12/recycling-wide-copy-1.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1061,https://www.huntsvilleal.gov/city-calendar-event/apply-to-be-a-huntsville-police-officer/,Training & Hiring Info,Info About Officers,Apply to be a Huntsville Police Officer - City of Huntsville,"",200,403 Forbidden,"[""Apply to be a Huntsville Police Officer""]","[""Event Details:"", ""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],[],[],[],"Main Menu Main Menu Residents Back Residents Animal Services Neighborhoods Public Safety Volunteer Cemeteries Pay a Ticket Streets & Transportation Water & Sewer Garbage & Recycling Parks & Recreation Resident Toolkit Business Back Business About Huntsville Big Picture GIS Maps & Data Employment Bid A Project Codes & Ordinances Economic Development File A Claim E-Bids Pay Taxes Licensing & Permits Development Back Development Bid A Project Economic Development MPO Streets & Roadwork Building & Construction GIS Maps Planning Water & Sewer Big Picture Master Plan Historic Preservation ePlans Submittal Environment Back Environment Air Quality Garbage & Recycling Noise Sustainability Find A Park Nature Preserves Recreation Water Trails & Greenways Pets Lost & Found Green Team Government Back Government Boards & Commissions City Council Finances & Budget Media Center City Calendar Departments Mayor's Office Municipal Court Vote Find A Job Codes & Ordinances Services Toggle Menu City of Huntsville Search Search for: Government City Calendar Apply to be a Huntsville Police Officer This event has passed. Event Details: Date June 1, 2018 - October 1, 2018 Time 12:00 am - 11:59 pm Categories City News , Police Department Organizer Huntsville Police Department Applications open now through October 1 to become a Huntsville Police Officer Apply now —> https://bit.ly/2su06Ec Add to calendar Google Calendar iCalendar Outlook 365 Outlook Live « Bid Opening – Periodic Bid for Asphalt Projects-2018, Project No. 71-18-SP44 The Wally Vess Youth Fishing Rodeo » Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Toggle Menu Search Search Search for: Search for: Search for: Search for: Search for: Search for: Government City Calendar Apply to be a Huntsville Police Officer This event has passed. Event Details: Date June 1, 2018 - October 1, 2018 Time 12:00 am - 11:59 pm Categories City News , Police Department Organizer Huntsville Police Department Applications open now through October 1 to become a Huntsville Police Officer Apply now —> https://bit.ly/2su06Ec Add to calendar Google Calendar iCalendar Outlook 365 Outlook Live « Bid Opening – Periodic Bid for Asphalt Projects-2018, Project No. 71-18-SP44 The Wally Vess Youth Fishing Rodeo » Government City Calendar Apply to be a Huntsville Police Officer This event has passed. Event Details: Date June 1, 2018 - October 1, 2018 Time 12:00 am - 11:59 pm Categories City News , Police Department Organizer Huntsville Police Department Applications open now through October 1 to become a Huntsville Police Officer Apply now —> https://bit.ly/2su06Ec Add to calendar Google Calendar iCalendar Outlook 365 Outlook Live « Bid Opening – Periodic Bid for Asphalt Projects-2018, Project No. 71-18-SP44 The Wally Vess Youth Fishing Rodeo » " -1062,https://coloradosprings.gov/police-department/page/cspd-salary-benefits,Resources,Agency-Published Resources,CSPD Salary & Benefits | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""CSPD Salary & Benefits""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]","[""Below is the monthly pay scale for each grade:""]",[],"[""REPORT ONLINE""]",[],"" -1063,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0680/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1064,https://www.mass.gov/doc/municipal-police-training-committee-mptc-meeting-minutes-62119/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1065,https://delcopa.gov/courts/pdf/emergencyjudicialorders/presidentjudgeadministrativeorderfamilysectionoperationalandschedulingprotocols.pdf,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -1066,https://alpha.austin.gov/es/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/bwc-dmav-data-analysis-methodology/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1067,https://www.goldenbeach.us/documents/reso-1550-03-authorizing-the-donation-of-an-obsolete-police-vehicle-light-bar/,Not Criminal Justice Related,Not Criminal Justice Related,RESO 1550.03 authorizing the donation of an obsolete police vehicle light bar – Golden Beach: A Town Unlike Any Other,"",200,Golden Beach: A Town Unlike Any Other – The Town of Golden Beach,[],[],"[""About Golden Beach"", ""Phone Numbers"", ""Town Hall""]","[""RESO 1550.03 authorizing the donation of an obsolete police vehicle light bar (45 kB)""]",[],[],Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide [hmapsprem id=1] Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide Menu -1068,https://www.doravillepolice.us/join-dpd/requirements/,Training & Hiring Info,Info About Officers,Requirements | Doraville,"",200,Doraville | Police Department,"[""Requirements"", ""Requirements""]",[],[],"[""REQUIREMENTS""]",[],[],"Follow Follow Follow Follow Chief’s Office Chief Atkinson Assistant Chief Harris Operations Division Captain Rodney Brinkley Operations Agency Certification Reserve Program Specialized Operations K-9 Unit SWAT Criminal Investigations Internal Affairs Special Investigation Crime Scene Investigations Anonymous Tip Most Common Scams U-Visa FAQs Identity Theft FAQ Support Services Division Captain Jason Deyette Georgia Criminal Histories 911 Communications Center Records Detention Center FAQ Animal Control Citizen Service Portal Open Records Join DPD Police Officer Communications Dispatcher Wages and Benefits Selection Process Community Outreach Citizen Service Portal Most Common Scams Out of town Permits Memorial Detective Shane Wilson Detective Hugo Arango Contact Open Menu Chief’s Office Chief Atkinson Assistant Chief Harris Operations Division Captain Rodney Brinkley Operations Agency Certification Reserve Program Specialized Operations K-9 Unit SWAT Criminal Investigations Internal Affairs Special Investigation Crime Scene Investigations Anonymous Tip Most Common Scams U-Visa FAQs Identity Theft FAQ Support Services Division Captain Jason Deyette Georgia Criminal Histories 911 Communications Center Records Detention Center FAQ Animal Control Citizen Service Portal Open Records Join DPD Police Officer Communications Dispatcher Wages and Benefits Selection Process Community Outreach Citizen Service Portal Most Common Scams Out of town Permits Memorial Detective Shane Wilson Detective Hugo Arango Contact Select Page Chief’s Office Chief Atkinson Assistant Chief Harris Operations Division Captain Rodney Brinkley Operations Agency Certification Reserve Program Specialized Operations K-9 Unit SWAT Criminal Investigations Internal Affairs Special Investigation Crime Scene Investigations Anonymous Tip Most Common Scams U-Visa FAQs Identity Theft FAQ Support Services Division Captain Jason Deyette Georgia Criminal Histories 911 Communications Center Records Detention Center FAQ Animal Control Citizen Service Portal Open Records Join DPD Police Officer Communications Dispatcher Wages and Benefits Selection Process Community Outreach Citizen Service Portal Most Common Scams Out of town Permits Memorial Detective Shane Wilson Detective Hugo Arango Contact Requirements Prior to becoming a police officer, a number of requirements must be met. These include a High School diploma and being over the age of 21. Requirements Prior to becoming a police officer, a number of requirements must be met. These include a High School diploma and being over the age of 21. REQUIREMENTS Must be a US Citizen (POST requirement) High School diploma (or GED equivalent) Must possess a valid Georgia Class C Driver’s License Must be 21 years of age No felony convictions during your lifetime No termination for cause from a local, state, or national civil service organization If certified, must maintain a valid POST Certification with required 20 hours of training No discharge from any military organization less than honorable The above requirements are not all-inclusive. Copyright © 2019 DoRaville Police Department | All rights reserved. | Site by Highersite Designed by Elegant Themes | Powered by WordPress " -1069,http://www.longbeach.gov/police/press-releases/arrest-made-in-2-murder-cases/,Media Bulletins,Agency-Published Resources,ARREST MADE IN 2 MURDER CASES,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/15/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: L.B.P.D. ARRESTS SUSPECT CONNECTED TO TWO MURDERS CASES Contact: Media Relations Detail (562) 570-5273 Related news release regarding murder in 600 block of East 9th Street Related news release regarding murder in 2300 block of Spaulding Street Today, Long Beach Police Homicide detectives presented two murder cases involving the same suspect to the Los Angeles County District Attorney’s Office for filing consideration. On November 1, 2016, at approximately 2:10 a.m., officers were dispatched to a shooting in the 600 block of 9th Street. Arriving officers found a victim, later identified as 18-year-old Manuel Arechiga of Long Beach, with a gunshot injury to his upper torso. Long Beach Fire Department personnel determined the victim deceased at the scene. On November 5, 2016, at approximately 9:55 p.m., officers were dispatched to the 2300 block of Spaulding Street regarding a shooting. Arriving officers located a victim, later identified as 26-year-old Elijah Brown of Long Beach, with a gunshot injury to the upper torso. Long Beach Fire Department personnel transported the victim to a local hospital where he was pronounced deceased. Through the course of the investigations, including the examination of evidence from both scenes and witness statements, detectives were able to identify the suspect. On November 11, 2016, Long Beach Police arrested 36-year-old Jorge Omar Chavez of Long Beach, at a residence in Long Beach. Today, the Los Angeles County District Attorney’s Office filed two counts of murder against Chavez for the murders of Manuel Arechiga and Elijah Brown with special circumstances. Chavez is being held without bail at the Long Beach City Jail. The investigations remain ongoing. Anyone with information regarding either incident is asked to contact the Long Beach Police Homicide Detail at (562) 570-7244. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1070,https://www.mass.gov/doc/robert-dececcopdf/download,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1071,https://delcopa.gov/recycle/paint.html,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -1072,https://www.pinevillenc.gov/government/departments/police/services/,Resources,Agency-Published Resources,"Services - Town of Pineville, NC","",200,403 Forbidden,"[""Services"", ""Police Services"", ""Town of Pineville Updates""]","[""Town of Pineville Police Services"", ""Overview"", ""Annual Reports"", ""Records"", ""Communications"", ""Criminal Investigations"", ""Patrol"", ""K9 Unit"", ""SRT"", ""Off-Duty Management"", ""Town of Pineville Contacts"", ""Important News & Updates"", ""Special Meeting Notice"", ""Early Voting in Pineville"", ""Advisory Board Openings for Pineville Residents"", ""Follow Pineville on Facebook""]","[""View or Download"", ""Stats at a Glance"", ""2023 Crime Comparison"", ""2023 Crime By Month"", ""2023 Crime Grids"", ""2023 Admin Stats"", ""2023 Allocated Personnel"", ""ADVISE THE TELECOMMUNICATOR IF ANY WEAPONS ARE INVOLVED"", ""K-9 Max"", ""K-9 Gator"", ""Deployments"", ""Training and Requirements"", ""Off Duty Management provides the following to the customer:"", ""Rates"", ""Vehicle Rate-no charge"", ""Restrictions"", ""Emergency: Police, Fire & Rescue"", ""Non-Emergency:"", ""Town Hall Mailing Address:"", ""Town Hall Physical Address:"", ""Town Hall Office Hours:""]","[""What to do when calling 9-1-1"", ""Specify the kind of Emergency"", ""Location of the Incident"", ""Phone Number"", ""People Information"", ""Additional Circumstances"", ""LISTEN"", ""Hearing Impaired"", ""Non-English Speaking Citizens"", ""Tenemos intérpretes a su disposición"", ""When to Call 9-1-1""]",[],[],"" -1073,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0800/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1074,https://www.coppelltx.gov/203/election-information,Not Criminal Justice Related,Not Criminal Justice Related,"Upcoming Election Information | Coppell, TX","Access information and resources regarding upcoming elections in Coppell, Texas.",200,"Coppell, TX | Official Website","[""Upcoming Election Information""]","[""Upcoming Election Information"", ""Saturday, May 4, 2024, Joint Election, 7 AM to 7 PM"", ""Voting Assistance for Special Needs""]","[""Important Dates:"", ""Future Elections"", ""Contact Us"", ""Quick Links"", ""Voter Resources"", ""Voter FAQs"", ""Loading""]","[""City Secretary's Office""]",[],[],Skip to Main Content -1075,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/october-14-activity-report/,Incident Reports,Police & Public Interactions,October 14 Activity Report - Town of Cheswold,"",200,"Home - Town of Cheswold - Kent County, Delaware","[""Cheswold""]","[""Delaware"", ""October 14 Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[],"Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Cheswold Delaware Listen October 14 Activity Report October 14 Activity Report Cheswold Delaware Listen October 14 Activity Report October 14 Activity Report Listen October 14 Activity Report October 14 Activity Report Listen October 14 Activity Report October 14 Activity Report Listen October 14 Activity Report October 14 Activity Report Listen Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form " -1076,http://www.longbeach.gov/police/press-releases/$10000-reward-issued-in-fatal-hit---run-investigation/,Media Bulletins,Agency-Published Resources,$10000 REWARD ISSUED IN FATAL HIT & RUN INVESTIGATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/14/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: $10000 REWARD ISSUED IN FATAL HIT & RUN INVESTIGATION Contact: Media Relations Detail (562) 570-5273 (Click on a photo to enlarge) The Los Angeles County Board of Supervisors, at the recommendation of Supervisor Don Knabe, has issued a $10,000 reward for information leading to the arrest and conviction of the person(s) responsible for the death of 20-year-old Daniel Gomez of Long Beach. The Long Beach Police Department is still looking for the public's help with information relating to the fatal hit and run collision that occurred on Saturday, September 13, 2014, on Spring Street near Studebaker Road at approximately 12:11 a.m., and is hopeful that the reward may encourage reluctant witnesses or individuals with information to come forward. Through their investigation, detectives were able to determine that the vehicle involved in the collision, a 2011-2014 silver metallic Honda Fit (stock photo depicted above), struck Daniel as he was attempting to cross Spring Street east of Studebaker Road. As a result of the collision, the vehicle may have sustained damage to the front driver's side consisting of dents to the front bumper and hood, a broken driver's side head lamp, a broken or missing driver's side mirror housing, and possibly a broken windshield. Anyone with information regarding the identity of the driver or who recognizes the vehicle description is urged to come forward and contact Long Beach Police Collision Investigation Detective Steve Fox at (562) 570-7355. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1077,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/031522summary.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1078,http://www.lafayettepolice.us/faq.aspx?qid=168,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Where should smoke detectors/alarms be located?,"",200,"Police Department | Lafayette, IN - Official Website",[],"[""▼ Smoke Alarms & Detectors""]","[""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home FAQs Search All categories Fire Department Fire Department - New Construction & Addition / Remodel Fire Extinguishers Fire Resistance Rated Construction General Historic Districts Historic Preservation Commission Lafayette Renew LHA - Applicants Open Burn Policy Parks & Recreation Parks & Recreation - McAllister Recreation Center Parks and Recreation - Aquatics Police Police Application Process Police Complaints Police DARE Police Employment FAQs Rain Gardens Sanitation Department Smoke Alarms & Detectors Solicitor/Transient Merchant License Street Department Water Quality, Watersheds & Stormwater Water Works Zoo Creature Comforts Categories All Categories Fire Department Fire Department - New Construction & Addition / Remodel Fire Extinguishers Fire Resistance Rated Construction General Historic Districts Historic Preservation Commission Lafayette Renew LHA - Applicants Open Burn Policy Parks & Recreation Parks & Recreation - McAllister Recreation Center Parks and Recreation - Aquatics Police Police Application Process Police Complaints Police DARE Police Employment FAQs Rain Gardens Sanitation Department Smoke Alarms & Detectors Solicitor/Transient Merchant License Street Department Water Quality, Watersheds & Stormwater Water Works Zoo Creature Comforts Where should smoke detectors/alarms be located? Because smoke rises, you should place alarms on the ceiling. If you cannot do this, place them high up on a wall according to manufacturer's instructions. Most importantly, read the installation instructions that come with the alarm. Location of Smoke Detectors ▼ Smoke Alarms & Detectors Show All Answers 1. What types of smoke alarms are there? There are two basic types of smoke alarms: ionization and photoelectric. Both are effective at detecting smoke, yet each has a unique detecting system. Types of Smoke Alarms [H 2. Where should smoke detectors/alarms be located? Because smoke rises, you should place alarms on the ceiling. If you cannot do this, place them high up on a wall according to manufacturer's instructions. Most importantly, read the installation instructions that come with the alarm. Location of Smoke Detectors 3. What should I do if I hear the smoke alarms sound? If the smoke alarm is sounding its alarm, there is a reason. You and your family must be able to escape quickly and safely. Smoke Alarms Sound Live Edit Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -1079,https://www.hayward-ca.gov/police-department/programs/hayward-eyes,Resources,Agency-Published Resources,Programs | City of Hayward - Official website,"",200,City of Hayward - Official website,"[""Active in the Community""]","[""Ambassador Program"", ""Business Watch Program"", ""Chabot College Partnership"", ""Community Academy"", ""Crime Free Multi-Housing Program"", ""False Alarm Reduction Program"", ""National Night Out"", ""Police Activities League (PAL)"", ""Neighborhood Alert Program"", ""Police Department Tours"", ""Reserve Officer Program"", ""Ride Along Program"", ""Stop Graffiti Rewards Program"", ""V.I.P.S. Program"", ""Youth Academy"", ""You are here. So is everything else."", ""Search form""]",[],"[""Receive crime bulletins and alerts"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],Skip to main content -1080,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/may-17-activity-report/,Daily Activity Logs,Info About Officers,May 17 Activity Report - Town of Cheswold,"",200,"Home - Town of Cheswold - Kent County, Delaware","[""Cheswold""]","[""Delaware"", ""May 17 Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[],"Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Cheswold Delaware Listen May 17 Activity Report May 17 Activity Report Cheswold Delaware Listen May 17 Activity Report May 17 Activity Report Listen May 17 Activity Report May 17 Activity Report Listen May 17 Activity Report May 17 Activity Report Listen May 17 Activity Report May 17 Activity Report Listen Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form " -1081,https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/bwc-dmav-data-analysis-additional-information/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1082,https://delcopa.gov/publicrelations/releases/2020/blooddrive.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Holds Community Blood Drive on May 5 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Holds Community Blood Drive on May 5""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Urgent need for blood and plasma donations during COVID-19 pandemic""]",[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County Holds Community Blood Drive on May 5 Home / Departments / Public Relations Releases / Delaware County Holds Community Blood Drive on May 5 Urgent need for blood and plasma donations during COVID-19 pandemic Delaware County will host a community blood drive on May 5 from 8:30am to 1:30pm at the Media Municipal Building (301 N. Jackson Street, Media PA.) The COVID-19 pandemic is having a devastating impact on the blood supply in the country. To assist the American Red Cross and our local hospitals, Delaware County Council is encouraging everyone who is willing and capable to donate blood. There are two main components of donated blood. There is a solid component of the blood which includes red blood cells, white blood cells and platelets, which help the blood clot. Plasma is the liquid component of blood, comprised of water, salt and protein and is critically needed since donations of plasma have declined during the COVID-19 pandemic. Plasma serves various functions. It can increase a patient’s blood volume and help with clotting. Plasma is used to treat various conditions including trauma, burns and hemophilia. Some people who have recovered from COVID-19 have antibodies in their plasma that can attack the coronavirus and they are being asked to donate plasma. The plasma is being studied and utilized as a treatment for patients who are seriously ill with COVID-19. The Food and Drug Administration has asked the American Red Cross to help identify prospective donors and manage the distribution of the plasma to hospitals treating patients in need. Delaware County is encouraging residents to donate blood to ensure the blood supply remains adequate and stable during this pandemic. The American Red Cross urgently needs blood and platelet donors to maintain a sufficient blood supply. Residents can sign up to donate blood during the Community Blood Drive on May 5. Donors must register and choose a time to donate. To sign-up, visit: www.redcrossblood.org and enter the sponsor code: Media. Donors can also call 1-800-RED CROSS to register. Recovered Covid-19 patients can learn more about plasma donation here: https://www.redcrossblood.org/donate-blood/dlp/plasma-donations-from-recovered-covid-19-patients.html Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play " -1083,http://www.ryepolice.us/wp-content/uploads/deterra-intro.jpg,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1084,https://www.mass.gov/doc/merging-of-police-officer-list-memorandum-to-police-appointing-authorities/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1085,http://www.longbeach.gov/police/press-releases/arrest-made-in-sexual-assault-case/,Media Bulletins,Agency-Published Resources,ARREST MADE IN SEXUAL ASSAULT CASE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/20/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: ARREST MADE IN SEXUAL ASSAULT CASE Contact: Media Relations Detail (562) 570-5273 Long Beach Police arrested a male suspect in connection with a sexual assault that occurred in January 2014, and charges have been filed. On January 14, 2014, at approximately 1:30 a.m., a male suspect kidnapped a 53-year-old mentally impaired female from a parking lot in the area of 15th Street and Long Beach Boulevard, and sexually assaulted her. On October 16, 2014, Sex Crimes Detectives received a tip regarding this incident and coordinated with Vice Detectives to further the investigation and locate the suspect. In the early morning hours of Friday, October 17, 2014, detectives arrested 32-year-old David Faavale Tautolo of Signal Hill, in the area of Warren and Anaheim Street, without incident. On October 20, 2014, Long Beach Police Sex Crimes Detectives presented this case to the Los Angeles District Attorney's Office for filing consideration. The District Attorney’s Office filed eight felony counts, which included: charges of sexual assaults, criminal threats, and kidnapping. Tautolo is currently being held in Long Beach City Jail on $4.5 million bail. Anyone with information regarding this crime is urged to contact Long Beach Police Sex Crimes Detective Jennifer Kearns at (562) 570-5514. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1086,https://www.roundrocktexas.gov/news/police-identify-victim-fatal-auto-pedestrian-crash-mays-street/,Media Bulletins,Agency-Published Resources,Police identify victim from fatal auto-pedestrian crash at Mays and Main streets - City of Round Rock,"",200,403 Forbidden,[],[],"[""Police identify victim from fatal auto-pedestrian crash at Mays and Main streets""]","[""Site Search"", ""Follow Us""]",[],[],"" -1087,http://www.longbeach.gov/police/press-releases/murder-26-/,Media Bulletins,Agency-Published Resources,MURDER(26),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/24/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On June 24, 2015, at approximately 1:13 a.m., Long Beach Police were dispatched to the 1100 block of E. 21st Street regarding a subject down in the alley. When officers arrived, they found the victim in the east/west alley between Orange Avenue and Lemon Avenue, north of 21st Street, who had been struck by gunfire in the upper torso. Long Beach Fire Department paramedics responded and determined the victim deceased at the scene. The preliminary investigation determined the calling party had heard gunshots around midnight, but did not call police until they found the female in the alley. The victim has been identified as 21-year-old Alicia Faith Todd of Signal Hill . No suspect information is available at this time, and a motive for the shooting is unknown. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detectives Teryl Hubert and Oscar Valenzuela at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1088,https://alpha.austin.gov/en/police-oversight/formal-complaint-opo-declines-to-make-a-recommendation-5/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1089,https://www.mass.gov/news/dighton-police-chief-robert-macdonald-pays-7000-civil-penalty-for-conflict-of-interest-law-violations,Media Bulletins,Agency-Published Resources,"Dighton Police Chief Robert MacDonald Pays $7,000 Civil Penalty for Conflict of Interest Law Violations | Mass.gov","",200,Mass.gov,"[""Press Release Dighton Police Chief Robert MacDonald Pays $7,000 Civil Penalty for Conflict of Interest Law Violations""]","[""Media Contact for Dighton Police Chief Robert MacDonald Pays $7,000 Civil Penalty for Conflict of Interest Law Violations"", ""Media Contact for Dighton Police Chief Robert MacDonald Pays $7,000 Civil Penalty for Conflict of Interest Law Violations"", ""State Ethics Commission"", ""Media Contact for Dighton Police Chief Robert MacDonald Pays $7,000 Civil Penalty for Conflict of Interest Law Violations"", ""Related to Dighton Police Chief Robert MacDonald Pays $7,000 Civil Penalty for Conflict of Interest Law Violations"", ""Help Us Improve Mass.gov with your feedback""]","[""Gerry Tuoti, Public Information Officer"", ""Gerry Tuoti, Public Information Officer"", ""Gerry Tuoti, Public Information Officer""]","[""Phone"", ""Online"", ""MacDonald recommended his son for appointment as full-time police officer"", ""Phone"", ""Online"", ""Phone"", ""Online"", ""Robert MacDonald Disposition Agreement"", ""State Ethics Commission""]",[],[],"" -1090,https://www.mass.gov/doc/ung-dararith-v-lowell-police-department-82009/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -1091,https://www.coppelltx.gov/482/water-backflow-prevention,Not Criminal Justice Related,Not Criminal Justice Related,"Water Backflow Prevention | Coppell, TX",The purpose of a backflow prevention device is to keep unsafe drinking water from mixing with the potable water supply.,200,"Coppell, TX | Official Website","[""Water Backflow Prevention""]","[""Backflow Prevention Assembly Testers""]","[""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Residents Business Engage I Want To... Visitors Home Government City Departments Public Works Utility Operations Water Backflow Prevention Water Backflow Prevention Backflow Prevention helps the City of Coppell ensure a safe drinking water supply for its residents. The purpose of a backflow prevention device is to keep unsafe drinking water from mixing with the potable water supply. A backflow prevention device is to be installed on: All residential irrigation systems Boiler systems Commercial facilities where chemicals are used Fire sprinkler systems Other systems where drinking water could become contaminated. Backflow Prevention Assembly Testers Backflow registration is for one year from the date of registration or re-registration. Download the Backflow Tester Registration (PDF) or view the online version . COVID-19 with Water Private Water Line Repairs Property Owners Sewer Problems Temporary Fire Hydrant Construction Meters Water Backflow Prevention Water Quality / Pumping Water Service Set Up/Disruption Agendas & Minutes Alert Sign-Up Citizen Report E-News Pay Water Bill Permits 255 E. Parkway Blvd., P.O. Box 9478, Coppell, TX 75019 Phone: 972-462-0022 | Email us Site Map Contact Us Accessibility Copyright Notices Privacy Policy Employee Login /QuickLinks.aspx Government Websites by CivicPlus® Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Residents Business Engage I Want To... Visitors Home Government City Departments Public Works Utility Operations Water Backflow Prevention Water Backflow Prevention Backflow Prevention helps the City of Coppell ensure a safe drinking water supply for its residents. The purpose of a backflow prevention device is to keep unsafe drinking water from mixing with the potable water supply. A backflow prevention device is to be installed on: All residential irrigation systems Boiler systems Commercial facilities where chemicals are used Fire sprinkler systems Other systems where drinking water could become contaminated. Backflow Prevention Assembly Testers Backflow registration is for one year from the date of registration or re-registration. Download the Backflow Tester Registration (PDF) or view the online version . COVID-19 with Water Private Water Line Repairs Property Owners Sewer Problems Temporary Fire Hydrant Construction Meters Water Backflow Prevention Water Quality / Pumping Water Service Set Up/Disruption Agendas & Minutes Alert Sign-Up Citizen Report E-News Pay Water Bill Permits 255 E. Parkway Blvd., P.O. Box 9478, Coppell, TX 75019 Phone: 972-462-0022 | Email us Site Map Contact Us Accessibility Copyright Notices Privacy Policy Employee Login /QuickLinks.aspx Government Websites by CivicPlus® Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -1092,http://www.hickoryhillspd.us/2022/05/the-hickory-hills-police-departments-distracted-driving-enforcement-results/,Resources,Agency-Published Resources,The Hickory Hills Police Department’s Distracted Driving Enforcement Results,"",200,"","[""The Hickory Hills Police Department’s Distracted Driving Enforcement Results""]","["""", ""Post navigation""]",[],"[""Report a Concern"", ""Investigative Tip Line"", ""Hot Links"", ""Contact Information""]",[],[],"Skip to content Menu HOME WHAT’S NEW CRIME ALERTS SECURITY ASSESSMENT ANNUAL REPORT The Hickory Hills Police Department’s Distracted Driving Enforcement Results HHPD May 27, 2022 May 31, 2022 The Hickory Hills Police Department issued 64 hands-free law violations and 15 citations for other traffic offenses during the April distracted driving enforcement period. We joined forces with state, local law enforcement and highway safety partners for this enforcement effort. Using your phone in anything other than hands-free mode in Illinois is not only dangerous, but also illegal. Break the cycle. Drop it and drive. The Illinois distracted driving campaign is funded with federal traffic safety funds administered by the Illinois Department of Transportation. Distracted Driving Awareness Month allowed the Hickory Hills PD to bring a heightened awareness to encourage motorists from engaging in this deadly behavior. Any questions, please reach out to Officer Michael Franks at 708-598-4900 or mfranks@hickoryhillspd.us Posted in What's New Post navigation Prev The Hickory Hills Times – March 16, 2022 Next New Auxiliary Officer Report a Concern To register for overnight parking, file a vacation watch for your home or file a condition report, click here . Investigative Tip Line Call 708-295-9313 for crimes and suspicious circumstances. (Not for ordinance issues) Hot Links Hickory Hills Times 95th Street and Roberts Road Crash Statistics Red Light Camera Statistics Mission Statement CodeRED Emergency Notification Application Satisfaction Survey School Zones Employment Pension Minutes Frequently Asked Questions Links Contact Contact Information We are open and staffed 24/7, 365 days a year and always available for walk-in service. Emergency Please call 911 Non-emergency Please call 708-598-1313 Records division Please call 708-598-4900 Email for general information ieenigenburg@hickoryhillspd.us Email for traffic issues mfranks@hickoryhillspd.us Contents Copyright © Hickory Hills Police Department. Menu HOME WHAT’S NEW CRIME ALERTS SECURITY ASSESSMENT ANNUAL REPORT HOME WHAT’S NEW CRIME ALERTS SECURITY ASSESSMENT ANNUAL REPORT " -1093,http://www.longbeach.gov/police/press-releases/charges-filed-in-murder-case/,Media Bulletins,Agency-Published Resources,CHARGES FILED IN MURDER CASE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/20/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: CHARGES FILED IN MURDER CASE Contact: Media Relations Detail (562) 570-5273 Link to original news release On July 16, 2015, Long Beach Police arrested 50-year-old Vincent Todd Armstrong in connection with the murder of Taylor Parks. On Tuesday, July 7, 2015, at approximately 11:20 p.m., the Long Beach Fire Department received a call that a battery occurred in the 5500 block of Long Beach Boulevard and a woman was injured. The Fire Department requested the Long Beach Police Department also respond. Arriving officers found a female African-American, who appeared to be approximately 25 years old, on the ground and unresponsive. Officers immediately began life-saving measures. Once Fire Department personnel arrived, they took over life-saving measures and transported her to a local hospital where she later succumbed to her injuries. Homicide detectives responded to further investigate. The preliminary investigation revealed a male African-American adult was seen fleeing the area after the assault. Detectives later discovered the victim had been stabbed in the upper torso. Through the course of their investigation, detectives learned a name of a possible suspect and, prior to the stabbing, a verbal altercation occurred and escalated. On July 20, 2015, the Los Angeles County District Attorney’s Office filed one count of murder against Armstrong. He is currently being held in Long Beach City Jail with no bail. Anyone with information regarding this incident is urged to call Long Beach Police Homicide Detective Donald Goodman or Mark Mattia at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . The Long Beach Police Department would like to thank community members for coming forward with information to solve this case. It's through your continued support and partnership with us that together we can solve crime. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1094,https://www.antioch.il.gov/wpfb-file/11-29-10-police-and-fire-agenda-pdf-2/,Poor Data Source,Poor Data Source,"11-29-10 Police And Fire Agenda - Antioch, IL",11 29 10 police and fire agenda pdf commissions commission agendas 2010 24 16 45 0000,200,"Home - Antioch, IL","[""11-29-10 Police And Fire Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -1095,https://delcopa.gov/council/2015minutes/042215minutes.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -1096,https://santabarbaraca.gov/press-releases/santa-barbara-police-department-promotes-three-officers,Personnel Records,Info About Officers,Santa Barbara Police Department Promotes Three Officers | City of Santa Barbara,"The Santa Barbara Police Department is proud to announce the promotion of three sworn law enforcement officers. Chief Bernard Melekian promoted Brian Miller from Sergeant to Lieutenant, and Detective Nathan Beltran, and Detective Andre Miller both to Sergeant. ",200,City of Santa Barbara,"[""Santa Barbara Police Department Promotes Three Officers""]","[""Breadcrumb"", ""Contact"", ""This is the prefooter section"", ""Main Footer"", ""City Hall"", ""Mailing Address"", ""Newsletters""]",[],[],[],[],"" -1097,https://www.ci.bonney-lake.wa.us/news/what_s_new/message_from_the_police_chief_on_2021_legislation,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1098,https://springfield-or.gov/event/springfield-police-advisory-committee-spac-21/,Not Criminal Justice Related,Not Criminal Justice Related,"","",-1,"","","","","","","","" -1099,https://www.rockvillecentrepolice.us/situational-awareness/,Media Bulletins,Agency-Published Resources,Situational Awareness | Rockville Centre Police Department,"",200,"Rockville Centre Police Department | Rockville Centre, NY 11570",[],"[""Situational Awareness"", ""News and alerts mailing list"", ""Success!"", ""ROCKVILLE CENTRE POLICE DEPARTMENT"", ""OUR MISSION""]","[""If you see suspicious activity, call the Rockville Centre Police Department immediately (911)""]",[],[],[],"" -1100,https://www.minneapolismn.gov/government/departments/police/precincts/,Geographic,Info About Agencies,Precincts - City of Minneapolis,Minneapolis is divided into five precincts. Find yours.,200,City of Minneapolis,"[""Minneapolis police precincts"", ""Need help? We're here for you.""]","[""A snow emergency is not currently in effect. Normal parking rules apply."", ""I want to"", ""Explore our precincts"", ""Access to police services""]","[""Find a precinct by address or map"", ""1st Precinct"", ""2nd Precinct"", ""3rd Precinct"", ""4th Precinct"", ""5th Precinct"", ""Minneapolis Police Department"", ""Connect with the Minneapolis Police Department""]",[],[],[],"" -1101,https://alpha.austin.gov/es/police-oversight/official-complaint-documents-related-to-protests/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1102,https://delcopa.gov/publicrelations/releases/2020/spottedlanternflytreatment.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Awarded Grant for Treatment of Spotted Lanternflies - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Awarded Grant for Treatment of Spotted Lanternflies""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -1103,http://www.longbeach.gov/police/press-releases/murder-suicide-investigation/,Media Bulletins,Agency-Published Resources,MURDER-SUICIDE INVESTIGATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/24/2017 FOR IMMEDIATE RELEASE Press Release # # Subject: MURDER-SUICIDE INVESTIGATION Contact: Media Relations Detail (562) 570-5273 On Saturday, September 23, 2017, at approx. 10:45 a.m., officers were dispatched to the 7100 block of Island Village Dr. to investigate a domestic violence call. When officers arrived, they located two individuals at a residence, one male adult, and one female adult, who had both sustained apparent gunshot wounds. The male subject was determined deceased at the scene. The female was transported to a local hospital by LBFD personnel, and pronounced deceased thereafter. The individuals are not being identified at this time, pending notification of next of kin, but are believed to be husband and wife. A firearm was recovered at the scene, and the incident is being investigated as a murder-suicide. Anyone who may have information regarding the incident is asked to contact Long Beach Police Homicide Detectives Sean Irving and Ben Vargas at (562) 570-7244. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1104,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/022722blotter.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1105,https://pittsburghpa.gov/files/police/orders/ch6/69-05-pictures-videos-&-audio-recordings-of-police-officers-while-in-public-spaces.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1106,https://www.southamptontownnypolice.gov/366/skate-parks,Resources,Agency-Published Resources,"Skate Parks | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Skate Parks""]",[],"[""Site Tools"", ""Rules & Safety"", ""Skate Park"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1107,http://www.longbeach.gov/police/press-releases/attempt-murder-suspect-arrested/,Media Bulletins,Agency-Published Resources,ATTEMPT MURDER SUSPECT ARRESTED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/12/2018 FOR IMMEDIATE RELEASE Press Release # Subject: ATTEMPT MURDER SUSPECT ARRESTED Contact: Media Relations Detail (562) 570-5273 GUNS SEIZED DURING SEARCH WARRANT On January 11, 2018, at approximately 4:50 PM, the Long Beach Police Department SWAT Team served a search warrant at a residence in the 900 block of N. Marine in the City of Wilmington, looking for a suspect wanted in an attempt murder investigation from December 26, 2017. Upon serving the search warrant SWAT officers located the suspect inside and took him into custody without incident. The suspect is identified as 32 year-old Ezequiel Cuebas a resident of Wilmington. He was booked into the Long Beach Jail for attempt murder and unlawful possession of an assault rifle, and is being held on $1,00,000.00 bail. During the search of the residence detectives recovered numerous firearms including an assault rifle (pictured above). It is not known at this time if any of the weapons seized during the search warrant were used in the original shooting. The original shooting incident occurred on December 26, 2017, at approximately 2:30 AM, in the 1700 block of Cedar Avenue. Officers were dispatched to assist the Long Beach Fire Department with a shooting victim around Pacific Coast Highway and Chestnut Avenue. The victim was shot in the upper torso, and was subsequently transported to a local hospital by paramedics. Upon arrival officers conducted their investigation and found evidence that lead them to the 1700 block of Cedar, where they found the original crime scene. The shooting was believed to be gang related so gang detectives were called to the scene to handle the investigation. Detectives conducted a thorough investigation, and thanks to their relentless follow up they were able to identify a possible suspect and a location where he was staying, which led to the service of the search warrant and his arrest. Anyone with addition information on this incident is urged to call Gang Detective Chris Valdez at (562) 570-7276. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1108,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0201/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1109,https://pittsburghpa.gov/police/task-force-police-reform,Resources,Agency-Published Resources,Response to Community Task Force On Police Reform | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", """", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""PBP Response to Mayor's Community Task Force Recommendations"", ""Police Links""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -1110,https://pittsburghpa.gov/police/police-zone4,Contact Info & Agency Meta,Info About Agencies,Police Zone 4 | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""Police Zone 4"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -1111,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/092522summary.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1112,https://www.littlerock.gov/media/4332/robert-ryan-hunter-copy.png?width=204&height=248,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1113,https://sanfordfl.gov/wp-content/uploads/2021/10/rateourservice_police.png,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1114,http://www.lafayettepolice.us/faq.aspx?qid=116,Complaints & Misconduct,Info About Officers,FAQs • Will I receive updates about my complaint status?,"",200,"Police Department | Lafayette, IN - Official Website",[],"[""▼ Police Complaints""]","[""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1115,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/071921summary.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1116,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/063021summary.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -1117,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0967/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1118,http://www.longbeach.gov/police/press-releases/traffic-fatality---harvy-way-and-bellflower-blvd/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY - HARVY WAY AND BELLFLOWER BLVD,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/29/2019 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY - HARVEY WAY AND BELLFLOWER BLVD Contact: LBPD Media Relations (562)570-5273 LBPDMediaRelations@longbeach.gov On March 28, 2019, at approximately 8:05 p.m., officers responded to the intersection of Harvey Way and Bellflower Boulevard regarding a traffic collision between a vehicle and a pedestrian in a wheelchair, which resulted in the death of a male adult. Officers arrived on scene and located a non-responsive 29-year-old male pedestrian lying in the roadway of northbound Bellflower Boulevard north of Harvey Way. The Long Beach Fire Department responded and transported the pedestrian to a local hospital where he was pronounced deceased. The pedestrian's identification is being withheld pending notification of the next of kin. Officers also contacted a motorist who initially fled, but returned to the scene of the collision in his 2012 Jeep Grand Cherokee. The driver was identified as 37-year-old Jesus Jorge Arias of Lakewood. Arias admitted to being involved in the collision. The preliminary investigation revealed the collision occurred when Arias drove north on Bellflower Boulevard and proceeded through the intersection at Harvey Way. The wheelchair-bound pedestrian was attempting to cross Bellflower Boulevard eastbound in the crosswalk on the north side of the intersection when he was struck by Arias. Arias was suspected of driving under the influence of alcohol at the time of the collision. Arias was placed under arrest and booked for DUI and hit and run and is being held on $100,000 bail. Arias did have a valid license. Primary cause of the collision is unknown at this time. We encourage anyone who may have information regarding this incident is asked to call Long Beach Police Department Collision Investigation Detail Detective David Whelan at (562) 570-7355. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or v isiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1119,https://hilliardohio.gov/remembering-hilliard-police-officer-sean-johnson/,Not Criminal Justice Related,Not Criminal Justice Related,Remembering Hilliard Police Officer Sean Johnson - City of Hilliard,"May 19, 2016 is a day we will never forget. Today marks six years since we lost Officer Sean Johnson. It’s not how he died that made him a hero, but how",200,403 Forbidden,"[""Remembering Hilliard Police Officer Sean Johnson""]","[""Residents"", ""It’s a place you can be proud to call home."", ""Government"", ""We exhibit a heart for service, dedication to excellence, and strength in teamwork."", ""Recreation & Parks"", ""We believe in health, wellness, and vibrant quality of life for our community."", ""Police & Courts"", ""Our badge shows we protect and serve. Our approach shows we're part of the community."", ""FAQ"", ""How can we assist you?"", ""Related News Posts"", ""Growth and Recreation: The Lasting Legacy of Roger A. Reynolds"", ""HPD Honors Employees of the Year"", ""Happy Leap Day, Hilliard! Have you heard of the Leap Road Leapers?"", ""LET'S CHAT!"", ""City of Hilliard"", ""Hilliard Police"", ""Rec & Parks"", ""Hilliard Newsletter""]",[],[],[],"[""Click the ‘x’ to opt out.""]",About Hilliard Accessing the Last Mile Aging in Place Committee Annual Events Available Properties Boards and Commissions Application Bridging The Digital Divide Building Standards Division Business Card Order Form Business Media Business Permitting Business Resources City Charter City Manager City of Hilliard – Home Collaborations for Technology Community Garden Community Resources Community Services and Programs Comprehensive Plan Contact the City Contact Us Demographics Designated Outdoor Refreshment Area (DORA) Disc Golf Discrimination Form Downtown Hilliard Downtown Hilliard Map Economic Development Electric Aggregation Engineering Division Ephemeral Wildflowers in Hilliard Fall Festival Feral Cats Fiber To The Home File a Report Online Food Waste Composting Program Forms and Applications HiFiO Hilliard City Lab Hilliard Development Corporation Hilliard Express Hilliard Public Arts Commission Hilliard Trails Hilliard’s Parks History Important Documents Incentives & Programs Information Technology Join the HPD Team Leaf Collection Lifestyle Major Employers Mapping Ohio’s Connectivity Mosquitos Neighborhood Crime Mapping Non Discrimination Now Hiring: Seasonal and Part-Time Positions Operations Department Opportunity Hilliard Personnel Review Board Planning Division Police Transparency in Policing Police Public Records Request Program Guide Public Bids Public Records Recreation and Parks – WebTrac RecTrac User Guide Recycling Roundabouts SAFE Sidewalk Program Sanitary Backflow Program Senior Programs Senior Resources Smart Streets Smart911 Social Investment Sponsorship Stationary Order Form Stormwater Management Street Maintenance & Rehabilitation Program Styrofoam Recycling Summer Rec Camp Sustainability Taxes The Well – Hilliard Recreation and Wellness Center Traffic Calming Traffic Enforcement Requests Transportation & Mobility Division Transportation Planning Trees Vacation House Check Victims Rights Videos Volunteer WebTrac Login Winter Weather Yard Waste Your Hilliard Residents Resident Resources Hilliard 311 Thank you Newsletter Signup Trash Rec & Parks Classes & Camps Rentals Master Parks Plan Pools & Passes The Senior Center Senior Citizen Hall of Fame Sports Government Newsroom Boards & Commissions Planning & Zoning Recreation and Parks Advisory Committee Records Commission Shade Tree Commission Environmental Sustainability Commission Keep Hilliard Beautiful Zoning Appeals Agendas & Minutes City Council Mayor’s Court Departments Community Development Finance Human Resources Law Q & A Business Communication Economic Development Emergency Alerts Fire Holidays HR Mayor’s Court Old Hilliard Police Rec & Parks Solicitation Taxes Trash Q&A Trees Q&A Reporting Online Library Norwich Township Schools Visit Hotels Old Hilliard News Privacy & Usage Policy Sitemap Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Accessibility by WAH Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Font Resize A- A+ Font Resize A- A+ Keyboard navigation Keyboard navigation Readable Font Readable Font Contrast Choose color black white green blue red orange yellow navi Contrast Choose color black white green blue red orange yellow navi black white green blue red orange yellow navi Clear cookies Clear cookies Accessibility by WAH Accessibility by WAH -1120,https://www.mass.gov/doc/william-j-wagner-president-chicopee-savings-bank/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1121,https://www.mass.gov/locations/state-police-boston-barracks/locations,Geographic,Info About Agencies,Locations | Mass.gov,"",200,Mass.gov,"[""Other locations related to State Police Boston Barracks""]","[""Showing 1 - 5 of 5 results for:"", ""State Police Foxboro Barracks"", ""State Police Framingham Barracks"", ""State Police Government Center Barracks"", ""State Police Milton Barracks"", ""State Police South Boston Barracks""]",[],[],[],[],"" -1122,https://www.mass.gov/doc/lynch-matthew-v-bridgewater-police-department-121913/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -1123,http://www.lafayettepolice.us/1587/cpz-history,Not Criminal Justice Related,Not Criminal Justice Related,"CPZ History | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""CPZ History""]",[],"[""1870's"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1124,https://police.crystalmn.gov/g_o_v_e_r_n_m_e_n_t/departments_a-_z/assessing,Not Criminal Justice Related,Not Criminal Justice Related,Assessments - City of Crystal,Links and information about City of Crystal assessing and property tax records.,200,Just a moment...,"[""Assessments""]","[""City Assessment Contact""]","[""Sign up for a city newsletter or notification."", ""City Hall"", ""Regular Hours:""]","[""Monday - Friday""]",[],[],"" -1125,https://broadview-il.gov/documents/police-department-board-report-may-2022/,Poor Data Source,Poor Data Source,Police Department Board Report – May 2022 | Broadview,"",200,Home | A Balanced Community,"[""Police Department Board Report – May 2022""]",[],"[""Featured Gallery"", ""Categories"", ""About Broadview, IL"", ""Phone Numbers"", ""Join Our Newsletter"", ""Broadview Municipal Building""]","[""Police Department Board Report – May 2022 (339 kB)""]",[],[],"Menu Home Residents Events Village Board Meetings Report A Concern Curfew Parking Local Schools Receive Robo Calls Newsletter Archives Departments Water Pay My Water Bill Water Bill Rates How To Read Your Water Bill Water Billing Penalty Phase Waste & Yard Stickers Finance Financial Reports Property Tax Rates Financial Statements Compensation Packet Police Chief Of Police Thomas Mills Vision Operation Division Patrol Bureau Detective Bureau Administrative Services (Police) 911 Communications Truck Enforcement Initiative Police Reports Broadview Annual Police Reports General Information And Tips Sex Offender Registry Identity Theft Resources Vacation Checks For Your Home Block Party Request Form/Signature Form Community Feedback Organizational Structure Broadview Police Department Recruiting Fire Fire Chief Matthew Martin Fire Department Team About Us (Fire) Fire Suppression Emergency Medical Services Pre-Fire Planning Fire Inspector Martin Scafidi Fire Training Division Emergency Preparedness CPR Registration MyID Program Residential Knox Box Fire Prevention Bureau and Public Education Fire Annual Report Home Fire Safety Checklist Building Building Department Safety Committee Information Sheet Code Zoning Adjudication Downloadable Forms Solar Guideline, Checklists, and Permitting Public Works Public Works Department Refuse Broadview Capital Improvement Plan FAQ Public Works Website Links Water Quality Reports MS4 Annual Reports Village RFQ Government About Broadview Broadview History Village Government Village Code Village Board Meetings Village Directory Village Clerk Village Official Records Voter Registration FOIA Request Duties Important dates for November election Village Administrator Broadview Westchester Joint Water Agency Job Opportunities Alliance for Sustainability Solar Guidelines, Checklists & Permitting Solar Energy Resources Community Solar Unity Solar Group SBC Waste Hauler Juneteenth Festival Juneteenth Festival Archive Broadview Initiatives Elevating Aging-in-Community in Bellwood & Broadview English Spanish English Ask Broadview Map " -1126,https://statepatrol.nebraska.gov/nsp-investigating-milford-police-officer-involved-shooting,Poor Data Source,Poor Data Source,"","",403,"","","","","","","","" -1127,http://www.longbeach.gov/police/press-releases/traffic-fatality-wardlow-and-magnolia/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY WARDLOW AND MAGNOLIA,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/19/2018 FOR IMMEDIATE RELEASE Press Release # 2018 Subject: TRAFFIC FATALITY WARDLOW AND MAGNOLIA Contact: Media Relations Detail (562) 570-5273 On Monday, June 18, 2018 at approximately 8:50 p.m., officers were dispatched to the intersection of Wardlow Road and Magnolia Avenue regarding a vehicle versus pedestrian injury traffic collision. Upon arrival, officers located an elderly female lying in the westbound lanes of Wardlow Road west of Magnolia Avenue with major trauma. The Long Beach Fire Department responded and transported the pedestrian to a local hospital in critical condition. A few hours later the pedestrian succumbed to her injuries and was pronouced deceased. The preliminary investigation revealed that a 19-year-old male resident of Compton was driving a 2001 Toyota Camry westbound on Wardlow Road in the #2 lane, east of Magnolia Avenue. He entered the intersection on a green light, per witnesses, and upon crossing the west crosswalk collided with an elderly female pedestrian who was crossing in the west crosswalk, against a red light. Although, the driver intially left the scene the driver did return to the scene and fully cooperated with the investigation. The pedestrian had no form of identification on her and appeared to be in her 70’s. Anyone who may have witnessed this incident is asked to call Detective Sirilo Garcia of the Long Beach Police Department’s Collision Investigation Detail at (562) 570-7355. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1128,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0973/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1129,https://data.naperville.il.us/datasets/police-department-accidents,Poor Data Source,Poor Data Source,Open Data Naperville,Naperville Open Data site,200,Open Data Naperville,[],[],[],[],[],[],"" -1130,https://www.southamptontownnypolice.gov/292/sag-harbor,Not Criminal Justice Related,Not Criminal Justice Related,"Sag Harbor | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Sag Harbor""]","[""Sag Harbor - Local Information & Resources""]","[""Site Tools"", ""Contact Us"", ""Quick Links"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Community Info Hamlets Sag Harbor Sag Harbor Sag Harbor - Local Information & Resources Sag Harbor CAC Contact Us Citizens' Response Center 631-702-2440 Quick Links Hamlets Master Plans News & Events Town Code Town Studies & Reports View All /QuickLinks.aspx Community Projects Current Planning Applications Sag Harbor CAC Minutes Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Community Info Hamlets Sag Harbor Sag Harbor Sag Harbor - Local Information & Resources Sag Harbor CAC Contact Us Citizens' Response Center 631-702-2440 Quick Links Hamlets Master Plans News & Events Town Code Town Studies & Reports View All /QuickLinks.aspx Community Projects Current Planning Applications Sag Harbor CAC Minutes Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -1131,https://www.sandyspringsgapolice.gov/intelligence-and-technology-division/,Contact Info & Agency Meta,Info About Agencies,Intelligence and Technology Division – Sandy Springs Police Department,"",200,Sandy Springs Police Department,"[""Intelligence and Technology Division""]","[""Criminal Intelligence Unit"", ""Technology Unit"", ""Records Unit"", ""Georgia Crime Information Center (GCIC) Unit""]",[],[],[],[],Emergency: Dial 911 | Non-Emergency: Phone Directory | Police Reports | Events Emergency: Dial 911 | Non-Emergency: Phone Directory | Police Reports | Events Menu Menu About SSPD Police Chief Command Staff Districts Careers with SSPD Contact Us Visit Police HQ Higher Learning Statement on Use of Force & Community Engagement SSPD Most Wanted In Memoriam Sandy Springs Police Benevolent Fund SSPD’s Social Media Policy Divisions and Units Patrol Division Special Operations Division Criminal Investigation Division Administration Division Intelligence and Technology Division Internal Affairs Training and Background Unit Property & Evidence Unit Specialized Units North Metro S.W.A.T. Quick Response Force Street Crimes Unit K-9 Unit Traffic Traffic Response Vehicle Bicycle Patrol CSI Unit Crisis Negotiation Team River Patrol Unit Honor Guard Drone Program Community Part Time / Reserve Officers Task Forces Organizational Chart Citizen Services Alarm Information Alcohol Pouring Permits Apartment Safety Checker ChatComm911 Criminal History Reports and Record Restrictions Event Map ⤤ Domestic Violence Resources Home and Business Checks Mental Health & Substance Abuse Municipal Court Off-Duty Officer Requests Open Records Requests Police Reports Report a Crime & Crime Tips Sex Offender Registry Vehicle Release VIN Verification Weapons Carry License Crime Prevention Crime Statistics Neighborhood Watch Home and Business Security Citizen Participation SSPD Events Citizens Police Academy (CPA) Women’s Self Defense Classes Handgun Safety Class Volunteer Programs Citizens On Patrol (COPS) Law Enforcement Explorers Youth Program Internship Program VIPS (Volunteers in Police Service) Chaplains Program Camera Registry Program Menu About SSPD Police Chief Command Staff Districts Careers with SSPD Contact Us Visit Police HQ Higher Learning Statement on Use of Force & Community Engagement SSPD Most Wanted In Memoriam Sandy Springs Police Benevolent Fund SSPD’s Social Media Policy Divisions and Units Patrol Division Special Operations Division Criminal Investigation Division Administration Division Intelligence and Technology Division Internal Affairs Training and Background Unit Property & Evidence Unit Specialized Units North Metro S.W.A.T. Quick Response Force Street Crimes Unit K-9 Unit Traffic Traffic Response Vehicle Bicycle Patrol CSI Unit Crisis Negotiation Team River Patrol Unit Honor Guard Drone Program Community Part Time / Reserve Officers Task Forces Organizational Chart Citizen Services Alarm Information Alcohol Pouring Permits Apartment Safety Checker ChatComm911 Criminal History Reports and Record Restrictions Event Map ⤤ Domestic Violence Resources Home and Business Checks Mental Health & Substance Abuse Municipal Court Off-Duty Officer Requests Open Records Requests Police Reports Report a Crime & Crime Tips Sex Offender Registry Vehicle Release VIN Verification Weapons Carry License Crime Prevention Crime Statistics Neighborhood Watch Home and Business Security Citizen Participation SSPD Events Citizens Police Academy (CPA) Women’s Self Defense Classes Handgun Safety Class Volunteer Programs Citizens On Patrol (COPS) Law Enforcement Explorers Youth Program Internship Program VIPS (Volunteers in Police Service) Chaplains Program Camera Registry Program -1132,https://www.colma.ca.gov/documents/executive-assistant-chief-police/jd-executive-assistant-to-chief-of-police-6-24/,Media Bulletins,Agency-Published Resources,JD - Executive Assistant to Chief of Police 6-24 - Town of Colma,"",200,Home - Town of Colma,"[""JD – Executive Assistant to Chief of Police 6-24""]","[""Primary menu links"", ""Action toolbar"", ""Recent news"", ""Contact"", ""Subscribe"", ""Connect""]","[""Registration now open for 25th Annual Sustainability Awards Event"", ""LiveWire – March 2024"", ""Crime Bulletin – February 2024"", ""Open Participation Survey"", ""Energy Programs Bulletin""]",[],[],[],"Town of Colma Primary menu links About Residents Businesses Visitors City Council Departments Events News Contact Action toolbar Search Primary menu links About Residents Businesses Visitors City Council Departments Events News Contact Action toolbar Search Town of Colma Town of Colma Town of Colma JD – Executive Assistant to Chief of Police 6-24 Posted on June 24, 2021 JD - Executive Assistant to Chief of Police 6-24 Recent news Registration now open for 25th Annual Sustainability Awards Event Posted on March 12, 2024 LiveWire – March 2024 Posted on March 1, 2024 Crime Bulletin – February 2024 Posted on March 1, 2024 Open Participation Survey Posted on February 14, 2024 Energy Programs Bulletin Posted on February 9, 2024 All news » JD – Executive Assistant to Chief of Police 6-24 Posted on June 24, 2021 JD - Executive Assistant to Chief of Police 6-24 Recent news Registration now open for 25th Annual Sustainability Awards Event Posted on March 12, 2024 LiveWire – March 2024 Posted on March 1, 2024 Crime Bulletin – February 2024 Posted on March 1, 2024 Open Participation Survey Posted on February 14, 2024 Energy Programs Bulletin Posted on February 9, 2024 All news » JD - Executive Assistant to Chief of Police 6-24 Recent news Registration now open for 25th Annual Sustainability Awards Event Posted on March 12, 2024 LiveWire – March 2024 Posted on March 1, 2024 Crime Bulletin – February 2024 Posted on March 1, 2024 Open Participation Survey Posted on February 14, 2024 Energy Programs Bulletin Posted on February 9, 2024 All news » JD - Executive Assistant to Chief of Police 6-24 Recent news Registration now open for 25th Annual Sustainability Awards Event Posted on March 12, 2024 LiveWire – March 2024 Posted on March 1, 2024 Crime Bulletin – February 2024 Posted on March 1, 2024 Open Participation Survey Posted on February 14, 2024 Energy Programs Bulletin Posted on February 9, 2024 All news » Helpful Share Facebook Twitter Email Size + Reset a − Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu " -1133,https://brookfieldil.gov/publication/05510-may-5-2010-fire-and-police-commission/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1134,https://delcopa.gov/publicrelations/releases/2021/hurricaneida.html,Not Criminal Justice Related,Not Criminal Justice Related,"MAJOR DISASTER DECLARATION AND FEMA ASSISTANCE in Delaware County - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""MAJOR DISASTER DECLARATION AND FEMA ASSISTANCE""]","[""MAJOR DISASTER DECLARATION AND FEMA ASSISTANCE""]","[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -1135,https://www.goldenbeach.us/police-department/beach-patrol/,Misc Police Activity,Police & Public Interactions,Beach Patrol – Golden Beach: A Town Unlike Any Other,"",200,Golden Beach: A Town Unlike Any Other – The Town of Golden Beach,"[""Beach Patrol""]","[""Beach Warning Flag Meanings""]","[""Quick Links"", ""Documents"", ""About Golden Beach"", ""Phone Numbers"", ""Town Hall""]","[""Annual Report 2022"", ""Annual Report 2021"", ""Annual Report 2020"", ""Annual report for 2019""]",[],[],Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide [hmapsprem id=1] Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide Menu -1136,https://www.southbendin.gov/job/police-officer-lateral-entry-in-south-bend/,Training & Hiring Info,Info About Officers,"Police Officer Lateral Entry (IN, South Bend) - South Bend, Indiana","",200,403 Forbidden,"[""Police Officer Lateral Entry (IN, South Bend)""]","[""Post navigation""]","[""How was your experience?"", ""Mobile Navigation Menu"", ""WELCOME TO THE CITY OF SOUTH BEND’S NEW WEBSITE"", ""311 SERVICE CENTER"", ""CONNECT WITH ELECTED OFFICIALS"", ""PAY BILLS ONLINE"", ""TRASH INFORMATION"", ""VENUES PARKS & ARTS"", ""PROVIDE FEEDBACK"", ""YOU’RE READY!""]","[""CONNECT"", ""My Government"", ""311 Service Portal""]","[""Take Action"", ""Service""]",[],"" -1137,https://delcopa.gov/treasurer/forms/bingo_law.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1138,https://www.stpaul.gov/departments/police/blueprint-safety,Policies & Contracts,Info About Agencies,Blueprint for Safety | Saint Paul Minnesota,"BLUEPRINT FOR SAFETY The Saint Paul Blueprint for Safety is a model that was created to link the city's criminal justice agencies together in a coherent, p",200,Home | Saint Paul Minnesota,"[""Blueprint for Safety""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Footer""]","[""You are using an unsupported browser. Please use Microsoft Edge."", ""Contact The City"", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[],"" -1139,https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations55/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -1140,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-141-fitness-bonus-payment-state-fiscal-year-2011-12,Media Bulletins,Agency-Published Resources,State Police Bulletin No. SP-141 | Office of the New York State Comptroller,To notify the Division of State Police of the procedures for processing Fitness Bonus Payments,200,Office of the New York State Comptroller | Thomas P. DiNapoli,"[""State Police Bulletin No. SP-141"", """"]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Effective Date(s)"", ""Background"", ""Contract Provisions and Eligibility Criteria"", ""Agency Actions"", ""Deduction Information"", ""Undeliverable Checks"", ""Tax Administration"", ""Payroll Register and Employee’s Paycheck"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[],"" -1141,https://cityofsalemnj.gov/police-fire-ems/,Contact Info & Agency Meta,Info About Agencies,"Police, Fire, EMS | City of Salem New Jersey","",200,City of Salem New Jersey | Open for business!,"[""Police, Fire, EMS""]","[""POLICE"", ""FIRE DEPARTMENT"", ""EMS"", ""All Emergencies"", ""Poison Control Hotline"", ""Police, Non-Emergency"", ""County Courthouse"", ""City Administrator"", ""City Clerk"", ""City Finance Office"", ""Municipal City Court"", ""Water & Sewer Dept"", ""Street Department"", ""Building Inspector"", ""Tax Assessor"", ""Tax Collector"", ""Salem Mem. Hospital"", ""Salem High School"", ""Salem Middle School"", ""Fenwick Academy""]","[""Officers"", ""City of Salem Body Worn Camera Policy"", ""Annual Reports"", ""Internal Affairs Policy"", ""Early Intervention System"", ""Recruitment"", ""Firearm Permits & IDs"", ""Immigration"", ""DOCUMENTS:"", ""Fire Incident Report"", ""Become a Volunteer Firefighter"", ""2020 Fire Safety Sheet"", ""American Legion Ambulance Association""]",[],[],[],"" -1142,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0547/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -1143,https://www.southamptontownnypolice.gov/faq.aspx?qid=505,Poor Data Source,Poor Data Source,"FAQs • I renewed my registration with the DMV, but have yet","",200,"Police | Southampton, NY - Official Website",[],"[""▼ Parks & Rec""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1144,https://manitowoccountywi.gov/departments/joint-dispatch-center/policefireems-contact-information/,Contact Info & Agency Meta,Info About Agencies,Manitowoc County - Police/Fire/EMS Contact Information - Manitowoc County,"",200,Error retrieving title: dictionary changed size during iteration,"[""Police/Fire/EMS Contact Information""]",[],"[""Manitowoc County Police, Fire and EMS""]",[],"[""Departments""]","[""Joint Dispatch Center"", ""CONTACT"", ""ALERTS"", ""DIRECTORY"", ""LEGALS""]","Manitowoc County Departments Aging & Disability Resource Center Airport Child Support Clerk of Circuit Court Coroner Corporation Counsel County Board of Supervisors County Clerk County Executive District Attorney Emergency Management EXPO Extension Manitowoc County Family Court Finance Health Department Highway Human Services Information Technology Jail Joint Dispatch Center Parks Personnel Planning and Zoning Public Works Recycling Center Register in Probate Register of Deeds Sheriff Soil and Water Conservation Treasurer Veteran's Services How Do I Apply Marriage License Passport Sanitary Permit WIC Work Permit Zoning Permit Get a Copy Birth Certificate Death Certificate Marriage Certificate Parcel Map Register of Deeds Land Records Pay Child Support Pay Court Fines or Fees Report Adult/Elderly Abuse Child Abuse Communicable Disease Crime POWTS Maintenance Property Fraud Government Agendas and Minutes County Board Standing Committees Boards, Commissions & Committees Ad Hoc Committees Meeting Announcements Resolutions and Ordinances Supervisors District Maps Supervisor List Finances Budget CAFR Miscellaneous Census Bureau Election Info Legal Holidays YouTube Live Residents Community Community Resources Directory Communities in the County Farmer’s Markets Lincoln Park Zoo Manitowoc Aquatic Center Parks Veteran's Services Voting Information Health Affordable Care Act Car Seat Information Food Facility Inspection Reports Healthiest Manitowoc County Human Services Public Crime Tip Emergency Prep Hospitals Sheriff's Office Sign up for Alerts Suicide Prevention Frequently Asked Questions Aging and Disability Resource Center Coroner Family Court Foster Care Jail Joint Dispatch Center Recycling Center Employment Tourism Attractions Beaches Capitol Civic Center Lighthouses Manitowoc Aquatic Center Point Beach State Park Wisconsin Maritime Museum County Recreation Airport Manitowoc County Fair Events Lakes Parks Miscellaneous Beach Conditions Manitowoc County Historical Society Tourism Information Local Tourism Travel Manitowoc County Visit Manitowoc Home Departments Joint Dispatch Center Police/Fire/EMS Contact Information Departments Joint Dispatch Center 9-1-1 What to Expect Statistics Kudos FAQs Police/Fire/EMS Contact Information Utility Company Contacts Business After Hours Contact Form Contact Us Police/Fire/EMS Contact Information Manitowoc County Police, Fire and EMS Law Enforcement Agencies For ALL Emergencies dial 911 Manitowoc County Sheriff’s Office (920) 683-4200 Manitowoc Police Department (920) 686-6500 Two Rivers Police Department (920) 686-7200 Kiel Police Department (920) 894-2211 City Fire Departments For ALL Emergencies dial 911 City of Manitowoc Fire Department (920) 686-6540 City of Two Rivers Fire Department (920) 793-5521 City of Kiel Fire Department (920) 894-2211 County Fire Departments and Ambulance Services Branch Fire Department Cleveland Fire Department Collins Fire Department Francis Creek Fire Department Kellnersville Fire Department Maribel Fire Department Menchalville Fire Department Mishicot Fire Department/ Ambulance Newton Fire Department Reedsville Fire Department Rockwood Fire Department Silver Creek Fire Department St. Nazianz Fire Department Tisch Mills Fire Department Town of Two Rivers Fire Department Two Creeks Fire Department Valders Fire Department/ Ambulance Whitelaw Fire Department CONTACT General County Info (920) 683-4000 Department Contacts Contact Us ALERTS Amber Alerts Beach Conditions Crime Stoppers Weather DIRECTORY County Code County Directory Departments Local Communities LEGALS Accessibility & Fair Housing Ethics Code HIPAA Privacy Notice Privacy Disclaimer © 2024 Manitowoc County, WI " -1145,http://www.lafayettepolice.us/2201/outdoor-maintenance,Resources,Agency-Published Resources,"Outdoor Maintenance | Lafayette, IN - Official Website",How to maintain your lawn and outdoor areas to reduce stormwater pollution.,200,"Police Department | Lafayette, IN - Official Website","[""Outdoor Maintenance""]","[""Mowing"", ""Pets"", ""Car Washing"", ""Leaves and Fertilizer"", ""Swimming Pools"", ""Watering the Garden""]","[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1146,https://www.edmondswa.gov/government/departments/police_department/security_camera_registration,Resources,Agency-Published Resources,"","",404,"","","","","","","","" -1147,https://police.crystalmn.gov/police/contact_us/crime_report,Poor Data Source,Poor Data Source,Crime Reporting System - City of Crystal-Police,"",200,Just a moment...,"[""Crime Reporting System""]",[],"[""Sign up for a city newsletter or notification."", ""Police Department"", ""Lobby Hours:""]","[""Bolded fields are required"", ""Monday - Friday""]",[],[],"" -1148,https://delcopa.gov/treasurer/pdf/2021reassessmentvalues/10.pdf,Annual & Monthly Reports,Info About Agencies,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -1149,https://www.dps.nm.gov/blog/2021/12/08/update-cancel-silver-alert-rio-rancho-police-department-eric-engquist/,Incident Reports,Police & Public Interactions,UPDATE: CANCEL SILVER ALERT – Rio Rancho Police Department – Eric Engquist - NM Department of Public Safety,"",200,Home - NM Department of Public Safety,"[""UPDATE: CANCEL SILVER ALERT – Rio Rancho Police Department – Eric Engquist""]",[],"[""Location"", ""Sitemap"", ""Quick Links"", ""Social Media Links""]",[],[],[],"Manage Cookie Consent We use cookies to optimize our website and our service. Functional Functional Always active The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network. Preferences Preferences The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user. Statistics Statistics The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you. Marketing Marketing The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes. Manage options Manage services Manage {vendor_count} vendors Read more about these purposes Accept Deny Preferences Save preferences Preferences Cookie Policy Privacy Statement {title} Manage Cookie Consent We use cookies to optimize our website and our service. Functional Functional Always active The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network. Preferences Preferences The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user. Statistics Statistics The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you. Marketing Marketing The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes. Manage options Manage services Manage {vendor_count} vendors Read more about these purposes Accept Deny Preferences Save preferences Preferences Cookie Policy Privacy Statement {title} Manage Cookie Consent Manage Cookie Consent " -1150,https://www.lynchburgvapolice.gov/news-updates/e-c-glass-on-lockdown-due-to-suspicious-phone-call/,Media Bulletins,Agency-Published Resources,E. C. Glass on Lockdown Due to Suspicious Phone Call  - Lynchburg Police Department,"",200,403 Forbidden,"[""E. C. Glass on Lockdown Due to Suspicious Phone Call""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[],"" -1151,https://delcopa.gov/prison/mail.html,Poor Data Source,Poor Data Source,"Sending Mail to an Inmates - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Sending Mail to an Inmates""]",[],"[""Mail Scanning"", ""George Hill Correctional Facility Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -1152,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0868/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1153,http://www.longbeach.gov/police/press-releases/roadway-safety-is-important-for-everyone-to-follow/,Policies & Contracts,Info About Agencies,ROADWAY SAFETY IS IMPORTANT FOR EVERYONE TO FOLLOW,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1154,http://www.tampa.gov/police/info/domestic-violence/options,Resources,Agency-Published Resources,Domestic Violence - Options | City of Tampa,"Stay with the AbuserMake a safety plan.Call the police if you are being abused.Attend a support group, call (813) 621-7233.File Criminal ChargeCall the police.Sends a message to the abuser that abuse will no longer be tolerated.Police may arrest on scene.",200,City of Tampa,"[""Domestic Violence - Options""]","[""Police Department"", ""Stay with the Abuser"", ""File Criminal Charge"", ""File Injunction for Protection"", ""Leave the Abuser"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[],"" -1155,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/052722summary.pdf,Daily Activity Logs,Info About Officers,"","",404,"","","","","","","","" -1156,https://www.roseville.ca.us/government/departments/police_department/crime_log/crime_log_may_14__2021_-_june_04__2021,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1157,https://champaignil.gov/police/community-engagement/neighborhood-watch/,Resources,Agency-Published Resources,Neighborhood Watch - City of Champaign,"",200,403 Forbidden,"[""Neighborhood Watch""]","[""Police Department"", ""Quick Links"", ""Police Department News"", ""Contact Us""]",[],[],[],[],"" -1158,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-59-dues-increase-rehired-retirees-who-are-members-police-benevolent,Media Bulletins,Agency-Published Resources,State Police Bulletin No. SP-59 | Office of the New York State Comptroller,To explain an automatic dues increase,200,Office of the New York State Comptroller | Thomas P. DiNapoli,"[""State Police Bulletin No. SP-59"", """"]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Effective Date"", ""OSC Actions"", ""Agency Actions"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[],"" -1159,https://cityofpowell.us/government/building-department/city-of-powell-commercial-building/checklist-cop-comm-tent-01-08-19/,Resources,Agency-Published Resources,"City of Powell, Ohio | Checklist COP Comm Tent 01.08.19","",200,"City of Powell, Ohio","[""Checklist COP Comm Tent 01.08.19""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -1160,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0900/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1161,https://www.mass.gov/doc/fas-31-2018-hcpcs-code-revisions-new-prior-authorization-requirement-for-knee-arthroscopy/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1162,https://www.coppelltx.gov/1051/s-belt-line-reconstruction-updates,Not Criminal Justice Related,Not Criminal Justice Related,"S Belt Line Reconstruction Updates | Coppell, TX",Read the latest updates from the S Belt Line Reconstruction Project. Construction is expected to be completed in Spring 2023.,200,"Coppell, TX | Official Website","[""S Belt Line Reconstruction Updates""]",[],"[""Friday, March 8"", ""Friday, March 1"", ""Friday, February 23"", ""Friday, February 16"", ""Friday, February 9"", ""Friday, February 2"", ""Friday, January 26"", ""Friday, January 19"", """", ""Friday, January 12"", """", ""Friday, January 05"", ""Friday, December 22"", ""Friday, December 15"", ""Friday, December 8"", ""Friday, December 1"", ""Friday, November 16"", """", ""Friday, November 10"", """", ""Friday, November 3"", ""Friday, October 27"", ""Friday, October 20"", ""Friday, October 13"", """", ""Friday, October 6"", ""Friday, September 29"", """", ""Friday, September 22"", """", ""Friday, September 15"", ""Friday, September 1"", ""Friday, August 25"", """", ""Friday, August 18"", """", ""Friday, August 11"", """", ""Friday, August 4"", ""Friday, July 28, 2023"", ""Friday, July 14, 2023"", """", ""Friday, July 7, 2023"", """", ""Friday, June 30, 2023"", """", ""Friday, June 16, 2023"", """", ""Friday, June 9, 2023"", """", ""Friday, May 29, 2023"", """", ""Friday, May 19, 2023"", """", ""Friday, May 12, 2023"", """", ""Friday, May 5, 2023"", """", ""Friday, April 28, 2023"", """", ""Friday, April 21, 2023"", """", ""Friday, April 14, 2023"", """", ""Friday, April 7, 2023"", """", """", ""Friday, March 31, 2023"", """", ""Friday, March 24, 2023"", """", ""Friday, March 17, 2023"", """", ""Friday, March 3, 2023"", """", ""Friday, February 17, 2023"", """", ""Friday, February 10, 2023"", """", ""Friday, February 3, 2023"", """", ""Friday, January 20, 2023"", """", ""Friday, January 13, 2023"", """", ""Friday, January 6, 2023"", """", ""Friday, December 16, 2022"", """", ""Friday, December 9, 2022"", """", ""Friday, December 2, 2022"", """", ""Friday, November 25, 2022"", """", ""Friday, November 18, 2022"", """", ""Friday, November 11, 2022"", """", ""Friday, November 4, 2022"", """", ""Friday, October 28, 2022"", """", """", ""Friday, October 21, 2022"", """", """", ""Friday, October 14, 2022"", ""Friday, October 7, 2022"", ""Friday, September 30, 2022"", ""Friday, September 16, 2022"", ""Friday, September 9, 2022"", ""Friday, September 2, 2022"", ""Friday, August 26, 2022"", ""Friday, August 19, 2022"", ""Friday, August 12, 2022"", ""Friday, August 5, 2022"", ""Friday, July 29, 2022"", ""Friday, July 22, 2022"", ""Friday, July 15, 2022"", ""Friday, July 8, 2022"", ""Friday, July 1, 2022"", ""Friday, June 24, 2022"", ""Friday, June 17, 2022"", ""Friday, June 10, 2022"", ""Friday, June 3, 2022"", ""Friday, May 27, 2022"", ""Friday, May 20, 2022"", ""Friday, May 13, 2022"", ""Friday, May 6, 2022"", ""Friday, April 29, 2022"", ""Friday, April 22, 2022"", ""Friday, April 15, 2022"", ""Friday, April 8, 2022"", ""Friday, April 1, 2022"", ""Friday, March 25, 2022"", ""Friday, March 18, 2022"", ""Friday, March 11, 2022"", ""Friday, March 4, 2022"", ""Contact Us"", ""Loading""]","[""Public Works"", """", """"]",[],[],Skip to Main Content -1163,https://delcopa.gov/planning/pubs/delco2035economicdevelopmentplan.html,Not Criminal Justice Related,Not Criminal Justice Related,Delaware County 2035 Economic Development Plan,"",200,"Delaware County, Pennsylvania","[""Delaware County 2035 Economic Development Plan""]",[],"[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County 2035 Economic Development Plan Home / Departments / Planning Department / Publications / Delaware County 2035 Economic Development Plan Delaware County 2035 Economic Development Plan Date Published: March 2017 View PDF File [8.2mb] View Executive Summary [8.8mb] Abstract: The Economic Development Plan outlines a long-range, placed-based strategy that builds upon the unique features of Delaware County. It identifies trends in industry, employment, and housing that affect the markets of the twenty-first century and connects them to an action plan tailored to the different types of places. The plan emphasizes the importance of maintaining the unique sense of place across the County as communities address the changing needs of a twenty-first-century economy. This plan is a component of Delaware County 2035 , the County’s comprehensive plan, and directly correlates with Growing from Within , the County’s 10-year economic development strategy. Geographic Area: Countywide For more information or to order this report, contact the Department at 610-891-5200 or Planning_Department@co.delaware.pa.us . Planning Department Navigation Access the Data and Mapping Innovation Hub About Planning Calendar Current Projects Delaware County 2035 Demographic Data Development Review Forms Funding Green Space and Trails Project Mapping Municipal Programs & Initiatives Planning Education Publications Gina Burritt, Director Planning Department 2 W. Baltimore Avenue Suite 202 Media, PA 19063 Phone: 610-891-5200 Fax: 610-891-5203 Email: Planning_Department@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2023 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County 2035 Economic Development Plan Home / Departments / Planning Department / Publications / Delaware County 2035 Economic Development Plan Delaware County 2035 Economic Development Plan Home / Departments / Planning Department / Publications / Delaware County 2035 Economic Development Plan Delaware County 2035 Economic Development Plan Home / Departments / Planning Department / Publications / Delaware County 2035 Economic Development Plan " -1164,https://www.farmingtonmn.gov/government/departments/police/divisions/crime_scene_unit,Resources,Agency-Published Resources,Crime Scene Unit - City of Farmington,"",200,Just a moment...,"[""City of Farmington""]","[""Crime Scene Unit""]",[],[],[],[],"" -1165,https://cityofpowell.us/reports/auto-draft-91/07-2017-police-report/,Annual & Monthly Reports,Info About Agencies,"City of Powell, Ohio | 07.2017 Police Report","",200,"City of Powell, Ohio","[""07.2017 Police Report""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -1166,https://beaumonttexas.gov/beaumont-police-investigating-aggravated-robbery-grant-irving-intersection/,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -1167,https://www.roseville.ca.us/government/departments/police_department/contact_roseville_police/ride-_along_application,Poor Data Source,Poor Data Source,Ride-Along Application - City of Roseville,"",200,Just a moment...,"[""City of Roseville""]","[""Ride-Along Application""]","[""Roseville Police Department""]",[],[],[],"" -1168,https://www.stpaul.gov/departments/police/department-history,Not Criminal Justice Related,Not Criminal Justice Related,Department History | Saint Paul Minnesota,Saint Paul Police History The Saint Paul Police Department is proud of its rich history of service. The department has grown since its beginning in 1854 to,200,Home | Saint Paul Minnesota,"[""Department History""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""In This Section"", ""Saint Paul Police History"", ""Badges of the Police Department"", ""Vehicles of the Police Department"", ""Uniforms of the Department"", ""Links to the Past"", ""Footer""]","[""You are using an unsupported browser. Please use Microsoft Edge."", ""Contact The City"", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[],"" -1169,https://police.greenvillesc.gov/526/colonel-elias-earle-historic-district,Not Criminal Justice Related,Not Criminal Justice Related,"Colonel Elias Earle Historic District | Greenville, SC - Official Website","The district was named to the National Register of Historic Places in 1982, becoming Greenville’s second National Register District. Architecturally, the district is important because it contains two of Greenville’s earliest landmarks: the Earle Town House at 107 James Street, built about 1820; and ""Whitehall,"" at 310 West Earle Street, built in 1813 as the summer residence of Governor Henry Middleton. ",200,"Police Department | Greenville, SC - Official Website","[""Colonel Elias Earle Historic District""]",[],"[""Loading""]",[],[],[],"Skip to Main Content Government Departments Business Visitors Residents Search Home Residents History of Greenville Historic Districts in Greenville Colonel Elias Earle Historic District Colonel Elias Earle Historic District Another of Greenville's historic neighborhoods, known today as the Colonel Elias Earle District, is closely tied to the history of the Earle family. In the late 18th century, Colonel Elias Earle, an early settler of Greenville, acquired land to the north of town. In 1834 more acreage was purchased by the Earles along what is now known as James Street. The David family, who owned the Earle Town House from the 1850s through the 1920s, named the street and gave the easement for its construction. In the early decades of the 20th century, thanks in part to the Furman Company, this area began to develop, first with James Street and then along Earle Street. Two of Greenville's oldest landmarks, both dating back to the early 19th century, are located in the district, but it was the 1910s and the 1920s that saw a dramatic growth of the area as an in-town neighborhood. Spanish American War troops are shown in this 1898 photo, taken at a residence on Stone Avenue at Wilton Street, in the Elias Earle Historic District. The troops were part of the U.S. Camp Wetherill. Architecturally, the district is important because it contains two of Greenville's earliest landmarks: the Earle Town House at 107 James Street, built about 1820; and ""Whitehall,"" at 310 West Earle Street, built in 1813 as the summer residence of Governor Henry Middleton. Also of importance are many excellent examples of early 20th century historical revival styles including Neo-Classical, Dutch Colonial, Georgian Revival, English Cottage, and Tudor. The district is significant in community planning as an early automobile neighborhood. Originally part of the Colonel Elias Earle estate, the district was subdivided in the late 19th century. By the 1920s, construction was booming, with large houses being erected on large lots. Side driveways, rear garages, and porte cocheres all helped the neighborhood accommodate the automobile. Typical of early automobile suburbs, houses were set back from the road and had large, grassy front yards. The district was named to the National Register of Historic Places in 1982, becoming Greenville's second National Register District. In 1984, the neighborhood became the second locally designated Preservation Overlay District. Colonel Elias Earle Historic District East Park Avenue Historic District Hampton-Pinckney Historic District Heritage Historic District Overbrook Historic District Pettigru Historic District West End Historic District Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate " -1170,https://delcopa.gov/jdboard/pdfs/agenda_2021_12_21.pdf,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1171,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/010622summary.pdf,Daily Activity Logs,Info About Officers,"","",404,"","","","","","","","" -1172,https://www.harrisonburgva.gov/online-police-reporting-faq,Poor Data Source,Poor Data Source,"","",403,"","","","","","","","" -1173,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/bike-patrol.pdf,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -1174,https://edenny.gov/honoring-edens-police-chief-and-lieutenant/,Media Bulletins,Agency-Published Resources,"Honoring Eden’s Police Chief and Lieutenant | Town of Eden, New York","",200,"Town of Eden, New York | The Garden Spot of New York","[""Honoring Eden’s Police Chief and Lieutenant""]",[],[],"[""Contact Information""]",[],[],"Home Town of Eden Town Board Overview Agendas Minutes Meeting Recordings Legal Notices Town Board Members Employee/ Volunteer Resources Emergency Services Police Eden Emergency Squad Fire – Eden Fire – East Eden Departments Assessors Building Courts Dog Control Highway Recreation Town Clerk Boards Assessment Conservation Planning Recreation Advisory Zoning New Member Application Committees Code Review Disaster Preparedness Off-Road Drainage Library Review New Member Application Master Plan Town History Residents Eden Central Schools Eden Corn Festival Eden Library Garbage Management Resources Senior Citizen Services Volunteer Opportunities Businesses Overview Business Directory GIS Mapping Chamber of Commerce Business District Committee Calendar News Contact Contact & Directions Staff Directory Select Page Home Town of Eden Town Board Overview Agendas Minutes Meeting Recordings Legal Notices Town Board Members Employee/ Volunteer Resources Emergency Services Police Eden Emergency Squad Fire – Eden Fire – East Eden Departments Assessors Building Courts Dog Control Highway Recreation Town Clerk Boards Assessment Conservation Planning Recreation Advisory Zoning New Member Application Committees Code Review Disaster Preparedness Off-Road Drainage Library Review New Member Application Master Plan Town History Residents Eden Central Schools Eden Corn Festival Eden Library Garbage Management Resources Senior Citizen Services Volunteer Opportunities Businesses Overview Business Directory GIS Mapping Chamber of Commerce Business District Committee Calendar News Contact Contact & Directions Staff Directory Honoring Eden’s Police Chief and Lieutenant by Marlene Grunder | Aug 20, 2020 | Community , Town News The Town of Eden along with Congressman Jacobs, Legislator Mills and Mitch Martin from Senator Gallivan’s office had the opportunity to honor Eden’s longtime Police Chief and Lieutenant, Michael Felschow and John McCarthy respectively.  Chief Felschow has been serving the town for 46 years and has been Chief for the past 11.  He was presented the “Key to the Town” at the Town Board Meeting last Wednesday, August 12, 2020.  Lieutenant McCarthy has been with the Eden Police Department for just over 40 years.  The last 14 years he has served as Lieutenant.  Both men were given proclamations by the Town, United States Congress, New York State Senate and Erie County Legislature.  We thank both men for their commitment and dedication to the Town of Eden and wish them well in their retirement. Pictured (left to right): Mitch Martin (from Senator Gallivan’s office), Congressman Chris Jacobs, Councilman Byrnes, Councilwoman Wilhelm, Councilman Sam, Chief Michael Felschow, Lieutenant John McCarthy, Supervisor Hartman, Councilman Ventry and Legislator John Mills. Contact Information Eden Town Hall 2795 East Church Street Eden, New York 14057 (716) 992-3408 (716) 992-4131 (Fax) Town of Eden, NY © 2021 | Website Powered by SM-Blu Digital " -1175,http://www.longbeach.gov/police/press-releases/toddlers-found-alone--police-asking-for-help-in-determining-their-identity-and-locating-parents/,Media Bulletins,Agency-Published Resources,TODDLERS FOUND ALONE; POLICE ASKING FOR HELP IN DETERMINING THEIR IDENTITY AND LOCATING PARENTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/30/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: TODDLERS FOUND ALONE; POLICE ASKING FOR HELP IN DETERMINING THEIR IDENTITY AND LOCATING PARENTS Contact: Media Relations Detail (562) 570-5273 (Click on a photo to enlarge) Today at approximately 8:45 a.m., Long Beach police were dispatched to Atlantic Avenue and 60th Street after a passer-by saw two small children that were alone and called police. The children, both African-American boys, are approximately one and two years of age, and appear to be in good health.  The older child was found wearing a t-shirt, shorts and sandals, and the younger child was wearing a t-shirt and diaper. Witnesses in the immediate area were interviewed but no one was seen with the children or dropping them off.  The area was searched for any possible video but none was found.  A two-block area was also canvassed, however, no one recognizing the children was located. All law enforcement agencies in Los Angeles County, as well as the five surrounding counties have been notified, and area hospitals have been alerted.  The children have been turned over to the custody of the Department of Children and Family Services. Anyone who recognizes the children or has any information regarding their identity or the identity of their parents is urged to call Long Beach Police Communications at (562) 435-6711 or 9-1-1 if in the City of Long Beach. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1176,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/070121arrests.pdf,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -1177,https://www.florenceaz.gov/florence-police-department-citizen-academy/,Resources,Agency-Published Resources,Florence Police Department Citizen Academy – Town of Florence,"",200,Town of Florence,"[""Florence Police Department Citizen Academy""]","[""About the Author: Shaun Courtney""]","[""Visitors"", ""Events"", ""Business Information"", ""Services"", ""Town Departments"", ""News Categories"", ""Utilities""]","[""Town Council Work Session March 25, 2024"", ""Historic District Advisory Commission March 27, 2024"", ""Charles Whitlow Rodeo Grounds Advisory Board March 28, 2024"", ""Multi-Generational Center Open House"", ""Town Council Meeting April 1, 2024"", ""Dive into Summer Opportunities at Florence’s Aquatic Center Job Fair"", ""Major Equipment Upgrades Coming to Florence Fitness Center"", ""Florence’s Western Heritage Comes Alive: The 91st Annual Jr. Parada"", ""Share This Story, Choose Your Platform!"", ""Recent Posts""]",[],[],"" -1178,https://coloradosprings.gov/police-department/article/news/homicide-investigation-3200-block-heather,Media Bulletins,Agency-Published Resources,Homicide Investigation 3200 block of Heather Glen Drive | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Homicide Investigation 3200 block of Heather Glen Drive""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -1179,https://www.arlingtonva.us/government/projects/plans-studies/land-use/crystal-city-building-heights-study/process-scope-timeline,Media Bulletins,Agency-Published Resources,"Crystal City Building Heights Study: Process, Scope and Timeline – Official Website of Arlington County Virginia Government",ProcessThe study will be divided into four phases:Development of guidance to assist evaluation of building height impactsBuilding heights assessmentPolicy guidance updateZoning Ordinance amendmentCommunity engagement will be incorporated throughout the study process. The Long...,200,Home – Official Website of Arlington County Virginia Government,"[""Crystal City Building Heights Study: Process, Scope and Timeline""]","["""", ""Contact"", ""Events"", ""Subscribe""]","[""Process"", ""Scope"", ""Timeline"", ""CONTACT US"", ""QUICK LINKS"", ""CONNECT"", ""STAY INFORMED""]","[""Media""]",[],[],opens in new tab or window -1180,https://cityofspoonerwi.gov/spooner-police-ordinances/,Resources,Agency-Published Resources,"Spooner Police Ordinances - City of Spooner, Wisconsin - Crossroads of the North","",200,"Home - City of Spooner, Wisconsin - Crossroads of the North","[""Spooner Police Ordinances""]",[],"[""Spooner Police Department""]","[""Ordinance Number"", ""Standard Office Hours"", ""Summer Hours""]",[],[],"" -1181,https://www.antioch.il.gov/wpfb-file/01-17-12-police-and-fire-agenda-pdf-3/,Poor Data Source,Poor Data Source,"01-17-12 Police And Fire Agenda - Antioch, IL",9072 01 17 12 police and fire agenda pdf commissions commission agendas 2012 1326484492 217183b94f59e5f5ad44921de1bc893f 213x300 _sn5tggobfiam thumb jpg 13 14 54 52 0 pdf application trustees dennis b crosby scott a pierce mary c dominiak ted p poulos jay jozwiak george sakas lawrence m hanson mayor candi l rowe village clerk notice of public,200,"Home - Antioch, IL","[""01-17-12 Police And Fire Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -1182,https://www.sandyspringsgapolice.gov/chatcomm911/,Resources,Agency-Published Resources,ChatComm911 – Sandy Springs Police Department,"",200,Sandy Springs Police Department,"[""ChatComm911""]","[""Smart911""]",[],[],[],[],Emergency: Dial 911 | Non-Emergency: Phone Directory | Police Reports | Events Emergency: Dial 911 | Non-Emergency: Phone Directory | Police Reports | Events Menu Menu About SSPD Police Chief Command Staff Districts Careers with SSPD Contact Us Visit Police HQ Higher Learning Statement on Use of Force & Community Engagement SSPD Most Wanted In Memoriam Sandy Springs Police Benevolent Fund SSPD’s Social Media Policy Divisions and Units Patrol Division Special Operations Division Criminal Investigation Division Administration Division Intelligence and Technology Division Internal Affairs Training and Background Unit Property & Evidence Unit Specialized Units North Metro S.W.A.T. Quick Response Force Street Crimes Unit K-9 Unit Traffic Traffic Response Vehicle Bicycle Patrol CSI Unit Crisis Negotiation Team River Patrol Unit Honor Guard Drone Program Community Part Time / Reserve Officers Task Forces Organizational Chart Citizen Services Alarm Information Alcohol Pouring Permits Apartment Safety Checker ChatComm911 Criminal History Reports and Record Restrictions Event Map ⤤ Domestic Violence Resources Home and Business Checks Mental Health & Substance Abuse Municipal Court Off-Duty Officer Requests Open Records Requests Police Reports Report a Crime & Crime Tips Sex Offender Registry Vehicle Release VIN Verification Weapons Carry License Crime Prevention Crime Statistics Neighborhood Watch Home and Business Security Citizen Participation SSPD Events Citizens Police Academy (CPA) Women’s Self Defense Classes Handgun Safety Class Volunteer Programs Citizens On Patrol (COPS) Law Enforcement Explorers Youth Program Internship Program VIPS (Volunteers in Police Service) Chaplains Program Camera Registry Program Menu About SSPD Police Chief Command Staff Districts Careers with SSPD Contact Us Visit Police HQ Higher Learning Statement on Use of Force & Community Engagement SSPD Most Wanted In Memoriam Sandy Springs Police Benevolent Fund SSPD’s Social Media Policy Divisions and Units Patrol Division Special Operations Division Criminal Investigation Division Administration Division Intelligence and Technology Division Internal Affairs Training and Background Unit Property & Evidence Unit Specialized Units North Metro S.W.A.T. Quick Response Force Street Crimes Unit K-9 Unit Traffic Traffic Response Vehicle Bicycle Patrol CSI Unit Crisis Negotiation Team River Patrol Unit Honor Guard Drone Program Community Part Time / Reserve Officers Task Forces Organizational Chart Citizen Services Alarm Information Alcohol Pouring Permits Apartment Safety Checker ChatComm911 Criminal History Reports and Record Restrictions Event Map ⤤ Domestic Violence Resources Home and Business Checks Mental Health & Substance Abuse Municipal Court Off-Duty Officer Requests Open Records Requests Police Reports Report a Crime & Crime Tips Sex Offender Registry Vehicle Release VIN Verification Weapons Carry License Crime Prevention Crime Statistics Neighborhood Watch Home and Business Security Citizen Participation SSPD Events Citizens Police Academy (CPA) Women’s Self Defense Classes Handgun Safety Class Volunteer Programs Citizens On Patrol (COPS) Law Enforcement Explorers Youth Program Internship Program VIPS (Volunteers in Police Service) Chaplains Program Camera Registry Program -1184,https://delcopa.gov/publicrelations/releases/2021/mailballotrequestdeadline.html,Media Bulletins,Agency-Published Resources,"Municipal Election Vote-by-Mail Ballot Request Deadline is Tuesday, October 26 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Municipal Election Vote-by-Mail Ballot Request Deadline is Tuesday, October 26""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -1185,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0204/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -1186,https://www.dps.nm.gov/blog/2022/03/05/update-3-nmsp-investigates-fatal-crash-on-i-25-involving-the-santa-fe-police-department-during-pursuit-of-carjacking-and-kidnapping-suspect/,Media Bulletins,Agency-Published Resources,UPDATE 3: NMSP Investigates Fatal Crash on I-25 Involving the Santa Fe Police Department During Pursuit of Carjacking and Kidnapping Suspect - NM Department of Public Safety,"",200,Home - NM Department of Public Safety,"[""UPDATE 3: NMSP Investigates Fatal Crash on I-25 Involving the Santa Fe Police Department During Pursuit of Carjacking and Kidnapping Suspect""]",[],"[""Location"", ""Sitemap"", ""Quick Links"", ""Social Media Links""]",[],[],[],"Manage Cookie Consent We use cookies to optimize our website and our service. Functional Functional Always active The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network. Preferences Preferences The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user. Statistics Statistics The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you. Marketing Marketing The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes. Manage options Manage services Manage {vendor_count} vendors Read more about these purposes Accept Deny Preferences Save preferences Preferences Cookie Policy Privacy Statement {title} Manage Cookie Consent We use cookies to optimize our website and our service. Functional Functional Always active The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network. Preferences Preferences The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user. Statistics Statistics The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you. Marketing Marketing The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes. Manage options Manage services Manage {vendor_count} vendors Read more about these purposes Accept Deny Preferences Save preferences Preferences Cookie Policy Privacy Statement {title} Manage Cookie Consent Manage Cookie Consent " -1187,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0481/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -1188,https://delcopa.gov/planning/education/plannersportfolios/plannersportfolioaginginplace.html,Not Criminal Justice Related,Not Criminal Justice Related,Planner’s Portfolio: Aging In Place,"",200,"Delaware County, Pennsylvania","[""Planner’s Portfolio: Aging In Place""]",[],"[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Planner’s Portfolio: Aging In Place Home / Departments / Planning Department / Planner's Portfolios / Planner’s Portfolio: Aging In Place The 16th issue in the Planner’s Portfolio series explores the concept of Aging in Place, or helping people remain in their communities as they age. Aging-in-Place is the idea that people should be able to remain in their existing homes or communities even as they age and their needs change. According to census data, the population of people 65 and older in Pennsylvania has grown at a much faster rate than the general population in the past 5 years, and is expected to keep growing. This means significant portions of the population will have changing needs and demands in the years ahead. There are issues that municipalities should be aware of and steps they can take to ensure that their older residents feel safe, welcome, and engaged. This Planner’s Portfolio looks at issues related to aging-in-place and provides recommendations for creating “age-friendly” communities. It focuses on the topics of housing, mobility, public spaces and parks, and social opportunities and civic engagement. For example, housing is particularly important to aging populations. Age-friendly communities offer a variety of affordable, safe, and accessible housing options. Zoning can facilitate aging-in-place by allowing for a variety of housing types from large managed care facilities to accessory dwelling units in rear yards. New construction can be encouraged to utilize the “Universal Design” concept, which encourages design usable by everyone, regardless of age or ability. For more information, check out the Aging In Place issue or the entire Planner’s Portfolio series . Planning Department Navigation Access the Data and Mapping Innovation Hub About Planning Calendar Current Projects Delaware County 2035 Demographic Data Development Review Forms Funding Green Space and Trails Project Mapping Municipal Programs & Initiatives Planning Education Publications Gina Burritt, Director Planning Department 2 W. Baltimore Avenue Suite 202 Media, PA 19063 Phone: 610-891-5200 Fax: 610-891-5203 Email: Planning_Department@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2023 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play " -1189,https://www.mass.gov/doc/boston-police-department-drug-test-appeals-related-superior-court-decision-8222/download,Misc Police Activity,Police & Public Interactions,"","",200,"","","","","","","","" -1190,https://www.montgomerycountymd.gov/ccm/mcpolicebeat.html,Media Bulletins,Agency-Published Resources,MC Police Beat,"Director of the Office of Public Information Patrick Lacefield, discusses current issiues with Chief Tom Manger.",200," - Montgomery County Maryland -","[""County Cable Montgomery Comcast/RCN 6 HD 996/1056 Verizon 30""]","[""MCP Beat"", ""Trending videos""]","[""MC Police Beat"", ""Connect with CCM!"", ""Key Links"", ""Social Media"", ""Subscribe for updates"", ""Featured Video""]","[""CCM Programming"", ""Programs"", ""Programs"", ""Programs""]","[""By Subject""]","[""eSubscription"", ""Stay Informed"", ""Policies"", ""Translation""]","Skip to main content County Cable Montgomery Comcast/RCN 6 HD 996/1056 Verizon 30 about | programs | openGov | contact none facebook none twitter none instagram none youtube COBuser none youtube montgomerycounty none podcast County | LIVE Toggle Navigation openGov openGov Page Executive Events Special Events Council Meetings Council Sessions Audit Committee ECON Committee Education Committee Evening Hearings GO Committee HHS Committee Liquor Control PHP Committee Public Safety State Delegation Transportation Committee Programs CCM Programming Programs Page Featured A Closer Look Acontecimientos Bottom Line Capsula Informativa Check Us Out Consumer Compass Council In Brief Council Wrap Up County Report Did You Know Programs En Sintonia Healthy Montgomery Hidden Treasures Home Front In the Loop Linea Directa Made In Montgomery Make A Difference MoCo Storyboard Montgomery Al Dia Montgomery Heartland MC Reimagined Programs Mosaic MTA Connections My Green MC No Boundaries One on One Parks Rec N Roll Paths to the Present Plan In MC 50+ Montgomery County Somos Montgomery Tertulia Town Halls Programs What's Brewin' Young MC By Subject Business Diversity Events Language People Places Public Affairs All Progams About Background FAQs Staff Producers Awards Contact Links County Executive Council Broadband Programs TEBS Community Technology PEG TV HashTags Program Schedule Search Search String Search County Executive Marc Elrich MENU CLOSE CCM Live Meetings Programs Schedule Featured About FAQs Social Media Contact MC Police Beat Unfortunately, an error occurred: montgomerycountymd • 3.1K Subscribers • 4.7K Videos • 782K Views MC Police Beat MCP Beat Director of the Office of Public Information Patrick Lacefield, discusses current issiues with Montgomery County Police Chief Tom Manger. Program airs on Comcast ch 6, 996 (HD), RCN ch 6, 1056 (HD), and Verizon ch 30 at the following times: Sun - (9:30pm) | Mon - (7:45pm) | Tues - (10:30pm) | Thurs - (12:15pm, 9:15pm, 10:00pm) | Fri (2:00am, 12:30pm) | Sat - (4:30pm). Trending videos Executive Special Events Council Sessions Council Proclamations What's Happening MoCo Podcast 404 error Connect with CCM! Facebook Twitter Instagram Google Plus YouTube YouTube Key Links Home About Awards Schedule Programming openGov Featured FAQs Comm Tech TEBS CoMo HashTags Staff Contact Social Media Facebook Twitter Instagram Google Plus YouTube YouTube Subscribe for updates Keep up with County Cable Montgomery Subscribe Featured Video Background Image is Rockville eSubscription Email Subscribe Sign up for a newsletter or update your subscription preferences. Stay Informed Awards Contact Us County Cable Montgomery Social Media Directory Employment Opportunities Employee Directory Policies Privacy Policy User Rights Accessibility Language Translations Social Media County Code Translation The Google Translate Tool is displayed dynamically on Montgomery County web pages using a Google javascript function. The function is used to translate County web pages into different languages. However, the Google function displays a drop-down menu form field (with no label) and a Google logo image which has no alt tag. Google is aware of this issue. Copyright 2024 Montgomery County Government - All Rights Reserved. Go Top " -1191,https://southamptontownnypolice.gov/faq.aspx?qid=546,Resources,Agency-Published Resources,FAQs • Where can I report injured wildlife animals?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Citizens' Response Center""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1192,https://southamptontownnypolice.gov/187/youth-advisory-committee,Resources,Agency-Published Resources,"Youth Advisory Committee (YAC) | Southampton, NY - Official Website",Learn about the responsibilities of the Youth Advisory Committee.,200,"Police | Southampton, NY - Official Website","[""Youth Advisory Committee (YAC)""]",[],"[""Site Tools"", ""Contact Us"", """", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Housing and Community Services Youth Bureau Programs & Services Youth Advisory Committee Youth Advisory Committee (YAC) This local group of middle & high school youth assists in planning Youth Bureau programs and events, and participates in community service projects.  Meetings are held every other Tuesday from 6:30pm – 8:00pm at the Hampton Bays Community Center. Some meetings are held virtually. Contact Us DAVID W. CROHAN COMMUNITY CENTER (Lower Level) 655 Flanders Rd, Flanders, NY 11901 Ph: 631-702-2425 Tracy Kolsin, LCSW Youth Services Coordinator Staff Directory Join Our Mailing List Broader Horizons Community Collaborations DUNE (Drug Use Never Empowers) East End Partnership for Youth Riverhead CAP Coalition - SAFE in Sag Harbor Special Events Seasonal Programs Youth Board Youth Advisory Committee Youth Court Youth and Family Counseling and Support Youth & Government Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -1193,https://delcopa.gov/vote/news/20emergencyabsenteeballots.html,Not Criminal Justice Related,Not Criminal Justice Related,"Information on Emergency Absentee Ballots - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Information on Emergency Absentee Ballots""]",[],"[""Delco Votes!"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Emergency Absentee Ballots"", ""Important Notice""]",[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Information on Emergency Absentee Ballots Home / Elections / Elections News / Information on Emergency Absentee Ballots Emergency Absentee Ballots Emergency status is determined for voters who must vote by absentee ballot because of a disability or absence from their municipality that was not and could not have been known prior to the Tuesday before the election (which is the deadline to apply for a regular absentee or mail-in ballot). Emergency Absentee Ballot Applications are available at all Delaware County Voter Service Centers and online. A link to the emergency absentee ballot application form can be found on the DOS website here: https://www.votespa.com/Resources/Documents/ PADOS_EmergencyAbsenteeBallotApplication_English.pdf Emergency Absentee Ballot Applications should be submitted to the County Board of Elections at the Voter Service Center in the Government Center Annex of the Delaware County Courthouse, 201 W. Front Street, Media. The deadline to submit an Emergency Absentee Ballot Application is 8:00 pm on Election Day. Important Notice To designate an authorized representative to deliver your Emergency Absentee Ballot, you should complete and sign the Authorization for a Representative to Pick Up or Return Absentee Ballot form, available at all Delaware County Voter Service Centers and online. A link to the disabled voter authorization form for an emergency absentee ballot can be found on the DOS website here: https://www.votespa.com/Resources/Documents/ PADOS_AuthorizeRepresentativeforEmergencyAbsenteeBallot.pdf Delco Votes! Home Election News & Notices Voter Registration Sample Ballots Election Calendar Voter Resources Poll Worker Resources Candidate Resources Military & Overseas Where to Vote In-Person Ballot Drop Box Locations Vote-by-Mail Ballots Voter Service Centers FAQ Election Hotline Election Results About Us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Information on Emergency Absentee Ballots Home / Elections / Elections News / Information on Emergency Absentee Ballots Information on Emergency Absentee Ballots Home / Elections / Elections News / Information on Emergency Absentee Ballots Information on Emergency Absentee Ballots Home / Elections / Elections News / Information on Emergency Absentee Ballots " -1194,https://www.antiochca.gov/police/alarm-registration/,Resources,Agency-Published Resources,"Alarm Registration – City of Antioch, California","",200,"City of Antioch, California",[],"[""Contact Info""]","[""Alarm Registration""]","[""Send Message""]","[""Brian Addington"", ""Acting Chief of Police"", ""Captain Morefield"", ""Field Services"", ""Lt. Mellone"", ""Professional Standards""]",[],"" -1195,https://coloradosprings.gov/police-department/article/news/recovered-property-february-2021,Media Bulletins,Agency-Published Resources,Recovered Property: February 2021 Investigation | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Recovered Property: February 2021 Investigation""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -1196,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0868/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -1197,https://delcopa.gov/hcd/pdfs/leadinformationforhomeowners.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1198,https://www.sandiego.gov/department-document/police-identify-attempted-murder-victim-oak-park,Media Bulletins,Agency-Published Resources,Police Identify Attempted Murder Victim In Oak Park | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Police Identify Attempted Murder Victim In Oak Park"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -1199,https://ci.san-bernardino.ca.us/news/archived_news/downtown_specific_plan_scoping_meeting,Not Criminal Justice Related,Not Criminal Justice Related,Downtown Specific Plan Scoping Meeting - City of San Bernardino,"",200,Just a moment...,"[""City of San Bernardino California""]","[""Downtown Specific Plan Scoping Meeting""]",[],[],[],[],Skip to Content -1200,https://springfield-or.gov/coffee-with-a-cop-scheduled-for-afternoon-on-november-4th/,Media Bulletins,Agency-Published Resources,"","",-1,"","","","","","","","" -1201,https://alpha.austin.gov/police-oversight/2020-08-17/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1202,https://coloradosprings.gov/police-department/article/news/update-homicide-investigation-200-block-e,Incident Reports,Police & Public Interactions,Update - Homicide Investigation: 200 Block of E. Arvada Street | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Update - Homicide Investigation: 200 Block of E. Arvada Street""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -1203,https://normandyparkwa.gov/police-services/,Media Bulletins,Agency-Published Resources,Police Services - City of Normandy Park,"The Normandy Park Police Department provides 24 hours a day, 7 days a week patrol and emergency response service to approximately 6,500 citizens ...",200,City of Normandy Park,"[""Police Services""]","["""", ""Serving approximately 6,500 citizens over 2.5 square miles"", ""Police News & Updates"", ""TOYS FOR TOTS"", ""Normandy Park Paws on Patrol"", ""Normandy Park February Blood Drive"", ""February Blood Drive"", ""Steering Wheel Locks!"", """", """", """", ""Police Blotter & Reports"", ""Unclaimed & Recovered Property"", ""Common Questions"", ""Receive news & updates"", ""Success!"", ""Subscribe To Our Newsletter"", ""You have Successfully Subscribed!""]","[""Reserve Officers Unit"", ""Blood Drive"", ""Blood Drive"", ""Services"", ""Concealed Pistol Licenses"", ""Fingerprinting"", ""Contacts""]","[""Normandy Park City Hall"", ""City Hall Hours""]","[""Interested in a law enforcement career""]",[],"" -1204,https://www.southamptontownnypolice.gov/1557/southampton-sustainability-drawdown-east,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1205,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_releases/police_investigate_1993_john_doe_case,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -1206,https://www.roundrocktexas.gov/wp-content/uploads/2020/02/rrpd_police_patch.png,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1207,https://police.greenvillesc.gov/faq.aspx?qid=546,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • How are the submissions judged?,"",200,"Police Department | Greenville, SC - Official Website",[],"[""▼ Greenlink Art Contest""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -1208,https://southamptontownnypolice.gov/891/dune-road-reconstruction,Not Criminal Justice Related,Not Criminal Justice Related,"Dune Road Reconstruction | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Dune Road Reconstruction""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Town Studies & Reports Reports Dune Road Reconstruction Dune Road Reconstruction Dune Road Reconstruction October 2012 (PDF) 2017 Beach Monitoring Report BECD Control Districts Dune Road Reconstruction Golf at the Bridge Hampton Bays Hamlet Mixed Use PDD Study Marihuana Regulation and Taxation Act (“MRTA”) Sebonack Golf Course Southampton Community Microgrid Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Town Studies & Reports Reports Dune Road Reconstruction Dune Road Reconstruction Dune Road Reconstruction October 2012 (PDF) 2017 Beach Monitoring Report BECD Control Districts Dune Road Reconstruction Golf at the Bridge Hampton Bays Hamlet Mixed Use PDD Study Marihuana Regulation and Taxation Act (“MRTA”) Sebonack Golf Course Southampton Community Microgrid Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -1209,http://www.ryepolice.us/./pressrelease,Media Bulletins,Agency-Published Resources,Rye Police Department Press Releases - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Press Releases""]","[""Hiring Police Officer"", ""Town of Rye Hiring Part Time Seasonal Parking Enforcement"", ""Hiring Animal Control Officer"", ""Vaccination Clinic"", ""Stolen F-350 with Dump Trailer""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"­ Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Press Releases Home Press Releases Hiring Police Officer April 14, 2022 In Press Releases Town of Rye, New Hampshire -Police Officer Full Time -Posting -  - -The Town of Rye New Hampshire is accepting applications for the position of full-time Police Officer. The applicant may be certified as a full-time police officer or have received a passing score on a test administered by Great Bay ... Learn More Town of Rye Hiring Part Time Seasonal Parking Enforcement March 11, 2022 In Announcements , Press Releases Part Time Parking Enforcement  - -The Town of Rye New Hampshire is now accepting applications for the position of part time seasonal Parking Enforcement. - -  - -Job Summary - -The position of Parking Enforcement Officer is normally staffed by a civilian employee that reports directly to the P ... Learn More Hiring Animal Control Officer January 16, 2022 In Press Releases The Town of Rye New Hampshire is now accepting applications for the position of part time Animal Control Officer. - -Job Summary - -Enforces State laws and municipal ordinances pertaining to the regulation and control of dogs and other regulated animals, which involves the investigation of complaint ... Learn More Vaccination Clinic September 8, 2021 In Press Releases Time: 8:00am - 1:00pm   Location: Wallis Sands State Park - -Time: 2:00pm - 7:00pm   Location: Rye Public Safety Building, 555 Washington Road - - Free of charge - Walk in - no appointment is necessary! - All three manufactured vaccines will be available - -This is a terrific and conveni ... Learn More Stolen F-350 with Dump Trailer May 10, 2021 In Press Releases On the morning of 5/10/2021, the Rye Police Department took an auto theft report from a South Rd resident. It was discovered that sometime overnight, a black 1997 Ford F-350 truck (NH 4770211), along with a utility dump trailer (NH T623011) were stolen. If anyone has information regarding these vehi ... Learn More 1 2 3 4 5 6 … 12 Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers " -1210,https://www.waterloo.il.us/departments/police-department/,Media Bulletins,Agency-Published Resources,"Police Department - City of Waterloo, IL","",200,"Home Page - City of Waterloo, IL","[""Police Department""]",[],"[""Mission Statement"", ""D.A.R.E. Program"", ""Domestic Violence Program"", ""Waterloo’s Emergency Notification System"", ""Contact Us""]","[""Departments"", ""About the Department"", ""Additional Resources"", ""Police Chief""]",[],[],"" -1211,https://townofspringfield.colorado.gov/police-department-9,Resources,Agency-Published Resources,Home | Town of Springfield,"",200,Home | Town of Springfield,"[""Town of Springfield""]","[""Events"", ""News"", ""Live Feed"", ""Find Us"", ""Stay Connected""]",[],[],[],[],"Skip to content Town of Springfield Menu Translate Translate Search Skip Gallery End of Gallery Municode contact us! Pay my utility bill pay my court/traffic payment Events See All Events Apr 2 7:00 AM — 7:00 PM Town of Springfield Regular Municipal Election Apr 2 Apr 11 6:00 PM — 8:00 PM Board of Trustees Regular Meeting Apr 11 May 9 6:00 PM — 8:00 PM Board of Trustees Regular Meeting May 9 May 27 All Day TOWN OF SPRINGFIELD CLOSED: MEMORIAL DAY May 27 News 2024 Town of Springfield Municipal Election TOWN OF SPRINGFIELD REGULAR MUNICIPAL ELECTION APRIL 2, 2024 The Town of Springfield Regular Municipal Election will be held on Tuesday, April 2, 2024. The Election will b... New Mobile App! We're thrilled to announce the new app for the Town of -Springfield! It's everything Town of Springfield, in your -pocket. -
 - With the new app, you can access documents, event... About our Town Springfield is located in the southeastern corner of the State of Colorado, approximately 1,500 miles from either coast, 30 miles from Kansas, 30 miles from Oklahoma, and halfway ... Surveying Town Water Lines You may have noticed markings on the streets throughout town like the ones pictured below. These are a part of the first step of surveying town water lines in the construction of ... See All Posts Live Feed Town of Springfield 2 days ago The Town of Springfield Landfill will be closed today March 23, 2024 due to high winds. Town of Springfield 5 days ago We have been receiving an increase in phone calls requesting contact information for businesses in the Town of Springfield. Cause of this we have come to the realization that we ei... Read More Town of Springfield 11 days ago The Town of Springfield Board of Trustees will hold its Regular Meeting on March 14, 2024 at 6:00 p.m.. The agenda is linked here: ...https://5il.co/2gj... Read More Town of Springfield 26 days ago TOWN OF SPRINGFIELD RESIDENTS: The towns main water well has been repaired and you can resume water usage. Thank you for your cooperation. Town of Springfield 27 days ago UPDATE: The water usage restriction has been extended until the morning of Thursday, February 29, 2024. Please only use water for essential house hold use. NO WATERING LAWNS, TREES... Read More See All Posts Find Us Town of Springfield 748 Main St. Springfield, CO 81073 Phone: (719) 523-4528 Fax: (719) 523-6956 tnewman@springfieldco.gov/srobins@springfieldco.gov Stay Connected New to town? Check out our New Resident Information Page! Copyright © 2024 Town of Springfield. All rights reserved. Powered By Thrillshare " -1212,https://ose.louisiana.gov/event/police-lieutenant-10/,Poor Data Source,Poor Data Source,Police Lieutenant | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Police Lieutenant""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Police Lieutenant Promotional Level Application Deadline TBD Jurisdiction Franklin Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Police Lieutenant Promotional Level Application Deadline TBD Jurisdiction Franklin Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Lieutenant Promotional Level Application Deadline TBD Jurisdiction Franklin Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Lieutenant Promotional Level Application Deadline TBD Jurisdiction Franklin This event has passed. Police Lieutenant Promotional Level Application Deadline TBD Jurisdiction Franklin This event has passed. Police Lieutenant Promotional Level Application Deadline TBD Jurisdiction Franklin This event has passed. Police Lieutenant Promotional Level Promotional Level Promotional Level Application Deadline TBD Jurisdiction Franklin Application Deadline TBD Jurisdiction Franklin Application Deadline TBD Jurisdiction Franklin Application Deadline TBD Application Deadline Jurisdiction Franklin Jurisdiction Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -1213,https://coloradosprings.gov/police-department/article/news/seeking-community-assistance,Media Bulletins,Agency-Published Resources,Seeking Community Assistance | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Seeking Community Assistance""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -1214,https://coloradosprings.gov/police-department/article/news/homicide-investigation-2001-e-platte-ave,Media Bulletins,Agency-Published Resources,Homicide Investigation 2001 E Platte Ave | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Homicide Investigation 2001 E Platte Ave""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -1215,https://alpha.austin.gov/en/police-oversight/2020-06-08-6/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1216,http://lafayettepolice.us/9/how-do-i,Not Criminal Justice Related,Not Criminal Justice Related,"How Do I... | Lafayette, IN - Official Website",Obtain access to frequently requested pages and information.,200,"Police Department | Lafayette, IN - Official Website","[""How Do I...""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]","[""Access"", ""Apply For"", ""Contact"", ""Find"", ""Sign Up For"", ""Submit"", ""Visit""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home How Do I... How Do I... 9 2 3 3 Access Buycrash.com Community Photos Crime Prevention Tip of the Month FAQs Fire Department Recruitment Process Fugitive Search Merit Award Recipients Online Forms Police Department Recruitment Process Apply For Permits & Licenses Dumpster Permit Employment Opportunities Contact Business Directory City Departments Staff Directory Find Apartment Safety Carbon Monoxide Detectors Home Emergency Plans Live Council Meetings LPD Memorial Wall Police Honor Guard Sign Up For Celebration Package Citizen's Academy Notifications Programs Ride-Along Splash Bash Package Youth Fire Setter Program Parks & Recreation Event and Program Registration Submit Parking Citation Payments Online Utility Payments Police Department Compliments & Concerns Street Light Outages Star City Customer Service Award Nomination Report an Issue Visit Fire Stations Kids Links & Safety Fun Memorial Island Parks & Facilities Access Buycrash.com Community Photos Crime Prevention Tip of the Month FAQs Fire Department Recruitment Process Fugitive Search Merit Award Recipients Online Forms Police Department Recruitment Process Apply For Permits & Licenses Dumpster Permit Employment Opportunities Contact Business Directory City Departments Staff Directory Find Apartment Safety Carbon Monoxide Detectors Home Emergency Plans Live Council Meetings LPD Memorial Wall Police Honor Guard Sign Up For Celebration Package Citizen's Academy Notifications Programs Ride-Along Splash Bash Package Youth Fire Setter Program Parks & Recreation Event and Program Registration Submit Parking Citation Payments Online Utility Payments Police Department Compliments & Concerns Street Light Outages Star City Customer Service Award Nomination Report an Issue Visit Fire Stations Kids Links & Safety Fun Memorial Island Parks & Facilities Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -1217,https://www.hickoryhillspd.us/2018/10/police-chief-announces-his-retirement/,Media Bulletins,Agency-Published Resources,Police Chief Announces His Retirement,"",200,"Error retrieving title: HTTPSConnectionPool(host='www.hickoryhillspd.us', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1129)')))","[""Police Chief Announces His Retirement""]","["""", ""Post navigation""]",[],"[""Report a Concern"", ""Investigative Tip Line"", ""Hot Links"", ""Contact Information""]",[],[],"Skip to content Menu HOME WHAT’S NEW CRIME ALERTS SECURITY ASSESSMENT ANNUAL REPORT Police Chief Announces His Retirement HHPD October 26, 2018 June 25, 2021 For the last forty two years I have had the honor and privilege of serving the City of Hickory Hills in the capacity of a Police Officer. The last seventeen years of which I have served in the position of Chief of Police. The experiences and opportunities that this position provided to me during this time period were immeasurable and extremely rewarding. I have also had the pleasure of working for, and with, many employees and City Council members that have consistently displayed the best interests of the City and its residents. In my opinion, working in the Law Enforcement Profession for the City of Hickory Hills was the best job I could possibly ask for and I consider myself to be extremely fortunate. Therefore, it is with mixed emotions that I inform you of my intention to retire effective December 1, 2018. I can’t say enough about the two Mayors I served under as Chief of Police. Both Jack Faddis and Michael Howley allowed me to do my job as I saw fit and supported me in my leadership decisions. Their direction and vision enabled me to create an atmosphere and philosophy conducive to effective law enforcement that transcends throughout the Department. In essence, they made my job easier! The improvement of community relations and quality of life has always been at the forefront of my patrol level and management level approaches to policing. In conclusion, I want to thank you from the bottom of my heart for all your support throughout my last forty two years of service to the City I call home. Respectfully, Chief of Police Alan T. Vodicka Posted in Chief's Message Post navigation Prev Hickory Hills Park District Bike Rodeo Next New Hickory Hills Police Chief Sworn In Report a Concern To register for overnight parking, file a vacation watch for your home or file a condition report, click here . Investigative Tip Line Call 708-295-9313 for crimes and suspicious circumstances. (Not for ordinance issues) Hot Links Hickory Hills Times 95th Street and Roberts Road Crash Statistics Red Light Camera Statistics Mission Statement CodeRED Emergency Notification Application Satisfaction Survey School Zones Employment Pension Minutes Frequently Asked Questions Links Contact Contact Information We are open and staffed 24/7, 365 days a year and always available for walk-in service. Emergency Please call 911 Non-emergency Please call 708-598-1313 Records division Please call 708-598-4900 Email for general information ieenigenburg@hickoryhillspd.us Email for traffic issues mfranks@hickoryhillspd.us Contents Copyright © Hickory Hills Police Department. Menu HOME WHAT’S NEW CRIME ALERTS SECURITY ASSESSMENT ANNUAL REPORT HOME WHAT’S NEW CRIME ALERTS SECURITY ASSESSMENT ANNUAL REPORT " -1218,https://mukilteowa.gov/news/mukilteo-police-brings-awareness-to-domestic-violence/,Media Bulletins,Agency-Published Resources,"City of Mukilteo - | Mukilteo Police Brings Awareness to Domestic Violence - City of Mukilteo","",200,403 Forbidden,"[""Mukilteo Police Brings Awareness to Domestic Violence""]","[""Sign up for notifications""]",[],[],[],[],COVID-19 Alert - City of Mukilteo Response COVID-19 Alert - City of Mukilteo Response -1219,https://www.desmoineswa.gov/departments/police/programs_services/his_victim_notification_program,Resources,Agency-Published Resources,"ICE & HSI Victim Notification Program - City of Des Moines, WA","",200,Just a moment...,"[""City of Des Moines, WA""]","[""ICE & HSI Victim Notification Program""]",[],[],[],[],Skip to Content -1220,https://www.arlingtontx.gov/news/my_arlington_t_x/news_stories/police_chief_community_welcome,Media Bulletins,Agency-Published Resources,Arlington to Host Community Event Jan. 25 to Welcome New Chief of Police Al Jones - City of Arlington,"",200,Just a moment...,"[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Arlington to Host Community Event Jan. 25 to Welcome New Chief of Police Al Jones""]",[],[],[],[],Skip to Content Skip to Content -1221,https://www.austintexas.gov/blog/austin-green-business-leader-featured-member-st-andrews-episcopal-school,Not Criminal Justice Related,Not Criminal Justice Related,Austin Green Business Leader | Featured Member: St. Andrew’s Episcopal School | AustinTexas.gov,You may have heard of the Austin Green Business Leader program but perhaps are still unsure of how the program works or who the members are. We’ll be featuring different members throughout the year to introduce the great businesses helping make Austin an even better place to live and do business!,200,Home | AustinTexas.gov,"[""Austin Green Business Leader | Featured Member: St. Andrew’s Episcopal School""]","[""Action Navigation"", ""GTranslate"", ""Main menu"", ""Frequently Viewed Departments"", ""Sustainable Austin Blog"", ""Share"", ""About this blog"", ""Tags"", ""Archives"", ""Pagination"", ""Footer Menu"", ""Second Footer Menu""]","[""Resident"", ""Business"", ""Government"", ""Departments"", ""Connect"", ""Austin Green Business Leader | Featured Member: St. Andrew’s Episcopal School"", """", ""Who is St. Andrew's Episcopal School?"", ""What makes them a Green Business Leader?"", ""Is your business a green business?"", ""2024 February"", ""2024 February"", ""2024 January"", ""2024 January"", ""2023 December"", ""2023 December"", ""2023 November"", ""2023 November"", ""2023 November"", ""2023 October""]",[],[],[],"austintexas.gov Action Navigation 3-1-1 GTranslate Translate English Arabic Bulgarian Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch Finnish French German Greek Hindi Italian Japanese Korean Norwegian Polish Portuguese Romanian Russian Spanish Swedish Catalan Filipino Hebrew Indonesian Latvian Lithuanian Serbian Slovak Slovenian Ukrainian Vietnamese Albanian Estonian Galician Hungarian Maltese Thai Turkish Persian Afrikaans Malay Swahili Irish Welsh Belarusian Icelandic Macedonian Yiddish Armenian Azerbaijani Basque Georgian Haitian Creole Urdu Bengali Bosnian Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba Zulu austintexas . gov Filter Toggle navigation Menu Close Search Main menu Home Resident Resident Open the Resident page Open the Resident page Household Getting a Home Utilities Trash and Recycling Gardening and Home Improvements Home Improvements Pets and Adoption Open the Household page Neighborhoods Education Libraries Families Neighborhood Issues Open the Neighborhoods page Health Animals Public Health Open the Health page Public Safety Crime Courts Fire Safety Emergency Preparedness Public Safety Employment Open the Public Safety page Arts and Leisure Arts, History and Culture Outdoor, Nature and Wildlife Events City Venues and Facilities Film and Music Open the Arts and Leisure page Environmental City Programs and Initiatives Conservation and Recycling Animals and Wildlife Parks Open the Environmental page Transportation Car/Bus Aviation Bicycle/Pedestrian Streets/Maps Open the Transportation page City of Austin About Austin Voting and Elections Get Involved City Jobs Records and Documents Open the City of Austin page Business Business Open the Business page Open the Business page Doing Business Utilities Doing Business with the City Taxes MBE/WBE Program City Code Food Establishments Permits Day Labor Records and Documents Open the Doing Business page Starting Out Starting a Business Relocating a Business Incentives and Grants Open the Starting Out page City Contracts Small Business Centers Small Business Development Incentives and Grants Open the Small Business Centers page Austin Center for Events Nonprofits Grants Open the Nonprofits page Green Resources Government Government Open the Government page Open the Government page City Council City Manager's Office Boards and Commissions City Council meeting information City Hall Jobs Public Records Departments Departments View full directory of departments Frequently Viewed Departments View full directory of departments Visit Airport Visitors Bureau Convention Center Utilities Austin Energy Austin Water Resource Recovery Education & Recreation Library Parks and Recreation Safety Police Other Animal Services Development Services Economic Development Connect Connect Open the Connect page Share ideas online about improving Austin Participate in the City Sign up for email updates City contact information " -1222,https://vpd.vernonia-or.gov/blotter/2019/02/01/january-2019-police-blotter/,Dispatch Logs,Police & Public Interactions,January 2019 Police Blotter | Vernonia Police Department,January 2019,200,Vernonia Police Department | Quality progressive law enforcement for the community.,"[""Vernonia Police Blotter for January 2019""]",[],[],"[""Latest Blotter""]","[""REPORTS TAKEN"", ""CITATION/OTHER"", ""FEBRUARY 2024 Police Blotter"", ""JANUARY 2024 Police Blotter"", ""DECEMBER 2023 Police Blotter"", ""NOVEMBER 2023 Police Blotter"", ""OCTOBER 2023 Police Blotter""]",[],"Services Services Forms Contact Us Department Staff About News News Blotter Calendar Search Services Services Forms Contact Us Department Staff About News News Blotter Calendar Search Services Forms Contact Us Staff About News Blotter Calendar Vernonia Police Blotter for January 2019 Posted by Vernonia PD on Feb 1, 2019 REPORTS TAKEN 01/02/2019 Jeremy Cason was arrested on a Warrant near Bridge Street 01/04/2019 Report of Hit and Run, Driving While Suspended, and Failure to Perform Duties of a Driver near 1st Avenue 01/10/2019 Brenda Jimenez was arrested on a Warrant near State Street 01/13/2019 Outside Agency Assist on vehicle pursuit 01/16/2019 Robert Campo was arrested on a Warrant near Stoney Point Road. 01/16/2019 Report of Theft III near Jefferson Avenue 01/17/2019 Report of Unlawful Possession of a Firearm 01/25/2019 Report of Found Property near California Avenue 01/26/2019 Report of Theft III near Bridge Street 01/26/2019 Report of Outside Agency Assist near Nehalem HWY North 01/26/2019 Report of Outside Agency Assist near Nehalem HWY North 01/30/2019 Report of Motor Vehicle Accident near Nehalem HWY North with injury CITATION/OTHER 01/11/2019 Joshua Pixley (30) was cited for Violation of the Basic Rule 75/55 mph near Nehalem HWY South 01/13/2019 Richard Carlon (44) was cited for Failure to Display Plates and Failure to Renew Registration near Nehalem HWY North 01/19/2019 KAITLYNN LANGUE (22) was cited for Violation of the Basic Rule 54/35 mph near Nehalem HWY South 01/24/2019 ADONIS HOPKINS (22) was cited for Violation of the Basic Rule 65/45 mph near Timber Road 01/25/2019 ANDREW VASQUEZ (19) was cited for Violation of the Basic Rule 82/55 near Lone Pine Road Vernonia Police Department responds to calls that do not always end in Arrest, Report, or Citation.01/01/2019 through 01/31/2019 VPD had 268 calls for service Latest Blotter FEBRUARY 2024 Police Blotter Mar 7, 2024 JANUARY 2024 Police Blotter Mar 7, 2024 DECEMBER 2023 Police Blotter Mar 7, 2024 NOVEMBER 2023 Police Blotter Mar 7, 2024 OCTOBER 2023 Police Blotter Nov 15, 2023 " -1223,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-201-2019-state-police-hazardous-duty-pay,Media Bulletins,Agency-Published Resources,State Police Bulletin No. SP-201 | Office of the New York State Comptroller,The purpose of this bulletin is to inform the Division of State Police of OSC’s automatic processing of 2019 State Police Hazardous Duty Pay.,200,Office of the New York State Comptroller | Thomas P. DiNapoli,"[""State Police Bulletin No. SP-201"", """"]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Background"", ""Effective Date(s)"", ""Eligibility Criteria"", ""OSC Actions"", ""Control-D Report"", ""Overtime Calculation Information"", ""Retirement Information"", ""Tax Information"", ""Payroll Register and Employee’s Paycheck/Advice"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[],"" -1224,http://www.longbeach.gov/police/press-releases/motorcycle-safety-operation-a-success/,Media Bulletins,Agency-Published Resources,MOTORCYCLE SAFETY OPERATION A SUCCESS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/28/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: MOTORCYCLE SAFETY OPERATION A SUCCESS Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department’s Traffic Section conducted a Motorcycle Safety Enforcement Operation on Sunday, March 26, 2017. During the operation, motor officers patrolled throughout the city looking for unsafe driving by motorcyclists, as well as drivers who were operating vehicles unsafely around motorcycle riders. Officers took the following enforcement actions: • Conducted 63 traffic enforcement stops • Cited 34 motorcyclists for unsafe driving • Cited 3 motorcyclists for not having a motorcycle endorsement on their driver’s license • Cited 10 drivers for unsafe driving • Cited 2 unlicensed drivers Motorcycle fatalities jumped dramatically in California by over 28 percent from a decade low of 352 in 2010. In 2013, 453 motorcyclists lost their lives in California, which was at a five year high. Operations like these are aimed at curbing any more increases in motorcycle deaths and sending the numbers back downward. Over the course of the past three years, motorcycle involved collisions have resulted in 15 fatal and approximately 277 injury crashes in Long Breach. California collision data reveals that primary causes of motorcycle-involved crashes include speeding, unsafe turning, and impairment due to alcohol and other drugs, by both riders and drivers alike. Safety tips for riders – See and Be Seen: • Ride with lights on during daylight hours • Use your lane position to increase visibility; change lanes only when there is ample room • Match your speed to surrounding traffic • Always wear a DOT compliant helmet and brightly colored, protective clothing Safety tips for drivers – Share the Road: • Look twice for motorcyclists, especially when entering the roadway, turning or changing lanes • Motorcyclist are allowed in HOV lanes unless prohibited by signage Riders are urged to obtain training through the California Motorcyclist Safety Program. Information and training locations are available online or 1-877 RIDE 411 (1-877-743-3411). Funding for this program is provided by a grant from the California Office of Traffic Safety through the National Highway Traffic Safety Administration. The message to all drivers and motorcyclists is: share in the responsibility and do your part by safely “sharing the road.” This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1225,http://www.longbeach.gov/police/press-releases/murder---900-block-of-elm/,Media Bulletins,Agency-Published Resources,Murder - 900 Block of Elm,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/3/2018 FOR IMMEDIATE RELEASE Press Release # Subject: *UPDATE* MURDER - 900 BLOCK OF ELM STREET Contact: Media Relations Detail (562) 570-5273 UPDATE : After follow-up investigation, homicide detectives, with the assistance of patrol officers, made two arrests in this case and charges have been filed. On December 31, 2017, at approx. 7:00 p.m., 87-year-old Ernest Weston and 58-year-old James Pettie, both of Long Beach, were arrested in the 400 block of E. 5 th Street, for the murder of 45-year-old Todd Dunlap of Long Beach.  The victim and suspects were known to one another and had become involved in a dispute prior to the murder. Today, January 3, 2018, Homicide detectives presented the case to the Los Angeles County District Attorney’s Office, and the following charges were filed: Name : Charges : Bail : Ernest Weston            (1) count murder                                             $2,000,000                                                                            (1) count possess of dangerous weapon James Pettie               (1) count accessory to murder                        $2,000,000 Both defendants are being held at the L.A. County Jail. ORIGINAL NEWS RELEASE - 12/31/17 On Sunday, December 31, 2017, at approx. 6:15 a.m., officers responded to the 900 block of Elm Street in regards to a person down call, which resulted in the death of a male adult. When officers arrived, they located the male subject in the alley who had sustained a head injury. The subject, who appeared to be homeless, was determined deceased at the scene by Long Beach Fire Department paramedics. The preliminary investigation determined the victim may have been struck by a blunt object. A motive for the incident is unknown and no suspect information is available. The investigation remains ongoing. The Los Angeles County Coroner’s Office will determine the victim’s identity and official cause of death. Anyone with information regarding the incident is asked to contact Long Beach Police Homicide Detectives Donald Goodman and Mark Mattia at (562) 570-7244. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1226,http://www.police.wallingfordct.gov/,Resources,Agency-Published Resources,"Wallingford, CT Police Department","The Wallingford Police Department is a progressive, professional department with a strong emphasis on community relations and outreach.",200,"Wallingford, CT Police Department","[""Guardians of the Community Since 1913""]","[""How Do I?"", ""News"", ""Town of Wallingford Police Department""]","[""Short Term Road Closure – Hanover Street"", ""Bethany Man Arrested on Sexual Assault and Risk of Injury Charges"", ""Car Strikes Apartment Complex in Wallingford""]",[],[],[],"‹ Close Menu About Us Our Team Who We Serve Our History Police Station Project Divisions Records Division Traffic Division Investigative Services Division Professional Standards & Training Division Patrol Division Community Impact Unit Public Safety Communications Center Emergency Response Team Field Training & Evaluation Program How Do I? Pistol Permits Fingerprinting Accident Reports Case Reports Traffic Violations Pay a Parking Ticket Hire a Cop Alarm Registration Careers Current Employment Opportunities Forms & Resources Bingo, Bazaar & Raffle Documents Precious Metal Application Secondhand Application Pawnbroker Application Vending Application News & Events Road Closures & Detours Agency Events & Programs Press Releases Photo Gallery Video Gallery Wallingford PBA Contact Guardians of the Community Since 1913 Guardians of the Community Since 1913 How Do I? Fingerprinting Pistol Permits Book a Police Officer Accident Reports Pay a Parking Ticket News Short Term Road Closure – Hanover Street 3/21/2024 Read More Bethany Man Arrested on Sexual Assault and Risk of Injury Charges 3/1/2024 Read More Car Strikes Apartment Complex in Wallingford 2/14/2024 Read More Short Term Road Closure – Hanover Street 3/21/2024 Read More Bethany Man Arrested on Sexual Assault and Risk of Injury Charges 3/1/2024 Read More Car Strikes Apartment Complex in Wallingford 2/14/2024 Read More Town of Wallingford Police Department Community safety is a critical cornerstone of the quality of life for Wallingford citizens. As a progressive, professional police department, we place a strong emphasis on community relations and outreach. These efforts support our overall mission to enforce the law, protect life and property, and address the specific needs of our citizens. Town of Wallingford Police Department Community safety is a critical cornerstone of the quality of life for Wallingford citizens. As a progressive, professional police department, we place a strong emphasis on community relations and outreach. These efforts support our overall mission to enforce the law, protect life and property, and address the specific needs of our citizens. Location: 135 North Main Street Wallingford, CT 06492 Tel: (203) 294-2800 Fax: (203) 294-2882 Administrative Office: Monday through Friday 8 am – 4 pm Site Map Privacy Policy Accessibility Statement Anonymous Tip Form Town of Wallingford Location: 135 North Main Street Wallingford, CT 06492 Tel: (203) 294-2800 Fax: (203) 294-2882 Administrative Office: Monday through Friday 8 am – 4 pm Site Map Privacy Policy Accessibility Statement Anonymous Tip Form Town of Wallingford Web Solutions © 2022 – 2024 Wallingford Police Department. All rights reserved. Web Solutions © 2022 – 2024 Wallingford Police Department. All rights reserved. " -1227,https://norfolkne.gov/assets/site/documentcentral/police/archived-calls-for-service/2020-calls-for-service/5.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -1228,https://www.scribner-ne.gov/help-define-our-schools-future/copy-of-scribner-profile-pics-2020/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1229,https://cityofpowell.us/reports/auto-draft-223/04-2019-police-department/,Annual & Monthly Reports,Info About Agencies,"City of Powell, Ohio | 04.2019 Police Department","",200,"City of Powell, Ohio","[""04.2019 Police Department""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -1230,http://lafayettepolice.us/faq.aspx?qid=125,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • What are the benefits of a rain garden?,"",200,"Police Department | Lafayette, IN - Official Website",[],"[""▼ Rain Gardens""]","[""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1231,https://www.sandiego.gov/police/contact/meeting-request,Contact Info & Agency Meta,Info About Agencies,Meeting with the Chief Request Form | City of San Diego Official Website,"In completing your request, please be as comprehensive, detailed and specific as possible in your responses to questions included on the form. An acknowledgement of your request will be provided to you by email. While we appreciate a need for certainty regarding your request, please be assured that additional phone calls or invitations are not necessary unless requested. Please note that we cannot confirm events more than 6-8 weeks in advance. This form is used in a review process and is not a confirmation for the Chiefs attendance.",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""Meeting with the Chief Request Form""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -1232,https://hilliardohio.gov/introducing-newest-police-officer-k9-jawaak/,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -1233,https://www.sandiego.gov/police/data-transparency/crime-statistics/annual-crime-reports,Crime Maps & Reports,Agency-Published Resources,City of San Diego Annual Crime Reports | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""City of San Diego Annual Crime Reports""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Actual Crimes"", ""Crime Rates per 1,000 Population"", ""Data & Transparency"", ""Footer"", ""Accessibility Tools""]","[""City of San Diego"", ""By Neighborhood"", ""City of San Diego"", ""By Neighborhood""]","[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -1234,https://www.lynchburgvapolice.gov/lpd-policies-and-procedures/,Poor Data Source,Poor Data Source,LPD Policies and Procedures - Lynchburg Police Department,"",200,403 Forbidden,"[""LPD Policies and Procedures""]",[],[],"[""More information"", ""Contact Us"", ""Site Links"", ""Site Links""]",[],[],"About Department History Line of Duty Deaths Mission Statement Letter from the Chief Field Operations Investigations Frequently Asked Questions Resources Resources Traffic Safety Information Ask a Cop Freedom of Information Act Victim/Witness Information What To Do If Stopped By Police Terrorist Activity Information and Reporting Community & Business Business Crime Prevention Citizen’s Police Academy Faith Watch Program Reentry Programs and Assistance Free Security Assessments School Resource Officers Identity Theft Information Authorization to Enforce Trespass Violations Neighborhood Watch Transparency Transparency LPD Policies and Procedures Crime and Traffic Data Community Engagement CPAG Department Information News & Updates Join LPD Join LPD Selection Process Recruiting FAQs Salary and Benefits Animal Control Urban Hunting Animal Control Operations Becoming Bear Aware Dog License Info Forms & Documents Commend an Employee or File a Complaint Discovery and Inspection Order Freedom of Information Act Police Reports & Criminal Record Check Requests Off-Duty Officer Requests Parade Permit Requests Oversize / Overweight Load Requests Permit for Acquisition and Sale of Secondhand Building Fixtures Request Officer for Community Event Ride-Along Requests Authorization to Enforce Trespass Violations Marcus Alert Form Contact File Report General Police Information: (434) 455-6050 Non-Emergency Dispatch: (434) 847-1602 Lynchburg Police Department General Police Information: (434) 455-6050 Non-Emergency Dispatch: (434) 847-1602 About Department History Line of Duty Deaths Mission Statement Letter from the Chief Field Operations Investigations Frequently Asked Questions Resources Resources Traffic Safety Information Ask a Cop Freedom of Information Act Victim/Witness Information What To Do If Stopped By Police Terrorist Activity Information and Reporting Community & Business Business Crime Prevention Citizen’s Police Academy Faith Watch Program Reentry Programs and Assistance Free Security Assessments School Resource Officers Identity Theft Information Authorization to Enforce Trespass Violations Neighborhood Watch Transparency Transparency LPD Policies and Procedures Crime and Traffic Data Community Engagement CPAG Department Information News & Updates Join LPD Join LPD Selection Process Recruiting FAQs Salary and Benefits Animal Control Urban Hunting Animal Control Operations Becoming Bear Aware Dog License Info Forms & Documents Commend an Employee or File a Complaint Discovery and Inspection Order Freedom of Information Act Police Reports & Criminal Record Check Requests Off-Duty Officer Requests Parade Permit Requests Oversize / Overweight Load Requests Permit for Acquisition and Sale of Secondhand Building Fixtures Request Officer for Community Event Ride-Along Requests Authorization to Enforce Trespass Violations Marcus Alert Form Contact File Report LPD Policies and Procedures More information LPD Policies and Procedures Contact Us General Police Information: (434) 455-6050 Emergency: Dial 911 Non-Emergency Dispatch: (434) 847-1602 Site Links Home News & Updates Commend an Employee or File a Complaint Join LPD Site Links Forms & Documents Transparency What To Do If Stopped By Police Frequently Asked Questions City of Lynchburg Website Copyright © 2024 Lynchburg Police Department, All rights reserved. Site by 434 Marketing " -1235,https://delcopa.gov/courts/pdf/emergencyjudicialorders/secondemergencyorderextensionandamendments_juveniledelinquencyanddependencymatters.pdf,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -1237,https://cityofgulfbreeze.us/departments/police/divisions/,Resources,Agency-Published Resources,Divisions - City of Gulf Breeze,"Uniformed Patrol Division The Uniform Patrol Division is responsible for providing 24-hour response to calls for police service, conducting patrol activities, traffic enforcement, investigating crimes, and performing other law enforcement services. The Uniform Patrol Division is also responsible for overseeing the Police Department’s K-9 program. Patrol The Police Department maintains two Patrol Platoons respectively designated",200,Home - City of Gulf Breeze,"[""Divisions""]","[""What can we help you find?"", ""Mobile Menu"", ""Before Header"", ""Header Right"", ""Primary Sidebar"", ""Footer""]","[""Departments"", ""No Active Advisories"", ""City Projects"", ""Get Text Updates"", ""City of Gulf Breeze"", ""Most Requested"", ""County Agencies"", ""State Sites""]","[""Uniformed Patrol Division"", ""Patrol"", """", ""Communications"", ""Investigations"", ""South Santa Rosa Beneficial Reclaim Strategic Plan (BSRP) – Phase III"", ""Highpoint Water Main Replacement"", ""Eufaula Outfall Treatment Unit – RESTORE"", ""City Hall""]",[],[],"What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? What can we help you find? (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos (850) 934-5100 Pay Online Find Agendas, packets, & minutes Digital Online Forms Apply For City Jobs Permits or Application Contact Mayor & City Council City Staff Report An Issue or Emergency Residential Traffic Issue Wildlife Scams Request Request a Public Record Garbage Collection Utility Bills via E-Mail Sign Up For Updates Watch Videos " -1238,https://www.austintexas.gov/blog/office-police-oversight-community-event-apd-use-force,Media Bulletins,Agency-Published Resources,"Office of Police Oversight Community Event, APD Use of Force | AustinTexas.gov","  The Office of Police Oversight hosted a community event to review Austin Police Department use of force policies, collect input, and make new recommendations.",200,Home | AustinTexas.gov,"[""Office of Police Oversight Community Event, APD Use of Force""]","[""Action Navigation"", ""GTranslate"", ""Reimagining Public Safety Menu"", ""Reimagining Public Safety Blog"", ""Share"", ""About this blog"", ""Archives"", ""Pagination"", ""Footer Menu"", ""Second Footer Menu""]","[""Office of Police Oversight Community Event, APD Use of Force"", ""2021 June"", ""2021 June"", ""2021 May"", ""2021 May"", ""2021 May"", ""2021 May"", ""2021 May"", ""2021 April"", ""2021 March"", ""2021 March""]","[""Meeti ng Summary"", ""3 steps to get involved:""]",[],[],austintexas.gov Action Navigation 3-1-1 GTranslate Translate English Arabic Bulgarian Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch Finnish French German Greek Hindi Italian Japanese Korean Norwegian Polish Portuguese Romanian Russian Spanish Swedish Catalan Filipino Hebrew Indonesian Latvian Lithuanian Serbian Slovak Slovenian Ukrainian Vietnamese Albanian Estonian Galician Hungarian Maltese Thai Turkish Persian Afrikaans Malay Swahili Irish Welsh Belarusian Icelandic Macedonian Yiddish Armenian Azerbaijani Basque Georgian Haitian Creole Urdu Bengali Bosnian Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba Zulu Filter Toggle navigation Menu Close Search Reimagining Public Safety Menu About Reforms Police Department Budget Use of Force Policies End Racial Disparities in Policing Investigate Racism Within APD Sexual Assault Case Investigation Process Task Force Share Input Documents Blog Español austintexas.gov Action Navigation 3-1-1 GTranslate Translate English Arabic Bulgarian Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch Finnish French German Greek Hindi Italian Japanese Korean Norwegian Polish Portuguese Romanian Russian Spanish Swedish Catalan Filipino Hebrew Indonesian Latvian Lithuanian Serbian Slovak Slovenian Ukrainian Vietnamese Albanian Estonian Galician Hungarian Maltese Thai Turkish Persian Afrikaans Malay Swahili Irish Welsh Belarusian Icelandic Macedonian Yiddish Armenian Azerbaijani Basque Georgian Haitian Creole Urdu Bengali Bosnian Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba Zulu Action Navigation 3-1-1 GTranslate Translate English Arabic Bulgarian Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch Finnish French German Greek Hindi Italian Japanese Korean Norwegian Polish Portuguese Romanian Russian Spanish Swedish Catalan Filipino Hebrew Indonesian Latvian Lithuanian Serbian Slovak Slovenian Ukrainian Vietnamese Albanian Estonian Galician Hungarian Maltese Thai Turkish Persian Afrikaans Malay Swahili Irish Welsh Belarusian Icelandic Macedonian Yiddish Armenian Azerbaijani Basque Georgian Haitian Creole Urdu Bengali Bosnian Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba Zulu Translate English Arabic Bulgarian Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch Finnish French German Greek Hindi Italian Japanese Korean Norwegian Polish Portuguese Romanian Russian Spanish Swedish Catalan Filipino Hebrew Indonesian Latvian Lithuanian Serbian Slovak Slovenian Ukrainian Vietnamese Albanian Estonian Galician Hungarian Maltese Thai Turkish Persian Afrikaans Malay Swahili Irish Welsh Belarusian Icelandic Macedonian Yiddish Armenian Azerbaijani Basque Georgian Haitian Creole Urdu Bengali Bosnian Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba Zulu Filter Toggle navigation Menu Close Search Filter Toggle navigation Menu Close Search Filter Filter Filter Reimagining Public Safety Menu About Reforms Police Department Budget Use of Force Policies End Racial Disparities in Policing Investigate Racism Within APD Sexual Assault Case Investigation Process Task Force Share Input Documents Blog Español Reimagining Public Safety Menu About Reforms Police Department Budget Use of Force Policies End Racial Disparities in Policing Investigate Racism Within APD Sexual Assault Case Investigation Process Task Force Share Input Documents Blog Español -1239,http://www.lafayettepolice.us/1598/castaway-bay,Not Criminal Justice Related,Not Criminal Justice Related,"Castaway Bay | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Castaway Bay"", ""Hours of Operation"", ""Pool Admission Fees"", """", ""Special Rates:""]","[""Daily Admission Fees"", ""Family Night Admission Fees*"", """", ""Purchase a Season Pass!"", """", ""Family Night Tuesdays"", ""Location & Contact Information""]","[""Non-Profit Rate"", ""Private Rentals"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About Us Special Events Programs I Want To... Home Government Departments H - W Parks & Recreation Facilities Aquatics Plan Your Visit Aquatic Facilities Castaway Bay Castaway Bay An adventure is waiting for you at Castaway Bay! Beach-like entry, water basketball, and a bubble bench are just a few of the features that make up this family-friendly aquatic center located in Armstrong Park. The aquatic facility is located on Beck Lane. Parking is available adjacent to the facility. Thanks for a great summer. Castaway Bay will open again in May 2017. Thanks for a great summer. Castaway Bay will open again in May 2017. Thanks for a great summer. Castaway Bay will open again in May 2017. Hours of Operation Castaway Bay is closed for the season, and will open on Saturday, May 25, 2024. We will see you on Memorial Day weekend 2024! Day Hours Daily Closed Tuesdays Closed Pool Admission Fees Daily Admission Fees Toddlers (2 and under) are free Guest Price of Admission After 4:00 pm General Admission $5.00 $3.00 Family Night Admission Fees* Toddlers (2 and under) are free Guest Price of Admission After 4:00 pm General Admission $2.00 * Price of Admission Tuesdays from 4:00 pm to 8:00 pm. We accept all major credit and debit cards as well as cash (business checks accepted - certain restrictions apply). Purchase a Season Pass! Season passes are available for purchase at Castaway Bay and are for unlimited use; passes are non-refundable. With the purchase of a season pass to Castaway Bay, you will receive 3 admissions to Tropicanoe Cove! Initial Pass: $75.00 Additional Family Members: $25.00/ea Family Night Tuesdays Every Tuesday after 4:00 pm, rates are reduced to just $2 per person and hours are extended until 8:00 pm. Location & Contact Information Address: Phone Numbers: 601 Beck Lane Lafayette, IN 47909 (765) 807-0006 Pool Season (765) 807-1500 Off Season ____________________________________________________________________________ Special Rates: Non-Profit Rate $2.50 per person (rates apply Monday-Friday ONLY, excluding holidays) Non-profit groups must be from within Tippecanoe County - all other groups pay normal rates Private Rentals Have your own private pool party at Castaway Bay. Rates are $350.00 per hour with a 2 hour minimum. Private rentals are not available on Tuesday. Please call (765) 807-1500 for more information. Tropicanoe Cove Water Walking Castaway Bay Vinton Pool Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -1240,https://delcopa.gov/treasurer/pdf/2021reassessmentvalues/39.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -1241,https://www.westmayfieldborough.us/cropped-white-blank-header-banner-copy1-jpg/,Poor Data Source,Poor Data Source,cropped-White-blank-header-banner-Copy1.jpg – West Mayfield Borough,"",200,West Mayfield Borough – Established 1923 | A Nice Place to Live,"[""cropped-White-blank-header-banner-Copy1.jpg""]",[],[],[],[],[],"Skip to content West Mayfield Borough Est. 1923 | A Nice Place to Live News From the Mayor’s Desk Calendar Directory Code Enforcement Committees Fire Service Review Recreation Board Mayor Licia Cogley Tax Collector Meetings Agendas & Minutes Budget Ordinances Code Enforcement Solicitation Permits Issued Services Borough Calendar & Street Map Park Shelter Reservations Social Hall Reservations Borough Permits More Useful Links Contact Us History Centennial Emergency Menu Search for: cropped-White-blank-header-banner-Copy1.jpg Posted on January 3, 2015 January 3, 2015 by admin ← Previous Next → West Mayfield Borough A SiteOrigin Theme West Mayfield Borough Est. 1923 | A Nice Place to Live West Mayfield Borough Est. 1923 | A Nice Place to Live News From the Mayor’s Desk Calendar Directory Code Enforcement Committees Fire Service Review Recreation Board Mayor Licia Cogley Tax Collector Meetings Agendas & Minutes Budget Ordinances Code Enforcement Solicitation Permits Issued Services Borough Calendar & Street Map Park Shelter Reservations Social Hall Reservations Borough Permits More Useful Links Contact Us History Centennial Emergency Menu Search for: News From the Mayor’s Desk Calendar Directory Code Enforcement Committees Fire Service Review Recreation Board Mayor Licia Cogley Tax Collector Meetings Agendas & Minutes Budget Ordinances Code Enforcement Solicitation Permits Issued Services Borough Calendar & Street Map Park Shelter Reservations Social Hall Reservations Borough Permits More Useful Links Contact Us History Centennial Emergency Menu Search for: cropped-White-blank-header-banner-Copy1.jpg Posted on January 3, 2015 January 3, 2015 by admin ← Previous Next → cropped-White-blank-header-banner-Copy1.jpg Posted on January 3, 2015 January 3, 2015 by admin ← Previous Next → cropped-White-blank-header-banner-Copy1.jpg Posted on January 3, 2015 January 3, 2015 by admin ← Previous Next → cropped-White-blank-header-banner-Copy1.jpg Posted on January 3, 2015 January 3, 2015 by admin ← Previous Next → Posted on January 3, 2015 January 3, 2015 by admin West Mayfield Borough A SiteOrigin Theme " -1242,https://delcopa.gov/publicrelations/publicrelations/releases/2020/index.html,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -1243,https://alpha.austin.gov/police-oversight/formal-complaint-de-escalation-of-potential-force-encount-3/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1244,https://delcopa.gov/planning/pubs/portfolio-14_foodsystems.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1245,https://www.mass.gov/doc/copleydental2013-003rfd/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1246,https://brecknocktownship.us/police-and-emergency-services/,Contact Info & Agency Meta,Info About Agencies,"Police and Emergency Services | Brecknock Township, PA","",200,"Brecknock Township, PA | Lancaster County • 1026 Dry Tavern Rd • Denver, PA 17517","[""Brecknock Township, PA"", ""Police and Emergency Services""]","[""Lancaster County • 1026 Dry Tavern Rd • Denver, PA 17517""]","[""Main menu"", ""Latest News"", ""Upcoming Events""]",[],[],[],"Search Brecknock Township, PA Lancaster County • 1026 Dry Tavern Rd • Denver, PA 17517 Main menu Skip to primary content Skip to secondary content HOME About Us Boards and Commissions Board of Supervisors Northern Lancaster County Authority Parks and Recreation Board Planning Commission Zoning Hearing Board Calendar Frequently Asked Questions Contact Us Police and Emergency Services EMERGENCY SERVICES Brecknock Township is very fortunate to be served by two volunteer fire companies and one ambulance company. There are many dedicated men and women who unselfishly give a lot of time to protect lives and properties in the township. The Township makes a financial contribution to all of these organizations and encourages each of you to do the same. If you are interested in serving as a volunteer with any of these organizations, feel free to contact them at the phone numbers listed below. BOWMANSVILLE FIRE COMPANY 146 W. Maple Grove Road, Bowmansville 717-445-6293 www.bowmansvillefire.com FIVEPOINTVILLE FIRE COMPANY 1087 Dry Tavern Road, Fivepointville 717-445-4933 www.fivepointvillefire.net FIVEPOINTVILLE AMBULANCE ASSOCIATION 1094 Dry Tavern Road, Fivepointville 717-445-5937 www.fivepointvilleambulance.com A REMINDER FROM THE PA STATE POLICE Crime is everywhere Lock your doors and windows Report anything suspicious Contact PA State Police at 717-299-7650 for non emergency calls ALWAYS DIAL 911 IN AN EMERGENCY Latest News Draft BOS Agenda 03/12/24 Draft BOS Agenda for February 13, 2024 meeting. Draft Planning Commission Agenda BOS Draft Agenda January 9, 2024 Upcoming Events Mar 26 Tue 7:00 pm Planning Commission Meeting @ Township Building Planning Commission Meeting @ Township Building Mar 26 @ 7:00 pm Apr 8 Mon 7:00 pm Northern Lancaster County Authority @ Township Building Northern Lancaster County Authority @ Township Building Apr 8 @ 7:00 pm Apr 9 Tue 7:00 pm Board of Supervisors @ Township Building Board of Supervisors @ Township Building Apr 9 @ 7:00 pm View Calendar HOME About Us Board of Supervisors Calendar Code of Ordinance Engineering, On-Lot Sewage Enforcement Questions and Permit Applications Forms Latest News Newsletters Northern Lancaster County Authority On-Lot Maintenance Program Parks and Recreation Board Permits Planning Commission Police and Emergency Services Road Department SOUTH CENTRAL ALERT Spotted Lanternfly Info. Storm Water Management Center (MS4) Brecknock Township’s Subdivision and Land Development Ordinance (SALDO) Tax Collector Voting Places & Information Yard Waste Disposal Zoning Hearing Board Frequently Asked Questions Helpful Links Contact Us Brecknock Township, Lancaster County, Pennsylvania Skip to primary content Skip to secondary content HOME About Us Boards and Commissions Board of Supervisors Northern Lancaster County Authority Parks and Recreation Board Planning Commission Zoning Hearing Board Calendar Frequently Asked Questions Contact Us " -1247,https://gonzalesca.gov/services/police/police-department-staff,Contact Info & Agency Meta,Info About Agencies,Police Department Staff | City of Gonzales,"Official City of Gonzales, CA website. Find the latest news, events, and information for residents and businesses....",200,City of Gonzales,"[""The City of Gonzales, California"", ""The City of Gonzales, California""]","[""Top menu"", ""Police Department Staff""]","[""Side Menu for Services"", ""Keith Wise - Chief of Police"", ""JUAN MENDOZA - CAPTAIN"", ""SANTIAGO MELGOZA - Sergeant"", ""HERBERT BOWEN - SERGEANT"", ""CESAR CASTILLO - CORPORAL/ EXPLORER ADVISOR"", ""NATHAN CORDOBA - CORPORAL"", ""ALEX PRUNEDA - OFFICER"", ""MIGUEL PEREZ - SCHOOL RESOURCE OFFICER"", ""ULYSES FIERROS - OFFICER"", ""DAVID RIVERA - OFFICER"", ""TAYLOR RIVAS - OFFICER"", ""JOSHUA MACIAS - OFFICER"", ""ANDREA CASILLAS - RECORDS SUPERVISOR"", ""ESTHER VALDEZ - ADMINISTRATIVE ASSISTANT"", ""IVAN CORREA - Community Service Officer""]","[""CITY OF GONZALES""]",[],[],"" -1248,https://bolivar.mo.us/shop-with-a-copr/img_1333-2/,Poor Data Source,Poor Data Source,"IMG_1333 - City of Bolivar, Missouri","",200,"Welcome to Bolivar - Where Liberty Flows - City of Bolivar, Missouri","[""IMG_1333""]",[],[],[],[],[],"Skip to content DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us IMG_1333 Home Departments Police Shop with a Cop® IMG_1333 12 Dec 2014 by City Administrator WordPress Theme - Total by HashThemes DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us IMG_1333 Home Departments Police Shop with a Cop® IMG_1333 12 Dec 2014 by City Administrator IMG_1333 Home Departments Police Shop with a Cop® IMG_1333 IMG_1333 Home Departments Police Shop with a Cop® IMG_1333 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator WordPress Theme - Total by HashThemes WordPress Theme - Total by HashThemes WordPress Theme - Total by HashThemes " -1249,https://www.rentonwa.gov/city_hall/police/police_services/8_can_t_wait/require_use_of_force_continuum,Policies & Contracts,Info About Agencies,Require Use Of Force Continuum - City of Renton,"",200,Just a moment...,"[""CITY OF RENTON WASHINGTON""]","[""Require Use Of Force Continuum""]",[],"[""POLICY 300.4 USE OF FORCE"", ""SOP 107.3 SPECTRUM OF FORCE"", ""Renton Police Department Comments"", ""Eight Can't Wait""]",[],[],Skip navigation -1250,https://chester-ny.gov/town-departments/police/house-check-request/,Resources,Agency-Published Resources,"House Check Request – Town of Chester, Orange County New York!","",200,"Town of Chester, Orange County New York! – Village of Chester ~ Hamlet of Sugar Loaf","[""House Check Request""]","[""Thanks for signing up!"", ""Sign up for updates!""]","[""House Check Request""]","[""Town Hall"", ""Police Department"", ""Follow us on YouTube"", ""© The Town of Chester NY | All Rights Reserved""]",[],[],"" -1251,https://www.mass.gov/doc/reference-copy-of-2016-massdep-municipal-solid-waste-recycling-survey/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1253,https://www.lynchburgvapolice.gov/wp-content/uploads/2022/05/pwm-2-4.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1254,https://directory.arkansas.gov/agency/department-of-public-safety/arkansas-state-police/news/crack-down-on-speeders-part-of-statewide-traffic-safety-blitz-obey-the-sign-or-pay-the-fine/,Poor Data Source,Poor Data Source,State Directory – Arkansas.gov,"",200,State Directory – Arkansas.gov,"[""Flag Status""]","[""Discover More"", ""Discover More"", ""Discover More"", ""Discover More"", ""What can we help you find?"", ""Search the Directories"", ""Flag Status"", """"]","[""Government Resources"", ""Business Resources"", ""Residents Resources"", ""Visiting Resources"", ""State Directory"", ""Agencies"", ""Services"", ""Employees"", ""Your Arkansas.gov"", ""Top Online Services"", ""helpful information""]","[""Was the information on this page helpful?""]",[],[],"" -1255,https://www.coppelltx.gov/faq.aspx?qid=218,Not Criminal Justice Related,Not Criminal Justice Related,"FAQs • I just had new sod put down, I need to water daily -","",200,"Coppell, TX | Official Website",[],"[""Water Variances"", ""▼ Water & Wastewater"", ""High Pressure"", ""Improved Accuracy"", ""Enhanced Customer Service"", ""Irrigation Box"", ""Lake Ray Hubbard"", ""Dallas Long Range Water Supply Plan"", ""Seasonal Taste"", ""Water Variances"", ""Examples""]","[""Categories"", ""Penalty Fine"", ""Penalty Fine"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -1256,https://dccouncil.gov/donation-disclosures/copy-of-april-2018-donation-disclosure-2/,Not Criminal Justice Related,Not Criminal Justice Related,Copy of April 2018 Donation Disclosure • Council of the District of Columbia,"",200,Home • Council of the District of Columbia,"[""Copy of April 2018 Donation Disclosure""]",[],[],[],[],[],"Federal Tax Counter: $1,298,299,404 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Federal Tax Counter: $1,298,299,404 What is this? Get Updates RSS Press Center facebook twitter youtube Federal Tax Counter: $1,298,299,404 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Council of the District of Columbia Copy of April 2018 Donation Disclosure October 08, 2018 Loading... Copy of April 2018 Donation Disclosure October 08, 2018 Loading... Loading... Loading... DC Council seal About the Council Open Government Register to Vote Council Updates Jobs Council Directory Privacy Policy Commemorative D.C. Flag Program Ethics Visit the Wilson Building facebook twitter youtube Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Search facebook twitter youtube Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate " -1257,https://alpha.austin.gov/es/police-oversight/memo-changes-to-apd-impartial-attitude-and-courtesyper/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1258,https://www.santamonica.gov/press/2022/09/21/santa-monica-police-holding-motorcycle-safety-enforcement-operation-september-23-2022,Media Bulletins,Agency-Published Resources,"santamonica.gov - Santa Monica Police Holding Motorcycle Safety Enforcement Operation September 23, 2022","",200,santamonica.gov - Home Page,"[""Santa Monica Police Holding Motorcycle Safety Enforcement Operation September 23, 2022""]","[""Media Contact"", ""Categories"", ""Departments""]",[],[],[],"[""Your City Hall"", ""Latest"", ""Legal"", ""follow us""]","" -1259,https://www.providenceri.gov/hr/wellness/cop-9-elements-of-longevity-flyer-10-23/,Poor Data Source,Poor Data Source,City of Providence CoP 9 Elements of Longevity Flyer 10.23 - City of Providence,"",200,Sucuri WebSite Firewall - Access Denied,"[""CoP 9 Elements of Longevity Flyer 10.23""]","[""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español"", ""Lists *""]",[],[],[],"Skip To Menu Skip To Content Skip To Accessibility Options Language Language Arabic Chinese (Traditional) English Khemer Portuguese Spanish City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley City Of Providence Mayor Brett Smiley Search Accessibility CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation PVD 311 CITY HALL I Want to … MAYOR BRETT P. SMILEY Departments City Council Find a Meeting Agenda Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Running a Business Starting a Business Purchasing EVENTS NEWS EXPLORE Explore Providence Parks Recreation ACCESSIBILITY CoP 9 Elements of Longevity Flyer 10.23 CoP 9 Elements of Longevity Flyer 10.23 Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn CoP 9 Elements of Longevity Flyer 10.23 CoP 9 Elements of Longevity Flyer 10.23 Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn CoP 9 Elements of Longevity Flyer 10.23 Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon " -1260,https://delcopa.gov/planning/pdf/mapping/media.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -1261,https://police.crystalmn.gov/emergency_center,Media Bulletins,Agency-Published Resources,Emergency Center - City of Crystal-Police,"",200,Just a moment...,"[""Emergency Center""]",[],"[""Sign up for a city newsletter or notification."", ""Police Department"", ""Lobby Hours:""]","[""Monday - Friday""]",[],[],"" -1262,https://www.dps.nm.gov/blog/2021/07/07/state-police-officer-attacked-by-felon-with-a-loaded-gun-in-pecos-nm/,Media Bulletins,Agency-Published Resources,"State Police Officer Attacked by Felon with a Loaded Gun in Pecos, NM - NM Department of Public Safety","",200,Home - NM Department of Public Safety,"[""State Police Officer Attacked by Felon with a Loaded Gun in Pecos, NM""]",[],"[""Location"", ""Sitemap"", ""Quick Links"", ""Social Media Links""]",[],[],[],"Manage Cookie Consent We use cookies to optimize our website and our service. Functional Functional Always active The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network. Preferences Preferences The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user. Statistics Statistics The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you. Marketing Marketing The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes. Manage options Manage services Manage {vendor_count} vendors Read more about these purposes Accept Deny Preferences Save preferences Preferences Cookie Policy Privacy Statement {title} Manage Cookie Consent We use cookies to optimize our website and our service. Functional Functional Always active The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network. Preferences Preferences The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user. Statistics Statistics The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you. Marketing Marketing The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes. Manage options Manage services Manage {vendor_count} vendors Read more about these purposes Accept Deny Preferences Save preferences Preferences Cookie Policy Privacy Statement {title} Manage Cookie Consent Manage Cookie Consent " -1263,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0473/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -1264,https://police.birminghamal.gov/bureaus/administrative/,Contact Info & Agency Meta,Info About Agencies,Office of Administration | Birmingham Police Department,"",200,"Home | Police Department - Birmingham, AL","[""Birmingham Police Department Commitment | Excellence | Integrity""]","[""Putting People First"", ""Office of Administration""]",[],"[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[],Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Search -1265,https://www.southamptontownnypolice.gov/faq.aspx?qid=463,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • I am putting in a wood deck at grade. Do I need a bu,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Land Management - Building & Zoning""]","[""Site Tools"", ""Categories"", ""Residential Building Permit Application Checklists"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1266,https://www.goldenbeach.us/documents/reso-2034-09-authorizing-the-purchase-of-two-new-police-patrol-boat-motors/,Media Bulletins,Agency-Published Resources,RESO 2034.09 authorizing the purchase of two new police patrol boat motors – Golden Beach: A Town Unlike Any Other,"",200,Golden Beach: A Town Unlike Any Other – The Town of Golden Beach,[],[],"[""About Golden Beach"", ""Phone Numbers"", ""Town Hall""]","[""RESO 2034.09 authorizing the purchase of two new police patrol boat motors (2 MB)""]",[],[],Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide [hmapsprem id=1] Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide Menu -1267,http://www.longbeach.gov/police/how-do-i/permits-fees-and-licensing/~/link/dea878b9816040a8afeeaa7799933a7f.aspx,Poor Data Source,Poor Data Source,City of Long Beach,"",200,City of Long Beach,[],"[""Page Not Found""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[],"" -1268,https://police.greenvillesc.gov/513/parking,Not Criminal Justice Related,Not Criminal Justice Related,"Parking | Greenville, SC - Official Website","The Parking Division, organizationally located in the Public Works Department, oversees the operation of all City garages and parking lots.",200,"Police Department | Greenville, SC - Official Website","[""Parking Services""]",[],"[""REAL-TIME Available Parking"", ""Quick Links"", ""Parking Services"", ""Loading""]","[""City Garages & Lots"", ""Pay Citations Online"", ""Parking Enforcement"", ""Accessible Parking"", ""Download Parkmobile to Pay Online"", ""First Hour, Weekend and Evening Free Parking"", ""Discount, Night Owl Parking"", ""Residential District Parking""]",[],[],"Skip to Main Content Government Departments Business Visitors Residents Search Parking Services 9 1 4 3 City Garages & Lots Pay Citations Online Parking Enforcement Accessible Parking Home Departments Public Works Parking Follow the 'P' to more than 8,000 parking spaces, including 800 free on-street! You can also park at one of the City's 18 parking facilities, located just steps away from all the popular entertainment, shopping and dining destinations. The City also offers free parking on weekends in select locations, and many downtown merchants provide free or discounted garage parking for their customers. The Parking Division, organizationally located in the Public Works Department, oversees the operation of all City garages. Each parking garage is equipped with an automated Pay-in-Lane station, which accepts credit cards (Visa, MasterCard, Discover, American Express) and parking vouchers. REAL-TIME Available Parking Available for all city garages View Interactive Parking Map iFrames are not supported on this page. Download Parkmobile to Pay Online The ParkMobile parking app is available to pay for parking in all City owned lots and garages, for both iPhone and Android devices. Just enter the zone number posted on signs in the parking lots and select the amount of time needed. First Hour, Weekend and Evening Free Parking Park for free for one hour in any City garage, no matter the day or time. Free parking also is available in select locations on weekends and evenings. More about Free Parking Discount, Night Owl Parking A monthly parking rate designed to be affordable is available for those who need access outside of regular business hours. For $36 a month, customers can park from 4 p.m. to 6 a.m. Monday-Thursday, and from 4 p.m. Friday to 6 a.m. Monday. Apply for Night Owl Parking Residential District Parking The City of Greenville offers on-street parking permits for residents, business owners and their guests for Bennett Street and the Pettigru Historic District. Permit Details View All News /CivicAlerts.aspx Quick Links Apply for Monthly Parking Pay/Appeal Citations Online Loading Zone Map Temporary, On-Street Parking Application /QuickLinks.aspx Parking Services 516 Rutherford Street Greenville SC 29609 864-232-CARE(2273) PAM CORBIN Parking Services Manager pcorbin@greenvillesc.gov Home Contact Us Accessibility Site Map Web Policy and Copyright Webmail /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate " -1269,https://delcopa.gov/departments/parks/sagelife.com/plush-mills/,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -1270,https://delcopa.gov/publicrelations/releases/2021/statement_capitolbuildingviolencejan6.html,Media Bulletins,Agency-Published Resources,"Delaware Council Issues Quote Addressing Violence at the Capitol Building on Jan. 6 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware Council Issues Quote Addressing Violence at the Capitol Building on Jan. 6""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware Council Issues Quote Addressing Violence at the Capitol Building on Jan. 6 Home / Departments / Public Relations Releases / Delaware Council Issues Quote Addressing Violence at the Capitol Building on Jan. 6 Released: January 7, 2021 Our country allows everyone to freely express their beliefs and protest peacefully. However, what we witnessed in D.C. was not an expression of peaceful protesting. Violence is unacceptable. The election may not have delivered the result sought by some, but that doesn’t entitle one to make up baseless allegations of fraud, which are repeatedly refuted with actual evidence, and then turn to violence because they are not getting the result they desire. Democracy, our Constitution and the rule of law need to be more important than a demagogue. This behavior is shameful. The message to those who choose to behave this way: Act like our children are watching. Because they ARE. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware Council Issues Quote Addressing Violence at the Capitol Building on Jan. 6 Home / Departments / Public Relations Releases / Delaware Council Issues Quote Addressing Violence at the Capitol Building on Jan. 6 Delaware Council Issues Quote Addressing Violence at the Capitol Building on Jan. 6 Home / Departments / Public Relations Releases / Delaware Council Issues Quote Addressing Violence at the Capitol Building on Jan. 6 Delaware Council Issues Quote Addressing Violence at the Capitol Building on Jan. 6 Home / Departments / Public Relations Releases / Delaware Council Issues Quote Addressing Violence at the Capitol Building on Jan. 6 " -1271,http://www.longbeach.gov/police/press-releases/undetermined-death2/,Media Bulletins,Agency-Published Resources,UNDETERMINED DEATH,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/20/2019 FOR IMMEDIATE RELEASE Press Release # Subject: UNDETERMINED DEATH - 2500 BLOCK OF E. 67TH STREET Contact: Media Relations Detail (562) 570-5273 LBPDMediaRelations@longbeach.gov On Saturday, January 19, 2019, at approximately 7:35 pm, Officers were dispatched to the 2500 block of E. 67th Street to assist the Fire Department regarding a male adult who was found deceased in an RV parked on the street.  The deceased appears to have been living in the RV. Homicide Detectives were called to the scene to investigate the incident.  At this time, the cause of death is being classified as “undetermined.” The official cause of death, and the identity of the deceased, will be determined by the Los Angeles County Coroner’s Office. Anyone with any information regarding this incident is asked to contact Homicide Detectives Ricardo Solario and Don Collier )at (562) 570-7244.  Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App Store and Google Play), or by visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1272,https://police.bixbyok.gov/1260/communications,Contact Info & Agency Meta,Info About Agencies,"Communications | Bixby Police Department, OK","The Bixby Police Communications Division is locally maintained and monitored 24 hours a day, seven days a week including holidays.",200,"Bixby Police Department, OK | Official Website","[""Communications""]","[""Responsibilities"", ""What to Know Before You Dial 911"", ""When To Use 911"", ""What to Not Do Regarding Dialing 911"", ""Calling 911""]","[""Helpful Links"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1273,http://www.longbeach.gov/police/press-releases/murder-locust-and-12th/,Media Bulletins,Agency-Published Resources,MURDER LOCUST AND 12TH,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/11/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 UPDATED 9/14/2016 WITH RELATED NEWS RELEASE: VIOLENT CRIME SERIES RELATED TO RECENT OFFICER INVOLVED SHOOTING ORIGINAL NEWS RELEASE: On Sunday, September 11, 2016, at approximately 3:39 a.m., Long Beach Police were dispatched to an assault with a deadly weapon call in the area of Locust Avenue and East 12th Street. Arriving officers found a male adult who sustained a gunshot injury to the upper torso, on the ground. Long Beach Fire Department personnel responded and determined the victim deceased at the scene. Homicide detectives also responded to begin their investigation. The Los Angeles County Coroner will make positive identification and notify next of kin. A motive for the shooting is unknown. No suspect information is available and the investigation remains ongoing. Anyone with information regarding this incident is urged to call Long Beach Police Homicide Detectives Mark Bigel-Guarino, Todd Johnson, and Shea Robertson at (562) 570-7244. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800- 222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1274,https://ridgelandsc.gov/police-department/daily-arrest-reports-april,Poor Data Source,Poor Data Source,Town of Ridgeland,Town of Ridgeland,200,Town of Ridgeland,"[""Police Department""]","[""Daily Arrest Reports - April""]",[],[],[],[],"HOME GOVERNMENT Government Mayor Town Council Boards & Commissions Board, Commission, & Committee Vacancies Town Council Meeting Agendas Town Council Videos Resources Bid Opportunities Public Meeting Agendas Financial Documents DEPARTMENTS Executive Finance, HR and Risk Management Municipal Court Planning and Community Development Police Department Fire Department Water & Sewer BUSINESS Bid Opportunities Building Permits & Forms Business License Information Economic Development Opening a Business Public Meeting Agendas Resources Zoning Maps COMMUNITY About Ridgeland Battle of Honey Hill Community Events Job Opportunities Maps Gallery News & Information Ordinances Parks & Trails Public Safety/Utilities Schools Services Town of Ridgeland Farmers Market I WANT TO... Contact a Staff Member File a FOIA Request Find Out About Trash Collection Service Find the Police Department Find the Fire Department Find Town Hall Find Zoning Maps Learn About Services Pay a Traffic Fine Pay My Water Bill I Want Water/Sewer Service Rent Lakeside at Blue Heron HOME GOVERNMENT Government Mayor Town Council Boards & Commissions Board, Commission, & Committee Vacancies Town Council Meeting Agendas Town Council Videos Resources Bid Opportunities Public Meeting Agendas Financial Documents DEPARTMENTS Executive Finance, HR and Risk Management Municipal Court Planning and Community Development Police Department Fire Department Water & Sewer BUSINESS Bid Opportunities Building Permits & Forms Business License Information Economic Development Opening a Business Public Meeting Agendas Resources Zoning Maps COMMUNITY About Ridgeland Battle of Honey Hill Community Events Job Opportunities Maps Gallery News & Information Ordinances Parks & Trails Public Safety/Utilities Schools Services Town of Ridgeland Farmers Market I WANT TO... Contact a Staff Member File a FOIA Request Find Out About Trash Collection Service Find the Police Department Find the Fire Department Find Town Hall Find Zoning Maps Learn About Services Pay a Traffic Fine Pay My Water Bill I Want Water/Sewer Service Rent Lakeside at Blue Heron HOME GOVERNMENT Government Mayor Town Council Boards & Commissions Board, Commission, & Committee Vacancies Town Council Meeting Agendas Town Council Videos Resources Bid Opportunities Public Meeting Agendas Financial Documents DEPARTMENTS Executive Finance, HR and Risk Management Municipal Court Planning and Community Development Police Department Fire Department Water & Sewer BUSINESS Bid Opportunities Building Permits & Forms Business License Information Economic Development Opening a Business Public Meeting Agendas Resources Zoning Maps COMMUNITY About Ridgeland Battle of Honey Hill Community Events Job Opportunities Maps Gallery News & Information Ordinances Parks & Trails Public Safety/Utilities Schools Services Town of Ridgeland Farmers Market I WANT TO... Contact a Staff Member File a FOIA Request Find Out About Trash Collection Service Find the Police Department Find the Fire Department Find Town Hall Find Zoning Maps Learn About Services Pay a Traffic Fine Pay My Water Bill I Want Water/Sewer Service Rent Lakeside at Blue Heron " -1275,https://www.sandiego.gov/department-document/copy-agreement,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1276,http://www.tampa.gov/police/online-reporting,Resources,Agency-Published Resources,Online Reporting | City of Tampa,IF THIS IS AN EMERGENCY PLEASE CALL 911.   Welcome to the Tampa Police Depa,200,City of Tampa,"[""Online Reporting""]","[""Police Department"", ""REPORTING CRITERIA ¶"", ""​​​​​​​TYPES OF CRIMES THAT CAN BE REPORTED ¶"", ""AFTER SUBMITTING THE REPORT ¶"", ""Make a Report ¶"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]","[""TYPES OF CRIMES THAT CAN BE REPORTED BUT REQUIRE ADDITIONAL FORM"", ""ADDITIONAL ITEMS YOU CAN FILE ONLINE FOR DOCUMENTATION PURPOSES""]",[],[],[],"" -1277,http://www.lafayettepolice.us/faq.aspx?qid=150,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Where do I go to apply for a Building Permit?,"",200,"Police Department | Lafayette, IN - Official Website",[],"[""▼ Fire Department - New Construction & Addition / Remodel""]","[""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1278,https://southamptontownnypolice.gov/786/2015-budgets,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1279,https://delcopa.gov/planning/greenspace/greenspaceroe.html,Not Criminal Justice Related,Not Criminal Justice Related,Delaware County Return on Environment | Planning Department,"",200,"Delaware County, Pennsylvania","[""Delaware County Return on Environment Study""]",[],"[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -1280,https://delcopa.gov/publicrelations/releases/2019/narcanatdccc.html,Resources,Agency-Published Resources,"Life-saving Narcan accessible in Delaware County Community College AED cabinets - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Life-saving Narcan accessible in Delaware County Community College AED cabinets""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -1281,http://www.longbeach.gov/police/press-releases/spring-break-safety-tips-1-/,Media Bulletins,Agency-Published Resources,Spring Break Safety Tips(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1282,http://www.lafayettepolice.us/2319/travel,Not Criminal Justice Related,Not Criminal Justice Related,"Travel | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Travel""]","[""City of Orlando, FL"", ""Dream Vacations""]","[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency CustomLinks_14 Travel Travel City of Orlando, FL Details Save 35% On Orlando Vacation Packages With Only A $50 Deposit To Book! Orlando Employee Discounts provides the best deals on Orlando hotels, vacation home rentals near Disney World, and Orlando theme park tickets for over 30 years. Orlando's top authorized ticket seller for Disney World, Universal Orlando Resort, SeaWorld Orlando, Legoland Florida and more! How Do We Offer Such Great Deals? It is really simple, we are only offering these deals to a select group and not offering these deals to the general public. The Orlando Theme Parks, Hotels, and Vacation Home Providers allow us to offer discounts that far exceed what they are offering to the general public. What Separates Us From Our Competition? We are the only Orlando based affinity travel program, and we only concentrate on providing the absolute best deals for guests who want to travel to Orlando. All our agents live in Orlando, and we feel this gives us the opportunity to provide excellent customer service. Website: www.OrlandoEmployeeDiscounts.com Username: lafayette Dream Vacations Details Through the City of Lafayette, you have the opportunity to save from 10% to 60% on not only the world's leading cruise lines, but also some of the most sought after vacation destinations in Europe, the Caribbean, and beyond. Website: https://cityoflafayette-indiana.companycruises.com/travel/HomePage.html Dream Vacations Flyer City Perks! Amusement Parks Automotive / Car Rental Banking Batteries Cellular Phone and TV Service Clothing/Shoe Stores Computers Confections Entertainment Events Fitness Florist Grocery Stores Hair Salon/Spa Services Health & Wellness Heating & Cooling Services Home Services, Parts & Paints Housing Pet Services/Supplies Restaurants Sports Travel TicketsatWork Other Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -1283,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0792/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1284,https://bouldercolorado.gov/news/boulder-police-investigating-fatal-traffic-crash-friday,Media Bulletins,Agency-Published Resources,Boulder Police Investigating a Fatal Traffic Crash Friday | City of Boulder,"",200,Home | City of Boulder,"[""Boulder Police Investigating a Fatal Traffic Crash Friday""]","[""Breadcrumb"", ""Details"", ""Keep Reading""]","[""Body of Unidentified White Male Found in Boulder Creek, No Indications of Foul Play"", ""Boulder Police Department Seeks New Volunteers to Become Victim Advocates"", ""Boulder Police Investigating Fatal Traffic Crash"", ""Boulder Police Release More Information About Dog Attack""]",[],[],[],"Calendar Jobs Contact Us Search English 繁體中文 Français Deutsch 한국어 Русский Español नेपाली en Locations Services Projects Government News Toggle Menu City of Boulder Locations Services Projects Government News Calendar Jobs Contact Us Search Breadcrumb Home News Boulder Police Investigating a Fatal Traffic Crash Friday Image Details Dionne Waugh, Media Relations, 303-518-1894 WaughD@bouldercolorado.gov Published Date Sep 20, 2021 The Boulder Police Department is investigating a fatal crash that occurred Friday afternoon between a vehicle and pedestrian. The Boulder Police Department is investigating a fatal crash that occurred Friday afternoon between a vehicle and pedestrian. At approximately 12:20 p.m. on Sept. 17, a 17-year-old male driver stopped at a red light at the intersection of 26th Street and Pearl Street then turned right. The vehicle — a Jeep Wrangler — struck an 83-year-old female who was crossing the street. The female was taken to the hospital where she later died of her injuries. The Boulder County Coroner’s Office will identify the victim and notify the next of kin. The driver remained on scene and is cooperating with officers. Keep Reading Body of Unidentified White Male Found in Boulder Creek, No Indications of Foul Play March 22, 2024 Boulder Police Department Seeks New Volunteers to Become Victim Advocates March 5, 2024 Boulder Police Investigating Fatal Traffic Crash February 7, 2024 Boulder Police Release More Information About Dog Attack January 29, 2024 Calendar Locations Services News Government Accessibility 1777 Broadway Boulder , CO 80302 Contact Us YouTube Twitter Facebook Instagram LinkedIn Nextdoor © 2024 City of Boulder. All Rights Reserved. Privacy Policy " -1285,https://www.hayward-ca.gov/discover/news/oct16/turn-your-prescription-drugs-hayward-police-department-1022,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1286,https://www.lasalle-il.gov/departments/police-department/registered-sex-offenders,Sex Offender Registry,Agency-Published Resources,Registered Sex Offenders | City of La Salle,"Sex offenders residing in the City of LaSalle are required by law to register with the LaSalle Police Department.  The LaSalle Police Department was the first agency in the Illinois Valley to go beyond what is required by law.  In addition to keeping up to date files, photos and conviction records, the LaSalle Police Department verifies sex offender addresses numerous times a year to help ensure compliance.  Much of this information, including photos of registered sex offenders is available online to the general public.",200,"Error retrieving title: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))","[""Registered Sex Offenders""]","[""Main navigation"", ""Breadcrumb"", ""Main Menu"", ""Important Info""]",[],[],[],[],"Search Phone: 815-223-3755 Fax: 815-223-9508 Contact Us Main navigation MENU About La Salle Our Mission Event Calendar Historical Tour City Profile » Tourism Ward Map Canal Corridor Association City Services Municipal Information Directory City Government City Mayor City Clerk/Deputy Clerk City Officials City Committees La Salle Promotional & Advisory Committee (LPAC) Ordinances & Codes Departments Building Department Frequently Asked Questions Engineering Frequently Asked Questions Finance/Utility Billing Annual Audits Budget/Appropriations Labor Contracts What We Do Utility Billing Water & Sewer Rates Fire Department Department Overview Department History ISO Rating Apparatus Showcase Public Education Disaster Preparedness Storm Ready Community Fire Department Links Knox Box System Parks & Recreation Interactive Park Map La Salle Parks Information Pollinator Park Police Department Patrol Division Detective Division Communications Division School Resource Officer Program Community Programs TRI-DENT Crime Free Housing Registered Sex Offenders Moving to Town Safety Tips Important Phone Numbers Public Works Frequently Asked Questions What We Do Development Properties Available Properties Business Development Economic Development Development Incentives » TIF Districts Enterprise Zone Redevelopment Incentive Program Hotels & Short Term Rentals Community COVID-19 Info Businesses Dining Health Care Senior Services Worship Education Farmer's Market Public Library Illinois Valley YMCA NewsTribune La Salle Business Association (LBA) Job Market Information Online Services Breadcrumb Departments Police Department Registered Sex Offenders Sex offenders residing in the City of LaSalle are required by law to register with the LaSalle Police Department.  The LaSalle Police Department was the first agency in the Illinois Valley to go beyond what is required by law.  In addition to keeping up to date files, photos and conviction records, the LaSalle Police Department verifies sex offender addresses numerous times a year to help ensure compliance.  Much of this information, including photos of registered sex offenders is available online to the general public. By clicking on the links below, you can be directed to these websites which may be searched for LaSalle and other area sex offenders. City Offices: 745 Second Street La Salle, Illinois 61301 Phone: 815-223-3755 Fax: 815-223-9508 Email the City Office City Office Hours: Monday - Friday: 7:30 a.m. - 4:00 p.m. Main Menu Home About La Salle Departments Development Community Contact Us Sitemap Important Info Privacy Policy External Site Policy FOIA Information USA.gov HHS.gov Accessibility Plugins Find Us On Facebook Copyright © 2017-2018 City of LaSalle. All Rights Reserved. La Salle Web Design by Anttix, Inc. " -1287,https://www.hayward-ca.gov/your-government/departments/police,Resources,Agency-Published Resources,Police | City of Hayward - Official website,"In partnership with the community, we will create and maintain neighborhoods capable of sustaining civic life. We commit to reducing the levels of crime, fear, and disorder through community-based, problem-oriented, and data-driven policing",200,City of Hayward - Official website,"[""Police""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form"", ""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment""]","[""Services & Programs""]","[""Department Director"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]","[""Services"", ""Programs"", ""Bryan Matthews""]","[""Office Hours"", ""Lost and found animals"", ""Obtain a dog license"", ""Report an animal emergency"", ""Report animal abuse"", ""Report animal problems (noisy, wild, stray, dead)"", ""Spay or neuter your pet"", ""Surrender your pet"", ""Volunteer at the Animal Shelter"", ""Child, youth & family counseling"", ""Youth and Family Services Bureau"", ""Compliment an officer"", ""File a police report"", ""Police recruitment and employment"", ""Report neighborhood drug activity"", ""Request a police ride along"", ""Request a police station tour"", ""Request copies of police reports"", ""Report a traffic problem"", ""Report/prevent identity theft"", ""Sign up for Hayward Neighborhood Alert"", ""Adopt an animal"", ""Traffic accident investigation and reports"", ""Submit a Public Records Act Request to the Hayward Police Department"", ""Report an abandoned/inoperable vehicles on a public street"", ""Report Illegal Fireworks"", ""Make a donation to the Hayward Animal Shelter"", ""Hayward Evaluation And Response Teams (HEART) Program"", ""Resources for victims of domestic violence & human trafficking"", ""Crisis hotlines"", ""Sign-up to receive emergency alerts from the City, Fire and Police departments"", ""Find crime prevention resources & tips""]",Skip to main content -1288,https://delcopa.gov/courts/judges/brennan.html,Contact Info & Agency Meta,Info About Agencies,Judge Mary Alice Brennan - Delaware County Court of Common Pleas,"",200,"Delaware County, Pennsylvania","[""Judge Mary Alice Brennan""]",[],"[""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[],"Menu A to Z Court Departments Local Rules FAQ Government Center Judge Mary Alice Brennan Home / Court Departments / Board of Judges / Judge Mary Alice Brennan Judge Mary Alice Brennan was elected by the citizens of Delaware County to a ten-year term on the Court of Common Pleas in the November, 2007 election and swore her oath of judicial office on January 4, 2008. Judge Brennan is a lifelong resident of Delaware County. She is a graduate of St. Madeline School, Interboro High School, Brigham Young University and the Widener University School of Law. Judge Brennan was appointed to Delaware County Council in 2002 and was elected in November, 2003 to a four-year term. As a Council member, she served in various capacities, among them improving public safety and voter education. Prior to her appointment to Delaware County Council, Judge Brennan served for nearly nine years as District Justice in Upper Darby Township. While serving in that capacity, she was appointed by the Pennsylvania Supreme Court to serve on the Intergovernmental Task Force to study the District Justice System. Judge Brennan also was appointed by the Chief Justice to the District Justice Task Force Ad-Hoc Committee to serve for the purpose of proposing implementation strategies to the improved operation of the District Court system. She was admitted to the Bar in 1986; and in addition to a general practice of law, she has served various solicitorships and as a Public Defender. Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 delcocourts@co.delaware.pa.us Courts Quick Links Juror eResponse PA Law Help Self Help - Custody Self Help - Divorce Juror Handbook Language Access Family Court Self Represented Litigant Guide Government Center Quick Links Marriage Licenses Crisis Connection Certified Recovery Specialist Public Access Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Judge Mary Alice Brennan Home / Court Departments / Board of Judges / Judge Mary Alice Brennan Judge Mary Alice Brennan Home / Court Departments / Board of Judges / Judge Mary Alice Brennan Judge Mary Alice Brennan Home / Court Departments / Board of Judges / Judge Mary Alice Brennan " -1289,https://delcopa.gov/publicrelations/releases/2021/covid_popupvaccinationprogram.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Launches Pop-Up COVID-19 Vaccination Program - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Launches Pop-Up COVID-19 Vaccination Program""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Mobile Vaccination Team to Visit Municipalities throughout the County""]",[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County Launches Pop-Up COVID-19 Vaccination Program Home / Departments / Public Relations Releases / Delaware County Launches Pop-Up COVID-19 Vaccination Program Released: May 14, 2021 Mobile Vaccination Team to Visit Municipalities throughout the County Delaware County Council and the Delaware County COVID-19 Task Force are partnering with municipalities throughout Delaware County to launch the Pop-Up COVID-19 Vaccination Program. Beginning on Monday, May 17, and over the next six weeks, members of the COVID-19 Task Force will hold small COVID-19 vaccination clinics in municipalities across Delaware County. Most municipalities will host one Pop-Up Clinic, either in the morning from 9 a.m. – 11:30 a.m., or in the afternoon from 1:30 p.m. to 4 p.m. Sites will typically include libraries, recreation centers, parks, and other public locations that are convenient to residents in the community and offer easy parking and/or easy access for pedestrians. All vaccinations are free. No identification, health insurance or appointments are required. Residents will be offered a choice of either the single-dose Johnson & Johnson vaccine, or the two-dose Moderna vaccine. Second doses for those who prefer the Moderna vaccine will be scheduled for the same community approximately five weeks after the first dose, within the 28- to 42-day window recommended by the CDC. The Pfizer vaccine will not be provided as part of this program; therefore, vaccinations will be only offered to adults ages 18 and over. A schedule of Pop-Up COVID-19 Vaccination Clinic locations will be updated on the Delaware County website at delcopa.gov/pop-ups . The website also provides additional information about COVID-19 testing, vaccinations, assistance programs, and general guidance. Individuals can also contact the Delaware County COVID-19 Call Center by phone at (484) 276-2100, or by email covid19resources@co.delaware.pa.us , for additional information about the program. The Pop-Up COVID-19 Vaccination Program schedule for the first week of this program, Monday May 17, through Friday, May 21, is included on the graphic below. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play " -1290,https://delcopa.gov/publicrelations/releases/2022/gwhgraduation.html,Media Bulletins,Agency-Published Resources,"George W. Hill Correctional Facility Training Academy Graduates 16 New Correctional Officers - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""George W. Hill Correctional Facility Training Academy Graduates 16 New Correctional Officers""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -1291,https://www.southamptontownnypolice.gov/faq.aspx?qid=373,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Should I have multiple phone numbers on file with my,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Comptroller - Alarm Billing""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1292,https://pittsburghpa.gov/files/police/orders/ch1/16-01-standards-of-conduct.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1293,http://police.portlandmaine.gov/1167/ocean-gateway,Not Criminal Justice Related,Not Criminal Justice Related,"Ocean Gateway | Portland, ME - Official Website",Ocean Gateway,200,"Portland, ME - Official Website | Official Website","[""Ocean Gateway""]",[],[],[],[],[],"Skip to Main Content Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities Venues Ocean Gateway Ocean Gateway City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space Government Websites by CivicPlus® Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities Venues Ocean Gateway Ocean Gateway City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space Government Websites by CivicPlus® Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities Venues Ocean Gateway Ocean Gateway City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space Government Websites by CivicPlus® Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities Venues Ocean Gateway Ocean Gateway City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space Government Websites by CivicPlus® Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities Venues Ocean Gateway Ocean Gateway City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space Home Your Government Departments Parks, Recreation & Facilities Venues Ocean Gateway Ocean Gateway City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space Home Your Government Departments Parks, Recreation & Facilities Venues Ocean Gateway Ocean Gateway City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space Home Your Government Departments Parks, Recreation & Facilities Venues Ocean Gateway Ocean Gateway Home Your Government Departments Parks, Recreation & Facilities Venues Ocean Gateway Ocean Gateway Home Your Government Departments Parks, Recreation & Facilities Venues Ocean Gateway Ocean Gateway Ocean Gateway City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® " -1294,https://www.ci.san-bernardino.ca.us/news/archived_news/downtown_specific_plan_scoping_meeting,Not Criminal Justice Related,Not Criminal Justice Related,Downtown Specific Plan Scoping Meeting - City of San Bernardino,"",200,Just a moment...,"[""City of San Bernardino California""]","[""Downtown Specific Plan Scoping Meeting""]",[],[],[],[],Skip to Content -1295,http://www.longbeach.gov/police/press-releases/traffic-fatality---burnett-street-and-pacific-avenue/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY - BURNETT STREET AND PACIFIC AVENUE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/19/2019 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY - BURNETT STREET AND PACIFIC AVENUE Contact: Media Relations Detail (562) 570-5273 LBPDMediaRelations@longbeach.gov On Monday, February 18, 2019, at approximately 8:45 p.m., officers responded to the intersection of West Burnett Street and Pacific Avenue regarding an injury traffic accident, which resulted in the death of the pedestrian. Officers located an unconscious pedestrian, a 63-year-old male resident of Long Beach, lying in the middle of the intersection and a bystander performing CPR on the pedestrian. The Long Beach Fire Department responded and continued life-saving measures on the pedestrian. The pedestrian was then transported to a local hospital where he succumbed to his injuries a short time later. The preliminary investigation revealed that the pedestrian was crossing in the marked crosswalk eastbound on Pacific Avenue when, at the same time, a 2003 Mercedes Benz E320 was traveling southbound in the number one lane on Pacific Avenue striking the pedestrian.  The driver of the Mercedes Benz, a 41-year-old male resident of Long Beach, stopped to assist the pedestrian after the collision and called 9-1-1. The pedestrian’s identification is being withheld pending notification of next of kin. Detectives do not believe the driver of the vehicle was under the influence of alcohol or drugs. The driver possessed a valid driver's license and insurance. Anyone with information regarding the collision is asked to contact Detective Steve Fox of the Collision Investigation Detail at (562) 570-7110. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1296,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/011322blotter.pdf,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -1297,https://alpha.austin.gov/police-oversight/formal-complaint-incident-reporting-and-other-policy-violations/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1298,http://www.longbeach.gov/police/press-releases/reward-issued-in-2013-murder-investigation/,Media Bulletins,Agency-Published Resources,REWARD ISSUED IN 2013 MURDER INVESTIGATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/19/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: REWARD ISSUED IN 2013 MURDER INVESTIGATION Contact: Media Relations Detail (562) 570-7244 Victim Wallace The Los Angeles County Board of Supervisors, at the recommendation of Supervisor Don Knabe, has issued a $10,000 reward for information leading to the arrest and conviction of the person(s) responsible for the 2013 murder of 19-year-old Sidney Wallace of Los Angeles. On Thursday, March 28, 2013, at approximately 9:15 p.m., Long Beach Police responded to a shots fired call in the 200 block of E. Hill Street. Officers discovered three male subjects who had sustained gunshot wounds, one of them being Victim Wallace, who had been struck multiple times in the upper body and pronounced deceased at the scene. The two other victims, ages 37 and 49 and both from Long Beach, had received non life-threatening injuries and were transported to a local hospital for treatment. The preliminary investigation determined that the victims were standing in a parking lot adjacent to an apartment complex when approached and fired upon. Detectives were not able to obtain any suspect or vehicle description(s) throughout the investigation. It was determined that Victim Wallace was not a gang-member. Anyone with information relating to this incident is urged to contact Long Beach Police Homicide Detectives Mark McGuire and Greg Krabbe at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1299,http://chico.ca.us/post/chico-police-utilize-grant-money-dui-enforcement,Media Bulletins,Agency-Published Resources,City of Chico - Site Search,"",200,City of Chico - Home,"[""City of Chico"", ""City of Chico""]","[""Site Search""]","[""Contact Us"", ""Quicklinks"", ""City Resources"", ""Stay Connected"", ""Contact Us"", ""Quicklinks"", ""Follow\n \n City of Chico""]",[],[],[],skip to main content -1300,https://www.southamptontownnypolice.gov/faq.aspx?qid=400,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Why do some homeowners have a pathway through the mid,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Trustees - Endangered Species""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1301,https://hilliardohio.gov/hilliard-officer-named-central-ohios-top-cop/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1302,https://www.knoxvilletn.gov/government/city_departments_offices/police_department/field_operations_bureau/inspections_unit/taxi_limo_services/application_for_certificate_of_public_convenience_and_necessity___p_d_f_,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1303,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/041222blotter.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1304,http://www.longbeach.gov/police/press-releases/halloween-safety-tips2/,Media Bulletins,Agency-Published Resources,HALLOWEEN SAFETY TIPS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/29/2018 FOR IMMEDIATE RELEASE Press Release # Subject: HALLOWEEN SAFETY TIPS Contact: Media Relations Detail (562) 570-5273 (Click image to enlarge ) With Halloween right around the corner, the Long Beach Police Department would like to encourage the community to practice the following safety tips for a safer and fun filled night: Be sure your child’s activities are age-appropriate All children should be accompanied by an adult Only visit homes that are well-lighted and never go into a stranger’s house Stay on the sidewalk and only cross at corners Stay in well populated areas and never cut through alleys or parks after dark Apply reflective tape to your child’s costume or use glow sticks for better visibility Use face paint rather than masks that may block your child’s vision Map out your route ahead of time and carry a flashlight with you Ensure props (pitchforks, swords, etc.) do not have sharp edges Be cautious of dogs on the loose and keep your pet(s) indoors Inspect your child’s candy before allowing them to eat it Report any suspicious or illegal activity by calling 9-1-1 immediately Motorists are advised to be extra cautious on Halloween night and to drive slowly Do not drink and drive; plan ahead and designate a driver or call for a sober ride Reminder : The curfew law in Long Beach prohibits anyone 17-years-old or younger from being out past 10:00 p.m. without a parent/guardian, unless going to or returning home from work or an organized event supervised by an adult, without any detour or stop. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1305,https://delcopa.gov/employment/jobpostings/clerical.html,Training & Hiring Info,Info About Officers,"Blank - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Clerical""]",[],"[""Delco Jobs Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Clerical""]",[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Clerical Home / Departments / Delco Jobs / Clerical Clerical There are currently several clerical positions available in various County and Court departments. Minimum requirements include: High school graduate or equivalent Basic computer skills with a working knowledge of Microsoft Office Prior office experience preferred Basic job duties include: Filing/maintaining databases Data entry Answering telephones Customer Service Typing To apply, please fill out our online application form . Delaware County is an Equal Opportunity Employer.  Submitted applications will remain active for one year. Delco Jobs Navigation By Title By Location How to Submit an Application Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Clerical Home / Departments / Delco Jobs / Clerical Clerical Home / Departments / Delco Jobs / Clerical Clerical Home / Departments / Delco Jobs / Clerical Clerical There are currently several clerical positions available in various County and Court departments. Minimum requirements include: High school graduate or equivalent Basic computer skills with a working knowledge of Microsoft Office Prior office experience preferred Basic job duties include: Filing/maintaining databases Data entry Answering telephones Customer Service Typing To apply, please fill out our online application form . Delaware County is an Equal Opportunity Employer.  Submitted applications will remain active for one year. Delco Jobs Navigation By Title By Location How to Submit an Application Clerical There are currently several clerical positions available in various County and Court departments. Minimum requirements include: High school graduate or equivalent Basic computer skills with a working knowledge of Microsoft Office Prior office experience preferred Basic job duties include: Filing/maintaining databases Data entry Answering telephones Customer Service Typing To apply, please fill out our online application form . Delaware County is an Equal Opportunity Employer.  Submitted applications will remain active for one year. Delco Jobs Navigation By Title By Location How to Submit an Application Delco Jobs Navigation By Title By Location How to Submit an Application Delco Jobs Navigation " -1306,https://alpha.austin.gov/police-oversight/body-worn-cameras-and-dashboard-cameras-final-recommendations-report/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1307,https://delcopa.gov/vote/news/20nov5update.html,Not Criminal Justice Related,Not Criminal Justice Related,"Nov. 5th 3pm update from the Delaware County Bureau of Elections - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Nov. 5th 3pm update from the Delaware County Bureau of Elections""]",[],"[""Delco Votes!"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Nov. 5th 3pm update from the Delaware County Bureau of Elections Home / Elections / Elections News / Nov. 5th 3pm update from the Delaware County Bureau of Elections The Delaware County Bureau of Elections has processed approximately 104,000 vote-by-mail (mail-in and absentee) ballots as of Wednesday afternoon, with approximately 15,000 vote-by-mail ballots yet to be counted. This includes 220 vote-by-mail ballots postmarked by 8 p.m. on Election Day and received by the Bureau via USPS on Wednesday. Vote-by-mail ballots continue to be systematically processed. The Bureau is working to have the majority of all vote-by-mail ballots received to-date processed by end-of-day today. A small number of ballots will continue to be delivered by USPS through 5 p.m. on Friday, November 6. These will be processed as the County receives them. The Bureau will also continue to receive and process military and overseas VBM ballots through the deadline of 5 p.m. on Tuesday, November 10. The public is invited to observe the pre-canvassing and canvassing proceedings taking place at the Bureau of Elections Wharf facility by viewing the live stream that is accessible from the Delco Votes! website at https://delcopa.gov/vote/results.html . For additional oversight, one authorized representative observer of each candidate in the election and one representative from each political party have been permitted to be in the room in which the absentee ballots and mail-in ballots are canvassed. The count of provisional ballots, included with the materials returned by each precinct’s Judge of Elections, will begin on Saturday at 9 a.m. This process will likely take several days. Delco Votes! Home Election News & Notices Voter Registration Sample Ballots Election Calendar Voter Resources Poll Worker Resources Candidate Resources Military & Overseas Where to Vote In-Person Ballot Drop Box Locations Vote-by-Mail Ballots Voter Service Centers FAQ Election Hotline Election Results About Us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play " -1308,https://londonky.gov/london-police-promote-officers/,Personnel Records,Info About Officers,"London Police Promote Officers – City of London, Kentucky","",200,"City of London, Kentucky – London, Kentucky","[""London Police Promote Officers""]",[],"[""Search"", ""Archive"", ""About London"", ""London City Hall""]",[],"[""Sign In"", ""Lost Password""]",[],"Home Government ABC Office Building Inspector City Council City Hall Employment Application Restaurant Tax Form Code Enforcement Parking Ticket Payment Ethics Ordinance Directory Planning & Zoning Public Works Recycling Parks and Recreation A.R. Dyche Memorial Park Levi Jackson Park Scott Rose Foundation Playground & Musical Park Mill Street Park Treetop Adventure Whitley Branch Veteran’s Park/London Rotary Around London London Chamber of Commerce London Downtown London Utility Commission Economic Development Authority Farmer’s Market London Community Center London-Corbin Airport London Fire Department London-Laurel Rescue Squad London Police Department London-Laurel Tourist Commission 911 Communications Center London Police Promote Officers May 13, 2021 Community The London Police Department is pleased to announce the following promotions and assignments: Capt. Randy Medlock has been promoted to the rank of Major. Major Medlock has served with the department for 16 years. Sgt. Travis Dotson has been promoted to the rank of Operations Lieutenant. Lieutenant Dotson has served with the department for 19 years. Sgt. Ryan Jackson has been promoted to the rank of Investigative Lieutenant. Lieutenant Jackson has served with the department for 11 years. Sgt. Travis Couch has been promoted to the rank of Operations Lieutenant. Lieutenant Couch has served with the department for 13 years. Sgt. Eric Stallard has been awarded the assignment of Detective. Detective Stallard has served with the department for 14 years. Chief Darrel Kilburn notes, “I am extremely proud of these men for their dedication and love for this department, and even more so for this community. Each of them has served admirably throughout their careers and the London Police Department is blessed to have them. Please keep them, along with their families, in your prayers.” Previous Article City of London Ordinance No. 2020-08 Development Ordinance Next Article London Police Award Officers Search Archive Archive Select Category Agendas  (25) archived  (2) Bids  (2) City Council  (90) Minutes  (29) Community  (59) COVID-19  (9) Job Postings  (5) Local Alerts  (30) Local Business  (20) Ordinances  (31) Parks & Recreation  (21) Public Works  (5) Recycling  (1) Tourism  (2) Town Center  (1) Uncategorized  (3) About London The City of London is located in Laurel County, Ky. With over 8,000 residents, London has been named the Cycling Capital of Kentucky, Kentucky’s 5th official Trail Town, certified Tree City by Tree City USA, and annually hosts the World Chicken Festival. The City of London’s rights were granted in the Commonwealth of Kentucky in February of 1836. London City Hall 501 South Main Street London, KY 40741 Phone: (606) 864-4169 City of London Facebook Page Legal Notice Privacy Policy Employee Login © 2024 City of London, KY Annex Information Development Open-Top Containers Open Records Events Fireworks Food Truck Apply " -1309,http://www.cityofpataskalaohio.gov/cop_folder/minutes-2015/,List of Data Sources,Info About Agencies,Minutes 2015 - City Of Pataskala,Official Website,200,Home - City Of Pataskala,"[""City Of Pataskala"", ""Minutes 2015""]","[""Official Website""]",[],[],[],[],Document Library Calendar Public Services Pay Court Ticket Online City Of Pataskala Official Website Blog Community Police Obtain Fingerprints Solicitor’s Permit Citizens Police Academy Important Links/Resources Prescription Drug Drop Off Police Officer Job Application History of the Pataskala Police Department Curfew Vacation House Check Form Fire School Districts Residents Taxes in Pataskala RITA Tax Local Animal Shelter/Lost Pets Dog License BMV Info Licking County Health Department Register to Vote Report a Gas Emergency New to Pataskala? Good Neighbor Guidelines Outdoor Activities Attractions City Departments Mayor Administration Garage Sale Permit Adopt-A-Street Program Rent a Park Shelter Current Bids and RFQ’s Outdoor Activity/Event Permit Parade-Assembly Form Parks and Recreation Economic Development Human Resources Utilities Utility Rates Water and Sewer Billing/ E-Billing Interesting Facts and Information Storm Water Management Program Report a Water Leak Finance Pataskala’s Income Tax Budget Financial Reports Popular Annual Financial Report (PAFR) Annual Comprehensive Financial Reports Financial Condition Reports 2023 Financial Condition Reports 2022 Financial Condition Reports 2021 Financial Condition Reports 2020 Financial Condition Reports 2019 Financial Condition Reports 2018 Financial Condition Reports 2017 Financial Condition Reports 2016 Financial Condition Reports 2015 Financial Condition Reports 2014 Financial Condition Reports 2013 Financial Condition Reports 2012 Financial Condition Reports Audited Financial Reports Pataskala Open Checkbook Mayor’s Court Important Traffic Violation Info Pay Fines or Search Case Files How to Pay Fines Traffic and General Offense Codes Plea Descriptions Court Appearance Times Your Rights in the Pataskala’s Mayor’s Court Downloadable Forms Sealing a Record Informational Court Links Mayor’s Court Prosecutor Pataskala’s Mayors Court Magistrate Mayor’s Court Rules Criminal/Traffic Diversion Bond Schedule Fine Schedule Legal Public Service/Streets Pothole Repair Report a Pothole Right of Way Snow Removal Traffic Signals & Street Lights Drainage/Ditches Issues Planning & Zoning Permit Questions Planning & Zoning Fee Schedule Discharge Map Zoning Maps Permits Comprehensive Plan Properties With Posted Code Violations Government City Council Ward Map Tom H. Lee – Ward 1 Mary Hite – Ward 2 Deborah Kohman – Ward 3 Brandon Galik – Ward 4 Dustin Epperson – At-Large Jude Hampshire – At-Large Andy Walther – At Large Clerk of Council Council Packet Public Notices Agendas Meeting Minutes Audio/Video Recordings Legislation Approved Ordinances & Resolutions 2024 Resolutions 2024 Ordinances 2023 Resolutions 2023 Ordinances 2022 Resolutions 2022 Ordinances 2021 Resolutions 2021 Ordinances 2020 Resolutions 2020 Ordinances 2019 Resolutions 2019 Ordinances 2018 Resolutions 2018 Ordinances 2017 Resolutions 2017 Ordinances 2016 Resolutions 2016 Ordinances 2015 Resolutions 2015 Ordinances Codified Ordinances Charter Public Records Request Information Boards and Commissions Personnel Board of Review Planning and Zoning Commission Board of Zoning Appeals Parks and Recreation Advisory Board Planning & Zoning Commission Board of Zoning Appeals Document Library Calendar Public Services Pay Court Ticket Online -1310,https://www.sandiego.gov/police/recruiting/volunteer/sddcrt-application-submit,Poor Data Source,Poor Data Source,SDCCRT Program Application Submitted | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""SDCCRT Program Application Submitted""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Join Us"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -1311,https://police.greenvillesc.gov/653/benefits-and-incentives-for-firefighters,Not Criminal Justice Related,Not Criminal Justice Related,"Benefits and Incentives for Firefighters | Greenville, SC - Official Website","View medical, holiday, and retirement benefits for Greenville firefighters.",200,"Police Department | Greenville, SC - Official Website","[""Benefits and Incentives for Firefighters""]","[""Equipment Incentives"", ""Compensation Incentives""]","[""Contact Us"", ""Loading""]","[""Human Resources""]",[],[],"Skip to Main Content Government Departments Business Visitors Residents Search Home Departments Human Resources Job Opportunities Firefighters Benefits and Incentives for Firefighters Benefits and Incentives for Firefighters Firefighter's pension with Retirement at age 55 fully vested, with 35 years of service Medical and dental insurance (the City pays a portion of the coverage) 11 paid holidays per year Paid Military Leave Paid General Leave Longevity bonus every 5th year of service Funeral leave Credit Union enrollment available Two times annual salary up to $300,000, with a minimum benefit of $75,000 Basic Group Term Life, accidental death and dismemberment at no cost to the employees Educational tuition reimbursement Employee Assistance Program (Personal and family counseling) Free annual medical physicals Long and short-term disability plan (Voluntary) Voluntary Critical Illness (which includes cancer coverage), Accidental Injury, and Hospital Care (indemnity) insurance Equipment Incentives All personal protective equipment is provided All basic training is provided on site (no out of town travel) Compensation Incentives Base salary increases are available for firefighters who have an associate's, bachelor's, or master's degree ◦ Bilingual compensation (must pass competency test) Contact Us Human Resources jobs@greenvillesc.gov Physical Address 206 S Main Street 2nd Floor Greenville , SC 29602 Phone: 864-232-CARE (2273) Hours Monday through Friday 8 a.m. to 5 p.m. Apply Online Now Directory Benefits and Incentives for Firefighters Eligibility Requirements for Firefighters Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate " -1312,http://www.longbeach.gov/police/press-releases/buzzed-driving-is-drunk-driving/,Media Bulletins,Agency-Published Resources,Buzzed Driving Is Drunk Driving,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1313,https://www.southamptontownnypolice.gov/1450/southampton-village---agawam-pond-phase-,Not Criminal Justice Related,Not Criminal Justice Related,"Southampton Village - Agawam Pond-Phase II | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Southampton Village - Agawam Pond-Phase II""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]","[""WQIP - Fund Application"", ""Summary Sheet""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Community Preservation Fund (CPF) WQIPP - Plan/Checklist/App 2020 WQIP - Applications & Proposal Summaries Southampton Village - Agawam Pond-Phase II Southampton Village - Agawam Pond-Phase II WQIP - Fund Application Southampton Village - Agawam Pond-Phase II - WQIPP Application Summary Sheet Southampton Village - Agawam Pond-Phase II Cornell Cooperative Extension-Shellfish & Habitat Flying Point Comfort Station Hampton Resorts (Atlantic Hotel) IA System Mashashimuett Park NRB for Residences Pump Out Program-Waste Water Treatment- Trustees Sag Harbor Village- Sewer Master Plan Southampton Village - Agawam Pond-Phase II Southampton Village - WQIP Southampton Village-Old Town Pond Westhampton Beach Sewer Treatment Project Woodhull Fish Passage Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Community Preservation Fund (CPF) WQIPP - Plan/Checklist/App 2020 WQIP - Applications & Proposal Summaries Southampton Village - Agawam Pond-Phase II Southampton Village - Agawam Pond-Phase II WQIP - Fund Application Southampton Village - Agawam Pond-Phase II - WQIPP Application Summary Sheet Southampton Village - Agawam Pond-Phase II Cornell Cooperative Extension-Shellfish & Habitat Flying Point Comfort Station Hampton Resorts (Atlantic Hotel) IA System Mashashimuett Park NRB for Residences Pump Out Program-Waste Water Treatment- Trustees Sag Harbor Village- Sewer Master Plan Southampton Village - Agawam Pond-Phase II Southampton Village - WQIP Southampton Village-Old Town Pond Westhampton Beach Sewer Treatment Project Woodhull Fish Passage Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... " -1314,https://www.mass.gov/info-details/situational-analysis-of-municipal-police-in-service-training-in-the-commonwealth,Training & Hiring Info,Info About Officers,Situational Analysis of Municipal Police In-Service Training in the Commonwealth | Mass.gov,An overview of the history and current state of municipal police in-service training in Massachusetts,200,Mass.gov,"[""Situational Analysis of Municipal Police In-Service Training in the Commonwealth""]","[""Table of Contents for the report, Municipal Police In-Service Training: Funding and Cooperation across the Commonwealth"", ""Appendix"", ""Table of Contents"", ""1. Municipal Police Training and the Municipal Police Training Committee: An Introduction"", ""2. Legal and Legislative Analysis"", ""3. MPTC Training Sources"", ""4. Finance"", ""Help Us Improve Mass.gov with your feedback""]","[""New Recruit Training"", ""In-Service Training"", ""Specialized Training"", ""Other Legislative Requirements"", ""Liability for Failure to Train"", ""MPTC-Authorized Police Academies"", """", ""Other Training Sources""]",[],[],[],"" -1315,https://detroitmi.gov/es/departments/aeropuerto-internacional-coleman-young/mi-vuelo-paseos-en-helicoptero,Poor Data Source,Poor Data Source,Mi Vuelo Paseos en Helicóptero | City of Detroit,"Fundada en Metro-Detroit en 2016 en el aeropuerto Coleman A. Young, My Flight Tours se ha expandido mucho más allá del área de Detroit y en algunos de los destinos turísticos más populares de Michigan y más allá. Con la mayor cantidad de ubicaciones en todo el estado, My Flight Tours es el operador turístico más grande de Michigan. My Flight fue fundado por un joven empresario con el fin de compartir su pasión y amor por el vuelo con otros, notó la necesidad en el mercado de viajes en helicóptero asequibles y familiares. Esta es exactamente la experiencia que aún brindamos a nuestros clientes en la actualidad. Nuestros recorridos turísticos en helicóptero brindan a los clientes una vista panorámica única de Michigan con comodidad y estilo. El compromiso de My Flight Tours con el servicio al cliente solo se compara con su compromiso con la seguridad. Con la seguridad al frente de nuestra operación, My Flight se enorgullece de tener un registro de CERO accidentes e incidentes. Este logro habla de la dedicación continua tanto al mantenimiento como a la capacitación en seguridad. El equipo de My Flight supera con creces las expectativas de cualquier otro operador turístico en helicóptero. Saludan personalmente a cada pasajero, brindan una orientación completa del vuelo antes de la salida e interactúan con los invitados en cada paso del camino. Nuestro equipo es la cara de My Flight y los pasajeros a menudo acreditan su experiencia memorable a nuestro equipo y lo más destacado de su vuelo. Con nuestro inigualable servicio al cliente, los pilotos más capacitados, los más altos estándares de seguridad y opciones únicas de recorridos que se expanden continuamente, My Flight sigue siendo líder en la industria de recorridos turísticos en helicóptero. My Flight presta servicios a aproximadamente 30 clientes por día. My Flight Helicopter Tours My Flight Helicopter Tours 2",200,City of Detroit | Opportunity Rising,"[""Mi Vuelo Paseos en Helicóptero""]","[""Top Links"", ""Site Menu"", ""Documentos""]",[],"[""CONTACTOS"", ""MENÚ DE DEPARTAMENTO""]","[""My Flight One year""]",[],"" -1316,https://www.providenceri.gov/police/providence-police-recruitment-application/clements_e-sig/,Poor Data Source,Poor Data Source,City of Providence clements_e-sig - City of Providence,"",200,Sucuri WebSite Firewall - Access Denied,"[""clements_e-sig""]","[""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español"", ""Lists *""]",[],[],[],"Skip To Menu Skip To Content Skip To Accessibility Options Language Language Arabic Chinese (Traditional) English Khemer Portuguese Spanish City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley City Of Providence Mayor Brett Smiley Search Accessibility CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation PVD 311 CITY HALL I Want to … MAYOR BRETT P. SMILEY Departments City Council Find a Meeting Agenda Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Running a Business Starting a Business Purchasing EVENTS NEWS EXPLORE Explore Providence Parks Recreation ACCESSIBILITY clements_e-sig Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn clements_e-sig Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn Share this story email icon. Click to share on email twitter icon. Click to share on twitter facebook icon. Click to share on facebook linkedIn Icon. Click to share on LinkedIn SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * Providence City Hall 401-680-5000 25 Dorrance Street Providence, Rhode Island 02903 Get Directions For press inquires, click here. Follow Us on Social Media: Facebook Icon Twitter Icon Instagram Icon SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español Email * Lists * City News Zip * " -1317,https://www.lakewoodoh.gov/coffee-with-a-cop-set-for-may-4th/,Not Criminal Justice Related,Not Criminal Justice Related,"Coffee with a Cop set for May 4th | The City of Lakewood, Ohio","The Lakewood Police Department will host another ""Coffee With A Cop"" event on Wednesday, May4, 2022 from 9:00 a.m. to 11:00 1.m. at The Doughnut Pantry, 14600",200,"The City of Lakewood, Ohio","[""Coffee with a Cop set for May 4th""]",[],"[""Recent News"", ""Upcoming Events"", ""Most Popular Pages""]",[],[],[],"Search for: Search Facebook Twitter YouTube Instagram News Minutes/Agendas A-Z Index Contact City Hall FAQs Apply / Register Apply For A Job Autism Safety Roster Block Party Permits Boards / commissions Building Permits Contractor registration Donation Box Permit Do-Not-Knock Registry Food Trucks Housing Assistance Housing Assistance Housing License Landlord Training Seminar Pavilion Rentals Solicitor’s License Summer Sprinkling Prg Vendors Payments / Taxes Pay your water bill Pay your EMS bill Pay Your Parking Ticket Taxes Calendar City Council Court Departments Boards/commissions Community Development Early Childhood Family & Youth Services Finance Fire Department Housing & Building Human Resources Human Services Law Mayor’s Office Municipal Income Tax Planning & Development Police Department Purchasing Division Public Works Engineering Parks Refuse & Recycling Streets & Forestry Water & Wastewater Collection Wastewater Treatment Senior Services Vital Statistics Report A Problem Coffee with a Cop set for May 4th May 03, 2022 The Lakewood Police Department will host another “Coffee With A Cop” event on Wednesday, May4, 2022 from 9:00 a.m. to 11:00 1.m. at The Doughnut Pantry, 14600 Madison Avenue. Join members of the department for coffee and conversation.  This is a chance to ask questions and to get to know your neighborhood officers. The participating officers  will have some tokens to give away to those who stop by. This will hopefully help to strengthen the relationship between residents and the police, and also help a business out in the process. The Lakewood Police Department’s “Coffee With A Cop” event is part of a national movement.  For more information, please visit coffeewithacop.com . Recent News No Refuse & Recycling Collection on Monday, April 1st March 22, 2024 Lakewood Tax Office To Offer Extended Hours March 18, 2024 H2O Summer Service Camp Registration Begins Tuesday, March 19th March 15, 2024 Upcoming Events Monday Drop-In March 25, 2024 Housing, Planning & Development Committee Meeting March 25, 2024 Toddler Tuesday March 26, 2024 Most Popular Pages Heritage Home Loan Prgm Eclipse Infomation E-Newsletter Sign-Up Safe Place Initiative Lakewood Life Newsletter Downtown Development Frequently Asked Questions Lkwd Park Waterfront Feasibility Study Interceptor Tunnel Rehabilitation Project Birth/Death Certificates Minutes/Agendas Public Record Requests Clean Water Lakewood Pavilion Rentals Public Art Accountability & Sound Governance Lakewood City Hall: 12650 Detroit Ave. Lakewood, OH 44107 (216) 521-7580 Hours: 8:00 AM to 4:30 PM Read Website Policy>> Receive Lakewood City News & Updates Email * Example: Yes, I would like to receive emails from The City of Lakewood, Ohio. (You can unsubscribe anytime) Constant Contact Use. By submitting this form, you are consenting to receive marketing emails from: The City of Lakewood Ohio, 12650 Detroit Avenue, Lakewood, OH, 44107, https://lakewoodoh.gov. You can revoke your consent to receive emails at any time by using the SafeUnsubscribe® link, found at the bottom of every email. Emails are serviced by Constant Contact Read Disclosure » Facebook Twitter YouTube Instagram " -1318,https://bolivar.mo.us/shop-with-a-copr/img_1293-2/,Poor Data Source,Poor Data Source,"IMG_1293 - City of Bolivar, Missouri","",200,"Welcome to Bolivar - Where Liberty Flows - City of Bolivar, Missouri","[""IMG_1293""]",[],[],[],[],[],"Skip to content DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us IMG_1293 Home Departments Police Shop with a Cop® IMG_1293 12 Dec 2014 by City Administrator WordPress Theme - Total by HashThemes DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us IMG_1293 Home Departments Police Shop with a Cop® IMG_1293 12 Dec 2014 by City Administrator IMG_1293 Home Departments Police Shop with a Cop® IMG_1293 IMG_1293 Home Departments Police Shop with a Cop® IMG_1293 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator WordPress Theme - Total by HashThemes WordPress Theme - Total by HashThemes WordPress Theme - Total by HashThemes " -1319,http://www.longbeach.gov/police/press-releases/september-is-california-pedestrian-safety-month/,Media Bulletins,Agency-Published Resources,SEPTEMBER IS CALIFORNIA PEDESTRIAN SAFETY MONTH,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/5/2018 FOR IMMEDIATE RELEASE Press Release # Subject: SEPTEMBER IS CALIFORNIA PEDESTRIAN SAFETY MONTH Long Beach Police Department Reminds The Public That “Pedestrians Don’t Have Armor"" Contact: Media Relations Detail (562) 570-5273 Click to enlarge image September is Pedestrian Safety Month and Long Beach Police Department (LBPD) will be joining the California Office of Traffic Safety (OTS), along with other law enforcement agencies, transportation agencies and pedestrian advocates to promote public awareness aimed at pedestrian safety. The LBPD supports efforts by OTS to educate drivers that “Pedestrians Don’t Have Armor.”  This campaign highlights the importance of pedestrian safety awareness, regardless of whether one is on foot or behind the wheel. Both in California and nationally, the number of pedestrians killed or injured on roadways is rising at alarming rates.  In 2016, 867 pedestrians were killed and more than 14,000 injured in California alone, a nearly 33 percent increase from 2012. In 2016, the LBPD investigated 16 pedestrian fatal collisions and another 335 major injury collisions. Traffic officers working this enforcement campaign and on routine patrol will be focusing on drivers as well as pedestrians who violate traffic laws such as the following: • Excessive speed • Making illegal turns • Distracted driving • Failing to stop for signs and signals • Failing to yield to drivers or pedestrians. Safety goes both ways, drivers and pedestrians must work together to exhibit safe behaviors that protect themselves and those around them, reducing injuries and saving lives. The LBPD reminds pedestrians of the following safety tips: • Use crosswalks or intersections with a stop sign or signals • Make eye contact with drivers • Look before stepping into a crosswalk Drivers are also reminded of the following: • Be alert for pedestrians • Use caution when backing up • Always wait for pedestrians to safely cross the street, and be courteous and patient Both drivers and pedestrians should avoid distractions by not using cell phones and being aware of their surroundings. Funding for this enforcement campaign is provided to the LBPD by a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1320,https://www.mass.gov/regulations/118-cmr-100-scope-and-authority,Court Cases,Jails & Courts Specific,118 CMR 1.00: Scope and authority | Mass.gov,"118 CMR establishes the procedures and standards the Commission utilizes to effectuate the purposes of the Commission including, but not limited to, the investigation and remediation of abuse of persons with disabilities who reside in the Commonwealth of Massachusetts, or of nonresident persons with disabilities who are abused while in the Commonwealth of Massachusetts, the investigation and remediation of instances of retaliation against a person for having reported such abuse or cooperated in the investigation of abuse, and the administration of the registry of care providers against whom the Commission has made a substantiated finding of registrable abuse. Download a PDF copy of the regulation below.",200,Mass.gov,"[""Regulation 118 CMR 1.00: Scope and authority""]","[""Table of Contents for the law library, 118 CMR"", ""Contact for 118 CMR 1.00: Scope and authority"", ""Table of Contents"", ""Downloads"", ""Contact"", ""Contact for 118 CMR 1.00: Scope and authority"", ""Help Us Improve Mass.gov with your feedback""]","[""Trial Court Law Libraries"", ""Trial Court Law Libraries"", ""Trial Court Law Libraries""]","[""Online"", ""Online"", ""Online""]",[],[],"" -1321,https://southamptontownnypolice.gov/faq.aspx?qid=490,Resources,Agency-Published Resources,FAQs • When will the beach be open?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Parks & Rec""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1322,http://www.longbeach.gov/police/press-releases/l.b.p.d2.-promotes-new-leaders/,Media Bulletins,Agency-Published Resources,L.B.P.D. PROMOTES NEW LEADERS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/2/2018 FOR IMMEDIATE RELEASE Press Release # 2018 Subject: L.B.P.D. PROMOTES NEW LEADERS Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department (LBPD) is proud to announce the promotion of several employees that took place at a ceremony held today in City Hall Council Chambers. Employees promoted at today’s ceremony are as follows: Promoted to Lieutenant : Sergeant James Richardson Sergeant Abram Yap Promoted to Sergeant : Officer Brian Fritz Officer Adam Burleson Officer Eduardo Reyes Jr. Officer Christopher Roth Officer Jonathan Cole Officer Richard Cawley Officer James Smigla The men and women of the LBPD congratulates the newly promoted employees and wishes them continued success in their new assignments. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/2/2018 FOR IMMEDIATE RELEASE Press Release # 2018 Subject: L.B.P.D. PROMOTES NEW LEADERS Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department (LBPD) is proud to announce the promotion of several employees that took place at a ceremony held today in City Hall Council Chambers. Employees promoted at today’s ceremony are as follows: Promoted to Lieutenant : Sergeant James Richardson Sergeant Abram Yap Promoted to Sergeant : Officer Brian Fritz Officer Adam Burleson Officer Eduardo Reyes Jr. Officer Christopher Roth Officer Jonathan Cole Officer Richard Cawley Officer James Smigla The men and women of the LBPD congratulates the newly promoted employees and wishes them continued success in their new assignments. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ A- A A+ A- A A+ A- A A+ A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/2/2018 FOR IMMEDIATE RELEASE Press Release # 2018 Subject: L.B.P.D. PROMOTES NEW LEADERS Contact: Media Relations Detail (562) 570-5273 10/2/2018 FOR IMMEDIATE RELEASE Press Release # 2018 Subject: L.B.P.D. PROMOTES NEW LEADERS Subject: L.B.P.D. PROMOTES NEW LEADERS Contact: Media Relations Detail (562) 570-5273 Contact: Media Relations Detail (562) 570-5273 " -1323,https://police.greenvillesc.gov/faq.aspx?qid=598,Resources,Agency-Published Resources,FAQs • Who is facilitating the event?,"",200,"Police Department | Greenville, SC - Official Website",[],"[""▼ Project Safe Neighborhoods""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -1324,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/080521blotter.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -1325,https://www.poconopa.gov/police/,Contact Info & Agency Meta,Info About Agencies,Police | Pocono Township,"",200,"Pocono Township | 112 Township Drive, Tannersville, Pa. 18372",[],"[""Police Department"", ""Programs & Services"", ""FAQ""]","[""Contact Info"", ""Mission Statement"", ""Department Roster"", ""Detective Division"", ""Patrol Division"", ""\""We Care\"" Program"", ""Online Form"", ""Emergency Contacts/Keyholders"", ""Drug Collection Unit"", ""Vacation Property Checks"", ""Online Form"", ""Right To Know Request"", ""Quick Links""]",[],"[""Hours of Operation:"", ""James Wagner"", ""Eric Rath"", ""Laura J. Fluegel"", ""Jill Kozic"", ""Earl Ackerman"", ""Michael Scicutella"", ""Douglas Smith"", ""Aaron Anglemyer"", ""Austin Anglemyer"", ""James Scott"", ""Christopher Gupko"", ""Marc Iannazzo"", ""Larry Miller"", ""Ryan Melley"", ""Joseph Bianchi"", ""Raymond Kuehner"", ""Christopher Chiusano"", ""Thomas Moser"", ""Devin Dehart"", ""Liam Rebetje"", ""Alex Bagley"", ""Kylie Tausendfreundt"", ""What do I do about Abandoned Vehicles"", ""What are The Directions to Pocono Township Police Department?"", ""Where do I get information for non-criminal Finger Printing?"", ""How do I make a Police Report?"", ""How do I obtain a Copy of a Police Report?"", ""How do I obtain a Copy of an Accident Report?"", ""Do I have to register my alarm system?"", ""How do I register my alarm system?"", ""Where do I pay my ticket?""]",[],"570-629-1922 112 Township Drive, Tannersville, Pa. 18372 Search for: Search MENU MENU Home About About History Departments Boards & Commissions Board of Commissioners Civil Service Commission Planning Commission Zoning Hearing Board Emergency Management Vacancy Board Police Parks & Recreation Municipal Sewer On-lot Septic Finance The Roads Department Zoning & Code Enforcement Resources Emergency Services Library Permits & Documents Local Representatives Tax Information Voting Information Open Records Municipal Stormwater (MS4) News & Events Contact Us 570-629-1922 570-629-1922 112 Township Drive, Tannersville, Pa. 18372 Search for: Search MENU MENU Home About About History Departments Boards & Commissions Board of Commissioners Civil Service Commission Planning Commission Zoning Hearing Board Emergency Management Vacancy Board Police Parks & Recreation Municipal Sewer On-lot Septic Finance The Roads Department Zoning & Code Enforcement Resources Emergency Services Library Permits & Documents Local Representatives Tax Information Voting Information Open Records Municipal Stormwater (MS4) News & Events Contact Us MENU MENU Home About About History Departments Boards & Commissions Board of Commissioners Civil Service Commission Planning Commission Zoning Hearing Board Emergency Management Vacancy Board Police Parks & Recreation Municipal Sewer On-lot Septic Finance The Roads Department Zoning & Code Enforcement Resources Emergency Services Library Permits & Documents Local Representatives Tax Information Voting Information Open Records Municipal Stormwater (MS4) News & Events Contact Us MENU MENU MENU MENU MENU MENU 112 Township Drive, Tannersville, Pa. 18372 570-629-1922 Search for: Search MENU MENU Home About About History Departments Boards & Commissions Board of Commissioners Civil Service Commission Planning Commission Zoning Hearing Board Emergency Management Vacancy Board Police Parks & Recreation Municipal Sewer On-lot Septic Finance The Roads Department Zoning & Code Enforcement Resources Emergency Services Library Permits & Documents Local Representatives Tax Information Voting Information Open Records Municipal Stormwater (MS4) News & Events Contact Us 112 Township Drive, Tannersville, Pa. 18372 570-629-1922 Search for: Search MENU MENU Home About About History Departments Boards & Commissions Board of Commissioners Civil Service Commission Planning Commission Zoning Hearing Board Emergency Management Vacancy Board Police Parks & Recreation Municipal Sewer On-lot Septic Finance The Roads Department Zoning & Code Enforcement Resources Emergency Services Library Permits & Documents Local Representatives Tax Information Voting Information Open Records Municipal Stormwater (MS4) News & Events Contact Us MENU MENU Home About About History Departments Boards & Commissions Board of Commissioners Civil Service Commission Planning Commission Zoning Hearing Board Emergency Management Vacancy Board Police Parks & Recreation Municipal Sewer On-lot Septic Finance The Roads Department Zoning & Code Enforcement Resources Emergency Services Library Permits & Documents Local Representatives Tax Information Voting Information Open Records Municipal Stormwater (MS4) News & Events Contact Us MENU MENU MENU MENU MENU MENU " -1327,https://delcopa.gov/council/newsletter/index.html,Not Criminal Justice Related,Not Criminal Justice Related,"The Delaware County Weekly Newsletter - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""The Delaware County Weekly Newsletter""]",[],"[""County Council Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""THE DELAWARE COUNTY WEEKLY"", ""March 2024 Editions"", ""February 2024 Editions"", ""January 2024 Editions""]",[],[],"" -1328,http://www.longbeach.gov/police/press-releases/murder---3100-block-e-artesia-blvd/,Media Bulletins,Agency-Published Resources,MURDER,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/25/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: MURDER Contact: LBPD Media Relations (562) 570-5273 On July 24, 2017 at 3:17 p.m. Long Beach Police Officers were called to a stabbing at an assisted living facility in the 3100 block of Artesia Boulevard. When officers arrived they found an adult female at the location with stab wounds to her upper torso. The suspect, who was a roommate of the victim, was detained at the scene by investigating officers. The Long Beach Fire Department responded to the location and transported the victim to a local hospital. The victim was pronounced deceased shortly thereafter. Homicide detectives responded to the scene for the investigation. The motive for the stabbing is unknown at this time. The victim has been identified as Alice Pritchard who was a 93 year old resident of Long Beach. The suspect in the murder has been identified as Linda Womack who is a 65 year old resident of Long Beach. She was booked for murder and is being held with a bail of $2,000,000. Anyone with information regarding this incident is asked to call Homicide Detectives Mattia or Goodman at (562) 570-7244. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 800- 222-TIPS (8477), by downloading the ""P3 Tips"" app to your smart phone (available at the Apple Store or Google Play), or by visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1329,https://www.memphistn.gov/news/wpfd_file/resolution-requesting-the-memphis-police-department-to-enforce-the-curfews-of-the-child-curfew-act-of-1995-and-work-with-the-city-of-memphis-administration-on-a-proposal-for-a-designated-curfew-center/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1330,https://police.bixbyok.gov/faq.aspx?qid=94,Resources,Agency-Published Resources,FAQs • How do I find out if I or someone else has a warrant?,"",200,"Bixby Police Department, OK | Official Website",[],"[""▼ Police"", ""Hours of Operations""]","[""Categories"", ""Live Edit"", ""Helpful Links"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1331,https://cityofyuma.colorado.gov/departments/emergency-services/police-department/police-department-fees,Resources,Agency-Published Resources,Police Department Fees | City of Yuma,"",200,Home | City of Yuma,"[""Police Department Fees""]",[],"[""Fee Schedule""]",[],[],[],"Skip to main content Visit ""Where can I get vaccinated"" or call 1-877-COVAXCO (1-877-268-2926) for vaccine information. Site Search Search Main Navigation - Top Bar Menu Home City Information » Vision and Mission City Holidays Permits and Information City of Yuma Municipal Codes Comprehensive Plan Historic Preservation Committee Economic Development Job Opportunities Local Event Information Marijuana Products Manufacturing Facility License Information Yuma Junction Departments » Animal Control » Animal Shelter Trap Neuter Return (TNR) Program Building Inspection City Clerk and Treasurer » Financial Information Vital Records City Manager Code Enforcement Emergency Services » Ambulance Fire Department Police Department » Crime Prevention Ordinances and Permits Police Department Fees Police Department Staff Municipal Court Parks & Recreation » Parks » Our Parks Recreation » Emergency Information Swimming Pool Recycling Sanitation Streets » Certification Of Streets Snow Removal Routes Street Sweeping Schedule Utility Services » Electric » Electric Meters Energy Consumption Calculator History of City of Yuma Electrical System What is an Electric Power Pole? Wastewater Water » Consumer Confidence Reports Customer Service - Water Division Source Water Protection Plan Water Conservation Water Distribution Water Production Yuma's Water History Yuma Community and Enrichment Center Yuma Public Library City Council » Agendas Minutes Agenda Item Comment Form Annual Budgets City Annual Audits City of Yuma Org/Pay Chart Online Payments COVID-19 Contact Us Home City Information » Vision and Mission City Holidays Permits and Information City of Yuma Municipal Codes Comprehensive Plan Historic Preservation Committee Economic Development Job Opportunities Local Event Information Marijuana Products Manufacturing Facility License Information Yuma Junction Departments » Animal Control » Animal Shelter Trap Neuter Return (TNR) Program Building Inspection City Clerk and Treasurer » Financial Information Vital Records City Manager Code Enforcement Emergency Services » Ambulance Fire Department Police Department » Crime Prevention Ordinances and Permits Police Department Fees Police Department Staff Municipal Court Parks & Recreation » Parks » Our Parks Recreation » Emergency Information Swimming Pool Recycling Sanitation Streets » Certification Of Streets Snow Removal Routes Street Sweeping Schedule Utility Services » Electric » Electric Meters Energy Consumption Calculator History of City of Yuma Electrical System What is an Electric Power Pole? Wastewater Water » Consumer Confidence Reports Customer Service - Water Division Source Water Protection Plan Water Conservation Water Distribution Water Production Yuma's Water History Yuma Community and Enrichment Center Yuma Public Library City Council » Agendas Minutes Agenda Item Comment Form Annual Budgets City Annual Audits City of Yuma Org/Pay Chart Online Payments COVID-19 Contact Us 0 Home Departments Emergency Services Police Department Police Department Fees Police Department Fees #FFFFFF Fee Schedule Accident/Case Report $5.00 Search Fee $20.00 Fingerprints $5.00 Portable Breath Test (PBT) $5.00 Photos $3.00 per page Copy $.25 per page Audio Tape $25.00 each Impound $15.00 per day Bike Registration Free VIN Inspections Free Sex Offender Registry $20.00 Initial Fee and $5.00 Annual *THE YUMA POLICE DEPARTMENT DOES NOT DO CIVIL PROCESS OR NOTARY SERVICES* placeholder © 2024 State of Colorado Transparency Online Support Colorado Official State Web Portal " -1332,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0182/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1333,http://www.longbeach.gov/police/press-releases/juvenile-investigations-operation-results-in-6-arrests/,Media Bulletins,Agency-Published Resources,JUVENILE INVESTIGATIONS OPERATION RESULTS IN 6 ARRESTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/6/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: JUVENILE INVESTIGATIONS OPERATION RESULTS IN 6 ARRESTS Contact: Media Relations (562) 570-5273 On Wednesday, June 4, 2014, Detectives and Officers from the Juvenile Investigations Section and the West Patrol Division conducted an operation focusing on the apprehension of juvenile suspects who were wanted on open charges and outstanding warrants related to violent and property crimes. Detectives and Officers successfully located and arrested four Long Beach juveniles. Three of the juveniles were wanted on assault and battery charges, and one of the juveniles was wanted for possession of a weapon and narcotics on school grounds. Two adult suspects were also arrested as a result of the operation. SocorroGallardo, an 18-year-old resident of Long Beach, was arrested for an outstanding warrant related to residential burglary and David Salazar, a 25-year-old resident of Long Beach, was arrested on charges of possession of a controlled substance for sale. Probation compliance checks were conducted at the residences of four juveniles on active probation and all four were found to be in compliance. The Juvenile Investigations Section is dedicated to the prevention, intervention, investigation and suppression of at-risk juveniles and juvenile related crimes. If you know of a juvenile who is at risk, or are a parent in need of assistance please visit the Juvenile Investigations Section of our website for a list of resources, or call the Juvenile Investigations Section at (562) 570-1425. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1334,https://www.mass.gov/regulations/700-cmr-600-use-of-road-flaggers-and-police-details-on-public-works-projects,Misc Police Activity,Police & Public Interactions,700 CMR 6.00: Use of road flaggers and police details on public works projects | Mass.gov,"700 CMR 6.00 ensures the safety of pedestrians, motorists, bicyclists, and workers on, or near, a Public Works Projects and reduces overall costs through the effective use of Traffic Control Devices, Road Flaggers, and Police Details and through the efficient expenditure of public funds. Download a PDF copy of the regulation below.",200,Mass.gov,"[""Regulation 700 CMR 6.00: Use of road flaggers and police details on public works projects""]","[""Table of Contents for the law library, 700 CMR"", ""Contact for 700 CMR 6.00: Use of road flaggers and police details on public works projects"", ""Table of Contents"", ""Downloads"", ""Contact"", ""Contact for 700 CMR 6.00: Use of road flaggers and police details on public works projects"", ""Help Us Improve Mass.gov with your feedback""]","[""Trial Court Law Libraries"", ""Trial Court Law Libraries"", ""Trial Court Law Libraries""]","[""Online"", ""Online"", ""Online""]",[],[],"" -1335,https://delcopa.gov/publicrelations/releases/2020/passportservicesresumejuly6.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County will be resuming passport services on July 6 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County will be resuming passport services on July 6""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County will be resuming passport services on July 6 Home / Departments / Public Relations Releases / Delaware County will be resuming passport services on July 6 Delaware County resumed passport services on Monday, July 6. Passport services will be available Monday- Friday from 8:30a.m.-4:00p.m. There is a $10 fee for a passport photo. Masks are required for entry and only the applicant (and family members applying for passports) will be permitted to enter the office. Appointments are not being taken. The Passport division is located in the Office of Judicial Support, Room 121 of the Government Center, 201 West Front Street, Media, PA 19063. Phone: 610-891-4967 Fax: 610-891-7257 Please visit the State Department’s website for information and updates on major delays in issuing of passports: https://travel.state.gov/content/travel/en/passports.html Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County will be resuming passport services on July 6 Home / Departments / Public Relations Releases / Delaware County will be resuming passport services on July 6 Delaware County will be resuming passport services on July 6 Home / Departments / Public Relations Releases / Delaware County will be resuming passport services on July 6 Delaware County will be resuming passport services on July 6 Home / Departments / Public Relations Releases / Delaware County will be resuming passport services on July 6 " -1336,http://www.longbeach.gov/police/press-releases/lbpd-swat-officers-shot-at-during-search-warrant-service/,Media Bulletins,Agency-Published Resources,LBPD SWAT OFFICERS SHOT AT DURING SEARCH WARRANT SERVICE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1337,https://www.lynchburgvapolice.gov/resources/,Resources,Agency-Published Resources,Resources - Lynchburg Police Department,"",200,403 Forbidden,"[""Resources""]",[],"[""Below are some additional resources and links to our community partners.""]","[""Contact Us"", ""Site Links"", ""Site Links""]",[],"[""Lynchburg Police Foundation"", ""Office of the Commonwealth’s Attorney"", ""Central Virginia Crime Stoppers Tip Line"", ""Lynchburg Redevelopment and Housing Authority"", ""Police to Citizen – online reporting"", ""Horizon Behavioral Health"", ""Department of Social Services"", ""Lynchburg Community Action Group"", ""Lynchburg General District Court"", ""Lynchburg Circuit Court"", ""Lynchburg Juvenile and Domestic Relations Court"", ""Ring Neighborhood Portal"", ""City of Lynchburg"", ""Citizens First Information Center – City of Lynchburg""]","" -1338,https://delcopa.gov/planning/pubs/delco2035/historicplan.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1339,https://spdblotter.seattle.gov/2021/01/27/police-arrest-u-district-rape-suspect/,Media Bulletins,Agency-Published Resources,Police Arrest U-District Rape Suspect - SPD Blotter,"",200,403 Forbidden,"[""Police Arrest U-District Rape Suspect""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -1340,https://beaumonttexas.gov/beaumont-police-investigating-overnight-shooting-at-2550-ih-10-east/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1341,https://ose.louisiana.gov/event/police-communications-officer-ii/,Poor Data Source,Poor Data Source,Police Communications Officer II | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Police Communications Officer II""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Police Communications Officer II Promotional Level Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Police Communications Officer II Promotional Level Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Communications Officer II Promotional Level Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Communications Officer II Promotional Level Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Application This event has passed. Police Communications Officer II Promotional Level Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Application This event has passed. Police Communications Officer II Promotional Level Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Application This event has passed. Police Communications Officer II Promotional Level Promotional Level Promotional Level Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Posting Period 01/15/2021 - 02/01/21 Application Deadline 02/01/21 Jurisdiction Shreveport Posting Period 01/15/2021 - 02/01/21 Posting Period Application Deadline 02/01/21 Application Deadline Jurisdiction Shreveport Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -1342,http://www.longbeach.gov/police/how-do-i/prevent-crime/general-guidelines-for-retail-stores/,Resources,Agency-Published Resources,General Guidelines for Retail Stores,"

GENERAL GUIDELINES FOR RETAIL STORES -   - Implementing these safety recommendations will make your business ""crime unfriendly."" Remember, most crimes are crimes of opportunity...don't allow your business to be an easy target! - - Lighting is an important factor to consider when crime-proofing your business

",200,City of Long Beach,"[""Police Department""]","[""GENERAL GUIDELINES FOR RETAIL STORES""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""How To Prevent Crime"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", """", """", """", ""Crime Lab Survey"", """"]",[],"" -1343,https://alpha.austin.gov/es/police-oversight/2020-06-17-7/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1344,http://www.lafayettepolice.us/faq.aspx?qid=68,Not Criminal Justice Related,Not Criminal Justice Related,"FAQs • How do I dispose of large items like carpet, sinks, s","",200,"Police Department | Lafayette, IN - Official Website",[],"[""▼ Sanitation Department""]","[""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1345,https://www.mass.gov/info-details/audit-of-mount-wachusett-community-college-objectives-scope-and-methodology,Not Criminal Justice Related,Not Criminal Justice Related,"Audit of Mount Wachusett Community College Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing Mount Wachusett Community College.,200,Mass.gov,"[""Audit of Mount Wachusett Community College Objectives, Scope, and Methodology""]","[""Table of Contents for the audit, Audit of Mount Wachusett Community College"", ""Table of Contents"", ""Overview"", ""Data Reliability"", ""Practicum Course Registration"", ""Auxiliary Services Operations"", ""Strategic Plan"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[],"" -1346,http://lafayettepolice.us/faq.aspx?qid=80,Resources,Agency-Published Resources,FAQs • How do I obtain a handgun permit?,"",200,"Police Department | Lafayette, IN - Official Website",[],"[""▼ Police""]","[""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1347,https://columbiacitypolice.us/photos/group 2017.jpg,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1348,https://police.greenvillesc.gov/faq.aspx?qid=140,Resources,Agency-Published Resources,FAQs • What have I been charged with?,"",200,"Police Department | Greenville, SC - Official Website",[],"[""▼ Municipal Court - General Legal Questions""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -1349,https://www.coronadelmar.us/newport-beach-mourns-locals-killed-in-helicopter-crash/,Not Criminal Justice Related,Not Criminal Justice Related,Newport Beach Mourns Locals Killed in Helicopter Crash | Corona del Mar California,"",200,Corona del Mar California,"[""Newport Beach Mourns Locals Killed in Helicopter Crash""]","[""Menu"", ""Be First to Comment"", ""Subscribe"", """", """"]","[""Share this:"", ""Like this:"", ""Related"", ""Leave a Reply Cancel reply"", """"]",[],[],[],"" -1350,https://www.mass.gov/doc/municipal-police-training-committee-meeting-minutes-091521/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -1351,https://www.madera.gov/tr-accordion/police-programs/,Not Criminal Justice Related,Not Criminal Justice Related,City of Madera - Serving Residents in the Heart of California,The Heart of California,200,City of Madera - Serving Residents in the Heart of California,[],"[""X"", ""FEATURED VIDEO"", ""CITY CALENDAR"", """", """", """", """", ""LATEST NEWS"", ""City adopts FY 23/24 budget, anticipates surplus amid economic challenges"", ""Special meeting to be held to discuss the future of Measure T"", ""PSA: Upcoming changes to utility bill due dates"", ""Annual curbside cleanup program returns February 19-March 29"", ""Madera Metro announces new bus routes"", ""Flood preparedness and sandbag locations"", ""Christmas tree collection service available in early January"", ""City of Madera adopts SolarAPP+ to streamline solar permitting process"", ""Holiday schedule for City offices and services"", ""City to celebrate over $2.5 million in grants for community improvement"", ""Iconic Loy E. Cook Water Tower to undergo renovation"", ""Notice of funding availability for CDBG FY 2024-2025"", ""MPD Detective honored with ‘Freedom Fighter Award’ for work against human trafficking"", ""Parks announces “spooky” Movies in the Park event planned for October 13"", ""Police Chief Lawson announces retirement, Chiaramonte tapped as successor"", ""City adopts FY 23/24 budget, anticipates surplus amid economic challenges"", ""Special meeting to be held to discuss the future of Measure T"", ""PSA: Upcoming changes to utility bill due dates"", ""MADERA CITY COUNCIL MEETING""]","[""Veterans Day"", ""Thanksgiving Da..."", ""Christmas Day"", ""New Years Day"", ""Measure T - Spe..."", ""Good Friday"", ""Memorial Day"", ""Independence Da..."", ""Labor Day"", ""Columbus Day"", ""Veterans Day"", ""Thanksgiving Da..."", ""Christmas Day"", ""New Years Day"", ""Measure T - Spe..."", ""Good Friday"", ""Memorial Day"", ""Independence Da..."", ""Labor Day"", ""Columbus Day""]",[],[],[],"" -1352,https://mountpocono-pa.gov/question/how-do-i-reach-the-police-department-with-a-non-emergency/,Contact Info & Agency Meta,Info About Agencies,"How do I reach the police department with a non emergency? - Mount Pocono, PA","",200,"Welcome - Mount Pocono, PA","[""How do I reach the police department with a non emergency?""]","[""Action toolbar"", ""Primary menu links"", ""Welcome"", ""Engage"", ""Help""]",[],[],[],[],"Official government website Action toolbar Answers Payments Report Issue Search Action toolbar Answers Payments Report Issue Search Mount Pocono, PA Primary menu links Residents Businesses Visitors Meetings Government News Contact Primary menu links Residents Businesses Visitors Meetings Government News Contact Mount Pocono, PA Mount Pocono, PA Mount Pocono, PA How do I reach the police department with a non emergency? All non emergency calls can be directed to (570) 895-2400. How do I reach the police department with a non emergency? All non emergency calls can be directed to (570) 895-2400. All non emergency calls can be directed to (570) 895-2400. Helpful Share Facebook Twitter Email Size + Reset a − Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Welcome History Community News Events Engage Subscribe Feedback Help Services Contact Directory Accessibility Sitemap Welcome History Community News Events Engage Subscribe Feedback Help Services Contact Directory Accessibility Sitemap Welcome History Community News Events History Community News Events Engage Subscribe Feedback Subscribe Feedback Help Services Contact Directory Accessibility Sitemap Services Contact Directory Accessibility Sitemap Powered by Powered by This content is for decoration only skip decoration . Close window This content is for decoration only skip decoration . This content is for decoration only skip decoration . This content is for decoration only skip decoration . Search Site Search Close window Search Site Search Search Site Search " -1353,https://champaignil.gov/2021/04/03/champaign-police-investigating-overnight-shooting-2/,Media Bulletins,Agency-Published Resources,Champaign Police Investigating Overnight Shooting - City of Champaign,"",200,403 Forbidden,"[""Champaign Police Investigating Overnight Shooting""]","[""News Releases"", ""Department News""]",[],[],[],[],"" -1354,https://alpha.austin.gov/en/police-oversight/2020-11-01/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1355,https://southamptontownnypolice.gov/256/town-law-200-procedure,Resources,Agency-Published Resources,"Town Law 200 Procedure | Southampton, NY - Official Website",Learn about the procedure of the town law 200.,200,"Police | Southampton, NY - Official Website","[""Town Law 200 Procedure""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1356,https://www.somervillema.gov/news/femino-named-interim-acting-chief-police,Personnel Records,Info About Officers,FEMINO NAMED INTERIM ACTING CHIEF OF POLICE | City of Somerville,"SOMERVILLE - Mayor Joseph A. Curtatone announced today that Somerville Police Captain Charles Femino has agreed to serve as the Interim Acting Chief of Police beginning on Dec. 1, 2013, until a permanent replacement is found for departing Chief Thomas Pasquarello.  ",200,Home | City of Somerville,"[""FEMINO NAMED INTERIM ACTING CHIEF OF POLICE""]","[""Captain Charles Femino current Chief of Detectives, with department since 1984""]","[""Feedback"", ""Download Mobile Apps"", ""Sign up for City eNews"", ""Connect With Us""]",[],[],[],"" -1357,https://police.greenvillesc.gov/faq.aspx,Resources,Agency-Published Resources,"FAQs • Greenville, SC • CivicEngage","",200,"Police Department | Greenville, SC - Official Website",[],"[""▼ Affordable Housing"", ""▼ Animal Control"", ""▼ Business Licenses - Fees"", ""▼ Business Licenses - General"", ""▼ Business Licenses - Penalties"", ""▼ Clemson MBA Fireworks on the Fourth"", ""▼ Composting"", ""▼ COVID-FAQs-Intranet"", ""▼ Cultural Corridor"", ""▼ Flashing Yellow Left-Turn Signals"", ""▼ Greenlink"", ""▼ Greenlink Art Contest"", ""▼ Greenville Development Code"", ""▼ Greenville Jazz Fest"", ""▼ Gvl2040 Comprehensive Plan"", ""▼ GVL2040 Comprehensive Plan - Report to the Community FAQs"", ""▼ Historic Resources Survey"", ""▼ Ice on Main"", ""▼ Miguel Rosales Interview"", ""▼ Moonlight Movies"", ""▼ Municipal Court - Appeals & Records for Reconsideration"", ""▼ Municipal Court - Community Service"", ""▼ Municipal Court - Court Appearances"", ""▼ Municipal Court - Criminal Domestic Violence Program"", ""▼ Municipal Court - Driver's License Issues"", ""▼ Municipal Court - Financial, Fines & Fees"", ""▼ Municipal Court - General"", ""▼ Municipal Court - General Legal Questions"", ""▼ Municipal Court - House Arrest"", ""▼ Municipal Court - Jail"", ""▼ Municipal Court - Judicial Communications"", ""▼ Municipal Court - Records & Warrants"", ""▼ Municipal Court - Restraining Orders, Orders of Protection, Harassment"", ""▼ Planning & Zoning"", ""▼ Police Department"", ""▼ Police Mediation"", ""▼ Project Safe Neighborhoods"", ""▼ Recreation - Pickleball"", ""▼ Recycling"", ""▼ Right of Way & Trees"", ""▼ Sanitary Sewer"", ""▼ Short-Term Rentals"", ""▼ Sound Check"", ""▼ Storm Water"", ""▼ Streets & Sidewalks"", ""▼ Swamp Rabbit Trail"", ""▼ Tuition Reimbursement"", ""▼ Unity Park Open""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -1358,"https://norfolkne.gov/government/departments/police-division/press-releases/january-4,-2021-press-release.html",Media Bulletins,Agency-Published Resources,"January 4, 2021 Press Release - City of Norfolk, NE","",200,"Welcome to Norfolk, NE - City of Norfolk, NE","[""City of Norfolk, NE"", ""Police Division"", ""January 4, 2021 Press Release"", ""City of Norfolk, NE""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]","" -1359,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-42-permanent-rank-sergeant-payment-employees-represented-nys-police,Media Bulletins,Agency-Published Resources,State Police Bulletin No. SP-42 | Office of the New York State Comptroller,To notify the Division of State Police of the procedure for processing the 2001-2002 payment,200,Office of the New York State Comptroller | Thomas P. DiNapoli,"[""State Police Bulletin No. SP-42"", """"]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Payment Date(s)"", ""Contract Provision and Eligibility Criteria"", ""Agency Processing Instructions"", ""Payroll Register and Employees Check/Advice"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[],"" -1360,https://www.mass.gov/doc/municipal-police-training-committee-mptc-meeting-agenda-71719/download,Misc Police Activity,Police & Public Interactions,"","",200,"","","","","","","","" -1361,http://www.ryepolice.us/logs/police-logs-for-12517-13117,Daily Activity Logs,Info About Officers,Rye Police Department Police Logs for 1/25/17-1/31/17 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs for 1/25/17-1/31/17""]","[""Police Logs for 1/25/17-1/31/17""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -1362,https://police.greenvillesc.gov/994/crisis-intervention,Resources,Agency-Published Resources,"Crisis Intervention Team (CIT) | Greenville, SC - Official Website",Information about the Police Department's Crisis Intervention Team,200,"Police Department | Greenville, SC - Official Website","[""Crisis Intervention Team (CIT)""]",[],"[""Officer Participation"", ""Loading""]",[],[],[],"Skip to Main Content Careers About Us Divisions News Services I Want To... Search Home Departments Police Department Divisions Support Special Units Crisis Intervention Crisis Intervention Team (CIT) In 2010, the department recognized the need for officers to receive advanced training in dealing with people suffering from mental illness. Law enforcement officers are often the first ones to respond to calls for service. The Greenville Police Department’s Crisis Intervention Team’s goal is to help those with serious mental disorders access medical treatment, rather than placing them in the criminal justice system for illness-related behaviors. The Crisis Intervention Team (CIT) program is a community partnership of law enforcement, mental health professionals, mental health consumers, and family member advocates. Officer Participation Currently there are approximately 154 Greenville Police officers who have completed 40 hours of crisis intervention training and learned de-escalation methods. These officers are assigned throughout the department and are available to respond to calls for service 24/7. These officers utilize their specialized training to safely and effectively communicate with mentally ill individuals while ensuring a safe outcome to potentially volatile situations. Accident Investigation Crime Response Team Crisis Intervention Crisis Negotiation Dignitary Protection SWAT School Resource Officers my Neighborhood Become a Police Officer alarm registration compliments & complaints crime stoppers Emergency Notifications Contact Us | Accessibility | Web Policy and Copyright | Website by CivicPlus® City of Greenville, SC, Police Department  |  4 McGee St., Greenville, SC 29601  |  Police Non-Emergency: 864-271-5333 Back to Top Enable Google Translate Careers About Us Divisions News Services I Want To... Search Home Departments Police Department Divisions Support Special Units Crisis Intervention Crisis Intervention Team (CIT) In 2010, the department recognized the need for officers to receive advanced training in dealing with people suffering from mental illness. Law enforcement officers are often the first ones to respond to calls for service. The Greenville Police Department’s Crisis Intervention Team’s goal is to help those with serious mental disorders access medical treatment, rather than placing them in the criminal justice system for illness-related behaviors. The Crisis Intervention Team (CIT) program is a community partnership of law enforcement, mental health professionals, mental health consumers, and family member advocates. Officer Participation Currently there are approximately 154 Greenville Police officers who have completed 40 hours of crisis intervention training and learned de-escalation methods. These officers are assigned throughout the department and are available to respond to calls for service 24/7. These officers utilize their specialized training to safely and effectively communicate with mentally ill individuals while ensuring a safe outcome to potentially volatile situations. Accident Investigation Crime Response Team Crisis Intervention Crisis Negotiation Dignitary Protection SWAT School Resource Officers my Neighborhood Become a Police Officer alarm registration compliments & complaints crime stoppers Emergency Notifications Contact Us | Accessibility | Web Policy and Copyright | Website by CivicPlus® City of Greenville, SC, Police Department  |  4 McGee St., Greenville, SC 29601  |  Police Non-Emergency: 864-271-5333 Back to Top Enable Google Translate " -1363,https://alvordtx.gov/question/how-can-i-obtain-a-copy-of-the-municipal-codes/,Resources,Agency-Published Resources,"How can I obtain a copy of the municipal codes? - Alvord, TX","",200,"Welcome - Alvord, TX","[""How can I obtain a copy of the municipal codes?""]","[""Primary menu links"", ""Action toolbar"", ""Welcome"", ""Engage"", ""Help""]",[],[],[],[],"Alvord, TX Primary menu links Services Community Events News Departments Contact Action toolbar Answers Report Issue Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Search Primary menu links Services Community Events News Departments Contact Action toolbar Answers Report Issue Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Search Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Alvord, TX Alvord, TX Alvord, TX How can I obtain a copy of the municipal codes? Click the following links for information relating to municipal codes. https://alvordtx.gov/ordinances/ https://alvordtx.gov/departments/permits/ Or, come by city hall to obtain copies / information. How can I obtain a copy of the municipal codes? Click the following links for information relating to municipal codes. https://alvordtx.gov/ordinances/ https://alvordtx.gov/departments/permits/ Or, come by city hall to obtain copies / information. Click the following links for information relating to municipal codes. https://alvordtx.gov/ordinances/ https://alvordtx.gov/departments/permits/ Or, come by city hall to obtain copies / information. Helpful Share Facebook Twitter Email Size + Reset a − Welcome Community News Events Engage Connect Feedback Help Services Contact Directory Accessibility Sitemap " -1364,http://www.longbeach.gov/police/press-releases/murder-investigation---wardlow--orange/,Media Bulletins,Agency-Published Resources,*UPDATE* REWARD ISSUED IN MURDER INVESTIGATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1365,https://louisvilleky.gov/news/louisville-metro-police-foundation-endorses-louisville-affordable-housing-trust-fund,Not Criminal Justice Related,Not Criminal Justice Related,"","",403,"","","","","","","","" -1366,http://www.longbeach.gov/police/press-releases/murder-1600-block-of-pine-avenue/,Media Bulletins,Agency-Published Resources,Murder (1600 Block of Pine Avenue),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/31/2016 FOR IMMEDIATE RELEASE Press Release # Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Wednesday, March 30, 2016, at approximately 11:00 p.m., Long Beach Police responded to the 1600 block of Pine Avenue in regards to a shots fired call, which resulted in the death of a male adult. When officers arrived, they discovered a male adult with apparent gunshot wounds to the torso, in the intersection. The victim was transported to a local hospital by paramedics, and was pronounced deceased shortly thereafter. Based on the preliminary investigation, detectives determined the victim was approached by two male Blacks, and subsequently shot multiple times in the torso. The suspects then fled eastbound on 16th Street and remain outstanding. A motive for the shooting is unknown. After fleeing the area, the suspects may have been involved in a physical altercation with a second male subject in the area of 16th Street and Locust Avenue, however, the investigation remains ongoing. The victim is only being identified as a male in his 40’s from Long Beach, pending notification of next of kin by the Los Angeles County Coroner’s Office. Anyone who may have information regarding this incident is urged to contact Long Beach Police Homicide Detectives Mark Mattia and Donald Goodman at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1367,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0415/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1368,https://delcopa.gov/publicrelations/releases/18pdfs/18emergencypreparednessmonth.pdf,Media Bulletins,Agency-Published Resources,"","",200,"","","","","","","","" -1369,http://lafayettepolice.us/773/foam-systems,Not Criminal Justice Related,Not Criminal Justice Related,"Foam Systems | Lafayette, IN - Official Website",Fire fighting foam systems suppress fire by separating the fuel from the air (oxygen).,200,"Police Department | Lafayette, IN - Official Website","[""Foam Systems""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Operations Prevention Recruitment How Do I... Home Government Departments A - F Fire Department Prevention Contractors & Designers Resources & Inspections Alternative Fire Extinguishing Systems Foam Systems Foam Systems Fire fighting foam systems suppress fire by separating the fuel from the air (oxygen). Depending on the type of foam system, this is done in several ways: Foam blankets the fuel surface smothering the fire The fuel is cooled by the water content of the foam The foam blanket suppresses the release of flammable vapors that can mix with the air Uses & Applications Foam systems are generally used in applications where flammable liquids are present. Typical applications include fuel storage tanks areas, petrochemical plants, aircraft hangars and facilities that store flammable or volatile liquids. The foam not only contains extinguishing agents to put out the fire but also acts as a ""blanket"" to exclude oxygen ""feeding"" the fire and to provide vapor suppression so protecting against re-ignition. Types Available There are various types of foam available from a basic protein foam through to Aqueous Film Forming Foam (AFFF) and Film Forming Flouroprotein (FFFP) with alcohol resistant foam used for polar solvents. Foam-extinguishing systems shall be installed, maintained, periodically inspected and tested in accordance with NFPA 11, NFPA 11A and NFPA 16 and their listing. Foam-extinguishing systems shall be inspected and tested at intervals in accordance with NFPA 25. Carbon Dioxide Systems Clean Agent Systems Dry Chemical Automatic Fire Suppression System Foam Systems Halon Systems Wet Chemical Systems Installation Testing & Operations/Maintenance UL 300 Community Outreach Fire Stations Submit a Request History Photo Gallery Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -1370,https://www.newarknj.gov/news/mayor-ras-j-barakas-statement-on-appointment-of-brian-ohara-as-deputy-mayor-of-strategic-initiatives-for-police-services-public-safety,Personnel Records,Info About Officers,News: MAYOR RAS J. BARAKA’S STATEMENT ON APPOINTMENT OF BRIAN O’HARA AS DEPUTY MAYOR OF STRATEGIC INITIATIVES FOR POLICE SERVICES/PUBLIC SAFETY,"Official Page of Newark, NJ News: MAYOR RAS J. BARAKA’S STATEMENT ON APPOINTMENT OF BRIAN O’HARA AS DEPUTY MAYOR OF STRATEGIC INITIATIVES FOR POLICE SERVICES/PUBLIC SAFETY",200,City of Newark,"[""City of"", ""NEWARK"", ""June 30, 2022"", ""MAYOR RAS J. BARAKA’S STATEMENT ON APPOINTMENT OF BRIAN O’HARA AS DEPUTY MAYOR OF STRATEGIC INITIATIVES FOR POLICE SERVICES/PUBLIC SAFETY"", ""City of"", ""NEWARK""]","[""News"", ""Mayor Ras j baraka""]",[],[],[],[],"City of NEWARK DEPARTMENTS Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities News Events Forms mayor City Mayor Council Members Contact Knowledge Contact us City of NEWARK DEPARTMENTS Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities News Events Forms mayor City Mayor Council Members Contact Knowledge Contact us City of NEWARK DEPARTMENTS Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities DEPARTMENTS DEPARTMENTS Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities mayor City Mayor Council Members mayor mayor Contact Knowledge Contact us Contact Contact News News News News " -1371,https://mtcb.colorado.gov/departments-services/police,Contact Info & Agency Meta,Info About Agencies,Police | Town of Mt. Crested Butte,"The Mt. Crested Butte Police Department's goal is to create and sustain a safe and relaxed environment within our jurisdiction. Through education, enforcement, investigation, and cooperation with our community Mt. CB PD helps address crime, road safety, and other quality of life issues ensuring a safe and friendly experience for guests and locals alike.",200,Home | Town of Mt. Crested Butte,"[""Police""]",[],[],[],[],[],"Skip to main content Visit ""Where can I get vaccinated"" or call 1-877-COVAXCO (1-877-268-2926) for vaccine information. Site Search Search Main Navigation - Top Bar Menu How Do I...? » Apply For Contact Pay Subscribe View Departments & Services » Community Development Finance Maintenance Municipal Court Parks Police Recycling & Trash Short-Term Rentals Town Clerk Government » Downtown Development Authority (DDA) Planning Commission Public Notices Town Code Town Council Town Elections Voter Registration Projects & Initiatives » Admissions Tax Grant Affordable Housing Initiatives Community Grant E-Bike Rebate Program Master Plan Request for Proposals Strategic Plan Wayfinding Program Visitors » Airport CBMR Electric Vehicle Charging Stations Mountain Express RTA How Do I...? » Apply For Contact Pay Subscribe View Departments & Services » Community Development Finance Maintenance Municipal Court Parks Police Recycling & Trash Short-Term Rentals Town Clerk Government » Downtown Development Authority (DDA) Planning Commission Public Notices Town Code Town Council Town Elections Voter Registration Projects & Initiatives » Admissions Tax Grant Affordable Housing Initiatives Community Grant E-Bike Rebate Program Master Plan Request for Proposals Strategic Plan Wayfinding Program Visitors » Airport CBMR Electric Vehicle Charging Stations Mountain Express RTA 1 Home Departments & Services Police Police Police Animal Regulations & Ordinances Contact Us FAQ's Helpful Links & Contact Info Parking Regulations Police Forms Wildlife Pay Online The Mt. Crested Butte Police Department's goal is to create and sustain a safe and relaxed environment within our jurisdiction. Through education, enforcement, investigation, and cooperation with our community Mt. CB PD helps address crime, road safety, and other quality of life issues ensuring a safe and friendly experience for guests and locals alike. The Mt. Crested Butte Police Department is located in Town Hall and is administered by the Chief of Police, Nate Stepanek. Jurisdiction The department's primary jurisdiction is within the town limits of Mt. Crested Butte. However, a mutual aid agreement between the town and Gunnison County Sheriff's Office gives officers jurisdiction over all areas of Gunnison County. This includes Crested Butte South and Red Mountain Ranch but excludes the Town of Crested Butte. Animal Regulations Contact Us FAQs Helpful Links & Contact Info Parking Regulations Police Department Forms Wildlife in Mt. Crested Butte Pay Online #FFFFFF Police Department & Staff Nate Stepanek Chief of Police Email Jared Hooks Sergeant Email Anthony Burton Officer Email Andy Diehl Officer Email Cliff Adams Officer Email John Turco Officer Email Joe Pecharich Officer Email Matt Halvorson Officer Email Madeline Thomas Records Tech & Admin Assistant Email #FFFFFF Address 911 Gothic Road P.O. Box 5800 Mt. Crested Butte, CO 81225 Office Hours Monday - Friday 8:00 a.m. - 4:30 p.m. Phone: (970) 349-6516 Dispatch: (970) 641-8200 Fax: (970) 349-5866 #FFFFFF Town of Mt. CB 911 Gothic Rd. I POB 5800 Mt. Crested Butte, CO 81225 (970) 349-6632 911 Gothic Road., Mt. Crested Butte, CO 81225 placeholder © 2024 State of Colorado Transparency Online Support Colorado Official State Web Portal " -1372,http://www.lafayettepolice.us/725/fireworks-safety,Not Criminal Justice Related,Not Criminal Justice Related,"Fireworks Safety | Lafayette, IN - Official Website",Find the rules for using fireworks in the City limits of Lafayette.,200,"Police Department | Lafayette, IN - Official Website","[""Fireworks Safety""]",[],"[""Quick Links"", ""News Flash"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]","[""Deputy Chief sworn-in along with 4 other promotions for LFD"", ""Todd Budd promoted to Assistant Chief of Fire Prevention on September 4, 2023""]",[],[],Skip to Main Content -1373,https://www.cityofrc.us/public-safety/police/crime-mapping,Crime Maps & Reports,Agency-Published Resources,Crime Mapping | City of Rancho Cucamonga,"",200,Home | City of Rancho Cucamonga,"[""Crime Mapping""]","[""Utility Menu"", ""Breadcrumb"", ""Footer Menu"", ""Main navigation""]",[],[],[],[],Select Language English 繁體中文 Français हिन्दी 日本語 한국어 Español Filipino Tiếng Việt ไทย Utility Menu Translate Text Size (Decrease) Text Size (Normal) Text Size (Increase) Contact Us Menu Search Breadcrumb Home Public Safety Crime Mapping Crime Mapping https://www.crimemapping.com/map/agency/303 Footer Menu RC2GO Employment Opportunities Privacy Policy Contact Us Rate Your Experience Close Enter your keywords: Document Search Main navigation Home Everything We Do Animal Center Community Services Community Development Economic Development Healthy RC Library Public Safety RCMU Your Government Select Language English 繁體中文 Français हिन्दी 日本語 한국어 Español Filipino Tiếng Việt ไทย Utility Menu Translate Text Size (Decrease) Text Size (Normal) Text Size (Increase) Contact Us Select Language English 繁體中文 Français हिन्दी 日本語 한국어 Español Filipino Tiếng Việt ไทย Utility Menu Translate Text Size (Decrease) Text Size (Normal) Text Size (Increase) Contact Us Select Language English 繁體中文 Français हिन्दी 日本語 한국어 Español Filipino Tiếng Việt ไทย Select Language English 繁體中文 Français हिन्दी 日本語 한국어 Español Filipino Tiếng Việt ไทย Menu Search Menu Search Menu Search Menu Search Breadcrumb Home Public Safety Crime Mapping Crime Mapping https://www.crimemapping.com/map/agency/303 Breadcrumb Home Public Safety Crime Mapping Crime Mapping https://www.crimemapping.com/map/agency/303 Breadcrumb Home Public Safety Crime Mapping Crime Mapping https://www.crimemapping.com/map/agency/303 Breadcrumb Home Public Safety Crime Mapping Crime Mapping https://www.crimemapping.com/map/agency/303 https://www.crimemapping.com/map/agency/303 https://www.crimemapping.com/map/agency/303 https://www.crimemapping.com/map/agency/303 https://www.crimemapping.com/map/agency/303 Footer Menu RC2GO Employment Opportunities Privacy Policy Contact Us Rate Your Experience Footer Menu RC2GO Employment Opportunities Privacy Policy Contact Us Rate Your Experience Footer Menu RC2GO Employment Opportunities Privacy Policy Contact Us Rate Your Experience Footer Menu RC2GO Employment Opportunities Privacy Policy Contact Us Rate Your Experience Close Enter your keywords: Document Search Main navigation Home Everything We Do Animal Center Community Services Community Development Economic Development Healthy RC Library Public Safety RCMU Your Government Close Enter your keywords: Document Search Main navigation Home Everything We Do Animal Center Community Services Community Development Economic Development Healthy RC Library Public Safety RCMU Your Government Enter your keywords: Document Search Enter your keywords: Document Search Enter your keywords: Document Search -1374,https://delcopa.gov/courts/pdf/jd/2017preareport.pdf,Annual & Monthly Reports,Info About Agencies,"","",200,"","","","","","","","" -1375,https://delcopa.gov/publicrelations/releases/2020/pdf/govwolf_indoorrestaurants50percent.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1376,http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-8-/,Media Bulletins,Agency-Published Resources,DUI-DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND(8),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1377,https://delcopa.gov/prison/pdfs/wardereports/2021/wardensreportmay2021.pdf,Annual & Monthly Reports,Info About Agencies,"","",200,"","","","","","","","" -1378,https://www.goldenbeach.us/documents/resolution-2219-12-authorizing-the-participation-in-a-lease-agreement-for-two-police-motorcycles/,Policies & Contracts,Info About Agencies,RESO 2219.12 Authorizing the participation in a lease agreement for two police motorcycles – Golden Beach: A Town Unlike Any Other,"",200,Golden Beach: A Town Unlike Any Other – The Town of Golden Beach,[],[],"[""About Golden Beach"", ""Phone Numbers"", ""Town Hall""]","[""RESO 2219.12 Authorizing the participation in a lease agreement for two police motorcycles (65 kB)""]",[],[],Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide [hmapsprem id=1] Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide Menu -1379,https://felton.delaware.gov/police/request-for-security-check-form/,Resources,Agency-Published Resources,Request for Security Check Form - Town of Felton,"",200,Home - Town of Felton - Kent County Delaware,"[""Felton""]","[""Delaware"", ""Request for Security Check Form""]","[""Menu"", ""Contact Us"", ""\""A Great Delaware Small Town\""""]",[],[],[],"Skip to Content Skip to Footer Toggle navigation Menu Bill Pay Government Town Hall Town Manager Updates Town Council – Mayor & Members Charter and Ordinances Meetings & Events Contact Information Past Meetings Community News Schools Clubs and Activities Photo Gallery Information Police Building Permits Public Works Trash Collection Water Board of Adjustments Property Tax Contact Us Contact the Town FOIA Skip to Content Skip to Footer Toggle navigation Menu Bill Pay Government Town Hall Town Manager Updates Town Council – Mayor & Members Charter and Ordinances Meetings & Events Contact Information Past Meetings Community News Schools Clubs and Activities Photo Gallery Information Police Building Permits Public Works Trash Collection Water Board of Adjustments Property Tax Contact Us Contact the Town FOIA Skip to Content Skip to Footer Toggle navigation Menu Bill Pay Government Town Hall Town Manager Updates Town Council – Mayor & Members Charter and Ordinances Meetings & Events Contact Information Past Meetings Community News Schools Clubs and Activities Photo Gallery Information Police Building Permits Public Works Trash Collection Water Board of Adjustments Property Tax Contact Us Contact the Town FOIA Felton Delaware Listen Request for Security Check Form Request for Security Check Form Felton Delaware Listen Request for Security Check Form Request for Security Check Form Listen Request for Security Check Form Request for Security Check Form Listen Request for Security Check Form Request for Security Check Form Listen Request for Security Check Form Request for Security Check Form Listen Contact Us (302) 284-9365 24 E. Sewell Street Felton, DE 19943 Contact Form FOIA Form Like Us On Facebook! ""A Great Delaware Small Town"" Original design and concept by the Delaware GIC Copyright © 2024 Government Information Center Contact Us (302) 284-9365 24 E. Sewell Street Felton, DE 19943 Contact Form FOIA Form Like Us On Facebook! Contact Us (302) 284-9365 24 E. Sewell Street Felton, DE 19943 Contact Form FOIA Form Like Us On Facebook! (302) 284-9365 24 E. Sewell Street Felton, DE 19943 Contact Form FOIA Form Like Us On Facebook! ""A Great Delaware Small Town"" Original design and concept by the Delaware GIC Copyright © 2024 Government Information Center " -1380,https://delcopa.gov/publicrelations/releases/2021/covid_jan15update.html,Not Criminal Justice Related,Not Criminal Justice Related,"Jan. 15 Update on COVID-19 Vaccinations in Delaware County - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Jan. 15 Update on COVID-19 Vaccinations in Delaware County""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Phase 1B now includes residents age 65 years and older""]",[],[],"" -1381,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0391/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1382,https://www.southamptontownnypolice.gov/1084/ia-owts-requirements,Not Criminal Justice Related,Not Criminal Justice Related,"I/A OWTS Requirements | Southampton, NY - Official Website",Innovative and Alternative On-Site Wastewater Treatment System (I/A OWTS) Requirements ,200,"Police | Southampton, NY - Official Website","[""I/A OWTS Requirements""]","[""Innovative and Alternative On-Site Wastewater Treatment System (I/A OWTS) Requirements""]","[""Site Tools"", ""Additional Water Quality Information"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Land Management - Building & Zoning I/A OWTS Requirements I/A OWTS Requirements Innovative and Alternative On-Site Wastewater Treatment System (I/A OWTS) Requirements Town Code Chapter 123 (Building Construction) now includes a requirement for Innovative and Alternative On-Site Wastewater Treatment Systems (I/A OWTS) for certain residential projects: An I/A OWTS approved by the Suffolk County Department of Health Services (SCDHS) is required for residential projects located within the High Priority Area of the CPF Water Quality Improvement Project Plan (WQIPP) for: All new construction Any substantial system upgrade required by the SCDHS An increase in 25% of the floor area of a building When required by the Conservation Board or the Environment Division Verify parcel is located in high priority area Town Code Chapter 177 provides for Rebates for the installation of I/A OWTS in both Medium and High Priority Areas of the WQIPP for income eligible applicants. Please contact the Southampton Town Building Department for Electrical Permit Questions Only at (631) 287-5700 and the Southampton Town CPF Office for Rebate Inquiries Only at (631) 287-5720. Technical questions related to I/A system installations should be directed to the Suffolk County Office of Wastewater Management at (631) 852-5700 or Septic Improvement Program - Reclaim Our Waters I/A OWTS Application Procedure and Rebate Program I/A OWTS Information Brochure Additional Water Quality Information Water Quality Protection Information CPF Water Quality Improvement Project Plan (WQIPP) (PDF) Nitrogen Calculator (PDF) Reclaim Our Water - Suffolk County Department of Health Services View All /QuickLinks.aspx Building Applications & Forms I/A OWTS Requirements Licensing Applications & Forms Online Servces Request a Building Inspection Request an Electrical Inspection Join Town Hall's In-Person Waitlist Zoning Applications & Forms Policies for the ZBA Zoning Board of Appeals Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -1383,https://brookfieldil.gov/publication/special-fire-police-commission-meeting-august-23-2017/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1384,https://delcopa.gov/employment/jobpostings/caseworker2_oid.html,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -1385,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/022621blotter.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -1386,http://police.portlandmaine.gov/660/cdbg-priority-task-force,Not Criminal Justice Related,Not Criminal Justice Related,"CDBG Priority Task Force | Portland, ME - Official Website",This group's focus is on reevaluating the Community Development Block Grant priorities.,200,"Portland, ME - Official Website | Official Website","[""CDBG Priority Task Force""]",[],[],[],[],[],Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Completed Task Forces Task Forces CDBG Priority Task Force CDBG Priority Task Force CDBG Priority Task Force CDBG Working Group Waterfront Working Group Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Completed Task Forces Task Forces CDBG Priority Task Force CDBG Priority Task Force CDBG Priority Task Force CDBG Working Group Waterfront Working Group Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Completed Task Forces Task Forces CDBG Priority Task Force CDBG Priority Task Force CDBG Priority Task Force CDBG Working Group Waterfront Working Group Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Completed Task Forces Task Forces CDBG Priority Task Force CDBG Priority Task Force CDBG Priority Task Force CDBG Working Group Waterfront Working Group Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Boards & Committees Completed Task Forces Task Forces CDBG Priority Task Force CDBG Priority Task Force CDBG Priority Task Force CDBG Working Group Waterfront Working Group Home Your Government Boards & Committees Completed Task Forces Task Forces CDBG Priority Task Force CDBG Priority Task Force CDBG Priority Task Force CDBG Working Group Waterfront Working Group Home Your Government Boards & Committees Completed Task Forces Task Forces CDBG Priority Task Force CDBG Priority Task Force CDBG Priority Task Force CDBG Working Group Waterfront Working Group Home Your Government Boards & Committees Completed Task Forces Task Forces CDBG Priority Task Force CDBG Priority Task Force Home Your Government Boards & Committees Completed Task Forces Task Forces CDBG Priority Task Force CDBG Priority Task Force Home Your Government Boards & Committees Completed Task Forces Task Forces CDBG Priority Task Force CDBG Priority Task Force CDBG Priority Task Force CDBG Priority Task Force CDBG Working Group Waterfront Working Group CDBG Priority Task Force CDBG Working Group Waterfront Working Group Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® -1387,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0756/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1388,https://alpha.austin.gov/es/police-oversight/indefinite-suspension-of-officer-jordan-wagstaff/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1389,https://port-orange.us/2013/08/07/volusia-co-sheriffs-helicopter-makes-emergency-landing-on-beach/,Media Bulletins,Agency-Published Resources,"","",-1,"","","","","","","","" -1390,https://brookfieldil.gov/calendar/police-pension-fund-board-of-trustees-meeting/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1391,https://mountpocono-pa.gov/topics/police-courts/,Resources,Agency-Published Resources,"Police Archives - Mount Pocono, PA","",200,"Welcome - Mount Pocono, PA","[""FAQ Topic: Police""]","[""Action toolbar"", ""Primary menu links"", ""Who do I call about police-related non-emergencies?"", ""How do I get a copy of a police report?"", ""How do I file a police report?"", ""Welcome"", ""Engage"", ""Help""]",[],[],[],[],"Official government website Action toolbar Answers Payments Report Issue Search Action toolbar Answers Payments Report Issue Search Mount Pocono, PA Primary menu links Residents Businesses Visitors Meetings Government News Contact Primary menu links Residents Businesses Visitors Meetings Government News Contact Mount Pocono, PA Mount Pocono, PA Mount Pocono, PA FAQ Topic: Police Who do I call about police-related non-emergencies? Contact Pocono Mountain Regional Police directly for non-emergency police matters. How do I get a copy of a police report? Contact Pocono Mountain Regional Police to obtain a copy of a police report. How do I file a police report? Contact Pocono Mountain Regional Police to file a police report. FAQ Topic: Police Who do I call about police-related non-emergencies? Contact Pocono Mountain Regional Police directly for non-emergency police matters. How do I get a copy of a police report? Contact Pocono Mountain Regional Police to obtain a copy of a police report. How do I file a police report? Contact Pocono Mountain Regional Police to file a police report. FAQ Topic: Police Contact Pocono Mountain Regional Police directly for non-emergency police matters. Contact Pocono Mountain Regional Police to obtain a copy of a police report. Contact Pocono Mountain Regional Police to file a police report. Helpful Share Facebook Twitter Email Size + Reset a − Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Welcome History Community News Events Engage Subscribe Feedback Help Services Contact Directory Accessibility Sitemap Welcome History Community News Events Engage Subscribe Feedback Help Services Contact Directory Accessibility Sitemap Welcome History Community News Events History Community News Events Engage Subscribe Feedback Subscribe Feedback Help Services Contact Directory Accessibility Sitemap Services Contact Directory Accessibility Sitemap Powered by Powered by " -1392,https://cityofpowell.us/government/employment-opportunities/police-officer-selection-process-6/,Resources,Agency-Published Resources,"City of Powell, Ohio | Police Officer Selection Process","",200,"City of Powell, Ohio","[""Police Officer Selection Process""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -1393,https://delcopa.gov/ems/pdfdocs/initialcertificationeducationtesting/2022regionalemslistmap.pdf,Geographic,Info About Agencies,"","",200,"","","","","","","","" -1394,http://chico.ca.us/police-department-volunteers,Media Bulletins,Agency-Published Resources,City of Chico - Site Search,"",200,City of Chico - Home,"[""City of Chico"", ""City of Chico""]","[""Site Search""]","[""Contact Us"", ""Quicklinks"", ""City Resources"", ""Stay Connected"", ""Contact Us"", ""Quicklinks"", ""Follow\n \n City of Chico""]",[],[],[],skip to main content -1395,http://www.longbeach.gov/police/press-releases/two-arrested-and-numerous-guns-seized/,Media Bulletins,Agency-Published Resources,TWO ARRESTED AND NUMEROUS GUNS SEIZED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/10/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: TWO ARRESTED AND NUMEROUS GUNS SEIZED Contact: Media Relations Detail (562) 570-5273 SEIZED GUNS On May 8, 2017, at approximately 5:20 pm, LBPD officers and detectives working with the California Department of Justice (Cal DOJ) Firearms Bureau Prohibited Possessor Team served a search warrant in the 6400 block of Atlantic Avenue. The search warrant lead to the arrest of two individuals and the seizure of numerous weapons. The weapons recovered were two assault rifles, a .22 caliber rifle, two handguns, multiple parts to assault rifles, magazines for the weapons, and ammunition. The suspects are husband and wife, and have been identified as 41 year-old James Anthony Harvey, and 37 year-old City Harvey, both residents of Long Beach. James Harvey was arrested for ex-felon in possession of a firearm, child endangerment, and unlawful possession of ammunition. He was booked in to the Long Beach Jail and is being held on $100,000.00 bail. Harvey is a prohibited possessor for prior felony conviction out of North Carolina. City Harvey was arrested for giving a firearm to a prohibited possessor, and child endangerment. She was booked into the Long Beach City Jail and is being held on $100,000.00 bail. A 22 month old child was taken into protective custody by the Department of Child Services after both parents were arrested. Anyone with additional information is urged to contact Detective Joe Pirooz at (562) 570-7370. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1396,http://www.lafayettepolice.us/faq.aspx?qid=208,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Are “floaties” or flotation devices allowed?,"",200,"Police Department | Lafayette, IN - Official Website",[],"[""▼ Parks and Recreation - Aquatics""]","[""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1397,https://alpha.austin.gov/es/police-oversight/temporary-suspension-of-officer-jeremy-bohannon/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1398,https://alpha.austin.gov/police-oversight/temporary-suspension-of-officer-ryan-seweryn-2/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1399,https://www.ci.san-bernardino.ca.us/city_hall/police_department/crime_statistics/about_ucr_statistics/arrest_statistics/arrest_statistics-2009,Crime Statistics,Agency-Published Resources,Arrest Statistics - 2009 - City of San Bernardino,"",200,Just a moment...,"[""City of San Bernardino California""]","[""Arrest Statistics - 2009""]",[],[],[],[],Skip to Content -1400,https://www.mass.gov/locations/state-police-millbury-barracks/locations,Geographic,Info About Agencies,Locations | Mass.gov,"",200,Mass.gov,"[""Other locations related to State Police Millbury Barracks""]","[""Showing 1 - 7 of 7 results for:"", ""State Police Athol Barracks"", ""State Police Belchertown Barracks"", ""State Police Brookfield Barracks"", ""State Police Devens Barracks"", ""State Police Holden Barracks"", ""State Police Leominster Barracks"", ""State Police Sturbridge Barracks""]",[],[],[],[],"" -1401,https://www.coppelltx.gov/faq.aspx?qid=309,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Why did the City choose to participate in the program,"",200,"Coppell, TX | Official Website",[],"[""▼ Texas Power Switch""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -1402,https://southcoffeyvilleok.gov/police-department/screen-shot-2016-09-27-at-4-41-47-pm/,Poor Data Source,Poor Data Source,screen-shot-2016-09-27-at-4-41-47-pm -,"",200,403 Forbidden,[],"[""screen-shot-2016-09-27-at-4-41-47-pm""]","[""Contact Town of South Coffeyville"", """"]",[],[],[],"Town Alert ***************Boil Water Alert************* click here for more information Town Alert ***************Boil Water Alert************* click here for more information Town Alert ***************Boil Water Alert************* click here for more information Town Alert ***************Boil Water Alert************* click here for more information 2017 Water Report Town News Town Calendar Town Directory Town Help Desk Town Jobs Council Agendas & Minutes South Coffeyville Public Schools OK Union Public Schools OK Helpline BILL PAY Pay Utilities Pay Citations Pay Property Taxes Popular Resources My Town News Town History Project Government Town Council Town Clerk Court Clerk Deputy Treasurer Agendas & Minutes Ordinances Voting Public Meetings Town Utilities City Court Maintenance Dept. Police Department Fire Department Animal Control Permits & Licenses Business Business Directory Community Data Permits Relocate Here South Town Center Contact Town HOME Popular Resources Town Government Town Utilities Maintenance Dept. Police Department City Court Business News Town Help Desk Contact Town screen-shot-2016-09-27-at-4-41-47-pm Contact Town of South Coffeyville PO Box 100 419 Willow Street South Coffeyville, OK 74072 City Hall: (918) 255-6045 Fax: (918) 255-6430 Directions to City Hall Town Directory Economic Development Pay Utility Bill FEMA Disaster Assistance Section 508 Accessibility Privacy Policy Legal Disclaimer 2017 Water Report Town News Town Calendar Town Directory Town Help Desk Town Jobs Council Agendas & Minutes South Coffeyville Public Schools OK Union Public Schools OK Helpline BILL PAY Pay Utilities Pay Citations Pay Property Taxes Popular Resources My Town News Town History Project Government Town Council Town Clerk Court Clerk Deputy Treasurer Agendas & Minutes Ordinances Voting Public Meetings Town Utilities City Court Maintenance Dept. Police Department Fire Department Animal Control Permits & Licenses Business Business Directory Community Data Permits Relocate Here South Town Center Contact Town 2017 Water Report Town News Town Calendar Town Directory Town Help Desk Town Jobs Council Agendas & Minutes South Coffeyville Public Schools OK Union Public Schools OK Helpline BILL PAY Pay Utilities Pay Citations Pay Property Taxes Popular Resources My Town News Town History Project Government Town Council Town Clerk Court Clerk Deputy Treasurer Agendas & Minutes Ordinances Voting Public Meetings Town Utilities City Court Maintenance Dept. Police Department Fire Department Animal Control Permits & Licenses Business Business Directory Community Data Permits Relocate Here South Town Center Contact Town 2017 Water Report Town News Town Calendar Town Directory Town Help Desk Town Jobs Council Agendas & Minutes South Coffeyville Public Schools OK Union Public Schools OK Helpline BILL PAY Pay Utilities Pay Citations Pay Property Taxes Popular Resources My Town News Town History Project Government Town Council Town Clerk Court Clerk Deputy Treasurer Agendas & Minutes Ordinances Voting Public Meetings Town Utilities City Court Maintenance Dept. Police Department Fire Department Animal Control Permits & Licenses Business Business Directory Community Data Permits Relocate Here South Town Center Contact Town 2017 Water Report Town News Town Calendar Town Directory Town Help Desk Town Jobs Council Agendas & Minutes South Coffeyville Public Schools OK Union Public Schools OK Helpline " -1403,http://www.longbeach.gov/police/press-releases/halloween-safety-tips/,Media Bulletins,Agency-Published Resources,HALLOWEEN SAFETY TIPS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/23/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: HALLOWEEN SAFETY TIPS Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department would like to warn parents about marijuana laced candy, and encourage the community to practice safety tips to ensure a fun and safe Halloween. Can you identify which candies pictured in this photo are laced with marijuana? Surprisingly, all of them! These candies were found at various Long Beach marijuana dispensaries and may or may not come packaged. Parents are encouraged to check the candy their children bring home, and to dispose of anything that is not factory sealed. If unsure, but something looks or smells suspicious, get rid of it immediately. Although there have been no reported incidents in Long Beach where a child unknowingly ingested marijuana laced candy, parents should still take every precaution. Other Halloween safety tips that are just as important are as follows: Be sure your child's activities are age-appropriate All children should be accompanied by an adult Only visit homes that are well lighted and never go into a stranger's house Stay on the sidewalk and only cross at corners Stay in well populated areas and never cut through alleys or parks Apply reflective tape to your child’s costume or use glow sticks for better visibility Use face paint rather than masks that may block your child’s vision Map out your route ahead of time and carry a flash light with you Ensure tips of any props (pitchfork, sword, etc.) your child is carrying are smooth Be cautious of animals and keep your pet(s) indoors Consider trick-or-treating at participating malls or shopping centers Report any suspicious or illegal activity by calling 9-1-1 immediately Look out for cars and if you are out driving, be sure to drive slow and cautious in areas where pedestrians are present Reminder: The curfew law in Long Beach prohibits anyone 17 years old or younger from being out past 10:00 p.m. without a parent/guardian, unless going to or returning home from work or an organized event supervised by an adult, without any detour or stop. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1404,http://www.ryepolice.us/logs/police-logs-for-21716-22316,Calls for Service,Police & Public Interactions,Rye Police Department Police Logs for 2/17/16-2/23/16 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs for 2/17/16-2/23/16""]","[""Police Logs for 2/17/16-2/23/16""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -1405,https://www.southbendin.gov/police/,Contact Info & Agency Meta,Info About Agencies,South Bend Police Department | South Bend Police Department,"",200,403 Forbidden,"[""South Bend Police Department""]","[""MISSI ON"", ""VISION"", ""Useful Links"", ""Participate"", ""Meet the Department"", ""REGISTER A CAMERA"", ""South Bend"", ""Social Media""]","[""NEED TO FILL OUT A SHOPLIFTING FORM?"", ""NEW! File an Online Police Report"", ""View the Public Information Bulletin"", ""Register Your Security Camera with SBPD"", ""Visit Our Transparency Hub"", ""Click here to read a message from the Chief"", ""get involved in your community"", ""Police Athletic League"", ""Michiana Crime Stoppers"", ""Cadets and Jr. Cadets"", ""Volunteer with SBPD"", ""Neighborhood Watch"", ""Group Violence Intervention"", ""an introduction to your officers and civilians who serve"", ""Police Crime Reports"", ""stay connected, be informed""]","[""Travis Kukla Patrolman (First Class) Learn More"", ""Sienna Sears Patrolman (First Class) Learn More"", ""Jarveair Bourn Patrolman (First Class) Learn More"", ""Brianne Fenton Crime Analyst Learn More"", ""Tricia Deal Manager of Property & Evidence Room Learn More""]",[],[],Skip to main content -1406,https://beaumonttexas.gov/beaumont-police-investigating-officer-involved-shooting-lindbergh-overpass/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1407,https://police.greenvillesc.gov/324/business-assistance,Not Criminal Justice Related,Not Criminal Justice Related,"Business Assistance | Greenville, SC - Official Website",Review links and information on various incentives and programs for business assistance. ,200,"Police Department | Greenville, SC - Official Website","[""Business Assistance""]","[""Business License Incentive"", ""LADDER"", ""State & County Incentives""]","[""Loading""]",[],[],[],"Skip to Main Content Government Departments Business Visitors Residents Search Home Departments Economic Development Business Incentives Business Assistance Business Assistance Business License Incentive In 2021, City Council passed a new ordinance, creating Chapter 8 Article II to provide for certain economic development stimulus incentives. Incentive Program Application Eligible businesses must apply for the program each year that it is available. The program for existing businesses is scheduled to end June 30, 2027. This program will be administrated by the Economic Development Department. If you have questions about the Economic Development Business License Incentive Program please contact: edincentiveprogram@greenvillesc.gov . More Information LADDER The LADDER program is a comprehensive job training/placement program to reduce barriers qualified residents face in accessing employment opportunities, including education, training, child care transportation, uniforms, and tools. State & County Incentives Visit the Greenville Area Development Corporation's website for more information on the incentives offered by the State of South Carolina and Greenville County. Business License Incentives Business License Calculators Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Home Departments Economic Development Business Incentives Business Assistance Business Assistance Business License Incentive In 2021, City Council passed a new ordinance, creating Chapter 8 Article II to provide for certain economic development stimulus incentives. Incentive Program Application Eligible businesses must apply for the program each year that it is available. The program for existing businesses is scheduled to end June 30, 2027. This program will be administrated by the Economic Development Department. If you have questions about the Economic Development Business License Incentive Program please contact: edincentiveprogram@greenvillesc.gov . More Information LADDER The LADDER program is a comprehensive job training/placement program to reduce barriers qualified residents face in accessing employment opportunities, including education, training, child care transportation, uniforms, and tools. State & County Incentives Visit the Greenville Area Development Corporation's website for more information on the incentives offered by the State of South Carolina and Greenville County. Business License Incentives Business License Calculators Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate " -1408,https://www.wakeforestnc.gov/police/about-us/police-jobs/police-officer-employment,Training & Hiring Info,Info About Officers,"Police Officer Employment | Town of Wake Forest, NC",The following is a general progression of the application process and will indicate where a candidate is in the hiring process:Complete an application of employment for the Town of Wake Forest online through NEOGOV.,200,"Town of Wake Forest, NC","[""Police Officer Employment""]","[""joyner_park_1.jpg"", ""Town Hall Closed Friday, March 29"", ""Search form"", ""You are here""]","[""Minimum Qualifications"", ""Additional Benefits"", ""Police Officer Starting Salaries Based on Experience"", ""Additions to Salaries"", ""Pay Scale""]",[],[],[],Skip to main content -1409,https://spdblotter.seattle.gov/2019/01/25/police-arrest-man-following-stabbing-in-pioneer-square-neighborhood/,Media Bulletins,Agency-Published Resources,Police Arrest Man Following Thursday Night Stabbing in Pioneer Square Neighborhood - SPD Blotter,"",200,403 Forbidden,"[""Police Arrest Man Following Thursday Night Stabbing in Pioneer Square Neighborhood""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -1410,https://www.mass.gov/doc/2020-chelmsford-police-lieutenant-sole-assessment-center-examination-in-title-employment/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -1411,http://www.longbeach.gov/police/press-releases/fatal-traffic-collision/,Media Bulletins,Agency-Published Resources,FATAL TRAFFIC COLLISION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/29/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: FATAL TRAFFIC COLLISION Contact: Media Relations Detail (562) 570-5273 On April 28, 2016, at approximately 4:36 PM officers from the Long Beach Police Department responded to a report of a vehicle versus vehicle traffic collision at Spring Street and El Dorado Park Drive. Upon Officers arrival they immediately began CPR on a non-responsive female who was involved in the collision. Long Beach Fire personnel arrived shortly after and continued life saving measures until they made a determination that the female was deceased. A preliminary investigation of the collision reviled that a Hyundai Sonata being driven by a 57-year-old male resident of Long Beach was traveling westbound on Spring Street. The male driver momentarily look down away from the roadway and when he looked back up he saw that a Toyota Scion was stopped in front of him. The male had no time to react and collided with the rear of the Scion. The deceased female was a 31-year-old resident of Downey. Her name is being withheld until such time that the Los Angeles County Coroner’s Office notifies the female’s next of kin. Anyone with information regarding this collision is urged to call Collision Investigations Detective D. Lauro at (562) 570-7355. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1412,https://oceansprings-ms.gov/form-pdf/ospd-police-reserve-application/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1413,https://www.alamoheightstx.gov/public-safety/police/services/solicitor-information/,Resources,Agency-Published Resources,Solicitor Information - City of Alamo Heights,"",200,403 Forbidden,"[""Solicitor Information""]","[""Definitions:""]",[],[],[],[],"" -1414,https://elkhartlakewi.gov/departments/police/meet-us/,Personnel Records,Info About Officers,Meet Us - Village of Elkhart Lake,"",200,Error retrieving title: 'NoneType' object has no attribute 'text',"[""VILLAGE OF ELKHART LAKE POLICE DEPARTMENT STAFF""]","[""CONTACT US"", ""MORE ABOUT ELPD"", ""VILLAGE DEPARTMENTS""]","[""K-9 Copper"", ""Michael Meeusen, Chief of Police"", ""Jeremiah Pritzl, Sergeant"", ""Travis Auch, School Resource Officer"", ""Brenda Garcia, Police Officer"", ""K-9 Copper"", ""Brad Abel, Police Officer"", ""Robert Toeller, Police Officer"", ""Dylan Ninmer, Police Officer"", ""Thomas Kultgen, Police Officer"", ""Evan Gilbert, Police Officer"", ""Kelly Sippel, Police Officer"", ""Phil Schaefer, Police Officer"", ""Tyler Olig, Police Officer"", ""Amy Gross, Police Officer"", ""Marcus Anderson, Police Officer"", ""Noah Bramstedt, Police Officer"", ""VILLAGE DEPARTMENTS"", ""VILLAGE SERVICES"", ""KEY VILLAGE CONTACTS""]",[],[],[],"" -1415,https://www.sanramon.ca.gov/our_city/departments_and_divisions/police/police_news/weekly_arrest_log,Arrest Records,Police & Public Interactions,Weekly Arrest Log - City of San Ramon,"",200,Just a moment...,"[""Weekly Arrest Log""]","[""Contact Us"", ""Useful Links""]",[],[],[],[],"" -1416,https://www.dps.nm.gov/blog/2022/10/22/silver-alert-alamogordo-police-department-ralph-magruder/,Resources,Agency-Published Resources,SILVER ALERT – Otero County Sheriff's Office– Ralph Magruder - NM Department of Public Safety,"",200,Home - NM Department of Public Safety,"[""SILVER ALERT – Otero County Sheriff’s Office– Ralph Magruder""]",[],"[""Location"", ""Sitemap"", ""Quick Links"", ""Social Media Links""]",[],[],[],"" -1417,https://www.ashevillenc.gov/news/asheville-police-department-to-add-patrol-district-realign-existing-districts-in-2020/,Media Bulletins,Agency-Published Resources,ERROR: The request could not be satisfied,"",200,The City of Asheville - Your Asheville,"[""403 ERROR""]","[""The request could not be satisfied.""]",[],[],[],[],"" -1418,https://www.naperville.il.us/services/naperville-police-department/programs-and-services/police-department-tours/,Resources,Agency-Published Resources,Police Department Tours | The City of Naperville,Facility tours are educational and structured to help residents better understand the workings of a police department.,200,Home | The City of Naperville,"[""Police Department Tours""]","[""Programs and Services"", ""Contact Us"", ""Request a Tour"", ""Naperville Police Department""]","[""Explore"", ""TOUR INFORMATION"", ""TOUR INFORMATION"", ""REQUESTOR INFORMATION"", ""REQUESTOR INFORMATION"", ""GROUP INFORMATION"", ""GROUP INFORMATION""]",[],"[""Helping Residents Build a Better Community"", ""Resources for Doing Business in Naperville""]",[],"Menu Search Menu Search Search Main Menu Navigation About Naperville + An Award-Winning Community Demographics and Key Facts Education Historic Preservation in Naperville Projects in Naperville Transportation and Parking Townships Government + Boards and Commissions City Leadership Team City Finances Annual Budget and Financial Reports Purchasing and Bids Taxes and Financial Forms Utility Services and Billing General Billing Water Street TIF District Coronavirus Resources Diversity, Equity and Inclusion A Community of Belonging DEI Defined DEI Timeline Youth Involvement Embracing Community Environmental Sustainability in Naperville Grants Meetings and Agendas Legislative Priorities Meeting Room Reservations Meet Your City Council Mayor Scott A. Wehrli Councilman Ian Holzhauer Councilman Patrick Kelly Councilman Paul Leong Councilwoman Allison Longenbaugh Councilman Josh McBroom Councilwoman Jennifer Bruzan Taylor Councilman Dr. Benjamin M. White Councilman Nate Wilson Municipal Center Municipal Code Open Data Proclamations Strategic Plan Task Forces Voting and Voter Registration Services + Brush, Leaf & Yard Waste Curbside Bulk Brush Collection Leaf Collection Yard Waste Collection Electric Utility Your Electric Service Electrical Safety Powering Our Community for the Future FOIA Request Garbage and Recycling Residential Garbage Collection Garbage Carts Curbside Recycling Program Recycling Carts Recycling Drop-Off Center Household Hazardous Waste Facility Electronics Recycling Holiday Lights Recycling Naperville Fire Department About the Fire Department Emergency Preparedness Inspections and Permits Programs and Services Safety and Public Education Naperville Police Department About the Police Department Programs and Services Community Education and Crime Prevention Office of the Chief of Police Investigations Division Patrol Division Join NPD Permits and Licenses Senior Services and Resources Services and Resources for People with Disabilities Snow and Ice Removal Snow Plowing and Salting Mailboxes and Parkway Sod Winter Updates Water/Wastewater Utility Your Water Service Maintaining Our System Common Water Issues Residents + Helping Residents Build a Better Community You can find a collection of city information relevant to everyone in Naperville, from new residents to long-time community members. Go to this section Businesses + Resources for Doing Business in Naperville Whether you're starting, running or visiting a Naperville business - find resources to help you. Go to this section Enjoy Naperville + Biking Maps, Guides and Plans Commander Dan Shanower September 11 Memorial Explore the Community Festivals and Parades Millennium Wall Naperville Community Concert Center Naperville Riverwalk Naper Settlement & Homestead Von Oven Scout Reservation Walks and Runs + + + + Helping Residents Build a Better Community You can find a collection of city information relevant to everyone in Naperville, from new residents to long-time community members. Go to this section + Resources for Doing Business in Naperville Whether you're starting, running or visiting a Naperville business - find resources to help you. Go to this section + " -1419,https://southamptontownnypolice.gov/faq.aspx?qid=499,Resources,Agency-Published Resources,FAQs • What beaches are Southampton Town beaches?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Parks & Rec""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1420,https://spdblotter.seattle.gov/2014/05/16/police-bolstering-patrols-as-detectives-investigate-recent-shootings/,Media Bulletins,Agency-Published Resources,Police Bolstering Patrols As Detectives Investigate Recent Shootings - SPD Blotter,"",200,403 Forbidden,"[""Police Bolstering Patrols As Detectives Investigate Recent Shootings""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -1421,https://www.newlexingtonohio.gov/resources/forms/police-department-public-records-request-form/,Records Request Info,Agency-Published Resources,Police Department Public Records Request Form - Village of New Lexington,"New Lexington, Ohio",200,Error retrieving title: dictionary changed size during iteration,"[""Police Department Records Request Form""]",[],[],[],[],[],"About Our Town History Departments Village Council Village Council Elected Officials Police Department Fire/EMS Income Tax Department Parks and Recreation Tree Commission Shelter House Street Canvassing Calendar Swimming Pool Administration Offices Water Department Finance Department News Village Event Calendar Announcements Resources Ordinances & Resolutions Council Meeting Minutes New Lexington Charter Zoning Ordinance Forms Requests Public Records Request Form Citizen Request Form Police Department Public Records Request Form Permits Parades and Assemblies Permit Application Commercial Zoning Permit Application Residential Zoning Permit Application Temporary Sales Application Fence Permit Request Form Solicitation Permit Backflow-Prevention Form(Download) Become a Collaborator Select Page About Our Town History Departments Village Council Village Council Elected Officials Police Department Fire/EMS Income Tax Department Parks and Recreation Tree Commission Shelter House Street Canvassing Calendar Swimming Pool Administration Offices Water Department Finance Department News Village Event Calendar Announcements Resources Ordinances & Resolutions Council Meeting Minutes New Lexington Charter Zoning Ordinance Forms Requests Public Records Request Form Citizen Request Form Police Department Public Records Request Form Permits Parades and Assemblies Permit Application Commercial Zoning Permit Application Residential Zoning Permit Application Temporary Sales Application Fence Permit Request Form Solicitation Permit Backflow-Prevention Form(Download) Become a Collaborator Police Department Records Request Form Requestor Information Information regarding the records you are requesting: Agreement I understand by submitting this form, I attest to the accuracy of all information provided. New Lexington Police Department is responsible for the release of offense/incident reports and accident reports. The request will be processed during normal business hours Monday through Friday 8:00am to 4:00pm. All other requests for public records shall be directed to the Village Administrator’s Office. The cost for accident reports are $5.00, all other copies are $.15 a page. Only completed reports approved by a supervisor will be released. This request corresponds with R.C 149.43 in accordance with Public Records. Village of New Lexington 215 S. Main Street New Lexington OH, 43764 Phone: (740) 342-1633 Fax: (740) 342-1292 " -1422,https://champaignil.gov/police/resources/gun-violence-prevention-and-response/,Resources,Agency-Published Resources,Gun Violence Prevention and Response - City of Champaign,"",200,403 Forbidden,"[""Gun Violence Prevention and Response""]","[""Police Department"", ""Quick Links"", ""Police Department News"", ""Contact Us""]","["""", ""Jump to the latest shooting incident statistics"", ""What is the City of Champaign Doing to Combat Gun Violence?"", ""Community Resources"", ""Shooting Incident Statistics""]",[],[],[],"" -1423,https://townofkremmling.colorado.gov/departments/police,Resources,Agency-Published Resources,Police | Town of Kremmling,"",200,Home | Town of Kremmling,"[""Police""]","[""Frequently Asked Questions"", ""Town of Kremmling"", ""We're Social""]",[],[],[],[],"" -1424,http://www.longbeach.gov/police/press-releases/murder-23-/,Media Bulletins,Agency-Published Resources,MURDER(23),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/6/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Friday, June 5, 2015, at approximately 10:00 p.m., Long Beach Police responded to a shooting in the 1200 block of E. 17th Street, which resulted in the death of a male adult. When officers arrived, they discovered the victim, identified as 20-year-old Anthony Holston of Long Beach, had been struck in the upper body by gunfire. Long Beach Fire Department paramedics transported Victim Holston to a local hospital, where he was pronounced deceased. The preliminary investigation revealed the victim had become involved in a dispute with an unknown number of male subjects. The dispute escalated and there was an exchange of gunfire between the victim and suspect(s), who remain outstanding. The incident is being investigated as possibly gang-related. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detectives Hugo Cortes and Oscar Valenzuela at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1425,http://www.longbeach.gov/police/press-releases/murder-pch-and-pacific/,Media Bulletins,Agency-Published Resources,MURDER PCH AND PACIFIC,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/3/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Monday, October 3, 2016, at approximately 2:40 a.m., Long Beach Police were dispatched to the area of Pacific Coast Highway and Pacific Avenue to assist Long Beach Fire Department with an individual lying in the street. Arriving officers located a male adult who sustained multiple stab wounds to the upper torso. Long Beach Fire Department personnel transported the victim to a local hospital where he succumbed to his injuries. The victim has been identified as Sergio Diaz Acosta, 25 years old and a resident of Long Beach. The incident is being investigated as gang related. A motive for the stabbing is unknown and the investigation remains ongoing. Anyone with information regarding this incident is asked to contact Long Beach Police Homicide Detectives Todd Johnson and Shea Robertson at (562) 570-7244. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1426,https://champaignil.gov/2014/03/24/police-arrest-one-suspect-in-home-invasion/,Media Bulletins,Agency-Published Resources,Police Arrest One Suspect in Home Invasion - City of Champaign,"",200,403 Forbidden,"[""Police Arrest One Suspect in Home Invasion""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Police Arrest One Suspect in Home Invasion Search Posted on March 24, 2014 The Champaign Police Department is currently investigating a home invasion that occurred in the 00 block of Hanover Court on March 22, 2014. Police arrested one suspect and continue to search for at least two additional suspects involved in this incident. Officers were dispatched to a home invasion, in progress, at 8:48 p.m., after three males forced their way into the home and battered a male and female resident. The female was punched and a 29 year-old male was stabbed during a physical altercation with one of the suspects. The suspects then searched the home for unknown items before leaving in the residents’ vehicle. When officers arrived on scene, they observed three males bailing from the stolen vehicle and fleeing on foot. One of the suspects, Korey Coleman, 21, of Champaign, was apprehended by officers and arrested for Home Invasion. He was transported to the Champaign County Jail. The male victim was transported to Carle Hospital for what appeared to be non-life- threatening injuries. Officers are seeking information from the public to help identify the persons involved in this incident. Anyone with information about these crimes can contact the Champaign Police Department by calling (217) 351-4545 or callers can remain anonymous by calling Crime Stoppers at 373-8477 (TIPS). Information can also be sent by anonymous web tip by going to: www.373tips.com or by texting keyword “CCTIP” plus the information to 274637 (CRIMES). Categories: Police Department Press Releases Tags: Arrest , Champaign , Hanover Court , Home , Invasion , Korey Coleman , police , Suspect Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign " -1427,https://www.mass.gov/doc/rossi-cully-v-duxbury-police-department-related-superior-court-decision-52710/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -1428,https://galenaks.gov/view-more-http-emjophotography-pass-us-galenapolicedepartment2018-8/,Poor Data Source,Poor Data Source,"PO Fleming – City of Galena, Kansas","",200,Not Acceptable!,"[""PO Fleming""]","[""0 Comments""]","[""Weather Info"", ""Featured Gallery"", ""Directory"", ""About GALENAKS.GOV"", ""Upcoming Events"", ""Important Forms"", ""Quick Contact""]","[""Leave a comment Cancel reply"", ""Local Time"", ""Today"", ""Tuesday"", ""Wednesday"", ""Thursday"", ""Galena Police Department 2018"", ""Schermerhorn Park"", ""Galena Senior Citizens Weekly Meal"", ""Game Day and Special Events for Seniors"", ""2024 CITY COUNCIL MEETING MINUTES"", ""Assessment Removal Request""]","[""March 25, 2024"", ""March 26, 2024"", ""March 27, 2024"", ""March 28, 2024""]",[],"Manage Cookie Consent To provide the best experiences, we use technologies like cookies to store and/or access device information. Consenting to these technologies will allow us to process data such as browsing behavior or unique IDs on this site. Not consenting or withdrawing consent, may adversely affect certain features and functions. Functional Functional Always active The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network. Preferences Preferences The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user. Statistics Statistics The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you. Marketing Marketing The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes. Manage options Manage services Manage {vendor_count} vendors Read more about these purposes Accept Deny View preferences Save preferences View preferences {title} {title} {title} Manage Cookie Consent To provide the best experiences, we use technologies like cookies to store and/or access device information. Consenting to these technologies will allow us to process data such as browsing behavior or unique IDs on this site. Not consenting or withdrawing consent, may adversely affect certain features and functions. Functional Functional Always active The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network. Preferences Preferences The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user. Statistics Statistics The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you. Marketing Marketing The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes. Manage options Manage services Manage {vendor_count} vendors Read more about these purposes Accept Deny View preferences Save preferences View preferences {title} {title} {title} Manage Cookie Consent Manage Cookie Consent " -1429,http://www.longbeach.gov/police/press-releases/significant-crime-reduction-during-first-year-metro-blue-line-contract/,Media Bulletins,Agency-Published Resources,SIGNIFICANT CRIME REDUCTION DURING FIRST YEAR METRO BLUE LINE CONTRACT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/20/2018 FOR IMMEDIATE RELEASE Press Release # Subject: SIGNIFICANT CRIME REDUCTION DURING FIRST YEAR METRO BLUE LINE CONTRACT Contact: Media Relations Detail (562) 570-5273 Metro Staff with Chief Luna (Click on the Photlarge) The Long Beach Police Department (LBPD) was awarded the Los Angeles County Metropolitan Transportation Authority (Metro) Blue Line security contract in 2017 and began services on July 1, 2017. Since the start of the partnership, the dedication and hard work of the men and women of the LBPD has shown outstanding success in reducing crime and increasing safety on the Blue Line. In the last year, through ongoing outreach and enforcement efforts, the LBPD has reduced Part 1 crime by 50% and Part 2 crime by 80% within the eight station platforms and trains that fall under the City’s jurisdiction. The presence of officers in and around the platforms has reduced assaults against train operators by 30%, and achieved an average Priority 1 response time of 2.38 minutes. These significant decreases are a direct result of the partnership between the Los Angeles County Metropolitan Transportation Authority (Metro) and the dedication of LBPD personnel. “I want to take this opportunity to thank the men and women of our Department for their outstanding success in reducing crime and disorder on the Blue Line during the first year of our contract,” said Chief of Police Robert Luna. “This is a true testament of the commitment, professionalism of our personnel and the partnerships we have developed with our community.” The LBPD works with Metro to continue our mission of preventing all crime and acts of terrorism, by having officers continuously ride trains and patrol Blue Line stations from Wardlow Road to the Downtown Long Beach area. To further support the field operations, the LBPD’s 2019 fiscal year budget will add one detective position dedicated to investigating Metro related crimes; and contract two “Quality of Life” officers who will focus their efforts on connecting persons experiencing homelessness to social services and resources. The LBPD will continue our partnership with Metro, to increase visibility and impact crime to ensure both our community and passengers always feel safe and protected when riding the Blue Line in Long Beach. For more information about how Part 1 and Part 2 crimes are classified visit: https://www2.fbi.gov/ucr/cius_04/appendices/appendix_02.html This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1430,https://southamptontownnypolice.gov/faq.aspx?qid=297,Resources,Agency-Published Resources,FAQs • Does the Trustee’s Office handle shellfish permits?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Trustees""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1431,https://www.mass.gov/doc/copper-in-drinking-water-faq-english-0/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,Mass.gov,[],[],[],[],[],[],"" -1432,https://police.beaumonttexas.gov/taxonomy-template/,Poor Data Source,Poor Data Source,"Taxonomy template – City of Beaumont, Texas","",200,403 Forbidden,"[""Taxonomy template""]",[],[],"[""Quick Links"", """"]",[],[],"Facebook X Instagram Search for: Home Administration Division Community Relations Community Programs Cops & Kids Honor Roll Police Museum Police 2 Citizen Community Advisory Finger Prints Internal Affairs Permits & Registrations Public Access Documents Records Management Reports Training Recruitment 911 Operation Center Criminal Investigation Divison Auto Theft Task Force Financial Crimes Family Violence Unit Patrol Division FAQ City Links Adopt a Pet Airport Building Permits & Inspections Chamber of Commerce City Jobs City Maps City Ordinances City Service Helpline EMS Emergency Preparedness Fire Department Food Permits & Inspections Garbage & Recycling GIS Data Health Services Online Payments Parks & Recreation Purchasing & Bids Rent a Community Center Senior Services Transit Services Government City Council City Manager Departments Press Releases Go to... Home Administration Division Community Relations Community Programs Cops & Kids Honor Roll Police Museum Police 2 Citizen Community Advisory Finger Prints Internal Affairs Permits & Registrations Public Access Documents Records Management Reports Training Recruitment 911 Operation Center Criminal Investigation Divison Auto Theft Task Force Financial Crimes Family Violence Unit Patrol Division FAQ City Links Adopt a Pet Airport Building Permits & Inspections Chamber of Commerce City Jobs City Maps City Ordinances City Service Helpline EMS Emergency Preparedness Fire Department Food Permits & Inspections Garbage & Recycling GIS Data Health Services Online Payments Parks & Recreation Purchasing & Bids Rent a Community Center Senior Services Transit Services Government City Council City Manager Departments Press Releases Search for: Taxonomy template Home Taxonomy template Taxonomy template Angela Wright 2016-10-20T07:18:33-05:00 [CONTENT] Quick Links Active Calls Wrecker Rotation Neighborhood Associations Map Law Beats Map Emergency Management Press Releases Municipal Court Public Records Contact Us Police 2 Citizen P.O. Box 3827 Beaumont, Texas 77704-3827 | (409) 980-8311 | © City of Beaumont, Texas | Americans with Disabilities Act Facebook X Instagram " -1433,http://www.longbeach.gov/police/press-releases/directed-enforcement-patrols-and-bicycle-theft-sting-results-in-arrests/,Media Bulletins,Agency-Published Resources,DIRECTED ENFORCEMENT PATROLS AND BICYCLE THEFT STING RESULTS IN ARRESTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1434,http://www.lafayettepolice.us/354/juvenile-investigations,Resources,Agency-Published Resources,"Special Victims Unit | Lafayette, IN - Official Website",The mission of the Juvenile Division is to investigate crimes against juveniles and those offenses committed by juveniles.,200,"Police Department | Lafayette, IN - Official Website","[""Special Victims Unit""]","[""RESPONSIBILITIES"", ""-----------------------------------------------------------------------------"", ""RESOURCES""]","[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1435,https://www.mass.gov/directive/directive-93-7-exempt-sales-of-copying-machines-and-related-items,Not Criminal Justice Related,Not Criminal Justice Related,Directive 93-7: Exempt Sales of Copying Machines and Related Items | Mass.gov,"Sales and Use Tax ISSUE: When are retail sales of copying machines, related supplies, photocopies and service contracts exempt from sales tax? DIRECTIVE: Copying Machines. Retail sales of copying machines are subject to sales tax unless the copier is used directly and exclusively in an industrial plant in the actual manufacture of tangible personal property to be sold. See G.L. c. 64H, § 6(s). Supplies. The retail sale of copying machine supplies such as paper, toner and ink are exempt if the photocopies produced from these ingredient or component materials will be sold. See G.L. c. 64H, § 6(r). Retail sales of supplies that do not become an ingredient or component part of tangible personal property to be sold are exempt only if they are consumed and used directly and exclusively in an industrial plant in the actual manufacture of tangible personal property to be sold. See G.L. c. 64H, § 6(s). Photocopies. Retail sales of photocopies are subject to sales tax. Service Contracts. Generally, when the sales price of a service contract is separately stated from the sales price of the equipment and the purchase of the contract is optional, the purchase of the service contract is not subject to sales tax. The cost of a mandatory service contract which the buyer must purchase as part of the sale of the copying machine is included in the taxable sale price of the machine. See 830 CMR 64H.1.1(5)(g), for information regarding taxation of service contracts and replacement parts. Sales to Exempt Purchasers. Retail sales of tangible personal property, including copying machines, supplies and photocopies to government agencies or under certain circumstances to tax exempt organizations qualified under § 501(c)(3) of the Internal Revenue Code, are exempt from tax under G.L. c. 64H, § 6(d) and § 6(e) respectively. DISCUSSION OF LAW: General Laws Chapter 64H, § 2, imposes a tax upon retail sales in the commonwealth by any vendor of tangible personal property or telecommunications services unless specifically exempt. The definition of ""sales"" includes leases and rentals. G.L. c. 64H, § 1. However, the sale of any item of tangible personal property may be exempt if it is sold for an exempt use or if it is sold to an exempt purchaser. 1. Exempt Use a. Copying Machines General Laws Chapter 64H, § 6(s), exempts from taxation sales of machinery, and its replacement parts, used directly and exclusively in an industrial plant in the actual manufacture of tangible personal property to be sold. Machinery is ""used directly and exclusively"" in the manufacture of tangible personal property to be sold only where it is used solely during a manufacturing operation to cause a direct and immediate physical change upon such property. Id. An industrial plant is a factory at a fixed location primarily engaged in the manufacture, conversion or processing of tangible personal property to be sold in the regular course of business. b. Supplies General Laws Chapter 64H, § 6(r), exempts from taxation sales of materials, tools and fuel, or their substitutes, which become an ingredient or component part of tangible personal property to be sold. Materials, tools and fuel which do not become an ingredient or component part of tangible personal property to be sold may be exempt if they are consumed and used directly and exclusively in an industrial plant in the actual manufacture of tangible personal property to be sold. Id. A material, tool or fuel is ""consumed and used directly and exclusively in an industrial plant in the actual manufacture of tangible personal property to be sold"" only if its normal useful life is less than one year, or if its cost is allowable as an ordinary and necessary business expense for federal income tax purposes. Id. 2. Exempt Purchaser General Laws Chapter 64H, § 6(d), exempts from sales tax sales to the United States, the commonwealth, or their respective agencies. Sales to organizations exempt from taxation pursuant to section 501(c)(3) of the Internal Revenue Code (""tax exempt""), are exempt from sales tax provided that the tangible personal property sold is used in the conduct of the organization's exempt enterprise, and the organization obtains a certificate from the Commissioner of Revenue stating it is entitled to the exemption, and the vendor keeps a proper record of the sale. See G.L. c. 64H, § 6(e). EXAMPLES: 1. A company operating a photoprocessing business at a fixed location purchases a copying machine. The company's primary activity is the manufacturing of photographic images to be sold in the regular course of the company's business. The copying machine is used solely to cause a direct and immediate physical change upon the property to be sold during photoprocessing operations. The company also purchases supplies for the copying machine. The company's premises qualifies as a ""factory"" since the primary activity there consists of using mechanical power in photoprocessing manufacturing operations. See Letter Rulings 85-40 and 89-7, and Directive 88-9. The company's premises qualifies as an ""industrial plant"" because it consists of a factory at a fixed location used primarily for the manufacture of tangible personal property to be sold in the regular course of the company's business. The sale of the copying machine is exempt from tax since the machine is used directly and exclusively in an industrial plant in the actual manufacture of tangible personal property to be sold. The sales of supplies used in this machine are exempt if the supplies become an ingredient or component part of tangible personal property to be sold. Supplies that do not become an ingredient or component part of the tangible personal property sold are exempt only if they are consumed and used directly and exclusively in the industrial plant in the actual manufacture of tangible personal property to be sold. Sales of the photocopies are generally taxable. 2. Copying machines are leased for use by various ""tax exempt"" organizations that qualify for exemption under G.L. c. 64H, § 6(e) as discussed above and government entities, such as public universities and public libraries. These organizations and entities also purchase supplies for the copying machines, and make the copying machines availables to the general public. Leases of the copying machines and sales of supplies to qualified ""tax exempt"" organizations are exempt from taxation. Leases of the copying machines and sales of supplies to the federal government and its agencies, and to the commonwealth and its agencies, are exempt from taxation. Sales of tangible personal property by such ""tax exempt"" organizations and government agencies, however, are generally taxable. Thus, sales of photocopies by these institutions are generally subject to tax. See G.L. c. 64H, § 1, (definition of ""retailer""); see also DOR Directive 91-1 and Letter Ruling 92-3. CONCLUSION: Depending on the facts of each transaction, retail sales of copying machines, although generally taxable, may be exempt from taxation pursuant to G.L. c. 64H, § 6(d), § 6(e) or § 6(s). Sales of copying machine supplies, also generally taxable, may be exempt from taxation pursuant to G.L. c. 64H, § 6(d), § 6(e), § 6(r), or § 6(s). Generally, sales of photocopies are subject to tax. Exempt Usage. When claiming an exemption based on use pursuant to G.L. c. 64H, § 6(r) or § 6(s), a properly completed Form ST-12 certifying that the property is being purchased for an exempt use must be presented by the purchaser to the vendor. See 830 CMR 64H.8.1(5). Exempt Purchaser. When claiming an exemption as an exempt purchaser pursuant to G.L. c. 64H, § 6(d) or § 6(e), a properly completed Form ST-5 with an ST-2 copy (required for tax exempt organizations only) certifying that the purchaser is exempt must be presented by the purchaser to the vendor. See 830 CMR 64H.8.1(5). If a government entity claims the exemption but does not offer an Exempt Purchaser Certificate the vendor, to sell tax free, must obtain adequate documentation, generally, a copy of the government check, verifying that the purchaser is a government entity.   /s/Mitchell Adams Mitchell Adams Commissioner of Revenue   MA:HMP:kt   December 21, 1993   DOR-D 93-7",200,Mass.gov,"[""Directive Directive 93-7: Exempt Sales of Copying Machines and Related Items""]","[""Notices & Alerts Hide Expand"", ""Table of Contents"", ""Help Us Improve Mass.gov with your feedback""]","[""notice Get important updates from DOR. Updated Feb. 5, 2024, 03:00 pm""]",[],[],[],"" -1436,http://www.longbeach.gov/police/press-releases/defendant-sentenced-to-45-years-for-charges-relating-to-human-trafficking/,Media Bulletins,Agency-Published Resources,DEFENDANT SENTENCED TO 45 YEARS FOR CHARGES RELATING TO HUMAN TRAFFICKING,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/6/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: DEFENDANT SENTENCED TO 45 YEARS FOR CHARGES RELATING TO HUMAN TRAFFICKING Contact: Media Relations Detail (562) 570-5273 A defendant convicted of various charges related to the human trafficking of a young girl has been sentenced to prison, demonstrating the Long Beach Police Department’s ongoing commitment towards aggressively combating this horrific crime. In January of 2011, a human trafficking investigation was launched after the arrest of a 13-year-old female for prostitution. Through the investigation, detectives learned that a male subject, identified as 33-year-old Ray Rhodes of Los Angeles, had begun forcing the 13-year-old into prostitution in the Long Beach area in September of 2010, until the time of her arrest. An arrest warrant was issued for the defendant for human trafficking, sexual assault, and pimping and pandering. He was ultimately arrested in San Bernardino County in May of 2011 on unrelated charges, in addition to the outstanding Long Beach warrant. On June 27, 2013, the defendant was convicted in Los Angeles Superior Court on two counts of lewd act with a child, and one count each of the following charges: procuring a child for a lewd act, pandering a minor under 16 years of age, and pimping a minor under 16 years of age. On January 2, 2014, the defendant was sentenced to 45 years in prison, and will not be eligible for parole until the age of 73. The investigative efforts, testimony, and victim follow-up carried out by the Juvenile Investigations Section detectives assigned to this case, were essential to its successful outcome. The Long Beach Police Department is committed to combating human trafficking and we will continue to use all tools available to us to identify those responsible and hold them accountable. Anyone who is, or has been a victim of human trafficking is urged to come forward by contacting the Long Beach Police Department’s Vice Investigations Detail at (562) 570-7219. Any victim in need of resources is also encouraged to contact detectives. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1437,https://delcopa.gov/publicrelations/releases/2018/2019doglicenses.html,Resources,Agency-Published Resources,"2019 Dog Licenses now available - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""2019 Dog Licenses now available""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 2019 Dog Licenses now available Home / Departments / Public Relations Releases / 2019 Dog Licenses now available Your browser does not support H.264/MP4. If you experience playback issues, please update your browser. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 2019 Dog Licenses now available Home / Departments / Public Relations Releases / 2019 Dog Licenses now available 2019 Dog Licenses now available Home / Departments / Public Relations Releases / 2019 Dog Licenses now available 2019 Dog Licenses now available Home / Departments / Public Relations Releases / 2019 Dog Licenses now available Your browser does not support H.264/MP4. If you experience playback issues, please update your browser. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Your browser does not support H.264/MP4. If you experience playback issues, please update your browser. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Public Relations Navigation Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us " -1438,https://www.knoxvilletn.gov/government/mayors_office/c_o_v_i_d-19___coronavirus_/stress_and_coping/knox_well/kid___parent_resources,Resources,Agency-Published Resources,Kid & Parent Resources - City of Knoxville,nothing*,200,Just a moment...,"[""Kid & Parent Resources""]",[],[],[],[],[],Skip navigation {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## -1439,https://spdblotter.seattle.gov/2016/08/17/police-search-for-leads-on-teen-girls-suspected-in-south-seattle-bleach-attacks/,Media Bulletins,Agency-Published Resources,Police Search for Leads on Teen Girls Suspected In South Seattle Bleach Attacks - SPD Blotter,"",200,403 Forbidden,"[""Police Search for Leads on Teen Girls Suspected In South Seattle Bleach Attacks""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -1440,https://www.chesterfield.in.gov/departments/police/,Resources,Agency-Published Resources,Police Department – Town of Chesterfield,"",200,Town of Chesterfield – A Progressive Community Est. 1858,"[""Menu"", ""Town of Chesterfield"", ""Police Department"", ""I Want to…"", ""Recent News"", ""Upcoming Events""]","[""A Progressive Community Est. 1858"", """"]","[""Police and Accident Reports""]",[],[],[],"Menu Skip to content Welcome Current News Town Government Town Council Clerk/Treasurer Utilities & Billing Building Permits Planning Commission Board of Zoning Appeals Union Township Trustee Ordinances & Resolutions Town Departments Town Parks Park Board Police Department Programs and Services Gun Permits CPD Social Media Terms of Use Fire Department Water Department Streets Department Our Town Community Programs Civic Organizations Local Schools History Calendar Contact Town of Chesterfield A Progressive Community Est. 1858 Police Department Police and Accident Reports All reports taken by the officers of the Chesterfield Police Department are considered to be public record and are available to anyone who wishes to obtain copies. All copies are available at the current fee of $8.00 per copy. Multiple copies may be discounted at the discretion of the Chief of Police or the Town Council. You can pick up copies during the following times: Monday: 10 a.m.-5 p.m. Tuesday: 9 a.m.-10 p.m. Wednesday: 9 a.m.-10 p.m. Thursday: 9 a.m.-10 p.m. Friday: 9 a.m.-10 p.m. Search for: I Want to… Pay My Utility Bill Get a Building Permit Locate an Ordinance Setup Utilities Find a Park Recent News 2023 Annual Drinking Water Quality Report March 18, 2024 2022 Annual Drinking Water Report March 2, 2023 2021 Annual Drinking Water Quality Report April 11, 2022 Town of Chesterfield Coronovirus Guidelines 1/1/2021 Update January 7, 2021 Wastewater Treatment Plant Preliminary Engineering Report July 6, 2020 Upcoming Events Loading Widget… Copyright ©2021, Town of Chesterfield, Indiana. All rights reserved. Menu Skip to content Welcome Current News Town Government Town Council Clerk/Treasurer Utilities & Billing Building Permits Planning Commission Board of Zoning Appeals Union Township Trustee Ordinances & Resolutions Town Departments Town Parks Park Board Police Department Programs and Services Gun Permits CPD Social Media Terms of Use Fire Department Water Department Streets Department Our Town Community Programs Civic Organizations Local Schools History Calendar Contact Welcome Current News Town Government Town Council Clerk/Treasurer Utilities & Billing Building Permits Planning Commission Board of Zoning Appeals Union Township Trustee Ordinances & Resolutions Town Departments Town Parks Park Board Police Department Programs and Services Gun Permits CPD Social Media Terms of Use Fire Department Water Department Streets Department Our Town Community Programs Civic Organizations Local Schools History Calendar Contact Town of Chesterfield A Progressive Community Est. 1858 " -1441,https://www.mass.gov/doc/fitchburgpolicesergeant7929rtf/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -1442,http://www.tampa.gov/police/info/honoring-our-heroes/curtis-and-kocab/david-curtis,Personnel Records,Info About Officers,Officer David Lamar Curtis | City of Tampa,"October 3, 1978 - June 29, 2010",200,City of Tampa,"[""Officer David Lamar Curtis""]","[""Police Department"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[],"" -1443,https://www.antioch.il.gov/wpfb-file/08-03-11-police-and-fire-agenda-pdf/,Media Bulletins,Agency-Published Resources,"08-03-11 Police And Fire Agenda - Antioch, IL",8038 08 03 11 police and fire agenda pdf commissions commission agendas 2011 1311972182 b5a97d493539b841a8655f0d9c16d00b 217x300 _xa4zmw67zhfv thumb jpg 07 29 15 43 02 0 pdf application page_text num_pages analyze pdf_pages pdf_2text timings,200,"Home - Antioch, IL","[""08-03-11 Police And Fire Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -1444,https://www.southamptontownnypolice.gov/1782/2023-budgets,Resources,Agency-Published Resources,"2023 Budgets | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""2023 Budgets""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]","[""2023 Tentative Budget - Operating"", ""2023 Tentative Budget - Capital"", ""2023 Adopted Budget - Operating"", ""2023 Adopted Budget - Capital""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Finance (Comptroller) 2023 Budgets 2023 Budgets 9 1 1 1 2023 Tentative Budget - Operating Link to page 2023 Tentative Budget - Capital Link to page 2023 Adopted Budget - Operating Link to page 2023 Adopted Budget - Capital Link to page 2023 Tentative Budget - Operating 2023 Tentative Budget - Capital 2023 Adopted Budget - Operating 2023 Adopted Budget - Capital Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Finance (Comptroller) 2023 Budgets 2023 Budgets 9 1 1 1 2023 Tentative Budget - Operating Link to page 2023 Tentative Budget - Capital Link to page 2023 Adopted Budget - Operating Link to page 2023 Adopted Budget - Capital Link to page 2023 Tentative Budget - Operating 2023 Tentative Budget - Capital 2023 Adopted Budget - Operating 2023 Adopted Budget - Capital Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -1445,https://alpha.austin.gov/es/police-oversight/2020-06-30-2/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1446,https://www.coronadelmar.us/procession-honors-newport-beach-police-detective/,Not Criminal Justice Related,Not Criminal Justice Related,Procession Honors Newport Beach Police Detective | Corona del Mar California,"",200,Corona del Mar California,"[""Procession Honors Newport Beach Police Detective""]","[""Menu"", ""Be First to Comment"", ""Subscribe"", """", """"]","[""Share this:"", ""Like this:"", ""Related"", ""Leave a Reply Cancel reply"", """"]",[],[],[],"" -1447,https://coloradosprings.gov/police-department/article/news/las-vegas-street-and-south-tejon-street,Media Bulletins,Agency-Published Resources,Las Vegas Street and South Tejon Street | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Las Vegas Street and South Tejon Street""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -1448,https://rocklandmaine.gov/events/police-review-committee-meeting-18/,Poor Data Source,Poor Data Source,"Police Review Committee Meeting | The City of Rockland, Maine","Monday, 25 July 2022 - 430pm Zoom Meeting Link - https://us02web.zoom.us/j/5040315241?pwd=eFhHaWJ4ZmhNakRmQ0VIQko4VmlKUT09 Facilitator: Emily Note Taker: Jan",200,403 Forbidden,"[""Police Review Committee Meeting"", ""Police Review Committee Meeting""]",[],"[""All Current Alerts & Announcements"", ""Current Weather"", ""Date"", ""Time"", ""Leave a Comment Cancel reply"", ""City of Rockland""]",[],[],[],"All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Current Weather Now loading... All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Current Weather Now loading... All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Current Weather Now loading... All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! " -1449,https://coloradosprings.gov/police-department/article/news/city-ordinance-area-expanded,Media Bulletins,Agency-Published Resources,City Ordinance Area Expanded | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""City Ordinance Area Expanded""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -1450,https://delcopa.gov/publicrelations/releases/2022/delcohonoredtoreceivegovernersawardforlocalgovtexcellence.html,Media Bulletins,Agency-Published Resources,"Delaware County Honored to Receive the Governor’s Award for Local Government Excellence - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Honored to Receive the Governor’s Award for Local Government Excellence""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -1451,https://delcopa.gov/health/pages/animalbites.html,Resources,Agency-Published Resources,"Animal Bites to Humans - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Animal Bites to Humans""]",[],"["""", ""Health Dept Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -1452,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/011321arrests.pdf,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -1453,http://www.longbeach.gov/police/press-releases/dui-drivers-license-checkpoint/,Media Bulletins,Agency-Published Resources,DUI DRIVERS LICENSE CHECKPOINT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1454,https://www.mass.gov/doc/perry-brian-v-boston-police-department-92012/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -1455,https://www.memphistn.gov/government/police-department/in-memoriam/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1456,https://www.mass.gov/doc/hamm-brendan-v-boston-police-department-111308/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -1457,https://www.coppelltx.gov/666/sustainability-data,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1458,https://edenny.gov/town-of-eden-police-reform-plan/,Contact Info & Agency Meta,Info About Agencies,"Town of Eden Police Reform Plan | Town of Eden, New York","",200,"Town of Eden, New York | The Garden Spot of New York","[""Town of Eden Police Reform Plan""]",[],[],"[""Contact Information""]",[],[],"Home Town of Eden Town Board Overview Agendas Minutes Meeting Recordings Legal Notices Town Board Members Employee/ Volunteer Resources Emergency Services Police Eden Emergency Squad Fire – Eden Fire – East Eden Departments Assessors Building Courts Dog Control Highway Recreation Town Clerk Boards Assessment Conservation Planning Recreation Advisory Zoning New Member Application Committees Code Review Disaster Preparedness Off-Road Drainage Library Review New Member Application Master Plan Town History Residents Eden Central Schools Eden Corn Festival Eden Library Garbage Management Resources Senior Citizen Services Volunteer Opportunities Businesses Overview Business Directory GIS Mapping Chamber of Commerce Business District Committee Calendar News Contact Contact & Directions Staff Directory Select Page Home Town of Eden Town Board Overview Agendas Minutes Meeting Recordings Legal Notices Town Board Members Employee/ Volunteer Resources Emergency Services Police Eden Emergency Squad Fire – Eden Fire – East Eden Departments Assessors Building Courts Dog Control Highway Recreation Town Clerk Boards Assessment Conservation Planning Recreation Advisory Zoning New Member Application Committees Code Review Disaster Preparedness Off-Road Drainage Library Review New Member Application Master Plan Town History Residents Eden Central Schools Eden Corn Festival Eden Library Garbage Management Resources Senior Citizen Services Volunteer Opportunities Businesses Overview Business Directory GIS Mapping Chamber of Commerce Business District Committee Calendar News Contact Contact & Directions Staff Directory Town of Eden Police Reform Plan by Marlene Grunder | Feb 22, 2021 | Community , Town News The draft of the Town of Eden Police Reform Plan is available for public comments. The plan can be viewed here. If you would like to comment on the plan please email Marlene at marlene@edenny.gov.  The comments will be shared with the committee and the Town Board.  Also, public comments will be heard at the next Town Board meeting on March 10th at 7pm. Contact Information Eden Town Hall 2795 East Church Street Eden, New York 14057 (716) 992-3408 (716) 992-4131 (Fax) Town of Eden, NY © 2021 | Website Powered by SM-Blu Digital " -1459,https://police.crystalmn.gov/r_e_s_i_d_e_n_t/community_development/permits_and_inspections,Resources,Agency-Published Resources,Permits and Inspections - City of Crystal,Links and information about permits and inspections in the City of Crystal.,200,Just a moment...,"[""Permits and Inspections""]",[],"[""Sign up for a city newsletter or notification."", ""City Hall"", ""Regular Hours:""]","[""Monday - Friday""]",[],[],"" -1460,https://www.mass.gov/news/police-arrest-juvenile-for-homicide-in-adams-death,Media Bulletins,Agency-Published Resources,Police Arrest Juvenile For Homicide In Adams Death | Mass.gov,"Authorities arrested a juvenile for homicide in the death of Benjamin Martinez, 34, of Springfield.",200,Mass.gov,"[""Press Release Police Arrest Juvenile For Homicide In Adams Death""]","[""Media Contact for Police Arrest Juvenile For Homicide In Adams Death"", ""Media Contact for Police Arrest Juvenile For Homicide In Adams Death"", ""Berkshire District Attorney's Office"", ""Media Contact for Police Arrest Juvenile For Homicide In Adams Death"", ""Help Us Improve Mass.gov with your feedback""]","[""Andrew McKeever, Director of Communications"", ""Andrew McKeever, Director of Communications"", ""Andrew McKeever, Director of Communications""]","[""Phone"", ""Online"", ""Phone"", ""Online"", ""Phone"", ""Online""]",[],[],"" -1461,https://www.roseville.ca.us/government/departments/police_department/social_services/shop_with_a_cop,Misc Police Activity,Police & Public Interactions,Shop with a cop - City of Roseville,"",200,Just a moment...,"[""City of Roseville""]","[""Shop with a cop""]","[""Roseville Police Department""]",[],[],[],"" -1462,https://alpha.austin.gov/en/police-oversight/2020-06-12-3/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1463,https://www.mass.gov/regulations/515-cmr-500-standards-of-skill-for-special-state-police-officers,Training & Hiring Info,Info About Officers,515 CMR 5.00: Standards of skill for special state police officers | Mass.gov,"515 CMR 5.00 ensures proper standards of skill for special state police officers pursuant to the terms and provisions of M.G.L. c. 22C, § 69. Download a PDF copy of the regulation below.",200,Mass.gov,"[""Regulation 515 CMR 5.00: Standards of skill for special state police officers""]","[""Table of Contents for the law library, 515 CMR"", ""Contact for 515 CMR 5.00: Standards of skill for special state police officers"", ""Table of Contents"", ""Downloads"", ""Contact"", ""Contact for 515 CMR 5.00: Standards of skill for special state police officers"", ""Help Us Improve Mass.gov with your feedback""]","[""Trial Court Law Libraries"", ""Trial Court Law Libraries"", ""Trial Court Law Libraries""]","[""Online"", ""Online"", ""Online""]",[],[],"" -1464,https://www.ci.rohnert-park.ca.us/city_hall/departments/public_safety/police_services/permits___licensing/solicitors_peddlers_permit,Resources,Agency-Published Resources,Solicitors/Peddlers Permit - City of Rohnert Park,"",200,Just a moment...,"[""City of Rohnert Park""]","[""Rohnert Park""]","[""Solicitors/Peddlers Permit""]","[""Solicitors/Peddlers Permit""]",[],[],"" -1465,https://council.seattle.gov/2011/07/14/seattle-city-council-seeking-candidates-for-police-accountability-review-board/,Media Bulletins,Agency-Published Resources,Seattle City Council seeking candidates for police accountability review board - Seattle City Council Blog,"",200,403 Forbidden,"[""Seattle City Council seeking candidates for police accountability review board""]",[],"[""HELPFUL LINKS"", ""Make your voice heard"", ""Councilmembers""]",[],[],[],"" -1466,https://directory.arkansas.gov/agency/arkansas-fire-and-police-pension-review-board/questions/,Poor Data Source,Poor Data Source,State Directory – Arkansas.gov,"",200,State Directory – Arkansas.gov,"[""Flag Status""]","[""Discover More"", ""Discover More"", ""Discover More"", ""Discover More"", ""What can we help you find?"", ""Search the Directories"", ""Flag Status"", """"]","[""Government Resources"", ""Business Resources"", ""Residents Resources"", ""Visiting Resources"", ""State Directory"", ""Agencies"", ""Services"", ""Employees"", ""Your Arkansas.gov"", ""Top Online Services"", ""helpful information""]","[""Was the information on this page helpful?""]",[],[],"" -1467,https://www.mass.gov/doc/pdf-copy-of-the-field-auditor-i-performance-audits-chicopee-job-description-2020-05-06/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -1468,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0031-2/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1469,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/081722blotter.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1470,https://edmonstonmd.gov/prince-georges-county-news-police-chief-town-hall-beautification/,Not Criminal Justice Related,Not Criminal Justice Related,"County News: Police Chief Town Hall, Beautification - Town of Edmonston","Police Chief Town Hall Recording County Executive Angela Alsobrooks and Acting Chief of Police Malik Aziz held a town hall to discuss community policing, police reform, and a new summer crime initiative that is now underway. Residents can watch the town hall below. https://www.youtube.com/watch?v=oyMrHhKoY40 Beautification Survey If you live in…",200,Town of Edmonston,"[""County News: Police Chief Town Hall, Beautification""]","[""Town Hall"", ""Police Department"", ""Town Hall"", ""Police Department"", ""Town Hall"", ""Police Department"", ""Town Hall"", ""Police Department"", ""Police Chief Town Hall Recording"", ""Beautification Survey"", ""Encuesta de embellecimiento del condado"", ""Beautify and Comply!"", ""¡Embellece tu propiedad y llévala al Cumplimiento!"", ""Town of Edmonston"", ""Police Department"", ""Quick Links"", ""Quick Links""]",[],[],[],"[""Town Hall"", ""Office hours"", ""administrative offices"", ""contACT THE POLICE DEPARTMENT""]","" -1471,https://www.dps.nm.gov/blog/2022/03/24/new-mexico-state-police-arrest-fugitive-tennessee-murder-suspects/,Media Bulletins,Agency-Published Resources,New Mexico State Police Arrest Fugitive Tennessee Murder Suspects - NM Department of Public Safety,"",200,Home - NM Department of Public Safety,"[""New Mexico State Police Arrest Fugitive Tennessee Murder Suspects""]",[],"[""Location"", ""Sitemap"", ""Quick Links"", ""Social Media Links""]",[],[],[],"Manage Cookie Consent We use cookies to optimize our website and our service. Functional Functional Always active The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network. Preferences Preferences The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user. Statistics Statistics The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you. Marketing Marketing The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes. Manage options Manage services Manage {vendor_count} vendors Read more about these purposes Accept Deny Preferences Save preferences Preferences Cookie Policy Privacy Statement {title} Manage Cookie Consent We use cookies to optimize our website and our service. Functional Functional Always active The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network. Preferences Preferences The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user. Statistics Statistics The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you. Marketing Marketing The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes. Manage options Manage services Manage {vendor_count} vendors Read more about these purposes Accept Deny Preferences Save preferences Preferences Cookie Policy Privacy Statement {title} Manage Cookie Consent Manage Cookie Consent " -1472,https://www.southamptontownnypolice.gov/943/the-hills---deis-april-2016,Resources,Agency-Published Resources,"The Hills - DEIS-April 2016 | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""The Hills - DEIS-April 2016""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]","[""The Hills - DEIS-April 2016"", ""DEIS Appendices"", ""DEIS Plans""]",[],[],Skip to Main Content -1473,https://www.florenceaz.gov/police-hosting-a-town-hall-meeting-on-december-9th/,Misc Police Activity,Police & Public Interactions,Police Hosting a Town Hall Meeting on December 9th – Town of Florence,"",200,Town of Florence,"[""Police Hosting a Town Hall Meeting on December 9th""]","[""About the Author: Shaun Courtney""]","[""Visitors"", ""Events"", ""Business Information"", ""Services"", ""Town Departments"", ""News Categories"", ""Utilities""]","[""Town Council Work Session March 25, 2024"", ""Historic District Advisory Commission March 27, 2024"", ""Charles Whitlow Rodeo Grounds Advisory Board March 28, 2024"", ""Multi-Generational Center Open House"", ""Town Council Meeting April 1, 2024"", ""Dive into Summer Opportunities at Florence’s Aquatic Center Job Fair"", ""Major Equipment Upgrades Coming to Florence Fitness Center"", ""Florence’s Western Heritage Comes Alive: The 91st Annual Jr. Parada"", ""Share This Story, Choose Your Platform!"", ""Recent Posts""]",[],[],"" -1474,https://www.hayward-ca.gov/discover/news/sep21/police-blotter-august-22-28-2021,Media Bulletins,Agency-Published Resources,"Police Blotter: August 22-28, 2021 | City of Hayward - Official website","STATISTICAL HIGHLIGHTSAugust 22-28, 2021 Weekly Arrests (Includes cite/released):44 Homicide 0Weekly Calls for Service: 2,070 Assault—Great Bodily Injury 2Weekly Reports Taken:194 Burglary— Nonresidential 8Weekly Complaints(against HPD):0 Burglary—Residential 3Weekly Calls Received:5,876 Theft 25This data is subject to change and based on crimes that were reported to have",200,City of Hayward - Official website,"[""Police Blotter: August 22-28, 2021""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form"", ""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment""]",[],"[""STATISTICAL HIGHLIGHTS"", ""August 22-28, 2021"", """", """", """", ""Significant Incidents"", ""Do you need help paying energy bills? You may qualify for federal aid."", ""Hayward Receives Grant for Safe Routes to Schools Infrastructure and Bicycle Incentives"", ""Hayward Celebrates Earth Day at Weekes Park!"", ""Spring 2024 Compost Giveaway"", ""Sustainable Solutions for Celebrating Easter"", ""City Hall and Nonessential Services Closure: Monday, Apr. 01, 2024"", ""Presidential Primary Election: Tuesday, Mar. 5, 2024"", ""Library Closure: February 12 and February 19, 2024."", ""City Hall and Nonessential Services Closures: Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""YOU ARE HERE. SO IS EVERYTHING ELSE."", ""Related News"", ""Police Blotter - February 25-March 2, 2024"", ""Weekly Blotter - February 18-24, 2024"", ""Police Blotter - February 11-17, 2024"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],Skip to main content -1475,http://police.portlandmaine.gov/552/peaks-island-services,Not Criminal Justice Related,Not Criminal Justice Related,"Peaks Island Services | Portland, ME - Official Website",Learn abut services to Peaks Island.,200,"Portland, ME - Official Website | Official Website","[""Peaks Island Services""]",[],[],[],[],[],Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government Departments Public Works Trash & Recycling Peaks Island Services Peaks Island Services Trash Recycling Recycling Resources Holiday Collection Schedule Peaks Island Services Bulky Waste Collection Permit ECARD Riverside Recycling / Transfer Station Yard Waste Trash & Recycling Route Map Commercial Waste Haulers Solid Waste Programs & Services Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Public Works Trash & Recycling Peaks Island Services Peaks Island Services Trash Recycling Recycling Resources Holiday Collection Schedule Peaks Island Services Bulky Waste Collection Permit ECARD Riverside Recycling / Transfer Station Yard Waste Trash & Recycling Route Map Commercial Waste Haulers Solid Waste Programs & Services Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Public Works Trash & Recycling Peaks Island Services Peaks Island Services Trash Recycling Recycling Resources Holiday Collection Schedule Peaks Island Services Bulky Waste Collection Permit ECARD Riverside Recycling / Transfer Station Yard Waste Trash & Recycling Route Map Commercial Waste Haulers Solid Waste Programs & Services Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Public Works Trash & Recycling Peaks Island Services Peaks Island Services Trash Recycling Recycling Resources Holiday Collection Schedule Peaks Island Services Bulky Waste Collection Permit ECARD Riverside Recycling / Transfer Station Yard Waste Trash & Recycling Route Map Commercial Waste Haulers Solid Waste Programs & Services Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Public Works Trash & Recycling Peaks Island Services Peaks Island Services Trash Recycling Recycling Resources Holiday Collection Schedule Peaks Island Services Bulky Waste Collection Permit ECARD Riverside Recycling / Transfer Station Yard Waste Trash & Recycling Route Map Commercial Waste Haulers Solid Waste Programs & Services Home Your Government Departments Public Works Trash & Recycling Peaks Island Services Peaks Island Services Trash Recycling Recycling Resources Holiday Collection Schedule Peaks Island Services Bulky Waste Collection Permit ECARD Riverside Recycling / Transfer Station Yard Waste Trash & Recycling Route Map Commercial Waste Haulers Solid Waste Programs & Services Home Your Government Departments Public Works Trash & Recycling Peaks Island Services Peaks Island Services Trash Recycling Recycling Resources Holiday Collection Schedule Peaks Island Services Bulky Waste Collection Permit ECARD Riverside Recycling / Transfer Station Yard Waste Trash & Recycling Route Map Commercial Waste Haulers Solid Waste Programs & Services Home Your Government Departments Public Works Trash & Recycling Peaks Island Services Peaks Island Services Home Your Government Departments Public Works Trash & Recycling Peaks Island Services Peaks Island Services Home Your Government Departments Public Works Trash & Recycling Peaks Island Services Peaks Island Services Peaks Island Services Trash Recycling Recycling Resources Holiday Collection Schedule Peaks Island Services Bulky Waste Collection Permit ECARD Riverside Recycling / Transfer Station Yard Waste Trash & Recycling Route Map Commercial Waste Haulers Solid Waste Programs & Services Trash Recycling Recycling Resources Holiday Collection Schedule -1476,https://beaumonttexas.gov/beaumont-police-arrest-hike-bike-auto-burglar-6450-folsom/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1477,http://www.ryepolice.us/logs/police-logs-07-27-2022-08-02-2022,Daily Activity Logs,Info About Officers,Rye Police Department Police Logs 07/27/2022-08/02/2022 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs 07/27/2022-08/02/2022""]","[""Police Logs 07/27/2022-08/02/2022""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -1478,https://alpha.austin.gov/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/office-of-police-oversight-official-reports/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1479,https://coloradosprings.gov/police-department/page/vin-verification-services,Resources,Agency-Published Resources,VIN Verification Services | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""VIN Verification Services""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]","[""VIN Verification Services""]",[],"[""REPORT ONLINE""]",[],"" -1480,https://hollister.ca.gov/government/city-departments/police/join-our-team/,Training & Hiring Info,Info About Officers,"Join Our Team – City of Hollister, California","",200,"City of Hollister, California",[],[],"[""Follow Us on..."", ""Join Our Team"", ""We are Hiring"", ""Follow Us on....""]",[],[],[],"Skip to content Follow Us on... Home Residents 2024 City of Hollister Resource Guide Community Resources Council District Map Downtown Events Housing Element Newsletter: 2022 Volume 1 Newsletter: 2022 Volume 2 Nextdoor State Route 156 Improvement Project Business Starting a Business Business License Application Business Resources Cannabis Affairs Green Your Business Government City Council City Council Agenda & Minutes Commissions City Departments Airport Administrative Services Finance Human Resources City Attorney City Clerk Elections City Council City Manager Development Services Building Cannabis Affairs General Plan Housing Housing Element Planning Successor Agency Fire Parks and Recreation Parks Police Animal Control Code Enforcement Public Works Engineering Streets Stormwater Management Wastewater Services Water Services Fire Department Parks and Recreation Police Department Intergrated Waste Management Request Public Records Transparency 2023-24 Adopted Budget Financial Reports Municipal Code Search Request Public Records Services Hollister Recreation Online Registration Pay Your Utility Bill Start / Stop Water Service Utility Forms City Maps Open Bids and RFPs San Benito County GIS Mapping How Do I… View the Draft 2040 General Plan Apply for a Temorary RV Parking Permit Contact the City Do Business With the City File a Business License Application File a Police Online Incident Report Register with Hollister Recreation Look At A Council District Map Pay My Utility Bill Online Report a Crime Anonymously Request Public Records Search the Municipal Code Start / Stop Water Service View City Council Agendas View the Friendly Workplace Manual for Public Officials Contact Employment About Hollister Welcome to Hollister Our Story Food & Drink Historic Hollister Outdoors Pinnacles National Park Menu Search for: Police Code Enforcement Department News & Events Press Releases FAQ Join Our Team Volunteer PAL – Police Activities League Incident Reports Online Incident Reporting Anonymous Reporting Forms Crime Statistics / Crime Blotter Social Networking Gang Task Force Crime Prevention Law Enforcement Cadets HPD History Comments Join Our Team The Hollister Police Department is continuously seeking qualified individuals for our team. Current Recruitments are: -Police Officer Trainee - Apply for Police Officer Trainee Position Lateral / Academy Graduate Officer - Apply for Lateral / Academy Graduate Officer Position Apply Online! See all Current City of Hollister Open Position Recruitments . Location 395 Apollo Way Hollister, CA 95023 (831) 636-4330 Non-Emergency (831) 636-4331 Fax (831) 636-4339 Emergency 9-1-1 We are Hiring More information here CodeRED is our new Emergency Notification system for Santa Cruz and San Benito counties. Click on the logo and register your cell phone number and email for instant notifications of Emergencies within San Benito and Santa Cruz Counties. Follow Us on.... City of Hollister, California, Copyright 2024 Follow Us on... Follow Us on... " -1481,https://www.mass.gov/doc/fitzgibbon-daniel-v-boston-police-department-related-superior-court-decision-32113/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -1482,https://delcopa.gov/pdf/2021budget.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -1484,https://www.ci.san-ramon.ca.us/our_city/departments_and_divisions/police/srpd-downloads,Poor Data Source,Poor Data Source,SRPD Downloads - City of San Ramon,"",200,Just a moment...,"[""SRPD Downloads""]","[""Contact Us"", ""Useful Links""]",[],[],[],[],"" -1485,https://www.antioch.il.gov/event/police-fire-commission-special-meeting-4/,Poor Data Source,Poor Data Source,"Police & Fire Commission Special Meeting - Antioch, IL","",200,"Home - Antioch, IL","[""Police & Fire Commission Special Meeting""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -1486,http://www.longbeach.gov/police/press-releases/murder-investigation---2300-block-of-elm-avenue/,Media Bulletins,Agency-Published Resources,MURDER INVESTIGATION - 2300 BLOCK OF ELM AVENUE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/31/2019 FOR IMMEDIATE RELEASE Press Release # Subject: MURDER INVESTIGATION – 2300 BLOCK OF ELM AVENUE Contact: Media Relations Detail (562) 570-5273 LBPDMediaRelations@longbeach.gov On Thursday, May 30, 2019, at approximately 9:45 p.m., officers were dispatched to the 2300 block of Elm Avenue for an assault with a deadly weapon call, which resulted in the death of a male adult. Upon arrival, officers located an adult male victim laying in the street with a gunshot wound to his upper torso. Responding officers performed life-saving measures and requested the assistance of Long Beach Fire Department paramedics, who determined the victim deceased at the scene. The victim has been identified as 39-year-old Antonio Macias of Long Beach. A description of the suspect(s) and the motive for the shooting is unknown at this time. Any relationship between the victim and suspect(s) is not known. Detectives are working diligently to gather additional information, which is currently being investigated as possibly gang-related. We urge anyone with any information to contact Long Beach Police Homicide Detectives Don Collier or Mark Mattia at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1487,https://dps.iowa.gov/former-clarksville-police-officer-arrested,Media Bulletins,Agency-Published Resources,Former Clarksville Police Officer Arrested | Iowa Department of Public Safety,"September 1, 2022 Butler County, Iowa - On March 4, 2022, a minor under the age of 18 reported to the Butler County Sheriff’s Office that Clarksville police officer Mike Tobin had showed the minor sexually explicit images and videos that were evidence in a pending criminal case.  Those images included nude images of minors.   Tobin’s employment with the City of Clarksville was discontinued on March 5th, 2022. The Iowa Division of Criminal Investigation was asked to assist with the investigation.",200,Iowa Department of Public Safety | Iowa Department of Public Safety,"[""Iowa Department of Public Safety"", ""Former Clarksville Police Officer Arrested""]",[],[],[],[],[],"Skip to main content Iowa Department of Public Safety Former Clarksville Police Officer Arrested Mike Krapfl Special Agent in Charge 563.599.4239 krapfl@dps.state.ia.us September 1, 2022 Butler County, Iowa - On March 4, 2022, a minor under the age of 18 reported to the Butler County Sheriff’s Office that Clarksville police officer Mike Tobin had showed the minor sexually explicit images and videos that were evidence in a pending criminal case.  Those images included nude images of minors. Tobin’s employment with the City of Clarksville was discontinued on March 5th, 2022. The Iowa Division of Criminal Investigation was asked to assist with the investigation. On September 1, 2022, Tobin was arrested and charged with the following offenses: two (2) counts of sexual exploitation by a minor (class C felony); one (1) count of sexual exploitation of a minor (class D felony; and eight (8) counts of sexual exploitation of a minor (aggravated misdemeanor).   The results of the investigation have been forwarded to the Butler County Attorney’s Office for review. ABOUT THE IOWA DEPARTMENT OF PUBLIC SAFETY The Iowa Department of Public Safety (DPS) is the largest law enforcement agency in the state. It includes six divisions and several bureaus, all working together with local, state and federal government agencies and the private sector, to keep Iowa a safe place by following our core values: leadership, integrity, professionalism, courtesy, service and protection. Divisions within the Iowa DPS: Iowa Division of Criminal Investigation, Iowa Division of Narcotics Enforcement, Iowa State Patrol, Iowa State Fire Marshal Division, Iowa Division of Intelligence and Fusion Center, and Administrative Services Division. The Department of Public Safety is led by the Commissioner who is appointed by the Governor. Iowa Department of Public Safety 215 E 7th St Des Moines IA 50319 https://dps.iowa.gov " -1488,http://www.longbeach.gov/police/press-releases/dui-checkpoint-1-/,Media Bulletins,Agency-Published Resources,DUI CHECKPOINT(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1489,https://alpha.austin.gov/es/police-oversight/formal-complaint-de-escalation-of-potential-force-encounters-and-other-policy-violations-3/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1490,https://www.southamptontownnypolice.gov/faq.aspx?qid=554,Resources,Agency-Published Resources,FAQs • How do I upload a completed documents?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Online Service Assistance""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1491,https://www.southamptontownnypolice.gov/faq.aspx?qid=78,Resources,Agency-Published Resources,FAQs • A house in my neighborhood burned down. How long do I,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Public Safety - Code Enforcement""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1492,http://www.longbeach.gov/police/press-releases/charges-filed-against-robbery-suspects/,Media Bulletins,Agency-Published Resources,CHARGES FILED AGAINST ROBBERY SUSPECTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1493,http://www.longbeach.gov/police/press-releases/improving-motorcycle-safety-aim-of-l-b-p-d--operation-2-/,Media Bulletins,Agency-Published Resources,Improving Motorcycle Safety Aim of L.B.P.D. Operation(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 8/12/2015 FOR IMMEDIATE RELEASE Press Release # Subject: IMPROVING MOTORCYCLE SAFETY AIM OF L.B.P.D. OPERATION Careless Motorists as Well as Riders Get Special Scrutiny ... Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department will be conducting Specialized Motorcycle Safety Enforcement Operations on Saturday, August 15th and Sunday, August 16th, in an effort to lower deaths and injuries. Extra officers will be on duty patrolling areas frequented by motorcyclists and where motorcycle crashes occur. Officers will be looking for violations made by drivers and riders alike that can lead to motorcycle crashes. They will be cracking down on both those operating regular vehicles and motorcycles who are under the influence of drugs or alcohol, speeding, making illegal turns, or any other dangerous violation. Motorcycle fatalities saw a phenomenal drop of 37 percent from 2008 to 2010, but then rose 23 percent by 2012. Operations like this are aimed at curbing any more rises in motorcycle deaths and sending the numbers back downward. Over the course of the past two years, motorcycle involved collisions have resulted in 12 fatalities and 184 injuries in the City of Long Beach. California collision data reveals that primary causes of motorcycle-involved crashes include speeding, unsafe turning and impairment due to alcohol and other drugs by both riders and drivers alike. Safety tips for riders – See and Be Seen: •  Ride with lights on during daylight hours •  Use your lane position to increase visibility; change lanes only when there is ample room •  Match your speed to surrounding traffic •  Always wear a DOT compliant helmet and brightly colored, protective clothing Safety tips for drivers – Share the Road: •  Look twice for motorcyclists, especially when entering the roadway, turning or changing lanes •  Motorcyclist are allowed in HOV lanes unless prohibited by signage Riders are urged to get training through the California Motorcyclist Safety Program . Information and training locations are available at www.CA-msp.org or 1-877 RIDE 411 (1-877-743-3411). Funding for this program is provided by a grant from the California Office of Traffic Safety through the National Highway Traffic Safety Administration. The message to all drivers and motorcyclists is: share in the responsibility and do your part by safely “sharing the road.” This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1494,https://bouldercolorado.gov/events/police-oversight-panel-community-engagement-committee-meeting-0,Misc Police Activity,Police & Public Interactions,Police Oversight Panel - Community Engagement Committee Meeting | City of Boulder,"",200,Home | City of Boulder,"[""Police Oversight Panel - Community Engagement Committee Meeting"", ""Police Oversight Panel Meetings""]","[""Breadcrumb"", ""Details"", ""Meeting Details"", ""More Resources""]","[""Police Oversight Panel: Co-Chairs/IPM Meeting"", ""Police Oversight Panel: BPOP/Interim Chief of Police Meeting"", ""Police Oversight Panel: Subcommittee Community Engagement & Communications Meeting"", ""Police Oversight Panel: All Panel Meeting"", ""Police Oversight Panel: Co-Chairs/IPM Meeting"", ""Police Oversight Panel: Subcommittee Governance Meeting""]",[],[],[],"Calendar Jobs Contact Us Search English 繁體中文 Français Deutsch 한국어 Русский Español नेपाली en Locations Services Projects Government News Toggle Menu City of Boulder Locations Services Projects Government News Calendar Jobs Contact Us Search Breadcrumb Home Events Police Oversight Panel - Community Engagement Committee Meeting Details Date Thursday, June 2, 2022 Time 6:30 PM - 7:30 PM Locations Virtual Police Oversight Panel Meetings Boulder’s Police Oversight Panel meets on the second Thursday of every month. Add to Calendar Police Oversight Panel - Community Engagement Committee Meeting America/Denver

Boulder, CO
-United States

MM/DD/YYYY CONFIRMED OPAQUE Meeting Details https://tinyurl.com/2c8ntnc6 Or join by phone: (301) 715-8592 Webinar ID: 856 8045 2100 More Resources For panel-related inquiries, please contact Joseph Lipari at 720-376-3980 or liparij@bouldercolorado.gov . About the Police Oversight Panel Meeting Materials Archive Police Oversight Panel: Co-Chairs/IPM Meeting Virtual Fri Mar 29 2024 Police Oversight Panel: BPOP/Interim Chief of Police Meeting Virtual Mon Apr 1 2024 Police Oversight Panel: Subcommittee Community Engagement & Communications Meeting Virtual Thu Apr 4 2024 Police Oversight Panel: All Panel Meeting Penfield Tate II Municipal Building Virtual Wed Apr 10 2024 Police Oversight Panel: Co-Chairs/IPM Meeting Virtual Fri Apr 12 2024 Police Oversight Panel: Subcommittee Governance Meeting Virtual Tue Apr 16 2024 See All Events in Series Calendar Locations Services News Government Accessibility 1777 Broadway Boulder , CO 80302 Contact Us YouTube Twitter Facebook Instagram LinkedIn Nextdoor © 2024 City of Boulder. All Rights Reserved. Privacy Policy Calendar Jobs Contact Us Search English 繁體中文 Français Deutsch 한국어 Русский Español नेपाली en Locations Services Projects Government News Toggle Menu City of Boulder Locations Services Projects Government News Calendar Jobs Contact Us Search Breadcrumb Home Events Police Oversight Panel - Community Engagement Committee Meeting Details Date Thursday, June 2, 2022 Time 6:30 PM - 7:30 PM Locations Virtual Police Oversight Panel Meetings Boulder’s Police Oversight Panel meets on the second Thursday of every month. Add to Calendar Police Oversight Panel - Community Engagement Committee Meeting America/Denver

Boulder, CO
-United States

MM/DD/YYYY CONFIRMED OPAQUE Meeting Details https://tinyurl.com/2c8ntnc6 Or join by phone: (301) 715-8592 Webinar ID: 856 8045 2100 More Resources For panel-related inquiries, please contact Joseph Lipari at 720-376-3980 or liparij@bouldercolorado.gov . About the Police Oversight Panel Meeting Materials Archive Police Oversight Panel: Co-Chairs/IPM Meeting Virtual Fri Mar 29 2024 Police Oversight Panel: BPOP/Interim Chief of Police Meeting Virtual Mon Apr 1 2024 Police Oversight Panel: Subcommittee Community Engagement & Communications Meeting Virtual Thu Apr 4 2024 Police Oversight Panel: All Panel Meeting Penfield Tate II Municipal Building Virtual Wed Apr 10 2024 Police Oversight Panel: Co-Chairs/IPM Meeting Virtual Fri Apr 12 2024 Police Oversight Panel: Subcommittee Governance Meeting Virtual Tue Apr 16 2024 See All Events in Series Calendar Locations Services News Government Accessibility 1777 Broadway Boulder , CO 80302 Contact Us YouTube Twitter Facebook Instagram LinkedIn Nextdoor © 2024 City of Boulder. All Rights Reserved. Privacy Policy " -1495,http://police.portlandmaine.gov/650/needle-exchange-program,Resources,Agency-Published Resources,"Needle Exchange Program | Portland, ME - Official Website",Discover the harm reduction services offered by Portland Public Health including our needle exchange program. ,200,"Portland, ME - Official Website | Official Website","[""Needle Exchange Program""]",[],[],[],[],[],Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Needle Exchange Program Needle Exchange Program Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Needle Exchange Program Needle Exchange Program Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Needle Exchange Program Needle Exchange Program Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Needle Exchange Program Needle Exchange Program Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Needle Exchange Program Needle Exchange Program Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Needle Exchange Program Needle Exchange Program Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Needle Exchange Program Needle Exchange Program Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Needle Exchange Program Needle Exchange Program Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Needle Exchange Program Needle Exchange Program Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Needle Exchange Program Needle Exchange Program Needle Exchange Program Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® -1496,https://delcopa.gov/departments/parks/pdf/redwoodmonthlyschedule.pdf,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1497,https://delcopa.gov/publicrelations/releases/2018/hopefortheholidays.html,Media Bulletins,Agency-Published Resources,"Heroin Task Force connects residents with treatment this holiday season - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Heroin Task Force connects residents with treatment this holiday season""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -1498,https://detroitmi.gov/es/departments/departamento-de-policia/detroit-police-department-shield-program/recursos-de-socios-comunitarios,Poor Data Source,Poor Data Source,Recursos de socios comunitarios | City of Detroit,"¿Por qué unirse a SHIELD? Con el crecimiento de una ciudad próspera y la promesa de un mayor comercio en Detroit, surgen mayores preocupaciones de seguridad para las fuerzas del orden público, los dueños de negocios, los centros de culto y los ciudadanos por igual. Los sectores público y privado son más fuertes trabajando juntos que cada uno solo. Esta asociación es la piedra angular en la defensa de la Ciudad contra el terrorismo. DPD Shield es un destino central para obtener información crítica e involucrar a los recursos del departamento de policía. DPD Shield también busca información de nuestra comunidad y socios del sector privado para ayudar en nuestros esfuerzos para mantener la Ciudad Lo que pedimos El programa DPD SHIELD es una vía de comunicación de dos vías. La clave del éxito es que la información fluya en dos direcciones. Los socios de la comunidad sirven como los ojos y los oídos del DPD SHIELD y sirven para impactar directamente los esfuerzos para prevenir el crimen y los actos de terrorismo al informar sobre comportamientos sospechosos lo antes posible. Además, reconocemos que nuestros socios comunitarios están especialmente calificados para ayudar al personal del Departamento de Policía de Detroit durante un incidente. Sabes lo que pertenece y lo que está fuera de lugar. Compartiendo su perspectiva y trabajando juntos, estamos mejor preparados para enfrentar los desafíos más difíciles.",200,City of Detroit | Opportunity Rising,"[""Recursos de socios comunitarios""]","[""Top Links"", ""Site Menu"", ""Preguntas frecuentes sobre el escudo de la policía de Detroit""]",[],"[""CONTACTOS"", ""MENÚ DE DEPARTAMENTO""]",[],[],"" -1499,https://www.normanok.gov/public-safety/police-department/divisions/professional-standards,Complaints & Misconduct,Info About Officers,We've got some trouble | 404 - Resource not found,"",200,"Welcome to the City of Norman, OK | City of Norman, OK","[""Resource not found Error 404""]",[],[],[],[],[],Resource not found Error 404 The requested resource could not be found. -1500,http://www.longbeach.gov/police/press-releases/traffic-fatality7/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/17/2018 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY - LOS COYOTES DIAGONAL AND OUTER TRAFFIC CIRCLE Contact: Media Relations Detail (562) 570-5273 On March 16, 2018 at approximately 6:55 p.m., officers from the Long Beach Police Department were dispatched to the area of Los Coyotes Diagonal and Outer Traffic Circle regarding an injury traffic collision.  Early reports indicated a vehicle struck a tree and split in two. When officers arrived, they found the driver had been ejected from the vehicle and was lying in the roadway on eastbound Los Coyotes Diagonal.  The passenger was still in the vehicle, but was pronounced deceased at the scene by Long Beach Fire personnel. The preliminary investigation revealed that a 54-year-old male resident of Long Beach was driving a 2017 Maserati Quattroporte at a high rate of speed.  The driver of the vehicle turned left from southbound Outer Traffic Circle to eastbound Los Coyotes Diagonal.  The driver lost control of the vehicle while completing the turn and collided with a tree, which sheared the vehicle in half. The vehicle came to rest in front of 4600 Los Coyotes Diagonal. The driver of the vehicle was transported to a local area hospital where he remains in critical condition. The decedent passenger was identified as a 42-year-old male from Buena Park.  His identity is being withheld pending notification of the next of kin. Both occupants were wearing their seatbelts.  The driver had a valid license.  Alcohol is being investigated as a factor in the collision. Anyone with information regarding the collision are asked to contact Detective S. Fox of the Long Beach Police Department Collision Investigation Detail at (562) 570-7355. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1501,https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/contribute-to-police-oversight/file-a-complaint-about-an-austin-police-officer/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1502,https://pittsburghpa.gov/police/police-administration,Poor Data Source,Poor Data Source,Administration Branch | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""Administration Branch"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Branches"", ""About Police"", ""Community Engagement Office"", ""Police Zones"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -1503,http://www.longbeach.gov/police/press-releases/dui-enforcement-operations-planned-this-weekend-3-/,Media Bulletins,Agency-Published Resources,DUI ENFORCEMENT OPERATIONS PLANNED THIS WEEKEND(3),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/30/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: DUI ENFORCEMENT OPERATIONS PLANNED THIS WEEKEND Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department’s DUI Enforcement Team will deploy this weekend to stop and arrest alcohol and drug-impaired drivers in the Department’s ongoing traffic safety campaign. DUI Saturation Patrols will deploy on Saturday, November 1, 2014, between the hours of 7:00 p.m. and 3:00 a.m., in areas with high frequencies of DUI collisions and/or arrests. After falling dramatically for five straight years, figures for 2012 show an increase to 802 deaths in California because someone failed to designate a sober driver. Over the course of the past three years in Long Beach, DUI collisions have claimed nine lives and resulted in 315 injury crashes, harming 420 of our friends and neighbors. Driving under the influence can impact the economy in addition to the pain and suffering of those immediately affected. Conservatively, a fatality has a $1.4 million impact, an injury $70,000, and a crash that only damages property averages nearly $9000. Funding for this program is from California Office of Traffic Safety grant, through the National Highway Traffic Safety Administration. Report Drunk Drivers, Call 9-1-1! This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1504,https://www.mass.gov/event/2022-lowell-police-open-house-2022-01-10t170000-0500-2022-01-10t190000-0500,Poor Data Source,Poor Data Source,2022 Lowell Police Open House | Mass.gov,"",200,Mass.gov,"[""2022 Lowell Police Open House""]","[""Overview of 2022 Lowell Police Open House"", ""Participating Organizations"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[],"" -1505,https://www.lynchburgvapolice.gov/wp-content/uploads/2022/10/suspect-express-lane-76-gas-10.27.2022-e1666893965762.png,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1506,https://southcoffeyvilleok.gov/police-department/contact/,Contact Info & Agency Meta,Info About Agencies,Contact Police Department -,"",200,403 Forbidden,[],"[""Contact Police Department"", ""South Coffeyville Police Department""]","[""Contact Town of South Coffeyville"", """"]",[],"[""Call Us"", ""Email us at"", ""Visit the Police Station"", ""Join the SCPD"", ""Donate to SCPD"", ""Send Us Mail""]",[],"Town Alert ***************Boil Water Alert************* click here for more information Town Alert ***************Boil Water Alert************* click here for more information Town Alert ***************Boil Water Alert************* click here for more information Town Alert ***************Boil Water Alert************* click here for more information 2017 Water Report Town News Town Calendar Town Directory Town Help Desk Town Jobs Council Agendas & Minutes South Coffeyville Public Schools OK Union Public Schools OK Helpline BILL PAY Pay Utilities Pay Citations Pay Property Taxes Popular Resources My Town News Town History Project Government Town Council Town Clerk Court Clerk Deputy Treasurer Agendas & Minutes Ordinances Voting Public Meetings Town Utilities City Court Maintenance Dept. Police Department Fire Department Animal Control Permits & Licenses Business Business Directory Community Data Permits Relocate Here South Town Center Contact Town HOME Popular Resources Town Government Town Utilities Maintenance Dept. Police Department City Court Business News Town Help Desk Contact Town Contact Police Department Pay Tickets Meet Our Officers Top Resources Explorer Cadets Contact SCPD Pay Tickets Meet Our Officers Top Resources Explorer Cadets Contact SCPD Pay Tickets Meet Our Officers Top Resources Explorer Cadets Contact SCPD South Coffeyville Police Department Call Us Non-Emergencies: (918) 255-6513 Emergencies: 9-1-1 Email us at police@southcoffeyvilleok.gov Visit the Police Station 419 Willow Street, South Coffeyville, OK 74072 Join the SCPD Job Applications can be picked up at City hall. Donate to SCPD Donations can be made to the Police Department at City Hall. Just write Police in the memo box. Send Us Mail P.O. Box 100 South Coffeyville, OK 74072 Contact Town of South Coffeyville PO Box 100 419 Willow Street South Coffeyville, OK 74072 City Hall: (918) 255-6045 Fax: (918) 255-6430 Directions to City Hall Town Directory Economic Development Pay Utility Bill FEMA Disaster Assistance Section 508 Accessibility Privacy Policy Legal Disclaimer 2017 Water Report Town News Town Calendar Town Directory Town Help Desk Town Jobs Council Agendas & Minutes South Coffeyville Public Schools OK Union Public Schools OK Helpline BILL PAY Pay Utilities Pay Citations Pay Property Taxes Popular Resources My Town News Town History Project Government Town Council Town Clerk Court Clerk Deputy Treasurer Agendas & Minutes Ordinances Voting Public Meetings Town Utilities City Court Maintenance Dept. Police Department Fire Department Animal Control Permits & Licenses Business Business Directory Community Data Permits Relocate Here South Town Center Contact Town 2017 Water Report Town News Town Calendar Town Directory Town Help Desk Town Jobs Council Agendas & Minutes South Coffeyville Public Schools OK Union Public Schools OK Helpline BILL PAY Pay Utilities Pay Citations Pay Property Taxes Popular Resources My Town News Town History Project Government Town Council Town Clerk Court Clerk Deputy Treasurer Agendas & Minutes Ordinances Voting Public Meetings Town Utilities City Court Maintenance Dept. Police Department Fire Department Animal Control Permits & Licenses Business Business Directory Community Data Permits Relocate Here South Town Center Contact Town " -1507,https://www.pleasantprairiewi.gov/departments/police/retail_theft_reporting,Resources,Agency-Published Resources,Retail Theft Reporting - Village of Pleasant Prairie,"",200,Just a moment...,[],"[""Retail Theft Reporting""]","[""Follow Us on Social Media""]","[""PLEASANT PRAIRIE POLICE DEPARTMENT RETAIL THEFT REPORTING PROCEDURE"", ""INSTRUCTIONS FOR STORE EMPLOYEES""]","[""Before reporting a Retail Theft, please follow below for proper reporting procedures:"", ""• Contact the Pleasant Prairie Police Department immediately if:"", ""• Complete a Retail Theft Packet if any of the below situations apply:"", ""• Do not call if you do not wish to prosecute or can’t articulate what was taken."", """", ""Please call or deliver the completed packet within 7 days of the theft:""]",[],"" -1508,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/042622summary.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1509,https://delcopa.gov/council/2020minutes/05202020minutes.pdf,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1510,https://www.sandiego.gov/department-document/mayor-glorias-appointment-citizens-advisory-board-policecommunity-relations,Media Bulletins,Agency-Published Resources,Mayor Gloria's Appointment to the Citizen's Advisory Board on Police/Community Relations | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Mayor Gloria's Appointment to the Citizen's Advisory Board on Police/Community Relations"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -1511,https://www.mass.gov/doc/chicopee-district-court/download,Misc Police Activity,Police & Public Interactions,"","",200,"","","","","","","","" -1512,https://delcopa.gov/controller/pdf/2022/faq-changetothecustodialbankfordelawarecountyretirementaccounts.pdf,Resources,Agency-Published Resources,"","",200,"","","","","","","","" -1513,https://www.troyny.gov/mayor-madden-announces-the-promotion-of-steven-barker-to-the-rank-of-assistant-chief-of-police/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1514,http://www.longbeach.gov/police/press-releases/traffic-fatality-5-/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY(5),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/17/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Thursday, July 17, 2014, at approximately 9:45 p.m., Long Beach Police responded to the area of Ocean Boulevard and 8th Place regarding an injury traffic collision, which resulted in the death of two female adults. When officers arrived, they discovered an unconscious motorcyclist trapped underneath a Hyundai Sonata, and an unconscious pedestrian down in the lanes of traffic. Long Beach Fire and paramedics responded to the scene and were able to free the motorcyclist from the underneath the vehicle. The motorcyclist sustained traumatic injuries to the head and body and was pronounced deceased at the scene. The motorcyclist is only being identified as a 33-year-old adult female from Long Beach, pending notification of next of kin. The pedestrian, who was located in the number two lane of westbound Ocean Boulevard, was found to have sustained traumatic head injuries. She was transported to a local hospital and was pronounced deceased shortly thereafter. She is only being identified as a 25-year-old female resident of Long Beach, also pending notification of next of kin. The preliminary investigation determined that the pedestrian, who was crossing southbound Falcon Avenue at Ocean Boulevard and inside the marked crosswalk, was struck by the motorcyclist who failed to yield, as she was travelling westbound on Ocean Boulevard in the number one lane. After the motorcylist struck the pedestrian, she lost control of her motorcycle, a 2003 Ducatti GRX, she fell to the ground rolling southwest across both eastbound lanes. Her motorcycle also continued to tumble west down Ocean Boulevard in the eastbound lanes. As the motorcylist slid into the number two eastbound lane, she was struck by a 2014 Hyundai Sonata which came to rest on top of her, driven by a 37-year-old Long Beach resident. According to witness statements, the motorcyclist had swerved around a vehicle that had stopped for three pedestrians in the crosswalk at Falcon Avenue, just before the collision occurred. The motorcyclist did have a valid Arizona license, but did not have a valid motorcycle endorsement on her license. Anyone with additional information regarding this incident is asked to call Long Beach Police Collision Investigation Detective Steve Fox at (562) 570-7355. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1515,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/january-16-activity-report/,Incident Reports,Police & Public Interactions,January 16 Activity Report - Town of Cheswold,"",200,"Home - Town of Cheswold - Kent County, Delaware","[""Cheswold""]","[""Delaware"", ""January 16 Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[],"Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Cheswold Delaware Listen January 16 Activity Report January 16 Activity Report Cheswold Delaware Listen January 16 Activity Report January 16 Activity Report Listen January 16 Activity Report January 16 Activity Report Listen January 16 Activity Report January 16 Activity Report Listen January 16 Activity Report January 16 Activity Report Listen Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form " -1516,https://delcopa.gov/courts/judges/kelly.html,Personnel Records,Info About Officers,President Judge Kevin F. Kelly - Delaware County Court of Common Pleas,"",200,"Delaware County, Pennsylvania","[""Judge Kevin F. Kelly""]",[],"[""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[],"Menu A to Z Court Departments Local Rules FAQ Government Center Judge Kevin F. Kelly Home / Court Departments / Board of Judges / Judge Kevin F. Kelly Judge Kevin F. Kelly was appointed to the court by Governor Tom Ridge and swore his oath of judicial office on June 30, 2000. Judge Kelly was elected to a full ten-year term by the voters of Delaware County in November 2001. The electorate in 2011 voted to retain Judge Kelly for a second ten-year term. In 2021, Judge Kelly was once again for a third ten-year term retained by the Delaware County voters. Judge Kelly's public service career began in 1985 as a member of the Delaware County District Attorney's Office. An experienced prosecutor, Judge Kelly served as a staff or the supervising attorney in each of that office's divisions and units. During his tenure with the District Attorney's Office, Judge Kelly rose to the position of Deputy District Attorney and received numerous awards of professional recognition, including being named Outstanding Prosecutor of the Year by the Pennsylvania Criminal Investigators. Prior to leaving the District Attorney's Office to join the bench, he was the Chief of the office's Juvenile Delinquency and Pre-trial Divisions, as well as its Drug Enforcement Unit. While with the District Attorney's Office, Judge Kelly was regularly active in criminal justice education having been an instructor for a number of years at the Delaware County Municipal Police Academy and the mandated yearly continuing legal education of municipal police officers. He as well appeared as a lecturer at legal seminars and meetings sponsored by various professional associations and community groups. Judge Kelly on joining the bench first served in the family courts and then for several years as the county's juvenile judge. In 2009, Judge Kelly became a member of the criminal section and was also the criminal courts’ liaison judge from 2013 through June 2017. In June 2017, Judge Kelly was unanimously elected by his fellow judges to serve the five-year term as Delaware County's president judge. Judge Kelly in June 2022 returned to the criminal bench and is again the criminal courts’ liaison judge. A life-long resident of Delaware County, Judge Kelly is a graduate of Haverford High School, Villanova University and Villanova University School of Law. Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 delcocourts@co.delaware.pa.us Courts Quick Links Juror eResponse PA Law Help Self Help - Custody Self Help - Divorce Juror Handbook Language Access Family Court Self Represented Litigant Guide Government Center Quick Links Marriage Licenses Crisis Connection Certified Recovery Specialist Public Access Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center " -1517,https://www.mass.gov/doc/the-challenging-investment-climate-how-to-cope/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1518,http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested-and-charged-2-/,Media Bulletins,Agency-Published Resources,ROBBERY SUSPECT ARRESTED AND CHARGED(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/16/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: ROBBERY SUSPECT ARRESTED AND CHARGED Contact: Media Relations Detail (562) 570-5273 Felony charges were filed this week against a man in connection with multiple robberies involving street vendors. Most of the incidents occurred in the 6900 block of Paramount Boulevard, between September 11, 2016 and February 2, 2017, during the hours of 1:00 p.m. and 3:30 p.m. A male suspect armed with a handgun would approach a fruit vendor, demanded money, and flee before officers arrived. Fortunately, none of the victims were injured during the incidents. Through the concerted efforts of Patrol Officers Brearley and Otto of the North Division Violent Crime Impact Team and Robbery Detectives, a suspect was able to be identified. On February 14, 2017, detectives arrested 26-year-old Miguel Rodriguez of Downey for his involvement in the street robberies. On February 16, 2017, detectives presented the case for filing consideration to the Los Angeles County District Attorney’s Office who filed three felony counts of robbery against the Miguel Rodriguez. He is currently being held in Long Beach City Jail with bail set at $110,000. The investigation remains ongoing. Detectives urge any fruit vendor who was a victim of a robbery but has yet to report it, to call Robbery Detective Parkhill at (562) 570-5535. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1519,https://twp.northfield.il.us/coffee-with-a-cop-northbrook/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1520,https://delcopa.gov/publicrelations/releases/2021/pdf/delcoerainpersonflyer.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1521,https://www.naperville.il.us/services/naperville-police-department/programs-and-services/false-alarm-reduction-program/,Resources,Agency-Published Resources,False Alarm Reduction Program | The City of Naperville,Security system false alarms are the Naperville Police Department's third most frequent call for service. This program seeks to reduce the frequency of such calls.,200,Home | The City of Naperville,"[""False Alarm Reduction Program""]","[""Programs and Services"", ""Alarm Statistics for 2020"", ""What is a false alarm?"", ""Are false alarms a problem in Naperville?"", ""What happens when your burglar alarm system is activated?"", ""Before you activate your alarm system:"", ""What are the most frequent causes of false alarms?"", ""What are the consequences of having a police response for an activated false burglar alarm?"", ""Do I need a permit or to register my burglary alarm system?"", ""Contact"", ""Naperville Police Department""]","[""Explore""]","[""Julie Smith""]","[""Helping Residents Build a Better Community"", ""Resources for Doing Business in Naperville""]",[],"Menu Search Menu Search Search Main Menu Navigation About Naperville + An Award-Winning Community Demographics and Key Facts Education Historic Preservation in Naperville Projects in Naperville Transportation and Parking Townships Government + Boards and Commissions City Leadership Team City Finances Annual Budget and Financial Reports Purchasing and Bids Taxes and Financial Forms Utility Services and Billing General Billing Water Street TIF District Coronavirus Resources Diversity, Equity and Inclusion A Community of Belonging DEI Defined DEI Timeline Youth Involvement Embracing Community Environmental Sustainability in Naperville Grants Meetings and Agendas Legislative Priorities Meeting Room Reservations Meet Your City Council Mayor Scott A. Wehrli Councilman Ian Holzhauer Councilman Patrick Kelly Councilman Paul Leong Councilwoman Allison Longenbaugh Councilman Josh McBroom Councilwoman Jennifer Bruzan Taylor Councilman Dr. Benjamin M. White Councilman Nate Wilson Municipal Center Municipal Code Open Data Proclamations Strategic Plan Task Forces Voting and Voter Registration Services + Brush, Leaf & Yard Waste Curbside Bulk Brush Collection Leaf Collection Yard Waste Collection Electric Utility Your Electric Service Electrical Safety Powering Our Community for the Future FOIA Request Garbage and Recycling Residential Garbage Collection Garbage Carts Curbside Recycling Program Recycling Carts Recycling Drop-Off Center Household Hazardous Waste Facility Electronics Recycling Holiday Lights Recycling Naperville Fire Department About the Fire Department Emergency Preparedness Inspections and Permits Programs and Services Safety and Public Education Naperville Police Department About the Police Department Programs and Services Community Education and Crime Prevention Office of the Chief of Police Investigations Division Patrol Division Join NPD Permits and Licenses Senior Services and Resources Services and Resources for People with Disabilities Snow and Ice Removal Snow Plowing and Salting Mailboxes and Parkway Sod Winter Updates Water/Wastewater Utility Your Water Service Maintaining Our System Common Water Issues Residents + Helping Residents Build a Better Community You can find a collection of city information relevant to everyone in Naperville, from new residents to long-time community members. Go to this section Businesses + Resources for Doing Business in Naperville Whether you're starting, running or visiting a Naperville business - find resources to help you. Go to this section Enjoy Naperville + Biking Maps, Guides and Plans Commander Dan Shanower September 11 Memorial Explore the Community Festivals and Parades Millennium Wall Naperville Community Concert Center Naperville Riverwalk Naper Settlement & Homestead Von Oven Scout Reservation Walks and Runs + + + + Helping Residents Build a Better Community You can find a collection of city information relevant to everyone in Naperville, from new residents to long-time community members. Go to this section + Resources for Doing Business in Naperville Whether you're starting, running or visiting a Naperville business - find resources to help you. Go to this section + " -1522,https://alpha.austin.gov/police-oversight/2020-06-4-18/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1523,https://www.va.gov/martinsburg-health-care/stories/martinsburg-vamc-premiers-use-of-disposable-duodenoscopes/,Not Criminal Justice Related,Not Criminal Justice Related,404 - page not found,"Apply for and manage the VA benefits and services you’ve earned as a Veteran, Servicemember, or family member—like health care, disability, education, and more.",200,VA.gov Home | Veterans Affairs,"[""404 – Page not found""]","[""Page not found"", ""Veteran programs and services"", ""More VA resources"", ""Get VA updates"", ""In crisis? Talk to someone now"", ""Get answers"", ""Call us"", ""Visit a medical center or regional office"", ""Get answers"", ""Call us"", ""Visit a medical center or regional office"", ""Language assistance"", ""Language assistance""]","[""We’re here anytime, day or night – 24/7""]",[],[],[],"" -1524,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0460/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1525,https://spdblotter.seattle.gov/2012/03/02/south-seattle-residents-police-team-up-to-take-back-rainier-beach/,Misc Police Activity,Police & Public Interactions,"South Seattle Residents, Police Team Up to ""Take Back"" Rainier Beach - SPD Blotter","",200,403 Forbidden,"[""South Seattle Residents, Police Team Up to “Take Back” Rainier Beach""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics Search Search Search Search Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports -1526,https://delcopa.gov/publicrelations/releases/2019/prisonboardmeetingcancelled.html,Poor Data Source,Poor Data Source,"Oct. 8 Board of Prison Inspectors meeting cancelled - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Oct. 8 Board of Prison Inspectors meeting cancelled""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Oct. 8 Board of Prison Inspectors meeting cancelled Home / Departments / Public Relations Releases / Oct. 8 Board of Prison Inspectors meeting cancelled The October 8, 2019 meeting of the Delaware County Board of Prison Inspectors has been cancelled. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Oct. 8 Board of Prison Inspectors meeting cancelled Home / Departments / Public Relations Releases / Oct. 8 Board of Prison Inspectors meeting cancelled Oct. 8 Board of Prison Inspectors meeting cancelled Home / Departments / Public Relations Releases / Oct. 8 Board of Prison Inspectors meeting cancelled Oct. 8 Board of Prison Inspectors meeting cancelled Home / Departments / Public Relations Releases / Oct. 8 Board of Prison Inspectors meeting cancelled The October 8, 2019 meeting of the Delaware County Board of Prison Inspectors has been cancelled. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us The October 8, 2019 meeting of the Delaware County Board of Prison Inspectors has been cancelled. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Public Relations Navigation Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us " -1527,https://delcopa.gov/ojs/efileforms/ojs forms for efile/writofsummons.pdf,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1528,https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/summary-of-overarching-recommendations/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1529,https://delcopa.gov/workshops/,Not Criminal Justice Related,Not Criminal Justice Related,Untitled Document,"",200,"Delaware County, Pennsylvania",[],[],[],[],[],[],"" -1530,https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scoperesponsibility-to-the-community-and-other-policy-violations-1/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1531,https://ose.louisiana.gov/event/chief-of-police/,Poor Data Source,Poor Data Source,Chief of Police | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Chief of Police""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Chief of Police Competitive Level Posting Period 11/09/2020 - 11/19/20 Application Deadline 11/19/20 Jurisdiction Alexandria Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Chief of Police Competitive Level Posting Period 11/09/2020 - 11/19/20 Application Deadline 11/19/20 Jurisdiction Alexandria Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Chief of Police Competitive Level Posting Period 11/09/2020 - 11/19/20 Application Deadline 11/19/20 Jurisdiction Alexandria Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Chief of Police Competitive Level Posting Period 11/09/2020 - 11/19/20 Application Deadline 11/19/20 Jurisdiction Alexandria Application This event has passed. Chief of Police Competitive Level Posting Period 11/09/2020 - 11/19/20 Application Deadline 11/19/20 Jurisdiction Alexandria Application This event has passed. Chief of Police Competitive Level Posting Period 11/09/2020 - 11/19/20 Application Deadline 11/19/20 Jurisdiction Alexandria Application This event has passed. Chief of Police Competitive Level Competitive Level Competitive Level Posting Period 11/09/2020 - 11/19/20 Application Deadline 11/19/20 Jurisdiction Alexandria Posting Period 11/09/2020 - 11/19/20 Application Deadline 11/19/20 Jurisdiction Alexandria Posting Period 11/09/2020 - 11/19/20 Application Deadline 11/19/20 Jurisdiction Alexandria Posting Period 11/09/2020 - 11/19/20 Posting Period Application Deadline 11/19/20 Application Deadline Jurisdiction Alexandria Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -1532,http://www.longbeach.gov/police/press-releases/l-b-p-d--offers-holiday-safety-tips/,Media Bulletins,Agency-Published Resources,L.B.P.D. Offers Holiday Safety Tips,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/22/2016 FOR IMMEDIATE RELEASE Press Release # Subject: L.B.P.D. OFFERS HOLIDAY SAFETY TIPS Contact: Media Relations Detail (562) 570-5273 With holiday shopping kicking off this week, the Long Beach Police Department would like to remind everyone to report suspicious activity immediately by calling 9-1-1, and to practice the following safety tips, which may prevent them from becoming a victim: While shopping: - Place all gifts and packages in the trunk or out of sight - Be aware of your surroundings at all times and walk with confidence - Park in well-lighted areas - Avoid shopping alone; there is safety in numbers - Use credit or debit cards for purchases to avoid carrying large amounts of cash - Keep car doors locked and windows closed - Carry purses or bags close to your body - Have the car key in your hand prior to getting to your vehicle - Report suspicious persons or packages to on-site security or police Suggestions in and around your home: - Keep gifts in areas that cannot be seen from doorways or windows - Install exterior motion sensor lighting - Keep bushes and shrubbery trimmed to eliminate places for thieves to hide - Postpone mail and newspaper deliveries while traveling - Do not store gifts in vehicles or unsecured areas Suggestions for business operators: - Lock unused doors (in compliance with fire codes) - Keep only necessary cash in the register - Vary the schedule and route of your bank deposits each day - Make sure the register is clearly visible to passers-by - Advertise your security alarm system with signs in visible locations - Invest in video surveillance cameras and ensure they are operational at all times and capture facial features - Develop a mutual aid system among stores on your block or close to you and keep an eye on one another For additional crime prevention information visit: www.longbeach.gov/police/how-do-i/prevent-crime/ . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1533,https://www.sandiego.gov/department-document/police-identify-emerald-hills-homicide-victim,Media Bulletins,Agency-Published Resources,Police Identify Emerald Hills Homicide Victim | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Police Identify Emerald Hills Homicide Victim"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -1534,https://rocklandmaine.gov/police-department/pedestrian-safety-crosswalk-safety/attachment/crosswalk-enforcement-2/,Poor Data Source,Poor Data Source,"Crosswalk Enforcement | The City of Rockland, Maine","",200,403 Forbidden,"[""Crosswalk Enforcement""]",[],"[""All Current Alerts & Announcements"", ""Current Weather"", ""City of Rockland""]",[],[],[],"All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Current Weather Now loading... All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Current Weather Now loading... All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Current Weather Now loading... All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! " -1535,https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-6/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1536,https://ci.piedmont.ca.us/services___departments/police/services/request_a_report,Resources,Agency-Published Resources,Request a Report - City of Piedmont,"",200,Just a moment...,"[""City of Piedmont""]",[],"["""", ""How to Obtain a Police Report or Records Release""]",[],[],[],"" -1537,http://www.longbeach.gov/police/press-releases/dui---driver-s-license-checkpoint-planned-this-weekend-2147407661/,Media Bulletins,Agency-Published Resources,DUI & Driver's License Checkpoint Planned this Weekend,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1539,https://www.southamptontownnypolice.gov/1560/candle-light-vigil,Misc Police Activity,Police & Public Interactions,"Candle Light Vigil | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Candle Light Vigil""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Town Services Supervisor's Office Candle Light Vigil Candle Light Vigil 1 2 2024 Town Budgets Addiction and Recover/Behavioral Health Committee Suffolk County Communities of Solution Opioid Report Alcohol Addiction Resources Complete List of Communities of Solutions Service BCP Application Candle Light Vigil Citizens' Response Center FIMP Project Plan The Edith Windsor Heart Project Town Board E-Newsletter Black History Month Facts and Accomplishments Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Town Services Supervisor's Office Candle Light Vigil Candle Light Vigil 1 2 2024 Town Budgets Addiction and Recover/Behavioral Health Committee Suffolk County Communities of Solution Opioid Report Alcohol Addiction Resources Complete List of Communities of Solutions Service BCP Application Candle Light Vigil Citizens' Response Center FIMP Project Plan The Edith Windsor Heart Project Town Board E-Newsletter Black History Month Facts and Accomplishments Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -1540,https://www.southamptontownnypolice.gov/faq.aspx?qid=425,Resources,Agency-Published Resources,FAQs • Will Cooper’s Beach be open?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ FAQ (COVID-19) | Southampton Town Beaches""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1541,http://www.tampa.gov/police/info/honoring-our-heroes/1998/detective-randy-bell,Media Bulletins,Agency-Published Resources,Detective Randy Bell | City of Tampa,"On May 19, 1998, Detective Randy Bell, age 44 and Detective Ricky Childers, age 46, were assigned to the Homicide Squad. They were conducting an investigation involving the shooting death of a 4-year-old boy with an assault rifle. Detectives Bell and Childers took the father of the boy, Bennett, to Police headquarters for interviewing. Due to Bennett's inconsistent interview, he was taken back to the crime scene to re-enact his statements to the detectives. Unknown to the detectives, Mr. Bennett provided a false name and date of birth. In truth, Mr.",200,City of Tampa,"[""Detective Randy Bell""]","[""Police Department"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[],"" -1542,https://alpha.austin.gov/es/police-oversight/formal-complaint-2020-1346/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1543,http://www.longbeach.gov/police/press-releases/officer-involved-shootings-occur-after-suspect-fires-at-officers--leads-police-on-vehicle-pursuit/,Media Bulletins,Agency-Published Resources,OFFICER INVOLVED SHOOTINGS OCCUR AFTER SUSPECT FIRES AT OFFICERS; LEADS POLICE ON VEHICLE PURSUIT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1544,https://www.coppelltx.gov/903/coppell-recreation-and-development-corpo,Not Criminal Justice Related,Not Criminal Justice Related,"Coppell Recreation and Development Corporation | Coppell, TX",Learn more about this voter authorized sales tax revenue fund.,200,"Coppell, TX | Official Website","[""Coppell Recreation and Development Corporation""]","[""Question or Comment?""]","[""Contact Us"", ""Loading""]","[""Strategic Financial Engagement""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Residents Business Engage I Want To... Visitors Home Government City Departments Strategic Financial Engagement Budget Coppell Recreation and Development Corporation Coppell Recreation and Development Corporation The Coppell Recreation and Development Corporation (CRDC) is a sales tax revenue fund that was established to undertake projects for youth and adult amateur athletics, entertainment and public gathering facilities, exhibition and museum facilities, parks and recreational facilities and more. This fund was originally authorized by voters in 2007. Coppell voters re-authorized the CRDC's use of sales tax revenue in the November 5, 2013 election. Because the CRDC is entirely funded through sales tax, 60% of fund revenues are collected from non-Coppell residents that commute to the City for work or business reasons and from business to business transactions. Because this fund is funded through sales tax, the CRDC will be negatively impacted by the proposed Rule 3.334 . The re-authorized and expanded collection of the half-cent CRDC sales tax has driven the next generation of City infrastructure. Specifically, revenue from CRDC provided major funding for the improvements at the Cozby Library and Community Commons, Andrew Brown Park system, trails, medians and green spaces, the addition of Life Safety Park, and the Coppell Arts Center. Question or Comment? Do you have a budget-related question or comment? Let us know! Contact Us Strategic Financial Engagement Physical Address 255 Parkway Boulevard Coppell , TX 75019 Mailing Address P.O. Box 9478 Coppell , TX 75019 Phone: 972-304-3691 Budget Process Coppell Recreation and Development Corporation ​Crime Control & Prevention District Budget Debt Service Fund Five Year Forecast Funding Local Service Organizations General Fund Property Tax Sales Tax Regulations ​Special Revenue Funds ​Water & Sewer Enterprise Fund Agendas & Minutes Alert Sign-Up Citizen Report E-News Pay Water Bill Permits 255 E. Parkway Blvd., P.O. Box 9478, Coppell, TX 75019 Phone: 972-462-0022 | Email us Site Map Contact Us Accessibility Copyright Notices Privacy Policy Employee Login /QuickLinks.aspx Government Websites by CivicPlus® " -1545,https://www.sanramon.ca.gov/our_city/departments_and_divisions/police/victims_rights_information/domestic_violence,Resources,Agency-Published Resources,Domestic Violence - City of San Ramon,"",200,Just a moment...,"[""Domestic Violence""]","[""Contact Us"", ""Contact Us"", ""Useful Links""]","[""RESOURCE INFORMATION FOR VICTIMS OF DOMESTIC VIOLENCE""]",[],[],[],"" -1546,https://www.mass.gov/doc/cruceta-neysa-v-boston-police-department-4512/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -1547,https://www.montgomeryohio.gov/police-department-2020-annual-report/office-otte-sro/,Poor Data Source,Poor Data Source,"- Montgomery, Ohio","",200,"Welcome - Montgomery, Ohio","[""""]","[""Primary menu links"", ""Action toolbar"", ""Welcome"", ""Engage"", ""Help"", ""Mental Health Resource""]",[],[],[],[],"Montgomery, Ohio Primary menu links Services Community Government Events News Contact Action toolbar Answers Report Issue Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Search Primary menu links Services Community Government Events News Contact Action toolbar Answers Report Issue Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Search Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Montgomery, Ohio Montgomery, Ohio Montgomery, Ohio Helpful Share Facebook Twitter Email Size + Reset a − Welcome About Montgomery Montgomery City Hall 10101 Montgomery Rd. Montgomery, OH 45242 513-891-2424 Engage Connect CodeRed Contact Subscribe Help Accessibility Comment Policy Copyright Directory Disclaimer Public Records Policy/Request Security Policy Services Sitemap Mental Health Resource Suicide Prevention Lifeline : 988 Mobile Crisis Team: 513-584-5098 Mental Health Access Point : 513-558-8888 National Alliance on Mental Illness (NAMI): 800-950-6264 More Information " -1548,https://dccouncil.gov/donation-disclosures/copy-of-april-2018-donation-disclosure-4/,Media Bulletins,Agency-Published Resources,Copy of April 2018 Donation Disclosure • Council of the District of Columbia,"",200,Home • Council of the District of Columbia,"[""Copy of April 2018 Donation Disclosure""]",[],[],[],[],[],"Federal Tax Counter: $1,298,379,525 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Federal Tax Counter: $1,298,379,525 What is this? Get Updates RSS Press Center facebook twitter youtube Federal Tax Counter: $1,298,379,525 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Council of the District of Columbia Copy of April 2018 Donation Disclosure November 19, 2018 Loading... Copy of April 2018 Donation Disclosure November 19, 2018 Loading... Loading... Loading... DC Council seal About the Council Open Government Register to Vote Council Updates Jobs Council Directory Privacy Policy Commemorative D.C. Flag Program Ethics Visit the Wilson Building facebook twitter youtube Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Search facebook twitter youtube Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate " -1549,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/092421arrests.pdf,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -1550,https://champaignil.gov/2014/04/23/fire-and-police-memorial-public-dedication-ceremony/,Not Criminal Justice Related,Not Criminal Justice Related,Fire and Police Memorial Public Dedication Ceremony - Update - City of Champaign,"",200,403 Forbidden,"[""Fire and Police Memorial Public Dedication Ceremony – Update""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Fire and Police Memorial Public Dedication Ceremony – Update Search Posted on April 23, 2014 In the event of rain the ceremony will be moved to the City of Champaign Council Chambers, 102 N. Neil Street, Champaign. Fire and Police Memorial Public Dedication Ceremony The Fire and Police Memorial will be held at the Fire and Police Memorial on the northeast corner of West Side Park by the Fire and Police Memorial Committee, Champaign Police Department,  Champaign Fire Department,  Mayor Don Gerard, and City of Champaign on Tuesday, April 29, 2014 at 6 PM. Categories: Police Department News , Police Department Press Releases Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works " -1551,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0976/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1552,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2017_news_releases/police_continue_missing_person_investigation,Media Bulletins,Agency-Published Resources,Police Continue Missing Person Investigation - Village of Pleasant Prairie,"",200,Just a moment...,[],"[""Police Continue Missing Person Investigation""]","[""Follow Us on Social Media""]",[],[],[],"" -1553,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0129/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1554,http://www.longbeach.gov/police/press-releases/business-license-operation-conducted/,Media Bulletins,Agency-Published Resources,BUSINESS LICENSE OPERATION CONDUCTED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/8/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: BUSINESS LICENSE OPERATION CONDUCTED Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department's Detective Division, in cooperation with City of Long Beach’s Business Licensing Division, conducted a three day undercover business license compliance operation over the course of the past two weeks. Detectives and representatives from Business Licensing visited several businesses throughout the City of Long Beach, which are associated with either jewelry or electronics. The purpose of the inspections was to ensure the businesses were operating within the scope of their license, and not buying lost or stolen jewelry or electronics. During the operation, an undercover detective would enter a business posing as a customer, and attempt to sell jewelry and/or electronics. Any business found in violation prompted further enforcement action. During the course of the operation, detectives conducted 34 inspections, resulting in six (6) citations and two (2) misdemeanor arrests for business license violations, and the issuance of one warning letter. These violations were found at a total of seven (7) businesses, collectively. Based on one initial inspection, detectives served a search warrant at a business and recovered approximately 30 cell phones with altered or removed serial numbers, computers, and over $24,000 in cash. The community should be aware that only businesses with ""Secondhand Dealer"" licenses have the ability to legally buy, sell or trade secondhand property, and are required to have the license posted in public view. The Long Beach Police Department will continue to enforce business licensing laws at all establishments throughout the city. Anyone wishing to report unlawful business practices relating to the purchase and resale of stolen property should contact the Burglary Detail at (562) 570-7351. To report anonymous tips call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1555,https://www.antioch.il.gov/wpfb-file/08-11-10-police-and-fire-commission-minutes-pdf-2/,Not Criminal Justice Related,Not Criminal Justice Related,"08-11-10 Police And Fire Commission Minutes - Antioch, IL",8960 08 11 10 police and fire commission minutes pdf commissions 2010 1284749388 415e95087ff8cdaefd2217d9ff094969 213x300 _zutqomf10kfw thumb jpg 09 17 13 49 48 0 pdf application num_pages pdf_pages timings,200,"Home - Antioch, IL","[""08-11-10 Police And Fire Commission Minutes""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -1556,https://delcopa.gov/publicrelations/releases/2020/staythecourse.html,Media Bulletins,Agency-Published Resources,"Governor Urges Residents, Business Owners and Politicians to “Stay the Course” - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Governor Urges Residents, Business Owners and Politicians to “Stay the Course”""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -1557,http://www.longbeach.gov/police/press-releases/robbery-suspects-arrested/,Media Bulletins,Agency-Published Resources,ROBBERY SUSPECTS ARRESTED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1558,https://delcopa.gov/jdboard/pdfs/minutes_2021_09_21.pdf,Misc Police Activity,Police & Public Interactions,"","",200,"","","","","","","","" -1559,https://police.kingstontn.gov/team/raymond-gold/,Poor Data Source,Poor Data Source,Raymond Gold – Kingston Police Department,"",200,Sucuri WebSite Firewall - Access Denied,[],[],[],[],[],[],"> Watch Live > Online Payments > Sign up for Alerts > Report a Concern 865.376.6584 Menu Government Mayor & City Council City Manager Close Departments Finance Dept. Pay a Bill Licenses & Permits Taxes Bids Audit Report Staff & Contacts Fire Dept Services Burn Permits Become a Volunteer Smoke Detector Program Public Works Dept Work Orders/Service Requests Street Maintenance Snow Removal Brush Removal Other Services Police Dept Pay a Citation Crime Tips Watch Programs Records Request Resources Park & Greenway Map Reserve Officer Program/Police Explorers City Court Animal Control Press Releases Traffic School Parks & Recreation Dept Community Pool Registration > Facilities > Sports Calendar Sponsors Programs Special Events Park Rules & Safety Staff Press Releases Water Dept FAQS I Want To: Pay a Bill > View Water & Sewer Ordinances > Check Water Rates > Report a Break Distribution & Collection Wastewater Treatment Plant Water Treatment Plant Water Service Application Close Live History of Kingston Schools Citizen Resources Real Estate Information Close Work Resources Employment Close Play Attractions Events Public Library Project Bids Photo Gallery Close How Do I? Frequently Asked Questions Online Payments Report a Concern Sign up for Alerts Close Menu Government Mayor & City Council City Manager Close Departments Finance Dept. Pay a Bill Licenses & Permits Taxes Bids Audit Report Staff & Contacts Fire Dept Services Burn Permits Become a Volunteer Smoke Detector Program Public Works Dept Work Orders/Service Requests Street Maintenance Snow Removal Brush Removal Other Services Police Dept Pay a Citation Crime Tips Watch Programs Records Request Resources Park & Greenway Map Reserve Officer Program/Police Explorers City Court Animal Control Press Releases Traffic School Parks & Recreation Dept Community Pool Registration > Facilities > Sports Calendar Sponsors Programs Special Events Park Rules & Safety Staff Press Releases Water Dept FAQS I Want To: Pay a Bill > View Water & Sewer Ordinances > Check Water Rates > Report a Break Distribution & Collection Wastewater Treatment Plant Water Treatment Plant Water Service Application Close Live History of Kingston Schools Citizen Resources Real Estate Information Close Work Resources Employment Close Play Attractions Events Public Library Project Bids Photo Gallery Close How Do I? Frequently Asked Questions Online Payments Report a Concern Sign up for Alerts Close Raymond Gold Manager Kingston, TN Location © 2017. City of Kingston. All Rights Reserved. | Powered by Konki Digital Watch Live Pay a Bill Contact Us " -1560,https://www.montebelloca.gov/departments/police/news/all_news_articles/national_night_out_2021,Misc Police Activity,Police & Public Interactions,National Night Out 2021 - City of Montebello,"",200,Just a moment...,"[""City of Montebello""]","[""National Night Out 2021""]",[],[],[],[],Skip to Content -1561,https://www.lynchburgvapolice.gov/wp-content/uploads/2021/05/headlamp-2940-scaled.jpg,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1562,http://www.ryepolice.us/logs/police-logs-for-4-22-20-4-28-20,Daily Activity Logs,Info About Officers,Rye Police Department Police Logs for 4/22/20-4/28/20 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs for 4/22/20-4/28/20""]","[""Police Logs for 4/22/20-4/28/20""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -1563,https://mtcb.colorado.gov/police/animal-regulations-ordinances,Resources,Agency-Published Resources,Animal Regulations & Ordinances | Town of Mt. Crested Butte,Dog Registration The town of Mt. Crested Butte requires your dog to be registered. Proof of rabies vaccination will be required to register your dog. Fees to register are $10 if the dog has been spayed or neutered or $25 if they have not. Licenses are not transferable and are non-refundable. To renew or pay for a lost tag is $5. To obtain a dog license you have a few options:,200,Home | Town of Mt. Crested Butte,"[""Animal Regulations & Ordinances""]",[],[],[],[],"[""Dog Registration"", ""Animal Ordinances in Mt. Crested Butte""]","" -1564,http://www.ryepolice.us/logs/police-logs-for-52516-53116,Daily Activity Logs,Info About Officers,Rye Police Department Police Logs for 5/25/16-5/31/16 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs for 5/25/16-5/31/16""]","[""Police Logs for 5/25/16-5/31/16""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -1565,https://delcopa.gov/ich/resources/covid19/pdf/delcocovid19vaccinationsites.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -1566,https://delcopa.gov/publicrelations/releases/2019/energyefficiency.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Participates in Energy Efficiency Day 2019 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Participates in Energy Efficiency Day 2019""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""4th annual national event urges citizens to “Save Money. Cut Carbon. Breathe Easier.”""]",[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County Participates in Energy Efficiency Day 2019 Home / Departments / Public Relations Releases / Delaware County Participates in Energy Efficiency Day 2019 4th annual national event urges citizens to “Save Money. Cut Carbon. Breathe Easier.” In recognition of the 4th annual National Energy Efficiency Day (EE Day) on Oct. 2, Delaware County joined regional and national organizations, businesses, utilities, universities, and individuals in promoting energy efficiency. Energy efficiency is the most cost-effective, quickest, and cleanest way to meet energy needs and reduce utility bills for residential, business, and industrial customers. Energy efficiency is also good for the economy and responsible for a U.S. workforce of more than 2.3 million, ranging from professional services to manufacturing and construction jobs. Delaware County passed a resolution declaring October 2, 2019, as Energy Efficiency Day, encouraging residents, businesses, and organizations to commit to taking actions this month and in the future to conserve energy and reduce carbon emissions. Delaware County formed the USE (Utilities, Supplies and Energy) Committee in April 2019 to identify opportunities to reduce the amount of utilities, supplies and/or energy that County employees use in their jobs each day and enable employees to reduce their environmental footprint, create savings in the County budget and make their jobs easier and more efficient. Delaware County actively seeks out opportunities to encourage and implement energy efficiency throughout the county. “Together, employees and the residents of Delaware County can continue to contribute to our sustainability efforts by learning more about energy efficiency and practicing smarter energy use in their daily lives,” said Councilman Kevin Madden and USE Committee member. Residents can conserve energy, which saves money and reduces our carbon footprint by using energy-efficient lighting, updating and maintaining HVAC systems, installing “smart thermostats,” using a power strip for electronics, unplugging devices when not in use and choosing ENERGY STAR® products. More information on conserving energy can be found here: www.delcopa.gov/recycle/pdf/UseLessEnergy.pdf More information about National Energy Efficiency Day can be found here: www.energyefficiencyday.org Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play " -1567,https://cheswold.delaware.gov/cheswold-police-department-policy-and-procedure-manual/reports/,Policies & Contracts,Info About Agencies,Reports - Town of Cheswold,"",200,"Home - Town of Cheswold - Kent County, Delaware","[""Cheswold""]","[""Delaware"", ""Reports""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[],"Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Cheswold Delaware Listen Reports Reports Cheswold Delaware Listen Reports Reports Listen Reports Reports Listen Reports Reports Listen Reports Reports Listen Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form " -1568,http://police.portlandmaine.gov/400/payments,Resources,Agency-Published Resources,"Payments | Portland, ME - Official Website",The City of Portland offers four ways to make parking ticket payments so that you can choose the method that is most convenient for you.,200,"Portland, ME - Official Website | Official Website","[""Payments""]",[],[],[],[],[],Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government Departments Parking Tickets Payments Payments Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Parking Tickets Payments Payments Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Parking Tickets Payments Payments Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Parking Tickets Payments Payments Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Parking Tickets Payments Payments Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Home Your Government Departments Parking Tickets Payments Payments Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Home Your Government Departments Parking Tickets Payments Payments Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Home Your Government Departments Parking Tickets Payments Payments Home Your Government Departments Parking Tickets Payments Payments Home Your Government Departments Parking Tickets Payments Payments Payments Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Booting / Immobilization Contesting a Parking Ticket Payments Ticket Fees & Violations Towing Unpaid Tickets Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® -1569,https://delcopa.gov/courts/pdf/emergencyjudicialorders/sixthemergencyextensionorder_criminalsection.pdf,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -1570,https://www.mass.gov/doc/cspolicechiefeeinstructions2010doc/download,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1571,https://www.mass.gov/doc/011718-public-scoping-meeting-commercial-menhaden-management/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1572,https://delcopa.gov/pollingplace/,Not Criminal Justice Related,Not Criminal Justice Related,Untitled Document,"",200,"Delaware County, Pennsylvania",[],[],[],[],[],[],"" -1573,https://police.greenvillesc.gov/1826/laurens-road-transit-study,Not Criminal Justice Related,Not Criminal Justice Related,"","",404,"","","","","","","","" -1574,http://lafayettepolice.us/1099/operations,Poor Data Source,Poor Data Source,"Operations | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Operations""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]","[""Community Services"", ""Divisions""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Operations Prevention Recruitment How Do I... Home Government Departments A - F Fire Department Operations Operations 9 1 1 2 Community Services Members of the Lafayette Fire Department have been involved with many different community fundraisers and events in the past. Divisions Check out the different divisions that are active within the City of Lafayette Fire Department. Community Services Fire Prevention Show Advertisement Events Calendar Our Family Serving Your Family Divisions Fire Suppression HazMat Training Tactical Rescue Team Water Search & Recovery Team Fire Prevention Community Outreach Fire Stations Submit a Request History Photo Gallery Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Operations Prevention Recruitment How Do I... Home Government Departments A - F Fire Department Operations Operations 9 1 1 2 Community Services Members of the Lafayette Fire Department have been involved with many different community fundraisers and events in the past. Divisions Check out the different divisions that are active within the City of Lafayette Fire Department. Community Services Fire Prevention Show Advertisement Events Calendar Our Family Serving Your Family Divisions Fire Suppression HazMat Training Tactical Rescue Team Water Search & Recovery Team Fire Prevention Community Outreach Fire Stations Submit a Request History Photo Gallery Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -1575,https://www.mass.gov/doc/2021-hanover-police-lieutenant-sole-assessment-center-examination-employment-verification-form/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1576,http://www.ryepolice.us/logs/police-logs-for-7-25-18-7-31-18,Daily Activity Logs,Info About Officers,Rye Police Department Police Logs for 7/25/18-7/31/18 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs for 7/25/18-7/31/18""]","[""Police Logs for 7/25/18-7/31/18""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -1578,https://www.foxcrossingwi.gov/departments/police-department/patrol/wreck/,Poor Data Source,Poor Data Source,wreck - Fox Crossing Fox Crossing,"",200,Fox Crossing - Bridging the Fox Cities Fox Crossing,[],"[""Patrol » wreck""]",[],[],[],[],"Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing Patrol » wreck This entry was posted on Tuesday, March 20th, 2012 at 9:09 am and is filed under . - You can follow any responses to this entry through the RSS 2.0 feed. - - Responses are currently closed, but you can trackback from your own site. Comments are closed. Copyright © 2010 - 2024 Fox Crossing, All Rights Reserved. Professional Web Site Design by Sandstone Digital. Disclaimer Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing Patrol » wreck This entry was posted on Tuesday, March 20th, 2012 at 9:09 am and is filed under . - You can follow any responses to this entry through the RSS 2.0 feed. - - Responses are currently closed, but you can trackback from your own site. Comments are closed. Copyright © 2010 - 2024 Fox Crossing, All Rights Reserved. Professional Web Site Design by Sandstone Digital. Disclaimer " -1579,https://www.lakewoodoh.gov/coffee-with-a-cop-set-for-friday-january-12th/,Misc Police Activity,Police & Public Interactions,"Coffee with a Cop set for Friday, January 12th | The City of Lakewood, Ohio","The Lakewood Police Department will host another ""Coffee With A Cop"" event on Friday, January 12, 2018 from 8:00 a.m. to 10:00 a.m. at McDonald's , 16407",200,"The City of Lakewood, Ohio","[""Coffee with a Cop set for Friday, January 12th""]",[],"[""Recent News"", ""Upcoming Events"", ""Most Popular Pages""]",[],[],[],"" -1580,https://www.panynj.gov/police/en/about/leadership.html#main,Personnel Records,Info About Officers,Leadership,"",200,We Keep the Region Moving | Port Authority of New York and New Jersey,[],[],[],[],[],[],"" -1581,https://gonzalesca.gov/services/police/how-do-i/learn-what-do-if-i-become-victim-crime,Resources,Agency-Published Resources,Learn what to do if I become the victim of a crime? | City of Gonzales,"Official City of Gonzales, CA website. Find the latest news, events, and information for residents and businesses....",200,City of Gonzales,"[""The City of Gonzales, California"", ""The City of Gonzales, California""]","[""Top menu"", ""Learn what to do if I become the victim of a crime?""]",[],"[""CITY OF GONZALES""]",[],[],"" -1582,https://southamptontownnypolice.gov/faq.aspx?qid=323,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Who regulates deer hunting in the Town of Southampton,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Hunting Season""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1583,https://www.hayward-ca.gov/police-department/public-services/youth-family-services-bureau/contact,Resources,Agency-Published Resources,Contact | City of Hayward - Official website,"We have experienced mental health counselors answering the phone during business hours who can provide information and referrals to meet a range of needs. Sometimes, it can be difficult to reach out for help, but the supportive YFSB counselors can walk you through the process and make sure your family receives the services they need.To find out more about which YFSB counseling",200,City of Hayward - Official website,[],"[""Contact"", ""You are here. So is everything else."", ""Search form""]",[],"[""Receive crime bulletins and alerts"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],"Skip to main content Search modal button POLICE Mobile Menu button Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Make a Payment Access Hayward Translate Search POLICE About HPD Divisions Programs Public Services Public Services Administrative Citations & Hearings Animal Services Identity Theft Youth and Family Services Bureau Crime Prevention Transparency Home Public Services Youth and Family Services Bureau Contact If you have questions about any of the YFSB programs, please don’t hesitate to call us. We have experienced mental health counselors answering the phone during business hours who can provide information and referrals to meet a range of needs. Sometimes, it can be difficult to reach out for help, but the supportive YFSB counselors can walk you through the process and make sure your family receives the services they need. To find out more about which YFSB counseling services might be the best fit for you or to make an appointment, please contact YFSB. For life threatening emergencies, call 9-1-1. YFSB Location : 300 W. Winton Ave Hayward, CA 94544 510.293.7048 YFSB Business Hours: Monday - Thursday, 9:00 a.m. - 7:00 p.m. Friday, 9:00 a.m. - 5:30 p.m. You may also request information about YFSB services by submitting an Access Hayward service request below: ACCESS HAYWARD Public Services Administrative Citations & Hearings Animal Services Identity Theft Youth and Family Services Bureau Our Staff Contact Family Counseling, Crisis Intervention & Case Management School Resource Officer Program Our Kids Our Families School Based Program Police Explorer Program Mandated Reporting Missing Persons & Juveniles Curfew Violations Search modal button POLICE Mobile Menu button POLICE Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Make a Payment Access Hayward Translate Search Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Make a Payment Access Hayward Translate Search Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Make a Payment Access Hayward Translate Search Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search POLICE About HPD Divisions Programs Public Services Public Services Administrative Citations & Hearings Animal Services Identity Theft Youth and Family Services Bureau Crime Prevention Transparency POLICE About HPD Divisions Programs Public Services Public Services Administrative Citations & Hearings Animal Services Identity Theft Youth and Family Services Bureau Crime Prevention Transparency POLICE " -1584,http://lafayettepolice.us/3400/enrichment-and-training-programs,Not Criminal Justice Related,Not Criminal Justice Related,"Enrichment and Training Programs | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Enrichment and Training Programs""]","[""About Enrichment"", ""CPZ’s Enrichment Program"", ""How You Can Help""]","[""Click below to view our Amazon Wishlist"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1585,https://delcopa.gov/vetaffairs/forms/va26-1880-are.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1586,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0034/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1587,https://champaignil.gov/tag/police-chief-recruitment/,Media Bulletins,Agency-Published Resources,Police Chief Recruitment Archives - City of Champaign,"",200,403 Forbidden,"[""Items tagged: Police Chief Recruitment""]","[""City of Champaign Announces Finalists for Chief of Police Position"", ""City of Champaign Extends Application Deadline for Police Chief Recruitment"", ""Community Meetings Held for Public Works Director and Police Chief Recruitments"", ""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Items tagged: Police Chief Recruitment Search City of Champaign Announces Finalists for Chief of Police Position Posted: March 22, 2022 Public Invited to Meet the Finalists at Open House on March 29 Following a nationwide search, Champaign City Manager Dorothy Ann David has selected three finalists to interview for the City’s Chief of Police position – Angela Coonce, Bryce Johnson, and Timothy T. Tyler. Biographical information and a video statement from each finalist are now […] Categories: City Manager's Office News , General Press Releases , Police Department News | Tags: finalists , open house , Police Chief Recruitment City of Champaign Extends Application Deadline for Police Chief Recruitment Posted: February 2, 2022 The City of Champaign has extended the application deadline for the position of Police Chief. The City’s executive recruitment firm (Baker Tilly US) continues to identify and actively recruit experienced police department leaders from across the country and invite them to apply. Applications will continue to be accepted until the position is filled, with the […] Categories: General Press Releases | Tags: Deadline Extension , Police Chief Recruitment , Search Community Meetings Held for Public Works Director and Police Chief Recruitments Posted: August 17, 2021 The City Manager’s Office hosted seven public meetings between August 4-14, 2021, in order to gather public input regarding the recruitment of the City’s next Public Works Director and Chief of Police. Attendees were able to provide their feedback and suggestions directly to City Manager Dorothy David through meaningful, facilitated discussions. Tracy Parsons (Community Relations […] Categories: City Manager's Office News , Police Department News , Public Works Department News | Tags: community engagement , community meeting , Police Chief Recruitment , Public Works Director Recruitment Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign " -1589,https://southamptontownnypolice.gov/faq.aspx?qid=485,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • How long does it take to receive my rebate?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Septic Rebate Program""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1590,https://www.antioch.il.gov/2017/09/18/police-department-media-release-2/,Media Bulletins,Agency-Published Resources,"Police Department Media Release - Antioch, IL","Media Release September 18, 2017 Antioch, IL- On September 14, 2017, an off-duty Antioch Police Officer was returning to Antioch from training while driving a police vehicle. Around 5:00pm he noticed that a silver vehicle appeared to be following him. The driver of the vehicle, later identified as 68 year old David L. Larsen, of",200,"Home - Antioch, IL","[""Police Department Media Release""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -1591,https://www.southamptontownnypolice.gov/faq.aspx?qid=443,Resources,Agency-Published Resources,FAQs • Can I get a beach permit if I do not own a vehicle?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ FAQ (COVID-19) | Southampton Town Beaches""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1592,https://delcopa.gov/publicrelations/releases/18pdfs/18opioidmentalsummit.pdf,Misc Police Activity,Police & Public Interactions,"","",200,"","","","","","","","" -1593,https://www.huntsvilleal.gov/huntsville-police-department-honors-12-fallen-officers-2/,Media Bulletins,Agency-Published Resources,Huntsville Police Department honors 12 fallen officers - City of Huntsville,"",200,403 Forbidden,"[""Huntsville Police Department honors 12 fallen officers""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],[],"[""Browse By Month"", ""Browse By Category"", ""Share & Print"", ""Huntsville Police Department honors 12 fallen officers""]",[],Main Menu Main Menu Residents Back Residents Animal Services Neighborhoods Public Safety Volunteer Cemeteries Pay a Ticket Streets & Transportation Water & Sewer Garbage & Recycling Parks & Recreation Resident Toolkit Business Back Business About Huntsville Big Picture GIS Maps & Data Employment Bid A Project Codes & Ordinances Economic Development File A Claim E-Bids Pay Taxes Licensing & Permits Development Back Development Bid A Project Economic Development MPO Streets & Roadwork Building & Construction GIS Maps Planning Water & Sewer Big Picture Master Plan Historic Preservation ePlans Submittal Environment Back Environment Air Quality Garbage & Recycling Noise Sustainability Find A Park Nature Preserves Recreation Water Trails & Greenways Pets Lost & Found Green Team Government Back Government Boards & Commissions City Council Finances & Budget Media Center City Calendar Departments Mayor's Office Municipal Court Vote Find A Job Codes & Ordinances Services Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate -1594,https://alpha.austin.gov/police-oversight/formal-complaint-purpose-and-scope-10/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1595,https://council.seattle.gov/2016/09/15/our-north-seattle-police-precinct/,Policies & Contracts,Info About Agencies,Our North Seattle Police Precinct - Seattle City Council Blog,"",200,403 Forbidden,"[""Our North Seattle Police Precinct""]",[],"[""HELPFUL LINKS"", ""Make your voice heard"", ""Councilmembers""]",[],[],[],"Home News Press Releases Video Councilmembers Rob Saka Tammy J. Morales Joy Hollingsworth Maritza Rivera Cathy Moore Dan Strauss Robert Kettle Tanya Woo Sara Nelson Councilmembers (2022-2024) About Our North Seattle Police Precinct Home » Our North Seattle Police Precinct Councilmember Juarez September 15, 2016 January 6, 2023 By Mercedes Elizalde Thank you for your interest in the on-going efforts to replace the current North Precinct police station, a facility which provides public safety services for the nearly 300,000 Seattleites who live north of the ship canal plus all those who attend school, visit hospitals, and work in the area. The current North Precinct police station is an inadequate facility which needs to be replaced. Severe overcrowding has meant that the precinct has lacked community meeting space for positive community-police interactions since 1998. Most importantly, the building is not meeting the needs of our area’s expanding community and the related growth in demand for police services. As the City of Seattle responds to the federal consent decree for police reform, our infrastructure must support improved police-community relations. For this reason, two mayoral administrations and previous councils voted on 10 occasions to replace the North Precinct. The actual law to fund the police station at $160 million was passed unanimously in August of 2015. However, the current proposal is too expensive and was not designed with meaningful input from communities of color. Today I joined Mayor Murray, Councilmember Tim Burgess and Councilmember Lorena Gonzalez in announcing plans to pause the project long enough to develop a more fiscally responsible design and conduct a fair and thorough Racial Equity Toolkit. The financial overview and the Racial Equity toolkit that council called for, in the resolution I co-sponsored and that was passed by a majority of the council, should not be rushed. Although the previous councils did not call for this work to be done, I believe these steps are critical to ensure a successful project is delivered to our community. Plans to re-evaluate the project will be done with a commitment to rebuilding a useful and productive North Precinct station. Constituents in Districts 4, 5 and 6 deserve a cost-effective proposal that is responsive to racial justice issues and will provide for north end public safety reliably over the long-term. I hope you will join me in supporting this proposal to take the time to do this project right. HELPFUL LINKS Meet the Council Mayor’s Office Council Calendar Council Agendas Council Committees Watch Council Live Make your voice heard Find Your Council District Contact the Council Sign up for Public Comment Register to Vote Councilmembers Rob Saka Tammy J. Morales Joy Hollingsworth Maritza Rivera Cathy Moore Dan Strauss Robert Kettle Teresa Mosqueda Sara Nelson The official blog of the Seattle City Council " -1596,https://www.southamptontownnypolice.gov/1629/nitrogen-reducing-biofilter-incarnation-,Not Criminal Justice Related,Not Criminal Justice Related,"Nitrogen Reducing Biofilter (Incarnation Lutheran Church, Bridgehampton) | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Nitrogen Reducing Biofilter (Incarnation Lutheran Church, Bridgehampton)""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]","[""WQIPP - Fund Application"", ""Summary Sheet""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Community Preservation Fund (CPF) WQIPP - Plan/Checklist/App 2021 WQIP - Applications & Proposal Summaries Nitrogen Reducing Biofilter (Incarnation Lutheran Church, Bridgehampton) Nitrogen Reducing Biofilter (Incarnation Lutheran Church, Bridgehampton) WQIPP - Fund Application Incarnation Lutheran Church - Application Submitted Summary Sheet WQIP-Proposal Summary Sheet -- Incarnation Lutheran Church Village Sewer Map and Plan (Village of Southampton) Nitrogen Reducing Biofilter (St. John’s Episcopal Church, Southampton Village) Nitrogen Reducing Biofilter (Incarnation Lutheran Church, Bridgehampton) Nitrogen Reducing Biofilter (Westhampton Presbyterian Church, Westhampton) Sewershed K Engineering & Design (Village of Sag Harbor) Nugent Street Bioswale (Village of Southampton – Public Works) Sewer System Connections Installation (Westhampton Landings Condominium) Downtown Stormwater Improvements (Village of Westhampton Beach) Septic Improvement Project (North Sea Farms, Southampton) Reducing Groundwater Nitrogen Input into Sagaponack Lake (Peconic Land Trust) Septic Improvement Project (Hampton Arms- 61 West Tiana Owners Inc., Hampton Bays) I/A Hydroaction Treatment System (Hampton Resorts, Old Town Pond Constructed Treatment Wetland (Village of Southampton – Public Works) Sebonac Creek Inlet/Great Peconic Bay Oyster Reef (Town of Southampton Environment) Mill Pond Aquatic Habitat Restoration (Town of Southampton - Board of Trustees) Whispering Fields Court Farm Runoff Remediation (WFH Association) Riverside Sewer System year 1 Planning & Design (Town of Southampton) A/I Septic System (Village of Southampton- Concer House) Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -1597,https://spdblotter.seattle.gov/2011/03/04/one-day-community-police-academy/,Media Bulletins,Agency-Published Resources,One-day Community Police Academy - SPD Blotter,"",200,403 Forbidden,"[""One-day Community Police Academy""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics Search Search Search Search Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports -1598,https://southamptontownnypolice.gov/faq.aspx?qid=266,Complaints & Misconduct,Info About Officers,FAQs • How do I report a violation?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Public Safety - Fire Prevention""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1599,https://norfolkne.gov/assets/site/documentcentral/police/archived-arrests/2017-arrests/oct-2017-arrests.pdf,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -1600,https://owd.boston.gov/wp-content/uploads/2022/06/davidramos3-1-copy.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1601,https://delcopa.gov/courts/domesticrelations/forms/directdepositenrollment.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1602,http://www.longbeach.gov/police/press-releases/traffic-fatality3/,Media Bulletins,Agency-Published Resources,Traffic Fatality (Carson & California),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/11/2018 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY - CARSON STREET & CALIFORNIA AVENUE Contact: Media Relations Detail (562) 570-5273 On January 11, 2018, at approx 1:25 a.m., officers were dispatched to the area of Carson Street and California Avenue regarding a single-vehicle traffic collision, which resulted in the death of female adult. Officers arrived and located a blue 1994 Honda Accord, occupied by a male and female adult, which had struck a tree. The Long Beach Fire Department responded, extricated the female passenger, and transported both occupants to a local hospital in stable condition. The female was later pronounced deceased at the hospital. The preliminary investigation determined the Honda, being driven by a 27-year-old male resident of Long Beach, was travelling westbound on Carson Street when it lost control, struck a traffic signal on the south/west corner of the intersection, and then struck a parking sign and ultimately a tree. The identity of the victim, a 32-year-old female from Long Beach, is being withheld pending notification of next of kin. The driver cooperated with the investigation, and alcohol/drug intoxication were not suspected to be a factor in the collision. The investigation remains ongoing. Anyone who may have information regarding this collision is asked to call Long Beach Police Collision Investigation Detective David Whelan at (562) 570-7355. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1603,https://www.knoxvilletn.gov/government/city_departments_offices/community_empowerment/police_advisory_review_committee,Misc Police Activity,Police & Public Interactions,"","",404,"","","","","","","","" -1604,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2018_archived_news/september_2018/two_arlington_police_officers_honored_by_governor,Media Bulletins,Agency-Published Resources,Two Arlington Police Officers Honored by Governor with Star of Texas Award - City of Arlington,"",200,Just a moment...,"[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Two Arlington Police Officers Honored by Governor with Star of Texas Award""]",[],[],[],[],Skip to Content Skip to Content -1605,https://www.colma.ca.gov/question/how-do-i-get-a-copy-of-a-birth-certificate/,Resources,Agency-Published Resources,How do I get a copy of a birth certificate? - Town of Colma,"",200,Home - Town of Colma,"[""How do I get a copy of a birth certificate?""]","[""Primary menu links"", ""Action toolbar"", ""Contact"", ""Subscribe"", ""Connect""]",[],[],[],[],"Town of Colma Primary menu links About Residents Businesses Visitors City Council Departments Events News Contact Action toolbar Search Primary menu links About Residents Businesses Visitors City Council Departments Events News Contact Action toolbar Search Town of Colma Town of Colma Town of Colma How do I get a copy of a birth certificate? Birth certificates can be requested from the San Mateo County Clerk-Recorder’s Office if the document is registered in San Mateo County. For more information, please contact the San Mateo County Clerk-Recorder’s Office or at (650) 363-4500. How do I get a copy of a birth certificate? Birth certificates can be requested from the San Mateo County Clerk-Recorder’s Office if the document is registered in San Mateo County. For more information, please contact the San Mateo County Clerk-Recorder’s Office or at (650) 363-4500. Birth certificates can be requested from the San Mateo County Clerk-Recorder’s Office if the document is registered in San Mateo County. For more information, please contact the San Mateo County Clerk-Recorder’s Office or at (650) 363-4500. Helpful Share Facebook Twitter Email Size + Reset a − Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Contact Town of Colma 1198 El Camino Real Colma, CA 94014 (650) 997-8300 (650) 997-8308 (fax) Contact Links Directory Feedback Access Links Accessibility Sitemap Subscribe Connect Twitter Facebook Contact Town of Colma 1198 El Camino Real Colma, CA 94014 (650) 997-8300 (650) 997-8308 (fax) Contact Links Directory Feedback Access Links Accessibility Sitemap Subscribe Connect Twitter Facebook Contact Town of Colma 1198 El Camino Real Colma, CA 94014 (650) 997-8300 (650) 997-8308 (fax) Contact Links Directory Feedback Access Links Accessibility Sitemap Subscribe Connect Twitter Facebook Powered by Powered by " -1606,https://beaumonttexas.gov/beaumont-police-traffic-division-investigating-a-fatality-crash-eastex-frwy-and-chinn-ln/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1607,http://www.longbeach.gov/police/press-releases/lbpd-recruit-academy-graduation-ceremony-held-today/,Media Bulletins,Agency-Published Resources,LBPD RECRUIT ACADEMY GRADUATION CEREMONY HELD TODAY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/30/2017 FOR IMMEDIATE RELEASE Press Release # Subject: L.B.P.D. RECRUIT ACADEMY GRADUATION CEREMONY HELD TODAY Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department is pleased to announce the graduation of Recruit Academy Class #91. The graduation ceremony was held today, November 30, 2017, at the Long Beach Performing Arts Terrace Theater. Forty Long Beach Police Department recruits, three Garden Grove recruits, and two Redondo Beach Police Department recruits successfully completed 27 ½ weeks of intense academic, physical and practical training in areas such as: Patrol Procedures and Law Enforcement Tactics, Firearms Training, Weaponless Defense, Criminal Law, Vehicle Operations, Community Oriented Public Safety, Persons with Mental Health Disabilities, Cultural Diversity/Human Relations, and Procedural Justice. Class #91 brings a wide range of talents from a variety of backgrounds to the department. The graduating class included the following officers: The Long Beach Police Department congratulates the graduates and wishes them continued success in their future careers as law enforcement officers. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1608,http://beaverpolice.us/event/beaver-county-symphonic-wind-ensemble-concert/,Not Criminal Justice Related,Not Criminal Justice Related,Beaver County Symphonic Wind Ensemble Concert – Beaver Police Department,"",200,Beaver Police Department – © 2023 Beaver Police Department |,"[""Beaver County Symphonic Wind Ensemble Concert""]","[""© 2023 Beaver Police Department |"", ""© 2023 Beaver Police Department |""]","[""Archives"", ""Recent Comments"", ""Post navigation"", ""Subscribe to our Newsletter"", ""Upcoming Events""]",[],[],[],"© 2023 Beaver Police Department | © 2023 Beaver Police Department | Home Mission Our Officers Forms Frequently Asked Questions Calendar Departmental Officer Forms Gallery Home » Events » Beaver County Symphonic Wind Ensemble Concert Archives Archives Select Month Recent Comments Beaver County Symphonic Wind Ensemble Concert This entry was posted on May 26, 2015 by Rebecca Roberts Calendar Add to Calendar Add to Timely Calendar Add to Google Add to Outlook Add to Apple Calendar Add to other calendar Export to XML When: July 26, 2015 @ 7:00 pm 2015-07-26T19:00:00-04:00 2015-07-26T19:30:00-04:00 Where: Gazebo, Irvine Park 700 3rd Street Beaver, PA 15009 USA Contact: Beaver Borough 724-773-6700 Post navigation ← Turkey Trot Car Cruise → Search for: Subscribe to our Newsletter First name Last name Email * Upcoming Events There are no upcoming events. View Calendar Add Add to Timely Calendar Add to Google Add to Outlook Add to Apple Calendar Add to other calendar Export to XML · © 2024 Beaver Police Department · Powered by · Designed with the Customizr theme · © 2023 Beaver Police Department | © 2023 Beaver Police Department | Home Mission Our Officers Forms Frequently Asked Questions Calendar Departmental Officer Forms Gallery © 2023 Beaver Police Department | Home Mission Our Officers Forms Frequently Asked Questions Calendar Departmental Officer Forms Gallery © 2023 Beaver Police Department | Home Mission Our Officers Forms Frequently Asked Questions Calendar Departmental Officer Forms Gallery © 2023 Beaver Police Department | Home Mission Our Officers Forms Frequently Asked Questions Calendar Departmental Officer Forms Gallery Home Mission Our Officers Forms Frequently Asked Questions Calendar Departmental Officer Forms Gallery Home Mission Our Officers Forms Frequently Asked Questions Calendar Departmental Officer Forms Gallery Home » Events » Beaver County Symphonic Wind Ensemble Concert Archives Archives Select Month Recent Comments Beaver County Symphonic Wind Ensemble Concert This entry was posted on May 26, 2015 by Rebecca Roberts Calendar Add to Calendar Add to Timely Calendar Add to Google Add to Outlook Add to Apple Calendar Add to other calendar Export to XML When: July 26, 2015 @ 7:00 pm 2015-07-26T19:00:00-04:00 2015-07-26T19:30:00-04:00 Where: Gazebo, Irvine Park 700 3rd Street Beaver, PA 15009 USA Contact: Beaver Borough 724-773-6700 Post navigation ← Turkey Trot Car Cruise → Home » Events » Beaver County Symphonic Wind Ensemble Concert Home » Events » Beaver County Symphonic Wind Ensemble Concert Home » Events » Beaver County Symphonic Wind Ensemble Concert Home » Events » Beaver County Symphonic Wind Ensemble Concert Archives Archives Select Month Recent Comments Beaver County Symphonic Wind Ensemble Concert This entry was posted on May 26, 2015 by Rebecca Roberts Calendar Add to Calendar Add to Timely Calendar Add to Google Add to Outlook Add to Apple Calendar Add to other calendar Export to XML When: July 26, 2015 @ 7:00 pm 2015-07-26T19:00:00-04:00 2015-07-26T19:30:00-04:00 Where: Gazebo, Irvine Park 700 3rd Street Beaver, PA 15009 USA Contact: Beaver Borough 724-773-6700 Post navigation ← Turkey Trot Car Cruise → " -1609,https://hilliardohio.gov/tag/police-recruitment/,Poor Data Source,Poor Data Source,police recruitment,"",200,403 Forbidden,"[""""]","[""Residents"", ""It’s a place you can be proud to call home."", ""Government"", ""We exhibit a heart for service, dedication to excellence, and strength in teamwork."", ""Recreation & Parks"", ""We believe in health, wellness, and vibrant quality of life for our community."", ""Police & Courts"", ""Our badge shows we protect and serve. Our approach shows we're part of the community."", ""FAQ"", ""How can we assist you?"", ""LET'S CHAT!"", ""City of Hilliard"", ""Hilliard Police"", ""Rec & Parks"", ""Hilliard Newsletter""]","[""Filter News"", ""Archive""]","[""Have any news to share?"", ""There are no news articles under this category.""]",[],"[""Click the ‘x’ to opt out.""]",About Hilliard Accessing the Last Mile Aging in Place Committee Annual Events Available Properties Boards and Commissions Application Bridging The Digital Divide Building Standards Division Business Card Order Form Business Media Business Permitting Business Resources City Charter City Manager City of Hilliard – Home Collaborations for Technology Community Garden Community Resources Community Services and Programs Comprehensive Plan Contact the City Contact Us Demographics Designated Outdoor Refreshment Area (DORA) Disc Golf Discrimination Form Downtown Hilliard Downtown Hilliard Map Economic Development Electric Aggregation Engineering Division Ephemeral Wildflowers in Hilliard Fall Festival Feral Cats Fiber To The Home File a Report Online Food Waste Composting Program Forms and Applications HiFiO Hilliard City Lab Hilliard Development Corporation Hilliard Express Hilliard Public Arts Commission Hilliard Trails Hilliard’s Parks History Important Documents Incentives & Programs Information Technology Join the HPD Team Leaf Collection Lifestyle Major Employers Mapping Ohio’s Connectivity Mosquitos Neighborhood Crime Mapping Non Discrimination Now Hiring: Seasonal and Part-Time Positions Operations Department Opportunity Hilliard Personnel Review Board Planning Division Police Transparency in Policing Police Public Records Request Program Guide Public Bids Public Records Recreation and Parks – WebTrac RecTrac User Guide Recycling Roundabouts SAFE Sidewalk Program Sanitary Backflow Program Senior Programs Senior Resources Smart Streets Smart911 Social Investment Sponsorship Stationary Order Form Stormwater Management Street Maintenance & Rehabilitation Program Styrofoam Recycling Summer Rec Camp Sustainability Taxes The Well – Hilliard Recreation and Wellness Center Traffic Calming Traffic Enforcement Requests Transportation & Mobility Division Transportation Planning Trees Vacation House Check Victims Rights Videos Volunteer WebTrac Login Winter Weather Yard Waste Your Hilliard Residents Resident Resources Hilliard 311 Thank you Newsletter Signup Trash Rec & Parks Classes & Camps Rentals Master Parks Plan Pools & Passes The Senior Center Senior Citizen Hall of Fame Sports Government Newsroom Boards & Commissions Planning & Zoning Recreation and Parks Advisory Committee Records Commission Shade Tree Commission Environmental Sustainability Commission Keep Hilliard Beautiful Zoning Appeals Agendas & Minutes City Council Mayor’s Court Departments Community Development Finance Human Resources Law Q & A Business Communication Economic Development Emergency Alerts Fire Holidays HR Mayor’s Court Old Hilliard Police Rec & Parks Solicitation Taxes Trash Q&A Trees Q&A Reporting Online Library Norwich Township Schools Visit Hotels Old Hilliard News Privacy & Usage Policy Sitemap Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Accessibility by WAH Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Font Resize A- A+ Font Resize A- A+ Keyboard navigation Keyboard navigation Readable Font Readable Font Contrast Choose color black white green blue red orange yellow navi Contrast Choose color black white green blue red orange yellow navi black white green blue red orange yellow navi Clear cookies Clear cookies Accessibility by WAH Accessibility by WAH -1610,https://brookfieldil.gov/publication/050609-may-6-2009-fire-and-police-commission/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1611,https://www.southamptontownnypolice.gov/faq.aspx?qid=262,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Why do the fire marshals perform business inspections,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Public Safety - Fire Prevention""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1612,https://www.sandiego.gov/department-document/police-identify-burned-homicide-victim-bay-park,Media Bulletins,Agency-Published Resources,Police Identify Burned Homicide Victim In Bay Park | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Police Identify Burned Homicide Victim In Bay Park"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -1613,https://delcopa.gov/council/2018minutes/101718minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1615,https://alpha.austin.gov/es/police-oversight/2020-06-09-14/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1616,https://delcopa.gov/sustainability/presentations/22/12_victordonnay_v2.pptx,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1617,https://coloradosprings.gov/police-department/page/cspd-community-survey,Poor Data Source,Poor Data Source,"","",403,"","","","","","","","" -1618,http://chico.ca.us/post/chico-police-officer-mark-bass-honored-chico-noon-exchange-74th-annual-peace-officer-year,Media Bulletins,Agency-Published Resources,City of Chico - Site Search,"",200,City of Chico - Home,"[""City of Chico"", ""City of Chico""]","[""Site Search""]","[""Contact Us"", ""Quicklinks"", ""City Resources"", ""Stay Connected"", ""Contact Us"", ""Quicklinks"", ""Follow\n \n City of Chico""]",[],[],[],skip to main content -1619,https://www.roseville.ca.us/government/departments/police_department/community_services/my_neighborhood_officer/beat_4,Resources,Agency-Published Resources,Beat 4 - City of Roseville,"",200,Just a moment...,"[""City of Roseville""]","[""Beat 4""]","[""Roseville Police Department""]",[],[],[],"" -1620,http://www.longbeach.gov/police/press-releases/murder-suicide-1500-block-of-park-avenue/,Media Bulletins,Agency-Published Resources,MURDER SUICIDE 1500 BLOCK OF PARK AVENUE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/13/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER SUICIDE 1500 BLOCK OF PARK AVENUE Contact: Media Relations Detail (562) 570-5273 On September 13, 2016, at approximately 6:35 a.m., Long Beach Police were dispatched to a possible attempt suicide call in the 1500 block of Park Avenue. Upon arrival officers found two individuals unconscious and not breathing suffering from apparent stab wounds to their upper torsos. Long Beach Fire Department personnel responded and determined the subjects deceased at the scene. Further investigation found that the incident was an apparent murder suicide. Homicide detectives were requested and responded to handle the investigation. The victim has been identified as 8 week old Shane Ventanilla. The individual responsible for his death and then taking her own life is the mother, 36 year old Charlene Ventanilla. Anyone with additional information is urged to contact Homicide Detectives Mark Mattia and Don Goodman at (562) 570-7244. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/13/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER SUICIDE 1500 BLOCK OF PARK AVENUE Contact: Media Relations Detail (562) 570-5273 On September 13, 2016, at approximately 6:35 a.m., Long Beach Police were dispatched to a possible attempt suicide call in the 1500 block of Park Avenue. Upon arrival officers found two individuals unconscious and not breathing suffering from apparent stab wounds to their upper torsos. Long Beach Fire Department personnel responded and determined the subjects deceased at the scene. Further investigation found that the incident was an apparent murder suicide. Homicide detectives were requested and responded to handle the investigation. The victim has been identified as 8 week old Shane Ventanilla. The individual responsible for his death and then taking her own life is the mother, 36 year old Charlene Ventanilla. Anyone with additional information is urged to contact Homicide Detectives Mark Mattia and Don Goodman at (562) 570-7244. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ A- A A+ A- A A+ A- A A+ " -1621,https://www.happyvalleyor.gov/services/police-department/reporting-accidents/,Resources,Agency-Published Resources,Reporting Accidents | City of Happy Valley,"",200,403 Forbidden,"[""Reporting Accidents""]","[""City Hall"", ""Business"", ""Community"", ""How Do I?""]","[""City of Happy Valley"", ""Government"", ""Take Action""]","[""16000 SE Misty Drive, Happy Valley, OR 97086"", ""(503) 783-3800 | info@happyvalleyor.gov""]","[""Oregon law requires that drivers involved in an accident file an accident report if the accident involves any of the following conditions:""]","[""General"", ""Departments"", ""Boards & Commissions"", ""General"", ""Resources"", ""Divisions"", ""General"", ""Amenities"", ""Services""]","City Hall Business Community How Do I Search Dark Dark Dark City Hall Explore General Advertisements, Bids and Proposals City Council City Manager City Recorder Diversity, Equity and Inclusion Fee Schedule Finance Management Team Meeting Agendas & Videos Municipal Code Youth Council Departments Building Division Code Enforcement Community Services Economic & Community Development Engineering Division Municipal Court Planning Division Police Public Works All Departments & Divisions Boards & Commissions Budget Committee Design Review Board Committee Hearings Officer Library Board Parks Advisory Committee Planning Commission Public Art Committee Traffic & Public Safety Committee City Hall Explore General Advertisements, Bids and Proposals City Council City Manager City Recorder Diversity, Equity and Inclusion Fee Schedule Finance Management Team Meeting Agendas & Videos Municipal Code Youth Council Departments Building Division Code Enforcement Community Services Economic & Community Development Engineering Division Municipal Court Planning Division Police Public Works All Departments & Divisions Boards & Commissions Budget Committee Design Review Board Committee Hearings Officer Library Board Parks Advisory Committee Planning Commission Public Art Committee Traffic & Public Safety Committee City Hall Explore General Advertisements, Bids and Proposals City Council City Manager City Recorder Diversity, Equity and Inclusion Fee Schedule Finance Management Team Meeting Agendas & Videos Municipal Code Youth Council Departments Building Division Code Enforcement Community Services Economic & Community Development Engineering Division Municipal Court Planning Division Police Public Works All Departments & Divisions Boards & Commissions Budget Committee Design Review Board Committee Hearings Officer Library Board Parks Advisory Committee Planning Commission Public Art Committee Traffic & Public Safety Committee City Hall Explore General Advertisements, Bids and Proposals City Council City Manager City Recorder Diversity, Equity and Inclusion Fee Schedule Finance Management Team Meeting Agendas & Videos Municipal Code Youth Council Departments Building Division Code Enforcement Community Services Economic & Community Development Engineering Division Municipal Court Planning Division Police Public Works All Departments & Divisions Boards & Commissions Budget Committee Design Review Board Committee Hearings Officer Library Board Parks Advisory Committee Planning Commission Public Art Committee Traffic & Public Safety Committee Business Grow Your Business General Business Licenses OLCC SDCs & Excise Taxes Resources Government and Local Business Demographic Information Happy Valley Business Alliance (HVBA) Divisions Economic & Community Development Economic Development Division Planning Division Engineering Division Building Division Business Grow Your Business General Business Licenses OLCC SDCs & Excise Taxes Resources Government and Local Business Demographic Information Happy Valley Business Alliance (HVBA) Divisions Economic & Community Development Economic Development Division Planning Division Engineering Division Building Division Business Grow Your Business General Business Licenses OLCC SDCs & Excise Taxes Resources Government and Local Business Demographic Information Happy Valley Business Alliance (HVBA) Divisions Economic & Community Development Economic Development Division Planning Division Engineering Division Building Division Business Grow Your Business General Business Licenses OLCC SDCs & Excise Taxes Resources Government and Local Business Demographic Information Happy Valley Business Alliance (HVBA) Divisions Economic & Community Development Economic Development Division Planning Division Engineering Division Building Division " -1622,https://www.gov.ca.gov/2020/04/02/governor-newsom-statement-on-death-of-santa-rosa-police-detective/,Poor Data Source,Poor Data Source,Governor Newsom Statement on Death of Santa Rosa Police Detective | California Governor,SACRAMENTO — Governor Gavin Newsom today issued the following statement regarding the death of Santa Rosa Police Department Detective Marylou Armer: “Jennifer…,200,403 Forbidden,"[""Governor Newsom Statement on Death of Santa Rosa Police Detective""]",[],[],"[""Recent News"", ""Archives"", ""Categories""]",[],[],Skip to Main Content CA.gov Home Share via Facebook Share via Instagram TikTok Share via Twitter Share via YouTube Settings CA.gov Home Share via Facebook Share via Instagram TikTok Share via Twitter Share via YouTube Settings CA.gov Home Share via Facebook Share via Instagram TikTok Share via Twitter Share via YouTube Settings CA.gov Home Share via Facebook Share via Instagram TikTok Share via Twitter Share via YouTube CA.gov Settings Default High Contrast Reset Increase Font Size Font Increase Decrease Font Size Font Decrease Dyslexic font × Default High Contrast Reset Increase Font Size Font Increase Decrease Font Size Font Decrease Dyslexic font × Default High Contrast Default High Contrast Reset Increase Font Size Font Increase Decrease Font Size Font Decrease Reset Increase Font Size Font Increase Decrease Font Size Font Decrease Dyslexic font Search Menu Search Menu Home About Governor Newsom First Partner Newsroom Appointments Appointments Judicial First Partner First Partner Jennifer Siebel Newsom California For All Women California For All Kids #MetoWe Contact Contact Scheduling Request Custom Google Search Submit Close Search About Governor Newsom First Partner Governor Newsom First Partner Appointments Appointments Judicial Appointments Judicial First Partner First Partner Jennifer Siebel Newsom California For All Women California For All Kids #MetoWe First Partner Jennifer Siebel Newsom California For All Women California For All Kids #MetoWe Contact Contact Scheduling Request Contact Scheduling Request Custom Google Search Submit Close Search Custom Google Search Submit Close Search Close Search -1623,https://www.milpitas.gov/milpitas/departments/police/recruitment-training/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1624,http://www.longbeach.gov/police/press-releases/arsonist-sought-in-flag-burning-case/,Media Bulletins,Agency-Published Resources,ARSONIST SOUGHT IN FLAG BURNING CASE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1625,https://delcopa.gov/departments/womenscommission/20history.html,Not Criminal Justice Related,Not Criminal Justice Related,"Women's History Month 2020 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Women's History Month 2020""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""The Delaware County Women's Commission postponed the Women's History Month Breakfast originally scheduled for March 25, 2020, rescheduled to May 13, 2020, then eventually cancelled."", ""The 2020 theme, rolled into the 2021 theme since “Valiant Women of the Vote” was such a significant anniversary of the right to vote for women in 1920!. Unfortunately, due to the pandemic, we did not celebrate in person in 2021. However, our winners received recognition at the County Council meeting on March 17, 2021 and received a gift card in the following month to recognize their achievement.""]",[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Women's History Month 2020 Home / Departments / Women's Commission / Women's History Month 2020 The Delaware County Women's Commission postponed the Women's History Month Breakfast originally scheduled for March 25, 2020, rescheduled to May 13, 2020, then eventually cancelled. The 2020 theme, rolled into the 2021 theme since “Valiant Women of the Vote” was such a significant anniversary of the right to vote for women in 1920!. Unfortunately, due to the pandemic, we did not celebrate in person in 2021. However, our winners received recognition at the County Council meeting on March 17, 2021 and received a gift card in the following month to recognize their achievement. Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Women's History Month 2020 Home / Departments / Women's Commission / Women's History Month 2020 Women's History Month 2020 Home / Departments / Women's Commission / Women's History Month 2020 Women's History Month 2020 Home / Departments / Women's Commission / Women's History Month 2020 The Delaware County Women's Commission postponed the Women's History Month Breakfast originally scheduled for March 25, 2020, rescheduled to May 13, 2020, then eventually cancelled. The 2020 theme, rolled into the 2021 theme since “Valiant Women of the Vote” was such a significant anniversary of the right to vote for women in 1920!. Unfortunately, due to the pandemic, we did not celebrate in person in 2021. However, our winners received recognition at the County Council meeting on March 17, 2021 and received a gift card in the following month to recognize their achievement. " -1626,http://www.longbeach.gov/police/press-releases/traffic-fatality-spring-street-west-of-el-dorado-park/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY - Spring Street West of El Dorado Park,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/12/2018 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY - SPRING STREET WEST OF EL DORADO PARK Contact: Media Relations Detail (562) 570-5273 On Wednesday, November 7, 2018, at approx. 4:40 a.m., officers were dispatched to Spring Street near El Dorado Park regarding a traffic collision involving a vehicle and bicyclist, which resulted in the death of the bicyclist several days later. When officers arrived, they located a bicyclist in the roadway who had sustained major head and body trauma. Long Beach Fire Department paramedics arrived, and transported the bicyclist to a local hospital. The preliminary investigation revealed the bicyclist was riding in the middle of lane number three, travelling westbound Spring Street west of El Dorado Park. As he approached the San Gabriel River, he was struck from behind by a 2007 Honda Accord being driven by a 53-year-old male resident of Cypress, also travelling westbound Spring Street in the number three lane. The driver of the Honda remained at the scene, cooperated with the investigation, and was released pending further investigation. The bicyclist, identified as 39-year-old Bryan Lembke of Crestline, remained hospitalized, and on Sunday, November 11, 2018, was pronounced deceased. Anyone with information or who may have witnessed the collision is asked to contact Accident Investigation Detective Sirilo Garcia at (562) 570-7355. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1627,https://www.southamptontownnypolice.gov/faq.aspx?qid=510,Resources,Agency-Published Resources,FAQs • How can I purchase a Village permit?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Parks & Rec""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1628,https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-42/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1629,https://ci.newcastle.wa.us/departments/police/e-_alerts,Resources,Agency-Published Resources,E-News - City of Newcastle,"",200,Just a moment...,[],"[""City of Newcastle""]",[],"[""City of Newcastle Washington"", ""Newsletters"", ""Public Meeting Notices"", ""Employment Opportunities""]",[],[],"" -1630,http://www.longbeach.gov/police/press-releases/traffic-fatality-pch--myrtle-ave/,Media Bulletins,Agency-Published Resources,Traffic Fatality PCH / Myrtle Ave,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/8/2017 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY - PACIFIC COAST HIGHWAY & MYRTLE AVENUE Contact: Media Relations Detail (562) 570-5273 On December 8, 2017 at approximately 8:52 P.M. Officers from the Long Beach Police Department responded to Pacific Coast Highway and Myrtle Avenue on a report of a vehicle versus a pedestrian traffic collision. When Officers arrived they found that the collision involved a 2010 Chrysler 300, being driven by a 58-year-old male resident of Cypress, and a male pedestrian who appeared to be in his mid to late 20s. The preliminary investigation revealed the driver of the Chrysler was traveling westbound on Pacific Coast Highway and struck the pedestrian who was attempting to cross Pacific Coast Highway at Myrtle Ave. The pedestrian was not in a crosswalk at the time of the collision. The driver of the Chrysler stopped and immediately called Long Beach Police for assistance. He remained on scene and cooperated with officers during the investigation. He was found to have a valid license and not under the influence of alcohol at the time of the accident. The male pedestrian was transported to a local hospital in critical condition where he later succumbed to his injuries. No identification was found on the pedestrian. The Los Angeles County Coroner’s Office will attempt to identify him and notify next of kin. The investigation is ongoing and anyone who may have witnessed this accident is asked to call Detective David Lauro of the Long Beach Police Department Collision Investigation Detail at (562) 570-7355. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1631,https://www.mass.gov/doc/05-14-15-police-and-school-officials-attend-da-morrisseys-safe-and-supportive-schools-0/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1632,https://www.mass.gov/doc/emergencywaiverpcopdf/download,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1633,https://www.antioch.il.gov/wpfb-file/12-13-11-police-pension-fund-agenda-pdf-4/,Policies & Contracts,Info About Agencies,"12-13-11 Police Pension Fund Agenda - Antioch, IL",13491 12 13 11 police pension fund agenda pdf commissions agendas 2011 1625758338 7fbda0786265e371ec5e6ffad4bd173e 56c15fa57ff824b7283a17b27825a5436651578c6fa9ea2e742221c5e8297cba 217x300 _1l28v3ffmhil thumb jpg 2017 05 17 08 41 32 0 157 55 39 34 2021 06 02 49 25 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17,200,"Home - Antioch, IL","[""12-13-11 Police Pension Fund Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -1634,https://www.mass.gov/doc/state-police-academy-rules-and-regulations/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -1635,https://www.crystalmn.gov/how_do_i____/contact/police_department,Contact Info & Agency Meta,Info About Agencies,Contact Us - City of Crystal-Police,Locations and contact information to the City of Crystal Police Department.,200,Just a moment...,"[""Contact Us""]","[""Police Chief"", ""Deputy Police Chief""]","[""Sign up for a city newsletter or notification."", ""Police Department"", ""Lobby Hours:""]","[""Monday - Friday""]",[],[],"" -1636,https://www.roundrocktexas.gov/news/police-investigate-new-years-eve-auto-pedestrian-collision/,Media Bulletins,Agency-Published Resources,Police investigate New Year's Eve auto-pedestrian collision - City of Round Rock,"",200,403 Forbidden,[],[],"[""Police investigate New Year’s Eve auto-pedestrian collision""]","[""Site Search"", ""Follow Us""]",[],[],"Home News Jobs Calendar Menu Home News Jobs Calendar Home About Round Rock Awards and Accolades Blogs Contact Us City Council City Council Members Elections (Elecciones) Downtown Round Rock New Residents Resident Parking Permits News Projects Visitors Services Payment Center Departments Administration Arts and Culture City Attorney Communications and Marketing Community and Neighborhood Services Finance Fire General Services Geospatial Services Human Resources Library Municipal Court Parks and Recreation Planning and Development Services Police Purchasing Sports Management and Tourism Transportation Utilities and Environmental Services Utility Billing Businesses Construction Inspection Services Economic Development Geospatial Services Locating a Business in Round Rock Pay Business Utility Bill Solicitations Solicitor Permits Vendor Registration Water Menu Home About Round Rock Awards and Accolades Blogs Contact Us City Council City Council Members Elections (Elecciones) Downtown Round Rock New Residents Resident Parking Permits News Projects Visitors Services Payment Center Departments Administration Arts and Culture City Attorney Communications and Marketing Community and Neighborhood Services Finance Fire General Services Geospatial Services Human Resources Library Municipal Court Parks and Recreation Planning and Development Services Police Purchasing Sports Management and Tourism Transportation Utilities and Environmental Services Utility Billing Businesses Construction Inspection Services Economic Development Geospatial Services Locating a Business in Round Rock Pay Business Utility Bill Solicitations Solicitor Permits Vendor Registration Water Police investigate New Year’s Eve auto-pedestrian collision January 8, 2021 12:08 pm The victim in the New Year’s Eve auto-pedestrian collision has been identified as Robert Norton, a 60-year-old Round Rock resident. He sustained critical injuries and is currently hospitalized. Norton was crossing the roadway in the 1100-block of East Palm Valley Blvd. (near Georgetown Street) around 11 p.m. on Dec. 31. The vehicle left the scene. The suspect vehicle is a dark-colored, four-door pickup truck (see photo). Individuals with information can contact the Round Rock Police at 512-218-5500 or jschultz@roundrocktexas.gov. Anonymous tips can be submitted here: https://www.citizenobserver.com/cov6/app/webTipForm.html?id=5853 RECENT NEWS Dell Diamond to host Round Rock Express Fan Fest March 21, 2024 12:52 pm New performing arts venue planned in Round Rock following grant approval March 20, 2024 7:16 pm Music on Main kicks off new season in Downtown Round Rock March 20, 2024 6:20 pm Bulk item pickup scheduled for April in Round Rock March 18, 2024 10:07 am Experience the Round Rock Junior Police Academy March 6, 2024 3:58 pm VIEW ALL CITY NEWS SHARE SUBSCRIBE TO NEWSFLASH Round Rock’s digital newsletter providing residents news, events and general information regarding city government. SUBSCRIBE Prev Previous Lane closures scheduled for A.W. Grimes, Greenlawn Boulevards on Dec. 21 Next City earns final star for financial transparency Next Home About Services Departments Businesses Menu Home About Services Departments Businesses Quick Links News Calendar Jobs City Council Sitemap Website Feedback Services Service Request Service Directory Payment Center Development/Permit Tracker Open Records Center Public Notices Stay Connected Staff Directory Mobile Apps Alerts Sign Up E-Subscribe City of Round Rock 221 East Main Street Round Rock, TX 78664 512-218-5400 Site Search Search Search Follow Us Facebook Home Youtube Instagram " -1637,http://www.longbeach.gov/police/press-releases/murder-investigation8/,Media Bulletins,Agency-Published Resources,MURDER INVESTIGATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/13/2019 FOR IMMEDIATE RELEASE Press Release # Subject: MURDER INVESTIGATION Contact: Media Relations Detail (562) 570-5273 LBPDMediaRelations@longbeach.gov On January 12, 2019, at approximately 11:50 p.m., officers were dispatched to a local hospital to assist the Los Angeles Sheriff’s Department with a victim of a gunshot wound to the upper torso. The preliminary investigation indicates a female and male witnesses brought the victim to a hospital in Lakewood, CA. The victim later succumbed to her injuries and was pronounced deceased. Witnesses could not provide details of where the incident occurred, a possible location in the area of Paramount and South was searched but no evidence of a shooting was found. The victim is being identified as 25-year-old Keshawn Castilow of Anaheim, CA. Anyone with information regarding the incident is urged to contact LBPD Homicide Detectives Sean Irving, Ben Vargas, and Ricardo Solorio at (562) 570-7244. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1638,https://www.roseville.ca.us/news/archive_news/2017_archive_news/police_digest_120117,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1639,https://www.huntsvilleal.gov/organizer/huntsville-police-department/,Misc Police Activity,Police & Public Interactions,Huntsville Police Department – City of Huntsville,"",200,403 Forbidden,"[""City Calendar""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],[],[],[],Main Menu Main Menu Residents Back Residents Animal Services Neighborhoods Public Safety Volunteer Cemeteries Pay a Ticket Streets & Transportation Water & Sewer Garbage & Recycling Parks & Recreation Resident Toolkit Business Back Business About Huntsville Big Picture GIS Maps & Data Employment Bid A Project Codes & Ordinances Economic Development File A Claim E-Bids Pay Taxes Licensing & Permits Development Back Development Bid A Project Economic Development MPO Streets & Roadwork Building & Construction GIS Maps Planning Water & Sewer Big Picture Master Plan Historic Preservation ePlans Submittal Environment Back Environment Air Quality Garbage & Recycling Noise Sustainability Find A Park Nature Preserves Recreation Water Trails & Greenways Pets Lost & Found Green Team Government Back Government Boards & Commissions City Council Finances & Budget Media Center City Calendar Departments Mayor's Office Municipal Court Vote Find A Job Codes & Ordinances Services Toggle Menu City of Huntsville Search Search for: Government City Calendar Loading view. There were no results found. There were no results found. Events Organizers Huntsville Police Department Today Upcoming Upcoming Select date. Previous Events Today Next Events Previous Events Today Next Events Subscribe to calendar Google Calendar iCalendar Outlook 365 Outlook Live Export .ics file Export Outlook .ics file Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Toggle Menu Search Search Search for: Search for: Search for: Search for: Search for: Search for: Government City Calendar Loading view. There were no results found. There were no results found. Events Organizers Huntsville Police Department Today Upcoming Upcoming Select date. Previous Events Today Next Events Previous Events Today Next Events Subscribe to calendar Google Calendar iCalendar Outlook 365 Outlook Live Export .ics file Export Outlook .ics file Government City Calendar Loading view. There were no results found. There were no results found. Events Organizers Huntsville Police Department Today Upcoming Upcoming Select date. Previous Events Today Next Events Previous Events Today Next Events Subscribe to calendar Google Calendar iCalendar Outlook 365 Outlook Live Export .ics file Export Outlook .ics file Government City Calendar Loading view. There were no results found. There were no results found. Events Organizers Huntsville Police Department Today Upcoming Upcoming Select date. Previous Events Today Next Events Previous Events Today Next Events Subscribe to calendar Google Calendar iCalendar Outlook 365 Outlook Live Export .ics file Export Outlook .ics file Government City Calendar Government City Calendar Loading view. There were no results found. There were no results found. Events Organizers Huntsville Police Department Today Upcoming Upcoming Select date. Previous Events Today Next Events Previous Events Today Next Events Subscribe to calendar Google Calendar iCalendar Outlook 365 Outlook Live Export .ics file Export Outlook .ics file -1640,https://brimfieldohio.gov/event/bpd-coffee-with-a-cop/,Misc Police Activity,Police & Public Interactions,"","",404,"","","","","","","","" -1641,https://shelbycity.oh.gov/wp-content/uploads/2020/03/downtown-flag-dark-copy-150x150.jpg,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1642,https://delcopa.gov/ampembed?url=https://delcowebmedia2-usea.streaming.media.azure.net/79bc7ec7-9862-4100-bfd8-06a71de3d5af/delaware county covid-19 memoria.ism/manifest,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -1643,https://police.greenvillesc.gov/faq.aspx?qid=63,Resources,Agency-Published Resources,FAQs • How can I find information about a specific city prop,"",200,"Police Department | Greenville, SC - Official Website",[],"[""▼ Planning & Zoning""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -1644,https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-courtesy-department-issued-bwc/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1645,http://edmonstonmd.gov/departments-services/police/photo-enforcement/,Resources,Agency-Published Resources,"","",404,"","","","","","","","" -1646,https://health.wyo.gov/publichealth/office-of-performance-improvement-and-health-equity/sha/health-improvement-strategy/copy-of-ship-access-cga-video-es/,Resources,Agency-Published Resources,Copy of SHIP-Access-CGA Video-ES - Wyoming Department of Health,"",200,403 Forbidden,"[""Copy of SHIP-Access-CGA Video-ES""]","[""Office of Training, Performance, and Equity""]",[],[],"[""Contact Info:""]","[""Contact Us""]","" -1647,https://www.mass.gov/doc/flaherty-and-mccarthy-v-boston-police-department-12909/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -1648,https://www.mass.gov/doc/municipal-police-training-committee-cjt/download,Poor Data Source,Poor Data Source,"","",403,"","","","","","","","" -1649,https://delcopa.gov/council/2016minutes/080316minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1651,https://coloradosprings.gov/police-department/article/news/traffic-fatality-1200-block-north-academy,Media Bulletins,Agency-Published Resources,Traffic Fatality: 1200 Block of North Academy Boulevard | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Traffic Fatality: 1200 Block of North Academy Boulevard""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -1652,https://delcopa.gov/planning/pubs/saldoappenixcpreliminary.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1653,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/040421summary.pdf,Daily Activity Logs,Info About Officers,"","",404,"","","","","","","","" -1654,http://www.longbeach.gov/police/press-releases/found---critical-missing-person---/,Media Bulletins,Agency-Published Resources,FOUND---CRITICAL MISSING PERSON---,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/18/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: FOUND---CRITICAL MISSING PERSON--- Contact: Media Relations Detail (562) 570-5273 (Click on photo to enlarge) Update: Mr. David Seldes, who was reported missing on April 17, 2014, was found in a Huntington Beach hospital, around 10:30 p.m. on April 18, 2014. He appeared to be unharmed and was reunited with the assisted living staff. Original News Release: The Long Beach Police Department is asking for the public's help in locating an elderly man who suffers from dementia and requires medication, who walked away from an assisted living facility located in the 3100 block of E. Artesia Boulevard. The victim was last seen at the facility on Thursday, April 17th at approximately 11:30 a.m., and discovered missing later in the day. He also went missing back in February of 2014, and was found in the City of Industry. The victim is described as follows: Name: DAVID SELDES Age: 78-YEARS Gender: MALE Race: WHITE Hair/Eyes: GREY/HAZEL Height: 5’8"" Weight: 120 Clothing: BROWN JACKET, RED T-SHIRT, BLUE JEANS, BLACK SHOES The Long Beach Police Department continues to search for the victim. Local hospitals have been alerted and area law enforcement and public transportation agencies have also been notified. Anyone sees the victim or has information on his whereabouts is asked to call the Long Beach Police Department at (562) 435-6711 or 9-1-1 This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1655,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-2-/,Media Bulletins,Agency-Published Resources,DUI Saturation Patrol(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/26/2017 FOR IMMEDIATE RELEASE Press Release # Subject: DUI SATURATION PATROL NETS THREE ARRESTS Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department’s Traffic Unit conducted a DUI Saturation Patrol on Saturday, April 22nd, from 6:00 p.m. to 2:00 a.m. High Visibility Enforcement efforts like this have a deterrent effect, lowering the incidents of impaired driving. The operation produced the following results: 36 vehicle enforcement stops 6 Standardized Field Sobriety Tests completed 3 DUI-alcohol suspects arrested 10 citations issued for unsafe driving Drivers are encouraged to download the Designated Driver VIP, or “DDVIP,” free mobile app for Android or iPhone. The DDVIP app helps find nearby bars and restaurants that feature free incentives for the designated sober driver, from free non-alcoholic drinks to free appetizers and more. The feature-packed app even has social media tie-ins and even a tab for the non-DD to call Uber, Lyft, or Curb. Studies of California drivers have shown that 30 percent of drivers in fatal crashes had one or more drugs in their systems. A study of active drivers showed more tested positive for drugs that may impair driving (14 percent) than did for alcohol (7.3 percent). Of the drugs, marijuana was most prevalent, at 7.4 percent, slightly more than alcohol. Drivers caught driving impaired can expect the impact of a DUI arrest to include jail time, fines, fees, DUI classes, license suspension and other expenses that can exceed $10,000 not to mention the embarrassment when friends and family find out. Long Beach PD will be conducting another DUI Saturation on Friday May 5, in our ongoing commitment to lowering deaths and injuries upon our streets and highways. The DUI Saturation Patrol was funded by a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration, reminding everyone to ‘Report Drunk Drivers - call 9-1-1’. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1656,https://www.mass.gov/info-details/audit-of-the-worcester-state-university-objectives-scope-and-methodology,Not Criminal Justice Related,Not Criminal Justice Related,"Audit of the Worcester State University Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Worcester State University,200,Mass.gov,"[""Audit of the Worcester State University Objectives, Scope, and Methodology""]","[""Table of Contents for the audit, Audit of the Worcester State University"", ""Table of Contents"", ""Overview"", ""Data Reliability"", ""Conclusion"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[],"" -1657,https://wrightstown.us/police-crime-prevention-programs/neighborhood-watch/img_2876/,Poor Data Source,Poor Data Source,IMG_2876 - Village of Wrightstown,"",200,"Village of Wrightstown, Wisconsin ~ Official Website","[""IMG_2876""]","[""Recent News"", ""Upcoming Events""]","[""Good Friday"", ""Easter"", ""April Fool’s Day"", ""Easter Monday"", ""Earth Day""]","[""Village Hall"", ""Public Works"", ""Police Department"", ""Fire Department"", ""Join Us on Social Media""]",[],[],"920-532-5567 info@wrightstown.us Job Opportunities Map Upcoming Events Recent News Village Photos Menu Home Government History Mission Statement, Vision Statement, and Code of Ethics Municipal Court History of Wrightstown Municipal Court Municipal Court Procedures Municipal Court FAQ’s Municipal Court Payments Municipal Court Forms Municipal Court Public Records Request Close Close Departments Clerk / Treasurer Assessor Building Permits/Inspections Building Permit Application Elections Dog Licenses Operator’s License Agendas 2024 Budgets 2023 Minutes 2024 Minutes Minutes Archive Police Police Vision • Mission • Values Police Community Information Driving in School Zones Fireworks Safety Snowmobile Information Sex Offender Information Close Police Department Employees Police Crime Prevention Programs Coffee with a Cop Prescription Drug Drop Off Neighborhood Watch Property Watch Close Salvage Vehicle Inspection Program Police Reports Open Records Request Police FAQ’s Police Helpful Links Police Job Opportunities Public Works & Utilities Water Utility Sewer Utility Water & Sewer Rates Brush Chipping, Compost & Yard Waste Site Parks & Recreation Storm Water Collection Solid Waste & Recycling Street Operations Administration Planning / Zoning 2016 Comprehensive Plan Municipal Codes Fire Department Burning Permit Application Employment Application Fire Inspections Frequently Asked Questions Close Residents & Visitor Info Business Contact Select Page IMG_2876 Recent News New DPW Garage & Compost Site 886 Mallard Rd March 12, 2024 Dog Licenses due March 31st February 13, 2024 2024 Annual Boat Launch Stickers February 2, 2024 Winter News 2023 December 13, 2023 All-Night Parking Restrictions Nov. 1-Mar. 31 November 1, 2023 Upcoming Events Mar 29 All day Good Friday Mar 31 All day Easter Apr 1 All day April Fool’s Day Apr 1 All day Easter Monday Apr 22 All day Earth Day View Calendar Village Hall 352 High Street Wrightstown, WI 54180 Phone: 920-532-5567 Mon, Wed, Thur: 8:00am – 4:30pm Tues: 8:00am – 6:00pm Friday 8:00am to Noon Public Works 101 Washington Street Wrightstown, WI 54180 Phone: 920-532-0434 Monday – Friday 7:00am – 3:30p After Hours On Call Phone 920-606-6426 Police Department 352 High Street Wrightstown, WI 54180 911 for emergencies Phone: 920-532-6007 for non-emergencies and other police related issues Fire Department 961 Broadway Street Wrightstown, WI 54180 911 for emergencies Phone: 920-532-4556 for non-emergencies Join Us on Social Media Home History Map Business Event Calendar Recent News Contact Wrightstown Web Mail Village of Wrightstown © All Rights Reserved | Established in 1901 | Fox River Valley • Wisconsin | Website Design & Development: Fox Valley Web Design LLC 920-532-5567 info@wrightstown.us Job Opportunities Map Upcoming Events Recent News Village Photos 920-532-5567 info@wrightstown.us Job Opportunities Map Upcoming Events Recent News Village Photos 920-532-5567 info@wrightstown.us Job Opportunities Map Upcoming Events Recent News Village Photos " -1658,https://southamptontownnypolice.gov/214/transportation-traffic-safety,Not Criminal Justice Related,Not Criminal Justice Related,"Municipal Work's - Transportation & Traffic Safety | Southampton, NY - Official Website",Find out what the responsibilities are for the Intermodal Transportation Division.,200,"Police | Southampton, NY - Official Website","[""Municipal Work's - Transportation & Traffic Safety""]","[""Traffic Safety"", ""Transportation Commission"", ""Public Transportation"", """"]","[""Site Tools"", ""Contact Us"", ""Department of Municipal Works"", ""FAQs"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1659,https://www.rentonwa.gov/city_hall/police/staff_services,Resources,Agency-Published Resources,Staff Services - City of Renton,"Staff services provide Fingerprint Services, Concealed Pistol License, Public Record Requests, Med-Project Kiosk.",200,Just a moment...,"[""CITY OF RENTON WASHINGTON""]","[""Staff Services""]",[],"[""Concealed Pistol License"", ""Do you live within the Renton City limits?"", ""For an Original Concealed Pistol License"", ""Fee"", ""Renewing Concealed Pistol Licenses"", ""Fees"", ""Public Records Requests"", ""Med-Project Kiosk"", ""Not Accepted""]","[""S. Cour, Manager""]","[""Staff Services Division""]",Skip navigation -1660,http://beaverpolice.us/staff-members/eric-schwartz/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1661,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0159/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1662,http://www.ryepolice.us/announcements/new-rye-animal-control-instragram/attachment/dumpster-divers,Poor Data Source,Poor Data Source,Rye Police Department Dumpster Divers - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Dumpster Divers""]","[""Dumpster Divers""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"­ Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Dumpster Divers Home Dumpster Divers Dumpster Divers September 6, 2019 Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search " -1663,https://www.wakeforestnc.gov/police/public-information/firing-range,Resources,Agency-Published Resources,"Firing Range | Town of Wake Forest, NC","The Wake Forest Police Department operates it's own firing range. Located behind the Flaherty Park Community Center, 1226 N. White St., the firing range is surrounded by a security fence that is locked at all times, unless in use by police department personnel. The firing range is NOT open to the public.The range is utilized by the department for required yearly qualifications",200,"Town of Wake Forest, NC","[""Firing Range""]","[""six_sundays.jpg"", ""Town Hall Closed Friday, March 29"", ""Search form"", ""You are here""]",[],[],[],"[""2024 Training Schedule""]",Skip to main content -1664,https://www.antioch.il.gov/wpfb-file/coffee-with-the-cop-oct-pdf/,Misc Police Activity,Police & Public Interactions,"Coffee With The Cop Oct - Antioch, IL",15191 coffee with the cop oct pdf event documents 2017 1625759877 70716cc0549a2ad9a2febce0275526fa 5bc8dbb72585c97ef21ff0adf7098646ac0ec42c3ecce91bf227a8aef423a06d 234x300 _h19howtsjv7j thumb jpg 09 07 10 03 34 0 106 50 141 2021 05 25 14 40 32 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17 pagefailed_18 pagefailed_19 pagefailed_20,200,"Home - Antioch, IL","[""Coffee With The Cop Oct""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -1665,https://www.coronadelmar.us/police-investigating-social-media-threat-against-newport-mesa-unified-high-schools/,Media Bulletins,Agency-Published Resources,Police investigating social media threat against Newport-Mesa Unified high schools … | Corona del Mar California,"",200,Corona del Mar California,"[""Police investigating social media threat against Newport-Mesa Unified high schools …""]","[""Menu"", ""Be First to Comment"", ""Subscribe"", """", """"]","[""Share this:"", ""Like this:"", ""Related"", ""Leave a Reply Cancel reply"", """"]",[],[],[],"" -1666,http://www.longbeach.gov/police/press-releases/murder-investigation---4th-street-and-pacific-avenue/,Media Bulletins,Agency-Published Resources,Murder Investigation - 4th Street and Pacific Avenue,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1667,https://www.coronadelmar.us/newport-beach-mourns-locals-killed-in-helicopter-crash-media-6/,Not Criminal Justice Related,Not Criminal Justice Related,Newport Beach Mourns Locals Killed in Helicopter Crash-media-6 | Corona del Mar California,"",200,Corona del Mar California,"[""Newport Beach Mourns Locals Killed in Helicopter Crash-media-6""]","[""Menu"", ""Be First to Comment"", ""Subscribe"", """", """"]","[""Leave a Reply Cancel reply"", """"]",[],[],[],"Search Search Corona del Mar California Corona del Mar California March 25, 2024 The Quintessential California Beach Town open menu Back Corona del Mar open menu Privacy Policy United States Post Office News Local Jobs Our Beaches open menu Big Corona Little Corona Restaurants open menu Gallo’s Italian Deli Nagisa Sushi Restaurant Gina’s Pizza Pirozzi Corona del Mar Zinc Cafe Market Bandara Rose Bakery Cafe The Quiet Woman Starbucks Coast Highway Menu Corona del Mar Privacy Policy United States Post Office News Nagisa Sushi Restaurant Restaurants The Quiet Woman Rose Bakery Cafe Zinc Cafe Market Pirozzi Corona del Mar Gina’s Pizza Starbucks Coast Highway Bandara Gallo’s Italian Deli Our Beaches Little Corona Big Corona Local Jobs Baseball Game Preview: Corona del Mar Sea Kings vs. Valley View Eagles – MaxPreps.com By The Citizen Both teams have allowed few runs on average, (Corona del Mar: 3.6, Valley View: 4) so any runs scored will be well earned. Last Thursday,... Leave a Comment Baseball Game Preview: Valley View Eagles vs. Corona del Mar Sea Kings – MaxPreps.com By The Citizen Meanwhile, Corona del Mar sure made it a nail-biter, but they managed to escape with a 2-1 victory over San Clemente on Thursday. Valley View's... Leave a Comment University boys tennis takes second at All-American team tournament – Orange County Register By The Citizen University opened its week Wednesday by defeating previously undefeated Corona del Mar ... The Trojans defeated Corona del Mar in the regional final ... Source: Google Leave a Comment Orangewood Academy's loss ends five-game winning streak at home – MaxPreps.com By The Citizen They'll take on Corona del Mar at 4:00 p.m. on April 4th. As for Western Christian, they will head out on the road to square... Leave a Comment Savanna multi-sport coach and co-athletic director Alex Ramirez receives layoff notice from district By The Citizen High School Sports | · Fryer: Corona del Mar's Ava Simos sticks to all-events approach as long as she can · High School Sports |... Leave a Comment Newport Beach Mourns Locals Killed in Helicopter Crash-media-6 Previous Image Next Image Be First to Comment Leave a Reply Cancel reply Your email address will not be published. Required fields are marked * Comment Name* Email* Website Δ Subscribe Email Address Subscribe Join 1 other subscriber Corona del Mar California The Quintessential California Beach Town © www.coronadelmar.us 2024 " -1668,https://southamptontownnypolice.gov/439/southampton-shinnecock-hills-tuckahoe-ca,Not Criminal Justice Related,Not Criminal Justice Related,"Southampton / Shinnecock Hills / Tuckahoe CAC | Southampton, NY - Official Website",Find out more about the Southampton / Shinnecock Hills / Tuckahoe Citizen Advisory Committee.,200,"Police | Southampton, NY - Official Website","[""Southampton / Shinnecock Hills / Tuckahoe CAC""]","[""Meetings"", ""Members""]","[""Site Tools"", ""Quick Links"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Boards & Committees Advisory Boards & Committees Citizen Advisory Committees Southampton / Shinnecock Hills / Tuckahoe CAC Southampton / Shinnecock Hills / Tuckahoe CAC Meetings 6:30 p.m. First Tuesday of each month Cooper Hall at Roger’s Memorial Library 91 Coopers Farm Rd, Southampton, NY Members Elaine Bodtmann - Co-Chair Peter Callos John Cerrato - Co-Chair Christopher Deveau Lorraine Duryea - Co-Chair Janice Eaton Debbie Harrington Susan Manley Renee Morrison Theresa Romano Each member serves a one-year term. Quick Links Hamlets Master Plans News & Events Town Code Town Studies & Reports View All /QuickLinks.aspx CAC Minutes Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Boards & Committees Advisory Boards & Committees Citizen Advisory Committees Southampton / Shinnecock Hills / Tuckahoe CAC Southampton / Shinnecock Hills / Tuckahoe CAC Meetings 6:30 p.m. First Tuesday of each month Cooper Hall at Roger’s Memorial Library 91 Coopers Farm Rd, Southampton, NY Members Elaine Bodtmann - Co-Chair Peter Callos John Cerrato - Co-Chair Christopher Deveau Lorraine Duryea - Co-Chair Janice Eaton Debbie Harrington Susan Manley Renee Morrison Theresa Romano Each member serves a one-year term. Quick Links Hamlets Master Plans News & Events Town Code Town Studies & Reports View All /QuickLinks.aspx CAC Minutes Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... " -1669,https://santabarbaraca.gov/news/santa-barbara-police-requesting-assistance-locating-attempt-murder-suspect,Media Bulletins,Agency-Published Resources,Santa Barbara Police Requesting Assistance in Locating Attempt Murder Suspect | City of Santa Barbara,The Santa Barbara Police Department is requesting the assistance of the public in locating the whereabouts of a subject who is wanted for attempt murder and several felony firearms violations.,200,City of Santa Barbara,"[""Santa Barbara Police Requesting Assistance in Locating Attempt Murder Suspect""]","[""Learn about Cookies"", ""[#IABV2_TITLE#]"", ""Breadcrumb"", ""This is the prefooter section"", ""Main Footer"", ""City Hall"", ""Mailing Address"", ""Newsletters""]",[],[],[],[],"" -1670,https://www.hickoryhillspd.us/2014/06/message-from-the-chief-of-police/,Poor Data Source,Poor Data Source,Message From The Chief of Police,"",200,"Error retrieving title: HTTPSConnectionPool(host='www.hickoryhillspd.us', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1129)')))","[""Message From The Chief of Police""]","["""", ""Post navigation""]",[],"[""Report a Concern"", ""Investigative Tip Line"", ""Hot Links"", ""Contact Information""]",[],[],"" -1671,https://www.woodvillageor.gov/departments/public-safety/police-law-enforcement/,Resources,Agency-Published Resources,"","",404,"","","","","","","","" -1672,https://www.mass.gov/info-details/the-massachusetts-port-authority-audit-objectives-scope-and-methodology,Policies & Contracts,Info About Agencies,"The Massachusetts Port Authority Audit Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Massachusetts Port Authority.,200,Mass.gov,"[""The Massachusetts Port Authority Audit Objectives, Scope, and Methodology""]","[""Table of Contents for the audit, Audit of the Massachusetts Port Authority"", ""Table of Contents"", ""Overview"", ""Data Reliability"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[],"" -1673,https://www.coppelltx.gov/faq.aspx?qid=249,Resources,Agency-Published Resources,FAQs • Can the City stop the installation of 5G/Small Cell u,"",200,"Coppell, TX | Official Website",[],"[""▼ 5G / Small Cell""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -1674,https://www.hayward-ca.gov/police-department/programs/business-watch-program,Resources,Agency-Published Resources,Business Watch Program | City of Hayward - Official website,"Lessen the Opportunities for the CriminalsTake control of what happens in your business community and lessen your chances of becoming a victim. Through ""Business Watch,"" you will be making crimes against yourself and your fellow business neighbors as difficult as possible.What is Business Watch?Business Watch is a crime prevention program that enlists the active participation",200,City of Hayward - Official website,[],"[""Business Watch Program"", ""You are here. So is everything else."", ""Search form""]",[],"[""Lessen the Opportunities for the Criminals"", ""What is Business Watch?"", ""What are the Benefits of participating in Business Watch?"", ""How do I start a Business Watch?"", ""How do I learn more about Business Watch?"", ""Receive crime bulletins and alerts"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],"Skip to main content Search modal button POLICE Mobile Menu button Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Make a Payment Access Hayward Translate Search POLICE About HPD Divisions Programs Programs Ambassador Program Business Watch Program Chabot College Partnership Community Academy Crime Free Multi-Housing Program False Alarm Reduction Program Junior Giants Summer Baseball Hayward PAL National Night Out Neighborhood Alert Program Police Department Tours Reserve Officer Program Ride Along Program Stop Graffiti Rewards Program VIPS - Volunteers in Police Services Youth Academy Youth Diversion Coffee with a Cop Summer fun recreational program Public Services Crime Prevention Transparency Home Programs Business Watch Program Businesses can reduce crime for themselves and their fellow business neighbors. Lessen the Opportunities for the Criminals Take control of what happens in your business community and lessen your chances of becoming a victim. Through ""Business Watch,"" you will be making crimes against yourself and your fellow business neighbors as difficult as possible. What is Business Watch? Business Watch is a crime prevention program that enlists the active participation of business owners, managers, and employees in cooperation with law enforcement to reduce crime in their work environment. It is designed to: Protect you, your business and your employees. Provide a networking system between businesses that quickly and accurately disseminates information. Establish partnerships between local businesses and law enforcement. What are the Benefits of participating in Business Watch? Promoting communication and understanding between law enforcement and the business community. Encouraging cooperation between neighboring merchants. Teaching merchants to crime-proof their own properties and to watch over neighboring businesses and report any suspicious activity to authorities. Developing a telephone tree system for quick dissemination of information regarding criminal activity in the area. Encouraging the development of signals to activate in adjacent businesses when someone needs help How do I start a Business Watch? Call a meeting with nearby merchants / businesses. Arrange for a Crime Prevention Specialist to attend and ask to discuss BUSINESS WATCH and crime prevention techniques with your group. Decide on the next meeting; make this an ongoing prevention program. Invite speakers to regularly schedule meetings for crime prevention tips and planning group strategies. Internal or employee crime should be one of the first topics for discussion. How do I learn more about Business Watch? Local law enforcement provides a variety of resources to help you learn more about crime prevention. For more information, or if you have questions, please contact our Crime Prevention Specialists in your area. For more information, please call : Crime Prevention Specialist North 510.293.7151 Crime Prevention Specialist South 510.293.1043 Programs Ambassador Program Business Watch Program Chabot College Partnership Community Academy Crime Free Multi-Housing Program False Alarm Reduction Program Junior Giants Summer Baseball Hayward PAL National Night Out Neighborhood Alert Program Police Department Tours Reserve Officer Program Ride Along Program Stop Graffiti Rewards Program VIPS - Volunteers in Police Services Youth Academy Youth Diversion Coffee with a Cop Summer fun recreational program Search modal button POLICE Mobile Menu button POLICE " -1675,http://www.longbeach.gov/police/press-releases/residential-burglary-suspect-arrested/,Media Bulletins,Agency-Published Resources,RESIDENTIAL BURGLARY SUSPECT ARRESTED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1676,https://www.burienwa.gov/news_events/city_newsroom/news_announcements/burien_police_chief_promoted_within_kcso,Media Bulletins,Agency-Published Resources,Burien Police Chief Promoted Within KCSO - City of Burien,"Burien Police Chief Theodore “Ted” Boe has accepted a promotion to serve as Patrol Operations Division Chief for King County Sheriff’s Office, effective January 1, 2023.",200,Just a moment...,"[""City of Burien""]","[""Apply For"", ""Contact"", ""Locate"", ""Report"", ""Watch"", ""Schedule"", ""Volunteer"", ""Submit Public Comment"", ""Request"", ""Burien Police Chief Promoted Within KCSO""]",[],[],[],[],"" -1677,https://www.lynchburgvapolice.gov/news-updates/update-news-release-incident-involving-lpd-officer/,Media Bulletins,Agency-Published Resources,[UPDATE] NEWS RELEASE: INCIDENT INVOLVING LPD OFFICER - Lynchburg Police Department,"",200,403 Forbidden,"[""[UPDATE] NEWS RELEASE: INCIDENT INVOLVING LPD OFFICER""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[],"" -1678,https://delcopa.gov/vsc/,Not Criminal Justice Related,Not Criminal Justice Related,Untitled Document,"",200,"Delaware County, Pennsylvania",[],[],[],[],[],[],"" -1679,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/arrests/070722arrests.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1680,http://www.ryepolice.us/westnile,Not Criminal Justice Related,Not Criminal Justice Related,Rye Police Department West Nile / EEE - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""West Nile / EEE""]","[""West Nile Virus"", ""Eastern Equine Encephalitis"", ""The Spread of EEE and WNV"", ""Prevention Guidelines"", ""Dead Bird Testing""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -1681,https://www.ashevillenc.gov/news/asheville-police-department-launches-online-reporting-as-part-of-upgraded-police-to-citizen-tool/,Media Bulletins,Agency-Published Resources,ERROR: The request could not be satisfied,"",200,The City of Asheville - Your Asheville,"[""403 ERROR""]","[""The request could not be satisfied.""]",[],[],[],[],"" -1682,https://delcopa.gov/courts/juror/eresponse.html,Resources,Agency-Published Resources,Juror eResponse - Delaware County Court of Common Pleas,"",200,"Delaware County, Pennsylvania","[""Juror eResponse""]",[],"[""Jury Services Navigation"", ""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[],"Menu A to Z Court Departments Local Rules FAQ Government Center Juror eResponse Home / Courts / Jury Services / Juror eResponse Welcome to the Delaware County eResponse Jury System . You are most likely viewing this website because you have received a Summons to appear for jury service. The first thing you should do when you receive a Summons is respond to the Juror Information Questionnaire. Please click the Juror eResponse link below so that you may log in using the credentials found on your Summons to complete and submit the Juror Information Questionnaire. By doing so, you will be able to confirm your service, update contact information, find juror information or request assistance. When you respond online and provide your email address, keep in mind that you will receive emails from Jury Services, specifically delcojury@co.delaware.pa.us . Please be sure to check your spam or junk folders in the event the message landed there. Unless you save delcojury@co.delaware.pa.us to your contact information, there is a good probability that this may happen. IMPORTANT: Please be sure that you complete the online questionnaire within fifteen (15) consecutive minutes or the page will time out and you will need to start over again. If you have trouble logging in because the system is indicating that the date of birth is not correct or for any other reason, please contact Jury Services at 610-891-4622 between 8:30 am and 4:30 pm so that we may review the record with you. You may also email delcojury@co.delaware.pa.us where your message will be reviewed, and you will be contacted as soon as possible. There may be occasions where two persons in the same household have the same name. Before the Questionnaire is completed, please contact Jury Services to confirm the date of birth of the record. CLICK HERE TO CONTINUE TO JURY eRESPONSE To contact Jury Services: E-mail: delcojury@co.delaware.pa.us Phone: 610-891-4622 For official word of court closings or special announcements, call 610-891-4067. Jury Parking Flyer Jury Services Navigation Home Juror's eResponse Handbook & Guide for Jurors Frequently Asked Questions Juror Donation Program Glossary of Terms A Juror's Creed Directions to the Courthouse Juror Parking Parking in Media Borough Nancy L. Alkins Jury Administrator Government Center First Floor, Room 118 201 W. Front St. Media, PA 19063 Phone: 610-891-4621 Fax: 610-891-5897 Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 delcocourts@co.delaware.pa.us Courts Quick Links Juror eResponse PA Law Help Self Help - Custody Self Help - Divorce Juror Handbook Language Access Family Court Self Represented Litigant Guide Government Center Quick Links Marriage Licenses Crisis Connection Certified Recovery Specialist Public Access Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center " -1683,https://www.mass.gov/doc/public-meeting-ma-state-police-lower-basin-barracks-modernization/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1684,https://norfolkne.gov/assets/site/documentcentral/police/archived-calls-for-service/2017-calls-for-service/march2017cfs.pdf,Calls for Service,Police & Public Interactions,"","",404,"","","","","","","","" -1685,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/111821summary.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -1686,http://www.greenvillenc.gov/government/police/mental-health-crisis-services,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1687,https://www.roseville.ca.us/government/departments/electric_utility/rebates___energy_savings/your_trusted_solar_advisor_copy,Not Criminal Justice Related,Not Criminal Justice Related,Your Trusted Solar Advisor - City of Roseville,"",200,Just a moment...,"[""City of Roseville""]","[""Your Trusted Solar Advisor""]","[""CONTACT US"", ""City of Roseville""]",[],[],[],"" -1688,https://delcopa.gov/publicrelations/releases/2020/covidtesting_canceledmillbournesept.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Cancels COVID-19 Public Testing Site in Millbourne - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Cancels COVID-19 Public Testing Site in Millbourne""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""September 17 drive-thru and walk-up testing for Delaware County residents and workers canceled""]",[],[],"" -1689,https://www.lynchburgvapolice.gov/wp-content/uploads/2021/06/lynchburg-police-patch-new-w-red.png,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1690,http://www.longbeach.gov/police/press-releases/charges-filed-in-2002-murder/,Media Bulletins,Agency-Published Resources,Charges Filed in 2002 Murder,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/15/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: CHARGES FILED IN 2002 MURDER Contact: Media Relations Detail (562)570-5273 On April 13, 2016, Homicide Detective’s presented a case for filing to the Los Angeles County District Attorney’s Office for a murder that occurred in 2002. On Tuesday, June 11, 2002, just after midnight officers were dispatched to the 300 block of Molino Avenue regarding a male adult found dead inside an apartment. When officers arrived they found a victim deceased that had sustained multiple gunshot wounds to his torso. Evidence collected from the crime scene was preserved and with the advances in DNA technologies, a DNA profile was produced. Detectives were able to submit this DNA profile through a national database and received a match. The match came to a suspect already serving a Federal Prison Sentence for an unrelated charge. The suspect has been identified as Eric Scanlan, 43 year-old former resident of Long Beach. Scanlan was charged with 1 count of murder and his bail has been set at $3,000,000.00. Scanlan is scheduled to be released from Federal Prison on November 16, 2016, and will then be extradited to Long Beach, California. Anyone with information regarding the incident is urged to call Homicide Detective Todd Johnson or Malcolm Evans at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit http://www.lacrimestoppers.org/ / This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1691,https://www.gurnee.il.us/events/2017/06/10/default-calendar/2017-outrun-the-cops!,Not Criminal Justice Related,Not Criminal Justice Related,2017 Outrun The Cops!,"",200," - Village of Gurnee -","[""Events"", ""Events View Calendar""]","[""2017 Outrun The Cops!""]","[""Village Hall""]",[],[],[],search edit file-word file-empty angle-left angle-right angle-up angle-down dollar calendar-check-o printer search2 briefcase circle-up circle-right circle-down circle-left share2 mail4 facebook twitter youtube file-pdf search edit file-word file-empty angle-left angle-right angle-up angle-down dollar calendar-check-o printer search2 briefcase circle-up circle-right circle-down circle-left share2 mail4 facebook twitter youtube file-pdf -1692,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/092921blotter.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -1693,https://santabarbaraca.gov/government/departments/santa-barbara-police-department,Contact Info & Agency Meta,Info About Agencies,Santa Barbara Police Department | City of Santa Barbara,For any Emergency Dial: 9-1-1  Non-Emergency Dispatch: 805-882-8900,200,City of Santa Barbara,"[""Santa Barbara Police Department""]","[""For any Emergency Dial: 9-1-1"", ""Non-Emergency Dispatch: 805-882-8900"", ""Police Department Information"", ""News Feed & Media Releases"", ""Contact Us"", ""This is the prefooter section"", ""Main Footer"", ""City Hall"", ""Mailing Address"", ""Newsletters""]",[],[],"[""Currently, the Police Department Lobby will be open for in-person service during the following days and times:"", ""CCW APPLICATION INFORMATION"", ""WEAPONS/RANGE QUALIFICATIONS AND TRAINING"", ""APPLY FOR A CCW""]",[],"" -1694,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2019_news_releases/19-_year-_old_suffers_fatal_gunshot_wound_update,Not Criminal Justice Related,Not Criminal Justice Related,19-Year-Old Suffers Fatal Gunshot Wound Update - Village of Pleasant Prairie,"",200,Just a moment...,[],"[""19-Year-Old Suffers Fatal Gunshot Wound Update""]","[""Follow Us on Social Media""]",[],[],[],"" -1695,https://www.prescott-az.gov/services-safety/police/police-program-and-services/,Contact Info & Agency Meta,Info About Agencies,Prescott Police Department - City of Prescott AZ,"",200,Home - City of Prescott AZ,"[""Police""]","[""Prescott Police Department""]","[""Public Safety Services"", ""Contact Prescott Police""]","[""city of prescott"", ""Stay informed"", ""Quick Access"", ""citizen inquiry""]",[],[],Open toolbar Accessibility Accessibility Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Sitemap Sitemap Accessibility Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Sitemap Sitemap Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government departments Search Search Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government dept Search Search Search Search Close this search box. Search Search Departments Residents Visitors Business Government Residents Visitors Business Government Police Home Departments Prescott Police Department Prescott Police Department Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government departments Search Search Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government dept Search Search Search Search Close this search box. Search Search Departments Residents Visitors Business Government Residents Visitors Business Government Police Home Departments Prescott Police Department Prescott Police Department Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government departments Search Search Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government dept Search Search Search Search Close this search box. Search Search Departments Residents Visitors Business Government Residents Visitors Business Government Police Home Departments Prescott Police Department Prescott Police Department Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government departments Search Search Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government dept Search Search Search Search Close this search box. Search Search Departments Residents Visitors Business Government Residents Visitors Business Government Police Home Departments Prescott Police Department Prescott Police Department Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government departments Search Search Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government dept Search Search Search Search Close this search box. Search Search Departments Residents Visitors Business Government Residents Visitors Business Government Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government departments Search Search Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government dept Search Search Search Search Close this search box. Search Search Departments Residents Visitors Business Government Residents Visitors Business Government Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government departments Search Search Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government dept Search Search Search Search Close this search box. Search Search Departments Residents Visitors Business Government Residents Visitors Business Government Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government departments Search Search Pay Bill Employment City Code Residents Visitors Business Government Residents Visitors Business Government dept Search Search Search Search Close this search box. Search Search Departments Residents Visitors Business Government Residents Visitors Business Government -1696,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/060721summary1.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -1697,https://delcopa.gov/planning/programsandinitiatives/naturalresourceprotection.html,Resources,Agency-Published Resources,Natural Resource Protection,"",200,"Delaware County, Pennsylvania","[""Natural Resource Protection""]","[""Natural Resource Protection Assistance"", ""Natural Heritage Inventory""]","[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Natural Resource Protection Home / Departments / Planning Department / Municipal Programs & Initiatives / Natural Resource Protection Planning for natural resource protection and management is an important role of the Delaware County Planning Department. Delaware County contains a number of sensitive natural resources that include steep slopes, streams and their floodplains, wetlands, forests, and trees. It also has a number of critical habitat areas that are home to important, rare, and endangered species of plants and animals. The County recognizes the need to protect these natural resources for the long-term health, safety, and quality of life of County residents. Natural Resource Protection Assistance The Planning Department maintains inventories and maps containing information relating to the location, extent, and environmental value of many of the County’s important natural resources. Staff are available to discuss resource extent and quality and make recommendations for their preservation and management. Natural Heritage Inventory The Delaware County Natural Heritage Inventory (NHI) was developed for the County by the Western Pennsylvania Conservancy. Its purpose is to inform residents and local decision makers about the unique plants, animals, and habitats that are found throughout Delaware County. The NHI is a valuable tool that can be used when preparing land use and open space plans and for making local land use decisions. DCPD staff are available to provide more information regarding the NHI and its use. The County’s Natural Heritage Inventory Planning Department Navigation Access the Data and Mapping Innovation Hub About Planning Calendar Current Projects Delaware County 2035 Demographic Data Development Review Forms Funding Green Space and Trails Project Mapping Municipal Programs & Initiatives Planning Education Publications Gina Burritt, Director Planning Department 2 W. Baltimore Avenue Suite 202 Media, PA 19063 Phone: 610-891-5200 Fax: 610-891-5203 Email: Planning_Department@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2023 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Natural Resource Protection Home / Departments / Planning Department / Municipal Programs & Initiatives / Natural Resource Protection Natural Resource Protection Home / Departments / Planning Department / Municipal Programs & Initiatives / Natural Resource Protection " -1698,https://www.edmondswa.gov/services/police,Contact Info & Agency Meta,Info About Agencies,"Police Department - City of Edmonds, WA","",200,Just a moment...,"[""City of Edmonds - Washington""]","[""Police Department"", ""SERVICE INTEGRITY RESPECT STEWARDSHIP""]","[""MICHELLE BENNETT"", ""CHIEF OF POLICE"", ""Edmonds Police Department"", ""Recruitment and Hiring""]",[],[],[],Skip to Content -1699,https://www.southamptontownnypolice.gov/faq.aspx?qid=79,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • How do I report overcrowding conditions in a bar or n,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Public Safety - Code Enforcement""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1700,https://coloradosprings.gov/police-department/page/coffee-cop,Not Criminal Justice Related,Not Criminal Justice Related,Coffee with a Cop | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Coffee with a Cop""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -1701,https://www.wheelingwv.gov/policejobs,Training & Hiring Info,Info About Officers,Police Employment,Official Website for the City of Wheeling West Virginia,200,City of Wheeling West Virginia,"[""Police Employment""]",[],"[""Contact Info""]",[],[],[],"Departments Government Business Community How Do I... Wheeling 311 Pay Online Police About Police Department Mission Statement Chief of Police Command Staff History of Department PD Organizational Chart Line of Duty Deaths WPD Annual Reports City Code / Ordinances Crime Watch Calendar Crime Map Crimestoppers Upper Ohio Valley Community Outreach Crime Watch Meetings Citizens Police Academy Drug Drop Off Site Explorer Post No. 1 Law Enforcement Memorial National Night Out Neighborhood Assistant Volunteers Divisions & Units Patrol Division Crash Reconstruction Unit Crisis Negotiations Team Drug Task Force Highway Safety Office Investigations K9 Unit Marine Patrol & Dive Team Mountain Bike Unit Office of Professional Standards School Resource Officers Police Training SWAT Victim Advocacy Program False Alarm Reduction Program Most Wanted News Releases Police Employment Police FAQ Social Media Terms of Use Resources & Information Police Department Directory SUBMIT A CRIME TIP ONLINE CRIME REPORT CRASH REPORTS REGISTER SECURITY CAMERA General Information Staff Directory Phone Numbers 304-234-3664 Emergencies: Dial 911 Location WPD Headquarters 2115 Chapline Street Wheeling, WV 26003 Get Directions Follow Us Police Employment Home > Departments > Police > Police Employment The Wheeling Police Department always is accepting applications for CERTIFIED and NON-CERTIFIED officers! NEXT TEST DATE: Saturday, April 27, 2024 - 9 a.m. @ Wheeling Police Headquarters (2115 Chapline Street) Click here to APPLY NOW! Employment Questions: City of Wheeling Human Resources 1500 Chapline Street, Room 301 Wheeling, WV 26003 Phone: (304) 234-3694 Email: humanresources @wheelingwv.gov Additional Employment Information: WV Certified Employment Bonus Information WPD Recruitment Brochure Police Civil Service Commission Employment Eligibility Information Physical Agility Exam Potential Disqualifiers Contact Info City of Wheeling, West Virginia 1500 Chapline Street Wheeling, WV 26003 (304) 234-3617 Website By EvoGov Departments Government Business Community How Do I... Wheeling 311 Pay Online Departments Government Business Community How Do I... Wheeling 311 Pay Online Departments Government Business Community How Do I... Wheeling 311 Pay Online Departments Government Business Community How Do I... Wheeling 311 Pay Online Departments Government Business Community How Do I... Wheeling 311 Pay Online " -1702,http://www.ryepolice.us/announcements/aquarion-water-company-boil-order-8-23-19,Not Criminal Justice Related,Not Criminal Justice Related,Rye Police Department AQUARION WATER COMPANY BOIL ORDER! 8/23/19 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""AQUARION WATER COMPANY BOIL ORDER! 8/23/19""]","[""AQUARION WATER COMPANY BOIL ORDER! 8/23/19""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"­ Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search AQUARION WATER COMPANY BOIL ORDER! 8/23/19 Home Announcements AQUARION WATER COMPANY BOIL ORDER! 8/23/19 AQUARION WATER COMPANY BOIL ORDER! 8/23/19 August 23, 2019 In Announcements Town of Rye Aquarion Water Company users are under a Boil Order until further notice. More details will be released as soon as we are notified. Rye Water District and Portsmouth Water District customers are NOT affected. Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search " -1703,https://delcopa.gov/delcoready/involved.html,Resources,Agency-Published Resources,"Be Involved - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Be Involved""]","[""Be Involved""]","[""Delco Ready Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Be Involved Home / Departments / Delco Ready / Be Involved Be Involved Get Involved in your Community Vounteer Delco Intercommunity Health Emergencies Preparedness Delco Emergencies Services Delco EMS Delco Ready Navigation Be Informed Be Prepared Be Involved September is Preparedness Month Additional Resources Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Be Involved Home / Departments / Delco Ready / Be Involved Be Involved Home / Departments / Delco Ready / Be Involved Be Involved Home / Departments / Delco Ready / Be Involved Be Involved Get Involved in your Community Vounteer Delco Intercommunity Health Emergencies Preparedness Delco Emergencies Services Delco EMS Delco Ready Navigation Be Informed Be Prepared Be Involved September is Preparedness Month Additional Resources Be Involved Get Involved in your Community Vounteer Delco Intercommunity Health Emergencies Preparedness Delco Emergencies Services Delco EMS Delco Ready Navigation Be Informed Be Prepared Be Involved September is Preparedness Month Additional Resources Delco Ready Navigation Be Informed Be Prepared Be Involved September is Preparedness Month Additional Resources Delco Ready Navigation Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us " -1704,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0889/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1705,https://delcopa.gov/publicrelations/releases/2019/airforceflagraising.html,Not Criminal Justice Related,Not Criminal Justice Related,"United States Air Force flag raised to commemorate anniversary - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""United States Air Force flag raised to commemorate anniversary""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play United States Air Force flag raised to commemorate anniversary Home / Departments / Public Relations Releases / United States Air Force flag raised to commemorate anniversary Delaware County Council was joined on Aug. 21 by United States Air Force Veteran Dan Van Wyk and Delaware County Department of Military and Veterans Affairs Director John Sheaffer in raising the U.S. Air Force flag in honor of the founding of the Air Force on September 18, 1947. It will fly on the flagpoles in the courtyard of the Government Center and Courthouse complex and in front of the Courthouse through September 18 to honor those who have bravely served with the United States Air Force. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play United States Air Force flag raised to commemorate anniversary Home / Departments / Public Relations Releases / United States Air Force flag raised to commemorate anniversary United States Air Force flag raised to commemorate anniversary Home / Departments / Public Relations Releases / United States Air Force flag raised to commemorate anniversary United States Air Force flag raised to commemorate anniversary Home / Departments / Public Relations Releases / United States Air Force flag raised to commemorate anniversary " -1706,https://police.birminghamal.gov/command-staff/lieutenants/,Personnel Records,Info About Officers,Lieutenants | Birmingham Police Department,"",200,"Home | Police Department - Birmingham, AL","[""Birmingham Police Department Commitment | Excellence | Integrity""]","[""Putting People First"", ""Lieutenants""]",[],"[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[],Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Search Lieutenants In This Section BPD Organization Chart Chief Scott Thurmond Assistant Chief La’Quaylin Parhm Mack Deputy Chief Shelia Frazier-Finney Deputy Chief Onree J. Pruitt Jr. Captains Lieutenants Lieutenant Norman Adams – Executive Asst. to Deputy Chief of Special Operations Lieutenant Frank Alexander – Custody Services Division Lieutenant Timothy Bell – Internal Affairs Asst. Commander Lieutenant Marion Benson – South Precinct Lieutenant John P. Callahan -South Precinct Lieutenant Anthony Callaway – East Precinct Lieutenant Ronald Crumbley – East Precinct Lieutenant Brandon Corbin – West Precinct Lieutenant John Green – East Precinct Lieutenant Brandon Foster- South Precinct Lieutenant Jacorey Foster – Vice/Naracotics Lieutenant Richard Haluska – North Precinct Lieutenant Ron Harless – North Precinct Lieutenant Christopher R Hays – Patrol Bureau Lieutenant Rebeca Herrera – Special Victim’s Unit Commander Lieutenant James Littleton- Executive Asst. to the Deputy Chief of Investigation Bureau Lieutenant Rodarius Mauldin – Executive Asst. to the Assistant Chief of Police Lieutenant Field Morton – Crimes Against Person/Investigation Bureau Lieutenant Joshua Osborne – Narcotics/Special Operations Bureau Lieutenant Reva Palmer – East Precinct Lieutenant Katherine L. Snider – West Precinct Lieutenant Quinton Stevenson – Community Outreach and Public Education Unit Lieutenant Eric Stisher – Academy Director Lieutenant Stephen White – West Precinct Lieutenants In This Section BPD Organization Chart Chief Scott Thurmond Assistant Chief La’Quaylin Parhm Mack Deputy Chief Shelia Frazier-Finney Deputy Chief Onree J. Pruitt Jr. Captains Lieutenants Lieutenant Norman Adams – Executive Asst. to Deputy Chief of Special Operations Lieutenant Frank Alexander – Custody Services Division Lieutenant Timothy Bell – Internal Affairs Asst. Commander Lieutenant Marion Benson – South Precinct Lieutenant John P. Callahan -South Precinct Lieutenant Anthony Callaway – East Precinct Lieutenant Ronald Crumbley – East Precinct Lieutenant Brandon Corbin – West Precinct Lieutenant John Green – East Precinct Lieutenant Brandon Foster- South Precinct Lieutenant Jacorey Foster – Vice/Naracotics Lieutenant Richard Haluska – North Precinct Lieutenant Ron Harless – North Precinct Lieutenant Christopher R Hays – Patrol Bureau Lieutenant Rebeca Herrera – Special Victim’s Unit Commander Lieutenant James Littleton- Executive Asst. to the Deputy Chief of Investigation Bureau Lieutenant Rodarius Mauldin – Executive Asst. to the Assistant Chief of Police Lieutenant Field Morton – Crimes Against Person/Investigation Bureau Lieutenant Joshua Osborne – Narcotics/Special Operations Bureau Lieutenant Reva Palmer – East Precinct Lieutenant Katherine L. Snider – West Precinct Lieutenant Quinton Stevenson – Community Outreach and Public Education Unit Lieutenant Eric Stisher – Academy Director Lieutenant Stephen White – West Precinct In This Section BPD Organization Chart Chief Scott Thurmond Assistant Chief La’Quaylin Parhm Mack Deputy Chief Shelia Frazier-Finney Deputy Chief Onree J. Pruitt Jr. Captains Lieutenants -1707,https://www.mass.gov/info-details/audit-of-the-massachusetts-bay-transportation-authority-objectives-scope-and-methodology,Not Criminal Justice Related,Not Criminal Justice Related,"Audit of the Massachusetts Bay Transportation Authority Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Massachusetts Bay Transportation Authority.,200,Mass.gov,"[""Audit of the Massachusetts Bay Transportation Authority Objectives, Scope, and Methodology""]","[""Table of Contents for the audit, Audit of the Massachusetts Bay Transportation Authority (MBTA)"", ""Table of Contents"", ""Overview"", ""Data Reliability"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[],"" -1708,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0765/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1709,http://www.longbeach.gov/police/press-releases/fatal-hit-and-run/,Media Bulletins,Agency-Published Resources,LBPD ASKING FOR PUBLIC'S HELP:FATAL HIT AND RUN,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/6/2018 FOR IMMEDIATE RELEASE Press Release # 2018 Subject: LBPD ASKING FOR PUBLIC'S HELP: FATAL HIT AND RUN Contact: Media Relations Detail (562) 570-5273 HONDA ACCORD                TOYOTA CAMRY                  BOTH VEHICLES UPDATE: LBPD is Asking for the Public’s Help The Long Beach Police Department is asking for the public’s help in identifying two vehicles and the drivers involved in a hit and run fatal collision involving a bicyclist on March 3, 2018. The pictures above are of a white, believed to be 2015 to 2017 Toyota Camry, and a late 90’s Honda Accord. The Honda Accord has a distinctive dark colored hood and a sunroof. Anyone who recognizes these vehicle is urged to call Collision Investigation Detective Sirilo Garcia at (562) 570-7132. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org. Original News Release: On Saturday March 3, 2018, at approximately 03:00 AM, Officers from the Long Beach Police Department came upon a bicyclist down in the #2 northbound lane of the 47 Freeway at Pier A Way. Officers administered medical aid until Long Beach Fire Department personnel arrived on scene, but the bicyclist was later determined deceased upon their arrival. The preliminary investigation revealed that the bicyclist was riding his bike northbound on the 47 Freeway when he was struck by two vehicles that failed to remain at the scene of the collision. The bicyclist had no form of identification on him and is described as a M/W, approximatley 25-35 years old. Based upon evidence left at the scene, investigators are working to determine the make and model of the vehicles involved. Anyone who may have witnessed or have knowledge of this incident is asked to call Detective Sirilo Garcia of the Long Beach Police Department’s Collision Investigation Detail at (562)570-7355. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1710,https://ose.louisiana.gov/event/police-communications-officer-34/,Poor Data Source,Poor Data Source,Police Communications Officer | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Police Communications Officer""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Police Communications Officer Competitive Level Posting Period 08/01/2021 - 08/18/21 Application Deadline 08/18/21 Jurisdiction Monroe Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Police Communications Officer Competitive Level Posting Period 08/01/2021 - 08/18/21 Application Deadline 08/18/21 Jurisdiction Monroe Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Communications Officer Competitive Level Posting Period 08/01/2021 - 08/18/21 Application Deadline 08/18/21 Jurisdiction Monroe Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Communications Officer Competitive Level Posting Period 08/01/2021 - 08/18/21 Application Deadline 08/18/21 Jurisdiction Monroe Application This event has passed. Police Communications Officer Competitive Level Posting Period 08/01/2021 - 08/18/21 Application Deadline 08/18/21 Jurisdiction Monroe Application This event has passed. Police Communications Officer Competitive Level Posting Period 08/01/2021 - 08/18/21 Application Deadline 08/18/21 Jurisdiction Monroe Application This event has passed. Police Communications Officer Competitive Level Competitive Level Competitive Level Posting Period 08/01/2021 - 08/18/21 Application Deadline 08/18/21 Jurisdiction Monroe Posting Period 08/01/2021 - 08/18/21 Application Deadline 08/18/21 Jurisdiction Monroe Posting Period 08/01/2021 - 08/18/21 Application Deadline 08/18/21 Jurisdiction Monroe Posting Period 08/01/2021 - 08/18/21 Posting Period Application Deadline 08/18/21 Application Deadline Jurisdiction Monroe Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -1711,https://www.ci.san-ramon.ca.us/our_city/departments_and_divisions/police/victims_rights_information/hate_violence,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1712,https://delcopa.gov/planning/pdf/demodata/povertystatus.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1713,https://www.lynchburgvapolice.gov/wp-content/uploads/2022/02/20220201_162001000_ios.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1714,http://www.longbeach.gov/police/press-releases/murder-1200-block-of-e--17th-street/,Media Bulletins,Agency-Published Resources,MURDER 1200 block of E. 17th Street,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/18/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On April 18, 2016, at approximately 8:43 p.m., officers responded to the 1200 block of E. 17th Street regarding a shots call. Officers arrived on scene and located four male adult victims. One victim was determined to be deceased at the scene. The other three victims were transported to area hospitals. One is in critical condition and the other two are in stable condition. No suspect info is available at this time. The deceased victim has been identified as Delhaun Jackson 19 year old resident of Long Beach. Anyone with information regarding the incident is urged to call Homicide Detectives at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/18/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On April 18, 2016, at approximately 8:43 p.m., officers responded to the 1200 block of E. 17th Street regarding a shots call. Officers arrived on scene and located four male adult victims. One victim was determined to be deceased at the scene. The other three victims were transported to area hospitals. One is in critical condition and the other two are in stable condition. No suspect info is available at this time. The deceased victim has been identified as Delhaun Jackson 19 year old resident of Long Beach. Anyone with information regarding the incident is urged to call Homicide Detectives at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ A- A A+ A- A A+ A- A A+ A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 " -1715,https://www.mass.gov/doc/municipal-police-training-committee-mptc-meeting-minutes-101619/download,Misc Police Activity,Police & Public Interactions,"","",200,"","","","","","","","" -1716,https://www.arlingtontx.gov/news/my_arlington_t_x/news_stories/arlington_police_chief_announces_retirement,Media Bulletins,Agency-Published Resources,Arlington Police Chief Announces Retirement - City of Arlington,"",200,Just a moment...,"[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Arlington Police Chief Announces Retirement""]",[],[],[],[],Skip to Content Skip to Content -1717,https://coloradosprings.gov/article/news/balltoberfest-collects-donated-sports-balls-police-departments-play-cos,Not Criminal Justice Related,Not Criminal Justice Related,Balltoberfest collects donated sports balls for police department's Play COS | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Balltoberfest collects donated sports balls for police department's Play COS""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]","[""About the Play COS Program""]",[],"[""REPORT ONLINE""]",[],"" -1718,https://www.florenceaz.gov/jobs/police-records-clerk/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1719,https://coloradosprings.gov/police-department/article/news/homicide-investigation-3500-block-south,Media Bulletins,Agency-Published Resources,Homicide Investigation: 3500 Block of South Chelton Loop | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Homicide Investigation: 3500 Block of South Chelton Loop""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -1720,http://www.longbeach.gov/police/press-releases/murder--9th-st----locust-ave--/,Media Bulletins,Agency-Published Resources,Murder (9th St. & Locust Ave.),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1721,https://www.pleasantprairiewi.gov/news/2021_news/police_department_celebrates_50_years_of_service,Media Bulletins,Agency-Published Resources,Police Department Celebrates 50 Years of Service - Village of Pleasant Prairie,"",200,Just a moment...,[],"[""Police Department Celebrates 50 Years of Service""]","[""Follow Us on Social Media""]",[],[],[],"" -1722,https://www.sandiego.gov/department-document/san-diego-police-announce-arrests-home-invasion-series,Media Bulletins,Agency-Published Resources,San Diego Police Announce Arrests in Home Invasion Series | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""San Diego Police Announce Arrests in Home Invasion Series"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -1723,http://www.ryepolice.us/pressrelease/birchwood-drive-reckless-conduct-press-release/attachment/hordon,Poor Data Source,Poor Data Source,Rye Police Department hordon - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""hordon""]","[""hordon""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"­ Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search hordon Home hordon hordon September 18, 2018 Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search " -1724,https://champaignil.gov/police/about-us/policies-and-procedures/,Policies & Contracts,Info About Agencies,Policies and Procedures - City of Champaign,"",200,403 Forbidden,"[""Policies and Procedures""]","[""Police Department"", ""Quick Links"", ""Police Department News"", ""Contact Us""]",[],[],[],[],"" -1725,http://www.longbeach.gov/police/press-releases/dui-enforcement-operation-planned-st--patrick-s-day/,Media Bulletins,Agency-Published Resources,DUI ENFORCEMENT OPERATION PLANNED ST. PATRICK'S DAY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/14/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: DUI ENFORCEMENT OPERATION PLANNED ST. PATRICK'S DAY Contact: Media Relations (562) 570-5273 Long Beach, CA - Officers from the Long Beach Police Department’s DUI Enforcement Team will be deploying on Monday, March 17, 2014, to stop and arrest alcohol and drug-impaired drivers in the Department’s ongoing traffic safety campaign. DUI Saturation Patrols will deploy in areas with high frequencies of DUI collisions and/or arrests. “When you celebrate St. Patrick’s Day, just be smart about it. If you know you’re going to drink—whether with friends at a pub or attending a party — designate a sober driver ahead of time or call a taxi to make sure you get home safely,” said Long Beach Police Department’s Traffic Lieutenant Kris Klein. “There’s never an excuse for driving after drinking.” After falling dramatically for five straight years, figures for 2012 show an increase to 802 deaths in California, from 774 deaths in the previous year, caused by impaired drivers. To prevent these tragedies from occurring, Lieutenant Klein recommends the following steps to have a safe and happy St. Patrick’s Day: Before the festivities begin, plan a way to safely get home at the end of the night Before drinking, designate a sober driver and leave your car keys at home If you’re impaired, use a taxi, call a sober friend or family member, or use public transportation to get home safe If you see a drunk driver on the road, Report Them! Call 9-1-1! You could save a life And remember, if you know people who are about to drive or ride while impaired, take their keys and help them make other arrangements to get to where they are going safely. DUI can impact the economy in addition to the pain and suffering of those immediately affected. Conservatively, a fatality has a $1.4 million impact, an injury $70,000, and a crash that only damages property averages nearly $9000. Funding for this program is from a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration. Report Drunk Drivers, Call 911! This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1726,https://civicpride.jacksontn.gov/government/public_notices___press_releases/newjpdchiefofpolice,Not Criminal Justice Related,Not Criminal Justice Related,"Mayor's Civic Pride Awards - City of Jackson, TN",Welcome to the official website of City of Jackson in Tennessee.,200,Just a moment...,"[""City of Jackson TN"", ""2023 Mayor's Civic Pride Award Nominations"", ""City of Jackson TN""]","[""Mayor's Civic Pride Awards""]","[""JUDGING CRITERIA""]",[],[],[],"" -1727,https://police.greenvillesc.gov/1643/photo-gallery,Resources,Agency-Published Resources,"Photo Gallery | Greenville, SC - Official Website",View photos from the Comp Plan Steering Committee,200,"Police Department | Greenville, SC - Official Website","[""Photo Gallery""]",[],"[""Loading""]",[],[],[],"Skip to Main Content Government Departments Business Visitors Residents Search Home Departments Planning & Development Long Range Plans Commercial & Comp Plans GVL 2040 Comprehensive Plan Steering Committee Photo Gallery Photo Gallery Photo Gallery Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Home Departments Planning & Development Long Range Plans Commercial & Comp Plans GVL 2040 Comprehensive Plan Steering Committee Photo Gallery Photo Gallery Photo Gallery Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Home Departments Planning & Development Long Range Plans Commercial & Comp Plans GVL 2040 Comprehensive Plan Steering Committee Photo Gallery Photo Gallery Photo Gallery Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Home Departments Planning & Development Long Range Plans Commercial & Comp Plans GVL 2040 Comprehensive Plan Steering Committee Photo Gallery Photo Gallery Photo Gallery Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Government Departments Business Visitors Residents Search Government Departments Business Visitors Residents Search Search Search Search Search Search Search Search Search Home Departments Planning & Development Long Range Plans Commercial & Comp Plans GVL 2040 Comprehensive Plan Steering Committee Photo Gallery Photo Gallery Photo Gallery Home Departments Planning & Development Long Range Plans Commercial & Comp Plans GVL 2040 Comprehensive Plan Steering Committee Photo Gallery Photo Gallery Photo Gallery Home Departments Planning & Development Long Range Plans Commercial & Comp Plans GVL 2040 Comprehensive Plan Steering Committee Photo Gallery Photo Gallery Photo Gallery Home Departments Planning & Development Long Range Plans Commercial & Comp Plans GVL 2040 Comprehensive Plan Steering Committee Photo Gallery Photo Gallery Home Departments Planning & Development Long Range Plans Commercial & Comp Plans GVL 2040 Comprehensive Plan Steering Committee Photo Gallery Photo Gallery Home Departments Planning & Development Long Range Plans Commercial & Comp Plans GVL 2040 Comprehensive Plan Steering Committee Photo Gallery Photo Gallery Photo Gallery Photo Gallery Photo Gallery Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes " -1728,https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scoperesponsibility-to-the-community-and-other-policy-violations-13/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1729,https://delcopa.gov/council/2015minutes/032515minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1730,https://norfolkne.gov/government/departments/police-division/press-releases/,List of Data Sources,Info About Agencies,"Press Releases - City of Norfolk, NE","",200,"Welcome to Norfolk, NE - City of Norfolk, NE","[""City of Norfolk, NE"", ""Police Division"", ""Press Releases"", ""City of Norfolk, NE""]",[],"[""March 25th Press Release 2024"", ""March 20th Press Release 2024"", ""March 19th Press Release 2024"", ""March 18th Press Release 2024"", ""March 1st Press Release 2024"", ""February 28th Press Release 2024"", ""February 25th Press Release 2024"", ""February 17th Press Release 2024"", ""February 16th Press Release 2024"", ""February 15th Press Release 2024""]",[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]","" -1731,http://www.lafayettepolice.us/175/physical-tactics-room,Training & Hiring Info,Info About Officers,"Physical Tactics Room | Lafayette, IN - Official Website",View a list of the amenities of the defensive tactics training room.,200,"Police Department | Lafayette, IN - Official Website","[""Physical Tactics Room""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]","[""Defensive Tactics Mat"", ""Weapons Lockers""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Your LPD Career Opportunities Community Outreach Training Center How Do I… Physical Tactics Room The Physical Tactics training room allows plenty of space for trainees to practice defensive techniques. Padded walls and floor to help prevent injuries Weapons lockers are provided, no weapons are allowed in the training area Changing rooms and showers for students Defensive Tactics Mat Weapons Lockers Physical Tactics Room Firearms Simulator Small Classroom Hosted Organizations Large Classroom Computer Classroom Career Opportunities Report a Crime Thank an Officer Stay Connected Alarm Reduction Contact Us 601 Columbia Street Lafayette, IN  47901 Phone: 765-807-1200 FAQs What is the number to the jail? Can you tell me if someone is wanted on warrant? How do I obtain a handgun permit? How can I request a street closure for a special event? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Your LPD Career Opportunities Community Outreach Training Center How Do I… Physical Tactics Room The Physical Tactics training room allows plenty of space for trainees to practice defensive techniques. Padded walls and floor to help prevent injuries Weapons lockers are provided, no weapons are allowed in the training area Changing rooms and showers for students Defensive Tactics Mat Weapons Lockers Physical Tactics Room Firearms Simulator Small Classroom Hosted Organizations Large Classroom Computer Classroom Career Opportunities Report a Crime Thank an Officer Stay Connected Alarm Reduction Contact Us 601 Columbia Street Lafayette, IN  47901 Phone: 765-807-1200 FAQs What is the number to the jail? Can you tell me if someone is wanted on warrant? How do I obtain a handgun permit? How can I request a street closure for a special event? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -1732,http://www.longbeach.gov/police/press-releases/officer-involved-shooting2/,Media Bulletins,Agency-Published Resources,Officer Involved Shooting,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1733,https://www.douglas.co.us/documents/how-to-open-a-copy-account-with-douglas-county.pdf/,Records Request Info,Agency-Published Resources,"","",200,"","","","","","","","" -1734,https://www.ashevillenc.gov/news/asheville-police-release-citizen-complaint-and-9-1-1-call-data-on-open-data-portal/,Resources,Agency-Published Resources,ERROR: The request could not be satisfied,"",200,The City of Asheville - Your Asheville,"[""403 ERROR""]","[""The request could not be satisfied.""]",[],[],[],[],"" -1735,http://www.longbeach.gov/police/press-releases/crime-continues-to-decrease-in-long-beach/,Media Bulletins,Agency-Published Resources,CRIME CONTINUES TO DECREASE IN LONG BEACH,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1736,https://www.michigan.gov/som/government/state-license-search/l/law-enforcement-officer-police,Poor Data Source,Poor Data Source,SOM - 404 - Page Not Found,"",200,Access Denied,"[""404 - Page Not Found""]","[""About""]","[""Popular on michigan.gov"", ""How Do I..."", ""Careers""]",[],[],[],"" -1737,https://www.colma.ca.gov/documents/jd-police-commander/,Training & Hiring Info,Info About Officers,Police Commander - Town of Colma,"",200,Home - Town of Colma,"[""Police Commander""]","[""Primary menu links"", ""Action toolbar"", ""Documents and forms"", ""Contact"", ""Subscribe"", ""Connect""]",[],[],[],[],"Town of Colma Primary menu links About Residents Businesses Visitors City Council Departments Events News Contact Action toolbar Search Primary menu links About Residents Businesses Visitors City Council Departments Events News Contact Action toolbar Search Town of Colma Town of Colma Town of Colma Documents and forms Police Commander Human Resources Job Descriptions March 5, 2017 PDF 73 KB Download Documents and forms Police Commander Human Resources Job Descriptions March 5, 2017 PDF 73 KB Download Documents and forms Human Resources Job Descriptions March 5, 2017 PDF 73 KB Download Human Resources Job Descriptions March 5, 2017 PDF 73 KB Download March 5, 2017 Helpful Share Facebook Twitter Email Size + Reset a − Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Contact Town of Colma 1198 El Camino Real Colma, CA 94014 (650) 997-8300 (650) 997-8308 (fax) Contact Links Directory Feedback Access Links Accessibility Sitemap Subscribe Connect Twitter Facebook Contact Town of Colma 1198 El Camino Real Colma, CA 94014 (650) 997-8300 (650) 997-8308 (fax) Contact Links Directory Feedback Access Links Accessibility Sitemap Subscribe Connect Twitter Facebook Contact Town of Colma 1198 El Camino Real Colma, CA 94014 (650) 997-8300 (650) 997-8308 (fax) Contact Links Directory Feedback Access Links Accessibility Sitemap Subscribe Connect Twitter Facebook Powered by Powered by This content is for decoration only skip decoration . Close window This content is for decoration only skip decoration . This content is for decoration only skip decoration . This content is for decoration only skip decoration . Search Site Search Close window Search Site Search Search Site Search " -1738,https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/how-to-use-official-documents/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1739,https://civicpride.jacksontn.gov/government/departments/police/divisions/administrative/law_enforcement_technologies,Not Criminal Justice Related,Not Criminal Justice Related,"Mayor's Civic Pride Awards - City of Jackson, TN",Welcome to the official website of City of Jackson in Tennessee.,200,Just a moment...,"[""City of Jackson TN"", ""2023 Mayor's Civic Pride Award Nominations"", ""City of Jackson TN""]","[""Mayor's Civic Pride Awards""]","[""JUDGING CRITERIA""]",[],[],[],"" -1740,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/arrests/021622arrests.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1741,https://delcopa.gov/ojs/ojsforms/cifinfosheet.pdf,Resources,Agency-Published Resources,"","",200,"","","","","","","","" -1742,http://www.longbeach.gov/police/press-releases/l-b-p-d--academy-graduation-ceremony-held-today/,Media Bulletins,Agency-Published Resources,L.B.P.D. ACADEMY GRADUATION CEREMONY HELD TODAY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/11/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: L.B.P.D. ACADEMY GRADUATION CEREMONY HELD TODAY Contact: Media Relations (562) 570-5273 The Long Beach Police Department is pleased to announce the graduation of Academy Class #87. The graduation ceremony was held on December 11, 2014, at the Long Beach Convention Center. Twenty-four Long Beach Police Department, two Gardena Police Department, and one Modesto Police Department recruits successfully completed over 27 weeks of intense academic, physical and practical training in areas such as: Patrol Procedures and Law Enforcement Tactics, Firearms Training, Weaponless Defense, Criminal Law, Vehicle Operations, Community Oriented Public Safety, and Cultural Diversity/Human Relations Training. The graduating class includes: Nathan Albert Ryan Jern Fernando Archuleta Shay Kelley Andy Beck Yvette Loaeza Emmanuel Bazan * Cameron Luther Paul Micah Del Rosario John Martinez Alvin Do Leticia Newton Emily Dougan Bryant Ponce-Hernandez David Dougherty Alexander Roberts Jonathan Fowler Alexandra Romero Jason Frank Humberto Ruvalcaba * Joseph Garces Zach Senger Stephen Gartlan Brady Vriens Ryan Gow Brent Ward ** Jonathan Hernandez * Gardena Police Department ** Modesto Police Department The Long Beach Police Department congratulates the graduates and wishes them continued success in their future careers as law enforcement officers. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1743,https://ethics.ny.gov/news/jcope-settles-public-officers-law-violation-former-mta-employee,Media Bulletins,Agency-Published Resources,Attention Required! | Cloudflare,"",200,Home Page | New York State Commission on Ethics and Lobbying in Government,"[""Sorry, you have been blocked""]","[""You are unable to access ny.gov"", ""Why have I been blocked?"", ""What can I do to resolve this?""]",[],[],[],[],"Please enable cookies. Sorry, you have been blocked You are unable to access ny.gov Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. What can I do to resolve this? You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page. Cloudflare Ray ID: 86a17802a95e8fcf • Your IP: Click to reveal 209.6.137.20 • Performance & security by Cloudflare Please enable cookies. Sorry, you have been blocked You are unable to access ny.gov Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. What can I do to resolve this? You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page. Cloudflare Ray ID: 86a17802a95e8fcf • Your IP: Click to reveal 209.6.137.20 • Performance & security by Cloudflare Sorry, you have been blocked You are unable to access ny.gov Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. What can I do to resolve this? You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page. Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. What can I do to resolve this? You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page. Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. " -1744,https://sanramon.ca.gov/our_city/departments_and_divisions/police/community_programs/youth_services/station_tours,Resources,Agency-Published Resources,Station Tours - City of San Ramon,"",200,Just a moment...,"[""Station Tours""]","[""Contact Us"", ""Station Tours"", ""Contact Us"", ""Useful Links""]",[],[],[],[],"" -1745,http://police.portlandmaine.gov/293/elder-services,Resources,Agency-Published Resources,"Elder Services | Portland, ME - Official Website",Our mission is to creatively and collaboratively address issues that present hardships for Portland residents as they age.,200,"Portland, ME - Official Website | Official Website","[""Elder Services""]",[],[],[],[],[],Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government Departments Health & Human Services Elder Services Elder Services Adult Day Services Age Friendly Portland Age Friendly Business Online Application Elder Abuse Awareness & Prevention Elder Abuse Institute of Maine Elder Advocate Volunteers Snow Shoveling Age Friendly Businesses in Portland Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Health & Human Services Elder Services Elder Services Adult Day Services Age Friendly Portland Age Friendly Business Online Application Elder Abuse Awareness & Prevention Elder Abuse Institute of Maine Elder Advocate Volunteers Snow Shoveling Age Friendly Businesses in Portland Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Health & Human Services Elder Services Elder Services Adult Day Services Age Friendly Portland Age Friendly Business Online Application Elder Abuse Awareness & Prevention Elder Abuse Institute of Maine Elder Advocate Volunteers Snow Shoveling Age Friendly Businesses in Portland Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Health & Human Services Elder Services Elder Services Adult Day Services Age Friendly Portland Age Friendly Business Online Application Elder Abuse Awareness & Prevention Elder Abuse Institute of Maine Elder Advocate Volunteers Snow Shoveling Age Friendly Businesses in Portland Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Health & Human Services Elder Services Elder Services Adult Day Services Age Friendly Portland Age Friendly Business Online Application Elder Abuse Awareness & Prevention Elder Abuse Institute of Maine Elder Advocate Volunteers Snow Shoveling Age Friendly Businesses in Portland Home Your Government Departments Health & Human Services Elder Services Elder Services Adult Day Services Age Friendly Portland Age Friendly Business Online Application Elder Abuse Awareness & Prevention Elder Abuse Institute of Maine Elder Advocate Volunteers Snow Shoveling Age Friendly Businesses in Portland Home Your Government Departments Health & Human Services Elder Services Elder Services Adult Day Services Age Friendly Portland Age Friendly Business Online Application Elder Abuse Awareness & Prevention Elder Abuse Institute of Maine Elder Advocate Volunteers Snow Shoveling Age Friendly Businesses in Portland Home Your Government Departments Health & Human Services Elder Services Elder Services Home Your Government Departments Health & Human Services Elder Services Elder Services Home Your Government Departments Health & Human Services Elder Services Elder Services Elder Services Adult Day Services Age Friendly Portland Age Friendly Business Online Application Elder Abuse Awareness & Prevention Elder Abuse Institute of Maine Elder Advocate Volunteers Snow Shoveling Age Friendly Businesses in Portland Adult Day Services Age Friendly Portland Age Friendly Business Online Application Elder Abuse Awareness & Prevention Elder Abuse Institute of Maine Elder Advocate Volunteers Snow Shoveling Age Friendly Businesses in Portland Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® -1746,https://www.ci.san-ramon.ca.us/our_city/departments_and_divisions/police/fee_and_forms/violation_of_city_ordinance,Resources,Agency-Published Resources,Violation of City Ordinance - City of San Ramon,"",200,Just a moment...,"[""Violation of City Ordinance""]","[""Contact Us"", ""Useful Links""]",[],[],[],[],"" -1747,https://www.mass.gov/doc/wallace-patrick-v-beverly-police-department-11608/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -1748,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/093021blotter.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -1749,https://www.lasalle-il.gov/about-la-salle/city-governance/city-committees/police-judiciary,Contact Info & Agency Meta,Info About Agencies,Police & Judiciary | City of La Salle,"",200,"Error retrieving title: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))","[""Police & Judiciary""]","[""Main navigation"", ""Breadcrumb"", ""Main Menu"", ""Important Info""]",[],[],[],[],"Search Phone: 815-223-3755 Fax: 815-223-9508 Contact Us Main navigation MENU About La Salle Our Mission Event Calendar Historical Tour City Profile » Tourism Ward Map Canal Corridor Association City Services Municipal Information Directory City Government City Mayor City Clerk/Deputy Clerk City Officials City Committees La Salle Promotional & Advisory Committee (LPAC) Ordinances & Codes Departments Building Department Frequently Asked Questions Engineering Frequently Asked Questions Finance/Utility Billing Annual Audits Budget/Appropriations Labor Contracts What We Do Utility Billing Water & Sewer Rates Fire Department Department Overview Department History ISO Rating Apparatus Showcase Public Education Disaster Preparedness Storm Ready Community Fire Department Links Knox Box System Parks & Recreation Interactive Park Map La Salle Parks Information Pollinator Park Police Department Patrol Division Detective Division Communications Division School Resource Officer Program Community Programs TRI-DENT Crime Free Housing Registered Sex Offenders Moving to Town Safety Tips Important Phone Numbers Public Works Frequently Asked Questions What We Do Development Properties Available Properties Business Development Economic Development Development Incentives » TIF Districts Enterprise Zone Redevelopment Incentive Program Hotels & Short Term Rentals Community COVID-19 Info Businesses Dining Health Care Senior Services Worship Education Farmer's Market Public Library Illinois Valley YMCA NewsTribune La Salle Business Association (LBA) Job Market Information Online Services Breadcrumb About La Salle City Committees Police & Judiciary T. Boo Herndon (Chair) 815-993-1488 Jerry Reynolds 815-252-3888 Jim Bacidore 815-223-9357 Tom Ptak 815-228-3491 City Offices: 745 Second Street La Salle, Illinois 61301 Phone: 815-223-3755 Fax: 815-223-9508 Email the City Office City Office Hours: Monday - Friday: 7:30 a.m. - 4:00 p.m. Main Menu Home About La Salle Departments Development Community Contact Us Sitemap Important Info Privacy Policy External Site Policy FOIA Information USA.gov HHS.gov Accessibility Plugins Find Us On Facebook Copyright © 2017-2018 City of LaSalle. All Rights Reserved. La Salle Web Design by Anttix, Inc. " -1750,https://spdblotter.seattle.gov/2015/08/26/police-need-your-help-to-find-missing-toddler-kevin-szal/,Media Bulletins,Agency-Published Resources,(Update) FOUND - Police Need Your Help to Find Missing Toddler Kevin Szal - SPD Blotter,"",200,403 Forbidden,"[""(Update) FOUND – Police Need Your Help to Find Missing Toddler Kevin Szal""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -1751,https://www.sandiego.gov/department-document/update-police-investigate-murder-clairemont,Media Bulletins,Agency-Published Resources,Update Police Investigate Murder in Clairemont | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Update Police Investigate Murder in Clairemont"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -1752,https://www.mass.gov/doc/bcntsaplymouthreverecopperamendmentpdf/download,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1753,http://www.ryepolice.us/pressrelease/rye-beaches-reopening-june-1-2020-press-release/attachment/press-release_0001,Media Bulletins,Agency-Published Resources,Rye Police Department Press Release_0001 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Press Release_0001""]","[""Press Release_0001""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"­ Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Press Release_0001 Home Press Release_0001 Press Release_0001 May 29, 2020 Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search " -1754,https://detroitmi.gov/departments/police-department/detroit-police-department-shield-program/community-partner-resources,Misc Police Activity,Police & Public Interactions,Community Partner Resources | City of Detroit,"Why Join SHIELD?  With the growth of a thriving city and the promise of greater commerce in Detroit comes increased security concerns for law enforcement, business owners, worship centers and citizens alike. The public and private sectors are stronger working together than either is alone. This partnership is the cornerstone in defending the City against terrorism. DPD Shield is a central destination to obtain critical information and engage police department resources. DPD Shield also seeks information from our community and private sector partners to assist in our efforts to keep the City   What We Ask The DPD SHIELD program is a communication two-way street. The key to success is information flowing in two directions. Community partners serve as the eyes and ears of the DPD SHIELD and serve to directly impact efforts to prevent crime and acts of terrorism by reporting suspicious behavior as soon as possible. In addition, we recognize that our community partners are uniquely qualified to assist the Detroit Police Department personnel during an incident. You know what belongs and what is out of place. Sharing your perspective and working together, we are better prepared to face the most difficult challenges.  ",200,City of Detroit | Opportunity Rising,"[""Community Partner Resources""]","[""Top Links"", ""Site Menu"", ""Detroit Police Shield FAQs""]",[],"[""CONTACTS""]",[],[],"" -1755,https://www.southamptontownnypolice.gov/faq.aspx?qid=539,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Do I need to register my alarm system?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Citizens' Response Center""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1756,https://www.lynchburgvapolice.gov/news-updates/attempted-armed-robbery-at-att-store/,Media Bulletins,Agency-Published Resources,Attempted Armed Robbery at AT&T Store - Lynchburg Police Department,"",200,403 Forbidden,"[""Attempted Armed Robbery at AT&T Store""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[],"" -1757,https://delcopa.gov/publicrelations/releases/2020/blackhistorymonth.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Celebrates Black History Month - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Celebrates Black History Month""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Council Vice Chair Dr. Monica Taylor speaks to students at Drexel Hill Middle School""]",[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County Celebrates Black History Month Home / Departments / Public Relations Releases / Delaware County Celebrates Black History Month Council Vice Chair Dr. Monica Taylor speaks to students at Drexel Hill Middle School Delaware County Council Vice Chair Dr. Monica Taylor spoke to students at Drexel Hill Middle School’s Black History Month Kick-Off Assembly on Feb. 3. “African Americans and The Vote” is this year’s theme and was selected by the Association for the Study of African American Life and History, the founders of Black History Month. The theme is built around two important anniversaries — the 150th anniversary of the 15th Amendment, and the right of black men to vote after the Civil War, and the 100th anniversary of the 19th Amendment, which gave women the right to vote. Dr. Taylor spoke to the students about the leaders who paved the way and fought for equality and she encouraged the students to remind their family about the importance of exercising their right to vote. She shared with the students her grandmother’s stories about fighting for equality and the importance of democracy. “My grandmother was always a firm believer that one of the most important rights we have in this county is the right to vote,” Taylor told the students. She recounted stories of her grandmother growing up in the south and the struggles many African Americans and women had. “Just because people have the right to vote, doesn’t mean they always can vote,” explained Taylor. Middle school students, Shaniya Rigby and Chloe Jackson presented an essay and poetry on black history and the democratic process and the Middle School Drill Team led a performance filled with inspirational quotes from African American leaders and icons. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play " -1758,http://www.longbeach.gov/police/press-releases/traffic-fatality-14-/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY(14),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/12/2015 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Saturday, October 10, 2015, at approx. 7:30 p.m., Long Beach Police responded to Willow Street and Redondo Avenue regarding an injury traffic collision between a vehicle and a pedestrian, which resulted in the death of the male adult pedestrian. When officers arrived, they immediately began administering emergency medical care to the victim who had sustained major head trauma. Long Beach Fire Department paramedics arrived and transported the victim to a local hospital where he was pronounced deceased. The preliminary investigation revealed the pedestrian, a 62-year-old male resident of Long Beach, was attempting to cross northbound Willow Street east of Redondo Avenue when he was struck by a 2012 Honda Accord. The Accord had been travelling east on Willow Street and was being driven by a 47-year-old female from Long Beach. The pedestrian was outside of a crosswalk, and according to independent witnesses at the scene, was crossing against a red light and “wait” signal, and the Honda had a green light. The driver of the Honda remained at the scene, was interviewed, and later released. The identity of the pedestrian is being withheld pending notification of next of kin by the Los Angeles County Coroner’s Office. Anyone who may have information regarding this incident is asked to contact Long Beach Police Collision Investigation Detective Steve Fox at (562) 570-7110. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1759,https://www.foxcrossingwi.gov/departments/police-department/history/badge1/,Poor Data Source,Poor Data Source,badge1 - Fox Crossing Fox Crossing,"",200,Fox Crossing - Bridging the Fox Cities Fox Crossing,[],"[""History » badge1""]",[],[],[],[],"Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing History » badge1 This entry was posted on Tuesday, March 20th, 2012 at 11:07 am and is filed under . - You can follow any responses to this entry through the RSS 2.0 feed. - - Responses are currently closed, but you can trackback from your own site. Comments are closed. Copyright © 2010 - 2024 Fox Crossing, All Rights Reserved. Professional Web Site Design by Sandstone Digital. Disclaimer Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing History » badge1 This entry was posted on Tuesday, March 20th, 2012 at 11:07 am and is filed under . - You can follow any responses to this entry through the RSS 2.0 feed. - - Responses are currently closed, but you can trackback from your own site. Comments are closed. Copyright © 2010 - 2024 Fox Crossing, All Rights Reserved. Professional Web Site Design by Sandstone Digital. Disclaimer " -1760,https://www.knoxvilletn.gov/archived_news_stories/2008/police_explorer_class_orientation,Not Criminal Justice Related,Not Criminal Justice Related,Police Explorer Class Orientation - City of Knoxville,communications*,200,Just a moment...,"[""Police Explorer Class Orientation"", ""Communications Director"", ""Police Explorer Class Orientation""]",[],[],[],[],[],Skip navigation {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## -1761,https://coloradosprings.gov/police-department/article/news/officer-involved-shooting-march-7-2022,Officer Involved Shootings,Police & Public Interactions,"Officer-Involved Shooting March 7, 2022 | City of Colorado Springs","",200,Home Page | City of Colorado Springs,"[""Officer-Involved Shooting March 7, 2022""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -1763,http://www.longbeach.gov/police/press-releases/felony-robbery-suspect-arrested-and-charged-1-/,Media Bulletins,Agency-Published Resources,FELONY ROBBERY SUSPECT ARRESTED AND CHARGED(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/30/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: FELONY ROBBERY SUSPECT ARRESTED & CHARGED; MULTIPLE FIREARMS RECOVERED Contact: Media Relations Detail (562) 570-5273 Recovered Firearms On Monday, June 29, 2015, multiple felony charges were filed against a Long Beach resident for his involvement in two commercial robberies that occurred in the City of Long Beach. On Monday, June 22, 2015, a male suspect armed with a handgun entered a restaurant in the 4300 block of East Anaheim Street and demanded money from the cashier. Two days later, on June 24, 2015, a male suspect armed with a handgun entered another restaurant located in the 600 block of Redondo Avenue, and demanded money from the cashier. The loss was cash in both instances and fortunately nobody was injured in either incident. Robbery detectives recognized similarities in the two crimes and believed the same person was responsible for both incidents. Detectives immediately started working the cases and subsequently received an anonymous tip that the suspect lived at a residence in the 3300 block of Roxanne Avenue in Long Beach. On June 25, 2015, detectives served a search warrant at the residence and arrested 21-year-old Randall Nick Young in connection to the robberies. During the course of the investigation, the suspect’s 48-year-old father, Martin Young, was also arrested for weapons and narcotic violations. Detectives recovered in excess of 50 firearms at the residence, in addition to evidence believed to be connected to the robberies. Yesterday, the case was presented to the Los Angeles County District Attorney’s Office for review. Randall Young was charged with four counts of robbery. He is currently being held at Los Angeles County Jail on $100,000 bail. Martin Young has since made bail and is expected to return to court on July 24, 2015. The District Attorney’s Office is still reviewing Martin Young’s case for filing. If anyone has information regarding these crimes they are urged to contact the Long Beach Police Department Robbery Detail Senior Lead Detective Don Collier at (562) 570-5537. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or vist www.LACrimeStoppers.org This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1764,https://www.osc.state.ny.us/local-government/audits/fire-company-or-department/2015/12/18/copenhagen-fire-department-controls-over-financial-activities,Not Criminal Justice Related,Not Criminal Justice Related,Copenhagen Fire Department – Controls Over Financial Activities (2015M-270) | Office of the New York State Comptroller,Copenhagen Fire Department – Controls Over Financial Activities (2015M-270),200,Office of the New York State Comptroller | Thomas P. DiNapoli,"[""Copenhagen Fire Department – Controls Over Financial Activities (2015M-270)"", """"]","[""Main navigation""]","[""Local Government and School Accountability Contact Information:"", ""How would you rate our website?""]","[""Disclaimer"", ""Purpose of Audit"", ""Background"", ""Key Findings"", ""Key Recommendations"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[],"" -1765,https://hilliardohio.gov/hilliard-polices-sgt-higgins-retires-april/,Media Bulletins,Agency-Published Resources,Hilliard Police’s Sgt. Higgins retires April 9 - City of Hilliard,John Higgins isn’t sure if serving as a AAA School Safety Officer at Harrisburg Elementary School in 1975 inspired him to become a police officer or was,200,403 Forbidden,"[""Hilliard Police’s Sgt. Higgins retires April 9""]","[""Residents"", ""It’s a place you can be proud to call home."", ""Government"", ""We exhibit a heart for service, dedication to excellence, and strength in teamwork."", ""Recreation & Parks"", ""We believe in health, wellness, and vibrant quality of life for our community."", ""Police & Courts"", ""Our badge shows we protect and serve. Our approach shows we're part of the community."", ""FAQ"", ""How can we assist you?"", ""Related News"", ""HPD Honors Employees of the Year"", ""No Injuries Reported from Overnight Storm"", ""HPD Taking the Plunge For Special Olympics"", ""LET'S CHAT!"", ""City of Hilliard"", ""Hilliard Police"", ""Rec & Parks"", ""Hilliard Newsletter""]",[],[],[],"[""Click the ‘x’ to opt out.""]",About Hilliard Accessing the Last Mile Aging in Place Committee Annual Events Available Properties Boards and Commissions Application Bridging The Digital Divide Building Standards Division Business Card Order Form Business Media Business Permitting Business Resources City Charter City Manager City of Hilliard – Home Collaborations for Technology Community Garden Community Resources Community Services and Programs Comprehensive Plan Contact the City Contact Us Demographics Designated Outdoor Refreshment Area (DORA) Disc Golf Discrimination Form Downtown Hilliard Downtown Hilliard Map Economic Development Electric Aggregation Engineering Division Ephemeral Wildflowers in Hilliard Fall Festival Feral Cats Fiber To The Home File a Report Online Food Waste Composting Program Forms and Applications HiFiO Hilliard City Lab Hilliard Development Corporation Hilliard Express Hilliard Public Arts Commission Hilliard Trails Hilliard’s Parks History Important Documents Incentives & Programs Information Technology Join the HPD Team Leaf Collection Lifestyle Major Employers Mapping Ohio’s Connectivity Mosquitos Neighborhood Crime Mapping Non Discrimination Now Hiring: Seasonal and Part-Time Positions Operations Department Opportunity Hilliard Personnel Review Board Planning Division Police Transparency in Policing Police Public Records Request Program Guide Public Bids Public Records Recreation and Parks – WebTrac RecTrac User Guide Recycling Roundabouts SAFE Sidewalk Program Sanitary Backflow Program Senior Programs Senior Resources Smart Streets Smart911 Social Investment Sponsorship Stationary Order Form Stormwater Management Street Maintenance & Rehabilitation Program Styrofoam Recycling Summer Rec Camp Sustainability Taxes The Well – Hilliard Recreation and Wellness Center Traffic Calming Traffic Enforcement Requests Transportation & Mobility Division Transportation Planning Trees Vacation House Check Victims Rights Videos Volunteer WebTrac Login Winter Weather Yard Waste Your Hilliard Residents Resident Resources Hilliard 311 Thank you Newsletter Signup Trash Rec & Parks Classes & Camps Rentals Master Parks Plan Pools & Passes The Senior Center Senior Citizen Hall of Fame Sports Government Newsroom Boards & Commissions Planning & Zoning Recreation and Parks Advisory Committee Records Commission Shade Tree Commission Environmental Sustainability Commission Keep Hilliard Beautiful Zoning Appeals Agendas & Minutes City Council Mayor’s Court Departments Community Development Finance Human Resources Law Q & A Business Communication Economic Development Emergency Alerts Fire Holidays HR Mayor’s Court Old Hilliard Police Rec & Parks Solicitation Taxes Trash Q&A Trees Q&A Reporting Online Library Norwich Township Schools Visit Hotels Old Hilliard News Privacy & Usage Policy Sitemap Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Accessibility by WAH Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Font Resize A- A+ Font Resize A- A+ Keyboard navigation Keyboard navigation Readable Font Readable Font Contrast Choose color black white green blue red orange yellow navi Contrast Choose color black white green blue red orange yellow navi black white green blue red orange yellow navi Clear cookies Clear cookies Accessibility by WAH Accessibility by WAH -1766,https://delcopa.gov/courts/specialtycourts/pdf/drugtreatment/treatment court - general rules.pdf,Resources,Agency-Published Resources,"","",200,"","","","","","","","" -1767,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2018_archived_news/july_2018/july_2018_arlington_police_community_newsletter,Media Bulletins,Agency-Published Resources,July 2018 Arlington Police Community Newsletter Available - City of Arlington,"",200,Just a moment...,"[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""July 2018 Arlington Police Community Newsletter Available""]",[],[],[],[],Skip to Content Skip to Content -1768,http://www.longbeach.gov/police/how-do-i/get-inmate-information/,Resources,Agency-Published Resources,Get Inmate Information,Long Beach Police Department- Get Inmate Information,200,City of Long Beach,"[""Police Department""]","[""REMOTE INMATE VISITATION"", ""INMATE INFORMATION""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", """", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk"", ""Have a question about visitation of inmates housed at the Long Beach Police Department?"", ""Call (562) 570-7260"", ""Have a question about visitation of inmates housed at the Los Angeles County Jail?"", ""Call (213) 473-6080""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", """", """", """", """", ""Crime Lab Survey"", """"]",[],"" -1769,http://www.lafayettepolice.us/726/home-emergency-plans,Contact Info & Agency Meta,Info About Agencies,"Home Emergency Plans | Lafayette, IN - Official Website",Make a fire escape plan and practice the safe ways to get out of the house if there is a fire.,200,"Police Department | Lafayette, IN - Official Website","[""Home Emergency Plans""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1770,https://delcopa.gov/council/2019minutes/010919minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1771,https://covington.va.us/city-government/city-departments/police/,Media Bulletins,Agency-Published Resources,Police - Covington City,"",200,Home - Covington City,"[""Police"", ""Police""]","[""TOP ONLINE LINKS""]","[""Wish to make a complaint?"", ""OFFICER COMMENDATION"", ""THE AWARE FOUNDATION, INC.""]","[""NOTICES"", ""MAPLE AVENUE PROJECT UPDATE"", ""ROUTE 18 THERMO STRIPING"", ""CALENDAR""]",[],[],"" -1772,https://www.southamptontownnypolice.gov/899/law-enforcement-career-exploring-program,Training & Hiring Info,Info About Officers,"Law Enforcement Career Exploring Program | Southampton, NY - Official Website","Law Enforcement Career Exploring is open to young men and women ages 14 and not yet 21 years old with an interest in learning more about careers in the field of law enforcement. -",200,"Police | Southampton, NY - Official Website","[""Law Enforcement Career Exploring Program""]","[""Law Enforcement Career Exploring Program""]","[""Site Tools"", ""Contact Us"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In About Us Divisions Information & Resources Community Programs & Services Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Police Community Programs & Services Programs Law Enforcement Career Exploring Program Law Enforcement Career Exploring Program Law Enforcement Career Exploring Program Law Enforcement Career Exploring is a national program that provides educational training programs for young adults on the purposes, mission, and objectives of law enforcement. The primary goals of the program are to help young adults choose a career path within law enforcement and to challenge them to become responsible citizens of their communities and the nation. Law Enforcement Career Exploring is open to young men and women ages 14 and not yet 21 years old with an interest in learning more about careers in the field of law enforcement. Agencies from federal, state, and local levels coordinate the programs throughout the United States. The majority of the community programs, however, are managed by local police departments. Nationally, over 33,000 Explorers and over 8,400 adult volunteers participate in Law Enforcement Career Exploring. Participants learn, among other skills, leadership, respect for police officers, personal skills, marksmanship, and law enforcement protocols. For more information to participate in the Southampton Town Police Explorer Program, please contact: Southampton Police Lieutenant Susan Ralph 631-702-2247 or Email Susan Ralph News Articles: Youths Participate In Makeshift Police Academy: Southampton Press, August 28 2015 Contact Us Chief James Kiernan Ph: 631-702-2220 Headquarters 110 Old Riverhead Road Hampton Bays, NY 11946 Emergency: 911 Ph: 631-728-5000 Fx: 631-728-5440 Staff Directory Civilian Academy Coffee with a Cop Crime Tips Hotline Emergency Management Explorers Homeless Outreach Law Enforcement Career Exploring Program Neighborhood Watch Police Internships School Resource Officer Shop with a Cop Youth Academy Public Information FOIL Requests Crash Reports Online Forms Community Programs & Services Contact Us Contact Us Police Headquarters 110 Old Riverhead Road Hampton Bays, NY 11946 Emergency: 911 Phone: 631-728-5000 Fax: 631-728-5440 Site Links Home Contact Us Site Map Accessibility Copyright Notices Employee Intranet Title Vl Non-Discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -1773,https://delcopa.gov/sustainability/presentations/22/11_kellysanders_v1.pptx,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"Delaware County, Pennsylvania",[],[],[],[],[],[],"" -1774,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0725/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1775,https://www.lynchburgvapolice.gov/news-updates/shooting-scene-on-golf-park-drive/,Media Bulletins,Agency-Published Resources,Shooting Scene on Golf Park Drive - Lynchburg Police Department,"",200,403 Forbidden,"[""Shooting Scene on Golf Park Drive""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[],"" -1776,https://www.montgomeryohio.gov/historic-photos/police-officers-1970_50506081303_o/,Poor Data Source,Poor Data Source,"- Montgomery, Ohio","",200,"Welcome - Montgomery, Ohio","[""""]","[""Primary menu links"", ""Action toolbar"", ""Welcome"", ""Engage"", ""Help"", ""Mental Health Resource""]",[],[],[],[],"Montgomery, Ohio Primary menu links Services Community Government Events News Contact Action toolbar Answers Report Issue Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Search Primary menu links Services Community Government Events News Contact Action toolbar Answers Report Issue Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Search Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Montgomery, Ohio Montgomery, Ohio Montgomery, Ohio Helpful Share Facebook Twitter Email Size + Reset a − Welcome About Montgomery Montgomery City Hall 10101 Montgomery Rd. Montgomery, OH 45242 513-891-2424 Engage Connect CodeRed Contact Subscribe Help Accessibility Comment Policy Copyright Directory Disclaimer Public Records Policy/Request Security Policy Services Sitemap Mental Health Resource Suicide Prevention Lifeline : 988 Mobile Crisis Team: 513-584-5098 Mental Health Access Point : 513-558-8888 National Alliance on Mental Illness (NAMI): 800-950-6264 More Information " -1777,https://www.montgomeryohio.gov/police-department-citizen-complaint-notice/,Complaints & Misconduct,Info About Officers,"Police Department Citizen Complaint Notice - Montgomery, Ohio","",200,"Welcome - Montgomery, Ohio","[""Police Department Citizen Complaint Notice""]","[""Primary menu links"", ""Action toolbar"", ""Welcome"", ""Engage"", ""Help"", ""Mental Health Resource""]",[],[],[],[],"Montgomery, Ohio Primary menu links Services Community Government Events News Contact Action toolbar Answers Report Issue Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Search Primary menu links Services Community Government Events News Contact Action toolbar Answers Report Issue Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Search Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Montgomery, Ohio Montgomery, Ohio Montgomery, Ohio " -1778,https://www.doj.state.or.us/events/predicting-intimate-partner-violence-injuries-based-on-police-reports/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1779,https://alpha.austin.gov/es/police-oversight/formal-complaint-de-escalation-of-potential-force-encounters-and-other-policy-violations-7/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1780,https://alpha.austin.gov/es/police-oversight/9-17-20-3/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1781,https://delcopa.gov/planning/pdf/mapping/tinicum.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -1782,https://detroitmi.gov/departments/police-department/senior-citizens-911-profile,Resources,Agency-Published Resources,Senior Citizens 911 Profile | City of Detroit,"The Detroit Police Department is firmly committed to providing professional service to all residents.  However, in an effort to improve our service delivery model for our senior citizens (65 years of age or older) the Detroit Police Department will be implementing a new service: Senior 911 Profile. This service will allow our senior citizens to have their individual profiles stored in our 911 database and provide critical care information to the 911 call-takers in the event of an emergency situation. This should improve the call taking, dispatch and emergency response process. If you would like to take advantage of the Senior 911 Profile Agreement, please download or print out the agreement located below.  Please read the agreement in its entirety, fill out all of the required fields marked with an asterisk *, and complete any additional information that you would like to include. Senior-Citizens-911-Profile   The profile can be faxed to (313) 596-1610.  Please include a copy of your Michigan State I.D. or Driver's License. The profile can also be hand delivered to any Detroit Police Department Precinct.  However, if someone else is dropping off the profile for you, you must include a copy of your Michigan State I.D. or Driver's License with your profile.",200,City of Detroit | Opportunity Rising,"[""Senior Citizens 911 Profile""]","[""Top Links"", ""Site Menu""]",[],[],[],[],"" -1783,https://pittsburghpa.gov/police/ssd,Poor Data Source,Poor Data Source,"","",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", """", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],[],[],[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -1784,http://www.longbeach.gov/police/press-releases/in-custody-death-1-/,Media Bulletins,Agency-Published Resources,IN-CUSTODY DEATH(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/21/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: IN-CUSTODY DEATH Contact: Media Relations Detail (562) 570-7244 On Thursday, April 10, 2014, Long Beach Police contacted 43-year-old Rolando Sanchez of Long Beach, and a female subject, in the area of 25th Street and Baltic Avenue, for suspicion of narcotics activity. During the course of the officer’s investigation, they arrested both subjects for possession of methamphetamine. They were booked into the Long Beach City Jail awaiting arraignment the following Monday. In the early afternoon of Sunday, April 13, 2013, jail staff making rounds contacted Sanchez and noticed he was acting abnormal. Although awake, he was unresponsive to questions about his behavior. A nurse was called in to assess his condition and a decision was made to have paramedics transport him to the hospital for further evaluation. While in the hospital, he went into medical distress. Due to his critical condition, and since he was in L.B.P.D.’s custody when his medical issues began, detectives from the Homicide Detail responded to investigate the incident, which is standard in all such cases. Sanchez was released from custody and his treatment continued by hospital staff. On Wednesday, April 16th, L.B.P.D. learned that Sanchez had died the previous night, Tuesday, April 15, 2014, at approximately 10:00 p.m. It is unknown what caused him to go into medical distress. The Los Angeles County Coroner’s office is conducting an independent investigation to determine the cause of death, and the Long Beach Police Department Homicide Detail is also continuing their investigation into the incident. Anyone with information should contact Long Beach Police Homicide Detectives Hugo Cortes and Peter Lackovic at (562) 570-7244. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1785,https://www.hayward-ca.gov/police-department/public-services/youth-family-services-bureau//curfew-violations,Media Bulletins,Agency-Published Resources,Curfew Violations | City of Hayward - Official website,Minor Prohibited in Pool RoomsOffensesDefinitionsRestricted hours for curfew violations are:Sunday through Thursday 10:00 am – 6:00 amFriday and Saturday 12:01 am – 6:00 amService Contacts:Report a suspected curfew offender by calling 510.293.7000.,200,City of Hayward - Official website,[],"[""Curfew Violations"", ""You are here. So is everything else."", ""Search form""]",[],"[""Receive crime bulletins and alerts"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],"Skip to main content Search modal button POLICE Mobile Menu button Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Make a Payment Access Hayward Translate Search POLICE About HPD Divisions Programs Public Services Public Services Administrative Citations & Hearings Animal Services Identity Theft Youth and Family Services Bureau Crime Prevention Transparency Home Public Services Youth and Family Services Bureau Curfew Violations Curfew violations involve minors loitering in a public place during restricted hours without adult supervision, as outlined in the Hayward Municipal Code: Minor Prohibited in Pool Rooms Offenses Definitions Restricted hours for curfew violations are: Sunday through Thursday 10:00 am – 6:00 am Friday and Saturday 12:01 am – 6:00 am Service Contacts : Report a suspected curfew offender by calling 510.293.7000. Public Services Administrative Citations & Hearings Animal Services Identity Theft Youth and Family Services Bureau Our Staff Contact Family Counseling, Crisis Intervention & Case Management School Resource Officer Program Our Kids Our Families School Based Program Police Explorer Program Mandated Reporting Missing Persons & Juveniles Curfew Violations Search modal button POLICE Mobile Menu button POLICE Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Make a Payment Access Hayward Translate Search Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Make a Payment Access Hayward Translate Search Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Make a Payment Access Hayward Translate Search Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search POLICE About HPD Divisions Programs Public Services Public Services Administrative Citations & Hearings Animal Services Identity Theft Youth and Family Services Bureau Crime Prevention Transparency POLICE About HPD Divisions Programs Public Services Public Services Administrative Citations & Hearings Animal Services Identity Theft Youth and Family Services Bureau Crime Prevention Transparency POLICE About HPD Divisions Programs Public Services Public Services Administrative Citations & Hearings Animal Services Identity Theft Youth and Family Services Bureau Crime Prevention Transparency About HPD Divisions Programs Public Services Public Services Administrative Citations & Hearings Animal Services Identity Theft Youth and Family Services Bureau Crime Prevention Transparency About HPD Divisions Programs Public Services Public Services Administrative Citations & Hearings Animal Services Identity Theft Youth and Family Services Bureau Crime Prevention Transparency Home Public Services Youth and Family Services Bureau Home Public Services Youth and Family Services Bureau Home Public Services Youth and Family Services Bureau " -1786,https://dccouncil.gov/judiciary-public-safety/copy-of-fo0_fy19_attachment-iv/,Annual & Monthly Reports,Info About Agencies,Copy of FO0_FY19_Attachment IV • Council of the District of Columbia,"",200,Home • Council of the District of Columbia,"[""Copy of FO0_FY19_Attachment IV""]",[],[],[],[],[],"Federal Tax Counter: $1,298,450,147 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Federal Tax Counter: $1,298,450,147 What is this? Get Updates RSS Press Center facebook twitter youtube Federal Tax Counter: $1,298,450,147 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Council of the District of Columbia Copy of FO0_FY19_Attachment IV October 10, 2018 Loading... Copy of FO0_FY19_Attachment IV October 10, 2018 Loading... Loading... Loading... DC Council seal About the Council Open Government Register to Vote Council Updates Jobs Council Directory Privacy Policy Commemorative D.C. Flag Program Ethics Visit the Wilson Building facebook twitter youtube Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Search facebook twitter youtube Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate " -1787,http://www.longbeach.gov/police/press-releases/deceased-infant-found-in-alley/,Media Bulletins,Agency-Published Resources,DECEASED INFANT FOUND IN ALLEY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/24/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: DECEASED INFANT FOUND IN ALLEY Contact: Media Relations Detail (562)570-5273 On February 23, 2016, at approximately 4:22 p.m., officers were dispatched to the area of 67th Street and Gardenia Avenue, to assist the Long Beach Fire Department with the dead body of an infant that appeared to have been burned. Upon their arrival officer conducted a preliminary investigation and notified the Homicide Detail. Detectives responded to the scene and confirmed the deceased was that of an infant and not burned, but in a state of decomposition giving it that appearance. The deceased infant was found by neighborhood residents who were walking in an alley where 67th Street and Gardenia Avenue meet. The infant was among some cardboard boxes and debris. The cause of death is unknown at this time and will be determined by the Los Angeles County Coroner’s Office. They will also determine the approximate age and race of the infant. The investigation remains ongoing and we are asking for the public’s help. If anyone is aware of someone who was recently pregnant, but is no longer in that condition, and is not caring for an infant, we would like to speak with them. Anyone with information is urged to call Homicide Detectives Peter Lackovic, Sean Irving, or Oscar Valenzuela at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit http://www.lacrimestoppers.org/ . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1788,https://toddmissiontx.gov/mp_teams/police-department/,Contact Info & Agency Meta,Info About Agencies,Police Department – City of Todd Mission,"",200,City of Todd Mission – Home of the Texas Renaissance Festival,[],"[""Gateway to the Texas Renaissance Festival"", ""Ryan Rutledge"", ""Keith Winford"", ""Ryan Schroeder"", ""Lawrence Pivonka"", ""Zeva K-9"", ""Events""]","[""Todd Mission City Hall""]",[],[],[],"Gateway to the Texas Renaissance Festival Home Government City Council Agenda/Minutes City Ordinances Financial Transparency General Election / General Elección Departments Police Department Municipal Court Fire Department Residents City Limits & ETJ  Map Fair Housing Mosquito Control Comprehensive Plan Doing Business Community Profile Business License Permits Sales Tax Information How Do I…? Permits Events Contact Us Pay Your Ticket Online Pay Business Fee Pay Permit Fee Ryan Rutledge ... January 24, 2024 Read More Keith Winford ... January 24, 2024 Read More Ryan Schroeder ... January 24, 2024 Read More Lawrence Pivonka ... January 24, 2024 Read More Zeva K-9 ... January 24, 2024 Read More Events No events Todd Mission City Hall Business Hours: 9:00 a.m. to 5:00 p.m. M-F 936-894-3001 21718 FM 1774 Todd Mission TX 77363-7722 info@ToddMissionTX.gov PAY YOUR TICKET ONLINE Pay Business License Fee Pay Permit Fee Home Government Departments Residents Doing Business How Do I? Contact Us Events Log In Copyright © 2016-2024 City of Todd Mission. All rights reserved. Gateway to the Texas Renaissance Festival Gateway to the Texas Renaissance Festival Home Government City Council Agenda/Minutes City Ordinances Financial Transparency General Election / General Elección Departments Police Department Municipal Court Fire Department Residents City Limits & ETJ  Map Fair Housing Mosquito Control Comprehensive Plan Doing Business Community Profile Business License Permits Sales Tax Information How Do I…? Permits Events Contact Us Pay Your Ticket Online Pay Business Fee Pay Permit Fee Home Government City Council Agenda/Minutes City Ordinances Financial Transparency General Election / General Elección Departments Police Department Municipal Court Fire Department Residents City Limits & ETJ  Map Fair Housing Mosquito Control Comprehensive Plan Doing Business Community Profile Business License Permits Sales Tax Information How Do I…? Permits Events Contact Us Pay Your Ticket Online Pay Business Fee Pay Permit Fee Home Government City Council Agenda/Minutes City Ordinances Financial Transparency General Election / General Elección Departments Police Department Municipal Court Fire Department Residents City Limits & ETJ  Map Fair Housing Mosquito Control Comprehensive Plan Doing Business Community Profile Business License Permits Sales Tax Information How Do I…? Permits Events Contact Us Pay Your Ticket Online Pay Business Fee Pay Permit Fee Home Government City Council Agenda/Minutes City Ordinances Financial Transparency General Election / General Elección Departments Police Department Municipal Court Fire Department Residents City Limits & ETJ  Map Fair Housing Mosquito Control Comprehensive Plan Doing Business Community Profile Business License Permits Sales Tax Information How Do I…? Permits Events Contact Us Pay Your Ticket Online Pay Business Fee Pay Permit Fee " -1789,https://police.birminghamal.gov/bureaus/patrol/tactical-operations-precinct/,Contact Info & Agency Meta,Info About Agencies,Tactical Operations Precinct | Birmingham Police Department,"",200,"Home | Police Department - Birmingham, AL","[""Birmingham Police Department Commitment | Excellence | Integrity""]","[""Putting People First"", ""Tactical Operations Precinct""]",[],"[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[],Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Search -1790,https://www.mass.gov/doc/jlm-13-2559-city-of-springfield-and-international-brotherhood-of-police-officers-local-364/download,Misc Police Activity,Police & Public Interactions,"","",200,"","","","","","","","" -1791,https://www.southamptontownnypolice.gov/1340/endangered-species-resolutions,Not Criminal Justice Related,Not Criminal Justice Related,"Resolutions related to 4 x 4 Permits | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Resolutions related to 4 x 4 Permits""]","[""Southampton Town, NY Waterfowl Hunting""]","[""Site Tools"", ""Endangered Species Annual Reports"", ""Contact Us"", ""Site Links"", ""Loading""]","[""Endangered Species Resolutions""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Town Services Town Trustees Endangered Species Resolutions Resolutions related to 4 x 4 Permits Endangered Species Resolutions Allow Certain 4x4 Permit Holders to Use Lake Agawam Parking Lot as Mitigation for Beach Driving Closures due to Piping Plover and Least Tern Acti Expand Daytime Beach Driving Area Along Peconic Bay Beach as Mitigation for 4x4 Beach Closures Caused by Piping Plover and Least Tern Activity Southampton Town, NY Waterfowl Hunting Endangered Species Annual Reports 2023 Endangered Species Annual Report 2022 Endangered Species Annual Report 2021 Endangered Species Annual Report 2020 Endangered Species Annual Report 2019 Endangered Species Annual Report 2018 Endangered Species Annual Report Parks & Recreation Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Town Services Town Trustees Endangered Species Resolutions Resolutions related to 4 x 4 Permits Endangered Species Resolutions Allow Certain 4x4 Permit Holders to Use Lake Agawam Parking Lot as Mitigation for Beach Driving Closures due to Piping Plover and Least Tern Acti Expand Daytime Beach Driving Area Along Peconic Bay Beach as Mitigation for 4x4 Beach Closures Caused by Piping Plover and Least Tern Activity Southampton Town, NY Waterfowl Hunting Endangered Species Annual Reports 2023 Endangered Species Annual Report 2022 Endangered Species Annual Report 2021 Endangered Species Annual Report 2020 Endangered Species Annual Report 2019 Endangered Species Annual Report 2018 Endangered Species Annual Report Parks & Recreation Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -1792,https://alpha.austin.gov/es/police-oversight/recommendations-for-improving-apds-policy-development-practices/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1793,http://www.lafayettepolice.us/1618/research-participation-spotlight,Not Criminal Justice Related,Not Criminal Justice Related,"Research Participation Spotlight | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Research Participation Spotlight""]",[],"[""Hellbenders"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About the Zoo Get Involved Education Programs Special Events I Want To... Home Government Departments H - W Parks & Recreation Facilities Columbian Park Zoo About the Zoo Conservation and Research Research Participation Spotlight Research Participation Spotlight Hellbenders Columbian Park Zoo is one of four Indiana zoos that are participating in a Purdue conservation program that will help increase the survival rates of hellbenders in the wild. In 2018, we received three three-year old hellbenders, or giant salamanders from Purdue University in hopes of releasing them back into their Southern Indiana habitat to be tracked. -Hellbender populations are decreasing in the wild partly due to habitat degradation, low-quality water and infectious disease. To help with increasing awareness of this declining species we are incorporating hellbender conservation messages into our education programs. Research Participation Spotlight Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About the Zoo Get Involved Education Programs Special Events I Want To... Home Government Departments H - W Parks & Recreation Facilities Columbian Park Zoo About the Zoo Conservation and Research Research Participation Spotlight Research Participation Spotlight Hellbenders Columbian Park Zoo is one of four Indiana zoos that are participating in a Purdue conservation program that will help increase the survival rates of hellbenders in the wild. In 2018, we received three three-year old hellbenders, or giant salamanders from Purdue University in hopes of releasing them back into their Southern Indiana habitat to be tracked. -Hellbender populations are decreasing in the wild partly due to habitat degradation, low-quality water and infectious disease. To help with increasing awareness of this declining species we are incorporating hellbender conservation messages into our education programs. Research Participation Spotlight Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -1794,https://spdblotter.seattle.gov/2012/07/03/spd-taking-applications-for-autumn-community-police-academy/,Media Bulletins,Agency-Published Resources,Seattle Police Accepting Applications for Autumn 2012 Community Police Academy - SPD Blotter,"",200,403 Forbidden,"[""Seattle Police Accepting Applications for Autumn 2012 Community Police Academy""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -1795,http://www.tampa.gov/news/tampa-police-conduct-death-investigation-interstate-275-76591,Poor Data Source,Poor Data Source,Tampa Police Conduct Death Investigation on Interstate 275 | City of Tampa,"Late Tuesday night, Tampa Police responded to what was originally reported as a vehicle crashing into the guardrail in the southbound lanes of Interstate 275. Officers arrived to find a 2015 blue Dodge with multiple bullet holes resting against the center concrete guardrail. The driver, a 22-year-old black male, was found suffering from a gunshot to the upper body. Tampa Fire Rescue transported the driver to a nearby hospital where he was pronounced deceased. The southbound lanes of the interstate were closed at 11:31 PM to allow the scene to be processed, reopening at 6:30 AM.",200,City of Tampa,"[""Tampa Police Conduct Death Investigation on Interstate 275""]","[""Information Resources"", ""Latest News"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[],"" -1796,https://champaignil.gov/2012/03/22/police-officer-written-exam/,Training & Hiring Info,Info About Officers,Police Officer Written Exam - City of Champaign,"",200,403 Forbidden,"[""Police Officer Written Exam""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Police Officer Written Exam Search Posted on March 22, 2012 The Human Resources staff will be administering the entry level Police Officer candidate test at the I-Hotel & Conference Center in Champaign this Saturday, March 24 at 8:30 a.m. to 12 p.m. Approximately 300 candidates are expected to attend this exam, and will be tested in the areas of: Arithmetic, Reading Comprehension, Grammar and Incident Report Writing. The 100 candidates with the highest scores will be interviewed by the Police & Fire Commission next month. The combined scores from the written test & interviews will determine the rank order of the candidates. Categories: Police Department News Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works " -1797,https://audgen.michigan.gov/complete-projects/michigan-state-police-retirement-system/r071015416/,List of Data Sources,Info About Agencies,r071015416 - Michigan Office of the Auditor General,"",200,Home - Michigan Office of the Auditor General,"[""r071015416""]","[""Homepage under OAG logo – Notifications"", ""Post navigation""]",[],"[""Auditor General""]","[""Doug Ringler, CPA, CIA Auditor General""]",[],"Skip to content Homepage under OAG logo – Notifications Currently Hiring – New Position Posted × search Home About Audit Details Analysis of an Audit Management Staff Awards and Recognition Organizational Chart Annual Reports Transparency History of the OAG Work In Progress Completed Projects Report Fraud How to Report Allegations What the OAG Investigates Common Questions and Answers What is Fraud, Waste, and Abuse? Investigative Audit Reports Careers CURRENT JOB OPENING(S) Come Meet Us! Who are we? What do we do? Who are we looking for? What benefits do we offer? How do I apply? Our Office Values Contact FOIA Request Public Information Officer Staff Directory Location r071015416 r071015416 Post navigation Michigan State Police Retirement System Auditor General Doug Ringler, CPA, CIA Auditor General 201 N. Washington Square, Sixth Floor Lansing, Michigan 48913 Phone (517) 334-8050 Home › OTHER SITES Michigan House of Representatives Michigan Senate Michigan Legislature All content and materials copyright 2024 Office of the Auditor General Website Designed & Developed by Web Ascender Log in | Sitemap | Privacy Statement | Message for OAG Staff Homepage under OAG logo – Notifications Currently Hiring – New Position Posted × search Homepage under OAG logo – Notifications Currently Hiring – New Position Posted Currently Hiring – New Position Posted × search × search × search × search × search × search × × Home About Audit Details Analysis of an Audit Management Staff Awards and Recognition Organizational Chart Annual Reports Transparency History of the OAG Work In Progress Completed Projects Report Fraud How to Report Allegations What the OAG Investigates Common Questions and Answers What is Fraud, Waste, and Abuse? Investigative Audit Reports Careers CURRENT JOB OPENING(S) Come Meet Us! Who are we? What do we do? Who are we looking for? What benefits do we offer? How do I apply? Our Office Values Contact FOIA Request Public Information Officer Staff Directory Location Home About Audit Details Analysis of an Audit Management Staff Awards and Recognition Organizational Chart Annual Reports Transparency History of the OAG Work In Progress Completed Projects Report Fraud How to Report Allegations What the OAG Investigates Common Questions and Answers What is Fraud, Waste, and Abuse? Investigative Audit Reports Careers CURRENT JOB OPENING(S) Come Meet Us! Who are we? What do we do? Who are we looking for? What benefits do we offer? How do I apply? Our Office Values Contact FOIA Request Public Information Officer Staff Directory Location r071015416 r071015416 Post navigation Michigan State Police Retirement System r071015416 r071015416 Post navigation Michigan State Police Retirement System r071015416 r071015416 Post navigation Michigan State Police Retirement System r071015416 r071015416 Post navigation Michigan State Police Retirement System r071015416 Michigan State Police Retirement System Michigan State Police Retirement System " -1798,https://cityofpowell.us/reports/auto-draft-322/2020-08-police-department/,Annual & Monthly Reports,Info About Agencies,"City of Powell, Ohio | 2020.08 Police Department","",200,"City of Powell, Ohio","[""2020.08 Police Department""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -1799,http://police.portlandmaine.gov/652/portland-community-free-clinic,Resources,Agency-Published Resources,"Portland Community Free Clinic | Portland, ME - Official Website",Patients of the Portland Community Free Clinic with urgent needs should go to urgent care or the emergency department.,200,"Portland, ME - Official Website | Official Website","[""Portland Community Free Clinic""]",[],[],[],[],[],Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Portland Community Free Clinic Portland Community Free Clinic Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Portland Community Free Clinic Portland Community Free Clinic Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Portland Community Free Clinic Portland Community Free Clinic Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Portland Community Free Clinic Portland Community Free Clinic Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Portland Community Free Clinic Portland Community Free Clinic Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Portland Community Free Clinic Portland Community Free Clinic Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Portland Community Free Clinic Portland Community Free Clinic Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Portland Community Free Clinic Portland Community Free Clinic Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Portland Community Free Clinic Portland Community Free Clinic Home Your Government Departments Health & Human Services Public Health Portland Public Health Clinic Portland Community Free Clinic Portland Community Free Clinic Portland Community Free Clinic Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Needle Exchange Program Portland Community Free Clinic PrEP STD Clinic Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® -1800,https://barnegatpolice.us/download/missing-person-report-ncic/,Resources,Agency-Published Resources,"","",404,"","","","","","","","" -1801,https://delcopa.gov/courts/domesticrelations/changeofaddress.html,Resources,Agency-Published Resources,"Copies of your Court Orders- Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Change Your Address""]",[],"[""Domestic Relations Navigation"", ""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[],"Menu A to Z Court Departments Local Rules FAQ Government Center Change Your Address Home / Court Departments / Domestic Relations / Change Your Address Submit your address in writing and include a copy of a photo ID by one of the following methods: Mail: Domestic Relations P.O. Box 543 Media, PA 19063 Email: delawarecaseworker@pacses.com Fax: 610-891-1959 Domestic Relations Navigation How do I... Apply for Support Services Prepare for my Conference/Hearing Comply with my Support Order Pay my Support Get Payment for Medical Bills Modify my Support Order Get Copies of my Court Order Change my Address Close my Support Case Legal Services Forms Family Court Self Represented Litigant Guide Patricia Coacher, Esquire Director Domestic Relations Chief Counsel Curran Building County Courthouse Complex 2nd & Orange Streets Media, PA 19063 Phone: 610-891-4314 Press 1 for IVR Press 2 to speak to a Client Information Representative Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 delcocourts@co.delaware.pa.us Courts Quick Links Juror eResponse PA Law Help Self Help - Custody Self Help - Divorce Juror Handbook Language Access Family Court Self Represented Litigant Guide Government Center Quick Links Marriage Licenses Crisis Connection Certified Recovery Specialist Public Access Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Change Your Address Home / Court Departments / Domestic Relations / Change Your Address Change Your Address Home / Court Departments / Domestic Relations / Change Your Address Change Your Address Home / Court Departments / Domestic Relations / Change Your Address Submit your address in writing and include a copy of a photo ID by one of the following methods: Mail: Domestic Relations P.O. Box 543 Media, PA 19063 Email: delawarecaseworker@pacses.com Fax: 610-891-1959 Domestic Relations Navigation How do I... Apply for Support Services Prepare for my Conference/Hearing Comply with my Support Order Pay my Support Get Payment for Medical Bills Modify my Support Order Get Copies of my Court Order Change my Address Close my Support Case Legal Services Forms Family Court Self Represented Litigant Guide Patricia Coacher, Esquire Director Domestic Relations Chief Counsel Curran Building County Courthouse Complex 2nd & Orange Streets Media, PA 19063 Phone: 610-891-4314 Press 1 for IVR Press 2 to speak to a Client Information Representative Submit your address in writing and include a copy of a photo ID by one of the following methods: Mail: Domestic Relations P.O. Box 543 Media, PA 19063 Email: delawarecaseworker@pacses.com Fax: 610-891-1959 " -1802,https://www.newcarrolltonmd.gov/government/departments/police_department/how_do_i__/vehicle_release,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -1803,https://www.colma.ca.gov/document_taxonomy/police-department/,List of Data Sources,Info About Agencies,Police Department Archives - Town of Colma,"",200,Home - Town of Colma,"[""Document Types: Police Department""]","[""Primary menu links"", ""Action toolbar"", ""PD Press Release – C23-0912-05"", ""Colma PD Press Release – C23-0501-04"", ""Colma PD Press Release – C23-0424-04 and C23-0426-07"", ""Press Release – BART Fare Evasion Detail"", ""Press Release – C22-0420-01"", ""Press Release C22-0106-04"", ""CPD Press Release C21-0913-02"", ""PD Press Release C21-0111-01"", ""Press Release – C20-1212-01"", ""Press Release – C20-1127-01"", ""Posts navigation"", ""Contact"", ""Subscribe"", ""Connect""]",[],[],[],[],"Town of Colma Primary menu links About Residents Businesses Visitors City Council Departments Events News Contact Action toolbar Search Primary menu links About Residents Businesses Visitors City Council Departments Events News Contact Action toolbar Search Town of Colma Town of Colma Town of Colma Document Types: Police Department PD Press Release – C23-0912-05 Colma PD Press Release – C23-0501-04 Colma PD Press Release – C23-0424-04 and C23-0426-07 Press Release – BART Fare Evasion Detail Press Release – C22-0420-01 Press Release C22-0106-04 CPD Press Release C21-0913-02 PD Press Release C21-0111-01 Press Release – C20-1212-01 Press Release – C20-1127-01 Posts navigation Older posts Document Types: Police Department PD Press Release – C23-0912-05 Colma PD Press Release – C23-0501-04 Colma PD Press Release – C23-0424-04 and C23-0426-07 Press Release – BART Fare Evasion Detail Press Release – C22-0420-01 Press Release C22-0106-04 CPD Press Release C21-0913-02 PD Press Release C21-0111-01 Press Release – C20-1212-01 Press Release – C20-1127-01 Posts navigation Older posts Document Types: Police Department Older posts Older posts Helpful Share Facebook Twitter Email Size + Reset a − Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Contact Town of Colma 1198 El Camino Real Colma, CA 94014 (650) 997-8300 (650) 997-8308 (fax) Contact Links Directory Feedback Access Links Accessibility Sitemap Subscribe Connect Twitter Facebook Contact Town of Colma 1198 El Camino Real Colma, CA 94014 (650) 997-8300 (650) 997-8308 (fax) Contact Links Directory Feedback Access Links Accessibility Sitemap Subscribe Connect Twitter Facebook Contact Town of Colma 1198 El Camino Real Colma, CA 94014 (650) 997-8300 (650) 997-8308 (fax) Contact Links Directory Feedback Access Links Accessibility Sitemap Subscribe Connect Twitter Facebook Powered by Powered by " -1804,https://www.fortworthtexas.gov/departments/police/professional-standards,List of Data Sources,Info About Agencies,Professional Standards Division,"",200,Error retrieving title: 'NoneType' object has no attribute 'text',"[""Police Department""]","[""Professional Standards Division"", ""Search One Address. Find Everything.""]","[""Internal Affairs Mission & Purpose"", ""Misconduct Investigation Examples"", ""Complaint Process"", ""Disposition"", ""Legal Stuff"", ""Public Information Requests"", ""Support Services"", ""Resources"", ""Helpful Links"", ""Connect With FWPD""]",[],[],[],"" -1805,https://brookfieldil.gov/police-pension-board-012920/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1806,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0373/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1807,https://alpha.austin.gov/en/police-oversight/temporary-suspension-of-police-sergeant-jeffrey-dwyer/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1808,http://www.longbeach.gov/police/press-releases/murder-46-/,Media Bulletins,Agency-Published Resources,MURDER(46),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/19/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On 3/19/16 at approximately 02:25 a.m., officers were dispatched to the 2300 block of Cameron Street regarding gunshots heard. While responding to the scene they were advised that there was a subject down in the street. Upon arrival officers found a male adult suffering from what appeared to be a gunshot wound to the upper torso. Long Beach fire department responded and determined the subject deceased at the scene. The victim has been identified as Christopher Delatorre, 30 year old resident of Long Beach. The incident is being investigated as gang related Anyone with information regarding the incident is urged to call Homicide Detectives at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/19/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On 3/19/16 at approximately 02:25 a.m., officers were dispatched to the 2300 block of Cameron Street regarding gunshots heard. While responding to the scene they were advised that there was a subject down in the street. Upon arrival officers found a male adult suffering from what appeared to be a gunshot wound to the upper torso. Long Beach fire department responded and determined the subject deceased at the scene. The victim has been identified as Christopher Delatorre, 30 year old resident of Long Beach. The incident is being investigated as gang related Anyone with information regarding the incident is urged to call Homicide Detectives at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ A- A A+ A- A A+ A- A A+ A- A A+ " -1809,https://www.southamptontownnypolice.gov/1325/mill-pond-association,Not Criminal Justice Related,Not Criminal Justice Related,"Mill Pond Association | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Mill Pond Association""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]","[""WQIP - Proposal Summary"", ""WQIP - Fund Application"", ""Public Hearing Presentation"", ""2020 REPORT""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Community Preservation Fund (CPF) WQIPP - Plan/Checklist/App 2019 WQIP - Applications & Proposal Summaries Mill Pond Association Mill Pond Association WQIP - Proposal Summary WQIP Proposal Summary Sheet (2019) - Mill Pond Association WQIP - Fund Application WQIP Fund Application (2019) - Mill Pond Association Public Hearing Presentation Mill Pond Water Quality Application - Presentation 2020 REPORT MILL POND RESTORATION PROJECT 2020 REPORT - DRAFT Bridgehampton Beach Club Pavillion Mill Pond Association Town Trustees - Mecox Bay/Aquatic Restoration Village of Southampton - Lake Agawam Stormwater Village of Sag Harbor - Green Infrastructure Westhampton School District/Center for Clean Water Sagaponack Pond Aquatic Habitat Restoration Plan Alewife Creek Restoration Project Town Trustees - Pump Out Program Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Community Preservation Fund (CPF) WQIPP - Plan/Checklist/App 2019 WQIP - Applications & Proposal Summaries Mill Pond Association Mill Pond Association WQIP - Proposal Summary WQIP Proposal Summary Sheet (2019) - Mill Pond Association WQIP - Fund Application WQIP Fund Application (2019) - Mill Pond Association Public Hearing Presentation Mill Pond Water Quality Application - Presentation 2020 REPORT MILL POND RESTORATION PROJECT 2020 REPORT - DRAFT Bridgehampton Beach Club Pavillion Mill Pond Association Town Trustees - Mecox Bay/Aquatic Restoration Village of Southampton - Lake Agawam Stormwater Village of Sag Harbor - Green Infrastructure Westhampton School District/Center for Clean Water Sagaponack Pond Aquatic Habitat Restoration Plan Alewife Creek Restoration Project Town Trustees - Pump Out Program Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -1810,https://www.southamptontownnypolice.gov/1323/village-of-sag-harbor---green-infrastruc,Not Criminal Justice Related,Not Criminal Justice Related,"Village of Sag Harbor - Green Infrastructure | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Village of Sag Harbor - Green Infrastructure""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]","[""WQIP - Proposal Summary"", ""WQIP - Fund Application""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Community Preservation Fund (CPF) WQIPP - Plan/Checklist/App 2019 WQIP - Applications & Proposal Summaries Village of Sag Harbor - Green Infrastructure Village of Sag Harbor - Green Infrastructure WQIP - Proposal Summary WQIP Proposal Summary Sheet (2019) - Sag Harbor Green Infrastructure Amendment WQIP - Fund Application WQIP Fund Application (2019) - Sag Harbor Green Infrastructure Amendment Bridgehampton Beach Club Pavillion Mill Pond Association Town Trustees - Mecox Bay/Aquatic Restoration Village of Southampton - Lake Agawam Stormwater Village of Sag Harbor - Green Infrastructure Westhampton School District/Center for Clean Water Sagaponack Pond Aquatic Habitat Restoration Plan Alewife Creek Restoration Project Town Trustees - Pump Out Program Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Community Preservation Fund (CPF) WQIPP - Plan/Checklist/App 2019 WQIP - Applications & Proposal Summaries Village of Sag Harbor - Green Infrastructure Village of Sag Harbor - Green Infrastructure WQIP - Proposal Summary WQIP Proposal Summary Sheet (2019) - Sag Harbor Green Infrastructure Amendment WQIP - Fund Application WQIP Fund Application (2019) - Sag Harbor Green Infrastructure Amendment Bridgehampton Beach Club Pavillion Mill Pond Association Town Trustees - Mecox Bay/Aquatic Restoration Village of Southampton - Lake Agawam Stormwater Village of Sag Harbor - Green Infrastructure Westhampton School District/Center for Clean Water Sagaponack Pond Aquatic Habitat Restoration Plan Alewife Creek Restoration Project Town Trustees - Pump Out Program Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -1811,https://elkhartlakewi.gov/departments/police/,Contact Info & Agency Meta,Info About Agencies,Police - Village of Elkhart Lake,"",200,Error retrieving title: 'NoneType' object has no attribute 'text',"[""VILLAGE OF ELKHART LAKE POLICE DEPARTMENT""]","[""Frequently Asked Questions"", ""Pay Tickets & Fines Online"", ""Medications Drop Box"", ""Elkhart Lake Police Department History"", ""CONTACT US"", ""MORE ABOUT ELPD"", ""VILLAGE DEPARTMENTS"", ""ELPD on Facebook""]","[""Vision"", ""Mission Statement"", ""Core Values"", ""VILLAGE DEPARTMENTS"", ""VILLAGE SERVICES"", ""KEY VILLAGE CONTACTS""]",[],[],[],"" -1812,https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scoperesponsibility-to-the-community-and-other-policy-violations-7/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1813,https://columbiacitypolice.us/documents/daily stats/3.23.21.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1814,http://police.portlandmaine.gov/844/friends-of-woodfords-corner,Not Criminal Justice Related,Not Criminal Justice Related,"Friends of Woodfords Corner | Portland, ME - Official Website","Friends of Woodfords Corner (FWC) began September 2015, when Woodfords Corner area neighbors came together to engage in community/city development.",200,"Portland, ME - Official Website | Official Website","[""Friends of Woodfords Corner""]",[],[],[],[],[],Skip to Main Content Pay & Apply Your Government Services Business Community Home Community Neighborhoods & Islands Neighborhoods & Islands Directory Friends of Woodfords Corner Friends of Woodfords Corner About the Portland Neighborhood Connector Project Back Cove Neighborhood Association Bayside Neighborhood Association Deering Center Neighborhood Association Deering Highlands Neighborhood Association East Bayside Neighborhood Organization East Deering Neighborhood Association Friends of Allen's Corner Friends of Morrill's Corner Friends of Woodfords Corner Hobart Street Wildlife Sanctuary India Street Neighborhood Association Island Services Libbytown Neighborhood Association Munjoy Hill Neighborhood Organization Nason's Corner Neighborhood Association Neighborhood Association Contact List (PDF) North Deering Neighborhood Association Parkside Neighborhood Association Peaks Island Council Riverton Community Association Saint John Valley Neighborhood Association Stroudwater Neighborhood Association University Neighborhood Organization (UNO) West End Neighborhood Association Western Promenade Neighborhood Association Woodfords-Oakdale Neighborhood Association Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Community Neighborhoods & Islands Neighborhoods & Islands Directory Friends of Woodfords Corner Friends of Woodfords Corner About the Portland Neighborhood Connector Project Back Cove Neighborhood Association Bayside Neighborhood Association Deering Center Neighborhood Association Deering Highlands Neighborhood Association East Bayside Neighborhood Organization East Deering Neighborhood Association Friends of Allen's Corner Friends of Morrill's Corner Friends of Woodfords Corner Hobart Street Wildlife Sanctuary India Street Neighborhood Association Island Services Libbytown Neighborhood Association Munjoy Hill Neighborhood Organization Nason's Corner Neighborhood Association Neighborhood Association Contact List (PDF) North Deering Neighborhood Association Parkside Neighborhood Association Peaks Island Council Riverton Community Association Saint John Valley Neighborhood Association Stroudwater Neighborhood Association University Neighborhood Organization (UNO) West End Neighborhood Association Western Promenade Neighborhood Association Woodfords-Oakdale Neighborhood Association Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Community Neighborhoods & Islands Neighborhoods & Islands Directory Friends of Woodfords Corner Friends of Woodfords Corner About the Portland Neighborhood Connector Project Back Cove Neighborhood Association Bayside Neighborhood Association Deering Center Neighborhood Association Deering Highlands Neighborhood Association East Bayside Neighborhood Organization East Deering Neighborhood Association Friends of Allen's Corner Friends of Morrill's Corner Friends of Woodfords Corner Hobart Street Wildlife Sanctuary India Street Neighborhood Association Island Services Libbytown Neighborhood Association Munjoy Hill Neighborhood Organization Nason's Corner Neighborhood Association Neighborhood Association Contact List (PDF) North Deering Neighborhood Association Parkside Neighborhood Association Peaks Island Council Riverton Community Association Saint John Valley Neighborhood Association Stroudwater Neighborhood Association University Neighborhood Organization (UNO) West End Neighborhood Association Western Promenade Neighborhood Association Woodfords-Oakdale Neighborhood Association Government Websites by CivicPlus® -1815,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0145/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1816,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-nets-3-arrest/,Media Bulletins,Agency-Published Resources,DUI saturation Patrol Nets 3 Arrest,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/7/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: DUI SATURATION PATROL NETS 3 ARRESTS Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department Traffic Section conducted a DUI Saturation Patrol on Saturday June 4, between the hours of 6:00 p.m. and 2:00 a.m. High visibility DUI enforcement efforts have a deterrent effect lowering the incidents of impaired driving and will continue thanks to special funding for extra officers to patrol for this deadly crime. Officers made 53 vehicle enforcement stops which led to 3 DUI-alcohol arrests. Law Enforcement emphasizes the preventable nature of drunk driving reminding everyone that all it takes is a little planning ahead. Designate a sober driver or call a cab. But whatever you do, don’t drink and drive. The California Office of Traffic Safety DDVIP (Designated Driver VIP) mobile app is now available for free download on iOS and Android devices. Launched last year, the new DDVIP app offers enhanced features, allowing users to “Map a Spot” with their current location to find DDVIP partnering establishments in their area or a “List of Spots” to search all participating bars and restaurants throughout California. Users will be offered free incentives at each bar to celebrate their life saving role. They can stay up-to-date with the latest from DDVIP and see what other users are saying via its social tab. Also through the app, for those who want to imbibe but also make it a point to plan ahead, users can easily order a sober ride from one of several ride sharing services offered– all from one screen. Drivers caught driving impaired can expect the impact of their DUI arrest to include jail time, fines, fees, DUI classes, other expenses that can exceed $10,000 not to mention the embarrassment when friends and family find out. The Long Beach Police Department will be conducting a DUI/Driver’s License Checkpoint on Saturday June 18 in the Department’s ongoing commitment to lowering deaths and injuries upon the city’s streets and highways. The DUI Saturation Patrol was funded by a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration, reminding everyone to ‘Report Drunk Driver – Call 9-1-1’. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1817,https://www.southamptontownnypolice.gov/154/forms-applications,Resources,Agency-Published Resources,"Forms & Applications | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Forms & Applications""]",[],"[""Site Tools"", ""Contact Us"", ""Hon. Theresa A. Kiernan"", ""Hours"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Tax Receiver Forms & Applications Forms & Applications 2003 - 2004 Tax Rate Sheet (PDF) 2004 - 2005 Tax Rate Sheet (PDF) 2005 - 2006 Tax Rate Sheet (PDF) 2006 - 2007 Tax Rate Sheet (PDF) 2007 - 2008 Tax Rate Sheet (PDF) 2008 - 2009 Tax Rate Sheet (PDF) 2009 - 2010 Tax Rate Sheet (PDF) 2010 - 2011 Tax Rate Sheet (PDF) 2011 - 2012 Tax Rate Sheet (PDF) 2012 - 2013 Tax Rate Sheet (PDF) 2013 - 2014 Tax Rate Sheet (PDF) 2014 - 2015 Tax Rate Sheet (PDF) 2015 - 2016 Tax Rate Sheet (PDF) 2016 - 2017 Tax Rate Sheet (PDF) 2017 - 2018 Tax Rate Sheet (PDF) 2018 - 2019 Tax Rate Sheet (PDF) 2019 - 2020 Tax Rate Sheet (PDF) 2020-2021 Tax Rate Sheet (PDF) 2021-2022 Tax Rate Sheet (PDF) 2022-2023 Tax Rate Sheet (PDF) 2023-2024 Tax Rate Sheet (PDF) Southampton Town Tax Receiver Information Change Form (PDF) Contact Us Hon. Theresa A. Kiernan Receiver of Taxes Email Theresa A. Kiernan Town Hall (Main Floor) 116 Hampton Road Southampton, NY 11968 Ph: 631-702-2470 Fx: 631-287-5732 Hours Monday - Friday 8:30 a.m. - 4:00 p.m. Staff Directory Forms & Applications Helpful Facts Important Dates Information Change Form Tax Rolls View or Pay Your Taxes Online Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -1818,https://www.antioch.il.gov/wpfb-file/04-14-15-police-and-fire-agenda-pdf-3/,Poor Data Source,Poor Data Source,"04-14-15 Police And Fire Agenda - Antioch, IL",8973 04 14 15 police and fire agenda pdf commissions commission agendas 2015 1428503395 36b727dd979e485336f834a1dcb52384 219x300 _es8j3agu7jf9 thumb jpg 08 09 29 55 0 pdf application trustees dennis b crosby jay jozwiak mary c dominiak scott a pierce jerry t johnson ted p poulos lawrence m hanson mayor lori k folbrick village clerk notice of,200,"Home - Antioch, IL","[""04-14-15 Police And Fire Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -1819,https://delcopa.gov/planning/pubs/delco2035transportationplan.html,Not Criminal Justice Related,Not Criminal Justice Related,Delaware County 2035 Transportation Plan,"",200,"Delaware County, Pennsylvania","[""Delaware County 2035 Transportation Plan""]",[],"[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County 2035 Transportation Plan Home / Departments / Planning Department / Publications / Delaware County 2035 Land Use Policy Framework Plan Delaware County 2035 Transportation Plan Date Published: December 2017 View PDF File [15.2mb] View Executive Summary [9.2mb] Abstract: The Transportation Plan provides a unified long-range vision for the movement of people and goods in Delaware County. It identifies existing conditions and examines transportation trends to provide recommendations to improve, expand, and integrate the county’s transportation network. The plan stresses the importance of creating a more multimodal transportation network that is safe, efficient, and reliable for all users. This plan is a component of Delaware County 2035 , the County’s comprehensive plan. Geographic Area: Countywide For more information or to order this report, contact the Department at 610-891-5200 or Planning_Department@co.delaware.pa.us . Planning Department Navigation Access the Data and Mapping Innovation Hub About Planning Calendar Current Projects Delaware County 2035 Demographic Data Development Review Forms Funding Green Space and Trails Project Mapping Municipal Programs & Initiatives Planning Education Publications Gina Burritt, Director Planning Department 2 W. Baltimore Avenue Suite 202 Media, PA 19063 Phone: 610-891-5200 Fax: 610-891-5203 Email: Planning_Department@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2023 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County 2035 Transportation Plan Home / Departments / Planning Department / Publications / Delaware County 2035 Land Use Policy Framework Plan Delaware County 2035 Transportation Plan Home / Departments / Planning Department / Publications / Delaware County 2035 Land Use Policy Framework Plan Delaware County 2035 Transportation Plan Home / Departments / Planning Department / Publications / Delaware County 2035 Land Use Policy Framework Plan " -1820,https://www.antioch.il.gov/wpfb-file/nicorcoppernotice-pdf-3/,Not Criminal Justice Related,Not Criminal Justice Related,"Nicorcoppernotice - Antioch, IL",13520 nicorcoppernotice pdf news 2015 1625761363 2e2e175782d1e691570cab42162ae390 c3407f1dd7454c9da0e473bb3ac25408bb71668af83b7ffc07122e6a04d8511a 216x300 _dtun2pmmilyr thumb jpg 2017 05 17 08 41 0 174 208 226 95 2021 06 24 16 34 31 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17 pagefailed_18 pagefailed_19 pagefailed_20 pagefailed_21 pagefailed_22 pagefailed_23 pagefailed_24,200,"Home - Antioch, IL","[""Nicorcoppernotice""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -1821,https://www.giddingspolice-tx.us/about-1,Complaints & Misconduct,Info About Officers,How are we doing? | Giddings Police Department,"",200,Home | Giddings Police Department,[],[],[],[],[],[],"" -1822,http://lafayettepolice.us/441/how-you-can-help,Not Criminal Justice Related,Not Criminal Justice Related,"How You Can Help | Lafayette, IN - Official Website","The City of Lafayette is improving water quality in the Wabash River and other streams with significant investments in its sanitary and stormwater capital programs, but every little bit helps. ",200,"Police Department | Lafayette, IN - Official Website","[""How You Can Help""]","[""Learn More"", ""Resources""]","[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1823,https://www.woburnma.gov/government/police/policies-and-procedures-for-issuing-a-ltc-with-application/,Training & Hiring Info,Info About Officers,Policies and Procedures for Issuing a LTC With Application - City of Woburn,"",200,"City of Woburn, Massachusetts","[""Policies and Procedures for Issuing a LTC With Application""]",[],"[""Get Text & Email Updates!""]","[""Post Details""]",[],[],"Economic Development View our latest info here Pay Where Do I Go For Economic Development View our latest info here Pay Where Do I Go For Economic Development View our latest info here Pay Where Do I Go For Economic Development View our latest info here Pay Where Do I Go For MENU MENU Residents Moving to Woburn Resources Click here to view helpful resources for new or current Woburn residents. News Library Public Schools Recreation Report a Concern Woburn Senior Center Traffic & Parking Veterans Voting & Elections Woburn Public Media Center Trash & Recycling Businesses Economic Development Click here to view our latest info. Apply for Business Certificate Licenses & Permits Food Service Retail Food Mobile Food Municipal Lien Certificates Swimming Pool & Spa Tanning Establishment Temporary Food Service Government Departments & Boards Search through all Departments, Boards and Commissions A-Z. Mayor’s Office City Council Departments & Boards A-Z Employment Opportunities About Woburn History Minutes & Agendas Archive Upcoming Public Meetings Ordinances / Code Bid Postings Public Schools Services Pay a Bill Click here to pay your bill quickly and efficiently. Assessors Database Change Your Mailing Address Forms Open Checkbook Subscribe Pay A Bill Register a Vehicle Register to Vote Report a Concern Events Quick Actions MENU MENU Residents Moving to Woburn Resources Click here to view helpful resources for new or current Woburn residents. News Library Public Schools Recreation Report a Concern Woburn Senior Center Traffic & Parking Veterans Voting & Elections Woburn Public Media Center Trash & Recycling Businesses Economic Development Click here to view our latest info. Apply for Business Certificate Licenses & Permits Food Service Retail Food Mobile Food Municipal Lien Certificates Swimming Pool & Spa Tanning Establishment Temporary Food Service Government Departments & Boards Search through all Departments, Boards and Commissions A-Z. Mayor’s Office City Council Departments & Boards A-Z Employment Opportunities About Woburn History Minutes & Agendas Archive Upcoming Public Meetings Ordinances / Code Bid Postings Public Schools Services Pay a Bill Click here to pay your bill quickly and efficiently. Assessors Database Change Your Mailing Address Forms Open Checkbook Subscribe Pay A Bill Register a Vehicle Register to Vote Report a Concern Events Quick Actions " -1824,http://www.longbeach.gov/police/press-releases/murder-anaheim-st.--walnut-ave/,Media Bulletins,Agency-Published Resources,MURDER (Anaheim St. & Walnut Ave.),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1825,https://www.ci.rohnert-park.ca.us/services/emergency_services/police_and_fire_services,Resources,Agency-Published Resources,Public Safety - City of Rohnert Park,"",200,Just a moment...,"[""City of Rohnert Park""]","[""Rohnert Park""]","[""Public Safety""]","[""Public Safety""]",[],[],"" -1826,http://www.longbeach.gov/police/press-releases/critical-missing-person-rosa-ella-brady/,Media Bulletins,Agency-Published Resources,CRITICAL MISSING PERSON-ROSA ELLA BRADY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/26/2018 FOR IMMEDIATE RELEASE Press Release # Subject: *UPDATE* LOCATED CRITICAL MISSING PERSON - ROSA ELLA BRADY Contact: Media Relations Detail (562) 570-5273 UPDATE: Yesterday, December 26, 2018, missing person Brady was located by the Huntington Beach Police Department in their city. She was found unharmed and has been reunited with her family. Original News Release 12/26/18: Photo is 20 years old CLICK ON PHOTO TO ENLARGE The Long Beach Poice Department is seeking the public's help with locating critical missing person Rosa Ella Brady. Missing Person was last seen by a family member on December 24, 2018 at the 2300 block of Eucalyptus Avenue. She was reported missing on December 25, 2018 at 1:45 p.m. She left on foot and is known to use public transportation on her own. She likely has a black four-wheel laundry cart and a green plastic bag that contain her belongings. The Critical Missing Person is described as follows: Age: 69 years old Gender: Female Race: African American Height: 5’03” Weight: 134 lbs Hair: Short gray Eyes: Brown Clothing: White/gray beanie, unknown color shirt, black sweats, black nike brand shoes, and wears prescription glasses Scars/Marks: None Medical Alerts: Suffers from medical condition(s) and may become disoriented The Long Beach Police Department continues to search for the victim. Local hospitals have been alerted and area law enforcement and public transportation agencies have also been notified. Anyone who sees this individual or has information on his whereabouts is asked to call the Long Beach Police Department at (562) 435-6711 or 9-1-1. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1827,https://cityofpowell.us/powell-police-chief-stephen-hrytzik-elected-section-iv-representative-of-fbi-national-academy-associates/chiefhrytzik_credit_klattephotography/,Contact Info & Agency Meta,Info About Agencies,"City of Powell, Ohio | ChiefHrytzik_credit_KlattePhotography","",200,"City of Powell, Ohio","[""ChiefHrytzik_credit_KlattePhotography""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -1828,http://police.byram-ms.us/news/,Poor Data Source,Poor Data Source,News | Byram Police Department | Byram Police Department,"",200,Byram Police Department | Byram Police Department,"[""Read the full report here."", ""Arrest Made in Holiday Inn Express Shooting""]","[""Byram Police Releases 2020 Annual Report"", ""Arrest Made in Byram Armed Robberies"", ""Bradford Place Auto Burglary"", ""Governor Reeves Executive Order RE: COVID-19"", ""COVID-19 Resources"", ""Updated Website"", ""Byram Weather""]","[""Byram Police Department""]",[],[],[],"" -1829,https://delcopa.gov/courts/domesticrelations/copiesoforder.html,Resources,Agency-Published Resources,"Copies of Your Court Orders - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Copies of Your Court Orders""]",[],"[""Domestic Relations Navigation"", ""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[],"Menu A to Z Court Departments Local Rules FAQ Government Center Copies of Your Court Orders Home / Court Departments / Domestic Relations / Copies of Your Court Orders You may request copies of a court order, payment history and/or docket history by completing a document request form and mailing it to the Domestic Relations Section, P.O. Box 543, Media, PA 19063. Domestic Relations Navigation How do I... Apply for Support Services Prepare for my Conference/Hearing Comply with my Support Order Pay my Support Get Payment for Medical Bills Modify my Support Order Get Copies of my Court Order Change my Address Close my Support Case Legal Services Forms Family Court Self Represented Litigant Guide Patricia Coacher, Esquire Director Domestic Relations Chief Counsel Curran Building County Courthouse Complex 2nd & Orange Streets Media, PA 19063 Phone: 610-891-4314 Press 1 for IVR Press 2 to speak to a Client Information Representative Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 delcocourts@co.delaware.pa.us Courts Quick Links Juror eResponse PA Law Help Self Help - Custody Self Help - Divorce Juror Handbook Language Access Family Court Self Represented Litigant Guide Government Center Quick Links Marriage Licenses Crisis Connection Certified Recovery Specialist Public Access Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Copies of Your Court Orders Home / Court Departments / Domestic Relations / Copies of Your Court Orders Copies of Your Court Orders Home / Court Departments / Domestic Relations / Copies of Your Court Orders Copies of Your Court Orders Home / Court Departments / Domestic Relations / Copies of Your Court Orders You may request copies of a court order, payment history and/or docket history by completing a document request form and mailing it to the Domestic Relations Section, P.O. Box 543, Media, PA 19063. Domestic Relations Navigation How do I... Apply for Support Services Prepare for my Conference/Hearing Comply with my Support Order Pay my Support Get Payment for Medical Bills Modify my Support Order Get Copies of my Court Order Change my Address Close my Support Case Legal Services Forms Family Court Self Represented Litigant Guide Patricia Coacher, Esquire Director Domestic Relations Chief Counsel Curran Building County Courthouse Complex 2nd & Orange Streets Media, PA 19063 Phone: 610-891-4314 Press 1 for IVR Press 2 to speak to a Client Information Representative " -1830,https://riag.ri.gov/press-releases/pawtucket-police-officer-charged-west-greenwich-shooting-incident,Officer Involved Shootings,Police & Public Interactions,Pawtucket police officer charged in West Greenwich shooting incident | Rhode Island Attorney General's Office,"",200,Welcome | Rhode Island Attorney General's Office,"[""Pawtucket police officer charged in West Greenwich shooting incident""]",[],[],[],[],[],"" -1831,https://alpha.austin.gov/en/police-oversight/formal-complaint-insubordination-and-other-policy-violations/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1832,https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scoperesponsibility-to-the-community-and-other-policy-violations-5/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1833,https://www.antioch.il.gov/wpfb-file/09-09-11-police-pension-fund-agenda-pdf-2/,Poor Data Source,Poor Data Source,"09-09-11 Police Pension Fund Agenda - Antioch, IL",09 11 police pension fund agenda pdf commissions agendas 2011 07 13 12 04 0000,200,"Home - Antioch, IL","[""09-09-11 Police Pension Fund Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -1835,https://www.mass.gov/doc/proposed-amendments-to-115-cmr-100-scope-and-authority-0/download,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -1836,https://delcopa.gov/publicrelations/releases/18pdfs/18hearthealthwearred .pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1837,https://cityofpowell.us/government/building-department/city-of-powell-commercial-building/checklist-cop-comm-change-of-occ-01-08-19/,Resources,Agency-Published Resources,"City of Powell, Ohio | Checklist COP Comm Change of Occ 01.08.19","",200,"City of Powell, Ohio","[""Checklist COP Comm Change of Occ 01.08.19""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -1838,https://www.stpaul.gov/departments/police/administration-office-chief/operations-division/canine-k-9-unit,Training & Hiring Info,Info About Officers,Canine (K-9) Unit | Saint Paul Minnesota,The Saint Paul Police Canine (K-9) Unit is the second oldest police canine organization in the United States. We operate with approximately fifteen Officer/Canine teams and provide 24/7 coverage. The mission of the Canine (K-9) Unit is to support the patrol districts with all patrol functions.,200,Home | Saint Paul Minnesota,"[""Canine (K-9) Unit""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Contact Us"", ""Footer""]","[""You are using an unsupported browser. Please use Microsoft Edge."", ""Contact The City"", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[],"" -1839,https://coloradosprings.gov/police-department/page/colorado-springs-police-department-birthday,Not Criminal Justice Related,Not Criminal Justice Related,Colorado Springs Police Department Birthday Program | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Colorado Springs Police Department Birthday Program""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -1840,https://alpha.austin.gov/es/police-oversight/message-from-the-office-of-police-oversight-director/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1841,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/102122summary.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1842,https://norfolkne.gov/assets/site/documentcentral/police/statistical-reports/ytd-mayor-030120.pdf,Annual & Monthly Reports,Info About Agencies,"","",200,"","","","","","","","" -1843,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/may-2018-activity-report/,Annual & Monthly Reports,Info About Agencies,May 2018 Activity Report - Town of Cheswold,"",200,"Home - Town of Cheswold - Kent County, Delaware","[""Cheswold""]","[""Delaware"", ""May 2018 Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[],"Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Cheswold Delaware Listen May 2018 Activity Report May 2018 Activity Report Cheswold Delaware Listen May 2018 Activity Report May 2018 Activity Report Listen May 2018 Activity Report May 2018 Activity Report Listen May 2018 Activity Report May 2018 Activity Report Listen May 2018 Activity Report May 2018 Activity Report Listen Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form " -1844,https://www.mass.gov/how-to/submit-a-public-records-request-to-the-municipal-police-training-committee,Resources,Agency-Published Resources,Submit a public records request to the Municipal Police Training Committee | Mass.gov,Request public records online from the Municipal Police Training Committee.,200,Mass.gov,"[""Submit a public records request to the Municipal Police Training Committee""]","[""Contacts"", ""The Details of Submit a public records request to the Municipal Police Training Committee"", ""Contacts"", ""Help Us Improve Mass.gov with your feedback""]","[""Primary Records Access Officer"", ""the Contents of the Submit a public records request to the Municipal Police Training Committee page"", ""What you need for Submit a public records request to the Municipal Police Training Committee"", ""How to request Submit a public records request to the Municipal Police Training Committee"", ""Contact for Submit a public records request to the Municipal Police Training Committee"", ""Primary Records Access Officer""]","[""Online"", ""Online +"", ""Primary Records Access Officer"", ""Online""]","[""Online""]",[],"" -1845,https://ose.louisiana.gov/event/police-communications-officer-52/,Poor Data Source,Poor Data Source,Police Communications Officer | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Police Communications Officer""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Police Communications Officer Competitive Level Posting Period 05/16/2022 - 05/31/22 Application Deadline 05/31/22 Jurisdiction Lake Charles Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Police Communications Officer Competitive Level Posting Period 05/16/2022 - 05/31/22 Application Deadline 05/31/22 Jurisdiction Lake Charles Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Communications Officer Competitive Level Posting Period 05/16/2022 - 05/31/22 Application Deadline 05/31/22 Jurisdiction Lake Charles Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Communications Officer Competitive Level Posting Period 05/16/2022 - 05/31/22 Application Deadline 05/31/22 Jurisdiction Lake Charles Application This event has passed. Police Communications Officer Competitive Level Posting Period 05/16/2022 - 05/31/22 Application Deadline 05/31/22 Jurisdiction Lake Charles Application This event has passed. Police Communications Officer Competitive Level Posting Period 05/16/2022 - 05/31/22 Application Deadline 05/31/22 Jurisdiction Lake Charles Application This event has passed. Police Communications Officer Competitive Level Competitive Level Competitive Level Posting Period 05/16/2022 - 05/31/22 Application Deadline 05/31/22 Jurisdiction Lake Charles Posting Period 05/16/2022 - 05/31/22 Application Deadline 05/31/22 Jurisdiction Lake Charles Posting Period 05/16/2022 - 05/31/22 Application Deadline 05/31/22 Jurisdiction Lake Charles Posting Period 05/16/2022 - 05/31/22 Posting Period Application Deadline 05/31/22 Application Deadline Jurisdiction Lake Charles Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -1846,https://www.minneapolismn.gov/government/programs-initiatives/community-safety/background/police-operational-assessment/mpd-operational-assessment-contract/,Policies & Contracts,Info About Agencies,Community Safety Work - City of Minneapolis,We're focusing on three key areas to improve community safety in our city.,200,City of Minneapolis,"[""Community safety work"", ""Need help? We're here for you.""]","[""A snow emergency is not currently in effect. Normal parking rules apply."", ""Overview"", ""Key areas"", ""Related links"", ""Community safety in different languages from 2021"", ""Contact us""]","[""Alternatives to police response"", ""Violence prevention"", ""Police policy reform"", ""Unarmed public safety responses"", ""Public health approach to violence"", ""Behavioral crisis response"", ""See language translation pages"", ""Alternatives to police response"", ""Police policy reform"", ""Community Safety Office""]","[""Learn more"", ""Learn more"", ""Learn more""]",[],[],"" -1847,https://delcopa.gov/courts/districtjudges/index.html,Media Bulletins,Agency-Published Resources,Magisterial District Judges - Delaware County Court of Common Pleas,"",200,"Delaware County, Pennsylvania","[""Magisterial District Judges""]",[],"[""Notice"", ""Magisterial District Court Navigation"", ""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[],"" -1848,http://www.cityofpataskalaohio.gov/cop_folder/minutes-2015/january-5-2015-council-public-hearing/,Not Criminal Justice Related,Not Criminal Justice Related,"January 5, 2015 Council Public Hearing - City Of Pataskala",Official Website,200,Home - City Of Pataskala,"[""City Of Pataskala"", ""January 5, 2015 Council Public Hearing""]","[""Official Website"", ""Categories""]",[],[],[],[],Document Library Calendar Public Services Pay Court Ticket Online City Of Pataskala Official Website Blog Community Police Obtain Fingerprints Solicitor’s Permit Citizens Police Academy Important Links/Resources Prescription Drug Drop Off Police Officer Job Application History of the Pataskala Police Department Curfew Vacation House Check Form Fire School Districts Residents Taxes in Pataskala RITA Tax Local Animal Shelter/Lost Pets Dog License BMV Info Licking County Health Department Register to Vote Report a Gas Emergency New to Pataskala? Good Neighbor Guidelines Outdoor Activities Attractions City Departments Mayor Administration Garage Sale Permit Adopt-A-Street Program Rent a Park Shelter Current Bids and RFQ’s Outdoor Activity/Event Permit Parade-Assembly Form Parks and Recreation Economic Development Human Resources Utilities Utility Rates Water and Sewer Billing/ E-Billing Interesting Facts and Information Storm Water Management Program Report a Water Leak Finance Pataskala’s Income Tax Budget Financial Reports Popular Annual Financial Report (PAFR) Annual Comprehensive Financial Reports Financial Condition Reports 2023 Financial Condition Reports 2022 Financial Condition Reports 2021 Financial Condition Reports 2020 Financial Condition Reports 2019 Financial Condition Reports 2018 Financial Condition Reports 2017 Financial Condition Reports 2016 Financial Condition Reports 2015 Financial Condition Reports 2014 Financial Condition Reports 2013 Financial Condition Reports 2012 Financial Condition Reports Audited Financial Reports Pataskala Open Checkbook Mayor’s Court Important Traffic Violation Info Pay Fines or Search Case Files How to Pay Fines Traffic and General Offense Codes Plea Descriptions Court Appearance Times Your Rights in the Pataskala’s Mayor’s Court Downloadable Forms Sealing a Record Informational Court Links Mayor’s Court Prosecutor Pataskala’s Mayors Court Magistrate Mayor’s Court Rules Criminal/Traffic Diversion Bond Schedule Fine Schedule Legal Public Service/Streets Pothole Repair Report a Pothole Right of Way Snow Removal Traffic Signals & Street Lights Drainage/Ditches Issues Planning & Zoning Permit Questions Planning & Zoning Fee Schedule Discharge Map Zoning Maps Permits Comprehensive Plan Properties With Posted Code Violations Government City Council Ward Map Tom H. Lee – Ward 1 Mary Hite – Ward 2 Deborah Kohman – Ward 3 Brandon Galik – Ward 4 Dustin Epperson – At-Large Jude Hampshire – At-Large Andy Walther – At Large Clerk of Council Council Packet Public Notices Agendas Meeting Minutes Audio/Video Recordings Legislation Approved Ordinances & Resolutions 2024 Resolutions 2024 Ordinances 2023 Resolutions 2023 Ordinances 2022 Resolutions 2022 Ordinances 2021 Resolutions 2021 Ordinances 2020 Resolutions 2020 Ordinances 2019 Resolutions 2019 Ordinances 2018 Resolutions 2018 Ordinances 2017 Resolutions 2017 Ordinances 2016 Resolutions 2016 Ordinances 2015 Resolutions 2015 Ordinances Codified Ordinances Charter Public Records Request Information Boards and Commissions Personnel Board of Review Planning and Zoning Commission Board of Zoning Appeals Parks and Recreation Advisory Board Planning & Zoning Commission Board of Zoning Appeals Document Library Calendar Public Services Pay Court Ticket Online -1849,https://delcopa.gov/publicrelations/releases/2020/flushot_broomall.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Hosts Public Flu Shot Clinic October 16 and 17 in Broomall - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Hosts Public Flu Shot Clinic October 16 and 17 in Broomall""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County Hosts Public Flu Shot Clinic October 16 and 17 in Broomall Home / Departments / Public Relations Releases / Delaware County Hosts Public Flu Shot Clinic October 16 and 17 in Broomall Released: October 14, 2020 Delaware County is hosting free flu shot clinics on October 16 and 17 at the Broomall Fire Company, located at 1 North Malin Road in Broomall. Free flu shots will be available to all residents of Delaware County, 3 years of age or older. Volunteers from the County’s Medical Reserve Corps will be supporting the County’s Department of Intercommunity Health and Emergency Management team. County Council and the County’s Department of Intercommunity Health are working to make it as safe and convenient as possible for residents to get vaccinated. The drive-through format is intended to make it safer and more convenient for older residents, those with disabilities, and parents with small children, especially during the ongoing COVID-19 pandemic. All residents are urged to get a flu shot. The intensity and severity of flu seasons are difficult to predict, and the effectiveness of the flu vaccine is dependent on many variables. The U.S. Centers for Disease Control and Prevention (CDC) has found immunization reduces the risk of flu illness by 40-60 percent during seasons when most circulating flu viruses are well-matched to the flu vaccine. Receiving a flu shot is the first and most important step in preventing the flu and decreasing the risk of severe flu-related illnesses. Each year, 200,000 people in the United States are hospitalized due to complications from the flu. The CDC recommends that everyone six months and older should get vaccinated against the flu. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play " -1850,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0323/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1851,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/092022blotter.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -1852,https://www.roseville.ca.us/government/departments/police_department/divisions/k-9,Misc Police Activity,Police & Public Interactions,K-9 - City of Roseville,"",200,Just a moment...,"[""City of Roseville""]","[""K-9""]","[""Roseville Police Department""]",[],[],[],"" -1853,http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-one-arrest2/,Media Bulletins,Agency-Published Resources,DUI CHECKPOINT NETS TWO ARRESTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/27/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: DUI CHECKPOINT NETS TWO ARRESTS Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department’s Traffic Section conducted a DUI/Driver’s License checkpoint on March 25, 2017. The checkpoint was located at the intersection of 7th Street and Locust Avenue, between the hours of 7:00 p.m. and 3:00 a.m. Checkpoints are placed in locations that have the greatest opportunity for achieving drunk and drugged driving deterrence and provide the greatest safety for officers and the public. High Visibility Enforcement, which includes DUI/Driver’s License checkpoints, have been shown to lower DUI deaths and injuries. A major component of these checkpoints are the deterrent effects it has on those who might drive alcohol or drug impaired, bringing about more awareness and encouraging everyone to use sober designated drivers. This weekend's checkpoint resulted in the following: 1407 vehicles through checkpoint 496 vehicles screened 2 DUI-alcohol suspects arrested 12 drivers cited for operating a vehicle while suspended/revoked 11 drivers cited for operating a vehicle while unlicensed 3 citations for unsafe driving Drivers are encouraged to download the Designated Driver VIP, or “DDVIP,” free mobile app for Android or iPhone. The DDVIP app helps find nearby bars and restaurants that feature free incentives for the designated sober driver, from free non-alcoholic drinks to free appetizers and more. The feature-packed app even has social media tie-ins and even a tab for the non-DD to call Uber, Lyft or Curb. Studies of California drivers have shown that 30 percent of drivers in fatal crashes had one or more drugs in their systems. A study of active drivers showed more tested positive for drugs that may impair driving (14 percent) than did for alcohol (7.3 percent). Of the drugs, marijuana was most prevalent, at 7.4 percent, slightly more than alcohol. Drivers caught driving impaired can expect the impact of a DUI arrest to include jail time, fines, fees, DUI classes, license suspension and other expenses that can exceed $10,000 not to mention the embarrassment when friends and family find out. The checkpoint was funded by a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration, reminding everyone to ‘Report Drunk Driver – Call 9-1-1’. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1854,https://alpha.austin.gov/police-oversight/know-your-rights-video-series/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1855,https://toddmissiontx.gov/departments/police-department/mission-statement/,Policies & Contracts,Info About Agencies,Mission Statement – City of Todd Mission,"",200,City of Todd Mission – Home of the Texas Renaissance Festival,"[""Mission Statement"", ""MISSION"", ""INTEGRITY"", ""RESPECT"", ""FAIRNESS""]","[""Gateway to the Texas Renaissance Festival"", ""Department Menu""]","[""Todd Mission City Hall""]",[],[],[],"Gateway to the Texas Renaissance Festival Home Government City Council Agenda/Minutes City Ordinances Financial Transparency General Election / General Elección Departments Police Department Municipal Court Fire Department Residents City Limits & ETJ  Map Fair Housing Mosquito Control Comprehensive Plan Doing Business Community Profile Business License Permits Sales Tax Information How Do I…? Permits Events Contact Us Pay Your Ticket Online Pay Business Fee Pay Permit Fee Todd Mission Police Department Mission Statement Mission Statement MISSION We, the men and women of the Todd Mission Police Department, are dedicated to providing excellent service through partnerships that build trust, reduce crime, preserve the public peace, create a safe environment, and enhance the quality of life in our community. INTEGRITY We have integrity: We adhere to the highest moral and ethical standards. We are honest and sincere in dealing with each other and the community. We have the courage to uphold these principals and are proud that they guide us in all that we do. RESPECT We show respect: We recognize the value of our unique cultural diversity and treat all people with kindness, tolerance, and dignity. We cherish and protect the rights, liberties, and freedom of all as granted by the constitutions and laws of the United States and the State of Texas. FAIRNESS We act with fairness: Objective, impartial decisions and policies are the foundation of our interactions. We are consistent in our treatment of all persons. Our actions are tempered with reason and equality. All personnel shall be guided by its principals in dealing with the public and fellow employee’s. Comments are closed. Department Menu Todd Mission Police Department Commend An Officer File A Complaint Racial Profiling Todd Mission City Hall Business Hours: 9:00 a.m. to 5:00 p.m. M-F 936-894-3001 21718 FM 1774 Todd Mission TX 77363-7722 info@ToddMissionTX.gov PAY YOUR TICKET ONLINE Pay Business License Fee Pay Permit Fee Home Government Departments Residents Doing Business How Do I? Contact Us Events Log In Copyright © 2016-2024 City of Todd Mission. All rights reserved. Gateway to the Texas Renaissance Festival Gateway to the Texas Renaissance Festival Home Government City Council Agenda/Minutes City Ordinances Financial Transparency General Election / General Elección Departments Police Department Municipal Court Fire Department Residents City Limits & ETJ  Map Fair Housing Mosquito Control Comprehensive Plan Doing Business Community Profile Business License Permits Sales Tax Information How Do I…? Permits Events Contact Us Pay Your Ticket Online Pay Business Fee Pay Permit Fee Home Government City Council Agenda/Minutes City Ordinances Financial Transparency General Election / General Elección Departments Police Department Municipal Court Fire Department Residents City Limits & ETJ  Map Fair Housing Mosquito Control Comprehensive Plan Doing Business Community Profile Business License Permits Sales Tax Information How Do I…? Permits Events Contact Us Pay Your Ticket Online Pay Business Fee Pay Permit Fee " -1856,https://delcopa.gov/planning/demodata/municipalinformation.html,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -1857,https://alpha.austin.gov/en/police-oversight/written-reprimand-of-officer-david-freston/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1858,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/122421blotter.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -1859,https://www.pleasantprairiewi.gov/news/2014_news/police_department_live,Poor Data Source,Poor Data Source,Police Department Live - Village of Pleasant Prairie,"",200,Just a moment...,[],"[""Police Department Live""]","[""Follow Us on Social Media""]",[],[],[],"" -1860,https://delcopa.gov/publicrelations/releases/2021/emergencybroadbandbenefitprogram.html,Not Criminal Justice Related,Not Criminal Justice Related,"Emergency Broadband Benefit Program - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Emergency Broadband Benefit Program""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Emergency Broadband Benefit Program Home / Departments / Public Relations Releases / Emergency Broadband Benefit Program Released: May 21, 2021 The Emergency Broadband Benefit is an FCC program to help families and households struggling to afford internet service during the COVID-19 pandemic. This new benefit will connect eligible households to jobs, critical healthcare services, virtual classrooms, and so much more. The Emergency Broadband Benefit will provide a discount of up to $50 per month towards broadband service for eligible households and up to $75 per month for households on qualifying Tribal lands. Eligible households can also receive a one-time discount of up to $100 to purchase a laptop, desktop computer, or tablet from participating providers if they contribute more than $10 and less than $50 toward the purchase price. The Emergency Broadband Benefit is limited to one monthly service discount and one device discount per household. You can learn more and apply here - Emergency Broadband Benefit | Federal Communications Commission (fcc.gov) Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Emergency Broadband Benefit Program Home / Departments / Public Relations Releases / Emergency Broadband Benefit Program Emergency Broadband Benefit Program Home / Departments / Public Relations Releases / Emergency Broadband Benefit Program Emergency Broadband Benefit Program Home / Departments / Public Relations Releases / Emergency Broadband Benefit Program " -1861,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-216-april-2021-increases-location-pay-supplemental-location-pay-expanded,Media Bulletins,Agency-Published Resources,State Police Bulletin No. SP-216 | Office of the New York State Comptroller,State Police Bulletin No. SP-216,200,Office of the New York State Comptroller | Thomas P. DiNapoli,"[""State Police Bulletin No. SP-216"", """"]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Background"", ""Effective Dates"", ""Eligibility Criteria"", ""OSC Actions"", ""Agency Actions"", ""Control-D Report Available After Processing"", ""Tax Information"", ""Payroll Register and Employee’s Paycheck/Advice"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[],"" -1862,https://cityofpowell.us/police-agency/traffic-surveys/traffic-survey-report-1-13-20-2/,Contact Info & Agency Meta,Info About Agencies,"City of Powell, Ohio | Traffic Survey Report 1-13-20","",200,"City of Powell, Ohio","[""Traffic Survey Report 1-13-20""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -1863,https://townofcampbellwi.gov/public-safety/police/forms/,Poor Data Source,Poor Data Source,Police Department Forms - Town of Campbell,"",200,"Town of Campbell - Welcome to the Town of Campbell, found on French Island between the Mississippi and Black Rivers, near La Crosse Wisconsin. Visitors will find a variety of things to do, including outdoor recreation, shopping, and restaurants.","[""Police Department Forms""]",[],"[""Police Department Records Request Form & Fee Schedule"", ""New Parking Contestment Form"", ""Police Forms for Your Use"", ""Citizen Report Form"", ""Quick Links"", ""About"", ""Government"", ""Services"", ""Public Safety""]",[],[],[],"" -1864,https://alpha.austin.gov/es/police-oversight/formal-complaint-search-protocol/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1865,https://www.antioch.il.gov/wpfb-file/12-11-12-police-pension-agenda-pdf-5/,Poor Data Source,Poor Data Source,"12-11-12 Police Pension Agenda - Antioch, IL",12 11 police pension agenda pdf commissions fund agendas 2012 2017 05 17 08 41 32 0000,200,"Home - Antioch, IL","[""12-11-12 Police Pension Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -1866,https://delcopa.gov/planning/calendar/eventcalendar_june.html,Misc Police Activity,Police & Public Interactions,"Calendar - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Calendar"", ""JUNE 2024""]",[],"[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Calendar Home / Departments / Planning Department / Calendar May 2024 July 2024 JUNE 2024 Sunday Monday Tuesday Wednesday Thursday Friday Saturday 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Juneteenth: Office Closed 20 Planning Commission Meeting 21 22 23 24 25 26 27 Development Review Application Deadline 28 29 30 Planning Department Navigation Access the Data and Mapping Innovation Hub About Planning Calendar Current Projects Delaware County 2035 Demographic Data Development Review Forms Funding Green Space and Trails Project Mapping Municipal Programs & Initiatives Planning Education Publications Gina Burritt, Director Planning Department 2 W. Baltimore Avenue Suite 202 Media, PA 19063 Phone: 610-891-5200 Fax: 610-891-5203 Email: Planning_Department@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2023 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Calendar Home / Departments / Planning Department / Calendar Calendar Home / Departments / Planning Department / Calendar Calendar Home / Departments / Planning Department / Calendar May 2024 July 2024 JUNE 2024 Sunday Monday Tuesday Wednesday Thursday Friday Saturday 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Juneteenth: Office Closed 20 Planning Commission Meeting 21 22 23 24 25 26 27 Development Review Application Deadline 28 29 30 Planning Department Navigation Access the Data and Mapping Innovation Hub About Planning Calendar Current Projects Delaware County 2035 Demographic Data Development Review Forms Funding Green Space and Trails Project Mapping Municipal Programs & Initiatives Planning Education Publications Gina Burritt, Director Planning Department 2 W. Baltimore Avenue Suite 202 Media, PA 19063 Phone: 610-891-5200 Fax: 610-891-5203 Email: Planning_Department@co.delaware.pa.us " -1867,https://www.mass.gov/doc/chelmsford-police-department-promotion-investigation-report/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -1868,https://www.troyny.gov/photos-troy-police-department-appoints-new-officers/,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -1869,http://www.paloshillspolice.us/wp-content/uploads/2013/05/redlight.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1870,https://www.bedminster.us/police_fire_rescue/police_department,Contact Info & Agency Meta,Info About Agencies,Police - Township of Bedminster,"",200,Just a moment...,"[""Bedminster Township""]","[""Police""]","[""Bedminster Township""]",[],[],[],"" -1871,https://scrantonpa.gov/your-government/police-department/juvenile-unit/,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -1872,http://www.longbeach.gov/police/press-releases/applications-for-volunteer-senior-police-partners-program-now-being-accepted/,Media Bulletins,Agency-Published Resources,APPLICATIONS FOR VOLUNTEER SENIOR POLICE PARTNER PROGRAM NOW BEING ACCEPTED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/21/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: APPLICATIONS FOR VOLUNTEER SENIOR POLICE PARTNER PROGRAM NOW BEING ACCEPTED Contact: MEDIA RELATIONS (562) 570-7253 APPLICATIONS FOR VOLUNTEER SENIOR POLICE PARTNER PROGRAM NOW BEING ACCEPTED 7/21/2017 The Long Beach Police Department is currently accepting applications for Volunteer Senior Police Partners (SPP). Applicants must be at least 50 years of age, of good moral character, possess a valid California driver's license and vehicle insurance, be able to volunteer at least 20 hours per month, and consent to a comprehensive background investigation. Senior Police Partners are a motivated team of citizens dedicated to improving their community. They provide, among other services, peer support and resource referral, education and awareness programs, community group presentations, graffiti reporting and vacation checks. For further information visit: http://www.longbeach.gov/police/about-the-lbpd/employment/senior-police-partners/ If you are interested in becoming a part of this exciting and innovative volunteer program, please contact the Volunteer Program Office at (562) 570-7212 or LBPDVolunteer@longbeach.gov. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/21/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: APPLICATIONS FOR VOLUNTEER SENIOR POLICE PARTNER PROGRAM NOW BEING ACCEPTED Contact: MEDIA RELATIONS (562) 570-7253 APPLICATIONS FOR VOLUNTEER SENIOR POLICE PARTNER PROGRAM NOW BEING ACCEPTED 7/21/2017 The Long Beach Police Department is currently accepting applications for Volunteer Senior Police Partners (SPP). Applicants must be at least 50 years of age, of good moral character, possess a valid California driver's license and vehicle insurance, be able to volunteer at least 20 hours per month, and consent to a comprehensive background investigation. Senior Police Partners are a motivated team of citizens dedicated to improving their community. They provide, among other services, peer support and resource referral, education and awareness programs, community group presentations, graffiti reporting and vacation checks. For further information visit: http://www.longbeach.gov/police/about-the-lbpd/employment/senior-police-partners/ If you are interested in becoming a part of this exciting and innovative volunteer program, please contact the Volunteer Program Office at (562) 570-7212 or LBPDVolunteer@longbeach.gov. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ " -1873,https://www.va.gov/eastern-oklahoma-health-care/stories/va-suicide-prevention-program-recognizes-tulsa-police-officer/,Media Bulletins,Agency-Published Resources,VA Suicide Prevention Program Recognizes Tulsa Police Officer | VA Eastern Oklahoma Health Care | Veterans Affairs,"On Sept. 28, Mark Morgan, director, Eastern Oklahoma VA Health Care System, presented a VA challenge coin to Tulsa Police Officer Demita Kinnard in recognition of her assistance to the VA Suicide Prevention Program.",200,VA.gov Home | Veterans Affairs,"[""VA Suicide Prevention Program recognizes Tulsa Police Officer""]","[""Veteran programs and services"", ""More VA resources"", ""Get VA updates"", ""In crisis? Talk to someone now"", ""Get answers"", ""Call us"", ""Visit a medical center or regional office"", ""Get answers"", ""Call us"", ""Visit a medical center or regional office"", ""Language assistance"", ""Language assistance""]","[""We’re here anytime, day or night – 24/7""]",[],[],[],"An official website of the United States government Here’s how you know The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you're on a federal government site. The site is secure. The https:// ensures that you're connecting to the official website and that any information you provide is encrypted and sent securely. Talk to the Veterans Crisis Line now Close Search Search: Search Contact us Sign in Home VA Benefits and Health Care About VA Find a VA Location An official website of the United States government Here’s how you know The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you're on a federal government site. The site is secure. The https:// ensures that you're connecting to the official website and that any information you provide is encrypted and sent securely. Talk to the Veterans Crisis Line now An official website of the United States government Here’s how you know The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you're on a federal government site. The site is secure. The https:// ensures that you're connecting to the official website and that any information you provide is encrypted and sent securely. An official website of the United States government Here’s how you know The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you're on a federal government site. The site is secure. The https:// ensures that you're connecting to the official website and that any information you provide is encrypted and sent securely. An official website of the United States government Here’s how you know The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you're on a federal government site. The site is secure. The https:// ensures that you're connecting to the official website and that any information you provide is encrypted and sent securely. An official website of the United States government Here’s how you know An official website of the United States government Here’s how you know The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you're on a federal government site. The site is secure. The https:// ensures that you're connecting to the official website and that any information you provide is encrypted and sent securely. The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you're on a federal government site. The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you're on a federal government site. " -1874,https://champaignil.gov/2017/09/07/now-cgtv-champaign-police-department-employee-awards-ceremony/,Not Criminal Justice Related,Not Criminal Justice Related,Now on CGTV: Champaign Police Department Employee Awards Ceremony - City of Champaign,"",200,403 Forbidden,"[""Now on CGTV: Champaign Police Department Employee Awards Ceremony""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Now on CGTV: Champaign Police Department Employee Awards Ceremony Search Posted on September 7, 2017 On May 16, the Champaign Police Department celebrated everyday heroes by honoring the police officers, staff, and citizens who went above and beyond to serve our community, and CGTV was on hand to film the ceremony. Highlights from the event included police department acknowledgment of staff’s commitment and dedication to our city. This year’s celebration included the “Heroes and Helping Hands,” which recognized people who have stepped up in a time of crisis to help police officers. CGTV is proud to feature the Champaign Police Department’s Employee Awards Ceremony video. The video airs on CGTV (Comcast and i3 Broadband channel 5, AT&T U-verse channel 99) and on-demand on the City’s website and YouTube channel . Categories: Police Department News Tags: Awards Ceremony , cgtv , cpd , CPD employee awards , employee awards , police Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works " -1875,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0647/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -1876,http://www.longbeach.gov/police/about-the-lbpd/employment/long-beach-mounted-police/,Misc Police Activity,Police & Public Interactions,Long Beach Mounted Police,"

LONG BEACH MOUNTED POLICE -   - The Long Beach Mounted Police is a non-profit corporation with a duly elected Board of Directors. They maintain their own insurance and oversee other business matters and investments. Membership includes riders and non-riders who are supporters of equestrian activities.   - For mo

",200,City of Long Beach,"[""Police Department""]","[""LONG BEACH MOUNTED POLICE""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""Volunteer Opportunities"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", """", """", """", ""Crime Lab Survey"", """"]",[],"" -1877,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2016_archived_news/may_2016/arlington_honors_police_salutes_sacrifice,Media Bulletins,Agency-Published Resources,"Arlington Honors Police Service, Salutes Sacrifice - City of Arlington","",200,Just a moment...,"[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Arlington Honors Police Service, Salutes Sacrifice""]",[],[],[],[],Skip to Content Skip to Content -1878,https://delcopa.gov/sustainability/pdf/raise/eastcostgreenwaytrailfeasibilitystudy_2009.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -1880,https://spdblotter.seattle.gov/2010/08/09/john-diaz-confirmed-as-new-chief-of-police/,Media Bulletins,Agency-Published Resources,John Diaz confirmed as new Chief of Police - SPD Blotter,"",200,403 Forbidden,"[""John Diaz confirmed as new Chief of Police""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -1881,https://spdblotter.seattle.gov/2010/02/01/police-arrest-grab-n-go-bandit/,Media Bulletins,Agency-Published Resources,"""Grab-N-Go"" bandit arrested - SPD Blotter","",200,403 Forbidden,"[""“Grab-N-Go” bandit arrested""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -1882,https://www.sandiego.gov/department-document/san-diego-police-arrest-two-suspects-multiple-car-burglaries,Media Bulletins,Agency-Published Resources,San Diego Police Arrest Two Suspects for Multiple Car Burglaries | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""San Diego Police Arrest Two Suspects for Multiple Car Burglaries"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -1883,https://www.antioch.il.gov/2019/11/21/police-fire-commission-special-meeting/,Misc Police Activity,Police & Public Interactions,"Police & Fire Commission Special Meeting - Antioch, IL","",200,"Home - Antioch, IL","[""Police & Fire Commission Special Meeting""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -1884,http://www.longbeach.gov/police/press-releases/police-seek-publics-help/,Media Bulletins,Agency-Published Resources,POLICE SEEK PUBLICS HELP,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],"[""UPDATE: On November 10, 2015, Long Beach City Council approved a $25,000 reward that raises the total reward to $75,000.""]",[],[],[],"" -1885,https://www.mass.gov/regulations/273-cmr-400-scope-of-practice,Not Criminal Justice Related,Not Criminal Justice Related,273 CMR 4.00: Scope of practice | Mass.gov,273 CMR 4.00 establishes the scope of practice for the practice of naturopathic health care. Download a PDF copy of the regulation below.,200,Mass.gov,"[""Regulation 273 CMR 4.00: Scope of practice""]","[""Table of Contents for the law library, 273 CMR"", ""Contact for 273 CMR 4.00: Scope of practice"", ""Table of Contents"", ""Downloads"", ""Contact"", ""Contact for 273 CMR 4.00: Scope of practice"", ""Help Us Improve Mass.gov with your feedback""]","[""Trial Court Law Libraries"", ""Trial Court Law Libraries"", ""Trial Court Law Libraries""]","[""Online"", ""Online"", ""Online""]",[],[],"" -1886,https://champaignil.gov/tag/youth-police-academy/,Media Bulletins,Agency-Published Resources,Youth Police Academy Archives - City of Champaign,"",200,403 Forbidden,"[""Items tagged: Youth Police Academy""]","[""Reserve Your Spot Today! Citizen Police Academy and Youth Police Academy"", ""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Items tagged: Youth Police Academy Search Reserve Your Spot Today! Citizen Police Academy and Youth Police Academy Posted: March 8, 2017 Youth Police Academy Open to youth ages 12-18, the Youth Police Academy (YPA) introduces participants to the field of law enforcement and allows youth and police officers to build stronger, positive relationships.  Students will attend a mock police academy involving lectures, demonstrations, role-play scenarios and team building exercises. YPA offers the following courses: Basic: June 27-30, 2017, 1:00 […] Categories: Police Department Press Releases | Tags: Citizen Police Academy , Reserve Your Spot Today! Citizen Police Academy and Youth Police Academy , Youth Police Academy Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works " -1887,https://delcopa.gov/planning/pubs/delco2035.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County 2035- Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County 2035""]","[""Component Plans""]","[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County 2035 Home / Departments / Planning Department / Publications / Delaware County 2035 Delaware County 2035 is the Comprehensive Plan for Delaware County, PA and provides a policy framework for land use decisions in the County. Delaware County 2035 consists of a central, Land Use Policy Framework Plan and a number of related, interconnected, but more detailed component plans. Some of these component plans – addressing additional planning-related elements within the County – have already been developed, others are currently underway, and more will be developed in the future, but all will use the same framework and build off of the Land Use policies laid out in the Framework Plan. Questions about Delaware County 2035 ? Contact the Planning Department at 610-891-5200 or Planning_Department@co.delaware.pa.us . Component Plans Land Use Policy Framework Plan (2013) Open Space and Recreation Plan (2015) Economic Development Plan (2017) Historic Preservation Plan (2018) Transportation Plan (2017) Housing Plan (Under Development) Implementation Metrics Report The Implementation Metrics Report helps the County to track progress in implementing Delaware County 2035. Perhaps most importantly, it will help the County to determine the efforts that are working most effectively and which goals may need more focus or a different approach. It uses commonly available data that is tracked regionally or nationally and regularly updated; this allows the report to be updated regularly. View the 2017 Implementation Metrics Report Planning Department Navigation Access the Data and Mapping Innovation Hub About Planning Calendar Current Projects Delaware County 2035 Demographic Data Development Review Forms Funding Green Space and Trails Project Mapping Municipal Programs & Initiatives Planning Education Publications Gina Burritt, Director Planning Department 2 W. Baltimore Avenue Suite 202 Media, PA 19063 Phone: 610-891-5200 Fax: 610-891-5203 Email: Planning_Department@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2023 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County 2035 Home / Departments / Planning Department / Publications / Delaware County 2035 Delaware County 2035 Home / Departments / Planning Department / Publications / Delaware County 2035 Delaware County 2035 " -1888,https://www.sandiego.gov/department-document/resolution-no-115919-copy,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1889,https://southamptontownnypolice.gov/faq.aspx?qid=237,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • What happens if I pay my taxes late?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Tax Receiver""]","[""Site Tools"", ""Categories"", ""In Person"", ""Mail"", ""Online Services"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1890,https://champaignil.gov/police/about-us/level-up-experienced-officer-interest-form/,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -1891,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/052421arrests.pdf,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -1892,https://www.londonohio.gov/copy-of-city-ordances,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1893,https://estespark.colorado.gov/departments/police/operations/patrol,Contact Info & Agency Meta,Info About Agencies,Patrol | Town of Estes Park,"",200,Home | Town of Estes Park,"[""Patrol""]","[""Providing Quality Police Services""]","[""What we do"", ""The Town"", ""Animal Control"", ""Code Enforcement"", ""DUI Enforcement"", ""School Resource Officer (SRO)"", ""Language Translation""]",[],[],[],"" -1894,https://www.tukwilawa.gov/departments/police/police-department-services/online-reporting/,Resources,Agency-Published Resources,Online Reporting - City of Tukwila,"",200,Home - City of Tukwila,"[""Online Reporting""]",[],"[""Government""]","[""City of Tukwila""]","[""I am a..."", ""Online Services"", ""Most Requested Forms""]",[],"" -1895,https://www.sandiego.gov/police/recruiting/contact,Contact Info & Agency Meta,Info About Agencies,Join Us Contact | City of San Diego Official Website,The following contact information and form are for theSDPD Recruiting Unit only. SeeContact Police Dispatchfor dispatch information and the dispatch contact form.,200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""Join Us Contact""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", """", ""Footer"", ""Accessibility Tools""]","[""Recruiting Officers"", ""Dispatch Recruiting""]","[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -1896,https://delcopa.gov/publicrelations/releases/2021/sheriffsofficeaccreditation.html,Media Bulletins,Agency-Published Resources,"Delaware County Sheriff's Office Earns Law Enforcement Accreditation - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Sheriff's Office Earns Law Enforcement Accreditation""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County Sheriff's Office Earns Law Enforcement Accreditation Home / Departments / Public Relations Releases / Delaware County Sheriff's Office Earns Law Enforcement Accreditation Released: September 7, 2021 Delaware County Council commends the Delaware County Sheriff’s Office, under the leadership of Sheriff Jerry L. Sanders, Jr., for earning a unanimous vote for accreditation by the Pennsylvania Law Enforcement Accreditation Commission of the Pennsylvania Chiefs of Police Association. Accreditation is awarded to only a small percentage of law enforcement agencies in Pennsylvania, and County Council is proud that the Sheriff’s Office has earned such a distinguished honor, exhibiting strong leadership and professionalism. This is the third time that the Sheriff’s office has earned this distinction, and the second time since Sheriff Sanders first took office in early 2018. To determine if a law enforcement agency will be awarded accreditation, the Commission conducts a thorough analysis to determine if the office’s current policies comply with the program’s 139 standards, and on-site reviews of agency files are conducted by trained assessors to ensure compliance with those standards. The Commission found the office to be meritorious and worthy of accreditation. Law enforcement accreditation is considered a progressive and time-proven method of helping law enforcement agencies evaluate and improve their overall performance by adopting high standards and professional objectives. Accreditation has many benefits, including: Improvements in law enforcement/community relations Increases employee input, interaction, and confidence in the agency Reduces agency risk and exposure to lawsuits Decreases liability insurance expenditures Extends agency accountability to the public and elected officials Encourages problem-solving activities within the agency Identifies and highlights the capabilities and competence of the agency Furnishes a solid foundation for the agency to build upon for further progress In all, over 375 agencies have enrolled since the program’s inception in 2001, and only 131 agencies currently maintain accredited status—including just six sheriff’s offices in the State and eight of 51 law enforcement agencies in Delaware County. The Delaware County’s Sheriff’s Office’s accreditation was announced during the Pennsylvania Chiefs of Police Association's annual banquet in July of 2021, and accreditation status will remain valid for a three-year period with annual reports required. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll " -1897,https://www.roseville.ca.us/news/what_s_happening_in_roseville/police_thank_local_community,Media Bulletins,Agency-Published Resources,Police thank local community for RPAL support - City of Roseville,Residents of a newly developed Fiddyment Farm neighborhood came together on July Fourth in celebration and support of the greater Roseville community.,200,Just a moment...,"[""City of Roseville""]","[""Police thank local community for RPAL support"", ""Police thank you local community for RPAL support"", ""Featured Stories""]","[""Help us improve our website"", ""Drop in for free daily activities during National Library Week"", ""Nature’s protectors: Urban Forestry Team safeguards local wildlife"", ""Join us for Roseville Venture Lab entrepreneur and small business events"", ""Gear up for Roseville BikeFest"", ""City of Roseville""]",[],[],[],"" -1898,http://www.longbeach.gov/police/press-releases/l-b-p-d--dui-checkpoint-proves-effective/,Media Bulletins,Agency-Published Resources,L.B.P.D. DUI CHECKPOINT PROVES EFFECTIVE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/28/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: L.B.P.D. DUI CHECKPOINT PROVES EFFECTIVE Contact: Media Relations Details (562) 570-5273 On Saturday, April 26, 2014, the Long Beach Police Department's Traffic Section conducted a Driving Under the Influence/Driver License Checkpoint on Atlantic Ave. and South St. from 7 p.m. until 3 a.m.  During the eight-hour operation, which was aided by Long Beach Police Explorers, Long Beach Search and Rescue and Public Works, 575 vehicles passed through the checkpoint with 286 drivers being screened, resulting in the following statistics: Five (5) field sobriety tests conducted Two (2) DUI arrests One (1) arrest for other charges Six (6) cited for unlicensed driving Two (2) cited for suspended license One (1) vehicles impounded for suspended license DUI checkpoints are a vital component in the fight against both impaired and unlicensed driving. Nationally, impaired driving caused by alcohol and/or drugs causes one death every 33 minutes. The average American has a 30% chance of being killed or injured by a driver under the influence. Sobriety checkpoints have been proven to reduce these types of driving-related collisions by removing such drivers from our streets. Funding for this program was provided by a grant from the California Office of Traffic Safety, through the National Highway Safety Administration.  For further information contact Traffic Section Lieutenant Kris Klein at (562) 570-7292. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1899,https://www.sandiego.gov/department-document/police-officer-cleared-shooting-jury-finds-actions-were-reasonable,Officer Involved Shootings,Police & Public Interactions,Police Officer Cleared in Shooting; Jury Finds Actions Were Reasonable | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Police Officer Cleared in Shooting; Jury Finds Actions Were Reasonable"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -1900,https://www.roundrocktexas.gov/news/police-seek-assistance-locating-robbery-suspect-3/,Media Bulletins,Agency-Published Resources,Bank robbery suspect arrested following public assistance - City of Round Rock,"",200,403 Forbidden,[],[],"[""Bank robbery suspect arrested following public assistance""]","[""Site Search"", ""Follow Us""]",[],[],"" -1901,https://www.plymouthmi.gov/government/departments/police/forms_and_documents/i_c_m_a_public_safety_reports,Annual & Monthly Reports,Info About Agencies,"ICMA Public Safety Reports - City of Plymouth, MI","",200,Just a moment...,"[""ICMA Public Safety Reports""]",[],[],[],[],[],"" -1902,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0351/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -1903,https://www.stpaul.gov/departments/police/connect-with-department/minnesota-crime-alert-network,Contact Info & Agency Meta,Info About Agencies,Minnesota Crime Alert Network | Saint Paul Minnesota,"Minnesota Crime Alert Network The Saint Paul Police Department, Bureau of Criminal Apprehension and the Minnesota Department of Public Safety are inviting",200,Home | Saint Paul Minnesota,"[""Minnesota Crime Alert Network""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Minnesota Crime Alert Network"", ""Footer""]","[""You are using an unsupported browser. Please use Microsoft Edge."", ""Contact The City"", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[],"" -1904,https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scope-12/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1905,https://pittsburghpa.gov/files/police/orders/ch3/35-03-infectious-disease-kits.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1906,https://www.minneapolismn.gov/news/2022/september/new-police-chief-/,Poor Data Source,Poor Data Source,300 Multiple Choices,"",300,City of Minneapolis,"[""Multiple Choices""]",[],[],[],[],[],"" -1907,https://coloradosprings.gov/police-department/article/news/traffic-fatality-briargate-parkway-and-1,Media Bulletins,Agency-Published Resources,Traffic Fatality: Briargate Parkway and Chapel Hills Drive | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Traffic Fatality: Briargate Parkway and Chapel Hills Drive""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -1908,http://www.lafayettepolice.us/3537/report-an-issue,Resources,Agency-Published Resources,"Report an Issue | Lafayette, IN - Official Website",Reporting landing page for SeeClickFix request categories.,200,"Police Department | Lafayette, IN - Official Website","[""Report an Issue""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home How Do I... Submit Report an Issue Report an Issue The City of Lafayette has partnered with CivicPlus to bring a better reporting solution, SeeClickFix. We believe this solution will provide a more robust experience to our citizens, as well as improve efficiencies in responding to your inquiries. To use this, simply follow one of the Request Category links below, or via your iOS or Android smartphone via the SeeClickFix app. Quick download links for these are below, to be used from your smartphone or tablet: Download SeeClickFix on the Apple App Store Download SeeClickFix from Google Play **Please note that the CivicMobile and LafayetteIN apps are being phased-out soon. The SeeClickFix app includes other City links, and our website is mobile-accessible if you would prefer to not use an app. These apps will be removed from the relevant app stores soon: The SeeClickFix app will replace our mobile app: Parking Citation Payments Online Utility Payments Police Department Compliments & Concerns Street Light Outages Star City Customer Service Award Nomination Report an Issue Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -1910,http://police.portlandmaine.gov/1170/maine-state-pier,Not Criminal Justice Related,Not Criminal Justice Related,"Maine State Pier | Portland, ME - Official Website","",200,"Portland, ME - Official Website | Official Website","[""Maine State Pier""]",[],[],[],[],[],"Skip to Main Content Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities Venues Maine State Pier Maine State Pier City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space Government Websites by CivicPlus® Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities Venues Maine State Pier Maine State Pier City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space Government Websites by CivicPlus® Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities Venues Maine State Pier Maine State Pier City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space Government Websites by CivicPlus® Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities Venues Maine State Pier Maine State Pier City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space Government Websites by CivicPlus® Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities Venues Maine State Pier Maine State Pier City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space Home Your Government Departments Parks, Recreation & Facilities Venues Maine State Pier Maine State Pier City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space Home Your Government Departments Parks, Recreation & Facilities Venues Maine State Pier Maine State Pier City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space Home Your Government Departments Parks, Recreation & Facilities Venues Maine State Pier Maine State Pier Home Your Government Departments Parks, Recreation & Facilities Venues Maine State Pier Maine State Pier Home Your Government Departments Parks, Recreation & Facilities Venues Maine State Pier Maine State Pier Maine State Pier City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space City Hall Community Centers FAQ James A Banks Sr Portland Exposition Building Maine State Pier Merrill Auditorium Ocean Gateway Public Assembly Facilities Troubh Ice Arena Use of Public Space Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® " -1911,https://alpha.austin.gov/en/police-oversight/2020-08-26-12/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -1912,https://www.roundrocktexas.gov/news/round-rock-police-investigate-suspicious-death-subject-in-custody/,Media Bulletins,Agency-Published Resources,Police investigate murder at storage facility - City of Round Rock,"",200,403 Forbidden,[],[],"[""Police investigate murder at storage facility""]","[""Site Search"", ""Follow Us""]",[],[],"" -1913,http://www.longbeach.gov/police/press-releases/murder-3500-block-of-faust-ave/,Media Bulletins,Agency-Published Resources,Murder 3500 Block of Faust Ave,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/7/2015 FOR IMMEDIATE RELEASE Press Release # Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Sunday, December 6, 2015, at approximately 11:50 p.m., Long Beach Police responded to a residence in the 3500 block of Faust Avenue regarding the body of a deceased male adult. Based on the preliminary investigation, it was determined the victim and a male subject had become involved in a dispute at the location. Further investigation revealed the victim and male subject were in a relationship and resided at the location together. During a physical altercation, the victim sustained severe head trauma. Long Beach Fire Department paramedics were then called to the scene who determined the victim deceased and requested the assistance of the police department. The victim is only being identified as a 45-year-old male, pending notification of next of kin. The suspect, identified as 24-year-old Timothy Hagler, was arrested at the scene. He has been booked for murder and is being held at the Long Beach City Jail on $1,000,000.00 bail. Anyone with information regarding this incident is asked to contact Long Beach Police Homicide Detectives Mark Bigel Guarino and Shea Robertson at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1914,https://www.antioch.il.gov/wpfb-file/national-coffee-with-a-cop-flyer-template-ppt-pdf/,Misc Police Activity,Police & Public Interactions,"National-Coffee-With-A-Cop-Flyer-Template-ppt - Antioch, IL",15230 national coffee with a cop flyer template ppt pdf event documents 2017 1625759890 364503d45be0a2fb8c68180abac5d6cd 15a3caf730ab8522c6cbb9cef220d9e955aab263a9e0b28c90daa8b038d5efb9 225x300 _razo576asevc thumb jpg 09 18 14 17 40 0 216 125 48 192 2021 07 13 26 38 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17,200,"Home - Antioch, IL","[""National-Coffee-With-A-Cop-Flyer-Template-ppt""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -1915,http://www.longbeach.gov/police/press-releases/murder-19-/,Media Bulletins,Agency-Published Resources,MURDER(19),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/5/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MURDER Contact: Media Relations (562) 570-5273 On Wednesday, February 04, 2015, at approximately 3:00 p.m., Long Beach Police responded to the 4400 block of Rutgers Avenue regarding two deceased individuals found inside a residence. When the officers arrived they located a male adult and a female adult who appeared to have sustained gunshot wounds.  Long Beach Fire Department Paramedics responded and pronounced both individuals deceased at the scene. The victims have been identified as 57-year-old Salvador Trujillo , and his wife, 57-year-old Sayuri Jean Griffin of Long Beach. The preliminary investigation revealed there were no obvious signs of forced entry to the home, and a firearm was recovered from the scene. This does not appear to be a random act of violence. The investigation remains ongoing. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detectives Hugo Cortes and Oscar Valenzuela at (562) 570-7244.  Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1916,https://pittsburghpa.gov/files/police/orders/ch2/25-02-reinstatement-voluntary-break-in-service.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1917,http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-one-arrest---numerous-citations/,Media Bulletins,Agency-Published Resources,DUI CHECKPOINT NETS ONE ARREST & NUMEROUS CITATIONS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/19/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: DUI CHECKPOINT NETS ONE ARREST & NUMEROUS CITATIONS Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department’s Traffic Section conducted a DUI/Driver’s License checkpoint on Saturday, June 17th. The checkpoint was located at the intersection of Pacific Coast Highway and Daisy Avenue, between the hours of 7:00 p.m. and 3:00 a.m. Checkpoints are placed in locations that have the greatest opportunity for achieving drunk and drugged driving deterrence and provide the greatest safety for officers and the public. High Visibility Enforcements, which include DUI/Driver’s License checkpoints, have been shown to lower DUI deaths and injuries. A major component of these checkpoints are the deterrent effects it has on those who might drive while alcohol or drug impaired, bringing about more awareness and encouraging everyone to use sober designated drivers. Listed below are the statistics related to Saturday’s checkpoint: 1,225 vehicles through checkpoint 461 vehicles screened 1 DUI-alcohol suspect arrested 3 drivers cited for operating a vehicle while license suspended/revoked 22 drivers cited for operating a vehicle while unlicensed 9 citations issued for unsafe driving Drivers are encouraged to download the Designated Driver VIP, or “DDVIP,” free mobile app for Android or iPhone. The DDVIP app helps find nearby bars and restaurants that feature free incentives for the designated sober driver, from free non-alcoholic drinks to free appetizers and more. The feature-packed app even has social media tie-ins and a tab for the non-DD to call Uber, Lyft, or Curb. Studies of California drivers have shown that 30 percent of drivers in fatal crashes had one or more drugs in their systems. A study of active drivers showed more tested positive for drugs that may impair driving (14 percent), than did for alcohol (7.3 percent). Of the drugs, marijuana was most prevalent, at 7.4 percent, slightly more than alcohol. Drivers caught driving impaired can expect the impact of a DUI arrest to include jail time, fines, fees, DUI classes, license suspension and other expenses that can exceed $10,000, not to mention the embarrassment when friends and family find out. The checkpoint was funded by a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration, reminding everyone to ‘Report Drunk Driver – Call 9-1-1’. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1918,https://dccouncil.gov/donation-disclosures/copy-of-december-2018-donation-disclosures-3/,Not Criminal Justice Related,Not Criminal Justice Related,Copy of December 2018 Donation Disclosures • Council of the District of Columbia,"",200,Home • Council of the District of Columbia,"[""Copy of December 2018 Donation Disclosures""]",[],[],[],[],[],"Federal Tax Counter: $1,298,489,450 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Federal Tax Counter: $1,298,489,450 What is this? Get Updates RSS Press Center facebook twitter youtube Federal Tax Counter: $1,298,489,450 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Council of the District of Columbia Copy of December 2018 Donation Disclosures June 07, 2019 Copy of December 2018 Donation Disclosures Copy of December 2018 Donation Disclosures June 07, 2019 Copy of December 2018 Donation Disclosures DC Council seal About the Council Open Government Register to Vote Council Updates Jobs Council Directory Privacy Policy Commemorative D.C. Flag Program Ethics Visit the Wilson Building facebook twitter youtube Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Search facebook twitter youtube Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate " -1919,https://www.sandyspringsgapolice.gov/north-metro-s-w-a-t/,Contact Info & Agency Meta,Info About Agencies,North Metro S.W.A.T. – Sandy Springs Police Department,"",200,Sandy Springs Police Department,"[""North Metro S.W.A.T.""]",[],[],[],[],[],Emergency: Dial 911 | Non-Emergency: Phone Directory | Police Reports | Events Emergency: Dial 911 | Non-Emergency: Phone Directory | Police Reports | Events Menu Menu About SSPD Police Chief Command Staff Districts Careers with SSPD Contact Us Visit Police HQ Higher Learning Statement on Use of Force & Community Engagement SSPD Most Wanted In Memoriam Sandy Springs Police Benevolent Fund SSPD’s Social Media Policy Divisions and Units Patrol Division Special Operations Division Criminal Investigation Division Administration Division Intelligence and Technology Division Internal Affairs Training and Background Unit Property & Evidence Unit Specialized Units North Metro S.W.A.T. Quick Response Force Street Crimes Unit K-9 Unit Traffic Traffic Response Vehicle Bicycle Patrol CSI Unit Crisis Negotiation Team River Patrol Unit Honor Guard Drone Program Community Part Time / Reserve Officers Task Forces Organizational Chart Citizen Services Alarm Information Alcohol Pouring Permits Apartment Safety Checker ChatComm911 Criminal History Reports and Record Restrictions Event Map ⤤ Domestic Violence Resources Home and Business Checks Mental Health & Substance Abuse Municipal Court Off-Duty Officer Requests Open Records Requests Police Reports Report a Crime & Crime Tips Sex Offender Registry Vehicle Release VIN Verification Weapons Carry License Crime Prevention Crime Statistics Neighborhood Watch Home and Business Security Citizen Participation SSPD Events Citizens Police Academy (CPA) Women’s Self Defense Classes Handgun Safety Class Volunteer Programs Citizens On Patrol (COPS) Law Enforcement Explorers Youth Program Internship Program VIPS (Volunteers in Police Service) Chaplains Program Camera Registry Program Menu About SSPD Police Chief Command Staff Districts Careers with SSPD Contact Us Visit Police HQ Higher Learning Statement on Use of Force & Community Engagement SSPD Most Wanted In Memoriam Sandy Springs Police Benevolent Fund SSPD’s Social Media Policy Divisions and Units Patrol Division Special Operations Division Criminal Investigation Division Administration Division Intelligence and Technology Division Internal Affairs Training and Background Unit Property & Evidence Unit Specialized Units North Metro S.W.A.T. Quick Response Force Street Crimes Unit K-9 Unit Traffic Traffic Response Vehicle Bicycle Patrol CSI Unit Crisis Negotiation Team River Patrol Unit Honor Guard Drone Program Community Part Time / Reserve Officers Task Forces Organizational Chart Citizen Services Alarm Information Alcohol Pouring Permits Apartment Safety Checker ChatComm911 Criminal History Reports and Record Restrictions Event Map ⤤ Domestic Violence Resources Home and Business Checks Mental Health & Substance Abuse Municipal Court Off-Duty Officer Requests Open Records Requests Police Reports Report a Crime & Crime Tips Sex Offender Registry Vehicle Release VIN Verification Weapons Carry License Crime Prevention Crime Statistics Neighborhood Watch Home and Business Security Citizen Participation SSPD Events Citizens Police Academy (CPA) Women’s Self Defense Classes Handgun Safety Class Volunteer Programs Citizens On Patrol (COPS) Law Enforcement Explorers Youth Program Internship Program VIPS (Volunteers in Police Service) Chaplains Program Camera Registry Program -1920,https://www.ashevillenc.gov/news/three-promoted-in-asheville-police-dept/,Media Bulletins,Agency-Published Resources,ERROR: The request could not be satisfied,"",200,The City of Asheville - Your Asheville,"[""403 ERROR""]","[""The request could not be satisfied.""]",[],[],[],[],"" -1921,https://www.east-windsor.nj.us//police/cpanel,Poor Data Source,Poor Data Source,cPanel Login,"",200,"Official Website of East Windsor Township, New Jersey - Home",[],[],[],[],[],[],"JavaScript is disabled in your browser. - For cPanel to function properly, you must enable JavaScript. - If you do not enable JavaScript, certain features in cPanel will not function correctly. You have logged out. The system has detected that you are using Internet Explorer 11. cPanel & WHM no longer supports Internet Explorer 11. For more information, read the cPanel Blog . Please select a locale: X Close العربية български čeština dansk Deutsch Ελληνικά English español español latinoamericano español de España suomi Filipino français עברית magyar i_en Bahasa Indonesia italiano 日本語 한국어 Bahasa Melayu norsk bokmål Nederlands Norwegian polski português português do Brasil română русский slovenščina svenska ไทย Türkçe українська Tiếng Việt 中文 中文(中国) 中文(台湾) Continue Username Password Log in Reset Password Change locale العربية български čeština dansk Deutsch Ελληνικά English español español latinoamericano español de España suomi Filipino français עברית magyar i_en Bahasa Indonesia italiano 日本語 한국어 Bahasa Melayu norsk bokmål Nederlands Norwegian polski português português do Brasil română русский slovenščina svenska ไทย Türkçe українська Tiếng Việt 中文 中文(中国) 中文(台湾) Change العربية български čeština dansk Deutsch Ελληνικά English español … Select a locale: English JavaScript is disabled in your browser. - For cPanel to function properly, you must enable JavaScript. - If you do not enable JavaScript, certain features in cPanel will not function correctly. You have logged out. The system has detected that you are using Internet Explorer 11. cPanel & WHM no longer supports Internet Explorer 11. For more information, read the cPanel Blog . Please select a locale: X Close العربية български čeština dansk Deutsch Ελληνικά English español español latinoamericano español de España suomi Filipino français עברית magyar i_en Bahasa Indonesia italiano 日本語 한국어 Bahasa Melayu norsk bokmål Nederlands Norwegian polski português português do Brasil română русский slovenščina svenska ไทย Türkçe українська Tiếng Việt 中文 中文(中国) 中文(台湾) Continue Username Password Log in Reset Password Change locale العربية български čeština dansk Deutsch Ελληνικά English español español latinoamericano español de España suomi Filipino français עברית magyar i_en Bahasa Indonesia italiano 日本語 한국어 Bahasa Melayu norsk bokmål Nederlands Norwegian polski português português do Brasil română русский slovenščina svenska ไทย Türkçe українська Tiếng Việt 中文 中文(中国) 中文(台湾) Change العربية български čeština dansk Deutsch Ελληνικά English español … Select a locale: English JavaScript is disabled in your browser. - For cPanel to function properly, you must enable JavaScript. - If you do not enable JavaScript, certain features in cPanel will not function correctly. You have logged out. The system has detected that you are using Internet Explorer 11. cPanel & WHM no longer supports Internet Explorer 11. For more information, read the cPanel Blog . JavaScript is disabled in your browser. - For cPanel to function properly, you must enable JavaScript. - If you do not enable JavaScript, certain features in cPanel will not function correctly. You have logged out. You have logged out. You have logged out. You have logged out. " -1922,https://www.dps.nm.gov/blog/2021/04/14/new-mexico-state-police-arrests-driver-for-vehicular-homicide-in-chaves-county/,Media Bulletins,Agency-Published Resources,New Mexico State Police Arrests Driver for Vehicular Homicide in Chaves County - NM Department of Public Safety,"",200,Home - NM Department of Public Safety,"[""New Mexico State Police Arrests Driver for Vehicular Homicide in Chaves County""]",[],"[""Location"", ""Sitemap"", ""Quick Links"", ""Social Media Links""]",[],[],[],"Manage Cookie Consent We use cookies to optimize our website and our service. Functional Functional Always active The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network. Preferences Preferences The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user. Statistics Statistics The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you. Marketing Marketing The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes. Manage options Manage services Manage {vendor_count} vendors Read more about these purposes Accept Deny Preferences Save preferences Preferences Cookie Policy Privacy Statement {title} Manage Cookie Consent We use cookies to optimize our website and our service. Functional Functional Always active The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network. Preferences Preferences The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user. Statistics Statistics The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you. Marketing Marketing The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes. Manage options Manage services Manage {vendor_count} vendors Read more about these purposes Accept Deny Preferences Save preferences Preferences Cookie Policy Privacy Statement {title} Manage Cookie Consent Manage Cookie Consent " -1923,https://cityofpowell.us/police-agency/traffic-surveys/traffic-survey-report-11-13-17-2/,Not Criminal Justice Related,Not Criminal Justice Related,"City of Powell, Ohio | Traffic Survey Report 11-13-17","",200,"City of Powell, Ohio","[""Traffic Survey Report 11-13-17""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -1924,https://ose.louisiana.gov/event/police-officer-20/,Poor Data Source,Poor Data Source,Police Officer | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Police Officer""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Police Officer Competitive Level Application Deadline TBD Jurisdiction Bogalusa Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Police Officer Competitive Level Application Deadline TBD Jurisdiction Bogalusa Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Officer Competitive Level Application Deadline TBD Jurisdiction Bogalusa Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Officer Competitive Level Application Deadline TBD Jurisdiction Bogalusa Application This event has passed. Police Officer Competitive Level Application Deadline TBD Jurisdiction Bogalusa Application This event has passed. Police Officer Competitive Level Application Deadline TBD Jurisdiction Bogalusa Application This event has passed. Police Officer Competitive Level Competitive Level Competitive Level Application Deadline TBD Jurisdiction Bogalusa Application Deadline TBD Jurisdiction Bogalusa Application Deadline TBD Jurisdiction Bogalusa Application Deadline TBD Application Deadline Jurisdiction Bogalusa Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -1925,https://delcopa.gov/publicrelations/releases/2021/covid_vaccineupdate0217.html,Media Bulletins,Agency-Published Resources,"Delaware County’s Feb. 17 Update on COVID-19 Vaccine Efforts - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County’s Feb. 17 Update on COVID-19 Vaccine Efforts""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -1926,http://www.longbeach.gov/police/press-releases/police-asking-for-publics-help-in-identifying-person-of-interest-in-sexual-battery/,Media Bulletins,Agency-Published Resources,POLICE ASKING FOR PUBLIC'S HELP IN IDENTIFYING PERSON OF INTEREST IN SEXUAL BATTERY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/4/2019 FOR IMMEDIATE RELEASE Press Release # Subject: POLICE ASKING FOR PUBLIC'S HELP IN IDENTIFYING PERSON OF INTEREST IN SEXUAL BATTERY Contact: Media Relations Details (562) 570-5273 LBPDMediaRelations@longbeach.gov (Click on photos to enlarge) The Long Beach Police Department is asking for the public’s help in identifying a suspect who detectives believe may be responsible for a sexual battery where an adult female victim was groped by an adult male suspect. On Tuesday, February 26, 2019, at approximately 7:15 a.m., the suspect approached the victim from behind as she was walking southbound in an alley east of Long Beach Blvd. and South of Pacific Coast Highway. The suspect struck the victim on the back of her head with an unknown object and proceeded to “body slam” her onto the ground. The suspect reached underneath her clothing and groped her breast. The suspect’s attack was interrupted when the victim began to yell for help and a bystander came to her aid. The bystander told the victim to run as he chased after the suspect. The victim sought medical attention on her own for a complaint of pain to her head. The suspect is being described as a male Hispanic, in his 20’s, thin build, wearing a burgundy baseball cap with a “diamond” stitched on the front. The victim described the diamond as a “wedding diamond.” He was wearing a gray jacket with black on the sides of the jacket, dark colored pants, and black shoes. Detectives would like to encourage anyone who may have also been a victim and have not reported the incident, to do so immediately by calling Police Dispatch at (562) 435-6711. Anyone who may have information regarding the person responsible for these crimes should contact Sex Crimes Detective Adriana Jaurigui at (562) 570-7372. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smartphone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1928,https://alpha.austin.gov/es/police-oversight/formal-complaint-responsibility-to-the-community-2/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1929,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0014/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -1930,https://www.ci.san-ramon.ca.us/our_city/departments_and_divisions/police/victims_rights_information/survivor_of_sexual_assault,Resources,Agency-Published Resources,Survivor of Sexual Assault - City of San Ramon,"",200,Just a moment...,"[""Survivor of Sexual Assault""]","[""YOUR RIGHTS AS A SURVIVOR OF SEXUAL ASSAULT:"", ""Contact Us"", ""Useful Links""]","[""YOU HAVE THE RIGHT TO"", ""YOU HAVE THE RIGHT TO"", ""YOU HAVE THE RIGHT TO""]",[],[],[],"" -1931,https://www.elrenook.gov/departments/police-department/services-resources/resource-numbers/,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -1932,https://www.attorneygeneral.utah.gov/wp-content/uploads/2015/03/img_7489-copy-2.jpg,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -1933,https://www.mass.gov/doc/october-30-1996-out-of-state-domestic-violence-restraining-orders-with-a-copy-of-memorandum/download,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -1934,https://www.alamoheightstx.gov/public-safety/police/divisions/,Contact Info & Agency Meta,Info About Agencies,Divisions - City of Alamo Heights,"",200,403 Forbidden,"[""Divisions""]","[""Patrol Operations Division"", ""Support Services Division"", ""Police Administrative Office"", ""Criminal Investigations Division"", ""Emergency Services Center"", ""Animal Care Services""]",[],[],[],[],"" -1935,https://delcopa.gov/planning/pubs/portfolio-12_tacticalplacemaking.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1936,https://icjia.illinois.gov/researchhub/articles/law-enforcement-response-to-mental-health-crisis-incidents-a-survey-of-illinois-police-and-sheriff-s-departments/,Media Bulletins,Agency-Published Resources,ICJIA | Illinois Criminal Justice Information Authority,Illinois Criminal Justice Information Authority,200,ICJIA | Illinois Criminal Justice Information Authority,[],[],[],[],[],[],"Skip to content MENU ILLINOIS CRIMINAL JUSTICE INFORMATION AUTHORITY About arrow_drop_down Research arrow_drop_down Grant Resources arrow_drop_down Partners arrow_drop_down About Research Grant Resources Partners ICJIA  » Research and Analysis Unit Research Translate this site Research Hub R&A Overview Articles Web Applications Datasets Publications Institutional Review Board NOTICE OF FEDERAL FUNDING AND FEDERAL DISCLAIMER ICJIA’s Research Hub is funded through a grant from the Bureau of Justice Statistics, Office of Justice Programs, U.S. Department of Justice. Neither the U.S. Department of Justice nor any of its components operate, control, are responsible for, or necessarily endorse, ICJIA’s Research Hub (including, without limitation, its content, technical infrastructure, and policies, and any services or tools provided). About Contact Employment Events Funding Grant Status Request Meetings News & Information Press Research Training About | Contact | Document Archive | FOIA | Language Access Request | Privacy | Grant Status Request | Subscribe to CJ Dispatch © 2024 Illinois Criminal Justice Information Authority Skip to content MENU ILLINOIS CRIMINAL JUSTICE INFORMATION AUTHORITY About arrow_drop_down Research arrow_drop_down Grant Resources arrow_drop_down Partners arrow_drop_down About Research Grant Resources Partners ICJIA  » Research and Analysis Unit Research Translate this site Research Hub R&A Overview Articles Web Applications Datasets Publications Institutional Review Board NOTICE OF FEDERAL FUNDING AND FEDERAL DISCLAIMER ICJIA’s Research Hub is funded through a grant from the Bureau of Justice Statistics, Office of Justice Programs, U.S. Department of Justice. Neither the U.S. Department of Justice nor any of its components operate, control, are responsible for, or necessarily endorse, ICJIA’s Research Hub (including, without limitation, its content, technical infrastructure, and policies, and any services or tools provided). About Contact Employment Events Funding Grant Status Request Meetings News & Information Press Research Training About | Contact | Document Archive | FOIA | Language Access Request | Privacy | Grant Status Request | Subscribe to CJ Dispatch © 2024 Illinois Criminal Justice Information Authority MENU ILLINOIS CRIMINAL JUSTICE INFORMATION AUTHORITY About arrow_drop_down Research arrow_drop_down Grant Resources arrow_drop_down Partners arrow_drop_down MENU ILLINOIS CRIMINAL JUSTICE INFORMATION AUTHORITY About arrow_drop_down Research arrow_drop_down Grant Resources arrow_drop_down Partners arrow_drop_down MENU MENU ILLINOIS CRIMINAL JUSTICE INFORMATION AUTHORITY About Research Grant Resources Partners About Research Grant Resources Partners About Research Grant Resources Partners About About About About About Research Research Research Research Research Grant Resources Grant Resources Grant Resources Grant Resources Grant Resources Partners Partners Partners Partners Partners ICJIA  » Research and Analysis Unit Research Translate this site Research Hub R&A Overview Articles Web Applications Datasets Publications Institutional Review Board NOTICE OF FEDERAL FUNDING AND FEDERAL DISCLAIMER ICJIA’s Research Hub is funded through a grant from the Bureau of Justice Statistics, Office of Justice Programs, U.S. Department of Justice. Neither the U.S. Department of Justice nor any of its components operate, control, are responsible for, or necessarily endorse, ICJIA’s Research Hub (including, without limitation, its content, technical infrastructure, and policies, and any services or tools provided). ICJIA  » Research and Analysis Unit Research Translate this site Research Hub R&A Overview Articles Web Applications Datasets Publications Institutional Review Board " -1937,http://www.longbeach.gov/police/press-releases/traffic-fatality-20-/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY(20),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/22/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On December 11, 2015, at approximately 10:58 a.m., Long Beach Police responded to the 1300 block of Junipero Avenue regarding an injury traffic collision involving a vehicle and a pedestrian. The preliminary investigation revealed a 2010 Ford Fusion, being driven by a 21-year-old resident of Long Beach, was slowly backing out of the driveway when the vehicle collided with 69-year-old David Marroquin of Long Beach who was walking on the sidewalk. The collision knocked the pedestrian to the ground, causing him to strike his head on the cement driveway. Immediately following the collision, the driver stopped, called 9-1-1, and remained with Mr. Marroquin until Long Beach Fire Department personnel arrived. Paramedics transported him, in critical condition, to a local hospital. On December 16, 2015, at 10:39 a.m., Mr. Marroquin was pronounced deceased at the hospital. On December 21, 2015, the Long Beach Police Department was notified. Anyone with information regarding this incident is asked to contact Detective David Lauro of the Collision Investigations Detail at (562) 570-7355. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1938,https://southamptontownnypolice.gov/1663/2022-adopted-budget-operating,List of Data Sources,Info About Agencies,"2022 Adopted Budget Operating | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""2022 Adopted Budget Operating""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Finance (Comptroller) 2022 Budgets 2022 Adopted Budget Operating 2022 Adopted Budget Operating _01-2022-BudgetMessage _02-2022-Budget Charts _03-2022-FinancialSummaries _04-2022-Summary Revenue and Expenses by Fund _05-2022-Tax Levy Maps _06-2022-Financial Policies _07-2022-Bonded Indebtedness _08-2022- Tax Exemption Analysis _09-2022-SalaryCharts 00-TownORG 01-TownBoard 02 Dept of Public Information 03-TownClerk 04-TaxReceiver 05-TaxAssessor 06-TownTrustees 07-TownAttorney 08-Public Safety 09-Justice Court 10 -Housing and Community Services 11 -Human Resources 12-Finance org 13-LandManagment 14-ParksRec 15-Highway 16-MunicipalWorks 17-TownPolice 18-CPF 19-Unallocated-RevenuesExpenses 20-Retiree IIIb-TX-DIST-01-Ambulance IIIb-TX-DIST-02-CoastalErosion IIIb-TX-DIST-03-Fire IIIb-TX-DIST-04b-Park District IIIb-TX-DIST-04b-PublicParking IIIb-TX-DIST-05-RoadImprov IIIb-TX-DIST-06-Cliff Drive Utility District IIIb-TX-DIST-07-StreetLighting IIIb-TX-DIST-08-Hampton Bay-Water 2022 Tentative Budget - Operating 2022 Tentative Budget - Capital 2022 Adopted Budget Operating 2022 Adopted Budget - Capital Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Finance (Comptroller) 2022 Budgets 2022 Adopted Budget Operating 2022 Adopted Budget Operating _01-2022-BudgetMessage _02-2022-Budget Charts _03-2022-FinancialSummaries _04-2022-Summary Revenue and Expenses by Fund _05-2022-Tax Levy Maps _06-2022-Financial Policies _07-2022-Bonded Indebtedness _08-2022- Tax Exemption Analysis _09-2022-SalaryCharts 00-TownORG 01-TownBoard 02 Dept of Public Information 03-TownClerk 04-TaxReceiver 05-TaxAssessor 06-TownTrustees 07-TownAttorney 08-Public Safety 09-Justice Court 10 -Housing and Community Services 11 -Human Resources 12-Finance org 13-LandManagment 14-ParksRec 15-Highway 16-MunicipalWorks 17-TownPolice 18-CPF 19-Unallocated-RevenuesExpenses 20-Retiree IIIb-TX-DIST-01-Ambulance IIIb-TX-DIST-02-CoastalErosion IIIb-TX-DIST-03-Fire IIIb-TX-DIST-04b-Park District IIIb-TX-DIST-04b-PublicParking IIIb-TX-DIST-05-RoadImprov IIIb-TX-DIST-06-Cliff Drive Utility District IIIb-TX-DIST-07-StreetLighting IIIb-TX-DIST-08-Hampton Bay-Water 2022 Tentative Budget - Operating 2022 Tentative Budget - Capital 2022 Adopted Budget Operating 2022 Adopted Budget - Capital Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... " -1939,https://delcopa.gov/purchasing/bidsprops/kyo878.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1940,http://www.longbeach.gov/police/press-releases/murder-investigation/,Media Bulletins,Agency-Published Resources,MURDER INVESTIGATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/23/2018 FOR IMMEDIATE RELEASE Press Release # 2018 Subject: MURDER INVESTIGATION Contact: Media Relations Detail (562) 570-5273 On 2/23/18 at approx., 12:41 am, officers were dispatched to the area of the 710 Freeway and Anaheim street regarding possible traffic accident. The calling party advised there was a small white car that may have been involved in an accident, the car was stopped on the greenery of the onramp to the 710 freeway from westbound Anaheim Street. Upon arrival officers found an unresponsive male adult in his 30’s. The vehicle appeared to have driven off roadway into ivy at slow speeds. Long Beach Fire responded and determined the subject deceased at the scene. Further investigation found that the victim had what appears to be a gunshot wound to his upper torso. Unknown exactly where shooting occurred. Homicide detectives responded and the investigation is ongoing. The victim has been identified as Glen Chico, 31-year old resident of Long Beach. Anaheim was closed in both directions from Oregon to Harbor as was southbound 710 to eastbound Anaheim and northbound 710 to westbound Anaheim, for several hours. All road closures were opened just before 8:00 am. Anyone with information is urged to call Homicide Detectives Donald Goodman and Mark Mattia at (562) 570-7244. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police , ""Like"" us on Facebook , follow us on Twitter and Instagram . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1941,https://www.fortworthtexas.gov/departments/hr/administration/prr/police-prr,Policies & Contracts,Info About Agencies,Personnel Rules and Regulations for Commissioned Police Officers – Welcome to the City of Fort Worth,Personnel Rules and Regulations for Sworn Police Officers.,200,Error retrieving title: 'NoneType' object has no attribute 'text',"[""Personnel Rules and Regulations for Commissioned Police Officers""]","[""Chapter 143 of the Texas Local Government Code"", ""Chapters 141 and 142 of the Texas Local Government Code"", ""Meet and Confer Labor Agreement"", ""Fort Worth Fire Fighters’ and Police Officers’ Civil Service Commission"", ""Management Rights"", ""Amendments"", ""Department Rules and Regulations"", ""Waivers"", ""Clarifications"", ""Quarantine/Traumatic Leave"", ""Related Information"", ""Accommodations & Accessibilities"", ""About Fort Worth"", ""City Council"", ""Public Safety"", ""Business"", ""Get Connected. Stay Informed.""]","[""City Council Meeting on YouTube"", ""Effective September 1, 2021""]",[],[],[],"opens in new tab or window City Council Meeting on YouTube The Fort Worth City Cable Channel (Charter/Spectrum channel 190) will be offline for a few weeks starting March 11 while facilities connections are being rerouted. During the outage, you can watch the City Council Meetings and other City meetings on the City’s YouTube Channel . City Council Meeting on YouTube The Fort Worth City Cable Channel (Charter/Spectrum channel 190) will be offline for a few weeks starting March 11 while facilities connections are being rerouted. During the outage, you can watch the City Council Meetings and other City meetings on the City’s YouTube Channel . City Council Meeting on YouTube The Fort Worth City Cable Channel (Charter/Spectrum channel 190) will be offline for a few weeks starting March 11 while facilities connections are being rerouted. During the outage, you can watch the City Council Meetings and other City meetings on the City’s YouTube Channel . City Council Meeting on YouTube The Fort Worth City Cable Channel (Charter/Spectrum channel 190) will be offline for a few weeks starting March 11 while facilities connections are being rerouted. During the outage, you can watch the City Council Meetings and other City meetings on the City’s YouTube Channel . City Council Meeting on YouTube The Fort Worth City Cable Channel (Charter/Spectrum channel 190) will be offline for a few weeks starting March 11 while facilities connections are being rerouted. During the outage, you can watch the City Council Meetings and other City meetings on the City’s YouTube Channel . The Fort Worth City Cable Channel (Charter/Spectrum channel 190) will be offline for a few weeks starting March 11 while facilities connections are being rerouted. During the outage, you can watch the City Council Meetings and other City meetings on the City’s YouTube Channel . " -1942,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/022622blotter.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1943,https://joinmpd.dc.gov/metropolitan-police/reserve-police-officer,Training & Hiring Info,Info About Officers,Reserve Police Officer | joinmpd.dc.gov,Reserve Police Officer,200,joinmpd.dc.gov | Careers at DC Metropolitan Police Department,"[""Reserve Police Officer""]","[""joinmpd.dc.gov"", ""Main menu"", ""Main menu"", ""Navigation""]","[""Becoming a Reserve Officer""]",[],[],[],Skip to main content -1944,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0932/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1945,https://delcopa.gov/ojs/ojsforms/praecipetosettlediscontinue.pdf,Resources,Agency-Published Resources,"","",200,"","","","","","","","" -1946,http://www.longbeach.gov/police/about-the-lbpd/bureaus/investigations-bureau/officer-involved-shooting-investigation-process/,Policies & Contracts,Info About Agencies,OFFICER INVOLVED SHOOTING INVESTIGATION PROCESS,"

  - OFFICER INVOLVED SHOOTING INVESTIGATION PROCESS - To demonstrate the level of investigation, review, evaluation, and actions our Department takes when an officer involved shooting occurs, an overview of the process is provided below:   - Homicide Detail detectives, field supervisors, and departmental manager

",200,City of Long Beach,"[""Police Department""]",[],"[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""OFFICER INVOLVED SHOOTING INVESTIGATION PROCESS"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", """", """", """", """", ""Crime Lab Survey"", """"]",[],"" -1947,https://delcopa.gov/council/2020minutes/10072020minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1948,https://www.ci.rohnert-park.ca.us/city_hall/departments/public_works/drainage___stormwater/creeks__environmental_information/copeland_test,Not Criminal Justice Related,Not Criminal Justice Related,Copeland Test - City of Rohnert Park,"",200,Just a moment...,"[""City of Rohnert Park""]","[""Rohnert Park""]","[""Copeland Test"", ""Daily Acts is making its way to Rohnert Park!""]",[],[],[],"" -1949,https://champaignil.gov/2022/08/27/champaign-police-investigating-overnight-shooting-incidents/,Media Bulletins,Agency-Published Resources,Champaign Police Investigating Overnight Shooting Incidents - City of Champaign,"",200,403 Forbidden,"[""Champaign Police Investigating Overnight Shooting Incidents""]","[""News Releases"", ""Department News""]",[],[],[],[],"" -1950,https://delcopa.gov/publicrelations/releases/2020/pdf/delawarecountynovemberflushotclinics_mercyfitz.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1951,https://www.jacksontn.gov/government/departments/police/daily_arrest_reports,Poor Data Source,Poor Data Source,"Daily Arrest Reports - City of Jackson, TN",Welcome to the official website of City of Jackson in Tennessee.,200,Just a moment...,"[""City of Jackson TN"", ""City of Jackson TN""]","[""Daily Arrest Reports""]",[],[],[],[],"" -1952,https://alpha.austin.gov/police-oversight/2020-06-4-17/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1953,https://louisvilleky.gov/police/forms/submit-crime-tip,Resources,Agency-Published Resources,"","",403,"","","","","","","","" -1954,https://bolivar.mo.us/shop-with-a-copr/img_3318/,Poor Data Source,Poor Data Source,"IMG_3318 - City of Bolivar, Missouri","",200,"Welcome to Bolivar - Where Liberty Flows - City of Bolivar, Missouri","[""IMG_3318""]",[],[],[],[],[],"Skip to content DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us IMG_3318 Home Departments Police Shop with a Cop® IMG_3318 12 Dec 2014 by City Administrator WordPress Theme - Total by HashThemes DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us IMG_3318 Home Departments Police Shop with a Cop® IMG_3318 12 Dec 2014 by City Administrator IMG_3318 Home Departments Police Shop with a Cop® IMG_3318 IMG_3318 Home Departments Police Shop with a Cop® IMG_3318 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator WordPress Theme - Total by HashThemes WordPress Theme - Total by HashThemes WordPress Theme - Total by HashThemes " -1955,https://www.farmingtonmn.gov/government/departments/police/staff_directory,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1956,https://delcopa.gov/vote/pdf/2021/delco-boe_legal-notice_public-meeting_9-20-2021.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1957,https://www.panynj.gov/police/en/about/leadership.html,Personnel Records,Info About Officers,Leadership,"",200,We Keep the Region Moving | Port Authority of New York and New Jersey,[],[],[],[],[],[],"" -1958,https://rexburg.us/police-investigating-road-rage-after-man-killed-in-box-elder-county-rollover-thursday/,Poor Data Source,Poor Data Source,"","",522,"","","","","","","","" -1959,https://cheswold.delaware.gov/cheswold-police-department-policy-and-procedure-manual/directive-10-2-43-naloxone-programs/,Policies & Contracts,Info About Agencies,Directive 10-2-43 Naloxone Programs - Town of Cheswold,"",200,"Home - Town of Cheswold - Kent County, Delaware","[""Cheswold""]","[""Delaware"", ""Directive 10-2-43 Naloxone Programs""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[],"Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Cheswold Delaware Listen Directive 10-2-43 Naloxone Programs Directive 10-2-43 Naloxone Programs Cheswold Delaware Listen Directive 10-2-43 Naloxone Programs Directive 10-2-43 Naloxone Programs Listen Directive 10-2-43 Naloxone Programs Directive 10-2-43 Naloxone Programs Listen Directive 10-2-43 Naloxone Programs Directive 10-2-43 Naloxone Programs Listen Directive 10-2-43 Naloxone Programs Directive 10-2-43 Naloxone Programs Listen Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form " -1960,https://policing.cityofpleasantonca.gov/police-department-faqs/,Resources,Agency-Published Resources,Police Department FAQs | Policing in Pleasanton,"",200,Policing in Pleasanton |,"[""Police Department FAQs""]",[],"[""Submit a Comment Cancel reply""]",[],[],[],"Advisory Board FAQs Contact Us Department Budget Hiring Structure Training Policies Use of Force Programs 21st Century Policing Annual Reports Calls for Service Select Page Advisory Board FAQs Contact Us Department Budget Hiring Structure Training Policies Use of Force Programs 21st Century Policing Annual Reports Calls for Service Police Department FAQs by seanpwelch90 | Jul 31, 2020 | Uncategorized | 0 comments Submit a Comment Cancel reply Your email address will not be published. Required fields are marked * Comment * Name * Email * Website Save my name, email, and website in this browser for the next time I comment. Pleasanton Police Department Administration Hours – Lobby open 24 hours a day 4833 Bernal Avenue PO Box 909, Pleasanton, CA 94566 (925) 931-5100 Police Non-Emergency Number (925) 931-5122 Police Emergency Number Can’t find what you are looking for? Please contact us . Advisory Board FAQs Contact Us Department Budget Hiring Structure Training Policies Use of Force Programs 21st Century Policing Annual Reports Calls for Service Select Page Advisory Board FAQs Contact Us Department Budget Hiring Structure Training Policies Use of Force Programs 21st Century Policing Annual Reports Calls for Service Advisory Board FAQs Contact Us Department Budget Hiring Structure Training Policies Use of Force Programs 21st Century Policing Annual Reports Calls for Service Select Page Advisory Board FAQs Contact Us Department Budget Hiring Structure Training Policies Use of Force Programs 21st Century Policing Annual Reports Calls for Service Select Page Advisory Board FAQs Contact Us Department Budget Hiring Structure Training Policies Use of Force Programs 21st Century Policing Annual Reports Calls for Service Select Page Advisory Board FAQs Contact Us Department Budget Hiring Structure Training Policies Use of Force Programs 21st Century Policing Annual Reports Calls for Service Police Department FAQs by seanpwelch90 | Jul 31, 2020 | Uncategorized | 0 comments Submit a Comment Cancel reply Your email address will not be published. Required fields are marked * Comment * Name * Email * Website Save my name, email, and website in this browser for the next time I comment. Pleasanton Police Department Administration Hours – Lobby open 24 hours a day 4833 Bernal Avenue PO Box 909, Pleasanton, CA 94566 (925) 931-5100 Police Non-Emergency Number (925) 931-5122 Police Emergency Number Can’t find what you are looking for? Please contact us . Police Department FAQs by seanpwelch90 | Jul 31, 2020 | Uncategorized | 0 comments Submit a Comment Cancel reply Your email address will not be published. Required fields are marked * Comment * Name * Email * Website Save my name, email, and website in this browser for the next time I comment. Police Department FAQs by seanpwelch90 | Jul 31, 2020 | Uncategorized | 0 comments Submit a Comment Cancel reply Your email address will not be published. Required fields are marked * Comment * Name * Email * Website Save my name, email, and website in this browser for the next time I comment. " -1961,https://delcopa.gov/health/pdf/agendaminutes/bohagenda_jan_6_22.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1962,https://alpha.austin.gov/en/police-oversight/bwc-dmav-the-role-of-vendors-and-community-input-in-policy/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1963,https://champaignil.gov/tag/champaign-police-arrest-kidnapping-suspect/,Media Bulletins,Agency-Published Resources,Champaign Police Arrest Kidnapping Suspect Archives - City of Champaign,"",200,403 Forbidden,"[""Items tagged: Champaign Police Arrest Kidnapping Suspect""]","[""Champaign Police Arrest Kidnapping Suspect"", ""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Items tagged: Champaign Police Arrest Kidnapping Suspect Search Champaign Police Arrest Kidnapping Suspect Posted: February 8, 2019 Today, at approximately 1:50 p.m., Champaign Police arrested 32-year-old Robert D. Jackson in connection with the reported kidnapping of a 21-year-old female victim. The preliminary information reveals that on February 7, 2019, at approximately 1:38 a.m. at the Circle K Gas Station on N Prospect Avenue, Jackson requested a ride from the victim, who accepted. […] Categories: Police Department Press Releases | Tags: Champaign Police Arrest Kidnapping Suspect , Danville , Robert D. Jackson , Tilton Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works " -1964,https://delcopa.gov/hcd/cdbg.html,Not Criminal Justice Related,Not Criminal Justice Related,CDBG Program,"",200,"Delaware County, Pennsylvania","[""CDBG Program""]",[],"[""Housing & Community Development Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -1965,https://delcopa.gov/ich/pdfs/covid_govwolf_medicaidchip.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -1966,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0328/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1967,http://www.longbeach.gov/police/press-releases/murder-31-/,Media Bulletins,Agency-Published Resources,MURDER(31),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 8/19/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MURDER Contact: Media Relations (562) 570-5273 On Tuesday, August 18, 2015, at approximately 9:11 P.M., officers responded to the 1100 block of E. 10th Street in regards to reports of a battery that had just occurred. When the officers arrived they learned a male adult victim had been struck with a bottle during a fight with another male adult subject. The victim was transported to a local hospital in critical condition. At approximately 3:00 a.m. this morning the victim succumbed to his injuries and was pronounced deceased. The motive for the fight is still under investigation. We are withholding the identity of the victim pending notification to next of kin by the Los Angeles County Coroner’s Office. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detectives Malcolm Evans and Mark Bigel at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1968,https://www.knoxvilletn.gov/government/boards_commissions/police_advisory_review_committee_parc/p_a_r_c_20th_anniversary/history_of_p_a_r_c___p_d_f_,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1969,http://www.longbeach.gov/police/press-releases/arrest-made-in-2007-murder-case/,Media Bulletins,Agency-Published Resources,ARREST MADE IN 2007 MURDER CASE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/4/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: ARREST MADE IN 2007 MURDER CASE Contact: Media Relations Detail (562) 570-5273 On February 27, 2014, Long Beach Homicide Detectives arrested - 28-year-old Darnell Clarke of Long Beach for the murder of Alfred Henderson and - attempted murder of his female companion. In the early morning - hours of April 22, 2007, Alfred Henderson and his female companion were gunned - down while talking in front of a relative’s house, in the 2000 block of Lime - Avenue. The surviving female victim was transported to a local hospital and -was treated for several gunshot wounds. Victim Henderson, a Long Beach -resident, did not survive his injuries. On March 3, 2014, the Los -Angeles County District Attorney's Office filed one count of murder, one count -of attempted murder, a gang allegation enhancement (186.22 PC), as well as a -use of a firearm enhancement. Anyone with additional information -regarding this case is urged to contact Long Beach Police Homicide Detectives -Teryl Hubert and Sean Irving at 562 570-7244. Anyone wishing to remain -anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 -(CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1970,https://www.southamptontownnypolice.gov/1056/xeriscaping,Not Criminal Justice Related,Not Criminal Justice Related,"Xeriscaping | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Xeriscaping""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -1971,http://www.longbeach.gov/police/press-releases/update---companion-dog-taken-in-vehicle-theft/,Media Bulletins,Agency-Published Resources,UPDATE - COMPANION DOG TAKEN IN VEHICLE THEFT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/15/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: *UPDATE* - COMPANION DOG TAKEN IN VEHICLE THEFT Contact: Media Relations Detail (562) 570-5273 MISSING DOG ""SANDY""                 SUSPECT VEHICLE (Click on a photo to enlarge) UPDATE : The victim's vehicle in this case (bronze 1985 Nissan Maxima) has been located.  The vehicle was recovered by Lakewood Sheriff's in a shopping center parking lot near Artesia Boulevard & Lakewood Boulevard and has been returned to the owner. There was no sign of Sandy in the vehicle.  The suspect vehicle, a white full-size extended cab construction truck, CA license plate 5RIA079, remains outstanding. ************************************************* Original Release: The Long Beach Police Department is asking for the public's help in locating a stolen vehicle and a companion dog that was inside the vehicle at the time it was taken. On Tuesday, January 13, 2015, at approximately 6:30 p.m., a woman and her daughter parked their bronze 1985 Nissan Maxima, CA license plate 5RIA079, in a shopping center parking lot on the southeast corner of Cherry Avenue and 68th Street in Long Beach and entered the store.  When they returned moments later, the vehicle was missing and they called police. Detectives were able to view video footage in the area and learned that shortly after the vehicle was left, a white full-size extended cab construction truck parked next to the Maxima.  A passenger in the truck got out, entered the Maxima, and drove off with the dog in the back seat. The truck followed the Maxima and both vehicles left the area. It is possible the thief was unaware of the dog’s presence. The dog, a tan and white male Chihuahua mix named ""Sandy"" is a companion dog to the victim’s daughter.  She relies on Sandy to provide her comfort due to her medical condition.  The loss of Sandy is exacerbating her condition, and his return is important to her well-being.  Sandy was wearing a metal chain type collar, but did not have an identification tag or identification chip.  Animal Care Services has been informed to be on the lookout for Sandy. Anyone with information regarding this incident or on the whereabouts of Sandy or the vehicle is asked to contact Long Beach Police Auto Theft Corporal Joe Starbird at (562) 570-7364.  Anyone locating Sandy should contact Animal Care Services at (562) 570-7387. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1972,https://delcopa.gov/vote/pdf/2022/2022primary-electiondayguidedigitaleditionv-rev1.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -1973,https://dccouncil.gov/judiciary-public-safety/copy-of-ag0_fy19_-attachment-iv/,Annual & Monthly Reports,Info About Agencies,Copy of AG0_FY19_ Attachment IV • Council of the District of Columbia,"",200,Home • Council of the District of Columbia,"[""Copy of AG0_FY19_ Attachment IV""]",[],[],[],[],[],"Federal Tax Counter: $1,298,500,957 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Federal Tax Counter: $1,298,500,957 What is this? Get Updates RSS Press Center facebook twitter youtube Federal Tax Counter: $1,298,500,957 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Council of the District of Columbia Copy of AG0_FY19_ Attachment IV October 10, 2018 Loading... Copy of AG0_FY19_ Attachment IV October 10, 2018 Loading... Loading... Loading... DC Council seal About the Council Open Government Register to Vote Council Updates Jobs Council Directory Privacy Policy Commemorative D.C. Flag Program Ethics Visit the Wilson Building facebook twitter youtube Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Search facebook twitter youtube Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate " -1974,http://www.longbeach.gov/police/press-releases/undetermined-deaths--possibly-related-to-carbon-monoxide-poisoning/,Media Bulletins,Agency-Published Resources,UNDETERMINED DEATHS; POSSIBLY RELATED TO CARBON MONOXIDE POISONING,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/13/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: UNDETERMINED DEATHS; POSSIBLY RELATED TO CARBON MONOXIDE POISONING Contact: Media Relations Detail (562) 570-5273 On Monday, January 12, 2015, at approximately 6:50 p.m., Long Beach Police were dispatched to an apartment complex in the 1100 block of Gardenia Avenue in regards to a foul odor emitting from one of the units, and ultimately located three deceased subjects. Officers arrived at the location and found one female and two male adult subjects inside the apartment unit. They also located a large propane heater inside the unit it appeared the occupants were using for warmth. Although the cause of death is unknown and will be officially determined by the Los Angeles County Coroner's Office, it is possible their deaths are related to carbon monoxide poisoning. These types of heaters are not intended for indoor use and can produce deadly levels of carbon monoxide if the area is not adequately ventilated. The identities of the individuals will also be determined by the Coroner’s office and will be released pending notification of next of kin. The relationship between the occupants is unknown and the investigation remains ongoing. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1975,https://www.cityofladue-mo.gov/departments/police-department/annual-reports-158,Annual & Monthly Reports,Info About Agencies,"","",404,"","","","","","","","" -1976,"https://norfolkne.gov/government/departments/police-division/press-releases/march-4,-2021-press-release.html",Media Bulletins,Agency-Published Resources,"March 4, 2021 Press Release - City of Norfolk, NE","",200,"Welcome to Norfolk, NE - City of Norfolk, NE","[""City of Norfolk, NE"", ""Police Division"", ""March 4, 2021 Press Release"", ""City of Norfolk, NE""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]","" -1977,http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested--charges-filed/,Media Bulletins,Agency-Published Resources,ROBBERY SUSPECT ARRESTED; CHARGES FILED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/4/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: ROBBERY SUSPECT ARRESTED; CHARGES FILED Contact: Media Relations Detail (562) 570-5273 On June 4, 2015, felony charges were filed against a 20-year-old Carson man in connection with a robbery to a taxi cab driver. On May 29, 2015, around 8:45 p.m., Long Beach Police were dispatched to a strong arm robbery in the 100 block of Pine Avenue. Their preliminary investigation indicated that a taxi cab driver was waiting for a fare and in the midst of speaking to the customer, the customer became upset and demanded the driver’s property. The customer grabbed the taxi cab driver’s cell phone and fled on foot. Fortunately, the taxi driver was not injured during the altercation. Through their investigation, Robbery detectives learned the customer had re-contacted the victim, wanting to sell the taxi cab driver’s property back to him. On Tuesday, June 2, 2015, the suspect agreed to meet with the victim and was arrested by undercover detectives. The suspect was found to be in possession of a dirk or dagger and had an outstanding narcotic warrant for his arrest. The case was presented to the Los Angeles County District Attorney’s Office. The District Attorney’s Office filed one count of robbery and one count of possession of a dirk or dagger against Brandon Russell Junior. He remains in Long Beach City Jail without bail. Anyone with information regarding this investigation is encouraged to call Long Beach Police Robbery Detective Ben Vargas at (562) 570-5538. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1978,https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-and-courtesy-13/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1980,http://www.longbeach.gov/police/press-releases/traffic-fatality---long-beach-blvd.--cambridge-st/,Media Bulletins,Agency-Published Resources,Traffic Fatality - Long Beach Blvd. & Cambridge St.,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/28/2017 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY - LONG BEACH BOULEVARD & CAMBRIDGE STREET Contact: Media Relations Detail (562) 570-5273 On Monday, November 27, 2017, at approximately 5:15 p.m., officers were dispatched to the intersection of Long Beach Boulevard and Cambridge Street regarding a vehicle versus pedestrian injury traffic collision, which resulted in the death of the pedestrian. Upon arrival officers found an elderly male pedestrian on Long Beach Boulevard north of Cambridge Street with life-threatening injuries. Long Beach Fire Department responded and transported the pedestrian to a local hospital, where he was later pronounced deceased. The preliminary investigation revealed the pedestrian was attempting to cross Long Beach Blvd., eastbound through a raised center median with vegetation, when he stepped out into the #1 lane of northbound Long Beach Blvd., when he was struck by a 2003 Mercury Grand Marquis driven by a 68-year-old male resident of Los Angeles. The pedestrian was outside of a crosswalk when he entered the northbound #1 lane of Long Beach Blvd. The driver of the vehicle remained at the scene and cooperated with the investigation. He was later released pending further investigation. The victim is only being identified as a 73-year-old resident of Los Angeles, pending notification of next of kin. Anyone who may have information regarding this incident is asked to call Long Beach Police Department Collision Investigation Detail Detective Sirilo Garcia at (562) 570-7355. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1981,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/071421blotter.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -1982,http://www.longbeach.gov/police/press-releases/halloween-safety-tips-1-/,Media Bulletins,Agency-Published Resources,Halloween Safety Tips(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/23/2015 FOR IMMEDIATE RELEASE Press Release # Subject: HALLOWEEN SAFETY TIPS Contact: Media Relations (562) 570-5273 The Long Beach Police Department would like to encourage community members to practice the following safety tips to help ensure a fun and safe Halloween: Be sure your child’s activities are age-appropriate All children should be accompanied by an adult Only visit homes that are well-lighted and never go into a stranger’s house Stay on the sidewalk and only cross at corners Stay in well populated areas and never cut through alleys or parks Apply reflective tape to your child’s costume or use glow sticks for better visibility Use face paint rather than masks that may block your child’s vision Map out your route ahead of time and carry a flash light with you Ensure tips of any props (pitchfork, sword, etc.) your child is carrying are smooth Be cautious of animals and keep your pet(s) indoors Inspect your child’s candy before allowing them to eat it Report any suspicious or illegal activity by calling 9-1-1 immediately Motorists are advised to be extra cautious on Halloween night and to drive slowly Do not drink and drive; plan ahead and designate a driver or call for a ride Reminder: The curfew law in Long Beach prohibits anyone 17-years-old or younger from being out past 10:00 p.m. without a parent/guardian, unless going to or returning home from work or an organized event supervised by an adult, without any detour or stop. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1983,https://www.ashevillenc.gov/wp-content/uploads/2016/08/citizens-police-academy.jpg,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1984,https://www.lyndhurstohio.gov/police-crime-prevention-run-hide-fight.html,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1985,https://www.hayward-ca.gov/discover/news/feb19/applicants-sought-new-police-community-advisory-panel,Training & Hiring Info,Info About Officers,Applicants sought for new police Community Advisory Panel | City of Hayward - Official website,Hayward residents interested in serving on a new Community Advisory Panel to the Hayward Chief of Police are invited to submit applications for consideration and potential selection.The purpose of the Community Advisory Panel is to improve trust and strengthen understanding between the Hayward Police Department and Hayward community members by creating a structure and venue,200,City of Hayward - Official website,"[""Applicants sought for new police Community Advisory Panel""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form"", ""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment""]",[],"[""Do you need help paying energy bills? You may qualify for federal aid."", ""Hayward Receives Grant for Safe Routes to Schools Infrastructure and Bicycle Incentives"", ""Hayward Celebrates Earth Day at Weekes Park!"", ""Spring 2024 Compost Giveaway"", ""Sustainable Solutions for Celebrating Easter"", ""City Hall and Nonessential Services Closure: Monday, Apr. 01, 2024"", ""Presidential Primary Election: Tuesday, Mar. 5, 2024"", ""Library Closure: February 12 and February 19, 2024."", ""City Hall and Nonessential Services Closures: Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""YOU ARE HERE. SO IS EVERYTHING ELSE."", ""Related News"", ""Annual Citywide Earth Day Clean-Up and Community Fair—Saturday, April 20"", ""City of Hayward is celebrating Black History Month"", ""Entries being accepted for annual Earth Day Poster & Writing Contest until March 15"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],Skip to main content -1986,https://southamptontownnypolice.gov/169/parent-resources,Resources,Agency-Published Resources,"Parent Resources | Southampton, NY - Official Website",Find valuable parenting resources through the Youth Bureau.,200,"Police | Southampton, NY - Official Website","[""Parent Resources""]","[""Parents with a Purpose Resources"", ""Preventing Youth Drug Use"", ""Teen Drinking Information""]","[""Site Tools"", ""Contact Us"", """", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Housing and Community Services Youth Bureau Resource Pages Parent Resources Parent Resources Parents with a Purpose Resources CDC Underage Drinking Fact Sheet Connect with Kids Families Together in New York State KidsHealth.org Macaroni Kid National Alliance on Mental Illness National Association for Self-Esteem Office of Children and Family Services Parent Further Suffolk County Coalition Against Domestic Violence Teaching Tolerance Preventing Youth Drug Use Our goal is to provide the Southampton community with information related to mutual, common family issues such as: bullying, cultural diversity, domestic violence, parenting, self-esteem, substance / prescription medication excess, and underage drinking. It is our belief that through knowledge, resources, and programs we will create an environment that protects our children, promotes healthy families, and empowers individuals to take control of their lives. Below you will find valuable resources to support this mission: A Parent’s Guide to the Teen Brain DEA’s Launch of GetSmartAboutDrugs.com Parents: The Anti-Drug Medicine Cabinet Safety Parents Empowered SAMHSA STOP Underage Drinking The Parent Toolkit Time to Act Teen Drinking Information Medical Impact of Underage Drinking (PDF) Parent Leadership Initiative (PDF) Parent Tips on Underage Drinking (PDF) Underage Drinking Fact Sheet (PDF) Underage Drinking Laws (PDF) Contact Us DAVID W. CROHAN COMMUNITY CENTER (Lower Level) 655 Flanders Rd, Flanders, NY 11901 Ph: 631-702-2425 Tracy Kolsin, LCSW Youth Services Coordinator Staff Directory Join Our Mailing List Bullying Resources Vaping and E-Cigarettes TEENS Vaping and E-Cigarette VIDEOS PARENTS - PARENTS - Vaping and E-cigarettes Parent Resources Teen Resources Community Service Guide Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -1987,https://www.mass.gov/doc/essential-functions-of-a-police-officer/download,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -1989,https://www.jacksonms.gov/meetings/bid-opening-jpd-november-30-2021/jpd-rfp-catering-services-for-the-city-of-jackson-police-training-academy/,Not Criminal Justice Related,Not Criminal Justice Related,"JPD RFP-Catering Services for The City of Jackson-Police Training Academy - Jackson, MS","",200,"City of Jackson - Jackson, MS","[""JPD RFP-Catering Services for The City of Jackson-Police Training Academy""]","[""Primary menu links"", ""Action toolbar"", ""Recent news"", ""Contact"", ""Subscribe"", ""Connect""]","[""Beasley Road Bride Closure"", ""Statement from Mayor Lumumba on passage of garbage contract"", ""Jackson Selected for Bloomberg American Sustainable Cities Initiative"", ""Mayor Lumumba releases recommended RFP bid for garbage collection contract"", ""City Announces Redesigned, Updated JTRAN Network""]",[],"[""""]",[],"Jackson, MS Primary menu links Residents Businesses Visitors Government News Contact Action toolbar Answers Payments Report Issue Search Primary menu links Residents Businesses Visitors Government News Contact Action toolbar Answers Payments Report Issue Search Jackson, MS Jackson, MS Jackson, MS Proclamation of Local Emergency ___________________________________________________________________________________________________________________________________ The City of Jackson’s Water and Sewer Business Administration is now JXN Water. Click here . _____________________________________________________________________________________________________________________________________ PEG Network Off-Air Announcement: PEG Network is currently off the air as we undergo a relocation. We appreciate your patience during this transition. In the meantime, you can stay connected with PEG Network here or visit our YouTube channel at www.youtube.com/@JacksonPEGNetwork JPD RFP-Catering Services for The City of Jackson-Police Training Academy Posted on November 16, 2021 Recent news Beasley Road Bride Closure Posted on March 21, 2024 Statement from Mayor Lumumba on passage of garbage contract Posted on March 19, 2024 Jackson Selected for Bloomberg American Sustainable Cities Initiative Posted on March 19, 2024 Mayor Lumumba releases recommended RFP bid for garbage collection contract Posted on March 13, 2024 City Announces Redesigned, Updated JTRAN Network Posted on March 5, 2024 All news » JPD RFP-Catering Services for The City of Jackson-Police Training Academy Posted on November 16, 2021 Recent news Beasley Road Bride Closure Posted on March 21, 2024 Statement from Mayor Lumumba on passage of garbage contract Posted on March 19, 2024 Jackson Selected for Bloomberg American Sustainable Cities Initiative Posted on March 19, 2024 Mayor Lumumba releases recommended RFP bid for garbage collection contract Posted on March 13, 2024 City Announces Redesigned, Updated JTRAN Network Posted on March 5, 2024 All news » Recent news Beasley Road Bride Closure Posted on March 21, 2024 Statement from Mayor Lumumba on passage of garbage contract Posted on March 19, 2024 Jackson Selected for Bloomberg American Sustainable Cities Initiative Posted on March 19, 2024 Mayor Lumumba releases recommended RFP bid for garbage collection contract Posted on March 13, 2024 City Announces Redesigned, Updated JTRAN Network Posted on March 5, 2024 All news » Recent news Beasley Road Bride Closure Posted on March 21, 2024 Statement from Mayor Lumumba on passage of garbage contract Posted on March 19, 2024 Jackson Selected for Bloomberg American Sustainable Cities Initiative Posted on March 19, 2024 Mayor Lumumba releases recommended RFP bid for garbage collection contract Posted on March 13, 2024 City Announces Redesigned, Updated JTRAN Network Posted on March 5, 2024 All news » " -1990,https://www.stpaul.gov/departments/police/21st-century-policing-report/pillar-2-policy-and-oversight/report-0,List of Data Sources,Info About Agencies,Report Recommendation 2.2 | Saint Paul Minnesota,"Ensure comprehensive policies on the use of force that include training, investigations, prosecutions, data collection, and information sharing that are clear, concise, and openly available for public inspection.",200,Home | Saint Paul Minnesota,"[""Report Recommendation 2.2""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Footer""]","[""You are using an unsupported browser. Please use Microsoft Edge."", ""SPPD has comprehensive use-of-force policies"", ""SPPD posts interactive policies online"", ""SPPD emphasizes minimal force"", ""SPPD regularly trains use of force"", ""SPPD is committed to crisis intervention training"", ""SPPD is investing in training"", ""SPPD is committed to community safety"", ""SPPD is committed to transparency"", ""SPPD is committed to transparency"", ""SPPD is committed to transparency"", ""SPPD is committed to transparency"", ""SPPD is committed to transparency"", ""SPPD is committed to transparency"", ""SPPD is committed to transparency"", ""SPPD reviews all uses of force"", ""SPPD is committed to excellence"", ""Contact The City"", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured"", ""Reference Data"", ""Reference Data"", ""Reference Data"", ""Reference Data"", ""Reference Data"", ""Reference Data"", ""Reference Data"", ""Reference Data"", ""Reference Data""]",[],[],"" -1991,https://delcopa.gov/publicrelations/releases/2020/pdf/citizencorptrainingaug27.pdf,Media Bulletins,Agency-Published Resources,"","",200,"","","","","","","","" -1992,http://www.longbeach.gov/police/press-releases/l.b.p.d.-seizes-large-quantity-of-fireworks/,Media Bulletins,Agency-Published Resources,L.B.P.D. SEIZES LARGE QUANTITY OF FIREWORKS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/21/2018 FOR IMMEDIATE RELEASE Press Release # Subject: L.B.P.D. SEIZES LARGE QUANTITY OF FIREWORKS Contact: Media Relations (562) 570-5273 VIEW THE VIDEO On Wednesday, June 20, 2018, at approx. 4:00 p.m., through a firework enforcement investigation, Long Beach Police detectives located several thousand pounds of illegal high-powered fireworks worth a quarter of a million dollars, and detained two individuals. Detectives conducting an investigation into the illegal possession and sales of fireworks in East Long Beach, which led them to two storage facilities in the Cities of Pico Rivera and Santa Fe Springs. Search warrants were served at both locations, where an excessive amount of illegal fireworks were located. Several thousand pounds of fireworks were confiscated from the storage facilities, with a street value of approximately $250,000. The Long Beach Fire Investigations Team and the Bureau of Alcohol, Tobacco, Firearms, and Explosives (ATF) Arson Unit Task Force also responded to the scene to assist, and took possession of the fireworks for safe disposal through the State Fire Marshal’s Office. An 82-year-old man from Paramount and a 54-year-old man from West Covina were both detained, and may be facing felony charges pending further investigation. The Long Beach Police and Fire Departments will continue to enforce the laws pertaining to the possession and sales of fireworks, which are illegal in the City of Long Beach. We will be out in force in the days leading up to, and on July 4th, to ensure compliance with the Long Beach City Ordinance that bans ALL fireworks, including those deemed “Safe and Sane.” Anyone found in violation of the city ordinance may be cited and/or arrested. Those found in violation may face a $1,000 fine, sentenced to six months in jail, or both. The fines and penalties may increase depending on the fireworks’ classification. Fireworks may be voluntarily disposed of at collection bins located at all fire stations, or at Lifeguard Headquarters, located at 2100 E. Ocean Boulevard (west side of the Junipero lot), from 8am to 8pm. If you or your neighbor would like post flyers or posters at your home or business, they can be picked-up at Fire Headquarters (3205 Lakewood Blvd.) until July 3rd, from 7:00 a.m. to 4:00 p.m., or at the Neighborhood Resource Center (100 W. Broadway, Suite 550) until July 3rd, from 8:00 a.m. to 5:00 p.m. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1993,https://www.coppelltx.gov/217/emergency-notification-system-notifycopp,Resources,Agency-Published Resources,"Emergency Notification System (NotifyCoppell) | Coppell, TX",Learn about the NotifyCoppell system and what you receive when you sign up for it. ,200,"Coppell, TX | Official Website","[""Emergency Notification System (NotifyCoppell)""]","[""Fire Station #1"", ""Fire Station #2"", ""Fire Station #3"", ""Fire Station #4""]","[""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search How Do I? Fire Prevention Emergency Management Life Safety Park About Us City Home Home Government City Departments Fire Department Emergency Management Mass Notification Emergency Notification System (NotifyCoppell) Emergency Notification System (NotifyCoppell) Receive alerts about emergencies and other important community news by signing up for NotifyCoppell , an Everbridge system. This system enables us to provide you with critical information quickly in a variety of situations, such as severe weather (with optional opt-in notifications for a variety of advisories, watches and warnings ), unexpected road closures, missing persons, and evacuations of buildings or neighborhoods. You will receive time-sensitive messages wherever you specify, such as your home, mobile or business phones, email address, text messages, and more. You pick where, you pick how. We recommend you include a cell phone number capable of receiving SMS text messages, as well as email addresses as less invasive ways to receive non-emergency messages. If you no longer wish to receive messages from NotifyCoppell but are unable to access your account, please submit a request to unsubscribe . Emergency Notification System (NotifyCoppell) NOAA All-Hazards Weather Radio​ ​​​​​​​Smartphone Applications Wireless Emergency Alerts System Contact Us Services EMS Report Medical Billing Fire Incident Report Notify Coppell Fire Administration 265 Parkway Boulevard P.O. Box 9478 Coppell, TX 75019 Life Safety Park 820 South Coppell Road Coppell, TX 75019 Mon-Fri, 7:00 am - 4:00 pm  Phone: 972-304-3512 Fax: 972-745-4517 Email Fire Station #1 520 Southwestern Boulevard Coppell, TX 75019 Fire Station #2 366 South MacArthur Boulevard Coppell, TX 75019 Fire Station #3 133 Parkway Boulevard Coppell, TX 75019 Fire Station #4 440 Northpoint Drive Coppell, TX 75019 To report an emergency situation, call 9-1-1 . To report an arson or suspected arson, call the Fire Marshal's Office at 972-304-7055 . For non-emergency requests, call non-emergency dispatch 24 hours at 469-289-3270 . You can also contact non-emergency dispatch by dialing *247 from your cellular phone. Government Websites by CivicPlus® " -1994,https://www.sandiego.gov/police/news-center/cold-cases/frank-lee-foust,Media Bulletins,Agency-Published Resources,Frank Lee Foust | City of San Diego Official Website,"Officers were called to the scene after the building manager checked on an occupant and found him dead. The tenant had been shot at close range with a small caliber handgun. According to other tenants and the manager, the victim was last seen alive two days prior to being found. The victim was a 35-year-old black male who worked as a welder, and was a self employed artist. The victim's wallet and personal property were not taken. There is no known motive for the crime.",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""Cold Case: Frank Lee Foust""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""News Center"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -1995,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-results/,Media Bulletins,Agency-Published Resources,DUI SATURATION PATROL RESULTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/24/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: LONG BEACH POLICE DUI SATURATION PATROL PROVES EFFECTIVE Contact: Media Relations Detail (562) 570-5273 On Saturday January 18, 2014, the Long Beach Police Department’s Traffic Section conducted a Driving Under the Influence (DUI) Saturation Patrol from 7:00 p.m. until 3:00 a.m. During the eight-hour operation, motor officers patrolled throughout the city looking for impaired drivers and took the following enforcement actions: Made five (5) DUI arrests Issued two (2) misdemeanor citations for suspended licenses Impounded two (2) vehicles for drivers having a suspended license After falling dramatically for five straight years, figures for 2012 show an increase to 802 deaths because someone failed to designate a sober driver. Over the course of the past three years, DUI collisions have claimed nine lives and resulted in 315 injury crashes, harming 420 of our friends and neighbors. Driving under the influence can impact the economy in addition to the pain and suffering of those immediately affected. Conservatively, a fatality has a $1.4 million impact, an injury $70,000, and a crash that only damages property averages nearly $9,000. Funding for this program is from a California Office of Traffic Safety grant through the National Highway Traffic Safety Administration. Report Drunk Drivers, Call 911! This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -1996,http://www.lafayettepolice.us/2356/photos,Not Criminal Justice Related,Not Criminal Justice Related,"Photos | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Photos""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency CustomLinks_21 Photos Photos Blue Heart - Home Photos Spotlight Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency CustomLinks_21 Photos Photos Blue Heart - Home Photos Spotlight Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency CustomLinks_21 Photos Photos Blue Heart - Home Photos Spotlight Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Search Government Services Our Community Business & Development How Do I... Transparency CustomLinks_21 Photos Photos Blue Heart - Home Photos Spotlight Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Search Government Services Our Community Business & Development How Do I... Transparency Search Search Search Search Search Search Search Search " -1997,https://wyomingohio.gov/departments/police-department-2/coyote-information/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -1998,http://www.longbeach.gov/police/press-releases/l-b-p-d--seeks-public-s-help-in-robbery-being-investigated-as-hate-crime/,Media Bulletins,Agency-Published Resources,L.B.P.D. SEEKS PUBLIC'S HELP IN ROBBERY BEING INVESTIGATED AS HATE CRIME,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -1999,https://alpha.austin.gov/es/police-oversight/formal-complaint-acts-bringing-discredit-upon-the-department/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2000,https://www.roundrocktexas.gov/news/police-looking-witnesses-fatal-collision/,Media Bulletins,Agency-Published Resources,Police looking for witnesses to fatal collision - City of Round Rock,"",200,403 Forbidden,[],[],"[""Police looking for witnesses to fatal collision""]","[""Site Search"", ""Follow Us""]",[],[],"" -2001,https://champaignil.gov/2015/03/02/champaign-police-investigate-downtown-shooting/,Media Bulletins,Agency-Published Resources,Champaign Police Investigate Downtown Shooting - City of Champaign,"",200,403 Forbidden,"[""Champaign Police Investigate Downtown Shooting""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Champaign Police Investigate Downtown Shooting Search Posted on March 2, 2015 On February 28th at 2:33AM, Champaign Police responded to a call for a fight that occurred in a parking lot, north of the High Dive Bar. As officers approached the scene, the crowd began to disperse.  At 2:36AM , officers reported hearing a shot.  A 22 year-old male victim was located with a gunshot wound and was transported to Carle Hospital for treatment.  Several vehicles were seen fleeing the scene and were stopped by the Champaign Police Department for further investigation . There currently is no one in custody for this shooting. Investigators believe that there may have been witnesses to this shooting and ask that anyone with information, photographs or video of this incident contact the Champaign Police at 217-351-4545 .  It is critical that our citizens and police work together to ensure we have safer neighborhoods and safer communities. In addition, any information can be provided anonymously through Crime Stoppers at (217) 373-8477 (TIPS). Anonymous tips can also be submitted online to Crime Stoppers at www.373tips.com or by texting the following: CCTIP plus their information to 274637 (CRIMES). Crime Stoppers will pay a reward of up to $1,000 for information leading to the arrest of the person(s) responsible for this crime. Categories: Police Department Press Releases Tags: Champaign , Downtown , High Dive , investigate , police , Shooting Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy Powered by Translate City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs " -2002,http://www.longbeach.gov/police/press-releases/murder-6700-block-gardenia/,Media Bulletins,Agency-Published Resources,MURDER 6700 BLOCK GARDENIA,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/13/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Monday, September 12, 2016, at approximately 9:50 a.m., Long Beach Police were dispatched to assist Long Beach Fire Department personnel with a deceased individual, at a residence in the 6700 block of Gardenia Avenue. Arriving officers found a female adult who sustained injuries to her upper body. Homicide detectives also responded to begin their investigation. The Los Angeles County Coroner will make positive identification and notify next of kin. A motive is unknown and no suspect information is available at this time. The investigation remains ongoing. Anyone with information regarding this incident is asked to contact Long Beach Police Homicide Detectives Peter Lackovic, Sean Irving, and Oscar Valenzuela at (562) 570-7244. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2003,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0876/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2004,http://www.longbeach.gov/police/press-releases/residential-robbery-suspects-charged/,Media Bulletins,Agency-Published Resources,RESIDENTIAL ROBBERY SUSPECTS CHARGED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/2/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: RESIDENTIAL ROBBERY SUSPECTS CHARGED Contact: Media Relations Detail 562-570-5273 On January 28, 2016 at approximately 2:30 pm officers were dispatched to an apartment in the 500 block of Ximeno Avenue regarding an unknown trouble call. The calling party advised dispatch that he was talking to his roommate on the phone and was told there were subjects in their apartment he did not recognize. The calling party said he could hear yelling and some sort of argument in the background and then the phone was hung-up. He then immediately called the police. Officers arrived at the location within 4 minutes and when they got to the apartment they encountered a residential robbery in progress. Two suspects were immediately arrested without incident. Officers subsequently found the victim in a bedroom, tied up and appeared to have been physically assaulted. The Victim’s loss was recovered and the suspects were booked at the Long Beach jail. The suspects have been identified as 25 year old Louis Wade II and 26 year old Courtney Griffin, both residents of Long Beach. On February 1, 2016 the LA County District Attorney’s office filed three felony counts on each of them; Residential Robbery, Kidnapping to Commit Robbery, and Assault with a Deadly Weapon. They are being held on $1,130,000.00 bail respectively. Anyone with information regarding this incident is encouraged to call the Long Beach Robbery Detail at (562)570-7464. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2005,https://mukilteowa.gov/departments/police/gun-safety-class-scholarship-program/,Resources,Agency-Published Resources,"City of Mukilteo - | Gun Safety Class Scholarship Program - City of Mukilteo","",200,403 Forbidden,"[""Gun Safety Class Scholarship Program""]","[""Sign up for notifications""]","[""Gun Safety Scholarship Program Application""]",[],[],[],COVID-19 Alert - City of Mukilteo Response COVID-19 Alert - City of Mukilteo Response -2006,https://police.birminghamal.gov/command-staff/captain-raymond-hollis-crutchfield/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2007,https://www.arlingtontx.gov/city_hall/departments/police/community/crime_prevention,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2008,http://www.longbeach.gov/police/press-releases/automotive-business-compliance-checks-conducted/,Media Bulletins,Agency-Published Resources,AUTOMOTIVE BUSINESS COMPLIANCE CHECKS CONDUCTED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 8/1/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: AUTOMOTIVE BUSINESS COMPLIANCE CHECKS CONDUCTED Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department’s Detective Division, in cooperation with City of Long Beach’s Business Licensing Division, Code Enforcement Division and Fire inspectors conducted a two day compliance check of businesses that are involved in the selling, storing or repairing of motor vehicles in the Long Beach area. Also assisting with this operation were members of the Los Angeles County Task Force for Regional Auto Theft Prevention (TRAP), National Insurance Crime Bureau (NICB), California Department of Labor, California of Bureau of Automotive Repair (BAR), California Board of Equalization, California Department of Insurance, and California Employment Development Department (EDD). On July 28 and August 1, 2014, detectives inspected nine locations and over 400 vehicles and vehicle components. The purpose of the operation was to locate stolen vehicles and vehicle parts; ensure businesses were in compliance with State and local laws and regulations, as well as operating in a safe manner. During the course of the operation, nine citations were issued for violations that included employee compensation, child labor laws, fire codes, unpermitted construction, operating outside the permitted license, and failure to abide by California State overtime regulations. In addition to the citations, over 18 notices of violations were issued, which require follow-up compliance checks over the next several weeks. In some cases, payroll audits will be conducted by the California State Board of Equalization. In other cases, major Long Beach municipal code violations were discovered, which will require a massive clean up effort for unlicensed businesses operating within residential neighborhoods. The community should be aware that properly licensed businesses that operate within the City of Long Beach will have the appropriate licenses and permits posted in public view at their location. Anyone wishing to report unlawful business practices involving automotive-related businesses should contact the LBPD Auto Theft Detail at (562)570-7362. Unlawful practices may include any business dealings with stolen vehicles or parts, unfair labor practices, operating outside the scope of their permits or operating without licenses in an area not zoned for such use. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2009,https://alpha.austin.gov/es/police-oversight/2020-09-17-7/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2010,https://www.ci.san-bernardino.ca.us/city_hall/police_department/online_services,Resources,Agency-Published Resources,Online Services - City of San Bernardino,"",200,Just a moment...,"[""City of San Bernardino California""]","[""Online Services""]",[],[],[],[],Skip to Content -2011,https://www.foxcrossingwi.gov/departments/police-department/history/30712442_10155740250625958_5846323570807930880_n/,Poor Data Source,Poor Data Source,30712442_10155740250625958_5846323570807930880_n - Fox Crossing Fox Crossing,"",200,Fox Crossing - Bridging the Fox Cities Fox Crossing,[],"[""History » 30712442_10155740250625958_5846323570807930880_n""]",[],[],[],[],"Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing History » 30712442_10155740250625958_5846323570807930880_n This entry was posted on Thursday, September 10th, 2020 at 8:20 am and is filed under . - You can follow any responses to this entry through the RSS 2.0 feed. - - Both comments and pings are currently closed. Comments are closed. Copyright © 2010 - 2024 Fox Crossing, All Rights Reserved. Professional Web Site Design by Sandstone Digital. Disclaimer Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing History » 30712442_10155740250625958_5846323570807930880_n This entry was posted on Thursday, September 10th, 2020 at 8:20 am and is filed under . - You can follow any responses to this entry through the RSS 2.0 feed. - - Both comments and pings are currently closed. Comments are closed. Copyright © 2010 - 2024 Fox Crossing, All Rights Reserved. Professional Web Site Design by Sandstone Digital. Disclaimer " -2012,https://www.mass.gov/doc/riva-albert-v-boston-police-department-related-superior-court-decision-21210/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -2013,https://police.crystalmn.gov/our_city/boards_and_commissions/parks___recreation_commission,Not Criminal Justice Related,Not Criminal Justice Related,Parks and Recreation Commission - City of Crystal,Information related to the City of Crystal Parks & Recreation Commission.,200,Just a moment...,"[""Parks and Recreation Commission""]","[""Recreation Director""]","[""Sign up for a city newsletter or notification."", ""City Hall"", ""Regular Hours:""]","[""Monday - Friday""]",[],[],"" -2014,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0871/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2016,http://lafayettepolice.us/faq.aspx?qid=131,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Are there any districts already in Lafayette?,"",200,"Police Department | Lafayette, IN - Official Website",[],"[""▼ Historic Preservation Commission""]","[""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2017,https://www.mass.gov/doc/berrios-crystal-v-boston-police-department-3316/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -2018,https://www.stmatthewsky.gov/public-works/application-for-employment-current-copy/,Training & Hiring Info,Info About Officers,Application for Employment current - Copy - City of St Matthews,"",200,403 Forbidden,"[""Application for Employment current – Copy""]",[],[],[],[],[],"Facebook Search Menu Home Community About St. Matthews Area Organizations Churches History Lodging Points of Interest Schools Shopping Farmers Markets Library Friends of the Library Citizens Group Louisville Metro Free Public Library Main St. Matthews Eline Library Branch Recreation & Parks Amazing Microscopic Park Photos Arthur K. Draut Park Brown Park Community Park Holzheimer Park Pavilions & Ball Fields St. Matthews Baseball Warwick Park Outstanding Neighbor Seasonal City Events Halloween In Brown Park Light Up St. Matthews Potato Festival Rentals / Reservations City Hall Meeting Rooms The Arterburn Event Venue Government Boards Ethics City Map Codes & Ordinances Communications Contact Us Newsletters Reach Alert Notification LENsAlert (Louisville Emergency Notification System) Departments Alcohol Beverage Control Arborist Business License / Tax City Clerk & Treasurer Code Enforcement IT Communications Occupational Tax Planning & Design Police Property Tax / Real Estate Public Works Signs Solicitation Finance Ad Valorem Audit Budget Expenditures Local / State / Federal Offices & Organization Elected Representatives Jefferson County League of Cities Kentucky League of Cities Voter Registration Mayor & Council About the Mayor Agenda, Minutes City Council Members Standing Committees Ethics Complaint Form Open Records Request Staff Directory Services Police About SMPD Provided Services Events Transparency How Do I… Public Works Electronic Speed Signs Graffiti Green Up / Vehicle Pull Off Leaf Collection Sidewalks Snow Treatment Speed Humps Street Damage / Potholes Tree Planting Resources Ambulance (EMS) Animal Control Driver’s Liscenses Fire Protection District First Hour Grief Response Hazardous Waste Disposal Health Department – Louisville Hospitals Prescription Drug Disposal Public Transportation Bus Routes (TARC) St. Matthews Area Ministries (STMAM) Seniors & Disabled Citizens Utilities Drainage – Surface Waters Electric Company (LG&E) Street Lights Metropolitan Sewer District (MSD) Water Service (Louisville Water Co.) Waste Disposal Go Green Junk Disposal Recycle Program Sanitation Yard Waste – Storm Debris Business Forms Alcohol Application for Rentals Alcohol Beverage Control Basic License Alcohol Beverage Temporary License Arterburn Contract Business License Application Employers Annual Reconciliation Employers Quarterly Report Ethics Complaint Form Facility Alcohol for Rentals Golf Cart / ATV Application Grant Application Form Letter of Compliance Occupational Tax Application Occupational Tax Refund Opens Record Request Form Portable Storage Container Request a Tree Right-of-Way Permit Application Sign Permit Application Solicitation Certificate Application Special Events Application Street Party Petition Tent Permit Application Vehicle Pull Off (VPO) Application Permits Building Golf Cart / ATV Portable Storage Sign Special Events Street Party Tents Walk/Run Events Rentals / Reservations Ball Field – Warwick Park City Hall Meeting Rooms Park Pavilions The Arterburn Event Venue Chamber of St. Matthews Contact Us Select Page Application for Employment current – Copy Application for Employment current - Copy Site Map Contact Us Website Designed and Optimized by: 301 Interactive Marketing Facebook Facebook Search Facebook Search Facebook Search " -2019,https://www.austintexas.gov/page/commend-austin-police-officer,Contact Info & Agency Meta,Info About Agencies,Commend an Austin Police Officer | AustinTexas.gov,"If you want to thank, commend or congratulate an APD officer, please use this form and share your story with us. Thanks for your kind words. They mean a lot to the police officers who serve Austin every day.",200,Home | AustinTexas.gov,"[""Commend an Austin Police Officer""]","[""Action Navigation"", ""GTranslate"", ""Main menu"", ""Frequently Viewed Departments"", ""Commend an Austin Police Officer"", ""Tell Us About Yourself"", ""Footer Menu"", ""Second Footer Menu""]","[""Resident"", ""Business"", ""Government"", ""Departments"", ""Connect""]",[],[],[],"austintexas.gov Action Navigation 3-1-1 GTranslate Translate English Arabic Bulgarian Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch Finnish French German Greek Hindi Italian Japanese Korean Norwegian Polish Portuguese Romanian Russian Spanish Swedish Catalan Filipino Hebrew Indonesian Latvian Lithuanian Serbian Slovak Slovenian Ukrainian Vietnamese Albanian Estonian Galician Hungarian Maltese Thai Turkish Persian Afrikaans Malay Swahili Irish Welsh Belarusian Icelandic Macedonian Yiddish Armenian Azerbaijani Basque Georgian Haitian Creole Urdu Bengali Bosnian Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba Zulu austintexas . gov Filter Toggle navigation Menu Close Search Main menu Home Resident Resident Open the Resident page Open the Resident page Household Getting a Home Utilities Trash and Recycling Gardening and Home Improvements Home Improvements Pets and Adoption Open the Household page Neighborhoods Education Libraries Families Neighborhood Issues Open the Neighborhoods page Health Animals Public Health Open the Health page Public Safety Crime Courts Fire Safety Emergency Preparedness Public Safety Employment Open the Public Safety page Arts and Leisure Arts, History and Culture Outdoor, Nature and Wildlife Events City Venues and Facilities Film and Music Open the Arts and Leisure page Environmental City Programs and Initiatives Conservation and Recycling Animals and Wildlife Parks Open the Environmental page Transportation Car/Bus Aviation Bicycle/Pedestrian Streets/Maps Open the Transportation page City of Austin About Austin Voting and Elections Get Involved City Jobs Records and Documents Open the City of Austin page Business Business Open the Business page Open the Business page Doing Business Utilities Doing Business with the City Taxes MBE/WBE Program City Code Food Establishments Permits Day Labor Records and Documents Open the Doing Business page Starting Out Starting a Business Relocating a Business Incentives and Grants Open the Starting Out page City Contracts Small Business Centers Small Business Development Incentives and Grants Open the Small Business Centers page Austin Center for Events Nonprofits Grants Open the Nonprofits page Green Resources Government Government Open the Government page Open the Government page City Council City Manager's Office Boards and Commissions City Council meeting information City Hall Jobs Public Records Departments Departments View full directory of departments Frequently Viewed Departments View full directory of departments Visit Airport Visitors Bureau Convention Center Utilities Austin Energy Austin Water Resource Recovery Education & Recreation Library Parks and Recreation Safety Police Other Animal Services Development Services Economic Development Connect Connect Open the Connect page Share ideas online about improving Austin Participate in the City Sign up for email updates City contact information " -2020,http://www.longbeach.gov/police/press-releases/students-returning-to-school-motorists-urged-to-drive-carefully/,Media Bulletins,Agency-Published Resources,STUDENTS RETURNING TO SCHOOL; MOTORISTS URGED TO DRIVE CAREFULLY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 8/28/2017 FOR IMMEDIATE RELEASE Press Release # Subject: STUDENTS RETURNING TO SCHOOL; MOTORISTS URGED TO DRIVE CAREFULLY Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department would like to remind everyone that with most schools in the Long Beach Unified School District resuming sessions on Wednesday, August 30th, and with the volume of pedestrian traffic around schools increasing dramatically, all commuters are urged to follow the laws of the road in an effort to prevent avoidable accidents: All drivers are reminded to : - Yield the right of way to pedestrians in marked or unmarked crosswalks - Not overtake and pass a vehicle(s) stopped ahead of you when it has stopped for a pedestrian - Yield the right of way to pedestrians on sidewalks - Obey posted speed limits - Never drive while distracted – (examples: using a cell phone, reading, applying make-up, etc.) - Stop and remain stopped for school buses with “flashing red lights” - opposing traffic must also stop unless a painted or raised divider separates the roadway - Watch and obey Crossing Guards … they are there to protect children! It is equally important for pedestrians and parents to also follow the rules of the road: Pedestrians are reminded to : - Yield to vehicles on the roadway if you are outside the crosswalk - Not cross between intersections controlled by traffic signals (to do so would constitute jaywalking) Parents are reminded to : - Obey all parking signs/curb markings - they are designed to protect children and provide optimum traffic flow - Do not double park; it interrupts the flow of traffic and makes it difficult to for pedestrians to see oncoming traffic - Follow school drop off procedures and always drop your child off on the curbside of the school - Teach your child to always cross the street at a crosswalk The Long Beach Police Department is committed to pedestrian and motorist safety and traffic laws will be strictly enforced at and around our schools! For further information, please contact the Long Beach Police Department’s Traffic Section at (562) 570-7355. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2021,https://coloradosprings.gov/police-department/page/commander-howard,Poor Data Source,Poor Data Source,"","",403,"","","","","","","","" -2022,https://www.minneapolismn.gov/resident-services/public-safety/police-public-safety/police-reports-and-data-requests/sex-offender-community-notification/,Resources,Agency-Published Resources,Sex Offender Community Notification - City of Minneapolis,The City notifies communities when a sex offender moves in. You can search for sex offenders online.,200,City of Minneapolis,"[""Sex offender community notification"", ""Need help? We're here for you.""]","[""A snow emergency is not currently in effect. Normal parking rules apply."", ""Community notification"", ""Sex offender search"", ""Minneapolis Police resources"", ""Community resources"", ""Help from crime prevention specialists"", ""Contact us""]","[""Jamie Kieffer"", """", ""Minneapolis Police Department"", ""Connect with the Minneapolis Police Department""]",[],[],[],"" -2023,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0003/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2024,http://www.longbeach.gov/police/press-releases/graduation-and-summer-break-safety-tips2/,Media Bulletins,Agency-Published Resources,GRADUATION AND SUMMER BREAK SAFETY TIPS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2025,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/060721arrests.pdf,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -2026,https://norfolkne.gov/assets/site/documentcentral/police/statistical-reports/2021-statistical/mayormonthly050121.pdf,Annual & Monthly Reports,Info About Agencies,"","",200,"","","","","","","","" -2027,https://delcopa.gov/planning/pdf/agendas/2021/agenda202107.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2028,https://www.lynchburgvapolice.gov/news-updates/update-suspect-sought-in-cornerstone-street-homicide/,Media Bulletins,Agency-Published Resources,[UPDATE] Suspect Sought in Cornerstone Street Homicide  - Lynchburg Police Department,"",200,403 Forbidden,"[""[UPDATE] Suspect Sought in Cornerstone Street Homicide""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[],"" -2029,https://www.coppelltx.gov/1045/connect-with-oncor,Not Criminal Justice Related,Not Criminal Justice Related,"Connect with Oncor | Coppell, TX","Learn how to report power outages, downed power lines, and streetlight outages on Oncor.com. Learn how to receive alerts from Oncor. ",200,"Coppell, TX | Official Website","[""Connect with Oncor""]",[],"[""Oncor Overview"", ""Report Outages or Downed Lines"", ""Receive Alerts from Oncor"", ""What is the difference between Oncor and my electricity service provider?"", ""ERCOT"", ""Loading""]",[],[],[],Skip to Main Content -2030,https://www.mass.gov/info-details/2022-audit-of-the-bridgewater-state-university-objectives-scope-and-methodology,Annual & Monthly Reports,Info About Agencies,"2022 Audit of the Bridgewater State University Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Bridgewater State University,200,Mass.gov,"[""2022 Audit of the Bridgewater State University Objectives, Scope, and Methodology""]","[""Table of Contents for the audit, Audit of the Bridgewater State University"", ""Table of Contents"", ""Overview"", ""Data Reliability"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[],"" -2031,https://police.birminghamal.gov/command-staff/captain-james-jackson/,Personnel Records,Info About Officers,Captain James Jackson | Birmingham Police Department,"",200,"Home | Police Department - Birmingham, AL","[""Birmingham Police Department Commitment | Excellence | Integrity""]","[""Putting People First"", ""Captain James Jackson""]",[],"[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[],Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Search -2032,https://delcopa.gov/vote/military-overseas.html,Not Criminal Justice Related,Not Criminal Justice Related,"Military & Overseas Resources - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Military & Overseas Resources""]",[],"[""Military and Overseas Voters"", ""Delco Votes!"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Military & Overseas Resources Home / Elections / Military & Overseas Resources Unofficial Notice of Election for Military and Overseas Voters (General Primary - April 23, 2024) Military and Overseas Voters To register to vote and/or apply for an absentee ballot as a military or civilian overseas voter, you can complete the Federal Post Card Application (FPCA). Return the signed form (as an email attachment) to UOCAVA@co.delaware.pa.us or mail the form to: Delaware County Bureau of Elections 2501 Seaport Dr. Suite BH120 Chester, PA 19013 The deadline to register to vote is TWO WEEKS before Election Day, and a ballot request must be received at least one day BEFORE Election Day. For more information, see the Federal Voting Assistance Program guide for Pennsylvania . You may select to receive your absentee ballot by email/online, fax, or mail. Once you receive the ballot, mark it and submit it for delivery by mail no later than 11:59 p.m. on the day BEFORE Election Day. The Bureau of Elections must receive voted military and overseas absentee ballots no later than 5:00 p.m. ONE WEEK after Election Day. If you do not receive your absentee ballot in time to return it to participate in the election, you can use the Federal Write-In Absentee Ballot (FWAB). This is an official backup ballot that is blank, meaning it does not include the names of any candidates. It can only be used if you have already submitted an FPCA request, and a FWAB will only be counted if we do not receive your absentee ballot by the deadline. Federal Post Card Application (FPCA) Guide Federal Post Card Application (FPCA) Form in PDF 2024 Primary Election Unofficial Candidate List PDF Federal Write-In Absentee Ballot (FWAB) Form in PDF Delco Votes! Home Election News & Notices Voter Registration Sample Ballots Election Calendar Voter Resources Poll Worker Resources Candidate Resources Military & Overseas Where to Vote In-Person Ballot Drop Box Locations Vote-by-Mail Ballots Voter Service Centers FAQ Election Hotline Election Results About Us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu " -2033,https://spdblotter.seattle.gov/2014/12/30/police-arrest-christmas-day-bank-burglar/,Media Bulletins,Agency-Published Resources,Police Arrest Christmas Day Bank Burglar - SPD Blotter,"",200,403 Forbidden,"[""Police Arrest Christmas Day Bank Burglar""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -2034,https://alpha.austin.gov/es/police-oversight/2020-06-05-1/,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2035,https://delcopa.gov/courts/pdf/21noticetothebarpublic_boardofmanagers_juveniledetentioncenter.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2036,http://www.longbeach.gov/police/press-releases/juvenile-held-in-connection-with-robbery-case/,Media Bulletins,Agency-Published Resources,JUVENILE HELD IN CONNECTION WITH ROBBERY CASE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/1/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: JUVENILE HELD IN CONNECTION WITH ROBBERY CASE Contact: Media Relations Detail (562) 570-5273 On June 28, 2016, the District Attorney’s Office filed multiple offenses against a 15-year-old resident of Long Beach for his involvement in an attempt robbery and assault with a deadly weapon incident. On Monday, December 7, 2015, at approximately 10:45 p.m., officers were dispatched to an assault call in the 200 block of St. Joseph Avenue. Arriving officers discovered that two male adults were approached by two male subjects who attempted to rob them, and the victims and suspects became involved in a physical altercation. A witness intervened and the suspects, described as two male Hispanics in their late teens to early 20’s, ran to a nearby vehicle and fled. No property was taken. During the altercation, both victims sustained stab wounds to the torso. Long Beach Fire Department transported the victims, with what appeared to be non-life threatening injuries, to a local hospital. The case was investigated as possibly hate motivated. Detectives were able to identify the subject responsible from preserved evidence left at the scene of the stabbing. On June 24, 2016, West Division patrol officers were dispatched to the area of Pine Avenue and 16th Street regarding a group of male subjects chasing another individual throughout the neighborhood. A juvenile was detained and during the course of the investigation, officers believed him he may be involved in the December 7, 2015 incident. On June 28, 2016, Robbery detectives presented the case to the Los Angeles County District Attorney’s Office, which filed two counts of assault with a deadly weapon with a great bodily injury enhancement, and two counts of attempt robbery against the 15-year-old Petitioner. The juvenile was later transported to Los Padrinos Juvenile Hall. The second suspect remains outstanding and the investigation is ongoing. Anyone with information regarding this investigation is encouraged to call the Long Beach Police Robbery Detective D. Collier at (562) 570-5537. Anyone wishing to remain anonymous may call 1-800-22-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2038,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2017_news_releases/police_launch_community_camera_partnership_program,Media Bulletins,Agency-Published Resources,Police Launch Community Camera Partnership Program - Village of Pleasant Prairie,"",200,Just a moment...,[],"[""Police Launch Community Camera Partnership Program""]","[""Follow Us on Social Media""]",[],[],[],"" -2039,https://spdblotter.seattle.gov/2017/03/13/suspected-prowler-arrested-after-police-spot-him-peering-into-cars-at-downtown-garage/,Media Bulletins,Agency-Published Resources,Suspected Prowler Arrested After Police Spot Him Peering Into Cars at Downtown Garage - SPD Blotter,"",200,403 Forbidden,"[""Suspected Prowler Arrested After Police Spot Him Peering Into Cars at Downtown Garage""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -2040,http://www.norwoodma.gov/departments/police/report_a_tip.php,Resources,Agency-Published Resources,"Welcome to Town of Norwood, Massachusetts","Welcome to Town of Norwood, Massachusetts",200,"Welcome to Town Of Norwood, Massachusetts","[""Report a Tip""]",[],[],[],[],[],"" -2041,http://www.longbeach.gov/police/press-releases/murder-36-/,Media Bulletins,Agency-Published Resources,MURDER(36),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/16/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MURDER Contact: Media Relations (562) 570-5273 UPDATE (1/29/2016): View related news release regarding arrests. Original news release : On Wednesday, September 16, 2015, at approximately 12:49 a.m., Long Beach Police responded to the 1200 block of Chestnut Avenue regarding a shooting. When officers arrived, they discovered a male adult down on the street who had been struck by gunfire. Long Beach Fire Department Paramedics responded and pronounced the victim deceased at the scene. The victim has been identified as 24-year-old Rodrigo Perez Salazar of Long Beach. The motive for the shooting is unclear and the investigation remains ongoing. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detectives Donald Goodman and Mark Mattia at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/16/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MURDER Contact: Media Relations (562) 570-5273 UPDATE (1/29/2016): View related news release regarding arrests. Original news release : On Wednesday, September 16, 2015, at approximately 12:49 a.m., Long Beach Police responded to the 1200 block of Chestnut Avenue regarding a shooting. When officers arrived, they discovered a male adult down on the street who had been struck by gunfire. Long Beach Fire Department Paramedics responded and pronounced the victim deceased at the scene. The victim has been identified as 24-year-old Rodrigo Perez Salazar of Long Beach. The motive for the shooting is unclear and the investigation remains ongoing. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detectives Donald Goodman and Mark Mattia at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ A- A A+ A- A A+ A- A A+ A- A A+ " -2042,https://delcopa.gov/publicrelations/releases/2020/thankyoufirstresponders.html,Media Bulletins,Agency-Published Resources,"Thank You Citizens Corps of Delaware County - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Thank you Citizens Corps of Delaware County""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""""]",[],[],"" -2044,https://cityofsweetwater.fl.gov/event/sweetwater-police-pension-plan-board-of-trustees-meeting/,Policies & Contracts,Info About Agencies,Agendas & Minutes - City of Sweetwater,"",200,Home - City of Sweetwater,[],"[""Agendas & Minutes""]","[""Contact City Hall"", ""Office Hours""]",[],"[""Search Meeting Minutes, Agendas & Packets""]",[],Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Home About Us Government City Mayor City Commissioners City Code and Charter Agendas & Minutes Administration Calendar Departments Mayor's Office Annual Reports City Budget Building and Zoning Permit & Inspection Utilization Report Permit & Inspection Status Important Forms — Building & Zoning Clerk’s Office Clerks Office Mission Election Information 2021 Election Information 2023 Ordinances & Resolutions Communications News & Notices Newsletter Code Compliance Finance Human Resources Parks and Recreation Parks Programs Police Public Works Engineering Division Community ITB / RFP / RFQ Passport Office Transportation & Transit Schedule Elderly Program Events Calendar Special Projects Department Subscribe to Updates Contact Us Home About Us Government City Mayor City Commissioners City Code and Charter Agendas & Minutes Administration Calendar Departments Mayor's Office Annual Reports City Budget Building and Zoning Permit & Inspection Utilization Report Permit & Inspection Status Important Forms — Building & Zoning Clerk’s Office Clerks Office Mission Election Information 2021 Election Information 2023 Ordinances & Resolutions Communications News & Notices Newsletter Code Compliance Finance Human Resources Parks and Recreation Parks Programs Police Public Works Engineering Division Community ITB / RFP / RFQ Passport Office Transportation & Transit Schedule Elderly Program Events Calendar Special Projects Department Subscribe to Updates Contact Us Home About Us Government City Mayor City Commissioners City Code and Charter Agendas & Minutes Administration Calendar Departments Mayor's Office Annual Reports City Budget Building and Zoning Permit & Inspection Utilization Report Permit & Inspection Status Important Forms — Building & Zoning Clerk’s Office Clerks Office Mission Election Information 2021 Election Information 2023 Ordinances & Resolutions Communications News & Notices Newsletter Code Compliance Finance Human Resources Parks and Recreation Parks Programs Police Public Works Engineering Division Community ITB / RFP / RFQ Passport Office Transportation & Transit Schedule Elderly Program Events Calendar Special Projects Department Subscribe to Updates Contact Us -2045,https://coloradosprings.gov/police-department/article/news/update-homicide-investigation-3125-sinton,Media Bulletins,Agency-Published Resources,Update Homicide Investigation at 3125 Sinton Road | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Update Homicide Investigation at 3125 Sinton Road""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -2046,https://hilliardohio.gov/hpd-partners-with-neighboring-police-agencies-for-career-day/,Misc Police Activity,Police & Public Interactions,HPD Partners with Neighboring Police Agencies for Career Day - City of Hilliard,"The Hilliard Division of Police will join other nearby police agencies June 15 for a special Suburban Police Career Day. The event, the first of its kind",200,403 Forbidden,"[""HPD Partners with Neighboring Police Agencies for Career Day""]","[""Residents"", ""It’s a place you can be proud to call home."", ""Government"", ""We exhibit a heart for service, dedication to excellence, and strength in teamwork."", ""Recreation & Parks"", ""We believe in health, wellness, and vibrant quality of life for our community."", ""Police & Courts"", ""Our badge shows we protect and serve. Our approach shows we're part of the community."", ""FAQ"", ""How can we assist you?"", ""Related News"", ""Back-to-Back: Hilliard again named Top21 Smart Community in World"", ""HPD Honors Employees of the Year"", ""No Injuries Reported from Overnight Storm"", ""LET'S CHAT!"", ""City of Hilliard"", ""Hilliard Police"", ""Rec & Parks"", ""Hilliard Newsletter""]",[],[],[],"[""Click the ‘x’ to opt out.""]",About Hilliard Accessing the Last Mile Aging in Place Committee Annual Events Available Properties Boards and Commissions Application Bridging The Digital Divide Building Standards Division Business Card Order Form Business Media Business Permitting Business Resources City Charter City Manager City of Hilliard – Home Collaborations for Technology Community Garden Community Resources Community Services and Programs Comprehensive Plan Contact the City Contact Us Demographics Designated Outdoor Refreshment Area (DORA) Disc Golf Discrimination Form Downtown Hilliard Downtown Hilliard Map Economic Development Electric Aggregation Engineering Division Ephemeral Wildflowers in Hilliard Fall Festival Feral Cats Fiber To The Home File a Report Online Food Waste Composting Program Forms and Applications HiFiO Hilliard City Lab Hilliard Development Corporation Hilliard Express Hilliard Public Arts Commission Hilliard Trails Hilliard’s Parks History Important Documents Incentives & Programs Information Technology Join the HPD Team Leaf Collection Lifestyle Major Employers Mapping Ohio’s Connectivity Mosquitos Neighborhood Crime Mapping Non Discrimination Now Hiring: Seasonal and Part-Time Positions Operations Department Opportunity Hilliard Personnel Review Board Planning Division Police Transparency in Policing Police Public Records Request Program Guide Public Bids Public Records Recreation and Parks – WebTrac RecTrac User Guide Recycling Roundabouts SAFE Sidewalk Program Sanitary Backflow Program Senior Programs Senior Resources Smart Streets Smart911 Social Investment Sponsorship Stationary Order Form Stormwater Management Street Maintenance & Rehabilitation Program Styrofoam Recycling Summer Rec Camp Sustainability Taxes The Well – Hilliard Recreation and Wellness Center Traffic Calming Traffic Enforcement Requests Transportation & Mobility Division Transportation Planning Trees Vacation House Check Victims Rights Videos Volunteer WebTrac Login Winter Weather Yard Waste Your Hilliard Residents Resident Resources Hilliard 311 Thank you Newsletter Signup Trash Rec & Parks Classes & Camps Rentals Master Parks Plan Pools & Passes The Senior Center Senior Citizen Hall of Fame Sports Government Newsroom Boards & Commissions Planning & Zoning Recreation and Parks Advisory Committee Records Commission Shade Tree Commission Environmental Sustainability Commission Keep Hilliard Beautiful Zoning Appeals Agendas & Minutes City Council Mayor’s Court Departments Community Development Finance Human Resources Law Q & A Business Communication Economic Development Emergency Alerts Fire Holidays HR Mayor’s Court Old Hilliard Police Rec & Parks Solicitation Taxes Trash Q&A Trees Q&A Reporting Online Library Norwich Township Schools Visit Hotels Old Hilliard News Privacy & Usage Policy Sitemap Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Accessibility by WAH Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Font Resize A- A+ Font Resize A- A+ Keyboard navigation Keyboard navigation Readable Font Readable Font Contrast Choose color black white green blue red orange yellow navi Contrast Choose color black white green blue red orange yellow navi black white green blue red orange yellow navi Clear cookies Clear cookies Accessibility by WAH Accessibility by WAH -2047,https://alpha.austin.gov/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/bwc-dmav-data-analysis-data-cleaning-operations/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2048,https://ridgelandsc.gov/police-department/daily-crime-reports-march-2022,Crime Maps & Reports,Agency-Published Resources,Town of Ridgeland,Town of Ridgeland,200,Town of Ridgeland,"[""Police Department""]","[""Daily Crime Reports - March 2022""]",[],"[""March 31"", ""March 30"", ""March 29"", ""March 28"", ""March 27"", ""March 26"", ""March 25"", ""March 24"", ""March 23"", ""March 22"", ""March 21"", ""March 20"", ""March 19"", ""March 18"", ""March 17"", ""March 16"", ""March 15"", ""March 14"", ""March 13"", ""March 12"", ""March 11"", ""March 10"", ""March 9"", ""March 8"", ""March 7"", ""March 6"", ""March 5"", ""March 4"", ""March 3"", ""March 2"", ""March 1""]",[],[],"HOME GOVERNMENT Government Mayor Town Council Boards & Commissions Board, Commission, & Committee Vacancies Town Council Meeting Agendas Town Council Videos Resources Bid Opportunities Public Meeting Agendas Financial Documents DEPARTMENTS Executive Finance, HR and Risk Management Municipal Court Planning and Community Development Police Department Fire Department Water & Sewer BUSINESS Bid Opportunities Building Permits & Forms Business License Information Economic Development Opening a Business Public Meeting Agendas Resources Zoning Maps COMMUNITY About Ridgeland Battle of Honey Hill Community Events Job Opportunities Maps Gallery News & Information Ordinances Parks & Trails Public Safety/Utilities Schools Services Town of Ridgeland Farmers Market I WANT TO... Contact a Staff Member File a FOIA Request Find Out About Trash Collection Service Find the Police Department Find the Fire Department Find Town Hall Find Zoning Maps Learn About Services Pay a Traffic Fine Pay My Water Bill I Want Water/Sewer Service Rent Lakeside at Blue Heron HOME GOVERNMENT Government Mayor Town Council Boards & Commissions Board, Commission, & Committee Vacancies Town Council Meeting Agendas Town Council Videos Resources Bid Opportunities Public Meeting Agendas Financial Documents DEPARTMENTS Executive Finance, HR and Risk Management Municipal Court Planning and Community Development Police Department Fire Department Water & Sewer BUSINESS Bid Opportunities Building Permits & Forms Business License Information Economic Development Opening a Business Public Meeting Agendas Resources Zoning Maps COMMUNITY About Ridgeland Battle of Honey Hill Community Events Job Opportunities Maps Gallery News & Information Ordinances Parks & Trails Public Safety/Utilities Schools Services Town of Ridgeland Farmers Market I WANT TO... Contact a Staff Member File a FOIA Request Find Out About Trash Collection Service Find the Police Department Find the Fire Department Find Town Hall Find Zoning Maps Learn About Services Pay a Traffic Fine Pay My Water Bill I Want Water/Sewer Service Rent Lakeside at Blue Heron HOME GOVERNMENT Government Mayor Town Council Boards & Commissions Board, Commission, & Committee Vacancies Town Council Meeting Agendas Town Council Videos Resources Bid Opportunities Public Meeting Agendas Financial Documents DEPARTMENTS Executive Finance, HR and Risk Management Municipal Court Planning and Community Development Police Department Fire Department Water & Sewer BUSINESS Bid Opportunities Building Permits & Forms Business License Information Economic Development Opening a Business Public Meeting Agendas Resources Zoning Maps COMMUNITY About Ridgeland Battle of Honey Hill Community Events Job Opportunities Maps Gallery News & Information Ordinances Parks & Trails Public Safety/Utilities Schools Services Town of Ridgeland Farmers Market I WANT TO... Contact a Staff Member File a FOIA Request Find Out About Trash Collection Service Find the Police Department Find the Fire Department Find Town Hall Find Zoning Maps Learn About Services Pay a Traffic Fine Pay My Water Bill I Want Water/Sewer Service Rent Lakeside at Blue Heron " -2049,http://www.longbeach.gov/police/press-releases/motorcycle-safety-operation-results/,Media Bulletins,Agency-Published Resources,MOTORCYCLE SAFETY OPERATION RESULTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/28/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MOTORCYCLE SAFETY OPERATION RESULTS Contact: Media Relations Detail (562) 570-5273 On Sunday April 26, 2015, the Long Beach Police Department's Traffic Section conducted a Motorcycle Safety Operation.  During the five-hour operation, motor officers patrolled throughout the city looking for unsafe driving by motorcyclists, as well as drivers who were operating vehicles unsafely around motorcycle riders. Officers took the following enforcement actions: Cited forty-four (44) motorcyclists for unsafe driving and/or non DOT approved helmet Cited five (5) drivers for unsafe driving Cited one (1) motorcyclist for a suspended license Motorcycle fatalities saw a phenomenal drop of 37% from 2008 to 2010, but then rose 23% by 2012.  Operations like this are aimed at curbing a further rise in motorcycle deaths, and sending the numbers back downward.  Over the course of the past three years, motorcycle involved collisions have resulted in 15 fatal and approximately 277 injury crashes in the City of Long Beach. California collision data reveals that primary causes of motorcycle-involved crashes include speeding, unsafe turning and impairment due to alcohol and other drugs by both riders and drivers alike. Safety tips for riders – See and Be Seen: Ride with lights on during daylight hours Use your lane position to increase visibility; change lanes only when there is ample room Match your speed to surrounding traffic Always wear a DOT compliant helmet and brightly colored, protective clothing Safety tips for drivers – Share the Road: Look twice for motorcyclists, especially when entering roadway, turning or changing lanes Motorcyclist are allowed in HOV lanes unless prohibited by signage Riders are urged to get training through the California Motorcyclist Safety Program. Information and training locations are available online or 1-877 RIDE 411 (1-877-743-3411) Funding for this program is provided by a grant from the California Office of Traffic Safety through the National Highway Traffic Safety Administration. The message to all drivers and motorcyclists is: share in the responsibility and do your part by safely ""sharing the road."" This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2050,https://spdblotter.seattle.gov/2022/06/30/police-arrest-woman-for-shooting-outside-capitol-hill-apartment/,Media Bulletins,Agency-Published Resources,Police Arrest Woman for Shooting Outside Capitol Hill Apartment - SPD Blotter,"",200,403 Forbidden,"[""Police Arrest Woman for Shooting Outside Capitol Hill Apartment""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -2051,https://www.mass.gov/info-details/audit-of-the-office-of-the-commissioner-of-probation-objectives-scope-and-methodology,Not Criminal Justice Related,Not Criminal Justice Related,"Audit of the Office of the Commissioner of Probation Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Office of the Commissioner of Probation.,200,Mass.gov,"[""Audit of the Office of the Commissioner of Probation Objectives, Scope, and Methodology""]","[""Table of Contents for the audit, Audit of the Office of the Commissioner of Probation (OCP)"", ""Appendix"", ""Table of Contents"", ""Overview"", ""Enrollment of GPS and SCRAM Participants"", ""Monitoring of GPS Alerts"", ""Monitoring of SCRAM Alerts"", ""Review of Juvenile Record Requests"", ""Data Reliability"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[],"" -2052,https://www.mass.gov/doc/national-environmental-policy-act-review-scoping-summary-report-i-90-allston-multimodal-project/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2053,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2020_news_releases/police_continue_manhunt,Media Bulletins,Agency-Published Resources,Police Continue Manhunt - Village of Pleasant Prairie,"",200,Just a moment...,[],"[""Police Continue Manhunt""]","[""Follow Us on Social Media""]",[],[],[],"" -2054,http://www.longbeach.gov/police/press-releases/felony-suspect-arrested/,Media Bulletins,Agency-Published Resources,FELONY SUSPECT ARRESTED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/26/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: FELONY SUSPECT ARRESTED Contact: Media Relations Detail (562) 570-7097 On February 24, 2014, felony charges were filed against a 21-year-old Long Beach man after he shot at a taxi cab driver over a disagreement. On February 3, 2014, a taxi cab driver picked up a single passenger in the 1100 block of East 21st Street. While enroute to the customer's destination, the cab driver and the passenger began arguing over the amount of the fare. When the argument became heated, the cab driver pulled over in the 2300 block of Locust Avenue. As the passenger exited the taxi, he withdrew a firearm and discharged one round towards the cab driver before fleeing the area. The taxi cab driver was grazed by the bullet, treated at the scene for his injury, and released. The Robbery detail began their investigation to identify the suspect, and on Thursday, February 20, 2014, they were able to locate and arrest 21-year-old Enrique Cervantes of Long Beach. Shortly after his arrest, detectives from the Robbery Detail and the Career Criminal Apprehension Team served a search warrant at Cervantes' residence where they recovered evidence believed to be related to the shooting. The case was presented to the Los Angeles County District Attorney’s Office and the following charges were filed against Cervantes: one count of assault with a deadly weapon, one count of attempted armed robbery, in addition to weapons related enhancements. If anyone has additional information which could assist detectives in the investigation, they are encouraged to call Long Beach Police Robbery Detective F. Gonzalez at (562) 570-7068. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2055,https://southamptontownnypolice.gov/1543/policies-for-the-zba,Policies & Contracts,Info About Agencies,"Policies for the ZBA | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Policies for the ZBA""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Land Management - Building & Zoning Zoning Applications & Forms Policies for the ZBA Policies for the ZBA 2020 Policies 12.17.20 2019 Policies Modifications Amendments 06.20.19 2017 Policies for the ZBA (Adopted March 16, 2017) (PDF) Policies for the ZBA Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Land Management - Building & Zoning Zoning Applications & Forms Policies for the ZBA Policies for the ZBA 2020 Policies 12.17.20 2019 Policies Modifications Amendments 06.20.19 2017 Policies for the ZBA (Adopted March 16, 2017) (PDF) Policies for the ZBA Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -2056,https://whitestown.in.gov/news/christmas-with-a-cop/,Media Bulletins,Agency-Published Resources,Christmas with a Cop - Town of Whitestown,"",200,403 Forbidden,"[""Recent News"", ""Christmas with a Cop""]","[""Recent News Articles"", ""Whitestown Annual Easter Egg Hunt Returns"", ""Tips to Prepare for the Total Solar Eclipse in Whitestown"", ""Visit Us"", ""Contact Us"", ""Stay Connected"", ""How can we help?""]",[],[],[],[],"" -2057,http://www.longbeach.gov/police/press-releases/identity-theft-suspect-charged-with-11-felony-counts/,Media Bulletins,Agency-Published Resources,IDENTITY THEFT SUSPECT CHARGED WITH 11 FELONY COUNTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/27/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: IDENTITY THEFT SUSPECT CHARGED WITH 11 FELONY COUNTS Contact: Media Relations Detail (562) 570-5273 In December 2015, Detectives from the Long Beach Police Department Financial Crimes Detail began conducting a lengthy identity theft investigation. Through their investigation, Detectives learned that a suspect used the personal identifying information of multiple victims to open credit cards. They identified three fraudulent credit card accounts, with balances owed of over $100,000.00. The suspect used the credit cards to buy expensive sports memorabilia and make lease payments for 3 Lexus vehicles. The suspect also used the fraudulently obtained credit cards to dine at high-end restaurants, and make large purchases at various clothing and electronic retail stores. The suspect was identified as Jason Allen Sorenson, a 38 year old resident of Covina California. On May 5, 2016, detectives served a search warrant at Sorenson’s residence in Covina, California. Detectives recovered multiple key items of evidence related to identity theft, impounded two Lexus vehicles, and recovered multiple items of sports memorabilia. Sorenson was subsequently arrested on multiple charges of identity theft, grand theft, as well as ex-felon in possession of ammunition, ex-felon in possession of a stun gun, and possession of narcotics. Sorenson posted bail the same day and was scheduled to appear in court on May 26, 2016. Detectives presented their case to the Los Angeles County District Attorney’s Office for filing consideration and they filed 11 felony counts against Sorenson. He was charged with 6 counts of Identity Theft, 3 counts of Grand Theft, 1 count of Possession of Narcotics for Sales, and 1 count of Ex-Felon in Possession of Ammunition. His bail was set at $255,000.00 and he was arraigned in Long Beach court on May 26, 2016. After the arraignment he was not remanded into custody and remains out on bond. Anyone with information in this case is urged to call Financial Crimes Detectives at (562) 570-7330. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2058,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0718/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2059,http://www.longbeach.gov/police/press-releases/murder-13-/,Media Bulletins,Agency-Published Resources,MURDER(13),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/7/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Thursday, March 6, 2014, at approximately 3:30 p.m., Long Beach Police responded to an unknown trouble call at a residence in the 5800 block of Rose Avenue and discovered two deceased individuals. Due to the circumstances, Homicide detectives were called to the scene. The preliminary investigation indicates a murder-suicide occurred. Forty-seven-year-old Javier Perez appeared to have sustained a self-inflicted gunshot wound to the upper torso. Forty-three-year-old Kristie Michelle Perez appeared to have sustained two gunshot wounds to the torso. The two were married and resided in Long Beach. Anyone with information regarding this incident is asked to contact Long Beach Police Homicide Detectives Todd Johnson and Roger Zottneck at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/7/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Thursday, March 6, 2014, at approximately 3:30 p.m., Long Beach Police responded to an unknown trouble call at a residence in the 5800 block of Rose Avenue and discovered two deceased individuals. Due to the circumstances, Homicide detectives were called to the scene. The preliminary investigation indicates a murder-suicide occurred. Forty-seven-year-old Javier Perez appeared to have sustained a self-inflicted gunshot wound to the upper torso. Forty-three-year-old Kristie Michelle Perez appeared to have sustained two gunshot wounds to the torso. The two were married and resided in Long Beach. Anyone with information regarding this incident is asked to contact Long Beach Police Homicide Detectives Todd Johnson and Roger Zottneck at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ A- A A+ A- A A+ A- A A+ A- A A+ " -2061,https://www.roseville.ca.us/government/departments/police_department/crime_log/crime_log_feb_18_-_march_3__2019,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2062,https://www.lehi-ut.gov/departments/police/,Contact Info & Agency Meta,Info About Agencies,Police - Lehi City,"",200,Sucuri WebSite Firewall - Access Denied,"[""Police""]","[""Lehi City Police Records Request Form"", ""incident reporting system"", ""Lehi City Police Department Bicycle Registration"", ""More Information"", ""Related Pages""]","["""", ""To report an incident CLICK HERE"", ""Lehi Police Department"", ""Office Hours""]",[],[],[],"Contact Us Pay Utility Bill Search Community About Lehi Arts and Culture City Calendar Events & Celebrations Lehi Family Week Lehi Round-Up Week Special Event Permit Get Involved Info Guide Newsletter Regional Resources Parks & Recreation Reservations Legacy Recreation Center Sports Programs Recreation Programs Outdoor Pool Parks & Trails Senior Center Services & Information Information Center Utility Services Passports Business Licensing Report an Issue Building & Inspections Lehi City Library Rippy Literacy Center Cemetery Emergency Management Environmental Sustainability Parks, Arts, Recreation, and Culture (PARC) Tax RFP’s & Bid Solicitations Government Administration Citywide Goals and Objectives Elected Officials Election Information Youth Council Justice Court Municipal Code Public Meetings & Notices Records & Elections Transparency Privacy Policy Departments Building & Inspections Contact Us Economic Development Finance Fire Department Calendar Request a Fire Station Tour Human Resources Employment Opportunities Employee Benefits Summary Legal Services Planning & Zoning Police Animal Control Services Calendar Request a Police Station Tour Power Public Relations Public Works Lehi Fiber Police The Police Department will provide a safe and secure community by delivering professional and courteous services as determined in partnership with Lehi residents. The Police Department’s function is to serve and protect all people and property within the City limits. This is done through the coordinated efforts of patrol officers, detectives, code enforcement officers, and animal control officers. Lehi City Police Records Request Form Police GRAMA Request Form incident reporting system The incident reporting system provides residents with a convenient and effective way to report various concerns and incidents within the community. In just a few easy steps, individuals can contribute to maintaining a safe and orderly environment. If this is an Emergency, please call 911. To report an incident CLICK HERE Lehi City Police Department Bicycle Registration Bicycle Registration Form More Information Lehi Police Department 128 North 100 East Lehi, UT 84043 385.201.1005 Office Hours Monday thru Thursday 7 a.m. to 6 p.m. Friday 7 a.m. to 4 p.m. Report an Incident Hire An Off Duty Police Officer Officer Involved Incident Protocol Officer Involved Shootings Policy Policy Manual Tow Rotation Application Bicycle Registration Form Related Pages Animal Control Services Citizen Reporting and Records Request Forms Code Enforcement Departments Grants Hire An Off Duty Police Officer Lehi Cares Coalition Lehi Police Ride-Along Neighborhood Watch Police Annual Report Police Department Events Report an Issue Tip Line Victim Services Volunteers In Police Service (V.I.P.S.) Upcoming Events Employment Opportunities Contact Us LEHI CITY 153 N 100 E Lehi, Utah 84043 Phone: (385) 201.1000 Fax: (385) 201.1001 CONNECT WITH US Legacy Center Development Map © 2024 Lehi City · All Rights Reserved · An ADA 508 Compliant Website " -2063,https://spdblotter.seattle.gov/2020/07/25/police-make-dozens-of-arrests-after-explosion-damages-east-precinct-and-march-turns-to-riot/,Media Bulletins,Agency-Published Resources,Police Make Dozens of Arrests After Explosion Damages East Precinct and March Turns to Riot - SPD Blotter,"",200,403 Forbidden,"[""Police Make Dozens of Arrests After Explosion Damages East Precinct and March Turns to Riot""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -2064,https://www.almaarkansas.gov/downloads/alma-police-car/,Poor Data Source,Poor Data Source,"alma-police-car | City of Alma, Arkansas","",200,"The City of Alma, Arkansas | Official Website","[""alma-police-car""]",[],[],[],"[""Helpful Numbers"", ""Community Links""]","[""Sitemap / Privacy / Arkansas Web Design""]","Explore Alma Resident Resources Government Contact Explore Alma Resident Resources Government Contact Explore Alma Community Calendar Map & Directions Alma Aquatic Center Performing Arts Center Parks & Recreation Trails System Public Library School District City Directory Economic Development The Alma Advantage Ongoing Projects Government Mayor’s Office City Council City Directory City Attorney Planning Commission A&P Commission City Clerk District Court Financial Report Fire Department Police Department Parks & Recreation Public Works Planning, Building & Zoning Voting Information Minutes, Ordinances & Recordings Resident Resources Public Records Archive News & Announcements City Directory Water & Trash Service Facility Reservations Fire Department Report a Concern Minutes, Ordinances & Recordings Paying Fines Permits & Licenses Police Department Public Works School District Voting Information Trash & Recycling Street Maintenance Stormwater Water & Wastewater Alma Cemetery Planning, Building & Zoning Contact Map & Directions City Directory Send a Message Report a Concern Close Explore Alma Community Calendar Map & Directions Alma Aquatic Center Performing Arts Center Parks & Recreation Trails System Public Library School District City Directory Economic Development The Alma Advantage Ongoing Projects Government Mayor’s Office City Council City Directory City Attorney Planning Commission A&P Commission City Clerk District Court Financial Report Fire Department Police Department Parks & Recreation Public Works Planning, Building & Zoning Voting Information Minutes, Ordinances & Recordings Resident Resources Public Records Archive News & Announcements City Directory Water & Trash Service Facility Reservations Fire Department Report a Concern Minutes, Ordinances & Recordings Paying Fines Permits & Licenses Police Department Public Works School District Voting Information Trash & Recycling Street Maintenance Stormwater Water & Wastewater Alma Cemetery Planning, Building & Zoning Contact Map & Directions City Directory Send a Message Report a Concern Close Explore Alma Community Calendar Map & Directions Alma Aquatic Center Performing Arts Center Parks & Recreation Trails System Public Library School District City Directory Economic Development The Alma Advantage Ongoing Projects Government Mayor’s Office City Council City Directory City Attorney Planning Commission A&P Commission City Clerk District Court Financial Report Fire Department Police Department Parks & Recreation Public Works Planning, Building & Zoning Voting Information Minutes, Ordinances & Recordings Resident Resources Public Records Archive News & Announcements City Directory Water & Trash Service Facility Reservations Fire Department Report a Concern Minutes, Ordinances & Recordings Paying Fines Permits & Licenses Police Department Public Works School District Voting Information Trash & Recycling Street Maintenance Stormwater Water & Wastewater Alma Cemetery Planning, Building & Zoning Contact Map & Directions City Directory Send a Message Report a Concern alma-police-car Home Public Records Archive alma-police-car alma-police-car Home Public Records Archive alma-police-car alma-police-car Home Public Records Archive alma-police-car alma-police-car Home Public Records Archive alma-police-car Home Public Records Archive alma-police-car Helpful Numbers Emergency / Fire: 911 Police Dept: 479.632.3333 Utility Dept: 479.632.2254 Court Clerk: 479.632.4170 Community Links Alma Chamber of Commerce Alma School District Alma Performing Arts Center Fort Smith Regional Airport " -2065,http://www.ryepolice.us/logs/police-logs-for-4-3-19-4-9-19,Daily Activity Logs,Info About Officers,Rye Police Department Police Logs for 4/3/19-4/9/19 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs for 4/3/19-4/9/19""]","[""Police Logs for 4/3/19-4/9/19""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -2066,https://www.coppelltx.gov/555/nancy-monroe,Not Criminal Justice Related,Not Criminal Justice Related,"","",404,"","","","","","","","" -2067,http://www.ryepolice.us/wp-content/uploads/wallis-sands-half-marathon-route.jpg,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2068,http://www.longbeach.gov/police/press-releases/murder-orange-and-washington/,Media Bulletins,Agency-Published Resources,MURDER-Orange and Washington,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/14/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MURDER (AREA OF ORANGE AVE & WASHINGTON ST) Contact: Media Relations Detail (562) 570-5273 On Thursday, December 10, 2015, at approximately 2:20 p.m., Long Beach Police were dispatched to an assault with a deadly weapon call, in the area of Orange Avenue and Washington Street. Officers located a male adult who had been struck in the upper body by gunfire. Long Beach Fire Department paramedics responded and transported him, in serious condition, to a local hospital. The preliminary investigation indicated a male subject approached the victim, fired at him, and fled before officers arrived. On December 11, 2015, the victim succumbed to his injuries and was pronounced deceased at the hospital. The victim has been identified as 34-year-old Roosevelt Keondrae Newton of Long Beach. A motive for the shooting is unknown and the suspect is outstanding. The incident is being investigated as possibly gang-related. The investigation remains ongoing. Anyone with information is urged to contact Long Beach Police Homicide Detectives Scott Lasch, Michael Hubbard, and Robert Gonzales at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2069,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2014_archived_news/october_2014/uta_spotlight_arlington_police_students_celebrate,Media Bulletins,Agency-Published Resources,"UTA Spotlight: Arlington Police, Students Celebrate National Night Out - City of Arlington","",200,Just a moment...,"[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""UTA Spotlight: Arlington Police, Students Celebrate National Night Out""]",[],[],[],[],Skip to Content Skip to Content -2070,https://police.greenvillesc.gov/faq.aspx?qid=222,Complaints & Misconduct,Info About Officers,FAQs • How can I file a complaint about an officer?,"",200,"Police Department | Greenville, SC - Official Website",[],"[""▼ Police Department""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -2071,https://beaumonttexas.gov/police-investigating-aggravated-assault-4600-block-detroit/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2072,https://rexburg.us/police-identify-man-killed-in-motorcycle-crash-in-logan-canyon/,Poor Data Source,Poor Data Source,"","",522,"","","","","","","","" -2073,https://champaignil.gov/tag/copper-road/,List of Data Sources,Info About Agencies,Copper Road Archives - City of Champaign,"",200,403 Forbidden,"[""Items tagged: Copper Road""]","[""Copper Ridge Road Lane Closure (between Mullikin Drive and Copper Road)"", ""2023 Concrete Street Improvements Project"", ""2023 Concrete Street Improvements Project"", ""Copper Ridge Road Closure (between Copper Road and Mullikin Drive)"", ""News Releases"", ""Department News""]",[],[],[],[],"" -2074,https://www.police.wallingfordct.gov/about-us/history/,Not Criminal Justice Related,Not Criminal Justice Related,"Our History | Wallingford, CT Police Department","The Wallingford Police Department (WPD) formed in 1913, when it consisted of a single officer serving approximately 11,000 people.",200,"Wallingford, CT Police Department","[""Our History""]","[""Wallingford Police Department Through the Years""]",[],[],[],[],"‹ Close Menu About Us Our Team Who We Serve Our History Police Station Project Divisions Records Division Traffic Division Investigative Services Division Professional Standards & Training Division Patrol Division Community Impact Unit Public Safety Communications Center Emergency Response Team Field Training & Evaluation Program How Do I? Pistol Permits Fingerprinting Accident Reports Case Reports Traffic Violations Pay a Parking Ticket Hire a Cop Alarm Registration Careers Current Employment Opportunities Forms & Resources Bingo, Bazaar & Raffle Documents Precious Metal Application Secondhand Application Pawnbroker Application Vending Application News & Events Road Closures & Detours Agency Events & Programs Press Releases Photo Gallery Video Gallery Wallingford PBA Contact Our History Our History The men and women of the Wallingford Police Department (WPD) have been proudly serving and protecting the citizens of our community since 1913, when the Department consisted of 1 officer serving a population of approximately 11,000 people. Wallingford Police Department Through the Years Our Team Who We Serve Our History Police Station Project The men and women of the Wallingford Police Department (WPD) have been proudly serving and protecting the citizens of our community since 1913, when the Department consisted of 1 officer serving a population of approximately 11,000 people. Wallingford Police Department Through the Years Location: 135 North Main Street Wallingford, CT 06492 Tel: (203) 294-2800 Fax: (203) 294-2882 Administrative Office: Monday through Friday 8 am – 4 pm Site Map Privacy Policy Accessibility Statement Anonymous Tip Form Town of Wallingford Location: 135 North Main Street Wallingford, CT 06492 Tel: (203) 294-2800 Fax: (203) 294-2882 Administrative Office: Monday through Friday 8 am – 4 pm Site Map Privacy Policy Accessibility Statement Anonymous Tip Form Town of Wallingford Web Solutions © 2022 – 2024 Wallingford Police Department. All rights reserved. Web Solutions © 2022 – 2024 Wallingford Police Department. All rights reserved. " -2075,http://www.longbeach.gov/police/press-releases/traffic-fatality---willow-st.-and-golden-ave/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY - WILLOW ST. AND GOLDEN AVE.,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/4/2019 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY - WILLOW ST. AND GOLDEN AVE. Contact: Media Relations Detail (562) 570-5273 LBPDMediaRelations@longbeach.gov On January 3, 2019, at approximately 6:00 p.m., officers were patrolling the area of Willow Street and Golden Avenue when they discovered an injury traffic collision between a vehicle and a bicycle had just occurred. Officers located a 64-year-old female resident of Long Beach lying on the northwest corner of the intersection. The female was identified as the bicyclist involved in the collision. The Long Beach Fire Department transported the injured bicyclist to the hospital where she was later pronounced deceased. The bicyclist's identification is being withheld pending notification of next of kin by the Los Angeles County Coroner’s Office. Officers also contacted a 50-year-old male resident of Long Beach who was identified as the driver of a 1993 Ford Explorer involved in the collision. The preliminary investigation revealed the collision occurred when the driver of the Ford Explorer was traveling west on Willow Street approaching Golden Avenue. As the driver approached the intersection, the signal for westbound traffic phased to green. The collision occurred when the driver entered the intersection without realizing the bicyclist was already crossing the intersection northbound on Golden Avenue. The driver stayed at the scene and cooperated with the investigation. Detectives do not believe the driver of the vehicle was under the influence of alcohol or drugs at the time of the collision. Anyone with information regarding this incident is asked to call Detective David Lauro of the Long Beach Police Department’s Collision Investigation Detail at (562) 570-7355. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2076,https://www.townofnewhartfordny.gov/police-commission-minutes,Poor Data Source,Poor Data Source,Official Website for the Town of New Hartford New York - Police Commission Minutes,Warren New Hampshire,200,Official Website for the Town of New Hartford New York - Home New,[],"[""Town of New Hartford at \""The Orchards\""""]","[""Contact Us"", ""Social Media"", ""Quick Links"", ""Site Links""]",[],[],[],"Departments Government Services Community Government / Police Commission / Police Commission Minutes Police Commission Minutes Town of New Hartford at ""The Orchards"" Contact Us 8635 Clinton Street New Hartford, NY 13413 315-733-7500 Monday through Friday 8:00 a.m. to 4:00 p.m. Social Media Quick Links Site Links Website By EvoGov Departments Government Services Community Departments Government Services Community Departments Government Services Community Departments Government Services Community Departments Government Services Community Government / Police Commission / Police Commission Minutes Police Commission Minutes Government / Police Commission / Police Commission Minutes Police Commission Minutes Government / Police Commission / Police Commission Minutes Police Commission Minutes Government / Police Commission / Police Commission Minutes Government / Police Commission / Police Commission Minutes Police Commission Minutes Town of New Hartford at ""The Orchards"" Contact Us 8635 Clinton Street New Hartford, NY 13413 315-733-7500 Monday through Friday 8:00 a.m. to 4:00 p.m. Social Media Quick Links Site Links Website By EvoGov Town of New Hartford at ""The Orchards"" Contact Us 8635 Clinton Street New Hartford, NY 13413 315-733-7500 Monday through Friday 8:00 a.m. to 4:00 p.m. Social Media Quick Links Site Links Town of New Hartford at ""The Orchards"" Contact Us 8635 Clinton Street New Hartford, NY 13413 315-733-7500 Monday through Friday 8:00 a.m. to 4:00 p.m. Social Media Quick Links Site Links Town of New Hartford at ""The Orchards"" Contact Us 8635 Clinton Street New Hartford, NY 13413 315-733-7500 Monday through Friday 8:00 a.m. to 4:00 p.m. Social Media Quick Links Site Links Website By EvoGov " -2077,https://barnegatpolice.us/six-arrested-drug-charges/,Media Bulletins,Agency-Published Resources,Six Arrested on Drug Charges - Barnegat Township Police Department,"",200,Barnegat Township Police Department - Barnegat Township Police Department,"[""Six Arrested on Drug Charges""]","[""Six Arrested on Drug Charges""]","[""About the Author: BTPD"", ""Related Posts""]","[""Share This Story, Choose Your Platform!"", ""Robbery Arrest"", ""DWI Arrest"", ""DWI Arrest"", ""Robbery Investigation Leads to Multiple Arrests, Recovery of Handgun"", ""DWI Arrests"", ""Resources"", ""Directions"", ""Quick Links""]",[],[],"" -2078,https://chandlerazpd.gov/2014/09/chandler-police-looking-for-g-a-i-n-participants-4/,Media Bulletins,Agency-Published Resources,Chandler Police Looking for G.A.I.N. Participants – Chandler Police Department,"",200,Chandler Police Department,"[""Chandler Police Looking for G.A.I.N. Participants""]",[],"[""Quick Links"", ""News Archives"", """", """", """", """"]","[""September 2, 2014"", ""Contact"", ""About the Department"", ""Latest News"", ""Courage, Pride, Dedication © 2024 Chandler Police Department""]",[],[],"The Chandler Police Department main lobby will be closed for renovations. Please see below for further. The Chandler Police Department main lobby will be closed for renovations. Please see below for further. Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Home News Chandler Police Looking for G.A.I.N. Participants Home News Chandler Police Looking for G.A.I.N. Participants Search for: Chandler Police Looking for G.A.I.N. Participants September 2, 2014 By Sergeant J. Favazzo The Chandler Police Department is seeking out neighborhood groups interested in this year’s annual G.A.I.N. event. G.A.I.N. (Getting Arizona Involved in Neighborhoods) is a day to celebrate the success of crime prevention through community involvement. This event also provides members of the Department an opportunity to express their appreciation to the community for its support.   This year’s G.A.I.N. event is scheduled for Saturday, October 25, 2014 from 2:00 p.m. to 8:00 p.m. The Chandler Police Department is encouraging all neighborhood groups to participate. Groups may participate through a block party or other type of neighborhood gathering. Groups can then register their block party for a visit by members of the Department’s many units. Visiting member units include Patrol, Motors, K-9’s, S.A.U., and Community Services, just to name a few. The kick-off for the G.A.I.N. event is September 27, 2014 from 10:00 a.m. to 12:00 p.m. at our Main Police Station, 250 E. Chicago St. Registration is mandatory and will be followed by a lottery to ensure all groups are afforded an opportunity to request the police specialty units they want to visit their block party. For more information about the program contact the Chandler Police Department Community Resources Unit at (480) 782-4967. Search for: Quick Links About the Department Office of the Chief Interim Chief Of Police Melissa Deanda Assistant Chief Of Police Dave Ramer Department Events My Precinct Fingerprinting Services Request a Police Report Bicycle Registration General Orders/Accreditation Alarm Information Registered Sex Offenders Citizen Observer (Ride-Along) Vehicle Impounds Barking Dog Police Open Data Public Demonstration Guidelines News Archives August 2022 September 2021 July 2021 September 2020 August 2020 June 2020 May 2020 April 2020 March 2020 February 2020 January 2020 December 2019 " -2079,https://wrightstown.us/police-community-information/driving-in-school-zones/,Resources,Agency-Published Resources,Driving in School Zones - Village of Wrightstown,"",200,"Village of Wrightstown, Wisconsin ~ Official Website","[""Driving in School Zones""]","[""ALWAYS DRIVE SAFELY IN SCHOOL ZONES"", ""Recent News"", ""Upcoming Events""]","[""Good Friday"", ""Easter"", ""April Fool’s Day"", ""Easter Monday"", ""Earth Day""]","[""Village Hall"", ""Public Works"", ""Police Department"", ""Fire Department"", ""Join Us on Social Media""]",[],[],"" -2080,https://delcopa.gov/planning/pubs/index.html,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -2081,http://www.cityofpataskalaohio.gov/cop_folder/2015-legislation-under-public-notices/advertisement-of-legislation-passed-december-1-2014-2/,Not Criminal Justice Related,Not Criminal Justice Related,"Advertisement of Legislation passed December 1, 2014 - City Of Pataskala",Official Website,200,Home - City Of Pataskala,"[""City Of Pataskala"", ""Advertisement of Legislation passed December 1, 2014""]","[""Official Website"", ""Categories""]",[],[],[],[],Document Library Calendar Public Services Pay Court Ticket Online City Of Pataskala Official Website Blog Community Police Obtain Fingerprints Solicitor’s Permit Citizens Police Academy Important Links/Resources Prescription Drug Drop Off Police Officer Job Application History of the Pataskala Police Department Curfew Vacation House Check Form Fire School Districts Residents Taxes in Pataskala RITA Tax Local Animal Shelter/Lost Pets Dog License BMV Info Licking County Health Department Register to Vote Report a Gas Emergency New to Pataskala? Good Neighbor Guidelines Outdoor Activities Attractions City Departments Mayor Administration Garage Sale Permit Adopt-A-Street Program Rent a Park Shelter Current Bids and RFQ’s Outdoor Activity/Event Permit Parade-Assembly Form Parks and Recreation Economic Development Human Resources Utilities Utility Rates Water and Sewer Billing/ E-Billing Interesting Facts and Information Storm Water Management Program Report a Water Leak Finance Pataskala’s Income Tax Budget Financial Reports Popular Annual Financial Report (PAFR) Annual Comprehensive Financial Reports Financial Condition Reports 2023 Financial Condition Reports 2022 Financial Condition Reports 2021 Financial Condition Reports 2020 Financial Condition Reports 2019 Financial Condition Reports 2018 Financial Condition Reports 2017 Financial Condition Reports 2016 Financial Condition Reports 2015 Financial Condition Reports 2014 Financial Condition Reports 2013 Financial Condition Reports 2012 Financial Condition Reports Audited Financial Reports Pataskala Open Checkbook Mayor’s Court Important Traffic Violation Info Pay Fines or Search Case Files How to Pay Fines Traffic and General Offense Codes Plea Descriptions Court Appearance Times Your Rights in the Pataskala’s Mayor’s Court Downloadable Forms Sealing a Record Informational Court Links Mayor’s Court Prosecutor Pataskala’s Mayors Court Magistrate Mayor’s Court Rules Criminal/Traffic Diversion Bond Schedule Fine Schedule Legal Public Service/Streets Pothole Repair Report a Pothole Right of Way Snow Removal Traffic Signals & Street Lights Drainage/Ditches Issues Planning & Zoning Permit Questions Planning & Zoning Fee Schedule Discharge Map Zoning Maps Permits Comprehensive Plan Properties With Posted Code Violations Government City Council Ward Map Tom H. Lee – Ward 1 Mary Hite – Ward 2 Deborah Kohman – Ward 3 Brandon Galik – Ward 4 Dustin Epperson – At-Large Jude Hampshire – At-Large Andy Walther – At Large Clerk of Council Council Packet Public Notices Agendas Meeting Minutes Audio/Video Recordings Legislation Approved Ordinances & Resolutions 2024 Resolutions 2024 Ordinances 2023 Resolutions 2023 Ordinances 2022 Resolutions 2022 Ordinances 2021 Resolutions 2021 Ordinances 2020 Resolutions 2020 Ordinances 2019 Resolutions 2019 Ordinances 2018 Resolutions 2018 Ordinances 2017 Resolutions 2017 Ordinances 2016 Resolutions 2016 Ordinances 2015 Resolutions 2015 Ordinances Codified Ordinances Charter Public Records Request Information Boards and Commissions Personnel Board of Review Planning and Zoning Commission Board of Zoning Appeals Parks and Recreation Advisory Board Planning & Zoning Commission Board of Zoning Appeals Document Library Calendar Public Services Pay Court Ticket Online -2082,http://www.longbeach.gov/police/press-releases/weapon-crusher/,Media Bulletins,Agency-Published Resources,Weapon Crusher,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/30/2015 FOR IMMEDIATE RELEASE Press Release # Subject: LBPD PARTNERS WITH LB RESIDENT & LB POLICE FOUNDATION TO ACQUIRE WEAPON DESTRUCTION MACHINE Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department is pleased to announce the procurement of a new piece of equipment for our Evidence Control Section called “The Crusher.” The Crusher will allow for increased efficiency and productivity in the area of gun and weapons destruction, and it was all made possible by Al Brunella, a Long Beach resident and owner of “Hi Flo Corporation,” a manufacturing business, in partnership with the Long Beach Police Foundation (LBPF). Per the California Penal Code, firearms that are no longer needed as evidence, or have been surrendered for safekeeping, shall be destroyed so they can no longer be used as a weapon. Prior to obtaining The Crusher, all firearms and weapons ready for destruction had to be transported by armed escort to the Los Angeles County Sheriff’s Department. This process required extensive planning, coordination, and several personnel hours to ensure a safe delivery. Sergeant Dan Barkwill, who supervises the Evidence Control Section, met Al Burnella through a mutual friend. The two discussed the need for L.B.P.D. to have its own weapon destruction machine and they partnered to plan, design and build The Crusher. Al donated all the materials, labor and time to build the machine, which has an estimated value of approximately $20,000. This new equipment will give the department the ability to process more weapon disposals annually, and will also allow us to redirect resources used for the armed escort, conduct on-site audits, and potentially increase salvage revenue back to the department for the scrap metal incurred. The Long Beach Police Department is incredibly grateful for the time and generosity Al donated, and to the Long Beach Police Foundation who made this donation possible. The LBPF is a 501(c)(3) registered nonprofit and is the only charitable organization that provides private, direct funding for the Long Beach Police Department. The LBPF actively seeks donations from private businesses and individuals, and facilitates direct, designated donations that support our community safety mission. For more information visit www.lbpolicefoundation.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2083,https://alpha.austin.gov/en/police-oversight/policy-review-and-recommendations-8-cant-wait/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2084,https://dps.iowa.gov/marshalltown-police-department-makes-arrest-part-death-investigation,Media Bulletins,Agency-Published Resources,Marshalltown Police Department Makes Arrest as Part of Death Investigation | Iowa Department of Public Safety,"January 24, 2022 Marshalltown, Iowa - This is not a press release from the Iowa Department of Public Safety. It is being shared as a result of the Division of Criminal Investigation's assistance with this investigation.",200,Iowa Department of Public Safety | Iowa Department of Public Safety,"[""Iowa Department of Public Safety"", ""Marshalltown Police Department Makes Arrest as Part of Death Investigation""]",[],[],[],[],[],"Skip to main content Iowa Department of Public Safety Marshalltown Police Department Makes Arrest as Part of Death Investigation Chief Michael Tupper Chief of Police 641.754.5771 mtupper@marshalltown-ia.gov January 24, 2022 Marshalltown, Iowa - This is not a press release from the Iowa Department of Public Safety. It is being shared as a result of the Division of Criminal Investigation's assistance with this investigation. ABOUT THE IOWA DEPARTMENT OF PUBLIC SAFETY The Iowa Department of Public Safety (DPS) is the largest law enforcement agency in the state. It includes six divisions and several bureaus, all working together with local, state and federal government agencies and the private sector, to keep Iowa a safe place by following our core values: leadership, integrity, professionalism, courtesy, service and protection. Divisions within the Iowa DPS: Iowa Division of Criminal Investigation, Iowa Division of Narcotics Enforcement, Iowa State Patrol, Iowa State Fire Marshal Division, Iowa Division of Intelligence and Fusion Center, and Administrative Services Division. The Department of Public Safety is led by the Commissioner who is appointed by the Governor. Iowa Department of Public Safety 215 E 7th St Des Moines IA 50319 https://dps.iowa.gov Iowa Department of Public Safety Marshalltown Police Department Makes Arrest as Part of Death Investigation Chief Michael Tupper Chief of Police 641.754.5771 mtupper@marshalltown-ia.gov January 24, 2022 Marshalltown, Iowa - This is not a press release from the Iowa Department of Public Safety. It is being shared as a result of the Division of Criminal Investigation's assistance with this investigation. ABOUT THE IOWA DEPARTMENT OF PUBLIC SAFETY The Iowa Department of Public Safety (DPS) is the largest law enforcement agency in the state. It includes six divisions and several bureaus, all working together with local, state and federal government agencies and the private sector, to keep Iowa a safe place by following our core values: leadership, integrity, professionalism, courtesy, service and protection. Divisions within the Iowa DPS: Iowa Division of Criminal Investigation, Iowa Division of Narcotics Enforcement, Iowa State Patrol, Iowa State Fire Marshal Division, Iowa Division of Intelligence and Fusion Center, and Administrative Services Division. The Department of Public Safety is led by the Commissioner who is appointed by the Governor. Iowa Department of Public Safety 215 E 7th St Des Moines IA 50319 https://dps.iowa.gov " -2085,https://www.mass.gov/news/reminders-being-issued-by-massdot-eopss-massachusetts-state-police-and-transportation-partners,Media Bulletins,Agency-Published Resources,"Reminders being issued by MassDOT, EOPSS, Massachusetts State Police and Transportation Partners | Mass.gov","Drive Slower, Drive Hands-Free, ""Look Twice to save a Life"", Wear A Seatbelt",200,Mass.gov,"[""News Reminders being issued by MassDOT, EOPSS, Massachusetts State Police and Transportation Partners""]","[""Media Contact for Reminders being issued by MassDOT, EOPSS, Massachusetts State Police and Transportation Partners"", ""Media Contact for Reminders being issued by MassDOT, EOPSS, Massachusetts State Police and Transportation Partners"", ""Massachusetts Department of Transportation"", ""Media Contact for Reminders being issued by MassDOT, EOPSS, Massachusetts State Police and Transportation Partners"", ""Help Us Improve Mass.gov with your feedback""]","[""MassDOT Communications Office"", ""MassDOT Communications Office"", ""MassDOT Communications Office""]","[""Phone"", ""Phone"", ""Phone""]",[],[],"" -2086,https://southamptontownnypolice.gov/1034/2017-adopted-budget---capital,Annual & Monthly Reports,Info About Agencies,"2017 Adopted Budget - Capital | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""2017 Adopted Budget - Capital""]",[],"[""Site Tools"", ""2017 Adopted Budget - Capital"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Finance (Comptroller) 2017 Budgets 2017 Adopted Budget - Capital 2017 Adopted Budget - Capital 2017 Adopted Budget - Capital 2017 Capital Budget Adopted (PDF) 2017 Capital Project Summary (PDF) 2017 Adopted Budget - Operating 2017 Adopted Budget - Capital Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Finance (Comptroller) 2017 Budgets 2017 Adopted Budget - Capital 2017 Adopted Budget - Capital 2017 Adopted Budget - Capital 2017 Capital Budget Adopted (PDF) 2017 Capital Project Summary (PDF) 2017 Adopted Budget - Operating 2017 Adopted Budget - Capital Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -2087,https://www.foxcrossingwi.gov/departments/police-department/history/,Misc Police Activity,Police & Public Interactions,History - Fox Crossing Fox Crossing,"",200,Fox Crossing - Bridging the Fox Cities Fox Crossing,"[""""]",[],"[""History""]",[],[],"["""", ""Evolution of our patch"", """", """", ""Evolution of our badge""]","" -2088,https://rocklandmaine.gov/events/police-review-committee/,Poor Data Source,Poor Data Source,"Police Review Committee | The City of Rockland, Maine","",200,403 Forbidden,"[""Police Review Committee"", ""Police Review Committee""]",[],"[""All Current Alerts & Announcements"", ""Current Weather"", ""Date"", ""Time"", ""Location"", ""Leave a Comment Cancel reply"", ""City of Rockland""]",[],[],[],"All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Current Weather Now loading... All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Current Weather Now loading... All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Current Weather Now loading... All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! All Current Alerts & Announcements Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! Please note that the first phase of the City of Rockland’s revaluation has begun, with workers from Vision Government Solutions visiting properties for data collection. The data collector will have identification, be wearing a reflective vest, have a letter of verification from the City Assessor, and will have their car registered with the Police Department. You may also see the City Assessor, Molli Bennett, visiting properties as well! " -2089,http://www.longbeach.gov/police/press-releases/murder-1300-block-11th/,Media Bulletins,Agency-Published Resources,murder 1300 block 11th,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/1/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Thursday, March 31, 2016, at approximately 11:48 p.m., Long Beach Police responded to the 1300 block of East 11th Street to investigate a possible shooting. Arriving officers located a male who had been struck by gunfire in the upper torso. Long Beach Fire Department paramedics responded and transported the victim, in critical condition, to a local hospital where he subsequently succumbed to his injuries. The victim has been identified as 17-year-old Chad Sokhan Hang, a resident of Long Beach. No one is in custody and no suspect information is available. A motive for the shooting is unknown and the investigation remains ongoing. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detectives Donald Goodman and Mark Mattia at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2090,https://coloradosprings.gov/police-department/page/metro-crime-lab,Misc Police Activity,Police & Public Interactions,Metro Crime Lab | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Metro Crime Lab""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]","[""Chemistry"", ""Chemistry"", ""Crime Scene Investigations"", ""Crime Scene Investigations"", ""DNA"", ""DNA"", ""Firearms"", ""Firearms"", ""Latent Fingerprint Examinations"", ""Latent Fingerprint Examinations""]",[],"[""REPORT ONLINE""]",[],"" -2091,http://www.longbeach.gov/police/press-releases/dui-saturation-patrols-planned-this-weekend/,Media Bulletins,Agency-Published Resources,DUI SATURATION PATROLS PLANNED THIS WEEKEND,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2092,https://delcopa.gov/publicrelations/releases/2020/covidtesting_lansdowneaug.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Announces COVID-19 Public Testing Site in Lansdowne - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Announces COVID-19 Public Testing Site in Lansdowne""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Drive-thru and walk-up testing available for Delaware County residents on August 11, 12 and 13""]",[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County Announces COVID-19 Public Testing Site in Lansdowne Home / Departments / Public Relations Releases / Delaware County Announces COVID-19 Public Testing Site in Lansdowne Released: August 5, 2020 Drive-thru and walk-up testing available for Delaware County residents on August 11, 12 and 13 Delaware County will be offering drive-thru and walk-up COVID-19 testing for residents on August 11, 12 and 13 in Lansdowne. Residents 12 years of age and older are eligible to be tested. Critical and essential workforce—including first responders, healthcare system employees, grocery workers—and those at higher risk, including residents over the age of 65 and those with pre-existing health conditions, will be given priority. Testing will be conducted by trained medical staff utilizing a nasal swab (PCR) test kit. Testing is free of charge for residents without health insurance. There are no out-of-pocket fees or co-pays for residents with private or public health insurance. Please bring your insurance card to the testing site. Upon arrival, residents will need to complete a registration form and a consent form. Test results will take up to 5-7 business days and will be sent by mail. Residents who test positive will also receive a call from the Chester County Health Department. Residents are asked to wear a mask/face covering. Testing Information: Lansdowne Fire Company 26 N. Highland Avenue, Lansdowne, PA 19050 August 11: 10:00 AM – 4:00 PM August 12: 12:00 PM – 5:30 PM August 13: 10:00 AM – 4:00 PM Residents are asked to pre-register online at www.chesco.org/4562/delco-testing or by phone at (610) 891-6129; walk-up testing will also be available. Please note that in the event of inclement weather, testing may be canceled. For more information on testing and an interactive map with dozens of COVID-19 test sites in Delaware County, visit www.delcopa.gov/testing . Additional COVID-19 public testing sites in Delaware County will be added and announced in the coming weeks. More information on COVID-19 testing, symptoms, and resources can be found on the Delaware County website at www.delcopa.gov/ich/resources/coronavirus.html . Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play " -2093,https://balharbourfl.gov/departments/police/request-crash-report/,Accident Reports,Police & Public Interactions,Request Crash Report - Bal Harbour Residents,"",200,403 Forbidden,"[""Request Crash Report""]",[],[],[],[],[],Use the up and down arrows to select a result. Press enter to go to the selected search result. Touch device users can use touch and swipe gestures. Close Search Use the up and down arrows to select a result. Press enter to go to the selected search result. Touch device users can use touch and swipe gestures. Close Search Use the up and down arrows to select a result. Press enter to go to the selected search result. Touch device users can use touch and swipe gestures. Close Search -2094,https://spdblotter.seattle.gov/2015/04/30/barefoot-felon-ditches-stolen-car-gun-at-mcdonalds-leads-police-on-chase/,Media Bulletins,Agency-Published Resources,"Barefoot Felon Ditches Stolen Car, Gun at McDonald's, Leads Police On Chase - SPD Blotter","",200,403 Forbidden,"[""Barefoot Felon Ditches Stolen Car, Gun at McDonald’s, Leads Police On Chase""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -2095,http://www.longbeach.gov/police/press-releases/dui-drivers-license-checkpoint-planned-this-weekend-2147438636/,Media Bulletins,Agency-Published Resources,DUI-DRIVERS LICENSE CHECKPOINT PLANNED THIS WEEKEND,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2096,http://www.longbeach.gov/police/press-releases/assault-investigation-leads-to-firearm-discharge/,Media Bulletins,Agency-Published Resources,ASSAULT INVESTIGATION LEADS TO FIREARM DISCHARGE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 8/30/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: ASSAULT INVESTIGATION LEADS TO FIREARM DISCHARGE Contact: Media Relations Detail (562) 570-5273 On August 29, 2014, at approximately 10:35 p.m., Long Beach Police responded to the San Gabriel Riverbed near Pacific Coast Highway to investigate a report of a sexual assault that occurred to a 40-year-old female from Seal Beach, which resulted in the arrest of a male adult. Officers arrived at the scene and contacted the person who reported the incident, who led officers to the area where the suspect was last seen. Two officers began chasing one possible suspect, while a third officer stayed with the reporting party. When the reporting party saw the actual suspect, he pointed him out to the third officer. The suspect, who had a large pit bull, said something to the dog and then released it. The dog began approaching the officer, and the officer ordered the suspect to recall his dog numerous times; however, the suspect refused. During the confrontation, the officer discharged his firearm at the dog to protect himself and the reporting party, striking the dog. The dog then retreated, and the suspect was safely taken into custody without further incident. Animal Care Services was called and the dog was taken to a local animal hospital for treatment. The suspect has been identified as a 38-year-old Long Beach resident. He was transported and booked for a sexual related offense and is being held at the Long Beach City Jail on $100,000 bail. The incident remains under investigation by Long Beach Police Homicide Detail and Sex Crimes Unit detectives. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2097,https://alpha.austin.gov/police-oversight/2020-06-12-5/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2098,https://www.memphistn.gov/news/wpfd_file/police-services-18/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2099,http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested-2-/,Media Bulletins,Agency-Published Resources,ROBBERY SUSPECT ARRESTED(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/31/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: ROBBERY SUSPECT ARRESTED; CHARGES FILED Contact: Media Relations Detail (562) 570-5273 On March 31, 2016, felony charges were filed against a 25-year-old Long Beach man in connection with a robbery to a taxi cab driver. On March 24, 2016, at approximately 9:00 p.m., Long Beach Police were dispatched to an armed robbery in the 2300 block of East Anaheim Street. The preliminary investigation indicated that a taxi cab driver was driving in the area when the suspect, armed with a handgun, entered the taxicab and demanded the driver’s property. The suspect grabbed the driver’s cell phone, wallet and keys to the taxi, and fled on foot. Fortunately, the driver was not injured during the altercation. Through their investigation, detectives learned the incident might have been recorded via the vehicle’s onboard video system. Detectives reviewed the video and identified the suspect. On March 29, 2016, detectives arrested 25-year-old Burrell Andre Gaither in the 1000 block of Raymond Avenue. The suspect was found to be in possession of a loaded firearm. Today, the case was presented to the Los Angeles County District Attorney’s Office, which filed one count of robbery and one count of possession of a firearm against Gaither. He is being held in Long Beach City Jail without bail due to a violation of his parole conditions. An arraignment is scheduled at the Long Beach Superior Court on April 1, 2016, in Department 1. Anyone with information regarding this investigation is encouraged to call Robbery Detective Don Collier at (562) 570-5537. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . The Robbery Detail would like to remind everyone to remain aware of their surroundings at all times and report suspicious activity by calling 9-1-1. For weekly crime prevention tips, follow @LBPDrobbery on Twitter. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2100,https://delcopa.gov/sustainability/pdf/raise/ihpinterprativesignageguidelinesvoliidesignhandbook_2013.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -2101,https://directory.arkansas.gov/agency/secretary-of-state/state-capitol-police/employees/john-watt/,List of Data Sources,Info About Agencies,State Directory – Arkansas.gov,"",200,State Directory – Arkansas.gov,"[""Flag Status""]","[""Discover More"", ""Discover More"", ""Discover More"", ""Discover More"", ""What can we help you find?"", ""Search the Directories"", ""Flag Status"", """"]","[""Government Resources"", ""Business Resources"", ""Residents Resources"", ""Visiting Resources"", ""State Directory"", ""Agencies"", ""Services"", ""Employees"", ""Your Arkansas.gov"", ""Top Online Services"", ""helpful information""]","[""Was the information on this page helpful?""]",[],[],"" -2102,https://delcopa.gov/planning/pdf/programsandinitiatives/implementingenforcingfloodplainordinance.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2103,http://www.longbeach.gov/police/press-releases/traffic-fatality4/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/21/2018 FOR IMMEDIATE RELEASE Press Release # 2018 Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On January 19, 2018, at approximately 10:33 PM, officers were dispatched to the intersection of Long Beach Boulevard and Spring Street regarding an injury traffic collision involving two vehicles, which resulted in the death of a female adult. Officers arrived on scene and discovered a 2000 Ford Mustang, occupied by three males, and a 2015 Honda Civic, occupied by a male and a female, both at rest with major collision damage on Long Beach Boulevard south of the intersection. The preliminary investigation determined the Ford, being driven by a 21-year-old male resident of Compton, was traveling southbound on Long Beach Boulevard in excess of 60 MPH when it broadsided a 2015 Honda Civic, being driven by an unidentified male, turning west onto Spring Street from northbound Long Beach Boulevard. Both occupants of the Honda Civic were injured.  The female passenger, identified as a 20-year-old female from Long Beach, succumbed to her injuries and was determined deceased at the scene by Long Beach Fire Department personnel.  Her identity is being withheld pending notification of next of kin. The male driver was transported to a local area hospital with critical injuries. All the occupants of the Ford Mustang were transported to area hospitals with non-life threatening injuries. Alcohol and drug intoxication is being investigated as a contributing factor in the collision.  The investigation is ongoing. Anyone who may have information regarding this collision is asked to call Long Beach Police Collision Investigation Detective David Whelan at (562) 570-7355. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2104,https://www.southamptontownnypolice.gov/agendacenter,Not Criminal Justice Related,Not Criminal Justice Related,"Agenda Center • Southampton, NY • CivicEngage","",200,"Police | Southampton, NY - Official Website","[""Agenda Center""]","[""▼ Conservation Board"", ""▼ Hampton Bays CAC"", ""▼ Landmarks & Historic Districts Board"", ""▼ LRB - Licensing Review Board Agenda"", ""▼ North Sea CAC"", ""▼ Road Review Committee"", ""▼ Trustees"", ""▼ Water Mill CAC"", ""▼ Zoning Board of Appeals""]","[""Site Tools"", ""Tools"", ""Search Agendas by:"", ""Contact Us"", ""Site Links"", ""Loading""]","[""Mar 27, 2024 — Posted Mar 27, 2024 7:00 PM"", ""Mar 13, 2024 — Amended Mar 13, 2024 10:50 AM"", ""Feb 21, 2024 — Posted Feb 21, 2024 7:00 PM"", ""Feb 7, 2024 — Posted Feb 7, 2024 7:00 PM"", ""Jan 24, 2024 — Amended Jan 23, 2024 9:45 AM"", ""Jan 10, 2024 — Amended Jan 9, 2024 3:13 PM"", ""Sep 23, 2021 — Amended Sep 22, 2021 7:41 AM"", ""Mar 19, 2024 — Posted Mar 19, 2024 8:01 AM"", ""Feb 20, 2024 — Posted Feb 12, 2024 4:48 PM"", ""Jan 16, 2024 — Posted Jan 10, 2024 12:38 PM"", ""Jun 8, 2022 — Posted Jun 15, 2022 11:58 AM"", ""May 11, 2022 — Posted May 11, 2022 12:21 PM"", ""Apr 13, 2022 — Posted Apr 13, 2022 3:39 PM"", ""Mar 9, 2022 — Posted Mar 9, 2022 11:54 AM"", ""Feb 9, 2022 — Posted Feb 9, 2022 11:54 AM"", ""Jan 12, 2022 — Amended Jan 19, 2022 12:12 PM"", ""Dec 17, 2021 — Posted Dec 9, 2021 11:33 AM"", ""Feb 14, 2023 — Posted Feb 13, 2023 3:20 PM"", ""Jan 10, 2023 — Posted Jan 9, 2023 9:35 AM"", ""Mar 18, 2024 — Posted Mar 25, 2024 12:57 PM"", ""Mar 18, 2024 — Posted Mar 25, 2024 12:57 PM"", ""Mar 4, 2024 — Posted Mar 25, 2024 12:55 PM"", ""Mar 4, 2024 — Posted Mar 25, 2024 12:56 PM"", ""Feb 12, 2024 — Posted Mar 25, 2024 12:53 PM"", ""Feb 12, 2024 — Posted Mar 25, 2024 12:54 PM"", ""Jan 22, 2024 — Posted Jan 18, 2024 4:15 PM"", ""Jan 22, 2024 — Posted Jan 18, 2024 4:16 PM"", ""Jan 8, 2024 — Posted Jan 5, 2024 7:58 AM"", ""Apr 10, 2023 — Posted Mar 27, 2023 12:17 PM"", ""Mar 21, 2024 — Posted Mar 14, 2024 12:50 PM"", ""Mar 7, 2024 — Posted Mar 7, 2024 1:57 PM"", ""Feb 15, 2024 — Posted Feb 12, 2024 3:54 PM"", ""Feb 1, 2024 — Posted Jan 30, 2024 11:31 AM"", ""Jan 18, 2024 — Posted Jan 12, 2024 4:02 PM"", ""Jan 4, 2024 — Posted Jan 3, 2024 2:42 PM""]",[],[],Skip to Main Content -2105,http://police.portlandmaine.gov/499/cemeteries,Not Criminal Justice Related,Not Criminal Justice Related,"Cemeteries | Portland, ME - Official Website",The history of a town or city can be traced through their cemeteries - Portland's cemeteries are a fine example of this.,200,"Portland, ME - Official Website | Official Website","[""Cemeteries""]",[],[],[],[],[],"Skip to Main Content Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities Places Cemeteries Cemeteries Evergreen Cemetery Evergreen Cemetery Interactive Map Forest City Cemetery Historic Cemeteries Wilde Memorial Chapel Government Websites by CivicPlus® Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities Places Cemeteries Cemeteries Evergreen Cemetery Evergreen Cemetery Interactive Map Forest City Cemetery Historic Cemeteries Wilde Memorial Chapel Government Websites by CivicPlus® Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities Places Cemeteries Cemeteries Evergreen Cemetery Evergreen Cemetery Interactive Map Forest City Cemetery Historic Cemeteries Wilde Memorial Chapel Government Websites by CivicPlus® Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities Places Cemeteries Cemeteries Evergreen Cemetery Evergreen Cemetery Interactive Map Forest City Cemetery Historic Cemeteries Wilde Memorial Chapel Government Websites by CivicPlus® Places Programs Venues About Us Home Your Government Departments Parks, Recreation & Facilities Places Cemeteries Cemeteries Evergreen Cemetery Evergreen Cemetery Interactive Map Forest City Cemetery Historic Cemeteries Wilde Memorial Chapel Home Your Government Departments Parks, Recreation & Facilities Places Cemeteries Cemeteries Evergreen Cemetery Evergreen Cemetery Interactive Map Forest City Cemetery Historic Cemeteries Wilde Memorial Chapel Home Your Government Departments Parks, Recreation & Facilities Places Cemeteries Cemeteries Evergreen Cemetery Evergreen Cemetery Interactive Map Forest City Cemetery Historic Cemeteries Wilde Memorial Chapel Home Your Government Departments Parks, Recreation & Facilities Places Cemeteries Cemeteries Home Your Government Departments Parks, Recreation & Facilities Places Cemeteries Cemeteries Home Your Government Departments Parks, Recreation & Facilities Places Cemeteries Cemeteries Cemeteries Evergreen Cemetery Evergreen Cemetery Interactive Map Forest City Cemetery Historic Cemeteries Wilde Memorial Chapel Evergreen Cemetery Evergreen Cemetery Interactive Map Forest City Cemetery Historic Cemeteries Wilde Memorial Chapel Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® " -2106,http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-three-arrests2/,Media Bulletins,Agency-Published Resources,DUI Checkpoint Nets Three Arrests(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 8/22/2017 FOR IMMEDIATE RELEASE Press Release # Subject: DUI CHECKPOINT NETS THREE ARRESTS Contact: Media Relations Detail (562) 570-5273 The L.B.P.D.’s Traffic Section conducted a DUI/Driver’s License checkpoint on Friday, August 18th on Pacific Coast Highway south of 2nd Street between the hours of 6:00 p.m. and 2:00 a.m. Checkpoints are placed in locations that have the greatest opportunity for achieving drunk and drugged driving deterrence and provide the greatest safety for officers and the public. In recent years, California has seen a disturbing increase in drug-impaired driving crashes. The L.B.P.D. supports the new effort from the Office of Traffic Safety that aims to educate all drivers that “DUI Doesn’t Just Mean Booze.” If you take prescription drugs, particularly those with a driving or operating machinery warning on the label, you might be impaired enough to get a DUI. Marijuana can also be impairing, especially in combination with alcohol or other drugs, and can result in a DUI. Studies of California drivers have shown that 30 percent of drivers in fatal crashes had one or more drugs in their systems. A study of active drivers showed more tested positive for drugs that may impair driving (14 percent) than did for alcohol (7.3 percent). Of the drugs, marijuana was most prevalent, at 7.4 percent, slightly more than alcohol. Below are statistics related to Saturday’s checkpoint: 324 vehicles screened 2 DUI-alcohol arrests 1 outstanding warrant arrest 4 drivers cited for unlicensed driving 11 traffic citations issued Drivers are encouraged to download the Designated Driver VIP, or “DDVIP,” free mobile app for Android or iPhone. The DDVIP app helps find nearby bars and restaurants that feature free incentives for the designated sober driver, from free non-alcoholic drinks to free appetizers and more. The feature-packed app even has social media tie-ins and even a tab for the non-DD to call Uber, Lyft or Curb. Drivers caught driving impaired can expect the impact of a DUI arrest to include jail time, fines, fees, DUI classes, license suspension, and other expenses that can exceed $10,000 not to mention the embarrassment when friends and family find out. The L.B.P.D. will be conducting another DUI/Driver’s License Checkpoint on Friday, September 15th in our ongoing commitment to lower deaths and injuries upon our streets and highways. The checkpoint was funded by a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration, reminding everyone to ‘Report Drunk Driver – Call 9-1-1’. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2107,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/052721summary.pdf,Dispatch Logs,Police & Public Interactions,"","",404,"","","","","","","","" -2108,https://bolivar.mo.us/shop-with-a-copr/p1018068/,Not Criminal Justice Related,Not Criminal Justice Related,"P1018068 - City of Bolivar, Missouri","",200,"Welcome to Bolivar - Where Liberty Flows - City of Bolivar, Missouri","[""P1018068""]",[],[],[],[],[],"Skip to content DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us P1018068 Home Departments Police Shop with a Cop® P1018068 12 Dec 2014 by City Administrator WordPress Theme - Total by HashThemes DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us DEPARTMENTS ADMINISTRATION MUNICIPAL COURT PARKS & RECREATION New Parks & Recreation registration site COMMUNITY DEVELOPMENT BUILDING DEPARTMENT CODE ENFORCEMENT DEPARTMENT PLANNING & ZONING DEVELOPER FORMS MS4: Municipal Separate Storm Sewer System FINANCIAL, BUDGET & CURRENT BIDS HUMAN RESOURCES CAREER OPPORTUNITIES UTILITIES FIRE DEPARTMENT PERSONNEL FIRE STATIONS APPARATUS FIRE DEPARTMENT FORMS POLICE DEPARTMENT EMERGENCY MANAGEMENT ANIMAL POUND PUBLIC WORKS ECONOMIC DEVELOPMENT PARTNERSHIP COVID-19 FINANCIAL RELIEF ECONOMIC DEVELOPMENT LINKS BOARD OF ALDERMEN AGENDAS/PACKETS/MINUTES REQUEST TO ADDRESS COUNCIL ORDINANCES HOW DO I.. RESERVE PARK PAVILIONS/ ROOMS MUNICIPAL COURT Contact Us P1018068 Home Departments Police Shop with a Cop® P1018068 12 Dec 2014 by City Administrator P1018068 Home Departments Police Shop with a Cop® P1018068 P1018068 Home Departments Police Shop with a Cop® P1018068 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator 12 Dec 2014 by City Administrator WordPress Theme - Total by HashThemes WordPress Theme - Total by HashThemes WordPress Theme - Total by HashThemes " -2109,http://www.longbeach.gov/police/press-releases/murder-investigation---atlantic-ave.-and-south-st/,Media Bulletins,Agency-Published Resources,*UPDATE* MURDER INVESTIGATION - ATLANTIC AVE. AND SOUTH ST.,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2110,https://www.antioch.il.gov/wpfb_file_category/commissions-police-pension-fund-agendas-2011-commissions-police-pension-fund-agendas-commissions-police-pension-fund-commissions-commissions-police-pension-fund/,List of Data Sources,Info About Agencies,"2011 - Antioch, IL","",200,"Home - Antioch, IL","[""Archives: 2011""]",[],"[""12-13-11 Police Pension Fund Agenda"", ""12-13-11 Police Pension Fund Agenda"", ""06-29-11 Police Pension Fund Agenda"", ""06-29-11 Police Pension Fund Agenda"", ""04-12-11 Police Pension Fund Agenda"", ""04-12-11 Police Pension Fund Agenda"", ""09-09-11 Police Pension Fund Agenda""]",[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -2111,https://delcopa.gov/planning/mapping/custommaprequests.html,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -2112,http://www.longbeach.gov/police/press-releases/second-warrant-clearing-event/,Media Bulletins,Agency-Published Resources,SECOND WARRANT CLEARING EVENT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/8/2018 FOR IMMEDIATE RELEASE Press Release # Subject: SECOND WARRANT CLEARING EVENT Contact: Media Relations Detail (562) 570-5273 In an effort to address the numerous misdemeanor warrants currently in the system, the Long Beach Police Department will be holding a second warrant clearing event next week for non-violent offenses. Anyone with an outstanding traffic or non-violent misdemeanor warrant, issued by the Long Beach Police Department, is encouraged to come to the event. Individuals will be issued a notice to appear document with a new court date, so they can take care of their original violation, without fear of arrest. The outstanding arrest warrant for the original charge will be removed from the warrant system. During the September 15th event, 132 individuals showed up to handle their outstanding warrants. Of the 132 individuals, 73 had traffic or eligible nonviolent misdemeanor warrants and were issued a new notice to appear. Several of those individuals had multiple warrants, clearing a total of 99 warrants from the system. The remaining 59 individuals either did not have warrants, or had warrants issued from other agencies. No one was arrested during the event. “We were very encouraged by the turnout at the first warrant clearing event, which confirmed for us the need to hold more,” stated Detective Division Commander Paul LeBaron. “It became apparent that many residents are willing to resolve their warrants, and we are pleased we are able to provide them another opportunity to do so.” The event will be held as follows: Date: Wednesday, November 14, 2018 Time: 1:00 – 6:00 p.m. Location: Scherer Park - parking lot on the north side (near Del Amo Boulevard & Atlantic Avenue) Please note, the following warrants are NOT eligible for a citation release: Felonies The misdemeanor cited in the warrant involves violence (including domestic), a firearm, or resisting arrest The misdemeanor cited in the warrant involves a violation of a restraining, protective, or stay-away order This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2113,https://delcopa.gov/publicrelations/releases/2020/earthday.html,Not Criminal Justice Related,Not Criminal Justice Related,"Celebrating the 50th Anniversary of Earth Day in Delco - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Celebrating the 50th Anniversary of Earth Day in Delco""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Ways to celebrate and participate in Earth Day amid the COVID-19 Pandemic""]",[],[],"" -2114,https://www.antiochca.gov/police/oes/,Resources,Agency-Published Resources,"Disaster Preparedness – City of Antioch, California","",200,"City of Antioch, California",[],"[""Contact Info""]","[""Office of Emergency Services (OES)""]","[""Send Message"", ""Disaster Preparedness"", """"]","[""Brian Addington"", ""Acting Chief of Police"", ""Captain Morefield"", ""Field Services"", ""Lt. Mellone"", ""Professional Standards"", ""Cert: Citizens Emergency Response Team""]",[],"" -2115,https://www.naperville.il.us/services/naperville-police-department/programs-and-services/internship-program/,Training & Hiring Info,Info About Officers,Internship Program | The City of Naperville,"The NPD Internship Program provides an inclusive, high-quality, safe and advanced educational experience for qualified individuals considering a career in the field of law enforcement.",200,Home | The City of Naperville,"[""Internship Program""]","[""Programs and Services"", ""Mission Statement"", ""Intern Testimonials"", ""Naperville Police Department""]","[""Explore""]",[],"[""Helping Residents Build a Better Community"", ""Resources for Doing Business in Naperville""]",[],"Menu Search Menu Search Search Main Menu Navigation About Naperville + An Award-Winning Community Demographics and Key Facts Education Historic Preservation in Naperville Projects in Naperville Transportation and Parking Townships Government + Boards and Commissions City Leadership Team City Finances Annual Budget and Financial Reports Purchasing and Bids Taxes and Financial Forms Utility Services and Billing General Billing Water Street TIF District Coronavirus Resources Diversity, Equity and Inclusion A Community of Belonging DEI Defined DEI Timeline Youth Involvement Embracing Community Environmental Sustainability in Naperville Grants Meetings and Agendas Legislative Priorities Meeting Room Reservations Meet Your City Council Mayor Scott A. Wehrli Councilman Ian Holzhauer Councilman Patrick Kelly Councilman Paul Leong Councilwoman Allison Longenbaugh Councilman Josh McBroom Councilwoman Jennifer Bruzan Taylor Councilman Dr. Benjamin M. White Councilman Nate Wilson Municipal Center Municipal Code Open Data Proclamations Strategic Plan Task Forces Voting and Voter Registration Services + Brush, Leaf & Yard Waste Curbside Bulk Brush Collection Leaf Collection Yard Waste Collection Electric Utility Your Electric Service Electrical Safety Powering Our Community for the Future FOIA Request Garbage and Recycling Residential Garbage Collection Garbage Carts Curbside Recycling Program Recycling Carts Recycling Drop-Off Center Household Hazardous Waste Facility Electronics Recycling Holiday Lights Recycling Naperville Fire Department About the Fire Department Emergency Preparedness Inspections and Permits Programs and Services Safety and Public Education Naperville Police Department About the Police Department Programs and Services Community Education and Crime Prevention Office of the Chief of Police Investigations Division Patrol Division Join NPD Permits and Licenses Senior Services and Resources Services and Resources for People with Disabilities Snow and Ice Removal Snow Plowing and Salting Mailboxes and Parkway Sod Winter Updates Water/Wastewater Utility Your Water Service Maintaining Our System Common Water Issues Residents + Helping Residents Build a Better Community You can find a collection of city information relevant to everyone in Naperville, from new residents to long-time community members. Go to this section Businesses + Resources for Doing Business in Naperville Whether you're starting, running or visiting a Naperville business - find resources to help you. Go to this section Enjoy Naperville + Biking Maps, Guides and Plans Commander Dan Shanower September 11 Memorial Explore the Community Festivals and Parades Millennium Wall Naperville Community Concert Center Naperville Riverwalk Naper Settlement & Homestead Von Oven Scout Reservation Walks and Runs + + + + Helping Residents Build a Better Community You can find a collection of city information relevant to everyone in Naperville, from new residents to long-time community members. Go to this section + Resources for Doing Business in Naperville Whether you're starting, running or visiting a Naperville business - find resources to help you. Go to this section + " -2116,https://www.antioch.il.gov/wpfb-file/11-02-16-police-pension-agenda-pdf-3/,Poor Data Source,Poor Data Source,"11-02-16 Police Pension Agenda - Antioch, IL",10564 11 02 16 police pension agenda pdf commissions fund agendas 2016 1477667300 c4564de1e4399e021859da3cf353db29 213x300 _yl6booqzxldd thumb jpg 10 28 08 20 0 pdf application trustees mary c dominiak ed macek jerry t johnson scott a pierce jay jozwiak ted p poulos lawrence m hanson mayor lori k romine village clerk agenda of antioch lake,200,"Home - Antioch, IL","[""11-02-16 Police Pension Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -2117,https://police.crystalmn.gov/how_do_i_/report_an_issue/street_light_outage,Not Criminal Justice Related,Not Criminal Justice Related,Xcel Energy,"",200,Just a moment...,[],[],[],[],[],[],"Loading × Sorry to interrupt This page has an error. You might just need to refresh it. -Uncaught error in $A.run() [Unexpected token .] Refresh × Sorry to interrupt This page has an error. You might just need to refresh it. -Uncaught error in $A.run() [Unexpected token .] Refresh This page has an error. You might just need to refresh it. -Uncaught error in $A.run() [Unexpected token .] Refresh " -2118,https://www.gurnee.il.us/government/departments/police-department/community-involvement/gurnee-citizen-police-academy/gurnee-citizen-police-academy/week-12,Training & Hiring Info,Info About Officers,Gurnee Citizen Police Academy,"",200," - Village of Gurnee -","[""Police Department""]","[""Gurnee Citizen Police Academy"", ""Youth Citizen Police Academy""]","[""Now accepting applications for the Spring 2024 session!"", ""Click here to register for the Gurnee Citizen Police Academy"", ""Village Hall""]",[],[],[],search edit file-word file-empty angle-left angle-right angle-up angle-down dollar calendar-check-o printer search2 briefcase circle-up circle-right circle-down circle-left share2 mail4 facebook twitter youtube file-pdf search edit file-word file-empty angle-left angle-right angle-up angle-down dollar calendar-check-o printer search2 briefcase circle-up circle-right circle-down circle-left share2 mail4 facebook twitter youtube file-pdf -2119,https://biloxi.ms.us/police-fire-showcase-is-saturday-at-point-cadet/,Not Criminal Justice Related,Not Criminal Justice Related,"Police, fire showcase is Saturday at Point Cadet","",200,City of Biloxi | The Official Website of the City of Biloxi,"[""Police, fire showcase is Saturday at Point Cadet""]",[],[],[],[],[],"" -2120,https://www.southamptontownnypolice.gov/faq.aspx?qid=413,Resources,Agency-Published Resources,FAQs • How will you alert the public on updates on beach dri,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Trustees - Endangered Species""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2121,http://www.longbeach.gov/police/press-releases/traffic-fatality-3-/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY(3),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/20/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: TRAFFIC FATALITY Contact: Media Relations (562) 570-5273 On Friday, June 20, 2014, at approximately 9:25 a.m., Long Beach Police responded to the intersection of Willow Street and Webster Avenue regarding an injury traffic collision. Arriving officers discovered a 2009 Mini Cooper on it’s side, a 2003 Acura TL with major front-end damage and a parked 1995 Honda Civic with major rear-end damage. The Mini Cooper was occupied by the driver and one passenger who both sustained injuries. Long Beach Fire Department personnel transported the driver and passenger to a local hospital. The driver, a 62-year-old resident of Carson, is in stable condition. The passenger, identified as 60-year-old long beach resident Chanpisey Meas, was pronounced deceased at the hospital. The Acura TL was occupied by only the driver, a 22-year-old resident of Carson, who sustained minor injuries. The parked Honda Civic was unoccupied. The preliminary investigation revealed that the Acura TL was traveling eastbound on Willow Street. The Mini Cooper was traveling westbound on Willow Street and attempted to make a left turn onto southbound Webster Avenue. The Mini Cooper was broadsided by the Acura TL, causing the Mini Cooper to turn on it's side, sliding into a light pole and then into the parked Honda Civic. The driver of the Acura TL was interviewed and released at the scene. The driver of the Mini Cooper was interviewed and released. The investigation remains ongoing. Anyone with information regarding this collision is asked to call Long Beach Police Department Collision Investigation Detail Detective Brain Watt at (562) 570-5520. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2122,http://www.longbeach.gov/police/press-releases/---located----critical-missing-person/,Media Bulletins,Agency-Published Resources,---LOCATED--- CRITICAL MISSING PERSON,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/25/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: ---LOCATED--- CRITICAL MISSING PERSON Contact: Media Relations (562) 570-5273 (Click on photo to enlarge) April 25, 2014 Update: Mr. Frank Kuborek, who was reported missing yesterday, April 24, 2014, was located at a hospital in the 4800 block of W. Sunset Blvd in Los Angeles and is now safe. The Long Beach Police Department is asking for the public’s help in locating an elderly man who suffers from dementia and walked away from his home located in the 700 block of Alamitos Avenue. The victim was last seen at his home on Thursday, April 24th, 2014, at approximately 4:00 p.m., and was reported missing later in the day. The victim is known to frequent the area around downtown Long Beach and is usually seen wearing a band-aid across his nose. The Victim is described as follows: Name: FRANK KUBOREK Age: 89-YEARS Gender: MALE Race: WHITE Hair/Eyes: GREY/BLUE Height: 5’9” Weight: 150 Clothing: RED BASEBALL HAT WITH ""A,"" BLACK JACKET, YELLOW SHIRT AND PANTS The Long Beach Police Department continues to search for the victim. Local hospitals have been alerted and area law enforcement and public transportation agencies have also been notified. Anyone sees the victim or has information on her whereabouts is asked to call the Long Beach Police Department at (562) 435-6711 or 9-1-1. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2124,https://www.mass.gov/event/police-standards-subcommittee-open-meeting-2022-07-12t090000-0400-2022-07-12t100000-0400,Media Bulletins,Agency-Published Resources,Police Standards Subcommittee Open Meeting | Mass.gov,"",200,Mass.gov,"[""Public Hearing Notice Police Standards Subcommittee Open Meeting""]","[""Address"", ""Overview of Police Standards Subcommittee Open Meeting"", ""Additional Resources for Police Standards Subcommittee Open Meeting"", ""Participating Organizations"", ""Help Us Improve Mass.gov with your feedback""]","[""Agenda""]",[],[],[],"" -2125,https://www.hayward-ca.gov/discover/news/jul22/police-blotter-july-10-16-2022,Media Bulletins,Agency-Published Resources,"Police Blotter - July 10-16, 2022 | City of Hayward - Official website","STATISTICAL HIGHLIGHTSJuly 10-16, 2022 Weekly Arrests (Includes cite/released):66 Homicide 0Weekly Calls for Service: 1,968 Assault—Great Bodily Injury 5Weekly Reports Taken:230 Burglary— Non Residential 10Weekly Complaints(against HPD):2 Burglary—Residential 1Weekly Calls Received:5,644 Larceny 26This data is subject to change and based on crimes that were re-ported to have",200,City of Hayward - Official website,"[""Police Blotter - July 10-16, 2022""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form"", ""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment""]",[],"[""STATISTICAL HIGHLIGHTS"", ""July 10-16, 2022"", """", """", """", ""CASE SYNOPSIS"", ""Do you need help paying energy bills? You may qualify for federal aid."", ""Hayward Receives Grant for Safe Routes to Schools Infrastructure and Bicycle Incentives"", ""Hayward Celebrates Earth Day at Weekes Park!"", ""Spring 2024 Compost Giveaway"", ""Sustainable Solutions for Celebrating Easter"", ""City Hall and Nonessential Services Closure: Monday, Apr. 01, 2024"", ""Presidential Primary Election: Tuesday, Mar. 5, 2024"", ""Library Closure: February 12 and February 19, 2024."", ""City Hall and Nonessential Services Closures: Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""YOU ARE HERE. SO IS EVERYTHING ELSE."", ""Related News"", ""Police Blotter - February 25-March 2, 2024"", ""Weekly Blotter - February 18-24, 2024"", ""Police Blotter - February 11-17, 2024"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],Skip to main content -2126,https://dps.iowa.gov/former-pleasantville-police-officer-charged-sexual-abuse-minor,Media Bulletins,Agency-Published Resources,Former Pleasantville Police Officer Charged With Sexual Abuse of Minor | Iowa Department of Public Safety,"November 16, 2021 DES MOINES, Iowa - On November 12, 2021, at the request of the Pleasantville Police Department, Division of Criminal Investigation agents began a criminal investigation into allegations of sexual contact between a then-police officer with the Pleasantville Police Department and a 15-year-old juvenile. ",200,Iowa Department of Public Safety | Iowa Department of Public Safety,"[""Iowa Department of Public Safety"", ""Former Pleasantville Police Officer Charged With Sexual Abuse of Minor""]",[],[],[],[],[],"Skip to main content Iowa Department of Public Safety Former Pleasantville Police Officer Charged With Sexual Abuse of Minor Adam DeCamp Special Agent In Charge 515.250.4912 decamp@dps.state.ia.us November 16, 2021 DES MOINES, Iowa - On November 12, 2021, at the request of the Pleasantville Police Department, Division of Criminal Investigation agents began a criminal investigation into allegations of sexual contact between a then-police officer with the Pleasantville Police Department and a 15-year-old juvenile. On November 15, members of the Department of Public Safety arrested Alec Veatch, 24, at his Norwalk home. Veatch was charged with one count each of Sexual Abuse in the Third Degree, Lascivious Acts with a Minor, and Enticing a Minor. Veatch was transported to the Jasper County Jail on a $17,000 bond. He has since posted bond and has been released. This is an on-going criminal investigation. Additional charges will be filed. Anyone with information concerning this investigation is asked to contact the DCI at 515.725.0030. Code of Iowa: 709.4 – Sexual Abuse in the Third Degree - Class C Felony Code of Iowa: 709.14(4) – Lascivious Acts with a Minor – Aggravated Misdemeanor Code of Iowa: 710.10(2) – Enticing a Minor – Class D Felony A charge is merely an accusation. A defendant is considered innocent unless and until proven guilty by a court of law. Complaint and Affidavit – Sexual Abuse in the Third Degree – Class C Felony Complaint and Affidavit – Lascivious Acts with a Minor – Aggravated Misdemeanor Complaint and Affidavit – Enticing a Minor – Class D Felony PHOTO: Alec Veatch ABOUT THE IOWA DEPARTMENT OF PUBLIC SAFETY The Iowa Department of Public Safety (DPS) is the largest law enforcement agency in the state. It includes six divisions and several bureaus, all working together with local, state and federal government agencies and the private sector, to keep Iowa a safe place by following our core values: leadership, integrity, professionalism, courtesy, service and protection. Divisions within the Iowa DPS: Iowa Division of Criminal Investigation, Iowa Division of Narcotics Enforcement, Iowa State Patrol, Iowa State Fire Marshal Division, Iowa Division of Intelligence and Fusion Center, and Administrative Services Division. The Department of Public Safety is led by the Commissioner who is appointed by the Governor. Iowa Department of Public Safety 215 E 7th St Des Moines IA 50319 https://dps.iowa.gov " -2127,http://www.longbeach.gov/police/press-releases/arrests-made-in-illegal-firework-investigation/,Media Bulletins,Agency-Published Resources,ARRESTS MADE IN ILLEGAL FIREWORK INVESTIGATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/15/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: ARRESTS MADE IN ILLEGAL FIREWORK INVESTIGATION Contact: Media Relations Detail (562) 570-5273 CLICK PHOTO FOR LARGER IMAGE On Monday, June 12, 2017, South Division Directed Enforcement officers, with the assistance of West Division patrol officers, conducted an investigation into the sale and possession of illegal fireworks in the City of Long Beach, which resulted in the confiscation of approximately $2,500 worth of high powered fireworks and the arrest of three male adults. Officers located an online advertisement regarding illegal fireworks that were available for sale. Through the course of the investigation, officers responded to the 4400 hundred block of Myrtle Avenue, where contact was made with the individuals selling fireworks. The fireworks were confiscated and three adult males were taken into custody. The suspects are identified as: Name:                    Age:     Residence:     Charges: Marco Delgado        18        Carson            Possession of fireworks Christian Chacon     25        Long Beach    Possession of fireworks Sandro Perez          33        Carson            Possession of fireworks The Long Beach Police Department encourages those celebrating the 4th of July holiday to do so in a safe and responsible manner. We are reminding residents and visitors that all fireworks, including those marked “Safe and Sane,” are illegal in the City of Long Beach. Violators may be cited and/or arrested and faced with a $1,000 fine, sentenced to jail for six months, or both. The fines and penalties may increase depending on the fireworks’ classification. Fireworks may be voluntarily disposed of at collection bins located at all fire stations, Lifeguard Headquarters from 8:00am-8:00pm (2100 E. Ocean Boulevard, on the West side of the Junipero lot), or any police station. If you or your neighbor would like flyers, posters, or yard signs to post in your home/neighborhood you can pick them up at Fire Headquarters (3205 Lakewood Blvd.) starting June 12, 2017 to July 3, 2017 from 7:30am-4:30pm or at the Neighborhood Resource Center (100 W. Broadway, Suite 550) starting June 12, 2017 to July 3, 2017 from 8:00am-5:00pm. You can also call and reserve them from the Neighborhood Resource Center at (562)570-1010. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2128,http://www.longbeach.gov/police/press-releases/traffic-fatality--cherry-ave---cherry-circle/,Media Bulletins,Agency-Published Resources,Traffic Fatality (Cherry Ave & Cherry Circle,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/7/2016 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Wednesday, July 6, 2016, at approx.10:26 p.m., Long Beach Police were dispatched to the intersection of Cherry Avenue and Market Street regarding an attempt suicide call, where a female was reported to be walking in the middle of the street into traffic. The female was ultimately struck by a vehicle, which resulted in her death. When officers arrived, they discovered a female laying in the northbound # 1 lane of traffic on Cherry Avenue at Cherry Avenue Industrial Circle. A passerby had begun administering life saving measures on the victim, which officers continued until Long Beach Fire Department paramedics arrived. The female sustained serious injuries, was transported to a local hospital by paramedics, and listed in critical condition. This afternoon, July 7, 2016, the L.B.P.D. received notification the victim had been pronounced deceased. The investigation determined the female had run into traffic and was struck by a 2004 Nissan 350Z travelling north on Cherry Avenue. Through further investigation, it was learned the victim had gone to a location in the area to see an acquaintance, was distraught, and made comments about running into traffic. Before the acquaintance could take any action, the victim left the location, ran into the street, and was struck. The victim’s identity will be released by the Los Angeles County Coroner’s Office. The driver of the Nissan was uninjured, interviewed at the scene, and released. Anyone who may have witnessed the incident is asked to contact the L.B.P.D.’s Collison Investigation Detail at (562) 570-7355. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2129,https://www.hayward-ca.gov/discover/news/jul21/police-blotter-june-27-july-3-2021,Media Bulletins,Agency-Published Resources,"Police Blotter: June 27-July 3, 2021 | City of Hayward - Official website","STATISTICAL HIGHLIGHTSJune 27-July 3, 2021 Weekly Arrests (Includes cite/released):33 Homicide 0Weekly Calls for Service: 2,167 Assault—Great Bodily Injury 1Weekly Reports Taken:195 Burglary— Nonresidential 4Weekly Complaints(against HPD):0 Burglary—Residential 26Weekly Calls Received:6,325 Theft 26This data is subject to change and based on crimes that were reported to have",200,City of Hayward - Official website,"[""Police Blotter: June 27-July 3, 2021""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form"", ""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment""]",[],"[""STATISTICAL HIGHLIGHTS"", ""June 27-July 3, 2021"", """", """", """", ""Significant Incidents"", ""Do you need help paying energy bills? You may qualify for federal aid."", ""Hayward Receives Grant for Safe Routes to Schools Infrastructure and Bicycle Incentives"", ""Hayward Celebrates Earth Day at Weekes Park!"", ""Spring 2024 Compost Giveaway"", ""Sustainable Solutions for Celebrating Easter"", ""City Hall and Nonessential Services Closure: Monday, Apr. 01, 2024"", ""Presidential Primary Election: Tuesday, Mar. 5, 2024"", ""Library Closure: February 12 and February 19, 2024."", ""City Hall and Nonessential Services Closures: Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""YOU ARE HERE. SO IS EVERYTHING ELSE."", ""Related News"", ""Police Blotter - February 25-March 2, 2024"", ""Weekly Blotter - February 18-24, 2024"", ""Police Blotter - February 11-17, 2024"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],Skip to main content -2130,http://lafayettepolice.us/3404/census-2020,Not Criminal Justice Related,Not Criminal Justice Related,"Census 2020 | Lafayette, IN - Official Website","Everything you need to know about the United States 2020 Census, including why everyone should fill out the census, how to do it, and how the information is used.",200,"Police Department | Lafayette, IN - Official Website","[""Census 2020"", ""The Census: Your Response Matters!"", ""CENSUS IS HIRING IN GREATER LAFAYETTE!""]","[""Health clinics. Fire departments. Schools. Even roads and highways. The census can shape many different aspects of your community."", ""Learn more about the Census and why it’s so important""]","[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home Government Departments A - F City Clerk Census 2020 Census 2020 The Census: Your Response Matters! Health clinics. Fire departments. Schools. Even roads and highways. The census can shape many different aspects of your community. Check back for a link to complete your form online! CENSUS IS HIRING IN GREATER LAFAYETTE! The U.S. Census Bureau is actively recruiting people for a variety of temporary jobs in Tippecanoe County, including census takers, recruiting assistants, and more. Candidates must complete an online job application. The application includes assessment questions about your education, work, and other experience. Qualified candidates must be at least 18 years of age and pass a background check. For more information, please visit: 2020 Census Jobs or call 1-855-JOB-2020. Learn more about the Census and why it’s so important Video: What is the 2020 Census? Video: How Will 2020 Census Data Be Used? Video: How Does the 2020 Census Affect Representation? Video: How Do I Take the 2020 Census? Video: Is My 2020 Census Data Safe? Factsheet: Census Safety and Security Factsheet: Census Confidentiality ACCESS LOCAL DATA Learn about our community, county, state and the U.S. Census 2020 Community Gardens Bid Opportunities / Public Notices Documents Board of Works City Code Environmental Finance Board Forms Joint Purchasing Board Lafayette Flag Notice to Bidders Youth Council Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -2131,"https://norfolkne.gov/government/departments/police-division/press-releases/july-11,-2021-press-release.html",Media Bulletins,Agency-Published Resources,"July 19, 2021 Press Release - City of Norfolk, NE","",200,"Welcome to Norfolk, NE - City of Norfolk, NE","[""City of Norfolk, NE"", ""Police Division"", ""July 19, 2021 Press Release"", ""City of Norfolk, NE""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]","" -2132,https://www.mass.gov/doc/draft-scope-of-work-2016-cd-debris-industry-study/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2133,http://www.longbeach.gov/police/press-releases/shooting-200-block-of-artesia/,Media Bulletins,Agency-Published Resources,Shooting 200 block of Artesia,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/2/2017 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: SHOOTING - 200 BLOCK OF E. ARTESIA BLVD. Contact: Media Relations Detail (562) 570-5273 On January 2, 2017 around 5:15 - a.m., officers were dispatched to the 200 Block of East Artesia Boulevard - regarding a shooting that had just occurred. Upon arrival -officers located a male adult subject that was suffering from gunshot wounds - to his upper torso. A resident who was responsible for the shooting remained - at the scene and was being detained by officers while they conducted their -investigation. The incident is preliminarily being investigated as a burglary -that was occurring, that resulted in the resident shooting the subject in -self-defense. The Long Beach Fire Department responded and -transported the subject to a local hospital, where he was later pronounced -deceased. Homicide Detectives responded and they are handling the -investigation. No arrests have been made at this time. The -identity of the decedent is being withheld pending identification by the Los -Angeles County Coroner’s Office. Anyone with information is urged -to call Homicide Detectives Mark Mattia or Donald Goodman at (562) 570-7244. -Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling -1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone -(available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2134,https://coloradosprings.gov/police-department/article/news/traffic-fatality-woodman-road-and-campus,Media Bulletins,Agency-Published Resources,Traffic Fatality Woodman Road and Campus Drive | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Traffic Fatality Woodman Road and Campus Drive""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -2135,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/080321summary.pdf,Daily Activity Logs,Info About Officers,"","",404,"","","","","","","","" -2136,http://www.longbeach.gov/police/press-releases/dui---driver-s-license-checkpoint-planned-this-weekend/,Media Bulletins,Agency-Published Resources,DUI - DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2137,https://alpha.austin.gov/police-oversight/formal-complaint-responsibility-to-know-and-compl-2/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2138,https://www.gurnee.il.us/government/departments/police-department/community-involvement/gurnee-citizen-police-academy/gurnee-citizen-police-academy/week-4,Media Bulletins,Agency-Published Resources,Gurnee Citizen Police Academy,"",200," - Village of Gurnee -","[""Police Department""]","[""Gurnee Citizen Police Academy"", ""Youth Citizen Police Academy""]","[""Now accepting applications for the Spring 2024 session!"", ""Click here to register for the Gurnee Citizen Police Academy"", ""Village Hall""]",[],[],[],search edit file-word file-empty angle-left angle-right angle-up angle-down dollar calendar-check-o printer search2 briefcase circle-up circle-right circle-down circle-left share2 mail4 facebook twitter youtube file-pdf search edit file-word file-empty angle-left angle-right angle-up angle-down dollar calendar-check-o printer search2 briefcase circle-up circle-right circle-down circle-left share2 mail4 facebook twitter youtube file-pdf -2139,https://www.roundrocktexas.gov/wp-content/uploads/2019/12/coffee_cop.png,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2140,http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested-and-charged-1-/,Media Bulletins,Agency-Published Resources,ROBBERY SUSPECT ARRESTED AND CHARGED(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/20/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: ROBBERY SUSPECT ARRESTED & CHARGED Contact: Media Relations Detail (562) 570-5273 Multiple felony charges were filed today, December 20, 2016, against 22-year-old Long Beach resident Dylan Derrick Watson for his involvement in multiple armed robberies throughout Los Angeles County and the Inland Empire. Fortunately, none of the victims were injured during three robberies in Long Beach: On November 29, 2016, a suspect entered an electronics store in the 2100 block of South Street, brandished a handgun, and demanded cell phones and cash from the employee. The suspect fled with the items. On December 5, 2016, a suspect entered an electronics store in the 1400 block of W. Willow Street, brandished a handgun, and demanded cellphones and cash from the employee. The suspect fled with the items. The following day, it appears the same suspect entered an eatery in the 3400 block of Cherry Avenue, brandished a handgun, and demanded cash from the clerk. The suspect fled with cash. While Long Beach Robbery detectives were investigating the incidents, they learned of similar robberies in Montclair and the Inland Empire, and contacted with those agencies. Based on the suspect’s physical description and the manner in which the robberies were carried out, investigators believed that the same person was responsible for these crimes. Long Beach detectives, with the assistance of Hemet Police Department and other police agencies in the Inland Empire, identified Dylan Watson as the suspect wanted in connection with the robberies. On December 16, 2016, Long Beach detectives located Mr. Watson in the 5100 block of West Century Boulevard in Inglewood and arrested him. Pursuant to the arrest, detectives served a search warrant, towed the suspect’s vehicle, and recovered evidence related to the robberies. On December 20, 2016, the case was presented to the Los Angeles County District Attorney’s Office for filing consideration. Defendant Watson was charged with six counts of robbery and four counts of possession of a deadly weapon. He is currently being held at the Long Beach City Jail with a bail set at $2.012 million dollars. Anyone with information regarding this investigation is encouraged to call Long Beach Robbery Detective N. Mora at (562) 570-5536. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2141,https://wyomingohio.gov/departments/police-department-2/commend-an-officer/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2143,https://police.birminghamal.gov/bureaus/support-operations/records/,Resources,Agency-Published Resources,Services | Birmingham Police Department,"",200,"Home | Police Department - Birmingham, AL","[""Birmingham Police Department Commitment | Excellence | Integrity""]","[""Putting People First"", ""Services""]",[],"[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[],"Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Search Services In This Section Office of Administration Patrol North Precinct South Precinct East Precinct West Precinct Community Outreach and Public Education Investigations Tactical Operations Precinct The Records Division is part of the Administration Bureau. The Records Division provides essential support services to the Patrol and Investigative Bureaus, the public, and other criminal justice agencies. Incident/Offense reports may only be released to authorized parties in person. Reports involving certain types of crime (i.e., juvenile cases) may not be released. Most releasable reports are available within 5-7 working days. To determine if a report is available for release, please contact the Records Department at (205) 254-6308. Make sure you have your case number readily available when calling. Accident Reports may be purchased online or in person. Alabama Code 32-10-7 governs who is eligible to purchase accident reports. Hours of Operation Monday-Friday, 8am – 4:30pm No reports are sold after 4:30pm. Criminal Background Checks will be available between the hours of 8:00 am – 3:00 pm Excluding Holidays AVAILABILITY OF REPORTS IS SUBJECT TO CITY HALL CLOSURES, INCLEMENT WEATHER, AND OTHER EXIGENT CIRCUMSTANCES . Archived reports – $25.00 (Incident/Offense Reports prior to January 2013 or Accident Reports prior to January 2015, 3-5 business days) Accident Reports – $10.00 Incident/Offense Reports – $10.00 Criminal Background Checks – Birmingham City only – $10.00 (1-3 business days) Fingerprints -$10.00 Fingerprint Cards – $10.00 Please note: For payments made online with Allpaid , a separate transaction is required for each request. For Public Records Requests, visit the City of Birmingham Office of Public Information: Public Records Request WE ACCEPT CASH, DEBIT CARDS, CREDIT CARDS, MONEY ORDERS and COMPANY CHECKS ONLY. NO PERSONAL CHECKS WILL BE ACCEPTED. Note: Incident/Offense reports must be picked up in person, with proper identification. You MUST be listed as the reporting person or the victim on the report to obtain a copy. If you are listed as the offender, you CANNOT receive a copy of the report. Only parents or legal guardians may purchase juvenile reports.  The following items are required to pick up a report: original copy of the child’s birth certificate or court documentation showing guardianship (photocopies will not be accepted), and your State ID.  You cannot purchase the report if your child is listed as a suspect on the report, unless you are the person who made the report- no exceptions. Contact Us 1710 1st Avenue North Birmingham, AL 35203 (205) 254-6308 BPDReports@birminghamal.gov " -2144,https://norfolkne.gov/government/departments/police-division/press-releases/october-3rd-press-release-2022.html,Media Bulletins,Agency-Published Resources,"October 3rd Press Release 2022 - City of Norfolk, NE","",200,"Welcome to Norfolk, NE - City of Norfolk, NE","[""City of Norfolk, NE"", ""Police Division"", ""October 3rd Press Release 2022"", ""City of Norfolk, NE""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]","" -2145,https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-53/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2146,http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-5-/,Media Bulletins,Agency-Published Resources,DUI-DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND(5),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2147,http://www.longbeach.gov/police/press-releases/robberymurder-investigation---1900-block-of-pacific-ave/,Media Bulletins,Agency-Published Resources,ROBBERY/MURDER INVESTIGATION - 1900 BLOCK OF PACIFIC AVE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2148,https://delcopa.gov/courts/familycourtadvisory.html,Resources,Agency-Published Resources,Family Law Advisory Council,"",200,"Delaware County, Pennsylvania","[""Family Law Advisory Council""]",[],"[""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[],"Menu A to Z Court Departments Local Rules FAQ Government Center Family Law Advisory Council Home / Court Departments / Family Law Advisory Council Family Law Advisory Council Under the chairmanship of the Honorable William C. Mackrides, the Family Law Advisory Council is a consortium of core systematic stakeholders who meet regularly to ensure that the various departments and agencies charged with the responsibilities of providing services to and through the court’s family section coordinate such efforts to best meet the needs of the Delaware County community in cases of divorce, child custody, equitable distribution, child support, child protective services, spousal support and/or protection from abuse.  The council’s participants include: Judges, Family Section Masters; Law Clerks; the Domestic Relations Office; the Delaware County Judicial Support Office; the Office of the District Attorney; the Public Defender’s Office; the Sheriff’s Office; Children and Youth Services; and the Family Court Administrator’s Office. The council’s mission is to continually improve the effective and efficient administration of justice in all types of family matters coming before the court through an overarching and coordinated strategic planning and management paradigm.  This goal is realized by a unique collaboration of individual representatives from the varied departments and agencies routinely sharing their respective areas of knowledge, professional experiences and expertise.  Systematic problems are identified, discussed and through the exercise of reflective management administration successfully addressed with flexible solutions recognizing the interdependent impacts of the involved departments and agencies on each other’s operations, while yet appreciating the individual departments’ and agencies’ autonomy.  This all-inclusive approach of an ongoing, collaborative partnership promotes systematic protocols which benefit those community members seeking the court’s assistance, as well as that of the numerous other departments and agencies, all charged with the varied responsibilities attendant to family law cases. Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 delcocourts@co.delaware.pa.us Courts Quick Links Juror eResponse PA Law Help Self Help - Custody Self Help - Divorce Juror Handbook Language Access Family Court Self Represented Litigant Guide Government Center Quick Links Marriage Licenses Crisis Connection Certified Recovery Specialist Public Access Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Menu A to Z Court Departments Local Rules FAQ Government Center Family Law Advisory Council Home / Court Departments / Family Law Advisory Council Family Law Advisory Council Home / Court Departments / Family Law Advisory Council Family Law Advisory Council Home / Court Departments / Family Law Advisory Council " -2149,https://delcopa.gov/publicrelations/releases/18pdfs/18efilingprogramoct11.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2150,http://www.longbeach.gov/police/press-releases/traffic-fatality-7th-and-olive/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY 7TH AND OLIVE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/5/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: TRAFFIC FATALITY 7TH AND OLIVE Contact: Media Relations Detail (562) 570-5273 On March 4, 2017 at approximately 5:52 PM, Long Beach Police Officers were dispatched to a vehicle versus pedestrian traffic collision at 7th Street and Olive Avenue. Upon arrival officers found that Long Beach Fire was transporting an elderly male pedestrian to a local hospital in critical condition after a gray 2011 Nissan Versa collided with him. The driver of the Nissan is a 28-year-old male resident of Santa Rosa and remained at the scene during this investigation. The pedestrian has not been identified at this time. Long Beach Police found that the male pedestrian, for an unknown reason, ran off the southwest corner of 7th Street and Olive into the path of the 2011 Nissan that was traveling eastbound on 7th Street and had a green traffic light to continue through the intersection of Olive Avenue. The driver of the Nissan had no time to stop prior to colliding with the pedestrian. The pedestrian was later pronounced deceased at a Long Beach Hospital. Anyone who may have information regarding this incident is asked to call Long Beach Police Department Collision Investigation Detail Detective David Lauro at (562) 570-7355. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2151,https://www.antioch.il.gov/wpfb-file/11-07-16-police-and-fire-agenda-pdf-5/,Poor Data Source,Poor Data Source,"11-07-16 Police And Fire Agenda - Antioch, IL",11 07 16 police and fire agenda pdf commissions commission agendas 2016 2017 05 17 08 41 32 0000,200,"Home - Antioch, IL","[""11-07-16 Police And Fire Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -2152,https://sanramon.ca.gov/policenews,List of Data Sources,Info About Agencies,Police News - City of San Ramon,"",200,Just a moment...,"[""Police News""]","[""Contact Us"", ""Useful Links""]","["">>> Read Archived Police News""]",[],[],[],"" -2153,https://spdblotter.seattle.gov/2015/06/19/police-sting-blackmailer-after-she-tries-to-extort-woman-over-lurid-cellphone-pics/,Media Bulletins,Agency-Published Resources,Police Sting Blackmailer After She Tries to Extort Woman Over Lurid Cellphone Pics - SPD Blotter,"",200,403 Forbidden,"[""Police Sting Blackmailer After She Tries to Extort Woman Over Lurid Cellphone Pics""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics Search Search Search Search Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports -2154,https://www.dps.arkansas.gov/law-enforcement/arkansas-state-police/divisions/highway-patrol/troop-j-commander/,Personnel Records,Info About Officers,Troop J Commander - Arkansas Department of Public Safety,"",200,Home - Arkansas Department of Public Safety,"[""Flag Status""]","[""Troop J Commander"", ""Contact ASP"", ""Helpful ASP links"", ""Connect with ASP"", ""Respect. Integrity. CUSTOMER SERVICE. TEAMWORK. SERVANT LEADERSHIP. CONTINUOUS IMPROVEMENT"", """", ""© 2024 All rights Reserved. Arkansas.gov""]","[""Captain Kyle Drown""]",[],"[""About DPS"", ""DPS Links"", ""DPS Address"", ""Your Arkansas.gov"", ""Top Online Services"", ""Helpful Information""]",[],"" -2155,http://www.longbeach.gov/police/press-releases/click-it-or-ticket-campaign-starts-may-22/,Media Bulletins,Agency-Published Resources,CLICK IT OR TICKET CAMPAIGN STARTS MAY 22,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2156,http://lafayettepolice.us/735/youth-fire-setter-program,Not Criminal Justice Related,Not Criminal Justice Related,"Youth Fire Setter Program | Lafayette, IN - Official Website","The Youth Firesetting Program is a program designed to teach children and parents that matches and lighters are tools, not toys.",200,"Police Department | Lafayette, IN - Official Website","[""Youth Fire Setter Program""]",[],"[""Contact Us"", ""Todd Trent"", ""Lafayette Fire Department"", ""Hours"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2157,http://www.longbeach.gov/police/press-releases/murder-and-weapons-charges-filed-in-january-homicide/,Media Bulletins,Agency-Published Resources,MURDER AND WEAPONS CHARGES FILED IN JANUARY HOMICIDE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/26/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: MURDER AND WEAPONS CHARGES FILED IN JANUARY HOMICIDE Contact: Media Relations (562) 570-5273 On February 21, 2014, detectives arrested 26 year-old Thearath Sam at his residence in Pomona for the murder of Sambo Chhoy. Sambo was gunned down in the 1100 block of New York Street in Long Beach on January 21, 2014. Although both Thearath Sam and Sambo Chhoy are suspected gang members it is not believed that gang rivalry was the motivation for the murder, rather a personal dispute between the two men. On February 25, 2014, the Los Angeles County District Attorney's Office filed murder and weapons charges against Thearath Sam. Anyone with information regarding this murder is urged to contact Long Beach Police Homicide Detectives Hugo Cortez and Peter Lackovic at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/26/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: MURDER AND WEAPONS CHARGES FILED IN JANUARY HOMICIDE Contact: Media Relations (562) 570-5273 On February 21, 2014, detectives arrested 26 year-old Thearath Sam at his residence in Pomona for the murder of Sambo Chhoy. Sambo was gunned down in the 1100 block of New York Street in Long Beach on January 21, 2014. Although both Thearath Sam and Sambo Chhoy are suspected gang members it is not believed that gang rivalry was the motivation for the murder, rather a personal dispute between the two men. On February 25, 2014, the Los Angeles County District Attorney's Office filed murder and weapons charges against Thearath Sam. Anyone with information regarding this murder is urged to contact Long Beach Police Homicide Detectives Hugo Cortez and Peter Lackovic at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2158,https://estespark.colorado.gov/departments/police/support-services/auxiliary-unit,Training & Hiring Info,Info About Officers,Auxiliary Unit | Town of Estes Park,"",200,Home | Town of Estes Park,"[""Auxiliary Unit""]",[],"[""Estes Park Police Department Auxiliary Unit"", ""Language Translation""]",[],"[""Outstanding volunteers who contribute to a wonderful Town""]",[],"" -2159,http://www.longbeach.gov/police/press-releases/traffic-fatality--lb-blvd----market-street-/,Media Bulletins,Agency-Published Resources,Traffic Fatality (LB Blvd. & Market Street),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/5/2016 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Monday, April 4, 2016, at approx. 6:06 a.m., officers were dispatched to the area of Long Beach Boulevard and Market Street regarding a vehicle vs. pedestrian injury traffic collision, which later resulted in the death of the male adult pedestrian. When officers arrived, they located a critically injured unconscious male pedestrian on Long Beach Boulevard between Market Street and Plymouth Street. Long Beach Fire Department personnel arrived on scene and transported the pedestrian to a local hospital. Based on the preliminary investigation, the pedestrian was crossing eastbound on Long Beach Boulevard mid-block, between Market Street and Plymouth Street, when he was struck by a 2008 Chevy Equinox. The Chevy was traveling northbound on Long Beach Boulevard in the #1 lane from Plymouth Street at the time of the collision, and being driven by a 24-year-old female resident of Hawthorne. The driver remained at the scene, and was questioned and released. The investigation remains ongoing. Today, April 5, 2016, the LBPD received notification from the hospital that the pedestrian, only being identified as a 78-year-old resident of Long Beach pending notification of next of kin, had died from his injuries. Anyone who may have information regarding this incident is asked to call Long Beach Police Collision Investigation Detective David Lauro at (562) 570-7355. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2160,http://www.paloshillspolice.us/wp-content/uploads/2017/02/bozen_17.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2161,http://www.longbeach.gov/police/press-releases/officerinvolvedshooting/,Media Bulletins,Agency-Published Resources,officerinvolvedshooting,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2162,https://champaignil.gov/tag/champaign-police-department-releases-holiday-traffic-enforcement-numbers/,Media Bulletins,Agency-Published Resources,Champaign Police Department releases holiday traffic enforcement numbers Archives - City of Champaign,"",200,403 Forbidden,"[""Items tagged: Champaign Police Department releases holiday traffic enforcement numbers""]","[""Champaign Police Department releases holiday traffic enforcement numbers"", ""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Items tagged: Champaign Police Department releases holiday traffic enforcement numbers Search Champaign Police Department releases holiday traffic enforcement numbers Posted: January 8, 2019 The Champaign Police Department conducted additional traffic enforcement over the holidays from Dec. 17 to Jan. 2., reminding motorists to drive sober and buckle up as part of the Illinois Drive Sober or Get Pulled Over enforcement effort. The Champaign Police joined the Illinois State Police and local law enforcement agencies across Illinois to reduce […] Categories: Police Department Press Releases | Tags: Champaign Police Department releases holiday traffic enforcement numbers , Click It or Ticket , Drive Sober or Get Pulled Over Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy Powered by Translate City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works " -2163,http://police.portlandmaine.gov/805/orders-as-passed-fiscal-year-2017-to-201,List of Data Sources,Info About Agencies,"Orders as Passed Fiscal Year 2017 to 2018 | Portland, ME - Official Website",View Orders as Passed in the Fiscal Year 2017 to 2018.,200,"Portland, ME - Official Website | Official Website","[""Orders as Passed Fiscal Year 2017 to 2018""]",[],[],[],[],[],Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government City Council Council Orders as Passed Orders as Passed Fiscal Year 2017 to 2018 Orders as Passed Fiscal Year 2017 to 2018 Orders as Passed Fiscal Year 2022 to 2023 Orders as Passed Fiscal Year 2021 to 2022 Orders As Passed Fiscal Year 2020 to 2021 Orders As Passed Fiscal Year 2019 to 2020 Orders as Passed Fiscal Year 2018 to 2019 Orders as Passed Fiscal Year 2017 to 2018 Orders as Passed Fiscal Year 2016 to 2017 Orders as Passed Fiscal Year 2015 to 2016 Orders as Passed Fiscal Year 2014 to 2015 Orders as Passed Fiscal Year 2013 to 2014 Orders as Passed Fiscal Year 2012 to 2013 Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government City Council Council Orders as Passed Orders as Passed Fiscal Year 2017 to 2018 Orders as Passed Fiscal Year 2017 to 2018 Orders as Passed Fiscal Year 2022 to 2023 Orders as Passed Fiscal Year 2021 to 2022 Orders As Passed Fiscal Year 2020 to 2021 Orders As Passed Fiscal Year 2019 to 2020 Orders as Passed Fiscal Year 2018 to 2019 Orders as Passed Fiscal Year 2017 to 2018 Orders as Passed Fiscal Year 2016 to 2017 Orders as Passed Fiscal Year 2015 to 2016 Orders as Passed Fiscal Year 2014 to 2015 Orders as Passed Fiscal Year 2013 to 2014 Orders as Passed Fiscal Year 2012 to 2013 Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government City Council Council Orders as Passed Orders as Passed Fiscal Year 2017 to 2018 Orders as Passed Fiscal Year 2017 to 2018 Orders as Passed Fiscal Year 2022 to 2023 Orders as Passed Fiscal Year 2021 to 2022 Orders As Passed Fiscal Year 2020 to 2021 Orders As Passed Fiscal Year 2019 to 2020 Orders as Passed Fiscal Year 2018 to 2019 Orders as Passed Fiscal Year 2017 to 2018 Orders as Passed Fiscal Year 2016 to 2017 Orders as Passed Fiscal Year 2015 to 2016 Orders as Passed Fiscal Year 2014 to 2015 Orders as Passed Fiscal Year 2013 to 2014 Orders as Passed Fiscal Year 2012 to 2013 Government Websites by CivicPlus® -2164,https://www.southamptontownnypolice.gov/faq.aspx?qid=452,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • I am experiencing ePermitting problems such as upload,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Trustees""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2165,https://www.milpitas.gov/milpitas/departments/police/investigations/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2166,https://police.birminghamal.gov/aboutfuture/,Contact Info & Agency Meta,Info About Agencies,About | Birmingham Police Department,"",200,"Home | Police Department - Birmingham, AL","[""Birmingham Police Department Commitment | Excellence | Integrity""]","[""Putting People First"", ""About""]",[],"[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[],"Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Birmingham Police Department Commitment | Excellence | Integrity Putting People First Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Home About Command Staff Bureaus Press Releases Join the Team Crime Stats CALEA IAD Stats Inmate Search Contacts Search Search About In This Section Motto: Commitment.Excellence.Integrity Mission: It is the mission of the Birmingham Police Department to provide the highest quality police services to impact crime, build community, trust, and improve the quality of life for all. Vision: The Birmingham Police Department strives to provide a safe and sustainable community that fosters relationships, trust, and reduced crime provided by the highest level of police services. BUREAUS The City of Birmingham, founded on December 19th, 1871, is the largest municipal government in the State of Alabama.  Our city encompasses over 146 square miles and is located in Jefferson and Shelby counties.  Our police department, also the largest in the state, is comprised of 912 sworn officers and 325 professional staff.  We serve a population of over 212,000 citizens in a metro area of over 1.1 million. The Birmingham Police Department is a progressive law enforcement agency that has embraced modern technology along with forming a strong partnership with our citizens and businesses to provide a more safe community environment and promote robust business growth. The Birmingham Police Department is comprised of three major bureaus; the Administrative Bureau , Field Operations Bureau and Investigative Bureau .  These three bureaus work together in a highly professional collaboration to provide our citizens with many of the preeminent modern police services available in the nation.  We are also honored to be a partner in the 2015 National Initiative for Building Community Trust and Justice with the U.S. Department of Justice. COMMAND STAFF The command staff forms the core administration of the Birmingham Police Department. The Chief of Police is the head of administration. He is responsible for managing and directing the overall operations of the department. The chief’s executive staff includes the Assistant Chief, Deputy Chief of Investigative Operations and Deputy Chief of Patrol Operations. In this section you will find more information on the Chief of Police, Scott Thurmond and the Birmingham Police Department’s Executive Staff, as well as, Unit, Division and Shift Commanders. Captains Captain Frank Alexander II Custody Services Division Commander Captain Cochran Tactical Operations Commander Captain Harry Greenberg Crimes Against Property Commander Captain Edmond Hanks North Precinct Commander Captain James Jackson Executive Assistant to the Assistant Chief of Police Captain Torry Mack Special Enforcement Division Commander Captain Curtis Mitchell Jr. West Precinct Commander Captain Michelle Pruitt Internal Affairs Division Commander Captain Julie Quigley-Vining East Precinct Captain Joe Roberts South Precinct Commander Captain David Rockett Forensic Science/Science Center Captain Michael Sellers Crimes Against Person Division Commander " -2167,https://coloradosprings.gov/police-department/page/police-blotter,Media Bulletins,Agency-Published Resources,Police Blotter | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Police Blotter""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -2168,https://www.pinevillenc.gov/organizer/pineville-police-2/,Poor Data Source,Poor Data Source,"pineville police – Town of Pineville, NC","",200,403 Forbidden,"[""Upcoming Events"", ""pineville police"", ""Town of Pineville Updates""]","[""Town of Pineville Contacts"", ""Important News & Updates"", ""Special Meeting Notice"", ""Early Voting in Pineville"", ""Advisory Board Openings for Pineville Residents"", ""Follow Pineville on Facebook""]","[""Emergency: Police, Fire & Rescue"", ""Non-Emergency:"", ""Town Hall Mailing Address:"", ""Town Hall Physical Address:"", ""Town Hall Office Hours:""]",[],[],[],"" -2169,http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-7-/,Media Bulletins,Agency-Published Resources,DUI-DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND(7),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2170,http://police.byram-ms.us/bradford-place-auto-burglary/,Media Bulletins,Agency-Published Resources,Bradford Place Auto Burglary | Byram Police Department,"",200,Byram Police Department | Byram Police Department,"[""Bradford Place Auto Burglary""]","[""Byram Weather""]","[""Post navigation"", ""Byram Police Department""]",[],[],[],"Byram Police Department Home COVID-19 Resources I received a letter about my stolen item – NCIC Validation Search for: Main Menu ≡ × Home About Us Partners With Police Victim Services Center for Violence Preventon MS Coalition Against Domestic Violence Mississippi Coalition Against Sexual Assault The Tower – Specialized Services for Human Trafficking Victims Mississippi Sex Offender Registry Search MDOC Victim Notifications House Watch Alarm Registration Employment Contact Us Pass it On Police Records Request Commend an Officer/Employee File a Complaint FAQs News Police Records Police Records Request NCIC Validation Byram, Mississippi Sites > Byram Police Department > News > News Posts & Releases > Bradford Place Auto Burglary Bradford Place Auto Burglary On June 26, an auto burglary was reported near Building 53 at Bradford Place Apartments. Another similar burglary has since been reported. If you know the identity of the individual shown here, please contact Byram Police Detectives at (601) 372-2327 or Metro CrimeStoppers at (601) 355-TIPS Video Player http://police.byram-ms.us/wp-content/uploads/sites/2/2020/06/cars_2020-06-26T13_01_54-0500.mp4 Media error: Format(s) not supported or source(s) not found Download File: http://police.byram-ms.us/wp-content/uploads/sites/2/2020/06/cars_2020-06-26T13_01_54-0500.mp4?_=1 00:00 00:00 00:00 Use Up/Down Arrow keys to increase or decrease volume. Ref: Inc. 20-193 This entry was posted in News Posts & Releases on June 30, 2020 by David Errington . Post navigation ← Arrest Made in Holiday Inn Express Shooting Arrest Made in Byram Armed Robberies → Byram Police Department 141 Southpointe Dr. Byram, MS 39272 For general questions, please call: (601) 372-2327 Social Media facebook linkedin instagram Byram Weather Home About Us Partners With Police Employment Contact Us FAQs News Police Records Copyright © 2024 Byram Police Department . Back to top Byram Police Department Home COVID-19 Resources I received a letter about my stolen item – NCIC Validation Search for: Main Menu ≡ × Home About Us Partners With Police Victim Services Center for Violence Preventon MS Coalition Against Domestic Violence Mississippi Coalition Against Sexual Assault The Tower – Specialized Services for Human Trafficking Victims Mississippi Sex Offender Registry Search MDOC Victim Notifications House Watch Alarm Registration Employment Contact Us Pass it On Police Records Request Commend an Officer/Employee File a Complaint FAQs News Police Records Police Records Request NCIC Validation Byram Police Department Home COVID-19 Resources I received a letter about my stolen item – NCIC Validation Search for: Byram Police Department Main Menu ≡ × " -2171,https://delcopa.gov/publicrelations/releases/2022/pacareerlinkdelcohostsfreecareerworkshopthroughjune.html,Not Criminal Justice Related,Not Criminal Justice Related,"PA CareerLink® Delaware County Hosts Free Career Workshops April Through June - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""PA CareerLink® Delaware County Hosts Free Career Workshops April Through June""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play PA CareerLink® Delaware County Hosts Free Career Workshops April Through June Home / Departments / Public Relations Releases / PA CareerLink® Delaware County Hosts Free Career Workshops April Through June Released: March 31, 2022 During its March 2 meeting, County Council approved a project created by the County’s Workforce Development Board that would offer live, online workshops for County residents who are unemployed, underemployed, or in search of a career change. The Delaware County Workforce Development Board’s PA CareerLink® Delaware County offers over two dozen workshops per month April through June. A full list of PA CareerLink® Delaware workshops can be found here: https://pacareerlinkdelco.org/events/ Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the Delaware County Health Department Wellness Line: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play PA CareerLink® Delaware County Hosts Free Career Workshops April Through June Home / Departments / Public Relations Releases / PA CareerLink® Delaware County Hosts Free Career Workshops April Through June PA CareerLink® Delaware County Hosts Free Career Workshops April Through June Home / Departments / Public Relations Releases / PA CareerLink® Delaware County Hosts Free Career Workshops April Through June PA CareerLink® Delaware County Hosts Free Career Workshops April Through June Home / Departments / Public Relations Releases / PA CareerLink® Delaware County Hosts Free Career Workshops April Through June " -2172,http://www.longbeach.gov/police/press-releases/reward-issued-in-2014-case/,Media Bulletins,Agency-Published Resources,REWARD ISSUED IN 2014 CASE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/16/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: $10,000 REWARD ISSUED IN MURDER INVESTIGATION; POLICE SEEK PUBLIC’S HELP TO IDENTIFY SUSPECT/VEHICLE Contact: Media Relations Detail (562) 570-5273 Click on above photos to view enlarged images View video of vehicle fleeing the area The Los Angeles County Board of Supervisors, at the recommendation of Supervisor Don Knabe, has issued a $10,000 reward for information leading to the arrest and conviction of the person(s) responsible for the 2014 murder of 33-year-old Charles Bell of Compton. On March 23, 2014, around 2:55 a.m., Long Beach Police responded to a shots fired call in the area of 6th Street and Long Beach Boulevard. Officers discovered four male adults who appeared to have been struck by gunfire. Mr. Bell, who sustained a gunshot wound to the torso, was lying in the parking lot of a restaurant and was determined deceased at the scene. Long Beach Fire Department paramedics transported the three other victims to local hospitals. The three survived. The preliminary investigation indicated that the suspect attempted to instigate a fight with individuals who were leaving the restaurant and it escalated to a shooting. The suspect fled with multiple people in a dark colored SUV. The suspect is described as an African-African male, approximately 25 years old. He remains outstanding. Detectives are releasing surveillance video of the suspect vehicle fleeing westbound on 6th Street (the wrong way on a one-way street). Detectives are hopeful the reward may prompt reluctant witnesses to come forward and provide additional information. The investigation remains ongoing. Anyone with information regarding the murder is urged to contact Long Beach Police Homicide Detectives S. Lasch and D. Goodman at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2173,https://www.hayward-ca.gov/discover/news/may21/police-blotter-may-2-8-2021,Media Bulletins,Agency-Published Resources,"Police Blotter: May 2-8, 2021 | City of Hayward - Official website","STATISTICAL HIGHLIGHTSMay 2-8, 2021 Weekly Arrests (Includes cite/released):37 Homicide 0Weekly Calls for Service: 2,101 Assault—Great Bodily Injury 2Weekly Reports Taken:193 Burglary— Nonresidential 4Weekly Complaints(against HPD):0 Burglary—Residential 1Weekly Calls Received:5,541 Theft 18This data is subject to change and based on crimes that were reported to have occurred",200,City of Hayward - Official website,"[""Police Blotter: May 2-8, 2021""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form"", ""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment""]",[],"[""STATISTICAL HIGHLIGHTS"", ""May 2-8, 2021"", """", """", """", ""Significant Incidents"", ""Do you need help paying energy bills? You may qualify for federal aid."", ""Hayward Receives Grant for Safe Routes to Schools Infrastructure and Bicycle Incentives"", ""Hayward Celebrates Earth Day at Weekes Park!"", ""Spring 2024 Compost Giveaway"", ""Sustainable Solutions for Celebrating Easter"", ""City Hall and Nonessential Services Closure: Monday, Apr. 01, 2024"", ""Presidential Primary Election: Tuesday, Mar. 5, 2024"", ""Library Closure: February 12 and February 19, 2024."", ""City Hall and Nonessential Services Closures: Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""YOU ARE HERE. SO IS EVERYTHING ELSE."", ""Related News"", ""Police Blotter - February 25-March 2, 2024"", ""Weekly Blotter - February 18-24, 2024"", ""Police Blotter - February 11-17, 2024"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],Skip to main content -2174,https://www.knoxvilletn.gov/government/city_departments_offices/police_department/investigations_bureau/special_crimes_unit/domestic_violence_help,Resources,Agency-Published Resources,Domestic Violence Help - City of Knoxville,police*,200,Just a moment...,"[""Domestic Violence Help"", ""Police Chief""]",[],[],[],[],[],Skip navigation {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## -2175,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/042021blotter.pdf,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -2176,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2021_news_releases/police_announce_promotions,Media Bulletins,Agency-Published Resources,Police Announce Promotions - Village of Pleasant Prairie,"",200,Just a moment...,[],"[""Police Announce Promotions""]","[""Follow Us on Social Media""]",[],[],[],"" -2178,https://www.knoxvilletn.gov/government/city_departments_offices/civil_service_department/how_to_apply_for_police,Training & Hiring Info,Info About Officers,How to Apply for Police Officer - City of Knoxville,civil*,200,Just a moment...,"[""How to Apply for Police Officer"", ""Civil Service Director""]","[""Civil Service is currently accepting applications for Police Officer Recruit, Lateral Entry Recruit, and Cadet! Click HERE to apply!""]","[""HERE""]",[],[],[],Skip navigation {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## -2179,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/020921blotter.pdf,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -2180,https://delcopa.gov/planning/developmentreview.html,Not Criminal Justice Related,Not Criminal Justice Related,Development Review,"",200,"Delaware County, Pennsylvania","[""Development Review""]",[],"[""I’m interested in…"", ""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Development Review Home / Departments / Planning Department / Development Review Delaware County planners provide advisory PA Act 247 reviews of proposed development, zoning amendments, and ordinances for County municipalities. The Planning Department (DCPD) strives to improve the quality of development throughout the County by conducting advisory reviews of all land developments, subdivisions, and ordinances proposed in Delaware County. Staff planners present their reviews to the Delaware County Planning Commission at its monthly meetings, where official recommendations are made. In addition, Development Review staff provide technical assistance to municipalities and developers on site planning and ordinance compliance issues. I’m interested in… Knowing more about the Delaware County Planning Commission Viewing what’s on the Planning Commission’s Meeting Agenda or the Prior Month Applications Submitting a Proposed Subdivision and/or Land Development Plan or Ordinance for review Submitting a Sewage Module for review Recording an Approved Subdivision and/or Land Development Plan Finding Parcel/Site Information Viewing the 2022 Year in Review: Subdivision and Land Development Reviews Viewing the Proposed Subdivision and Land Development Mapping Application * and Dashboard* to see plans reviewed by the Delaware County Planning Commission Viewing the Countywide Zoning Application* and Dashboard* Viewing a Municipal Zoning or Subdivision and Land Development Ordinance or Comprehensive Plan Viewing Delaware County's Subdivision and Land Development Ordinance (SALDO) Learning more about the William H. Bates Outstanding Land Development Awards * Browsers other than Internet Explorer or Microsoft Edge are recommended for optimal performance. Questions about Development Review? Contact the Planning Department at 610-891-5200 or Planning_Department@co.delaware.pa.us . For questions about building permits, please contact your municipality’s code enforcement officials to obtain information concerning requirements and specific permit application status for your town. Planning Department Navigation Access the Data and Mapping Innovation Hub About Planning Calendar Current Projects Delaware County 2035 Demographic Data Development Review Forms Funding Green Space and Trails Project Mapping Municipal Programs & Initiatives Planning Education Publications Gina Burritt, Director Planning Department 2 W. Baltimore Avenue Suite 202 Media, PA 19063 Phone: 610-891-5200 Fax: 610-891-5203 Email: Planning_Department@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2023 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu " -2181,http://www.longbeach.gov/police/press-releases/murder-investigation---1400-blk-pacific-ave/,Media Bulletins,Agency-Published Resources,MURDER INVESTIGATION - 1400 BLK PACIFIC AVE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/29/2018 FOR IMMEDIATE RELEASE Press Release # Subject: MURDER INVESTIGATION - 1400 BLK PACIFIC AVE Contact: Media Relations Detail (562) 570-5273 On Friday, July 27, 2018 at approximately 9:40 p.m., officers were dispatched to the 1400 Block of Pacific Avenue, regarding a vehicle versus pedestrian injury traffic collision, that resulted in the death of a male adult. Upon arrival, officers located the critically injured pedestrian laying in the street. The Long Beach Fire Department responded and transported the pedestrian to a local hospital, where he was later pronounced deceased. The driver of the vehicle fled the scene. Due to the suspicious circumstances, the Long Beach Police Department's Homicide Detectives responded to the scene. This incident is being investigated as an intentional act. The motive for the collision is unknown and the investigation remains ongoing. The identity of the victim is unknown at this time and will be determined by the Los Angeles County Coroner’s Office. Anyone who witnessed or has information regarding this incident is urged to call Long Beach Police Homicide Detectives M. Mattia and D. Goodman at (562) 570-7244. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App Store and Google Play), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2182,https://www.ashevillenc.gov/news/asheville-police-urge-motorcycle-caution-on-town-mountain-road/,Media Bulletins,Agency-Published Resources,ERROR: The request could not be satisfied,"",200,The City of Asheville - Your Asheville,"[""403 ERROR""]","[""The request could not be satisfied.""]",[],[],[],[],"" -2183,https://delcopa.gov/controller/pdf/unclaimed/unclaimedfundslist.pdf,Resources,Agency-Published Resources,"","",200,"","","","","","","","" -2184,https://www.southamptontownnypolice.gov/faq.aspx?qid=288,Resources,Agency-Published Resources,FAQs • How do I contact the Bay Constable,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Town Police""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2185,http://www.longbeach.gov/police/press-releases/national-pharmaceutical-take-back-event/,Media Bulletins,Agency-Published Resources,NATIONAL PHARMACEUTICAL TAKE-BACK EVENT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/20/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: NATIONAL PHARMACEUTICAL TAKE-BACK EVENT Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department is once again joining forces with Long Beach Memorial Medical Center to participate in the Drug Enforcement Administration’s (DEA) National Pharmaceutical Take-Back initiative, along with several other law enforcement agencies around the nation. This initiative seeks to prevent increased pill abuse and theft through the collection of potentially dangerous expired, unused and unwanted prescription drugs. Previous events the department hosted yielded hundreds of pounds of pharmaceuticals and we are hoping this event will be just as successful. The event will offer a drive-thru service that is free and anonymous. Drivers never have to get out of their vehicles and can simply drive up to a disposal bin. The driver of the 25th, 50th, 75th, and 100th participating vehicles will be awarded a pair of Aquarium of the Pacific tickets. The event will be held as follows: Date:           Saturday, October 22, 2016 Time:          10:00 a.m. – 2:00 p.m. Location:     Long Beach Memorial Medical Center (enter main parking lot entrance off of Atlantic Ave. and exit onto Long Beach Blvd.) This initiative addresses a vital public safety and public health issue. Many Americans are not aware that medications that languish in home cabinets are highly susceptible to diversion, misuse and abuse. Prescription drug abuse in the United States is increasing at alarming rates, as are the number of accidental poisonings and overdoses due to their availability. Studies show that a majority of abused prescription drugs are obtained from family and friends, including from home medicine cabinets. In addition, many Americans do not know how to properly dispose of their unused medications, often flushing them down the toilet or throwing them away … both potential safety and health hazards. Once collected, the unwanted pharmaceuticals will be turned over to the DEA who will safely destroy the drugs. For more information regarding the National Take Back Initiative, visit www.dea.gov or contact the Long Beach Police Department’s Drug Investigations Section at (562) 570-7221. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2186,http://www.longbeach.gov/police/press-releases/police-seek-public-s-help-with-july-2014-murder-case--sketches-of-persons-of-interest-released/,Media Bulletins,Agency-Published Resources,POLICE SEEK PUBLIC'S HELP WITH JULY 2014 MURDER CASE; SKETCHES OF PERSONS OF INTEREST RELEASED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/30/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: POLICE SEEK PUBLIC'S HELP WITH JULY 2014 MURDER CASE; SKETCHES OF PERSONS OF INTEREST RELEASED Contact: Media Relations Detail (562) 570-5273 Sketch #1                           Sketch #2 Sketch #3                           Sketch #4 (Click on a photo to enlarge) Long Beach Police are asking for the public’s help with the investigation of the gang-related murder of Kayon Dafney, which occurred around 12:33 p.m., on July 4, 2014, in North Long Beach. Homicide Detectives recently received tips describing a white 2-door convertible, which was seen in the area of the 6500 block of Gardenia around the time that the shooting occurred. Detectives reviewed several surveillance videos from the area of the murder and were successful in locating two vehicles that matched the description. Snapshots of the vehicles were disseminated through the media and several witnesses came forward. One witness was able to provide descriptions of several subjects who were seen in vehicles at the crime scene around the time the murder occurred. Detectives are hopeful the descriptions and sketches will encourage additional witnesses to come forward. The persons of interest are described as follows: Male, Black, mid 20’s, 5’5” - 5’8”, 155-170 pounds, wearing a white or gray colored t-shirt, seen exiting the passenger side of a small white 2-door convertible Male, Black, late 40’s - early 50’s, dark skinned, driving a small white 2-door convertible Male, Black, 20’s, thin faced, dark skinned wearing an unknown colored t-shirt Male, Black, early 20’s, light skinned, possible goatee and curly hair Tips also led detectives to believe this murder and the June 27, 2014 murder of Marcel Johns are related. Johns sustained multiple gunshot wounds and was pronounced deceased at the scene in the 5500 block of Dairy Avenue. Anyone with information regarding either murder is urged to contact Long Beach Homicide Detectives Teryl Hubert, Scott Lasch, or Michael Hubbard at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2187,https://pittsburghpa.gov/police/police-contacts,Poor Data Source,Poor Data Source,"","",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", """", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],[],[],[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -2188,http://www.longbeach.gov/police/about-the-lbpd/employment/join-lbpd/step-8/,Training & Hiring Info,Info About Officers,Step 8: Medical Screening,"",200,City of Long Beach,"[""Police Department""]","[""Step 8: Medical Screening""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""Contact Info:"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[],"" -2190,https://controller.phila.gov/office-of-the-city-controller-announces-community-council-members-to-support-review-of-the-philadelphia-police-department/,Media Bulletins,Agency-Published Resources,Office of the City Controller Announces Community Council Members to Support Review of the Philadelphia Police Department - Office of the Controller,"",200,403 Forbidden,"[""Press Releases"", ""Press Releases: Office of the City Controller Announces Community Council Members to Support Review of the Philadelphia Police Department""]","[""Main Navigation"", ""Post Metadata"", ""Press Releases Pagination"", ""Footer""]","[""Post Categories:"", ""Post Tags:"", ""Contact Information"", ""Quick Links"", ""Newsletter Signup"", ""Copyright Information"", ""Legal Links""]","[""Address""]",[],[],"Skip to Main Content Office of the Controller Christy Brady, City Controller Main Navigation About Christy Brady Role & Function Divisions Staff Contact Us Job Opportunities Employee Rights Language Access Plan Audits, Reviews & Investigations Fraud Reporting Policy Analysis Reports Suggest a Data Release Media Request the Controller Press Releases Quick Guides Office of the Controller Christy Brady, City Controller Office of the Controller Christy Brady, City Controller Office of the Controller Christy Brady, City Controller Office of the Controller Christy Brady, City Controller " -2191,https://alpha.austin.gov/police-oversight/formal-complaint-arrest-requirement-for-assaultive-offenses-and-responsibility-to-know-and-comply/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2192,http://www.longbeach.gov/police/press-releases/police-seek-additional-indecent-exposure-victims/,Media Bulletins,Agency-Published Resources,POLICE SEEK ADDITIONAL INDECENT EXPOSURE VICTIMS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/20/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: POLICE SEEK ADDITIONAL INDECENT EXPOSURE VICTIMS Contact: Media Relations Detail (562) 570-5273 VIEW PHOTO On February 19, 2015, the Long Beach Police Department arrested a suspect on an indecent exposure warrant, and hope that additional victims they believe may exist will come forward. From June 2014 through December 2014, the police department received several calls from residents in the Bixby Knolls area regarding a male subject who drove a black vehicle who was seen masturbating in public.  The suspect would expose himself to females as they were walking down the street. L.B.P.D. Sex Crimes detectives began investigating the case and interviewed several victims and witnesses within the community. Through their investigation, detectives were able to identify the suspect as 21-year-old Guadalupe Perez Jr. of Long Beach.  Detectives presented their case to the City Prosecutor's Office for filing consideration. The City Prosecutor’s Office filed the case and issued a warrant for Perez’s arrest. Detectives from the Violent Sexual Predator Unit located Perez on February 19th and took him into custody on the outstanding indecent exposure warrant in the area of 6th Street and Golden Avenue in Long Beach.  He is currently being held at the Long Beach City Jail on $50,000 bail, pending arraignment. The investigation is ongoing and detectives are attempting to identify additional victims. Anyone who has been a victim and has not reported the incident to police, or has information regarding this case, is encouraged to contact Long Beach Police Sex Crimes Detective Stacey Holdredge at (562) 570-7368. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2193,https://www.prospertx.gov/residents/police/police-department/about-the-department/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2194,https://www.antioch.il.gov/wpfb-file/04-10-12-police-pension-agenda-pdf-5/,Poor Data Source,Poor Data Source,"04-10-12 Police Pension Agenda - Antioch, IL",04 10 12 police pension agenda pdf commissions fund agendas 2012 2017 05 17 08 41 32 0000,200,"Home - Antioch, IL","[""04-10-12 Police Pension Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -2195,https://cheswold.delaware.gov/cheswold-police-department-yearly-traffic-statistics/march-2021-traffic-stop-report/,Annual & Monthly Reports,Info About Agencies,March 2021 - Traffic Stop Report - Town of Cheswold,"",200,"Home - Town of Cheswold - Kent County, Delaware","[""Cheswold""]","[""Delaware"", ""March 2021 – Traffic Stop Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[],"Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Cheswold Delaware Listen March 2021 – Traffic Stop Report March 2021 - Traffic Stop Report Cheswold Delaware Listen March 2021 – Traffic Stop Report March 2021 - Traffic Stop Report Listen March 2021 – Traffic Stop Report March 2021 - Traffic Stop Report Listen March 2021 – Traffic Stop Report March 2021 - Traffic Stop Report Listen March 2021 – Traffic Stop Report March 2021 - Traffic Stop Report Listen Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form " -2196,https://police.greenvillesc.gov/1719/internships,Resources,Agency-Published Resources,"Academic Internship and Research Program | Greenville, SC - Official Website",GPD offers internships to qualified students.,200,"Police Department | Greenville, SC - Official Website","[""Academic Internship and Research Program""]","[""Internships""]","[""Internship FAQs"", ""Contacts"", ""Internships"", ""Loading""]",[],[],[],Skip to Main Content -2198,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0714/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2199,https://coloradosprings.gov/police-department/article/news/update-officer-involved-shooting-hwy-115,Officer Involved Shootings,Police & Public Interactions,Update Officer Involved Shooting Hwy 115 and Fort Carson gate 2 | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Update Officer Involved Shooting Hwy 115 and Fort Carson gate 2""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -2200,http://www.longbeach.gov/police/press-releases/pedestrian-safety-operation-a-success/,Media Bulletins,Agency-Published Resources,PEDESTRIAN SAFETY OPERATION A SUCCESS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/16/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: PEDESTRIAN SAFETY OPERATION A SUCCESS Contact: Media Relations (562) 570-5273 The Long Beach Police Department conducted a pedestrian safety and education operation on Wednesday, September 16, 2015, from 7:00 am to 12:00 pm. Officers assigned to the Department’s Traffic Section deployed in areas with a high volume of pedestrian traffic. Officers conducted eighty-six (86) traffic stops on both drivers and pedestrians who violated the vehicle code. Instead of issuing citations, officers explained to people how they violated the law and provided a leaflet on pedestrian traffic safety. The postcard size leaflets were the result of a partnership between WalkLongBeach.org and the Long Beach Police Department. “Many citizens are unaware of the laws regarding pedestrians in the roadway,” said Lieutenant Kris Klein who is assigned to the Long Beach Police Department’s Traffic Section. “This operation was designed as an educational tool, and the leaflets were a great way to visually get the message out to the public” Walk Long Beach is a collaboration between community organizations and local government agencies to promote walking in Long Beach by making it more walkable for residents, workers, students and visitors, one step at a time. The expansive program includes promoting pedestrian safety, stakeholder training, walk auditing, promoting walking clubs and tourism throughout the city with specific focus on supporting disadvantaged communities. Walk Long Beach educates residents and stakeholders on how the character of their physical environment affects their ability and willingness to walk in their community. Funding for this program is provided by a grant from the California Office of Traffic Safety through the National Highway Traffic Safety Administration. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2201,http://www.longbeach.gov/police/press-releases/l.b.p.d.-promotes-assistant-chief/,Media Bulletins,Agency-Published Resources,L.B.P.D. PROMOTES NEW ASSISTANT CHIEF,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2202,https://delcopa.gov/departments/parks/pdf/dogparkapplication.pdf,Resources,Agency-Published Resources,"","",200,"","","","","","","","" -2203,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/010122blotter.pdf,Daily Activity Logs,Info About Officers,"","",404,"","","","","","","","" -2204,http://www.ryepolice.us/pressrelease/press-release-burglary-suspect,Media Bulletins,Agency-Published Resources,Rye Police Department Press Release - Burglary Suspect - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Press Release - Burglary Suspect""]","[""Press Release – Burglary Suspect""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"­ Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Press Release - Burglary Suspect Home Press Releases Press Release – Burglary Suspect Press Release – Burglary Suspect June 18, 2019 In Press Releases Date of Release: June 18, 2019 Reference: Burglary Suspect On 06/18/19 at approximately 12:40 PM Rye Police were dispatched for a burglary in progress at 211 Brackett Rd. Home owners gave officers a description of a person who forced entry into their home. Gender: Male Race: White Build: Medium Height: approximately 6’ 0” Age: 20 to 30 years old Dark colored hair, dark colored beard Black shorts, white socks, grey sneakers, black hooded sweat shirt, black baseball style cap Olive green back pack, looks like a Ruck Sack military style, water bottle on side The bicycle was recovered by Rye Police. It is a Haro Mountain bicycle, color black, black seat with orange markings on seat. The burglary suspect attempted to steal a car from a driveway on Central Road. The person in the vehicle pulled the door closed and told the person NO. The suspect fled the scene. The suspect was seen by a Rye Police Officer. The suspect rode his bicycle behind private homes on Central Road. The Officer lost the suspect. Home owner at 146 Perkins Road reported the same description burglary suspect was in their home. The suspect stole a wallet and car keys. The home owner at 146 Perkins Road witnessed the burglary suspect steal their vehicle. A Rye Highway Department employee took a photo of the suspect described by the home owner’s and Rye Police Officer. Anyone with information is asked to please call Rye Police at 603-964-5522, Seacoast Crime Stoppers at 603-431-1199, Facebook @SeacoastCrimeStoppers. The Rye Police Department would like to thank the North Hampton Police, the dispatchers and deputies of the Rockingham County Sheriff Department, Greenland Police, and Portsmouth Police Departments for assisting at the scene. Thanks to the Rye Highway Department employees and citizens for noticing suspicious activity and forwarding the information to Rye Police officers. See attached photo of burglary suspect. Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers " -2205,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/092722summary.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2206,https://www.coppelltx.gov/644/pay-bills-fines,Resources,Agency-Published Resources,"Pay Bills & Fines | Coppell, TX",Learn how to pay for utility bills and pay fines and citations.,200,"Coppell, TX | Official Website","[""Pay Bills & Fines""]",[],"[""Loading""]","[""Pay Citation"", ""Pay Tax Bill"", ""Pay Water Bill""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Residents Business Engage I Want To... Visitors Home Residents Pay Bills & Fines Pay Bills & Fines 9 1 1 2 Pay Citation There are a variety of ways that you can make payments to the Coppell Municipal Court. Pay Tax Bill This program is designed to help you access property tax information and pay your property taxes online. Pay Water Bill Pay your water bill online. Pay Citation Pay Tax Bill Pay Water Bill Agendas & Minutes Alert Sign-Up Citizen Report E-News Pay Water Bill Permits 255 E. Parkway Blvd., P.O. Box 9478, Coppell, TX 75019 Phone: 972-462-0022 | Email us Site Map Contact Us Accessibility Copyright Notices Privacy Policy Employee Login /QuickLinks.aspx Government Websites by CivicPlus® Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Residents Business Engage I Want To... Visitors Home Residents Pay Bills & Fines Pay Bills & Fines 9 1 1 2 Pay Citation There are a variety of ways that you can make payments to the Coppell Municipal Court. Pay Tax Bill This program is designed to help you access property tax information and pay your property taxes online. Pay Water Bill Pay your water bill online. Pay Citation Pay Tax Bill Pay Water Bill Agendas & Minutes Alert Sign-Up Citizen Report E-News Pay Water Bill Permits 255 E. Parkway Blvd., P.O. Box 9478, Coppell, TX 75019 Phone: 972-462-0022 | Email us Site Map Contact Us Accessibility Copyright Notices Privacy Policy Employee Login /QuickLinks.aspx Government Websites by CivicPlus® Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Residents Business Engage I Want To... Visitors Home Residents Pay Bills & Fines Pay Bills & Fines 9 1 1 2 Pay Citation There are a variety of ways that you can make payments to the Coppell Municipal Court. Pay Tax Bill This program is designed to help you access property tax information and pay your property taxes online. Pay Water Bill Pay your water bill online. Pay Citation Pay Tax Bill Pay Water Bill Agendas & Minutes Alert Sign-Up Citizen Report E-News Pay Water Bill Permits 255 E. Parkway Blvd., P.O. Box 9478, Coppell, TX 75019 Phone: 972-462-0022 | Email us Site Map Contact Us Accessibility Copyright Notices Privacy Policy Employee Login /QuickLinks.aspx Government Websites by CivicPlus® " -2207,https://police.greenvillesc.gov/1865/credit-union,Not Criminal Justice Related,Not Criminal Justice Related,"My Account • Greenville, SC • CivicEngage","Engage your community – connect to news, events and information you care about.",200,"Police Department | Greenville, SC - Official Website","[""Website Sign In""]","[""Sign In""]","[""Loading""]",[],[],[],"Skip to Main Content Government Departments Business Visitors Residents Search Home My Account Website Sign In For a more interactive experience please sign in. Sign In When using an existing account, you will be redirected to the CivicPlus sign in page. Existing Account Create An Account Sign In with SSO Facebook Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility Site Map Web Policy and Copyright Webmail /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Home My Account Website Sign In For a more interactive experience please sign in. Sign In When using an existing account, you will be redirected to the CivicPlus sign in page. Existing Account Create An Account Sign In with SSO Facebook Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility Site Map Web Policy and Copyright Webmail /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Home My Account Website Sign In For a more interactive experience please sign in. Sign In When using an existing account, you will be redirected to the CivicPlus sign in page. Existing Account Create An Account Sign In with SSO Facebook Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility Site Map Web Policy and Copyright Webmail /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Home My Account Website Sign In For a more interactive experience please sign in. Sign In When using an existing account, you will be redirected to the CivicPlus sign in page. Existing Account Create An Account Sign In with SSO Facebook Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility Site Map Web Policy and Copyright Webmail /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Government Departments Business Visitors Residents Search Government Departments Business Visitors Residents Search Search Search Search Search Search Search Search Search Home My Account Website Sign In For a more interactive experience please sign in. Sign In When using an existing account, you will be redirected to the CivicPlus sign in page. Existing Account Create An Account Sign In with SSO Facebook Home My Account Website Sign In For a more interactive experience please sign in. Sign In When using an existing account, you will be redirected to the CivicPlus sign in page. Existing Account Create An Account Sign In with SSO Facebook " -2208,http://www.lafayettepolice.us/826/fire-blocking,Not Criminal Justice Related,Not Criminal Justice Related,"Fire Blocking | Lafayette, IN - Official Website","In combustible construction, fire blocking shall be installed to cut off concealed draft openings (both vertical and horizontal) and shall form an effective barrier between floors, between a top story and a roof or attic space.",200,"Police Department | Lafayette, IN - Official Website","[""Fire Blocking""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Operations Prevention Recruitment How Do I... Home Government Departments A - F Fire Department Prevention Contractors & Designers Resources & Inspections Fire Blocking Fire Blocking Fire blocking is not synonymous with fire stopping. In combustible construction, fire blocking shall be installed to cut off concealed draft openings (both vertical and horizontal) and shall form an effective barrier between floors, between a top story and a roof or attic space. Fire blocking shall be installed in the locations specified in Sections 717.2.2 through 717.2.7 of the Indiana Building Code. Fire blocking is found in non fire-rated wood construction assemblies. Where to Install Fire blocking shall be installed at openings around vents, pipes, ducts, chimneys and fireplaces at ceiling and floor levels, with an approved material to resist the free passage of flame and the products of combustion. Factory-built chimneys and fireplaces shall be fire blocked in accordance with UL 103 and UL 127. In wood-frame construction, fire blocking should be provided in the following locations: Penetrations in the stud walls and partitions at the top plate and floor level (multilevel); Horizontal communication, within a wall, at 10 foot intervals Interconnections between concealed spaces that occur at soffits, drop or cove ceilings; Concealed spaces between stair stringers at the top and bottom of run; Penetrations Penetrations of fire blocking - refer to the Indiana Building Code, Penetrations - 712.4.2 Non-fire-resistance-rated assemblies When a fire block is penetrated for the trades to run their wires, pipes, and other mechanical penetrating items, the integrity of the wood fire blocks is compromised and they must be protected with a material that is equal to or greater than the burn time of the blocking material. The integrity of fire blocks shall be maintained. Material Needed Using a material that meets ASTM-E 136 test criteria fulfills the code requirements for fire blocking penetrations because the material is tested and is equivalent in performance to the fire blocking material. Material tested in accordance with ASTM-E 84 and ASTM-E 814 may also maintain the integrity of the fire blocking. (Fire caulk used as a fire blocking material is acceptable) Verification of the material should been done prior to installation. Review with the AHJ. Spray-Foam Insulation Community Outreach Fire Stations Submit a Request History Photo Gallery Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -2209,https://dccouncil.gov/donation-disclosures/copy-of-april-2019-donation-disclosures-2/,Policies & Contracts,Info About Agencies,Copy of April 2019 Donation Disclosures • Council of the District of Columbia,"",200,Home • Council of the District of Columbia,"[""Copy of April 2019 Donation Disclosures""]",[],[],[],[],[],"Federal Tax Counter: $1,298,573,271 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Federal Tax Counter: $1,298,573,271 What is this? Get Updates RSS Press Center facebook twitter youtube Federal Tax Counter: $1,298,573,271 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Council of the District of Columbia Copy of April 2019 Donation Disclosures May 14, 2019 Loading... Copy of April 2019 Donation Disclosures May 14, 2019 Loading... Loading... Loading... DC Council seal About the Council Open Government Register to Vote Council Updates Jobs Council Directory Privacy Policy Commemorative D.C. Flag Program Ethics Visit the Wilson Building facebook twitter youtube Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Search facebook twitter youtube Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate " -2210,https://alpha.austin.gov/es/police-oversight/2020-06-4-15/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2211,https://www.lynchburgvapolice.gov/wp-content/uploads/2022/01/veh-3.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2212,https://www.cityofladue-mo.gov/departments/police-department/community/maps-167,Not Criminal Justice Related,Not Criminal Justice Related,"","",404,"","","","","","","","" -2213,https://www.antioch.il.gov/wpfb-file/12-09-14-police-pension-agenda-pdf/,Poor Data Source,Poor Data Source,"12-09-14 Police Pension Agenda - Antioch, IL",8436 12 09 14 police pension agenda pdf commissions fund agendas 2014 1417450543 2a9c5dc94f4b22a9f99a6d66b140c03a 219x300 _cvau8geaxfzv thumb jpg 01 11 15 43 0 pdf application trustees dennis b crosby jay jozwiak mary c dominiak scott a pierce jerry t johnson ted p poulos lawrence m hanson mayor lori k folbrick village clerk agenda of antioch,200,"Home - Antioch, IL","[""12-09-14 Police Pension Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -2214,https://www.coppelltx.gov/592/hotel-occupancy-tax,Not Criminal Justice Related,Not Criminal Justice Related,"Hotel Occupancy Tax | Coppell, TX",The City of Coppell levies a tax rate of 7% on the cost of occupancy of any sleeping room furnished by any hotel where the cost of occupancy is at the rate of two dollars or more per day.,200,"Coppell, TX | Official Website","[""Hotel Occupancy Tax""]","[""People Who Must File a Hotel Occupancy Report"", ""When to File""]","[""Holidays & Weekends"", ""Documents"", ""Contact Us"", ""Quick Links"", ""Loading""]","[""Hotel Occupancy Tax""]",[],[],Skip to Main Content -2215,https://www.montgomeryohio.gov/meet-steve-coppel-a-diversity-inclusion-committee-member/steve-coppel/,Not Criminal Justice Related,Not Criminal Justice Related,"- Montgomery, Ohio","",200,"Welcome - Montgomery, Ohio","[""""]","[""Primary menu links"", ""Action toolbar"", ""Recent news"", ""Welcome"", ""Engage"", ""Help"", ""Mental Health Resource""]","[""Montgomery Street Sign Sale"", ""Montgomery Monument and Landscape Enhancement Project"", ""Welcome Montgomery’s Newest Firefighters"", ""Join the Annual Independence Day Parade!"", ""Spring is Coming to Montgomery""]",[],[],[],"Montgomery, Ohio Primary menu links Services Community Government Events News Contact Action toolbar Answers Report Issue Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Search Primary menu links Services Community Government Events News Contact Action toolbar Answers Report Issue Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Search Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Montgomery, Ohio Montgomery, Ohio Montgomery, Ohio Posted on November 4, 2020 Recent news Montgomery Street Sign Sale Posted on March 22, 2024 Montgomery Monument and Landscape Enhancement Project Posted on March 19, 2024 Welcome Montgomery’s Newest Firefighters Posted on March 3, 2024 Join the Annual Independence Day Parade! Posted on March 1, 2024 Spring is Coming to Montgomery Posted on March 1, 2024 All news » " -2216,https://ci.guadalupe.ca.us/documents/police-officer/,Training & Hiring Info,Info About Officers,"Police Officer – The City of Guadalupe, California","",200,"The City of Guadalupe, California – Gateway to the Dunes","[""Police Officer""]","[""Document Links"", ""Leaving our website"", ""Exiting our website""]",[],[],[],[],Skip to content Home Residents Obtain New Utility Services New Utility Account – Eng New Utility Account – Esp Pay Utility Bills Online Transportation Recycling Community Programs Guadalupe Bulldogs Football Guadalupe Gladiators Service Clubs & Organizations Kiwanis Club of Guadalupe Lions Club of Guadalupe Masonic Lodge – Central Coast #237 Businesses Business Resources Starting a Business Commercial Property Government Mayor and City Council All Notices Building City Administration City Council Agendas City Council Minutes City Administrator City Clerk Documents Archive Finance Finance Department Staff Human Resources Planning Public Safety Office of Emergency Preparedness Fire Department Fire Department History Fire Suppression Fire Stations Fire Fighting Equipment Emergency Medical Services Hazardous Materials Response Rescue Services Education / Outreach Programs Fire Special Events Fire Prevention Programs Police Department Municipal Code Municipal Code Amendments Public Safety Incident Logs Public Works Frequently Asked Questions Stormwater Management Water Services Recreation Recreation & Parks Commission Visitors Things to Do Places to Eat Places to Stay Media In the News Photos Video FAQs Contact Us Toggle website search Menu Close Home Residents Obtain New Utility Services New Utility Account – Eng New Utility Account – Esp Pay Utility Bills Online Transportation Recycling Community Programs Guadalupe Bulldogs Football Guadalupe Gladiators Service Clubs & Organizations Kiwanis Club of Guadalupe Lions Club of Guadalupe Masonic Lodge – Central Coast #237 Businesses Business Resources Starting a Business Commercial Property Government Mayor and City Council All Notices Building City Administration City Council Agendas City Council Minutes City Administrator City Clerk Documents Archive Finance Finance Department Staff Human Resources Planning Public Safety Office of Emergency Preparedness Fire Department Fire Department History Fire Suppression Fire Stations Fire Fighting Equipment Emergency Medical Services Hazardous Materials Response Rescue Services Education / Outreach Programs Fire Special Events Fire Prevention Programs Police Department Municipal Code Municipal Code Amendments Public Safety Incident Logs Public Works Frequently Asked Questions Stormwater Management Water Services Recreation Recreation & Parks Commission Visitors Things to Do Places to Eat Places to Stay Media In the News Photos Video FAQs Contact Us Toggle website search Police Officer Home > Documents > Police Officer Document Links Police-Officer.pdf Copyright 2024 - City of Guadalupe. All Rights Reserved. Terms of Use | Accessibility Statement Home Page Photos Credit: Malcolm H Ross. -2217,http://www.longbeach.gov/police/press-releases/undetermined-death-investigation3/,Media Bulletins,Agency-Published Resources,UNDETERMINED DEATH INVESTIGATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/16/2018 FOR IMMEDIATE RELEASE Press Release # Subject: UNDETERMINED DEATH INVESTIGATION Contact: Media Relations (562) 570-5273 On Monday, May 14, 2018, at approximately 11:30 p.m., officers were dispatched to the area of Granada Avenue and Ocean Boulevard for a call regarding a person screaming. Upon arrival, officers observed a bystander detaining who they believed was a possible suspect. An officer with the help of Marine Patrol Special Services Officers proceeded to handcuff the suspect without any physical resistance, but they quickly realized he was in medical distress, and immediately removed the handcuffs. Officers subsequently started rendering life saving measures. The Long Beach Fire Department responded and determined the subject deceased at the scene. Preliminary investigation and witness statements indicates the suspect, a male adult, approached the victim and took her cell phone. The victim, a female adult, screamed for help when the suspect attempted to flee the scene. Bystanders came to her aid and made attempts to detain the suspect, which resulted in a physical altercation until officers arrived. As with any in custody death incidents, the Los Angeles County District Attorney’s Office was notified and respond to the scene and will be conducting a separate death investigation. The identity of the deceased is being withheld pending notification of next of kin. Cause of death will be determined by the Los Angeles Corner’s Office. Anyone with information regarding this this incident is urged to contact Homicide Detectives Malcom Evans and Robert Gonzales at (562) 570-7244. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2218,https://barnegatpolice.us/download/field-check/,Field Contacts,Police & Public Interactions,"","",404,"","","","","","","","" -2219,https://www.cityofpinebluff-ar.gov/copycred,Not Criminal Justice Related,Not Criminal Justice Related,"Accessibility, Copyrights, Credits & Privacy - City Of Pine Bluff","",200,"Error retrieving title: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))",[],"[""Accessibility, Copyrights, Credits & Privacy""]",[],[],[],[],Skip to Main Content Web Accessibility -2220,https://delcopa.gov/publicrelations/releases/2021/whatvoterscanexpect.html,Not Criminal Justice Related,Not Criminal Justice Related,"What Delaware County Voters Can Expect on Election Day - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""What Delaware County Voters Can Expect on Election Day""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -2221,http://www.longbeach.gov/police/press-releases/five-cited-during-undercover-vice-operation/,Media Bulletins,Agency-Published Resources,FIVE CITED DURING UNDERCOVER VICE OPERATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/8/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: FIVE CITED DURING UNDERCOVER VICE OPERATION Contact: Media Relations Detail (562) 570-5273 On January 5, 2015, the Long Beach Police Department's Vice -Investigations Section, in cooperation with investigators from the Department of -Alcoholic Beverage Control (ABC), participated in a Shoulder Tap Operation in -the City of Long Beach. The operation focused on individuals who -knowingly purchased alcohol for minors. Minors under the age of 21, under the -supervision of the L.B.P.D, approached customers outside the business. The -minors told the individuals they were too young to buy alcohol and requested -alcohol be purchased on their behalf. Five customers who purchased alcohol for a -minor were identified and subsequently issued a misdemeanor citation for -unlawfully furnishing alcohol to a minor. The businesses were unaware that an -undercover operation was underway. These operations are conducted with -the community's safety in mind.  The L.B.P.D. will continue to enforce ABC laws -at all establishments throughout the city and wants to remind everyone that -there are consequences for contributing to the delinquency of a minor. Anyone wishing to report illegal behavior relating to the unlawful sale of -alcohol should contact the Vice Investigations Section at (562) 570-7219. Anyone -wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus -your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2222,https://www.foxcrossingwi.gov/departments/police-department/resources/83-07_use-of-force/,Poor Data Source,Poor Data Source,83-07_Use of Force - Fox Crossing Fox Crossing,"",200,Fox Crossing - Bridging the Fox Cities Fox Crossing,"["""", """", ""83-07_Use of Force""]",[],[],[],[],[],"Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing Spring Recycling Event April 27th Informational Announcement – Outstanding Absentee Ballots for the April 2, 2024 Presidential Preference Primary & Spring Election Deadlines for April 2nd Spring Election & Presidential Preference Primary Spring/Summer Recreation Programs Signup for Village Notifications Current Job Opportunities Fox Crossing 2000 Municipal Drive Neenah, WI 54956 920-720-7100 . 83-07_Use of Force Copyright © 2010 - 2024 Fox Crossing, All Rights Reserved. Professional Web Site Design by Sandstone Digital. Disclaimer Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing Spring Recycling Event April 27th Informational Announcement – Outstanding Absentee Ballots for the April 2, 2024 Presidential Preference Primary & Spring Election Deadlines for April 2nd Spring Election & Presidential Preference Primary Spring/Summer Recreation Programs Signup for Village Notifications Current Job Opportunities Fox Crossing 2000 Municipal Drive Neenah, WI 54956 920-720-7100 . 83-07_Use of Force " -2223,http://www.longbeach.gov/police/press-releases/two-arrested--drugs--cash-and-guns-seized-in-connection-with-drug-trafficking/,Media Bulletins,Agency-Published Resources,"TWO ARRESTED; DRUGS, CASH AND GUNS SEIZED IN CONNECTION WITH DRUG TRAFFICKING","",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/6/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: TWO ARRESTED DRUGS CASH AND GUNS SEIZED IN CONNECTION WITH DRUG TRAFFICKING Contact: Media Relations Detail (562) 570-5273 Downey Location                          Long Beach Location (Click on a photo to enlarge) On March 3, 2014, an investigation into cocaine trafficking led Long Beach Police to a residence in the 9300 block of Telegraph Road in Downey. At that location, Carlos Mendoza Osuna, 34 years, of Downey, and Mario Coadras Chavez, 31 years, of Downey, were arrested for possession of cocaine for sale. Both are currently being held at Los Angeles County Jail. Approximately 32 kilos (70.4 pounds) of cocaine and approximately $14,000 cash were recovered. Further investigation, led detectives to the 200 block of W. Del Amo, Long Beach, where a search warrant was served on March 4, 2014. Approximately 22 kilos (48.4 pounds) of cocaine, $80,000 cash, a rifle, and a handgun were recovered. No one was arrested and the investigation continues. Anyone with information regarding narcotics activity is urged to contact the Long Beach Police Department Drug Investigations Section at (562) 570-7221. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2224,http://www.ryepolice.us/announcements/holiday-parade,Not Criminal Justice Related,Not Criminal Justice Related,Rye Police Department HoLiDaY PaRaDe!!!!!!! - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""HoLiDaY PaRaDe!!!!!!!""]","[""HoLiDaY PaRaDe!!!!!!!""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"­ Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search HoLiDaY PaRaDe!!!!!!! Home Announcements HoLiDaY PaRaDe!!!!!!! HoLiDaY PaRaDe!!!!!!! November 28, 2016 In Announcements It's that time again!!! Grab your jackets and mittens and come out to watch the Rye Holiday Parade! Sunday, December 4, at 1 PM.  Parade will start at Webster at Rye (795 Washington Rd) and will travel Washington Rd to the Rye Junior High School (501 Washington Rd).  Traffic will be slightly delayed during this time, so please seek an alternate route if necessary. Photo credit to seacoastonline.com Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search " -2225,https://www.coronadelmar.us/gambler-left-puppy-in-hot-car-with-mouth-taped-shut-at-vegas-casino-police-say/,Media Bulletins,Agency-Published Resources,"Gambler left puppy in hot car with mouth taped shut at Vegas casino, police say | Corona del Mar California","",200,Corona del Mar California,"[""Gambler left puppy in hot car with mouth taped shut at Vegas casino, police say""]","[""Menu"", ""Be First to Comment"", ""Subscribe"", """", """"]","[""Share this:"", ""Like this:"", ""Related"", ""Leave a Reply Cancel reply"", """"]",[],[],[],"" -2226,https://delcopa.gov/vote/pdf/latecontributions_24hourreport.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2227,https://police.greenvillesc.gov/232/jury-duty,Not Criminal Justice Related,Not Criminal Justice Related,"Jury Duty | Greenville, SC - Official Website",Jurors for Greenville Municipal Court are randomly selected from a database that contains information from the South Carolina Election Commission and the South Carolina Highway Department. ,200,"Police Department | Greenville, SC - Official Website","[""Jury Duty""]","[""Jury Selection"", ""Reporting for Jury Duty"", ""For More Information""]","[""Contacts"", ""Loading""]","[""Pam Larson"", ""Municipal Court""]",[],[],"Skip to Main Content Government Departments Business Visitors Residents Search Home Departments Municipal Court Jury Duty Jury Duty Jury Selection Jurors for Greenville Municipal Court are randomly selected from a database that contains information from the South Carolina Election Commission and the South Carolina Highway Department. If you are selected for a specific jury trial term, you will receive a Municipal Court Juror Response Form (PDF) and a self-addressed envelope in the mail. The Juror Response Form must be completed and returned to Municipal Court. Reporting for Jury Duty Please arrive promptly and please do not bring beverages, children, relatives, or friends with you on the day you report for jury duty. Upon arrival you will be shown to a courtroom separate from all other case parties attending jury trials. It is important that you do not speak with any case party, even if it is a relative. When the clerk calls your name, you should be prepared to stand and state your name and occupation. At that time, the judge may ask questions to determine your qualification to serve. If you are dismissed or told to report the following day, be sure to you know when and where you are to report. Each morning, roll will be taken to record your presence. For More Information If you need more information or wish to discuss your status for jury service, please call the Deputy Clerk at 864-467-6638. Each summoned juror will receive a Juror's Handbook (PDF) during roll call on his or her 1st day of service. Contacts Pam Larson Clerk of Court plarson@greenvillesc.gov Municipal Court Physical Address 426 N Main Street Greenville , SC 29601 Phone: 864-232-CARE (2273) Fax: 864-467-6651 Notice of Jury Trial Request (PDF) Directory Court Security Juror Criteria Parking & Court Access Terms of Service Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate " -2228,https://brookfieldil.gov/publication/fire-and-police-commission-special-meeting-december-17-2015/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2229,https://www.mass.gov/doc/2016-deputy-police-chief-employmentexperience-form-for-attleboro-examination-0/download,Training & Hiring Info,Info About Officers,"","",200,Mass.gov,[],[],[],[],[],[],"" -2230,https://www.warracres-ok.gov/police-department-history/warr-acres-old4/,Poor Data Source,Poor Data Source,Warr Acres OLD4 - City of Warr Acres,"",200,Home - City of Warr Acres,"[""Warr Acres OLD4""]","[""Primary menu links"", ""Action toolbar"", ""Contact""]",[],[],"[""How does the City calculate sewer rates?""]",[],City of Warr Acres Primary menu links Home Businesses Commercial Property Available Economic Development Residents Helpful Numbers Online Forms News City Newsletter City Maps City Parks Contact your city History of Warr Acres Recycling Report an Issue Sanitation & Sewer Newsletter Contact Employees Employee Email Job Listings Staff Only AFLAC BlueCross BlueShield Deferred Comp Action toolbar Answers Payments Report Issue Search Primary menu links Home Businesses Commercial Property Available Economic Development Residents Helpful Numbers Online Forms News City Newsletter City Maps City Parks Contact your city History of Warr Acres Recycling Report an Issue Sanitation & Sewer Newsletter Contact Employees Employee Email Job Listings Staff Only AFLAC BlueCross BlueShield Deferred Comp Action toolbar Answers Payments Report Issue Search City of Warr Acres City of Warr Acres City of Warr Acres Warr Acres OLD4 Warr Acres OLD4 Warr Acres OLD4 Share Facebook Twitter Email Size + Reset a − Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu -2231,https://www.sandiego.gov/police/recruiting/contact/dispatch,Training & Hiring Info,Info About Officers,Contact Police Dispatch | City of San Diego Official Website,"If you are interested in an application packet, or have questions about becoming a dispatcher, please complete the following contact form. This form is for Police Dispatch only. See Contact the SDPD Recruiting Unit for officer recruiting information and contact form. This form must be completed by a person eighteen years old or older.",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""Contact Police Dispatch""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", """", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -2232,https://www.eutawal.gov/news/national-police-week-2022/,Poor Data Source,Poor Data Source,National Police Week 2022 – The City of Eutaw Alabama,"",200,"Error retrieving title: HTTPSConnectionPool(host='www.eutawal.gov', port=443): Max retries exceeded with url: / (Caused by SSLError(CertificateError(""hostname 'www.eutawal.gov' doesn't match 'eutawal.gov'"")))","[""National Police Week 2022""]","[""Recent Posts"", ""Recent Comments"", ""Our Links"", ""Green County Links"", ""More Links..."", ""Gateway to the Black Belt ®""]",[],"[""The City of Eutaw Alabama""]",[],[],"Skip to content Menu Home Mayor, Council, and Administration City Departments Vendors & Bids Online Citizen Services Join #TeamEutaw Contact Us Facebook Open Search Window Home City News , Police Department News National Police Week 2022 National Police Week 2022 May 20, 2022 | City News , Police Department News | Bowman May 18th, 2022, Eutaw Alabama TS Police Support League, Mayor Johnson, and Chief Johnson Celebrate National Police Week We are very appreciative of our police officers, their hard work and dedication to the community! We appreciate Ms. Shelia Hann and Billy McFarland with the TS Police Support league who do so much for our police department and our community. In celebration of Police Officer Week they stopped by and brought lunch for the Police Department and City Hall employees. #teameutaw 2022 Moving Eutaw Forward News Last modified: May 20, 2022 Previous: April/May 2022 Water and Street Department News Next: May 2022 Updates Comments are closed. Search Search Recent Posts Hello world! RFP – Grant Writing and Grant Administration RFQ – Professional Engineering and Architectural Services RFQ – Debris and Storm Damage Clean Up RFP – Professional Tank Maintenance Service Recent Comments A WordPress Commenter on Hello world! The City of Eutaw Alabama Mayor Latasha Johnson City Hall • 116 Main St • Eutaw, AL 35462 Phone: (205) 372-4212 • Monday – Friday, 8:00 am - 4:00 pm Email: cityhall@eutawal.gov Search Search Our Links Mayor's Office City Clerk's Office Municipal Court Police Department Water & Sanitation Online Services Contact Us Green County Links County Commission Industrial Development Authority County Hospital Chamber of Commerce County Courthouse Probate Court Health Department Sheriff's Office Department of Human Resources More Links... Alabama.gov Alabama 811 Alabama Power Black Warrior EMC Greene County Water Arrow Disposal West Alabama CSP Alabama Works West Alabama Works Facebook Open Search Window Gateway to the Black Belt ® Announcements Privacy & Terms Employee Login Support © 2023 - the City of Eutaw Alabama - All Rights Reserved Search for: Search Close Search Window ↑ Skip to content Menu Home Mayor, Council, and Administration City Departments Vendors & Bids Online Citizen Services Join #TeamEutaw Contact Us Facebook Open Search Window Skip to content Menu Home Mayor, Council, and Administration City Departments Vendors & Bids Online Citizen Services Join #TeamEutaw Contact Us Facebook Open Search Window Menu Home Mayor, Council, and Administration City Departments Vendors & Bids Online Citizen Services Join #TeamEutaw Contact Us Facebook Open Search Window Facebook Open Search Window " -2233,https://www.coppelltx.gov/929/earthfest,Not Criminal Justice Related,Not Criminal Justice Related,"Earthfest | Coppell, TX",Celebrate EarthFest at the Biodiversity Education Center! EarthFest is a celebration of Coppell's commitment to the environment - an entertaining and educational experience! Visit environmental education booths to learn how you can lead a more sustainable lifestyle and explore Coppell Nature Park. ,200,"Coppell, TX | Official Website","[""Earthfest""]",[],"[""Saturday, April 20 • 11 a.m. – 1 p.m."", ""Activities"", ""Parking Information"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Parks & Trails Facilities Rentals Activities Home Government City Departments Community Experiences Activities Special Events Earthfest Earthfest Saturday, April 20 • 11 a.m. – 1 p.m. Biodiversity Education Center, 367 Freeport Parkway Come celebrate Coppell’s commitment to the environment with an entertaining and educational experience for all ages! Hosted at the Biodiversity Education Center (BEC), Earthfest highlights environmental, sustainable, and nature-themed projects and initiatives within the community. This event is sponsored in part by CityVet Coppell. Activities Attendees can chat with local Coppell ISD and community groups, browse vendor booths, meet and learn about a variety of exciting animals with Creature Teacher, and explore Coppell Nature Park. Along with the beautiful nature scenery, a monarch butterfly stilt walker will “flutter” through the event site, making for a perfect photo opportunity! Waffle O’licious food truck will also be available to purchase brunch eats and sweets. In addition to all the Earthfest excitement, the Biodiversity Education Center celebrates its 10-year anniversary! Be sure to check out the BEC birthday festivities recognizing 10 years of sharing nature education and exploration with the community. Document Shredding will be available for Coppell residents at the Coppell Service Center (816 S. Coppell Rd.) from 8am – 12pm. Email us to learn more about Earthfest! Parking Information Parking will be available at Wagon Wheel Park, located at 345 Freeport Parkway. The Biodiversity Education Center is located in the northwest corner of the parking lot. Wagon Wheel Park is located on Freeport Parkway, south of Sandy Lake Road and north of Bethel Road. Sunset Socials Gobble Wobble 5K & Fun Run Earthfest Old Town Anniversary Celebrate Coppell Parade Down Parkway Party in the Park Frequently Asked Questions Holidays Flick or Treat Total Eclipse of the Park Agendas & Minutes Alert Sign-Up Citizen Report E-News Pay Water Bill Permits 255 E. Parkway Blvd., P.O. Box 9478, Coppell, TX 75019 Phone: 972-462-0022 | Email us Site Map Contact Us Accessibility Copyright Notices Privacy Policy Employee Login /QuickLinks.aspx Government Websites by CivicPlus® " -2234,https://police.greenvillesc.gov/427/minoritywoman-owned-business-enterprise-,Not Criminal Justice Related,Not Criminal Justice Related,"Minority/Woman-Owned Business Enterprise Program | Greenville, SC - Official Website","To promote free competition and equal opportunity, the City of Greenville is committed to assisting small, minority-owned and woman-owned businesses in becoming active vendors with the City of Greenville.",200,"Police Department | Greenville, SC - Official Website","[""Minority/Woman-Owned Business Enterprise Program""]","[""About the Program"", ""City Policies"", ""Intent"", ""Definitions"", ""Preference in Scoring Proposals""]","[""Contacts"", ""Quick Link"", ""Loading""]","[""Rod Gray"", ""Purchasing Division""]",[],[],"Skip to Main Content Government Departments Business Visitors Residents Search Home Departments Purchasing Minority/Woman-Owned Business Enterprise Program Minority/Woman-Owned Business Enterprise Program About the Program To promote free competition and equal opportunity, the City of Greenville, through its Purchasing Division, is committed to assisting small, minority-owned and woman-owned businesses in becoming active vendors with the City of Greenville. The City of Greenville encourages and invites small, woman, and/or minority owned businesses located inside and outside the city limits to participate in the City's procurement process. City Policies View a summary of program policies to further understand preference opportunities and eligibility requirements. Intent Definitions Preference in Scoring Intent Intent Business firms owned and operated by minority and women persons, in general, have been historically restricted from full participation in the nation's free enterprise system to a degree disproportionate to other businesses. The City believes it is in the community's best interest to assist woman- and minority-owned businesses to develop fully, in furtherance of City's policies and programs which are designed to promote balanced economic and community growth. The City, therefore, wishes to ensure that woman- and minority-owned businesses (M/WBEs) are afforded the opportunity to fully participate in the City's procurement process. Definitions Definitions The term minority, as used in this document, means any group of individuals that are recognized, by state or federal law, as being socially-disadvantaged or economically-disadvantaged group. A minority/woman owned business enterprise means any business concern which: The business is at least 51% owned by one or more women or minority citizens. The corporation is owned by minority or women citizens who hold at least 51% of all classes of voting stock of the corporation. The partnership is owned by minority or women citizens who hold at least 51% of the partnership interests. Such individuals must be involved in the daily management and operations of the business concerned. Preference in Scoring Preference in Scoring Proposals In making procurement decisions which require written evaluations using weighted factors on a 100 point scale, M/WBEs submitting bids or proposals shall receive 5 additional points in the evaluation. There is no monetary advantage or set-aside included in this policy. Contacts Rod Gray rgray@greenvillesc.gov Minority Business Liaison Officer Purchasing Division Physical Address 206 S Main Street 7th Floor Greenville , SC 29601 Mailing Address Purchasing Division P.O. Box 2207 Greenville , SC 29602 Phone: 864-232-CARE (2273) Fax: 864-467-4597 Hours (Except Holidays) Monday through Friday 8 a.m. to 5 p.m. Directory Quick Link SC Small & Minority Business Assistance 2020 Capital Improvement Plan View Bids and RFPs /QuickLinks.aspx Bids & Requests For Proposals Minority/Woman-Owned Business Enterprise Program Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate " -2235,https://police.bixbyok.gov/256/find-laws-pertaining-to-the-city-of-bixb,Not Criminal Justice Related,Not Criminal Justice Related,"Find Laws pertaining to the City of Bixby | Bixby Police Department, OK","",200,"Bixby Police Department, OK | Official Website","[""Find Laws pertaining to the City of Bixby""]",[],"[""Helpful Links"", ""FAQs"", ""Site Links"", ""Loading""]","[""Bixby City Code"", ""Oklahoma State Statute""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Police Services Community Services Emergency Management How Do I... Home How Do I... Find Laws pertaining to the City of Bixby Find Laws pertaining to the City of Bixby 9 1 1 1 Bixby City Code Link to page Oklahoma State Statute Link to page Safety Tips Recruitment File a Report Community Relations City of Bixby offender lookup Records Request Bixby City Codes Submit a Tip Nixle Alerts FAQs Helpful Links Animal Control Car Seat Checks Forms Records /QuickLinks.aspx FAQs Does the City of Bixby have any Curfew Laws? How can I get Traffic enforcement or the speed trailer in my area? Will Bixby Fire or Police Department assist me in the installation of my child car seat? /FAQ.aspx Site Links Home Site Map Accessibility Disclaimer Copyright Notices /QuickLinks.aspx 116 W Needles, P.O. Box 70 Bixby, OK 74008 Phone: 918-366-8294 Fax: 918-366-2050 Government Websites by CivicPlus® Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Police Services Community Services Emergency Management How Do I... Home How Do I... Find Laws pertaining to the City of Bixby Find Laws pertaining to the City of Bixby 9 1 1 1 Bixby City Code Link to page Oklahoma State Statute Link to page Safety Tips Recruitment File a Report Community Relations City of Bixby offender lookup Records Request Bixby City Codes Submit a Tip Nixle Alerts FAQs Helpful Links Animal Control Car Seat Checks Forms Records /QuickLinks.aspx FAQs Does the City of Bixby have any Curfew Laws? How can I get Traffic enforcement or the speed trailer in my area? Will Bixby Fire or Police Department assist me in the installation of my child car seat? /FAQ.aspx Site Links Home Site Map Accessibility Disclaimer Copyright Notices /QuickLinks.aspx 116 W Needles, P.O. Box 70 Bixby, OK 74008 Phone: 918-366-8294 Fax: 918-366-2050 Government Websites by CivicPlus® Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -2236,https://coloradosprings.gov/police-department/webform/chiefs-youth-advisory-council-application,Resources,Agency-Published Resources,Chief's Youth Advisory Council Application | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Chief's Youth Advisory Council Application""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -2237,https://coloradosprings.gov/police-department/article/news/traffic-fatality-marksheffel-road-and-0,Media Bulletins,Agency-Published Resources,Traffic Fatality: Marksheffel Road and Drennan Road | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Traffic Fatality: Marksheffel Road and Drennan Road""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -2238,https://springfield-or.gov/event/springfield-police-advisory-committee-spac-13/,Not Criminal Justice Related,Not Criminal Justice Related,Springfield Police Advisory Committee (SPAC) – City of Springfield Oregon,"",200,City of Springfield Oregon,[],"[""Springfield Police Advisory Committee (SPAC)""]","[""May 5, 2022 @ 6:00 pm - 7:30 pm"", ""Event Navigation""]","[""Share This Story, Choose Your Platform!"", ""Details"", ""Venue"", ""Organizer""]",[],[],"" -2239,http://www.longbeach.gov/police/press-releases/fumigation-burglaries/,Media Bulletins,Agency-Published Resources,FUMIGATION BURGLARIES,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/19/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: FUMIGATION BURGLARIES Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department would like to -alert the community to an increase in a specific type of burglary -that is occurring, both locally and regionally, to houses and -apartment complexes that are in the process of being fumigated for -pest control. During these burglaries, suspects enter the tented structures that -are vacated, and take valuables such as electronics and -jewelry. The L.B.P.D. would like to offer the community a few tips which -could prevent you from becoming a victim: If your residence is being -fumigated, be sure to notify your immediate neighbors to be alert -and to report suspicious activity immediately by calling 9-1-1 Remove valuables from your home -prior to the fumigation process beginning Consider hiring private security to -watch over your home Contact L.B.P.D. and request extra -patrol in your area (District Car Check) by calling (562) -570-7260 It should also be noted that while a building is -being fumigated, it is infused with toxic chemicals, which could be -fatal if inhaled. Anyone with information regarding fumigation burglaries is asked to -contact the Long Beach Police Department's Burglary Detail at (562) -570-7351.  Anonymous tips may be submitted by calling -1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES -(274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2240,https://delcopa.gov/planning/pubs/openspaceplanvoliii.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County 2035 Open Space, Recreation, and Greenway Plan","",200,"Delaware County, Pennsylvania","[""Volume III: CountyParks and Recreation Plan""]",[],"[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Volume III: CountyParks and Recreation Plan Home / Departments / Planning Department / Publications / Open Space, Recreation, and Greenway Plan Volume III: County Parks and Recreation Plan Delaware County Open Space, Recreation, and Greenway Plan Date Published: April 2015 Due to the size of this volume, it is separated into the following files for convenient download: Cover, Acknowledgements, Table of Contents, and Chapter 1: Overview and Needs Analysis of County Parks and Recreation [1.8 mb] Chapter 2: Clayton County Park [13 mb] Chapter 3: Glen Providence County Park [13 mb] Chapter 4: Kent County Park [11.7 mb] Chapter 5: Rose Tree County Park [13.4 mb] Chapter 6: Smedley County Park [15.4 mb] Chapter 7: Upland County Park [13.4 mb] Appendices [1.8 mb] Abstract: The Open Space, Recreation, and Greenway Plan serves as a guide and resource for countywide, multi-municipal, and municipal open space planning efforts. It examines the policies and trends identified in the Delaware County 2035 Land Use Framework Plan with particular regard to open space, recreation, and greenway needs and opportunities specific to the County. Volume III specifically examines the Delaware County Parks and Recreation system, and includes long range site development drawings and accompanying narratives for several of the major County parks. Geographic Area: Countywide For more information or to order this report, contact the Department at 610-891-5200 or Planning_Department@co.delaware.pa.us . Planning Department Navigation Access the Data and Mapping Innovation Hub About Planning Calendar Current Projects Delaware County 2035 Demographic Data Development Review Forms Funding Green Space and Trails Project Mapping Municipal Programs & Initiatives Planning Education Publications Gina Burritt, Director Planning Department 2 W. Baltimore Avenue Suite 202 Media, PA 19063 Phone: 610-891-5200 Fax: 610-891-5203 Email: Planning_Department@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2023 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Volume III: CountyParks and Recreation Plan Home / Departments / Planning Department / Publications / Open Space, Recreation, and Greenway Plan Volume III: CountyParks and Recreation Plan Home / Departments / Planning Department / Publications / Open Space, Recreation, and Greenway Plan " -2241,http://www.longbeach.gov/press-releases/city-manager-announces-potential-recruitment-process-for-police-chief/,Media Bulletins,Agency-Published Resources,City Manager Announces Potential Recruitment Process for Police Chief,"",200,City of Long Beach,"[""PRESS RELEASE""]",[],[],[],[],[],"A- A A+ PRESS RELEASE City of Long Beach Public Information Office 411 W. Ocean Blvd, Long Beach, CA 90802 10/28/2014 FOR IMMEDIATE RELEASE Press Release # CM: 102814 Subject: City Manager Announces Potential Recruitment Process for Police Chief Contact: Debbie Mills, Director of Human Resources 562.570.6140 Debbie.Mills@longbeach.gov City Manager Pat West today announced the process for selecting a new Police Chief, should a vacancy occur as a result of the November 4, 2014 election. The City Manager plans to conduct an expedited recruitment process of internal candidates. All Long Beach Deputy Chiefs and Commanders will be eligible to apply for the position, and all interested candidates will be reviewed and interviewed. ""We have such strong internal candidates within our Police Department,"" said City Manager West. “Each and every member of our Police Command Staff are ready today to be Chief, giving Long Beach a strong, diverse pool of candidates to pick from.” The process will begin immediately following the November election, should it be necessary, and an announcement of a final decision is expected by mid-November to ensure a smooth transition. There is no expectation that an Interim Chief would be necessary. For more news, pictures, videos and announcements of what’s happening in Long Beach, follow us on Facebook , Twitter , Instagram and YouTube . A- A A+ PRESS RELEASE City of Long Beach Public Information Office 411 W. Ocean Blvd, Long Beach, CA 90802 10/28/2014 FOR IMMEDIATE RELEASE Press Release # CM: 102814 Subject: City Manager Announces Potential Recruitment Process for Police Chief Contact: Debbie Mills, Director of Human Resources 562.570.6140 Debbie.Mills@longbeach.gov City Manager Pat West today announced the process for selecting a new Police Chief, should a vacancy occur as a result of the November 4, 2014 election. The City Manager plans to conduct an expedited recruitment process of internal candidates. All Long Beach Deputy Chiefs and Commanders will be eligible to apply for the position, and all interested candidates will be reviewed and interviewed. ""We have such strong internal candidates within our Police Department,"" said City Manager West. “Each and every member of our Police Command Staff are ready today to be Chief, giving Long Beach a strong, diverse pool of candidates to pick from.” The process will begin immediately following the November election, should it be necessary, and an announcement of a final decision is expected by mid-November to ensure a smooth transition. There is no expectation that an Interim Chief would be necessary. For more news, pictures, videos and announcements of what’s happening in Long Beach, follow us on Facebook , Twitter , Instagram and YouTube . A- A A+ A- A A+ A- A A+ A- A A+ A- A A+ PRESS RELEASE City of Long Beach Public Information Office 411 W. Ocean Blvd, Long Beach, CA 90802 City of Long Beach Public Information Office 411 W. Ocean Blvd, Long Beach, CA 90802 " -2242,http://www.longbeach.gov/police/press-releases/warrant--expungement-servicing-event/,Media Bulletins,Agency-Published Resources,WARRANT & EXPUNGEMENT SERVICING EVENT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/18/2019 FOR IMMEDIATE RELEASE Press Release # Subject: WARRANT & EXPUNGEMENT SERVICING EVENT Contact: Media Relations Detail (562) 570-5273 LBPDMediaRelations@longbeach.gov Click on flyer to enlarge The Long Beach Police Department (LBPD) and the Long Beach City Prosecutor’s Office have teamed up for another Warrant and Expungement Servicing Event , in an effort to continue to help our community with non-violent offenses. The LBPD’s Warrant Detail currently has a multitude of misdemeanor and traffic warrants in the system that need to be addressed. Any person with outstanding traffic or non-violent misdemeanor warrant, issued by LBPD (only), is encouraged to participate in this event. All individuals who qualify will be issued a new citation and court date for their outstanding warrant in order to handle the warrant violation in court. During the first two warrant clearing events last year, over 130 individuals were assisted with LBPD warrants. It is apparent from the turnout of these events that our community is willing to partner with LBPD to get a fresh start by taking care of their outstanding warrants. If it’s not a warrant holding you back from future opportunities, maybe it’s an old misdemeanor conviction. Any person with a misdemeanor conviction is also encouraged to participate in this event. This event will be an opportunity to sit down with licensed attorneys and paralegals to help you expunge your criminal conviction from your record. “We couldn’t be happier to give our community an opportunity in achieving their goals and accomplishments by making it possible to expunge old misdemeanor convictions and help clear warrants,” said LBPD Vice Investigations Lieutenant, Dina Zapalski. The event will be held as follows: Date: Saturday, April 27, 2019 Time: 1:00 - 6:00 p.m. Location: Long Beach City College - Pacific Coast Campus 1305 E. Pacific Coast Highway (Parking Lot #1) Please note, the following warrants are NOT eligible for a citation release: Any Felony Crime A misdemeanor warrant involving violence (Domestic Violence, Crime involving a Firearm or Resisting Arrest) The misdemeanor warrant involved a violation of a restraining, protective, or stay away order This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2243,http://www.longbeach.gov/police/press-releases/police-seeking-the-public-s-help-with-identifying-armed-robbery-suspect-from-video/,Media Bulletins,Agency-Published Resources,POLICE SEEKING THE PUBLIC'S HELP WITH IDENTIFYING ARMED ROBBERY SUSPECT FROM VIDEO,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/22/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: POLICE SEEKING THE PUBLIC'S HELP WITH IDENTIFYING ARMED ROBBERY SUSPECT FROM VIDEO Contact: Media Relations (562) 570-5273 VIEW VIDEO OF SUSPECT The Long Beach Police Department is seeking the public’s help with identifying a suspect who committed an armed robbery to a local business. On March 22, 2014, at approximately 12:20 a.m., the suspect entered a local business in the 3400 block of Long Beach Boulevard. The suspect approached an employee and engaged them in conversation. During the conversation, the suspect pulled a handgun from his waistband and demanded money from the employee. The suspect fled the location on foot, getting away with the cash. He was last seen southbound on Long Beach Boulevard crossing Wardlow Street. While investigating, detectives located videotape evidence of the suspect entering and exiting the business. The suspect is described as a Male White or Male Hispanic, 30 – 40 years old, wearing a black cap with “Security” inscribed on the front, a multi-colored blue and white jacket, blue jeans and tan colored work boots. Anyone with information on the suspect or his whereabouts is urged to contact Long Beach Police Robbery Detective Fermin Gonzalez at (562) 570-7464. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2244,http://www.longbeach.gov/police/press-releases/click-it-or-ticket-campaign-starts-may-21st/,Media Bulletins,Agency-Published Resources,CLICK IT OR TICKET CAMPAIGN STARTS MAY 21ST,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2245,http://www.longbeach.gov/police/press-releases/dui-checkpoint-proves-effective-2-/,Media Bulletins,Agency-Published Resources,DUI CHECKPOINT PROVES EFFECTIVE(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/17/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: DUI CHECKPOINT PROVES EFFECTIVE Contact: Media Relations Detail (562) 570-5273 On Saturday, November 15, 2014, the Long Beach Police Department’s Traffic Section conducted a Driving Under the Influence/Driver License Checkpoint on 7th Street, west of Junipero Avenue, from 7 p.m. until 3 a.m. Officers were aided by Long Beach Police Reserves, Long Beach Police Explorers, and Long Beach Search and Rescue. During the eight-hour operation, 1508 vehicles passed through the checkpoint with 535 drivers being screened, and the following results: Seven (7) Standardized Field Sobriety Tests were conducted Six (6) drivers were arrested for DUI One (1) driver was cited for driving on a suspended license Five (5) drivers were cited for unlicensed driving Six (6) drivers were cited for unsafe driving One (1) vehicle was impounded Driving Under the Influence (DUI) checkpoints are a vital component in the fight against both impaired and unlicensed driving. Nationally, impaired driving caused by alcohol and/or drugs causes one death every 33 minutes. The average American has a 30% chance of being killed or injured by a driver under the influence. Sobriety checkpoints have been proven to reduce these types of driving-related collisions by removing such drivers from our streets. Funding for this program was provided by a grant from the California Office of Traffic Safety, through the National Highway Safety Administration. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2246,http://www.longbeach.gov/police/press-releases/murder-200-block-of-liberty-court/,Media Bulletins,Agency-Published Resources,MURDER 200 BLOCK OF LIBERTY COURT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/5/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: MURDER 200 BLOCK OF LIBERTY COURT Contact: Media Relations Detail (562) 570-5273 UPDATE: On April 4, 2017 detectives from the Long Beach Police Department made an arrest in the murder of Trevor McCrainey, which occurred on March 7, 2017 in the 200 block of Liberty Court. The suspect arrested is Joseph Jeremy Bronson, a 25 year-old resident of Long Beach. He was booked into the Long Beach Jail for murder and attempt murder charges. He is being held on $2 million bail. On March 7, 2017, at approximately 4:12 p.m., officers were dispatched to the 200 block of Liberty Court regarding a shots call. Upon arrival officers found 2 victims with apparent gunshot wounds. The first victim a male adult was determined deceased at the scene with a gunshot wound to the upper torso. The second victim a female adult had gunshot wounds to her upper and lower torso. She was transported to a local hospital by Long Beach Fire where she is listed in serious but stable condition. The deceased victim has been identified as Trevor McCrainey, a 22 year-old resident of Long Beach. The motive for this case is still under investigation but may be an incident of road-rage, after the victims and suspect/s got in an argument at a different location just prior to the shooting. Anyone with information regarding the incident is asked to contact Homicide Detectives Malcolm Evans and Robert Gonzales at (562) 570-7244. Anyone wishing to remain anonymous may submit a tip through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2247,http://www.longbeach.gov/police/press-releases/super-bowl-driving-impaired-enforcement/,Media Bulletins,Agency-Published Resources,SUPER BOWL IMPAIRED DRIVER ENFORCEMENT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/1/2019 FOR IMMEDIATE RELEASE Press Release # Subject: SUPER BOWL IMPAIRED DRIVER ENFORCEMENT Contact: Media Relations Detail (562) 570-5273 LBPDMediaRelations@longbeach.gov CLICK TO ENLARGE IMAGE The Long Beach Police Department is encouraging all football fans to celebrate Super Bowl LIII responsibly by not driving impaired, or letting other fans get behind the wheel when they shouldn’t. “Millions of people will be watching the Super Bowl at parties and bars across the country. Don’t put others at risk because you chose to break the law and drive impaired,” stated Lieutenant Kris Klein. “Have a game plan for the big game by making sure you have a safe way to get home.  Your best defense against impaired driving is to use a designated sober driver.” In an effort to flag those who choose to drive impaired, Long Beach Police Department will increase patrols Super Bowl Sunday (Feb. 3) Additional officers will be on the lookout for drivers suspected of driving under the influence of alcohol and/or drugs.  Residents are also encouraged to report drunk drivers by calling 911. The Long Beach Police Department also reminds drivers that “DUI Doesn’t Just Mean Booze.” Prescription drugs, particularly those with a driving or operating machinery warning on the label, and marijuana can also be impairing and result in a DUI, especially when used in combination with alcohol or other drugs.  If you’re hosting a party, be a team player and have plenty of snacks and non-alcoholic drinks available for designated sober drivers. Be sure to monitor who is drinking and how they are getting home. If you plan to drink, don’t plan to drive, even one drink can be one too many. So be this year’s “MVP” by being the sober driver to help others get home or if you choose to drink, use ride-shares or take public transportation. No matter who you are rooting for on Super Bowl Sunday, we are all on the same team when the game ends so remember to go safely. Funding for Super Bowl Sunday enforcement is provided by a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2248,http://www.longbeach.gov/police/press-releases/murder-14-/,Media Bulletins,Agency-Published Resources,MURDER(14),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/9/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Saturday, April 5, 2014, around 9:07 p.m., Long Beach Police were dispatched to a report of shots heard in the 2300 block of Eucalyptus Avenue, which resulted in the death of a male adult. Arriving officers discovered two male adult victims with apparent gunshot wounds to the lower body. Long Beach Fire Department paramedics transported both victims to a local hospital. One victim appeared to be in critical condition and the other in stable condition with a non-life threatening injury. On Tuesday, April 8, 2014, Long Beach Police were notified one of the victims succumbed to his injuries. He has been identified as 51-year-old Herbert Shephard of Los Angeles. The surviving victim's identity will not be released. No suspect information is available and a motive for the shooting is unknown. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detectives Todd Johnson and Roger Zottneck at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2249,http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-tomorrow/,Media Bulletins,Agency-Published Resources,DUI/DRIVERS LICENSE CHECKPOINT PLANNED TOMORROW,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2250,http://www.longbeach.gov/police/press-releases/click-it-or-ticket-campaign-begins-may-18th/,Media Bulletins,Agency-Published Resources,CLICK IT OR TICKET CAMPAIGN BEGINS MAY 18TH,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/13/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: ""CLICK IT OR TICKET"" CAMPAIGN BEGINS MAY 18TH Contact: Media Relations (562) 570-5273 Once again, the Long Beach Police Department is reminding motorists to Click It or Ticket. As part of the national seat belt enforcement campaign, law enforcement agencies around the country will be stepping up enforcement May 18-31, which includes one of the busiest travel weekends of the year. ""Every day, unbuckled motorists are losing their lives in motor vehicle crashes,"" said Traffic Enforcement Lieutenant Kris Klein of the Long Beach Police Department. “As we approach Memorial Day weekend and the summer vacation season, we want to make sure people are doing the one best thing that can save them in a crash, buckling up.” According to the National Highway Traffic Safety Administration, nearly half of the 21,132 passenger vehicle occupants killed in crashes in 2013 were unrestrained. At night from 6:00 p.m. to 5:59 a.m., that number soared to 59 percent of those killed, which is why one focus of the Click It or Ticket campaign is nighttime enforcement. Participating law enforcement agencies will be taking a no-excuse approach to seat belt law enforcement, issuing citations day and night. In California, the minimum penalty for a seat belt violation is $161. Officers will conduct four nighttime seat belt enforcement operations during the two week Click It Or Ticket mobilization, to help lower California’s traffic deaths. In addition to these special patrols, officers on routine patrol will also be looking for unrestrained drivers and passengers to stop and cite. California statistics reveal that 500 unrestrained vehicle occupants died in 2013. Almost twice as many males were killed in crashes as compared to females, with lower belt use rates too. Of the males killed in crashes in 2013, more than half (54%) were unrestrained. For females killed in crashes, 41 percent were not buckled-up. “If you ask the family members of those unrestrained people who were killed in crashes, they’ll tell you - they wish their loved ones had buckled up,” added Lieutenant Klein. “The bottom line is that seat belts save lives. If these enforcement crackdowns get people’s attention and get them to buckle up, then we’ve done our job.” Funding for these operations is provided by a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration. For more information on the Click It or Ticket mobilization, please visit www.nhtsa.gov/ciot . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2252,http://www.longbeach.gov/police/press-releases/traffic-fatality--ocean-blvd----710-transition-/,Media Bulletins,Agency-Published Resources,Traffic Fatality (Ocean Blvd. & 710 Transition),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/23/2016 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Thursday, December 22, 2016, at approximately 9:24 p.m., Long Beach Police responded to Ocean Boulevard at the northbound 710 Freeway regarding a traffic collision between a vehicle and a pedestrian, which resulted in the death of the pedestrian. When officers arrived, they discovered a 2011 Freightliner semi-tractor stopped in the #1 lane of eastbound Ocean Boulevard, just east of the northbound 710 Freeway transition. Officers located a male subject with serious injuries, in the gore point area of Ocean Boulevard between the eastbound and westbound lanes of Ocean Boulevard. LBFD paramedics responded and transported the victim to a local hospital, where he was later pronounced deceased. The investigation revealed the semi-tractor was traveling eastbound in the #1 lane of Ocean Boulevard, when the pedestrian attempted to cross southbound Ocean Boulevard. The driver of the semi-tractor attempted to swerve, but was unable to avoid striking the pedestrian, and then crashed into the guardrail and eventually came to rest in the #1 lane of eastbound Ocean Boulevard. The semi-tractor was not pulling a trailer at the time of the collision. The driver of the semi-tractor was identified as a 36-year-old resident of La Puente. He had a valid driver’s license and insurance, and was interviewed at the scene and released. The pedestrian had no identification on his person, and appeared to be possibly homeless. The Los Angeles County Coroner’s office will attempt to identify the victim and make notification to next of kin. Anyone who may have witnessed the incident is asked to contact Long Beach Police Collision Investigation Detective Brian Watt at (562) 570-7355. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2253,http://www.longbeach.gov/police/press-releases/traffic-fatality---obispo-ave-and-broadway/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY - OBISPO AVE AND BROADWAY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/13/2019 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY - OBISPO AVE AND BROADWAY Contact: Media Relations Detail (562) 570-5273 LBPDMediaRelations@longbeach.gov On January 11, 2019, at approximately 8:36 p.m., officers responded to the area of Obispo Avenue and Broadway regarding a head on traffic collision between two vehicles, which resulted in the death of a male adult. The preliminary investigation revealed the collision occurred when the driver of a Kia Soul was traveling south on Obispo Avenue south of Broadway when a Chevrolet Silverado was stopped facing north on the northbound side of the roadway, with his headlamps and flashers on, to pick up a co-worker.  The driver of the Kia Soul then collided with the stopped Chevrolet Silverado. The collision caused the Kia Soul to also collide with an unoccupied Honda Civic that was parked along the west curb of the street. The driver of the Kia Soul, a 36-year-old male adult resident of Long Beach was transported to a local hospital in critical condition where he was later pronounced deceased. Identity is being withheld at this time pending notification to next of kin. Officers also contacted a 54-year-old male resident of Bullhead City, AZ who was identified as the driver of a 2014 Chevrolet Silverado involved in the collision. He had a valid license, stayed at the scene and cooperated with the investigation. There was no indication drugs or alcohol were a factor in the collision. The investigation remains ongoing. Anyone who may information regarding this incident is asked to call Long Beach Police Department Collision Investigation Detail Detective David Whelan at (562) 570-7355. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2254,http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-this-weekend7/,Media Bulletins,Agency-Published Resources,DUI/DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2255,http://www.longbeach.gov/police/press-releases/dui-enforcement-operations-planned-this-weekend-6-/,Media Bulletins,Agency-Published Resources,DUI ENFORCEMENT OPERATIONS PLANNED THIS WEEKEND(6),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/29/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: DUI ENFORCEMENT OPERATIONS PLANNED THIS WEEKEND Contact: Media Relations Detail (562) 570-5273 Officers from the Long Beach Police Department’s DUI Enforcement Team will deploy this weekend to stop and arrest alcohol and drug-impaired drivers in the Department’s ongoing traffic safety campaign. DUI Saturation Patrols will deploy on January 30, 2015 between the hours of 7:00 p.m. and 3:00 a.m., in areas with high frequencies of DUI collisions and/or arrests. After falling dramatically for five straight years, figures for 2012 show an increase to 802 deaths in California because someone failed to designate a sober driver. Over the course of the past three years in Long Beach, DUI collisions have claimed nine lives and resulted in 315 injury crashes, harming 420 of our friends and neighbors. Driving under the influence can impact the economy in addition to the pain and suffering of those immediately affected. Conservatively, a fatality has a $1.4 million impact, an injury $70,000, and a crash that only damages property averages nearly $9000. If you’re drinking and driving, law enforcement will find and arrest you. No warnings, no excuses.  The only way to truly avoid a DUI is to drive sober. There are many ways to get home safely after drinking, and driving isn’t one of them. Designate a sober driver ahead of time, or call a friend or family member. You could also use public transportation, or call a taxi. The cost of cab fare is nothing compared to a $10,000 DUI or the cost of someone’s life, and the ‘inconvenience’ of not driving your own car home is nothing compared to the inconvenience of spending time behind bars. Funding for this program is from a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration. Report Drunk Drivers, Call 9-1-1! This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2256,http://www.longbeach.gov/police/press-releases/checkpoint/,Media Bulletins,Agency-Published Resources,CHECKPOINT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2257,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-nets-four-arrests/,Media Bulletins,Agency-Published Resources,DUI SATURATION PATROL NETS FOUR ARRESTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/14/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: DUI SATURATION PATROL NETS FOUR ARRESTS Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department Traffic Section conducted a DUI Saturation Patrol on December 12, 2015, between the hours of 7:00 p.m. and 3:00 a.m. High visibility DUI enforcement efforts have a deterrent effect reducing the incidents of impaired driving and will continue thanks to special funding for extra officers to patrol for this deadly crime. The operation resulted in the following: 49 vehicle enforcement stops were conducted 13 field sobriety tests were conducted 4 DUI-alcohol suspects were arrested 1 driver was arrested for an outstanding DUI warrant 11 citations were issued Law enforcement emphasizes the preventable nature of drunk driving, reminding everyone that all it takes is a little planning ahead. Designate a sober driver or call a cab. But whatever you do, don’t drink and drive. The California Office of Traffic Safety DDVIP (Designated Driver VIP) mobile app is now available for free download on iOS and Android devices. Launched last year, the DDVIP app offers enhanced features, allowing users to “Map a Spot” with their current location to find DDVIP partnering establishments in their area or a “List of Spots” to search all participating bars and restaurants throughout California. Users will be offered free incentives at each bar to celebrate their life saving role. They can stay up-to-date with the latest from DDVIP and see what other users are saying via its social tab. Also through the app, for those who want to imbibe but also make it a point to plan ahead, users can easily order a sober ride from one of several ride sharing services – all from one screen. Drivers caught driving impaired can expect the impact of their DUI arrest to include jail time, fines, fees, DUI classes, and other expenses that can exceed $10,000, not to mention the embarrassment when friends and family find out. The Long Beach Police Department will conduct a DUI/Drivers License Checkpoint on Saturday, December 19, 2015, in the Department’s ongoing commitment to lowering deaths and injuries upon the city’s streets and highways. The DUI Saturation Patrol was funded by a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration, reminding everyone to ‘Report Drunk Driver – Call 9-1-1’. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2258,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-proves-effective-6-/,Media Bulletins,Agency-Published Resources,DUI SATURATION PATROL PROVES EFFECTIVE(6),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/3/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: DUI SATURATION PATROL PROVES EFFECTIVE Contact: Media Relations Detail (562) 570-5273 On Saturday, February 28, 2015, the Long Beach Police Department’s Traffic Section conducted a Driving Under the Influence (DUI) Saturation Patrol from 7:00p.m. until 3:00a.m.  During the eight-hour operation, motor officers patrolled throughout the city looking for impaired drivers and took the following enforcement actions: Conducted fifty-four (54) enforcement stops Conducted ten (10) Standardized Field Sobriety Tests Made four (4) DUI arrests Issued one (1) citation to an unlicensed driver Impounded one (1) vehicle for driver being unlicensed Issued eight (8) traffic citations for unsafe driving After falling dramatically for five straight years, figures for 2012 show an increase to 802 deaths in California because someone failed to designate a sober driver. Over the course of the past three years in Long Beach, DUI collisions claimed nine lives and resulted in 315 injury crashes, harming 420 of our friends and neighbors. Driving under the influence can impact the economy in addition to the pain and suffering of those immediately affected. Conservatively, a fatality has a $1.4 million impact, an injury $70,000, and a crash that only damages property averages nearly $9000. Funding for this program is from a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration. Report Drunk Drivers, Call 9-1-1! This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2260,http://www.longbeach.gov/police/press-releases/charges-filed-against-three-suspects-for-brutal-crime/,Media Bulletins,Agency-Published Resources,CHARGES FILED AGAINST THREE SUSPECTS FOR BRUTAL CRIME,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2261,http://www.longbeach.gov/police/press-releases/distracting-driving-will-be-enforced/,Media Bulletins,Agency-Published Resources,Distracting Driving Will be Enforced,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2263,http://www.longbeach.gov/police/press-releases/arrest-made-and-charges-filed-in-human-trafficking-of-a-minor-case/,Media Bulletins,Agency-Published Resources,ARREST MADE AND CHARGES FILED IN HUMAN TRAFFICKING OF A MINOR CASE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/23/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: ARREST MADE AND CHARGES FILED IN HUMAN TRAFFICKING OF A MINOR CASE Contact: Media Relations (562) 570-5273 On Wednesday, October 21, 2015, detectives from the Long Beach Police Department Vice Investigations Section arrested 38-year-old Long Beach resident Jeff Floyd Beadle for trafficking a 17-year-old girl and today charges were filed. Detectives initiated an investigation after seeing an advertisement for prostitution on the Internet. During their investigation detectives learned the victim had been forced to provide sex for money and was working out of an old dilapidated motor home where she was living with the suspect. Beadle, who is currently on active parole for committing a lewd and lascivious act, was identified as the suspect and was subsequently arrested. The victim was rescued and will be provided services through the Los Angeles County First Responder Protocol For Sexually Exploited Children. Today, detectives presented the case to the Los Angeles County District Attorney's office. Beadle was charged with human trafficking of a minor and pimping and pandering a minor.  Beadle will be arraigned on Monday, October 26, 2015 at Long Beach Superior Court and is currently being held at the  Los Angeles County Men’s Jail without bail. The Long Beach Police Department is a proud member of the Commercially Sexually Exploited Child Task Force formed in 2013 by the Los Angeles Board of Supervisors. The protocol, designed by the task force, provides immediate victim centered services to minors who have been sexually exploited. Long Beach Vice Detectives have used the protocol seventeen (17) times this year for minor victims they have recovered and it has been a success. Anyone with information regarding this investigation, or anyone who is or has been a victim of human trafficking is urged to call the Long Beach Police Vice Investigations Detail for help at (562) 570-7219. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2264,http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-this-weekend4/,Media Bulletins,Agency-Published Resources,DUI/DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2265,http://www.longbeach.gov/police/press-releases/traffic-fatality-2-/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/27/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: TRAFFIC FATALITY Contact: Media Relations (562) 570-5273 On Monday, May 26, 2014, at approximately 1:27 p.m., Long Beach Police were dispatched to the area of Long Beach Boulevard and 16th Street regarding an injury traffic collision. Arriving officers discovered an unconscious male adult bicyclist lying in the roadway after being struck by a 2006 Ford Econoline medical transport van. Long Beach Fire Department personnel responded and pronounced the bicyclist deceased at the scene. The bicyclist was identified as 80-year-old Long Beach resident Mariano Carasaquit Libron. The preliminary investigation revealed Mr. Libron rode his bicycle eastbound on 16th Street in a crosswalk at the intersection of Long Beach Boulevard, and failed to stop for a red traffic signal. The Ford Econoline, driven by a 24-year-old Long Beach resident, was traveling southbound on Long Beach Boulevard on a solid green traffic signal and struck Mr. Libron. The driver of the van and one passenger, a patient being transported in the van, were uninjured. The passenger was interviewed and released at the scene. The driver was positively identified and was properly licensed. The driver was interviewed and released at the scene. The investigation remains ongoing. Anyone with information regarding this collision is asked to call Long Beach Police Department Collision Investigation Detail Detective Steve Fox at (562) 570-7355. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2266,http://www.longbeach.gov/police/press-releases/traffic-fatality-marina-dr---studebaker/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/10/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Sunday, April 10, 2017, at approx. 7:55 p.m., Long Beach Police responded to a vehicle versus a motorcycle traffic collision on Marina Drive, just west of Studebaker Road, which resulted in the death of the motorcyclist. Upon arrival, officers discovered a 2006 Buick Terraza with major damage to the rear right side area, and a 2016 Harley Davidson motorcycle that had split in two pieces. The driver of the motorcycle was found lying in the street and had sustained major injuries. He was transported to a local hospital by L.B.F.D. paramedics and pronounced deceased a few hours later. The investigation revealed the Buick was traveling south/east on Marina Drive and was attempting to make a left hand turn into a shopping center, when it was struck by the motorcycle, which was traveling north/west on Marina Drive in the #1 lane, at a high rate of speed. The force of the impact caused the handlebars, front forks, and front wheel of the motorcycle to break apart from the rest of the motorcycle. The driver of the motorcycle is only being identified as a 25-year-old male resident of Long Beach, pending notification of next of kin. He was believed to be driving under the influence of alcohol and did not have a valid motorcycle endorsement on his California driver’s license. The driver of the Buick was a 39-year-old female resident of Long Beach. She and her 12-year-old passenger had only minor pain and were not transported. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2267,http://www.longbeach.gov/police/press-releases/bird-theft-suspect-arrested--two-others-remain-outstanding/,Media Bulletins,Agency-Published Resources,BIRD THEFT SUSPECT ARRESTED; TWO OTHERS REMAIN OUTSTANDING,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/9/2015 FOR IMMEDIATE RELEASE Press Release # Subject: BIRD THEFT SUSPECT ARRESTED; TWO OTHERS REMAIN OUTSTANDING Contact: Media Relations Detail (562) 570-5273 In May of 2015, Long Beach Police asked for the public’s help in locating a named suspect wanted in connection with the theft of exotic birds from a Long Beach home, and identifying two other suspects also involved who were all caught on video surveillance. One of the three suspects has been arrested and police are still asking for the public’s help regarding the two other suspects. Through their investigation, detectives identified 42-year-old Jose Jesus Zermeno as the suspect who entered the backyard of a residence in the 6700 block of Harbor Avenue and stole five exotic birds from separate birdcages. Zermeno was observed on video climbing over the fence into the backyard, opening cages, removing the birds, and handing them over the fence to a second suspect. Suspect Zermeno remains outstanding. Through continued efforts, detectives were able to identify the second suspect as 31-year-old Gerardo Jose Victoria of Long Beach, who was taken into custody on June 10, 2015 in the 800 block of E. Pacific Coast Highway. Victoria was booked for grand theft and possession for sales, and was held on $40,000 bail at the Long Beach City Jail. He was arraigned in Long Beach Superior Court on Tuesday, September 8, 2015, and held to answer on the above charges. He is due back in court on November 3, 2015, for trial proceedings. A third unidentified suspect who drove a red Ford Ranger truck, the means of transportation the suspects used to commit the crime and flee, also remains outstanding. Suspect Zermeno is a male Hispanic, approximately 5’ 3” with a medium build. Anyone who may have information regarding his whereabouts, or the identity/whereabouts of the third suspect who drove the truck, is asked to contact the Long Beach Police Department’s Burglary Detail at (562) 570-7351. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. To view the original News Release, (which includes a photo of Suspect Zermeno and links to the video surveillance footage initially released), click on the below link: Bird Theft Suspect Identified; Suspect's Help Sought This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2268,http://www.longbeach.gov/police/press-releases/murder-1100-block-locust/,Media Bulletins,Agency-Published Resources,murder 1100 block locust,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/22/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Saturday, May 21, 2016, at approximately 12:49 p.m., Long Beach Police were dispatched to assist Long Beach Fire Department personnel with a deceased individual inside a residence, in the 1100 block of Locust Avenue. Arriving officers found a female adult who sustained a stab wound to the torso. Homicide detectives responded to begin their investigation. The victim has been identified as 68-year-old Margarita Valdez Castro, a resident of Long Beach. Luis Antonio Jimenezmolina, 32 years old and a resident of Long Beach, has been booked murder. He is being held in Long Beach City Jail with bail set at $2,000,000.00. The incident does not appear to be random. A motive for the stabbing is unknown and the investigation remains ongoing. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detectives Todd Johnson and Shea Robertson at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2269,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-nets-five-arrests/,Media Bulletins,Agency-Published Resources,DUI SATURATION PATROL NETS FIVE ARRESTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/8/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: DUI SATURATION PATROL NETS FIVE ARRESTS Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department Traffic Unit conducted a DUI Saturation Patrol on Friday, May 5, 2017, between the hours of 6:00 p.m. and 2:00 a.m. High Visibility Enforcement efforts like this have a deterrent effect, lowering the incidents of impaired driving. Results included: · 35 vehicle enforcement stops · 7 Standardized Field Sobriety Tests (SFST) completed · 5 DUI-Alcohol suspects arrested · 10 citations issued for unsafe driving Drivers caught driving impaired can expect the impact of a DUI arrest to include jail time, fines, fees, DUI classes, license suspension and other expenses that can exceed $10,000, not to mention the embarrassment when friends and family find out. Drivers are encouraged to download the Designated Driver VIP (DDVIP) free mobile app for Android or iPhone. The DDVIP app helps find nearby bars and restaurants that feature free incentives for the designated sober driver, from free non-alcoholic drinks to free appetizers and more. The feature-packed app even has social media tie-ins and a tab for the non-DD to call a commercial ride-sharing service. Studies of California drivers have shown that 30 percent of drivers in fatal crashes had one or more drugs in their systems. A study of active drivers showed more tested positive for drugs that may impair driving (14 percent) than did for alcohol (7.3 percent). Of the drugs, marijuana was most prevalent, at 7.4 percent, slightly more than alcohol. Long Beach Police Department will conduct another DUI Saturation Patrol on Saturday, June 3, 2017, in its ongoing commitment to lower deaths and injuries upon our streets and highways. The DUI Saturation Patrol was funded by a grant from the California Office of Traffic Safety through the National Highway Traffic Safety Administration reminding everyone to 'Report Drunk Drivers: Call 9-1-1.' This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2270,http://www.longbeach.gov/police/press-releases/frequently-requested-lbpd-policies-available-on-website/,Media Bulletins,Agency-Published Resources,Frequently Requested LBPD Policies Available on Website,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2272,http://www.longbeach.gov/press-releases/long-beach-police-lieutenant-reunites-with-resident-he-helped/,Media Bulletins,Agency-Published Resources,Long Beach Police Lieutenant Reunites With Resident He Helped,"",200,City of Long Beach,"[""PRESS RELEASE""]",[],[],[],[],[],"" -2273,http://www.longbeach.gov/police/press-releases/three-suspects-arrested-for-2013-murder/,Media Bulletins,Agency-Published Resources,THREE SUSPECTS ARRESTED FOR 2013 MURDER,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/17/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: THREE SUSPECTS ARRESTED FOR 2013 MURDER Contact: Media Relations Detail (562) 570-5273 Three suspects have been arrested and charged in connection to a 2013 murder. On April 28, 2013, at approximately 3:00 a.m., Long Beach Police were dispatched to a report of gunshots heard in the area of Spaulding Street and Junipero Avenue. Officers arrived and discovered a male adult victim, lying in the roadway in the 1400 block of Junipero Avenue. The victim had an apparent gunshot wound to his upper body and died at the scene before the officers arrived. The Los Angeles County Coroner’s Office later identified the victim as Enrique Casique, 39 years old and a resident of Long Beach. On Tuesday, June 4, 2013, detectives arrested Miguel Medina, a 32-year-old resident of Long Beach. On Thursday, January 23, 2014, detectives arrested Jose Torres, a 30-year-old resident of Long Beach. On April 4, 2014, a warrant was issued for Marcial Rios, a 32-year-old resident of Long Beach, in connection with the murder. On April 12, 2014, Rios was taken into custody by United States Customs Agents at the United States-Mexico border in San Ysidro, California, and was returned to the United States. Rios was arraigned today, April 17, 2014. The Los Angeles County District Attorney’s Office filed murder charges on all three in connection with the murder of Enrique Casique. All three individuals are being held at Los Angeles County Jail. The investigation remains on going. Anyone with information regarding this incident is urged to contact the Long Beach Police Homicide Detective Hugo Cortes at (562) 570-7244. Anyone wishing to remain anonymous may call Anyone with information regarding this incident is encouraged to call Long Beach Police Homicide 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2274,https://www.coppelltx.gov/524/state-of-the-city,Not Criminal Justice Related,Not Criminal Justice Related,"State of the City | Coppell, TX",Check out the most recent Coppell State of the City address.,200,"Coppell, TX | Official Website","[""State of the City""]","[""2024 State of the City""]","[""Loading""]",[],[],[],Skip to Main Content -2275,http://www.longbeach.gov/police/press-releases/motorcycle-safety-operation/,Media Bulletins,Agency-Published Resources,IMPROVING MOTORCYCLE SAFETY AIM OF LONG BEACH POLICE DEPARTMENT OPERATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/24/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: IMPROVING MOTORCYCLE SAFETY AIM OF LONG BEACH POLICE DEPARTMENT OPERATION Careless motorists as well as riders get special scrutiny Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department will conduct a specialized Motorcycle Safety Enforcement Operation on Sunday, March 26, 2017, in an effort to lower deaths and injuries. Extra officers will be on duty patrolling areas frequented by motorcyclists and where motorcycle crashes occur. Officers will be looking for violations made by drivers and riders alike that can lead to motorcycle crashes. They will be cracking down on both those operating regular vehicles and motorcycles who are violating traffic safety laws. Motorcycle fatalities jumped dramatically in California by over 28 percent from a decade low of 352 in 2010. In 2013, 453 motorcyclists lost their lives, which is at a five-year high. California collision data reveals that primary causes of motorcycle-involved crashes include speeding, unsafe turning and impairment due to alcohol and other drugs by both riders and drivers alike. Operations like this are aimed at curbing any more increases in motorcycle deaths and sending the numbers back downward. Over the course of the past three years, motorcycle-involved collisions have resulted in 315 fatal and injury crashes. Safety tips for riders – See and Be Seen: · Use your lane position to increase visibility; change lanes only when there is ample room · Match your speed to surrounding traffic · Always wear a DOT compliant helmet and brightly colored, protective clothing · Ride with lights on during daylight hours Safety tips for drivers – Share the Road: · Look twice for motorcyclists, especially when entering the roadway, turning or changing lanes · Motorcyclist are allowed in HOV lanes unless prohibited by signage Riders are urged to obtain training through the California Motorcyclist Safety Program. Information and training locations are available at http://www.californiamotorcyclist.com/ or 1-877 RIDE 411 (1-877-743-3411). Funding for this program is provided by a grant from the California Office of Traffic Safety through the National Highway Traffic Safety Administration. The message to all drivers and motorcyclists is: share in the responsibility and do your part by safely “sharing the road.” This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2276,https://southamptontownnypolice.gov/faq.aspx?qid=299,Contact Info & Agency Meta,Info About Agencies,"FAQs • I want to build a dock off my property, what do I nee","",200,"Police | Southampton, NY - Official Website",[],"[""▼ Trustees""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2277,https://coloradosprings.gov/police-department/article/news/suspect-multiple-armed-robberies-arrested,Media Bulletins,Agency-Published Resources,Suspect in multiple armed robberies arrested | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Suspect in multiple armed robberies arrested""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -2278,https://alpha.austin.gov/en/police-oversight/formal-complaints-opo-processed-on-june-5-purpose-and-scopecommunity-policing-and-other-policy-violations/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2279,http://www.longbeach.gov/police/press-releases/murder-investigation---1200-block-of-chestnut/,Media Bulletins,Agency-Published Resources,MURDER INVESTIGATION - 1200 BLOCK OF CHESTNUT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/5/2018 FOR IMMEDIATE RELEASE Press Release # Subject: *UPDATE* MURDER SUSPECTS ARRESTED AND CHARGED Contact: Media Relations Detail (562) 570-5273 On Thursday, October 4, 2018, Long Beach Police Homicide Detectives presented their case to the Los Angeles District Attorney's Office, which filed charges against Raymond Moreno and Travis Cockrell for a murder that occurred in the 1200 block of Chestnut Avenue on Friday, September 14, 2018. The victim has been identified as 24-year-old Joshua Harris of Long Beach. On Wednesday, September 26, 2018, officers arrested 34-year-old Raymond Moreno of Long Beach. Moreno was charged with murder, ex-felon in possession of a gun, ex-felon in possession of ammunition and a gang enhancement. On Monday, August 20, 2018, at approximately 8:00 p.m., officers responded to the 1500 Block of Daisy Avenue regarding a shooting that just occurred. Through their investigation, detectives found evidence linking 22-year-old Travis Cockrell of Long Beach to the shooting. On Friday, September 28, 2018, officers arrested Cockrell in Long Beach. Cockrell was charged with murder, assault with a deadly weapon, accessory after the fact, and a gang enhancement. During their investigation, Homicide Detectives identified Moreno and Cockrell responsible for the murder of Joshua Harris. Moreno and Cockrell are being held at the Los Angeles County Jail. Original News Release 9/15/18: MURDER INVESTIGATION - 1200 BLOCK OF CHESTNUT On Friday, September 14, 2018, at approx. 11:40 p.m., officers were dispatched to the 1200 block of Chestnut Avenue regarding a shooting, which resulted in the death of a male adult. When officers arrived, they located the victim on the sidewalk, who had been struck in the upper torso by gunfire. The victim was determined deceased at the scene Long Beach Fire. The Los Angeles County Coroner’s Office will determine the identity of the victim, and make notifications to next of kin. The incident is being investigated as possibly gang-related, however, a motive has not yet been determined. Anyone with information is asked to contact the LBPD Homicide Detectives Sean Irving or Ben Vargas at (562) 570-7244. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2280,https://www.desmoineswa.gov/departments/police/online_crime_reporting/spanish_online_police_reporting,Poor Data Source,Poor Data Source,"Spanish Online Police Reporting - City of Des Moines, WA","",200,Just a moment...,"[""City of Des Moines, WA""]","[""Spanish Online Police Reporting""]",[],[],[],[],Skip to Content -2281,https://www.trinidad.co.gov/police-department,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2282,https://www.newcarrolltonmd.gov/government/departments/police_department/ncpd_news,List of Data Sources,Info About Agencies,"","",404,"","","","","","","","" -2283,http://lafayettepolice.us/616/commercial-kitchen-operations,Not Criminal Justice Related,Not Criminal Justice Related,"Commercial Kitchen Operations | Lafayette, IN - Official Website","If your business operates a commercial kitchen, you'll want to know these rules and regulations for equipment and facilities. ",200,"Police Department | Lafayette, IN - Official Website","[""Commercial Kitchen Operations""]","[""Commercial Kitchen Ventilation"", ""Exhaust Air"", ""Replacement Air"", ""Capture and Containment Of Vapors & Heat"", ""Exhaust System Components"", ""Capture & Containment"", ""Ventilation Performance Test"", ""Performance Evaluation"", ""Test Conditions"", ""Pre-Engineered Fire Suppression System""]","["""", ""Basic Commercial Kitchen"", ""New Construction"", ""Existing Systems"", ""Verification"", ""Final Report"", ""Standard"", ""Testing"", ""Contact Us"", ""Brian Alkire"", ""Fire Department"", ""Hours"", ""Quick Links"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2284,http://www.longbeach.gov/police/press-releases/2014-robbery-victim-dies--reward-renewed/,Media Bulletins,Agency-Published Resources,2014 Robbery Victim Dies; Reward Renewed,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/27/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: 2014 ROBBERY VICTIM DIES; REWARD RENEWED Contact: Media Relations Detail (562) 570 -5273 VIEW VIDEO Last night, May 26, 2015, the Los Angeles County Board of Supervisors, at the recommendation of Supervisor Don Knabe, re-issued a $10,000 reward for information leading to the arrest and conviction of the person(s) responsible for the death of 54-year-old Felix Avelar Duran of Long Beach, a mini-market owner who was shot during a robbery in March of 2014. On May 19, 2015, Long Beach Police were notified by the Los Angeles County Coroner’s Office that victim Duran had succumbed to injuries caused by the shooting. He had remained hospitalized and on life support since the incident. On Monday, March 24, 2014, at approximately 7:50 p.m., Long Beach Police were dispatched to the area of 7th Street and Cerritos Avenue regarding an unknown trouble call, possibly involving an assault with a deadly weapon. Arriving officers determined a robbery to a liquor store in the 1100 block of E. 7th Street occurred, and the store owner who was 53-years-old at the time, sustained a gunshot wound to the upper torso. Long Beach Fire Department paramedics transported Victim Duran to a local hospital where he was listed in critical condition. Due to the extent of his injuries, Homicide detectives responded to the scene. Officers worked diligently throughout the night to collect evidence, review witness statements, and seek out any video surveillance that may have captured useful information. In May of 2014, a reward was established by the L.A. County Board of Supervisors, and investigators released surveillance video footage depicting the suspect entering the store, shooting the victim, and taking the cash register before fleeing on foot. The suspect was described as a male Black, late teens or early 20’s with an average build, and wearing a black hoodie-style sweatshirt with the word “Cali” across the front chest area. Investigators are still hopeful the reward may prompt someone with information to come forward. Anyone with information regarding the suspect’s identity or whereabouts is urged to contact L.B.P.D. Homicide Detectives Scott Lasch and Donald Goodman at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2285,http://www.longbeach.gov/police/press-releases/motorcycle-safety-is-aim-of-l-b-p-d--operation/,Media Bulletins,Agency-Published Resources,MOTORCYCLE SAFETY IS AIM OF L.B.P.D. OPERATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/24/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MOTORCYCLE SAFETY IS AIM OF L.B.P.D. OPERATION Careless motorists as well as riders get special scrutiny Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department will be conducting a specialized Motorcycle Safety Enforcement Operation on Sunday, April 26, 2015, in an effort to lower deaths and injuries.  Extra officers will be on duty patrolling areas frequented by motorcyclists and where motorcycle crashes occur.  Officers will be looking for violations made by drivers and riders alike that can lead to motorcycle crashes.  They will be cracking down on both those operating regular vehicles and motorcycles who are under the influence of drugs or alcohol, speeding, making illegal turns, or any other dangerous violation. Motorcycle fatalities saw a phenomenal drop of 37 percent from 2008 to 2010, but then rose 23 percent by 2012. Operations like this are aimed at curbing any more rises in motorcycle deaths and sending the numbers back downward.  Over the course of the past 2 years, motorcycle involved collisions have resulted in 12 fatalities and 184 injuries in the City of Long Beach. California collision data reveals that primary causes of motorcycle-involved crashes include speeding, unsafe turning and impairment due to alcohol and other drugs by both riders and drivers alike. Safety tips for riders – See and Be Seen: Ride with lights on during daylight hours Use your lane position to increase visibility; change lanes only when there is ample room Match your speed to surrounding traffic Always wear a DOT compliant helmet and brightly colored, protective clothing Safety tips for drivers – Share the Road: Look twice for motorcyclists, especially when entering the roadway, turning or changing lanes Motorcyclist are allowed in HOV lanes unless prohibited by signage Riders are urged to get training through the California Motorcyclist Safety Program. Information and training locations are available online or 1-877 RIDE 411 (1-877-743-3411). Funding for this program is provided by a grant from the California Office of Traffic Safety through the National Highway Traffic Safety Administration. The message to all drivers and motorcyclists is: share in the responsibility and do your part by safely “sharing the road.” This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2286,http://www.longbeach.gov/police/press-releases/human-sex-trafficking-task-force-operation/,Media Bulletins,Agency-Published Resources,HUMAN SEX TRAFFICKING TASK FORCE OPERATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2287,http://www.longbeach.gov/police/press-releases/traffic-fatality-10-/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY(10),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/17/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: TRAFFIC FATALITY Contact: Media Relations (562) 570-5273 On Friday, February 13, 2015, at approximately 9:48 P.M., officers from the Long Beach Police Department responded to Santa Fe Avenue and Lincoln Street regarding a hit-and-run traffic collision involving a vehicle and pedestrian in a wheelchair. Upon arrival, officers located a male adult pedestrian north of the intersection suffering from trauma to the head and body.  Long Beach Fire Department personnel responded and transported the victim to a local hospital where he remained in critical condition. The preliminary investigation revealed the pedestrian, identified as 55-year-old Jose Guevarra, was in his wheelchair crossing eastbound on Santa Fe Avenue at Lincoln Street in an unmarked crosswalk.  The suspect vehicle was traveling northbound on Santa Fe Avenue when it failed to yield to the pedestrian and collided with him. Mr. Guevara was thrown from his wheelchair and came to rest in the street north of the intersection.  The suspect vehicle fled from the collision northbound on Santa Fe Avenue towards Wardlow Road, dragging the wheelchair. Upon reaching Wardlow Road, the suspect vehicle turned eastbound on Wardlow Road where the wheelchair dislodged from the vehicle. The suspect vehicle was last seen traveling eastbound on Wardlow Road. The suspect vehicle was described as a green sedan, possibly a BMW. On Sunday, February 15, 2015, at approximately 3:18 P.M., Mr. Guevarra succumbed to his injuries and was pronounced deceased at the hospital. Anyone who may have information regarding this incident is urged to contact the Long Beach Police Department Collision Investigation Detail, Detective Sirilo Garcia at (562) 570-7355. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2288,http://www.longbeach.gov/police/press-releases/charges-filed-against-former-police-officer/,Media Bulletins,Agency-Published Resources,Charges Filed Against Former Police Officer,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/31/2016 FOR IMMEDIATE RELEASE Press Release # Subject: CHARGES FILED AGAINST FORMER POLICE OFFICER Contact: Media Relations Detail (562) 570-5273 On Monday, October 31, 2016, a former Long Beach police officer was arrested by the Orange County Sheriff’s Department in connection with an assault with a deadly weapon investigation. On October 28, 2015, the Long Beach Police Department became aware of an off-duty incident that occurred the day prior, October 27, 2015, involving a Long Beach police officer, which stemmed from a domestic situation that occurred in Long Beach. Upon learning of the potential misconduct, the Long Beach Police Department immediately launched an internal administrative investigation. Due to the seriousness and nature of the allegations, the officer was placed on administrative leave, and his duties as a police officer were discontinued. A criminal investigation was also initiated by the Long Beach Police Department, which was conducted independently of the administrative investigation. On June 20, 2016, after conducting an extensive and thorough investigation, the officer, identified as 34-year-old Toby Benskin, a 14-year employee who had been assigned to the Investigations Bureau, was terminated. The case was presented to the Los Angeles County District Attorney’s Justice System Integrity Division, who reviewed it and filed criminal charges. The complaint included nine felony counts, which included burglary, assault with a firearm, criminal threats, and false imprisonment charges. The District Attorney’s Office subsequently issued an arrest warrant for Benskin. This morning, Benskin was arrested in the City of Orange, was booked, and is being held on $200,000 bail. “When we take our oath of office, we assume a tremendous responsibility which includes upholding the values and maintaining the integrity of our police department and profession,” stated Long Beach Police Chief Robert Luna. “When an officer betrays the public trust we have worked so hard to cultivate, they must be held accountable.” The Long Beach Police Department will not be releasing anything further regarding this investigation. For additional information, please contact the Los Angeles County District Attorney’s Office. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2289,http://www.longbeach.gov/police/press-releases/critical-missing---beltran-carmelo/,Media Bulletins,Agency-Published Resources,"LOCATED: CRITICAL MISSING PERSON - BELTRAN, CARMELO","",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/21/2017 FOR IMMEDIATE RELEASE Press Release # Subject: LOCATED: CRITICAL MISSING PERSON - BELTRAN, CARMELO Contact: Media Relations Details (562) 570-5273 UPDATE (12/21/17): Carmelo Beltran who was reported missing on December 14, 2017, was located alive in a neighboring county earlier today. The Long Beach Police Department is asking for the public’s help in locating a missing adult. The missing person, 86-year-old Carmelo “Ricky” Beltran, was last seen in the evening of December 14, 2017, at his residence in the 800 block of Gardenia Avenue by a family member. This is the first time he’s ever walked away without returning home. The victim does not know his name and only speaks Spanish. The victim is described as follows: Name: Carmelo “Ricky” Beltran Age: 83 years Gender: Male Race/Ethnicity: Hispanic Height: 5’5” Weight: 130 lbs. Hair: Brown Eyes: Brown Clothing: Brown pants, Navy Blue Shirt, Black Shoes, Grey Cap Scars/Marks/Tattoos: None Medical Alert: None The Long Beach Police Department continues to search for the victim. Local hospitals and area law enforcement agencies have also been alerted. Anyone who sees the victim or has information on his whereabouts is asked to call the Long Beach Police Department at (562) 435-6711 or 9-1-1. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2290,http://www.longbeach.gov/police/press-releases/update--excavation-to-be-conducted-in-missing-person-cold-case-investigation/,Media Bulletins,Agency-Published Resources,UPDATE: EXCAVATION TO BE CONDUCTED IN MISSING PERSON COLD CASE INVESTIGATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2291,http://www.longbeach.gov/police/press-releases/murder-1900-block-chestnut-ave/,Media Bulletins,Agency-Published Resources,MURDER 1900 block Chestnut Ave,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/22/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Tuesday, December 22, 2015, around 8:30 a.m., Long Beach Police were dispatched to the area of the 1900 block of Chestnut Avenue regarding a possible domestic violence incident in progress, which resulted in the death of a female adult.  Officers located the victim, with multiple gunshot injuries to the upper torso, down in an alley. Long Beach Fire Department paramedics responded and determined the victim deceased at the scene. The preliminary investigation indicated a male suspect shot the victim and fled the scene with a toddler, before officers arrived. A responding officer saw a subject who matched the suspect description, at an apartment building in the 1800 block of Chestnut Avenue, and a containment perimeter was established.  Believing the child may be in further danger, officers forced entry into an apartment unit and rescued him. Long Beach Fire Department paramedics checked the child at the scene and he appeared to be unharmed. The child is in the custody of the Los Angeles County Department of Children & Family Services. Two male adults with the child were detained at the location.  Any relationship between the child, the men, or the victim is yet to be determined. One of the men, Eric Jerome Williams, Jr., 29 years old and a resident of Long Beach, was booked for murder.  He is being held at Long Beach City Jail on $1,000,000.00 bail. A motive is unknown and the investigation remains ongoing. Anyone with information regarding this incident is urged to call Long Beach Homicide Detectives T. Hubert, S. Irving, and O. Valenzuela at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2292,http://www.longbeach.gov/police/press-releases/tailgates-being-targeted--community-encouraged-to-take-precautions/,Media Bulletins,Agency-Published Resources,TAILGATES BEING TARGETED; COMMUNITY ENCOURAGED TO TAKE PRECAUTIONS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/10/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: TAILGATES BEING TARGETED; COMMUNITY ENCOURAGED TO TAKE PRECAUTIONS Contact: Media Relations Detail (562) 570-5273 Hose Clamp                      Tailgate Lock (Click on a photo to enlarge) The Long Beach Police Department has seen an increase in truck tailgate thefts since the beginning of the year and is hoping that by increasing the community's awareness, it may help prevent additional loss. Tailgates are being stolen at an alarming rate throughout the United States. The reason for the thefts is that a tailgate replacement can cost up to $3,000.00, creating a high demand for tailgates on the black market. Tailgates are designed to be removed easily by the owner, making it just as easy for thieves to remove them. The most popular trucks being targeted are Fords, Toyotas, Dodges and Chevrolets, and those equipped with rear back-up cameras are especially being targeted due to their value. Most tailgates are not labeled with identification numbers, making it almost impossible to determine the owner if recovered by police. The Long Beach Police Department’s Auto Theft Detail suggests practicing the following safety tips to help secure your tailgate, or assist in its return to you if found: attaching a simple hose clamp or tailgate lock around the pivot point of the tailgate, which may protect the tailgate from theft or serve as a deterrent (available for purchase at some auto part stores or online) secure your vehicle in your garage if possible when able, park your truck in a position that prevents the tailgate from being opened mark the tailgate with the owner's driver's license number or vehicle license plate number, which will help law enforcement identify the owner if the gate is recovered during a police investigation If you have had a tailgate stolen that you have not reported to police, please contact our Business Desk at (562) 570-7260 and a report can be taken over the phone. Anyone with information regarding the thefts should contact the Auto Theft Detail at (562) 570-7272. To see just how easily and quickly a tailgate can be removed, view the news clip video: https://www.youtube.com/watch?v=fG9CSVyaMhk This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2293,http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-14-/,Media Bulletins,Agency-Published Resources,DUI-Driver's License Checkpoint Planned this Weekend(14),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2294,http://www.longbeach.gov/police/press-releases/donut-boy-visits-l.b.p2.d/,Media Bulletins,Agency-Published Resources,DONUT BOY VISITS L.B.P.D,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/26/2017 FOR IMMEDIATE RELEASE Press Release # Subject: DONUT BOY VISITS L.B.P.D Contact: Media Relations Detail (562) 570-5273 On Thursday, October 26, 2017, the Long Beach Police Department hosted an event with 9-year-old Tyler Carach from Alabama, also known as “Donut Boy.” During the past 13 months, Tyler and his mom Sheena (a former police officer), have travelled to over 20 states and delivered 28,000+ donuts to law enforcement officers to thank them for the work they do.  Tyler is honored to be doing his part to make the world a better place and inspire others to do the same. In honor of his 10th birthday, Tyler and his mom are traveling to 10 states in 10 days to continue his mission to thank even more officers with donuts and thank you cards. Long Beach was the only stop in California on Tyler’s journey, making our City the 22nd state he has visited. The event featured a dunk tank and Tyler was given the opportunity to “Dunk a Cop, not a Donut.” We also had a demonstration with K9 “AJ” who is new to the department. Tyler was able to meet officers, shake hands, and offer them donuts from various law enforcement agencies from throughout the region who attended the event. We would like to thank the sponsors who helped us make this event possible. The Long Beach Police Officers Association and the Long Beach Police Foundation were the primary event sponsors. Dunkin’ Donuts provided donuts for all officers to enjoy. Rossmoor Pastries provided an incredible California state-themed birthday cake for Tyler. Lastly, the Long Beach Convention and Visitor’s Bureau secured a one-night hotel stay for Tyler and his mom courtesy of the Long Beach Airport Marriott. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2295,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-proves-effective-10-/,Media Bulletins,Agency-Published Resources,DUI SATURATION PATROL PROVES EFFECTIVE(10),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/21/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: DUI SATURATION PATROL PROVES EFFECTIVE Contact: Media Relations Patrol (562) 570-5273 On December 19, 2015, the Long Beach Police Department’s Traffic Section conducted a Driving Under the Influence (DUI) Saturation Patrol from 7:00 p.m. until 3:00 a.m., in place of the scheduled DUI Checkpoint. During the eight-hour operation, motor officers patrolled throughout the city looking for impaired drivers and took the following enforcement actions: Conducted sixty-two (62) enforcement stops Conducted fifteen (15) Standardized Field Sobriety Tests Made four (4) DUI arrests Towed/Stored two (2) vehicles for DUI Issued ten (10) traffic citations for unsafe driving In California, this deadly crime led to 867 deaths and over 23,000 serious injuries in 2013 because someone failed to designate a sober driver. Nationally, the latest data shows over 10,000 were killed by an impaired driver. Over the course of the past three years, the Long Beach Police have investigated 1,032 DUI collisions, which have claimed seven lives and resulted in another 370 injuries. Driving under the influence can impact the economy in addition to the pain and suffering of those immediately affected. Conservatively, a fatality has a $1.4 million impact, an injury $70,000, and a crash that only damages property averages nearly $9000. Funding for this program is from a grant from the California Office of Traffic Safety through the National Highway Traffic Safety Administration. Report Drunk Drivers, Call 9-1-1. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2296,http://www.longbeach.gov/police/press-releases/traffic-fatality---pacific-avenue-and-burnett-street/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY - PACIFIC AVENUE AND BURNETT STREET,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/26/2019 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY - PACIFIC AVENUE AND BURNETT STREET Contact: Media Relations Detail (562) 570-5273 LBPDMediaRelations@longbeach.gov On June 25, 2019, at approximately 11:55 p.m., officers responded to the intersection of Pacific Avenue and Burnett Street regarding an injury hit-and-run traffic collision involving a vehicle and two pedestrians, which resulted in the death of a female adult. Upon arrival, officers located a non-responsive female adult and critically injured male adult lying in the intersection. The Long Beach Fire Department responded and transported both victims to a local hospital in critical condition. The male victim, identified as a 35-year-old resident of Wilmington, remains in critical condition. The female victim succumbed to her injuries and was pronounced deceased at the hospital. The Los Angeles County Coroner’s Office will be identifying the female victim. The preliminary investigation revealed the collision occurred when two pedestrians crossed Pacific Avenue in a marked crosswalk on the north side of the intersection. The pedestrians were struck by a white, possibly four-door, unknown model vehicle that was driving southbound on Pacific Avenue at Burnett Street. The vehicle fled the scene and was last seen heading south on Pacific Avenue. Anyone who may have information regarding this incident is asked to call the Long Beach Police Department’s Collision Investigation Detail Detective David Whelan at (562) 570-7355. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2297,http://www.longbeach.gov/police/press-releases/long-beach-police-dui-checkpoint-proves-effective-2-/,Media Bulletins,Agency-Published Resources,LONG BEACH POLICE DUI CHECKPOINT PROVES EFFECTIVE(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/28/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: LONG BEACH POLICE DUI CHECKPOINT PROVES EFFECTIVE Contact: Media Relations (562) 570-5273 On Saturday January 25, 2014, the Long Beach Police Department’s Field Support Section conducted a Driving Under the Influence/Driver License Checkpoint on Shoreline Drive at Cedar Avenue from 7 p.m. until 3 a.m.  During the eight-hour operation, which was aided by Long Beach Police Explorers and Long Beach Search and Rescue, 1,354 vehicles passed through the checkpoint with 454 being screened, resulting in the following statistics: Five (5) DUI arrests Four (4) Cited for unlicensed driving Two (2) Cited for suspended license DUI checkpoints are a vital component in the fight against both impaired and unlicensed driving. Nationally, impaired driving caused by alcohol and/or drugs causes one death every 33 minutes. The average American has a 30% chance of being killed or injured by a driver under the influence. Sobriety checkpoints have been proven to reduce these types of driving-related collisions by removing such drivers from our streets. Funding for this program was provided by a grant from the California Office of Traffic Safety, through the National Highway Safety Administration. For further information contact Traffic Section Lieutenant Kris Klein at (562) 570-7292. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2298,http://www.longbeach.gov/police/press-releases/human-trafficking-suspect-arrested/,Media Bulletins,Agency-Published Resources,HUMAN TRAFFICKING SUSPECT ARRESTED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/12/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: HUMAN TRAFFICKING SUSPECT ARRESTED Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department has conducted an investigation, which resulted in the arrest of a male adult for a variety of charges related to human sex trafficking. On February 3, 2014, at approximately 4:30 p.m., patrol officers responded to a call of a male chasing a female with a hammer in the area of 60th Street and Atlantic Avenue. Officers found the distraught adult female victim in a nearby parking lot, and began their investigation. The officers learned that the 24-year-old victim had been assaulted by her assailant, and was an apparent victim of human trafficking under his control. The victim stated to officers that the suspect had befriended her six months prior, and initially treated her like a girlfriend. However, he later forced her into prostitution against her will, and verbally and physically abused her, repeatedly. Vice detectives responded and continued with the investigation and arrested the suspect, identified as 33-year-old Edward Watson of Compton, the following day, February 4, 2014, in the area of 60th Street and Atlantic Avenue. At the time of his arrest, he was accompanied by another adult female. Evidence collected suggests the second female was voluntarily working as a prostitute for suspect Watson. On February 6, 2014, the Los Angeles County District Attorney’s Office filed the following counts against Defendant Watson: one count of human trafficking, one count of assault with a deadly weapon, one count of pandering, and two counts of pimping. He is expected to appear in court tomorrow, Thursday, February 13th, and could face a maximum of 46 years and 8 months in prison if convicted. This joint effort between patrol officers and vice detectives to rescue young girls and women from being forced into a life of prostitution is another example of the Long Beach Police Department’s commitment toward the eradication of human trafficking. Anyone who is, or has been a victim of human trafficking is urged to come forward by contacting the Long Beach Police Department’s Vice Investigations Detail at (562) 570-7219. Any victim in need of resources is also encouraged to contact detectives. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2299,http://www.longbeach.gov/police/press-releases/halloween-safety-tips-2-/,Media Bulletins,Agency-Published Resources,HALLOWEEN SAFETY TIPS(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/28/2016 FOR IMMEDIATE RELEASE Press Release # Subject: HALLOWEEN SAFETY TIPS Contact: Media Relations Detail (562) 570-5273 As Halloween approaches, the Long Beach Police Department would like to encourage the community to practice the following safety tips for a safer and fun-filled Halloween: • Be sure your child’s activities are age-appropriate • All children should be accompanied by an adult • Only visit homes that are well-lighted and never go into a stranger’s house • Stay on the sidewalk and only cross at corners • Stay in well populated areas and never cut through alleys or parks after dark • Apply reflective tape to your child’s costume or use glow sticks for better visibility • Use face paint rather than masks that may block your child’s vision • Map out your route ahead of time and carry a flashlight with you • Ensure props (pitchforks, swords, etc.) do not have sharp edges • Be cautious of dogs on the loose and keep your pet(s) indoors • Inspect your child’s candy before allowing them to eat it • Report any suspicious or illegal activity by calling 9-1-1 immediately • Motorists are advised to be extra cautious on Halloween night and to drive slowly • Do not drink and drive; plan ahead and designate a driver or call for a ride Reminder: The curfew law in Long Beach prohibits anyone 17-years-old or younger from being out past 10:00 p.m. without a parent/guardian, unless going to or returning home from work or an organized event supervised by an adult, without any detour or stop. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2301,http://www.longbeach.gov/police/press-releases/publics-help-needed-to-identify-hit-and-run-suspects/,Media Bulletins,Agency-Published Resources,PUBLIC’S HELP SOUGHT IN IDENTIFYING HIT AND RUN SUSPECTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/4/2019 FOR IMMEDIATE RELEASE Press Release # Subject: PUBLIC’S HELP SOUGHT IN IDENTIFYING HIT AND RUN SUSPECTS Contact: Media Relations Detail (562) 570-5273 LBPDMediaRelations@longbeach.gov Actual photos of suspects and vehicles. CLICK IMAGES TO ENLARGE The Long Beach Police Department’s Collision Investigation Detail is seeking the public’s help in identifying the drivers of a gray Dodge Challenger and a red Ford Mustang who are believed to be involved in an exhibition of speed and hit and run injury traffic collision on Cowles Street between Seabright Avenue and Hayes Avenue, which resulted in the critical injury of an adult male pedestrian. The incident occurred on May 26, 2019, at approximately 8:10 p.m. and resulted in the pedestrian being struck by the gray Dodge Challenger. The pedestrian, a 32-year-old male resident of Long Beach, was transported by Long Beach Fire Department personnel to a local hospital in critical condition. Anyone who may have information regarding this incident is asked to call Long Beach Police Department Collision Investigation Detail Detective David Lauro at (562) 570-7355. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2302,http://www.longbeach.gov/police/press-releases/traffic-fatality-15-/,Media Bulletins,Agency-Published Resources,Traffic Fatality(15),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/26/2015 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Saturday, October 24, 2015, a 52-year-old Long Beach man succumbed to injuries sustained when he was struck by a vehicle as he attempted to cross the street three days earlier. On Wednesday October 21, 2015, at approximately 11:45 p.m., LBPD officers were dispatched to the area of Pacific Coast Highway and Orange Avenue regarding a vehicle versus pedestrian injury traffic collision. Long Beach Fire Department personnel responded and transported the pedestrian, who sustained major head trauma, to a local hospital where he remained in critical condition until the time of his death. The preliminary investigation revealed the pedestrian, identified as 52-year-old Earl Wilson of Long Beach, was walking southbound in the west crosswalk of Pacific Coast Highway at Orange Avenue on a green light. As victim Wilson attempted to cross, he was struck by a 2014 Toyota Prius taxicab that was attempting to make a left turn from northbound Orange Avenue to westbound Pacific Coast Highway on a green light. The taxicab driver, a 67-year-old resident of Long Beach, remained at the scene and was interviewed and released pending further investigation. Anyone who may have information regarding this incident is asked to call Long Beach Police Collision Investigation Detail Detective Sirilo Garcia at (562) 570-7355. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2304,http://www.longbeach.gov/police/press-releases/arrest-made---charges-filed-in-2013-shooting-case/,Media Bulletins,Agency-Published Resources,ARREST MADE & CHARGES FILED IN 2013 SHOOTING CASE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/21/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: ARREST MADE & CHARGES FILED IN 2013 SHOOTING CASE Contact: Media Relations Detail (562) 570-5273 Today, the Los Angeles County District Attorney’s Office filed multiple charges in a 2013 shooting case. On March 22, 2013, around 8:00 p.m., a shooting occurred near a gas station in the area of Long Beach Boulevard and Del Amo. Long Beach Police officers transported a 10-year-old victim from the North Police Substation to a local hospital. A second victim transported himself to a local hospital. On May 18, 2014, Long Beach Gang Investigation detectives arrested 23-year-old Raymond Rene Rodriguez of Long Beach on an outstanding warrant. Through the course of their investigation, Detectives Jess Fragoso and Robert Gonzales learned of Rodriguez’ connection to the March 2013 shooting. Detectives believe the incident originated on a Long Beach Transit bus with a dispute between Rodriquez, a minor companion, and another male adult. All three individuals exited the bus and a physical fight ensued between the three. During the altercation, a fourth male adult came to assist in fighting with Rodriguez and the minor companion. Rodriguez produced a firearm and fired two rounds at the second male. The victim sustained a gunshot wound to the lower body and transported himself to a local hospital. A second victim was also injured. During the gunfight, a round entered a family’s vehicle which was parked at the gas station, striking a 10-year-old boy who was seated in the back seat. Once the father realized his son had been wounded, he rushed the family to the nearby police station to summon help. Long Beach Police officers then transported the child in critical condition to the hospital. On Wednesday, May 21, 2014, detectives presented the case to the Los Angeles County District Attorney’s Office who filed charges of attempted murder, gang allegations, and weapon violations against Rodriguez, a documented Long Beach gang member. Rodriguez is currently being held at the Long Beach City Jail on $2,210,00.00 bail. Anyone with information regarding this investigation should contact Long Beach Gang Investigations Section Detectives Jess Fragoso at (562) 570-7370. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2305,http://www.longbeach.gov/police/press-releases/winter-break-safety-tips-for-youth/,Media Bulletins,Agency-Published Resources,Winter Break Safety Tips for Youth,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2306,http://www.longbeach.gov/police/press-releases/police---fire-memorial-ceremony/,Media Bulletins,Agency-Published Resources,POLICE & FIRE MEMORIAL CEREMONY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/1/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: POLICE & FIRE MEMORIAL CEREMONY Contact: Media Relations (562) 570-7523 On Tuesday, May 6, 2014, at 9:00 A.M., the Long Beach Police and Fire Departments will pay tribute to members of their department who made the ultimate sacrifice in the line of duty, and the community is invited to attend. Members of both departments, along with City dignitaries and staff, will honor those individuals who made the ultimate sacrifice while serving the Long Beach community. The service will take place at City Council Chambers, located inside Long Beach City Hall at 333 W. Ocean Boulevard. The memorial service will include the Pledge of Allegiance, a posting of the colors presentation by Long Beach Police & Fire Honor Guard, an invocation, individual recognition of fallen officers and firefighters, a bagpiper who will perform Amazing Grace, a 21-Gun Salute, a bugler who will perform Taps, as well as remarks by Mayor Bob Foster, Police Chief Jim McDonnell and Fire Chief Mike Duree. Please join us in honoring these fallen heroes. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2307,http://www.longbeach.gov/police/press-releases/murder-charges-filed/,Media Bulletins,Agency-Published Resources,MURDER CHARGES FILED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/22/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER CHARGES FILED Contact: Media Relations Detail (562) 570-5273 Today detectives presented a case to the Los Angeles County District Attorney’s Office for filing consideration in the murder of Alicia Faith Todd. On June 24, 2015, at approximately 1:13 a.m., victim Todd was found deceased in an alley in the 1100 block of E. 21st Street. As patrol officers and homicide detectives worked the crime scene, they found little evidence and no witnesses to the murder. Through the course of their investigation, detectives contacted family and friends to recreate the last few days of Todd’s life for any clues or leads that may assist them in finding the person(s) responsible for her death. They determined she was in a domestic relationship with the defendant and they were together the night of the murder. The defendant is identified as Tremaine Lewis, a 24 year old, resident of Long Beach. He was arrested on Thursday February 18, 2016. The Los Angeles County District Attorney's Office filed one count of murder with a gun enhancement against Lewis and he is being held on $2,000,000.00 bail at the Long Beach City Jail. He will be arraigned today at 1:30 p.m. in Long Beach Superior Court. The investigation remains ongoing. Anyone with information regarding the murder is urged to call Homicide Detectives Teryl Hubert, Scott Lasch, and Michael Hubbard at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit http://www.lacrimestoppers.org/ . To view original News Release click on below link: http://longbeach.gov/police/press-releases/murder(26)/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2308,http://www.longbeach.gov/police/press-releases/robbery-suspects-arrested-and-charged/,Media Bulletins,Agency-Published Resources,ROBBERY SUSPECTS ARRESTED AND CHARGED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/15/2018 FOR IMMEDIATE RELEASE Press Release # Subject: ROBBERY SUSPECTS ARRESTED AND CHARGED Contact: Media Relations Detail (562) 570-5273 On January 12, 2018, felony charges were filed against two men in connection with multiple robberies at local businesses. On Wednesday, January 10, 2018, detectives arrested 34-year-old Cody Joel Ibershoff of Long Beach and 51-year-old Jesus Cortez of Compton for their involvement in the commercial robberies. Pursuant to their arrests, detectives served a search warrant at their respective residences and recovered three replica firearms, one shotgun and other evidence related to the robberies. Between November 24, 2017 and January 3, 2018, the suspects armed with handguns entered several businesses between the hours of 8:00 p.m. and 11:30 p.m., demanded money from employees, and fled the scene with cash before officers arrived. No employees or victims were injured during the robberies. The dates and locations where the incidents occurred are provided below: • November 24, 2017 - 1400 block of East Pacific Coast Highway • December 16, 2017 – 3400 block of Long Beach Blvd. • December 18, 2017 – 3100 block of East Broadway • January 3, 2018 – 2600 block of Bellflower Blvd. • January 3, 2018 – 4400 block of East Broadway Throughout the investigation detectives uncovered similarities in each of the robberies that lead them to identify the suspects. On January 12, 2018, the case was presented to the Los Angeles County District Attorney’s Office, which filed 11 felony counts of robbery against Cody Joel Ibershoff and Jesus Cortez. Ibershoff is being held on $635,000 bail and Cortez is being held on $1.650 million bail, both defendants are currently being held at the Los Angeles County Jail. The investigation remains ongoing. Detectives urge any commercial business employee who was a victim of a robbery, but has yet to report it, to call L.B.P.D. Lead Robbery Detective Mora at (562) 570-5536. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2310,http://www.longbeach.gov/police/press-releases/traffic-fatality---cherry-and-carson/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY - CHERRY and CARSON,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/5/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: TRAFFIC FATALITY - CHERRY AVENUE & CARSON STREET Contact: Media Relations Detail (562)570-5273 On Monday, September 11, 2017, at approximately 12:34 p.m., officers were dispatched to Cherry Avenue and Carson Street regarding an injury traffic collision between two vehicles. When officers arrived on scene, Long Beach Fire and Department was already on scene and were using the ""jaws of life"" to extricate the driver of a 2001 Saturn that sustained major damage. Officers also discovered a 2004 Hyundai with major damage with the driver still seated inside the vehicle. Long Beach Fire Department Paramedics transported the driver of the 2001 Saturn to a local hospital with a fractured hip and pelvic. It should be noted that the driver was alert and made statement to the officers about the accident. The preliminary investigation revealed that the 2004 Hyundai was traveling northbound Cherry Avenue in the #2 lane of traffic. As the 2004 Hyundai passed Carson Avenue, the 2001 Saturn made an unsafe right turn, directly in the path of 2004 Hyundai, from the east parking lot, to go northbound Cherry. The Hyundai was unable to avoid the Saturn and struck the Saturn on the driver’s side of the vehicle. The driver, of the Hyundai is Guillermo Fajardo-Soto, a 19-yr-old resident of Gardena. The driver was not transported and was treated at the scene and released. The driver of the Saturn is Timothy Johnson, a 20-yr-old resident of Lakewood. On October 4, 2017, Long Beach Collision investigation was notified by the Los Angeles County Coroner's office that Timothy Johnson had passed away on September 24, 2017. At this time we are waiting for the Coroner’s full report for final determination of the cause of death. Anyone who may have information regarding this incident is asked to call Long Beach Police Department Collision Investigation Detail Detective Brian Watt at (562) 570-7355. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2312,https://www.elburn.il.us/police-department/vacation-watch/,Poor Data Source,Poor Data Source,"Vacation Watch | Village of Elburn, Illinois","",200,"Home | Village of Elburn, Illinois","[""Vacation Watch""]",[],[],"[""Vacation Watch""]","[""Links"", ""Main Contact Info"", ""Follow Us""]",[],"" -2313,https://www.foxcrossingwi.gov/departments/police-department/resources/vine/,Poor Data Source,Poor Data Source,vine - Fox Crossing Fox Crossing,"",200,Fox Crossing - Bridging the Fox Cities Fox Crossing,[],"[""Resources » vine""]",[],[],[],[],"Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing Resources » vine This entry was posted on Tuesday, March 20th, 2012 at 4:20 pm and is filed under . - You can follow any responses to this entry through the RSS 2.0 feed. - - Responses are currently closed, but you can trackback from your own site. Comments are closed. Copyright © 2010 - 2024 Fox Crossing, All Rights Reserved. Professional Web Site Design by Sandstone Digital. Disclaimer Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing Resources » vine This entry was posted on Tuesday, March 20th, 2012 at 4:20 pm and is filed under . - You can follow any responses to this entry through the RSS 2.0 feed. - - Responses are currently closed, but you can trackback from your own site. Comments are closed. Copyright © 2010 - 2024 Fox Crossing, All Rights Reserved. Professional Web Site Design by Sandstone Digital. Disclaimer " -2314,https://spdblotter.seattle.gov/2021/10/03/driver-of-stolen-vehicle-arrested-after-ramming-police-cars-gas-station/,Media Bulletins,Agency-Published Resources,"Driver of Stolen Vehicle Arrested After Ramming Police Cars, Gas Station - SPD Blotter","",200,403 Forbidden,"[""Driver of Stolen Vehicle Arrested After Ramming Police Cars, Gas Station""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics Search Search Search Search Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports -2315,https://spdblotter.seattle.gov/2011/06/14/anti-police-graffiti-incident/,Media Bulletins,Agency-Published Resources,Anti-Police Graffiti incident - SPD Blotter,"",200,403 Forbidden,"[""Anti-Police Graffiti incident""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics Search Search Search Search Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports -2316,http://www.longbeach.gov/police/press-releases/arrests-made-in-the-kidnapping-murder-of-3-week-old-eliza-delacruz/,Media Bulletins,Agency-Published Resources,ARRESTS MADE IN THE KIDNAPPING-MURDER OF 3-WEEK-OLD ELIZA DELACRUZ,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],"[""POSSIBLE MOTIVE FOR THE KIDNAPPING"", ""RECAP OF THE JANUARY 3, 2015 EVENTS"", ""CONNECTION TO AN EL SEGUNDO ASSAULT CASE"", ""RELEASE OF SKETCHES AND VIDEO LED TO TIPS"", ""PUBLIC’S HELP SOUGHT"", ""THANK YOU""]",[],[],[],"" -2317,http://www.longbeach.gov/police/press-releases/don-t-be-a-victim-of-fraud-this-holiday-season/,Media Bulletins,Agency-Published Resources,DON'T BE A VICTIM OF FRAUD THIS HOLIDAY SEASON,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/11/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: DON'T BE A VICTIM OF FRAUD THIS HOLIDAY SEASON Contact: Media Relations (562) 570-5273 The Long Beach Police Department would like to remind consumers to take precautions and not become a fraud statistic this holiday season. During this time of the year, credit and debit cards are certain to be one of the most commonly used forms of payment. With the surge of reported domestic and international fraud schemes, which have flourished in the City of Long Beach and throughout the southern California region, consumers are urged to take extra precautions to secure their personal information. Here are a few prevention tips to help minimize your risk of becoming a victim this holiday season: Monitor your ATM/Debit card transactions. Card ""Skimming"", which is a device used to capture account and personal information encoded on magnetic stripes, has become pervasive throughout the country. When entering your “PIN” number, shield the keypad with your other hand to prevent exposure to others or recordable devices Make certain the ATM card reader is securely attached to the machine, if unsecured, alert the financial institution Be vigilant in monitoring your account(s) online or by telephone Track and review all of your bank and credit card statements for irregular activity Use the credit card feature at the gas pumps; your zip code, not PIN, is required Never provide over the telephone your social security number, bank account numbers or date of birth Do not wire money to anyone you do not know Do not respond to e-mails requesting you to “Confirm, Update, or Provide” account information Do not imprint social security or driver licenses on your personal checks Request annually from the credit reporting agencies a copy of your “Consumer Credit Profile Report” and review for unusual activity Use a cross-shredder to destroy sensitive documents including bank records and promotional “pre-approved” credit card applications For further information contact the Long Beach Police Department Financial Crimes Section at (562) 570-7330. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2319,http://www.longbeach.gov/police/press-releases/students-return-to-school-motorists-urged-to-drive-carefully/,Media Bulletins,Agency-Published Resources,STUDENTS RETURN TO SCHOOL; MOTORISTS URGED TO DRIVE CAREFULLY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 8/24/2018 FOR IMMEDIATE RELEASE Press Release # Subject: STUDENTS RETURN TO SCHOOL; MOTORISTS URGED TO DRIVE CAREFULLY Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department would like to remind everyone that most schools in the Long Beach Unified School District will be resuming sessions on Wednesday, August 29th, and with the volume of pedestrian traffic around schools increasing dramatically, all commuters are urged to follow the laws of the road in an effort to prevent avoidable accidents. All drivers are reminded of the following: Yield the right of way to pedestrians in marked or unmarked crosswalks Do not overtake and pass a vehicle(s) stopped ahead of you when it has stopped for a pedestrian Yield the right of way to pedestrians on sidewalks Obey posted speed limits Never drive while distracted – (examples: using a cell phone, reading, applying make-up, etc.) Stop and remain stopped for school buses with “flashing red lights” - opposing traffic must also stop unless a painted or raised divider separates the roadway Watch and obey Crossing Guards … they are there to protect children! It is equally important for pedestrians and parents to also follow the rules of the road! Pedestrians are reminded to: Yield to vehicles on the roadway if you are outside the crosswalk Never cross between intersections controlled by traffic signals (to do so would constitute jaywalking) Parents are reminded to: Obey all parking signs/curb markings - they are designed to protect children and provide optimum traffic flow Do not double park; it interrupts the flow of traffic and makes it difficult to for pedestrians to see oncoming traffic Follow school drop-off procedures and always drop your child off on the curbside of the school Teach your child to always cross the street at a crosswalk, and always pay attention to what is going on around them The Long Beach Police Department is committed to pedestrian and motorist safety, and traffic laws will be strictly enforced at and around our schools. For further information, please contact the Long Beach Police Department’s Traffic Section at (562) 570-7209. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2320,http://www.longbeach.gov/press-releases/city-of-long-beach-initiates-outside-review-of-police-department-direct-messaging-application/,Media Bulletins,Agency-Published Resources,City of Long Beach Initiates Outside Review of Police Department Direct Messaging Application,"",200,City of Long Beach,"[""PRESS RELEASE""]",[],[],[],[],[],"" -2323,http://www.longbeach.gov/police/press-releases/critical-missing-person/,Media Bulletins,Agency-Published Resources,CRITICAL MISSING PERSON,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/1/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: **UPDATED* CRITICAL MISSING PERSON Contact: Media Relations Detail (562) 570-5273 Lloyd Thompson (Click on photo to enlarge image) UPDATE: (12/02/16): On November 30, 2016, 81 year-old Lloyd Thompson was reported missing by his family. Missing Person Detectives reached out to the San Bernardino County Sheriff’s Department for assistance in locating Mr. Thompson. On December 2, 2016, Long Beach Police were notified by the San Bernardino County Sheriff Coroner that Mr. Thompson was found deceased. He was found in the late evening of December 1, 2016 by San Bernardino County Sheriff Search and Rescue, in an unincorporated area of San Bernardino near Interstate 15 and Glen Helen Parkway. His death appears to be of natural causes. The Sheriff’s Department is to be commended for their commitment of resources in this case and we are thankful for their assistance. Original News Release (12/1/16): The Long Beach Police Department is asking for the public’s help in locating a missing adult. The missing person, 81-year-old Lloyd Thompson, was last seen on the morning of November 28, 2016, at his residence in the 2100 block of Lime Avenue. He is diabetic and if not monitored, may become delusional. His family reported him missing on November 30, 2016. That evening, his vehicle was found abandoned in a rural area near the Interstate Freeway 15 and Glen Helen Parkway. The Victim is described as follows: Name:                Lloyd Thompson Age:                   81 years Gender:              Male Race/Ethnicity: African American Height:              6’2” Weight:             180 lbs. Hair:                  Black Eyes:                 Brown Clothing:           Unknown Scars/Marks/Tattoos: None Medical Alert:   Diabetic The Long Beach Police Department continues to search for the victim. Local hospitals and area law enforcement agencies have also been alerted. Anyone who sees the victim or has information on his whereabouts is asked to call the Long Beach Police Department at (562) 435-6711 or 9-1-1. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2324,http://www.longbeach.gov/police/press-releases/homicide-investigation/,Media Bulletins,Agency-Published Resources,HOMICIDE INVESTIGATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/8/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: HOMICIDE INVESTIGATION Contact: Media Relations Detail (562) 570-5273 On December 8, 2016, at approximately 6:30 a.m., officers were dispatched to the 4900 block of Ferro Court regarding a stabbing that just occurred. Upon arrival officers located a male adult with a stab wound to his upper torso. The subject who was responsible for the stabbing also a male adult remained at the scene and has been detained by officers while they conducted their investigation. Long Beach Fire Department responded and transported the victim to local Hospital in critical condition, where he was later pronounced deceased. Homicide Detectives responded and are handling the investigation, and no arrest has been made at this time. The victim has been identified as Aaron Whatley a 43 year-old resident of Long Beach. Anyone with information is urged to call Homicide Detectives Shea Robertson and Oscar Valenzuela at (562) 570-7244. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2325,http://www.longbeach.gov/police/press-releases/long-beach-police-investigate-attempt-murder-of-chp-officer-following-pursuit/,Media Bulletins,Agency-Published Resources,LONG BEACH POLICE INVESTIGATE ATTEMPT MURDER OF CHP OFFICER FOLLOWING PURSUIT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/5/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: LONG BEACH POLICE INVESTIGATE ATTEMPT MURDER OF CHP OFFICER FOLLOWING PURSUIT Contact: Media Relations Detail (562) 570-5273 On Thursday, November 5, 2015, about 1:00 p.m., Long Beach Police were requested to assist California Highway Patrol (CHP) with a search of an armed suspect in the area of South Street and Cherry Avenue. The preliminary investigation indicates a CHP motorcycle officer was eastbound on the 91 Freeway, west of Long Beach Boulevard, when he attempted to conduct a traffic stop for a carpool violation. The gold Ford Taurus exited the freeway at Long Beach Boulevard, and proceeded through a red light, initially at a slow rate of speed, then suddenly accelerated and drove away. A vehicle pursuit ensued for approximately three to four minutes and terminated at South Street and Cherry Avenue when the suspect vehicle collided into a cinder block wall. The suspect exited the vehicle and ran eastbound on South Street. When the CHP officer attempted to contact the suspect, the suspect turned and fired at the officer who took cover behind his motorcycle. The officer did not return fire. The suspect fled southbound between businesses on South Street and out of the officer’s line of sight. Long Beach Police received calls from businesses in the area regarding a male adult suspect attempting to rob employees at gunpoint and carjack a vehicle. A short time later, during a search of the area, Long Beach Police found a male adult lying near the railroad tracks north of Market Street, with a handgun nearby. The man matched the description of the suspect involved in the attempt murder of the CHP officer and the attempt robberies. Long Beach Fire Department responded and determined the suspect deceased at the scene. It appeared that the suspect sustained a self-inflicted gunshot injury. The name of the suspect is not being released at this time. The Los Angeles County Coroner’s Office will make positive identification and notify next of kin. The investigation remains ongoing. Anyone with information regarding this incident is asked to call Long Beach Police Homicide Detail at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2326,http://www.longbeach.gov/police/press-releases/annual-police-and-fire-memorial-ceremony-will-include-addition-of-officer-william-h--waggoner/,Media Bulletins,Agency-Published Resources,ANNUAL POLICE AND FIRE MEMORIAL CEREMONY WILL INCLUDE ADDITION OF OFFICER WILLIAM H. WAGGONER,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/29/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: ANNUAL POLICE AND FIRE MEMORIAL CEREMONY Contact: Media Relations Detail (562) 570-5273 Community members are invited to attend the annual Police and Fire Memorial Ceremony on Tuesday, May 3, 2016, at 9:00 a.m. The ceremony will take place at the foot of Chestnut Avenue, south of Broadway, near Long Beach City Hall. Historical research deemed appropriate that Patrolman William Homer Waggoner be added to the list of fallen police officers. Officer Waggoner passed away in 1954 as a result of injuries sustained in a gun battle nearly 24 years earlier. He will also be enrolled the California Peace Officer’s Memorial and National Law Enforcement Officers’ Memorial. At Tuesday’s event, Long Beach Police and Fire Department personnel, along with city dignitaries and staff, will honor those individuals who made the ultimate sacrifice with their lives while serving the Long Beach community. The memorial ceremony will include the Pledge of Allegiance led by a Long Beach Police explorer, posting of the colors, an invocation, a 21-gun salute and Taps by the Long Beach Police Honor Guard, individual recognition of fallen officers and firefighters, and a bagpipe performance of Amazing Grace, as well as remarks by Police Chief Robert Luna and Fire Chief Mike Duree. *This year’s ceremony will be the last to be held at this site due to the Civic Center renovation. Related news release regarding Officer Waggoner: http://longbeach.gov/police/press-releases/patrolman-waggoner/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2327,http://www.longbeach.gov/police/press-releases/traffic-fatality---lakewood-blvd-and-sb-405-fwy/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY - LAKEWOOD BLVD AND SB 405 FWY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/7/2019 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY - LAKEWOOD BLVD AND SB 405 FWY Contact: Media Relations Detail (562) 570-5273 LBPDMediaRelations@longbeach.gov On Monday, January 7, 2019, at approximately 12:08 p.m., officers were dispatched to southbound Lakewood Boulevard north of Willow Street regarding an injury traffic collision, which resulted in the death of a male adult. When officers arrived on scene they discovered a motorcyclist, identified as 25-year-old Corey Haggerty of Lakewood, had collided with an SUV and was lying in the middle of southbound Lakewood Boulevard near his 2012 Honda CBR 600 motorcycle. The 2018 Ford Explorer SUV he collided with was stopped about 80 feet beyond. The Long Beach Fire Department responded and determined victim Haggerty deceased at the scene. The driver of the SUV, along with her passenger, were uninjured as a result of the collision. The preliminary investigation revealed victim Haggerty was riding south on Lakewood Boulevard in the number two lane at a high rate of speed. As he neared the Willow Street intersection he came in contact with the SUV being driven by a 49-year-old female resident of Torrance, as she was changing lanes to make a left turn onto Willow Street. The SUV had just exited from southbound 405 Freeway onto Lakewood Boulevard. After the collision, the driver of the SUV stopped to render aid, had a valid driver's license and proof of insurance. Detectives do not believe the driver of the SUV was under the influence of alcohol or drugs at the time of the collision.  The motorcyclist had an expired driver’s license, which did not have a motorcycle endorsement. Anyone with information regarding the collision is asked to contact Detective Steve Fox of the Long Beach Police Department Collision Investigation Detail at (562) 570-7110. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2328,http://www.longbeach.gov/police/press-releases/murder-600-block-burnett/,Media Bulletins,Agency-Published Resources,Murder 600 block Burnett,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/7/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Tuesday, January 17, 2017, at approximately 8:09 p.m., Long Beach Police were dispatched to investigate a possible shooting in the 600 block of East Burnett Street. Arriving officers found a male adult who had been struck by gunfire in the upper body. Long Beach Fire Department personnel transported the victim, in critical condition, to a local hospital. The victim succumbed to his injuries on January 18, 2017. The victim has been identified as 31-year-old Mercredi Khourn, a resident of Long Beach. The suspect fled the scene before officers arrived. No further suspect description is available. A motive is yet to be determined and the investigation remains ongoing. Anyone with information regarding this incident is urged to call Homicide Detectives Donald Goodman and Mark Mattia at (562) 570-7244. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or www.LACrimeStopppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2329,http://www.longbeach.gov/police/press-releases/l.b.p.d.-announces-appointment-of-new-commanders--changes-in-command-staff-assignments/,Media Bulletins,Agency-Published Resources,L.B.P.D. ANNOUNCES APPOINTMENT OF NEW COMMANDERS & CHANGES IN COMMAND STAFF ASSIGNMENTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/1/2019 FOR IMMEDIATE RELEASE Press Release # Subject: L.B.P.D. ANNOUNCES APPOINTMENT OF NEW COMMANDERS & CHANGES IN COMMAND STAFF ASSIGNMENTS Contact: Media Relations Detail (562) 570-5273 LBPDMediaRelations@longbeach.gov (Right: Lt. Mauk, Left: Lt. McGuire) Long Beach Police Chief Robert Luna has selected Lieutenant Donald Mauk, a 25-year veteran of the Police Department, and Lieutenant Melvin McGuire, a 22-year veteran of the Police Department, for promotion to the rank of Commander. Lieutenant Donald Mauk began his career with the Long Beach Police Department (LBPD) as a police officer in 1994. He then promoted to sergeant in 2008 and to lieutenant in 2015. Lieutenant Mauk has worked a variety of assignments including Patrol, Field Training Officer, Directed Enforcement, Hostage Negotiation Team, Support Bureau Office, Interim Jail Administrator. As a Lieutenant, he worked Patrol, Gang and Violent Crimes, and most recently in Robbery/Homicide. He holds a Bachelor of Science Degree in Business from California State University, Fullerton, and is a graduate of the Sherman Block Leadership Institute. Lieutenant Mauk serves on the Long Beach Police Historical Society and is a board member for the California Police Officers Association, Region X. Lieutenant Melvin McGuire began his career with the LBPD in 1997. He moved to Youth Services as a detective in 2001, serving as the School Resource Officer at Poly High School. He promoted to Sergeant in 2010 and Lieutenant in 2016. Lieutenant McGuire has worked assignments that include Juvenile Gang Detective, Background Investigator, Administrative Sergeant for the Patrol Bureau, Internal Affairs, and most recently as a South Division Patrol Lieutenant. Lieutenant McGuire is a member of the Command Officers Association and is an honor graduate of the Delinquency Control Institute, Sherman Block Supervisory Leadership Institute, and the POST Management Course. As a result of these recent promotions, there will be a limited commander rotation. Effective March 9, 2019 commander assignments will be as follows. OFFICE OF THE CHIEF OF POLICE Chief of Staff—Commander Erik Herzog Internal Affairs Division—Commander Lloyd Cox INVESTIGATIONS BUREAU Detective Division—Commander Don Wood Special Investigations Division—Commander Robert Smith* *Formerly known as Gang & Violent Crimes Division PATROL BUREAU East Division—Commander Patrick O’Dowd North Division—Commander Steve Lauricella West Division—Commander Melvin McGuire South Division—Commander Michael Lewis Field Support Division—Commander Rudy Komisza SUPPORT BUREAU Port Police Division—Commander Paul LeBaron Security Services Division—Commander Jeffrey Liberman Training Division—Commander Jeffrey Berkenkamp Jail Division—Commander Donald Mauk This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2331,http://www.longbeach.gov/police/press-releases/traffic-fatality---woodruff-avenue--conant-street/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY - WOODRUFF AVENUE & CONANT STREET,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/10/2017 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY - WOODRUFF AVENUE & CONANT STREET Contact: Media Relations Detail (562) 570-5273 On Thursday, November 9, 2017 at approx. 3:55 p.m., officers were dispatched to the area of Woodruff Avenue and Conant Street regarding an injury traffic collision between a vehicle and two juvenile bicyclists, which resulted in the death of one of the bicyclists. When officers arrived on scene, they discovered a 12-year-old male victim resident of Lakewood, lying in the southbound #1 lane of Woodruff Avenue, just south of Conant Street. They also discovered a 13-year-old female victim resident of Lakewood, seated on the west curb of Woodruff Avenue. Officers also observed a 2001 Chevy Suburban stopped in the #1 lane of Woodruff Avenue. The preliminary investigation revealed that the two bicyclists were on the sidewalk on the southwest corner waiting to cross Woodruff Avenue. when the light turned green they attempted to cross in the south crosswalk, when the 2001 Chevrolet, who was traveling westbound on Conant Street, attempted to make a left-hand turn onto southbound Woodruff Avenue on a green light, struck the bicyclists in the cross walk. Long Beach Fire Department paramedics responded and transported both bicyclists to a local area hospital. The juvenile male victim was later determined deceased. The juvenile female victim was treated and later released from the hospital. The driver of the Chevrolet Suburban was identified as a 39- year-old resident of Lakewood. The driver had his juvenile son in the vehicle at the time of the accident, but was not injured. The driver had a valid drivers license and insurance. The driver remained at the scene and cooperated with the preliminary investigation. Anyone who may have information regarding this incident is asked to call Long Beach Police Department Collision Investigation Detail Detective Brian Watt at (562) 570-7355. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2332,http://www.longbeach.gov/police/press-releases/murder-25-/,Media Bulletins,Agency-Published Resources,MURDER(25),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/23/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 Press Release: Arrest Made 8-3-15 On Monday, June 22, 2015, about 8:45 a.m., Long Beach Police were dispatched to the area of the 800 block Cedar Avenue regarding a shooting call, which resulted in the death of a male adult. Upon arrival, officers located a victim who had sustained multiple gunshot wounds to the upper torso. Long Beach Fire Department personnel responded and determined him deceased at the scene. The victim has been identified as 37-year-old Douglas Wilson of Long Beach. The SWAT team responded to assist with the search of a nearby residence. As a precautionary measure, nearby residents voluntarily evacuated during the tactical operation. A suspect was not located in the residence. No one is in custody and no suspect information is available. A motive for the shooting is unknown and the investigation remains ongoing. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detectives Hugo Cortes and Oscar Valenzuela at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2333,http://www.longbeach.gov/police/press-releases/long-beach-police-announce-appointment-of-new-commander-and-assignment-of-next-west-division-commander/,Media Bulletins,Agency-Published Resources,LONG BEACH POLICE ANNOUNCE APPOINTMENT OF NEW COMMANDER AND ASSIGNMENT OF NEXT WEST DIVISION COMMANDER,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/6/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: LONG BEACH POLICE ANNOUNCE APPOINTMENT OF NEW COMMANDER AND ASSIGNMENT OF NEXT WEST DIVISION COMMANDER Contact: Media Relations Detail (562) 570-5273 Commander Conant                     Commander Smith Long Beach Police Chief Robert Luna has selected Richard Conant for the position of police commander and will be assigned to lead the Internal Affairs Division. Robert Smith, who is currently the Commander of the Internal Affairs Division, will begin a new assignment in the West Division. PROMOTION TO COMMANDER Commander Richard Conant, a 24-year veteran, began his career with the L.B.P.D. in February 1991. In 2006, he was promoted to sergeant and to lieutenant in 2011. Commander Conant has a diverse work history, including Patrol, Homicide, Gang Enforcement, the Office of the Chief of Police, and the S.W.A.T. team. His most recent assignment has been the Lieutenant in the Internal Affairs Division. Commander Conant has a Bachelor Degree in Criminal Justice from California State University, Long Beach, and completed the Sherman Block Supervisory Leadership Institute and FBI Crisis Negotiation Team Leadership training. He is a current member of the Leadership Long Beach Institute Class of 2015. ASSIGNMENT OF WEST DIVISION COMMANDER Robert Smith, who is currently the Commander of the Internal Affairs Division, will begin a new assignment in the West Division on January 10, 2015. Commander Robert Smith began his career as a police officer with the Long Beach Police Department in 1990. His assignments have included working as a Patrol Officer, Field Training Officer, Community Policing Officer, Special Enforcement Section, and Drug Enforcement Detective. He has extensive experience in community policing and at one point lead the Department's Community Oriented Public Safety (COPS) Office. Commander Smith holds a Bachelor of Arts Degree in Criminal Justice from California State University, Fullerton, and an Associate of Arts Degree from Golden West College. He is a graduate of the University of Southern California's Delinquency Control Institute and the Federal Bureau of Investigations (FBI) National Academy, 234th Session. The Long Beach Police Department congratulates Commander Conant and Commander Smith and wishes them continued success throughout their careers. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2334,http://www.longbeach.gov/police/press-releases/murder-investigation----1000-block-of-east-11th-street/,Media Bulletins,Agency-Published Resources,MURDER INVESTIGATION - 1000 BLOCK OF EAST 11TH STREET,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/1/2019 FOR IMMEDIATE RELEASE Press Release # Subject: MURDER INVESTIGATION - 1000 BLOCK OF EAST 11TH STREET Contact: Media Relations Detail (562) 570-5273 lbpdmediarelations@longbeach.gov Updated 11:17 a.m: On February 28, 2019, at approximately 5:15 p.m., officers were dispatched to the 1000 block of East 11th street regarding a hit shooting, which resulted in the death of a male juvenile and a non-life threatening injury to a female adult. When officers arrived, they located the juvenile victim, a 17-year-old resident of Long Beach, in the alley who had a gunshot wound to his upper torso. The female victim, a 34-year-old resident of Long Beach. was located inside a residence with a gunshot wound to the leg. The Long Beach Fire Department responded and transported both victims to a local hospital, where the juvenile victim was pronounced deceased. The preliminary investigation indicates the victims were in a garage that faces the alley in the rear of a residence. An unknown number of suspects driving a light-colored four-door sedan drove eastbound in the alley and fired multiple rounds at the victims. The motive for the shooting is unknown at this time. The investigation is on-going. Anyone with information regarding the incident is urged to contact LBPD Homicide Detectives Malcolm Evans and Robert Gonzales at (562) 570-7244. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2337,http://www.longbeach.gov/police/press-releases/officer-involved-shooting---2500-lb-blvd/,Media Bulletins,Agency-Published Resources,Officer Involved Shooting - 2500 LB Blvd,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/15/2015 FOR IMMEDIATE RELEASE Press Release # Subject: OFFICER INVOLVED SHOOTING Contact: Media Relations Detail (562) 570-5273 On Monday, December 14, 2015, at approximately 10:08 p.m., Long Beach police were dispatched to a business in the 2500 block of Long Beach Boulevard regarding a suspect inside armed with a knife, which resulted in an officer involved shooting. The preliminary investigation has determined the following: • While officers were responding to the location, they received an update the suspect was now waiving the knife around inside the business, and some customers left in fear of their safety. • The first officers arrived on scene minutes after they were dispatched and encountered the suspect who was seated in a chair and still armed with a knife • They gave the suspect verbal commands to drop the knife and the suspect failed to comply with any of the officers orders • Officers then deployed less lethal options, which included an electronic control device and baton • The less lethal options were ineffective, and an officer involved shooting occurred • Officers immediately started life saving measures on the suspect • Long Beach Fire Department responded, rendered aid, and subsequently pronounced the suspect deceased at the scene • No officers or citizens in the business were injured • The knife was recovered at the scene • Limited portions of the incident were captured on video, which will be reviewed by Homicide detectives, in addition to the L.A. County District Attorney’s Office The Los Angeles County Coroner’s Office will determine the suspect’s identity and notify next of kin. The Police Department thoroughly reviews all use of force incidents through a rigorous multi-step process that evaluates legal, policy, tactical, and equipment issues. Additionally, the Los Angeles County District Attorney’s Office is conducting an independent investigation of the shooting, as they do with all officer involved shootings that occur in Los Angeles County that result in injury of death. The L.A. County Coroner’s Office also conducts an independent investigation of officer involved shootings that result in death. Anyone who may have witnessed this incident, or has information is encouraged to call the Long Beach Police Departments Homicide Detail at (562) 570-7244. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2339,http://www.longbeach.gov/police/press-releases/critical-missing-person--douglas-grant/,Media Bulletins,Agency-Published Resources,CRITICAL MISSING PERSON- DOUGLAS GRANT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 8/21/2018 FOR IMMEDIATE RELEASE Press Release # Subject: *UPDATE* CRITICAL MISSING PERSON- DOUGLAS GRANT Contact: Media Relations Detail (562) 570-5273 Douglas Clifford Grant (Click on photo to enlarge image) UPDATE - 8/21/18 at 4:30 PM: On Tuesday, August 7, 2018 the remains of missing person Douglas Clifford Grant were recovered in the Barstow Desert by the San Bernardino Sheriff’s Coroner. The Long Beach Police Department was notified on Saturday, August 18, 2018 that the remains were identified as those of Mr. Grant, who left his residence on July 18, 2018 to an unknown destination. Official cause of death will be determined by the San Bernardino Sheriff’s Coroner Office, who can be reached at (909) 387-2978. ORIGINAL NEWS RELEASE - 8/8/18: The Long Beach Police Department is asking for the public's help in locating a male adult who may be at risk. The missing person, 79-year-old Douglas Clifford Grant, was last seen by family members on July 19, 2018 at approximately 7:00 a.m., in the 3000 block of Golden Avenue. On July 24, 2018 family members received a tow notification from the California Highway Patrol indicating Mr. Grant's vehicle a Tan, 2008 Toyota pick-up was towed for being abandoned on the westbound I-40 FWY between mile markers 42 and 43. There has been no activity with any of his bank cards nor his cell phone since he left his residence. The victim is described as follows: Name: Douglas Clifford Grant Age: 79 years Gender: Male Race/Ethnicity: White Height: 6’0 Weight: 185 lbs. Hair: White Eyes: Blue Clothing: Unknown Scars/Marks/Tattoos: Fish tattoo on left arm Anyone who sees the victim or has information on his whereabouts is asked to call the Long Beach Police Department at (562) 435-6711 or 9-1-1. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2340,http://www.longbeach.gov/police/press-releases/murder-investigation-market-st--orange-ave/,Media Bulletins,Agency-Published Resources,MURDER INVESTIGATION (MARKET ST & ORANGE AVE),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/9/2018 FOR IMMEDIATE RELEASE Press Release # 2018 Subject: MURDER INVESTIGATION (MARKET ST. & ORANGE AVE.) Contact: Media Relations Detail (562) 570-5273 On September 8, 2018, at approx. 11:00 p.m., officers were dispatched to Market Street and Orange Avenue regarding a hit and run injury collision, which resulted in the death of a male adult. When officers arrived, they learned the victim was walking in the area of Market Street and Orange Avenue, when he got into an argument with the male driver of a red sedan. The argument continued and while the victim was standing in the center median area of the roadway, the suspect ran him over and fled westbound on Market Street. The victim was transported to a local hospital where he was later pronounced deceased. The victim has been identified as 40-year-old Victor Salvador Herrera of Long Beach. Shortly thereafter, in the area of Temple Avenue and Willow Street, officers observed what appeared to be an intoxicated driver, and attempted to conduct a traffic stop. When the vehicle collided into a parked car at 10th Street and Obispo Avenue, the suspect was taken into custody. Upon further investigation, it was determined this to be the same vehicle involved in the earlier hit and run. The suspect has been identified as 29-year-old Sokhorn Hor of Long Beach. He has been booked for murder and is being held at the Long Beach City Jail on $2,000,000 bail. Anyone who witnessed or has information regarding the incident is asked to call Long Beach Police Homicide Detectives Malcolm Evans and Robert Gonzales at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2342,http://www.longbeach.gov/police/press-releases/improving-motorcycle-safety-aim-of-l-b-p-d--operation/,Media Bulletins,Agency-Published Resources,IMPROVING MOTORCYCLE SAFETY AIM OF L.B.P.D. OPERATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/7/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: IMPROVING MOTORCYCLE SAFETY AIM OF L.B.P.D. OPERATION Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department will be conducting a specialized Motorcycle Safety Enforcement Operation on Saturday, January 10, 2015, in an effort to lower deaths and injuries. Extra officers will be on duty patrolling areas frequented by motorcyclists and where motorcycle crashes occur. Officers will be looking for violations made by drivers and riders alike that can lead to motorcycle crashes. They will be cracking down on both those driving regular vehicles and motorcycle riders that are under the influence of drugs or alcohol, speeding, making illegal turns, or committing other dangerous violations. Motorcycle fatalities saw a phenomenal drop of 37 percent from 2008 to 2010, but then rose 23 percent by 2012. Operations like this are aimed at curbing any increases in motorcycle deaths and sending the numbers back downward. In the City of Long Beach, there were 295 motorcyclists injured and 19 motorcycle fatalities during a three-year period spanning from January of 2011 to December of 2013. California collision data reveals that primary causes of motorcycle-involved crashes include speeding, unsafe turning and impairment due to alcohol and other drugs by both riders and drivers alike. The Long Beach Police Department would like to remind all motorists to always be alert and watch out for motorcycles, especially when turning and changing lanes. Drivers should be aware that motorcycle lane splitting is not illegal if done in a safe and prudent manner. Motorcycle riders should consult the Lane Splitting General Guidelines to learn more – www.ots.ca.gov/lanesplittinggeneralguidelines.pdf. Riders can get training through the California Motorcyclist Safety Program. Information and training locations are available at www.CA-msp.org or 1-877 RIDE 411 or 1-877-743-3411. Funding for this program is provided by a grant from the California Office of Traffic Safety through the National Highway Traffic Safety Administration. The message to all drivers and motorcyclists is: share in the responsibility and do your part by safely ""sharing the road."" This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2343,http://www.longbeach.gov/police/press-releases/improving-motorcycle-safety-aim-of-operation/,Media Bulletins,Agency-Published Resources,IMPROVING MOTORCYCLE SAFETY AIM OF OPERATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/20/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: IMPROVING MOTORCYCLE SAFETY AIM OF OPERATION Careless motorists as well as riders get special scrutiny Contact: Media Relations (562) 570-5273 The Long Beach Police Department will conduct a specialized Motorcycle Safety Enforcement Operation on February 22, 2015, in an effort to lower deaths and injuries. Extra officers will be on duty to patrol areas frequented by motorcyclists and where motorcycle crashes occurred. Officers will look for violations made by drivers and riders alike that can lead to motorcycle crashes. Officers will be cracking down on both those operating regular vehicles and motorcycles, who are under the influence of drugs or alcohol, speeding, making illegal turns, or any other dangerous violation. Motorcycle fatalities saw a phenomenal drop of 37% from 2008 to 2010, but then rose 23% by 2012. Operations like this are aimed at curbing any more raises in motorcycle deaths and sending the numbers back downward. Over the course of the past three years, motorcycle involved collisions have resulted in 15 fatal and approximately 277 injury crashes. California collision data reveals that primary causes of motorcycle-involved crashes include speeding, unsafe turning, and impairment due to alcohol and other drugs by both riders and drivers. Long Beach Police encourage you to practice the following: Safety tips for drivers – Share the Road: Look twice for motorcyclists, especially when entering the roadway, turning, or changing lanes Motorcyclists are allowed in HOV lanes unless prohibited by signage Safety tips for riders – See and Be Seen: Ride with lights on during daylight hour Use your lane position to increase visibility; change lanes only when there is ample room Match your speed to surrounding traffic Always wear a DOT compliant helmet and brightly colored protective clothing Riders are urged to obtain training through the California Motorcyclist Safety Program. Information and training locations are available online or 1-877 RIDE 411 (1-877-743-3411). Funding for this program is provided by a grant from the California Office of Traffic Safety through the National Highway Traffic Safety Administration. The message to all drivers and motorcyclists is: Share in the responsibility and do your part by safely “sharing the road.” This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2344,http://www.longbeach.gov/police/press-releases/lbpd-academy-graduation-ceremony/,Media Bulletins,Agency-Published Resources,LBPD ACADEMY GRADUATION CEREMONY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/5/2015 FOR IMMEDIATE RELEASE Press Release # Subject: LBPD ACADEMY GRADUATION CEREMONY HELD TODAY Contact: Media Relations Detail (562) 570-5273 CLICK PHOTO FOR LARGER VERSION The Long Beach Police Department is pleased to announce the graduation of Academy Class #88. The graduation ceremony was held today, November 5, 2015, at the Long Beach Performing Arts, Terrace Theater. Thirty-three Long Beach Police Department and two Gardena Police Department recruits successfully completed 27 ½ weeks of intense academic, physical and practical training in the areas such as: Patrol Procedures and Law Enforcement Tactics, Firearms Training, Weaponless Defense, Criminal Law, Vehicle Operations, Community Oriented Public Safety, and Cultural Diversity/Human Relations. Class #88 is diverse group who bring to the department a wide range of talents from a variety of backgrounds. The demographics for the class (33 LBPD recruits only) are as follows: Gender Male: 23 (69.7%) Female: 10 (30.3%) Race White: 18 (54.5%) Hispanic: 11 (33.3%) Black: 2 (6.1%) Other: 2 (6.1%) Asian: 0 Sex/Race Male/White: 14 (42.4%) Female/Hispanic: 6 (18.2%) Male/Hispanic: 5 (15.2%) Female/White: 4 (12.1%) Male Black: 2 (6.1%) Male/Other: 2 (6.1%) Education HS: 16 (48.5%) BA/BS: 10 (30.3%) AA: 6 (18.2%) MA: 1 (3%) The graduating class included the following officers: Officer Amanda Aknin             Officer Tiffany Forster               Officer Matthew Pech* Officer Monica Augustine        Officer Ivan Garcia                     Officer Charles Pruiet Officer Matthew Calub             Officer Genoveva Gonzales       Officer Ivone Sanchez Officer Jose Castro                   Officer Craig Hazlewood            Officer Manuel Sandoval Officer Benjamin Cobb            Officer Benjamin Hearst             Officer Troy Schaefer Officer James Connell              Officer Nathan Kane                   Officer Hunter Schneider Officer Krizty Contreras           Officer Michael Leraas               Officer Timothy Stover Officer Marc Cooks                  Officer Melissa Martinez            Officer Juan Urrieta Officer Kristina Cortes             Officer Kevin Matter                  Officer Brian Weber Officer Alma Davila                 Officer Kevin Moreno                Officer Daniel Wollenberg Officer Holden Deaton             Officer Michelle Mounts            Officer Mayda Zelaya* Officer Elieser Domingo          Officer Bradley Muhlenkamp *Gardena Police Department The Long Beach Police Department congratulates the graduates and wishes them continued success in their future careers as law enforcement officers. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2345,http://www.longbeach.gov/police/press-releases/traffic-fatality-1900-block-pch/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/5/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Thursday, May 4, 2017, at approximately 3:35 p.m., Long Beach Police were dispatched to the 1900 block of East Pacific Coast Highway regarding an injury traffic collision involving a vehicle and multiple pedestrians. Arriving officers found a vehicle collided into the covered patio area of a restaurant that was open for business. The preliminary investigation indicated a gray 2006 Dodge Durango was traveling westbound on East Pacific Coast Highway, when it is believed the driver experienced a medical emergency and lost control of the vehicle. The vehicle drifted to the right, off the roadway, colliding with the raised curb on Pacific Coast Highway, crossed the sidewalk, and collided into the patio area, striking three patrons. A female patron was trapped under the vehicle and was initially aided by community members and subsequently extricated by Long Beach Fire Department personnel. Long Beach Fire Department (LBFD) personnel transported the male adult driver, in critical condition, to a local hospital. They also transported the three patrons, the female adult and two male adults, to local hospitals. Their injuries appeared to be non-life threatening. The driver was later transported to a hospital in Los Angeles and on May 5, 2017, Long Beach Police were notified that the driver, a 53-year-old resident of Seal Beach, was later pronounced deceased at the hospital. The Los Angeles County Coroner will determine cause of death and notify next of kin. Anyone who may have information regarding this incident is asked to call Long Beach Police Department Collision Investigation Detail Detective David Lauro at (562) 570-7355. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2346,http://www.longbeach.gov/press-releases/long-beach-police-department-south-division-to-host-open-house/,Media Bulletins,Agency-Published Resources,Long Beach Police Department South Division to Host Open House,"",200,City of Long Beach,"[""PRESS RELEASE""]",[],[],[],[],[],"A- A A+ PRESS RELEASE City of Long Beach Public Information Office 411 W. Ocean Blvd, Long Beach, CA 90802 12/13/2017 FOR IMMEDIATE RELEASE Press Release # CM:121317 Subject: Long Beach Police Department South Division to Host Open House Contact: Arantxa Chavarria, Public Information Officer Long Beach Police Department 562.570.5273 LBPDMediaRelations@longbeach.gov The City of Long Beach will celebrate the reestablishment of the Police Department’s South Patrol Division, 400 W. Broadway, with a free community Open House event on Saturday, December 16, 2017, from 11:30 am until 2:30 pm. “Restoring the South Patrol Division will improve the safety of our community and demonstrates the City’s commitment to use Measure A funds to enhance public safety as promised,” said Mayor Robert Garcia. The Open House will feature tours of the facility, meet and greet with officers, equipment displays, refreshments, and welcoming remarks at noon. “We are very pleased to be able to restore the South Patrol Division Operations to the Public Safety Building,” said Police Chief Robert Luna. “We’re extremely grateful to our residents for supporting Measure A, which is allowing us to provide enhanced community oriented policing in the downtown area.” Measure A funds have reestablished the Long Beach Police Department’s South Patrol Division with eight sworn police positions and two civilian positions. South Division started deploying out of the Public Safety Building on Saturday, November 18, 2017. To contact the South Patrol Division, email LBPDSouth@longbeach.gov or call (562) 570-7555. About Measure A In 2016, Long Beach voters recognized a pressing need to maintain and enhance public safety services and invest in City infrastructure. Thanks to the passage of Measure A, Fire Engine 8, Paramedic Rescue 12, Police South Division, and Police Academy operations have been restored, enhancing public safety citywide. The City is also making a historic investment in revitalizing heavily utilized public spaces such as streets, libraries, community centers, and parks. Anticipated to raise $384 million over ten years for the City of Long Beach, Measure A is collected as a one percent sales tax for the first six years, and then reduces to half a percent in the four years before it sunsets. For more information, visit: www.longbeach.gov/MeasureA For more news, pictures, videos and announcements of what’s happening in Long Beach, follow us on Facebook , Twitter , Instagram and YouTube . " -2347,http://www.longbeach.gov/police/press-releases/murder-investigation2/,Media Bulletins,Agency-Published Resources,MURDER INVESTIGATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/5/2018 FOR IMMEDIATE RELEASE Press Release # Subject: MURDER INVESTIGATION Contact: Media Relations (562) 570-5273 On Wednesday, April 4, 2018, at approx. 12:00 a.m., officers were dispatched to the 5300 hundred block of Orange Avenue regarding a shooting, which resulted in the death of two male adults, and the injury of a third. When officers arrived, they discovered a deceased male, identified as 52-year-old Suy Phavong of Long Beach, who had sustained a gunshot wound to the torso. A second male subject, identified as 35-year-old Panha Nhean of Long Beach, had also been struck in the torso. He was transported to a local hospital by Long Beach Fire Department paramedics, where he was pronounced deceased. A third male subject, only being identified as a 47-year-old resident of Long Beach, was also transported to a local hospital with a non-life threatening injury. The preliminary investigation determined that all the victims were in a converted detached garage when an unknown suspect opened fire on the group. A motive for the shooting is unknown, no suspect information is available at this time, and the investigation remains ongoing. Anyone who may have information regarding this incident should contact Long Beach Police Homicide Detectives Teryl Hubert and Scott Lasch at (562) 570-7244. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2348,http://www.longbeach.gov/police/press-releases/traffic-fatality-artesia-and-myrtle/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY ARTESIA AND MYRTLE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/30/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Thursday, September 29, 2016, at approximately 7:06 p.m., Long Beach Police Department responded to a vehicle versus a pedestrian injury traffic collision at the intersection of Artesia Boulevard and Myrtle Street. Upon arrival, officers discovered a 2009 Ford Flex in the intersection and a male victim laying in the roadway next to the vehicle. Long Beach Fire Department Paramedics responded to the scene and transported the victim to a local Hospital. The Investigation revealed that the 2009 Ford Flex was traveling westbound Artesia Boulevard when three male juveniles attempted to run diagnolly across Artesia Boulevard at Myrtle Avenue. Two of the male pedestrians successfully ran across Artesia Boulevard in front of the vehicle, but the victim did not and was struck by the Ford Flex. The driver of the 2009 Ford Flex, a 43-year-old male resident of Compton, stopped at the scene and called 911. He and his passenger did not suffer any injuries. The driver had a valid drivers license and insurance and was not cited. The victim is a 17 year-old resident of Long Beach and suffered major head trauma. On September 30, 2016, he died from his injuries at a local hospital. Any witnesses are asked to call Detective Brian Watt at (562) 570-5520. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2350,http://www.longbeach.gov/police/press-releases/traffic-fatality-8-/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY(8),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/2/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On February 17, 2015, at approximately 6:06 p.m., Long Beach Police were dispatched to Bellflower Boulevard and Atherton Street regarding an injury traffic collision involving a vehicle and a pedestrian, which resulted in the death of a male adult. Arriving officers found Long Beach Fire Department paramedics attending to a male pedestrian who sustained major head and body trauma. The pedestrian was transported to a local hospital in critical condition. The preliminary investigation revealed the 60- to 70-years-old unidentified pedestrian was walking westbound across Bellflower Boulevard, south of Atherton Street, when he was struck by a 2013 Mazda. The Mazda, being driven by a 26-year-old Long Beach resident, was traveling southbound Bellflower Boulevard. The pedestrian was not carrying any identification and is currently listed as a John Doe. The Mazda driver remained at the scene, was interviewed, and later released. Long Beach Police were notified that on February 27, 2015, the pedestrian succumbed to his injuries.  The Los Angeles County Coroner’s Office will make positive identification and notify next-of-kin. Anyone with information regarding this incident is asked to call Collision Investigations Detective Sirilo Garcia at (562) 570-7355.  Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2351,http://www.longbeach.gov/police/press-releases/murder-44-/,Media Bulletins,Agency-Published Resources,Murder(44),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/7/2015 FOR IMMEDIATE RELEASE Press Release # Subject: MURDER Contact: Media Relations Detail (562) 570-5273 UPDATE: On 2/10/2016, 33-year-old Justin Michael St. George was arrested in connection with this murder. See link to related news release Original news release : On Sunday, December 6, 2015, at approximately 10:40 a.m., Long Beach Police responded to a parking lot in the 1700 block of Ximeno Avenue regarding the body of a deceased male adult. The victim was found inside an RV with a fatal injury to the torso and was determined deceased at the scene. Additional information regarding the nature of the injury is not being released at this time. The preliminary investigation determined the RV had parked at that location sometime between late Friday night or early Saturday morning. The victim is only being identified as a 62-year-old male pending notification of next of kin. Detectives believe the victim had only resided in Long Beach a short time. A motive for the assault is unknown and remains under investigation. Anyone with information regarding the incident is urged to contact Long Beach Police Homicide Detectives Mark Bigel Guarino and Shea Robertson at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2352,http://www.longbeach.gov/police/press-releases/charges-filed-in-murder-investigation/,Media Bulletins,Agency-Published Resources,CHARGES FILED IN MURDER INVESTIGATION,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/19/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: CHARGES FILED IN MURDER INVESTIGATION Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department is pleased to announce that charges have been filed against two male juveniles who were arrested in connection with the October 31, 2014 murder of 19-year-old Enrique Avila of Long Beach. Long Beach Police Homicide detectives presented the case to the Los Angeles County District Attorney's office, and one count of murder, in addition to gang enhancements, were filed against the two 17-year-olds, one from Long Beach, and the other from Compton. One suspect was taken into custody on December 12th, and the other turned himself in on December 17th, after a warrant was issued for his arrest. Both are awaiting their preliminary hearing; unknown date. On October 31, 2014, at approximately 11:30 p.m., Long Beach Police responded to the 200 block of E. 68th street regarding a stabbing that just occurred. Upon arrival officers found Victim Avila who had sustained serious injuries as a result of the stabbing. He was transported by Long Beach Fire to a local hospital where he was pronounced deceased. Anyone with information regarding this incident should contact Long Beach Police Homicide Detectives Donald Goodman and Mark Mattia at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2353,http://www.longbeach.gov/police/press-releases/murder-investigation---600-block-of-cedar-ave/,Media Bulletins,Agency-Published Resources,MURDER INVESTIGATION - 600 BLOCK OF CEDAR AVE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 8/13/2018 FOR IMMEDIATE RELEASE Press Release # Subject: MURDER INVESTIGATION - 600 BLOCK OF CEDAR AVE Contact: Media Relations Detail (562) 570-5273 On August 12, 2018, at approximately 8:30 p.m., officers were dispatched to the 600 block Cedar Avenue regarding a possible shooting, that resulted in the death of a male adult. Once on scene, officers gathered information indicating the victim and the suspect were involved in an altercation and located evidence a shooting had occurred. Both suspect and victim fled the scene prior to officer arrival. Shortly after, officers located a male adult in the immediate area who had been struck in the upper body by gunfire. Long Beach Fire Department paramedics responded and determined the victim deceased on scene. Possible suspect description is male adult Hispanic, a motive for the shooting is unknown. The investigation remains ongoing. The victim’s identity is being withheld pending notification to next of kin. Anyone with information regarding this incident is asked to call Homicide Detectives Mark Mattia or Donald Goodman at (562) 570-7244. Anonymous tips may be submitted through ""LA CRIME STOPPERS"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple store and Google Play), or by visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2354,http://www.longbeach.gov/police/press-releases/parents-arrested-for-murder-in-2013-suspicious-death-of-1-month-old-infant/,Media Bulletins,Agency-Published Resources,PARENTS ARRESTED FOR MURDER IN 2013 SUSPICIOUS DEATH OF 1-MONTH-OLD-INFANT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/2/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: PARENTS ARRESTED FOR MURDER IN 2013 SUSPICIOUS DEATH OF 1-MONTH-OLD-INFANT Contact: Media Relations (562) 570-5273 On May 30, 2013, Long Beach police officers responded to the 200 block of South Pine Avenue in regards to a 1-month-old infant that was not breathing. The infant was transported to a local hospital and pronounced deceased. The Los Angeles County Coroner's Office investigated the case as a suspicious death. The results of the coroner’s investigation revealed the parents were responsible for the death of the infant. After a thorough investigation by Long Beach Homicide detectives, the case was presented to the Los Angeles County District Attorney’s Office. On March 27, 2014, The Los Angeles County District Attorney’s Office issued arrest warrants for both parents of the infant. On March 31, 2014, Long Beach Homicide Detectives learned the parents were at an apartment in the City of Fresno, California. With the assistance of the Fresno Police Department, 32 year-old Nereyda Licon of Fresno and 28 year-old Joshua Licon of Fresno were arrested for murder and booked into the Fresno County Jail. On April 1, 2014, Long Beach Detectives transported the Licons to the Long Beach Jail where they are both being held on $1,000,000 bail. Anyone with information regarding this incident is urged to contact the Long Beach Police Homicide Detectives Hugo Cortes and Peter Lackovic at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2355,http://www.longbeach.gov/police/press-releases/operation-results-in-multiple-arrests--confiscation-of-numerous-firearms/,Media Bulletins,Agency-Published Resources,OPERATION RESULTS IN MULTIPLE ARRESTS & CONFISCATION OF NUMEROUS FIREARMS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2356,http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-this-weekend3/,Media Bulletins,Agency-Published Resources,DUI/DRIVERS LICENSE CHECKPOINT PLANNED THIS WEEKEND,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2358,http://www.longbeach.gov/police/press-releases/traffic-fatality-shoreline-dr-and-710-fwy/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY: SHORELINE DR AND 710 FWY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/16/2018 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY: SHORELINE DR AND 710 FWY Contact: Media Relations Detail (562) 570-5273 On February 16, 2018, at approximately 2:35 a.m., officers responded to the area of westbound Shoreline Drive east of the North I-710 Freeway regarding a single vehicle traffic collision, which resulted in the death of a male adult. Officers arrived on scene and discovered a 2016 Hyundai Veloster at the bottom of the embankment below Shoreline Drive. The vehicle was occupied by one male. The preliminary investigation determined the Hyundai, driven by a 21-year old male from Ontario, was traveling west on Shoreline Drive. The driver lost control of the vehicle hitting the guard rail on the north side of the roadway. The vehicle left the roadway and came to rest in a vacant dirt lot below Shoreline Drive. Long Beach Fire Department responded and attempted lifesaving measures. However, the driver succumbed to his injuries and was determined deceased at the scene. Identification of the driver is being withheld pending the notification of the next of kin. Alcohol/Drug intoxication are not believed to be involved. The investigation is ongoing. Any witnesses to this incident are asked to contact Long Beach Police Department Collision Investigation’s Detail at (562) 570-7355. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 TIPS” app to your smart phone (available at the Apple App store and Google Play), or visiting www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2359,http://www.longbeach.gov/police/press-releases/in-custody-death/,Media Bulletins,Agency-Published Resources,IN-CUSTODY DEATH,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/30/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: IN-CUSTODY DEATH Contact: Media Relations (562) 570-5273 On Tuesday, May 27, 2014, at approximately 2:00 a.m., Long Beach Police stopped a vehicle for traffic violations in the area of Carson Street and the 605 freeway. During the course of the traffic stop the officer discovered a passenger in the vehicle, 53-year-old Deborah Lynn Day, had an outstanding felony warrant for her arrest. Mrs. Day was placed under arrest and transported to the Long Beach Police Department Jail Booking Facility. During the booking process, jail medical personnel examined Mrs. Day. Mrs. Day had no apparent medical issues, however she appeared to be under the influence of drugs and therefore closely monitored. Mrs. Day became agitated during the booking process, which led medical staff and booking personnel to request paramedics transport her to a hospital for further examination. Long Beach Fire Department Paramedics responded and transported Mrs. Day to a local hospital. Shortly after her arrival, Mrs. Day went into medical distress and was resuscitated by hospital staff. Mrs. Day remained at the hospital in critical condition. At approximately 5:10 p.m. on May 27th, Mrs. Day again went into medical distress. Hospital staff was unable to revive her and she was pronounced deceased. Detectives from the Long Beach Police Homicide Detail responded to investigate due to Mrs. Day’s medical issues becoming apparent while in-custody, which is standard practice in all cases of in-custody deaths. The investigation remains ongoing. The Los Angeles County Coroner’s Office is also conducting an independent investigation to determine the cause of death. Anyone with information regarding this incident should contact Long Beach Homicide Detectives Teryl Hubert and Sean Irving at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2360,http://www.longbeach.gov/police/press-releases/publics-help-sought-in-indecent-exposure/,Media Bulletins,Agency-Published Resources,PUBLIC'S HELP SOUGHT IN INDECENT EXPOSURE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/1/2018 FOR IMMEDIATE RELEASE Press Release # Subject: PUBLIC'S HELP SOUGHT IN IDENTIFYING INDECENT EXPOSURE SUSPECT Contact: Media Relations Detail (562) 570-5273 On Thursday, November 1, 2018, at approx. 9:20 a.m., officers were dispatched to investigate an indecent exposure incident that occurred in the area of 68th Street and Orange Avenue. A 13- year-old female was walking in that area when a male subject in a vehicle called her over and exposed himself to her. The victim fled the location and the police were called. The suspect was described as male white or Hispanic, 20 to 30-years-old, with longer brown hair on top, shorter hair on the sides, and a neatly trimmed beard. He was wearing a dark t-shirt and driving a newer white 2-door vehicle. It is unknown if the incident is related to a similar incident that occurred on October 30, 2018, in the 5200 block of Greenmeadow Road, but the investigation is ongoing (see link below). Anyone who has information regarding the suspect or vehicle is urged to contact Long Beach Police Sex Crimes Detectives at (562) 570-7368. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . October 30, 2018 Incident: http://www.longbeach.gov/police/press-releases/publics-help-sought-in-identifying-indecent-exposure-suspect/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2361,https://delcopa.gov/treasurer/pdf/2021reassessmentvalues/36.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -2362,https://www.mass.gov/doc/2017-police-officer-and-state-trooper-exam-poster/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -2363,https://coloradosprings.gov/mayors-office/article/news/mayor-and-police-statements-about-bailey-civil,Media Bulletins,Agency-Published Resources,Mayor and police statements about Bailey civil settlement | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Mayor and police statements about Bailey civil settlement""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -2364,http://www.lafayettepolice.us/493/sports-programs,Not Criminal Justice Related,Not Criminal Justice Related,"Sports Programs | Lafayette, IN - Official Website",Young people can choose from several different sports programs for fun and fitness. ,200,"Police Department | Lafayette, IN - Official Website","[""Sports Programs""]","[""Youth Basketball"", ""Flag Football"", ""Sporties For Shorties"", ""Street Hockey"", ""Summer and Fall Tennis""]","[""Fall Session 2024"", ""Winter Session (2025)"", ""2024 Information"", ""Basketball"", ""T-Ball"", ""Soccer"", ""Flag Football"", ""More Information"", ""Contact Us"", ""McAllister Recreation Center"", ""Hours"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2365,https://www.newarknj.gov/resources/instructions-for-crane-or-helicopter-lift,Not Criminal Justice Related,Not Criminal Justice Related,Resources: Instructions for Crane or Helicopter Lift,"Official Page of Newark, NJ Resources: Instructions for Crane or Helicopter Lift",200,City of Newark,"[""City of"", ""NEWARK"", ""City of"", ""NEWARK""]","[""Instructions for Crane or Helicopter Lift"", ""Mayor Ras j baraka""]",[],[],[],[],"City of NEWARK DEPARTMENTS Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities News Events Forms mayor City Mayor Council Members Contact Knowledge Contact us City of NEWARK DEPARTMENTS Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities News Events Forms mayor City Mayor Council Members Contact Knowledge Contact us City of NEWARK DEPARTMENTS Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities DEPARTMENTS DEPARTMENTS Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities Administration Communications Economic & Housing Development Engineering Finance Health & Community Wellness Law Municipal Court Newark Office of Film+Television Office of Violence Prevention & Trauma Recovery Office of the City Clerk Office of the Mayor & Agencies Public Safety Public Works Recreation, Cultural Affairs and Senior Services Water & Sewer Utilities mayor City Mayor Council Members mayor mayor Contact Knowledge Contact us Contact Contact Instructions for Crane or Helicopter Lift Click to View the Resource Instructions for Crane or Helicopter Lift Instructions for Crane or Helicopter Lift Click to View the Resource Click to View the Resource Click to View the Resource Click to View the Resource Contact Information City Hall 920 Broad Street Newark, NJ 07102 (973) 733-4311 (973) 928-1238 4311newark@ci.newark.nj.us Helpful Links Community Departments News Events City Council Employee Directory Newark 4311 contact us Quick Links business registration Payments knowledge base Jobs Phone Numbers Departments Administration Communications Economic & Housing Development Engineering Finance → View all Departments innovation Newark Nextdoor NewarkConnect App iPhone NewarkConnect App Android Data Dashboard Newark Fiber Open Data City of NEWARK Mayor Ras j baraka Privacy Policy Report an Issue Website Feedback Powered by SeamlessGov " -2366,https://www.sandiego.gov/police/news-center/cold-cases/maria-cortes,Crime Maps & Reports,Agency-Published Resources,Maria Cortes | City of San Diego Official Website,"Maria Cortes was a Mexican national who worked as a housekeeper and child care provider. She had a two-year-old daughter named Briana. Those close to Cortes described her as a devoted mother and a hard worker, dedicated to making a better life for Briana and becoming a legal citizen herself. Cortes had no car and used buses for transportation, often riding two or more buses in one trip and sometimes walking alone at night to get home from work.",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""Cold Case: Maria Cortes""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""News Center"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -2367,https://delcopa.gov/publicrelations/releases/2018/18redribbonweek.html,Not Criminal Justice Related,Not Criminal Justice Related,"Public Relations - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Public Relations Releases""]",[],"[""Recognizing October 23-31 as Red Ribbon Week"", """", ""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -2368,https://www.coppelltx.gov/953/lifelong-learning,Not Criminal Justice Related,Not Criminal Justice Related,"Lifelong Learning | Coppell, TX","Whether you want to learn a new hobby, start a career, or learn a new language, Lifelong Learning Databases are the best way to continue your education.",200,"Coppell, TX | Official Website","[""Lifelong Learning""]","[""Database Password""]","[""Loading""]",[],[],[],Skip to Main Content -2369,https://wildwoodpolice-fl.gov/wpd-history/,Poor Data Source,Poor Data Source,WPD History - Wildwood Police,"",200,Home - Wildwood Police,"[""Wildwood PD History""]","[""Contact Information:""]",[],[],[],[],"Home Online Services Submit A Tip Attempt to Identify Bias Based Profiling Commend an Officer Crime Statistics NEW – Public Records Request Traffic Crash Report Buy a Crash Report Report a Traffic Crash Florida Crash Report Citizens Services Victim Outreach Community Outreach Department of Motor Vehicles About About The Chief WPD Administration Our Mission and Vision WPD History Crime Prevention Media Careers Contact Home Online Services Submit A Tip Attempt to Identify Bias Based Profiling Commend an Officer Crime Statistics NEW – Public Records Request Traffic Crash Report Buy a Crash Report Report a Traffic Crash Florida Crash Report Citizens Services Victim Outreach Community Outreach Department of Motor Vehicles About About The Chief WPD Administration Our Mission and Vision WPD History Crime Prevention Media Careers Contact Wildwood PD History The 1st official record of the incorporation of the City of Wildwood is contained in the Acts of the Legislature, Chapter 3968, which indicated that the City’s incorporation was validated by the State. Legislature on May 16, 1889. Photo Gallery Contact Information: (352) 330-1355 3939 County Rd 462E Wildwood, FL 34785 Accessibility Statement The mission of the Wildwood Police Department is to safeguard the lives and property of the citizens of this community, preserve the peace, prevent crime and disorder, while constantly guarding personal liberties as prescribed by law. © 2022 Wildwood, FL Police Dept. X Home Online Services Submit A Tip Attempt to Identify Bias Based Profiling Commend an Officer Crime Statistics NEW – Public Records Request Traffic Crash Report Buy a Crash Report Report a Traffic Crash Florida Crash Report Citizens Services Victim Outreach Community Outreach Department of Motor Vehicles About About The Chief WPD Administration Our Mission and Vision WPD History Crime Prevention Media Careers Contact Home Online Services Submit A Tip Attempt to Identify Bias Based Profiling Commend an Officer Crime Statistics NEW – Public Records Request Traffic Crash Report Buy a Crash Report Report a Traffic Crash Florida Crash Report Citizens Services Victim Outreach Community Outreach Department of Motor Vehicles About About The Chief WPD Administration Our Mission and Vision WPD History Crime Prevention Media Careers Contact Home Online Services Submit A Tip Attempt to Identify Bias Based Profiling Commend an Officer Crime Statistics NEW – Public Records Request Traffic Crash Report Buy a Crash Report Report a Traffic Crash Florida Crash Report Citizens Services Victim Outreach Community Outreach Department of Motor Vehicles About About The Chief WPD Administration Our Mission and Vision WPD History Crime Prevention Media Careers Contact Home Online Services Submit A Tip Attempt to Identify Bias Based Profiling Commend an Officer Crime Statistics NEW – Public Records Request Traffic Crash Report Buy a Crash Report Report a Traffic Crash Florida Crash Report Citizens Services Victim Outreach Community Outreach Department of Motor Vehicles About About The Chief WPD Administration Our Mission and Vision WPD History " -2370,https://cityofsweetwater.fl.gov/event/sweetwater-police-pension-plan-board-of-trustees-meeting-3/,Not Criminal Justice Related,Not Criminal Justice Related,Agendas & Minutes - City of Sweetwater,"",200,Home - City of Sweetwater,[],"[""Agendas & Minutes""]","[""Contact City Hall"", ""Office Hours""]",[],"[""Search Meeting Minutes, Agendas & Packets""]",[],Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Today Week Detailed 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F 69°F Today 79°F Thu 81°F Fri 79°F Sat 79°F Sun 79°F Mon 79°F Tue 82°F Home About Us Government City Mayor City Commissioners City Code and Charter Agendas & Minutes Administration Calendar Departments Mayor's Office Annual Reports City Budget Building and Zoning Permit & Inspection Utilization Report Permit & Inspection Status Important Forms — Building & Zoning Clerk’s Office Clerks Office Mission Election Information 2021 Election Information 2023 Ordinances & Resolutions Communications News & Notices Newsletter Code Compliance Finance Human Resources Parks and Recreation Parks Programs Police Public Works Engineering Division Community ITB / RFP / RFQ Passport Office Transportation & Transit Schedule Elderly Program Events Calendar Special Projects Department Subscribe to Updates Contact Us Home About Us Government City Mayor City Commissioners City Code and Charter Agendas & Minutes Administration Calendar Departments Mayor's Office Annual Reports City Budget Building and Zoning Permit & Inspection Utilization Report Permit & Inspection Status Important Forms — Building & Zoning Clerk’s Office Clerks Office Mission Election Information 2021 Election Information 2023 Ordinances & Resolutions Communications News & Notices Newsletter Code Compliance Finance Human Resources Parks and Recreation Parks Programs Police Public Works Engineering Division Community ITB / RFP / RFQ Passport Office Transportation & Transit Schedule Elderly Program Events Calendar Special Projects Department Subscribe to Updates Contact Us Home About Us Government City Mayor City Commissioners City Code and Charter Agendas & Minutes Administration Calendar Departments Mayor's Office Annual Reports City Budget Building and Zoning Permit & Inspection Utilization Report Permit & Inspection Status Important Forms — Building & Zoning Clerk’s Office Clerks Office Mission Election Information 2021 Election Information 2023 Ordinances & Resolutions Communications News & Notices Newsletter Code Compliance Finance Human Resources Parks and Recreation Parks Programs Police Public Works Engineering Division Community ITB / RFP / RFQ Passport Office Transportation & Transit Schedule Elderly Program Events Calendar Special Projects Department Subscribe to Updates Contact Us -2371,https://www.mass.gov/doc/cancer-cervical-chicopee/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2372,https://dccouncil.gov/donation-disclosures/copy-of-august-2018-donation-disclosures-5/,Not Criminal Justice Related,Not Criminal Justice Related,Copy of August 2018 Donation Disclosures • Council of the District of Columbia,"",200,Home • Council of the District of Columbia,"[""Copy of August 2018 Donation Disclosures""]",[],[],[],[],[],"Federal Tax Counter: $1,298,612,070 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Federal Tax Counter: $1,298,612,070 What is this? Get Updates RSS Press Center facebook twitter youtube Federal Tax Counter: $1,298,612,070 What is this? Get Updates RSS Press Center facebook twitter youtube Council of the District of Columbia Hearings Calendar Legislation & Laws The Council Council of the District of Columbia Copy of August 2018 Donation Disclosures May 14, 2019 Copy of August 2018 Donation Disclosures Copy of August 2018 Donation Disclosures May 14, 2019 Copy of August 2018 Donation Disclosures DC Council seal About the Council Open Government Register to Vote Council Updates Jobs Council Directory Privacy Policy Commemorative D.C. Flag Program Ethics Visit the Wilson Building facebook twitter youtube Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Council of the District of Columbia 1350 Pennsylvania Avenue, NW, Washington, D.C. 20004 © Copyright 2016, The Council of the District of Columbia. All rights reserved Search facebook twitter youtube Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate " -2373,https://ose.louisiana.gov/event/police-lieutenant/,Poor Data Source,Poor Data Source,Police Lieutenant | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Police Lieutenant""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Police Lieutenant Promotional Level Application Deadline TBD Jurisdiction Shreveport Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Police Lieutenant Promotional Level Application Deadline TBD Jurisdiction Shreveport Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Lieutenant Promotional Level Application Deadline TBD Jurisdiction Shreveport Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Lieutenant Promotional Level Application Deadline TBD Jurisdiction Shreveport Application This event has passed. Police Lieutenant Promotional Level Application Deadline TBD Jurisdiction Shreveport Application This event has passed. Police Lieutenant Promotional Level Application Deadline TBD Jurisdiction Shreveport Application This event has passed. Police Lieutenant Promotional Level Promotional Level Promotional Level Application Deadline TBD Jurisdiction Shreveport Application Deadline TBD Jurisdiction Shreveport Application Deadline TBD Jurisdiction Shreveport Application Deadline TBD Application Deadline Jurisdiction Shreveport Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -2374,https://delcopa.gov/departments/pdfs/2020adoptedbudget.pdf,Annual & Monthly Reports,Info About Agencies,"","",200,"","","","","","","","" -2375,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/082321arrests.pdf,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -2376,https://www.mass.gov/letter-ruling/letter-ruling-81-13-printing-and-photocopying-equipment,Not Criminal Justice Related,Not Criminal Justice Related,Letter Ruling 81-13: Printing and Photocopying Equipment | Mass.gov,"Sales and Use Tax   February 2, 1981 ********** (**********""Center"") is a small printing and photocopying business. You inquire whether the ********** Center's purchase of the following equipment used in its printing operations is subject to the sales tax: (1) offset printing presses; (2) padding presses that bind cardboard or other backing to pads of paper; (3) folding machines; (4) machines used to staple booklets, brochures and the like; (5) collating machines; (6) paper-cutting machines; (7) paper drills; (8) joggers used to align sheets of paper into compact piles; (9) cameras used in plate-making; (10) light tables used for layout work and setting out printing jobs; and (11) typesetting machines. Massachusetts General Laws Chapter 64H, Section 6(r) exempts from sales taxation sales of materials, tools and fuel, or any substitute therefor, which are consumed and used directly and exclusively in an industrial plant in the actual manufacture of tangible personal property to be sold. Chapter 64H, Section 6(s) exempts from sales taxation sales of machinery or replacement parts thereof used directly and exclusively in an industrial plant in the actual manufacture, conversion or processing of tangible personal property to be sold. To be exempt, machinery must be (a) used solely during a manufacturing, conversion or processing operation 1. to effect a direct and immediate physical change upon tangible personal property to be sold; 2. to guide or measure a direct and immediate physical change upon such property where the guiding or measuring is an integral and essential part of tuning, verifying or aligning the parts of such property; or 3. to test or measure such property where the testing or measuring is an integral part of the production flow or function; or (b) used solely to 1. store; 2. transport or convey; or 3. handle such property during the operations listed in (a) above; or (c) used solely to place such property in the container, package or wrapping in which it is normally sold to the ultimate consumer. If machinery does not satisfy the above criteria, it is not exempt even if its operation, function or purpose is an integral or essential part of a continuous production flow or manufacturing process. Based on the foregoing, it is ruled that: (1) sales to the ********** Center of items (1) through (8) (the printing presses, padding presses, folding, stapling, collating and paper-cutting machines, paper drills and joggers) are exempt from tax; and (2) sales to the ********** Center of items (9) through (11) (the cameras used in platemaking, light tables and typesetting machines) are subject to tax. I am enclosing a copy of Regulation 830 CMR 64H.04. Very truly yours, /s/L. Joyce Hampers L. Joyce Hampers Commissioner of Revenue LJH:JXD:mf Enclosure LR 81-13",200,Mass.gov,"[""Letter Ruling Letter Ruling 81-13: Printing and Photocopying Equipment""]","[""Notices & Alerts Hide Expand"", ""Table of Contents"", ""Help Us Improve Mass.gov with your feedback""]","[""notice Get important updates from DOR. Updated Feb. 5, 2024, 03:00 pm""]",[],[],[],"" -2377,https://www.mass.gov/doc/case-study-city-of-chicopee/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2378,http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-arrests/,Media Bulletins,Agency-Published Resources,DUI CHECKPOINT NETS ARRESTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2379,http://www.longbeach.gov/police/press-releases/murder-100-block-48th/,Media Bulletins,Agency-Published Resources,MURDER,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/2/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Tuesday, March 1, 2017, at approximately 7:04 p.m., Long Beach Police were dispatched to an unknown trouble call in the area of Long Beach Boulevard and 48th Street, which resulted in the death of a male adult. Arriving officers located two victims who sustained gunshot injuries. Long Beach Fire Department personnel transported a male adult victim, in stable condition, to a local hospital. Fire Department personnel also determined a male adult victim deceased at the scene. The Los Angeles County Coroner will make positive identification and notify next of kin. A motive for the shooting is unknown and the investigation remains ongoing. Anyone with information regarding this incident is asked to contact the Long Beach Police Homicide Detail at (562) 570-7244. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2380,http://www.longbeach.gov/police/press-releases/undetermined-death-investigation-1-/,Media Bulletins,Agency-Published Resources,UNDETERMINED DEATH INVESTIGATION(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/8/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: UNDETERMINED DEATH INVESTIGATION Contact: Media Relations Detail (562) 570-5273 VIEW RELATED NEWS RELEASE On Friday, July 8, 2016, at approximately 4:05 a.m., Long Beach Police were dispatched to assist Long Beach Fire Department personnel with a fire involving a recreational vehicle, in the 900 block of Loma Vista Drive. Upon arrival, Fire Department personnel found an adult victim inside the vehicle and determined the individual deceased at the scene. Long Beach Homicide detectives and Arson investigators also responded. Their investigation is active and ongoing. The Los Angeles County Coroner will determine cause of death and make positive identification. Anyone with information regarding this incident is urged to call Homicide Detectives Mark Mattia and Shea Robertson at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/8/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: UNDETERMINED DEATH INVESTIGATION Contact: Media Relations Detail (562) 570-5273 VIEW RELATED NEWS RELEASE On Friday, July 8, 2016, at approximately 4:05 a.m., Long Beach Police were dispatched to assist Long Beach Fire Department personnel with a fire involving a recreational vehicle, in the 900 block of Loma Vista Drive. Upon arrival, Fire Department personnel found an adult victim inside the vehicle and determined the individual deceased at the scene. Long Beach Homicide detectives and Arson investigators also responded. Their investigation is active and ongoing. The Los Angeles County Coroner will determine cause of death and make positive identification. Anyone with information regarding this incident is urged to call Homicide Detectives Mark Mattia and Shea Robertson at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ A- A A+ A- A A+ A- A A+ A- A A+ " -2381,http://www.longbeach.gov/police/press-releases/traffic-fatality-clark-and-eagle/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY CLARK AND EAGLE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/21/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: TRAFFIC FATALITY CLARK AND EAGLE Contact: Media Relations Detail (562) 570-5273 On Saturday, May 20, 2017, at approximately 2:40 am, officers were dispatched to Clark Avenue and Eagle Street regarding a traffic collision between a vehicle and a utility pole, which resulted in the death of one of the passengers. When officers arrived on scene, they discovered two passengers inside the vehicle. One of the passengers was unconscious and officers pulled the passenger out of the vehicle and administered CPR until paramedics arrived. Long Beach Fire Department Paramedics responded and determined the passenger deceased. The other passenger was injured and was transported to Memorial Hospital. The preliminary investigation revealed that the 2000 Toyota Avalon was traveling north on Clark Avenue when it veered off the roadway and hit a utility pole just north of Eagle Street. A male subject was found walking away from the scene a few blocks north of the accident. The male subject was detained and a witness was able to identify him as the driver. One of the passengers, a 24-year old resident of Long Beach, suffered a broken leg and Long Beach Paramedics transported him to a local hospital. The deceased passenger was identified as a 31-year old male resident of Seal Beach. The identity of the decedent is being withheld until the next of kin has been notified by the Los Angeles Coroner’s Office. The driver a 24-year-old resident of Lakewood, was transported to a local hospital with serious injuries. The driver was also found to be under the influence and was admitted to the hospital. The driver faces multiple charges, including vehicular manslaughter while intoxicated, felony hit and run and felony driving under the influence. Anyone who may have information regarding this incident is asked to call Long Beach Police Department Collision Investigation Detail Detective Brian Watt at (562) 570-7355. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2382,http://www.longbeach.gov/police/press-releases/murder-5400-block-atlantic/,Media Bulletins,Agency-Published Resources,MURDER 5400 BLOCK ATLANTIC,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/15/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Wednesday, September 14, 2016, at approximately 4:35 p.m., Long Beach Police were dispatched to shots heard in the area of the 5400 block of Atlantic Avenue, which resulted in the death of a male adult. Arriving officers located two victims who sustained gunshot injuries. Long Beach Fire Department personnel transported a female adult victim, with what appeared to be non-life threatening injuries, to a local hospital. Fire Department personnel also determined a male adult victim deceased at the scene. The Los Angeles County Coroner will make positive identification and notify next of kin. About 7:45 p.m., through the combined efforts of detectives, patrol officers, and communications operators, the suspect was located in the area of Lime Avenue and South Street. The suspect was confronted by detectives, complied with lawful orders, and was taken into custody without incident. Sotero Monteon, 61 years old and a resident of Long Beach, was booked for murder, felon in possession of a firearm, and outstanding warrants. He is being held at Long Beach City Jail with bail set at over $2,000,000. A motive for the shooting is unknown and the investigation remains ongoing. Anyone with information regarding this incident is asked to contact Long Beach Police Homicide Detectives Peter Lackovic, Sean Irving, and Oscar Valenzuela at (562) 570-7244. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.LACrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2384,http://www.longbeach.gov/police/press-releases/undetermined-deaths-do-not-appear-related/,Media Bulletins,Agency-Published Resources,Undetermined Deaths Do Not Appear Related,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/5/2016 FOR IMMEDIATE RELEASE Press Release # Subject: UNDETERMINED DEATHS DO NOT APPEAR RELATED Contact: Media Relations Detail (562) 570-5273 On Monday, December 5, 2016, at approximately 5:50 a.m., officers were dispatched to the 5400 block of E. Ocean Boulevard regarding the deceased body of a male adult, which led to the finding of a deceased female adult in a vehicle nearby. When officers arrived, they located the body of a 43-year-old male on the sand near the shoreline, who had sustained a gunshot wound to his upper body. As officers were investigating this incident, they located the body of a 49-year-old female inside a blue Ford Explorer, which was parked at the south curb of Ocean Boulevard. Not knowing if the incidents were related, two independent investigations were launched, and the Los Angeles County Coroner’s Office responded to assist Homicide detectives with both cases. Based on the preliminary findings, the investigators do not believe there is any connection between these two cases, however, the investigations continue. It appears the male subject may have died from a self-inflicted gunshot wound. Long Beach Search & Rescue responded and conducted a land search of the area around where the body was found. Due to his body being found close to the shoreline, the LBPD Port Police Dive Team also responded and conducted a grid search of the nearby water, however, no firearm was located by either team. In relation to the female, it appears she may have died of natural causes. There were no obvious signs of trauma to her body, and she was in an extreme state of poor health. Detectives believe she may have been homeless and living out of her vehicle. The LA County Coroner’s Office will release the victims’ identities pending notification of next of kin, and will also determine official causes of death. Anyone with information regarding the male subject should contact L.B.P.D. Homicide Detectives Scott Lasch and Michael Hubbard. Anyone with information regarding the female subject should contact Detectives Teryl Hubert and Benjamin Vargas. The detectives can be reached at (562) 570-7244. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2385,http://www.longbeach.gov/police/press-releases/murder-investigation---800-block-of-alamitos-avenue/,Media Bulletins,Agency-Published Resources,MURDER INVESTIGATION - 800 BLOCK OF ALAMITOS AVENUE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/19/2019 FOR IMMEDIATE RELEASE Press Release # Subject: *UPDATE* MURDER SUSPECT ARRESTED Contact: Media Relations Details (562) 570-5273 LBPDMediaRelations@longbeach.gov Update 4/19/19: On February 19, 2019, homicide detectives presented their case for filing consideration to the Los Angeles County District Attorney’s Office. After reviewing the case, a murder charge was filed and an arrest warrant was issued for 46-year-old Cleveland Rogers of Compton. Detectives believe Rogers was involved in a dispute with Haller, which escalated to the violent physical assault on Haller. On April 18, 2019, members of the United States Marshals Service Fugitive Task Force located and arrested Rogers in the 3300 block of Atlantic Avenue. Rogers was booked for murder and various outstanding warrants. He is currently being held on $2,062,461 bail. Original News Release Published on 2/12/19: On February 5, 2019, at approximately 9:00 p.m., patrol officers were dispatched to the 800 block of Alamitos Avenue regarding a battery incident where the victim reported being physically attacked by a male adult. When officers arrived, they located 66-year-old Lewis Haller of Long Beach, with injuries to his upper torso. Long Beach Fire Department personnel responded and treated the victim on scene. On February 6, 2019, officers were dispatched to a local hospital regarding a victim of an assault with a deadly weapon who had self-transported to the hospital. Officers identified him as victim Haller from the battery incident from the previous night. Due to the severity of the injuries, homicide detectives were called out to initiate an investigation. Further investigation found that Haller was attacked when he confronted the suspect who was trespassing his residence . The suspect then fled the scene prior to officer’s arrival. On February 12, 2019, the Long Beach Police Department received notification that victim Haller was pronounced deceased due to the injuries sustained on February 5th. Witnesses described the suspect as a male black in his 40’s, approximately 6’0, large build, and wearing a light-colored top, with dark jeans and shoes. The investigation remains on-going. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detectives Michael Hubbard and Adrian Garcia at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2386,http://www.longbeach.gov/globalassets/police/media-library/images/press-releases/2016/thumb_halloween---kids-in-costume.png,Poor Data Source,Poor Data Source,City of Long Beach,"",200,City of Long Beach,[],"[""Page Not Found""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[],"" -2387,http://www.longbeach.gov/police/press-releases/missing-person---kylexia-newman/,Media Bulletins,Agency-Published Resources,MISSING PERSON - KYLEXIA NEWMAN,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/2/2019 FOR IMMEDIATE RELEASE Press Release # Subject: *UPDATE* LOCATED MISSING PERSON- KYLEXIA NEWMAN Contact: LBPD Media Relations (562) 570-5273 LBPDMediaRelations@longbeach.gov Update: On Monday, July 1, 2019, at approximately 2:00 p.m., critical missing person Kylexia Newman was located by her family in the City of Los Angeles. Original News Relase 6/21/19: CLICK ON IMAGE TO ENLARGE The Long Beach Police Department (LBPD) is seeking the public’s help with locating missing person Kylexia Newman, who was last seen the morning of June 16, 2019 when she left her residence without notifying anyone. It is believed that Newman was in the area of 2100 N. Long Beach Boulevard in Compton as of June 18, 2019. The Missing Person is described as follows: Age: 16-years-old Gender: Female Race: Black Height: 5’7” Weight: 244 lbs Hair: Brown Eyes: Brown Clothing: Gold shirt with black stripes and black pants Scars/Marks/Tattoos: Four burn marks on left forearm Jewelry: None Visible Dental Work: None Medical Alerts: Suffers from medical condition(s) and may become disoriented Anyone with information regarding this missing person is urged to call the LBPD Missing Persons Detail at (562) 570-7246 or Police Dispatch at (562) 435-6711. Anyone wishing to remain anonymous may submit a tip through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2388,http://www.longbeach.gov/police/press-releases/dui-checkpoint-proves-effective-1-/,Media Bulletins,Agency-Published Resources,DUI CHECKPOINT PROVES EFFECTIVE(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/8/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: DUI CHECKPOINT PROVES EFFECTIVE Contact: Media Relations Detail (562) 570-5273 On Saturday, September 6, 2014, the Long Beach Police Department’s Traffic Section conducted a Driving Under the Influence/Driver License Checkpoint on Artesia Boulevard east of Cherry Avenue, from 7 p.m. until 3 a.m. During the eight-hour operation, which was aided by Long Beach Police Reserves, Long Beach Police Explorers, and Long Beach Search and Rescue, 475 vehicles passed through the checkpoint with 296 drivers being screened, and resulted in the following statistics: Five (5) Standardized Field Sobriety Tests conducted Two (2) drivers arrested for DUI One (1) driver arrested for a misdemeanor warrant Nine (9) drivers cited for unlicensed driving Four (4) drivers cited for suspended license Six (6) drivers cited for unsafe driving Driving Under the Influence checkpoints are a vital component in the fight against both impaired and unlicensed driving. Nationally, impaired driving caused by alcohol and/or drugs causes one death every 33 minutes. The average American has a 30% chance of being killed or injured by a driver under the influence. Sobriety checkpoints have been proven to reduce these types of driving-related collisions by removing such drivers from our streets. Funding for this program was provided by a grant from the California Office of Traffic Safety, through the National Highway Safety Administration. For further information, contact Traffic Section Lieutenant Kris Klein at (562) 570-7292. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2390,http://www.longbeach.gov/police/press-releases/felony-robbery-suspect-arrested/,Media Bulletins,Agency-Published Resources,FELONY ROBBERY SUSPECT ARRESTED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/7/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: FELONY ROBBERY SUSPECT ARRESTED Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department has arrested a suspect in connection with two robberies in the Cities of Long Beach and Arcadia On April 20, 2015, a male suspect armed with a handgun entered a hotel lobby in the 4100 block of East Willow Avenue in Long Beach and demanded money from the hotel clerk. Approximately an hour and a half later, a male suspect entered a hotel in the 100 block of North Second Avenue, in the City of Arcadia, and also demanded money from the hotel clerk. The suspect, in both incidents, was seen fleeing the location in a silver colored passenger vehicle. Cash was taken in both instances, but fortunately no employees were injured in either incident. When L.B.P.D. Robbery detectives investigating the Long Beach incident learned of the similarities of the Arcadia robbery, they made contact with the Arcadia Police Department. Based on the suspect's physical description, the vehicle description, and the manner in which the crimes were carried out, it was believed the same person was responsible for both robberies. During the course of the investigation, L.B.P.D. detectives, with the assistance of Arcadia Police detectives, identified 22-year-old Joseph Casey of Los Angeles, as the suspect wanted in connection with the robberies. The Los Angeles County District Attorney’s Office filed one count of robbery against Joseph Casey for the Arcadia incident, and issued a warrant for his arrest. On May 4, 2015, L.B.P.D. Robbery detectives served a search warrant at Casey’s Los Angeles residence and arrested him. A vehicle and additional evidence believed to be connected to both robberies was located at his home. Suspect Casey was booked for the robbery warrant and for a parole violation. He is currently being held at Los Angeles County’s Men’s Central Jail without bail, and pending his next court date. L.B.P.D. detectives will be presenting the Long Beach robbery case to the Los Angeles County District Attorney’s Office for formal filing next week. Anyone who may have information regarding these incidents is asked to contact Long Beach Police Robbery Detective Fermin Gonzalez at (562) 570-7068. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2391,http://www.longbeach.gov/police/press-releases/two-arrested---charged-in-two-shootings/,Media Bulletins,Agency-Published Resources,Two Arrested & Charged in Two Shootings,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2392,http://www.longbeach.gov/police/press-releases/---located---missing-3-week-old-infant-found-deceased-in-san-diego-county/,Media Bulletins,Agency-Published Resources,---LOCATED---MISSING 3-WEEK-OLD INFANT FOUND DECEASED IN SAN DIEGO COUNTY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2393,http://www.longbeach.gov/police/press-releases/murder-1300-block-wesley-dr/,Media Bulletins,Agency-Published Resources,Murder 1300 block Wesley Dr,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/25/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 UPDATE: On January 27, 2017, detectives made an arrest in the January 25th murder of Daniel Sevilla a 21 year-old resident of Long Beach. The incident occurred in the 1300 block of Wesley Drive. The suspect has been identified as 19 year-old Brandon Parker a resident of Compton. On January 31st, Homicide detectives presented their case to the LA County District Attorney for filing consideration. The DA’s office subsequently charged Parker with one count of murder, and one count of robbery, with special circumstances enhancement. Parker is being held in Los Angeles County Jail without bail. On Wednesday, January 25, 2017, at approximately 2:19 a.m., Long Beach Police were dispatched to investigate a possible shooting in the 1300 block of Wesley Drive. Arriving officers found a male adult with apparent gunshot injuries and immediately initiated life-saving measures (CPR). Long Beach Fire Department personnel subsequently determined the victim deceased at the scene. The suspect(s) fled the scene before officers arrived. Homicide detectives responded to begin their investigation. A motive is yet to be determined, however at this point, the incident does not appear to be random. The Los Angeles County Coroner will positively identify the victim and notify next of kin. The investigation remains ongoing. Anyone with information regarding this incident is urged to call Homicide Detectives Sean Irving and Benjamin Vargas at (562) 570-7244. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2394,http://www.longbeach.gov/police/press-releases/fatality-7-/,Media Bulletins,Agency-Published Resources,FATALITY(7),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2395,http://www.longbeach.gov/police/press-releases/publics-help-sought-in-locating-hit--run-suspect/,Media Bulletins,Agency-Published Resources,PUBLIC'S HELP SOUGHT IN LOCATING HIT & RUN SUSPECT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/21/2017 FOR IMMEDIATE RELEASE Press Release # Subject: PUBLIC'S HELP SOUGHT IN LOCATING HIT & RUN SUSPECT Contact: Media Relations Detail (562) 570-5273 Suspect Victor Garcia or Gracia CLICK TO VIEW VIDEO The Long Beach Police Department is asking for the public’s help in locating the individual wanted in connection with a hit and run collision, which left the victim in critical condition. On August 30, 2017, at approximately 1:40 p.m., officers were dispatched to the area of Anaheim Street and Oregon Avenue regarding an injury hit and run collision. Officers arrived and discovered that a vehicle, described as a dark colored SUV, was travelling westbound on Anaheim Street when it hit the north curb and lost control, striking the victim. The victim, identified as 23-year-old Luis Enrique Tejeda of Long Beach, was riding his skateboard westbound on Anaheim Street, and was crossing Oregon Avenue in the crosswalk at the time he was struck. According to witness statements, the vehicle immediately fled the scene after the collision, heading westbound on Anaheim Street. One witness followed the SUV and was able to obtain a license plate number. The vehicle, identified as a 2004 black Chevy Tahoe, was located a few blocks from the collision scene shortly thereafter, and impounded. Through the course of the investigation, it was determined the vehicle had been recently purchased, and the suspect has been identified as follows: Victor Garcia or Gracia Possibly from Cudahy or Southgate area Approx. 25-35 years-old, 5’7” to 5’8” tall, 130 lbs., with black hair Victim Tejeda remains hospitalized and in critical condition. Anyone with information regarding the suspect’s whereabouts is urged to contact L.B.P.D. Collision Investigation Detective Sirilo Garcia at (562) 570-7132. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2397,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-proves-effective-1-/,Media Bulletins,Agency-Published Resources,DUI SATURATION PATROL PROVES EFFECTIVE(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/16/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: DUI SATURATION PATROL PROVES EFFECTIVE Contact: Media Relations Detail (562) 570-5273 On Saturday, June 14, 2014, the Long Beach Police Department’s Traffic Section conducted a Driving Under the Influence (DUI) Saturation Patrol from 7:00 p.m. until 3:00 a.m. During the eight-hour operation, motor officers patrolled throughout the city looking for impaired drivers and took the following enforcement actions: Conducted fifty-three (53) enforcement stops Conducted sixteen (16) Standardized Field Sobriety Tests Made Six (6) DUI arrests Issued three (3) misdemeanor citations to drivers having a suspended license Impounded three (3) vehicles for drivers having a suspended license After falling dramatically for five straight years, figures for 2012 showed an increase to 802 deaths in California because someone failed to designate a sober driver. Over the course of the past three years in Long Beach, DUI collisions have claimed nine lives and resulted in 315 injury crashes, harming 420 of our friends and neighbors. Driving under the influence can impact the economy in addition to the pain and suffering of those immediately affected. Conservatively, a fatality has a $1.4 million impact, an injury $70,000, and a crash that only damages property averages nearly $9000. Funding for this program is from a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration. Report Drunk Drivers, Call 9-1-1! This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2398,http://www.longbeach.gov/police/press-releases/robbery-suspects-arrested-1-/,Media Bulletins,Agency-Published Resources,robbery suspects arrested(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/22/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: ROBBERY SUSPECTS ARRESTED & CHARGED Contact: Media Relations Detail (562) 570-5273 On April 21, 2016, multiple felony charges were filed against four 19-year-old suspects for their involvement in a street robbery. On Monday, April 18, 2016, about 1:15 p.m., the victim was walking in the 100 block of East Pacific Coast Highway when four suspects approached by him. The four encircled the victim, demanded his property, took his necklace, and immediately fled. Fortunately, the victim was not injured during the robbery. Patrol officers and detectives were in the vicinity and arrested the four suspects. During the investigation, detectives recovered a necklace and handguns. The case was presented to the Los Angeles County District Attorney’s Office for filing consideration. Each of the four was charged with robbery, use of a firearm during the commission of a crime, and participating in a criminal street gang. Three remain in Long Beach City Jail as follows: Joseph Erin Baldwin, 19, of Long Beach, bail set at $165,000 Corey Dayvon Leytham, 19, of Buena Park, bail set at $140,000 Alexander Ortiz Jr., 19, of Long Beach, bail set at $140,000 Casey Willard, 19, of Long Beach, posted bail and was released Arraignment of the three defendants who remain in custody is scheduled at Long Beach Superior Court, Department 1, on April 22, 2016. Arraignment for Defendant Willard is scheduled at Long Beach Superior Court, Department 1, on May 11, 2016. Anyone who may have witnessed this incident is asked to contact Robbery Detective Gonzalez at (562) 570-7068. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . The Robbery Detail would like to remind everyone to remain aware of your surroundings at all times and report suspicious activity by calling 9-1-1. For weekly crime prevention tips, follow @LBPDrobbery on Twitter. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2399,http://www.longbeach.gov/police/press-releases/murder-1300-block-of-pine/,Media Bulletins,Agency-Published Resources,MURDER 1300 BLOCK OF PINE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/12/2018 FOR IMMEDIATE RELEASE Press Release # Subject: ARREST MADE IN MURDER 1300 BLOCK OF PINE Contact: Media Relations Detail (562) 570-5273 UPDATE: On Saturday, June 9, 2018, Detectives arrested 59 year-old Long Beach resident Nestor Guyal Tendido, for the murder of 58 year-old Kelly Paul Miller. Tendido was arrested in the City of Long Beach in the area of Willow and Pacific. The case was presented to the DA’s office and Tendido was charged with one count of murder.  The suspect is scheduled to be arraigned this afternoon. On June 3, 2018 at approximately 2:05 AM, officers were dispatched to the 1300 block of Pine Avenue to assist Long Beach Fire who was en route to a call of a male adult suffering from a possible stabbing. Upon arrival officers found that paramedics had determined the victim deceased at the scene. Officers initial investigation found the victim was involved in a physical altercation and received a traumatic wound to the upper torso, but the cause of that injury is still to be determined. Homicide detectives responded and are handling the investigation. No arrests have been made. The Los Angeles County Coroner’s Office responded and will determine the victim's cause of death and make a positive identification. Anyone with information regarding this incident is urged to call homicide Detectives Oscar Valenzuela and Shea Robertson at (562) 570-7244. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 TIPS” app to your smart phone (available at the Apple App store and Google Play), or visiting www.LACrimeStoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2400,http://www.longbeach.gov/police/press-releases/murder-28-/,Media Bulletins,Agency-Published Resources,MURDER(28),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/4/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Saturday, July 4, 2015, around 5:27 a.m., Long Beach Police were dispatched to the area of East Anaheim Street and Dawson Avenue to assist Long Beach Fire Department personnel with an unresponsive subject who appeared to have sustained a stab injury. Long Beach paramedics determined the male adult deceased at the scene. At this time, the victim is not being identified pending notification of next of kin by the Los Angeles County Coroner. The preliminary investigation leads investigators to believe the victim is homeless. No suspect information is available, a motive is unknown, and the investigation remains ongoing. Anyone with information regarding this incident is urged to call Long Beach Police Homicide Detectives Scott Lasch and Michael Hubbard at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2401,http://www.longbeach.gov/attorney/press-releases/court-dismisses-lawsuits-by-two-long-beach-police-officers-against-the-city-of-long-beach/,Media Bulletins,Agency-Published Resources,Court Dismisses Lawsuits by Two Long Beach Police Officers Against the City of Long Beach,"",200,City of Long Beach,"[""Charles Parkin Long Beach City Attorney""]",[],[],[],[],[],"A- A A+ Charles Parkin Long Beach City Attorney 411 West Ocean Blvd., 9 th Floor Long Beach, California 90802-4664 cityattorney@longbeach.gov 4/14/2016 FOR IMMEDIATE RELEASE Press Release # 014 Subject: Court Dismisses Lawsuits by Two Long Beach Police Officers Against the City of Long Beach Contact: Haleh R. Jenkins Deputy City Attorney (562) 570-2270 haleh.jenkins@longbeach.gov A Los Angeles Superior Court Judge today dismissed the lawsuits of two Long Beach police officers who alleged that the police department carried on a campaign of retaliation against them. Superior Court Judge Michael P. Linfield granted the City Attorney’s pretrial summary judgment motion, finding that no trial was necessary since no evidence supported any of the Plaintiffs’ claims. The Judge ordered judgment for the City. “We are pleased that the Court, after review of the motions and allegations, agreed with our position that there was no evidence to support their claims,” said Long Beach City Attorney, Charles Parkin. “This ruling at the summary judgment stage will save the City significant costs of trial.” Officers Alberto Vargas and Pablo Orduno filed lawsuits against the City’s police department claiming that the police department discriminated against them because of their ethnicity. After filing their lawsuits, Vargas and Orduno both voluntarily dismissed the discrimination claim, and proceeded on their claim that the police department was actively retaliating against them for, among other reasons, filing the original discrimination lawsuit. In their amended lawsuits, Vargas and Orduno contested an order requiring them to wear a recording device for a period of time, claimed that, at various times, they reported alleged time card fraud, and maintained that the department required each officer to write a specific number of traffic tickets. The Plaintiffs’ also alleged that the department retaliated against them because they were “whistleblowers.” The Long Beach Police Department denied all of these allegations. Specifically, that the Department’s Internal Affairs Division investigated the Plaintiffs’ claims and found no evidence supporting any of their allegations. Similarly, the trial court judge examined all of Vargas and Orduno’s various allegations, and specifically found no evidence supporting any of their claims. The Court rejected each plaintiff’s contention that the police department had acted wrongfully in any regard, and entered judgment in favor of the City of Long Beach and against the officers. Since the City is the prevailing party in this action, California Law requires the Plaintiffs to pay a portion of the City’s costs of suit. For more news, pictures, videos and announcements of what’s happening in Long Beach, ‘Like’ us on Facebook at www.facebook.com/CityofLongBeachCA " -2402,http://www.longbeach.gov/police/press-releases/fatality-3-/,Media Bulletins,Agency-Published Resources,FATALITY(3),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/25/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: FATALITY Contact: Media Relations (562) 570-5273 On Tuesday, February 24, 2015, at 6:27 P.M., Long Beach Police responded to the Gerald Desmond Bridge regarding an injury traffic collision.  When officers arrived they discovered a 2003 Suzuki GSXR 1000 motorcycle with two riders had collided with the wall on the overpass from eastbound Ocean Boulevard to the northbound 710 Freeway. The investigation revealed the motorcycle driver and passenger were traveling eastbound on Ocean Boulevard over the Gerald Desmond Bridge at a high rate of speed.  The driver took the northbound 710 Freeway overpass where he was unable to maintain control of the motorcycle and collided with the wall on their right side.  The collision ejected both riders off the motorcycle and over the wall of the overpass onto Ocean Boulevard. The driver came to rest on the shoulder of the westbound lanes of Ocean Boulevard.  The passenger fell on the eastbound lanes of Ocean Boulevard and was immediately struck by a 1994 Jeep Grand Cherokee that was traveling eastbound. The motorcycle came to rest on the overpass approximately 620 feet past where the riders were ejected. The driver of the motorcycle was identified as a 20-year-old male resident of Anaheim. The driver was transported to a local hospital where he is in critical condition.  The driver had a valid license to drive a motorcycle and current insurance. The female passenger was identified as a 19-year-old female resident of Anaheim. The passenger was pronounced deceased at the scene. Identities are being withheld at this time pending notification of next of kin. The driver of the Jeep Grand Cherokee was identified as a 68-year-old male resident of Long Beach, who did not sustain any injuries. Anyone who may have information regarding this incident is urged to contact the Long Beach Police Department Collision Investigation Detail, Detective Brian Watt at (562) 570-5520. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2403,http://www.longbeach.gov/police/press-releases/police-impersonator/,Media Bulletins,Agency-Published Resources,Police Impersonator,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/25/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: SAFETY AWARENESS - POLICE IMPERSONATOR IN SOUTH BAY AREA Contact: Media Relations Detail (562) 570-5273 Similar Vehicles Driven by Suspect Carter On February 23, 2016, at approximately 9:00 a.m., detectives from the Drug Investigations Section with the assistance of the FBI served a search warrant at a Rolling Hills Estates residence looking for a suspect wanted for impersonating a police officer. The suspect was identified as 42 year-old Jayson Paul Carter and he was arrested at the residence. Detectives recovered evidence consisting of false identifications representing state and federal law enforcement agencies. He was booked into the Long Beach Jail for impersonating a police officer and carrying a concealed loaded firearm. His bail was set at $35,000 and he posted bond later that day. Although police are not aware of any individuals the suspect  had contact with, detectives believe victims may exist and are urging  anyone who may have been detained by Carter, to come forward. Based on the investigation, detectives believe Carter may have contacted individuals within San Diego and Los Angeles Counties, as well as the Northern California area. The attached photographs are of similar vehicles that Carter has been known to drive. Anyone with additional information is urged to call Detective Dylan Lobascio at 562-570-7221. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2404,http://www.longbeach.gov/police/press-releases/publics-help-needed-to-identify-robbery-suspects/,Media Bulletins,Agency-Published Resources,PUBLIC’S HELP NEEDED TO IDENTIFY ROBBERY SUSPECTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2405,http://www.longbeach.gov/police/press-releases/traffic-fatality---ocean-blvd-and-ca-47/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY - OCEAN BLVD AND CA-47,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/14/2018 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY - OCEAN BLVD AND CA-47 Contact: Media Relations Detail (562) 570 -5273 On December 13, 2018, at approximately 7:50 p.m., officers were dispatched to Ocean Boulevard east of CA-47 regarding a collision between a motorcycle and a vehicle, which resulted in the death of a male adult. Once officers arrived they located a 58-year-old male resident of Huntington Beach lying in the westbound roadway of Ocean Boulevard. The subject was identified as the motorcyclist involved in the collision who was riding a 2002 Triumph America. Long Beach Fire personnel responded to the scene and determined the motorcyclist deceased. The motorcyclist's identification is being withheld pending notification of the next of kin. The preliminary investigation revealed the collision occurred when the motorcyclist was possibly riding at a high rate of speed east on Ocean Boulevard past CA-47 and collided with the back of the Acura, which was also traveling eastbound. The collision threw the motorcyclist into one of the westbound lanes of traffic where he appeared to be struck by two different westbound motorists. Neither of the westbound motorists remained on scene. Their vehicles are described as a dark-colored possible SUV and a silver pickup truck. Officers also contacted a 33-year-old female resident of Long Beach and was identified as the driver of a 2008 Acura TL involved in the collision. She remained on scene, cooperated with the investigation, and alcohol and drugs are not being considered as factors in the collision for this motorist. The investigation is ongoing and detectives are attempting to get further information regarding the vehicles that fled the scene. Anyone who may information regarding this incident is asked to call Long Beach Police Department Collision Investigation Detail Detective David Whelan at (562) 570-7355. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2406,http://www.longbeach.gov/police/press-releases/arrest-made-in-sexual-assault-case-1-/,Media Bulletins,Agency-Published Resources,ARREST MADE IN SEXUAL ASSAULT CASE(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/10/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: ARREST MADE IN SEXUAL ASSAULT CASE Contact: Media Relations Detail (562) 570-5273 Long Beach Police arrested a male suspect in connection with a sexual assault that occurred in the area of Falcon Avenue and East Ocean Boulevard, and charges have been filed. On September 7, 2014, around 5:00 a.m., an adult female victim reported that an intruder entered her residence through an open window and sexually assaulted her. Officers and detectives immediately initiated an investigation and worked together to identify the suspect. On September 10, 2014, detectives located and arrested 28-year-old Detrick Paul Richmond of Hawthorne, at a residence in the City of Hawthorne. LBPD Sexual Assault Investigation Detectives presented the case to the Los Angeles District Attorney's office for filing consideration. The District Attorney’s Office filed 10 counts of sexual assault, assault with a deadly weapon, and burglary related charges. Richmond is currently being held on $5,000,000 bail in Long Beach City Jail. Anyone with information regarding this crime is asked to contact Long Beach Detective Luis Galvan at (562) 570-6407. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . The Long Beach Police Department would like to encourage community members to practice the following safety tips: Keep your doors locked and windows secure at all times, even in warmer weather Meet your neighbors, this makes it easier to recognize a person that doesn’t belong, and neighbors that communicate are more likely to look out for one another Report loiterers – loitering is often a precursor activity for burglars, enabling them to case the area Immediately report suspicious activity by calling 9-1-1, and provide a description of any subjects or vehicles. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2407,http://www.longbeach.gov/police/press-releases/body-found-1000-block-of-w--carson-street/,Media Bulletins,Agency-Published Resources,BODY FOUND 1000 BLOCK OF W. CARSON STREET,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/6/2016 FOR IMMEDIATE RELEASE Press Release # Subject: ***UPDATE*** - BODY FOUND 1000 BLOCK OF W. CARSON STREET Contact: Media Relations Detail (562) 570-5273 UPDATE (12/14/16) - SUSPECT ARRESTED; MURDER CHARGES FILED On Wednesday, December 14, 2016, Long Beach Police Homicide detectives filed murder charges against a suspect wanted in connection with the murder of a 29- year-old woman identified as Samantha Lang of Signal Hill. When officers located Victim Lang’s vehicle on December 5, 2016, it had been found abandoned and vandalized at the bottom of the flood control basin near the 1000 block of W. Carson Street. Her body was later located when officers returned to the area and conducted an extensive search. During the course of their investigation, detectives obtained information that led them to the victim’s ex-boyfriend, identified as 41-year-old Justin James Johnson of Signal Hill. Suspect Johnson was arrested by L.B.P.D. detectives on 12/9/16 in the City of Los Angeles. Today, detectives presented their case to the Los Angeles County District Attorney’s Office, who filed one count of murder against Johnson. He was arraigned this afternoon in Long Beach Superior Court, and will be subsequently held at LA County Men’s Jail without bail. ORIGINAL NEWS RELEASE (12/6/16) On December 5, 2016, at approximately 10:35 am, officers were dispatched to the 1000 block of W. Carson St. regarding a suspicious vehicle in a flood control basin adjacent to the LA River. Further investigation by officers led to the incident be handled as a critical missing when the registered owner of the vehicle could not be located. During the critical missing investigation officers returned to the 1000 block of W. Carson St. to conduct a thorough search of the area and at approximately 1:30 am on December 6, 2016, officers found the body of a deceased female adult. Homicide detectives responded, conducted their investigation and believe the deceased may be the registered owner of the vehicle. Positive identification and cause of death will be done by the Los Angeles County Coroner’s Office. Anyone with information regarding this incident is urged to call Homicide Detectives Teryl Hubert, Scott Lasch, Michael Hubbard, or Ben Vargas at (562) 570-7244. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2408,http://www.longbeach.gov/police/press-releases/three-arrested-and-charged-with-murder/,Media Bulletins,Agency-Published Resources,THREE ARRESTED AND CHARGED WITH MURDER,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2409,http://www.longbeach.gov/police/press-releases/l.b.p.d-announces-appointment-of-new-commander/,Media Bulletins,Agency-Published Resources,L.B.P.D ANNOUNCES APPOINTMENT OF NEW COMMANDER & CHANGES IN COMMAND STAFF ASSIGNMENTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/24/2018 FOR IMMEDIATE RELEASE Press Release # Subject: L.B.P.D ANNOUNCES APPOINTMENT OF NEW COMMANDER & CHANGES IN COMMAND STAFF ASSIGNMENTS Contact: Media Relations Detail (562) 570-5273 Lieutenant Patrick O'Dowd Long Beach Police Chief Robert Luna has selected Lieutenant Patrick O’Dowd, a 25-year veteran of the Police Department, for promotion to the rank of Commander. Lieutenant O’Dowd began his career with the Police Department in January 1993 as a Clerk Typist in the Records Division.  He was promoted to Records Supervisor where he worked until being hired as a Police Recruit in 1995. He promoted to Sergeant in January 2011 and to Lieutenant in September 2015. Lieutenant O’Dowd has worked a variety of assignments throughout his career, including Patrol, Special Enforcement Section, Gang Detail, Financial Crimes, Homicide and Internal Affairs.  His most recent assignment has been as the Administrative Lieutenant in the Patrol Bureau. Lieutenant O’Dowd holds both a Bachelor of Science and Master of Science Degrees in Business Administration and Finance from California State University, Long Beach.  Lt. O’Dowd will be assigned as the Commander of the East Division. Additionally, Chief Luna has announced command staff assignment changes that will become effective on Saturday, August 4, 2018. Commanders typically rotate every few years to provide them with increased opportunities for career development and community engagement.  The new commander assignments are as follows: Commander Erik Herzog will be transferring from the East Division to the Office of the Chief of Police, where he will serve as the Chief of Staff. Commander Paul LeBaron will be temporarily assigned to the Investigations Bureau as the Commander of the Detective Division. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2410,http://www.longbeach.gov/police/press-releases/police-seek-public-s-help-to-identify-burglary-suspect/,Media Bulletins,Agency-Published Resources,POLICE SEEK PUBLIC'S HELP TO IDENTIFY BURGLARY SUSPECT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/15/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: POLICE SEEK PUBLIC'S HELP TO IDENTIFY BURGLARY SUSPECT Contact: Media Relations Detail (562) 570-5273 (Click on a Photo to Enlarge) View Video **UPDATE** On 1/20/15, after seeing himself in the news, the suspect wanted in connection with several laundry-room burglaries in Long Beach turned himself in.  The suspect, identified as 35-year-old Felipe Felix of Long Beach, walked into the lobby of Long Beach Police Headquarters and surrendered.  He was booked for burglary and is being held at the Long Beach City Jail on $50,000 bail.  His case will be presented to the Los Angeles County District Attorney's Office this week. Original News Release: The Long Beach Police Department is asking for the public’s help in identifying a suspect wanted in connection with laundry room burglaries where the suspect removed coins from laundry machine coin boxes. Detectives believe, based on similar circumstances, that the suspect was involved in multiple burglaries from November 2013 to January 2015. In the most recent incident, which occurred on January 3, 2015, around 9:00 a.m. in the 300 block of Gladys Avenue, a male suspect entered a multi-family residential laundry room and forced entry into a coin box in an attempt to remove the cash. In this instance, the box was empty, so the suspect left empty handed. The suspect seen on surveillance video is described as: male, Hispanic, 30-40 years old, approximately 5’7” – 5’10”, 190-210 lbs, with short black hair, brown eyes, a mustache, and a long triangular shaped nose. Anyone with information is asked to contact LBPD Burglary Detective Lorri Peck at (562) 570-7351. Anyone wishing to remain anonymous may call 1-800-222-TIP This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2411,http://www.longbeach.gov/police/press-releases/results-of-saturday-s-l-b-p-d--s-driving-under-the-influence-saturation-patrol/,Media Bulletins,Agency-Published Resources,Results of Saturday's L.B.P.D.'s Driving Under the Influence Saturation Patrol,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 8/24/2015 FOR IMMEDIATE RELEASE Press Release # Subject: L.B.P.D.'s DUI SATURATION PATROL PROVES EFFECTIVE Contact: Media Relations Detail (562) 570-5273 On Saturday August 22, 2015, the Long Beach Police Department’s Traffic Section conducted a Driving Under the Influence Saturation Patrol from 7:00 p.m. until 3:00 a.m. During the eight-hour operation, motor officers patrolled throughout the city looking for impaired drivers. During the operation, officers took the following enforcement actions: • Conducted Eighty-two (82) enforcement stops • Conducted Twenty (20) Standardized Field Sobriety Tests • Made Three (3) DUI arrests • Issued One (1) citation to an unlicensed driver • Issued Six (6) traffic citations for unsafe driving After falling dramatically for five straight years, figures for 2012 show an increase to 802 deaths in California because someone failed to designate a sober driver. Over the course of the past three years, DUI collisions have claimed 9 lives and resulted in 315 injury crashes harming 420 of our friends and neighbors. DUI can impact the economy in addition to the pain and suffering of those immediately affected. Conservatively, a fatality has a $1.4 million impact, an injury $70,000, and a crash that only damages property averages nearly $9000. Funding for this program is from a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration. Report Drunk Drivers, Call 911! This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2413,http://www.longbeach.gov/police/press-releases/traffic-fatality-2200-block-of-golden-ave/,Media Bulletins,Agency-Published Resources,Traffic Fatality (2200 block of Golden Ave),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 8/22/2017 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Monday, August 21, 2017, at 9:35 p.m., officers responded to the 2200 block of Golden Avenue regarding an injury traffic collision, which resulted in the death of a female adult. When officers arrived, they discovered a 2005 Hyundai Elantra resting on its passenger side in the middle of the road. Long Beach Fire Department personnel extricated the victim from the vehicle and transported her to a local hospital where she was pronounced deceased. The preliminary investigation indicated the Hyundai, being driven by a 72-year-old female resident of Long Beach, was traveling northbound on Golden Avenue. The Hyundai struck an unoccupied Toyota Corolla parked on the east curb at slow speed, resulting in minimal vehicular damage. The woman, who was alone in the vehicle, was not seat belted and was lying unconscious inside the vehicle. There were no witnesses to the collision. The victim’s identity is being withheld pending notification of next of kin. Anyone who may have witnessed the incident is urged to contact L.B.P.D.’s Collision Investigation Detective Steve Fox at (562) 570-7110. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2414,http://www.longbeach.gov/police/press-releases/found---critical-missing-person----1-/,Media Bulletins,Agency-Published Resources,FOUND---CRITICAL MISSING PERSON---(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/16/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: FOUND---CRITICAL MISSING PERSON--- Contact: Media Relations Detail (562) 570-5273 Victim Rios (Click on photo to enlarge) April 17, 2014 Update: Mr. Gregorio Rios, who was reported missing yesterday, April 16, 2014, returned home on his own accord, around 9:30 p.m. last night. He appeared to be unharmed and is with his family. Original News Release: The Long Beach Police Department is asking for the public’s help in locating a man who suffers from Dementia and undiagnosed Alzheimer’s. The missing man, 79-year-old Gregorio Rios, was last seen this morning, Wednesday, April 16, 2014, at 11:00 a.m. before he walked away from his residence in the 2300 block of Cedar Avenue. The Victim is described as follows: Name: Gregorio Rios Age: 79 years Gender: Male Race/Ethnicity: Hispanic Height: 5’6” Weight: 170 Clothing: Gray pants, Green shirt Scars/Marks: None Visible Dental Work: Missing teeth The Long Beach Police Department continues to search for the victim. Local hospitals have been alerted and area law enforcement and public transportation agencies have also been notified. Anyone who sees the victim or has information on his whereabouts is asked to call the Long Beach Police Department at (562) 435-6711 or 9-1-1. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2415,http://www.longbeach.gov/police/press-releases/traffic-fatality--4th---obispo-/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY (4th & Obispo),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/11/2017 FOR IMMEDIATE RELEASE Press Release # Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Sunday, September 10, 2017, at approx. 12:16 p.m., officers were dispatched to 4th Street and Obispo Avenue regarding a traffic collision involving a motorcycle, which resulted in the death of the motorcyclist. When officers arrived, they discovered a male adult subject laying in the northeast parking lot at 4th Street and Obispo Avenue, along with a motorcycle lying nearby. Long Beach Fire Department paramedics responded and determined the subject deceased at the scene. The investigation revealed the motorcycle was traveling eastbound on 4th street in the center divider, at a high rate of speed. The driver appeared to lose control of the motorcycle and clipped the back end of a 2007 Jeep Wrangler, traveling westbound on 4th street in the number one lane. It was determined the motorcyclist had recently purchased the motorcycle and did not have a motorcycle license endorsement. He is only being identified as a 47-year-old resident of Long Beach, pending notification of next of kin. The driver of the Jeep, a 20-year-old female resident of Long Beach, remained at the scene and was questioned and released. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2416,http://www.longbeach.gov/press-releases/long-beach-police-department-awarded-blue-line-security-contract/,Media Bulletins,Agency-Published Resources,Long Beach Police Department Awarded Blue Line Security Contract,"",200,City of Long Beach,"[""PRESS RELEASE""]",[],[],[],[],[],"A- A A+ PRESS RELEASE City of Long Beach Public Information Office 411 W. Ocean Blvd, Long Beach, CA 90802 2/23/2017 FOR IMMEDIATE RELEASE Press Release # CM: 022317 Subject: Long Beach Police Department Awarded Blue Line Security Contract Contact: Kerry Gerot Public Affairs Officer 562.570.6811 Kerry.Gerot@longbeach.gov The Long Beach Police Department today was awarded a $30.1 million contract over a 5-year period, to provide law enforcement services for the eight station platforms of the Blue Line that are in the City’s jurisdiction. ""Long Beach will now be able to control its own public safety destiny on the Blue Line and our eight stations,"" said Mayor Robert Garcia. ""Over the next year we will make the Blue Line safer and hire approximately 30 new police personnel to assist in this important effort.” The Los Angeles County Metropolitan Transportation Authority Board approved a New Multi-Agency Law Enforcement Contract to improve safety and security on Los Angeles County’s Metro Bus and Rail System. Mayor Garcia made the motion that passed unanimously. “We are very happy with the MTA Board’s decision to allow LBPD to be a part of the multi-agency security plan. We have a strong and unique knowledge of our community and believe that this is the best option for serving the needs of our City. Through this contract, we will be able to reduce response time to calls for service, increase law enforcement visibility, and deter crime in and around this important transportation corridor,” said Police Chief Robert Luna. “We are very grateful for this opportunity and appreciate the support we have received from our city and community leaders. We thank Sheriff McDonnell and the LASD for the service they have provided to our community and we look forward to working in partnership with them in the future.” The proposal will include a field team and an administration team of approximately 30 employees. Approximately one-third of the Blue Line runs through Long Beach. The Long Beach Police Department is committed to the philosophy of community-oriented policing, and the department is led by our strategic vision of a “Safe City for All People.” The Blue Line is an integral piece infrastructure that defines Long Beach, and the Department is looking forward to the opportunity to provide law enforcement services along the Blue Line. On February 5, 2016, the Los Angeles County Metropolitan Transportation Authority  released a Request for Proposal (RFP) for Transit Law Enforcement Services. The Long Beach Police Department submitted a proposal in response to the RFP acknowledging that this contract would enable the Department to increase law enforcement visibility and deter crime, specifically related to surface transportation. The multi-agency contract will take effect July 1, 2017. For more news, pictures, videos and announcements of what’s happening in Long Beach, follow us on Facebook , Twitter , Instagram and YouTube . " -2417,http://www.longbeach.gov/police/press-releases/murder-22-/,Media Bulletins,Agency-Published Resources,Murder(22),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/31/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Saturday, May 30, 2015, at approximately 9:05 p.m., Long Beach Police were dispatched to Lincoln Park, 151 Pacific Avenue, regarding a fight call, which resulted in the death of a male adult. Arriving officers located an individual with an apparent stab wound. Long Beach Fire Department paramedics transported the victim to a local hospital where he succumbed to his injuries. At this time, the name of the victim is not being released. The Los Angeles County Coroner’s Office will positively identify the victim and notify next of kin. A motive is unknown; however, the preliminary investigation indicates a physical altercation occurred between two male adults and one was stabbed in the torso. Phillip Lester Vargas, 51 years old and a resident of Long Beach, was booked for murder. He is being held in Long Beach City Jail on $1,000,000.00 bail. The investigation remains ongoing. Anyone with information regarding this incident is urged to call Long Beach Homicide Detectives Malcolm Evans and Mark Bigel Guarino at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2418,http://www.longbeach.gov/police/press-releases/store-clerk-struck-by-gunfire-during-robbery--public-s-help-sought-to-identify-suspect/,Media Bulletins,Agency-Published Resources,STORE CLERK STRUCK BY GUNFIRE DURING ROBBERY; PUBLIC'S HELP SOUGHT TO IDENTIFY SUSPECT,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/25/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: STORE CLERK STRUCK BY GUNFIRE DURING ROBBERY; PUBLIC'S HELP SOUGHT TO IDENTIFY SUSPECT Contact: Media Relations Detail (562) 570-5273 On Monday, March 24, 2014, around 7:50 p.m., Long Beach Police were dispatched to the area of 7th Street and Cerritos Avenue regarding an unknown trouble call, possibly involving an assault with a deadly weapon. Arriving officers determined a robbery to a business in the 1100 block of E. 7th Street occurred and the lone employee sustained a gunshot wound to the upper torso. Long Beach Fire Department paramedics transported the male adult victim, in critical condition, to a local hospital. Due to the extent of the victim’s injuries, Homicide detectives responded to the scene. Officers worked diligently throughout the night to collect evidence, review witness statements, and seek out any video surveillance that may have captured useful information. The preliminary investigation indicated a male suspect entered the mini-market, fired a weapon toward the clerk, striking him in the upper torso, and fled with an undetermined amount of cash. The suspect remains outstanding. Detectives continue to review video in an effort to develop a suspect description and the investigation remains ongoing. Anyone with information is urged to contact LBPD Homicide Detectives Scott Lasch and Donald Goodman at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2419,http://www.longbeach.gov/police/press-releases/officer-involved-shooting-4-/,Media Bulletins,Agency-Published Resources,OFFICER INVOLVED SHOOTING(4),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2420,http://www.longbeach.gov/police/press-releases/dui-enforcement-operation-planned-this-weekend/,Media Bulletins,Agency-Published Resources,DUI ENFORCEMENT OPERATION PLANNED THIS WEEKEND,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/24/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: DUI ENFORCEMENT OPERATION PLANNED THIS WEEKEND Contact: Media Relations Detail (562) 570-5273 Long Beach Police Department’s DUI Enforcement Team will deploy this weekend to stop and arrest alcohol and drug-impaired drivers in the Department’s ongoing traffic safety campaign. DUI Saturation Patrols will deploy on Saturday, December 27, 2014, between the hours of 7:00 p.m. and 3:00 a.m. in areas with high frequencies of DUI collisions and/or arrests. After falling dramatically for five straight years, figures for 2012 show an increase to 802 deaths in California because someone failed to designate a sober driver. Over the course of the past three years in Long Beach, DUI collisions have claimed nine lives and resulted in 315 injury crashes, harming 420 of our friends and neighbors. Driving under the influence can impact the economy in addition to the pain and suffering of those immediately affected. Conservatively, a fatality has a $1.4 million impact, an injury $70,000, and a crash that only damages property averages nearly $9000. Funding for this program is from a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration. Report Drunk Drivers, Call 9-1-1 This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2421,http://www.longbeach.gov/police/press-releases/dui-checkpoint-planned-this-weekend-1-/,Media Bulletins,Agency-Published Resources,DUI CHECKPOINT PLANNED THIS WEEKEND(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2422,http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-this-weekend6/,Media Bulletins,Agency-Published Resources,DUI/DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2423,http://www.longbeach.gov/police/press-releases/dui-enforcement-operation-planned-for-long-beach-pride/,Media Bulletins,Agency-Published Resources,DUI ENFORCEMENT OPERATION PLANNED FOR LONG BEACH PRIDE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/15/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: DUI ENFORCEMENT OPERATION PLANNED FOR LONG BEACH PRIDE Contact: Media Relations Detail (562) 570-5273 Long Beach Police Department’s DUI Enforcement Team, along with officers from other local law enforcement agencies, will deploy on Sunday, May 18, 2014, to stop and arrest alcohol and drug-impaired drivers in the Department’s ongoing traffic safety campaign. DUI Saturation Patrols will deploy between 6:00 p.m. and 2:00 a.m. in areas with high frequencies of DUI collisions and/or arrests. “Come enjoy the exciting Pride Parade and Festival activities in Long Beach but please designate a sober driver ahead of time or call a taxi to ensure the safety of not only yourself, but other members of the community,” said Long Beach Police Department’s Traffic Section Lieutenant Kris Klein. “DUI injuries and deaths are completely preventable.” After falling dramatically for five straight years, figures for 2012 show an increase to 802 deaths in California because someone failed to designate a sober driver. Over the course of the past three years in Long Beach, DUI collisions have claimed nine lives and resulted in 315 injury crashes, harming 420 of our friends and neighbors. To prevent these tragedies from occurring, attendees are encouraged to practice the following safety tips: Before the festivities begin, plan a way to safely get home at the end of the night Designate a sober driver before drinking and leave your car keys at home Buzzed driving is impaired driving whether from alcohol, marijuana, prescription or illegal drugs. If impaired, please use a taxi or public transportation, or call a sober friend or family member to return home safely If you know someone who may be about to drive or ride while impaired, take their keys and help them make responsible choices to arrive at their destination safely If you see a drunk driver on the road, Report Them! Call 9-1-1! You could save a life. Funding for this program is from a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2424,http://www.longbeach.gov/police/press-releases/dui-checkpoint-2-/,Media Bulletins,Agency-Published Resources,DUI CHECKPOINT(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2425,http://www.longbeach.gov/press-releases/outside-review-of-police-department-direct-messaging-application-complete/,Media Bulletins,Agency-Published Resources,Outside Review of Police Department Direct Messaging Application Complete,"",200,City of Long Beach,"[""PRESS RELEASE""]",[],[],[],[],[],"" -2426,http://www.longbeach.gov/police/press-releases/two-suspects-arrested-for-string-of-commercial-burglaries/,Media Bulletins,Agency-Published Resources,TWO SUSPECTS ARRESTED FOR STRING OF COMMERCIAL BURGLARIES,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2428,http://www.longbeach.gov/police/press-releases/search-warrant-operation/,Media Bulletins,Agency-Published Resources,Search Warrant Operation,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 8/23/2018 FOR IMMEDIATE RELEASE Press Release # Subject: SEARCH WARRANT OPERATION Contact: Media Relations Detail (562) 570-5273 CLICK ON PHOTO TO VIEW LARGER IMAGE On August 22, 2018, the West Division Directed Enforcement Team, with the assistance of the Gangs and Violent Crime Division and the SWAT Team, conducted a search warrant operation, which resulted in the arrest of six individuals, and the confiscation of weapons, drugs and currency. The search warrants were served at six different locations in Long Beach, as follow-up to investigations into gang-related incidents of violent crime, that took place earlier this summer in the West Division area. Collectively, the operation resulted in five felony and one misdemeanor arrests, and the seizure of seven firearms, a quantity of methamphetamine, and $6,000 in cash. Listed below are the locations of the residences where search warrants were served, and those taken into custody: 1900 block of Harbor Avenue 1400 block of Chestnut Avenue 2200 block of Baltic Avenue 1400 block of Parade Street 1000 block of Market Street 2000 Martin Luther King Jr. Avenue Name: Age: Residency: Booking Charge(s): Set Bail: Rogelio Ayala 40 Long Beach Possesion of illegal weapon (non-firearm) $80,000 Edwin Lopez 26 Long Beach Destruction of ID marks on firearms $20,000 Raymond Moreno 34 Long Beach Ex-felon in possesion of firearm; illegal possesion of ammunition $35,000 Jonathan De La Torre 19 Long Beach Assault with a deadly weapon; shooting at occupied dwelling $250,000 Brandon Castillo 19 Long Beach Outstanding warrants (narcotics and domestic battery) $85,000 (minor) 17 Long Beach Possesion of controlled substance while armed n/a These types of operations will continue, to address violent crime taking place in our community, in efforts to keep our neighborhoods safe. The LBPD would like to encourage residents to continue to report crime by calling the non-emergency number at (562) 435-6711 or 9-1-1. Anonymous tips may be submitted through “LA Crime Stoppers” by calling 1-800-222-TIPS (8477), downloading the “P3 Tips” app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org . If you see something … say something! This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2429,http://www.longbeach.gov/press-releases/long-beach-city-council-restores-paramedic-rescue-12--reinstates-police-academy-operations-with-measure-a-funding/,Media Bulletins,Agency-Published Resources,"Long Beach City Council Restores Paramedic Rescue 12, Reinstates Police Academy Operations with Measure A Funding","",200,City of Long Beach,"[""PRESS RELEASE""]",[],[],[],[],[],"A- A A+ PRESS RELEASE City of Long Beach Public Information Office 411 W. Ocean Blvd, Long Beach, CA 90802 2/15/2017 FOR IMMEDIATE RELEASE Press Release # CM: 021517 Subject: Long Beach City Council Restores Paramedic Rescue 12, Reinstates Police Academy Operations with Measure A Funding Contact: Kerry Gerot Public Affairs Officer 562.570.6811 Kerry.Gerot@longbeach.gov The Long Beach City Council voted unanimously Tuesday night to restore Paramedic Rescue 12 and to reinstate the Police Academy, using Public Safety funding from Measure A. The restorations will be effective March 1, and will cost $1.5 million for the remainder of the Fiscal Year, and $2.5 million annually starting in Fiscal Year 2018 ($1.1 million for Paramedic Rescue 12; $1.4 million for Police Academy staffing). “I’m proud that Measure A revenue is being spent exactly on what we told voters we would spend the funds on, public safety and infrastructure,"" said Mayor Robert Garcia. ""Measure A is working to keep our City safe."" The restorations approved Tuesday will add six firefighter and nine police officer positions, for a total of 37 public safety positions restored through Measure A since Long Beach voters approved the temporary sales tax in June 2016 to support public safety and infrastructure. “With these restorations, we will have lower paramedic response times across the entire city, and a paramedic stationed at Fire Station 12 to serve North Long Beach, fully capable of advanced life support,” said Vice Mayor Rex Richardson, who introduced the item for City Council approval. Councilmembers Lena Gonzalez, Stacy Mungo and Roberto Uranga co-sponsored the item, which was approved by the entire City Council. Previous public safety restorations funded by Measure A include the restoration of Fire Engine 8 and the re-establishment of Police South Division, both of which had been identified as citywide public safety funding priorities by the Fire and Police Departments. These restorations will cost $3.8 million annually ($2.3 million for Fire Engine 8; $1.5 million for the Police South Division). The Measure A Year One Investment Plan also includes $3.2 million to maintain Police and Fire services in Fiscal Year 2017. For more news, pictures, videos and announcements of what’s happening in Long Beach, follow us on Facebook , Twitter , Instagram and YouTube . " -2430,http://www.longbeach.gov/police/press-releases/st-patricks-day-saturation-patrol/,Media Bulletins,Agency-Published Resources,"THIS ST. PATRICK’S DAY, PLAN BEFORE YOU PARTY!","",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2432,https://www.southamptontownnypolice.gov/1767/liberty-gardens,List of Data Sources,Info About Agencies,"Liberty Gardens | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Liberty Gardens""]",[],"[""Site Tools"", ""90 day extension"", ""Liberty Gardens (Revised FEIS)"", ""Contact Us"", ""Site Links"", ""Loading""]","[""FEIS Liberty Gardens"", ""Plan"", ""Appendices"", ""DEIS Liberty Gardens"", ""Plan"", ""Appendices""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Land Management - Planning (Long Range) Change of Zone Applications/PDD Liberty Gardens – Concern Southampton/Full Gospel Liberty Gardens Liberty Gardens 90 day extension 2024-01-24_Liberty Gardens_90 Day Extension for SEQRA Findings Liberty Gardens (Revised FEIS) Liberty Gardens Revised FEIS - December 2023 FEIS Liberty Gardens 2023_11 FEIS Main Text_Liberty Gardens Plan Attachment 1_ REZONE PLAN REV 11-17-2023 Appendices APPENDIX A - Town Board Resolution_DEIS Hearing Appendix B-1 2022-09-13 First Hearing Transcript APPENDIX B-2 2022-10-25 Hearing Transcript APPENDIX C-1 - Written Comments - Recieved 11-17 APPENDIX C-2 - Town Comments APPENDIX C-3 - N+ P Traffic Engineer Town Comments Response memo APPENDIX D - Traffic Report_Southampton Concern_Revised Oct 2022 APPENDIX E - Hampton Rehabilitation and Nursing Center Engineering Report APPENDIX F PILOT Previous and Proposed APPENDIX G Projected Taxes 50 unit plan APPENDIX H School Setback Ltr 9.16.23 APPENDIX I Sewer Connection Letter DEIS Liberty Gardens DEIS Main Text-Liberty Gardens_June 2022 Figures Plan 18136 RZPP-REZONE PLOT PLAN 3-1-2022 Alt 1_revised 2-17-2022 Alt 2_revised 2-17-2022 Alt 3_revised 2-17-2022 Alt 4_revised 2-17-2022 Alt 5_revised 2-17-2022 Appendices A-1 SCDPW Comments on Scope_11-5-2021 A-10 Photographs of Site-300dpi A-11 Architects Renderings A-12 Photographs of Vicinity-300dpi A-13 Hampton Center Letter of Intent 4.27.22 A-2 Road Access Agreement_12.13.21 A-3 EAF 1 revised 5-14-2020 A-4 EAF Parts 2 and 3_4-6-2021 A-5 Pos Dec Resoluton_7-13-2021 A-6 Final Scope_Town_10-20-2021 A-7 Veteran Preference Letter_10-15-2021 A-8 Community Support Letters A-9 Supporting Housing Needs Studies 1 B Fiscal Impact Summary_2022-3-23 C Unit Details and Floor Plans D-1 SCWA Water Quality Test Results, DA 23_2021 Year D-2 SONIR User Manual 2021-2-16 D-3 SONIR_2022-18-05 Alt 1 D-4 SONIR_2022-17-05 Proposed D-5 SONIR_2022-17-05 Alt 2 D-6 SONIR_2022-17-05 Alt 3 D-7 SONIR_2022-17-05 Alt 4 D-8 SONIR_2022-17-05 Alt 5 D-9 SONIR_2022-17-05 Alt 6 F TIS_March 2022 G-1 Quals G-2 Breeding Bird Atlas G-3 Reptiles and Amphibians H-1 2018 SHPO Review Documents H-2 Tracker Phase 1A and B Report_Feb -022 I Noise Report CONCERN Final 2022-03-17 Liberty Gardens Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -2433,http://www.longbeach.gov/police/press-releases/academy-graduation---class-90/,Media Bulletins,Agency-Published Resources,L.B.P.D. RECRUIT ACADEMY GRADUATION CEREMONY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/23/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: L.B.P.D. RECRUIT ACADEMY GRADUATION CEREMONY Contact: Media Relations Detail (562) 570-5273 RECRUIT CLASS #90 The Long Beach Police Department is pleased to announce the graduation of Recruit Academy Class #90. The graduation ceremony was held today, March 23, 2017, at the Long Beach Performing Arts Terrace Theater. Thirty-eight Long Beach Police Department recruits and two Redondo Beach Police Department recruits successfully completed 25½ weeks of intense academic, physical and practical training in areas such as: Patrol Procedures and Law Enforcement Tactics, Firearms Training, Weaponless Defense, Criminal Law, Vehicle Operations, Community Oriented Public Safety, Persons with Mental Health Disabilities, Cultural Diversity/Human Relations, and Procedural Justice. Class #90 is group who brings to the department a wide range of talents from a variety of backgrounds. The graduating class included the following officers: Officer Steven Baranowski Officer Xavier Brookes Officer Braulio Carbajal Officer Juan De Dios Carreon Officer Maritza Castillo Officer Trevor Costin Officer Yesenia Contreras * Officer Jeffrey Craver Officer Alvin Do Officer Harrison Ernenwein Officer Anton Fischer Officer Eric Gorski Officer Adrian Guzman Officer Daniel Haley * Officer Aaron Henry Officer Stephen Hunt Officer Jessica Jenkin Officer Donovan Joubert Officer Melissa Kiser Officer Hector Lizardo Officer Mary Marschke Officer Adrian Martinez Officer Cesar Najera Officer Aidan Nolasco Officer Daniel Parkhurst Officer Tesha Perales Officer Omar Ponce Officer Grant Potter Officer Brian Prebanda Officer Pedro Ramirez Officer Feliciano Reyes Officer McAdam Richardson Officer Eric Robbins Officer David Salcedo Officer Justin San Juan Officer Roger Santos Officer Brian Seielstad Officer Gordon Stojanovski Officer Manny Tejeda Officer Genaro Vega The graduates will now enter the field training phase where they will develop expertise and knowledge in patrol operations, and apply the skills they learned during their academy experience under the guidance of senior officers. The Long Beach Police Department congratulates the graduates and wishes them continued success in their future careers as law enforcement officers. *Redondo Beach Police Officer This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2435,http://www.longbeach.gov/press-releases/richard-rocchi-appointed-deputy-police-chief/,Media Bulletins,Agency-Published Resources,Richard Rocchi Appointed Deputy Police Chief,"",200,City of Long Beach,"[""PRESS RELEASE""]",[],[],[],[],[],"A- A A+ PRESS RELEASE City of Long Beach Public Information Office 411 W. Ocean Blvd, Long Beach, CA 90802 12/12/2014 FOR IMMEDIATE RELEASE Press Release # CM: 121214 Subject: Richard Rocchi Appointed Deputy Police Chief Contact: Robert Luna, Long Beach Police Chief 562.570.7301 Robert.Luna@longbeach.gov Long Beach City Manager Pat West and Police Chief Robert Luna today -announced the appointment of Commander Richard Rocchi, a 27-year -veteran of the Police Department, as Deputy Chief, effective -December 13, 2014. ""Richard Rocchi displays the highest levels of integrity, service -and community engagement,"" Chief Luna said. “His consistent -dedication and professionalism has earned him the trust and respect -of those within the Police Department and throughout the -community."" Commander Rocchi's most recent assignment has been Commander of the -West Division, the busiest patrol operation in the City. He began -his career as a police officer with the Long Beach Police -Department in 1987. He has worked many diverse assignments, -including Patrol, Field Training Officer, Special Enforcement -Section, SWAT, Gang Enforcement, Community Policing, Internal -Affairs, Crimes Against Persons Section, and Academy Director. In -addition, he has worked as an Academy and Department instructor and -has served on a variety of committees and working groups. “I am honored to be named Deputy Chief, and I will continue -to dedicate myself to providing the best service possible to our -committed employees and the entire community,” Commander -Rocchi said. Commander Rocchi grew up in Long Beach and is a graduate of -Polytechnic High School. He holds an Associate of Arts Degree in -Administration of Justice from Long Beach City College, a Bachelors -of Science in Occupational Studies and a Masters of Public -Administration from California State University, Long Beach. He is -also a graduate of Sherman Block Supervisory Leadership Institute -and the 221st session of the FBI National Academy. Commander Rocchi is a member and past president of the Long Beach -Police Command Officers Association and the FBI National Academy -Associates, and he serves as a Council Member of Special Olympics -of Southern California. For more news, pictures, videos and announcements of what’s happening in Long Beach, follow us on Facebook , Twitter , Instagram and YouTube . " -2436,http://www.longbeach.gov/police/press-releases/fatality-2-/,Media Bulletins,Agency-Published Resources,FATALITY(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/23/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: FATALITY Contact: Media Relations (562) 570-5273 On Wednesday, October 22, 2014 at approximately 1:33 P.M. officers from the Long Beach Police Department responded to Cherry Avenue and 33rd Street regarding an injury traffic collision. Upon arrival officers discovered a four vehicle collision with two adult individuals trapped inside one of the vehicles. Long Beach Fire Department personnel responded and extricated the trapped individuals and transported them to a local hospital. The preliminary investigation revealed that a 2002 Honda, driven by a 30-year-old Long Beach Resident, and a 1990 Nissan, driven by a 20-year-old Long Beach Resident, were traveling south on Cherry Avenue from Wardlow Street. The Honda collided with a 2009 Toyota, driven by a 78-year-old resident of Seal Beach, that was making a left turn from northbound Cherry Avenue to westbound 33rd Street. After the collision between the Honda and the Toyota, the Nissan collided with the Honda. The Toyota then collided with a parked unoccupied off road all-terrain (ATV) type vehicle in the parking lot on the southwest corner of Cherry Avenue and 33rd Street. The front right passenger of the Toyota, Kwang Ja Sohn, a 70-year-old resident of Seal Beach, sustained major trauma from the collision and was pronounced deceased at the hospital. The driver of the Toyota sustained minor injuries. All drivers were released and the investigation remains ongoing. Anyone who may have information on this incident is asked to contact Long Beach Police Department Collision Investigation Detail Detective Sirilo Garcia at (562) 570-7355. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2437,http://www.longbeach.gov/police/press-releases/lbpd-promotes-new-leaders/,Media Bulletins,Agency-Published Resources,LBPD PROMOTES NEW LEADERS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/12/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: LBPD PROMOTES NEW LEADERS Contact: Media Relations Detail (562) 570-5273 LBPD PROMOTEES The Long Beach Police Department is proud to announce the promotion of eight employees that took place at a ceremony held today in City Hall Council Chambers. The employees and their ranks are as follows: Promoting to Deputy Chief: Commander Wally Hebeish Promoting to Commander: Lieutenant Erik Herzog Lieutenant Lloyd Cox Promoting to Lieutenant: Sergeant Timothy Olson Promoting to Sergeant: Officer Joshua Brearley Officer Jeremy Boshnack Officer Robert Ryan Promoting to Special Services Officer IV: SSO III Aaron Gilliam-Reed The men and women of the Long Beach Police Department congratulates the newly promoted employees and wishes them continued success in their new assignments. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/12/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: LBPD PROMOTES NEW LEADERS Contact: Media Relations Detail (562) 570-5273 LBPD PROMOTEES The Long Beach Police Department is proud to announce the promotion of eight employees that took place at a ceremony held today in City Hall Council Chambers. The employees and their ranks are as follows: Promoting to Deputy Chief: Commander Wally Hebeish Promoting to Commander: Lieutenant Erik Herzog Lieutenant Lloyd Cox Promoting to Lieutenant: Sergeant Timothy Olson Promoting to Sergeant: Officer Joshua Brearley Officer Jeremy Boshnack Officer Robert Ryan Promoting to Special Services Officer IV: SSO III Aaron Gilliam-Reed The men and women of the Long Beach Police Department congratulates the newly promoted employees and wishes them continued success in their new assignments. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ A- A A+ A- A A+ A- A A+ A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/12/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: LBPD PROMOTES NEW LEADERS Contact: Media Relations Detail (562) 570-5273 9/12/2017 FOR IMMEDIATE RELEASE Press Release # 2017 " -2439,http://www.longbeach.gov/police/press-releases/police-seek-public-s-help-to-identify-vehicle-theft-suspects/,Media Bulletins,Agency-Published Resources,POLICE SEEK PUBLIC'S HELP TO IDENTIFY VEHICLE THEFT SUSPECTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/6/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: POLICE SEEK PUBLIC'S HELP TO IDENTIFY VEHICLE THEFT SUSPECTS Contact: Media Relations Detail (562) 570-5273 Photo of Stolen Trailer & Suspect Vehicle Photo of One of the Suspects The Long Beach Police Department is asking for the public’s help in locating a stolen trailer and identifying two suspects. On February 2, 2015, at approximately 5:00 a.m., a trailer was stolen from the property of a local church in the 4700 block of Clark Avenue. The stolen trailer, described as a white/silver 2008 Elite trailer with CA license plate 4LF9838, remains outstanding. Detectives viewed surveillance video and learned that two male suspects who appear to be either White or Hispanic, drove a vehicle onto the property, attached the trailer, and fled the scene. The suspects’ vehicle appears to be a full-sized Chevrolet Suburban with running boards and chrome rims. Anyone with information regarding this incident or who recognizes the suspect/vehicle is urged to contact Detective Thomas Brown at (562) 570-5544. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2441,http://www.longbeach.gov/police/press-releases/police-seek-help/,Media Bulletins,Agency-Published Resources,POLICE SEEK HELP,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/4/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: POLICE SEEK PUBLIC’S HELP TO LOCATE ATTEMPT MURDER SUSPECT Contact: Media Relations Detail (562) 570-5273 Suspect Mario Aguilar, Jr. UPDATE (6/1/2016) :  Suspect Mario Aguilar Jr. was extradited from Texas by the U.S. Marshals Fugitive Task Force (in which LBPD participates) on May 14, 2016.  Aguilar was arraigned on May 17, 2016, and is currently being held in Los Angeles County Jail.  He is scheduled to appear in Long Beach Superior Court on June 2, 2016, regarding this attempt murder case. Original News Release (2/4/2016) : Long Beach Police are asking for the public’s help with locating Mario Aguilar Jr., a 31-year-old resident of La Puente, in connection with an attempt murder case. On October 18, 2015, around 6:00 p.m., officers were dispatched to a residence in the area of Santa Fe Avenue and Pacific Coast Highway regarding an assault with a weapon. Arriving officers located a female adult with multiple stab wounds. Long Beach Fire Department paramedics transported the victim, in critical condition, to a local hospital. Domestic Violence detectives also responded to begin their investigation and Aguilar, the father of the victim’s children, was identified as the suspect. On November 4, 2015, the Los Angeles County District Attorney’s Office filed charges of attempt murder and child abuse against Aguilar and a $2,395,000.00 arrest warrant was issued. Mario Aguilar, Jr., violated his conditions of parole and remains outstanding. He should be considered armed and dangerous. He is described as a male Hispanic, 5’8”, 240 lbs., bald, with brown eyes. Anyone with information regarding the whereabouts of Suspect Aguilar is urged to contact Domestic Violence Detective R. Hawkins at (562) 570-7277. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2442,http://www.longbeach.gov/police/press-releases/traffic-fatality-6-/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY(6),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 3/10/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: TRAFFIC FATALITY Contact: Media Relations Detail (5620 570-5273 On March 6, 2014, Long Beach Police received notification from the Los Angeles County Coroner’s Office that a pedestrian, identified as Harold Simmons, died as a result of injuries he sustained in a February traffic collision. On February 24, 2014, around 9:20 a.m., officers responded to the 1100 block of New York Street regarding an injury traffic collision involving a vehicle and a pedestrian. Arriving officers discovered a male adult pedestrian lying beneath the tire of a large International Work truck. The driver remained at the scene. The preliminary investigation revealed that after the collision, the male 31-year-old driver, a resident of Winchester, CA, immediately stopped and called emergency personnel for assistance. It appears the pedestrian was attempting to cross New York Street mid-block, outside of a crosswalk, when he was struck. Long Beach Fire Department paramedics transported the pedestrian to a local hospital in stable condition. The driver was interviewed at the scene and found to have a valid drivers license and insurance. The investigation is ongoing. On March 6, 2014, Long Beach Police received notification that 79-year-old Harold Simmons of Long Beach died on February 24, 2014. Anyone with information regarding this incident is asked to call Collision Investigation Detail Detectives David Lauro and Sirilo Garcia at (562) 570-7355. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2444,http://www.longbeach.gov/police/press-releases/suspect-arrested-and-charged-for-1996-murder/,Media Bulletins,Agency-Published Resources,SUSPECT ARRESTED AND CHARGED FOR 1996 MURDER,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/8/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: *** REVISED *** SUSPECT CHARGED FOR 1996 MURDER Contact: Media Relations Detail (562) 570-5273 On May 4, 1996, around 10:30 p.m., Long Beach Police were dispatched to a shooting in the 500 block of East 14th Street that resulted in the death of 26-year-old Jorge Martinez of Long Beach, and a suspect has now been identified and charged. The investigation revealed that Mr. Martinez was standing on the sidewalk alone when he was approached by several Samoan gang members. It was recently learned that at the time, 21-year-old Wayne Taufi, aka Big Fassi, shot Martinez, passed the gun to another gang member, and fled in a vehicle. Mr. Martinez was pronounced deceased at the scene. When the new information identifying Taufi as the suspect came to light, detectives re-opened the case. Detectives are also attempting to gather additional Information on four other male subjects who were present at the time of the murder. Those individuals are identified by their street monikers; “Wizard,” “Lil Boy,” “Fuzzy,” and “Whisper.” Wayne Taufi, currently 40-years-old and from Long Beach, was already in custody on unrelated charges. Long Beach Police Homicide detectives presented their case to the Los Angeles County District Attorney’s Office for filing consideration. On July 7, 2015, the District Attorney’s Office filed murder charges against Taufi for the murder of Jorge Martinez. Taufi is currently being held at the Los Angeles County Jail. The investigation remains ongoing. Anyone with information regarding the incident or the individuals identified by their monikers is urged to contact the Long Beach Police Homicide Detectives Todd Johnson and Shea Robertson at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2447,http://www.longbeach.gov/police/press-releases/arrest-made-and-charges-filed-in-july-4th-murder/,Media Bulletins,Agency-Published Resources,ARREST MADE AND CHARGES FILED IN JULY 4TH MURDER,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/14/2015 FOR IMMEDIATE RELEASE Press Release # Subject: ARREST MADE AND CHARGES FILED IN JULY 4TH MURDER Contact: Media Relations (562) 570-5273 ViewOriginal News Release On Friday, July 10th, 2015, detectives from the Long Beach Police Department arrested an individual in connection with the July 4th murder of 38-year-old Allen Estes of Long Beach, and charges have been filed. On Saturday, July 4th, 2015, at approximately 5:27 a.m., officers responded to Anaheim Street and Dawson Avenue in regards to an unresponsive subject who sustained injuries from being stabbed, and was subsequently pronounced deceased at the scene. With the assistance of a tip from the public, detectives were able to identify 24-year-old Norman Matthew Perdon of Long Beach as a potential suspect. Detectives investigated this lead and arrested Perdon last Friday in the 1400 block of Walnut Avenue. Perdon and the victim were former roommates and it is believed the motive for the murder is related to an ongoing dispute. This morning, detectives presented the case to the Los Angeles County District Attorney’s Office who filed murder and weapons charges against Perdon. He is currently being held at the Long Beach Jail on $1,020,000 bail. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2449,http://www.longbeach.gov/police/press-releases/officer-involved-shooting--no-injuries-sustained/,Media Bulletins,Agency-Published Resources,OFFICER INVOLVED SHOOTING; NO INJURIES SUSTAINED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/20/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: OFFICER INVOLVED SHOOTING; NO INJURIES SUSTAINED Contact: Media Relations Detail (562) 570-5273 On Thursday, February 19, 2015, at approximately 3:57 p.m., Long Beach Police were dispatched to the 400 block of W. Cowles Street regarding a possible armed robbery to a person that just occurred, where the calling party provided a location and description of the three possible suspects. Officers arrived on scene and saw three possible suspects matching the description given by the calling party. Upon officers making contact with the suspects, one of the suspects brandished a handgun and an officer involved shooting occurred. The suspects ran from officers and two of them were taken into custody a short distance away. Additional responding officers established a perimeter around the incident. The police department obtained information that the third suspect was hiding in a trash can within the perimeter. To ensure the safety of residents, officers conducted evacuations of homes in the immediate area.  The suspect was then ordered out of the trash can and taken into custody without incident. A handgun was recovered at the scene of the officer involved shooting. Two of the suspects are 19-years-old and from Long Beach, while the third suspect is 20-years-old and from Compton.  Their identities are being withheld at this time due to the ongoing investigation. No officers or suspects were injured during the incident. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detectives Mark Bigel and Malcolm Evans at (562)570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2450,http://www.longbeach.gov/police/press-releases/long-beach-police-inspect-37-businesses-for-alcohol-sales-compliance/,Media Bulletins,Agency-Published Resources,LONG BEACH POLICE INSPECT 37 BUSINESSES FOR ALCOHOL SALES COMPLIANCE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/5/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: LONG BEACH POLICE INSPECT 37 BUSINESSES FOR ALCOHOL SALES COMPLIANCE Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department's Vice Investigations Section, in cooperation with investigators from the Department of Alcoholic Beverage Control (ABC), conducted an “ABC IMPACT Inspection” operation on Second Street in the Belmont Shore area of Long Beach, on May 4, 2015. “ABC IMPACT Inspection” operations target ABC licensed establishments that sell alcohol, such as restaurants, bars, liquor stores, convenience stores, and grocery stores. The purpose of the inspection is to assess a business’ compliance with current ABC laws and educate employees regarding any non-compliance issues. During the course of the operation, 37 establishments were visited and inspected. Business owners and employees were advised regarding any ABC laws violated.  Though several warnings were given for violations such as missing signage, no citations were issued. The Long Beach Police Department was pleased to see so many establishments in compliance with ABC laws and will continue to enforce ABC laws at all establishments throughout the city. Anyone wishing to report illegal behavior related to the unlawful sale of alcohol or ABC law violations, should contact the Vice Investigations Section at (562) 570-7219. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2451,https://coloradosprings.gov/police-department/page/report-traffic-complaint,Calls for Service,Police & Public Interactions,Report a Traffic Complaint | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Report a Traffic Complaint""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -2452,http://www.longbeach.gov/press-releases/robert-g-luna-to-be-sworn-in-as-chief-of-police-for-city-of-long-beach-on-saturday-november-22/,Media Bulletins,Agency-Published Resources,Robert G Luna to be Sworn In as Chief of Police for City of Long Beach on Saturday November 22,"",200,City of Long Beach,"[""PRESS RELEASE""]",[],[],[],[],[],"" -2453,http://www.longbeach.gov/police/press-releases/murder---6300-block-of-knight-avenue/,Media Bulletins,Agency-Published Resources,MURDER - 6300 BLOCK OF KNIGHT AVENUE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/11/2017 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: MURDER - 6300 BLOCK OF KNIGHT AVENUE Contact: Media Relations Detail (562) 570-5273 On January 10, 2017, at approximately 7:25 pm, officers responded to the 6300 block of Knight Ave regarding two adult victims who had been shot. Upon arrival officers found a female victim with a gunshot wound to the upper torso. She was determined to be deceased at the scene by LB Fire. An additional victim, male Adult, was transported to a local hospital in critical condition with a gunshot wound to the upper torso. The suspect believed to be responsible for the shooting was detained by witnesses until police officers arrived and was taken into custody. The deceased victim has been identified as Susan Garcia a 33 year-old resident of Long Beach. The relationship between the victims and the suspect is still to be determined. The shooting is not gang related. The Suspect has been identified as 35 year-old John McVoy a resident of Corona. He was booked for murder and attempt murder at the Long Beach Jail, and is being held on $2,000,000.00 bail. Anyone with information is urged to contact Homicide Detectives Oscar Valenzuela and Shea Robertson at (562) 570-7244. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2455,http://www.longbeach.gov/police/press-releases/the-north-patrol-division-directed-enforcement-team-cracks-down-on-criminal-street-gang/,Media Bulletins,Agency-Published Resources,THE NORTH PATROL DIVISION DIRECTED ENFORCEMENT TEAM CRACKS DOWN ON CRIMINAL STREET GANG,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2456,http://www.longbeach.gov/police/press-releases/police-asking-for-public-s-help-in-identifying-person-of-interest-in-sexual-battery/,Media Bulletins,Agency-Published Resources,POLICE ASKING FOR PUBLIC'S HELP IN IDENTIFYING PERSON OF INTEREST IN SEXUAL BATTERY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/16/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: POLICE ASKING FOR PUBLIC'S HELP IN IDENTIFYING PERSON OF INTEREST IN SEXUAL BATTERY Contact: Media Relations (562) 570-5273 (Click on photo to enlarge) The Long Beach Police Department is seeking the public’s assistance with identifying a person of interest who is wanted for questioning in connection with a sexual battery that occurred last week at a local Signal Hill bus stop passenger shelter. On Wednesday, May 7, 2014, at approximately 4:30 P.M., Long Beach Police responded to a call of an assault and battery that occurred to a female in the 900 block of E. Willow Street. During the course of this investigation it was learned the victim, a 26 year-old Long Beach resident, was approached by a male subject who engaged her in brief conversation inside a bus stop passenger shelter. Suddenly, without provocation, the subject attacked the victim. The subject groped the victim’s breast and buttocks. No weapons were observed during this incident. The subject is described as follows: a male African American with a medium skin complexion, 25 - 27 years-old, 5’05"" - 5’08” tall, 130 - 140 lbs, black “fuzzy” hair, brown eyes, wearing a white T-shirt, blue basketball shorts, and black socks. The Long Beach Police Department would like to remind the public to be aware of their surroundings at all times and to report any suspicious persons or activity immediately by calling 9-1-1. Detectives are hoping that someone will recognize the individual depicted in the sketch and come forward. Anyone who recognizes the person in the sketch or has information relating to this investigation is urged to contact Long Beach Police Sex Crimes Detective Patrick Jennings at (562) 570-7354. Anonymous tips may be submitted by calling 1 (800) 222-TIPS, texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2457,http://www.longbeach.gov/police/press-releases/students-return-to-school--motorists-urged-to-drive-carefully/,Media Bulletins,Agency-Published Resources,STUDENTS RETURN TO SCHOOL; MOTORISTS URGED TO DRIVE CAREFULLY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 8/29/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: STUDENTS RETURN TO SCHOOL; MOTORISTS URGED TO DRIVE CAREFULLY Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department would like to remind everyone that with school beginning on Wednesday, September 3, 2014, and with the volume of pedestrian traffic around schools increasing dramatically, all commuters are encouraged to practice the following safety tips in an effort to prevent avoidable accidents: All drivers are reminded to: - Yield the right of way to pedestrians in marked or unmarked crosswalks - Not overtake and pass a vehicle stopped ahead of you when it has stopped for a pedestrian - Yield the right of way to pedestrians on sidewalks - Obey posted speed limits - Never drive while distracted (examples: using a cell phone, reading, applying make-up, etc.) - Stop and remain stopped for school buses with ""flashing red lights;"" opposing traffic must also stop unless a painted or raised divider separates the roadway - Watch and obey Crossing Guards … they are there to protect children! Pedestrians are reminded to: - Yield to vehicles on the roadway if you are outside the crosswalk - Not cross between intersections controlled by traffic signals (to do so would constitute jaywalking) Parents are reminded to: - Obey all parking signs and curb markings – they are designed to protect children and provide optimum traffic flow - Do not double park; it interrupts the flow of traffic and makes it difficult to for pedestrians to see oncoming traffic - Follow school drop-off procedures - Always drop your child off on the curbside of the school - Teach your child to always cross the street at a crosswalk The Long Beach Police Department's Traffic Section is committed to motorist and pedestrian safety and traffic laws will be strictly enforced at and around our schools! For further information, please contact the Long Beach Police Department’s Traffic Section at (562) 570-7209. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2458,http://www.longbeach.gov/police/press-releases/drug-lab-discovered-at-residence--two-suspects-in-custody/,Media Bulletins,Agency-Published Resources,DRUG LAB DISCOVERED AT RESIDENCE; TWO SUSPECTS IN CUSTODY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/7/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: DRUG LAB DISCOVERED AT RESIDENCE, TWO SUSPECTS IN CUSTODY Contact: Media Relations (562) 570-5273 (Click on photo to enlarge) Today, November 7, 2014, at approximately 1:00 A.M. the Long Beach Police and Fire Departments responded to a residence in the 4300 block of Maury Avenue in regards to a complaint of a strong chemical odor. The initial investigation at the scene led officers and firefighters to believe the smell was related to a possible clandestine laboratory. Officers quickly contained the scene and evacuated residents in the immediate area to ensure their safety during the investigation. The Long Beach Police Department Drug Investigations Section responded along with the Los Angeles Interagency Metropolitan Police Apprehension Crime Task Force (LA IMPACT) Clandestine Laboratory Response Team. Long Beach Detectives wrote a search warrant for the property and upon entering the residence they discovered an active Phencyclidine (PCP) Laboratory. Several large drum containers containing PCP were located on the property. The City of Long Beach Environmental Health Hazardous Materials Emergency Response Team responded for recovery of the chemical waste. Edwin Van, a 48-year-old resident of Long Beach, and Vernon Thomas, a 61-year-old resident of Long Beach, were located at the residence and arrested on charges of manufacturing a controlled substance. Both Van and Thomas were taken to a local hospital to be treated for minor chemical exposure prior to their booking. Van and Thomas are currently being held at the Long Beach City Jail, each with a bail amount of $75,000. This investigation is a collaborative effort by LA IMPACT and the Long Beach Drug Investigations Section. The case will be presented to the Los Angeles County District Attorney's Office. Clandestine laboratories are extremely dangerous and hazardous to your health. If you smell strong chemical odors or suspect there might be a clandestine laboratory in your area, call 9-1-1 immediately. Anyone with information in regards to this incident who has not spoken to authorities is urged to contact Long Beach Drug Investigations Section at (562) 570-7221. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2459,http://www.longbeach.gov/police/press-releases/officer-involved-shooting-1700-block-of-marine-avenu-wilmington/,Media Bulletins,Agency-Published Resources,Officer Involved Shooting 1700 block of Marine Avenu Wilmington,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/7/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: **UPDATED** OFFICER INVOLVED SHOOTING Contact: Media Relations Detail (562) 570-5273 SUSPECTS GUN UPDATE (10/10/2016):  Suspect Bryan Gallegos, 25 years old and a resident of Carson, was booked for murder, assault with a deadly weapon upon a peace officer, felon in possession of a firearm, and carrying a concealed weapon in a vehicle. Gallegos remains hospitalized . Original News Release: On October 7, 2016, at approximately 11:20 a.m., Long Beach Police Detectives were in the 1700 block of Marine Ave in Wilmington conducting follow up investigation to a Murder. The purpose of the investigation was to arrest an armed and dangerous murder suspect. Detectives located the suspect in a vehicle and when they moved in to affect an arrest he attempted flee in the vehicle, resulting in a collision with a detective’s vehicle. Immediately thereafter an officer involved shooting occurred. Two Long Beach Detectives fired at the male adult suspect and he was hit by their gunfire. Detectives then immediately recovered a loaded firearm and an additional loaded magazine from the suspect and started rendering medical aid until LA City Fire Department personnel arrived. The suspect was subsequently transported to a local hospital and is listed in critical condition. No detectives were injured. Homicide detectives responded and conducted their investigation. The LA County District Attorney's office also responded and will conduct an independent investigation as they do in all officer involved shootings that result in injury. The name of the suspect is not being released at this time for investigative purposes. The murder the suspect was being arrested for was from September 5, 2016 in the 300 block of Hanjin Road in Long Beach. To view that news release click on below link: http://longbeach.gov/police/press-releases/murder---300-block-of-hanjin-road/ Anyone with information regarding the officer involved shooting or the murder from September 5, 2016 is urged to contact Homicide Detectives at (562) 570-7244.  Anonymous tips may be submitted by downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play ), or visiting https://www.p3tips.com/TipForm.aspx?ID=365#googtrans(en|en) . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2461,http://www.longbeach.gov/police/press-releases/trafficfatality-2-/,Media Bulletins,Agency-Published Resources,TRAFFICFATALITY(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/13/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Saturday, February 13, 2016, at approximately 1:06 a.m., Long Beach Police were dispatched to the area of the Gerald Desmond Bridge and the 710 Freeway regarding a single vehicle traffic collision, which resulted in the death of a male adult. Arriving officers located a motorcyclist lying on eastbound Ocean Boulevard, below the transition road. Long Beach Fire Department personnel determined the driver, a 25-year-old resident of Torrance, deceased at the scene. The preliminary investigation revealed the driver of a 2015 Harley Davidson motorcycle was traveling eastbound on the Gerald Desmond Bridge transition road to the northbound 710 Freeway. As the roadway turned from eastbound to northbound, the motorcyclist, for an unknown reason, collided with the south k-rail and was ejected from his motorcycle onto Ocean Boulevard below. No other vehicles or parties were involved in this incident. The Los Angeles County Coroner will determine positive identification and notify next of kin. Anyone with information regarding this incident is asked to contact Detective Sirilo Garcia of the Collision Investigation Detail at (562) 570-7355. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2463,http://www.longbeach.gov/police/press-releases/search-and-rescue-orientation-meeting/,Media Bulletins,Agency-Published Resources,SEARCH AND RESCUE ORIENTATION MEETING,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 10/2/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: JOIN LONG BEACH SEARCH & RESCUE AND START YOUR FUTURE TODAY Contact: Media Relations Detail (562) 570-5273 The Long Beach Search & Rescue Unit has been in existence since 1962 and provides young adults with an opportunity to serve the public during emergency situations. Applications will be accepted at the annual orientation meeting on Tuesday, October 6, 2015, at 7:00 pm., at 2247 Argonne Avenue, Long Beach, 90815 . This orientation meeting is only held once a year . Motivated young adults, who are interested in public safety careers, and their parents are encouraged to attend this one-hour meeting. Requirements to apply: Be at least 15 and not yet 19 years of age by the start of the academy, Have no felony convictions, demonstrate high moral and citizenship standards, Maintain at least a “C” grade average in school, Be physically fit and be willing to devote a substantial amount of time to training, public events, and emergency call-outs. Training includes: Fire suppression Search patterns Vehicle extrication Firearm safety High-angle rescue Ladder operations Helicopter operations Emergency & Support Activities: Missing person searches Major fire incidents SWAT team incidents Natural disasters Aircraft accidents For more information about Long Beach Search & Rescue, please visit LBSAR.org This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2464,http://www.longbeach.gov/police/press-releases/l-b-p-d--saturation-patrol-proves-effective/,Media Bulletins,Agency-Published Resources,L.B.P.D. SATURATION PATROL PROVES EFFECTIVE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/3/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: L.B.P.D. SATURATION PATROL PROVES EFFECTIVE Contact: Media Relations Detail (562) 570-5273 On Saturday November 1, 2014, the Long Beach Police Department's Traffic Section conducted a Driving Under the Influence Saturation Patrol from 7:00 p.m. until 3:00 a.m. During the eight-hour operation, motor officers patrolled throughout the city looking for impaired drivers. During the operation, officers took the following enforcement actions: Conducted Fifty-five (55) enforcement stops Conducted Nine (9) Standardized Field Sobriety Tests Made Two (2) DUI arrests Issued Twelve (12) traffic citations for unsafe driving After falling dramatically for five straight years, figures for 2012 show an increase to 802 deaths in California because someone failed to designate a sober driver. Over the course of the past three years, DUI collisions have claimed 9 lives and resulted in 315 injury crashes harming 420 of our friends and neighbors. DUI can impact the economy in addition to the pain and suffering of those immediately affected. Conservatively, a fatality has a $1.4 million impact, an injury $70,000, and a crash that only damages property averages nearly $9,000. Funding for this program is from a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration. Report drunk drivers, call 9-1-1. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2465,http://www.longbeach.gov/police/press-releases/dui-drivers-license-checkpoint-planned-this-weekend/,Media Bulletins,Agency-Published Resources,DUI DRIVERS LICENSE CHECKPOINT PLANNED THIS WEEKEND,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/22/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: DUI/DRIVERS LICENSE CHECKPOINT PLANNED THIS WEEKEND Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department’s Traffic Section will conduct a DUI/Drivers License Checkpoint on January 24, 2015, in the North Division, between the hours of 7:00 p.m. Saturday night until 3:00 a.m. Sunday morning. The deterrent effect of DUI checkpoints is a proven resource in reducing the number of persons killed and injured in alcohol or drug involved crashes. Research shows that crashes involving an impaired driver can be reduced by up to 20% when well-publicized DUI checkpoints and proactive DUI patrols are conducted routinely. In California, this deadly crime led to 802 deaths and nearly 24,000 serious injuries in 2012 because someone failed to designate a sober driver. Nationally, the latest data shows nearly 10,000 were killed by impaired drivers. “Over the course of the past three years in Long Beach, DUI collisions have claimed nine lives and resulted in 315 injury crashes, harming 420 of our friends and neighbors,” said Long Beach Police Department Sergeant Aaron Alu. Officers will look for signs of alcohol and/or drug impairment with officers checking drivers for proper licensing, delaying motorists only momentarily. When possible, specially trained officers will be available to evaluate those suspected of drug-impaired driving, which now accounts for a growing number of impaired driving crashes. Drugs, which may impair driving, not only include illegal narcotics, but many prescription drugs, marijuana, and even some over-the-counter medications. Driving under the influence (DUI) checkpoints are placed in locations based on collision statistics and frequency of DUI arrests, affording the greatest opportunity for achieving drunk and drugged driving deterrence. Locations are chosen with safety considerations for the officers and the public. Drivers caught driving impaired can expect the impact of a DUI arrest to include jail time, fines, fees, DUI classes and other expenses that can exceed $10,000, not to mention the embarrassment when friends and family find out. Funding for this checkpoint is provided to the Long Beach Police Department by a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration, reminding everyone to ‘Report Drunk Drivers – Call 9-1-1’. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2467,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2017_archived_news/september_2017/national_night_out_arlington_police_on_oct_3_2017,Media Bulletins,Agency-Published Resources,"Ask Arlington: Enjoy National Night Out with Arlington Police on Oct. 3, 2017 - City of Arlington","",200,Just a moment...,"[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Ask Arlington: Enjoy National Night Out with Arlington Police on Oct. 3, 2017""]",[],[],[],[],Skip to Content Skip to Content -2468,https://www.columbus.in.gov/event/columbus-police-review-board/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2469,https://spdblotter.seattle.gov/2012/02/06/the-seattle-police-foundation-thanks-the-seattle-hotel-association-for-hosting-the-evening-of-hope-gala/,Media Bulletins,Agency-Published Resources,The Seattle Police Foundation thanks the Seattle Hotel Association for hosting the Evening of Hope gala - SPD Blotter,"",200,403 Forbidden,"[""The Seattle Police Foundation thanks the Seattle Hotel Association for hosting the Evening of Hope gala""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics Search Search Search Search Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports -2470,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/arrests/081622arrests.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2471,https://alpha.austin.gov/en/police-oversight/oral-reprimand-of-officer-ivan-figueroa/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2472,https://www.orovalleyaz.gov/government/news/oro-valley-town-council-to-vote-on-police-chief-appointment-february-5,Media Bulletins,Agency-Published Resources,Oro Valley Town Council to vote on police chief appointment February 5 – Oro Valley | it's in our nature,"Today the Town of Oro Valley released its agenda for February 5, 2020, which includes as one of the Town Council’s items for business the appointment of Oro Valley Commander Kara M. Riley as its next police chief.",200,Home – Oro Valley | it's in our nature,"[""Oro Valley Town Council to vote on police chief appointment February 5""]",[],"[""OV 50th Anniversary Announcement"", ""Town of Oro Valley"", ""Connect with us""]",[],[],[],"opens in new tab or window OV 50th Anniversary Announcement On April 15, 2024, the Town of Oro Valley turns 50 years old! Join us as we commemorate a half-century of history, growth, and community in Oro Valley! Our 50th Anniversary landing page has all the information you need about this year of community celebration. Learn more Close this announcement OV 50th Anniversary Announcement On April 15, 2024, the Town of Oro Valley turns 50 years old! Join us as we commemorate a half-century of history, growth, and community in Oro Valley! Our 50th Anniversary landing page has all the information you need about this year of community celebration. Learn more Close this announcement OV 50th Anniversary Announcement On April 15, 2024, the Town of Oro Valley turns 50 years old! Join us as we commemorate a half-century of history, growth, and community in Oro Valley! Our 50th Anniversary landing page has all the information you need about this year of community celebration. Learn more Close this announcement OV 50th Anniversary Announcement On April 15, 2024, the Town of Oro Valley turns 50 years old! Join us as we commemorate a half-century of history, growth, and community in Oro Valley! Our 50th Anniversary landing page has all the information you need about this year of community celebration. Learn more Close this announcement OV 50th Anniversary Announcement On April 15, 2024, the Town of Oro Valley turns 50 years old! Join us as we commemorate a half-century of history, growth, and community in Oro Valley! Our 50th Anniversary landing page has all the information you need about this year of community celebration. Learn more Close this announcement On April 15, 2024, the Town of Oro Valley turns 50 years old! Join us as we commemorate a half-century of history, growth, and community in Oro Valley! Our 50th Anniversary landing page has all the information you need about this year of community celebration. Learn more " -2473,https://www.richmondindiana.gov/docs/current-city-police-districts-map,Geographic,Info About Agencies,Current City Police Districts Map,"",200,Richmond Indiana,"[""Documents, Forms, & Transactions""]","[""Current City Police Districts Map"", ""Stay Connected""]","[""""]","[""Due Date"", ""Contact"", ""City of Richmond""]",[],[],"What's Happening Doing Business Living City Government Office of the Mayor Departments City Clerk City Council Boards & Commissions Job Opportunities Contact Contact Us Directory What's Happening Doing Business Living City Government Office of the Mayor Departments City Clerk City Council Boards & Commissions Job Opportunities Contact Contact Us Directory City Government Office of the Mayor Departments City Clerk City Council Boards & Commissions Job Opportunities City Government City Government Contact Contact Us Directory Contact Contact Documents, Forms, & Transactions Documents, Forms, & Transactions Current City Police Districts Map Download Document Due Date Current City Police Districts Map Download Document Due Date Current City Police Districts Map Download Document Due Date Download Document Due Date Stay Connected Sign up for email updates. Thank you! Your submission has been received! Oops! Something went wrong while submitting the form. Stay Connected Sign up for email updates. Thank you! Your submission has been received! Oops! Something went wrong while submitting the form. Thank you! Your submission has been received! Oops! Something went wrong while submitting the form. Thank you! Your submission has been received! Thank you! Your submission has been received! Oops! Something went wrong while submitting the form. Oops! Something went wrong while submitting the form. Contact Contact Directory Job Opportunities City of Richmond (765) 983-7200 50 North 5th Richmond, Indiana 47374 Contact Contact Directory Job Opportunities City of Richmond (765) 983-7200 50 North 5th Richmond, Indiana 47374 Contact Contact Directory Job Opportunities City of Richmond (765) 983-7200 50 North 5th Richmond, Indiana 47374 Contact Contact Directory Job Opportunities City of Richmond (765) 983-7200 50 North 5th Richmond, Indiana 47374 (765) 983-7200 50 North 5th Richmond, Indiana 47374 " -2474,https://delcopa.gov/publicrelations/releases/2022/delcopollingplacesfinalizedformay17primary.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Polling Places Finalized for the May 17 Primary Election - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Polling Places Finalized for the May 17 Primary Election""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Only registered Republicans and Democrats may participate at this Primary"", ""Additional Resources: The Election Hotline, Voter Service Center and the Delco Votes! website""]",[],[],"" -2475,https://brookfieldil.gov/publication/42413-april-24-2013-police-pension-board/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2476,https://ci.san-bernardino.ca.us/city_hall/police_department/crime_statistics/about_ucr_statistics/arson_statistics/arson_statistics-2018,Crime Statistics,Agency-Published Resources,Arson Statistics - 2018 - City of San Bernardino,"",200,Just a moment...,"[""City of San Bernardino California""]","[""Arson Statistics - 2018""]",[],[],[],[],Skip to Content -2477,https://www.roseville.ca.us/news/archive_news/2017_archive_news/police_digest__december_15__2017,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2478,http://www.greenvillenc.gov/government/police/community-services-and-crime-prevention/cops-and-barbers,Contact Info & Agency Meta,Info About Agencies,"Cops and Barbers | Greenville, NC","",200," - - Greenville, NC | Home - -","[""Greenville, NC"", ""Cops and Barbers""]","[""Jump to subpage..."", ""Related Links""]",[],[],[],[],Please enable JavaScript in your browser for a better user experience. -2479,https://delcopa.gov/publicrelations/releases/2020/courtsgovcenter.html,Not Criminal Justice Related,Not Criminal Justice Related,Government Center Closed to the public on March 16/Limited Court Operations March 16 and 17,"",200,"Delaware County, Pennsylvania","[""Government Center Closed to the public on March 16/Limited Court Operations March 16 and 17""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Government Center Closed to the public on March 16/Limited Court Operations March 16 and 17 Home / Departments / Public Relations Releases / Government Center Closed to the public on March 16/Limited Court Operations March 16 and 17 The Delaware County Government Center will be closed to the public on Monday, March 16. Government Center offices will operate with a reduced and staggered staff to ensure the continuity of government, however the offices will not be open to the public. Residents can call government offices on March 16 but are not able to access the building. The Delaware County Court of Common Pleas will be suspending all judicial operations on Monday, March 16, and Tuesday, March 17. A Common Pleas Court Judge will be available at the County Courthouse during regular business hours to hear temporary protection from abuse applications on March 16 and March 17. The Delaware County Magisterial Courts will be available, but only to conduct preliminary criminal arraignments and review afterhours temporary protection from abuse requests. On March 16, 2020 President Judge Kevin F. Kelly relatedly intends to file with the Pennsylvania Supreme Court an application under the Pennsylvania Rules of Judicial Administration seeking authorization to declare a judicial emergency, which if allowed will access various additional authorities to further address this public health crisis and the court’s ability to continue to provide critically essential judicial services. More details about the operations of the Delaware County Government Center, the Delaware County Court of Common Pleas and Magisterial District Courts will be released in the following days. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play " -2480,https://coloradosprings.gov/police-department/article/news/homicide-investigation-6600-block-bugle-dr,Media Bulletins,Agency-Published Resources,Homicide Investigation: 6600 Block of Bugle Dr. | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Homicide Investigation: 6600 Block of Bugle Dr.""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -2481,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0725/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2482,https://alpha.austin.gov/police-oversight/formal-complaint-de-escalation-of-potential-force-6/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2483,https://delcopa.gov/ems/pdfdocs/licensureprogramco/alsambulanceinspchklst.xls,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2485,https://www.madera.gov/home/departments/police/,Annual & Monthly Reports,Info About Agencies,Police Department - City of Madera,The Heart of California,200,City of Madera - Serving Residents in the Heart of California,"[""City of Madera Police Department""]","[""Department Overview"", ""Contact Information""]","[""Share this:""]",[],[],[],"" -2486,https://brookfieldil.gov/publication/11613-november-6-2013-fire-and-police-commission/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2487,https://beaverpa.us/a-message-from-the-police-department-2/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2488,https://delcopa.gov/ojs/ojsforms/15noticeofproposedrelocation.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2489,http://lafayettepolice.us/2359/brown-street,Not Criminal Justice Related,Not Criminal Justice Related,"Brown Street | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Brown Street""]","[""Brown Street Sewer""]","[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Government Services Our Community Business & Development How Do I... Transparency Home Government Departments H - W Stormwater Programs Green Infrastructure Brown Street Brown Street Brown Street Sewer This new sewer is required under the approved CSO Long Term Control Plan to store and convey wet weather flows to the Pearl River Lift Station. The Brown Street Sewer is located on the northwest side of Lafayette approximately 1,000 feet north of Main Street. It extends from a point just south of the intersection of Erie Street and Union Street and continues southwest along Erie Street, then northwesterly to a point near the intersection of Brown Street and 13 th Street, then along Brown Street to a point just west of the intersection of Brown Street and 3 rd Street. The Brown Street Sewer includes approximately 4,230 linear feet of 72 inch diameter gravity sewer, approximately 390 linear feet of 84 inch gravity sewer, and approximately 25 linear feet of 96 inch gravity sewer. This construction includes new green infrastructure, namely the PaveDrain® system, which has recently been installed along either side of the street. This new system will help reduce the potential for surcharging and flooding due to water on the roads, while also helping to protect and improve our river and streams. Additionally, a new backflow preventer has been installed at the existing CSO 002 outfall structure to prevent backflow from the Wabash River entering the City’s sewer collection system. The sewer also includes modifications to the existing CSO 002 headwall structure to accommodate the backflow preventer. See the PaveDrain® system being tested here ! Durkees Run Stormwater Park Brown Street Employment Utilities Payment Submit a Request Permits & Licensing Agendas & Minutes Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -2490,https://www.bedminster.us/police_fire_rescue/pottersville_volunteer_fire_co_,Not Criminal Justice Related,Not Criminal Justice Related,Pottersville Volunteer Fire Co. - Township of Bedminster,"",200,Just a moment...,"[""Bedminster Township""]","[""Pottersville Volunteer Fire Co.""]","[""Bedminster Township""]",[],[],[],"" -2491,https://brookfieldil.gov/publication/043009-april-30-2009-police-pension-board/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2492,https://www.goldenbeach.us/police-department/k-9-unit/,Contact Info & Agency Meta,Info About Agencies,k-9 Unit – Golden Beach: A Town Unlike Any Other,"",200,Golden Beach: A Town Unlike Any Other – The Town of Golden Beach,"[""k-9 Unit""]",[],"[""Quick Links"", ""Documents"", ""About Golden Beach"", ""Phone Numbers"", ""Town Hall""]","[""Annual Report 2022"", ""Annual Report 2021"", ""Annual Report 2020"", ""Annual report for 2019""]",[],[],Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide [hmapsprem id=1] Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide Menu Home About Golden Beach History of Golden Beach Message From The Mayor Message from the Town Manager Laws and Ordinances Government Town Council Town Council Meeting & Workshop Video Archive Town Manager Town Clerk Finance Department Building and Zoning New Permit and Contractor Registration Appointments Capital Improvement Projects (CIP) Department Police Department Public Works Resident Services Town Attorney Other Elected Officials Job Opportunities Residents Community Calendar Golden Beach Magazine Galleries Hurricane Guide Recreation Reservation Guide: New Tennis System Reserve West Tennis Court: #1 Reserve East Tennis Court: #2 Beach Pavilion Rules Doing Business Schedule Inspection Building Permitting Appointments Public Record Request Vendor Enrollment Budget Contact Us Town Guide Menu -2493,https://www.wakeforestnc.gov/communications/town-news/police-news,Media Bulletins,Agency-Published Resources,"Police News | Town of Wake Forest, NC","",200,"Town of Wake Forest, NC","[""Police News""]","[""joyner_park_1.jpg"", ""Town Hall Closed Friday, March 29"", ""Search form"", ""You are here"", ""Pages""]","[""Raleigh Water repairing sewer line along North White Street"", ""Crash closes eastbound lanes along Dr. Calvin Jones Highway/NC 98 Bypass"", ""Wake Forest Police warn residents (again) about Apple Pay, Venmo & other electronic payment scams"", ""Raleigh Water repairing sewer line along 6th Street"", ""Portion of Brick Street & East Chestnut Avenue closed while crews repair gas line"", ""WFFD battling brush fire off Burlington Mills Road"", ""Raleigh Water repairing water main along South Main Street/US 1A, detour in place"", ""Raleigh Water schedules closure Tuesday along North White Street"", ""Traffic Alert - Front Street"", ""Crash closes eastbound Durham Road/NC 98 near Flemming House Street""]",[],[],[],Skip to main content -2494,https://southbethany.delaware.gov/police-department/instruction-page-for-ticket-or-summons/,Poor Data Source,Poor Data Source,Instruction Page for Ticket or Summons - South Bethany,"",200,Home - South Bethany,"[""South Bethany""]","[""Instruction Page for Ticket or Summons""]","[""Menu""]",[],[],[],"Skip to Content Skip to Footer Toggle navigation Menu Government Administrative Staff Beach Patrol Mayor & Council Police Department Meetings & Events Calendar Ordinances and Resolutions Info About General Information Property Owners Visitors Animals (Wild & Domestic) Election 2024 Employment Emergency & Hurricane Information Flood Protection Information Forms & Fees History Local Links News & Notices Past Meeting Minutes & Agendas Town Code Boards/Committees Town Council Board of Adjustment Budget & Finance Committee (B&F) Canal Water Quality Committee Charter and Code Committee Community Relations Committee Planning Commission Resiliency Committee Ad Hoc Committees Online Payments Connect Meeting Email Notifications Sign-Up Town Inquiry Form Owner Contact Information Form FOIA Request Form Instagram Skip to Content Skip to Footer Toggle navigation Menu Government Administrative Staff Beach Patrol Mayor & Council Police Department Meetings & Events Calendar Ordinances and Resolutions Info About General Information Property Owners Visitors Animals (Wild & Domestic) Election 2024 Employment Emergency & Hurricane Information Flood Protection Information Forms & Fees History Local Links News & Notices Past Meeting Minutes & Agendas Town Code Boards/Committees Town Council Board of Adjustment Budget & Finance Committee (B&F) Canal Water Quality Committee Charter and Code Committee Community Relations Committee Planning Commission Resiliency Committee Ad Hoc Committees Online Payments Connect Meeting Email Notifications Sign-Up Town Inquiry Form Owner Contact Information Form FOIA Request Form Instagram Skip to Content Skip to Footer Toggle navigation Menu Government Administrative Staff Beach Patrol Mayor & Council Police Department Meetings & Events Calendar Ordinances and Resolutions Info About General Information Property Owners Visitors Animals (Wild & Domestic) Election 2024 Employment Emergency & Hurricane Information Flood Protection Information Forms & Fees History Local Links News & Notices Past Meeting Minutes & Agendas Town Code Boards/Committees Town Council Board of Adjustment Budget & Finance Committee (B&F) Canal Water Quality Committee Charter and Code Committee Community Relations Committee Planning Commission Resiliency Committee Ad Hoc Committees Online Payments Connect Meeting Email Notifications Sign-Up Town Inquiry Form Owner Contact Information Form FOIA Request Form Instagram NEW Construction Hours: 8 a.m. - 5 p.m. -No work on observed Federal Holidays year-round. More Info Town of South Bethany Delaware Listen Instruction Page for Ticket or Summons Instruction Page for Ticket or Summons Town of South Bethany Delaware Listen Instruction Page for Ticket or Summons Instruction Page for Ticket or Summons Listen Instruction Page for Ticket or Summons Instruction Page for Ticket or Summons Listen Instruction Page for Ticket or Summons Instruction Page for Ticket or Summons Listen Instruction Page for Ticket or Summons Instruction Page for Ticket or Summons Listen " -2495,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/102521summary1.pdf,Crime Statistics,Agency-Published Resources,"","",404,"","","","","","","","" -2496,https://www.roundrocktexas.gov/city-departments/police/divisions/,Contact Info & Agency Meta,Info About Agencies,Divisions - City of Round Rock,"",200,403 Forbidden,"[""Divisions""]",[],"[""Community Affairs"", ""Office of the Chief"", ""Criminal Investigations Division"", ""Patrol Division"", ""Special Operations Division"", ""Training Division"", ""Support Services"", ""Round Rock Police Department""]","[""Site Search"", ""Follow Us""]",[],[],"Home News Jobs Calendar Menu Home News Jobs Calendar Police About 9-1-1 Divisions Community Affairs Community Events Community Services Open Carry Information Public Outreach Request Round Rock Operation Blue Santa Volunteer Information Criminal Investigations Division Office of the Chief Internal Affairs Reports and Accreditation Officer Oath of Office Patrol Division Special Operations Division Animal Control Graffiti Abatement Towing Information Traffic Victim Assistance Support Services Nuisance Alarm Unit Training Division Recruiting Officer Whites Memorial Contact RRPD Menu Police About 9-1-1 Divisions Community Affairs Community Events Community Services Open Carry Information Public Outreach Request Round Rock Operation Blue Santa Volunteer Information Criminal Investigations Division Office of the Chief Internal Affairs Reports and Accreditation Officer Oath of Office Patrol Division Special Operations Division Animal Control Graffiti Abatement Towing Information Traffic Victim Assistance Support Services Nuisance Alarm Unit Training Division Recruiting Officer Whites Memorial Contact RRPD Divisions Home » Departments » Police » Divisions Facebook Instagram Phone-alt Comment-alt Exclamation Fingerprint For emergencies, call 911 Community Affairs The Community Affairs unit collaborates with a variety of community groups and organizations to meet a wide range of needs. Office of the Chief The Office of the Chief houses our Professional Standards, Internal Affairs, and Community Affairs units. Criminal Investigations Division The Criminal Investigations Division strives to investigate and solve crimes in a timely manner with a positive outcome for the citizens and businesses in Round Rock. Patrol Division We work in cooperation with community members and are proactive in our approach to resolving crime concerns and quality of life issues facing our community. Special Operations Division Special Operations Division is responsible for the School Resource Officer, Motorcycle, DWI, and Animal Control Unit, as well as Victim Services. Training Division The Training Division provides the latest training in law enforcement knowledge and skills, enhance leadership abilities, and promote a solid ethical foundation to our workforce. Support Services The Support Services Division is comprised of civilian personnel who are responsible for all public safety communications for police, fire and animal control. Round Rock Police Department 2701 North Mays Street Round Rock, Texas 78665 Emergencies: 9-1-1 Non-emergency Line: 512-218-5500 File a Report: 512-218-5500 Victim Assistance: 512-341-3124 VIEW POLICE CONTACT INFO Home About Services Departments Businesses Menu Home About Services Departments Businesses Quick Links News Calendar Jobs City Council Sitemap Website Feedback Services Service Request Service Directory Payment Center Development/Permit Tracker Open Records Center Public Notices Stay Connected Staff Directory Mobile Apps Alerts Sign Up E-Subscribe City of Round Rock 221 East Main Street Round Rock, TX 78664 512-218-5400 Site Search Search Search Follow Us Facebook Home Youtube Instagram " -2497,https://delcopa.gov/planning/pdf/agendas/2022/agenda202201.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2498,https://www.ci.northville.mi.us/services/police_department/police_news/joashua_clines_joins_police_dept_,Media Bulletins,Agency-Published Resources,"Joashua Clines joins Police Dept. - City of Northville, MI",Officer Clines has a degree from Auburn University in his home state of Alabama but his true calling is serving as a police officer.,200,Just a moment...,"[""Joashua Clines joins Police Dept.""]",[],[],[],[],[],Skip to Content -2499,https://southamptontownnypolice.gov/faq.aspx?qid=102,Not Criminal Justice Related,Not Criminal Justice Related,"FAQs • What land can be preserved through the TDR program, a","",200,"Police | Southampton, NY - Official Website",[],"[""▼ Transfer of Development Rights""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2500,https://www.ci.auburn.in.us/wp-content/uploads/2017/11/auburnpolicecar-1000x650.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2501,https://delcopa.gov/controller/pdf/retirement/2021/210310minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2502,https://www.hayward-ca.gov/discover/news/jun22/police-blotter-may-22-28-2022,Crime Statistics,Agency-Published Resources,"Police Blotter: May 22-28, 2022 | City of Hayward - Official website","STATISTICAL HIGHLIGHTSMay 22-28, 2022 Weekly Arrests (Includes cite/released):42 Homicide 0Weekly Calls for Service: 1,981 Assault—Great Bodily Injury 7Weekly Reports Taken:174 Burglary— Nonresidential 10Weekly Complaints(against HPD):1 Burglary—Residential 0Weekly Calls Received:5,537 Theft 19This data is subject to change and based on crimes that were reported to have",200,City of Hayward - Official website,"[""Police Blotter: May 22-28, 2022""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form"", ""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment""]",[],"[""STATISTICAL HIGHLIGHTS"", ""May 22-28, 2022"", """", """", """", ""Significant Incidents"", ""Do you need help paying energy bills? You may qualify for federal aid."", ""Hayward Receives Grant for Safe Routes to Schools Infrastructure and Bicycle Incentives"", ""Hayward Celebrates Earth Day at Weekes Park!"", ""Spring 2024 Compost Giveaway"", ""Sustainable Solutions for Celebrating Easter"", ""City Hall and Nonessential Services Closure: Monday, Apr. 01, 2024"", ""Presidential Primary Election: Tuesday, Mar. 5, 2024"", ""Library Closure: February 12 and February 19, 2024."", ""City Hall and Nonessential Services Closures: Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""YOU ARE HERE. SO IS EVERYTHING ELSE."", ""Related News"", ""Police Blotter - February 25-March 2, 2024"", ""Weekly Blotter - February 18-24, 2024"", ""Police Blotter - February 11-17, 2024"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],Skip to main content -2503,https://www.mass.gov/doc/camacho-michael-v-mass-environmental-police-1815/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -2504,https://camptonhills.illinois.gov/police-pension-fund-board/,Contact Info & Agency Meta,Info About Agencies,Police Pension Fund Board – Village of Campton Hills,"",200,Village of Campton Hills – Village of Campton Hills Website,[],"[""Police Pension Fund Board"", ""Purpose"", ""Board Members"", ""Daniel Hoffman"", ""Thomas L. Clark"", ""Randy Johnson"", ""Tom Blincoe"", ""William Mair"", ""© 2024 All Rights Reserved Village of Campton Hills.""]",[],"[""Police Pension Fund Meeting"", ""Recognition"", ""Follow Us"", ""Important Links"", ""Contact Us""]",[],[],"(630) 584-5700 M-F  9AM - 4PM Report A Concern | CONTACT US MENU MENU Government Committees & Commissions Community Relations Commission Finance Committee Fire & Police Commission IT Adhoc Committee Plan Commission/Zoning Board of Appeals Police Pension Fund Board Public Works Committee Village Board Zoning Commission Departments Administration & Finance Building & Zoning Police Department Codes, Ordinances & Resolutions Village Code Village Ordinances Village Resolutions Transparency Agendas & Meeting Minutes Annual Budgets & Audits Annual Financial Reports Annual Meeting Calendar Bids & Requests for Proposals Compensation & Benefits Contact Directory IMRF Employer Cost and Participation Information Contracts Public Information (FOIA) Lobbying Taxes & Fees Treasurer’s Reports and Warrants Planning Reports Volunteer Committee Volunteer Form Police Department Police Department Home Page Adjudication Hearing Officer & Information Animal Control Chief Of Police Reports Code Red Community Notifications Crash Report Employment Opportunities K9 Unit Meet the Officers Letters of Appreciation Sex Offender Registration & Map Programs & Services Alice Training Citizen Police Academy Community Crisis Center Illinois Premise Alert Program IL Sec. of State’s Emergency Contact Database Project ChildSafe Information Ride-Along Program Ring Neighbors App Too Good For Drugs Forms & Permits Alarm Registration Form Application for Letter of Good Conduct Civil/Ordinance Violation Local Records Search Request Officer Commendation & Complaint Information Overweight/Oversize Permits Public Records Request (FOIA) Vacation Check Form Business & Development Business Directory Forms Liquor License Application Peddlers, Solicitors & Mobile Food Vendor Licenses Resources Zoning Code Update Project 2022 For Residents Campton Community About the Community & Events School Districts, Colleges & Universities Welcome Booklet Forms Building Permit Application Resources Building Permit Info Campton Township Highway District Coronavirus Resources Electricity Aggregation Emergency Preparedness Emergency Volunteers Training Fire Districts Election Information Polling Place Lookup Issued Solicitors Permits Kane County GIS Map Mental Health and Substance Use Resources Utilities & Services How Do I Contact Directory Fire Protection Districts Police Department Utilities & Services Village Board Members Village Hall Find Agendas & Meeting Minutes Bids & Requests for Proposals Document Library Employment Opportunities Peddlers, Solicitors & Mobile Food Vendor Licenses Village Calendar File/Apply Alarm Registration Form Application for Letter of Good Conduct Building Permit Application Civil/Ordinance Violation Local Records Search Request Committee Volunteer Form Public Records Request (FOIA) Officer Commendation & Complaint Report A Concern Form Solicitors Permit Applications Stormwater/Drainage Concern Form Subscribe to Community Counts Newsletter Vacation Check Form Search Search " -2505,https://beaumonttexas.gov/beaumont-police-arrest-a-man-and-woman-after-committing-an-aggravated-robbery-at-6155-eastex/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2506,https://ci.san-bernardino.ca.us/city_hall/police_department/sb_978/new_patrol_rifle_powerpoint_complete,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -2507,https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-47/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2508,https://coloradosprings.gov/police-department/page/professional-standards-division,Poor Data Source,Poor Data Source,"","",403,"","","","","","","","" -2509,https://delcopa.gov/courts/admininstration/lap.html,Contact Info & Agency Meta,Info About Agencies,Language Access Plan - Delaware County Court of Common Pleas,"",200,"Delaware County, Pennsylvania","[""Language Access Plan""]",[],"["""", ""Court Administration Navigation"", ""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[],"" -2510,https://www.foxcrossingwi.gov/event/police-fire-commission/,Poor Data Source,Poor Data Source,Police & Fire Commission - Fox Crossing Fox Crossing,"",200,Fox Crossing - Bridging the Fox Cities Fox Crossing,"["""", """", ""Police & Fire Commission""]","[""mtg05-19-2015pol&fire""]",[],[],[],[],"Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing Spring Recycling Event April 27th Informational Announcement – Outstanding Absentee Ballots for the April 2, 2024 Presidential Preference Primary & Spring Election Deadlines for April 2nd Spring Election & Presidential Preference Primary Spring/Summer Recreation Programs Signup for Village Notifications Current Job Opportunities Fox Crossing 2000 Municipal Drive Neenah, WI 54956 920-720-7100 Police & Fire Commission Calendar Add to Calendar Add to Timely Calendar Add to Google Add to Outlook Add to Apple Calendar Add to other calendar Export to XML When: May 19, 2015 @ 5:00 pm – 6:00 pm 2015-05-19T17:00:00-05:00 2015-05-19T18:00:00-05:00 Police & Fire Commission mtg05-19-2015pol&fire application/pdf Copyright © 2010 - 2024 Fox Crossing, All Rights Reserved. Professional Web Site Design by Sandstone Digital. Disclaimer Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing Spring Recycling Event April 27th Informational Announcement – Outstanding Absentee Ballots for the April 2, 2024 Presidential Preference Primary & Spring Election Deadlines for April 2nd Spring Election & Presidential Preference Primary Spring/Summer Recreation Programs Signup for Village Notifications Current Job Opportunities Fox Crossing 2000 Municipal Drive Neenah, WI 54956 920-720-7100 Police & Fire Commission Calendar Add to Calendar Add to Timely Calendar Add to Google Add to Outlook Add to Apple Calendar Add to other calendar Export to XML When: May 19, 2015 @ 5:00 pm – 6:00 pm 2015-05-19T17:00:00-05:00 2015-05-19T18:00:00-05:00 Police & Fire Commission mtg05-19-2015pol&fire application/pdf Copyright © 2010 - 2024 Fox Crossing, All Rights Reserved. Professional Web Site Design by Sandstone Digital. Disclaimer " -2511,https://southamptontownnypolice.gov/1387/final-supplemental-geis,Not Criminal Justice Related,Not Criminal Justice Related,"FINAL Supplemental GEIS | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""FINAL Supplemental GEIS""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Master Plans - By Hamlets (Adopted) Hampton Bays Hampton Bays Business District FINAL Supplemental GEIS FINAL Supplemental GEIS Final-SFGEIS-Hampton-Bays-Downtown-Overlay-District--Jan-2020- Downtown Overlay District 11-2-22 Draft Supplemental GEIS / Hampton Bays Downtown FINAL Supplemental GEIS SEQRA Findings STP Engineering Report Hampton Bays Downtown Business District Planning Hampton Bays Conceptual Design Survey Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Master Plans - By Hamlets (Adopted) Hampton Bays Hampton Bays Business District FINAL Supplemental GEIS FINAL Supplemental GEIS Final-SFGEIS-Hampton-Bays-Downtown-Overlay-District--Jan-2020- Downtown Overlay District 11-2-22 Draft Supplemental GEIS / Hampton Bays Downtown FINAL Supplemental GEIS SEQRA Findings STP Engineering Report Hampton Bays Downtown Business District Planning Hampton Bays Conceptual Design Survey Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -2512,http://www.lafayettepolice.us/438/online-crime-reporting,Contact Info & Agency Meta,Info About Agencies,"Online Crime Reporting | Lafayette, IN - Official Website",Our goal is to provide you with an easy to use tool for reporting crime in the City of Lafayette.,200,"Police Department | Lafayette, IN - Official Website","[""Online Crime Reporting""]","["""", ""Instructions & Information About Your Online Report""]","[""Reports Not Accepted With This Form"", ""Reporting Categories"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2513,https://delcopa.gov/publicrelations/releases/2019/newvotingsystem.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Council Approves purchase of New Voting System - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Council Approves purchase of New Voting System""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Council unanimously votes to purchase Hart Verity 2.3.4 Voting System""]",[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Delaware County Council Approves purchase of New Voting System Home / Departments / Public Relations Releases / Delaware County Council Approves purchase of New Voting System Council unanimously votes to purchase Hart Verity 2.3.4 Voting System Delaware County Council unanimously voted to purchase Hart Verity 2.3.4 Voting System during the Oct. 23 public council meeting. The system, as well as supporting items, will be purchased through the PA COSTARS Cooperative Purchasing Program, at a cost not to exceed $6,080,832 plus consumables such as thermal paper and printer toner cartridges. The County’s Board of Elections, Delaware County Council and the County’s Executive Director began researching new voting systems in 2017 to identify systems that would meet the new federal and state requirements. In Pennsylvania, every voting system and paper ballot must include plain text that voters can read to verify their choices before casting their ballot. Election officials will also use the plain text to perform pre-election testing and post-election audits and recounts. The County held a public forum and demonstration to ascertain the public’s input on five proposed voting systems. After assessing public input and gathering research, the County’s Board of Elections submitted their recommendation of the Hart Verity Voting 2.3.4 Voting System to Council. The system was certified by the PA Department of State on May 1, 2019, and is a paper ballot system that offers security to voters and includes plain text which voters can read to verify their vote before casting their ballot. The new voting machines will be used in the 2020 Primary, as mandated by Governor Wolf. Information on the Hart Verity 2.3.4 Voting System can be found here: www.votespa.com/About-Elections/Pages/Hart-InterCivic-Verity-Voting-234.aspx Previous Next Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play " -2514,https://delcopa.gov/purchasing/bidsprops/cadserver_e-102121.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2515,https://scrantonpa.gov/wpdm-package/police-union-collective-bargaining-agreement-exp-2021/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2517,https://www.danversma.gov/documents/records-and-billings-clerk-police-department/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2518,https://beaumonttexas.gov/beaumont-police-detectives-charge-2-in-august-25-2021-homicide-aggravated-robbery/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2519,https://health.wyo.gov/publichealth/immunization/influenza-flu/stethoscope-3/,Not Criminal Justice Related,Not Criminal Justice Related,"","",404,"","","","","","","","" -2520,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0348/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2521,http://lafayettepolice.us/1086/i-want-to,Not Criminal Justice Related,Not Criminal Justice Related,"I Want To... | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""I Want To...""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]","[""...book a birthday party"", ""...find out more about camps and classes"", ""...schedule a tour"", ""...find out more about school visits"", ""...become a member"", ""...volunteer at the zoo"", ""...find out about special events"", ""...reserve a picnic shelter"", ""...get information about the water park""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About the Zoo Get Involved Education Programs Special Events I Want To... Home Government Departments H - W Parks & Recreation Facilities Columbian Park Zoo I Want To... I Want To... 9 1 1 1 ...book a birthday party Link to page ...find out more about camps and classes Link to page ...schedule a tour Link to page ...find out more about school visits ...find out more about school visits Link to page ...become a member Link to page ...volunteer at the zoo Link to page ...find out about special events Link to page ...reserve a picnic shelter Link to page ...get information about the water park Link to page ...book a birthday party ...find out more about camps and classes ...schedule a tour ...find out more about school visits ...become a member ...volunteer at the zoo ...find out about special events ...reserve a picnic shelter ...get information about the water park Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About the Zoo Get Involved Education Programs Special Events I Want To... Home Government Departments H - W Parks & Recreation Facilities Columbian Park Zoo I Want To... I Want To... 9 1 1 1 ...book a birthday party Link to page ...find out more about camps and classes Link to page ...schedule a tour Link to page ...find out more about school visits ...find out more about school visits Link to page ...become a member Link to page ...volunteer at the zoo Link to page ...find out about special events Link to page ...reserve a picnic shelter Link to page ...get information about the water park Link to page ...book a birthday party ...find out more about camps and classes ...schedule a tour ...find out more about school visits ...become a member ...volunteer at the zoo ...find out about special events ...reserve a picnic shelter ...get information about the water park Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -2522,https://police.bixbyok.gov/224/submit-a-tip,Contact Info & Agency Meta,Info About Agencies,"Submit a Tip | Bixby Police Department, OK",If you observe an emergency or crime in progress please call 911 or contact Bixby Communications Non-Emergency number 918-366-8294.,200,"Bixby Police Department, OK | Official Website","[""Submit a Tip""]","[""Suspicious Activities & Tips"", ""Or""]","[""Metro Crime Stoppers App"", ""National Center for Missing & Exploited Children ( NCMEC )"", ""Federal Bureau of Investigations"", ""Oklahoma Information Fusion Center ( OIFC )"", ""Helpful Links"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Police Services Community Services Emergency Management How Do I... Home Community Services Submit a Tip Submit a Tip If you observe an emergency or crime in progress please call 911 or contact Bixby Communications Non-Emergency number 918-366-8294. Please, without putting yourself in harms way, be as detailed as possible and give specific names, descriptions, tag information and times of day. Suspicious Activities & Tips Please also assist us by utilizing the following reporting and tips services: Metro Crime Stoppers App Citizens can now at their discretion, download the Tulsa Metro Crime Stoppers App . National Center for Missing & Exploited Children ( NCMEC ) For reporting Cyber Crimes against Children please use the tip line on the NCMEC website . Federal Bureau of Investigations For scams, internet crimes or fraud, use the FBI Tip Form . Oklahoma Information Fusion Center ( OIFC ) Use the Suspicious Activity Report form , used to report any type of suspicious activity to the Oklahoma Information Fusion Center . Or use our Online Tip form . Community Relations Community Events Alive at 25 Business Crime Watch Neighborhood Watch Child ID Kit Car Seat Checks Citizen Police Academy Junior Police Academy Community Emergency Response Team (CERT) Prescription Drug Disposal Box Safety and Security Family Safety Holidays Halloween Winter Holiday Identity Theft Internet Residential Safety Vehicle Safety Shop With a Cop Submit a Tip FAQs Forms Helpful Resources & Links Safety Tips Recruitment File a Report Community Relations City of Bixby offender lookup Records Request Bixby City Codes Submit a Tip Nixle Alerts FAQs Helpful Links Animal Control Car Seat Checks Forms Records /QuickLinks.aspx FAQs Does the City of Bixby have any Curfew Laws? How can I get Traffic enforcement or the speed trailer in my area? Will Bixby Fire or Police Department assist me in the installation of my child car seat? /FAQ.aspx Site Links Home Site Map Accessibility Disclaimer Copyright Notices /QuickLinks.aspx 116 W Needles, P.O. Box 70 Bixby, OK 74008 Phone: 918-366-8294 Fax: 918-366-2050 Government Websites by CivicPlus® " -2523,https://www.deerpark-oh.gov/departments/police-department/police-department-contacts/,Contact Info & Agency Meta,Info About Agencies,Departments - Police Department - Police Department Contacts | City of Deer Park,"",200,Home - City of Deer Park,"[""Police Department Contacts""]",[],"[""E-Mail List""]","[""Police Officers work odd hours and have other obligations such as court appearances or training that can make contacting them difficult.""]",[],[],"Skip to Main Content News Events 513.794.8860 Visit Our Facebook Page × search Custom Search Sort by: Relevance Relevance Date Home About About Deer Park Our Mission History Historical Society Residents FAQs Residents Tax Forms & Filing Information Waste Collection Dump Truck Rental Recycling Building Permits Newsletter Energy Aggregation Sidewalk Program CRA Tax Abatement Program Yard / Garage Sale Regulations Local & Community Groups Polling Places Local & Community Links Public Records Policy Business Business Share The Vision Economic Development Comprehensive Plan Boards and Commissions Zoning Code Departments Administration Police Department Fire Department Maintenance Department Tax Department Park Department Building Permits and Inspections Planning and Zoning Department Government Facility Rental Rental Information & Forms Rental Availability Community Center Photos Contact View Menu About Residents Business Departments Facility Rental News Events Contact Police Department Contacts Categories Administration Administration City Manager Police Department About the Police Department Police Department Contacts Citizens' Block Watch Program Mayors Court Vacation Home Checks Fire Department Maintenance Department Service Department Waste Collection Recycling Brush Chipping Regulations Leaf Collection Program Sidewalk Program Holiday Waste Collection Tax Department Tax Department Resident Tax Forms Business Tax Forms Prior Years Tax Forms JEDZ / JEDD Tax Forms Income Tax Code Due Dates Park Department Parks and Recreation Upcoming Park Events Party in the Park (Summer Music Series) Yoga in the Park Park Board Members Francis R. Healy Community Center Building Permits and Inspections Planning and Zoning Department Government Police Officers work odd hours and have other obligations such as court appearances or training that can make contacting them difficult. The best way to contact a specific officer by phone is to call the non-emergency line at 513-791-8056 and request the Clerk connect you to the Officer's voicemail. You may also contact them via the e-mail list below. E-Mail List Chief David Battin  - davidbattin@deerpark-oh.gov LT Robert Miller  - robertmiller@deerpark-oh.gov LT Kevin Farmer  - kevinfarmer@deerpark-oh.gov LT Jeremy Jordan  - jeremyjordan@deerpark-oh.gov PO Robert Voland  - robertvoland@deerpark-oh.gov PO Greg Kleeman  - gregkleeman@deerpark-oh.gov PO Derek Noland  - dereknoland@deerpark-oh.gov PO James Murphy - PO Jacob Johnson jacobjohnson@deerpark-oh.gov PO Ryan Faehr     - ryanfaehr@deerpark-oh.gov PO Clint Townsend - clinttownsend@deerpark-oh.gov CLK Lisa Sax  - lisasax@deerpark-oh.gov CLK Josey Huneke  - joseyhuneke@deerpark-oh.gov CLK Robert Keefe, Jr.  - robertkeefe@deerpark-oh.gov CLK Hannah Miller - Visit Our Facebook Page 7777 Blue Ash Rd. Deer Park, OH 45236 513.794.8860 Home About Residents Business Departments Facility Rental News Events Contact © Copyright 2024 Legend Web Works, LLC ADA Policy | Privacy Policy Copied! ^ TOP close ModalContent " -2524,https://delcopa.gov/planning/pdf/mapping/eddystone.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -2525,https://www.coppelltx.gov/1054/special-interest-funding,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2526,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/043022summary.pdf,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2527,https://delcopa.gov/council/2018minutes/080818minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2528,https://delcopa.gov/planning/pdf/agendas/2019/agenda201910.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -2529,https://delcopa.gov/courts/index.html,Resources,Agency-Published Resources,Delaware County Court of Common Pleas,"",200,"Delaware County, Pennsylvania",[],"[""Delaware County court of common pleas:""]","[""Juror eResponse"", ""E-Filing"", ""Magisterial District Judges"", ""Domestic Relations"", ""Second Chance Court"", ""Pennsylvania’s Unified Judicial System"", ""Employment Opportunities"", ""Notice to the Public"", ""Updates:"", ""Emergency Orders:"", ""Contact Us"", ""Court Quick Links:"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -2530,https://www.mass.gov/doc/2022-police-sergeant-3yp-442-exam-poster/download,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -2531,https://www.southamptontownnypolice.gov/faq.aspx?qid=126,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Does the Town of Southampton have a community advocac,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Community Services""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2532,https://delcopa.gov/publicrelations/releases/2018/18spottedlanternfly.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2533,https://www.southamptontownnypolice.gov/faq.aspx?qid=120,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • What is my assessment based on?,"",200,"Police | Southampton, NY - Official Website",[],"[""▼ Assessor’s Office""]","[""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2534,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0442/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -2535,https://mukilteowa.gov/news/mukilteo-police-department-public-safety-community-survey/,Media Bulletins,Agency-Published Resources,"City of Mukilteo - | Mukilteo Police Department Public Safety Community Survey - City of Mukilteo","",200,403 Forbidden,"[""Mukilteo Police Department Public Safety Community Survey""]","[""Sign up for notifications""]","[""""]",[],[],[],COVID-19 Alert - City of Mukilteo Response COVID-19 Alert - City of Mukilteo Response -2536,http://www.lafayettepolice.us/771/tactical-rescue-team,Contact Info & Agency Meta,Info About Agencies,"Tactical Rescue Team | Lafayette, IN - Official Website","The Tactical Rescue Team is highly trained in rope rescue, confined space rescue, trench rescue and structural collapse.",200,"Police Department | Lafayette, IN - Official Website","[""Tactical Rescue Team""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2537,https://hutchinsonmn.gov/departmentsfacilities/police-services/annual-report/,Annual & Monthly Reports,Info About Agencies,"","",200,"","","","","","","","" -2538,https://alpha.austin.gov/police-oversight/formal-complaint-purpose-and-scope-impartial-attitude-and-courtesy-secure-and-identify-witnesses-and-other-policy-violations/,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -2539,https://www.southamptontownnypolice.gov/1370/2020-budgets,List of Data Sources,Info About Agencies,"2020 Budgets | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""2020 Budgets""]",[],"[""Site Tools"", ""2020 Budget"", ""Contact Us"", ""Site Links"", ""Loading""]","[""2020 Adopted Budget - Capital"", ""2020 Adopted Budget - Operating"", ""2020 Tentative Budget - Operating"", ""2020 Tentative Budget - Capital""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Finance (Comptroller) 2020 Budgets 2020 Budgets 9 1 1 1 2020 Budget 2020 Adopted Budget - Capital Link to page 2020 Adopted Budget - Operating Link to page 2020 Tentative Budget - Operating Link to page 2020 Tentative Budget - Capital Link to page 2020 Adopted Budget - Capital 2020 Adopted Budget - Operating 2020 Tentative Budget - Operating 2020 Tentative Budget - Capital Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Finance (Comptroller) 2020 Budgets 2020 Budgets 9 1 1 1 2020 Budget 2020 Adopted Budget - Capital Link to page 2020 Adopted Budget - Operating Link to page 2020 Tentative Budget - Operating Link to page 2020 Tentative Budget - Capital Link to page 2020 Adopted Budget - Capital 2020 Adopted Budget - Operating 2020 Tentative Budget - Operating 2020 Tentative Budget - Capital Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -2540,https://www.coppelltx.gov/1083/sunshine-room,Not Criminal Justice Related,Not Criminal Justice Related,"Sunshine Room | Coppell, TX","",200,"Coppell, TX | Official Website","[""Sunshine Room""]","[""Hours"", ""Pricing"", ""Policies""]","[""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Parks & Trails Facilities Rentals Activities Home Government City Departments Community Experiences Facilities The CORE Sunshine Room Sunshine Room Hours Monday - Friday: 8 am - 12:30 pm Pricing Monthly memberships and day passes are only available for purchase in-person at The CORE front desk. $4 / Day / Per Child $20 / Monthly Pass / Per Child $15 / Monthly Pass / Additional Child *Limit 2 hours per day* Policies Monthly membership or full payment at the front desk is required at drop off time. Please give day pass receipts to playroom attendant. Reservations are not required, but are recommended during peak times. Space is limited. The Sunshine Room will close 30 minutes before scheduled closing time if no children are in the room and there are no reservations. Children ages 6 weeks through 9 years are welcome to visit the Sunshine Room for a maximum of 2 hours per day. The time limit of 2 hours is strictly enforced. Only parents and legal guardians may drop off and pick up children. Parents must always remain on the premises of The CORE while their child is in the Sunshine Room. Premises include Kid Country, and fire lanes around the building. Playroom attendants will assess behavioral issues on a case-by-case basis and redirection towards other activities will be used as a first solution. If needed, time out will be used before a parent is contacted. No outside toys or food will be permitted. Please also do not bring phones, iPads, or game soles. Aquatics Fitness Group Exercise Classes Rentals Sunshine Room Agendas & Minutes Alert Sign-Up Citizen Report E-News Pay Water Bill Permits 255 E. Parkway Blvd., P.O. Box 9478, Coppell, TX 75019 Phone: 972-462-0022 | Email us Site Map Contact Us Accessibility Copyright Notices Privacy Policy Employee Login /QuickLinks.aspx Government Websites by CivicPlus® " -2541,https://www.jacksontn.gov/government/departments/police/command_staff/captain_jeff_shepard,Personnel Records,Info About Officers,"Captain Jeff Shepard - City of Jackson, TN",Welcome to the official website of City of Jackson in Tennessee.,200,Just a moment...,"[""City of Jackson TN"", ""City of Jackson TN""]","[""Captain Jeff Shepard""]",[],[],[],[],"" -2542,https://www.antioch.il.gov/wpfb-file/12-06-14-police-and-fire-agenda-pdf-3/,Poor Data Source,Poor Data Source,"12-06-14 Police And Fire Agenda - Antioch, IL",9050 12 06 14 police and fire agenda pdf commissions commission agendas 2014 1417710895 78bd0244bc4e662012baf7d5e1f731d0 219x300 _g9ufrmyiaujy thumb jpg 04 11 34 55 0 pdf application trustees dennis b crosby jay jozwiak mary c dominiak scott a pierce jerry t johnson ted p poulos lawrence m hanson mayor lori k folbrick village clerk notice of,200,"Home - Antioch, IL","[""12-06-14 Police And Fire Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -2543,https://delcopa.gov/treasurer/propertyassessment.html,Not Criminal Justice Related,Not Criminal Justice Related,"Property Assessment - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Property Assessment""]",[],"[""Treasurer Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Property Assessment Home / Departments / Treasurer Office / Property Assessment Board of Assessments and Appeals Maps - GIS Map Costs * Treasurer Navigation Property Taxes Tax Certifications Property Assessment Board of Assessments & Appeals Property Sales Licenses Other Functions Treasurer Office James P. Hackett, Treasurer Government Center, Ground Floor 201 W. Front St. Media, PA 19063 Phone: 610-891-4273 Fax: 610-891-4883 Operating Hours 8:30 AM to 4:30 PM. Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Property Assessment Home / Departments / Treasurer Office / Property Assessment Property Assessment Home / Departments / Treasurer Office / Property Assessment Property Assessment Home / Departments / Treasurer Office / Property Assessment Board of Assessments and Appeals Maps - GIS Map Costs * Treasurer Navigation Property Taxes Tax Certifications Property Assessment Board of Assessments & Appeals Property Sales Licenses Other Functions Treasurer Office James P. Hackett, Treasurer Government Center, Ground Floor 201 W. Front St. Media, PA 19063 Phone: 610-891-4273 Fax: 610-891-4883 Operating Hours 8:30 AM to 4:30 PM. Board of Assessments and Appeals Maps - GIS Map Costs * Treasurer Navigation Property Taxes Tax Certifications Property Assessment Board of Assessments & Appeals Property Sales Licenses Other Functions Treasurer Office James P. Hackett, Treasurer Government Center, Ground Floor 201 W. Front St. Media, PA 19063 Phone: 610-891-4273 Fax: 610-891-4883 Operating Hours 8:30 AM to 4:30 PM. Treasurer Navigation Property Taxes Tax Certifications Property Assessment Board of Assessments & Appeals Property Sales Licenses Other Functions Treasurer Navigation Treasurer Office James P. Hackett, Treasurer Government Center, Ground Floor 201 W. Front St. Media, PA 19063 Phone: 610-891-4273 Fax: 610-891-4883 Operating Hours 8:30 AM to 4:30 PM. " -2544,https://delcopa.gov/ojs/ojsforms/rulesconfidentiality.pdf,Records Request Info,Agency-Published Resources,"","",200,"","","","","","","","" -2545,https://virginiabeach.gov/whats-up/whats-new/commonwealth-v-jasper-miles-wynn-60-years-to-serve-for-shooting-at-police-following-7-eleven-robbery,Not Criminal Justice Related,Not Criminal Justice Related,"","",404,"","","","","","","","" -2546,http://www.ryepolice.us/chief/attachment/chiefphoto,Poor Data Source,Poor Data Source,Rye Police Department Chief Kevin Walsh - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Chief Kevin Walsh""]","[""Chief Kevin Walsh""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],"­ Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Chief Kevin Walsh Home Chief Kevin Walsh Chief Kevin Walsh February 5, 2014 Navigation About Rye Animal Control Announcements Beach Information Careers Chief’s Message Computer Crime Contact Us Coronavirus Crime Prevention Directions Domestic Violence FAQ Firearms Safety Fireworks Forms Identity Theft Mission Statement Parking Payments Personnel Police Logs Prescription Drug Disposal Press Releases Report Request Town Ordinances Victim Services West Nile / EEE Follow Us Facebook Email Updates Subscribe to our newsletter. We promise you won't get flooded with junk! Email * Storm Preparedness Guide Developed by ThemeMakers Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Emergency: 911 Non-Emergency: (603) 964-5522 Business: (603) 964-7450 Fax: (603) 964-7458 Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Navigate... Chief’s Message Crime Prevention - Victim Services - Domestic Violence - Computer Crime - Identity Theft Press Releases Police Logs Events - Event Permits - Beach Permits FAQ Contact Us Search Chief’s Message Crime Prevention Victim Services Domestic Violence Computer Crime Identity Theft Press Releases Police Logs Events Event Permits Beach Permits FAQ Contact Us Search " -2547,https://police.greenvillesc.gov/faq.aspx?qid=213,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Can other people operate under my license?,"",200,"Police Department | Greenville, SC - Official Website",[],"[""▼ Business Licenses - General""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -2548,https://www.stpaul.gov/news/mayor-melvin-carter-statement-saint-paul-police-officer-involved-shooting-midway-neighborhood,Media Bulletins,Agency-Published Resources,Mayor Melvin Carter Statement on Saint Paul Police Officer-Involved Shooting in Midway Neighborhood | Saint Paul Minnesota,"FOR IMMEDIATE RELEASE September 15, 2019",200,Home | Saint Paul Minnesota,"[""Mayor Melvin Carter Statement on Saint Paul Police Officer-Involved Shooting in Midway Neighborhood""]","[""Main Navigation"", ""Popular Topics"", ""Footer""]","[""You are using an unsupported browser. Please use Microsoft Edge."", ""Contact The City"", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[],"" -2549,http://www.lafayettepolice.us/753/process-overview,Not Criminal Justice Related,Not Criminal Justice Related,"Process Overview | Lafayette, IN - Official Website",General building plan review is initiated through the City's Engineering Department.,200,"Police Department | Lafayette, IN - Official Website","[""Process Overview""]","[""Additional Information""]","[""Quick Links"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Operations Prevention Recruitment How Do I... Home Government Departments A - F Fire Department Prevention Contractors & Designers Process Overview Process Overview General building plan review is initiated through the City's Engineering Department. This overview is not intended to replace the City Engineering Plan Review requirements. This process overview is for reference only. Specific fire protection system plans may be submitted directly to the Fire Department. Please note that the fire protection system acceptance tests must be completed prior to the building Final Inspection. The Lafayette Fire Department does not issue permits or Certificates of Occupancy. Additional Information City of Lafayette Engineering Department forms Indiana State (IDHS) Plan Review Please contact the City of Lafayette Engineering Office to schedule an inspection at 765-807-1050. Quick Links LFD Sprinkler Pre Acceptance Test Checklist (PDF) LFD Site Plan Review Worksheet (PDF) Commercial Kitchen Operations Cover Sheet (PDF) View All Links /QuickLinks.aspx Indiana Building Code Occupancy Classifications Community Outreach Fire Stations Submit a Request History Photo Gallery Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Operations Prevention Recruitment How Do I... Home Government Departments A - F Fire Department Prevention Contractors & Designers Process Overview Process Overview General building plan review is initiated through the City's Engineering Department. This overview is not intended to replace the City Engineering Plan Review requirements. This process overview is for reference only. Specific fire protection system plans may be submitted directly to the Fire Department. Please note that the fire protection system acceptance tests must be completed prior to the building Final Inspection. The Lafayette Fire Department does not issue permits or Certificates of Occupancy. Additional Information City of Lafayette Engineering Department forms Indiana State (IDHS) Plan Review Please contact the City of Lafayette Engineering Office to schedule an inspection at 765-807-1050. Quick Links LFD Sprinkler Pre Acceptance Test Checklist (PDF) LFD Site Plan Review Worksheet (PDF) Commercial Kitchen Operations Cover Sheet (PDF) View All Links /QuickLinks.aspx Indiana Building Code Occupancy Classifications Community Outreach Fire Stations Submit a Request History Photo Gallery Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -2550,https://alpha.austin.gov/en/police-oversight/formal-complaint-responsibility-to-know-and-comply-and-ot/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2551,https://www.foxcrossingwi.gov/departments/police-department/resources/tmpd-burg-prev-pers-safe-home-svc-safe/,Poor Data Source,Poor Data Source,Home Safety - Fox Crossing Fox Crossing,"",200,Fox Crossing - Bridging the Fox Cities Fox Crossing,"["""", """", ""Home Safety""]",[],[],[],[],[],"Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing Spring Recycling Event April 27th Informational Announcement – Outstanding Absentee Ballots for the April 2, 2024 Presidential Preference Primary & Spring Election Deadlines for April 2nd Spring Election & Presidential Preference Primary Spring/Summer Recreation Programs Signup for Village Notifications Current Job Opportunities Fox Crossing 2000 Municipal Drive Neenah, WI 54956 920-720-7100 . Home Safety Copyright © 2010 - 2024 Fox Crossing, All Rights Reserved. Professional Web Site Design by Sandstone Digital. Disclaimer Home Government Board of Review Bond Schedule Commissions & Boards Application for Appointment Village Board Elections and Voting Incorporation Information Fee Schedule Licenses & Permit Applications Minutes and Agendas Municipal Code Departments Administration Assessor Clerk Community Development Finance/Treasurer Fire Municipal Court Parks and Recreation Police Street Utilities Calendar Resources Elderly Transportation Program Employment Garbage & Recycling Individual & Business of Year Information for Vendors Local Links Pet Licensing Permits Building Permits Planning Permits Street Permits Population History Public Records Real Estate Inquiry Maps/GIS Property Information Tax & Parcel Information Tax Rate Information (TID IN) The Bridge Calendar Valley Transit Village History Weights & Measures Online Services Municipal Court Payments Parking Ticket Payments Rec Program Registration Utility Online Services Village General Payments Village Notifications Contact How Are We Doing Spring Recycling Event April 27th Informational Announcement – Outstanding Absentee Ballots for the April 2, 2024 Presidential Preference Primary & Spring Election Deadlines for April 2nd Spring Election & Presidential Preference Primary Spring/Summer Recreation Programs Signup for Village Notifications Current Job Opportunities Fox Crossing 2000 Municipal Drive Neenah, WI 54956 920-720-7100 . Home Safety " -2552,https://www.memphistn.gov/government/city-court-clerk/ticket-prices/ridgeway-police-station/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2553,https://www.coppelltx.gov/417/investigations-division,Contact Info & Agency Meta,Info About Agencies,"Investigations and Administration Division | Coppell, TX",The Investigations Division is comprised of nine sworn personnel and one civilian. These officers staff the Criminal Investigations Unit and the Proactive Criminal Enforcement (PACE) Unit. Criminal Investigations personnel also handle the registration of convicted sex offenders and provide coordination for the local Crime Stoppers program.,200,"Coppell, TX | Official Website","[""Investigations and Administration Division""]","[""Professional Standards"", ""Training"", ""North Texas Emergency Communications Center"", ""Responsibilities""]","[""Detective Duties"", ""Contact Us"", ""Loading""]","[""Police Department""]",[],[],Skip to Main Content -2554,https://delcopa.gov/ich/resources/covid19/businesspresentation.html,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -2555,https://delcopa.gov/planning/pubs/osrgp/vol-iii_chapter3glenprovidencecountypark.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2556,https://spdblotter.seattle.gov/2017/06/07/police-seize-two-guns-arrest-wanted-felon/,Media Bulletins,Agency-Published Resources,"Police Seize Two Guns, Arrest Wanted Felon - SPD Blotter","",200,403 Forbidden,"[""Police Seize Two Guns, Arrest Wanted Felon""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -2557,https://chandlerazpd.gov/2019/12/chandler-police-investigate-animal-cruelty/,Media Bulletins,Agency-Published Resources,Chandler Police Investigate Animal Cruelty – Chandler Police Department,"",200,Chandler Police Department,"[""Chandler Police Investigate Animal Cruelty""]",[],"[""Quick Links"", ""News Archives"", """", """", """", """"]","[""December 17, 2019"", ""Contact"", ""About the Department"", ""Latest News"", ""Courage, Pride, Dedication © 2024 Chandler Police Department""]",[],[],"The Chandler Police Department main lobby will be closed for renovations. Please see below for further. The Chandler Police Department main lobby will be closed for renovations. Please see below for further. Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation City of Chandler Mayor’s Office City Council Fire Department Residents Business Employee Info Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Toggle navigation Menu Chandler Police About the Department Careers Community Contact Data News Home Highlight Chandler Police Investigate Animal Cruelty Home Highlight Chandler Police Investigate Animal Cruelty Search for: Chandler Police Investigate Animal Cruelty December 17, 2019 By Jason McClimans On -December 12, 2019, around 10:30 am the Chandler Police Department investigated the -report of animal cruelty in the 3200 block of North Brentwood Place.  A resident called police after she found a yellow -short haired cat with a metal trap attached to its left hind leg.  The individual transported the cat to a local -animal hospital for treatment.  The cat is -being treated for injuries sustained by the trap at the Arizona Humane Society -Trauma Hospital. The -cat is currently on a 10 day hold with the Humane Society as part of the -state’s seizure ordinance.  Investigators -have no leads on this case. If you have any information regarding this investigation, contact the Chandler Police Department at (480) 782-4130 or Silent Witness at (480) WITNESS (648-6377). Search for: Quick Links About the Department Office of the Chief Interim Chief Of Police Melissa Deanda Assistant Chief Of Police Dave Ramer Department Events My Precinct Fingerprinting Services Request a Police Report Bicycle Registration General Orders/Accreditation Alarm Information Registered Sex Offenders Citizen Observer (Ride-Along) Vehicle Impounds Barking Dog Police Open Data Public Demonstration Guidelines News Archives August 2022 September 2021 July 2021 September 2020 August 2020 June 2020 May 2020 April 2020 March 2020 February 2020 January 2020 December 2019 " -2558,https://www.hayward-ca.gov/discover/news/apr21/police-blotter-april-18-24-2021,Annual & Monthly Reports,Info About Agencies,"Police Blotter: April 18-24, 2021 | City of Hayward - Official website","STATISTICAL HIGHLIGHTSapril 18-24, 2021 Weekly Arrests (Includes cite/released):23 Homicide 0Weekly Calls for Service: 1,864 Assault—Great Bodily Injury 2Weekly Reports Taken:183 Burglary— Nonresidential 3Weekly Complaints(against HPD):0 Burglary—Residential 4Weekly Calls Received:5,064 Theft 23This data is subject to change and based on crimes that were reported to have",200,City of Hayward - Official website,"[""Police Blotter: April 18-24, 2021""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form"", ""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment""]",[],"[""STATISTICAL HIGHLIGHTS"", ""april 18-24, 2021"", """", """", """", ""Significant Incidents"", ""Do you need help paying energy bills? You may qualify for federal aid."", ""Hayward Receives Grant for Safe Routes to Schools Infrastructure and Bicycle Incentives"", ""Hayward Celebrates Earth Day at Weekes Park!"", ""Spring 2024 Compost Giveaway"", ""Sustainable Solutions for Celebrating Easter"", ""City Hall and Nonessential Services Closure: Monday, Apr. 01, 2024"", ""Presidential Primary Election: Tuesday, Mar. 5, 2024"", ""Library Closure: February 12 and February 19, 2024."", ""City Hall and Nonessential Services Closures: Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""YOU ARE HERE. SO IS EVERYTHING ELSE."", ""Related News"", ""Police Blotter - February 25-March 2, 2024"", ""Weekly Blotter - February 18-24, 2024"", ""Police Blotter - February 11-17, 2024"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],Skip to main content -2559,https://spdblotter.seattle.gov/2022/07/18/police-arrest-security-guard-in-capitol-hill-after-he-fights-stabs-trespasser/,Media Bulletins,Agency-Published Resources,"Police Arrest Security Guard in Capitol Hill After He Fights, Stabs Trespasser - SPD Blotter","",200,403 Forbidden,"[""Police Arrest Security Guard in Capitol Hill After He Fights, Stabs Trespasser""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -2560,https://www.hayward-ca.gov/police-department/crime-prevention/hate-crimes,Contact Info & Agency Meta,Info About Agencies,Protecting yourself and others from hate crimes | City of Hayward - Official website,"Hate crime or hate incident? It is important to know the difference between a hate crime and a hate incident. A hate incident is an action or behavior motivated by hate but legally protected by the First Amendment right to freedom of expression. Examples of hate incidents include: name-calling, insults, distributing hate material in public places, and displaying hate material",200,City of Hayward - Official website,[],"[""Protecting yourself and others from hate crimes"", ""You are here. So is everything else."", ""Search form""]",[],"[""How to spot a hate crime :"", ""If you are a hate crime victim, you should :"", ""What you and your community can do :"", ""Where to find help :"", ""Receive crime bulletins and alerts"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],Skip to main content -2561,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0487/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2562,http://police.portlandmaine.gov/596/winter-operations,Not Criminal Justice Related,Not Criminal Justice Related,"Winter Operations | Portland, ME - Official Website","During the winter months, the Public Works Dispatch office is open 24 hours a day and crews are assigned to shifts to respond 24/7 to weather events. ",200,"Portland, ME - Official Website | Official Website","[""Winter Operations""]",[],[],[],[],[],Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government Departments Public Works Winter Operations Winter Operations 1940 Snow Removal Snow Bans Snow Removal Photo Gallery Towing Winter Sidewalks Volunteers Snow Shoveling Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Public Works Winter Operations Winter Operations 1940 Snow Removal Snow Bans Snow Removal Photo Gallery Towing Winter Sidewalks Volunteers Snow Shoveling Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Public Works Winter Operations Winter Operations 1940 Snow Removal Snow Bans Snow Removal Photo Gallery Towing Winter Sidewalks Volunteers Snow Shoveling Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Public Works Winter Operations Winter Operations 1940 Snow Removal Snow Bans Snow Removal Photo Gallery Towing Winter Sidewalks Volunteers Snow Shoveling Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Public Works Winter Operations Winter Operations 1940 Snow Removal Snow Bans Snow Removal Photo Gallery Towing Winter Sidewalks Volunteers Snow Shoveling Home Your Government Departments Public Works Winter Operations Winter Operations 1940 Snow Removal Snow Bans Snow Removal Photo Gallery Towing Winter Sidewalks Volunteers Snow Shoveling Home Your Government Departments Public Works Winter Operations Winter Operations 1940 Snow Removal Snow Bans Snow Removal Photo Gallery Towing Winter Sidewalks Volunteers Snow Shoveling Home Your Government Departments Public Works Winter Operations Winter Operations Home Your Government Departments Public Works Winter Operations Winter Operations Home Your Government Departments Public Works Winter Operations Winter Operations Winter Operations 1940 Snow Removal Snow Bans Snow Removal Photo Gallery Towing Winter Sidewalks Volunteers Snow Shoveling 1940 Snow Removal Snow Bans Snow Removal Photo Gallery Towing Winter Sidewalks Volunteers Snow Shoveling Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® Government Websites by CivicPlus® -2563,http://www.ryepolice.us/logs/police-logs-12-15-21-12-21-21,Daily Activity Logs,Info About Officers,Rye Police Department Police Logs 12/15/21-12/21/21 - Rye Police Department,"",200,Rye Police Department Welcome to the Rye Police Department - Rye Police Department,"[""Police Logs 12/15/21-12/21/21""]","[""Police Logs 12/15/21-12/21/21""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[],­ -2564,https://roxburynj.us/721/how-do-i-obtain-a-police-report,Records Request Info,Agency-Published Resources,"How do I obtain a police report | Township of Roxbury, NJ - Official Website","",200,"Township of Roxbury, NJ - Official Website | Official Website","[""How do I obtain a police report""]",[],"[""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Police Divisions How Do I... Resources Home Departments Police Department How Do I... How do I obtain a police report How do I obtain a police report Police and Accident reports may be picked up in person at the Roxbury Township Police Department Headquarters (Please park in designated visitor spots outside the police station). Reports can be picked up from 9am-4pm Monday through Friday. Please allow 7-10 working days for reports to be processed. Individuals requesting reports must show a government issued ID to confirm their identity. Please contact the records department prior to your arrival so she can ensure your report is completed and available when you arrive for pick up. Records telephone number: (973) 448-2039 Records fax number: (973) 448-9069 How do I obtain a police report Instructions for Carry Permit Instructions for Firearms Applicants Municipal Court FAQ Follow us on Facebook Employment Opportunities Roxbury Home Ordinances FAQ Department Roster Firearms Applications carry permit instructions Obtain a police report Enable Google Translate 1715 Route 46 Ledgewood, NJ 07852 Phone: 973-448-2000 Fax: 973-448-9069 Home Site Map Accessibility Copyright Notices Government Websites by CivicPlus® /QuickLinks.aspx Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Us Police Divisions How Do I... Resources Home Departments Police Department How Do I... How do I obtain a police report How do I obtain a police report Police and Accident reports may be picked up in person at the Roxbury Township Police Department Headquarters (Please park in designated visitor spots outside the police station). Reports can be picked up from 9am-4pm Monday through Friday. Please allow 7-10 working days for reports to be processed. Individuals requesting reports must show a government issued ID to confirm their identity. Please contact the records department prior to your arrival so she can ensure your report is completed and available when you arrive for pick up. Records telephone number: (973) 448-2039 Records fax number: (973) 448-9069 How do I obtain a police report Instructions for Carry Permit Instructions for Firearms Applicants Municipal Court FAQ Follow us on Facebook Employment Opportunities Roxbury Home Ordinances FAQ Department Roster Firearms Applications carry permit instructions Obtain a police report Enable Google Translate 1715 Route 46 Ledgewood, NJ 07852 Phone: 973-448-2000 Fax: 973-448-9069 Home Site Map Accessibility Copyright Notices Government Websites by CivicPlus® /QuickLinks.aspx Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -2565,https://www.milpitas.gov/milpitas/departments/police/department-training/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2566,https://detroitmi.gov/departments/police-department/dpd-surveillance-technology-reports-documents,List of Data Sources,Info About Agencies,DPD Surveillance Technology Reports & Documents | City of Detroit,"This technology aims to detect outdoor audible gunfire within the coverage area using acoustic sensors capable of pinpointing the accurate location of a gunfire event. This technology is used to address crime in real-time and support criminal investigations. The contents of the Surveillance Technology Reports shall reflect the full and accurate proposed use of surveillance technology submitted.  The Surveillance Technology Report shall be a publicly released report, written by the requesting agency or, in the case of the Police Department, in conjunction with the Board of Police Commissioners. Below are Technology Specification Reports, relevant department and City Council documents, and other supplemental materials pertaining to the use of Surveillance Technology.   Community Input Over Government Surveillance Ordinance CIOGS Ordinance Surveillance Technology Specification Reports Gunshot Detection Spec Report Gunshot Detection Spec Report Update 12/15/22 Proper use of the Gunshot Detection System System Policy Manual Board of Police Commissioners' Letter of Support BOPC Shotspotter Letter        ",200,City of Detroit | Opportunity Rising,"[""DPD Surveillance Technology Reports & Documents""]","[""Top Links"", ""Site Menu"", ""Documents""]",[],[],"["""", ""Community Input Over Government Surveillance Ordinance"", ""Surveillance Technology Specification Reports"", ""Proper use of the Gunshot Detection System"", ""Board of Police Commissioners' Letter of Support"", ""Gunshot Detection Spec Report Update 12/15/22"", ""BOPC Shotspotter Letter of Support"", ""Gunshot Detection System Policy"", ""Surveillance Technology Specification Reports"", ""Community Input Over Governmental Surveillance Ordinance""]",[],"" -2567,https://www.sandiego.gov/police/services/child-abuse,Resources,Agency-Published Resources,Child Abuse | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""Child Abuse""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Report Child Abuse or Welfare Concerns for a Child"", ""Types of Child Abuse"", ""Signs of Child Abuse"", ""Services"", ""Footer"", ""Accessibility Tools""]","[""Physical Abuse"", ""Sexual Abuse"", ""Emotional Abuse"", ""Neglect""]","[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -2568,https://www.southbendin.gov/transparency-and-performance/police-transparency-hub/sbpd-compliments-and-complaints-data/,Complaints & Misconduct,Info About Officers,"SBPD Compliments, Complaints & Investigations Data - South Bend, Indiana","",200,403 Forbidden,"[""SBPD Compliments, Complaints & Investigations Data""]","[""INTERACTIONS, COMPLAINTS, AND INVESTIGATIONS DASHBOARD"", ""COMMENDATIONS DATA"", ""MAPS"", ""FEATURED UPDATES""]","[""PAGE NAVIGATION"", ""PAGE DESCRIPTION"", ""EXTERNAL LINKS"", ""ACCESS OUR POLICE INTERACTIONS DATASETS BELOW!"", ""COMPLAINTS INVESTIGATION PROCESS"", ""WANT TO DOWNLOAD THE POLICE COMMENDATIONS DATASET?"", ""USE OF FORCE DATA STORY"", ""USE OF FORCE INCIDENTS"", ""WANT TO DOWNLOAD THIS DATASET?"", ""MORE"", ""HAVE FEEDBACK FOR THE TRANSPARENCY HUB?"", ""How was your experience?"", ""Mobile Navigation Menu"", ""WELCOME TO THE CITY OF SOUTH BEND’S NEW WEBSITE"", ""311 SERVICE CENTER"", ""CONNECT WITH ELECTED OFFICIALS"", ""PAY BILLS ONLINE"", ""TRASH INFORMATION"", ""VENUES PARKS & ARTS"", ""PROVIDE FEEDBACK"", ""YOU’RE READY!""]","[""Commend an Officer"", ""Submit a Complaint"", ""Community Complaints Dataset"", ""Administrative Complaints Dataset"", ""Use of Force Dataset"", ""Officer Commendations Data"", ""Historic Use of Force Data"", ""Use of Force Incidents Data"", ""Guided Tour of South Bend’s Updated Police Dashboards"", ""Board of Public Safety to Hold Next Community Action Group Meeting"", ""Code Enforcement"", ""CONNECT"", ""My Government"", ""311 Service Portal""]","[""Take Action"", ""Service""]",[],"" -2569,https://barnegatpolice.us/download/codis-dna-refusal-form/,Not Criminal Justice Related,Not Criminal Justice Related,"","",404,"","","","","","","","" -2570,https://www.antioch.il.gov/wpfb-file/15th-annual-cop-on-a-rooftop-pdf-5/,Poor Data Source,Poor Data Source,"15th Annual Cop On A Rooftop - Antioch, IL",12394 15th annual cop on a rooftop pdf event documents 2017 1625759862 c7a316267c0d0b6566d1247ef084b811 6856f29d7d85b040bd885ac821c6b27744cff50498d6594f14313bd982958634 232x300 _xzk2g0n3rtby thumb jpg 05 17 08 41 37 0 66 249 64 156 2021 06 21 11 40 20 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17 pagefailed_18,200,"Home - Antioch, IL","[""15th Annual Cop On A Rooftop""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -2571,https://champaignil.gov/2015/05/01/champaign-police-arrest-armed-robbery-suspect/,Media Bulletins,Agency-Published Resources,Champaign Police Arrest Armed Robbery Suspect - City of Champaign,"",200,403 Forbidden,"[""Champaign Police Arrest Armed Robbery Suspect""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Champaign Police Arrest Armed Robbery Suspect Search Posted on May 1, 2015 Contact: Deputy Chief Troy Daniels, 217-202-7355, troy.daniels@ci.champaign.il.us On April 30, 2015, at approximately 7:01PM, members of the Champaign Police Department and United States Marshal Service arrested Joseph Hart at 1121 Saint Andrews Circle, Rantoul, on an outstanding Champaign County arrest warrant for Armed Robbery/Armed with a Firearm.  Joseph Hart’s bond was set in the amount of $500,000. Between the months of September and November 2014, Champaign Police investigated a series of armed robberies that occurred in the area of the Country Brook Apartment Complex located at 2502 West Springfield Avenue.  During each of these robberies, the suspect(s) brandished a firearm, and demanded cash from the victim(s). During the investigation, Champaign Police Investigators identified one of the suspect(s) as 27-year-old Joseph Hart of Champaign, and were able to link him to each of the robberies. On February 10, 2015, police investigators obtained an arrest warrant for Joseph Hart for the charge of Armed Robbery/Armed with a Firearm for his involvement in the robberies. On April 30, 2015, at approximately 7:01PM, members of the Champaign Police Department and United States Marshal Service received information about the location of Hart and arrested him in the 1100 block of Saint Andrews Circle, Rantoul, without incident. If anyone has information regarding crimes of this incident, please call the Champaign Police Investigation Division at (217) 351-4545 or Crime Stoppers at (217) 373-8477. Callers can also submit anonymous tips online to Crime Stoppers at www.373tips.com or by texting the following: CCTIP plus the information to 274637 (CRIMES). Crime Stoppers will pay a reward up to $1,000 for information leading to the arrest of the persons responsible for this crime. Categories: Police Department Press Releases Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign " -2572,https://police.greenvillesc.gov/430/historical-archives,List of Data Sources,Info About Agencies,"Historical Archives | Greenville, SC - Official Website",View past mayors and City Councils who have served the City of Greenville.,200,"Police Department | Greenville, SC - Official Website","[""Historical Archives""]",[],"[""Loading""]","[""175th Anniversary Brochure (PDF)"", ""City Council Archives"", ""Mayor Archives""]",[],[],"Skip to Main Content Government Departments Business Visitors Residents Search Home Departments City Clerk Archives & Records Management Historical Archives Historical Archives 9 1 1 2 175th Anniversary Brochure (PDF) In 2006, the City commemorated 175 years of City services including downtown development, transportation, parks and recreation, public works, neighborhood services, and more. City Council Archives Access the City Council Archives to view images and member information for the City of Greenville City Council. Mayor Archives Check out an archive of all of the mayors of the City of Greenville dating back to 1850. 175th Anniversary Brochure (PDF) City Council Archives City Council 2020 to Present City Council 2010 to 2020 City Council 2000 to 2010 City Council 1990 to 2000 City Council 1980 to 1990 City Council 1970 to 1980 City Council 1960 to 1970 City Council 1950 to 1960 City Council 1940 to 1950 City Council 1930 to 1940 City Council 1920 to 1930 City Council 1909 to 1920 Mayor Archives Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate Government Departments Business Visitors Residents Search Home Departments City Clerk Archives & Records Management Historical Archives Historical Archives 9 1 1 2 175th Anniversary Brochure (PDF) In 2006, the City commemorated 175 years of City services including downtown development, transportation, parks and recreation, public works, neighborhood services, and more. City Council Archives Access the City Council Archives to view images and member information for the City of Greenville City Council. Mayor Archives Check out an archive of all of the mayors of the City of Greenville dating back to 1850. 175th Anniversary Brochure (PDF) City Council Archives City Council 2020 to Present City Council 2010 to 2020 City Council 2000 to 2010 City Council 1990 to 2000 City Council 1980 to 1990 City Council 1970 to 1980 City Council 1960 to 1970 City Council 1950 to 1960 City Council 1940 to 1950 City Council 1930 to 1940 City Council 1920 to 1930 City Council 1909 to 1920 Mayor Archives Downtown Special Events Parking unity park falls park Bus & Trolley AFFORDABLE HOUSING Agendas & Minutes Home Contact Us Accessibility /QuickLinks.aspx 206 S Main Street, Greenville, SC 29601 Police Non-Emergency: 864-271-5333 Greenville Cares Information Center 864-232-2273 Back to Top Enable Google Translate " -2573,https://delcopa.gov/vote/pdf/2020/brdmeetinglegalnotice_09172020.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2574,https://delcopa.gov/publicrelations/releases/2019/chronicdiseaseselfmanagement.html,Not Criminal Justice Related,Not Criminal Justice Related,"Self-Manage Your Chronic Diseases for a Better Life! - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Self-Manage Your Chronic Diseases for a Better Life!""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Self-Manage Your Chronic Diseases for a Better Life! Home / Departments / Public Relations Releases / Self-Manage Your Chronic Diseases for a Better Life! The Centers for Disease Control and Prevention finds that six in ten Americans live with at least one chronic disease and four in ten adults have two or more of these conditions. Illnesses like heart disease, cancer, chronic lung disease, stroke, diabetes and other chronic diseases are the leading causes of death and disability in America, and a leading driver of health care costs. The PA Partnership to Fight Chronic Disease has projected the total cost of chronic disease from 2016-2030 in Pennsylvania to be $1.7 trillion. In 2015 alone, 7.7 million people in Pennsylvania had at least 1 chronic disease, 3 million had 2 or more chronic diseases. Are you age 60 or older and have a chronic disease such as high blood pressure, diabetes, heart disease, lung disease or another chronic illness? Would you like to be empowered to live healthier by managing your chronic disease, feel better and enjoy life? Obtain the skills to be a better self-manager of your chronic diseases. Attend the nationally recognized and COSA sponsored Chronic Disease Self-Management Program at Friendship Circle Senior Center, 1515 Lansdowne Avenue, Darby, PA. The program will meet once a week for 6-weeks on Tuesdays, October 22nd, 29th, and November 5th, 12th, 19th, and 26th from 10:00 a.m. to 12:30 p.m. Don’t miss the opportunity to attend this proven evidence-based program developed at Stanford University and used internationally to help empower others just like you. Program costs are covered by the County of Delaware Services for the Aging (COSA), so the program is FREE to you, however class size is limited. Registration is mandatory. To register, call Friendship Circle Senior Center front desk at 610-237-6222. Public Relations Navigation Press Releases County Newsletter Use of County Facility Form Questions about COVID-19 vaccines? Please call the COVID-19 Call Center: 484-276-2100. Adrienne Marofsky, Director Government Center, 226A 201 W. Front St. Media, PA 19063 Phone: 610-891-4943 delcopr@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu " -2575,https://www.mass.gov/doc/2014-reading-list-for-brookline-police-sergeant-lieutenant-and-captain-promotional-examinations/download,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,Mass.gov,[],[],[],[],[],[],"" -2576,https://detroitmi.gov/departments/police-department/detroit-rewards-tv/about-rewards-tv,Not Criminal Justice Related,Not Criminal Justice Related,About Rewards TV | City of Detroit,"The purpose of Rewards TV is simply to empower our community to report criminal activity. The website and television program both focus on major crimes and provide financial incentives to community members who speak up. The show will feature the victim’s family members, detective interviews, and exclusive surveillance video that will help solve the case. Cash Reward Guidelines To be eligible for a Detroit Rewards TV cash reward, a tip must be received through the Crime Stoppers 1-800-SPEAK UP (1-800-773-2587) hotline, web, or text message. These forms of communication are available 24 hours a day 7 days a week. When a tipster calls this number they are given a secret identification number only known by the tipster and the Call Center.  The tipster is advised not to share this number with anyone other than the call Center dispatcher or staff members from Crime Stoppers. Tipsters are also asked by the Call Center dispatcher if they provided this information to law enforcement. If the tipster answers this question with a yes it will be noted on the tip sheets and the tipster will be advised to call staff members from Crime Stoppers for an update. Crime Stoppers staff members will advise all tipsters concerning the status and their eligibility for a reward based on their tip information. Tipsters are only eligible for a reward if: They provide this information first to Detroit Rewards TV and not Law Enforcement. Their tip must move the case forward When a Crime Stopper staff members receive a disposition sheet from the law enforcement agency/department indicating that the tip they reviewed led to either of the above requirements then a reward may be justified unless the tipster provided this information to Law Enforcement first. If a reward is granted by members of the Detroit Rewards TV Selection Committee the tipster will call utilizing their secret number to be guided on the retrieving of their reward. ",200,City of Detroit | Opportunity Rising,"[""Detroit Rewards.tv"", ""About Rewards TV""]","[""Top Links"", ""Site Menu"", ""Cash Reward Guidelines""]",[],[],[],[],"" -2577,https://delcopa.gov/planning/pdf/demodata/populationchange2010-2020.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -2578,https://council.seattle.gov/2012/02/27/seattle-police-department-is-hiring-police-officers/,Media Bulletins,Agency-Published Resources,Seattle Police Department is hiring police officers - Seattle City Council Blog,"",200,403 Forbidden,"[""Seattle Police Department is hiring police officers""]",[],"[""HELPFUL LINKS"", ""Make your voice heard"", ""Councilmembers""]",[],[],[],"" -2579,https://police.greenvillesc.gov/faq.aspx?qid=131,Resources,Agency-Published Resources,FAQs • Why did I receive this charge?,"",200,"Police Department | Greenville, SC - Official Website",[],"[""▼ Municipal Court - General Legal Questions""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -2580,https://ose.louisiana.gov/event/police-lieutenant-44/,Poor Data Source,Poor Data Source,Police Lieutenant | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Police Lieutenant""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Police Lieutenant Promotional Level Posting Period 11/16/2021 - 12/17/21 Application Deadline 12/17/21 Jurisdiction Ruston Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Police Lieutenant Promotional Level Posting Period 11/16/2021 - 12/17/21 Application Deadline 12/17/21 Jurisdiction Ruston Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Lieutenant Promotional Level Posting Period 11/16/2021 - 12/17/21 Application Deadline 12/17/21 Jurisdiction Ruston Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Lieutenant Promotional Level Posting Period 11/16/2021 - 12/17/21 Application Deadline 12/17/21 Jurisdiction Ruston Application This event has passed. Police Lieutenant Promotional Level Posting Period 11/16/2021 - 12/17/21 Application Deadline 12/17/21 Jurisdiction Ruston Application This event has passed. Police Lieutenant Promotional Level Posting Period 11/16/2021 - 12/17/21 Application Deadline 12/17/21 Jurisdiction Ruston Application This event has passed. Police Lieutenant Promotional Level Promotional Level Promotional Level Posting Period 11/16/2021 - 12/17/21 Application Deadline 12/17/21 Jurisdiction Ruston Posting Period 11/16/2021 - 12/17/21 Application Deadline 12/17/21 Jurisdiction Ruston Posting Period 11/16/2021 - 12/17/21 Application Deadline 12/17/21 Jurisdiction Ruston Posting Period 11/16/2021 - 12/17/21 Posting Period Application Deadline 12/17/21 Application Deadline Jurisdiction Ruston Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -2581,http://police.portlandmaine.gov/278/safety-tips,Not Criminal Justice Related,Not Criminal Justice Related,"Safety Tips | Portland, ME - Official Website",Go over documents related to Safety Tips.,200,"Portland, ME - Official Website | Official Website","[""Safety Tips""]",[],[],[],[],[],Skip to Main Content Pay & Apply Your Government Services Business Community Home Your Government Departments Fire Safety Tips Safety Tips Confined Space Program Emergency Management Cities Readiness Initiative FEMA Flood Maps Personal & Family Preparedness Step 1: Get Informed Step 2: Make a Kit Step 3: Make a Plan Step 4: Learn Where To Go Emergency Resources Fire Department Careers Minimum Qualifications PAT Test PAT Preparation (PDF) Fire Department History 1908 City Hall Fire 1908 City Hall Fire Photo Gallery Chief Engineers Supreme Sacrifice Fire Prevention Outdoor burn info and other permits Approved Fire Alarm Companies Online Permit System Rules and Regs Island Safety Pay Your Bill Online Pay AES Online Portland's Fire Companies Safety Tips Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Fire Safety Tips Safety Tips Confined Space Program Emergency Management Cities Readiness Initiative FEMA Flood Maps Personal & Family Preparedness Step 1: Get Informed Step 2: Make a Kit Step 3: Make a Plan Step 4: Learn Where To Go Emergency Resources Fire Department Careers Minimum Qualifications PAT Test PAT Preparation (PDF) Fire Department History 1908 City Hall Fire 1908 City Hall Fire Photo Gallery Chief Engineers Supreme Sacrifice Fire Prevention Outdoor burn info and other permits Approved Fire Alarm Companies Online Permit System Rules and Regs Island Safety Pay Your Bill Online Pay AES Online Portland's Fire Companies Safety Tips Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Fire Safety Tips Safety Tips Confined Space Program Emergency Management Cities Readiness Initiative FEMA Flood Maps Personal & Family Preparedness Step 1: Get Informed Step 2: Make a Kit Step 3: Make a Plan Step 4: Learn Where To Go Emergency Resources Fire Department Careers Minimum Qualifications PAT Test PAT Preparation (PDF) Fire Department History 1908 City Hall Fire 1908 City Hall Fire Photo Gallery Chief Engineers Supreme Sacrifice Fire Prevention Outdoor burn info and other permits Approved Fire Alarm Companies Online Permit System Rules and Regs Island Safety Pay Your Bill Online Pay AES Online Portland's Fire Companies Safety Tips Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community Home Your Government Departments Fire Safety Tips Safety Tips Confined Space Program Emergency Management Cities Readiness Initiative FEMA Flood Maps Personal & Family Preparedness Step 1: Get Informed Step 2: Make a Kit Step 3: Make a Plan Step 4: Learn Where To Go Emergency Resources Fire Department Careers Minimum Qualifications PAT Test PAT Preparation (PDF) Fire Department History 1908 City Hall Fire 1908 City Hall Fire Photo Gallery Chief Engineers Supreme Sacrifice Fire Prevention Outdoor burn info and other permits Approved Fire Alarm Companies Online Permit System Rules and Regs Island Safety Pay Your Bill Online Pay AES Online Portland's Fire Companies Safety Tips Government Websites by CivicPlus® Pay & Apply Your Government Services Business Community -2582,https://police.greenvillesc.gov/faq.aspx?qid=591,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • What are the Greenville Water Splash Pad hours?,"",200,"Police Department | Greenville, SC - Official Website",[],"[""▼ Unity Park Open""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -2584,http://www.longbeach.gov/police/press-releases/dui-enforcement-operations-planned-this-weekend-2-/,Media Bulletins,Agency-Published Resources,DUI ENFORCEMENT OPERATIONS PLANNED THIS WEEKEND(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/13/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: DUI ENFORCEMENT OPERATIONS PLANNED THIS WEEKEND Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department’s DUI Enforcement Team will be deploying this weekend to stop and arrest alcohol and drug-impaired drivers in the Department’s ongoing traffic safety campaign. DUI Saturation Patrols will deploy on Saturday, June 14, 2014, between the hours of 7:00 p.m. and 3:00 a.m., in areas with high frequencies of DUI collisions and/or arrests. After falling dramatically for five straight years, figures for 2012 show an increase to 802 deaths in California because someone failed to designate a sober driver. Over the course of the past three years in Long Beach, DUI collisions have claimed nine lives and resulted in 315 injury crashes, harming 420 of our friends and neighbors. Driving under the influence can impact the economy in addition to the pain and suffering of those immediately affected. Conservatively, a fatality has a $1.4 million impact, an injury $70,000, and a crash that only damages property averages nearly $9000. Funding for this program is from a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration. Report Drunk Drivers, Call 9-1-1! This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2585,http://beaverpolice.us/wp-sitemap-posts-ai1ec_event-1.xml,List of Data Sources,Info About Agencies,XML Sitemap,"",200,Beaver Police Department – © 2023 Beaver Police Department |,"[""XML Sitemap""]",[],[],[],[],[],XML Sitemap This XML Sitemap is generated by WordPress to make your content more visible for search engines. Learn more about XML sitemaps. Number of URLs in this XML Sitemap: 26. URL http://beaverpolice.us/event/test-event/ http://beaverpolice.us/event/arts-festival/ http://beaverpolice.us/event/not-one-more-pittsburgh/ http://beaverpolice.us/event/make-a-wish-yard-sale/ http://beaverpolice.us/event/beaver-county-bookfest/ http://beaverpolice.us/event/habitat-for-humanity-5k/ http://beaverpolice.us/event/support-our-troops-rally/ http://beaverpolice.us/event/holiday-band-concert/ http://beaverpolice.us/event/reeces-round-up-5k-racemile-walk/ http://beaverpolice.us/event/concert-in-the-park/ http://beaverpolice.us/event/beaver-valley-police-memorial-5k/ http://beaverpolice.us/event/beaver-volunteer-fire-department-5k10k-race/ http://beaverpolice.us/event/penn-state-beaver-alumni-5k10k/ http://beaverpolice.us/event/howl-at-the-moon-5k-race/ http://beaverpolice.us/event/run-to-break-the-cycle/ http://beaverpolice.us/event/run-for-colen-cancer-coalition/ http://beaverpolice.us/event/american-heart-associaton/ http://beaverpolice.us/event/turkey-trot/ http://beaverpolice.us/event/memorial-day-parade/ http://beaverpolice.us/event/beaver-county-symphonic-wind-ensemble-concert/ http://beaverpolice.us/event/car-cruise/ http://beaverpolice.us/event/childrens-picture-book-contest/ http://beaverpolice.us/event/christians-united-in-beaver-county-concert/ http://beaverpolice.us/event/toy-fair-by-castle-toys-and-games/ http://beaverpolice.us/event/story-telling/ http://beaverpolice.us/event/homecoming-2015-events/ XML Sitemap This XML Sitemap is generated by WordPress to make your content more visible for search engines. Learn more about XML sitemaps. Number of URLs in this XML Sitemap: 26. URL http://beaverpolice.us/event/test-event/ http://beaverpolice.us/event/arts-festival/ http://beaverpolice.us/event/not-one-more-pittsburgh/ http://beaverpolice.us/event/make-a-wish-yard-sale/ http://beaverpolice.us/event/beaver-county-bookfest/ http://beaverpolice.us/event/habitat-for-humanity-5k/ http://beaverpolice.us/event/support-our-troops-rally/ http://beaverpolice.us/event/holiday-band-concert/ http://beaverpolice.us/event/reeces-round-up-5k-racemile-walk/ http://beaverpolice.us/event/concert-in-the-park/ http://beaverpolice.us/event/beaver-valley-police-memorial-5k/ http://beaverpolice.us/event/beaver-volunteer-fire-department-5k10k-race/ http://beaverpolice.us/event/penn-state-beaver-alumni-5k10k/ http://beaverpolice.us/event/howl-at-the-moon-5k-race/ http://beaverpolice.us/event/run-to-break-the-cycle/ http://beaverpolice.us/event/run-for-colen-cancer-coalition/ http://beaverpolice.us/event/american-heart-associaton/ http://beaverpolice.us/event/turkey-trot/ http://beaverpolice.us/event/memorial-day-parade/ http://beaverpolice.us/event/beaver-county-symphonic-wind-ensemble-concert/ http://beaverpolice.us/event/car-cruise/ http://beaverpolice.us/event/childrens-picture-book-contest/ http://beaverpolice.us/event/christians-united-in-beaver-county-concert/ http://beaverpolice.us/event/toy-fair-by-castle-toys-and-games/ http://beaverpolice.us/event/story-telling/ http://beaverpolice.us/event/homecoming-2015-events/ -2587,http://www.longbeach.gov/police/press-releases/traffic-fatality-21-/,Media Bulletins,Agency-Published Resources,Traffic Fatality(21),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/16/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Saturday, May 14, 2016 at 8:26 p.m., Long Beach Police responded to an injury traffic collision near the intersection of Cherry Avenue and 19th Street, involving two vehicles and a pedestrian. When officers arrival, they discovered a Honda Civic on Cherry Avenue with minor damage and a Jeep Patriot with major front end damage. Officers also discovered an unconscious man in the street with serious injuries. Long Beach Fire Department Paramedics responded to the scene and determined the pedestrian deceased. The investigation revealed that the pedestrian was attempting to cross mid-block, westbound on Cherry Avenue, south of 19th street from the east side of Cherry Avenue. The Jeep Patriot was traveling southbound on Cherry Avenue, in the #2 lane and saw a vehicle in front of him suddenly swerve into the #1 lane, at which time the driver of the Jeep was unable to avoid the pedestrian who was now directly in front of him. After striking the pedestrian the driver of the Jeep swerved into the #1 lane and sideswiped a 2012 Honda Civic. The driver of the Jeep Patriot, a 19-year-old, female resident of Long Beach, was not injured. The driver of the Honda Civic, a 23-year-old male resident of Long Beach, was not injured. The pedestrian was a 59-year old male resident of Long Beach. His name is being withheld until such time the Los Angeles County Coroner’s Office notifies his next of kin. Anyone who may have information regarding this incident is urged to contact the Long Beach Police Department Collision Investigation Detail, Detective Brian Watt at (562) 570-5520. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2588,https://oceancitymd.gov/oc/ocean-city-police-investigating-fatal-pedestrian-collision/,Media Bulletins,Agency-Published Resources,"Ocean City Police Investigating Fatal Pedestrian Collision – Town of Ocean City, Maryland","",200,"Town of Ocean City, Maryland – A Vibrant Coastal Resort Community",[],"[""Post navigation""]","[""Related posts""]",[],[],[],"" -2589,https://www.sandiego.gov/department-document/police-chief-recruitment-process-update-august-22-2017,Training & Hiring Info,Info About Officers,"Police Chief Recruitment Process - Update (August 22, 2017) | City of San Diego Official Website","",200,City of San Diego Official Website,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Police Chief Recruitment Process - Update (August 22, 2017)"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -2590,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2016_archived_news/december_2016/volunteer_for_arlington_police_department_s_dog,Not Criminal Justice Related,Not Criminal Justice Related,Volunteer for Arlington Police Department’s Dog Walker Watch Program - City of Arlington,"",200,Just a moment...,"[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Volunteer for Arlington Police Department’s Dog Walker Watch Program""]",[],[],[],[],Skip to Content Skip to Content -2591,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0721/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2592,http://www.longbeach.gov/police/press-releases/officer-involved-shooting3/,Media Bulletins,Agency-Published Resources,OFFICER INVOLVED SHOOTING,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/21/2018 FOR IMMEDIATE RELEASE Press Release # Subject: OFFICER INVOLVED SHOOTING 2400 BLOCK OF BALTIC AVENUE Contact: Media Relations Detail (562) 570-5273 On January 20, 2018, at approximately 6:00 PM, Long Beach Police Officers saw a suspicious person on a bicycle in the area of Burnett Street and Santa Fe Avenue and attempted to contact that person for traffic violations they observed. However, he was not compliant with the officers’ lawful detention and commands, and subsequently fled from them on foot, and a foot pursuit ensued. An officer chased the suspect to the north/south alley between Adriatic and Baltic, south of 25th Street, where he caught up to the suspect. The suspect continued to not comply with the officer’s lawful commands and when the officer attempted to take him into custody he violently assaulted the officer. The officer was punched in the face by the suspect more than once, and during the violent assault the suspect tried to disarm him of his firearm and an officer involved shooting occurred. One officer fired his weapon striking the suspect in a lower extremity. The suspect was then taken into custody without further incident. Long Beach Fire Department personnel responded and transported the suspect to a local hospital where he is listed in stable condition with a non-life threatening injury. The suspect has been identified as Luis Perez a 25-year-old resident of Long Beach, on active felony probation for burglary. He will be booked into the Long Beach jail once he is cleared by medical personnel. Suspect Perez will be booked and charged with Felony Assault on a Police Officer, and Resisting Arrest. The Los Angeles County District Attorney's office will conduct an independent investigation as they do with all officer involved shootings that result in injury or death. Anyone with information regarding this incident is urged to call Homicide Detectives  at (562) 570-7244. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2594,https://www.wakeforestnc.gov/police/public-information,Resources,Agency-Published Resources,"Public Information | Town of Wake Forest, NC","News MediaTown of Wake Forest Communications & Public Affairs Director Bill Crabtree serves as the news media's main point of contact for the Wake Forest Police Department. We are committed to ensuring that the public is informed with current and accurate information about the Wake Forest Police Department's activities, strategies, and policies. We believe that transparency is",200,"Town of Wake Forest, NC","[""Public Information""]","[""skyline_1.jpg"", ""Town Hall Closed Friday, March 29"", ""Search form"", ""You are here""]","[""News Media"", ""AMBER Alert"", ""Firing Range"", ""News Releases"", ""Paying Parking Tickets"", ""Police to Citizen (P2C)"", ""Precious Metals Permits"", ""Property Collection"", ""Silver Alert"", ""Urban Archery Application"", ""Application for Permit to Sell or Solicit""]",[],[],[],Skip to main content -2595,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2017_archived_news/march_2017/february_2017_arlington_police_community,Media Bulletins,Agency-Published Resources,February 2017 Arlington Police Community Newsletter Available - City of Arlington,"",200,Just a moment...,"[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""February 2017 Arlington Police Community Newsletter Available""]",[],[],[],[],Skip to Content Skip to Content -2596,http://www.tampa.gov/news/tampa-police-investigate-shooting-genesee-st-76411,Media Bulletins,Agency-Published Resources,Tampa Police Investigate Shooting on Genesee St | City of Tampa,"At 3:00 PM Friday afternoon, Tampa Police responded to the report of gunshots in the 3400 block of E. Genesee St.  Officers arrived to find an adult male victim, who was transported to a nearby hospital, listed in stable condition. Anyone with information is asked to contact Crimestoppers of Tampa Bay at 800.873.TIPS. It is still early in the investigation and updates will be provided as they become available.",200,City of Tampa,"[""Tampa Police Investigate Shooting on Genesee St""]","[""Information Resources"", ""Latest News"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[],"" -2597,https://cityofpowell.us/powell-police-officer-audrey-wilt-named-2022-cit-officer-of-the-year-by-delaware-morrow-mental-health-recovery-services-board/,Media Bulletins,Agency-Published Resources,"City of Powell, Ohio | Powell Police Officer Audrey Wilt Named 2022 CIT Officer of the Year by Delaware-Morrow Mental Health & Recovery Services Board",Officer Audrey Wilt named 2022 CIT Officer of the Year by the Delaware-Morrow Mental Health & Recovery Services Board.,200,"City of Powell, Ohio","[""Powell Police Officer Audrey Wilt Named 2022 CIT Officer of the Year by Delaware-Morrow Mental Health & Recovery Services Board""]","[""CONTACT INFO"", ""HELPFUL LINKS"", ""LET'S CONNECT""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[],"Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch Discover Annual Reports Community Maps Demographics DORA Historic Powell Library Public Parking Schools Visit Government Agendas & Minutes Boards & Commissions City Code City Council City Manager’s Office Departments Building Business & Economic Development City Clerk Communications Development Engineering Finance Parks & Recreation Public Service Police Legislation Monthly Reports Public Records Parks & Recreation Powell Parks Bike Paths Community Garden Online Class Registration Facility Rental Request Class Cancellations, Wait Lists & Inclement Weather Residents A to Z Guide Address Check Tool Driver’s License & Titles Homeowners’ Associations Services Christmas Tree Disposal Leaf Removal Snow and Ice Removal Street Trees Trash, Recycling, and Yard Waste Taxes Utilities Vacation House Watch Businesses Building Department Development Department Development Toolkit Greater Powell Chamber of Commerce Zoning Map Events Powell Festival Special Event Permit Designated Outdoor Refreshment Area (DORA) Safety Police Canine Unit Citizens Police Academy Community Oriented Policing Crash Reports Employment Resources Public Records Requests Services Traffic Surveys Fire Delco Alerts Vacation House Watch News Calendar Powell Festival Economic Development Careers Contact Translate Facebook Twitter LinkedIn Instagram Pinterest Vimeo " -2598,https://www.sandiego.gov/police/about/chief,Personnel Records,Info About Officers,About the Chief | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""About the Chief""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""David Nisleit"", ""About"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -2599,https://southamptontownnypolice.gov/1624/public-information,Not Criminal Justice Related,Not Criminal Justice Related,"Public Information | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Public Information""]",[],"[""Site Tools"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Municipal Works - Waste Management Public Information Public Information Recycling Programs EVERYTHING YOU HAVE ALWAYS WANTED TO KNOW ABOUT COMPOSTING Doing some cleaning?  Help make sure clothing and other textiles are reused or find a second life as insulation, carpet padding, and more - don’t put them in your regular recycling bin. Check with your local municipality or recycling coordinator to learn more about alternate textile recycling methods in your area. #RecycleRightNY Compost Awareness Week is in May Food scraps are valuable, but not in your household recycling bin. Composting organic materials, such as food scraps, reduces the amount of waste that ends up in landfills or at combustion facilities. However, food scraps put in household recycling bins can actually ruin valuable recyclables and those equally valuable food scraps are lost as well. #RecycleRightNY and send food scraps to the soil, not your recycling bin! Battery Recycling Composting Guide Disposal of Garbage, Recyclables & Green Bags Fee Schedule (PDF) Medical Waste Public Information Recycling Guide Recycling Program Flyer Recycling Your Electronic Waste (eWaste) Refuse Carters Repurposing Furniture, Appliances, & Household Residents Contractors/Commercial Residential Yard Waste Disposal Policy Services & Programs Guest Speaker STOP Program (Hazardous Waste) Public Education & Outreach Tours Transfer Stations Holiday Schedule Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -2600,https://www.somervillema.gov/policebodycameras,Media Bulletins,Agency-Published Resources,City of Somerville & Police Union Reach Agreement to Deploy Patrol Officer Body Cameras | City of Somerville,"After several years of negotiations, the City of Somerville and the Somerville Police Employees Association (SPEA) union, which represents Somerville patrol officers, have reached an agreement to implement body-worn cameras. The agreement represents a collaborative breakthrough for policing transparency in Somerville and establishes Somerville as an early regional adopter of this important technology. ",200,Home | City of Somerville,"[""City of Somerville & Police Union Reach Agreement to Deploy Patrol Officer Body Cameras""]","[""After years of negotiations, the agreement represents a collaborative breakthrough for policing transparency""]","[""Feedback"", ""Download Mobile Apps"", ""Sign up for City eNews"", ""Connect With Us""]",[],[],[],"" -2601,https://www.richmondindiana.gov/news/chief-of-police-michael-britt-officer-seara-burton,Media Bulletins,Agency-Published Resources,Message from Chief of Police Michael Britt on Officer Seara Burton | City of Richmond,"",200,Richmond Indiana,"[""News""]","[""Message from Chief of Police Michael Britt on Officer Seara Burton"", ""Stay Connected""]",[],"[""Contact"", ""City of Richmond""]",[],[],What's Happening Doing Business Living City Government Office of the Mayor Departments City Clerk City Council Boards & Commissions Job Opportunities Contact Contact Us Directory What's Happening Doing Business Living City Government Office of the Mayor Departments City Clerk City Council Boards & Commissions Job Opportunities Contact Contact Us Directory City Government Office of the Mayor Departments City Clerk City Council Boards & Commissions Job Opportunities City Government City Government Contact Contact Us Directory Contact Contact News News -2602,https://www.ci.san-bernardino.ca.us/city_hall/police_department/department_goals/improve_quality_of_life,Crime Statistics,Agency-Published Resources,Improve Quality of Life - City of San Bernardino,"",200,Just a moment...,"[""City of San Bernardino California""]","[""Improve Quality of Life""]",[],[],[],[],Skip to Content -2603,http://www.longbeach.gov/police/press-releases/officer-involved-shooting-6-/,Media Bulletins,Agency-Published Resources,Officer Involved Shooting(6),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 4/24/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: OFFICER INVOLVED SHOOTING Contact: Media Relations (562) 570-5273 On Thursday, April 23, 2015, at approximately 2:45 P.M., officers responded to a residential multi-unit complex in the 1100 block of Hoffman Avenue regarding a report of several subjects unlawfully trespassing and vandalizing inside a vacant residence which resulted in an officer involved shooting. The preliminary investigation as determined the following. When the officers arrived they discovered an open window with no screen at the rear of the residence. The officers located a second window that was broken, with the screen removed. An officer looked through the opening to the broken window and observed a male suspect standing next to a wall. The officer observed the suspect turn towards him, while bending his knees, and extended an arm out as if pointing    an object which he perceived was a gun. The suspect was transported to a local hospital in critical condition and was later pronounced deceased. The suspect has been identified as 19-year-old Hector Morejon of Long Beach. No officers were injured during this incident. The interior of the residence was covered with gang-related graffiti. A weapon was not recovered from the scene. The following individuals were arrested related to this incident. Name Age City of Residence Charges Edgar Rodarte      20         Long Beach                   Trespassing German Rodarte   21         Long Beach     Trespassing Gang Injunction Violation Yesenia Pineda     22         Long Beach                   Trespassing Celia Cox              22         Long Beach                   Trespassing The Police Department thoroughly reviews all use of force incidents through a rigorous multi-step process that evaluates legal, policy, tactical and equipment issues. In addition, all officer involved shootings where a death occurs, are independently investigated by the Los Angeles County District Attorney’s Office and the Los Angeles County Coroner’s Office. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detail at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2604,https://detroitmi.gov/es/departments/departamento-de-agua-y-alcantarillado/atencion-al-cliente/que-hacer-si-tiene-una-copia-de-seguridad-de-alcantarillado,Not Criminal Justice Related,Not Criminal Justice Related,Agua y Alcantarillado Mantenimiento/Emergencias | City of Detroit,"El Departamento de Agua y Alcantarillado de Detroit (DWSD) mantiene 2,700 millas de tuberías de distribución de agua (tuberías principales de agua) y 3,000 millas de tuberías de recolección de alcantarillado. DWSD tiene un programa de mantenimiento preventivo agresivo, un Programa de mejora de capital de cinco años para comenzar a abordar nuestra infraestructura obsoleta y cuenta con un equipo de servicios de campo capacitado que responde a las emergencias. Si necesita informar una emergencia de agua o alcantarillado, llame al 313-267-8000 y presione la opción 4, o use la aplicación móvil de Improve Detroit . SISTEMA DE AGUA: El sistema de agua en Detroit incluye las plantas de tratamiento de agua potable, bombas, líneas de transmisión, tuberías de distribución o cañerías de agua, válvulas, hidrantes y líneas de servicio de agua. Mira este video animado . ¿Tiene una rotura principal de agua? Los inviernos fríos de Detroit, los deshielos primaverales y el calor extremo del verano pueden provocar roturas en las tuberías que llevan el agua a nuestros clientes. Cada vez que el suelo cambia debido a cambios drásticos de temperatura, puede ejercer presión sobre las tuberías. El Departamento de Agua y Alcantarillado de Detroit (DWSD) tiene un programa agresivo de detección de fugas y un Programa de Mejora de Capital para actualizar el sistema. Tú también puedes ayudar. Se pueden perder millones de galones de valiosos recursos de agua potable en poco tiempo, por lo que la detección rápida de una ruptura de la tubería de agua es fundamental. Si sospecha que hay una fuga en su vecindario, llámenos al 313-267-8000 o use la aplicación móvil de Improve Detroit . Mire este video para aprender cómo DWSD responde a las roturas de tuberías principales. ¿Quién es responsable de las tuberías de agua? DWSD es responsable del mantenimiento del sistema de distribución de agua, incluidas las tuberías principales y de servicio de agua hasta el tope de la acera (válvula de encendido/apagado cerca o en la acera). El dueño de la propiedad es responsable de la línea de servicio de agua desde la acera hasta el interior de la casa o negocio y la plomería interna dentro de la casa/estructura. Si la parte privada de la línea de servicio de agua se agrieta o falla, es responsabilidad del dueño de la propiedad contratar a un plomero con licencia y obtener el permiso de la ciudad correspondiente para realizar la reparación. Ver imagen a continuación. DRENAJE: El sistema de recolección de alcantarillado en Detroit consta de líneas laterales de alcantarillado (privadas), tuberías de recolección de alcantarillado que utilizan principalmente la gravedad, tuberías de aguas pluviales, sumideros, infraestructura verde de aguas pluviales , bombas, instalaciones de desbordamiento de alcantarillado combinado y la planta de tratamiento de aguas residuales. ¿Está su calle inundada? DWSD lanzó un programa de inspección y limpieza de cuencas colectoras en 2017 para reducir las inundaciones en las calles de los vecindarios. Hasta noviembre de 2020, los equipos de DWSD han inspeccionado y limpiado 30 000 sumideros (drenajes pluviales). Hay aproximadamente 90,000 sumideros que DWSD es responsable de mantener. Esto no incluye las cuencas en autopistas, carreteras estatales o del condado, como M-10 Lodge Freeway y Woodward Avenue, que son responsabilidad del MDOT. Lea sobre el programa aquí . Si experimenta inundaciones en las calles, por su seguridad, no conduzca ni camine por un área inundada. Repórtelo llamando al 313-267-8000 y presione la opción 4, o use la aplicación móvil de Improve Detroit . Se alienta a los propietarios/inquilinos a que recojan los recortes de césped, las hojas, la basura y otros desechos frente a sus hogares y negocios y los eliminen adecuadamente, ya sea en el césped o en bolsas de basura. Los escombros que no se barren ni se quitan con una pala del frente de su propiedad pueden obstruir los sumideros y potencialmente inundar su calle. Mire este video para obtener más información . ¿Tiene un desbordamiento o una copia de seguridad de alcantarillado? Comuníquese con DWSD al 313-267-8000 y presione la opción 4 o use la aplicación móvil Improve Detroit al descubrir un desbordamiento o un desbordamiento de alcantarillado. Si tiene un desbordamiento o un desbordamiento de alcantarillado en su hogar o negocio, consulte la información de reclamo por daños de DWSD. La ley estatal requiere que presente un reclamo por escrito con su empresa local de servicios de agua, DWSD en este caso, dentro de los 45 días posteriores al descubrimiento del desbordamiento o el desbordamiento. ¿Quién es responsable de las tuberías de alcantarillado? DWSD es responsable del sistema de recolección de alcantarillado. Los propietarios son responsables de los drenajes dentro de la casa/estructura, en la propiedad privada y la línea de alcantarillado que viene desde la estructura hasta la conexión en la tubería de recolección de alcantarillado de la ciudad. La mayoría de las líneas de alcantarillado se conectan en el callejón o antiguo callejón (aquellos que la ciudad dejó vacantes a los propietarios), mientras que solo unos pocos vecindarios tienen la línea de alcantarillado conectada debajo de la calle frente a la casa/estructura. Si la línea de alcantarillado de la casa/estructura falla, se agrieta o se derrumba de la conexión de alcantarillado de la ciudad, es responsabilidad del propietario privado contratar a un plomero con licencia y obtener el permiso de la ciudad correspondiente para realizar la reparación. Ver imagen a continuación.",200,City of Detroit | Opportunity Rising,"[""Agua y Alcantarillado Mantenimiento/Emergencias""]","[""Top Links"", ""Site Menu"", ""SISTEMA DE AGUA:"", ""DRENAJE:"", ""Documentos""]","[""¿Tiene una rotura principal de agua?"", ""¿Quién es responsable de las tuberías de agua?"", ""¿Está su calle inundada?"", ""¿Tiene un desbordamiento o una copia de seguridad de alcantarillado?"", ""¿Quién es responsable de las tuberías de alcantarillado?""]","[""MENÚ DE DEPARTAMENTO""]","[""DWSD Tips to Reduce Flooding""]",[],"" -2605,https://bouldercolorado.gov/events/police-oversight-panel-0,Poor Data Source,Poor Data Source,Police Oversight Panel | City of Boulder,"",200,Home | City of Boulder,"[""Police Oversight Panel"", ""Police Oversight Panel Meetings""]","[""Breadcrumb"", ""Details"", ""Meeting Details"", ""More Resources""]","[""Police Oversight Panel: Co-Chairs/IPM Meeting"", ""Police Oversight Panel: BPOP/Interim Chief of Police Meeting"", ""Police Oversight Panel: Subcommittee Community Engagement & Communications Meeting"", ""Police Oversight Panel: All Panel Meeting"", ""Police Oversight Panel: Co-Chairs/IPM Meeting"", ""Police Oversight Panel: Subcommittee Governance Meeting""]",[],[],[],"Calendar Jobs Contact Us Search English 繁體中文 Français Deutsch 한국어 Русский Español नेपाली en Locations Services Projects Government News Toggle Menu City of Boulder Locations Services Projects Government News Calendar Jobs Contact Us Search Breadcrumb Home Events Police Oversight Panel Details Date Thursday, September 9, 2021 Time 6:00 PM - 8:00 PM Locations Virtual Police Oversight Panel Meetings Boulder’s Police Oversight Panel meets on the second Thursday of every month. Add to Calendar Police Oversight Panel America/Denver

Boulder, CO
-United States

MM/DD/YYYY CONFIRMED OPAQUE Meeting Details Please click this URL to join. https://tinyurl.com/4fn8nbkz Or join by phone (253) 215-8782 Webinar ID: 994 9052 0297 Agenda Resignation of Sasha Strong and appointment process for alternate panel member Discussion of August 28 training: Scenario-based training and conducting investigations Observations and lessons learned from first round of case reviews Discussion and review of panel draft by-laws and operating procedures Monitor’s report Racial Equity Instrument update Report on outcome of case reviews Monthly case statistics Panel selection of cases to review Public Comment More Resources For panel-related inquiries, please contact Joseph Lipari at 720-376-3980 or liparij@bouldercolorado.gov . About the Police Oversight Panel Police Oversight Panel: Co-Chairs/IPM Meeting Virtual Fri Mar 29 2024 Police Oversight Panel: BPOP/Interim Chief of Police Meeting Virtual Mon Apr 1 2024 Police Oversight Panel: Subcommittee Community Engagement & Communications Meeting Virtual Thu Apr 4 2024 Police Oversight Panel: All Panel Meeting Penfield Tate II Municipal Building Virtual Wed Apr 10 2024 Police Oversight Panel: Co-Chairs/IPM Meeting Virtual Fri Apr 12 2024 Police Oversight Panel: Subcommittee Governance Meeting Virtual Tue Apr 16 2024 See All Events in Series Calendar Locations Services News Government Accessibility 1777 Broadway Boulder , CO 80302 Contact Us YouTube Twitter Facebook Instagram LinkedIn Nextdoor © 2024 City of Boulder. All Rights Reserved. Privacy Policy " -2606,https://delcopa.gov/pdf/animalshelterrfpfinal.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2607,https://www.scribner-ne.gov/wp-content/uploads/helicopter-3.jpg,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2608,https://www.montgomeryohio.gov/police-resources/,Poor Data Source,Poor Data Source,"Police resources - Montgomery, Ohio","",200,"Welcome - Montgomery, Ohio",[],"[""Primary menu links"", ""Action toolbar"", ""Welcome"", ""Engage"", ""Help"", ""Mental Health Resource""]",[],[],[],[],"Montgomery, Ohio Primary menu links Services Community Government Events News Contact Action toolbar Answers Report Issue Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Search Primary menu links Services Community Government Events News Contact Action toolbar Answers Report Issue Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Search Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Montgomery, Ohio Montgomery, Ohio Montgomery, Ohio Links to helpful resources: help.proucity.com help.proucity.com help.proucity.com Name * Required First Last Email * Required Phone Description * Required Links to helpful resources: help.proucity.com help.proucity.com help.proucity.com Name * Required First Last Email * Required Phone Description * Required Links to helpful resources: help.proucity.com help.proucity.com help.proucity.com Name * Required First Last Email * Required Phone Description * Required Links to helpful resources: help.proucity.com help.proucity.com help.proucity.com Name * Required First Last Email * Required Phone Description * Required Links to helpful resources: help.proucity.com help.proucity.com help.proucity.com Name * Required First Last Email * Required Phone Description * Required Links to helpful resources: help.proucity.com help.proucity.com help.proucity.com Name * Required First Last Email * Required Phone Description * Required " -2609,https://www.southamptontownnypolice.gov/878/deer-protection-and-management-advisory-,Not Criminal Justice Related,Not Criminal Justice Related,"Deer Protection and Management Advisory Committee | Southampton, NY - Official Website",The Town of Southampton created the Deer Protection and Management Advisory Committee as a key component to finding a unified approach to sustaining deer populations while balancing human needs.,200,"Police | Southampton, NY - Official Website","[""Deer Protection and Management Advisory Committee""]","[""Members"", "".Deer Management Program"", ""Deer Protection and Management Plan Goals"", ""Deer Management Strategies:"", ""Hunting"", ""Agriculture"", ""Sterilization"", ""Immunocontraception"", ""Marty Shea"", ""Information Concerning Ticks""]","[""Site Tools"", ""DEER NEWS AND NOTES:"", ""Contact Us"", ""FAQs"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2610,https://www.ci.bellefontaine.oh.us/announcements/bellefontaine-police-accepting-lateral-transfer-applicants,Training & Hiring Info,Info About Officers,"Bellefontaine Police Accepting Lateral Transfer Applicants - City of Bellefontaine, Ohio","We’re searching for the best! If you want to join a team that’s committed to excellence and committed to community policing, look no further! We offer competitive wage and benefits, paid vacations, education incentives, and quality training opportunitie",200,"City of Bellefontaine, Ohio - Welcome to Bellefontaine, Ohio!",[],"[""BPD Announcements"", ""Bellefontaine Police Accepting Lateral Transfer Applicants"", ""Bellefontaine Police Department"", ""Archives"", ""Categories""]",[],[],[],[],Home Government Departments Announcements Visitor Info DORA Bid Express Contact Employment Employee Portal more... Home Government Departments Announcements Visitor Info DORA Bid Express Contact Employment Employee Portal more... Home Government Departments Announcements Visitor Info DORA Bid Express Contact Employment Employee Portal more... Home Government Departments Announcements Visitor Info DORA Bid Express Contact Employment Employee Portal more... -2611,https://www.lehi-ut.gov/departments/police/lehi-police-ride-along/,Misc Police Activity,Police & Public Interactions,Lehi Police Ride-Along - Lehi City,"",200,Sucuri WebSite Firewall - Access Denied,"[""Lehi Police Ride-Along""]","[""RIDE ALONG APPLICATION"", ""Related Pages""]","[""OTHER RIDE-ALONG GOALS:"", ""GENERAL PROCEDURES:"", ""HOW DO YOU SIGN UP FOR A RIDE-ALONG"", ""Please complete the following:(Note: Any application that is incomplete will not be processed)"", ""THE RIDE-ALONG PARTICIPANT MUST AGREE TO ABIDE BY THE FOLLOWING RULES OF CONDUCT""]",[],[],[],"" -2612,https://delcopa.gov/council/2015minutes/081215minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2613,https://hilliardohio.gov/coffee-with-a-cop-2/,Poor Data Source,Poor Data Source,Join HPD for Coffee with a Cop - City of Hilliard,No agendas. No presentations. No speeches. Just casual conversation. Join the Hilliard Division of Police for a very special cup of morning Joe from 9,200,403 Forbidden,"[""Join HPD for Coffee with a Cop""]","[""Residents"", ""It’s a place you can be proud to call home."", ""Government"", ""We exhibit a heart for service, dedication to excellence, and strength in teamwork."", ""Recreation & Parks"", ""We believe in health, wellness, and vibrant quality of life for our community."", ""Police & Courts"", ""Our badge shows we protect and serve. Our approach shows we're part of the community."", ""FAQ"", ""How can we assist you?"", ""Related News"", ""Chipper Service Now Available by Online Request"", ""HPD Honors Employees of the Year"", ""No Injuries Reported from Overnight Storm"", ""LET'S CHAT!"", ""City of Hilliard"", ""Hilliard Police"", ""Rec & Parks"", ""Hilliard Newsletter""]",[],[],[],"[""Click the ‘x’ to opt out.""]",About Hilliard Accessing the Last Mile Aging in Place Committee Annual Events Available Properties Boards and Commissions Application Bridging The Digital Divide Building Standards Division Business Card Order Form Business Media Business Permitting Business Resources City Charter City Manager City of Hilliard – Home Collaborations for Technology Community Garden Community Resources Community Services and Programs Comprehensive Plan Contact the City Contact Us Demographics Designated Outdoor Refreshment Area (DORA) Disc Golf Discrimination Form Downtown Hilliard Downtown Hilliard Map Economic Development Electric Aggregation Engineering Division Ephemeral Wildflowers in Hilliard Fall Festival Feral Cats Fiber To The Home File a Report Online Food Waste Composting Program Forms and Applications HiFiO Hilliard City Lab Hilliard Development Corporation Hilliard Express Hilliard Public Arts Commission Hilliard Trails Hilliard’s Parks History Important Documents Incentives & Programs Information Technology Join the HPD Team Leaf Collection Lifestyle Major Employers Mapping Ohio’s Connectivity Mosquitos Neighborhood Crime Mapping Non Discrimination Now Hiring: Seasonal and Part-Time Positions Operations Department Opportunity Hilliard Personnel Review Board Planning Division Police Transparency in Policing Police Public Records Request Program Guide Public Bids Public Records Recreation and Parks – WebTrac RecTrac User Guide Recycling Roundabouts SAFE Sidewalk Program Sanitary Backflow Program Senior Programs Senior Resources Smart Streets Smart911 Social Investment Sponsorship Stationary Order Form Stormwater Management Street Maintenance & Rehabilitation Program Styrofoam Recycling Summer Rec Camp Sustainability Taxes The Well – Hilliard Recreation and Wellness Center Traffic Calming Traffic Enforcement Requests Transportation & Mobility Division Transportation Planning Trees Vacation House Check Victims Rights Videos Volunteer WebTrac Login Winter Weather Yard Waste Your Hilliard Residents Resident Resources Hilliard 311 Thank you Newsletter Signup Trash Rec & Parks Classes & Camps Rentals Master Parks Plan Pools & Passes The Senior Center Senior Citizen Hall of Fame Sports Government Newsroom Boards & Commissions Planning & Zoning Recreation and Parks Advisory Committee Records Commission Shade Tree Commission Environmental Sustainability Commission Keep Hilliard Beautiful Zoning Appeals Agendas & Minutes City Council Mayor’s Court Departments Community Development Finance Human Resources Law Q & A Business Communication Economic Development Emergency Alerts Fire Holidays HR Mayor’s Court Old Hilliard Police Rec & Parks Solicitation Taxes Trash Q&A Trees Q&A Reporting Online Library Norwich Township Schools Visit Hotels Old Hilliard News Privacy & Usage Policy Sitemap Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Accessibility by WAH Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Font Resize A- A+ Keyboard navigation Readable Font Contrast Choose color black white green blue red orange yellow navi Clear cookies Close Font Resize A- A+ Font Resize A- A+ Keyboard navigation Keyboard navigation Readable Font Readable Font Contrast Choose color black white green blue red orange yellow navi Contrast Choose color black white green blue red orange yellow navi black white green blue red orange yellow navi Clear cookies Clear cookies Accessibility by WAH Accessibility by WAH -2614,https://southamptontownnypolice.gov/335/services-programs,Not Criminal Justice Related,Not Criminal Justice Related,"Services & Programs | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Services & Programs""]","[""Municipal Works - Waste Management"", ""Edward Thompson"", ""Recycling Center Hours & Locations""]","[""Site Tools"", ""Contact Us"", ""Quick Links"", ""Contact Us"", ""Site Links"", ""Loading""]","[""Guest Speaker"", ""STOP Program (Hazardous Waste)"", ""Public Education & Outreach"", ""Tours""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Municipal Works - Waste Management Services & Programs Services & Programs 9 1 1 2 Guest Speaker Find out how to get a guest speaker present information to a group about recycling. STOP Program (Hazardous Waste) Learn about the STOP Program and the collection of household hazardous waste. Public Education & Outreach Gain information about composting, environmental issues, recycling tips, and pollution. Tours Take a tour of the North Sea Recycling Facility. Contact Us Municipal Works - Waste Management Email Waste Management Edward Thompson Waste Management Division Head Email Edward Thompson Ph: 631-702-1750 Fax: 631-287-1530 Office of Waste Management Town Hall - Lower Level 116 Hampton Road Southampton, NY 11968 Office Hours Monday - Friday 8:30 a.m. - 4:00 p.m. Staff Directory Recycling Center Hours & Locations Open 7 Days a Week Green Bags & Recyclables Only 8:30 a.m. - 4:00 p.m. Fee Based Disposal Scale Closes at 3:30 PM Waste Management Fee Schedule (PDF) Holiday Hours (PDF) Transfer Stations only closed on holidays Accepting Facilities Hampton Bays Center Fee based disposal and yard waste area close at 3:30 PM North Sea Center Fee based disposal and yard waste area close at 3:30 PM Sag Harbor Center Closed Wednesday Westhampton Center Closed Wednesday Yard waste area closes at 3:30 PM Quick Links Recycling Your Electronic Waste (eWaste) Guide to the Recycling Program Solid Waste Management Plan Update View All /QuickLinks.aspx Guest Speaker STOP Program (Hazardous Waste) Public Education & Outreach Tours Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -2615,http://www.longbeach.gov/police/press-releases/arrest-made-in-murder-case-2-/,Media Bulletins,Agency-Published Resources,ARREST MADE IN MURDER CASE(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/25/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: ARREST MADE IN MURDER CASE Contact: Media Relations Detail (562) 570-5273 Long Beach Police arrested a man in connection with a murder that occurred earlier this year. On June 5, 2015, at approximately 10:00 p.m., Long Beach Police responded to a shooting in the 1200 block of E. 17th Street, which resulted in the death of 20-year-old Anthony Holston of Long Beach. On November 20, 2015, Long Beach Police arrested Luis Jerardo Reyes, 27-years-old and a resident of Long Beach, after an extensive investigation. On November 24, 2015, detectives presented their case to the Los Angeles County District Attorney’s Office who charged Reyes with the murder of Anthony Holston, attempt murder, shooting at an occupied vehicle, and a gang enhancement. Reyes is being held in Los Angeles County Jail on $3,000,000 bail. The investigation remains ongoing. Anyone with information regarding the murder is urged to contact Long Beach Police Homicide Detectives Hugo Cortes and Oscar Valenzuela at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2616,https://bouldercolorado.gov/police-master-plan-process-subcommittee,Policies & Contracts,Info About Agencies,Police Master Plan Process Subcommittee | City of Boulder,"",200,Home | City of Boulder,"[""Police Master Plan Process Subcommittee""]","[""Breadcrumb"", ""Contact Police Master Plan Process Subcommittee"", ""Purpose and Role"", ""Members"", ""Meeting Schedule"", ""Meeting Materials""]","[""Email""]",[],[],[],"Calendar Jobs Contact Us Search English 繁體中文 Français Deutsch 한국어 Русский Español नेपाली en Locations Services Projects Government News Toggle Menu City of Boulder Locations Services Projects Government News Calendar Jobs Contact Us Search Breadcrumb Home Police Master Plan Process Subcommittee Contact Police Master Plan Process Subcommittee Email BPDProcessSubcommittee@bouldercolorado.gov Purpose and Role The purpose of the Police Master Plan Process Subcommittee is to partner with staff in developing, supporting and ensuring best practices related to the overall planning process and public engagement for the master plan. Part of the role of the subcommittee is to guide, with course correction, when needed, and “champion” the project, using their knowledge of the in-depth work behind the process to help explain its evolution to peers, stakeholders and the community. The council members also serve as advisors about how frequently, and when, to update other decision-makers. Discussion of policy issues or plan content will not be part of the subcommittee’s purview. Deliberations and decisions on plan content and policy are reserved for the full council. Subcommittee members may provide input on such items as collaborative approaches to community engagement, the community engagement plan, design and implementation of engagement opportunities, timing and scheduling of public engagement as well as the frequency and timing for board and council items (e.g. Information Packets, study sessions, public hearings) and other process components. Staff and the process subcommittee plan to return to council in early 2021 to present the results of work to define the scope, schedule and public process. Members The Police Master Plan Process Subcommittee is comprised of two council members, Rachel Friend and Tara Winer and community members Mallory Kates and Marina La Grave. Meeting Schedule Police Master Plan Process Subcommittee Events Police Chief Town Hall Events Meeting Materials May 4, 2023 Meeting Notes Nov. 24, 2022 Meeting Cancelled Oct. 27, 2002 Meeting Cancelled Sept. 22, 2022 Meeting Notes Aug. 25, 2022 Meeting Notes July 2022 Meeting Cancelled June 2022 Meeting Cancelled May 26, 2022 Meeting Notes April 2022 Meeting Cancelled March 31, 2022 Meeting Notes February 24, 2022 Meeting Notes January 27, 2022 Meeting Notes December, 2021 Meeting Cancelled November 16, 2021 Meeting Notes October 26, 2021 Meeting Notes September 20, 2021 Meeting Notes August 12, 2021 Meeting Notes June 10, 2021 Meeting Notes May 13, 2021 Meeting Notes April 8, 2021 Meeting was canceled February 11, 2021 Meeting Notes January 14, 2021 Meeting Notes December 10, 2020 Meeting Notes November 12, 2020 Meeting Notes November 5, 2020 Meeting Notes September 24, 2020 Meeting Notes Calendar Locations Services News Government Accessibility 1777 Broadway Boulder , CO 80302 Contact Us YouTube Twitter Facebook Instagram LinkedIn Nextdoor © 2024 City of Boulder. All Rights Reserved. Privacy Policy " -2617,https://www.naperville.il.us/2022-news-articles/naperville-police-investigate-personal-injury-hit-and-run-crash/,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -2618,https://cityofyuma.colorado.gov/departments/emergency-services/police-department,List of Data Sources,Info About Agencies,Police Department | City of Yuma,"",200,Home | City of Yuma,"[""Police Department""]",[],"[""Our Mission""]","[""Forms and Resources""]",[],[],"" -2619,http://police.byram-ms.us/wpt_slider/sro/,Poor Data Source,Poor Data Source,sro | Byram Police Department,"",200,Byram Police Department | Byram Police Department,"[""sro""]","[""Byram Weather""]","[""Post navigation"", ""Byram Police Department""]",[],[],[],"Byram Police Department Home COVID-19 Resources I received a letter about my stolen item – NCIC Validation Search for: Main Menu ≡ × Home About Us Partners With Police Victim Services Center for Violence Preventon MS Coalition Against Domestic Violence Mississippi Coalition Against Sexual Assault The Tower – Specialized Services for Human Trafficking Victims Mississippi Sex Offender Registry Search MDOC Victim Notifications House Watch Alarm Registration Employment Contact Us Pass it On Police Records Request Commend an Officer/Employee File a Complaint FAQs News Police Records Police Records Request NCIC Validation Byram, Mississippi Sites > Byram Police Department > Slides > sro sro This entry was posted on May 13, 2016 by byram_admin . Post navigation carside → Byram Police Department 141 Southpointe Dr. Byram, MS 39272 For general questions, please call: (601) 372-2327 Social Media facebook linkedin instagram Byram Weather Home About Us Partners With Police Employment Contact Us FAQs News Police Records Copyright © 2024 Byram Police Department . Back to top Byram Police Department Home COVID-19 Resources I received a letter about my stolen item – NCIC Validation Search for: Main Menu ≡ × Home About Us Partners With Police Victim Services Center for Violence Preventon MS Coalition Against Domestic Violence Mississippi Coalition Against Sexual Assault The Tower – Specialized Services for Human Trafficking Victims Mississippi Sex Offender Registry Search MDOC Victim Notifications House Watch Alarm Registration Employment Contact Us Pass it On Police Records Request Commend an Officer/Employee File a Complaint FAQs News Police Records Police Records Request NCIC Validation Byram Police Department Home COVID-19 Resources I received a letter about my stolen item – NCIC Validation Search for: Byram Police Department Main Menu ≡ × Byram, Mississippi Sites > Byram Police Department > Slides > sro sro This entry was posted on May 13, 2016 by byram_admin . Post navigation carside → Byram, Mississippi Sites > Byram Police Department > Slides > sro sro This entry was posted on May 13, 2016 by byram_admin . Post navigation carside → Byram, Mississippi Sites > Byram Police Department > Slides > sro Byram Police Department 141 Southpointe Dr. Byram, MS 39272 For general questions, please call: (601) 372-2327 Social Media facebook linkedin instagram Byram Weather Home About Us Partners With Police Employment Contact Us FAQs News Police Records Copyright © 2024 Byram Police Department . Back to top Byram Police Department 141 Southpointe Dr. Byram, MS 39272 For general questions, please call: (601) 372-2327 Social Media facebook linkedin instagram Byram Weather Byram Police Department 141 Southpointe Dr. Byram, MS 39272 For general questions, please call: (601) 372-2327 Social Media facebook linkedin instagram Byram Police Department 141 Southpointe Dr. Byram, MS 39272 For general questions, please call: (601) 372-2327 Social Media facebook linkedin instagram " -2620,https://www.lincolnca.gov/en/living-here/police-department.aspx?_mid_=484,Resources,Agency-Published Resources,"Police Department - - - City of Lincoln","",200," - City of Lincoln -","[""Police Department""]","[""Online Reports Include:"", ""Do Not"", ""Contact Us"", ""Resources""]",[],[],[],[],"This website uses cookies to enhance usability and provide you with a more personal experience. By using this website, you agree to our use of cookies as explained in our Privacy Policy. Agree Agree " -2621,https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-courtesy-department-issued-bwc/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2622,https://covington.va.us/city-government/city-departments/police/police-patrol/,Misc Police Activity,Police & Public Interactions,Police Patrol - Covington City,"",200,Home - Covington City,"[""Police Patrol"", ""Police Patrol""]","[""TOP ONLINE LINKS""]",[],"[""NOTICES"", ""GOOD FRIDAY"", ""INVITATION TO BID – S. Lexington Sewer Extension Project"", ""CALENDAR""]",[],[],"" -2623,https://www.desmoineswa.gov/departments/police/forms_documents,Resources,Agency-Published Resources,"Forms / Documents - City of Des Moines, WA","",200,Just a moment...,"[""City of Des Moines, WA""]","[""Forms / Documents""]",[],[],[],[],Skip to Content -2624,https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/bwc-dmav-vendors-glossary-and-additional-information/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2625,http://lafayettepolice.us/1585/concessions-nearby-restaurants,Not Criminal Justice Related,Not Criminal Justice Related,"Concessions / Nearby Restaurants | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Concessions / Nearby Restaurants""]",[],"[""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Plan Your Visit About the Zoo Get Involved Education Programs Special Events I Want To... Home Government Departments H - W Parks & Recreation Facilities Columbian Park Zoo Plan Your Visit Amenities Concessions / Nearby Restaurants Concessions / Nearby Restaurants All the excitement of the zoo got you feeling hungry? Treat yourself to a chocolate bar, candy or zoo-themed novelty item at the Zoo Gift Shop. Sports drinks and bottled water are also available for a refreshing drink! For more substantial fare, check out the concession stand at Tropicanoe Cove next door to the Zoo, or visit one of the neighborhood’s family-friendly restaurants: Arni’s (pizza, sandwiches, salads) – located on Wallace Avenue The Original Frozen Custard (frozen custard, drinks, burgers, hot dogs, etc) – located at Wallace and Main Prefer to bring your own lunch? No problem! Columbian Park has many picnic shelters and grassed area perfect for a picnic, located just outside the Zoo gate. Gift Shop Train & Rides Concessions / Nearby Restaurants Other things to do in Columbian Park Aquatics McAllister Center Rentals Zoo Contact Us 20 N 6th Street Lafayette, IN  47901 Phone: 765-807-1000 FAQs How do I navigate the Lafayette website? Do I need to create an account? How do I find something fun and exciting to do in Lafayette? How do I report a pothole or damaged street? /FAQ.aspx Site Links Home Accessibility Contact Us Copyright Notices Site Map /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -2626,https://www.rentonwa.gov/city_hall/police/patrol_operations/false_alarm_reduction_program,Misc Police Activity,Police & Public Interactions,False Alarm Reduction Program - City of Renton,"",200,Just a moment...,"[""CITY OF RENTON WASHINGTON""]","[""False Alarm Reduction Program""]",[],"[""City of Renton Kicks Off a New False Alarm Reduction Program"", ""Appeal Guidelines"", ""False Alarm Prevention Tips"", ""Frequently Asked Questions""]",[],[],Skip navigation -2627,https://spdblotter.seattle.gov/2014/10/20/police-investigating-collision-between-vehicle-and-pedestrian-in-northgate-area/,Media Bulletins,Agency-Published Resources,Police Investigating Collision Between Vehicle and Pedestrian in Northgate Area - SPD Blotter,"",200,403 Forbidden,"[""Police Investigating Collision Between Vehicle and Pedestrian in Northgate Area""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -2628,https://champaignil.gov/2014/08/11/champaign-police-investigate-domestic-battery-shooting/,Media Bulletins,Agency-Published Resources,Champaign Police Investigate Domestic Battery Shooting - City of Champaign,"",200,403 Forbidden,"[""Champaign Police Investigate Domestic Battery Shooting""]","[""News Releases"", ""Department News""]",[],[],[],[],"skip to content City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs Champaign Police Investigate Domestic Battery Shooting Search Posted on August 11, 2014 On Saturday, August 9, 2014, at approximately 1:46 AM, the Champaign Police responded to a report of a shooting in the 700 block of Tawney Court. Upon arrival, officers learned that a domestic battery had occurred between a 68 year-old father and 40 year-old son, and that the father shot the son during the argument. The son was transported to a local hospital for treatment of his injuries, which do not appear to be life threatening. Champaign Police Investigations responded to this incident and conducted several interviews.  At this point in the investigation indications are that the shooting may have resulted from the  father defending himself, and no arrests have been made. However, the investigation  continues and the case will be forwarded to the Champaign County State’s Attorney for review. The Champaign Police do not believe that this incident presents any danger to the public. Officers were able to identify, locate, and interview those individuals involved and have concluded this incident was a case of domestic battery. The Champaign Police continue to investigate this crime and is asking for assistance from the public. Anyone with information is asked to call Champaign Police at 217-351-4545 or callers can remain anonymous by calling Crime Stoppers at 217-373-8477 (TIPS). Tips can also be submitted through www.373tips.com or text by sending CCTIP plus the information to 274637 (CRIMES). Categories: Police Department Press Releases Tags: Battery , Champaign , Domestic , father , investigate , police , Shooting , son Subscribe to City News Read All City News News Releases General Construction Fire Department Police Department Department News City Council City Manager’s Office Equity and Engagement Department Finance Department Fire Department Human Resources Department Information Technologies Department Legal Department Library METCAD 9-1-1 Neighborhood Services Department Planning and Development Department Police Department Public Works Department The Champaign Insider City Newsletter City of Champaign City of Champaign 102 N. Neil St. Champaign, IL 61820 217-403-8700 Site Disclaimer I Privacy Policy City of Champaign Main Menu Home About City Council Meeting Documents Vision, Guiding Principles, and Goals Council Videos Boards and Commissions City Departments Building Safety Division City Manager’s Office Equity and Engagement Finance Fire Human Resources Information Technologies Legal Library Liquor Commissioner Neighborhood Services Parking Programs Planning and Development Police Public Works Contact Us Online Services Jobs City of Champaign " -2629,https://www.mass.gov/doc/attachment-a-police-departments/download,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2630,https://delcopa.gov/ems/pdfdocs/initialcertificationeducationtesting/emsinstructorchecklist.doc,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2631,https://www.mass.gov/info-details/audit-of-the-massachusetts-rehabilitation-commission-objectives-scope-and-methodology,Media Bulletins,Agency-Published Resources,"Audit of the Massachusetts Rehabilitation Commission Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Massachusetts Rehabilitation Commission,200,Mass.gov,"[""Audit of the Massachusetts Rehabilitation Commission Objectives, Scope, and Methodology""]","[""Table of Contents for the audit, Audit of the Massachusetts Rehabilitation Commission"", ""Table of Contents"", ""Overview"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[],"" -2632,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/may-19-activity-report/,Annual & Monthly Reports,Info About Agencies,May 19 Activity Report - Town of Cheswold,"",200,"Home - Town of Cheswold - Kent County, Delaware","[""Cheswold""]","[""Delaware"", ""May 19 Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[],"Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Skip to Content Skip to Footer Toggle navigation Menu Government Mayor Town Council Boards & Commissions Departments Elections Meetings & Events Public Notices Past Minutes & Agendas Info Public Hearings Comprehensive Plan Ordinances Taxes & Fees Delinquent Tax List Forms Town Charter Flag Status Past Minutes & Agendas Resolutions Community About Our Town Cheswold Welcome Packet Cheswold’s Airport Cheswold Newsletter Churches & Houses of Worship Colleges & Universities Libraries Local Developments Public Schools News Police About the Cheswold Police Department Police Reports Chief’s Page Cheswold Police Officers Cheswold Police Department Policy Manual Civilian Complaint Packet Crime Statistics Cheswold Police Department – Yearly Traffic Statistics Informational Pamphlets and Forms Law Enforcement Links Most Wanted Police Contact Form Police Employment Police News Ride-A-Long Program Sex Offender List Vacation Check Requests Photo Galleries Contact Contact Us FOIA Form Cheswold Delaware Listen May 19 Activity Report May 19 Activity Report Cheswold Delaware Listen May 19 Activity Report May 19 Activity Report Listen May 19 Activity Report May 19 Activity Report Listen May 19 Activity Report May 19 Activity Report Listen May 19 Activity Report May 19 Activity Report Listen Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form Address: 691 Main Street Cheswold, DE 19936 Call Us: (302) 734-6991 Reach Out: Contact Form FOIA Form " -2633,https://delcopa.gov/publicrelations/releases/2021/primary_electiondayguide.html,Not Criminal Justice Related,Not Criminal Justice Related,"The Delaware County 2021 Municipal Primary Election Day Guide - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""The Delaware County 2021 Municipal Primary Election Day Guide""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Polling Places, Secured Ballot Drop Boxes, Mask Guidance, Late Vote-by-Mail Ballot Options, and more!"", ""SAMPLE BALLOTS AND BALLOT MEASURES"", ""FINDING YOUR POLLING PLACE"", ""SECURED BALLOT DROP BOXES"", ""VOTING BY MAIL"", ""NAKED BALLOTS"", ""LATE OR MISSING VOTE-BY-MAIL BALLOTS"", ""DELAWARE COUNTY’s ELECTION HOTLINE AND VOTER SERVICE CENTER"", ""COVID-19 GUIDANCE: MASKS AND SOCIAL DISTANCING""]",[],[],"" -2634,https://www.memphistn.gov/news/category/police/,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -2635,http://police.byram-ms.us/contact-us/recordsrequest/,Records Request Info,Agency-Published Resources,Police Records Request | Byram Police Department,"",200,Byram Police Department | Byram Police Department,"[""Police Records Request""]","[""Byram Weather""]","[""Byram Police Department""]",[],[],[],"Byram Police Department Home COVID-19 Resources I received a letter about my stolen item – NCIC Validation Search for: Main Menu ≡ × Home About Us Partners With Police Victim Services Center for Violence Preventon MS Coalition Against Domestic Violence Mississippi Coalition Against Sexual Assault The Tower – Specialized Services for Human Trafficking Victims Mississippi Sex Offender Registry Search MDOC Victim Notifications House Watch Alarm Registration Employment Contact Us Pass it On Police Records Request Commend an Officer/Employee File a Complaint FAQs News Police Records Police Records Request NCIC Validation Byram, Mississippi Sites > Byram Police Department > Contact Us > Police Records Request Police Records Request The Byram Police Department provides police reports and records in accordance with applicable State Statutes and Municipal Ordinances. For further information regarding this form and the City’s Public Records Policy, including fees, please visit the Public Records Procedure for more information. A printed copy of the aforementioned policy is available in the Office of the City Clerk for inspection. * Denotes Required Information Preferred Delivery Method Email Mail to Address (Fees apply) Fax Pick up in Person You may also fax your request request by completing the Public Records Request Form to (601) 346-7081 Certain fees apply. For an estimated cost to produce your records request, please contact the Police Records Section at (601) 372-7747. A response to your request will be provided to you within seven (7) working days of your request. Byram Police Department 141 Southpointe Dr. Byram, MS 39272 For general questions, please call: (601) 372-2327 Social Media facebook linkedin instagram Byram Weather Home About Us Partners With Police Employment Contact Us FAQs News Police Records Copyright © 2024 Byram Police Department . Back to top Byram Police Department Home COVID-19 Resources I received a letter about my stolen item – NCIC Validation Search for: Main Menu ≡ × Home About Us Partners With Police Victim Services Center for Violence Preventon MS Coalition Against Domestic Violence Mississippi Coalition Against Sexual Assault The Tower – Specialized Services for Human Trafficking Victims Mississippi Sex Offender Registry Search MDOC Victim Notifications House Watch Alarm Registration Employment Contact Us Pass it On Police Records Request Commend an Officer/Employee File a Complaint FAQs News Police Records Police Records Request NCIC Validation Byram Police Department Home COVID-19 Resources I received a letter about my stolen item – NCIC Validation Search for: Byram Police Department Main Menu ≡ × " -2636,https://delcopa.gov/clerk/boardpositions/sustainability.html,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -2637,https://delcopa.gov/publicrelations/releases/2021/healthyfortheholidays.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Urges Residents to be ‘Healthy for the Holidays’ - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Urges Residents to be ‘Healthy for the Holidays’""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Healthy for the Holidays: Boosters"", ""Healthy for the Holidays: Children Ages 5 to 11 and Adolescents"", ""Healthy for the Holidays: Immunocompromised and Homebound Individuals"", ""Healthy for the Holidays: Where to Get the COVID-19 Vaccine"", ""Healthy for the Holidays: Testing"", ""Healthy for the Holidays: Staying Safe for Those Not Vaccinated or Around Unvaccinated People""]",[],[],"" -2638,https://pharr-tx.gov/animated-columns/pharr-police/,Poor Data Source,Poor Data Source,Pharr Police – City of Pharr,"",200,403 Forbidden,"[""Pharr Police""]",[],[],[],[],[],"" -2639,http://lafayettepolice.us/1672/internships,Training & Hiring Info,Info About Officers,"Internships | Lafayette, IN - Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Internships""]","[""Columbian Park Zoo offers a variety of exciting internship opportunities for current college students or recent graduates.  All academic majors are encouraged to apply."", ""For questions or additional information, please contact the Volunteer Coordinator at 765-807-1543 or cnave@lafayette.in.gov""]","["""", ""Internship Focus Areas (varies seasonally):"", ""Seasons and Time Commitments:"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2640,http://www.lafayettepolice.us/faq.aspx?qid=122,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Whom should I contact for assistance with a drainage,"",200,"Police Department | Lafayette, IN - Official Website",[],"[""▼ Water Quality, Watersheds & Stormwater""]","[""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2641,http://www.longbeach.gov/police/press-releases/traffic-fatality-4-/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY(4),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/22/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Monday, July 21, 2014, at approximately 10:15 p.m., Long Beach Police responded to the area of Ocean Boulevard and Orizaba Avenue regarding an injury traffic collision, which resulted in the death of a male adult, and serious injury to a second. When officers arrived, they discovered two unconscious male subjects. One of the subjects was lying in the grass behind the vehicle, while the other was still seated in the passenger seat of the heavily damaged vehicle. Long Beach Fire Department personnel responded to the scene and determined that the passenger, only being identified as a 27-year-old Long Beach resident, pending notification of next of kin, had sustained traumatic injuries to his head and body, and was pronounced deceased at the scene. The driver of the vehicle, identified as a 22-year-old Long Beach resident, was transported to a local hospital with internal injuries and remains in critical condition. Based on the preliminary investigation, which includes witness statements and evidence at the scene, investigators believe that two or more vehicles may have possibly been involved in street racing, while travelling westbound on Ocean Boulevard from Paloma Avenue. One of the vehicles, a yellow 2003 Honda S2000, lost control shortly after passing Paloma Avenue, and collided into two palm trees located on the south side of Ocean Boulevard directly across the intersection at Orizaba Avenue. After the collision, the other potentially involved vehicle(s) fled the scene. Whether alcohol was a factor in the collision is yet to be determined. The driver of a second vehicle was questioned and released and the investigation remains ongoing. Anyone with information regarding the incident or who may have witnessed the collision who has not spoken to authorities is asked to contact Long Beach Police Collision Investigation Detective Steve Fox at (562) 570-7355. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2642,https://rexburg.us/unified-police-locate-person-of-interest-in-suspicious-death-in-taylorsville/,Poor Data Source,Poor Data Source,"","",522,"","","","","","","","" -2643,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2021_news_releases/w_i_l_e_a_g_re-_accreditation,Media Bulletins,Agency-Published Resources,WILEAG Re-Accreditation - Village of Pleasant Prairie,"",200,Just a moment...,[],"[""WILEAG Re-Accreditation""]","[""Follow Us on Social Media""]",[],[],[],"" -2644,https://www.mass.gov/doc/semexant-jeffrey-v-boston-police-department-52121/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -2645,https://www.mass.gov/doc/beauregard-david-v-city-of-chicopee-4920/download,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -2646,http://www.longbeach.gov/police/about-the-lbpd/,Contact Info & Agency Meta,Info About Agencies,About the LBPD,"

- -  

",200,City of Long Beach,"[""Police Department""]","[""About the LBPD""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", """", ""LBPD Year in Review"", ""LBPD COMMAND STAFF"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", """", """", """", """", ""Crime Lab Survey"", """"]",[],"" -2647,https://www.wakeforestnc.gov/news/joyner-park-restrooms-destroyed-vandals-police-seek-public%e2%80%99s-help-identifying-culprits,Media Bulletins,Agency-Published Resources,"Joyner Park restrooms destroyed by vandals, police seek public’s help identifying culprits | Town of Wake Forest, NC","The Wake Forest Police Department is asking for the public’s help identifying the person or persons responsible for vandalizing the restrooms at E. Carroll Joyner Park, 701 Harris Road. Sometime late Saturday evening or early Sunday morning, vandals used rocks and other items to shatter glass doors and mirrors, clog toilets, and smash sinks.“I’m disgusted that someone would so",200,"Town of Wake Forest, NC","[""Joyner Park restrooms destroyed by vandals, police seek public’s help identifying culprits""]","[""fnow_may2019-40.jpg"", ""Town Hall Closed Friday, March 29"", ""Search form"", ""You are here""]",[],[],[],[],Skip to main content -2648,https://detroitmi.gov/departments/law-department/submit-foia-request/non-routine-or-complex-police-foia-request,Poor Data Source,Poor Data Source,"","",403,"","","","","","","","" -2649,https://townofeaton.colorado.gov/departments/police-department,Resources,Agency-Published Resources,"","",-1,"","","","","","","","" -2650,https://delcopa.gov/publicrelations/releases/2021/wellnesscenteropening.html,Not Criminal Justice Related,Not Criminal Justice Related,"Delaware County Council Officially Opens the Delaware County Wellness Center - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Delaware County Council Officially Opens the Delaware County Wellness Center""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Timeline :"", ""Vaccination Efforts:""]",[],[],"" -2651,https://www.antioch.il.gov/wpfb-file/04-09-13-police-pension-agenda-pdf/,Poor Data Source,Poor Data Source,"04-09-13 Police Pension Agenda - Antioch, IL",8444 04 09 13 police pension agenda pdf commissions fund agendas 2013 1365184892 5ac397bb3e0fdc037dd88aca92cea1f3 213x300 _mebhnck4ak6y thumb jpg 05 01 32 0 pdf application trustees dennis b crosby scott a pierce mary c dominiak ted p poulos jay jozwiak george sakas lawrence m hanson mayor lori k folbrick village clerk agenda of antioch lake county,200,"Home - Antioch, IL","[""04-09-13 Police Pension Agenda""]",[],[],[],[],[],Open toolbar Accessibility Tools Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset Accessibility Tools Increase Text Increase Text Decrease Text Decrease Text Grayscale Grayscale High Contrast High Contrast Negative Contrast Negative Contrast Light Background Light Background Links Underline Links Underline Readable Font Readable Font Reset Reset -2652,https://www.jacksonms.gov/meetings/personnel-management-administration-police-and-fire/,Resources,Agency-Published Resources,"Personnel Management, Administration, Police and Fire - Jackson, MS","",200,"City of Jackson - Jackson, MS","[""Personnel Management, Administration, Police and Fire""]","[""Primary menu links"", ""Action toolbar"", ""Contact"", ""Subscribe"", ""Connect""]","[""9:00 am Jackson City Hall""]",[],"[""""]","[""219 S President St, Jackson 39205""]","Jackson, MS Primary menu links Residents Businesses Visitors Government News Contact Action toolbar Answers Payments Report Issue Search Primary menu links Residents Businesses Visitors Government News Contact Action toolbar Answers Payments Report Issue Search Jackson, MS Jackson, MS Jackson, MS Proclamation of Local Emergency ___________________________________________________________________________________________________________________________________ The City of Jackson’s Water and Sewer Business Administration is now JXN Water. Click here . _____________________________________________________________________________________________________________________________________ PEG Network Off-Air Announcement: PEG Network is currently off the air as we undergo a relocation. We appreciate your patience during this transition. In the meantime, you can stay connected with PEG Network here or visit our YouTube channel at www.youtube.com/@JacksonPEGNetwork Personnel Management, Administration, Police and Fire Aug 12 2020 9:00 am Jackson City Hall 219 S President St, Jackson 39205 Share Facebook Twitter Email Agenda Personnel Management Department Administration Department Jackson Police Department Jackson Fire Department Personnel Management, Administration, Police and Fire Aug 12 2020 9:00 am Jackson City Hall 219 S President St, Jackson 39205 Share Facebook Twitter Email Agenda Personnel Management Department Administration Department Jackson Police Department Jackson Fire Department Aug 12 2020 9:00 am Jackson City Hall 219 S President St, Jackson 39205 Share Facebook Twitter Email Aug 12 2020 Aug 12 2020 9:00 am Jackson City Hall 219 S President St, Jackson 39205 Share Facebook Twitter Email Personnel Management Department Administration Department Jackson Police Department Jackson Fire Department Personnel Management Department Administration Department Jackson Police Department Jackson Fire Department Personnel Management Department Administration Department Jackson Police Department Jackson Fire Department Personnel Management Department Administration Department Jackson Police Department Jackson Fire Department Helpful Share Facebook Twitter Email Size + Reset a − Translate Translate language select Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Select language Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu " -2653,https://sf.gov/departments/department-police-accountability,Resources,Agency-Published Resources,Department of Police Accountability | San Francisco,We investigate complaints about police officers and recommend policy changes.,200,City and County of San Francisco,"[""Department of Police Accountability""]","[""Meetings"", ""Services"", ""News"", ""Events"", ""Resources"", ""About"", ""Contact"", ""Footer menu"", ""Footer Bottom""]","[""Past meetings"", ""Policing concerns"", ""Volunteering"", ""Department of Police Accountability""]","["""", """"]",[],[],"" -2654,https://alpha.austin.gov/es/police-oversight/formal-complaint-obedience-to-orders/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2655,https://www.southamptontownnypolice.gov/953/lyzon-hat-shop,Not Criminal Justice Related,Not Criminal Justice Related,"Lyzon Hat Shop | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""Lyzon Hat Shop""]","[""Lyzon Hat Shop"", ""TIME-LINE:""]","[""Site Tools"", ""Contact Us"", ""Maria Z. Moore"", ""Hours:"", ""Contact Us"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Community Info Hamlets Hampton Bays Community Projects Lyzon Hat Shop Lyzon Hat Shop COMPLETED 2018 Lyzon Hat Shop Located at 116 Main Street in Hampton Bays, this building dates back to the 1850’s and once served as a shop for one- of- a- kind hats by Walter King! The wealthy and royalty were his customers. Now this historic building will be enjoyed for generations to come. This structure was donated by Anita and Bryan Whalen to the Hampton Bays Historical and Preservation Society about ten years ago and then turned over to the Town of Southampton for preservation. The renovation was supported through the Community Preservation Fund.  The ribbon cutting and grand opening was held on June 30, 2018.  The Hampton Bays Historical and Preservation Society will now manage the exhibits and the museum. TIME-LINE: 2018 - June 30 , Ribbon Cutting 2018 - Spring , Landscaping completed 2017 - Stewardship, Hampton Bays Historical and Preservation Society will include landscaping work 2017 - April, The Lyzon Hat Shop restoration has been completed. 2016 - Moved onto its new foundation next to the historic Prosper King House. Restoration begins. 2013 - Town acquires ownership of the building from the Hampton Bays Historical Society 2007 - Moved to current location and placed on steel beams to await new foundation 2005 - Town purchases land for relocation of Lyzon Hat Shop Contact Us Maria Z. Moore Supervisor Email Maria Z. Moore, Supervisor Town Hall (Second Floor) 116 Hampton Road Southampton, NY 11968 Ph: 631-283-6055 Hours: Monday-Friday 8:30 am – 4:00 pm Staff Directory Dune Road Resurfacing Good Ground Park Entertainment Application On Stage Lyzon Hat Shop Maritime Park Old Ponquogue Bridge Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -2656,https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-4/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2657,http://www.longbeach.gov/police/press-releases/murder-37-/,Media Bulletins,Agency-Published Resources,MURDER(37),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/24/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MURDER Contact: Media Relations (562) 570-5273 On Thursday, September 24, 2015, at approximately 4:11 A.M., Long Beach Police responded to the 700 block of east 56th Street regarding a person who had been shot. When officers arrived, they discovered a male adult down on the street who had been struck by gunfire. Long Beach Fire Department paramedics responded and pronounced the victim deceased at the scene. The victim has been identified as 22-year-old Jeremy Cornell McFarland of Bellflower. No suspect information is available at this time. The motive for this crime is unknown and the investigation remains ongoing. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detectives Malcolm Evans and Mark Bigel at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/24/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: MURDER Contact: Media Relations (562) 570-5273 On Thursday, September 24, 2015, at approximately 4:11 A.M., Long Beach Police responded to the 700 block of east 56th Street regarding a person who had been shot. When officers arrived, they discovered a male adult down on the street who had been struck by gunfire. Long Beach Fire Department paramedics responded and pronounced the victim deceased at the scene. The victim has been identified as 22-year-old Jeremy Cornell McFarland of Bellflower. No suspect information is available at this time. The motive for this crime is unknown and the investigation remains ongoing. Anyone with information regarding this incident is urged to contact Long Beach Police Homicide Detectives Malcolm Evans and Mark Bigel at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . A- A A+ A- A A+ A- A A+ A- A A+ A- A A+ " -2658,https://www.belen-nm.gov/wp-content/uploads/2021/01/120193874_3263039293803054_6835373498020090735_o-copy.jpg,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2659,https://www.coppelltx.gov/faq.aspx?qid=232,Resources,Agency-Published Resources,FAQs • What can be done about speeding on my residential str,"",200,"Coppell, TX | Official Website",[],"[""Speed Study"", ""Speed Bumps"", ""▼ Traffic"", ""Distance Between Traffic Signals"", ""Time Frame for Installation of a Traffic Signal"", ""Eligibility"", ""Alternate Routes"", ""Reasons to Not Install Speed Bumps"", ""Studies"", ""Amount of Feet Needed on Streets"", ""No Parking Areas"", ""Report a Car"", ""Speed Study"", ""Speed Bumps"", ""Example to Not Install Stop Signs"", ""When Stop Signs Are Installed""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -2660,https://spdblotter.seattle.gov/2017/12/05/police-need-your-help-identifying-man-who-robbed-two-lower-queen-anne-businesses/,Media Bulletins,Agency-Published Resources,Police Need Your Help Identifying Man Who Robbed Two Lower Queen Anne Businesses - SPD Blotter,"",200,403 Forbidden,"[""Police Need Your Help Identifying Man Who Robbed Two Lower Queen Anne Businesses""]","[""Find Posts By Topic"", ""Featured Posts"", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],"Seattle.gov Choose a language: English English Google Translate may not accurately translate all content. Read disclaimer . For general City questions, please call 206-684-2489 . Tell us your requested language in English, and we can connect you with an interpreter. Continue Cancel Español Es posible que Google Translate no traduzca con precisión todo el contenido. Lea el descargo de responsabilidad . Si necesita ayuda en otro idioma, díganos en inglés nombre del idioma que necesita y lo conectaremos con un intérprete: 206-684-2489 Seguir Cancelar 中國語文 Google翻譯可能無法準確翻譯所有內容。 閱讀免責聲明 。 如果您需要翻譯,請用英語説出您所需要的語言,我們將爲你連接口譯員: 206-684-2489 繼續 取消 简体中文 Google翻译可能无法准确翻译所有内容。 阅读免责声明 。 如果您需要翻译,请用英语说出您所需要的语言,我们将为你连接口译员: 206-684-2489 继续 取消 Tiếng Việt Google Dịch có thể không dịch chính xác tất cả nội dung. Đọc tuyên bố từ chối trách nhiệm . Nếu quý vị cần hỗ trợ về ngôn ngữ, xin vui lòng cho chúng tôi biết ngôn ngữ quý vị cần hỗ trợ bằng tiếng Anh (ví dụ “Vietnamese”), chúng tôi sẽ kết nối quý vị với một thông dịch viên: 206-684-2489 Tiếp tục Huỷ bỏ русский язык Google Translate не может точно перевести весь контент. Прочтите отказ от ответственности . Если вам нужна языковая помощь, сообщите нам на английском, какой язык вам нужен, и мы свяжем вас с переводчиком: 206-684-2489 Продолжать Отмена Af-Soomaali Google Translate ayaan si sax ah u turjumi karin dhammaan waxyaabaha ku jira. Akhri afeef . Haddii aad u baahan tahay caawimaad luqadeed, fadlan noogu sheeg Ingiriisiga luqadda aad u baahan tahay, ka dib waxaan kugu xiri doonnaa turjubaan: 206-684-2489 Sii wad Jooji አማርኛ የጉግል ትርጉም ሁሉንም ይዘቶች በትክክል መተርጎም ላይችል ይችላል። ማስተባበያ አንብብ ፡፡ ኣስተርጓሚ ካስፈለግዎ የሚፈልጉትን ቋንቋ በእንግልዝኛ ይንገሩን፣ ከኣስተርጓሚ እናገናኝዎታለን። 206-684-2489 ቀጥል ሰርዝ 한국어 구글은 정확하게 모든 내용을 번역하지 않을 수 있습니다 번역. 읽기 면책 조항 . 언어지원이 필요한 경우, 필요한 언어를 영어로 말씀해 주시면 통역사와 연결해 드리겠습니다: 206-684-2489 계속하다 취소 Tagalog Maaaring hindi tumpak na isalin ng Google Translate ang lahat ng nilalaman. Basahin ang disclaimer . Para sa mga pangkalahatang katanungan sa Lungsod, mangyaring tawagan ang 206-684-2489 . Sabihin sa amin ang hiniling mong wika sa Ingles, at maikokonekta ka namin sa isang interpreter. Magpatuloy Kanselahin ภาษาไทย Google Translate อาจแปลเนื้อหาทั้งหมดไม่ถูกต้อง อ่านข้อจำกัดความรับผิดชอบ สำหรับคำถามทั่วไปเกี่ยวกับเมืองโปรดโทร 206-684-2489 บอกภาษาที่คุณต้องการเป็นภาษาอังกฤษและเราสามารถติดต่อคุณกับล่ามได้ ดำเนินการต่อ ยกเลิก 日本語 Google翻訳は、すべてのコンテンツを正確に翻訳するとは限りません. 免責事項をお読みください 。 市の一般的な質問については 206-684-2489 に電話してください。ご希望の言語を英語で教えていただければ、通訳をご案内いたします。 継続する キャンセル ភាសាខ្មែរ កម្មវិធីបកប្រែហ្គូហ្គោលមិនអាចបកប្រែមាតិកាទាំងអស់បានត្រឹមត្រូវទេ។ អានការបដិសេធ។ សម្រាប់សំណួរទូទៅរបស់ទីក្រុងសូមទូរស័ព្ទមក 206-684-2489 ។ ប្រាប់យើងពីភាសាដែលអ្នកស្នើសុំជាភាសាអង់គ្លេសហើយយើងអាចភ្ជាប់អ្នកជាមួយអ្នកបកប្រែភាសា។ បន្ត បោះបង់ ພາສາລາວ Google Translate ອາດຈະບໍ່ແປເນື້ອຫາທັງ ໝົດ ຢ່າງຖືກຕ້ອງ. ອ່ານປະຕິເສດ . ສຳ ລັບ ຄຳ ຖາມທົ່ວໄປຂອງເມືອງ, ກະລຸນາໂທຫາ 206-684-2489 . ບອກພວກເຮົາເປັນພາສາອັງກິດທີ່ທ່ານຮ້ອງຂໍ, ແລະພວກເຮົາສາມາດເຊື່ອມຕໍ່ທ່ານກັບນາຍແປພາສາ. ສືບຕໍ່ ຍົກເລີກ Українська Перекладач Google може не точно перекласти весь вміст. Прочитайте застереження . За загальними запитаннями про місто, будь ласка, телефонуйте 206-684-2489 . Розкажіть нам про вашу мову англійською мовою, і ми можемо зв’язати вас із перекладачем. Продовжуйте Скасувати Français Google Traduction peut ne pas traduire correctement tout le contenu. Lisez la clause de non-responsabilité . Pour des questions générales sur la ville, veuillez appeler le 206-684-2489 . Dites-nous votre langue souhaitée en anglais, et nous pourrons vous mettre en contact avec un interprète. Continuer Annuler " -2661,https://www.mass.gov/info-details/oig-annual-report-2019-division-of-state-police-oversight,Annual & Monthly Reports,Info About Agencies,OIG Annual Report 2019: Division of State Police Oversight | Mass.gov,Part VI of the Office of the Inspector General's 2019 Annual Report.,200,Mass.gov,"[""OIG Annual Report 2019: Division of State Police Oversight""]","[""Table of Contents for the report, Office of the Inspector General Annual Report 2019"", ""Table of Contents"", ""Overview"", ""I. Audits, Investigations and Reviews"", ""II. The MSP’s Efforts to Achieve Certification and Accreditation"", ""III. The MSP’s Efforts to Modernize and Centralize"", ""Related"", ""Related"", ""Help Us Improve Mass.gov with your feedback""]","[""The Division of State Police Oversight:"", ""Additional Resources""]",[],[],[],"" -2662,https://www.hayward-ca.gov/police-department/public-services/crisis-intervention,Resources,Agency-Published Resources,Crisis Intervention | City of Hayward - Official website,"Crisis intervention is not a stand-alone “program,” but is a service provided by the entire counseling staff regardless of their assigned program.",200,City of Hayward - Official website,[],"[""Crisis Intervention"", ""You are here. So is everything else."", ""Search form""]",[],"[""Common crisis services include :"", ""Hours of Operation :"", ""Office Location:"", ""Receive crime bulletins and alerts"", ""Report Problems"", ""Ask Questions"", ""Make a Suggestion"", ""Translate"", ""Search""]",[],[],"Skip to main content Search modal button POLICE Mobile Menu button Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Make a Payment Access Hayward Translate Search POLICE About HPD Divisions Programs Public Services Public Services Administrative Citations & Hearings Animal Services Identity Theft Youth and Family Services Bureau Crime Prevention Transparency Home Public Services Public Services Crisis Intervention Youth and Family Services Bureau counselors provide crisis intervention and referral services for those experiencing a personal or family crisis. Crisis intervention is not a stand-alone “program,” but is a service provided by the entire counseling staff regardless of their assigned program. Crisis intervention services cover a variety of situations. After the crisis is stabilized, follow up services and individually tailored behavioral “tools” are offered by Youth and Family Services Bureau counselors to help the individual and the family cope successfully with this and future stress. Crisis services are available on a drop-in basis or by telephone. For life threatening emergencies, call 9-1-1. Common crisis services include : Stabilizing family conflict when youth are exhibiting high risk behaviors including running away from home and high conflict relationships with parents; Grief counseling and support in the immediate aftermath of trauma; Safety planning to support those who might be a danger to themselves or others; Assisting police officers during the investigation of suspected child abuse to minimize the re-traumatization of the victim during the investigative process. Hours of Operation : Monday - Thursday: 9:00 a.m. - 7:00 p.m. Friday: 9:00 a.m. - 5:30 p.m. Office Location: Hayward Police Department 300 W. Winton Ave. Hayward CA, 94544 (510) 293-7048 Youth and Fammily Services Bureau For more information contact : Youth and Family Services Bureau Supervisor Dr. Emily Young Hayward Police Department 300 W. Winton Ave. Hayward, CA 94544 (510) 293-7021 Emily.young@hayward-ca.gov Public Services Crisis Intervention File a Police Report Domestic Violence Services Administrative Citations & Hearings Animal Services Identity Theft Youth and Family Services Bureau Search modal button POLICE Mobile Menu button POLICE Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Make a Payment Access Hayward Translate Search Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Make a Payment Access Hayward Translate Search Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Make a Payment Access Hayward Translate Search Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Visit Hayward-ca.gov Discover Hayward Find Departments Look up City Services Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search Make a Payment Access Hayward Translate Search " -2663,http://www.longbeach.gov/police/press-releases/celebrate-the-4th-of-july-holiday-responsibly/,Media Bulletins,Agency-Published Resources,Celebrate the 4th of July Holiday Responsibly,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/10/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: CELEBRATE THE 4TH OF JULY HOLIDAY RESPONSIBLY Contact: Media Relations Detail (562) 570-5273 The 4th of July holiday is a great day to spend with friends and family and celebrate this great countries independence. The Long Beach Police Department encourages those celebrating the holiday to do so in a safe and responsible manner. We are reminding residents and visitors that all fireworks, including those marked “Safe and Sane,” are illegal in the City of Long Beach. The Police Department will be out in force the days leading up to and on July 4th to ensure compliance with the Long Beach City Ordinance that bans fireworks. Anyone found in violation of the city ordinance may be cited or arrested. Those found in violation may be faced with a $1,000 fine, sentenced to jail for six months, or both. The fines and penalties may increase depending on the fireworks’ classification. Police officers will also strictly enforce laws pertaining to drunk driving, drinking in public, public intoxication, underage drinking, and illegal barbecues. The use of personal barbecues in all city parks and beaches is prohibited. Use of permanent city installed barbecues is acceptable. All parks and beaches from Shoreline Drive to the end of the Peninsula will be heavily patrolled. For those who would like to enjoy fireworks, please plan to attend a safe and professionally controlled firework show to ensure the safety of your family, friends, and property. For those looking for a location to dispose of fireworks may voluntarily do so at all fire stations, Lifeguard Headquarters (2100 E. Ocean Boulevard, on the West side of the Junipero lot), or any police station. The Long Beach Police Department encourages responsible parenting and request that parents closely supervise their children, set expectations for proper behavior, and monitor their activities. We also urge everyone to follow the “See Something, Say Something”, philosophy, and report suspicious or illegal activity by calling Long Beach Police Dispatch at (562) 435-6711 or 9-1-1. Together, we can enjoy a safe holiday. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2664,https://www.pinevillenc.gov/government/departments/police/join-ppd/,Training & Hiring Info,Info About Officers,"Join PPD - Town of Pineville, NC","",200,403 Forbidden,"[""Join PPD"", ""Join PPD"", ""Town of Pineville Updates""]","[""Join Pineville Police Department"", ""Town of Pineville Contacts"", ""Important News & Updates"", ""Special Meeting Notice"", ""Early Voting in Pineville"", ""Advisory Board Openings for Pineville Residents"", ""Follow Pineville on Facebook""]","[""Basic Law Enforcement Training Programs"", ""Apply through our Human Resources Department:"", ""Emergency: Police, Fire & Rescue"", ""Non-Emergency:"", ""Town Hall Mailing Address:"", ""Town Hall Physical Address:"", ""Town Hall Office Hours:""]",[],[],[],"" -2665,https://delcopa.gov/sustainability/commission/otherpdfs/sustcommmtg_slidedeck_2021-8-19.pdf,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -2666,https://coloradosprings.gov/police-department/page/alternate-education-program,Resources,Agency-Published Resources,Alternate Education Program | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Alternate Education Program""]","[""Search"", ""Educational Program"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]","[""Do you have some college credits?"", ""Do you need to get some college credits?"", ""Do you have military experience?""]","[""Participating Schools with CSPD AEP:""]","[""CSU - Global"", ""Pikes Peak State College"", ""REPORT ONLINE""]",[],"" -2667,https://www.tukwilawa.gov/departments/police/command-staff-bios/pd-boyd-kraig-bio-pic/,Media Bulletins,Agency-Published Resources,"PD-Boyd, Kraig Bio Pic - City of Tukwila","",200,Home - City of Tukwila,"[""City of Tukwila News""]","[""PD-Boyd, Kraig Bio Pic""]",[],"[""City of Tukwila""]","[""I am a..."", ""Online Services"", ""Most Requested Forms""]",[],"" -2668,https://coloradosprings.gov/police-department/article/news/adrian-vasquez-serve-interim-police-chief,Media Bulletins,Agency-Published Resources,Adrian Vasquez to serve as interim police chief following Niski retirement | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Adrian Vasquez to serve as interim police chief following Niski retirement""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -2669,https://www.gurnee.il.us/government/departments/police-department/community-involvement/gurnee-citizen-police-academy/gurnee-citizen-police-academy/week-6,Training & Hiring Info,Info About Officers,Gurnee Citizen Police Academy,"",200," - Village of Gurnee -","[""Police Department""]","[""Gurnee Citizen Police Academy"", ""Youth Citizen Police Academy""]","[""Now accepting applications for the Spring 2024 session!"", ""Click here to register for the Gurnee Citizen Police Academy"", ""Village Hall""]",[],[],[],search edit file-word file-empty angle-left angle-right angle-up angle-down dollar calendar-check-o printer search2 briefcase circle-up circle-right circle-down circle-left share2 mail4 facebook twitter youtube file-pdf search edit file-word file-empty angle-left angle-right angle-up angle-down dollar calendar-check-o printer search2 briefcase circle-up circle-right circle-down circle-left share2 mail4 facebook twitter youtube file-pdf -2670,https://delcopa.gov/council/2018minutes/050218minutes.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2671,https://brookfieldil.gov/brookfields-police-and-fire-chiefs-safety-talk-for-seniors-9-19-19/mtc-2019-poster-3/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2672,https://alpha.austin.gov/police-oversight/joint-report-analysis-of-apd-racial-profiling-data/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2673,https://delcopa.gov/publicrelations/releases/2020/delcocares_sept1.html,Not Criminal Justice Related,Not Criminal Justice Related,"Applications for Delco CARES Housing Assistance Program Available September 1 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Applications for Delco CARES Housing Assistance Program Available September 1""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Residents affected by the COVID-19 Pandemic may be eligible for mortgage, rent, and utility assistance""]",[],[],"" -2674,https://www.milpitas.gov/milpitas/departments/police/community-relations/citizen-volunteer-and-explorer-applications/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2675,https://www.mass.gov/news/governor-baker-signs-police-reform-legislation,Poor Data Source,Poor Data Source,"","",403,"","","","","","","","" -2676,https://frederica.delaware.gov/tag/police-officer/,Training & Hiring Info,Info About Officers,police officer Archives - Frederica,"",200,"Home - Frederica - Kent County, Delaware","[""Frederica""]","[""Delaware"", ""Ad for Part-Time Police Officer""]","[""Menu"", ""Online Bill Pay"", ""Connect With Us!""]","[""Posts Tagged With: “police officer”""]",[],[],"Skip to Content Skip to Footer Toggle navigation Menu Home Government Town Hall Town Council & Employees Town Charter Town Code Planning & Zoning Meetings & Events Past Meeting Minutes & Agendas Flag Status Info Additional Resources Finance Fire Company Forms & Reports Police Department Trash & Recycling Water Dept./Public Works Community Places Around Town History Photo Gallery Town Newsletters News & Notices Online Bill Pay Contact Us Contact Form FOIA Form Utility Contact Form Skip to Content Skip to Footer Toggle navigation Menu Home Government Town Hall Town Council & Employees Town Charter Town Code Planning & Zoning Meetings & Events Past Meeting Minutes & Agendas Flag Status Info Additional Resources Finance Fire Company Forms & Reports Police Department Trash & Recycling Water Dept./Public Works Community Places Around Town History Photo Gallery Town Newsletters News & Notices Online Bill Pay Contact Us Contact Form FOIA Form Utility Contact Form Skip to Content Skip to Footer Toggle navigation Menu Home Government Town Hall Town Council & Employees Town Charter Town Code Planning & Zoning Meetings & Events Past Meeting Minutes & Agendas Flag Status Info Additional Resources Finance Fire Company Forms & Reports Police Department Trash & Recycling Water Dept./Public Works Community Places Around Town History Photo Gallery Town Newsletters News & Notices Online Bill Pay Contact Us Contact Form FOIA Form Utility Contact Form Frederica Delaware Frederica Delaware Frederica Delaware Frederica Delaware Posts Tagged With: “police officer” Ad for Part-Time Police Officer The Town of Frederica is seeking a part-time police officer to join our team.  The ad is running in the Delaware state news from June 26, 2016 to July 3, 2016.  Please have all applications submitted by July 11, 2016.  See below link for a copy of the running ad and application details. Ad for Part Time Police Officer Read More... << Mar 2024 >> S M T W T F S 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 Sign Up for Emergency Notifications Today! Online Bill Pay Connect With Us! " -2677,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0250/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2678,https://alpha.austin.gov/police-oversight/formal-complaint-obedience-to-orders-insubordination/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2679,http://www.tampa.gov/fire-and-police-pension/info/meeting-notices,List of Data Sources,Info About Agencies,Notices For Upcoming Meetings | City of Tampa, ,200,City of Tampa,"[""Notices For Upcoming Meetings""]","[""Fire And Police Pension"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[],"" -2680,http://www.longbeach.gov/police/contact-us/,Contact Info & Agency Meta,Info About Agencies,Contact Us,Long Beach Police Department - Contact Us,200,City of Long Beach,"[""Police Department""]","[""Police Department Phone List""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", """", """", """", """", ""Crime Lab Survey"", """"]",[],"" -2681,http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-two-arrests-3-/,Media Bulletins,Agency-Published Resources,DUI Checkpoint Nets Two Arrests(3),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2682,https://dagsboro.delaware.gov/police-department/police-department/nick-disciullo-promotion-2019-2/,Poor Data Source,Poor Data Source,Nick Disciullo promotion 2019 - Town of Dagsboro,"",200,Home - Town of Dagsboro - Sussex County Delaware,[],"[""Nick Disciullo promotion 2019""]","[""Menu"", ""Online Payments"", ""Agendas & Minutes"", ""Contact Us"", ""Connect With Us!""]",[],[],[],Skip to Content Skip to Footer Toggle navigation Menu Home Departments Town Hall Police Department Water Department Government Town Council Town Council Members Planning Commission Town Zoning Map Town Code Board of Adjustment Members Budgets Town Elections Community General Town Information History Fire Department Taxes & Utilities Prince George’s Chapel Prince George’s Chapel Cemetery Comprehensive Land Use Plan Houses of Worship Cable Services Hurricane Preparedness Flood Zone Information Christmas Events Forms Contact Us Skip to Content Skip to Footer Toggle navigation Menu Home Departments Town Hall Police Department Water Department Government Town Council Town Council Members Planning Commission Town Zoning Map Town Code Board of Adjustment Members Budgets Town Elections Community General Town Information History Fire Department Taxes & Utilities Prince George’s Chapel Prince George’s Chapel Cemetery Comprehensive Land Use Plan Houses of Worship Cable Services Hurricane Preparedness Flood Zone Information Christmas Events Forms Contact Us Skip to Content Skip to Footer Toggle navigation Menu Home Departments Town Hall Police Department Water Department Government Town Council Town Council Members Planning Commission Town Zoning Map Town Code Board of Adjustment Members Budgets Town Elections Community General Town Information History Fire Department Taxes & Utilities Prince George’s Chapel Prince George’s Chapel Cemetery Comprehensive Land Use Plan Houses of Worship Cable Services Hurricane Preparedness Flood Zone Information Christmas Events Forms Contact Us Listen Nick Disciullo promotion 2019 << Mar 2024 >> S M T W T F S 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 Online Payments Agendas & Minutes Contact Us Connect With Us! Listen Nick Disciullo promotion 2019 << Mar 2024 >> S M T W T F S 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 Online Payments Agendas & Minutes Contact Us Connect With Us! Listen Nick Disciullo promotion 2019 << Mar 2024 >> S M T W T F S 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 Online Payments Agendas & Minutes Contact Us Connect With Us! Listen Nick Disciullo promotion 2019 << Mar 2024 >> S M T W T F S 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 Online Payments Agendas & Minutes Contact Us Connect With Us! -2683,https://www.sandiego.gov/department-document/police-arrest-suspect-encanto-homicide,Media Bulletins,Agency-Published Resources,Police Arrest Suspect In Encanto Homicide | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Police Arrest Suspect In Encanto Homicide"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -2684,https://wildwoodpolice-fl.gov/attempt_to_identify_type-sitemap.xml,Poor Data Source,Poor Data Source,XML Sitemap,"",200,Home - Wildwood Police,"[""XML Sitemap""]",[],[],[],[],[],"XML Sitemap Generated by Yoast SEO , this is an XML Sitemap, meant for consumption by search engines. You can find more information about XML sitemaps on sitemaps.org . This XML Sitemap contains 2 URLs. URL Images Last Mod. https://wildwoodpolice-fl.gov/attempt_to_identify_type/burglary/ 0 2022-01-12 20:20 +00:00 https://wildwoodpolice-fl.gov/attempt_to_identify_type/theft/ 0 2022-05-06 13:32 +00:00 " -2685,https://police.greenvillesc.gov/faq.aspx?qid=359,Not Criminal Justice Related,Not Criminal Justice Related,FAQs • Is automated collection safer than manual?,"",200,"Police Department | Greenville, SC - Official Website",[],"[""▼ Recycling""]","[""Categories"", ""Live Edit"", ""Loading""]",[],[],[],Skip to Main Content -2686,http://www.longbeach.gov/police/press-releases/critical-missing-juvenile---michael-veal/,Media Bulletins,Agency-Published Resources,CRITICAL MISSING JUVENILE - MICHAEL VEAL,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/6/2018 FOR IMMEDIATE RELEASE Press Release # Subject: *UPDATE* LOCATED - CRITICAL MISSING JUVENILE - MICHAEL VEAL Contact: Media Relations Detail (562) 570-5273 *UPDATE* Officers found missing juvenile unharmed at a shopping center in the City of Lakewood and has been reunited with his family. ‬ Original News Release Published 12/5/18: Click on picture to enlarge The Long Beach Police Department is asking for the public’s help in locating a 12-year-old juvenile who suffers from developmental disabilities and was last seen on Wednesday, December 5, 2018. Parent reported last seeing the victim at their residence in the 6100 block of Linden Avenue at approximately 5:00 a.m., when the parent returned home at 9:00 a.m., the juvenile was missing. The juvenile was last seen wearing a yellow and purple “Lakers” sweatshirt, gray pants, and red shoes. Missing Juvenile Veal is described as follows: Name: Michael Veal Age: 12 years old Gender: Male Race: African American Height: 5’03” Weight: 110 lbs Hair: Black Eyes: Brown Clothing: Yellow and purple Lakers sweatshirt, gray pants, Red shoes. Scars/Marks: None Medical Alerts: Developmental Disabilities The Long Beach Police Department continues to search for the victim. Local hospitals have been alerted and area law enforcement and public transportation agencies have also been notified. Anyone who sees this individual or has information on his whereabouts is asked to call the Long Beach Police Department at (562) 435-6711 or 9-1-1. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2687,https://delcopa.gov/vote/votebymail.html,Not Criminal Justice Related,Not Criminal Justice Related,"Vote-by-Mail Ballots - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""Vote-by-Mail Ballots""]",[],"[""About Vote-by-Mail Ballots"", ""Important Vote-by-Mail Dates"", ""APPLYING FOR YOUR VOTE-BY-MAIL BALLOT"", ""RECEIVING AND COMPLETING YOUR MAIL-IN BALLOT OR ABSENTEE BALLOT"", ""VOTE-BY-MAIL ELECTION BALLOT STATUS CHECK"", ""RETURNING YOUR MAIL-IN/ABSENTEE BALLOT"", ""LAST MINUTE EMERGENCIES"", ""MILITARY AND OVERSEAS VOTERS"", ""HOW TO VOTE IN-PERSON IF YOU HAVE RECEIVED A VOTE-BY-MAIL BALLOT"", ""Delco Votes!"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"" -2688,https://www.dps.nm.gov/blog/2021/02/10/update-cancel-amber-alert-albuquerque-police-department/,Media Bulletins,Agency-Published Resources,UPDATE: CANCEL AMBER ALERT-Albuquerque Police Department. - NM Department of Public Safety,"",200,Home - NM Department of Public Safety,"[""UPDATE: CANCEL AMBER ALERT-Albuquerque Police Department.""]",[],"[""Location"", ""Sitemap"", ""Quick Links"", ""Social Media Links""]",[],[],[],"Manage Cookie Consent We use cookies to optimize our website and our service. Functional Functional Always active The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network. Preferences Preferences The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user. Statistics Statistics The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you. Marketing Marketing The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes. Manage options Manage services Manage {vendor_count} vendors Read more about these purposes Accept Deny Preferences Save preferences Preferences Cookie Policy Privacy Statement {title} Manage Cookie Consent We use cookies to optimize our website and our service. Functional Functional Always active The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network. Preferences Preferences The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user. Statistics Statistics The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you. Marketing Marketing The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes. Manage options Manage services Manage {vendor_count} vendors Read more about these purposes Accept Deny Preferences Save preferences Preferences Cookie Policy Privacy Statement {title} Manage Cookie Consent Manage Cookie Consent " -2689,https://oceancitymd.gov/oc/ocean-city-police-arrest-two-individuals-after-a-serious-assault/,Media Bulletins,Agency-Published Resources,"Ocean City Police Arrest Two Individuals After a Serious Assault – Town of Ocean City, Maryland","",200,"Town of Ocean City, Maryland – A Vibrant Coastal Resort Community",[],"[""Post navigation""]","[""Related posts""]",[],[],[],"" -2690,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0674/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2691,https://delcopa.gov/planning/pdf/agendas/2020/agenda202010.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2692,http://www.longbeach.gov/police/press-releases/traffic-fatality-pico-and-pier-c/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY PICO and PIER C,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/22/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Thursday, September 22, 2016, at approximately 06:48 a.m., officers from the Long Beach Police Department were dispatched to the intersection of Pico Avenue and Pier C Street regarding a single vehicle injury traffic collision. Upon arrival officers located a 2001 Ford Crown Victoria that had collided with a telephone pole at the southwest corner of the intersection. Long Beach Fire Department personnel arrived shortly thereafter and determined the male driver deceased. The preliminary investigation revealed a 46 year old Long Beach resident was driving southbound Pico Avenue approaching Pier C Street at a high rate of speed when he attempted to conduct an unsafe lane change. As a result of the unsafe lane change, the vehicle collided with a raised median, and lost control and collided with a telephone pole on the southwest corner of Pico Avenue and Pier C Street. Witnesses to this incident are asked to call Detective Sirilo Garcia of the Long Beach Police Department's Collision Investigation Detail at 562-570-7355. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2693,https://townofspringfield.colorado.gov/departments/police-department/winter-vehicle-safety-kits,Poor Data Source,Poor Data Source,Home | Town of Springfield,"",200,Home | Town of Springfield,"[""Town of Springfield""]","[""Events"", ""News"", ""Live Feed"", ""Find Us"", ""Stay Connected""]",[],[],[],[],"Skip to content Town of Springfield Menu Translate Translate Search Skip Gallery End of Gallery Municode contact us! Pay my utility bill pay my court/traffic payment Events See All Events Apr 2 7:00 AM — 7:00 PM Town of Springfield Regular Municipal Election Apr 2 Apr 11 6:00 PM — 8:00 PM Board of Trustees Regular Meeting Apr 11 May 9 6:00 PM — 8:00 PM Board of Trustees Regular Meeting May 9 May 27 All Day TOWN OF SPRINGFIELD CLOSED: MEMORIAL DAY May 27 News 2024 Town of Springfield Municipal Election TOWN OF SPRINGFIELD REGULAR MUNICIPAL ELECTION APRIL 2, 2024 The Town of Springfield Regular Municipal Election will be held on Tuesday, April 2, 2024. The Election will b... New Mobile App! We're thrilled to announce the new app for the Town of -Springfield! It's everything Town of Springfield, in your -pocket. -
 - With the new app, you can access documents, event... About our Town Springfield is located in the southeastern corner of the State of Colorado, approximately 1,500 miles from either coast, 30 miles from Kansas, 30 miles from Oklahoma, and halfway ... Surveying Town Water Lines You may have noticed markings on the streets throughout town like the ones pictured below. These are a part of the first step of surveying town water lines in the construction of ... See All Posts Live Feed Town of Springfield 2 days ago The Town of Springfield Landfill will be closed today March 23, 2024 due to high winds. Town of Springfield 5 days ago We have been receiving an increase in phone calls requesting contact information for businesses in the Town of Springfield. Cause of this we have come to the realization that we ei... Read More Town of Springfield 11 days ago The Town of Springfield Board of Trustees will hold its Regular Meeting on March 14, 2024 at 6:00 p.m.. The agenda is linked here: ...https://5il.co/2gj... Read More Town of Springfield 26 days ago TOWN OF SPRINGFIELD RESIDENTS: The towns main water well has been repaired and you can resume water usage. Thank you for your cooperation. Town of Springfield 27 days ago UPDATE: The water usage restriction has been extended until the morning of Thursday, February 29, 2024. Please only use water for essential house hold use. NO WATERING LAWNS, TREES... Read More See All Posts Find Us Town of Springfield 748 Main St. Springfield, CO 81073 Phone: (719) 523-4528 Fax: (719) 523-6956 tnewman@springfieldco.gov/srobins@springfieldco.gov Stay Connected New to town? Check out our New Resident Information Page! Copyright © 2024 Town of Springfield. All rights reserved. Powered By Thrillshare " -2694,http://www.longbeach.gov/police/press-releases/traffic-fatality-7-/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY(7),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/26/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: TRAFFIC FATALITY Contact: Media Relations Detail (562) 570-5273 On Wednesday, February 25, 2015, at approximately 7:16 p.m., Long Beach Police responded to the area of Redondo Avenue and 4th Street regarding an injury traffic collision, which resulted in the death of a male adult. Arriving officers discovered a 2013 Kawasaki Ninja motorcycle had collided with a 2007 Nissan Murano. Based on the preliminary investigation, detectives believe the motorcycle driver, a 33-year-old resident of Temecula, failed to stop for the red light at 4th Street and collided into the Nissan. The motorcyclist was traveling northbound on Redondo Avenue approaching a yellow light at 4th Street at a high rate of speed.  Three northbound vehicles stopped in the #1 and #2 lanes, for the signal that had just turned red. The motorcyclist split traffic between the two lanes, entered the intersection on a red light, and struck the Nissan. The Nissan Murano, driven by a 45-year-old resident of Long Beach, was initiating a left turn from southbound Redondo Avenue to eastbound 4th Street when it was struck. After the collision, the motorcycle veered right, slid on the ground, and collided into a traffic light pole. The driver became trapped between the pole and the motorcycle. The Nissan driver, who is an emergency room nurse, immediately stopped, exited the vehicle, and rendered aid to the motorcycle driver. Long Beach Fire Department Paramedics responded and transported the motorcycle driver to a local hospital where he succumbed to his injuries. The identity of the driver is being withheld pending notification of the next of kin. The driver of the Nissan did not sustain any injuries from the collision. Anyone with information regarding this incident is asked to call Collision Investigations Detective Steve Fox at (562) 570-7110.  Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2695,https://ose.louisiana.gov/event/police-corporal-14/,Poor Data Source,Poor Data Source,Police Corporal | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Police Corporal""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Police Corporal Promotional Level Posting Period 05/13/2021 - 06/02/21 Application Deadline 06/02/21 Jurisdiction Lake Charles Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Police Corporal Promotional Level Posting Period 05/13/2021 - 06/02/21 Application Deadline 06/02/21 Jurisdiction Lake Charles Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Corporal Promotional Level Posting Period 05/13/2021 - 06/02/21 Application Deadline 06/02/21 Jurisdiction Lake Charles Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Corporal Promotional Level Posting Period 05/13/2021 - 06/02/21 Application Deadline 06/02/21 Jurisdiction Lake Charles Application This event has passed. Police Corporal Promotional Level Posting Period 05/13/2021 - 06/02/21 Application Deadline 06/02/21 Jurisdiction Lake Charles Application This event has passed. Police Corporal Promotional Level Posting Period 05/13/2021 - 06/02/21 Application Deadline 06/02/21 Jurisdiction Lake Charles Application This event has passed. Police Corporal Promotional Level Promotional Level Promotional Level Posting Period 05/13/2021 - 06/02/21 Application Deadline 06/02/21 Jurisdiction Lake Charles Posting Period 05/13/2021 - 06/02/21 Application Deadline 06/02/21 Jurisdiction Lake Charles Posting Period 05/13/2021 - 06/02/21 Application Deadline 06/02/21 Jurisdiction Lake Charles Posting Period 05/13/2021 - 06/02/21 Posting Period Application Deadline 06/02/21 Application Deadline Jurisdiction Lake Charles Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -2696,https://delcopa.gov/planning/pdf/currentprojects/rosetreeplayoverallsiteloc.pdf,Not Criminal Justice Related,Not Criminal Justice Related,"","",200,"","","","","","","","" -2697,https://delcopa.gov/publicrelations/releases/2022/www.vaccines.gov,Poor Data Source,Poor Data Source,"404 - Delaware County, Pennsylvania","",200,"Delaware County, Pennsylvania","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[],"Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more © 2024 County of Delaware, PA. All rights reserved. Scroll Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play Menu Elected Officials Courts A to Z Public Access Stay Informed Live, Work, & Play 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page 404 Error Home / 404 Error Page Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Opps, something went wrong...please try again. Want to the report the problem? Please email the web master at webmaster@co.delaware.pa.us Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert About Delaware County Delaware County, presently consisting of over 184 square miles divided into forty-nine municipalities is the oldest settled section of Pennsylvania. Read more Contact Us 201 West Front Street, Media, PA 19063 8:30AM - 4:30PM Monday - Friday 610-891-4000 webmaster@co.delaware.pa.us Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Press Releases What's the latest news from County Council and Delaware County Government...View our Press Releases: Read more Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert Quick Links Juror eResponse Crisis Connection Substance Abuse and Recovery Task Force Delco Alert " -2698,http://www.longbeach.gov/police/press-releases/murder-ruled-self-defense/,Media Bulletins,Agency-Published Resources,MURDER RULED SELF-DEFENSE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/2/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: MURDER RULED SELF-DEFENSE Contact: Media Relations Detail (562) 570-5273 The Los Angeles County District Attorney's Office has ruled the April 23, 2014, stabbing, which resulted in the death of 47-year-old Michael Hess of Long Beach, a case of self defense. The preliminary investigation determined that Hess had been involved in a dispute with a 52-year-old male subject who resided in his apartment complex, located in the 6500 block of Indiana Avenue, prior to the stabbing. That subject was identified and arrested the following day, April 24, 2014. As the investigation progressed, detectives learned that Hess was involved in both a verbal dispute and physical altercation with the male subject in the garage area, over a personal disagreement. The male subject attempted to end the dispute; however, Victim Hess would not let him. Hess repeatedly re-instigated the argument, along with the physical altercation, causing the male subject to eventually retreat into his apartment inside the complex. Victim Hess continued to pursue the male subject and climbed a 6-foot gate to gain access to a secured area of the complex where the male subject’s window could be accessed. Realizing that Hess was attempting to get in the apartment through the bathroom window, the male subject’s roommate called 9-1-1. Hess was successful in pulling a screwed in screen off of the bathroom window, and climbing inside. Knowing that Hess was trained in martial arts, the male subject armed himself with a kitchen knife. When Hess entered the male subject’s bedroom and went after him, the male subject defended himself, which resulted in Hess sustaining multiple stab wounds. Hess was determined deceased at the scene by paramedics. Long Beach Police Homicide detectives concluded their investigation, and presented the case, which included video evidence that corroborated witness statements, to the Los Angeles County District Attorney’s Office on April 28, 2014. The District Attorney’s office reviewed the case and determined that the male subject had acted in self defense and filing charges was not warranted. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2699,http://www.lafayettepolice.us/1/home,Poor Data Source,Poor Data Source,"Lafayette, IN - Official Website | Official Website","",200,"Police Department | Lafayette, IN - Official Website","[""Popular Links"", ""Stay Up to Date""]",[],"[""Quick Links"", ""March 2024"", ""March 2024"", ""Contact Us"", ""FAQs"", ""Site Links"", ""Loading""]","[""Holiday lights at Riehle Plaza"", ""Family on pedal boat in Columbian Park lagoon"", ""America concert at Loeb Stadium"", ""Pickelball courts at McCaw Park"", ""Nick Bostic Marquis de Lafayette presentation at Aviators game"", ""Sunset from inside Loeb Stadium"", ""Goat kids at Columbian Park Zoo Petting Zoo area"", ""Rush Pavilion and the Lagoon"", ""Deputy Chief sworn-in along with 4 other promotions for LFD"", ""Avoid Ticket Scams!"", ""INDOT Teal Road Reconstruction"", ""Mon, Mar. 25"", ""Tue, Mar. 26"", ""Thu, Mar. 28"", ""Mon, Mar. 25"", ""Tue, Mar. 26"", ""Thu, Mar. 28"", ""Most Recent""]",[],[],Skip to Main Content -2700,https://beaumonttexas.gov/beaumont-police-arrest-port-arthur-man-for-murder/,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -2701,https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-28/,Poor Data Source,Poor Data Source,"","",200,"","","","","","","","" -2702,https://rexburg.us/police-man-sexually-abused-hairstylist-in-ogden-barbershop/,Media Bulletins,Agency-Published Resources,"","",522,"","","","","","","","" -2703,http://www.longbeach.gov/police/press-releases/two-suspects-arrested-in-murder-case/,Media Bulletins,Agency-Published Resources,TWO SUSPECTS ARRESTED IN MURDER CASE,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 11/26/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: TWO SUSPECTS ARRESTED IN MURDER CASE Contact: Media Relations Detail (562) 570-5273 On Friday, November 21, 2014, Long Beach Police arrested 19-year old Ricardo Gonzalez of West Covina and 18-year-old Carlos Alexis Escalante of Long Beach in connection with two shootings in North Long Beach. Officers stopped Gonzalez and Escalante when they were driving in a vehicle together. During a search of the vehicle, officers found a quantity of drugs and a gun, which led to additional drugs and weapons charges. Detectives believe the two are responsible for the May 26, 2014, murder of Enrique Lopez in the 2800 block of E. 65th Street and the attempted murder of four additional individuals who were standing near the victim when the shooting occurred. The suspects were also charged with attempted murder for their involvement in a shooting that occurred on October 23, 2014, in the area of Artesia Boulevard and Atlantic Avenue. Both incidents are believed to be gang related. Long Beach Homicide Detectives in collaboration with Gang Investigations Section Detectives presented their cases to the Los Angeles District Attorney’s Office for filing consideration. On November 25, 2014, the Los Angeles County District Attorney filed the following charges against both suspects: One count of murder Five counts of attempted murder Gang enhancements Weapons violations Possession of drugs with intent to distribute Gonzalez and Escalante are being held at Los Angeles County Jail. The investigation remains on going. Anyone with information regarding these crimes is urged to contact Long Beach Police Homicide Detective Hugo Cortes at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2704,http://www.longbeach.gov/police/press-releases/dui-drivers-license-checkpoint-planned-this-weekend-1-/,Media Bulletins,Agency-Published Resources,DUI DRIVERS LICENSE CHECKPOINT PLANNED THIS WEEKEND(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 2/19/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: DUI/DRIVERS LICENSE CHECKPOINT PLANNED THIS WEEKEND Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department’s Traffic Section will conduct a DUI/Drivers License Checkpoint on February 21, 2015, in the East Division, between the hours of 7:00 p.m. Saturday night until 3:00 a.m. Sunday morning. The deterrent effect of DUI checkpoints is a proven resource in reducing the number of persons killed and injured in alcohol or drug involved crashes.  Research shows that crashes involving an impaired driver can be reduced by up to 20% when well-publicized DUI checkpoints and proactive DUI patrols are conducted routinely. In California, this deadly crime led to 802 deaths and nearly 24,000 serious injuries in 2012 because someone failed to designate a sober driver. Nationally, the latest data shows nearly 10,000 were killed by an impaired driver. “Over the course of the past three years in Long Beach, DUI collisions have claimed nine lives and resulted in 315 injury crashes, harming 420 of our friends and neighbors,” said Long Beach Police Department Sergeant Aaron Alu. Officers will look for signs of alcohol and/or drug impairment with officers checking drivers for proper licensing, delaying motorists only momentarily.  When possible, specially trained officers will be available to evaluate those suspected of drug-impaired driving, which now accounts for a growing number of impaired driving crashes. Drugs, which may impair driving, not only include illegal narcotics, but many prescription drugs, marijuana, and even some over-the-counter medications. DUI checkpoints are placed in locations based on collision statistics and frequency of DUI arrests, affording the greatest opportunity for achieving drunk and drugged driving deterrence. Locations are chosen with safety considerations for the officers and the public. Drivers caught driving impaired can expect the impact of a DUI arrest to include jail time, fines, fees, DUI classes, other expenses that can exceed $10,000 not to mention the embarrassment when friends and family find out. Funding for this checkpoint is provided to the Long Beach Police Department by a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration, reminding everyone to ‘Report Drunk Drivers – Call 9-1-1.’ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2705,https://delcopa.gov/arpa/pdf/20220731annualarpareportfiled7-29-22final.pdf,Annual & Monthly Reports,Info About Agencies,"","",200,"","","","","","","","" -2706,https://brookfieldil.gov/publication/072512-july-25-2012-brookfield-police-pension-board/,Poor Data Source,Poor Data Source,"","",404,"","","","","","","","" -2707,https://southamptontownnypolice.gov/1370/2020-budgets,List of Data Sources,Info About Agencies,"2020 Budgets | Southampton, NY - Official Website","",200,"Police | Southampton, NY - Official Website","[""2020 Budgets""]",[],"[""Site Tools"", ""2020 Budget"", ""Contact Us"", ""Site Links"", ""Loading""]","[""2020 Adopted Budget - Capital"", ""2020 Adopted Budget - Operating"", ""2020 Tentative Budget - Operating"", ""2020 Tentative Budget - Capital""]",[],[],"Skip to Main Content EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Finance (Comptroller) 2020 Budgets 2020 Budgets 9 1 1 1 2020 Budget 2020 Adopted Budget - Capital Link to page 2020 Adopted Budget - Operating Link to page 2020 Tentative Budget - Operating Link to page 2020 Tentative Budget - Capital Link to page 2020 Adopted Budget - Capital 2020 Adopted Budget - Operating 2020 Tentative Budget - Operating 2020 Tentative Budget - Capital Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Town Services Community Info How Do I Translate Page Site Tools Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search Home Government Departments Finance (Comptroller) 2020 Budgets 2020 Budgets 9 1 1 1 2020 Budget 2020 Adopted Budget - Capital Link to page 2020 Adopted Budget - Operating Link to page 2020 Tentative Budget - Operating Link to page 2020 Tentative Budget - Capital Link to page 2020 Adopted Budget - Capital 2020 Adopted Budget - Operating 2020 Tentative Budget - Operating 2020 Tentative Budget - Capital Town Clerk Meetings, Agendas & Minutes Pay Your Taxes Online Services Applications, Forms & Fees Notify Me® FOIL Requests Contact Us Town of Southampton 116 Hampton Road Southampton, NY 11968 Phone: 631-283-6000 Banner photo credit: robertseifertphotography.com Site Links Contact Us Site Map Accessibility Copyright Notices Intranet Job Opportunities Title VI Non-discrimination Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... EMERGENCY ALERT Notice of LIRR Service Change and Lewis Road Closing This Weekend Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -2708,http://www.longbeach.gov/police/press-releases/protect-yourself-from-fraud-this-holiday-season/,Media Bulletins,Agency-Published Resources,Protect Yourself from Fraud this Holiday Season,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 12/2/2015 FOR IMMEDIATE RELEASE Press Release # Subject: PROTECT YOURSELF FROM FRAUD THIS HOLIDAY SEASON Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department would like to again remind consumers to take precautions to avoid becoming a fraud statistic this holiday season. During this time of the year, credit and debit cards are certain to be one of the most commonly used forms of payment. With the surge of reported domestic and international fraud schemes, including unsolicited, pervasive telephone calls and scams that have flourished throughout the Southern California region, consumers are urged to take extra precautions to secure their personal information. Here are a few prevention tips to help minimize your risk: • Monitor your ATM/debit card transactions. Card “skimming” is a process where a device is used to capture account and personal information encoded on magnetic strips, which has become pervasive throughout the country. • When entering your “PIN” number, shield the keypad with your other hand to prevent exposure to others or recordable devices • Make certain the ATM card reader is securely attached to the machine. If unsecured, alert the financial institution. • Be vigilant in monitoring your account(s) online or by telephone • Track and review all of your bank and credit card statements for irregular activity • Use the credit card feature at the gas pumps; your zip code, not PIN, is required • Never disclose to anyone over the telephone or online, your social security number, PIN number, bank account numbers or date of birth • Do not wire money to anyone you do not know • Do not respond to e-mails requesting you to “confirm,” “update,” or “provide” account information • Do not imprint social security or driver license numbers on your personal checks • Request from the credit reporting agencies (Trans Union, Equifax, and Experian) a copy of your “Consumer Credit Profile” Report and review for unusual activity. You may obtain a copy at “www.annualcreditreport.com.” • Use a “cross-shredder” to destroy sensitive documents including bank records and promotional “pre-approved” credit card applications To learn more about protecting yourself from fraud, contact the Long Beach Police Department Financial Crimes Section at (562) 570-7330. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2709,https://delcopa.gov/courts/pdf/emergencyjudicialorders/fifthemergencyorderextendingearlyparolereviewandsuchpossiblerelease.pdf,Court Cases,Jails & Courts Specific,"","",200,"","","","","","","","" -2711,https://barnegatpolice.us/barnegat-police-department-2/professional-standards/,Policies & Contracts,Info About Agencies,Professional Standards - Barnegat Township Police Department,"",200,Barnegat Township Police Department - Barnegat Township Police Department,"[""Professional Standards""]",[],[],"[""Directions"", ""Quick Links""]",[],[],"609-698-5000 Facebook Twitter Search for: Home FAQ About Us Accreditation Department Divisions Department History Mission and Values Professional Standards Recruiting Current News Neighborhood Policing Resources Contact Us Crime Reporting Contact Firearms Unit Contact Records Contact Traffic Safety Tip Line Go to... Home FAQ About Us Accreditation Department Divisions Department History Mission and Values Professional Standards Recruiting Current News Neighborhood Policing Resources Contact Us Crime Reporting Contact Firearms Unit Contact Records Contact Traffic Safety Tip Line Professional Standards Home / About Us / Professional Standards Professional Standards BTPD 2024-01-05T19:09:08+00:00 Click here for information and forms for filing a complaint of officer or employee misconduct. Completed forms can be submitted via email to carroll355@barnegatpolice.us, hand delivered t0 the Barnegat Police Department 900 West Bay Avenue or any Barnegat police officer, faxed to 609-698-1092, or mailed to: Barnegat Police Department, Attn: Captain Carroll, 900 West Bay Avenue Barnegat, NJ 08005 The Professional Standards Unit was created in order to further the department’s commitment to providing high-quality, professional service to all members of the community. The Unit oversees citizen complaints and conducts internal and administrative investigations regarding police personnel, firearms discharges, use of force investigations, and employee misconduct. The Unit also conducts annual inspections of functions within the agency to ensure efficient and effective operation as well as compliance with CALEA accreditation standards. Chief Germain sets high standards of conduct and performance for agency employees. Members of the community who feel that an officer or employee has failed to meet these high standards of service and wish to file a formal complaint may do so by calling the department at 609-698-5000 or by speaking with any department employee. Members of the community who feel that an officer has exceeded these high standards or done something exceptional and wishes to recognize or commend an officer may also do so by calling the department or by speaking with any department employee. 2023 Major Discipline 2023 Professional Standards Summary 2022 Major Discipline 2022 Professional Standards Summary 2021 Major Discipline 2021 Professional Standards Summary 2020 Major Discipline 2020 Professional Standards Summary 2019 Professional Standards Summary 2018 Professional Standards Summary 2017 Professional Standards Review 2016 Professional Standards Review 2015 Professional Standards Review 2014 Professional Standards Review Barnegat Township Police Department 900 West Bay Avenue Barnegat, NJ 08005 609-698-5000 Directions Quick Links About Us Crime Reporting Resources Contact Us Tip Line Copyright 2018 Content, Barnegat Township Police Department | All Rights Reserved Copyright 2018 Website Design | Web Alliance International Agency, LLC. | All Rights Reserved Facebook Twitter " -2712,http://www.longbeach.gov/police/press-releases/charges-filed-in-attempt-murder-case/,Media Bulletins,Agency-Published Resources,Charges Filed in Attempt Murder Case,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 6/26/2015 FOR IMMEDIATE RELEASE Press Release # Subject: CHARGES FILED IN ATTEMPT MURDER CASE Contact: Media Relations Detail (562) 570-5273 1/6/2016  UPDATE :  Long Beach Police were notified that Victim David Garcia, 39 years old and a resident of Long Beach, succumbed to his injuries on January 3, 2016. Murder charges against Defendant Rangel are pending. He remains in custody. Original News Release: On Wednesday, June 24, 2015, charges were filed against a Long Beach man after he assaulted and critically injured another Long Beach man after involved in a dispute. On June 21, 2015, at approximately 4:50 p.m., Long Beach Police responded to a battery call at an apartment complex in the 1200 block of Ohio Avenue. When officers arrived, they discovered a 39-year-old man who had sustained blunt force injuries to the upper body. The victim was transported to a local hospital, where he remains in critical condition. The suspect, identified as 57-year-old Riccardo Rangel, remained at the scene and was arrested shortly after the incident. Due to the severity of the victim’s injuries, Homicide detectives became involved in the investigation. Through that investigation, detectives learned that the victim and suspect knew one another, and became involved in a dispute which escalated into the assault. Neither the victim nor suspect lived at the location. Detectives presented the case to the Los Angeles County District Attorney’s Office for review. The District Attorney’s office filed one count of attempt murder, and one count of assault with a deadly weapon against Rangel, who is being held on $1,030,000 bail at the L.A. County Men’s Jail. He is expected for his next court appearance on July 9th. Anyone with further information on this case is asked to contact Homicide Detectives Greg Krabbe and Mark Mattia at (562) 570-7244. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting LACrimeStoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2713,http://www.longbeach.gov/police/press-releases/traffic-fatality27/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/21/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: TRAFFIC FATALITY Contact: MEDIA RELATIONS (562) 570-5273 On Friday, July 21, 2017, at 4:37 a.m., Long Beach Police responded to Studebaker Road and Driscoll Street regarding an injury traffic collision. When officers arrived, they discovered a 2016 Honda Civic collided with a wooden power line pole causing it to collapse. The preliminary investigation indicated that the Honda, being driven by a 48-year-old male resident of Long Beach, was traveling northbound on Studebaker road. There was minimal damage to the vehicle as it impacted the light pole at slow speed south of the intersection with Driscoll Street. The driver didn’t appear to have any injuries from the collision and it appeared that the driver might have suffered a medical emergency at the time of the incident. There were no passengers in the vehicle and no other vehicles were involved. There were no witnesses to the collision. Long Beach Fire Department Paramedics responded and determined the driver deceased at the scene. The victim’s identity is being withheld pending notification of next of kin. The Los Angeles County Coroner will determine the official cause of death. Anyone who may have information regarding this incident is urged to contact the Long Beach Police Department Collision Investigation Detail, Detective Steve Fox at (562) 570-7110. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2714,https://www.ci.neenah.wi.us/departments/police/police-annual-reports/survey-results/,List of Data Sources,Info About Agencies,Survey Results – City of Neenah,"",200,403 Forbidden,"[""Survey Results""]","[""In This Department""]",[],[],[],[],"" -2715,http://www.longbeach.gov/press-releases/robert-g--luna-appointed-police-chief-of-long-beach/,Media Bulletins,Agency-Published Resources,Robert G. Luna Appointed Police Chief of Long Beach,"",200,City of Long Beach,"[""PRESS RELEASE""]",[],[],[],[],[],"" -2716,http://www.longbeach.gov/police/press-releases/long-beach-police-are-asking-for-the-public-s-help/,Media Bulletins,Agency-Published Resources,Long Beach Police are asking for the public’s help,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/21/2016 FOR IMMEDIATE RELEASE Press Release # 2016 Subject: L.B.P.D. NEEDS THE PUBLICS HELP TO LOCATE ATTEMPT MURDER SUSPECT Contact: Media Relations Detail 562-570-5273 Suspect Norval Lamount Hartley Long Beach Police are asking for the public’s help with locating Norval Lamount Hartley, a 46 year old resident of Long Beach, in connection with an attempt murder. On December 27, 2015, at about 12:40 a.m., officers responded to the report of gunshots fired in the area of Willow Street and Maine Avenue. On arrival, officers located a female adult who had sustained a gunshot wound to the upper body. The victim was transported to a local and remains hospitalized in stable condition. The investigation revealed the victim left a local business and was walking to her car when she was struck by gunfire. The victim was not the intended victim of the shooting. Homicide detectives responded to the scene and during their investigation, Hartley was identified as the suspect. On January 20, 2016, the Los Angeles County District Attorney’s Office filed charges of attempt murder against Hartley and a $3,100,000.00 arrest warrant was issued. Hartley remains outstanding and should be considered armed and dangerous. He has an extensive criminal history for violent crime and has served time in state prison. He is described as a male African American, 5’-11”, 180 lbs., with a bald head and brown eyes. Anyone with information regarding the whereabouts of Suspect Hartley is urged to contact the Long Beach Police Department Homicide Detail at (562) 570-7244. Anyone wishing to remain anonymous may call 1-800-222-TIPS (8477), or text TIPLA plus your tip to 274637 (CRIMES), or visit www.LACrimeStoppers.org This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2717,http://www.longbeach.gov/police/press-releases/officer-involved-shooting-2800-block-15th/,Media Bulletins,Agency-Published Resources,OFFICER INVOLVED SHOOTING 2800 BLOCK 15TH,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2718,http://www.longbeach.gov/police/press-releases/dui-checkpoint-results/,Media Bulletins,Agency-Published Resources,DUI CHECKPOINT RESULTS,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2721,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-proves-effective-2-/,Media Bulletins,Agency-Published Resources,DUI SATURATION PATROL PROVES EFFECTIVE(2),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/7/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: DUI SATURATION PATROL PROVES EFFECTIVE Contact: Media Relations Detail (562) 570-5273 On Saturday, July 5, 2014, the Long Beach Police Department’s Traffic Section conducted a Driving Under the Influence (DUI) Saturation Patrol from 7:00 p.m. until 3:00 a.m. During the eight-hour operation, motor officers patrolled throughout the city looking for impaired drivers and taking the following enforcement actions: Conducted ninety-four (94) enforcement stops Conducted nineteen (19) Standardized Field Sobriety Tests Arrested four (4) for DUI Arrested one (1) for an outstanding warrant Issued three (3) misdemeanor citations to drivers who were unlicensed Issued one (1) misdemeanor citation to a driver with a suspended license Issued twenty-three (23) citations to drivers for unsafe driving After falling dramatically for five straight years, figures for 2012 show an increase to 802 deaths in California because someone failed to designate a sober driver. Over the course of the past three years, DUI collisions have claimed nine lives and resulted in 315 injury crashes, harming 420 of our friends and neighbors. Driving under the influence can impact the economy in addition to the pain and suffering of those immediately affected. Conservatively, a fatality has a $1.4 million impact, an injury $70,000, and a crash that only damages property averages nearly $9000. Funding for this program is from a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration. Report Drunk Drivers, Call 9-1-1! This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2722,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-proves-effective-7-/,Media Bulletins,Agency-Published Resources,DUI SATURATION PATROL PROVES EFFECTIVE(7),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/18/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: DUI SATURATION PATROL PROVES EFFECTIVE Contact: Media Relations Detail (562) 570-5273 On Saturday, May 16, 2015, the Long Beach Police Department’s Traffic Section conducted a Driving Under the Influence (DUI) Saturation Patrol from 7:00 p.m. until 3:00 a.m. During the eight-hour operation, motor officers patrolled throughout the city looking for impaired drivers. The officers took the following enforcement actions: Conducted forty-four (44) enforcement stops Conducted seventeen (17) Standardized Field Sobriety Tests Made three (3) DUI arrests Made two (2) misdemeanor arrests for drunk in public and assault Impounded two (2) vehicles for suspended license driver and unlicensed driver Issued twelve (12) traffic citations for unsafe driving After falling dramatically for five straight years, figures for 2012 showed an increase to 802 deaths in California because someone failed to designate a sober driver. Over the course of the past three years in Long Beach, DUI collisions have claimed nine lives and resulted in 315 injury crashes, harming 420 of our friends and neighbors. Driving under the influence can impact the economy in addition to the pain and suffering of those immediately affected. Conservatively, a fatality has a $1.4 million impact, an injury $70,000, and a crash that only damages property averages nearly $9000. Funding for this program is from a grant from the California Office of Traffic Safety, through the National Highway Traffic Safety Administration. Report Drunk Drivers, Call 9-1-1! This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2723,https://springfield-or.gov/event/springfield-police-advisory-committee-meeting/,Poor Data Source,Poor Data Source,Springfield Police Advisory Committee Meeting – City of Springfield Oregon,"",200,City of Springfield Oregon,[],"[""Springfield Police Advisory Committee Meeting""]","[""September 3, 2020 @ 6:00 pm - 7:30 pm"", ""Event Navigation""]","[""Share This Story, Choose Your Platform!"", ""Details"", ""Venue""]",[],[],"" -2725,http://www.longbeach.gov/police/press-releases/national-night-out-set-for-august-4th/,Media Bulletins,Agency-Published Resources,NATIONAL NIGHT OUT SET FOR AUGUST 4TH,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 7/23/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: ""NATIONAL NIGHT OUT"" SET FOR AUGUST 4TH Contact: Media Relations Detail (562) 570-5273 The Long Beach Police Department would like to invite neighbors, community groups, and businesses to join them in celebrating in the 32nd Annual National Night Out, on Tuesday, August 4th, 2015. The National Association of Town Watch, a non-profit organization dedicated to the development and promotion of various crime prevention programs devoted to safer communities, sponsors this annual event. Additional information and resources are available at NATW.org National Night Out (NNO) is a community building campaign that provides an opportunity for Long Beach residents to join with their neighbors and police personnel. The goal is to send a message to criminals that neighbors are unified and looking out for one another, and working with police to keep crime out of their neighborhoods. Neighbors who get to know each other and communicate are more likely to look out for one another, notice suspicious persons in the area, and are more apt to call and report suspicious activity and crime. Neighborhood involvement is the main concept of the Long Beach Police Department’s Community Watch Program. Several Community Watch groups are already on board with coordinated activities including: potlucks, barbecues, and ice cream socials. From 6:00 p.m. to 9:00 p.m. on August 4th, residents are asked to lock their doors, turn on outside lights, and spend the evening outside with neighbors and police. If you are hosting a National Night Out event for your neighborhood and would like to request that Police Department representative stop by, please contact your Patrol Division Neighborhood Services Specialist: East Division – NSS Ruth Anne Salau (562) 570-5808 North Division – NSS Erika Moreno (562) 570-9825 West Division – NSS Jose Vasquez (562) 570-3461 Don’t have an organized Community Watch group yet?  National Night Out is the perfect time to start. For more information, visit www.longbeach/police The Long Beach Police Department would like to thank community members who plan to participate in National Night Out. It’s through your continued support and partnership with us that together we can solve crime. We look forward to seeing you on August 4th! This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2726,http://www.longbeach.gov/police/press-releases/human-trafficking-charges-filed-and-additional-victims-sought/,Media Bulletins,Agency-Published Resources,Human Trafficking Charges Filed and Additional Victims Sought,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 1/20/2016 FOR IMMEDIATE RELEASE Press Release # Subject: HUMAN TRAFFICKING CHARGES FILED AND ADDITIONAL VICTIMS SOUGHT Contact: Media Relations Detail 562-570-5273 Defendant Reginald Washington A human trafficking investigation has led to the rescue of several female minors, and charges being filed against a male adult, with additional victims being sought. On January 14, 2015, detectives from the Long Beach Police Department’s Vice Investigations Section along with Los Angeles Police Department Operation South Bureau Human Trafficking Task Force detectives, presented a Human Trafficking case to the Los Angeles County District Attorney’s Office for filing considerations against Reginald Washington, an 18yr old resident of Los Angeles. Washington was already in custody on an unrelated charge out of Los Angeles. The District Attorney’s Office filed seven counts of human trafficking, involving seven minor victims. On January 19, 2016, Washington was arraigned in Los Angeles Superior Court and his bail was set at $1,900,000.00. Detectives initiated an investigation after they located a minor in the City of Long Beach who relayed to them that she was being forced to perform acts of prostitution for Washington. This initial investigation led detectives to additional minor victims who relayed similar stories. The Los Angeles Police Department detectives also identified minors who had been victimized by Washington in the city of Los Angeles, and worked together with Long Beach detectives to successfully investigate this case. Investigators believe other victims may exist and strongly encourage them to come forward by contacting the Long Beach Police Department’s Vice Detail at (562) 570-7219. The Long Beach Police Department is a proud member of the Commercially Sexually Exploited Child Task Force formed in 2013 by the Los Angeles County Board of Supervisors. The victims who were identified by detectives will be provided victim centered services through the Los Angeles County First Responder Protocol for Sexually Exploited Children. Anyone with information regarding this investigation is urged to call the Long Beach Police Department’s Vice Investigations Detail at (562) 570-7219. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2727,http://www.longbeach.gov/police/press-releases/police---fire-memorial-ceremony-1-/,Media Bulletins,Agency-Published Resources,POLICE & FIRE MEMORIAL CEREMONY(1),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 5/4/2015 FOR IMMEDIATE RELEASE Press Release # 2015 Subject: POLICE & FIRE MEMORIAL CEREMONY Contact: Media Relations Detail (562) 570-5273 Community members are invited to attend the Annual Police and Fire Memorial Ceremony on Tuesday, May 5, 2015, at 9:00 a.m.  The service will take place at the foot of Chestnut Avenue, south of Broadway, near Long Beach City Hall. Long Beach Police and Fire Department personnel, along with city dignitaries and staff, will honor those individuals who made the ultimate sacrifice with their lives while serving the community in Long Beach. The memorial service will include the Pledge of Allegiance led by Long Beach Search and Rescue, a posting of the colors presentation, a 21-gun salute by the Long Beach Police Honor Guard, an invocation, individual recognition of fallen officers and firefighters, a bagpipe performance of Amazing Grace, Taps performed by a Long Beach Police Officer, as well as remarks by Police Chief Robert Luna and Fire Chief Mike Duree. All are welcome to attend. This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2728,http://www.longbeach.gov/police/press-releases/dui-drivers-license-checkpoint-planned/,Media Bulletins,Agency-Published Resources,DUI DRIVERS LICENSE CHECKPOINT PLANNED,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"" -2729,https://coloradosprings.gov/police-department/webform/community-outreach-request,Resources,Agency-Published Resources,Community Outreach Request | City of Colorado Springs,"",200,Home Page | City of Colorado Springs,"[""Community Outreach Request""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[],"" -2730,http://www.longbeach.gov/police/press-releases/traffic-fatality-pch-and-studebaker-rd/,Media Bulletins,Agency-Published Resources,TRAFFIC FATALITY PCH AND STUDEBAKER RD,"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/21/2017 FOR IMMEDIATE RELEASE Press Release # 2017 Subject: TRAFFIC FATALITY PCH AND STUDEBAKER RD Contact: Media Relations Detail (562) 570-5273 On Wednesday, September 20, 2017, at approximately 3:53 pm, officers from the Long Beach Police Department were dispatched to the intersection of Studebaker Road and Pacific Coast Highway regarding an injury traffic collision involving two vehicles. Upon arrival, officers located the collision upon the grass parkway of the southwest corner of the intersection. An off-duty fireman rendered emergency medical aid but the driver of the vehicle that was struck succumbed to his injuries and was determined deceased at the scene. Long Beach Fire Personnel arrived and transported the driver of the other vehicle to a local hospital with moderate injuries. The preliminary investigation revealed a 2006 Mitsubishi Eclipse, driven by a 17 year old male resident of Huntington Beach, was traveling southbound Pacific Coast Highway (P.C.H.) in the # 1 lane approaching Studebaker Road and weaving in and out of traffic. One witness stated the Mitsubishi was traveling in excess of 60 miles per hour. Just prior to entering the intersection, the driver of the Mitsubishi swerved his vehicle to the left to avoid a vehicle making a left turn and then swerved back to the right. Upon swerving back to the right, the Mitsubishi traveled into and across the eastbound lanes of Studebaker Road west of P.C.H where it collided with a 2016 Toyota Corolla, driven by a 58 year-old male resident of Los Angeles. The Toyota was in the #3 eastbound lane of Studebaker waiting to make a right turn onto P.C.H. The driver of the Toyota was determined deceased at the scene. The investigation is still ongoing and anyone who may have witnessed the collision is asked to call Detective Sirilo Garcia of the Long Beach Police Department’s Collision Investigation Detail at (562) 570-7355. Anonymous tips may be submitted through ""LA Crime Stoppers"" by calling 1-800-222-TIPS (8477), downloading the ""P3 Tips"" app to your smart phone (available at the Apple App store and Google Play), or visiting http://www.lacrimestoppers.org/ This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2731,http://www.longbeach.gov/police/press-releases/murder-6-/,Media Bulletins,Agency-Published Resources,MURDER(6),"",200,City of Long Beach,"[""Long Beach Police Department""]",[],[],[],[],[],"A- A A+ Long Beach Police Department Media Relations 400 W. Broadway Long Beach, CA 90802 (562) 570-5273 9/29/2014 FOR IMMEDIATE RELEASE Press Release # 2014 Subject: MURDER Contact: Media Relations Detail (562) 570-5273 On Sunday, September 28, 2014, at approximately 1:25 a.m., Long Beach Police responded to a shots fired call in the area of 11th Street and Walnut Avenue, which resulted in the death of a male adult. The preliminary investigation determined that the victim, identified as 26-year-old Guillermo Iturralde of West Covina, was walking down the street when someone in a nearby vehicle fired at him, and then fled the scene. Victim Iturralde was struck in the upper body and pronounced deceased at the scene by LBFD paramedics. The victim was not a gang member and a motive for the shooting is unknown. No suspect information is available at this time and the investigation remains ongoing. Anyone with information regarding this incident is urged to call Long Beach Police Homicide Detectives Donald Goodman and Mark Mattia. Anonymous tips may be submitted by calling 1-800-222-TIPS (8477), texting TIPLA plus your tip to CRIMES (274637), or visiting www.lacrimestoppers.org . This information is preliminary and is intended for early information use rather than being a formal investigative report. About Long Beach Police Department The mission of the Long Beach Police Department is to enhance public safety through partnerships, while providing a safe City for all people. For more information on the Police Department, please visit us at www.longbeach.gov/police . Follow us on social media to stay connected: Facebook , Twitter , and Instagram . " -2732,https://ose.louisiana.gov/event/police-records-clerk-3/,Poor Data Source,Poor Data Source,Police Records Clerk | Louisiana Office of State Examiner,"",200,403 Forbidden,"["""", ""Police Records Clerk""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]","Search Search Search Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing This event has passed. Police Records Clerk Competitive Level Application Deadline TBD Jurisdiction Bogalusa Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org Sign Up for Updates Δ 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Search Personnel Action Form About Testing & Employment Eligibility Lists Jurisdictions Resources Contact ADA Testing Accommodations Statewide Testing Search Personnel Action Form Search Search Search Personnel Action Form This event has passed. Police Records Clerk Competitive Level Application Deadline TBD Jurisdiction Bogalusa Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Records Clerk Competitive Level Application Deadline TBD Jurisdiction Bogalusa Application Search Recent Posts Holiday Closures Archives June 2023 Categories Uncategorized Meta Log in Entries feed Comments feed WordPress.org This event has passed. Police Records Clerk Competitive Level Application Deadline TBD Jurisdiction Bogalusa Application This event has passed. Police Records Clerk Competitive Level Application Deadline TBD Jurisdiction Bogalusa Application This event has passed. Police Records Clerk Competitive Level Application Deadline TBD Jurisdiction Bogalusa Application This event has passed. Police Records Clerk Competitive Level Competitive Level Competitive Level Application Deadline TBD Jurisdiction Bogalusa Application Deadline TBD Jurisdiction Bogalusa Application Deadline TBD Jurisdiction Bogalusa Application Deadline TBD Application Deadline Jurisdiction Bogalusa Jurisdiction Application Search Search Sign Up for Updates Δ Sign Up for Updates Δ Sign Up for Updates 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy Facebook 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Privacy Policy 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 7722 Office Park Blvd., Suite 500 Baton Rouge, LA 70809 Phone: (225) 925-4400 Phone: (225) 925-4400 Privacy Policy Facebook Facebook Facebook Copyright © 2024 Office of State Examiner Site by Gatorworks. Copyright © 2024 Office of State Examiner Site by Gatorworks. " -2733,https://bjs.ojp.gov/content/pub/pdf/ccpuf.pdf,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -2734,https://www.muckrock.com/foi/detroit-314/shotspotter-policies-140369/#file-1067485,Policies & Contracts,Info About Agencies,ShotSpotter policies • MuckRock,MuckRock is a collaborative news site that gives you the tools to hold the government accountable.,200,MuckRock,"[""ShotSpotter policies""]","[""Communications"", ""Files""]","[""FOIA_Police_Records_shotspotter.pdf""]",[],[],[],"" -2735,https://www.documentcloud.org/documents/23741390-allegheny-county-jail-experience-survey-report-and-response,Surveys,Police & Public Interactions,DocumentCloud,"",200,DocumentCloud,[],[],[],[],[],[],"" -2736,https://www.documentcloud.org/documents/23741389-allegheny-county-jail-needs-assessment-2022,Surveys,Police & Public Interactions,DocumentCloud,"",200,DocumentCloud,[],[],[],[],[],[],"" -2737,https://www.alleghenycounty.us/Government/County-Jail/Policies,Policies & Contracts,Info About Agencies,"Policies - Allegheny County, PA",Allegheny County Jail PoliciesSafety PoliciesSanitizing Procedures for Food Utensils and Drinking CupsSanitationInfectious Disease ProceduresWater SupplyFacility and EquipmentSecurity PoliciesManagement of Inmate RecordsImmigration Detainers and WarrantsTransfer of Articles...,200,"Home - Allegheny County, PA","[""Policies""]","[""Allegheny County Jail Policies"", ""Healthcare Policies"", ""Governance & Administration""]","[""Safety Policies"", ""Security Policies"", ""Inmate Care Policies"", ""Programs and Inmate Services Policies"", ""Justice and Order Policies"", ""Administration and Management Policies"", ""Contact Us"", ""Quick Links"", ""Get Social""]",[],[],[],opens in new tab or window -2738,https://pcpa.memberclicks.net/accredited-agencies,Contact Info & Agency Meta,Info About Agencies,Accredited Agencies,"",200,Home,[],"[""Accredited Agencies""]","[""Pennsylvania Chiefs of Police Association""]",[],[],"[""Return to PCPA Home"", ""Return to PCPA Home"", ""Return to PCPA Home""]",Return to PCPA Home Return to PCPA Home Return to PCPA Home Accreditation Home Commission Enrollment Testimonials Gallery Resources FAQ's PPAC Pin Map Accredited Agencies Premier Agencies Active Enrolled Agencies Standards Manual What's New -2739,https://www.ucr.pa.gov/PAUCRSPUBLIC,Crime Statistics,Agency-Published Resources,Home,UCR Repository System,200,Error retrieving title: 'NoneType' object has no attribute 'text',[],[],[],[],"[""Welcome to the Crime in Pennsylvania Dashboard"", ""Crime Dashboard""]",[],Toggle sidebar Crime in Pennsylvania Online Crime in Pennsylvania Online Crime in Pennsylvania Online Toggle sidebar Crime in Pennsylvania Online Crime in Pennsylvania Online Crime in Pennsylvania Online Toggle sidebar Crime in Pennsylvania Online Crime in Pennsylvania Online Crime in Pennsylvania Online Toggle sidebar Crime in Pennsylvania Online Crime in Pennsylvania Online Crime in Pennsylvania Online Crime in Pennsylvania Online Crime in Pennsylvania Online Crime in Pennsylvania Online Toggle sidebar Crime in Pennsylvania Online Crime in Pennsylvania Online Crime in Pennsylvania Online Toggle sidebar Crime in Pennsylvania Online Crime in Pennsylvania Online Crime in Pennsylvania Online Toggle sidebar Crime in Pennsylvania Online Crime in Pennsylvania Online Crime in Pennsylvania Online Toggle sidebar Crime in Pennsylvania Online Crime in Pennsylvania Online Crime in Pennsylvania Online Crime in Pennsylvania Online Crime in Pennsylvania Online Crime in Pennsylvania Online -2740,https://pittsburghpa.gov/police/manual-procedural-orders,Policies & Contracts,Info About Agencies,Pittsburgh Police Policies and Procedural Manual | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""Manual Of Procedural Orders"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""Voice         Neutrality         Respect         Trustworthiness""]","[""DEPARTMENT MENU""]","[""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Zones"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -2741,https://mappingpoliceviolence.us/,Use of Force Reports,Police & Public Interactions,Mapping Police Violence,"Official home of America's most comprehensive database of police violence. -Get the facts about police brutality and how to address it.",200,Mapping Police Violence,"[""Mapping Police Violence"", ""Mapping Police Violence"", ""Police have killed 236 people so far in 2024. Police killed at least 1,247 people in 2023."", ""Mapping Police Violence""]","[""Learn More""]","[""Police killed at least 1,247 people in 2023. Black people were 27% of those killed by police in 2023 despite being only 13% of the population.""]",[],[],[],"The Official Mapping Police Violence Database The Official Mapping Police Violence Database The Official Mapping Police Violence Database The Official Mapping Police Violence Database Mapping Police Violence Police Violence Map / Compare Places / Cities Compare States National Trends / Police Scorecard / Year-End Police Violence Report / About the Data / Planning Team / Mapping Police Violence Mapping Police Violence is a research collaborative collecting comprehensive data on police killings nationwide to quantify the impact of police violence in communities. Police have killed 236 people so far in 2024. Police killed at least 1,247 people in 2023. Mapping Police Violence Police Violence Map / Compare Places / Cities Compare States National Trends / Police Scorecard / Year-End Police Violence Report / About the Data / Planning Team / Police killed at least 1,247 people in 2023. Black people were 27% of those killed by police in 2023 despite being only 13% of the population. Database updated through 3/18/2024 Download Full Database Read about our methodology. Mapping Police Violence is a 501(c)(3) organization that publishes the most comprehensive and up-to-date data on police violence in America to support transformative change. Our team builds resources for communities and policymakers interested in changing policing outcomes nationwide, including MappingPoliceViolence.us , PoliceScorecard.org , and PoliceViolenceReport.org . 98.1% of killings by police from 2013-2023 have not resulted in officers being charged with a crime. There is no accountability No Criminal Charges Officer(s) Charged Officer(s) Convicted 0 0.25 0.5 0.75 1 Click A Page Below to Learn More Compare Cities Compare States 2023 Police Violence Report National Trends Data 2015 Police Violence Report Learn More Researchers and journalists have utilized Mapping Police Violence data to expand our collective understanding of how police violence impacts communities and how to address it. Click below to read about some of these articles and research studies: Contact Us Volunteer Ⓒ Mapping Police Violence, Inc. No part of this site, Mapping Police Violence, may be reproduced in whole or in part in any manner without the permission of the copyright owner. " -2742,https://pasdc.maps.arcgis.com/apps/webappviewer/index.html?id=70c54a213ef94b659b6b77da88ed43b0,Contact Info & Agency Meta,Info About Agencies,ArcGIS Web Application,"",200,Error retrieving title: 'NoneType' object has no attribute 'text',"[""""]",[],[],[],[],[],"" -2743,http://wwso.co.goodhue.mn.us/cis_reports/jail%20roster%20internet.pdf,Incarceration Records,Jails & Courts Specific,"","",200,"","","","","","","","" -2744,https://www.cannonfallsbeacon.com/search/?q=police+reports&s=start_time&sd=desc&l=10&t=*&nsa=eedition,Incident Reports,Police & Public Interactions,Search results for 'police reports' | cannonfallsbeacon.com,"",200,cannonfallsbeacon.com | Cannon Falls Beacon,[],"[""Search / 250 results found Showing: 1-10 of 250""]","[""This week's Cannon Falls Police , Goodhue County Sheriff reports"", ""This week's Cannon Falls Police , Goodhue County Sheriff reports"", ""This week's Cannon Falls Police , Goodhue County Sheriff reports"", ""Cannon Falls Police , Goodhue County Sheriff reports"", ""Goodhue County Sheriff's reports"", ""This week's Cannon Falls Police , Goodhue County Sheriff reports"", ""This week's Cannon Falls Police , Goodhue County Sheriff reports"", ""Cannon Valley Senior Center: Headed to the Chanhassen Dinner Theater!"", ""This week's Cannon Falls Police , Goodhue County Sheriff reports"", ""Red Wing couple plead not guilty to child abuse charges"", ""Cannon Falls Beacon"", ""About Us""]","["""", """", """", ""Most Popular Stories"", ""Latest e-Edition"", ""Newsletters"", ""Cannon Falls Beacon e-Edition"", ""Headlines from Cannon Falls Beacon"", ""Weather"", ""Submit Your News"", ""Calendar"", ""Browser Compatibility""]","[""This week's Cannon Falls Police, Goodhue County Sheriff reports"", ""Brian Dean Manwarren"", ""Health officials update Mississippi River fish consumption guidelines"", ""Cannon Falls ‘Bomb Botz’ qualifies for international competition"", ""From St. Paul: Reuniting stray animals with their owners""]",[],"" -2745,http://wwso.co.goodhue.mn.us/cis_reports/public%20warrant%20list.rpt.html,Wanted Persons,Agency-Published Resources,"","",200,403 - Forbidden: Access is denied.,[],[],[],[],[],[],"Goodhue County Sheriff ' s Office Active Warrant Listing March 25, 2024 12:30 pm Current as of : Last Name , First , Middle Issue date Reason for warrant - Notes Bond _ Amount Bond _ Remark 07/10/2020 FTA For Arraignment, DAR, Unregistered Vehicle, Receiving Stolen Property Aaby Michael Robert $200.00 Cash Only, Set Crt 1st - 4th Thurs @ 0830 Hours 08/29/2017 Prob Viol / 5th Deg Asslt; Disorderly Conduct Abad Andre Maurice Body Only 07/27/2023 FTA/ Traffic- DAC- IP, DL- Driving Restrictions- Alc/ Controlled Subs, Drive W/O Ifnition Interlock Abbott Michael David $3,000.00 Bond Or 500 Cash And Court Thursday @ 0830 11/03/2022 FTA For Pre-Trial, Harmful Materials Display To Minors, Disorderly Conduct Abbott Michael David Body Only 02/15/2024 FTA For Speed, Limited License Violation, Obstruct Legal Process, No Proof Of Insurance Abdi Mohamed Yusuf $1,000.00 Bond Or $500 Cash And Court 09/16/2021 Fta For Speed Abdinoor Ahmed Arab $500.00 $500 Cash Or $1000 Bond & Crt 1st-4th Thur @ 0830 05/11/2023 FTA For Disorderly Conduct Ackermann Alexander Gerhard $0.00 Body Only 05/11/2023 FTA For Trespass Ackermann Alexander Gerhard $0.00 Body Only 05/11/2023 FTA For Theft-take/drive Motor Vehicle- No Owner Consent, Tamper With Motor Vehicle, No MN DL Ackermann Alexander Gerhard $0.00 Body Only Page 1 of 61 Last Name , First , Middle Issue date Reason for warrant - Notes Bond _ Amount Bond _ Remark 03/24/2022 FTA/ Theft- Take Use Transfer Movable Property No Consent Adams William Kendall $200.00 Cash Only And Court Thursday @ 0830 11/05/2020 FTA/ Traffic- DWI Refuse To Submit To Chemical Test Aguilar - Duran Jose A $0.00 Body Only 03/16/2018 FTA / 5th Deg Drugs; Possess Drug Para; Possess Small Amt Marijuana Ahlers Gregory Victor Body Only 06/21/2021 Probation Violation/ Assault- 2nd Degree Dangerous Weapon Aitkin Shawnaci Denise $0.00 Body Only 06/21/2018 FTA/ DWI- Operate MV Under Influence Of Alc, DWI .08 Within 2 Hours, Driving W/out Valid License Ajtun Sajqui Jevne Abimael $1,000.00 Cash Or Bond And Court Thursday @ 13:00 03/23/2017 FTA / Theft - Gas Drive Off;  DAR Akins Quanisha Vashaun $300.00 CASH Only; Set Court For Thurs At 0830 Hrs 12/09/2021 Fta For Speed Alajmi Abdullah $300.00 Cash Only And Crt 1st-4th Thurs @ 0830 01/06/2022 FTA / Speed 65 Zone Non Interstate 96/65 Alazmi Yousiff F R A $1,000.00 BOND Or 400 CASH; Set Court For Thurs At 8:30 AM 08/25/2022 FTA/ Traffic- DWI- Operate MV Under The Influence Of Alcohol Ali Salim Ali Hassan $0.00 Body Only 02/06/2020 Fta For 5th Degree Assault Ali Sayed $1,000.00 Cash Or Bond And Crt 1st-4th Thurs @ 0830 01/15/2015 Fta For Dwi And Open Bottle Allen Aradia Eden Body Only 05/13/2021 Fta Speed Al - mannai Ahmad Ibrahim H E $300.00 Cash Only And Crt Any Thurs @ 0830 Page 2 of 61 Last Name , First , Middle Issue date Reason for warrant - Notes Bond _ Amount Bond _ Remark 11/09/2017 FTA / Speed; No Mn DL Almutairi Sultan A $500.00 " -2746,https://www.muckrock.com/foi/detroit-314/shotspotter-policies-140369/#files,Policies & Contracts,Info About Agencies,ShotSpotter policies • MuckRock,MuckRock is a collaborative news site that gives you the tools to hold the government accountable.,200,MuckRock,"[""ShotSpotter policies""]","[""Communications"", ""Files""]","[""""]",[],[],[],"" -2747,https://data.lacounty.gov/datasets/lacounty::sheriff-all-shooting-incidents-for-deputy-involved-shootings-2010-to-present-deputy-shootings/about,Officer Involved Shootings,Police & Public Interactions,Sheriff All Shooting Incidents for Deputy Involved Shootings 2010 to Present (Deputy Shootings),All Shooting Incident Types for Deputy Involved Shootings 2010 to Present,200,County of Los Angeles Open Data,[],[],[],[],[],[],"" -2748,https://www.alleghenycounty.us/Government/Departments-and-Offices/County-Council/Council-Meetings/Police-Review-Board-Meeting,Policies & Contracts,Info About Agencies,"Police Review Board Meeting - Allegheny County, PA","In 2021, Allegheny County Council passed legislation creating the Independent Police Review Board to receive and review allegations of misconduct filed by members of the public against police officers employed by the Allegheny County Police Department. The nine-member board is...",200,"Home - Allegheny County, PA","[""Police Review Board Meeting""]",[],"[""Contact Us"", ""Quick Links"", ""Get Social""]",[],[],[],opens in new tab or window -2749,https://www.lakesheriff.com/969/Use-of-Force,Use of Force Reports,Police & Public Interactions,"Use of Force | Lake County, CA",Gather information about documented use of force in Officer Involved Shooting and Critical Incidents in Lake County.,200,"Sheriff | Lake County, CA","[""Use of Force""]","[""Officer Involved Shooting ( OIS ) & Critical Incidents"", ""Objectively Reasonable""]","[""Contact Us"", ""Quick Links"", ""Helpful Links"", ""Loading""]","[""Administrative Office"", ""Assessor"", ""Community Development Department"", ""Tax Collector""]",[],[],Skip to Main Content -2750,https://www.cityoflamesa.us/1650/SB1421-Public-Records,Incident Reports,Police & Public Interactions,"SB1421 Public Records | La Mesa, CA - Official Website","",200,"La Mesa, CA - Official Website | Official Website","[""SB1421 Public Records""]","[""Penal Code § 832.7(b)(1)(A)(i): \""A record relating to the report, investigation, or findings of… an incident involving the discharge of a firearm at a person by a peace officer or custodial officer."", ""Penal Code § 832.7(b)(1)(A)(ii): \""A record relating to the report, investigation, or findings of… an incident in which the use of force by a peace officer or custodial officer against a person resulted in death, or in great bodily injury.\"""", ""Penal Code § 832.7(b)(1)(B): \""Any record relating to an incident in which a sustained finding was made by any law enforcement agency or oversight agency that a peace officer or custodial officer engaged in sexual assault involving a member of the public.\"""", ""Penal Code § 832.7(b)(1)(C): \""Any record relating to an incident in which a sustained finding was made by any law enforcement agency or oversight agency of dishonesty by a peace officer or custodial officer directly relating to the reporting, investigation, or prosecution of a crime, or directly relating to the reporting of, or investigation of misconduct by, another peace officer or custodial officer, including, but not limited to, any sustained finding of perjury, false statements, filing false reports, destruction, falsifying, or concealing of evidence.\"""", ""Penal Code 832.7(A) (iii): A sustained finding involving a complaint that alleges unreasonable or excessive force."", ""Penal Code 832.7(A) (iv): A sustained finding that an officer failed to intervene against another officer using force that is clearly unreasonable or excessive."", ""Penal Code 832.7 (D): Any record relating to an incident in which a sustained finding was made by any law enforcement agency or oversight agency that a peace officer or custodial officer engaged in conduct including, but not limited to, verbal statements, writings, online posts, recordings, and gestures, involving prejudice or discrimination against a person on the basis of race, religious creed, color, national origin, ancestry, physical disability, mental disability, medical condition, genetic information, marital status, sex, gender, gender identity, gender expression, age, sexual orientation, or military and veteran status."", ""Penal Code 832.7 (E): A sustained finding made by any law enforcement agency or oversight agency that the peace officer made an unlawful arrest or conducted an unlawful search.""]","[""Contact Us"", ""Site Links"", ""Loading""]","[""No Record""]",[],[],Skip to Main Content -2751,https://data.wprdc.org/dataset/arrest-data,Arrest Records,Police & Public Interactions,Pittsburgh Police Arrest Data - Dataset - CKAN,"",200,Dataset - CKAN,"[""Pittsburgh Police Arrest Data"", ""City of Pittsburgh"", ""Pittsburgh Police Arrest Data"", ""Data Use Agreement""]","[""Organization"", ""Social"", ""License"", ""Data and Resources"", ""Terms of use"", ""🚧 Under Construction""]","[""Additional Info""]",[],[],[],"Skip to main content Log in Register Log in Register Datasets Organizations Topics Search Datasets... Datasets Organizations Topics Search Datasets... Home Organizations City of Pittsburgh Pittsburgh Police Arrest Data Pittsburgh Police Arrest Data Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License Creative Commons Attribution Dataset Groups Pittsburgh Police Arrest Data This data ceased updating with the transition to a new records management system on 11/14/2023. Access to the updated data source will be provided in the future. Arrest data contains information on people taken into custody by City of Pittsburgh police officers. More serious crimes such as felony offenses are more likely to result in an arrest. However, arrests can occur as a result of other offenses, such as parole violations or a failure to appear for trial. All data is reported at the block/intersection level, with the exception of sex crimes, which are reported at the police zone level. This dataset only contains information reported by City of Pittsburgh Police. It does not contain information about incidents that solely involve other police departments operating within the city (for example, campus police or Port Authority police). More documentation is available in our Crime Data Guide . Data and Resources Arrests CSV Explore Preview Download Arrest Data Dictionary XLSX Field definitions for the Arrest dataset Explore Preview Download Burgh's Eye View HTML With Burgh's Eye View you can easily see all kinds of data about Pittsburgh. Explore More information Go to resource Additional Info Field Value Public Access Level Comment This data will be updated to reflect the most recent arrest record. It has been generalized to the block level to protect the privacy of those involved. Sex-based offenses are further generalized to the police zone geography. It will not reflect arrests that have been expunged from public record. Temporal Coverage 1998-03-11/2023-11-14 Geographic Unit Intersection/Street Segment Data Notes Related Document(s) Frequency - Data Change Daily Frequency - Publishing Weekly Data Steward Chris Belasco Data Steward Email Chris Belasco arrest custody failure to appear for trial felony offenses parole violation police public safety " -2752,https://data.wprdc.org/dataset/non-traffic-citations,Citations,Police & Public Interactions,Non-Traffic Citations - Dataset - CKAN,"",200,Dataset - CKAN,"[""Non-Traffic Citations"", ""City of Pittsburgh"", ""Non-Traffic Citations"", ""Data Use Agreement""]","[""Organization"", ""Social"", ""License"", ""Data and Resources"", ""Terms of use"", ""🚧 Under Construction""]","[""Additional Info""]",[],[],[],"Skip to main content Log in Register Log in Register Datasets Organizations Topics Search Datasets... Datasets Organizations Topics Search Datasets... Home Organizations City of Pittsburgh Non-Traffic Citations Non-Traffic Citations Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License Creative Commons Attribution Dataset Groups Non-Traffic Citations This data ceased updating with the transition to a new records management system on 11/14/2023. Access to the updated data source will be provided in the future. Non-traffic citations (NTCs, also known as ""summary offenses"") document low-level criminal offenses where a law enforcement officer or other authorized official issued a citation in lieu of arrest. These citations normally include a fine. In Pennsylvania, NTCs often include a notice to appear before a magistrate if the person does not provide a guilty plea. Offenses that normally result in a citation include disorderly conduct, loitering, harassment and retail theft. This dataset only contains information reported by City of Pittsburgh Police. It does not contain incidents that solely involve other police departments operating within the city (for example, campus police or Port Authority police). Latinos are not included in this data as a race and they will not be reflected in this data. More documentation is available in our Crime Data Guide . Data and Resources Non-Traffic Citations CSV Explore Preview Download Non-Traffic Citations Data Dictionary XLSX Field definitions for Non-Traffic Citations Dataset Explore Preview Download Burgh's Eye View HTML With Burgh's Eye View you can easily see all kinds of data about Pittsburgh. Explore More information Go to resource Additional Info Field Value Public Access Level Comment Data has been generalized to the block level. Temporal Coverage 1992-12-10/2023-10-12 Geographic Unit Intersection/Street Segment Data Notes Related Document(s) Frequency - Data Change Daily Frequency - Publishing Weekly Data Steward Chris Belasco Data Steward Email Chris Belasco NTC citations crimes disorderly conduct harassment justice loitering offenses police retail theft safety summary offenses " -2753,https://www.traviscountytx.gov/district-clerk/case-information-records,Court Cases,Jails & Courts Specific,Case Information & Records,"Welcome to the official website of Travis County, Texas. ",200,Travis County Homepage,"[""Case Information & Records""]","[""On This Page"", ""Online Case Records Search"", ""Official/Certified/Authenticated Document Copies"", ""Administrative Record Copies""]","[""Online"", ""By Mail"", ""In Person""]","[""The Travis County Odyssey portal will be down for maintenance on March 26th 2024, starting at 6 PM through March 27th 2024, at 5 AM.""]","[""Can’t find what you’re looking for?""]",[],"Directory Departments A-Z Maps & GIS Data Org Chart Other Counties and Municipalities Phone Directory Government Commissioners Court Agendas & Minutes Portal Board & Committee Appointments County Code Online Message Board Vision, Mission, and Goals Health & Human Services Human Resources Intergovernmental Relations Open Board Appointments Planning & Budget Tax Office Veterans Services County Auditor County Clerk Corporations District Clerk Elections Emergency Services Office of Emergency Management Fire Marshal STAR Flight Medical Examiner Emergency Services Districts Justice Bail Bond Board Constables County Attorney Courts Civil TCCF Courts Facility Criminal Child Support Court (Title IV-D Courts) Probate Court JP Courts Juvenile Court District Attorney Jury Duty Justice & Public Safety Justices of the Peace Law Library Legal Help Sheriff's Office TCCJS Pretrial Services Drug Diversion Court Adult Probation Business Appraisal District DBA (Assumed Name) Economic Development Expo Center Foreclosures Historically Underutilized Businesses (HUB) PACE Purchasing Office Permits Recording Fees Vendors Resident Animal Control Child Support Jobs Jury Duty Legal Help Marriage Licenses Parks Passports Property Taxes Road Issues Vehicle Registration Online Services Apply for Utility Assistance, Case Management, and Social Work services Court Collections Financial Transparency Portal Inmate Search Job Application Jury Duty Registration Justices of the Peace Online Payments Open Data Portal Open Records Request Pay Your Property Taxes Permitting Center Vehicle Registration Warrant Search View All Services × search Translate Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu " -2754,https://www.longbeach.gov/police/about-the-lbpd/lbpd-sb-978/,Policies & Contracts,Info About Agencies,"Policies, Procedures & Training (SB 978)","POLICIES, PROCEDURES & TRAINING SB978",200,City of Long Beach,"[""Police Department""]","[""Policies, Procedures & Training (SB 978)"", ""Basic Academy Training"", ""Field Training Officer Program"", ""Manuals, Orders & In-Service Training"", ""Ongoing Professional Training"", ""Records Retention Schedule""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""Training Division"", ""Senate Bill 978"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""LBPD SB 978""]",[],"" -2755,http://beaumontpd.org/1194/Crime-Statistics,Crime Statistics,Agency-Published Resources,"Crime Statistics | Beaumont, CA - Official Website",View crime statistics and check out our community crime map. ,200,"Police Department | Beaumont, CA - Official Website","[""Crime Statistics""]","[""Crime Statistics and Calls for Service in the City of Beaumont"", ""National Incident Based Reporting (NIBRS)"", ""Beaumont Police Department Annual Report"", ""Press Log""]","[""FAQs"", ""Contact Us"", ""Quick Links"", ""Connect With Us"", ""Loading""]",[],[],[],"Skip to Main Content Search Only search Police Department About Us Community Crime Divisions Online Reporting Recruiting Home GOVERNMENT Departments Police Department Crime Crime Statistics Crime Statistics Crime Statistics and Calls for Service in the City of Beaumont Calendar year 2022 National Incident Based Reporting (NIBRS) The National Incident-Based Reporting System, or NIBRS, implemented to improve the overall quality of crime data collected by law enforcement. It captures details on each single crime incident—as well as on separate offenses within the same incident. In 2021, the historic Summary Reporting System (SRS) data collection, which collected more limited information than the more robust NIBRS, was phased out. Beaumont Police Department Annual Report The Beaumont Police Department provides an annual report with information about the department, programs and other information that occurred over the calendar year. Press Log Press Log/Arrest Log/Crime Log FAQs Where does the information about the crimes come from? How can I see the source of the crime data? How does it work? View All /FAQ.aspx NIBRS Annual Report Press Log Records Bureau Dog Licensing Online Reporting Crime Tips Report Traffic And Parking Concerns Crime Stats Contact Us Beaumont Police Department 660 Orange Avenue Beaumont, CA 92223 Phone: 951-769-8500 Hours: Police Services: Available 24/7 Records: Monday through Thursday: 8am to Noon Closed Fridays Quick Links Concealed Weapons Permit Domestic Violence Neighborhood Watch Recruiting Scams /QuickLinks.aspx Connect With Us Facebook X YouTube Instagram Nextdoor Home Accessibility Copyright Notices Contact Us My Account Government Websites by CivicPlus® /QuickLinks.aspx Search Only search Police Department About Us Community Crime Divisions Online Reporting Recruiting Home GOVERNMENT Departments Police Department Crime Crime Statistics Crime Statistics Crime Statistics and Calls for Service in the City of Beaumont Calendar year 2022 National Incident Based Reporting (NIBRS) The National Incident-Based Reporting System, or NIBRS, implemented to improve the overall quality of crime data collected by law enforcement. It captures details on each single crime incident—as well as on separate offenses within the same incident. In 2021, the historic Summary Reporting System (SRS) data collection, which collected more limited information than the more robust NIBRS, was phased out. Beaumont Police Department Annual Report The Beaumont Police Department provides an annual report with information about the department, programs and other information that occurred over the calendar year. Press Log Press Log/Arrest Log/Crime Log FAQs Where does the information about the crimes come from? How can I see the source of the crime data? How does it work? View All /FAQ.aspx NIBRS Annual Report Press Log Records Bureau Dog Licensing Online Reporting Crime Tips Report Traffic And Parking Concerns Crime Stats Contact Us Beaumont Police Department 660 Orange Avenue Beaumont, CA 92223 Phone: 951-769-8500 Hours: Police Services: Available 24/7 Records: Monday through Thursday: 8am to Noon Closed Fridays Quick Links Concealed Weapons Permit Domestic Violence Neighborhood Watch Recruiting Scams /QuickLinks.aspx Connect With Us Facebook X YouTube Instagram Nextdoor Home Accessibility Copyright Notices Contact Us My Account Government Websites by CivicPlus® /QuickLinks.aspx " -2756,https://data.lacity.org,List of Data Sources,Info About Agencies,"DataLA: Information, Insights, and Analysis from the City of Angels | Los Angeles - Open Data Portal","",200,"DataLA: Information, Insights, and Analysis from the City of Angels | Los Angeles - Open Data Portal",[],"[""Menu"", ""Featured Stories"", ""Data Catalog"", ""Resources""]",[],[],[],[],Skip to main content Skip to footer links Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search LOS ANGELES OPEN DATA Explore the City of Los Angeles' Open Data Featured Stories Is Your Business Registered? Disparities in Mortgage Lending in Los Angeles Neighborhood Crime Statistics Know Your Community LA Cool Spots Emergency Rental Assistance Program Evaluation Data Catalog Administration & Finance Discover data on the city’s finances and administration. COVID-19 Explore COVID-19 data. Public Safety View up to date data on the city’s public safety data. City Infrastructure & Service Requests Find information on services and infrastructure. Housing and Real Estate Data on housing programs and land use in LA. Parks & Recreation Find information on city parks and recreation centers. Sanitation Find data on street cleanings and more. Transportation Find data from the Department of Transportation. Resources DataLA Medium Blog Read about the latest updates from the team! Suggest a data set Didn't find what you were looking for? Suggest a dataset. Public Records Requests Submit and review public records requests Explore the GeoHub Browse our geospatial data Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search LOS ANGELES OPEN DATA Explore the City of Los Angeles' Open Data Featured Stories Is Your Business Registered? Disparities in Mortgage Lending in Los Angeles Neighborhood Crime Statistics Know Your Community LA Cool Spots Emergency Rental Assistance Program Evaluation Data Catalog Administration & Finance Discover data on the city’s finances and administration. COVID-19 Explore COVID-19 data. Public Safety View up to date data on the city’s public safety data. City Infrastructure & Service Requests Find information on services and infrastructure. Housing and Real Estate Data on housing programs and land use in LA. Parks & Recreation Find information on city parks and recreation centers. Sanitation Find data on street cleanings and more. Transportation Find data from the Department of Transportation. Resources DataLA Medium Blog Read about the latest updates from the team! Suggest a data set Didn't find what you were looking for? Suggest a dataset. Public Records Requests Submit and review public records requests Explore the GeoHub Browse our geospatial data Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Sign In Data Catalog Geohub Blog Developer Resources About Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Search -2757,http://www.holmescountysheriff.org/public-information-request/,Records Request Info,Agency-Published Resources,Public Information Request – Holmes County Sheriff's Office,"",200,Holmes County Sheriff's Office – Serving & Protecting the Citizens of Holmes County.,"[""Public Information Request""]",[],"[""Public Information Request"", ""Links & Downloadable Resources""]","[""Address"", ""Phone"", ""FAX"", ""Email""]",[],"[""The Holmes County Sheriff's Office""]","" -2758,https://webmaster2166.wixsite.com/bartowso/online-forms,List of Data Sources,Info About Agencies,Online Forms | Bartow Co. S.O.,"",200,"",[],[],[],[],[],[],"" -2759,https://rdx.stldata.org/dataset/crime-data-0,Crime Statistics,Agency-Published Resources,Crime Data | St. Louis Regional Data Exchange,"",200,Error retrieving title: dictionary changed size during iteration,[],"[""Primary tabs"", ""License"", ""Other Access"", ""Crime Data""]",[],"[""Data and Resources""]",[],[],Skip to main content Search Search Search Search Toggle navigation About Datasets Organizations Topics COVID-19 (14) Planning & Zoning (59) Geography (78) Public Safety & Justice (53) Housing & Properties (42) Real Estate & Land Records (39) Demographics (29) Transportation (47) Human & Social Services (40) Environment (42) Health (34) Budget & Finance (16) Education (17) Boundaries (41) Business & Economy (24) Election & Politics (28) Infrastructure (15) Taxes (16) Add Data Log in Toggle navigation About Datasets Organizations Topics COVID-19 (14) Planning & Zoning (59) Geography (78) Public Safety & Justice (53) Housing & Properties (42) Real Estate & Land Records (39) Demographics (29) Transportation (47) Human & Social Services (40) Environment (42) Health (34) Budget & Finance (16) Education (17) Boundaries (41) Business & Economy (24) Election & Politics (28) Infrastructure (15) Taxes (16) Add Data Log in Toggle navigation About Datasets Organizations Topics COVID-19 (14) Planning & Zoning (59) Geography (78) Public Safety & Justice (53) Housing & Properties (42) Real Estate & Land Records (39) Demographics (29) Transportation (47) Human & Social Services (40) Environment (42) Health (34) Budget & Finance (16) Education (17) Boundaries (41) Business & Economy (24) Election & Politics (28) Infrastructure (15) Taxes (16) Add Data Log in Log in -2760,https://cityprotect.com/agency/4cdd5d7e-3326-4be1-9958-4b68c0270c91,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2761,https://data.wprdc.org/dataset/police-incident-blotter,Crime Maps & Reports,Agency-Published Resources,Police Incident Blotter (30 Day) - Dataset - CKAN,"",200,Dataset - CKAN,"[""Police Incident Blotter (30 Day)"", ""City of Pittsburgh"", ""Police Incident Blotter (30 Day)"", ""Data Use Agreement""]","[""Organization"", ""Social"", ""License"", ""Data and Resources"", ""Terms of use"", ""🚧 Under Construction""]","[""Additional Info""]",[],[],[],Skip to main content Log in Register Log in Register Datasets Organizations Topics Search Datasets... Datasets Organizations Topics Search Datasets... -2762,https://www.burke.k12.ga.us/apps/pages/index.jsp?uREC_ID=324393&type=d&pREC_ID=733056,List of Data Sources,Info About Agencies,Records Request – Records/Transcripts – Burke County Public Schools,"The Burke County Public School District (BCPS) is located in Waynesboro, Georgia. They serve grades PreK-12. Home of the Burke County Bears!",200,Burke County Public Schools,"[""Records Request""]",[],"[""SELECT THE BUTTON BELOW TO REQUEST STUDENT RECORDS :""]",[],[],[],Skip to main content Burke County Public Schools Main Menu Toggle About Us Board of Education Superintendent Assistant Superintendents Board Office Staff Directory American Rescue Plans (ARP) Burke's B.E.S.T. Campus Map/Directions CCRPI Report Employment Opportunities Mission and Vision Open Records Request Quick Links SWSS/IE2 Partnership Contract Title IX Strategic Plan Departments Athletics Curriculum & Instruction CTAE Federal Programs Finance Department Human Resources Maintenance Nurses/School Health Professional Learning Public Information Records Request School Nutrition Social Services Student Information Student Services Technology Testing Transportation Schools School Profiles Waynesboro Primary SGA Elementary Blakeney Elementary Burke County Middle Burke County High BC Academy of Success BC Life Center Early Head Start Students & Parents Attendance Bus Information Calendar/Dress Code ESOL FERPA Notice Information and Resources Menus PBIS PLAY Cards PowerSchool Parent Portal Reading Support Registration Records & Transcripts Student Information Update Safety & Security Testing The Paw Print Newsletter Tip Line - Your Voice Matters! Wrap Around Services Job Openings Staff Directory Employment: Job Openings Campus Map Contact Form Phone Numbers Open Records Burke County Public Schools Burke County Public Schools Burke County Public Schools Board of Education Superintendent Assistant Superintendents Board Office Staff Directory American Rescue Plans (ARP) Burke's B.E.S.T. Campus Map/Directions CCRPI Report Employment Opportunities Mission and Vision Open Records Request Quick Links SWSS/IE2 Partnership Contract Title IX Strategic Plan Athletics Curriculum & Instruction CTAE Federal Programs Finance Department Human Resources Maintenance Nurses/School Health Professional Learning Public Information Records Request School Nutrition Social Services Student Information Student Services Technology Testing Transportation School Profiles Waynesboro Primary SGA Elementary Blakeney Elementary Burke County Middle Burke County High BC Academy of Success BC Life Center Early Head Start Attendance Bus Information Calendar/Dress Code ESOL FERPA Notice Information and Resources Menus PBIS PLAY Cards PowerSchool Parent Portal Reading Support Registration Records & Transcripts Student Information Update Safety & Security Testing The Paw Print Newsletter Tip Line - Your Voice Matters! Wrap Around Services Staff Directory Employment: Job Openings Campus Map Contact Form Phone Numbers Open Records Useful Links Meetings/Policies Social Media - Header PowerSchool Apple Android Facebook Twitter Search Useful Links Meetings/Policies Social Media - Header PowerSchool Apple Android Facebook Twitter Search Useful Links Social Media - Header -2763,https://collegeparkga.justfoia.com/publicportal/home/search,List of Data Sources,Info About Agencies,JustFOIA Public Portal,"",200,403 Forbidden,[],[],[],[],[],[],"" -2764,http://www.huroncountysheriff.org/contact.html,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -2765,https://csucpd.crimegraphics.com/2013/default.aspx#CLERYMenu,Crime Maps & Reports,Agency-Published Resources,CrimeGraphics.com,"",200," - CrimeGraphics.com -",[],[],[],[],[],[],CSU Chico Police Department JavaScript is disabled. For customize this text use element. CSU Chico Police Department JavaScript is disabled. For customize this text use element. CSU Chico Police Department CSU Chico Police Department JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. -2766,https://inmates.seorj.com/ArchonixXJailPublic/Default.aspx,Booking Reports,Jails & Courts Specific,"","",-1,"","","","","","","","" -2767,http://co.hardin.oh.us/sheriff/services.php,Resources,Agency-Published Resources,Hardin County Sheriff,"",200,Hardin County Courthouse,[],"[""Services"", ""Contact""]","[""FEES:"", ""Webchecks:"", ""PAYMENT:"", ""RECORDS REQUESTS:""]",[],[],[],"Services Concealed Carry Application* submissions and Webchecks by appointment: Monday - Tuesday 8:00 AM - 2:00 PM Wednesday 9:00 AM - 5:00 PM Thursday 8:00 AM - 2:30 PM Walk-ins Welcome For appointments and information CALL: (419)673-1268; Extension 2119 Voicemail messages will be answered and calls returned. *Concealed Carry applications are available, and may be picked up anytime (24hrs. daily) from the literature rack in the main lobby. FEES: Concealed Carry License (CCW): Ohio Residents Initial CCW License - $ 67.00 Ohio Residents of less than 5 years - $ 77.00 CCW Renewal - $ 50.00 Emergency / Temporary License - $ 37.00 Replacement Fee for Lost / Damaged License - $ 15.00 Ohio Residents of less than 5 years Renewal - $ 60.00 Ohio Residents of less than 5 years Temporary Emergency License - $ 47.00 Webchecks: BCI Webcheck - $ 32.00 FBI Webcheck - $ 35.00 BCI & FBI Webcheck - $ 62.00 NOTE: WHILE RESPONSE TIMES VARY, WEBCHECK RESULTS MAY TAKE UP TO 30 DAYS BEFORE THE REPORT IS ISSUED/MAILED FROM BCI TO THE PARTY/PERSON REQUESTING IT. THERE IS NO WAY TO EXPIDITE THIS PROCESS. PAYMENT: Payment for CCW applications and Webchecks must be by personal check or money order, only. CASH IS NOT ACCEPTED. RECORDS REQUESTS: Records requests* may be made in person or by phone during normal business hours, 8:00 AM - 4:00 PM, Monday - Friday, excluding legal holidays. Records requests should include information regarding the type of incident (eg. traffic crash, burglary, etc.), date of occurrence, name of at least one involved/reporting party; and a report number, if known. -Calling ahead to provide this information before coming to the Sheriff's Office, is recommended. Records office phone: (419)673-1268 Ext. 2107 or email our Records Clerk at eroy@hardinsheriff.com. * Records generally, are not available for 3-5 business days after the incident is reported. Home Facebook Feed Emergency Levels Crash Reports Sheriff Sales Services Sex Offenders Sign up for Nixle Visit us on Facebook Next of Kin Emergency Program Contact Contact Hardin County Sheriff 1025 S. Main Street Kenton, Ohio 43326 Phone: (419) 673 1268 Hours: Mon-Fri, 8am - 4pm Email the Sheriff Home Facebook Feed Emergency Levels Crash Reports Sheriff Sales Services Sex Offenders Sign up for Nixle Visit us on Facebook Next of Kin Emergency Program Contact Contact Hardin County Sheriff 1025 S. Main Street Kenton, Ohio 43326 Phone: (419) 673 1268 Hours: Mon-Fri, 8am - 4pm Email the Sheriff " -2768,https://cityprotect.com/agency/af073ea8-cc03-4171-99df-511e7047f348,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2769,https://cityprotect.com/agency/e8a9e4ae-3011-48f5-bb98-e22a7d3331b9,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2770,https://cityprotect.com/agency/220a9fbb-967f-41b9-a1a9-7f7022f2b1b1,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2771,https://cityprotect.com/agency/94080d2d-11c8-4896-82d9-cbd38ade5df6,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2772,https://cityprotect.com/agency/470018e6-48e7-4007-9fb7-077dbd34c572,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2773,https://cityprotect.com/agency/1f1336f9-4f15-4542-97f0-ea70b206149f,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2774,https://www.sheriffalerts.com/cap_main.php?office=54658,Sex Offender Registry,Agency-Published Resources,"","",403,"","","","","","","","" -2775,https://www.goldenwestcollege.edu/public-safety/statistics/index.html,List of Data Sources,Info About Agencies,Campus Crime Statistics | Linfield University,"",200,403 Forbidden,[],[],[],[],[],[],"" -2776,https://cityprotect.com/agency/cf2638f7-c65d-4194-abc4-9feeedc209f2,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2777,https://sanduskycountyoh.gov/index.php?page=sheriff,List of Data Sources,Info About Agencies,"Sandusky County, Ohio - Sheriff","",200,"Sandusky County, Ohio - Sandusky County, Ohio","[""Sandusky County Sheriff's Office""]","[""Links for information:""]",[],[],[],[],"An official State of Ohio government website. The site is secure. The https:// ensures you're connecting to the official website and any information you provide is encrypted and cannot be seen by anyone else. The .gov means it's official Many state and federal websites end in .gov, a domain only used by government entities in the U.S. Sandusky County Toggle Menu Home Home Employee Information Employee alert System Elected Officials Auditor Commissioner's Clerk of Courts Common Pleas Court County Courts County Engineer Treasurer Sheriff Recorder Prosecutor Juvenile / Probate Court Coroner County Departments Board of Elections Community Corrections Dept. Job & Family Services Dog Kennel Emergency Management Emergency Medical Services Facility Management Human Resources Law Library Sanitary Engineer Solid Waste / Recycling Phone Directory Veterans Office Soil & Water Building Code Department Communities Bellevue Clyde Fremont Gibsonburg Woodville County Maps Other Local Entities Additional Community Links Public Notices Public Notices Discount Prescription Program Employment Gov Deals Project Bids Public Record Policy Sheriff's Snow Emergency Fraud Reporting System Citizens Alert System An official State of Ohio government website. The site is secure. The https:// ensures you're connecting to the official website and any information you provide is encrypted and cannot be seen by anyone else. The .gov means it's official Many state and federal websites end in .gov, a domain only used by government entities in the U.S. An official State of Ohio government website. The site is secure. The https:// ensures you're connecting to the official website and any information you provide is encrypted and cannot be seen by anyone else. The .gov means it's official Many state and federal websites end in .gov, a domain only used by government entities in the U.S. An official State of Ohio government website. An official State of Ohio government website. An official State of Ohio government website. The site is secure. The https:// ensures you're connecting to the official website and any information you provide is encrypted and cannot be seen by anyone else. The .gov means it's official Many state and federal websites end in .gov, a domain only used by government entities in the U.S. The site is secure. The https:// ensures you're connecting to the official website and any information you provide is encrypted and cannot be seen by anyone else. The site is secure. The https:// ensures you're connecting to the official website and any information you provide is encrypted and cannot be seen by anyone else. The .gov means it's official Many state and federal websites end in .gov, a domain only used by government entities in the U.S. The .gov means it's official Many state and federal websites end in .gov, a domain only used by government entities in the U.S. " -2778,https://cityprotect.com/agency/mpd,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2779,https://www.opendatanetwork.com/dataset/www.dallasopendata.com/4gmt-jyx2,Use of Force Reports,Police & Public Interactions,Dallas Police Officer-Involved Shootings,"",200,Open Data Network,"[""Open Data Network"", ""Dallas Police Officer-Involved Shootings""]",[],[],[],[],[],"Search Dallas Police Officer-Involved Shootings www.dallasopendata.com | Last Updated 8 Mar 2023 View API View Data Dallas Police Public Data - Officer Involved Shootings City Of Dallas Tags: officer involved shootings, handgun, firearm, rifle, shotgun, bb gun, taser, knife, rock, screwdriver, toy handgun, injured, deceased, shoot and miss, unarmed, police, public safety, dpd, crime, criminal, illegal, property, accident, officer, burglary, violence, prowler, harassment, assault, speeding, racing, fraud, street, theft, marijuana, prisoner, disturbance, robbery, shooting, alcohol, drugs, warrant, arrest, gun, abrasion, bruise, resistance, aggression, handcuff This dataset has the following 9 columns: Column Name API Column Name Data Type Sample Values Case # case text 013548-2017 014825-2023 025330-2021 025433-2019 031347-2015 view top 100 Date date calendar_date 2014-06-14T00:00:00.000 2012-05-29T00:00:00.000 2006-11-18T00:00:00.000 2022-08-20T00:00:00.000 2003-10-30T00:00:00.000 view top 100 Subject Deceased, Injured, or Shoot and Miss suspect_deceased_injured_or_shoot_and_miss text Shoot and Miss Deceased Injured Other Deceased Injured view top 100 Subject Weapon suspect_weapon text Handgun Vehicle Unarmed Shotgun Knife view top 100 Officer(s) officer_s text Mondy, Michael B/M Hayden, Kevin B/M Roberts, John W/M Burch, Darren W/M Pacheco, Louis L/M view top 100 Grand Jury Disposition grand_jury_disposition text No Bill N/A Pending See Summary On-going Investigation view top 100 Attorney General Forms URL ag_forms text N/A https://dallaspolice.net/reports/OIS/ag_forms/... https://dallaspolice.net/reports/OIS/ag_forms/... https://dallaspolice.net/reports/OIS/ag_forms/... https://dallaspolice.net/reports/OIS/ag_forms/... view top 100 Summary URL summary_url text https://dallaspolice.net/reports/OIS/ag_forms/... https://www.dallaspolice.net/reports/OIS/narra... https://www.dallaspolice.net/reports/OIS/narra... https://www.dallaspolice.net/reports/OIS/narra... https://www.dallaspolice.net/reports/OIS/narra... view top 100 GeoLocation geolocation location view top 100 Dallas Police Officer-Involved Shootings www.dallasopendata.com | Last Updated 8 Mar 2023 View API View Data Dallas Police Public Data - Officer Involved Shootings City Of Dallas Tags: officer involved shootings, handgun, firearm, rifle, shotgun, bb gun, taser, knife, rock, screwdriver, toy handgun, injured, deceased, shoot and miss, unarmed, police, public safety, dpd, crime, criminal, illegal, property, accident, officer, burglary, violence, prowler, harassment, assault, speeding, racing, fraud, street, theft, marijuana, prisoner, disturbance, robbery, shooting, alcohol, drugs, warrant, arrest, gun, abrasion, bruise, resistance, aggression, handcuff This dataset has the following 9 columns: Column Name API Column Name Data Type Sample Values Case # case text 013548-2017 014825-2023 025330-2021 025433-2019 031347-2015 view top 100 Date date calendar_date 2014-06-14T00:00:00.000 2012-05-29T00:00:00.000 2006-11-18T00:00:00.000 2022-08-20T00:00:00.000 2003-10-30T00:00:00.000 view top 100 Subject Deceased, Injured, or Shoot and Miss suspect_deceased_injured_or_shoot_and_miss text Shoot and Miss Deceased Injured Other Deceased Injured view top 100 Subject Weapon suspect_weapon text Handgun Vehicle Unarmed Shotgun Knife view top 100 Officer(s) officer_s text Mondy, Michael B/M Hayden, Kevin B/M Roberts, John W/M Burch, Darren W/M Pacheco, Louis L/M view top 100 Grand Jury Disposition grand_jury_disposition text No Bill N/A Pending See Summary On-going Investigation view top 100 Attorney General Forms URL ag_forms text N/A https://dallaspolice.net/reports/OIS/ag_forms/... https://dallaspolice.net/reports/OIS/ag_forms/... https://dallaspolice.net/reports/OIS/ag_forms/... https://dallaspolice.net/reports/OIS/ag_forms/... view top 100 Summary URL summary_url text https://dallaspolice.net/reports/OIS/ag_forms/... https://www.dallaspolice.net/reports/OIS/narra... https://www.dallaspolice.net/reports/OIS/narra... https://www.dallaspolice.net/reports/OIS/narra... https://www.dallaspolice.net/reports/OIS/narra... view top 100 GeoLocation geolocation location view top 100 Dallas Police Officer-Involved Shootings www.dallasopendata.com | Last Updated 8 Mar 2023 View API View Data " -2780,https://cityprotect.com/agency/cowl,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2781,https://cityprotect.com/agency/5bba22f7-cd1e-4b02-beaa-4508c8d0996b,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2782,https://cityprotect.com/agency/lcpd,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2783,https://cityprotect.com/agency/55038d63-a7c2-4e66-80ec-9dc9127cd868,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2784,http://www.beverlyhills.org/departments/policedepartment/crimeinformation/crimestatistics/web.jsp,Crime Statistics,Agency-Published Resources,Crime Statistics,"",200,City Of Beverly Hills ,[],[],[],[],[],[],Skip to Main Content -2785,https://data.cityofberkeley.info/Public-Safety/Berkeley-PD-Calls-for-Service/k2nh-s5h5,Crime Maps & Reports,Agency-Published Resources,Error 403,"",200,"Error retrieving title: HTTPSConnectionPool(host='data.cityofberkeley.info', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",[],"[""block""]","[""Error 403"", ""What happened?"", ""What can I do?""]",[],[],[],Error 403 Web Page Blocked Error 403 Web Page Blocked block URL: data.cityofberkeley.info/Public-Safety/Berkeley-PD-Calls-for-Service/k2nh-s5h5 Client IP: 209.6.137.20 Attack ID: 20000213 Message ID: 003480087880 What happened? The page cannot be displayed. What can I do? Please contact the administrator for additional information. URL: data.cityofberkeley.info/Public-Safety/Berkeley-PD-Calls-for-Service/k2nh-s5h5 Client IP: 209.6.137.20 Attack ID: 20000213 Message ID: 003480087880 What happened? The page cannot be displayed. What can I do? Please contact the administrator for additional information. -2786,https://bpd.crimegraphics.com/2013/default.aspx,Crime Maps & Reports,Agency-Published Resources,CrimeGraphics.com,"",200," - CrimeGraphics.com -",[],[],[],[],[],[],Belmont Police Department JavaScript is disabled. For customize this text use element. Belmont Police Department JavaScript is disabled. For customize this text use element. Belmont Police Department Belmont Police Department JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. -2787,https://cityprotect.com/agency/5d2ef925-427e-4154-b775-d73e7b19f9da,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2788,https://data.wprdc.org/dataset/uniform-crime-reporting-data,Crime Maps & Reports,Agency-Published Resources,Police Incident Blotter (Archive) - Dataset - CKAN,"",200,Dataset - CKAN,"[""Police Incident Blotter (Archive)"", ""City of Pittsburgh"", ""Police Incident Blotter (Archive)"", ""Data Use Agreement""]","[""Organization"", ""Social"", ""License"", ""Data and Resources"", ""Terms of use"", ""🚧 Under Construction""]","[""Additional Info""]",[],[],[],"Skip to main content Log in Register Log in Register Datasets Organizations Topics Search Datasets... Datasets Organizations Topics Search Datasets... Home Organizations City of Pittsburgh Police Incident Blotter (Archive) Police Incident Blotter (Archive) Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License Creative Commons Attribution Dataset Groups Police Incident Blotter (Archive) This data ceased updating with the transition to a new records management system on 11/14/2023. Access to the updated data source will be provided in the future. The Police Blotter Archive contains crime incident data after it has been validated and processed to meet Uniform Crime Reporting (UCR) standards, published on a nightly basis. This data validation process creates a data publishing delay of approximately thirty days. Users who require the most recent incident data should use the 30 Day Police Blotter . The 30 Day Police Blotter dataset contains more recent data, but has not yet been run through quality control and standardization procedures by the Police Bureau. All data is reported at the block/intersection level, with the exception of sex crimes, which are reported at the police zone level. This dataset only contains information reported by City of Pittsburgh Police, and does not contain incidents that solely involve other police departments operating within the city (campus police, Port Authority, etc.) More documentation is available in our Crime Data Guide . Data and Resources Blotter Data (UCR Coded) CSV This file largely contains data updated since 1/1/2016. This data ceased... Explore Preview Download Archived Police Incident Blotter Data Dictionary XLSX Field definitions for Archived Police Incident Blotter Data Explore Preview Download Historical Blotter Data CSV Police Incident Blotter data from 2005 to 2015. Explore Preview Download Burgh's Eye View HTML With Burgh's Eye View you can easily see all kinds of data about Pittsburgh Explore More information Go to resource Additional Info Field Value Public Access Level Comment Data is generalized to the block level. Sex-based offenses are further generalized to the police zone geography. Temporal Coverage 2005-01-01/2023-11-04 Geographic Unit Intersection/Street Segment Data Notes Related Document(s) Frequency - Data Change Daily Frequency - Publishing Weekly Data Steward Chris Belasco Data Steward Email Chris Belasco UCR archive arrests blotter crimes incident police public safety safety " -2789,https://www.citruscollege.edu/campussafety/Pages/CampusCrimeStatistics.aspx,Crime Statistics,Agency-Published Resources,Campus Crime Statistics and Crime Logs,"",200," - - The Official Website of Citrus College, Glendora, California - -","[""Campus Safety""]","[""Campus Crime Statistics and Crime Logs""]","[""Campus Crime Log"", ""Campus Crime Statistics""]",[],[],[],Skip to main content -2790,https://data.cityofberkeley.info/Public-Safety/Berkeley-PD-Stop-Data-Jan-26-2015-to-Sep-30-2020-/4tbf-3yt8,Stops,Police & Public Interactions,Open Data | City of Berkeley,"",200,"Error retrieving title: HTTPSConnectionPool(host='data.cityofberkeley.info', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",[],"[""Menu""]",[],[],[],[],Skip to main content Skip to footer links City of Berkeley Open Data Sign In Search Search Catalog Developers Menu Menu Close Catalog Developers Sign In Search City of Berkeley Open Data Sign In Search Search Catalog Developers Menu City of Berkeley Open Data Sign In Search Search Catalog Developers Menu Sign In Search Search Sign In Search Search Search Search Catalog Developers Menu Close Catalog Developers Sign In Search Catalog Developers Sign In Search Catalog Developers Sign In Search Home Catalog City of Berkeley Data Policy Accessibility Privacy Policy Contact Us Help © 2024 City of Berkeley Home Catalog City of Berkeley Data Policy Accessibility Privacy Policy Contact Us Help © 2024 City of Berkeley © 2024 City of Berkeley -2791,https://www.gordonstate.edu/departments/open-records/index.html,List of Data Sources,Info About Agencies,Open Records | Gordon State College,Gordon State College,200," - Home | Gordon State College - ","[""Open Records""]",[],[],"[""Georgia Open Records Act (O.C.G.A. 50-18-70)"", ""More Information"", ""Stay Connected""]",[],[],"Quick Links My Gordon Future Students Faculty & Staff Give Request Info Apply Now Check App Status × search Admissions Academics Fast Forward Student Life Athletics Alumni Continuing Ed About GSC Quick Links My Gordon Future Students Faculty & Staff Give Request Info Apply Now Check App Status × search Quick Links × search × search × search × search × × Departments Open Records Open Records Georgia Open Records Act (O.C.G.A. 50-18-70) The Georgia Open Records Act is a state law requiring public records be open and available for inspection by any interested member of the public. Georgia's Open Records Act places almost all recorded forms of information maintained or received during College operations in the public record. Only a few exceptions exist, notably information protected by privacy laws or certain types of protected confidential data. Any citizen can make an open records request. Requests are handled by either the Compliance Officer or the Registrar. How to respond to an Open Records Request Any employee receiving a request for records held under his/her individual or departmental responsibility should immediately notify the Compliance Officer or the Registrar. Requests for Business or Personnel matters should be directed to Office of Human Resources at humanresources@gordonstate.edu Requests for Student Records should be directed to Kristi Hayes, Registrar, at kristih@gordonstate.edu Requests can also be sent by mail: Gordon State College, 419 College Drive, Barnesville, Georgia, 30204 Each Open Records must be responded to within three business days. The law only requires the college to acknowledge receipt of the request, whether the materials are available, and the estimated time and cost to comply with the request. The Open Records Act Coordinators will work in cooperation with the college's department to fulfill the requests. The Act does allow the college to obtain reimbursements for reasonable costs, but must first notify the requesting party prior to fulfilling the request. The Act allows the college to charge an administrative fee for copying in addition to the charge of .10 per page, based on the hourly wage of the lowest paid employee qualified to retrieve and copy the records, minus the first fifteen minutes. Gordon State College practice is to collect any administrative fee payments prior to releasing the information requested. Frequently Asked Questions A request form is provided for your convenience: Open Records Request Form Additional Information : For additional information regarding the legal compliance visit: http://law.ga.gov/open-government . Departments Budgets & Auxiliary Services Schedule Information Technology Human Resources Institutional Research Office Of The Controller Advancement Library Public Safety Internal Audit Open Records Institutional Effectiveness Finance & Administration Departments Facilities Bursar's Office Committees Consumer Information Budgets And Payroll Enrollment Services and Marketing Departments Open Records Departments Open Records " -2792,https://cityprotect.com/agency/impd,List of Data Sources,Info About Agencies,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2793,http://state.sor.gbi.ga.gov/sort_public/SearchOffender.aspx,Sex Offender Registry,Agency-Published Resources,Georgia Sex Offender Registry,"In accordance with O.C.G.A. § 42-1-12, the Georgia Bureau of Investigation - (GBI) is the central repository for Georgia's Violent Sexual Offender Registry. - The Georgia Bureau of Investigation makes every effort to ensure that the information contained in - the Georgia Sex Offender Registry is accurate. As the information is provided by other agencies - and entities and is continuously changing, the GBI makes no promise or any express or implied - guarantee concerning the accuracy of this information.",200,IIS Windows Server,[],[],[],"[""Conditions of Use:""]",[],[],"Search Community Notifications FAQs Resources Contact Us Welcome to the Georgia Sex Offender Registry! Conditions of Use: As a general rule, we will not disclose any personally identifiable information collected online to entities outside of State of Georgia departments and agencies except where you have given us permission, or where the information is public information under the Georgia Open Records Act O.C.G.A. 50-18-70 et seq., or other applicable laws. Visitors should be aware that information collected through a Georgia.gov website may be subject to examination and inspection, if such information is a public record or not otherwise protected from disclosure. Please Note: The information contained on the Georgia Sex Offender Registry is updated on a continuous basis. In addition, if you are unable to locate an individual on the Georgia Sex Offender Registry and there is a possibility the individual might reside in another state, please visit other states' sex offender websites and conduct a search. Once you review a registered sex offender’s information on Georgia's public website, you may visit the sheriff’s office local website in the county where the offender is registered to access the offenders' employer addresses, school addresses or vehicle information. If the information is not available, contact the sheriff's office. Georgia Sex Offender Registry 3121 Panthersville Rd. Decatur, GA 30034 By clicking the I agree button, I accept the Conditions of Use as stated above. Search Community Notifications FAQs Resources Contact Us Welcome to the Georgia Sex Offender Registry! Conditions of Use: As a general rule, we will not disclose any personally identifiable information collected online to entities outside of State of Georgia departments and agencies except where you have given us permission, or where the information is public information under the Georgia Open Records Act O.C.G.A. 50-18-70 et seq., or other applicable laws. Visitors should be aware that information collected through a Georgia.gov website may be subject to examination and inspection, if such information is a public record or not otherwise protected from disclosure. Please Note: The information contained on the Georgia Sex Offender Registry is updated on a continuous basis. In addition, if you are unable to locate an individual on the Georgia Sex Offender Registry and there is a possibility the individual might reside in another state, please visit other states' sex offender websites and conduct a search. Once you review a registered sex offender’s information on Georgia's public website, you may visit the sheriff’s office local website in the county where the offender is registered to access the offenders' employer addresses, school addresses or vehicle information. If the information is not available, contact the sheriff's office. Georgia Sex Offender Registry 3121 Panthersville Rd. Decatur, GA 30034 By clicking the I agree button, I accept the Conditions of Use as stated above. " -2794,https://www.cityofcartersville.org/DocumentCenter/View/4973/RECORDS-REQUEST-FORM-UPDATED-3-23-20211?bidId=,List of Data Sources,Info About Agencies,"","",404,"","","","","","","","" -2795,https://www.cityprotect.com/agency/carrolltonpd/download,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2796,https://loraincountysheriff.com/annual-law-enforcement-reports/,Annual & Monthly Reports,Info About Agencies,Annual Law Enforcement Reports,To view this year and past reports click one of the links below Annual Law Enforcement Reports 2023 Annual Report 2022 Annual Report 2021 Annual Report 2020 Annual Report,200,"","[""Annual Law Enforcement Reports""]","[""""]","["""", ""To view this year and past reports click one of the links below""]","[""Annual Law Enforcement Reports""]",[],[],Search Menu Skip to content Home Staff Fallen Heroes Divisions Divisions Corrections Division Law Enforcement Division LCSO K-9 Unit Contact Contact Form Employee Directory Employment Annual Law Enforcement Reports To view this year and past reports click one of the links below Annual Law Enforcement Reports 2023 Annual Report 2022 Annual Report 2021 Annual Report 2020 Annual Report Video Player https://www.youtube.com/watch?v=-KmQb8ozE_k 00:00 00:00 08:00 Use Up/Down Arrow keys to increase or decrease volume. Video Player https://www.youtube.com/watch?v=M86QxNZF3AE 00:00 00:00 05:40 Use Up/Down Arrow keys to increase or decrease volume. History Community LCSO Reports Resources and Links Create a website or blog at WordPress.com Search Search Search Search Menu Menu Menu Menu Menu Skip to content Home Staff Fallen Heroes Divisions Divisions Corrections Division Law Enforcement Division LCSO K-9 Unit Contact Contact Form Employee Directory Employment Skip to content Home Staff Fallen Heroes Divisions Divisions Corrections Division Law Enforcement Division LCSO K-9 Unit Contact Contact Form Employee Directory Employment Skip to content Home Staff Fallen Heroes Divisions Divisions Corrections Division Law Enforcement Division LCSO K-9 Unit Contact Contact Form Employee Directory Employment Skip to content Home Staff Fallen Heroes Divisions Divisions Corrections Division Law Enforcement Division LCSO K-9 Unit Contact Contact Form Employee Directory Employment Home Staff Fallen Heroes Divisions Divisions Corrections Division Law Enforcement Division LCSO K-9 Unit Contact Contact Form Employee Directory Employment Annual Law Enforcement Reports To view this year and past reports click one of the links below Annual Law Enforcement Reports 2023 Annual Report 2022 Annual Report 2021 Annual Report 2020 Annual Report Annual Law Enforcement Reports To view this year and past reports click one of the links below Annual Law Enforcement Reports 2023 Annual Report 2022 Annual Report 2021 Annual Report 2020 Annual Report Annual Law Enforcement Reports To view this year and past reports click one of the links below Annual Law Enforcement Reports 2023 Annual Report 2022 Annual Report 2021 Annual Report 2020 Annual Report Annual Law Enforcement Reports To view this year and past reports click one of the links below Annual Law Enforcement Reports 2023 Annual Report 2022 Annual Report 2021 Annual Report 2020 Annual Report Annual Law Enforcement Reports To view this year and past reports click one of the links below Annual Law Enforcement Reports 2023 Annual Report 2022 Annual Report 2021 Annual Report 2020 Annual Report To view this year and past reports click one of the links below To view this year and past reports click one of the links below To view this year and past reports click one of the links below To view this year and past reports click one of the links below Annual Law Enforcement Reports 2023 Annual Report 2022 Annual Report 2021 Annual Report 2020 Annual Report Annual Law Enforcement Reports 2023 Annual Report 2022 Annual Report 2021 Annual Report 2020 Annual Report Annual Law Enforcement Reports 2023 Annual Report 2022 Annual Report 2021 Annual Report 2020 Annual Report Annual Law Enforcement Reports -2797,https://stewartcountysheriff.org/faq.htm,List of Data Sources,Info About Agencies,Stewart County Georgia Sheriff's Office FAQ,"Stewart County Sheriff and Sheriff's Office located in Lumpkin Georgia. Serving Lumpkin, Richland, Louvale, Red Hill and other rural areas in Stewart County.",200,Not Acceptable!,[],[],[],[],[],[],"Monday, March 25, 2024 _ FREQUENT QUESTIONS PAGE How do I contact the Sheriff? To contact Sheriff  Jones, 8:00 am - 5:00 pm, call - (229) 838-4311 (229) 838-4393. You can also reach him by - email stewartsheriff@bellsouth.net How do I get a copy of a motor vehicle crash or - incident report? To pick up a copy of a motor vehicle crash or - incident report, please contact the Sheriff's Office - during normal business hours at (229) 838-4311 or (229) - 838-4393. If you are not a party involved in a car - crash, you may not be able to pick up the report . - The Sheriff's Office complies with the Georgia Open - Records Act and certain information may cost the charges - of research and reproduction as provided by law. How do I get a copy of my own criminal history for - employment purposes? To complete a criminal history request for your own - employment purposes, you must submit the required form. - You may pick up the form and complete it when you come - to the Sheriff's Office or you can complete the form at - your convenience, and present it in person along with - the required fee of $20.00 (CASH ONLY). A government - issued photo ID is required (driver's license, passport, - etc). If you wish to print a criminal history report, click - here to download the form, and bring the completed - form to the Sheriff's Office. My accident/incident report is wrong. Who do I call? If you have an issue with the accuracy of a report - generated by the Sheriff's Office, you should first - contact the deputy who prepared it. He or she may - correct mistakes, but may not make changes that alter - the facts as written unless there is a material mistake. - The final decision is the responsibility of the employee - who created the report. Reports will not be altered or - changed if the information is factually accurate. I want to apply for a job with the Sheriff's Office. - Who do I contact? Job applications must be picked up and returned to the - Stewart County Sheriff's Office. After the application - is completed it will be reviewed by Sheriff Jones. My relative is in jail. What do I do? If someone you know is in jail, they will either - have a bond issued immediately after booking or within - 72 hours of their arrest, depending upon the charges. - They will have ample opportunity to reach someone to - arrange a bond. How can I get someone out of jail? See a ""Bonding Agent"" or ask about a property bond. How can I check to be sure my 911 information is - accurate? You should call the Sheriff's Office at (229) - 838-4311or (229) 229-838-4911 and the dispatcher - will handle this for you. How do I report information about a case anonymously? You can report information to the Sheriff's Office - by calling (229) 838-4311or (229) 838-4311 and asking to - speak to any investigator on duty. Designed & - Hosted by: Dixie Web Design " -2798,https://cityprotect.com/agency/743e18dd-1384-4a30-a3f9-6ff22d321f25,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2799,https://police.losrios.edu/clery,Annual & Monthly Reports,Info About Agencies,Annual Clery Report | Los Rios Police Department,"Per the federal Jeanne Clery Act, Los Rios' annual Clery Report includes information about our safety and security policies along with crime statistics for all of our colleges and centers.",200,Home | Los Rios Police Department,"[""Annual Clery Report""]","[""Frequently Asked Questions"", ""Crime and Reporting""]","[""Who was Jeanne Clery?"", ""What types of crimes must be reported?"", ""What is a hate crime?""]",[],"[""Types of reportable crimes"", ""Geographical breakdown"", ""Hate crimes""]",[],Los Rios Police Department -2800,https://www.cpp.edu/police/daily-crime-and-fire-log.shtml,Crime Maps & Reports,Agency-Published Resources,Daily Crime & Fire Logs,Current and previous crime and fire logs for Cal Poly Pomona,200," - Cal Poly Pomona - ","[""Daily Crime and Fire Logs""]","[""Popular Searches"", ""Click on the link to download report""]","[""Current Logs"", ""Past Logs""]",[],[],[],"We use cookies to make your website experience better. To learn about how we keep your information safe, view our Privacy Policy . Accept Dismiss Accept Dismiss Skip To Main Content × search × search × × Popular Searches × Popular Searches × University Police Home About About Chief's Message Mission and Vision Department Divisions Employment Campus Police and Safety Advisory Committee Parking Services Transportation Services Emergency Management Programs and Services Live Scan Community Service Officer Program Safety Escort Service Motorist Assistance Code Blue Phones Training Alarm and Access Control Bike Registration Event Services Policies and Procedures UPD Staff Portal About Chief's Message Mission and Vision Department Divisions Employment Campus Police and Safety Advisory Committee Live Scan Community Service Officer Program Safety Escort Service Motorist Assistance Code Blue Phones Training Alarm and Access Control Bike Registration Event Services " -2801,https://bcso.crimegraphics.com/2013/default.aspx,Crime Maps & Reports,Agency-Published Resources,CrimeGraphics.com,"",200," - CrimeGraphics.com -",[],[],[],[],[],[],Butte County Sheriff's Office JavaScript is disabled. For customize this text use element. Butte County Sheriff's Office JavaScript is disabled. For customize this text use element. Butte County Sheriff's Office Butte County Sheriff's Office JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. -2802,https://home.chicagopolice.org/information/police-records-procedures/,Records Request Info,Agency-Published Resources,"","",403,"","","","","","","","" -2803,https://cityprotect.com/agency/a5f46abe-f050-4f93-b2a2-f5b9e3285041,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2804,http://cityofclaxton.net/,List of Data Sources,Info About Agencies,Home,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Home City Leadership City Events Council Meeting Authorized Boards Public Notice Call For Special Election 2020 Proposed Operation Budget 2019 Proposed Operation Budget 2018 Proposed Operation Budget 2022 City Tax Digest 2021 City Tax Digest 2019 City Tax Digest 2018 City Tax Digest City Personnel Policy Legal Notice Airport Improvement Notice of City Recycle Center Notice to Property Owners Notice of Property Tax Increase News Release Smoke Testing Sewer Lines Services Bill Payment Resources Applications Alcoholic License Application Business License Application Building Permit Application Employment Application Parade Permit Application Sign Permit Application Sr. Citizen Memorial Park Events Application Utility Services Appication Yard Sale Bids Open Bids Close Bids Demolish & Remove Debris Industrial Leaf Vac Employment City Requlations City Code of Ordinances City Zoing Map City Zoning Ordinance Signs Article XIII About Us Contact Us Mayor's Welcome News and Updates Hours of Operations Call for Special Election for City Council District 2 Monday - Thursday  8:15am - 4:30pm Friday - 8:15am - 12:00pm Saturday - Sunday  Closed Holidays Closed New Year's Day              Jan 2, 2023 Martin Luther King Jr.     Jan 16, 2023 Presidents' Day              Feb 20, 2023 Memorial Day                 May 29, 2023 Independence Day         Jul 4, 2023 Labor Day                       Sep 4, 2023 Veterans Day                  Nov 10, 2023 Thanksgiving                  Nov 23-24, 2023 *On Nov 25 City Employees 1/2 day vacation as in the past Christmas Day                Dec 25, 2023 **NOTE: Any Holiday that falls on Saturday or Sunday, it will be observed on the following Monday. Claxton Police Dept (912) 739-2121 (912) 739-9811 Fax dkirkland@cityofclaxton.net Claxton Fire Dept (912) 739-2121 (912) 739-9811 Fax jstone@cityofclaxton.net Claxton Utility Dept (912) 739-1712 (912) 739-0442 Fax vlittles@cityofclaxton.net Claxton Natural Gas Dept (912) 739-1712 (912) 739-0442 Fax naturalgasdept@cityofclaxton.net Copyright © 2016 City of Claxton City of Claxton, Georgia 206 Railroad Street Claxton, GA 30417 Telephone (912) 739-1712 |   Fax (912) 739-0442 E-Verify No: 511300 Date of Authorization: 02/27/2012 " -2805,http://www.buttecounty.net/sheriffcoroner/bookinglogs,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -2806,https://data.wprdc.org/dataset/police-zones,Geographic,Info About Agencies,Police Zones - Dataset - CKAN,"",200,Dataset - CKAN,"[""Police Zones"", ""City of Pittsburgh"", ""Police Zones"", ""Data Use Agreement""]","[""Organization"", ""Social"", ""License"", ""Data and Resources"", ""Terms of use"", ""🚧 Under Construction""]","[""Additional Info""]",[],[],[],Skip to main content Log in Register Log in Register Datasets Organizations Topics Search Datasets... Datasets Organizations Topics Search Datasets... Home Organizations City of Pittsburgh Police Zones Police Zones Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License License not specified Dataset Groups Police Zones Pittsburgh Police Zones Data and Resources ArcGIS Hub Dataset HTML Explore More information Go to resource Esri Rest API HTML Explore More information Go to resource GeoJSON GeoJSON Explore More information Download CSV CSV Explore Preview Download KML KML Explore More information Download Shapefile ZIP Explore More information Download Additional Info Field Value Public Access Level Comment Temporal Coverage Geographic Unit Data Notes Related Document(s) Frequency - Data Change Frequency - Publishing Data Steward Data Steward Email gis@pittsburghpa.gov pittsburgh public safety justice public safety and justice Home Organizations City of Pittsburgh Police Zones Police Zones Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License License not specified Dataset Groups Police Zones Pittsburgh Police Zones Data and Resources ArcGIS Hub Dataset HTML Explore More information Go to resource Esri Rest API HTML Explore More information Go to resource GeoJSON GeoJSON Explore More information Download CSV CSV Explore Preview Download KML KML Explore More information Download Shapefile ZIP Explore More information Download Additional Info Field Value Public Access Level Comment Temporal Coverage Geographic Unit Data Notes Related Document(s) Frequency - Data Change Frequency - Publishing Data Steward Data Steward Email gis@pittsburghpa.gov pittsburgh public safety justice public safety and justice Home Organizations City of Pittsburgh Police Zones Police Zones Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License License not specified Dataset Groups Police Zones Pittsburgh Police Zones Data and Resources ArcGIS Hub Dataset HTML Explore More information Go to resource Esri Rest API HTML Explore More information Go to resource GeoJSON GeoJSON Explore More information Download CSV CSV Explore Preview Download KML KML Explore More information Download Shapefile ZIP Explore More information Download Additional Info Field Value Public Access Level Comment Temporal Coverage Geographic Unit Data Notes Related Document(s) Frequency - Data Change Frequency - Publishing Data Steward Data Steward Email gis@pittsburghpa.gov pittsburgh public safety justice public safety and justice Police Zones Followers 1 Police Zones Followers 1 Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more -2807,https://www.ci.brea.ca.us/DocumentCenter/View/1329/Website-Content-User-Policy,Records Request Info,Agency-Published Resources,"","",200,"","","","","","","","" -2808,https://data.wprdc.org/dataset/police-sectors,Geographic,Info About Agencies,Police Sectors - Dataset - CKAN,"",200,Dataset - CKAN,"[""Police Sectors"", ""City of Pittsburgh"", ""Police Sectors"", ""Data Use Agreement""]","[""Organization"", ""Social"", ""License"", ""Data and Resources"", ""Terms of use"", ""🚧 Under Construction""]","[""Additional Info""]",[],[],[],Skip to main content Log in Register Log in Register Datasets Organizations Topics Search Datasets... Datasets Organizations Topics Search Datasets... Home Organizations City of Pittsburgh Police Sectors Police Sectors Followers 2 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License License not specified Dataset Groups Police Sectors Pittsburgh Police Sectors Data and Resources ArcGIS Hub Dataset HTML Explore More information Go to resource Esri Rest API HTML Explore More information Go to resource GeoJSON GeoJSON Explore More information Download CSV CSV Explore Preview Download KML KML Explore More information Download Shapefile ZIP Explore More information Download Additional Info Field Value Public Access Level Comment Temporal Coverage Geographic Unit Data Notes Related Document(s) Frequency - Data Change Frequency - Publishing Data Steward Data Steward Email gis@pittsburghpa.gov pittsburgh public safety justice public safety and justice Home Organizations City of Pittsburgh Police Sectors Police Sectors Followers 2 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License License not specified Dataset Groups Police Sectors Pittsburgh Police Sectors Data and Resources ArcGIS Hub Dataset HTML Explore More information Go to resource Esri Rest API HTML Explore More information Go to resource GeoJSON GeoJSON Explore More information Download CSV CSV Explore Preview Download KML KML Explore More information Download Shapefile ZIP Explore More information Download Additional Info Field Value Public Access Level Comment Temporal Coverage Geographic Unit Data Notes Related Document(s) Frequency - Data Change Frequency - Publishing Data Steward Data Steward Email gis@pittsburghpa.gov pittsburgh public safety justice public safety and justice Home Organizations City of Pittsburgh Police Sectors Police Sectors Followers 2 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License License not specified Dataset Groups Police Sectors Pittsburgh Police Sectors Data and Resources ArcGIS Hub Dataset HTML Explore More information Go to resource Esri Rest API HTML Explore More information Go to resource GeoJSON GeoJSON Explore More information Download CSV CSV Explore Preview Download KML KML Explore More information Download Shapefile ZIP Explore More information Download Additional Info Field Value Public Access Level Comment Temporal Coverage Geographic Unit Data Notes Related Document(s) Frequency - Data Change Frequency - Publishing Data Steward Data Steward Email gis@pittsburghpa.gov pittsburgh public safety justice public safety and justice Police Sectors Followers 2 Police Sectors Followers 2 Followers 2 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more -2809,https://lrpd.crimegraphics.com/2013/default.aspx,Crime Maps & Reports,Agency-Published Resources,CrimeGraphics.com,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],Los Rios Comm College Police Dept JavaScript is disabled. For customize this text use element. Los Rios Comm College Police Dept JavaScript is disabled. For customize this text use element. Los Rios Comm College Police Dept Los Rios Comm College Police Dept JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. -2810,https://cityprotect.com/agency/0584dd4d-dffd-43bf-8052-03c3863991de,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2811,https://www.elcamino.edu/about/depts/police/cleryact/index.aspx,Annual & Monthly Reports,Info About Agencies,"Clery Act & Crime Prevention | El Camino College | Torrance, CA","",200,"Home | El Camino College | Torrance, CA","[""Clery Act & Crime Prevention""]","[""Search El Camino College"", ""Clery Act"", ""Crime Prevention"", ""Active Shooter"", ""Bike Theft"", ""Campus Safety"", ""Drug and Alcohol Abuse Prevention Program"", ""Identity Theft"", ""Megan's Law"", ""Prevention Info"", ""Victim Assistance"", ""What To Do if You're Stopped"", ""About El Camino"", ""Info for Students"", ""Info for Faculty & Staff"", ""Industry & Community Resources""]","[""Translate the Page"", ""Annual Security Report"", ""Purpose"", ""Obtain a Copy"", ""Additional Resources""]",[],[],[],Menu Search El Camino Search Button Explore Programs Academics Overview Areas of Study Career Education Catalog Meta-Majors Divisions & Departments Online & Digital Education Apply/Register Admissions Financial Aid Warrior Welcome Center International Students Class Schedule Academic Calendar Find Support Support and Success Programs Paying for College Counseling Pregnant and Parenting Students Discover Campus Campus Map Center for the Arts Events Calendar Search Button Apply MyECC Canvas Translate Apply MyECC Canvas Translate Translate the Page Close Menu Search El Camino Search Button Explore Programs Academics Overview Areas of Study Career Education Catalog Meta-Majors Divisions & Departments Online & Digital Education Apply/Register Admissions Financial Aid Warrior Welcome Center International Students Class Schedule Academic Calendar Find Support Support and Success Programs Paying for College Counseling Pregnant and Parenting Students Discover Campus Campus Map Center for the Arts Events Calendar Search Button Apply MyECC Canvas Translate Apply MyECC Canvas Translate Translate the Page Close Menu Search El Camino Search Button Explore Programs Academics Overview Areas of Study Career Education Catalog Meta-Majors Divisions & Departments Online & Digital Education Apply/Register Admissions Financial Aid Warrior Welcome Center International Students Class Schedule Academic Calendar Find Support Support and Success Programs Paying for College Counseling Pregnant and Parenting Students Discover Campus Campus Map Center for the Arts Events Calendar Search Button Apply MyECC Canvas Translate Search El Camino Search Button Explore Programs Academics Overview Areas of Study Career Education Catalog Meta-Majors Divisions & Departments Online & Digital Education Apply/Register Admissions Financial Aid Warrior Welcome Center International Students Class Schedule Academic Calendar Find Support Support and Success Programs Paying for College Counseling Pregnant and Parenting Students Discover Campus Campus Map Center for the Arts Events Calendar Search Button Apply MyECC Canvas Translate Search El Camino Search Button Academics Overview Areas of Study Career Education Catalog Meta-Majors Divisions & Departments Online & Digital Education Admissions Financial Aid Warrior Welcome Center International Students Class Schedule Academic Calendar Support and Success Programs Paying for College Counseling Pregnant and Parenting Students Campus Map Center for the Arts Events Calendar Search Button Apply MyECC Canvas Translate Apply MyECC Canvas Translate Translate the Page Close Search El Camino College Submit Search Cancel Search Search El Camino College Submit Search Cancel Search Search El Camino College Submit Search Cancel Search Search El Camino College Submit Search Search El Camino College Submit Search -2812,https://www.athenssheriff.com/contact-us,Contact Info & Agency Meta,Info About Agencies,Contact Us | My Site,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -2813,http://woodcountysheriff.com/services/publicrecordspolicy/,Records Request Info,Agency-Published Resources,"","",404,"","","","","","","","" -2814,https://cityprotect.com/agency/b5a393c6-c69e-4be3-b7cc-2b592b96d06e,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2815,http://alleghanycounty-nc.gov/sheriff.php,Contact Info & Agency Meta,Info About Agencies,"Sheriff’s Office – Alleghany County, North Carolina","",200,"Alleghany County, North Carolina – Alleghany County, North Carolina","[""Sheriff’s Office""]","[""Recent Posts"", ""Archives"", ""Categories""]",[],[],[],[],Home Announcements Announcements Employment County Holidays Commissioners Board of Commissioners Meeting Schedule Minutes & Agendas Watch Meetings Departments Administration Alleghany in Motion Communications Elections Emergency Management Emergency Medical Services Finance Office GIS Human Resources Information Technology NC Cooperative Extension Planning & Inspection Public Works Recreation Register of Deeds Sheriff’s Office Social Services Soil & Water Conservation Tax Office Veterans Service County-Funded Organizations Resources Online Forms County Ordinances County Budget GIS Lookup Request Vital Records Online Local Weather Additional Resources Employee Forms County Taxes Pay Taxes Print Property Record Cards and Tax Receipts Town of Sparta Home Announcements Announcements Employment County Holidays Commissioners Board of Commissioners Meeting Schedule Minutes & Agendas Watch Meetings Departments Administration Alleghany in Motion Communications Elections Emergency Management Emergency Medical Services Finance Office GIS Human Resources Information Technology NC Cooperative Extension Planning & Inspection Public Works Recreation Register of Deeds Sheriff’s Office Social Services Soil & Water Conservation Tax Office Veterans Service County-Funded Organizations Resources Online Forms County Ordinances County Budget GIS Lookup Request Vital Records Online Local Weather Additional Resources Employee Forms County Taxes Pay Taxes Print Property Record Cards and Tax Receipts Town of Sparta -2816,https://www.opendataphilly.org/,List of Data Sources,Info About Agencies,OpenDataPhilly,"OpenDataPhilly is a catalog of open data in the Philadelphia region. In addition to being the official open data repository for the City of Philadelphia, it includes data sets from many organizations in the region.",200,OpenDataPhilly,"[""Welcome to OpenDataPhilly""]",[],"[""Browse by Category""]",[],[],[],"Toggle navigation Datasets Organizations Categories About FAQ Datasets Organizations Categories About FAQ Welcome to OpenDataPhilly OpenDataPhilly is a catalog of open data in the Philadelphia region. In addition to being the official open data repository for the City of Philadelphia, it includes data sets from many organizations in the region. Browse all datasets Welcome to OpenDataPhilly OpenDataPhilly is a catalog of open data in the Philadelphia region. In addition to being the official open data repository for the City of Philadelphia, it includes data sets from many organizations in the region. Browse all datasets Arts / Culture / History Budget / Finance Economy Education Elections / Politics Environment Food Health / Human Services Parks / Recreation Planning / Zoning Public Safety Real Estate / Land Records Transportation Uncategorized " -2817,https://public.coderedweb.com/CNE/en-US/D43D82D599C9,List of Data Sources,Info About Agencies,Community Notification Enrollment,"",200,403 - Forbidden: Access is denied.,"[""Would you like to create a managed account?""]",[],[],[],[],[],"Already have an account? Login This site is optimized for current and supported common browsers (i.e. IE, Chrome, Firefox). For the best user experience, please ensure your browser is up-to-date. Glynn County, GA Access your account to manage notification preferences. To recover your password please enter the username associated with your account and click continue. The reset password link has been emailed to you. Insert a new password. Your password has been reset successfully. Fill in and submit the form to contact customer support. Please take a moment to fill in the appropriate information below to be notified by your local emergency response team in the event of emergency situations or critical community alerts. Examples include: evacuation notices, bio-terrorism alerts, boil water notices, and missing child reports. Please verify your location, map position, contact information and alert types. Creating a managed account will allow you access to modify your existing notification settings and contact information. New or updated information has been submitted. Sorry, an error has occurred. There was a problem accessing the link you have used. Sorry, an error has occurred. Sorry, an error has occurred. Sorry, an error has occurred. Your contact information is governed under OnSolve™’s Terms of Service and Privacy Policy. Your contact information is governed under OnSolve™’s Terms of Service and Privacy Policy. Please enable javascript to use this page. Would you like to create a managed account? Creating a managed account will allow you access to modify your existing notification settings and contact information. You may also add an additional address. YES, I would like to create a managed account • Username must be at least 6 characters. Username can be an email address. • • Password must be alphanumeric, at least 8 characters, and include at least one number. • Confirmation password is required. • Login with Google Login with Facebook Login with Twitter Or Create An Account Username Password Confirm password No, continue to enroll as a guest Continue To Opt-Out and STOP receiving notifications, click here: OPT-OUT Your contact information is governed under ONSOLVE's Terms of Service and Privacy Policy ©2017 ONSOLVE, LLC. ONSOLVE™, CodeRED® and SmartNotice® are registered trademarks of ONSOLVE, LLC. All rights reserved. Version:1.5.32.0 End of Page Already have an account? Login Already have an account? Login This site is optimized for current and supported common browsers (i.e. IE, Chrome, Firefox). For the best user experience, please ensure your browser is up-to-date. This site is optimized for current and supported common browsers (i.e. IE, Chrome, Firefox). For the best user experience, please ensure your browser is up-to-date. " -2818,https://www.dougherty.ga.us/public-safety/dcpd/obtain-reports,List of Data Sources,Info About Agencies,Obtain Reports,Doughterty County GA Website,200,Welcome to Dougherty County Georgia,"[""Obtain Reports""]","[""Quick Links"", ""Section Links"", ""How to Obtain Reports""]",[],[],[],"[""Board of Commissioners"", ""Citizen Info"", ""County Departments"", ""County Administration"", ""Judicial System"", ""Public Safety"", ""About Dougherty County"", ""Community"", ""Things to Do"", ""Public Resources"", ""News & Events"", ""Citizen Information""]","Decrease Font Size Increase Font Size Toggle between dark and light mode GO SOCIAL » Facebook Twitter Instagram Government Board of Commissioners The Board of Commissioners 2023 Commission Calendar Agendas & Minutes Board Appointments District Map Citizen Info Annual Budgets Financial Reports County Projects & Bids Code of Ordinances Commissioner Directory County Departments County Administration Disaster Recovery Facilities Management Finance Human Resources Keep Albany-Dougherty Beautiful Law Library Dougherty County Public Library Planning and Development Services Public Works Solid Waste Management Tag and Tax Voter Registration and Elections County Administration Administration Staff Courts Judicial System Clerk of Court Coroner District Attorney Juvenile Court Magistrate Court Probate Court Public Defender State Court Superior Court Public Safety Public Safety Albany/Dougherty Drug Unit (ADDU) Department of Public Health Police Department Sheriff’s Office Jail Facility Emergency Management Services Emergency Medical Services Visitors/Community About Dougherty County About Dougherty County Community Dougherty Fresh GCAPS Community Development Things to Do Parks & Recreation Museums & State Parks Arts & Theater Higher Education Public Resources 311 Call Center Cooperative Extension Office COVID-19 Resources Dougherty County Long-Term Recovery Plans Dougherty County Public Library Law Library News & Events Juneteenth Information Public Notices Dougherty Today, First Quarter 2023 Redistricting 2022 Citizen Information SPLOST T-SPLOST ADA Compliance Board Appointments Board Agendas & Minutes Census 2020 Flooding and Flooding Prevention Albany-Dougherty Pre-Hazard Mitigation Plan 2020 Annual Progress Report How Do I... Contact My Commissioner Find a Job with DOCO Find & Bid on County Projects Search & Pay Taxes Look up an inmate Reserve a Park Location Send money to an inmate Get an Alcohol License Get a Business License Search Obtain Reports Quick Links Contact Us at DCPD Obtain Reports Police to Citizen (P2C) Portal Sex Offender Registry Traffic Ticket Fines Section Links Dougherty County Police Department DCPD Divisions Dougherty County Code of Ordinances Recruitment/Hiring State Board of Pardons & Paroles Federal State & Local Government Internet Sites Anti-terrorism Links How to Obtain Reports Reports are filed by assigned Report Numbers , which can be used in reference to obtaining warrants, processing insurance claims, etc. Report numbers should be retained as a permanent record of your report and this number should be used in any further communications with the Dougherty County Police Department regarding the incident reported. A copy of the report may be obtained in THREE to FIVE DAYS from the date of the incident. Reports can be obtained from the Dougherty County Police Department located at 2106 Habersham Road, Albany, Georgia 31701, Telephone number (229) 430-6600, by referencing this number and payment of a $0.10 a page and $5.00 for an accident report.  Legal Statement O365 Users Email Standard Users Email Employment Opportunities County Employee Self Service Copyright © 2024 County of Dougherty, GA • All Rights Reserved 222 Pine Avenue • Albany, GA 31701 GO SOCIAL » Facebook Twitter Instagram " -2819,https://cityprotect.com/agency/144ade76-2309-4dff-8a35-717df4cd4093,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2820,https://www.clayton.k12.ga.us/departments/safety_and_security/forms,List of Data Sources,Info About Agencies,"","",404,"","","","","","","","" -2821,https://www.atlantapd.org/i-want-to/ops-reports/-folder-133,Annual & Monthly Reports,Info About Agencies,"","",-1,"","","","","","","","" -2822,http://www.baconcountyso.com/contact.html,List of Data Sources,Info About Agencies,"","",403,"","","","","","","","" -2823,http://66.110.195.53/p2c_dcso/jailinmates.aspx,Arrest Records,Police & Public Interactions,Dougherty County Sheriff's Office P2C,"",200,500 - Internal server error.,[],[],[],[],[],[],"Home Inmate Inquiry Daily Bulletin Security Checks Officer Commendataion Sex Offenders Sex Offender Search Event Search Faq Contact Us Quick Links Home Inmate Inquiry Daily Bulletin Security Checks Officer Commendataion Arrests Sex Offenders Sex Offender Search Event Search Faq Contact Us Inmate Inquiry Last Name: First Name: Search Loading... Inmate Inquiry Index Name Last Name First Name Middle Name Race Sex Age Primary Charge Arrest Date Booking Agency 5 10 20 50 10000 Filter Inmate List Inmate Inquiry Last Name: First Name: Search Loading... Inmate Inquiry Index Name Last Name First Name Middle Name Race Sex Age Primary Charge Arrest Date Booking Agency 5 10 20 50 10000 Last Name: First Name: Search Last Name: First Name: Search Last Name: First Name: Search Loading... Inmate Inquiry Index Name Last Name First Name Middle Name Race Sex Age Primary Charge Arrest Date Booking Agency 5 10 20 50 10000 Loading... Inmate Inquiry Index Name Last Name First Name Middle Name Race Sex Age Primary Charge Arrest Date Booking Agency 5 10 20 50 10000 Loading... Inmate Inquiry Index Name Last Name First Name Middle Name Race Sex Age Primary Charge Arrest Date Booking Agency Inmate Inquiry Index Name Last Name First Name Middle Name Race Sex Age Primary Charge Arrest Date Booking Agency Index Name Last Name First Name Middle Name Race Sex Age Primary Charge Arrest Date Booking Agency Index Name Last Name First Name Middle Name Race Sex Age Primary Charge Arrest Date Booking Agency 5 10 20 50 10000 5 10 20 50 10000 powered by Superion 's P2C engine Request in process, please wait... Cancel Warning Please, select row Warning Please, select row Please, select row " -2824,https://www.burbankpd.org/crime-information/crime-statistics/,Crime Statistics,Agency-Published Resources,Crime Statistics - Crime Information | Burbank CA Police Department Design,Burbank Police Department provides daily arrest log and crime statistics for the City of Burbank,200," - Burbank Police Department's mission is to protect life and property, provide professional police services, and work in partnership with the community. | Burbank CA Police Department Design -","[""Follow Us"", ""Crime Statistics"", ""Sign Up for our Newsletter/E-Alerts"", ""Follow Us""]","[""Burbank Police"", ""Resources""]","[""Documents""]",[],[],[],"" -2825,https://data.wprdc.org/dataset/officer-training,Training & Hiring Info,Info About Officers,Police Officer Training - Dataset - CKAN,"",200,Dataset - CKAN,"[""Police Officer Training"", ""City of Pittsburgh"", ""Police Officer Training"", ""Data Use Agreement""]","[""Organization"", ""Social"", ""License"", ""Data and Resources"", ""Terms of use"", ""🚧 Under Construction""]","[""Additional Info""]",[],[],[],"Skip to main content Log in Register Log in Register Datasets Organizations Topics Search Datasets... Datasets Organizations Topics Search Datasets... Home Organizations City of Pittsburgh Police Officer Training Police Officer Training Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License Creative Commons Attribution Dataset Groups Police Officer Training This dataset shows the time spent by currently active Pittsburgh Police Officers in professional development training. Officers who are no longer employed in the Police Bureau are not included in this data. The data is presented in two ways: total, cumulative hours spent in training, per year, by category and total number of officers who completed training, per year, by category. Data and Resources Total Officers Trained, by Year XLS Explore Preview Download Officer Training Data Dictionary XLSX Explore Preview Download Total Hours Trained, by Year XLS Explore Preview Download Additional Info Field Value Public Access Level Comment Temporal Coverage 2005-2016 Geographic Unit Not Applicable Data Notes Related Document(s) Frequency - Data Change Annually Frequency - Publishing Annually Data Steward Data Steward Email officers police public safety training Home Organizations City of Pittsburgh Police Officer Training Police Officer Training Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License Creative Commons Attribution Dataset Groups Police Officer Training This dataset shows the time spent by currently active Pittsburgh Police Officers in professional development training. Officers who are no longer employed in the Police Bureau are not included in this data. The data is presented in two ways: total, cumulative hours spent in training, per year, by category and total number of officers who completed training, per year, by category. Data and Resources Total Officers Trained, by Year XLS Explore Preview Download Officer Training Data Dictionary XLSX Explore Preview Download Total Hours Trained, by Year XLS Explore Preview Download Additional Info Field Value Public Access Level Comment Temporal Coverage 2005-2016 Geographic Unit Not Applicable Data Notes Related Document(s) Frequency - Data Change Annually Frequency - Publishing Annually Data Steward Data Steward Email officers police public safety training Home Organizations City of Pittsburgh Police Officer Training " -2826,https://data.cincinnati-oh.gov,List of Data Sources,Info About Agencies,Cincinnati Open Data Portal | Tyler Data & Insights,"",200,Error retrieving title: dictionary changed size during iteration,"[""Welcome to Open Data Cincinnati""]","[""Menu""]","[""Our Vision"", ""Our Mission"", ""Our Priority Goals""]","[""We invite you to explore all of the data in the following categories that reflect the priority goals we’ve established to facilitate the delivery of efficient, effective and improved customer services.""]",[],[],"Skip to main content Skip to footer links Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Welcome to Open Data Cincinnati We invite you to explore all of the data in the following categories that reflect the priority goals we’ve established to facilitate the delivery of efficient, effective and improved customer services. Safety undefined Growing Economic Opportunities undefined Thriving Neighborhoods undefined Efficient Service Delivery undefined Fiscal Sustainability undefined Browse All Data undefined Our Vision The City's data belongs to our citizens and the public. The City of Cincinnati will provide access to government data to improve services, increase accountability and stimulate economic activity. Our Mission To provide access to government data, encourage the development of creative tools to engage, serve and improve our neighborhoods and the quality of life of our residents. Our Priority Goals Please click here to view Cincinnati's Priority Goals. Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Welcome to Open Data Cincinnati We invite you to explore all of the data in the following categories that reflect the priority goals we’ve established to facilitate the delivery of efficient, effective and improved customer services. Safety undefined Growing Economic Opportunities undefined Thriving Neighborhoods undefined Efficient Service Delivery undefined Fiscal Sustainability undefined Browse All Data undefined Our Vision The City's data belongs to our citizens and the public. The City of Cincinnati will provide access to government data to improve services, increase accountability and stimulate economic activity. Our Mission To provide access to government data, encourage the development of creative tools to engage, serve and improve our neighborhoods and the quality of life of our residents. Our Priority Goals Please click here to view Cincinnati's Priority Goals. Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Search Search Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Open Data How-To How-To Packet Video Guides Sign In Sign In Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights " -2827,https://cityprotect.com/agency/2e8bd965-60bd-4e70-886e-f0a24772e434,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2828,http://www.newtonsheriffga.org/records_faq.html,List of Data Sources,Info About Agencies,"","",404,"","","","","","","","" -2829,https://cityprotect.com/agency/1c052f54-adbd-480b-aa8b-a712c1c851f4,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2830,https://hsupd.crimegraphics.com/2013/default.aspx,Crime Maps & Reports,Agency-Published Resources,CrimeGraphics.com,"",200," - CrimeGraphics.com -",[],[],[],[],[],[],Cal Poly Humboldt Police Department JavaScript is disabled. For customize this text use element. Cal Poly Humboldt Police Department JavaScript is disabled. For customize this text use element. Cal Poly Humboldt Police Department Cal Poly Humboldt Police Department JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. -2831,https://data.wprdc.org/dataset/police-civil-actions,Misc Police Activity,Police & Public Interactions,Police Civil Actions - Dataset - CKAN,"",200,Dataset - CKAN,"[""Police Civil Actions"", ""City of Pittsburgh"", ""Police Civil Actions"", ""Data Use Agreement""]","[""Organization"", ""Social"", ""License"", ""Data and Resources"", ""Terms of use"", ""🚧 Under Construction""]","[""Additional Info""]",[],[],[],"Skip to main content Log in Register Log in Register Datasets Organizations Topics Search Datasets... Datasets Organizations Topics Search Datasets... Home Organizations City of Pittsburgh Police Civil Actions Police Civil Actions Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License Creative Commons Attribution Dataset Groups Police Civil Actions Documentation of open police bureau litigation that took place between Jan 1 and Dec 31, 2015. Data and Resources Police Civil Action Records XLSX Explore Preview Download Police Civil Action Data Dictionary XLSX Explore Preview Download Additional Info Field Value Public Access Level Comment Temporal Coverage 2015 Geographic Unit Not Applicable Data Notes Related Document(s) Frequency - Data Change Quarterly Frequency - Publishing Quarterly Data Steward Data Steward Email civil action court lawsuit legal litigations police Home Organizations City of Pittsburgh Police Civil Actions Police Civil Actions Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License Creative Commons Attribution Dataset Groups Police Civil Actions Documentation of open police bureau litigation that took place between Jan 1 and Dec 31, 2015. Data and Resources Police Civil Action Records XLSX Explore Preview Download Police Civil Action Data Dictionary XLSX Explore Preview Download Additional Info Field Value Public Access Level Comment Temporal Coverage 2015 Geographic Unit Not Applicable Data Notes Related Document(s) Frequency - Data Change Quarterly Frequency - Publishing Quarterly Data Steward Data Steward Email civil action court lawsuit legal litigations police Home Organizations City of Pittsburgh Police Civil Actions Police Civil Actions Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License Creative Commons Attribution Dataset Groups Police Civil Actions Documentation of open police bureau litigation that took place between Jan 1 and Dec 31, 2015. Data and Resources Police Civil Action Records XLSX Explore Preview Download Police Civil Action Data Dictionary XLSX Explore Preview Download Additional Info Field Value Public Access Level Comment Temporal Coverage 2015 Geographic Unit Not Applicable Data Notes Related Document(s) Frequency - Data Change Quarterly Frequency - Publishing Quarterly Data Steward Data Steward Email civil action court lawsuit legal litigations police Police Civil Actions Followers 1 Police Civil Actions Followers 1 Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Dataset Groups Police Civil Actions Documentation of open police bureau litigation that took place between Jan 1 and Dec 31, 2015. Data and Resources Police Civil Action Records XLSX Explore Preview Download Police Civil Action Data Dictionary XLSX Explore Preview Download Additional Info Field Value Public Access Level Comment Temporal Coverage 2015 Geographic Unit Not Applicable Data Notes Related Document(s) Frequency - Data Change Quarterly Frequency - Publishing Quarterly Data Steward Data Steward Email civil action court lawsuit legal litigations police " -2832,https://www1.nyc.gov/site/finance/sheriff-courts/sheriff.page,Policies & Contracts,Info About Agencies,Sheriff,"",200,Error retrieving title: dictionary changed size during iteration,"[""Sheriff""]",[],"[""This Office enforces court mandates and processes including:"", ""The majority of our duties include:"", ""Forms"", ""General Forms""]","[""Sheriff's Bureau of Criminal Investigation (BCI)""]",[],[],"" -2833,https://cityprotect.com/agency/antiochcapolicedepartment,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2834,https://cityprotect.com/agency/mhpdnc,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2835,https://www.citruscollege.edu/campussafety/Pages/AnnualReports.aspx,Annual & Monthly Reports,Info About Agencies,Annual Security Report,"",200," - - The Official Website of Citrus College, Glendora, California - -","[""Campus Safety""]","[""Annual Security Report""]",[],[],[],[],Skip to main content -2836,https://cityprotect.com/agency/maryvillepdtn,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2837,https://www.cypressca.org/government/departments/police/crime-information/crime-mapping,List of Data Sources,Info About Agencies,"","",-1,"","","","","","","","" -2838,https://lithoniacity.org/CityClerk.aspx?CNID=3699,List of Data Sources,Info About Agencies,"Lithonia, GA - City Clerk","Lithonia, GA - Official City Website",200," - Lithonia, GA - Official City Website -","[""City Clerk""]","[""Special Called Meeting"", ""Occupational Tax Certificate (Business License) administrative fee and processing procedures"", ""Press Release Announcing a Proposed Property Tax Increase"", ""Trains Blocking Intersections? Report It Immediately."", ""COVID-19 Response"", ""Celebrating Black History Month"", ""About the Office of the City Clerk"", ""Ashley Waters""]","[""City Clerk"", ""Lithonia City Hall"", ""Follow Us""]",[],[],[],Skip to Main Content Special Called Meeting Special Called Meeting More info Occupational Tax Certificate (Business License) administrative fee and processing procedures Lithonia's Mayor and City Council voted to change and correct the Occupational Tax Certificate (Business License) administrative fee and processing procedures. More info Press Release Announcing a Proposed Property Tax Increase The City of Lithonia Council today announces its intention to increase the 2023 property taxes. Read on... More info Trains Blocking Intersections? Report It Immediately. How to Report Blocked Crossings More info COVID-19 Response COVID-19 Response More info Celebrating Black History Month Celebrating Black History Month. More info Previous Next Special Called Meeting Special Called Meeting More info Occupational Tax Certificate (Business License) administrative fee and processing procedures Lithonia's Mayor and City Council voted to change and correct the Occupational Tax Certificate (Business License) administrative fee and processing procedures. More info Press Release Announcing a Proposed Property Tax Increase The City of Lithonia Council today announces its intention to increase the 2023 property taxes. Read on... More info Trains Blocking Intersections? Report It Immediately. How to Report Blocked Crossings More info COVID-19 Response COVID-19 Response More info Celebrating Black History Month Celebrating Black History Month. More info Previous Next Special Called Meeting Special Called Meeting More info Occupational Tax Certificate (Business License) administrative fee and processing procedures Lithonia's Mayor and City Council voted to change and correct the Occupational Tax Certificate (Business License) administrative fee and processing procedures. More info Press Release Announcing a Proposed Property Tax Increase The City of Lithonia Council today announces its intention to increase the 2023 property taxes. Read on... More info Trains Blocking Intersections? Report It Immediately. How to Report Blocked Crossings More info COVID-19 Response COVID-19 Response More info Celebrating Black History Month Celebrating Black History Month. More info Previous Next Special Called Meeting Special Called Meeting More info Occupational Tax Certificate (Business License) administrative fee and processing procedures Lithonia's Mayor and City Council voted to change and correct the Occupational Tax Certificate (Business License) administrative fee and processing procedures. More info Press Release Announcing a Proposed Property Tax Increase The City of Lithonia Council today announces its intention to increase the 2023 property taxes. Read on... More info Trains Blocking Intersections? Report It Immediately. How to Report Blocked Crossings More info COVID-19 Response COVID-19 Response More info Celebrating Black History Month Celebrating Black History Month. More info Previous Next Special Called Meeting Special Called Meeting More info Occupational Tax Certificate (Business License) administrative fee and processing procedures Lithonia's Mayor and City Council voted to change and correct the Occupational Tax Certificate (Business License) administrative fee and processing procedures. More info Press Release Announcing a Proposed Property Tax Increase The City of Lithonia Council today announces its intention to increase the 2023 property taxes. Read on... More info Trains Blocking Intersections? Report It Immediately. How to Report Blocked Crossings More info COVID-19 Response COVID-19 Response More info Celebrating Black History Month Celebrating Black History Month. More info -2839,https://opendata.howardcountymd.gov/,List of Data Sources,Info About Agencies,Howard County - Open Data Portal | Open Data Portal,"",200,"Howard County - Open Data Portal | Open Data Portal -","[""Welcome to Howard County Open Data""]","[""Menu"", ""Money and Finance"", ""Public Safety"", ""Utilities and Public Works"", ""Community Services"", ""Recreation and Parks"", ""Planning and Zoning"", ""Energy and Environment"", ""Transportation"", ""County Administration"", ""Licenses and Permits"", ""Maps, Locations and Boundaries"", ""Demographics"", ""Health"", ""Libraries"", ""Education"", ""Economic Development"", ""Featured Dataset:"", ""Featured Dataset:"", ""Featured Dataset:"", ""Featured Dataset:""]",[],[],[],[],"Skip to main content Skip to footer links Search Home About Data Catalog Get Started Developer Resources Help Sign In Menu Menu Close Home About Data Catalog Get Started Developer Resources Help Sign In Search Welcome to Howard County Open Data Howard County Open Data is part of a broader initiative to create an environment of expanded government openness and transparency. 💰 Money and Finance Data about budget, spending, and contracts 🚖 Public Safety Data on crime, fire, accidents, and enforcement 🔧 Utilities and Public Works Data on maintenance and management of public buildings, streets and highways, and water and sewer  Community Services Data about services provided to individuals, children, and families  Recreation and Parks Information about recreation, parks, and historic sites owned by the county  Planning and Zoning Data on planning, zoning, and revitalization efforts 🍂 Energy and Environment Data on sustainability, energy resources and use, and environmental conditions 🚍 Transportation Data about public transit 🏦 County Administration Data on county operations  Licenses and Permits Data on inspections, licenses and permits  Maps, Locations and Boundaries Geographic data and maps on county locations and boundaries  Demographics Data on demographics  Health Data on health 📖 Libraries Data on libraries 📓 Education Data on education 🏢 Economic Development Data on economic development Checking in seconds ... Featured Dataset: Building, Electrical, Fire, Grading, Mechanical, Plumbing & Sign Permits: 2010 - Present Issued Permits: 01/01/2010 - Present Featured Dataset: Presubmission Community Meetings Presubmission Community Meetings Featured Dataset: Capital Project Expenditures and Budgets: FY 2015 A listing of all capital projects active in Fiscal Year 2015 Featured Dataset: Bus Routes RTA Routes in Howard County, Prince Georges County and Anne Arundel County Checking in seconds ... " -2840,https://www.fresnostate.edu/adminserv/police/documents/,Crime Maps & Reports,Agency-Published Resources,"","",403,"","","","","","","","" -2841,https://cityprotect.com/agency/b0a52afd-b494-4168-a615-a0c6423284a3,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2842,https://cityprotect.com/agency/3a33f406-0418-42ff-b0ab-19d39bcbc652,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2843,https://www.ci.brea.ca.us/DocumentCenter/View/116/CrimeStats_Brea,Crime Statistics,Agency-Published Resources,"","",200,"","","","","","","","" -2844,https://cityprotect.com/agency/540048e6ee664a6f88ae0ceb93717e50,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2845,https://cityprotect.com/agency/urbanapd,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2846,https://sheriffalerts.com/cap_office_disclaimer.php?office=55195,Sex Offender Registry,Agency-Published Resources,"","",403,"","","","","","","","" -2847,https://cityprotect.com/agency/bentonpolicearkansas,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2848,http://www.bakercountysheriffoffice.org/contact.php,List of Data Sources,Info About Agencies,"Contact Us - Baker County Sheriff's Office, Georgia",Submit your questions & concerns and get map directions,200,"Error retrieving title: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))",[],"[""Contact Us"", ""Locate Us""]",[],[],[],[],"Skip to Main Content menu menu EMERGENCY 911 • Non-Emergency 229-734-3002 Header Angled Box Baker County SHERIFF'S OFFICE Emergency 911 • Non-Emergency 229-734-3002 Submit Crime Tip Baker County SHERIFF'S OFFICE Non-Emergency 229-734-3002 ReCaptcha Response Contact Us This email account is not monitored 24/7. If your message requires urgent attention, please call 911 (as applicable), or this office. Get Map Directions Email: *Message: By completing the reCAPTCHA and submitting this form, you are agreeing to our disclaimer . Please note: Plain text e-mail (non-encrypted) is not secure and should not be used to communicate confidential, sensitive, and/or personal information. The confidentiality and security of information sent via e-mail cannot be guaranteed.  Confidential, sensitive, and/or personal information includes, but is not limited to, your social security number, driver's license number, state identification card number, bank account number, credit card number, debit card number, medical information, etc. By submitting information via e-mail to this office, you hereby agree that none of the information contained in your communication is confidential, sensitive, or personal. You further agree that this office and the web hosting company shall not be held liable for any breach of confidentiality, breach of security, or similar cause of action resulting from use of e-mail with this office, including any liability for the negligent handling, use, or storage of information contained in your e-mail. Please call our office if you wish to provide sensitive information. Locate Us Submit Crime Tip Via Email Baker County SHERIFF EMERGENCY 911 Home Email Facebook Map Message from the Sheriff Press Releases Sex Offenders Contact Us Translate Non-Emergency Phone: 229-734-3002 (24-Hours) • Phone: 229-734-3003 • Email • 167 Baker Place • P.O. Box 441 • Newton, GA 39870 • Map • Administrative Office Hours: Monday – Friday: 8:00am – 4:30pm Translate Baker County Sheriff's Office • © 2010 - 2024 Baker County, Georgia Site Map • Accessibility Contact Crime Tips menu menu menu menu EMERGENCY 911 • Non-Emergency 229-734-3002 menu menu menu EMERGENCY 911 • Non-Emergency 229-734-3002 EMERGENCY 911 Header Angled Box Baker County SHERIFF'S OFFICE Emergency 911 • Non-Emergency 229-734-3002 Submit Crime Tip Baker County SHERIFF'S OFFICE Baker County SHERIFF'S OFFICE Baker County SHERIFF'S OFFICE Emergency 911 • Non-Emergency 229-734-3002 Submit Crime Tip Emergency 911 • Non-Emergency 229-734-3002 Submit Crime Tip Baker County SHERIFF'S OFFICE Non-Emergency 229-734-3002 Baker County SHERIFF'S OFFICE Non-Emergency 229-734-3002 " -2849,https://cityprotect.com/agency/fbb9411d-f7d5-4f8a-a7ce-b5c8bfb53d83,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2850,https://www2.auglaizecounty.org/elected-officials/clerk-courts/public-access-records,Records Request Info,Agency-Published Resources,Public Access Records | Auglaize County,"",200,Home | Auglaize County,"[""AUGLAIZE COUNTY.ORG"", ""AUGLAIZE COUNTY?"", ""AUGLAIZE COUNTY.ORG""]","[""Main navigation"", ""User account menu""]","[""AUGLAIZE COUNTY.ORG"", ""Public Access Records"", ""Public Access Records""]","[""Common Pleas Disclaimer"", """", ""Municipal Disclaimer"", ""Common Pleas Disclaimer"", """", ""Municipal Disclaimer""]",[],[],"" -2851,https://cityprotect.com/agency/lafayetteinpd,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2852,https://www.baldwinsheriff.com/most-wanted/,Wanted Persons,Agency-Published Resources,"","",404,"","","","","","","","" -2853,https://data.louisvilleky.gov/,List of Data Sources,Info About Agencies,Louisville Kentucky Open Data,"Explore our open data and tools, and use it build insights of your own.",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -2854,https://api.fbi.gov/wanted/v1/list,Wanted Persons,Agency-Published Resources,"","",200,"","","","","","","","" -2855,https://cityprotect.com/agency/ee7c318c-d408-4b32-84fd-d7d0cfffd65f,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2856,https://cityprotect.com/agency/carmelpd,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2857,https://www.cityofcalhoun-ga.com/wp-content/uploads/2017/12/OPEN-RECORDS-REQUEST-FORM.pdf,List of Data Sources,Info About Agencies,"","",200,"","","","","","","","" -2858,https://cityprotect.com/agency/wcso_or,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2859,https://cityprotect.com/agency/47fb67d5-a52f-4edb-a2b4-12568e29212b,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2860,https://www.sheriffoff.com/report-request/,Records Request Info,Agency-Published Resources,Putnam County Sheriff's Office - Report request,d,200,Putnam County Sheriff's Office,"[""Report request""]",[],[],"[""Quick links""]","["""", ""Accident Reports"", ""Pictures"", ""Video"", ""Audio"", ""Document""]",[],About About Us Careers History Press release Resources Services Active warrants Concealed carry permits Crime prevention tips Drug drop off box House check Inmate visitation Scam information Sex offender search State offender search Vine link WebCheck Winter snow levels Sheriff sales Sheriff sales Tax Sales Sold properties Sale info Sheriff sale FAQ Contact Contact us Report request Tip line Citizen Complaint Form About About Us Careers History Press release Resources Services Active warrants Concealed carry permits Crime prevention tips Drug drop off box House check Inmate visitation Scam information Sex offender search State offender search Vine link WebCheck Winter snow levels Sheriff sales Sheriff sales Tax Sales Sold properties Sale info Sheriff sale FAQ Contact Contact us Report request Tip line Citizen Complaint Form About About Us Careers History Press release Resources Services Active warrants Concealed carry permits Crime prevention tips Drug drop off box House check Inmate visitation Scam information Sex offender search State offender search Vine link WebCheck Winter snow levels Sheriff sales Sheriff sales Tax Sales Sold properties Sale info Sheriff sale FAQ Contact Contact us Report request Tip line Citizen Complaint Form About About Us Careers History Press release Resources Services Active warrants Concealed carry permits Crime prevention tips Drug drop off box House check Inmate visitation Scam information Sex offender search State offender search Vine link WebCheck Winter snow levels Sheriff sales Sheriff sales Tax Sales Sold properties Sale info Sheriff sale FAQ Contact Contact us Report request Tip line Citizen Complaint Form About About Us Careers History Press release Resources Services Active warrants Concealed carry permits Crime prevention tips Drug drop off box House check Inmate visitation Scam information Sex offender search State offender search Vine link WebCheck Winter snow levels Sheriff sales Sheriff sales Tax Sales Sold properties Sale info Sheriff sale FAQ Contact Contact us Report request Tip line Citizen Complaint Form About About Us Careers History Press release Resources Services Active warrants Concealed carry permits Crime prevention tips Drug drop off box House check Inmate visitation Scam information Sex offender search State offender search Vine link WebCheck Winter snow levels Sheriff sales Sheriff sales Tax Sales Sold properties Sale info Sheriff sale FAQ Contact Contact us Report request Tip line Citizen Complaint Form About About Us Careers History Press release Resources Services Active warrants Concealed carry permits Crime prevention tips Drug drop off box House check Inmate visitation Scam information Sex offender search State offender search Vine link WebCheck Winter snow levels Sheriff sales Sheriff sales Tax Sales Sold properties Sale info Sheriff sale FAQ Contact Contact us Report request Tip line Citizen Complaint Form About About Us Careers History Press release Resources Services Active warrants Concealed carry permits Crime prevention tips Drug drop off box House check Inmate visitation Scam information Sex offender search State offender search Vine link WebCheck Winter snow levels Sheriff sales Sheriff sales Tax Sales Sold properties Sale info Sheriff sale FAQ Contact Contact us Report request Tip line Citizen Complaint Form -2861,https://cityprotect.com/agency/81f890c9-6410-4773-8b83-88c0f5085fcd,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2862,https://cityprotect.com/agency/96a15ed8-74ec-49d7-ba08-1530d1aa2737,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2863,https://buycrash.lexisnexisrisk.com/,Accident Reports,Police & Public Interactions,LN BuyCrash,"",200,LN BuyCrash,[],[],[],[],[],[],"" -2864,https://cityprotect.com/agency/cc0d9a3d-50b2-4424-ae25-5699ba6eaff9,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2865,https://www1.nyc.gov/site/nypd/stats/reports-analysis/use-of-force-data.page,Use of Force Reports,Police & Public Interactions,Use of Force Data Tables - NYPD,"",200,Welcome to NYC.gov | City of New York,"[""Use of Force Data Tables""]","[""New York's Finest"", ""2023"", ""2022"", ""2021"", ""2020"", ""2019"", ""2018"", ""2017"", ""2016"", """"]","[""Fourth Quarter"", ""Third Quarter"", ""Second Quarter"", ""First Quarter"", ""Fourth Quarter"", ""Third Quarter"", ""Second Quarter"", ""First Quarter"", ""Fourth Quarter"", ""Third Quarter"", ""Second Quarter"", ""First Quarter"", ""Fourth Quarter"", ""Third Quarter"", ""Second Quarter"", ""First Quarter"", ""Fourth Quarter""]",[],[],[],"" -2866,https://www.cityofringgoldga.gov/ContactUs.aspx,List of Data Sources,Info About Agencies,Contact Us,"",200,Error retrieving title: dictionary changed size during iteration,"[""Contact Us""]",[],[],[],[],[],"Skip to Main Content Home About Ringgold City Government Business Residents Visitors Recreation Contact Us City of Ringgold 150 Tennessee Street Ringgold, Georgia 30736 Phone: (706) 935-3061 * Sign Up for Notifications City Links Americans with Disabilities Act (ADA) Survey Flag Locator Events Agendas Forms and Applications Fees Pay Utility Bill Pay Police Citation Current Job Openings Bid Advertisements and Bid Tabulations Millage Rate Live Stream Videos Public Meeting Videos Public Notices and Ordinances Facility Rental Agreements and Calendar Solar Power Initiative Senior Resources Cease the Grease! Volunteer Application Form The Scoop on SPLOST The Wilson School Contact Us City of Ringgold 150 Tennessee Street Ringgold, Georgia 30736 Office: (706) 935-3061 Email City of Ringgold Default preview for : IframeDefault preview for : Iframe © 2024 - Ringgold, GA Sitemap Accessibility Contact Us Email Share Skip to Main Content Home About Ringgold City Government Business Residents Visitors Recreation Contact Us City of Ringgold 150 Tennessee Street Ringgold, Georgia 30736 Phone: (706) 935-3061 Skip to Main Content Home About Ringgold City Government Business Residents Visitors Recreation Contact Us Home About Ringgold City Government Business Residents Visitors Recreation Contact Us Home About Ringgold City Government Business Residents Visitors Recreation Contact Us Home About Ringgold City Government Business Residents Visitors Recreation Contact Us City of Ringgold 150 Tennessee Street Ringgold, Georgia 30736 Phone: (706) 935-3061 City of Ringgold 150 Tennessee Street Ringgold, Georgia 30736 Phone: (706) 935-3061 City of Ringgold 150 Tennessee Street Ringgold, Georgia 30736 Phone: (706) 935-3061 * Sign Up for Notifications City Links Americans with Disabilities Act (ADA) Survey Flag Locator Events Agendas Forms and Applications Fees Pay Utility Bill Pay Police Citation Current Job Openings Bid Advertisements and Bid Tabulations Millage Rate Live Stream Videos Public Meeting Videos Public Notices and Ordinances Facility Rental Agreements and Calendar Solar Power Initiative Senior Resources Cease the Grease! Volunteer Application Form The Scoop on SPLOST The Wilson School Contact Us City of Ringgold 150 Tennessee Street Ringgold, Georgia 30736 Office: (706) 935-3061 Email City of Ringgold Default preview for : IframeDefault preview for : Iframe * Sign Up for Notifications City Links Americans with Disabilities Act (ADA) Survey Flag Locator Events Agendas Forms and Applications Fees Pay Utility Bill Pay Police Citation Current Job Openings Bid Advertisements and Bid Tabulations Millage Rate Live Stream Videos Public Meeting Videos Public Notices and Ordinances Facility Rental Agreements and Calendar Solar Power Initiative Senior Resources Cease the Grease! Volunteer Application Form The Scoop on SPLOST The Wilson School * * Sign Up for Notifications City Links Americans with Disabilities Act (ADA) Survey Flag Locator Events Agendas Forms and Applications Fees Pay Utility Bill Pay Police Citation Current Job Openings Bid Advertisements and Bid Tabulations Millage Rate Live Stream Videos Public Meeting Videos Public Notices and Ordinances Facility Rental Agreements and Calendar Solar Power Initiative Senior Resources Cease the Grease! Volunteer Application Form The Scoop on SPLOST The Wilson School City Links " -2867,https://cityprotect.com/agency/7993e600-6f3b-41a8-ad20-4b7d1f811f00,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2868,https://data.wprdc.org/dataset/pbp-fire-arm-seizures,Misc Police Activity,Police & Public Interactions,Pittsburgh Police Firearm Seizures - Dataset - CKAN,"",200,Dataset - CKAN,"[""Pittsburgh Police Firearm Seizures"", ""City of Pittsburgh"", ""Pittsburgh Police Firearm Seizures"", ""Data Use Agreement""]","[""Organization"", ""Social"", ""License"", ""Data and Resources"", ""Terms of use"", ""🚧 Under Construction""]","[""Additional Info""]",[],[],[],"Skip to main content Log in Register Log in Register Datasets Organizations Topics Search Datasets... Datasets Organizations Topics Search Datasets... Home Organizations City of Pittsburgh Pittsburgh Police Firearm Seizures Pittsburgh Police Firearm Seizures Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License Creative Commons CCZero Dataset Groups Pittsburgh Police Firearm Seizures This data includes counts of firearms by type seized by the Pittsburgh Bureau of Police. Each row describes a seizure incident involving one or more firearms. Firearm seizures can occur for several reasons. One of the Bureau of Police justifications for seizing a firearm involves a suspicion that a firearm was used in a criminal offense. Seizures may also occur to protect officer or public safety. For example, a weapon held by someone involved in a serious medical emergency, or an unattended weapon found in a public space may be seized and held for safekeeping. The Bureau’s firearms tracking unit conducts investigations to determine the rightful owner of firearms that have been seized. Where possible, the Bureau makes every effort to return firearms that have been seized to their rightful owners. Firearms seized by non-City of Pittsburgh law enforcement agencies within the City of Pittsburgh may not be included in this data. Federal, State, County, and other special law enforcement agencies (e.g. campus, transit, hospital, etc.) operate within the City limits. Data collected through supplemental reports filled out by Pittsburgh Bureau of Police officers upon taking possession of a firearm. Locations where the seizure occurred are anonymized to the address block or nearest intersection. It's not always possible to geocode these anonymized addresses. In cases where geocoding fails, the latitude and longitude fields are left empty. These will display as ""None"" in table views on the WPRDC site. Exact date and report numbers have been removed to protect the privacy of individuals and any active investigations. Data and Resources Firearm Seizures Data CSV Explore Preview Download Additional Info Field Value Public Access Level Comment Temporal Coverage 2015/present Geographic Unit Intersection/Street Segment Data Notes Exact date and report numbers have been removed to protect the privacy of individuals and any active investigations. In cases where geocoding fails, the latitude and longitude fields are left empty. Related Document(s) Frequency - Data Change As Needed Frequency - Publishing Monthly Data Steward Heath Johnson Data Steward Email Heath Johnson fire arms firearm guns pistol pistols public safety revolvers rifles seize seizures shotguns weapons " -2869,https://sheriff.starkcountyohio.gov/government/offices/sheriff/resources/index.php,List of Data Sources,Info About Agencies,"Welcome to Stark County, Ohio","",200,Sheriff,"[""Page Title""]","[""Sheriff Resources"", ""Resources"", ""Empty Header"", ""Security Camera Registration Portal"", ""Stark County, OH"", ""Share this page"", ""Empty Header""]","[""Empty Header""]",[],[],[],"" -2870,https://www.norcrossga.net/DocumentCenter/,List of Data Sources,Info About Agencies,"Document Center • Norcross, GA • CivicEngage",The Document Center is for storage of documents of many different file types. Documents stored in the Document Center can be separated by folders and subfolders.,200,"Norcross, GA - Official Website | Official Website",[],[],"[""Filter Documents by:"", ""Contact Us"", ""Quick Links"", ""Using This Site"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Residents Business Government Experience Norcross How Do I... City Home Español Search Home Document Center Filter Documents by: From To Folders Documents Pay Your Bill Subscribe to Alerts Report a Concern Agendas & Minutes Job Portal Open Records Request Contact Us City of Norcross 65 Lawrenceville Street Norcross, GA 30071 Phone: 770-448-2122 Fax: 770-242-0824 Quick Links Mayor & Council Elections Code Enforcement Press Room /QuickLinks.aspx Using This Site Site Map Accessibility Copyright Notices Government Websites by CivicPlus® /QuickLinks.aspx Next Previous Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Residents Business Government Experience Norcross How Do I... City Home Español Search Home Document Center Filter Documents by: From To Folders Documents Pay Your Bill Subscribe to Alerts Report a Concern Agendas & Minutes Job Portal Open Records Request Contact Us City of Norcross 65 Lawrenceville Street Norcross, GA 30071 Phone: 770-448-2122 Fax: 770-242-0824 Quick Links Mayor & Council Elections Code Enforcement Press Room /QuickLinks.aspx Using This Site Site Map Accessibility Copyright Notices Government Websites by CivicPlus® /QuickLinks.aspx Next Previous Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Residents Business Government Experience Norcross How Do I... City Home Español Search Home Document Center Filter Documents by: From To Folders Documents Pay Your Bill Subscribe to Alerts Report a Concern Agendas & Minutes Job Portal Open Records Request Contact Us City of Norcross 65 Lawrenceville Street Norcross, GA 30071 Phone: 770-448-2122 Fax: 770-242-0824 Quick Links Mayor & Council Elections Code Enforcement Press Room /QuickLinks.aspx Using This Site Site Map Accessibility Copyright Notices Government Websites by CivicPlus® /QuickLinks.aspx Next Previous Residents Business Government Experience Norcross How Do I... City Home Español Search Home Document Center Filter Documents by: From To Folders Documents Pay Your Bill Subscribe to Alerts Report a Concern Agendas & Minutes Job Portal Open Records Request Contact Us City of Norcross 65 Lawrenceville Street Norcross, GA 30071 Phone: 770-448-2122 Fax: 770-242-0824 Quick Links Mayor & Council Elections Code Enforcement Press Room /QuickLinks.aspx Using This Site Site Map Accessibility Copyright Notices Government Websites by CivicPlus® /QuickLinks.aspx Next Previous Residents Business Government Experience Norcross How Do I... City Home Español Search City Home Español Search City Home City Home City Home City Home City Home City Home City Home City Home City Home City Home City Home City Home Español Search Español Search Español Search Español Español Español Español Español Español Español Español Español Search Search Search Search Search Home Document Center Filter Documents by: From To Folders Documents Home Document Center Filter Documents by: From To Folders Documents Home Document Center Filter Documents by: From To Folders Documents " -2871,https://cityprotect.com/agency/8d3a038e-648b-4c1a-b262-7d3c56f7cb5f,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2872,https://cummingpd.net/,List of Data Sources,Info About Agencies,"","",200,"","[""CUMMING POLICE DEPARTMENT"", ""CUMMING POLICE DEPARTMENT"", ""CUMMING POLICE DEPARTMENT"", ""CUMMING POLICE DEPARTMENT"", ""CUMMING POLICE DEPARTMENT"", ""CUMMING POLICE DEPARTMENT"", ""CUMMING POLICE DEPARTMENT"", ""Mission Statement of the Cumming Police Department""]","[""Welcome to The City of Cumming"", ""Police Department Information""]",[],"[""OUR MISSION"", ""Office Hours"", ""Follow Us""]",[],[],"Pay a Ticket Request a Report Pay a Ticket Request a Report Pay a Ticket Pay a Ticket Pay a Ticket Request a Report Request a Report Request a Report About Us Location Our Staff Municipal Court Information Forms Weblinks Report a Crime About Us Location Our Staff Municipal Court Information Forms Weblinks Report a Crime Location Our Staff Report a Crime CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT CUMMING POLICE DEPARTMENT Welcome to The City of Cumming Welcome to the Cumming Police Department website. We hope that as you browse our site you will find helpful information from reporting a crime, to accessing information in obtaining incident reports, accident reports and background/fingerprinting information. The Cumming Police Department is a full service police department operating 24 hours a day, 7 days a week. We are here to serve our City and its Citizens. Our Staff Background and Report Fees Contact Info Welcome to The City of Cumming Welcome to the Cumming Police Department website. We hope that as you browse our site you will find helpful information from reporting a crime, to accessing information in obtaining incident reports, accident reports and background/fingerprinting information. The Cumming Police Department is a full service police department operating 24 hours a day, 7 days a week. We are here to serve our City and its Citizens. Our Staff Background and Report Fees Contact Info Our Staff Background and Report Fees Contact Info Our Staff Background and Report Fees Contact Info Our Staff Background and Report Fees Contact Info OUR STAFF OUR MISSION Mission Statement of the Cumming Police Department ""Passionately seeking justice and service for all in our community."" OUR STAFF OUR MISSION Mission Statement of the Cumming Police Department ""Passionately seeking justice and service for all in our community."" OUR STAFF OUR STAFF OUR MISSION Mission Statement of the Cumming Police Department ""Passionately seeking justice and service for all in our community."" " -2873,https://www.greeneso.org/contact-us,List of Data Sources,Info About Agencies,"Sheriff's Office Greene County, GA | Official Website","Welcome to the Official Website for the Sheriff's Office of Greene County, Georgia. For best mobile experience, get the MySheriff mobile-app on the app stores.",200,"Sheriff's Office Greene County, GA | Official Website",[],[],[],[],[],[],"" -2874,https://www.mcdonoughga.org/city-departments-services/police-department/faqs,List of Data Sources,Info About Agencies,"","",404,"","","","","","","","" -2875,https://csucpd.crimegraphics.com/2013/default.aspx,Crime Maps & Reports,Agency-Published Resources,CrimeGraphics.com,"",200," - CrimeGraphics.com -",[],[],[],[],[],[],CSU Chico Police Department JavaScript is disabled. For customize this text use element. CSU Chico Police Department JavaScript is disabled. For customize this text use element. CSU Chico Police Department CSU Chico Police Department JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. -2876,https://www.auroragov.org/cms/One.aspx?portalId=16242704&pageId=16573554,Annual & Monthly Reports,Info About Agencies,Annual & Public Reports - City of Aurora,"",200,Just a moment...,"[""Welcome to the City of Aurora Colorado""]","[""Annual & Public Reports""]","[""Contact Info"", ""Useful Links"", ""City of Aurora Colorado"", ""Accreditations""]",[],[],[],google-site-verification: googlee16c7726ecc34510.html -2877,https://cityprotect.com/agency/c5267f3b-34d9-4f57-9d97-286d6a09be79,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2878,https://data.wprdc.org/dataset/police-community-outreach,Misc Police Activity,Police & Public Interactions,Police Community Outreach - Dataset - CKAN,"",200,Dataset - CKAN,"[""Police Community Outreach"", ""City of Pittsburgh"", ""Police Community Outreach"", ""Data Use Agreement""]","[""Organization"", ""Social"", ""License"", ""Data and Resources"", ""Terms of use"", ""🚧 Under Construction""]","[""Additional Info""]",[],[],[],"Skip to main content Log in Register Log in Register Datasets Organizations Topics Search Datasets... Datasets Organizations Topics Search Datasets... Home Organizations City of Pittsburgh Police Community Outreach Police Community Outreach Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License Creative Commons Attribution Dataset Groups Police Community Outreach Community outreach activities attended by Pittsburgh Police Officers, starting from January 1 2016. Includes Zone, Event Name, Location, Date and Time. Data and Resources Community Outreach Report XLSX Explore Preview Download Data Dictionary XLSX Explore Preview Download Additional Info Field Value Public Access Level Comment Temporal Coverage 2016-01-01/2016-30-09 Geographic Unit Street Address Data Notes Related Document(s) Frequency - Data Change Monthly Frequency - Publishing Monthly Data Steward Data Steward Email community outreach police public safety Home Organizations City of Pittsburgh Police Community Outreach Police Community Outreach Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License Creative Commons Attribution Dataset Groups Police Community Outreach Community outreach activities attended by Pittsburgh Police Officers, starting from January 1 2016. Includes Zone, Event Name, Location, Date and Time. Data and Resources Community Outreach Report XLSX Explore Preview Download Data Dictionary XLSX Explore Preview Download Additional Info Field Value Public Access Level Comment Temporal Coverage 2016-01-01/2016-30-09 Geographic Unit Street Address Data Notes Related Document(s) Frequency - Data Change Monthly Frequency - Publishing Monthly Data Steward Data Steward Email community outreach police public safety Home Organizations City of Pittsburgh Police Community Outreach Police Community Outreach Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Social Twitter Facebook License Creative Commons Attribution Dataset Groups Police Community Outreach Community outreach activities attended by Pittsburgh Police Officers, starting from January 1 2016. Includes Zone, Event Name, Location, Date and Time. Data and Resources Community Outreach Report XLSX Explore Preview Download Data Dictionary XLSX Explore Preview Download Additional Info Field Value Public Access Level Comment Temporal Coverage 2016-01-01/2016-30-09 Geographic Unit Street Address Data Notes Related Document(s) Frequency - Data Change Monthly Frequency - Publishing Monthly Data Steward Data Steward Email community outreach police public safety Police Community Outreach Followers 1 Police Community Outreach Followers 1 Followers 1 Organization City of Pittsburgh The City of Pittsburgh's official web site is https://pittsburghpa.gov/. read more Dataset Groups Police Community Outreach Community outreach activities attended by Pittsburgh Police Officers, starting from January 1 2016. Includes Zone, Event Name, Location, Date and Time. Data and Resources Community Outreach Report XLSX Explore Preview Download Data Dictionary XLSX Explore Preview Download Additional Info Field Value Public Access Level Comment Temporal Coverage 2016-01-01/2016-30-09 Geographic Unit Street Address Data Notes Related Document(s) Frequency - Data Change Monthly Frequency - Publishing Monthly Data Steward Data Steward Email community outreach police public safety " -2879,https://gbi.georgia.gov/services/georgia-sex-offender-registry,Sex Offender Registry,Agency-Published Resources,Georgia Sex Offender Registry | Georgia Bureau of Investigation,"In accordance with O.C.G.A. §  42-1-12 , the Georgia Bureau of Investigation (GBI) is the central repository for Georgia's Violent Sexual Offender Registry.",200,Georgia Bureau of Investigation,"[""Georgia Sex Offender Registry""]","[""Main navigation"", ""Search this site"", ""Breadcrumb"", ""Services"", ""How can we help?"", ""About Us""]","[""Popular searches"", ""Call Us"", ""Online Tip Form"", ""Visit""]",[],[],[],"" -2880,https://www.alamedaca.gov/Departments/Police-Department/Annual-Crime-Stats,Annual & Monthly Reports,Info About Agencies,Annual Crime Statistics,"",200,HOME ,"[""Annual Crime Statistics""]",[],"[""Contact Us"", ""Connect With Us"", ""Read More""]",[],[],[],opens in new tab or window -2881,https://webmaster2166.wixsite.com/bartowso/sex-offender-search,Sex Offender Registry,Agency-Published Resources,Sex Offender Search | Bartow Co. S.O.,"",200,"",[],[],[],[],[],[],"" -2882,https://www.eastpointcity.org/east-point-police/#crime-statistics,Crime Statistics,Agency-Published Resources,"","",500,"","","","","","","","" -2883,http://daltonpd.com/statistics/,List of Data Sources,Info About Agencies,"","",404,"","","","","","","","" -2884,https://cityprotect.com/agency/c41083c5-8ec3-4ad1-9954-2f4ad9b8f79e,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2885,https://www.stonecrestga.gov/Assets/Files/Administration/OpenRecordsRequest_21_April.pdf,List of Data Sources,Info About Agencies,"","",200,"","","","","","","","" -2886,https://data.seattle.gov,List of Data Sources,Info About Agencies,City of Seattle Open Data portal,"",200,City of Seattle Open Data portal,[],"[""Menu"", ""Browse Categories"", ""Powered by Seattle Open Data"", ""About Open Data""]",[],[],[],[],"Skip to main content Skip to footer links Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Menu Close Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Seattle Open Data Welcome to the City’s Open Data Portal. Here you can find, analyze, and download data published by City departments. All data on this portal is free to use and share, subject to the Terms of Use. Click here to view all data New to Open Data? A guide to getting started Powered by Seattle Open Data See what you can build with Open Data API Documentation Information for developers Suggest a Dataset Can't find what you are looking for? Let us know! Browse Categories Most Popular Seattle's most popular datasets Recently Added The City's newest datasets City Business Includes city fleet, City Council, wage data Community Includes neighborhoods, community organizations, and equity initiatives data Education Includes education and related social services data Finance Includes data on city financial operations Land Base Includes GIS layers Permitting Includes building, electrical, trade, and other permit types Public Safety Includes 911 data, police, fire, and other public safety agencies Transportation Includes bike counters and parking data Powered by Seattle Open Data Open Performance Open Budget Capital Projects Explorer COVID Emergency Food Resources SPD Crime Dashboard Seattle Fire Calls Unreinforced Masonry Dashboard Submit Your Open Data Project About Open Data Seattle is home to an engaged, innovative public that strives to make the city a better place to live. As a City, we strive to make our data open to the public, enabling those outside of government to find solutions to our most pressing civic challenges. The Open Data Program makes the data generated by the City of Seattle available to the public for the purpose of increasing the quality of life for our residents; increasing transparency, accountability and comparability; promoting economic development and research; and improving internal performance management. Click here to learn more about the program " -2887,http://www.cityofdelano.org/108/Crime-Statistics,Crime Statistics,Agency-Published Resources,"Responding to and Preventing Crime | Delano, CA - Official Website","",200,"Delano, CA - Official Website | Official Website","[""Responding to and Preventing Crime"", ""Monthly Activity Report""]","[""Analysis""]","[""Contact Us"", ""Helpful Links"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Departments Services Business How Do I... Search Home Departments Police Department Significant Public Safety Efforts Responding to and Preventing Crime Analysis The Police Department regularly reviews crime data in search of suspects, methods of operation and trends. This is one to ensure our resources are deployed in the most effective manner. On a monthly basis, we conduct a ""Crime Watch"" meeting, where department members from all regions of the department converge to review this data. The aim of these gatherings is to communicate about crime related information and then generate creative and innovative solutions to disrupt crime patterns. The desired goal is to impact developing trends in their infancy, before they advance into long term tendencies that can have a negative impact on residents. Monthly Activity Report August 2018 September 2018 October 2018 November 2018 December 2018 January 2019 February 2019 March 2019 April 2019 May 2019 June 2019 July 2019 August 2019 September 2019 October 2019 November 2019 December 2019 January 2020 February 2020 March 2020 April 2020 May 2020 June 2020 July 2020 August 2020 September 2020 October 2020 November and December 2020 January 2021 February 2021 March 2021 April 2021 May 2021 June 2021 July 2021 August, September, October 2021 November 2021 December 2021 Vision Statement, Mission Statement and Goals Community Law Enforcement Liaison Board Complaints Significant Public Safety Efforts Divisions Administrative Division Chaplain Program Crime Prevention Neighborhood Watch Trespassing Enforcement Authorization Records and Dispatch Records Division Public Safety Dispatch Investigations Division Crimes Against Persons Crimes Against Property Fraud and Identity Theft Gang Information Evidence and Property Narcotics Patrol Division Explorer Post 999 Reserve Program Volunteers Megan's Law Ordinances Alarm Ordinance Update Alarm Ordinance Garage Sales Reporting a Crime Unsolved Cases Department Policy and Procedure Tip-Line Online Payments Weather Stay Connected Agendas & Minutes Employment Bids & RFPs Contact Us City of Delano 1015 11th Avenue, Delano, CA, United States, California PO Box 3010 Phone: 661-721-3303 Helpful Links Courts Economic Development Permits & Approvals Licenses Helpful Links /QuickLinks.aspx Site Links Home Site Map Contact Us Accessibility Copyright Notices Privacy Policy /QuickLinks.aspx Government Websites by CivicPlus® " -2888,https://www.valdosta.edu/administration/finance-admin/police/our-team.php,List of Data Sources,Info About Agencies,University Police and EOS - Valdosta State University,University Police and Environmental and Occupational Safety ,200,Error retrieving title: dictionary changed size during iteration,"[""University Police and EOS""]","[""About"", ""Academics"", ""Admissions"", ""Athletics"", ""Campus Life"", ""Alumni & Giving"", ""Strategic Priorities""]","[""View Profile"", ""View Profile"", ""View Profile"", ""View Profile"", ""View Profile"", ""View Profile"", ""View Profile"", ""View Profile""]","[""Resources for""]",[],"[""About Valdosta State"", ""Administration"", ""Employment Opportunities"", ""Colleges"", ""Majors and Degrees"", ""Academic Resources"", ""Admission to VSU"", ""Paying for College"", ""Costs"", ""Blazer Athletics"", ""Life at VSU"", ""Housing and Residence Life"", ""Student Services"", ""VSU Alumni Association"", ""Make a Gift"", ""Alumni & Friends"", ""A culture of excellence""]","Skip to content Text Only Valdosta State University My VSU Directory Apply Undergraduate Graduate Give Visit Search VSU Choose Engine Search Site Search Campus Directory Search Odum Library Menu Skip to content Text Only Valdosta State University My VSU Directory Apply Undergraduate Graduate Give Visit Search VSU Choose Engine Search Site Search Campus Directory Search Odum Library Menu Skip to content Text Only Valdosta State University My VSU Directory Apply Undergraduate Graduate Give Visit Search VSU Choose Engine Search Site Search Campus Directory Search Odum Library Menu Valdosta State University Valdosta State University Valdosta State University My VSU Directory Apply Undergraduate Graduate Give Visit Search VSU Choose Engine Search Site Search Campus Directory Search Odum Library Search VSU Choose Engine Search Site Search Campus Directory Search Odum Library Search Site Search Campus Directory Search Odum Library Search: Search Site Search Campus Directory Search Odum Library My VSU Apply Undergraduate Graduate Give Visit Online Campus Bookstore A-Z Index About About Valdosta State News Room On Campus Tour Registration Our Community Campus Directory Administration Office of the President Academic Affairs Student Affairs Staff Affairs Finance Administration Institutional Research Employment Opportunities Human Resources Faculty and Staff Positions Student Positions OneUSG Connect Careers Information Employee Resources Academics Colleges College of the Arts College of Humanities and Social Sciences College of Science and Mathematics College of Nursing and Health Sciences Harley Langdale, Jr. College of Business Administration James L. and Dorothy H. Dewar College of Education and Human Services Online College for Career Advancement The University College Majors and Degrees Undergraduate Graduate Specialist Doctoral Certificates Academic Resources Academic Affairs University Advising & Student Transitions Odum Library Book Store Academic Support Center First-Year Programs Adult & Military Programs Admissions Admission to VSU Undergraduate Admissions Graduate Admissions Transfer Students International Students Online College for Career Advancement Paying for College Financial Aid Scholarships Grants Loans Veterans Affairs Verification Costs Tuition and Fees Cost Calculator Bursary Registrar Athletics Blazer Athletics Schedules Booster Information V-State Club NCAA Compliance Tickets Watch LIVE Statistics and Records Athletics Staff Campus Life Life at VSU Recreation Student Activities Trips and Events Student Organizations Dining Housing and Residence Life Residence Halls Get Involved How to Apply Residential Communities Student Services Career Services Counseling Center Disability Services International Services Health Center Student Union Alumni & Giving VSU Alumni Association Get Involved Chapters Board Members Alumni Directory Make a Gift How to Give 1906 Society V-State Club Alumni & Friends Event Calendar In the News Strategic Priorities A culture of excellence Strategic Plan Blazer Ready Diversity, Equity, and Inclusion Blazer Wellness Resources for Current Students Faculty/Staff Alumni Community Visitors Close navigation Search: Search Site Search Campus Directory Search Odum Library Search Site Search Campus Directory Search Odum Library My VSU Apply Undergraduate Graduate Give Visit Online Campus Bookstore A-Z Index Online Campus Bookstore A-Z Index Online Campus Bookstore A-Z Index Online Campus Online Campus Bookstore Bookstore A-Z Index A-Z Index " -2889,https://www.colquittga.org/Police%20Department.htm,List of Data Sources,Info About Agencies,"","",404,"","","","","","","","" -2890,https://cityprotect.com/agency/cd728bac-6099-4a34-9ae1-c1200fada461,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2891,http://state.sor.gbi.ga.gov/SORT_PUBLIC/sor.csv,Sex Offender Registry,Agency-Published Resources,"","",200,"","","","","","","","" -2892,https://www.antiochca.gov/fc/police/crime-maps/this-weeks-aar.pdf,Arrest Records,Police & Public Interactions,"","",200,"","","","","","","","" -2893,https://cityprotect.com/agency/74c31c97-98ad-4e8d-88ff-d1ab86e7ee57,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2894,https://www.burbankpd.org/crime-information/daily-arrest-logs/?F_All=y,Arrest Records,Police & Public Interactions,Daily Arrest Logs - Crime Information | Burbank CA Police Department Design,"",200," - Burbank Police Department's mission is to protect life and property, provide professional police services, and work in partnership with the community. | Burbank CA Police Department Design -","[""Follow Us"", ""Daily Arrest Logs"", ""Sign Up for our Newsletter/E-Alerts"", ""Follow Us""]","[""Burbank Police"", ""Resources""]",[],[],[],[],"" -2895,http://www.dcor.state.ga.us/GDC/OffenderQuery/jsp/OffQryForm.jsp,Arrest Records,Police & Public Interactions,"","",-1,"","","","","","","","" -2896,https://cityprotect.com/agency/richardsonpd,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2897,https://data.sfgov.org,List of Data Sources,Info About Agencies,DataSF | San Francisco Open Data,"Our mission is to empower use of the City and County of San Francisco's data. Our core product is SF OpenData, the official open data portal.",200,DataSF | San Francisco Open Data,"[""Find the data you need"", ""Dataset Alerts""]","[""Publishing Departments""]",[],[],[],[],"SFGov Coordinator's Portal About Join Us Help Toggle navigation Data SF Open Data Explore Browse Data Developers Sign In Showcase Publishing Academy Resources Blog SFGov Coordinator's Portal About Join Us Help Explore Browse Data Developers Search Sign In SFGov Coordinator's Portal About Join Us Help SFGov Coordinator's Portal About Join Us Help SFGov Coordinator's Portal About Join Us Help Toggle navigation Data SF Open Data Explore Browse Data Developers Sign In Showcase Publishing Academy Resources Blog SFGov Coordinator's Portal About Join Us Help Toggle navigation Data SF Open Data Explore Browse Data Developers Sign In Showcase Publishing Academy Resources Blog SFGov Coordinator's Portal About Join Us Help Explore Browse Data Developers Search Sign In Explore Browse Data Developers Search Sign In Explore Browse Data Developers Search Sign In Find the data you need Search hundreds of datasets from the City and County of San Francisco. Or browse on the data catalog Search Search Search Get the latest COVID-19 data Get the latest COVID-19 data Get the latest COVID-19 data Economy & Community Data on businesses, community and economic development City Management & Ethics Data on finance, budgets, taxes, employees, elections, campaigns, ethics reporting, etc Transportation Data about public transit, biking, driving, parking, and flying Public Safety Data on crime, fire, accidents, and enforcement Health & Social Services Data about health, public health, and services provided to individuals, children and families Geographic Locations & Boundaries Geographic data on city locations and boundaries; Available as shapefiles, geojson, kml Energy & Environment Data on sustainability, energy and resource use, and environmental conditions Housing & Buildings Data on permitting, construction, housing units, building inspections, rent control, etc City Infrastructure Data on maintenance and management of public buildings and facilities, spaces, streets and right of way Culture and Recreation Data on arts, museums, public spaces and events View data by department Economy & Community Data on businesses, community and economic development City Management & Ethics Data on finance, budgets, taxes, employees, elections, campaigns, ethics reporting, etc Transportation Data about public transit, biking, driving, parking, and flying Public Safety Data on crime, fire, accidents, and enforcement Health & Social Services Data about health, public health, and services provided to individuals, children and families Geographic Locations & Boundaries Geographic data on city locations and boundaries; Available as shapefiles, geojson, kml Energy & Environment Data on sustainability, energy and resource use, and environmental conditions Housing & Buildings Data on permitting, construction, housing units, building inspections, rent control, etc City Infrastructure Data on maintenance and management of public buildings and facilities, spaces, streets and right of way Culture and Recreation Data on arts, museums, public spaces and events Economy & Community Data on businesses, community and economic development Economy & Community Data on businesses, community and economic development Economy & Community Data on businesses, community and economic development City Management & Ethics Data on finance, budgets, taxes, employees, elections, campaigns, ethics reporting, etc City Management & Ethics Data on finance, budgets, taxes, employees, elections, campaigns, ethics reporting, etc " -2898,https://www.pooler-ga.gov/pooler-departments/pooler-police-department,Accident Reports,Police & Public Interactions,Police Department - City of Pooler Georgia,"The Pooler Police Department’s mission is to protect life and property through the maintenance of peace and order, and the provision of law enforcement s",200,403 Forbidden,"[""Police Department""]",[],"[""Helpful Links"", ""Contact""]",[],[],[],"Government Development Authority Elections Mayor & Council Planning & Zoning Commission Public Meetings Departments Building & Inspections Business Registration City Manager’s Office Code Enforcement Finance Fire-Rescue Services Human Resources Legal Planning & Zoning Police Department Public Works Records Recreation Senior Center Utility Billing Resources Bids & Proposals Financials Ordinances Planning & Development Waste Collection Water Reporting Online Services Accident Reports Applications & Forms Citation Payments Court Dates Evidence & Property Form Submission Portal Inspection Request Online Payments Open Records Request Utility Bill Payments News Connect About Alerts City Events City Hall Contact Us Directory Employment Menu Select Page Government Development Authority Elections Mayor & Council Planning & Zoning Commission Public Meetings Departments Building & Inspections Business Registration City Manager’s Office Code Enforcement Finance Fire-Rescue Services Human Resources Legal Planning & Zoning Police Department Public Works Records Recreation Senior Center Utility Billing Resources Bids & Proposals Financials Ordinances Planning & Development Waste Collection Water Reporting Online Services Accident Reports Applications & Forms Citation Payments Court Dates Evidence & Property Form Submission Portal Inspection Request Online Payments Open Records Request Utility Bill Payments News Connect About Alerts City Events City Hall Contact Us Directory Employment Police Department Home / Departments / Police Department The Pooler Police Department’s mission is to protect life and property through the maintenance of peace and order, and the provision of law enforcement services. The Police Department represents all citizens and our belief in equal treatment under the law is sincere. We shall enforce the law impartially without regard to race, creed, color, sex, national origin, or situation in life and shall be diligent in protecting all citizens in the lawful exercise of their civil rights. Helpful Links Crime Stoppers Tipline Evidence & Property Georgia Inmate Database Georgia Parolee Database ICE Victim Notification Local Sex Offender Registry Missing Kids NCMEC National Sex Offender Registry Open Records Request Pooler Police Department Facebook Page Contact Lindsey Heintzman Executive Administrative Assistant & Public Information Coordinator Police Department (912) 748-7333 lheintzman@pooler-ga.gov 100 US Highway 80 SW, Pooler, GA 31322 City Hall: (912) 748-7261 Police Department: (912) 748-7333 #99754 Date of Authorization: 2/13/08 © 2023 City of Pooler. Website developed by RobMark - Web • Advertising • PR Privacy | Terms " -2899,https://cityprotect.com/agency/acso,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2900,https://data.cityofchicago.org,List of Data Sources,Info About Agencies,City of Chicago | Data Portal | City of Chicago | Data Portal,"",200,City of Chicago | Data Portal | City of Chicago | Data Portal,"[""Welcome!"", ""2024 Budget Ordinance"", ""2023 Ward Map"", ""Safe Chicago Bleeding Control Kits"", ""COVID-19"", ""Financial Incentive Projects"", ""Transportation Network Provider Trips"", ""311 Service Requests"", ""Mural Registry"", ""Traffic Crashes"", ""Freedom of Information Act (FOIA)""]","[""Menu"", ""Browse the data catalog by the following categories"", ""Chicago Apps"", ""About the Open Data Portal"", ""Open Data News & Updates"", ""Developer News""]","[""Open Grid"", ""Health Atlas"", ""Service Tracker"", ""Digital Collections"", ""COPA Adds More Transparency with Police Complaint Data"", ""Share Maps You Create from OpenGrid"", ""Chicago Park District Expands Beach Water Quality Testing"", ""OpenGrid included in Mozilla Global Sprint 2017"", ""Preserve Public Data with Chicago’s RSocrata"", ""Starting Salary: New Employee Info on the Data Portal"", ""Dive in to a Redesigned Data Portal"", ""Dine al fresco with the Open Data Portal"", ""A Move to Main Branch (Source: Socrata)"", ""Violence Reduction Data Portal Visualizations Replaced by Violence Reduction Dashboard (Source: Chicago)"", ""Vacant and Abandoned Buildings Violations Corrections (Source: Chicago)"", ""COVID-19 Emergency Department Visits Reporting Change (Source: Chicago)"", ""COVID-19 Dataset Update Frequency Change (Source: Chicago)"", ""COVID-19 Vaccination New Age Groups (Source: Chicago)"", ""Energy Benchmarking Correction (Source: Chicago)"", ""Removing Age from Sex Offenders dataset (Source: Chicago)"", ""COVID-19 Daily Testing - By Person Becoming Historical-Only (Source: Chicago)"", ""COVID-19 Vaccination New Ethnic Groups (Source: Chicago)"", ""Removing Precinct from Sidewalk Cafe Permits dataset (Source: Chicago)"", ""Time Series Analysis with Jupyter Notebooks and Socrata (Source: Socrata)""]",[],[],[],Skip to main content Skip to footer links -2901,https://www.alamedaca.gov/Departments/Police-Department/Annual-Arrest-Traffic-Statistics,List of Data Sources,Info About Agencies,Annual Arrest & Traffic Statistics,"",200,Error retrieving title: dictionary changed size during iteration,"[""Annual Arrest & Traffic Statistics""]",[],"[""Contact Us"", ""Connect With Us"", ""Read More""]",[],[],[],opens in new tab or window -2902,https://dps.georgia.gov/ask-us/how-do-i-submit-open-records-request,List of Data Sources,Info About Agencies,Submit an Open Records Request | Georgia Department of Public Safety,"",200,Georgia Department of Public Safety,"[""Submit an Open Records Request?""]","[""Main navigation"", ""Search this site"", ""Breadcrumb"", ""Ask Us"", ""How do I obtain a traffic crash report?"", ""How do I obtain photographs or other records related to my crash or incident?"", ""Open Records Unit"", ""Related Links"", ""How can we help?"", ""About Us"", ""Get in Touch""]","[""Popular searches"", ""Call Us"", ""Visit"", ""Mail"", ""Hours""]",[],[],[],"" -2903,https://www.antiochca.gov/fc/police/crime-maps/this-weeks-cfs.pdf,Crime Maps & Reports,Agency-Published Resources,"","",200,"","","","","","","","" -2904,https://cityprotect.com/agency/gloucesterva,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2905,https://www.atlantapd.org/i-want-to/ops-reports/-folder-132,List of Data Sources,Info About Agencies,"","",-1,"","","","","","","","" -2906,https://cityprotect.com/agency/55a6d297-f3ec-49d7-9661-ce327d973e7c,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2907,https://cityprotect.com/agency/540048e6-ee66-4a6f-88ae-0ceb93717e50,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2908,https://cityprotect.com/agency/693cc3ad-63f5-46e1-913a-1388f6062946,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2909,https://cityprotect.com/agency/70d8655a-838f-466e-8451-9d21177cbd04,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2910,https://cityprotect.com/agency/236a27e6-a6a4-4653-b943-23f598718d2d,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2911,https://opendata.cityofnewyork.us/,List of Data Sources,Info About Agencies,NYC Open Data -,NYC Open Data helps New Yorkers use and learn about City data,200,403 Forbidden,"[""Home"", ""Open Data for All New Yorkers"", ""See how creators are answering everyday questions with open data""]","[""How You Can Get Involved"", ""Discover NYC Data""]","[""New to Open Data"", ""Data Veterans"", ""Get in Touch"", ""Dive into the Data"", ""Datasets by Agency"", ""Datasets by Category"", ""New Datasets"", ""Popular Datasets""]",[],"[""You are leaving the City of New York’s website.""]",[],"OpenData 311 Search all NYC.gov websites Menu Home Data About Overview Laws and Reports Dashboard Learn How To Join a Class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Home Open Data for All New Yorkers Open Data is free public data published by New York City agencies and other partners. Attend Open Data Week 2024 , or sign up for the NYC Open Data mailing list to find training opportunities and upcoming events. Search the NYC Open Data catalog Learn about the latest work behind NYC Open Data and read our 2023 Report How You Can Get Involved New to Open Data Learn what data is and how to get started with our How To. Data Veterans View details on Open Data APIs . Get in Touch Ask a question, leave a comment, or suggest a dataset to the NYC Open Data team . Dive into the Data If you already know what you’re looking for, you can browse our data catalog . Or, if you want to explore datasets that might be related to each other, try Data Clinic’s scout tool. See how creators are answering everyday questions with open data View Projects Discover NYC Data Datasets by Agency Search data by the City agency it comes from . Datasets by Category Search data by categories such as Business, Education, and Environment. New Datasets View recently published datasets on the data catalog. Popular Datasets View some of the most popular datasets on the data catalog. OpenData 311 Search all NYC.gov websites OpenData 311 Search all NYC.gov websites OpenData 311 Search all NYC.gov websites OpenData 311 Search all NYC.gov websites Menu Home Data About Overview Laws and Reports Dashboard Learn How To Join a Class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Menu Home Data About Overview Laws and Reports Dashboard Learn How To Join a Class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Menu Home Data About Overview Laws and Reports Dashboard Learn How To Join a Class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Menu Home Data About Overview Laws and Reports Dashboard Learn How To Join a Class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Home Data About Overview Laws and Reports Dashboard Learn How To Join a Class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In " -2912,https://cityprotect.com/agency/dunwoodypolice,List of Data Sources,Info About Agencies,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2913,http://www.bakercountysheriffoffice.org/sex_offenders.php,Sex Offender Registry,Agency-Published Resources,"Sex Offenders - Baker County Sheriff's Office, Georgia","",200,"Error retrieving title: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))",[],"[""Sex Offenders\t\t\t\t\t\t ( )""]",[],[],[],[],"Skip to Main Content menu menu EMERGENCY 911 • Non-Emergency 229-734-3002 Header Angled Box Baker County SHERIFF'S OFFICE Emergency 911 • Non-Emergency 229-734-3002 Submit Crime Tip Baker County SHERIFF'S OFFICE Non-Emergency 229-734-3002 Sex Offenders ( ) Sex Offenders List - Screen Reader Friendly. Options Also visit the state and national offender registries. The addresses posted on this offender registry by the Baker County Sheriff's Office may be in error due to the improper reporting by the offenders. Please report any errors to the Baker County Sheriff's Office . Submit Crime Tip Via Email Baker County SHERIFF EMERGENCY 911 Home Email Facebook Map Message from the Sheriff Press Releases Sex Offenders Contact Us Translate Non-Emergency Phone: 229-734-3002 (24-Hours) • Phone: 229-734-3003 • Email • 167 Baker Place • P.O. Box 441 • Newton, GA 39870 • Map • Administrative Office Hours: Monday – Friday: 8:00am – 4:30pm Translate Baker County Sheriff's Office • © 2010 - 2024 Baker County, Georgia Site Map • Accessibility Contact Crime Tips menu menu menu menu EMERGENCY 911 • Non-Emergency 229-734-3002 menu menu menu EMERGENCY 911 • Non-Emergency 229-734-3002 EMERGENCY 911 Header Angled Box Baker County SHERIFF'S OFFICE Emergency 911 • Non-Emergency 229-734-3002 Submit Crime Tip Baker County SHERIFF'S OFFICE Baker County SHERIFF'S OFFICE Baker County SHERIFF'S OFFICE Emergency 911 • Non-Emergency 229-734-3002 Submit Crime Tip Emergency 911 • Non-Emergency 229-734-3002 Submit Crime Tip Baker County SHERIFF'S OFFICE Non-Emergency 229-734-3002 Baker County SHERIFF'S OFFICE Non-Emergency 229-734-3002 Sex Offenders ( ) Sex Offenders List - Screen Reader Friendly. Options Also visit the state and national offender registries. The addresses posted on this offender registry by the Baker County Sheriff's Office may be in error due to the improper reporting by the offenders. Please report any errors to the Baker County Sheriff's Office . Sex Offenders ( ) Sex Offenders List - Screen Reader Friendly. Options Also visit the state and national offender registries. The addresses posted on this offender registry by the Baker County Sheriff's Office may be in error due to the improper reporting by the offenders. Please report any errors to the Baker County Sheriff's Office . Sex Offenders ( ) Sex Offenders List - Screen Reader Friendly. Options Also visit the state and national offender registries. The addresses posted on this offender registry by the Baker County Sheriff's Office may be in error due to the improper reporting by the offenders. Please report any errors to the Baker County Sheriff's Office . Sex Offenders List - Screen Reader Friendly. Options Also visit the state and national offender registries. The addresses posted on this offender registry by the Baker County Sheriff's Office may be in error due to the improper reporting by the offenders. Please report any errors to the Baker County Sheriff's Office . Sex Offenders List - Screen Reader Friendly. Options Also visit the state and national offender registries. Options Also visit the state and national offender registries. Options Also visit the state and national offender registries. Options Submit Crime Tip Via Email " -2914,https://cityprotect.com/agency/d1d4c189-c030-4e6b-b336-f9d3224d93bc,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2915,https://www.baldwinsheriff.com/clerical-personal/,List of Data Sources,Info About Agencies,"","",404,"","","","","","","","" -2916,https://alameda.crimegraphics.com/2013/default.aspx,List of Data Sources,Info About Agencies,CrimeGraphics.com,"",200," - CrimeGraphics.com -",[],[],[],[],[],[],Alameda Police Department JavaScript is disabled. For customize this text use element. Alameda Police Department JavaScript is disabled. For customize this text use element. Alameda Police Department Alameda Police Department JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. -2917,https://cityprotect.com/agency/43ed6fb3-7e0d-4ab7-84ad-2f7e4b4b40b4,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2918,https://opendata.minneapolismn.gov/datasets/,List of Data Sources,Info About Agencies,Open Minneapolis,Open Minneapolis,200,Open Minneapolis,[],[],[],[],[],[],"" -2919,https://dawsoncountysheriff.org/records/,Crime Maps & Reports,Agency-Published Resources,Records – Dawson County Sheriff's Office,"",200,Dawson County Sheriff's Office,"[""Records""]","[""GENERAL INFORMATION"", """", """"]","[""MAILING ADDRESS FOR COMPLETED FORMS"", ""RECORDS STAFF"", ""PROCESSING OF REQUEST(S)""]",[],[],[],"Dawson County Sheriff's Office Home Components Administration Crime Suppression Unit Communications Detention Investigations Office of Professional Standards School Resource Officers Sheriff’s Services Uniform Patrol Careers Records Citizen Info Contact Community Newsletter Adult Programs Youth Programs Records GENERAL INFORMATION Individuals who wish to obtain records or information in accordance with Georgia’s Open Records Act must make their request known in writing. These requests should include the date and time of the incident(s), a contact number, name of requestor, a return address, and an appropriate Georgia or Federal Public Information or Record Law that you are using to apply for information. Specific types of requests will incur a charge. If this is the case, we will contact you prior to processing the request. Please contact Amanda Martin by phone at (706) 344-3535, fax at (706) 344-3550, or via email at agmartin@dawsoncountysheriff.org . If you email your request, please attach a completed open records request form, which is located on the bottom of this page. MAILING ADDRESS FOR COMPLETED FORMS Attention – Amanda Martin Dawson County Sheriff’s Office 19 Tucker Avenue Dawsonville, GA 30534 RECORDS STAFF Records Manager Amanda Martin agmartin@dawsoncountysheriff.org 706-344-3535 ext. 10171 PROCESSING OF REQUEST(S) The Dawson County Sheriff’s Office will make every effort to complete all open record request within three (3) business days, excluding holidays. OPEN RECORDS REQUEST ONLINE Open Records Request OPEN RECORDS REQUEST FORM Open Records Request Components Careers Records Citizen Info Community Contact Social Networking Policy Dawson County Sheriff's Office Call Us Email Us Find Us Follow Us Tweet to Us © Copyright Dawson County Sheriff's Office 2024 Terms of Use Privacy Policy " -2920,https://webmaster2166.wixsite.com/bartowso/inmate-search,Arrest Records,Police & Public Interactions,Jail Inmate Search | Bartow Co. S.O.,"",200,"",[],[],[],[],[],[],"" -2921,https://www.alamedaca.gov/Departments/Police-Department/Crime-Activity,Crime Statistics,Agency-Published Resources,Alameda Crime Activity,To see Alameda's reported crimes over the last six months visit Crime Mapping and our daily Activity Log.,200,HOME ,"[""Alameda Crime Activity""]","[""Alameda Crime Graphics"", ""Annual Crime Statistics"", ""Monthly Crime Statistics"", ""Annual Arrest and Traffic Statistics"", ""Policy and Hate Crimes Reports""]","[""Contact Us"", ""Connect With Us"", ""Read More""]","[""**On April 7, 2021, APD's Crime Mapping website and Daily Activity Logs were replaced with Alameda's Crime Graphics website. Daily Activity Logs will now be referred to as Media Bulletins and are accessible through the Crime Graphics website.**""]",[],[],opens in new tab or window -2922,https://acworthpolice.org/departments/annual-report,List of Data Sources,Info About Agencies,Annual Report - Acworth Police Department,"",200,Home - Acworth Police Department,[],[],"[""Acworth Police Department & Detention Facility Annual Report"", ""Records Division"", ""Police Department"", ""Other Divisons""]","[""2022 Annual Report"", ""2021 Annual Report"", ""2020 Annual Report"", ""2019 Annual Report"", ""2018 Annual Report"", ""2017 Annual Report"", ""2016 Annual Report"", ""2015 Annual Report""]",[],[],"770-974-1232 records@acworth.org Mon - Fri 8:00 am - 5:00 pm Home Department Administrative Division Annual Report Community Affairs Criminal Investigations Public Safety Liaison Office of Professional Standards Public Information Release Records Division Special Operations Uniformed Patrol Division Community Outreach Connect Acworth Citizen's Police Academy Community Room Request Georgia Special Olympics Golf Cart (PTV) Information HOA Contact Form LESS Crime Act Tax Credit Local Resources Cobb County Government Department of Driver Services Georgia Parolee Database Georgia Sex Offender Registry National Bike Registry National Center for Missing/Exploited Children Officer Down Memorial Property Room Auctions Mental Health Resources Detox Local GA Peer2Peer Warm Line National Suicide Prevention Lifeline Substance Abuse and Mental Health Services The Summit Wellness Group Georgia Crisis and Access Line Rehab Centers Opioid Overdose Prevention Opioid Overdose Rescue Police Ambassador Camp Public Safety Cadet Run. Hide. Fight Vacation House Check Request Victim Advocacy Cobb County Forgery Unit Identity Theft Recovery Steps Temp. Protection Order Pamphlet Victim Info. & Notification Everyday Victim Witness Pamphlet Contact Us Employment Acworth Police Department & Detention Facility Annual Report 2022 Annual Report 2021 Annual Report 2020 Annual Report 2019 Annual Report 2018 Annual Report 2017 Annual Report 2016 Annual Report 2015 Annual Report Records Division Monday - Friday: 8:00 AM to 5:00 PM Records@acworth.org (770) 974-1232 Police Department Acworth Police Department 4440 Acworth Industrial Dr. Acworth, GA 30101 (770)-974-1232 Other Divisons Investigations: (678) 801-4043 Court Services: (770) 974-0965 Tip Hotline: (770) 975-5826 Copyright © 2021 Acworth Police Department 770-974-1232 records@acworth.org Mon - Fri 8:00 am - 5:00 pm Home Department Administrative Division Annual Report Community Affairs Criminal Investigations Public Safety Liaison Office of Professional Standards Public Information Release Records Division Special Operations Uniformed Patrol Division Community Outreach Connect Acworth Citizen's Police Academy Community Room Request Georgia Special Olympics Golf Cart (PTV) Information HOA Contact Form LESS Crime Act Tax Credit Local Resources Cobb County Government Department of Driver Services Georgia Parolee Database Georgia Sex Offender Registry National Bike Registry National Center for Missing/Exploited Children Officer Down Memorial Property Room Auctions Mental Health Resources Detox Local GA Peer2Peer Warm Line National Suicide Prevention Lifeline Substance Abuse and Mental Health Services The Summit Wellness Group Georgia Crisis and Access Line Rehab Centers Opioid Overdose Prevention Opioid Overdose Rescue Police Ambassador Camp Public Safety Cadet Run. Hide. Fight Vacation House Check Request Victim Advocacy Cobb County Forgery Unit Identity Theft Recovery Steps Temp. Protection Order Pamphlet Victim Info. & Notification Everyday Victim Witness Pamphlet Contact Us Employment Acworth Police Department & Detention Facility Annual Report 2022 Annual Report 2021 Annual Report 2020 Annual Report 2019 Annual Report 2018 Annual Report 2017 Annual Report 2016 Annual Report 2015 Annual Report Records Division Monday - Friday: 8:00 AM to 5:00 PM Records@acworth.org (770) 974-1232 Police Department Acworth Police Department 4440 Acworth Industrial Dr. Acworth, GA 30101 (770)-974-1232 Other Divisons Investigations: (678) 801-4043 Court Services: (770) 974-0965 Tip Hotline: (770) 975-5826 Copyright © 2021 Acworth Police Department 770-974-1232 records@acworth.org Mon - Fri 8:00 am - 5:00 pm " -2923,https://cityprotect.com/agency/d1b180b8-befb-4d87-bee8-ce6bd9b26eb3,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2924,https://dunwoodyga.mycusthelp.com/webapp/_rs/(S(4si2fkk1suuja4f33os0gqcf))/supporthome.aspx,List of Data Sources,Info About Agencies,Support Home Page,"",200,GovQA | Digital Public Records Solution | Granicus,"[""Public Records Center"", ""Public Records Center""]","[""Public Records Menu"", ""FAQs""]","[""Submit an Open Records Request"", ""Search Information about Open Records"", ""View My Open Records Requests""]",[],[],[],Public Records Center Public Records Center Menu Home FAQs Submit a Request My Request Center Public Records Menu Home FAQs Submit a Request My Request Center FAQs See All FAQs Frequently Asked Questions Summary What is the Georgia Open Records Act? Support Home Page Menu ▼ I want to... Search Information about Open Records Submit an Open Records Request ▼ My Account View My Questions and Requests Login Logout ▼ Return to Main Menu I want to... My Account Return to Main Menu Search Information about Open Records Submit an Open Records Request View My Questions and Requests Login Logout Submit an Open Records Request Search Information about Open Records View My Open Records Requests Session Timeout WARNING: You will be logged out in 0 minute(s) due to inactivity. Keep Working TIMEOUT: You have been logged out due to inactivity. Login Menu Home FAQs Submit a Request My Request Center Public Records Menu Home FAQs Submit a Request My Request Center FAQs See All FAQs Frequently Asked Questions Summary What is the Georgia Open Records Act? Support Home Page Menu ▼ I want to... Search Information about Open Records Submit an Open Records Request ▼ My Account View My Questions and Requests Login Logout ▼ Return to Main Menu I want to... My Account Return to Main Menu Search Information about Open Records Submit an Open Records Request View My Questions and Requests Login Logout Submit an Open Records Request Search Information about Open Records View My Open Records Requests Session Timeout WARNING: You will be logged out in 0 minute(s) due to inactivity. Keep Working TIMEOUT: You have been logged out due to inactivity. Login Menu Home FAQs Submit a Request My Request Center Public Records Menu Home FAQs Submit a Request My Request Center FAQs See All FAQs Frequently Asked Questions Summary What is the Georgia Open Records Act? Support Home Page Menu ▼ I want to... Search Information about Open Records Submit an Open Records Request ▼ My Account View My Questions and Requests Login Logout ▼ Return to Main Menu I want to... My Account Return to Main Menu Search Information about Open Records Submit an Open Records Request View My Questions and Requests Login Logout Submit an Open Records Request Search Information about Open Records View My Open Records Requests Session Timeout WARNING: You will be logged out in 0 minute(s) due to inactivity. Keep Working TIMEOUT: You have been logged out due to inactivity. Login Menu Home FAQs Submit a Request My Request Center FAQs See All FAQs Frequently Asked Questions Summary What is the Georgia Open Records Act? Frequently Asked Questions Summary What is the Georgia Open Records Act? Frequently Asked Questions -2925,https://cityprotect.com/agency/antiochcapolicedepartment/download,List of Data Sources,Info About Agencies,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2926,https://www.dunwoodyga.gov/police/services/police-reports-open-records,List of Data Sources,Info About Agencies,"","",-1,"","","","","","","","" -2927,https://www.dixonpolice.org/evo_cloud_widget/media_folder/?media_folder_id=28802¤t_folder=,Annual & Monthly Reports,Info About Agencies,"","",200,"","","","","","","","" -2928,https://csucpd.crimegraphics.com/2013/default.aspx#BulletinMenu,Crime Maps & Reports,Agency-Published Resources,CrimeGraphics.com,"",200," - CrimeGraphics.com -",[],[],[],[],[],[],CSU Chico Police Department JavaScript is disabled. For customize this text use element. CSU Chico Police Department JavaScript is disabled. For customize this text use element. CSU Chico Police Department CSU Chico Police Department JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. -2929,https://www.safehenry.com/missing-persons,List of Data Sources,Info About Agencies,OPEN RECORDS,"",200,403 Forbidden,"[""OPEN RECORDS""]","[""OUR PURPOSE""]",[],[],"[""ADDRESS""]",[],"" -2930,https://cityprotect.com/agency/dd6266ba-010f-4ce0-827a-cc17dd7370e5,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2931,https://cityprotect.com/agency/d007d329-ab78-4bbb-beb0-a15a70510f1d,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2932,https://cityprotect.com/agency/westminsterca,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2933,http://www.el-cerrito.org/1343/Administrative-Investigation-12-21,Complaints & Misconduct,Info About Officers,"Administrative Investigation 12-21 | El Cerrito, CA - Official Website","",200,"El Cerrito, CA - Official Website | Official Website","["""", ""Administrative Investigation 12-21""]",[],"["""", """", ""Contact Us"", ""Quick Links"", ""Helpful Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Facebook Twitter Pinterest Delicious Blogger LinkedIn Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search About Us Administration Chief's Welcome How Do I.. News & Alerts Patrol Division Special Operations Home Your Government City Departments Police Department How Do I.. Find Public Records Act Archive Released Records Administrative Investigation 12-21 Administrative Investigation 12-21 PDF of Administrative Investigation: Administrative Investigation 12-21 Please find PDFs of the police report below: 12-23364a 12-23364f 12-23364b 12-23364g 12-23364c 12-23364h 12-23364d 12-23364i 12-23364e ECPD Case 15-22851 Public Record 2003 Administrative Investigation 12-21 UAS Policy Home page about us file a report join our team nixle municipal code parking citation Contact Us Public Safety Building 10900 San Pablo Avenue El Cerrito, CA 94530 Dispatch: 510-237-3233 , then select option 0 Emergency: 911 Office Hours Monday - Friday 8 a.m. - 5 p.m. Records Phone: 510-215-4400 Fax: 510-235-6618 Quick Links Countywide Community Warning System The Commission on Peace Officer Standards & Training /QuickLinks.aspx Helpful Links Sitemap Accessibility Copyright Notices Government Websites by CivicPlus® /QuickLinks.aspx Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Facebook Twitter Pinterest Delicious Blogger LinkedIn Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search About Us Administration Chief's Welcome How Do I.. News & Alerts Patrol Division Special Operations Home Your Government City Departments Police Department How Do I.. Find Public Records Act Archive Released Records Administrative Investigation 12-21 Administrative Investigation 12-21 PDF of Administrative Investigation: Administrative Investigation 12-21 Please find PDFs of the police report below: 12-23364a 12-23364f 12-23364b 12-23364g 12-23364c 12-23364h 12-23364d 12-23364i 12-23364e ECPD Case 15-22851 Public Record 2003 Administrative Investigation 12-21 UAS Policy Home page about us file a report join our team nixle municipal code parking citation Contact Us Public Safety Building 10900 San Pablo Avenue El Cerrito, CA 94530 Dispatch: 510-237-3233 , then select option 0 Emergency: 911 Office Hours Monday - Friday 8 a.m. - 5 p.m. Records Phone: 510-215-4400 Fax: 510-235-6618 Quick Links Countywide Community Warning System The Commission on Peace Officer Standards & Training /QuickLinks.aspx Helpful Links Sitemap Accessibility Copyright Notices Government Websites by CivicPlus® /QuickLinks.aspx Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -2934,https://www.dekalbschoolsga.org/student-support-intervention/public-safety/,List of Data Sources,Info About Agencies,Public Safety – DeKalb County School District,"Profile - - -The Department of Public Safety is a certified law enforcement agency established under The Official Code of Georgia Annotated. The School Resource Officer program is a nationally accepted program that places law enforcement officers within local schools. The school resource officer initiative is designed to increase the rapport between students and police",200,Error retrieving title: dictionary changed size during iteration,"[""Public Safety""]","[""Profile"", ""Services"", ""Command Staff""]",[],"[""Profile"", ""Services"", ""Command Staff"", ""Profile"", ""Mission"", ""Goals & Motto"", ""Services"", ""Campus Security"", ""Criminal Investigation"", ""Crossing Guards"", ""Emergency response Team (E.R.T.)"", ""Fingerprinting & Background Checks"", ""Office of Professional Standards"", ""Safe Schools"", ""Functions/Responsibilities"", ""Command Staff""]",[],[],"" -2935,https://cityprotect.com/agency/a6e1d369-e503-4c21-bf7e-701e3d3ff4eb,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2936,https://www.antiochca.gov/police/crime-statistics/crime-statistics/,Crime Statistics,Agency-Published Resources,"Crime Statistics – City of Antioch, California","",200,"City of Antioch, California",[],"[""Contact Info""]","[""Crime Statistics""]","[""Send Message"", ""Select a Year""]","[""Brian Addington"", ""Acting Chief of Police"", ""Captain Morefield"", ""Field Services"", ""Lt. Mellone"", ""Professional Standards""]",[],"" -2937,https://pap.georgia.gov/inmate-tpm-lookup,Incarceration Records,Jails & Courts Specific,Inmate TPM Lookup | State Board of Pardons and Paroles,"A Tentative Parole Month is NOT a final parole decision. A Tentative Parole Month or TPM represents when the Board will complete a final review of the offender’s case and, if appropriate, set a parole release date.",200,State Board of Pardons and Paroles,"[""Inmate TPM Lookup""]","[""Main navigation"", ""Search this site"", ""Breadcrumb"", ""Pardon/Parole Consideration and Guidelines"", ""How can we help?"", ""About Us"", ""Get in Touch""]","[""Popular searches"", ""Call Us"", ""Email Us"", ""Visit""]",[],[],[],"" -2938,https://cityprotect.com/agency/79823daf-96fd-4141-962e-83d5f046dc78,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2939,https://cityprotect.com/agency/a252667a-e0f8-4a64-9f27-665b3a2d6259,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2940,https://gaports.com/departments/protective-services/police-records-reports/,List of Data Sources,Info About Agencies,403 Forbidden,"",200,403 Forbidden,"[""403 Forbidden""]",[],[],[],[],[],"" -2941,https://www.eastpointcity.org/east-point-police/#records-identification,List of Data Sources,Info About Agencies,"","",500,"","","","","","","","" -2942,https://www.gptc.edu/compliance-notices/open-records-requests/,List of Data Sources,Info About Agencies,Open Records Requests – Georgia Piedmont Technical College,"",200,403 Forbidden,"[""Open Records Requests""]",[],"[""Compliance Notices"", ""Open Records Requests""]","[""Programs of Study"", ""Registration""]",[],[],Georgia Piedmont Tech Future Students Current Students Alumni & Supporters Technical Education Adult Education Continuing Education Economic Development Home About APPLY ONLINE DONATE Contact Directory Events News GPTC President Request Info Future Students Admissions Apply Online Course Catalog Dual Enrollment FAQs Locations Paying for College Programs of Study Transfer Agreements Why Georgia Piedmont Tech? Current Students Academic Calendar Advising Bookstore Campus Life Campus Services & Amenities Career Services Course Catalog Distance Education Dual Enrollment Financial Aid Graduation Orientation Registrar’s Office Security & Campus Police Student Dashboard Student FAQs & Resources Tech Support Transfer Agreements Alumni & Supporters Donate Alumni Association Distinguished Alumni Georgia Piedmont Tech Foundation Foundation Board of Trustees Transcript Request Ways to Give Georgia Piedmont Tech Future Students Current Students Alumni & Supporters Technical Education Adult Education Continuing Education Economic Development Home About APPLY ONLINE DONATE Contact Directory Events News GPTC President Request Info Georgia Piedmont Tech Future Students Admissions Apply Online Course Catalog Dual Enrollment FAQs Locations Paying for College Programs of Study Transfer Agreements Why Georgia Piedmont Tech? Future Students Current Students Academic Calendar Advising Bookstore Campus Life Campus Services & Amenities Career Services Course Catalog Distance Education Dual Enrollment Financial Aid Graduation Orientation Registrar’s Office Security & Campus Police Student Dashboard Student FAQs & Resources Tech Support Transfer Agreements Current Students Alumni & Supporters Donate Alumni Association Distinguished Alumni Georgia Piedmont Tech Foundation Foundation Board of Trustees Transcript Request Ways to Give Alumni & Supporters -2943,https://cityprotect.com/agency/carrolltonpd,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2944,https://cityprotect.com/agency/57eb32ec-c607-4908-b6a7-183a9623c634,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2945,https://data.austintexas.gov,List of Data Sources,Info About Agencies,Open Data | City of Austin Texas | Open Data | City of Austin Texas,"",200,Open Data | City of Austin Texas | Open Data | City of Austin Texas,[],"[""Menu"", ""Topics"", ""Data Catalog"", ""Open Government"", ""Resources""]",[],[],[],[],"Skip to main content Skip to footer links Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search City of Austin Open Data Portal Austin’s Open Data portal is a public data-sharing site for residents, community members and anyone interested in accessing and using the City’s data. Topics Datasets are tagged with terms and categories to help you learn about different topics. Explore them below. You can also view all data . Animal Care Community Services Neighborhood Permitting Health Environment Transportation Public Safety Data Catalog Datasets are presented in different types of formats to help you visualize and analyze data. Browse different data views below. Data Data Stories Charts Geospatial Open Government The City of Austin is committed to transparency through open data. Please visit our other open government sites below. Public Information Request Submit public information requests (PIRs) to any city department. Learn more Capital Projects This interactive tool gives you details about projects and programs funded by the Capital Budget. Learn more Strategic Dashboard The dashboard documents the City's strategic direction, which guides the City's goals and outlines imperatives to advance equitable outcomes. Learn more Open Budget This tool provides details on projects and programs funded by the Capital Budget. Learn more Resources Get started on how to use open data. Please visit the open data resources below located on the Tyler Technologies website. Quick-Start Video Guides Site Navigation & Data Access How-To Videos Developer Toolkit " -2946,,Arrest Records,Police & Public Interactions,,,,,,,,,,, -2947,https://stewartcountysheriff.org/sexoffender.htm,Sex Offender Registry,Agency-Published Resources,Stewart County Georgia Sheriff's Office sex offenders,"stewart counth ga sex offenders: Stewart County Sheriff and Sheriff's Office located in Lumpkin Georgia. Serving Lumpkin, Richland, Louvale, Red Hill and other rural areas in Stewart County.",200,Not Acceptable!,[],[],[],[],[],[],"" -2948,https://www.sanfranciscopolice.org/your-sfpd/published-reports/arrests-use-force-and-stop-data-admin-code-96a,List of Data Sources,Info About Agencies,"Arrests, Use of Force and Stop Data, Admin Code 96A | San Francisco Police Department","",200,Error retrieving title: dictionary changed size during iteration,"[""Arrests, Use of Force and Stop Data, Admin Code 96A""]","[""Popular Search Terms:"", ""Law Enforcement Reporting Requirements, Admin Code Sec 96A"", ""Admin Code 96A Reports"", ""San Francisco Police Department""]","[""Non-Emergency"", ""City Services & Questions"", ""Anonymous Tip Line"", ""Text a Tip"", ""Contact Your Police Station"", ""SFPD Headquarters"", ""SFPD First Quarter 2020 Reports in Compliance with Administrative Code 96A:"", ""SFPD Fourth Quarter 2019 Report in Compliance with Administrative Code 96A:"", ""SFPD Third Quarter 2019 Report in Compliance with Administrative Code 96A:"", ""SFPD Second Quarter 2019 Report in Compliance with Administrative Code 96A:"", ""SFPD First Quarter 2019 Report in Compliance with Administrative Code 96A:"", ""SFPD First Quarter 2018 Report in Compliance with Administrative Code 96A:"", ""SFPD Second Quarter 2018 Report in Compliance with Administrative Code 96A:"", ""SFPD Third Quarter 2018 Report in Compliance with Administrative Code 96A:"", ""SFPD Fourth Quarter 2018 Report in Compliance with Administrative Code 96A:"", ""SFPD First Quarter 2017 Report in Compliance with Administrative Code 96A:"", ""SFPD Second Quarter 2017 Report in Compliance with Administrative Code 96A:"", ""SFPD Third Quarter 2017 Report in Compliance with Administrative Code 96A:"", ""SFPD Fourth Quarter 2017 Report in Compliance with Administrative Code 96A:"", ""SFPD First Quarter 2016 Report in Compliance with Administrative Code 96A:"", ""SFPD Second Quarter 2016 Report in Compliance with Administrative Code 96A:"", ""SFPD Third Quarter 2016 Report in Compliance with Administrative Code 96A:"", ""SFPD Fourth Quarter 2016 Report in Compliance with Administrative Code 96A:""]",[],[],[],"" -2949,https://data.baltimorecity.gov/,List of Data Sources,Info About Agencies,Open Baltimore,Baltimore City's Open Data Hub,200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -2950,http://www.dcor.state.ga.us/Divisions/ExecutiveOperations/OPS/OpenRecords,Records Request Info,Agency-Published Resources,"","",-1,"","","","","","","","" -2951,http://www.madisoncountysheriffga.org/Open-Records-Request.html,Records Request Info,Agency-Published Resources,Open-Records-Request,"",200,Welcome to the Madison County Sheriff's Office,[],[],[],[],[],[],"Open Records Request Description: This is a - Pursuant to O.C.G.A.§50-18-70, et. Seq - Freedom Of Information Act compliance request form Instructions: Fill out all necessary information fields in the form. Click submit when finished and the info will be sent to the administrator. You will receive a call or an email reply to verify we have received your request and that it has been scheduled as requested. ​Madison County Sheriff's Office - 1436 Highway 98 West - P.O. BOX 65 - Danielsville, Georgia Administrator: Captain Brenan Baird      Phone: 706-795-6403      Email bbaird@madisonco.us Name ( First / Last) Address :  ( Street Address, City, State, Zip ) Phone : Your email address: Business Name or Agent : Details of Requested Records : Pursuant to O.C.G.A.§50-18-70, et. Seq, I am formally requesting to: Do copies need to be notarized? ( Yes / No ) Preferred manner of delivery?   ( Email / Pickup / Mail ) Any additional information: In lieu of my handwritten signature, by typing my name below, I hereby authorize Madison County Sheriff's Office to process this request. (Send the form) Website Designed at Homestead™ Make a Website and List Your Business Open Records Request Description: This is a - Pursuant to O.C.G.A.§50-18-70, et. Seq - Freedom Of Information Act compliance request form Instructions: Fill out all necessary information fields in the form. Click submit when finished and the info will be sent to the administrator. You will receive a call or an email reply to verify we have received your request and that it has been scheduled as requested. ​Madison County Sheriff's Office - 1436 Highway 98 West - P.O. BOX 65 - Danielsville, Georgia Administrator: Captain Brenan Baird      Phone: 706-795-6403      Email bbaird@madisonco.us Name ( First / Last) Address :  ( Street Address, City, State, Zip ) Phone : Your email address: Business Name or Agent : Details of Requested Records : Pursuant to O.C.G.A.§50-18-70, et. Seq, I am formally requesting to: Do copies need to be notarized? ( Yes / No ) Preferred manner of delivery?   ( Email / Pickup / Mail ) Any additional information: In lieu of my handwritten signature, by typing my name below, I hereby authorize Madison County Sheriff's Office to process this request. (Send the form) Website Designed at Homestead™ Make a Website and List Your Business Open Records Request Description: This is a - Pursuant to O.C.G.A.§50-18-70, et. Seq - Freedom Of Information Act compliance request form Instructions: Fill out all necessary information fields in the form. Click submit when finished and the info will be sent to the administrator. You will receive a call or an email reply to verify we have received your request and that it has been scheduled as requested. ​Madison County Sheriff's Office - 1436 Highway 98 West - P.O. BOX 65 - Danielsville, Georgia Administrator: Captain Brenan Baird      Phone: 706-795-6403      Email bbaird@madisonco.us " -2952,https://cityprotect.com/agency/3faebc0a-4169-45f6-b5dc-4fe1545720d1,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -2953,https://woodstockga.justfoia.com/publicportal/home/newrequest,List of Data Sources,Info About Agencies,JustFOIA Public Portal,"",200,403 Forbidden,[],[],[],[],[],[],"" -2954,https://sheriff.chathamcountyga.gov/Enforcement/SORT,Sex Offender Registry,Agency-Published Resources,Chatham County Sheriff's Office - SORT,"",200,Chatham County Sheriff's Office - Home,"[""Chatham County Sheriff's Office"", ""SORT""]",[],"[""ATTENTION REGISTERED SEX OFFENDERS"", ""Wanted Absconders""]",[],"[""Chatham Sheriff"", ""eServices"", ""PART OF CHATHAMCOUNTYGA.GOV""]",[],"" -2955,https://pittsburghpa.gov/police/police-reports,Annual & Monthly Reports,Info About Agencies,Police Reports | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""Police Reports"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""Annual Reports""]","[""DEPARTMENT MENU""]","[""Police Data"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Zones"", ""Resources"", ""News"", ""Police Links""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -2956,https://tableau.alleghenycounty.us/t/PublicSite/views/CJ_UCR_PGH_8-22-17_v3/Home_1?iframeSizedToWindow=true&%3Aembed=y&%3AshowAppBanner=false&%3Adisplay_count=no&%3AshowVizHome=no&%3Aorigin=viz_share_link,Crime Statistics,Agency-Published Resources,Workbook: Crime in the City of Pittsburgh,"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],[],[],[],[],[],"Unexpected Error An unexpected error occurred. If you continue to receive this error please contact your Tableau Server Administrator. Unexpected Error An unexpected error occurred. If you continue to receive this error please contact your Tableau Server Administrator. Unexpected Error An unexpected error occurred. If you continue to receive this error please contact your Tableau Server Administrator. {""revisionInfo"":null,""facebookAppID"":""242391562456920"",""allow_select"":true,""allow_filter"":true,""allow_sheetlink"":true,""allow_highlight"":true,""allow_tooltip"":true,""allow_view_underlying"":false,""allow_summary"":true,""allow_commenting"":true,""allow_commenting_mentions"":true,""allow_add_comment"":false,""allow_view_comments"":true,""allow_connected_experience"":false,""allow_custom_views"":true,""allow_custom_view_default"":false,""allow_custom_view_share"":false,""allow_custom_view_save"":false,""allow_authoring"":false,""allow_data_alert"":false,""allow_view_data_alerts"":false,""allow_metrics_button"":false,""allow_create_metric"":false,""allow_create_refresh_metrics"":false,""allow_explain_data"":true,""allow_delete_comment"":true,""allow_cataloging"":false,""allow_named_sharing"":true,""allow_personal_space_only"":false,""allow_save"":false,""allow_save_as"":false,""allow_save_data_source"":false,""allow_subscriptions"":false,""workbook_allow_subscriptions"":false,""allow_subscribe_others"":false,""allow_subscription_attachments"":true,""allow_add_new_datasource"":false,""allow_export_image"":true,""allow_export_data"":true,""workbook_owner_friendly_name"":""Bialik, Logan"",""is_guest"":true,""is_admin"":false,""is_request_access_enabled"":true,""is_revision_history_preview"":false,""current_user_email"":null,""current_user_id"":2708,""current_user_friendly_name"":""Guest"",""current_user_domain_name"":""local"",""current_user_name"":""guest"",""current_user_image_url"":null,""current_user_nlp_help_center_stage"":null,""current_custom_view_id"":null,""current_custom_view_name"":null,""current_custom_view_created_by_feature"":null,""disableUrlActionsPopups"":false,""vizql_root"":""/vizql/t/PublicSite/w/CJ_UCR_PGH_8-22-17_v3/v/Home_1"",""site_root"":""/t/PublicSite"",""site_url_name"":""PublicSite"",""site_name"":""Public Site"",""site_luid"":""fc879854-c416-46d0-80ee-4e4d96493a84"",""is_ask_data_disabled_for_site"":false,""is_data_monitoring_ui_enabled"":false,""composite_sizes"":{""tablet"":{""maxHeight"":950,""maxWidth"":1300,""minHeight"":950,""minWidth"":1300},""desktop"":{""maxHeight"":950,""maxWidth"":1300,""minHeight"":950,""minWidth"":1300},""phone"":{""maxHeight"":950,""maxWidth"":1300,""minHeight"":950,""minWidth"":1300},""phoneAutogen"":{""maxHeight"":950,""maxWidth"":1300,""minHeight"":950,""minWidth"":1300}},""view_sizes"":{""Data and Definitions"":{""tablet"":{""maxHeight"":950,""maxWidth"":1300,""minHeight"":950,""minWidth"":1300},""desktop"":{""maxHeight"":950,""maxWidth"":1300,""minHeight"":950,""minWidth"":1300},""phone"":{""maxHeight"":950,""maxWidth"":1300,""minHeight"":950,""minWidth"":1300},""phoneAutogen"":{""maxHeight"":950,""maxWidth"":1300,""minHeight"":950,""minWidth"":1300}},""Home "":{""tablet"":{""maxHeight"":900,""maxWidth"":1169,""minHeight"":900,""minWidth"":1169},""desktop"":{""maxHeight"":900,""maxWidth"":1169,""minHeight"":900,""minWidth"":1169},""phone"":{""maxHeight"":900,""maxWidth"":1169,""minHeight"":900,""minWidth"":1169},""phoneAutogen"":{""maxHeight"":900,""maxWidth"":1169,""minHeight"":900,""minWidth"":1169}}},""dsd_phone_max_size"":500,""dsd_tablet_max_size"":800,""visible_sheets"":[""Home "",""Data and Definitions""],""is_mobile"":false,""is_mobile_user_agent"":false,""is_mobile_app"":false,""is_on_prem_deep_linking_enabled"":false,""is_authoring"":false,""is_viewDataClient"":false,""is_metrics_authoring"":false,""is_metrics_view"":false,""is_metrics_enabled"":false,""is_web_zones_enabled"":true,""is_mark_animation_enabled"":true,""is_mark_animation_enabled_for_server"":true,""repository_urls"":[""CJ_UCR_PGH_8-22-17_v3/Home_1"",""CJ_UCR_PGH_8-22-17_v3/DataandDefinitions""],""origin_repository_url"":""CJ_UCR_PGH_8-22-17_v3/Home_1"",""workbook_repo_url"":""CJ_UCR_PGH_8-22-17_v3"",""external_workbook_url"":""https://tableau.alleghenycounty.us/#/site/PublicSite/workbooks/827/views"",""tabs_allowed"":false,""showTabsWorkbook"":true,""current_project_id"":100,""current_location"":null,""current_sheet_name"":"""",""current_sheet_type"":""dashboard"",""current_workbook_id"":827,""current_workbook_luid"":""718a3b1c-d923-43c7-848c-76e65900b81b"",""current_workbook_twbx_size"":17762546,""has_nlp_permitted_datasources"":false,""current_view_id"":""14900"",""current_view_luid"":""9d259d9c-0c73-441a-9c6a-e176dc2bb3a7"",""sheetId"":""Home%20"",""showParams"":""{\""checkpoint\"":false,\""refresh\"":false,\""refreshUnmodified\"":false,\""unknownParams\"":\""iframeSizedToWindow=true\""}"",""stickySessionKey"":""{\""capabilities\"":\""4500f0180010\"",\""dataserverPermissions\"":\""44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a\"",\""featureFlags\"":\""{}\"",\""isAuthoring\"":false,\""isOfflineMode\"":false,\""lastUpdatedAt\"":1710918124323,\""unknownParamsHash\"":\""1bf5ac93aa0a72a903471c2752ecec699c57d9eae92d942396c4e9962bd480ff\"",\""wgSession\"":\""WRJ15P_NTMaRpucgK-cxfA\"",\""workbookId\"":827}"",""filterTileSize"":200,""locale"":""en_US"",""user" -2957,https://pittsburghpa.maps.arcgis.com/apps/dashboards/4750c482e06c4c348e6cc0d54e6475af,Other,Other,ArcGIS Dashboards,ArcGIS Dashboards,200,Error retrieving title: 'NoneType' object has no attribute 'text',[],[],[],[],[],[],"" -2958,https://pittsburghpa.gov/city-info/press-releases,Media Bulletins,Agency-Published Resources,"City Press Releases - Mayor, Public Safety, Citiparks, Specail Events, DPW | pittsburghpa.gov","",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""City Press Releases"", ""Offices"", ""Press Releases"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""To view press release articles, please select an office.""]","[""DEPARTMENT MENU""]","[""City Information Center""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -2959,https://pittsburghpa.gov/publicsafety/blotterview.html,Media Bulletins,Agency-Published Resources,Public Safety Blotter,City of Pittsburgh Public Safety Media Blotter.,200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""BLOTTER VIEW"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""Public Safety Blotter Articles""]",[],[],[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -2961,https://www.alleghenycounty.us/police/contact/index.aspx,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -2962,https://www.ottumwacourier.com/news/record/,Arrest Records,Police & Public Interactions,Public records | ottumwacourier.com,An assortment of public records compiled for southern Iowa by the staff of the Ottumwa Courier.,200,ottumwacourier.com,"[""Public records""]",[],"[""Police Records"", ""For the record"", ""For the record"", ""For the record"", ""For the record"", ""For the record"", ""Marriages & Land Transfers"", ""Marriages and land transfers for March 21, 2024"", ""Marriages and land transfers for March 14, 2024"", ""Marriages and land transfers for March 7, 2024"", ""Marriages and land transfers for Feb. 29, 2024"", ""Marriages and land transfers for Feb. 22, 2024"", ""Other Public Records"", ""Keith termination letter"", ""Fye termination letter"", ""McPherson resignation"", ""Read the Council's lawsuit against Centerville's school board"", ""Honey Creek Resort condition report"", ""Ryan Hodges' Resignation Agreement"", ""Evidence decision in Willard Miller's case"", ""Albia roundabout presentation"", ""Appeals court decision in Courtney and Williams vs. City of Ottumwa"", ""Office of Civil Rights letter to Ottumwa Schools"", ""Office of Civil Rights resolution with Ottumwa Schools"", ""Mike Bogle's early retirement agreement with the City of Centerville"", ""Centerville Fire Rescue Review Report"", ""Records for termination of Centerville Police Officer Jacob Downs"", ""Appanoose County FY 2021 audit report"", ""Trending Recipes"", ""All records"", ""Marriages and land transfers for March 21, 2024"", ""Marriages and land transfers for March 14, 2024"", ""Marriages and land transfers for March 7, 2024"", ""Marriages and land transfers for Feb. 29, 2024"", ""Marriages and land transfers for Feb. 22, 2024"", ""Marriages and land transfers for Feb. 15, 2024"", ""Marriages and land transfers for Feb. 8, 2024"", ""Marriages and land transfers for Feb. 1, 2024"", ""Marriages and land transfers for Jan. 25, 2024"", ""Marriages and land transfers for Jan. 18, 2024"", ""Marriages and land transfers for Jan. 11, 2024"", ""Marriages and land transfers for Jan. 4, 2024"", ""Marriages and land transfers for Dec. 21, 2023"", ""Marriages and land transfers for Dec. 14, 2023"", ""Marriages and land transfers for Dec. 7, 2023"", ""Marriages and land transfers for Nov. 30, 2023"", ""Marriages and land transfers for Nov. 23, 2023"", ""Marriages and land transfers for Nov. 16, 2023"", ""Marriages and land transfers for Nov. 9, 2023"", ""Marriages and land transfers for Nov. 2, 2023"", ""Marriages and land transfers for Oct. 26, 2023"", ""Marriages and land transfers for Oct. 19, 2023"", ""Marriages and land transfers for Oct. 12, 2023"", ""Marriages and land transfers for Oct. 5, 2023"", ""Marriages and land transfers for Sept. 28, 2023"", ""Marriages and land transfers for Sept. 21, 2023"", ""Marriages and land transfers for Sept. 14, 2023"", ""Marriages and land transfers for Sept. 7, 2023"", ""Marriages and land transfers for Aug. 31, 2023"", ""Marriages and land transfers for Aug. 24, 2023"", ""Marriages and land transfers for Aug. 17, 2023"", ""Marriages and land transfers for Aug. 10, 2023"", ""Marriages and land transfers for Aug. 3, 2023"", ""Marriages and land transfers for July 27, 2023"", ""Marriages and land transfers for July 20, 2023"", ""Marriages and land transfers for July 13, 2023"", ""Marriages and land transfers for July 6, 2023"", ""Marriages and land transfers for June 29, 2023"", ""Marriages and land transfers for June 22, 2023"", ""Marriages and land transfers for June 15, 2023"", ""Marriages and land transfers for June 8, 2023"", ""Marriages and land transfers for June 1, 2023"", ""Marriages and land transfers for May 25, 2023"", ""Marriages and land transfers for May 18, 2023"", ""Marriages and land transfers for May 11, 2023"", ""For the record"", ""For the record"", ""Marriages and land transfers for May 4, 2023"", ""For the record"", ""For the record"", ""Submit news tip"", ""Write a letter"", ""Obituaries"", ""Most Popular"", ""IHCC MBB vs North Dakota State College of Science"", ""Indian Hills MBB vs Southeastern"", ""NJCAA wrestling nationals - Day 2"", ""NJCAA wrestling nationals - Day 1"", ""EBF girls basketball at state"", ""Indian Hills MBB vs Southeastern"", ""Videos"", ""Ottumwa City Council - March 19 2024 - Regular Meeting"", ""Ottumwa Schools - Board Meeting - 3/18/2024"", ""Featured Local Savings""]","[""Ottumwa, IA (52501)"", ""NEWTON, Avery"", ""Reinier, Larry"", ""Van Genderen, Larry"", ""KEEP, Dorothy"", ""Zellers, Gary"", ""(Brockway) Patrick, Patrica"", ""MUNDT, Noel"", ""Articles"", ""Images"", ""Videos"", ""Photo Galleries & Reprints"", ""Board of Supervisors"", ""Ottumwa City Council - March 05 - Regular Meeting"", ""Board of Supervisors"", ""Contact Information"", ""Services"", ""Sections"", ""Browser Compatibility""]","[""Today"", ""Tonight""]",[],"" -2963,https://www.alleghenycounty.us/police/news/press-releases.aspx,Media Bulletins,Agency-Published Resources,"","",404,"","","","","","","","" -2964,https://arcata.crimegraphics.com/2013/default.aspx,Crime Maps & Reports,Agency-Published Resources,CrimeGraphics.com,"",200," - CrimeGraphics.com -",[],[],[],[],[],[],Arcata Police Department JavaScript is disabled. For customize this text use element. Arcata Police Department JavaScript is disabled. For customize this text use element. Arcata Police Department Arcata Police Department JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. JavaScript is disabled. For customize this text use element. -2965,https://louisville-police.org/Directory.aspx,Contact Info & Agency Meta,Info About Agencies,"Staff Directory • Louisville Metro PD, KY • CivicEngage","",200,"Louisville Metro PD, KY | Official Website","[""Staff Directory""]",[],"[""Live Edit"", ""Contact Us"", ""FAQs"", ""Popular Links"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2966,https://louisville-police.org/sitemap,List of Data Sources,Info About Agencies,"Site Map • Louisville Metro PD, KY • CivicEngage","",200,"Louisville Metro PD, KY | Official Website",[],[],"[""Home"", ""Our Department"", ""Services"", ""Education & Events"", ""LMPD Transparency"", ""How Do I..."", ""Contact Us"", ""FAQs"", ""Popular Links"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -2967,https://kcoj.kycourts.net/dockets/,Court Cases,Jails & Courts Specific,KCOJ Docket,"",200,403 - Forbidden: Access is denied.,[],[],[],[],[],[],"Docket Information Search Options County Select a county... ADAIR ALLEN ANDERSON BALLARD BARREN BATH BELL BOONE BOURBON BOYD BOYLE BRACKEN BREATHITT BRECKINRIDGE BULLITT BUTLER CALDWELL CALLOWAY CAMPBELL CARLISLE CARROLL CARTER CASEY CHRISTIAN CLARK CLAY CLINTON CRITTENDEN CUMBERLAND DAVIESS EDMONSON ELLIOTT ESTILL FAYETTE FLEMING FLOYD FRANKLIN FULTON GALLATIN GARRARD GRANT GRAVES GRAYSON GREEN GREENUP HANCOCK HARDIN HARLAN HARRISON HART HENDERSON HENRY HICKMAN HOPKINS JACKSON JEFFERSON JEFFERSON FAM CRT/CIV DISTRICT JESSAMINE JOHNSON KENTON KNOTT KNOX LARUE LAUREL LAWRENCE LEE LESLIE LETCHER LEWIS LINCOLN LIVINGSTON LOGAN LYON MCCRACKEN MCCREARY MCLEAN MADISON MAGOFFIN MARION MARSHALL MARTIN MASON MEADE MENIFEE MERCER METCALFE MONROE MONTGOMERY MORGAN MUHLENBERG NELSON NICHOLAS OHIO OLDHAM OWEN OWSLEY PENDLETON PERRY PIKE POWELL PULASKI ROBERTSON ROCKCASTLE ROWAN RUSSELL SCOTT SHELBY SIMPSON SPENCER TAYLOR TODD TRIGG TRIMBLE UNION WARREN WASHINGTON WAYNE WEBSTER WHITLEY WOLFE WOODFORD Division Circuit District Date : 03/25/2024 Prev Next March 2024 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Courtroom ALL Subdivision ALL Disclaimer Information from this system cannot be used for employment, licensing, eligibility for government programs. This responsibility resides solely with the Kentucky Court of Justice. Information received from the this site is subject to change, reprogramming, modifications of format and availability at the direction of the Administrative Office of the Courts (AOC), and may not at any particular moment reflect the true status of court cases due to ordinary limitations, delay, or error in the system's operation. The AOC disclaims any warranties as to the validity of the information obtained from this site. The recipient is solely responsible for verifying information received from this site through the cross-referencing of the official court record. The AOC shall not be liable to the recipient, or to any third party using the system or information obtained there from, for any damages whatsoever arising out of the use of this site. Search Results NONE County CIRCUIT Court Docket for 03/25/2024 Courtroom: ALL Subdivision: ALL NOT AN OFFICIAL DOCKET - SUBJECT TO CHANGE Last Updated : 3/25/2024 4:28:25 PM Generating Docket... Select a County to Generate Docket No Court Events Scheduled for Selected Date First Previous Next Last Page 1 of 1 Records 1 to 1 of 1 Room: 12:00 AM Date outside of allowed range () First Previous Next Last Page 1 of 1 Records 1 to 1 of 1 Kentucky Court of Justice | version: 1.0.20233.6 | Terms of Use | Plugins Docket Information Docket Information " -2968,https://louisville-police.org/800/Transparency-Reports,List of Data Sources,Info About Agencies,"Transparency Reports | Louisville Metro PD, KY","Reports generated by the LMPD that include crime incidents, demographic data, complaint data, annual reports and other miscellaneous reports.",200,"Louisville Metro PD, KY | Official Website",[],"[""Crime Reports"", ""Violent Crime Information"", ""Professional Standards Unit Reports"", ""PIU Case Files"", ""PSU Case Files"", ""Vehicle Stops Reports"", ""Citizen Attitude Survey"", ""LMPD Info"", ""Grants""]","[""Contact Us"", ""FAQs"", ""Popular Links"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Our Department Services Education & Events LMPD Transparency How Do I... Search Home LMPD Transparency Transparency Reports Crime Reports Weekly CompStat Report (This data is compiled for the weekly CompStat review which concentrates on the last 28 days of crime year over year. If you wish to see a more complete crime dataset, please visit our crime data collection (updated monthly) on the Open Data Portal here or, for a more visual representation, visit communitycrimemap.com .) Aggravated Assault Hot Spot, Shooting Incidents and Homicide Maps Assaults on Officers Report Adult Arrest Report Hate Crime Report 2020 Crime in Kentucky Report (LMPD is page 117) Violent Crime Information Homicide Statistics Non-fatal Shootings Statistics - Weekly Update Professional Standards Unit Reports Overall Report Monthly Report 2024 Monthly Report 2023 Monthly Report 2022 Monthly Report 2021 Monthly Report 2020 Monthly Report 2019 Monthly Report 2018 Monthly Report 2017 Monthly Report 2016 PIU Case Files PIU Case #23-103 ONB Shooting Redacted PIU Case #19-84 Kroger and Shelby Gazaway PIU Case #17-101 Redacted PIU Case #17-007 Redacted PIU Report - Darnell Wicker PSU Case Files PSU Case #22-022 Drink Throwing Incidents Vehicle Stops Reports 2013 2014 2015/2016 2017 Citizen Attitude Survey 2013 2014 2015 2016 2017 LMPD Info Annual Report Employee Demographic Info Officer Involved Shooting Report Quarterly Personnel Action Report Strategic Plan Grants 2022 JAG Grant Citizens Commission on Police Accountability Clandestine Lab Enforcement Team Response Crime Mapping Crime Reports File a Police Report Get a Police Report Homicide Information 2024 2023 2022 2021 2020 2019 2018 2017 2016 2015 2014 2013 2012 2011 2010 2009 2008 2007 2006 2005 Missing Persons Sex Offender Information Breonna Taylor Investigation HH Dashboard Department of Justice Community Resources Information in Reference to DOJ Findings Report Relevant SOPs for DOJ Report LMPD Public Review of Policy ShotSpotter Gunfire Detection Become an Officer Crime Maps Transparency File a Police Report Submit a Tip Policy Feedback Facebook Twitter Instagram YouTube TikTok Nextdoor Contact Us LMPD 2911 Taylor Boulevard Louisville, KY 40208 LMPD Headquarters Hours of Operation: Monday - Friday, 8 a.m. - 5 p.m. FAQs How long is the selection process? How long is the academy? Is the academy a ""live in"" academy? Will I receive pay and benefits while in the academy? How long after graduation do I have to wait to be in a specialized unit such as SWAT Team, Hostage Negotiations, Bomb Squad or be eligible for a detective position? /FAQ.aspx Popular Links Louisville Metro Police Foundation Louisville Metro Government FBI - Louisville Field Office Jefferson County Sheriff's Office Jefferson County Sheriff's Office Home Page Kentucky Courts /QuickLinks.aspx Site Links Home Sitemap Accessibility Privacy Copyright Notices Contact Us /QuickLinks.aspx Government Websites by CivicPlus® " -2969,https://drive.google.com/file/d/1Na7Bsbd9BETB9ER-hyKOqiEhzWMNZk17/view,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -2970,https://drive.google.com/file/d/102zX-xpY84QLR6N2I5qmeNn6x_8uLOdy/view,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -2971,https://docs.google.com/spreadsheets/d/1k-SBpcA0Qc0znWFYKu4JtqNfnFFNPf7Rhl6mT_bPjvU/edit#gid=0,Contact Info & Agency Meta,Info About Agencies,"","",401,"","","","","","","","" -2972,https://cob.org/gov/dept/police/news-police/police-daily-activity,Calls for Service,Police & Public Interactions,Police Daily Activity - City of Bellingham,"",200,403 Forbidden,"[""Police Daily Activity""]","[""Contacts"", ""About Us"", ""Contact Us"", ""Join the Conversation""]",[],[],[],[],Select Language English Español 简体中文 Tiếng Việt Русский ਪੰਜਾਬੀ Select Language English Español 简体中文 Tiếng Việt Русский ਪੰਜਾਬੀ Menu Home Government Mayor City Budget Mayor’s Office News Top Issues Orders and Proclamations More… Council Top Issues Council Meetings Council Members More… Public Involvement Boards and Commissions Volunteering Voter Information City Social Media More… Court Court Information Parking Tickets Infractions Criminal Misdemeanors Local Resources More… Rules and Regulations City Charter Municipal Code Ordinances Resolutions Development and Design Standards Construction Codes About About City Government City Projects Departments City Attorney Finance Fire and Emergency Medical Services Hearing Examiner Human Resources Information Technology Library Museum Parks and Recreation Planning and Community Development Police Public Works Services Arts & Culture Awards and Competitions Mount Baker Theatre Public Art Whatcom Museum More… Business City Purchasing Starting a Business Incentives Taxes More… Community Planning Comprehensive Plan Historic Preservation Neighborhoods Transportation Waterfront District More… Education Library Schools BTV Bellingham Presentations and Tours More… Environment Bellingham Climate Action Lake Whatcom Fish and Wildlife Habitat Stormwater More… Housing Homelessness Fair Housing Funding Opportunities and Incentives Landlord and Tenant Resources More… Maps and GIS Apps Aerial Photos CityIQ Online Maps Data and Downloads Land Parcel Reports More… Permits Applications and Forms Online Permitting Inspections Rental Registration More… Recreation Aquatic Center Classes and Activities Facility Rentals Parks and Trails Parks Volunteer Program More… Safety Fire Police Emergency Management Emergency Medical Services More… Transportation Biking and Walking Buses Parking Street Maintenance More… Utilities Billing and Rates Solid Waste and Recycling Storm and Surface Water Wastewater and Sewer More… Visiting Home Government Mayor City Budget Mayor’s Office News Top Issues Orders and Proclamations More… Council Top Issues Council Meetings Council Members More… Public Involvement Boards and Commissions Volunteering Voter Information City Social Media More… Court Court Information Parking Tickets Infractions Criminal Misdemeanors Local Resources More… Rules and Regulations City Charter Municipal Code Ordinances Resolutions Development and Design Standards Construction Codes About About City Government City Projects Departments City Attorney Finance Fire and Emergency Medical Services Hearing Examiner Human Resources Information Technology Library Museum Parks and Recreation Planning and Community Development Police Public Works Services Arts & Culture Awards and Competitions Mount Baker Theatre Public Art Whatcom Museum More… Business City Purchasing Starting a Business Incentives Taxes More… Community Planning Comprehensive Plan Historic Preservation Neighborhoods Transportation Waterfront District More… Education Library Schools BTV Bellingham Presentations and Tours More… Environment Bellingham Climate Action Lake Whatcom Fish and Wildlife Habitat Stormwater More… Housing Homelessness Fair Housing Funding Opportunities and Incentives Landlord and Tenant Resources More… Maps and GIS Apps Aerial Photos CityIQ Online Maps Data and Downloads Land Parcel Reports More… Permits Applications and Forms Online Permitting Inspections Rental Registration More… Recreation Aquatic Center Classes and Activities Facility Rentals Parks and Trails Parks Volunteer Program More… Safety Fire Police Emergency Management Emergency Medical Services More… Transportation Biking and Walking Buses Parking Street Maintenance More… Utilities Billing and Rates Solid Waste and Recycling Storm and Surface Water Wastewater and Sewer More… Visiting -2973,https://cob.org/gov/dept/police/news-police/crime-stats,Crime Statistics,Agency-Published Resources,Crime Statistics - City of Bellingham,"",200,403 Forbidden,"[""Crime Statistics""]","[""Contacts"", ""About Us"", ""Contact Us"", ""Join the Conversation""]",[],[],[],[],Select Language English Español 简体中文 Tiếng Việt Русский ਪੰਜਾਬੀ Select Language English Español 简体中文 Tiếng Việt Русский ਪੰਜਾਬੀ Menu Home Government Mayor City Budget Mayor’s Office News Top Issues Orders and Proclamations More… Council Top Issues Council Meetings Council Members More… Public Involvement Boards and Commissions Volunteering Voter Information City Social Media More… Court Court Information Parking Tickets Infractions Criminal Misdemeanors Local Resources More… Rules and Regulations City Charter Municipal Code Ordinances Resolutions Development and Design Standards Construction Codes About About City Government City Projects Departments City Attorney Finance Fire and Emergency Medical Services Hearing Examiner Human Resources Information Technology Library Museum Parks and Recreation Planning and Community Development Police Public Works Services Arts & Culture Awards and Competitions Mount Baker Theatre Public Art Whatcom Museum More… Business City Purchasing Starting a Business Incentives Taxes More… Community Planning Comprehensive Plan Historic Preservation Neighborhoods Transportation Waterfront District More… Education Library Schools BTV Bellingham Presentations and Tours More… Environment Bellingham Climate Action Lake Whatcom Fish and Wildlife Habitat Stormwater More… Housing Homelessness Fair Housing Funding Opportunities and Incentives Landlord and Tenant Resources More… Maps and GIS Apps Aerial Photos CityIQ Online Maps Data and Downloads Land Parcel Reports More… Permits Applications and Forms Online Permitting Inspections Rental Registration More… Recreation Aquatic Center Classes and Activities Facility Rentals Parks and Trails Parks Volunteer Program More… Safety Fire Police Emergency Management Emergency Medical Services More… Transportation Biking and Walking Buses Parking Street Maintenance More… Utilities Billing and Rates Solid Waste and Recycling Storm and Surface Water Wastewater and Sewer More… Visiting Home Government Mayor City Budget Mayor’s Office News Top Issues Orders and Proclamations More… Council Top Issues Council Meetings Council Members More… Public Involvement Boards and Commissions Volunteering Voter Information City Social Media More… Court Court Information Parking Tickets Infractions Criminal Misdemeanors Local Resources More… Rules and Regulations City Charter Municipal Code Ordinances Resolutions Development and Design Standards Construction Codes About About City Government City Projects Departments City Attorney Finance Fire and Emergency Medical Services Hearing Examiner Human Resources Information Technology Library Museum Parks and Recreation Planning and Community Development Police Public Works Services Arts & Culture Awards and Competitions Mount Baker Theatre Public Art Whatcom Museum More… Business City Purchasing Starting a Business Incentives Taxes More… Community Planning Comprehensive Plan Historic Preservation Neighborhoods Transportation Waterfront District More… Education Library Schools BTV Bellingham Presentations and Tours More… Environment Bellingham Climate Action Lake Whatcom Fish and Wildlife Habitat Stormwater More… Housing Homelessness Fair Housing Funding Opportunities and Incentives Landlord and Tenant Resources More… Maps and GIS Apps Aerial Photos CityIQ Online Maps Data and Downloads Land Parcel Reports More… Permits Applications and Forms Online Permitting Inspections Rental Registration More… Recreation Aquatic Center Classes and Activities Facility Rentals Parks and Trails Parks Volunteer Program More… Safety Fire Police Emergency Management Emergency Medical Services More… Transportation Biking and Walking Buses Parking Street Maintenance More… Utilities Billing and Rates Solid Waste and Recycling Storm and Surface Water Wastewater and Sewer More… Visiting -2974,https://cob.org/gov/dept/police/news-police/use-of-force-statistics,Use of Force Reports,Police & Public Interactions,Use of Force Statistics - City of Bellingham,"",200,403 Forbidden,"[""Use of Force Statistics""]","[""Contacts"", ""About Us"", ""Contact Us"", ""Join the Conversation""]",[],[],[],[],Select Language English Español 简体中文 Tiếng Việt Русский ਪੰਜਾਬੀ Select Language English Español 简体中文 Tiếng Việt Русский ਪੰਜਾਬੀ Menu Home Government Mayor City Budget Mayor’s Office News Top Issues Orders and Proclamations More… Council Top Issues Council Meetings Council Members More… Public Involvement Boards and Commissions Volunteering Voter Information City Social Media More… Court Court Information Parking Tickets Infractions Criminal Misdemeanors Local Resources More… Rules and Regulations City Charter Municipal Code Ordinances Resolutions Development and Design Standards Construction Codes About About City Government City Projects Departments City Attorney Finance Fire and Emergency Medical Services Hearing Examiner Human Resources Information Technology Library Museum Parks and Recreation Planning and Community Development Police Public Works Services Arts & Culture Awards and Competitions Mount Baker Theatre Public Art Whatcom Museum More… Business City Purchasing Starting a Business Incentives Taxes More… Community Planning Comprehensive Plan Historic Preservation Neighborhoods Transportation Waterfront District More… Education Library Schools BTV Bellingham Presentations and Tours More… Environment Bellingham Climate Action Lake Whatcom Fish and Wildlife Habitat Stormwater More… Housing Homelessness Fair Housing Funding Opportunities and Incentives Landlord and Tenant Resources More… Maps and GIS Apps Aerial Photos CityIQ Online Maps Data and Downloads Land Parcel Reports More… Permits Applications and Forms Online Permitting Inspections Rental Registration More… Recreation Aquatic Center Classes and Activities Facility Rentals Parks and Trails Parks Volunteer Program More… Safety Fire Police Emergency Management Emergency Medical Services More… Transportation Biking and Walking Buses Parking Street Maintenance More… Utilities Billing and Rates Solid Waste and Recycling Storm and Surface Water Wastewater and Sewer More… Visiting Home Government Mayor City Budget Mayor’s Office News Top Issues Orders and Proclamations More… Council Top Issues Council Meetings Council Members More… Public Involvement Boards and Commissions Volunteering Voter Information City Social Media More… Court Court Information Parking Tickets Infractions Criminal Misdemeanors Local Resources More… Rules and Regulations City Charter Municipal Code Ordinances Resolutions Development and Design Standards Construction Codes About About City Government City Projects Departments City Attorney Finance Fire and Emergency Medical Services Hearing Examiner Human Resources Information Technology Library Museum Parks and Recreation Planning and Community Development Police Public Works Services Arts & Culture Awards and Competitions Mount Baker Theatre Public Art Whatcom Museum More… Business City Purchasing Starting a Business Incentives Taxes More… Community Planning Comprehensive Plan Historic Preservation Neighborhoods Transportation Waterfront District More… Education Library Schools BTV Bellingham Presentations and Tours More… Environment Bellingham Climate Action Lake Whatcom Fish and Wildlife Habitat Stormwater More… Housing Homelessness Fair Housing Funding Opportunities and Incentives Landlord and Tenant Resources More… Maps and GIS Apps Aerial Photos CityIQ Online Maps Data and Downloads Land Parcel Reports More… Permits Applications and Forms Online Permitting Inspections Rental Registration More… Recreation Aquatic Center Classes and Activities Facility Rentals Parks and Trails Parks Volunteer Program More… Safety Fire Police Emergency Management Emergency Medical Services More… Transportation Biking and Walking Buses Parking Street Maintenance More… Utilities Billing and Rates Solid Waste and Recycling Storm and Surface Water Wastewater and Sewer More… Visiting -2975,https://portal.arxcommunity.com/dashboards/community/mi-ci-westland-pd,Misc Police Activity,Police & Public Interactions,Westland Police Transparency Dashboard,"",200,Sign In,"[""Westland Police Transparency Dashboard""]",[],[],[],[],[],"" -2976,https://www.crimemapping.com/map/agency/405,Crime Statistics,Agency-Published Resources,CrimeMapping.com - Helping You Build a Safer Community,"",200,CrimeMapping.com - Helping You Build a Safer Community,"[""My Map Summary"", ""What"", ""Where"", ""When"", ""Display Options"", ""Location Selection"", ""Choose a Search Distance"", ""Timeframe Settings"", ""From:"", ""To:""]",[],[],[],[],[],"Preparing Map Content... Preparing Map Content... Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Esri, HERE, Garmin, NGA, USGS, NPS | Zoom to Receive Alerts Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Esri, HERE, Garmin, NGA, USGS, NPS | Zoom to Distance: Miles select Distance: Miles select Streets select Esri, HERE, Garmin, NGA, USGS, NPS | Zoom to Esri, HERE, Garmin, NGA, USGS, NPS | Zoom to Esri, HERE, Garmin, NGA, USGS, NPS | Zoom to Zoom to Zoom to Zoom to Zoom to Fetching Data. x Close Fetching Data. Fetching Data. Fetching Data. x Close Share This Map My Map Summary The sum of the What, Where, When you’ve chosen. What * Data not provided by agency within map extent Where Broward County Police Boundary Agency Filter: Agency Name Here When Previous 7 Days Friday, May 1 - Friday, May 8 Restore Defaults Display Options What type(s) of records would you like to see? Select All | Deselect All Arson Assault Burglary Disturbing the Peace Drugs / Alcohol Violations DUI Fraud Homicide Motor Vehicle Theft Robbery Sex Crimes Theft / Larceny Vandalism Vehicle Break-In / Theft Weapons Sex Offender Sexual Predator * Data not provided by agency within map extent Location Selection Enter an Address, Feature or Location. Choose a Search Distance 500 feet 1000 feet 1500 feet 1/4 mile 1/2 mile 1 mile 2 miles Apply Remove Location Filter Timeframe Settings From how far back would you like to see records? **Note** This will not apply to Sex Offender data. Yesterday Previous 3 Days Previous Week Previous 4 Weeks Custom Time Range From: select Monday, March 18, 2024 To: select Sunday, March 24, 2024 Apply " -2977,https://data.boston.gov/dataset/crime-incident-reports-august-2015-to-date-source-new-system,Calls for Service,Police & Public Interactions,Crime Incident Reports (August 2015 - To Date) (Source: New System) - Dataset - Analyze Boston,"",200,Welcome - Analyze Boston,"[""Crime Incident Reports (August 2015 - To Date) (Source: New System)"", ""Boston Police Department"", ""Crime Incident Reports (August 2015 - To Date) (Source: New System)""]","[""Organization"", ""Social"", ""License"", ""Data and Resources""]","[""Tags"", ""Additional Info""]",[],[],[],Home Boston.gov Log in Register Showcases News Datasets Organizations Topics Tips for Users About Contact Home Boston.gov Log in Register Showcases News Datasets Organizations Topics Tips for Users About Contact Log in Register -2978,https://beaconny.gov/index.php/beacon-police-department-daily-blotter/,Calls for Service,Police & Public Interactions,Beacon Police Department Daily Blotter — City of Beacon,"",200,403 Forbidden,"[""Beacon Police Department Daily Blotter""]",[],[],"[""CONTACT US"", ""STAY CONNECTED"", ""Latest News""]",[],[],­ Government Departments Forms & Permits Agendas & Minutes News Current News Press Room Pay Bills Employment Visiting Beacon Government Departments Forms & Permits Agendas & Minutes News Current News Press Room Pay Bills Employment Visiting Beacon -2979,https://www.dutchessny.gov/Departments/Sheriff/sheriff-news-releases.htm,Media Bulletins,Agency-Published Resources,Sheriff News Releases,View 2024 Dutchess County Sheriff News,200,Dutchess County Government,"[""Sheriff News Releases""]","[""News Archive"", """"]","[""Municipal Information"", ""Related Information"", ""Elementary & Secondary Education"", ""Higher Education"", ""Adult Education"", ""Other Educational Resources & Information"", ""Business"", ""Community"", ""Tourism"", ""Arts & Leisure"", ""Contact""]",[],[],[],Skip to main content Language & Accessibility Options Select Language Accessibility Toggle navigation Menu Home Government All Departments Bidding & RFP Opportunities Calendar Charter & Code of Ethics County Clerk County Comptroller County Executive County Legislature County On-line Services County/Non-County Services DutchessDelivery Service Elected Officials Emergency Services Employment Opportunities Employee Resources Fees & Fee Schedules GIS in Dutchess County Help Center News/Press Releases Online Forms Public Outreach Shared Services Sheriff's Office Transparency in County Government Municipalities Municipal Information Municipal Assessors Municipal Historians Municipal Tax Collectors Municipal Contact & Court Info School Tax Collection Related Information Census Data Demographic Information Responsibilities of Municipal Boards Town Mandated Private Well Testing Education Elementary & Secondary Education Education Overview Private and Parochial Schools School Districts in Dutchess County Higher Education Colleges Adult Education Dutchess BOCES Adult Education Dutchess Community College Adult Education Marist College Adult Education Other Educational Resources & Information Distance Learning Dutchess BOCES New York State Education Department NYS Office of Curriculum and Instruction School Tax Collectors by District Business & Community Business Agriculture Bidding & RFP Opportunities Business Groups & Chambers of Commerce Business Resources Dutchess County EDC Economic Development Community All Hazards Information Community Service Agencies Emergency Services Environment/Land Preservation Food Pantry and Meal Resources Health Care & Hospitals Housing Libraries Making Your Move Easier Mid-Hudson Multiple Listing Service Senior Citizen Services Telephone/Cellular Companies Utility & Cable Companies Victims' Resources and Services Volunteer Opportunities in Dutchess County Youth Services Culture Tourism Dining and Lodging Dutchess County Fair Dutchess County Tourism Historic Sites & Museums Hudson River Heritage History of Dutchess County Arts & Leisure Parks & Trails County Parks (Non) County Parks & Gardens Culture & Performing Arts Farm Markets Genealogy Golf Courses Hiking Hudson Valley Renegades MJN Center Poet Laureate Tours and Trails Type a search term to search the site Go Skip to main content Language & Accessibility Options Select Language Accessibility Toggle navigation Menu Language & Accessibility Options Select Language Accessibility Language & Accessibility Options Select Language Accessibility -2980,https://www.dutchessny.gov/Departments/Sheriff/Sheriffs-Office-Civil-Division-Evictions.htm,Resources,Agency-Published Resources,Evictions,"",200,Dutchess County Government,"[""Evictions""]",[],"[""Municipal Information"", ""Related Information"", ""Elementary & Secondary Education"", ""Higher Education"", ""Adult Education"", ""Other Educational Resources & Information"", ""Business"", ""Community"", ""Tourism"", ""Arts & Leisure"", ""Contact"", ""Eviction Fees""]",[],[],[],Skip to main content Language & Accessibility Options Select Language Accessibility Toggle navigation Menu Home Government All Departments Bidding & RFP Opportunities Calendar Charter & Code of Ethics County Clerk County Comptroller County Executive County Legislature County On-line Services County/Non-County Services DutchessDelivery Service Elected Officials Emergency Services Employment Opportunities Employee Resources Fees & Fee Schedules GIS in Dutchess County Help Center News/Press Releases Online Forms Public Outreach Shared Services Sheriff's Office Transparency in County Government Municipalities Municipal Information Municipal Assessors Municipal Historians Municipal Tax Collectors Municipal Contact & Court Info School Tax Collection Related Information Census Data Demographic Information Responsibilities of Municipal Boards Town Mandated Private Well Testing Education Elementary & Secondary Education Education Overview Private and Parochial Schools School Districts in Dutchess County Higher Education Colleges Adult Education Dutchess BOCES Adult Education Dutchess Community College Adult Education Marist College Adult Education Other Educational Resources & Information Distance Learning Dutchess BOCES New York State Education Department NYS Office of Curriculum and Instruction School Tax Collectors by District Business & Community Business Agriculture Bidding & RFP Opportunities Business Groups & Chambers of Commerce Business Resources Dutchess County EDC Economic Development Community All Hazards Information Community Service Agencies Emergency Services Environment/Land Preservation Food Pantry and Meal Resources Health Care & Hospitals Housing Libraries Making Your Move Easier Mid-Hudson Multiple Listing Service Senior Citizen Services Telephone/Cellular Companies Utility & Cable Companies Victims' Resources and Services Volunteer Opportunities in Dutchess County Youth Services Culture Tourism Dining and Lodging Dutchess County Fair Dutchess County Tourism Historic Sites & Museums Hudson River Heritage History of Dutchess County Arts & Leisure Parks & Trails County Parks (Non) County Parks & Gardens Culture & Performing Arts Farm Markets Genealogy Golf Courses Hiking Hudson Valley Renegades MJN Center Poet Laureate Tours and Trails Type a search term to search the site Go Skip to main content Language & Accessibility Options Select Language Accessibility Toggle navigation Menu Language & Accessibility Options Select Language Accessibility Language & Accessibility Options Select Language Accessibility -2981,https://www.dutchessny.gov/Departments/Sheriff/docs/Dutchess-County-Sheriffs-Office-Use-of-Force-Policy.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -2982,https://villageofshorewood.org/984/Weekly-Calls-For-Service,Calls for Service,Police & Public Interactions,"Weekly Calls For Service | Shorewood, WI - Official Website",Weekly calls for service,200,Error retrieving title: dictionary changed size during iteration,"[""Weekly Calls For Service""]",[],"[""Contact"", ""Quick Links"", ""Helpful Links"", ""Loading""]",[],[],[],"Skip to Main Content Boards & Committees Departments Community I Want To... Search Payments Permits & Applications Parking Agendas & Minutes Notify Me Village Manager's Memo Home Departments Police Department Weekly Calls For Service Weekly Calls For Service February 19 - February 25, 2024 February 12- February 18, 2024 February 5 - February 11, 2024 January 29 - February 4, 2024 January 22 - January 28, 2024 January 15 - January 21, 2024 January 8 - January 14, 2024 January 1-January 7, 2024 December 25, 2023 - December 31, 2023 December 18, 2023 - December 24, 2023 December 11, 2023 - December 17, 2023 December 4, 2023 - December 10, 2023 November 27, 2023 - December 3, 2023 November 20 - November 26, 2023 November 13 - November 19, 2023 November 6 - November 12, 2023 October 30 - November 5, 2023 October 23-October 29, 2023 October 16 - October 22, 2023 October 9 - October 15, 2023 October 2 - October 8, 2023 September 25 - October 1, 2023 September 18 - September 24, 2023 About the Police Department Agency Grants Detective Bureau Directory Employment History of Police Chiefs History of the Shorewood Police Department Mission Statement Patrol Division Photo Gallery Police Memorial Crime Prevention Tips & Programs ATM Safety Bicycle Licenses (PDF) Bicycle Theft Prevention Business Robbery Prevention Citizens' Police Academy Crime & Crash Statistics Drug & Alcohol Abuse Home Burglary Prevention Alarm Systems & Home Safes Be a Good Neighbor Doors & Locks Home Security Checklist (PDF) Lighting Operation Identification Sliding-Glass Patio Doors & Windows Vacation Home Lookout Vacation Home Lookout Request Identity Theft Identity Theft Recovery Plan Medicine Collection Program Prevention From Vehicles Theft Preventative Measures Against Rape Reporting Suspicious Activity Robberies Wisconsin DOC Sex Offender Registry Ord 2061 Related to Restricting Residency of Sex Offenders (PDF) 1000 Foot Sex Offender Map Frequently Asked Questions Open Records Requests Request Police Department Services Complaint Procedure Police Department Documents Monthly Reports Special Needs Registration Weekly Calls For Service Police Department Events Employment Opportunities - For the Position of Police Officer Sex Offender Information Semi and Annual Reports Contact Village of Shorewood 3930 N Murray Avenue Shorewood, WI 53211 Phone: 414-847-2700 Quick Links Shorewood School District Shorewood Business Improvement District Shorewood Public Library Shorewood Foundation Shorewood Historical Society /QuickLinks.aspx Helpful Links Home Sign In Site Map Contact Us Accessibility Copyright Notices /QuickLinks.aspx Facebook Twitter YouTube Contact Us Government Websites by CivicPlus® " -2983,https://villageofshorewood.org/966/Police-Department-Monthly-Reports,Annual & Monthly Reports,Info About Agencies,"Monthly Reports | Shorewood, WI - Official Website","",200,"Shorewood, WI - Official Website | Official Website","[""Monthly Reports""]",[],"[""Contact"", ""Quick Links"", ""Helpful Links"", ""Loading""]",[],[],[],"Skip to Main Content Boards & Committees Departments Community I Want To... Search Payments Permits & Applications Parking Agendas & Minutes Notify Me Village Manager's Memo Home Departments Police Department Monthly Reports Monthly Reports January 2024 Monthly Report December 2023 Monthly Report November 2023 Monthly Report October 2023 Monthly Report September 2023 Monthly Report August 2023 Monthly Report July 2023 Monthly Report June 2023 Monthly Report May 2023 Monthly Report April 2023 Monthly Report March 2023 Monthly Report February 2023 Monthly Report About the Police Department Agency Grants Detective Bureau Directory Employment History of Police Chiefs History of the Shorewood Police Department Mission Statement Patrol Division Photo Gallery Police Memorial Crime Prevention Tips & Programs ATM Safety Bicycle Licenses (PDF) Bicycle Theft Prevention Business Robbery Prevention Citizens' Police Academy Crime & Crash Statistics Drug & Alcohol Abuse Home Burglary Prevention Alarm Systems & Home Safes Be a Good Neighbor Doors & Locks Home Security Checklist (PDF) Lighting Operation Identification Sliding-Glass Patio Doors & Windows Vacation Home Lookout Vacation Home Lookout Request Identity Theft Identity Theft Recovery Plan Medicine Collection Program Prevention From Vehicles Theft Preventative Measures Against Rape Reporting Suspicious Activity Robberies Wisconsin DOC Sex Offender Registry Ord 2061 Related to Restricting Residency of Sex Offenders (PDF) 1000 Foot Sex Offender Map Frequently Asked Questions Open Records Requests Request Police Department Services Complaint Procedure Police Department Documents Monthly Reports Special Needs Registration Weekly Calls For Service Police Department Events Employment Opportunities - For the Position of Police Officer Sex Offender Information Semi and Annual Reports Contact Village of Shorewood 3930 N Murray Avenue Shorewood, WI 53211 Phone: 414-847-2700 Quick Links Shorewood School District Shorewood Business Improvement District Shorewood Public Library Shorewood Foundation Shorewood Historical Society /QuickLinks.aspx Helpful Links Home Sign In Site Map Contact Us Accessibility Copyright Notices /QuickLinks.aspx Facebook Twitter YouTube Contact Us Government Websites by CivicPlus® " -2984,https://villageofshorewood.org/965/Police-Department-Documents,List of Data Sources,Info About Agencies,"Police Department Documents | Shorewood, WI - Official Website","",200,"Shorewood, WI - Official Website | Official Website","[""Police Department Documents""]",[],"[""Contact"", ""Quick Links"", ""Helpful Links"", ""Loading""]",[],[],[],"Skip to Main Content Boards & Committees Departments Community I Want To... Search Payments Permits & Applications Parking Agendas & Minutes Notify Me Village Manager's Memo Home Departments Police Department Police Department Documents Police Department Documents This page will contain documents provided by the Shorewood Police Department. To view the Village of Shorewood Organizational Chart, please click here. To view the 2023-2024 Agreement Between the Village of Shorewood and the Shorewood Police Association Local 307, please click here . To view the Shorewood Police Department Policy Manual, please click here . To view the Village of Shorewood Police Organizational Study, please click here . To view the Shorewood Police Department Weiss Organizational Action Plan, please click here . To view the Shorewood Police Department Weiss Organizational Study History, please click here . To view the Shorewood Police Department Weiss Organizational Study Summary, please click here . To view the Shorewood Police Department Traffic Stop Brochure, please click here. About the Police Department Agency Grants Detective Bureau Directory Employment History of Police Chiefs History of the Shorewood Police Department Mission Statement Patrol Division Photo Gallery Police Memorial Crime Prevention Tips & Programs ATM Safety Bicycle Licenses (PDF) Bicycle Theft Prevention Business Robbery Prevention Citizens' Police Academy Crime & Crash Statistics Drug & Alcohol Abuse Home Burglary Prevention Alarm Systems & Home Safes Be a Good Neighbor Doors & Locks Home Security Checklist (PDF) Lighting Operation Identification Sliding-Glass Patio Doors & Windows Vacation Home Lookout Vacation Home Lookout Request Identity Theft Identity Theft Recovery Plan Medicine Collection Program Prevention From Vehicles Theft Preventative Measures Against Rape Reporting Suspicious Activity Robberies Wisconsin DOC Sex Offender Registry Ord 2061 Related to Restricting Residency of Sex Offenders (PDF) 1000 Foot Sex Offender Map Frequently Asked Questions Open Records Requests Request Police Department Services Complaint Procedure Police Department Documents Monthly Reports Special Needs Registration Weekly Calls For Service Police Department Events Employment Opportunities - For the Position of Police Officer Sex Offender Information Semi and Annual Reports Contact Village of Shorewood 3930 N Murray Avenue Shorewood, WI 53211 Phone: 414-847-2700 Quick Links Shorewood School District Shorewood Business Improvement District Shorewood Public Library Shorewood Foundation Shorewood Historical Society /QuickLinks.aspx Helpful Links Home Sign In Site Map Contact Us Accessibility Copyright Notices /QuickLinks.aspx Facebook Twitter YouTube Contact Us Government Websites by CivicPlus® " -2985,https://www.vofishkill.us/sites/g/files/vyhlif3136/f/uploads/police_dept._-_use_of_force_6.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -2986,https://www.phillypolice.com/assets/accountability/PPD-Disciplinary-Code-July-2014.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -2987,https://apps.missoulacounty.us/dailypublicreport/,Calls for Service,Police & Public Interactions,Daily Public Report,"",200,403 - Forbidden: Access is denied.,[],[],[],[],[],[],"" -2988,https://www.arlingtontx.gov/city_hall/departments/police/about_us/contact_us,Contact Info & Agency Meta,Info About Agencies,Contact Us - City of Arlington,"",200,Just a moment...,"[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Contact Us""]",[],[],[],[],Skip to Content Skip to Content -2989,https://www.cabq.gov/police/contact,Contact Info & Agency Meta,Info About Agencies,Albuquerque Police Contact — City of Albuquerque,"",200,Homepage — City of Albuquerque,"[""Albuquerque Police Contact""]","[""Get Directions"", ""Contact Information"", ""Physical Address"", ""Mailing Address""]","[""CONTACT"", ""ACCESS"", ""CONNECT""]","[""VISIT US ON SOCIAL MEDIA"", ""NEWSLETTER SIGNUP"", ""External Link Disclaimer"", ""Translate Our Site"", ""Search Our Site""]",[],[],"" -2990,https://www.atlantaga.gov/government/mayor-s-office/executive-offices/office-of-innovation-delivery-and-performance/dataatlanta,List of Data Sources,Info About Agencies,"","",-1,"","","","","","","","" -2991,https://public.powerdms.com/ANCHOR/tree/documents/511669,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by Powered by Powered by Powered by -2992,https://www.cabq.gov/cpoa/findings-letters/special-cases-sent-to-internal-a/officer-involved-shootings,Officer Involved Shootings,Police & Public Interactions,Officer Involved Shootings — City of Albuquerque,Officer Involved Shootings (OIS),200,Homepage — City of Albuquerque,"[""Officer Involved Shootings""]",[],"[""CONTACT"", ""ACCESS"", ""CONNECT""]","[""VISIT US ON SOCIAL MEDIA"", ""NEWSLETTER SIGNUP"", ""External Link Disclaimer"", ""Translate Our Site"", ""Search Our Site""]",[],[],"" -2993,https://p1cdn4static.civiclive.com/UserFiles/Servers/Server_14481062/File/City%20Hall/Depts/HR/Personnel-Manual.pdf,Policies & Contracts,Info About Agencies,"","",-1,"","","","","","","","" -2994,https://www.cabq.gov/police/crime-statistics,Crime Statistics,Agency-Published Resources,Crime Statistics — City of Albuquerque,Information about Albuquerque crime statistics:,200,Homepage — City of Albuquerque,"[""Crime Statistics""]","[""Citywide Crime Statistics"", ""Crime Mapping""]","[""Monthly Crime Stats"", ""Crime Trends"", ""Homicides"", ""Officer-Involved Shootings"", ""Traffic Division"", ""CONTACT"", ""ACCESS"", ""CONNECT""]","[""VISIT US ON SOCIAL MEDIA"", ""NEWSLETTER SIGNUP"", ""External Link Disclaimer"", ""Translate Our Site"", ""Search Our Site""]",[],[],"" -2995,https://www.atlantapd.org/about-apd/contact-us ,Contact Info & Agency Meta,Info About Agencies,"","",-1,"","","","","","","","" -2996,https://data-arlingtontx.opendata.arcgis.com/,List of Data Sources,Info About Agencies,ArcGIS Hub,"Discover, analyze and download data from ArcGIS Hub. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",200,ArcGIS Hub,[],[],[],[],[],[],"" -2997,https://www.arlingtontx.gov/city_hall/departments/police/reporting/official_crime_reports,Crime Statistics,Agency-Published Resources,"","",404,"","","","","","","","" -2998,https://justicereform.atlantaga.gov/use-of-force  ,Use of Force Reports,Police & Public Interactions,"","",404,"","","","","","","","" -2999,https://www.crimemapping.com/map/agency/6,Crime Maps & Reports,Agency-Published Resources,CrimeMapping.com - Helping You Build a Safer Community,"",200,CrimeMapping.com - Helping You Build a Safer Community,"[""My Map Summary"", ""What"", ""Where"", ""When"", ""Display Options"", ""Location Selection"", ""Choose a Search Distance"", ""Timeframe Settings"", ""From:"", ""To:""]",[],[],[],[],[],"Preparing Map Content... Preparing Map Content... Receive Alerts Go 0 Records Date Range: Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Receive Alerts Receive Alerts Go 0 Records Date Range: Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Distance: Miles select Distance: Miles select Streets select Fetching Data. x Close Fetching Data. Fetching Data. Fetching Data. x Close Share This Map My Map Summary The sum of the What, Where, When you’ve chosen. What * Data not provided by agency within map extent Where Broward County Police Boundary Agency Filter: Agency Name Here When Previous 7 Days Friday, May 1 - Friday, May 8 Restore Defaults Display Options What type(s) of records would you like to see? Select All | Deselect All Arson Assault Burglary Disturbing the Peace Drugs / Alcohol Violations DUI Fraud Homicide Motor Vehicle Theft Robbery Sex Crimes Theft / Larceny Vandalism Vehicle Break-In / Theft Weapons Sex Offender Sexual Predator * Data not provided by agency within map extent Location Selection Enter an Address, Feature or Location. Choose a Search Distance 500 feet 1000 feet 1500 feet 1/4 mile 1/2 mile 1 mile 2 miles Apply Remove Location Filter Timeframe Settings From how far back would you like to see records? **Note** This will not apply to Sex Offender data. Yesterday Previous 3 Days Previous Week Previous 4 Weeks Custom Time Range From: To: Apply " -3000,https://data.muni.org/browse?category=Public+Safety,Crime Statistics,Agency-Published Resources,"Office of Information Technology (OIT) - - - opendata","",200," - - Office of Information Technology (OIT) - - - opendata - - -",[],"[""​​​​​Open Data Portal 2024 CAMA Residential Data - CSV""]","[""Municipality of Anchorage Official Web Site""]",[],[],[],"Residents Property Tax Information Animal Care & Control ANCWorks! Community Health (AHD) Library People Mover Chugiak and Eagle River More Business Anchorage Economic Development Corporation Purchase and Bidding Opportunities Online Zoning, Regs & Codes Public Awareness: Scofflaw (Business & Individuals) More Government Anchorage Assembly Community Councils Delinquent Crime/Civil Fines MOA Public Notices/RSS Municipal Code Online Job Opportunities Departments More Public Safety Police Fire Office of Emergency Management Anchorage Health Department Transportation AnchorRIDES Bus Tracker People Mover Share-A-Ride AMATS/Transportation Planning Valley Mover Travel Training More Job Opportunities ePay Departments ▼ All Departments Contact List Anchorage Community Development Authority Easy Park Animal Care & Control Assembly Elections Municipal Clerk Ombudsman Community Development Development Services Geographic Data and Information Center Library Parks and Recreation Planning Real Estate Department Eagle River/Chugiak Parks & Recreation Emergency Management Equal Rights Commission Finance Controller Property Appraisal Public Finance and Investments Treasury Fire Department Health Department Administration Human Services Public Health Human Resources Central Payroll Information Technology (IT) Internal Audit Legal Department Administrative Hearing Office Civil Law Municipal Prosecutor Maintenance and Operations Management & Budget Mayor's Office Boards and Commissions Merrill Field Municipal Manager Museum Office of Equal Opportunity Office of Equity & Justice Parks and Recreation Cemetery Police and Fire Medical Trust Police and Fire Retirement System Police Department Port of Alaska Project Management and Engineering Public Transportation AnchorRIDES People Mover RideShare Public Works Administration Purchasing Department Real Estate Department Risk Management Safety Department Solid Waste Services Traffic Transportation Inspection Water and Wastewater Utility Untitled 1 Muni.org > Departments > Office of Information Technology (OIT) > opendata Menu Information Technology MOA Remote Work Info Application Services Business Management Customer Service Cyber Security Infrastructure Business Solutions Group Records Management Reprographics Contact Us PageImage2 PageContent2 ​​​​​Open Data Portal 2024 CAMA Residential Data - CSV 2024 CAMA Commercial Data - CSV 2024 CAMA Combined Res. and Comm. Data - CSV​ 2024 Child Care Inspection Data - CSV 2024​ Restaurant Health Inspection Data - CSV ​​ PageContent3 ​​ PageContent4 PageContent5 PageContent6 PageContent7 PageContent8 PageContent9 PageContent10 PageContent11 Municipality of Anchorage Official Web Site City Hall is located at: 632 West 6th Avenue Anchorage, Alaska 99501 Contact Us Employee Search ADA Compliance Privacy Statement & Disclaimer For Employees Open Data Portal Record Request " -3001,https://www.atlantapd.org/home/showpublisheddocument/4026/637582398211730000,Complaints & Misconduct,Info About Officers,"","",-1,"","","","","","","","" -3002,https://arlingtonpd.org/webapps/policeincidents/,Calls for Service,Police & Public Interactions,Arlington Police Department - Police Incidents,"",200,Error retrieving title: dictionary changed size during iteration,[],"[""Current Police Activity""]",[],"[""Count By Priority"", ""Count By Police District""]",[],[],Home (current) City Hall Residents Business Visitors News E-Services I Want To -3003,https://public.powerdms.com/ANCHOR/tree,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by -3004,http://opendata.atlantapd.org/,Crime Maps & Reports,Agency-Published Resources,Atlanta Police Open Data,This website provides crime data to the public.,200,Atlanta Police Open Data,[],[],[],[],[],[],"" -3005,https://www.cabq.gov/police/standard-operating-procedures/standard-operating-procedures-manual,Policies & Contracts,Info About Agencies,City of Albuquerque,"Official website for the City of Albuquerque, N.M.",200,Homepage — City of Albuquerque,[],[],"[""CONTACT"", ""ACCESS"", ""CONNECT""]","[""VISIT US ON SOCIAL MEDIA"", ""NEWSLETTER SIGNUP"", ""External Link Disclaimer"", ""Translate Our Site"", ""Search Our Site""]",[],[],"" -3006,https://www.arlingtontx.gov/city_hall/departments/police/reporting/use_of_force_report,Use of Force Reports,Police & Public Interactions,"","",404,"","","","","","","","" -3007,https://opendata.cabq.gov/,List of Data Sources,Info About Agencies,"","",404,"","","","","","","","" -3008,https://www.cabq.gov/police/public-reports/annual-reports/calls-for-service,Calls for Service,Police & Public Interactions,Calls for Service — City of Albuquerque,Annual report information about Albuquerque Police calls for service.,200,Homepage — City of Albuquerque,"[""Calls for Service""]","[""Albuquerque Relies on APD"", ""Types of Calls""]","[""Chart: APD Emergency Communications Center - Telephone Calls Answered"", ""Table: APD Emergency Communications Center - Telephone Calls Answered Jan-June"", ""Table: APD Emergency Communications Center - Telephone Calls Answered July-Dec."", ""Calendar Year Averages & Totals"", ""Chart: Calls for Service"", ""Table: Calls for Service"", ""Calls for Service: Definitions"", ""CONTACT"", ""ACCESS"", ""CONNECT""]","[""VISIT US ON SOCIAL MEDIA"", ""NEWSLETTER SIGNUP"", ""External Link Disclaimer"", ""Translate Our Site"", ""Search Our Site""]",[],[],"" -3009,https://www.cabq.gov/police/documents/6-1-training-division-opa-draft-for-website.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3010,https://gbi.georgia.gov/news/2021-11-07/2021-officer-involved-shootings,Officer Involved Shootings,Police & Public Interactions,2021 Officer Involved Shootings | Georgia Bureau of Investigation,Information regarding 2021 officer involved shooting investigations in Georgia,200,Georgia Bureau of Investigation,"[""2021 Officer Involved Shootings""]","[""Main navigation"", ""Search this site"", ""Breadcrumb"", ""News"", ""How can we help?"", ""About Us""]","[""Popular searches"", ""Call Us"", ""Online Tip Form"", ""Visit""]",[],[],[],"" -3011,https://www.atlantapd.org/i-want-to/crime-data-downloads,Crime Statistics,Agency-Published Resources,"","",-1,"","","","","","","","" -3012,https://data.muni.org/,List of Data Sources,Info About Agencies,"Office of Information Technology (OIT) - - - opendata","",200," - - Office of Information Technology (OIT) - - - opendata - - -",[],"[""​​​​​Open Data Portal 2024 CAMA Residential Data - CSV""]","[""Municipality of Anchorage Official Web Site""]",[],[],[],"Untitled 1 Muni.org > Departments > Office of Information Technology (OIT) > opendata Menu Information Technology MOA Remote Work Info Application Services Business Management Customer Service Cyber Security Infrastructure Business Solutions Group Records Management Reprographics Contact Us PageImage2 PageContent2 ​​​​​Open Data Portal 2024 CAMA Residential Data - CSV 2024 CAMA Commercial Data - CSV 2024 CAMA Combined Res. and Comm. Data - CSV​ 2024 Child Care Inspection Data - CSV 2024​ Restaurant Health Inspection Data - CSV ​​ PageContent3 ​​ PageContent4 PageContent5 PageContent6 PageContent7 PageContent8 PageContent9 PageContent10 PageContent11 Municipality of Anchorage Official Web Site City Hall is located at: 632 West 6th Avenue Anchorage, Alaska 99501 Contact Us Employee Search ADA Compliance Privacy Statement & Disclaimer For Employees Open Data Portal Record Request Untitled 1 Untitled 1 Muni.org > Departments > Office of Information Technology (OIT) > opendata Menu Information Technology MOA Remote Work Info Application Services Business Management Customer Service Cyber Security Infrastructure Business Solutions Group Records Management Reprographics Contact Us PageImage2 PageContent2 ​​​​​Open Data Portal 2024 CAMA Residential Data - CSV 2024 CAMA Commercial Data - CSV 2024 CAMA Combined Res. and Comm. Data - CSV​ 2024 Child Care Inspection Data - CSV 2024​ Restaurant Health Inspection Data - CSV ​​ PageContent3 ​​ PageContent4 PageContent5 PageContent6 PageContent7 PageContent8 PageContent9 PageContent10 PageContent11 Muni.org > Departments > Office of Information Technology (OIT) > opendata Menu Information Technology MOA Remote Work Info Application Services Business Management Customer Service Cyber Security Infrastructure Business Solutions Group Records Management Reprographics Contact Us PageImage2 PageContent2 ​​​​​Open Data Portal 2024 CAMA Residential Data - CSV 2024 CAMA Commercial Data - CSV 2024 CAMA Combined Res. and Comm. Data - CSV​ 2024 Child Care Inspection Data - CSV 2024​ Restaurant Health Inspection Data - CSV ​​ PageContent3 ​​ PageContent4 PageContent5 PageContent6 PageContent7 PageContent8 PageContent9 PageContent10 PageContent11 Muni.org > Departments > Office of Information Technology (OIT) > opendata Menu Information Technology MOA Remote Work Info Application Services Business Management Customer Service Cyber Security Infrastructure Business Solutions Group Records Management Reprographics Contact Us PageImage2 PageContent2 ​​​​​Open Data Portal 2024 CAMA Residential Data - CSV 2024 CAMA Commercial Data - CSV 2024 CAMA Combined Res. and Comm. Data - CSV​ 2024 Child Care Inspection Data - CSV 2024​ Restaurant Health Inspection Data - CSV ​​ PageContent3 ​​ PageContent4 PageContent5 PageContent6 PageContent7 PageContent8 PageContent9 PageContent10 PageContent11 Muni.org > Departments > Office of Information Technology (OIT) > opendata Muni.org > Departments > Office of Information Technology (OIT) > opendata Muni.org > Departments > Office of Information Technology (OIT) > opendata Menu Information Technology MOA Remote Work Info Application Services Business Management Customer Service Cyber Security Infrastructure Business Solutions Group Records Management Reprographics Contact Us Information Technology MOA Remote Work Info Application Services Business Management Customer Service Cyber Security Infrastructure Business Solutions Group Records Management Reprographics Contact Us PageImage2 PageImage2 PageImage2 PageImage2 PageImage2 " -3013,https://documents.cabq.gov/police/standard-operating-procedures/2-52-use-of-force.pdf,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3014,https://acrbgov.org/in-the-news/,Complaints & Misconduct,Info About Officers,ACRB Reports - ACRB,ACRB Quarterly Reports Second Quarter Update FY 23 ACRB Annual Reports 2022 ACRB Annual Report 2021 ACRB Annual Report 2020 ACRB Annual Report 2019 ACRB Annual Report 2018 ACRB Annual Report 2017 ACRB Annual Report 2016 ACRB Annual Report 2015 ACRB Annual Report 2014 ACRB Annual Report 2013 ACRB Annual Report 2012 ACRB Annual Report,200,Not Acceptable!,"[""ACRB Reports""]","[""Why File a Complaint for Officer Misconduct?"", ""ACRB Quarterly Reports"", ""ACRB Annual Reports"", ""ACRB Annual Surveys"", ""ACRB Q&A Reports"", ""FOLLOW US""]","[""Call Us:(404) 865-8622"", ""Monday - Friday: 8:30 a.m. - 5:00 p.m."", ""55 Trinity Avenue, S.W., City Hall Tower"", ""ACRB"", ""To find out what the City of Atlanta is doing in response to the Coronavirus (COVID-19), please Click Here"", ""Contact Us"", ""Our Services"", ""Stay Updated""]",[],[],[],"Why File a Complaint for Officer Misconduct? Click Here to Read Search Search Facebook Twitter Youtube Instagram Call Us:(404) 865-8622 acrb@atlantaga.gov Monday - Friday: 8:30 a.m. - 5:00 p.m. Sat & Sun CLOSED 55 Trinity Avenue, S.W., City Hall Tower Suite 1225 Atlanta, GA 30303 Member Login Home About Us About About Us ACRB Fact Sheet Arts & Essay Contest Complaints Map Board Members & Staff Board Members & Staff Member Login File A Complaint Complaints 2024 Complaints Reviewed 2023 Complaints Reviewed 2022 Complaints Reviewed 2021 Complaints Reviewed 2020 Complaints Reviewed 2019 Complaints Reviewed 2018 Complaints Reviewed 2017 Complaints Reviewed 2016 Complaints Reviewed 2015 Complaints Reviewed 2014 Complaints Reviewed 2013 Complaints Reviewed 2012 Complaints Reviewed Minutes Education Education ACRB Introduction ACRB Powers and Duties Complaint Investigation Process Developmental Disabilities from Pathfinders for Autism Filing a Complaint Get Home Safely: 10 Rules of Survival Investigations Know Your Rights Mediation Mediation Process Outreach YOUR 4th Amendment RIGHTS ACRB Reports ACRB Reports ACRB Related Reports Archives Editorial Newsletters Open Letter Blog Blog Newsletters – Current Content Writers Club for Bloggers News Links Videos Contact Menu Home About Us About About Us ACRB Fact Sheet Arts & Essay Contest Complaints Map Board Members & Staff Board Members & Staff Member Login File A Complaint Complaints 2024 Complaints Reviewed 2023 Complaints Reviewed 2022 Complaints Reviewed 2021 Complaints Reviewed 2020 Complaints Reviewed 2019 Complaints Reviewed 2018 Complaints Reviewed 2017 Complaints Reviewed 2016 Complaints Reviewed 2015 Complaints Reviewed 2014 Complaints Reviewed 2013 Complaints Reviewed 2012 Complaints Reviewed Minutes Education Education ACRB Introduction ACRB Powers and Duties Complaint Investigation Process Developmental Disabilities from Pathfinders for Autism Filing a Complaint Get Home Safely: 10 Rules of Survival Investigations Know Your Rights Mediation Mediation Process Outreach YOUR 4th Amendment RIGHTS ACRB Reports ACRB Reports ACRB Related Reports Archives Editorial Newsletters Open Letter Blog Blog Newsletters – Current Content Writers Club for Bloggers News Links Videos Contact Why File a Complaint for Officer Misconduct? Click Here to Read Search Search Facebook Twitter Youtube Instagram Why File a Complaint for Officer Misconduct? Click Here to Read Why File a Complaint for Officer Misconduct? Click Here to Read Why File a Complaint for Officer Misconduct? Click Here to Read Why File a Complaint for Officer Misconduct? Why File a Complaint for Officer Misconduct? Why File a Complaint for Officer Misconduct? Why File a Complaint for Officer Misconduct? Click Here to Read Click Here to Read Click Here to Read Click Here to Read Click Here to Read Search Search Facebook Twitter Youtube Instagram Search Search Facebook Twitter Youtube Instagram Search Search Facebook Twitter Youtube Instagram Search Search Search Search Search Search Search Search Search Search Facebook Twitter Youtube Instagram Facebook Twitter Youtube Instagram Facebook Twitter Youtube Instagram Facebook Twitter Youtube Instagram Facebook Twitter Youtube Instagram Call Us:(404) 865-8622 acrb@atlantaga.gov Monday - Friday: 8:30 a.m. - 5:00 p.m. Sat & Sun CLOSED 55 Trinity Avenue, S.W., City Hall Tower Suite 1225 Atlanta, GA 30303 Member Login " -3015,https://www.cabq.gov/police/internal-reports,Use of Force Reports,Police & Public Interactions,Public Reports — City of Albuquerque,"The Albuquerque Police Department publishes monthly reports to the City Council, Internal Affairs Report, Use of Force Annual reviews, and Mental Health Response Advisory Reports (MHRAC)",200,Homepage — City of Albuquerque,"[""Public Reports""]","[""Mental Health Response Advisory Reports (MHRAC)"", ""Use of Force Annual Review"", ""Monthly Use of Force Reports"", ""Report Archives"", ""About these Documents""]","[""Internal Affairs"", ""CONTACT"", ""ACCESS"", ""CONNECT""]","[""VISIT US ON SOCIAL MEDIA"", ""NEWSLETTER SIGNUP"", ""External Link Disclaimer"", ""Translate Our Site"", ""Search Our Site""]",[],[],"" -3016,https://www.cabq.gov/police/internal-affairs/internal-affairs-reports,Complaints & Misconduct,Info About Officers,Internal Affairs Reports — City of Albuquerque,The latest summaries of Internal Affairs data are available online.,200,Homepage — City of Albuquerque,"[""Internal Affairs Reports""]","[""Internal Affairs Reports""]","[""Quarterly Reports:"", ""2023"", ""2022"", ""2021"", ""2020"", ""2019"", ""Archived Reports:"", ""CONTACT"", ""ACCESS"", ""CONNECT""]","[""VISIT US ON SOCIAL MEDIA"", ""NEWSLETTER SIGNUP"", ""External Link Disclaimer"", ""Translate Our Site"", ""Search Our Site""]",[],[],"" -3017,https://www.anchoragepolice.com/locations-hours,Contact Info & Agency Meta,Info About Agencies,Locations & Hours — Anchorage Police Department,"",200,Anchorage Police Department,"[""Locations & Hours""]","[""apd Headquarters 716 W. 4th Ave Anchorage, AK 99501"", ""Department Directory"", ""Things you can do from home"", ""Elmore building 4501 Elmore Rd Anchorage, AK 99507""]","[""Contact FAQ APD Swag""]",[],[],[],"No results found. No results found. No results found. No results found. No results found. QUICK EXIT : Click this bar at any time to immediately close this website and check the weather QUICK EXIT : Click this bar at any time to immediately close this website and check the weather About Divisions Resources I Want To... APD News Join APD Back Command Staff Community Relations Unit Internal Affairs Policies Our Story Mission & Patch Fallen Officers FAQ Locations & Hours Phone List Back Dispatch Training Property & Evidence Impounds Special Ops CIT CNT CAP ISU SWAT K9 K9 Teams SRO Traffic IDEU HIDTA Crime Statistics Violent Crimes Property Crimes People Crimes ER Detectives Patrol Officers Patrol Beats Back Crime Prevention Through Environmental Design Submit Anonymous Crime Tip Report a Homeless Camp Victims for Justice Community Action Policing Crisis Intervention Team Alaska Office of Victims' Rights Back Submit - Police Report Submit - Anonymous Crime Tip Submit - Event Permits Submit - Complaint, Commendation, or Suggeston Submit - Traffic Suggestion and/or Complaints Pay/Resolve - Pay a Fine Pay/Resolve - Fix it Ticket Register - Security Alarm Report - Vehicle Crash Report - Homeless Camp Report - Mail Theft Report - Junk/Abandoned Vehicles Apply - Citizens Academy Request - Online Collision Report Request - Police Records Request - Public Appearance Request - Ride Along Request - Officer to Attend Community Council Meeting Frequently Asked Questions About Divisions Resources I Want To... APD News Join APD Back Command Staff Community Relations Unit Internal Affairs Policies Our Story Mission & Patch Fallen Officers FAQ Locations & Hours Phone List Back Dispatch Training Property & Evidence Impounds Special Ops CIT CNT CAP ISU SWAT K9 K9 Teams SRO Traffic IDEU HIDTA Crime Statistics Violent Crimes Property Crimes People Crimes ER Detectives Patrol Officers Patrol Beats Back Crime Prevention Through Environmental Design Submit Anonymous Crime Tip Report a Homeless Camp Victims for Justice Community Action Policing Crisis Intervention Team Alaska Office of Victims' Rights Back Submit - Police Report Submit - Anonymous Crime Tip Submit - Event Permits Submit - Complaint, Commendation, or Suggeston Submit - Traffic Suggestion and/or Complaints Pay/Resolve - Pay a Fine Pay/Resolve - Fix it Ticket Register - Security Alarm Report - Vehicle Crash Report - Homeless Camp Report - Mail Theft Report - Junk/Abandoned Vehicles Apply - Citizens Academy Request - Online Collision Report Request - Police Records Request - Public Appearance Request - Ride Along Request - Officer to Attend Community Council Meeting Frequently Asked Questions " -3018,https://data.baltimorecity.gov/datasets/911-calls-for-service-2020/explore?showTable=true,Calls for Service,Police & Public Interactions,Open Baltimore,Baltimore City's Open Data Hub,200,Open Baltimore,[],[],[],[],[],[],"" -3019,https://www.austintexas.gov/department/police,Contact Info & Agency Meta,Info About Agencies,Police | AustinTexas.gov,"One Austin, Safer Together",200,Home | AustinTexas.gov,"[""Police""]","[""Action Navigation"", ""GTranslate"", ""Main menu"", ""Frequently Viewed Departments"", ""City Clerk"", ""One Austin, Safer Together"", ""Making a Difference"", ""Upcoming Events"", ""Contact Info"", ""Footer Menu"", ""Second Footer Menu""]","[""Resident"", ""Business"", ""Government"", ""Departments"", ""Connect"", ""Austin Police Department"", ""Interim Chief of Police Robin Henderson"", ""Other Links"", ""Thank an Officer""]","[""Recent News""]",[],[],"austintexas.gov Action Navigation 3-1-1 GTranslate Translate English Arabic Bulgarian Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch Finnish French German Greek Hindi Italian Japanese Korean Norwegian Polish Portuguese Romanian Russian Spanish Swedish Catalan Filipino Hebrew Indonesian Latvian Lithuanian Serbian Slovak Slovenian Ukrainian Vietnamese Albanian Estonian Galician Hungarian Maltese Thai Turkish Persian Afrikaans Malay Swahili Irish Welsh Belarusian Icelandic Macedonian Yiddish Armenian Azerbaijani Basque Georgian Haitian Creole Urdu Bengali Bosnian Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba Zulu austintexas . gov Filter Toggle navigation Menu Close Search Main menu Home Resident Resident Open the Resident page Open the Resident page Household Getting a Home Utilities Trash and Recycling Gardening and Home Improvements Home Improvements Pets and Adoption Open the Household page Neighborhoods Education Libraries Families Neighborhood Issues Open the Neighborhoods page Health Animals Public Health Open the Health page Public Safety Crime Courts Fire Safety Emergency Preparedness Public Safety Employment Open the Public Safety page Arts and Leisure Arts, History and Culture Outdoor, Nature and Wildlife Events City Venues and Facilities Film and Music Open the Arts and Leisure page Environmental City Programs and Initiatives Conservation and Recycling Animals and Wildlife Parks Open the Environmental page Transportation Car/Bus Aviation Bicycle/Pedestrian Streets/Maps Open the Transportation page City of Austin About Austin Voting and Elections Get Involved City Jobs Records and Documents Open the City of Austin page Business Business Open the Business page Open the Business page Doing Business Utilities Doing Business with the City Taxes MBE/WBE Program City Code Food Establishments Permits Day Labor Records and Documents Open the Doing Business page Starting Out Starting a Business Relocating a Business Incentives and Grants Open the Starting Out page City Contracts Small Business Centers Small Business Development Incentives and Grants Open the Small Business Centers page Austin Center for Events Nonprofits Grants Open the Nonprofits page Green Resources Government Government Open the Government page Open the Government page City Council City Manager's Office Boards and Commissions City Council meeting information City Hall Jobs Public Records Departments Departments View full directory of departments Frequently Viewed Departments View full directory of departments Visit Airport Visitors Bureau Convention Center Utilities Austin Energy Austin Water Resource Recovery Education & Recreation Library Parks and Recreation Safety Police Other Animal Services Development Services Economic Development Connect Connect Open the Connect page Share ideas online about improving Austin Participate in the City Sign up for email updates City contact information " -3020,https://bpdgis.maps.arcgis.com/apps/dashboards/511ba81db3414df3bb474749b69bc258,Crime Maps & Reports,Agency-Published Resources,ArcGIS Dashboards,ArcGIS Dashboards,200,Error retrieving title: 'NoneType' object has no attribute 'text',[],[],[],[],[],[],"" -3021,https://www.auroragov.org/residents/public_safety/police/annual___public_reports,Stops,Police & Public Interactions,Annual & Public Reports - City of Aurora,"",200,Just a moment...,"[""Welcome to the City of Aurora Colorado""]","[""Annual & Public Reports""]","[""Contact Info"", ""Useful Links"", ""City of Aurora Colorado"", ""Accreditations""]",[],[],[],google-site-verification: googlee16c7726ecc34510.html -3022,https://data.austintexas.gov/,List of Data Sources,Info About Agencies,Open Data | City of Austin Texas | Open Data | City of Austin Texas,"",200,Open Data | City of Austin Texas | Open Data | City of Austin Texas,[],"[""Menu"", ""Topics"", ""Data Catalog"", ""Open Government"", ""Resources""]",[],[],[],[],"Skip to main content Skip to footer links Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search City of Austin Open Data Portal Austin’s Open Data portal is a public data-sharing site for residents, community members and anyone interested in accessing and using the City’s data. Topics Datasets are tagged with terms and categories to help you learn about different topics. Explore them below. You can also view all data . Animal Care Community Services Neighborhood Permitting Health Environment Transportation Public Safety Data Catalog Datasets are presented in different types of formats to help you visualize and analyze data. Browse different data views below. Data Data Stories Charts Geospatial Open Government The City of Austin is committed to transparency through open data. Please visit our other open government sites below. Public Information Request Submit public information requests (PIRs) to any city department. Learn more Capital Projects This interactive tool gives you details about projects and programs funded by the Capital Budget. Learn more Strategic Dashboard The dashboard documents the City's strategic direction, which guides the City's goals and outlines imperatives to advance equitable outcomes. Learn more Open Budget This tool provides details on projects and programs funded by the Capital Budget. Learn more Resources Get started on how to use open data. Please visit the open data resources below located on the Tyler Technologies website. Quick-Start Video Guides Site Navigation & Data Access How-To Videos Developer Toolkit " -3023,https://app.powerbigov.us/view?r=eyJrIjoiYmJjZmUwMTEtODY2NS00MGEyLWI0YTctYTVlYzkzYWNlODc3IiwidCI6Ijk0NGZhOWJhLTg0NTQtNDEzZC1iOWU2LWJmNDBhZjFkNmE5YiJ9&pageName=ReportSection2544927b6a86287348d3,Complaints & Misconduct,Info About Officers,Microsoft Power BI,"",200,Power BI,[],[],[],[],[],[],"" -3025,https://www.auroragov.org/residents/public_safety/police/directives_manual,Policies & Contracts,Info About Agencies,Directives Manual - City of Aurora,"",200,Just a moment...,"[""Welcome to the City of Aurora Colorado""]","[""Directives Manual""]","[""Contact Info"", ""Useful Links"", ""City of Aurora Colorado"", ""Accreditations""]",[],[],[],google-site-verification: googlee16c7726ecc34510.html -3026,https://www.atlantapd.org/about-apd/standard-operating-procedures  ,Policies & Contracts,Info About Agencies,"","",-1,"","","","","","","","" -3027,https://www.auroragov.org/cms/One.aspx?portalId=16242704&pageId=16573671,Crime Maps & Reports,Agency-Published Resources,Crime Data - City of Aurora,"",200,Just a moment...,"[""Welcome to the City of Aurora Colorado""]","[""Crime Data""]","[""Contact Info"", ""Useful Links"", ""City of Aurora Colorado"", ""Accreditations""]",[],[],[],google-site-verification: googlee16c7726ecc34510.html -3028,https://p1cdn4static.civiclive.com/UserFiles/Servers/Server_1881137/File/Residents/Public%20Safety/Police/Join%20the%20APD/2020%20NEW%20Police%20fitness%20Guide.pdf,Policies & Contracts,Info About Agencies,"","",-1,"","","","","","","","" -3029,https://p1cdn4static.civiclive.com/UserFiles/Servers/Server_1881137/File/Residents/Public%20Safety/Police/APD%20News/SOP%20FIU%2002.00.pdf,Policies & Contracts,Info About Agencies,"","",-1,"","","","","","","","" -3030,https://www.austintexas.gov/page/annual-crime-traffic-reports,Crime Statistics,Agency-Published Resources,Annual Crime & Traffic Reports | AustinTexas.gov,Reports Annual Crime and Traffic Report 2021 (PDF) Annual Crime and Traffic Report 2020 (PDF) Annual Crime and Traffic Report 2019 (PDF),200,Home | AustinTexas.gov,"[""Annual Crime & Traffic Reports""]","[""Action Navigation"", ""GTranslate"", ""Main menu"", ""Frequently Viewed Departments"", ""Footer Menu"", ""Second Footer Menu""]","[""Resident"", ""Business"", ""Government"", ""Departments"", ""Connect"", ""Reports""]",[],[],[],"austintexas.gov Action Navigation 3-1-1 GTranslate Translate English Arabic Bulgarian Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch Finnish French German Greek Hindi Italian Japanese Korean Norwegian Polish Portuguese Romanian Russian Spanish Swedish Catalan Filipino Hebrew Indonesian Latvian Lithuanian Serbian Slovak Slovenian Ukrainian Vietnamese Albanian Estonian Galician Hungarian Maltese Thai Turkish Persian Afrikaans Malay Swahili Irish Welsh Belarusian Icelandic Macedonian Yiddish Armenian Azerbaijani Basque Georgian Haitian Creole Urdu Bengali Bosnian Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba Zulu austintexas . gov Filter Toggle navigation Menu Close Search Main menu Home Resident Resident Open the Resident page Open the Resident page Household Getting a Home Utilities Trash and Recycling Gardening and Home Improvements Home Improvements Pets and Adoption Open the Household page Neighborhoods Education Libraries Families Neighborhood Issues Open the Neighborhoods page Health Animals Public Health Open the Health page Public Safety Crime Courts Fire Safety Emergency Preparedness Public Safety Employment Open the Public Safety page Arts and Leisure Arts, History and Culture Outdoor, Nature and Wildlife Events City Venues and Facilities Film and Music Open the Arts and Leisure page Environmental City Programs and Initiatives Conservation and Recycling Animals and Wildlife Parks Open the Environmental page Transportation Car/Bus Aviation Bicycle/Pedestrian Streets/Maps Open the Transportation page City of Austin About Austin Voting and Elections Get Involved City Jobs Records and Documents Open the City of Austin page Business Business Open the Business page Open the Business page Doing Business Utilities Doing Business with the City Taxes MBE/WBE Program City Code Food Establishments Permits Day Labor Records and Documents Open the Doing Business page Starting Out Starting a Business Relocating a Business Incentives and Grants Open the Starting Out page City Contracts Small Business Centers Small Business Development Incentives and Grants Open the Small Business Centers page Austin Center for Events Nonprofits Grants Open the Nonprofits page Green Resources Government Government Open the Government page Open the Government page City Council City Manager's Office Boards and Commissions City Council meeting information City Hall Jobs Public Records Departments Departments View full directory of departments Frequently Viewed Departments View full directory of departments Visit Airport Visitors Bureau Convention Center Utilities Austin Energy Austin Water Resource Recovery Education & Recreation Library Parks and Recreation Safety Police Other Animal Services Development Services Economic Development Connect Connect Open the Connect page Share ideas online about improving Austin Participate in the City Sign up for email updates City contact information " -3031,https://data.baltimorecity.gov/datasets/part1-crime-data/explore?showTable=true,Crime Statistics,Agency-Published Resources,Open Baltimore,Baltimore City's Open Data Hub,200,Open Baltimore,[],[],[],[],[],[],"" -3032,https://www.bakersfieldcity.us/483/Statistics-Data,Use of Force Reports,Police & Public Interactions,"Statistics & Data | Bakersfield, CA - Official Website",View the annual Internal Affairs Annual Report.,200,"Bakersfield, CA - Official Website | Official Website","[""Statistics & Data""]",[],[],[],[],[],"Skip to Main Content Our Government Departments Doing Business Our Community How Do I... Feature Links Departments Police Statistics & Data Statistics & Data About Bakersfield Police Department (BPD) Animal Control Clinics Bakersfield Police Department Facebook Page Bakersfield Substations Communications Center Forms & Documents Headquarters Policy Manual (PDF) Property Room Your Neighborhood Representatives Careers Police Dispatcher Peace Officers Becoming a Peace Officer FAQs Recruitment Standards & Training Reserves Unit Citizen Complaint Procedure Commend a BPD Employee or Community Member Crime Gangs Graffiti Helpful Links Arrest Records Mail Theft Mail Theft Prevention Mail Theft Reporting U.S. Postal Inspectors FAQs Narcotics Clue Report Crime / Non-Emergency Identity Theft, Fraud & Financial Crimes Residential / Commercial Burglar Alarms Unsolved Homicides 1970 to 1979 Unsolved Homicides 1980 to 1989 Unsolved Homicides 1990 to 1999 Unsolved Homicides 2000 to 2009 Unsolved Homicides 2010 to Current Unsolved Homicides Warrants Wanted Warrant Suspects Get Involved A Life Interrupted Program The Families Presentation Schedule The Presenters Resources Community Relations Programs Adults Business Programs Car Seat Safety Children & Adolescents Community e-Tip Senior Citizens Homeland Security Neighborhood Watch Nextdoor Park Watch Program Ride Along Program Community Police Academy Volunteer Opportunities Bakersfield Police Department Cadets Citizen Volunteer Reserves K-9 Unit Facts Trials Registration Partners Officer Ashby & K-9 Jax Officer Ashby & K-9 Zudo Officer Beattie & K-9 Zeke Officer Berumen & K-9 Rocco Officer Galdamez & K-9 Holly Officer Hensley & K-9 Hank Officer Jauch & K-9 Tito Officer Mueller & K-9 Jango Officer Schleicher & K-9 Kane Officer Vaughn & K-9 RJ Training Media Inquiries Pay Citations Policies and Procedures Records Vehicle Releases Report Illegal Fireworks Statistics & Data Traffic Accident Reports Car Seat Safety Impounded Vehicles Photo Enforced Intersections Speed Limits Transparency Policies & Procedures PEN § 13650 (SB 978) Police Department Reform Efforts Officer Involved Shooting (OIS) / Use of Force Critical Incident Community Debriefings Critical Incident Community Debriefing videos Coming Soon: PEN § 832.7 Disclosures (SB 1421) Bakersfield Police Monitor Community Advisory Panel ASK YOUR BPD! Government Websites by CivicPlus® " -3033,https://data.austintexas.gov/dataset/2019-Response-to-Resistance-Data/3bfz-mri4,Use of Force Reports,Police & Public Interactions,2019 Response to Resistance Data | Open Data | City of Austin Texas,"",200,Open Data | City of Austin Texas | Open Data | City of Austin Texas,"[""2022_10_3 2019 Data of S.D.3 - Number and percentage of use of force incidents in proportion to the number of arrests made"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2019 Response to Resistance Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2019 Response to Resistance Data"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3034,https://cob.maps.arcgis.com/apps/webappviewer/index.html?id=07988399180e443e9ab43aa75ad59d1b,Contact Info & Agency Meta,Info About Agencies,ArcGIS Web Application,"",200,Error retrieving title: 'NoneType' object has no attribute 'text',"[""""]",[],[],[],[],[],"" -3035,https://data-auroraco.opendata.arcgis.com/,List of Data Sources,Info About Agencies,"City of Aurora, Colorado","City of Aurora, Colorado",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -3036,https://www.atlantapd.org/home/showpublisheddocument/4560/637762918331970000,Policies & Contracts,Info About Agencies,"","",-1,"","","","","","","","" -3037,https://www.auroragov.org/cms/One.aspx?portalId=16242704&pageId=16394210,Contact Info & Agency Meta,Info About Agencies,Police - City of Aurora,"",200,Just a moment...,"[""Welcome to the City of Aurora Colorado""]","[""Police""]","[""Contact Us"", ""Contact Info"", ""Useful Links"", ""City of Aurora Colorado"", ""Accreditations""]",[],[],[],google-site-verification: googlee16c7726ecc34510.html -3039,https://data.baltimorecity.gov/datasets/arrests/explore?showTable=true,Arrest Records,Police & Public Interactions,Open Baltimore,Baltimore City's Open Data Hub,200,Open Baltimore,[],[],[],[],[],[],"" -3040,https://www.bakersfieldcity.us/890/Policies-and-Procedures,Policies & Contracts,Info About Agencies,"Policies and Procedures | Bakersfield, CA - Official Website","",200,"Bakersfield, CA - Official Website | Official Website","[""Policies and Procedures""]",[],[],[],[],[],"Skip to Main Content Our Government Departments Doing Business Our Community How Do I... Feature Links Departments Police Policies and Procedures Policies and Procedures About Bakersfield Police Department (BPD) Animal Control Clinics Bakersfield Police Department Facebook Page Bakersfield Substations Communications Center Forms & Documents Headquarters Policy Manual (PDF) Property Room Your Neighborhood Representatives Careers Police Dispatcher Peace Officers Becoming a Peace Officer FAQs Recruitment Standards & Training Reserves Unit Citizen Complaint Procedure Commend a BPD Employee or Community Member Crime Gangs Graffiti Helpful Links Arrest Records Mail Theft Mail Theft Prevention Mail Theft Reporting U.S. Postal Inspectors FAQs Narcotics Clue Report Crime / Non-Emergency Identity Theft, Fraud & Financial Crimes Residential / Commercial Burglar Alarms Unsolved Homicides 1970 to 1979 Unsolved Homicides 1980 to 1989 Unsolved Homicides 1990 to 1999 Unsolved Homicides 2000 to 2009 Unsolved Homicides 2010 to Current Unsolved Homicides Warrants Wanted Warrant Suspects Get Involved A Life Interrupted Program The Families Presentation Schedule The Presenters Resources Community Relations Programs Adults Business Programs Car Seat Safety Children & Adolescents Community e-Tip Senior Citizens Homeland Security Neighborhood Watch Nextdoor Park Watch Program Ride Along Program Community Police Academy Volunteer Opportunities Bakersfield Police Department Cadets Citizen Volunteer Reserves K-9 Unit Facts Trials Registration Partners Officer Ashby & K-9 Jax Officer Ashby & K-9 Zudo Officer Beattie & K-9 Zeke Officer Berumen & K-9 Rocco Officer Galdamez & K-9 Holly Officer Hensley & K-9 Hank Officer Jauch & K-9 Tito Officer Mueller & K-9 Jango Officer Schleicher & K-9 Kane Officer Vaughn & K-9 RJ Training Media Inquiries Pay Citations Policies and Procedures Records Vehicle Releases Report Illegal Fireworks Statistics & Data Traffic Accident Reports Car Seat Safety Impounded Vehicles Photo Enforced Intersections Speed Limits Transparency Policies & Procedures PEN § 13650 (SB 978) Police Department Reform Efforts Officer Involved Shooting (OIS) / Use of Force Critical Incident Community Debriefings Critical Incident Community Debriefing videos Coming Soon: PEN § 832.7 Disclosures (SB 1421) Bakersfield Police Monitor Community Advisory Panel ASK YOUR BPD! Government Websites by CivicPlus® " -3041,https://www.austintexas.gov/sites/default/files/files/Police/200.3%20Response%20to%20Resistance.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3042,http://www.austintexas.gov/GIS/CrimeViewer/,Crime Maps & Reports,Agency-Published Resources,"","",404,"","","","","","","","" -3043,https://www.auroragov.org/residents/public_safety/police/crime_data,Crime Statistics,Agency-Published Resources,Crime Data - City of Aurora,"",200,Just a moment...,"[""Welcome to the City of Aurora Colorado""]","[""Crime Data""]","[""Contact Info"", ""Useful Links"", ""City of Aurora Colorado"", ""Accreditations""]",[],[],[],google-site-verification: googlee16c7726ecc34510.html -3044,https://www.austintexas.gov/sites/default/files/files/APD-Ferguson-Training-Curriculum-Review-061920.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3045,https://data.burlingtonvt.gov/explore/dataset/bpd-traffic-stops/table/?sort=call_time&dataChart=eyJxdWVyaWVzIjpbeyJjb25maWciOnsiZGF0YXNldCI6ImJwZC10cmFmZmljLXN0b3BzIiwib3B0aW9ucyI6eyJzb3J0IjoiY2FsbF90aW1lIn19LCJjaGFydHMiOlt7ImFsaWduTW9udGgiOnRydWUsInR5cGUiOiJsaW5lIiwiZnVuYyI6IkFWRyIsInlBeGlzIjoiY291bnRfdGlja2V0cyIsInNjaWVudGlmaWNEaXNwbGF5Ijp0cnVlLCJjb2xvciI6IiMwMDAwMDAifV0sInhBeGlzIjoiY2FsbF90aW1lIiwibWF4cG9pbnRzIjoiIiwidGltZXNjYWxlIjoieWVhciIsInNvcnQiOiIifV0sImRpc3BsYXlMZWdlbmQiOnRydWUsImFsaWduTW9udGgiOnRydWV9,Stops,Police & Public Interactions,BTVstat Data Hub,City of Burlington Vermont Open Data Portal,200,BTVstat Data Hub,[],[],[],[],[],[],"" -3046,https://www.baltimorepolice.org/contact-baltimore-police-department,Contact Info & Agency Meta,Info About Agencies,We've got some trouble | 404 - Resource not found,"",200,Homepage | Baltimore Police Department,"[""Resource not found Error 404""]",[],[],[],[],[],Resource not found Error 404 The requested resource could not be found. -3047,https://www.burlingtonvt.gov/Police/Key-Department-Directives,Policies & Contracts,Info About Agencies,"Key Department Directives | City of Burlington, Vermont","",200,"City of Burlington, Vermont","[""Key Department Directives""]","[""Contact BPD""]",[],[],[],[],"Skip to main content OFFICE OF THE MAYOR | CITY COUNCIL | BOARDS & COMMISSIONS | A-Z DIRECTORY Toggle navigation THE CITY OF BURLINGTON MAYOR DEPARTMENTS Assessor’s Office Attorney’s Office Board of Health Burlington Electric Department Burlington International Airport Business and Workforce Development Burlington School District Church Street Marketplace City Arts Clerk/Treasurer’s Office Community & Economic Development Office (CEDO) Community Justice Center Fire Department Fletcher Free Library Human Resources Innovation and Technology Parks, Recreation & Waterfront Permitting & Inspections Planning Police Department Public Works Department Racial Equity, Inclusion & Belonging (REIB) Retirement Administration Water Resources VIEW DIRECTORY RENTAL & PROPERTY INFO CALENDAR CITY COUNCIL NPAs Police Department Key Department Directives This page contains our key Department Directives (DD) below. *Please note some Directives are in the process of being revised. Resources DD01 - Law Enforcement Role & Authority, Ethics, Organizational Structure & Department Rules [PDF] DD2.01 - Shift Assignments, Areas, Supervisors, Notifications & Facility Inspections [PDF] DD2.02 - Grooming Standars, Uniforms, Equipment, inspections & Use of Tobacco [PDF] DD03 - Fair and Impartial Policing [PDF] DD04 - Operation of Police Vehicles, Response Codes-Pursuits [PDF] DD05 - Use of Force Policy [PDF] DD7.1 - Crash Investigation [PDF] DD7.2 - Traffic Enforcement [PDF] DD7.3 - Traffic Control Hazards and Escorts [PDF] DD9.1 - Transportation of In-Custody Subjects [PDF] DD11 - Victim-Witness Assistance [PDF] DD12 - Bloodborne Pathogens [PDF] DD13.01 - Interacting with Persons with Limited English Proficiency [PDF] DD13.02 - Interacting with Persons with Disabilities [PDF] DD13.03 - Interacting with Persons with Diminished Capacities [PDF] DD14 - Digital Imaging, Audio & Video (other than Body Worn Camera Systems) [PDF] DD14.1 - Body Worn Camera Systems [PDF] DD21.01 - Domestic Violence Response [PDF] DD21.02 - Domestic Violence by Law Enforcement Employees-Prevention & Early Warning Initiatives [PDF] DD22 - Canine Unit [PDF] DD23 - Motorcycle Unit [PDF] DD24 - Operation of Police Bicycles [PDF] DD25 - Service of Legal Process [PDF] DD30 - Public Information, Website, NIXLE [PDF] DD31 - Ride-Along Program [PDF] DD34 - Animal Control [PDF] DD40 - Quality Control, Internal Investigations & Discipline [PDF] DD41 - Naloxone [PDF] DD43 - Reporting Corruption and Misconduct [PDF] Police Department Key Department Directives About Us Online Incident Reporting Press Releases Police Transformation Police Commission Transparency & Data Crisis, Advocacy, Intervention Programs Citizen Complaints and Compliments We're Hiring Parking & Parking Enforcement Safety & Crime Prevention Resources Services and Guidance Community Academy Frequently Asked Questions Ammunition and Medication Disposal Contact BPD Burlington Police Department Antonio B. Pomerleau Building One North Avenue Burlington, VT 05401 Phone: 802-658-2700 Emergency: Dial 911 Follow @OneNorthAvenue Burlington Police Department - Antonio B. Pomerleau Building - One North Avenue - Burlington, VT 05401 - (802) 658-2704 Emergency Call 911 THE CITY OF BURLINGTON City Hall 149 Church Street Burlington, VT  05401 Hours: M-F 8am-4:30pm (802) 865-7000 Email Us Website design by Hark.bz A Burlington Based Design Studio Directory Terms of Use Privacy Policy Contact Us OFFICE OF THE MAYOR | CITY COUNCIL | BOARDS & COMMISSIONS | A-Z DIRECTORY " -3048,https://www.ci.billings.mt.us/DocumentCenter/View/44274/2020-Annual-Report,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -3049,https://app.powerbigov.us/view?r=eyJrIjoiZGFjYzA2NTYtZGQ3My00ZjlmLThjYjEtMjJiYTU5Y2ZiYTk2IiwidCI6IjAyOTBkYjZlLWM0NzUtNGM0Zi1iNjJkLWNjNjEyZDE4OGZhYiJ9,Crime Statistics,Agency-Published Resources,Microsoft Power BI,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -3050,https://data.boston.gov/,List of Data Sources,Info About Agencies,Welcome - Analyze Boston,"",200,Welcome - Analyze Boston,"[""Analyze Boston""]","[""Topics"", ""Showcases"", ""Popular Datasets"", ""New or Modified Datasets""]","[""Search data"", ""Popular tags"", ""Vision Zero Boston"", ""Boston Tax Parcel Viewer"", ""Canopy Change Assessment: 2014-2019"", ""Our Progress Toward Carbon Neutrality"", ""Beantown Solar"", ""Climate Ready Boston Map Explorer"", ""Imagine Boston 2030 Metrics Dashboard"", ""RentSmart Boston"", ""Boston Garbage Atlas: 2014"", ""Trash City"", ""Fire-Proof Boston Housing"", ""BuildBPS Dashboard"", ""Vision Zero Boston"", ""Boston Tax Parcel Viewer"", ""Canopy Change Assessment: 2014-2019"", ""Our Progress Toward Carbon Neutrality"", ""Employee Earnings Report"", ""Approved Building Permits"", ""Property Assessment"", ""Crime Incident Reports (August 2015 - To Date) (Source: New System)"", ""311 Service Requests"", ""food truck schedule"", ""Approved Building Permits"", ""Food Establishment Inspections"", ""311 Service Requests"", ""Building and Property Violations""]",[],[],[],Home Boston.gov Log in Register Showcases News Datasets Organizations Topics Tips for Users About Contact Home Boston.gov Log in Register Showcases News Datasets Organizations Topics Tips for Users About Contact Log in Register -3051,https://www.ci.billings.mt.us/1911/Hours,Contact Info & Agency Meta,Info About Agencies,"Police Department Contact Information & Hours | City of Billings, MT - Official Website",Hours,200,"City of Billings, MT - Official Website | Official Website","[""Police Department Contact Information & Hours""]",[],"[""Contact Us"", ""Quick Links"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In About Divisions Recruiting/ Hiring Community Services How Do I... City Website Court Legal Maps Search billingsmt.gov Services Public Safety Police About Hours Police Department Contact Information & Hours Location Billings Police Department 220 North 27th Street Billings, MT 59101 Mailing Address Billings Police Department PO Box 1554 Billings, MT 59103 Hours Monday - Friday, 8:00 am - 6:00 pm Saturday, 10:00 am - 12:00 noon Phone Numbers (406) 657-8460 Non-Emergency - (406) 657-8200 Email Email the Police Department . Copy of Report Report a Crime Pay Fines Forms Crime Activity Volunteer/Intern Next Previous Contact Us 220 North 27th Street Billings, MT 59101 Phone: 406-657-8 460 Quick Links BPD Policy Manual Report an Abandoned Vehicle Become a Volunteer Billings Police Accident Report Billings Police Online Reporting Portal Crime Mapping 2022 Annual Report /QuickLinks.aspx Site Links City of Billings Home Site Map Copyright Notices Accessibility Privacy Policy /QuickLinks.aspx Government Websites by CivicPlus® Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In About Divisions Recruiting/ Hiring Community Services How Do I... City Website Court Legal Maps Search billingsmt.gov Services Public Safety Police About Hours Police Department Contact Information & Hours Location Billings Police Department 220 North 27th Street Billings, MT 59101 Mailing Address Billings Police Department PO Box 1554 Billings, MT 59103 Hours Monday - Friday, 8:00 am - 6:00 pm Saturday, 10:00 am - 12:00 noon Phone Numbers (406) 657-8460 Non-Emergency - (406) 657-8200 Email Email the Police Department . Copy of Report Report a Crime Pay Fines Forms Crime Activity Volunteer/Intern Next Previous Contact Us 220 North 27th Street Billings, MT 59101 Phone: 406-657-8 460 Quick Links BPD Policy Manual Report an Abandoned Vehicle Become a Volunteer Billings Police Accident Report Billings Police Online Reporting Portal Crime Mapping 2022 Annual Report /QuickLinks.aspx Site Links City of Billings Home Site Map Copyright Notices Accessibility Privacy Policy /QuickLinks.aspx Government Websites by CivicPlus® Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -3052,https://www.bridgeportct.gov/content/341307/341425/341439/367559.aspx,Policies & Contracts,Info About Agencies,We've got some trouble | 404 - Resource not found,"",200,Homepage | City of Bridgeport,"[""Resource not found Error 404""]",[],[],[],[],[],Resource not found Error 404 The requested resource could not be found. -3053,https://www.baltimorecountymd.gov/departments/police/contact.html,Contact Info & Agency Meta,Info About Agencies,Police Department - Baltimore County,View information on the major activities of the Department of Planning.,200,Baltimore County Government,"[""Baltimore County Police Department""]","[""Most Popular Services"", ""Police News"", ""Reporting Emergencies, Crimes and Tips"", ""Provide Feedback via the Accreditation Public Portal"", ""Claiming Lawfully-Seized Property"", ""Publications"", ""Request Training"", ""Contact Us"", ""Contact Us"", ""Follow Us""]","[""Helpful Information"", ""Department Units and Staff"", ""Policies and Programs"", ""Contact Us"", ""Police Headquarters"", ""Hours"", ""Email"", ""Phone"", ""Fax"", ""BALTCOGO311"", ""Chief of Police"", ""Facebook"", ""Twitter"", ""YouTube"", ""News"", ""Instagram"", ""Find Information"", ""Policies"", ""Connect With Us"", ""Translate""]",[],[],[],Skip Navigation -3054,https://www.cityofboise.org/government/data-transparency/data-and-dashboards/police-data-and-dashboards/police-incidents-in-your-neighborhood/,Calls for Service,Police & Public Interactions,Police Incidents in Your Neighborhood | City of Boise,"",200,City of Boise,[],"[""Message Sent Successfully!"", ""Message Failed To Send.""]","[""Be 'In the Know,'"", ""Send a Message to City of Boise""]","[""City of Boise"", ""Phone"", ""TTY"", ""Hours"", ""Address""]",[],[],"Residents Visitors Business Government Departments Dept. Search Residents Visitors Business Government Departments Dept. Search Residents Visitors Business Government Departments Dept. Search Home Government Data Transparency Data and Dashboards Police Data and Dashboards Police Incidents in Your Neighborhood Residents Visitors Business Government Departments & Programs Sitemap Terms of Use and Privacy Policy Be 'In the Know,' sign up for our weekly e-newsletter. Thanks for filling out the form! Subscribe to our mailing list Zip Code * skip Submit City of Boise 150 North Capitol Blvd. Boise, ID 83702 Facebook Twitter Instagram YouTube LinkedIn Translate Contact Us Residents Visitors Business Government Departments & Programs Sitemap Terms of Use and Privacy Policy Be 'In the Know,' sign up for our weekly e-newsletter. Thanks for filling out the form! Subscribe to our mailing list Zip Code * skip Submit City of Boise 150 North Capitol Blvd. Boise, ID 83702 Facebook Twitter Instagram YouTube LinkedIn Translate Contact Us Residents Visitors Business Government Departments & Programs Sitemap Terms of Use and Privacy Policy Sitemap Terms of Use and Privacy Policy Be 'In the Know,' sign up for our weekly e-newsletter. Thanks for filling out the form! Subscribe to our mailing list Zip Code * skip Submit Be 'In the Know,' sign up for our weekly e-newsletter. Thanks for filling out the form! Subscribe to our mailing list Zip Code * skip Submit Be 'In the Know,' sign up for our weekly e-newsletter. Thanks for filling out the form! Subscribe to our mailing list Zip Code * skip Submit Thanks for filling out the form! Subscribe to our mailing list Zip Code * skip Submit Thanks for filling out the form! Subscribe to our mailing list Zip Code * skip Submit Subscribe to our mailing list Zip Code * skip Submit skip Submit City of Boise 150 North Capitol Blvd. Boise, ID 83702 Facebook Twitter Instagram YouTube LinkedIn City of Boise 150 North Capitol Blvd. Boise, ID 83702 Facebook Twitter Instagram YouTube LinkedIn Facebook Twitter Instagram YouTube LinkedIn Facebook Twitter Instagram YouTube LinkedIn Translate Contact Us © 2024 City of Boise. All rights reserved. © 2024 City of Boise. All rights reserved. © 2024 City of Boise. All rights reserved. © 2024 City of Boise. All rights reserved. Close Message Sent Successfully! Message Failed To Send. Send a Message to City of Boise Please fill out the form and a representative from the City of Boise will be in touch with you. First Name Last Name Email Address Phone Number Message Recaptcha Submit Phone (208) 608-7000 TTY (800) 377-3529 Hours Monday - Friday, 8:00 a.m. - 5:00 p.m. Closed Holidays Address 150 N Capitol Blvd, Boise, ID 83702 Get Directions Close Close Close Close " -3055,https://www.bridgeportct.gov/filestorage/341307/341425/341439/371966/Bridgeport_Crime_Map_Jan_Jul_2021.pdf,Crime Maps & Reports,Agency-Published Resources,"","",404,"","","","","","","","" -3056,https://resources.baltimorecountymd.gov/Documents/Police/policiespdnet/adminmanual2020-01.pdf,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3057,https://www.bridgeportct.gov/content/341307/341425/341439/372723.aspx,Arrest Records,Police & Public Interactions,We've got some trouble | 404 - Resource not found,"",200,Homepage | City of Bridgeport,"[""Resource not found Error 404""]",[],[],[],[],[],Resource not found Error 404 The requested resource could not be found. -3058,https://birminghamcrb.org,Complaints & Misconduct,Info About Officers,"","",-1,"","","","","","","","" -3059,https://www.boston.gov/departments/police,Contact Info & Agency Meta,Info About Agencies,Police | Boston.gov,"Through community policing, we want to be a reflection of the residents we serve. We aim to create a professional culture and inclusive environment that mirrors the best of all of us. Learn more about the history of our department, or visit police.boston.gov for the latest information.",200,Homepage | Boston.gov,"[""Police""]","[""Join the Boston Police"", ""Civilian jobs"", ""Boston Police data dashboards"", ""Help staying safe"", ""Boston Police News"", ""Latest news"", ""Districts"", ""Bureaus"", ""Forms, permits, applications""]","[""Five-year Contract Ratified by Boston Police Detectives Benevolent Society"", ""Five-year Contract Ratified by Boston Police Patrolmen's Association"", ""Now Hiring: Boston Police Emergency Communications Specialists"", ""City of Boston Selected for Violence Reduction Center Cohort""]","[""About Translations on Boston.gov"", ""Acerca de las traducciones en Boston.gov"", ""关于Boston.gov上的翻译"", ""Sou tradiksyon sou Boston.gov"", ""Sobre as traduções no Boston.gov"", ""À propos des traductions sur Boston.gov"", ""Về bản dịch trên Boston.gov"", ""О переводах на Boston.gov"", ""Ku Saabsan Tarjumida bogga Boston.gov"", ""Boston.gov حول الترجمات على"", ""Tell us what you think""]","[""Contact"", ""Contact""]",[],"" -3060,https://www.cityofboise.org/media/6875/bpd-policy-and-procedure-manual-jan-2019.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3061,https://bpdnews.com/rules-and-procedures,Policies & Contracts,Info About Agencies,"","",-1,"","","","","","","","" -3063,https://www.burlingtonvt.gov/sites/default/files/DD05%20Statewide%20Policy%20on%20Police%20Use%20of%20Force.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3064,https://app.powerbigov.us/view?r=eyJrIjoiYmJjZmUwMTEtODY2NS00MGEyLWI0YTctYTVlYzkzYWNlODc3IiwidCI6Ijk0NGZhOWJhLTg0NTQtNDEzZC1iOWU2LWJmNDBhZjFkNmE5YiJ9,Use of Force Reports,Police & Public Interactions,Microsoft Power BI,"",200,Power BI,[],[],[],[],[],[],"" -3065,https://gis.adacounty.id.gov/apps/crimemapper/,Crime Maps & Reports,Agency-Published Resources,CrimeMapper,"",200,Ada County GIS,[],[],[],[],[],[],"" -3066,https://www.ci.billings.mt.us/DocumentCenter/View/43658/BPD-Policy-Manual-,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3068,https://www.arcgis.com/apps/dashboards/3703a48c34af408f8ed612e0583ec176,Crime Maps & Reports,Agency-Published Resources,ArcGIS Dashboards,ArcGIS Dashboards,200,"",[],[],[],[],[],[],"" -3069,https://data.burlingtonvt.gov/explore/dataset/arrests/table/,Arrest Records,Police & Public Interactions,BTVstat Data Hub,City of Burlington Vermont Open Data Portal,200,BTVstat Data Hub,[],[],[],[],[],[],"" -3070,https://data.burlingtonvt.gov/explore/dataset/police-incidents-2021/table/?sort=call_time,Calls for Service,Police & Public Interactions,BTVstat Data Hub,City of Burlington Vermont Open Data Portal,200,BTVstat Data Hub,[],[],[],[],[],[],"" -3071,https://data.birminghamal.gov/,List of Data Sources,Info About Agencies,Welcome - City of Birmingham,"",200,Welcome - City of Birmingham,"[""City of Birmingham""]","[""Groups (click to see all)"", ""Showcases (click to see all)"", ""Popular Datasets"", ""New and Recent Datasets""]","[""Search data"", ""Popular tags"", ""Birmingham Transparency"", ""GIS Mapping files"", ""Birmingham Zoning Boundaries"", ""Municipal Courts - Court Dockets and Citations"", ""Birmingham City Limits"", ""Birmingham Community Maps"", ""Municipal Courts - Court Dockets and Citations"", ""West Precinct Crime Data"", ""East Precinct Crime Data"", ""North Precinct Crime Data"", ""South Precinct Crime Data""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Search Datasets City of Birmingham Connecting Residents With Their Government Search data Search Popular tags Finance Fire GIS Maps Groups (click to see all) Police Finance Planning Engineering & Permits Birmingham Fire Geospatial Community Development Economic Development Youth Services The Mayor's Office Public Works Municipal Courts Showcases (click to see all) Birmingham Transparency View Birmingham Transparency Popular Datasets Browse popular datasets below and see what other citizens find interesting. GIS Mapping files 69 recent views HTML SHP GeoJSON Birmingham Zoning Boundaries 61 recent views HTML SHP GeoJSON Municipal Courts - Court Dockets and Citations 37 recent views XLSX CSV PDF Birmingham City Limits 36 recent views HTML SHP GeoJSON Birmingham Community Maps 35 recent views HTML GeoJSON SHP New and Recent Datasets Browse new or modified datasets below. Click to view details or explore content. Municipal Courts - Court Dockets and Citations Updated on March 15, 2024 XLSX CSV PDF West Precinct Crime Data Updated on February 20, 2024 XLSX CSV East Precinct Crime Data Updated on February 20, 2024 XLSX CSV North Precinct Crime Data Updated on February 20, 2024 XLSX CSV South Precinct Crime Data Updated on February 20, 2024 XLSX CSV City of Birmingham Connecting Residents With Their Government Search data Search Popular tags Finance Fire GIS Maps Groups (click to see all) Police Finance Planning Engineering & Permits Birmingham Fire Geospatial Community Development Economic Development Youth Services The Mayor's Office Public Works Municipal Courts Showcases (click to see all) Birmingham Transparency View Birmingham Transparency Popular Datasets Browse popular datasets below and see what other citizens find interesting. GIS Mapping files 69 recent views HTML SHP GeoJSON Birmingham Zoning Boundaries 61 recent views HTML SHP GeoJSON Municipal Courts - Court Dockets and Citations 37 recent views XLSX CSV PDF Birmingham City Limits 36 recent views HTML SHP GeoJSON Birmingham Community Maps 35 recent views HTML GeoJSON SHP New and Recent Datasets Browse new or modified datasets below. Click to view details or explore content. Municipal Courts - Court Dockets and Citations Updated on March 15, 2024 XLSX CSV PDF West Precinct Crime Data Updated on February 20, 2024 XLSX CSV East Precinct Crime Data Updated on February 20, 2024 XLSX CSV North Precinct Crime Data Updated on February 20, 2024 XLSX CSV South Precinct Crime Data Updated on February 20, 2024 XLSX CSV City of Birmingham Connecting Residents With Their Government Search data Search Popular tags Finance Fire GIS Maps City of Birmingham Connecting Residents With Their Government Search data Search Popular tags Finance Fire GIS Maps City of Birmingham Connecting Residents With Their Government Search data Search Popular tags Finance Fire GIS Maps City of Birmingham Connecting Residents With Their Government Search data Search Popular tags Finance Fire GIS Maps City of Birmingham Connecting Residents With Their Government Search data Search Popular tags Finance Fire GIS Maps " -3072,https://www.bridgeportct.gov/filestorage/341307/341425/341439/371966/Bridgeport_Crime_Report_Jan_Jul_2021.pdf,Crime Statistics,Agency-Published Resources,"","",404,"","","","","","","","" -3073,https://opendata.cityofboise.org/,List of Data Sources,Info About Agencies,City of Boise Maps and GIS Open Data Portal,City of Boise Open Data Portal for geospatial data and maps.,200,City of Boise Maps and GIS Open Data Portal,[],[],[],[],[],[],"" -3074,https://data.burlingtonvt.gov/explore/dataset/bpd-use-of-force/table/?sort=call_time&dataChart=eyJxdWVyaWVzIjpbeyJjaGFydHMiOlt7InR5cGUiOiJsaW5lIiwiZnVuYyI6IkFWRyIsInlBeGlzIjoib2ZmaWNlcnNfaW52b2x2ZWQiLCJzY2llbnRpZmljRGlzcGxheSI6dHJ1ZSwiY29sb3IiOiIjMDAwMDAwIn1dLCJ4QXhpcyI6ImNhbGxfdGltZSIsIm1heHBvaW50cyI6IiIsInRpbWVzY2FsZSI6InllYXIiLCJzb3J0IjoiIiwiY29uZmlnIjp7ImRhdGFzZXQiOiJicGQtdXNlLW9mLWZvcmNlIiwib3B0aW9ucyI6eyJzb3J0IjoiY2FsbF90aW1lIn19fV0sImRpc3BsYXlMZWdlbmQiOnRydWUsImFsaWduTW9udGgiOnRydWV9,Use of Force Reports,Police & Public Interactions,BTVstat Data Hub,City of Burlington Vermont Open Data Portal,200,BTVstat Data Hub,[],[],[],[],[],[],"" -3075,https://resources.baltimorecountymd.gov/Documents/Police/policiespdnet/fieldmanual/fieldmanual2020-01_a12.pdf,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3076,https://www.boston.gov/news/boston-police-department-police-reform-policy-update,Policies & Contracts,Info About Agencies,Boston Police Department Police Reform Policy update | Boston.gov,"On June 8, 2021 the Boston Police Department (BPD) issued a revised Gang Assessment Database rule.",200,Homepage | Boston.gov,"[""Boston Police Department Police Reform Policy update""]",[],[],"[""About Translations on Boston.gov"", ""Acerca de las traducciones en Boston.gov"", ""关于Boston.gov上的翻译"", ""Sou tradiksyon sou Boston.gov"", ""Sobre as traduções no Boston.gov"", ""À propos des traductions sur Boston.gov"", ""Về bản dịch trên Boston.gov"", ""О переводах на Boston.gov"", ""Ku Saabsan Tarjumida bogga Boston.gov"", ""Boston.gov حول الترجمات على"", ""Tell us what you think""]",[],[],"" -3077,https://dashboard.cityofboston.gov/t/Guest_Access_Enabled/views/OPATComplaintsDashboard/Complaints?:showAppBanner=false&:display_count=n&:showVizHome=n&:origin=viz_share_link&:isGuestRedirectFromVizportal=y&:embed=y,Complaints & Misconduct,Info About Officers,"","",-1,"","","","","","","","" -3078,https://app.powerbigov.us/view?r=eyJrIjoiMzM3YzVhMzktN2M4OS00NjBiLWFjMTctOTBjNzBhN2QwNGRmIiwidCI6Ijk0NGZhOWJhLTg0NTQtNDEzZC1iOWU2LWJmNDBhZjFkNmE5YiJ9,Stops,Police & Public Interactions,Microsoft Power BI,"",200,Power BI,[],[],[],[],[],[],"" -3079,https://data.boston.gov/dataset/911-daily-dispatch-count-by-agency,Calls for Service,Police & Public Interactions,911 Daily Dispatch Count by Agency - Dataset - Analyze Boston,"",200,Welcome - Analyze Boston,"[""911 Daily Dispatch Count by Agency"", ""Department of Innovation and Technology"", ""911 Daily Dispatch Count by Agency""]","[""Organization"", ""Social"", ""License"", ""Data and Resources""]","[""Tags"", ""Additional Info""]",[],[],[],"Home Boston.gov Log in Register Showcases News Datasets Organizations Topics Tips for Users About Contact Home Boston.gov Log in Register Showcases News Datasets Organizations Topics Tips for Users About Contact Log in Register Skip to content Menu Toggle navigation Log in Sign up Datasets News Tips Home Organizations Department of Innovation... 911 Daily Dispatch Count by Agency 911 Daily Dispatch Count by Agency Followers 0 Organization Department of Innovation and Technology We manage the City’s websites and technologies, like the BOS:311 app, that are focused on service delivery. We also ensure that the networks, computers, e-mail systems, and... read more Social Twitter Facebook Linkedin License Open Data Commons Public Domain Dedication and License (PDDL) Dataset Groups Showcases Activity Stream 911 Daily Dispatch Count by Agency This a legacy dataset from the period of November 1, 2010 to April 21, 2014 showing daily counts of 911 dispatches by City of Boston public safety agencies. Agencies included are the Boston Police Department, Boston Fire Department, and Boston Emergency Medical Services. Data and Resources 911 Daily Dispatch Count By Agency (CSV) CSV Popular represents the non-administrative dispatches for public safety agencies Explore Preview Download Tags 911 dispatch legacy portal public safety Additional Info Title 911 Daily Dispatch Count by Agency Type Tabular Description This a legacy dataset from the period of November 1, 2010 to April 21, 2014 showing daily counts of 911 dispatches by City of Boston public safety agencies. Agencies included are the Boston Police Department, Boston Fire Department, and Boston Emergency Medical Services. Publisher Department of Innovation and Technology Temporal from 2010-11-01 Temporal to 2014-04-21 Temporal notes This dataset contains daily counts of 911 dispatches between November 1, 2010 and April 21, 2014. Theme Public safety Location Boston (all) Contact point Department of Innovation and Technology Contact point email analyticsteam@boston.gov License Open Data Commons Public Domain Dedication and License (PDDL) About Analyze Boston Mayor Michelle Wu API Documentation Analytics Team DoIT Tips for Users Privacy Policy Glossary General Inquiries Help & Feedback SIGN UP FOR OUR NEWSLETTER! Sign Up Powered by CKAN Language English português (Brasil) 日本語 italiano čeština (Česko) català español français Ελληνικά svenska српски norsk bokmål (Norge) slovenčina suomi русский Deutsch polski Nederlands български 한국어 (대한민국) magyar slovenščina latviešu አማርኛ العربية bosanski dansk (Danmark) English (Australia) español (Argentina) euskara فارسی (ایران) galego עברית hrvatski Indonesia íslenska ខ្មែរ lietuvių македонски монгол (Монгол) မြန်မာ (မြန်မာ) norsk bokmål (Norge) नेपाली português (Portugal) română shqip srpski (latinica) ไทย Filipino (Pilipinas) Türkçe українська українська (Україна) Tiếng Việt 中文 (简体, 中国) 中文 (繁體, 台灣) Go Skip to content Menu Toggle navigation Log in Sign up Datasets News Tips Menu Toggle navigation Log in Sign up Datasets News Tips Log in Sign up " -3080,https://www.burlingtonvt.gov/Police/About,Contact Info & Agency Meta,Info About Agencies,"About the BPD | City of Burlington, Vermont","",200,"City of Burlington, Vermont","[""About the BPD""]","[""Contact BPD""]",[],[],[],[],Skip to main content -3083,https://app.powerbigov.us/view?r=eyJrIjoiZmEyNTg0ODEtYmM0Ni00YzMyLWI3N2QtMWI5NzNmMDE3MWE0IiwidCI6Ijk0NGZhOWJhLTg0NTQtNDEzZC1iOWU2LWJmNDBhZjFkNmE5YiJ9,Crime Statistics,Agency-Published Resources,Microsoft Power BI,"",200,Power BI,[],[],[],[],[],[],"" -3085,https://www.cityofboise.org/CityWideContactForm?contactId=3087,Contact Info & Agency Meta,Info About Agencies,City of Boise,"",200,Error retrieving title: dictionary changed size during iteration,[],"[""Contact"", ""Message Sent Successfully!"", ""Message Failed To Send.""]","[""Send a Message to Police"", ""Phone"", ""Be 'In the Know,'""]","[""Hours"", ""Boise Police Records/General questions"", ""Non-emergency dispatch/Request an officer"", ""TTY"", ""Address"", ""City of Boise""]",[],[],"Residents Visitors Business Government Departments Dept. Search Residents Visitors Business Government Departments Dept. Search Residents Visitors Business Government Departments Dept. Search Contact Contact Contact Close Message Sent Successfully! Message Failed To Send. Send a Message to Police Thank you for contacting the Boise Police Department. Please fill out the form and someone from the department will be in touch with you. If this is an emergency, please call 911. First Name Last Name Email Address Phone Number Message Recaptcha Submit Hours Front Counter Hours: Monday - Friday, 9:00 a.m. - 5:00 p.m. Phone Boise Police Records/General questions (208) 570-6000 Non-emergency dispatch/Request an officer (208) 377-6790 TTY (800) 377-3529 Address 333 N Mark Stall Pl, Boise, ID 83704 Get Directions Close Close Close Close Message Sent Successfully! Message Failed To Send. Send a Message to Police Thank you for contacting the Boise Police Department. Please fill out the form and someone from the department will be in touch with you. If this is an emergency, please call 911. First Name Last Name Email Address Phone Number Message Recaptcha Submit Hours Front Counter Hours: Monday - Friday, 9:00 a.m. - 5:00 p.m. Phone Boise Police Records/General questions (208) 570-6000 Non-emergency dispatch/Request an officer (208) 377-6790 TTY (800) 377-3529 Address 333 N Mark Stall Pl, Boise, ID 83704 Get Directions Message Sent Successfully! Message Failed To Send. Send a Message to Police Thank you for contacting the Boise Police Department. Please fill out the form and someone from the department will be in touch with you. If this is an emergency, please call 911. First Name Last Name Email Address Phone Number Message Recaptcha Submit Hours Front Counter Hours: Monday - Friday, 9:00 a.m. - 5:00 p.m. Phone Boise Police Records/General questions (208) 570-6000 Non-emergency dispatch/Request an officer (208) 377-6790 TTY (800) 377-3529 Address 333 N Mark Stall Pl, Boise, ID 83704 Get Directions Message Sent Successfully! Message Failed To Send. Send a Message to Police Thank you for contacting the Boise Police Department. Please fill out the form and someone from the department will be in touch with you. If this is an emergency, please call 911. First Name Last Name Email Address Phone Number Message Recaptcha Submit Hours Front Counter Hours: Monday - Friday, 9:00 a.m. - 5:00 p.m. Phone Boise Police Records/General questions (208) 570-6000 Non-emergency dispatch/Request an officer (208) 377-6790 TTY (800) 377-3529 Address 333 N Mark Stall Pl, Boise, ID 83704 Get Directions Message Sent Successfully! Message Failed To Send. Send a Message to Police Thank you for contacting the Boise Police Department. Please fill out the form and someone from the department will be in touch with you. If this is an emergency, please call 911. First Name Last Name Email Address Phone Number Message Recaptcha Submit Message Sent Successfully! Message Failed To Send. " -3086,https://www.baltimorepolice.org/transparency/bpd-policies/na-pib-internal-operations-training-manual,Policies & Contracts,Info About Agencies,We've got some trouble | 404 - Resource not found,"",200,Homepage | Baltimore Police Department,"[""Resource not found Error 404""]",[],[],[],[],[],Resource not found Error 404 The requested resource could not be found. -3087,https://www.cityofboise.org/media/11707/2020-annual-report.pdf,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -3089,https://public.powerdms.com/BRIDGEPORT/documents/647990,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3091,https://www.baltimorepolice.org/transparency/bpd-policies/1115-use-force,Policies & Contracts,Info About Agencies,We've got some trouble | 404 - Resource not found,"",200,Homepage | Baltimore Police Department,"[""Resource not found Error 404""]",[],[],[],[],[],Resource not found Error 404 The requested resource could not be found. -3093,https://www.bridgeportct.gov/content/341307/341425/341439/341792.aspx,Contact Info & Agency Meta,Info About Agencies,We've got some trouble | 404 - Resource not found,"",200,Error retrieving title: dictionary changed size during iteration,"[""Resource not found Error 404""]",[],[],[],[],[],Resource not found Error 404 The requested resource could not be found. -3094,https://opendata-bc-gis.hub.arcgis.com/pages/data-catalog,List of Data Sources,Info About Agencies,ArcGIS Hub,"Discover, analyze and download data from ArcGIS Hub. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",200,ArcGIS Hub,[],[],[],[],[],[],"" -3095,https://data.burlingtonvt.gov/pages/home/,List of Data Sources,Info About Agencies,BTVstat Data Hub,City of Burlington Vermont Open Data Portal,200,BTVstat Data Hub,[],[],[],[],[],[],"" -3096,https://public.powerdms.com/BRIDGEPORT/documents/914439,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3097,https://www.arcgis.com/apps/MapSeries/index.html?appid=fad2a3f085c644d0b014b507d23bcd9a,Arrest Records,Police & Public Interactions,Map Series,This story map was created with the Story Map Series application in ArcGIS Online.,200,"","[""""]",[],[],[],[],[],"This story map requires JavaScript, but running JavaScript is not currently allowed - by your web browser. If you wish to view this story, please enable JavaScript in this browser or try a - different browser. 100% / 800px 100% / 640px 800px / 600px 640px / 480px 100% / 800px 100% / 640px 800px / 600px 640px / 480px 100% / 800px 100% / 640px 800px / 600px 640px / 480px 100% / 800px 100% / 640px 800px / 600px 640px / 480px 100% / 800px 100% / 640px 800px / 600px 640px / 480px 100% / 800px 100% / 640px 800px / 600px 640px / 480px 100% / 800px 100% / 640px 800px / 600px 640px / 480px 100% / 800px 100% / 640px 800px / 600px 640px / 480px An error has occurred " -3098,https://www.crimemapping.com/map/ga/dekalbcounty ,Crime Maps & Reports,Agency-Published Resources,"","",200,CrimeMapping.com - Helping You Build a Safer Community,[],[],[],[],[],[],"" -3099,https://www.columbus.gov/police-divisiondirectives/,Policies & Contracts,Info About Agencies,"","",200,"Home - City of Columbus, Ohio","[""City of Columbus"", ""The page you're looking for has moved to our new website."", ""Please visit https://new.columbus.gov .""]","[""We're building you a new columbus.gov. Can't find what you're looking for?"", ""We're building you a new columbus.gov. Can't find what you're looking for?"", ""(614) 645-3111"", ""Council Members"", ""(614) 645-3111"", ""Go to the 311 Call Center"", ""(614) 645-3111"", ""311 is also available on the CBUS 311 app""]","[""Navigate to new.columbus.gov."", ""City of Columbus""]",[],[],[],"breaking news We're building you a new columbus.gov. Can't find what you're looking for? We're building you a new columbus.gov. Can't find what you're looking for? Navigate to new.columbus.gov. Navigate to new.columbus.gov. City of Columbus A A A Text Size Columbus Home Residents 2020 Census Income Tax Home 50+ Programs Columbus Biking Arts and Entertainment CelebrateOne City Services and Repairs Community Resources Courts Education Employment Sustainable Columbus Contact GreenSpot Columbus LGBTQ Pride Moving to Columbus New Americans Public Safety Recreation and Parks Streets and Sanitation Transportation and Parking Veterans and Disabled Citizens Your Government Youth Programs (614) 645-3111 Businesses Income Tax Home Doing Business with the City Economic Development Vendor Services GreenSpot for Business Food Protection for Businesses Business Certifications Visitors Columbus Business Directory Convention Center Getting Here and Around History and Culture Photos and Videos > Parks > Golf > Hiking and Biking Trails > Events > Summer Fun Guide > Events > Things To Do > Neighborhoods > Hotels > Restaurants > Visitor Maps Elected Officials Andrew J. Ginther, Mayor Contact the Mayor's Office Smart City City Council Council Members > Nicholas J. Bankston > Lourdes Barroso de Padilla > Mitchell J. Brown > Rob Dorans > Shayla Favor > Shannon G. Hardin > Emmanuel V. Remy Agendas Contact City Council City Auditor Megan N. Kilgore City Attorney Zach M. Klein Municipal Court Clerk Municipal Court Departments Income Tax Home Building and Zoning Services Civil Service Commission Civilian Police Review Board Department of Development Department of Education Diversity and Inclusion Fire Division Finance and Management ADA Coordinator Human Resources Inspector General Columbus Public Health Neighborhoods Police Division Public Safety Public Service Public Utilities Recreation and Parks Technology Treasurer CTV GIS/Mapping Quick Links ADA Coordinator Alternative Crisis Response American Rescue Plan Buy City Property Campaign Finance Information CelebrateOne City Forms - Building Permits, Applications, Licenses City Job Center Columbus Mobile Food Vendor Program Columbus PUP Campaign Free Financial Counseling Garbage and Recycling GreenSpot Income Tax Home Keep Columbus Beautiful Media - Columbus Brand New Americans Police and Fire Police Chief Search Online Payments Public Safety Forms Public Utilities Forms Social Media Event Planning Guide Traffic Cameras GIS/Mapping (614) 645-3111 311 Go to the 311 Call Center (614) 645-3111 311 is also available on the CBUS 311 app Columbus › We Moved Home News Events Columbus › We Moved City of Columbus The page you're looking for has moved to our new website. Please visit https://new.columbus.gov . Connect with Columbus facebook twitter youTube watch live © 2024 City of Columbus, Ohio Disclaimer | Privacy | Feedback | ADA breaking news We're building you a new columbus.gov. Can't find what you're looking for? We're building you a new columbus.gov. Can't find what you're looking for? Navigate to new.columbus.gov. breaking news We're building you a new columbus.gov. Can't find what you're looking for? We're building you a new columbus.gov. Can't find what you're looking for? Navigate to new.columbus.gov. Navigate to new.columbus.gov. A A A Text Size " -3100,https://www.clevelandohio.gov/sites/default/files/forms_publications/Yearend2018CrimeStats.pdf?id=15004,Crime Statistics,Agency-Published Resources,"","",404,"","","","","","","","" -3101,https://www.clevelandohio.gov/CityofCleveland/Home/Government/CityAgencies/PublicSafety/Police/Contacts,Contact Info & Agency Meta,Info About Agencies,Cleveland Police Contact List | City of Cleveland Ohio,"",200,Home | City of Cleveland Ohio,"[""Cleveland Police Contact List""]","[""Utility Nav"", ""Main navigation"", ""Main navigation"", ""Breadcrumb"", ""Cleveland Police Contact List"", ""City of Cleveland"", ""Office Hours:"", ""I Want To""]","[""Menu"", ""Social"", ""Newsletter Sign Up"", ""Apply"", ""Pay"", ""Register"", ""Report"", ""Jump To""]",[],"[""Cookies Consent""]",[],"" -3102,https://insights.cincinnati-oh.gov/stories/s/quk6-rcaw,Use of Force Reports,Police & Public Interactions,Use of Force,"",200,CincyInsights,[],"[""Menu""]",[],[],[],[],Skip to main content Skip to footer links Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Menu Close Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Search Search Search Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Initiatives Results Cincy Sign In Sign In Menu Close Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Sign In Search Search This information will not be updated while the Cincinnati Police Department undergoes transfer to a new data management system. This dashboard displays information regarding Cincinnati Police Department ( CPD ) use of force over the past five years. Use of force can generally be defined as the means of compelling compliance or overcoming resistance to an officer’s command(s) in order to protect life or property or to take a person into custody. This data updates on the third of each month. This information will not be updated while the Cincinnati Police Department undergoes transfer to a new data management system. This dashboard displays information regarding Cincinnati Police Department ( CPD ) use of force over the past five years. Use of force can generally be defined as the means of compelling compliance or overcoming resistance to an officer’s command(s) in order to protect life or property or to take a person into custody. This data updates on the third of each month. -3103,https://www.columbuspolice.org/Reports/Results?from=1/1/2012&to=1/20/2022&loc=all&types=9,Crime Statistics,Agency-Published Resources,"Search by Location - Columbus, OH Division of Police Web Report Portal","",200,Error retrieving title: dictionary changed size during iteration,[],"[""Search by Location : Entire City""]",[],[],[],[],"Web Report Portal Home Search About Contact Web Report Portal Home Search About Contact Web Report Portal Home Search About Contact Search by Location : Entire City 581895 records returned from 1/1/2012 through 1/20/2022 Loading... CRNumber Description Victim Reported Location 111096719.1 Burglary - Zone 1 David Trent 01/01/2012 2736 Christine Blvd 120000106.1 Burglary - Zone 4 - ATTEMPT Krizzia Yanga 01/01/2012 126.5 Frambes Ave 111096527.1 Menacing JUVENILE VICTIM 01/01/2012 1073 E 17th Ave 120000191.1 Discharging Firearms 01/01/2012 1864 S Champion Ave 120000191.1 Discharging Firearms Regina James 01/01/2012 1864 S Champion Ave 120000591.1 Criminal Damaging Kenyada Littlejohn 01/01/2012 36 E Gay St 120000313.1 Miscellaneous Offense 01/01/2012 2080 Sunshine Pl 120000119.1 Discharged Firearms - Occupied Structure 01/01/2012 1988 Fairmont Ave 120000115.1 Criminal Damaging Joyce Walker 01/01/2012 3445 Penfield Rd 120000327.1 Criminal Damaging Donna Williams 01/01/2012 3404 Petzinger Rd 120000380.1 Assault Josh Cobb 01/01/2012 674 N High St 111096744.1 Assault Jennifer Gaietto 01/01/2012 5140 N High St 120000450.1 Criminal Damaging Teresa Jackson 01/01/2012 3341 E Broad St 120000326.1 Discharging Firearms 01/01/2012 3200 Haskell Dr 120000326.1 Discharging Firearms Marguerite Gudger 01/01/2012 3200 Haskell Dr 120000092.1 Criminal Damaging FREDRICK DEAN 01/01/2012 4302 Meadowview Ct 120000447.1 Assault Sherrry Vinson 01/01/2012 1445 Irene Pl 120000137.1 Burglary - Zone 3 [E] PCJD, LLC 01/01/2012 1130 Auto Mall Dr 120000300.1 Criminal Damaging Kamel Ansara 01/01/2012 4644 Blairfield Dr 120000627.1 Burglary - Zone 2 Nicole Creighton 01/01/2012 251 E Innis Ave 12205324CPD.1 Lost / Stolen Property Bunty Shrestha 01/01/2012 2679 Club Lane Dr 111096731.1 Burglary - Zone 1 Myron Pollard 01/01/2012 6159 Fortin Ct 120000480.1 Burglary - Zone 2 [E] Bexley Plaza Apt 01/01/2012 3013 Ruhl Ave 120000480.1 Burglary - Zone 2 Luc Kibibi 01/01/2012 3013 Ruhl Ave 120000363.1 Assault JUVENILE VICTIM 01/01/2012 W Mound St & Whitethorne Ave 120000693.1 Burglary - Zone 3 Iesha Sanders 01/01/2012 803 Wedgewood Dr Apt 7 120000666.1 Assault Nicholas Karnes 01/01/2012 8765 Smoky Row Rd 120000666.1 Assault Jesika Myatt 01/01/2012 8765 Smoky Row Rd 120000377.1 Assault Jacqueline Kruse 01/01/2012 270/ Main St 1 2 3 4 5 6 7 8 9 10 ... © 2024 - Columbus, OH Division of Police Loading... Loading... " -3104,https://www.charleston-sc.gov/973/Contact-Us,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -3105,https://www.cheyennepd.org/About-Us/Contact/General-Information,Contact Info & Agency Meta,Info About Agencies,General Information – Cheyenne Police Department,"Physical Address:415 West 18th StreetCheyenne, WY 82001Phone:637-6500E-Mail: info@cheyennepd.org Call Monday-Friday from 8-5 for general department requests. If you're wanting to report a crime or suspicious activity, use the dispatch number at 307-637-6525.",200,Home – Cheyenne Police Department,"[""General Information""]",[],"[""Contact"", ""Social Media""]",[],[],[],"opens in new tab or window Skip to main content City of Cheyenne Police Department - Home - Logo Menu Search Your CPD Sub-menu Mission Statement & History Fallen Officers Contact Annual Reports Services Sub-menu Online Crime Reporting Delayed Accident Reports Parking Sub-menu Parking Frequently Asked Questions Records Victim Assistance Alarm Enforcement Information A Guide to the Citizen Complaint Process Get Involved Sub-menu Ride-Alongs Citizens On Patrol Citizens Police Academy Cheyenne Neighborhood Night Out Citizen Connect Crime Map Crime Prevention Brochures Community Partnerships Employment Sub-menu Join the CPD Lateral Applicants Salary Ranges & Benefits News Sub-menu Police Department Press Releases You Are Here : Home / Your CPD / Contact / General Information Listen General Information Physical Address: 415 West 18th Street Cheyenne, WY 82001 Phone: 637-6500 E-Mail: info@cheyennepd.org Call Monday-Friday from 8-5 for general department requests.  If you're wanting to report a crime or suspicious activity, use the dispatch number at 307-637-6525. Back to top Contact Cheyenne Police Department 415 West 18th Street Cheyenne, WY 82001 For Emergencies In case of an emergency, dial 9-1-1 For Non-Emergency Police Response General Department Requests: (307) 637-6500 Social Media Facebook Instagram Twitter Privacy Statement | Terms of Use | Social Media Guidelines © 2024 City of Cheyenne Police Department | Powered by Granicus Skip to main content City of Cheyenne Police Department - Home - Logo Menu Search Your CPD Sub-menu Mission Statement & History Fallen Officers Contact Annual Reports Services Sub-menu Online Crime Reporting Delayed Accident Reports Parking Sub-menu Parking Frequently Asked Questions Records Victim Assistance Alarm Enforcement Information A Guide to the Citizen Complaint Process Get Involved Sub-menu Ride-Alongs Citizens On Patrol Citizens Police Academy Cheyenne Neighborhood Night Out Citizen Connect Crime Map Crime Prevention Brochures Community Partnerships Employment Sub-menu Join the CPD Lateral Applicants Salary Ranges & Benefits News Sub-menu Police Department Press Releases You Are Here : Home / Your CPD / Contact / General Information Listen General Information Physical Address: 415 West 18th Street Cheyenne, WY 82001 Phone: 637-6500 E-Mail: info@cheyennepd.org Call Monday-Friday from 8-5 for general department requests.  If you're wanting to report a crime or suspicious activity, use the dispatch number at 307-637-6525. Back to top Contact Cheyenne Police Department 415 West 18th Street Cheyenne, WY 82001 For Emergencies In case of an emergency, dial 9-1-1 For Non-Emergency Police Response General Department Requests: (307) 637-6500 Social Media Facebook Instagram Twitter Privacy Statement | Terms of Use | Social Media Guidelines © 2024 City of Cheyenne Police Department | Powered by Granicus Skip to main content City of Cheyenne Police Department - Home - Logo Menu Search City of Cheyenne Police Department - Home - Logo Menu Search City of Cheyenne Police Department - Home - Logo Menu Search Search Search " -3106,https://www.dekalbcountyga.gov/sites/default/files/2020-06/Employee.Manual.6.12.20_0.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3107,https://data.charlottenc.gov/datasets/officer-traffic-stops/explore,Stops,Police & Public Interactions,Officer Traffic Stops,"CMPD conducts an average of 120,000 traffic stops per year. Under North Carolina state law (G.S. 143B-902-903), the CMPD as well as other law enforcement agencies in the state are required to collect information on all traffic stops, the reason for the stop, and the type of enforcement action taken. Information on the driver’s sex, race, ethnicity, and age is collected, compiled, and reported to the NC Department of Justice. Information on whether the driver or passenger(s) were searched is also collected. For more information, please visit http://charlottenc.gov/CMPD/Pages/Resources/OpenData_Source.aspx CMPD is committed to deploying traffic officers to areas where we experience high crime and victimization. Our focus is also in the geographical areas where concerns are reported by community members. We as a police department have a responsibility to those communities, to address their concerns and take appropriate enforcement action in an effort to keep their neighborhoods safe. Additionally, we are not only reacting to crime but proactively engaging in strategies that are intended to prevent criminal activity from occurring by placing officers in areas with a greater statistical history of crime.",200,City of Charlotte Open Data Portal,[],[],[],[],[],[],"" -3108,https://www.arcgis.com/apps/webappviewer/index.html?id=08e190dc29de42eea5322b7ff798319e,Crime Maps & Reports,Agency-Published Resources,ArcGIS Web Application,"",200,"","[""""]",[],[],[],[],[],"" -3109,https://home.chicagopolice.org/statistics-data/public-arrest-data/,Arrest Records,Police & Public Interactions,"","",403,"","","","","","","","" -3110,https://home.chicagopolice.org/inside-cpd/use-of-force-policy/,Policies & Contracts,Info About Agencies,"","",403,"","","","","","","","" -3111,https://policedata.coloradosprings.gov/Crime/Crime-Level-Data/bc88-hemr,Crime Statistics,Agency-Published Resources,Crime Level Data | Tyler Data & Insights,"",200,Tyler Data & Insights,"[""Colorado Springs Crime Map"", ""Crimes by Neighborhood"", ""Crimes Against People"", ""Crimes Against Property"", ""Offenses by Month"", ""Crimes Against Society"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Crime Level Data"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Crime Level Data"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Disclaimers and Explanations of Crime Data …"", ""Crimes Against Persons, Property, and Society …"", ""Attachments"", ""Topics"", ""Disclaimers and Explanations of Crime Data …"", ""Crimes Against Persons, Property, and Society …""]",[],[],"[""OData Endpoint""]","Skip to Main Content Sign In Home Page About ""How do I...?"" Videos Developer Resources Menu Menu Close Home Page About ""How do I...?"" Videos Developer Resources Sign In Search Sign In Home Page About ""How do I...?"" Videos Developer Resources Menu Sign In Home Page About ""How do I...?"" Videos Developer Resources Menu Sign In Sign In Home Page About ""How do I...?"" Videos Developer Resources Menu Close Home Page About ""How do I...?"" Videos Developer Resources Sign In Search Home Page About ""How do I...?"" Videos Developer Resources Sign In Search Home Page About ""How do I...?"" Videos Developer Resources Sign In Search Search " -3112,https://www.columbus.gov/police-internalaffairsbureau/,Complaints & Misconduct,Info About Officers,Columbus Division of Police Internal Affairs Bureau,"",200,"Home - City of Columbus, Ohio","[""City of Columbus""]","[""We're building you a new columbus.gov. Can't find what you're looking for?"", ""We're building you a new columbus.gov. Can't find what you're looking for?"", ""(614) 645-3111"", ""Council Members"", ""(614) 645-3111"", ""Go to the 311 Call Center"", ""(614) 645-3111"", ""311 is also available on the CBUS 311 app""]","[""Navigate to new.columbus.gov."", ""Division of Police""]",[],[],[],"" -3113,https://www.clevelandohio.gov/CityofCleveland/Home/Government/CityAgencies/PublicSafety/Police/PolicyProcedures,Policies & Contracts,Info About Agencies,Policy & Procedures | City of Cleveland Ohio,"",200,Home | City of Cleveland Ohio,"[""Policy & Procedures""]","[""Utility Nav"", ""Main navigation"", ""Main navigation"", ""Breadcrumb"", ""Policy & Procedures"", ""City of Cleveland"", ""Office Hours:"", ""I Want To""]","[""Menu"", ""Table of Contents and GPO Index"", ""Investigations"", ""4.1 CRIMINAL INVESTIGATIONS"", ""4.2 DRUG/VICE INVESTIGATION"", ""Juvenile Procedures"", ""Legal"", ""2.1 USE OF FORCE"", ""2.2 SEARCH AND SEIZURE"", ""2.3 SUBPOENAS AND COURT"", ""New Revisions - General Police Order"", ""CHAPTER 1 ADMINISTRATIVE"", ""CHAPTER 2 LEGAL"", ""CHAPTER 3 ARRESTEES"", ""CHAPTER 4 FIELD OPERATIONS"", ""CHAPTER 5 FIELD INVESTIGATIONS"", ""CHAPTER 6 PROPERTY"", ""CHAPTER 7 COMMUNICATIONS"", ""ORGANIZATION AND MANAGEMENT"", ""1.1 ADMINISTRATION"", ""1.2 ORGANIZATION"", ""1.3 MANAGEMENT"", ""LEGAL"", ""2.1 USE OF FORCE"", ""2.2 SEARCH AND SEIZURE"", ""2.3 SUBPOENAS AND COURT"", ""PATROL"", ""3.1 ZONE CARS"", ""3.2 PATROL PROCEDURES"", ""3.3 DISTURBANCE AND DISASTERS"", ""3.4 ENFORCEMENT"", ""INVESTIGATIONS"", ""4.1 CRIMINAL INVESTIGATIONS"", ""4.2 DRUG/VICE INVESTIGATION"", ""REPORTING PROCEDURES"", ""6.1 NON-CRIMINAL REPORTS"", ""6.2 CRIME REPORTS"", ""TRAFFIC"", ""8.1 ACCIDENTS"", ""8.2 ENFORCEMENT"", ""COMMUNICATIONS"", ""9.1 POLICE RADIO"", ""9.2 LEADS"", ""PROPERTY"", ""x10.1 EVIDENCE"", ""x10.2 SEIZED/FORFEITED PROPERTY"", ""x10.3 DIVISION OF POLICE PROPERTY"", ""Social"", ""Newsletter Sign Up"", ""Apply"", ""Pay"", ""Register"", ""Report"", ""Jump To""]","[""1.01 Organization and Management"", ""1.02 Human Resources"", ""1.03 Training and Education"", ""1.04 Uniforms and Grooming"", ""1.07 Member Conduct"", ""2.01 USE OF FORCE"", ""2.02 SEARCH AND SEIZURE"", ""2.03 SUBPOENAS AND COURT"", ""3.01 RESTRAINT AND TRANSPORT"", ""3.02 MEDICAL-HOSPITAL PROCEDURES"", ""3.03 BOOKING-PROCESSING"", ""3.04 CHARGING-RELEASING"", ""4.01 EMERGENCY DRIVING"", ""4.02 SPECIALIZED UNITS AND PROGRAMS"", ""4.03 MUTUAL AID"", ""4.04 PATROL DUTIES"", ""4.05 SUPERVISOR DUTIES"", ""4.06 EQUIPMENT AND INSPECTIONS"", ""4.07 FIELD OPERATIONS"", ""4.08 MISCELLANEOUS"", ""5.03 TRAFFIC ENFORCEMENT"", ""5.05 DOMESTIC VIOLENCE AND PROTECTION ORDERS"", ""5.07 SEX CRIMES AND CHILD ABUSE"", ""5.08 WEAPONS/FIREARMS"", ""5.09 DRUG/VICE"", ""5.10 CRIME SCENE PRESERVATION/PROCESSING"", ""5.11 CRISIS INTERVENTION"", ""5.12 SPECIAL POPULATIONS"", ""5.15 OTHER INVESTIGATIONS"", ""6.01 GENERAL"", ""6.02 EVIDENCE"", ""6.03 VEHICLES"", ""6.04 DIVISION PROPERTY"", ""7.01 RADIO"", ""7.02 DATABASES"", ""7.03 COMPUTER USE - DISCLOSURE OF INFORMATION""]","[""Cookies Consent""]",[],"" -3114,https://www.dekalbcountyga.gov/police-services/contact-us ,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -3115,https://clevelandgis.maps.arcgis.com/apps/webappviewer/index.html?id=5cd6bf3491c1493084e1090cbd03e2c4,Calls for Service,Police & Public Interactions,ArcGIS Web Application,"",200,Error retrieving title: 'NoneType' object has no attribute 'text',"[""""]",[],[],[],[],[],"" -3116,https://opendata.columbus.gov/,List of Data Sources,Info About Agencies,"GIS Open Data Columbus, OH",City of Columbus Maps & Apps Open Data Site,200,"GIS Open Data Columbus, OH",[],[],[],[],[],[],"" -3117,https://policedata.coloradosprings.gov/stories/s/Arrests/kh4i-nmaz,Arrest Records,Police & Public Interactions,Arrests,"",200,Tyler Data & Insights,"[""Arrests""]","[""Menu"", ""More to come..."", ""Arrest Datasets"", ""Arrest Charts""]",[],[],[],[],"Skip to main content Skip to footer links Sign In Home Page About ""How do I...?"" Videos Developer Resources Menu Menu Close Home Page About ""How do I...?"" Videos Developer Resources Sign In Search Sign In Home Page About ""How do I...?"" Videos Developer Resources Menu Sign In Home Page About ""How do I...?"" Videos Developer Resources Menu Sign In Sign In Home Page About ""How do I...?"" Videos Developer Resources Menu Close Home Page About ""How do I...?"" Videos Developer Resources Sign In Search Home Page About ""How do I...?"" Videos Developer Resources Sign In Search Home Page About ""How do I...?"" Videos Developer Resources Sign In Search Search Arrests More to come... This page currently gives users a quick way to review arrest datasets and charts CSPD has already made of arrest data. Content is still under development. Arrest Datasets Users may want to create their own charts or otherwise independently analyze CSPD's arrest data. You can follow the links below to quickly access the two available arrest datasets. Arrest Dataset--Subject Level Arrest Dataset--All Offenses Arrest Charts Users can click on the ""filter"" feature to drill further into the chart. Arrests More to come... This page currently gives users a quick way to review arrest datasets and charts CSPD has already made of arrest data. Content is still under development. Arrest Datasets Users may want to create their own charts or otherwise independently analyze CSPD's arrest data. You can follow the links below to quickly access the two available arrest datasets. Arrest Dataset--Subject Level Arrest Dataset--All Offenses Arrest Charts Users can click on the ""filter"" feature to drill further into the chart. Arrests Arrests Arrests Arrests Arrests Arrests Arrests More to come... This page currently gives users a quick way to review arrest datasets and charts CSPD has already made of arrest data. Content is still under development. More to come... This page currently gives users a quick way to review arrest datasets and charts CSPD has already made of arrest data. Content is still under development. More to come... This page currently gives users a quick way to review arrest datasets and charts CSPD has already made of arrest data. Content is still under development. More to come... This page currently gives users a quick way to review arrest datasets and charts CSPD has already made of arrest data. Content is still under development. This page currently gives users a quick way to review arrest datasets and charts CSPD has already made of arrest data. Content is still under development. Arrest Datasets Users may want to create their own charts or otherwise independently analyze CSPD's arrest data. You can follow the links below to quickly access the two available arrest datasets. Arrest Dataset--Subject Level Arrest Dataset--All Offenses Arrest Charts Users can click on the ""filter"" feature to drill further into the chart. " -3119,https://app.powerbigov.us/view?r=eyJrIjoiZGFjYzhmYjktNTIxMC00YTI1LTkxZWQtODg5YjM2NzEyNmI3IiwidCI6ImRhMDFjYTNmLTZhMjctNGNmYS1hYmY4LTFjYTcwMzY1YmEyYSJ9&pageName=ReportSection380233b1758ed6af63f6,Complaints & Misconduct,Info About Officers,Microsoft Power BI,"",200,Power BI,[],[],[],[],[],[],"" -3120,https://www.clevelandohio.gov/CityofCleveland/Home/Government/CityAgencies/OPS/Publications,Complaints & Misconduct,Info About Officers,"","",404,"","","","","","","","" -3121,https://www.charleston-sc.gov/DocumentCenter/View/29994/CPD-Annual-Report-2020,Stops,Police & Public Interactions,"","",200,"","","","","","","","" -3122,https://insights.cincinnati-oh.gov/stories/s/c64e-ybfz,Officer Involved Shootings,Police & Public Interactions,Police Firearm Discharge,"",200,CincyInsights,[],"[""Menu""]",[],[],[],[],"Skip to main content Skip to footer links Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Menu Close Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Search Search Search Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Initiatives Results Cincy Sign In Sign In Menu Close Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Sign In Search Search This information is not updated while the Cincinnati Police Department undergoes transfer to a new data management system. This dashboard displays information for each time a Cincinnati Police Department ( CPD ) officer discharges a firearm, whether on or off duty. It includes all police firearm discharges that occurred within the last five years. This may include accidental and intentional discharges. This information is not updated while the Cincinnati Police Department undergoes transfer to a new data management system. This dashboard displays information for each time a Cincinnati Police Department ( CPD ) officer discharges a firearm, whether on or off duty. It includes all police firearm discharges that occurred within the last five years. This may include accidental and intentional discharges. This information is not updated while the Cincinnati Police Department undergoes transfer to a new data management system. This information is not updated while the Cincinnati Police Department undergoes transfer to a new data management system. This information is not updated while the Cincinnati Police Department undergoes transfer to a new data management system. This information is not updated while the Cincinnati Police Department undergoes transfer to a new data management system. This information is not updated while the Cincinnati Police Department undergoes transfer to a new data management system. " -3123,https://www.cincinnati-oh.gov/sites/police/assets/File/Procedures/13100.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3124,https://public.powerdms.com/CPD5/tree,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by -3125,http://www.charlestonwvpolice.org/contact.html,Contact Info & Agency Meta,Info About Agencies,Charleston Police Department - Contact,"The Charleston West Virginia Police Department. We are Located at 501 Virginia Street East, Charleston WV 25301. Our Goal is to make the City of Charleston a safer place to work and live in.",200,Charleston Police Department,"[""CPD Directory""]","[""Contacts""]",[],"[""Metro 911 Emergency"", ""Non Emergency"", ""Booking (Prisoner Processing)"", ""Chief's Office"", ""Community Policing and Bureau Chief"", ""Crash Investigations"", ""Criminal Investigations"", ""Domestic Violence"", ""Fleet Management"", ""Highway Safety"", ""Humane Officers"", ""Hybrid Unit"", ""I.T. Department"", ""K9 Unit"", ""MDENT (Drug Enforcement Unit)"", ""NAO Volunteers"", ""Patrol Division Bureau Chief"", ""Patrol Division - Shift Commander"", ""Professional Standards"", ""Property & Evidence"", ""Records"", ""Safety City"", ""Special Enforcement Unit (Vice)"", ""Special Events Coordinator"", ""Traffic Division"", ""Training Division"", ""Uniformed Services Bureau Chief"", ""Warrants Division"", ""Fax - Chief's Office"", ""Fax - CID"", ""Fax - Community Services"", ""Fax - Grants Office"", ""Fax - Highway Safety"", ""Fax - Warrants Division""]","[""« Back"", ""« Back"", ""« Back"", ""« Back"", ""« Back"", ""Charleston Police Department"", ""Contact Info""]",[],Chief's Office Chief's Staff Civil Service History In Memory Professional Standards CPD Employment Records Policing Community Services File A Report Highway Safety Patrol Division Warrants Investigations Criminal Investigations Special Enforcement Sex Offender Search Contact Directory Feedback Provide A Tip Menu Chief's Office « Back Chief's Office Chief's Staff Civil Service History In Memory Professional Standards CPD « Back CPD Employment Records Policing « Back Policing Community Services File A Report Highway Safety Patrol Division Warrants Investigations « Back Investigations Criminal Investigations Special Enforcement Sex Offender Search Contact « Back Contact Directory Feedback Provide A Tip CPD Directory Numbers and links to each specific department. Contacts Metro 911 Emergency 911 Non Emergency 304-348-8111 Booking (Prisoner Processing) 304-348-6409 Chief's Office 304-348-6460 Community Policing and Bureau Chief 304-348-6470 Crash Investigations 304-348-6470 Criminal Investigations 304-348-6480 Domestic Violence 304-348-6480 Fleet Management 304-348-8000 ext 218 Highway Safety 304-348-6470 Humane Officers 304-348-6470 Hybrid Unit 304-348-6470 I.T. Department 304-348-6473 K9 Unit 304-348-0779 MDENT (Drug Enforcement Unit) 304-348-6814 NAO Volunteers 304-348-6470 Patrol Division Bureau Chief 304-347-1819 Patrol Division - Shift Commander 304-348-6826 Professional Standards 304-348-6826 Property & Evidence 304-348-6827 Records 304-348-6400 Safety City 304-348-6801 Special Enforcement Unit (Vice) 304-348-0530 Special Events Coordinator 304-348-8000 ext 246 Traffic Division 304-348-6470 Training Division 304-348-1091 Uniformed Services Bureau Chief 304-347-1819 Warrants Division 304-348-6402 Fax - Chief's Office 304-348-6416 Fax - CID 304-348-0743 Fax - Community Services 304-348-6805 Fax - Grants Office 304-720-7075 Fax - Highway Safety 304-348-6805 Fax - Warrants Division 304-348-6403 1 2 3 Chief's Office Chief's Staff Civil Service History In Memory Professional Standards CPD Employment Records Policing Community Services File A Report Highway Safety Patrol Division Warrants Investigations Criminal Investigations Special Enforcement Sex Offender Search Contact Directory Feedback Provide A Tip Menu Chief's Office « Back Chief's Office Chief's Staff Civil Service History In Memory Professional Standards CPD « Back CPD Employment Records Policing « Back Policing Community Services File A Report Highway Safety Patrol Division Warrants Investigations « Back Investigations Criminal Investigations Special Enforcement Sex Offender Search Contact « Back Contact Directory Feedback Provide A Tip CPD Directory Numbers and links to each specific department. Contacts Metro 911 Emergency 911 Non Emergency 304-348-8111 Booking (Prisoner Processing) 304-348-6409 Chief's Office 304-348-6460 Community Policing and Bureau Chief 304-348-6470 Crash Investigations 304-348-6470 Criminal Investigations 304-348-6480 Domestic Violence 304-348-6480 Fleet Management 304-348-8000 ext 218 Highway Safety 304-348-6470 Humane Officers 304-348-6470 Hybrid Unit 304-348-6470 I.T. Department 304-348-6473 K9 Unit 304-348-0779 MDENT (Drug Enforcement Unit) 304-348-6814 NAO Volunteers 304-348-6470 Patrol Division Bureau Chief 304-347-1819 Patrol Division - Shift Commander 304-348-6826 Professional Standards 304-348-6826 Property & Evidence 304-348-6827 Records 304-348-6400 Safety City 304-348-6801 Special Enforcement Unit (Vice) 304-348-0530 Special Events Coordinator 304-348-8000 ext 246 Traffic Division 304-348-6470 Training Division 304-348-1091 Uniformed Services Bureau Chief 304-347-1819 Warrants Division 304-348-6402 Fax - Chief's Office 304-348-6416 Fax - CID 304-348-0743 Fax - Community Services 304-348-6805 Fax - Grants Office 304-720-7075 Fax - Highway Safety 304-348-6805 Fax - Warrants Division 304-348-6403 1 2 3 -3126,http://directives.chicagopolice.org/#search,Policies & Contracts,Info About Agencies,Unified Front End,"",200,Error retrieving title: dictionary changed size during iteration,"[""Chicago Police Department""]","[""Department Directives System""]","[""Loading application ...""]",[],[],[],Chicago Police Department Department Directives System Loading application ... Chicago Police Department Department Directives System Loading application ... Chicago Police Department Department Directives System Loading application ... Chicago Police Department Department Directives System Loading application ... -3127,https://informationportal.igchicago.org/complaint-and-administrative-notification-trends-and-statistics/,Complaints & Misconduct,Info About Officers,"","",404,"","","","","","","","" -3128,https://www.crimemapping.com/map/agency/65,Crime Maps & Reports,Agency-Published Resources,CrimeMapping.com - Helping You Build a Safer Community,"",200,CrimeMapping.com - Helping You Build a Safer Community,"[""My Map Summary"", ""What"", ""Where"", ""When"", ""Display Options"", ""Location Selection"", ""Choose a Search Distance"", ""Timeframe Settings"", ""From:"", ""To:""]",[],[],[],[],[],"Preparing Map Content... Preparing Map Content... Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select City of Charlotte, State of North Carolina DOT, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Receive Alerts Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select City of Charlotte, State of North Carolina DOT, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Distance: Miles select Distance: Miles select Streets select City of Charlotte, State of North Carolina DOT, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to City of Charlotte, State of North Carolina DOT, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to City of Charlotte, State of North Carolina DOT, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Zoom to Zoom to Zoom to Zoom to 1:36111 Fetching Data. x Close Fetching Data. Fetching Data. Fetching Data. x Close Share This Map My Map Summary The sum of the What, Where, When you’ve chosen. What * Data not provided by agency within map extent Where Broward County Police Boundary When Previous 7 Days Friday, May 1 - Friday, May 8 Restore Defaults Display Options What type(s) of records would you like to see? Select All | Deselect All Arson Assault Burglary Disturbing the Peace Drugs / Alcohol Violations DUI Fraud Homicide Motor Vehicle Theft Robbery Sex Crimes Theft / Larceny Vandalism Vehicle Break-In / Theft Weapons Sex Offender Sexual Predator * Data not provided by agency within map extent Location Selection Enter an Address, Feature or Location. Choose a Search Distance 500 feet 1000 feet 1500 feet 1/4 mile 1/2 mile 1 mile 2 miles Apply Remove Location Filter Timeframe Settings From how far back would you like to see records? **Note** This will not apply to Sex Offender data. Yesterday Previous 3 Days Previous Week Previous 4 Weeks Custom Time Range From: select Monday, March 18, 2024 To: select Sunday, March 24, 2024 Apply " -3129,https://insights.cincinnati-oh.gov/stories/s/Closed-Citizen-Complaints/qurw-azge/,Complaints & Misconduct,Info About Officers,Closed Citizen Complaints,"",200,CincyInsights,[],"[""Menu""]",[],[],"[""How to use this dashboard"", ""About this data""]",[],Skip to main content Skip to footer links Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Menu Close Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Search Search Search Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Initiatives Results Cincy Sign In Sign In Menu Close Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Sign In Search Search -3130,https://data.cincinnati-oh.gov/Safety/Citizen-Complaint-Authority-CCA-Closed-Complaints/ii65-eyg6,Complaints & Misconduct,Info About Officers,Citizen Complaint Authority (CCA) Closed Complaints | Tyler Data & Insights,"",200,Cincinnati Open Data Portal | Tyler Data & Insights,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Citizen Complaint Authority (CCA) Closed Complaints"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Citizen Complaint Authority (CCA) Closed Complaints"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Closed Citizen Complaints …"", ""Attachments"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right."", ""Closed Citizen Complaints …""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Search Search Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Open Data How-To How-To Packet Video Guides Sign In Sign In Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Sign In Search Search -3131,https://public.powerdms.com/CPD5/tree/documents/599908,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by Powered by Powered by Powered by -3132,https://www.dallasopendata.com/browse?limitTo=datasets&q=police&tags=use+of+force,Use of Force Reports,Police & Public Interactions,"Results for ""police"", matching type of Datasets and topic of use of force | Page 1 of 1 | Dallas OpenData","Dallas OpenData is an invaluable resource for anyone to easily access data published by the City. We invite you to explore the continually growing datasets to help make Dallas a more accessible, transparent and collaborative community.",200,Dallas OpenData | Dallas OpenData,"[""Categories"", ""Tags""]","[""Menu"", ""View Types > Datasets"", ""Tags > use of force"", ""Sort"", ""Sort by Most Relevant"", ""Filter"", ""Authority"", ""Categories"", ""View Types"", ""Tags"", ""Police Response to Resistance 2015"", ""Police Response to Resistance 2019"", ""Police Response to Resistance 2013"", ""Police Response to Resistance 2018"", ""Police Response to Resistance 2016"", ""Police Response to Resistance 2017"", ""Police Response to Resistance 2014"", ""Police Response to Resistance 2020"", ""A-Z"", ""A-Z""]",[],[],[],[],Skip to main content Skip to footer links -3133,https://home.chicagopolice.org/statistics-data/data-dashboards/use-of-force-dashboard/,Use of Force Reports,Police & Public Interactions,"","",403,"","","","","","","","" -3134,https://www.dallaspolice.net/reports/Shared%20Documents/General-Order-906.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3135,https://data.charlottenc.gov/datasets/cmpd-officer-involved-shootings-incidents-1/explore?showTable=true,Officer Involved Shootings,Police & Public Interactions,City of Charlotte Open Data Portal,"Charlotte's Open Data Portal, The City of Charlotte's Open Data Portal allows users to search, explore and discover relevant datasets that are served out by the City of Charlotte, NC.",200,City of Charlotte Open Data Portal,[],[],[],[],[],[],"" -3136,https://insights.cincinnati-oh.gov/stories/s/8eaa-xrvz,Crime Statistics,Agency-Published Resources,Reported Crime,"",200,CincyInsights,[],"[""Menu""]",[],[],"[""How to use this dashboard"", ""About this data""]",[],Skip to main content Skip to footer links Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Menu Close Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Search Search Search Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Initiatives Results Cincy Sign In Sign In Menu Close Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Sign In Search Search -3137,https://www.wleacademy.com/,Policies & Contracts,Info About Agencies,Home | Wyoming Law Enforcement Academy,Welcome to the Wyoming Law Enforcement Academy website. Here you will find the needed information on Courses offered at the Academy. How to register and information realted to law enforcement in the State of Wyoming. ,200,Home | Wyoming Law Enforcement Academy,[],[],[],[],[],[],"" -3138,https://www.columbus.gov/police-annualreports/,Arrest Records,Police & Public Interactions,Annual Reports,"",200,"Home - City of Columbus, Ohio","[""City of Columbus""]","[""We're building you a new columbus.gov. Can't find what you're looking for?"", ""We're building you a new columbus.gov. Can't find what you're looking for?"", ""(614) 645-3111"", ""Council Members"", ""(614) 645-3111"", ""Go to the 311 Call Center"", ""(614) 645-3111"", ""311 is also available on the CBUS 311 app""]","[""Navigate to new.columbus.gov."", ""Division of Police""]",[],[],[],"" -3139,https://data.cityofchicago.org/,List of Data Sources,Info About Agencies,City of Chicago | Data Portal | City of Chicago | Data Portal,"",200,City of Chicago | Data Portal | City of Chicago | Data Portal,"[""Welcome!"", ""2024 Budget Ordinance"", ""2023 Ward Map"", ""Safe Chicago Bleeding Control Kits"", ""COVID-19"", ""Financial Incentive Projects"", ""Transportation Network Provider Trips"", ""311 Service Requests"", ""Mural Registry"", ""Traffic Crashes"", ""Freedom of Information Act (FOIA)""]","[""Menu"", ""Browse the data catalog by the following categories"", ""Chicago Apps"", ""About the Open Data Portal"", ""Open Data News & Updates"", ""Developer News""]","[""COPA Adds More Transparency with Police Complaint Data"", ""Share Maps You Create from OpenGrid"", ""Chicago Park District Expands Beach Water Quality Testing"", ""OpenGrid included in Mozilla Global Sprint 2017"", ""Preserve Public Data with Chicago’s RSocrata"", ""Starting Salary: New Employee Info on the Data Portal"", ""Dive in to a Redesigned Data Portal"", ""Dine al fresco with the Open Data Portal"", ""A Move to Main Branch (Source: Socrata)"", ""Violence Reduction Data Portal Visualizations Replaced by Violence Reduction Dashboard (Source: Chicago)"", ""Vacant and Abandoned Buildings Violations Corrections (Source: Chicago)"", ""COVID-19 Emergency Department Visits Reporting Change (Source: Chicago)"", ""COVID-19 Dataset Update Frequency Change (Source: Chicago)"", ""COVID-19 Vaccination New Age Groups (Source: Chicago)"", ""Energy Benchmarking Correction (Source: Chicago)"", ""Removing Age from Sex Offenders dataset (Source: Chicago)"", ""COVID-19 Daily Testing - By Person Becoming Historical-Only (Source: Chicago)"", ""COVID-19 Vaccination New Ethnic Groups (Source: Chicago)"", ""Removing Precinct from Sidewalk Cafe Permits dataset (Source: Chicago)"", ""Time Series Analysis with Jupyter Notebooks and Socrata (Source: Socrata)""]",[],[],[],Skip to main content Skip to footer links -3140,https://charlottenc.gov/CMPD/Safety/Pages/CrimeStats.aspx,Crime Statistics,Agency-Published Resources,Crime Statistics Report - Charlotte-Mecklenburg Police Department,Find the quarterly crime statistics for crime trends around Charlotte.,200,Home - City of Charlotte,"[""Crime Statistics Report"", ""CMPD Quarterly Statistical Report""]","[""Year-End 2023 Statistical Report"", ""3rd Quarter Statistics"", ""2nd Quarter Statistics"", ""1st Quarter Statistics"", ""End of the Year Reports""]","[""Contact Us"", ""Get Involved"", ""Share & Connect""]",[],[],[],opens in new tab or window -3141,https://data.cincinnati-oh.gov/,List of Data Sources,Info About Agencies,Cincinnati Open Data Portal | Tyler Data & Insights,"",200,Cincinnati Open Data Portal | Tyler Data & Insights,"[""Welcome to Open Data Cincinnati""]","[""Menu""]",[],"[""We invite you to explore all of the data in the following categories that reflect the priority goals we’ve established to facilitate the delivery of efficient, effective and improved customer services.""]",[],[],"Skip to main content Skip to footer links Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Welcome to Open Data Cincinnati We invite you to explore all of the data in the following categories that reflect the priority goals we’ve established to facilitate the delivery of efficient, effective and improved customer services. Safety undefined Growing Economic Opportunities undefined Thriving Neighborhoods undefined Efficient Service Delivery undefined Fiscal Sustainability undefined Browse All Data undefined Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Welcome to Open Data Cincinnati We invite you to explore all of the data in the following categories that reflect the priority goals we’ve established to facilitate the delivery of efficient, effective and improved customer services. Safety undefined Growing Economic Opportunities undefined Thriving Neighborhoods undefined Efficient Service Delivery undefined Fiscal Sustainability undefined Browse All Data undefined Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Search Search Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Open Data How-To How-To Packet Video Guides Sign In Sign In Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Sign In Search Search Welcome to Open Data Cincinnati We invite you to explore all of the data in the following categories that reflect the priority goals we’ve established to facilitate the delivery of efficient, effective and improved customer services. Safety undefined Growing Economic Opportunities undefined Thriving Neighborhoods undefined Efficient Service Delivery undefined Fiscal Sustainability undefined Browse All Data undefined Welcome to Open Data Cincinnati We invite you to explore all of the data in the following categories that reflect the priority goals we’ve established to facilitate the delivery of efficient, effective and improved customer services. Safety undefined Growing Economic Opportunities undefined Thriving Neighborhoods undefined Efficient Service Delivery undefined Fiscal Sustainability undefined Browse All Data undefined " -3142,https://home.chicagopolice.org/about/contact-us/,Contact Info & Agency Meta,Info About Agencies,"","",403,"","","","","","","","" -3143,https://www.dallasopendata.com/Public-Safety/Dallas-Police-Officer-Involved-Shootings/4gmt-jyx2/explore/query/SELECT%0A%20%20%60case%60%2C%0A%20%20%60date%60%2C%0A%20%20%60suspect_deceased_injured_or_shoot_and_miss%60%2C%0A%20%20%60suspect_weapon%60%2C%0A%20%20%60officer_s%60%2C%0A%20%20%60grand_jury_disposition%60%2C%0A%20%20%60ag_forms%60%2C%0A%20%20%60summary_url%60%2C%0A%20%20%60geolocation%60%2C%0A%20%20%60%3A%40computed_region_sjyw_rtbm%60%2C%0A%20%20%60%3A%40computed_region_2f7u_b5gs%60%2C%0A%20%20%60%3A%40computed_region_at43_7y52%60%2C%0A%20%20%60%3A%40computed_region_3qur_xvie%60%2C%0A%20%20%60%3A%40computed_region_28rh_izyk%60%0AORDER%20BY%20%60date%60%20DESC%20NULL%20LAST/page/filter,Officer Involved Shootings,Police & Public Interactions,Dallas Police Officer-Involved Shootings | Dallas OpenData,"",200,Dallas OpenData | Dallas OpenData,[],"[""Menu""]",[],[],[],[],Skip to Main Content Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Search Search Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Sign In Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Select a column to filter... Use text Use a number Use a boolean -3144,https://informationportal.igchicago.org/911-calls-for-cpd-service/,Calls for Service,Police & Public Interactions,911 Calls for CPD Service - Chicago Office of Inspector General,"",200,Error retrieving title: dictionary changed size during iteration,"[""911 Calls for CPD Service""]","[""What will you find here?"", ""Some questions that this dataset can answer are:"", ""Data Sources"", ""Our social media links""]","[""TALK-2-IG""]",[],[],[],"Stay in the know. Subscribe to the OIG Bulletin. Stay in the know. Subscribe to the OIG Bulletin. Stay in the know. Subscribe to the OIG Bulletin. Careers Online Intake Form Select Language Arabic Chinese (Simplified) English French German Hindi Italian Polish Russian Spanish Ukrainian Urdu About OIG About OIG Leadership Our Office Ordinance and Rules Careers History Diversity Statement Publications News Information Portal Information Portal Public Safety Dashboards City Finances Open OIG City Employees CPD Disciplinary Process Overview Contact Us Search 911 Calls for CPD Service Home > Information Portal > Public Safety Dashboards > 911 Calls for CPD Service What will you find here? When the Office of Emergency Management and Communications (OEMC) receives a 911 call, the dispatcher gathers information to form a clear understanding of the incident priority level. The information in these dashboards only includes service calls where a public safety unit was dispatched to the incident. Priority levels of calls are designated by 911 dispatchers at the OEMC. There are three main priority levels for calls resulting in a unit dispatch: Level 1: Immediate Dispatch for life-threatening emergencies Level 2: Rapid Dispatch for situations where timely public safety action has the potential to affect the outcome of an incident Level 3: Routine Dispatch when calls do not involve an immediate threat to life or bodily harm Some questions that this dataset can answer are: Which week in July 2020 had the highest number of Level 3 calls? What types of calls typically require Rapid Dispatch? Which police district receives the highest number of Level 1 calls? Data Sources OEMC Management Information System (MIS). Records begin January 1, 2020, and the data is typically refreshed daily between 4:00 PM and 11:59 PM CST. Data represents the information that is in the OEMC database as of the date of last update. 911 Calls by Geography 911 Calls for CPD Service Facebook X Email Share Our social media links Facebook Twitter Instagram Linkedin YouTube Report misconduct, waste, and abuse or share your suggestions to make City government better. Online Intake Form TALK-2-IG Address 740 N. Sedgwick, Suite 200 Chicago, IL 60654-2996 Hours Monday – Friday 9:00 a.m. – 5:00 p.m. Talk to Us (833) TALK-2-IG / (833) 825-5244 talk2ig@igchicago.org OIG Business Office Phone (773) 478-7799 OIG TTY Line (773) 478-2066 (TTY) Contact Us Accessibility Language Access Privacy Policy Terms of Use © 2024 Chicago Office of Inspector General. All rights reserved. Careers Online Intake Form Select Language Arabic Chinese (Simplified) English French German Hindi Italian Polish Russian Spanish Ukrainian Urdu Careers Online Intake Form Select Language Arabic Chinese (Simplified) English French German Hindi Italian Polish Russian Spanish Ukrainian Urdu Careers Online Intake Form Select Language Arabic Chinese (Simplified) English French German Hindi Italian Polish Russian Spanish Ukrainian Urdu About OIG About OIG Leadership Our Office Ordinance and Rules Careers History Diversity Statement Publications News Information Portal Information Portal Public Safety Dashboards City Finances Open OIG City Employees CPD Disciplinary Process Overview Contact Us Search " -3146,https://www.cincinnati-oh.gov/police/department-references/police-department-procedure-manual/12545/,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3147,https://www.dallasopendata.com/Public-Safety/Dallas-Police-Active-Calls/9fxf-t2tr,Calls for Service,Police & Public Interactions,Dallas Police Active Calls | Dallas OpenData,"",200,Dallas OpenData | Dallas OpenData,"[""Active Calls for Northeast Division / Dallas Police Department"", ""Active Calls for Central Division / Dallas Police Department"", ""Active Calls in DPD Northeast Division"", ""traffic"", ""Active Calls for Southeast Division / Dallas Police Department"", ""Active Calls for Southwest Division / Dallas Police Department"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Dallas Police Active Calls"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Dallas Police Active Calls"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Custom Metadata Fields"", ""Additional Information"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Search Search Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Sign In Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search -3149,https://coloradosprings.gov/police-department/page/police-department-contact-us,Contact Info & Agency Meta,Info About Agencies,"","",403,"","","","","","","","" -3151,http://pdi-charleston-sc.opendata.arcgis.com/search?groupIds=a6e2de25969e42ea812b7bf530754fb6&q=response%20to%20resistance,Use of Force Reports,Police & Public Interactions,City of Charleston,City of Charleston PD Open Data Site,200,City of Charleston,[],[],[],[],[],[],"" -3152,https://data.cincinnati-oh.gov/Safety/PDI-Police-Data-Initiative-Traffic-Stops-Drivers-/hibq-hbnj,Stops,Police & Public Interactions,PDI (Police Data Initiative) Traffic Stops (Drivers) | Tyler Data & Insights,"",200,Cincinnati Open Data Portal | Tyler Data & Insights,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""PDI (Police Data Initiative) Traffic Stops (Drivers)"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""PDI (Police Data Initiative) Traffic Stops (Drivers)"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Traffic Stops …"", ""Attachments"", ""Topics"", ""Licensing and Attribution"", ""Traffic Stops …""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Search Search Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Open Data How-To How-To Packet Video Guides Sign In Sign In Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Sign In Search Search -3153,https://dallaspolice.net/division/internalaffairs/racialprofiling,Complaints & Misconduct,Info About Officers,Internal Affairs Division,"",200," - - Home - -","[""Contact Form""]","[""Internal Affairs Division""]","[""Dallas Police Department"", ""Links"", ""Contact""]","[""Stay Connected"", ""Quick Links"", ""Resources""]",[],[],"Turn on more accessible mode Turn off more accessible mode Turn on more accessible mode Turn off more accessible mode City Hall News Libraries Parks Fire & Rescue Translate Select your language English Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hausa Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Lao Latin Latvian Lithuanian Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Persian Polish Portuguese Punjabi Romanian Russian Serbian Sesotho Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Yiddish Yoruba Zulu Join DPD Dallas Police Department It looks like your browser does not have JavaScript enabled. Please turn on JavaScript and try again. Toggle navigation Home About Divisions Currently selected Community Reports Resource Map Home Divisions Internal Affairs Internal Affairs Division The Internal Affairs Division is a staff unit commanded by Major Irene Alanis who reports directly to the Chief of Police.  The Internal Affairs Division has the responsibility of conducting independent administrative investigations of allegations of misconduct or critical incidents involving members of the Dallas Police Department.  The Internal Affairs Division will investigate external administrative complaints from all persons who are not members of law enforcement as determined by the Office of Community Police Oversight.  The procedures established for the handling of administrative complaints assures the thorough investigation of incidents to determine if an administrative violation occurred by a preponderance of the evidence.  The Internal Affairs Division makes certain due process is afforded to all members of the Dallas Police Department in the discipline process.  The member's chain of command determines and issues discipline. Internal Affairs maintains and reports statistical information on external administrative complaints and internal administrative investigations. 2022 Annual Report.pdf Internal Affairs collects and reports statistical information reported by officers involving contacts where an officer was required to use a control technique above compliant handcuffing. 2021 Response to Resistance Annual Report.pdf Several types of police related statistical data,  including officer involved shootings, is updated periodically and available to the public at DallasOpenData.com . ​​ Toggle navigation Links Internal Affairs Division Commend An Officer File A Complaint Not Satisfied with Decision Contact Dallas Police Department Internal Affairs Division 1400 Botham Jean Blvd. Dallas Texas 75215 Phone: (214) 671-3986 Fax: (214) 670-8219 E-mail: DPDIAD@dallascityhall.com Stay Connected DPDBeat.com Quick Links Divisions Community Join DPD Reports Media Relations Unit Resources Active Calls Victim Services Sex Offenders Safelight Program School Bus Stop Arm Parking Enforcement Dallas Auto Pound Curfew Hours for Minors Shoplift Forms Towing Uninsured Motorists TAAG - Council Districts TAAG - Divisions Hotline: 1-877-373-Tips WebTips: Submit a Tip Online © 2016-2024 Dallas Police Department. All Rights Reserved. Contact Webmaster . Contact Form Name Email Address Questions or Comments " -3154,https://policedata.coloradosprings.gov/Use-of-Force/Officer-Involved-Shootings/pzyt-rvyq,Officer Involved Shootings,Police & Public Interactions,Officer Involved Shootings | Tyler Data & Insights,"",200,Tyler Data & Insights,"[""Number of Officer Involved Shootings by Year"", ""Officer Involved Shootings Incident Level View"", ""Officer Involved Shootings Subject Level View"", ""Race and Ethnicity of Subjects in Officer Involved Shootings"", ""Subjects Armed in Officer Involved Shootings"", ""Primary Basis for Officer Involved Shootings"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Officer Involved Shootings"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Officer Involved Shootings"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Officer Involved Shootings …"", ""Number of Officer Involved Shootings by Year …"", ""Topics"", ""Oops, something isn't right."", ""Officer Involved Shootings …"", ""Number of Officer Involved Shootings by Year …""]",[],[],"[""OData Endpoint""]","Skip to Main Content Sign In Home Page About ""How do I...?"" Videos Developer Resources Menu Menu Close Home Page About ""How do I...?"" Videos Developer Resources Sign In Search Sign In Home Page About ""How do I...?"" Videos Developer Resources Menu Sign In Home Page About ""How do I...?"" Videos Developer Resources Menu Sign In Sign In Home Page About ""How do I...?"" Videos Developer Resources Menu Close Home Page About ""How do I...?"" Videos Developer Resources Sign In Search Home Page About ""How do I...?"" Videos Developer Resources Sign In Search Home Page About ""How do I...?"" Videos Developer Resources Sign In Search Search " -3156,https://data.charlottenc.gov/datasets/cmpd-calls-for-service/explore,Calls for Service,Police & Public Interactions,CMPD Calls for Service,"Charlotte's Open Data Portal, The City of Charlotte's Open Data Portal allows users to search, explore and discover relevant datasets that are served out by the City of Charlotte, NC.",200,City of Charlotte Open Data Portal,[],[],[],[],[],[],"" -3157,http://directives.chicagopolice.org/,Policies & Contracts,Info About Agencies,Unified Front End,"",200,Unified Front End,"[""Chicago Police Department""]","[""Department Directives System""]","[""Loading application ...""]",[],[],[],Chicago Police Department Department Directives System Loading application ... Chicago Police Department Department Directives System Loading application ... Chicago Police Department Department Directives System Loading application ... Chicago Police Department Department Directives System Loading application ... -3158,https://insights.cincinnati-oh.gov/stories/s/Police-All-Response-Activity/a4d9-vw5s,Calls for Service,Police & Public Interactions,Police: Calls for Service,"",200,CincyInsights,[],"[""Menu""]",[],[],"[""The CAD system upgraded resulting in new incident types. While we work with our systems to recognize the new incident type codes, \""Null\"" will be listed more frequently in the dashboard below."", ""About this data""]",[],Skip to main content Skip to footer links Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Menu Close Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Search Search Search Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Initiatives Results Cincy Sign In Sign In Menu Close Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Sign In Search Search -3159,https://data.charlottenc.gov/,List of Data Sources,Info About Agencies,City of Charlotte Open Data Portal,"Charlotte's Open Data Portal, The City of Charlotte's Open Data Portal allows users to search, explore and discover relevant datasets that are served out by the City of Charlotte, NC.",200,City of Charlotte Open Data Portal,[],[],[],[],[],[],"" -3161,https://www.clevelandohio.gov/sites/default/files/gpo/CHAPTER%202%20LEGAL/2.01%20USE%20OF%20FORCE/2.01.03%20Use%20of%20Force-General%20(r).pdf,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3162,https://dallaspolice.net/phonenumbers,Contact Info & Agency Meta,Info About Agencies,About - Contact,"",200," - - Home - -","[""Contact Form""]",[],"[""Dallas Police Department"", ""Patrol Divisions"", ""Jack Evans Police Headquarters"", ""North Central Division"", ""Northeast Operations Division"", ""Northwest Operations Division"", ""Southwest Patrol Division"", ""Southeast Operations Division"", ""Central Operations Division"", ""South Central Division"", ""Department Phone Numbers""]","[""Administrative & Support Services Bureau"", ""Investigations Bureau"", ""Other Numbers"", ""Patrol Bureau"", ""Storefronts"", ""Strategic Deployment Bureau"", ""Stay Connected"", ""Quick Links"", ""Resources""]",[],[],Turn on more accessible mode Turn off more accessible mode Turn on more accessible mode Turn off more accessible mode -3163,https://home.chicagopolice.org/statistics-data/crime-statistics/,Crime Statistics,Agency-Published Resources,"","",403,"","","","","","","","" -3165,https://policedata.coloradosprings.gov/Use-of-Force/Use-of-Force-Reports/ii9t-cvd6,Use of Force Reports,Police & Public Interactions,Use of Force Reports | Tyler Data & Insights,"",200,Tyler Data & Insights,"[""Number of Force Reports by Year"", ""Reason Force Used"", ""Subject Injury in Force Reports by Year"", ""Officer Injury in Force Reports by Year"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Use of Force Reports"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Use of Force Reports"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Use of Force Overview …"", ""Caution in Interpreting Force Data …"", ""Topics"", ""Oops, something isn't right."", ""Use of Force Overview …"", ""Caution in Interpreting Force Data …""]",[],[],"[""OData Endpoint""]","Skip to Main Content Sign In Home Page About ""How do I...?"" Videos Developer Resources Menu Menu Close Home Page About ""How do I...?"" Videos Developer Resources Sign In Search Sign In Home Page About ""How do I...?"" Videos Developer Resources Menu Sign In Home Page About ""How do I...?"" Videos Developer Resources Menu Sign In Sign In Home Page About ""How do I...?"" Videos Developer Resources Menu Close Home Page About ""How do I...?"" Videos Developer Resources Sign In Search Home Page About ""How do I...?"" Videos Developer Resources Sign In Search Home Page About ""How do I...?"" Videos Developer Resources Sign In Search Search " -3166,https://www.columbus.gov/police-contactlist/,Contact Info & Agency Meta,Info About Agencies,404 File Not Found,"",200,Error retrieving title: dictionary changed size during iteration,"[""File Not Found""]","[""The City of Columbus""]",[],[],[],[],"The City of Columbus File Not Found 404 – Oops! - -We’re sorry, but the page you are looking for does not exist. - -Please try using the navigation bar to browse the page you’re interested in, and then update any of your bookmarks, if necessary. - -Or navigate to new.columbus.gov to visit the new website. Facebook Twitter YouTube The City of Columbus File Not Found 404 – Oops! - -We’re sorry, but the page you are looking for does not exist. - -Please try using the navigation bar to browse the page you’re interested in, and then update any of your bookmarks, if necessary. - -Or navigate to new.columbus.gov to visit the new website. Facebook Twitter YouTube " -3167,https://www.clevelandohio.gov/CityofCleveland/Home/Government/CityAgencies/PublicSafety/Police/PublicationsInformation,Policies & Contracts,Info About Agencies,Links & Publications | City of Cleveland Ohio,"",200,Home | City of Cleveland Ohio,"[""Links & Publications""]","[""Utility Nav"", ""Main navigation"", ""Main navigation"", ""Breadcrumb"", ""Links & Publications"", ""City of Cleveland"", ""Office Hours:"", ""I Want To""]","[""Menu"", ""Budgets and Internal Audit(s)"", ""Cleveland Community Police Commission"", ""Cleveland Force Review Board"", ""Crisis Intervention and Mental Health Response Advisory Committee"", ""Division Recruiting"", ""Division Training"", ""2022 Training Curriculum:"", ""2021 Training Curriculum:"", ""Office of Professional Standards (OPS)"", ""Settlement Agreement"", ""2021 Monitor:"", ""2021 Semiannual Reports:"", ""2022 Reports:"", ""City and State Laws"", ""Cuyahoga County Links"", ""Cleveland Police History"", ""Wanted Criminals and Missing Persons"", ""Other Police Links"", ""Social"", ""Newsletter Sign Up"", ""Apply"", ""Pay"", ""Register"", ""Report"", ""Jump To""]",[],"[""Cookies Consent""]",[],"" -3168,http://gis.chicagopolice.org/,Crime Maps & Reports,Agency-Published Resources,CLEARMAP,"CLEARMAP aims to provide transparency, create easier access and expand awareness of criminal activity and criminal offender registrations in the City of Chicago. ",200,CLEARMAP,[],[],[],[],[],[],"" -3169,https://dekalbcounty.org/wp-content/uploads/2020/06/so-policy-use-of-force300.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3170,https://www.denvergov.org/content/denvergov/en/police-department/crime-information/crime-map.html,Crime Maps & Reports,Agency-Published Resources,Additional Crime Dashboards - City and County of Denver,"The following dashboard allows you to explore reported thefts in Denver pertaining to catalytic converter, bicycle theft, and package theft.",200,Home - City and County of Denver,"[""Additional Crime Dashboards""]","[""Various Theft Crime Dashboards"", ""Bias-Motivated Crime Dashboard""]","[""Denver City Government Closed Monday, March 25"", ""Contact 3-1-1"", ""Visit Other Denver Sites"", ""Share & Connect""]",[],[],[],"opens in new tab or window Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures " -3171,https://www.cincinnati-oh.gov/police/department-references/police-department-procedure-manual/,Policies & Contracts,Info About Agencies,Police Department Procedure Manual - Police,Police Procedure Manual,200,Home - City of Cincinnati,"["""", """", ""Police""]","[""Police Department Procedure Manual"", ""Police Department Procedure Manual"", ""Businesses"", ""Residents"", ""Services"", ""Government""]","[""Why Cincy?"", ""Process"", ""Small Business"", ""Approval"", ""Public Agencies"", ""Services"", ""Getting Around"", ""Auctions"", ""Forms"", ""Pay Now"", ""Sanitation"", ""Leadership"", ""Taxes"", ""Transparency"", ""Customer Service"", ""Emergency"", ""CincyAlert"", ""Why Cincy?"", ""Process"", ""Small Business"", ""Become SBE Certified Today"", ""Approval"", ""Public Agencies"", ""Services"", ""Fix It Cincy!"", ""Getting Around"", ""Cincinnati Parks"", ""Auctions"", ""Forms"", ""Pay Now"", ""Sanitation"", ""Leadership"", ""Taxes"", ""Transparency"", ""Jobs with the City"", ""Customer Service"", ""Emergency"", ""CincyAlert"", ""Police Menu"", ""The Cincinnati Police Department Procedure Manual"", """", ""Police Menu"", ""Frequently Asked Questions"", ""Why Cincy?"", ""Process"", ""Small Business"", ""Approval"", ""Public Agencies"", ""Services"", ""Auctions"", ""Forms"", ""Pay Now"", ""Sanitation"", ""Leadership"", ""Taxes"", ""Transparency"", ""Why Cincy?"", ""Process"", ""Small Business"", ""Approval"", ""Public Agencies"", ""Services"", ""Auctions"", ""Forms"", ""Pay Now"", ""Sanitation"", ""Leadership"", ""Taxes"", ""Transparency""]",[],[],[],"Skip to main content (Press Enter). Businesses Why Cincy? Business Expansion/Retention Incentives & Tax Credits Process City Purchases & Contracts Licenses & Permits OpenCincy Business Portal Property Search Vendor Registration Income Tax Small Business SBE Program Small Business Loans OpenCincy Small Business Portal Residents Approval Building Permits Guide Tax Abatements Zoning Public Agencies Neighborhood Services Historic Conservation Police Restaurant & Food Inspections Income Tax Services Cincy Code Enforcement CincyInsights Mobile App Online Service Requests Open Data Cincinnati Property Maintenance Recycling Smart911 CincyAlert Street Rehab Trash & Yard Waste Visitors Getting Around Hotels Upcoming Events Dining Shopping Cincinnati Zoo Fountain Square Cincinnati Museum Center Cincinnati Parks Services Auctions Fleet Auction Police Auctions Forms Birth & Death Certificates Building Permit Forms Damage Claims Event Permits Vendor Registration & Renewal Pay Now Income Taxes Law Department Collections Office Of Administrative Hearings Parking Tickets Water & Sewer Bill Payments Sanitation Recycling Trash & Yard Waste Government Leadership Mayor's Office City Council City Manager's Office Departments Boards & Commissions Elections Commission Taxes Income Tax Transparency Budget Documents CincyInsights City Charter & Municipal Code Equity Financial Reports (ACFRs) Ethics, Fraud, Waste and Abuse Hotline Open Data Cincy Public Records Transparency In Government HELP Customer Service Create a 311Cincy Service Request online, or call us 24/7. 311 or 513-765-1212 Emergency Call or text 911 for police, fire, or medical emergencies. Need support? If you or someone you know is struggling or in crisis, help is available. Call or text 988 or chat at 988lifeline.org . CincyAlert Register for alerts from the City of Cincinnati to be more informed and better prepared in the event of an emergency. Contact Us " -3173,https://www.dallasopendata.com/Public-Safety/Police-Arrests/sdr7-6v3j,Arrest Records,Police & Public Interactions,Police Arrests | Dallas OpenData,"",200,Dallas OpenData | Dallas OpenData,"[""Arrests 2020"", ""Arrests Near VFE/VAR"", ""Police_Arrest_2019"", ""ArrestsAfterMay28th"", ""Month Arrests"", ""318-319 BT-arrests"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Police Arrests"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Police Arrests"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Custom Metadata Fields"", ""Additional Information"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Search Search Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Sign In Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search -3174,https://www.dallasopendata.com/Public-Safety/Police-Incidents/qv6i-rri7,Calls for Service,Police & Public Interactions,Police Incidents | Dallas OpenData,"",200,Dallas OpenData | Dallas OpenData,"[""2020 homicides"", ""Public Safety - Police Incidents"", ""Bottled Blonde Police Incidents"", ""Zip Code 75287 Incidents"", ""Oak Lawn (Reporting Areas)"", ""Incident History for The Vineyards at Forest Edge"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Police Incidents"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Police Incidents"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Custom Metadata Fields"", ""Additional Information"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Search Search Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Sign In Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search -3175,https://www.cincinnati-oh.gov/police/contact-us/,Contact Info & Agency Meta,Info About Agencies,Contact Us - Police,"",200,Home - City of Cincinnati,"["""", """", ""Police""]","[""Contact Us"", ""Contact Us"", ""Businesses"", ""Residents"", ""Services"", ""Government""]","[""Why Cincy?"", ""Process"", ""Small Business"", ""Approval"", ""Public Agencies"", ""Services"", ""Getting Around"", ""Auctions"", ""Forms"", ""Pay Now"", ""Sanitation"", ""Leadership"", ""Taxes"", ""Transparency"", ""Customer Service"", ""Emergency"", ""CincyAlert"", ""Why Cincy?"", ""Process"", ""Small Business"", ""Become SBE Certified Today"", ""Approval"", ""Public Agencies"", ""Services"", ""Fix It Cincy!"", ""Getting Around"", ""Cincinnati Parks"", ""Auctions"", ""Forms"", ""Pay Now"", ""Sanitation"", ""Leadership"", ""Taxes"", ""Transparency"", ""Jobs with the City"", ""Customer Service"", ""Emergency"", ""CincyAlert"", ""Police Menu"", ""Cincinnati Police Department Contacts"", """", ""Police Menu"", ""Quick Contacts"", ""Frequently Asked Questions"", ""Why Cincy?"", ""Process"", ""Small Business"", ""Approval"", ""Public Agencies"", ""Services"", ""Auctions"", ""Forms"", ""Pay Now"", ""Sanitation"", ""Leadership"", ""Taxes"", ""Transparency"", ""Why Cincy?"", ""Process"", ""Small Business"", ""Approval"", ""Public Agencies"", ""Services"", ""Auctions"", ""Forms"", ""Pay Now"", ""Sanitation"", ""Leadership"", ""Taxes"", ""Transparency""]",[],[],[],"Skip to main content (Press Enter). Businesses Why Cincy? Business Expansion/Retention Incentives & Tax Credits Process City Purchases & Contracts Licenses & Permits OpenCincy Business Portal Property Search Vendor Registration Income Tax Small Business SBE Program Small Business Loans OpenCincy Small Business Portal Residents Approval Building Permits Guide Tax Abatements Zoning Public Agencies Neighborhood Services Historic Conservation Police Restaurant & Food Inspections Income Tax Services Cincy Code Enforcement CincyInsights Mobile App Online Service Requests Open Data Cincinnati Property Maintenance Recycling Smart911 CincyAlert Street Rehab Trash & Yard Waste Visitors Getting Around Hotels Upcoming Events Dining Shopping Cincinnati Zoo Fountain Square Cincinnati Museum Center Cincinnati Parks Services Auctions Fleet Auction Police Auctions Forms Birth & Death Certificates Building Permit Forms Damage Claims Event Permits Vendor Registration & Renewal Pay Now Income Taxes Law Department Collections Office Of Administrative Hearings Parking Tickets Water & Sewer Bill Payments Sanitation Recycling Trash & Yard Waste Government Leadership Mayor's Office City Council City Manager's Office Departments Boards & Commissions Elections Commission Taxes Income Tax Transparency Budget Documents CincyInsights City Charter & Municipal Code Equity Financial Reports (ACFRs) Ethics, Fraud, Waste and Abuse Hotline Open Data Cincy Public Records Transparency In Government HELP Customer Service Create a 311Cincy Service Request online, or call us 24/7. 311 or 513-765-1212 Emergency Call or text 911 for police, fire, or medical emergencies. Need support? If you or someone you know is struggling or in crisis, help is available. Call or text 988 or chat at 988lifeline.org . CincyAlert Register for alerts from the City of Cincinnati to be more informed and better prepared in the event of an emergency. Contact Us " -3176,https://www.charleston-sc.gov/DocumentCenter/View/30118/2020-Internal-Affairs-Annual-Report,Officer Involved Shootings,Police & Public Interactions,"","",200,"","","","","","","","" -3177,https://home.chicagopolice.org/statistics-data/data-dashboards/,Complaints & Misconduct,Info About Officers,"","",403,"","","","","","","","" -3178,https://www.cheyennepd.org/files/sharedassets/police/2019-annual-report.pdf,Crime Statistics,Agency-Published Resources,"","",200,"","","","","","","","" -3179,https://data.cityofchicago.org/Public-Safety/COPA-Cases-Summary/mft5-nfa8,Complaints & Misconduct,Info About Officers,COPA Cases - Summary | City of Chicago | Data Portal,"",200,City of Chicago | Data Portal | City of Chicago | Data Portal,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""COPA Cases - Summary"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""COPA Cases - Summary"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Civilian Office of Police Accountability …"", ""COPA Cases - By Complainant or Subject …"", ""COPA Cases - By Involved Officer …"", ""Metadata"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right."", ""Civilian Office of Police Accountability …"", ""COPA Cases - By Complainant or Subject …"", ""COPA Cases - By Involved Officer …""]",[],[],"[""OData Endpoint""]",Skip to Main Content Chicago Data Portal Sign In Browse Tutorial Feedback Menu Menu Close Browse Tutorial Feedback Sign In Search Chicago Data Portal Sign In Browse Tutorial Feedback Menu Chicago Data Portal Sign In Browse Tutorial Feedback Menu Sign In Sign In Browse Tutorial Feedback Menu Close Browse Tutorial Feedback Sign In Search Browse Tutorial Feedback Sign In Search Browse Tutorial Feedback Sign In Search Search -3180,https://www.clevelandohio.gov/sites/default/files/forms_publications/Use%20of%20Force%20Report%20May_17_2021.pdf,Use of Force Reports,Police & Public Interactions,"","",404,"","","","","","","","" -3181,https://charlottenc.gov/CMPD/Organization/Pages/OfcoftheChief/Internal-Affairs.aspx,Complaints & Misconduct,Info About Officers,"","",404,"","","","","","","","" -3182,https://charlottenc.gov/CMPD/Pages/default.aspx,Contact Info & Agency Meta,Info About Agencies,Home - Charlotte-Mecklenburg Police Department,"The goal of the Charlotte-Mecklenburg Police Department is to make Charlotte one of the safest large cities in America. To do that, we continually advance strategies that prevent crime. We find ways to engage the community in taking steps that help minimize opportunities for victimization. We explore appropriate policy direction with the Mayor and City Council. We seek solutions to the complex community problems that contribute to crime and disorder. And we enforce the laws and arrest the people who break them. The officers, staff and volunteers with the CMPD take very seriously their duty to provide citizens with professional, innovative and effective service. Community safety is a shared responsibility and we are committed to working in partnership with neighborhood residents and business owners as well as other local, state and federal agencies to reduce crime and increase safety.​",200,Home - City of Charlotte,"[""Home"", ""Featured"", ""Events"", ""News""]","[""Get Reports"", ""File A Report"", ""Join CMPD"", ""CMPD Newsroom"", ""Your Response Areas"", ""Share Feedback"", ""View Our Organization"", ""How to Become an Officer"", ""Animal Care & Control"", ""Community Meeting - Eastbrook Woods"", ""Free Rabies Clinic"", ""SouthPark Adoption Event"", ""Promise Youth Development"", ""Case Update: Homicide Detectives Investigating Triple Homicide"", ""Case Update: Homicide Detectives Investigating Triple Homicide"", ""Public's Assistance Requested in Missing Persons Investigation""]","[""Contact Us"", ""Get Involved"", ""Share & Connect""]",[],[],[],opens in new tab or window -3183,https://public.powerdms.com/CSPD2/tree?mlid=49916,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by -3184,http://www.charlestonwvpolice.org/images/Policy_Procedure_Redacted2021.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3186,https://charlottenc.gov/CMPD/Pages/Resources/DepartmentDirectives.aspx,Policies & Contracts,Info About Agencies,ePolicing Resources - Charlotte-Mecklenburg Police Department,Department reports and documents that highlight our successes and challenges throughout the years.,200,Home - City of Charlotte,"[""ePolicing Resources""]","[""Police Officer-Involved Shootings"", ""Officer Traffic Stops"", ""Employee Demographics"", ""Juvenile Diversion"", ""CMPD Community Event Calendar"", ""Crime Mapping"", ""Department Directives and Reports"", ""Department Directives"", ""Annual Reports"", ""Internal Affairs Reports"", ""Patrol Area Divisions"", ""Non-Emergency Police Services"", ""Report a Crime Online"", ""Share Feedback"", ""Request Body Worn Footage / 911 Calls for Service"", ""Records"", ""Traffic Accidents (Live)"", ""Crime / Crash Reports"", ""Employ an Off-Duty Officer"", ""Authorization to Act As An Agent"", ""ABC Unit"", ""Regulated Metal Ban Listing""]","[""Charlotte-Mecklenburg Police Officer-Involved Shootings"", ""CMPD Directives & Information"", ""Annual Reports"", ""Internal Affairs Reports"", ""Miscellaneous Documents for the Public"", ""Contact Us"", ""Get Involved"", ""Share & Connect""]",[],[],[],opens in new tab or window -3187,https://ody.dekalbcountyga.gov/app/JailSearch/#/search,Arrest Records,Police & Public Interactions,"","",-1,"","","","","","","","" -3188,https://charlottenc.gov/CMPD/Documents/Resources/RulesofConduct.pdf,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3189,https://coloradosprings-citywide.data.socrata.com/login,List of Data Sources,Info About Agencies,Tyler Data & Insights,"",200,Tyler Data & Insights,"[""Sign In to Tyler Data & Insights""]","[""Menu""]",[],[],[],[],Skip to main content Skip to footer links Sign In Home Page Menu Menu Close Home Page Sign In Search Sign In Home Page Menu Sign In Home Page Menu Sign In Sign In Home Page Menu Close Home Page Sign In Search Home Page Sign In Search Home Page Sign In Search Search Sign In to Tyler Data & Insights SSO Enabled Forgot Password? Sign In Don't have an account yet? Sign Up Sign In to Tyler Data & Insights SSO Enabled Forgot Password? Sign In Don't have an account yet? Sign Up Sign In to Tyler Data & Insights SSO Enabled Forgot Password? Sign In Don't have an account yet? Sign Up SSO Enabled Forgot Password? Sign In SSO Enabled SSO Enabled SSO Enabled Sign In Don't have an account yet? Sign Up ColoradoSprings.gov Privacy Policy Contact Us © 2024 ColoradoSprings.gov Privacy Policy Contact Us © 2024 © 2024 -3190,https://public.powerdms.com/CPD5/tree/documents/599935,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by Powered by Powered by Powered by -3191,https://www.columbus.gov/copta-lawenforcementtraining/,Policies & Contracts,Info About Agencies,Law Enforcement Training,"",200,"Home - City of Columbus, Ohio","[""City of Columbus""]","[""We're building you a new columbus.gov. Can't find what you're looking for?"", ""We're building you a new columbus.gov. Can't find what you're looking for?"", ""(614) 645-3111"", ""Council Members"", ""(614) 645-3111"", ""Go to the 311 Call Center"", ""(614) 645-3111"", ""311 is also available on the CBUS 311 app""]","[""Navigate to new.columbus.gov."", ""Police Academy""]",[],[],[],"" -3192,https://home.chicagopolice.org/statistics-data/isr-data/,Stops,Police & Public Interactions,"","",403,"","","","","","","","" -3193,https://web2.coloradosprings.gov/policeblotter/,Calls for Service,Police & Public Interactions,Colorado Springs Police Department Blotter,"",200,Home Page | City of Colorado Springs,"[""CSPD Police Blotter""]",[],[],[],[],[],"34130 Record ID 34130 Record ID 34130 Record ID March 23, 2024 Incident Date March 23, 2024 Incident Date March 23, 2024 Incident Date 18:00 Time 18:00 Time 18:00 Time Sand Creek -- Shift II Division Sand Creek -- Shift II Division Sand Creek -- Shift II Division Other Title Other Title Other Title 4800 block of Astrozon Blvd Location 4800 block of Astrozon Blvd Location 4800 block of Astrozon Blvd Location On 3/23/2024 Officers were investigating a disturbance between two residents in the 4800 block of Astrozon Blvd. While on scene a vehicle was in the area and several shots were fired. It is unknown if the vehicle was shooting at officers or the residence. At this time no damage was found, and no one was found injured. Summary On 3/23/2024 Officers were investigating a disturbance between two residents in the 4800 block of Astrozon Blvd. While on scene a vehicle was in the area and several shots were fired. It is unknown if the vehicle was shooting at officers or the residence. At this time no damage was found, and no one was found injured. Summary On 3/23/2024 Officers were investigating a disturbance between two residents in the 4800 block of Astrozon Blvd. While on scene a vehicle was in the area and several shots were fired. It is unknown if the vehicle was shooting at officers or the residence. At this time no damage was found, and no one was found injured. Summary Adults Arrested Adults Arrested Adults Arrested Gold Hill Patrol Shift 2 Lieutenant  -   385-2125 PD Contact & Number Gold Hill Patrol Shift 2 Lieutenant  -   385-2125 PD Contact & Number Gold Hill Patrol Shift 2 Lieutenant  -   385-2125 PD Contact & Number 34129 Record ID 34129 Record ID 34129 Record ID March 23, 2024 Incident Date March 23, 2024 Incident Date March 23, 2024 Incident Date 07:07 Time 07:07 Time 07:07 Time Sand Creek -- Shift I Division Sand Creek -- Shift I Division Sand Creek -- Shift I Division Death Title Death Title Death Title 3100 E. Dale St Location 3100 E. Dale St Location 3100 E. Dale St Location On 03/23/24 Sand Creek Shift I patrol officers were dispatched to the 3100 block of E. Dale St. for a reported death. Upon arrival, Officer located a deceased female in an apartment. Based on the circumstances, Detectives with the Homicide Unit were notified and later assumed the investigation. The investigation is ongoing. Summary On 03/23/24 Sand Creek Shift I patrol officers were dispatched to the 3100 block of E. Dale St. for a reported death. Upon arrival, Officer located a deceased female in an apartment. Based on the circumstances, Detectives with the Homicide Unit were notified and later assumed the investigation. The investigation is ongoing. Summary " -3194,https://communitycrimemap.com/?address=El%20Paso%2CTX,Crime Maps & Reports,Agency-Published Resources,LexisNexis® Community Crime Map,"",200,LexisNexis® Community Crime Map,[],[],[],[],[],[],"" -3195,https://public.powerdms.com/DesMoines/tree,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by -3196,https://data.detroitmi.gov/datasets/rms-crime-incidents/explore?location=42.353017%2C-83.099036%2C11.04&showTable=true,Crime Statistics,Agency-Published Resources,RMS Crime Incidents,Reported criminal offenses that have occurred in the City of Detroit. Offense data was extracted from the Detroit Police Department's records management system (RMS). (See Full Details to Download),200,Detroit's Open Data Portal,[],[],[],[],[],[],"" -3197,https://www.fairfaxcounty.gov/police/chief/crimestatistics,Arrest Records,Police & Public Interactions,Crime Statistics | Police,"Fairfax County, Virginia - Police, Chief, Crime Statistics",200,Fairfax County Homepage | Fairfax County,"[""Language Selection"", ""Fairfax County Police Department"", ""Crime Statistics""]","[""FFX Global Navigation"", ""Department Resources"", ""Related Resources"", ""Incident Based Reporting (IBR)"", ""FBI"", ""Virginia State Police Reports"", ""Historical Statistics"", ""Related Resources""]","[""IBR Group A Offense Tables"", ""Statistical Reports"", ""Metro Washington Council of Governments Reports (Not Prepared by the Fairfax County Police Department)"", ""Fairfax Virtual Assistant""]","[""Fairfax County Police Department Alert:""]",[],"[""Translate"", ""Awards"", ""Site Feedback"", ""PRIVACY POLICY & COPYRIGHT"", ""Main Address"", ""Site Tools"", ""Support"", ""Additional Resources""]","" -3198,https://fargond.gov/city-government/departments/police/police-records-data/dispatch-logs,Calls for Service,Police & Public Interactions,The City of Fargo - Dispatch Logs,"",200,The City of Fargo - Home Page,"[""Dispatch Logs""]","[""""]","[""Fargo City Hall"", ""Mayor's Office"", ""The City of Fargo"", ""Quick Links"", ""Contact"", ""Stay Updated""]",[],[],[],"Search Menu City of Fargo translate increase text size Search Skip Nav Live Access TV  › Cass Clay Alerts  › Emergency Preparedness  › FargoStreets  › Flooding  › Garbage & Recycling  › Health  › Homelessness  › Housing  › How Do I?  › Know Your Neighborhood  › Library  › ND Cares  › Parking  › Pets & Stray Animals  › Police & Fire  › Property Ownership  › Snow Removal  › Report A Challenge  › Roadways  › Transportation  › Utility Billing & Online Payments  › Utility Services  › Work Bids, RFQs, RFPs  › Career Opportunities  › Commercial Permitting Process  › Commercial Garbage & Recycling  › Doing Business  › Engineering  › Grants & Exemptions  › How Do I?  › Improving Fargo  › Inspections  › ND Cares  › Planning & Development  › Utility Billing & Online Payments  › Licensing & Permits  › Explore About Fargo  › Attractions  › Accommodations  › Airport  › Business Improvement District  › Dining  › Downtown Fargo  › Economic Development Corp.  › FMWF Chamber of Commerce  › Parks & Recreation  › Parking  › Photo Galleries  › Visitor's Bureau  › City & Government Mayor's Office  › City Commission  › City Administration  › Boards & Commissions  › TV Fargo  › New City Hall Project  › City Ordinances  › City Budget  › Departments  › Elections/Voting  › FM Area Diversion Project  › Green Fargo  › Career Opportunities  › Legal Holidays  › News & Events Calendar  › City News Room  › Far More On Demand  › iFargo Newsletters  › Media Relations  › Photo Galleries  › Social Media Center  › Search Search City of Fargo Search Access TV  › Cass Clay Alerts  › Emergency Preparedness  › FargoStreets  › Flooding  › Garbage & Recycling  › Health  › Homelessness  › Housing  › How Do I?  › Know Your Neighborhood  › Library  › ND Cares  › Parking  › Pets & Stray Animals  › Police & Fire  › Property Ownership  › Snow Removal  › Report A Challenge  › Roadways  › Transportation  › Utility Billing & Online Payments  › Utility Services  › Bids, RFQs, RFPs  › Career Opportunities  › Commercial Permitting Process  › Commercial Garbage & Recycling  › Doing Business  › Engineering  › Grants & Exemptions  › How Do I?  › Improving Fargo  › Inspections  › ND Cares  › Planning & Development  › Utility Billing & Online Payments  › Licensing & Permits  › About Fargo  › Attractions  › Accommodations  › Airport  › Business Improvement District  › Dining  › Downtown Fargo  › Economic Development Corp.  › FMWF Chamber of Commerce  › Parks & Recreation  › Parking  › Photo Galleries  › Visitor's Bureau  › Mayor's Office  › City Commission  › City Administration  › Boards & Commissions  › TV Fargo  › New City Hall Project  › City Ordinances  › City Budget  › Departments  › Elections/Voting  › FM Area Diversion Project  › Green Fargo  › Career Opportunities  › Legal Holidays  › Calendar  › City News Room  › Far More On Demand  › iFargo Newsletters  › Media Relations  › Photo Galleries  › Social Media Center  › " -3199,https://data.detroitmi.gov/datasets/911-calls-for-service?geometry=-85.274%2C42.028%2C-81.569%2C42.738,Calls for Service,Police & Public Interactions,911 Calls For Service,This table shows all 911 police emergency response and officer-initiated calls for service in the City of Detroit since 2016. (See Full Details to Download),200,Detroit's Open Data Portal,[],[],[],[],[],[],"" -3200,https://data.fortworthtexas.gov/Public-Safety/Crime-Data/k6ic-7kp7,Crime Statistics,Agency-Published Resources,"Crime Data | City of Fort Worth, Texas","",200,"Fort Worth - Open Data Portal | City of Fort Worth, Texas","[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Crime Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Crime Data"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data Help Contact Back to City of Fort Worth Menu Menu Close Home Data Help Contact Back to City of Fort Worth Sign In Search Sign In Home Data Help Contact Back to City of Fort Worth Menu Sign In Home Data Help Contact Back to City of Fort Worth Menu Sign In Sign In Home Data Help Contact Back to City of Fort Worth Menu Close Home Data Help Contact Back to City of Fort Worth Sign In Search Home Data Help Contact Back to City of Fort Worth Sign In Search Home Data Help Contact Back to City of Fort Worth Sign In Search Search -3201,https://cityprotect.com/map ,Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -3202,https://download.fargond.gov/0/training.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3203,https://www.denvergov.org/opendata,List of Data Sources,Info About Agencies,Denver Open Data Catalog,The Denver Open Data Catalog provides open access to data managed by the City and County of Denver.,200,Home - City and County of Denver,[],"[""Featured Datasets | View All Datasets"", ""Recently Updated | View All Datasets"", ""Popular Tags"", ""Open Data License""]","[""Open Data Catalog""]",[],"[""ONLINE SERVICES"", ""OPEN DATA"", ""A - Z SERVICES""]",[],"Toggle navigation Neighborhood Business Visiting Government Online Services A to Z Toggle navigation Open Data Catalog Home Open Data Search Featured Datasets | View All Datasets Crime Description - -This dataset includes criminal offenses in the City and County... shp csv csv pdf xml gdb rest csv csv csv csv csv csv csv csv csv csv csv csv Traffic Accidents Description - -This dataset includes motor vehicle crashes reported to the Denver... shp csv gdb xml rest xlsx Parcels Parcels within the City and County of Denver as they are represented graphically. - -Disclaimer - -ACCESS... shp dwg csv xml gdb rest Recently Updated | View All Datasets shp csv gdb xml rest xlsx Traffic Accidents Last updated 3/25/2024 Description - -This dataset includes motor vehicle crashes reported to the Denver Police Department, that occurred within the City and County of Denver and during the previous five calendar years plus the current year to date. The data are dynamic, which allows for additions, deletions and/or modifications... Tags: gis police public-safety society traffic-accidents shp dwg kml csv xml gdb rest Workforce Centers and Resource Offices Last updated 3/25/2024 Locations of the Office of Economic Development Workforce Centers and other City and County of Denver workforce resource offices. - -Disclaimer - -ACCESS CONSTRAINTS: This data set is provided as read-only. Contact the GIS Data Administrator for more information on distribution requirements/restrictions. - -USE... Tags: economic-development economy employment gis location society shp dwg kml csv xml gdb rest Libraries Last updated 3/25/2024 Denver Public Libraries within the City and County of Denver. The data includes patronage and circulation for the previous calendar year. Tags: gis 273 total datasets | view all Popular Tags adams-county arapahoe-county boundaries census CO Colorado demographics Denver Denver County DRCOG economy environment gis health jefferson-county location parks planimetric planning-cadastre property society structure survey transportation USA Open Data License You are free to copy, distribute, transmit and adapt the data - in this catalog under an open license. For details, please - review the terms of use . Toggle navigation Neighborhood Business Visiting Government Online Services A to Z Toggle navigation Toggle navigation Neighborhood Business Visiting Government Online Services A to Z Toggle navigation Toggle navigation Open Data Catalog Open Data Catalog Open Data Catalog " -3204,https://police.fortworthtexas.gov/Public/officer-involved-shootings,Officer Involved Shootings,Police & Public Interactions,Officer Involved Shootings,"",200,Error retrieving title: dictionary changed size during iteration,"[""Police Department""]","[""Officer Involved Shootings"", ""Fort Worth Police Foundation""]","[""Public Info"", ""Resources"", ""Helpful Links"", ""Connect With FWPD""]",[],[],[],"" -3205,https://www.fairfaxcounty.gov/police/fairfax-county-police-department ,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -3206,https://www.elpasotexas.gov/police-department/about-us/annual-report/,Crime Statistics,Agency-Published Resources,"","",404,"","","","","","","","" -3207,https://www.fairfaxcounty.gov/police/chief/crimestatistics ,Calls for Service,Police & Public Interactions,"","",404,"","","","","","","","" -3208,https://www.dsm.city/departments/police-division/index.php,Crime Statistics,Agency-Published Resources,Des Moines Police Department DMPD - Home,"As the largest and most urban law enforcement agency in Iowa, the Des Moines Police Department (DMPD) has a strong commitment to community policing.",200,"City of Des Moines, IA","[""Police""]","[""Police""]","[""Garbage, Recycling, Yard Waste"", ""Parks, Trails, Community Recreation Centers"", ""Projects Map"", ""Email List Sign-up"", ""Show Me My House"", ""Initiatives"", ""Map Center""]","[""Share this page""]",[],[],Back to home Government Council Meetings and Agendas Meeting Agenda Archive City Council Contacts City Council Ordinances City Council Proclamations Government Organization Boards and Commissions Access Advisory Board Airport Authority Board Building and Fire Code Board of Appeals Civil Service Commission Des Moines Civil and Human Rights Commission Greater Des Moines Sister Cities Commission Historic Preservation Commission Housing Appeals Board Housing Services Board Library Board of Trustees Parks and Recreation Board Plan and Zoning Commission Urban Design Review Board Water Works Board of Trustees Youth Advisory Board Zoning Board of Adjustment Committees Community Land Trust (CLT) Advisory Committee Des Moines Food Security Task Force Marijuana Task Force Metro Advisory Council (MAC) Skywalk Committee Stormwater Infrastructure Advisory Committee Transportation Safety Committee Departments City Clerk City Manager Civil and Human Rights Development Services Engineering Finance Fire Human Resources Information Technology Legal Library Municipal Housing Agency Neighborhood Services Parks and Recreation Police Public Works Wastewater Reclamation Authority Residents Downtown DSM Find My Neighborhood Garbage Map Center Parks Directory Projects Map Public Library Public Transit Public Office Locations Recycling Report Problems Road and Trail Closures SCRUB Events Show Me My House Snow Removal Trails Yard Waste Homelessness Business Benchmarking DSM Greater Des Moines Partnership Economic Development Map Center Procurement Office Professional Services RFP's Project Bid Information Public Office Locations Visitors About Des Moines City Calendar Convention & Visitor Bureau Downtown DSM International Airport Map Center Parking Parks Directory Public Office Locations Trails How do I? Select Language ​ ▼ EN Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hausa Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Khmer Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Maori Marathi Mongolian Nepali Norwegian Persian Polish Portuguese Punjabi Romanian Russian Serbian Slovak Slovenian Somali Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Yoruba Zulu How do I? Select Language ​ ▼ EN Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hausa Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Khmer Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Maori Marathi Mongolian Nepali Norwegian Persian Polish Portuguese Punjabi Romanian Russian Serbian Slovak Slovenian Somali Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Yoruba Zulu Select Language ​ ▼ Select Language ​ ▼ Select Language ​ ▼ -3209,https://data.detroitmi.gov/datasets/dpd-citizen-complaints/explore,Complaints & Misconduct,Info About Officers,DPD Citizen Complaints,"All citizen complaints received by the Detroit Police Department (DPD) and the Board of Police Commissioners from January 1, 2016 to December 31, 2018.",200,Detroit's Open Data Portal,[],[],[],[],[],[],"" -3210,https://fargond.gov/city-government/departments/police/police-records-data/crime-statistics,Arrest Records,Police & Public Interactions,The City of Fargo - Crime Statistics,"",200,The City of Fargo - Home Page,[],"["""", ""Crime Statistics"", ""Traffic Statistics""]","[""Fargo City Hall"", ""Mayor's Office"", ""The City of Fargo"", ""Quick Links"", ""Contact"", ""Stay Updated""]",[],[],[],"Search Menu City of Fargo translate increase text size Search Skip Nav Live Access TV  › Cass Clay Alerts  › Emergency Preparedness  › FargoStreets  › Flooding  › Garbage & Recycling  › Health  › Homelessness  › Housing  › How Do I?  › Know Your Neighborhood  › Library  › ND Cares  › Parking  › Pets & Stray Animals  › Police & Fire  › Property Ownership  › Snow Removal  › Report A Challenge  › Roadways  › Transportation  › Utility Billing & Online Payments  › Utility Services  › Work Bids, RFQs, RFPs  › Career Opportunities  › Commercial Permitting Process  › Commercial Garbage & Recycling  › Doing Business  › Engineering  › Grants & Exemptions  › How Do I?  › Improving Fargo  › Inspections  › ND Cares  › Planning & Development  › Utility Billing & Online Payments  › Licensing & Permits  › Explore About Fargo  › Attractions  › Accommodations  › Airport  › Business Improvement District  › Dining  › Downtown Fargo  › Economic Development Corp.  › FMWF Chamber of Commerce  › Parks & Recreation  › Parking  › Photo Galleries  › Visitor's Bureau  › City & Government Mayor's Office  › City Commission  › City Administration  › Boards & Commissions  › TV Fargo  › New City Hall Project  › City Ordinances  › City Budget  › Departments  › Elections/Voting  › FM Area Diversion Project  › Green Fargo  › Career Opportunities  › Legal Holidays  › News & Events Calendar  › City News Room  › Far More On Demand  › iFargo Newsletters  › Media Relations  › Photo Galleries  › Social Media Center  › Search Search City of Fargo Search Access TV  › Cass Clay Alerts  › Emergency Preparedness  › FargoStreets  › Flooding  › Garbage & Recycling  › Health  › Homelessness  › Housing  › How Do I?  › Know Your Neighborhood  › Library  › ND Cares  › Parking  › Pets & Stray Animals  › Police & Fire  › Property Ownership  › Snow Removal  › Report A Challenge  › Roadways  › Transportation  › Utility Billing & Online Payments  › Utility Services  › Bids, RFQs, RFPs  › Career Opportunities  › Commercial Permitting Process  › Commercial Garbage & Recycling  › Doing Business  › Engineering  › Grants & Exemptions  › How Do I?  › Improving Fargo  › Inspections  › ND Cares  › Planning & Development  › Utility Billing & Online Payments  › Licensing & Permits  › About Fargo  › Attractions  › Accommodations  › Airport  › Business Improvement District  › Dining  › Downtown Fargo  › Economic Development Corp.  › FMWF Chamber of Commerce  › Parks & Recreation  › Parking  › Photo Galleries  › Visitor's Bureau  › Mayor's Office  › City Commission  › City Administration  › Boards & Commissions  › TV Fargo  › New City Hall Project  › City Ordinances  › City Budget  › Departments  › Elections/Voting  › FM Area Diversion Project  › Green Fargo  › Career Opportunities  › Legal Holidays  › Calendar  › City News Room  › Far More On Demand  › iFargo Newsletters  › Media Relations  › Photo Galleries  › Social Media Center  › " -3211,https://www.denvergov.org/Government/Agencies-Departments-Offices/Agencies-Departments-Offices-Directory/Police-Department,Contact Info & Agency Meta,Info About Agencies,Police Department - City and County of Denver,"Preventing crime and increasing public trust while honoring the responsibilities granted to us by those we serve, with continued focus on partnerships, learning, and innovation.",200,Home - City and County of Denver,"[""Police Department""]","[""Mission Statement"", ""Welcome"", ""Recruitment"", ""Performance and Transparency"", ""Contact Us"", ""Quick Links"", ""Program & Services"", ""District Stations"", ""Crime Information"", ""Police Records"", ""Traffic Enforcement and Safety"", ""Safety and Crime Prevention"", ""News and Media"", ""Community Engagement"", ""Language Assistance Services"", ""Facebook"", ""Threads"", ""Twitter""]","[""Denver City Government Closed Monday, March 25"", ""Come join our team!"", ""Stay Connected"", ""Contact 3-1-1"", ""Visit Other Denver Sites"", ""Share & Connect""]","[""""]","[""Denver Police Foundation"", ""Active Bystandership for Law Enforcement (ABLE)""]",[],"opens in new tab or window Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures " -3212,https://detroitmi.gov/departments/police-department/detroit-police-department-policies,Policies & Contracts,Info About Agencies,Detroit Police Department Policies | City of Detroit,"The Detroit Police Department Manual contains all department policy, rules and regulations, and procedures for implementing department activities. In the spirit of continued transparency, the Department has begun posting its policies publicly on the City of the Detroit website. The Department Manual has four chapters each of which are comprised of a varying number of Directives. The four chapters are Administration, Operations, Support Services, and Personnel. A selection of these Directives are posted below for the public to view. The Department is in the process of posting additional directives online; please continue checking back onto this webpage for more Directives to be posted. In addition, please note that the Department is always updating policy in concert with the Board of Police Commissioners. As policies are updated, the public website will be updated.",200,City of Detroit | Opportunity Rising,"[""Detroit Police Department Policies""]","[""Top Links"", ""Site Menu"", ""News & Events"", ""Featured"", ""Updated"", ""Documents""]",[],[],"[""307.8 – Gunshot Detection System"", ""Critical Incident Response – 205.1"", ""Mobilization – 205.3"", ""Tactical Alert Procedures – 205.2"", ""Strikes, Demonstrations, and Civil Disorders – 205.4"", ""Armed and Barricaded Persons – 205.6""]",[],"" -3213,https://www.crimemapping.com/map/agency/128,Crime Maps & Reports,Agency-Published Resources,CrimeMapping.com - Helping You Build a Safer Community,"",200,CrimeMapping.com - Helping You Build a Safer Community,"[""My Map Summary"", ""What"", ""Where"", ""When"", ""Display Options"", ""Location Selection"", ""Choose a Search Distance"", ""Timeframe Settings"", ""From:"", ""To:""]",[],[],[],[],[],"Preparing Map Content... Preparing Map Content... Receive Alerts Go 0 Records Date Range: Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Receive Alerts Receive Alerts Go 0 Records Date Range: Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Distance: Miles select Distance: Miles select Streets select Fetching Data. x Close Fetching Data. Fetching Data. Fetching Data. x Close Share This Map My Map Summary The sum of the What, Where, When you’ve chosen. What * Data not provided by agency within map extent Where Broward County Police Boundary Agency Filter: Agency Name Here When Previous 7 Days Friday, May 1 - Friday, May 8 Restore Defaults Display Options What type(s) of records would you like to see? Select All | Deselect All Arson Assault Burglary Disturbing the Peace Drugs / Alcohol Violations DUI Fraud Homicide Motor Vehicle Theft Robbery Sex Crimes Theft / Larceny Vandalism Vehicle Break-In / Theft Weapons Sex Offender Sexual Predator * Data not provided by agency within map extent Location Selection Enter an Address, Feature or Location. Choose a Search Distance 500 feet 1000 feet 1500 feet 1/4 mile 1/2 mile 1 mile 2 miles Apply Remove Location Filter Timeframe Settings From how far back would you like to see records? **Note** This will not apply to Sex Offender data. Yesterday Previous 3 Days Previous Week Previous 4 Weeks Custom Time Range From: To: Apply " -3214,https://detroitmi.gov/departments/police-department,Contact Info & Agency Meta,Info About Agencies,Police Department | City of Detroit,"The Detroit Police Department and its more than 2,500 officers are responsible for policing Detroit’s 139 square miles. Through data-informed policing strategies, collaborative partnerships, and innovative programs with high levels of community engagement, Detroit has seen sustained reductions in nearly every category of crime. The Detroit Police Department is committed to transparency, professionalism and 21st-century policing excellence informed by community input and civic leadership.   DPD Media Request Form DPD TV/Film Pitch Request Form   Social Media Disclaimer The Detroit Police Department’s (DPD) mission is to encourage thoughtful decision-making and a strong sense of community responsibility through education, equity empathy, professionalism, transparency, and policing standards properly informed by community input and civic leadership. Our social media pages are intended to serve as a gateway for communication to maintain the relationship between Detroit’s diverse community and the Detroit Police Department. Courteous and respectful comments are encouraged. The Detroit Police Department does not discriminate against commentators nor their views. However, we reserve the right to delete the following: 1) Comments that are derogatory or discriminatory of a constitutionally protected class, e.g. racist comments; 2) Comments that are violent, vulgar, harassing, obscene, profane, or hateful; 3) Suggestion or encouragement of illegal activity; 4) Threats or defamation of any person or organization; 5) Posts containing the personal identifying information of a third party 6) Copyrighted or trademarked images or graphics without the owner’s approval Freedom of speech and expression is encouraged within our community guidelines. Please note that the opinions of followers/fans/writers on the DPD pages do not reflect the views of the department or the City of Detroit.",200,City of Detroit | Opportunity Rising,"[""Police Department""]","[""Top Links"", ""Site Menu"", ""News & Events"", ""Featured"", ""Updated"", ""Related Links"", ""Documents"", ""Web Apps""]","[""Citizens Radio Patrol"", ""Detroit Police Department Shield Program"", ""DPD Surveillance Technology Reports & Documents"", ""Detroit Police Department Careers"", ""Precinct Social Media Accounts"", ""Victim's Assistance"", ""Report Crime"", ""2016 Crime Statistics"", ""Abandoned Vehicle"", ""Auto Theft"", ""Community and Police Advocacy (C.A.P.P.A.)"", ""Committee on Race and Equality (CORE)"", ""Detroit Police Department Office of Civil Rights"", ""Detroit Police Department Records and Reports"", ""Precincts and Neighborhood Police Officers"", ""Gun Permits Information"", ""Detroit Police Department Policies"", ""Senior Citizens 911 Profile"", ""Project Green Light Detroit"", ""Detroit Rewards TV"", ""Secondary Employment""]","[""DPD Media Request Form"", ""DPD TV/Film Pitch Request Form"", ""CONTACTS"", ""Sections""]","[""Social Media Disclaimer"", ""Gun Violence Reduction 5-graphics"", ""Gun Violence Reduction 5-graphics"", ""BOPC Shotspotter Letter of Support"", ""Gunshot Detection System Policy"", ""Surveillance Technology Specification Reports"", ""DPD Operation Clean Sweep Final Report""]",[],"" -3215,https://fargond.gov/city-government/departments/police/contact-us,Contact Info & Agency Meta,Info About Agencies,The City of Fargo - Contact Us,"",200,The City of Fargo - Home Page,"[""Contact Us""]","["""", ""Contact Information""]","[""Fargo City Hall"", ""Mayor's Office"", ""The City of Fargo"", ""Quick Links"", ""Contact"", ""Stay Updated""]",[],[],[],"Search Menu City of Fargo translate increase text size Search Skip Nav Live Access TV Cass Clay Alerts Emergency Preparedness FargoStreets Flooding Garbage & Recycling Health Homelessness Housing How Do I? Know Your Neighborhood Library ND Cares Parking Pets & Stray Animals Police & Fire Property Ownership Snow Removal Report A Challenge Roadways Transportation Utility Billing & Online Payments Utility Services Work Bids, RFQs, RFPs Career Opportunities Commercial Permitting Process Commercial Garbage & Recycling Doing Business Engineering Grants & Exemptions How Do I? Improving Fargo Inspections ND Cares Planning & Development Utility Billing & Online Payments Licensing & Permits Explore About Fargo Attractions Accommodations Airport Business Improvement District Dining Downtown Fargo Economic Development Corp. FMWF Chamber of Commerce Parks & Recreation Parking Photo Galleries Visitor's Bureau City & Government Mayor's Office City Commission City Administration Boards & Commissions TV Fargo New City Hall Project City Ordinances City Budget Departments Elections/Voting FM Area Diversion Project Green Fargo Career Opportunities Legal Holidays News & Events Calendar City News Room Far More On Demand iFargo Newsletters Media Relations Photo Galleries Social Media Center Search Search City of Fargo Search Access TV Cass Clay Alerts Emergency Preparedness FargoStreets Flooding Garbage & Recycling Health Homelessness Housing How Do I? Know Your Neighborhood Library ND Cares Parking Pets & Stray Animals Police & Fire Property Ownership Snow Removal Report A Challenge Roadways Transportation Utility Billing & Online Payments Utility Services Bids, RFQs, RFPs Career Opportunities Commercial Permitting Process Commercial Garbage & Recycling Doing Business Engineering Grants & Exemptions How Do I? Improving Fargo Inspections ND Cares Planning & Development Utility Billing & Online Payments Licensing & Permits About Fargo Attractions Accommodations Airport Business Improvement District Dining Downtown Fargo Economic Development Corp. FMWF Chamber of Commerce Parks & Recreation Parking Photo Galleries Visitor's Bureau Mayor's Office City Commission City Administration Boards & Commissions TV Fargo New City Hall Project City Ordinances City Budget Departments Elections/Voting FM Area Diversion Project Green Fargo Career Opportunities Legal Holidays Calendar City News Room Far More On Demand iFargo Newsletters Media Relations Photo Galleries Social Media Center " -3216,https://www.fresno.gov/police/wp-content/uploads/sites/5/2021/05/122020.pdf,Crime Statistics,Agency-Published Resources,"","",404,"","","","","","","","" -3217,https://www.fairfaxcounty.gov/police/chief/generalorders/gos ,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3218,https://www.elpasotexas.gov/police-department/contact/,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -3220,https://www.fairfaxcounty.gov/maps/open-geospatial-data,List of Data Sources,Info About Agencies,Open Geospatial Data | GIS and Mapping Services,"Fairfax County, Virginia - Fairfax County's Open Geospatial Data site",200,Fairfax County Homepage | Fairfax County,"[""Language Selection""]","[""FFX Global Navigation"", ""Department Resources""]","[""Fairfax Virtual Assistant""]","[""GIS and Mapping Services Alert:""]",[],"[""Translate"", ""Awards"", ""Site Feedback"", ""PRIVACY POLICY & COPYRIGHT"", ""Main Address"", ""Site Tools"", ""Support"", ""Additional Resources""]","" -3221,https://www.dsm.city/departments/police-division/investigations/crime_mapping.php,Crime Maps & Reports,Agency-Published Resources,Page not found,"",200,"City of Des Moines, IA",[],"[""Page not found""]","[""Garbage, Recycling, Yard Waste"", ""Parks, Trails, Community Recreation Centers"", ""Projects Map"", ""Email List Sign-up"", ""Show Me My House"", ""Initiatives"", ""Map Center""]","[""Search"", ""Share this page""]",[],[],Back to home Government Council Meetings and Agendas Meeting Agenda Archive City Council Contacts City Council Ordinances City Council Proclamations Government Organization Boards and Commissions Access Advisory Board Airport Authority Board Building and Fire Code Board of Appeals Civil Service Commission Des Moines Civil and Human Rights Commission Greater Des Moines Sister Cities Commission Historic Preservation Commission Housing Appeals Board Housing Services Board Library Board of Trustees Parks and Recreation Board Plan and Zoning Commission Urban Design Review Board Water Works Board of Trustees Youth Advisory Board Zoning Board of Adjustment Committees Community Land Trust (CLT) Advisory Committee Des Moines Food Security Task Force Marijuana Task Force Metro Advisory Council (MAC) Skywalk Committee Stormwater Infrastructure Advisory Committee Transportation Safety Committee Departments City Clerk City Manager Civil and Human Rights Development Services Engineering Finance Fire Human Resources Information Technology Legal Library Municipal Housing Agency Neighborhood Services Parks and Recreation Police Public Works Wastewater Reclamation Authority Residents Downtown DSM Find My Neighborhood Garbage Map Center Parks Directory Projects Map Public Library Public Transit Public Office Locations Recycling Report Problems Road and Trail Closures SCRUB Events Show Me My House Snow Removal Trails Yard Waste Homelessness Business Benchmarking DSM Greater Des Moines Partnership Economic Development Map Center Procurement Office Professional Services RFP's Project Bid Information Public Office Locations Visitors About Des Moines City Calendar Convention & Visitor Bureau Downtown DSM International Airport Map Center Parking Parks Directory Public Office Locations Trails How do I? ​ ▼ EN Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hausa Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Khmer Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Maori Marathi Mongolian Nepali Norwegian Persian Polish Portuguese Punjabi Romanian Russian Serbian Slovak Slovenian Somali Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Yoruba Zulu How do I? ​ ▼ EN Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hausa Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Khmer Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Maori Marathi Mongolian Nepali Norwegian Persian Polish Portuguese Punjabi Romanian Russian Serbian Slovak Slovenian Somali Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Yoruba Zulu ​ ▼ ​ ▼ ​ ▼ -3222,https://www.denvergov.org/content/dam/denvergov/Portals/720/documents/OperationsManual/OMSBook/OM_Book.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3223,https://www.fresno.gov/police/wp-content/uploads/sites/5/2016/09/Revised-Website-OIS-list-04.21.21.pdf,Officer Involved Shootings,Police & Public Interactions,"","",404,"","","","","","","","" -3224,https://www.fairfaxcounty.gov/police/chief/reports/iab,Complaints & Misconduct,Info About Officers,IAB Administrative Investigation and Use of Force Data Report | Police,"Fairfax County, Virginia - Fairfax County Police Department Chief, Reports, IAB 2015 Administrative Investigation and use of Force Data Report",200,Fairfax County Homepage | Fairfax County,"[""Language Selection"", ""Fairfax County Police Department"", ""IAB Administrative Investigation and Use of Force Data Report""]","[""FFX Global Navigation"", ""Department Resources"", ""Related Resources"", ""Related Resources""]","[""Fairfax Virtual Assistant""]","[""Fairfax County Police Department Alert:""]",[],"[""Translate"", ""Awards"", ""Site Feedback"", ""PRIVACY POLICY & COPYRIGHT"", ""Main Address"", ""Site Tools"", ""Support"", ""Additional Resources""]","" -3225,https://public.powerdms.com/DesMoines/tree/documents/1127110,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by Powered by Powered by Powered by -3226,https://detroitmi.gov/sites/detroitmi.localhost/files/2020-05/Officer-Involved%20Shooting%20HTF.pdf,Officer Involved Shootings,Police & Public Interactions,"","",200,"","","","","","","","" -3227,https://police.fortworthtexas.gov/Public/use-of-force-report,Complaints & Misconduct,Info About Officers,Use of Force Report,"",200," - Welcome to the Fort Worth Police Department -","[""Police Department""]","[""Use of Force Report"", ""Fort Worth Police Foundation""]","[""Public Info"", ""Resources"", ""Helpful Links"", ""Connect With FWPD""]",[],[],[],"" -3228,https://www.denvergov.org/Government/Agencies-Departments-Offices/Agencies-Departments-Offices-Directory/Citizen-Oversight-Board/Reports,Complaints & Misconduct,Info About Officers,Reports - City and County of Denver,Read the Citizen Oversight Board annual reports.,200,Home - City and County of Denver,"[""Reports""]","[""Related Links""]","[""Denver City Government Closed Monday, March 25"", ""Contact 3-1-1"", ""Visit Other Denver Sites"", ""Share & Connect""]",[],[],[],"opens in new tab or window Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures " -3229,https://www.denvergov.org/content/dam/denvergov/Portals/374/documents/2019AnnualReport_OIM.pdf,Officer Involved Shootings,Police & Public Interactions,"","",200,"","","","","","","","" -3230,https://www.fairfaxcounty.gov/police/sites/police/files/assets/images/chief/reports/use%20of%20force%20policies.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3232,https://data.detroitmi.gov/datasets/rms-crime-incidents,Arrest Records,Police & Public Interactions,RMS Crime Incidents,Reported criminal offenses that have occurred in the City of Detroit. Offense data was extracted from the Detroit Police Department's records management system (RMS). (See Full Details to Download),200,Detroit's Open Data Portal,[],[],[],[],[],[],"" -3233,https://cms2files.revize.com/desmoines/document_center/Police/Forms%20and%20Documents/2019%20Statistical%20Report.pdf?pdf=2019%20Des%20Moines%20Police%20Department%20Statistical%20Report&t=1652458646619&pdf=2019%20Des%20Moines%20Police%20Department%20Statistical%20Report&t=1652458646619,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -3234,https://cityofdetroit.github.io/crime-viewer/,Crime Maps & Reports,Agency-Published Resources,React App,Web site created using create-react-app,200,Site not found · GitHub Pages,"[""Detroit Crime Viewer""]","[""Adjust filters"", ""Welcome to the City of Detroit Crime Viewer"", ""Welcome to the City of Detroit Crime Viewer""]","[""Date range"", ""Change crime types""]","[""Other"", ""Violent"", ""Property""]",[],[],Detroit Crime Viewer Adjust filters Date range From: To: Change crime types Other Other crimes KIDNAPPING FORGERY FRAUD DANGEROUS DRUGS SEX OFFENSES FAMILY OFFENSE GAMBLING LIQUOR OBSTRUCTING THE POLICE OBSTRUCTING JUDICIARY WEAPONS OFFENSES DISORDERLY CONDUCT OUIL OTHER RUNAWAY MISCELLANEOUS SOLICITATION Violent Violent crimes SEXUAL ASSAULT SEX OFFENSES ROBBERY ASSAULT AGGRAVATED ASSAULT HOMICIDE JUSTIFIABLE HOMICIDE Property Property crimes ARSON EXTORTION BURGLARY LARCENY STOLEN VEHICLE STOLEN PROPERTY DAMAGE TO PROPERTY Detroit Crime Viewer Adjust filters Date range From: To: Change crime types Other Other crimes KIDNAPPING FORGERY FRAUD DANGEROUS DRUGS SEX OFFENSES FAMILY OFFENSE GAMBLING LIQUOR OBSTRUCTING THE POLICE OBSTRUCTING JUDICIARY WEAPONS OFFENSES DISORDERLY CONDUCT OUIL OTHER RUNAWAY MISCELLANEOUS SOLICITATION Violent Violent crimes SEXUAL ASSAULT SEX OFFENSES ROBBERY ASSAULT AGGRAVATED ASSAULT HOMICIDE JUSTIFIABLE HOMICIDE Property Property crimes ARSON EXTORTION BURGLARY LARCENY STOLEN VEHICLE STOLEN PROPERTY DAMAGE TO PROPERTY Detroit Crime Viewer Adjust filters Date range From: To: Change crime types Other Other crimes KIDNAPPING FORGERY FRAUD DANGEROUS DRUGS SEX OFFENSES FAMILY OFFENSE GAMBLING LIQUOR OBSTRUCTING THE POLICE OBSTRUCTING JUDICIARY WEAPONS OFFENSES DISORDERLY CONDUCT OUIL OTHER RUNAWAY MISCELLANEOUS SOLICITATION Violent Violent crimes SEXUAL ASSAULT SEX OFFENSES ROBBERY ASSAULT AGGRAVATED ASSAULT HOMICIDE JUSTIFIABLE HOMICIDE Property Property crimes ARSON EXTORTION BURGLARY LARCENY STOLEN VEHICLE STOLEN PROPERTY DAMAGE TO PROPERTY Detroit Crime Viewer Detroit Crime Viewer Adjust filters Date range From: To: Change crime types Other Other crimes KIDNAPPING FORGERY FRAUD DANGEROUS DRUGS SEX OFFENSES FAMILY OFFENSE GAMBLING LIQUOR OBSTRUCTING THE POLICE OBSTRUCTING JUDICIARY WEAPONS OFFENSES DISORDERLY CONDUCT OUIL OTHER RUNAWAY MISCELLANEOUS SOLICITATION Violent Violent crimes SEXUAL ASSAULT SEX OFFENSES ROBBERY ASSAULT AGGRAVATED ASSAULT HOMICIDE JUSTIFIABLE HOMICIDE Property Property crimes ARSON EXTORTION BURGLARY LARCENY STOLEN VEHICLE STOLEN PROPERTY DAMAGE TO PROPERTY Adjust filters Adjust filters Date range From: To: Change crime types Other Other crimes KIDNAPPING FORGERY FRAUD DANGEROUS DRUGS SEX OFFENSES FAMILY OFFENSE GAMBLING LIQUOR OBSTRUCTING THE POLICE OBSTRUCTING JUDICIARY WEAPONS OFFENSES DISORDERLY CONDUCT OUIL OTHER RUNAWAY MISCELLANEOUS SOLICITATION Violent Violent crimes SEXUAL ASSAULT SEX OFFENSES ROBBERY ASSAULT AGGRAVATED ASSAULT HOMICIDE JUSTIFIABLE HOMICIDE Property Property crimes ARSON EXTORTION BURGLARY LARCENY STOLEN VEHICLE STOLEN PROPERTY DAMAGE TO PROPERTY From: To: From: From: To: To: Other Other crimes KIDNAPPING FORGERY FRAUD DANGEROUS DRUGS SEX OFFENSES FAMILY OFFENSE GAMBLING LIQUOR OBSTRUCTING THE POLICE OBSTRUCTING JUDICIARY WEAPONS OFFENSES DISORDERLY CONDUCT OUIL OTHER RUNAWAY MISCELLANEOUS SOLICITATION Other crimes KIDNAPPING FORGERY FRAUD DANGEROUS DRUGS SEX OFFENSES FAMILY OFFENSE GAMBLING LIQUOR OBSTRUCTING THE POLICE OBSTRUCTING JUDICIARY WEAPONS OFFENSES DISORDERLY CONDUCT OUIL OTHER RUNAWAY MISCELLANEOUS SOLICITATION Other crimes KIDNAPPING FORGERY FRAUD DANGEROUS DRUGS SEX OFFENSES FAMILY OFFENSE GAMBLING LIQUOR OBSTRUCTING THE POLICE OBSTRUCTING JUDICIARY WEAPONS OFFENSES DISORDERLY CONDUCT OUIL OTHER RUNAWAY MISCELLANEOUS SOLICITATION KIDNAPPING FORGERY FRAUD DANGEROUS DRUGS SEX OFFENSES FAMILY OFFENSE GAMBLING LIQUOR OBSTRUCTING THE POLICE OBSTRUCTING JUDICIARY WEAPONS OFFENSES DISORDERLY CONDUCT OUIL OTHER RUNAWAY MISCELLANEOUS SOLICITATION Violent Violent crimes SEXUAL ASSAULT SEX OFFENSES ROBBERY ASSAULT AGGRAVATED ASSAULT HOMICIDE JUSTIFIABLE HOMICIDE Violent crimes SEXUAL ASSAULT SEX OFFENSES ROBBERY ASSAULT AGGRAVATED ASSAULT HOMICIDE JUSTIFIABLE HOMICIDE Violent crimes SEXUAL ASSAULT SEX OFFENSES ROBBERY ASSAULT AGGRAVATED ASSAULT HOMICIDE JUSTIFIABLE HOMICIDE SEXUAL ASSAULT SEX OFFENSES ROBBERY -3236,https://www.fairfaxcounty.gov/police/chief/reports/iab ,Use of Force Reports,Police & Public Interactions,"","",404,"","","","","","","","" -3237,https://data.detroitmi.gov/,List of Data Sources,Info About Agencies,Detroit's Open Data Portal,"Open data portal for the city of Detroit, Michigan, USA.",200,Detroit's Open Data Portal,[],[],[],[],[],[],"" -3238,https://www.fresno.gov/police/wp-content/uploads/sites/5/2021/05/28947-2020AnnualReport-FINAL-2.pdf,Complaints & Misconduct,Info About Officers,"","",404,"","","","","","","","" -3241,https://www.dsm.city/departments/police-division/general/frequently_called_numbers.php,Contact Info & Agency Meta,Info About Agencies,Contact the Des Moines Police Department,Non-emergency contact information for the Des Moines Police Department (DMPD).,200,"City of Des Moines, IA",[],"[""Frequently Called Numbers""]","[""Garbage, Recycling, Yard Waste"", ""Parks, Trails, Community Recreation Centers"", ""Projects Map"", ""Email List Sign-up"", ""Show Me My House"", ""Initiatives"", ""Map Center""]","[""Share this page""]",[],[],Back to home Government Council Meetings and Agendas Meeting Agenda Archive City Council Contacts City Council Ordinances City Council Proclamations Government Organization Boards and Commissions Access Advisory Board Airport Authority Board Building and Fire Code Board of Appeals Civil Service Commission Des Moines Civil and Human Rights Commission Greater Des Moines Sister Cities Commission Historic Preservation Commission Housing Appeals Board Housing Services Board Library Board of Trustees Parks and Recreation Board Plan and Zoning Commission Urban Design Review Board Water Works Board of Trustees Youth Advisory Board Zoning Board of Adjustment Committees Community Land Trust (CLT) Advisory Committee Des Moines Food Security Task Force Marijuana Task Force Metro Advisory Council (MAC) Skywalk Committee Stormwater Infrastructure Advisory Committee Transportation Safety Committee Departments City Clerk City Manager Civil and Human Rights Development Services Engineering Finance Fire Human Resources Information Technology Legal Library Municipal Housing Agency Neighborhood Services Parks and Recreation Police Public Works Wastewater Reclamation Authority Residents Downtown DSM Find My Neighborhood Garbage Map Center Parks Directory Projects Map Public Library Public Transit Public Office Locations Recycling Report Problems Road and Trail Closures SCRUB Events Show Me My House Snow Removal Trails Yard Waste Homelessness Business Benchmarking DSM Greater Des Moines Partnership Economic Development Map Center Procurement Office Professional Services RFP's Project Bid Information Public Office Locations Visitors About Des Moines City Calendar Convention & Visitor Bureau Downtown DSM International Airport Map Center Parking Parks Directory Public Office Locations Trails How do I? Select Language ​ ▼ EN Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hausa Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Khmer Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Maori Marathi Mongolian Nepali Norwegian Persian Polish Portuguese Punjabi Romanian Russian Serbian Slovak Slovenian Somali Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Yoruba Zulu How do I? Select Language ​ ▼ EN Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hausa Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Khmer Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Maori Marathi Mongolian Nepali Norwegian Persian Polish Portuguese Punjabi Romanian Russian Serbian Slovak Slovenian Somali Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Yoruba Zulu Select Language ​ ▼ Select Language ​ ▼ Select Language ​ ▼ -3243,"https://cityprotect.com/map/list/incidents/5ee01956f47cb62ab23a4dfc?toDate=2020-06-10T23:59:59.999Z&fromDate=2020-06-07T00:00:00.000Z&pageSize=2000&parentIncidentTypeIds=149,150,148,8,97,104,165,98,100,179,178,180,101,99,103,163,168,166,12,161,14,16,15&zoomLevel=15&latitude=46.87787727149095&longitude=-96.78031942819655&days=1,2,3,4,5,6,7&startHour=0&endHour=24&timezone=%2B00:00",Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -3244,https://police.fortworthtexas.gov/Public/general-orders,Policies & Contracts,Info About Agencies,General Orders,"",200,Error retrieving title: dictionary changed size during iteration,"[""Police Department""]","[""General Orders"", ""Special Needs Assistance Program (SNAP)""]","[""Public Info"", ""Resources"", ""Helpful Links"", ""Connect With FWPD""]",[],[],[],"" -3245,https://www.fairfaxcounty.gov/police/reports/traffic-citations  ,Stops,Police & Public Interactions,"","",404,"","","","","","","","" -3247,https://detroitmi.gov/sites/detroitmi.localhost/files/2020-10/304.2_Use%20of%20Force.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3248,https://openjustice.doj.ca.gov/data,Stops,Police & Public Interactions,State of California Department of Justice - OpenJustice,"",200,State of California Department of Justice - OpenJustice,[],[],[],[],[],[],Toggle navigation Office of the Attorney General Accessibility Privacy Policy Conditions of Use Disclaimer © 2024 DOJ Toggle navigation Toggle navigation Toggle navigation Office of the Attorney General Accessibility Privacy Policy Conditions of Use Disclaimer © 2024 DOJ Office of the Attorney General Accessibility Privacy Policy Conditions of Use Disclaimer © 2024 DOJ Office of the Attorney General Accessibility Privacy Policy Conditions of Use Disclaimer © 2024 DOJ -3251,https://police.fortworthtexas.gov,Contact Info & Agency Meta,Info About Agencies,Welcome to the Fort Worth Police Department,"",200," - Welcome to the Fort Worth Police Department -","[""Police Department""]","[""Learn what we're doing with the #FortWorthSafe Strategy"", ""Accident Reports"", ""Online Reporting"", ""Search One Address. Find Everything ."", ""Executive Staff"", ""Inside FWPD"", ""Patrol Commanders"", ""Help Us Solve a Crime"", ""Community Camera Program"", ""Most Wanted"", ""CrimeMapping.com""]","[""#FortWorthSafe Strategy"", ""Professional Standards"", ""Procedural Justice"", ""Chief of Police Neil Noakes"", ""Executive Assistant Chief Robert Alldredge"", ""Assistant Chief Julie Swearingin"", ""Assistant Chief David Carabajal"", ""Deputy Chief Buck Wheeler"", ""Deputy Chief Mark Barthen"", ""Deputy Chief Pedro \""Kiki\"" Criado"", ""Deputy Chief Chad Mahaffey"", ""Deputy Chief Monica Martin"", ""Deputy Chief Chris Daniels"", ""Assistant Police Director Leo Luna"", ""Assistant Police Director Keith Morris"", ""Central Commander - Robert Stewart"", ""East Commander - Antione Williams"", ""North Commander - Sean Kenjura"", ""Northwest Commander - Jason Kim"", ""South Commander - Andre Smith"", ""West Commander - Stefanie RIcks"", ""Ladye Gallaher, 84 years old"", ""Jaime Trevizo, 25 years old"", ""Angela Jones, 17 years old"", ""Ezekiel Barraza, 22 years old"", ""Miguel Ruiz, DOB: 05/14/1997"", ""Nestor Moreno, DOB: 02/26/1973"", ""Jaylnn Brooks, DOB: 03/14/2001"", ""Eric Sosa, DOB: 12/30/1981"", ""Draylon Gowans, DOB: 12/01/2000"", ""Paul Roman Aleman, DOB: 06/14/1996"", ""Johnathon Baughan, DOB: 09/01/1982"", ""Passion Crawford, DOB: 03/12/1992"", ""Ruben Buckner, DOB: 07/28/1968"", ""Reginald McDowell, DOB: 08/19/1996"", ""Resources"", ""Helpful Links"", ""Connect With FWPD""]",[],[],[],Learn what we're doing with the #FortWorthSafe Strategy -3252,https://www.denvergov.org/files/assets/public/police-department/documents/crime-information/uof-report.pdf,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -3253,https://data.fortworthtexas.gov/,List of Data Sources,Info About Agencies,"Fort Worth - Open Data Portal | City of Fort Worth, Texas","",200,"Fort Worth - Open Data Portal | City of Fort Worth, Texas","[""Welcome to Open Data Portal for the City of Fort Worth"", ""Welcome to Open Data Portal for the City of Fort Worth"", ""One Address"", ""View Development Permits""]","[""Menu"", ""Maps & Apps"", ""Data Categories"", ""Business"", ""City Government"", ""Development & Infrastructure"", ""Environment & Health"", ""Financial"", ""Property Data"", ""Public Safety"", ""Services & Recreation"", ""Technology & Communications"", ""Transportation"", ""DISCLAIMER""]","[""Police Report Search"", ""Crime Data Map"", ""One Address"", ""Permit Locations Map"", ""City Document Search"", ""Health Inspections"", ""GIS Data Download"", ""Code Violations Map"", ""Developer Resources"", ""External Resources""]",[],[],[],"Skip to main content Skip to footer links Sign In Home Data Help Contact Back to City of Fort Worth Menu Menu Close Home Data Help Contact Back to City of Fort Worth Sign In Search Welcome to Open Data Portal for the City of Fort Worth Increasing Transparency & Making Data Easy To Find BROWSE OUR DATA Welcome to Open Data Portal for the City of Fort Worth Increasing Transparency & Making Data Easy To Find BROWSE OUR DATA One Address Search One Address to Find City Data ONEADDRESS.FORTWORTHTEXAS.GOV View Development Permits Check Out This Interactive Visualization of Building Permits At The City CLICK TO SEE Checking in seconds ... Search Maps & Apps Police Report Search Search for a Police Report filed at the City of Fort Worth Crime Data Map Crime Maps. See what is going on in your neighborhood One Address Search One Address and find all of the data that the city has for this location Permit Locations Map Wondering if that construction site has permits? Here is a map of building permits around town City Document Search Search City Documents for Council Agendas and other relevant docs Health Inspections Search for Health Inspection Reports on Fort Worth Restaurants, Childcare, and Pools GIS Data Download Need GIS data to work with? Download it through this easy app Code Violations Map Take a look at Code Violations across the city and in your area Checking in seconds ... Developer Resources Developer Resources Socrata API ArcGIS Online API Checking in seconds ... External Resources STATE OF TEXAS FEMA OPEN DATA WAZE Traffic Site Checking in seconds ... Data Categories Business City Government Development & Infrastructure Environment & Health Financial Property Data Public Safety Services & Recreation Technology & Communications Transportation Checking in seconds ... " -3254,https://www.fairfaxcounty.gov/police/chief/generalorders/policies/officerinvolvedshooting ,Officer Involved Shootings,Police & Public Interactions,"","",404,"","","","","","","","" -3255,https://police.fortworthtexas.gov/Public/annual-reports,Calls for Service,Police & Public Interactions,Annual Reports,"",200,Error retrieving title: dictionary changed size during iteration,"[""Police Department""]","[""Annual Reports"", ""CrimeMapping.com""]","[""Public Info"", ""Resources"", ""Helpful Links"", ""Connect With FWPD""]",[],[],[],"Police Department About FWPD FWPD Home #FortWorthSafe About the Chief Badge & Patch History Department History FAQ's In Memoriam LGTBQ / FWPD Family National Initiative Organizational Chart Recognition Program Privacy Policy North Command South Command Tactical Command Investigative & Support Command Operational Command Patrol Central Division East Division North Division Northwest Division South Division West Division Support Services Auto Pound Civilian Response Unit Commercial Vehicle Enforcement Communications Division Community Alliance Division Crisis Intervention Team Digital Forensics Fugitive Unit Human Trafficking Intelligence Section Mounted Patrol Narcotics Professional Standards Division SEER SWAT Tactical Medic Unit Tarrant County 5 Stones Taskforce Technology Services Traffic Investigation Unit Vice Unit Crime Info & Prevention #FortWorthSafe Crime Information Victim Assistance CCPD Board of Directors Emerging Partners Mission Partners Technology at Work Get Involved #FortWorthSafe Active Shooter Response Training CERT (Community Emergency Response Team) Citizens on Patrol Citizens Police Academy Clergy and Police Alliance (C.A.P.A) Cold Cases Community Forums Crime Prevention Unit Fort Worth Police Explorer Program Ministers Against Crime (MAC) National Night Out Police Athletic League Ride-In Program Recruiting Recruiting Public Info #FortWorthSafe Annual Reports Arbitration Reports Crime Reports Demographics/Diversity Report FWPD Strategic Plan General Orders Officer Involved Shootings Public Relations Office Racial Profiling Report Use of Force Report Contact How Do I....? Contact my NPO/Beat Officer? File a Compliment or Complaint? File a Report Get a copy of my Offense Report? Locate Sex Offenders Near Me? Submit a Tip? File an Open Records Request? Register My Surveillance Camera(s)? Get a copy of my Accident Report? Annual Reports The Fort Worth Police Department publishes an Annual Report to catalog and highlight our agency’s accomplishments over the past year. The Annual Report provides a comprehensive review of department activities, crime rate, and highlighted stories of community interest. Click on the Annual Report icon below to access our year in review. Annual Reports 2022 Annual Report 2021 Annual Report 2020 Annual Report 2019 Annual Report 2018 Annual Report 2017 Annual Report 2016 Annual Report 2015 Annual Report Public Info #FortWorthSafe Annual Reports Arbitration Reports Crime Reports Demographics/Diversity Report Equal Employment Opportunity Plan FWPD Strategic Plan General Orders Newsroom Officer Involved Shootings Public Relations Office Racial Profiling Report Use of Force Report CrimeMapping.com We are pleased to provide CrimeMapping.com to search preliminary crime information for crimes near an address. CrimeMapping.com provides an alert system that will allow residents and business owners to receive email alerts regarding recent incident activity in their desired area. Learn More Resources Recruiting Open Data Portal Careers Helpful Links City of Fort Worth OneAddress Records & Public Information Special Needs Assistance Program (SNAP) Connect With FWPD Get email updates from the Fort Worth Police Department. Police Administration Bob Bolen Public Safety Complex 505 W. Felix St. Fort Worth, TX 76115 Twitter Facebook Google+ © Fort Worth Police Department. All rights reserved " -3256,https://www.denvergov.org/opendata/dataset/city-and-county-of-denver-police-pedestrian-stops-and-vehicle-stops,Stops,Police & Public Interactions,Denver Open Data Catalog: Police Pedestrian Stops and Vehicle Stops,This dataset includes person and vehicle stops by the Denver Police Department from the Computer Aided Dispatch system for the previous four calendar years and the current year to date. Data without a...,200,Home - City and County of Denver,[],"[""Police Pedestrian Stops and Vehicle Stops"", ""Disclaimer"", ""Resources"", ""Details"", ""Tags"", ""Open Data License""]","[""Open Data Catalog""]",[],"[""ONLINE SERVICES"", ""OPEN DATA"", ""A - Z SERVICES""]",[],"" -3257,https://police.fortworthtexas.gov/Public/,Use of Force Reports,Police & Public Interactions,Crime Reports,"",200," - Welcome to the Fort Worth Police Department -","[""Police Department""]","[""Crime Reports"", ""Search One Address. Find Everything.""]","[""Public Info"", ""Resources"", ""Helpful Links"", ""Connect With FWPD""]",[],[],[],"Police Department About FWPD FWPD Home #FortWorthSafe About the Chief Badge & Patch History Department History FAQ's In Memoriam LGTBQ / FWPD Family National Initiative Organizational Chart Recognition Program Privacy Policy North Command South Command Tactical Command Investigative & Support Command Operational Command Patrol Central Division East Division North Division Northwest Division South Division West Division Support Services Auto Pound Civilian Response Unit Commercial Vehicle Enforcement Communications Division Community Alliance Division Crisis Intervention Team Digital Forensics Fugitive Unit Human Trafficking Intelligence Section Mounted Patrol Narcotics Professional Standards Division SEER SWAT Tactical Medic Unit Tarrant County 5 Stones Taskforce Technology Services Traffic Investigation Unit Vice Unit Crime Info & Prevention #FortWorthSafe Crime Information Victim Assistance CCPD Board of Directors Emerging Partners Mission Partners Technology at Work Get Involved #FortWorthSafe Active Shooter Response Training CERT (Community Emergency Response Team) Citizens on Patrol Citizens Police Academy Clergy and Police Alliance (C.A.P.A) Cold Cases Community Forums Crime Prevention Unit Fort Worth Police Explorer Program Ministers Against Crime (MAC) National Night Out Police Athletic League Ride-In Program Recruiting Recruiting Public Info #FortWorthSafe Annual Reports Arbitration Reports Crime Reports Demographics/Diversity Report FWPD Strategic Plan General Orders Officer Involved Shootings Public Relations Office Racial Profiling Report Use of Force Report Contact How Do I....? Contact my NPO/Beat Officer? File a Compliment or Complaint? File a Report Get a copy of my Offense Report? Locate Sex Offenders Near Me? Submit a Tip? File an Open Records Request? Register My Surveillance Camera(s)? Get a copy of my Accident Report? Crime Reports The Fort Worth Police Department publishes quarterly crime reports to catalog crime statistics and highlight our agency’s accomplishments over the past year. The quarterly reports provide a comprehensive review of department activities, crime rate, and highlighted stories of community interest. 2023 Quarterly Reports 2023 1st Quarter Crime Report 2023 2nd Quarter Crime Report 2023 3rd Quarter Crime Report 2023 4th Quarter Crime Report 2022 Quarterly Reports 2022 1st Quarter Crime Report 2022 2nd Quarter Crime Report 2022 3rd Quarter Crime Report 2022 4th Quarter Crime Report 2021 Quarterly Reports 2021 1st Quarter Crime Report 2021 2nd Quarter Crime Report 2021 3rd Quarter Crime Report 2021 4th Quarter Crime Report 2020 Quarterly Reports 2020 1st Quarter Crime Report 2020 2nd Quarter Crime Report 2020 3rd Quarter Crime Report 2020 4th Quarter Crime Report Public Info #FortWorthSafe Annual Reports Arbitration Reports Crime Reports Demographics/Diversity Report Equal Employment Opportunity Plan FWPD Strategic Plan General Orders Newsroom Officer Involved Shootings Public Relations Office Racial Profiling Report Use of Force Report Search One Address. Find Everything. Find out who your Division Commander is, Neighborhood Police Officer (NPO) and more. Learn More Resources Recruiting Open Data Portal Careers Helpful Links City of Fort Worth OneAddress Records & Public Information Special Needs Assistance Program (SNAP) Connect With FWPD Get email updates from the Fort Worth Police Department. Police Administration Bob Bolen Public Safety Complex 505 W. Felix St. Fort Worth, TX 76115 Twitter Facebook Google+ © Fort Worth Police Department. All rights reserved " -3258,https://police.fortworthtexas.gov/UI/Resource.aspx?p=88a63b32-398a-493c-a125-03bcfb3f1002,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3259,https://www.denvergov.org/opendata/dataset/city-and-county-of-denver-crime,Crime Statistics,Agency-Published Resources,Denver Open Data Catalog: Crime,"Description -This dataset includes criminal offenses in the City and County of Denver for the previous five calendar years plus the current year to date. The data is based on the National Incident Based...",200,Home - City and County of Denver,[],"[""Crime"", ""Description"", ""Disclaimer"", ""About Crime Data"", ""Withheld Data"", ""About Crime Locations"", ""About Annual Data Snapshots"", ""Resources"", ""Details"", ""Tags"", ""Open Data License""]","[""Open Data Catalog""]",[],"[""ONLINE SERVICES"", ""OPEN DATA"", ""A - Z SERVICES""]",[],"" -3261,https://fargond.gov/city-government/departments/police/faqs/fargo-police-policy-manual,Policies & Contracts,Info About Agencies,The City of Fargo - Fargo Police Policy Manual,"",200,The City of Fargo - Home Page,"[""Fargo Police Policy Manual""]","[""""]","[""Fargo City Hall"", ""Mayor's Office"", ""The City of Fargo"", ""Quick Links"", ""Contact"", ""Stay Updated""]",[],[],[],"Search Menu City of Fargo translate increase text size Search Skip Nav Live Access TV Cass Clay Alerts Emergency Preparedness FargoStreets Flooding Garbage & Recycling Health Homelessness Housing How Do I? Know Your Neighborhood Library ND Cares Parking Pets & Stray Animals Police & Fire Property Ownership Snow Removal Report A Challenge Roadways Transportation Utility Billing & Online Payments Utility Services Work Bids, RFQs, RFPs Career Opportunities Commercial Permitting Process Commercial Garbage & Recycling Doing Business Engineering Grants & Exemptions How Do I? Improving Fargo Inspections ND Cares Planning & Development Utility Billing & Online Payments Licensing & Permits Explore About Fargo Attractions Accommodations Airport Business Improvement District Dining Downtown Fargo Economic Development Corp. FMWF Chamber of Commerce Parks & Recreation Parking Photo Galleries Visitor's Bureau City & Government Mayor's Office City Commission City Administration Boards & Commissions TV Fargo New City Hall Project City Ordinances City Budget Departments Elections/Voting FM Area Diversion Project Green Fargo Career Opportunities Legal Holidays News & Events Calendar City News Room Far More On Demand iFargo Newsletters Media Relations Photo Galleries Social Media Center Search Search City of Fargo Search Access TV Cass Clay Alerts Emergency Preparedness FargoStreets Flooding Garbage & Recycling Health Homelessness Housing How Do I? Know Your Neighborhood Library ND Cares Parking Pets & Stray Animals Police & Fire Property Ownership Snow Removal Report A Challenge Roadways Transportation Utility Billing & Online Payments Utility Services Bids, RFQs, RFPs Career Opportunities Commercial Permitting Process Commercial Garbage & Recycling Doing Business Engineering Grants & Exemptions How Do I? Improving Fargo Inspections ND Cares Planning & Development Utility Billing & Online Payments Licensing & Permits About Fargo Attractions Accommodations Airport Business Improvement District Dining Downtown Fargo Economic Development Corp. FMWF Chamber of Commerce Parks & Recreation Parking Photo Galleries Visitor's Bureau Mayor's Office City Commission City Administration Boards & Commissions TV Fargo New City Hall Project City Ordinances City Budget Departments Elections/Voting FM Area Diversion Project Green Fargo Career Opportunities Legal Holidays Calendar City News Room Far More On Demand iFargo Newsletters Media Relations Photo Galleries Social Media Center " -3262,https://www.fairfaxcounty.gov/policecivilianreviewpanel/reports,Complaints & Misconduct,Info About Officers,Reports and Documents | Police Civilian Review Panel,"Fairfax County, Virginia - Police Civilian Review Panel Reports",200,Fairfax County Homepage | Fairfax County,"[""Language Selection"", ""Police Civilian Review Panel"", ""Reports and Documents""]","[""FFX Global Navigation"", ""Department Resources"", ""Review Reports"", ""Annual Reports"", ""Panel Four-Year Review 2020"", ""Panel Recommendations Matrix"", ""Panel Procedures""]","[""Foundational Documents"", ""Board of Supervisors Action Items"", ""Fairfax Virtual Assistant""]","[""Police Civilian Review Panel Alert:""]",[],"[""Translate"", ""Awards"", ""Site Feedback"", ""PRIVACY POLICY & COPYRIGHT"", ""Main Address"", ""Site Tools"", ""Support"", ""Additional Resources""]","" -3263,https://www.kckpd.org/contact.html,Contact Info & Agency Meta,Info About Agencies,"Contacts Kansas City, Kansas Police Department",Contact information for KCK Police Dept.,200,"Home Kansas City, Kansas Police Department","[""Contacts""]","[""Auto Release"", ""Alarm Permits"", ""Animal Services"", ""Career Opportunities"", ""Community Policing"", ""Chief's Office"", ""CSI Unit"", ""FOP Lodge #4"", ""Hit and Run Investigations"", ""Investigations"", ""Internal Affairs"", ""Media Relations"", ""Narcotics Hotline"", ""Patrol Bureau"", ""Property Room"", ""Report Desk"", ""Security Guard Permits"", ""Traffic Unit"", ""Services Bureau"", ""Police Academy"", ""Victim Services""]","[""Summer Youth Cadet Program - Registration Now Open"", ""Contact Us"", ""Quick Links"", ""Stay Informed""]",[],[],[],"opens in new tab or window Summer Youth Cadet Program - Registration Now Open Know a KCK teen with an interest in law enforcement or community service? This paid, 8-week program operates out of our Community Policing Unit. Learn more & apply under the Youth Engagement tab. Summer Youth Cadet Program - Registration Now Open Know a KCK teen with an interest in law enforcement or community service? This paid, 8-week program operates out of our Community Policing Unit. Learn more & apply under the Youth Engagement tab. Summer Youth Cadet Program - Registration Now Open Know a KCK teen with an interest in law enforcement or community service? This paid, 8-week program operates out of our Community Policing Unit. Learn more & apply under the Youth Engagement tab. Summer Youth Cadet Program - Registration Now Open Know a KCK teen with an interest in law enforcement or community service? This paid, 8-week program operates out of our Community Policing Unit. Learn more & apply under the Youth Engagement tab. Summer Youth Cadet Program - Registration Now Open Know a KCK teen with an interest in law enforcement or community service? This paid, 8-week program operates out of our Community Policing Unit. Learn more & apply under the Youth Engagement tab. Know a KCK teen with an interest in law enforcement or community service? This paid, 8-week program operates out of our Community Policing Unit. Learn more & apply under the Youth Engagement tab. " -3264,https://transparency.jaxsheriff.org/Content/Files/PedestrianCitations.pdf,Stops,Police & Public Interactions,"","",404,"","","","","","","","" -3265,"https://www.indy.gov/activity/police-administration#:~:text=IMPD%20values&text=We%20will%20only%20use%20deadly,no%20other%20options%20are%20available.",Policies & Contracts,Info About Agencies,indy.gov,"",200,indy.gov,"[""""]","[""""]",[],[],[],[],Skip to main content Services Topics Agencies Payments Calendar Español search Services Topics Agencies Payments Calendar Español search search search Need Help? Privacy Policy Need Help? Privacy Policy -3266,https://data.kcmo.org/browse?limitTo=datasets&q=%22KCPD+Crime+Data%22&sortBy=relevance&utf8=%E2%9C%93,Crime Statistics,Agency-Published Resources,"Results for """"KCPD Crime Data"""", matching type of Datasets | Page 1 of 2 | Open Data KC | data.kcmo.org","",200,Open Data KC | data.kcmo.org,"[""Categories"", ""Tags""]","[""Menu"", ""View Types > Datasets"", ""Sort"", ""Sort by Most Relevant"", ""Filter"", ""Authority"", ""Categories"", ""View Types"", ""Tags"", ""KCPD Crime Data 2020"", ""KCPD Crime Data 2015"", ""KCPD Crime Data 2022"", ""KCPD Crime Data 2018"", ""KCPD Crime Data 2016"", ""KCPD Crime Data 2023"", ""KCPD Crime Data 2019"", ""KCPD Crime Data 2017"", ""KCPD Crime Data 2021"", ""KCPD Crime Data 2010 Final"", ""A-Z"", ""A-Z""]",[],[],[],[],Skip to main content Skip to footer links -3267,https://www.fresno.gov/police/wp-content/uploads/sites/5/2020/08/PolicyManual-Redacted-December-2021_Redacted.pdf,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3268,https://open.jacksonms.gov/,List of Data Sources,Info About Agencies,Welcome - City of Jackson Open Data,"",200,Welcome - City of Jackson Open Data ,"[""City of Jackson Open Data""]","[""Groups"", ""Showcases"", ""Popular Datasets"", ""New and Recent Datasets""]","[""Search data"", ""Popular tags"", ""City of Jackson Strategic Plan"", ""City of Jackson 311 Portal"", ""Thriving Education System"", ""Flooding Map"", ""Jackson's Census Profile"", ""Healthy Citizens"", ""Infrastructure"", ""City of Jackson Official Site"", ""Our Population At A Glance"", ""Transparency Portal"", ""Data Charts Depository"", ""City of Jackson Strategic Plan"", ""City of Jackson 311 Portal"", ""Thriving Education System"", ""Flooding Map"", ""Ward Boundaries"", ""Population by Gender"", ""Police Precinct city of Jackson and Wards"", ""GAP Achievement Analysis"", ""Chlamydia Characteristics"", ""Chlamydia Characteristics"", ""Population Density"", ""Migration"", ""Owners VS Renters"", ""Traffic Deaths""]",[],[],[],"Skip to content Log in Register Log in Register Toggle navigation Datasets Organizations Groups Help About Search Datasets Toggle navigation Datasets Organizations Groups Help About Search Datasets Search Datasets City of Jackson Open Data We are proud to share our City's data and performance goals with you! Search data Search Popular tags gis GIS jackson Groups Educational Opportunities Welcoming City Occupational Opportunities Healthy Citizens Showcases Previous City of Jackson Strategic Plan View City of Jackson Strategic Plan City of Jackson 311 Portal View City of Jackson 311 Portal Thriving Education System View Thriving Education System Flooding Map View Flooding Map Jackson's Census Profile View Jackson's Census Profile Healthy Citizens View Healthy Citizens Infrastructure View Infrastructure City of Jackson Official Site View City of Jackson Official Site Our Population At A Glance View Our Population At A Glance Transparency Portal View Transparency Portal Data Charts Depository View Data Charts Depository City of Jackson Strategic Plan View City of Jackson Strategic Plan City of Jackson 311 Portal View City of Jackson 311 Portal Thriving Education System View Thriving Education System Flooding Map View Flooding Map Next Popular Datasets Browse popular datasets below and see what other citizens find interesting. Ward Boundaries 28 recent views HTML Population by Gender 18 recent views CSV Police Precinct city of Jackson and Wards 17 recent views HTML GAP Achievement Analysis 14 recent views CSV Chlamydia Characteristics 13 recent views CSV New and Recent Datasets Browse new or modified datasets below. Click to view details or explore content. Chlamydia Characteristics Updated on October 2, 2021 CSV Population Density Updated on October 2, 2021 CSV Migration Updated on October 2, 2021 CSV Owners VS Renters Updated on October 2, 2021 CSV Traffic Deaths Updated on October 2, 2021 CSV " -3269,https://www.huntsvilleal.gov/residents/public-safety/huntsville-police/police-operations/annual-reports/,Calls for Service,Police & Public Interactions,Annual Reports - City of Huntsville,Accreditation and annual reports for the Huntsville Police Department,200,403 Forbidden,"[""Annual Reports""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],"[""ANNUAL REPORT"", """", ""STRATEGIC PLAN"", """", ""CALEA REPORT"", ""Police CALEA Report 2016"", """"]","[""Contact"", ""In This Section"", ""Share & Print""]",[],"Main Menu Main Menu Residents Back Residents Animal Services Neighborhoods Public Safety Volunteer Cemeteries Pay a Ticket Streets & Transportation Water & Sewer Garbage & Recycling Parks & Recreation Resident Toolkit Business Back Business About Huntsville Big Picture GIS Maps & Data Employment Bid A Project Codes & Ordinances Economic Development File A Claim E-Bids Pay Taxes Licensing & Permits Development Back Development Bid A Project Economic Development MPO Streets & Roadwork Building & Construction GIS Maps Planning Water & Sewer Big Picture Master Plan Historic Preservation ePlans Submittal Environment Back Environment Air Quality Garbage & Recycling Noise Sustainability Find A Park Nature Preserves Recreation Water Trails & Greenways Pets Lost & Found Green Team Government Back Government Boards & Commissions City Council Finances & Budget Media Center City Calendar Departments Mayor's Office Municipal Court Vote Find A Job Codes & Ordinances Services Toggle Menu City of Huntsville Search Search for: Huntsville Police To protect and serve Operations Records & Courts Community Resources Join our Force Residents Public Safety Huntsville Police Police Operations Annual Reports ANNUAL REPORT Huntsville Police Department’s 2022 annual report on crime, operations, new initiatives STRATEGIC PLAN Huntsville Police Department’s Strategic Plan for 2022-2024 CALEA REPORT The Commission on Accreditation for Law Enforcement Agencies – the gold standard in public safety. CALEA reviews occur every four years. Police CALEA Report 2016 Contact Emergencies Dial 911 Non-Emergencies 256-722-7100 Case and Accident Report Information 256-427-7020 General Information 256-427-7009 or 256-427-7114 Crisis Intervention Team 256-427-7009 or 256-427-7114 Report Drug Activity 256-427-5456 In This Section Administration Annual Reports Internal Affairs Police Mission, Vision & Values Police Operating Directives Precincts Special Operations Report a problem or submit a service request using Huntsville Connect Get Started Share & Print Share to Facebook Twitter Instagram Print this page. Top Requests Pay A Ticket Get A Permit Business License Municipal Court Police Fire & Rescue Public Transit – Orbit Huntsville Connect City Jobs HSV TV City News Mar 22 Conveniently distracted: Hands-free devices often perilous for drivers Mar 21 Kitten Season is coming – beat the heat by spaying and neutering your cat Mar 21 Arts Huntsville Announces Panoply Arts Festival 2024 Highlights Mar 19 All systems go: Huntsville’s first major music festival to launch in September Mar 19 Why Where Matters: Huntsville to host GeoResilience Summit on April 3 Contact Us (256) 427-5000 Huntsville City Hall 308 Fountain Circle Huntsville, Alabama 35801 Facebook Twitter Instagram Social Directory © 2022 | City of Huntsville, Alabama ADA Privacy Policy Intranet Webmail COH ESS Website Feedback Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Search Toggle Menu City of Huntsville Toggle Menu Search Search Search for: Search for: Search for: Search for: Search for: Search for: Huntsville Police To protect and serve Huntsville Police To protect and serve Huntsville Police To protect and serve Huntsville Police To protect and serve Huntsville Police To protect and serve To protect and serve " -3270,https://www.jaxsheriff.org,Contact Info & Agency Meta,Info About Agencies,www.jaxsheriff.org - JaxSheriff.org,The official website of the Jacksonville Sheriff's Office (JSO),200," - www.jaxsheriff.org - JaxSheriff.org -",[],[],[],[],[],[],Skip to global navigation Skip to content Skip to search Skip to footer Skip to site map Access Key Legend JSO Shield Mobile Menu Jacksonville Sheriff's Office Show Children Sheriff's Office This Menu Has 8 Links Behind the Badge Community Engagement Opportunities Events Fallen Heroes History Find My District Mascot Open Data and Transparency Show Children Neighborhood This Menu Has 4 Links ConnectDuval Camera Registration Find My District Neighborhood Watch Program Sheriff's Watch Show Children Resources This Menu Has 23 Links Adult Entertainment Establishment License Alarm Registration AMBER Alerts Completed Calls for Dispatched Service Civil Process Compliment & Complaint Procedure Corrections Facility Information Driver Self Report of a Traffic Crash Crime Mapping Online Crime Reporting Emergency Preparedness Fees Inmate Information Information for Parents & Guardians Performer Work Identification Report Suspicious Activity Submit a Public Records Request Scheduled Road Closures Services We Offer Sexual Offenders & Predators Open Data and Transparency Permitless Carry in Florida Victim & Witness Services News Show Children Careers This Menu Has 13 Links Connect with a Recruiter Police Officer Corrections Officer Police Dispatcher Civilian Employment Community Service Officer Court Bailiff Officer Judicial Officer Records Personnel Auxiliary Officer School Crossing Guard Veterans FAQ Show Children Crime Tips This Menu Has 2 Links Cold Case Homicides Unsolved Crimes Show Children Notices This Menu Has 3 Links Public Meetings Public Auctions Traffic Safety/Sobriety Checkpoints Show Children Contact Us This Menu Has 2 Links Comprehensive List Hearing Impaired Assistance Events Search Search for: Translate Close English English Español Français Deutsch हिन्दी Português Pу́сский 한국말 中文 Tiếng Việt JSO Facebook JSO Twitter JSO Instagram JSO YouTube -3271,https://public.powerdms.com/HSVPS/tree/documents/123,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by Powered by Powered by Powered by -3272,http://www.vccahouston.org/cop/Training_Manual.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3273,https://mycity.maps.arcgis.com/apps/dashboards/8e62e67b8855477b993cfdc48a94ca17,Stops,Police & Public Interactions,ArcGIS Dashboards,ArcGIS Dashboards,200,Error retrieving title: 'NoneType' object has no attribute 'text',[],[],[],[],[],[],"" -3274,https://gis-cityoffresno.hub.arcgis.com/search?tags=safety,List of Data Sources,Info About Agencies,ArcGIS Hub,"Discover, analyze and download data from ArcGIS Hub. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",200,ArcGIS Hub,[],[],[],[],[],[],"" -3275,https://www.indy.gov/activity/police-department-annual-reports-statistics,Complaints & Misconduct,Info About Officers,indy.gov,"",200,indy.gov,"[""""]","[""""]",[],[],[],[],Skip to main content Services Topics Agencies Payments Calendar Español search Services Topics Agencies Payments Calendar Español search search search Need Help? Privacy Policy Need Help? Privacy Policy -3278,https://transparency.jaxsheriff.org/Content/Files/2020YearInReview.pdf,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -3279,https://public.powerdms.com/HSVPS/tree/documents/40,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by Powered by Powered by Powered by -3280,https://www.jacksonms.gov/ucr/,Crime Statistics,Agency-Published Resources,"Uniform Crime Reporting - Jackson, MS","",200,"City of Jackson - Jackson, MS","[""Uniform Crime Reporting""]","[""Primary menu links"", ""Action toolbar"", ""Front Desk"", ""Uniform Crime Reporting (UCR)"", ""Contact"", ""Subscribe"", ""Connect""]","[""Today in Jackson"", ""°F Low: °F - High: °F"", ""Your local services""]",[],"[""""]",[],"Jackson, MS Primary menu links Residents Businesses Visitors Government News Contact Action toolbar Answers Payments Report Issue Search Primary menu links Residents Businesses Visitors Government News Contact Action toolbar Answers Payments Report Issue Search Jackson, MS Jackson, MS Jackson, MS Proclamation of Local Emergency ___________________________________________________________________________________________________________________________________ The City of Jackson’s Water and Sewer Business Administration is now JXN Water. Click here . _____________________________________________________________________________________________________________________________________ PEG Network Off-Air Announcement: PEG Network is currently off the air as we undergo a relocation. We appreciate your patience during this transition. In the meantime, you can stay connected with PEG Network here or visit our YouTube channel at www.youtube.com/@JacksonPEGNetwork Uniform Crime Reporting Jackson Police Department Uniform Crime Reporting Command Staff Police Precincts Uniform Crime Reporting Investigative Services Bureau Administrative Services Bureau Support Services Bureau Patrol Services Bureau Contact Us Back Training & Recruitment Front Desk (601) 960-1808 Uniform Crime Reporting (UCR) DISCLAIMER: The criminal activity data provided, herein, is raw data only.  While the City strives to make the information on this website as timely and accurate as possible, the City makes no claims, promises, or guarantees about the accuracy, legality, relevance, timeliness, completeness, or adequacy of the data, and expressly disclaims liability for errors and omissions in the content of this data.  The City bears no responsibility for any conclusions, perceptions or interpretations derived from the data; or for any use of the data whatsoever. For more information about the FBI's Uniform Crime Reporting (UCR) Program, click here . Name Download July 2020-UCR PDF (271 KB) June 2020-UCR PDF (266 KB) May 2020-UCR PDF (260 KB) April 2020 – UCR PDF (268 KB) March 2020 – UCR PDF (260 KB) December 2019 – UCR PDF (226 KB) November 2019 – UCR PDF (232 KB) October 2019 – UCR PDF (221 KB) September 2019 – UCR PDF (261 KB) August 2019 – UCR PDF (220 KB) April 2019 – UCR PDF (226 KB) July 2019 – UCR PDF (263 KB) June 2019 – UCR PDF (263 KB) May 2019 – UCR PDF (258 KB) March 2019 – UCR PDF (225 KB) February 2019 – UCR PDF (217 KB) " -3281,https://www.huntsvilleal.gov/development/building-construction/gis/data-depot/open-data/,List of Data Sources,Info About Agencies,"","",404,"","","","","","","","" -3282,https://transparency.jaxsheriff.org/,Complaints & Misconduct,Info About Officers,Home Page - JSO Open Data,"",200," - Home Page - JSO Open Data -","[""Open Data & Transparency""]","[""Available Data""]",[],[],[],[],Jacksonville Sheriff's Office Open Data & Transparency Jacksonville Sheriff's Office Open Data & Transparency Jacksonville Sheriff's Office Open Data & Transparency JACKSONVILLE SHERIFF'S OFFICE JSO Open Data Home Data Officer-Involved Shootings Pertinent Policies Agency Transparency Arrests Body Worn Camera Program Overview Body Worn Camera Policies Code of Conduct Internal Affairs Use of Force Vehicle Pursuit Jacksonville Homicide Data Info Sheets Pedestrian Safety Sheet Pedestrian Citations by Race/Gender Guide to JSO Complaint Process FDOT Grant Sheet 2023 Year In Review 2022 Year In Review 2022 Community Survey 2021 Year In Review 2020 Community Survey 2020 Year In Review 2019 Year In Review 2018 Year In Review 2017 Year In Review 2016 Year In Review 2015 Year In Review Open Data Report Briefs 2022 Open Data Report 2021 Open Data Report 2020 Open Data Report 2019 Open Data Report 2018 Open Data Report 2017 Open Data Report 2016 Open Data Report 2015 Open Data Report Trending Topics IACP Assessment IACP Assessment IACP Assessment Response Record Request JACKSONVILLE SHERIFF'S OFFICE JSO Open Data Home Data Officer-Involved Shootings Pertinent Policies Agency Transparency Arrests Body Worn Camera Program Overview Body Worn Camera Policies Code of Conduct Internal Affairs Use of Force Vehicle Pursuit Jacksonville Homicide Data Info Sheets Pedestrian Safety Sheet Pedestrian Citations by Race/Gender Guide to JSO Complaint Process FDOT Grant Sheet 2023 Year In Review 2022 Year In Review 2022 Community Survey 2021 Year In Review 2020 Community Survey 2020 Year In Review 2019 Year In Review 2018 Year In Review 2017 Year In Review 2016 Year In Review 2015 Year In Review Open Data Report Briefs 2022 Open Data Report 2021 Open Data Report 2020 Open Data Report 2019 Open Data Report 2018 Open Data Report 2017 Open Data Report 2016 Open Data Report 2015 Open Data Report Trending Topics IACP Assessment IACP Assessment IACP Assessment Response Record Request JACKSONVILLE SHERIFF'S OFFICE JSO Open Data Home Data Officer-Involved Shootings Pertinent Policies Agency Transparency Arrests Body Worn Camera Program Overview Body Worn Camera Policies Code of Conduct Internal Affairs Use of Force Vehicle Pursuit Jacksonville Homicide Data Info Sheets Pedestrian Safety Sheet Pedestrian Citations by Race/Gender Guide to JSO Complaint Process FDOT Grant Sheet 2023 Year In Review 2022 Year In Review 2022 Community Survey 2021 Year In Review 2020 Community Survey 2020 Year In Review 2019 Year In Review 2018 Year In Review 2017 Year In Review 2016 Year In Review 2015 Year In Review Open Data Report Briefs 2022 Open Data Report 2021 Open Data Report 2020 Open Data Report 2019 Open Data Report 2018 Open Data Report 2017 Open Data Report 2016 Open Data Report 2015 Open Data Report Trending Topics IACP Assessment IACP Assessment IACP Assessment Response Record Request -3283,https://www.kckpd.org/assets/Final2020KCKPDAnnualReport.pdf,Use of Force Reports,Police & Public Interactions,"","",404,"","","","","","","","" -3284,https://data.indy.gov/,List of Data Sources,Info About Agencies,Open Indy Data Portal,Open Indy Data Portal,200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -3285,"https://cityprotect.com/map/list/agencies?toDate=2020-06-08T23:59:59.999Z&fromDate=2020-06-05T00:00:00.000Z&pageSize=2000&parentIncidentTypeIds=149,150,148,8,97,104,165,98,100,179,178,180,101,99,103,163,168,166,12,161,14,16,15&zoomLevel=5&latitude=36.823106499999376&longitude=-95.84553739999838&days=1,2,3,4,5,6,7&startHour=0&endHour=24&timezone=%2B00:00",Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -3286,https://www.kcpd.org/media/3251/pi-21-01-response-to-resistance-2221.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3287,https://www.jacksonms.gov/jpd-contact-us/,Contact Info & Agency Meta,Info About Agencies,"JPD Contact Us - Jackson, MS","",200,"City of Jackson - Jackson, MS",[],"[""Primary menu links"", ""Action toolbar"", ""Major Investigations"", ""Patrol Operations Division"", ""Administrative Support Division"", ""Support Services Division"", ""Contact"", ""Subscribe"", ""Connect""]",[],[],"[""""]",[],"Jackson, MS Primary menu links Residents Businesses Visitors Government News Contact Action toolbar Answers Payments Report Issue Search Primary menu links Residents Businesses Visitors Government News Contact Action toolbar Answers Payments Report Issue Search Jackson, MS Jackson, MS Jackson, MS Proclamation of Local Emergency ___________________________________________________________________________________________________________________________________ The City of Jackson’s Water and Sewer Business Administration is now JXN Water. Click here . _____________________________________________________________________________________________________________________________________ PEG Network Off-Air Announcement: PEG Network is currently off the air as we undergo a relocation. We appreciate your patience during this transition. In the meantime, you can stay connected with PEG Network here or visit our YouTube channel at www.youtube.com/@JacksonPEGNetwork Jackson Police Department Contact Us Command Staff Police Precincts Uniform Crime Reporting Investigative Services Bureau Administrative Services Bureau Support Services Bureau Patrol Services Bureau Contact Us Back Training & Recruitment Police Records 601-960-1345 Court Services 601-960-1947 Non-Emergency 601-960-1234 Emergency 9-1-1 Major Investigations Accident Investigations 601-960-1353 / 601-960-1689 Auto Theft 601-960-2713 / 601-960-1641 Cease Fire 601-960-2304 / 601-960-1805 Crime Stoppers 601-355-TIPS (8477) Chaplains 601-960-1890 Crime Analysis 601-960-1251 / 601-960-1082 Crime Scene Investigations 601-960-1350 Forensic Crime Lab 601-960-1285 Forgery/Fraud 601-960-1285 / 601-960-2357 Homicide & Robbery 601-960-1205 / 601-960-2293 Intelligence 601-960-1512 Juvenile/ Sex Crimes 601-960-1210 / 601-960-2293 Missing Persons 601-960-2328 / 601-960-2234 Property Crimes 601-960-1641 / 601-960-2374 Vice & Narcotics 601-960-1202 / 601-960-1206 Patrol Operations Division Special Operations 601-960-1328 / 601-960-1907 Precinct 1 601-960-0001 / 601-960-1417 Precinct 2 601-960-0002 / 601-960-2409 Precinct 3 601-960-0003 / 601-960-1250 Precinct 4 601-960-0004 / 601-960-1453 Administrative Support Division Accreditation & Backgrounds 601-960-1264 / 601-960-0243 Crime Prevention 601-960-2049 License & Permit 601-960-1375 / 601-960-1342 JPD Personnel 601-960-1200 / 601-960-1958 Records Management Unit 601-960-1341 / 601-960-1342 Tele-Serve 601-960-0295 / 601-960-0267 Adult Holding Facility 601-960-1279 Animal Control 601-960-1771 Court Bailiffs 601-960-0978 / 601-960-1315 Evidence & Property 601-960-1311 / 601-960-1312 Impound Lot 601-960-0671 / 601-960-1383 Public Safety Communications 601-960-1234 Neighborhood Enhancement 601-960-0671 / 601-960-1383 Warrants 601-960-2731 Community Relations 601-960-1389 Crisis Intervention 601-960-1433 / 601-960-1434 Evidence & Property 601-960-1348 Training Academy 601-960-1378 Civil Disturbance Team 601-960-1378 Support Services Division Grants Unit 601-960-0729 Public Information Officer 601-960-1323 Security Guard - City Buildings 601-960-1037 Mayor's Dignitary 601-960-1037 Fleet Management 601-960-1337 " -3288,https://www.kcpd.org/contact-us/,Contact Info & Agency Meta,Info About Agencies,Contact Us,"",200,"Home | Kansas City, Missouri Police Department","[""Contact Us""]","[""Contact Us""]",[],[],[],[],KANSAS CITY MISSOURI POLICE DEPARTMENT EMERGENCY: 911 | NON-EMERGENCY: 816-234-5111 | INFORMATION: 816-234-5000 Menu Close Menu Careers Careers CURRENT OPENINGS Life@KCPD Military & KCPD Women & KCPD Lateral Transfers Hiring Process Salary & Benefits Meet Our Recruiters The Academy Upcoming Recruiting and Testing Events College Internship Program About History Memorial Board of Police Commissioners Members Calendar Agendas Minutes and Votes Chief Stacey Graves Historic Chief's Blog Chief's Blog Office of General Counsel Office of Community Complaints Where to File a Complaint Mission Mediation Annual Reports Organizational Structure Regional Police Academy Specialized Units Gang Intelligence Squad Services Crime Lab Report and Video Requests Jail/Bonding Private Alarms Hire Off-Duty Private Officers Licensing Property and Evidence City Services Transparency Annual Reports Policies and Procedures Budget and Finance Title VI Program ADA Information for Police Facilities Body-Worn Cameras Privacy Policy Crime Prevention and Safety Tips Traffic Complaints Suspected Narcotics Activity Crime Prevention Tips and Brochures Information on Runaways Cyber Crime Prevention Submit an Anonymous Tip Crime Statistics Crime Mapping Victim Resources Victim Assistance Unit Domestic Violence Sex Crimes Safe Haven for Newborns Juvenile Section Homicide Unsolved Homicides Missing Persons Section Intimidation and Harassment Internet Crimes Against Children Economic Crimes Financial Crime Victim Information Criminal Offenses Investigated FAQ's Make a Police Report Online Busted Community Community Engagement Division Crisis Intervention Team Youth Services Community Interaction Officers Housing Authority LGBTQ Liaison Social Service Specialists Chaplains Resource Guide Neighborhood Crime Watch Citizen's Police Academy WatchKC FAQs Explorers Program Personal Safety Training Events Thank a KCPD Department Member The Police Foundation of Kansas City Ride-Alongs Trail of Heroes Media News Releases Alert KC Logos Media Contacts KCPD VLOG'S Contact Us Patrol Division Stations Central Patrol Division Station East Patrol Division Station Metro Patrol Division North Patrol Division Shoal Creek Patrol Division South Patrol Division Station Department Directory Patch Request Search EMERGENCY: 911 NON-EMERGENCY: 816-234-5111 INFORMATION: 816-234-5111 -3290,https://yourdata.wycokck.org/ (the county),List of Data Sources,Info About Agencies,"Unified Government of Wyandotte County Kansas City, KS","Unified Government of Wyandotte County Kansas City, Ks",200,"Error retrieving title: HTTPSConnectionPool(host='yourdata.wycokck.org', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1129)')))",[],[],[],[],[],[],"" -3292,https://transparency.jaxsheriff.org/Content/Files/JSO_Geographical_Operational_Assessment_Final.pdf,Crime Statistics,Agency-Published Resources,"","",404,"","","","","","","","" -3293,https://www.huntsvilleal.gov/residents/public-safety/huntsville-police/police-operations/administration/,Contact Info & Agency Meta,Info About Agencies,Administration - City of Huntsville,Contact police,200,403 Forbidden,"[""Administration""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],"[""ADMINISTRATION"", ""OPERATIONS"", ""CONTACT"", ""ADDRESSES"", ""MAIL""]","[""Contact"", ""Phone:"", ""Address:"", ""Email:"", ""Hours:"", ""In This Section"", ""Share & Print""]",[],Main Menu Main Menu Residents Back Residents Animal Services Neighborhoods Public Safety Volunteer Cemeteries Pay a Ticket Streets & Transportation Water & Sewer Garbage & Recycling Parks & Recreation Resident Toolkit Business Back Business About Huntsville Big Picture GIS Maps & Data Employment Bid A Project Codes & Ordinances Economic Development File A Claim E-Bids Pay Taxes Licensing & Permits Development Back Development Bid A Project Economic Development MPO Streets & Roadwork Building & Construction GIS Maps Planning Water & Sewer Big Picture Master Plan Historic Preservation ePlans Submittal Environment Back Environment Air Quality Garbage & Recycling Noise Sustainability Find A Park Nature Preserves Recreation Water Trails & Greenways Pets Lost & Found Green Team Government Back Government Boards & Commissions City Council Finances & Budget Media Center City Calendar Departments Mayor's Office Municipal Court Vote Find A Job Codes & Ordinances Services Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate -3294,https://www.houstontx.gov/police/general_orders/index.htm,Policies & Contracts,Info About Agencies,General Orders,"",200,Welcome to the City of Houston eGovernment Center,"[""""]","[""Houston Police Department"", ""POLICE Department"", ""Police Department Links""]","[""General Orders"", ""Series 100: Organization"", ""Series 200: Administration"", ""Series 300: Personnel Management"", ""Series 400: Equipment and Uniforms"", ""Series 500: Arrest and Detention"", ""Series 600: Operations"", ""Series 700: Evidence Control"", ""Series 800: Information and Records"", ""Series 900: Civilian Personnel""]",[],[],[],"" -3295,https://www.houstontx.gov/police/general_orders/600/600-17_ResponseToResistance.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3296,"https://www.communitycrimemap.com/?address=Kansas%20City,KS",Crime Maps & Reports,Agency-Published Resources,LexisNexis® Community Crime Map,"",200,LexisNexis® Community Crime Map,[],[],[],[],[],[],"" -3298,https://www.fresno.gov/police/police-contacts/,Contact Info & Agency Meta,Info About Agencies,Police Contacts – City of Fresno,"",200,403 Forbidden,"[""Fresno.gov / Quick Search""]","[""Police Contacts"", ""Fresno Policing Districts""]","[""Contact Police"", ""Additional Contacts"", ""Fresno has five policing districts."", ""Southwest"", ""Southeast"", ""Northeast"", ""Northwest"", ""Central"", ""Helpful Links"", ""Social""]","[""Emergency 911 (TTY/TDD)"", ""Non-Emergency (559) 621-7000 (TTY/TDD)"", ""Graffiti Hotline 311"", ""Narcotics Tip Line (559) 621-5900"", ""Gang Tip Line (559) 621-GANG (4264)"", ""See Policing Districts Map""]",[],[],"Skip to content Full Page Mobile Menu Toggle 559.621.CITY or call 311 City of Fresno Accessibility Services Community English Hmong Punjabi Spanish English Fresno.gov / Quick Search GO Home CITY OFFICIALS COMMUNITY BUSINESS JOBS Departments SERVICES Airports Budget Capital Projects City Attorney City Clerk City Council City Manager Convention Center Economic Development Finance Fire Fresno Animal Center General Services Information Services Parks Personnel Services Planning Police Public Utilities Public Works Mayor Transportation and FAX Contact Us @ 559.621.CITY | 2600 Fresno Street -Fresno, CA 93721 Staff Login City Officials Departments Business Jobs Police Department Police Contacts EMERGENCY 911 (TTY / TDD) Emergency 911 (TTY/TDD) Non-Emergency (559) 621-7000 (TTY/TDD) Graffiti Hotline 311 Narcotics Tip Line (559) 621-5900 Gang Tip Line (559) 621-GANG (4264) This email is not monitored 24/7 and it is not utilized to take police reports. Please call 9-1-1 to report an emergency and (559) 621-7000 to report a non-emergency situation Contact Police Contact Police First Name * Last Name * Email * Phone Number Subject * Message * Captcha If you are human, leave this field blank. Submit Additional Contacts Office Number Chief’s Office 559.621.2000 CCATT Auto Theft Tip Line 559.621.CCAT (2228) Internal Affairs 559.621.2730 Record Section 559.621.2500 Abandoned Vehicles 311 Traffic Enforcement 559.621.5050 Towed and Impounded Vehicles 559.621.2543 Patrol Division 559.621.2200 Investigative Services Division 559.621.2400 Police Activities League (PAL) 559.621.5061 Street Violence Section 559.621.2412 Concealed Weapon Permits 559.621.6562 Fiscal Affairs 559.621.2050 Narcotics/Vice Street Intelligence Anonymous Tip Line 559.621.5900 Ride Along Appointments 559.621.2200 Fresno Policing Districts Fresno has five policing districts. See Policing Districts Map The locations and phone numbers of the policing district offices are: Southwest 1211 Fresno Street Fresno, CA 93706 559.621.6100 Southeast 224 South Argyle Avenue Fresno, CA 93702 559.621.6300 Northeast 1450 E. Teague Fresno, CA 93720 559.621.6400 Northwest 3080 W. Shaw Avenue Fresno, CA 93711 559.621.6500 Central 3502 N. Blackstone Avenue Ste. 201 Fresno, CA 93726 559.621.6200 The Fresno Police Department welcomes your comments; however, the police department web e-mail system is not monitored 24 hours a day and generally not on weekends. This e-mail system is not used for reporting crimes or requesting immediate police response. If you want to notify us of ongoing criminal activity or suspicious circumstances, please call the Fresno Police directly at (559) 621-7000 to report this information or at 911 if a crime is in progress. E-mail sent to this address will be reviewed and answered; however, the review and answer process may take several days. If your matter cannot wait that long, please call the non-emergency line at (559) 621-7000 for assistance. Thank you. 2600 Fresno Street Fresno, CA 93721 Main: 559.621.CITY (2489) Helpful Links Live Broadcasts Fresno 311 Agendas & Meetings Social facebook.com/FresnoCA/ twitter.com/CityofFresno instagram.com/cityoffresno/ nextdoor.com/agency/city-of-fresno/ Contact Us Internet Policy Accessibility Staff © 2024 | City of Fresno Full Page Mobile Menu Toggle Full Page Mobile Menu Toggle City of Fresno Accessibility Services Community English Hmong Punjabi Spanish English Accessibility Services Community English Hmong Punjabi Spanish English English Hmong Punjabi Spanish English " -3299,https://media.graphcms.com/75EP0fDdRtesFrtrWE6Z,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3302,https://www.houstontx.gov/police/cs/Community_Crime_Map_hosted_by_LexisNexis.htm,Crime Maps & Reports,Agency-Published Resources,Community Crime Map hosted by LexisNexis.com,"",200,Welcome to the City of Houston eGovernment Center,"[""""]","[""Houston Police Department"", ""POLICE Department"", ""Police Department Links""]","[""Community Crime Map hosted by LexisNexis.com""]",[],[],[],"RESIDENTS 311 Help and Info Animal Adoptions Trash / Recycling Health Department Housing Parks and Recreation Open Data Report Fraud / Waste View More Residents ... BUSINESS Economic Development Permits / Building Codes Purchasing Division Business Opportunity View More Business ... VISITORS About Houston Calendar of Events Cultural Affairs Special Events Office Visitors / Tourism View More Visitors ... GOVERNMENT Office of the Mayor Mayor's Divisions City Controller City Council Departments Agenda of City Council Boards / Commissions Code of Ordinances View More Govt ... SERVICES 311 Help & Info Make a 311 Request Check 311 Status Parking Citation Traffic Tickets Water Bills View More Services ... CONTACT / SEARCH Houston Police Department > Police > Crime Statistics > Community Crime Map hosted by LexisNexis.com POLICE Department Community Crime Map hosted by LexisNexis.com LexisNexis® Community Crime Map is a public service that allows law enforcement to share selected crime data with the public. This application includes basic mapping, dashboards and analytics. Community Crime Map compiles crime data and other information from law enforcement agencies to make it easier for the public to stay informed about crime. Data provided via the Community Crime Map is cleaned to remove private information about addresses and people. https://communitycrimemap.com Police Department Links HPD HOME NEED HELP? ABOUT HPD OPPORTUNITIES CRIME STATISTICS TRANSPARENCY CRIME PREVENTION CONTACT HPD Home • 311 Help & Info • Contact Us • FAQs • Privacy Policy • CitizensNet © 2024. All rights reserved. City of Houston. RESIDENTS 311 Help and Info Animal Adoptions Trash / Recycling Health Department Housing Parks and Recreation Open Data Report Fraud / Waste View More Residents ... BUSINESS Economic Development Permits / Building Codes Purchasing Division Business Opportunity View More Business ... VISITORS About Houston Calendar of Events Cultural Affairs Special Events Office Visitors / Tourism View More Visitors ... GOVERNMENT Office of the Mayor Mayor's Divisions City Controller City Council Departments Agenda of City Council Boards / Commissions Code of Ordinances View More Govt ... SERVICES 311 Help & Info Make a 311 Request Check 311 Status Parking Citation Traffic Tickets Water Bills View More Services ... CONTACT / SEARCH RESIDENTS 311 Help and Info Animal Adoptions Trash / Recycling Health Department Housing Parks and Recreation Open Data Report Fraud / Waste View More Residents ... BUSINESS Economic Development Permits / Building Codes Purchasing Division Business Opportunity View More Business ... VISITORS About Houston Calendar of Events Cultural Affairs Special Events Office Visitors / Tourism View More Visitors ... GOVERNMENT Office of the Mayor Mayor's Divisions City Controller City Council Departments Agenda of City Council Boards / Commissions Code of Ordinances View More Govt ... SERVICES 311 Help & Info Make a 311 Request Check 311 Status Parking Citation Traffic Tickets Water Bills View More Services ... CONTACT / SEARCH Houston Police Department Houston Police Department " -3303,https://www.kcpd.org/transparency/office-of-community-complaints/annual-reports/,Complaints & Misconduct,Info About Officers,Annual Reports,"",200,"Home | Kansas City, Missouri Police Department",[],[],[],[],[],[],KANSAS CITY MISSOURI POLICE DEPARTMENT EMERGENCY: 911 | NON-EMERGENCY: 816-234-5111 | INFORMATION: 816-234-5000 Menu Close Menu Careers Careers CURRENT OPENINGS Life@KCPD Military & KCPD Women & KCPD Lateral Transfers Hiring Process Salary & Benefits Meet Our Recruiters The Academy Upcoming Recruiting and Testing Events College Internship Program About History Memorial Board of Police Commissioners Members Calendar Agendas Minutes and Votes Chief Stacey Graves Historic Chief's Blog Chief's Blog Office of General Counsel Office of Community Complaints Where to File a Complaint Mission Mediation Annual Reports Organizational Structure Regional Police Academy Specialized Units Gang Intelligence Squad Services Crime Lab Report and Video Requests Jail/Bonding Private Alarms Hire Off-Duty Private Officers Licensing Property and Evidence City Services Transparency Annual Reports Policies and Procedures Budget and Finance Title VI Program ADA Information for Police Facilities Body-Worn Cameras Privacy Policy Crime Prevention and Safety Tips Traffic Complaints Suspected Narcotics Activity Crime Prevention Tips and Brochures Information on Runaways Cyber Crime Prevention Submit an Anonymous Tip Crime Statistics Crime Mapping Victim Resources Victim Assistance Unit Domestic Violence Sex Crimes Safe Haven for Newborns Juvenile Section Homicide Unsolved Homicides Missing Persons Section Intimidation and Harassment Internet Crimes Against Children Economic Crimes Financial Crime Victim Information Criminal Offenses Investigated FAQ's Make a Police Report Online Busted Community Community Engagement Division Crisis Intervention Team Youth Services Community Interaction Officers Housing Authority LGBTQ Liaison Social Service Specialists Chaplains Resource Guide Neighborhood Crime Watch Citizen's Police Academy WatchKC FAQs Explorers Program Personal Safety Training Events Thank a KCPD Department Member The Police Foundation of Kansas City Ride-Alongs Trail of Heroes Media News Releases Alert KC Logos Media Contacts KCPD VLOG'S Contact Us Patrol Division Stations Central Patrol Division Station East Patrol Division Station Metro Patrol Division North Patrol Division Shoal Creek Patrol Division South Patrol Division Station Department Directory Patch Request Search EMERGENCY: 911 NON-EMERGENCY: 816-234-5111 INFORMATION: 816-234-5111 -3305,https://www.houstontx.gov/police/department_reports/department_reports_archives.htm,Complaints & Misconduct,Info About Officers,Department Reports Archives,"",200,Welcome to the City of Houston eGovernment Center,"[""""]","[""Houston Police Department"", ""Department Reports Archives:"", ""Annual Reports"", ""Accountability Document Prepared for the Greater Houston Partnership"", ""Command Overview"", ""Department Performance Goals"", ""EEOP Utilization Report"", ""Hate Crime Report"", ""Mental Health Division Annual Report"", ""Monthly Operational Summary"", ""Operational Staffing"", ""Racial Profiling Reports"", ""Semi-Annual BWC Audit Report"", ""Surveys"", ""Police Department Links""]",[],[],[],[],"" -3306,https://www.kcpd.org/media/3466/may-traffic-summary.pdf,Stops,Police & Public Interactions,"","",200,"","","","","","","","" -3307,https://data.indy.gov/datasets/impd-use-of-force/explore,Use of Force Reports,Police & Public Interactions,IMPD Use Of Force,Indianapolis Metropolitan Police Department (IMPD) Use of Force.,200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -3309,https://www.indy.gov/activity/officer-involved-shootings,Officer Involved Shootings,Police & Public Interactions,indy.gov,"",200,Error retrieving title: dictionary changed size during iteration,"[""""]","[""""]",[],[],[],[],Skip to main content Services Topics Agencies Payments Calendar Español search Services Topics Agencies Payments Calendar Español search search search Need Help? Privacy Policy Need Help? Privacy Policy -3310,https://www.kcpd.org/about/regional-police-academy/recruit-training/,Policies & Contracts,Info About Agencies,Recruit Training,"",200,"Home | Kansas City, Missouri Police Department","[""Regional Police Academy""]","[""Recruit Training""]",[],[],[],[],KANSAS CITY MISSOURI POLICE DEPARTMENT EMERGENCY: 911 | NON-EMERGENCY: 816-234-5111 | INFORMATION: 816-234-5000 Menu Close Menu Careers Careers CURRENT OPENINGS Life@KCPD Military & KCPD Women & KCPD Lateral Transfers Hiring Process Salary & Benefits Meet Our Recruiters The Academy Upcoming Recruiting and Testing Events College Internship Program About History Memorial Board of Police Commissioners Members Calendar Agendas Minutes and Votes Chief Stacey Graves Historic Chief's Blog Chief's Blog Office of General Counsel Office of Community Complaints Where to File a Complaint Mission Mediation Annual Reports Organizational Structure Regional Police Academy Specialized Units Gang Intelligence Squad Services Crime Lab Report and Video Requests Jail/Bonding Private Alarms Hire Off-Duty Private Officers Licensing Property and Evidence City Services Transparency Annual Reports Policies and Procedures Budget and Finance Title VI Program ADA Information for Police Facilities Body-Worn Cameras Privacy Policy Crime Prevention and Safety Tips Traffic Complaints Suspected Narcotics Activity Crime Prevention Tips and Brochures Information on Runaways Cyber Crime Prevention Submit an Anonymous Tip Crime Statistics Crime Mapping Victim Resources Victim Assistance Unit Domestic Violence Sex Crimes Safe Haven for Newborns Juvenile Section Homicide Unsolved Homicides Missing Persons Section Intimidation and Harassment Internet Crimes Against Children Economic Crimes Financial Crime Victim Information Criminal Offenses Investigated FAQ's Make a Police Report Online Busted Community Community Engagement Division Crisis Intervention Team Youth Services Community Interaction Officers Housing Authority LGBTQ Liaison Social Service Specialists Chaplains Resource Guide Neighborhood Crime Watch Citizen's Police Academy WatchKC FAQs Explorers Program Personal Safety Training Events Thank a KCPD Department Member The Police Foundation of Kansas City Ride-Alongs Trail of Heroes Media News Releases Alert KC Logos Media Contacts KCPD VLOG'S Contact Us Patrol Division Stations Central Patrol Division Station East Patrol Division Station Metro Patrol Division North Patrol Division Shoal Creek Patrol Division South Patrol Division Station Department Directory Patch Request Search EMERGENCY: 911 NON-EMERGENCY: 816-234-5111 INFORMATION: 816-234-5111 -3311,https://callsforservice.jaxsheriff.org,Calls for Service,Police & Public Interactions,Calls for Service - Jacksonville Sheriff's Office,"",200," - Calls for Service - Jacksonville Sheriff's Office -",[],"[""COMPLETED DISPATCHED CALLS FOR SERVICE""]",[],[],[],[],JACKSONVILLE SHERIFF'S OFFICE JSO Calls for Service JACKSONVILLE SHERIFF'S OFFICE JSO Calls for Service JACKSONVILLE SHERIFF'S OFFICE JSO Calls for Service COMPLETED DISPATCHED CALLS FOR SERVICE Welcome to the Jacksonville Sheriff’s Office Completed Dispatched Calls for Service webpage. This page displays calls for service made to the Jacksonville Sheriff's Office that have recently been completed. The data on this page is refreshed automatically. COMPLETED DISPATCHED CALLS FOR SERVICE Welcome to the Jacksonville Sheriff’s Office Completed Dispatched Calls for Service webpage. This page displays calls for service made to the Jacksonville Sheriff's Office that have recently been completed. The data on this page is refreshed automatically. -3312,https://www.fresno.gov/police/wp-content/uploads/sites/5/2020/08/Redacted-FTO-Manual-042020.pdf,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3313,https://www.kcpd.org/transparency/policies-and-procedures/,Policies & Contracts,Info About Agencies,Policies and Procedures,"",200,"Home | Kansas City, Missouri Police Department","[""Transparency""]","[""POLICIES AND PROCEDURES"", ""Policies"", ""Procedures""]",[],[],[],[],KANSAS CITY MISSOURI POLICE DEPARTMENT EMERGENCY: 911 | NON-EMERGENCY: 816-234-5111 | INFORMATION: 816-234-5000 Menu Close Menu Careers Careers CURRENT OPENINGS Life@KCPD Military & KCPD Women & KCPD Lateral Transfers Hiring Process Salary & Benefits Meet Our Recruiters The Academy Upcoming Recruiting and Testing Events College Internship Program About History Memorial Board of Police Commissioners Members Calendar Agendas Minutes and Votes Chief Stacey Graves Historic Chief's Blog Chief's Blog Office of General Counsel Office of Community Complaints Where to File a Complaint Mission Mediation Annual Reports Organizational Structure Regional Police Academy Specialized Units Gang Intelligence Squad Services Crime Lab Report and Video Requests Jail/Bonding Private Alarms Hire Off-Duty Private Officers Licensing Property and Evidence City Services Transparency Annual Reports Policies and Procedures Budget and Finance Title VI Program ADA Information for Police Facilities Body-Worn Cameras Privacy Policy Crime Prevention and Safety Tips Traffic Complaints Suspected Narcotics Activity Crime Prevention Tips and Brochures Information on Runaways Cyber Crime Prevention Submit an Anonymous Tip Crime Statistics Crime Mapping Victim Resources Victim Assistance Unit Domestic Violence Sex Crimes Safe Haven for Newborns Juvenile Section Homicide Unsolved Homicides Missing Persons Section Intimidation and Harassment Internet Crimes Against Children Economic Crimes Financial Crime Victim Information Criminal Offenses Investigated FAQ's Make a Police Report Online Busted Community Community Engagement Division Crisis Intervention Team Youth Services Community Interaction Officers Housing Authority LGBTQ Liaison Social Service Specialists Chaplains Resource Guide Neighborhood Crime Watch Citizen's Police Academy WatchKC FAQs Explorers Program Personal Safety Training Events Thank a KCPD Department Member The Police Foundation of Kansas City Ride-Alongs Trail of Heroes Media News Releases Alert KC Logos Media Contacts KCPD VLOG'S Contact Us Patrol Division Stations Central Patrol Division Station East Patrol Division Station Metro Patrol Division North Patrol Division Shoal Creek Patrol Division South Patrol Division Station Department Directory Patch Request Search EMERGENCY: 911 NON-EMERGENCY: 816-234-5111 INFORMATION: 816-234-5111 -3314,http://www.houstontx.gov/police/ois/,Officer Involved Shootings,Police & Public Interactions,Officer Involved Shootings,"",200,Welcome to the City of Houston eGovernment Center,"[""""]","[""Houston Police Department"", ""POLICE Department"", ""Police Department Links""]","[""Officer Involved Shootings""]",[],[],[],"" -3315,https://mycity.maps.arcgis.com/apps/dashboards/21eac904178c4d12a7dd8e29c0ee238e,Use of Force Reports,Police & Public Interactions,ArcGIS Dashboards,ArcGIS Dashboards,200,Error retrieving title: 'NoneType' object has no attribute 'text',[],[],[],[],[],[],"" -3316,https://www.kcpd.org/crime/crime-mapping/  ,Crime Maps & Reports,Agency-Published Resources,"","",404,"","","","","","","","" -3317,https://transparency.jaxsheriff.org/OIS,Officer Involved Shootings,Police & Public Interactions,Officer-Involved Shootings - JSO Open Data,"",200," - Home Page - JSO Open Data -","[""OFFICER-INVOLVED SHOOTINGS""]",[],"[""Please Be Advised...""]",[],[],[],JACKSONVILLE SHERIFF'S OFFICE JSO Open Data Home Data Officer-Involved Shootings Pertinent Policies Agency Transparency Arrests Body Worn Camera Program Overview Body Worn Camera Policies Code of Conduct Internal Affairs Use of Force Vehicle Pursuit Jacksonville Homicide Data Info Sheets Pedestrian Safety Sheet Pedestrian Citations by Race/Gender Guide to JSO Complaint Process FDOT Grant Sheet 2023 Year In Review 2022 Year In Review 2022 Community Survey 2021 Year In Review 2020 Community Survey 2020 Year In Review 2019 Year In Review 2018 Year In Review 2017 Year In Review 2016 Year In Review 2015 Year In Review Open Data Report Briefs 2022 Open Data Report 2021 Open Data Report 2020 Open Data Report 2019 Open Data Report 2018 Open Data Report 2017 Open Data Report 2016 Open Data Report 2015 Open Data Report Trending Topics IACP Assessment IACP Assessment IACP Assessment Response Record Request JACKSONVILLE SHERIFF'S OFFICE JSO Open Data Home Data Officer-Involved Shootings Pertinent Policies Agency Transparency Arrests Body Worn Camera Program Overview Body Worn Camera Policies Code of Conduct Internal Affairs Use of Force Vehicle Pursuit Jacksonville Homicide Data Info Sheets Pedestrian Safety Sheet Pedestrian Citations by Race/Gender Guide to JSO Complaint Process FDOT Grant Sheet 2023 Year In Review 2022 Year In Review 2022 Community Survey 2021 Year In Review 2020 Community Survey 2020 Year In Review 2019 Year In Review 2018 Year In Review 2017 Year In Review 2016 Year In Review 2015 Year In Review Open Data Report Briefs 2022 Open Data Report 2021 Open Data Report 2020 Open Data Report 2019 Open Data Report 2018 Open Data Report 2017 Open Data Report 2016 Open Data Report 2015 Open Data Report Trending Topics IACP Assessment IACP Assessment IACP Assessment Response Record Request JACKSONVILLE SHERIFF'S OFFICE JSO Open Data Home Data Officer-Involved Shootings Pertinent Policies Agency Transparency Arrests Body Worn Camera Program Overview Body Worn Camera Policies Code of Conduct Internal Affairs Use of Force Vehicle Pursuit Jacksonville Homicide Data Info Sheets Pedestrian Safety Sheet Pedestrian Citations by Race/Gender Guide to JSO Complaint Process FDOT Grant Sheet 2023 Year In Review 2022 Year In Review 2022 Community Survey 2021 Year In Review 2020 Community Survey 2020 Year In Review 2019 Year In Review 2018 Year In Review 2017 Year In Review 2016 Year In Review 2015 Year In Review Open Data Report Briefs 2022 Open Data Report 2021 Open Data Report 2020 Open Data Report 2019 Open Data Report 2018 Open Data Report 2017 Open Data Report 2016 Open Data Report 2015 Open Data Report Trending Topics IACP Assessment IACP Assessment IACP Assessment Response Record Request -3318,https://data.kcmo.org/,List of Data Sources,Info About Agencies,Open Data KC | data.kcmo.org,"",200,Open Data KC | data.kcmo.org,[],"[""Menu"", ""Welcome to Open Data KC!"", ""Data Catalog"", ""Data Dashboards"", ""More Information""]",[],[],[],[],"Skip to main content Skip to footer links City of Kansas City, MO Sign In Home Page KCMO.gov Help Contact DataKC Menu Menu Close Home Page KCMO.gov Help Contact DataKC Sign In Search Welcome to Open Data KC! The City is committed to sharing open and reliable data about our operations. Feel free to browse the featured stories and maps below for some of our most popular entries. You can also search for datasets using the search bar or the categories below. Need more guidance? Scroll down to the ""More Information"" section. 311 Requests Overview Dangerous Buildings Pothole Tracker Community Health Explorer KCPD Crime Reports Animal Services Data Catalog 311 Service requests Crime Crime reports and crime statistics Neighborhoods Code violations, land bank properties, dangerous buildings Budget Line item expenditures and revenues Construction Building/development permits Transportation Traffic, parking, transit Health COVID-19, lead, food safety Land Use Mapping boundaries and data Data Dashboards Resident Survey Service Goals and Highlights Open Budget COVID-19 Snapshot More Information About Open Data KC Learn about open data and how to use this platform. Parcel Viewer Looking for City information in a map-based application? About DataKC Learn more about the City's data team and approach to data KCMO 311 Submit a service request to the City. Sunshine Request Need other data or info? Submit a request for public records. Suggest a data set Didn't find what you were looking for? Suggest a dataset. City of Kansas City, MO Sign In Home Page KCMO.gov Help Contact DataKC Menu Menu Close Home Page KCMO.gov Help Contact DataKC Sign In Search Welcome to Open Data KC! The City is committed to sharing open and reliable data about our operations. Feel free to browse the featured stories and maps below for some of our most popular entries. You can also search for datasets using the search bar or the categories below. Need more guidance? Scroll down to the ""More Information"" section. 311 Requests Overview Dangerous Buildings Pothole Tracker Community Health Explorer KCPD Crime Reports Animal Services Data Catalog 311 Service requests Crime Crime reports and crime statistics Neighborhoods Code violations, land bank properties, dangerous buildings Budget Line item expenditures and revenues Construction Building/development permits Transportation Traffic, parking, transit Health COVID-19, lead, food safety Land Use Mapping boundaries and data Data Dashboards Resident Survey Service Goals and Highlights Open Budget COVID-19 Snapshot More Information About Open Data KC Learn about open data and how to use this platform. Parcel Viewer Looking for City information in a map-based application? About DataKC Learn more about the City's data team and approach to data KCMO 311 Submit a service request to the City. Sunshine Request Need other data or info? Submit a request for public records. Suggest a data set Didn't find what you were looking for? Suggest a dataset. City of Kansas City, MO Sign In Home Page KCMO.gov Help Contact DataKC Menu Menu Close Home Page KCMO.gov Help Contact DataKC Sign In Search " -3319,https://mycity.maps.arcgis.com/apps/dashboards/0ccace0ba9a84c8db1e926bf1f9cbcac,Complaints & Misconduct,Info About Officers,ArcGIS Dashboards,ArcGIS Dashboards,200,Error retrieving title: 'NoneType' object has no attribute 'text',[],[],[],[],[],[],"" -3320,https://www.houstontx.gov/police/cs/Monthly_Crime_Data_by_Street_and_Police_Beat.htm,Crime Statistics,Agency-Published Resources,Monthly Crime Data by Street and Police Beat,"",200,Welcome to the City of Houston eGovernment Center,"[""""]","[""Houston Police Department"", ""POLICE Department"", ""Crime Data"", ""Police Department Links""]","[""Monthly Crime Data by Street and Police Beat""]",[],[],[],"" -3321,https://public.powerdms.com/HSVPS/tree/documents/37,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by Powered by Powered by Powered by -3322,https://data.houstontx.gov/,List of Data Sources,Info About Agencies,Welcome - City of Houston Open Data,"",200,Welcome - City of Houston Open Data,"[""City of Houston Open Data""]","[""Groups"", ""Showcases"", ""Popular Datasets"", ""New and Recent Datasets""]","[""Search data"", ""Popular tags"", ""Texas Public Information Act"", ""Police Transparency Hub"", ""MyCity"", ""Open Finance"", ""Texas Public Information Act"", ""Police Transparency Hub"", ""MyCity"", ""Open Finance"", ""Houston Police Department Crime Statistics"", ""Payroll"", ""Archived Solicitations"", ""Budget"", ""Property Tax"", ""Checkbook"", ""Archived Solicitations"", ""Budget"", ""Payroll"", ""Property Tax""]",[],[],[],"Skip to content Toggle navigation Datasets Organizations Groups Open Finance About Log in Register Contact Toggle navigation Datasets Organizations Groups Open Finance About Log in Register Contact Log in Register Contact City of Houston Open Data Our goal is to encourage civic engagement and collaboration, improve transparency, and facilitate access to public information. The City of Houston invites all citizens to explore our open datasets to promote transparency, accountability, collaboration, and innovation to enable possibilities for the betterment of our community. Search data Search Popular tags Legacy GIS 311 Groups Finance Environment Public Safety Geospatial Showcases Previous Texas Public Information Act View Texas Public Information Act Police Transparency Hub View Police Transparency Hub MyCity View MyCity Open Finance View Open Finance Texas Public Information Act View Texas Public Information Act Police Transparency Hub View Police Transparency Hub MyCity View MyCity Open Finance View Open Finance Next Popular Datasets Browse popular datasets below and see what other citizens find interesting. Houston Police Department Crime Statistics 125 recent views HTML Payroll 124 recent views CSV Archived Solicitations 94 recent views XLSX Budget 77 recent views CSV Property Tax 65 recent views XLSX New and Recent Datasets Browse new or modified datasets below. Click to view details or explore content. Checkbook Updated on March 12, 2024 CSV Archived Solicitations Updated on January 18, 2024 XLSX Budget Updated on January 17, 2024 CSV Payroll Updated on January 5, 2024 CSV Property Tax Updated on December 14, 2023 XLSX City of Houston Open Data Our goal is to encourage civic engagement and collaboration, improve transparency, and facilitate access to public information. The City of Houston invites all citizens to explore our open datasets to promote transparency, accountability, collaboration, and innovation to enable possibilities for the betterment of our community. Search data Search Popular tags Legacy GIS 311 Groups Finance Environment Public Safety Geospatial Showcases Previous Texas Public Information Act View Texas Public Information Act Police Transparency Hub View Police Transparency Hub MyCity View MyCity Open Finance View Open Finance Texas Public Information Act View Texas Public Information Act Police Transparency Hub View Police Transparency Hub MyCity View MyCity Open Finance View Open Finance Next Popular Datasets Browse popular datasets below and see what other citizens find interesting. Houston Police Department Crime Statistics 125 recent views HTML Payroll 124 recent views CSV Archived Solicitations 94 recent views XLSX Budget 77 recent views CSV Property Tax 65 recent views XLSX New and Recent Datasets Browse new or modified datasets below. Click to view details or explore content. Checkbook Updated on March 12, 2024 CSV Archived Solicitations Updated on January 18, 2024 XLSX Budget Updated on January 17, 2024 CSV Payroll Updated on January 5, 2024 CSV Property Tax Updated on December 14, 2023 XLSX " -3323,http://transparency.jaxsheriff.org/,Use of Force Reports,Police & Public Interactions,Home Page - JSO Open Data,"",200," - Home Page - JSO Open Data -","[""Open Data & Transparency""]","[""Available Data""]",[],[],[],[],Jacksonville Sheriff's Office Open Data & Transparency Jacksonville Sheriff's Office Open Data & Transparency Jacksonville Sheriff's Office Open Data & Transparency JACKSONVILLE SHERIFF'S OFFICE JSO Open Data Home Data Officer-Involved Shootings Pertinent Policies Agency Transparency Arrests Body Worn Camera Program Overview Body Worn Camera Policies Code of Conduct Internal Affairs Use of Force Vehicle Pursuit Jacksonville Homicide Data Info Sheets Pedestrian Safety Sheet Pedestrian Citations by Race/Gender Guide to JSO Complaint Process FDOT Grant Sheet 2023 Year In Review 2022 Year In Review 2022 Community Survey 2021 Year In Review 2020 Community Survey 2020 Year In Review 2019 Year In Review 2018 Year In Review 2017 Year In Review 2016 Year In Review 2015 Year In Review Open Data Report Briefs 2022 Open Data Report 2021 Open Data Report 2020 Open Data Report 2019 Open Data Report 2018 Open Data Report 2017 Open Data Report 2016 Open Data Report 2015 Open Data Report Trending Topics IACP Assessment IACP Assessment IACP Assessment Response Record Request JACKSONVILLE SHERIFF'S OFFICE JSO Open Data Home Data Officer-Involved Shootings Pertinent Policies Agency Transparency Arrests Body Worn Camera Program Overview Body Worn Camera Policies Code of Conduct Internal Affairs Use of Force Vehicle Pursuit Jacksonville Homicide Data Info Sheets Pedestrian Safety Sheet Pedestrian Citations by Race/Gender Guide to JSO Complaint Process FDOT Grant Sheet 2023 Year In Review 2022 Year In Review 2022 Community Survey 2021 Year In Review 2020 Community Survey 2020 Year In Review 2019 Year In Review 2018 Year In Review 2017 Year In Review 2016 Year In Review 2015 Year In Review Open Data Report Briefs 2022 Open Data Report 2021 Open Data Report 2020 Open Data Report 2019 Open Data Report 2018 Open Data Report 2017 Open Data Report 2016 Open Data Report 2015 Open Data Report Trending Topics IACP Assessment IACP Assessment IACP Assessment Response Record Request JACKSONVILLE SHERIFF'S OFFICE JSO Open Data Home Data Officer-Involved Shootings Pertinent Policies Agency Transparency Arrests Body Worn Camera Program Overview Body Worn Camera Policies Code of Conduct Internal Affairs Use of Force Vehicle Pursuit Jacksonville Homicide Data Info Sheets Pedestrian Safety Sheet Pedestrian Citations by Race/Gender Guide to JSO Complaint Process FDOT Grant Sheet 2023 Year In Review 2022 Year In Review 2022 Community Survey 2021 Year In Review 2020 Community Survey 2020 Year In Review 2019 Year In Review 2018 Year In Review 2017 Year In Review 2016 Year In Review 2015 Year In Review Open Data Report Briefs 2022 Open Data Report 2021 Open Data Report 2020 Open Data Report 2019 Open Data Report 2018 Open Data Report 2017 Open Data Report 2016 Open Data Report 2015 Open Data Report Trending Topics IACP Assessment IACP Assessment IACP Assessment Response Record Request -3325,https://www.jaxsheriff.org/Resources/crime-mapping.aspx,Crime Maps & Reports,Agency-Published Resources,www.jaxsheriff.org - JaxSheriff.org,The official website of the Jacksonville Sheriff's Office (JSO),200," - www.jaxsheriff.org - JaxSheriff.org -",[],[],"[""Disclaimer/Use of Information Release""]",[],[],[],Skip to global navigation Skip to content Skip to search Skip to footer Skip to site map Access Key Legend JSO Shield Mobile Menu Jacksonville Sheriff's Office Show Children Sheriff's Office This Menu Has 8 Links Behind the Badge Community Engagement Opportunities Events Fallen Heroes History Find My District Mascot Open Data and Transparency Show Children Neighborhood This Menu Has 4 Links ConnectDuval Camera Registration Find My District Neighborhood Watch Program Sheriff's Watch Show Children Resources This Menu Has 23 Links Adult Entertainment Establishment License Alarm Registration AMBER Alerts Completed Calls for Dispatched Service Civil Process Compliment & Complaint Procedure Corrections Facility Information Driver Self Report of a Traffic Crash Crime Mapping Online Crime Reporting Emergency Preparedness Fees Inmate Information Information for Parents & Guardians Performer Work Identification Report Suspicious Activity Submit a Public Records Request Scheduled Road Closures Services We Offer Sexual Offenders & Predators Open Data and Transparency Permitless Carry in Florida Victim & Witness Services News Show Children Careers This Menu Has 13 Links Connect with a Recruiter Police Officer Corrections Officer Police Dispatcher Civilian Employment Community Service Officer Court Bailiff Officer Judicial Officer Records Personnel Auxiliary Officer School Crossing Guard Veterans FAQ Show Children Crime Tips This Menu Has 2 Links Cold Case Homicides Unsolved Crimes Show Children Notices This Menu Has 3 Links Public Meetings Public Auctions Traffic Safety/Sobriety Checkpoints Show Children Contact Us This Menu Has 2 Links Comprehensive List Hearing Impaired Assistance Events Search Search for: Translate Close English English Español Français Deutsch हिन्दी Português Pу́сский 한국말 中文 Tiếng Việt JSO Facebook JSO Twitter JSO Instagram JSO YouTube -3326,https://www.indy.gov/agency/indianapolis-metropolitan-police-department,Contact Info & Agency Meta,Info About Agencies,indy.gov,"",200,indy.gov,[],[],[],[],[],[],Skip to main content Services Topics Agencies Payments Calendar Español search Services Topics Agencies Payments Calendar Español search search search Need Help? Privacy Policy Need Help? Privacy Policy -3327,https://www.arcgis.com/apps/dashboards/9083bde56982414598f34a55f69b5e2d,Calls for Service,Police & Public Interactions,ArcGIS Dashboards,ArcGIS Dashboards,200,"",[],[],[],[],[],[],"" -3329,https://transparency.jaxsheriff.org/Content/Files/Order%20551.pdf,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3330,https://www.houstontx.gov/police/contact/index.htm,Contact Info & Agency Meta,Info About Agencies,How to Contact HPD,"",200,Welcome to the City of Houston eGovernment Center,"[""""]","[""Houston Police Department"", ""POLICE Department"", ""Police Department Links"", ""CONTACT US Links""]","[""How to Contact HPD""]",[],[],[],"" -3331,https://lasd.org/transparency/crimeandarrest/,Crime Statistics,Agency-Published Resources,Crime and Arrest Information | Los Angeles County Sheriff's Department,"",200,Los Angeles County Sheriff's Department | A Tradition of Service,[],"[""Crime and Arrest Statistics""]","[""Crime and Arrest Statistics"", ""LASD Crime Data"", ""Additional Information Tools""]","[""Part I and Part II Crimes Data Files Download Disclaimer"", ""Official Part I Monthly Crime Statistics"", ""Official Two-Year Comparison of Part I Crime Statistics"", ""REPORTED HATE CRIME INFORMATION"", ""Crime Mapping Tool""]",[],[],"" -3332,https://www.crimemapping.com/map/ca/losangeles,Crime Maps & Reports,Agency-Published Resources,CrimeMapping.com - Helping You Build a Safer Community,"",200,CrimeMapping.com - Helping You Build a Safer Community,"[""My Map Summary"", ""What"", ""Where"", ""When"", ""Display Options"", ""Location Selection"", ""Choose a Search Distance"", ""Timeframe Settings"", ""From:"", ""To:""]",[],[],[],[],[],"Preparing Map Content... Preparing Map Content... Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Receive Alerts Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Distance: Miles select Distance: Miles select Streets select Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Zoom to Zoom to Zoom to Zoom to Fetching Data. x Close Fetching Data. Fetching Data. Fetching Data. x Close Share This Map My Map Summary The sum of the What, Where, When you’ve chosen. What * Data not provided by agency within map extent Where Broward County Police Boundary Agency Filter: Agency Name Here When Previous 7 Days Friday, May 1 - Friday, May 8 Restore Defaults Display Options What type(s) of records would you like to see? Select All | Deselect All Arson Assault Burglary Disturbing the Peace Drugs / Alcohol Violations DUI Fraud Homicide Motor Vehicle Theft Robbery Sex Crimes Theft / Larceny Vandalism Vehicle Break-In / Theft Weapons Sex Offender Sexual Predator * Data not provided by agency within map extent Location Selection Enter an Address, Feature or Location. Choose a Search Distance 500 feet 1000 feet 1500 feet 1/4 mile 1/2 mile 1 mile 2 miles Apply Remove Location Filter Timeframe Settings From how far back would you like to see records? **Note** This will not apply to Sex Offender data. Yesterday Previous 3 Days Previous Week Previous 4 Weeks Custom Time Range From: select Monday, March 18, 2024 To: select Sunday, March 24, 2024 Apply " -3333,https://www.lvmpd.com/en-us/InternalOversightConstitutionalPolicing/Documents/PO-035-20%20Use%20of%20Force.pdf,Policies & Contracts,Info About Agencies,"","",-1,"","","","","","","","" -3334,https://www.lapdonline.org/policies-procedures-training-sb-978/,Policies & Contracts,Info About Agencies,Policies & Procedures/Training SB 978 - LAPD Online,"",200,Home of the Los Angeles Police Department - LAPD Online,"[""Policies & Procedures/Training SB 978""]","[""SB 978, Bradford. Law enforcement agencies: public records."", ""Admin Orders, Directives and Special Orders"", ""Police Training and Education"", ""Department Manuals"", ""Use of Force""]",[],[],[],[],LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. -3335,https://www.longbeach.gov/police/crime-info/crime-statistics/,Crime Statistics,Agency-Published Resources,Crime Statistics,"

CRIME STATISTICS -   - LBPD MONTHLY CRIME STATISTICS  - The following statistical reports contain the LBPD's monthly crime statistic data sorted by 5 year summary, previous year to current year, and reporting district. -   - - Reporting district number is a small, geographically designed area (usually several

",200,City of Long Beach,"[""Police Department""]","[""CRIME STATISTICS""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""National Incident-Based Reporting System"", ""NIBRS Monthly Crime Statistics"", ""CRIME INCIDENT MAPPING APPLICATION"", ""2016-2022 Uniform Crime Reporting (UCR) Crime Statistics"", ""CRIME DATA TOTALS"", ""UNIFORM CRIME REPORTING"", ""PREVIOUS YEAR TO CURRENT YEAR"", ""5 YEAR SUMMARY"", ""MONTHLY REPORTING DISTRICT CRIME STATS"", ""ANNUAL REPORTING DISTRICT CRIME STATS"", ""HISTORICAL CRIME GRAPH"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk"", ""Some benefits of NIBRS include:"", ""Why is this important?""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", """", """", """", """", ""Crime Lab Survey"", """"]",[],"" -3337,https://data.littlerock.gov/,List of Data Sources,Info About Agencies,City of Little Rock Open Data and Performance,"",200,City of Little Rock Open Data and Performance,[],"[""Menu""]",[],[],[],[],"Skip to main content Skip to footer links Sign In Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Menu Menu Close Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Sign In Search Little Rock's Data Hub Welcome to our repository for Open Data & Performance Measures. This site provides easy access to information about your city government. We encourage the use of public data that the City of Little Rock has published to spark innovation, promote public collaboration, increase government transparency, and inform decision making. Previous slide Interactive map with 311, Police, Planning, Business Licenses and Housing data Citizen Connect Citizen Connect allows easy access to day-to-day insights and trends from 311 and Police crime data. Sign up today to start getting alerts for your neighborhood on the things that matter to you. Come Explore Citizen Connect Interactive dashboards showing measures on various data sets Little Rock Performance Measures Little Rock Performance is a centralized dashboard that tracks the City’s performance on six key priority areas that matter most to residents. Explore the Performance Measures Interactive maps with various City information Mapping Applications Interact with City data from Planning & Development, Police, Fire, Public Works and Housing & Neighborhood Programs through this easy to use mapping platform. Explore our GIS Data Story page describing Little Rock's What Works Cities Certification What Works Cities Certification Little Rock is a part of a national movement to use data and evidence learn more about our recent certification Learn more about Little Rock's Silver Certification from What Works Cities Video tour of data sites Video Tour of Data Sites Recorded introduction to the City of Little Rock's Data Hub, Citizen Connect and Mapping Application sites. Watch this video to get a tour of the Data Hub, Citizen Connect and Mapping Application sites Next slide Pause slides 1 2 3 4 5 Safe City Protect the rights of the people, ensure public order and provide public safety through efficient delivery of services. Economic Development Support the local/regional economy and to provide opportunities to retain, form and attract new business. Basic City Services Ensure residents receive quality basic services and provide a system that enables the most efficient and effective support possible. Infrastructure Maintain and improve comprehensive infrastructure system that meets the changing needs of the community. Quality of Life Join with community partners to ensure access to vital and varied recreational, creative and educational experiences. High Performing Government Provide the highest level of service, promote innovation and provide accountability and openness via various methods. " -3338,https://lasd.org/wp-content/uploads/2021/05/Transparency_Crime_Maps_Jan-Apr_051821.pdf,Crime Maps & Reports,Agency-Published Resources,"","",404,"","","","","","","","" -3339,manchesternh.gov/Departments/Police/Administration/Crime-Data/Crime-Statistics,Crime Statistics,Agency-Published Resources,Crime Statistics,"",200,Error retrieving title: No connection adapters were found for '://',"[""Crime Statistics"", ""Police Related Links""]",[],"["""", ""Crime Data Links""]","[""2022"", ""2023"", ""City Hall"", ""City Government"", ""About Manchester"", ""City Services"", ""Mobile App""]","[""2021""]",[],"" -3340,https://www.longbeach.gov/police/about-the-lbpd/lbpd-1421748/ois/,Officer Involved Shootings,Police & Public Interactions,OIS,"",200,City of Long Beach,"[""Police Department""]","[""Officer Involved Shooting (OIS)""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""2023 OIS 03-05-2023- 5200 block of Atlantic 2022"", ""2021"", ""2020"", ""2019"", ""2018"", ""2016"", ""2015"", ""2014"", ""2013"", ""2012"", ""2010"", ""2009"", ""2007 070074149-Jackson, Jamal"", ""2006"", ""2004"", ""2002 OIS2002-002-Lemos, Danny"", ""2001"", ""2000 OIS2000-010-Baldovinos, Jose 1999"", ""1998"", ""1997"", ""1996"", ""1995"", ""1994"", ""1993"", ""1992"", ""1991"", ""1980"", ""1977"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk"", ""OIS2003-003-Tolbert, Rodney""]","[""LBPD SB 1421/AB 748"", ""Public Records Request""]",[],"" -3341,https://www.lapdonline.org/office-of-the-chief-of-police/professional-standards-bureau/disciplinary-penalties/,Complaints & Misconduct,Info About Officers,Disciplinary Penalties - LAPD Online,"",200,Home of the Los Angeles Police Department - LAPD Online,"[""Disciplinary Penalties""]","[""2024"", ""2023"", ""2022"", ""2021"", ""2020""]",[],[],[],[],LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. -3342,https://www.littlerock.gov/media/5716/lrpd-use-of-force-policy.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3343,https://www.crimemapping.com/map/nv/lasvegas,Crime Maps & Reports,Agency-Published Resources,CrimeMapping.com - Helping You Build a Safer Community,"",200,CrimeMapping.com - Helping You Build a Safer Community,"[""My Map Summary"", ""What"", ""Where"", ""When"", ""Display Options"", ""Location Selection"", ""Choose a Search Distance"", ""Timeframe Settings"", ""From:"", ""To:""]",[],[],[],[],[],"Preparing Map Content... Preparing Map Content... Receive Alerts Go 0 Records Date Range: Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Zoom to Receive Alerts Receive Alerts Go 0 Records Date Range: Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Zoom to Distance: Miles select Distance: Miles select Streets select Zoom to Zoom to Zoom to Zoom to Zoom to Zoom to Zoom to Fetching Data. x Close Fetching Data. Fetching Data. Fetching Data. x Close Share This Map My Map Summary The sum of the What, Where, When you’ve chosen. What * Data not provided by agency within map extent Where Broward County Police Boundary Agency Filter: Agency Name Here When Previous 7 Days Friday, May 1 - Friday, May 8 Restore Defaults Display Options What type(s) of records would you like to see? Select All | Deselect All Arson Assault Burglary Disturbing the Peace Drugs / Alcohol Violations DUI Fraud Homicide Motor Vehicle Theft Robbery Sex Crimes Theft / Larceny Vandalism Vehicle Break-In / Theft Weapons Sex Offender Sexual Predator * Data not provided by agency within map extent Location Selection Enter an Address, Feature or Location. Choose a Search Distance 500 feet 1000 feet 1500 feet 1/4 mile 1/2 mile 1 mile 2 miles Apply Remove Location Filter Timeframe Settings From how far back would you like to see records? **Note** This will not apply to Sex Offender data. Yesterday Previous 3 Days Previous Week Previous 4 Weeks Custom Time Range From: To: Apply " -3344,https://data.littlerock.gov/Safe-City/Little-Rock-Police-Department-Statistic-Insights/9iy3-rb7k,Crime Maps & Reports,Agency-Published Resources,City of Little Rock Open Data and Performance,"",200,City of Little Rock Open Data and Performance,"[""Sign In to Tyler Data & Insights""]","[""Menu""]",[],[],[],[],Skip to main content Skip to footer links Sign In Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Menu Menu Close Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Sign In Search Sign In Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Menu Sign In Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Menu Sign In Sign In Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Menu Close Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Sign In Search Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Sign In Search Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Sign In Search Search Sign In to Tyler Data & Insights SSO Enabled Forgot Password? Sign In Don't have an account yet? Sign Up Sign In to Tyler Data & Insights SSO Enabled Forgot Password? Sign In Don't have an account yet? Sign Up Sign In to Tyler Data & Insights SSO Enabled Forgot Password? Sign In Don't have an account yet? Sign Up SSO Enabled Forgot Password? Sign In -3345,https://data.memphistn.gov/Public-Safety/Memphis-Police-Department-Aggregate-Crime/n7ue-iwew,Crime Statistics,Agency-Published Resources,Memphis Police Department Aggregate Crime | Memphis Data Hub,"",200,Memphis Data Hub,"[""Major Violent Crime Incidents YOY"", ""Major Property Crime Incidents YOY"", ""Reduce Violent Crime"", ""Reduce Property Crime"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Memphis Police Department Aggregate Crime"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Memphis Police Department Aggregate Crime"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Info"", ""Organization"", ""Temporal Coverage"", ""Update Cadence"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Menu Menu Close COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Sign In Search Sign In COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Menu Sign In COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Menu Sign In Sign In COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Menu Close COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Sign In Search COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Sign In Search -3346,https://data.lacity.org/browse?Data-Owner_Department=LAPD&limitTo=datasets&tags=cfs&page=1,Calls for Service,Police & Public Interactions,"Results matching type of Datasets, of LAPD, and topic of cfs | Page 1 of 2 | Los Angeles - Open Data Portal","",200,"DataLA: Information, Insights, and Analysis from the City of Angels | Los Angeles - Open Data Portal","[""Categories"", ""Department"", ""Tags""]","[""Menu"", ""View Types > Datasets"", ""Department > LAPD"", ""Tags > cfs"", ""Sort"", ""Sort by Most Relevant"", ""Filter"", ""Categories"", ""View Types"", ""Department"", ""Tags"", ""Federated Domains"", ""LAPD Calls for Service 2020"", ""LAPD Calls for Service 2014"", ""LAPD Calls for Service 2017"", ""LAPD Calls for Service 2016"", ""LAPD Calls for Service 2019"", ""LAPD Calls for Service 2018"", ""LAPD Calls for Service 2015"", ""LAPD Calls for Service 2010"", ""LAPD Calls for Service 2023"", ""LAPD Calls for Service 2022"", ""A-Z"", ""A-Z"", ""A-Z""]",[],[],[],[],Skip to main content Skip to footer links -3347,https://www.doj.nh.gov/criminal/documents/law-enforcement-manual.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3348,https://www.lvmpd.com/en-us/Pages/Statistics.aspx,Arrest Records,Police & Public Interactions,"","",-1,"","","","","","","","" -3349,https://longbeachca.maps.arcgis.com/apps/webappviewer/index.html?id=da05d12e09104e598b6ebcace59f2bba,Crime Maps & Reports,Agency-Published Resources,ArcGIS Web Application,"",200,Error retrieving title: 'NoneType' object has no attribute 'text',"[""""]",[],[],[],[],[],"" -3350,https://citydocs.longbeach.gov/LBPDPublicDocs/Browse.aspx?dbid=0&id=131218&row=1&cr=1,Policies & Contracts,Info About Agencies,Error,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],Cookies are not enabled for this website. Cookies must be enabled in order to sign in to WebLink 10. Sign Out Cookies are not enabled for this website. Cookies must be enabled in order to sign in to WebLink 10. Sign Out Cookies are not enabled for this website. Cookies must be enabled in order to sign in to WebLink 10. Sign Out -3351,https://www.lvmpd.com/en-us/Documents/2018_IAB_Complaint_Summary.pdf,Complaints & Misconduct,Info About Officers,"","",-1,"","","","","","","","" -3352,https://www.lvmpd.com/en-us/Documents/Statistics/Weekly%20Crime%20Report112621_media.pdf,Crime Statistics,Agency-Published Resources,"","",-1,"","","","","","","","" -3353,https://www.lapdonline.org/office-of-the-chief-of-police/constitutional-policing/annual-complaint-report/,Complaints & Misconduct,Info About Officers,Annual Complaint Report - LAPD Online,"",200,Home of the Los Angeles Police Department - LAPD Online,"[""Annual Complaint Report""]","[""2015 - 2019 Annual Complaint Reports""]",[],[],[],[],LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. -3354,https://clrweb.littlerock.state.ar.us/pub/public_menu.php,Calls for Service,Police & Public Interactions,CLR Dispatches,"",200,City of Little Rock e-goverment Web Page,[],[],"[""Little Rock Dispatches delayed 30 minutes to 8 hours displayed""]",[],[],[],Little Rock Dispatches delayed 30 minutes to 8 hours displayed 1197541552 Report Search By Street Name Search By Call Type Show 5 10 25 50 All entries Call Type Location Dispatch Time Please wait until the data loads..... Showing 0 to 0 of 0 entries Previous Next --- ALL Call Types --- ABNVEH - Abandoned Vehicle Administrative Calls Arson Report Assist Medical Assist Off-Duty Officer Assist Other Agency Assist Parking Battery Breaking or Entering Automobile Burglary Report Check Condition of Subject Citizen Contact Commercial Burglar Alarm Criminal Mischief Report Criminal Trespassing Disturbance Disturbance with Weapon IP - In Progress Driving While Intoxicated Expected Death Fight Fire Run Fireworks Forgery Report Found Property Fraudulent Use of Credit Card Gambling Law Violations Harassing Communications Indecent Exposure Information Report Kidnapping Loitering Lost or Stolen License Plate Loud Music Loud Party Missing Child 0-12 Years Narcotics Law Violations Off w/ Prisoner in cust Officer Emergency Alert PRV PRP - Private Property Tow Parking Violation Police - Accident Police - Active Aggressor Police - Animals Calls Police - Assist Party Police - Attempted Suicide Police - Battery of An Officer Police - Bomb Threat Police - Cutting Report Police - Drowning Police - Hazmat Police - Industrial Accident Police - Overdose Police - Shooting Report Police - Subject Down Police - Suspicious Package Police - Tactical Rescue Jumper Property Check Prostitution Residential Alarm Robbery Alarm Robbery of Business Report Robbery of Individual Report Shoplifting Shot Spotter Activation Shots Fired Stand By to Prevent a Disturbance Subject Pursuit Subject Stop Suspicious Person Terroristic Threatening Theft Report Traffic Pursuit Traffic Stop Traffic Violation Unknown Trouble Wanted Person Show 5 10 25 50 All entries Call Type Location Dispatch Time Please wait until the data loads..... Showing 0 to 0 of 0 entries Previous Next Show 5 10 25 50 All entries Call Type Location Dispatch Time Please wait until the data loads..... Showing 0 to 0 of 0 entries Previous Next Show 5 10 25 50 All entries Call Type Location Dispatch Time Please wait until the data loads..... Showing 0 to 0 of 0 entries Previous Next Show 5 10 25 50 All entries Showing 0 to 0 of 0 entries Previous Next -3355,https://louisville-police.org/237/Important-Phone-Numbers,Contact Info & Agency Meta,Info About Agencies,"Important Phone Numbers | Louisville Metro PD, KY",Review all phone numbers concerned with the Police Department. ,200,"Louisville Metro PD, KY | Official Website","[""Important Phone Numbers""]","[""Give an Anonymous Tip"", ""Criminal Investigations"", ""Division Phone Numbers"", ""Other Numbers"", ""Other Agencies"", ""Parking Tickets"", ""Warrants/Emergency Protective Order (EPO)""]","[""Hours"", ""Contact Us"", ""FAQs"", ""Popular Links"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -3356,https://opendataportal-lasvegas.opendata.arcgis.com/,List of Data Sources,Info About Agencies,City of Las Vegas Open Data,City of Las Vegas Open Data Page,200,City of Las Vegas Open Data,[],[],[],[],[],[],"" -3357,https://www.longbeach.gov/citymanager/cpcc/annual-report/,Complaints & Misconduct,Info About Officers,Annual Report,"

- - 761 - false -

",200,City of Long Beach,"[""City Manager""]","[""Annual Report"", ""The CPCC's Annual Reports""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""Government Affairs"", ""Contact Your..."", ""CPCC"", ""Tidelands CIP Division"", ""Projects"", ""More Projects"", ""Annual Report"", ""Contact Us"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[],"" -3358,http://www.lvpmsa.org/Forms/Dept.%20Man%207-14-07.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3359,https://www.manchesternh.gov/Portals/2/Departments/police_web/SOP-Authority-Law-Enforcement-Role_06-2020.pdf?ver=2020-06-24-084502-160,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3360,http://www.manchesternh.gov/Portals/2/Departments/police_blog/Police%20Log.pdf,Arrest Records,Police & Public Interactions,"","",200,"","","","","","","","" -3361,https://www.longbeach.gov/police/about-the-lbpd/lbpd-stop-data ,Stops,Police & Public Interactions,City of Long Beach,"",200,City of Long Beach,[],"[""Page Not Found""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[],"" -3362,https://www.littlerock.gov/media/6483/administrative_personnel_policy_and_procedure_feb_20.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3363,https://lasd.org/lasd-phone-directory/,Contact Info & Agency Meta,Info About Agencies,LASD Phone Directory | Los Angeles County Sheriff's Department,"",200,Los Angeles County Sheriff's Department | A Tradition of Service,[],"[""LASD Phone Directory""]","[""Station Phone Numbers"", ""Unit Phone Numbers"", ""Organization Phone Numbers""]",[],[],[],"" -3364,https://publicsafety.memphistn.gov/#!/dashboard?places=&restrictedPlaces=&categories=571:66%7C572:66-73%7C573:66-69%7C574:66-68%7C575:66-69%7C576:66%7C577:66-69%7C578:66%7C579:66-67%7C580:66-70%7C581:66-68%7C582:66-80%7C583:66-68%7C584:66-75%7C585:66-67%7C586:66%7C587:66-67&start_date=2020-05-25&end_date=2020-06-08&lat=35.1495&lng=-89.90719999999999&zoom=10&shapeIds=&shapeGroupId=me95-vbw4&showSideBar=false&mapType=Map&listViewTab=overview&overlayLayers=Zip%20Codes&search_field=&search_value=&autoUpdate=false&heatFilters=&statusFilter=&choroplethField=count&searchType=&include_restricted_places=false,Crime Maps & Reports,Agency-Published Resources,Memphis Public Safety,"",200,Memphis Public Safety,[],[],[],[],[],[],"" -3365,https://louisville-police.org/DocumentCenter/View/2386/PSU-INVESTIGATED-CASES-Monthly-Breakdown-2022,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -3366,https://www.lvmpd.com/en-us/Documents/IAB%20Annual%20Accountability%20Report%202018-2019.pdf,Complaints & Misconduct,Info About Officers,"","",-1,"","","","","","","","" -3368,https://data.lacity.org/Public-Safety/Arrest-Data-from-2020-to-Present/amvf-fr72,Arrest Records,Police & Public Interactions,Arrest Data from 2020 to Present | Los Angeles - Open Data Portal,"",200,"DataLA: Information, Insights, and Analysis from the City of Angels | Los Angeles - Open Data Portal","[""Arrest Data 2020-Present: Reasons for Arrest"", ""Arrest Data 2020-Present: #1"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Arrest Data from 2020 to Present"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Arrest Data from 2020 to Present"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Committed Update Frequency"", ""Data Owner"", ""Location Specified"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Sign In Data Catalog Geohub Blog Developer Resources About Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Search -3369,https://data.lacity.org/browse?q=crime%20data&sortBy=relevance,Crime Statistics,Agency-Published Resources,"Results for ""crime data"" | Page 1 of 4 | Los Angeles - Open Data Portal","",200,"DataLA: Information, Insights, and Analysis from the City of Angels | Los Angeles - Open Data Portal","[""Categories"", ""Department"", ""Tags""]","[""Menu"", ""Sort"", ""Sort by Most Relevant"", ""Filter"", ""Categories"", ""View Types"", ""Department"", ""Tags"", ""Federated Domains"", ""Crime Data from 2020 to Present"", ""Crime Data from 2010 to 2019"", ""Domestic Violence Calls from 2020 to Present"", ""Traffic Collision Data from 2010 to Present"", ""Arrest Data from 2010 to 2019"", ""Crime in Los Angeles in 2020 Bar Chart"", ""LAPD - Annual High Level Metrics - GOVSTAT - Archived"", ""Number of crimes 2010 - today"", ""Number of Most Serious Crimes (code 110) in LA neighborhoods"", ""Types of Crime and their Amount in Areas within City of Los Angeles, 2020 to Present"", ""A-Z"", ""A-Z"", ""A-Z""]",[],[],[],[],Skip to main content Skip to footer links -3370,https://data.lacity.org/,List of Data Sources,Info About Agencies,"DataLA: Information, Insights, and Analysis from the City of Angels | Los Angeles - Open Data Portal","",200,"DataLA: Information, Insights, and Analysis from the City of Angels | Los Angeles - Open Data Portal",[],"[""Menu"", ""Featured Stories"", ""Data Catalog"", ""Resources""]",[],[],[],[],Skip to main content Skip to footer links Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search LOS ANGELES OPEN DATA Explore the City of Los Angeles' Open Data Featured Stories Data Catalog Administration & Finance Discover data on the city’s finances and administration. COVID-19 Explore COVID-19 data. Public Safety View up to date data on the city’s public safety data. City Infrastructure & Service Requests Find information on services and infrastructure. Housing and Real Estate Data on housing programs and land use in LA. Parks & Recreation Find information on city parks and recreation centers. Sanitation Find data on street cleanings and more. Transportation Find data from the Department of Transportation. Resources DataLA Medium Blog Read about the latest updates from the team! Suggest a data set Didn't find what you were looking for? Suggest a dataset. Public Records Requests Submit and review public records requests Explore the GeoHub Browse our geospatial data Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search LOS ANGELES OPEN DATA Explore the City of Los Angeles' Open Data Featured Stories Data Catalog Administration & Finance Discover data on the city’s finances and administration. COVID-19 Explore COVID-19 data. Public Safety View up to date data on the city’s public safety data. City Infrastructure & Service Requests Find information on services and infrastructure. Housing and Real Estate Data on housing programs and land use in LA. Parks & Recreation Find information on city parks and recreation centers. Sanitation Find data on street cleanings and more. Transportation Find data from the Department of Transportation. Resources DataLA Medium Blog Read about the latest updates from the team! Suggest a data set Didn't find what you were looking for? Suggest a dataset. Public Records Requests Submit and review public records requests Explore the GeoHub Browse our geospatial data Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Sign In Data Catalog Geohub Blog Developer Resources About Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Search -3371,https://louisville-police.org/DocumentCenter/View/778/LMPD-Training-Curriculum-Outline-2018,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3372,https://www.lvmpd.com/en-us/InternalOversightConstitutionalPolicing/Documents/Statistical%20Data%20and%20Reports/2020/Use%20of%20Force%20and%20Vehicle%20Pursuit%20Statistical%20Report%202016-2020%20FINAL.pdf,Use of Force Reports,Police & Public Interactions,"","",-1,"","","","","","","","" -3373,https://data.lacounty.gov/Criminal/All-Shooting-Incidents-for-Deputy-Involved-Shootin/xutq-azb6/data,Officer Involved Shootings,Police & Public Interactions,County of Los Angeles Open Data,"This site represents the County of Los Angeles' commitment to transparency, accountability, and community engagement - and further serve as a centralized data resource for data-driven projects. ",200,County of Los Angeles Open Data,[],[],[],[],[],[],"" -3374,https://www.manchesternh.gov/Departments/Police/Contact-Police,Contact Info & Agency Meta,Info About Agencies,Contact Police,"",200," - City Of Manchester -","[""Email Police"", ""Police Related Links""]",[],[],"[""City Hall"", ""City Government"", ""About Manchester"", ""City Services"", ""Mobile App""]",[],[],"" -3376,https://www.lapdonline.org/contact-us/,Contact Info & Agency Meta,Info About Agencies,Contact Us - LAPD Online,"",200,Home of the Los Angeles Police Department - LAPD Online,"[""Contact Us"", ""Helpful Links and Information""]","[""Phone Numbers"", ""Email the LAPD"", ""Addresses"", ""Non-Emergency Crime Reporting & Hotlines"", ""Get Service"", ""Other Services"", ""Actions & Information"", ""External Resources""]",[],[],[],[],LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. -3377,https://data.louisvilleky.gov/dataset/crime-reports,Crime Statistics,Agency-Published Resources,Louisville Kentucky Open Data,"Explore our open data and tools, and use it build insights of your own.",200,Louisville Kentucky Open Data,[],[],[],[],[],[],"" -3378,https://www.crimemapping.com/map/nh/manchester,Crime Maps & Reports,Agency-Published Resources,CrimeMapping.com - Helping You Build a Safer Community,"",200,CrimeMapping.com - Helping You Build a Safer Community,"[""My Map Summary"", ""What"", ""Where"", ""When"", ""Display Options"", ""Location Selection"", ""Choose a Search Distance"", ""Timeframe Settings"", ""From:"", ""To:""]",[],[],[],[],[],"Preparing Map Content... Preparing Map Content... Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Receive Alerts Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Distance: Miles select Distance: Miles select Streets select Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Zoom to Zoom to Zoom to Zoom to Fetching Data. x Close Fetching Data. Fetching Data. Fetching Data. x Close Share This Map My Map Summary The sum of the What, Where, When you’ve chosen. What * Data not provided by agency within map extent Where Broward County Police Boundary Agency Filter: Agency Name Here When Previous 7 Days Friday, May 1 - Friday, May 8 Restore Defaults Display Options What type(s) of records would you like to see? Select All | Deselect All Arson Assault Burglary Disturbing the Peace Drugs / Alcohol Violations DUI Fraud Homicide Motor Vehicle Theft Robbery Sex Crimes Theft / Larceny Vandalism Vehicle Break-In / Theft Weapons Sex Offender Sexual Predator * Data not provided by agency within map extent Location Selection Enter an Address, Feature or Location. Choose a Search Distance 500 feet 1000 feet 1500 feet 1/4 mile 1/2 mile 1 mile 2 miles Apply Remove Location Filter Timeframe Settings From how far back would you like to see records? **Note** This will not apply to Sex Offender data. Yesterday Previous 3 Days Previous Week Previous 4 Weeks Custom Time Range From: select Monday, March 18, 2024 To: select Sunday, March 24, 2024 Apply " -3379,https://data.louisvilleky.gov/dataset/lmpd-stops-data,Stops,Police & Public Interactions,Louisville Kentucky Open Data,"Explore our open data and tools, and use it build insights of your own.",200,Louisville Kentucky Open Data,[],[],[],[],[],[],"" -3380,https://lasd.org/transparency/discipline/#discipline_2021,Complaints & Misconduct,Info About Officers,Discipline | Los Angeles County Sheriff's Department,"These reports are based on the Department’s “Letters of Intent” and does not reflect modifications to recommended discipline due to Grievances, Skelly Hearings, Arbitration Hearings, Civil Service Commission Hearings, and/or Court Litigation.",200,Los Angeles County Sheriff's Department | A Tradition of Service,[],"[""Accountability""]","[""Employee Discipline Reports"", ""Inquiries and miscellaneous documents""]","[""2023"", ""2022"", ""2021"", ""2020"", ""2019"", ""2018"", ""2020""]",[],[],"" -3381,https://citydocs.longbeach.gov/LBPDPublicDocs/DocView.aspx?id=162830&dbid=0&repo=LBPD-PUBDOCS,Policies & Contracts,Info About Agencies,Error,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],Cookies are not enabled for this website. Cookies must be enabled in order to sign in to WebLink 10. Sign Out Cookies are not enabled for this website. Cookies must be enabled in order to sign in to WebLink 10. Sign Out Cookies are not enabled for this website. Cookies must be enabled in order to sign in to WebLink 10. Sign Out -3382,https://data.memphistn.gov/Public-Safety/911-Call-Volume-Average-Answer-Time/mec3-hdce,Calls for Service,Police & Public Interactions,911 Call Volume & Average Answer Time | Memphis Data Hub,This dataset shows the amount of time it takes the City of Memphis to answer calls to 911.,200,Memphis Data Hub,[],"[""Menu""]",[],[],[],[],Skip to Main Content Sign In COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Menu Menu Close COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Sign In Search Sign In COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Menu Sign In COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Menu Sign In Sign In COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Menu Close COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Sign In Search COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Sign In Search -3383,https://lasd.org/transparency/useofforce/#uof_2018-2021,Use of Force Reports,Police & Public Interactions,Use of Force | Los Angeles County Sheriff's Department,"",200,Los Angeles County Sheriff's Department | A Tradition of Service,[],"[""Use of Force""]","[""Patrol Divisions"", ""Custody Division"", ""Court Services Division"", ""Countywide Services Division"", ""Special Operations Division"", ""Use of Force - Category 3""]","[""2019-2022 Comparison Reports"", ""2018-2021 Comparison Reports"", ""2017-2020 Comparison Reports"", ""2016-2019 Comparison Reports"", ""2015-2018 Comparison Reports"", ""2023"", ""2022"", ""2021"", ""2020"", ""2019"", ""2018"", ""2017"", ""2021-2023 Reports"", ""2019-2021 Reports"", ""2017-2020 Reports"", ""2016-2019 Reports"", ""2015-2018 Reports"", ""2019-2022 Reports"", ""2018-2021 Reports"", ""2017-2020 Reports"", ""2016-2019 Reports"", ""2015-2018 Reports"", ""2017 (Click to expand)"", ""2023"", ""2022"", ""2021"", ""2020"", ""2019"", ""2018"", ""2017""]",[],[],"" -3384,https://www.littlerock.gov/residents/police-department/contact-us/,Contact Info & Agency Meta,Info About Agencies,Contact Us | City of Little Rock,"",200,"City of Little Rock, Arkansas - Capital City - Pulaski County | City of Little Rock","[""Contact the LRPD""]","[""We'd Love to Hear from You!"", ""E-Mail Us"", ""Call Us"", ""Get Connected with Us""]",[],[],[],[],We use cookies to give you the best online experience. Please review our use of cookies and accept to continue. Learn more Accept Accept Meet the Chief Divisions Headquarters Northwest Patrol Southwest Patrol 12th St/Downtown Patrol Major Crimes Victim Services Special Operations Training Recruiting Special Investigations Cold Case 2018 Unsolved Homicides 2017 Unsolved Homicides 2016 Unsolved Homicides Professional Standards Freedom of Information Act Request LRPD Dispatches LRPD Policies Internal Affairs 21st Century Policing LRPD Social Worker What to Do When Stopped by the Police LGBTQ Liaison Crime Free Multi-Housing Program Explorer Scouts Daily Reports Crime Prevention Neighborhood Watch Memorials Citizens Police Academy Little Rock Citizen Police Academy Candidate Form Crime Stoppers Community Cooking O.K. Program (Our Kids) GEMS Police Youth Camp Search the site Expand Search Trash & Recycling Online Payments City Documents Parks Traffic Court Meet the Chief Divisions Headquarters Northwest Patrol Southwest Patrol 12th St/Downtown Patrol Major Crimes Victim Services Special Operations Training Recruiting Special Investigations Cold Case 2018 Unsolved Homicides 2017 Unsolved Homicides 2016 Unsolved Homicides Professional Standards Freedom of Information Act Request LRPD Dispatches LRPD Policies Internal Affairs 21st Century Policing LRPD Social Worker What to Do When Stopped by the Police LGBTQ Liaison Crime Free Multi-Housing Program Explorer Scouts Daily Reports Crime Prevention Neighborhood Watch Memorials Citizens Police Academy Little Rock Citizen Police Academy Candidate Form Crime Stoppers Community Cooking O.K. Program (Our Kids) GEMS Police Youth Camp Search the site Expand Search Trash & Recycling Online Payments City Documents Parks Traffic Court Headquarters Northwest Patrol Southwest Patrol 12th St/Downtown Patrol Major Crimes Victim Services Special Operations Training Recruiting Special Investigations Cold Case 2018 Unsolved Homicides 2017 Unsolved Homicides 2016 Unsolved Homicides Headquarters Northwest Patrol Southwest Patrol 12th St/Downtown Patrol Major Crimes Victim Services Special Operations Training Recruiting Special Investigations Cold Case 2018 Unsolved Homicides 2017 Unsolved Homicides 2016 Unsolved Homicides Headquarters Northwest Patrol Southwest Patrol 12th St/Downtown Patrol Major Crimes Victim Services Special Operations Training Recruiting Special Investigations Cold Case 2018 Unsolved Homicides 2017 Unsolved Homicides 2016 Unsolved Homicides Freedom of Information Act Request LRPD Dispatches LRPD Policies Internal Affairs Freedom of Information Act Request LRPD Dispatches LRPD Policies Internal Affairs Freedom of Information Act Request LRPD Dispatches LRPD Policies Internal Affairs LRPD Social Worker What to Do When Stopped by the Police LGBTQ Liaison Crime Free Multi-Housing Program Explorer Scouts Daily Reports Crime Prevention Neighborhood Watch Memorials Citizens Police Academy Little Rock Citizen Police Academy Candidate Form Crime Stoppers Community Cooking O.K. Program (Our Kids) GEMS Police Youth Camp LRPD Social Worker What to Do When Stopped by the Police LGBTQ Liaison Crime Free Multi-Housing Program Explorer Scouts Daily Reports Crime Prevention Neighborhood Watch Memorials Citizens Police Academy Little Rock Citizen Police Academy Candidate Form Crime Stoppers Community Cooking O.K. Program (Our Kids) GEMS Police Youth Camp -3385,https://datalb.longbeach.gov/,List of Data Sources,Info About Agencies,MapsLB,"City of Long Beach, CA Hub Site",200,MapsLB,[],[],[],[],[],[],"" -3386,https://www.crimemapping.com/map/agency/211,Crime Maps & Reports,Agency-Published Resources,CrimeMapping.com - Helping You Build a Safer Community,"",200,CrimeMapping.com - Helping You Build a Safer Community,"[""My Map Summary"", ""What"", ""Where"", ""When"", ""Display Options"", ""Location Selection"", ""Choose a Search Distance"", ""Timeframe Settings"", ""From:"", ""To:""]",[],[],[],[],[],"Preparing Map Content... Preparing Map Content... Receive Alerts Go 0 Records Date Range: Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Esri, HERE, Garmin, NGA, USGS, NPS | Zoom to Receive Alerts Receive Alerts Go 0 Records Date Range: Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Esri, HERE, Garmin, NGA, USGS, NPS | Zoom to Distance: Miles select Distance: Miles select Streets select Esri, HERE, Garmin, NGA, USGS, NPS | Zoom to Esri, HERE, Garmin, NGA, USGS, NPS | Zoom to Esri, HERE, Garmin, NGA, USGS, NPS | Zoom to Zoom to Zoom to Zoom to Zoom to Fetching Data. x Close Fetching Data. Fetching Data. Fetching Data. x Close Share This Map My Map Summary The sum of the What, Where, When you’ve chosen. What * Data not provided by agency within map extent Where Broward County Police Boundary Agency Filter: Agency Name Here When Previous 7 Days Friday, May 1 - Friday, May 8 Restore Defaults Display Options What type(s) of records would you like to see? Select All | Deselect All Arson Assault Burglary Disturbing the Peace Drugs / Alcohol Violations DUI Fraud Homicide Motor Vehicle Theft Robbery Sex Crimes Theft / Larceny Vandalism Vehicle Break-In / Theft Weapons Sex Offender Sexual Predator * Data not provided by agency within map extent Location Selection Enter an Address, Feature or Location. Choose a Search Distance 500 feet 1000 feet 1500 feet 1/4 mile 1/2 mile 1 mile 2 miles Apply Remove Location Filter Timeframe Settings From how far back would you like to see records? **Note** This will not apply to Sex Offender data. Yesterday Previous 3 Days Previous Week Previous 4 Weeks Custom Time Range From: To: Apply " -3387,https://louisville-police.org/DocumentCenter/View/2008/Hillard-Heintze-Report?bidId=,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3389,https://data.lacounty.gov/,List of Data Sources,Info About Agencies,County of Los Angeles Open Data,"This site represents the County of Los Angeles' commitment to transparency, accountability, and community engagement - and further serve as a centralized data resource for data-driven projects. ",200,County of Los Angeles Open Data,[],[],[],[],[],[],"" -3390,https://www.lapdonline.org/police-commission/categorical-use-of-force/,Use of Force Reports,Police & Public Interactions,Categorical Use of Force - LAPD Online,"",200,Home of the Los Angeles Police Department - LAPD Online,"[""Categorical Use of Force""]","[""Abridged Summary Of Categorical Use Of Force Incident Findings By The Los Angeles Board Of Police Commissioners"", ""Categorical Use of Force - 2023"", ""Categorical Use of Force - 2022"", ""Categorical Use of Force - 2021"", ""Categorical Use of Force - 2020"", ""Categorical Use of Force - 2019"", ""Categorical Use of Force - 2018"", ""Categorical Use of Force - 2017"", ""Categorical Use of Force - 2016"", ""Categorical Use of Force - 2015"", ""Categorical Use of Force - 2014"", ""Categorical Use of Force - 2013"", ""Categorical Use of Force - 2012"", ""Categorical Use of Force - 2011"", ""Categorical Use of Force - 2010"", ""Categorical Use of Force - 2009"", ""Categorical Use of Force - 2008"", ""Categorical Use of Force - 2007"", ""Categorical Use of Force - 2006""]",[],[],[],[],LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. -3392,https://data.louisvilleky.gov/dataset/officer-involved-shooting-and-statistical-analysis,Officer Involved Shootings,Police & Public Interactions,Louisville Kentucky Open Data,"Explore our open data and tools, and use it build insights of your own.",200,Louisville Kentucky Open Data,[],[],[],[],[],[],"" -3393,https://oig.lacounty.gov/,Complaints & Misconduct,Info About Officers,Office of Inspector General,Office of Inspector General,200,Office of Inspector General,"[""Office of Inspector General""]","[""File A Complaint"", ""Latest Publications""]","[""To promote transparency, constitutional policing, and the fair and impartial administration of justice.""]","[""Deputy Gangs"", ""Unlawful Conduct by the former Sheriff/LASD"", ""Probation Department Oversight"", ""Report Back on Inquiry into Investigations of Allegations of Harassment of Families by the Los Angeles County Sheriff's Department"", ""Report Back on Investigating the November 4, 2023 Escape from Los Padrinos Juvenile Hall and Preventing Future Incidents"", ""Quarterly Report on Programming, Grievances and Room Confinement at Barry J. Nidorf and Central Juvenile Halls - July to September 2023"", """", ""Los Angeles County Sheriff’s Department’s Legal Compliance: Deputy Gangs"", ""Report Back on Support for Mental Health Assistants in Furthering the Sustainability and Success of the Forensic In-Patient Stepdown Unit Program"", """", ""Report Card on Sheriff’s Department's Reforms – 2019 to 2023"", ""JOIN OUR EMAILING LIST""]","[""Quick Links"", ""Contact Us"", ""County Information""]",[],"(213) 974-6100 InspectorGeneral@oig.lacounty.gov Search go Office of Inspector General County of Los Angeles Home About Publications File a Complaint Office of Inspector General To promote transparency, constitutional policing, and the fair and impartial administration of justice. FILE A COMPLAINT PUBLICATIONS SUBSCRIBE CONTACT US Deputy Gangs In the past, LASD has acknowledged that deputy subgroups exist. Former Sheriff Alex Villanueva denied the existence of law enforcement gangs within the Sheriff's Department and failed to take meaningful action to eradicate law enforcement gangs and comply with state law. OIG REPORT - Sheriff's Department's Legal Compliance: Deputy Gangs Learn More Unlawful Conduct by the former Sheriff/LASD The Sheriff’s Department, particularly under former Sheriff Alex Villanueva, has gone to great lengths to keep its conduct secret. The unlawful acts and potentially unlawful acts enumerated in our reports show a pattern and practice of the repudiation of oversight by the Office of Inspector General, the Civilian Oversight Commission, the Board of Supervisors, and the public. Learn More Probation Department Oversight On October 1, 2019, the Board of Supervisors created the Probation Oversight Commission and granted the Office of Inspector General an investigatory role to enhance oversight of the Los Angeles County Probation Department. OIG Reports Learn More File A Complaint Do you have a complaint about the Sheriff's Department that you would like to share with us? Please tell us what happened by clicking on the button below or by going to our complaint page. File a Complaint Latest Publications Report Back on Inquiry into Investigations of Allegations of Harassment of Families by the Los Angeles County Sheriff's Department Report Back on Investigating the November 4, 2023 Escape from Los Padrinos Juvenile Hall and Preventing Future Incidents Quarterly Report on Programming, Grievances and Room Confinement at Barry J. Nidorf and Central Juvenile Halls - July to September 2023 Los Angeles County Sheriff’s Department’s Legal Compliance: Deputy Gangs Report Back on Support for Mental Health Assistants in Furthering the Sustainability and Success of the Forensic In-Patient Stepdown Unit Program Report Card on Sheriff’s Department's Reforms – 2019 to 2023 VIEW MORE REPORTS JOIN OUR EMAILING LIST Would you like to receive updates on our latest publications?  Subscribe to email notifications by clicking below: SUBSCRIBE TO EMAIL NOTIFICATIONS Quick Links LA County Board of Supervisors Civilian Oversight Commission Probation Oversight Commission Citizens' Commission on Jail Violence Sheriff's Department Probation Department National Association for Civilian Oversight of Law Enforcement (NACOLE) Contact Us Office of Inspector General 500 W. Temple St., Suite 383 Los Angeles, CA 90013 (213) 974-6100 Email Us County Information 211 LA County LA CountyHelps Public Alerts Copyright © 2024 by County of Los Angeles Board of Supervisors Privacy Statement Terms of Use " -3394,https://louisville-police.org/ArchiveCenter/ViewFile/Item/91,Arrest Records,Police & Public Interactions,"","",200,"","","","","","","","" -3395,https://www.lvmpd.com/en-us/ProtectTheCity/Pages/LVMPDPoliceAcademy.aspx,Policies & Contracts,Info About Agencies,"","",-1,"","","","","","","","" -3396,https://www.kckpd.org/8cantwait.html,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3397,https://www.lapdonline.org/newsroom/policy-on-the-use-of-force-revised/,Policies & Contracts,Info About Agencies,Policy on the Use of Force - Revised - LAPD Online,"",200,Home of the Los Angeles Police Department - LAPD Online,"[""Policy on the Use of Force – Revised""]","[""View Newsroom Articles by Year"", ""Do you have any helpful information regarding this post?""]","[""Wish to remain anonymous?""]",[],[],[],LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. LOS ANGELES LOS ANGELES 311 Services City Services Opens https://myla311.lacity.org/ in a new window. LA Directory City Directory Opens https://lacity.gov/directory in a new window. -3398,https://www.longbeach.gov/police/about-the-lbpd/lbpd-1421748/use-of-force/,Use of Force Reports,Police & Public Interactions,Use of Force,"",200,City of Long Beach,"[""Police Department""]","[""SB 1421 Use of Force""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""2020"", ""2019"", ""2017"", ""2016"", ""2015"", ""2011"", ""2009"", ""USE OF FORCE"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""LBPD SB 1421/AB 748"", ""Public Records Request""]",[],"" -3399,https://louisville-police.org/DocumentCenter/View/615/Standard-Operating-Procedures-PDF,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3400,https://www.lvmpd.com/en-us/Pages/ContactUs.aspx,Contact Info & Agency Meta,Info About Agencies,"","",-1,"","","","","","","","" -3401,http://www.manchesternh.gov/Departments/Police/Police-Log,Calls for Service,Police & Public Interactions,Police Log,"",200," - City Of Manchester -","[""Police Log"", ""Police Related Links""]",[],"[""Dates""]","[""City Hall"", ""City Government"", ""About Manchester"", ""City Services"", ""Mobile App""]",[],[],"" -3402,https://lasd.org/SACR_opendata.html,Stops,Police & Public Interactions,"","",404,"","","","","","","","" -3403,http://shq.lasdnews.net/content/uoa/PSD/force-policy.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3404,http://shq.lasdnews.net/pages/pagedetail.aspx?id=2411,Policies & Contracts,Info About Agencies,LASD.org - Information Detail,"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],[],[],[],[],[],"Crime Information Public Alerts LA County & Justice Community External Links Highlights Home > Prof Standards Division > Event Detail Translation [English] | LASD Home | Contact Us Normal Large Largest Search Sheriff's Website × search Information Detail Manual of Policy and Procedures Use of Force Policy http://shq.lasdnews.net/content/uoa/PSD/force-policy.pdf MANUAL OF POLICY & PROCEDURES VOLUME 1 - Introduction Introduction http://shq.lasdnews.net/content/uoa/PSD/1-01.pdf VOLUME 2 - Organization and Functions Charts http://shq.lasdnews.net/content/uoa/PSD/2-01.pdf The Rank Structure of the Department http://shq.lasdnews.net/content/uoa/PSD/2-02.pdf The Organization of the Department http://shq.lasdnews.net/content/uoa/PSD/2-03.pdf Executive Offices http://shq.lasdnews.net/content/uoa/PSD/2-04.pdf Detective Division http://shq.lasdnews.net/content/uoa/PSD/2-05.pdf Field Operations Regions http://shq.lasdnews.net/content/uoa/PSD/2-06.pdf Administrative Services Division http://shq.lasdnews.net/content/uoa/PSD/2-07.pdf Court Services Division http://shq.lasdnews.net/content/uoa/PSD/2-08.pdf Custody Divisions http://shq.lasdnews.net/content/uoa/PSD/2-09.pdf Technical Services Division http://shq.lasdnews.net/content/uoa/PSD/2-10.pdf Office of Homeland Security http://shq.lasdnews.net/content/uoa/PSD/2-11.pdf VOLUME 3 - Policy and Ethics Policy and Ethics http://shq.lasdnews.net/content/uoa/PSD/3-01.pdf Personnel http://shq.lasdnews.net/content/uoa/PSD/3-02.pdf Uniform and Safety Equipment http://shq.lasdnews.net/content/uoa/PSD/3-03.pdf Special Reviews, Public Complaint Process, and Personnel Investigations http://shq.lasdnews.net/content/uoa/PSD/3-04.pdf Fiscal http://shq.lasdnews.net/content/uoa/PSD/3-05.pdf Equipment, Supply and Maintenance http://shq.lasdnews.net/content/uoa/PSD/3-06.pdf Communications http://shq.lasdnews.net/content/uoa/PSD/3-07.pdf Correspondence http://shq.lasdnews.net/content/uoa/PSD/3-08.pdf Miscellaneous Administrative Procedures http://shq.lasdnews.net/content/uoa/PSD/3-09.pdf Force Policy http://shq.lasdnews.net/content/uoa/PSD/3-10.pdf VOLUME 4 - Case Assignment and Reporting General Information http://shq.lasdnews.net/content/uoa/PSD/4-01.pdf Uniform Report Numbers http://shq.lasdnews.net/content/uoa/PSD/4-02.pdf Catalina Island Procedures http://shq.lasdnews.net/content/uoa/PSD/4-03.pdf Letter ""A"" http://shq.lasdnews.net/content/uoa/PSD/4-04.pdf Letter ""B"" http://shq.lasdnews.net/content/uoa/PSD/4-05.pdf Letter ""C"" http://shq.lasdnews.net/content/uoa/PSD/4-06.pdf Letter ""D"" http://shq.lasdnews.net/content/uoa/PSD/4-07.pdf Letter ""E"" http://shq.lasdnews.net/content/uoa/PSD/4-08.pdf Letter ""F"" http://shq.lasdnews.net/content/uoa/PSD/4-09.pdf Letter ""G"" http://shq.lasdnews.net/content/uoa/PSD/4-10.pdf Letter ""H"" http://shq.lasdnews.net/content/uoa/PSD/4-11.pdf Letter ""I"" http://shq.lasdnews.net/content/uoa/PSD/4-12.pdf Letter ""J"" http://shq.lasdnews.net/content/uoa/PSD/4-13.pdf Letter ""K"" http://shq.lasdnews.net/content/uoa/PSD/4-14.pdf Letter ""L"" http://shq.lasdnews.net/content/uoa/PSD/4-15.pdf Letter ""M"" http://shq.lasdnews.net/content/uoa/PSD/4-16.pdf Letter ""N"" http://shq.lasdnews.net/content/uoa/PSD/4-17.pdf Letter ""O"" http://shq.lasdnews.net/content/uoa/PSD/4-18.pdf Letter ""P"" http://shq.lasdnews.net/content/uoa/PSD/4-19.pdf Letter ""Q"" http://shq.lasdnews.net/content/uoa/PSD/4-20.pdf Letter ""R"" http://shq.lasdnews.net/content/uoa/PSD/4-21.pdf Letter ""S"" http://shq.lasdnews.net/content/uoa/PSD/4-22.pdf Letter ""T"" http://shq.lasdnews.net/content/uoa/PSD/4-23.pdf Letter ""U"" http://shq.lasdnews.net/content/uoa/PSD/4-24.pdf Letter ""V"" http://shq.lasdnews.net/content/uoa/PSD/4-25.pdf Letter ""W"" http://shq.lasdnews.net/content/uoa/PSD/4-26.pdf Form Numbers and Titles http://shq.lasdnews.net/content/uoa/PSD/4-27.pdf Form Numbers and Titles http://shq.lasdnews.net/content/uoa/PSD/4-28.pdf VOLUME 5 - Line Procedures Motor Vehicles http://shq.lasdnews.net/content/uoa/PSD/5-01.pdf Juveniles http://shq.lasdnews.net/content/uoa/PSD/5-02.pdf Prisoners http://shq.lasdnews.net/content/uoa/PSD/5-03.pdf Property and Evidence Procedures http://shq.lasdnews.net/content/uoa/PSD/5-04.pdf Traffic http://shq.lasdnews.net/content/uoa/PSD/5-05.pdf Emergency and Disaster http://shq.lasdnews.net/content/uoa/PSD/5-06.pdf Judicial Process http://shq.lasdnews.net/content/uoa/PSD/5-07.pdf Technical http://shq.lasdnews.net/content/uoa/PSD/5-08.pdf Miscellaneous Line Procedures http://shq.lasdnews.net/content/uoa/PSD/5-09.pdf VOLUME 7 - Samples and Miscellaneous Information Samples http://shq.lasdnews.net/content/uoa/PSD/7-01.pdf Radio Communication Call Numbers http://shq.lasdnews.net/content/uoa/PSD/7-02.pdf Miscellaneous Information http://shq.lasdnews.net/content/uoa/PSD/7-03.pdf The LASD.org® website has made reasonable efforts to provide an accurate translation. However, - no automated or computerized translation is perfect and is not intended to replace human or - " -3405,https://www.longbeach.gov/police/contact-us/ ,Contact Info & Agency Meta,Info About Agencies,City of Long Beach,"",200,City of Long Beach,[],"[""Page Not Found""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[],"" -3406,https://www.lvmpd.com/en-us/Pages/CurrentTraffic.aspx,Stops,Police & Public Interactions,"","",-1,"","","","","","","","" -3407,https://www.nashville.gov/departments/police/data-dashboard/vehicle-stops-map,Stops,Police & Public Interactions,Police Data Dashboard: Vehicle Stops Map | Nashville.gov,Official website of the Metropolitan Government of Nashville and Davidson County.,200,Attention Required! | Cloudflare,"[""Police Data Dashboard: Vehicle Stops Map""]","[""Breadcrumb"", ""Related Tags"", ""Mobile Apps"", ""Nashville.gov"", ""Quick Links"", ""Contact"", ""Connect""]","[""Search Metropolitan Nashville Police Department""]",[],[],[],Close Search Metropolitan Nashville Police Department Close Search Metropolitan Nashville Police Department Close Search Metropolitan Nashville Police Department -3408,https://www.nashville.gov/departments/police/data-dashboard/use-force,Use of Force Reports,Police & Public Interactions,Police Data Dashboard: Use of Force | Nashville.gov,Official website of the Metropolitan Government of Nashville and Davidson County.,200,Attention Required! | Cloudflare,"[""Police Data Dashboard: Use of Force""]","[""Breadcrumb"", ""Related Tags"", ""Mobile Apps"", ""Nashville.gov"", ""Quick Links"", ""Contact"", ""Connect""]","[""Search Metropolitan Nashville Police Department""]",[],[],[],Close Search Metropolitan Nashville Police Department Close Search Metropolitan Nashville Police Department Close Search Metropolitan Nashville Police Department -3409,https://data.montgomerycountymd.gov/,List of Data Sources,Info About Agencies,Montgomery County Data | Open Data Portal,"",200,Montgomery County Data | Open Data Portal,[],"[""Menu"", ""Explore Data"", ""Featured Datasets""]",[],[],[],[],"Skip to main content Skip to footer links data.Montgomerycountymd.gov Search Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu Menu Close Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Search Previous slide Fiscal Year 2024 dataMontgomery Open Data Operations Manual Annual Update View the Report Welcome to dataMontgomery Learn about the Platform Online Residents User Guide Explore the User Guide Next slide Pause slides 1 2 3 Explore Data Business Data on economic development, permitting and certification, and protection of the consumer Community/Recreation Data on use of public facilities, community outreach, and recreation programs and facilities Consumer/Housing Data on Consumer licensing and complaints, housing code enforcement and loans Education Data on Montgomery County colleges and universities, public and private schools Elections Data on election precincts, polling places, calendar of events and election results Environment Data on environment special protection areas, recycling, and waste reduction Finance/Tax/Property Data on County tax rates and credit, county spending, and property tax Government Data on 311, human rights and resources, and budget information Health and Human Services Data on healthcare, insurance, benefits, and restaurant inspections Human Resources Data on County employees and human rights Law/Judicial Data on County executive orders, information on County Attorney Licenses/Permits Data on all County commercial, residential, and environmental permits Public Safety Data on Montgomery County Police, Fire and Rescue, and Corrections and Rehabilitation Technology Data on County Technology including hardware and systems Transportation Data on County Ride on buses, metro rail, and parking Featured Datasets dataMontgomery Dataset Publishing Plan Current and future plans for dataMontgomery data Crash Incidents General information on traffic collisions in the County Construction Activity Check out construction in your area Active Road Closures Active road closures in the County Adoptable Pets Check out the latest pets up for adoption. " -3410,https://data.mesaaz.gov/Police/Police-Incidents/39rt-2rfj`,Crime Statistics,Agency-Published Resources,"","",404,"","","","","","","","" -3411,https://www2.minneapolismn.gov/government/departments/civil-rights/opcr/case-summaries/,Complaints & Misconduct,Info About Officers,Case Summaries - City of Minneapolis,You can view the open and closed case summaries from the Office of Police Conduct Review.,200,City of Minneapolis,"[""Case summaries"", ""Need help? We're here for you.""]","[""Open case reports"", ""Closed case summaries"", ""2022"", ""OPCR Case summaries and synopses"", """", ""2019 through 2021"", """", ""2018"", """", ""2017"", """", ""2016"", """", ""2015"", ""2014"", """", ""2013"", ""Contact us""]","[""Request accessible format"", ""Office of Police Conduct Review""]",[],[],[],"" -3412,https://www.crimemapping.com/map/fl/miami-dadecounty  ,Crime Maps & Reports,Agency-Published Resources,"","",200,CrimeMapping.com - Helping You Build a Safer Community,[],[],[],[],[],[],"" -3413,https://data.milwaukee.gov/dataset/wibr,Crime Statistics,Agency-Published Resources,WIBR Crime Data (Current) - Dataset - City of Milwaukee Open Data Portal,"",200,Welcome - City of Milwaukee Open Data Portal ,"[""Milwaukee Open Data"", ""WIBR Crime Data (Current)"", ""Milwaukee Police Department"", ""WIBR Crime Data (Current)""]","[""Organization"", ""Social"", ""License"", ""Data and Resources""]","[""Additional Info""]",[],[],[],"Skip to content Log in Register Contact City of Milwaukee Log in Register Contact City of Milwaukee City of Milwaukee Toggle navigation Milwaukee Open Data City of Milwaukee Open Data Portal Home Datasets Organizations Groups About Help Search Datasets Toggle navigation Milwaukee Open Data City of Milwaukee Open Data Portal Milwaukee Open Data City of Milwaukee Open Data Portal Home Datasets Organizations Groups About Help Search Datasets Search Datasets Home Organizations Milwaukee Police Department WIBR Crime Data (Current) WIBR Crime Data (Current) Followers 8 Organization Milwaukee Police Department VISION -A Milwaukee where all can live safely and without fear, protected by a police department with the highest ethical and professional standards. -MISSION -In partnership with... read more Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream WIBR Crime Data (Current) Update Frequency: Daily Current year to date. Wisconsin Incident Based Report (WIBR) Group A Offenses. The Crime Data represents incident level data defined by Wisconsin Incident Based Reporting System (WIBRS) codes. WIBRS reporting is a crime reporting standard and can not be compared to any previous UCR report. Therefore, the Crime Data may reflect: Information not yet verified by further investigation Preliminary crime classifications that may be changed at a later date based upon further investigation Information that may include mechanical or human error Neither the City of Milwaukee nor the Milwaukee Police Department guarantee (either express or implied) the accuracy, completeness, timeliness, or correct sequencing of the Crime Data. The City of Milwaukee and the Milwaukee Police Department shall have no liability for any error or omission, or for the use of, or the results obtained from the use of the Crime Data. In addition, the City of Milwaukee and the Milwaukee Police Department caution against using the Crime Data to make decisions/comparisons regarding the safety of or the amount of crime occurring in a particular area. When reviewing the Crime Data, the site user should consider that: The information represents only police services where a report was made and does not include other calls for police service The information does not reflect or certify ""safe"" or ""unsafe"" areas The information will sometimes reflect where the crime was reported versus where the crime occurred This data is not intended to represent a total number/sum of crimes, rather 1 = True and 0 = False. The use of the Crime Data indicates the site user's unconditional acceptance of all risks associated with the use of the Crime Data. Data and Resources CSV CSV Popular Explore Preview Download JSON JSON Popular Explore More information Download XML XML Popular Explore More information Download Top 5 Crimes Recorded in 2017 CSV Popular Top 5 Crimes Reported in 2017 listed by Aldermanic District. Explore Preview Download Incident MPD Police Safety Additional Info Field Value Last Updated March 25, 2024, 5:25 AM (UTC-04:00) Created May 8, 2018, 12:31 PM (UTC-04:00) " -3414,https://gis-mdc.opendata.arcgis.com/datasets/ufc/explore,Complaints & Misconduct,Info About Officers,UFC,A feature layer of Miami-Dade Police Department Professional Compliance Bureau citizen complaint data.,200,Open Data Hub Site,[],[],[],[],[],[],"" -3415,https://www.montgomerycountymd.gov/pol/Resources/Files/PDF/Directives/100/FC%20131%20Response%20Resistance%20and%20Use%20of%20Force_052021.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3416,https://mpdtsu.org/tsustatistics/,Stops,Police & Public Interactions,TSU Statistics – Traffic Safety Unit,"",200,Traffic Safety Unit – Milwaukee Police Department,"[""TSU Statistics""]",[],"[""Share this:""]",[],[],[],Skip to content Traffic Safety Unit Milwaukee Police Department Home Be Part of the Solution / Sea parte de la solución Deployments Calendar Towing Facts TSU in the News TSU Statistics TSU Statistics Share this: Click to share on Facebook (Opens in new window) Copyright © 2022 Milwaukee Police Department Traffic Safety Unit Traffic Safety Unit Milwaukee Police Department Home Be Part of the Solution / Sea parte de la solución Deployments Calendar Towing Facts TSU in the News TSU Statistics Traffic Safety Unit Milwaukee Police Department Traffic Safety Unit Milwaukee Police Department Home Be Part of the Solution / Sea parte de la solución Deployments Calendar Towing Facts TSU in the News TSU Statistics Home Be Part of the Solution / Sea parte de la solución Deployments Calendar Towing Facts TSU in the News TSU Statistics TSU Statistics Share this: Click to share on Facebook (Opens in new window) Share this: Click to share on Facebook (Opens in new window) Share this: Click to share on Facebook (Opens in new window) Share this: Click to share on Facebook (Opens in new window) Share this: Click to share on Facebook (Opens in new window) Click to share on Facebook (Opens in new window) Copyright © 2022 Milwaukee Police Department Traffic Safety Unit Copyright © 2022 Milwaukee Police Department Traffic Safety Unit Copyright © 2022 Milwaukee Police Department Traffic Safety Unit Copyright © 2022 Milwaukee Police Department Traffic Safety Unit -3417,https://www.miamidade.gov/global/service.page?Mduid_service=ser1510669357918648,Crime Statistics,Agency-Published Resources,Crime Map,Check out our crime incident map to see if crimes have been committed in your area. Check out our crime incident map to see if crimes have been committed in your area. Check out our crime incident map to see if crimes have been committed in your area. Check out our crime incident map to see if crimes have been committed in your area. Check out our crime incident map to see if crimes have been committed in your area. Check out our crime incident map to see if crimes have been committed in your area. Check out our crime incident map to see if crimes have been committed in your area. Check out our crime incident map to see if crimes have been committed in your area.,200,Untitled Document,"[""Crime Map""]","[""Online Options"", ""Miami-Dade Police Department"", ""Help and Support"", ""Self-Service"", ""Stay Connected"", ""Leaving Miami-Dade County""]","[""Interest Categories"", ""Online Services"", ""News & Social Media"", ""Create a new miamidade.gov account"", ""Elected Officials"", ""County Agencies"", ""Transparency & Open Data"", ""Employee Information"", ""My Employee Portal"", ""Interest Categories"", ""Online Services"", ""News & Social Media"", ""Create a new miamidade.gov account"", ""Elected Officials"", ""County Agencies"", ""Transparency & Open Data"", ""Employee Information"", ""My Employee Portal""]",[],[],[],"" -3418,https://www.miamidade.gov/global/police/contact-police.page,Contact Info & Agency Meta,Info About Agencies,Contact the Miami-Dade Police Department,Contact information for Miami-Dade Police Department.,200,Untitled Document,"[""Contact the Miami-Dade Police Department""]","[""Office of the Director"", ""Compliance and Standards Division"", ""Police Services"", ""Fiscal and Departmental Services"", ""Investigative Services"", ""Public Safety and Emergency Response Services"", ""Office of the Director"", ""Compliance and Standards Division"", ""Police Services"", ""Fiscal and Departmental Services"", ""Investigative Services"", ""Public Safety and Emergency Response Services"", ""Crime Stoppers"", ""Public Records Requests"", ""Accommodations for Persons with Disabilities"", ""Miami-Dade Police Department"", ""Help and Support"", ""Self-Service"", ""Stay Connected"", ""Leaving Miami-Dade County""]","[""Interest Categories"", ""Online Services"", ""News & Social Media"", ""Create a new miamidade.gov account"", ""Elected Officials"", ""County Agencies"", ""Transparency & Open Data"", ""Employee Information"", ""My Employee Portal"", ""Interest Categories"", ""Online Services"", ""News & Social Media"", ""Create a new miamidade.gov account"", ""Elected Officials"", ""County Agencies"", ""Transparency & Open Data"", ""Employee Information"", ""My Employee Portal""]",[],[],[],"" -3419,https://public.powerdms.com/MESAPD/tree,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by -3420,https://city.milwaukee.gov/fpc/Reports/ReportsonMPD/Use-of-Force-Reports.htm#.XtfXuTpKiUk,Use of Force Reports,Police & Public Interactions,"","",403,"","","","","","","","" -3421,https://data.miamigov.com/,List of Data Sources,Info About Agencies,"","",-1,"","","","","","","","" -3422,https://www.mesaaz.gov/home/showdocument?id=22664,Complaints & Misconduct,Info About Officers,"","",-1,"","","","","","","","" -3423,https://www.arcgis.com/apps/dashboards/714e29a27f694137a29f2ee048dfb8a3,Officer Involved Shootings,Police & Public Interactions,ArcGIS Dashboards,ArcGIS Dashboards,200,"",[],[],[],[],[],[],"" -3424,https://data.montgomerycountymd.gov/Public-Safety/Police-Dispatched-Incidents/98cc-bc7d,Calls for Service,Police & Public Interactions,Police Dispatched Incidents | Open Data Portal,"",200,Montgomery County Data | Open Data Portal,"[""MC Police Dispatched Incidents Map"", ""Police Dispatches for Pedestrian Struck"", ""Police Dispatches for Collisions"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Police Dispatched Incidents"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Police Dispatched Incidents"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Dataset Information"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content data.Montgomerycountymd.gov Search Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu Menu Close Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Search data.Montgomerycountymd.gov Search Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu data.Montgomerycountymd.gov Search data.Montgomerycountymd.gov Search Search Search Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Open Budget Operating Budget Publication CIP Budget Publication Open Budget Operating Budget Publication CIP Budget Publication Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Sign In -3425,https://www.mesaaz.gov/government/contact-us?locale=en,Contact Info & Agency Meta,Info About Agencies,"","",-1,"","","","","","","","" -3426,https://data.milwaukee.gov/,List of Data Sources,Info About Agencies,Welcome - City of Milwaukee Open Data Portal,"",200,Welcome - City of Milwaukee Open Data Portal ,"[""Milwaukee Open Data"", ""City of Milwaukee Open Data Portal""]","[""Groups"", ""Showcases"", ""Popular Datasets"", ""New and Recent Datasets""]","[""Search data"", ""Popular tags"", ""Assessed V.S. Exempt Properties by Ald. District 2018"", ""Service Request Comparisons Between 2016 and 2017"", ""Address Search Application"", ""Map Milwaukee Portal"", ""My Milwaukee Home"", ""Property Assessment Data"", ""Current Milwaukee Fire Dispatched Calls for Service"", ""Current Milwaukee Police Dispatched Calls for Service"", ""Restaurant and Food Service Inspections"", ""Budget Office Visualizations"", ""Assessed V.S. Exempt Properties by Ald. District 2018"", ""Service Request Comparisons Between 2016 and 2017"", ""Address Search Application"", ""Map Milwaukee Portal"", ""Property Sales Data"", ""City Employee Salary Data"", ""Personal Property Assessments"", ""Traffic Accident Data"", ""Master Property File (MPROP)"", ""City of Milwaukee Open Data Dataset Catalog"", ""WIBR Crime Data (Historical)"", ""WIBR Crime Data (Current)"", ""Traffic Accident Data"", ""Master Property File (MPROP)""]",[],[],[],"Skip to content Log in Register Contact City of Milwaukee Log in Register Contact City of Milwaukee City of Milwaukee Toggle navigation Milwaukee Open Data City of Milwaukee Open Data Portal Home Datasets Organizations Groups About Help Search Datasets Toggle navigation Milwaukee Open Data City of Milwaukee Open Data Portal Milwaukee Open Data City of Milwaukee Open Data Portal Home Datasets Organizations Groups About Help Search Datasets Search Datasets City of Milwaukee Open Data Portal Search data Search Popular tags Ballot Vote Election Groups These datasets are organized according to city services-related topics. Elections & Campaign Housing & Property Maps City Services Public Safety External Datasets Showcases These datasets represent the most popular and important information requested by the public. Previous Assessed V.S. Exempt Properties by Ald. District 2018 View Assessed V.S. Exempt Properties by Ald. District 2018 Service Request Comparisons Between 2016 and 2017 View Service Request Comparisons Between 2016 and 2017 Address Search Application View Address Search Application Map Milwaukee Portal View Map Milwaukee Portal My Milwaukee Home View My Milwaukee Home Property Assessment Data View Property Assessment Data Current Milwaukee Fire Dispatched Calls for Service View Current Milwaukee Fire Dispatched Calls for Service Current Milwaukee Police Dispatched Calls for Service View Current Milwaukee Police Dispatched Calls for Service Restaurant and Food Service Inspections View Restaurant and Food Service Inspections Budget Office Visualizations View Budget Office Visualizations Assessed V.S. Exempt Properties by Ald. District 2018 View Assessed V.S. Exempt Properties by Ald. District 2018 Service Request Comparisons Between 2016 and 2017 View Service Request Comparisons Between 2016 and 2017 Address Search Application View Address Search Application Map Milwaukee Portal View Map Milwaukee Portal Next Popular Datasets Browse popular datasets below and see what other citizens find interesting. Property Sales Data 309 recent views CSV City Employee Salary Data 281 recent views CSV Personal Property Assessments 205 recent views CSV Traffic Accident Data 147 recent views CSV JSON XML Master Property File (MPROP) 141 recent views CSV JSON XML PDF New and Recent Datasets Browse new or modified datasets below. Click to view details or explore content. City of Milwaukee Open Data Dataset Catalog Updated on March 25, 2024 CSV WIBR Crime Data (Historical) Updated on March 25, 2024 CSV JSON XML WIBR Crime Data (Current) Updated on March 25, 2024 CSV JSON XML Traffic Accident Data Updated on March 25, 2024 CSV JSON XML Master Property File (MPROP) Updated on March 25, 2024 CSV JSON XML PDF " -3427,https://www.minneapolismn.gov/government/departments/police/mpd-policy-procedure-manual/policy-manual/ ,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3428,https://gis-mdc.opendata.arcgis.com/datasets/srrr/explore ,Use of Force Reports,Police & Public Interactions,SRRR,A feature layer of Miami-Dade Police Department Professional Compliance Bureau citizen complaint data.,200,Open Data Hub Site,[],[],[],[],[],[],"" -3429,https://www.minneapolismn.gov/media/-www-content-assets/documents/MPD-Policy-and-Procedure-Manual.pdf ,Policies & Contracts,Info About Agencies,300 Multiple Choices,"",300,City of Minneapolis,"[""Multiple Choices""]",[],[],[],[],[],"" -3430,https://opendata.minneapolismn.gov/datasets/cityoflakes::police-stop-data,Stops,Police & Public Interactions,Police Stop Data,Stop Data for the Minneapolis Police Department. Please note that the datetimes shown are in UTC time (not local time).,200,Open Minneapolis,[],[],[],[],[],[],"" -3431,http://archive.miamigov.com/cip/docs/AnnualReport2017.pdf,Complaints & Misconduct,Info About Officers,Civilian Investigative Panel (CIP) - Miami,The Civilian Investigative Panel (CIP) provides for independent and impartial citizens’ oversight of the Miami Police Department.,200,CMS Redirect,"[""Civilian Investigative Panel (CIP)"", ""Top Services"", ""Process""]","[""File a Complaint Against a Miami Police Officer"", ""Join the Community-Police Mediation Program"", ""Department Head"", ""What We Do"", ""Staff"", ""Panel Members"", ""Investigations"", ""Community-Police Mediation Program"", ""Reports and Data"", ""Contact Us"", ""Meetings & Agendas"", ""Filing a Complaint"", ""Apply to be a Member""]","[""Rodney Jacobs"", ""Filing a Complaint"", ""Phone"", ""Email"", ""Location"", ""Contact Us"", ""Share & Connect"", ""Visit Other Miami Sites"", ""Digital Cities""]",[],[],[],opens in new tab or window -3432,https://tableau.minneapolismn.gov/views/MPDMStatArrestData/ArrestDashboard-byDate?:iid=1&:isGuestRedirectFromVizportal=y&:embed=y,Arrest Records,Police & Public Interactions,"","",403,"","","","","","","","" -3433,https://www.miami-police.org/annual_reports.html,Crime Statistics,Agency-Published Resources,Annual Reports - Miami Police Department,Miami Police Department Annual Reports,200,Miami Police Department,[],[],[],[],[],[],"STATIONS DISTRICT MAPS ALLAPATTAH BRICKELL ROADS COCONUT GROVE CORAL WAY DOWNTOWN EDGEWATER FLAGAMI LITTLE HAITI LITTLE HAVANA MODEL CITY OVERTOWN UPPER EAST SIDE WYNWOOD STATIONS DISTRICT MAPS ALLAPATTAH BRICKELL ROADS COCONUT GROVE CORAL WAY DOWNTOWN EDGEWATER FLAGAMI LITTLE HAITI LITTLE HAVANA MODEL CITY OVERTOWN UPPER EAST SIDE WYNWOOD OFFICE of THE CHIEF ADMINISTRATION FIELD OPERATIONS CRIMINAL INVESTIGATIONS INTERNAL AFFAIRS PROFESSIONAL COMPLIANCE LEGAL INFO ANNUAL REPORTS EMPLOYEE AWARDS OFFICE of THE CHIEF ADMINISTRATION FIELD OPERATIONS CRIMINAL INVESTIGATIONS INTERNAL AFFAIRS PROFESSIONAL COMPLIANCE LEGAL INFO ANNUAL REPORTS EMPLOYEE AWARDS PERSONNEL RESOURCE INFORMATION TECHNOLOGY BUSINESS MANAGEMENT COMMUNICATIONS/SUPPORT SERVICES TRAINING & PERSONNEL DEVELOPMENT PROPERTY & EVIDENCE MANAGEMENT PERSONNEL RESOURCE INFORMATION TECHNOLOGY BUSINESS MANAGEMENT COMMUNICATIONS/SUPPORT SERVICES TRAINING & PERSONNEL DEVELOPMENT PROPERTY & EVIDENCE MANAGEMENT NORTH DISTRICT CENTRAL DISTRICT SOUTH DISTRICT SPECIALIZED OPERATIONS SECTION COMMUNITY RELATIONS NORTH DISTRICT CENTRAL DISTRICT SOUTH DISTRICT SPECIALIZED OPERATIONS SECTION COMMUNITY RELATIONS DO THE RIGHT THING POLICE ATHLETIC LEAGUE DO THE RIGHT THING POLICE ATHLETIC LEAGUE CRIMINAL INVESTIGATIONS INVESTIGATIVE SUPPORT SPECIAL INVESTIGATIONS CRIMINAL INVESTIGATIONS INVESTIGATIVE SUPPORT SPECIAL INVESTIGATIONS INTERNAL AFFAIRS SECTION INTERNAL AFFAIRS SECTION RECORDS RECOVER PROPERTY ALARMS UNIT VICTIMS ADVOCATE FRAUD VICTIMS SPECIAL EVENTS UNIT MAKE A COMPLAINT CRIME DATA REQUESTS REPORT GANG ACTIVITY CRIME MAPPING REQUEST CRIME WATCH COMMEND AN OFFICER RECORDS RECOVER PROPERTY ALARMS UNIT VICTIMS ADVOCATE FRAUD VICTIMS SPECIAL EVENTS UNIT MAKE A COMPLAINT CRIME DATA REQUESTS REPORT GANG ACTIVITY CRIME MAPPING REQUEST CRIME WATCH COMMEND AN OFFICER PUBLIC INFO OFFICE NEWS RELEASES COMMUNITY EVENTS VIDEOS SOCIAL MEDIA PUBLIC INFO OFFICE NEWS RELEASES COMMUNITY EVENTS VIDEOS SOCIAL MEDIA CAREERS CAREERS POLICE COLLEGE WEBSITE MAGNET HIGH SCHOOL TRAINING HISTORY ACCOMPLISHMENTS CONTACT POLICE COLLEGE WEBSITE MAGNET HIGH SCHOOL TRAINING HISTORY ACCOMPLISHMENTS CONTACT MIAMI POLICE SHIELD SEXUAL PREDATORS DOMESTIC VIOLENCE SAFETY TIPS KIDS CORNER MIAMI POLICE SHIELD SEXUAL PREDATORS DOMESTIC VIOLENCE SAFETY TIPS KIDS CORNER Search Dial 911 for EMERGENCIES ONLY Miami Police Non-Emergency: - (305) 579-6111 CrimeStoppers: (305) 471-TIPS (8477) Inside MPD > Annual Reports Your browser does not support the video tag. 2022 Annual Report 2021 Annual Report 2020 Annual Report 2019 Annual Report 2018 Annual Report 2017 Annual Report 2016 Annual Report 2015 Annual Report 2014 Annual Report 2013 Annual Report 2012 Annual Report 2011 Annual Report 2010 Annual Report 2009 Annual Report 2008 Annual Report 2007 Annual Report 2006 Annual Report 2004 Annual Report Archive Copyright © 2024 The City of Miami Police Department. All rights reserved. This information is made available to the public and law enforcement in the interest of public safety. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Search Your browser does not support the video tag. 2022 Annual Report 2021 Annual Report 2020 Annual Report 2019 Annual Report 2018 Annual Report 2017 Annual Report 2016 Annual Report 2015 Annual Report 2014 Annual Report 2013 Annual Report 2012 Annual Report 2011 Annual Report 2010 Annual Report 2009 Annual Report 2008 Annual Report 2007 Annual Report 2006 Annual Report 2004 Annual Report " -3434,https://reimagine.memphistn.gov/isb-dashboard/,Complaints & Misconduct,Info About Officers,ISB Dashboard - Reimagine Policing in Memphis,"",200,403 Forbidden,"[""ISB Dashboard""]","[""What is ISB?"", ""Alleged Violations Against Officers"", ""Response to Resistance"", ""Additional Resources""]","[""ISB Annual Reports"", ""Hearing Summary Reports""]","["""", """"]",[],[],Search Reimagine Policing in Memphis Menu Home Eight Can’t Wait 21st Century Policing Pillar One Pillar Two Pillar Three Pillar Four Pillar Five Pillar Six Resources Actions Taken File a Complaint Policies & Reports Hiring Process Training Community Outreach Mayor’s Priorities Join MPD Menu Search Search Reimagine Policing in Memphis Menu Reimagine Policing in Memphis Reimagine Policing in Memphis Home Eight Can’t Wait 21st Century Policing Pillar One Pillar Two Pillar Three Pillar Four Pillar Five Pillar Six Resources Actions Taken File a Complaint Policies & Reports Hiring Process Training Community Outreach Mayor’s Priorities Join MPD Menu Search Menu Search Menu Search Search for: Close search Search for: Close search Search for: Close search Close Menu Home Eight Can’t Wait 21st Century Policing Show sub menu Pillar One Pillar Two Pillar Three Pillar Four Pillar Five Pillar Six Resources Show sub menu Actions Taken File a Complaint Policies & Reports Hiring Process Training Community Outreach Mayor’s Priorities Join MPD English Arabic Chinese (Simplified) Dutch English Filipino French German Haitian Creole Hebrew Indonesian Italian Japanese Korean Portuguese Russian Spanish Vietnamese Select Language Afrikaans Albanian Amharic Arabic Armenian Assamese Aymara Azerbaijani Bambara Basque Belarusian Bengali Bhojpuri Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dhivehi Dogri Dutch Esperanto Estonian Ewe Filipino Finnish French Frisian Galician Georgian German Greek Guarani Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Ilocano Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Kinyarwanda Konkani Korean Krio Kurdish (Kurmanji) Kurdish (Sorani) Kyrgyz Lao Latin Latvian Lingala Lithuanian Luganda Luxembourgish Macedonian Maithili Malagasy Malay Malayalam Maltese Maori Marathi Meiteilon (Manipuri) Mizo Mongolian Myanmar (Burmese) Nepali Norwegian Odia (Oriya) Oromo Pashto Persian Polish Portuguese Punjabi Quechua Romanian Russian Samoan Sanskrit Scots Gaelic Sepedi Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Tatar Telugu Thai Tigrinya Tsonga Turkish Turkmen Twi Ukrainian Urdu Uyghur Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Powered by Translate Home Eight Can’t Wait 21st Century Policing Show sub menu Pillar One Pillar Two Pillar Three Pillar Four Pillar Five Pillar Six Resources Show sub menu Actions Taken File a Complaint Policies & Reports Hiring Process Training Community Outreach Mayor’s Priorities Join MPD -3435,https://www.miami-police.org/contact.html,Contact Info & Agency Meta,Info About Agencies,Contact the Miami Police Department - Miami Police Department,"Contact the Miami Police Department, Address: 400 NW 2nd Avenue, Miami, Florida 33128, Phone: (305) 603-6640",200,Miami Police Department,[],[],[],[],[],[],"STATIONS DISTRICT MAPS ALLAPATTAH BRICKELL ROADS COCONUT GROVE CORAL WAY DOWNTOWN EDGEWATER FLAGAMI LITTLE HAITI LITTLE HAVANA MODEL CITY OVERTOWN UPPER EAST SIDE WYNWOOD STATIONS DISTRICT MAPS ALLAPATTAH BRICKELL ROADS COCONUT GROVE CORAL WAY DOWNTOWN EDGEWATER FLAGAMI LITTLE HAITI LITTLE HAVANA MODEL CITY OVERTOWN UPPER EAST SIDE WYNWOOD OFFICE of THE CHIEF ADMINISTRATION FIELD OPERATIONS CRIMINAL INVESTIGATIONS INTERNAL AFFAIRS PROFESSIONAL COMPLIANCE LEGAL INFO ANNUAL REPORTS EMPLOYEE AWARDS OFFICE of THE CHIEF ADMINISTRATION FIELD OPERATIONS CRIMINAL INVESTIGATIONS INTERNAL AFFAIRS PROFESSIONAL COMPLIANCE LEGAL INFO ANNUAL REPORTS EMPLOYEE AWARDS PERSONNEL RESOURCE INFORMATION TECHNOLOGY BUSINESS MANAGEMENT COMMUNICATIONS/SUPPORT SERVICES TRAINING & PERSONNEL DEVELOPMENT PROPERTY & EVIDENCE MANAGEMENT PERSONNEL RESOURCE INFORMATION TECHNOLOGY BUSINESS MANAGEMENT COMMUNICATIONS/SUPPORT SERVICES TRAINING & PERSONNEL DEVELOPMENT PROPERTY & EVIDENCE MANAGEMENT NORTH DISTRICT CENTRAL DISTRICT SOUTH DISTRICT SPECIALIZED OPERATIONS SECTION COMMUNITY RELATIONS NORTH DISTRICT CENTRAL DISTRICT SOUTH DISTRICT SPECIALIZED OPERATIONS SECTION COMMUNITY RELATIONS DO THE RIGHT THING POLICE ATHLETIC LEAGUE DO THE RIGHT THING POLICE ATHLETIC LEAGUE CRIMINAL INVESTIGATIONS INVESTIGATIVE SUPPORT SPECIAL INVESTIGATIONS CRIMINAL INVESTIGATIONS INVESTIGATIVE SUPPORT SPECIAL INVESTIGATIONS INTERNAL AFFAIRS SECTION INTERNAL AFFAIRS SECTION RECORDS RECOVER PROPERTY ALARMS UNIT VICTIMS ADVOCATE FRAUD VICTIMS SPECIAL EVENTS UNIT MAKE A COMPLAINT CRIME DATA REQUESTS REPORT GANG ACTIVITY CRIME MAPPING REQUEST CRIME WATCH COMMEND AN OFFICER RECORDS RECOVER PROPERTY ALARMS UNIT VICTIMS ADVOCATE FRAUD VICTIMS SPECIAL EVENTS UNIT MAKE A COMPLAINT CRIME DATA REQUESTS REPORT GANG ACTIVITY CRIME MAPPING REQUEST CRIME WATCH COMMEND AN OFFICER PUBLIC INFO OFFICE NEWS RELEASES COMMUNITY EVENTS VIDEOS SOCIAL MEDIA PUBLIC INFO OFFICE NEWS RELEASES COMMUNITY EVENTS VIDEOS SOCIAL MEDIA CAREERS CAREERS POLICE COLLEGE WEBSITE MAGNET HIGH SCHOOL TRAINING HISTORY ACCOMPLISHMENTS CONTACT POLICE COLLEGE WEBSITE MAGNET HIGH SCHOOL TRAINING HISTORY ACCOMPLISHMENTS CONTACT MIAMI POLICE SHIELD SEXUAL PREDATORS DOMESTIC VIOLENCE SAFETY TIPS KIDS CORNER MIAMI POLICE SHIELD SEXUAL PREDATORS DOMESTIC VIOLENCE SAFETY TIPS KIDS CORNER Search Dial 911 for EMERGENCIES ONLY Miami Police Non-Emergency: - (305) 579-6111 CrimeStoppers: (305) 471-TIPS (8477) Contact the Miami Police Department By Mail: Miami Police Department 400 NW 2nd Avenue Miami, Florida 33128 Post Office Box 016777, Miami, Florida 33101 By Phone: (305) 603-6640 PROVIDE ANONYMOUS TIPS: Contact Crime Stoppers by phone 305-471-TIPS (8477) Or via Web Click here to submit anonymous details. Copyright © 2024 The City of Miami Police Department. All rights reserved. This information is made available to the public and law enforcement in the interest of public safety. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Search " -3436,https://city.milwaukee.gov/ImageLibrary/Groups/mpdAuthors/SOP/460-USEOFFORCE.pdf,Policies & Contracts,Info About Agencies,"","",403,"","","","","","","","" -3437,https://data.milwaukee.gov/dataset/fpc-citizen-complaints,Complaints & Misconduct,Info About Officers,Citizen Complaints Against Police and Fire Departments - Dataset - City of Milwaukee Open Data Portal,"",200,Welcome - City of Milwaukee Open Data Portal ,"[""Milwaukee Open Data"", ""Citizen Complaints Against Police and Fire Departments"", ""Fire and Police Commission"", ""Citizen Complaints Against Police and Fire Departments""]","[""Organization"", ""Social"", ""License"", ""Data and Resources""]","[""Additional Info""]",[],[],[],"Skip to content Log in Register Contact City of Milwaukee Log in Register Contact City of Milwaukee City of Milwaukee Toggle navigation Milwaukee Open Data City of Milwaukee Open Data Portal Home Datasets Organizations Groups About Help Search Datasets Toggle navigation Milwaukee Open Data City of Milwaukee Open Data Portal Milwaukee Open Data City of Milwaukee Open Data Portal Home Datasets Organizations Groups About Help Search Datasets Search Datasets Home Organizations Fire and Police Commission Citizen Complaints Against Police and Fire Departments Citizen Complaints Against Police and Fire Departments Followers 6 Organization Fire and Police Commission Under Wisconsin law and the Milwaukee City Charter, the Fire and Police Commission oversees all aspects of Fire Department and Police Department operations. The Commission sets... read more Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Citizen Complaints Against Police and Fire Departments Update Frequency: Quarterly The Fire and Police Commission (FPC) is the civilian oversight agency of the Milwaukee Fire and Police Departments and has full authority to investigate and discipline department employees for rule violations. Data-sets contain complaints against the City of Milwaukee Fire and Police Department personnel. Beginning with Q3 2019, the data is inclusive of complaints received by the FPC and MPD. Data and Resources FPC Complaint Data Key PDF Popular Detailed information and definitions related to the data-set. Explore Preview Download Combined Complaints, Q3 2019 through Q4 2022 XLSX Popular Citizen complaints made against the Milwaukee Fire and Police Departments. Explore Preview Download Complaint Tabulation SA.XLSX XLSX Explore Preview Download Combined Complaints - Q3 2019 through Q4 2022.csv CSV Explore Preview Download Allegations Civilian Complaint FPC Fire Incident MFD MPD Police Additional Info Field Value Last Updated May 31, 2023, 10:56 AM (UTC-04:00) Created January 18, 2019, 3:50 PM (UTC-05:00) " -3438,https://www.montgomerycountymd.gov/pol/contact.html,Contact Info & Agency Meta,Info About Agencies,"Contact Us page, Department of Police,Montgomery County, MD","",200," - Montgomery County Maryland -",[],"[""Contact us""]","[""How to Report a Crime or Incident"", ""Police Districts"", ""Frequently Used Numbers""]","[""POLICE CONTACTS"", ""FOR CRIME SOLVERS"", ""DISTRICTS"", ""RESOURCES"", ""FOLLOW US"", ""STAY INFORMED""]",[],[],"Skip to main content County Web Accessibility information including Alternative Format Requests for Disabled Users are provided on this page. An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us Contact us Public Safety Headquarters 100 Edison Park Drive Gaithersburg, MD 20878 How to Report a Crime or Incident Crime in progress or just witnessed an emergency situation: Call 911 Reporting a non-emergency incident in progress: Call 301-279-8000 Submitting an anonymous crime tip: Use Crime Solvers Make the right call: When to call 9-1-1 Send us your Compliments and Complaints MPIA Request : Maryland Public Information Act or Freedom of Information Act requests for the Montgomery County Police Department should be directed to Mary Davison of the Police Records Section. Find out more about the MPIA request process at >> Police Districts 1st District Station / Rockville 1DCommander@montgomerycountymd.gov 240-773-6070 2nd District Station / Bethesda 2DCommander@montgomerycountymd.gov 240-773-6700 3rd District Station / Silver Spring 3DCommander@montgomerycountymd.gov 240-773-6800 4th District Station / Wheaton 4DCommander@montgomerycountymd.gov 240-773-5500 5th District Station / Germantown 5DCommander@montgomerycountymd.gov 240-773-6200 6th District Station / Montgomery Village 6DCommander@montgomerycountymd.gov 240-773-5700 Frequently Used Numbers Office of the Chief 311 or 240-777-0311 (from outside the county) Alcohol Initiatives Unit 240-773-5900 Autism, IDD, and Alzheimer’s Outreach Program 240-773-6525 Automated Traffic Enforcement Unit 240-773-6050 Citizen Academy 240-773-6910 Collision Reconstruction Unit 240-773-6620 Community Engagement Division 240-773-6980 False Alarm Reduction Section 240-773-6300 Financial Crimes Section 240-773-6330 Firearms Investigations Unit 240-773-6400 Fugitive Unit 240-773-5370 Hispanic Community Academy 240-773-6920 Information Management and Technology Division (Records) 240-773-5330 Internal Affairs Division 240-773-6000 Major Crimes Division 240-773-5070 Public Information Office 240-773-5030 Personnel Division 240-773-5310 Police Academy 240-773-6900 Records Section 240-773-5330 Special Victims Investigations Division 240-773-5400 Special Investigations Division 240-773-5959 Special Operations Division 240-773-6500 Traffic Division 240-773-6600 Training and Education Division 240-773-6900 Vehicle Recovery Section 240-773-6411 Victim/Witness Assistance Unit 240-773-5626 Volunteer Resources Section 240-773-5625 Warrant Turn-in Facility 240-773-6990 Montgomery County Police Department Public Safety Headquarters 100 Edison Park Drive · Gaithersburg, MD 20878 Non-emergency: 301-279-8000 POLICE CONTACTS For Emergencies: Call 911 Non-emergency: 301-279-8000 FOR CRIME SOLVERS Anonymous Call: 1-866-411-8477 Submit Crime Tips DISTRICTS 1D Rockville 2D Bethesda 3D Silver Spring 4D Wheaton 5D Germantown 6D Montgomery Village RESOURCES Department Policies MCP Alumni Language Bank FOLLOW US Facebook Twitter YouTube Instagram STAY INFORMED News Releases Performance Stats Community Policing MontgomeryCountyMD.GOV Privacy Policy | User Rights | Accessibility | Social Media Policy | County Code | Language Translations © Copyright 2024. Montgomery County Government. | All Rights Reserved Go Top County Web Accessibility information including Alternative Format Requests for Disabled Users are provided on this page. An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us " -3439,https://opendata.minneapolismn.gov/datasets/police-incidents-2021/explore,Crime Maps & Reports,Agency-Published Resources,Police Incidents 2021,Police Incidents for 2021,200,Open Minneapolis,[],[],[],[],[],[],"" -3440,https://www.montgomerycountymd.gov/pol/data/iad-reports.html,Complaints & Misconduct,Info About Officers,"IAD reports page, MCPD, Montgomery County,MD","",200," - Montgomery County Maryland -",[],"[""Internal Affairs Division Reports""]",[],"[""POLICE CONTACTS"", ""FOR CRIME SOLVERS"", ""DISTRICTS"", ""RESOURCES"", ""FOLLOW US"", ""STAY INFORMED""]",[],[],"Skip to main content County Web Accessibility information including Alternative Format Requests for Disabled Users are provided on this page. An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us Internal Affairs Division Reports 2022 Annual Internal Affairs Division Report 2021 Annual Internal Affairs Division Report 2020 Annual Internal Affairs Division Report 2019 Annual Internal Affairs Division Report 2018 Annual Internal Affairs Division Report 2017 Annual Internal Affairs Division Report Montgomery County Police Department Public Safety Headquarters 100 Edison Park Drive · Gaithersburg, MD 20878 Non-emergency: 301-279-8000 POLICE CONTACTS For Emergencies: Call 911 Non-emergency: 301-279-8000 FOR CRIME SOLVERS Anonymous Call: 1-866-411-8477 Submit Crime Tips DISTRICTS 1D Rockville 2D Bethesda 3D Silver Spring 4D Wheaton 5D Germantown 6D Montgomery Village RESOURCES Department Policies MCP Alumni Language Bank FOLLOW US Facebook Twitter YouTube Instagram STAY INFORMED News Releases Performance Stats Community Policing MontgomeryCountyMD.GOV Privacy Policy | User Rights | Accessibility | Social Media Policy | County Code | Language Translations © Copyright 2024. Montgomery County Government. | All Rights Reserved Go Top County Web Accessibility information including Alternative Format Requests for Disabled Users are provided on this page. An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search Montgomery County Department of Police Search String Search Montgomery County Department of Police Montgomery County Department of Police Search String Search Search String Search Search String Search Search String Search Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us Translate Internal Affairs Division Reports 2022 Annual Internal Affairs Division Report 2021 Annual Internal Affairs Division Report 2020 Annual Internal Affairs Division Report 2019 Annual Internal Affairs Division Report 2018 Annual Internal Affairs Division Report 2017 Annual Internal Affairs Division Report Internal Affairs Division Reports 2022 Annual Internal Affairs Division Report 2021 Annual Internal Affairs Division Report 2020 Annual Internal Affairs Division Report 2019 Annual Internal Affairs Division Report 2018 Annual Internal Affairs Division Report 2017 Annual Internal Affairs Division Report Internal Affairs Division Reports Internal Affairs Division Reports " -3441,https://gis-mdc.opendata.arcgis.com/search?collection=Dataset,List of Data Sources,Info About Agencies,Open Data Hub Site,"Open Data Hub Site from Miami-Dade County, Florida",200,Open Data Hub Site,[],[],[],[],[],[],"" -3442,https://opendata.minneapolismn.gov/datasets/police-officer-involved-shootings/explore ,Officer Involved Shootings,Police & Public Interactions,Police Officer Involved Shootings,Officer Involved Shooting Data for the Minneapolis Police Department,200,Open Minneapolis,[],[],[],[],[],[],"" -3443,https://www.montgomerycountymd.gov/POL/resource/Directives/100.html,Policies & Contracts,Info About Agencies,"Directives -100 - Police Operations, Montgomery County Police, Montgomery County, MD","Police Operations,Neck Restraint, Use of Force",200," - Montgomery County Maryland -","[""100 - Police Operations""]",[],[],"[""POLICE CONTACTS"", ""FOR CRIME SOLVERS"", ""DISTRICTS"", ""RESOURCES"", ""FOLLOW US"", ""STAY INFORMED""]",[],[],"Skip to main content County Web Accessibility information including Alternative Format Requests for Disabled Users are provided on this page. An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us 100 - Police Operations Number Title FC 131 Use of Force FC 133 Electronic Control Weapons FC 135 Vehicular Pursuits FC 140 Miscellaneous Enforcement Policies FC 145 Structured Roll Call Return to Department Policies Montgomery County Police Department Public Safety Headquarters 100 Edison Park Drive · Gaithersburg, MD 20878 Non-emergency: 301-279-8000 POLICE CONTACTS For Emergencies: Call 911 Non-emergency: 301-279-8000 FOR CRIME SOLVERS Anonymous Call: 1-866-411-8477 Submit Crime Tips DISTRICTS 1D Rockville 2D Bethesda 3D Silver Spring 4D Wheaton 5D Germantown 6D Montgomery Village RESOURCES Department Policies MCP Alumni Language Bank FOLLOW US Facebook Twitter YouTube Instagram STAY INFORMED News Releases Performance Stats Community Policing MontgomeryCountyMD.GOV Privacy Policy | User Rights | Accessibility | Social Media Policy | County Code | Language Translations © Copyright 2024. Montgomery County Government. | All Rights Reserved Go Top County Web Accessibility information including Alternative Format Requests for Disabled Users are provided on this page. An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search Montgomery County Department of Police Search String Search Montgomery County Department of Police Montgomery County Department of Police Search String Search Search String Search Search String Search Search String Search Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us Translate 100 - Police Operations Number Title FC 131 Use of Force FC 133 Electronic Control Weapons FC 135 Vehicular Pursuits FC 140 Miscellaneous Enforcement Policies FC 145 Structured Roll Call Return to Department Policies 100 - Police Operations Number Title FC 131 Use of Force FC 133 Electronic Control Weapons FC 135 Vehicular Pursuits FC 140 Miscellaneous Enforcement Policies FC 145 Structured Roll Call Return to Department Policies 100 - Police Operations Number Title FC 131 Use of Force FC 133 Electronic Control Weapons FC 135 Vehicular Pursuits FC 140 Miscellaneous Enforcement Policies FC 145 Structured Roll Call Return to Department Policies Return to Department Policies " -3444,https://data.mesaaz.gov/Police/Police-Computer-Aided-Dispatch-Events/ex94-c5ad,Calls for Service,Police & Public Interactions,Police Dispatch Events 2017-2020 | Mesa Data Hub,"",200,Data Portal | Mesa Data Hub,"[""Police Calls for Service - Suicide and Welfare Check"", ""Police Calls for Service by Month by division and event type"", ""Police - Priority 1 Incident Response Time (2017-2020)"", ""Police Calls for Service (Zip Code) - Suicide and Welfare Check"", ""Police Dispatched (CAD) Events by Month"", ""Drug Incidences Police Dispatch"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Police Dispatch Events 2017-2020"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Police Dispatch Events 2017-2020"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""PM - Police Emergency Calls Response Time …"", ""Police Calls for Service and Response Times by Month …"", ""PM - Police Priority 1 Calls Response Times …"", ""Terms of Use"", ""Data Quality"", ""Dataset Characteristics"", ""Frequency"", ""Public Access"", ""Topics"", ""Licensing and Attribution"", ""PM - Police Emergency Calls Response Time …"", ""Police Calls for Service and Response Times by Month …"", ""PM - Police Priority 1 Calls Response Times …""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Developers Financial Transparency Open Budget Open Expenditures Menu Menu Close Home Browse Developers Financial Transparency Open Budget Open Expenditures Sign In Search Sign In Home Browse Developers Financial Transparency Open Budget Open Expenditures Menu Sign In Home Browse Developers Financial Transparency Open Budget Open Expenditures Menu Sign In Sign In Home Browse Developers Financial Transparency Open Budget Open Expenditures Financial Transparency Open Budget Open Expenditures Financial Transparency Open Budget Open Expenditures Menu Close Home Browse Developers Financial Transparency Open Budget Open Expenditures Sign In Search Home Browse Developers Financial Transparency Open Budget Open Expenditures Sign In Search Home Browse Developers Financial Transparency Open Budget Open Expenditures Financial Transparency Open Budget Open Expenditures Sign In Search Search -3446,https://mesaaz.maps.arcgis.com/apps/dashboards/c38c8c61b10d40fdaaabab2b4f10c984,Use of Force Reports,Police & Public Interactions,ArcGIS Dashboards,ArcGIS Dashboards,200,Error retrieving title: 'NoneType' object has no attribute 'text',[],[],[],[],[],[],"" -3447,https://data.mesaaz.gov/,List of Data Sources,Info About Agencies,Data Portal | Mesa Data Hub,"",200,Data Portal | Mesa Data Hub,"[""Welcome to the City of Mesa Data Portal. A 'Smart City' initiative."", ""Explore Datasets, Charts, Maps and Stories"", ""Featured Stories"", ""Resources""]","[""Menu""]",[],[],[],[],"Skip to main content Skip to footer links Sign In Home Browse Developers Financial Transparency Open Budget Open Expenditures Menu Menu Close Home Browse Developers Financial Transparency Open Budget Open Expenditures Sign In Search Welcome to the City of Mesa Data Portal. A 'Smart City' initiative. City Council Strategic Priorities Financial Transparency Capital Projects Explorer Explore Datasets, Charts, Maps and Stories Permits & Licenses Building permits and licenses Energy & Utilities Water, gas & electric Financials Budgets, revenues, expenditures, vendor payments and sales tax revenues Recreation & Culture Arts, museums, parks and recreation Zoning & Property Vacancy rates, zoning and property Planes, Trains & Automobiles Light rail, bike paths, road construction and transit Neighborhoods Code violations, graffiti and demographics Public Safety Crime and incident City Operations Government related City Council Strategic Priorities Featured Stories Addressing Homelessness City Energy Usage Dashboard Rent & Utilities Assistance (ERAP) American Recovery Plan Act Resources What is Open Data? What does the term ""open data"" mean? Guidance on how you find and request Mesa's data. Using the Data Portal Get started using Mesa's Data Portal. Access to additional resources Suggest a data set Didn’t find what you were looking for? Suggest a dataset. OpenGIS Explore the City's Open GIS Data Site Open Data Network Want access to more data? Check out the national open data network. Open Records Submit a public records request Sign In Home Browse Developers Financial Transparency Open Budget Open Expenditures Menu Menu Close Home Browse Developers Financial Transparency Open Budget Open Expenditures Sign In Search Welcome to the City of Mesa Data Portal. A 'Smart City' initiative. City Council Strategic Priorities Financial Transparency Capital Projects Explorer Explore Datasets, Charts, Maps and Stories Permits & Licenses Building permits and licenses Energy & Utilities Water, gas & electric Financials Budgets, revenues, expenditures, vendor payments and sales tax revenues Recreation & Culture Arts, museums, parks and recreation Zoning & Property Vacancy rates, zoning and property Planes, Trains & Automobiles Light rail, bike paths, road construction and transit Neighborhoods Code violations, graffiti and demographics Public Safety Crime and incident City Operations Government related City Council Strategic Priorities Featured Stories Addressing Homelessness City Energy Usage Dashboard Rent & Utilities Assistance (ERAP) American Recovery Plan Act Resources What is Open Data? What does the term ""open data"" mean? Guidance on how you find and request Mesa's data. Using the Data Portal Get started using Mesa's Data Portal. Access to additional resources Suggest a data set Didn’t find what you were looking for? Suggest a dataset. OpenGIS Explore the City's Open GIS Data Site Open Data Network Want access to more data? Check out the national open data network. Open Records Submit a public records request Sign In Home Browse Developers Financial Transparency Open Budget Open Expenditures Menu Menu Close Home Browse Developers Financial Transparency Open Budget Open Expenditures Sign In Search Sign In Home Browse Developers Financial Transparency Open Budget Open Expenditures Menu Sign In Home Browse Developers Financial Transparency Open Budget Open Expenditures Menu Sign In " -3448,https://www.montgomerycountymd.gov/pol/crime-data.html,Crime Maps & Reports,Agency-Published Resources,"Public Safety Data Page, Montgomery County Police Department , Montgomery County, MD","",200," - Montgomery County Maryland -",[],"[""Public Safety Data""]","[""Annual Reports"", ""Drone as First Responder Program (DFR)"", ""Monthly Hate/Bias Summaries"", ""Weekly Crime Summary Reports"", ""Sex Offender Registry"", ""Extreme Risk Protection Order (ERPO) Information"", ""Other Reports"", ""Crime Incident Map""]","[""POLICE CONTACTS"", ""FOR CRIME SOLVERS"", ""DISTRICTS"", ""RESOURCES"", ""FOLLOW US"", ""STAY INFORMED""]",[],[],"Skip to main content County Web Accessibility information including Alternative Format Requests for Disabled Users are provided on this page. An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us Public Safety Data For the most up-to-date information (data and maps) on crime in the County, visit dataMontgomery Annual Reports Bias Incidents Reports Community Policing Reports Crime and Safety Reports False Alarm Reduction Section Reports Internal Affairs Division Reports Pursuit Reports Speed Camera & Red Light - Revenue & Expenditure Summary Report Use of Force Reports Drone as First Responder Program (DFR) Drone as First Responder Monthly Hate/Bias Summaries Monthly Hate/Bias Summaries Weekly Crime Summary Reports Weekly Crime Summaries Sex Offender Registry (Maryland Department of Public Safety and Correctional Services) Search Sex Offender Registry Extreme Risk Protection Order (ERPO) Information FAQs State Reporting Data Other Reports Effective Law Enforcement For All (ELE4A) Audit Team Member - Gender and Ethnicity Report Cell Tower 222 and 223 Report Unfounded Call Data CY2022 Crime Incident Map The data presented is derived from reported crimes classified according to the National Incident-Based Reporting System (NIBRS) of the Criminal Justice Information Services (CJIS) Division Uniform Crime Reporting (UCR) Program and documented by approved police incident reports. Search for crime in your area by entering your address in the map search box. Or use Filters on the right-hand top corner of the map to filter the data by Police District, Date and Time, Beat Police Response Area ( PRA ), or City. Additional information about the crime map >> Montgomery County Police Department Public Safety Headquarters 100 Edison Park Drive · Gaithersburg, MD 20878 Non-emergency: 301-279-8000 POLICE CONTACTS For Emergencies: Call 911 Non-emergency: 301-279-8000 FOR CRIME SOLVERS Anonymous Call: 1-866-411-8477 Submit Crime Tips DISTRICTS 1D Rockville 2D Bethesda 3D Silver Spring 4D Wheaton 5D Germantown 6D Montgomery Village RESOURCES Department Policies MCP Alumni Language Bank FOLLOW US Facebook Twitter YouTube Instagram STAY INFORMED News Releases Performance Stats Community Policing MontgomeryCountyMD.GOV Privacy Policy | User Rights | Accessibility | Social Media Policy | County Code | Language Translations © Copyright 2024. Montgomery County Government. | All Rights Reserved Go Top County Web Accessibility information including Alternative Format Requests for Disabled Users are provided on this page. An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search Montgomery County Department of Police Search String Search Montgomery County Department of Police " -3449,https://reimagine.memphistn.gov/isb-dashboard/response-to-resistance/,Use of Force Reports,Police & Public Interactions,Response to Resistance - Reimagine Policing in Memphis,"",200,403 Forbidden,"[""Response to Resistance""]","[""Response to Resistance"", ""How Do We Compare to Other Agencies?""]","[""What Does This Report Show?"", ""Response to Resistance (all incidents)"", ""Response to Resistance (fatal shootings)""]",[],[],[],Search Reimagine Policing in Memphis Menu Home Eight Can’t Wait 21st Century Policing Pillar One Pillar Two Pillar Three Pillar Four Pillar Five Pillar Six Resources Actions Taken File a Complaint Policies & Reports Hiring Process Training Community Outreach Mayor’s Priorities Join MPD Menu Search Search Reimagine Policing in Memphis Menu Reimagine Policing in Memphis Reimagine Policing in Memphis Home Eight Can’t Wait 21st Century Policing Pillar One Pillar Two Pillar Three Pillar Four Pillar Five Pillar Six Resources Actions Taken File a Complaint Policies & Reports Hiring Process Training Community Outreach Mayor’s Priorities Join MPD Menu Search Menu Search Menu Search Search for: Close search Search for: Close search Search for: Close search Close Menu Home Eight Can’t Wait 21st Century Policing Show sub menu Pillar One Pillar Two Pillar Three Pillar Four Pillar Five Pillar Six Resources Show sub menu Actions Taken File a Complaint Policies & Reports Hiring Process Training Community Outreach Mayor’s Priorities Join MPD English Arabic Chinese (Simplified) Dutch English Filipino French German Haitian Creole Hebrew Indonesian Italian Japanese Korean Portuguese Russian Spanish Vietnamese Powered by Translate Home Eight Can’t Wait 21st Century Policing Show sub menu Pillar One Pillar Two Pillar Three Pillar Four Pillar Five Pillar Six Resources Show sub menu Actions Taken File a Complaint Policies & Reports Hiring Process Training Community Outreach Mayor’s Priorities Join MPD Close Menu Home Eight Can’t Wait 21st Century Policing Show sub menu Pillar One Pillar Two Pillar Three Pillar Four Pillar Five Pillar Six Resources Show sub menu Actions Taken File a Complaint Policies & Reports Hiring Process Training Community Outreach Mayor’s Priorities Join MPD English Arabic Chinese (Simplified) Dutch English Filipino French German Haitian Creole Hebrew Indonesian Italian Japanese Korean Portuguese Russian Spanish Vietnamese Powered by Translate Home Eight Can’t Wait 21st Century Policing Show sub menu Pillar One Pillar Two Pillar Three Pillar Four Pillar Five Pillar Six Resources Show sub menu Actions Taken File a Complaint Policies & Reports Hiring Process Training Community Outreach Mayor’s Priorities Join MPD Close Menu Home Eight Can’t Wait 21st Century Policing Show sub menu Pillar One Pillar Two Pillar Three Pillar Four Pillar Five Pillar Six Resources Show sub menu Actions Taken File a Complaint Policies & Reports Hiring Process Training Community Outreach Mayor’s Priorities Join MPD English Arabic Chinese (Simplified) Dutch English Filipino French German Haitian Creole Hebrew Indonesian Italian Japanese Korean Portuguese Russian Spanish Vietnamese Powered by Translate Home Eight Can’t Wait 21st Century Policing Show sub menu Pillar One Pillar Two Pillar Three Pillar Four Pillar Five Pillar Six Resources Show sub menu Actions Taken File a Complaint Policies & Reports Hiring Process Training Community Outreach Mayor’s Priorities Join MPD -3450,https://www.miami-police.org/SOPs/MPD%20SOPs%20-%20BookMarks%20-%20Copy/2%20ADM/5%20TRAINING/Training%20and%20Personnel%20Development%20Section.pdf,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3451,https://www.minneapolismn.gov/government/government-data/datasource/office-of-police-conduct-review-dashboard/,Complaints & Misconduct,Info About Officers,Office of Police Conduct Review Data Portal - City of Minneapolis,You can use this dashboard to track police misconduct claims and cases.,200,City of Minneapolis,"[""Office of Police Conduct Review data dashboard"", ""Need help? We're here for you.""]","[""Police conduct review dashboard"", ""How to use the dashboard"", ""Contact us""]","[""Request accessible format"", ""Search the data"", ""Read the Data"", ""Office of Police Conduct Review""]",[],[],[],"" -3452,https://www.mesaazpolice.gov/home/showpublisheddocument/44518/637805421431100000,Officer Involved Shootings,Police & Public Interactions,"","",-1,"","","","","","","","" -3453,https://www.montgomerycountymd.gov/pol/data/weekly-crime-summaries.html,Crime Statistics,Agency-Published Resources,"Weekly Crime Summaries page, Montgomery County Police Department, Montgomery County, MD","",200," - Montgomery County Maryland -",[],"[""Weekly Crime Summaries""]","[""2023-2024 Weekly Crime Summaries"", """"]","[""January"", ""February"", ""March"", ""April"", ""May"", ""June"", ""July"", ""August"", ""September"", ""October"", ""November"", ""December"", ""POLICE CONTACTS"", ""FOR CRIME SOLVERS"", ""DISTRICTS"", ""RESOURCES"", ""FOLLOW US"", ""STAY INFORMED""]",[],[],"Skip to main content County Web Accessibility information including Alternative Format Requests for Disabled Users are provided on this page. An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us Weekly Crime Summaries A weekly crime summary is provided by the Police Department to serve as an overview of incidents reported in the county. Please note that a summary does not reflect every reported incident in the county. For the most up-to-date information on crime in the County, visit Data Montgomery. Note: For archived weekly summaries please contact the Public Information Office by email at: MCPD_PIO@montgomerycountymd.gov 2023-2024 Weekly Crime Summaries January Crime Summary - 12/31/23 to 01/06/24 Crime Summary - 01/07/24 to 01/13/24 Crime Summary - 01/14/24 to 01/20/24 Crime Summary - 01/21/24 to 01/27/24 Crime Summary - 01/28/24 to 02/03/24 February Crime Summary - 02/04/24 to 02/10/24 Crime Summary - 02/11/24 to 02/17/24 Crime Summary - 02/18/24 to 02/24/24 Crime Summary - 02/25/24 to 03/02/24 March Crime Summary - 03/03/24 to 03/09/24 Crime Summary - 03/10/24 to 03/16/24 April May June July August September October November December Montgomery County Police Department Public Safety Headquarters 100 Edison Park Drive · Gaithersburg, MD 20878 Non-emergency: 301-279-8000 POLICE CONTACTS For Emergencies: Call 911 Non-emergency: 301-279-8000 FOR CRIME SOLVERS Anonymous Call: 1-866-411-8477 Submit Crime Tips DISTRICTS 1D Rockville 2D Bethesda 3D Silver Spring 4D Wheaton 5D Germantown 6D Montgomery Village RESOURCES Department Policies MCP Alumni Language Bank FOLLOW US Facebook Twitter YouTube Instagram STAY INFORMED News Releases Performance Stats Community Policing MontgomeryCountyMD.GOV Privacy Policy | User Rights | Accessibility | Social Media Policy | County Code | Language Translations © Copyright 2024. Montgomery County Government. | All Rights Reserved Go Top County Web Accessibility information including Alternative Format Requests for Disabled Users are provided on this page. An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search Montgomery County Department of Police Search String Search Montgomery County Department of Police Montgomery County Department of Police Search String Search Search String Search Search String Search Search String Search Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us Translate " -3454,https://city.milwaukee.gov/Directory/police/Crime-Maps-and-Statistics.htm#.Xt6WOzpKhPY,Crime Maps & Reports,Agency-Published Resources,"","",403,"","","","","","","","" -3455,https://www.miamigov.com/My-Government/Departments/Civilian-Investigative-Panel-CIP,Complaints & Misconduct,Info About Officers,Civilian Investigative Panel (CIP) - Miami,The Civilian Investigative Panel (CIP) provides for independent and impartial citizens’ oversight of the Miami Police Department.,200,Home - Miami,"[""Civilian Investigative Panel (CIP)"", ""Top Services"", ""Process""]","[""File a Complaint Against a Miami Police Officer"", ""Join the Community-Police Mediation Program"", ""Department Head"", ""What We Do"", ""Staff"", ""Panel Members"", ""Investigations"", ""Community-Police Mediation Program"", ""Reports and Data"", ""Contact Us"", ""Meetings & Agendas"", ""Filing a Complaint"", ""Apply to be a Member""]","[""Rodney Jacobs"", ""Filing a Complaint"", ""Phone"", ""Email"", ""Location"", ""Contact Us"", ""Share & Connect"", ""Visit Other Miami Sites"", ""Digital Cities""]",[],[],[],opens in new tab or window -3456,https://opendata.minneapolismn.gov/,List of Data Sources,Info About Agencies,Open Minneapolis,Open Minneapolis,200,Open Minneapolis,[],[],[],[],[],[],"" -3457,https://www.minneapolismn.gov/government/departments/police/#contacts-88640,Contact Info & Agency Meta,Info About Agencies,Police - City of Minneapolis,We in the Minneapolis Police Department gain our authority from the community. We recognize that public safety is not just the absence of crime but the presence of justice.,200,City of Minneapolis,"[""Police Department"", ""Need help? We're here for you.""]","[""A snow emergency is not currently in effect. Normal parking rules apply."", ""Join the Minneapolis Police Department"", ""I want to"", ""Explore this section"", ""Staff and volunteers"", ""Bureaus"", ""Related programs and initiatives"", ""Stay Informed"", ""Related links"", ""Access to police services"", ""Report an issue"", ""Contact us""]","[""Read and give feedback on police policies"", ""File an online police report"", ""Apply for a police job"", ""Minneapolis police precincts"", ""Police auctions"", ""Reclaim property"", ""Gun permits"", ""Policy and Procedure Manual"", ""Oath of Office"", ""Police chief and administration"", ""Crime prevention specialists"", ""Chaplains"", ""Police Reserve"", ""Investigations"", ""Patrol"", ""Professional Standards"", ""National Night Out"", ""Police Explorers"", ""U and T visa"", ""Women's Leadership Academy"", ""View data and reports"", ""File online"", ""View resources"", ""Minneapolis Police Department"", ""Connect with the Minneapolis Police Department""]",[],[],[],"" -3458,https://memphispolice.org/MPD-Policy-and-Procedures-Manual-Revised-1-2020.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3459,https://data.memphistn.gov/,List of Data Sources,Info About Agencies,Memphis Data Hub,"",200,Memphis Data Hub,"[""""]","[""Menu"", ""Your City At Work"", ""Featured Data Stories"", ""Additional Resources""]",[],[],[],[],Skip to main content Skip to footer links Sign In COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Menu Menu Close COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Sign In Search Your City At Work Public Safety Open 311 Civic Assets Capital Projects HCD Investment Featured Data Stories Previous Slide EMS: Proactive Care Response Street Maintenance See All Data Stories Civic Data Hackathon Eliminating Overdue Fines 911 Answer Time Fire Hydrant Maintenance Improving Solid Waste Animal Save Rate EMS: Proactive Care Response Street Maintenance See All Data Stories Civic Data Hackathon Eliminating Overdue Fines 911 Answer Time Fire Hydrant Maintenance Improving Solid Waste Animal Save Rate EMS: Proactive Care Response Street Maintenance See All Data Stories Next Slide go to slide 1 go to slide 2 go to slide 3 Additional Resources Performance Dashboard Data Catalog Contact Us Sign In COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Menu Menu Close COVID-19 Updates Home About User Guide Resources Memphis Data Hub Guide Additional Data Sources Suggest a Dataset Request a Workshop Contact Us Submit a FOIA Request Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Open Data Apps Performance Public Safety Open 311 Civic Assets Capital Improvement Projects Data Catalog Sign In Search Your City At Work Public Safety Open 311 Civic Assets Capital Projects HCD Investment Featured Data Stories Previous Slide EMS: Proactive Care Response Street Maintenance See All Data Stories Civic Data Hackathon Eliminating Overdue Fines 911 Answer Time Fire Hydrant Maintenance Improving Solid Waste Animal Save Rate EMS: Proactive Care Response Street Maintenance See All Data Stories Civic Data Hackathon Eliminating Overdue Fines 911 Answer Time Fire Hydrant Maintenance Improving Solid Waste Animal Save Rate EMS: Proactive Care Response Street Maintenance See All Data Stories Next Slide go to slide 1 go to slide 2 go to slide 3 Additional Resources Performance Dashboard Data Catalog Contact Us -3460,https://city.milwaukee.gov/police/About-MPD/Code-of-Conduct,Policies & Contracts,Info About Agencies,"","",403,"","","","","","","","" -3461,https://public.powerdms.com/MESAPD/tree/documents/2234408,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by Powered by Powered by Powered by -3463,https://www.memphistn.gov/government/police-department/,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -3465,https://reimagine.memphistn.gov/wp-content/uploads/sites/70/2020/06/Memphis-Police-Department-Policy-and-Procedure-2020.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3466,https://www2.minneapolismn.gov/government/departments/civil-rights/opcr/case-information/,Complaints & Misconduct,Info About Officers,"","",404,"","","","","","","","" -3467,https://joinmpd.com/the-police-academy/,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3468,https://data.milwaukee.gov/dataset/callcenterdatacurrent/resource/bf2b508a-5bfa-49da-8846-d87ffeee020a,Calls for Service,Police & Public Interactions,Call Center Data (Current) - CSV - City of Milwaukee Open Data Portal,"",200,Welcome - City of Milwaukee Open Data Portal ,"[""Milwaukee Open Data"", ""CSV""]","[""Resources"", ""Social"", ""Data Dictionary"", ""Additional Information""]","[""Dataset description:"", ""Embed resource view""]",[],[],[],"Skip to content Log in Register Contact City of Milwaukee Log in Register Contact City of Milwaukee City of Milwaukee Toggle navigation Milwaukee Open Data City of Milwaukee Open Data Portal Home Datasets Organizations Groups About Help Search Datasets Toggle navigation Milwaukee Open Data City of Milwaukee Open Data Portal Milwaukee Open Data City of Milwaukee Open Data Portal Home Datasets Organizations Groups About Help Search Datasets Search Datasets Home Organizations Information Technology and... Call Center Data (Current) CSV Download CSV TSV JSON XML Data API CSV URL: https://data.milwaukee.gov/dataset/a418ffb4-ce90-4a11-a489-d256a3e68a8b/resource/bf2b508a-5bfa-49da-8846-d87ffeee020a/download/callcenterdatacurrent.csv Dataset description: Update Frequency: Daily -For up to date information on service requests please visit, https://city.milwaukee.gov/ucc . -A log of the Unified Call Center's service requests. -From potholes,... Source: Call Center Data (Current) Data Table Fullscreen Embed Add Filter This resource view is not available at the moment. Click here for more information. Download resource Your browser does not support iframes. Resources CSV JSON XML Social Twitter Facebook Linkedin Data Dictionary Column Type Label Description CREATIONDATE text OBJECTDESC text TITLE text CLOSEDDATETIME text CASECLOSUREREASONDESCRIPTION text Additional Information Field Value Data last updated March 25, 2024 Metadata last updated March 25, 2024 Created September 18, 2018 Format CSV License Creative Commons Attribution Created 6 years ago Media type text/csv Size 63,536,529 Ckan url https://data.milwaukee.gov Datastore active True Datastore contains all records of source file True Has views True Hash 3270ea2e4f8c6240601dd2baa515d9f8 Id bf2b508a-5bfa-49da-8846-d87ffeee020a On same domain True Original url https://data.milwaukee.gov/dataset/a418ffb4-ce90-4a11-a489-d256a3e68a8b/resource/bf2b508a-5bfa-49da-8846-d87ffeee020a/download/callcenterdatacurrent.csv Package id a418ffb4-ce90-4a11-a489-d256a3e68a8b Resource id bf2b508a-5bfa-49da-8846-d87ffeee020a State active Task created 2024-03-25 08:50:18.493124 Url type upload Show more Hide Home Organizations Information Technology and... Call Center Data (Current) CSV Download CSV TSV JSON XML Data API CSV URL: https://data.milwaukee.gov/dataset/a418ffb4-ce90-4a11-a489-d256a3e68a8b/resource/bf2b508a-5bfa-49da-8846-d87ffeee020a/download/callcenterdatacurrent.csv Dataset description: Update Frequency: Daily -For up to date information on service requests please visit, https://city.milwaukee.gov/ucc . -A log of the Unified Call Center's service requests. -From potholes,... Source: Call Center Data (Current) Data Table Fullscreen Embed Add Filter This resource view is not available at the moment. Click here for more information. Download resource Your browser does not support iframes. Resources CSV JSON XML Social Twitter Facebook Linkedin Data Dictionary Column Type Label Description CREATIONDATE text OBJECTDESC text TITLE text CLOSEDDATETIME text CASECLOSUREREASONDESCRIPTION text Additional Information Field Value Data last updated March 25, 2024 Metadata last updated March 25, 2024 Created September 18, 2018 Format CSV License Creative Commons Attribution Created 6 years ago Media type text/csv Size 63,536,529 Ckan url https://data.milwaukee.gov Datastore active True Datastore contains all records of source file True Has views True Hash 3270ea2e4f8c6240601dd2baa515d9f8 Id bf2b508a-5bfa-49da-8846-d87ffeee020a On same domain True Original url https://data.milwaukee.gov/dataset/a418ffb4-ce90-4a11-a489-d256a3e68a8b/resource/bf2b508a-5bfa-49da-8846-d87ffeee020a/download/callcenterdatacurrent.csv Package id a418ffb4-ce90-4a11-a489-d256a3e68a8b Resource id bf2b508a-5bfa-49da-8846-d87ffeee020a State active Task created 2024-03-25 08:50:18.493124 Url type upload Show more Hide Home Organizations Information Technology and... Call Center Data (Current) CSV " -3469,https://opendata.minneapolismn.gov/datasets/police-use-of-force/explore ,Use of Force Reports,Police & Public Interactions,Police Use of Force,Police Use of Force Stats,200,Open Minneapolis,[],[],[],[],[],[],"" -3470,https://city.milwaukee.gov/police/Contact-MPD,Contact Info & Agency Meta,Info About Agencies,"","",403,"","","","","","","","" -3471,https://www.nashville.gov/departments/police/data-dashboard/ucr-incidents-map,Crime Maps & Reports,Agency-Published Resources,Police Data Dashboard: Uniform Crime Reporting Incidents Map | Nashville.gov,Official website of the Metropolitan Government of Nashville and Davidson County.,200,Attention Required! | Cloudflare,"[""Police Data Dashboard: Uniform Crime Reporting Incidents Map""]","[""Breadcrumb"", ""Related Tags"", ""Mobile Apps"", ""Nashville.gov"", ""Quick Links"", ""Contact"", ""Connect""]","[""Search Metropolitan Nashville Police Department""]",[],[],[],Close Search Metropolitan Nashville Police Department Close Search Metropolitan Nashville Police Department Close Search Metropolitan Nashville Police Department -3472,https://data.nashville.gov/Police/Metro-Nashville-Police-Department-Incidents/2u6v-ujjs,Crime Statistics,Agency-Published Resources,Metro Nashville Police Department Incidents | Nashville Open Data Portal,"",200,Nashville | Open Data | Nashville Open Data Portal,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Metro Nashville Police Department Incidents"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Metro Nashville Police Department Incidents"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Attachments"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Menu Menu Close Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Search Search Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Menu Search Search Search Search Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Menu Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Menu Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Sign In Menu Close Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Search Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Search Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Search Search -3473,https://city.milwaukee.gov/ImageLibrary/Groups/mpdAuthors/SOP/270-FIELDTRAININGANDEVALUATIONPROGRAM.pdf,Policies & Contracts,Info About Agencies,"","",403,"","","","","","","","" -3474,https://data.montgomerycountymd.gov/Public-Safety/Daily-Arrests/xhwt-7h2h,Arrest Records,Police & Public Interactions,Daily Arrests | Open Data Portal,"",200,Montgomery County Data | Open Data Portal,"[""Daily Arrests - API"", ""Marijuana Arrests Count by City"", ""Test for API Download"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Daily Arrests"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Daily Arrests"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Dataset Information"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content data.Montgomerycountymd.gov Search Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu Menu Close Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Search data.Montgomerycountymd.gov Search Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu data.Montgomerycountymd.gov Search data.Montgomerycountymd.gov Search Search Search Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Open Budget Operating Budget Publication CIP Budget Publication Open Budget Operating Budget Publication CIP Budget Publication Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Sign In -3475,https://public.powerdms.com/MESAPD/tree/documents/266424,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by Powered by Powered by Powered by -3476,https://www.montgomerycountymd.gov/pol/data/use-of-force-report.html,Use of Force Reports,Police & Public Interactions,"Use of force report page, MCPD, Montgomery County, MD","",200," - Montgomery County Maryland -",[],"[""Use of Force Reports""]",[],"[""POLICE CONTACTS"", ""FOR CRIME SOLVERS"", ""DISTRICTS"", ""RESOURCES"", ""FOLLOW US"", ""STAY INFORMED""]",[],[],"Skip to main content County Web Accessibility information including Alternative Format Requests for Disabled Users are provided on this page. An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us Use of Force Reports 2022 Annual Use of Force Report ​ 2021 Annual Use of Force Report 2020 Annual Use of Force Report 2019 Annual Use of Force Report 2018 Annual Use of Force Report 2017 Annual Use of Force Report 2016 Annual Use of Force Report 2015 Annual Use of Force Report 2014 Annual Use of Force Report Montgomery County Police Department Public Safety Headquarters 100 Edison Park Drive · Gaithersburg, MD 20878 Non-emergency: 301-279-8000 POLICE CONTACTS For Emergencies: Call 911 Non-emergency: 301-279-8000 FOR CRIME SOLVERS Anonymous Call: 1-866-411-8477 Submit Crime Tips DISTRICTS 1D Rockville 2D Bethesda 3D Silver Spring 4D Wheaton 5D Germantown 6D Montgomery Village RESOURCES Department Policies MCP Alumni Language Bank FOLLOW US Facebook Twitter YouTube Instagram STAY INFORMED News Releases Performance Stats Community Policing MontgomeryCountyMD.GOV Privacy Policy | User Rights | Accessibility | Social Media Policy | County Code | Language Translations © Copyright 2024. Montgomery County Government. | All Rights Reserved Go Top County Web Accessibility information including Alternative Format Requests for Disabled Users are provided on this page. An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search Montgomery County Department of Police Search String Search Montgomery County Department of Police Montgomery County Department of Police Search String Search Search String Search Search String Search Search String Search Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us Translate Use of Force Reports 2022 Annual Use of Force Report ​ 2021 Annual Use of Force Report 2020 Annual Use of Force Report 2019 Annual Use of Force Report 2018 Annual Use of Force Report 2017 Annual Use of Force Report 2016 Annual Use of Force Report 2015 Annual Use of Force Report 2014 Annual Use of Force Report " -3477,https://www.nashville.gov/departments/police,Contact Info & Agency Meta,Info About Agencies,Metropolitan Nashville Police Department | Nashville.gov,Official website of the Metropolitan Government of Nashville and Davidson County.,200,Attention Required! | Cloudflare,"[""Metropolitan Nashville Police Department""]","[""Breadcrumb"", ""Services"", ""Contact"", ""Featured News"", ""Police Events"", ""Highlighted Information"", ""Police Precinct Lookup"", ""Quick Links"", ""I Want To..."", ""Report Information to Police"", ""Mobile Apps"", ""Nashville.gov"", ""Quick Links"", ""Contact"", ""Connect""]","[""Search Metropolitan Nashville Police Department"", ""We're Hiring!"", ""Helpful Information"", ""Domestic Violence Division"", ""In Memoriam"", ""Enter your address"", ""Results""]",[],[],[],Close Search Metropolitan Nashville Police Department Close Search Metropolitan Nashville Police Department Close Search Metropolitan Nashville Police Department -3478,https://www.miami-police.org/DeptOrders/MPD_Departmental_Orders.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3479,https://www1.nyc.gov/site/nypd/bureaus/administrative/training.page,Policies & Contracts,Info About Agencies,Training - NYPD,"",200,Welcome to NYC.gov | City of New York,"[""Training""]","[""New York's Finest"", ""NYPD Police Academy"", ""Other Training Sections"", """"]",[],[],[],[],"New York City Police Department 311 Search all NYC.gov websites Menu New York's Finest Text-Size Translate This Page Search New York's Finest Home About Bureaus Services Stats Media Careers Policies Language English Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Hausa Haitian Creole Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scots Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Apply Translation Search Search Patrol Transit, Housing & Transportation Investigative Administrative Select Collaborative Policing Community Affairs Employee Relations Equity and Inclusion Information Technology Legal Personnel Public Information Risk Management Strategic Initiatives Support Services Training Trials Collaborative Policing Community Affairs Employee Relations Equity and Inclusion Information Technology Legal Personnel Public Information Risk Management Strategic Initiatives Support Services Training Trials Share Print Training Chief of Training : Olufunmilola Obe Follow @NYPDTraining The NYPD Training Bureau provides recruits, uniformed officers, and civilians with the most up-to-date academic, tactical, and technological information available, transforming them into the best trained, most prepared law enforcement professionals in the nation. From counterterrorism training to training on working with the city's diverse communities, to career development for civilian executives and management-level employees, the bureau provides the highest level of instruction to all members of the service and supports their ability to protect the life, property, and dignity of all New Yorkers, workers, and visitors. The Training Bureau oversees department training and educational programs, mainly through the NYPD Police Academy, located on the 32-acre Queens campus. NYPD Police Academy The Police Academy educates, prepares, and inspires recruits, in-service uniformed members, and civilians, molding top law enforcement professionals. It is an accredited public safety training academy through the Commission on Accreditation for Law Enforcement Agencies, Inc. (CALEA) Other Training Sections The Training Bureau's training section includes: Recruit Training Section Specialized Training Section Firearms and Tactics Section Leadership Training Section School Safety Training Unit Traffic Enforcement Training Unit Police Cadet Corps Directory of City Agencies Contact NYC Government City Employees Notify NYC CityStore Stay Connected NYC Mobile Apps Maps Resident Toolkit NYC Search Search City of New York. 2024 All Rights Reserved, NYC is a trademark and service mark of the City of New York Privacy Policy. Terms of Use. " -3480,https://nola.gov/getattachment/NOPD/Policies/Chapter-12-1-Department-Operations-Manual-EFFECTIVE-1-14-18.pdf/,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3481,https://www.oaklandca.gov/departments/police#page-contact ,Contact Info & Agency Meta,Info About Agencies,City of Oakland | Police,"The official website of the City of Oakland. Find out about meetings, request City services through OAK 311, or contact the Mayor and City Council.",200,Error retrieving title: dictionary changed size during iteration,"[""Police""]","[""News"", ""Services"", ""Resources"", ""Topics"", ""Leadership"", ""Darren Allison"", ""Contact Us""]","[""Search oaklandca.gov"", ""Popular on oaklandca.gov"", ""Five Arrested in Connection to a Crime Spree"", ""OPD’s Violence Suppression Deemed Fruitful"", ""Public Safety Advisory: OPD Responds to Uptick in Robberies"", ""Address"", ""Phone Numbers""]",[],"[""Your Government"", ""How can we help?"", ""Sign up for updates""]",[],"Official Website for the City of Oakland | Mayor Sheng Thao English Español 中文 Tiếng Việt | Translate اَلْعَرَبِيَّةُ Hmoob Cebuano 日本語 ភាសាខ្មែរ 中文 汉语 한국어 English монгол Filipino Español Tiếng Việt Official Website for the City of Oakland | Mayor Sheng Thao English Español 中文 Tiếng Việt | Translate اَلْعَرَبِيَّةُ Hmoob Cebuano 日本語 ភាសាខ្មែរ 中文 汉语 한국어 English монгол Filipino Español Tiếng Việt Home Services Services Find City Services See All Services Animals Activities & Recreation Building Business City Government Employment & Training Housing Parking, Streets & Sidewalks Public Safety & Emergency Services Social Services Apply for a Permit Report a Problem Departments Departments Frequently Visited Departments See All Departments Animal Services Economic & Workforce Development Fire Housing & Community Development Human Services Public Library Parks, Recreation & Youth Development Planning & Building Police Public Works Transportation (OakDOT) Violence Prevention My Government My Government About Your Government Departments Mayor's Office City Council Boards & Commissions City Jobs Contracting Opportunities Public Meetings Community Events Newsroom Oakland Municipal Code search icon Created with Sketch. Search oaklandca.gov Search? search icon Created with Sketch. Popular on oaklandca.gov Report a Problem Online with Oak311 Apply for a Permit Apply for City Jobs Parking Services Adopt a Pet Apply for or Renew Business Tax Mobile Menu Services Animals Activities & Recreation Building Business City Government Employment & Training Housing Parking, Streets & Sidewalks Public Safety & Emergency Services Social Services Apply for a Permit Report a Problem See All Services Departments My Government Departments Mayor's Office City Council Boards & Commissions City Jobs Contracting Opportunities Public Meetings Community Events Newsroom Oakland Municipal Code Home Services Services Find City Services See All Services Animals Activities & Recreation Building Business City Government Employment & Training Housing Parking, Streets & Sidewalks Public Safety & Emergency Services Social Services Apply for a Permit Report a Problem Departments Departments Frequently Visited Departments See All Departments Animal Services Economic & Workforce Development Fire Housing & Community Development Human Services Public Library Parks, Recreation & Youth Development Planning & Building Police Public Works Transportation (OakDOT) Violence Prevention My Government My Government About Your Government Departments Mayor's Office City Council Boards & Commissions City Jobs Contracting Opportunities Public Meetings Community Events Newsroom Oakland Municipal Code search icon Created with Sketch. Search oaklandca.gov Search? search icon Created with Sketch. Popular on oaklandca.gov Report a Problem Online with Oak311 Apply for a Permit Apply for City Jobs Parking Services Adopt a Pet Apply for or Renew Business Tax Mobile Menu Services Animals Activities & Recreation Building Business City Government Employment & Training Housing Parking, Streets & Sidewalks Public Safety & Emergency Services Social Services Apply for a Permit Report a Problem See All Services Departments My Government Departments Mayor's Office City Council Boards & Commissions City Jobs Contracting Opportunities Public Meetings Community Events Newsroom Oakland Municipal Code " -3482,https://www1.nyc.gov/site/nypd/stats/reports-analysis/firearms-discharge.page,Officer Involved Shootings,Police & Public Interactions,Use of Force/Firearms Discharge Data Tables - NYPD,Annual Use of Force/Firearms Discharge Report Data Tables,200,Welcome to NYC.gov | City of New York,"[""Annual Use of Force/Firearms Discharge Report Data Tables""]","[""New York's Finest"", ""Annual Report Data Tables"", ""Excessive Use of Force Report"", """"]","[""2023"", ""2021"", ""2020"", ""2019"", ""2018"", ""2017"", ""2016"", ""2015"", ""2011-2014""]",[],[],[],"" -3483,https://www.newarkpdmonitor.com/wp-content/uploads/2019/04/Use-of-Force-Policy.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3484,https://npd.newarkpublicsafety.org/statistics/transparency,Use of Force Reports,Police & Public Interactions,"","",404,"","","","","","","","" -3485,https://data.nola.gov/Public-Safety-and-Preparedness/NOPD-Misconduct-Complaints/gz2m-ef5u,Complaints & Misconduct,Info About Officers,NOPD Misconduct Complaints | Data.NOLA.gov,"",200,Error retrieving title: dictionary changed size during iteration,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""NOPD Misconduct Complaints"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""NOPD Misconduct Complaints"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -3486,http://gisapps1.mapoakland.com/callsforservice/,Calls for Service,Police & Public Interactions,OPD Calls for Service,"",200,Microsoft Internet Information Services 8,[],[],"[""Filter by Police Beat"", ""DISCLAIMER"", ""About OPD Calls for Service""]",[],[],[],"OPD Closed Calls for Service in the last 24 hrs OPD Closed Calls for Service in the last 24 hrs Find OPD Calls for Service Counts Find OPD Calls for Service Counts Filter by Police Beat Select Police Beat All 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 If you are not sure about your police beat, you can Find Your Police Beat. Total Number of Calls: 1757 Number of Closed Calls: 1564 Number of Active Calls: 63 Number of Pending Calls: 124 Find OPD Calls for Service Counts Filter by Police Beat Select Police Beat All 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 If you are not sure about your police beat, you can Find Your Police Beat. Total Number of Calls: 1757 Number of Closed Calls: 1564 Number of Active Calls: 63 Number of Pending Calls: 124 Filter by Police Beat Select Police Beat All 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 If you are not sure about your police beat, you can Find Your Police Beat. Total Number of Calls: 1757 Number of Closed Calls: 1564 Number of Active Calls: 63 Number of Pending Calls: 124 " -3487,https://www.nola.gov/nopd/contact-us/,Contact Info & Agency Meta,Info About Agencies,NOPD - Contact Us - City of New Orleans,"",200," - Home - City of New Orleans -","[""Contact Us""]","[""General Inquiries"", ""Contact NOPD Districts"", ""Contact NOPD Specialized Units"", ""Call NOLA 311 for Quality of Life concerns"", ""Monthly District Meetings"", ""Where Y'At""]","[""Services & Information"", ""Departments"", ""Government"", ""NOLA 311"", ""News"", ""Event Calendar"", ""Data, Maps & Apps"", ""Translate""]","[""Code Enforcement & Blight"", ""Doing Business with the City"", ""Jobs"", ""Ordinances & Regulations"", ""Parking"", ""Permits & Licenses"", ""Public Records"", ""Public Safety"", ""Report a Problem"", ""Requests to the Mayor and Office"", ""Streets, Catch Basins, Streetlights, & Sidewalks"", ""Taxes"", ""Tickets and Violations"", ""Traffic & Transportation"", ""Trash & Recycling"", ""City Offices"", ""Parish Offices"", ""Boards and Commissions"", ""Request service and information"", ""Suspect Wanted For Home Invasion"", ""Suspects Wanted For Carjacking"", ""NOPD Investigating Homicide in Fifth District"", ""Suspect Wanted For Hotel Thefts"", ""NOFD Recruit Class R-03-23 Graduation"", ""MAYOR CANTRELL ISSUES STATEMENT ON LAND SWAP FOR NEW CITY HALL AND CIVIL DISTRICT COURT"", ""City of New Orleans Reminds Residents of New Area 1 and Area 4 Trash and Recycling Collection Contracts to Begin April 1"", ""Suspect Wanted For Domestic Violence"", ""Suspects Wanted For Theft"", ""Open Data"", ""Dashboards"", ""Maps & GIS"", ""Websites & Apps""]","[""Search and Find Permits"", ""Brake & Bike Tags"", ""Contractor Info For Residents"", ""Permits & Licenses"", ""Permitting Help & Support""]",[],! 2024 Tax Bills are now available! View your tax bill ! 2024 Tax Bills are now available! View your tax bill ! 2024 Tax Bills are now available! View your tax bill ! 2024 Tax Bills are now available! View your tax bill ! 2024 Tax Bills are now available! View your tax bill ! 2024 Tax Bills are now available! View your tax bill -3488,https://www.oaklandca.gov/topics/use-of-force-definitions-and-policies ,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3489,https://data.nola.gov/Public-Safety-and-Preparedness/Stop-and-Search-Field-Interviews-/kitu-f4uy,Stops,Police & Public Interactions,Stop and Search (Field Interviews) | Data.NOLA.gov,"",200," - Home - DataDriven - City of New Orleans -","[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Stop and Search (Field Interviews)"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Stop and Search (Field Interviews)"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -3490,https://www.oaklandca.gov/departments/community-police-review-agency,Complaints & Misconduct,Info About Officers,City of Oakland | Community Police Review Agency,"The official website of the City of Oakland. Find out about meetings, request City services through OAK 311, or contact the Mayor and City Council.",200,City of Oakland | Homepage,"[""Community Police Review Agency""]","[""File a Complaint"", ""CPRA Data"", ""News"", ""Documents"", ""Leadership"", ""Mac Muir"", ""Contact Us""]","[""Search oaklandca.gov"", ""Popular on oaklandca.gov"", ""CPRA Hires Roger Smith"", ""New App Allows Oakland Community to File Complaints Against Oakland Police"", ""Oakland Residents Encouraged to Apply for Police Commission"", ""Address"", ""Phone Numbers"", ""Email Address"", ""Open Hours""]","[""Hours of Operation""]","[""Your Government"", ""How can we help?"", ""Sign up for updates""]",[],"Official Website for the City of Oakland | Mayor Sheng Thao English Español 中文 Tiếng Việt | Translate اَلْعَرَبِيَّةُ Hmoob Cebuano 日本語 ភាសាខ្មែរ 中文 汉语 한국어 English монгол Filipino Español Tiếng Việt Official Website for the City of Oakland | Mayor Sheng Thao English Español 中文 Tiếng Việt | Translate اَلْعَرَبِيَّةُ Hmoob Cebuano 日本語 ភាសាខ្មែរ 中文 汉语 한국어 English монгол Filipino Español Tiếng Việt Home Services Services Find City Services See All Services Animals Activities & Recreation Building Business City Government Employment & Training Housing Parking, Streets & Sidewalks Public Safety & Emergency Services Social Services Apply for a Permit Report a Problem Departments Departments Frequently Visited Departments See All Departments Animal Services Economic & Workforce Development Fire Housing & Community Development Human Services Public Library Parks, Recreation & Youth Development Planning & Building Police Public Works Transportation (OakDOT) Violence Prevention My Government My Government About Your Government Departments Mayor's Office City Council Boards & Commissions City Jobs Contracting Opportunities Public Meetings Community Events Newsroom Oakland Municipal Code search icon Created with Sketch. Search oaklandca.gov Search? search icon Created with Sketch. Popular on oaklandca.gov Report a Problem Online with Oak311 Apply for a Permit Apply for City Jobs Parking Services Adopt a Pet Apply for or Renew Business Tax Mobile Menu Services Animals Activities & Recreation Building Business City Government Employment & Training Housing Parking, Streets & Sidewalks Public Safety & Emergency Services Social Services Apply for a Permit Report a Problem See All Services Departments My Government Departments Mayor's Office City Council Boards & Commissions City Jobs Contracting Opportunities Public Meetings Community Events Newsroom Oakland Municipal Code Home Services Services Find City Services See All Services Animals Activities & Recreation Building Business City Government Employment & Training Housing Parking, Streets & Sidewalks Public Safety & Emergency Services Social Services Apply for a Permit Report a Problem Departments Departments Frequently Visited Departments See All Departments Animal Services Economic & Workforce Development Fire Housing & Community Development Human Services Public Library Parks, Recreation & Youth Development Planning & Building Police Public Works Transportation (OakDOT) Violence Prevention My Government My Government About Your Government Departments Mayor's Office City Council Boards & Commissions City Jobs Contracting Opportunities Public Meetings Community Events Newsroom Oakland Municipal Code search icon Created with Sketch. Search oaklandca.gov Search? search icon Created with Sketch. Popular on oaklandca.gov Report a Problem Online with Oak311 Apply for a Permit Apply for City Jobs Parking Services Adopt a Pet Apply for or Renew Business Tax Mobile Menu Services Animals Activities & Recreation Building Business City Government Employment & Training Housing Parking, Streets & Sidewalks Public Safety & Emergency Services Social Services Apply for a Permit Report a Problem See All Services Departments My Government Departments Mayor's Office City Council Boards & Commissions City Jobs Contracting Opportunities Public Meetings Community Events Newsroom Oakland Municipal Code " -3491,https://data.ci.newark.nj.us/,List of Data Sources,Info About Agencies,Welcome - Newark Open Data,"",200,Error retrieving title: dictionary changed size during iteration,"[""Newark Open Data""]","[""Groups"", ""Showcases"", ""Popular Datasets"", ""New and Recent Datasets""]","[""Search data"", ""Popular tags"", ""Newark 4311 Dashboard"", ""Newark Building Footprints Visualization"", ""City of Newark Annual Financial Report"", ""NJ/NY PATH Ridership Visualization"", ""Newark 4311 Dashboard"", ""Newark Building Footprints Visualization"", ""City of Newark Annual Financial Report"", ""NJ/NY PATH Ridership Visualization"", ""Abandoned Properties"", ""Wards"", ""Code Enforcement"", ""Newark Tax Maps"", ""New Jersey ZIP Codes Polygon"", ""Snow Plow Tracks"", ""Abandoned Properties"", ""Newark Data Dashboard"", ""Newark 4311"", ""Parcels""]",[],[],[],"Skip to content Log in Register Log in Register Toggle navigation Datasets Organizations Groups About Search Datasets Toggle navigation Datasets Organizations Groups About Search Datasets Search Datasets Newark Open Data Our mission is to promote the openness, transparency and accountability of government by providing high-value government data in standards compliant, machine readable format. This will serve as the basis for the creation of useful civic applications by third party developers. Search data Search Popular tags Newark New Jersey GIS Groups Infrastructure Government Demographics Business Education Public Safety Showcases Previous Newark 4311 Dashboard View Newark 4311 Dashboard Newark Building Footprints Visualization View Newark Building Footprints Visualization City of Newark Annual Financial Report View City of Newark Annual Financial Report NJ/NY PATH Ridership Visualization View NJ/NY PATH Ridership Visualization Newark 4311 Dashboard View Newark 4311 Dashboard Newark Building Footprints Visualization View Newark Building Footprints Visualization City of Newark Annual Financial Report View City of Newark Annual Financial Report NJ/NY PATH Ridership Visualization View NJ/NY PATH Ridership Visualization Next Popular Datasets Browse popular datasets below and see what other citizens find interesting. Abandoned Properties 36 recent views CSV Wards 35 recent views .zip GeoJSON URL Code Enforcement 34 recent views CSV Newark Tax Maps 31 recent views PDF New Jersey ZIP Codes Polygon 29 recent views GeoJSON New and Recent Datasets Browse new or modified datasets below. Click to view details or explore content. Snow Plow Tracks Updated on July 27, 2021 CSV Abandoned Properties Updated on July 27, 2021 CSV Newark Data Dashboard Updated on November 17, 2020 CSV Newark 4311 Updated on July 15, 2020 CSV Parcels Updated on May 31, 2018 ZIP XLSX .zip CSV " -3492,https://www1.nyc.gov/site/nypd/bureaus/patrol/precincts-landing.page,Contact Info & Agency Meta,Info About Agencies,Precincts - NYPD,"",200,Welcome to NYC.gov | City of New York,"[""Precincts""]","[""New York's Finest"", """"]",[],[],[],[],"" -3493,https://npd.newarkpublicsafety.org/commandstaff,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -3494,https://app.powerbigov.us/view?r=eyJrIjoiMzZkODc3OWYtOWY2Yy00MWZkLTg4YjEtOGZkNTRjNjYzM2Q2IiwidCI6Ijk4OWEyMTgwLTZmYmMtNDdmMS04MDMyLTFhOWVlOTY5YzU4ZCJ9&pageName=ReportSection0c973751e9159c87efbb,Arrest Records,Police & Public Interactions,Microsoft Power BI,"",200,Power BI,[],[],[],[],[],[],"" -3495,https://data.cityofnewyork.us/Public-Safety/NYPD-Arrest-Data-Year-to-Date-/uip8-fykc,Arrest Records,Police & Public Interactions,NYPD Arrest Data (Year to Date) | NYC Open Data,"",200,Error retrieving title: dictionary changed size during iteration,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""NYPD Arrest Data (Year to Date)"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""NYPD Arrest Data (Year to Date)"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Dataset Information"", ""Update"", ""Attachments"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search -3496,https://d2f1dfnoetc03v.cloudfront.net/Files/2021/12/ThomasBreen/6.01-Use-of-Force-2021-Final-version.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3497,https://opendata.cityofnewyork.us/data/,List of Data Sources,Info About Agencies,NYC Open Data - Data,NYC Open Data helps New Yorkers use and learn about City data,200,403 Forbidden,"[""Data""]","[""New Datasets"", ""Popular Datasets"", ""Datasets by Category"", ""Datasets by Agency""]",[],[],"[""You are leaving the City of New York’s website.""]",[],"" -3498,https://npd.newarkpublicsafety.org/assets/docs/crimestats/cw/20211114.pdf,Crime Statistics,Agency-Published Resources,"","",404,"","","","","","","","" -3499,https://filetransfer.nashville.gov/portals/0/sitecontent/Police/docs/Strategic%20Development/MNPDManual.pdf,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3500,https://www.newhavenct.gov/gov/depts/nhpd/division/internal_affairs/general_orders.htm,Policies & Contracts,Info About Agencies,"New Haven, CT | Home","New Haven, CT, Yale University, Things to do in New Haven, Restaurants in New Haven, New Haven attractions, Events in New Haven, New Haven nightlife, Wooster Square, Yale New Haven Hospital, East Rock Park, New Haven pizza, New Haven museums, Shopping in New Haven, New Haven history, New Haven parks, New Haven neighborhoods, Arts and Schools",200,"Error retrieving title: HTTPSConnectionPool(host='www.newhavenct.gov', port=443): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known'))","[""New Haven, CT""]","[""City of New Haven"", ""Long Wharf Park Plan"", ""Solar for All"", ""New HVN & Avelo Airlines"", ""Together New Haven"", ""The American Rescue Plan"", ""City of New Haven - Municity"", ""Report a Problem: Build a Stronger Community"", ""Boathouse at Canal Dock"", ""Visit one of our Parks"", ""Union Station (NHV)"", ""News"", ""Calendar"", ""March 2024"", ""Mar 2024"", ""Stay Up To Date With The Latest News""]","[""I’d Like To…"", ""Pay..."", ""Parking Ticket""]",[],[],[],Please enable JavaScript in your browser for a better user experience. -3501,https://www.pdcn.org/,Contact Info & Agency Meta,Info About Agencies,"Nassau County Police, NY | Official Website","",200,"Nassau County Police, NY | Official Website","[""""]",[],"["""", """", ""Loading""]","[""Missing Juvenile / Freeport *UPDATE*"", ""Burglary / Valley Stream"", ""Assault / Valley Stream *UPDATE*""]",[],[],"Skip to Main Content COMPLIMENTS OR  COMPLAINTS EXECUTIVE ORDER 203 CROSSING GUARD JOB OPENINGS POLICE MEDIC JOB OPENINGS Facebook Twitter Pinterest Delicious Blogger LinkedIn Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page ABOUT ADMINISTRATION Precincts BE ALERT How Do I... e-SERVICES CRIME STOPPERS Permits Licenses & Reports Identity Theft Protection Recruitment Information and Employment Opportunities Security / Police Info Network Drug Mapping Index Police News Social Media Multimedia Auction Police News Missing Juvenile / Freeport *UPDATE* The Missing Persons Squad reports the details of a Missing Juvenile that occurred on Wednesday, March 20, 2024 at 7:00 AM in Freeport and was reported to police on Thursday, March 21, 2024 at 6:00 PM. Read on... Burglary / Valley Stream Fifth Squad Detectives report the arrest of a Queens man for a Burglary that occurred on Friday, March 22, 2024 at 10:35 pm in Valley Stream. Read on... Assault / Valley Stream *UPDATE* The Fifth Squad reports the details of an Assault that occurred on Saturday, February 3, 2024 at 3:33 am in Valley Stream. Read on... View All /CivicAlerts.aspx Social Media Tweets by TwitterDev Multimedia Every contact matters Impact HATE crossing the line Auction Nassau County Police Auction Information In accordance with the NYS Personal Property Law and The Nassau County Administrative Code, the Police Department makes property available for auction. Items include department surplus as well as recovered and unclaimed property. Auctions are ongoing and accessible via the following links: www.propertyroom.com www.copart.com (Click image for information) 1490 Franklin Avenue   •   Mineola, NY 11501   •    Phone: 516-573-8800   •   Emergency Call: 911   • Contact Us Home Site Map Accessibility Copyright Notices Powered by CivicPlus® /QuickLinks.aspx " -3502,https://npd.newarkpublicsafety.org/assets/docs/rules/npd_rules_regulations_2010.pdf,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3503,https://data.nola.gov/Public-Safety-and-Preparedness/Electronic-Police-Report-2021/6pqh-bfxa,Crime Statistics,Agency-Published Resources,Electronic Police Report 2021 | Data.NOLA.gov,"",200," - Home - DataDriven - City of New Orleans -","[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Electronic Police Report 2021"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Electronic Police Report 2021"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -3504,https://data.cityofnewyork.us/Public-Safety/NYPD-Calls-for-Service-Year-to-Date-/n2zq-pubd,Calls for Service,Police & Public Interactions,NYPD Calls for Service (Year to Date) | NYC Open Data,"",200,403 Forbidden,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""NYPD Calls for Service (Year to Date)"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""NYPD Calls for Service (Year to Date)"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Dataset Information"", ""Update"", ""Attachments"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search -3505,https://www1.nyc.gov/site/nypd/stats/crime-statistics/compstat.page,Crime Maps & Reports,Agency-Published Resources,Crime Stats - COMPStat - NYPD,CompStat 2.0 link,200,Welcome to NYC.gov | City of New York,"[""CompStat 2.0""]","[""New York's Finest""]",[],[],[],[],"New York City Police Department 311 Search all NYC.gov websites Menu New York's Finest Text-Size Translate This Page Search New York's Finest Home About Bureaus Services Stats Media Careers Policies Language English Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Hausa Haitian Creole Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scots Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Apply Translation Search Search Crime Statistics Traffic Data Reports & Dashboards Research Select Citywide Crime Statistics Borough and Precinct Crime Statistics NYC Parks Crime Statistics Historical NYC Crime Data COMPStat 2.0 Citywide Crime Statistics Borough and Precinct Crime Statistics NYC Parks Crime Statistics Historical NYC Crime Data COMPStat 2.0 Share Print CompStat 2.0 The New York City Police Department has taken the unprecedented step of making much of the crime data developed in the CompStat model available to the public. This advancement, called CompStat 2.0 , provides greater specificity about crimes through an online interactive experience. Guns taken off NYC streets Rolling Year to Date Breakdown (1/1/2024—present) Since Start of Administration (1/1/2022—present) 1490 15080 Directory of City Agencies Contact NYC Government City Employees Notify NYC CityStore Stay Connected NYC Mobile Apps Maps Resident Toolkit NYC Search Search City of New York. 2024 All Rights Reserved, NYC is a trademark and service mark of the City of New York Privacy Policy. Terms of Use. " -3506,https://www.newhavenct.gov/government/departments-divisions/new-haven-police-department/divisions/nhpd-internal-affairs,Complaints & Misconduct,Info About Officers,"","",404,"","","","","","","","" -3507,https://data.oaklandca.gov/,List of Data Sources,Info About Agencies,City of Oakland Open Data Portal | Open Data Portal,"",200,"City of Oakland Open Data Portal | Open Data Portal -","[""Welcome to the City of Oakland’s Open Data Platform""]","[""Menu"", ""CrimeWatch Maps Past 90-Days"", ""Oakland Call Center Service Request Data"", ""“Show me the money” Campaign Finance app"", ""Reimagining Public Safety"", ""Finance"", ""Education"", ""Infrastructure"", ""Environment"", ""City Government"", ""Property"", ""Public Safety"", ""Social Services"", ""Economic Development"", ""Oakland Data""]",[],[],[],[],"Skip to main content Skip to footer links Search Home Data Getting Started Developers Sign In Menu Menu Close Home Data Getting Started Developers Sign In Search Welcome to the City of Oakland’s Open Data Platform Find datasets from the City of Oakland CrimeWatch Maps Past 90-Days We are committed to making Oakland a safer city. This Dataset provides crime data for the last 90 days. Oakland Call Center Service Request Data View Call Center Service Requests. “Show me the money” Campaign Finance app “Show me the money” is an interactive disclosure tool that puts information on the funding sources of local campaigns at Oaklanders’ fingertips. The app provides an easy way to drill down to see candidates’ contributors and to make comparisons across races and years. Reimagining Public Safety Reducing crime and serving the community through fair, quality policing is the Oakland Police Department’s mission, which can only be fully realized if there is public trust and a strong relationship with the community. The OPD is committed to serving the City’s diverse community through equitable policing and seeks to enhance public trust through transparency in data. Checking in seconds ... Finance Data on the budget, governmental spending, taxes, revenues, and expenses. Education Data on Education, schools, and educational services. Infrastructure Data on status and maintenance of city property, buildings, parks, and rights of way. Environment Data on sustainability, energy and resource usage and current environmental conditions. City Government Data on employees, campaigns, and elections. Property Data on permitting, construction, and building inspections. Public Safety Data on fire, crime, accidents, and enforcement. Social Services Data on services provided to individuals, children, and families. Economic Development Data on development, businesses, development, and the economy. Oakland Data Browser City of Oakland open data. Checking in seconds ... " -3508,https://www1.nyc.gov/site/ccrb/policy/MOS-records.page,Complaints & Misconduct,Info About Officers,mos-history,"",200,Welcome to NYC.gov | City of New York,"[""NYPD Member of Service Histories""]","[""Search CCRB NYPD Member of Service Histories"", """"]","[""""]",[],[],[],"Civilian Complaint Review Board 311 Search all NYC.gov websites Menu Text-Size Translate This Page Search Home About Complaints Outreach Policy & Data Resources Language English Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Hausa Haitian Creole Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scots Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Apply Translation Search Search Reports Data MOS Records Foundational Documents and City Mandates Share Print NYPD Member of Service Histories This database allows users to view the record of NYPD misconduct allegations. Click Search to view all available history, including the CCRB's disposition, the NYPD's disposition, and the penalty ultimately imposed (if applicable). The CCRB can recommend a level of police discipline , with the Police Commissioner retaining final authority over disciplinary decisions. Enter a First Name, Last Name, Shield Number, or select an option from the drop-down menus to filter the results. When using this database, be mindful of the following: This database reflects CCRB complaints only . Allegations of misconduct that fall outside of the CCRB's jurisdiciton are not included in this database. The New York City Charter specifies that the CCRB's jurisdiction includes four categories of police misconduct: Force, Abuse of Authority, Discourtesy, and Offensive Language. CCRB allegation history does not include open allegations, successfully mediated allegations or mediation attempted allegations. CCRB allegation history does not include allegations from complaints filed prior to the year 2000. It also does not include referrals to the NYPD or other investigative entities. There is a significant difference between the CCRB dispositions 'Exonerated,' 'Unfounded,' and 'Unsubstantiated.' When exploring the database, please refer to the definitions of the CCRB's case outcomes . Search CCRB NYPD Member of Service Histories Status: Active Inactive First Name: Last Name: Tax No: Shield No.: Command: Rank: Captain Chiefs and other ranks Deputy Inspector Detective Inspector Lieutenant Police Officer Sergeant Total Complaints: 1 2 3 4 5+ Substantiated Complaints: 1 2 3 4 5+ Search Reset Directory of City Agencies Contact NYC Government City Employees Notify NYC CityStore Stay Connected NYC Mobile Apps Maps Resident Toolkit NYC Search Search City of New York. 2024 All Rights Reserved, NYC is a trademark and service mark of the City of New York Privacy Policy. Terms of Use. " -3509,https://nolaipm.gov/annual-reports/,Complaints & Misconduct,Info About Officers,Annual Reports – New Orleans Independent Police Monitor,"",200,New Orleans Independent Police Monitor,"[""Annual Reports""]","[""We are here to assist"", ""We Will Keep You Informed Every Step Of The Way""]",[],"[""we are good at what we do"", ""Navigation"", ""Join Our Movement""]",[],[],"504-309-9799 policemonitor@nolaipm.gov 2714 Canal St, New Orleans, LA 70119 Search Search Close this search box. About OIPM History Our Mission Staff Ethic Review Board Careers Our Work Mediation Our Mediators Data Use of Force Complaints and Discipline Disciplinary Hearing Summaries Police/Community Relations Survey Reports Monthly Ethics Review Board Hearing Reports Public Letters Annual Reports Subject Matter Reports Complaint Investigation Reviews File a Complaint File a Commendation Menu About OIPM History Our Mission Staff Ethic Review Board Careers Our Work Mediation Our Mediators Data Use of Force Complaints and Discipline Disciplinary Hearing Summaries Police/Community Relations Survey Reports Monthly Ethics Review Board Hearing Reports Public Letters Annual Reports Subject Matter Reports Complaint Investigation Reviews File a Complaint File a Commendation Contact Us 504-309-9799 policemonitor@nolaipm.gov 2714 Canal St, New Orleans, LA 70119 Search Search Close this search box. About OIPM History Our Mission Staff Ethic Review Board Careers Our Work Mediation Our Mediators Data Use of Force Complaints and Discipline Disciplinary Hearing Summaries Police/Community Relations Survey Reports Monthly Ethics Review Board Hearing Reports Public Letters Annual Reports Subject Matter Reports Complaint Investigation Reviews File a Complaint File a Commendation Menu About OIPM History Our Mission Staff Ethic Review Board Careers Our Work Mediation Our Mediators Data Use of Force Complaints and Discipline Disciplinary Hearing Summaries Police/Community Relations Survey Reports Monthly Ethics Review Board Hearing Reports Public Letters Annual Reports Subject Matter Reports Complaint Investigation Reviews File a Complaint File a Commendation Contact Us 504-309-9799 policemonitor@nolaipm.gov 2714 Canal St, New Orleans, LA 70119 Search Search Close this search box. About OIPM History Our Mission Staff Ethic Review Board Careers Our Work Mediation Our Mediators Data Use of Force Complaints and Discipline Disciplinary Hearing Summaries Police/Community Relations Survey Reports Monthly Ethics Review Board Hearing Reports Public Letters Annual Reports Subject Matter Reports Complaint Investigation Reviews File a Complaint File a Commendation Menu About OIPM History Our Mission Staff Ethic Review Board Careers Our Work Mediation Our Mediators Data Use of Force Complaints and Discipline Disciplinary Hearing Summaries Police/Community Relations Survey Reports Monthly Ethics Review Board Hearing Reports Public Letters Annual Reports Subject Matter Reports Complaint Investigation Reviews File a Complaint File a Commendation Contact Us 504-309-9799 policemonitor@nolaipm.gov 2714 Canal St, New Orleans, LA 70119 Search Search Close this search box. About OIPM History Our Mission Staff Ethic Review Board Careers Our Work Mediation Our Mediators Data Use of Force Complaints and Discipline Disciplinary Hearing Summaries Police/Community Relations Survey Reports Monthly Ethics Review Board Hearing Reports Public Letters Annual Reports Subject Matter Reports Complaint Investigation Reviews File a Complaint File a Commendation Menu About OIPM History Our Mission Staff Ethic Review Board Careers Our Work Mediation Our Mediators Data Use of Force Complaints and Discipline Disciplinary Hearing Summaries Police/Community Relations Survey Reports Monthly Ethics Review Board Hearing Reports Public Letters Annual Reports Subject Matter Reports Complaint Investigation Reviews File a Complaint File a Commendation Contact Us 504-309-9799 policemonitor@nolaipm.gov 2714 Canal St, New Orleans, LA 70119 Search Search Close this search box. " -3510,https://www.okc.gov/departments/police/crime-prevention-data/crime-stats,Crime Maps & Reports,Agency-Published Resources,"","",-1,"","","","","","","","" -3511,https://www.oaklandca.gov/resources/oakland-police-department-opd-policies-1,Policies & Contracts,Info About Agencies,City of Oakland | Oakland Police Department (OPD) Policies,"The official website of the City of Oakland. Find out about meetings, request City services through OAK 311, or contact the Mayor and City Council.",200,City of Oakland | Homepage,"[""Oakland Police Department (OPD) Policies""]",[],"[""Search oaklandca.gov"", ""Popular on oaklandca.gov""]",[],"[""Your Government"", ""How can we help?"", ""Sign up for updates""]",[],"Official Website for the City of Oakland | Mayor Sheng Thao English Español 中文 Tiếng Việt | Translate اَلْعَرَبِيَّةُ Hmoob Cebuano 日本語 ភាសាខ្មែរ 中文 汉语 한국어 English монгол Filipino Español Tiếng Việt Official Website for the City of Oakland | Mayor Sheng Thao English Español 中文 Tiếng Việt | Translate اَلْعَرَبِيَّةُ Hmoob Cebuano 日本語 ភាសាខ្មែរ 中文 汉语 한국어 English монгол Filipino Español Tiếng Việt Home Services Services Find City Services See All Services Animals Activities & Recreation Building Business City Government Employment & Training Housing Parking, Streets & Sidewalks Public Safety & Emergency Services Social Services Apply for a Permit Report a Problem Departments Departments Frequently Visited Departments See All Departments Animal Services Economic & Workforce Development Fire Housing & Community Development Human Services Public Library Parks, Recreation & Youth Development Planning & Building Police Public Works Transportation (OakDOT) Violence Prevention My Government My Government About Your Government Departments Mayor's Office City Council Boards & Commissions City Jobs Contracting Opportunities Public Meetings Community Events Newsroom Oakland Municipal Code search icon Created with Sketch. Search oaklandca.gov Search? search icon Created with Sketch. Popular on oaklandca.gov Report a Problem Online with Oak311 Apply for a Permit Apply for City Jobs Parking Services Adopt a Pet Apply for or Renew Business Tax Mobile Menu Services Animals Activities & Recreation Building Business City Government Employment & Training Housing Parking, Streets & Sidewalks Public Safety & Emergency Services Social Services Apply for a Permit Report a Problem See All Services Departments My Government Departments Mayor's Office City Council Boards & Commissions City Jobs Contracting Opportunities Public Meetings Community Events Newsroom Oakland Municipal Code Home Services Services Find City Services See All Services Animals Activities & Recreation Building Business City Government Employment & Training Housing Parking, Streets & Sidewalks Public Safety & Emergency Services Social Services Apply for a Permit Report a Problem Departments Departments Frequently Visited Departments See All Departments Animal Services Economic & Workforce Development Fire Housing & Community Development Human Services Public Library Parks, Recreation & Youth Development Planning & Building Police Public Works Transportation (OakDOT) Violence Prevention My Government My Government About Your Government Departments Mayor's Office City Council Boards & Commissions City Jobs Contracting Opportunities Public Meetings Community Events Newsroom Oakland Municipal Code search icon Created with Sketch. Search oaklandca.gov Search? search icon Created with Sketch. Popular on oaklandca.gov Report a Problem Online with Oak311 Apply for a Permit Apply for City Jobs Parking Services Adopt a Pet Apply for or Renew Business Tax Mobile Menu Services Animals Activities & Recreation Building Business City Government Employment & Training Housing Parking, Streets & Sidewalks Public Safety & Emergency Services Social Services Apply for a Permit Report a Problem See All Services Departments My Government Departments Mayor's Office City Council Boards & Commissions City Jobs Contracting Opportunities Public Meetings Community Events Newsroom Oakland Municipal Code " -3513,https://www.oaklandca.gov/resources/stop-data  ,Stops,Police & Public Interactions,"","",404,"","","","","","","","" -3514,https://www.okc.gov/home/showpublisheddocument/25327/637703385883370000,Use of Force Reports,Police & Public Interactions,"","",-1,"","","","","","","","" -3515,https://www.newhavenct.gov/gov/depts/nhpd/,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -3516,https://www.justice.gov/sites/default/files/crt/legacy/2011/03/17/nopd_report.pdf,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -3517,https://www.okc.gov/departments/police/crime-prevention-data/jail-blotter,Arrest Records,Police & Public Interactions,"","",-1,"","","","","","","","" -3518,https://nola.gov/getattachment/NOPD/Policies/Chapter-33-1-Training-and-Career-Development-EFECTIVE-6-18-17.pdf/,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3520,https://www.nysda.org/page/LawEnforcementDisciplinaryRecords,Complaints & Misconduct,Info About Officers,"","",403,"","","","","","","","" -3521,https://www1.nyc.gov/assets/nypd/downloads/pdf/use-of-force/use-of-force-2019-2020-11-03.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3522,https://www.newhavenct.gov/government/departments-divisions/new-haven-police-department/compstat-reports,Crime Statistics,Agency-Published Resources,"CompStat Reports | New Haven, CT","",200,"Error retrieving title: HTTPSConnectionPool(host='www.newhavenct.gov', port=443): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known'))","[""New Haven, CT"", ""CompStat Reports""]","[""Explore this page..."", ""Stay Up To Date With The Latest News""]","[""I’d Like To…"", ""Pay..."", ""Parking Ticket""]",[],[],[],Please enable JavaScript in your browser for a better user experience. -3523,http://npd.newarkpublicsafety.org/statistics/arrestdata,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -3524,https://nola.gov/getattachment/NOPD/Policies/Chapter-1-3-Use-of-Force-EFFECTIVE-4-01-18.pdf/,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3526,https://opennassau.nassaucountyny.gov/,List of Data Sources,Info About Agencies,Open Nassau,"",200,Open Nassau,"[""Welcome to Open Nassau: Nassau County's Transparency Portal"", """", """", """"]","[""Menu""]",[],[],[],[],Skip to main content Skip to footer links Office of the Nassau County Comptroller Search Home Page Menu Menu Close Home Page Sign In Search Welcome to Open Nassau: Nassau County's Transparency Portal Nassau County Comptroller's Scorecard Census Data Federal ARPA Funding Tracker Comptroller's Corner Office of the Nassau County Comptroller Search Home Page Menu Menu Close Home Page Sign In Search Welcome to Open Nassau: Nassau County's Transparency Portal Nassau County Comptroller's Scorecard Census Data Federal ARPA Funding Tracker Comptroller's Corner Office of the Nassau County Comptroller Search Home Page Menu Menu Close Home Page Sign In Search Office of the Nassau County Comptroller Search Home Page Menu Office of the Nassau County Comptroller Search Office of the Nassau County Comptroller Search Search Search Home Page Menu Home Page Menu Home Page Home Page Menu Close Home Page Sign In Search Home Page Sign In Search Home Page Sign In Search Search Welcome to Open Nassau: Nassau County's Transparency Portal Nassau County Comptroller's Scorecard Census Data Federal ARPA Funding Tracker Comptroller's Corner Welcome to Open Nassau: Nassau County's Transparency Portal Nassau County Comptroller's Scorecard Census Data Federal ARPA Funding Tracker Comptroller's Corner Welcome to Open Nassau: Nassau County's Transparency Portal Nassau County Comptroller's Scorecard Census Data Federal ARPA Funding Tracker Comptroller's Corner Welcome to Open Nassau: Nassau County's Transparency Portal Nassau County Comptroller's Scorecard Census Data Federal ARPA Funding Tracker Comptroller's Corner Welcome to Open Nassau: Nassau County's Transparency Portal Nassau County Comptroller's Scorecard Census Data Federal ARPA Funding Tracker Comptroller's Corner Welcome to Open Nassau: Nassau County's Transparency Portal Nassau County Comptroller's Scorecard Census Data Federal ARPA Funding Tracker Comptroller's Corner Welcome to Open Nassau: Nassau County's Transparency Portal Nassau County Comptroller's Scorecard Census Data Federal ARPA Funding Tracker Comptroller's Corner Welcome to Open Nassau: Nassau County's Transparency Portal Welcome to Open Nassau: Nassau County's Transparency Portal Welcome to Open Nassau: Nassau County's Transparency Portal Nassau County Comptroller's Scorecard Census Data Federal ARPA Funding Tracker Comptroller's Corner Nassau County Comptroller's Scorecard Census Data Federal ARPA Funding Tracker Comptroller's Corner Nassau County Comptroller's Scorecard Census Data Federal ARPA Funding Tracker Comptroller's Corner Disclaimer © 2024 Disclaimer © 2024 © 2024 Checking in seconds ... Checking in seconds ... -3528,https://data.nashville.gov/,List of Data Sources,Info About Agencies,Nashville | Open Data | Nashville Open Data Portal,"",200,Nashville | Open Data | Nashville Open Data Portal,"[""Nashville Open Data Portal""]","[""Menu"", ""Business, Development & Housing"", ""Culture"", ""Education"", ""Environment"", ""Health"", ""Metro Government"", ""Public Safety"", ""Transportation"", ""Traffic Accidents"", ""hubNashville Requests"", ""Election Results"", ""Building Permits""]",[],[],[],[],"Skip to main content Skip to footer links Search Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Menu Menu Close Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Search Nashville Open Data Portal The data available on this site will empower the public to partner with Metro departments and agencies to co-create innovative web resources, insightful analytics on public programs and services, and new civic apps for the community. Business, Development & Housing Data related to businesses, city planning and development and housing. Culture Historical and artistic related data for Nashville and Davidson County. Education Data related to the schools and public education system in Nashville. Environment Data centered around Nashville’s rich park system and innovative environmental efforts. Health Data related to services and efforts that improve the health of Nashville’s citizens. Metro Government Data sets such as Codes, water and sewer rates, Metro Council district info and even where free WiFi can be found. Public Safety Data concerning police, fire, and all things surrounding public safety. Transportation Metro Nashville has a great public transportation system. Here you’ll find data about that system. Checking in seconds ... Traffic Accidents Detailed traffic accident data provided by the Metro Nashville Police Department. hubNashville Requests hubNashville is the best way to get service in your neighborhood and beyond. See the latest requests here. Election Results Our expanded election results data now includes certified results by precinct. Building Permits Information about building permits applied for and issued in Davidson County. Checking in seconds ... " -3529,https://data.ok.gov/,List of Data Sources,Info About Agencies,Welcome - Oklahoma's Open Data,"",200,Welcome - Oklahoma's Open Data,"[""Oklahoma's Open Data""]","[""Groups"", ""Showcases"", ""Popular Datasets"", ""New and Recent Datasets""]","[""Search data"", ""Popular tags"", ""Oklahoma Real Property Asset Report"", ""Oklahoma Public Records Laws"", ""2018 Financial Summary"", ""State Revenue"", ""CARES Act"", ""Vendor Transactions"", ""It’s Payday in Oklahoma"", ""State Travel Expenditures"", ""Capitol Restoration Project"", ""Comprehensive Annual Financial Report"", ""Purchase Card Transactions"", ""How to Use"", ""Medical Cannabis Revenue"", ""Oklahoma Real Property Asset Report"", ""Oklahoma Public Records Laws"", ""2018 Financial Summary"", ""State Revenue"", ""State of Oklahoma Payroll - Fiscal Year 2023"", ""State of Oklahoma Payroll - Fiscal Year 2024"", ""State of Oklahoma Payroll - Fiscal Year 2022"", ""Used Motor Vehicle and Parts Commission Dealer License Search"", ""Purchase Card (PCard) Fiscal Year 2019"", ""General Ledger"", ""State of Oklahoma Vendor Payments - Fiscal Year 2024"", ""Current MET Tower List"", ""State of Oklahoma Payroll - Fiscal Year 2023"", ""State of Oklahoma Payroll - Fiscal Year 2024""]",[],[],"[""STATE AGENCIES"", ""ELECTED OFFICIALS""]","Skip to content Log in Contact Log in Contact Toggle navigation Datasets Organizations Groups About Search Datasets Toggle navigation Datasets Organizations Groups About Search Datasets Search Datasets Oklahoma's Open Data Providing Oklahomans with deep access to data and statistics about the activities of Oklahoma’s government. Search data Search Popular tags economy education government Groups Family & Health Education Business & Employment General Services Information Technology Public Safety & Corrections Financing Environmental & Natural Resources Showcases Previous Oklahoma Real Property Asset Report View Oklahoma Real Property Asset Report Oklahoma Public Records Laws View Oklahoma Public Records Laws 2018 Financial Summary View 2018 Financial Summary State Revenue View State Revenue CARES Act View CARES Act Vendor Transactions View Vendor Transactions It’s Payday in Oklahoma View It’s Payday in Oklahoma State Travel Expenditures View State Travel Expenditures Capitol Restoration Project View Capitol Restoration Project Comprehensive Annual Financial Report View Comprehensive Annual Financial Report Purchase Card Transactions View Purchase Card Transactions How to Use View How to Use Medical Cannabis Revenue View Medical Cannabis Revenue Oklahoma Real Property Asset Report View Oklahoma Real Property Asset Report Oklahoma Public Records Laws View Oklahoma Public Records Laws 2018 Financial Summary View 2018 Financial Summary State Revenue View State Revenue Next Popular Datasets Browse popular datasets below and see what other citizens find interesting. State of Oklahoma Payroll - Fiscal Year 2023 341 recent views CSV State of Oklahoma Payroll - Fiscal Year 2024 306 recent views CSV State of Oklahoma Payroll - Fiscal Year 2022 85 recent views CSV Used Motor Vehicle and Parts Commission Dealer License Search 72 recent views CSV Purchase Card (PCard) Fiscal Year 2019 51 recent views TXT New and Recent Datasets Browse new or modified datasets below. Click to view details or explore content. General Ledger Updated on March 22, 2024 CSV State of Oklahoma Vendor Payments - Fiscal Year 2024 Updated on March 22, 2024 CSV Current MET Tower List Updated on March 22, 2024 CSV State of Oklahoma Payroll - Fiscal Year 2023 Updated on March 22, 2024 CSV State of Oklahoma Payroll - Fiscal Year 2024 Updated on March 22, 2024 CSV " -3530,https://compstat.nypdonline.org/,Crime Statistics,Agency-Published Resources,NYPD CompStat 2.0,New York Police Department CompStat,200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -3531,https://drive.google.com/drive/folders/1ysYDc6FYZgpbrBVRyfh6wZgoRYGGU10H,Complaints & Misconduct,Info About Officers,Cases - Google Drive,"",200,Google Drive: Sign-in,[],[],[],[],[],[],"JavaScript must be enabled to use Google Drive Learn more JavaScript must be enabled to use Google Drive Learn more JavaScript must be enabled to use Google Drive Learn more JavaScript must be enabled to use Google Drive Learn more You are using an unsupported browser. Upgrade Google Chrome Skip to main content Keyboard shortcuts Accessibility feedback Drive Drive Sign in Folder Path Cases Download all Name Owner Last modified File size More sorting options Folders 21C-001 Owner hidden Oct 30, 2021 — Download 21C-002 Owner hidden Oct 30, 2021 — Download 21C-003 Owner hidden Oct 30, 2021 — Download 21C-004 Owner hidden Jan 9, 2022 — Download 21C-005 Owner hidden Oct 30, 2021 — Download 21C-007 Owner hidden Oct 30, 2021 — Download 21C-008 Owner hidden Jan 9, 2022 — Download 21C-009 Owner hidden Oct 30, 2021 — Download 21C-010 Owner hidden Oct 30, 2021 — Download 21C-011 Owner hidden Oct 30, 2021 — Download 21C-012 Owner hidden Jan 9, 2022 — Download 21C-013 Owner hidden Jan 9, 2022 — Download 21C-014 Owner hidden Dec 6, 2021 — Download 21C-015 Owner hidden Oct 30, 2021 — Download 21C-016 Owner hidden Oct 30, 2021 — Download 21C-017 Owner hidden Oct 30, 2021 — Download 21C-018 Owner hidden Oct 30, 2021 — Download 21C-020 Owner hidden Nov 22, 2021 — Download 21C-021 Owner hidden Oct 30, 2021 — Download 21C-022 Owner hidden Oct 30, 2021 — Download 21C-023 Owner hidden Oct 30, 2021 — Download 21C-024 Owner hidden Oct 30, 2021 — Download 21C-026 Owner hidden Jan 9, 2022 — Download 21C-027 Owner hidden Oct 30, 2021 — Download 21C-028 Owner hidden Oct 30, 2021 — Download 21C-029 Owner hidden Oct 30, 2021 — Download 21C-030 Owner hidden Oct 30, 2021 — Download 21C-032 Owner hidden Oct 30, 2021 — Download 21C-033 Owner hidden Oct 30, 2021 — Download 21C-034 Owner hidden Oct 30, 2021 — Download 21C-035 Owner hidden Oct 30, 2021 — Download 21C-036 Owner hidden Oct 30, 2021 — Download 21C-037 Owner hidden Oct 30, 2021 — Download 21C-038 Owner hidden Oct 30, 2021 — Download 21C-039 Owner hidden Oct 30, 2021 — Download 21C-042 Owner hidden Oct 30, 2021 — Download 21C-043 Owner hidden Oct 30, 2021 — Download 21C-044 Owner hidden Oct 30, 2021 — Download 21C-045 Owner hidden Oct 30, 2021 — Download 21C-046 Owner hidden Oct 30, 2021 — Download 21C-047 Owner hidden Oct 30, 2021 — Download 21C-048 Owner hidden Oct 30, 2021 — Download 21C-049 Owner hidden Oct 30, 2021 — Download 21C-050 Owner hidden Oct 30, 2021 — Download 21C-051 Owner hidden Oct 30, 2021 — Download 21C-052 Owner hidden Oct 30, 2021 — Download 21C-053 Owner hidden Oct 30, 2021 — Download 21C-054 Owner hidden Oct 30, 2021 — Download 21C-055 Owner hidden Oct 30, 2021 — Download 21C-056 Owner hidden Oct 30, 2021 — Download No files in this folder. Sign in to add files to this folder " -3532,https://npd.newarkpublicsafety.org/assets/docs/transparency/202110.pdf,Stops,Police & Public Interactions,"","",404,"","","","","","","","" -3533,https://data.oaklandca.gov/Public-Safety/CrimeWatch-Maps-Past-90-Days/ym6k-rx7a,Crime Statistics,Agency-Published Resources,CrimeWatch Maps Past 90-Days | Open Data Portal,"",200,"City of Oakland Open Data Portal | Open Data Portal -","[""Download Oakland Crime Heatmap"", ""90-Day Crime Map"", ""90daybutters"", ""90 day crime map"", ""90day crime 0923 22x"", ""Jan-March 13 Homicide & Assault with Firearm on Person"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""CrimeWatch Maps Past 90-Days"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""CrimeWatch Maps Past 90-Days"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home Data Getting Started Developers Sign In Menu Menu Close Home Data Getting Started Developers Sign In Search Search Home Data Getting Started Developers Sign In Menu Search Search Search Search Home Data Getting Started Developers Sign In Menu Home Data Getting Started Developers Sign In Menu Home Data Getting Started Developers Home Data Getting Started Developers Sign In Sign In Menu Close Home Data Getting Started Developers Sign In Search Home Data Getting Started Developers Sign In Search Home Data Getting Started Developers Sign In Search Search -3534,https://www1.nyc.gov/site/nypd/about/about-nypd/manual.page,Policies & Contracts,Info About Agencies,NYPD Department Manual,NYPD Department Manual,200,Welcome to NYC.gov | City of New York,"[""Table of Contents"", ""Patrol Guide"", ""Administrative Guide""]","[""New York's Finest"", """"]",[],[],[],[],"New York City Police Department 311 Search all NYC.gov websites Menu New York's Finest Text-Size Translate This Page Search New York's Finest Home About Bureaus Services Stats Media Careers Policies Language English Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Hausa Haitian Creole Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scots Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sundanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Apply Translation Search Search About NYPD Leadership Police Academy Memorials Share Print Table of Contents Table of Contents (7 MB) Patrol Guide NYPD Patrol Guide (7 MB) NYPD Patrol Guide (8 MB) NYPD Patrol Guide (8 MB) NYPD Patrol Guide (8 MB) Administrative Guide New York City Local Law No. 129 of 2016, mandates the New York City Police Department to publish the Patrol Guide online for the public to view. Currently, the Department is revising the Patrol Guide by relocating polices that are administrative in nature to our Administrative Guide. To continue our commitment to transparency, whenever a procedure is relocated from the Patrol Guide to the Administrative Guide, that procedure and its corresponding section will be posted on the Department’s internet website. Ultimately, when the revision of the Patrol and Administrative guides are complete, the Administrative Guide will be published online in its entirety. NYPD Administrative Guide (5.4 MB) NYPD Administrative Guide (2 MB) Department Manual Update Timeline Last Updated February 15, 2024 Directory of City Agencies Contact NYC Government City Employees Notify NYC CityStore Stay Connected NYC Mobile Apps Maps Resident Toolkit NYC Search Search City of New York. 2024 All Rights Reserved, NYC is a trademark and service mark of the City of New York Privacy Policy. Terms of Use. " -3535,https://www.oaklandca.gov/topics/use-of-force-uof-levels,Use of Force Reports,Police & Public Interactions,City of Oakland | Use of Force (UOF) Levels,"The official website of the City of Oakland. Find out about meetings, request City services through OAK 311, or contact the Mayor and City Council.",200,City of Oakland | Homepage,"[""Use of Force (UOF) Levels""]","[""Resources"", ""Topics"", ""About""]","[""Search oaklandca.gov"", ""Popular on oaklandca.gov""]",[],"[""Your Government"", ""How can we help?"", ""Sign up for updates""]",[],"Official Website for the City of Oakland | Mayor Sheng Thao English Español 中文 Tiếng Việt | Translate اَلْعَرَبِيَّةُ Hmoob Cebuano 日本語 ភាសាខ្មែរ 中文 汉语 한국어 English монгол Filipino Español Tiếng Việt Official Website for the City of Oakland | Mayor Sheng Thao English Español 中文 Tiếng Việt | Translate اَلْعَرَبِيَّةُ Hmoob Cebuano 日本語 ភាសាខ្មែរ 中文 汉语 한국어 English монгол Filipino Español Tiếng Việt Home Services Services Find City Services See All Services Animals Activities & Recreation Building Business City Government Employment & Training Housing Parking, Streets & Sidewalks Public Safety & Emergency Services Social Services Apply for a Permit Report a Problem Departments Departments Frequently Visited Departments See All Departments Animal Services Economic & Workforce Development Fire Housing & Community Development Human Services Public Library Parks, Recreation & Youth Development Planning & Building Police Public Works Transportation (OakDOT) Violence Prevention My Government My Government About Your Government Departments Mayor's Office City Council Boards & Commissions City Jobs Contracting Opportunities Public Meetings Community Events Newsroom Oakland Municipal Code search icon Created with Sketch. Search oaklandca.gov Search? search icon Created with Sketch. Popular on oaklandca.gov Report a Problem Online with Oak311 Apply for a Permit Apply for City Jobs Parking Services Adopt a Pet Apply for or Renew Business Tax Mobile Menu Services Animals Activities & Recreation Building Business City Government Employment & Training Housing Parking, Streets & Sidewalks Public Safety & Emergency Services Social Services Apply for a Permit Report a Problem See All Services Departments My Government Departments Mayor's Office City Council Boards & Commissions City Jobs Contracting Opportunities Public Meetings Community Events Newsroom Oakland Municipal Code Home Services Services Find City Services See All Services Animals Activities & Recreation Building Business City Government Employment & Training Housing Parking, Streets & Sidewalks Public Safety & Emergency Services Social Services Apply for a Permit Report a Problem Departments Departments Frequently Visited Departments See All Departments Animal Services Economic & Workforce Development Fire Housing & Community Development Human Services Public Library Parks, Recreation & Youth Development Planning & Building Police Public Works Transportation (OakDOT) Violence Prevention My Government My Government About Your Government Departments Mayor's Office City Council Boards & Commissions City Jobs Contracting Opportunities Public Meetings Community Events Newsroom Oakland Municipal Code search icon Created with Sketch. Search oaklandca.gov Search? search icon Created with Sketch. Popular on oaklandca.gov Report a Problem Online with Oak311 Apply for a Permit Apply for City Jobs Parking Services Adopt a Pet Apply for or Renew Business Tax Mobile Menu Services Animals Activities & Recreation Building Business City Government Employment & Training Housing Parking, Streets & Sidewalks Public Safety & Emergency Services Social Services Apply for a Permit Report a Problem See All Services Departments My Government Departments Mayor's Office City Council Boards & Commissions City Jobs Contracting Opportunities Public Meetings Community Events Newsroom Oakland Municipal Code " -3536,https://data.cityofnewyork.us/Public-Safety/The-Stop-Question-and-Frisk-Data/ftxv-d5ix,Stops,Police & Public Interactions,"The Stop, Question and Frisk Data | NYC Open Data","",200,403 Forbidden,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""The Stop, Question and Frisk Data"", ""Access this Data"", ""About this Dataset"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Dataset Information"", ""Update"", ""Attachments"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search -3537,https://datadriven.nola.gov/open-data/,List of Data Sources,Info About Agencies,Open Data - DataDriven - City of New Orleans,"",200," - Home - DataDriven - City of New Orleans -","[""DataDriven"", """"]","[""Fueling the laboratory of innovation and change in New Orleans"", ""Search for data"", ""Featured datasets"", ""New datasets"", ""Open Data Skills"", ""Analysis and Visualization Skills"", ""Geographic Information Skills"", ""Share your data with us"", ""Have questions? Contact us""]","[""or browse the data.nola.gov catalog"", ""Calls for Service"", ""311 Calls (2012-Present)"", ""Electronic Police Report 2017"", ""Occupational Business Licenses"", ""NOPD Misconduct Complaints"", ""Housing and Urban Development (HUD) Grants"", ""Bike Lanes"", ""Socrata"", ""Power BI"", ""GIS and New Orleans""]",[],[],[],Read the 2018 Annual Data Report! Read the 2018 Annual Data Report! DataDriven Fueling the laboratory of innovation and change in New Orleans Toggle navigation DataDriven Home Open Data Data Products NOLAlytics Evaluation ResultsNOLA Data Inventory Dashboard Training Blog Toggle navigation DataDriven Home Open Data Data Products NOLAlytics Evaluation ResultsNOLA Data Inventory Dashboard Training Blog -3538,https://www.nashville.gov/sites/default/files/2021-12/Department-Manual-Use-of-Force-Policy.pdf?ct=1640874735,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3539,https://www.crimemapping.com/map/agency/265,Crime Maps & Reports,Agency-Published Resources,CrimeMapping.com - Helping You Build a Safer Community,"",200,CrimeMapping.com - Helping You Build a Safer Community,"[""My Map Summary"", ""What"", ""Where"", ""When"", ""Display Options"", ""Location Selection"", ""Choose a Search Distance"", ""Timeframe Settings"", ""From:"", ""To:""]",[],[],[],[],[],"Preparing Map Content... Preparing Map Content... Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Receive Alerts Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Distance: Miles select Distance: Miles select Streets select Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Zoom to Zoom to Zoom to Zoom to Fetching Data. x Close Fetching Data. Fetching Data. Fetching Data. x Close Share This Map My Map Summary The sum of the What, Where, When you’ve chosen. What * Data not provided by agency within map extent Where Broward County Police Boundary Agency Filter: Agency Name Here When Previous 7 Days Friday, May 1 - Friday, May 8 Restore Defaults Display Options What type(s) of records would you like to see? Select All | Deselect All Arson Assault Burglary Disturbing the Peace Drugs / Alcohol Violations DUI Fraud Homicide Motor Vehicle Theft Robbery Sex Crimes Theft / Larceny Vandalism Vehicle Break-In / Theft Weapons Sex Offender Sexual Predator * Data not provided by agency within map extent Location Selection Enter an Address, Feature or Location. Choose a Search Distance 500 feet 1000 feet 1500 feet 1/4 mile 1/2 mile 1 mile 2 miles Apply Remove Location Filter Timeframe Settings From how far back would you like to see records? **Note** This will not apply to Sex Offender data. Yesterday Previous 3 Days Previous Week Previous 4 Weeks Custom Time Range From: select Monday, March 18, 2024 To: select Sunday, March 24, 2024 Apply " -3540,"https://cityprotect.com/map/list/agencies/5ce2bd9e3934cc0011edac8d?toDate=2020-06-10T23:59:59.999Z&fromDate=2020-06-07T00:00:00.000Z&pageSize=2000&parentIncidentTypeIds=149,150,148,8,97,104,165,98,100,179,178,180,101,99,103,163,168,166,12,161,14,16,15&zoomLevel=13&latitude=40.722813032254074&longitude=-74.15492079233789&days=1,2,3,4,5,6,7&startHour=0&endHour=24&timezone=%2B00:00",Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -3541,https://www.okc.gov/departments/police/contact-us,Contact Info & Agency Meta,Info About Agencies,"","",-1,"","","","","","","","" -3542,https://filetransfer.nashville.gov/portals/0/sitecontent/Police/docs/Administrative%20Svcs/MNPD%20Basic%20Course%20Curriculum.pdf,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3543,https://data.nola.gov/Public-Safety-and-Preparedness/Calls-for-Service-2021/3pha-hum9,Calls for Service,Police & Public Interactions,Calls for Service 2021 | Data.NOLA.gov,"",200," - Home - DataDriven - City of New Orleans -","[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Calls for Service 2021"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Calls for Service 2021"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Attachments"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -3545,https://www.nassaucountyny.gov/4913/Use-of-Force-Policy,Policies & Contracts,Info About Agencies,"Use of Force Policy | Nassau County, NY - Official Website",Use of Force Policy,200,"Nassau County, NY - Official Website | Official Website","[""Use of Force Policy""]",[],"[""Loading""]",[],[],[],Skip to Main Content -3546,https://www1.cityoforlando.net/opd/activecalls/activecadpolice.xml,Calls for Service,Police & Public Interactions,Orlando Police Department: Dispatched Calls For Service,"",200,403 - Forbidden: Access is denied.,"[""Active Calls For Service""]",[],[],[],[],[],"" -3547,https://mayors-office.cityofomaha.org/2-uncategorised/235-citizen-complaint-review-board,Complaints & Misconduct,Info About Officers,"","",503,"","","","","","","","" -3548,https://police.cityofomaha.org/contact-us,Contact Info & Agency Meta,Info About Agencies,"Omaha Police Department - {""title"":"""",""defcontact"":""1"",""header"":""

Contact Us<\/h1>"",""footer"":"""",""menu-anchor_title"":"""",""menu-anchor_css"":"""",""menu_image"":"""",""menu_text"":1,""page_title"":"""",""show_page_heading"":0,""page_heading"":"""",""pageclass_sfx"":"""",""menu-meta_description"":"""",""menu-meta_keywords"":"""",""robots"":"""",""secure"":0}","{""title"":"""",""defcontact"":""1"",""header"":""

Contact Us<\/h1>"",""footer"":"""",""menu-anchor_title"":"""",""menu-anchor_css"":"""",""menu_image"":"""",""menu_text"":1,""page_title"":"""",""show_page_heading"":0,""page_heading"":"""",""pageclass_sfx"":"""",""menu-meta_description"":"""",""menu-meta_keywords"":"""",""robots"":"""",""secure"":0}",200,Access Denied,"[""OMAHA POLICE DEPARTMENT Omaha, Nebraska""]","[""Contact Us""]","[""Mobile Menu"", ""News and Information"", ""Precinct Map"", ""Precinct Locations""]","[""LGBTQ+ Community Liaison"", ""Omaha Police Department"", ""Hours""]",[],[],"An official website of the City of Omaha, Nebraska. An official website of the City of Omaha, Nebraska. An official website of the City of Omaha, Nebraska. OMAHA POLICE DEPARTMENT Omaha, Nebraska How Do I? Commend An Officers Actions Report an Incident / File a Police Report Report A Traffic Accident Report A Non Emergency Incident Apply To Be A Police Officer Look Up Warrants Find Crime Statistics Complete a Background Check Complete Finger Printing File A Complaint Search GO Trending: WARRANTS JOIN OPD IMPOUND SEARCH Powered by Translate Select Language English Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sudanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Skip Navigation Facebook Twitter Linkedin Youtube Instagram OMAHA POLICE DEPARTMENT Omaha, Nebraska How Do I? Commend An Officers Actions Report an Incident / File a Police Report Report A Traffic Accident Report A Non Emergency Incident Apply To Be A Police Officer Look Up Warrants Find Crime Statistics Complete a Background Check Complete Finger Printing File A Complaint Search GO Trending: WARRANTS JOIN OPD IMPOUND SEARCH Powered by Translate Select Language English Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sudanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Skip Navigation Facebook Twitter Linkedin Youtube Instagram " -3549,https://www.phillypolice.com/accountability/?_ID=110&_ClassName=CapPage#!#complaints,Complaints & Misconduct,Info About Officers,Accountability | Philadelphia Police Department,"",200,Philadelphia Police Department | Philadelphia Police Department,"[""Accountability""]","[""Open and Accountable"", ""Directives"", ""Public Presentations"", ""Complaints Against Police (CAP)""]","[""Accountability"", ""Police Reform Reports"", ""Officer Involved Shootings"", ""Navigation"", ""About""]","[""Overview"", ""Police Reform Reports"", ""Officer Involved Shootings"", ""Directives"", ""Presentations"", ""Complaints Against Police (CAP)"", ""Strategies, Initiatives, and Events"", ""News"", ""Districts"", ""Accountability"", ""Programs & Services"", ""Forms"", ""Crime Maps & Stats"", ""PPD Digital"", ""Careers"", ""Search""]","[""Crime Prevention & Violence Reduction Action Plan""]",[],"" -3550,https://data.cityoforlando.net/Orlando-Police/OPD-Response-to-Resistance-Data-Lens/46mp-aizb,Use of Force Reports,Police & Public Interactions,"","",404,"","","","","","","","" -3551,https://www.phillypolice.com/ois/,Officer Involved Shootings,Police & Public Interactions,Officer Involved Shootings | Philadelphia Police Department,"",200,Philadelphia Police Department | Philadelphia Police Department,"[""COMMISSIONER’S MESSAGE""]",[],"[""USE OF FORCE DIRECTIVES"", ""WHAT IS AN OFFICER INVOLVED SHOOTING"", ""INDIVIDUAL SHOOTING SUMMARIES"", ""About""]","[""When is Deadly Force Used?"", ""Why We Post Officer Involved Shooting (OIS) Information"", ""What You Will Find on this Page"", ""Training Procedures"", ""Directives"", ""CITYWIDE VIOLENT CRIME"", ""Officer Involved Shootings by Year""]",[],[],News Districts Accountability Programs & Services Forms & Reports Crime Stats Careers News Districts Accountability Programs & Services Forms & Reports Crime Stats Careers News Districts Accountability Programs & Services Forms & Reports Crime Stats Careers Officer Involved Shootings Officer Involved Shootings Home Accountability Officer Involved Shootings -3552,https://www.phoenixopendata.com/dataset/calls-for-service,Calls for Service,Police & Public Interactions,Calls for Service - Dataset - City of Phoenix Open Data,"",200,Welcome - City of Phoenix Open Data,"[""Calls for Service"", ""Police"", ""Calls for Service""]","[""Department"", ""Social"", ""License"", ""Data and Resources""]","[""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Search Datasets Home Departments Police Calls for Service Calls for Service Followers 6 Department Police Mission: The Phoenix Police Department is committed to providing the citizens of Phoenix with quality and professional law enforcement services. Our vision is to make Phoenix... read more Social Twitter Facebook Linkedin License Open Data Commons Attribution License Dataset Groups Showcases Activity Stream Calls for Service A CSV file which is updated daily by 11am that includes police calls for service from November 1st, 2015 forward through 7 days prior to today's posting date. All citizen-generated dispatched calls for police service are included. Officer self-initiated calls and non dispatched calls such as calls for general information or calls that are transferred to other departments such as FIRE for response are not included. Data and Resources CALLS FOR SERVICE CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2016 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2017 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2018 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2019 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2020 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2021 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2022 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2023 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2024 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download Additional Info Field Value Last Updated March 25, 2024, 8:45 AM (UTC-04:00) Created April 14, 2017, 5:50 PM (UTC-04:00) " -3553,https://www.opendataphilly.org/dataset?q=crime+map&sort=score+desc%2C+metadata_modified+desc,Crime Maps & Reports,Agency-Published Resources,"","",404,"","","","","","","","" -3554,https://data.cityoforlando.net/Orlando-Police/OPD-Officer-Involved-Shootings/6kz6-6c7n,Officer Involved Shootings,Police & Public Interactions,OPD Officer-Involved Shootings | City of Orlando Open Data Portal,"",200,City of Orlando Open Data Portal | City of Orlando Open Data Portal,"[""Officers and Suspects Involved in Officer-Involved Shootings"", ""Untitled Visualization - Based on OPD Officer-Involved Shootings"", ""Untitled Visualization - Based on OPD Officer-Involved Shootings"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""OPD Officer-Involved Shootings"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""OPD Officer-Involved Shootings"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Orlando Police Department Open Data Initiative …"", ""Officers and Suspects Involved in Officer-Involved… …"", ""Topics"", ""Orlando Police Department Open Data Initiative …"", ""Officers and Suspects Involved in Officer-Involved Shootings …""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home Catalog User’s guide Developer Sign In Menu Menu Close Home Catalog User’s guide Developer Sign In Search Search Home Catalog User’s guide Developer Sign In Menu Search Search Search Search Home Catalog User’s guide Developer Sign In Menu Home Catalog User’s guide Developer Sign In Menu Home Catalog User’s guide Developer Home Catalog User’s guide Developer Sign In Sign In Menu Close Home Catalog User’s guide Developer Sign In Search Home Catalog User’s guide Developer Sign In Search Home Catalog User’s guide Developer Sign In Search Search -3555,https://www.phillypolice.com/assets/directives/D10.3-UseOfLessLethalForce.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3556,https://www.orlando.gov/Our-Government/Departments-Offices/Orlando-Police-Department/Policies-and-Procedures/Police-Operations,Policies & Contracts,Info About Agencies,Police Operations - City of Orlando,"",200,Home - City of Orlando,"[""Police Operations""]",[],"[""City Hall Info"", ""Contact Us"", ""Be Social"", ""Footer bottom notices""]",[],[],[],opens in new tab or window -3557,https://www.phillypolice.com/assets/directives/D6.9-SelectionAndTraining.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3558,https://www.crimemapping.com/map/agency/271,Crime Maps & Reports,Agency-Published Resources,CrimeMapping.com - Helping You Build a Safer Community,"",200,CrimeMapping.com - Helping You Build a Safer Community,"[""My Map Summary"", ""What"", ""Where"", ""When"", ""Display Options"", ""Location Selection"", ""Choose a Search Distance"", ""Timeframe Settings"", ""From:"", ""To:""]",[],[],[],[],[],"Preparing Map Content... Preparing Map Content... Receive Alerts Go 0 Records Date Range: Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Zoom to Receive Alerts Receive Alerts Go 0 Records Date Range: Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Zoom to Distance: Miles select Distance: Miles select Streets select Zoom to Zoom to Zoom to Zoom to Zoom to Zoom to Zoom to Fetching Data. x Close Fetching Data. Fetching Data. Fetching Data. x Close Share This Map My Map Summary The sum of the What, Where, When you’ve chosen. What * Data not provided by agency within map extent Where Broward County Police Boundary Agency Filter: Agency Name Here When Previous 7 Days Friday, May 1 - Friday, May 8 Restore Defaults Display Options What type(s) of records would you like to see? Select All | Deselect All Arson Assault Burglary Disturbing the Peace Drugs / Alcohol Violations DUI Fraud Homicide Motor Vehicle Theft Robbery Sex Crimes Theft / Larceny Vandalism Vehicle Break-In / Theft Weapons Sex Offender Sexual Predator * Data not provided by agency within map extent Location Selection Enter an Address, Feature or Location. Choose a Search Distance 500 feet 1000 feet 1500 feet 1/4 mile 1/2 mile 1 mile 2 miles Apply Remove Location Filter Timeframe Settings From how far back would you like to see records? **Note** This will not apply to Sex Offender data. Yesterday Previous 3 Days Previous Week Previous 4 Weeks Custom Time Range From: To: Apply " -3559,https://www.phillypolice.com/about/contact/,Contact Info & Agency Meta,Info About Agencies,Contact | Philadelphia Police Department,"",200,Error retrieving title: dictionary changed size during iteration,"[""Contact""]","[""Emergency"", ""Non-Emergency"", ""Commissioner's Office"", ""Police Districts"", ""Search""]","[""About the Department"", ""About""]","[""Mission"", ""Leadership"", ""Partners"", ""Fallen Officers"", ""Contact"", ""Press Inquiries""]",[],[],"News Districts Accountability Programs & Services Forms & Reports Crime Stats Careers Contact About the Department Mission Leadership Partners Fallen Officers Contact Press Inquiries Contact About the Department Mission Leadership Partners Fallen Officers Contact Press Inquiries Additional contacts including special victims, homicide, detective divisions, etc. Emergency 911 Non-Emergency 311 Commissioner's Office To reach the Police Commissioner's Office, email police.commissioner@phila.gov or call 215.686.3280. Police Districts For district contact information, please find your district . News Districts Accountability Programs & Services Forms & Reports Crime Stats Careers News Districts Accountability Programs & Services Forms & Reports Crime Stats Careers News Districts Accountability Programs & Services Forms & Reports Crime Stats Careers Contact Contact About the Department Mission Leadership Partners Fallen Officers Contact Press Inquiries Contact About the Department Mission Leadership Partners Fallen Officers Contact Press Inquiries Additional contacts including special victims, homicide, detective divisions, etc. Emergency 911 Non-Emergency 311 Commissioner's Office To reach the Police Commissioner's Office, email police.commissioner@phila.gov or call 215.686.3280. Police Districts For district contact information, please find your district . About the Department Mission Leadership Partners Fallen Officers Contact Press Inquiries Contact Additional contacts including special victims, homicide, detective divisions, etc. Emergency 911 Non-Emergency 311 Commissioner's Office To reach the Police Commissioner's Office, email police.commissioner@phila.gov or call 215.686.3280. Police Districts For district contact information, please find your district . Additional contacts including special victims, homicide, detective divisions, etc. Emergency 911 Non-Emergency 311 Commissioner's Office To reach the Police Commissioner's Office, email police.commissioner@phila.gov or call 215.686.3280. Police Districts For district contact information, please find your district . City of Philadelphia • Mayor's Office • City Council • Courts • District Attorney Contact Police Headquarters 400 N. Broad Street Philadelphia, PA 19130 TIPS DIAL OR TEXT 215.686.TIPS (8477) EMERGENCY 911 NON-EMERGENCY 311 FILE A POLICE REPORT Dial 911 or visit your district headquarters Media Inquiries police.public_affairs@phila.gov About About the Department Mission Leadership Fallen Officers Partners Press Inquiries Contact Tweets by PhillyPolice HONOR • SERVICE • INTEGRITY © 2010-2022 Philadelphia Police Department Contact Police Headquarters 400 N. Broad Street Philadelphia, PA 19130 TIPS DIAL OR TEXT 215.686.TIPS (8477) EMERGENCY 911 NON-EMERGENCY 311 FILE A POLICE REPORT Dial 911 or visit your district headquarters Media Inquiries police.public_affairs@phila.gov About About the Department Mission Leadership Fallen Officers Partners Press Inquiries Contact Tweets by PhillyPolice Contact Police Headquarters 400 N. Broad Street Philadelphia, PA 19130 TIPS DIAL OR TEXT 215.686.TIPS (8477) EMERGENCY 911 NON-EMERGENCY 311 FILE A POLICE REPORT Dial 911 or visit your district headquarters Media Inquiries police.public_affairs@phila.gov Contact Police Headquarters 400 N. Broad Street Philadelphia, PA 19130 TIPS DIAL OR TEXT 215.686.TIPS (8477) EMERGENCY 911 NON-EMERGENCY 311 FILE A POLICE REPORT Dial 911 or visit your district headquarters Media Inquiries police.public_affairs@phila.gov Contact Police Headquarters 400 N. Broad Street Philadelphia, PA 19130 TIPS DIAL OR TEXT 215.686.TIPS (8477) EMERGENCY 911 NON-EMERGENCY 311 EMERGENCY 911 NON-EMERGENCY 311 About About the Department Mission Leadership Fallen Officers Partners Press Inquiries Contact Tweets by PhillyPolice " -3560,https://www.orlando.gov/files/sharedassets/public/documents/opd/policies-and-procedures/police-operations/1128.17-response-to-resistance-and-apprehension-techniques.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3561,https://data.cityoforlando.net/Orlando-Police/OPD-Crimes/4y9m-jbmz,Crime Statistics,Agency-Published Resources,"","",500,"","","","","","","","" -3562,https://data.cityoforlando.net/browse,List of Data Sources,Info About Agencies,Search & Browse | Page 1 of 9 | City of Orlando Open Data Portal,"",200,City of Orlando Open Data Portal | City of Orlando Open Data Portal,"[""Tags""]","[""Menu"", ""Sort"", ""Sort by Most Relevant"", ""Filter"", ""Authority"", ""Categories"", ""View Types"", ""Tags"", ""Orlando City Limits"", ""Permit Applications"", ""OPD Officer-Involved Shootings"", ""Business Tax Receipts"", ""City Owned Vacant Lots"", ""Permit Applications for the past 365 days"", ""Neighborhoods"", ""BEWES Building Data"", ""Construction Value for Permits Issued in the past 30 days"", ""Orlando Streets"", ""A-Z""]",[],[],[],[],Skip to main content Skip to footer links -3563,https://www.okc.gov/home/showpublisheddocument/26202/637756747537030000,Policies & Contracts,Info About Agencies,"","",-1,"","","","","","","","" -3564,https://public.powerdms.com/OPDEP1/tree,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by -3565,https://www.opendataphilly.org/dataset/arrests,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -3566,https://police.cityofomaha.org/crime-informatioNAnnual-reports,Complaints & Misconduct,Info About Officers,"","",404,"","","","","","","","" -3567,https://www.orlando.gov/Our-Government/Departments-Offices/Orlando-Police-Department/Policies-and-Procedures/Training,Policies & Contracts,Info About Agencies,Training - City of Orlando,"",200,Home - City of Orlando,"[""Training""]",[],"[""City Hall Info"", ""Contact Us"", ""Be Social"", ""Footer bottom notices""]",[],[],[],opens in new tab or window -3568,https://www.opendataphilly.org/dataset/crime-incidents,Crime Statistics,Agency-Published Resources,"","",404,"","","","","","","","" -3569,https://www.orlando.gov/Our-Government/Departments-Offices/Orlando-Police-Department,Contact Info & Agency Meta,Info About Agencies,Orlando Police Department - City of Orlando,"OPD is a nationally recognized law enforcement agency that is focused on the safety of our residents, visitors, and businesses. Our job is to protect the citizens of Orlando and we intend to accomplish that mission, even at risk to our own lives.",200,Home - City of Orlando,"[""Orlando Police Department""]","[""OPD Services"", ""OPD Initiatives"", ""Department Head"", ""Administrative Services Bureau"", ""Chief’s Staff"", ""Investigative Services Bureau"", ""Media Relations"", ""Patrol Services Bureau"", ""Special Services Bureau"", ""Contact Us"", ""Custodian of Records"", ""Upcoming Events"", ""Women's Self Defense Class - OPD Headquarters"", ""OPD Hiring Event in Atlanta"", ""Leadership Contact"", ""Citizen Advisory Boards"", ""Follow OPD on Social Media"", ""Related Information""]","[""Report a Crime"", ""OPD Records & Open Data"", ""Compliment an OPD Officer"", ""File a Complaint About an OPD Officer"", ""Community Engagement"", ""OPD Community Newsletter"", ""Careers at the Orlando Police Department"", ""Domestic Violence"", ""Eric D. Smith, Orlando Police Chief"", ""Phone"", ""Emergency"", ""Location"", ""Hours"", ""City Hall Info"", ""Contact Us"", ""Be Social"", ""Footer bottom notices""]",[],[],[],opens in new tab or window -3570,https://police.cityofomaha.org/crime-information/incident-data-download,Crime Statistics,Agency-Published Resources,Omaha Police Department - Incident Data Download,"This is the official web site of the Omaha Police Department located in Omaha, Nebraska. ",200,Access Denied,"[""OMAHA POLICE DEPARTMENT Omaha, Nebraska""]","[""Incident Data Download""]","[""Mobile Menu"", ""News and Information"", ""Precinct Locations""]","[""LGBTQ+ Community Liaison""]",[],[],"An official website of the City of Omaha, Nebraska. An official website of the City of Omaha, Nebraska. An official website of the City of Omaha, Nebraska. OMAHA POLICE DEPARTMENT Omaha, Nebraska How Do I? Commend An Officers Actions Report an Incident / File a Police Report Report A Traffic Accident Report A Non Emergency Incident Apply To Be A Police Officer Look Up Warrants Find Crime Statistics Complete a Background Check Complete Finger Printing File A Complaint Search GO Trending: WARRANTS JOIN OPD IMPOUND SEARCH Select Language English Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sudanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Skip Navigation Facebook Twitter Linkedin Youtube Instagram OMAHA POLICE DEPARTMENT Omaha, Nebraska How Do I? Commend An Officers Actions Report an Incident / File a Police Report Report A Traffic Accident Report A Non Emergency Incident Apply To Be A Police Officer Look Up Warrants Find Crime Statistics Complete a Background Check Complete Finger Printing File A Complaint Search GO Trending: WARRANTS JOIN OPD IMPOUND SEARCH Select Language English Afrikaans Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sudanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Skip Navigation Facebook Twitter Linkedin Youtube Instagram " -3571,https://www.phoenixopendata.com/dataset/crime-data,Crime Statistics,Agency-Published Resources,Crime Data - Dataset - City of Phoenix Open Data,"",200,Welcome - City of Phoenix Open Data,"[""Crime Data"", ""Police"", ""Crime Data""]","[""Department"", ""Social"", ""License"", ""Data and Resources""]","[""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Search Datasets Home Departments Police Crime Data Crime Data Followers 8 Department Police Mission: The Phoenix Police Department is committed to providing the citizens of Phoenix with quality and professional law enforcement services. Our vision is to make Phoenix... read more Social Twitter Facebook Linkedin License Open Data Commons Attribution License Dataset Groups Showcases Activity Stream Crime Data A CSV file which is updated daily by 11am and includes crime incidents from November 1st, 2015 forward through 7 days prior to today's posting date. Homicides, rapes, robberies, aggravated assaults, burglaries, thefts, motor vehicle thefts, arsons, and drug offenses are included (based on the primary offense listed for each incident). Data and Resources CRIME DATA CSV Popular A CSV File which is updated daily by 11am and includes incidents from... Explore Preview Download Additional Info Field Value Last Updated March 25, 2024, 8:42 AM (UTC-04:00) Created April 14, 2017, 5:50 PM (UTC-04:00) Home Departments Police Crime Data Crime Data Followers 8 Department Police Mission: The Phoenix Police Department is committed to providing the citizens of Phoenix with quality and professional law enforcement services. Our vision is to make Phoenix... read more Social Twitter Facebook Linkedin License Open Data Commons Attribution License Dataset Groups Showcases Activity Stream Crime Data A CSV file which is updated daily by 11am and includes crime incidents from November 1st, 2015 forward through 7 days prior to today's posting date. Homicides, rapes, robberies, aggravated assaults, burglaries, thefts, motor vehicle thefts, arsons, and drug offenses are included (based on the primary offense listed for each incident). Data and Resources CRIME DATA CSV Popular A CSV File which is updated daily by 11am and includes incidents from... Explore Preview Download Additional Info Field Value Last Updated March 25, 2024, 8:42 AM (UTC-04:00) Created April 14, 2017, 5:50 PM (UTC-04:00) Home Departments Police Crime Data Crime Data Followers 8 Department Police Mission: The Phoenix Police Department is committed to providing the citizens of Phoenix with quality and professional law enforcement services. Our vision is to make Phoenix... read more Social Twitter Facebook Linkedin License Open Data Commons Attribution License Dataset Groups Showcases Activity Stream Crime Data A CSV file which is updated daily by 11am and includes crime incidents from November 1st, 2015 forward through 7 days prior to today's posting date. Homicides, rapes, robberies, aggravated assaults, burglaries, thefts, motor vehicle thefts, arsons, and drug offenses are included (based on the primary offense listed for each incident). Data and Resources CRIME DATA CSV Popular A CSV File which is updated daily by 11am and includes incidents from... Explore Preview Download Additional Info Field Value Last Updated March 25, 2024, 8:42 AM (UTC-04:00) Created April 14, 2017, 5:50 PM (UTC-04:00) Crime Data Followers 8 Crime Data Followers 8 " -3572,https://www.phoenixopendata.com/dataset/officer-involved-shooting-incidents,Officer Involved Shootings,Police & Public Interactions,"","",404,"","","","","","","","" -3573,https://www.providenceri.gov/pera/,Complaints & Misconduct,Info About Officers,City of Providence Providence External Review Authority (PERA) - City of Providence,"",200,Sucuri WebSite Firewall - Access Denied,[],"[""PERA Description"", ""Mission Statement"", ""Ordinance and By Laws"", ""PERA Board"", ""Staff"", ""Reports"", ""Updates"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español"", ""Lists *""]",[],[],[],Skip To Menu Skip To Content Skip To Accessibility Options Language Language Arabic Chinese (Traditional) English Khemer Portuguese Spanish City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley City Of Providence Mayor Brett Smiley Search Accessibility CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation PVD 311 CITY HALL I Want to … MAYOR BRETT P. SMILEY Departments City Council Find a Meeting Agenda Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Running a Business Starting a Business Purchasing EVENTS NEWS EXPLORE Explore Providence Parks Recreation ACCESSIBILITY -3574,https://data.cityofsacramento.org/datasets/9efe7653009b448f8d177c1da0cc068f_0/explore?location=38.582000%2C-121.494000%2C11.85,Calls for Service,Police & Public Interactions,City of Sacramento Open Data,City of Sacramento Open Data Site,200,City of Sacramento Open Data,[],[],[],[],[],[],"" -3575,https://portlandor.govqa.us/WEBAPP/_rs/(S(mygsjcixtqgkcvvr2lmmws2j))/BusinessDisplay.aspx?sSessionID=&did=45&cat=0,Policies & Contracts,Info About Agencies,CITY OF PORTLAND REQUEST PUBLIC RECORDS,"",200,500 - Internal server error.,[],"[""2018 State Basic MRT/RRT Training""]","[""Public Records Menu"", ""FAQ See All FAQs""]","[""City of Portland"", ""Site Menu"", ""Access""]",[],[],"Portland, Oregon General Information: 503-823-4000 E-mail: cityinfo@portlandoregon.gov 1221 SW 4th Avenue, Room 110 , Portland , OR 97204 More Contact Info Portland, Oregon General Information: 503-823-4000 E-mail: cityinfo@portlandoregon.gov 1221 SW 4th Avenue, Room 110 , Portland , OR 97204 More Contact Info Portland, Oregon General Information: 503-823-4000 E-mail: cityinfo@portlandoregon.gov 1221 SW 4th Avenue, Room 110 , Portland , OR 97204 More Contact Info Portland, Oregon General Information: 503-823-4000 E-mail: cityinfo@portlandoregon.gov 1221 SW 4th Avenue, Room 110 , Portland , OR 97204 More Contact Info General Information: 503-823-4000 E-mail: cityinfo@portlandoregon.gov 1221 SW 4th Avenue, Room 110 , Portland , OR 97204 More Contact Info General Information: 503-823-4000 E-mail: cityinfo@portlandoregon.gov Menu Back to PortlandOregon.gov Public Records Home FAQs Submit a Request My Request Center Maps, GIS & Open Data BDS Permit/Case Search E-Files City Historical Records BDS Public Records Access Public Records Menu Back to PortlandOregon.gov Public Records Home FAQs Submit a Request My Request Center Maps, GIS & Open Data BDS Permit/Case Search E-Files City Historical Records BDS Public Records Access FAQ See All FAQs Frequently Asked Questions Summary Help with Public Records Requests Problems Making Online Payments - Pop-Up Blocker What will my request cost? What is the status of my request? What is the City's refund policy for payments for Public Records Requests? Business Display Menu ▼ Home Find Information Submit Request My Public Records Center Help Home Find Information Submit Request My Public Records Center Help 2018 State Basic MRT/RRT Training Description Receive updates when new information is posted. Information Records Protest & Riot History PowerPoint Presentation PowerPoint Document Click here to access this record Session Timeout WARNING: You will be logged out in 0 minute(s) due to inactivity. Keep Working TIMEOUT: You have been logged out due to inactivity. Login Menu Back to PortlandOregon.gov Public Records Home FAQs Submit a Request My Request Center Maps, GIS & Open Data BDS Permit/Case Search E-Files City Historical Records BDS Public Records Access Public Records Menu Back to PortlandOregon.gov Public Records Home FAQs Submit a Request My Request Center Maps, GIS & Open Data BDS Permit/Case Search E-Files City Historical Records BDS Public Records Access FAQ See All FAQs Frequently Asked Questions Summary Help with Public Records Requests Problems Making Online Payments - Pop-Up Blocker What will my request cost? What is the status of my request? What is the City's refund policy for payments for Public Records Requests? Business Display Menu ▼ Home Find Information Submit Request My Public Records Center Help Home Find Information Submit Request My Public Records Center Help 2018 State Basic MRT/RRT Training Description Receive updates when new information is posted. Information Records Protest & Riot History PowerPoint Presentation PowerPoint Document Click here to access this record Session Timeout WARNING: You will be logged out in 0 minute(s) due to inactivity. Keep Working TIMEOUT: You have been logged out due to inactivity. Login " -3576,https://www.portlandoregon.gov/police/76454,Calls for Service,Police & Public Interactions,Sign-In Form,"",200,Error retrieving title: dictionary changed size during iteration,"[""The City of Portland, Oregon"", ""Sign-In""]",[],"[""New to PortlandOregon.gov?""]",[],[],[],"The City of Portland, Oregon The City of Portland, Oregon Sign-In PortlandOregon.gov User Name You can also use your registered e-mail address. Password Password is case sensitive. Forgot your user name or password? Save Login Yes No Selecting ""Yes"" will allow you to bypass the login prompt in the future on your current computer. New to PortlandOregon.gov? If you want to sign in, you'll need to create an account and register first. Creating an account is fast and secure. It will give you access to new areas of PortlandOregon.gov, such as subscriptions, event registration, and content catered to your interests. Create a New Account Trouble signing in? You can have your account information e-mailed to you if you have forgotten your user account or password . Sign-In PortlandOregon.gov User Name You can also use your registered e-mail address. Password Password is case sensitive. Forgot your user name or password? Save Login Yes No Selecting ""Yes"" will allow you to bypass the login prompt in the future on your current computer. New to PortlandOregon.gov? If you want to sign in, you'll need to create an account and register first. Creating an account is fast and secure. It will give you access to new areas of PortlandOregon.gov, such as subscriptions, event registration, and content catered to your interests. Create a New Account Trouble signing in? You can have your account information e-mailed to you if you have forgotten your user account or password . PortlandOregon.gov User Name You can also use your registered e-mail address. Password Password is case sensitive. Forgot your user name or password? Save Login Yes No Selecting ""Yes"" will allow you to bypass the login prompt in the future on your current computer. PortlandOregon.gov User Name You can also use your registered e-mail address. Password Password is case sensitive. Forgot your user name or password? Save Login Yes No Selecting ""Yes"" will allow you to bypass the login prompt in the future on your current computer. New to PortlandOregon.gov? If you want to sign in, you'll need to create an account and register first. Creating an account is fast and secure. It will give you access to new areas of PortlandOregon.gov, such as subscriptions, event registration, and content catered to your interests. Create a New Account Trouble signing in? You can have your account information e-mailed to you if you have forgotten your user account or password . Copyright © 2024 City of Portland - Disclaimer & Privacy Policy Copyright © 2024 City of Portland - Disclaimer & Privacy Policy " -3577,https://tableau.alleghenycounty.us/t/PublicSite/views/CJ_UCR_PGH_8-22-17_v3/Home_1?iframeSizedToWindow=true&:embed=y&:showAppBanner=false&:display_count=no&:showVizHome=no&:origin=viz_share_link,Crime Statistics,Agency-Published Resources,Workbook: Crime in the City of Pittsburgh,"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],[],[],[],[],[],"Unexpected Error An unexpected error occurred. If you continue to receive this error please contact your Tableau Server Administrator. Unexpected Error An unexpected error occurred. If you continue to receive this error please contact your Tableau Server Administrator. Unexpected Error An unexpected error occurred. If you continue to receive this error please contact your Tableau Server Administrator. {""revisionInfo"":null,""facebookAppID"":""242391562456920"",""allow_select"":true,""allow_filter"":true,""allow_sheetlink"":true,""allow_highlight"":true,""allow_tooltip"":true,""allow_view_underlying"":false,""allow_summary"":true,""allow_commenting"":true,""allow_commenting_mentions"":true,""allow_add_comment"":false,""allow_view_comments"":true,""allow_connected_experience"":false,""allow_custom_views"":true,""allow_custom_view_default"":false,""allow_custom_view_share"":false,""allow_custom_view_save"":false,""allow_authoring"":false,""allow_data_alert"":false,""allow_view_data_alerts"":false,""allow_metrics_button"":false,""allow_create_metric"":false,""allow_create_refresh_metrics"":false,""allow_explain_data"":true,""allow_delete_comment"":true,""allow_cataloging"":false,""allow_named_sharing"":true,""allow_personal_space_only"":false,""allow_save"":false,""allow_save_as"":false,""allow_save_data_source"":false,""allow_subscriptions"":false,""workbook_allow_subscriptions"":false,""allow_subscribe_others"":false,""allow_subscription_attachments"":true,""allow_add_new_datasource"":false,""allow_export_image"":true,""allow_export_data"":true,""workbook_owner_friendly_name"":""Bialik, Logan"",""is_guest"":true,""is_admin"":false,""is_request_access_enabled"":true,""is_revision_history_preview"":false,""current_user_email"":null,""current_user_id"":2708,""current_user_friendly_name"":""Guest"",""current_user_domain_name"":""local"",""current_user_name"":""guest"",""current_user_image_url"":null,""current_user_nlp_help_center_stage"":null,""current_custom_view_id"":null,""current_custom_view_name"":null,""current_custom_view_created_by_feature"":null,""disableUrlActionsPopups"":false,""vizql_root"":""/vizql/t/PublicSite/w/CJ_UCR_PGH_8-22-17_v3/v/Home_1"",""site_root"":""/t/PublicSite"",""site_url_name"":""PublicSite"",""site_name"":""Public Site"",""site_luid"":""fc879854-c416-46d0-80ee-4e4d96493a84"",""is_ask_data_disabled_for_site"":false,""is_data_monitoring_ui_enabled"":false,""composite_sizes"":{""tablet"":{""maxHeight"":950,""maxWidth"":1300,""minHeight"":950,""minWidth"":1300},""desktop"":{""maxHeight"":950,""maxWidth"":1300,""minHeight"":950,""minWidth"":1300},""phone"":{""maxHeight"":950,""maxWidth"":1300,""minHeight"":950,""minWidth"":1300},""phoneAutogen"":{""maxHeight"":950,""maxWidth"":1300,""minHeight"":950,""minWidth"":1300}},""view_sizes"":{""Data and Definitions"":{""tablet"":{""maxHeight"":950,""maxWidth"":1300,""minHeight"":950,""minWidth"":1300},""desktop"":{""maxHeight"":950,""maxWidth"":1300,""minHeight"":950,""minWidth"":1300},""phone"":{""maxHeight"":950,""maxWidth"":1300,""minHeight"":950,""minWidth"":1300},""phoneAutogen"":{""maxHeight"":950,""maxWidth"":1300,""minHeight"":950,""minWidth"":1300}},""Home "":{""tablet"":{""maxHeight"":900,""maxWidth"":1169,""minHeight"":900,""minWidth"":1169},""desktop"":{""maxHeight"":900,""maxWidth"":1169,""minHeight"":900,""minWidth"":1169},""phone"":{""maxHeight"":900,""maxWidth"":1169,""minHeight"":900,""minWidth"":1169},""phoneAutogen"":{""maxHeight"":900,""maxWidth"":1169,""minHeight"":900,""minWidth"":1169}}},""dsd_phone_max_size"":500,""dsd_tablet_max_size"":800,""visible_sheets"":[""Home "",""Data and Definitions""],""is_mobile"":false,""is_mobile_user_agent"":false,""is_mobile_app"":false,""is_on_prem_deep_linking_enabled"":false,""is_authoring"":false,""is_viewDataClient"":false,""is_metrics_authoring"":false,""is_metrics_view"":false,""is_metrics_enabled"":false,""is_web_zones_enabled"":true,""is_mark_animation_enabled"":true,""is_mark_animation_enabled_for_server"":true,""repository_urls"":[""CJ_UCR_PGH_8-22-17_v3/Home_1"",""CJ_UCR_PGH_8-22-17_v3/DataandDefinitions""],""origin_repository_url"":""CJ_UCR_PGH_8-22-17_v3/Home_1"",""workbook_repo_url"":""CJ_UCR_PGH_8-22-17_v3"",""external_workbook_url"":""https://tableau.alleghenycounty.us/#/site/PublicSite/workbooks/827/views"",""tabs_allowed"":false,""showTabsWorkbook"":true,""current_project_id"":100,""current_location"":null,""current_sheet_name"":"""",""current_sheet_type"":""dashboard"",""current_workbook_id"":827,""current_workbook_luid"":""718a3b1c-d923-43c7-848c-76e65900b81b"",""current_workbook_twbx_size"":17762546,""has_nlp_permitted_datasources"":false,""current_view_id"":""14900"",""current_view_luid"":""9d259d9c-0c73-441a-9c6a-e176dc2bb3a7"",""sheetId"":""Home%20"",""showParams"":""{\""checkpoint\"":false,\""refresh\"":false,\""refreshUnmodified\"":false,\""unknownParams\"":\""iframeSizedToWindow=true\""}"",""stickySessionKey"":""{\""capabilities\"":\""4500f0180010\"",\""dataserverPermissions\"":\""44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a\"",\""featureFlags\"":\""{}\"",\""isAuthoring\"":false,\""isOfflineMode\"":false,\""lastUpdatedAt\"":1710918124323,\""unknownParamsHash\"":\""1bf5ac93aa0a72a903471c2752ecec699c57d9eae92d942396c4e9962bd480ff\"",\""wgSession\"":\""k_JMCYckT1SCpf68eNCcBA\"",\""workbookId\"":827}"",""filterTileSize"":200,""locale"":""en_US"",""user" -3578,https://www.cityofsacramento.org/Police/Crime,Crime Statistics,Agency-Published Resources,Police Department | City of Sacramento,Sacramento Police Department,200,Home | City of Sacramento,"[""Sacramento Police Department""]","[""About"", ""Your SacPD"", ""Index"", ""Social Media""]","[""Search for content"", ""News and Information"", ""Reporting"", ""Popular Services"", ""More"", ""Call our Non-Emergency Number: 916-808-5471"", ""We're hiring!"", ""Meet the Chief"", ""Uncrewed Aircraft Systems (UAS)"", ""In the News""]",[],[],[],"" -3579,https://raleighnc.gov/services/safety/internal-affairs-unit,Complaints & Misconduct,Info About Officers,Internal Affairs Unit | Raleighnc.gov,"",200,RaleighNC.gov | Raleighnc.gov,"[""Internal Affairs Unit""]","[""Main navigation"", ""Secondary"", ""Main navigation"", ""Jump To:"", ""Filing a Complaint"", ""Disposition of Complaint"", ""Request Recordings - BWCs and MVRs"", ""Citizen Complaint Cases Investigated by RPD"", ""How to Compliment an Employee"", ""Share"", ""Contact"", ""Subscribe"", ""City of Raleigh/s social media accounts"", ""Select Language""]",[],[],[],[],"" -3580,https://data.providenceri.gov/,List of Data Sources,Info About Agencies,Open Data | City of Providence | Open Data | City of Providence,"",200,Open Data | City of Providence | Open Data | City of Providence,"[""Welcome to the City of Providence’s Open Data Portal"", ""Open Data"", ""Quick Links"", ""Resources""]","[""Menu""]",[],[],[],[],Skip to main content Skip to footer links Sign In OpenPVD.gov ProvidenceRI.gov Help Developers Menu Menu Close OpenPVD.gov ProvidenceRI.gov Help Developers Sign In Search Welcome to the City of Providence’s Open Data Portal Fiscal Year 2024 Approved Budget Providence Police Case Logs 2023 Property Tax Roll Open Data Economy/Finance Discover data on the city’s budget and expenditures as well as information on Providence’s business community. Neighborhoods Explore the attributes of the city’s diverse neighborhoods. Public Safety View up to date data on the city’s public safety programs. Reference Find important reference documents such as contracts and reports. Quick Links Resources Suggest a data set Didn’t find what you were looking for? Suggest a dataset. PVD311 Submit a service request to the City Open Records Submit a public records request Sign In OpenPVD.gov ProvidenceRI.gov Help Developers Menu Menu Close OpenPVD.gov ProvidenceRI.gov Help Developers Sign In Search Welcome to the City of Providence’s Open Data Portal Fiscal Year 2024 Approved Budget Providence Police Case Logs 2023 Property Tax Roll Open Data Economy/Finance Discover data on the city’s budget and expenditures as well as information on Providence’s business community. Neighborhoods Explore the attributes of the city’s diverse neighborhoods. Public Safety View up to date data on the city’s public safety programs. Reference Find important reference documents such as contracts and reports. Quick Links Resources Suggest a data set Didn’t find what you were looking for? Suggest a dataset. PVD311 Submit a service request to the City Open Records Submit a public records request Sign In OpenPVD.gov ProvidenceRI.gov Help Developers Menu Menu Close OpenPVD.gov ProvidenceRI.gov Help Developers Sign In Search Sign In OpenPVD.gov ProvidenceRI.gov Help Developers Menu Sign In OpenPVD.gov ProvidenceRI.gov Help Developers Menu Sign In Sign In OpenPVD.gov ProvidenceRI.gov Help Developers Menu Close OpenPVD.gov ProvidenceRI.gov Help Developers Sign In Search OpenPVD.gov ProvidenceRI.gov Help Developers Sign In Search OpenPVD.gov ProvidenceRI.gov Help Developers Sign In Search Search Welcome to the City of Providence’s Open Data Portal Fiscal Year 2024 Approved Budget Providence Police Case Logs 2023 Property Tax Roll Open Data Economy/Finance Discover data on the city’s budget and expenditures as well as information on Providence’s business community. Neighborhoods Explore the attributes of the city’s diverse neighborhoods. Public Safety View up to date data on the city’s public safety programs. Reference Find important reference documents such as contracts and reports. Quick Links Resources Suggest a data set Didn’t find what you were looking for? Suggest a dataset. PVD311 Submit a service request to the City Open Records Submit a public records request -3581,phoenix.gov/police/contact-police,Contact Info & Agency Meta,Info About Agencies,"Police - - - Contact Police","",200,Error retrieving title: No connection adapters were found for '://',"[""Contact Police""]","[""Email"", ""Phone"", ""Silent Witness"", ""Mailing Address""]",[],"[""About Phoenix"", ""Accommodation""]","[""​Share this page​""]",[],"Skip to main content Turn Off X Disclaimer It looks like your browser does not have JavaScript enabled. Please turn on JavaScript and try again. It looks like your browser does not have JavaScript enabled. Please turn on JavaScript and try again. menu It looks like your browser does not have JavaScript enabled. Please turn on JavaScript and try again. It looks like your browser does not have JavaScript enabled. Please turn on JavaScript and try again. It looks like your browser does not have JavaScript enabled. Please turn on JavaScript and try again. Navigation Navigation Residents Businesses Visitors Public Safety Employment Transportation Sustainability Culture & Recreation Mayor/City Council City Government City Departments Home Home Navigate Down Next Dashboard Home Home Previous Navigate Up Email Police Phone List myPHX311 PHX Pay Online Map It Find Public Records PHX Newsroom Translate It looks like your browser does not have JavaScript enabled. Please turn on JavaScript and try again. It looks like your browser does not have JavaScript enabled. Please turn on JavaScript and try again. City of Phoenix > Police > Contact Police Contact Police ​Share this page​ Share Facebook X LinkedIn Reddit Email Message Copy Link Page Content Email General Email Commendations and Complaints Condecoraciones y Quejas Phone Emergency - 911 Non-Emergency - 602-262-6151 Online Reporting Reportes Policiales Electronicos Information (602) 262-7626 Silent Witness 480-WITNESS 1-800-343-TIPS 480-TESTIGO (en español) Online Tips Mailing Address Phoenix Police Department 620 West Washington Street Phoenix, Arizona 85003 Report It Pay It Careers Parks Police Open Data PHXTV PHX Newsroom Proposed Taxes or Fees Licensing & Permitting Media Accessibility Security & Privacy © 2024 City of Phoenix Phoenix City Hall 200 W. Washington Street Phoenix, AZ 85003 Map Map and Directions Call (602) 262-3111 Water/Sewer/City Services Bill (602) 262-6251 TTY: 711 Submit Contact Form Main 602-262-3111 Water/Sewer/City Services Bill 602-262-6251 TTY 711 Phone Directory Contact Us About Phoenix Phoenix is the 5th largest city in the United States. We're a vibrant, growing city and a great place to live , work , and play ! Explore our website for news and to learn about city services. Follow us on social media .​​​ Accommodation Do you require an accommodation to participate in a City program, service, or activity? Call 602-262-7486 , TTY 711 , or email ada@phoenix.gov at least five business days before the event. Documents available in alternative formats upon request. It looks like your browser does not have JavaScript enabled. Please turn on JavaScript and try again. It looks like your browser does not have JavaScript enabled. Please turn on JavaScript and try again. " -3582,http://www.portlandmaine.gov/DocumentCenter/View/31084/Use-of-Force-Review-Report-2020,Use of Force Reports,Police & Public Interactions,"","",404,"","","","","","","","" -3583,"https://communitycrimemap.com/?address=Sacramento,CA&crimeTypes=%5B1,2,4,6,7,8,10,11,12,14,15,16,17,18%5D&startDate=7&endDate=0",Crime Maps & Reports,Agency-Published Resources,LexisNexis® Community Crime Map,"",200,LexisNexis® Community Crime Map,[],[],[],[],[],[],"" -3584,https://www.providenceri.gov/police-department/,Contact Info & Agency Meta,Info About Agencies,City of Providence Police Department - City of Providence,"",200,Sucuri WebSite Firewall - Access Denied,[],"[""Contact Us"", ""Pay Tickets, Forms, Inspections, Etc"", ""Reports, Policies & Procedures, Etc."", ""More"", ""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""Providence PD – NPD LPR Study"", ""featured news"", ""other news"", ""SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español"", ""Lists *""]",[],[],[],Skip To Menu Skip To Content Skip To Accessibility Options Language Language Arabic Chinese (Traditional) English Khemer Portuguese Spanish City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley Search Accessibility City Of Providence Mayor Brett Smiley City Of Providence Mayor Brett Smiley Search Accessibility CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation CITY HALL I Want to… Mayor’s Office Departments City Council Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Purchasing – Open RFPs Running a Business Starting a Business EVENTS NEWS PVD 311 EXPLORE Explore Providence Providence Parks Providence Recreation PVD 311 CITY HALL I Want to … MAYOR BRETT P. SMILEY Departments City Council Find a Meeting Agenda Code of Ordinances More Job Opportunities DOING BUSINESS Construction Ethics Running a Business Starting a Business Purchasing EVENTS NEWS EXPLORE Explore Providence Parks Recreation ACCESSIBILITY -3585,https://www.portlandoregon.gov/police/65520,Stops,Police & Public Interactions,Stops Data Collection Reports | Portland.gov,The Portland Police Bureau’s goal is to be a leader in the collection and analysis of traffic and pedestrian stops data and to continually improve the quality of the processes involved in both collecting and analyzing the data.,200,"City of Portland, Oregon | Portland.gov","[""Stops Data Collection Reports""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Quarterly Reports"", ""Annual Reports"", ""Presentations"", ""Archived Reports"", ""Topics"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]",[],[],[],[],"" -3586,https://www.portlandmaine.gov/Archive.aspx?AMID=73,Complaints & Misconduct,Info About Officers,"","",404,"","","","","","","","" -3587,https://www.cityofsacramento.org/Police/Transparency/Officer-Involved-Shootings,Officer Involved Shootings,Police & Public Interactions,Police Department | City of Sacramento,Sacramento Police Department,200,Home | City of Sacramento,"[""Sacramento Police Department""]","[""About"", ""Your SacPD"", ""Index"", ""Social Media""]","[""Search for content"", ""News and Information"", ""Reporting"", ""Popular Services"", ""More"", ""Call our Non-Emergency Number: 916-808-5471"", ""We're hiring!"", ""Meet the Chief"", ""Uncrewed Aircraft Systems (UAS)"", ""In the News""]",[],[],[],"" -3588,https://wake.nc.networkofcare.org/mh/services/agency.aspx?pid=raleighpolicedepartment_1458_2_0,Contact Info & Agency Meta,Info About Agencies,"Raleigh Police Department - Raleigh - Wake County, North Carolina","The goal of the Raleigh Police Department is to make Raleigh one of the safest cities in America. To do that, we continually advance strategies that prevent crime. We find ways to engage the community Wake County, North Carolina ",200," -",[],"[""Wake County"", ""Important Links And Resources"", ""Raleigh Police Department"", ""Share:"", ""Contact:""]","[""Wake Network of Care"", ""State Legislate"", ""Federal Legislate"", ""Languages"", ""Other Topics That May Be Useful"", ""User Reviews"", ""Wake Network of Care"", ""For Technical Assistance:""]","[""One Site. All Services."", ""Tell us about the person you're helping:"", ""Get Directions To:"", ""Improving Search Results""]",[],[],"" -3589,https://www.providenceri.gov/wp-content/uploads/2021/07/230.01-In-Service-Training.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3590,"https://www.phoenix.gov/police/outreach-initiatives#:~:text=Use%20of%20Force%20Policy&text=Officers%20are%20trained%20to%20utilize,the%20weapons%2C%20tactics%20or%20techniques.",Policies & Contracts,Info About Agencies,Phoenix Police Department Outreach Initiatives,Download and view reports on community outreach initiatives by the city of Phoenix Police Department.,200," - Official Website of the City of Phoenix, Arizona -","[""Outreach Initiatives""]","[""Critical Incident Transparency Protocol"", ""City Manager’s City Council Report on Community & Police Trust Initiative"", ""2017 Presidential Visit"", ""Use of Force Policy"", ""Annual Officer Involved Shoot​​​​​ings ​​Reports"", ""​​​Annual Cultural Competency, Diversity & Community Engagement Training Reports"", ""​​​Annual National Initiative for Building Community Trust and Justice Training Reports"", ""Quarterly Police Department Employee Demographics Reports​​​"", ""​\""Listening Sessions\"" Schedule"", ""Bi-Annual Community Engagement Reports​​​"", ""Employee Excellence Summaries"", ""The President’s Task Force on 21st Century Policing""]",[],"[""About Phoenix"", ""Accommodation""]","[""​Share this page​""]",[],"" -3591,https://www.portlandoregon.gov/police/76875,Use of Force Reports,Police & Public Interactions,Sign-In Form,"",200,"City of Portland, Oregon | Portland.gov","[""The City of Portland, Oregon"", ""Sign-In""]",[],"[""New to PortlandOregon.gov?""]",[],[],[],"The City of Portland, Oregon The City of Portland, Oregon Sign-In PortlandOregon.gov User Name You can also use your registered e-mail address. Password Password is case sensitive. Forgot your user name or password? Save Login Yes No Selecting ""Yes"" will allow you to bypass the login prompt in the future on your current computer. New to PortlandOregon.gov? If you want to sign in, you'll need to create an account and register first. Creating an account is fast and secure. It will give you access to new areas of PortlandOregon.gov, such as subscriptions, event registration, and content catered to your interests. Create a New Account Trouble signing in? You can have your account information e-mailed to you if you have forgotten your user account or password . Sign-In PortlandOregon.gov User Name You can also use your registered e-mail address. Password Password is case sensitive. Forgot your user name or password? Save Login Yes No Selecting ""Yes"" will allow you to bypass the login prompt in the future on your current computer. New to PortlandOregon.gov? If you want to sign in, you'll need to create an account and register first. Creating an account is fast and secure. It will give you access to new areas of PortlandOregon.gov, such as subscriptions, event registration, and content catered to your interests. Create a New Account Trouble signing in? You can have your account information e-mailed to you if you have forgotten your user account or password . PortlandOregon.gov User Name You can also use your registered e-mail address. Password Password is case sensitive. Forgot your user name or password? Save Login Yes No Selecting ""Yes"" will allow you to bypass the login prompt in the future on your current computer. PortlandOregon.gov User Name You can also use your registered e-mail address. Password Password is case sensitive. Forgot your user name or password? Save Login Yes No Selecting ""Yes"" will allow you to bypass the login prompt in the future on your current computer. New to PortlandOregon.gov? If you want to sign in, you'll need to create an account and register first. Creating an account is fast and secure. It will give you access to new areas of PortlandOregon.gov, such as subscriptions, event registration, and content catered to your interests. Create a New Account Trouble signing in? You can have your account information e-mailed to you if you have forgotten your user account or password . Copyright © 2024 City of Portland - Disclaimer & Privacy Policy Copyright © 2024 City of Portland - Disclaimer & Privacy Policy " -3592,https://cprbpgh.org/148681,Complaints & Misconduct,Info About Officers,"Current CPRB Case Review Agenda (for review on February 22nd, 2022) » Pittsburgh Citizen Police Review Board (CPRB)","",200,Pittsburgh Citizen Police Review Board (CPRB) • (412) 765-8023,"[""C ITIZEN P OLICE R EVIEW B OARD • C ITY O F P ITTSBURGH •"", ""C ITIZEN P OLICE R EVIEW B OARD • C ITY O F P ITTSBURGH •"", ""Current CPRB Case Review Agenda (for review on February 22nd, 2022)"", ""Current CPRB Case Review Agenda (for review on February 22nd, 2022)""]","[""Contact CPRB""]",[],"[""About the CPRB"", ""Recently Added"", ""CPRB 2024 Meeting Dates"", ""Address"", ""Phone"", ""Fax""]",[],[],"" -3593,http://goccp.maryland.gov/data-dashboards/traffic-stop-data-dashboard/,Stops,Police & Public Interactions,"Race-Based Traffic Stop Data Dashboard - Governor’s Office of Crime Prevention, Youth, and Victim Services","",200,Not Acceptable!,"[""Race-Based Traffic Stop Data Dashboard"", ""Google Translate Disclaimer"", ""Traductor Google Disclaimer""]","[""About the Race-Based Traffic Stop Data Dashboard"", ""View the dashboard full screen within your browser.""]","[""Data Sources"", ""Data Sources"", ""What is Microsoft Power BI?""]","[""Hover"", ""Click"", ""Double-click"", ""Filters""]",[],[],"Skip to Main Content Menu Maryland.gov Phone Directory State Agencies Online Services Maryland.gov Home Search Facebook Twitter Social Media Directory Home Maryland Statistical Analysis Center Grants Victim Services Children and Youth Criminal Justice Programs Notice: JavaScript is not available in your browser. Some enhanced features will not be available until JavaScript is enabled. Race-Based Traffic Stop Data Dashboard About the Race-Based Traffic Stop Data Dashboard Transportation Article § 25–113(f)(2) requires the Maryland Statistical Analysis Center to post race-based traffic stop data on its website in a location that is easily accessible to the public with a filterable data display of all data collected under this section for the previous calendar year. The filterable data display, titled Race-Based Traffic Stop Data Dashboard , includes traffic stop data from 135 law enforcement agencies in Maryland over the last five years with the most recent data collected during the 2021 calendar year. It also allows users to select one or more data measures to view results. Data Sources Data reflected in this dashboard is reported by law enforcement agencies in Maryland to the Maryland Department of State Police. Return to the GOCPYVS Data Dashboards page. View the dashboard full screen within your browser.  Contact Us Employment Privacy Accessibility Governor’s Office of Crime Prevention, Youth, and Victim Services Main Office: 100 Community Place, Crownsville, MD 21032 Victim Services - Criminal Injuries Compensation Board (CICB): 6776 Reisterstown Rd, Suite 209 Baltimore, MD 21215 410-697-9338 Facebook Twitter MD Social Media Directory About The Handle with Care Dashboard Print This dashboard maps statewide and county-by-county, the number of Handle with Care notices sent to schools as well as the rate per 1,000 students. Also, the number of students affected, mental health services provided and number of participating schools. That data can be analyzed further by month and year. Data Sources Data reflected in this dashboard is collected from schools, law enforcement agencies and other public safety agencies participating in the Handle with Care initiative. What is Microsoft Power BI? Power BI is a business analytics service by Microsoft. It aims to provide interactive visualizations and business intelligence capabilities with an interface simple enough for end users to create their own reports and dashboards × Using The Handle with Care Dashboard Print Hover Pausing over a data point on a chart may reveal additional breakdowns for that data point. Click All figures in the dashboard are interactive with one another, and once clicked on, will cross-filter with other measures. When a data point is selected, its color will be darker, and other data points will appear faded. Double-click Selecting the same section or item twice will clear your selection and return the data to an overall perspective. Filters Selecting a filter will cross-filter across the entire dashboard. This format allows for a deeper understanding of trends by the filter selected. You can also select multiple filters for a further breakdown of data elements. You can also select multiple options within a filter. × Skip to Main Content " -3594,https://raleighnc.gov/services/safety/police-policies-and-procedures,Policies & Contracts,Info About Agencies,Police Policies and Procedures | Raleighnc.gov,"",200,RaleighNC.gov | Raleighnc.gov,"[""Police Policies and Procedures""]","[""Main navigation"", ""Secondary"", ""Main navigation"", ""Share"", ""Contact"", ""Subscribe"", ""City of Raleigh/s social media accounts"", ""Select Language""]",[],[],[],[],"Menu Main navigation News Events Services Projects Departments Secondary Services Apps, Maps, and Open Data Arts Careers, Jobs, and Volunteering Climate Action and Sustainability Community Doing Business Education and Learning Engage with the City Equity Services and Resources Fix It, Report It, Request It Government Grants, Funding, and Relief Housing Landfill and Reuse Make Payments Parking Parks Permits Planning Safety Stormwater Transportation Water and Sewer Places Staff Directory Main navigation News Events Services Projects Departments Search Search Translate Thank you for printing this page from the City of Raleigh's Official Website (www.raleighnc.gov) https://raleighnc.gov/safety/services/police-policies-and-procedures 03/07/2024 3:36 pm Police Policies and Procedures Updated: Mar 7, 2024 The Raleigh Police Department's written directives set forth our mission, our values and our guiding principles, and the code of ethics by which all police personnel are expected to abide. View Written Directives (link is external) Police Directives include: Executive policies Department organization and management Planning, budgeting and resources Career development RPD selection and promotion Rules of conduct Discipline and awards Emergency procedures Police practices We are currently reviewing our policies and procedures to align with 8 Can’t Wait (link is external) Share Twitter Facebook Email Print Contact General Police Information and Questions 919-996-3335 Non-Emergency Police Response 919-831-6311 Emergency Police Response 9-1-1 Subscribe View all topics Back to Safety Lead Department: Police Was this page helpful? Yes No Email Please choose the type of issue you are experiencing with the page from the dropdown. - Select - Accessibility Issue Missing information Wrong information Design issue Something isn’t working as expected Customer Service issue (Examples: trouble with paying utility bill, missed garbage collection, permit issues, etc.) Comments Would you like to be notified by the City about your feedback? This feedback widget is not intended for customer service issues. This feedback is reviewed monthly to help us improve our site. For immediate customer service please refer to our staff directory . Accessibility Careers and Jobs Employee Access Media Kit Mission and Vision Privacy and Legal Notices Staff Directory Copyright © 2024 City of Raleigh City of Raleigh/s social media accounts Twitter YouTube Facebook Instagram SEE ALL SOCIAL MEDIA × Select Language English Spanish Chinese (Simplified) Chinese (Traditional) Arabic Portuguese Korean Indonesian/Malaysian Japanese Russian French German Afrikaans Albanian Amharic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Corsican Croatian Czech Danish Dutch Esperanto Estonian Finnish Frisian Galician Georgian Greek Gujarati Hausa Hawaiian Hebrew Hindi Hmong Haitian Creole Hungarian Icelandic Igbo Irish Italian Javanese Kannada Kazakh Khmer Kinyarwanda Kurdish Kyrgyz Lao Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Nyanja (Chichewa) Odia (Oriya) Pashto Persian Polish Punjabi Romanian Samoan Scots Gaelic Serbian Sesotho Shona Sindhi Sinhala (Sinhalese) Slovak Slovenian Somali Sundanese Swahili Swedish Tagalog (Filipino) Tajik Tamil Tatar Telugu Thai Turkish Turkmen Ukrainian Urdu Uyghur Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu " -3595,https://www.princegeorgescountymd.gov/1961/Contact-Us,Contact Info & Agency Meta,Info About Agencies,Contact Us | Prince George's County,Contact the most important entities related to the Police Department of Prince George's County.,200,"Prince George's County, Maryland | Prince George's County","[""Contact Us""]","[""Contact Information"", ""Quick Links""]",[],"[""Non-emergency Phone List"", ""Staff Directory"", ""State & County Hotlines""]",[],[],"" -3596,https://www.princegeorgescountymd.gov/DocumentCenter/View/16570/General-Orders-Manuals-PDF,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3598,https://www.portlandoregon.gov/police/article/492458,Contact Info & Agency Meta,Info About Agencies,Sign-In Form,"",200,"City of Portland, Oregon | Portland.gov","[""The City of Portland, Oregon"", ""Sign-In""]",[],"[""New to PortlandOregon.gov?""]",[],[],[],"The City of Portland, Oregon The City of Portland, Oregon Sign-In PortlandOregon.gov User Name You can also use your registered e-mail address. Password Password is case sensitive. Forgot your user name or password? Save Login Yes No Selecting ""Yes"" will allow you to bypass the login prompt in the future on your current computer. New to PortlandOregon.gov? If you want to sign in, you'll need to create an account and register first. Creating an account is fast and secure. It will give you access to new areas of PortlandOregon.gov, such as subscriptions, event registration, and content catered to your interests. Create a New Account Trouble signing in? You can have your account information e-mailed to you if you have forgotten your user account or password . Sign-In PortlandOregon.gov User Name You can also use your registered e-mail address. Password Password is case sensitive. Forgot your user name or password? Save Login Yes No Selecting ""Yes"" will allow you to bypass the login prompt in the future on your current computer. New to PortlandOregon.gov? If you want to sign in, you'll need to create an account and register first. Creating an account is fast and secure. It will give you access to new areas of PortlandOregon.gov, such as subscriptions, event registration, and content catered to your interests. Create a New Account Trouble signing in? You can have your account information e-mailed to you if you have forgotten your user account or password . PortlandOregon.gov User Name You can also use your registered e-mail address. Password Password is case sensitive. Forgot your user name or password? Save Login Yes No Selecting ""Yes"" will allow you to bypass the login prompt in the future on your current computer. PortlandOregon.gov User Name You can also use your registered e-mail address. Password Password is case sensitive. Forgot your user name or password? Save Login Yes No Selecting ""Yes"" will allow you to bypass the login prompt in the future on your current computer. New to PortlandOregon.gov? If you want to sign in, you'll need to create an account and register first. Creating an account is fast and secure. It will give you access to new areas of PortlandOregon.gov, such as subscriptions, event registration, and content catered to your interests. Create a New Account Trouble signing in? You can have your account information e-mailed to you if you have forgotten your user account or password . Copyright © 2024 City of Portland - Disclaimer & Privacy Policy Copyright © 2024 City of Portland - Disclaimer & Privacy Policy " -3599,https://pittsburghpa.gov/files/police/orders/ch1/12-06-Use-of-Force.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3600,http://www.portlandmaine.gov/directory.aspx,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -3601,https://www.princegeorgescountymd.gov/644/Citizen-Complaint-Oversight-Panel,Complaints & Misconduct,Info About Officers,Citizen Complaint Oversight Panel | Prince George's County,"The mission of the Citizen Complaint Oversight Panel is to strengthen the partnership between citizens and the Prince George's County police by assuring the public that investigations of alleged excessive force, abusive language and/or harassment are complete, thorough, and impartial.",200,"Prince George's County, Maryland | Prince George's County","[""Citizen Complaint Oversight Panel (Legacy)""]","[""NOTE"", ""Mission"", ""Services"", ""Quick Facts"", ""Complaint Process"", ""Reports"", ""Contact Information"", ""Quick Links""]",[],[],[],[],"" -3602,https://www.portlandoregon.gov/police/article/751998,Policies & Contracts,Info About Agencies,Sign-In Form,"",200,"City of Portland, Oregon | Portland.gov","[""The City of Portland, Oregon"", ""Sign-In""]",[],"[""New to PortlandOregon.gov?""]",[],[],[],"The City of Portland, Oregon The City of Portland, Oregon Sign-In PortlandOregon.gov User Name You can also use your registered e-mail address. Password Password is case sensitive. Forgot your user name or password? Save Login Yes No Selecting ""Yes"" will allow you to bypass the login prompt in the future on your current computer. New to PortlandOregon.gov? If you want to sign in, you'll need to create an account and register first. Creating an account is fast and secure. It will give you access to new areas of PortlandOregon.gov, such as subscriptions, event registration, and content catered to your interests. Create a New Account Trouble signing in? You can have your account information e-mailed to you if you have forgotten your user account or password . Sign-In PortlandOregon.gov User Name You can also use your registered e-mail address. Password Password is case sensitive. Forgot your user name or password? Save Login Yes No Selecting ""Yes"" will allow you to bypass the login prompt in the future on your current computer. New to PortlandOregon.gov? If you want to sign in, you'll need to create an account and register first. Creating an account is fast and secure. It will give you access to new areas of PortlandOregon.gov, such as subscriptions, event registration, and content catered to your interests. Create a New Account Trouble signing in? You can have your account information e-mailed to you if you have forgotten your user account or password . PortlandOregon.gov User Name You can also use your registered e-mail address. Password Password is case sensitive. Forgot your user name or password? Save Login Yes No Selecting ""Yes"" will allow you to bypass the login prompt in the future on your current computer. PortlandOregon.gov User Name You can also use your registered e-mail address. Password Password is case sensitive. Forgot your user name or password? Save Login Yes No Selecting ""Yes"" will allow you to bypass the login prompt in the future on your current computer. New to PortlandOregon.gov? If you want to sign in, you'll need to create an account and register first. Creating an account is fast and secure. It will give you access to new areas of PortlandOregon.gov, such as subscriptions, event registration, and content catered to your interests. Create a New Account Trouble signing in? You can have your account information e-mailed to you if you have forgotten your user account or password . Copyright © 2024 City of Portland - Disclaimer & Privacy Policy Copyright © 2024 City of Portland - Disclaimer & Privacy Policy " -3603,https://www.cityofsacramento.org/Police/Transparency/General-Orders,Policies & Contracts,Info About Agencies,Police Department | City of Sacramento,Sacramento Police Department,200,Home | City of Sacramento,"[""Sacramento Police Department""]","[""About"", ""Your SacPD"", ""Index"", ""Social Media""]","[""Search for content"", ""News and Information"", ""Reporting"", ""Popular Services"", ""More"", ""Call our Non-Emergency Number: 916-808-5471"", ""We're hiring!"", ""Meet the Chief"", ""Uncrewed Aircraft Systems (UAS)"", ""In the News""]",[],[],[],"" -3604,https://www.opendatapolicingnc.com/report?var=stateAbbreviation:NC&var=agencyTitle:Raleigh+Police+Department,Stops,Police & Public Interactions,Open Data Policing | Raleigh Police Department,"",200,Open Data Policing,[],"[""Raleigh Police Department"", ""ACS Census Data 2019"", ""Traffic Stops"", ""Departmental Search Rate""]","[""Local Population (percentage by race/ethnic composition)"", ""Tabular view of census data"", ""Traffic Stops (percentage by race/ethnic composition)"", ""Longitudinal view of annual traffic stops"", ""Departmental Stop Count"", ""Departmental Search Count"", ""Average Departmental Search Rate For Vehicle Stops"", ""Search Data by Race/Ethnic Composition"", ""Likelihood of Search by \""Stop Cause\"""", ""Contraband \""Hit-Rate\"""", ""\""Use-of-force\"" Data by Race/Ethnic Composition"", ""Longitudinal view of annual use-of-force by race/ethnic composition"", ""About Open Data Policing"", ""Donate"", ""Connect""]","[""Longitudinal view of annual percent of search by race/ethnic composition""]",[],[],About Open Data Policing About Open Data Policing About About Raleigh Police Department Find a Stop Raleigh Police Department Find a Stop Raleigh Police Department Find a Stop Raleigh Police Department Find a Stop -3605,https://www.portlandmaine.gov/999/Annual-Reports,Complaints & Misconduct,Info About Officers,Home | Portland International Jetport,"",200,"Portland, ME - Official Website | Official Website","[""Home""]","[""Secondary Nav Bar"", ""Main navigation"", ""Main navigation"", ""Mulberrywood Feature"", ""Endeavour Feature"", ""Frontier Airlines Adds Cincinnati Service"", ""Footer"", ""Sub Footer""]","[""Touchless Parking"", ""Find Your Flight"", ""Frontier Airlines Adds Cincinnati Service""]",[],[],[],Secondary Nav Bar Show — Secondary Nav Bar Hide — Secondary Nav Bar Employees Contact Us English English العربية Български 简体中文 繁體中文 Hrvatski Čeština‎ Dansk Nederlands Suomi Français Deutsch Ελληνικά हिन्दी Italiano 日本語 한국어 Norsk bokmål Polski Português Română Русский Español Svenska Català Filipino עִבְרִית Bahasa Indonesia Latviešu valoda Lietuvių kalba Српски језик Slovenčina Slovenščina Українська Tiếng Việt Shqip Eesti Galego Magyar Maltese ไทย Türkçe فارسی Afrikaans Bahasa Melayu Kiswahili Gaeilge Cymraeg Беларуская мова Íslenska Македонски јазик יידיש Հայերեն Azərbaycan dili Euskara ქართული Kreyol ayisyen اردو বাংলা Bosanski Cebuano Esperanto ગુજરાતી Harshen Hausa Hmong Igbo Basa Jawa ಕನ್ನಡ ភាសាខ្មែរ ພາສາລາວ Latin Te Reo Māori Монгол Тоҷикӣ O‘zbekcha Main navigation Show — Main navigation Hide — Main navigation Arrivals & Departures Flight Information Airlines Parking & Transportation Directions Parking Ground Transportation Parking Lot Expansion Information Passenger Information In the Terminal TSA Pre-Check Jetport Map Visit Maine Visit Portland Lost and Found Inquiry FAQs About the Jetport Airport Statistics History Jetport Management Airport Ambassadors Jetport Financials Noise Abatement Program Doing Business at the Jetport Master Plan News Unmanned Aircraft Systems Current Parking Status Main navigation Show — Main navigation Hide — Main navigation Arrivals & Departures Flight Information Airlines Parking & Transportation Directions Parking Ground Transportation Parking Lot Expansion Information Passenger Information In the Terminal TSA Pre-Check Jetport Map Visit Maine Visit Portland Lost and Found Inquiry FAQs About the Jetport Airport Statistics History Jetport Management Airport Ambassadors Jetport Financials Noise Abatement Program Doing Business at the Jetport Master Plan News Unmanned Aircraft Systems Current Parking Status Secondary Nav Bar Show — Secondary Nav Bar Hide — Secondary Nav Bar Employees Contact Us English English العربية Български 简体中文 繁體中文 Hrvatski Čeština‎ Dansk Nederlands Suomi Français Deutsch Ελληνικά हिन्दी Italiano 日本語 한국어 Norsk bokmål Polski Português Română Русский Español Svenska Català Filipino עִבְרִית Bahasa Indonesia Latviešu valoda Lietuvių kalba Српски језик Slovenčina Slovenščina Українська Tiếng Việt Shqip Eesti Galego Magyar Maltese ไทย Türkçe فارسی Afrikaans Bahasa Melayu Kiswahili Gaeilge Cymraeg Беларуская мова Íslenska Македонски јазик יידיש Հայերեն Azərbaycan dili Euskara ქართული Kreyol ayisyen اردو বাংলা Bosanski Cebuano Esperanto ગુજરાતી Harshen Hausa Hmong Igbo Basa Jawa ಕನ್ನಡ ភាសាខ្មែរ ພາສາລາວ Latin Te Reo Māori Монгол Тоҷикӣ O‘zbekcha Secondary Nav Bar Show — Secondary Nav Bar Hide — Secondary Nav Bar Employees Contact Us English English العربية Български 简体中文 繁體中文 Hrvatski Čeština‎ Dansk Nederlands Suomi Français Deutsch Ελληνικά हिन्दी Italiano 日本語 한국어 Norsk bokmål Polski Português Română Русский Español Svenska Català Filipino עִבְרִית Bahasa Indonesia Latviešu valoda Lietuvių kalba Српски језик Slovenčina Slovenščina Українська Tiếng Việt Shqip Eesti Galego Magyar Maltese ไทย Türkçe فارسی Afrikaans Bahasa Melayu Kiswahili Gaeilge Cymraeg Беларуская мова Íslenska Македонски јазик יידיש Հայերեն Azərbaycan dili Euskara ქართული Kreyol ayisyen اردو বাংলা Bosanski Cebuano Esperanto ગુજરાતી Harshen Hausa Hmong Igbo Basa Jawa ಕನ್ನಡ ភាសាខ្មែរ ພາສາລາວ Latin Te Reo Māori Монгол Тоҷикӣ O‘zbekcha -3606,https://www.portlandmaine.gov/DocumentCenter/View/28313/Response-to-Resistance,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3607,https://data-ral.opendata.arcgis.com/,List of Data Sources,Info About Agencies,Open Data Raleigh,City of Raleigh Open Data Site,200,Open Data Raleigh,[],[],[],[],[],[],"" -3608,https://www.portlandoregon.gov/police/71978,Crime Statistics,Agency-Published Resources,Portland Crime Statistics | Portland.gov,Interactive report summarizing the type and number of report offenses by Neighborhood.,200,"City of Portland, Oregon | Portland.gov","[""Portland Crime Statistics""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Dashboard Walkthrough"", ""Metadata for Offense Open Data"", ""NIBRS Offense Definitions"", ""Related"", ""Topics"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]","[""1. Report Overview"", ""2. Technical Specifications"", ""3. Visualization Walkthrough""]","[""a. Date Filter"", ""b. Offense Count by Category"", ""c. Frequency Map"", ""d.  Total Offense Count by Month"", ""e. Toolbar"", ""f. Download Data""]",[],[],"" -3609,https://communitycrimemap.com/,Crime Maps & Reports,Agency-Published Resources,LexisNexis® Community Crime Map,"",200,LexisNexis® Community Crime Map,[],[],[],[],[],[],"" -3610,https://www.portland.gov/ipr/charts/police-misconduct-complaints-0,Complaints & Misconduct,Info About Officers,Police misconduct complaints | Portland.gov,"",200,"City of Portland, Oregon | Portland.gov","[""Police misconduct complaints""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]",[],[],[],[],"Search Search close Menu General Information Advisory Groups Groups, boards, and commissions. Bureaus and Offices City departments. Calendar of Events Events, public meetings, and hearings. Charter, Code, Policies Official City documents. City Council Live sessions, agendas, and archives. Construction Projects Building, transportation, maintenance, and sewer projects. Find a Park Parks, facilities, and reservations. Neighborhoods Neighborhood directory. News Articles, blogs, press releases, public notices, and newsletters. Projects Planning, outreach and education, strategic, and technology projects. Services and Resources Service and resource directory. Jobs with the City Opportunities posted to governmentjobs.com Elected Officials Ted Wheeler Mayor Carmen Rubio City Commissioner Dan Ryan City Commissioner Rene Gonzalez City Commissioner Mingus Mapps City Commissioner Simone Rede City Auditor Breadcrumb Home / Independent Police Review Open hours at City Hall Our office is open to visitors Tuesday through Thursday in City Hall from 9:00 a.m. to 4:00 p.m. If you would like to file a complaint or commend a member of the Portland Police, please fill out our online form or call us at (503) 823-0146 or toll-free at (844) 770-5700 . close Dismiss Police misconduct complaints See something we could improve on this page? Give website feedback . The City of Portland ensures meaningful access to City programs, services, and activities to comply with Civil Rights Title VI and ADA Title II laws and reasonably provides: translation, interpretation, modifications, accommodations, alternative formats, auxiliary aids and services.  Request these services online or call 503-823-4000 , Relay Service: 711 . 503-823-4000 Traducción e Interpretación | Biên Dịch và Thông Dịch  | 口笔译服务  |  Устный и письменный перевод  |  Turjumaad iyo Fasiraad | Письмовий і усний переклад  |  Traducere și interpretariat  |  Chiaku me Awewen Kapas | अनुवादन तथा व्याख्या Explore all services arrow right General information email 311@portlandoregon.gov phone number 311 Information and Customer Service phone number 503-823-4000 Oregon Relay Service 711 Oregon Relay Service Follow on Social Media PortlandORGov PortlandGov PortlandGov Terms, policies ADA Accommodation Captioning, transcription Privacy policy Portland.gov About this Website Employee Portal Editor log in City of Portland, Oregon © Copyright 2018-2024 Search Search close Menu Search close Search close Search Search Search Search General Information Advisory Groups Groups, boards, and commissions. Bureaus and Offices City departments. Calendar of Events Events, public meetings, and hearings. Charter, Code, Policies Official City documents. City Council Live sessions, agendas, and archives. Construction Projects Building, transportation, maintenance, and sewer projects. Find a Park Parks, facilities, and reservations. Neighborhoods Neighborhood directory. News Articles, blogs, press releases, public notices, and newsletters. Projects Planning, outreach and education, strategic, and technology projects. Services and Resources Service and resource directory. Jobs with the City Opportunities posted to governmentjobs.com Elected Officials Ted Wheeler Mayor Carmen Rubio City Commissioner Dan Ryan City Commissioner Rene Gonzalez City Commissioner Mingus Mapps City Commissioner Simone Rede City Auditor " -3611,https://www.cityofsacramento.org/Police/Transparency/Use-Of-Force-Statistics,Use of Force Reports,Police & Public Interactions,Police Department | City of Sacramento,Sacramento Police Department,200,Home | City of Sacramento,"[""Sacramento Police Department""]","[""About"", ""Your SacPD"", ""Index"", ""Social Media""]","[""Search for content"", ""News and Information"", ""Reporting"", ""Popular Services"", ""More"", ""Call our Non-Emergency Number: 916-808-5471"", ""We're hiring!"", ""Meet the Chief"", ""Uncrewed Aircraft Systems (UAS)"", ""In the News""]",[],[],[],"" -3612,https://www.alleghenycountyanalytics.us/index.php/2021/03/17/use-force-city-pittsburgh-initial-report-2010-2015/,Use of Force Reports,Police & Public Interactions,Use of Force by City of Pittsburgh Police - Allegheny Analytics,"",200,Home - Allegheny Analytics,"[""Use of Force by City of Pittsburgh Police""]","[""What are the takeaways?"", ""Previous reports:""]",[],[],[],[],"Menu Home Topics Topics Children, Youth and Families Community Well-Being Crime and Justice Economic Security Education and Early Childhood Housing and Basic Needs Innovation and Reform Older Adults Substance Use and Mental Health All Work Content Types Content Types Dashboards Datasets Infographics Reports All Content Types Data Tools Data Tools QuickCount Human Services Community Profile Provider Tools (authorized users) Requesting Data About About About Us Data FAQ Contact Us Home Topics Children, Youth and Families Community Well-Being Crime and Justice Economic Security Education and Early Childhood Housing and Basic Needs Innovation and Reform Older Adults Substance Use and Mental Health All Work Content Types Dashboards Datasets Infographics Reports All Content Types Data Tools QuickCount Human Services Community Profile Provider Tools (authorized users) Requesting Data About About Us Data FAQ Contact Us All Topics Children, Youth and Families Community Well-Being Crime and Justice Economic Security Education and Early Childhood Housing and Basic Needs Innovation and Reform Older Adults Substance Use and Mental Health Home » Use of Force by City of Pittsburgh Police Use of Force by City of Pittsburgh Police March 17, 2021 Reports Current report Use of Force in the City of Pittsburgh: Report covers 2015 through June 2020 The City of Pittsburgh Bureau of Police (PBP) tracks each incident in which an officer uses force with a subject. The most current report on police use of force and the previous report provide an overview of incidents in Pittsburgh. The reports describe trends, circumstances of incidents, control techniques used, and incident outcomes. The analyses also describe charges commonly filed against subjects, subjects’ demographics, and the distribution of incidents across the police force. What are the takeaways? Around one in 10 total arrests involve the use of force. Most subject resistance (SR) incidents resulted from some form of attempted arrest: 74% of subjects resisted arrest during an on-view arrest (an arrest where probable cause is established by observing or “viewing” an offense), and 4% resisted during a warrant arrest. The most commonly used control techniques were forcible handcuffing (used with 68% of resisting subjects) and “other,” which includes grabbing, pushing and pulling (58%), and takedowns (51%). Note that more than one control technique can be used and reported. Previous reports: Use of Force in Pittsburgh, 2010–2015 If you require emergency assistance from the Department of Human Services, see our emergency contact page . This site is maintained by the Office of Analytics, Technology and Planning (ATP) at the Allegheny County Department of Human Services . For questions or suggestions, please reach out to DHS-Research@alleghenycounty.us . © 2024 - Allegheny County Department of Human Services, Office of Analytics, Technology and Planning (ATP) " -3614,https://www.portlandoregon.gov/police/76940,Officer Involved Shootings,Police & Public Interactions,Officer Involved Shootings | Portland.gov,Dynamic data dashboard describing PPB officer involved shootings from 2010 to current.,200,"City of Portland, Oregon | Portland.gov","[""Officer Involved Shootings""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Dashboard Walkthrough"", ""Metadata"", ""Related"", ""Topics"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]","[""2. Technical Specifications"", ""3. Visualization Walkthrough"", ""4. Download Data""]","[""a. Cases by Year with Subject Injury Type"", ""b. Initial Call Type"", ""c. Aggregate Statistics"", ""d. Additional Aggregate Statistics"", ""e. Subject Weapon"", ""f. Demographics"", ""g. Subject Age Ranges"", ""h. Toolbar""]",[],[],"" -3615,https://www.cityofsacramento.org/Police/Transparency/Vehicle-Stop-Data-History-and-Information,Stops,Police & Public Interactions,Police Department | City of Sacramento,Sacramento Police Department,200,Home | City of Sacramento,"[""Sacramento Police Department""]","[""About"", ""Your SacPD"", ""Index"", ""Social Media""]","[""Search for content"", ""News and Information"", ""Reporting"", ""Popular Services"", ""More"", ""Call our Non-Emergency Number: 916-808-5471"", ""We're hiring!"", ""Meet the Chief"", ""Uncrewed Aircraft Systems (UAS)"", ""In the News""]",[],[],[],"" -3616,https://data.cityofsacramento.org/,List of Data Sources,Info About Agencies,City of Sacramento Open Data,City of Sacramento Open Data Site,200,City of Sacramento Open Data,[],[],[],[],[],[],"" -3617,https://www.phoenixopendata.com/,List of Data Sources,Info About Agencies,Welcome - City of Phoenix Open Data,"",200,Welcome - City of Phoenix Open Data,"[""City of Phoenix Open Data"", ""Phoenix Open Data Portal: Government Transparency in the Digital Age""]","[""Groups"", ""Showcases"", ""External Datasets"", ""Popular Datasets"", ""New and Recent Datasets"", ""BEFORE YOU DOWNLOAD""]","[""Search data"", ""Popular tags"", ""Planned Major Street Restrictions and Closures"", ""Points of Pride"", ""City Manager's Performance Dashboard"", ""Use of Force Dashboard"", ""Phoenix Homeless Solutions Dashboard"", ""American Rescue Plan Act Strategic Plan"", ""Officer Pointed Gun at Person Dashboard"", ""Traffic Citations Dashboard"", ""Adult Arrests Dashboard"", ""Officer-Involved Shootings Dashboard"", ""City of Phoenix ERA Program Dashboard"", ""Parks and Recreation"", ""Outdoor Public Wifi Sites"", ""Arts + Culture Plan"", ""Phoenix Fire Department Operational Statistics"", ""Planned Major Street Restrictions and Closures"", ""Points of Pride"", ""City Manager's Performance Dashboard"", ""Use of Force Dashboard"", ""Calls for Service"", ""Employee Compensation"", ""Traffic Restrictions"", ""Adult Arrests"", ""Crime Data"", ""Traffic Restrictions"", ""Traffic Restrictions Intersections"", ""Valley Metro Bus Schedule"", ""Calls for Service"", ""Crime Data""]",[],[],[],Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Search Datasets -3618,https://data.providenceri.gov/Public-Safety/Providence-Police-Case-Log-Past-180-days/rz3y-pz8v,Crime Statistics,Agency-Published Resources,Providence Police Case Log - Past 180 days | Open Data | City of Providence,"",200,Open Data | City of Providence | Open Data | City of Providence,"[""Top 25 Offenses Charged in the last 180 Days"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Providence Police Case Log - Past 180 days"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Providence Police Case Log - Past 180 days"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Top 25 Offenses Charged in the last 180 Days …"", ""Data Management"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right."", ""Top 25 Offenses Charged in the last 180 Days …""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In OpenPVD.gov ProvidenceRI.gov Help Developers Menu Menu Close OpenPVD.gov ProvidenceRI.gov Help Developers Sign In Search Sign In OpenPVD.gov ProvidenceRI.gov Help Developers Menu Sign In OpenPVD.gov ProvidenceRI.gov Help Developers Menu Sign In Sign In OpenPVD.gov ProvidenceRI.gov Help Developers Menu Close OpenPVD.gov ProvidenceRI.gov Help Developers Sign In Search OpenPVD.gov ProvidenceRI.gov Help Developers Sign In Search OpenPVD.gov ProvidenceRI.gov Help Developers Sign In Search Search -3619,https://www.providenceri.gov/wp-content/uploads/2021/07/300.01-Use-of-Force.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3620,https://www.portlandmaine.gov/739/Daily-Media-Logs,Calls for Service,Police & Public Interactions,"","",404,"","","","","","","","" -3621,https://pittsburghpa.gov/city-info/police-numbers,Contact Info & Agency Meta,Info About Agencies,Police Phone Directory | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""POLICE"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""Looking for general information concerning the City of Pittsburgh? You can contact the 311 Response Center for detailed information, non-emergency concerns and feedback. Dial 3-1-1, outside of Pittsburgh? Call 412-255-2621 . Online Service Request Form""]","[""DEPARTMENT MENU""]","[""City Directory"", ""City Information Center""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -3622,https://data-ral.opendata.arcgis.com/datasets/raleigh-police-incidents-nibrs/,Crime Maps & Reports,Agency-Published Resources,Raleigh Police Incidents (NIBRS),"Raleigh Police Department incidents since June 2014, reported using the National Incident Based Reporting System (NIBRS).",200,Open Data Raleigh,[],[],[],[],[],[],"" -3623,https://www.portland.gov/police/open-data,List of Data Sources,Info About Agencies,PPB Open Data | Portland.gov,Datasources from the Portland Police Bureau,200,"City of Portland, Oregon | Portland.gov","[""PPB Open Data""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Featured content"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]","[""Portland Crime Statistics"", ""Police Staffing Numbers"", ""Officer Involved Shootings"", ""Police Dispatched Calls Dashboard"", ""Portland Arrest Statistics"", ""Police Use of Force Dashboard"", ""Portland UAS Call Statistics"", ""Stops Data Collection Reports"", ""Shooting Incident Statistics"", ""Business Districts Crime Summary"", ""Police Overtime Dashboard"", ""Precinct Demographics"", ""Reported Bias Crime Statistics"", ""Stolen Vehicle Statistics""]",[],[],[],"Search Search close Menu General Information Advisory Groups Groups, boards, and commissions. Bureaus and Offices City departments. Calendar of Events Events, public meetings, and hearings. Charter, Code, Policies Official City documents. City Council Live sessions, agendas, and archives. Construction Projects Building, transportation, maintenance, and sewer projects. Find a Park Parks, facilities, and reservations. Neighborhoods Neighborhood directory. News Articles, blogs, press releases, public notices, and newsletters. Projects Planning, outreach and education, strategic, and technology projects. Services and Resources Service and resource directory. Jobs with the City Opportunities posted to governmentjobs.com Elected Officials Ted Wheeler Mayor Carmen Rubio City Commissioner Dan Ryan City Commissioner Rene Gonzalez City Commissioner Mingus Mapps City Commissioner Simone Rede City Auditor Breadcrumb Home / Police PPB Open Data Program Datasources from the Portland Police Bureau Services and Information Documents Featured content Portland Crime Statistics Police Staffing Numbers Officer Involved Shootings Police Dispatched Calls Dashboard Portland Arrest Statistics Police Use of Force Dashboard Portland UAS Call Statistics Stops Data Collection Reports Shooting Incident Statistics Business Districts Crime Summary Police Overtime Dashboard Precinct Demographics Reported Bias Crime Statistics Stolen Vehicle Statistics See something we could improve on this page? Give website feedback . The City of Portland ensures meaningful access to City programs, services, and activities to comply with Civil Rights Title VI and ADA Title II laws and reasonably provides: translation, interpretation, modifications, accommodations, alternative formats, auxiliary aids and services.  Request these services online or call 503-823-4000 , Relay Service: 711 . 503-823-4000 Traducción e Interpretación | Biên Dịch và Thông Dịch  | 口笔译服务  |  Устный и письменный перевод  |  Turjumaad iyo Fasiraad | Письмовий і усний переклад  |  Traducere și interpretariat  |  Chiaku me Awewen Kapas | अनुवादन तथा व्याख्या Explore all services arrow right General information email 311@portlandoregon.gov phone number 311 Information and Customer Service phone number 503-823-4000 Oregon Relay Service 711 Oregon Relay Service Follow on Social Media PortlandORGov PortlandGov PortlandGov Terms, policies ADA Accommodation Captioning, transcription Privacy policy Portland.gov About this Website Employee Portal Editor log in City of Portland, Oregon © Copyright 2018-2024 Search Search close Menu Search close Search close Search Search Search Search General Information Advisory Groups Groups, boards, and commissions. Bureaus and Offices City departments. Calendar of Events Events, public meetings, and hearings. Charter, Code, Policies Official City documents. City Council Live sessions, agendas, and archives. Construction Projects Building, transportation, maintenance, and sewer projects. Find a Park Parks, facilities, and reservations. Neighborhoods Neighborhood directory. News Articles, blogs, press releases, public notices, and newsletters. Projects Planning, outreach and education, strategic, and technology projects. Services and Resources Service and resource directory. Jobs with the City Opportunities posted to governmentjobs.com Elected Officials Ted Wheeler Mayor Carmen Rubio City Commissioner Dan Ryan City Commissioner Rene Gonzalez City Commissioner Mingus Mapps City Commissioner Simone Rede City Auditor " -3624,https://data.princegeorgescountymd.gov/Public-Safety/Crime-Incidents-February-2017-to-Present/wb4e-w4nf/data,Crime Statistics,Agency-Published Resources,Crime Incidents February 2017 to 5th July 2023 | Tyler Data & Insights,"The Prince George’s County Police Department (PGPD) provides the displayed data as a service to our community. The included data does not represent every call for service handled by PGPD. Information is provided regarding traffic accidents, assaults, burglaries, homicides, robberies, sex offenses, stolen vehicles, thefts and vandalisms where a report has been written. Included information for any of these events has been modified to remove specific address location. In order to provide victim confidentiality, address numbers have been rounded to closest hundred block and any mapped locations will show occurrence based on the street centerline. We hope you will find this information useful.",200,OpenPGC | Open Data | Tyler Data & Insights,"[""Crime Incidents February 2017 to 5th July 2023""]","[""Menu"", ""Create a new Template"", ""Subscribe to the \"" Crime Incidents February 2017 to 5th July 2023 \"" Dataset"", ""Invite Collaborators"", ""Save view"", ""Do you want to save your view?"", ""Choose a Dataset to use""]",[],"[""This information is now on Primer""]",[],[],"Skip to main content Skip to footer links Search Home Data Catalog Transforming Neighborhoods Initiative Open Performance My Prince George's County Resources and Feedback Developer Resources Tutorials Feedback Nominate Analytics Sign In Menu Menu Close Home Data Catalog Transforming Neighborhoods Initiative Open Performance My Prince George's County Resources and Feedback Developer Resources Tutorials Feedback Nominate Analytics Sign In Search Introducing our new data shaping and exploration experience: Filter, group, aggregate, and more! Try it now Learn more table Crime Incidents February 2017 to 5th July 2023 Based on Based on Crime Incidents February 2017 to 5th July 2023 Publishing to the public requires approval The Prince George’s County Police Department (PGPD) provides the displayed data as a service to our community. The included data does not represent every call for service handled by PGPD. Information is provided regarding traffic accidents, assaults, burglaries, homicides, robberies, sex offenses, stolen vehicles, thefts and vandalisms where a report has been written. Included information for any of these events has been modified to remove specific address location. In order to provide victim confidentiality, address numbers have been rounded to closest hundred block and any mapped locations will show occurrence based on the street centerline. We hope you will find this information useful. Expand Subscribe to Changes Share on Facebook Share on X View as a table View as a rich list View as a single row View as a template Find in this Dataset Edit Manage More Views Filter Visualize Export Discuss Embed About Close grid sidebar Columns required for this view are missing placeholder placeholder Previous Next Row count unavailable. View first page View previous page 0 View next page View last page Checking in seconds ... Home Catalog Terms of Service Privacy Policy Accessibility Contact Us © 2024 Prince George's County " -3625,https://www.portlandoregon.gov/police/65886,Policies & Contracts,Info About Agencies,Police Directives | Portland.gov,"",200,"City of Portland, Oregon | Portland.gov","[""Police Directives""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Bureau Organization (0100)"", ""Personnel / General Administration (0200)"", ""Conduct / Discipline (0300)"", ""Disability / Injury / Retirement (0400)"", ""Health and Wellness (0500)"", ""Field Operations (0600)"", ""Emergencies / Disturbances (0700)"", ""Arrest / Detentions / Court (0800)"", ""Report Writing (0900)"", ""Weapons / Ammunition / Equipment (1000)"", ""Uniforms / Grooming (1100)"", ""Maintenance / Vehicles / Property (1200)"", ""Training (1500)"", ""Menu for Directives Overview"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]",[],[],[],[],"" -3626,https://www.princegeorgescountymd.gov/3499/Arrest,Arrest Records,Police & Public Interactions,"","",403,"","","","","","","","" -3627,https://www.cityofsacramento.org/Police/Contact,Contact Info & Agency Meta,Info About Agencies,Police Department | City of Sacramento,Sacramento Police Department,200,Home | City of Sacramento,"[""Sacramento Police Department""]","[""About"", ""Your SacPD"", ""Index"", ""Social Media""]","[""Search for content"", ""News and Information"", ""Reporting"", ""Popular Services"", ""More"", ""Call our Non-Emergency Number: 916-808-5471"", ""We're hiring!"", ""Meet the Chief"", ""Uncrewed Aircraft Systems (UAS)"", ""In the News""]",[],[],[],"" -3628,https://data.providenceri.gov/Public-Safety/Providence-Police-Department-Arrest-Log-Past-60-Da/vank-fyx9,Arrest Records,Police & Public Interactions,Providence Police Department Arrests and Citations- Past 60 Days | Open Data | City of Providence,"",200,Open Data | City of Providence | Open Data | City of Providence,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Providence Police Department Arrests and Citations- Past 60 Days"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Providence Police Department Arrests and Citations- Past 60 Days"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In OpenPVD.gov ProvidenceRI.gov Help Developers Menu Menu Close OpenPVD.gov ProvidenceRI.gov Help Developers Sign In Search Sign In OpenPVD.gov ProvidenceRI.gov Help Developers Menu Sign In OpenPVD.gov ProvidenceRI.gov Help Developers Menu Sign In Sign In OpenPVD.gov ProvidenceRI.gov Help Developers Menu Close OpenPVD.gov ProvidenceRI.gov Help Developers Sign In Search OpenPVD.gov ProvidenceRI.gov Help Developers Sign In Search OpenPVD.gov ProvidenceRI.gov Help Developers Sign In Search Search -3629,https://www.portlandmaine.gov/DocumentCenter/View/5911/Arrest-Log?bidId=,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -3630,https://pittsburghpa.gov/files/police/orders/ch1/12-02-General-Provisions-Manual-of-Procedural-Orders.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3631,https://pittsburghpa.gov/files/police/orders/ch7/70-03-Training-General-Regulations.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3632,https://data-ral.opendata.arcgis.com/datasets/raleigh-police-incidents-nibrs/explore?showTable=true,Crime Statistics,Agency-Published Resources,Raleigh Police Incidents (NIBRS),"Raleigh Police Department incidents since June 2014, reported using the National Incident Based Reporting System (NIBRS).",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -3633,https://data.princegeorgescountymd.gov/,List of Data Sources,Info About Agencies,OpenPGC | Open Data | Tyler Data & Insights,"",200,OpenPGC | Open Data | Tyler Data & Insights,"[""Welcome!"", ""Public Safety"", ""CountyClick 311"", ""Suggest a Dataset..""]","[""Menu""]",[],"[""311 Explorer"", ""CountyClick 311"", ""TNI (Transforming Neighborhoods Initiative)"", ""Crime Data""]",[],[],"Skip to main content Skip to footer links Search Home Data Catalog Transforming Neighborhoods Initiative Open Performance My Prince George's County Resources and Feedback Developer Resources Tutorials Feedback Nominate Analytics Sign In Menu Menu Close Home Data Catalog Transforming Neighborhoods Initiative Open Performance My Prince George's County Resources and Feedback Developer Resources Tutorials Feedback Nominate Analytics Sign In Search Checking in seconds ... Welcome! Welcome to the Prince George’s County Open Data Portal. Explore, analyze, and share the County’s data. Public Safety View information about Prince George’s County Public Safety departments, including Crime Incident data and maps CountyClick 311 Explore data supporting county development, including information on CountyClick 311 service requests. Suggest a Dataset.. What datasets would you like to see on Data Prince George's site? Checking in seconds ...  Finance Explore County finance data, including Contract details, budgets, etc...  Urban Planning Find Permit, Inspection, and Enforcement data along with zoning maps and county boundaries. 📖 Education Find information about Prince George's County Public Schools, colleges, and universities 🌲 Environment Learn about Prince George's County environmental information, including animal management, trash collection, recycling, etc...  Community Explore information about the Prince George's County community 🚖 Public Safety Explore Police and Fire/EMS data along with Crime Mapping tools 🏦 County Government Find information about County Executive, County Council Districts, and more... ♥ Health Find health related information about Prince George's County Checking in seconds ... 311 Explorer Search, filter, explore 311 requests that have been submitted in your neighborhood CountyClick 311 Explore data related to non-emergency County service requests. Data can be filtered by service request type, date range, and status TNI (Transforming Neighborhoods Initiative) Explore data related to the six TNI neighborhoods in Prince George's County Crime Data Explore Prince George's County crime and incident data from July 2023. Data can be filtered and visualized by incident type, date range, and location. Checking in seconds ... " -3634,https://data.sanantonio.gov/,List of Data Sources,Info About Agencies,Welcome - Open Data SA,"",200,Welcome - Open Data SA,"[""Open Data SA""]","[""Groups"", ""Popular Datasets"", ""New and Recent Datasets""]","[""Search data"", ""Popular tags"", ""Building Permits"", ""311 Service Calls"", ""Incentives and Programs"", ""Performance Measures"", ""Preliminary Plan Reviews"", ""Performance Measures"", ""Variance Requests"", ""Preliminary Plan Reviews"", ""Building Permits"", ""311 Service Calls""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Organizations Groups About Search Datasets Toggle navigation Datasets Organizations Groups About Search Datasets Search Datasets Open Data SA City of San Antonio data available and open by default. Search data Search Popular tags san antonio bexar county development Groups Geospatial Housing, Building and Construction Service Requests Animal Services Popular Datasets Browse popular datasets below and see what other citizens find interesting. Building Permits 111 recent views CSV XLSX 311 Service Calls 91 recent views CSV XLSX Incentives and Programs 41 recent views XLSX Performance Measures 29 recent views CSV Preliminary Plan Reviews 24 recent views CSV XLSX New and Recent Datasets Browse new or modified datasets below. Click to view details or explore content. Performance Measures Updated on March 25, 2024 CSV Variance Requests Updated on March 24, 2024 CSV Preliminary Plan Reviews Updated on March 24, 2024 CSV XLSX Building Permits Updated on March 24, 2024 CSV XLSX 311 Service Calls Updated on March 24, 2024 CSV XLSX Open Data SA City of San Antonio data available and open by default. Search data Search Popular tags san antonio bexar county development Groups Geospatial Housing, Building and Construction Service Requests Animal Services Popular Datasets Browse popular datasets below and see what other citizens find interesting. Building Permits 111 recent views CSV XLSX 311 Service Calls 91 recent views CSV XLSX Incentives and Programs 41 recent views XLSX Performance Measures 29 recent views CSV Preliminary Plan Reviews 24 recent views CSV XLSX New and Recent Datasets Browse new or modified datasets below. Click to view details or explore content. Performance Measures Updated on March 25, 2024 CSV Variance Requests Updated on March 24, 2024 CSV Preliminary Plan Reviews Updated on March 24, 2024 CSV XLSX Building Permits Updated on March 24, 2024 CSV XLSX 311 Service Calls Updated on March 24, 2024 CSV XLSX Open Data SA City of San Antonio data available and open by default. Search data Search Popular tags san antonio bexar county development Open Data SA City of San Antonio data available and open by default. Search data Search Popular tags san antonio bexar county development Open Data SA City of San Antonio data available and open by default. Search data Search Popular tags san antonio bexar county development Open Data SA City of San Antonio data available and open by default. Search data Search Popular tags san antonio bexar county development Open Data SA City of San Antonio data available and open by default. Search data Search Popular tags san antonio bexar county development Open Data SA City of San Antonio data available and open by default. City of San Antonio data available and open by default. Search data Search Popular tags san antonio bexar county development Search Popular tags san antonio bexar county development " -3635,https://datasf.org/opendata/,List of Data Sources,Info About Agencies,DataSF | San Francisco Open Data,"Our mission is to empower use of the City and County of San Francisco's data. Our core product is SF OpenData, the official open data portal.",200,Redirecting…,"[""Find the data you need"", ""Dataset Alerts""]","[""Publishing Departments""]",[],[],[],[],"SFGov Coordinator's Portal About Join Us Help Toggle navigation Data SF Open Data Explore Browse Data Developers Sign In Showcase Publishing Academy Resources Blog SFGov Coordinator's Portal About Join Us Help Explore Browse Data Developers Search Sign In SFGov Coordinator's Portal About Join Us Help SFGov Coordinator's Portal About Join Us Help SFGov Coordinator's Portal About Join Us Help Toggle navigation Data SF Open Data Explore Browse Data Developers Sign In Showcase Publishing Academy Resources Blog SFGov Coordinator's Portal About Join Us Help Toggle navigation Data SF Open Data Explore Browse Data Developers Sign In Showcase Publishing Academy Resources Blog SFGov Coordinator's Portal About Join Us Help Explore Browse Data Developers Search Sign In Explore Browse Data Developers Search Sign In Explore Browse Data Developers Search Sign In Find the data you need Search hundreds of datasets from the City and County of San Francisco. Or browse on the data catalog Search Search Search Get the latest COVID-19 data Get the latest COVID-19 data Get the latest COVID-19 data Economy & Community Data on businesses, community and economic development City Management & Ethics Data on finance, budgets, taxes, employees, elections, campaigns, ethics reporting, etc Transportation Data about public transit, biking, driving, parking, and flying Public Safety Data on crime, fire, accidents, and enforcement Health & Social Services Data about health, public health, and services provided to individuals, children and families Geographic Locations & Boundaries Geographic data on city locations and boundaries; Available as shapefiles, geojson, kml Energy & Environment Data on sustainability, energy and resource use, and environmental conditions Housing & Buildings Data on permitting, construction, housing units, building inspections, rent control, etc City Infrastructure Data on maintenance and management of public buildings and facilities, spaces, streets and right of way Culture and Recreation Data on arts, museums, public spaces and events View data by department Economy & Community Data on businesses, community and economic development City Management & Ethics Data on finance, budgets, taxes, employees, elections, campaigns, ethics reporting, etc Transportation Data about public transit, biking, driving, parking, and flying Public Safety Data on crime, fire, accidents, and enforcement Health & Social Services Data about health, public health, and services provided to individuals, children and families Geographic Locations & Boundaries Geographic data on city locations and boundaries; Available as shapefiles, geojson, kml Energy & Environment Data on sustainability, energy and resource use, and environmental conditions Housing & Buildings Data on permitting, construction, housing units, building inspections, rent control, etc City Infrastructure Data on maintenance and management of public buildings and facilities, spaces, streets and right of way Culture and Recreation Data on arts, museums, public spaces and events Economy & Community Data on businesses, community and economic development Economy & Community Data on businesses, community and economic development Economy & Community Data on businesses, community and economic development City Management & Ethics Data on finance, budgets, taxes, employees, elections, campaigns, ethics reporting, etc City Management & Ethics Data on finance, budgets, taxes, employees, elections, campaigns, ethics reporting, etc " -3636,https://webapps.siouxfalls.org/policecalllog,Calls for Service,Police & Public Interactions,"","",-1,"","","","","","","","" -3637,https://www.sanfranciscopolice.org/contact-and-directory,Contact Info & Agency Meta,Info About Agencies,Contact and Directory | San Francisco Police Department,"",200,San Francisco Police Department,"[""Contact and Directory""]","[""Popular Search Terms:"", ""Contact Information"", ""San Francisco Police Headquarters""]","[""Non-Emergency"", ""City Services & Questions"", ""Anonymous Tip Line"", ""Text a Tip"", ""Contact Your Police Station"", ""SFPD Headquarters"", ""Non-Emergency"", ""City Services & Questions"", ""Anonymous Tip Line"", ""Text a Tip"", ""Contact Your Police Station"", ""SFPD Headquarters"", ""General Phone""]","[""1-415-553-0123"", ""3-1-1"", ""1-415-575-4444"", ""1-415-837-7000""]",[],[],"" -3638,https://www.seattle.gov/police,Contact Info & Agency Meta,Info About Agencies,Seattle Police Department Home Page - Police | seattle.gov,This is the official home page for the Seattle Police Department.,200,Seattle.gov Home,"[""Seattle Police Department""]","[""Attention:"", ""Issues and Initiatives"", ""Police"", ""City-Wide Information"", ""Policies""]","[""Connect with Elected Officials"", ""Departments and Contacts"", ""Get Involved with the City"", ""Finance and Purchasing"", ""Issues and Initiatives"", ""Seattle Municipal Court"", ""Voting"", ""Your Rights and Regulations"", ""Animals"", ""Emergencies"", ""Fire"", ""Police"", ""Police Oversight"", ""Safety Tips"", ""Assistance and Discounts"", ""Discounted or Free Technology"", ""Grants and Funding"", ""Housing"", ""Services For..."", ""Utilities"", ""Classes and Trainings"", ""Data and Research"", ""Early Learning (age 3-5)"", ""Environment and Sustainability"", ""Youth Programs (age 14-24)"", ""About Seattle"", ""Parks"", ""Recreation"", ""Reservations and Events"", ""Urban Activities"", ""City Maintenance"", ""City Planning"", ""City Construction Projects"", ""Incentives for Housing Developers"", ""Neighborhood and Home Projects"", ""Parking"", ""Permits"", ""Transit and Commuting"", ""Community Feedback"", ""Re-Envisioning Public Safety Together"", ""Public Disclosure Request Data Dashboard"", ""SPD Data Maps"", ""30 x 30 | Women in Law Enforcement"", ""Before The Badge"", ""Community Feedback"", ""Re-Envisioning Public Safety Together"", ""Public Disclosure Request Data Dashboard"", ""SPD Data Maps"", ""30 x 30 | Women in Law Enforcement"", ""Before The Badge"", ""Community Feedback"", ""Re-Envisioning Public Safety Together"", ""Contact Us"", ""Follow Us"", ""Top Requests"", ""Apply to SPD"", ""Parking Enforcement"", ""U-Visa Info"", ""When to call 911"", ""MCPP Plans"", ""Professional Standards Bureau"", ""Service Quality Survey"", ""SPD Safe Place"", ""SPD Information""]",[],[],[],"" -3639,https://www.sanfranciscopolice.org/your-sfpd/published-reports/quarterly-activity-data-report-qadr,Use of Force Reports,Police & Public Interactions,Quarterly Activity & Data Report (QADR) | San Francisco Police Department,"",200,San Francisco Police Department,"[""Quarterly Activity & Data Report (QADR)""]","[""Popular Search Terms:"", ""1st Quarter"", ""2nd Quarter"", ""3rd Quarter"", ""1st Quarter"", ""2nd Quarter"", ""3rd Quarter"", ""4th Quarter"", ""1st Quarter"", ""2nd Quarter"", ""3rd Quarter"", ""4th Quarter"", ""4th Quarter"", ""3rd Quarter""]","[""Non-Emergency"", ""City Services & Questions"", ""Anonymous Tip Line"", ""Text a Tip"", ""Contact Your Police Station"", ""SFPD Headquarters""]",[],[],[],"" -3640,https://www.sanantonio.gov/SAPD/Uniform-Crime-Reports#30263860-2020,Crime Statistics,Agency-Published Resources,National Incident-Based Reporting System (NIBRS) - City of San Antonio,SAPD reports crime data to this national system as required by law.,200," - The City of San Antonio - Official City Website > Home -","[""National Incident-Based Reporting System (NIBRS)""]","[""NIBRS Year-to-Date Comparison: 2023 vs 2024"", ""Data Description"", ""Crime Comparison Reports"", ""Previous Reports""]","[""Crime Statistics January – February"", ""Contact Us"", ""Get Social"", ""Visit Other San Antonio Sites"", ""Share Your Feedback""]",[],[],[],opens in new tab or window -3641,https://sfgov.org/dpa/reports-statistics,Complaints & Misconduct,Info About Officers,Reports on policing complaints | San Francisco,See reports on how many complaints were filed and what we found.,200,City and County of San Francisco,"[""Reports on policing complaints""]","[""Audit Reports"", ""SB 1421 Records"", ""SB 16 Records"", ""Footer menu"", ""Footer Bottom""]",[],"[""Departments""]",[],[],"English Español 中文 Filipino Menu Services Departments Search Reports on policing complaints See reports on how many complaints were filed and what we found. The Department of Public Accountability (DPA) reports on the complaints we receive about police officers. These reports summarize DPA activities. They do not include any identifying information about the people involved. 2024 2023 2022 2021 2020 2019 2018 2017 2016 Audit Reports The DPA Audit Division conducts performance audits of the San Francisco Police Department. Audit Reports SB 1421 Records The DPA Public Records division is responsible for releasing Senate Bill 1421 cases. SB1421 Officer Involved Shooting Records SB1421 Great Bodily Injury Records SB 16 Records SB16 Unlawful Arrest or Search Records SB16 Biased Policing SB 16 Excessive or Unnecessary Force Last updated February 6, 2024 Departments Department of Police Accountability Police Department Sheriff's Office You must have JavaScript enabled to use this form. Was this page helpful? Yes No Report something wrong with this page Yes What was helpful about this page? We cannot reply individually to all feedback. If you need assistance, call 311. No What's wrong with this page? We cannot reply individually to all feedback. If you need assistance, call 311. Report something wrong with this page What's wrong with this page? We cannot reply individually to all feedback. If you need assistance, call 311. Leave this field blank Footer menu Jobs with the City Contact us About this website Footer Bottom Disclaimer Privacy policy City and County of San Francisco English Español 中文 Filipino Menu Services Departments Search Reports on policing complaints See reports on how many complaints were filed and what we found. The Department of Public Accountability (DPA) reports on the complaints we receive about police officers. These reports summarize DPA activities. They do not include any identifying information about the people involved. 2024 2023 2022 2021 2020 2019 2018 2017 2016 Audit Reports The DPA Audit Division conducts performance audits of the San Francisco Police Department. Audit Reports SB 1421 Records The DPA Public Records division is responsible for releasing Senate Bill 1421 cases. SB1421 Officer Involved Shooting Records SB1421 Great Bodily Injury Records SB 16 Records SB16 Unlawful Arrest or Search Records SB16 Biased Policing SB 16 Excessive or Unnecessary Force Last updated February 6, 2024 Departments Department of Police Accountability Police Department Sheriff's Office You must have JavaScript enabled to use this form. Was this page helpful? Yes No Report something wrong with this page Yes What was helpful about this page? We cannot reply individually to all feedback. If you need assistance, call 311. No What's wrong with this page? We cannot reply individually to all feedback. If you need assistance, call 311. Report something wrong with this page What's wrong with this page? We cannot reply individually to all feedback. If you need assistance, call 311. Leave this field blank Footer menu Jobs with the City Contact us About this website Footer Bottom Disclaimer Privacy policy City and County of San Francisco " -3642,https://dotnet.slcgov.com/police/useofforce#/chartpresentation,Use of Force Reports,Police & Public Interactions,"","",503,"","","","","","","","" -3643,https://www.sjpd.org/home/showpublisheddocument/680/637598755101770000,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -3644,https://data.sandiego.gov/,List of Data Sources,Info About Agencies,City of San Diego Open Data Portal," - Empowering San Diegans by making data usable. - ",200,City of San Diego Open Data Portal,[],"[""Find data"", ""See trends""]",[],[],"[""Parking meter revenue"", ""Street repair work"", ""Get water testing results"", ""Keep track of street sweeping"", ""Budget data since 2011""]",[],"City of San Diego | Mayor Todd Gloria City of San Diego | Mayor Todd Gloria Toggle navigation Data Browse Data Blog Toggle navigation Data Browse Data Blog Find data Search by dataset name, topic or City department Search by dataset name, topic or City department error Find data Search by dataset name, topic or City department Search by dataset name, topic or City department error Find data Search by dataset name, topic or City department Search by dataset name, topic or City department error Find data Search by dataset name, topic or City department Search by dataset name, topic or City department error Search by dataset name, topic or City department Search by dataset name, topic or City department error Search by dataset name, topic or City department Search by dataset name, topic or City department error The latest → Dataset download links have changed • Resources updated yesterday: • GB updated yesterday: The latest → Dataset download links have changed • Resources updated yesterday: • GB updated yesterday: The latest → Dataset download links have changed • Resources updated yesterday: • GB updated yesterday: The latest → → Dataset download links have changed • • Resources updated yesterday: • Resources updated yesterday: • GB updated yesterday: GB updated yesterday: Using the portal Using the data Get help How you used our data Your feedback Tell us Our services Our projects Learn more Using the portal Using the data Get help How you used our data Your feedback Tell us Our services Our projects Learn more Using the portal Using the data Get help Using the portal Using the data Get help Using the portal Using the data Get help Using the portal Using the data Using the portal Using the data Get help How you used our data Your feedback Tell us How you used our data Your feedback Tell us How you used our data Your feedback Tell us How you used our data Your feedback How you used our data Your feedback Tell us Our services Our projects Learn more Our services Our projects Learn more Our services Our projects Learn more Our services Our projects Our services Our projects Learn more See trends Parking meter revenue Check how much each of the City's smart parking meters made last year Street repair work Get a condition rating for each street in the City's network, plus view current and future street repair work Get water testing results Use this map of the sampling sites where the City’s Public Utilities Department tests for indicator bacteria. Keep track of street sweeping The City’s street sweeping schedule might not be the first thing on your mind when you’re looking for a parking spot - unless you’ve gotten one of those parking tickets. Budget data since 2011 Compare budgets with actual expenditures and revenue for the City's annual Operating and Capital budgets " -3645,"https://www.cityprotect.com/map/list/agencies/5ce2bdae3934cc0011edaebb?pageSize=2000&parentIncidentTypeIds=149,150,148,8,97,104,165,98,100,179,178,180,101,99,103,163,168,166,12,161,14,16,15&zoomLevel=12&latitude=37.27713331564453&longitude=-121.86547120605476&days=1,2,3,4,5,6,7&startHour=0&endHour=24&timezone=-08:00&fromDate=06%2F08%2F2020&toDate=06%2F10%2F2020",Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -3646,https://www.sanantonio.gov/Portals/0/Files/SAPD/OpenData/RacialProfilingReport2020.pdf,Stops,Police & Public Interactions,"","",200,"","","","","","","","" -3647,https://data.seattle.gov/,List of Data Sources,Info About Agencies,City of Seattle Open Data portal,"",200,City of Seattle Open Data portal,[],"[""Menu"", ""Browse Categories"", ""Powered by Seattle Open Data"", ""About Open Data""]",[],[],[],[],"Skip to main content Skip to footer links Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Menu Close Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Seattle Open Data Welcome to the City’s Open Data Portal. Here you can find, analyze, and download data published by City departments. All data on this portal is free to use and share, subject to the Terms of Use. Click here to view all data New to Open Data? A guide to getting started Powered by Seattle Open Data See what you can build with Open Data API Documentation Information for developers Suggest a Dataset Can't find what you are looking for? Let us know! Browse Categories Most Popular Seattle's most popular datasets Recently Added The City's newest datasets City Business Includes city fleet, City Council, wage data Community Includes neighborhoods, community organizations, and equity initiatives data Education Includes education and related social services data Finance Includes data on city financial operations Land Base Includes GIS layers Permitting Includes building, electrical, trade, and other permit types Public Safety Includes 911 data, police, fire, and other public safety agencies Transportation Includes bike counters and parking data Powered by Seattle Open Data Open Performance Open Budget Capital Projects Explorer COVID Emergency Food Resources SPD Crime Dashboard Seattle Fire Calls Unreinforced Masonry Dashboard Submit Your Open Data Project About Open Data Seattle is home to an engaged, innovative public that strives to make the city a better place to live. As a City, we strive to make our data open to the public, enabling those outside of government to find solutions to our most pressing civic challenges. The Open Data Program makes the data generated by the City of Seattle available to the public for the purpose of increasing the quality of life for our residents; increasing transparency, accountability and comparability; promoting economic development and research; and improving internal performance management. Click here to learn more about the program " -3648,https://www.sanantonio.gov/SAPD/Calls,Calls for Service,Police & Public Interactions,Transparency & Open Data - City of San Antonio,"The SAPD’s Open Data Initiative provides up-to-date access to SAPD data, reports, and documents.",200," - The City of San Antonio - Official City Website > Home -","[""Transparency & Open Data""]","[""Police Open Records Requests"", ""Open Data Library"", ""Recent Calls for Service"", ""Map of Calls for the Past Seven Days"", ""Explore Historical Call Data"", ""Community Crime Map"", ""Sex Offenders Search""]","[""Contact Us"", ""Get Social"", ""Visit Other San Antonio Sites"", ""Share Your Feedback""]",[],[],[],opens in new tab or window -3649,https://www.sanmarcostx.gov/556/Contact-the-Police-Department,Contact Info & Agency Meta,Info About Agencies,"Contact the Police Department | City of San Marcos, TX",Make contact with divisions and personnel within the Police Department.,200,"City of San Marcos, TX | Official Website","[""Contact the Police Department""]",[],"[""The physical address of the San Marcos Police Department is:"", ""Directions to the San Marcos Police Department:"", ""Contact Us"", ""Helpful Links"", ""Quick Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In About Us Transparency Services SMPD Jobs Search Home Departments Police Services How Do I... Contact the Police Department Contact the Police Department The San Marcos Police Department is open 24/7/365. Citizens can request Police, Fire, or EMS services by dialing 9-1-1 for emergencies and 512-753-2108 for non-emergent calls for service at any time. The Lobby of the Police Department is unlocked and available for public use regarding child custody exchanges, online safe exchange zone, and requests to speak with an on duty police officer. The video monitoring system in the lobby is monitored 24/7 by personnel of the department. The physical address of the San Marcos Police Department is: 2300 South IH 35 San Marcos, Texas 78666 Non-Emergency Dispatch: 512-753-2108 Option 2 Directions to the San Marcos Police Department: From Austin/North of San Marcos: Travel South on IH 35 to the Wimberly/Wonder World 202 Exit. Proceed forward through the traffic light at Wonder World Drive and the access road. The San Marcos Police Department will be on your right hand side past Life Storage. From San Antonio/South of San Marcos: Travel North of IH 35 to the Wimberly/Wonder World 202 Exit. Stay in the left lane after exiting and take the turnaround at the Wonder World Drive light to go south on the access road. The San Marcos Police Department will be on your right hand side past Life Storage. Apply For Alarm Permits Blue Santa Program Citizen Police Academy Employment Solicitation/Peddler Permit Street Closure Permit National Night Out Contact the Police Department Find Accident Reports Chief's Advisory Panel Cite and Release-Applicable Incidents Dashboard Hands Free Ordinance Officer Compensation & Benefits Police Blotter Police Testing Information Tips & Notifications Submit Open Records Request A Commendation Or Complaint Volunteer Blue Santa Program National Night Out Volunteers in Police Service (VIPS) Services SMPD Jobs File a Report Transparency Satisfaction Survey Anonymous Tips Contact Us San Marcos Police Department 2300 IH 35 S San Marcos, TX 78666 Main Line: 512-753-2108 Emergency: 9-1-1 Government Websites by CivicPlus® Helpful Links Apply for Alarm Permit Find an Accident Report File a Police Report /QuickLinks.aspx Quick Links Police Transparency SMPD Jobs Police Services /QuickLinks.aspx " -3650,https://www.crimemapping.com/map/location/san%20diego?id=,Crime Maps & Reports,Agency-Published Resources,CrimeMapping.com - Helping You Build a Safer Community,"",200,CrimeMapping.com - Helping You Build a Safer Community,"[""My Map Summary"", ""What"", ""Where"", ""When"", ""Display Options"", ""Location Selection"", ""Choose a Search Distance"", ""Timeframe Settings"", ""From:"", ""To:""]",[],[],[],[],[],"Preparing Map Content... Preparing Map Content... Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select San Diego Unified Port District, SanGIS, Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, Intermap, NGA, USGS | Search Location san diego Zoom to Receive Alerts Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select San Diego Unified Port District, SanGIS, Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, Intermap, NGA, USGS | Search Location san diego Zoom to Distance: Miles select Distance: Miles select Streets select San Diego Unified Port District, SanGIS, Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, Intermap, NGA, USGS | Search Location san diego Zoom to San Diego Unified Port District, SanGIS, Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, Intermap, NGA, USGS | Search Location san diego Zoom to San Diego Unified Port District, SanGIS, Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, Intermap, NGA, USGS | Search Location san diego Zoom to Search Location san diego Zoom to Search Location Search Location Search Location san diego san diego Zoom to Zoom to Zoom to Fetching Data. x Close Fetching Data. Fetching Data. Fetching Data. " -3651,https://communitycrimemap.com/?address=78205,Crime Maps & Reports,Agency-Published Resources,LexisNexis® Community Crime Map,"",200,LexisNexis® Community Crime Map,[],[],[],[],[],[],"" -3652,https://www.sandiego.gov/cpp/reports,Complaints & Misconduct,Info About Officers,Reports & Newsletters | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""Reports & Newsletters""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Footer"", ""Accessibility Tools""]","[""Newsletters"", ""Annual Reports"", ""CRB Response to Grand Jury Reports"", ""Quarterly Reports""]","[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -3653,"https://www.cityprotect.com/map/list/agencies/5ce2bd9e3934cc0011edac7b?toDate=2020-03-03T23:59:59.999Z&fromDate=2020-02-29T00:00:00.000Z&pageSize=2000&parentIncidentTypeIds=149,150,148,8,97,104,165,98,100,179,178,180,101,99,103,163,168,166,12,161,14,16,15&zoomLevel=11&latitude=40.791794129811684&longitude=-111.89896604989659&days=1,2,3,4,5,6,7&startHour=0&endHour=24&timezone=%2B00:00",Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -3654,http://www.slcpd.com/open-data/crimestatistics/,Crime Statistics,Agency-Published Resources,Crime Statistics – SLCPD,"Provides command staff profiles, bureaus within the department, how to get involved and become informed, employment information, and news releases.",200,SLCPD – Serving with Integrity,[],"[""Salt Lake City Crime Stats""]",[],"[""Contact"", ""Quick Links"", ""Recent News"", ""Latest Tweets""]","[""Disclaimer"", ""Accuracy:"", ""Liability:""]",[],"" -3656,https://www.sanantonio.gov/SAPD/SAPD-Open-Data-Initiative#182281929-open-data,Complaints & Misconduct,Info About Officers,Transparency & Open Data - City of San Antonio,"The SAPD’s Open Data Initiative provides up-to-date access to SAPD data, reports, and documents.",200,Error retrieving title: dictionary changed size during iteration,"[""Transparency & Open Data""]","[""Police Open Records Requests"", ""Open Data Library"", ""Recent Calls for Service"", ""Map of Calls for the Past Seven Days"", ""Explore Historical Call Data"", ""Community Crime Map"", ""Sex Offenders Search""]","[""Contact Us"", ""Get Social"", ""Visit Other San Antonio Sites"", ""Share Your Feedback""]",[],[],[],opens in new tab or window -3657,https://www.seattle.gov/police-manual/title-8---use-of-force/8000---use-of-force-core-principles,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3658,https://www.sanantonio.gov/SAPD/Officer-Involved-Shooting,Officer Involved Shootings,Police & Public Interactions,Officer-Involved Shootings - City of San Antonio,Reports by year of shootings that involved SAPD officers.,200," - The City of San Antonio - Official City Website > Home -","[""Officer-Involved Shootings""]","[""Search"", ""2024"", ""2023"", ""2022"", ""2021"", ""2020"", ""2019"", ""2018"", ""2017"", ""2016"", ""2015""]","[""Contact Us"", ""Get Social"", ""Visit Other San Antonio Sites"", ""Share Your Feedback""]",[],[],[],opens in new tab or window -3659,https://siouxfalls.org/police/complaints-commendations/complaints,Complaints & Misconduct,Info About Officers,View Complaints - City of Sioux Falls,Learn more about citizen complaints against officers.,200,Home - City of Sioux Falls,"[""View Complaints""]","[""Citizen Complaints Against Officers"", ""2023"", ""2022"", ""2021"", ""1st Qtr"", ""2nd Qtr"", ""3rd Qtr"", ""4th Qtr"", ""2020"", ""1st Qtr"", ""2nd Qtr"", ""3rd Qtr"", ""4th Qtr""]","[""There are four different categories of complaint findings:"", ""Contact Us"", ""Quick Links"", ""Share & Connect""]",[],"[""1st Qtr"", ""2nd Qtr"", ""3rd Qtr"", ""1st Qtr"", ""2nd Qtr"", ""3rd Qtr"", ""4th Qtr""]",[],opens in new tab or window -3660,https://www.seattle.gov/police/information-and-data/crime-dashboard,Crime Statistics,Agency-Published Resources,Crime Dashboard - Police | seattle.gov,An overview of crime data for the city of Seattle,200,Seattle.gov Home,"[""Crime Dashboard""]","[""Attention:"", ""Police"", ""City-Wide Information"", ""Policies""]","[""Year-End Crime Reports"", ""SPD Information""]",[],[],[],"" -3661,https://www.arcgis.com/apps/MapSeries/index.html?appid=94c31b66facc438b95d95a6cb6a0ff2e,Crime Maps & Reports,Agency-Published Resources,Map Series,This story map was created with the Story Map Series application in ArcGIS Online.,200,"","[""""]",[],[],[],[],[],"This story map requires JavaScript, but running JavaScript is not currently allowed - by your web browser. If you wish to view this story, please enable JavaScript in this browser or try a - different browser. 100% / 800px 100% / 640px 800px / 600px 640px / 480px 100% / 800px 100% / 640px 800px / 600px 640px / 480px 100% / 800px 100% / 640px 800px / 600px 640px / 480px 100% / 800px 100% / 640px 800px / 600px 640px / 480px 100% / 800px 100% / 640px 800px / 600px 640px / 480px 100% / 800px 100% / 640px 800px / 600px 640px / 480px 100% / 800px 100% / 640px 800px / 600px 640px / 480px 100% / 800px 100% / 640px 800px / 600px 640px / 480px An error has occurred " -3662,https://data.sfgov.org/Public-Safety/Law-Enforcement-Dispatched-Calls-for-Service-Close/2zdj-bwza,Calls for Service,Police & Public Interactions,Law Enforcement Dispatched Calls for Service: Closed | DataSF | City and County of San Francisco,"",200,DataSF | San Francisco Open Data,"[""Calls for Service by Call Type Frequency"", ""Map of Calls for Service by Police District"", ""Calls for Service Over Time by Police District"", ""Law Enforcement Dispatched Calls for Service by Year"", ""Manage Featured Content""]","[""Access this Dataset via OData"", ""Law Enforcement Dispatched Calls for Service: Closed"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Law Enforcement Dispatched Calls for Service: Closed"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Calls for Service Over Time by Police District …"", ""Map of Calls for Service by Police District …"", ""Calls for Service by Call Type Frequency …"", ""Department Metrics"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right."", ""Calls for Service Over Time by Police District …"", ""Map of Calls for Service by Police District …"", ""Calls for Service by Call Type Frequency …""]",[],[],"[""OData Endpoint""]",Skip to Main Content SFGov Coordinator's Portal About Help Toggle navigation Data SF Open Data Explore Browse Data Developers Sign In Showcase Publishing Academy Resources Blog SFGov Coordinator's Portal About Help Explore Browse Data Developers Search Sign In SFGov Coordinator's Portal About Help Toggle navigation Data SF Open Data Explore Browse Data Developers Sign In Showcase Publishing Academy Resources Blog SFGov Coordinator's Portal About Help Explore Browse Data Developers Search Sign In SFGov Coordinator's Portal About Help SFGov Coordinator's Portal About Help SFGov Coordinator's Portal About Help Toggle navigation Data SF Open Data Explore Browse Data Developers Sign In Showcase Publishing Academy Resources Blog SFGov Coordinator's Portal About Help Toggle navigation Data SF Open Data Explore Browse Data Developers Sign In Showcase Publishing Academy Resources Blog SFGov Coordinator's Portal About Help Explore Browse Data Developers Search Sign In Explore Browse Data Developers Search Sign In Explore Browse Data Developers Search Sign In -3663,https://www.sandiego.gov/police/about/procedures,Policies & Contracts,Info About Agencies,Policies and Procedures | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""Policies and Procedures""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Search for Documents"", ""Browse by Category"", ""Data & Transparency"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -3664,https://www.sanfranciscopolice.org/your-sfpd/policies/general-orders,Policies & Contracts,Info About Agencies,General Orders | San Francisco Police Department,"",200,San Francisco Police Department,"[""General Orders""]","[""Popular Search Terms:"", ""San Francisco Police Department""]","[""Non-Emergency"", ""City Services & Questions"", ""Anonymous Tip Line"", ""Text a Tip"", ""Contact Your Police Station"", ""SFPD Headquarters""]",[],[],[],"" -3665,https://www.seattle.gov/police-manual,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3666,https://data.sandiego.gov/datasets/police-ripa-stops/,Stops,Police & Public Interactions,RIPA police stop data - basic details - City of San Diego Open Data Portal," - All stops made by the San Diego Police Department. Data collected from these stops conforms to requirements set forth in Government Code section 12525.5 that... - ",200,City of San Diego Open Data Portal,[],"[""RIPA police stop data - basic details""]","[""Resources"", """", ""Additional Info""]","[""Stop details"", """"]",[],[],"City of San Diego | Mayor Todd Gloria City of San Diego | Mayor Todd Gloria Toggle navigation Data Browse Data (current) Blog Toggle navigation Data Browse Data (current) Blog RIPA police stop data - basic details All stops made by the San Diego Police Department. Data collected from these stops conforms to requirements set forth in Government Code section 12525.5 that was enacted as a result of the Racial and Identity Profiling Act of 2015 (AB 953). RIPA stops data collection began on July 1, 2018. Data on stops made before July is limited to vehicle stops and can be found in the police vehicle stops dataset This dataset includes basic information about a police stop that occurred, including stop date, time, duration and location, as well as a few details about the person stopped. Each row is a person stopped with both a pid , a unique identifier for the person, and a stop_id , a unique identifier for the stop. A single stop may involve multiple people, so any given stop_id may have more than one associated pid . To get additional details about the person stopped, such as the race, gender, and disability, as well as more information about the stop, such as actions taken and reason for the stop, join this basic stop data to the other datasets available at the following links Actions taken Contraband and/or evidence found Disability of persons Gender of persons Basis for property seizure Property seized Race of persons Basis for searches conducted Reason for stop Result of stop For more information about RIPA regulations, see the California Code of Regulations final text . Resources Resource Type Download Preview Stop details csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Dictionary csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Stop details This is a preview. If you would like to view the full resource, please download it above. No Results Rows per page 10 20 50 100 1 - 10 of Additional Info License Open Data Commons Public Domain Dedication and Licence (PDDL) Publisher Police Date Issued (YYYY-MM-DD) 2019-04-16 Date Modified (YYYY-MM-DD) 2024-02-09 Category Public Safety Maintainer City of San Diego Maintainer Email data@sandiego.gov " -3667,https://dotnet.slcgov.com/Police/CADCallsForService/,Calls for Service,Police & Public Interactions,"","",503,"","","","","","","","" -3668,https://www.cityofsacramento.org/-/media/Corporate/Files/Police/Transparency/GO/Section-500/GO-58002-Use-of-Force-91821.pdf?la=en,Policies & Contracts,Info About Agencies,Police Department | City of Sacramento,Sacramento Police Department,200,Home | City of Sacramento,"[""Sacramento Police Department""]","[""About"", ""Your SacPD"", ""Index"", ""Social Media""]","[""Search for content"", ""News and Information"", ""Reporting"", ""Popular Services"", ""More"", ""Call our Non-Emergency Number: 916-808-5471"", ""We're hiring!"", ""Meet the Chief"", ""Uncrewed Aircraft Systems (UAS)"", ""In the News""]",[],[],[],"" -3669,http://www.slcpd.com/transparency/,Policies & Contracts,Info About Agencies,Transparency – SLCPD,"Provides command staff profiles, bureaus within the department, how to get involved and become informed, employment information, and news releases.",200,SLCPD – Serving with Integrity,[],"[""Policies and Procedures""]",[],"[""Contact"", ""Quick Links"", ""Recent News"", ""Latest Tweets""]",[],[],"" -3670,http://www2.sjpd.org/records/pc-13650_library/Unit%20Guidelines/FTO%20MANUAL%20June%202019.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3671,https://www.sanmarcostx.gov/3155/SMPD-Policy,Policies & Contracts,Info About Agencies,"SMPD Policy | City of San Marcos, TX","SMPD Recognized Policies are current police policies. -SMPD Legacy Policies are policies from past administrations.",200,"City of San Marcos, TX | Official Website","[""SMPD Policy""]",[],"[""Contact Us"", ""Helpful Links"", ""Quick Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In About Us Transparency Services SMPD Jobs Search Home Departments Police About Us Department Documents SMPD Policy SMPD Policy Click on the link to view the SMPD Policy Manual (The link will take you to another page, and the policies are easiest to view in list mode which can be selected from the top right of the policy page.) Annual Reports SMPD Policy Police Department Documents Center Employment Documents Applications and Permitting Services SMPD Jobs File a Report Transparency Satisfaction Survey Anonymous Tips Contact Us San Marcos Police Department 2300 IH 35 S San Marcos, TX 78666 Main Line: 512-753-2108 Emergency: 9-1-1 Government Websites by CivicPlus® Helpful Links Apply for Alarm Permit Find an Accident Report File a Police Report /QuickLinks.aspx Quick Links Police Transparency SMPD Jobs Police Services /QuickLinks.aspx Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In About Us Transparency Services SMPD Jobs Search Home Departments Police About Us Department Documents SMPD Policy SMPD Policy Click on the link to view the SMPD Policy Manual (The link will take you to another page, and the policies are easiest to view in list mode which can be selected from the top right of the policy page.) Annual Reports SMPD Policy Police Department Documents Center Employment Documents Applications and Permitting Services SMPD Jobs File a Report Transparency Satisfaction Survey Anonymous Tips Contact Us San Marcos Police Department 2300 IH 35 S San Marcos, TX 78666 Main Line: 512-753-2108 Emergency: 9-1-1 Government Websites by CivicPlus® Helpful Links Apply for Alarm Permit Find an Accident Report File a Police Report /QuickLinks.aspx Quick Links Police Transparency SMPD Jobs Police Services /QuickLinks.aspx Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In About Us Transparency Services SMPD Jobs Search Home Departments Police About Us Department Documents SMPD Policy SMPD Policy Click on the link to view the SMPD Policy Manual (The link will take you to another page, and the policies are easiest to view in list mode which can be selected from the top right of the policy page.) Annual Reports SMPD Policy Police Department Documents Center Employment Documents Applications and Permitting Services SMPD Jobs File a Report Transparency Satisfaction Survey Anonymous Tips Contact Us San Marcos Police Department 2300 IH 35 S San Marcos, TX 78666 Main Line: 512-753-2108 Emergency: 9-1-1 Government Websites by CivicPlus® Helpful Links Apply for Alarm Permit Find an Accident Report File a Police Report /QuickLinks.aspx Quick Links Police Transparency SMPD Jobs Police Services /QuickLinks.aspx " -3672,https://www.sanjoseca.gov/your-government/appointees/independent-police-auditor/publications/archived-reports,Complaints & Misconduct,Info About Officers,"","",-1,"","","","","","","","" -3674,https://www.seattle.gov/police-manual/title-1---department-administration/1070---training,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3675,https://www.sjpd.org/community/community-services/community-service-officers,Contact Info & Agency Meta,Info About Agencies,Access Denied,"",200,Access Denied,"[""Access Denied""]",[],[],[],[],[],"" -3676,https://data.sandiego.gov/datasets/police-calls-for-service/,Calls for Service,Police & Public Interactions,Police Calls for Service - City of San Diego Open Data Portal," - Calls dispatched by the San Diego Police Department’s communicationsdispatch center. - ",200,City of San Diego Open Data Portal,[],"[""Police Calls for Service""]","[""Resources"", """", ""Additional Info""]","[""Police Calls for Service 2024"", """"]",[],[],"City of San Diego | Mayor Todd Gloria City of San Diego | Mayor Todd Gloria Toggle navigation Data Browse Data (current) Blog Toggle navigation Data Browse Data (current) Blog Police Calls for Service Calls dispatched by the San Diego Police Department’s communications -dispatch center. Data regarding sensitive incidents including domestic -violence, child abuse, suicide, sex crimes and stalking are excluded. -Priority Definitions are provided in this PDF file . Data regarding the disposition codes used by the Police Department can be -found here , while data about the SDPD Police beats -can be found here , call type definitions can be found here . Resources Resource Type Download Preview Police Calls for Service 2024 csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Police Calls for Service 2023 csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Police Calls for Service 2022 csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Police Calls for Service 2021 csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Police Calls for Service 2020 csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Police Calls for Service 2019 csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Police Calls for Service 2018 csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Police Calls for Service 2017 csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Police Calls for Service 2016 csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Police Calls for Service 2015 csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Police Calls for Service Dictionary csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Police Calls for Service 2024 This is a preview. If you would like to view the full resource, please download it above. No Results Rows per page 10 20 50 100 1 - 10 of Additional Info License Open Data Commons Public Domain Dedication and Licence (PDDL) Publisher Police Date Issued (YYYY-MM-DD) 2016-05-02 Date Modified (YYYY-MM-DD) 2024-03-25 Category Public Safety Maintainer City of San Diego Maintainer Email data@sandiego.gov " -3677,https://www.cityofsacramento.org/Police/Transparency/Education-and-Training-Materials,Policies & Contracts,Info About Agencies,Police Department | City of Sacramento,Sacramento Police Department,200,Home | City of Sacramento,"[""Sacramento Police Department""]","[""About"", ""Your SacPD"", ""Index"", ""Social Media""]","[""Search for content"", ""News and Information"", ""Reporting"", ""Popular Services"", ""More"", ""Call our Non-Emergency Number: 916-808-5471"", ""We're hiring!"", ""Meet the Chief"", ""Uncrewed Aircraft Systems (UAS)"", ""In the News""]",[],[],[],"" -3678,https://www.sanfranciscopolice.org/sites/default/files/2018-11/DGO%205.01.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3679,https://www.sanantonio.gov/Portals/0/Files/SAPD/GeneralManual/501.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3680,https://www.sanfranciscopolice.org/your-sfpd/published-reports/officer-involved-shootings-ois-data,Officer Involved Shootings,Police & Public Interactions,Officer Involved Shootings (OIS) Data | San Francisco Police Department,"",200,San Francisco Police Department,"[""Officer Involved Shootings (OIS) Data""]","[""Popular Search Terms:"", ""Memorandum of Understanding (MOU) with the San Francisco District Attorney's Office"", ""Officer-Involved Shootings, Suspect-Involved, 2009 – 2022*"", ""San Francisco Police Department""]","[""Non-Emergency"", ""City Services & Questions"", ""Anonymous Tip Line"", ""Text a Tip"", ""Contact Your Police Station"", ""SFPD Headquarters""]",[],[],[],"" -3681,https://www.sandiego.gov/sites/default/files/legacy/police/pdf/forattach.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3682,https://www.sanjoseinside.com/wp-content/uploads/2016/02/Use-of-Force-Policy.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3683,https://data.sanjoseca.gov/,List of Data Sources,Info About Agencies,Welcome - San Jose CA Open Data Portal,"",200,Welcome - San Jose CA Open Data Portal,"[""San Jose CA Open Data Portal""]","[""Groups"", ""Showcases"", ""Popular Datasets"", ""New and Recent Datasets""]","[""Search data"", ""Popular tags"", ""Impact of Geo-aware Emergency Response for Life and Safety"", ""The Nature of Fatal Crashes"", ""3-1-1 Outreach"", ""Unhoused Traffic Fatalities in San Jose"", ""3-1-1 Calls Transition from Police Call Center to Customer Contact Center"", ""Equitable Distribution of Citywide Scholarships"", ""BeautifySJ Encampment Trash Program"", ""Food Insecurity during COVID-19 Pandemic"", ""Violence Risk Factors Map"", ""Impact of Geo-aware Emergency Response for Life and Safety"", ""The Nature of Fatal Crashes"", ""3-1-1 Outreach"", ""Unhoused Traffic Fatalities in San Jose"", ""Police-Calls-for-Service"", ""Employee Compensation Plans"", ""San Jose Fire Incidents"", ""Crashes Data"", ""Animal Shelter Intake and Outcomes"", ""San Jose Fire Incidents"", ""311 Service Request Data"", ""Last 60-180 days Planning Permits"", ""Last 30 days Planning Permits"", ""Last 30 days building permits""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Departments Topics Transparency About Search Datasets Toggle navigation Datasets Departments Topics Transparency About Search Datasets Search Datasets San Jose CA Open Data Portal Committed to open and honest government Search data Search Popular tags city of san jose planning infrastructure Groups Geospatial Economy Public Safety Environment Education Showcases Previous Impact of Geo-aware Emergency Response for Life and Safety View Impact of Geo-aware Emergency Response for Life and Safety The Nature of Fatal Crashes View The Nature of Fatal Crashes 3-1-1 Outreach View 3-1-1 Outreach Unhoused Traffic Fatalities in San Jose View Unhoused Traffic Fatalities in San Jose 3-1-1 Calls Transition from Police Call Center to Customer Contact Center View 3-1-1 Calls Transition from Police Call Center to Customer Contact Center Equitable Distribution of Citywide Scholarships View Equitable Distribution of Citywide Scholarships BeautifySJ Encampment Trash Program View BeautifySJ Encampment Trash Program Food Insecurity during COVID-19 Pandemic View Food Insecurity during COVID-19 Pandemic Violence Risk Factors Map View Violence Risk Factors Map Impact of Geo-aware Emergency Response for Life and Safety View Impact of Geo-aware Emergency Response for Life and Safety The Nature of Fatal Crashes View The Nature of Fatal Crashes 3-1-1 Outreach View 3-1-1 Outreach Unhoused Traffic Fatalities in San Jose View Unhoused Traffic Fatalities in San Jose Next Popular Datasets Browse popular datasets below and see what other citizens find interesting. Police-Calls-for-Service 274 recent views CSV Employee Compensation Plans 221 recent views CSV DOCX San Jose Fire Incidents 137 recent views CSV Crashes Data 48 recent views CSV Animal Shelter Intake and Outcomes 33 recent views CSV New and Recent Datasets Browse new or modified datasets below. Click to view details or explore content. San Jose Fire Incidents Updated on March 25, 2024 CSV 311 Service Request Data Updated on March 25, 2024 CSV Last 60-180 days Planning Permits Updated on March 25, 2024 CSV Last 30 days Planning Permits Updated on March 25, 2024 CSV Last 30 days building permits Updated on March 25, 2024 CSV " -3684,https://www.sanantonio.gov/SAPD/Directory,Contact Info & Agency Meta,Info About Agencies,Contact & Connect - City of San Antonio,"Contact information for San Antonio Police Department offices, divisions and units, with contact options, emails, addresses, and phone numbers.",200," - The City of San Antonio - Official City Website > Home -","[""Contact & Connect""]","[""Phone"", ""Address"", ""Administration"", ""Community Policing Activities"", ""Ground Transportation Unit"", ""Investigations Division (CID)"", ""Mental Health Unit"", ""Property Room"", ""Recruiting & Training"", ""SAFFE Units & Crime Prevention Specialists"", ""Substations"", ""Other Useful Numbers"", ""Substation & SAFFE Lookup"", ""Crime Stoppers Hotline"", ""Get Social""]","[""Parking"", ""Phone"", ""Contact Us"", ""Get Social"", ""Visit Other San Antonio Sites"", ""Share Your Feedback""]",[],[],[],opens in new tab or window -3685,http://www.slcpd.com/police-policy-manual/,Policies & Contracts,Info About Agencies,Police Policy Manual – SLCPD,"Provides command staff profiles, bureaus within the department, how to get involved and become informed, employment information, and news releases.",200,SLCPD – Serving with Integrity,[],"[""Police Policy Manual"", ""To make the document easier to scroll through, follow these steps.""]",[],"[""Click the upper left button that looks like three lines to make the menu appear on the left."", ""Click the bottom button that resembles a document."", ""The policy outline is now available to scroll through on the left hand side."", ""Contact"", ""Quick Links"", ""Recent News"", ""Latest Tweets""]",[],[],"About Accreditation Bureaus & Staff Police Chief Mike Brown Administration Bureau Investigative Bureau Field Operations Bureau 1 Field Operations Bureau 2 Fallen Officers History Policies and Procedures Careers Sworn Careers New Hires Laterals Civilian Careers Community Engagement Bike Rodeos Community Academy Coffee with a Cop Community Liaison Officers Community Outreach Explorers (Police) National Night Out Against Crime Neighborhood Watch Promising Youth Project SpeedWatchSLC Resources Information 2022 Revised Crime Control Plan #3 2021 Crime Control Plan 2019 Annual Report Bicycle Resources Brochures/Folletos CALEA Law Enforcement Manual Civilian Review Board Community Connection Center Crime Reports Map Drone Program FAQ’S Glossary of Terms Gun Safety Tips Hate Crime Just for Kids Officer Involved Critical Incident Investigative Protocol Police Policy Manual Safety Practices Sexual Assault, Guide for Victims Victim Services Forms Alarm Permit Entry Anonymous Sexual Assault Reporting Background Clearance Request Bike Registry Community Academy Application Explorer Interest Form Home and Personal Property Inventory Home Security Checklist Neighborhood Watch Meeting Flier Online Police Report Property Crimes Case Priority Card Public Record Request (GRAMA) Ride-Along Form-Waiver Submit a Tip Trespassing Affidavit Open Data 2022 Revised Crime Control Plan #3 2021 Crime Control Plan 2019 Annual Report 2018 Annual Report Assaults on Officers CompStat Crime Statistics Police Calls for Service Response Times SLC Project Safe Neighborhoods Dashboard News News Release Sign-Up Media Request Form Cold Case Homicides Cold Case Missing Persons Contact Us ✕ Police Policy Manual To make the document easier to scroll through, follow these steps. 1 Click the upper left button that looks like three lines to make the menu appear on the left. 2 Click the bottom button that resembles a document. 3 The policy outline is now available to scroll through on the left hand side. Click here to view Police Department Policy Table of Contents viewable on page 7. Loading... Contact Address: 475 South 300 East Mailing Address: P.O. Box 145497 Salt Lake City, Utah 84114 Emergency | Non-Emergency: 911 | 801-799-3000 File a Police Report: https://slcpd.com/online-report/ Media Inquiries: 801-799-6397 Media Request Form Contact the Police Chief: https://slcpd.com/chief/ Quick Links Alarm Permit Entry ADA Notice Background Clearance Request CALEA Accreditation Public Comment EEOP 2021 Report GRAMA/Police Records Neighborhood Watch Police Calls for Service POSE Salt Lake City Government Website Special Needs Registry State of the City Address Decorum Submit a Tip Trespassing Affidavit Recent News SLCPD Gang, VCAT, Homicide Detectives Arrest Downtown Murder Suspect SLCPD Conducts Multi-Jurisdictional Drug Interdiction Mission Along Jordan River Trail SLCPD Provides an Update on an Assault in Downtown Salt Lake City SLCPD Investigating Assault in Westpointe Neighborhood, 1 Person Injured SLCPD Investigating Assault in Downtown Salt Lake City, 6 People Injured Latest Tweets Tweets by slcpd " -3686,https://www.slc.gov/boards/quarterly-reports/,Complaints & Misconduct,Info About Officers,Quarterly Reports | Boards and Commissions,Boards and Commissions,200,SLC.gov,"[""SLC.gov"", ""SLC.gov"", ""Boards and Commissions""]","[""Quarterly Reports""]","[""Salt Lake City"", ""Salt Lake City"", ""Additional Resources"", ""SLC.gov on Social Media""]","[""""]",[],[],"Close SLC.gov Salt Lake City Boards and Commissions Salt Lake City City Directory A-Z Calendar Payments Report a Broken Webpage Request or Report Permits & Licensing Privacy Policy Additional Resources SLC TV SLC Infobase Government Records (GRAMA) Parking in SLC Get Involved Questions? Contact Us SLC.gov on Social Media Follow us on Facebook Follow us on Twitter Subscribe to us on Youtube Follow us on Instagram City Hall 451 South State Street Salt Lake City, UT 84111 Salt Lake City City Directory A-Z Calendar Payments Report a Broken Webpage Request or Report Permits & Licensing Privacy Policy Additional Resources SLC TV SLC Infobase Government Records (GRAMA) Parking in SLC Get Involved Questions? Contact Us SLC.gov on Social Media Follow us on Facebook Follow us on Twitter Subscribe to us on Youtube Follow us on Instagram City Hall 451 South State Street Salt Lake City, UT 84111 City Hall 451 South State Street Salt Lake City, UT 84111 Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Rate this translation Your feedback will be used to help improve Google Translate Original text Original text Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate Rate this translation Your feedback will be used to help improve Google Translate " -3687,https://data-cosm.hub.arcgis.com/,List of Data Sources,Info About Agencies,SMTX Open Data,"Access data and interactive maps for the City of San Marcos, TX.",200,SMTX Open Data,[],[],[],[],[],[],"" -3688,http://www.slcpd.com/contact-us/,Contact Info & Agency Meta,Info About Agencies,Contact Us – SLCPD,"Provides command staff profiles, bureaus within the department, how to get involved and become informed, employment information, and news releases.",200,"Error retrieving title: HTTPSConnectionPool(host='www.slcpd.com', port=443): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known'))",[],"[""Contacting the Salt Lake City Police Department"", ""Contact Us""]","[""Online Police Reporting"", ""Employment Questions"", ""Hire an Officer/Police Officer Secondary Employment"", ""Frequently asked Questions""]","[""Online Police Report"", ""Stay Connected"", ""(801) 799-3000"", ""(801) 799-3100"", ""(801) 799-NEWS (6397)"", ""(801) 799-3367"", ""(801) 799-3041"", ""(801) 575-2401"", ""(801) 799-3533"", ""slcpd@slcgov.com"", ""slcpdpr@slcgov.com"", ""SLCPDOutreach@slcgov.com"", ""slcpdmotor@slcgov.com"", ""Event/Speaking Request Form"", ""Meeting Request Form"", ""askthechief@slcgov.com"", ""Evidence and Crime Lab"", ""Pioneer Precinct"", ""Public Safety Building"", ""(801) 799-3000"", ""(801) 799-3100"", ""(801) 799-NEWS (6397)"", ""(801) 799-3367"", ""(801) 575-2470"", ""(801) 799-3533"", ""slcpd@slcgov.com"", ""slcpdpr@slcgov.com"", ""SLCPDOutreach@slcgov.com"", ""slcpdmotor@slcgov.com"", ""Evidence and Crime Lab"", ""Pioneer Precinct"", ""Public Safety Building"", ""Find the Appropriate Contact to Make a Request"", ""Contact"", ""Quick Links"", ""Recent News"", ""Latest Tweets""]","[""LGBTQ Contact, brent.weisberg@slcgov.com"", ""LGBTQ Contact, brent.weisberg@slcgov.com""]","[""Non-Emergency"", ""General Information"", ""Media Inquiries / Communications and Media Relations Unit"", ""Community Outreach Unit / LGBTQ Contact"", ""Evidence/Property"", ""Airport"", ""Community Connection Center"", ""General Email Address"", ""Media Inquiries / Public Relations Unit"", ""Community Outreach Unit"", ""Traffic Enforcement"", ""Non-Emergency"", ""General Information"", ""Media Inquiries / Communications and Media Relations Unit"", ""Community Outreach Unit / LGBTQ Contact"", ""Evidence/Property"", ""Airport"", ""Community Connection Center"", ""General Email Address"", ""Media Inquiries / Public Relations Unit"", ""Community Outreach Unit"", ""Traffic Enforcement"", ""(801) 799-3113"", ""www.slcpd.com/faq""]","" -3689,https://sfgov.org/policecommission/police-commission-disciplinary-actions-veronese-reports,Complaints & Misconduct,Info About Officers,"Police Commission Disciplinary Actions - ""Veronese"" Report | San Francisco",Quarterly report of disciplinary actions by the Police Commission,200,City and County of San Francisco,"[""Police Commission Disciplinary Actions - \""Veronese\"" Report""]","[""Documents"", ""Documents"", ""Footer menu"", ""Footer Bottom""]","[""2023"", ""2022"", ""2021"", ""2020""]","[""Departments""]",[],[],"English Español 中文 Filipino Menu Services Departments Search Police Commission Disciplinary Actions - ""Veronese"" Report Quarterly report of disciplinary actions by the Police Commission Documents 2023 Police Commission Disciplinary Actions Report 1st Quarter 2023 Police Commission Disciplinary Actions Report 1st Quarter 2023 Police Commission Disciplinary Actions Report 2nd Quarter 2023 July 12, 2023 Police Commission Report of Disciplinary Actions, 2nd Quarter 2023 Police Commission Disciplinary Actions Report 3rd Quarter 2023 October 4, 2023 Police Commission Disciplinary Actions Report 3rd Quarter 2023 Police Commission Disciplinary Actions Report 4th Quarter 2023 January 10, 2024 Police Commission Disciplinary Actions Report 4th Quarter 2023 2022 Disciplinary Actions Report 1st Quarter 2022 Police Commission Disciplinary Actions Report 1st Quarter 2022 Disciplinary Actions Report 2nd Quarter 2022 July 15, 2022 Police Commission Disciplinary Actions Report 2nd Quarter 2022 Disciplinary Actions Report 3rd Quarter 2022 Police Commission Disciplinary Actions Report 3rd Quarter 2022 Disciplinary Actions Report 4th Quarter 2022 Police Commission Disciplinary Actions Report 4th Quarter 2022 2021 Disciplinary Actions Report 1st Quarter 2021 Police Commission Disciplinary Actions Report 1st Quarter 2021 Disciplinary Actions Report 2nd Quarter 2021 Police Commission Disciplinary Actions Report 2nd Quarter 2021 Disciplinary Actions Report 3rd Quarter 2021 Police Commission Disciplinary Actions Report 3rd Quarter 2021 Disciplinary Actions Report 4th Quarter 2021 Police Commission Disciplinary Actions Report 4th Quarter 2021 2020 Disciplinary Actions Report 1st Quarter 2020 Police Commission Disciplinary Actions Report 1st Quarter 2020 Disciplinary Actions Report 2nd Quarter 2020 Police Commission Disciplinary Actions Report 2nd Quarter 2020 Disciplinary Actions Report 3rd Quarter 2020 Police Commission Disciplinary Actions Report 3rd Quarter 2020 Disciplinary Actions Report 4th Quarter 2020 Police Commission Disciplinary Actions Report 4th Quarter 2020 Documents Departments Police Commission Department of Police Accountability You must have JavaScript enabled to use this form. Was this page helpful? Yes No Report something wrong with this page Yes What was helpful about this page? We cannot reply individually to all feedback. If you need assistance, call 311. No What's wrong with this page? We cannot reply individually to all feedback. If you need assistance, call 311. Report something wrong with this page What's wrong with this page? We cannot reply individually to all feedback. If you need assistance, call 311. Leave this field blank Footer menu Jobs with the City Contact us About this website Footer Bottom Disclaimer Privacy policy City and County of San Francisco " -3690,https://www.sanmarcostx.gov/DocumentCenter/View/19676/31-Basic-Training-Requirements,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3691,"https://www.sjpd.org/records/crime-stats-maps/force-analysis-data#:~:text=The%20San%20Jose%20Police%20Department,on%20our%20public%20web%20site.&text=For%20additional%20information%2C%20please%20contact,at%20408%2D277%2D5200.",Use of Force Reports,Police & Public Interactions,Access Denied,"",200,Access Denied,"[""Access Denied""]",[],[],[],[],[],"" -3692,https://www.sanfranciscopolice.org/stay-safe/crime-data/crime-reports,Crime Statistics,Agency-Published Resources,Crime Reports | San Francisco Police Department,"",200,San Francisco Police Department,"[""Crime Reports""]","[""Popular Search Terms:"", ""CompStat Policing in San Francisco"", ""CompStat Reports""]","[""Non-Emergency"", ""City Services & Questions"", ""Anonymous Tip Line"", ""Text a Tip"", ""Contact Your Police Station"", ""SFPD Headquarters""]",[],[],[],"" -3693,https://www.sanmarcostx.gov/DocumentCenter/View/19174/61-Response-to-Resistance-and-Aggression,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3694,San Marcos Police Department - Cite and Release (arcgis.com),Arrest Records,Police & Public Interactions,"","",-1,"","","","","","","","" -3695,https://www.sanantonio.gov/SAPD/SAPD-Open-Data-Initiative#182281928-use-of-force-incidents,Use of Force Reports,Police & Public Interactions,Transparency & Open Data - City of San Antonio,"The SAPD’s Open Data Initiative provides up-to-date access to SAPD data, reports, and documents.",200," - The City of San Antonio - Official City Website > Home -","[""Transparency & Open Data""]","[""Police Open Records Requests"", ""Open Data Library"", ""Recent Calls for Service"", ""Map of Calls for the Past Seven Days"", ""Explore Historical Call Data"", ""Community Crime Map"", ""Sex Offenders Search""]","[""Contact Us"", ""Get Social"", ""Visit Other San Antonio Sites"", ""Share Your Feedback""]",[],[],[],opens in new tab or window -3696,https://www.seattle.gov/police/information-and-data/arrest-dashboard,Arrest Records,Police & Public Interactions,Arrest Dashboard - Police | seattle.gov,An overview of Arrest data for the city of Seattle,200,Seattle.gov Home,"[""Arrest Dashboard""]","[""Attention:"", ""Police"", ""City-Wide Information"", ""Policies""]","[""Connect with Elected Officials"", ""Departments and Contacts"", ""Get Involved with the City"", ""Finance and Purchasing"", ""Issues and Initiatives"", ""Seattle Municipal Court"", ""Voting"", ""Your Rights and Regulations"", ""Animals"", ""Emergencies"", ""Fire"", ""Police"", ""Police Oversight"", ""Safety Tips"", ""Assistance and Discounts"", ""Discounted or Free Technology"", ""Grants and Funding"", ""Housing"", ""Services For..."", ""Utilities"", ""Classes and Trainings"", ""Data and Research"", ""Early Learning (age 3-5)"", ""Environment and Sustainability"", ""Youth Programs (age 14-24)"", ""About Seattle"", ""Parks"", ""Recreation"", ""Reservations and Events"", ""Urban Activities"", ""City Maintenance"", ""City Planning"", ""City Construction Projects"", ""Incentives for Housing Developers"", ""Neighborhood and Home Projects"", ""Parking"", ""Permits"", ""Transit and Commuting"", ""Resources"", ""Revised Code of Washington (RCW)"", ""SMC Library"", ""Public Arrests Dataset"", ""SPD Information""]",[],[],[],"" -3697,https://www.sanfranciscopolice.org/your-sfpd/published-reports,Stops,Police & Public Interactions,Published Reports | San Francisco Police Department,"",200,San Francisco Police Department,"[""Published Reports""]","[""Popular Search Terms:"", ""Department Published Reports"", ""Other Agency Reports"", ""San Francisco Police Department""]","[""Non-Emergency"", ""City Services & Questions"", ""Anonymous Tip Line"", ""Text a Tip"", ""Contact Your Police Station"", ""SFPD Headquarters"", ""Racial Equity & Inclusion Plan (REAP)"", ""Quarterly Activity & Data Report (QADR)"", ""Domestic Violence Data Report"", ""Crime Victim Data Reporting"", ""Investigated Hate Crimes Data"", ""Use of Force, Stops & Arrests"", ""Early Intervention System"", ""Firearms Discharges"", ""Officer-Involved Shootings (OIS) Data"", ""Memorandum of Understanding (MOU) with the San Francisco District Attorney's Office"", ""Stops Data"", ""Historical Traffic Stops Reports"", ""San Francisco Police Department Sworn Demographics"", ""San Francisco Police Department Historical Annual Reports"", ""Audits of Electronic Communication Devices for Bias"", ""Department Staffing Study by Matrix Consulting Group"", ""Staffing Analysis of the San Francisco Police Department"", ""Internal Affairs Division Misconduct Reports"", ""Disciplinary Reports"", ""Collaborative Reform Initiative"", ""Academic Institution Reports"", ""Partner Agency Reports""]",[],[],[],"" -3698,https://stlouiscountypolice.com/who-we-are/policies-and-procedures/,Policies & Contracts,Info About Agencies,Policies and Procedures - St. Louis County Police,"",200,Home - St. Louis County Police,"[""Policies and Procedures""]",[],[],[],"[""""]",[],"Who We Are Who We Are Get information about policies, procedures, department bureaus, our staff and more. Who We Are Board of Police Commissioners Bureau of Communications Chief of Police Command Staff Community Outreach Crime Laboratory Diversity and Inclusion Divisions and Bureaus Police Contract Services Never Forgotten Our History Policies and Procedures Regional Assets Resources & Services Resources & Services Find out how the St. Louis County Police can assist you. Resources/Services Compliment an Officer Conceal Carry Hire A St. Louis County Officer Human Trafficking Reporting Jail Inmate Information Prescription Drug Dropoff Records and Permits Report Drug Activity Sex Offender Registry Submit a Complaint Suicide Prevention Vacation Inspections Victim's Services Precincts Precincts The Department is comprised of eight precincts serving various parts of St. Louis County. Find your precinct now. Precincts North County Precinct Central County Precinct Affton Southwest Precinct South County Precinct Fenton Precinct Wildwood Precinct West County Precinct Jennings Precinct Join Our Team Join Our Team The St. Louis County Police Department is looking for motivated commissioned and professional staff to join our team. Apply today! Join Our Team Become a Police Officer Experienced Officers Professional Staff Security Officers Cadet Program Department News Department News Find out the latest news and information about the Department. Department News Press Release Public Information Connect With Us Connect With Us Need to contact our department, officers or units?  Start here! Connect With Us Backstoppers Citizens Satisfaction Survey CrimeStoppers Police Welfare Association St. Louis County Family Association St. Louis Police Foundation Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sudanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sudanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Who We Are Resources & Services Precincts Join Our Team Department News Connect With Us " -3699,https://data-stlcogis.opendata.arcgis.com/pages/open-data,List of Data Sources,Info About Agencies,Open Data,"Sharing St. Louis County's Data and the Tools to Visualize It What is Open Data? Open data is data that can be freely used, shared, and utilized by anyone. This data is provided by St. Louis County. You'll find maps, applications, reports, tables, and more. Click below to explore all of the available data or explore by category. All Data Community and Wellness Elections Imagery Property Information Public Safety Tax and Assessment Transportation Additional Resources Missouri Spatial Data Information Service Missouri Spatial Data Information Service- Making Missouri Available Digitally St. Louis Regional Data Alliance St. Louis Regional Data Alliance City of St. Louis Open Data Seal of the City of St. Louis Unlock the Data Explore Visualize & Analyze Build Share Anyone can use open data from St. Louis County Open Government at no cost. Download raw data and share your insights with your community or build new applications that serve specific users. Dig into the data. Highlight spatial patterns and discover trends. Develop new apps using open data. Embed analysis on your website. gis@stlouisco.com | 314.615.5000 | 41 S. Central Ave. | Clayton, MO 63105",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -3700,https://tpdrecruiting.tucsonaz.gov/academy,Policies & Contracts,Info About Agencies,Academy | TPD Recruiting,"Welcome to the Southern Arizona Law Enforcement Training Center.Your journey begins here...The basic training program is a 24-week curriculum, designed to challenge students mentally, physically, and academically.",200,Home | TPD Recruiting,"[""Academy""]","[""Breadcrumb"", ""Welcome to the Southern Arizona Law Enforcement Training Center."", ""Your journey begins here..."", ""Arriving at the Academy"", ""Vehicles & Parking"", ""Attire"", ""Grooming"", ""Meals"", ""Lockers"", ""Weapons"", ""Other Required Equipment and Supplies"", ""Lodging"", ""Standards of Conduct"", ""Training Standards"", ""Assignments & Examinations"", ""Fitness"", ""Menu"", ""Social Media Menu""]","[""The following links will take you directly to the listed topic on this page.""]","[""Physical Conditioning Standards"", ""General Exercise Pattern"", ""Cardiovascular Endurance"", ""Strength Training"", ""Flexibility"", ""Police Officer Physical Aptitude Test"", ""Applied Skills Proficiency"", ""Firearms Training & Qualifications"", ""Driver's Training"", ""Report Writing"", ""Defensive Tactics Training""]",[],[],"" -3701,https://stlouiscountypolice.com/connect-with-us/,Contact Info & Agency Meta,Info About Agencies,Connect With Us - St. Louis County Police,"",200,Home - St. Louis County Police,"[""Connect With US""]",[],[],"[""St. Louis County Police Department"", ""ST. LOUIS COUNTY POLICE PRECINCTS""]","[""""]",[],"Who We Are Who We Are Get information about policies, procedures, department bureaus, our staff and more. Who We Are Board of Police Commissioners Bureau of Communications Chief of Police Command Staff Community Outreach Crime Laboratory Diversity and Inclusion Divisions and Bureaus Police Contract Services Never Forgotten Our History Policies and Procedures Regional Assets Resources & Services Resources & Services Find out how the St. Louis County Police can assist you. Resources/Services Compliment an Officer Conceal Carry Hire A St. Louis County Officer Human Trafficking Reporting Jail Inmate Information Prescription Drug Dropoff Records and Permits Report Drug Activity Sex Offender Registry Submit a Complaint Suicide Prevention Vacation Inspections Victim's Services Precincts Precincts The Department is comprised of eight precincts serving various parts of St. Louis County. Find your precinct now. Precincts North County Precinct Central County Precinct Affton Southwest Precinct South County Precinct Fenton Precinct Wildwood Precinct West County Precinct Jennings Precinct Join Our Team Join Our Team The St. Louis County Police Department is looking for motivated commissioned and professional staff to join our team. Apply today! Join Our Team Become a Police Officer Experienced Officers Professional Staff Security Officers Cadet Program Department News Department News Find out the latest news and information about the Department. Department News Press Release Public Information Connect With Us Connect With Us Need to contact our department, officers or units?  Start here! Connect With Us Backstoppers Citizens Satisfaction Survey CrimeStoppers Police Welfare Association St. Louis County Family Association St. Louis Police Foundation Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sudanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sudanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Who We Are Resources & Services Precincts Join Our Team Department News Connect With Us " -3702,https://policestandards.tucsonaz.gov/,Complaints & Misconduct,Info About Officers,Tucson Police Professional Standards,Create your own initiative by combining existing applications with a custom site. Use this initiative to form teams around a problem and invite your community to participate.,200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -3703,https://siouxfalls.org/contactus/police/police-lec,Contact Info & Agency Meta,Info About Agencies,Police Law Enforcement Center - City of Sioux Falls,Contact information for the Police Law Enforcement Center in Sioux Falls.,200,Home - City of Sioux Falls,"[""Police Law Enforcement Center""]","[""IN CASE OF AN EMERGENCY DIAL 911."", ""Police Patrol Contacts"", ""Contact""]","[""Contact Us"", ""Quick Links"", ""Share & Connect""]",[],[],[],opens in new tab or window -3704,http://data-cotgis.opendata.arcgis.com/search?groupIds=b6a49faa168647d8b56e1a06bd53600f&q=arrests,Arrest Records,Police & Public Interactions,Tucson Open Data,"This is the City of Tucson's public platform for exploring and downloading open data, discovering and building apps, and engaging to solve important local issues.",200,Tucson Open Data,[],[],[],[],[],[],"" -3705,https://www.honolulupd.org/informatioNArrest-logs/,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -3706,https://qlikapps.tucsonaz.gov/sense/app/7be19d7b-7681-437e-989c-3a2e853ba712/sheet/bf1dbba0-dda8-4b13-bc99-f76ef8c80a07/state/analysis,Stops,Police & Public Interactions,Qlik Sense,"",200,Qlik Sense Hub,[],[],[],[],[],[],. . -3707,https://www.tucsonaz.gov/police/general-orders,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3708,https://www.tampa.gov/police/citizen-review-board-minutes,Complaints & Misconduct,Info About Officers,Citizen Review Board Minutes | City of Tampa,Minutes will be posted in the month following the meeting.,200,City of Tampa,"[""Citizen Review Board Minutes""]","[""Police Department"", ""Citizens Review Board Minutes ¶"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[],"" -3709,https://www.tulsapolice.org/content/internalaffairs.aspx ,Use of Force Reports,Police & Public Interactions,"","",404,"","","","","","","","" -3710,https://www.honolulupd.org/wp-content/uploads/2022/01/2021-Legislative-Report.pdf,Complaints & Misconduct,Info About Officers,"","",200,"","","","","","","","" -3711,https://public.powerdms.com/TAMPA/tree/documents/431884,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by Powered by Powered by Powered by -3712,http://www.slmpd.org/dept_contact.shtml,Contact Info & Agency Meta,Info About Agencies,Contact SLMPD,"",200,"Official Website of the Metropolitan Police Department, City of St. Louis",[],[],[],[],[],[],"Department Contact Information Trying to reach a specific section of the Department? You can visit the individual web pages of many of the divisions or use the list below. Emergency 911 St. Louis Police Department Non-Emergency Number 314-231-1212 Central Patrol Division (Districts 3,4) 314-444-2500 Child Abuse 314-444-5385 Domestic Abuse 314-444-5385 Gang Hotline 314-444-5775 Homicide 314-444-5371 Human Resources 314-444-5615 Internal Affairs 314-444-5405 St. Louis Police Library 314-444-5581 Media Relations 314-444-5603 Mounted Patrol 314-612-7941 North Patrol Division (Districts 5,6) 314-444-0001 Private Security 314-615-4272 Records Division 314-444-5541 St. Louis Police Academy 314-444-5630 Sex Crimes 314-444-5385 Sex Offender Registration 314-444-5302 South Patrol Division (Districts 1,2) 314-444-0100 Other Agencies CrimeStoppers 1-866-371-TIPS Citizens Service Bureau 314-622-4800 Neighborhood Stabilization 314-657-1392 Justice Center (City Jail) 314-621-5848 Animal Abuse/Stray Rescue 314-771-6121, ext. 232 St. Louis Police Foundation 314-825-3455 Commissioner on the Disabled and ADA Coordinator 314-622-3688 Department Contact Information Trying to reach a specific section of the Department? You can visit the individual web pages of many of the divisions or use the list below. Emergency 911 St. Louis Police Department Non-Emergency Number 314-231-1212 Central Patrol Division (Districts 3,4) 314-444-2500 Child Abuse 314-444-5385 Domestic Abuse 314-444-5385 Gang Hotline 314-444-5775 Homicide 314-444-5371 Human Resources 314-444-5615 Internal Affairs 314-444-5405 St. Louis Police Library 314-444-5581 Media Relations 314-444-5603 Mounted Patrol 314-612-7941 North Patrol Division (Districts 5,6) 314-444-0001 Private Security 314-615-4272 Records Division 314-444-5541 St. Louis Police Academy 314-444-5630 Sex Crimes 314-444-5385 Sex Offender Registration 314-444-5302 South Patrol Division (Districts 1,2) 314-444-0100 Other Agencies CrimeStoppers 1-866-371-TIPS Citizens Service Bureau 314-622-4800 Neighborhood Stabilization 314-657-1392 Justice Center (City Jail) 314-621-5848 Animal Abuse/Stray Rescue 314-771-6121, ext. 232 St. Louis Police Foundation 314-825-3455 Commissioner on the Disabled and ADA Coordinator 314-622-3688 Department Contact Information Trying to reach a specific section of the Department? You can visit the individual web pages of many of the divisions or use the list below. Emergency 911 St. Louis Police Department Non-Emergency Number 314-231-1212 Central Patrol Division (Districts 3,4) 314-444-2500 Child Abuse 314-444-5385 Domestic Abuse 314-444-5385 Gang Hotline 314-444-5775 Homicide 314-444-5371 Human Resources 314-444-5615 Internal Affairs 314-444-5405 St. Louis Police Library 314-444-5581 Media Relations 314-444-5603 Mounted Patrol 314-612-7941 North Patrol Division (Districts 5,6) 314-444-0001 Private Security 314-615-4272 Records Division 314-444-5541 St. Louis Police Academy 314-444-5630 Sex Crimes 314-444-5385 Sex Offender Registration 314-444-5302 South Patrol Division (Districts 1,2) 314-444-0100 Other Agencies CrimeStoppers 1-866-371-TIPS Citizens Service Bureau 314-622-4800 Neighborhood Stabilization 314-657-1392 Justice Center (City Jail) 314-621-5848 Animal Abuse/Stray Rescue 314-771-6121, ext. 232 St. Louis Police Foundation 314-825-3455 Commissioner on the Disabled and ADA Coordinator 314-622-3688 " -3713,https://suffolkpd.org/Information-and-Policies/Historical-Traffic-Stop-Data,Stops,Police & Public Interactions,Historical Traffic Stop Data,"",200," - Suffolk County Police Department -","[""Contact Us""]",[],[],"[""Facebook"", ""Facebook en Español"", ""Twitter"", ""YouTube"", ""Instagram"", ""Nixle"", ""Phone Directory"", ""Helpful Numbers"", ""852-Cops (2677)""]","[""Suffolkcountyny.gov"", ""Text Only Version"", ""This website provides valuable forms and information in order to address the needs of our community. If you have any questions or need additional information, please contact the Department at 631-852-6000 or email us at SCPDINFO@suffolkcountyny.gov . Interpretation services are available for individuals with Limited English Proficiency.""]",[],Suffolkcountyny.gov Text Only Version Traducir pagina en Español Suffolkcountyny.gov Text Only Version Traducir pagina en Español Suffolkcountyny.gov Text Only Version Traducir pagina en Español Traducir pagina en Español Select Language Chinese (Simplified) Haitian Creole Italian Polish Portugese Spanish Select Language Chinese (Simplified) Haitian Creole Italian Polish Portugese Spanish Select Language Chinese (Simplified) Haitian Creole Italian Polish Portugese Spanish Robert E. Waring Acting Police Commissioner Robert E. Waring Acting Police Commissioner Robert E. Waring Acting Police Commissioner Robert E. Waring Acting Police Commissioner Robert E. Waring Acting Police Commissioner Home Alerts Precincts and Specialized Units Police Reform Transparency Hub Mental Health Community Information Forms and Reports Join SCPD Nondiscrimination Compliance Home Alerts Precincts and Specialized Units Police Reform Transparency Hub Mental Health Community Information Forms and Reports Join SCPD Nondiscrimination Compliance Home Alerts Precincts and Specialized Units Police Reform Transparency Hub Mental Health Community Information Forms and Reports Join SCPD Nondiscrimination Compliance Home Alerts Precincts and Specialized Units Police Reform Transparency Hub Mental Health Community Information Forms and Reports Join SCPD Nondiscrimination Compliance Information and Policies > Historical Traffic Stop Data Information and Policies > Historical Traffic Stop Data Information and Policies > Historical Traffic Stop Data -3714,https://www.crimemapping.com/map/agency/165,Crime Maps & Reports,Agency-Published Resources,CrimeMapping.com - Helping You Build a Safer Community,"",200,CrimeMapping.com - Helping You Build a Safer Community,"[""My Map Summary"", ""What"", ""Where"", ""When"", ""Display Options"", ""Location Selection"", ""Choose a Search Distance"", ""Timeframe Settings"", ""From:"", ""To:""]",[],[],[],[],[],"Preparing Map Content... Preparing Map Content... Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Esri, HERE, Garmin, NGA, USGS | Zoom to Receive Alerts Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Esri, HERE, Garmin, NGA, USGS | Zoom to Distance: Miles select Distance: Miles select Streets select Esri, HERE, Garmin, NGA, USGS | Zoom to Esri, HERE, Garmin, NGA, USGS | Zoom to Esri, HERE, Garmin, NGA, USGS | Zoom to Zoom to Zoom to Zoom to Zoom to Fetching Data. x Close Fetching Data. Fetching Data. Fetching Data. x Close Share This Map My Map Summary The sum of the What, Where, When you’ve chosen. What * Data not provided by agency within map extent Where Broward County Police Boundary Agency Filter: Agency Name Here When Previous 7 Days Friday, May 1 - Friday, May 8 Restore Defaults Display Options What type(s) of records would you like to see? Select All | Deselect All Arson Assault Burglary Disturbing the Peace Drugs / Alcohol Violations DUI Fraud Homicide Motor Vehicle Theft Robbery Sex Crimes Theft / Larceny Vandalism Vehicle Break-In / Theft Weapons Sex Offender Sexual Predator * Data not provided by agency within map extent Location Selection Enter an Address, Feature or Location. Choose a Search Distance 500 feet 1000 feet 1500 feet 1/4 mile 1/2 mile 1 mile 2 miles Apply Remove Location Filter Timeframe Settings From how far back would you like to see records? **Note** This will not apply to Sex Offender data. Yesterday Previous 3 Days Previous Week Previous 4 Weeks Custom Time Range From: select Monday, March 18, 2024 To: select Sunday, March 24, 2024 Apply " -3715,"https://www.cityprotect.com/map/list/agencies?toDate=2021-12-26T23:59:59.999Z&fromDate=2021-12-23T00:00:00.000Z&pageSize=2000&parentIncidentTypeIds=149,150,148,8,97,104,165,98,100,179,178,180,101,99,103,163,168,166,12,161,14,16,15&zoomLevel=11&latitude=32.235000308515644&longitude=-110.95136753972832&days=1,2,3,4,5,6,7&startHour=0&endHour=24&timezone=%2B00:00&relativeDate=custom",Crime Maps & Reports,Agency-Published Resources,CityProtect,"",200,CityProtect,[],[],[],[],[],[],"" -3716,https://www.suffolkcountyny.gov/Portals/0/formsdocs/Boardofethics/Suffolk%20County%20SOP%20Manual-1.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3717,https://data-stlcogis.opendata.arcgis.com/datasets/stlcogis::2018-ucr-part-1-crimes-july-dec/about,Crime Statistics,Agency-Published Resources,2018 UCR Part 1 Crimes July-Dec,2018 Part 1 Crimes July-Dec for multiple police departments in St. Louis County (see description for details).,200,Saint Louis County Open Government,[],[],[],[],[],[],"" -3718,https://gis2-cityoftulsa.opendata.arcgis.com/,List of Data Sources,Info About Agencies,City of Tulsa - Open Data,"Explore our open data and tools, and use it build insights of your own.",200,City of Tulsa - Open Data,[],[],[],[],[],[],"" -3719,https://www.slmpd.org/images/2020_Annual_Report.pdf,Crime Statistics,Agency-Published Resources,"","",200,"","","","","","","","" -3720,https://www.crimemapping.com/map/sd/siouxfalls#,Crime Maps & Reports,Agency-Published Resources,CrimeMapping.com - Helping You Build a Safer Community,"",200,CrimeMapping.com - Helping You Build a Safer Community,"[""My Map Summary"", ""What"", ""Where"", ""When"", ""Display Options"", ""Location Selection"", ""Choose a Search Distance"", ""Timeframe Settings"", ""From:"", ""To:""]",[],[],[],[],[],"Preparing Map Content... Preparing Map Content... Receive Alerts Go 0 Records Date Range: Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Receive Alerts Receive Alerts Go 0 Records Date Range: Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select Distance: Miles select Distance: Miles select Streets select Fetching Data. x Close Fetching Data. Fetching Data. Fetching Data. x Close Share This Map My Map Summary The sum of the What, Where, When you’ve chosen. What * Data not provided by agency within map extent Where Broward County Police Boundary Agency Filter: Agency Name Here When Previous 7 Days Friday, May 1 - Friday, May 8 Restore Defaults Display Options What type(s) of records would you like to see? Select All | Deselect All Arson Assault Burglary Disturbing the Peace Drugs / Alcohol Violations DUI Fraud Homicide Motor Vehicle Theft Robbery Sex Crimes Theft / Larceny Vandalism Vehicle Break-In / Theft Weapons Sex Offender Sexual Predator * Data not provided by agency within map extent Location Selection Enter an Address, Feature or Location. Choose a Search Distance 500 feet 1000 feet 1500 feet 1/4 mile 1/2 mile 1 mile 2 miles Apply Remove Location Filter Timeframe Settings From how far back would you like to see records? **Note** This will not apply to Sex Offender data. Yesterday Previous 3 Days Previous Week Previous 4 Weeks Custom Time Range From: To: Apply " -3721,https://www.stlouis-mo.gov/data/index.cfm,List of Data Sources,Info About Agencies,Open Data | City of St. Louis,"",200,"City of St. Louis, MO: Official Website","[""City of St. Louis Open Data""]","[""Alerts and Announcements"", ""Get Started"", ""Recently Added"", ""Dashboards"", ""Datasets By Topic"", ""Quick Stats"", ""Data by Format"", ""Data By Department"", ""Data by Tag"", ""All Datasets"", ""More Data and Reports"", ""Social Media and Feeds"", ""Site Navigation"", ""Assistance"", ""Contact Us"", ""You are leaving the City of St. Louis website""]",[],"[""Business and Industry"", ""Community"", ""Education and Training"", ""Employment, Jobs, and Careers"", ""Environment"", ""Government"", ""Health"", ""Housing"", ""Law, Safety, and Justice"", ""Leisure and Culture"", ""Transportation, Infrastructure, and Utilities"", ""Urban Development and Planning""]",[],[],Skip to search Skip to content English Español Français Tiếng Việt پښتو Bosanski فارسی More STLOUIS -MO GOV Mayor Tishaura O. Jones Menu Search Services Government News Site Search English Español Français Tiếng Việt پښتو Bosanski فارسی More English Español Français Tiếng Việt پښتو Bosanski فارسی More STLOUIS -MO GOV Mayor Tishaura O. Jones Menu Search Services Government News Site Search STLOUIS -MO GOV Mayor Tishaura O. Jones Menu Search Services Government News Site Search STLOUIS -MO GOV Mayor Tishaura O. Jones Menu Search Services Government News Site Search STLOUIS -MO GOV Mayor Tishaura O. Jones STLOUIS -MO GOV Mayor Tishaura O. Jones Menu Search Services Government News Site Search Menu Search Services Government News Alerts and Announcements -3722,https://opendata.suffolkcountyny.gov/,List of Data Sources,Info About Agencies,"Suffolk County, New York Open Data",Suffolk County Open Data,200,"Suffolk County, New York Open Data",[],[],[],[],[],[],"" -3724,https://www.tulsapolice.org/contact-tpd/contact-usphone.aspx,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -3725,https://dataworks.siouxfalls.org/,List of Data Sources,Info About Agencies,City of Sioux Falls GIS,City of Sioux Falls GIS,200,City of Sioux Falls GIS,[],[],[],[],[],[],"" -3726,https://www.tucsonaz.gov/files/police/general-orders/2000USE_OF_FORCE.pdf,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3727,https://suffolkpd.org/Contact-Us,Contact Info & Agency Meta,Info About Agencies,Contact Us,"",200," - Suffolk County Police Department -","[""Contact Us""]","[""Contact Us""]",[],"[""Facebook"", ""Facebook en Español"", ""Twitter"", ""YouTube"", ""Instagram"", ""Nixle"", ""Phone Directory"", ""Helpful Numbers"", ""852-Cops (2677)""]","[""Suffolkcountyny.gov"", ""Text Only Version"", ""This website provides valuable forms and information in order to address the needs of our community. If you have any questions or need additional information, please contact the Department at 631-852-6000 or email us at SCPDINFO@suffolkcountyny.gov . Interpretation services are available for individuals with Limited English Proficiency.""]",[],"Suffolkcountyny.gov Text Only Version Traducir pagina en Español Suffolkcountyny.gov Text Only Version Traducir pagina en Español Suffolkcountyny.gov Text Only Version Traducir pagina en Español Traducir pagina en Español Select Language Chinese (Simplified) Haitian Creole Italian Polish Portugese Spanish Select Language Chinese (Simplified) Haitian Creole Italian Polish Portugese Spanish Select Language Chinese (Simplified) Haitian Creole Italian Polish Portugese Spanish Robert E. Waring Acting Police Commissioner Robert E. Waring Acting Police Commissioner Robert E. Waring Acting Police Commissioner Robert E. Waring Acting Police Commissioner Robert E. Waring Acting Police Commissioner Home Alerts Precincts and Specialized Units Police Reform Transparency Hub Mental Health Community Information Forms and Reports Join SCPD Nondiscrimination Compliance Home Alerts Precincts and Specialized Units Police Reform Transparency Hub Mental Health Community Information Forms and Reports Join SCPD Nondiscrimination Compliance Home Alerts Precincts and Specialized Units Police Reform Transparency Hub Mental Health Community Information Forms and Reports Join SCPD Nondiscrimination Compliance Home Alerts Precincts and Specialized Units Police Reform Transparency Hub Mental Health Community Information Forms and Reports Join SCPD Nondiscrimination Compliance Contact Us Contact Us Contact Us Contact Us A department representative will normally respond to your message within three business days. If you are writing about an EMERGENCY, please dial 911 immediately. If you are outside of Suffolk County and have an emergency, dial our emergency communications center at 631-852-6400. First Precinct Commanding Officer 555 Rt 109, W.Babylon, NY 11704 SCPD.1STPRECINCT@suffolkcountyny.gov 30 Yaphank Ave, Yaphank NY 11980 SCPD.INTERNALAFFAIRS@suffolkcountyny.gov Second Precinct Commanding Officer 1071 Park Ave, Huntington, NY 11743 SCPD.2NDPRECINCT@suffolkcountyny.gov Marine Bureau Commanding Officer Great River, NY 11739 SCPD.MARINEBUREAU@suffolkcountyny.gov Third Precinct Commanding Officer 1630 5th Ave, Bay Shore, NY 11706 SCPD.3RDPRECINCT@suffolkcountyny.gov Recruitment 30 Yaphank Ave, Yaphank NY 11980 Ph: 1-800-SCP-EXAM joinscpd@suffolkcountyny.gov Join SCPD Fourth Precinct Commanding Officer 727 Veterans Mem. Hwy, Smithtown, NY 11787 SCPD.4THPRECINCT@suffolkcountyny.gov ID Theft 30 Yaphank Ave, Yaphank NY 11980 idtheft@suffolkcountyny.gov Fifth Precinct Commanding Officer 125 Waverly Ave, Patchogue, NY 11772 SCPD.5THPRECINCT@suffolkcountyny.gov Hate Crimes Unit 30 Yaphank Ave, Yaphank NY 11980 SCPD.HATECRIMESUNIT@suffolkcountyny.gov Sixth Precinct Commanding Officer 400 Middle Country Road Selden, NY 11784 SCPD.6THPRECINCT@suffolkcountyny.gov All Other E-Mail & General Information SCPDINFO@suffolkcountyny.gov Seventh Precinct Commanding Officer 1491 Wm. Floyd Pkwy, Shirley, NY 11967 SCPD.7THPRECINCT@suffolkcountyny.gov Commissioner of Police 30 Yaphank Ave, Yaphank NY 11980 SCPDINFO@suffolkcountyny.gov Phone Directory " -3728,https://suffolkcountyny.gov/Police-Reform/Resources,Complaints & Misconduct,Info About Officers,Resources,"Suffolk County, New York has a vibrant history, illustrated in our important Native American and Revolutionary-era historical sites as well as the lab where DNA was discovered.",200," - Suffolk County Government -","[""Resources"", ""Contact Us:""]",[],"["""", ""public​.input​@suffolkcountyny​.gov""]",[],"[""Text Only Version""]",[],"Text Only Version × search Text Only Version × search Text Only Version × search × search × search × search × × Select Language Chinese (Simplified) Haitian Creole Italian Polish Portugese Spanish Select Language Chinese (Simplified) Haitian Creole Italian Polish Portugese Spanish Select Language Chinese (Simplified) Haitian Creole Italian Polish Portugese Spanish Suffolk County Police Reform & Reinvention Task Force Suffolk County Police Reform & Reinvention Task Force Suffolk County Police Reform & Reinvention Task Force Police Reform Home Police Reform Progress Tracker Member Bios Foundations for Reform Forum and Public Comments TF Meetings Resources Police Reform Home Police Reform Progress Tracker Member Bios Foundations for Reform Forum and Public Comments TF Meetings Resources Police Reform Home Police Reform Progress Tracker Member Bios Foundations for Reform Forum and Public Comments TF Meetings Resources Police Reform Home Police Reform Progress Tracker Member Bios Foundations for Reform Forum and Public Comments TF Meetings Resources Police Reform / Resources Police Reform / Resources Resources Link to Governor Cuomo's Executive Order 203: https://www.governor.ny.gov/sites/governor.ny.gov/files/atoms/files/EO_203.pdf SCPD Crime Comparison Click here New York State Police Reform and Reinvention Collaborative Resources & Guide for Public Officials and Citizens Click here For statistical data and information we provide, below we have referenced the corresponding section of the New York State Police Reform and Reinvention Collaborative document SCPD Internal Affairs 2019 Reports Click here Reference: page 57 of NYS guidance document; Section 2., Tracking and Reviewing Use of Force and Identifying Misconduct School Resource Officer Statistics Click here Reference page 18 of NYS guidance document; Question, “Should Law Enforcement Have a Presence in Schools?” 911 Call Center Statistics & Training Click here Reference page 17 of NYS guidance document; Question, “What function should 911 call centers play in your community.” SCPD Staffing Click here Reference page 19 of NYS guidance document; Section 2., Staffing, Budgeting, and Equipping Your Police Department Use of Firearms and Deadly Force Protocols Click here Reference Page 57 of NYS guidance document; Section 2., Tracking and Reviewing Use of Force and Identifying Misconduct Use of Less Lethal Weapons and Equipment Protocols Click here Reference Page 57 of NYS guidance document; Section 2., Tracking and Reviewing Use of Force and Identifying Misconduct Use of Physical Force Protocols Click here Reference Page 57 of NYS guidance document; Section 2., Tracking and Reviewing Use of Force and Identifying Misconduct 2019 Traffic Stop Data Click here Historical Traffic Stop Data: https://www.suffolkpd.org/HistoricalTrafficStopData.aspx Reference Page 26 of NYS guidance document; Section 1., Procedural Justice and Community Policing, “Discriminatory or Bias-Based Stops, Searches and Arrest” John J. Finn Institute Suffolk County Traffic Stop Data: Click here RFEI for Body Worn Camera for Sworn Members of SCPD Click here Reference page 80 of NYS guidance document; Question, “Should your police department leverage video cameras to ensure law enforcement accountability and increase transparency?” SCPD School Resource Officer MOU Click here Reference page 18 of NYS guidance document; Question, “Should Law Enforcement Have a Presence in Schools?” " -3730,https://stlouiscountypolice.com/st-louis-county-municipal-crime-map/,Crime Maps & Reports,Agency-Published Resources,St. Louis County Crime Map - St. Louis County Police,"",200,Home - St. Louis County Police,"[""St. Louis County and Municipal Crime Map""]",[],[],[],"[""""]",[],"Who We Are Who We Are Get information about policies, procedures, department bureaus, our staff and more. Who We Are Board of Police Commissioners Bureau of Communications Chief of Police Command Staff Community Outreach Crime Laboratory Diversity and Inclusion Divisions and Bureaus Police Contract Services Never Forgotten Our History Policies and Procedures Regional Assets Resources & Services Resources & Services Find out how the St. Louis County Police can assist you. Resources/Services Compliment an Officer Conceal Carry Hire A St. Louis County Officer Human Trafficking Reporting Jail Inmate Information Prescription Drug Dropoff Records and Permits Report Drug Activity Sex Offender Registry Submit a Complaint Suicide Prevention Vacation Inspections Victim's Services Precincts Precincts The Department is comprised of eight precincts serving various parts of St. Louis County. Find your precinct now. Precincts North County Precinct Central County Precinct Affton Southwest Precinct South County Precinct Fenton Precinct Wildwood Precinct West County Precinct Jennings Precinct Join Our Team Join Our Team The St. Louis County Police Department is looking for motivated commissioned and professional staff to join our team. Apply today! Join Our Team Become a Police Officer Experienced Officers Professional Staff Security Officers Cadet Program Department News Department News Find out the latest news and information about the Department. Department News Press Release Public Information Connect With Us Connect With Us Need to contact our department, officers or units?  Start here! Connect With Us Backstoppers Citizens Satisfaction Survey CrimeStoppers Police Welfare Association St. Louis County Family Association St. Louis Police Foundation Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sudanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Albanian Amharic Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chichewa Chinese (Simplified) Chinese (Traditional) Corsican Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Frisian Galician Georgian German Greek Gujarati Haitian Creole Hausa Hawaiian Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Kazakh Khmer Korean Kurdish (Kurmanji) Kyrgyz Lao Latin Latvian Lithuanian Luxembourgish Macedonian Malagasy Malay Malayalam Maltese Maori Marathi Mongolian Myanmar (Burmese) Nepali Norwegian Pashto Persian Polish Portuguese Punjabi Romanian Russian Samoan Scottish Gaelic Serbian Sesotho Shona Sindhi Sinhala Slovak Slovenian Somali Spanish Sudanese Swahili Swedish Tajik Tamil Telugu Thai Turkish Ukrainian Urdu Uzbek Vietnamese Welsh Xhosa Yiddish Yoruba Zulu Who We Are Resources & Services Precincts Join Our Team Department News Connect With Us " -3731,https://data-stlcogis.opendata.arcgis.com/apps/st-louis-county-police-department-uses-of-force/explore,Use of Force Reports,Police & Public Interactions,"","",404,"","","","","","","","" -3732,https://www.stlouis-mo.gov/government/city-laws/ordinances/ordinance.cfm?ord=71186,Policies & Contracts,Info About Agencies,Ordinance 71186 -- Police Use of Force Policies,"",200,Error retrieving title: dictionary changed size during iteration,"[""Ordinance 71186""]","[""Alerts and Announcements"", ""Summary"", ""Download"", ""Overview"", ""Legislative History"", ""Related"", ""Social Media and Feeds"", ""Site Navigation"", ""Assistance"", ""Contact Us"", ""You are leaving the City of St. Louis website""]","[""Laws and Lawmaking"", ""First Reading"", ""Second Reading"", ""Perfection"", ""Third Reading""]",[],[],[],Skip to search Skip to content English Español Français Tiếng Việt پښتو Bosanski فارسی More STLOUIS -MO GOV Mayor Tishaura O. Jones Menu Search Services Government News Site Search English Español Français Tiếng Việt پښتو Bosanski فارسی More English Español Français Tiếng Việt پښتو Bosanski فارسی More STLOUIS -MO GOV Mayor Tishaura O. Jones Menu Search Services Government News Site Search STLOUIS -MO GOV Mayor Tishaura O. Jones Menu Search Services Government News Site Search STLOUIS -MO GOV Mayor Tishaura O. Jones Menu Search Services Government News Site Search STLOUIS -MO GOV Mayor Tishaura O. Jones STLOUIS -MO GOV Mayor Tishaura O. Jones Menu Search Services Government News Site Search Menu Search Services Government News Alerts and Announcements Government Laws of the City Ordinances Government Laws of the City Ordinances Government Laws of the City Ordinances Government Laws of the City Ordinances -3733,https://www.siouxfalls.org/police/annual-report,Crime Statistics,Agency-Published Resources,Annual Report - City of Sioux Falls,"The annual report published by the Sioux Falls Police Department provides an overview of notable departmental updates, crime statistics, and the use of data analysis for planning and comparison purposes.",200,Home - City of Sioux Falls,"[""Annual Report""]","[""Resources""]","[""Contact Us"", ""Quick Links"", ""Share & Connect""]",[],[],[],opens in new tab or window -3734,https://www.tulsapolice.org/media/Policy%20Manual10012021_Redacted.pdf,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3735,https://www.suffolkcountysheriffsoffice.com/use-of-force-policy,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3736,https://public.powerdms.com/TAMPA/documents/424130,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3737,https://qlikapps.tucsonaz.gov/sense/app/d9940d02-7edc-4a05-9d49-4c8fec425638/sheet/59109cf4-6bf8-4a25-a613-e3c6328825e6/state/analysis,Use of Force Reports,Police & Public Interactions,Qlik Sense,"",200,Qlik Sense Hub,[],[],[],[],[],[],. . -3738,https://suffolkcountyny.gov/Portals/0/formsdocs/police%20reform/911%20Call%20Center%20Data.pdf,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -3739,https://data.honolulu.gov/,List of Data Sources,Info About Agencies,Honolulu - Open Data Portal | Honolulu - Open Data Portal,"",200,Honolulu - Open Data Portal | Honolulu - Open Data Portal,"[""Open Data Honolulu""]","[""Menu""]",[],"[""Honolulu 311"", ""Building Permits"", ""Crime Incidents"", ""Traffic Incidents""]",[],[],"Skip to main content Skip to footer links Search Home Catalog Tutorials Developer Suggest Sign In Menu Menu Close Home Catalog Tutorials Developer Suggest Sign In Search Open Data Honolulu E Komo Mai! Welcome to City and County of Honolulu's open data portal  Catalog Don't know what you want? Click here to view and search our entire Catalog . 🚖 Public Safety Interested in Public Safety? Our Public Safety datasets are just a click away. 💰 Finance Budgets and spending are your thing?  Click here to view our Finance datasets. 🏦 Business Doing business with the City? Here's your link to our Business datasets. 🚘 Transportation Curious about a transportation topic?  Click here to view datasets in our Transportation category.  Location Trying to find something?  Check out the Location category. Checking in seconds ... Honolulu 311 Broken streetlights, cracked sidewalks, derelict or abandoned vehicles and more from the Honolulu 311 app Building Permits Building permits provided by the Department of Planning and Permitting Crime Incidents Crime Incidents is a snapshot of incidents provided by the Honolulu Police Department Traffic Incidents Traffic updates provided by the Honolulu Police Department Checking in seconds ... Search Home Catalog Tutorials Developer Suggest Sign In Menu Menu Close Home Catalog Tutorials Developer Suggest Sign In Search Open Data Honolulu E Komo Mai! Welcome to City and County of Honolulu's open data portal  Catalog Don't know what you want? Click here to view and search our entire Catalog . 🚖 Public Safety Interested in Public Safety? Our Public Safety datasets are just a click away. 💰 Finance Budgets and spending are your thing?  Click here to view our Finance datasets. 🏦 Business Doing business with the City? Here's your link to our Business datasets. 🚘 Transportation Curious about a transportation topic?  Click here to view datasets in our Transportation category.  Location Trying to find something?  Check out the Location category. Checking in seconds ... Honolulu 311 Broken streetlights, cracked sidewalks, derelict or abandoned vehicles and more from the Honolulu 311 app Building Permits Building permits provided by the Department of Planning and Permitting Crime Incidents Crime Incidents is a snapshot of incidents provided by the Honolulu Police Department Traffic Incidents Traffic updates provided by the Honolulu Police Department Checking in seconds ... Search Home Catalog Tutorials Developer Suggest Sign In Menu Menu Close Home Catalog Tutorials Developer Suggest Sign In Search Search Home Catalog Tutorials Developer Suggest Sign In Menu Search Search Search Search Home Catalog Tutorials Developer Suggest Sign In Menu Home Catalog Tutorials Developer Suggest Sign In Menu Home Catalog Tutorials Developer Suggest Home Catalog Tutorials Developer Suggest Sign In Sign In Menu Close Home Catalog Tutorials Developer Suggest Sign In Search Home Catalog Tutorials Developer Suggest Sign In Search Home Catalog Tutorials Developer Suggest Sign In Search Search " -3740,https://www.honolulupd.org/informatioNAnnual-report/,Crime Statistics,Agency-Published Resources,"","",404,"","","","","","","","" -3741,https://www.tampa.gov/police/contact-us,Contact Info & Agency Meta,Info About Agencies,Contact Us - Police | City of Tampa,"",200,City of Tampa,"[""Contact Us - Police""]","[""Police Department"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]","[""For Emergencies (Police - Fire - Medical) ¶"", ""DIAL 9-1-1 ¶"", ""For Non-Emergencies ¶"", ""call: (813) 231-6130 ¶"", ""TPD Weekday (M-F) Phone Numbers ¶"", ""Other Phone Numbers ¶""]","[""You may also send a NON EMERGENCY message online ¶"", ""Other Agencies ¶""]",[],[],"" -3743,https://www.tulsapolice.org/content/internalaffairs.aspx,Complaints & Misconduct,Info About Officers,"","",404,"","","","","","","","" -3744,https://www.honolulupd.org/contact-us/,Contact Info & Agency Meta,Info About Agencies,Contact Us - Honolulu Police Department,Honolulu Police Department Contact Us,200,403 Forbidden,"[""Honolulu Police Department Ka 'Oihana Māka'i o Honolulu"", ""Contact Us""]","[""Primary Sidebar"", ""Footer""]","[""The Honolulu Police Department (Official Site)"", ""Sitemap"", ""Additional Links""]",[],[],[],"Skip to primary navigation Skip to main content Skip to primary sidebar Skip to footer Honolulu Police Department Ka 'Oihana Māka'i o Honolulu Honolulu Police Department Honolulu Police Department Ka 'Oihana Māka'i o Honolulu Organization Info & Resources Community Programs Careers Police Services About Us Search this website Emergency 911 or Contact (808) 529-3111 Facebook Instagram YouTube X icon Tik Tok Contact Us Situations requiring immediate attention should be reported by telephone. Call 9-1-1 For other types of assistance call (808)529-3111 If you are calling from outside of Oahu to report an emergency, please dial (808)529-3111, and press “0” for a police operator. To report Terrorist Activity or for information regarding terrorism click here . Mail The Honolulu Police Department is unable to provide certain types of information via the Internet, such as police reports, in depth statistical, and personal information of any type because the identity of the sender cannot be verified. “ Official Requests” for information can be made in writing and sent via mail to the main police headquarters Honolulu Police Department 801 South Beretania Street Honolulu, HI 96813 Online Email Form You can use the online email form below to send messages directly to the appropriate departments within the Honolulu police department. Contact Us Contact * Select a recipient Burglar Alarm Questions Cold Case-Homicide Commend an Officer Community Affairs Division Criminal Investigation Division - Na Maka Detective Division - Criminal Investigations District 1 - Honolulu District 2 - Wahiawa/North Shore District 3 - Aiea / Pearl City / Waipahu District 4 - Waimanalo/Kailua/Kaneohe/Kahuku District 5 - Nuuanu/Kalihi/Alewa/Salt Lake District 6 - Waikiki District 7 - East Honolulu (Punahou to Makapu'u) District 8 - Kapolei/Waianae/Makaha Employment Questions Firearms Questions General Questions Honolulu Police Commission Officer Complaints Patch Requests Pathways Internship Program Police Activities League Questions regarding website accessibility Records / Police Reports / Lost and Found Questions Report Graffiti Report Illegal Drug/Gambling Activity Report Possible Terrorism Activity Speaker Request Special Duty Traffic Division Questions Name * First Last * Last Email * Subject * Message * reCAPTCHA If you are human, leave this field blank. Submit Primary Sidebar Contact Us Phone Numbers Office Locations Search this website Facebook Instagram YouTube X icon Tik Tok Footer The Honolulu Police Department (Official Site) An Equal Opportunity Employer Honolulu Police Department -801 South Beretania Street -Honolulu, HI 96813 City and County of Honolulu Emergency 911 or Contact (808)529-3111 Disclaimer Contact Us Sitemap Organization Info & Resources Community Programs Careers Police Services About Us Additional Links Employment Opportunities Youth Programs Honolulu Police Commission Real Time Traffic Updates City & County of Honolulu COVID-19 Information Facebook Instagram YouTube X icon Tik Tok Copyright © 2024 The Honolulu Police Department. All rights reserved. Return to top Honolulu Police Department Ka 'Oihana Māka'i o Honolulu Honolulu Police Department Honolulu Police Department Ka 'Oihana Māka'i o Honolulu Organization Info & Resources Community Programs Careers Police Services About Us Search this website Emergency 911 or Contact (808) 529-3111 Facebook Instagram YouTube X icon Tik Tok " -3745,https://qlikapps.tucsonaz.gov/sense/app/f9c063fe-fb92-4b66-9b6a-75a484285ef8/sheet/599e566d-b974-446c-968f-efd06ec46a43/state/analysis,Crime Statistics,Agency-Published Resources,Qlik Sense,"",200,Qlik Sense Hub,[],[],[],[],[],[],. . -3746,http://data-cotgis.opendata.arcgis.com/search?groupIds=b6a49faa168647d8b56e1a06bd53600f&q=calls%20for%20service,Calls for Service,Police & Public Interactions,Tucson Open Data,"This is the City of Tucson's public platform for exploring and downloading open data, discovering and building apps, and engaging to solve important local issues.",200,Tucson Open Data,[],[],[],[],[],[],"" -3747,https://gisdata.tucsonaz.gov/,List of Data Sources,Info About Agencies,Tucson Open Data,"This is the City of Tucson's public platform for exploring and downloading open data, discovering and building apps, and engaging to solve important local issues.",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -3748,https://public.powerdms.com/TAMPA/tree,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by -3749,https://apps.tampagov.net/CallsForService_Webapp/Default.aspx?type=TPD,Calls for Service,Police & Public Interactions,Calls For Service,"",200,City of Tampa,"[""Police Calls For Service""]",[],[],[],[],[],Choose English Spanish German Portuguese French Russian Italian Chinese Japanese Choose English Spanish German Portuguese French Russian Italian Chinese Japanese How can we help? Search Search City of Tampa Logo Guides Close Residents COVID-19 Residents Guide Neighborhoods Events Businesses Business Guide Commercial Construction City Projects Zoning & Maps Government Employee Guide Careers Boards & Committees Public Records Services Utilities Online Payments Maps Guides Explore more guides to help you find what you need. All Guides Businesses Close Construction Contract Administration Permits & Payments Zoning Inspections Permits Business Tax Construction Planning Historic Preservation Small Business Equal Business Opportunity How to Do Business WMBE/SLBE Certification Search Directory Economic Dev Redevelopment Areas Programs and Services Starting Out Incentive Programs Utilities Business Purchasing Bids & Solicitations Guides Business Construction Zoning & Maps All Guides Business Resources Recreation Close Things To Do Museums Convention Center Sports Downtown Parks Featured Parks Activities Park Finder Athletics Attractions RiverWalk Ybor Pools Rec Centers Events Special Events Annual Events Permits Residents Close Safety Police Fire Rescue Emergency Management COVID-19 Your City New Residents Neighborhoods Arts and Culture Housing and Community City Projects Fun & Activities Parks & Rec Things To Do Events News Services Fix it Fast Utilities Guide Emergencies Permits Visitors Close Guides Events Tampa History All Guides Things To Do Museums Convention Center Sports Downtown Getting Around Parking Maps and Directions Transportation Options More About Us City History Tampa Attractions Arts & Culture Sustainability Government Close Guides Employee Guide Public Records Boards & Commissions Utilities All Guides Government Mayors Office City Council City Clerk Boards & Commissions City Holidays Stay Involved Public Meetings Meeting Agendas Meeting Videos City Budget City Performance Contact Mayors Office City Council Departments Key Contacts Lobbyist Information Top Departments Parks & Rec Police Construction Solid Waste Water Fire Rescue HR All Departments Jobs Guides Close Residents COVID-19 Residents Guide Neighborhoods Events Businesses Business Guide Commercial Construction City Projects Zoning & Maps Government Employee Guide Careers Boards & Committees Public Records Services Utilities Online Payments Maps Guides Explore more guides to help you find what you need. All Guides Residents COVID-19 Residents Guide Neighborhoods Events Businesses Business Guide Commercial Construction City Projects Zoning & Maps Government Employee Guide Careers Boards & Committees Public Records Services Utilities Online Payments Maps Guides Explore more guides to help you find what you need. All Guides Residents COVID-19 Residents Guide Neighborhoods Events Businesses Business Guide Commercial Construction City Projects Zoning & Maps Government Employee Guide Careers Boards & Committees Public Records Services Utilities Online Payments Maps Guides Explore more guides to help you find what you need. All Guides Residents COVID-19 Residents Guide Neighborhoods Events Businesses Business Guide Commercial Construction City Projects Zoning & Maps Government Employee Guide Careers Boards & Committees Public Records Services Utilities Online Payments Maps Residents COVID-19 Residents Guide Neighborhoods Events Businesses Business Guide Commercial Construction City Projects Zoning & Maps Government Employee Guide Careers Boards & Committees Public Records Services Utilities Online Payments Maps Residents COVID-19 Residents Guide Neighborhoods Events -3750,http://www.slmpd.org/internal_affairs.shtml,Complaints & Misconduct,Info About Officers,SLMPD Internal Affairs,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -3751,https://www.siouxfalls.org/police/policy-manual,Policies & Contracts,Info About Agencies,Policy & Procedure Manual - City of Sioux Falls,Sioux Falls Police Policy & Procedure Manual available for review.,200,Home - City of Sioux Falls,"[""Policy & Procedure Manual""]","[""Policy and Procedure Manual Sections""]","[""Contact Us"", ""Quick Links"", ""Share & Connect""]",[],[],[],opens in new tab or window -3752,https://www.ojp.gov/pdffiles1/Digitization/151992NCJRS.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3753,http://data-cotgis.opendata.arcgis.com/datasets/tucson-police-officer-involved-shooting-incidents,Officer Involved Shootings,Police & Public Interactions,Tucson Police Officer Involved Shooting Incidents,"Location of TPD Officer-Involved Shooting Incidents between January 1, 2010 and April 10, 2018.",200,Tucson Open Data,[],[],[],[],[],[],"" -3754,https://www.tucsonaz.gov/police/contacts,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -3755,https://suffolkpd.org/Information-and-Policies/Crime-Statistics,Crime Statistics,Agency-Published Resources,Crime Statistics,"",200," - Suffolk County Police Department -","[""Contact Us""]","[""Crime Statistics""]",[],"[""Facebook"", ""Facebook en Español"", ""Twitter"", ""YouTube"", ""Instagram"", ""Nixle"", ""Phone Directory"", ""Helpful Numbers"", ""852-Cops (2677)""]","[""Suffolkcountyny.gov"", ""Text Only Version"", ""SCPD CRIME STATISTIC LINKS"", ""This website provides valuable forms and information in order to address the needs of our community. If you have any questions or need additional information, please contact the Department at 631-852-6000 or email us at SCPDINFO@suffolkcountyny.gov . Interpretation services are available for individuals with Limited English Proficiency.""]",[],"Suffolkcountyny.gov Text Only Version Traducir pagina en Español Suffolkcountyny.gov Text Only Version Traducir pagina en Español Suffolkcountyny.gov Text Only Version Traducir pagina en Español Traducir pagina en Español Select Language Chinese (Simplified) Haitian Creole Italian Polish Portugese Spanish Select Language Chinese (Simplified) Haitian Creole Italian Polish Portugese Spanish Select Language Chinese (Simplified) Haitian Creole Italian Polish Portugese Spanish Robert E. Waring Acting Police Commissioner Robert E. Waring Acting Police Commissioner Robert E. Waring Acting Police Commissioner Robert E. Waring Acting Police Commissioner Robert E. Waring Acting Police Commissioner Home Alerts Precincts and Specialized Units Police Reform Transparency Hub Mental Health Community Information Forms and Reports Join SCPD Nondiscrimination Compliance Home Alerts Precincts and Specialized Units Police Reform Transparency Hub Mental Health Community Information Forms and Reports Join SCPD Nondiscrimination Compliance Home Alerts Precincts and Specialized Units Police Reform Transparency Hub Mental Health Community Information Forms and Reports Join SCPD Nondiscrimination Compliance Home Alerts Precincts and Specialized Units Police Reform Transparency Hub Mental Health Community Information Forms and Reports Join SCPD Nondiscrimination Compliance Information and Policies > Crime Statistics Information and Policies > Crime Statistics Information and Policies > Crime Statistics Crime Statistics Data is based on NYS DCJS Uniform Crime Reporting guidelines. Categories include Murder/Manslaughter, Rape, Rape (Expanded), Robbery, Aggravated Assault, Burglary, Larceny, and Motor Vehicle Theft. Effective 1/1/13, the UCR crime category of Rape was expanded to include selected crimes previously classified as Sex Offenses (other than Forcible Rape) and will be reported to DCJS as a category named Rape (2013 Expanded), however NYS does not include that in the published Crime Index totals as of yet. Aggravated Assault category is nationally classified to include numerous penal law sections ranging from threat of violence with a weapon (Menacing 2nd with a Weapon) to serious physical injury with grave risk of death (Assault 1). Although perfect certainty in statistical reporting is a goal, it should be understood that the data is merely a snapshot of case status and disposition on the day the data is compiled. Databases are continually updated and cases constantly undergo reclassification. Suffolk County Police Department Uniform Crime Report Index 1990 to 2015 Suffolk County Police Department Crime Statistics Last 10 Years SCPD CRIME STATISTIC LINKS 1st Precinct Statistics 2nd Precinct Statistics 3rd Precinct Statistics 4th Precinct Statistics 5th Precinct Statistics 6th Precinct Statistics 7th Precinct Statistics Firearm Related Statistics " -3756,https://city-tampa.opendata.arcgis.com/,List of Data Sources,Info About Agencies,City of Tampa GeoHub,City of Tampa GeoHub,200,City of Tampa GeoHub,[],[],[],[],[],[],"" -3757,https://www.wilmingtonde.gov/home/showpublisheddocument/9613/637341128548700000,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3758,https://www.projectcomport.org/department/WPD/useofforce/#uof-force-type,Use of Force Reports,Police & Public Interactions,"","",503,"","","","","","","","" -3759,https://www.honolulupd.org/information/policies/,Policies & Contracts,Info About Agencies,Policies - Honolulu Police Department,Honolulu Police Department Policies,200,403 Forbidden,"[""Honolulu Police Department Ka 'Oihana Māka'i o Honolulu"", ""Policies""]","[""Primary Sidebar"", ""Footer""]","[""The Honolulu Police Department (Official Site)"", ""Sitemap"", ""Additional Links""]",[],[],[],"" -3760,https://www.vbgov.com/government/departments/police/Documents/PTO%20Field%20Guide.pdf,Policies & Contracts,Info About Agencies,"","",403,"","","","","","","","" -3761,https://go.mpdconline.com/GO/GO_901_07.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3762,https://opendata.dc.gov/,List of Data Sources,Info About Agencies,Open Data DC,"On this site, the District of Columbia government shares hundreds of datasets. The District invites you to browse the data, download it as a file, analyze it with your tools, or build apps using our APIs.",200,Open Data DC,[],[],[],[],[],[],"" -3763,https://policecomplaints.dc.gov/page/annual-reports-for-OPC,Complaints & Misconduct,Info About Officers,Annual Reports | office of police complaints,"The Office of Police Complaints details its work each fiscal year and includes statistics about the complaints received by the agency, as well as information regarding the agency's accomplishments. 2023 Annual Report 2023 Annual Report 2022 Annual Report 2022 Annual Report 2021 Annual Report",200,| office of police complaints,"[""office of police complaints"", ""Office of Police Complaints"", ""Annual Reports""]","[""DC Agency Top Menu"", ""Search form"", ""About OPC"", ""Office of Police Complaints""]","[""The Office of Police Complaints details its work each fiscal year and includes statistics about the complaints received by the agency, as well as information regarding the agency's accomplishments."", ""2023 Annual Report"", ""2022 Annual Report"", ""2021 Annual Report"", ""2020 Annual Report"", ""2019 Annual Report"", ""2018 Annual Report"", ""2017 Annual Report"", ""2016 Annual Report"", ""2015 Annual Report"", ""2014 Annual Report"", ""2013 Annual Report"", ""2012 Annual Report"", ""2011 Annual Report"", ""2010 Annual Report"", ""2009 Annual Report"", ""2008 Annual Report"", ""2007 Annual Report"", ""2006 Annual Report"", ""2005 Annual Report"", ""2004 Annual Report"", ""2003 Annual Report"", ""2002 Annual Report"", ""2001 Annual Report""]",[],[],"[""Office of Police Complaints""]","Sorry, you need to enable JavaScript to visit this website. Skip to main content " -3764,https://www.wichita.gov/WPD/Pages/PublicRelations.aspx,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -3765,https://www.honolulupd.org/wp-content/uploads/2020/01/ManualsofOperations-07-27-2018-14-36-18.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3766,https://www.vbgov.com/government/departments/police/profstanddiv/Documents/2019%20Use%20of%20Force%20Report%20Redacted.pdf,Use of Force Reports,Police & Public Interactions,"","",403,"","","","","","","","" -3767,https://mpdc.dc.gov/page/mpd-annual-reports,Complaints & Misconduct,Info About Officers,MPD Annual Reports | mpdc,Strategic Plan Update 2023 The 2023 Strategic Plan Update outlines many of the strategies and approaches underway by the members of the Metropolitan Police Department.  Published September 2023  Strategic Plan Update 2023  ,200,| mpdc,"[""MPD Annual Reports""]","[""mpdc"", ""Public Transparency""]","[""Strategic Plan Update 2023"", ""Department Annual Reports"", ""Policing in DC""]",[],[],"[""MPDC""]","Sorry, you need to enable JavaScript to visit this website. Skip to main content " -3768,https://www.wichita.gov/WPD/SupportServices/Pages/CrimeStats.aspx,Crime Statistics,Agency-Published Resources,"","",404,"","","","","","","","" -3769,https://data.vbgov.com/dataset/police-incident-reports ,Crime Statistics,Agency-Published Resources,"","",-1,"","","","","","","","" -3770,https://www.wichita.gov/WPD/Pages/Directory.aspx,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -3771,https://wilsonnc.policetocitizen.com/DailyBulletin ,Crime Statistics,Agency-Published Resources,Police To Citizen,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -3772,https://policecomplaints.dc.gov/page/use-force-reports,Use of Force Reports,Police & Public Interactions,Use of Force Reports | office of police complaints,"The Office of Police Complaints issues an annual report on the Metropolitan Police Department's (MPD) use of force in the District each fiscal year, which highlights the policies, procedures, and practices regarding MPD's officer use of force.  In addition, the report includes data on all types of force incidents involving MPD officers.   2022 Use of Force Report",200,| office of police complaints,"[""office of police complaints"", ""Office of Police Complaints"", ""Use of Force Reports""]","[""DC Agency Top Menu"", ""Search form"", ""About OPC"", ""Office of Police Complaints""]",[],[],[],"[""Office of Police Complaints""]","Sorry, you need to enable JavaScript to visit this website. Skip to main content " -3773,"https://www.crimemapping.com/map/location/wilmington,%20delaware?id=",Crime Maps & Reports,Agency-Published Resources,CrimeMapping.com - Helping You Build a Safer Community,"",200,CrimeMapping.com - Helping You Build a Safer Community,"[""My Map Summary"", ""What"", ""Where"", ""When"", ""Display Options"", ""Location Selection"", ""Choose a Search Distance"", ""Timeframe Settings"", ""From:"", ""To:""]",[],[],[],[],[],"Preparing Map Content... Preparing Map Content... Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select County of Chester, State of New Jersey, Delaware FirstMap, Esri, HERE, Garmin, INCREMENT P, Intermap, NGA, USGS | Search Location wilmington, delaware Zoom to Receive Alerts Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select County of Chester, State of New Jersey, Delaware FirstMap, Esri, HERE, Garmin, INCREMENT P, Intermap, NGA, USGS | Search Location wilmington, delaware Zoom to Distance: Miles select Distance: Miles select Streets select County of Chester, State of New Jersey, Delaware FirstMap, Esri, HERE, Garmin, INCREMENT P, Intermap, NGA, USGS | Search Location wilmington, delaware Zoom to County of Chester, State of New Jersey, Delaware FirstMap, Esri, HERE, Garmin, INCREMENT P, Intermap, NGA, USGS | Search Location wilmington, delaware Zoom to County of Chester, State of New Jersey, Delaware FirstMap, Esri, HERE, Garmin, INCREMENT P, Intermap, NGA, USGS | Search Location wilmington, delaware Zoom to Search Location wilmington, delaware Zoom to Search Location Search Location Search Location wilmington, delaware wilmington, delaware Zoom to Zoom to Zoom to Fetching Data. x Close Fetching Data. Fetching Data. Fetching Data. " -3774,https://www.vbgov.com/government/departments/police/Documents/2020%20AnnualReport.pdf,Stops,Police & Public Interactions,"","",403,"","","","","","","","" -3775,https://wilsonnc.policetocitizen.com/DailyBulletin,Calls for Service,Police & Public Interactions,Police To Citizen,"",200,Police To Citizen,[],[],[],[],[],[],"" -3776,https://mpdc.dc.gov/,Contact Info & Agency Meta,Info About Agencies,| mpdc,"",200,| mpdc,"[""mpdc""]","[""MPDC Homepage Search Section"", ""7D Community Walk"", ""Pages"", ""Featured Services"", ""Featured Homepage Events"", ""Public Transparency"", ""Public Transparency"", ""Impactful Community Engagement"", ""Impactful Community Engagement"", ""Featured News"", ""Social Media"", ""Social Media"", ""Upcoming Events""]","[""Strategic Plan Update 2023"", ""Legal Firearms"", ""File a Police Report"", ""Contact Police"", ""MPD Rewards"", ""Join MPD"", ""More Services"", ""News Releases"", ""Newsletters"", ""Testimonies""]",[],[],"[""MPDC""]","Sorry, you need to enable JavaScript to visit this website. Skip to main content " -3777,https://www.wichita.gov/WPD/WPDPolicyAndProcedureManual/Policy%20210%20-%20In-Service%20Training.pdf,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3779,https://www.wilmingtonde.gov/Home/ShowDocument?id=9177,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3780,https://dcatlas.dcgis.dc.gov/crimecards/,Crime Maps & Reports,Agency-Published Resources,Page Not Found,"",200,Page Restricted,[],"[""Page Not Found - DC GIS""]","[""The page you requested cannot be found.""]","[""You may want to try any of the following:""]",[],[],Page Not Found - DC GIS The page you requested cannot be found. You may want to try any of the following: Make sure the web address is written and/or spelled correctly Visit http://dc.gov Visit http://dcgis.dc.gov Take a look at all online maps Call OCTO at (202) 727-2277 The page you requested cannot be found. You may want to try any of the following: Make sure the web address is written and/or spelled correctly Visit http://dc.gov Visit http://dcgis.dc.gov Take a look at all online maps Call OCTO at (202) 727-2277 The page you requested cannot be found. You may want to try any of the following: Make sure the web address is written and/or spelled correctly Visit http://dc.gov Visit http://dcgis.dc.gov Take a look at all online maps Call OCTO at (202) 727-2277 -3781,https://www.wilmingtonde.gov/government/city-departments/department-of-police,Contact Info & Agency Meta,Info About Agencies,Access Denied,"",200,Access Denied,"[""Access Denied""]",[],[],[],[],[],"" -3782,https://opendata.dc.gov/search?collection=Dataset&q=crime%20incidents,Stops,Police & Public Interactions,Open Data DC,"On this site, the District of Columbia government shares hundreds of datasets. The District invites you to browse the data, download it as a file, analyze it with your tools, or build apps using our APIs.",200,Open Data DC,[],[],[],[],[],[],"" -3783,https://wilsonnc.policetocitizen.com/EventMap ,Crime Maps & Reports,Agency-Published Resources,Police To Citizen,"",200,Police To Citizen,[],[],[],[],[],[],"" -3784,https://www.wilsonnc.org/residents/city-services/all-departments/police,Contact Info & Agency Meta,Info About Agencies,Access Denied,"",200,Access Denied,"[""Access Denied""]",[],[],[],[],[],"" -3785,https://opendata.dc.gov/datasets/adult-arrests,Arrest Records,Police & Public Interactions,Adult Arrests,"This data includes adult arrests made by the Metropolitan Police Department (MPD). The information within this report pertains to reports entered into MPD’s Record Management System (Cobalt) whereby an arrest occurred. Totals are based on the most serious arrest charge (i.e., each row denotes one arrest, not one charge), and one person may be booked on more than one arrest charge. - -Due to privacy considerations, exact CCNs and arrest numbers for these arrest datasets are not provided. In lieu, hash numbers are provided for CNN which allows individuals to determine whether there are multiple arrests associated with one event. Additionally, arrest numbers can be linked directly to an individual and therefore DC government does not provide this more generally, but again as hash numbers.",200,Open Data DC,[],[],[],[],[],[],"" -3786,https://county-data-wilsoncounty.opendata.arcgis.com/,List of Data Sources,Info About Agencies,Wilson County GIS Open Data,"Discover, analyze and download data from Wilson County GIS Open Data. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",200,Wilson County GIS Open Data,[],[],[],[],[],[],"" -3787,https://www.wichita.gov/WPD/Citizen%20Review%20Board/2021-09-23%20Tecnical%20Report%202019-2020%20Citation%20Analysis%20WPD%20Final.pdf,Stops,Police & Public Interactions,"","",404,"","","","","","","","" -3789,https://www.vbgov.com/government/departments/police/profstanddiv/Pages/ia-stats.aspx ,Complaints & Misconduct,Info About Officers,"","",404,"","","","","","","","" -3790,https://www.wilmingtonde.gov/government/public-safety/wilmington-police-department/office-of-professional-standards/law-enforcement-accreditation,Complaints & Misconduct,Info About Officers,Access Denied,"",200,Access Denied,"[""Access Denied""]",[],[],[],[],[],"" -3791,https://data.vbgov.com/,List of Data Sources,Info About Agencies,"","",-1,"","","","","","","","" -3792,https://www.vbgov.com/government/departments/police/Documents/05.01%20Use%20of%20Force.pdf,Policies & Contracts,Info About Agencies,"","",403,"","","","","","","","" -3793,https://www.wichita.gov/WPD/Pages/ProfessionalStandards.aspx,Complaints & Misconduct,Info About Officers,"","",404,"","","","","","","","" -3794,https://www.wichita.gov/WPD/Pages/Policy.aspx,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3795,https://www.vbgov.com/government/departments/police/Pages/PoliciesAndFieldGuides.aspx ,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3796,https://www.wichita.gov/WPD/WPDPolicyAndProcedureManual/Policy%20906%20-%20Use%20of%20Force.pdf,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3799,https://www.wilmingtonde.gov/government/public-safety/wilmington-police-department/policies-and-procedures,Policies & Contracts,Info About Agencies,Access Denied,"",200,Access Denied,"[""Access Denied""]",[],[],[],[],[],"" -3800,https://mpdc.dc.gov/node/423092,Policies & Contracts,Info About Agencies,Written Directives: General Orders | mpdc,"In order to help promote transparency, the MPD has posted policy statements issued by the Chief of Police (e.g., general orders, executive orders, and other directives) that are currently in effect for the department. As new and updated policies are published, they will be posted here. For additional information, the Policy and Standards Branch can be contacted in writing at 441 4th Street, NW, Washington, DC, 20001 or at mpd.policy@dc.gov.",200,| mpdc,"[""Written Directives: General Orders""]","[""mpdc"", ""Public Transparency""]",[],[],[],"[""MPDC""]","Sorry, you need to enable JavaScript to visit this website. Skip to main content " -3801,https://www.vbgov.com/government/departments/police/Pages/contact-us.aspx ,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -3802,https://data-cityofwichita.hub.arcgis.com/,List of Data Sources,Info About Agencies,City of Wichita Open Data Portal with Apps,"This is the community's public platform for exploring and downloading open data, discovering and building apps, and engaging to solve important local issues. You can analyze and combine Open Datasets using maps, as well as develop new web and mobile ",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -3803,https://www.honolulupd.org/wp-content/uploads/2020/08/HPD-Policy-104-04-09-2021.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3804,https://ago.mo.gov/home/vehicle-stops-report/,Stops,Police & Public Interactions,Vehicle Stops Report | Attorney General Office of Missouri,"",200,"Attorney General Office of Missouri | Jefferson City, Missouri","[""Vehicle Stops Report""]","[""2020 Vehicle Stops Report Changes""]","[""Past Reports""]",[],"[""Explore Section""]",[],"" -3805,https://gbi.georgia.gov/news/2022-10-09/2022-officer-involved-shootings,Officer Involved Shootings,Police & Public Interactions,2022 Officer Involved Shootings | Georgia Bureau of Investigation,Information regarding 2022 officer involved shooting investigations in Georgia,200,Georgia Bureau of Investigation,"[""2022 Officer Involved Shootings""]","[""Main navigation"", ""Search this site"", ""Breadcrumb"", ""News"", ""How can we help?"", ""About Us""]","[""Popular searches"", ""Call Us"", ""Online Tip Form"", ""Visit""]",[],[],[],"" -3806,https://pittsburghpa.gov/police/domestic-violence-resource-guide,Resources,Agency-Published Resources,Domestic Violence Resource Guide | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""Domestic Violence Resource Guide"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""Download the Domestic Violence Resource Guide"", ""412-323-7250"", ""Are you concerned that you or someone you know is in an abusive relationship?"", ""Women's Center & Shelter of Greater Pittsburgh (WC&S)"", ""Bright Sky App (For IOS and Android)"", ""Protection From Abuse (PFA) Order"", ""Additional Resources"", ""SECURITY ALERT""]","[""DEPARTMENT MENU""]","[""Police Links"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Zones"", ""Police Data"", ""Resources"", ""News""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -3808,https://pittsburghpa.gov/police/police-zone2,Contact Info & Agency Meta,Info About Agencies,Police Zone 2 | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""Police Zone 2"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -3809,https://pittsburghpa.gov/police/police-zone3,Contact Info & Agency Meta,Info About Agencies,Police Zone 3 | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""Police Zone 3"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -3810,https://pittsburghpa.gov/police/police-zone1,Contact Info & Agency Meta,Info About Agencies,Police Zone 1 | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""Police Zone 1"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -3811,https://pittsburghpa.gov/police/headquarters,Contact Info & Agency Meta,Info About Agencies,Police Headquarters Contact Info | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""Police Headquarters"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -3812,https://pittsburghpa.gov/police/police-mission,Policies & Contracts,Info About Agencies,Police Mission Statement | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""Our Mission"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Zones"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -3813,https://pittsburghpa.gov/police/police-zone5,Contact Info & Agency Meta,Info About Agencies,Police Zone 5 | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""Police Zone 5"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""Follow the link below to receive the Zone 5 Community Crime Update."", ""Visit the brand new Police Data Portal and view interactive maps that provide information on Reported Activity and Violent Crimes.""]","[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -3815,https://pittsburghpa.gov/police/police-report,Contact Info & Agency Meta,Info About Agencies,police report | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""File a Police Report"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""Ways to File a Police Report:"", ""How to Obtain a Copy of a Police Report:""]","[""DEPARTMENT MENU""]","[""Police Links"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Zones"", ""Police Data"", ""Resources"", ""News""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -3817,https://pittsburghpa.gov/police/police-zone-maps,Contact Info & Agency Meta,Info About Agencies,Police Zones | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""Police Zones Map"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -3818,https://pittsburghpa.gov/police/police-branches,Contact Info & Agency Meta,Info About Agencies,Police Branches | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""Operations Department"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""Tow Pound"", ""Abandoned Cars""]","[""DEPARTMENT MENU""]","[""Police Branches"", ""About Police"", ""Community Engagement Office"", ""Police Zones"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -3819,https://pittsburghpa.gov/police/police-investigations,Contact Info & Agency Meta,Info About Agencies,Investigations Branch | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""Investigations Branch"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Branches"", ""About Police"", ""Community Engagement Office"", ""Police Zones"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -3820,https://pittsburghpa.gov/police/police-zone6,Contact Info & Agency Meta,Info About Agencies,Police Zone 6 | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", ""Police Zone 6"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -3821,https://munstats.pa.gov/Reports/ReportInformation2.aspx?report=CountyMuniContact,Contact Info & Agency Meta,Info About Agencies,Municipal Statistics,"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Content"", ""Report Viewer Configuration Error""]",[],[],[],[],Skip to content Municipal Statistics Hidden Button to Trap Enter Key DCED.PA.Gov Taxes Find Local Withholding Rates by Address Find Municipality by Address Tax Registers EIT / PIT / LST Tax Registers (Official) EIT / PIT / LST Tax Registers (Real-Time) EIT / PIT / LST Tax Registers (Official) - Printable EIT / PIT / LST Tax Registers (Real-Time) - Printable EIT / PIT / LST Tax Registers (Historic) Tax Reports County Tax Information Municipal Tax Information Multi-Year Municipal Tax Information Financials County Annual Financial Reports Statewide County Annual Financial Reports Municipal Annual Financial Reports Statewide Municipal Annual Financial Reports Officials Local Government Official Information County / Municipal Contact Person Fire Police Insurance Planning Other County / Municipal Demographic Municipality / School District Relationship Municipal Authorities & NIDs Municipal Authorities & NIDs Annual Financial Report Statewide Municipal Authorities & NIDs Financial Report Municipal Authorities & NIDs General Information Municipal Authorities & NIDs Mailing Label Information Skip to content Municipal Statistics Hidden Button to Trap Enter Key DCED.PA.Gov Taxes Find Local Withholding Rates by Address Find Municipality by Address Tax Registers EIT / PIT / LST Tax Registers (Official) EIT / PIT / LST Tax Registers (Real-Time) EIT / PIT / LST Tax Registers (Official) - Printable EIT / PIT / LST Tax Registers (Real-Time) - Printable EIT / PIT / LST Tax Registers (Historic) Tax Reports County Tax Information Municipal Tax Information Multi-Year Municipal Tax Information Financials County Annual Financial Reports Statewide County Annual Financial Reports Municipal Annual Financial Reports Statewide Municipal Annual Financial Reports Officials Local Government Official Information County / Municipal Contact Person Fire Police Insurance Planning Other County / Municipal Demographic Municipality / School District Relationship Municipal Authorities & NIDs Municipal Authorities & NIDs Annual Financial Report Statewide Municipal Authorities & NIDs Financial Report Municipal Authorities & NIDs General Information Municipal Authorities & NIDs Mailing Label Information Municipal Statistics Municipal Statistics Hidden Button to Trap Enter Key DCED.PA.Gov DCED.PA.Gov Taxes Find Local Withholding Rates by Address Find Municipality by Address Tax Registers EIT / PIT / LST Tax Registers (Official) EIT / PIT / LST Tax Registers (Real-Time) EIT / PIT / LST Tax Registers (Official) - Printable EIT / PIT / LST Tax Registers (Real-Time) - Printable EIT / PIT / LST Tax Registers (Historic) Tax Reports County Tax Information Municipal Tax Information Multi-Year Municipal Tax Information Financials County Annual Financial Reports Statewide County Annual Financial Reports Municipal Annual Financial Reports Statewide Municipal Annual Financial Reports Officials Local Government Official Information County / Municipal Contact Person Fire Police Insurance Planning Other County / Municipal Demographic Municipality / School District Relationship Municipal Authorities & NIDs Municipal Authorities & NIDs Annual Financial Report Statewide Municipal Authorities & NIDs Financial Report Municipal Authorities & NIDs General Information Municipal Authorities & NIDs Mailing Label Information -3822,https://docs.google.com/spreadsheets/d/1vTyShwANIG3QSOQ6T7sJqazVB2DmokJNb2t5JKXYmsQ/edit?usp=sharing,Contact Info & Agency Meta,Info About Agencies,Louisiana Law Enforcement Contacts - Google Sheets,"",200,Sign in - Google Accounts,[],[],[],[],[],[],"JavaScript isn't enabled in your browser, so this file can't be opened. Enable and reload. JavaScript isn't enabled in your browser, so this file can't be opened. Enable and reload. JavaScript isn't enabled in your browser, so this file can't be opened. Enable and reload. Louisiana Law Enforcement Contacts Saved to Drive Sign in This version of Google Chrome is no longer supported. Please upgrade to a supported browser . Dismiss File Edit View Insert Format Data Tools Extensions Help Accessibility Unsaved changes to Drive Accessibility Comment only Copy chart Edit chart Publish chart Download chart Delete chart Today Settings Support Department Louisiana Law Enforcement Contacts Saved to Drive Sign in This version of Google Chrome is no longer supported. Please upgrade to a supported browser . Dismiss Louisiana Law Enforcement Contacts Saved to Drive Sign in Louisiana Law Enforcement Contacts Saved to Drive Sign in Louisiana Law Enforcement Contacts Saved to Drive Sign in Louisiana Law Enforcement Contacts Saved to Drive Louisiana Law Enforcement Contacts Saved to Drive Louisiana Law Enforcement Contacts Louisiana Law Enforcement Contacts Saved to Drive Saved to Drive Saved to Drive Saved to Drive Saved to Drive Sign in Sign in Sign in Sign in Sign in This version of Google Chrome is no longer supported. Please upgrade to a supported browser . Dismiss This version of Google Chrome is no longer supported. Please upgrade to a supported browser . Dismiss This version of Google Chrome is no longer supported. Please upgrade to a supported browser . Dismiss File Edit View Insert Format Data Tools Extensions Help Accessibility Unsaved changes to Drive Accessibility Comment only Copy chart Edit chart Publish chart Download chart Delete chart Today Settings Support File Edit View Insert Format Data Tools Extensions Help Accessibility Unsaved changes to Drive File Edit View Insert Format Data Tools Extensions Help Accessibility File Edit View Insert Format Data Tools Extensions Help Accessibility Unsaved changes to Drive Unsaved changes to Drive Accessibility Comment only Copy chart Edit chart Publish chart Download chart Delete chart Today Settings Support Accessibility Comment only Copy chart Edit chart Publish chart Download chart Delete chart Today Settings Support Accessibility Comment only Accessibility Accessibility Accessibility Accessibility Comment only Comment only Copy chart Edit chart Publish chart Download chart Delete chart Copy chart Edit chart Publish chart Download chart Delete chart Copy chart Copy chart Copy chart Edit chart Edit chart Edit chart Publish chart Publish chart Publish chart Download chart Download chart Download chart Download chart Delete chart Delete chart Delete chart Today Settings Support Today Settings Support Today Today Today Settings Settings Settings Support Support Support Department Department Department Department Department Department Department " -3823,http://www.sthelena.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,St. Helena Parish Jail,"",200," - St. Helena Parish Jail -",[],[],[],[],[],[],"St. Helena Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Provided by the St. Helena Parish Sheriff's Office.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... St. Helena Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Provided by the St. Helena Parish Sheriff's Office.... Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3824,http://www.plaquemines.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Plaquemines Parish Jail,"",200," - Plaquemines Parish Jail -",[],[],[],[],[],[],"" -3825,http://www.stjames.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,St. James Parish Jail,"",200," - St. James Parish Jail -",[],[],[],[],[],[],"St. James Parish Sheriff's Office Sheriff Willy J. Martin, Jr. St. James Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Provided as a service by St. James Parish Sheriff's Office This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... St. James Parish Sheriff's Office Sheriff Willy J. Martin, Jr. St. James Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Provided as a service by St. James Parish Sheriff's Office Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3826,http://www.bienville.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Bienville Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Bienville Parish Sheriff's Office Sheriff John E. Ballance Bienville Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Bienville Parish Sheriff's Office Sheriff John E. Ballance Bienville Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3827,http://www.catahoula.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Catahoula Parish Jail,"",200," - Catahoula Parish Jail -",[],[],[],[],[],[],"Catahoula Parish Sheriff's Office Sheriff Toney Edwards Catahoula Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Catahoula Parish Sheriff's Office Sheriff Toney Edwards Catahoula Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3828,http://www.beauregard.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Beauregard Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Beauregard Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Beauregard Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3829,http://www.natchitoches.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Natchitoches Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Natchitoches Parish Sheriff's Office Sheriff Victor E. Jones, Jr. Natchitoches Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Natchitoches Parish Sheriff's Office Sheriff Victor E. Jones, Jr. Natchitoches Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3830,http://www.cameron.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Cameron Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Cameron Parish Sheriff's Office Sheriff Ronald Johnson Cameron Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Cameron Parish Sheriff's Office Sheriff Ronald Johnson Cameron Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3831,http://www.avoyelles.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Avoyelles Parish Jail,"",200," - Avoyelles Parish Jail -",[],[],[],[],[],[],"Avoyelles Parish Sheriff's Office Sheriff David L. Dauzat Avoyelles Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Provided by the Avoyelles Parish Sheriff's Office. This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Avoyelles Parish Sheriff's Office Sheriff David L. Dauzat Avoyelles Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Provided by the Avoyelles Parish Sheriff's Office. Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3832,http://www.jeffersondavis.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Jefferson Davis Parish Jail,"",200," - Jefferson Davis Parish Jail -",[],[],[],[],[],[],"" -3833,http://www.bossier.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Bossier Parish Jail,"",200," - Bossier Parish Jail -",[],[],[],[],[],[],"Bossier Parish Sheriff's Office To Protect and Serve Sheriff Julian C. Whittington Bossier Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Bossier Parish Sheriff's Office To Protect and Serve Sheriff Julian C. Whittington Bossier Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3834,http://www.acadia.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Acadia Parish Jail,"",200," - Acadia Parish Jail -",[],[],[],[],[],[],"" -3835,http://www.assumption.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Assumption Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Assumption Parish Sheriff's Office Sheriff Leland Falcon Assumption Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Testing the footer display. This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Assumption Parish Sheriff's Office Sheriff Leland Falcon Assumption Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Testing the footer display. Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3836,http://www.lafayette.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Lafayette Parish Correctional Center,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Lafayette Parish Correctional Center Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Lafayette Parish Correctional Center Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3837,http://www.lasalle.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,La Salle Parish Sheriff's Office,"",200," - La Salle Parish Sheriff's Office -",[],[],[],[],[],[],"LaSalle Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... LaSalle Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3838,http://www.franklin.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Franklin Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Franklin Parish Sheriff's Office Sheriff Kevin W. Cobb Franklin Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Franklin Parish Sheriff's Office Sheriff Kevin W. Cobb Franklin Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3839,http://www.orleans.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Orleans Parish Jail,"",200," - Orleans Parish Jail -",[],[],[],[],[],[],"Orleans Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Orleans Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3840,http://www.leesville.lavns.org/roster.asp,Incarceration Records,Jails & Courts Specific,"","",404,"","","","","","","","" -3841,http://www.eastbatonrouge.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,East Baton Rouge Parish Jail,"",200," - East Baton Rouge Parish Jail -",[],[],[],[],[],[],"East Baton Rouge Sheriffs Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... East Baton Rouge Sheriffs Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3842,http://www.claiborne.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Claiborne Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Claiborne Parish Sheriff's Office Sheriff Sam Dowies Claiborne Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Provided by the Claiborne Parish Sheriff's Office | 318.927.2011 | 613 East Main Street | Homer, Louisiana 71040 This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Claiborne Parish Sheriff's Office Sheriff Sam Dowies Claiborne Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Provided by the Claiborne Parish Sheriff's Office | 318.927.2011 | 613 East Main Street | Homer, Louisiana 71040 Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3843,http://www.madison.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Madison Parish Jail,"",200," - Madison Parish Jail -",[],[],[],[],[],[],"Madison Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Madison Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3844,http://www.ouachita.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Ouachita Parish Correctional Center,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Ouachita Parish Correctional Center Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Ouachita Parish Correctional Center Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3845,http://www.shreveport.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Shreveport City Jail,"",200," - Shreveport City Jail -",[],[],[],[],[],[],"Shreveport City Police Department Chief Alan Crump Shreveport City Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Shreveport City Police Department Chief Alan Crump Shreveport City Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3846,http://www.bogalusa.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Bogalusa Police Department,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Bogalusa Police Department Chief Kendall Bullen Bogalusa Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Bogalusa Police Department Chief Kendall Bullen Bogalusa Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3847,http://www.bossierpd.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Bossier City Police Department,"",200," - Bossier City Police Department -",[],[],[],[],[],[],"Bossier City Police Department Chief Shane McWilliams Bossier City Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Bossier City Police Department Chief Shane McWilliams Bossier City Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3848,http://www.jefferson.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Jefferson Parish Jail,"",200," - Jefferson Parish Jail -",[],[],[],[],[],[],"Jefferson Parish Sheriff's Office Sheriff Newell Normand Jefferson Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Jefferson Parish Sheriff's Office Sheriff Newell Normand Jefferson Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3849,http://www.stlandry.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,St. Landry Parish Jail,"",200," - St. Landry Parish Jail -",[],[],[],[],[],[],"St. Landry Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... St. Landry Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3850,http://www.redriver.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Red River Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Red River Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Red River Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3851,http://www.sabine.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Sabine Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Sabine Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Sabine Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3852,http://www.richland.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Richland Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Richland Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Richland Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3853,http://www.hammond.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Hammond Police Department,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Hammond Police Department Chief James Stewart Hammond Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Hammond Police Department Chief James Stewart Hammond Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3854,http://www.iberia.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Iberia Parish Jail,"",200," - Iberia Parish Jail -",[],[],[],[],[],[],"" -3855,http://www.allen.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Allen Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Allen Parish Sheriff's Office To Serve & Protect Sheriff Douglas L. Hebert, III Allen Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Provided as a service by Sheriff Doug Hebert | 601 Court Street,Oberlin,70655 | p:337.639.4353 This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Allen Parish Sheriff's Office To Serve & Protect Sheriff Douglas L. Hebert, III Allen Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Provided as a service by Sheriff Doug Hebert | 601 Court Street,Oberlin,70655 | p:337.639.4353 Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3856,http://www.stcharles.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,St. Charles Parish Nelson Coleman Correctional Center,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"St. Charles Parish Sheriff's Office Protecting and Serving the citizens of St. Charles Parish Sheriff Greg Champagne St. Charles Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... St. Charles Parish Sheriff's Office Protecting and Serving the citizens of St. Charles Parish Sheriff Greg Champagne St. Charles Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3857,http://www.morehouse.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Morehouse Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Morehouse Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Morehouse Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3858,http://www.eastfeliciana.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,East Feliciana Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"East Feliciana Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... East Feliciana Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3859,http://www.rapides.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Rapides Parish Jail,"",200," - Rapides Parish Jail -",[],[],[],[],[],[],"Rapides Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Rapides Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3860,http://www.ascension.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Ascension Parish Jail,"",200," - Ascension Parish Jail -",[],[],[],[],[],[],"Ascension Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Ascension Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3861,http://www.stjohn.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,St. John the Baptist Parish Sherman Walker Correctional Facility,"",200," - St. John the Baptist Parish Sherman Walker Correctional Facility -",[],[],[],[],[],[],"St. John the Baptist Parish Sheriff's Office Serving the Citizens of St John the Baptist Parish Sheriff Mike Tregre St. John the Baptist Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time For information, call Corrections at 985.359.8627. This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... St. John the Baptist Parish Sheriff's Office Serving the Citizens of St John the Baptist Parish Sheriff Mike Tregre St. John the Baptist Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time For information, call Corrections at 985.359.8627. Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3862,http://www.stbernard.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,St. Bernard Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"St. Bernard Parish Sheriff's Office Sheriff James Pohlmann St. Bernard Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... St. Bernard Parish Sheriff's Office Sheriff James Pohlmann St. Bernard Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3863,http://www.pointecoupee.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Pointe Coupee Parish Jail,"",200," - Pointe Coupee Parish Jail -",[],[],[],[],[],[],"Pointe Coupee Parish Sheriff's Office Sheriff Rene' Thibodeaux Pointe Coupee Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Pointe Coupee Parish Sheriff's Office Sheriff Rene' Thibodeaux Pointe Coupee Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3864,http://www.concordia.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Concordia Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Concordia Parish Sheriff's Office Sheriff Kenneth Hedrick Concordia Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Concordia Parish Sheriff's Office Sheriff Kenneth Hedrick Concordia Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3865,http://www.caldwell.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Caldwell Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Caldwell Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Caldwell Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3866,http://www.desoto.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,De Soto Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"DeSoto Parish Sheriff's Office Sheriff Jayson Richardson DeSoto Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... DeSoto Parish Sheriff's Office Sheriff Jayson Richardson DeSoto Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3867,http://www.iberville.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Iberville Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Iberville Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Iberville Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3868,http://www.calcasieu.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Calcasieu Parish Jail,"",200," - Calcasieu Parish Jail -",[],[],[],[],[],[],"" -3869,http://alleghenycountyda.us/model-police-policies/,Policies & Contracts,Info About Agencies,Model Police Policies • Allegheny County District Attorney's Office,"",200,"Allegheny County DA Stephen A. Zappala, Jr. | Home","[""Model Police Policies""]",[],[],"[""Contact"", ""Connect""]",[],[],"" -3870,http://www.oakdale.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Oakdale Police Department,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Oakdale Police Department To Protect and Serve Chief Chad Doyle Oakdale Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Oakdale Police Department | 318.335.0290 | 118 North Tenth Street | Oakdale, Louisiana 71463 This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Oakdale Police Department To Protect and Serve Chief Chad Doyle Oakdale Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Oakdale Police Department | 318.335.0290 | 118 North Tenth Street | Oakdale, Louisiana 71463 Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3871,http://www.kinder.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Kinder Police Department,"",200," - Kinder Police Department -",[],[],[],[],[],[],"Kinder Police Department Chief Charles Welch Kinder Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Kinder Police Department Chief Charles Welch Kinder Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3872,http://www.caddo.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Caddo Correctional Center,"",200," - Caddo Correctional Center -",[],[],[],[],[],[],"Caddo Correctional To Serve & Protect Sheriff Steve Prator Caddo Correctional Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Caddo Correctional To Serve & Protect Sheriff Steve Prator Caddo Correctional Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3873,http://www.washington.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Washington Parish Jail,"",200," - Washington Parish Jail -",[],[],[],[],[],[],"Washington Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Washington Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3874,https://www.alleghenycounty.us/police/minimum-requirements-and-application-procedures.aspx,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -3875,https://www.alleghenycounty.us/police-academy/index.aspx,Policies & Contracts,Info About Agencies,"Police Academy - Allegheny County, PA","The Allegheny County Police Academy provides updated, diversified, quality instruction for recruits and continuing education for certified police officers in Allegheny County.",200,"Home - Allegheny County, PA","[""Police Academy""]","[""Basic Training"", ""Resources"", ""MIST, Ongoing Training, and Specialized Services"", ""About the Police Academy""]","["""", """", ""Required Training"", ""Contact Us"", ""Quick Links"", ""Get Social""]",[],[],"[""Use of Force"", ""Implicit Bias"", ""De-escalation""]",opens in new tab or window -3876,http://www.tensas.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Tensas Parish Jail,"",200," - Tensas Parish Jail -",[],[],[],[],[],[],"Tensas Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Tensas Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3877,http://www.winnfield.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Winnfield Police Department,"",200," - Winnfield Police Department -",[],[],[],[],[],[],"Winnfield Police Department Chief Johnny Ray Carpenter Winnfield Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Winnfield Police Department Chief Johnny Ray Carpenter Winnfield Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3878,http://www.sulphur.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Sulphur Police Department,"",200," - Sulphur Police Department -",[],[],[],[],[],[],"Sulphur Police Department Keeping you informed Chief Lewis Coats Sulphur Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: 2 Last updated: 3/25/2024 4:30:47 PM Central Time Name DOB Race Gender Arrest Date BRUNO, CHARLES KEITH 08/09/1960 White Male 06/14/2020 MOAK, BRAD EVERETT 09/12/1983 White Male 10/19/2021 Please wait.... Sulphur Police Department Keeping you informed Chief Lewis Coats Sulphur Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: 2 Last updated: 3/25/2024 4:30:47 PM Central Time Name DOB Race Gender Arrest Date BRUNO, CHARLES KEITH 08/09/1960 White Male 06/14/2020 MOAK, BRAD EVERETT 09/12/1983 White Male 10/19/2021 Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: 2 Last updated: 3/25/2024 4:30:47 PM Central Time Name DOB Race Gender Arrest Date BRUNO, CHARLES KEITH 08/09/1960 White Male 06/14/2020 MOAK, BRAD EVERETT 09/12/1983 White Male 10/19/2021 Name DOB Race Gender Arrest Date BRUNO, CHARLES KEITH 08/09/1960 White Male 06/14/2020 MOAK, BRAD EVERETT 09/12/1983 White Male 10/19/2021 Please wait.... Please wait.... Please wait.... Please wait.... " -3879,https://www.alleghenycounty.us/police-academy/leadership-and-staff.aspx,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -3880,https://www.alleghenycounty.us/emergency-services/police-departments.aspx,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -3881,http://www.tangipahoa.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Tangipahoa Parish Jail,"",200," - Tangipahoa Parish Jail -",[],[],[],[],[],[],"" -3882,https://www.alleghenycounty.us/police/staff/superintendent.aspx,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -3883,http://www.villeplatte.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Ville Platte Police Department,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Ville Platte Police Department Chief Neil Lartigue Ville Platte Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Ville Platte Police Department Chief Neil Lartigue Ville Platte Police Department Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3884,https://www.alleghenycounty.us/police/county-police-k9-unit.aspx,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -3885,http://www.stmartin.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,St. Martin Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"St. Martin Parish Sheriff's Office Sheriff Becket Breaux St. Martin Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... St. Martin Parish Sheriff's Office Sheriff Becket Breaux St. Martin Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3886,http://www.sttammany.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,St. Tammany Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"St. Tammany Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Provided by the St. Tammany Parish Sheriff's Office... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... St. Tammany Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Provided by the St. Tammany Parish Sheriff's Office... Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3887,http://www.westfeliciana.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,West Feliciana Parish Detention Center,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"West Feliciana Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... West Feliciana Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3888,http://www.webster.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Webster Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Webster Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Webster Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3889,http://www.stmary.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,St. Mary Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"St. Mary Parish Sheriff's Office Sheriff Blaise W. Smith St. Mary Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... St. Mary Parish Sheriff's Office Sheriff Blaise W. Smith St. Mary Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3890,http://www.terrebonne.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Terrebonne Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Terrebonne Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Terrebonne Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3891,http://www.vernon.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Vernon Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Vernon Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Vernon Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3892,http://www.westcarroll.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,West Carroll Parish Jail,"",200," - West Carroll Parish Jail -",[],[],[],[],[],[],"West Carroll Parish Sheriff's Office Sheriff Scott Mathews West Carroll Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... West Carroll Parish Sheriff's Office Sheriff Scott Mathews West Carroll Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3893,http://www.winn.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,Winn Parish Jail,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Winn Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Winn Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3894,http://www.westbatonrouge.lavns.org/roster.aspx,Incarceration Records,Jails & Courts Specific,West Baton Rouge Parish Jail,"",200," - West Baton Rouge Parish Jail -",[],[],[],[],[],[],"West Baton Rouge Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... West Baton Rouge Parish Sheriff's Office Jail Roster Click to register anonymously to be notified - upon any changes in this offender's custody status. Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time Please wait.... Please wait.... Filter: Show All A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # of offenders: Last updated: 3/25/2024 4:30:47 PM Central Time This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... This agency is providing this roster of incarcerated offenders to the public and law enforcement in the interest of public safety. This information shall not be considered, or used as, a public document, or official document, and no other publication or copying of this information is allowed without the express written consent of this agency. Any unauthorized use of this information is forbidden and subject to criminal prosecution. Please wait.... Please wait.... Please wait.... " -3895,https://www.alleghenycounty.us/police/community-programs.aspx,Misc Police Activity,Police & Public Interactions,"","",404,"","","","","","","","" -3896,https://www.broadcastify.com/listen/ctid/2242,Dispatch Recordings,Police & Public Interactions,Allegheny County Pennsylvania Live Audio Feeds,"",200,"Broadcastify - Live Police, Fire, EMS, Aircraft, and Rail Audio Feeds","[""Allegheny County Pennsylvania Live Audio Feeds""]","[""Broadcastify Calls Coverage for Allegheny County"", ""Live Feed Listing for Allegheny County""]","[""Calls Coverage""]",[],[],[],"" -3897,https://wp.sbcounty.gov/sheriff/policiesoperatingprocedures-department/,Policies & Contracts,Info About Agencies,Department – San Bernardino County Sheriff's Department,Policies/Operating Procedures Department The following table contains records regarding the Sheriff’s Department’s Policies and Procedures. Back to Policy Mandates Document DateDocument TitleStation/Division03/19/2024San Bernardino County Sheriff’s Department ManualSan Bernardino County Sheriff’s...,200,Welcome to San Bernardino County,"[""Policies/Operating Procedures"", ""Events Calendar""]","[""Calendar"", ""Calendar of Events""]","[""M Mon"", ""T Tue"", ""W Wed"", ""T Thu"", ""F Fri"", ""S Sat"", ""S Sun"", ""1 event, 26"", ""1 event, 26"", ""Field Training Officer"", ""Field Training Officer"", ""Field Training Officer"", ""2 events, 27"", ""2 events, 27"", ""Field Training Officer"", ""Report Writing"", ""Report Writing"", ""1 event, 28"", ""1 event, 28"", ""Field Training Officer"", ""1 event, 29"", ""1 event, 29"", ""Field Training Officer"", ""1 event, 1"", ""1 event, 1"", ""Field Training Officer"", ""0 events, 2"", ""0 events, 2"", ""0 events, 3"", ""0 events, 3"", ""1 event, 4"", ""1 event, 4"", ""Traffic Collision Investigation, Basic"", ""Traffic Collision Investigation, Basic"", ""Traffic Collision Investigation, Basic"", ""1 event, 5"", ""1 event, 5"", ""Traffic Collision Investigation, Basic"", ""2 events, 6"", ""2 events, 6"", ""Traffic Collision Investigation, Basic"", ""Crisis Intervention Training for FTO’s"", ""Crisis Intervention Training for FTO’s"", ""1 event, 7"", ""1 event, 7"", ""Traffic Collision Investigation, Basic"", ""0 events, 8"", ""0 events, 8"", ""0 events, 9"", ""0 events, 9"", ""0 events, 10"", ""0 events, 10"", ""2 events, 11"", ""2 events, 11"", ""Speed from Crush Traffic Collision Investigation Vehicle Dynamics"", ""Speed from Crush Traffic Collision Investigation Vehicle Dynamics"", ""Speed from Crush Traffic Collision Investigation Vehicle Dynamics"", ""Crisis Intervention Training"", ""Crisis Intervention Training"", ""Crisis Intervention Training"", ""2 events, 12"", ""2 events, 12"", ""Speed from Crush Traffic Collision Investigation Vehicle Dynamics"", ""Crisis Intervention Training"", ""2 events, 13"", ""2 events, 13"", ""Speed from Crush Traffic Collision Investigation Vehicle Dynamics"", ""Crisis Intervention Training"", ""2 events, 14"", ""2 events, 14"", ""Speed from Crush Traffic Collision Investigation Vehicle Dynamics"", ""Crisis Intervention Training"", ""1 event, 15"", ""1 event, 15"", ""Crisis Intervention Training"", ""0 events, 16"", ""0 events, 16"", ""0 events, 17"", ""0 events, 17"", ""1 event, 18"", ""1 event, 18"", ""Background Investigations"", ""Background Investigations"", ""Background Investigations"", ""1 event, 19"", ""1 event, 19"", ""Background Investigations"", ""1 event, 20"", ""1 event, 20"", ""Background Investigations"", ""1 event, 21"", ""1 event, 21"", ""Background Investigations"", ""0 events, 22"", ""0 events, 22"", ""0 events, 23"", ""0 events, 23"", ""0 events, 24"", ""0 events, 24"", ""2 events, 25"", ""2 events, 25"", ""Traffic Collision Investigation, Advanced"", ""Traffic Collision Investigation, Advanced"", ""Traffic Collision Investigation, Advanced"", ""Academy Instructor Certification Course (AICC)"", ""Academy Instructor Certification Course (AICC)"", ""Academy Instructor Certification Course (AICC)"", ""2 events, 26"", ""2 events, 26"", ""Traffic Collision Investigation, Advanced"", ""Academy Instructor Certification Course (AICC)"", ""2 events, 27"", ""2 events, 27"", ""Traffic Collision Investigation, Advanced"", ""Academy Instructor Certification Course (AICC)"", ""2 events, 28"", ""2 events, 28"", ""Traffic Collision Investigation, Advanced"", ""Academy Instructor Certification Course (AICC)"", ""1 event, 29"", ""1 event, 29"", ""Academy Instructor Certification Course (AICC)"", ""0 events, 30"", ""0 events, 30"", ""0 events, 31"", ""0 events, 31"", ""Field Training Officer"", ""Field Training Officer"", ""Report Writing"", ""Field Training Officer"", ""Field Training Officer"", ""Field Training Officer"", ""Traffic Collision Investigation, Basic"", ""Traffic Collision Investigation, Basic"", ""Traffic Collision Investigation, Basic"", ""Crisis Intervention Training for FTO’s"", ""Traffic Collision Investigation, Basic"", ""Speed from Crush Traffic Collision Investigation Vehicle Dynamics"", ""Crisis Intervention Training"", ""Speed from Crush Traffic Collision Investigation Vehicle Dynamics"", ""Crisis Intervention Training"", ""Speed from Crush Traffic Collision Investigation Vehicle Dynamics"", ""Crisis Intervention Training"", ""Speed from Crush Traffic Collision Investigation Vehicle Dynamics"", ""Crisis Intervention Training"", ""Crisis Intervention Training"", ""Background Investigations"", ""Background Investigations"", ""Background Investigations"", ""Background Investigations"", ""Traffic Collision Investigation, Advanced"", ""Academy Instructor Certification Course (AICC)"", ""Traffic Collision Investigation, Advanced"", ""Academy Instructor Certification Course (AICC)"", ""Traffic Collision Investigation, Advanced"", ""Academy Instructor Certification Course (AICC)"", ""Traffic Collision Investigation, Advanced"", ""Academy Instructor Certification Course (AICC)"", ""Academy Instructor Certification Course (AICC)"", ""Quick Links""]","[""NON-EMERGENCY DISPATCH""]",[],[],"" -3898,https://www.sanjoseca.gov/your-government/departments-offices/information-technology/digital-privacy/past-privacy-decisions,Policies & Contracts,Info About Agencies,"","",-1,"","","","","","","","" -3899,https://cde.ucr.cjis.gov/,Crime Maps & Reports,Agency-Published Resources,"","",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],[],[],[],[],[],"" -3900,https://www.openrecords.pa.gov/RTKL/AOROSearch.cfm,Records Request Info,Agency-Published Resources,OOR - Find Agency Open Records Officers,"",200,PA Office of Open Records,"[""Find Agency Open Records Officers""]",[],"[""Open Records Officer Search"", ""Registering Agency Open Records Officers""]",[],[],[],Ask a Question RSS Follow on Twitter Print Page Ask a Question RSS Follow on Twitter Print Page Ask a Question RSS Follow on Twitter Print Page Ask a Question RSS Follow on Twitter Print Page Ask a Question RSS Follow on Twitter Print Page OOR Office of Open Records Right-to-Know Law About the RTKL & FAQ Right-to-Know Law Statute Legislative History RTKL Flowchart RTKL Case Law Index How to File a Request Find Agency Open Records Officers Citizens' Guide Agency Guides Fee Schedule Advisory Opinions RTKL Forms Regulations Under Development Records Retention Requesting Police Recordings Judicial Agencies Appeals Appeal E-File Portal How to File an Appeal File an Appeal Mediation Program Procedural Guidelines In Camera Review Process OOR Decisions (Docket Search) Options After OOR Decision Request Direct Interest Participant Status File an Entry of Appearance Final Determinations Issued by District Attorneys Sunshine Act Training About Training Request Training Calendar OOR PowerPoint Presentations OOR Training Videos OOR Annual Trainings OOR Sunshine Week OOR Webinars About About the OOR Contact OOR Request OOR Records Our Team Careers Transparency Reports and Surveys Official OOR Blog OOR Updates OOR Office of Open Records Right-to-Know Law About the RTKL & FAQ Right-to-Know Law Statute Legislative History RTKL Flowchart RTKL Case Law Index How to File a Request Find Agency Open Records Officers Citizens' Guide Agency Guides Fee Schedule Advisory Opinions RTKL Forms Regulations Under Development Records Retention Requesting Police Recordings Judicial Agencies Appeals Appeal E-File Portal How to File an Appeal File an Appeal Mediation Program Procedural Guidelines In Camera Review Process OOR Decisions (Docket Search) Options After OOR Decision Request Direct Interest Participant Status File an Entry of Appearance Final Determinations Issued by District Attorneys Sunshine Act Training About Training Request Training Calendar OOR PowerPoint Presentations OOR Training Videos OOR Annual Trainings OOR Sunshine Week OOR Webinars About About the OOR Contact OOR Request OOR Records Our Team Careers Transparency Reports and Surveys Official OOR Blog OOR Updates OOR Office of Open Records OOR Office of Open Records OOR Office of Open Records Right-to-Know Law About the RTKL & FAQ Right-to-Know Law Statute Legislative History RTKL Flowchart RTKL Case Law Index How to File a Request Find Agency Open Records Officers Citizens' Guide Agency Guides Fee Schedule Advisory Opinions RTKL Forms Regulations Under Development Records Retention Requesting Police Recordings Judicial Agencies Appeals Appeal E-File Portal How to File an Appeal File an Appeal Mediation Program Procedural Guidelines In Camera Review Process OOR Decisions (Docket Search) Options After OOR Decision Request Direct Interest Participant Status File an Entry of Appearance Final Determinations Issued by District Attorneys Sunshine Act Training About Training Request Training Calendar OOR PowerPoint Presentations OOR Training Videos OOR Annual Trainings OOR Sunshine Week OOR Webinars About About the OOR Contact OOR Request OOR Records Our Team Careers Transparency Reports and Surveys Official OOR Blog OOR Updates -3901,https://publicrec.hillsclerk.com/,Court Cases,Jails & Courts Specific,publicrec.hillsclerk.com - /,"",200,Error retrieving title: dictionary changed size during iteration,"[""publicrec.hillsclerk.com - /""]",[],[],[],[],[],"" -3902,https://github.com/washingtonpost/data-police-shootings,Officer Involved Shootings,Police & Public Interactions,GitHub - washingtonpost/data-police-shootings: The Washington Post is compiling a database of every fatal shooting in the United States by a police officer in the line of duty since 2015.,The Washington Post is compiling a database of every fatal shooting in the United States by a police officer in the line of duty since 2015. - washingtonpost/data-police-shootings,200,GitHub: Let’s build from here · GitHub,"[""Search code, repositories, users, issues, pull requests..."", ""Provide feedback"", ""Saved searches"", ""washingtonpost/data-police-shootings"", ""Fatal Force Database""]","[""Use saved searches to filter your results more quickly"", ""Folders and files"", ""Latest commit"", ""History"", ""Repository files navigation"", ""Data Versions"", ""Contact & Contributing"", ""Licensing"", ""Credits"", ""About"", ""Releases 1"", ""Packages 0"", ""Contributors 2"", ""Footer""]","[""License"", ""v1"", ""v1"", ""v2"", ""v2"", ""CODE_OF_CONDUCT.md"", ""CODE_OF_CONDUCT.md"", ""LICENSE"", ""LICENSE"", ""README.md"", ""README.md"", ""Resources"", ""License"", ""Code of conduct"", ""Stars"", ""Watchers"", ""Forks"", ""Footer navigation""]",[],[],[],"" -3903,http://inmatelocator.cor.pa.gov/,Incarceration Records,Jails & Courts Specific,Inmate/Parolee Locator,"",200,Inmate/Parolee Locator,"[""Inmate/Parolee Locator""]","[""Please enter Search criteria.""]",[],"[""Search"", ""Search Criteria"", ""Sort By""]",[],[],"" -3904,http://webapps.sftc.org/ci/CaseInfo.dll,Court Cases,Jails & Courts Specific,Online Services | Superior Court of California - County of San Francisco,"",200,IIS Windows Server,[],[],[],[],[],[],Contact Us Follow the prompt so that the Court can verify that a person is seeking to view case information and not an automated computer program. This helps prevent program abuse and ensures that the Court can continue to provide public access to case information. Contact Us Contact Us Follow the prompt so that the Court can verify that a person is seeking to view case information and not an automated computer program. This helps prevent program abuse and ensures that the Court can continue to provide public access to case information. Follow the prompt so that the Court can verify that a person is seeking to view case information and not an automated computer program. This helps prevent program abuse and ensures that the Court can continue to provide public access to case information. Follow the prompt so that the Court can verify that a person is seeking to view case information and not an automated computer program. This helps prevent program abuse and ensures that the Court can continue to provide public access to case information. -3905,https://github.com/ayyubibrahimi/eos,Policies & Contracts,Info About Agencies,GitHub - ayyubibrahimi/eos,Contribute to ayyubibrahimi/eos development by creating an account on GitHub.,200,GitHub: Let’s build from here · GitHub,"[""Search code, repositories, users, issues, pull requests..."", ""Provide feedback"", ""Saved searches"", ""ayyubibrahimi/eos"", ""Data and analysis of surveillance cameras in New Orleans""]","[""Use saved searches to filter your results more quickly"", ""Folders and files"", ""Latest commit"", ""History"", ""Repository files navigation"", ""Data"", ""Downloading camera location data"", ""About"", ""Releases"", ""Packages 0"", ""Contributors 2"", ""Languages"", ""Footer""]","[""analysis"", ""analysis"", ""camera_distance_analysis"", ""camera_distance_analysis"", ""data"", ""data"", ""notebooks_calls_for_service"", ""notebooks_calls_for_service"", ""notebooks_epr"", ""notebooks_epr"", ""notebooks_spatial"", ""notebooks_spatial"", ""pdfs"", ""pdfs"", ""prr"", ""prr"", "".gitignore"", "".gitignore"", ""README.md"", ""README.md"", ""camera-locations-download.html"", ""camera-locations-download.html"", ""Resources"", ""Stars"", ""Watchers"", ""Forks"", ""Footer navigation""]",[],[],[],"" -3906,https://www.drewcountysheriff.com/roster-choose,Incarceration Records,Jails & Courts Specific,Roster Choose - Drew County Sheriff AR,"",200,"Error retrieving title: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))","[""Drew County Detention Center Inmate Roster""]",[],[],[],[],[],"Skip to Main Content Services menu Submit a Crime Tip Message From Sheriff Drew County Sheriff's Office Phone: 870-367-6211 Arkansas Submit a Crime Tip Message From Sheriff Emergency 911 Home Inmate Roster Most Wanted Press Releases Sex Offenders Contact Emergency 911 Services Administration Crime Stoppers Criminal Investigations Division Emergency Alert / Environmental Hazard Frequently Asked Questions Hot Cases Jail Kid's Corner Patrol Reserve Patrol Services Administration Crime Stoppers Criminal Investigations Division Emergency Alert / Environmental Hazard Frequently Asked Questions Hot Cases Jail Kid's Corner Patrol Reserve Patrol Drew County Detention Center Inmate Roster Current Inmates >> Click current inmates to view inmates currently at the Drew County Detention Center. 48 Hour Release >> Click 48 hour release to view all persons released from the Drew County Detention Center within the last 48 hours. Disclaimer: Information presented on this website is collected, maintained, and provided for the convenience of the site visitor/reader. - While every effort is made to keep such information accurate and up-to-date, - the Drew County Detention Center can not certify the accuracy and/or authenticity of any information. - The reader should not rely on this information in any manner.  Under no circumstances shall - Drew County, the Sheriff of Drew County, - the web development supplier for Drew County Sheriff, the employees of - Drew County nor the employees of Drew County Detention Center be liable for any decisions, actions taken or omissions made from reliance on any information - contained herein from whatever source, nor shall the Drew County Detention Center be liable for any other consequences from any such reliance. Crime Tip Hotline 870-367-6211 or Submit Via Email Home Email Facebook Inmate Roster Map Message from the Sheriff Most Wanted Press Releases Sex Offenders Contact Us Home Email Facebook Inmate Roster Map Message from the Sheriff Most Wanted Press Releases Sex Offenders Contact Us Emergency 911 Phone: 870-367-6211 (24 hours) •  Fax: 870-460-6217 • Email • 210 South Main Street, Monticello, AR 71655 •  Administrative Office Hours: M-F 8am - 4:30pm Phone: 870-367-6211 (24 hours) •  Fax: 870-460-6217 • Email • 210 South Main Street, Monticello, AR 71655 Administrative Office Hours: M-F 8am - 4:30pm Phone: 870-367-6211 (24 hours) •  Fax: 870-460-6217 • Email 210 South Main Street, Monticello, AR 71655 Administrative Office Hours: M-F 8am - 4:30pm Phone: 870-367-6211 (24 hours) Fax: 870-460-6217 • Email 210 South Main Street, Monticello, AR 71655 Administrative Office Hours: M-F 8am - 4:30pm Drew County Sheriff's Office | © 2019 - 2024 Drew County, Arkansas Accessibility | Site Map | Translate menu Submit a Crime Tip Message From Sheriff menu Submit a Crime Tip Message From Sheriff menu menu menu Submit a Crime Tip Message From Sheriff Drew County Sheriff's Office Phone: 870-367-6211 Arkansas Submit a Crime Tip Message From Sheriff Emergency 911 Home Inmate Roster Most Wanted Press Releases Sex Offenders Contact Emergency 911 Services Drew County Sheriff's Office Phone: 870-367-6211 Arkansas Drew County Sheriff's Office Phone: 870-367-6211 Drew County Sheriff's Office Phone: 870-367-6211 Arkansas Arkansas " -3907,https://arresttrends.vera.org/data-sources-and-methodology,List of Data Sources,Info About Agencies,Data Sources & Methodology | Arrests Trends,"",200,This interactive visualization tool enables users to better understand police enforcement.,"[""Data Sources & Methodology""]",[],"[""Contents"", ""Introduction"", ""Background"", ""Data Sources and Methodology"", ""Arrests"", ""Demographics"", ""Clearance Rates"", ""Victimizations"", ""Data Reported"", ""Comparisons"", ""Conclusion"", ""Appendix A: FBI-Recognized Offense Types and Definitions"", ""Appendix B: BJS-Recognized Offense Types and Definitions"", ""Appendix C: FBI and BJS Offense Type Comparisons"", ""Appendix D: Missing Arrest Data, Data Aggregation, and Data Discrepancies"", ""Appendix E: Missing/Incorrect Information for Some Agencies in the Crosswalk"", ""Endnotes""]",[],[],[],Arrest Trends Home About FAQs Resources Data Sources & Methodology Tool Arrests Demographics Clearance Rates Victimizations Data Reported Arrests Demographics Clearance Rates Victimizations Data Reported Arrest Trends Home About FAQs Resources Data Sources & Methodology Tool Arrests Demographics Clearance Rates Victimizations Data Reported Home About FAQs Resources Data Sources & Methodology Tool Arrests Demographics Clearance Rates Victimizations Data Reported Home About FAQs Resources Data Sources & Methodology Tool Arrests Demographics Clearance Rates Victimizations Data Reported Home About FAQs Resources Data Sources & Methodology Home About FAQs Resources Data Sources & Methodology Tool Arrests Demographics Clearance Rates Victimizations Data Reported Tool Arrests Demographics Clearance Rates Victimizations Data Reported Data Sources & Methodology Data Sources & Methodology Data Sources & Methodology Data Sources & Methodology -3908,https://caseinfo.arcourts.gov/cconnect/PROD/public/ck_public_qry_main.cp_main_idx,Court Cases,Jails & Courts Specific,Case Search • Arkansas Judiciary,"",200,Case Search • Arkansas Judiciary,"[""Case Search""]",[],[],[],"[""Welcome to the Arkansas Judiciary""]",[],"Skip to Main Content If you experience problems with opening documents on your device, click here for troubleshooting the Safari settings to allow pop-ups. Welcome to the Arkansas Judiciary Case Search Search by... Cases ​ ​ Skip to Main Content If you experience problems with opening documents on your device, click here for troubleshooting the Safari settings to allow pop-ups. Welcome to the Arkansas Judiciary Case Search Search by... Cases ​ ​ If you experience problems with opening documents on your device, click here for troubleshooting the Safari settings to allow pop-ups. Welcome to the Arkansas Judiciary Case Search Search by... Cases ​ ​ If you experience problems with opening documents on your device, click here for troubleshooting the Safari settings to allow pop-ups. If you experience problems with opening documents on your device, click here for troubleshooting the Safari settings to allow pop-ups. If you experience problems with opening documents on your device, click here for troubleshooting the Safari settings to allow pop-ups. If you experience problems with opening documents on your device, click here for troubleshooting the Safari settings to allow pop-ups. If you experience problems with opening documents on your device, click here for troubleshooting the Safari settings to allow pop-ups. Welcome to the Arkansas Judiciary Case Search Search by... Cases ​ ​ Welcome to the Arkansas Judiciary Case Search Search by... Cases ​ ​ Welcome to the Arkansas Judiciary Case Search Search by... Cases ​ ​ Cases ​ ​ Cases ​ ​ Cases ​ Cases ​ Cases ​ ​ " -3909,https://gis.arkansas.gov/?s=police&post_type=product,Contact Info & Agency Meta,Info About Agencies,police | Search Results | Arkansas GIS Office,"",200,Arkansas GIS Office,"[""Arkansas GIS Office"", ""Search Results: “police”""]","[""Arkansas Spatial Data Infrastructure""]","[""² Navigation"", ""Correctional Institution (point)"", ""HISTORICAL Fire District (polygon) ARCHIVED"", ""Law Enforcement (point)"", ""State Police Highway Patrol Troop Boundaries (polygon)""]",[],[],[],"Department of Transformation and Shared Services $ 0.00 0 items Download Arkansas GIS Office Arkansas Spatial Data Infrastructure ² Navigation Home Help Connect to ASDI ArcGIS Services Data Repository News Maps 2020 Census Data Election Precincts Map Viewer Check My City Find My Districts 1 Meter DEM Viewer GIS Board GIS Board Members GIS Legislation Programs Next Generation 9-1-1 (NG9-1-1) Redistricting Arkansas Spatial Data Infrastructure (previously GeoStor) ARNOLD/MAP21 Municipal Boundary and Annexation Program NHD Program Resources Status Arkansas Master Address Program (AMAP) Arkansas Centerline File (ACF) County Assessors Mapping Program (CAMP) Arkansas Digital Ortho Program (ADOP) Staff Cart Download Click Here To Subscribe To News And Data Updates! Search Results: “police” Showing all 4 results Default sorting Sort by popularity Sort by average rating Sort by newness Sort by price: low to high Sort by price: high to low Correctional Institution (point) Downloadable Data! Add to cart HISTORICAL Fire District (polygon) ARCHIVED Downloadable Data! Add to cart Law Enforcement (point) Downloadable Data! Add to cart State Police Highway Patrol Troop Boundaries (polygon) Downloadable Data! Add to cart 501 Woodlane Street Ste G4 Little Rock, AR 72201 (501) 682-2767 Email: communication@arkansasgisoffice.org Promoting efficient development, maintenance, and distribution of -Arkansas’ geographic information resources. The Department of Transformation and Shared Services. Arkansas GIS Office © 2024. All Rights Reserved. Department of Transformation and Shared Services $ 0.00 0 items Download Click Here To Subscribe To News And Data Updates! Search Results: “police” Showing all 4 results Default sorting Sort by popularity Sort by average rating Sort by newness Sort by price: low to high Sort by price: high to low Correctional Institution (point) Downloadable Data! Add to cart HISTORICAL Fire District (polygon) ARCHIVED Downloadable Data! Add to cart Law Enforcement (point) Downloadable Data! Add to cart State Police Highway Patrol Troop Boundaries (polygon) Downloadable Data! Add to cart Search Results: “police” Showing all 4 results Default sorting Sort by popularity Sort by average rating Sort by newness Sort by price: low to high Sort by price: high to low Correctional Institution (point) Downloadable Data! Add to cart HISTORICAL Fire District (polygon) ARCHIVED Downloadable Data! Add to cart Law Enforcement (point) Downloadable Data! Add to cart State Police Highway Patrol Troop Boundaries (polygon) Downloadable Data! Add to cart 501 Woodlane Street Ste G4 Little Rock, AR 72201 (501) 682-2767 Email: communication@arkansasgisoffice.org Promoting efficient development, maintenance, and distribution of -Arkansas’ geographic information resources. The Department of Transformation and Shared Services. Arkansas GIS Office © 2024. All Rights Reserved. 501 Woodlane Street Ste G4 Little Rock, AR 72201 (501) 682-2767 Email: communication@arkansasgisoffice.org Promoting efficient development, maintenance, and distribution of -Arkansas’ geographic information resources. The Department of Transformation and Shared Services. 501 Woodlane Street Ste G4 Little Rock, AR 72201 (501) 682-2767 Email: communication@arkansasgisoffice.org Promoting efficient development, maintenance, and distribution of -Arkansas’ geographic information resources. The Department of Transformation and Shared Services. " -3910,https://spotcrime.com/map?lat=38.1297971384506&lon=-121.2687494888574,Crime Maps & Reports,Agency-Published Resources,Map | SpotCrime,"Explore a map of recent crime by location. The map shows crime incident data down to neighborhood crime activity including arrest, arson, assault, burglary, robbery, shooting, theft, vandalism, and rape.",200,Home | SpotCrime,[],[],[],[],[],[],Map Browse By State Get Alerts Map Browse By State Submit a Crime Tip Square with arrow pointing upper right Login Map Browse By State Submit a Crime Tip Square with arrow pointing upper right Login Submit a Crime Tip Square with arrow pointing upper right Loading Icon Circle with rotating red inner circle Loading… Loading Icon Circle with rotating red inner circle Loading… Get personalized alerts sent directly to your inbox. Get Alerts Dismiss Get personalized alerts sent directly to your inbox. close View Crime Search this area Get personalized alerts sent directly to your inbox. Get Alerts Dismiss Get personalized alerts sent directly to your inbox. close View Crime Search this area Get personalized alerts sent directly to your inbox. Get Alerts Dismiss Get personalized alerts sent directly to your inbox. Get personalized alerts sent directly to your inbox. Get Alerts Dismiss close -3911,https://www.lodi.gov/directory.aspx?did=15,Contact Info & Agency Meta,Info About Agencies,Staff Directory • Lodi Police Department,"",200,"Lodi, CA | Official Website","[""Lodi Police Department""]",[],"[""Business Phone: (209) 333-6727"", ""Emergency Phone: 911"", ""Non-Emergency Phone: (209) 333-6728"", ""Telephone Report Phone: (209) 333-5544"", ""Police Fax: (209) 333-6792"", """", ""Traffic Division Phone: (209) 333-5558"", ""Narcotics Phone: (209) 333-6734"", ""Dispatch Phone: (209) 333-6728"", ""Emergency Phone: 911"", ""Dispatch Fax: (209) 333-5539"", ""Property Lobby Phone: (209) 330-8786"", ""Live Edit"", ""Contact Us"", ""Quick Links"", ""Emergency Numbers"", ""Using This Site"", ""Loading""]",[],[],[],Skip to Main Content -3912,https://www.lodi.gov/392/Statistics,Crime Statistics,Agency-Published Resources,"Statistics | Lodi, CA","Check out various statistics about the Lodi Police Department, including staffing and crime rates.",200,"Lodi, CA | Official Website","[""Statistics""]","[""Crime Reports"", ""Crime Statistics""]","["""", ""Two-Year Snapshot - General"", """", """", ""Contact Us"", ""Quick Links"", ""Emergency Numbers"", ""Using This Site"", ""Loading""]",[],[],[],Skip to Main Content -3913,https://www.lodi.gov/DocumentCenter/View/4153/Lodi-Police-Policy-and-Procedure,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3914,https://www.lodi.gov/DocumentCenter/View/3145/City-of-Lodi-Administrative-Policies-and-Procedures,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -3915,https://www.lodi.gov/DocumentCenter/View/3140/2022-Training-Plan-,Training & Hiring Info,Info About Officers,"","",200,"","","","","","","","" -3916,https://ujsportal.pacourts.us/CaseSearch,Court Cases,Jails & Courts Specific,Case Search,"",200,Forbidden,"[""Case Search""]",[],"[""Search By"", ""Docket number"", ""Citation No"", ""OTN"", ""Scheduled Events Only"", ""Calendar Attendees""]","[""Site Requirements"", ""Disclaimer""]",[],[],"Create New Account Login The Unified JUDICIAL SYSTEM of PENNSYLVANIA Web Portal Unified Judicial System website UJS Forms PAePay ® Brochure PAePay ® Brochure (Español) Collections in the Courts Financial Records + Home Case Information Case Search Pay Online Fines, Costs, & Restitution Bail State Probation/Parole Fees Help & Support Help Center Reference Documents Video Tutorials Home Case Search Our menu navigation has changed. Click here to learn more. Create New Account Login The Unified JUDICIAL SYSTEM of PENNSYLVANIA Web Portal Unified Judicial System website UJS Forms PAePay ® Brochure PAePay ® Brochure (Español) Collections in the Courts Financial Records + Home Case Information Case Search Pay Online Fines, Costs, & Restitution Bail State Probation/Parole Fees Help & Support Help Center Reference Documents Video Tutorials Create New Account Login The Unified JUDICIAL SYSTEM of PENNSYLVANIA Web Portal Unified Judicial System website UJS Forms PAePay ® Brochure PAePay ® Brochure (Español) Collections in the Courts Financial Records + Home Case Information Case Search Pay Online Fines, Costs, & Restitution Bail State Probation/Parole Fees Help & Support Help Center Reference Documents Video Tutorials Home Case Search Home Case Search Our menu navigation has changed. Click here to learn more. Our menu navigation has changed. Click here to learn more. " -3917,https://www.ashleycountyar.com/financial-reports/ashley-county-financial-statement-12312021-certified-copy/,Annual & Monthly Reports,Info About Agencies,Ashley County Financial Statement 12312021 Certified Copy | Ashley County,"",200,"Ashley County, Arkansas","[""Ashley County Financial Statement 12312021 Certified Copy""]",[],[],[],[],[],"Skip to content Ashley County Primary Menu Home Elected Officials Assessor Circuit Clerk Collector Constables Coroner County Clerk County Judge Justices of the Peace Sheriff Treasurer Services Courts Circuit Court District Court Crossett Annex Departments 911 Department Ashley County Library Extension Service Financial Reports Road Department Office of Emergency Management Solid Waste Management Veterans Service Office Forms Residents Local Job Listings Info for New Residents Local Attractions Take a Tour Forms Community Links Cities & Towns Visitor/Citizen Information Businesses Business Startup & Assistance Demographics Take a Tour Forms Community Links Visitors Local Attractions Take a Tour Community Links Visitor/Citizen Information How Do I? Ashley County Financial Statement 12312021 Certified Copy Ashley County Financial Statement 12312021 Certified Copy Search in https://www.ashleycountyar.com/ Copyright 2024 Ashley County, Arkansas. All Rights Reserved. | Admin | Privacy Policy Web design and hosting by U.S.NEXT Ashley County Home Elected Officials Assessor Circuit Clerk Collector Constables Coroner County Clerk County Judge Justices of the Peace Sheriff Treasurer Services Courts Circuit Court District Court Crossett Annex Departments 911 Department Ashley County Library Extension Service Financial Reports Road Department Office of Emergency Management Solid Waste Management Veterans Service Office Forms Residents Local Job Listings Info for New Residents Local Attractions Take a Tour Forms Community Links Cities & Towns Visitor/Citizen Information Businesses Business Startup & Assistance Demographics Take a Tour Forms Community Links Visitors Local Attractions Take a Tour Community Links Visitor/Citizen Information How Do I? Ashley County Financial Statement 12312021 Certified Copy Ashley County Financial Statement 12312021 Certified Copy Ashley County Financial Statement 12312021 Certified Copy Ashley County Financial Statement 12312021 Certified Copy Ashley County Financial Statement 12312021 Certified Copy Ashley County Financial Statement 12312021 Certified Copy Ashley County Financial Statement 12312021 Certified Copy Search in https://www.ashleycountyar.com/ Copyright 2024 Ashley County, Arkansas. All Rights Reserved. | Admin | Privacy Policy Copyright 2024 Ashley County, Arkansas. All Rights Reserved. | Admin | Privacy Policy Web design and hosting by U.S.NEXT " -3918,https://giglio-bradylist.com/,Complaints & Misconduct,Info About Officers,Brady List | Potential Impeachment Disclosure [PID] Database,"The Brady List is the definitive public-facing database of information about police misconduct, public complaints, use-of-force reports, and more... To ensure fair trials the Supreme Court of the United States created the Brady doctrine obligating the prosecutor of every case to gather and disclose all information about any individual upon whose testimony they will rely. Brady has prevailed as a super-precedent for 60 years. This platform is available as-a-service to all Peace Officer Standards & Training [POST] Departments, Prosecutors, and Law Enforcement Organizations [LEOrgs].",200,Brady List | Potential Impeachment Disclosure [PID] Database,[],"[""Complaints"", ""Search"", ""Main navigation"", ""User account menu"", ""Citations"", ""Freedom of Information Act"", ""We the People"", ""Authorities"", ""Precedents"", ""Sources"", ""Records"", ""Open Letters"", ""Articles"", ""Resources"", ""Our Priorities"", ""Main navigation"", ""Resources"", ""Required Reading"", ""Main navigation"", ""Our Priorities"", ""Authorities"", ""Precedents"", ""Open Letters"", ""Articles"", ""Sources"", ""Records"", ""Resources""]",[],"[""Pagination"", ""Utilizing Brady Material to Enhance Actuarial Data for Professional Liability Insurance"", ""Accountability of the Criminal Justice System"", ""The Evolution of a \""Paper of Record\"" to a \""Platform of Record\"""", ""Prosecutors and the Use of Potential Impeachment Disclosure [PID] Databases: Tracking Officer Misconduct"", ""The Role of Certification and Training Not-for-Profit Organizations""]",[],[],"" -3919,https://www.documentcloud.org/app?q=%2Bproject%3Aallegheny-county-jail-211877%20,List of Data Sources,Info About Agencies,DocumentCloud,"",200,DocumentCloud,[],[],[],[],[],[],"" -3920,https://www.documentcloud.org/documents/23577766-january-2023-warden-report,Annual & Monthly Reports,Info About Agencies,DocumentCloud,"",200,DocumentCloud,[],[],[],[],[],[],"" -3921,https://www.documentcloud.org/documents/23577768-incarcerated-individual-welfare-fund-fs,Annual & Monthly Reports,Info About Agencies,DocumentCloud,"",200,DocumentCloud,[],[],[],[],[],[],"" -3922,https://www.documentcloud.org/documents/23577767-draft-job-meeting-minutes-december-1-2022,Annual & Monthly Reports,Info About Agencies,DocumentCloud,"",200,DocumentCloud,[],[],[],[],[],[],"" -3923,https://www.documentcloud.org/documents/23577764-1423-jail-summary,Incarceration Records,Jails & Courts Specific,DocumentCloud,"",200,DocumentCloud,[],[],[],[],[],[],"" -3924,https://www.alleghenycounty.us/jail/reports.aspx,Incarceration Records,Jails & Courts Specific,"","",404,"","","","","","","","" -3925,https://eapps.alleghenycounty.us/restaurant/RestaurantDetail.aspx?ID=201408080003,Contact Info & Agency Meta,Info About Agencies,ACHD Restaurant Finder,"",200,"Health Department - Allegheny County, PA",[],[],[],[],[],[],"Restaurant Details Name Allegheny County Jail Address 950 2nd Avenue, Pittsburgh,PA 15219 Contact Jim Buckley Phone 412-3502038 Recent Inspections Inspection Date Purpose Report 03/26/2018 Complaint Inspection Report 03/16/2018 Complaint Inspection Report 02/28/2018 Reinspection Inspection Report 02/23/2018 Initial Inspection Report Inspection Date Purpose Report 03/26/2018 Complaint Inspection Report 03/16/2018 Complaint Inspection Report 02/28/2018 Reinspection Inspection Report 02/23/2018 Initial Inspection Report " -3926,https://eapps.alleghenycounty.us/restaurant/RestaurantDetail.aspx?ID=201808060005,Contact Info & Agency Meta,Info About Agencies,ACHD Restaurant Finder,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"Restaurant Details Name Allegheny County Jail Address 950 2nd Avenue, Pittsburgh,PA 15219 Contact Jeff Clark Phone 412-3502038 Recent Inspections Inspection Date Purpose Report 02/23/2021 Service Request Inspection Report 01/26/2021 Reinspection Inspection Report 12/04/2020 COVID-19, Initial Inspection Inspection Report 05/29/2019 Initial Inspection Report 01/23/2019 Complaint Inspection Report 07/25/2018 Initial, Service Request Inspection Report Inspection Date Purpose Report 02/23/2021 Service Request Inspection Report 01/26/2021 Reinspection Inspection Report 12/04/2020 COVID-19, Initial Inspection Inspection Report 05/29/2019 Initial Inspection Report 01/23/2019 Complaint Inspection Report 07/25/2018 Initial, Service Request Inspection Report " -3927,https://eapps.alleghenycounty.us/restaurant/RestaurantDetail.aspx?ID=202102230002,Contact Info & Agency Meta,Info About Agencies,ACHD Restaurant Finder,"",200,"Health Department - Allegheny County, PA",[],[],[],[],[],[],"Restaurant Details Name Allegheny County Jail Address 950 2nd Avenue, Pittsburgh,PA 15219 Contact MaryBeth Shearer Phone 412-3502038 Recent Inspections Inspection Date Purpose Report 06/14/2023 Reinspection, Complaint Inspection Report 01/18/2023 Initial Inspection Report 10/26/2022 Service Request Inspection Report 06/14/2022 Complaint Inspection Report 04/28/2022 Reinspection Inspection Report 04/04/2022 Reinspection Inspection Report 02/28/2022 Initial, Service Request Inspection Report 10/21/2021 Reinspection Inspection Report 09/16/2021 Consultation Inspection Report 07/12/2021 Reinspection Inspection Report 06/30/2021 Reinspection Inspection Report 06/28/2021 Complaint Inspection Report 04/27/2021 Reinspection Inspection Report 04/08/2021 COVID-19, Initial Inspection Inspection Report 02/23/2021 New Facility Inspection Report Inspection Date Purpose Report 06/14/2023 Reinspection, Complaint Inspection Report 01/18/2023 Initial Inspection Report 10/26/2022 Service Request Inspection Report 06/14/2022 Complaint Inspection Report 04/28/2022 Reinspection Inspection Report 04/04/2022 Reinspection Inspection Report 02/28/2022 Initial, Service Request Inspection Report 10/21/2021 Reinspection Inspection Report 09/16/2021 Consultation Inspection Report 07/12/2021 Reinspection Inspection Report 06/30/2021 Reinspection Inspection Report 06/28/2021 Complaint Inspection Report 04/27/2021 Reinspection Inspection Report 04/08/2021 COVID-19, Initial Inspection Inspection Report 02/23/2021 New Facility Inspection Report " -3928,https://data.cityofchicago.org/Service-Requests/311-Service-Requests/v6vf-nfxy,Calls for Service,Police & Public Interactions,311 Service Requests | City of Chicago | Data Portal,"",200,City of Chicago | Data Portal | City of Chicago | Data Portal,"[""311 Service Requests - Request Types"", ""311 Service Requests - Point Map"", ""311 Service Requests by Owner Department - Line Chart"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""311 Service Requests"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""311 Service Requests"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""311 …"", ""More about this dataset …"", ""311 Service Requests - Request Types …"", ""Metadata"", ""Topics"", ""Licensing and Attribution"", ""311 …"", ""More about this dataset …"", ""311 Service Requests - Request Types …""]",[],[],"[""OData Endpoint""]",Skip to Main Content Chicago Data Portal Sign In Browse Tutorial Feedback Menu Menu Close Browse Tutorial Feedback Sign In Search Chicago Data Portal Sign In Browse Tutorial Feedback Menu Chicago Data Portal Sign In Browse Tutorial Feedback Menu Sign In Sign In Browse Tutorial Feedback Menu Close Browse Tutorial Feedback Sign In Search Browse Tutorial Feedback Sign In Search Browse Tutorial Feedback Sign In Search Search -3929,https://analytics.alleghenycounty.us/2021/03/04/allegheny-county-jail-population-management-dashboards-2/,Incarceration Records,Jails & Courts Specific,Population of the Allegheny County Jail: Interactive Dashboard - Allegheny Analytics,"",200,Home - Allegheny Analytics,"[""Population of the Allegheny County Jail: Interactive Dashboard""]","[""Thanks for signing up!"", ""Sign up for updates""]","[""Trouble viewing the dashboard? You can view it directly here .""]",[],[],[],"Menu Home Topics Topics Children, Youth and Families Community Well-Being Crime and Justice Economic Security Education and Early Childhood Housing and Basic Needs Innovation and Reform Older Adults Substance Use and Mental Health All Work Content Types Content Types Dashboards Datasets Infographics Reports All Content Types Data Tools Data Tools QuickCount Human Services Community Profile Provider Tools (authorized users) Requesting Data About About About Us Data FAQ Contact Us Home Topics Children, Youth and Families Community Well-Being Crime and Justice Economic Security Education and Early Childhood Housing and Basic Needs Innovation and Reform Older Adults Substance Use and Mental Health All Work Content Types Dashboards Datasets Infographics Reports All Content Types Data Tools QuickCount Human Services Community Profile Provider Tools (authorized users) Requesting Data About About Us Data FAQ Contact Us All Topics Children, Youth and Families Community Well-Being Crime and Justice Economic Security Education and Early Childhood Housing and Basic Needs Innovation and Reform Older Adults Substance Use and Mental Health Home » Population of the Allegheny County Jail: Interactive Dashboard Population of the Allegheny County Jail: Interactive Dashboard March 4, 2021 Dashboards Access the dashboard Jail population dashboard, 2018 - present The dashboard below provides information about Allegheny County Jail population management, including the daily jail population, population in alternative housing, bookings and releases, and lengths of stay. Data is available from 2018 to the present and is updated daily. Trouble viewing the dashboard? You can view it directly here . If you require emergency assistance from the Department of Human Services, see our emergency contact page . This site is maintained by the Office of Analytics, Technology and Planning (ATP) at the Allegheny County Department of Human Services . For questions or suggestions, please reach out to DHS-Research@alleghenycounty.us . Thanks for signing up! You can unsubscribe at any time using the Unsubscribe link at the bottom of every email. Sign up for updates Get updates from Allegheny County Analytics in your inbox. Email Sorry, we could not complete your sign-up. Please contact us to resolve this. Operation timed out, please try again. By submitting this form, you are consenting to receive marketing emails from: Allegheny County DHS, One Smithfield St., Pittsburgh, PA, 15222, US. You can revoke your consent to receive emails at any time by using the SafeUnsubscribe® link, found at the bottom of every email. Emails are serviced by Constant Contact. Sign up! © 2024 - Allegheny County Department of Human Services, Office of Analytics, Technology and Planning (ATP) " -3930,https://portal-nc.tylertech.cloud/Portal/,Court Cases,Jails & Courts Specific,eCourts Portal,"",200,Error retrieving title: 'NoneType' object has no attribute 'text',"[""eCourts Portal""]","[""JavaScript must be enabled in order for you to use this application."", ""Cookies must be allowed."", ""You are using a web browser which this application no longer supports."", ""Supported Browsers"", ""Are you still here?""]",[],[],[],[],"JavaScript must be enabled in order for you to use this application. However, it seems JavaScript is either disabled or not supported by your browser. To use this application, enable JavaScript by changing your browser options, then try again. Cookies must be allowed. Your browser is currently set to block cookies. Your browser must allow cookies before you can use this application. Cookies are small text files stored on your computer that tell this application when you're signed in. To learn how to allow cookies, see online help in your web browser. You are using a web browser which this application no longer supports. We support the current and previous major releases of Google Chrome, Firefox, Internet Explorer, and Safari on a rolling basis. - Each time a new version is released, we begin supporting that version and stop supporting the third most recent version. Supported Browsers Chrome for Business Firefox Internet Explorer Apple Safari Internet Explorer 9 Users Internet Explorer 11 launched on October 17, 2013, and as a result, we've discontinued support for Internet Explorer 9. Organizations that depend on old versions of Internet Explorer may want to consider a dual browser strategy. Chrome for Business Firefox Internet Explorer Apple Safari Chrome for Business Chrome for Business Firefox Firefox Internet Explorer Internet Explorer Apple Safari Apple Safari eCourts Portal Register / Sign In Register Sign In Register / Sign In Register Sign In eCourts Portal eCourts Portal eCourts Portal Register / Sign In Register Sign In Register / Sign In Register Sign In Register / Sign In Register Sign In Register / Sign In Register Sign In eCourts Portal Portal Training Materials and Reference Guides ""How To"" Videos on YouTube! NC Attorney Elevated Access Request Form: AOC-A-264 What hardware and software are required for Portal? Need Help? Contact the Clerk of Court in the County where the case is assigned for specific case information or email the eCourts team (ecourts@nccourts.org) for other eCourt related questions. Smart Search: Bondsman are recorded as a “business” in Odyssey. The Search Type must be changed from “Smart Search” to “Business Name” under Advanced Filtering. Smart Search Search for court records and case information. Search Hearings Search for court dates / hearings by name, county, date range, and more. Make Payments Make payments on probation, parole, and some criminal and infraction cases. -CHROME or EDGE BROWSERS NC Judgment Search Search the judgment index to view items, in accordance with NCGS 7A-109(b)(6). eCourts Portal Portal Training Materials and Reference Guides ""How To"" Videos on YouTube! NC Attorney Elevated Access Request Form: AOC-A-264 What hardware and software are required for Portal? Need Help? Contact the Clerk of Court in the County where the case is assigned for specific case information or email the eCourts team (ecourts@nccourts.org) for other eCourt related questions. Smart Search: Bondsman are recorded as a “business” in Odyssey. The Search Type must be changed from “Smart Search” to “Business Name” under Advanced Filtering. " -3931,https://pypi.org/project/openpolicedata/,Incident Reports,Police & Public Interactions,openpolicedata · PyPI,"The OpenPoliceData (OPD) Python library is the most comprehensive centralized public access point for incident-level police data in the United States. OPD provides easy access to 395+ incident-level datasets for about 4800 police agencies. Types of data include traffic stops, use of force, officer-involved shootings, and complaints.",200,PyPI · The Python Package Index,"[""openpolicedata 0.6"", ""OpenPoliceData""]","[""Project description"", ""Latest Datasets Added to OPD"", ""Release Notes for Version 0.6 - 2024-02-10"", ""Contributing"", ""Project details"", ""Release history Release notifications | RSS feed"", ""Download files"", ""Help"", ""About PyPI"", ""Contributing to PyPI"", ""Using PyPI""]","[""Navigation"", ""Project links"", ""Statistics"", ""Meta"", ""Maintainers"", ""Classifiers"", ""Added"", ""Changed"", ""Deprecated"", ""Removed"", ""Fixed"", ""Project links"", ""Statistics"", ""Meta"", ""Maintainers"", ""Classifiers"", ""Source Distribution"", ""Built Distribution"", ""Hashes for openpolicedata-0.6.tar.gz"", ""Hashes for openpolicedata-0.6-py3-none-any.whl""]",[],[],[],"Warning Some features may not work without JavaScript. Please try enabling it if you encounter problems. Warning Some features may not work without JavaScript. Please try enabling it if you encounter problems. Search PyPI Search Help Sponsors Log in Register Menu Help Sponsors Log in Register Search PyPI Search Help Sponsors Log in Register Menu Help Sponsors Log in Register Search PyPI Search Help Sponsors Log in Register Menu Help Sponsors Log in Register Help Sponsors Log in Register Menu Help Sponsors Log in Register Search PyPI Search openpolicedata 0.6 pip install openpolicedata Copy PIP instructions Latest version Released: Feb 17, 2024 openpolicedata 0.6 pip install openpolicedata Copy PIP instructions Latest version Released: Feb 17, 2024 openpolicedata 0.6 pip install openpolicedata Copy PIP instructions pip install openpolicedata Copy PIP instructions Latest version Released: Feb 17, 2024 The OpenPoliceData (OPD) Python library is the most comprehensive centralized public access point for incident-level police data in the United States. OPD provides easy access to 395+ incident-level datasets for about 4800 police agencies. Types of data include traffic stops, use of force, officer-involved shootings, and complaints. The OpenPoliceData (OPD) Python library is the most comprehensive centralized public access point for incident-level police data in the United States. OPD provides easy access to 395+ incident-level datasets for about 4800 police agencies. Types of data include traffic stops, use of force, officer-involved shootings, and complaints. The OpenPoliceData (OPD) Python library is the most comprehensive centralized public access point for incident-level police data in the United States. OPD provides easy access to 395+ incident-level datasets for about 4800 police agencies. Types of data include traffic stops, use of force, officer-involved shootings, and complaints. " -3932,https://communitysafety.pittsburghpa.gov/blotter.aspx,Incident Reports,Police & Public Interactions,"","",-1,"","","","","","","","" -3933,data.austintexas.gov/resource/3bfz-mri4.json,Use of Force Reports,Police & Public Interactions,2019 Response to Resistance Data | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""2022_10_3 2019 Data of S.D.3 - Number and percentage of use of force incidents in proportion to the number of arrests made"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2019 Response to Resistance Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2019 Response to Resistance Data"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3934,data.austintexas.gov/resource/bx9w-y5sd.json,Use of Force Reports,Police & Public Interactions,R2R 2012 | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""R2R 2012"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""R2R 2012"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3935,data.austintexas.gov/resource/fk9e-2udt.json,Arrest Records,Police & Public Interactions,2014 Racial Profiling Arrests | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2014 Racial Profiling Arrests"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2014 Racial Profiling Arrests"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3936,data.austintexas.gov/resource/c65h-gw3m.json,Stops,Police & Public Interactions,2020 Racial Profiling (RP) dataset | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2020 Racial Profiling (RP) dataset"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2020 Racial Profiling (RP) dataset"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3937,data.austintexas.gov/resource/sc6h-qr9f.json,Citations,Police & Public Interactions,Racial Profiling Dataset 2015- Citations | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Racial Profiling Dataset 2015- Citations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Racial Profiling Dataset 2015- Citations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3938,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2015/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: APD CAD 911 Calls 2015 (ID:0),"",200,Error retrieving title: dictionary changed size during iteration,[],"[""Layer: APD CAD 911 Calls 2015 (ID:0)""]",[],[],[],[],"JSON Layer: APD CAD 911 Calls 2015 (ID:0) Name: APD CAD 911 Calls 2015 Display Field: Incident_Number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID_1 Unique ID Field: Name : OBJECTID_1 IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID_1 (type: esriFieldTypeOID, alias: OBJECTID_1, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Incident_Number (type: esriFieldTypeInteger, alias: Incident Number, SQL Type: sqlTypeOther, nullable: true, editable: true) Call_Time (type: esriFieldTypeString, alias: Call Time, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Nature (type: esriFieldTypeString, alias: Call Nature, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Disposition (type: esriFieldTypeString, alias: Call Disposition, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) objectid (type: esriFieldTypeInteger, alias: objectid, SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: APD CAD 911 Calls 2015 Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 8/25/2020 5:27:43 PM Schema Last Edit Date: 8/25/2020 5:27:43 PM Data Last Edit Date: 8/25/2020 5:27:43 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3939,data.austintexas.gov/resource/v6rq-ainw.json,Stops,Police & Public Interactions,2015 RP Warnings + Field Observations | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2015 RP Warnings + Field Observations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2015 RP Warnings + Field Observations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3940,data.austintexas.gov/resource/h8jq-pcz3.json,Use of Force Reports,Police & Public Interactions,R2R 2016 | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""R2R 2016"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""R2R 2016"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3941,data.austintexas.gov/resource/mw6q-k5gy.json,Citations,Police & Public Interactions,2014 Racial Profiling Dataset Citations | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2014 Racial Profiling Dataset Citations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2014 Racial Profiling Dataset Citations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3942,data.austintexas.gov/resource/djcn-eje6.json,Stops,Police & Public Interactions,2019 Racial Profiling (RP) Warning and Field Observations | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2019 Racial Profiling (RP) Warning and Field Observations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2019 Racial Profiling (RP) Warning and Field Observations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3943,data.austintexas.gov/resource/5w6q-adh8.json,Use of Force Reports,Police & Public Interactions,2017 R2R Subjects | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2017 R2R Subjects"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2017 R2R Subjects"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3944,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2020/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: coagiswarehouse.coagis.apd_cad_data (ID:0),"",200,Home,[],"[""Layer: coagiswarehouse.coagis.apd_cad_data (ID:0)""]",[],[],[],[],"JSON Layer: coagiswarehouse.coagis.apd_cad_data (ID:0) Name: coagiswarehouse.coagis.apd_cad_data Display Field: incident_number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: objectid Unique ID Field: Name : objectid IsSystemMaintained : True Global ID Field: Type ID Field: Fields: incident_number (type: esriFieldTypeString, alias: incident_number, SQL Type: sqlTypeOther, length: 14, nullable: true, editable: true) call_time (type: esriFieldTypeDate, alias: call_time, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 74, nullable: true, editable: true) call_nature (type: esriFieldTypeString, alias: call_nature, SQL Type: sqlTypeOther, length: 30, nullable: true, editable: true) call_disposition (type: esriFieldTypeString, alias: call_disposition, SQL Type: sqlTypeOther, length: 55, nullable: true, editable: true) objectid (type: esriFieldTypeOID, alias: objectid, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Templates: Name: coagiswarehouse.coagis.apd_cad_data Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 4/6/2021 6:53:40 PM Schema Last Edit Date: 4/6/2021 6:53:40 PM Data Last Edit Date: 4/6/2021 6:53:40 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3945,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2018/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: APD CAD 911 Calls 2018 (ID:0),"",200,Home,[],"[""Layer: APD CAD 911 Calls 2018 (ID:0)""]",[],[],[],[],"JSON Layer: APD CAD 911 Calls 2018 (ID:0) Name: APD CAD 911 Calls 2018 Display Field: Incident_Number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID_1 Unique ID Field: Name : OBJECTID_1 IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID_1 (type: esriFieldTypeOID, alias: OBJECTID_1, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Incident_Number (type: esriFieldTypeInteger, alias: Incident Number, SQL Type: sqlTypeOther, nullable: true, editable: true) Call_Time (type: esriFieldTypeString, alias: Call Time, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Nature (type: esriFieldTypeString, alias: Call Nature, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Disposition (type: esriFieldTypeString, alias: Call Disposition, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) objectid (type: esriFieldTypeInteger, alias: objectid, SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: APD CAD 911 Calls 2018 Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 8/25/2020 7:44:05 PM Schema Last Edit Date: 8/25/2020 7:44:05 PM Data Last Edit Date: 8/25/2020 7:44:05 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3946,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2019/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: APD CAD 911 Calls 2019 (ID:0),"",200,Home,[],"[""Layer: APD CAD 911 Calls 2019 (ID:0)""]",[],[],[],[],"JSON Layer: APD CAD 911 Calls 2019 (ID:0) Name: APD CAD 911 Calls 2019 Display Field: Incident_Number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID_1 Unique ID Field: Name : OBJECTID_1 IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID_1 (type: esriFieldTypeOID, alias: OBJECTID_1, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Incident_Number (type: esriFieldTypeInteger, alias: Incident Number, SQL Type: sqlTypeOther, nullable: true, editable: true) Call_Time (type: esriFieldTypeString, alias: Call Time, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Nature (type: esriFieldTypeString, alias: Call Nature, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Disposition (type: esriFieldTypeString, alias: Call Disposition, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) objectid (type: esriFieldTypeInteger, alias: objectid, SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: APD CAD 911 Calls 2019 Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 8/25/2020 7:48:26 PM Schema Last Edit Date: 8/25/2020 7:48:26 PM Data Last Edit Date: 8/25/2020 7:48:26 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3947,data.austintexas.gov/resource/m4cc-q8pr.json,Arrest Records,Police & Public Interactions,2019 Racial Profiling (RP) Arrests | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2019 Racial Profiling (RP) Arrests"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2019 Racial Profiling (RP) Arrests"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3948,data.austintexas.gov/resource/dwrk-z7q9.json,Use of Force Reports,Police & Public Interactions,2019 Response to Resistance Subject Data | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""2022_10_3 2019 Data of S.D.3 - Number and percentage of use of force incidents in proportion to the number of arrests made"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2019 Response to Resistance Subject Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2019 Response to Resistance Subject Data"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3949,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2012/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: APD CAD 911 Calls 2012 (ID:0),"",200,Home,[],"[""Layer: APD CAD 911 Calls 2012 (ID:0)""]",[],[],[],[],"JSON Layer: APD CAD 911 Calls 2012 (ID:0) Name: APD CAD 911 Calls 2012 Display Field: Incident_Number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID_1 Unique ID Field: Name : OBJECTID_1 IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID_1 (type: esriFieldTypeOID, alias: OBJECTID_1, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Incident_Number (type: esriFieldTypeInteger, alias: Incident Number, SQL Type: sqlTypeOther, nullable: true, editable: true) Call_Time (type: esriFieldTypeString, alias: Call Time, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Nature (type: esriFieldTypeString, alias: Call Nature, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Disposition (type: esriFieldTypeString, alias: Call Disposition, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) objectid (type: esriFieldTypeInteger, alias: objectid, SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: APD CAD 911 Calls 2012 Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 8/25/2020 5:10:45 PM Schema Last Edit Date: 8/25/2020 5:10:45 PM Data Last Edit Date: 8/25/2020 5:10:45 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3950,data.austintexas.gov/resource/nbjz-52e4.json,Arrest Records,Police & Public Interactions,2015 Racial Profiling Arrests | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2015 Racial Profiling Arrests"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2015 Racial Profiling Arrests"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3951,https://data-avl.opendata.arcgis.com/search?tags=publicsafety,List of Data Sources,Info About Agencies,City of Asheville Open Data,City of Asheville Open Data,200,City of Asheville Open Data,[],[],[],[],[],[],"" -3952,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2009/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: APD CAD 911 Calls 2009 (ID:0),"",200,Home,[],"[""Layer: APD CAD 911 Calls 2009 (ID:0)""]",[],[],[],[],"JSON Layer: APD CAD 911 Calls 2009 (ID:0) Name: APD CAD 911 Calls 2009 Display Field: Incident_Number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID_1 Unique ID Field: Name : OBJECTID_1 IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID_1 (type: esriFieldTypeOID, alias: OBJECTID_1, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Incident_Number (type: esriFieldTypeInteger, alias: Incident Number, SQL Type: sqlTypeOther, nullable: true, editable: true) Call_Time (type: esriFieldTypeString, alias: Call Time, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Nature (type: esriFieldTypeString, alias: Call Nature, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Disposition (type: esriFieldTypeString, alias: Call Disposition, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) objectid (type: esriFieldTypeInteger, alias: objectid, SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: APD CAD 911 Calls 2009 Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 8/25/2020 4:45:59 PM Schema Last Edit Date: 8/25/2020 4:45:59 PM Data Last Edit Date: 8/25/2020 4:45:59 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3953,data.austintexas.gov/resource/urfd-wng9.json,Citations,Police & Public Interactions,2016 RP Citations | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2016 RP Citations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2016 RP Citations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3954,data.austintexas.gov/resource/qhi8-a9bc.json,Stops,Police & Public Interactions,2016 RP Warnings + Field Observations | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2016 RP Warnings + Field Observations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2016 RP Warnings + Field Observations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3955,data.austintexas.gov/resource/vchc-c622.json,Stops,Police & Public Interactions,2018 RP Warnings + Field Observations | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2018 RP Warnings + Field Observations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2018 RP Warnings + Field Observations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3956,data.albanyny.gov/resource/s2gk-irhz.json,Complaints & Misconduct,Info About Officers,APD Citizen Complaints | City of Albany,"",200,Error retrieving title: No connection adapters were found for '://',"[""APD Citizen Complaints by Month"", ""APD Citizen Complaints by Month Visualization"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""APD Citizen Complaints"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""APD Citizen Complaints"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Page Browse Developers Support Menu Menu Close Home Page Browse Developers Support Sign In Search Sign In Home Page Browse Developers Support Menu Sign In Home Page Browse Developers Support Menu Sign In Sign In Home Page Browse Developers Support Menu Close Home Page Browse Developers Support Sign In Search Home Page Browse Developers Support Sign In Search Home Page Browse Developers Support Sign In Search Search -3957,data.austintexas.gov/resource/bmz9-cdnt.json,Arrest Records,Police & Public Interactions,2016 RP Arrests | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2016 RP Arrests"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2016 RP Arrests"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3958,data.austintexas.gov/resource/b9rk-dixy.json,Citations,Police & Public Interactions,2018 RP Citations | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""S.D.1.a_ difference between the percentages of citations that result from a motor vehicle stop involving individuals of a particular race compared to the percentage of that race in the city of Austin at race in the city of Austin"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2018 RP Citations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2018 RP Citations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3959,data.austintexas.gov/resource/iydp-s2cf.json,Use of Force Reports,Police & Public Interactions,R2R 2015 | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""R2R 2015"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""R2R 2015"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3960,data.austintexas.gov/resource/5evd-3tba.json,Use of Force Reports,Police & Public Interactions,2017 R2R Dataset | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2017 R2R Dataset"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2017 R2R Dataset"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3961,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2014/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: APD CAD 911 Calls 2014 (ID:0),"",200,Home,[],"[""Layer: APD CAD 911 Calls 2014 (ID:0)""]",[],[],[],[],"JSON Layer: APD CAD 911 Calls 2014 (ID:0) Name: APD CAD 911 Calls 2014 Display Field: Incident_Number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID_1 Unique ID Field: Name : OBJECTID_1 IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID_1 (type: esriFieldTypeOID, alias: OBJECTID_1, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Incident_Number (type: esriFieldTypeInteger, alias: Incident Number, SQL Type: sqlTypeOther, nullable: true, editable: true) Call_Time (type: esriFieldTypeString, alias: Call Time, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Nature (type: esriFieldTypeString, alias: Call Nature, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Disposition (type: esriFieldTypeString, alias: Call Disposition, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) objectid (type: esriFieldTypeInteger, alias: objectid, SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: APD CAD 911 Calls 2014 Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 8/25/2020 5:24:50 PM Schema Last Edit Date: 8/25/2020 5:24:50 PM Data Last Edit Date: 8/25/2020 5:24:50 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3962,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2016/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: APD CAD 911 Calls 2016 (ID:0),"",200,Home,[],"[""Layer: APD CAD 911 Calls 2016 (ID:0)""]",[],[],[],[],"JSON Layer: APD CAD 911 Calls 2016 (ID:0) Name: APD CAD 911 Calls 2016 Display Field: Incident_Number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID_1 Unique ID Field: Name : OBJECTID_1 IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID_1 (type: esriFieldTypeOID, alias: OBJECTID_1, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Incident_Number (type: esriFieldTypeInteger, alias: Incident Number, SQL Type: sqlTypeOther, nullable: true, editable: true) Call_Time (type: esriFieldTypeString, alias: Call Time, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Nature (type: esriFieldTypeString, alias: Call Nature, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Disposition (type: esriFieldTypeString, alias: Call Disposition, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) objectid (type: esriFieldTypeInteger, alias: objectid, SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: APD CAD 911 Calls 2016 Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 8/25/2020 6:04:23 PM Schema Last Edit Date: 8/25/2020 6:04:23 PM Data Last Edit Date: 8/25/2020 6:04:23 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3963,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2013/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: APD CAD 911 Calls 2013 (ID:0),"",200,Home,[],"[""Layer: APD CAD 911 Calls 2013 (ID:0)""]",[],[],[],[],"JSON Layer: APD CAD 911 Calls 2013 (ID:0) Name: APD CAD 911 Calls 2013 Display Field: Incident_Number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID_1 Unique ID Field: Name : OBJECTID_1 IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID_1 (type: esriFieldTypeOID, alias: OBJECTID_1, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Incident_Number (type: esriFieldTypeInteger, alias: Incident Number, SQL Type: sqlTypeOther, nullable: true, editable: true) Call_Time (type: esriFieldTypeString, alias: Call Time, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Nature (type: esriFieldTypeString, alias: Call Nature, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Disposition (type: esriFieldTypeString, alias: Call Disposition, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) objectid (type: esriFieldTypeInteger, alias: objectid, SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: APD CAD 911 Calls 2013 Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 8/25/2020 5:15:21 PM Schema Last Edit Date: 8/25/2020 5:15:21 PM Data Last Edit Date: 8/25/2020 5:15:21 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3964,data.austintexas.gov/resource/7guv-wkre.json,Citations,Police & Public Interactions,2017 Racial Profiling Dataset Citations | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2017 Racial Profiling Dataset Citations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2017 Racial Profiling Dataset Citations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3965,data.austintexas.gov/resource/jipa-v8m5.json,Use of Force Reports,Police & Public Interactions,R2R 2011 | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""R2R 2011"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""R2R 2011"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3966,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2010/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: APD CAD 911 Calls 2010 (ID:0),"",200,Home,[],"[""Layer: APD CAD 911 Calls 2010 (ID:0)""]",[],[],[],[],"JSON Layer: APD CAD 911 Calls 2010 (ID:0) Name: APD CAD 911 Calls 2010 Display Field: Incident_Number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID_1 Unique ID Field: Name : OBJECTID_1 IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID_1 (type: esriFieldTypeOID, alias: OBJECTID_1, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Incident_Number (type: esriFieldTypeInteger, alias: Incident Number, SQL Type: sqlTypeOther, nullable: true, editable: true) Call_Time (type: esriFieldTypeString, alias: Call Time, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Nature (type: esriFieldTypeString, alias: Call Nature, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Disposition (type: esriFieldTypeString, alias: Call Disposition, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) objectid (type: esriFieldTypeInteger, alias: objectid, SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: APD CAD 911 Calls 2010 Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 8/25/2020 4:50:31 PM Schema Last Edit Date: 8/25/2020 4:50:31 PM Data Last Edit Date: 8/25/2020 4:50:31 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3967,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2021/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: APD CAD 911 Calls (ID:0),"",200,Home,[],"[""Layer: APD CAD 911 Calls (ID:0)""]",[],[],[],[],"JSON Layer: APD CAD 911 Calls (ID:0) Name: APD CAD 911 Calls Display Field: incident_number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: objectid Unique ID Field: Name : objectid IsSystemMaintained : True Global ID Field: Type ID Field: Fields: objectid (type: esriFieldTypeOID, alias: OBJECTID, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) incident_number (type: esriFieldTypeString, alias: incident_number, SQL Type: sqlTypeOther, length: 14, nullable: true, editable: true) call_time (type: esriFieldTypeDate, alias: call_time, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 74, nullable: true, editable: true) call_nature (type: esriFieldTypeString, alias: call_nature, SQL Type: sqlTypeOther, length: 30, nullable: true, editable: true) call_disposition (type: esriFieldTypeString, alias: call_disposition, SQL Type: sqlTypeOther, length: 55, nullable: true, editable: true) Templates: Name: APD CAD 911 Calls Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 4/1/2022 6:43:47 PM Schema Last Edit Date: 4/1/2022 6:43:47 PM Data Last Edit Date: 4/1/2022 6:43:47 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3968,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2005/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: APD CAD 911 Calls 2005 (ID:0),"",200,Home,[],"[""Layer: APD CAD 911 Calls 2005 (ID:0)""]",[],[],[],[],"JSON Layer: APD CAD 911 Calls 2005 (ID:0) Name: APD CAD 911 Calls 2005 Display Field: Incident_Number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID_1 Unique ID Field: Name : OBJECTID_1 IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID_1 (type: esriFieldTypeOID, alias: OBJECTID_1, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Incident_Number (type: esriFieldTypeInteger, alias: Incident Number, SQL Type: sqlTypeOther, nullable: true, editable: true) Call_Time (type: esriFieldTypeString, alias: Call Time, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Nature (type: esriFieldTypeString, alias: Call Nature, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Disposition (type: esriFieldTypeString, alias: Call Disposition, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) objectid (type: esriFieldTypeInteger, alias: objectid, SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: APD CAD 911 Calls 2005 Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 8/25/2020 4:18:32 PM Schema Last Edit Date: 8/25/2020 4:18:32 PM Data Last Edit Date: 8/25/2020 4:18:32 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3969,data.austintexas.gov/resource/c7is-tz8m.json,Use of Force Reports,Police & Public Interactions,2018 Response to Resistance Subjects Data | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2018 Response to Resistance Subjects Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2018 Response to Resistance Subjects Data"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3970,data.austintexas.gov/resource/tqet-vty2.json,Stops,Police & Public Interactions,2014 Racial Profiling Warnings + Field Observations | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2014 Racial Profiling Warnings + Field Observations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2014 Racial Profiling Warnings + Field Observations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3971,data.austintexas.gov/resource/8mvp-v9jz.json,Officer Involved Shootings,Police & Public Interactions,Officer Involved Shootings 2008-17 Officers | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Officer Involved Shootings 2008-17 Officers"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Officer Involved Shootings 2008-17 Officers"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3972,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2011/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: dbo.uvw_apd_cad_data2011.csv (ID:0),"",200,Home,[],"[""Layer: dbo.uvw_apd_cad_data2011.csv (ID:0)""]",[],[],[],[],"JSON Layer: dbo.uvw_apd_cad_data2011.csv (ID:0) Name: dbo.uvw_apd_cad_data2011.csv Display Field: Incident_Number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID_1 Unique ID Field: Name : OBJECTID_1 IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID_1 (type: esriFieldTypeOID, alias: OBJECTID_1, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Incident_Number (type: esriFieldTypeInteger, alias: Incident Number, SQL Type: sqlTypeOther, nullable: true, editable: true) Call_Time (type: esriFieldTypeString, alias: Call Time, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Nature (type: esriFieldTypeString, alias: Call Nature, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Disposition (type: esriFieldTypeString, alias: Call Disposition, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) objectid (type: esriFieldTypeInteger, alias: objectid, SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: dbo.uvw_apd_cad_data2011.csv Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 8/25/2020 5:06:33 PM Schema Last Edit Date: 8/25/2020 5:06:33 PM Data Last Edit Date: 8/25/2020 5:06:33 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3973,data.austintexas.gov/resource/uzqv-9uza.json,Officer Involved Shootings,Police & Public Interactions,Officer Involved Shootings 2008-17 Incidents | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Officer Involved Shootings 2008-17 Incidents"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Officer Involved Shootings 2008-17 Incidents"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3974,data.austintexas.gov/resource/xfke-9bsj.json,Arrest Records,Police & Public Interactions,2018 RP Arrests | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2018 RP Arrests"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2018 RP Arrests"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3975,data.austintexas.gov/resource/x4p3-hj3y.json,Arrest Records,Police & Public Interactions,2017 Racial Profiling Arrests | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2017 Racial Profiling Arrests"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2017 Racial Profiling Arrests"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3976,data.austintexas.gov/resource/5asp-dw2k.json,Stops,Police & Public Interactions,2017 Racial Profiling Warnings + Field Observations | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2017 Racial Profiling Warnings + Field Observations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2017 Racial Profiling Warnings + Field Observations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3977,data.austintexas.gov/resource/uzta-a386.json,Citations,Police & Public Interactions,2019 Racial Profiling (RP) Citations | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2019 Racial Profiling (RP) Citations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2019 Racial Profiling (RP) Citations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3978,data.austintexas.gov/resource/u2k2-n8ez.json,Officer Involved Shootings,Police & Public Interactions,2008-17 OIS Subjects | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2008-17 OIS Subjects"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2008-17 OIS Subjects"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3979,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2017/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: APD CAD 911 Calls 2017 (ID:0),"",200,Home,[],"[""Layer: APD CAD 911 Calls 2017 (ID:0)""]",[],[],[],[],"JSON Layer: APD CAD 911 Calls 2017 (ID:0) Name: APD CAD 911 Calls 2017 Display Field: Incident_Number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID_1 Unique ID Field: Name : OBJECTID_1 IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID_1 (type: esriFieldTypeOID, alias: OBJECTID_1, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Incident_Number (type: esriFieldTypeInteger, alias: Incident Number, SQL Type: sqlTypeOther, nullable: true, editable: true) Call_Time (type: esriFieldTypeString, alias: Call Time, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Nature (type: esriFieldTypeString, alias: Call Nature, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Disposition (type: esriFieldTypeString, alias: Call Disposition, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) objectid (type: esriFieldTypeInteger, alias: objectid, SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: APD CAD 911 Calls 2017 Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 8/25/2020 6:42:20 PM Schema Last Edit Date: 8/25/2020 6:42:20 PM Data Last Edit Date: 8/25/2020 6:42:20 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3980,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2008/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: APD CAD 911 Calls 2008 (ID:0),"",200,Home,[],"[""Layer: APD CAD 911 Calls 2008 (ID:0)""]",[],[],[],[],"JSON Layer: APD CAD 911 Calls 2008 (ID:0) Name: APD CAD 911 Calls 2008 Display Field: Incident_Number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID_1 Unique ID Field: Name : OBJECTID_1 IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID_1 (type: esriFieldTypeOID, alias: OBJECTID_1, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Incident_Number (type: esriFieldTypeInteger, alias: Incident Number, SQL Type: sqlTypeOther, nullable: true, editable: true) Call_Time (type: esriFieldTypeString, alias: Call Time, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Nature (type: esriFieldTypeString, alias: Call Nature, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Disposition (type: esriFieldTypeString, alias: Call Disposition, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) objectid (type: esriFieldTypeInteger, alias: objectid, SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: APD CAD 911 Calls 2008 Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 8/25/2020 4:40:36 PM Schema Last Edit Date: 8/25/2020 4:40:36 PM Data Last Edit Date: 8/25/2020 4:40:36 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3981,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2006/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: APD CAD 911 Calls 2006 (ID:0),"",200,Home,[],"[""Layer: APD CAD 911 Calls 2006 (ID:0)""]",[],[],[],[],"JSON Layer: APD CAD 911 Calls 2006 (ID:0) Name: APD CAD 911 Calls 2006 Display Field: Incident_Number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID_1 Unique ID Field: Name : OBJECTID_1 IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID_1 (type: esriFieldTypeOID, alias: OBJECTID_1, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Incident_Number (type: esriFieldTypeInteger, alias: Incident Number, SQL Type: sqlTypeOther, nullable: true, editable: true) Call_Time (type: esriFieldTypeString, alias: Call Time, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Nature (type: esriFieldTypeString, alias: Call Nature, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Disposition (type: esriFieldTypeString, alias: Call Disposition, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) objectid (type: esriFieldTypeInteger, alias: objectid, SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: APD CAD 911 Calls 2006 Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 8/25/2020 4:27:12 PM Schema Last Edit Date: 8/25/2020 4:27:12 PM Data Last Edit Date: 8/25/2020 4:27:12 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3982,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2007/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: APD CAD 911 Calls 2007 (ID:0),"",200,Home,[],"[""Layer: APD CAD 911 Calls 2007 (ID:0)""]",[],[],[],[],"JSON Layer: APD CAD 911 Calls 2007 (ID:0) Name: APD CAD 911 Calls 2007 Display Field: Incident_Number Type: Table Description: Copyright Text: Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID_1 Unique ID Field: Name : OBJECTID_1 IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID_1 (type: esriFieldTypeOID, alias: OBJECTID_1, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Incident_Number (type: esriFieldTypeInteger, alias: Incident Number, SQL Type: sqlTypeOther, nullable: true, editable: true) Call_Time (type: esriFieldTypeString, alias: Call Time, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) address (type: esriFieldTypeString, alias: address, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Nature (type: esriFieldTypeString, alias: Call Nature, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Call_Disposition (type: esriFieldTypeString, alias: Call Disposition, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) objectid (type: esriFieldTypeInteger, alias: objectid, SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: APD CAD 911 Calls 2007 Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 8/25/2020 4:32:54 PM Schema Last Edit Date: 8/25/2020 4:32:54 PM Data Last Edit Date: 8/25/2020 4:32:54 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -3983,https://bloomington.data.socrata.com/Police/Citizen-Complaints/kit3-8bua,Complaints & Misconduct,Info About Officers,Citizen Complaints | City of Bloomington Open Data,"",200,City of Bloomington Open Data,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Citizen Complaints"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Citizen Complaints"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content City of Bloomington Open Data Sign In Home Browse Menu Menu Close Home Browse Sign In Search City of Bloomington Open Data Sign In Home Browse Menu City of Bloomington Open Data Sign In Home Browse Menu Sign In Sign In Home Browse Menu Close Home Browse Sign In Search Home Browse Sign In Search Home Browse Sign In Search Search -3984,http://gouda.beloitwi.gov/WebLink/0/edoc/66423/3Use%20of%20Force%202017%20-%20last%20updated%201-12-18.xls,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -3985,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Civilian-Officer_2019.csv,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -3986,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Civilian-Officer_2017.csv,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -3987,https://bloomington.data.socrata.com/Police/Officer-Involved-Shootings/63j3-n7jh,Officer Involved Shootings,Police & Public Interactions,Officer Involved Shootings | City of Bloomington Open Data,"",200,City of Bloomington Open Data,"[""Officer Involved Shootings"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Officer Involved Shootings"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Officer Involved Shootings"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content City of Bloomington Open Data Sign In Home Browse Menu Menu Close Home Browse Sign In Search City of Bloomington Open Data Sign In Home Browse Menu City of Bloomington Open Data Sign In Home Browse Menu Sign In Sign In Home Browse Menu Close Home Browse Sign In Search Home Browse Sign In Search Home Browse Sign In Search Search -3988,data.austintexas.gov/resource/rus9-w6q5.json,Use of Force Reports,Police & Public Interactions,2018 Response to Resistance Data | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2018 Response to Resistance Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2018 Response to Resistance Data"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -3989,https://data.bloomington.in.gov/dataset/c25e7854-dcb5-40d4-b94c-e6e518c2ddfa/resource/0dc23bb3-98d6-436b-b3d4-fb0f846869c9/download/2016-first-quarter-bpd-employee-demographics.csv,Personnel Records,Info About Officers,"","",404,"","","","","","","","" -3990,https://opendata.baltimorecity.gov/egis/rest/services/Hosted/911_Calls_For_Service_2019_csv/FeatureServer/0,Calls for Service,Police & Public Interactions,Application Error,"",200,IIS Windows Server,"[""ArcGIS Web Adaptor""]",[],[],[],[],[],ArcGIS Web Adaptor Could not access any server machines. Please contact your system administrator. ArcGIS Web Adaptor Could not access any server machines. Please contact your system administrator. Could not access any server machines. Please contact your system administrator. -3991,https://bloomington.data.socrata.com/Police/Accidents/vf95-pwwj,Incident Reports,Police & Public Interactions,Accidents | City of Bloomington Open Data,"",200,City of Bloomington Open Data,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Accidents"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Accidents"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content City of Bloomington Open Data Sign In Home Browse Menu Menu Close Home Browse Sign In Search City of Bloomington Open Data Sign In Home Browse Menu City of Bloomington Open Data Sign In Home Browse Menu Sign In Sign In Home Browse Menu Close Home Browse Sign In Search Home Browse Sign In Search Home Browse Sign In Search Search -3992,https://services1.arcgis.com/UWYHeuuJISiGmgXx/arcgis/rest/services/911_Calls_for_Service_2021_Historic/FeatureServer/0,Calls for Service,Police & Public Interactions,Home,"",200,Home,[],"[""Home""]",[],[],[],[],JSON Home Invalid URL Invalid URL -3993,https://opendata.baltimorecity.gov/egis/rest/services/Hosted/911_Calls_For_Service_2020_csv/FeatureServer/0,Calls for Service,Police & Public Interactions,Application Error,"",200,IIS Windows Server,"[""ArcGIS Web Adaptor""]",[],[],[],[],[],ArcGIS Web Adaptor Could not access any server machines. Please contact your system administrator. ArcGIS Web Adaptor Could not access any server machines. Please contact your system administrator. Could not access any server machines. Please contact your system administrator. -3994,https://opendata.baltimorecity.gov/egis/rest/services/Hosted/911_Calls_For_Service_2017_csv/FeatureServer/0,Calls for Service,Police & Public Interactions,Application Error,"",200,IIS Windows Server,"[""ArcGIS Web Adaptor""]",[],[],[],[],[],ArcGIS Web Adaptor Could not access any server machines. Please contact your system administrator. ArcGIS Web Adaptor Could not access any server machines. Please contact your system administrator. Could not access any server machines. Please contact your system administrator. -3995,https://data.austintexas.gov/browse?category=Public+Safety,List of Data Sources,Info About Agencies,Results matching category of Public Safety | Page 1 of 60 | Open Data | City of Austin Texas,"",200,Open Data | City of Austin Texas | Open Data | City of Austin Texas,"[""Categories"", ""Department"", ""Tags""]","[""Menu"", ""Categories > Public Safety"", ""Sort"", ""Sort by Most Relevant"", ""Filter"", ""Categories"", ""View Types"", ""Department"", ""Tags"", ""Federated Domains"", ""Austin Fire Department and ATCEMS Stations"", ""Crime Reports"", ""Map of Austin Police Stations"", ""Short Term Rental Locations"", ""EMS - CPI_04 - ASA for ACS Compliance Chart"", ""FY2017 Safety Concerns by Category"", ""EMS - CPI 02 - Stroke Alert Scene Time 90th Percentile chart"", ""Austin Code Complaint Cases"", ""EMS - County Priority 2 Performance"", ""FY 2015 On-Time Compliance"", ""A-Z"", ""A-Z"", ""A-Z""]",[],[],[],[],Skip to main content Skip to footer links -3996,https://opendata.cityofboise.org/search?q=police,List of Data Sources,Info About Agencies,City of Boise Maps and GIS Open Data Portal,City of Boise Open Data Portal for geospatial data and maps.,200,City of Boise Maps and GIS Open Data Portal,[],[],[],[],[],[],"" -3997,https://opendata.baltimorecity.gov/egis/rest/services/Hosted/911_Calls_For_Service_2018_csv/FeatureServer/0,Calls for Service,Police & Public Interactions,Application Error,"",200,IIS Windows Server,"[""ArcGIS Web Adaptor""]",[],[],[],[],[],ArcGIS Web Adaptor Could not access any server machines. Please contact your system administrator. ArcGIS Web Adaptor Could not access any server machines. Please contact your system administrator. Could not access any server machines. Please contact your system administrator. -3998,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Civilian-Officer_2018.csv,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -3999,https://services1.arcgis.com/WHM6qC35aMtyAAlN/arcgis/rest/services/BPD_CallsForService/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: Police Calls for Service (ID:0),"",200,Home,[],"[""Layer: Police Calls for Service (ID:0)""]",[],[],[],[],"JSON Layer: Police Calls for Service (ID:0) Name: Police Calls for Service Display Field: CADIncidentNumber Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID Unique ID Field: Name : OBJECTID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID (type: esriFieldTypeOID, alias: OBJECTID, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) CADIncidentNumber (type: esriFieldTypeString, alias: Incident Number, SQL Type: sqlTypeOther, length: 20, nullable: true, editable: true) ResponseDateTime (type: esriFieldTypeDate, alias: Response Date Time (UTC), SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) Agency (type: esriFieldTypeString, alias: Jurisdiction Agency, SQL Type: sqlTypeOther, length: 5, nullable: true, editable: true) FinalPriority (type: esriFieldTypeInteger, alias: Final Priority, SQL Type: sqlTypeOther, nullable: true, editable: true) CallSource (type: esriFieldTypeString, alias: Call Source, SQL Type: sqlTypeOther, length: 7, nullable: true, editable: true) CallType (type: esriFieldTypeString, alias: Call Type, SQL Type: sqlTypeOther, length: 7, nullable: true, editable: true) IncidentCategory (type: esriFieldTypeString, alias: Incident Category, SQL Type: sqlTypeOther, length: 50, nullable: true, editable: true) CensusTract (type: esriFieldTypeString, alias: Census Tract, SQL Type: sqlTypeOther, length: 6, nullable: true, editable: true) GEOID (type: esriFieldTypeString, alias: Census GEOID, SQL Type: sqlTypeOther, length: 11, nullable: true, editable: true) NeighborhoodAssociation (type: esriFieldTypeString, alias: Neighborhood Association, SQL Type: sqlTypeOther, length: 40, nullable: true, editable: true) FirstAssFirstArrDurSec (type: esriFieldTypeInteger, alias: First Assigned First Arrived Duration (sec), SQL Type: sqlTypeOther, nullable: true, editable: true) FirstAssFirstArrDur (type: esriFieldTypeString, alias: First Assigned First Arrived Duration (hh:mm:ss), SQL Type: sqlTypeOther, length: 30, nullable: true, editable: true) CallRecFirstAssDurSec (type: esriFieldTypeInteger, alias: First Received First Assigned Duration (sec), SQL Type: sqlTypeOther, nullable: true, editable: true) CallRecFirstAssDur (type: esriFieldTypeString, alias: Call Received First Assigned Duration (hh:mm:ss), SQL Type: sqlTypeOther, length: 30, nullable: true, editable: true) CallRecFirstArrDurSec (type: esriFieldTypeInteger, alias: Call Received First Assigned Duration (sec), SQL Type: sqlTypeOther, nullable: true, editable: true) CallRecFirstArrDur (type: esriFieldTypeString, alias: Call Received First Arrived Duration (hh:mm:ss), SQL Type: sqlTypeOther, length: 30, nullable: true, editable: true) FirstAssLastClrDurSec (type: esriFieldTypeInteger, alias: First Assigned Last Cleared Duration (sec), SQL Type: sqlTypeOther, nullable: true, editable: true) FirstAssLastClrDur (type: esriFieldTypeString, alias: First Assigned Last Cleared Duration (hh:mm:ss), SQL Type: sqlTypeOther, length: 30, nullable: true, editable: true) CallRecSecArrDur (type: esriFieldTypeString, alias: Call Received Second Arrived Duration (hh:mm:ss), SQL Type: sqlTypeOther, length: 30, nullable: true, editable: true) CallRecSecArrDurSec (type: esriFieldTypeInteger, alias: Call Received Second Arrived Duration (sec), SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: Police Calls for Service Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 3/25/2024 2:04:34 PM Schema Last Edit Date: 3/25/2024 2:04:34 PM Data Last Edit Date: 3/25/2024 2:04:26 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4000,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Civilian-Officer_2020.csv,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -4001,data.austintexas.gov/resource/qxx9-6iwk.json,Use of Force Reports,Police & Public Interactions,R2R 2013 | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""R2R 2013"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""R2R 2013"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -4002,http://gouda.beloitwi.gov/WebLink/0/edoc/72935/1Use%20of%20Force%202020%20-%20Updated%20on%206-12-2020.xls,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -4003,https://data.baltimorecity.gov/datasets/bpd-arrests/explore,Arrest Records,Police & Public Interactions,BPD Arrests, This dataset represents arrests made by the Baltimore Police Department. Data are updated weekly.,200,Open Baltimore,[],[],[],[],[],[],"" -4004,https://gisweb.bozeman.net/hosted/rest/services/BPD_Calls_For_Service_Public/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: BPD Calls For Service - Public (ID: 0),"",200,IIS Windows Server,[],"[""Layer: BPD Calls For Service - Public (ID: 0)""]",[],[],[],[],"View In: ArcGIS Online Map Viewer Name: BPD Calls For Service - Public Display Field: INCIDENT_NUMBER Type: Feature Layer Geometry Type: esriGeometryPoint Description: Service Item Id: dd8978cbd7f547e893514bde9009bc25 Copyright Text: Default Visibility: true MaxRecordCount: 200000 Supported Query Formats: JSON, geoJSON, PBF Min Scale: 0 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Can Scale Symbols: false Use Standardized Queries: true Supports ValidateSQL: true Supports Calculate: true Supports Datum Transformation: true Extent: XMin: -1.24628844886E7 YMin: 45.635499998927116 XMax: -110.99709999933839 YMax: 5829193.510600001 Spatial Reference: 102100 - (3857) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [58, 165, 156, 255] Size: 4.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 0 Label: N/A Description: N/A Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: true Supports Returning Geometry Centroid: false Supports Binning LOD: false Supports Query With LOD Spatial Reference: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: Fields: OBJECTID ( -type: esriFieldTypeOID, alias: OBJECTID, editable: false, nullable: false, defaultValue: null, modelName: OBJECTID -) INCIDENT_NUMBER ( -type: esriFieldTypeString, alias: INCIDENT_NUMBER, editable: true, nullable: true, length: 20, defaultValue: null, modelName: INCIDENT_NUMBER -) ALL_CALL_TYPES ( -type: esriFieldTypeString, alias: ALL_CALL_TYPES, editable: true, nullable: true, length: 200, defaultValue: null, modelName: ALL_CALL_TYPES -) PRIMARY_CODE ( -type: esriFieldTypeString, alias: PRIMARY_CODE, editable: true, nullable: true, length: 50, defaultValue: null, modelName: PRIMARY_CODE -) PRIMARY_DESCRIPTION ( -type: esriFieldTypeString, alias: PRIMARY_DESCRIPTION, editable: true, nullable: true, length: 50, defaultValue: null, modelName: PRIMARY_DESCRIPTION -) DATE ( -type: esriFieldTypeDate, alias: DATE, editable: true, nullable: true, length: 8, defaultValue: null, modelName: DATE -) TIME ( -type: esriFieldTypeString, alias: TIME, editable: true, nullable: true, length: 5, defaultValue: null, modelName: TIME -) RESPONDING_AGENCIES ( -type: esriFieldTypeString, alias: RESPONDING_AGENCIES, editable: true, nullable: true, length: 40, defaultValue: null, modelName: RESPONDING_AGENCIES -) RESULT ( -type: esriFieldTypeString, alias: RESULT, editable: true, nullable: true, length: 35, defaultValue: null, modelName: RESULT -) CASE_NUMBER ( -type: esriFieldTypeString, alias: CASE_NUMBER, editable: true, nullable: true, length: 20, defaultValue: null, modelName: CASE_NUMBER -) Templates: Name: BPD Calls For Service - Public Description: Prototype: RESULT: null INCIDENT_NUMBER: null ALL_CALL_TYPES: null PRIMARY_CODE: null PRIMARY_DESCRIPTION: null DATE: null TIME: null RESPONDING_AGENCIES: null CASE_NUMBER: null Drawing Tool: esriFeatureEditToolPoint Capabilities: Query,Extract Sync Can Return Changes: false Is Data Versioned: false Supports Rollback On Failure: true Supports ApplyEdits With Global Ids: false Supports Query With Historic Moment: false Supports Coordinates Quantization: true Supported Operations : Query Query Attachments Query Analytic Calculate Validate SQL Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4005,https://data.buffalony.gov/Public-Safety/Uniform-Traffic-Tickets/s37s-kh9q/explore,Citations,Police & Public Interactions,Uniform Traffic Tickets | OpenData Buffalo,"",200,Open Data Portal | OpenData Buffalo,[],"[""Menu""]",[],[],[],[],Skip to Main Content Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Menu Close Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Sign In Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers About Us About Us Mayor's Welcome Open Data Policy About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Close Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers -4006,http://gouda.beloitwi.gov/WebLink/0/edoc/68367/3Use%20of%20Force%202018%20-%20Updated%20-18-18.xls,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -4007,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Incident_2018.csv,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -4008,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Incident_2020.csv,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -4009,data.austintexas.gov/resource/sykw-k45z.json,Stops,Police & Public Interactions,2017-2019_Non-Motor Vehicle Stops_Warnings | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2017-2019_Non-Motor Vehicle Stops_Warnings"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2017-2019_Non-Motor Vehicle Stops_Warnings"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -4010,data.austintexas.gov/resource/vv43-e55n.json,Use of Force Reports,Police & Public Interactions,R2R 2014 | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""R2R 2014"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""R2R 2014"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -4011,http://gouda.beloitwi.gov/WebLink/Browse.aspx?startid=67660&dbid=0,List of Data Sources,Info About Agencies,Error,"",200,IIS Windows Server,[],[],[],[],[],[],Cookies are not enabled for this website. Cookies must be enabled in order to sign in to WebLink 9. Back to Welcome Page Cookies are not enabled for this website. Cookies must be enabled in order to sign in to WebLink 9. Back to Welcome Page Cookies are not enabled for this website. Cookies must be enabled in order to sign in to WebLink 9. Back to Welcome Page -4012,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Incident_2019.csv,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -4013,https://maps.burlingtonvt.gov/arcgis/rest/services/Hosted/traffic_stops/FeatureServer/0,Stops,Police & Public Interactions,"","",404,"","","","","","","","" -4014,https://data.bloomington.in.gov/dataset/c25e7854-dcb5-40d4-b94c-e6e518c2ddfa/resource/322f9b81-0462-482d-a4c5-e1053f57a70f/download/2017-first-quarter-bpd-employee-demographics.csv,Personnel Records,Info About Officers,"","",404,"","","","","","","","" -4015,https://bloomington.data.socrata.com/Police/Vehicle-Pursuits/n6ty-q23h,Vehicle Pursuits,Police & Public Interactions,Vehicle Pursuits | City of Bloomington Open Data,"",200,City of Bloomington Open Data,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Vehicle Pursuits"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Vehicle Pursuits"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content City of Bloomington Open Data Sign In Home Browse Menu Menu Close Home Browse Sign In Search City of Bloomington Open Data Sign In Home Browse Menu City of Bloomington Open Data Sign In Home Browse Menu Sign In Sign In Home Browse Menu Close Home Browse Sign In Search Home Browse Sign In Search Home Browse Sign In Search Search -4016,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Incident_2016.csv,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -4017,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Civilian-Officer_2016.csv,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -4018,bloomington.data.socrata.com/resource/t5xf-ggw6.json,Calls for Service,Police & Public Interactions,Calls for Service | City of Bloomington Open Data,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Calls for Service"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Calls for Service"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content City of Bloomington Open Data Sign In Home Browse Menu Menu Close Home Browse Sign In Search City of Bloomington Open Data Sign In Home Browse Menu City of Bloomington Open Data Sign In Home Browse Menu Sign In Sign In Home Browse Menu Close Home Browse Sign In Search Home Browse Sign In Search Home Browse Sign In Search Search -4019,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Incident_2017.csv,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -4020,https://data.buffalony.gov/Public-Safety/Uniform-Roadside-Appearance-Tickets/5kqt-m62h,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -4021,https://data.baltimorecity.gov/search?q=public%20safety,List of Data Sources,Info About Agencies,Open Baltimore,Baltimore City's Open Data Hub,200,Open Baltimore,[],[],[],[],[],[],"" -4022,data.austintexas.gov/resource/sc8s-w4ka.json,Use of Force Reports,Police & Public Interactions,R2 R 2009 | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""R2 R 2009"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""R2 R 2009"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -4023,data.austintexas.gov/resource/9uzk-fyxx.json,Citations,Police & Public Interactions,2017-2019_Non-Motor Vehicle Stops_Citations | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2017-2019_Non-Motor Vehicle Stops_Citations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2017-2019_Non-Motor Vehicle Stops_Citations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -4024,https://data.bloomington.in.gov/group/public-safety,List of Data Sources,Info About Agencies,"","",404,"","","","","","","","" -4025,data.austintexas.gov/resource/q5ym-htjz.json,Use of Force Reports,Police & Public Interactions,R2R 2010 | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""R2R 2010"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""R2R 2010"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -4026,https://public-bozeman.opendata.arcgis.com/search?q=police,List of Data Sources,Info About Agencies,Bozeman Open Data,"City of Bozeman, Montana",200,Bozeman Open Data,[],[],[],[],[],[],"" -4027,https://data.cityofberkeley.info/Public-Safety/Berkeley-PD-Stop-Data-October-1-2020-Present-/ysvs-bcge,Stops,Police & Public Interactions,Error 403,"",200,"Error retrieving title: HTTPSConnectionPool(host='data.cityofberkeley.info', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",[],"[""block""]","[""Error 403"", ""What happened?"", ""What can I do?""]",[],[],[],Error 403 Web Page Blocked Error 403 Web Page Blocked block URL: data.cityofberkeley.info/Public-Safety/Berkeley-PD-Stop-Data-October-1-2020-Present-/ysvs-bcge Client IP: 209.6.137.20 Attack ID: 20000213 Message ID: 003480209292 What happened? The page cannot be displayed. What can I do? Please contact the administrator for additional information. URL: data.cityofberkeley.info/Public-Safety/Berkeley-PD-Stop-Data-October-1-2020-Present-/ysvs-bcge Client IP: 209.6.137.20 Attack ID: 20000213 Message ID: 003480209292 What happened? The page cannot be displayed. What can I do? Please contact the administrator for additional information. -4028,https://maps.burlingtonvt.gov/arcgis/rest/services/Hosted/arrests_(1)/FeatureServer/0,Arrest Records,Police & Public Interactions,"","",404,"","","","","","","","" -4029,data.austintexas.gov/resource/qpbg-wcus.json,Arrest Records,Police & Public Interactions,2017-2019_Non-Motor Vehicle Stops_Arrests | Open Data | City of Austin Texas,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""2017-2019_Non-Motor Vehicle Stops_Arrests"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""2017-2019_Non-Motor Vehicle Stops_Arrests"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Publishing Information"", ""Ownership"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Menu Sign In Sign In Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Menu Close Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Sign In Search Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard User Resources Quick-Start Video Guides How-To Videos Site Navigation & Data Access Support Articles Developer Toolkit GIS Maps & Resources Contact Us Data Data Catalog GIS Data in Catalog GIS Data on ArcGIS Online About Open Data Program Overview Asset Inventory Dashboard Web Analytics Dashboard -4030,https://data.buffalony.gov/Public-Safety/Traffic-Stop-Receipts/8mqs-6g9h,Stops,Police & Public Interactions,Traffic Stop Receipts | OpenData Buffalo,"",200,Open Data Portal | OpenData Buffalo,"[""2021 Traffic Stop Receipts"", ""CitiStat Buffalo: Police Stops"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Traffic Stop Receipts"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Traffic Stop Receipts"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Buffalo Reform Agenda …"", ""Traffic Stop Receipt Form …"", ""CitiStat Buffalo: Police Stops …"", ""Dataset Information"", ""Disclaimers"", ""Notes"", ""Attachments"", ""Topics"", ""Licensing and Attribution"", ""Buffalo Reform Agenda …"", ""Traffic Stop Receipt Form …"", ""CitiStat Buffalo: Police Stops …""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Menu Close Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Sign In Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers About Us About Us Mayor's Welcome Open Data Policy About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Close Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers -4031,http://gouda.beloitwi.gov/WebLink/0/edoc/71724/2Use%20of%20Force%202019%20-%20Updated%201-30-2020.xls,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -4032,https://www.como.gov/wp-content/uploads/2020/10/CPD_vehicle_stop_data_2016.csv,Stops,Police & Public Interactions,"","",200,"","","","","","","","" -4033,data.cincinnati-oh.gov/resource/8us8-wi2w.json,Use of Force Reports,Police & Public Interactions,PDI (Police Data Initiative) Use of Force | Tyler Data & Insights,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""PDI (Police Data Initiative) Use of Force"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""PDI (Police Data Initiative) Use of Force"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Use of Force …"", ""Attachments"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right."", ""Use of Force …""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Search Search Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Open Data How-To How-To Packet Video Guides Sign In Sign In Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Sign In Search Search -4034,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/UseofForce_Civilian-Officer_2021f.csv,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -4035,https://www.charleston-sc.gov/DocumentCenter/View/31097/2021_ECitations_Final_XLS,Citations,Police & Public Interactions,"","",200,"","","","","","","","" -4036,https://services2.arcgis.com/3dDB2Kk6kuA2gIGw/arcgis/rest/services/UseOfForce_Type_OpenData_HOSTED/FeatureServer/0,Use of Force Reports,Police & Public Interactions,Layer: UOF_Type_OpenData (ID:0),"",200,Home,[],"[""Layer: UOF_Type_OpenData (ID:0)""]",[],[],[],[],"JSON Layer: UOF_Type_OpenData (ID:0) Name: UOF_Type_OpenData Display Field: RowNumber Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID Unique ID Field: Name : OBJECTID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID (type: esriFieldTypeOID, alias: OBJECTID, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) RowNumber (type: esriFieldTypeInteger, alias: RowNumber, SQL Type: sqlTypeOther, nullable: true, editable: true) Incident_Type (type: esriFieldTypeString, alias: Incident_Type, SQL Type: sqlTypeOther, length: 28, nullable: true, editable: true) Date_Occurred (type: esriFieldTypeDate, alias: Date_Occurred, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) Date_Received (type: esriFieldTypeDate, alias: Date_Received, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) File_Number (type: esriFieldTypeString, alias: File_Number, SQL Type: sqlTypeOther, length: 16, nullable: true, editable: true) Investigation_Status (type: esriFieldTypeString, alias: Investigation_Status, SQL Type: sqlTypeOther, length: 12, nullable: true, editable: true) Disposition (type: esriFieldTypeString, alias: Disposition, SQL Type: sqlTypeOther, length: 64, nullable: true, editable: true) Citizen_Arrested (type: esriFieldTypeString, alias: Citizen_Arrested, SQL Type: sqlTypeOther, length: 3, nullable: true, editable: true) UseOfForce_Reason (type: esriFieldTypeString, alias: UseOfForce_Reason, SQL Type: sqlTypeOther, length: 63, nullable: true, editable: true) Citizen_Injured (type: esriFieldTypeString, alias: Citizen_Injured, SQL Type: sqlTypeOther, length: 3, nullable: true, editable: true) Officer_Injured (type: esriFieldTypeString, alias: Officer_Injured, SQL Type: sqlTypeOther, length: 3, nullable: true, editable: true) Cit_Infl_Assmt (type: esriFieldTypeString, alias: Cit_Infl_Assmt, SQL Type: sqlTypeOther, length: 36, nullable: true, editable: true) Report_Type (type: esriFieldTypeString, alias: Report_Type, SQL Type: sqlTypeOther, length: 24, nullable: true, editable: true) Sex (type: esriFieldTypeString, alias: Sex, SQL Type: sqlTypeOther, length: 13, nullable: false, editable: true) Race (type: esriFieldTypeString, alias: Race, SQL Type: sqlTypeOther, length: 14, nullable: false, editable: true) Citizen_Age (type: esriFieldTypeString, alias: Citizen_Age, SQL Type: sqlTypeOther, length: 5, nullable: false, editable: true) Year (type: esriFieldTypeInteger, alias: Year, SQL Type: sqlTypeOther, nullable: true, editable: true) Force_Used (type: esriFieldTypeString, alias: Force_Used, SQL Type: sqlTypeOther, length: 50, nullable: true, editable: true) Templates: Name: UOF_Type_OpenData Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Sex : Race : Citizen_Age : Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 3/25/2024 11:41:31 AM Schema Last Edit Date: 3/25/2024 11:41:31 AM Data Last Edit Date: 3/25/2024 11:41:31 AM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4037,www.dallasopendata.com/resource/6gnu-avpf.json,Use of Force Reports,Police & Public Interactions,Police Response to Resistance 2013 | Dallas OpenData,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Police Response to Resistance 2013"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Police Response to Resistance 2013"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Custom Metadata Fields"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Search Search Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Sign In Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search -4038,https://www.charleston-sc.gov/DocumentCenter/View/25732/2019eCitationsSCCATTS_YTD_XLS,Citations,Police & Public Interactions,"","",200,"","","","","","","","" -4039,https://data.cincinnati-oh.gov/safety/PDI-Police-Data-Initiative-Police-Calls-for-Servic/gexm-h6bt,Calls for Service,Police & Public Interactions,PDI (Police Data Initiative) Police Calls for Service (CAD) | Tyler Data & Insights,"",200,Cincinnati Open Data Portal | Tyler Data & Insights,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""PDI (Police Data Initiative) Police Calls for Service (CAD)"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""PDI (Police Data Initiative) Police Calls for Service (CAD)"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Police Calls for Service …"", ""Attachments"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right."", ""Police Calls for Service …""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Search Search Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Open Data How-To How-To Packet Video Guides Sign In Sign In Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Sign In Search Search -4040,www.dallasopendata.com/resource/nufk-2iqn.json,Use of Force Reports,Police & Public Interactions,Police Response to Resistance 2020 | Dallas OpenData,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Police Response to Resistance 2020"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Police Response to Resistance 2020"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Custom Metadata Fields"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Search Search Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Sign In Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search -4041,https://services1.arcgis.com/zdB7qR0BtYrg0Xpl/arcgis/rest/services/ODC_CRIME_STOPS_P/FeatureServer/32,Stops,Police & Public Interactions,Layer: CRIME_STOPS_P (ID:32),"",200,Home,[],"[""Layer: CRIME_STOPS_P (ID:32)""]",[],[],[],[],"JSON Layer: CRIME_STOPS_P (ID:32) View In: Map Viewer Name: CRIME_STOPS_P Display Field: NEIGHBORHOOD_NAME Type: Feature Layer Geometry Type: esriGeometryPoint Description: SD.CRIME_STOPS_P Copyright Text: Min. Scale: 0 Max. Scale: 0 Default Visibility: false Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True Extent: XMin: 3079310.77064231 YMin: 1630240.94567947 XMax: 3257765.64109406 YMax: 1784631.88263188 Spatial Reference: 2877 (2877) Drawing Info: {""renderer"":{""type"":""simple"",""symbol"":{""type"":""esriSMS"",""style"":""esriSMSCircle"",""color"":[44,92,127,255],""size"":4,""angle"":0,""xoffset"":0,""yoffset"":0,""outline"":{""color"":[0,0,0,255],""width"":0.7}}},""scaleSymbols"":true,""transparency"":0,""labelingInfo"":null} HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Object ID Field: OBJECTID Unique ID Field: Name : OBJECTID IsSystemMaintained : True Global ID Field: GLOBALID Type ID Field: Fields: OBJECTID (type: esriFieldTypeOID, alias: OBJECTID, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) MASTER_INCIDENT_NUMBER (type: esriFieldTypeString, alias: MASTER_INCIDENT_NUMBER, SQL Type: sqlTypeOther, length: 20, nullable: true, editable: true) PRIORITY_DESCRIPTION (type: esriFieldTypeString, alias: PRIORITY_DESCRIPTION, SQL Type: sqlTypeOther, length: 30, nullable: true, editable: true) PROBLEM (type: esriFieldTypeString, alias: PROBLEM, SQL Type: sqlTypeOther, length: 30, nullable: true, editable: true) ADDRESS (type: esriFieldTypeString, alias: ADDRESS, SQL Type: sqlTypeOther, length: 80, nullable: true, editable: true) CALL_CLASS (type: esriFieldTypeString, alias: CALL_CLASS, SQL Type: sqlTypeOther, length: 1, nullable: true, editable: true) TIME_PHONEPICKUP (type: esriFieldTypeDate, alias: TIME_PHONEPICKUP, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) CALL_DISPOSITION (type: esriFieldTypeString, alias: CALL_DISPOSITION, SQL Type: sqlTypeOther, length: 30, nullable: true, editable: true) GEO_X (type: esriFieldTypeDouble, alias: GEO_X, SQL Type: sqlTypeOther, nullable: true, editable: true) GEO_Y (type: esriFieldTypeDouble, alias: GEO_Y, SQL Type: sqlTypeOther, nullable: true, editable: true) GEO_LON (type: esriFieldTypeDouble, alias: GEO_LON, SQL Type: sqlTypeOther, nullable: true, editable: true) GEO_LAT (type: esriFieldTypeDouble, alias: GEO_LAT, SQL Type: sqlTypeOther, nullable: true, editable: true) DISTRICT_ID (type: esriFieldTypeString, alias: DISTRICT_ID, SQL Type: sqlTypeOther, length: 5, nullable: true, editable: true) PRECINCT_ID (type: esriFieldTypeString, alias: PRECINCT_ID, SQL Type: sqlTypeOther, length: 5, nullable: true, editable: true) NEIGHBORHOOD_NAME (type: esriFieldTypeString, alias: NEIGHBORHOOD_NAME, SQL Type: sqlTypeOther, length: 30, nullable: true, editable: true) GLOBALID (type: esriFieldTypeGlobalID, alias: GLOBALID, SQL Type: sqlTypeOther, length: 38, nullable: false, editable: false) Templates: Name: CRIME_STOPS_P Description: Drawing Tool: esriFeatureEditToolPoint Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 3/25/2024 12:31:25 AM Schema Last Edit Date: 3/25/2024 12:31:25 AM Data Last Edit Date: 3/25/2024 12:31:18 AM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates View In: Map Viewer " -4042,https://www.como.gov/wp-content/uploads/2020/10/CPD-vehicle-stop-data-2015.csv,Stops,Police & Public Interactions,"","",200,"","","","","","","","" -4043,data.cincinnati-oh.gov/resource/ktgf-4sjh.json,Stops,Police & Public Interactions,PDI (Police Data Initiative) Traffic Stops (All Subjects) | Tyler Data & Insights,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""PDI (Police Data Initiative) Traffic Stops (All Subjects)"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""PDI (Police Data Initiative) Traffic Stops (All Subjects)"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Traffic Stops …"", ""Attachments"", ""Topics"", ""Licensing and Attribution"", ""Traffic Stops …""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Search Search Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Open Data How-To How-To Packet Video Guides Sign In Sign In Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Sign In Search Search -4044,data.cincinnati-oh.gov/resource/svan-pass.json,Stops,Police & Public Interactions,CPD Contact Cards | Tyler Data & Insights,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""CPD Contact Cards"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""CPD Contact Cards"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Search Search Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Open Data How-To How-To Packet Video Guides Sign In Sign In Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Sign In Search Search -4045,https://www.como.gov/wp-content/uploads/2020/10/CPD_vehicle_stop_data_2019.csv,Stops,Police & Public Interactions,"","",200,"","","","","","","","" -4046,https://gis.charlottenc.gov/arcgis/rest/services/CMPD/CMPD/MapServer/12,Officer Involved Shootings,Police & Public Interactions,Layer: CMPD Officer-Involved Shootings- Individuals (ID: 12),"",200,gis.charlottenc.gov - /,[],"[""Layer: CMPD Officer-Involved Shootings- Individuals (ID: 12)""]",[],[],[],[],"Name: CMPD Officer-Involved Shootings- Individuals Display Field: INCIDENT_ID Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Default Visibility: true MaxRecordCount: 2000 Supported Query Formats: JSON, geoJSON, PBF Min Scale: 0 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Has Labels: false Can Modify Layer: true Can Scale Symbols: false Use Standardized Queries: true Supports Datum Transformation: true Extent: XMin: -9014600.352522286 YMin: 4167420.527314591 XMax: -8977658.56940153 YMax: 4212347.787812614 Spatial Reference: 102100 - (3857) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [0, 255, 0, 255] Size: 7.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 0 Label: N/A Description: N/A Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false Supports Binning LOD: false Supports Query With LOD Spatial Reference: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: null Fields: ObjectID ( -type: esriFieldTypeOID, alias: ObjectID -) INCIDENT_ID ( -type: esriFieldTypeDouble, alias: INCIDENT_ID -) INDIVIDUAL_RACE ( -type: esriFieldTypeString, alias: INDIVIDUAL_RACE, length: 30 -) INDIVIDUAL_GENDER ( -type: esriFieldTypeString, alias: INDIVIDUAL_GENDER, length: 10 -) INDIVIDUAL_AGE ( -type: esriFieldTypeDouble, alias: INDIVIDUAL_AGE -) INDIVIDUAL_INJURY_TYPE ( -type: esriFieldTypeString, alias: INDIVIDUAL_INJURY_TYPE, length: 20 -) YR ( -type: esriFieldTypeInteger, alias: YR -) Latitude ( -type: esriFieldTypeDouble, alias: Latitude -) Longitude ( -type: esriFieldTypeDouble, alias: Longitude -) Shape ( -type: esriFieldTypeGeometry, alias: Shape -) Supported Operations : Query Query Attachments Query Analytic Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4047,https://data.cityofchicago.org/Public-Safety/Arrests/dpt3-jri9,Arrest Records,Police & Public Interactions,Arrests | City of Chicago | Data Portal,"",200,City of Chicago | Data Portal | City of Chicago | Data Portal,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Arrests"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Arrests"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Crimes - 2001 to Present …"", ""Metadata"", ""Topics"", ""Licensing and Attribution"", ""Crimes - 2001 to Present …""]",[],[],"[""OData Endpoint""]",Skip to Main Content Chicago Data Portal Sign In Browse Tutorial Feedback Menu Menu Close Browse Tutorial Feedback Sign In Search Chicago Data Portal Sign In Browse Tutorial Feedback Menu Chicago Data Portal Sign In Browse Tutorial Feedback Menu Sign In Sign In Browse Tutorial Feedback Menu Close Browse Tutorial Feedback Sign In Search Browse Tutorial Feedback Sign In Search Browse Tutorial Feedback Sign In Search Search -4048,data.cincinnati-oh.gov/resource/r6q4-muts.json,Officer Involved Shootings,Police & Public Interactions,PDI (Police Data Initiative) Officer Involved Shootings | Tyler Data & Insights,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""PDI (Police Data Initiative) Officer Involved Shootings"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""PDI (Police Data Initiative) Officer Involved Shootings"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Police Firearm Discharge …"", ""Attachments"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right."", ""Police Firearm Discharge …""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Search Search Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Open Data How-To How-To Packet Video Guides Sign In Sign In Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Sign In Search Search -4049,https://opendata-townofchapelhill.hub.arcgis.com/search?tags=community%20safety%2Cjustice,List of Data Sources,Info About Agencies,Chapel Hill Open Data,"Discover, analyze and download data from Chapel Hill Open Data. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -4050,https://www.como.gov/wp-content/uploads/2021/06/CPD_vehicle_stop_data_2020-6.csv,Stops,Police & Public Interactions,"","",200,"","","","","","","","" -4051,www.dallasopendata.com/resource/594v-2cnd.json,Use of Force Reports,Police & Public Interactions,Police Response to Resistance 2015 | Dallas OpenData,"",200,Error retrieving title: No connection adapters were found for '://',"[""Response to Resistance - 2015"", ""2015 Citizen Injured"", ""2015 Officer Injured"", ""chart1"", ""2015 Citizen Injured"", ""Police: 2015 Response to Resistance - Officer Race"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Police Response to Resistance 2015"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Police Response to Resistance 2015"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Custom Metadata Fields"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Search Search Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Sign In Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search -4052,https://www.como.gov/police/data-reporting-forms/,Stops,Police & Public Interactions,"","",403,"","","","","","","","" -4053,https://www.charleston-sc.gov/DocumentCenter/View/29790/2020_Ecitations_XLS,Citations,Police & Public Interactions,"","",200,"","","","","","","","" -4054,www.dallasopendata.com/resource/tsu5-ca6k.json,Use of Force Reports,Police & Public Interactions,Police Response to Resistance 2017 | Dallas OpenData,"",200,Error retrieving title: No connection adapters were found for '://',"[""Police Response to Resistance Heat Map - 2017"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Police Response to Resistance 2017"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Police Response to Resistance 2017"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Police Response to Resistance Heat Map - 2017 …"", ""Custom Metadata Fields"", ""Topics"", ""Police Response to Resistance Heat Map - 2017 …""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Search Search Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Sign In Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search -4055,data.ct.gov//resource/nahi-zqrt.json,Stops,Police & Public Interactions,Traffic Stops - Racial Profiling Prohibition Project | Connecticut Data,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Traffic Stops - Racial Profiling Prohibition Project"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Traffic Stops - Racial Profiling Prohibition Project"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Connecticut Racial Profiling Prohibition Project Data Port… …"", ""Agency"", ""Details"", ""Attachments"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right."", ""Connecticut Racial Profiling Prohibition Project Data Portal. …""]",[],[],"[""OData Endpoint""]",Skip to Main Content CT Open Data Portal Sign In Developers Suggest a Dataset Help About Menu Menu Close Developers Suggest a Dataset Help About Sign In Search CT Open Data Portal Sign In Developers Suggest a Dataset Help About Menu CT Open Data Portal Sign In Developers Suggest a Dataset Help About Menu Sign In Sign In Developers Suggest a Dataset Help About Menu Close Developers Suggest a Dataset Help About Sign In Search Developers Suggest a Dataset Help About Sign In Search Developers Suggest a Dataset Help About Sign In Search Search -4056,https://services2.arcgis.com/3dDB2Kk6kuA2gIGw/arcgis/rest/services/OfficerInvolvedShooting_OpenData_HOSTED/FeatureServer/0,Officer Involved Shootings,Police & Public Interactions,Layer: OfficerInvolvedShooting_OpenData (ID:0),"",200,Home,[],"[""Layer: OfficerInvolvedShooting_OpenData (ID:0)""]",[],[],[],[],"JSON Layer: OfficerInvolvedShooting_OpenData (ID:0) Name: OfficerInvolvedShooting_OpenData Display Field: RowNumber Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID Unique ID Field: Name : OBJECTID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID (type: esriFieldTypeOID, alias: OBJECTID, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) RowNumber (type: esriFieldTypeInteger, alias: RowNumber, SQL Type: sqlTypeOther, nullable: true, editable: true) Incident_Type (type: esriFieldTypeString, alias: Incident_Type, SQL Type: sqlTypeOther, length: 28, nullable: true, editable: true) Occurred_Date (type: esriFieldTypeString, alias: Occurred_Date, SQL Type: sqlTypeOther, length: 10, nullable: true, editable: true) Recieved_Date (type: esriFieldTypeString, alias: Recieved_Date, SQL Type: sqlTypeOther, length: 10, nullable: true, editable: true) File_Number (type: esriFieldTypeString, alias: File_Number, SQL Type: sqlTypeOther, length: 16, nullable: true, editable: true) Status (type: esriFieldTypeString, alias: Status, SQL Type: sqlTypeOther, length: 12, nullable: true, editable: true) Disposition (type: esriFieldTypeString, alias: Disposition, SQL Type: sqlTypeOther, length: 64, nullable: true, editable: true) Sex (type: esriFieldTypeString, alias: Sex, SQL Type: sqlTypeOther, length: 63, nullable: true, editable: true) Race (type: esriFieldTypeString, alias: Race, SQL Type: sqlTypeOther, length: 63, nullable: true, editable: true) Citizen_Age (type: esriFieldTypeString, alias: Citizen_Age, SQL Type: sqlTypeOther, length: 5, nullable: false, editable: true) Zip (type: esriFieldTypeString, alias: Zip, SQL Type: sqlTypeOther, length: 10, nullable: true, editable: true) Year (type: esriFieldTypeInteger, alias: Year, SQL Type: sqlTypeOther, nullable: true, editable: true) Templates: Name: OfficerInvolvedShooting_OpenData Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Citizen_Age : Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 3/25/2024 11:40:53 AM Schema Last Edit Date: 3/25/2024 11:40:53 AM Data Last Edit Date: 3/25/2024 11:40:53 AM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4057,https://www.dallasopendata.com/browse?category=Public+Safety,List of Data Sources,Info About Agencies,Search & Browse Public Safety | Page 1 of 9 | Dallas OpenData,"",200,Dallas OpenData | Dallas OpenData,"[""Public Safety"", ""Categories"", ""Tags""]","[""Menu"", ""Categories > Public Safety"", ""Sort"", ""Sort by Most Relevant"", ""Filter"", ""Authority"", ""Categories"", ""View Types"", ""Tags"", ""Featured Content"", ""Dallas Police Active Calls"", ""Active Calls for Northeast Division / Dallas Police Department COMMUNITY CREATED"", ""Active Calls in DPD Northeast Division COMMUNITY CREATED"", ""Active Calls for Southwest Division / Dallas Police Department COMMUNITY CREATED"", ""Active Calls for Southeast Division / Dallas Police Department COMMUNITY CREATED"", ""dxfg COMMUNITY CREATED"", ""Active Calls in DPD North Central Division COMMUNITY CREATED"", ""Active Calls for Central Division / Dallas Police Department COMMUNITY CREATED"", ""Active Calls in DPD Southwest Division COMMUNITY CREATED"", ""Police Arrests"", ""traffic COMMUNITY CREATED"", ""Police Incidents"", ""Active Calls for North Central Division / Dallas Police Department COMMUNITY CREATED"", ""OIS - Incidents Per Year Chart"", ""Active Calls for Northwest Division / Dallas Police Department COMMUNITY CREATED"", ""Active Calls in DPD Northwest Division COMMUNITY CREATED"", ""riDa437 View COMMUNITY CREATED"", ""Dallas Police Officer-Involved Shootings"", ""Dallas Police Active Calls COMMUNITY CREATED"", ""Active Calls in DPD Southeast Division COMMUNITY CREATED"", ""Police Unknown Suspects"", ""OIS - Type of OIS Chart"", ""DPD NORTHEAST ACTIVE CALLS COMMUNITY CREATED"", ""Dallas Police Active Calls: Accidents COMMUNITY CREATED"", ""Dallas Police Public Data - Officer Involved Shootings City Of Dallas Map"", ""OIS - Most Common Subject Weapon Type"", ""Dallas Police Incidents by Division"", ""Arrests 2020 COMMUNITY CREATED"", ""My View - SC and SW COMMUNITY CREATED"", ""North Central COMMUNITY CREATED"", ""Active Calls for South Central Division / Dallas Police Department COMMUNITY CREATED"", ""2020 homicides COMMUNITY CREATED"", ""Dallas PD Active Calls Central COMMUNITY CREATED"", ""Active Calls in DPD South Central Division COMMUNITY CREATED"", ""Citizens Injured: Response to Resistance - 2016"", ""Police Person"", ""Public Safety - Police Incidents"", ""ME R COMMUNITY CREATED"", ""Dallas Police Department - Channel 2 - Active Calls for Service COMMUNITY CREATED"", ""Dallas Police Active Calls — Southwest COMMUNITY CREATED"", ""Police Arrest Charges"", ""Most Police Incidents Recorded"", ""Officers Injured: Response to Resistance - 2016"", ""NW Only COMMUNITY CREATED"", ""Police Response to Resistance Map - 2016"", ""male unknown suspects COMMUNITY CREATED"", ""Police Active Calls By Division"", ""Where COMMUNITY CREATED"", ""a COMMUNITY CREATED"", ""Northeast by Beat COMMUNITY CREATED"", ""A-Z"", ""A-Z""]","[""Dallas Police Active Calls …"", ""City of Dallas Fire Station Locations …"", ""Dog Bite Data …""]",[],[],[],Skip to Main Content Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Search Search Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Sign In Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search -4058,www.dallasopendata.com/resource/33un-ry4j.json,Use of Force Reports,Police & Public Interactions,Police Response to Resistance 2018 | Dallas OpenData,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Police Response to Resistance 2018"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Police Response to Resistance 2018"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Custom Metadata Fields"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Search Search Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Sign In Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search -4059,https://gis.charlottenc.gov/arcgis/rest/services/CMPD/CMPD/MapServer/11,Officer Involved Shootings,Police & Public Interactions,Layer: CMPD Officer-Involved Shootings- Incidents (ID: 11),"",200,Error retrieving title: dictionary changed size during iteration,[],"[""Layer: CMPD Officer-Involved Shootings- Incidents (ID: 11)""]",[],[],[],[],"Name: CMPD Officer-Involved Shootings- Incidents Display Field: YEAR_MONTH Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Default Visibility: true MaxRecordCount: 2000 Supported Query Formats: JSON, geoJSON, PBF Min Scale: 0 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Has Labels: false Can Modify Layer: true Can Scale Symbols: false Use Standardized Queries: true Supports Datum Transformation: true Extent: XMin: -9014600.352522286 YMin: 4167420.527314591 XMax: -8977658.56940153 YMax: 4212347.787812614 Spatial Reference: 102100 - (3857) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [0, 77, 168, 255] Size: 7.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 0 Label: N/A Description: N/A Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false Supports Binning LOD: false Supports Query With LOD Spatial Reference: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: null Fields: ObjectID ( -type: esriFieldTypeOID, alias: ObjectID -) YEAR_MONTH ( -type: esriFieldTypeString, alias: YEAR_MONTH, length: 7 -) LOCATION ( -type: esriFieldTypeString, alias: LOCATION, length: 100 -) DA_LEGAL_REVIEW ( -type: esriFieldTypeString, alias: DA_LEGAL_REVIEW, length: 60 -) NARRATIVE ( -type: esriFieldTypeString, alias: NARRATIVE, length: 2000 -) YR ( -type: esriFieldTypeInteger, alias: YR -) MN ( -type: esriFieldTypeInteger, alias: MN -) Latitude ( -type: esriFieldTypeDouble, alias: Latitude -) Longitude ( -type: esriFieldTypeDouble, alias: Longitude -) Shape ( -type: esriFieldTypeGeometry, alias: Shape -) Supported Operations : Query Query Attachments Query Analytic Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4060,https://gis.charlottenc.gov/arcgis/rest/services/CMPD/CMPD/MapServer/14,Stops,Police & Public Interactions,Layer: Officer Traffic Stops (ID: 14),"",200,gis.charlottenc.gov - /,[],"[""Layer: Officer Traffic Stops (ID: 14)""]",[],[],[],[],"Name: Officer Traffic Stops Display Field: Month_of_Stop Type: Table Geometry Type: N/A Description: CMPD conducts an average of 120,000 traffic stops per year. Under North Carolina state law (G.S. 143B-902-903), the CMPD as well as other law enforcement agencies in the state are required to collect information on all traffic stops, the reason for the stop, and the type of enforcement action taken. Information on the driver’s sex, race, ethnicity, and age is collected, compiled, and reported to the NC Department of Justice. Information on whether the driver or passenger(s) were searched is also collected. For more information, please visit http://charlottenc.gov/CMPD/Pages/Resources/OpenData_Source.aspx CMPD is committed to deploying traffic officers to areas where we experience high crime and victimization. Our focus is also in the geographical areas where concerns are reported by community members. We as a police department have a responsibility to those communities, to address their concerns and take appropriate enforcement action in an effort to keep their neighborhoods safe. Additionally, we are not only reacting to crime but proactively engaging in strategies that are intended to prevent criminal activity from occurring by placing officers in areas with a greater statistical history of crime. Copyright Text: N/A Default Visibility: false MaxRecordCount: 2000 Supported Query Formats: JSON, PBF Supports Advanced Queries: true Supports Statistics: true Use Standardized Queries: true Extent: Drawing Info: N/A Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: false Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false Supports Binning LOD: false Supports Query With LOD Spatial Reference: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeNone Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID, alias: ObjectID -) Month_of_Stop ( -type: esriFieldTypeString, alias: Month_of_Stop, length: 7 -) Reason_for_Stop ( -type: esriFieldTypeString, alias: Reason_for_Stop, length: 25 -) Officer_Race ( -type: esriFieldTypeString, alias: Officer_Race, length: 30 -) Officer_Gender ( -type: esriFieldTypeString, alias: Officer_Gender, length: 10 -) Officer_Years_of_Service ( -type: esriFieldTypeDouble, alias: Officer_Years_of_Service -) Driver_Race ( -type: esriFieldTypeString, alias: Driver_Race, length: 20 -) Driver_Ethnicity ( -type: esriFieldTypeString, alias: Driver_Ethnicity, length: 12 -) Driver_Gender ( -type: esriFieldTypeString, alias: Driver_Gender, length: 8 -) Driver_Age ( -type: esriFieldTypeInteger, alias: Driver_Age -) Was_a_Search_Conducted ( -type: esriFieldTypeString, alias: Was_a_Search_Conducted, length: 3 -) Result_of_Stop ( -type: esriFieldTypeString, alias: Result_of_Stop, length: 20 -) CMPD_Division ( -type: esriFieldTypeString, alias: CMPD_Division, length: 50 -) GlobalID ( -type: esriFieldTypeGlobalID, alias: GlobalID, length: 38 -) Supported Operations : Query Query Attachments Query Analytic Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4061,https://www.como.gov/wp-content/uploads/2020/10/CPD-vehicle-stop-data-2014.csv,Stops,Police & Public Interactions,"","",200,"","","","","","","","" -4062,https://internal.chattadata.org/Public-Safety/Public-CPD-Arrest-Charges/v9y9-uavb,Arrest Records,Police & Public Interactions,Public CPD Arrest Charges | ChattaData,"",200,ChattaData,"[""Top 25 Arrest Charges by Race"", ""Top Serving Warrant Charges by Race and Sex"", ""Top 25 Charges"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Public CPD Arrest Charges"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Public CPD Arrest Charges"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Internal"", ""Public"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home About Catalog Video Tutorials Suggest a Dataset Terms of Use Sign In Menu Menu Close Home About Catalog Video Tutorials Suggest a Dataset Terms of Use Sign In Search Search Home About Catalog Video Tutorials Suggest a Dataset Terms of Use Sign In Menu Search Search Search Search Home About Catalog Video Tutorials Suggest a Dataset Terms of Use Sign In Menu Home About Catalog Video Tutorials Suggest a Dataset Terms of Use Sign In Menu Home About Catalog Video Tutorials Suggest a Dataset Terms of Use Home About Catalog Video Tutorials Suggest a Dataset Terms of Use Sign In Sign In Menu Close Home About Catalog Video Tutorials Suggest a Dataset Terms of Use Sign In Search Home About Catalog Video Tutorials Suggest a Dataset Terms of Use Sign In Search Home About Catalog Video Tutorials Suggest a Dataset Terms of Use Sign In Search Search -4063,www.dallasopendata.com/resource/46zb-7qgj.json,Use of Force Reports,Police & Public Interactions,Police Response to Resistance 2019 | Dallas OpenData,"",200,Error retrieving title: No connection adapters were found for '://',"[""Citizens Injured: Response to Resistance - 2019"", ""Police Response to Resistance Map - 2019"", ""Officers Injured: Response to Resistance - 2019"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Police Response to Resistance 2019"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Police Response to Resistance 2019"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Custom Metadata Fields"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Search Search Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Sign In Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search -4064,https://services2.arcgis.com/7KRXAKALbBGlCW77/arcgis/rest/services/Police_Employee_Demographics/FeatureServer/0,Personnel Records,Info About Officers,Layer: Police Employee Demographics (ID:0),"",200,Home,[],"[""Layer: Police Employee Demographics (ID:0)""]",[],[],[],[],"JSON Layer: Police Employee Demographics (ID:0) Name: Police Employee Demographics Display Field: ID No. Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID Unique ID Field: Name : OBJECTID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID (type: esriFieldTypeOID, alias: OBJECTID, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) ID_No_ (type: esriFieldTypeInteger, alias: ID No., SQL Type: sqlTypeOther, nullable: true, editable: true) Job_Class_Description (type: esriFieldTypeString, alias: Job Class Description, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Status (type: esriFieldTypeString, alias: Status, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Age (type: esriFieldTypeInteger, alias: Age, SQL Type: sqlTypeOther, nullable: true, editable: true) Service_Years (type: esriFieldTypeInteger, alias: Service Years, SQL Type: sqlTypeOther, nullable: true, editable: true) Gender (type: esriFieldTypeString, alias: Gender, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Race (type: esriFieldTypeString, alias: Race, SQL Type: sqlTypeOther, length: 8000, nullable: true, editable: true) Templates: Name: Police Employee Demographics Description: Drawing Tool: esriFeatureEditToolNone Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 6/30/2020 10:12:13 PM Schema Last Edit Date: 6/30/2020 10:12:13 PM Data Last Edit Date: 6/30/2020 10:12:13 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4065,https://data.cincinnati-oh.gov/browse?category=Safety&tags=police,List of Data Sources,Info About Agencies,Results matching category of Safety and topic of police | Page 1 of 2 | Tyler Data & Insights,"",200,Cincinnati Open Data Portal | Tyler Data & Insights,"[""Categories"", ""Tags""]","[""Menu"", ""Categories > Safety"", ""Tags > police"", ""Sort"", ""Sort by Most Relevant"", ""Filter"", ""Categories"", ""View Types"", ""Tags"", ""Traffic Crash Reports (CPD)"", ""PDI (Police Data Initiative) Police Calls for Service (CAD)"", ""Cincinnati Police Districts"", ""PDI (Police Data Initiative) Use of Force"", ""Citizen Complaint Authority (CCA) Closed Complaints"", ""Drug & Heroin: 24 Hour Daily Report"", ""PDI (Police Data Initiative) Officer Involved Shootings"", ""PDI (Police Data Initiative) Assaults on Officers"", ""PDI (Police Data Initiative) Traffic Stops (All Subjects)"", ""CPD & CFD Calls For Service"", ""A-Z"", ""A-Z""]",[],[],[],[],Skip to main content Skip to footer links -4066,https://dayton-transparency-portal-1-daytonohio.hub.arcgis.com/,List of Data Sources,Info About Agencies,Dayton Transparency Portal,"The Dayton Transparency Portal is designed to provide a “one-stop” web page to access public information related to the Dayton Police Department’s data, policies, and resources.",200,Dayton Transparency Portal,[],[],[],[],[],[],"" -4067,https://www.como.gov/wp-content/uploads/2022/03/CPD_vehicle_stop_data_2021.csv,Stops,Police & Public Interactions,"","",200,"","","","","","","","" -4068,corstat.coronaca.gov/resource/86hv-vkp4.json,Calls for Service,Police & Public Interactions,CorStat - Police Response Statistics | Corona Open Performance,"",200,Error retrieving title: No connection adapters were found for '://',"[""CorStat - Nature of Calls Received"", ""CorStat - Number of Calls Received by Zone"", ""CorStat - Calls Received by Month"", ""CorStat - Number of Calls Received by Priority"", ""Police Calls for Service Received - Monthly"", ""CorStat - Total Police Calls Received Yearly"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""CorStat - Police Response Statistics"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""CorStat - Police Response Statistics"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In City of Corona Tutorials Menu Menu Close City of Corona Tutorials Sign In Search Sign In City of Corona Tutorials Menu Sign In City of Corona Tutorials Menu Sign In Sign In City of Corona Tutorials Menu Close City of Corona Tutorials Sign In Search City of Corona Tutorials Sign In Search City of Corona Tutorials Sign In Search Search -4069,https://www.charleston-sc.gov/1570/Open-Data,List of Data Sources,Info About Agencies,"Open Data | Charleston, SC - Official Website",The City of Charleston is committed to making data available to the public and providing tools for better understanding of the data.,200,"Charleston, SC - Official Website | Official Website","[""Open Data""]","[""What data is available?"", ""Where can I get the data?"", ""How can I get assistance?"", ""CITIZEN SERVICES DESK""]","[""FAQs"", ""Quick Links"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Government Residents Business Visitors Online Services How Do I... Search Home Government Transparency and Disclosure Open Data Open Data On Tuesday, January 26, 2021 Charleston City Council adopted an open data policy to memorialize our commitment to an open and transparent government. What data is available? Since the adoption of the city's Open Data Policy, the city's Open Data Management team has been annually updating a city data inventory .  Not all datasets are published, but the team is actively working to publish all datasets that do not contain sensitive or protected data. Where can I get the data? The city actively maintain two data portals.  One specifically for policing data and a data portal for all the other city departments.  Both portals provide users with the ability to view the data, download the data in a variety of formats, or consume the data via API to be consumed in external applications or dashboards. How can I get assistance? The Innovation Office has posted some help and video tutorials to help users navigate the portals and use open data.  Still can't find what you're looking for?  Send a request or question via the Citizen Services Desk or drop us an email at innovation@charleston-sc.gov . Budget DeReef Park Approved Amendment to Project Agreement (PDF) Dereef Park Survey Report (PDF) EA for Partial Conversion of DeReef Park (PDF) Partial Conversion Approval Letter (PDF) Partial Conversion Approved FONSI (PDF) Partial Conversion Replacement Sites EA (PDF) City Council Videos Annual Comprehensive Financial Reports Open Data Performance Management Accessory Dwelling Units Affordable Housing Inventory Affordable Housing Near Transit Homelessness Region Wide Homelessness Service Providers Spending Transparency Reports Public Notices REc Program Permitting Employment Agenda Center Comment Card Report A Problem Notify Me GIS aPPS CITIZEN SERVICES DESK 843-724-7311 Report a Concern Questions? 80 Broad Street Charleston, South Carolina 29401-0304 FAQs How do I obtain a residential garbage container? What is the holiday garbage and trash pick-up schedule? /FAQ.aspx Quick Links Home FAQs News Calendar Disability Accessibility Grievance Form /QuickLinks.aspx Site Links Translate Page Site Map Copyright Notices Mobile Accessibility Government Websites by CivicPlus® /QuickLinks.aspx " -4070,https://gis.charlottenc.gov/arcgis/rest/services/CMPD/CMPD/MapServer/16,Personnel Records,Info About Officers,Layer: CMPD Employee Demographics (ID: 16),"",200,Error retrieving title: dictionary changed size during iteration,[],"[""Layer: CMPD Employee Demographics (ID: 16)""]",[],[],[],[],"Name: CMPD Employee Demographics Display Field: JOB_TITLE Type: Table Geometry Type: N/A Description: CMPD is the largest metropolitan police department between Atlanta, GA and Washington, DC. The department consists of over 1,850 sworn and 400 non-sworn personnel committed to providing the best services possible to the residents and guests of Charlotte-Mecklenburg. We believe the department should be reflective demographically of the community we serve. We are continually striving to achieve this through recruiting efforts. Copyright Text: N/A Default Visibility: false MaxRecordCount: 2000 Supported Query Formats: JSON, PBF Supports Advanced Queries: true Supports Statistics: true Use Standardized Queries: true Extent: Drawing Info: N/A Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: false Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false Supports Binning LOD: false Supports Query With LOD Spatial Reference: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeNone Type ID Field: null Fields: JOB_TITLE ( -type: esriFieldTypeString, alias: Job Title, length: 30 -) Years_Of_Service ( -type: esriFieldTypeSingle, alias: Years of Service -) Age ( -type: esriFieldTypeInteger, alias: Age -) Gender ( -type: esriFieldTypeString, alias: Gender, length: 10 -) Race ( -type: esriFieldTypeString, alias: Race, length: 30 -) ObjectID ( -type: esriFieldTypeOID, alias: ObjectID -) Supported Operations : Query Query Attachments Query Analytic Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4071,https://services2.arcgis.com/3dDB2Kk6kuA2gIGw/arcgis/rest/services/Arrests_OpenData_HOSTED/FeatureServer/0,Arrest Records,Police & Public Interactions,Layer: PoliceArrests_OPENDATA (ID:0),"",200,Home,[],"[""Layer: PoliceArrests_OPENDATA (ID:0)""]",[],[],[],[],JSON Layer: PoliceArrests_OPENDATA (ID:0) -4072,https://gis.charlottenc.gov/arcgis/rest/services/CMPD/CMPD/MapServer/13,Officer Involved Shootings,Police & Public Interactions,Layer: CMPD Officer-Involved Shootings- Officers (ID: 13),"",200,Error retrieving title: dictionary changed size during iteration,[],"[""Layer: CMPD Officer-Involved Shootings- Officers (ID: 13)""]",[],[],[],[],"Name: CMPD Officer-Involved Shootings- Officers Display Field: INCIDENT_ID Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Default Visibility: true MaxRecordCount: 2000 Supported Query Formats: JSON, geoJSON, PBF Min Scale: 0 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Has Labels: false Can Modify Layer: true Can Scale Symbols: false Use Standardized Queries: true Supports Datum Transformation: true Extent: XMin: -9014600.352522286 YMin: 4167420.527314591 XMax: -8977658.56940153 YMax: 4212347.787812614 Spatial Reference: 102100 - (3857) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [255, 0, 0, 255] Size: 7.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 0 Label: N/A Description: N/A Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false Supports Binning LOD: false Supports Query With LOD Spatial Reference: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: null Fields: ObjectID ( -type: esriFieldTypeOID, alias: ObjectID -) INCIDENT_ID ( -type: esriFieldTypeDouble, alias: INCIDENT_ID -) OFFICER_RACE ( -type: esriFieldTypeString, alias: OFFICER_RACE, length: 30 -) OFFICER_GENDER ( -type: esriFieldTypeString, alias: OFFICER_GENDER, length: 10 -) OFFICER_EXPERIENCE_YEARS ( -type: esriFieldTypeDouble, alias: OFFICER_EXPERIENCE_YEARS -) OFFICER_POLICY_VIOLATION ( -type: esriFieldTypeString, alias: OFFICER_POLICY_VIOLATION, length: 15 -) YR ( -type: esriFieldTypeInteger, alias: YR -) Latitude ( -type: esriFieldTypeDouble, alias: Latitude -) Longitude ( -type: esriFieldTypeDouble, alias: Longitude -) Shape ( -type: esriFieldTypeGeometry, alias: Shape -) Supported Operations : Query Query Attachments Query Analytic Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4073,https://data.cambridgema.gov/Public-Safety/Police-Citations/gmq6-8ver,Citations,Police & Public Interactions,Police Citations | Open Data Portal | City of Cambridge,"",200," - Open Data Program - City of Cambridge, MA -","[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Police Citations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Police Citations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Maintenance Plan"", ""Specific Limitations"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content City of Cambridge Open Data Portal Sign In City of Cambridge Developers Help Menu Menu Close City of Cambridge Developers Help Sign In Search City of Cambridge Open Data Portal Sign In City of Cambridge Developers Help Menu City of Cambridge Open Data Portal Sign In City of Cambridge Developers Help Menu Sign In Sign In City of Cambridge Developers Help Menu Close City of Cambridge Developers Help Sign In Search City of Cambridge Developers Help Sign In Search City of Cambridge Developers Help Sign In Search Search -4074,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/UseofForce_Incident_2021.csv,Use of Force Reports,Police & Public Interactions,"","",200,"","","","","","","","" -4075,www.dallasopendata.com/resource/xiv3-e8g7.json,Use of Force Reports,Police & Public Interactions,Police Response to Resistance 2014 | Dallas OpenData,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Police Response to Resistance 2014"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Police Response to Resistance 2014"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Custom Metadata Fields"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Search Search Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Sign In Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search -4076,https://www.como.gov/wp-content/uploads/2020/10/CPD_vehicle_stop_data_2017.csv,Stops,Police & Public Interactions,"","",200,"","","","","","","","" -4077,www.dallasopendata.com/resource/99fn-pvaf.json,Use of Force Reports,Police & Public Interactions,Police Response to Resistance 2016 | Dallas OpenData,"",200,Error retrieving title: No connection adapters were found for '://',"[""Police Response to Resistance Map - 2016"", ""Officers Injured: Response to Resistance - 2016"", ""Citizens Injured: Response to Resistance - 2016"", ""1st"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Police Response to Resistance 2016"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Police Response to Resistance 2016"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Custom Metadata Fields"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Search Search Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Sign In Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search -4079,https://www.como.gov/wp-content/uploads/2020/10/CPD_vehicle_stop_data_2018-2.csv,Stops,Police & Public Interactions,"","",200,"","","","","","","","" -4080,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_traffic_stops_2018/FeatureServer/0,Stops,Police & Public Interactions,Layer: LPD_traffic_stops_2018 (ID:0),"",200,Home,[],"[""Layer: LPD_traffic_stops_2018 (ID:0)""]",[],[],[],[],"JSON Layer: LPD_traffic_stops_2018 (ID:0) Name: LPD_traffic_stops_2018 Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: ObjectId Unique ID Field: Name : ObjectId IsSystemMaintained : True Global ID Field: Type ID Field: Fields: DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) RACE (type: esriFieldTypeString, alias: RACE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) SEX (type: esriFieldTypeString, alias: SEX, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) REASON (type: esriFieldTypeInteger, alias: REASON, SQL Type: sqlTypeInteger, nullable: true, editable: true) OUTCOME (type: esriFieldTypeInteger, alias: OUTCOME, SQL Type: sqlTypeInteger, nullable: true, editable: true) SEARCH (type: esriFieldTypeInteger, alias: SEARCH, SQL Type: sqlTypeInteger, nullable: true, editable: true) ObjectId (type: esriFieldTypeOID, alias: ObjectId, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4081,https://gismaps.ci.fayetteville.nc.us/opendata/rest/services/Police/Accidents/MapServer/0,Incident Reports,Police & Public Interactions,Layer: Accidents (ID: 0),"",200,403 - Forbidden: Access is denied.,[],"[""Layer: Accidents (ID: 0)""]",[],[],[],[],"Name: Accidents Display Field: acci_id Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Default Visibility: false MaxRecordCount: 1000 Supported Query Formats: JSON, geoJSON Min Scale: 0 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Has Labels: false Can Modify Layer: true Can Scale Symbols: false Use Standardized Queries: true Supports Datum Transformation: true Extent: XMin: -121841900 YMin: -93659000 XMax: 125841900 YMax: 154024800 Spatial Reference: 102719 - (2264) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [78, 161, 0, 255] Size: 4.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 1 Label: Description: Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: null Fields: Date ( -type: esriFieldTypeDate, alias: Date, length: 8 -) Year ( -type: esriFieldTypeString, alias: Year, length: 30 -) Month ( -type: esriFieldTypeString, alias: Month, length: 30 -) Wk_Yr ( -type: esriFieldTypeString, alias: Wk_Yr, length: 30 -) DoW ( -type: esriFieldTypeString, alias: DoW, length: 30 -) Hour ( -type: esriFieldTypeString, alias: Hour, length: 30 -) YMD ( -type: esriFieldTypeInteger, alias: YMD -) fatality ( -type: esriFieldTypeInteger, alias: fatality -) X ( -type: esriFieldTypeDouble, alias: X -) Y ( -type: esriFieldTypeDouble, alias: Y -) Point ( -type: esriFieldTypeGeometry, alias: Point -) ESRI_OID ( -type: esriFieldTypeOID, alias: ESRI_OID -) Supported Operations : Query Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4082,https://maps.gilbertaz.gov/arcgis/rest/services/OD/Community_Safety_Tables_1/MapServer/2,Calls for Service,Police & Public Interactions,Application Error,"",200,Error retrieving title: 'NoneType' object has no attribute 'text',"[""ArcGIS Web Adaptor""]",[],[],[],[],[],ArcGIS Web Adaptor Could not access any server machines. Please contact your system administrator. ArcGIS Web Adaptor Could not access any server machines. Please contact your system administrator. Could not access any server machines. Please contact your system administrator. -4083,https://services1.arcgis.com/79kfd2K6fskCAkyg/arcgis/rest/services/Louisville_Metro_KY_LMPD_Stops_Data_from_2009_now/FeatureServer/0,Stops,Police & Public Interactions,Home,"",200,Home,[],"[""Home""]",[],[],[],[],JSON Home Invalid URL Invalid URL -4084,https://services7.arcgis.com/uRrQ0O3z2aaiIWYU/arcgis/rest/services/Calls_for_Service_2021/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: Calls for Service 2021 (ID:0),"",200,Error retrieving title: dictionary changed size during iteration,[],"[""Layer: Calls for Service 2021 (ID:0)""]",[],[],[],[],"JSON Layer: Calls for Service 2021 (ID:0) View In: Map Viewer Name: Calls for Service 2021 Display Field: DESCRIPTION Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Min. Scale: 0 Max. Scale: 0 Default Visibility: true Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True Extent: XMin: 6057816.00027873 YMin: 1966396.58524056 XMax: 6096995.58005589 YMax: 2006520.16870715 Spatial Reference: 102643 (2227) Drawing Info: {""renderer"":{""type"":""simple"",""symbol"":{""type"":""esriSMS"",""style"":""esriSMSCircle"",""color"":[0,168,132,255],""size"":4,""angle"":0,""xoffset"":0,""yoffset"":0,""outline"":{""color"":[0,0,0,255],""width"":0.7}}},""scaleSymbols"":true,""transparency"":0,""labelingInfo"":null} HasZ: true HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Object ID Field: OBJECTID Unique ID Field: Name : OBJECTID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID (type: esriFieldTypeOID, alias: OBJECTID, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) DESCRIPTION (type: esriFieldTypeString, alias: DESCRIPTION, SQL Type: sqlTypeOther, length: 2048, nullable: true, editable: true) DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) DAYOFWEEK (type: esriFieldTypeString, alias: DAYOFWEEK, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) LOCATION (type: esriFieldTypeString, alias: LOCATION, SQL Type: sqlTypeOther, length: 48, nullable: true, editable: true) AREA (type: esriFieldTypeString, alias: AREA, SQL Type: sqlTypeOther, length: 6, nullable: true, editable: true) BEAT (type: esriFieldTypeString, alias: BEAT, SQL Type: sqlTypeOther, length: 6, nullable: true, editable: true) TIME_RECEIVED (type: esriFieldTypeString, alias: TIME_RECEIVED, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) TIME_ON_SCENE (type: esriFieldTypeString, alias: TIME_ON_SCENE, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) TIME_CLEARED (type: esriFieldTypeString, alias: TIME_CLEARED, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) DISPOSITION (type: esriFieldTypeString, alias: DISPOSITION, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) Templates: Name: Calls for Service 2021 Description: Drawing Tool: esriFeatureEditToolPoint Prototype: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 2/15/2022 10:14:50 PM Schema Last Edit Date: 2/15/2022 10:14:50 PM Data Last Edit Date: 2/15/2022 10:14:50 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates View In: Map Viewer " -4085,https://gismaps.ci.fayetteville.nc.us/opendata/rest/services/Police/Citations/MapServer/0,Citations,Police & Public Interactions,Layer: CITATIONS (ID: 0),"",200,403 - Forbidden: Access is denied.,[],"[""Layer: CITATIONS (ID: 0)""]",[],[],[],[],"Name: CITATIONS Display Field: emfname Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Default Visibility: true MaxRecordCount: 1000 Supported Query Formats: JSON, geoJSON Min Scale: 0 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Has Labels: false Can Modify Layer: true Can Scale Symbols: false Use Standardized Queries: true Supports Datum Transformation: true Extent: XMin: 9.579956531524658E-5 YMin: -1.3318657875061035E-4 XMax: 2061355.5000799745 YMax: 522064.5899218917 Spatial Reference: 102719 - (2264) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [0, 153, 153, 255] Size: 4.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 1 Label: Description: Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false HasZ: false HasM: false Time Info: Start Time Field: tc_date End Time Field: null Track ID Field: null Time Extent: [2016/01/01 05:00:00 UTC, 2019/09/23 10:51:00 UTC] Time Reference: Time Zone: Eastern Standard Time Respects Daylight Saving: true Time Interval: 2 Time Interval Units: esriTimeUnitsMonths Has Live Data: false Export Options: Use Time: true Time Data Cumulative: true Time Offset: null (null) Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID, alias: OBJECTID -) tcid_chrg ( -type: esriFieldTypeString, alias: tcid_chrg, length: 12 -) trci_id ( -type: esriFieldTypeString, alias: trci_id, length: 20 -) tc_date ( -type: esriFieldTypeDate, alias: tc_date, length: 8 -) zone ( -type: esriFieldTypeString, alias: zone, length: 2 -) reportarea ( -type: esriFieldTypeString, alias: reportarea, length: 4 -) streetnbr ( -type: esriFieldTypeString, alias: streetnbr, length: 8 -) street ( -type: esriFieldTypeString, alias: street, length: 60 -) race ( -type: esriFieldTypeString, alias: race, length: 2 -) sex ( -type: esriFieldTypeString, alias: sex, length: 1 -) age ( -type: esriFieldTypeString, alias: age, length: 2 -) chrgdesc ( -type: esriFieldTypeString, alias: chrgdesc, length: 60 -) tract ( -type: esriFieldTypeString, alias: tract, length: 5 -) category2 ( -type: esriFieldTypeString, alias: category2, length: 4 -) emdivision ( -type: esriFieldTypeString, alias: emdivision, length: 4 -) SHAPE ( -type: esriFieldTypeGeometry, alias: SHAPE -) Supported Operations : Query Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4086,https://gismaps.ci.fayetteville.nc.us/opendata/rest/services/Police/Arrests/MapServer/0,Arrest Records,Police & Public Interactions,Layer: police.DBO.Arrests (ID: 0),"",200,403 - Forbidden: Access is denied.,[],"[""Layer: police.DBO.Arrests (ID: 0)""]",[],[],[],[],"Name: police.DBO.Arrests Display Field: arresteeName Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Default Visibility: true MaxRecordCount: 1000 Supported Query Formats: JSON, geoJSON Min Scale: 0 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Has Labels: false Can Modify Layer: true Can Scale Symbols: false Use Standardized Queries: true Supports Datum Transformation: true Extent: XMin: 1971375.8798427135 YMin: 398804.6199068874 XMax: 2134893.5744602233 YMax: 548248.8098630607 Spatial Reference: 102719 - (2264) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [0, 135, 70, 255] Size: 4.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 1 Label: Description: Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false HasZ: false HasM: false Time Info: Start Time Field: date_arr End Time Field: null Track ID Field: null Time Extent: [1999/08/30 04:00:00 UTC, 2024/02/21 05:00:00 UTC] Time Reference: Time Zone: Eastern Standard Time Respects Daylight Saving: true Time Interval: 3 Time Interval Units: esriTimeUnitsDecades Has Live Data: true Export Options: Use Time: true Time Data Cumulative: true Time Offset: null (null) Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID, alias: FID -) date_arr ( -type: esriFieldTypeDate, alias: date_arr, length: 8 -) ArrestedAtAddr ( -type: esriFieldTypeString, alias: Address, length: 70 -) case_id ( -type: esriFieldTypeString, alias: case_id, length: 12 -) ar_race ( -type: esriFieldTypeString, alias: ar_race, length: 2 -) ar_sex ( -type: esriFieldTypeString, alias: ar_sex, length: 1 -) charge ( -type: esriFieldTypeString, alias: charge, length: 60 -) time_arr ( -type: esriFieldTypeString, alias: time_arr, length: 4 -) city ( -type: esriFieldTypeString, alias: city, length: 20 -) state ( -type: esriFieldTypeString, alias: state, length: 2 -) zip ( -type: esriFieldTypeString, alias: zip, length: 10 -) typebond ( -type: esriFieldTypeString, alias: typebond, length: 4 -) bond_amt ( -type: esriFieldTypeDouble, alias: bond_amt -) district ( -type: esriFieldTypeString, alias: district, length: 4 -) tract ( -type: esriFieldTypeString, alias: tract, length: 4 -) zone ( -type: esriFieldTypeString, alias: zone, length: 4 -) reportarea ( -type: esriFieldTypeString, alias: reportarea, length: 4 -) oau_Arresst_Type ( -type: esriFieldTypeString, alias: oau_Arresst_Type, length: 55 -) Shape ( -type: esriFieldTypeGeometry, alias: Shape -) Supported Operations : Query Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4087,https://www.arcgis.com/sharing/rest/content/items/7bbc4c544a254405b8e255c540e83ddd/data,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -4088,https://services7.arcgis.com/uRrQ0O3z2aaiIWYU/arcgis/rest/services/Citations_2016_to_Present/FeatureServer/0,Citations,Police & Public Interactions,Layer: Citations (ID:0),"",200,Error retrieving title: dictionary changed size during iteration,[],"[""Layer: Citations (ID:0)""]",[],[],[],[],"JSON Layer: Citations (ID:0) View In: Map Viewer Name: Citations Display Field: LOCATION Type: Feature Layer Geometry Type: esriGeometryPoint Is View: true Is Updatable View: true Source Schema Changes Allowed: true Sources Description: Copyright Text: Min. Scale: 0 Max. Scale: 0 Default Visibility: true Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True Extent: XMin: 6066798.19461299 YMin: 1980380.4156398 XMax: 6085909.45679206 YMax: 2003802.15058727 Spatial Reference: 102643 (2227) Drawing Info: {""renderer"":{""type"":""simple"",""symbol"":{""type"":""esriSMS"",""style"":""esriSMSCircle"",""color"":[45,69,127,255],""size"":4,""angle"":0,""xoffset"":0,""yoffset"":0,""outline"":{""color"":[0,0,0,255],""width"":0.7}}},""scaleSymbols"":true,""transparency"":0,""labelingInfo"":null} HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Object ID Field: OBJECTID Unique ID Field: Name : OBJECTID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID (type: esriFieldTypeOID, alias: OBJECTID, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) LOCATION (type: esriFieldTypeString, alias: LOCATION, SQL Type: sqlTypeOther, length: 48, nullable: true, editable: true) AREA (type: esriFieldTypeString, alias: AREA, SQL Type: sqlTypeOther, length: 6, nullable: true, editable: true) BEAT (type: esriFieldTypeString, alias: BEAT, SQL Type: sqlTypeOther, length: 6, nullable: true, editable: true) DAY (type: esriFieldTypeString, alias: DAY, SQL Type: sqlTypeOther, length: 2048, nullable: true, editable: true) CITATION (type: esriFieldTypeString, alias: CITATION, SQL Type: sqlTypeOther, length: 20, nullable: true, editable: true) CITATION_TYPE (type: esriFieldTypeString, alias: CITATION TYPE, SQL Type: sqlTypeOther, length: 10, nullable: true, editable: true) VIOLATION_1 (type: esriFieldTypeString, alias: VIOLATION 1, SQL Type: sqlTypeOther, length: 32, nullable: true, editable: true) VIOLATION_2 (type: esriFieldTypeString, alias: VIOLATION 2, SQL Type: sqlTypeOther, length: 32, nullable: true, editable: true) VIOLATION_3 (type: esriFieldTypeString, alias: VIOLATION 3, SQL Type: sqlTypeOther, length: 32, nullable: true, editable: true) VIOLATION_4 (type: esriFieldTypeString, alias: VIOLATION 4, SQL Type: sqlTypeOther, length: 32, nullable: true, editable: true) TIME (type: esriFieldTypeInteger, alias: TIME, SQL Type: sqlTypeOther, nullable: true, editable: true) DESCRIPTION_1 (type: esriFieldTypeString, alias: DESCRIPTION 1, SQL Type: sqlTypeOther, length: 54, nullable: true, editable: true) DESCRIPTION_2 (type: esriFieldTypeString, alias: DESCRIPTION 2, SQL Type: sqlTypeOther, length: 54, nullable: true, editable: true) DESCRIPTION_3 (type: esriFieldTypeString, alias: DESCRIPTION 3, SQL Type: sqlTypeOther, length: 54, nullable: true, editable: true) RACE (type: esriFieldTypeString, alias: RACE, SQL Type: sqlTypeOther, length: 20, nullable: true, editable: true) SEX (type: esriFieldTypeString, alias: SEX, SQL Type: sqlTypeOther, length: 10, nullable: true, editable: true) CITY_ON_ID (type: esriFieldTypeString, alias: CITY ON ID, SQL Type: sqlTypeOther, length: 32, nullable: true, editable: true) DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) Templates: Name: Citations Description: Drawing Tool: esriFeatureEditToolPoint Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 8/29/2023 10:55:32 PM Schema Last Edit Date: 8/29/2023 10:55:32 PM Data Last Edit Date: 8/29/2023 10:55:32 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates View In: Map Viewer " -4089,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_traffic_stops_2014/FeatureServer/0,Stops,Police & Public Interactions,Layer: LPD_traffic_stops_2014 (ID:0),"",200,Home,[],"[""Layer: LPD_traffic_stops_2014 (ID:0)""]",[],[],[],[],"JSON Layer: LPD_traffic_stops_2014 (ID:0) Name: LPD_traffic_stops_2014 Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: FID Unique ID Field: Name : FID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeDate, alias: TIME, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) RACE (type: esriFieldTypeInteger, alias: RACE, SQL Type: sqlTypeInteger, nullable: true, editable: true) GENDER (type: esriFieldTypeInteger, alias: GENDER, SQL Type: sqlTypeInteger, nullable: true, editable: true) REASON (type: esriFieldTypeInteger, alias: REASON, SQL Type: sqlTypeInteger, nullable: true, editable: true) OUTCOME (type: esriFieldTypeInteger, alias: OUTCOME, SQL Type: sqlTypeInteger, nullable: true, editable: true) SEARCH (type: esriFieldTypeInteger, alias: SEARCH, SQL Type: sqlTypeInteger, nullable: true, editable: true) FID (type: esriFieldTypeOID, alias: FID, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4090,https://www.arcgis.com/sharing/rest/content/items/623d73fa151b4206b4467cdc1f903ed4/data,Arrest Records,Police & Public Interactions,"","",200,"",[],[],[],[],[],[],"" -4091,https://xmaps.indy.gov/arcgis/rest/services/OpenData/OpenData_NonSpatial/MapServer/5,Complaints & Misconduct,Info About Officers,Layer: IMPD Complaints (ID: 5),"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Layer: IMPD Complaints (ID: 5)""]",[],[],[],[],"Name: IMPD Complaints Display Field: INCIDENT_TYPE Type: Table Geometry Type: N/A Description: null Definition Expression: N/A Copyright Text: N/A Default Visibility: false MaxRecordCount: 1000 Supported Query Formats: JSON, AMF Supports Advanced Queries: true Supports Statistics: true Use Standardized Queries: true Extent: Drawing Info: N/A Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: false Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeNone Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID -, alias: OBJECTID -) INCNUM ( -type: esriFieldTypeInteger -, alias: INCNUM -) INCIDENT_TYPE ( -type: esriFieldTypeString -, alias: INCIDENT_TYPE -, length: 28 -) SERVICE_TYPE ( -type: esriFieldTypeString -, alias: SERVICE_TYPE -, length: 24 -) SOURCE ( -type: esriFieldTypeString -, alias: SOURCE -, length: 24 -) OCCURRED_DT ( -type: esriFieldTypeString -, alias: OCCURRED_DT -, length: 10 -) OCCURRED_TM ( -type: esriFieldTypeString -, alias: OCCURRED_TM -, length: 30 -) UDTEXT24A ( -type: esriFieldTypeString -, alias: UDTEXT24A -, length: 50 -) UDTEXT24B ( -type: esriFieldTypeString -, alias: UDTEXT24B -, length: 50 -) UDTEXT24C ( -type: esriFieldTypeString -, alias: UDTEXT24C -, length: 50 -) UDTEXT24D ( -type: esriFieldTypeString -, alias: UDTEXT24D -, length: 50 -) ALG_CLASS ( -type: esriFieldTypeString -, alias: ALG_CLASS -, length: 24 -) ALLEGATION ( -type: esriFieldTypeString -, alias: ALLEGATION -, length: 120 -) FINDING ( -type: esriFieldTypeString -, alias: FINDING -, length: 24 -) ADDR_TXT ( -type: esriFieldTypeString -, alias: ADDR_TXT -, length: 28 -) STREET_N ( -type: esriFieldTypeString -, alias: STREET_N -, length: 8 -) STREET ( -type: esriFieldTypeString -, alias: STREET -, length: 120 -) STREET_T ( -type: esriFieldTypeString -, alias: STREET_T -, length: 8 -) STREET_G ( -type: esriFieldTypeString -, alias: STREET_G -, length: 4 -) CITY ( -type: esriFieldTypeString -, alias: CITY -, length: 20 -) CITNUM ( -type: esriFieldTypeInteger -, alias: CITNUM -) RACE ( -type: esriFieldTypeString -, alias: RACE -, length: 40 -) SEX ( -type: esriFieldTypeString -, alias: SEX -, length: 40 -) CIT_AGE ( -type: esriFieldTypeInteger -, alias: CIT_AGE -) OFFNUM ( -type: esriFieldTypeInteger -, alias: OFFNUM -) OFF_RACE ( -type: esriFieldTypeString -, alias: OFF_RACE -, length: 40 -) OFF_SEX ( -type: esriFieldTypeString -, alias: OFF_SEX -, length: 40 -) OFF_AGE ( -type: esriFieldTypeInteger -, alias: OFF_AGE -) OFF_YR_EMPLOY ( -type: esriFieldTypeInteger -, alias: OFF_YR_EMPLOY -) LINKNUM ( -type: esriFieldTypeString -, alias: LINKNUM -, length: 24 -) Supported Operations : Query Generate Renderer Return Updates " -4092,https://services1.arcgis.com/79kfd2K6fskCAkyg/arcgis/rest/services/Louisville_Metro_KY_LMPD_Employee_Characteristics/FeatureServer/0,Personnel Records,Info About Officers,Home,"",200,Home,[],"[""Home""]",[],[],[],[],JSON Home Invalid URL Invalid URL -4093,data.lacity.org/resource/tss8-455b.json,Calls for Service,Police & Public Interactions,LAPD Calls for Service 2015 | Los Angeles - Open Data Portal,"",200,Error retrieving title: No connection adapters were found for '://',"[""LAPD Calls 2015"", ""2015 CFS COUNTS BY CALL TYPE"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""LAPD Calls for Service 2015"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""LAPD Calls for Service 2015"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Committed Update Frequency"", ""Data Owner"", ""Location Specified"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Sign In Data Catalog Geohub Blog Developer Resources About Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Search -4094,https://www.arcgis.com/sharing/rest/content/items/f589622a5fe54687a7bfa79d3e66ee17/data,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -4095,https://gis.greensboro-nc.gov/arcgis/rest/services/OpenGateCity/OpenData_ES_DS/MapServer/21,Use of Force Reports,Police & Public Interactions,Layer: POL_UOF_by_race_per_subject (ID: 21),"",200,Error retrieving title: dictionary changed size during iteration,[],"[""Layer: POL_UOF_by_race_per_subject (ID: 21)""]",[],[],[],[],"Name: POL_UOF_by_race_per_subject Display Field: Incident_type Type: Table Geometry Type: N/A Description: null Copyright Text: N/A Default Visibility: false MaxRecordCount: 100000 Supported Query Formats: JSON, PBF Supports Advanced Queries: true Supports Statistics: true Use Standardized Queries: true Extent: Drawing Info: N/A Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: false Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false Supports Binning LOD: false Supports Query With LOD Spatial Reference: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeNone Type ID Field: null Fields: ID ( -type: esriFieldTypeOID, alias: ID -) Incident_type ( -type: esriFieldTypeString, alias: Incident_type, length: 20 -) Occurred_date ( -type: esriFieldTypeDate, alias: Occurred_date, length: 8 -) Race ( -type: esriFieldTypeString, alias: Race, length: 20 -) Sex ( -type: esriFieldTypeString, alias: Sex, length: 20 -) Supported Operations : Query Query Attachments Query Analytic Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4096,https://gis.greensboro-nc.gov/arcgis/rest/services/OpenGateCity/OpenData_ES_DS/MapServer/20,Use of Force Reports,Police & Public Interactions,Layer: POL_UOF_by_force_type_per_officer (ID: 20),"",200,"Official Greensboro, NC, City Government Web Site",[],"[""Layer: POL_UOF_by_force_type_per_officer (ID: 20)""]",[],[],[],[],"Name: POL_UOF_by_force_type_per_officer Display Field: Incident_type Type: Table Geometry Type: N/A Description: null Copyright Text: N/A Default Visibility: false MaxRecordCount: 100000 Supported Query Formats: JSON, PBF Supports Advanced Queries: true Supports Statistics: true Use Standardized Queries: true Extent: Drawing Info: N/A Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: false Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false Supports Binning LOD: false Supports Query With LOD Spatial Reference: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeNone Type ID Field: null Fields: ID ( -type: esriFieldTypeOID, alias: ID -) Incident_type ( -type: esriFieldTypeString, alias: Incident_type, length: 20 -) UOF_Type_force_used ( -type: esriFieldTypeString, alias: UOF_Type_force_used, length: 50 -) Occurred_date ( -type: esriFieldTypeDate, alias: Occurred_date, length: 8 -) Supported Operations : Query Query Attachments Query Analytic Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4097,data.lacity.org/resource/ryvm-a59m.json,Calls for Service,Police & Public Interactions,LAPD Calls for Service 2017 | Los Angeles - Open Data Portal,"",200,Error retrieving title: No connection adapters were found for '://',"[""2017 CFS COUNTS BY CALL TYPE"", ""2017 CFS First Half of Year"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""LAPD Calls for Service 2017"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""LAPD Calls for Service 2017"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Committed Update Frequency"", ""Data Owner"", ""Location Specified"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Sign In Data Catalog Geohub Blog Developer Resources About Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Search -4098,https://data.lacity.org/browse?category=Public+Safety&limitTo=datasets,List of Data Sources,Info About Agencies,Results matching category of Public Safety and type of Datasets | Page 1 of 4 | Los Angeles - Open Data Portal,"",200,"DataLA: Information, Insights, and Analysis from the City of Angels | Los Angeles - Open Data Portal","[""Categories"", ""Department"", ""Tags""]","[""Menu"", ""Categories > Public Safety"", ""View Types > Datasets"", ""Sort"", ""Sort by Most Relevant"", ""Filter"", ""Categories"", ""View Types"", ""Department"", ""Tags"", ""Federated Domains"", ""Crime Data from 2020 to Present"", ""Crime Data from 2010 to 2019"", ""Arrest Data from 2010 to 2019"", ""Traffic Collision Data from 2010 to Present"", ""Arrest Data from 2020 to Present"", ""LAPD Calls for Service 2020"", ""Vehicle and Pedestrian Stop Data 2010 to June 30th, 2018"", ""LAPD Calls for Service 2019"", ""LAPD Calls for Service 2018"", ""LAPD Calls for Service 2022"", ""A-Z"", ""A-Z"", ""A-Z""]",[],[],[],[],Skip to main content Skip to footer links -4099,https://services6.arcgis.com/2TPYEzbyXSiAqSUs/arcgis/rest/services/Ferndale_DEPT_DEMOGRAPHICS_2017/FeatureServer/0,Personnel Records,Info About Officers,Layer: Ferndale_DEPT_DEMOGRAPHICS_2017 (ID:0),"",200,Error retrieving title: dictionary changed size during iteration,[],"[""Layer: Ferndale_DEPT_DEMOGRAPHICS_2017 (ID:0)""]",[],[],[],[],"JSON Layer: Ferndale_DEPT_DEMOGRAPHICS_2017 (ID:0) Name: Ferndale_DEPT_DEMOGRAPHICS_2017 Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: FID Unique ID Field: Name : FID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: RANK (type: esriFieldTypeString, alias: RANK, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) AGE_RANGE (type: esriFieldTypeString, alias: AGE_RANGE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) YEARS_ON_FORCE (type: esriFieldTypeInteger, alias: YEARS_ON_FORCE, SQL Type: sqlTypeInteger, nullable: true, editable: true) HOMETOWN (type: esriFieldTypeString, alias: HOMETOWN, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) DEDGREE (type: esriFieldTypeString, alias: DEDGREE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) COLLEGE (type: esriFieldTypeString, alias: COLLEGE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) RESIDENT_OR_FORMER_RESIDENT (type: esriFieldTypeString, alias: RESIDENT_OR_FORMER RESIDENT, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) VETERAN (type: esriFieldTypeString, alias: VETERAN, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) FBI_NA (type: esriFieldTypeInteger, alias: FBI_NA, SQL Type: sqlTypeInteger, nullable: true, editable: true) S_AND_C (type: esriFieldTypeString, alias: S_AND_C, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) FTO (type: esriFieldTypeString, alias: FTO, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) SWAT (type: esriFieldTypeString, alias: SWAT, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) EVID_TECH (type: esriFieldTypeString, alias: EVID_TECH, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) HG (type: esriFieldTypeString, alias: HG, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) GENDER (type: esriFieldTypeString, alias: GENDER, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) RACE (type: esriFieldTypeString, alias: RACE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) ENTHNICITY (type: esriFieldTypeString, alias: ENTHNICITY, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) FID (type: esriFieldTypeInteger, alias: FID, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 6/14/2017 8:35:56 PM Schema Last Edit Date: 6/14/2017 8:35:56 PM Data Last Edit Date: 6/14/2017 8:35:56 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4100,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_Use_of_control_2018/FeatureServer/0,Use of Force Reports,Police & Public Interactions,Layer: LPD_Use_of_control_2018 (ID:0),"",200,Home,[],"[""Layer: LPD_Use_of_control_2018 (ID:0)""]",[],[],[],[],"JSON Layer: LPD_Use_of_control_2018 (ID:0) Name: LPD_Use_of_control_2018 Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: ObjectId Unique ID Field: Name : ObjectId IsSystemMaintained : True Global ID Field: Type ID Field: Fields: RKY (type: esriFieldTypeString, alias: RKY, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) RACE (type: esriFieldTypeString, alias: RACE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) SEX (type: esriFieldTypeString, alias: SEX, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) AGE (type: esriFieldTypeInteger, alias: AGE, SQL Type: sqlTypeInteger, nullable: true, editable: true) RESISTANCE_LEVEL (type: esriFieldTypeString, alias: RESISTANCE LEVEL, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) FORCE_LEVEL (type: esriFieldTypeString, alias: FORCE LEVEL, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) PHYSICAL (type: esriFieldTypeString, alias: PHYSICAL, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) PRESSURE_POINT (type: esriFieldTypeString, alias: PRESSURE POINT, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) COME_ALONG (type: esriFieldTypeString, alias: COME ALONG, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) ACTIVE_COUNTERMEASURE (type: esriFieldTypeString, alias: ACTIVE COUNTERMEASURE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) SHOULDER_PIN (type: esriFieldTypeString, alias: SHOULDER PIN, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) OC_SPRAY (type: esriFieldTypeString, alias: OC SPRAY, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) FIREARM (type: esriFieldTypeString, alias: FIREARM, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) HANDCUFFS (type: esriFieldTypeString, alias: HANDCUFFS, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) BATON (type: esriFieldTypeString, alias: BATON, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) TASER (type: esriFieldTypeString, alias: TASER, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) K_9 (type: esriFieldTypeString, alias: K-9, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) OFFICER_INJURED_NO_MED_REQ (type: esriFieldTypeString, alias: OFFICER INJURED-NO MED REQ, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) OFFICER_INJURED_MED_REQ (type: esriFieldTypeString, alias: OFFICER INJURED-MED REQ, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) SUSPECT_OINJURED_NO_MED_REQ (type: esriFieldTypeString, alias: SUSPECT OINJURED-NO MED REQ, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) SUSPECT_INJURED_MED_REQ (type: esriFieldTypeString, alias: SUSPECT INJURED-MED REQ, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) ObjectId (type: esriFieldTypeOID, alias: ObjectId, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 2/21/2024 7:22:34 PM Schema Last Edit Date: 2/21/2024 7:22:32 PM Data Last Edit Date: 2/21/2024 7:22:32 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4101,https://services7.arcgis.com/uRrQ0O3z2aaiIWYU/arcgis/rest/services/Department_Demographics__2019_/FeatureServer/0,Personnel Records,Info About Officers,Layer: Department_Demographics__2019_ (ID:0),"",200,Home,[],"[""Layer: Department_Demographics__2019_ (ID:0)""]",[],[],[],[],"JSON Layer: Department_Demographics__2019_ (ID:0) Name: Department_Demographics__2019_ Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: ObjectId Unique ID Field: Name : ObjectId IsSystemMaintained : True Global ID Field: Type ID Field: Fields: Race (type: esriFieldTypeString, alias: Race, SQL Type: sqlTypeNVarchar, length: 2147483647, nullable: true, editable: true) Sex (type: esriFieldTypeString, alias: Sex, SQL Type: sqlTypeNVarchar, length: 2147483647, nullable: true, editable: true) ObjectId (type: esriFieldTypeOID, alias: ObjectId, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 1/29/2020 5:50:30 PM Schema Last Edit Date: 1/29/2020 5:50:30 PM Data Last Edit Date: 1/29/2020 5:50:30 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4102,policeview.johnscreekga.gov/resource/vpup-b7xy.json,Citations,Police & Public Interactions,Citation | Johns Creek Police Department | Performance Management,"",200,Error retrieving title: No connection adapters were found for '://',"[""Citation Data Analysis"", ""Citations Charge Column Chart"", ""Citations with Voids removed"", ""Citations without voids totals"", ""Citations Chart Accident/not Accident"", ""Citations from Accidents total"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Citation"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Citation"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home Police Stats Tutorial Developer Sign In Menu Menu Close Home Police Stats Tutorial Developer Sign In Search Search Home Police Stats Tutorial Developer Sign In Menu Search Search Search Search Home Police Stats Tutorial Developer Sign In Menu Home Police Stats Tutorial Developer Sign In Menu Home Police Stats Tutorial Developer Home Police Stats Tutorial Developer Sign In Sign In Menu Close Home Police Stats Tutorial Developer Sign In Search Home Police Stats Tutorial Developer Sign In Search Home Police Stats Tutorial Developer Sign In Search Search -4103,https://www.arcgis.com/sharing/rest/content/items/efae41a4a6314c049f10424527f8647d/data,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -4104,https://policedata-fcpdgis.hub.arcgis.com/pages/crime-stats,Arrest Records,Police & Public Interactions,ArcGIS Hub,"Discover, analyze and download data from ArcGIS Hub. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",200,ArcGIS Hub,[],[],[],[],[],[],"" -4105,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/Pursuits_2018/FeatureServer/0,Vehicle Pursuits,Police & Public Interactions,Layer: Pursuits_2018 (ID:0),"",200,Home,[],"[""Layer: Pursuits_2018 (ID:0)""]",[],[],[],[],"JSON Layer: Pursuits_2018 (ID:0) Name: Pursuits_2018 Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: ObjectId Unique ID Field: Name : ObjectId IsSystemMaintained : True Global ID Field: Type ID Field: Fields: DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) REASON (type: esriFieldTypeString, alias: REASON, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) OFFICERSPEED (type: esriFieldTypeInteger, alias: OFFICERSPEED, SQL Type: sqlTypeInteger, nullable: true, editable: true) VIOLATORSPEED (type: esriFieldTypeDouble, alias: VIOLATORSPEED, SQL Type: sqlTypeFloat, nullable: true, editable: true) DURATIONMIN (type: esriFieldTypeInteger, alias: DURATIONMIN, SQL Type: sqlTypeInteger, nullable: true, editable: true) TERMINATION (type: esriFieldTypeString, alias: TERMINATION, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) STOPSTICKS (type: esriFieldTypeString, alias: STOPSTICKS, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) ROADBLOCK (type: esriFieldTypeString, alias: ROADBLOCK, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) BOXING (type: esriFieldTypeString, alias: BOXING, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) INTENTIONAL_CONTACT (type: esriFieldTypeString, alias: INTENTIONAL CONTACT, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) CHARGES (type: esriFieldTypeString, alias: CHARGES, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) CRASH (type: esriFieldTypeString, alias: CRASH, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) PATH (type: esriFieldTypeString, alias: PATH, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) ObjectId (type: esriFieldTypeOID, alias: ObjectId, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4106,https://services.arcgis.com/RmCCgQtiZLDCtblq/arcgis/rest/services/Sheriff_Deputy_Details_Hit_Shooting_Incidents_and_Non_Hit_Shooting_Incidents_2010_/FeatureServer/0,Officer Involved Shootings,Police & Public Interactions,Home,"",200,Home,[],"[""Home""]",[],[],[],[],JSON Home Invalid URL Invalid URL -4107,https://services7.arcgis.com/uRrQ0O3z2aaiIWYU/arcgis/rest/services/Calls_for_Service_2020/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: Calls_for_Service_2020 (ID:0),"",200,Error retrieving title: dictionary changed size during iteration,[],"[""Layer: Calls_for_Service_2020 (ID:0)""]",[],[],[],[],"JSON Layer: Calls_for_Service_2020 (ID:0) View In: Map Viewer Name: Calls_for_Service_2020 Display Field: DESCRIPTION Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Min. Scale: 0 Max. Scale: 0 Default Visibility: true Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True Extent: XMin: 6055313.79465322 YMin: 1970763.38654631 XMax: 6090550.2953743 YMax: 2006520.16870715 Spatial Reference: 102643 (2227) Drawing Info: {""renderer"":{""type"":""simple"",""symbol"":{""type"":""esriSMS"",""style"":""esriSMSCircle"",""color"":[76,64,173,255],""size"":4,""angle"":0,""xoffset"":0,""yoffset"":0,""outline"":{""color"":[0,0,0,255],""width"":0.7}}},""scaleSymbols"":true,""transparency"":0,""labelingInfo"":null} HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Object ID Field: OBJECTID Unique ID Field: Name : OBJECTID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID (type: esriFieldTypeOID, alias: OBJECTID, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) DESCRIPTION (type: esriFieldTypeString, alias: DESCRIPTION, SQL Type: sqlTypeOther, length: 2048, nullable: true, editable: true) DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) DAYOFWEEK (type: esriFieldTypeString, alias: DAYOFWEEK, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) LOCATION (type: esriFieldTypeString, alias: LOCATION, SQL Type: sqlTypeOther, length: 48, nullable: true, editable: true) AREA (type: esriFieldTypeString, alias: AREA, SQL Type: sqlTypeOther, length: 6, nullable: true, editable: true) BEAT (type: esriFieldTypeString, alias: BEAT, SQL Type: sqlTypeOther, length: 6, nullable: true, editable: true) TIME_RECEIVED (type: esriFieldTypeString, alias: TIME_RECEIVED, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) TIME_ON_SCENE (type: esriFieldTypeString, alias: TIME_ON_SCENE, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) TIME_CLEARED (type: esriFieldTypeString, alias: TIME_CLEARED, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) DISPOSITION (type: esriFieldTypeString, alias: DISPOSITION, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) Templates: Name: Calls_for_Service_2020 Description: Drawing Tool: esriFeatureEditToolPoint Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 2/10/2022 6:22:02 PM Schema Last Edit Date: 2/10/2022 6:22:02 PM Data Last Edit Date: 2/10/2022 6:22:02 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates View In: Map Viewer " -4108,https://www.arcgis.com/sharing/rest/content/items/ddbe7df35a8e4624a74817990ac88441/data,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -4109,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_Use_of_Control_2020_2021/FeatureServer/0,Use of Force Reports,Police & Public Interactions,Layer: LPD_Use_of_Control_2020_2021 (ID:0),"",200,Home,[],"[""Layer: LPD_Use_of_Control_2020_2021 (ID:0)""]",[],[],[],[],"JSON Layer: LPD_Use_of_Control_2020_2021 (ID:0) Name: LPD_Use_of_Control_2020_2021 Display Field: Type: Table Description: Copyright Text: Max Record Count: 1000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: ObjectId Unique ID Field: Name : ObjectId IsSystemMaintained : True Global ID Field: Type ID Field: Fields: RKY (type: esriFieldTypeString, alias: RKY, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) RACE (type: esriFieldTypeString, alias: RACE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) SEX (type: esriFieldTypeString, alias: SEX, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) AGE (type: esriFieldTypeInteger, alias: AGE, SQL Type: sqlTypeInteger, nullable: true, editable: true) RESISTANCE_LEVEL (type: esriFieldTypeString, alias: RESISTANCE_LEVEL, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) FORCE_LEVEL (type: esriFieldTypeString, alias: FORCE_LEVEL, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PHYSICAL (type: esriFieldTypeString, alias: PHYSICAL, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) F6INONE (type: esriFieldTypeString, alias: 6INONE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PRESSURE_POINT (type: esriFieldTypeString, alias: PRESSURE_POINT, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) COME_ALONG (type: esriFieldTypeString, alias: COME_ALONG, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) ACTIVE_COUNTERMEASURE (type: esriFieldTypeString, alias: ACTIVE_COUNTERMEASURE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) SHOULDER_PIN (type: esriFieldTypeString, alias: SHOULDER_PIN, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) OC_SPRAY (type: esriFieldTypeString, alias: OC_SPRAY, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) FIREARM (type: esriFieldTypeString, alias: FIREARM, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) HANDCUFFS (type: esriFieldTypeString, alias: HANDCUFFS, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) BATON (type: esriFieldTypeString, alias: BATON, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) TASER (type: esriFieldTypeString, alias: TASER, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) K_9 (type: esriFieldTypeString, alias: K_9, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) OFFICER_INJURED_NO_MED_REQ (type: esriFieldTypeString, alias: OFFICER_INJURED_NO_MED_REQ, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) OFFICER_INJURED_MED_REQ (type: esriFieldTypeString, alias: OFFICER_INJURED_MED_REQ, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) SUSPECT_OINJURED_NO_MED (type: esriFieldTypeString, alias: SUSPECT_OINJURED_NO_MED, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) SUSPECT_INJURED_MED_REQ (type: esriFieldTypeString, alias: SUSPECT_INJURED_MED_REQ, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) FID (type: esriFieldTypeString, alias: FID, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) ObjectId (type: esriFieldTypeOID, alias: ObjectId, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 2/21/2024 7:25:09 PM Schema Last Edit Date: 2/21/2024 7:25:08 PM Data Last Edit Date: 5/5/2022 2:50:03 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4111,data.lacity.org/resource/r4ka-x5je.json,Calls for Service,Police & Public Interactions,LAPD Calls for Service 2019 | Los Angeles - Open Data Portal,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""LAPD Calls for Service 2019"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""LAPD Calls for Service 2019"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Committed Update Frequency"", ""Data Owner"", ""Location Specified"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Sign In Data Catalog Geohub Blog Developer Resources About Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Search -4112,data.lacity.org/resource/i7pm-cnmm.json,Calls for Service,Police & Public Interactions,LAPD Calls for Service 2012 | Los Angeles - Open Data Portal,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""LAPD Calls for Service 2012"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""LAPD Calls for Service 2012"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Committed Update Frequency"", ""Data Owner"", ""Location Specified"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Sign In Data Catalog Geohub Blog Developer Resources About Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Search -4113,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_traffic_stops_2016/FeatureServer/0,Stops,Police & Public Interactions,Layer: LPD_traffic_stops_2016 (ID:0),"",200,Home,[],"[""Layer: LPD_traffic_stops_2016 (ID:0)""]",[],[],[],[],"JSON Layer: LPD_traffic_stops_2016 (ID:0) Name: LPD_traffic_stops_2016 Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: FID Unique ID Field: Name : FID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) RACE (type: esriFieldTypeInteger, alias: RACE, SQL Type: sqlTypeInteger, nullable: true, editable: true) SEX (type: esriFieldTypeInteger, alias: SEX, SQL Type: sqlTypeInteger, nullable: true, editable: true) REASON (type: esriFieldTypeInteger, alias: REASON, SQL Type: sqlTypeInteger, nullable: true, editable: true) OUTCOME (type: esriFieldTypeInteger, alias: OUTCOME, SQL Type: sqlTypeInteger, nullable: true, editable: true) SEARCH (type: esriFieldTypeInteger, alias: SEARCH, SQL Type: sqlTypeInteger, nullable: true, editable: true) FID (type: esriFieldTypeOID, alias: FID, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4114,policeview.johnscreekga.gov/resource/aa9g-h5hg.json,Calls for Service,Police & Public Interactions,IncidentCAD | Johns Creek Police Department | Performance Management,"",200,Error retrieving title: No connection adapters were found for '://',"[""JCPD Call Volume and Types of Calls"", ""False Alarm Chart"", ""Warnings Chart"", ""CAD calls by month 2015 Column"", ""CAD calls by Month 2016 Column"", ""Filter - Alert - Nature code"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""IncidentCAD"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""IncidentCAD"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home Police Stats Tutorial Developer Sign In Menu Menu Close Home Police Stats Tutorial Developer Sign In Search Search Home Police Stats Tutorial Developer Sign In Menu Search Search Search Search Home Police Stats Tutorial Developer Sign In Menu Home Police Stats Tutorial Developer Sign In Menu Home Police Stats Tutorial Developer Home Police Stats Tutorial Developer Sign In Sign In Menu Close Home Police Stats Tutorial Developer Sign In Search Home Police Stats Tutorial Developer Sign In Search Home Police Stats Tutorial Developer Sign In Search Search -4115,https://fortlauderdale.data.socrata.com/stories/s/Datasets/u4dm-3u2d/,Citations,Police & Public Interactions,Datasets,"",200,"City of Fort Lauderdale Police Department | Performance Management | City of Fort Lauderdale Police Department -",[],"[""Menu"", ""FLPD Datasets""]","[""Police Data Disclaimer""]",[],[],[],"Skip to main content Skip to footer links Fort Lauderdale Police Department - Open Data Portal Sign In Home Page Datasets Citywide Stats Neighborhood Stats PD District Stats Commission Districts Developer Menu Menu Close Home Page Datasets Citywide Stats Neighborhood Stats PD District Stats Commission Districts Developer Sign In Search Fort Lauderdale Police Department - Open Data Portal Sign In Home Page Datasets Citywide Stats Neighborhood Stats PD District Stats Commission Districts Developer Menu Fort Lauderdale Police Department - Open Data Portal Sign In Home Page Datasets Citywide Stats Neighborhood Stats PD District Stats Commission Districts Developer Menu Sign In Sign In Home Page Datasets Citywide Stats Neighborhood Stats PD District Stats Commission Districts Developer Menu Close Home Page Datasets Citywide Stats Neighborhood Stats PD District Stats Commission Districts Developer Sign In Search Home Page Datasets Citywide Stats Neighborhood Stats PD District Stats Commission Districts Developer Sign In Search Home Page Datasets Citywide Stats Neighborhood Stats PD District Stats Commission Districts Developer Sign In Search Search FLPD Datasets Police Data Disclaimer This data reflects crimes as reported to the Fort Lauderdale Police Department (FLPD) as of the date of publication. Crime classifications are often based upon -preliminary information supplied to the department by the reporting parties and -as a result, offense types may be changed -at a later date based upon additional investigation.  As this data has not been screened through FLPD ’s quality control process as of -the publication, data-sets may contain information not yet verified by further investigation -or analysis. NOTE: The Lat, Long coordinates for all data-sets that feature addresses have a random offset for privacy purposes. The offset coordinates reflect approximate - NOT actual - locations. Incidents This data-set includes criminal incidents which occurred on - the territory of the City of Fort Lauderdale, and were reported since January - 1st 2015. The addresses listed are partial for protection of the privacy of - any victims involved. No addresses are listed for incidents related to - individuals with mental health issues, and suicidal behaviors as these are - subject to Baker/Marchman Act confidentiality rules. Addresses/geo - coordinates are also not disclosed for crimes where maintaining victim - privacy is essential. Calls for Service This set comprises all calls made to the 911 Regional - Dispatch Center since August 1, 2014. Callers' identities are not revealed in - these records. Arrests This catalog features arrests conducted in the City of - Fort Lauderdale since January 1st, 2015. Names and exact addresses are not - listed. Citations Data on traffic - citations issued in the City of Fort Lauderdale since January 1st, 2015. No - personal or vehicle data is disclosed within this data-set. Accidents This data-set includes all traffic accidents involving - vehicles and pedestrians in the City of Fort Lauderdale since February 1st, - 2015. No personal or specific vehicle data is disclosed in this data set. Employees Basic demographic data, employee unit, rank, and longevity - dates of FLPD staff (sworn and civilians) are included in this catalog. This - data is released for high-level workforce and community composition analysis. " -4116,https://services1.arcgis.com/pNPbgWy7hpfFGWoZ/arcgis/rest/services/Traffic_Stops/FeatureServer/0,Stops,Police & Public Interactions,Layer: Traffic_Stops (ID:0),"",200,Home,[],"[""Layer: Traffic_Stops (ID:0)""]",[],[],[],[],"JSON Layer: Traffic_Stops (ID:0) Name: Traffic_Stops Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: ObjectId Unique ID Field: Name : ObjectId IsSystemMaintained : True Global ID Field: Type ID Field: Fields: Date (type: esriFieldTypeDate, alias: Date, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) Team_Area (type: esriFieldTypeInteger, alias: Team_Area, SQL Type: sqlTypeInteger, nullable: true, editable: true) Street_Area (type: esriFieldTypeString, alias: Street_Area, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) Reason_for_Stop (type: esriFieldTypeString, alias: Reason_for_Stop, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) Race_Ethnicity (type: esriFieldTypeString, alias: Race_Ethnicity, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) Gender (type: esriFieldTypeString, alias: Gender, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) Age (type: esriFieldTypeInteger, alias: Age, SQL Type: sqlTypeInteger, nullable: true, editable: true) Search_Performed (type: esriFieldTypeString, alias: Search_Performed, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) Search_Authority (type: esriFieldTypeString, alias: Search_Authority, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) Discovery_If_Searched (type: esriFieldTypeString, alias: Discovery_If_Searched, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) Result_of_Stop (type: esriFieldTypeString, alias: Result_of_Stop, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) Officer_Badge (type: esriFieldTypeString, alias: Officer_Badge, SQL Type: sqlTypeNVarchar, length: 2147483647, nullable: true, editable: true) Traffic_Crash (type: esriFieldTypeString, alias: Traffic_Crash, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) Serial_Number (type: esriFieldTypeInteger, alias: Serial_Number, SQL Type: sqlTypeInteger, nullable: true, editable: true) ObjectId (type: esriFieldTypeOID, alias: ObjectId, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 3/9/2023 5:52:01 PM Schema Last Edit Date: 3/9/2023 5:52:01 PM Data Last Edit Date: 3/9/2023 5:52:01 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4117,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_traffic_stops_2013/FeatureServer/0,Stops,Police & Public Interactions,Layer: LPD_traffic_stops_2013 (ID:0),"",200,Home,[],"[""Layer: LPD_traffic_stops_2013 (ID:0)""]",[],[],[],[],"JSON Layer: LPD_traffic_stops_2013 (ID:0) Name: LPD_traffic_stops_2013 Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: FID Unique ID Field: Name : FID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) RACE (type: esriFieldTypeInteger, alias: RACE, SQL Type: sqlTypeInteger, nullable: true, editable: true) SEX (type: esriFieldTypeInteger, alias: SEX, SQL Type: sqlTypeInteger, nullable: true, editable: true) REASON (type: esriFieldTypeInteger, alias: REASON, SQL Type: sqlTypeInteger, nullable: true, editable: true) OUTCOME (type: esriFieldTypeInteger, alias: OUTCOME, SQL Type: sqlTypeInteger, nullable: true, editable: true) SEARCH (type: esriFieldTypeInteger, alias: SEARCH, SQL Type: sqlTypeInteger, nullable: true, editable: true) FID (type: esriFieldTypeOID, alias: FID, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4118,https://www.arcgis.com/sharing/rest/content/items/fa92d418a08343e3b5fb541d4e026eb3/data,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -4119,https://xmaps.indy.gov/arcgis/rest/services/OpenData/OpenData_NonSpatial/MapServer/7,Use of Force Reports,Police & Public Interactions,Layer: IMPD Use Of Force (ID: 7),"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Layer: IMPD Use Of Force (ID: 7)""]",[],[],[],[],"Name: IMPD Use Of Force Display Field: OCCURRED_DT Type: Table Geometry Type: N/A Description: null Definition Expression: N/A Copyright Text: N/A Default Visibility: false MaxRecordCount: 1000 Supported Query Formats: JSON, AMF Supports Advanced Queries: true Supports Statistics: true Use Standardized Queries: true Extent: Drawing Info: N/A Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: false Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeNone Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID -, alias: OBJECTID -) INCNUM ( -type: esriFieldTypeInteger -, alias: INCNUM -) OCCURRED_DT ( -type: esriFieldTypeString -, alias: OCCURRED_DT -, length: 10 -) OCCURRED_TM ( -type: esriFieldTypeString -, alias: OCCURRED_TM -, length: 30 -) UDTEXT24A ( -type: esriFieldTypeString -, alias: UDTEXT24A -, length: 50 -) UDTEXT24B ( -type: esriFieldTypeString -, alias: UDTEXT24B -, length: 50 -) UDTEXT24C ( -type: esriFieldTypeString -, alias: UDTEXT24C -, length: 50 -) UDTEXT24D ( -type: esriFieldTypeString -, alias: UDTEXT24D -, length: 50 -) DISPOSITION ( -type: esriFieldTypeString -, alias: DISPOSITION -, length: 24 -) STREET_N ( -type: esriFieldTypeString -, alias: STREET_N -, length: 8 -) STREET ( -type: esriFieldTypeString -, alias: STREET -, length: 120 -) STREET_T ( -type: esriFieldTypeString -, alias: STREET_T -, length: 8 -) STREET_G ( -type: esriFieldTypeString -, alias: STREET_G -, length: 4 -) CITY ( -type: esriFieldTypeString -, alias: CITY -, length: 20 -) UOF_FORCE_TYPE ( -type: esriFieldTypeString -, alias: UOF_FORCE_TYPE -, length: 24 -) UOF_REASON ( -type: esriFieldTypeString -, alias: UOF_REASON -, length: 28 -) SERVICE_TYPE ( -type: esriFieldTypeString -, alias: SERVICE_TYPE -, length: 24 -) CIT_ARRESTED ( -type: esriFieldTypeString -, alias: CIT_ARRESTED -, length: 3 -) CITCHARGE_TYPE ( -type: esriFieldTypeString -, alias: CITCHARGE_TYPE -, length: 50 -) CIT_WEAPON_TYPE ( -type: esriFieldTypeString -, alias: CIT_WEAPON_TYPE -, length: 24 -) CIT_INJURED ( -type: esriFieldTypeString -, alias: CIT_INJURED -, length: 3 -) CIT_HOSPITAL ( -type: esriFieldTypeString -, alias: CIT_HOSPITAL -, length: 3 -) OFF_INJURED ( -type: esriFieldTypeString -, alias: OFF_INJURED -, length: 3 -) OFF_HOSPITAL ( -type: esriFieldTypeString -, alias: OFF_HOSPITAL -, length: 3 -) CITNUM ( -type: esriFieldTypeInteger -, alias: CITNUM -) RACE ( -type: esriFieldTypeString -, alias: RACE -, length: 40 -) SEX ( -type: esriFieldTypeString -, alias: SEX -, length: 40 -) CIT_AGE ( -type: esriFieldTypeInteger -, alias: CIT_AGE -) CIT_COND_TYPE ( -type: esriFieldTypeString -, alias: CIT_COND_TYPE -, length: 28 -) OFFNUM ( -type: esriFieldTypeInteger -, alias: OFFNUM -) OFF_RACE ( -type: esriFieldTypeString -, alias: OFF_RACE -, length: 40 -) OFF_SEX ( -type: esriFieldTypeString -, alias: OFF_SEX -, length: 40 -) OFF_AGE ( -type: esriFieldTypeInteger -, alias: OFF_AGE -) OFF_YR_EMPLOY ( -type: esriFieldTypeInteger -, alias: OFF_YR_EMPLOY -) OFF_COND_TYPE ( -type: esriFieldTypeString -, alias: OFF_COND_TYPE -, length: 28 -) Supported Operations : Query Generate Renderer Return Updates " -4120,data.lacity.org/resource/urhh-yf63.json,Calls for Service,Police & Public Interactions,LAPD Calls for Service 2013 | Los Angeles - Open Data Portal,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""LAPD Calls for Service 2013"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""LAPD Calls for Service 2013"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Committed Update Frequency"", ""Data Owner"", ""Location Specified"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Sign In Data Catalog Geohub Blog Developer Resources About Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Search -4121,https://services1.arcgis.com/79kfd2K6fskCAkyg/arcgis/rest/services/Louisville_Metro_KY_Uniform_Citation_Data_2021/FeatureServer/0,Citations,Police & Public Interactions,Layer: Louisville_Metro_KY_Uniform_Citation_Data_2021 (ID:0),"",200,Home,[],"[""Layer: Louisville_Metro_KY_Uniform_Citation_Data_2021 (ID:0)""]",[],[],[],[],"JSON Layer: Louisville_Metro_KY_Uniform_Citation_Data_2021 (ID:0) Name: Louisville_Metro_KY_Uniform_Citation_Data_2021 Display Field: Type: Table Description: Copyright Text: Max Record Count: 1000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: ObjectId Unique ID Field: Name : ObjectId IsSystemMaintained : True Global ID Field: Type ID Field: Fields: AGENCY_DESC (type: esriFieldTypeString, alias: AGENCY_DESC, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) BADGE_ID (type: esriFieldTypeInteger, alias: BADGE ID, SQL Type: sqlTypeInteger, nullable: true, editable: true) CASE_NUMBER (type: esriFieldTypeString, alias: CASE_NUMBER, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) CITATION_YEAR (type: esriFieldTypeString, alias: CITATION_YEAR, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) CITATION_CONTROL_NUMBER (type: esriFieldTypeString, alias: CITATION_CONTROL_NUMBER, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) CITATION_TYPE_DESC (type: esriFieldTypeString, alias: CITATION_TYPE_DESC, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) CITATION_DATE (type: esriFieldTypeDate, alias: CITATION_DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) CITATION_LOCATION (type: esriFieldTypeString, alias: CITATION_LOCATION, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) DIVISION (type: esriFieldTypeString, alias: DIVISION, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) BEAT (type: esriFieldTypeString, alias: BEAT, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) PERSONS_SEX (type: esriFieldTypeString, alias: PERSONS_SEX, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PERSONS_RACE (type: esriFieldTypeString, alias: PERSONS_RACE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PERSONS_ETHNICITY (type: esriFieldTypeString, alias: PERSONS_ETHNICITY, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PERSONS_AGE (type: esriFieldTypeInteger, alias: PERSONS_AGE, SQL Type: sqlTypeInteger, nullable: true, editable: true) PERSONS_HOME_CITY (type: esriFieldTypeString, alias: PERSONS_HOME_CITY, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PERSONS_HOME_STATE (type: esriFieldTypeString, alias: PERSONS_HOME_STATE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PERSONS_HOME_ZIP (type: esriFieldTypeString, alias: PERSONS_HOME_ZIP, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) VIOLATION_CODE (type: esriFieldTypeString, alias: VIOLATION_CODE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) ASCF_CODE (type: esriFieldTypeString, alias: ASCF_CODE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) STATUTE (type: esriFieldTypeString, alias: STATUTE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) CHARGE_DESC (type: esriFieldTypeString, alias: CHARGE_DESC, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) UCR_CODE (type: esriFieldTypeString, alias: UCR_CODE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) UCR_DESC (type: esriFieldTypeString, alias: UCR_DESC, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) ObjectId (type: esriFieldTypeOID, alias: ObjectId, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 3/23/2023 1:05:30 PM Schema Last Edit Date: 3/23/2023 1:05:30 PM Data Last Edit Date: 3/23/2023 1:05:30 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4122,https://www.arcgis.com/sharing/rest/content/items/d19a6d4fef31437599664f435fa95a35/data,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -4123,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_traffic_stops_2019/FeatureServer/0,Stops,Police & Public Interactions,Layer: Sheet1 (ID:0),"",200,Home,[],"[""Layer: Sheet1 (ID:0)""]",[],[],[],[],"JSON Layer: Sheet1 (ID:0) Name: Sheet1 Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: FID Unique ID Field: Name : FID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) RACE (type: esriFieldTypeInteger, alias: RACE, SQL Type: sqlTypeInteger, nullable: true, editable: true) SEX (type: esriFieldTypeInteger, alias: SEX, SQL Type: sqlTypeInteger, nullable: true, editable: true) REASON (type: esriFieldTypeInteger, alias: REASON, SQL Type: sqlTypeInteger, nullable: true, editable: true) OUTCOME (type: esriFieldTypeInteger, alias: OUTCOME, SQL Type: sqlTypeInteger, nullable: true, editable: true) SEARCH (type: esriFieldTypeInteger, alias: SEARCH, SQL Type: sqlTypeInteger, nullable: true, editable: true) FID (type: esriFieldTypeOID, alias: FID, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 2/21/2020 4:21:00 PM Schema Last Edit Date: 2/21/2020 4:21:00 PM Data Last Edit Date: 2/21/2020 4:21:00 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4124,https://services2.arcgis.com/qvkbeam7Wirps6zC/arcgis/rest/services/DPD_Citizen_Complaints/FeatureServer/0,Complaints & Misconduct,Info About Officers,Layer: DPD_Citizen_Complaints (ID:0),"",200,Home,[],"[""Layer: DPD_Citizen_Complaints (ID:0)""]",[],[],[],[],"JSON Layer: DPD_Citizen_Complaints (ID:0) Name: DPD_Citizen_Complaints Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: ObjectId Unique ID Field: Name : ObjectId IsSystemMaintained : True Global ID Field: Type ID Field: Fields: BPC (type: esriFieldTypeString, alias: BPC, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) CCR (type: esriFieldTypeInteger, alias: CCR, SQL Type: sqlTypeInteger, nullable: true, editable: true) Report_Date (type: esriFieldTypeDate, alias: Report Date, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) Entry (type: esriFieldTypeString, alias: Entry, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) Age (type: esriFieldTypeInteger, alias: Age, SQL Type: sqlTypeInteger, nullable: true, editable: true) ctznRace (type: esriFieldTypeString, alias: ctznRace, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) ctznSex (type: esriFieldTypeString, alias: ctznSex, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) Closed (type: esriFieldTypeDate, alias: Closed, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) Unit (type: esriFieldTypeString, alias: Unit, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) Administrative_Closure (type: esriFieldTypeString, alias: Administrative Closure, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) Allegation (type: esriFieldTypeString, alias: Allegation, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) Finding (type: esriFieldTypeString, alias: Finding, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) ofcrRace (type: esriFieldTypeString, alias: ofcrRace, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) ofcrSex (type: esriFieldTypeString, alias: ofcrSex, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) ObjectId (type: esriFieldTypeOID, alias: ObjectId, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 3/25/2024 2:01:15 AM Schema Last Edit Date: 3/25/2024 2:01:15 AM Data Last Edit Date: 3/25/2024 2:01:15 AM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4125,https://services1.arcgis.com/JLuzSHjNrLL4Okwb/arcgis/rest/services/Gilbert_Demographics/FeatureServer/0,Personnel Records,Info About Officers,Layer: GilbertDemographics (ID:0),"",200,Home,[],"[""Layer: GilbertDemographics (ID:0)""]",[],[],[],[],"JSON Layer: GilbertDemographics (ID:0) Name: GilbertDemographics Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: OBJECTID Unique ID Field: Name : OBJECTID IsSystemMaintained : True Global ID Field: GlobalID Type ID Field: Fields: Department (type: esriFieldTypeString, alias: Department, SQL Type: sqlTypeOther, length: 30, nullable: true, editable: true) Division (type: esriFieldTypeString, alias: Division, SQL Type: sqlTypeOther, length: 30, nullable: true, editable: true) ActiveStatusCode (type: esriFieldTypeString, alias: ActiveStatusCode, SQL Type: sqlTypeOther, length: 1, nullable: true, editable: true) GilbertResident (type: esriFieldTypeString, alias: GilbertResident, SQL Type: sqlTypeOther, length: 3, nullable: true, editable: true) EmployeeStatus (type: esriFieldTypeString, alias: EmployeeStatus, SQL Type: sqlTypeOther, length: 30, nullable: true, editable: true) HighDegreeCode (type: esriFieldTypeString, alias: HighDegreeCode, SQL Type: sqlTypeOther, length: 4, nullable: true, editable: true) Ethnicity (type: esriFieldTypeString, alias: Ethnicity, SQL Type: sqlTypeOther, length: 15, nullable: true, editable: true) AgeGroup (type: esriFieldTypeString, alias: AgeGroup, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) Gender (type: esriFieldTypeString, alias: Gender, SQL Type: sqlTypeOther, length: 6, nullable: true, editable: true) Id (type: esriFieldTypeInteger, alias: Id, SQL Type: sqlTypeOther, nullable: true, editable: true) OBJECTID (type: esriFieldTypeOID, alias: OBJECTID, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) GlobalID (type: esriFieldTypeGlobalID, alias: GlobalID, SQL Type: sqlTypeOther, length: 38, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 11/15/2022 7:06:35 AM Schema Last Edit Date: 11/15/2022 7:06:29 AM Data Last Edit Date: 11/15/2022 7:06:35 AM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4126,https://www.arcgis.com/sharing/rest/content/items/cb520426a7b94b13a2e4aae961037353/data,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -4127,https://services1.arcgis.com/79kfd2K6fskCAkyg/arcgis/rest/services/Louisville_Metro_KY_Uniform_Citation_Data_2020/FeatureServer/0,Citations,Police & Public Interactions,Layer: Louisville_Metro_KY_Uniform_Citation_Data_2020 (ID:0),"",200,Home,[],"[""Layer: Louisville_Metro_KY_Uniform_Citation_Data_2020 (ID:0)""]",[],[],[],[],"JSON Layer: Louisville_Metro_KY_Uniform_Citation_Data_2020 (ID:0) Name: Louisville_Metro_KY_Uniform_Citation_Data_2020 Display Field: Type: Table Description: Copyright Text: Max Record Count: 1000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: ObjectId Unique ID Field: Name : ObjectId IsSystemMaintained : True Global ID Field: Type ID Field: Fields: AGENCY_DESC (type: esriFieldTypeString, alias: AGENCY_DESC, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) BADGE_ID (type: esriFieldTypeInteger, alias: BADGE ID, SQL Type: sqlTypeInteger, nullable: true, editable: true) CASE_NUMBER (type: esriFieldTypeString, alias: CASE_NUMBER, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) CITATION_YEAR (type: esriFieldTypeInteger, alias: CITATION_YEAR, SQL Type: sqlTypeInteger, nullable: true, editable: true) CITATION_CONTROL_NUMBER (type: esriFieldTypeString, alias: CITATION_CONTROL_NUMBER, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) CITATION_TYPE_DESC (type: esriFieldTypeString, alias: CITATION_TYPE_DESC, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) CITATION_DATE (type: esriFieldTypeDate, alias: CITATION_DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) CITATION_LOCATION (type: esriFieldTypeString, alias: CITATION_LOCATION, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) DIVISION (type: esriFieldTypeString, alias: DIVISION, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) BEAT (type: esriFieldTypeString, alias: BEAT, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) PERSONS_SEX (type: esriFieldTypeString, alias: PERSONS_SEX, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PERSONS_RACE (type: esriFieldTypeString, alias: PERSONS_RACE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PERSONS_ETHNICITY (type: esriFieldTypeString, alias: PERSONS_ETHNICITY, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PERSONS_AGE (type: esriFieldTypeString, alias: PERSONS_AGE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) PERSONS_HOME_CITY (type: esriFieldTypeString, alias: PERSONS_HOME_CITY, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PERSONS_HOME_STATE (type: esriFieldTypeString, alias: PERSONS_HOME_STATE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PERSONS_HOME_ZIP (type: esriFieldTypeString, alias: PERSONS_HOME_ZIP, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) VIOLATION_CODE (type: esriFieldTypeString, alias: VIOLATION_CODE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) ASCF_CODE (type: esriFieldTypeString, alias: ASCF_CODE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) STATUTE (type: esriFieldTypeString, alias: STATUTE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) CHARGE_DESC (type: esriFieldTypeString, alias: CHARGE_DESC, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) UCR_CODE (type: esriFieldTypeString, alias: UCR_CODE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) UCR_DESC (type: esriFieldTypeString, alias: UCR_DESC, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) ObjectId (type: esriFieldTypeOID, alias: ObjectId, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 3/2/2023 2:07:37 PM Schema Last Edit Date: 3/2/2023 2:07:37 PM Data Last Edit Date: 3/2/2023 2:07:37 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4128,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_Use_of_control_2017/FeatureServer/0,Use of Force Reports,Police & Public Interactions,Layer: LPD_Use_of_control_2017 (ID:0),"",200,Home,[],"[""Layer: LPD_Use_of_control_2017 (ID:0)""]",[],[],[],[],"JSON Layer: LPD_Use_of_control_2017 (ID:0) Name: LPD_Use_of_control_2017 Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: FID Unique ID Field: Name : FID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: CASE_NUMBER (type: esriFieldTypeString, alias: CASE NUMBER, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) RACE (type: esriFieldTypeString, alias: RACE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) SEX (type: esriFieldTypeString, alias: SEX, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) AGE (type: esriFieldTypeInteger, alias: AGE, SQL Type: sqlTypeInteger, nullable: true, editable: true) RESISTANCE_LEVEL (type: esriFieldTypeString, alias: RESISTANCE LEVEL, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) FORCE_LEVEL (type: esriFieldTypeString, alias: FORCE LEVEL, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) PHYSICAL (type: esriFieldTypeString, alias: PHYSICAL, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) PRESSURE_POINT (type: esriFieldTypeString, alias: PRESSURE POINT, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) COME_ALONG (type: esriFieldTypeString, alias: COME ALONG, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) ACTIVE_COUNTERMEASURE (type: esriFieldTypeString, alias: ACTIVE COUNTERMEASURE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) SHOULDER_PIN (type: esriFieldTypeString, alias: SHOULDER PIN, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) OC_SPRAY (type: esriFieldTypeString, alias: OC SPRAY, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) FIREARM (type: esriFieldTypeString, alias: FIREARM, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) HANDCUFFS (type: esriFieldTypeString, alias: HANDCUFFS, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) BATON (type: esriFieldTypeString, alias: BATON, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) TASER (type: esriFieldTypeString, alias: TASER, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) K_9 (type: esriFieldTypeString, alias: K-9, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) OFFICER_INJURED_NO_MED (type: esriFieldTypeString, alias: OFFICER INJURED-NO MED, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) OFFICER_INJURED_MED_REQ (type: esriFieldTypeString, alias: OFFICER INJURED-MED REQ, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) SUSPECT_INJURED_NO_MED (type: esriFieldTypeString, alias: SUSPECT INJURED-NO MED, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) SUSPECT_INJURED_MED_REQ (type: esriFieldTypeString, alias: SUSPECT INJURED-MED REQ, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) FID (type: esriFieldTypeOID, alias: FID, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 2/21/2024 7:23:27 PM Schema Last Edit Date: 2/21/2024 7:23:26 PM Data Last Edit Date: 2/21/2024 7:23:26 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4129,https://services2.arcgis.com/qvkbeam7Wirps6zC/arcgis/rest/services/911_Calls_New/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: CallsForService (ID:0),"",200,Home,[],"[""Layer: CallsForService (ID:0)""]",[],[],[],[],"JSON Layer: CallsForService (ID:0) View In: Map Viewer Name: CallsForService Display Field: Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Min. Scale: 36978596 Max. Scale: 0 Default Visibility: true Max Record Count: 1000 Supported query Formats: JSON Use Standardized Queries: True Extent: XMin: -9365554.48195368 YMin: 5173208.44064045 XMax: -9225346.16114346 YMax: 5258688.66507252 Spatial Reference: 102100 (3857) Drawing Info: {""renderer"":{""type"":""simple"",""symbol"":{""type"":""esriPMS"",""url"":""RedSphere.png"",""imageData"":""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"",""contentType"":""image/png"",""width"":15,""height"":15}}} HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: ObjectId Unique ID Field: Name : ObjectId IsSystemMaintained : True Global ID Field: Type ID Field: Fields: incident_id (type: esriFieldTypeString, alias: incident_id, SQL Type: sqlTypeNVarchar, length: 2147483647, nullable: true, editable: true) agency (type: esriFieldTypeString, alias: agency, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) incident_address (type: esriFieldTypeString, alias: incident_address, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) zip_code (type: esriFieldTypeString, alias: zip_code, SQL Type: sqlTypeNVarchar, length: 2147483647, nullable: true, editable: true) priority (type: esriFieldTypeString, alias: priority, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) callcode (type: esriFieldTypeString, alias: callcode, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) calldescription (type: esriFieldTypeString, alias: calldescription, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) category (type: esriFieldTypeString, alias: category, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) call_timestamp (type: esriFieldTypeDate, alias: call_timestamp, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) precinct_sca (type: esriFieldTypeString, alias: precinct_sca, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) respondingunit (type: esriFie" -4130,https://www.arcgis.com/sharing/rest/content/items/f157f98fbaf040cd8240f6764ef731b0/data,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -4131,https://www.denvergov.org/media/gis/DataCatalog/denver_police_officer_involved_shootings/csv/denver_police_officer_involved_shootings.csv,Officer Involved Shootings,Police & Public Interactions,"","",200,"","","","","","","","" -4132,https://services1.arcgis.com/79kfd2K6fskCAkyg/arcgis/rest/services/Louisville_Metro_KY_Uniform_Citation_Data_2022/FeatureServer/0,Citations,Police & Public Interactions,Layer: Louisville_Metro_KY_Uniform_Citation_Data_2022 (ID:0),"",200,Home,[],"[""Layer: Louisville_Metro_KY_Uniform_Citation_Data_2022 (ID:0)""]",[],[],[],[],"JSON Layer: Louisville_Metro_KY_Uniform_Citation_Data_2022 (ID:0) Name: Louisville_Metro_KY_Uniform_Citation_Data_2022 Display Field: Type: Table Description: Copyright Text: Max Record Count: 1000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: ObjectId Unique ID Field: Name : ObjectId IsSystemMaintained : True Global ID Field: Type ID Field: Fields: AGENCY_DESC (type: esriFieldTypeString, alias: AGENCY_DESC, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) BADGE_ID (type: esriFieldTypeInteger, alias: BADGE ID, SQL Type: sqlTypeInteger, nullable: true, editable: true) CASE_NUMBER (type: esriFieldTypeString, alias: CASE_NUMBER, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) CITATION_YEAR (type: esriFieldTypeInteger, alias: CITATION_YEAR, SQL Type: sqlTypeInteger, nullable: true, editable: true) CITATION_CONTROL_NUMBER (type: esriFieldTypeString, alias: CITATION_CONTROL_NUMBER, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) CITATION_TYPE_DESC (type: esriFieldTypeString, alias: CITATION_TYPE_DESC, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) CITATION_DATE (type: esriFieldTypeDate, alias: CITATION_DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) CITATION_LOCATION (type: esriFieldTypeString, alias: CITATION_LOCATION, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) DIVISION (type: esriFieldTypeString, alias: DIVISION, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) BEAT (type: esriFieldTypeString, alias: BEAT, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) PERSONS_SEX (type: esriFieldTypeString, alias: PERSONS_SEX, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PERSONS_RACE (type: esriFieldTypeString, alias: PERSONS_RACE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PERSONS_ETHNICITY (type: esriFieldTypeString, alias: PERSONS_ETHNICITY, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PERSONS_AGE (type: esriFieldTypeString, alias: PERSONS_AGE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) PERSONS_HOME_CITY (type: esriFieldTypeString, alias: PERSONS_HOME_CITY, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PERSONS_HOME_STATE (type: esriFieldTypeString, alias: PERSONS_HOME_STATE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PERSONS_HOME_ZIP (type: esriFieldTypeString, alias: PERSONS_HOME_ZIP, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) VIOLATION_CODE (type: esriFieldTypeString, alias: VIOLATION_CODE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) ASCF_CODE (type: esriFieldTypeString, alias: ASCF_CODE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) STATUTE (type: esriFieldTypeString, alias: STATUTE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) CHARGE_DESC (type: esriFieldTypeString, alias: CHARGE_DESC, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) UCR_CODE (type: esriFieldTypeString, alias: UCR_CODE, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) UCR_DESC (type: esriFieldTypeString, alias: UCR_DESC, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) ObjectId (type: esriFieldTypeOID, alias: ObjectId, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 3/23/2023 1:07:15 PM Schema Last Edit Date: 3/23/2023 1:07:15 PM Data Last Edit Date: 3/23/2023 1:07:15 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4133,https://services7.arcgis.com/uRrQ0O3z2aaiIWYU/arcgis/rest/services/2019_Calls_for_Service/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: 2019_Calls_for_Service (ID:0),"",200,Home,[],"[""Layer: 2019_Calls_for_Service (ID:0)""]",[],[],[],[],"JSON Layer: 2019_Calls_for_Service (ID:0) View In: Map Viewer Name: 2019_Calls_for_Service Display Field: DESCRIPTION Type: Feature Layer Geometry Type: esriGeometryPoint Description: Calls_for_Service Copyright Text: Min. Scale: 0 Max. Scale: 0 Default Visibility: true Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True Extent: XMin: 6058509.2807163 YMin: 1973182.28328331 XMax: 6094442.66718271 YMax: 2007211.91273047 Spatial Reference: 102643 (2227) Drawing Info: {""renderer"":{""type"":""simple"",""symbol"":{""type"":""esriSMS"",""style"":""esriSMSCircle"",""color"":[245,252,209,255],""size"":4,""angle"":0,""xoffset"":0,""yoffset"":0,""outline"":{""color"":[0,0,0,255],""width"":0.7}}},""scaleSymbols"":true,""transparency"":0,""labelingInfo"":null} HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Object ID Field: OBJECTID Unique ID Field: Name : OBJECTID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID (type: esriFieldTypeOID, alias: OBJECTID, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) DESCRIPTION (type: esriFieldTypeString, alias: Description, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) DATE (type: esriFieldTypeDate, alias: Date, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) DAYOFWEEK (type: esriFieldTypeString, alias: Day of Week, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: Time, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) LOCATION (type: esriFieldTypeString, alias: Location, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) TIMERECEIVED (type: esriFieldTypeString, alias: Time Reveived, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) TIMEONSCENE (type: esriFieldTypeString, alias: Time on Scene, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) TIMECLEARED (type: esriFieldTypeString, alias: Time Cleared, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) SERVICEAREA (type: esriFieldTypeString, alias: Service Area, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) DISPOSITION (type: esriFieldTypeString, alias: Disposition, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) BEAT (type: esriFieldTypeString, alias: Beat, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) Templates: Name: 2019_Calls_for_Service Description: Drawing Tool: esriFeatureEditToolPoint Prototype: Attributes: DISPOSITION : BEAT : DESCRIPTION : DATE : -2209161600000 DAYOFWEEK : TIME : LOCATION : TIMERECEIVED : TIMEONSCENE : TIMECLEARED : SERVICEAREA : Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 2/10/2022 5:50:14 PM Schema Last Edit Date: 2/10/2022 5:50:14 PM Data Last Edit Date: 2/10/2022 5:50:14 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates View In: Map Viewer " -4134,data.lacity.org/resource/iy4q-t9vr.json,Calls for Service,Police & Public Interactions,LAPD Calls for Service 2010 | Los Angeles - Open Data Portal,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""LAPD Calls for Service 2010"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""LAPD Calls for Service 2010"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Committed Update Frequency"", ""Data Owner"", ""Location Specified"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Sign In Data Catalog Geohub Blog Developer Resources About Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Search -4135,https://gis.greensboro-nc.gov/arcgis/rest/services/OpenGateCity/OpenData_ES_DS/MapServer/16,Stops,Police & Public Interactions,Layer: POL_traffic_5years (ID: 16),"",200,"Official Greensboro, NC, City Government Web Site",[],"[""Layer: POL_traffic_5years (ID: 16)""]",[],[],[],[],"Name: POL_traffic_5years Display Field: case_id Type: Table Geometry Type: N/A Description: null Copyright Text: N/A Default Visibility: false MaxRecordCount: 100000 Supported Query Formats: JSON, PBF Supports Advanced Queries: true Supports Statistics: true Use Standardized Queries: true Extent: Drawing Info: N/A Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: false Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false Supports Binning LOD: false Supports Query With LOD Spatial Reference: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeNone Type ID Field: null Fields: ID ( -type: esriFieldTypeOID, alias: ID -) case_id ( -type: esriFieldTypeString, alias: case_id, length: 30 -) stopdate ( -type: esriFieldTypeDate, alias: stopdate, length: 8 -) statepid ( -type: esriFieldTypeString, alias: statepid, length: 30 -) address ( -type: esriFieldTypeString, alias: address, length: 255 -) race ( -type: esriFieldTypeString, alias: race, length: 10 -) ethnic ( -type: esriFieldTypeString, alias: ethnic, length: 10 -) sex ( -type: esriFieldTypeString, alias: sex, length: 10 -) violation ( -type: esriFieldTypeString, alias: violation, length: 20 -) enfaction ( -type: esriFieldTypeString, alias: enfaction, length: 20 -) search ( -type: esriFieldTypeString, alias: search, length: 10 -) district ( -type: esriFieldTypeString, alias: district, length: 10 -) zone ( -type: esriFieldTypeString, alias: zone, length: 10 -) tract ( -type: esriFieldTypeString, alias: tract, length: 10 -) X_Coord ( -type: esriFieldTypeInteger, alias: X_Coord -) Y_Coord ( -type: esriFieldTypeInteger, alias: Y_Coord -) Supported Operations : Query Query Attachments Query Analytic Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4136,https://data.littlerock.gov/Safe-City/Police-Calls-for-Service-December-2020-to-Year-to-/piyt-g5xb,Calls for Service,Police & Public Interactions,Police Calls for Service December 2020 to Year to Date | City of Little Rock Open Data and Performance,"",200,City of Little Rock Open Data and Performance,"[""Map of Police Calls for Service"", ""Map of Police Calls for Service - Point Map"", ""Police Calls for Service by Patrol District"", ""Top 20 Police Dispatched Call Types"", ""Dispatched Police Calls January 2021 to Present"", ""Police Calls for Service by Call Type for Current Quarter"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Police Calls for Service December 2020 to Year to Date"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Police Calls for Service December 2020 to Year to Date"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Police Calls for Service by Call Type for Current Quarter …"", ""Map of Police Calls for Service - Point Map …"", ""Police Calls for Service by Patrol District …"", ""Dataset Details"", ""Topics"", ""Licensing and Attribution"", ""Police Calls for Service by Call Type for Current Quarter …"", ""Map of Police Calls for Service - Point Map …"", ""Police Calls for Service by Patrol District …""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Menu Menu Close Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Sign In Search Sign In Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Menu Sign In Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Menu Sign In Sign In Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Menu Close Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Sign In Search Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Sign In Search Home About User Guide Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Data Apps City Wallet Citizen Connect Mapping Applications Data Catalog Performance Measures Resources Additional Data Sources Performance & Innovation City of Little Rock Website Socrata Knowledge Base Socrata Video Tutorials Socrata Developer Resources Sign In Search Search -4137,https://data.virginia.gov/Public-Safety/Open-View-Henrico-County-Calls-for-Service/g7aq-7uu3,Calls for Service,Police & Public Interactions,"","",404,"","","","","","","","" -4138,policeview.johnscreekga.gov/resource/gezc-jm4k.json,Incident Reports,Police & Public Interactions,Accident | Johns Creek Police Department | Performance Management,"",200,Error retrieving title: No connection adapters were found for '://',"[""Johns Creek Accident Data Analysis"", ""Hot Spot - 2015 Accidents"", ""2015 Accident totals by month Column"", ""2015 Accidents DOW Column"", ""2014 Accidents by DOW Column"", ""2014 Accidents Column by Month"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Accident"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Accident"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home Police Stats Tutorial Developer Sign In Menu Menu Close Home Police Stats Tutorial Developer Sign In Search Search Home Police Stats Tutorial Developer Sign In Menu Search Search Search Search Home Police Stats Tutorial Developer Sign In Menu Home Police Stats Tutorial Developer Sign In Menu Home Police Stats Tutorial Developer Home Police Stats Tutorial Developer Sign In Sign In Menu Close Home Police Stats Tutorial Developer Sign In Search Home Police Stats Tutorial Developer Sign In Search Home Police Stats Tutorial Developer Sign In Search Search -4139,https://www.arcgis.com/sharing/rest/content/items/dec527060160470c8a135dc26764ebac/data,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -4140,https://www.arcgis.com/sharing/rest/content/items/0f07240fe4d941e89d23c8b4541453c1/data,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -4141,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_traffic_stops_2015/FeatureServer/0,Stops,Police & Public Interactions,Layer: LPD_traffic_stops_2015 (ID:0),"",200,Home,[],"[""Layer: LPD_traffic_stops_2015 (ID:0)""]",[],[],[],[],"JSON Layer: LPD_traffic_stops_2015 (ID:0) Name: LPD_traffic_stops_2015 Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: FID Unique ID Field: Name : FID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeDate, alias: TIME, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) RACE (type: esriFieldTypeInteger, alias: RACE, SQL Type: sqlTypeInteger, nullable: true, editable: true) SEX (type: esriFieldTypeInteger, alias: SEX, SQL Type: sqlTypeInteger, nullable: true, editable: true) REASON (type: esriFieldTypeInteger, alias: REASON, SQL Type: sqlTypeInteger, nullable: true, editable: true) OUTCOME (type: esriFieldTypeInteger, alias: OUTCOME, SQL Type: sqlTypeInteger, nullable: true, editable: true) SEARCH (type: esriFieldTypeInteger, alias: SEARCH, SQL Type: sqlTypeInteger, nullable: true, editable: true) FID (type: esriFieldTypeOID, alias: FID, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4142,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/Pursuits_2020_2021/FeatureServer/0,Vehicle Pursuits,Police & Public Interactions,Layer: Pursuits_2020_2021 (ID:0),"",200,Home,[],"[""Layer: Pursuits_2020_2021 (ID:0)""]",[],[],[],[],"JSON Layer: Pursuits_2020_2021 (ID:0) Name: Pursuits_2020_2021 Display Field: Type: Table Description: Copyright Text: Max Record Count: 1000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: ObjectId Unique ID Field: Name : ObjectId IsSystemMaintained : True Global ID Field: Type ID Field: Fields: DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) REASON (type: esriFieldTypeString, alias: REASON, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) OSPEED (type: esriFieldTypeInteger, alias: OSPEED, SQL Type: sqlTypeInteger, nullable: true, editable: true) VSPEED (type: esriFieldTypeString, alias: VSPEED, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) MIN_ (type: esriFieldTypeInteger, alias: MIN, SQL Type: sqlTypeInteger, nullable: true, editable: true) TERM (type: esriFieldTypeString, alias: TERM, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) SS (type: esriFieldTypeString, alias: SS, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) RB (type: esriFieldTypeString, alias: RB, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) BOX (type: esriFieldTypeString, alias: BOX, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) RAM (type: esriFieldTypeString, alias: RAM, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) CHARGS (type: esriFieldTypeString, alias: CHARGS, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) ACC (type: esriFieldTypeString, alias: ACC, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PATH (type: esriFieldTypeString, alias: PATH, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) ObjectId (type: esriFieldTypeOID, alias: ObjectId, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 5/5/2022 1:45:12 PM Schema Last Edit Date: 5/5/2022 1:45:12 PM Data Last Edit Date: 5/5/2022 1:45:12 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4143,https://services7.arcgis.com/uRrQ0O3z2aaiIWYU/arcgis/rest/services/Police_Calls_for_Service_2018/FeatureServer/4,Calls for Service,Police & Public Interactions,Layer: Calls for Service 2018 (ID:4),"",200,Home,[],"[""Layer: Calls for Service 2018 (ID:4)""]",[],[],[],[],"JSON Layer: Calls for Service 2018 (ID:4) View In: Map Viewer Name: Calls for Service 2018 Display Field: DESCRIPTION Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Min. Scale: 0 Max. Scale: 0 Default Visibility: true Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True Extent: XMin: 6058492.50056614 YMin: 1978302.67953856 XMax: 6090323.79517114 YMax: 2004087.56694506 Spatial Reference: 102643 (2227) Drawing Info: {""renderer"":{""type"":""simple"",""symbol"":{""type"":""esriSMS"",""style"":""esriSMSCircle"",""color"":[160,38,148,255],""size"":4,""angle"":0,""xoffset"":0,""yoffset"":0,""outline"":{""color"":[0,0,0,255],""width"":0.7}}},""scaleSymbols"":true,""transparency"":0,""labelingInfo"":null} HasZ: true HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Object ID Field: OBJECTID Unique ID Field: Name : OBJECTID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID (type: esriFieldTypeOID, alias: OBJECTID, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) DESCRIPTION (type: esriFieldTypeString, alias: DESCRIPTION, SQL Type: sqlTypeOther, length: 2048, nullable: true, editable: true) DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) DAYOFWEEK (type: esriFieldTypeString, alias: DAYOFWEEK, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) LOCATION (type: esriFieldTypeString, alias: LOCATION, SQL Type: sqlTypeOther, length: 48, nullable: true, editable: true) AREA (type: esriFieldTypeString, alias: AREA, SQL Type: sqlTypeOther, length: 6, nullable: true, editable: true) BEAT (type: esriFieldTypeString, alias: BEAT, SQL Type: sqlTypeOther, length: 6, nullable: true, editable: true) TIME_RECEIVED (type: esriFieldTypeString, alias: TIME_RECEIVED, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) TIME_ON_SCENE (type: esriFieldTypeString, alias: TIME_ON_SCENE, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) TIME_CLEARED (type: esriFieldTypeString, alias: TIME_CLEARED, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) DISPOSITION (type: esriFieldTypeString, alias: DISPOSITION, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) Templates: Name: Calls for Service 2018 Description: Drawing Tool: esriFeatureEditToolPoint Prototype: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 2/10/2022 5:29:25 PM Schema Last Edit Date: 2/10/2022 5:29:25 PM Data Last Edit Date: 2/10/2022 5:29:25 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates View In: Map Viewer " -4145,https://openpolicing.stanford.edu/data/,Stops,Police & Public Interactions,Data - The Stanford Open Policing Project,Download the data used in our analysis.,200,The Stanford Open Policing Project,"[""Data""]","[""About the data"", ""Data downloads"", ""Partners""]",[],[],"[""View our code on Github""]",[],"Data Tutorials Findings Publications News Explore Data Tutorials Findings Publications News Explore Data Download the data used in our analysis. Data Download the data used in our analysis. About the data Standardized stop data are available to download (by location) from the table below. We provide these data in both CSV and RDS formats. In addition, shapefiles are available for select locations. The table includes a subset of common fields for each location, and indicates whether data are available for at least 70% of records in that location. Some locations have more fields. The reasons for this are documented in the README file. We encourage you to review the location-specific details in the README file before getting started working with the data on your own. The original, unprocessed data we collected contain even more information. We do not document the raw data, but we do provide any documentation we received. Please contact us to access the original records. Additional policing data are available through OpenPoliceData . The Stanford Open Policing Project data are made available under the Open Data Commons Attribution License . When using the data in research publications, please cite our paper : E. Pierson, C. Simoiu, J. Overgoor, S. Corbett-Davies, D. Jenson, A. Shoemaker, V. Ramachandran, P. Barghouty, C. Phillips, R. Shroff, and S. Goel. “A large-scale analysis of racial disparities in police stops across the United States”. Nature Human Behaviour, Vol. 4, 2020. Data downloads Please note that many of these datasets are too large for Excel and will -require programs like R or Python to open. About the data Standardized stop data are available to download (by location) from the table below. We provide these data in both CSV and RDS formats. In addition, shapefiles are available for select locations. The table includes a subset of common fields for each location, and indicates whether data are available for at least 70% of records in that location. Some locations have more fields. The reasons for this are documented in the README file. We encourage you to review the location-specific details in the README file before getting started working with the data on your own. The original, unprocessed data we collected contain even more information. We do not document the raw data, but we do provide any documentation we received. Please contact us to access the original records. Additional policing data are available through OpenPoliceData . The Stanford Open Policing Project data are made available under the Open Data Commons Attribution License . When using the data in research publications, please cite our paper : E. Pierson, C. Simoiu, J. Overgoor, S. Corbett-Davies, D. Jenson, A. Shoemaker, V. Ramachandran, P. Barghouty, C. Phillips, R. Shroff, and S. Goel. “A large-scale analysis of racial disparities in police stops across the United States”. Nature Human Behaviour, Vol. 4, 2020. Data downloads Please note that many of these datasets are too large for Excel and will -require programs like R or Python to open. " -4146,https://policedata-fcpdgis.hub.arcgis.com/pages/fairfax-county-warnings,Stops,Police & Public Interactions,ArcGIS Hub,"Discover, analyze and download data from ArcGIS Hub. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",200,ArcGIS Hub,[],[],[],[],[],[],"" -4147,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/Pursuits_2017/FeatureServer/0,Vehicle Pursuits,Police & Public Interactions,Layer: Pursuits_2017 (ID:0),"",200,Home,[],"[""Layer: Pursuits_2017 (ID:0)""]",[],[],[],[],"JSON Layer: Pursuits_2017 (ID:0) Name: Pursuits_2017 Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: FID Unique ID Field: Name : FID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) REASON (type: esriFieldTypeString, alias: REASON, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) OFFICERSPEED (type: esriFieldTypeInteger, alias: OFFICERSPEED, SQL Type: sqlTypeInteger, nullable: true, editable: true) VIOLATORSPEED (type: esriFieldTypeInteger, alias: VIOLATORSPEED, SQL Type: sqlTypeInteger, nullable: true, editable: true) DURATIONMIN (type: esriFieldTypeInteger, alias: DURATIONMIN, SQL Type: sqlTypeInteger, nullable: true, editable: true) TERMINATION (type: esriFieldTypeString, alias: TERMINATION, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) STOPSTICKS (type: esriFieldTypeString, alias: STOPSTICKS, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) ROADBLOCK (type: esriFieldTypeString, alias: ROADBLOCK, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) BOXING (type: esriFieldTypeString, alias: BOXING, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) INTENTIONALCONTACT (type: esriFieldTypeString, alias: INTENTIONALCONTACT, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) CHARGES (type: esriFieldTypeString, alias: CHARGES, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) CRASH (type: esriFieldTypeString, alias: CRASH, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) PATH (type: esriFieldTypeString, alias: PATH, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) FID (type: esriFieldTypeOID, alias: FID, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4148,https://www.arcgis.com/sharing/rest/content/items/2817de0e44394cc7987c5414efe943d6/data,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -4149,https://data.fayettevillenc.gov/search?tags=Police,List of Data Sources,Info About Agencies,City of Fayetteville Open Data Portal,City of Fayetteville Hub Site,200,City of Fayetteville Open Data Portal,[],[],[],[],[],[],"" -4150,https://services1.arcgis.com/pNPbgWy7hpfFGWoZ/arcgis/rest/services/OfficerInvolvedShooting/FeatureServer/0,Officer Involved Shootings,Police & Public Interactions,Home,"",200,Home,[],"[""Home""]",[],[],[],[],JSON Home Token Required Token Required -4152,https://services1.arcgis.com/pNPbgWy7hpfFGWoZ/arcgis/rest/services/Lansing_MI_Police_Citizen_Complaints/FeatureServer/0,Complaints & Misconduct,Info About Officers,Home,"",200,Home,[],"[""Home""]",[],[],[],[],JSON Home Token Required Token Required -4153,data.lacity.org/resource/4tmc-7r6g.json,Calls for Service,Police & Public Interactions,LAPD Calls for Service 2011 | Los Angeles - Open Data Portal,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""LAPD Calls for Service 2011"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""LAPD Calls for Service 2011"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Committed Update Frequency"", ""Data Owner"", ""Location Specified"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Sign In Data Catalog Geohub Blog Developer Resources About Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Search -4154,data.lacity.org/resource/nayp-w2tw.json,Calls for Service,Police & Public Interactions,LAPD Calls for Service 2018 | Los Angeles - Open Data Portal,"",200,Error retrieving title: No connection adapters were found for '://',"[""2018 CFS First Half of Year"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""LAPD Calls for Service 2018"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""LAPD Calls for Service 2018"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Committed Update Frequency"", ""Data Owner"", ""Location Specified"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Sign In Data Catalog Geohub Blog Developer Resources About Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Search -4155,https://www.arcgis.com/sharing/rest/content/items/b8d4004c38864f36807fee10b9a4890b/data,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -4156,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/Pursuits_2019/FeatureServer/0,Vehicle Pursuits,Police & Public Interactions,Layer: Pursuits_2019 (ID:0),"",200,Home,[],"[""Layer: Pursuits_2019 (ID:0)""]",[],[],[],[],"JSON Layer: Pursuits_2019 (ID:0) Name: Pursuits_2019 Display Field: Type: Table Description: Copyright Text: Max Record Count: 1000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: ObjectId3 Unique ID Field: Name : ObjectId3 IsSystemMaintained : True Global ID Field: Type ID Field: Fields: DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) FIXTIME (type: esriFieldTypeDate, alias: FIXTIME, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) REASON (type: esriFieldTypeString, alias: REASON, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) OFFICERSPEED (type: esriFieldTypeInteger, alias: OFFICERSPEED, SQL Type: sqlTypeInteger, nullable: true, editable: true) VIOLATORSPEED (type: esriFieldTypeString, alias: VIOLATORSPEED, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) DURATIONMIN (type: esriFieldTypeInteger, alias: DURATIONMIN, SQL Type: sqlTypeInteger, nullable: true, editable: true) TERMINATION (type: esriFieldTypeString, alias: TERMINATION, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) STOPSTICKS (type: esriFieldTypeString, alias: STOPSTICKS, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) ROADBLOCK (type: esriFieldTypeString, alias: ROADBLOCK, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) BOXING (type: esriFieldTypeString, alias: BOXING, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) INTENTIONAL_CONTACT (type: esriFieldTypeString, alias: INTENTIONAL_CONTACT, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) CHARGES (type: esriFieldTypeString, alias: CHARGES, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) CRASH (type: esriFieldTypeString, alias: CRASH, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) PATH (type: esriFieldTypeString, alias: PATH, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) ObjectId (type: esriFieldTypeString, alias: ObjectId, SQL Type: sqlTypeNVarchar, length: 4000, nullable: true, editable: true) ObjectId2 (type: esriFieldTypeInteger, alias: ObjectId2, SQL Type: sqlTypeInteger, nullable: true, editable: true) ObjectId3 (type: esriFieldTypeOID, alias: ObjectId3, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 5/5/2022 1:50:35 PM Schema Last Edit Date: 5/5/2022 1:50:35 PM Data Last Edit Date: 5/5/2022 1:50:35 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4157,https://live-durhamnc.opendata.arcgis.com/search?q=police,List of Data Sources,Info About Agencies,"Durham, NC Open Data Portal","City and County of Durham, NC | Open Data Portal",200,"Durham, NC Open Data Portal",[],[],[],[],[],[],"" -4158,https://services.arcgis.com/jjSk6t82vIntwDbs/arcgis/rest/services/LVMPD_Calls_For_Service_All/FeatureServer/0,Calls for Service,Police & Public Interactions,Layer: LVMPD Calls For Service (ID:0),"",200,Home,[],"[""Layer: LVMPD Calls For Service (ID:0)""]",[],[],[],[],JSON Layer: LVMPD Calls For Service (ID:0) -4159,https://www.arcgis.com/sharing/rest/content/items/d493c4ca6c974e89ac05a27698d4d6b4/data,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -4160,data.lacity.org/resource/mgue-vbsx.json,Calls for Service,Police & Public Interactions,LAPD Calls for Service 2014 | Los Angeles - Open Data Portal,"",200,Error retrieving title: No connection adapters were found for '://',"[""2014 CFS COUNTS BY CALL TYPE"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""LAPD Calls for Service 2014"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""LAPD Calls for Service 2014"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Committed Update Frequency"", ""Data Owner"", ""Location Specified"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Sign In Data Catalog Geohub Blog Developer Resources About Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Search -4161,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_traffic_stops_2017/FeatureServer/0,Stops,Police & Public Interactions,Layer: LPD_traffic_stops_2017 (ID:0),"",200,Home,[],"[""Layer: LPD_traffic_stops_2017 (ID:0)""]",[],[],[],[],"JSON Layer: LPD_traffic_stops_2017 (ID:0) Name: LPD_traffic_stops_2017 Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: FID Unique ID Field: Name : FID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) RACE (type: esriFieldTypeInteger, alias: RACE, SQL Type: sqlTypeInteger, nullable: true, editable: true) SEX (type: esriFieldTypeInteger, alias: SEX, SQL Type: sqlTypeInteger, nullable: true, editable: true) REASON (type: esriFieldTypeInteger, alias: REASON, SQL Type: sqlTypeInteger, nullable: true, editable: true) OUTCOME (type: esriFieldTypeInteger, alias: OUTCOME, SQL Type: sqlTypeInteger, nullable: true, editable: true) SEARCH (type: esriFieldTypeInteger, alias: SEARCH, SQL Type: sqlTypeInteger, nullable: true, editable: true) FID (type: esriFieldTypeOID, alias: FID, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4162,data.lacity.org/resource/D5tf-ez2w.json,Incident Reports,Police & Public Interactions,"","",404,"","","","","","","","" -4163,https://www.arcgis.com/sharing/rest/content/items/9d91ddd193e245528dac6073daff4633/data,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -4164,https://data.lacity.org/Public-Safety/Vehicle-and-Pedestrian-Stop-Data-2010-to-Present/ci25-wgt7,Stops,Police & Public Interactions,"Vehicle and Pedestrian Stop Data 2010 to June 30th, 2018 | Los Angeles - Open Data Portal","",200,"DataLA: Information, Insights, and Analysis from the City of Angels | Los Angeles - Open Data Portal","[""Vehicle and Pedestrian Stop Data 2010 to Present by Race and Division"", ""2014-2017_VehPed_stops"", ""2014-2017_VehPed_stops"", ""2016-2017_VehPed_stops"", ""Vehicle and Pedestrian Stop Data 2010 to Present"", ""Vehicle and Pedestrian Stop Data 2010 to Present by Race"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Vehicle and Pedestrian Stop Data 2010 to June 30th, 2018"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Vehicle and Pedestrian Stop Data 2010 to June 30th, 2018"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Committed Update Frequency"", ""Data Owner"", ""Location Specified"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Sign In Data Catalog Geohub Blog Developer Resources About Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Search -4165,https://policedata-fcpdgis.hub.arcgis.com/pages/fairfax-county-citations,Citations,Police & Public Interactions,ArcGIS Hub,"Discover, analyze and download data from ArcGIS Hub. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",200,ArcGIS Hub,[],[],[],[],[],[],"" -4166,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_Traffic_Stops_2020_2021/FeatureServer/0,Stops,Police & Public Interactions,Layer: LPD_Traffic_Stops_2020_2021 (ID:0),"",200,Home,[],"[""Layer: LPD_Traffic_Stops_2020_2021 (ID:0)""]",[],[],[],[],"JSON Layer: LPD_Traffic_Stops_2020_2021 (ID:0) Name: LPD_Traffic_Stops_2020_2021 Display Field: Type: Table Description: Copyright Text: Max Record Count: 1000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: ObjectId Unique ID Field: Name : ObjectId IsSystemMaintained : True Global ID Field: Type ID Field: Fields: DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) RACE (type: esriFieldTypeString, alias: RACE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) SEX (type: esriFieldTypeString, alias: SEX, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) REASON (type: esriFieldTypeString, alias: REASON, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) OUTCOME (type: esriFieldTypeInteger, alias: OUTCOME, SQL Type: sqlTypeInteger, nullable: true, editable: true) SEARCH (type: esriFieldTypeInteger, alias: SEARCH, SQL Type: sqlTypeInteger, nullable: true, editable: true) ObjectId (type: esriFieldTypeOID, alias: ObjectId, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 5/5/2022 5:22:10 PM Schema Last Edit Date: 5/5/2022 5:22:10 PM Data Last Edit Date: 5/5/2022 5:22:10 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4167,https://gismaps.ci.fayetteville.nc.us/opendata/rest/services/Police/TSR/MapServer/0,Stops,Police & Public Interactions,Layer: TSR (ID: 0),"",200,403 - Forbidden: Access is denied.,[],"[""Layer: TSR (ID: 0)""]",[],[],[],[],"Name: TSR Display Field: emlname Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Default Visibility: true MaxRecordCount: 1000 Supported Query Formats: JSON, geoJSON Min Scale: 0 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Has Labels: false Can Modify Layer: true Can Scale Symbols: false Use Standardized Queries: true Supports Datum Transformation: true Extent: XMin: 9.579956531524658E-5 YMin: -1.3318657875061035E-4 XMax: 2237576.749998972 YMax: 659307.5598579794 Spatial Reference: 102719 - (2264) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [0, 143, 45, 255] Size: 4.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 1 Label: Description: Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false HasZ: false HasM: false Time Info: Start Time Field: stopdate End Time Field: null Track ID Field: null Time Extent: [2016/01/01 05:00:00 UTC, 2024/02/22 10:39:29 UTC] Time Reference: Time Zone: Eastern Standard Time Respects Daylight Saving: true Time Interval: 2 Time Interval Units: esriTimeUnitsMonths Has Live Data: true Export Options: Use Time: true Time Data Cumulative: true Time Offset: null (null) Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID, alias: OBJECTID -) stopdate ( -type: esriFieldTypeDate, alias: stopdate, length: 8 -) eDesc ( -type: esriFieldTypeString, alias: eDesc, length: 55 -) emdivision ( -type: esriFieldTypeString, alias: emdivision, length: 4 -) streetnbr ( -type: esriFieldTypeString, alias: streetnbr, length: 8 -) street ( -type: esriFieldTypeString, alias: street, length: 60 -) vDescription ( -type: esriFieldTypeString, alias: vDescription, length: 55 -) district ( -type: esriFieldTypeString, alias: district, length: 8 -) tract ( -type: esriFieldTypeString, alias: tract, length: 5 -) zone ( -type: esriFieldTypeString, alias: zone, length: 2 -) reportarea ( -type: esriFieldTypeString, alias: reportarea, length: 4 -) SHAPE ( -type: esriFieldTypeGeometry, alias: SHAPE -) age ( -type: esriFieldTypeString, alias: age, length: 50 -) race ( -type: esriFieldTypeString, alias: race, length: 50 -) sex ( -type: esriFieldTypeString, alias: sex, length: 50 -) ethnic ( -type: esriFieldTypeString, alias: ethnic, length: 50 -) consby ( -type: esriFieldTypeString, alias: consby, length: 50 -) case_id ( -type: esriFieldTypeString, alias: case_id, length: 50 -) Supported Operations : Query Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4168,data.lacity.org/resource/cibt-wiru.json,Calls for Service,Police & Public Interactions,LAPD Calls for Service 2021 | Los Angeles - Open Data Portal,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""LAPD Calls for Service 2021"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""LAPD Calls for Service 2021"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Committed Update Frequency"", ""Data Owner"", ""Location Specified"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Sign In Data Catalog Geohub Blog Developer Resources About Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Search -4169,https://xmaps.indy.gov/arcgis/rest/services/OpenData/OpenData_NonSpatial/MapServer/6,Officer Involved Shootings,Police & Public Interactions,Layer: IMPD Officer Involved Shootings (ID: 6),"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Layer: IMPD Officer Involved Shootings (ID: 6)""]",[],[],[],[],"Name: IMPD Officer Involved Shootings Display Field: SERVICE_TYPE Type: Table Geometry Type: N/A Description: null Definition Expression: N/A Copyright Text: N/A Default Visibility: false MaxRecordCount: 1000 Supported Query Formats: JSON, AMF Supports Advanced Queries: true Supports Statistics: true Use Standardized Queries: true Extent: Drawing Info: N/A Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: false Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeNone Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID -, alias: OBJECTID -) INCNUM ( -type: esriFieldTypeInteger -, alias: INCNUM -) SERVICE_TYPE ( -type: esriFieldTypeString -, alias: SERVICE_TYPE -, length: 24 -) OCCURRED_DT ( -type: esriFieldTypeString -, alias: OCCURRED_DT -, length: 10 -) OCCURRED_TM ( -type: esriFieldTypeString -, alias: OCCURRED_TM -, length: 30 -) UDTEXT24A ( -type: esriFieldTypeString -, alias: UDTEXT24A -, length: 50 -) UDTEXT24B ( -type: esriFieldTypeString -, alias: UDTEXT24B -, length: 50 -) UDTEXT24C ( -type: esriFieldTypeString -, alias: UDTEXT24C -, length: 50 -) UDTEXT24D ( -type: esriFieldTypeString -, alias: UDTEXT24D -, length: 50 -) DISPOSITION ( -type: esriFieldTypeString -, alias: DISPOSITION -, length: 24 -) STREET_N ( -type: esriFieldTypeString -, alias: STREET_N -, length: 8 -) STREET ( -type: esriFieldTypeString -, alias: STREET -, length: 120 -) STREET_T ( -type: esriFieldTypeString -, alias: STREET_T -, length: 8 -) STREET_G ( -type: esriFieldTypeString -, alias: STREET_G -, length: 4 -) CITY ( -type: esriFieldTypeString -, alias: CITY -, length: 20 -) CITNUM ( -type: esriFieldTypeInteger -, alias: CITNUM -) SEX ( -type: esriFieldTypeString -, alias: SEX -, length: 40 -) RACE ( -type: esriFieldTypeString -, alias: RACE -, length: 40 -) CIT_AGE ( -type: esriFieldTypeInteger -, alias: CIT_AGE -) CIT_WEAPON ( -type: esriFieldTypeString -, alias: CIT_WEAPON -, length: 24 -) CIT_COND_TYPE ( -type: esriFieldTypeString -, alias: CIT_COND_TYPE -, length: 28 -) OFFNUM ( -type: esriFieldTypeInteger -, alias: OFFNUM -) OFF_WEAPON ( -type: esriFieldTypeString -, alias: OFF_WEAPON -, length: 24 -) OFF_RACE ( -type: esriFieldTypeString -, alias: OFF_RACE -, length: 40 -) OFF_SEX ( -type: esriFieldTypeString -, alias: OFF_SEX -, length: 40 -) OFF_AGE ( -type: esriFieldTypeInteger -, alias: OFF_AGE -) OFF_YR_EMPLOY ( -type: esriFieldTypeInteger -, alias: OFF_YR_EMPLOY -) OFF_COND_TYPE ( -type: esriFieldTypeString -, alias: OFF_COND_TYPE -, length: 28 -) Supported Operations : Query Generate Renderer Return Updates " -4170,data.lacity.org/resource/84iq-i2r6.json,Calls for Service,Police & Public Interactions,LAPD Calls for Service 2020 | Los Angeles - Open Data Portal,"",200,Error retrieving title: No connection adapters were found for '://',"[""LAPD Calls for Service - Excluding Ambulance Calls"", ""bymonth2020"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""LAPD Calls for Service 2020"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""LAPD Calls for Service 2020"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Committed Update Frequency"", ""Data Owner"", ""Location Specified"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Sign In Data Catalog Geohub Blog Developer Resources About Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Search -4171,https://opendata.lincoln.ne.gov/search?tags=safety,List of Data Sources,Info About Agencies,Lincoln Open Data and Performance Management,Lincoln Open Data and Performance Management.,200,Lincoln Open Data and Performance Management,[],[],[],[],[],[],"" -4172,data.lacity.org/resource/xwgr-xw5q.json,Calls for Service,Police & Public Interactions,LAPD Calls for Service 2016 | Los Angeles - Open Data Portal,"",200,Error retrieving title: No connection adapters were found for '://',"[""2016_COUNT BY CALL_TYPE"", ""2016 CFS First Half of Year"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""LAPD Calls for Service 2016"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""LAPD Calls for Service 2016"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Committed Update Frequency"", ""Data Owner"", ""Location Specified"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Data Catalog Geohub Blog Developer Resources About Menu Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Data Catalog Geohub Blog Developer Resources About Menu Sign In Sign In Data Catalog Geohub Blog Developer Resources About Menu Close Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Data Catalog Geohub Blog Developer Resources About Sign In Search Search -4173,https://www.arcgis.com/sharing/rest/content/items/583bc14946854b7eb2fc729049aa39cd/data,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -4174,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_Use_of_control_2019/FeatureServer/0,Use of Force Reports,Police & Public Interactions,Layer: Sheet1 (ID:0),"",200,Home,[],"[""Layer: Sheet1 (ID:0)""]",[],[],[],[],"JSON Layer: Sheet1 (ID:0) Name: Sheet1 Display Field: Type: Table Description: Copyright Text: Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeNone Object ID Field: FID Unique ID Field: Name : FID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: RKY (type: esriFieldTypeString, alias: RKY, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeTimestamp2, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeInteger, alias: TIME, SQL Type: sqlTypeInteger, nullable: true, editable: true) RACE (type: esriFieldTypeString, alias: RACE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) SEX (type: esriFieldTypeString, alias: SEX, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) AGE (type: esriFieldTypeInteger, alias: AGE, SQL Type: sqlTypeInteger, nullable: true, editable: true) RESISTANCE_LEVEL (type: esriFieldTypeString, alias: RESISTANCE_LEVEL, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) FORCE_LEVEL (type: esriFieldTypeString, alias: FORCE_LEVEL, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) PHYSICAL (type: esriFieldTypeString, alias: PHYSICAL, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) PRESSURE_POINT (type: esriFieldTypeString, alias: PRESSURE_POINT, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) COME_ALONG (type: esriFieldTypeString, alias: COME_ALONG, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) ACTIVE_COUNTERMEASURE (type: esriFieldTypeString, alias: ACTIVE_COUNTERMEASURE, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) SHOULDER_PIN (type: esriFieldTypeString, alias: SHOULDER_PIN, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) OC_SPRAY (type: esriFieldTypeString, alias: OC_SPRAY, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) FIREARM (type: esriFieldTypeString, alias: FIREARM, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) HANDCUFFS (type: esriFieldTypeString, alias: HANDCUFFS, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) BATON (type: esriFieldTypeString, alias: BATON, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) TASER (type: esriFieldTypeString, alias: TASER, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) K_9 (type: esriFieldTypeString, alias: K_9, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) OFFICER_INJURED_NO_MED_REQ (type: esriFieldTypeString, alias: OFFICER_INJURED_NO_MED_REQ, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) OFFICER_INJURED_MED_REQ (type: esriFieldTypeString, alias: OFFICER_INJURED_MED_REQ, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) SUSPECT_OINJURED_NO_MED (type: esriFieldTypeString, alias: SUSPECT_OINJURED_NO_MED, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) SUSPECT_INJURED_MED_REQ (type: esriFieldTypeString, alias: SUSPECT_INJURED_MED_REQ, SQL Type: sqlTypeNVarchar, length: 256, nullable: true, editable: true) FID (type: esriFieldTypeOID, alias: FID, SQL Type: sqlTypeInteger, length: 0, nullable: false, editable: false) Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 2/21/2024 7:20:56 PM Schema Last Edit Date: 2/21/2024 7:20:55 PM Data Last Edit Date: 2/25/2020 6:11:22 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates " -4175,https://policedata-fcpdgis.hub.arcgis.com/pages/fairfax-county-arrests,Arrest Records,Police & Public Interactions,ArcGIS Hub,"Discover, analyze and download data from ArcGIS Hub. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",200,ArcGIS Hub,[],[],[],[],[],[],"" -4176,https://opengis.detroitmi.gov/arcgis/rest/services/PublicSafety/RMS_Crime_Incidents/FeatureServer/0,Incident Reports,Police & Public Interactions,"","",404,"","","","","","","","" -4177,https://www.arcgis.com/sharing/rest/content/items/ef454b4fd39a4f36bf0b0b44e2c9bb1f/data,Calls for Service,Police & Public Interactions,"","",200,"","","","","","","","" -4178,data.cityofnewyork.us/resource/v5jd-6wqn.json,Use of Force Reports,Police & Public Interactions,NYPD Use of Force: Members of Service | NYC Open Data,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""NYPD Use of Force: Members of Service"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""NYPD Use of Force: Members of Service"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Data Collection"", ""Dataset Information"", ""Update"", ""Attachments"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search -4179,https://data.cityofnewyork.us/Public-Safety/Motor-Vehicle-Collisions-Crashes/h9gi-nx95,Incident Reports,Police & Public Interactions,Motor Vehicle Collisions - Crashes | NYC Open Data,"",200,403 Forbidden,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Motor Vehicle Collisions - Crashes"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Motor Vehicle Collisions - Crashes"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Data Collection"", ""Dataset Information"", ""Update"", ""Attachments"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search -4180,data.nola.gov/resource/bqmt-f3jk.json,Calls for Service,Police & Public Interactions,Calls for Service 2017 | Data.NOLA.gov,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Calls for Service 2017"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Calls for Service 2017"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Attachments"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -4181,https://data.montgomerycountymd.gov/Public-Safety/Traffic-Violations/4mse-ku6q,Stops,Police & Public Interactions,Traffic Violations | Open Data Portal,"",200,Montgomery County Data | Open Data Portal,"[""Traffic Violations-API"", ""Traffic Violations Related to Pedestrian Safety"", ""Traffic Violations"", ""Traffic Violations Related to Pedestrian Safety - Ped Citations ONLY"", ""Traffic Violations Related to Pedestrian Safety - Driver Citations ONLY"", ""Dale Drive Map"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Traffic Violations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Traffic Violations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Dataset Information"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content data.Montgomerycountymd.gov Search Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu Menu Close Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Search data.Montgomerycountymd.gov Search Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu data.Montgomerycountymd.gov Search data.Montgomerycountymd.gov Search Search Search Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Open Budget Operating Budget Publication CIP Budget Publication Open Budget Operating Budget Publication CIP Budget Publication Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Sign In -4182,https://services.arcgis.com/afSMGVsC7QlRK1kZ/arcgis/rest/services/Police_Stop_Data/FeatureServer/0,Stops,Police & Public Interactions,Layer: Police_Stop_Data (ID:0),"",200,Home,[],"[""Layer: Police_Stop_Data (ID:0)""]",[],[],[],[],"JSON Layer: Police_Stop_Data (ID:0) View In: Map Viewer Name: Police_Stop_Data Display Field: masterIncidentNumber Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Min. Scale: 0 Max. Scale: 0 Default Visibility: true Max Record Count: 32000 Supported query Formats: JSON Use Standardized Queries: True Extent: XMin: -10389353.9139 YMin: 0 XMax: 0 YMax: 5629592.547 Spatial Reference: 102100 (3857) Drawing Info: {""renderer"":{""type"":""simple"",""symbol"":{""type"":""esriPMS"",""url"":""f3fc3637febaf281dfd07311758baca4"",""imageData"":""iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAALxJREFUGJWVzz1KA1EQAOBvYGHBQyiksPQAAcuAEhC0ExsLK4vkHlqIpQQECwXPYGWR9SSKXkB4IBkbeSGwURyYYuCbv8Y/olmp5nkknEpbeMW9oQcRuYLb+eK6MJG1dQf7uhzLPBGRDbRd7pU06V8exzrPuGmgpOkf555V3IZByV/xoN5c+MD2OtnyXuqD6Q6763DhsU42dOvFoTTusZ10ucQR6SkPbJjiHJt4w8ynC6P4WmIYxQJXP9kb3yUONhOcnJKYAAAAAElFTkSuQmCC"",""contentType"":""image/png"",""width"":8,""height"":8,""angle"":0,""xoffset"":0,""yoffset"":0},""label"":"""",""description"":""""},""transparency"":0,""labelingInfo"":null} HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Object ID Field: OBJECTID Unique ID Field: Name : OBJECTID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID (type: esriFieldTypeOID, alias: OBJECTID, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) masterIncidentNumber (type: esriFieldTypeString, alias: masterIncidentNumber, SQL Type: sqlTypeOther, length: 20, nullable: true, editable: true) responseDate (type: esriFieldTypeDate, alias: responseDate, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) reason (type: esriFieldTypeString, alias: reason, SQL Type: sqlTypeOther, length: 200, nullable: true, editable: true) problem (type: esriFieldTypeString, alias: problem, SQL Type: sqlTypeOther, length: 30, nullable: true, editable: true) callDisposition (type: esriFieldTypeString, alias: callDisposition, SQL Type: sqlTypeOther, length: 30, nullable: true, editable: true) citationIssued (type: esriFieldTypeString, alias: citationIssued, SQL Type: sqlTypeOther, length: 200, nullable: true, editable: true) personSearch (type: esriFieldTypeString, alias: personSearch, SQL Type: sqlTypeOther, length: 200, nullable: true, editable: true) vehicleSearch (type: esriFieldTypeString, alias: vehicleSearch, SQL Type: sqlTypeOther, length: 200, nullable: true, editable: true) preRace (type: esriFieldTypeString, alias: preRace, SQL Type: sqlTypeOther, length: 200, nullable: true, editable: true) race (type: esriFieldTypeString, alias: race, SQL Type: sqlTypeOther, length: 200, nullable: true, editable: true) gender (type: esriFieldTypeString, alias: gender, SQL Type: sqlTypeOther, length: 200, nullable: true, editable: true) lat (type: esriFieldTypeDouble, alias: lat, SQL Type: sqlTypeOther, nullable: true, editable: true) long (type: esriFieldTypeDouble, alias: long, SQL Type: sqlTypeOther, nullable: true, editable: true) x (type: esriFieldTypeDouble, alias: x, SQL Type: sqlTypeOther, nullable: true, editable: true) y (type: esriFieldTypeDouble, alias: y, SQL Type: sqlTypeOther, nullable: true, editable: true) policePrecinct (type: esriFieldTypeString, alias: policePrecinct, SQL Type: sqlTypeOther, length: 100, nullable: true, editable: true) neighborhood (type: esriFieldTypeString, alias: neighborhood, SQL Type: sqlTypeOther, length: 100, nullable: true, editable: true) lastUpdateDate (type: esriFieldTypeDate, alias: lastUpdateDate, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) Templates: Name: Police_Stop_Data Description: Drawing Tool: esriFeatureEditToolPoint Prototype: Attributes: Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 3/25/2024 1:52:34 PM Schema Last Edit Date: 3/25/2024 1:52:34 PM Data Last Edit Date: 3/25/2024 1:52:34 PM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates View In: Map Viewer " -4183,https://data.menlopark.org/search?tags=Police,List of Data Sources,Info About Agencies,ArcGIS Hub,"Discover, analyze and download data from ArcGIS Hub. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",200,ArcGIS Hub,[],[],[],[],[],[],"" -4184,https://data.cityofnewyork.us/Public-Safety/Motor-Vehicle-Collisions-Person/f55k-p6yu,Incident Reports,Police & Public Interactions,Motor Vehicle Collisions - Person | NYC Open Data,"",200,403 Forbidden,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Motor Vehicle Collisions - Person"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Motor Vehicle Collisions - Person"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Data Collection"", ""Dataset Information"", ""Update"", ""Attachments"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search -4185,data.nola.gov/resource/3pha-hum9.json,Calls for Service,Police & Public Interactions,Calls for Service 2021 | Data.NOLA.gov,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Calls for Service 2021"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Calls for Service 2021"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Attachments"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -4186,https://data.nashville.gov/Police/Metro-Nashville-Police-Department-Calls-for-Servic/kwnd-qrrm,Calls for Service,Police & Public Interactions,Metro Nashville Police Department Calls for Service | Nashville Open Data Portal,"",200,Nashville | Open Data | Nashville Open Data Portal,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Metro Nashville Police Department Calls for Service"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Metro Nashville Police Department Calls for Service"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Attachments"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Menu Menu Close Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Search Search Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Menu Search Search Search Search Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Menu Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Menu Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Sign In Menu Close Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Search Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Search Home BETA Open Data Portal Catalog Suggest Datasets Data Policy Developers Help Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Other Resources Nashville.gov Open Data Documentation About Data.Nashville.gov Sign In Search Search -4187,data.nola.gov/resource/wgrp-d3ma.json,Calls for Service,Police & Public Interactions,Calls for Service 2016 | Data.NOLA.gov,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Calls for Service 2016"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Calls for Service 2016"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Attachments"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -4188,https://data.cityofnewyork.us/browse?Dataset-Information_Agency=Police+Department+%28NYPD%29,List of Data Sources,Info About Agencies,Results matching of Police Department (NYPD) | Page 1 of 2 | NYC Open Data,"",200,403 Forbidden,"[""Categories"", ""Agency"", ""Tags""]","[""Menu"", ""Agency > Police Department (NYPD)"", ""Sort"", ""Sort by Most Relevant"", ""Filter"", ""Categories"", ""View Types"", ""Data Collection"", ""Agency"", ""Tags"", ""Motor Vehicle Collisions - Crashes"", ""NYPD Arrest Data (Year to Date)"", ""NYPD Complaint Data Historic"", ""NYPD Arrests Data (Historic)"", ""NYPD Complaint Data Current (Year To Date)"", ""NYPD Shooting Incident Data (Historic)"", ""NYPD Shooting Incident Data (Year To Date)"", ""Citywide Crime Statistics"", ""NYPD Complaint Map (Year to Date)"", ""NYPD Hate Crimes"", ""NYPD Complaint Map (Historic)"", ""NYPD Calls for Service (Year to Date)"", ""Motor Vehicle Collisions - Vehicles"", ""Motor Vehicle Collisions - Person"", ""NYC Park Crime Data"", ""The Stop, Question and Frisk Data"", ""NYPD Criminal Court Summons (Historic)"", ""NYPD Criminal Court Summons Incident Level Data (Year To Date)"", ""NYPD Sectors"", ""Motor Vehicle Collisions Summary Reports"", ""NYPD Calls for Service (Historic)"", ""Crime Enforcement Activity"", ""NYPD Personnel Demographics"", ""NYPD Use of Force Incidents"", ""Moving Violation Summons Statistics"", ""A-Z"", ""A-Z"", ""A-Z""]",[],[],[],[],Skip to main content Skip to footer links -4189,data.nola.gov/resource/5fn8-vtui.json,Calls for Service,Police & Public Interactions,Calls for Service 2013 | Data.NOLA.gov,"",200,Error retrieving title: No connection adapters were found for '://',"[""New Orleans Police Dept Records by Type"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Calls for Service 2013"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Calls for Service 2013"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Attachments"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -4190,https://www.nyc.gov/assets/nypd/downloads/excel/analysis_and_planning/stop-question-frisk/sqf-2018.xlsx,Stops,Police & Public Interactions,"","",200,Welcome to NYC.gov | City of New York,[],[],[],[],[],[],"" -4191,https://services7.arcgis.com/uRrQ0O3z2aaiIWYU/arcgis/rest/services/Officer_Initiated_Traffic_Stops/FeatureServer/0,Stops,Police & Public Interactions,Layer: Officer Initiated Stops (ID:0),"",200,Home,[],"[""Layer: Officer Initiated Stops (ID:0)""]",[],[],[],[],"JSON Layer: Officer Initiated Stops (ID:0) View In: Map Viewer Name: Officer Initiated Stops Display Field: TYPE Type: Feature Layer Geometry Type: esriGeometryPoint Is View: true Is Updatable View: true Source Schema Changes Allowed: true Sources Description: Officer Initiated Stops Copyright Text: Min. Scale: 0 Max. Scale: 0 Default Visibility: true Max Record Count: 2000 Supported query Formats: JSON Use Standardized Queries: True Extent: XMin: -13820351.7481655 YMin: 2210813.74083222 XMax: -7870145.66880891 YMax: 7584412.13992081 Spatial Reference: 102100 (3857) Drawing Info: {""renderer"":{""type"":""simple"",""symbol"":{""color"":[43,117,173,255],""size"":4,""angle"":0,""xoffset"":0,""yoffset"":0,""type"":""esriSMS"",""style"":""esriSMSCircle"",""outline"":{""color"":[0,0,0,255],""width"":0.7,""type"":""esriSLS"",""style"":""esriSLSSolid""}}},""transparency"":0} HasZ: false HasM: false Has Attachments: false Has Geometry Properties: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Object ID Field: OBJECTID Unique ID Field: Name : OBJECTID IsSystemMaintained : True Global ID Field: Type ID Field: Fields: OBJECTID (type: esriFieldTypeOID, alias: OBJECTID, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) TYPE (type: esriFieldTypeString, alias: TYPE, SQL Type: sqlTypeOther, length: 40, nullable: true, editable: true) LOCATION (type: esriFieldTypeString, alias: LOCATION, SQL Type: sqlTypeOther, length: 48, nullable: true, editable: true) STATUS (type: esriFieldTypeString, alias: STATUS, SQL Type: sqlTypeOther, length: 10, nullable: true, editable: true) DATE (type: esriFieldTypeDate, alias: DATE, SQL Type: sqlTypeOther, length: 8, nullable: true, editable: true) TIME (type: esriFieldTypeString, alias: TIME, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) ON_SCENE_TIME (type: esriFieldTypeString, alias: ON SCENE TIME, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) CLEAR_TIME (type: esriFieldTypeString, alias: CLEAR TIME, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) DAYOFWEEK (type: esriFieldTypeString, alias: DAY OF WEEK, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) DISPOSITION (type: esriFieldTypeString, alias: DISPOSITION, SQL Type: sqlTypeOther, length: 200, nullable: true, editable: true) SERVICEAREA (type: esriFieldTypeString, alias: Service Area, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) BEAT (type: esriFieldTypeString, alias: BEAT, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) Templates: Name: Officer Initiated Stops Description: Drawing Tool: esriFeatureEditToolPoint Prototype: Attributes: DATE : -2209161600000 Is Data Versioned: false Has Contingent Values: false Supports Rollback On Failure Parameter: true Last Edit Date: 3/25/2024 8:34:31 AM Schema Last Edit Date: 3/25/2024 8:34:31 AM Data Last Edit Date: 3/25/2024 8:34:31 AM Supported Operations: Query Query Top Features Query Analytic Query Bins Generate Renderer Validate SQL Get Estimates View In: Map Viewer " -4192,https://data.nola.gov/browse?category=Public+Safety+and+Preparedness&limitTo=datasets,List of Data Sources,Info About Agencies,Results matching category of Public Safety and Preparedness and type of Datasets | Page 1 of 5 | Data.NOLA.gov,"",200," - Home - DataDriven - City of New Orleans -","[""Categories"", ""Departments"", ""Tags""]","[""Menu"", ""Categories > Public Safety and Preparedness"", ""View Types > Datasets"", ""Sort"", ""Sort by Recently Updated"", ""Filter"", ""Categories"", ""View Types"", ""Departments"", ""Tags"", ""Calls for Service 2024"", ""NOPD Misconduct Complaints"", ""NOPD Use of Force Incidents"", ""Electronic Police Report 2024"", ""Stop and Search (Field Interviews)"", ""Electronic Police Report 2010"", ""Electronic Police Report 2011"", ""Electronic Police Report 2013"", ""Electronic Police Report 2012"", ""Electronic Police Report 2014"", ""A-Z"", ""A-Z"", ""A-Z""]",[],[],[],[],Skip to main content Skip to footer links -4193,https://www.nyc.gov/assets/nypd/downloads/excel/analysis_and_planning/stop-question-frisk/csi-2947-2019-sqf-cy2017-updated1-9-2020.xlsx,Stops,Police & Public Interactions,"","",200,Welcome to NYC.gov | City of New York,[],[],[],[],[],[],"" -4194,data.nola.gov/resource/w68y-xmk6.json,Calls for Service,Police & Public Interactions,Calls for Service 2015 | Data.NOLA.gov,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Calls for Service 2015"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Calls for Service 2015"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -4195,data.cityofnewyork.us/resource/6xgr-kwjq.json,Complaints & Misconduct,Info About Officers,Civilian Complaint Review Board: Allegations Against Police Officers | NYC Open Data,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Civilian Complaint Review Board: Allegations Against Police Officers"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Civilian Complaint Review Board: Allegations Against Police Officers"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Data Collection"", ""Dataset Information"", ""Update"", ""Attachments"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search -4196,https://data.nola.gov/Public-Safety-and-Preparedness/NOPD-Use-of-Force-Incidents/9mnw-mbde,Use of Force Reports,Police & Public Interactions,NOPD Use of Force Incidents | Data.NOLA.gov,"",200," - Home - DataDriven - City of New Orleans -","[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""NOPD Use of Force Incidents"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""NOPD Use of Force Incidents"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -4197,https://www1.nyc.gov/assets/nypd/downloads/excel/analysis_and_planning/stop-question-frisk/sqf-2015.csv,Stops,Police & Public Interactions,"","",200,"","","","","","","","" -4198,https://www1.nyc.gov/assets/nypd/downloads/zip/analysis_and_planning/stop-question-frisk/sqf-2012-csv.zip,Stops,Police & Public Interactions,"","",200,"","","","","","","","" -4199,https://data.cityofnewyork.us/Public-Safety/Civilian-Complaint-Review-Board-Complaints-Against/2mby-ccnw,Complaints & Misconduct,Info About Officers,Civilian Complaint Review Board: Complaints Against Police Officers | NYC Open Data,"",200,403 Forbidden,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Civilian Complaint Review Board: Complaints Against Police Officers"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Civilian Complaint Review Board: Complaints Against Police Officers"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Data Collection"", ""Dataset Information"", ""Update"", ""Attachments"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search -4200,https://www.nyc.gov/assets/nypd/downloads/excel/analysis_and_planning/stop-question-frisk/sqf-2020.xlsx,Stops,Police & Public Interactions,"","",200,Welcome to NYC.gov | City of New York,[],[],[],[],[],[],"" -4201,data.cityofnewyork.us/resource/2fir-qns4.json,Complaints & Misconduct,Info About Officers,Civilian Complaint Review Board: Police Officers | NYC Open Data,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Civilian Complaint Review Board: Police Officers"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Civilian Complaint Review Board: Police Officers"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Data Collection"", ""Dataset Information"", ""Update"", ""Attachments"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search -4202,data.cityofnewyork.us/resource/f4tj-796d.json,Use of Force Reports,Police & Public Interactions,NYPD Use of Force Incidents | NYC Open Data,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""NYPD Use of Force Incidents"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""NYPD Use of Force Incidents"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Data Collection"", ""Dataset Information"", ""Update"", ""Attachments"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search -4203,data.nola.gov/resource/qf6q-pp4b.json,Calls for Service,Police & Public Interactions,Calls for Service 2019 | Data.NOLA.gov,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Calls for Service 2019"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Calls for Service 2019"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Attachments"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -4204,https://www.nyc.gov/assets/nypd/downloads/excel/analysis_and_planning/stop-question-frisk/sqf-2021.xlsx,Stops,Police & Public Interactions,"","",200,Welcome to NYC.gov | City of New York,[],[],[],[],[],[],"" -4205,data.cityofnewyork.us/resource/dufe-vxb7.json,Use of Force Reports,Police & Public Interactions,NYPD Use of Force: Subjects | NYC Open Data,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""NYPD Use of Force: Subjects"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""NYPD Use of Force: Subjects"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Data Collection"", ""Dataset Information"", ""Update"", ""Attachments"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search -4206,data.nola.gov/resource/28ec-c8d6.json,Calls for Service,Police & Public Interactions,Calls for Service 2011 | Data.NOLA.gov,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Calls for Service 2011"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Calls for Service 2011"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Attachments"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -4207,https://opendata.minneapolismn.gov/datasets/cityoflakes::police-officer-involved-shootings/about,Officer Involved Shootings,Police & Public Interactions,Police Officer Involved Shootings,Officer Involved Shooting Data for the Minneapolis Police Department,200,Open Minneapolis,[],[],[],[],[],[],"" -4208,https://www.njoag.gov/trafficstops/,Stops,Police & Public Interactions,New Jersey State Police - Traffic Stop Data Dashboard - New Jersey Office of Attorney General,"",200,403 Forbidden,"[""New Jersey State Police – Traffic Stop Data Dashboard"", ""Bed & Breakfast"", ""Juvenile Justice Commission"", ""JJC Careers""]","[""STATE OF NEW JERSEY | DEPARTMENT OF LAW & PUBLIC SAFETY"", ""OFFICE OF THE ATTORNEY GENERAL"", ""A Modern Home In the Heart of San Francisco, CA"", ""Room & Suites"", ""In-House Meal Service"", ""Amenities"", ""Talk to the Host"", ""Location & Nearby Attractions"", ""Guest Reviews"", ""We Have Vacancy!"", ""Police & Community Listening Sessions"", ""ALERT"", ""National Crime Victims Rights Week"", ""It’s Your Turn to Design Your Destiny! Submit Your Painted Wheel Creation!"", ""Enter Now for a Chance to Have Your Steering Wheel Featured on The NJ Division of Highway Traffic Safety’s Social Channels. Contest Ends December 1st , 2021""]","[""New Jersey State Police – Traffic Stop Data Dashboard"", ""JJC Facilities"", ""Bedrooms"", ""Baths"", ""Guests"", ""The Luxury Suite"", ""Double Room"", ""Single Room"", ""Top Floor Suite"", ""Request for Quote: Implicit Bias Awareness Training for Police"", ""6PM-8PM"", ""The Future of Juvenile Justice Reform"", ""The JJC is hiring!"", ""Police & Community Listening Sessions"", ""Thank you for your interest in attending our 2023 Crime Victims’ Rights Week Ceremony. Due to overwhelming interest, we have reached our attendance limit and registration is now closed. To learn more about the Division of Violence Intervention and Victim Assistance, please visit: www.njoag.gov/viva"", ""NJRC Feedback"", ""OAG Excellence Awards for Victims’ Justice""]","[""About"", ""Media"", ""Contact"", ""Attorney General’s Priorities"", ""Ongoing Programs"", ""Resources"", ""2023 Strategic Plan"", ""PPD NEXTGEN REPORT"", ""A citywide virtual meeting will be conducted for those who cannot attend in-person"", ""Residents will have an opportunity to ask questions and submit written feedback"", ""Thoughts, comments and suggestions, can also be submitted through the PPD Website"", ""Friday, April 29, 2022 – Virtual Event 10:00AM – 11:30AM""]","[""A Home Away From Home"", ""San Francisco"", ""6 Rms, 10 Guests"", ""In-Home Meals"", ""Price Per Night"", ""Price Per Night"", ""Price Per Night"", ""Price Per Night"", ""Daily Seasonal Breakfast"", ""Coffee, Tea, Water, & Assorted Beverages"", ""Dinner Upon Request"", ""Free WiFi"", ""Free Parking"", ""Bedroom Comforts"", ""Dishwasher"", ""Washer & Dryer"", ""Pool"", ""Computer Station"", ""Printer/Scanner"", ""Coffee Maker"", ""and 30 more"", ""Checkin & Checkout"", ""Cancellation Policy"", ""House Rules"", ""Restaurants"", ""Sight Seeing"", ""Adventure"", ""Bars & Lounges"", ""Shows & Entertainment"", ""Biking & Hiking"", ""Day Trips"", ""(523) 486-3562"", ""1234 Divi St, San Francisco, CA 29513"", ""info@divibnb.com"", ""OCTOBER 3, 2023""]","[""About Us"", ""Discover"", ""Food & Drink"", ""Information"", ""Have a Question?"", ""Information"", ""Reviews"", ""Visit San Francisco in Style""]","" -4209,https://data.cityofnewyork.us/Public-Safety/NYPD-Arrests-Data-Historic-/8h9b-rp9u,Arrest Records,Police & Public Interactions,NYPD Arrests Data (Historic) | NYC Open Data,"",200,403 Forbidden,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""NYPD Arrests Data (Historic)"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""NYPD Arrests Data (Historic)"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Dataset Information"", ""Update"", ""Attachments"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search -4210,https://services.arcgis.com/afSMGVsC7QlRK1kZ/arcgis/rest/services/Police_Use_of_Force/FeatureServer/0,Use of Force Reports,Police & Public Interactions,Layer: Police_Use_of_Force (ID:0),"",200,Home,[],"[""Layer: Police_Use_of_Force (ID:0)""]",[],[],[],[],JSON Layer: Police_Use_of_Force (ID:0) -4211,https://opendata.minneapolismn.gov/search?q=police,List of Data Sources,Info About Agencies,Open Minneapolis,Open Minneapolis,200,Open Minneapolis,[],[],[],[],[],[],"" -4212,https://data.montgomerycountymd.gov/Public-Safety/Internal-Affairs-Allegations/usip-62e2,Complaints & Misconduct,Info About Officers,Internal Affairs Allegations | Open Data Portal,"",200,Montgomery County Data | Open Data Portal,"[""Chart of Cases by Allegation"", ""2016 Allegation Timeline Chart"", ""Active Allegations Pie Chart"", ""Internal Affairs Allegations - API"", ""2013 to Present Allegation Timeline Chart"", ""Allegation Chart - Count 2013-Present"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Internal Affairs Allegations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Internal Affairs Allegations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Dataset Information"", ""Attachments"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content data.Montgomerycountymd.gov Search Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu Menu Close Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Search data.Montgomerycountymd.gov Search Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu data.Montgomerycountymd.gov Search data.Montgomerycountymd.gov Search Search Search Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Menu Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Data Catalog Suggest a Dataset Open Budget Operating Budget Publication CIP Budget Publication spendingMontgomery CountyStat Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Open Budget Operating Budget Publication CIP Budget Publication Open Budget Operating Budget Publication CIP Budget Publication Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources Videos and Resources dataMontgomery Overview Filtering a dataset Sorting a dataset Using the visualization tool Video Guides Developer Resources About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan About Open Montgomery Open Government Legislation Open Data Operations Manual Open Data Implementation Plan Sign In Sign In -4213,data.nola.gov/resource/kitu-f4uy.json,Stops,Police & Public Interactions,Stop and Search (Field Interviews) | Data.NOLA.gov,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Stop and Search (Field Interviews)"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Stop and Search (Field Interviews)"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -4214,https://www1.nyc.gov/assets/nypd/downloads/excel/analysis_and_planning/stop-question-frisk/sqf-2016.csv,Stops,Police & Public Interactions,"","",200,"","","","","","","","" -4215,data.cityofnewyork.us/resource/5vr7-5fki.json,Personnel Records,Info About Officers,NYPD Personnel Demographics | NYC Open Data,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""NYPD Personnel Demographics"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""NYPD Personnel Demographics"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Dataset Information"", ""Update"", ""Attachments"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search -4216,data.nola.gov/resource/rv3g-ypg7.json,Calls for Service,Police & Public Interactions,Calls for Service 2012 | Data.NOLA.gov,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Calls for Service 2012"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Calls for Service 2012"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Attachments"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -4217,data.nola.gov/resource/jsyu-nz5r.json,Calls for Service,Police & Public Interactions,Calls for Service 2014 | Data.NOLA.gov,"",200,Error retrieving title: No connection adapters were found for '://',"[""suspicious persons calls"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Calls for Service 2014"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Calls for Service 2014"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Attachments"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -4218,https://data.cityofnewyork.us/Public-Safety/Motor-Vehicle-Collisions-Vehicles/bm4k-52h4,Incident Reports,Police & Public Interactions,Motor Vehicle Collisions - Vehicles | NYC Open Data,"",200,403 Forbidden,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Motor Vehicle Collisions - Vehicles"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Motor Vehicle Collisions - Vehicles"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Data Collection"", ""Dataset Information"", ""Update"", ""Attachments"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search -4219,https://www1.nyc.gov/assets/nypd/downloads/zip/analysis_and_planning/stop-question-frisk/sqf-2013-csv.zip,Stops,Police & Public Interactions,"","",200,"","","","","","","","" -4220,https://www.nyc.gov/assets/nypd/downloads/excel/analysis_and_planning/stop-question-frisk/sqf-2019.xlsx,Stops,Police & Public Interactions,"","",200,Welcome to NYC.gov | City of New York,[],[],[],[],[],[],"" -4221,https://www.njoag.gov/force/#policy,Policies & Contracts,Info About Agencies,Use of Force Policy - New Jersey Office of Attorney General,"",200,403 Forbidden,"[""Use of Force Policy"", ""Bed & Breakfast"", ""Juvenile Justice Commission"", ""JJC Careers""]","[""STATE OF NEW JERSEY | DEPARTMENT OF LAW & PUBLIC SAFETY"", ""OFFICE OF THE ATTORNEY GENERAL"", ""A Modern Home In the Heart of San Francisco, CA"", ""Room & Suites"", ""In-House Meal Service"", ""Amenities"", ""Talk to the Host"", ""Location & Nearby Attractions"", ""Guest Reviews"", ""We Have Vacancy!"", ""Police & Community Listening Sessions"", ""ALERT"", ""National Crime Victims Rights Week"", ""It’s Your Turn to Design Your Destiny! Submit Your Painted Wheel Creation!"", ""Enter Now for a Chance to Have Your Steering Wheel Featured on The NJ Division of Highway Traffic Safety’s Social Channels. Contest Ends December 1st , 2021""]","[""Reducing Use of Force by Law Enforcement"", ""JJC Facilities"", ""Bedrooms"", ""Baths"", ""Guests"", ""The Luxury Suite"", ""Double Room"", ""Single Room"", ""Top Floor Suite"", ""Request for Quote: Implicit Bias Awareness Training for Police"", ""6PM-8PM"", ""The Future of Juvenile Justice Reform"", ""The JJC is hiring!"", ""Police & Community Listening Sessions"", ""Thank you for your interest in attending our 2023 Crime Victims’ Rights Week Ceremony. Due to overwhelming interest, we have reached our attendance limit and registration is now closed. To learn more about the Division of Violence Intervention and Victim Assistance, please visit: www.njoag.gov/viva"", ""NJRC Feedback"", ""OAG Excellence Awards for Victims’ Justice""]","[""About"", ""Media"", ""Contact"", ""Attorney General’s Priorities"", ""Ongoing Programs"", ""Resources"", ""2023 Strategic Plan"", ""PPD NEXTGEN REPORT"", ""A citywide virtual meeting will be conducted for those who cannot attend in-person"", ""Residents will have an opportunity to ask questions and submit written feedback"", ""Thoughts, comments and suggestions, can also be submitted through the PPD Website"", ""Friday, April 29, 2022 – Virtual Event 10:00AM – 11:30AM""]","[""A Home Away From Home"", ""San Francisco"", ""6 Rms, 10 Guests"", ""In-Home Meals"", ""Price Per Night"", ""Price Per Night"", ""Price Per Night"", ""Price Per Night"", ""Daily Seasonal Breakfast"", ""Coffee, Tea, Water, & Assorted Beverages"", ""Dinner Upon Request"", ""Free WiFi"", ""Free Parking"", ""Bedroom Comforts"", ""Dishwasher"", ""Washer & Dryer"", ""Pool"", ""Computer Station"", ""Printer/Scanner"", ""Coffee Maker"", ""and 30 more"", ""Checkin & Checkout"", ""Cancellation Policy"", ""House Rules"", ""Restaurants"", ""Sight Seeing"", ""Adventure"", ""Bars & Lounges"", ""Shows & Entertainment"", ""Biking & Hiking"", ""Day Trips"", ""(523) 486-3562"", ""1234 Divi St, San Francisco, CA 29513"", ""info@divibnb.com"", ""OCTOBER 3, 2023""]","[""About Us"", ""Discover"", ""Food & Drink"", ""Information"", ""Have a Question?"", ""Information"", ""Reviews"", ""Visit San Francisco in Style""]","" -4222,data.nola.gov/resource/hp7u-i9hf.json,Calls for Service,Police & Public Interactions,Call for Service 2020 | Data.NOLA.gov,"",200,Error retrieving title: No connection adapters were found for '://',"[""LCPD - Simple Burglary Vehicle 2020"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Call for Service 2020"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Call for Service 2020"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Attachments"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -4223,data.nola.gov/resource/gz2m-ef5u.json,Complaints & Misconduct,Info About Officers,NOPD Misconduct Complaints | Data.NOLA.gov,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""NOPD Misconduct Complaints"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""NOPD Misconduct Complaints"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -4224,data.nola.gov/resource/nci8-thrr.json,Calls for Service,Police & Public Interactions,Calls for Service 2022 | Data.NOLA.gov,"",200,Error retrieving title: No connection adapters were found for '://',"[""Map of Calls for Service"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Calls for Service 2022"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Calls for Service 2022"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Attachments"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -4225,data.cityofnewyork.us/resource/keep-pkmh.json,Complaints & Misconduct,Info About Officers,Civilian Complaint Review Board: Penalties | NYC Open Data,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Civilian Complaint Review Board: Penalties"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Civilian Complaint Review Board: Penalties"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Data Collection"", ""Dataset Information"", ""Update"", ""Attachments"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search -4226,data.nola.gov/resource/9san-ivhk.json,Calls for Service,Police & Public Interactions,Calls for Service 2018 | Data.NOLA.gov,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Calls for Service 2018"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Calls for Service 2018"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Common Core"", ""Source Information"", ""Attachments"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Sign In Sign In Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Menu Close Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Home Browse Data Data Products NOLAlytics ResultsNOLA Training Blog Dashboard Sign In Search Search -4227,https://www1.nyc.gov/assets/nypd/downloads/zip/analysis_and_planning/stop-question-frisk/sqf-2014-csv.zip,Stops,Police & Public Interactions,"","",200,"","","","","","","","" -4228,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/47,Calls for Service,Police & Public Interactions,Layer: TPD_CFS_PUBLIC_2019 (ID: 47),"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Layer: TPD_CFS_PUBLIC_2019 (ID: 47)""]",[],[],[],[],"Name: TPD_CFS_PUBLIC_2019 Display Field: NHA_NAME Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Default Visibility: true MaxRecordCount: 1000 Supported Query Formats: JSON, geoJSON Min Scale: 0 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Has Labels: false Can Modify Layer: false Can Scale Symbols: false Use Standardized Queries: true Supports Datum Transformation: true Extent: XMin: 748204.5964566916 YMin: 283588.17486876994 XMax: 1145542.9911417328 YMax: 691807.9271653518 Spatial Reference: 2868 - (2868) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [148, 0, 25, 255] Size: 4.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 1 Label: Description: Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID, alias: OBJECTID -) call_id ( -type: esriFieldTypeString, alias: call_id, length: 12 -) case_id ( -type: esriFieldTypeString, alias: case_id, length: 12 -) acci_id ( -type: esriFieldTypeString, alias: acci_id, length: 12 -) agency ( -type: esriFieldTypeString, alias: agency, length: 4 -) ADDRESS_PUBLIC ( -type: esriFieldTypeString, alias: ADDRESS_PUBLIC, length: 1073741822 -) city ( -type: esriFieldTypeString, alias: city, length: 20 -) state ( -type: esriFieldTypeString, alias: state, length: 2 -) zip ( -type: esriFieldTypeString, alias: zip, length: 10 -) NEIGHBORHD ( -type: esriFieldTypeString, alias: NEIGHBORHD, length: 8 -) emdivision ( -type: esriFieldTypeString, alias: emdivision, length: 4 -) emunit ( -type: esriFieldTypeString, alias: emunit, length: 50 -) ACTDATE ( -type: esriFieldTypeDate, alias: ACTDATE, length: 8 -) ACTTIME ( -type: esriFieldTypeString, alias: ACTTIME, length: 4 -) ACTDATETIME ( -type: esriFieldTypeDate, alias: ACTDATETIME, length: 8 -) ACT_MONTH ( -type: esriFieldTypeString, alias: ACT_MONTH, length: 34 -) ACT_YEAR ( -type: esriFieldTypeInteger, alias: ACT_YEAR -) ACT_DOW ( -type: esriFieldTypeString, alias: ACT_DOW, length: 33 -) ACT_TIME ( -type: esriFieldTypeString, alias: ACT_TIME, length: 4 -) CAPRIORITY ( -type: esriFieldTypeString, alias: CAPRIORITY, length: 1 -) NATURECODE ( -type: esriFieldTypeString, alias: NATURECODE, length: 8 -) NatureCodeDesc ( -type: esriFieldTypeString, alias: NatureCodeDesc, length: 55 -) HOWRECEIVE ( -type: esriFieldTypeString, alias: HOWRECEIVE, length: 8 -) CSDISPOSIT ( -type: esriFieldTypeString, alias: CSDISPOSIT, length: 8 -) DispositionCodeDesc ( -type: esriFieldTypeString, alias: DispositionCodeDesc, length: 55 -) LOC_STATUS ( -type: esriFieldTypeString, alias: LOC_STATUS, length: 20 -) WARD ( -type: esriFieldTypeString, alias: WARD, length: 15 -) NHA_NAME ( -type: esriFieldTypeString, alias: NHA_NAME, length: 38 -) DIVISION ( -type: esriFieldTypeString, alias: DIVISION, length: 50 -) DIVISION_NO ( -type: esriFieldTypeString, alias: DIVISION_NO, length: 10 -) DIVSECT ( -type: esriFieldTypeString, alias: DIVSECT, length: 4 -) TRSQ ( -type: esriFieldTypeString, alias: TRSQ, length: 12 -) X ( -type: esriFieldTypeDouble, alias: X -) Y ( -type: esriFieldTypeDouble, alias: Y -) Shape ( -type: esriFieldTypeGeometry, alias: Shape -) Supported Operations : Query Query Attachments Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4229,https://www.normanok.gov/public-safety/police-department/open-data-portal/contacts,Citations,Police & Public Interactions,We've got some trouble | 404 - Resource not found,"",200,"Welcome to the City of Norman, OK | City of Norman, OK","[""Resource not found Error 404""]",[],[],[],[],[],Resource not found Error 404 The requested resource could not be found. -4230,https://www.pittsfieldpd.org/open-data-portal/,Calls for Service,Police & Public Interactions,Open Data Portal – Pittsfield Police Department,"",200,Not Acceptable!,"[""Open Data Portal""]","[""Arrests"", ""Calls for Service"", ""Hate Crimes"", ""Motor Vehicle Accidents"", ""Equipment Purchases""]",[],[],[],[],Skip to content Home About Join PPD New Hire Information Lateral Transfer Information News Divisions Uniform Patrol Traffic K-9 Unit Animal Control Bicycle Patrol Motorcycle Unit Investigative Detective Bureau Drug Unit Crime Scene Services Anti-Street Crimes Unit Operational Support Special Events Special Investigations Special Operations Berkshire County Special Response Team Special Projects Cops Bureau On Patrol with the PPD Training Youth Services Police Explorer Post Administrative Services Policies Forms Fight Crime Crime Statistics Pittsfield Neighborhood Watch Program Report A Crime Report A Tip With CitizenObserver PARB Resources Recovery and Addiction Links FAQ Open Data Portal Pittsfield Police Department Dedicated to Excellence Search for... Pittsfield Police Department Dedicated to Excellence Toggle Navigation Search for... Toggle Navigation Home About Join PPD New Hire Information Lateral Transfer Information News Divisions Uniform Patrol Traffic K-9 Unit Animal Control Bicycle Patrol Motorcycle Unit Investigative Detective Bureau Drug Unit Crime Scene Services Anti-Street Crimes Unit Operational Support Special Events Special Investigations Special Operations Berkshire County Special Response Team Special Projects Cops Bureau On Patrol with the PPD Training Youth Services Police Explorer Post Administrative Services Policies Forms Fight Crime Crime Statistics Pittsfield Neighborhood Watch Program Report A Crime Report A Tip With CitizenObserver PARB Resources Recovery and Addiction Links FAQ Open Data Portal Open Data Portal Arrests Arrest 2024 YTD Arrest 2023 Arrest 2022 Arrest 2021 Arrest 2020 Arrest 2019 Arrest 2018 Arrest 2017 Arrest 2016 Arrest 2015 Arrest 2014 Calls for Service Calls for Service 2024 YTD Calls for Service 2023 Calls for Service 2022 Calls for Service 2021 Calls for Service 2020 Calls for Service 2019 Calls for Service 2018 Calls for Service 2017 Calls for Service 2016 Calls for Service 2015 Calls for Service 2014 Hate Crimes Hate Crimes 2024 YTD Hate Crimes 2023 Hate Crimes 2022 Hate Crimes 2021 Hate Crimes 2020 Hate Crimes 2019 Hate Crimes 2018 Hate Crimes 2017 Hate Crimes 2016 Hate Crimes 2015 Hate Crimes 2014 Motor Vehicle Accidents MVA 2024 YTD MVA 2023 MVA 2022 M VA 2021 MVA 2020 MVA 2019 MVA 2018 MVA 2017 MVA 2016 MVA 2015 MVA 2014 Equipment Purchases Equipment Charges FINAL 2021 Equipment Charges FINAL 2020 Equipment Charges FINAL 2019 Equipment Charges FINAL 2018 Equip ment Charges FINAL 2017 Equipment Charges FINAL 2016 © 2021 Pittsfield Police Department. All rights reserved. -4231,https://phoenixopendata.com/group/public-safety,List of Data Sources,Info About Agencies,Public Safety - Group - City of Phoenix Open Data,"",200,Welcome - City of Phoenix Open Data,"[""Public Safety"", ""9 datasets found""]","[""Departments"", ""Groups"", ""Tags"", ""Formats"", ""Licenses"", ""Calls for Service"", ""Crime Data"", ""Calls for Service"", ""Officer Involved Shooting (OIS)"", ""Officer Pointed Gun at Person (PGP)"", ""Traffic Citations"", ""Adult Arrests"", ""Police Officer Demographics"", ""Fire Department Operational Statistics""]",[],[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Search Datasets Home Groups Public Safety Public Safety Police and Fire related incidents. read more Followers 2 Datasets 9 Departments Police - 7 Fire - 2 Groups Public Safety - 9 Tags police - 4 phoenix - 3 ems - 2 fire - 2 arrest - 1 call volume - 1 calls for service - 1 charges - 1 citations - 1 critical ems - 1 Show More Tags Formats CSV - 9 PDF - 1 XLSX - 1 Licenses Creative Commons At... - 7 Open Data Commons A... - 2 close Datasets Activity Stream About Order by Relevance Name Ascending Name Descending Last Modified Popular Go 9 datasets found Filter Results Calls for Service A CSV file which is updated daily by 11am that includes police calls for service from November 1st, 2015 forward through 7 days prior to today's posting date. All... CSV Crime Data A CSV file which is updated daily by 11am and includes crime incidents from November 1st, 2015 forward through 7 days prior to today's posting date. Homicides, rapes, robberies,... CSV Calls for Service Call for Fire Department service dispatched in the City of Phoenix. Incidents that were entered solely for documentation purposes are not included. Nature Code and Category are... CSV Officer Involved Shooting (OIS) This dataset contains Phoenix Police Department Officer-Involved Shooting (OIS) incidents from January 2017 forward, including demographic information for officers as well as... CSV XLSX PDF Officer Pointed Gun at Person (PGP) This dataset contains information about incidents where a Phoenix police officer pointed a gun at a person (PGP) from July 2020 forward. Data is updated monthly on the 1st... CSV Traffic Citations This dataset contains traffic citation information (criminal and civil) from January 2018 forward, including demographic information for officers as well as individuals. Data is... CSV Adult Arrests This dataset contains adult arrest information from January 2018 forward, including demographic information for officers as well as individuals. Data is updated monthly on the... CSV Police Officer Demographics This dataset contains Phoenix Police Department officer demographics as of January 1st of each year starting in 2018. All ranks of sworn employees are included. -Provide your... CSV Fire Department Operational Statistics These operational statistics show a breakdown of Fire Department calls for service in the City of Phoenix or responded to by the Phoenix Fire Department each year for the past 5... CSV " -4232,https://www.opendataphilly.org/dataset/police-complaints,Complaints & Misconduct,Info About Officers,"","",404,"","","","","","","","" -4233,https://information.stpaul.gov/datasets/stpaul::traffic-stops/explore,Stops,Police & Public Interactions,Traffic Stops,Traffic stops initiated by the City of Saint Paul's Police Department,200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -4234,https://data.seattle.gov/Public-Safety/Office-of-Police-Accountability-Complaints/99yi-dthu,Complaints & Misconduct,Info About Officers,"","",404,"","","","","","","","" -4235,https://www.opendataphilly.org/dataset/vehicular-crash-data/resource/d28c1e89-4c56-4119-9d4c-122999a75b38,Incident Reports,Police & Public Interactions,"","",404,"","","","","","","","" -4236,https://www.norwichct.org/846/Police-Officer-Involved-Shooting,Officer Involved Shootings,Police & Public Interactions,"Police Officer Involved Shooting - 2005 to present | Norwich, CT - Official Website","",200,"Norwich, CT - Official Website | Official Website","[""Police Officer Involved Shooting - 2005 to present""]","[""Norwich City Hall, 100 Broadway, Norwich, CT 06360""]","["""", """", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Residents Government Visitors Doing Business How Do I... Home Government Departments Police Open Data Portal Police Officer Involved Shooting Police Officer Involved Shooting - 2005 to present An officer-involved shooting (OIS) occurs when one of our police officers fires their gun at a subject. This chart includes incident-level data from 2005 to the present day.  “NONE” will appear each year that there were no reportable events of this nature. Most Recent I View List Police Demographics Police Officer Involved Shooting Police Use of Force Home Site Map Contact Us Accessibility Copyright Notices /QuickLinks.aspx Norwich City Hall, 100 Broadway, Norwich, CT 06360 Ph: (860) 823-3700 Fx: (860) 885-2131 Facebook Twitter Pinterest Delicious Blogger LinkedIn Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Government Websites by CivicPlus Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Residents Government Visitors Doing Business How Do I... Home Government Departments Police Open Data Portal Police Officer Involved Shooting Police Officer Involved Shooting - 2005 to present An officer-involved shooting (OIS) occurs when one of our police officers fires their gun at a subject. This chart includes incident-level data from 2005 to the present day.  “NONE” will appear each year that there were no reportable events of this nature. Most Recent I View List Police Demographics Police Officer Involved Shooting Police Use of Force Home Site Map Contact Us Accessibility Copyright Notices /QuickLinks.aspx Norwich City Hall, 100 Broadway, Norwich, CT 06360 Ph: (860) 823-3700 Fx: (860) 885-2131 Facebook Twitter Pinterest Delicious Blogger LinkedIn Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Government Websites by CivicPlus Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Residents Government Visitors Doing Business How Do I... Home Government Departments Police Open Data Portal Police Officer Involved Shooting Police Officer Involved Shooting - 2005 to present An officer-involved shooting (OIS) occurs when one of our police officers fires their gun at a subject. This chart includes incident-level data from 2005 to the present day.  “NONE” will appear each year that there were no reportable events of this nature. Most Recent I View List Police Demographics Police Officer Involved Shooting Police Use of Force Home Site Map Contact Us Accessibility Copyright Notices /QuickLinks.aspx Norwich City Hall, 100 Broadway, Norwich, CT 06360 Ph: (860) 823-3700 Fx: (860) 885-2131 Facebook Twitter Pinterest Delicious Blogger LinkedIn Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Government Websites by CivicPlus " -4237,https://data.sanjoseca.gov/dataset/police-calls-for-service,Calls for Service,Police & Public Interactions,Police-Calls-for-Service - Dataset - San Jose CA Open Data Portal,"",200,Welcome - San Jose CA Open Data Portal,"[""Police-Calls-for-Service"", ""Police"", ""Police-Calls-for-Service""]","[""Department"", ""Social"", ""License"", ""Data and Resources""]","[""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Departments Topics Transparency About Search Datasets Toggle navigation Datasets Departments Topics Transparency About Search Datasets Search Datasets Home Departments Police Police-Calls-for-Service Police-Calls-for-Service Followers 4 Department Police Police Department read more Social Twitter Facebook Linkedin License Creative Commons CCZero Dataset Topics Showcases Activity Stream Police-Calls-for-Service Each record in this data set represents one incident. Please note, multiple calls received for any incident will be represented only once in this data set. Data and Resources Police Calls 2013 CSV Popular Explore Preview Download Police Calls 2014 CSV Popular Explore Preview Download Police Calls 2015 CSV Popular Explore Preview Download Police Calls 2016 CSV Popular Explore Preview Download Police Calls 2017 CSV Popular Explore Preview Download Police Calls 2018 CSV Popular Explore Preview Download Police Calls 2019 CSV Popular Explore Preview Download Police Calls 2020 CSV Popular Explore Preview Download Police Calls 2021 CSV Popular Explore Preview Download Police Calls 2022 CSV Popular Explore Preview Download Police Calls 2023 CSV Popular Explore Preview Download Police Calls 2024 CSV Popular Updated Daily Explore Preview Download Additional Info Field Value Contact Name Open Data Team Contact Email opendata@sanjoseca.gov Last Updated March 25, 2024, 7:01 AM (UTC-04:00) Home Departments Police Police-Calls-for-Service Police-Calls-for-Service Followers 4 Department Police Police Department read more Social Twitter Facebook Linkedin License Creative Commons CCZero Dataset Topics Showcases Activity Stream Police-Calls-for-Service Each record in this data set represents one incident. Please note, multiple calls received for any incident will be represented only once in this data set. Data and Resources Police Calls 2013 CSV Popular Explore Preview Download Police Calls 2014 CSV Popular Explore Preview Download Police Calls 2015 CSV Popular Explore Preview Download Police Calls 2016 CSV Popular Explore Preview Download Police Calls 2017 CSV Popular Explore Preview Download Police Calls 2018 CSV Popular Explore Preview Download Police Calls 2019 CSV Popular Explore Preview Download Police Calls 2020 CSV Popular Explore Preview Download Police Calls 2021 CSV Popular Explore Preview Download Police Calls 2022 CSV Popular Explore Preview Download Police Calls 2023 CSV Popular Explore Preview Download Police Calls 2024 CSV Popular Updated Daily Explore Preview Download Additional Info Field Value Contact Name Open Data Team Contact Email opendata@sanjoseca.gov Last Updated March 25, 2024, 7:01 AM (UTC-04:00) Home Departments Police Police-Calls-for-Service " -4238,https://phoenixopendata.com/dataset/citations,Citations,Police & Public Interactions,Traffic Citations - Dataset - City of Phoenix Open Data,"",200,Welcome - City of Phoenix Open Data,"[""Traffic Citations"", ""Police"", ""Traffic Citations""]","[""Department"", ""Social"", ""License"", ""Data and Resources""]","[""Provide your feedback!"", ""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Search Datasets Home Departments Police Traffic Citations Traffic Citations Followers 0 Department Police Mission: The Phoenix Police Department is committed to providing the citizens of Phoenix with quality and professional law enforcement services. Our vision is to make Phoenix... read more Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Traffic Citations This dataset contains traffic citation information (criminal and civil) from January 2018 forward, including demographic information for officers as well as individuals. Data is updated monthly on the 1st. View Operations Order 6.2: Arizona Traffic Ticket and Complaint (ATTC) Policy Provide your feedback! Help us improve this site and complete the Open Data Customer Survey . Data and Resources Traffic Citations Details CSV Popular A csv file, updated monthly, that provides traffic citations (criminal and... Explore Preview Download Traffic Citations Summary CSV Popular A csv file, updated monthly, that provides summary information for each... Explore Preview Download citations phoenix police ticket traffic violations Additional Info Field Value Last Updated March 1, 2024, 9:08 AM (UTC-05:00) Created August 1, 2022, 6:40 PM (UTC-04:00) Home Departments Police Traffic Citations Traffic Citations Followers 0 Department Police Mission: The Phoenix Police Department is committed to providing the citizens of Phoenix with quality and professional law enforcement services. Our vision is to make Phoenix... read more Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Traffic Citations This dataset contains traffic citation information (criminal and civil) from January 2018 forward, including demographic information for officers as well as individuals. Data is updated monthly on the 1st. View Operations Order 6.2: Arizona Traffic Ticket and Complaint (ATTC) Policy Provide your feedback! Help us improve this site and complete the Open Data Customer Survey . Data and Resources Traffic Citations Details CSV Popular A csv file, updated monthly, that provides traffic citations (criminal and... Explore Preview Download Traffic Citations Summary CSV Popular A csv file, updated monthly, that provides summary information for each... Explore Preview Download citations phoenix police ticket traffic violations Additional Info Field Value Last Updated March 1, 2024, 9:08 AM (UTC-05:00) Created August 1, 2022, 6:40 PM (UTC-04:00) Home Departments Police Traffic Citations " -4239,https://data.seattle.gov/Public-Safety/SPD-Officer-Involved-Shooting-OIS-Data/mg5r-efcm,Officer Involved Shootings,Police & Public Interactions,SPD Officer Involved Shooting (OIS) Data | City of Seattle Open Data portal,"",200,City of Seattle Open Data portal,"[""SPD Officer Involved Shooting - Visualization"", ""Number of shootings at Blurred Addresses"", ""SPD Officer Shooting Location"", ""SPD Officer Shooting Subject Race"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""SPD Officer Involved Shooting (OIS) Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""SPD Officer Involved Shooting (OIS) Data"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Department"", ""Refresh Frequency"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Menu Close Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Sign In Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Close Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Search -4240,https://data.sandiego.gov/datasets/crb-cases/,Complaints & Misconduct,Info About Officers,Complaints Evaluated by the Commission on Police Practices - City of San Diego Open Data Portal," - In 2020, voter-approved Measure B created a new independent Commission on Police Practices (CPP) that replaced the Community Review Board on Police Practices... - ",200,City of San Diego Open Data Portal,[],"[""Complaints Evaluated by the Commission on Police Practices""]","[""Resources"", """", ""Additional Info""]","[""Cases FY20-FY23"", """"]",[],[],"City of San Diego | Mayor Todd Gloria City of San Diego | Mayor Todd Gloria Toggle navigation Data Browse Data (current) Blog Toggle navigation Data Browse Data (current) Blog Complaints Evaluated by the Commission on Police Practices In 2020, voter-approved Measure B created a new independent Commission on Police Practices (CPP) that replaced the Community Review Board on Police Practices (CRB). The CPP independently investigates officer-involved shootings, in-custody deaths, & other significant incidents in a process that is transparent and accountable to the community. The CPP also evaluates SDPD policies, practices, training, and protocols. This dataset includes all cases the CPP reviewed and closed out since the beginning of FY 2020. The mission of the Commission is to hold law enforcement accountable to the community and to increase community trust in law enforcement, resulting in increased safety for both the community and law enforcement. To learn more, visit sandiego.gov/cpp/about Each case in this dataset is identified by a unique case id and case number. A single case may involve multiple allegations, multiple complainants and multiple officers. Each officer named in the complaint is assigned an anonymous person id in the pid field that is unique for that case id . Complainant, cases and allegations are in separate files that can be joined on the id and case_number fields. Each complainant named in the complainant file is assigned an anonymous person id in the complainant_id field that is unique for that case id . The body worn camera details file included with this dataset lists each officer ( pid ) per complaint and whether that officer had a body worn camera on or off during the incident under review. Resources Resource Type Download Preview Cases FY20-FY23 csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Allegations FY20-FY23 csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Body worn camera details FY20-FY23 csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Complainants FY20-FY23 csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Dictionary csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Cases FY20-FY23 This is a preview. If you would like to view the full resource, please download it above. No Results Rows per page 10 20 50 100 1 - 10 of Additional Info License Open Data Commons Public Domain Dedication and Licence (PDDL) Publisher Date Issued (YYYY-MM-DD) 2019-09-04 Date Modified (YYYY-MM-DD) 2023-12-01 Category Public Safety , City Management Maintainer City of San Diego Maintainer Email data@sandiego.gov " -4241,https://www.cityofsparks.us/police_home/about_us/reports_and_crime_stats/officer_involved_shootings.php,Officer Involved Shootings,Police & Public Interactions,"Sparks, NV Police","",200,"Sparks, NV","[""Officer Involved Shootings""]","[""Related Pages"", ""Share this page"", """"]","[""""]",[],[],[],"775-353-2231 1701 E Prater Way, Sparks, NV Facebook link Instagram link Twitter link Back to City Site 775-353-2231 1701 E Prater Way, Sparks, NV Facebook link Instagram link Twitter link Back to City Site 775-353-2231 1701 E Prater Way, Sparks, NV Facebook link Instagram link Twitter link Back to City Site 775-353-2231 1701 E Prater Way, Sparks, NV Facebook link Instagram link Twitter link Back to City Site About Us Meet our leadership Chief Chris Crawforth Deputy Chief Clinte Bellamy Deputy Chief Tara Edmonson Administration Division Manager Sheila Lichus-Ill In Memory of Larry D. Johnson Divisions Administration Investigations Operations Mission, Vision and Values Policies and Directives Reports and Crime Stats City Demographics Historical Statistics Arrest Data Internal Affairs Reports Use of Force Data Officer Involved Shootings Body Worn and Fleet Cameras Community Services Citizen Police Academy Hide, Lock & Take Neighborhood Watch Northern Nevada Organized Retail Crime Alliance Parent Project Police Explorers Police News Recent Calls for Service Safety Programs Child Safety Home Safety Internet Safety Personal Safety Traffic Safety SafeCam Secret Witness Senior Phone Patrol The Parent Project Vacation Watch Program Victim Services Unit Volunteering I want to Apply for a job Contact the Police Department File a Police Report Obtain Alarm Ordinance Information Obtain Business License/Work Permit Obtain a Copy of a Police Report Supplement existing police report Obtain a Copy of a Traffic Accident Report an Abandoned Vehicle or Parking Issue Report an Accident Request Criminal History Schedule Appointment for Fingerprinting Schedule Convicted Person Registration Schedule Sex Offender Check-In Appointment Schedule Sex Offender Initial Registration Appointment Submit Photos or Video for a Case Submit a Public Records Request Public Records Request Response Volunteer Employment Emergency Communications Dispatcher Emergency Communications Dispatcher Lateral Police Officer Lateral Police Officer Recruit Police Office Assistant Police Assistant | EN Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bengali Bosnian Bulgarian Catalan Cebuano Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hausa Hebrew Hindi Hmong Hungarian Icelandic Igbo Indonesian Irish Italian Japanese Javanese Kannada Khmer Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Maori Marathi Mongolian Nepali Norwegian Persian Polish Portuguese Punjabi Romanian Russian Serbian Slovak Slovenian Somali Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Yoruba Zulu Search " -4242,https://www.portland.gov/police/open-data/ppb-use-force-dashboard,Use of Force Reports,Police & Public Interactions,Police Use of Force Dashboard | Portland.gov,The Use of Force Report is an interactive data visualization summarizing most use of force Incidents by Portland Police Bureau members. This tool is built to provide custom analyses of use of force data to interested members of the community.,200,"City of Portland, Oregon | Portland.gov","[""Police Use of Force Dashboard""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Walkthrough - Use of Force Dashboard"", ""Metadata for Use of Force Dashboard"", ""Topics"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]","[""1. Report Overview"", ""2. Technical Specifications"", ""3. Using the Interactive Features"", ""4. Visualizations Walkthrough"", ""5. Data Download page""]",[],[],[],"" -4243,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/14,Calls for Service,Police & Public Interactions,Layer: TPD_CFS_PUBLIC_2014 (ID: 14),"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Layer: TPD_CFS_PUBLIC_2014 (ID: 14)""]",[],[],[],[],"Name: TPD_CFS_PUBLIC_2014 Display Field: NHA_NAME Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Default Visibility: true MaxRecordCount: 1000 Supported Query Formats: JSON, geoJSON Min Scale: 1000000 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Has Labels: false Can Modify Layer: false Can Scale Symbols: false Use Standardized Queries: true Supports Datum Transformation: true Extent: XMin: 960924.7762467191 YMin: 359613.5032808408 XMax: 1080215.3736876622 YMax: 485863.65518372506 Spatial Reference: 2868 - (2868) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [166, 47, 0, 255] Size: 4.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 1 Label: Description: Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID, alias: ObjectID -) call_id ( -type: esriFieldTypeString, alias: call_id, length: 12 -) case_id ( -type: esriFieldTypeString, alias: case_id, length: 12 -) acci_id ( -type: esriFieldTypeString, alias: acci_id, length: 12 -) agency ( -type: esriFieldTypeString, alias: agency, length: 4 -) ADDRRESS_PUBLIC ( -type: esriFieldTypeString, alias: ADDRRESS_PUBLIC, length: 1073741822 -) city ( -type: esriFieldTypeString, alias: city, length: 20 -) state ( -type: esriFieldTypeString, alias: state, length: 2 -) zip ( -type: esriFieldTypeString, alias: zip, length: 10 -) NEIGHBORHD ( -type: esriFieldTypeString, alias: NEIGHBORHD, length: 8 -) emdivision ( -type: esriFieldTypeString, alias: emdivision, length: 4 -) ACTDATE ( -type: esriFieldTypeDate, alias: ACTDATE, length: 8 -) ACTTIME ( -type: esriFieldTypeString, alias: ACTTIME, length: 4 -) CAPRIORITY ( -type: esriFieldTypeString, alias: CAPRIORITY, length: 1 -) NATURECODE ( -type: esriFieldTypeString, alias: NATURECODE, length: 8 -) NatureCodeDesc ( -type: esriFieldTypeString, alias: NatureCodeDesc, length: 55 -) HOWRECEIVE ( -type: esriFieldTypeString, alias: HOWRECEIVE, length: 8 -) CSDISPOSIT ( -type: esriFieldTypeString, alias: CSDISPOSIT, length: 8 -) DispositionCodeDesc ( -type: esriFieldTypeString, alias: DispositionCodeDesc, length: 55 -) LOC_METHOD ( -type: esriFieldTypeString, alias: LOC_METHOD, length: 10 -) NHA_NAME ( -type: esriFieldTypeString, alias: NHA_NAME, length: 38 -) WARD ( -type: esriFieldTypeString, alias: WARD, length: 15 -) Shape ( -type: esriFieldTypeGeometry, alias: Shape -) POINT_X ( -type: esriFieldTypeDouble, alias: POINT_X -) POINT_Y ( -type: esriFieldTypeDouble, alias: POINT_Y -) Supported Operations : Query Query Attachments Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4244,https://stjohnin.gov/PD/PDI/Department/Agency.php,Personnel Records,Info About Officers,Town of St. John - Police Department Agency Demographics,"This is the offical website for the Town of St. John, Indiana.",200,Town of St. John,"[""Agency Demographics""]",[],"[""Datasets""]","[""Block Party Permit"", ""Citations"", ""Crime Map"", ""Daily Bulletin"", ""Handgun License"", ""Fireworks Information"", ""Peddler/Solicitor"", ""Police Data Initiative"", ""SafeTrade"", ""Text and E-Mail Notification System"", ""Vacation Check Request""]","[""Arrest Demographics"", ""Bias Crimes"", ""Calls for Service / Daily Bulletin"", ""Department Demographics"", ""Peddler/Solicitor Licenses"", ""Response to Resistance"", ""Training"", ""Traffic Stops"", ""Traffic Accidents"", ""Traffic Citation Demographics"", ""Traffic Warning Demographics"", ""Year End Reports"", ""Accessibility Copyright © 2024 Town of St. John, Indiana Accessible Version Follow us on""]",[],Employment Opportunities Event Calendar Pay Online Pay Utility Bill Employment Opportunities Event Calendar Pay Online Pay Utility Bill ☰ Home News Community Community About Awards Won by the Town of St. John Demographics History Schools Residents Residents Community Organizations Election Information FAQ Center Library Local Club Sports Meeting Minutes and Agendas Park Programs Resident Services Road Closures Special Events Town Ordinances Watch Meetings Live Resources Resources Employment Forms Public Documents Town Ordinances Departments Departments Animal Control Boards and Commissions Building and Planning Building and Planning Building and Planning Homepage GIS and Maps Licenses and Permits Business Directory Registered Contractors Code Enforcement Clerk-Treasurer Clerk-Treasurer Clerk-Treasurer Homepage FAQs Finance Notary Pay Online Pay Utility Bill Public Records Town Ordinances Fire Department Fire Department Fire Department Homepage CPR Classes FAQ's Privacy Policy Training Site Useful Information Meeting Minutes and Agendas Parks Department Parks Department Parks Department Homepage Dog Park Park Locations and Programs Patnoe Park Family Gardens Special Events Police Department Police Department Police Department Homepage Block Party Permit Citations Handgun License Peddler/Solicitor Police Data Initiative Temporary Parking Permit Vacation Check Request More Public Works Public Works Public Works Homepage Bulk Waterstation Electronic Recycling Program Fire Hydrant Flushing Leaf and Branch Pick Up Service Requests Stormwater Management / MS4 Town Council Town Manager Development Contact Us ☰ Home News Community Community About Awards Won by the Town of St. John Demographics History Schools Residents Residents Community Organizations Election Information FAQ Center Library Local Club Sports Meeting Minutes and Agendas Park Programs Resident Services Road Closures Special Events Town Ordinances Watch Meetings Live Resources Resources Employment Forms Public Documents Town Ordinances Departments Departments Animal Control Boards and Commissions Building and Planning Building and Planning Building and Planning Homepage GIS and Maps Licenses and Permits Business Directory Registered Contractors Code Enforcement Clerk-Treasurer Clerk-Treasurer Clerk-Treasurer Homepage FAQs Finance Notary Pay Online Pay Utility Bill Public Records Town Ordinances Fire Department Fire Department Fire Department Homepage CPR Classes FAQ's Privacy Policy Training Site Useful Information Meeting Minutes and Agendas Parks Department Parks Department Parks Department Homepage Dog Park Park Locations and Programs Patnoe Park Family Gardens Special Events Police Department Police Department Police Department Homepage Block Party Permit Citations Handgun License Peddler/Solicitor Police Data Initiative Temporary Parking Permit Vacation Check Request More Public Works Public Works Public Works Homepage Bulk Waterstation Electronic Recycling Program Fire Hydrant Flushing Leaf and Branch Pick Up Service Requests Stormwater Management / MS4 Town Council Town Manager Development Contact Us -4245,https://gisdata.tucsonaz.gov/search?groupIds=b6a49faa168647d8b56e1a06bd53600f,List of Data Sources,Info About Agencies,Tucson Open Data,"This is the City of Tucson's public platform for exploring and downloading open data, discovering and building apps, and engaging to solve important local issues.",200,Tucson Open Data,[],[],[],[],[],[],"" -4246,https://data-santarosa.opendata.arcgis.com/search?q=calls,Calls for Service,Police & Public Interactions,City of Santa Rosa,City of Santa Rosa Open Data Portal: Access to public information to facilitate transparency and knowledge.,200,City of Santa Rosa,[],[],[],[],[],[],"" -4247,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/68,Calls for Service,Police & Public Interactions,Layer: TPD_CFS_PUBLIC_2021 (ID: 68),"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Layer: TPD_CFS_PUBLIC_2021 (ID: 68)""]",[],[],[],[],"Name: TPD_CFS_PUBLIC_2021 Display Field: NHA_NAME Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Default Visibility: true MaxRecordCount: 1000 Supported Query Formats: JSON, geoJSON Min Scale: 0 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Has Labels: false Can Modify Layer: false Can Scale Symbols: false Use Standardized Queries: true Supports Datum Transformation: true Extent: XMin: 748731.1663385816 YMin: 212758.68667978793 XMax: 1085111.4914698154 YMax: 692017.8484251946 Spatial Reference: 2868 - (2868) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [0, 102, 130, 255] Size: 4.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 1 Label: Description: Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID, alias: OBJECTID -) X ( -type: esriFieldTypeDouble, alias: X -) Y ( -type: esriFieldTypeDouble, alias: Y -) call_id ( -type: esriFieldTypeString, alias: call_id, length: 12 -) case_id ( -type: esriFieldTypeString, alias: case_id, length: 12 -) acci_id ( -type: esriFieldTypeString, alias: acci_id, length: 12 -) agency ( -type: esriFieldTypeString, alias: agency, length: 4 -) ADDRESS_PUBLIC ( -type: esriFieldTypeString, alias: ADDRESS_PUBLIC, length: 1073741822 -) city ( -type: esriFieldTypeString, alias: city, length: 20 -) state ( -type: esriFieldTypeString, alias: state, length: 2 -) zip ( -type: esriFieldTypeString, alias: zip, length: 10 -) NEIGHBORHD ( -type: esriFieldTypeString, alias: NEIGHBORHD, length: 8 -) emdivision ( -type: esriFieldTypeString, alias: emdivision, length: 4 -) ACTDATE ( -type: esriFieldTypeDate, alias: ACTDATE, length: 8 -) ACTTIME ( -type: esriFieldTypeString, alias: ACTTIME, length: 4 -) ACTDATETIME ( -type: esriFieldTypeDate, alias: ACTDATETIME, length: 8 -) ACT_MONTH ( -type: esriFieldTypeString, alias: ACT_MONTH, length: 34 -) ACT_YEAR ( -type: esriFieldTypeInteger, alias: ACT_YEAR -) ACT_DOW ( -type: esriFieldTypeString, alias: ACT_DOW, length: 33 -) ACT_TIME ( -type: esriFieldTypeString, alias: ACT_TIME, length: 4 -) CAPRIORITY ( -type: esriFieldTypeString, alias: CAPRIORITY, length: 1 -) NATURECODE ( -type: esriFieldTypeString, alias: NATURECODE, length: 8 -) NatureCodeDesc ( -type: esriFieldTypeString, alias: NatureCodeDesc, length: 55 -) HOWRECEIVE ( -type: esriFieldTypeString, alias: HOWRECEIVE, length: 8 -) CSDISPOSIT ( -type: esriFieldTypeString, alias: CSDISPOSIT, length: 8 -) DispositionCodeDesc ( -type: esriFieldTypeString, alias: DispositionCodeDesc, length: 55 -) LOC_STATUS ( -type: esriFieldTypeString, alias: LOC_STATUS, length: 20 -) WARD ( -type: esriFieldTypeString, alias: WARD, length: 15 -) NHA_NAME ( -type: esriFieldTypeString, alias: NHA_NAME, length: 38 -) DIVISION ( -type: esriFieldTypeString, alias: DIVISION, length: 50 -) DIVISION_NO ( -type: esriFieldTypeString, alias: DIVISION_NO, length: 10 -) DIVSECT ( -type: esriFieldTypeString, alias: DIVSECT, length: 4 -) TRSQ ( -type: esriFieldTypeString, alias: TRSQ, length: 12 -) City_geo ( -type: esriFieldTypeString, alias: City_geo, length: 20 -) ADDRESS_100BLK ( -type: esriFieldTypeString, alias: ADDRESS_100BLK, length: 1073741822 -) Shape ( -type: esriFieldTypeGeometry, alias: Shape -) Supported Operations : Query Query Attachments Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4248,https://stjohnin.gov/PD/PDI/CFS/,Calls for Service,Police & Public Interactions,Town of St. John - Police Department Calls for Service,"This is the offical website for the Town of St. John, Indiana.",200,Town of St. John,"[""Calls for Service / Daily Bulletin""]",[],"[""Datasets""]","[""Block Party Permit"", ""Citations"", ""Crime Map"", ""Daily Bulletin"", ""Handgun License"", ""Fireworks Information"", ""Peddler/Solicitor"", ""Police Data Initiative"", ""SafeTrade"", ""Text and E-Mail Notification System"", ""Vacation Check Request""]","[""The St. John Police Department takes great effort in making data as accurate as possible, but there is no avoiding the introduction of errors in this process, which relies on data that cannot always be verified. Information contained in this dataset may change over a period of time. The St. John Police Department is not responsible for any error or omission from this data, or for the use or interpretation of the results of any research conducted."", ""2024 Calls For Service"", ""2023 Calls For Service"", ""2022 Calls For Service"", ""2021 Calls For Service"", ""2020 Calls For Service"", ""2019 Calls For Service"", ""2018 Calls For Service"", ""2017 Calls For Service"", ""2016 Calls For Service"", ""2015 Calls For Service"", ""2014 Calls For Service"", ""2013 Calls For Service"", ""2012 Calls For Service"", ""2011 Calls For Service"", ""2010 Calls For Service"", ""2009 Calls For Service"", ""2008 Calls For Service"", ""2007 Calls For Service"", ""2006 Calls For Service"", ""Arrest Demographics"", ""Bias Crimes"", ""Calls for Service / Daily Bulletin"", ""Department Demographics"", ""Peddler/Solicitor Licenses"", ""Response to Resistance"", ""Training"", ""Traffic Stops"", ""Traffic Accidents"", ""Traffic Citation Demographics"", ""Traffic Warning Demographics"", ""Year End Reports"", ""Accessibility Copyright © 2024 Town of St. John, Indiana Accessible Version Follow us on""]",[],Employment Opportunities Event Calendar Pay Online Pay Utility Bill Employment Opportunities Event Calendar Pay Online Pay Utility Bill ☰ Home News Community Community About Awards Won by the Town of St. John Demographics History Schools Residents Residents Community Organizations Election Information FAQ Center Library Local Club Sports Meeting Minutes and Agendas Park Programs Resident Services Road Closures Special Events Town Ordinances Watch Meetings Live Resources Resources Employment Forms Public Documents Town Ordinances Departments Departments Animal Control Boards and Commissions Building and Planning Building and Planning Building and Planning Homepage GIS and Maps Licenses and Permits Business Directory Registered Contractors Code Enforcement Clerk-Treasurer Clerk-Treasurer Clerk-Treasurer Homepage FAQs Finance Notary Pay Online Pay Utility Bill Public Records Town Ordinances Fire Department Fire Department Fire Department Homepage CPR Classes FAQ's Privacy Policy Training Site Useful Information Meeting Minutes and Agendas Parks Department Parks Department Parks Department Homepage Dog Park Park Locations and Programs Patnoe Park Family Gardens Special Events Police Department Police Department Police Department Homepage Block Party Permit Citations Handgun License Peddler/Solicitor Police Data Initiative Temporary Parking Permit Vacation Check Request More Public Works Public Works Public Works Homepage Bulk Waterstation Electronic Recycling Program Fire Hydrant Flushing Leaf and Branch Pick Up Service Requests Stormwater Management / MS4 Town Council Town Manager Development Contact Us ☰ Home News Community Community About Awards Won by the Town of St. John Demographics History Schools Residents Residents Community Organizations Election Information FAQ Center Library Local Club Sports Meeting Minutes and Agendas Park Programs Resident Services Road Closures Special Events Town Ordinances Watch Meetings Live Resources Resources Employment Forms Public Documents Town Ordinances Departments Departments Animal Control Boards and Commissions Building and Planning Building and Planning Building and Planning Homepage GIS and Maps Licenses and Permits Business Directory Registered Contractors Code Enforcement Clerk-Treasurer Clerk-Treasurer Clerk-Treasurer Homepage FAQs Finance Notary Pay Online Pay Utility Bill Public Records Town Ordinances Fire Department Fire Department Fire Department Homepage CPR Classes FAQ's Privacy Policy Training Site Useful Information Meeting Minutes and Agendas Parks Department Parks Department Parks Department Homepage Dog Park Park Locations and Programs Patnoe Park Family Gardens Special Events Police Department Police Department Police Department Homepage Block Party Permit Citations Handgun License Peddler/Solicitor Police Data Initiative Temporary Parking Permit Vacation Check Request More Public Works Public Works Public Works Homepage Bulk Waterstation Electronic Recycling Program Fire Hydrant Flushing Leaf and Branch Pick Up Service Requests Stormwater Management / MS4 Town Council Town Manager Development Contact Us -4249,www.transparentrichmond.org/resource/ni82-hdjg.json,Stops,Police & Public Interactions,Stop Data Demographics | Transparent Richmond,"",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Stop Data Demographics"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Stop Data Demographics"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Dataset Details"", ""Strategic Priority Areas"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Page Browse Developers Support Menu Menu Close Home Page Browse Developers Support Sign In Search Sign In Home Page Browse Developers Support Menu Sign In Home Page Browse Developers Support Menu Sign In Sign In Home Page Browse Developers Support Menu Close Home Page Browse Developers Support Sign In Search Home Page Browse Developers Support Sign In Search Home Page Browse Developers Support Sign In Search Search -4250,https://data.stlouisco.com/documents/uses-of-force-2018-2021-ytd/about,Use of Force Reports,Police & Public Interactions,Saint Louis County Open Government,Saint Louis County Open Government,200,Saint Louis County Open Government,[],[],[],[],[],[],"" -4251,https://phoenixopendata.com/dataset/officer-demographics,Personnel Records,Info About Officers,Police Officer Demographics - Dataset - City of Phoenix Open Data,"",200,Welcome - City of Phoenix Open Data,"[""Police Officer Demographics"", ""Police"", ""Police Officer Demographics""]","[""Department"", ""Social"", ""License"", ""Data and Resources""]","[""Provide your feedback!"", ""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Search Datasets Home Departments Police Police Officer Demographics Police Officer Demographics Followers 0 Department Police Mission: The Phoenix Police Department is committed to providing the citizens of Phoenix with quality and professional law enforcement services. Our vision is to make Phoenix... read more Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Police Officer Demographics This dataset contains Phoenix Police Department officer demographics as of January 1st of each year starting in 2018. All ranks of sworn employees are included. Provide your feedback! Help us improve this site and complete the Open Data Customer Survey . Data and Resources Police Officer Demographics CSV Popular A csv file, updated annually, that provides police officer demographics as of... Explore Preview Download demographics employee ethnicity police race Additional Info Field Value Last Updated March 1, 2024, 9:08 AM (UTC-05:00) Created August 1, 2022, 6:32 PM (UTC-04:00) Home Departments Police Police Officer Demographics Police Officer Demographics Followers 0 Department Police Mission: The Phoenix Police Department is committed to providing the citizens of Phoenix with quality and professional law enforcement services. Our vision is to make Phoenix... read more Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Police Officer Demographics This dataset contains Phoenix Police Department officer demographics as of January 1st of each year starting in 2018. All ranks of sworn employees are included. Provide your feedback! Help us improve this site and complete the Open Data Customer Survey . Data and Resources Police Officer Demographics CSV Popular A csv file, updated annually, that provides police officer demographics as of... Explore Preview Download demographics employee ethnicity police race Additional Info Field Value Last Updated March 1, 2024, 9:08 AM (UTC-05:00) Created August 1, 2022, 6:32 PM (UTC-04:00) Home Departments Police Police Officer Demographics Police Officer Demographics Followers 0 Department Police Mission: The Phoenix Police Department is committed to providing the citizens of Phoenix with quality and professional law enforcement services. Our vision is to make Phoenix... read more Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Police Officer Demographics This dataset contains Phoenix Police Department officer demographics as of January 1st of each year starting in 2018. All ranks of sworn employees are included. Provide your feedback! Help us improve this site and complete the Open Data Customer Survey . Data and Resources Police Officer Demographics CSV Popular A csv file, updated annually, that provides police officer demographics as of... Explore Preview Download demographics employee ethnicity police race Additional Info Field Value Last Updated March 1, 2024, 9:08 AM (UTC-05:00) Created August 1, 2022, 6:32 PM (UTC-04:00) Police Officer Demographics Followers 0 Police Officer Demographics Followers 0 Followers 0 " -4252,https://www.norwichct.org/847/Police-Use-of-Force,Use of Force Reports,Police & Public Interactions,"Police Use of Force | Norwich, CT - Official Website","",200,"Norwich, CT - Official Website | Official Website","[""Police Use of Force""]","[""Norwich City Hall, 100 Broadway, Norwich, CT 06360""]","["""", """", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Residents Government Visitors Doing Business How Do I... Home Government Departments Police Open Data Portal Police Use of Force Police Use of Force Our officers are required to complete a Use of Force report every time they use any sort of physical force on a subject beyond the standard and/or justifiable handcuffing, whether an arrest is made or not. These reports are first reviewed by the officer’s supervisor, then the Deputy Chief of Police, then the Training Supervisor. At each level, the reviewers check the report to ensure that all of the necessary details are documented and that the use of force was in compliance with our policy. Those forms are scanned and saved in the department’s internal data server. Upon review of the data from 2017, we noted that we used force on 45 subjects. It’s also notable that the great majority of injuries reported involve minor cuts and abrasions. We observed that most of the force used was physical force such as takedowns, wrist locks, and “come along” techniques. These are hands-on tactics that do not involve any sort of equipment. It should also be noted that in 15 of these 45 events, officers “displayed” their firearm or taser in conjunction with verbal de-escalation strategies in order to gain compliance of the subject. Neither taser nor firearm was discharged in these 15 events. In the data set that we have released, we do not include dates and addresses in order to protect the privacy of the people involved.  We use IMC as our internal software system. This is where all of our reports and dispatch information are documented. The system has set parameters that we must work within. The race and ethnicity categories are limited to those that are presented in the report. We recognize that there are more ethnicities than Hispanic or Non-Hispanic, but our system does not allow us to record more extensive ethnicities at this time. Most Recent I View List Police Demographics Police Officer Involved Shooting Police Use of Force Home Site Map Contact Us Accessibility Copyright Notices /QuickLinks.aspx Norwich City Hall, 100 Broadway, Norwich, CT 06360 Ph: (860) 823-3700 Fx: (860) 885-2131 Facebook Twitter Pinterest Delicious Blogger LinkedIn Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Government Websites by CivicPlus " -4254,https://www.transparentrichmond.org/Police-Department/Richmond-Police-Department-Citations/8j44-b794,Citations,Police & Public Interactions,Richmond Police Department - Citations | Transparent Richmond,"",200,Transparent Richmond,"[""RPD Citations - Citation Type Breakdown (2018 - Present)"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Richmond Police Department - Citations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Richmond Police Department - Citations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Dataset Details"", ""Strategic Priority Areas"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Page Browse Developers Support Menu Menu Close Home Page Browse Developers Support Sign In Search Sign In Home Page Browse Developers Support Menu Sign In Home Page Browse Developers Support Menu Sign In Sign In Home Page Browse Developers Support Menu Close Home Page Browse Developers Support Sign In Search Home Page Browse Developers Support Sign In Search Home Page Browse Developers Support Sign In Search Search -4255,https://data-southbend.opendata.arcgis.com/search?tags=use%20of%20force,Use of Force Reports,Police & Public Interactions,Open Data Portal City of South Bend,City of South Bend Open Data Site,200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -4256,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/39,Calls for Service,Police & Public Interactions,Layer: TPD_CFS_PUBLIC_2018 (ID: 39),"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Layer: TPD_CFS_PUBLIC_2018 (ID: 39)""]",[],[],[],[],"" -4257,https://www.normanok.gov/public-safety/police-department/open-data-portal/complaints-inquiries,Complaints & Misconduct,Info About Officers,"","",404,"","","","","","","","" -4259,https://phoenixopendata.com/dataset/pgp,Incident Reports,Police & Public Interactions,Officer Pointed Gun at Person (PGP) - Dataset - City of Phoenix Open Data,"",200,Welcome - City of Phoenix Open Data,"[""Officer Pointed Gun at Person (PGP)"", ""Police"", ""Officer Pointed Gun at Person (PGP)""]","[""Department"", ""Social"", ""License"", ""Data and Resources""]","[""Provide your feedback!"", ""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Search Datasets Home Departments Police Officer Pointed Gun at Person (PGP) Officer Pointed Gun at Person (PGP) Followers 0 Department Police Mission: The Phoenix Police Department is committed to providing the citizens of Phoenix with quality and professional law enforcement services. Our vision is to make Phoenix... read more Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Officer Pointed Gun at Person (PGP) This dataset contains information about incidents where a Phoenix police officer pointed a gun at a person (PGP) from July 2020 forward. Data is updated monthly on the 1st following completion of a ninety (90) day review period. View Operations Order 1.5: Response to Resistance Policy Provide your feedback! Help us improve this site and complete the Open Data Customer Survey . Data and Resources Pointed Gun at Person Details CSV Popular A csv file, updated monthly, that provides detailed information for each... Explore Preview Download Pointed Gun at Person Summary CSV A csv file, updated monthly, that provides summary information for each... Explore Preview Download PGP gun phoenix police Additional Info Field Value Last Updated March 1, 2024, 9:09 AM (UTC-05:00) Created August 1, 2022, 5:42 PM (UTC-04:00) Home Departments Police Officer Pointed Gun at Person (PGP) Officer Pointed Gun at Person (PGP) Followers 0 Department Police Mission: The Phoenix Police Department is committed to providing the citizens of Phoenix with quality and professional law enforcement services. Our vision is to make Phoenix... read more Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Officer Pointed Gun at Person (PGP) This dataset contains information about incidents where a Phoenix police officer pointed a gun at a person (PGP) from July 2020 forward. Data is updated monthly on the 1st following completion of a ninety (90) day review period. View Operations Order 1.5: Response to Resistance Policy Provide your feedback! Help us improve this site and complete the Open Data Customer Survey . Data and Resources Pointed Gun at Person Details CSV Popular A csv file, updated monthly, that provides detailed information for each... Explore Preview Download Pointed Gun at Person Summary CSV A csv file, updated monthly, that provides summary information for each... Explore Preview Download PGP gun phoenix police Additional Info Field Value Last Updated March 1, 2024, 9:09 AM (UTC-05:00) Created August 1, 2022, 5:42 PM (UTC-04:00) Home Departments Police Officer Pointed Gun at Person (PGP) " -4260,https://stjohnin.gov/PD/PDI/,List of Data Sources,Info About Agencies,"","",200,Town of St. John,"[""St. John Police Department""]",[],"[""Open Data""]","[""Datasets"", ""Open Police Data © 2024 · Text-Only Version""]","[""The St. John Police Department is currently participating in the Police Data Initiative (PDI) as part of the President’s Taskforce on 21st Century Policing. As a participant in this program, we will be publishing specific data to build transparency, increase community trust, and to use data to enhance internal accountability through effective analysis."", ""The St. John Police Department takes great effort in making data as accurate as possible, but there is no avoiding the introduction of errors in this process, which relies on data that cannot always be verified. Information contained in these datasets may change over a period of time. The St. John Police Department is not responsible for any error or omission from this data, or for the use or interpretation of the results of any research conducted."", ""The datasets provided are available for download in an open data format, a CSV (comma separated value) file, that can be used in other applications for data analysis.""]",[],"St. John Police Department Open Data Dataset Menu Agency Home Arrest Demographics Calls for Service Traffic Accidents Traffic Stops Traffic Citation Demographics Traffic Warning Demographics The St. John Police Department is currently participating in the Police Data Initiative (PDI) as part of the President’s Taskforce on 21st Century Policing. As a participant in this program, we will be publishing specific data to build transparency, increase community trust, and to use data to enhance internal accountability through effective analysis. The St. John Police Department takes great effort in making data as accurate as possible, but there is no avoiding the introduction of errors in this process, which relies on data that cannot always be verified. Information contained in these datasets may change over a period of time. The St. John Police Department is not responsible for any error or omission from this data, or for the use or interpretation of the results of any research conducted. The datasets provided are available for download in an open data format, a CSV (comma separated value) file, that can be used in other applications for data analysis. Datasets Agency Home Arrest Demographics Calls for Service Traffic Accidents Traffic Stops Traffic Citation Demographics Traffic Warning Demographics St. John Police Department Open Data Dataset Menu Agency Home Arrest Demographics Calls for Service Traffic Accidents Traffic Stops Traffic Citation Demographics Traffic Warning Demographics St. John Police Department Open Data Dataset Menu Agency Home Arrest Demographics Calls for Service Traffic Accidents Traffic Stops Traffic Citation Demographics Traffic Warning Demographics Dataset Menu Agency Home Arrest Demographics Calls for Service Traffic Accidents Traffic Stops Traffic Citation Demographics Traffic Warning Demographics Agency Home Arrest Demographics Calls for Service Traffic Accidents Traffic Stops Traffic Citation Demographics Traffic Warning Demographics The St. John Police Department is currently participating in the Police Data Initiative (PDI) as part of the President’s Taskforce on 21st Century Policing. As a participant in this program, we will be publishing specific data to build transparency, increase community trust, and to use data to enhance internal accountability through effective analysis. The St. John Police Department takes great effort in making data as accurate as possible, but there is no avoiding the introduction of errors in this process, which relies on data that cannot always be verified. Information contained in these datasets may change over a period of time. The St. John Police Department is not responsible for any error or omission from this data, or for the use or interpretation of the results of any research conducted. The datasets provided are available for download in an open data format, a CSV (comma separated value) file, that can be used in other applications for data analysis. Datasets Agency Home Arrest Demographics Calls for Service Traffic Accidents Traffic Stops Traffic Citation Demographics Traffic Warning Demographics " -4261,https://data.vbgov.com/dataset/police-calls-for-service,Calls for Service,Police & Public Interactions,"","",-1,"","","","","","","","" -4262,https://coc-colacitygis.opendata.arcgis.com/datasets/ColaCityGIS::arrest-1-1-2016-to-3-31-2022/explore?location=34.148902%2C-81.198034%2C10.62,Arrest Records,Police & Public Interactions,City of Columbia GIS - South Carolina,City of Columbia GIS - South Carolina,200,City of Columbia GIS - South Carolina,[],[],[],[],[],[],"" -4263,https://phoenixopendata.com/dataset/calls-for-service,Calls for Service,Police & Public Interactions,Calls for Service - Dataset - City of Phoenix Open Data,"",200,Welcome - City of Phoenix Open Data,"[""Calls for Service"", ""Police"", ""Calls for Service""]","[""Department"", ""Social"", ""License"", ""Data and Resources""]","[""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Search Datasets Home Departments Police Calls for Service Calls for Service Followers 6 Department Police Mission: The Phoenix Police Department is committed to providing the citizens of Phoenix with quality and professional law enforcement services. Our vision is to make Phoenix... read more Social Twitter Facebook Linkedin License Open Data Commons Attribution License Dataset Groups Showcases Activity Stream Calls for Service A CSV file which is updated daily by 11am that includes police calls for service from November 1st, 2015 forward through 7 days prior to today's posting date. All citizen-generated dispatched calls for police service are included. Officer self-initiated calls and non dispatched calls such as calls for general information or calls that are transferred to other departments such as FIRE for response are not included. Data and Resources CALLS FOR SERVICE CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2016 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2017 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2018 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2019 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2020 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2021 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2022 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2023 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download 2024 Calls for Service CSV Popular A CSV file which is updated daily by 11am that includes police calls for... Explore Preview Download Additional Info Field Value Last Updated March 25, 2024, 8:45 AM (UTC-04:00) Created April 14, 2017, 5:50 PM (UTC-04:00) " -4265,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/36,Officer Involved Shootings,Police & Public Interactions,Layer: TPD_OIS_Officers (ID: 36),"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Layer: TPD_OIS_Officers (ID: 36)""]",[],[],[],[],"Name: TPD_OIS_Officers Display Field: BOI_NUM Type: Table Geometry Type: N/A Description: null Copyright Text: N/A Default Visibility: false MaxRecordCount: 1000 Supported Query Formats: JSON Supports Advanced Queries: true Supports Statistics: true Use Standardized Queries: true Extent: Drawing Info: N/A Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: false Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeNone Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID, alias: OBJECTID -) INCI_NUM ( -type: esriFieldTypeInteger, alias: INCI_NUM -) BOI_NUM ( -type: esriFieldTypeString, alias: BOI_NUM, length: 1073741822 -) OFC_AGE ( -type: esriFieldTypeString, alias: OFC_AGE, length: 1073741822 -) OFC_RACE ( -type: esriFieldTypeString, alias: OFC_RACE, length: 1073741822 -) OFC_GEND ( -type: esriFieldTypeString, alias: OFC_GEND, length: 1073741822 -) OFC_TENURE ( -type: esriFieldTypeString, alias: OFC_TENURE, length: 1073741822 -) OIA_OUTCOM ( -type: esriFieldTypeString, alias: OIA_OUTCOM, length: 1073741822 -) CA_OUTCOM ( -type: esriFieldTypeString, alias: CA_OUTCOM, length: 1073741822 -) DATASOURCE ( -type: esriFieldTypeString, alias: DATASOURCE, length: 50 -) Relationships: TPD_OIS (0) -- Related To : TPD_OIS (34) Supported Operations : Query Query Attachments Query Related Records Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4266,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/16,Calls for Service,Police & Public Interactions,Layer: TPD_CFS_PUBLIC_2016 (ID: 16),"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Layer: TPD_CFS_PUBLIC_2016 (ID: 16)""]",[],[],[],[],"Name: TPD_CFS_PUBLIC_2016 Display Field: NHA_NAME Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Default Visibility: true MaxRecordCount: 1000 Supported Query Formats: JSON, geoJSON Min Scale: 1000000 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Has Labels: false Can Modify Layer: false Can Scale Symbols: false Use Standardized Queries: true Supports Datum Transformation: true Extent: XMin: 409271.2427821532 YMin: 266104.22998687625 XMax: 1103828.8923884518 YMax: 686232.2247375324 Spatial Reference: 2868 - (2868) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [0, 166, 116, 255] Size: 4.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 1 Label: Description: Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID, alias: ObjectID -) call_id ( -type: esriFieldTypeString, alias: call_id, length: 12 -) case_id ( -type: esriFieldTypeString, alias: case_id, length: 12 -) acci_id ( -type: esriFieldTypeString, alias: acci_id, length: 12 -) agency ( -type: esriFieldTypeString, alias: agency, length: 4 -) ADDRESS_PUBLIC ( -type: esriFieldTypeString, alias: ADDRESS_PUBLIC, length: 1073741822 -) city ( -type: esriFieldTypeString, alias: city, length: 20 -) state ( -type: esriFieldTypeString, alias: state, length: 2 -) zip ( -type: esriFieldTypeString, alias: zip, length: 10 -) NEIGHBORHD ( -type: esriFieldTypeString, alias: NEIGHBORHD, length: 8 -) emdivision ( -type: esriFieldTypeString, alias: emdivision, length: 4 -) ACTDATE ( -type: esriFieldTypeDate, alias: ACTDATE, length: 8 -) ACTTIME ( -type: esriFieldTypeString, alias: ACTTIME, length: 4 -) ACTDATETIME ( -type: esriFieldTypeDate, alias: ACTDATETIME, length: 8 -) ACT_MONTH ( -type: esriFieldTypeString, alias: ACT_MONTH, length: 34 -, Coded Values: [05-May: May] -, [01-Jan: Jan] -, [02-Feb: Feb] , ...9 more... ) ACT_YEAR ( -type: esriFieldTypeInteger, alias: ACT_YEAR -) ACT_TIME ( -type: esriFieldTypeString, alias: ACT_TIME, length: 4 -) ACT_DOW ( -type: esriFieldTypeString, alias: ACT_DOW, length: 33 -, Coded Values: [1-Su: Su] -, [2-Mo: Mo] -, [3-Tu: Tu] , ...4 more... ) CAPRIORITY ( -type: esriFieldTypeString, alias: CAPRIORITY, length: 1 -) NATURECODE ( -type: esriFieldTypeString, alias: NATURECODE, length: 8 -) NatureCodeDesc ( -type: esriFieldTypeString, alias: NatureCodeDesc, length: 55 -) HOWRECEIVE ( -type: esriFieldTypeString, alias: HOWRECEIVE, length: 8 -) CSDISPOSIT ( -type: esriFieldTypeString, alias: CSDISPOSIT, length: 8 -) DispositionCodeDesc ( -type: esriFieldTypeString, alias: DispositionCodeDesc, length: 55 -) WARD ( -type: esriFieldTypeString, alias: WARD, length: 15 -) NHA_NAME ( -type: esriFieldTypeString, alias: NHA_NAME, length: 38 -) DIVISION ( -type: esriFieldTypeString, alias: DIVISION, length: 50 -) DIVISION_NO ( -type: esriFieldTypeString, alias: DIVISION_NO, length: 10 -) DIVSECT ( -type: esriFieldTypeString, alias: DIVSECT, length: 4 -) LOC_STATUS ( -type: esriFieldTypeString, alias: LOC_STATUS, length: 20 -) TRSQ ( -type: esriFieldTypeString, alias: TRSQ, length: 12 -) X ( -type: esriFieldTypeDouble, alias: X -) Y ( -type: esriFieldTypeDouble, alias: Y -) Shape ( -type: esriFieldTypeGeometry, alias: Shape -) Supported Operations : Query Query Attachments Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4267,https://www.winooskivt.gov/DocumentCenter/Index/139,Stops,Police & Public Interactions,"Document Center • Winooski, VT • CivicEngage",The Document Center is for storage of documents of many different file types. Documents stored in the Document Center can be separated by folders and subfolders.,200,"Winooski, VT | Official Website",[],[],"[""Filter Documents by:"", ""Contact Us"", ""Quick Links"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Search About Government How Do I... Current Initiatives Departments Contact Home Document Center Filter Documents by: From To Folders Documents Events, Programs, Parks & Facilities Community Services Calendar Subscribe to our News Updates Agendas & Minutes Nixle Emergency Alerts & Winter Parking Bans Employment Opportunities Contact Us Winooski City Hall 27 West Allen Street Winooski, VT View our hours 802 655 6410 Staff Directory Quick Links City Clerk's Office Find and Pay for Parking Annual Reports and Budgets Ordinances Land Use Regulations Bid Postings Master Plan Water Quality /QuickLinks.aspx Site Links Home Site Map Accessibility Copyright / Privacy /QuickLinks.aspx Government Websites by CivicPlus® Search About Government How Do I... Current Initiatives Departments Contact Home Document Center Filter Documents by: From To Folders Documents Events, Programs, Parks & Facilities Community Services Calendar Subscribe to our News Updates Agendas & Minutes Nixle Emergency Alerts & Winter Parking Bans Employment Opportunities Contact Us Winooski City Hall 27 West Allen Street Winooski, VT View our hours 802 655 6410 Staff Directory Quick Links City Clerk's Office Find and Pay for Parking Annual Reports and Budgets Ordinances Land Use Regulations Bid Postings Master Plan Water Quality /QuickLinks.aspx Site Links Home Site Map Accessibility Copyright / Privacy /QuickLinks.aspx Government Websites by CivicPlus® Search About Government How Do I... Current Initiatives Departments Contact Home Document Center Filter Documents by: From To Folders Documents Events, Programs, Parks & Facilities Community Services Calendar Subscribe to our News Updates Agendas & Minutes Nixle Emergency Alerts & Winter Parking Bans Employment Opportunities Contact Us Winooski City Hall 27 West Allen Street Winooski, VT View our hours 802 655 6410 Staff Directory Quick Links City Clerk's Office Find and Pay for Parking Annual Reports and Budgets Ordinances Land Use Regulations Bid Postings Master Plan Water Quality /QuickLinks.aspx Site Links Home Site Map Accessibility Copyright / Privacy /QuickLinks.aspx Government Websites by CivicPlus® Search About Government How Do I... Current Initiatives Departments Contact Home Document Center Filter Documents by: From To Folders Documents Events, Programs, Parks & Facilities Community Services Calendar Subscribe to our News Updates Agendas & Minutes Nixle Emergency Alerts & Winter Parking Bans Employment Opportunities Contact Us Winooski City Hall 27 West Allen Street Winooski, VT View our hours 802 655 6410 Staff Directory Quick Links City Clerk's Office Find and Pay for Parking Annual Reports and Budgets Ordinances Land Use Regulations Bid Postings Master Plan Water Quality /QuickLinks.aspx Site Links Home Site Map Accessibility Copyright / Privacy /QuickLinks.aspx Government Websites by CivicPlus® " -4268,https://data-santarosa.opendata.arcgis.com/datasets/santa-rosa-police-complaints/explore,Complaints & Misconduct,Info About Officers,Santa Rosa Police Complaints,City of Santa Rosa Police Complaints,200,City of Santa Rosa,[],[],[],[],[],[],"" -4269,https://www.opendataphilly.org/dataset/shooting-victims,Officer Involved Shootings,Police & Public Interactions,"","",404,"","","","","","","","" -4270,data.vermont.gov/resource/du86-kfnp.json,Officer Involved Shootings,Police & Public Interactions,Vermont State Police Officer Involved Shootings (1977-Present) | Open Data | State of Vermont,"",200,Error retrieving title: No connection adapters were found for '://',"[""Vermont State Police Officer Involved Shootings by Year (1977-Present)"", ""Vermont State Police Officer Involved Shootings by Injury Type (1977-Present)"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Vermont State Police Officer Involved Shootings (1977-Present)"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Vermont State Police Officer Involved Shootings (1977-Present)"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Attachments"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Page Catalog Developers Support State of Vermont Menu Menu Close Home Page Catalog Developers Support State of Vermont Sign In Search Sign In Home Page Catalog Developers Support State of Vermont Menu Sign In Home Page Catalog Developers Support State of Vermont Menu Sign In Sign In Home Page Catalog Developers Support State of Vermont Menu Close Home Page Catalog Developers Support State of Vermont Sign In Search Home Page Catalog Developers Support State of Vermont Sign In Search Home Page Catalog Developers Support State of Vermont Sign In Search Search -4271,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/17,Calls for Service,Police & Public Interactions,Layer: TPD_CFS_PUBLIC_2017 (ID: 17),"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Layer: TPD_CFS_PUBLIC_2017 (ID: 17)""]",[],[],[],[],"" -4272,https://data-santarosa.opendata.arcgis.com/datasets/santa-rosa-police-pursuits/explore,Vehicle Pursuits,Police & Public Interactions,Santa Rosa Police Pursuits,City of Santa Rosa Police Pursuits,200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -4274,https://services7.arcgis.com/wMvCpnbQEKXZsPSQ/arcgis/rest/services/RPD_Police_Personnel/FeatureServer/0,Personnel Records,Info About Officers,Layer: RPD.DBO.Police_Personnel (ID:0),"",200,Home,[],"[""Layer: RPD.DBO.Police_Personnel (ID:0)""]",[],[],[],[],"JSON Layer: RPD.DBO.Police_Personnel (ID:0) View In: Map Viewer Name: RPD.DBO.Police_Personnel Display Field: Full_Name Type: Feature Layer Geometry Type: esriGeometryPolygon Description: Copyright Text: Min. Scale: 0 Max. Scale: 0 Default Visibility: true Max Record Count: 1000 Supported query Formats: JSON Use Standardized Queries: True Extent: XMin: 1368659.46821216 YMin: 1121110.80768582 XMax: 1445659.46808324 YMax: 1198110.80788499 Spatial Reference: 102717 (2262) Drawing Info: {""renderer"":{""type"":""uniqueValue"",""field1"":""Residency"",""defaultSymbol"":{""type"":""esriSFS"",""style"":""esriSFSSolid"",""color"":[130,130,130,255],""outline"":{""type"":""esriSLS"",""style"":""esriSLSSolid"",""color"":[110,110,110,255],""width"":0.7}},""defaultLabel"":"" "",""uniqueValueInfos"":[{""symbol"":{""type"":""esriSFS"",""style"":""esriSFSSolid"",""color"":[20,158,206,255],""outline"":{""type"":""esriSLS"",""style"":""esriSLSSolid"",""color"":[110,110,110,255],""width"":0.7}},""value"":""Outside_City"",""label"":""Outside_City""},{""symbol"":{""type"":""esriSFS"",""style"":""esriSFSSolid"",""color"":[181,53,53,255],""outline"":{""type"":""esriSLS"",""style"":""esriSLSSolid"",""color"":[0,0,0,255],""width"":0.4}},""value"":""Inside_City"",""label"":""Inside_City""}],""fieldDelimiter"":"","",""authoringInfo"":{""colorRamp"":{""type"":""multipart"",""colorRamps"":[{""type"":""algorithmic"",""algorithm"":""esriCIELabAlgorithm"",""fromColor"":[237,81,81,255],""toColor"":[237,81,81,255]},{""type"":""algorithmic"",""algorithm"":""esriCIELabAlgorithm"",""fromColor"":[21,160,207,255],""toColor"":[21,160,207,255]},{""type"":""algorithmic"",""algorithm"":""esriCIELabAlgorithm"",""fromColor"":[167,199,54,255],""toColor"":[167,199,54,255]},{""type"":""algorithmic"",""algorithm"":""esriCIELabAlgorithm"",""fromColor"":[158,85,156,255],""toColor"":[158,85,156,255]},{""type"":""algorithmic"",""algorithm"":""esriCIELabAlgorithm"",""fromColor"":[252,145,30,255],""toColor"":[252,145,30,255]},{""type"":""algorithmic"",""algorithm"":""esriCIELabAlgorithm"",""fromColor"":[255,223,61,255],""toColor"":[255,223,61,255]},{""type"":""algorithmic"",""algorithm"":""esriCIELabAlgorithm"",""fromColor"":[247,136,216,255],""toColor"":[247,136,216,255]},{""type"":""algorithmic"",""algorithm"":""esriCIELabAlgorithm"",""fromColor"":[184,129,73,255],""toColor"":[184,129,73,255]},{""type"":""algorithmic"",""algorithm"":""esriCIELabAlgorithm"",""fromColor"":[60,176,155,255],""toColor"":[60,176,155,255]},{""type"":""algorithmic"",""algorithm"":""esriCIELabAlgorithm"",""fromColor"":[107,107,214,255],""toColor"":[107,107,214,255]}]}}},""scaleSymbols"":true,""transparency"":0,""labelingInfo"":null} HasZ: false HasM: false Has Attachments: false Has Geometry Properties: true HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Object ID Field: OBJECTID Unique ID Field: Name : OBJECTID IsSystemMaintained : True Global ID Field: Type ID Field: Residency Fields: OBJECTID (type: esriFieldTypeOID, alias: OBJECTID_1, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false) Residency (type: esriFieldTypeString, alias: Residency, SQL Type: sqlTypeOther, length: 20, nullable: true, editable: true) Full_Name (type: esriFieldTypeString, alias: Full_Name, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) Sex (type: esriFieldTypeString, alias: Sex, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) Race (type: esriFieldTypeString, alias: Race, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) Ethnicity (type: esriFieldTypeString, alias: Ethnicity, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) Age (type: esriFieldTypeDouble, alias: Age, SQL Type: sqlTypeOther, nullable: true, editable: true) Hire_Date (type: esriFieldTypeString, alias: Hire_Date, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) Age_At_Hire (type: esriFieldTypeDouble, alias: Age_At_Hire, SQL Type: sqlTypeOther, nullable: true, editable: true) Years_On_Job (type: esriFieldTypeDouble, alias: Years_On_Job, SQL Type: sqlTypeOther, nullable: true, editable: true) Employee_Status (type: esriFieldTypeString, alias: Employee_Status, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) Employees_Type (type: esriFieldTypeString, alias: Employees_Type, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) Rank (type: esriFieldTypeString, alias: Rank, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) Rank_Start_Date (type: esriFieldTypeString, alias: Rank_Start_Date, SQL Type: sqlTypeOther, length: 255, nullable: true, editable: true) Shape__Area (type: esriFieldTypeDouble, alias: Shape__Area, SQL Type: sqlTypeDouble, nullable: true, editable: false) Shape__Length (type: esriFieldTypeDouble, alias: Shape__Length, SQL Type: sqlTypeDouble, nullable: true, editable: false) Types: ID: Outside_City Name: Outside_City Domains: Templates: Name: Outside_City Description: Drawing Tool: esriFeatureEditToolPolygon Prototype: Attributes: Residency : Outside_City ID: Inside_City Name: Inside_City Domains: Templates: Name: Inside_City Description: Drawing Tool: esriFeatureEditToolPolygon Prototype: Attributes: Res" -4275,https://www.portland.gov/police/open-data/ois,Officer Involved Shootings,Police & Public Interactions,Officer Involved Shootings | Portland.gov,Dynamic data dashboard describing PPB officer involved shootings from 2010 to current.,200,"City of Portland, Oregon | Portland.gov","[""Officer Involved Shootings""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Dashboard Walkthrough"", ""Metadata"", ""Related"", ""Topics"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]","[""2. Technical Specifications"", ""3. Visualization Walkthrough"", ""4. Download Data""]","[""a. Cases by Year with Subject Injury Type"", ""b. Initial Call Type"", ""c. Aggregate Statistics"", ""d. Additional Aggregate Statistics"", ""e. Subject Weapon"", ""f. Demographics"", ""g. Subject Age Ranges"", ""h. Toolbar""]",[],[],"" -4276,https://stjohnin.gov/PD/PDI/Training/,Training & Hiring Info,Info About Officers,Town of St. John - Police Department Training,"This is the offical website for the Town of St. John, Indiana.",200,Town of St. John,"[""Police Data Initative Dataset for Training""]",[],"[""Datasets""]","[""Block Party Permit"", ""Citations"", ""Crime Map"", ""Daily Bulletin"", ""Handgun License"", ""Fireworks Information"", ""Peddler/Solicitor"", ""Police Data Initiative"", ""SafeTrade"", ""Text and E-Mail Notification System"", ""Vacation Check Request""]","[""The St. John Police Department takes great effort in making data as accurate as possible, but there is no avoiding the introduction of errors in this process, which relies on data that cannot always be verified. Information contained in this dataset may change over a period of time. The St. John Police Department is not responsible for any error or omission from this data, or for the use or interpretation of the results of any research conducted."", ""2018 Training"", ""2019 Training"", ""Arrest Demographics"", ""Bias Crimes"", ""Calls for Service / Daily Bulletin"", ""Department Demographics"", ""Peddler/Solicitor Licenses"", ""Response to Resistance"", ""Training"", ""Traffic Stops"", ""Traffic Accidents"", ""Traffic Citation Demographics"", ""Traffic Warning Demographics"", ""Year End Reports"", ""Accessibility Copyright © 2024 Town of St. John, Indiana Accessible Version Follow us on""]",[],Employment Opportunities Event Calendar Pay Online Pay Utility Bill Employment Opportunities Event Calendar Pay Online Pay Utility Bill ☰ Home News Community Community About Awards Won by the Town of St. John Demographics History Schools Residents Residents Community Organizations Election Information FAQ Center Library Local Club Sports Meeting Minutes and Agendas Park Programs Resident Services Road Closures Special Events Town Ordinances Watch Meetings Live Resources Resources Employment Forms Public Documents Town Ordinances Departments Departments Animal Control Boards and Commissions Building and Planning Building and Planning Building and Planning Homepage GIS and Maps Licenses and Permits Business Directory Registered Contractors Code Enforcement Clerk-Treasurer Clerk-Treasurer Clerk-Treasurer Homepage FAQs Finance Notary Pay Online Pay Utility Bill Public Records Town Ordinances Fire Department Fire Department Fire Department Homepage CPR Classes FAQ's Privacy Policy Training Site Useful Information Meeting Minutes and Agendas Parks Department Parks Department Parks Department Homepage Dog Park Park Locations and Programs Patnoe Park Family Gardens Special Events Police Department Police Department Police Department Homepage Block Party Permit Citations Handgun License Peddler/Solicitor Police Data Initiative Temporary Parking Permit Vacation Check Request More Public Works Public Works Public Works Homepage Bulk Waterstation Electronic Recycling Program Fire Hydrant Flushing Leaf and Branch Pick Up Service Requests Stormwater Management / MS4 Town Council Town Manager Development Contact Us ☰ Home News Community Community About Awards Won by the Town of St. John Demographics History Schools Residents Residents Community Organizations Election Information FAQ Center Library Local Club Sports Meeting Minutes and Agendas Park Programs Resident Services Road Closures Special Events Town Ordinances Watch Meetings Live Resources Resources Employment Forms Public Documents Town Ordinances Departments Departments Animal Control Boards and Commissions Building and Planning Building and Planning Building and Planning Homepage GIS and Maps Licenses and Permits Business Directory Registered Contractors Code Enforcement Clerk-Treasurer Clerk-Treasurer Clerk-Treasurer Homepage FAQs Finance Notary Pay Online Pay Utility Bill Public Records Town Ordinances Fire Department Fire Department Fire Department Homepage CPR Classes FAQ's Privacy Policy Training Site Useful Information Meeting Minutes and Agendas Parks Department Parks Department Parks Department Homepage Dog Park Park Locations and Programs Patnoe Park Family Gardens Special Events Police Department Police Department Police Department Homepage Block Party Permit Citations Handgun License Peddler/Solicitor Police Data Initiative Temporary Parking Permit Vacation Check Request More Public Works Public Works Public Works Homepage Bulk Waterstation Electronic Recycling Program Fire Hydrant Flushing Leaf and Branch Pick Up Service Requests Stormwater Management / MS4 Town Council Town Manager Development Contact Us -4277,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/13,Calls for Service,Police & Public Interactions,Layer: TPD_CFS_PUBLIC_2013 (ID: 13),"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Layer: TPD_CFS_PUBLIC_2013 (ID: 13)""]",[],[],[],[],"Name: TPD_CFS_PUBLIC_2013 Display Field: NHA_NAME Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Default Visibility: true MaxRecordCount: 1000 Supported Query Formats: JSON, geoJSON Min Scale: 1000000 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Has Labels: false Can Modify Layer: false Can Scale Symbols: false Use Standardized Queries: true Supports Datum Transformation: true Extent: XMin: 960952.1473097131 YMin: 361917.080052495 XMax: 1080619.5 YMax: 485841.4504593164 Spatial Reference: 2868 - (2868) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [0, 3, 173, 255] Size: 4.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 1 Label: Description: Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID, alias: ObjectID -) call_id ( -type: esriFieldTypeString, alias: call_id, length: 12 -) case_id ( -type: esriFieldTypeString, alias: case_id, length: 12 -) acci_id ( -type: esriFieldTypeString, alias: acci_id, length: 12 -) agency ( -type: esriFieldTypeString, alias: agency, length: 4 -) ADDRRESS_PUBLIC ( -type: esriFieldTypeString, alias: ADDRRESS_PUBLIC, length: 1073741822 -) city ( -type: esriFieldTypeString, alias: city, length: 20 -) state ( -type: esriFieldTypeString, alias: state, length: 2 -) zip ( -type: esriFieldTypeString, alias: zip, length: 10 -) NEIGHBORHD ( -type: esriFieldTypeString, alias: NEIGHBORHD, length: 8 -) emdivision ( -type: esriFieldTypeString, alias: emdivision, length: 4 -) ACTDATE ( -type: esriFieldTypeDate, alias: ACTDATE, length: 8 -) ACTTIME ( -type: esriFieldTypeString, alias: ACTTIME, length: 4 -) CAPRIORITY ( -type: esriFieldTypeString, alias: CAPRIORITY, length: 1 -) NATURECODE ( -type: esriFieldTypeString, alias: NATURECODE, length: 8 -) NatureCodeDesc ( -type: esriFieldTypeString, alias: NatureCodeDesc, length: 55 -) HOWRECEIVE ( -type: esriFieldTypeString, alias: HOWRECEIVE, length: 8 -) CSDISPOSIT ( -type: esriFieldTypeString, alias: CSDISPOSIT, length: 8 -) DispositionCodeDesc ( -type: esriFieldTypeString, alias: DispositionCodeDesc, length: 55 -) LOC_METHOD ( -type: esriFieldTypeString, alias: LOC_METHOD, length: 10 -) NHA_NAME ( -type: esriFieldTypeString, alias: NHA_NAME, length: 38 -) WARD ( -type: esriFieldTypeDouble, alias: WARD -) Shape ( -type: esriFieldTypeGeometry, alias: Shape -) POINT_X ( -type: esriFieldTypeDouble, alias: POINT_X -) POINT_Y ( -type: esriFieldTypeDouble, alias: POINT_Y -) Supported Operations : Query Query Attachments Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4278,https://policeanalysis.tucsonaz.gov/,List of Data Sources,Info About Agencies,Tucson Police Data & Analysis,"As part of our commitment to transparency and accountability, the Tucson Police Department is empowering community members to explore and download policing data.",200,Tucson Police Data & Analysis,[],[],[],[],[],[],"" -4279,https://phoenixopendata.com/dataset/arrests,Arrest Records,Police & Public Interactions,Adult Arrests - Dataset - City of Phoenix Open Data,"",200,Welcome - City of Phoenix Open Data,"[""Adult Arrests"", ""Police"", ""Adult Arrests""]","[""Department"", ""Social"", ""License"", ""Data and Resources""]","[""Provide your feedback!"", ""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Search Datasets Home Departments Police Adult Arrests Adult Arrests Followers 0 Department Police Mission: The Phoenix Police Department is committed to providing the citizens of Phoenix with quality and professional law enforcement services. Our vision is to make Phoenix... read more Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Adult Arrests This dataset contains adult arrest information from January 2018 forward, including demographic information for officers as well as individuals. Data is updated monthly on the 1st. View Operations Order 4.10: Arrest Policy Provide your feedback! Help us improve this site and complete the Open Data Customer Survey . Data and Resources Adult Arrests Details CSV Popular A csv file, updated monthly, that provides adult arrest details including the... Explore Preview Download Adult Arrests Summary CSV Popular A csv file, updated monthly, that provides summary information for each adult... Explore Preview Download arrest charges phoenix police Additional Info Field Value Last Updated March 1, 2024, 9:08 AM (UTC-05:00) Created August 1, 2022, 4:54 PM (UTC-04:00) Home Departments Police Adult Arrests Adult Arrests Followers 0 Department Police Mission: The Phoenix Police Department is committed to providing the citizens of Phoenix with quality and professional law enforcement services. Our vision is to make Phoenix... read more Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Adult Arrests This dataset contains adult arrest information from January 2018 forward, including demographic information for officers as well as individuals. Data is updated monthly on the 1st. View Operations Order 4.10: Arrest Policy Provide your feedback! Help us improve this site and complete the Open Data Customer Survey . Data and Resources Adult Arrests Details CSV Popular A csv file, updated monthly, that provides adult arrest details including the... Explore Preview Download Adult Arrests Summary CSV Popular A csv file, updated monthly, that provides summary information for each adult... Explore Preview Download arrest charges phoenix police Additional Info Field Value Last Updated March 1, 2024, 9:08 AM (UTC-05:00) Created August 1, 2022, 4:54 PM (UTC-04:00) Home Departments Police Adult Arrests " -4280,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/53,Calls for Service,Police & Public Interactions,Layer: TPD_CFS_PUBLIC_2020 (ID: 53),"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Layer: TPD_CFS_PUBLIC_2020 (ID: 53)""]",[],[],[],[],"Name: TPD_CFS_PUBLIC_2020 Display Field: NHA_NAME Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Default Visibility: true MaxRecordCount: 1000 Supported Query Formats: JSON, geoJSON Min Scale: 0 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Has Labels: false Can Modify Layer: false Can Scale Symbols: false Use Standardized Queries: true Supports Datum Transformation: true Extent: XMin: 747554.0400262475 YMin: 211040.4291338548 XMax: 1101887.8520341218 YMax: 689498.8861548528 Spatial Reference: 2868 - (2868) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [0, 176, 6, 255] Size: 4.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 1 Label: Description: Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID, alias: OBJECTID -) X ( -type: esriFieldTypeDouble, alias: X -) Y ( -type: esriFieldTypeDouble, alias: Y -) call_id ( -type: esriFieldTypeString, alias: call_id, length: 12 -) case_id ( -type: esriFieldTypeString, alias: case_id, length: 12 -) acci_id ( -type: esriFieldTypeString, alias: acci_id, length: 12 -) agency ( -type: esriFieldTypeString, alias: agency, length: 4 -) ADDRESS_PUBLIC ( -type: esriFieldTypeString, alias: ADDRESS_PUBLIC, length: 1073741822 -) city ( -type: esriFieldTypeString, alias: city, length: 20 -) state ( -type: esriFieldTypeString, alias: state, length: 2 -) zip ( -type: esriFieldTypeString, alias: zip, length: 10 -) NEIGHBORHD ( -type: esriFieldTypeString, alias: NEIGHBORHD, length: 8 -) emdivision ( -type: esriFieldTypeString, alias: emdivision, length: 4 -) ACTDATE ( -type: esriFieldTypeDate, alias: ACTDATE, length: 8 -) ACTTIME ( -type: esriFieldTypeString, alias: ACTTIME, length: 4 -) ACTDATETIME ( -type: esriFieldTypeDate, alias: ACTDATETIME, length: 8 -) ACT_MONTH ( -type: esriFieldTypeString, alias: ACT_MONTH, length: 34 -) ACT_YEAR ( -type: esriFieldTypeInteger, alias: ACT_YEAR -) ACT_DOW ( -type: esriFieldTypeString, alias: ACT_DOW, length: 33 -) ACT_TIME ( -type: esriFieldTypeString, alias: ACT_TIME, length: 4 -) CAPRIORITY ( -type: esriFieldTypeString, alias: CAPRIORITY, length: 1 -) NATURECODE ( -type: esriFieldTypeString, alias: NATURECODE, length: 8 -) NatureCodeDesc ( -type: esriFieldTypeString, alias: NatureCodeDesc, length: 55 -) HOWRECEIVE ( -type: esriFieldTypeString, alias: HOWRECEIVE, length: 8 -) CSDISPOSIT ( -type: esriFieldTypeString, alias: CSDISPOSIT, length: 8 -) DispositionCodeDesc ( -type: esriFieldTypeString, alias: DispositionCodeDesc, length: 55 -) LOC_STATUS ( -type: esriFieldTypeString, alias: LOC_STATUS, length: 20 -) WARD ( -type: esriFieldTypeString, alias: WARD, length: 15 -) NHA_NAME ( -type: esriFieldTypeString, alias: NHA_NAME, length: 38 -) DIVISION ( -type: esriFieldTypeString, alias: DIVISION, length: 50 -) DIVISION_NO ( -type: esriFieldTypeString, alias: DIVISION_NO, length: 10 -) DIVSECT ( -type: esriFieldTypeString, alias: DIVSECT, length: 4 -) TRSQ ( -type: esriFieldTypeString, alias: TRSQ, length: 12 -) City_geo ( -type: esriFieldTypeString, alias: City_geo, length: 20 -) ADDRESS_100BLK ( -type: esriFieldTypeString, alias: ADDRESS_100BLK, length: 1073741822 -) Shape ( -type: esriFieldTypeGeometry, alias: Shape -) Supported Operations : Query Query Attachments Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4281,https://data.stlouisco.com/apps/st-louis-county-police-department-uses-of-force/explore,Use of Force Reports,Police & Public Interactions,"","",404,"","","","","","","","" -4282,https://www.normanok.gov/public-safety/police-department/open-data-portal/use-force,Use of Force Reports,Police & Public Interactions,We've got some trouble | 404 - Resource not found,"",200,"Welcome to the City of Norman, OK | City of Norman, OK","[""Resource not found Error 404""]",[],[],[],[],[],Resource not found Error 404 The requested resource could not be found. -4283,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/15,Calls for Service,Police & Public Interactions,Layer: TPD_CFS_PUBLIC_2015 (ID: 15),"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Layer: TPD_CFS_PUBLIC_2015 (ID: 15)""]",[],[],[],[],"Name: TPD_CFS_PUBLIC_2015 Display Field: NHA_NAME Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Default Visibility: true MaxRecordCount: 1000 Supported Query Formats: JSON, geoJSON Min Scale: 1000000 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Has Labels: false Can Modify Layer: false Can Scale Symbols: false Use Standardized Queries: true Supports Datum Transformation: true Extent: XMin: 960157.2509842515 YMin: 358885.4087926522 XMax: 1079510.332020998 YMax: 485849.68503937125 Spatial Reference: 2868 - (2868) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [0, 93, 150, 255] Size: 4.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 1 Label: Description: Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID, alias: ObjectID -) call_id ( -type: esriFieldTypeString, alias: call_id, length: 12 -) case_id ( -type: esriFieldTypeString, alias: case_id, length: 12 -) acci_id ( -type: esriFieldTypeString, alias: acci_id, length: 12 -) agency ( -type: esriFieldTypeString, alias: agency, length: 4 -) ADDRESS_PUBLIC ( -type: esriFieldTypeString, alias: ADDRESS_PUBLIC, length: 1073741822 -) city ( -type: esriFieldTypeString, alias: city, length: 20 -) state ( -type: esriFieldTypeString, alias: state, length: 2 -) zip ( -type: esriFieldTypeString, alias: zip, length: 10 -) NEIGHBORHD ( -type: esriFieldTypeString, alias: NEIGHBORHD, length: 8 -) emdivision ( -type: esriFieldTypeString, alias: emdivision, length: 4 -) ACTDATE ( -type: esriFieldTypeDate, alias: ACTDATE, length: 8 -) ACTTIME ( -type: esriFieldTypeString, alias: ACTTIME, length: 4 -) CAPRIORITY ( -type: esriFieldTypeString, alias: CAPRIORITY, length: 1 -) NATURECODE ( -type: esriFieldTypeString, alias: NATURECODE, length: 8 -) NatureCodeDesc ( -type: esriFieldTypeString, alias: NatureCodeDesc, length: 55 -) HOWRECEIVE ( -type: esriFieldTypeString, alias: HOWRECEIVE, length: 8 -) CSDISPOSIT ( -type: esriFieldTypeString, alias: CSDISPOSIT, length: 8 -) DispositionCodeDesc ( -type: esriFieldTypeString, alias: DispositionCodeDesc, length: 55 -) LOC_METHOD ( -type: esriFieldTypeString, alias: LOC_METHOD, length: 10 -) WARD ( -type: esriFieldTypeString, alias: WARD, length: 15 -) NHA_NAME ( -type: esriFieldTypeString, alias: NHA_NAME, length: 38 -) X ( -type: esriFieldTypeDouble, alias: X -) Y ( -type: esriFieldTypeDouble, alias: Y -) Shape ( -type: esriFieldTypeGeometry, alias: Shape -) Supported Operations : Query Query Attachments Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4284,https://data.cityofsacramento.org/search?collection=Dataset&tags=crime,Crime Maps & Reports,Agency-Published Resources,City of Sacramento Open Data,City of Sacramento Open Data Site,200,City of Sacramento Open Data,[],[],[],[],[],[],"" -4285,https://information.stpaul.gov/datasets/stpaul::saint-paul-police-department-citations-1/explore,Citations,Police & Public Interactions,Saint Paul Police Department Citations,"The following data shows the types of citations issued, total number of citations issued each year since 2015, demographic information about those who received citations and the location of where the citations were issued.",200,St Paul Open Information,[],[],[],[],[],[],"" -4286,http://www.rutlandcitypolice.com/open-data/response-to-resistance/,Use of Force Reports,Police & Public Interactions,Rutland City Police Department - Response to Resistance,New page,200,Rutland City Police Department - Home,"[""Response to Resistance""]",[],[],[],[],[],Expand/collapse navigation Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Response to Resistance Response to Resistance 2015-2017 Rutland City Police Department Use of Force report data 2015-2017 ResponseToResistance 2015-2017.xls Microsoft Excel sheet [94.5 KB] The Rutland City Police Department reports any response to resistance or use of force beyond compliant handcuffing. Response to Resistance Motor Vehicle Stops Community Engagement Print | Sitemap © Rutland City Police Department Web View Mobile View Logout | Edit page Expand/collapse navigation Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Response to Resistance Response to Resistance 2015-2017 Rutland City Police Department Use of Force report data 2015-2017 ResponseToResistance 2015-2017.xls Microsoft Excel sheet [94.5 KB] The Rutland City Police Department reports any response to resistance or use of force beyond compliant handcuffing. Response to Resistance Motor Vehicle Stops Community Engagement Print | Sitemap © Rutland City Police Department Web View Mobile View Logout | Edit page Expand/collapse navigation Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Response to Resistance Motor Vehicle Stops Community Engagement Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Response to Resistance Response to Resistance 2015-2017 Rutland City Police Department Use of Force report data 2015-2017 ResponseToResistance 2015-2017.xls Microsoft Excel sheet [94.5 KB] The Rutland City Police Department reports any response to resistance or use of force beyond compliant handcuffing. Response to Resistance Motor Vehicle Stops Community Engagement Print | Sitemap © Rutland City Police Department Web View Mobile View Logout | Edit page Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Response to Resistance Response to Resistance 2015-2017 Rutland City Police Department Use of Force report data 2015-2017 ResponseToResistance 2015-2017.xls Microsoft Excel sheet [94.5 KB] The Rutland City Police Department reports any response to resistance or use of force beyond compliant handcuffing. Response to Resistance Motor Vehicle Stops Community Engagement -4287,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/34,Officer Involved Shootings,Police & Public Interactions,Layer: TPD_OIS (ID: 34),"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Layer: TPD_OIS (ID: 34)""]",[],[],[],[],"Name: TPD_OIS Display Field: BOI_NUM Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Default Visibility: true MaxRecordCount: 1000 Supported Query Formats: JSON, geoJSON Min Scale: 1000000 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Has Labels: false Can Modify Layer: false Can Scale Symbols: false Use Standardized Queries: true Supports Datum Transformation: true Extent: XMin: 979137.4645669274 YMin: 413803.9937664047 XMax: 1048496.1358267702 YMax: 466979.2158792615 Spatial Reference: 2868 - (2868) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [133, 0, 11, 255] Size: 4.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 1 Label: Description: Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: null Fields: OBJECTID_1 ( -type: esriFieldTypeOID, alias: OBJECTID_1 -) INCI_NUM ( -type: esriFieldTypeInteger, alias: INCI_NUM -) X ( -type: esriFieldTypeDouble, alias: X -) Y ( -type: esriFieldTypeDouble, alias: Y -) BOI_NUM ( -type: esriFieldTypeString, alias: BOI_NUM, length: 1073741822 -) INCI_DATE ( -type: esriFieldTypeString, alias: INCI_DATE, length: 1073741822 -) ADDRESS ( -type: esriFieldTypeString, alias: ADDRESS, length: 1073741822 -) CITY ( -type: esriFieldTypeString, alias: CITY, length: 1073741822 -) STATE ( -type: esriFieldTypeString, alias: STATE, length: 1073741822 -) ZIP ( -type: esriFieldTypeInteger, alias: ZIP -) SHAPE ( -type: esriFieldTypeGeometry, alias: SHAPE -) DATASOURCE ( -type: esriFieldTypeString, alias: DATASOURCE, length: 50 -) Relationships: TPD_OIS_Officers (0) -- Related To : TPD_OIS_Officers (36) TPD_OIS_Suspects (1) -- Related To : TPD_OIS_Suspects (37) Supported Operations : Query Query Attachments Query Related Records Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4288,https://www.norwichct.org/845/Police-Demographics,Personnel Records,Info About Officers,"Police Demographics | Norwich, CT - Official Website","",200,"Norwich, CT - Official Website | Official Website","[""Police Demographics""]","[""Police Officer Gender Information"", ""Police Officer Race-Ethnicity Information"", ""Norwich City Hall, 100 Broadway, Norwich, CT 06360""]","["""", """", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Residents Government Visitors Doing Business How Do I... Home Government Departments Police Open Data Portal Police Demographics Police Demographics The following table contains current data on our sworn personnel and includes comparison information of the general population of the city according to the 2010 U.S. Census. Police Officer Gender Information Most Recent View List Police Officer Race-Ethnicity Information Most Recent View List Police Demographics Police Officer Involved Shooting Police Use of Force Home Site Map Contact Us Accessibility Copyright Notices /QuickLinks.aspx Norwich City Hall, 100 Broadway, Norwich, CT 06360 Ph: (860) 823-3700 Fx: (860) 885-2131 Facebook Twitter Pinterest Delicious Blogger LinkedIn Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Government Websites by CivicPlus Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Residents Government Visitors Doing Business How Do I... Home Government Departments Police Open Data Portal Police Demographics Police Demographics The following table contains current data on our sworn personnel and includes comparison information of the general population of the city according to the 2010 U.S. Census. Police Officer Gender Information Most Recent View List Police Officer Race-Ethnicity Information Most Recent View List Police Demographics Police Officer Involved Shooting Police Use of Force Home Site Map Contact Us Accessibility Copyright Notices /QuickLinks.aspx Norwich City Hall, 100 Broadway, Norwich, CT 06360 Ph: (860) 823-3700 Fx: (860) 885-2131 Facebook Twitter Pinterest Delicious Blogger LinkedIn Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Government Websites by CivicPlus Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Residents Government Visitors Doing Business How Do I... Home Government Departments Police Open Data Portal Police Demographics Police Demographics The following table contains current data on our sworn personnel and includes comparison information of the general population of the city according to the 2010 U.S. Census. Police Officer Gender Information Most Recent View List Police Officer Race-Ethnicity Information Most Recent View List Police Demographics Police Officer Involved Shooting Police Use of Force Home Site Map Contact Us Accessibility Copyright Notices /QuickLinks.aspx Norwich City Hall, 100 Broadway, Norwich, CT 06360 Ph: (860) 823-3700 Fx: (860) 885-2131 Facebook Twitter Pinterest Delicious Blogger LinkedIn Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Government Websites by CivicPlus " -4289,https://www.transparentrichmond.org/Police-Department/Richmond-Police-Department-Complaints-and-Investig/wbyy-d6gi,Complaints & Misconduct,Info About Officers,Richmond Police Department - Complaints and Investigations | Transparent Richmond,"",200,Transparent Richmond,"[""RPD Complaints - Administrative Investigations and Citizen Complaints, per Year (2015 - Present)"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Richmond Police Department - Complaints and Investigations"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Richmond Police Department - Complaints and Investigations"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Dataset Details"", ""Strategic Priority Areas"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Page Browse Developers Support Menu Menu Close Home Page Browse Developers Support Sign In Search Sign In Home Page Browse Developers Support Menu Sign In Home Page Browse Developers Support Menu Sign In Sign In Home Page Browse Developers Support Menu Close Home Page Browse Developers Support Sign In Search Home Page Browse Developers Support Sign In Search Home Page Browse Developers Support Sign In Search Search -4291,https://northamptonpd.com/open-data-portal.html,Use of Force Reports,Police & Public Interactions,Northampton Massachusetts Police Department - Open Data Portal,"The Northampton Massachusetts Police Department - While striving toward professional excellence, we are dedicated to work in partnership with our community to p",200,Northampton Massachusetts Police Department - Home,[],"[""Sidebar""]","["""", ""X Accessibility Options ♲""]",[],[],[],Sidebar × Home Employment Department Directory Forms & Reports Arrest Logs 2024 Daily Logs 2024 Accountability & Transparency Commend an Officer Sitemap Sidebar × Home Employment Department Directory Forms & Reports Arrest Logs 2024 Daily Logs 2024 Accountability & Transparency Commend an Officer Sitemap Home Employment Department Directory Forms & Reports Arrest Logs 2024 Daily Logs 2024 Accountability & Transparency Commend an Officer Sitemap Home Employment Department Directory Forms & Reports Arrest Logs 2024 Daily Logs 2024 Accountability & Transparency Commend an Officer Sitemap Home Employment Department Directory Forms & Reports Arrest Logs 2024 Daily Logs 2024 Accountability & Transparency Commend an Officer Sitemap -4292,https://data.virginia.gov/Public-Safety/Community-Policing-Data-July-1-2020-to-December-31/2c96-texw,Stops,Police & Public Interactions,"","",404,"","","","","","","","" -4293,https://data.cityofsacramento.org/search?collection=Dataset&tags=citations,Citations,Police & Public Interactions,City of Sacramento Open Data,City of Sacramento Open Data Site,200,City of Sacramento Open Data,[],[],[],[],[],[],"" -4294,http://www.rutlandcitypolice.com/open-data/motor-vehicle-stops/,Stops,Police & Public Interactions,Rutland City Police Department - Motor Vehicle Stops,New page,200,Rutland City Police Department - Home,"[""Motor Vehicle Stops""]","[""Contact Us Today!""]",[],[],[],[],"Expand/collapse navigation Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Motor Vehicle Stops Motor Vehicle Stop 2011-2015 Rutland City Police Department Motor Vehicle Stop data 2011-2015 MotorVehicleStop.xlsx Microsoft Excel sheet [1.6 MB] The Rutland City Police Department captures a multitude of data on every motor vehicle stop. Response to Resistance Motor Vehicle Stops Community Engagement Contact Us Today! Rutland City Police Department 108 Wales St. Rutland , Vermont 05701 Phone: 802 773-1820 802 773-1820 Print | Sitemap © Rutland City Police Department Web View Mobile View Logout | Edit page Expand/collapse navigation Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Motor Vehicle Stops Motor Vehicle Stop 2011-2015 Rutland City Police Department Motor Vehicle Stop data 2011-2015 MotorVehicleStop.xlsx Microsoft Excel sheet [1.6 MB] The Rutland City Police Department captures a multitude of data on every motor vehicle stop. Response to Resistance Motor Vehicle Stops Community Engagement Contact Us Today! Rutland City Police Department 108 Wales St. Rutland , Vermont 05701 Phone: 802 773-1820 802 773-1820 Print | Sitemap © Rutland City Police Department Web View Mobile View Logout | Edit page Expand/collapse navigation Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Response to Resistance Motor Vehicle Stops Community Engagement Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Motor Vehicle Stops Motor Vehicle Stop 2011-2015 Rutland City Police Department Motor Vehicle Stop data 2011-2015 MotorVehicleStop.xlsx Microsoft Excel sheet [1.6 MB] The Rutland City Police Department captures a multitude of data on every motor vehicle stop. Response to Resistance Motor Vehicle Stops Community Engagement Contact Us Today! Rutland City Police Department 108 Wales St. Rutland , Vermont 05701 Phone: 802 773-1820 802 773-1820 Print | Sitemap © Rutland City Police Department Web View Mobile View Logout | Edit page Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases Home Recruitment Open Data Response to Resistance Motor Vehicle Stops Community Engagement RutStat SnapShot Photo Gallery Contact Us Press Releases " -4295,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/12,Calls for Service,Police & Public Interactions,Layer: TPD_CFS_PUBLIC_2012 (ID: 12),"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Layer: TPD_CFS_PUBLIC_2012 (ID: 12)""]",[],[],[],[],"Name: TPD_CFS_PUBLIC_2012 Display Field: NHA_NAME Type: Feature Layer Geometry Type: esriGeometryPoint Description: Copyright Text: Default Visibility: true MaxRecordCount: 1000 Supported Query Formats: JSON, geoJSON Min Scale: 1000000 Max Scale: 0 Supports Advanced Queries: true Supports Statistics: true Has Labels: false Can Modify Layer: false Can Scale Symbols: false Use Standardized Queries: true Supports Datum Transformation: true Extent: XMin: 961290.9586614184 YMin: 361917.080052495 XMax: 1079975.3353018388 YMax: 485849.68503937125 Spatial Reference: 2868 - (2868) Drawing Info: Renderer: Simple Renderer: Symbol: Style: esriSMSCircle Color: [79, 0, 143, 255] Size: 4.0 Angle: 0.0 XOffset: 0 YOffset: 0 Outline: [0, 0, 0, 255] Width: 1 Label: Description: Transparency: 0 Labeling Info: Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: true Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeAsHTMLText Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID, alias: ObjectID -) call_id ( -type: esriFieldTypeString, alias: call_id, length: 12 -) case_id ( -type: esriFieldTypeString, alias: case_id, length: 12 -) acci_id ( -type: esriFieldTypeString, alias: acci_id, length: 12 -) agency ( -type: esriFieldTypeString, alias: agency, length: 4 -) ADDRRESS_PUBLIC ( -type: esriFieldTypeString, alias: ADDRRESS_PUBLIC, length: 1073741822 -) city ( -type: esriFieldTypeString, alias: city, length: 20 -) state ( -type: esriFieldTypeString, alias: state, length: 2 -) zip ( -type: esriFieldTypeString, alias: zip, length: 10 -) NEIGHBORHD ( -type: esriFieldTypeString, alias: NEIGHBORHD, length: 8 -) emdivision ( -type: esriFieldTypeString, alias: emdivision, length: 4 -) ACTDATE ( -type: esriFieldTypeDate, alias: ACTDATE, length: 8 -) ACTTIME ( -type: esriFieldTypeString, alias: ACTTIME, length: 4 -) CAPRIORITY ( -type: esriFieldTypeString, alias: CAPRIORITY, length: 1 -) NATURECODE ( -type: esriFieldTypeString, alias: NATURECODE, length: 8 -) NatureCodeDesc ( -type: esriFieldTypeString, alias: NatureCodeDesc, length: 55 -) HOWRECEIVE ( -type: esriFieldTypeString, alias: HOWRECEIVE, length: 8 -) CSDISPOSIT ( -type: esriFieldTypeString, alias: CSDISPOSIT, length: 8 -) DispositionCodeDesc ( -type: esriFieldTypeString, alias: DispositionCodeDesc, length: 55 -) LOC_METHOD ( -type: esriFieldTypeString, alias: LOC_METHOD, length: 10 -) NHA_NAME ( -type: esriFieldTypeString, alias: NHA_NAME, length: 38 -) WARD ( -type: esriFieldTypeDouble, alias: WARD -) Shape ( -type: esriFieldTypeGeometry, alias: Shape -) POINT_X ( -type: esriFieldTypeDouble, alias: POINT_X -) POINT_Y ( -type: esriFieldTypeDouble, alias: POINT_Y -) Supported Operations : Query Query Attachments Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4296,https://www.opendataphilly.org/dataset/vehicle-pedestrian-investigations,Stops,Police & Public Interactions,"","",404,"","","","","","","","" -4297,https://www.transparentrichmond.org/Police-Department/Richmond-Police-Department-Police-Pursuits/jvek-qbi3,Vehicle Pursuits,Police & Public Interactions,Richmond Police Department - Police Pursuits | Transparent Richmond,"",200,Transparent Richmond,"[""RPD Pursuits - Top Pursuit Conclusions (2015 - Present)"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Richmond Police Department - Police Pursuits"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Richmond Police Department - Police Pursuits"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Dataset Details"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Page Browse Developers Support Menu Menu Close Home Page Browse Developers Support Sign In Search Sign In Home Page Browse Developers Support Menu Sign In Home Page Browse Developers Support Menu Sign In Sign In Home Page Browse Developers Support Menu Close Home Page Browse Developers Support Sign In Search Home Page Browse Developers Support Sign In Search Home Page Browse Developers Support Sign In Search Search -4298,https://www.transparentrichmond.org/Police-Department/Richmond-Police-Department-Firearm-Discharge-Incid/asfd-zcvn,Officer Involved Shootings,Police & Public Interactions,Richmond Police Department - Firearm Discharge Incidents | Transparent Richmond,"",200,Transparent Richmond,"[""RPD Firearm Discharge Incidents - Firearm Discharges per Year (2015 - Present)"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Richmond Police Department - Firearm Discharge Incidents"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Richmond Police Department - Firearm Discharge Incidents"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Dataset Details"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Page Browse Developers Support Menu Menu Close Home Page Browse Developers Support Sign In Search Sign In Home Page Browse Developers Support Menu Sign In Home Page Browse Developers Support Menu Sign In Sign In Home Page Browse Developers Support Menu Close Home Page Browse Developers Support Sign In Search Home Page Browse Developers Support Sign In Search Home Page Browse Developers Support Sign In Search Search -4299,https://data-southbend.opendata.arcgis.com/search?q=complaints,Complaints & Misconduct,Info About Officers,Open Data Portal City of South Bend,City of South Bend Open Data Site,200,Open Data Portal City of South Bend,[],[],[],[],[],[],"" -4300,https://data-santarosa.opendata.arcgis.com/datasets/santa-rosa-police-use-of-force/explore,Use of Force Reports,Police & Public Interactions,Santa Rosa Police Use of Force,City of Santa Rosa Police Use of Force,200,City of Santa Rosa,[],[],[],[],[],[],"" -4301,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/37,Officer Involved Shootings,Police & Public Interactions,Layer: TPD_OIS_Suspects (ID: 37),"",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Layer: TPD_OIS_Suspects (ID: 37)""]",[],[],[],[],"Name: TPD_OIS_Suspects Display Field: BOI_NUM Type: Table Geometry Type: N/A Description: null Copyright Text: N/A Default Visibility: false MaxRecordCount: 1000 Supported Query Formats: JSON Supports Advanced Queries: true Supports Statistics: true Use Standardized Queries: true Extent: Drawing Info: N/A Advanced Query Capabilities: Supports Statistics: true Supports OrderBy: true Supports Distinct: true Supports Pagination: true Supports TrueCurve: false Supports Returning Query Extent: true Supports Query With Distance: true Supports Sql Expression: true Supports Query With ResultType: false Supports Returning Geometry Centroid: false HasZ: false HasM: false Has Attachments: false HTML Popup Type: esriServerHTMLPopupTypeNone Type ID Field: null Fields: OBJECTID ( -type: esriFieldTypeOID, alias: OBJECTID -) INCI_NUM ( -type: esriFieldTypeInteger, alias: INCI_NUM -) BOI_NUM ( -type: esriFieldTypeString, alias: BOI_NUM, length: 1073741822 -) SUS_WEAPON ( -type: esriFieldTypeString, alias: SUS_WEAPON, length: 1073741822 -) SUS_INJDEC ( -type: esriFieldTypeString, alias: SUS_INJDEC, length: 1073741822 -) OFC_INJDEC ( -type: esriFieldTypeString, alias: OFC_INJDEC, length: 1073741822 -) SUS_AGE ( -type: esriFieldTypeInteger, alias: SUS_AGE -) SUS_RACE ( -type: esriFieldTypeString, alias: SUS_RACE, length: 1073741822 -) SUS_GEND ( -type: esriFieldTypeString, alias: SUS_GEND, length: 1073741822 -) DATASOURCE ( -type: esriFieldTypeString, alias: DATASOURCE, length: 50 -) Relationships: TPD_OIS (1) -- Related To : TPD_OIS (34) Supported Operations : Query Query Attachments Query Related Records Generate Renderer Return Updates Iteminfo Thumbnail Metadata " -4302,data.norfolk.gov/resource/fcqe-uvnb.json,Use of Force Reports,Police & Public Interactions,"Police Use of Force and Citizen Complaint Incidents | Open Data Portal - City of Norfolk, VA Open Data","",200,Error retrieving title: No connection adapters were found for '://',"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Police Use of Force and Citizen Complaint Incidents"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Police Use of Force and Citizen Complaint Incidents"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Norfolk Police Data Hub …"", ""Norfolk Police Department …"", ""Attachments"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right."", ""Norfolk Police Data Hub …"", ""Norfolk Police Department …""]",[],[],"[""OData Endpoint""]",Skip to Main Content Search Home Datasets Catalog Stories Datasets Charts Resources Welcome Video Tutorials Developers Additional Data FAQ Dataset Suggestion Make a Dataset Suggestion Make a FOIA Data Request Ward Profiles Citywide Ward 1 Ward 2 Ward 3 Ward 4 Ward 5 Superward 6 Superward 7 Contact Us Sign In Menu Menu Close Home Datasets Catalog Stories Datasets Charts Resources Welcome Video Tutorials Developers Additional Data FAQ Dataset Suggestion Make a Dataset Suggestion Make a FOIA Data Request Ward Profiles Citywide Ward 1 Ward 2 Ward 3 Ward 4 Ward 5 Superward 6 Superward 7 Contact Us Sign In Search Search Home Datasets Catalog Stories Datasets Charts Resources Welcome Video Tutorials Developers Additional Data FAQ Dataset Suggestion Make a Dataset Suggestion Make a FOIA Data Request Ward Profiles Citywide Ward 1 Ward 2 Ward 3 Ward 4 Ward 5 Superward 6 Superward 7 Contact Us Sign In Menu Search Search Search Search Home Datasets Catalog Stories Datasets Charts Resources Welcome Video Tutorials Developers Additional Data FAQ Dataset Suggestion Make a Dataset Suggestion Make a FOIA Data Request Ward Profiles Citywide Ward 1 Ward 2 Ward 3 Ward 4 Ward 5 Superward 6 Superward 7 Contact Us Sign In Menu Home Datasets Catalog Stories Datasets Charts Resources Welcome Video Tutorials Developers Additional Data FAQ Dataset Suggestion Make a Dataset Suggestion Make a FOIA Data Request Ward Profiles Citywide Ward 1 Ward 2 Ward 3 Ward 4 Ward 5 Superward 6 Superward 7 Contact Us Sign In Menu Home Datasets Catalog Stories Datasets Charts Resources Welcome Video Tutorials Developers Additional Data FAQ Dataset Suggestion Make a Dataset Suggestion Make a FOIA Data Request Ward Profiles Citywide Ward 1 Ward 2 Ward 3 Ward 4 Ward 5 Superward 6 Superward 7 Contact Us Home Datasets Catalog Stories Datasets Charts Resources Welcome Video Tutorials Developers Additional Data FAQ Dataset Suggestion Make a Dataset Suggestion Make a FOIA Data Request Ward Profiles Citywide Ward 1 Ward 2 Ward 3 Ward 4 Ward 5 Superward 6 Superward 7 Contact Us Catalog Stories Datasets Charts Catalog Stories Datasets Charts Resources Welcome Video Tutorials Developers Additional Data Resources Welcome Video Tutorials Developers Additional Data Dataset Suggestion Make a Dataset Suggestion Make a FOIA Data Request Dataset Suggestion Make a Dataset Suggestion Make a FOIA Data Request Ward Profiles Citywide Ward 1 Ward 2 Ward 3 Ward 4 Ward 5 Superward 6 Superward 7 Ward Profiles Citywide Ward 1 Ward 2 Ward 3 Ward 4 Ward 5 Superward 6 Superward 7 Sign In Sign In Menu Close Home Datasets Catalog Stories Datasets Charts Resources Welcome Video Tutorials Developers Additional Data FAQ Dataset Suggestion Make a Dataset Suggestion Make a FOIA Data Request Ward Profiles Citywide Ward 1 Ward 2 Ward 3 Ward 4 Ward 5 Superward 6 Superward 7 Contact Us Sign In Search -4303,https://phoenixopendata.com/dataset/rtr,Use of Force Reports,Police & Public Interactions,"","",404,"","","","","","","","" -4304,https://www.transparentrichmond.org/Police-Department/Richmond-Police-Department-CAD-Events/k4y4-5quj,Calls for Service,Police & Public Interactions,Richmond Police Department - CAD Events | Transparent Richmond,"",200,Transparent Richmond,"[""RPD Calls for Service - Calls per Month, by Priority (2019 - Present)"", ""RPD Calls for Service - Top 10 Call Types (Full Year 2019)"", ""RPD Calls for Service - Average Monthly Response Time (2019 - Present)"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Richmond Police Department - CAD Events"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Richmond Police Department - CAD Events"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Dataset Details"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Page Browse Developers Support Menu Menu Close Home Page Browse Developers Support Sign In Search Sign In Home Page Browse Developers Support Menu Sign In Home Page Browse Developers Support Menu Sign In Sign In Home Page Browse Developers Support Menu Close Home Page Browse Developers Support Sign In Search Home Page Browse Developers Support Sign In Search Home Page Browse Developers Support Sign In Search Search -4305,https://stjohnin.gov/PD/PDI/RTR.php,Use of Force Reports,Police & Public Interactions,Town of St. John - Police Department - Response to Resistance,"This is the offical website for the Town of St. John, Indiana.",200,Town of St. John,"[""Response to Resistance""]",[],"[""Datasets""]","[""Block Party Permit"", ""Citations"", ""Crime Map"", ""Daily Bulletin"", ""Handgun License"", ""Fireworks Information"", ""Peddler/Solicitor"", ""Police Data Initiative"", ""SafeTrade"", ""Text and E-Mail Notification System"", ""Vacation Check Request"", ""15SJ1071 - Resisting 91XX W 85TH AV 3/22/15 1:24 \n am"", ""17SJ2196 - Resisting 86XX WICKER AV 5/11/17 2:38 \n pm"", ""17SJ5968 - Pursuit 85XX WICKER AV 11/25/17 10:23 \n pm"", ""18SJ1255 - K9 Usage 124XX W 85TH AV 3/10/18 12:48 \n am"", ""18SJ2237 - DUI W 97TH LN & HEDWIG AV 5/4/18 11:33 \n pm"", ""18SJ5078 - Resisting 92XX WICKER AV 9/3/18 1:55 \n pm"", ""18SJ7042 - Disorderly 106XX BAILEY ST 12/13/18 7:27 \n am"", ""19SJ2285 - DUI 108XX WICKER AV 4/30/19 12:05 am"", ""19SJ2654 - Resisting 137XX LIMERICK DR 5/19/19 6:52 \n pm"", ""19SJ3038 - Resisting W 101ST AV & CLINE AV 6/6/19 1:30 \n pm"", ""19SJ3497 - DUI W 101ST AV & CALUMET AV 6/27/19 6:16 \n pm"", ""19SJ3510 - K9 Usage 1XX W 81ST AV 6/28/19 2:11 am"", ""19SJ4657 - Resisting 106XX GOLDEN GROVE AV 8/20/19 8:34 \n pm"", ""19SJ4840 - Disorderly 106XX BAILEY ST 8/30/19 10:05 \n pm"", ""19SJ5091 - DUI W 90TH AV & PATTERSON ST 9/12/19 12:03 \n am"", ""19SJ6089 - Resisting 93XX OLCOTT AV 11/1/19 10:13 \n am"", ""20SJ0389 - Trespassing 86XX LAKE HILLS DR 1/23/20 2:41 \n am"", ""20SJ0465 - Resisting W 107TH AV & MANOR DR 1/27/20 5:58 \n am"", ""20SJ1502 - Resisting 96XX INDUSTRIAL DR 3/29/20 5:18 \n am""]","[""Listed below is information from the St. John Police Department as it relates to use of force. The St. John Police Department has guidelines and policies in place for when force can be used in response to resistance. The St. John Police Department takes great effort in making sure this information is as accurate as possible; however, it relies on data provided that cannot always be verified. This information will be updated as needed. The St. John Police Department is not responsible for any error or omission from this data, or for the use or interpretation of the results of any research conducted."", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Arrest Demographics"", ""Bias Crimes"", ""Calls for Service / Daily Bulletin"", ""Department Demographics"", ""Peddler/Solicitor Licenses"", ""Response to Resistance"", ""Training"", ""Traffic Stops"", ""Traffic Accidents"", ""Traffic Citation Demographics"", ""Traffic Warning Demographics"", ""Year End Reports"", ""Accessibility Copyright © 2024 Town of St. John, Indiana Accessible Version Follow us on""]",[],Employment Opportunities Event Calendar Pay Online Pay Utility Bill Employment Opportunities Event Calendar Pay Online Pay Utility Bill ☰ Home News Community Community About Awards Won by the Town of St. John Demographics History Schools Residents Residents Community Organizations Election Information FAQ Center Library Local Club Sports Meeting Minutes and Agendas Park Programs Resident Services Road Closures Special Events Town Ordinances Watch Meetings Live Resources Resources Employment Forms Public Documents Town Ordinances Departments Departments Animal Control Boards and Commissions Building and Planning Building and Planning Building and Planning Homepage GIS and Maps Licenses and Permits Business Directory Registered Contractors Code Enforcement Clerk-Treasurer Clerk-Treasurer Clerk-Treasurer Homepage FAQs Finance Notary Pay Online Pay Utility Bill Public Records Town Ordinances Fire Department Fire Department Fire Department Homepage CPR Classes FAQ's Privacy Policy Training Site Useful Information Meeting Minutes and Agendas Parks Department Parks Department Parks Department Homepage Dog Park Park Locations and Programs Patnoe Park Family Gardens Special Events Police Department Police Department Police Department Homepage Block Party Permit Citations Handgun License Peddler/Solicitor Police Data Initiative Temporary Parking Permit Vacation Check Request More Public Works Public Works Public Works Homepage Bulk Waterstation Electronic Recycling Program Fire Hydrant Flushing Leaf and Branch Pick Up Service Requests Stormwater Management / MS4 Town Council Town Manager Development Contact Us ☰ Home News Community Community About Awards Won by the Town of St. John Demographics History Schools Residents Residents Community Organizations Election Information FAQ Center Library Local Club Sports Meeting Minutes and Agendas Park Programs Resident Services Road Closures Special Events Town Ordinances Watch Meetings Live Resources Resources Employment Forms Public Documents Town Ordinances Departments Departments Animal Control Boards and Commissions Building and Planning Building and Planning Building and Planning Homepage GIS and Maps Licenses and Permits Business Directory Registered Contractors Code Enforcement Clerk-Treasurer Clerk-Treasurer Clerk-Treasurer Homepage FAQs Finance Notary Pay Online Pay Utility Bill Public Records Town Ordinances Fire Department Fire Department Fire Department Homepage CPR Classes FAQ's Privacy Policy Training Site Useful Information Meeting Minutes and Agendas Parks Department Parks Department Parks Department Homepage Dog Park Park Locations and Programs Patnoe Park Family Gardens Special Events Police Department Police Department Police Department Homepage Block Party Permit Citations Handgun License Peddler/Solicitor Police Data Initiative Temporary Parking Permit Vacation Check Request More Public Works Public Works Public Works Homepage Bulk Waterstation Electronic Recycling Program Fire Hydrant Flushing Leaf and Branch Pick Up Service Requests Stormwater Management / MS4 Town Council Town Manager Development Contact Us -4306,https://phoenixopendata.com/dataset/ois,Officer Involved Shootings,Police & Public Interactions,Officer Involved Shooting (OIS) - Dataset - City of Phoenix Open Data,"",200,Welcome - City of Phoenix Open Data,"[""Officer Involved Shooting (OIS)"", ""Police"", ""Officer Involved Shooting (OIS)""]","[""Department"", ""Social"", ""License"", ""Data and Resources""]","[""Provide your feedback!"", ""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Toggle navigation Datasets Departments Groups Newsroom Mapping Portal Suggest a Dataset City Checkbook About Search Datasets Search Datasets Home Departments Police Officer Involved Shooting (OIS) Officer Involved Shooting (OIS) Followers 3 Department Police Mission: The Phoenix Police Department is committed to providing the citizens of Phoenix with quality and professional law enforcement services. Our vision is to make Phoenix... read more Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Officer Involved Shooting (OIS) This dataset contains Phoenix Police Department Officer-Involved Shooting (OIS) incidents from January 2017 forward, including demographic information for officers as well as individuals. Data is updated hourly; however, new OIS incidents are only displayed after information is compiled for all the fields displayed in the dataset, which may take several days following the incident. More than one officer may discharge their weapon during the same incident. Accidental discharges, discharges at animals, and discharges at objects where there was not an active threat by a subject are not included in this data set. View Operations Order 1.5: Response to Resistance Policy Provide your feedback! Help us improve this site and complete the Open Data Customer Survey . Data and Resources OIS Incident Details - 2017 Forward CSV Popular A csv file, updated hourly, that provides detailed information for each... Explore Preview Download OIS Videos and Media Releases - 2019 Forward XLSX Popular An xlsx file, updated hourly, that contains Officer-Involved Shooting (OIS)... Explore Preview Download OIS Officer Summary CSV Popular A csv file, updated hourly, that provides summary officer information for... Explore Preview Download OIS Individual Summary CSV Popular A csv file, updated hourly, that provides summary individual or citizen... Explore Preview Download OIS Race Ethnicity Summary CSV A csv file, updated hourly, that provides summary individual and officer race... Explore Preview Download OIS Incident Summary CSV Popular A csv file, updated hourly, that provides summary incident information for... Explore Preview Download OIS 2017 Year End Map PDF Explore Preview Download OIS 2018 Year End Map PDF Explore Preview Download OIS 2019 Year End Map PDF Explore Preview Download OIS 2020 Year End Map PDF Explore Preview Download OIS 2021 Year End Map PDF Popular Explore Preview Download OIS officer involved sh... phoenix police shooting Additional Info Field Value Last Updated March 24, 2024, 6:31 PM (UTC-04:00) Created August 3, 2022, 1:41 PM (UTC-04:00) " -4307,https://data.cityofsacramento.org/search?collection=Dataset&tags=dispatch,Dispatch Logs,Police & Public Interactions,City of Sacramento Open Data,City of Sacramento Open Data Site,200,City of Sacramento Open Data,[],[],[],[],[],[],"" -4309,https://www.norwichct.org/844/Open-Data-Portal,List of Data Sources,Info About Agencies,"Open Data Portal | Norwich, CT - Official Website",This page is part of the Police Data Initiative that will aid in creating greater transparency. ,200,"Norwich, CT - Official Website | Official Website","[""Open Data Portal""]","[""Norwich City Hall, 100 Broadway, Norwich, CT 06360""]","[""Welcome to the Norwich Police Department’s Open Data Portal!"", ""Contact Us"", ""FAQs"", """", """", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Residents Government Visitors Doing Business How Do I... Home Government Departments Police Open Data Portal Open Data Portal Welcome to the Norwich Police Department’s Open Data Portal! The Norwich Police Department has a long history of setting the standard for professional and progressive police practices.  We strive for excellence in police services and are committed to strengthening community ties. The Police Data Initiative is a voluntary program that challenges police agencies across the United States to release data to the public in order to increase transparency and to build community trust.  While police agencies nationwide have worked over the past few decades to release statistics related to criminal activity, this new effort asks agencies to publish expanded data sets such as employee demographics, use of force, motor vehicle stop driver demographics, and many others.  The PDI requires that participating police agencies commit to the release of at least three data sets related to different areas of police operations, administration, and collaborate with others to enhance existing and create new data sets. Contact Us Lt. Timothy J. Rykowski Ph: (860) 886-5561 ext. 3543 70 Thames St. Norwich, CT 06360 Fax: (860) 886-4552 FAQs Where may I learn about the Police Data Initiative? View All /FAQ.aspx Police Demographics Police Officer Involved Shooting Police Use of Force Home Site Map Contact Us Accessibility Copyright Notices /QuickLinks.aspx Norwich City Hall, 100 Broadway, Norwich, CT 06360 Ph: (860) 823-3700 Fx: (860) 885-2131 Facebook Twitter Pinterest Delicious Blogger LinkedIn Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Government Websites by CivicPlus " -4310,https://data.seattle.gov/Public-Safety/Use-Of-Force/ppi5-g2bj,Use of Force Reports,Police & Public Interactions,Use Of Force | City of Seattle Open Data portal,"",200,City of Seattle Open Data portal,"[""Use of Force - Visualization"", ""Crime by Race in Seattle Sectors"", ""Police Use of Force by Precinct"", ""Use Of Force Precinct"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Use Of Force"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Use Of Force"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Department"", ""Refresh Frequency"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Menu Close Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Sign In Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Close Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Search -4311,https://data.sandiego.gov/datasets/police-collisions/,Incident Reports,Police & Public Interactions,Traffic collisions - basic reports - City of San Diego Open Data Portal," - Traffic collision reports recorded by the San Diego Police Department. - ",200,City of San Diego Open Data Portal,[],"[""Traffic collisions - basic reports""]","[""Resources"", """", ""Additional Info""]","[""Traffic collisions (2015 through year-to-date)"", """"]",[],[],"City of San Diego | Mayor Todd Gloria City of San Diego | Mayor Todd Gloria Toggle navigation Data Browse Data (current) Blog Toggle navigation Data Browse Data (current) Blog Traffic collisions - basic reports Traffic collision reports recorded by the San Diego Police Department. Generally a report is not taken for property damage-only collisions that do not involve hit & run or DUI. The California Highway Patrol is responsible for handling collisions occurring on the freeway. This dataset includes basic information about collisions. Each row has a report_id , a unique identifier for the collision. A single collision may involve multiple people and/or vehicles. For collisions data that includes details about people and vehicles, use the Traffic Collisions Details dataset. Resources Resource Type Download Preview Traffic collisions (2015 through year-to-date) csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Traffic collisions dictionary csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Traffic collisions (2015 through year-to-date) This is a preview. If you would like to view the full resource, please download it above. No Results Rows per page 10 20 50 100 1 - 10 of Additional Info License Open Data Commons Public Domain Dedication and Licence (PDDL) Publisher Police Date Issued (YYYY-MM-DD) 2017-05-03 Date Modified (YYYY-MM-DD) 2024-03-25 Category Public Safety Maintainer City of San Diego Maintainer Email data@sandiego.gov Traffic collisions - basic reports Traffic collision reports recorded by the San Diego Police Department. Generally a report is not taken for property damage-only collisions that do not involve hit & run or DUI. The California Highway Patrol is responsible for handling collisions occurring on the freeway. This dataset includes basic information about collisions. Each row has a report_id , a unique identifier for the collision. A single collision may involve multiple people and/or vehicles. For collisions data that includes details about people and vehicles, use the Traffic Collisions Details dataset. Resources Resource Type Download Preview Traffic collisions (2015 through year-to-date) csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Traffic collisions dictionary csv CSV is tabular data. Excel, Google Docs, LibreOffice Calc or any plain text editor will open files with this format. Learn More Traffic collisions (2015 through year-to-date) This is a preview. If you would like to view the full resource, please download it above. No Results Rows per page 10 20 50 100 1 - 10 of Additional Info License Open Data Commons Public Domain Dedication and Licence (PDDL) Publisher Police Date Issued (YYYY-MM-DD) 2017-05-03 Date Modified (YYYY-MM-DD) 2024-03-25 Category Public Safety Maintainer City of San Diego Maintainer Email data@sandiego.gov " -4312,https://stat.stpete.org/dataset/Police-Calls/2eks-pg5j,Calls for Service,Police & Public Interactions,Police Calls | StPeteStat,"",200,Open Data Portal | StPeteStat,"[""St. Petersburg Police Department Calls for Service Activity Map"", ""Police Calls by Classification - Based on Police Calls"", ""Neighborhood Association Calls for Service Map"", ""Trend - Based on Police Calls"", ""Park Walk Talk Map"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Police Calls"", ""Featured Content Using this Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Police Calls"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Neighborhood Association Calls for Service Map …"", ""Police Calls by Classification - Based on Police Calls …"", ""Trend - Based on Police Calls …"", ""Automated"", ""City Department"", ""Data Management"", ""Source data system"", ""Topics"", ""Neighborhood Association Calls for Service Map …"", ""Police Calls by Classification - Based on Police Calls …"", ""Trend - Based on Police Calls …""]",[],[],"[""OData Endpoint""]",Skip to Main Content StPeteStat Home Search Help Employee Login City of St. Petersburg website Sign In Menu Menu Close Help Employee Login City of St. Petersburg website Sign In Search StPeteStat Home Search Help Employee Login City of St. Petersburg website Sign In Menu StPeteStat Home Search StPeteStat Home Search Search Search Help Employee Login City of St. Petersburg website Sign In Menu Help Employee Login City of St. Petersburg website Sign In Menu Help Employee Login City of St. Petersburg website Help Employee Login City of St. Petersburg website Sign In Sign In Menu Close Help Employee Login City of St. Petersburg website Sign In Search Help Employee Login City of St. Petersburg website Sign In Search Help Employee Login City of St. Petersburg website Sign In Search Search -4313,https://data.seattle.gov/Public-Safety/Call-Data/33kz-ixgy,Calls for Service,Police & Public Interactions,Call Data | City of Seattle Open Data portal,"",200,City of Seattle Open Data portal,"[""Call 2022 SFD - Fire Assist/Medic Response by Beat."", ""Call Data - Sectors and Reported Crimes"", ""Call Data Initial Call Type"", ""Call Data : Sector and Final Call Type"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Call Data"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Call Data"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Department"", ""Refresh Frequency"", ""Topics"", ""Licensing and Attribution""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Menu Close Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Sign In Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Close Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Search -4314,https://data.stocktonca.gov/Safer-Streets/Stockton-Police-Department-Calls-for-Service/6uz3-k7rf,Calls for Service,Police & Public Interactions,Stockton Police Department Calls for Service | Stockton Open Data,"",200,Stockton Open Data,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Stockton Police Department Calls for Service"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Stockton Police Department Calls for Service"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Data Owner"", ""Details"", ""Publishing Details"", ""Topics""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data Learn About Contact OPDA Stockton Insights Interactive Dashboards Stockton Insider Map COVID-19 COVID-19 Case Dashboard COVID-19 Vaccine Map Menu Menu Close Home Data Learn About Contact OPDA Stockton Insights Interactive Dashboards Stockton Insider Map COVID-19 COVID-19 Case Dashboard COVID-19 Vaccine Map Sign In Search Sign In Home Data Learn About Contact OPDA Stockton Insights Interactive Dashboards Stockton Insider Map COVID-19 COVID-19 Case Dashboard COVID-19 Vaccine Map Menu Sign In Home Data Learn About Contact OPDA Stockton Insights Interactive Dashboards Stockton Insider Map COVID-19 COVID-19 Case Dashboard COVID-19 Vaccine Map Menu Sign In Sign In Home Data Learn About Contact OPDA Stockton Insights Interactive Dashboards Stockton Insider Map COVID-19 COVID-19 Case Dashboard COVID-19 Vaccine Map Stockton Insights Interactive Dashboards Stockton Insider Map Stockton Insights Interactive Dashboards Stockton Insider Map COVID-19 COVID-19 Case Dashboard COVID-19 Vaccine Map COVID-19 COVID-19 Case Dashboard COVID-19 Vaccine Map Menu Close Home Data Learn About Contact OPDA Stockton Insights Interactive Dashboards Stockton Insider Map COVID-19 COVID-19 Case Dashboard COVID-19 Vaccine Map Sign In Search Home Data Learn About Contact OPDA Stockton Insights Interactive Dashboards Stockton Insider Map COVID-19 COVID-19 Case Dashboard COVID-19 Vaccine Map Sign In Search Home Data Learn About Contact OPDA Stockton Insights Interactive Dashboards Stockton Insider Map COVID-19 COVID-19 Case Dashboard COVID-19 Vaccine Map Stockton Insights Interactive Dashboards Stockton Insider Map COVID-19 COVID-19 Case Dashboard COVID-19 Vaccine Map Sign In Search Search -4315,https://stjohnin.gov/PD/PDI/Arrests/,Arrest Records,Police & Public Interactions,Town of St. John - Police Department Arrests,"This is the offical website for the Town of St. John, Indiana.",200,Town of St. John,"[""Police Data Initative Dataset for Arrests""]",[],"[""Datasets""]","[""Block Party Permit"", ""Citations"", ""Crime Map"", ""Daily Bulletin"", ""Handgun License"", ""Fireworks Information"", ""Peddler/Solicitor"", ""Police Data Initiative"", ""SafeTrade"", ""Text and E-Mail Notification System"", ""Vacation Check Request""]","[""The St. John Police Department takes great effort in making data as accurate as possible, but there is no avoiding the introduction of errors in this process, which relies on data that cannot always be verified. Information contained in this dataset may change over a period of time. The St. John Police Department is not responsible for any error or omission from this data, or for the use or interpretation of the results of any research conducted."", ""2024 Arrests"", ""2023 Arrests"", ""2022 Arrests"", ""2021 Arrests"", ""2020 Arrests"", ""2019 Arrests"", ""2018 Arrests"", ""2017 Arrests"", ""2016 Arrests"", ""2015 Arrests"", ""2014 Arrests"", ""2013 Arrests"", ""2012 Arrests"", ""2011 Arrests"", ""2010 Arrests"", ""2009 Arrests"", ""2008 Arrests"", ""2007 Arrests"", ""2006 Arrests"", ""Arrest Demographics"", ""Bias Crimes"", ""Calls for Service / Daily Bulletin"", ""Department Demographics"", ""Peddler/Solicitor Licenses"", ""Response to Resistance"", ""Training"", ""Traffic Stops"", ""Traffic Accidents"", ""Traffic Citation Demographics"", ""Traffic Warning Demographics"", ""Year End Reports"", ""Accessibility Copyright © 2024 Town of St. John, Indiana Accessible Version Follow us on""]",[],Employment Opportunities Event Calendar Pay Online Pay Utility Bill Employment Opportunities Event Calendar Pay Online Pay Utility Bill ☰ Home News Community Community About Awards Won by the Town of St. John Demographics History Schools Residents Residents Community Organizations Election Information FAQ Center Library Local Club Sports Meeting Minutes and Agendas Park Programs Resident Services Road Closures Special Events Town Ordinances Watch Meetings Live Resources Resources Employment Forms Public Documents Town Ordinances Departments Departments Animal Control Boards and Commissions Building and Planning Building and Planning Building and Planning Homepage GIS and Maps Licenses and Permits Business Directory Registered Contractors Code Enforcement Clerk-Treasurer Clerk-Treasurer Clerk-Treasurer Homepage FAQs Finance Notary Pay Online Pay Utility Bill Public Records Town Ordinances Fire Department Fire Department Fire Department Homepage CPR Classes FAQ's Privacy Policy Training Site Useful Information Meeting Minutes and Agendas Parks Department Parks Department Parks Department Homepage Dog Park Park Locations and Programs Patnoe Park Family Gardens Special Events Police Department Police Department Police Department Homepage Block Party Permit Citations Handgun License Peddler/Solicitor Police Data Initiative Temporary Parking Permit Vacation Check Request More Public Works Public Works Public Works Homepage Bulk Waterstation Electronic Recycling Program Fire Hydrant Flushing Leaf and Branch Pick Up Service Requests Stormwater Management / MS4 Town Council Town Manager Development Contact Us ☰ Home News Community Community About Awards Won by the Town of St. John Demographics History Schools Residents Residents Community Organizations Election Information FAQ Center Library Local Club Sports Meeting Minutes and Agendas Park Programs Resident Services Road Closures Special Events Town Ordinances Watch Meetings Live Resources Resources Employment Forms Public Documents Town Ordinances Departments Departments Animal Control Boards and Commissions Building and Planning Building and Planning Building and Planning Homepage GIS and Maps Licenses and Permits Business Directory Registered Contractors Code Enforcement Clerk-Treasurer Clerk-Treasurer Clerk-Treasurer Homepage FAQs Finance Notary Pay Online Pay Utility Bill Public Records Town Ordinances Fire Department Fire Department Fire Department Homepage CPR Classes FAQ's Privacy Policy Training Site Useful Information Meeting Minutes and Agendas Parks Department Parks Department Parks Department Homepage Dog Park Park Locations and Programs Patnoe Park Family Gardens Special Events Police Department Police Department Police Department Homepage Block Party Permit Citations Handgun License Peddler/Solicitor Police Data Initiative Temporary Parking Permit Vacation Check Request More Public Works Public Works Public Works Homepage Bulk Waterstation Electronic Recycling Program Fire Hydrant Flushing Leaf and Branch Pick Up Service Requests Stormwater Management / MS4 Town Council Town Manager Development Contact Us -4316,https://www.norristown.org/240/Police-Data-Initiative,Use of Force Reports,Police & Public Interactions,"Police Data Initiative | Norristown, PA",Dig into some of the local data and figures gathered over the past few years.,200,Error retrieving title: dictionary changed size during iteration,"[""Police Data Initiative""]",[],"[""Contact Us"", ""Contact Us"", ""Quick Links"", ""Using This Site"", ""Loading""]","[""Calls For Service"", ""Crime Data"", ""Demographics"", ""Heroin Data"", ""Use of Force Data"", ""Violent Crimes Data Comparison"", ""Police Department""]",[],[],"Skip to Main Content Holiday closure Municipal Hall closed March 29 Read On... Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Fire & Emergency Management Police Services Floodplain Maps How Do I... Search Jobs Trash Bids /QuickLinks.aspx Home Departments Public Safety Police Services Police Data Initiative Police Data Initiative 9 1 1 2 Calls For Service Review the Calls for Service Data, which includes the types of calls. Crime Data Look through crime data for Norristown, including the percentage of change after the department crime reduction strategy was put in place. Demographics View demographics and related information for the Norristown Police Department. Heroin Data Access the Heroin Data Set, which represents all fatal and non-fatal overdoses. Use of Force Data Dig into the Use of Force Data and view the full report. Violent Crimes Data Comparison Survey and compare a set of Violent Crimes Data. Contact Us Police Department Physical Address View Map 235 E Airy Street Norristown , PA 19401 235 E Airy Street Norristown PA 19401 Directions Phone: 610-270-0977 Emergency Phone: 911 Directory Calls For Service Crime Data Demographics Heroin Data Use of Force Data Violent Crimes Data Comparison Join Our Team Employment & Volunteering Free Smoke Alarms Smoke Detector Program Community Information Outreach Opportunities Vacation Home Check Request a Home Check Crime Mapping Interactive Crime Map Anonymous Tips Community Safety Contact Us Norristown Police Department Police Desk: 610-270-0977 Emergency: 9-1-1 Non-Emergency: 610-275-122 Norristown Fire Department Phone: 610-635-4455 Fax: 610-292-8090 www.norristownfire.org Quick Links Emergency Fire Services Education / Fire Safety Emergency Management Police Programs Police Service Fees /QuickLinks.aspx Using This Site Home Contact Us Accessibility Copyright Notices Employment Opportunities Privacy Policy /QuickLinks.aspx Government Websites by CivicPlus® Enable Google Translate " -4318,https://stjohnin.gov/PD/PDI/TS/,Stops,Police & Public Interactions,Town of St. John - Police Department Traffic Stops,"This is the offical website for the Town of St. John, Indiana.",200,Town of St. John,"[""Police Data Initative Dataset for Traffic Stops""]",[],"[""Datasets""]","[""Block Party Permit"", ""Citations"", ""Crime Map"", ""Daily Bulletin"", ""Handgun License"", ""Fireworks Information"", ""Peddler/Solicitor"", ""Police Data Initiative"", ""SafeTrade"", ""Text and E-Mail Notification System"", ""Vacation Check Request""]","[""The St. John Police Department takes great effort in making data as accurate as possible, but there is no avoiding the introduction of errors in this process, which relies on data that cannot always be verified. Information contained in this dataset may change over a period of time. The St. John Police Department is not responsible for any error or omission from this data, or for the use or interpretation of the results of any research conducted."", ""2024 Taffice Stops"", ""2023 Taffice Stops"", ""2022 Taffice Stops"", ""2021 Taffice Stops"", ""2020 Taffice Stops"", ""2019 Taffice Stops"", ""2018 Taffice Stops"", ""2017 Taffice Stops"", ""2016 Taffice Stops"", ""2015 Taffice Stops"", ""2014 Taffice Stops"", ""2013 Taffice Stops"", ""2012 Taffice Stops"", ""2011 Taffice Stops"", ""2010 Taffice Stops"", ""2009 Taffice Stops"", ""2008 Taffice Stops"", ""2007 Taffice Stops"", ""2006 Taffice Stops"", ""Arrest Demographics"", ""Bias Crimes"", ""Calls for Service / Daily Bulletin"", ""Department Demographics"", ""Peddler/Solicitor Licenses"", ""Response to Resistance"", ""Training"", ""Traffic Stops"", ""Traffic Accidents"", ""Traffic Citation Demographics"", ""Traffic Warning Demographics"", ""Year End Reports"", ""Accessibility Copyright © 2024 Town of St. John, Indiana Accessible Version Follow us on""]",[],Employment Opportunities Event Calendar Pay Online Pay Utility Bill Employment Opportunities Event Calendar Pay Online Pay Utility Bill ☰ Home News Community Community About Awards Won by the Town of St. John Demographics History Schools Residents Residents Community Organizations Election Information FAQ Center Library Local Club Sports Meeting Minutes and Agendas Park Programs Resident Services Road Closures Special Events Town Ordinances Watch Meetings Live Resources Resources Employment Forms Public Documents Town Ordinances Departments Departments Animal Control Boards and Commissions Building and Planning Building and Planning Building and Planning Homepage GIS and Maps Licenses and Permits Business Directory Registered Contractors Code Enforcement Clerk-Treasurer Clerk-Treasurer Clerk-Treasurer Homepage FAQs Finance Notary Pay Online Pay Utility Bill Public Records Town Ordinances Fire Department Fire Department Fire Department Homepage CPR Classes FAQ's Privacy Policy Training Site Useful Information Meeting Minutes and Agendas Parks Department Parks Department Parks Department Homepage Dog Park Park Locations and Programs Patnoe Park Family Gardens Special Events Police Department Police Department Police Department Homepage Block Party Permit Citations Handgun License Peddler/Solicitor Police Data Initiative Temporary Parking Permit Vacation Check Request More Public Works Public Works Public Works Homepage Bulk Waterstation Electronic Recycling Program Fire Hydrant Flushing Leaf and Branch Pick Up Service Requests Stormwater Management / MS4 Town Council Town Manager Development Contact Us ☰ Home News Community Community About Awards Won by the Town of St. John Demographics History Schools Residents Residents Community Organizations Election Information FAQ Center Library Local Club Sports Meeting Minutes and Agendas Park Programs Resident Services Road Closures Special Events Town Ordinances Watch Meetings Live Resources Resources Employment Forms Public Documents Town Ordinances Departments Departments Animal Control Boards and Commissions Building and Planning Building and Planning Building and Planning Homepage GIS and Maps Licenses and Permits Business Directory Registered Contractors Code Enforcement Clerk-Treasurer Clerk-Treasurer Clerk-Treasurer Homepage FAQs Finance Notary Pay Online Pay Utility Bill Public Records Town Ordinances Fire Department Fire Department Fire Department Homepage CPR Classes FAQ's Privacy Policy Training Site Useful Information Meeting Minutes and Agendas Parks Department Parks Department Parks Department Homepage Dog Park Park Locations and Programs Patnoe Park Family Gardens Special Events Police Department Police Department Police Department Homepage Block Party Permit Citations Handgun License Peddler/Solicitor Police Data Initiative Temporary Parking Permit Vacation Check Request More Public Works Public Works Public Works Homepage Bulk Waterstation Electronic Recycling Program Fire Hydrant Flushing Leaf and Branch Pick Up Service Requests Stormwater Management / MS4 Town Council Town Manager Development Contact Us -4319,https://data.seattle.gov/Public-Safety/Terry-Stops/28ny-9ts8,Stops,Police & Public Interactions,Terry Stops | City of Seattle Open Data portal,"",200,City of Seattle Open Data portal,"[""SPD- Terry Stops by Perceived race of Subject"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Terry Stops"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Terry Stops"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Department"", ""Refresh Frequency"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Menu Close Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Sign In Sign In Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Menu Close Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Open Data Program Public Records Requests Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Other City Data Open Budget Open GIS Performance Seattle Capital Projects Explorer City Contract Search Portal Seattle News Find a Business City Demographics (Planning and Community Development) Sign In Search Search -4320,https://stjohnin.gov/PD/PDI/Citations/,Citations,Police & Public Interactions,Town of St. John - Police Department Citations Issued,"This is the offical website for the Town of St. John, Indiana.",200,Town of St. John,"[""Police Data Initiative Traffic Citations""]",[],"[""Datasets""]","[""Block Party Permit"", ""Citations"", ""Crime Map"", ""Daily Bulletin"", ""Handgun License"", ""Fireworks Information"", ""Peddler/Solicitor"", ""Police Data Initiative"", ""SafeTrade"", ""Text and E-Mail Notification System"", ""Vacation Check Request""]","[""The St. John Police Department takes great effort in making data as accurate as possible, but there is no avoiding the introduction of errors in this process, which relies on data that cannot always be verified. Information contained in this dataset may change over a period of time. The St. John Police Department is not responsible for any error or omission from this data, or for the use or interpretation of the results of any research conducted."", ""2024 Citations"", ""2023 Citations"", ""2022 Citations"", ""2021 Citations"", ""2020 Citations"", ""2019 Citations"", ""2018 Citations"", ""2017 Citations"", ""2016 Citations"", ""2015 Citations"", ""2014 Citations"", ""2013 Citations"", ""2012 Citations"", ""2011 Citations"", ""2010 Citations"", ""2009 Citations"", ""2008 Citations"", ""2007 Citations"", ""2006 Citations"", ""Arrest Demographics"", ""Bias Crimes"", ""Calls for Service / Daily Bulletin"", ""Department Demographics"", ""Peddler/Solicitor Licenses"", ""Response to Resistance"", ""Training"", ""Traffic Stops"", ""Traffic Accidents"", ""Traffic Citation Demographics"", ""Traffic Warning Demographics"", ""Year End Reports"", ""Accessibility Copyright © 2024 Town of St. John, Indiana Accessible Version Follow us on""]",[],Employment Opportunities Event Calendar Pay Online Pay Utility Bill Employment Opportunities Event Calendar Pay Online Pay Utility Bill ☰ Home News Community Community About Awards Won by the Town of St. John Demographics History Schools Residents Residents Community Organizations Election Information FAQ Center Library Local Club Sports Meeting Minutes and Agendas Park Programs Resident Services Road Closures Special Events Town Ordinances Watch Meetings Live Resources Resources Employment Forms Public Documents Town Ordinances Departments Departments Animal Control Boards and Commissions Building and Planning Building and Planning Building and Planning Homepage GIS and Maps Licenses and Permits Business Directory Registered Contractors Code Enforcement Clerk-Treasurer Clerk-Treasurer Clerk-Treasurer Homepage FAQs Finance Notary Pay Online Pay Utility Bill Public Records Town Ordinances Fire Department Fire Department Fire Department Homepage CPR Classes FAQ's Privacy Policy Training Site Useful Information Meeting Minutes and Agendas Parks Department Parks Department Parks Department Homepage Dog Park Park Locations and Programs Patnoe Park Family Gardens Special Events Police Department Police Department Police Department Homepage Block Party Permit Citations Handgun License Peddler/Solicitor Police Data Initiative Temporary Parking Permit Vacation Check Request More Public Works Public Works Public Works Homepage Bulk Waterstation Electronic Recycling Program Fire Hydrant Flushing Leaf and Branch Pick Up Service Requests Stormwater Management / MS4 Town Council Town Manager Development Contact Us ☰ Home News Community Community About Awards Won by the Town of St. John Demographics History Schools Residents Residents Community Organizations Election Information FAQ Center Library Local Club Sports Meeting Minutes and Agendas Park Programs Resident Services Road Closures Special Events Town Ordinances Watch Meetings Live Resources Resources Employment Forms Public Documents Town Ordinances Departments Departments Animal Control Boards and Commissions Building and Planning Building and Planning Building and Planning Homepage GIS and Maps Licenses and Permits Business Directory Registered Contractors Code Enforcement Clerk-Treasurer Clerk-Treasurer Clerk-Treasurer Homepage FAQs Finance Notary Pay Online Pay Utility Bill Public Records Town Ordinances Fire Department Fire Department Fire Department Homepage CPR Classes FAQ's Privacy Policy Training Site Useful Information Meeting Minutes and Agendas Parks Department Parks Department Parks Department Homepage Dog Park Park Locations and Programs Patnoe Park Family Gardens Special Events Police Department Police Department Police Department Homepage Block Party Permit Citations Handgun License Peddler/Solicitor Police Data Initiative Temporary Parking Permit Vacation Check Request More Public Works Public Works Public Works Homepage Bulk Waterstation Electronic Recycling Program Fire Hydrant Flushing Leaf and Branch Pick Up Service Requests Stormwater Management / MS4 Town Council Town Manager Development Contact Us -4321,https://www.transparentrichmond.org/Police-Department/Richmond-Police-Department-Use-Of-Force-Incidents/d62r-nicg,Use of Force Reports,Police & Public Interactions,Richmond Police Department - Use Of Force Incidents | Transparent Richmond,"",200,Transparent Richmond,"[""RPD Use of Force - Top Call Types Involving Use of Force Incidents (2015 - Present)"", ""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""Richmond Police Department - Use Of Force Incidents"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""Richmond Police Department - Use Of Force Incidents"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Dataset Details"", ""Strategic Priority Areas"", ""Topics"", ""Licensing and Attribution"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Page Browse Developers Support Menu Menu Close Home Page Browse Developers Support Sign In Search Sign In Home Page Browse Developers Support Menu Sign In Home Page Browse Developers Support Menu Sign In Sign In Home Page Browse Developers Support Menu Close Home Page Browse Developers Support Sign In Search Home Page Browse Developers Support Sign In Search Home Page Browse Developers Support Sign In Search Search -4323,https://www.portland.gov/police/open-data/police-dispatched-calls,Calls for Service,Police & Public Interactions,Police Dispatched Calls Dashboard | Portland.gov,Dispatched Police Calls for Service,200,"City of Portland, Oregon | Portland.gov","[""Police Dispatched Calls Dashboard""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Introduction to Calls for Service"", ""Police Response Time"", ""Dashboard Walkthrough"", ""Metadata for Dispatched Calls Open Data"", ""Topics"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]","[""Call Priority Level"", ""Call Groups"", ""1. Report Overview"", ""2. Technical Specifications"", ""3. Visualization Walkthrough""]","[""a. Dropdown Filters (single-select) - Priority Call Filter (example)"", ""b. Dropdown Filters (multi-select) - Neighborhood Filter (example)"", ""c. Tab 1 - Dispatched Calls for Service"", ""d. Maps"", ""e. Tab 2 - Response Times"", ""f.  Tab 3 - Fiscal Year Dispatches"", ""g. Toolbar"", ""h. Download Data""]",[],[],"" -4324,https://www.oakridgetn.gov/Policepolicies/police-policy.php,Policies & Contracts,Info About Agencies,"","",404,"","","","","","","","" -4325,https://www.oakridgetn.gov/departmentpg/ORPD/Contact-ORPD,Contact Info & Agency Meta,Info About Agencies,"","",404,"","","","","","","","" -4326,https://www.knoxvilletn.gov/cms/One.aspx?portalId=109562&pageId=263443,List of Data Sources,Info About Agencies,KPD Open Records Page - City of Knoxville,police*,200,Just a moment...,"[""KPD Open Records Page"", ""Police Chief""]",[],[],[],[],[],Skip navigation {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## {1} ##LOC[OK]## -4327,https://www.el-cerrito.org/1342/Released-Records,Incident Reports,Police & Public Interactions,"Released Records | El Cerrito, CA - Official Website",Lists currently released and available records by case.,200,"El Cerrito, CA - Official Website | Official Website","["""", ""Released Records""]",[],"["""", """", ""Contact Us"", ""Quick Links"", ""Helpful Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Facebook Twitter Pinterest Delicious Blogger LinkedIn Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search About Us Administration Chief's Welcome How Do I.. News & Alerts Patrol Division Special Operations Home Your Government City Departments Police Department How Do I.. Find Public Records Act Archive Released Records Released Records ECPD Case 15-22851 Link to Page Public Record 2003 Link to Page Administrative Investigation Link to Page UAS Policy Link to Page ECPD Case 15-22851 Public Record 2003 Administrative Investigation 12-21 UAS Policy Home page about us file a report join our team nixle municipal code parking citation Contact Us Public Safety Building 10900 San Pablo Avenue El Cerrito, CA 94530 Dispatch: 510-237-3233 , then select option 0 Emergency: 911 Office Hours Monday - Friday 8 a.m. - 5 p.m. Records Phone: 510-215-4400 Fax: 510-235-6618 Quick Links Countywide Community Warning System The Commission on Peace Officer Standards & Training /QuickLinks.aspx Helpful Links Sitemap Accessibility Copyright Notices Government Websites by CivicPlus® /QuickLinks.aspx Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Facebook Twitter Pinterest Delicious Blogger LinkedIn Home My Account Printer Friendly Email Page Contact Us RSS Site Map Translate Page Notifications Documents Search About Us Administration Chief's Welcome How Do I.. News & Alerts Patrol Division Special Operations Home Your Government City Departments Police Department How Do I.. Find Public Records Act Archive Released Records Released Records ECPD Case 15-22851 Link to Page Public Record 2003 Link to Page Administrative Investigation Link to Page UAS Policy Link to Page ECPD Case 15-22851 Public Record 2003 Administrative Investigation 12-21 UAS Policy Home page about us file a report join our team nixle municipal code parking citation Contact Us Public Safety Building 10900 San Pablo Avenue El Cerrito, CA 94530 Dispatch: 510-237-3233 , then select option 0 Emergency: 911 Office Hours Monday - Friday 8 a.m. - 5 p.m. Records Phone: 510-215-4400 Fax: 510-235-6618 Quick Links Countywide Community Warning System The Commission on Peace Officer Standards & Training /QuickLinks.aspx Helpful Links Sitemap Accessibility Copyright Notices Government Websites by CivicPlus® /QuickLinks.aspx Enable Google Translate Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In " -4328,https://www.cityofgrassvalley.com/records-release,Incident Reports,Police & Public Interactions,Records Release - City of Grass Valley,"",200,City of Grass Valley,"[""Records Release"", ""Records Release""]","[""Fire Department Instagram"", ""Fire Department Facebook"", ""Police Department Facebook"", ""G2300034"", ""G2000004"", ""G1901078"", ""Commands"", ""Fire Department Instagram"", ""Fire Department Facebook"", ""Police Department Facebook"", ""Log in""]",[],[],[],[],"" -4329,https://www.longbeach.gov/police/about-the-lbpd/lbpd-1421748/,Incident Reports,Police & Public Interactions,LBPD SB1421/AB748/AB2761,"",200,City of Long Beach,"[""Police Department""]","[""LBPD SB 1421/AB 748/AB 2761""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""Senate Bill 1421 (SB 1421)"", ""Assembly Bill 748 (AB 748)"", ""Assembly Bill 2761 (AB 2761)"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""LBPD SB 1421/AB 748"", ""Public Records Request""]",[],"" -4330,https://lasdsb1421.powerappsportals.us/,Incident Reports,Police & Public Interactions,"Home -  · LA County Sheriff","",200," - - Home -  · LA County Sheriff -",[],"[""Los Angeles County Sheriff's Department SB-1421 Records"", """"]",[],"[""Search all SB-1421 / SB-16 Published Incidents""]",[],"[""Click here to return to LASD.ORG"", ""Website Privacy Policy"", ""Disclaimers""]",You’re offline. This is a read only version of the page. You’re offline. This is a read only version of the page. Toggle navigation SB-1421 SB-16 Cases Home Search Sign in Toggle navigation SB-1421 SB-16 Cases Home Search Sign in Toggle navigation SB-1421 SB-16 Cases Home Search Sign in SB-1421 SB-16 Cases Home Search Sign in Search -4331,https://www.lapdonline.org/office-of-the-chief-of-police/constitutional-policing/risk-management-division/senate-bill-1421-senate-bill-16-sb-16/,Incident Reports,Police & Public Interactions,"","",404,"","","","","","","","" -4332,https://www.co.monterey.ca.us/government/departments-a-h/district-attorney/press-releases/officer-involved-shootings,Officer Involved Shootings,Police & Public Interactions,"","",-1,"","","","","","","","" -4333,https://www.novato.org/government/police-department/transparency,Policies & Contracts,Info About Agencies,"","",-1,"","","","","","","","" -4334,https://oaklandca.nextrequest.com/requests?department_ids=2053,List of Data Sources,Info About Agencies,Requests - NextRequest - Modern FOIA & Public Records Request Software,"",200,Error retrieving title: 'NoneType' object has no attribute 'text',"[""Explore 0 requests""]","[""Filters""]",[],[],[],[],"Skip to main content Public Record Requests Oakland, CA Make request All requests Documents Sign in Explore 0 requests If you need Oakland, CA records that may have been previously released, please search past requests. You may find what you need! Filters Reset filters Search requests Request status Closed Open Departments Loading... Sorry, no matching options. Loading more options... Cancel Apply filters 0 FAQS Help Privacy Terms City of Oakland Skip to main content Public Record Requests Oakland, CA Make request All requests Documents Sign in Public Record Requests Oakland, CA Make request All requests Documents Sign in Public Record Requests Oakland, CA Public Record Requests Oakland, CA Make request All requests Documents Sign in Make request All requests Documents Make request All requests Documents Sign in Sign in Explore 0 requests If you need Oakland, CA records that may have been previously released, please search past requests. You may find what you need! Explore 0 requests If you need Oakland, CA records that may have been previously released, please search past requests. You may find what you need! Explore 0 requests Filters Reset filters Search requests Request status Closed Open Departments Loading... Sorry, no matching options. Loading more options... Cancel Apply filters 0 Filters Reset filters Search requests Request status Closed Open Departments Loading... Sorry, no matching options. Loading more options... Cancel Apply filters Filters Reset filters Search requests Request status Closed Open Departments Loading... Sorry, no matching options. Loading more options... Cancel Apply filters Search requests Request status Closed Open Departments Loading... Sorry, no matching options. Loading more options... Cancel Apply filters Search requests Closed Closed Open Open Departments Loading... Sorry, no matching options. Loading more options... Departments Loading... Sorry, no matching options. Loading more options... Loading... Sorry, no matching options. Loading more options... Loading... Loading... Loading... Cancel Apply filters Apply filters 0 0 0 0 FAQS Help Privacy Terms City of Oakland FAQS Help Privacy Terms City of Oakland FAQS Help Privacy Terms City of Oakland " -4335,https://www.ocsheriff.gov/about-ocsheriff/peace-officer-records-releases,Incident Reports,Police & Public Interactions,Peace Officer Records Releases | Orange County California - Sheriff's Department,"Amendments to Penal Code section 832.7 require the release of law enforcement records relating to officer-involved shootings, uses of force resulting in death or great bodily injury and sustained findings against peace officers of dishonesty or sexual assault, as defined by the law. Such records had previously been exempt from public disclosure.",200,"OC Sheriff's Department, CA | Orange County California - Sheriff's Department","[""Peace Officer Records Releases""]","[""Breadcrumb"", ""Released Records"", ""20-077 Sustained Dishonesty"", ""16-145 Use of Force"", ""16-122 Use of Force"", ""16-089 Use of Force"", ""15-120 Use of Force"", ""20-075 Sustained Dishonesty"", ""20-010 Sustained Dishonesty"", ""21-025532 Use of Force"", ""20-020724 Use of Force"", ""19-042554 Use of Force"", ""20-020164 OIS"", ""19-090 Sustained Dishonesty"", ""03-092321 OIS"", ""03-077834 OIS"", ""03-055771 OIS"", ""03-054572 OIS"", ""00-170538 OIS"", ""18-054 Sustained Dishonesty"", ""18-053 Sustained Dishonesty"", ""18-025 Sustained Dishonesty"", ""10-026804 OIS"", ""08-245804 OIS"", ""08-043784 OIS"", ""CCRS 2020-01467 Sustained Prejudice/Discrimination"", ""20-031866 OIS"", ""17-015 Sustained Prejudice/Discrimination"", ""18-034 Sustained Dishonesty"", ""08-006569 OIS"", ""04-117657 OIS"", ""20-015073 OIS"", ""11-081942 OIS"", ""09-091317 OIS"", ""15-161289 OIS"", ""07-252765 OIS"", ""21-030459 Use of Force"", ""19-032109 OIS"", ""18-002705 OIS"", ""16-287025 OIS"", ""15-165583 OIS"", ""13-155963 OIS"", ""13-034439 OIS"", ""12-108630 OIS"", ""11-222961 OIS"", ""21-010034 Use of Force"", ""21-003026 Use of Force"", ""12-164003 OIS"", ""12-041420 OIS"", ""10-187211 OIS"", ""10-109231 OIS"", ""06-109584 OIS"", ""05-254554 OIS"", ""03-087626 OIS"", ""14-151 Sustained Dishonesty"", ""19-135 Sustained Dishonesty"", ""18-176 Sustained Dishonesty"", ""11-211028 OIS"", ""06-013598 OIS"", ""02-058023 OIS"", ""01-072725 OIS"", ""20-014019 Use of Force"", ""20-015326 Use of Force"", ""20-009167 Use of Force"", ""18-033347 Use of Force"", ""17-020481 Use of Force"", ""16-060907 Use of Force"", ""17-003805 OIS"", ""15-093645 OIS"", ""13-188544 OIS"", ""20-031243 OIS"", ""19-059 Sustained Dishonesty"", ""18-067 Sustained Dishonesty"", ""18-065 Sustained Dishonesty"", ""18-063 Sustained Dishonesty"", ""18-062 Sustained Dishonesty"", ""18-061 Sustained Dishonesty"", ""18-060 Sustained Dishonesty"", ""20-009515 Use of Force"", ""20-008412 Use of Force"", ""18-033960 Use of Force"", ""17-068 Sustained Dishonesty"", ""18-027 Sustained Dishonety"", ""18-026 Sustained Dishonesty"", ""17-079 Sustained Dishonesty"", ""15-160 Sustained Dishonesty"", ""15-150 Sustained Dishonesty"", ""15-135 Sustained Dishonesty"", ""15-116 Sexual Assault"", ""14-118 Sustained Dishonesty"", ""13-148 Sustained Dishonesty"", ""15-037 Sustained Dishonesty"", ""13-145 Sustained Dishonesty"", ""13-141 Sustained Dishonesty"", ""13-136 Sustained Dishonesty"", ""13-124 Sustained Dishonesty"", ""13-115 Sustained Dishonesty"", ""19-026579 Use of Force"", ""20-007202 Use of Force"", ""20-006528 Use of Force"", ""19-046455 Use of Force"", ""19-002925 Use of Force"", ""19-049751 Use of Force"", ""19-046814 Use of Force"", ""19-030299 Use of Force"", ""19-015450 Use of Force"", ""13-004 Sustained Dishonesty"", ""19-035017 Use of Force"", ""19-027020 Use of Force"", ""19-012737 Use of Force"", ""19-005291 Use of Force"", ""19-002419 Use of Force"", ""14-121963 Officer Involved Shooting (OIS)"", ""19-002545 Use of Force"", ""19-012649 Use of Force"", ""18-002766/18-001203 Use of Force"", ""18-019895 Use of Force"", ""18-014708 Use of Force"", ""18-039171 Use of Force"", ""18-048751 Use of Force"", ""16-037674 OIS"", ""18-011596 Use of Force"", ""18-039754 Use of Force"", ""18-037420 Use of Force"", ""18-039946 Use of Force"", ""19-029383 Use of Force"", ""17-028673 Use of Force"", ""17-030601 Use of Force"", ""17-032444 Use of Force"", ""17-035948 Use of Force"", ""17-036781 Use of Force"", ""17-045452 Use of Force"", ""18-009248 Use of Force"", ""18-005421 OIS"", ""16-225472 Use of Force"", ""17-006092 Use of Force"", ""17-011538 Use of Force"", ""17-012816 Use of Force"", ""12-022073 OIS"", ""18-049633 Use of Force"", ""17-049808 Use of Force"", ""16-183459 Use of Force"", ""16-131221 Use of Force"", ""16-049243 Use of Force"", ""13-051335 Use of Force"", ""AB748: Officer-involved Shooting"", ""16-253663 Use of Force"", ""16-204638 Use of Force"", ""16-175330 Use of Force"", ""16-061838 Use of Force"", ""16-060140 Use of Force"", ""16-280983 Use of Force"", ""16-134794 Use of Force"", ""16-103791 Use of Force"", ""16-012403 Use of Force"", ""15-121772 Use of Force"", ""14-049495 Use of Force"", ""14-160051 Sexual Assault"", ""14-190439 Use of Force"", ""14-204617 Use of Force"", ""15-027200 Use of Force"", ""15-063223 Use of Force"", ""15-128868 Use of Force"", ""16-046794 Use of Force"", ""Share This"", ""Navigation"", ""Quick Links"", ""Resources"", ""Follow Us""]",[],[],"[""Thông Báo Không Chịu Trách Nhiệm"", ""Exención de responsabilidad"", ""알려드립니다"", ""免責聲明""]",[],"" -4336,https://orangecountyda.org/reports/officer-involved-shooting-reports/,Media Bulletins,Agency-Published Resources,Officer-Involved Shooting Reports Archives - Orange County District Attorney,"",200,Orange County District Attorney Todd Spitzer,"[""Officer-Involved Shooting Reports""]",[],"[""OCDA ISSUES OFFICER-INVOLVED SHOOTING REPORT - Khang Chi To"", ""OCDA ISSUES OFFICER-INVOLVED SHOOTING REPORT - Clemente De Garay Mejia"", ""OCDA ISSUES OFFICER-INVOLVED SHOOTING REPORT - Michael Bernard Emch Jr"", ""OCDA ISSUES OFFICER-INVOLVED SHOOTING REPORT - Rickey Howard Felix Rodrigues"", ""OCDA ISSUES OFFICER-INVOLVED SHOOTING - Michael Bernard Emch Jr"", ""OCDA REPORT: OFFICER-INVOLVED SHOOTING - Hunter Tice"", ""OCDA REPORT: OFFICER-INVOLVED SHOOTING - Tobiah Paul Steinmetz"", ""OCDA REPORT: OFFICER-INVOLVED SHOOTING - Alejandro Sanchez Montes"", ""OCDA REPORT: OFFICER-INVOLVED SHOOTING - Hugo Vargas"", ""OCDA REPORT: OFFICER-INVOLVED SHOOTING - Osman Brown"", ""OCDA REPORT: OFFICER-INVOLVED SHOOTING - Raul Sanchez"", ""OCDA REPORT: OFFICER-INVOLVED SHOOTING - Pablo Santos Alferez-Barahona"", ""OCDA REPORT: OFFICER-INVOLVED SHOOTING - Matthew Wong"", ""OCDA REPORT: OFFICER-INVOLVED SHOOTING - Matthew-Tuan Ahn Tran"", ""OCDA REPORT: OFFICER-INVOLVED SHOOTING - Jose David Valdez"", ""OCDA REPORT: OFFICER-INVOLVED SHOOTING - Eduardo Herrera, Jr."", ""Share"", ""Latest Posts"", ""Main Office""]","[""Orange County District Attorney Warns Public About Extremely Dangerous and Violent Criminal Once Again at Large After Walking Away from Halfway House"", ""OCDA ISSUES CUSTODIAL DEATH REPORT – Sean Conroy Whiting"", ""San Clemente Fertility Doctor Sentenced to 15 Years to Life in Prison for Murdering His Wife""]",[],[],Scroll to top Follow Us – -4337,http://sacsheriff.com/pages/sb1421_releases.php,Incident Reports,Police & Public Interactions,Sac Sheriff,"",200,Sac Sheriff,"[""RELEASED CASES"", ""Need To Report A Crime?""]",[],"[""4500 Orange Grove Avenue, Sacramento, CA 95841""]","[""QUICK LINKS""]","[""Organization"", ""Services"", ""Careers"", ""Crime Reporting"", ""Resource Links"", ""Commendation/Complaint Form""]",[],Sac Sheriff Organization Correctional Services Main Jail RCCC Work Release Contract and Regional Services Airport Civil Bureau Court Security Security Services Field and Investigations Services Central Division Centralized Investigations East Division Impact Division North Division Off-Duty Program Volunteer Services Support Services Field Support Internal Affairs Leadership Command Staff Media and Public Affairs CONTACT US Services Alarm Bureau Bingo Burton Fund Civil Bureau CCW Community Service Centers Homeless Outreach Team Inmate Information LiveScan Fingerprinting Marine Enforcement Detail Mooring Permit Property Releases Reentry Services S.E.E Camera Registry Service Center Locator Take Me Home Safely Towing Enforcement Transparency UVisa Warrants Work Release Payments Youth Services Unit Careers Crime Reporting Crime Stoppers Crime Report Log Online Crime Mapping Submit A Tip Submit Crime Report Resources Contacts FAQs Memorial Tribute Resource Links Victim Resources Commendation/Complaint Form Non-Emergency: 916-874-5115 TDD Non-Emergency: 916-874-7128 CONTACT US × Organization Correctional Services Main Jail RCCC Work Release Contract and Regional Services Airport Civil Bureau Court Security Security Services Field and Investigations Services Central Division Centralized Investigations East Division Homeless Outreach Team Impact Division North Division Off-Duty Program Volunteer Services Support Services Field Support Internal Affairs Leadership Command Staff Media and Public Affairs Services Alarm Bureau Bingo Burton Fund Civil Bureau CCW Community Service Centers Homeless Outreach Team Inmate Information LiveScan Fingerprinting Marine Enforcement Detail Mooring Permit Property Releases Reentry Services Service Center Locator S.E.E. Camera Registry Take Me Home Safely Towing Enforcement Transparency UVisa Warrants Work Release Payments Youth Services Unit Careers Career Info In-Service Training Recruiting Reserve Officer Sacramento County Jobs SPARTA Training Academy Veteran Jobs Volunteer Services Crime Reporting Crime Stoppers Crime Report Log Online Crime Mapping Submit A Tip Submit Crime Report Resource Links Contacts FAQs Memorial Tribute Resource Links Victim Resources Commendation/Complaint Form HOME ☰ RELEASED CASES This page no longer contains released cases. Please select this link TRANSPARENCY for a complete listing of our current releases. -4338,http://www.cityofsacramento.org/Police/Transparency/Senate-Bill-1421-Releases,Incident Reports,Police & Public Interactions,Police Department | City of Sacramento,Sacramento Police Department,200,Home | City of Sacramento,"[""Sacramento Police Department""]","[""About"", ""Your SacPD"", ""Index"", ""Social Media""]","[""Search for content"", ""News and Information"", ""Reporting"", ""Popular Services"", ""More"", ""Call our Non-Emergency Number: 916-808-5471"", ""We're hiring!"", ""Meet the Chief"", ""Uncrewed Aircraft Systems (UAS)"", ""In the News""]",[],[],[],"" -4339,https://sbcountyda.org/ois/,Officer Involved Shootings,Police & Public Interactions,Officer Involved Shooting Response Team – San Bernardino County District Attorney,"Officer-Involved Shooting Response Team When peace officers use deadly force, society expects that such force will occur only when prescribed by law. The public also has a right to expect...",200,San Bernardino County District Attorney – San Bernardino County District Attorney's Office,[],[],"[""Leave this site safely""]",[],[],[],"" -4340,https://www.sandiego.gov/police/data-transparency/mandated-disclosures,List of Data Sources,Info About Agencies,Mandated Disclosures | City of San Diego Official Website,"",200,City of San Diego Official Website,"[""City of San Diego Official Website"", ""Mandated Disclosures""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Data & Transparency"", ""Footer"", ""Accessibility Tools""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[],"" -4341,https://www.venturasheriff.org/sb-1421/,List of Data Sources,Info About Agencies,"","",404,"","","","","","","","" -4342,https://www.walnut-creek.org/departments/public-safety/police/policies-and-transparency-information/senate-bill-1421-materials,Incident Reports,Police & Public Interactions,"","",-1,"","","","","","","","" -4343,https://www.riversideca.gov/cityclerk/boards-commissions/community-police-review-commission/officer-involved-deaths-oid/officer-involved,Incident Reports,Police & Public Interactions,Officer-Involved Death Case Evaluations | City Clerk,"",200,"Riverside, California | City of Arts & Innovation ","[""Officer-Involved Death Case Evaluations""]",[],[],"[""Main Menu Links"", ""City Links"", ""Joseph Tracy MB220190001 January 18, 2022"", ""Press"", ""Felix Jerry Marquez P21-0012809 May 8, 2021"", ""Press"", ""Independent Investigation Reports"", ""Jehlani Jay Black P21-0006980 March 9, 2021"", ""Press"", ""Independent Investigation Reports"", ""Aaron Nathaniel Luther P19-08054 August 12, 2019"", ""Public Report"", ""Press"", ""Criminal Casebook"", ""David Eugene Russell P18-136590 July 22, 2018"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Russell OID Public Report"", ""Arthur Cornejo Levario P18-135608 July 20, 2018"", ""Criminal Casebook"", ""Press"", ""Report of Investigation"", ""RPD Briefing"", ""Ernie David Saldivar P18-044194 March 8, 2018"", ""Press"", ""RPD Briefing"", ""Criminal Casebook"", ""Independent Investigation Reports"", ""Luvelle Kennon P17-196932 October 31, 2017"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Kennon OID Public Report"", ""Marcelino Garcia 17-004 | P17-032034 February 20, 2017"", ""Press"", ""Independent Investigation Reports"", ""RPD Policies"", ""Criminal Casebook"", ""Edward Thomas Hayes III 16-011 | P16-200713 October 31, 2016"", ""Press"", ""RPD Policies"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Dominic William Smith 16-012 | P16-237-976 December 29, 2016"", ""Press"", ""RPD Policies"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Smith OID Public Report"", ""Steven Lewis 15-006 | P15-028755 February 23, 2015"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Fact Sheet"", ""Lewis OID Public Report"", ""Vicente Robert Martinez 14-036 | P14-175586 November 18, 2014"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Fact Sheet"", ""Martinez OID Public Report"", ""Adolfo Ramirez 13-039 | P13-169168 November 22, 2013"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Ramirez OID Public Report"", ""Hector Jimenez 13-034 | P13-133894 September 13, 2013"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Fact Sheet"", ""Jimenez OID Public Report"", ""Dontae Daveon Lewis Hayes 13-040 | P13-186428 December 31, 2013"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Hayes OID Public Report"", ""Rashad Jarrett Hopes 13-020 | P13-083040 June 11, 2013"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Hopes OID Public Report"", ""Lorenzo J. Ciaramella 13-003 | P13-026517 February 25, 2013"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Ciaramella OID Public Report"", ""Chaz Sherron 12-027 | P12-149530 October 14, 2012"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Sherron OID Public Report"", ""Danny James Bond 12-007 | P12-024811 February 18, 2012"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Bond OID Public Report"", ""Christopher Dorner 13-001 | PA1303007 February 12, 2013"", ""Brandon James Dunbar 12-008 | P12-030492 March 1, 2012"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Dunbar OID Public Report"", ""David Hernandez Ledezma 12-002 | P12-003517 January 7, 2012"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Ledezma OID Public Report"", ""Isabel Pablo 12-017 | P12-067271 May 13, 2012"", ""Press"", ""RPD Briefing"", ""Accident Investigation Report"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Pablo OID Public Report"", ""Alfred Delatorre Romo 11-038 | P11-169228 November 16, 2011"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Romo OID Public Report"", ""Virgil Anthony Millon 11-020 | P11-068393 May 10, 2011"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Millon OID Public Report"", ""Russell F. Hyatt 09-002 | P09-008550 January 18, 2009"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Hyatt OID Public Report"", ""Marlon O. Acevedo 08-047 | P08-157587 October 31, 2008"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Acevedo OID Public Report"", ""Joseph Tracy MB220190001 January 18, 2022"", ""Press"", ""Felix Jerry Marquez P21-0012809 May 8, 2021"", ""Press"", ""Independent Investigation Reports"", ""Jehlani Jay Black P21-0006980 March 9, 2021"", ""Press"", ""Independent Investigation Reports"", ""Aaron Nathaniel Luther P19-08054 August 12, 2019"", ""Press"", ""David Eugene Russell P18-136590 July 22, 2018"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Russell OID Public Report"", ""Arthur Cornejo Levario P18-135608 July 20, 2018"", ""Criminal Casebook"", ""Press"", ""Report of Investigation"", ""RPD Briefing"", ""Ernie David Saldivar P18-044194 March 8, 2018"", ""Press"", ""RPD Briefing"", ""Criminal Casebook"", ""Independent Investigation Reports"", ""Luvelle Kennon P17-196932 October 31, 2017"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Kennon OID Public Report"", ""Marcelino Garcia 17-004 | P17-032034 February 20, 2017"", ""Press"", ""Independent Investigation Reports"", ""RPD Policies"", ""Criminal Casebook"", ""Edward Thomas Hayes III 16-011 | P16-200713 October 31, 2016"", ""Press"", ""RPD Policies"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Dominic William Smith 16-012 | P16-237-976 December 29, 2016"", ""Press"", ""RPD Policies"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Smith OID Public Report"", ""Steven Lewis 15-006 | P15-028755 February 23, 2015"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Fact Sheet"", ""Lewis OID Public Report"", ""Vicente Robert Martinez 14-036 | P14-175586 November 18, 2014"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Fact Sheet"", ""Martinez OID Public Report"", ""Adolfo Ramirez 13-039 | P13-169168 November 22, 2013"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Ramirez OID Public Report"", ""Hector Jimenez 13-034 | P13-133894 September 13, 2013"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Fact Sheet"", ""Jimenez OID Public Report"", ""Dontae Daveon Lewis Hayes 13-040 | P13-186428 December 31, 2013"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Hayes OID Public Report"", ""Rashad Jarrett Hopes 13-020 | P13-083040 June 11, 2013"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Hopes OID Public Report"", ""Lorenzo J. Ciaramella 13-003 | P13-026517 February 25, 2013"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Ciaramella OID Public Report"", ""Chaz Sherron 12-027 | P12-149530 October 14, 2012"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Sherron OID Public Report"", ""Danny James Bond 12-007 | P12-024811 February 18, 2012"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Bond OID Public Report"", ""Christopher Dorner 13-001 | PA1303007 February 12, 2013"", ""Brandon James Dunbar 12-008 | P12-030492 March 1, 2012"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Dunbar OID Public Report"", ""David Hernandez Ledezma 12-002 | P12-003517 January 7, 2012"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Ledezma OID Public Report"", ""Isabel Pablo 12-017 | P12-067271 May 13, 2012"", ""Press"", ""RPD Briefing"", ""Accident Investigation Report"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Pablo OID Public Report"", ""Alfred Delatorre Romo 11-038 | P11-169228 November 16, 2011"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Romo OID Public Report"", ""Virgil Anthony Millon 11-020 | P11-068393 May 10, 2011"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Millon OID Public Report"", ""Russell F. Hyatt 09-002 | P09-008550 January 18, 2009"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Hyatt OID Public Report"", ""Marlon O. Acevedo 08-047 | P08-157587 October 31, 2008"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Acevedo OID Public Report"", ""Joseph Tracy MB220190001 January 18, 2022"", ""Press"", ""Felix Jerry Marquez P21-0012809 May 8, 2021"", ""Press"", ""Independent Investigation Reports"", ""Jehlani Jay Black P21-0006980 March 9, 2021"", ""Press"", ""Independent Investigation Reports"", ""Aaron Nathaniel Luther P19-08054 August 12, 2019"", ""Press"", ""David Eugene Russell P18-136590 July 22, 2018"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Russell OID Public Report"", ""Arthur Cornejo Levario P18-135608 July 20, 2018"", ""Criminal Casebook"", ""Press"", ""Report of Investigation"", ""RPD Briefing"", ""Ernie David Saldivar P18-044194 March 8, 2018"", ""Press"", ""RPD Briefing"", ""Criminal Casebook"", ""Independent Investigation Reports"", ""Luvelle Kennon P17-196932 October 31, 2017"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Kennon OID Public Report"", ""Marcelino Garcia 17-004 | P17-032034 February 20, 2017"", ""Press"", ""Independent Investigation Reports"", ""RPD Policies"", ""Criminal Casebook"", ""Edward Thomas Hayes III 16-011 | P16-200713 October 31, 2016"", ""Press"", ""RPD Policies"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Dominic William Smith 16-012 | P16-237-976 December 29, 2016"", ""Press"", ""RPD Policies"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Smith OID Public Report"", ""Steven Lewis 15-006 | P15-028755 February 23, 2015"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Fact Sheet"", ""Lewis OID Public Report"", ""Vicente Robert Martinez 14-036 | P14-175586 November 18, 2014"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Fact Sheet"", ""Martinez OID Public Report"", ""Adolfo Ramirez 13-039 | P13-169168 November 22, 2013"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Ramirez OID Public Report"", ""Hector Jimenez 13-034 | P13-133894 September 13, 2013"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""Criminal Casebook"", ""Fact Sheet"", ""Jimenez OID Public Report"", ""Dontae Daveon Lewis Hayes 13-040 | P13-186428 December 31, 2013"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Hayes OID Public Report"", ""Rashad Jarrett Hopes 13-020 | P13-083040 June 11, 2013"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Hopes OID Public Report"", ""Lorenzo J. Ciaramella 13-003 | P13-026517 February 25, 2013"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Ciaramella OID Public Report"", ""Chaz Sherron 12-027 | P12-149530 October 14, 2012"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Sherron OID Public Report"", ""Danny James Bond 12-007 | P12-024811 February 18, 2012"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Bond OID Public Report"", ""Christopher Dorner 13-001 | PA1303007 February 12, 2013"", ""Brandon James Dunbar 12-008 | P12-030492 March 1, 2012"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Dunbar OID Public Report"", ""David Hernandez Ledezma 12-002 | P12-003517 January 7, 2012"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Ledezma OID Public Report"", ""Isabel Pablo 12-017 | P12-067271 May 13, 2012"", ""Press"", ""RPD Briefing"", ""Accident Investigation Report"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Pablo OID Public Report"", ""Alfred Delatorre Romo 11-038 | P11-169228 November 16, 2011"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Romo OID Public Report"", ""Virgil Anthony Millon 11-020 | P11-068393 May 10, 2011"", ""Press"", ""RPD Briefing"", ""Independent Investigation Reports"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Millon OID Public Report"", ""Russell F. Hyatt 09-002 | P09-008550 January 18, 2009"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Hyatt OID Public Report"", ""Marlon O. Acevedo 08-047 | P08-157587 October 31, 2008"", ""CPRC Work Documents"", ""Criminal Casebook"", ""Acevedo OID Public Report"", ""Home"", ""Popular"", ""Contact"", ""Resources""]",[],[],Skip to main content Search Main Menu Links City Clerk Homepage Boards & Commissions Elections Government Meetings Online Documents Contact & Info City Links RiversideCA.gov Engage Riverside Shop Riverside Public Utilities Search Search Search RiversideCA.gov Engage Riverside Shop Riverside Public Utilities Search RiversideCA.gov Engage Riverside Shop Riverside Public Utilities Search RiversideCA.gov Engage Riverside Shop Riverside Public Utilities Search Search Search City Clerk Toggle offcanvas navigation Boards & Commissions Elections Government Meetings Online Documents Contact & Info RiversideCA.gov Engage Riverside Shop Riverside Public Utilities Toggle offcanvas navigation Boards & Commissions Elections Government Meetings Online Documents Contact & Info RiversideCA.gov Engage Riverside Shop Riverside Public Utilities Toggle offcanvas navigation Boards & Commissions Elections Government Meetings Online Documents Contact & Info RiversideCA.gov Engage Riverside Shop Riverside Public Utilities Boards & Commissions Elections Government Meetings Online Documents Contact & Info RiversideCA.gov Engage Riverside Shop Riverside Public Utilities -4344,https://www.muckrock.com/foi/pittsburgh-130/traffic-stops-140596/,Stops,Police & Public Interactions,Traffic Stops • MuckRock,MuckRock is a collaborative news site that gives you the tools to hold the government accountable.,200,MuckRock,"[""Traffic Stops""]","[""Communications"", ""Files""]","[""""]",[],[],[],"" -4345,https://www.muckrock.com/foi/kingston-30521/roster-and-hire-dates-143168/#files,Personnel Records,Info About Officers,Roster and hire dates • MuckRock,MuckRock is a collaborative news site that gives you the tools to hold the government accountable.,200,MuckRock,"[""Roster and hire dates""]","[""Communications"", ""Files""]","[""""]",[],[],[],"" -4346,https://data.tennessee.edu/salary-database/,Personnel Records,Info About Officers,Employee Salaries - Data at UT,"",200,403 Forbidden,"[""Employee Salaries Dashboard""]",[],[],[],[],[],"Search for: Search Search for: Search Search Data at UT Data at UT Menu Students Enrollment Student Success Degrees Awarded Human Resources Employee Salaries Research UT Impact Peer Comparisons Video Guides Data Dictionary Students Enrollment Student Success Degrees Awarded Human Resources Employee Salaries Research UT Impact Peer Comparisons Video Guides Data Dictionary Employee Salaries Dashboard The employee salaries dashboard displays the base salaries of all paid, regular, active University of Tennessee employees. Employee Salaries Dashboard The employee salaries dashboard displays the base salaries of all paid, regular, active University of Tennessee employees. Employee Salaries Dashboard The employee salaries dashboard displays the base salaries of all paid, regular, active University of Tennessee employees. Employee Salaries Dashboard The employee salaries dashboard displays the base salaries of all paid, regular, active University of Tennessee employees. Employee Salaries Dashboard The employee salaries dashboard displays the base salaries of all paid, regular, active University of Tennessee employees. Employee Salaries Dashboard The employee salaries dashboard displays the base salaries of all paid, regular, active University of Tennessee employees. Employee Salaries Dashboard The employee salaries dashboard displays the base salaries of all paid, regular, active University of Tennessee employees. Employee Salaries Dashboard The employee salaries dashboard displays the base salaries of all paid, regular, active University of Tennessee employees. Institutional Effectiveness 1210 UT Tower 505 Summer Place Knoxville TN 37902 data@tennessee.edu 865-974-3843 © 2024 The University of Tennessee System. Privacy Notice Institutional Effectiveness 1210 UT Tower 505 Summer Place Knoxville TN 37902 data@tennessee.edu 865-974-3843 Institutional Effectiveness 1210 UT Tower 505 Summer Place Knoxville TN 37902 data@tennessee.edu 865-974-3843 Institutional Effectiveness 1210 UT Tower 505 Summer Place Knoxville TN 37902 data@tennessee.edu 865-974-3843 Institutional Effectiveness 1210 UT Tower 505 Summer Place Knoxville TN 37902 data@tennessee.edu 865-974-3843 © 2024 The University of Tennessee System. Privacy Notice © 2024 The University of Tennessee System. Privacy Notice " -4347,https://bjs.ojp.gov/content/pub/pdf/nsleed.pdf,Personnel Records,Info About Officers,"","",200,"","","","","","","","" -4348,https://www.opendatanetwork.com/search?categories=public%20safety,List of Data Sources,Info About Agencies,Data on the Open Data Network,"",200,Open Data Network,"[""Open Data Network""]","[""High Torque, Direct Drive Electric Motor Project"", ""Extreme Temperature, Rad-Hard Power Management ASIC Project"", ""OMI/Aura Level 1B VIS Zoom-in Geolocated Earthshine Radiances 1-orbit L2 Swath 13x12 km V003"", ""MODIS Airborne Simulator (MAS) Measurements Taken Onboard the NASA ER-2 During the TOGA COARE Intensive Observing Period."", ""NLDAS Noah Land Surface Model L4 Monthly 0.125 x 0.125 degree V002"", ""NOAA - Severe weather warnings for tornadoes: Storm based accuracy (%)"", ""HS Dataset CARES Mortgage Program"", ""NIST MFG USA Geodata"", ""Planning for Planetary Science Mission Including Resource Prospecting Project"", ""Including the effects of a harsh radiation environment in the simulation and design of nanoelectronic devices and circuits Project""]",[],[],[],[],Search -4349,https://github.com/invinst/chicago-police-data,Personnel Records,Info About Officers,GitHub - invinst/chicago-police-data: a collection of public data re: CPD officers involved in police encounters,a collection of public data re: CPD officers involved in police encounters - invinst/chicago-police-data,200,GitHub: Let’s build from here · GitHub,"[""Search code, repositories, users, issues, pull requests..."", ""Provide feedback"", ""Saved searches"", ""invinst/chicago-police-data"", ""Chicago Police Data"", ""Using the data"", ""Workflow""]","[""Use saved searches to filter your results more quickly"", ""Folders and files"", ""Latest commit"", ""History"", ""Repository files navigation"", ""What is this?"", ""What can I find in here?"", ""Where did it come from?"", ""Contributing to this repository"", ""I have a question"", ""Naming Conventions"", ""Task Folders"", ""About"", ""Releases"", ""Packages 0"", ""Contributors 12"", ""Languages"", ""Footer""]","[""data"", ""data"", ""foia"", ""foia"", ""get_data"", ""get_data"", ""individual"", ""individual"", ""merge"", ""merge"", ""reports"", ""reports"", ""research"", ""research"", ""share"", ""share"", "".gitignore"", "".gitignore"", ""Dockerfile"", ""Dockerfile"", ""README.md"", ""README.md"", ""docker-compose.yaml"", ""docker-compose.yaml"", ""requirements.txt"", ""requirements.txt"", ""Complaints"", ""Awards"", ""Salary"", ""Unit History"", ""Matching Officers"", ""individual/"", ""merge/"", ""share/"", ""Resources"", ""Stars"", ""Watchers"", ""Forks"", ""Footer navigation""]",[],[],[],"" -4350,https://www.sentencingproject.org/research/us-criminal-justice-data/,Incarceration Records,Jails & Courts Specific,U.S. Criminal Justice Data – The Sentencing Project,The Sentencing Project compiles state-level data to provide a snapshot of key indicators of mass incarceration's impact in the United States.,200,We change the way Americans think about crime and punishment,"[""U.S. Criminal Justice Data""]","[""Stay involved & informed""]","[""Issues"", ""Advocacy"", ""Research"", ""Issues"", ""Advocacy"", ""Research"", ""About"", ""Imprisonment Rate"", ""Black/White Disparity"", ""Latinx/White Disparity"", ""Youth Custody Rate"", ""Felony Disenfranchisement Rate"", ""Growth in Mass Incarceration"", ""Compare data by jurisdiction"", ""Thanks for subscribing!"", ""One more thing, !""]","[""Racial Justice"", ""Sentencing Reform"", ""Voting Rights"", ""Youth Justice"", ""Second Look Network"", ""Our Work"", ""Second Look Network"", ""Get Involved"", ""50 Years and a Wake Up"", ""Growth in Mass Incarceration"", ""U.S. Criminal Justice Data"", ""Detailed Data Tool"", ""Resource Library"", ""One in Five""]",[],[],"" -4351,https://github.com/rladiesPHL/2021_datathon/blob/main/data/data_links.md,Court Cases,Jails & Courts Specific,2021_datathon/data/data_links.md at main · rladiesPHL/2021_datathon · GitHub,"Public repository for the R-Ladies Philly & JAT datathon on ""Exploring judicial patterns in Philadelphia courts"" - 2021_datathon/data/data_links.md at main · rladiesPHL/2021_datathon",200,GitHub: Let’s build from here · GitHub,"[""Search code, repositories, users, issues, pull requests..."", ""Provide feedback"", ""Saved searches"", ""data_links.md"", ""data_links.md"", ""URL Endpoints""]","[""Use saved searches to filter your results more quickly"", ""Files"", ""Breadcrumbs"", ""Latest commit"", ""History"", ""Breadcrumbs"", ""File metadata and controls"", ""Bail"", ""Footer""]","[""NEW: Statute Name (legal code number) and Description"", ""NEW: Defendant and Docket IDs"", ""Offenses and disposition info (original)"", ""Offenses and disposition info (v2)"", ""Offenses and disposition info (v3)"", ""Defendant and docket info"", ""Footer navigation""]",[],[],[],"Skip to content Toggle navigation Sign in Product Actions Automate any workflow Packages Host and manage packages Security Find and fix vulnerabilities Codespaces Instant dev environments Copilot Write better code with AI Code review Manage code changes Issues Plan and track work Discussions Collaborate outside of code Explore All features Documentation GitHub Skills Blog Solutions For Enterprise Teams Startups Education By Solution CI/CD & Automation DevOps DevSecOps Resources Learning Pathways White papers, Ebooks, Webinars Customer Stories Partners Open Source GitHub Sponsors Fund open source developers The ReadME Project GitHub community articles Repositories Topics Trending Collections Pricing Search or jump to... Search code, repositories, users, issues, pull requests... Search Clear Search syntax tips Provide feedback We read every piece of feedback, and take your input very seriously. Include my email address so I can be contacted Cancel Submit feedback Saved searches Use saved searches to filter your results more quickly Name Query To see all available qualifiers, see our documentation . Cancel Create saved search Sign in Sign up You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert rladiesPHL / 2021_datathon Public Notifications Fork 17 Star 7 Code Issues 2 Pull requests 0 Discussions Actions Projects 0 Security Insights Additional navigation options Code Issues Pull requests Discussions Actions Projects Security Insights Files main Breadcrumbs 2021_datathon / data / data_links.md Blame Blame Latest commit History History 125 lines (62 loc) · 4.23 KB main Breadcrumbs 2021_datathon / data / data_links.md Top File metadata and controls Preview Code Blame 125 lines (62 loc) · 4.23 KB Raw URL Endpoints Click on each link to download the respective dataset: NEW: Statute Name (legal code number) and Description statutes.csv NEW: Defendant and Docket IDs Find repeat defendants using unique defendant ids matched to their corresponding dockets. https://storage.googleapis.com/jat-rladies-2021-datathon/defendant_docket_ids.csv Offenses and disposition info (original) All years: https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions.csv By two year periods: https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_2010_2011.csv https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_2012_2013.csv https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_2014_2015.csv https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_2016_2017.csv https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_2018_2019.csv https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_2020.csv Offenses and disposition info (v2) This v2 has the statute name added in... and 4 more rows than the original, for reasons Joy hasn't tracked down yet. https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_v2.csv By two year periods: https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_v2_2010_2011.csv https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_v2_2012_2013.csv https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_v2_2014_2015.csv https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_v2_2016_2017.csv https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_v2_2018_2019.csv https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_v2_2020.csv Offenses and disposition info (v3) Add credit for time served https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_v3.csv By two year periods: https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_v3_2010_2011.csv https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_v3_2012_2013.csv https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_v3_2014_2015.csv https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_v3_2016_2017.csv https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_v3_2018_2019.csv https://storage.googleapis.com/jat-rladies-2021-datathon/offenses_dispositions_v3_2020.csv Defendant and docket info All years: https://storage.googleapis.com/jat-rladies-2021-datathon/defendant_docket_details.csv In two year periods: https://storage.googleapis.com/jat-rladies-2021-datathon/defendant_docket_details_2010_2011.csv https://storage.googleapis.com/jat-rladies-2021-datathon/defendant_docket_details_2012_2013.csv https://storage.googleapis.com/jat-rladies-2021-datathon/defendant_docket_details_2014_2015.csv https://storage.googleapis.com/jat-rladi" -4352,https://data.mendeley.com/datasets/r65b6hrdhm/2,Policies & Contracts,Info About Agencies,911 Good Samaritan Law Inventory - Mendeley Data,"911 Good Samaritan Laws (GSLs) extend limited legal immunity to persons reporting emergency overdoses who may themselves be in possession of controlled substances or engaging in related activities. The 911 Good Samaritan Law Inventory inductively catalogs each GSL feature across every state from ratification to June 2022. It catalogs the full breadth of protected offenses, all burdens placed on Good Samaritans, the strength of immunity, and exemptions to protection. The inventory complements existing agglomerative policy surveillance databases by mapping features inductively to reflect their heterogenous implementation across states. The materials are formatted by MonQcle, developed by Law Atlas at Temple University's Center Public Health Law Research.",200,Mendeley Data,"[""911 Good Samaritan Law Inventory""]","[""Description"", ""Files"", ""Steps to reproduce"", ""Institutions"", ""Categories"", ""Related Links"", ""Licence"", ""Dataset metrics""]",[],[],[],[],"Skip to main content FAQ Sign In / Register Sign In / Register FAQ 911 Good Samaritan Law Inventory Published: 22 November 2022 | Version 2 | DOI: 10.17632/r65b6hrdhm.2 Contributor : Shane Reader Description 911 Good Samaritan Laws (GSLs) extend limited legal immunity to persons reporting emergency overdoses who may themselves be in possession of controlled substances or engaging in related activities. The 911 Good Samaritan Law Inventory inductively catalogs each GSL feature across every state from ratification to June 2022. It catalogs the full breadth of protected offenses, all burdens placed on Good Samaritans, the strength of immunity, and exemptions to protection. The inventory complements existing agglomerative policy surveillance databases by mapping features inductively to reflect their heterogenous implementation across states. The materials are formatted by MonQcle, developed by Law Atlas at Temple University's Center Public Health Law Research. Download All Files Steps to reproduce The 911 Good Samaritan Law Inventory Protocol document contains the full research protocol. - -GSLs were identified at their respective state legislative websites using the search terms ""overdose,"" ""opioid,"" or ""Good Samaritan."" We identified the ratifying bill and subsequent amendments using annotations or by identifying year-over-year changes and associating them with session law in the corresponding year, creating a complete account of the legislative history of the GSL statute. Provisions pertaining to materials other than controlled substances (counterfeit substances and controlled substance analogs), alcohol, and registered controlled substance distributors and manufacturers (such as pharmacies) are excluded. Features were abstracted inductively, adding new dimensions to the recording instrument to accommodate newly-discovered features. Protections indicate offenses immunized in the GSL, although a lack of protection may conversely indicate the state does not enforce such an offense. (For example, Alaska does not criminalize possession of paraphernalia, so this immunity is lacking in the GSL.) Institutions University of Texas Health Science Center at Houston Categories Policy, Crime Policy Related Links Software https://monqcle.com/ compiles this dataset Article https://doi.org/10.1016/j.drugpo.2022.103896 is source of this dataset Licence CC BY NC 3.0 Learn more Dataset metrics Home | About | Accessibility Statement | Archive Policy | File Formats | API Docs | OAI | Mission Terms of Use | Privacy Policy | Cookie Notice All content on this site: Copyright © 2024 Elsevier inc, its licensors, and contributors. All rights are reserved, including those for text and data mining, AI training and similar technologies. For all open access content, the Creative Commons licensing terms apply. " -4353,https://alleghenycountyda.us/wp-content/uploads/2023/03/2-ACCPA-DA-MODEL-USE-OF-FORCE-PROCEDURES-March-2022.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -4354,https://biglocalnews.org/#/project/UHJvamVjdDo5NTI5MzAwYy1jNmZiLTQ3ZDItYWI2ZC03MDMxYjFlMTNjNDk=,Arrest Records,Police & Public Interactions,Big Local News,"",200,Big Local News,"[""Big Local News""]",[],[],[],[],[],"Log In Data Tools Collaborations Affiliates News Archive Support About Big Local News Empowering journalists with data, tools and collaborations Log in Sign up About Log In Data Tools Collaborations Affiliates News Archive Support About Big Local News Empowering journalists with data, tools and collaborations Log in Sign up About Log In Data Tools Collaborations Affiliates News Archive Support About Log In Data Tools Collaborations Affiliates News Archive Support About Log In Data Tools Collaborations Affiliates News Archive Support About Log In Log In Data Data Tools Tools Collaborations Collaborations Affiliates Affiliates News News Archive Archive Support Support About About Big Local News Empowering journalists with data, tools and collaborations Log in Sign up About Big Local News Empowering journalists with data, tools and collaborations Log in Sign up About Big Local News Empowering journalists with data, tools and collaborations Log in Sign up About Big Local News Empowering journalists with data, tools and collaborations Log in Sign up About Log in Sign up About Log In Data Tools Collaborations Affiliates News Archive Support About Log In Data Tools Collaborations Affiliates News Archive Support About Log In Log In Data Data Tools Tools Collaborations Collaborations Affiliates Affiliates News News Archive Archive Support Support About About " -4355,https://github.com/datadesk/los-angeles-police-killings-data/blob/master/los-angeles-police-killings.csv,Use of Force Reports,Police & Public Interactions,los-angeles-police-killings-data/los-angeles-police-killings.csv at master · datadesk/los-angeles-police-killings-data · GitHub,The Los Angeles Times' database of people killed by local police in Los Angeles County. - los-angeles-police-killings-data/los-angeles-police-killings.csv at master · datadesk/los-angeles-police-killings-data,200,GitHub: Let’s build from here · GitHub,"[""Search code, repositories, users, issues, pull requests..."", ""Provide feedback"", ""Saved searches""]","[""Use saved searches to filter your results more quickly"", ""Footer""]","[""Footer navigation""]",[],[],[],"Skip to content Toggle navigation Sign in Product Actions Automate any workflow Packages Host and manage packages Security Find and fix vulnerabilities Codespaces Instant dev environments Copilot Write better code with AI Code review Manage code changes Issues Plan and track work Discussions Collaborate outside of code Explore All features Documentation GitHub Skills Blog Solutions For Enterprise Teams Startups Education By Solution CI/CD & Automation DevOps DevSecOps Resources Learning Pathways White papers, Ebooks, Webinars Customer Stories Partners Open Source GitHub Sponsors Fund open source developers The ReadME Project GitHub community articles Repositories Topics Trending Collections Pricing Search or jump to... Search code, repositories, users, issues, pull requests... Search Clear Search syntax tips Provide feedback We read every piece of feedback, and take your input very seriously. Include my email address so I can be contacted Cancel Submit feedback Saved searches Use saved searches to filter your results more quickly Name Query To see all available qualifiers, see our documentation . Cancel Create saved search Sign in Sign up You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert datadesk / los-angeles-police-killings-data Public Notifications Fork 6 Star 15 Code Issues 1 Pull requests 0 Actions Projects 0 Security Insights Additional navigation options Code Issues Pull requests Actions Projects Security Insights Footer © 2024 GitHub, Inc. Footer navigation Terms Privacy Security Status Docs Contact Manage cookies Do not share my personal information You can’t perform that action at this time. Skip to content Toggle navigation Sign in Product Actions Automate any workflow Packages Host and manage packages Security Find and fix vulnerabilities Codespaces Instant dev environments Copilot Write better code with AI Code review Manage code changes Issues Plan and track work Discussions Collaborate outside of code Explore All features Documentation GitHub Skills Blog Solutions For Enterprise Teams Startups Education By Solution CI/CD & Automation DevOps DevSecOps Resources Learning Pathways White papers, Ebooks, Webinars Customer Stories Partners Open Source GitHub Sponsors Fund open source developers The ReadME Project GitHub community articles Repositories Topics Trending Collections Pricing Search or jump to... Search code, repositories, users, issues, pull requests... Search Clear Search syntax tips Provide feedback We read every piece of feedback, and take your input very seriously. Include my email address so I can be contacted Cancel Submit feedback Saved searches Use saved searches to filter your results more quickly Name Query To see all available qualifiers, see our documentation . Cancel Create saved search Sign in Sign up You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert " -4356,https://alleghenycontroller.com/reports-audits/,Annual & Monthly Reports,Info About Agencies,"Reports, Audits, Minutes, & Wardens Archive -","",200,Allegheny County Controller Corey O'Connor,"[""REPORTS & AUDITS""]","[""Reports & Audits"", ""February 2024 Jail Oversight Board Minutes"", ""February 2024 Warden’s Report"", ""January 2024 Jail Oversight Board Minutes"", ""December 2023 Jail Oversight Board Minutes"", ""November 2023 Jail Oversight Board Minutes"", ""January 2024 Warden’s Report"", ""Allegheny County Industry Working Group Report"", ""December 2023 Warden’s Report"", ""November 2023 Warden’s Report"", ""October 2023 Warden’s Report"", ""October 2023 Jail Oversight Board Minutes"", ""September 2023 Jail Oversight Board Minutes"", ""Allegheny County Police Confidential Fund Audit Report 2022"", ""Allegheny County Police Confidential Fund Internal Control & Compliance Report 2022"", ""Allegheny County Police DOJ Fund Audit Report 2022"", ""Allegheny County Police DOJ Fund Internal Control & Compliance Report 2022"", ""You are about to leave AlleghenyController.com."", ""10"", ""You are about to leave AlleghenyController.com."", ""10""]","[""Category"", ""Publish date"", ""Search by Vendor Name, Contract Number, or Keyword""]","[""THE CONTROLLER"", ""DOCUMENTS & DATA"", ""TOOLS & RESOURCES"", ""Register As Employer"", ""Register As Constable""]",[],[],"" -4357,https://americanequity.org/dashboard.html,Court Cases,Jails & Courts Specific,American Equity and Justice Group | Dashboard,Share criminal justice statistics with everyone.,200,American Equity and Justice Group,[],"[""Subscribe for updates""]",[],"[""DASHBOARDS""]",[],[],About Our Story Our Team Impact Data Instructions User Manual Dashboard Take Action Donate Subscribe About Our Story Our Team Our Story Our Team Data Instructions User Manual Dashboard Instructions User Manual Dashboard Donate Subscribe Our Story Our Team Impact Instructions User Manual Dashboard Take Action DASHBOARDS Conviction Proportionality Sentencing Proportionality: County & Judge Sentencing Proportionality: Deep Dive Case Drill Down DASHBOARDS Conviction Proportionality Sentencing Proportionality: County & Judge Sentencing Proportionality: Deep Dive Case Drill Down DASHBOARDS Conviction Proportionality Sentencing Proportionality: County & Judge Sentencing Proportionality: Deep Dive Case Drill Down Your browser doesn't support iFrames. × Subscribe for updates * indicates required Email Address * First Name * Last Name * Phone Number Organization Name Role * Academic/researcher Attorney - defense Attorney - prosecutor Attorney - public defender/indigent defense Government official - legislator Government official - other Journalist Other × Subscribe for updates * indicates required Email Address * First Name * Last Name * Phone Number Organization Name Role * Academic/researcher Attorney - defense Attorney - prosecutor Attorney - public defender/indigent defense Government official - legislator Government official - other Journalist Other Subscribe for updates * indicates required Email Address * First Name * Last Name * Phone Number Organization Name Role * Academic/researcher Attorney - defense Attorney - prosecutor Attorney - public defender/indigent defense Government official - legislator Government official - other Journalist Other Subscribe for updates * indicates required Email Address * First Name * Last Name * Phone Number Organization Name Role * Academic/researcher Attorney - defense Attorney - prosecutor Attorney - public defender/indigent defense Government official - legislator Government official - other Journalist Other Subscribe for updates * indicates required Email Address * First Name * Last Name * Phone Number Organization Name Role * Academic/researcher Attorney - defense Attorney - prosecutor Attorney - public defender/indigent defense Government official - legislator Government official - other Journalist Other * indicates required Email Address * First Name * Last Name * Phone Number Organization Name Role * Academic/researcher Attorney - defense Attorney - prosecutor Attorney - public defender/indigent defense Government official - legislator Government official - other Journalist Other * indicates required Email Address * First Name * Last Name * Phone Number Organization Name Role * Academic/researcher Attorney - defense Attorney - prosecutor Attorney - public defender/indigent defense Government official - legislator Government official - other Journalist Other Privacy Policy & Terms of Use © 2024 American Equity & Justice Group. All rights reserved. Equity Dashboard Story Team Take Action Donate Subscribe Privacy Policy & Terms of Use © 2024 American Equity & Justice Group. All rights reserved. Equity Dashboard Story Team Take Action Donate Subscribe Privacy Policy & Terms of Use © 2024 American Equity & Justice Group. All rights reserved. Privacy Policy & Terms of Use © 2024 American Equity & Justice Group. All rights reserved. Equity Dashboard Story Team Take Action Donate Subscribe Equity Dashboard Story Team Take Action Donate Subscribe -4358,"https://communitycrimemap.com/?address=snohomishcounty,wa&zoom=11",Crime Maps & Reports,Agency-Published Resources,LexisNexis® Community Crime Map,"",200,LexisNexis® Community Crime Map,[],[],[],[],[],[],"" -4359,https://www.cityofalliance.net/directory.aspx?did=6,Personnel Records,Info About Officers,Staff Directory • Police Department,"",200,"Alliance, NE - Official Website | Official Website","[""Police Department""]",[],"[""Live Edit"", ""Online Payments"", ""Quick Links"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search Departments Your Government Doing Business Living In I Want To Home Staff Directory Police Department Physical Address: 512 Niobrara Alliance, NE 69301 Mailing Address: P.O. Box D Alliance, NE 69301 Phone: (308) 762-4955 Emergency Phone: 911 Email the Police Department Crime Stoppers: Phone: (308) 762-3181 Hours 24 hours a day 7 days a week Staff Name Title Email Phone Additional Phone Felker, Kirk Police Lieutenant 308-762-4955 Grumbles, James Police Sergeant Peterson, Tim Police Sergeant Campbell, Dani Police Officer Norris, Josh Police Officer Sherlock, Tyler Police Officer 308-762-4955 Gomez, Michael Police Officer Smith, Brandt Police Officer Dahlberg, Parker Police Officer Trainee McCracken, Kirsten Public Safety Dispatch Supervisor Bonds, Elizabeth Public Safety Dispatcher Gerth, Hannah Public Safety Dispatcher 308-762-4955 Kaye, Jessica Public Safety Dispatcher Loper, Christine Public Safety Dispatcher Miller, Brittany Public Safety Dispatcher Shakes, Leigh Public Safety Dispatcher Ravert, Toni Animal Control/Community Service Officer 308-762-4955 Return to Staff Directory Live Edit Community Involvement City Council Agendas and Minutes Information Center New to Town Archives Calendar Document Center Facilities FAQs Quick Links Staff Directory Social Media Policy Job Opportunities Municipal Code News Flash Website Disclaimer Press Releases Municipal Codes / Ordinances Utility Online Payments Job opportunities Press Releases Current bid opportunities Visit alliance Online Payments 324 Laramie Avenue, P.O. Box D Alliance, Nebraska Phone: 308-762-5400 Fax: 308-762-7848 More contact info > Quick Links City Council Municipal Code Wind Chill Chart Airport Bid Opportunities New to Town /QuickLinks.aspx Site Links Home Website Policies Contact Us Site Map Terms & Conditions /QuickLinks.aspx Government Websites by CivicPlus® " -4360,https://app.powerbi.com/view?r=eyJrIjoiYTBiMTkwNDAtMjIwNy00MGE4LThmMDktNWJiMjdlOTAwNGRjIiwidCI6IjgxMGUyYjFkLWIxZGQtNDg1Ni04MzAzLWMwMTY1MDBhNWNmYSJ9,List of Data Sources,Info About Agencies,Microsoft Power BI,"",200,Error retrieving title: dictionary changed size during iteration,[],[],[],[],[],[],"" -4362,https://public.powerdms.com/a2gov/tree,Policies & Contracts,Info About Agencies,Public Documents Directory - undefined - PowerDMS,"",200,PowerDMS,[],[],[],[],[],[],Powered by Powered by Powered by Powered by Powered by -4363,https://www.a2gov.org/departments/police/Pages/Careers.aspx,Training & Hiring Info,Info About Officers,Careers,"",200," - - The City of Ann Arbor - -","[""Careers""]","[""""]","[""​Start a ​​career with the Ann Arbor Police"", ""(NEW) Stu​​dent Inter​nship Program"", ""Sign ​​up for hiring ​​alerts"", ""Hiring pr​​​​ocess a​nd ti​​m​eline"", ""​​​​​Res​ou​rc​​​​es""]","[""Connect with Us""]",[],[],Help Sign in Help Sign in Help Sign in Help Sign in Help Sign in Help Help Sign in Follow Follow Follow Follow Follow Follow Follow Follow -4364,https://www.a2gov.org/departments/police/units/Pages/Training.aspx,Training & Hiring Info,Info About Officers,Training,"",200," - - The City of Ann Arbor - -","[""Training""]","[""New Hire Polic​​e Officer Training"", ""Beyond New​ Hire Training""]","[""Visit the Careers Page​​""]","[""Connect with Us""]",[],[],Help Sign in Help Sign in Help Sign in Help Sign in Help Sign in Help Help Sign in Follow Follow Follow Follow Follow Follow Follow Follow -4365,https://www.crimemapping.com/map/mi/annarbor,Crime Maps & Reports,Agency-Published Resources,CrimeMapping.com - Helping You Build a Safer Community,"",200,CrimeMapping.com - Helping You Build a Safer Community,"[""My Map Summary"", ""What"", ""Where"", ""When"", ""Display Options"", ""Location Selection"", ""Choose a Search Distance"", ""Timeframe Settings"", ""From:"", ""To:""]",[],[],[],[],[],"Preparing Map Content... Preparing Map Content... Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select San Diego Unified Port District, SanGIS, Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Receive Alerts Receive Alerts Go 0 Records Date Range: 3-18-2024 to 3-24-2024 (7 Days) Max record count of 500 reached. Zoom in or adjust filter. Help Zoom in to view records. Help No data provided for this map extent. Why? Help No records found when using the current filter. Help There are missing records. Help | Remove Filter Help Sex Offender Data Available for this Area. | Display or Dismiss Help FILTERS Print Distance: Miles select Streets select San Diego Unified Port District, SanGIS, Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Distance: Miles select Distance: Miles select Streets select San Diego Unified Port District, SanGIS, Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to San Diego Unified Port District, SanGIS, Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to San Diego Unified Port District, SanGIS, Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, NGA, USGS | Zoom to Zoom to Zoom to Zoom to Zoom to Fetching Data. x Close Fetching Data. Fetching Data. Fetching Data. x Close Share This Map My Map Summary The sum of the What, Where, When you’ve chosen. What * Data not provided by agency within map extent Where Broward County Police Boundary Agency Filter: Agency Name Here When Previous 7 Days Friday, May 1 - Friday, May 8 Restore Defaults Display Options What type(s) of records would you like to see? Select All | Deselect All Arson Assault Burglary Disturbing the Peace Drugs / Alcohol Violations DUI Fraud Homicide Motor Vehicle Theft Robbery Sex Crimes Theft / Larceny Vandalism Vehicle Break-In / Theft Weapons Sex Offender Sexual Predator * Data not provided by agency within map extent Location Selection Enter an Address, Feature or Location. Choose a Search Distance 500 feet 1000 feet 1500 feet 1/4 mile 1/2 mile 1 mile 2 miles Apply Remove Location Filter Timeframe Settings From how far back would you like to see records? **Note** This will not apply to Sex Offender data. Yesterday Previous 3 Days Previous Week Previous 4 Weeks Custom Time Range From: select Monday, March 18, 2024 To: select Sunday, March 24, 2024 Apply " -4366,https://beaconny.gov/wp-content/uploads/2019/09/Beacon_Police_Presentation.pptx,Annual & Monthly Reports,Info About Agencies,"","",200,403 Forbidden,[],[],[],[],[],[],"" -4367,https://beaconny.gov/wp-content/uploads/2019/09/Beacon-PD-Policy.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -4368,https://beaconny.gov/wp-content/uploads/2021/03/City-of-Beacon-Police-Reform-and-Modernization-Collaborative-Plan-Adopted.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -4369,https://www.dutchessny.gov/County-Government/Police-Reform-and-Modernization-Collaborative.htm,Policies & Contracts,Info About Agencies,Police Reform and Modernization Collaborative,"",200,Dutchess County Government,"[""Police Reform and Modernization Collaborative""]","[""Information, Updates and Events"", ""Plan for Reform Report"", ""Police Reform and Modernization Collaborative Workgroups"", ""Community Forums"", ""Meeting Summaries"", ""Executive Orders Regarding Police Reform"", ""News Releases"", ""Police Reform and Modernization Public Comment Form"", ""Frequently Asked Questions"", ""Additional Resources"", """"]","[""Municipal Information"", ""Related Information"", ""Elementary & Secondary Education"", ""Higher Education"", ""Adult Education"", ""Other Educational Resources & Information"", ""Business"", ""Community"", ""Tourism"", ""Arts & Leisure"", ""Contact""]",[],[],[],Skip to main content Language & Accessibility Options Select Language Accessibility Toggle navigation Menu Home Government All Departments Bidding & RFP Opportunities Calendar Charter & Code of Ethics County Clerk County Comptroller County Executive County Legislature County On-line Services County/Non-County Services DutchessDelivery Service Elected Officials Emergency Services Employment Opportunities Employee Resources Fees & Fee Schedules GIS in Dutchess County Help Center News/Press Releases Online Forms Public Outreach Shared Services Sheriff's Office Transparency in County Government Municipalities Municipal Information Municipal Assessors Municipal Historians Municipal Tax Collectors Municipal Contact & Court Info School Tax Collection Related Information Census Data Demographic Information Responsibilities of Municipal Boards Town Mandated Private Well Testing Education Elementary & Secondary Education Education Overview Private and Parochial Schools School Districts in Dutchess County Higher Education Colleges Adult Education Dutchess BOCES Adult Education Dutchess Community College Adult Education Marist College Adult Education Other Educational Resources & Information Distance Learning Dutchess BOCES New York State Education Department NYS Office of Curriculum and Instruction School Tax Collectors by District Business & Community Business Agriculture Bidding & RFP Opportunities Business Groups & Chambers of Commerce Business Resources Dutchess County EDC Economic Development Community All Hazards Information Community Service Agencies Emergency Services Environment/Land Preservation Food Pantry and Meal Resources Health Care & Hospitals Housing Libraries Making Your Move Easier Mid-Hudson Multiple Listing Service Senior Citizen Services Telephone/Cellular Companies Utility & Cable Companies Victims' Resources and Services Volunteer Opportunities in Dutchess County Youth Services Culture Tourism Dining and Lodging Dutchess County Fair Dutchess County Tourism Historic Sites & Museums Hudson River Heritage History of Dutchess County Arts & Leisure Parks & Trails County Parks (Non) County Parks & Gardens Culture & Performing Arts Farm Markets Genealogy Golf Courses Hiking Hudson Valley Renegades MJN Center Poet Laureate Tours and Trails Type a search term to search the site Go Skip to main content Language & Accessibility Options Select Language Accessibility Toggle navigation Menu Language & Accessibility Options Select Language Accessibility Language & Accessibility Options Select Language Accessibility -4370,https://beaconny.gov/index.php/departments/police/how-it-works-police-calls-for-service/,Policies & Contracts,Info About Agencies,How it Works: Police Calls for Service — City of Beacon,"",200,403 Forbidden,"[""How it Works: Police Calls for Service""]",[],[],"[""CONTACT US"", ""STAY CONNECTED"", ""Latest News""]",[],[],"­ Government Departments Forms & Permits Agendas & Minutes News Current News Press Room Pay Bills Employment Visiting Beacon Government Departments Forms & Permits Agendas & Minutes News Current News Press Room Pay Bills Employment Visiting Beacon Request for Service The Official Website of the City of Beacon, NY Government Departments Forms & Permits Agendas & Minutes News Current News Press Room Pay Bills Employment Visiting Beacon How it Works: Police Calls for Service Home Departments Police How it Works: Police Calls for Service Calls for service can come in to the City of Beacon Police Department through our main telephone line, (845) 831-4111, through Dutchess County 911, or in person. Each call we receive that requires a police response is voice recorded and a blotter entry is made in our Department’s electronic record management system. The blotters note the information of the caller (should that be given), the location and type of call for service, the officers assigned and when they were dispatched, arrived and departed, and a brief description of what happened and what the officer(s) did. When a call for service involves a crime, an auto accident or a domestic incident, or is a more serious incident, various standardized New York State reports will be completed. When a crime is alleged, the Department member responding will conduct a thorough investigation to determine if reasonable cause exists to believe that an offense occurred and if a suspect can be identified. If there is probable cause to believe that the suspect committed the offense and the suspect is still on the scene or can quickly be located, the suspect might be arrested at that time. Should the suspect be gone from the scene and cannot be quickly located, an arrest may later be made based on the complaint or an arrest warrant might be sought. Felony offenses and some misdemeanor offenses, particularly those that require a more prolonged or extensive investigation or crime scene evidence to be collected, are turned over to the Detective Bureau for investigation. If a suspect cannot be identified, the case will remain open and any leads which are discovered will be followed. If the call is one of the many that we respond to that does not involve a crime, the Officers will do what they can to resolve the situation and assist those involved. This often involves mediating the situation between the parties, taking reports or assisting someone with getting medical or mental health services. CONTACT US 1 Municipal Plaza 845-838-5000 845-838-5012 cityofbeacon@beaconny.gov Monday-Friday 8AM-4PM Payments accepted until 3:30PM Sitemap STAY CONNECTED Latest News 2024 Earth Day Clean-Up and Celebration Tree Purchasing Program Pilot Dutchess County Transit Bus Route Outreach Meeting City of Beacon Community Solar Program The 2024 Community Investment Program is Now Open! Tax Bills " -4371,https://beaconny.gov/index.php/departments/police/how-it-works-complaints-about-police/,Policies & Contracts,Info About Agencies,How it Works: Complaints about Police — City of Beacon,"",200,403 Forbidden,"[""How it Works: Complaints about Police""]",[],[],"[""CONTACT US"", ""STAY CONNECTED"", ""Latest News""]",[],[],"­ Government Departments Forms & Permits Agendas & Minutes News Current News Press Room Pay Bills Employment Visiting Beacon Government Departments Forms & Permits Agendas & Minutes News Current News Press Room Pay Bills Employment Visiting Beacon Request for Service The Official Website of the City of Beacon, NY Government Departments Forms & Permits Agendas & Minutes News Current News Press Room Pay Bills Employment Visiting Beacon How it Works: Complaints about Police Home Departments Police How it Works: Complaints about Police The Beacon Police Department can receive personnel complaints through a number of sources. Formal complaints can be filed using the Department’s Civilian Complaint Form which can be returned directly to the Department or turned in to the City of Beacon Human Relations Commission. Additionally, complaints may be made directly in person, or by telephone to police headquarters. Sometimes they are forwarded through third parties such as City Councilmembers or the City Administration. Anytime the Department’s command staff is made aware of anything that may be construed as a personnel complaint, from any source, it is treated as a personnel complaint. Often times people come to police headquarters or call the Department after an interaction with an Officer to seek an explanation of the interaction or of the Officer’s actions. These types of complaints are usually resolved with such an explanation but if the person is still unsatisfied or does not accept the explanation, they would also be handled as personnel complaints. Once a personnel complaint is received it will be investigated by a member of the command staff in the same manner that any other police investigation would be conducted and a case report will be completed. All available means of collecting evidence such as interviews with the complainant and officer involved, body cameras, in-car cameras, station and other surveillance cameras, etc. will be utilized when possible. If the investigation indicates that the Officer did nothing wrong, the Officer will be exonerated. If there is insufficient evidence to substantiate the complaint, it will be considered unsubstantiated. If there is evidence substantiating the complaint and the Officer is determined to have violated policy or procedure, the case will be turned over to the Chief of Police to make a determination as to what, if any, discipline is appropriate. This can range from verbal counseling to dismissal. In any case, the complainant will be contacted and told of the results of the investigation. CONTACT US 1 Municipal Plaza 845-838-5000 845-838-5012 cityofbeacon@beaconny.gov Monday-Friday 8AM-4PM Payments accepted until 3:30PM Sitemap STAY CONNECTED Latest News 2024 Earth Day Clean-Up and Celebration Tree Purchasing Program Pilot Dutchess County Transit Bus Route Outreach Meeting City of Beacon Community Solar Program The 2024 Community Investment Program is Now Open! Tax Bills " -4372,https://beaconny.gov/wp-content/uploads/2022/10/Organization-Chart-PDF-101322.pdf,Personnel Records,Info About Officers,"","",200,"","","","","","","","" -4373,https://beaconny.gov/wp-content/uploads/2021/04/Resolution-Announcing-City-Councils-Action-Plan-for-Evaluation-and-Rethinking-of-Community-Public-Safety-Services-Executed-Copy.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -4374,https://data.birminghamal.gov/dataset/detail-of-departmental-expense-budget-by-organization-report,Annual & Monthly Reports,Info About Agencies,Detail of Departmental Expense Budget by Organization Report - Dataset - City of Birmingham,"",200,Welcome - City of Birmingham,"[""Detail of Departmental Expense Budget by Organization Report"", ""Birmingham Finance Department"", ""Detail of Departmental Expense Budget by Organization Report""]","[""Organization"", ""Social"", ""License"", ""Data and Resources""]","[""Additional Info""]",[],[],[],Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Search Datasets -4375,https://data.birminghamal.gov/dataset/annual-operating-budgets,Annual & Monthly Reports,Info About Agencies,Annual Operating Budgets - Dataset - City of Birmingham,"",200,Welcome - City of Birmingham,"[""Annual Operating Budgets"", ""Birmingham Finance Department"", ""Annual Operating Budgets""]","[""Organization"", ""Social"", ""License"", ""Data and Resources""]","[""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Search Datasets Home Organizations Birmingham Finance Department Annual Operating Budgets Annual Operating Budgets Followers 1 Organization Birmingham Finance Department There is no description for this organization Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Annual Operating Budgets Annual Operating Budgets Data and Resources FY23 OFFICIAL OPERATING BUDGET - FINAL PDF Popular FY23 OFFICIAL OPERATING BUDGET - FINAL Explore Preview Download FY22 Official Operating Budget PDF Popular Annual Operating Budget Explore Preview Download FY21 OFFICIAL OPERATING BUDGET - FINAL PDF Popular FY21 OFFICIAL OPERATING BUDGET - FINAL Explore Preview Download FY2020 OFFICIAL OPERATING BUDGET PDF Popular Explore Preview Download 2019 Final PDF Popular Explore Preview Download 2019 PDF Popular 2019 Explore Preview Download 2019 Budget at a Glance PDF Popular Finance - 2019 Operating Budget Explore Preview Download 2018 PDF Popular 2018 Annual Operating Budget Explore Preview Download 2017 PDF Popular 2017 Explore Preview Download 2016 PDF Popular 2016 Explore Preview Download 2015 PDF Popular 2015 Explore Preview Download Finance Additional Info Field Value Author Thomas Barnett Maintainer Thomas Barnett Version 1.0 Last Updated November 2, 2023, 11:16 AM (UTC-04:00) Created June 8, 2017, 3:40 PM (UTC-04:00) Home Organizations Birmingham Finance Department Annual Operating Budgets Annual Operating Budgets Followers 1 Organization Birmingham Finance Department There is no description for this organization Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Annual Operating Budgets Annual Operating Budgets Data and Resources FY23 OFFICIAL OPERATING BUDGET - FINAL PDF Popular FY23 OFFICIAL OPERATING BUDGET - FINAL Explore Preview Download FY22 Official Operating Budget PDF Popular Annual Operating Budget Explore Preview Download FY21 OFFICIAL OPERATING BUDGET - FINAL PDF Popular FY21 OFFICIAL OPERATING BUDGET - FINAL Explore Preview Download FY2020 OFFICIAL OPERATING BUDGET PDF Popular Explore Preview Download 2019 Final PDF Popular Explore Preview Download 2019 PDF Popular 2019 Explore Preview Download 2019 Budget at a Glance PDF Popular Finance - 2019 Operating Budget Explore Preview Download 2018 PDF Popular 2018 Annual Operating Budget Explore Preview Download 2017 PDF Popular 2017 Explore Preview Download 2016 PDF Popular 2016 Explore Preview Download 2015 PDF Popular 2015 Explore Preview Download Finance Additional Info Field Value Author Thomas Barnett Maintainer Thomas Barnett Version 1.0 Last Updated November 2, 2023, 11:16 AM (UTC-04:00) Created June 8, 2017, 3:40 PM (UTC-04:00) Home Organizations Birmingham Finance Department Annual Operating Budgets " -4376,https://data.birminghamal.gov/dataset/homicide-data-annual-birmingham,Crime Maps & Reports,Agency-Published Resources,Homicide Data - Annual Birmingham - Dataset - City of Birmingham,"",200,Welcome - City of Birmingham,"[""Homicide Data - Annual Birmingham"", ""Birmingham Police Department"", ""Homicide Data - Annual Birmingham""]","[""Organization"", ""Social"", ""License"", ""Data and Resources""]","[""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Search Datasets Home Organizations Birmingham Police Department Homicide Data - Annual Birmingham Homicide Data - Annual Birmingham Followers 1 Organization Birmingham Police Department There is no description for this organization Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Homicide Data - Annual Birmingham Police - Homicide Data Birmingham -Contains: Case #, Victim Name, Sex, Race and Age. Location of Homicide and Zip code. Status of Case -Terms: HOM - Homicide; CBA - Cleared by Arrest; Open - Case not Solved; Justified - Killing Justified (i.e., Self Defense) Data and Resources Homicide Data Birmingham - 2019 Year-To-Date XLSX Popular Police - Homicide Data Birmingham -Contains: Case #, Victim Name, Sex, Race... Explore Preview Download Homicide Data Birmingham - 2018 XLSX Popular Police - Homicide Data Birmingham -Contains: Case #, Victim Name, Sex, Race... Explore Preview Download Homicide Data Birmingham - 2017 XLSX Popular Police - Homicide Data Birmingham -Contains: Case #, Victim Name, Sex, Race... Explore Preview Download Homicide Data Birmingham - 2016 XLSX Popular Police - Homicide Data Birmingham -Contains: Case #, Victim Name, Sex, Race... Explore Preview Download Homicide Data Birmingham - 2015 XLSX Popular Police - Homicide Data Birmingham -Contains: Case #, Victim Name, Sex, Race... Explore Preview Download Homicide Data Birmingham - 2014 XLSX Popular Police - Homicide Data Birmingham -Contains: Case #, Victim Name, Sex, Race... Explore Preview Download Homicide Data Birmingham - 2013 XLSX Popular Police - Homicide Data Birmingham -Contains: Case #, Victim Name, Sex, Race... Explore Preview Download Homicide Data Birmingham - 2012 XLSX Popular Police - Homicide Data Birmingham -Contains: Case #, Victim Name, Sex, Race... Explore Preview Download Homicide Data Birmingham - 2011 XLSX Popular Police - Homicide Data Birmingham -Contains: Case #, Victim Name, Sex, Race... Explore Preview Download Homicide Data Birmingham - 2010 XLSX Popular Police - Homicide Data Birmingham -Contains: Case #, Victim Name, Sex, Race... Explore Preview Download Homicide Data Birmingham - 2009 XLSX Popular Police - Homicide Data Birmingham -Contains: Case #, Victim Name, Sex, Race... Explore Preview Download Homicide Data Birmingham - 2008 XLSX Popular Police - Homicide Data Birmingham -Contains: Case #, Victim Name, Sex, Race... Explore Preview Download Homicide Data Birmingham - 2007 PDF Popular Police - Homicide Data Birmingham -Contains: Case #, Victim Name, Sex, Race... Explore Preview Download Crime Crimes Domicide Data Homicide Homicides Murder Murders Police Police Data Additional Info Field Value Author Scott R. Thurmond Maintainer Scott R. Thurmond Version 1.0 Last Updated October 23, 2019, 3:04 PM (UTC-04:00) Created March 28, 2018, 4:17 PM (UTC-04:00) " -4377,https://data.birminghamal.gov/dataset/law-department-public-records-request-form,Records Request Info,Agency-Published Resources,Law Department - Public Records Request Form - Dataset - City of Birmingham,"",200,Welcome - City of Birmingham,"[""Law Department - Public Records Request Form"", ""Birmingham Law Department"", ""Law Department - Public Records Request Form""]","[""Organization"", ""Social"", ""License"", ""Data and Resources""]","[""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Search Datasets Home Organizations Birmingham Law Department Law Department - Public Records Request Form Law Department - Public Records Request Form Followers 0 Organization Birmingham Law Department There is no description for this organization Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Law Department - Public Records Request Form Law Department - Public Records Request Form Data and Resources Law Department - Public Records Request Form PDF Popular Law Department - Public Records Request Form -Please submit this form to:... Explore Preview Download Law Department Legal Department Public Records Requ... Additional Info Field Value Author Tracy Roberts Maintainer Tracy Roberts Version 1.0 Last Updated April 16, 2018, 4:47 PM (UTC-04:00) Created April 25, 2017, 7:19 PM (UTC-04:00) Home Organizations Birmingham Law Department Law Department - Public Records Request Form Law Department - Public Records Request Form Followers 0 Organization Birmingham Law Department There is no description for this organization Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Law Department - Public Records Request Form Law Department - Public Records Request Form Data and Resources Law Department - Public Records Request Form PDF Popular Law Department - Public Records Request Form -Please submit this form to:... Explore Preview Download Law Department Legal Department Public Records Requ... Additional Info Field Value Author Tracy Roberts Maintainer Tracy Roberts Version 1.0 Last Updated April 16, 2018, 4:47 PM (UTC-04:00) Created April 25, 2017, 7:19 PM (UTC-04:00) Home Organizations Birmingham Law Department Law Department - Public Records Request Form Law Department - Public Records Request Form Followers 0 Organization Birmingham Law Department There is no description for this organization Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Law Department - Public Records Request Form Law Department - Public Records Request Form Data and Resources Law Department - Public Records Request Form PDF Popular Law Department - Public Records Request Form -Please submit this form to:... Explore Preview Download Law Department Legal Department Public Records Requ... Additional Info Field Value Author Tracy Roberts Maintainer Tracy Roberts Version 1.0 Last Updated April 16, 2018, 4:47 PM (UTC-04:00) Created April 25, 2017, 7:19 PM (UTC-04:00) Law Department - Public Records Request Form Followers 0 Law Department - Public Records Request Form Followers 0 Followers 0 Organization Birmingham Law Department There is no description for this organization " -4378,https://data.birminghamal.gov/dataset/schedule-of-fines-and-fees-for-traffic-violations-equipment-offenses,Policies & Contracts,Info About Agencies,Fines and Fees for Traffic Violations - Dataset - City of Birmingham,"",200,Welcome - City of Birmingham,"[""Fines and Fees for Traffic Violations"", ""Birmingham Municipal Courts"", ""Fines and Fees for Traffic Violations""]","[""Organization"", ""Social"", ""License"", ""Data and Resources""]","[""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Search Datasets Home Organizations Birmingham Municipal Courts Fines and Fees for Traffic Violations Fines and Fees for Traffic Violations Followers 1 Organization Birmingham Municipal Courts There is no description for this organization Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream Fines and Fees for Traffic Violations Municipal Courts - Schedule of fines and fees for Traffic Violations Data and Resources Fines and Fees Traffic Violations - Equipment Offenses XLSX Municipal Courts - Schedule of fines and fees for Traffic Violations -... Explore Preview Download Fines and Fees - General Violations XLSX Municipal Courts - Schedule of Fines and Fees - - General Violations Explore Preview Download Fines and fees - Moving Offenses XLSX Municipal Courts - Schedule of fines and fees - Moving Offenses Explore Preview Download Fines and fees Traffic Violations - Equipment Offenses CSV Municipal Courts - Schedule of fines and fees Traffic Violations - Equipment... Explore Preview Download Fines and fees Traffic Violations - General... CSV Municipal Courts - Fines and fees Traffic Violations - General Violations Explore Preview Download Fines and fees Traffic Violations - Moving Offenses CSV CSV Municipal Courts - Fines and fees Traffic Violations - Moving Offenses Explore Preview Download Equipment Offenses Fines and Fees Traffice Violation ... Additional Info Field Value Author Lashondrea S. Farris Maintainer Lashondrea S. Farris Version 1.0 Last Updated November 20, 2017, 2:04 PM (UTC-05:00) Created June 5, 2017, 4:57 PM (UTC-04:00) " -4379,https://data.birminghamal.gov/dataset/south-precinct-crime-data,Crime Maps & Reports,Agency-Published Resources,South Precinct Crime Data - Dataset - City of Birmingham,"",200,Welcome - City of Birmingham,"[""South Precinct Crime Data"", ""Birmingham Police Department"", ""South Precinct Crime Data""]","[""Organization"", ""Social"", ""License"", ""Data and Resources""]","[""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Search Datasets Home Organizations Birmingham Police Department South Precinct Crime Data South Precinct Crime Data Followers 0 Organization Birmingham Police Department There is no description for this organization Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream South Precinct Crime Data Police - South Precinct Crime Data YTD Data and Resources South Precinct Crime Data 2019 YTD XLSX Popular South Precinct Crime Data Sep 30 2019 YTD Explore Preview Download South Precinct Crime Data 2018 XLSX Popular Police - South Precinct Crime Data - January 1 - Dec 31, 2018 Explore Preview Download South Precinct Crime Data 2018 CSV CSV Popular Police - South Precinct Crime Data CSV - January 1 - Dec 31, 2018 CSV Explore Preview Download South Precinct Crime Data 2017 XLSX Popular Police - South Precinct Crime Data - January 1 - December 31, 2017 YTD Explore Preview Download South Precinct Crime Data 2017 CSV CSV Popular Police - South Precinct Crime Data - January 1 - December 31, 2017 YTD Explore Preview Download South Precinct Crime Data 2019 CSV Crime Data - South Explore Preview Download South Precinct Crime Data 2020 CSV Crime Data - South Explore Preview Download South Precinct Crime Data 2021 CSV Crime Data - South Explore Preview Download South Precinct Crime Data 2022 CSV Popular Crime Data - South Explore Preview Download South Precinct Crime Data 2019 XLSX Crime Data - South Explore Preview Download South Precinct Crime Data 2020 XLSX Crime Data - South Explore Preview Download South Precinct Crime Data 2021 XLSX Crime Data - South Explore Preview Download South Precinct Crime Data 2022 XLSX Crime Data - South Explore Preview Download South Precinct Crime Data 2023 XLSX South Precinct Crime Data as of December 2023 Explore Preview Download South Precinct Crime Data 2023 CSV South Precinct Crime Data as of December 2023 Explore Preview Download Crime Police South Precinct Additional Info Field Value Author David Allen Maintainer David Allen Version 1.0 Last Updated February 20, 2024, 12:03 PM (UTC-05:00) Created June 5, 2017, 10:38 AM (UTC-04:00) " -4380,https://data.birminghamal.gov/dataset/east-precinct-crime-data,Crime Maps & Reports,Agency-Published Resources,East Precinct Crime Data - Dataset - City of Birmingham,"",200,Welcome - City of Birmingham,"[""East Precinct Crime Data"", ""Birmingham Police Department"", ""East Precinct Crime Data""]","[""Organization"", ""Social"", ""License"", ""Data and Resources""]","[""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Search Datasets Home Organizations Birmingham Police Department East Precinct Crime Data East Precinct Crime Data Followers 1 Organization Birmingham Police Department There is no description for this organization Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream East Precinct Crime Data Police - East Precinct Crime Data YTD Data and Resources East Precinct Crime Data 2019 YTD XLSX Popular West Precinct Crime Data through Sep 30 2019 YTD Explore Preview Download East Precinct Crime Data 2018 XLSX Popular Police - East Precinct Crime Data - January 1 - Dec 31, 2018 Explore Preview Download East Precinct Crime Data - 2018 CSV CSV Popular Police - East Precinct Crime Data CSV - January 1 - Dec 31, 2018 Explore Preview Download East Precinct Crime Data 2017 XLSX Popular Police - East Precinct Crime Data - January 1 - December 31, 2017 YTD Explore Preview Download East Precinct Crime Data 2017 CSV CSV Popular Police - East Precinct Crime Data - January 1 - December 31, 2017 YTD Explore Preview Download East Precinct Crime Data 2021 CSV Crime Data - East Explore Preview Download East Precinct Crime Data 2022 CSV Crime Data - East Explore Preview Download East Precinct Crime Data 2019 XLSX Crime Data - East Explore Preview Download East Precinct Crime Data 2020 XLSX Crime Data - East Explore Preview Download East Precinct Crime Data 2021 XLSX Crime Data - East Explore Preview Download East Precinct Crime Data 2022 XLSX Crime Data - East Explore Preview Download East Precinct Crime Data 2023 XLSX East Precinct Crime Data as of December 2023 Explore Preview Download East Precinct Crime Data 2019 CSV East Precinct Crime Data as of November 2019 Explore Preview Download East Precinct Crime Data 2020 CSV East Precinct Crime Data as of December 2020 Explore Preview Download East Precinct Crime Data 2023 CSV East Precinct Crime Data as of December 2023 Explore Preview Download Crime East Precinct Police Additional Info Field Value Author David Allen Maintainer David Allen Version 1.0 Last Updated February 20, 2024, 12:03 PM (UTC-05:00) Created June 5, 2017, 11:04 AM (UTC-04:00) " -4381,https://data.birminghamal.gov/dataset/north-precinct-crime-data,Crime Maps & Reports,Agency-Published Resources,North Precinct Crime Data - Dataset - City of Birmingham,"",200,Welcome - City of Birmingham,"[""North Precinct Crime Data"", ""Birmingham Police Department"", ""North Precinct Crime Data""]","[""Organization"", ""Social"", ""License"", ""Data and Resources""]","[""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Search Datasets Home Organizations Birmingham Police Department North Precinct Crime Data North Precinct Crime Data Followers 0 Organization Birmingham Police Department There is no description for this organization Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream North Precinct Crime Data Police - North Precinct Crime Data YTD Data and Resources North Precinct Crime Data 2019 YTD XLSX Popular North Precinct Crime Data Sep 30 2019 YTD Explore Preview Download North Precinct Crime Data 2018 XLSX Popular Police - North Precinct Crime Data - January 1 - Dec 31, 2018 Explore Preview Download North Precinct Crime Data 2018 CSV CSV Popular Police - North Precinct Crime Data CSV - January 1 - Dec 31, 2018 Explore Preview Download North Precinct Crime Data 2017 XLSX Popular Police - North Precinct Crime Data - January 1 - December 31, 2017 YTD Explore Preview Download North Precinct Crime Data 2017 CSV CSV Popular Police - North Precinct Crime Data - January 1 - December 31, 2017 YTD Explore Preview Download North Precinct Crime Data 2019 CSV Crime Data - North Explore Preview Download North Precinct Crime Data 2020 CSV Crime Data - North Explore Preview Download North Precinct Crime Data 2021 CSV Crime Data - North Explore Preview Download North Precinct Crime Data 2022 CSV Crime Data - North Explore Preview Download North Precinct Crime Data 2022 CSV Crime Data - North Explore Preview Download North Precinct Crime Data 2019 XLSX Crime Data - North Explore Preview Download North Precinct Crime Data 2020 XLSX Crime Data - North Explore Preview Download North Precinct Crime Data 2021 XLSX Crime Data - North Explore Preview Download North Precinct Crime Data 2022 XLSX Crime Data - North Explore Preview Download North Precinct Crime Data 2023 XLSX North Precinct Crime Data as of December 2023 Explore Preview Download North Precinct Crime Data 2023 CSV North Precinct Crime Data as of December 2023 Explore Preview Download Crime North Precinct Police Additional Info Field Value Author David Allen Maintainer David Allen Version 1.0 Last Updated February 20, 2024, 12:03 PM (UTC-05:00) Created June 5, 2017, 10:10 AM (UTC-04:00) " -4382,https://data.birminghamal.gov/dataset/west-precinct-crime-data,Crime Maps & Reports,Agency-Published Resources,West Precinct Crime Data - Dataset - City of Birmingham,"",200,Welcome - City of Birmingham,"[""West Precinct Crime Data"", ""Birmingham Police Department"", ""West Precinct Crime Data""]","[""Organization"", ""Social"", ""License"", ""Data and Resources""]","[""Additional Info""]",[],[],[],"Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Search Datasets Home Organizations Birmingham Police Department West Precinct Crime Data West Precinct Crime Data Followers 0 Organization Birmingham Police Department There is no description for this organization Social Twitter Facebook Linkedin License Creative Commons Attribution Dataset Groups Showcases Activity Stream West Precinct Crime Data Police - West Precinct Crime Data YTD Data and Resources West Precinct Crime Data 2019 YTD XLSX Popular Police - West Precinct Crime Data through Sep 30 2019 YTD Explore Preview Download West Precinct Crime Data 2018 XLSX Popular Police - West Precinct Crime Data - January 1 - Dec 31, 2018 Explore Preview Download West Precinct Crime Data 2018 CSV CSV Popular Police - West Precinct Crime Data - January 1 - Dec 31, 2018 Explore Preview Download West Precinct Crime Data 2017 XLSX Popular Police - West Precinct Crime Data - January 1 - December 31, 2017 YTD Explore Preview Download West Precinct Crime Data 2017 CSV CSV Popular Police - West Precinct Crime Data - January 1 - December 31, 2017 YTD Explore Preview Download West Precinct Crime Data 2019 CSV Crime Data - West Explore Preview Download West Precinct Crime Data 2020 CSV Crime Data - West Explore Preview Download West Precinct Crime Data 2021 CSV Crime Data - West Explore Preview Download West Precinct Crime Data 2022 CSV Popular Crime Data - West Explore Preview Download West Precinct Crime Data 2019 XLSX Crime Data - West Explore Preview Download West Precinct Crime Data 2020 XLSX Crime Data - West Explore Preview Download west Precinct Crime Data 2021 XLSX Crime Data - West Explore Preview Download West Precinct Crime Data 2022 XLSX Crime Data - West Explore Preview Download West Precinct Crime Data 2023 XLSX West Precinct Crime Data as of December 2023 Explore Preview Download West Precinct Crime Data 2023 CSV West Precinct Crime Data as of December 2023 Explore Preview Download 2017 Crime Police West Precinct Additional Info Field Value Author David Allen Maintainer David Allen Version 1.0 Last Updated February 20, 2024, 12:04 PM (UTC-05:00) Created June 5, 2017, 11:47 AM (UTC-04:00) " -4383,https://data.birminghamal.gov/dataset/municipal-courts,Court Cases,Jails & Courts Specific,Municipal Courts - Court Dockets and Citations - Dataset - City of Birmingham,"",200,Welcome - City of Birmingham,"[""Municipal Courts - Court Dockets and Citations"", ""Birmingham Municipal Courts"", ""Municipal Courts - Court Dockets and Citations""]","[""Organization"", ""Social"", ""License"", ""Data and Resources""]","[""Additional Info""]",[],[],[],Skip to content Log in Register Contact Log in Register Contact Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Toggle navigation Datasets Organizations Groups About Transparency Search Datasets Search Datasets -4384,http://birminghamjailsearch.birminghamal.gov/newworld.inmateinquiry/AL0010200,Incarceration Records,Jails & Courts Specific,"","",-1,"","","","","","","","" -4385,https://www.buffalony.gov/1315/Buffalo-Reform-Agenda,Policies & Contracts,Info About Agencies,"Buffalo Reform Agenda | Buffalo, NY","",200,"Buffalo, NY | Official Website","[""Buffalo Reform Agenda"", ""I. EXECUTIVE ORDERS"", ""III. BPD MANUAL OF PROCEDURES"", ""IV. FORMS""]","[""View the City of Buffalo's Police Reform and Reinvention Collaborative Report here"", ""Public Meetings"", ""Stop Receipt Form"", """", ""Equipment Violation \""Fix-it\"" Ticket"", """", ""Appearance Ticket"", """"]","["""", """", ""About Buffalo"", ""Government"", ""Doing Business in Buffalo"", ""About This Site"", ""Loading""]","[""II. RELATED NEWS""]",[],[],Skip to Main Content -4386,https://data.buffalony.gov/browse?Dataset-Information_Department=Buffalo+Police+Department,List of Data Sources,Info About Agencies,Results matching of Buffalo Police Department | Page 1 of 3 | OpenData Buffalo,"",200,Open Data Portal | OpenData Buffalo,"[""Categories"", ""Department"", ""Division"", ""Tags""]","[""Menu"", ""Department > Buffalo Police Department"", ""Sort"", ""Sort by Most Relevant"", ""Filter"", ""Authority"", ""Categories"", ""View Types"", ""Department"", ""Division"", ""Tags"", ""Federated Domains"", ""Crime Incidents"", ""CitiStat Buffalo: Buffalo Police Department"", ""Monthly Uniform Crime Reporting (UCR) Program Statistics"", ""Received Traffic Incident Calls"", ""Traffic Stop Receipts"", ""Heat map COMMUNITY CREATED"", ""Uniform Traffic Tickets"", ""Liquor and Crime COMMUNITY CREATED"", ""Police Districts"", ""BPD Cameras"", ""A-Z"", ""A-Z"", ""A-Z"", ""A-Z""]",[],[],[],[],Skip to main content Skip to footer links -4387,https://data.buffalony.gov/Public-Safety/Crime-Incidents/d6g9-xbgu/explore/query/SELECT%0A%20%20%60case_number%60%2C%0A%20%20%60incident_datetime%60%2C%0A%20%20%60incident_id%60%2C%0A%20%20%60incident_type_primary%60%2C%0A%20%20%60incident_description%60%2C%0A%20%20%60parent_incident_type%60%2C%0A%20%20%60hour_of_day%60%2C%0A%20%20%60day_of_week%60%2C%0A%20%20%60address_1%60%2C%0A%20%20%60city%60%2C%0A%20%20%60state%60%2C%0A%20%20%60location%60%2C%0A%20%20%60latitude%60%2C%0A%20%20%60longitude%60%2C%0A%20%20%60created_at%60%2C%0A%20%20%60updated_at%60%2C%0A%20%20%60census_tract_2010%60%2C%0A%20%20%60census_block_group_2010%60%2C%0A%20%20%60census_block_2010%60%2C%0A%20%20%60census_tract%60%2C%0A%20%20%60census_block%60%2C%0A%20%20%60census_block_group%60%2C%0A%20%20%60neighborhood_1%60%2C%0A%20%20%60police_district%60%2C%0A%20%20%60council_district%60%2C%0A%20%20%60tractce20%60%2C%0A%20%20%60geoid20_tract%60%2C%0A%20%20%60geoid20_blockgroup%60%2C%0A%20%20%60geoid20_block%60%2C%0A%20%20%60%3A%40computed_region_kwzn_pe6v%60%2C%0A%20%20%60%3A%40computed_region_eziv_p4ck%60%2C%0A%20%20%60%3A%40computed_region_uh5x_q5mi%60%2C%0A%20%20%60%3A%40computed_region_dwzh_dtk5%60%2C%0A%20%20%60%3A%40computed_region_xbxg_7ifr%60%2C%0A%20%20%60%3A%40computed_region_tmcg_v66k%60%2C%0A%20%20%60%3A%40computed_region_fk4y_hpmh%60%2C%0A%20%20%60%3A%40computed_region_ff6v_jbaa%60%2C%0A%20%20%60%3A%40computed_region_h7a8_iwt4%60%2C%0A%20%20%60%3A%40computed_region_vsen_jbmg%60%2C%0A%20%20%60%3A%40computed_region_em9m_yf6k%60%2C%0A%20%20%60%3A%40computed_region_esq4_fkew%60/page/filter,Crime Maps & Reports,Agency-Published Resources,Crime Incidents | OpenData Buffalo,"",200,Open Data Portal | OpenData Buffalo,[],"[""Menu""]",[],[],[],[],Skip to Main Content Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Menu Close Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Sign In Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers About Us About Us Mayor's Welcome Open Data Policy About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Close Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers -4388,https://data.buffalony.gov/Public-Safety/Monthly-Uniform-Crime-Reporting-UCR-Program-Statis/xxu9-yrhd/explore,Crime Maps & Reports,Agency-Published Resources,Monthly Uniform Crime Reporting (UCR) Program Statistics | OpenData Buffalo,"",200,Open Data Portal | OpenData Buffalo,[],"[""Menu""]",[],[],[],[],Skip to Main Content Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Menu Close Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Sign In Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers About Us About Us Mayor's Welcome Open Data Policy About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Close Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers -4389,https://data.buffalony.gov/Public-Safety/Received-Traffic-Incident-Calls/6at3-hpb5/explore,Calls for Service,Police & Public Interactions,Received Traffic Incident Calls | OpenData Buffalo,"",200,Open Data Portal | OpenData Buffalo,[],"[""Menu""]",[],[],[],[],Skip to Main Content Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Menu Close Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Sign In Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers About Us About Us Mayor's Welcome Open Data Policy About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Close Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers -4390,https://data.buffalony.gov/Public-Safety/BPD-Cameras/gpj7-v6rr/explore,Misc Police Activity,Police & Public Interactions,BPD Cameras | OpenData Buffalo,"",200,Open Data Portal | OpenData Buffalo,[],"[""Menu""]",[],[],[],[],Skip to Main Content Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Menu Close Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Sign In Sign In Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers About Us About Us Mayor's Welcome Open Data Policy About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Menu Close Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers Sign In Search Home About Us About Us Mayor's Welcome Open Data Policy Browse All Data City Data State Data Geospatial Data Additional Resources Visualize CitiStat Council Spotlight Neighborhood Profile StateStat My Neighborhood Buffalo Community Showcase Suggest a Dataset Help Socrata Support Frequently Asked Questions (FAQ) Video Tutorials For Developers -4391,https://www.dallasopendata.com/Public-Safety/Police-Person/chez-ydz4/explore,Field Contacts,Police & Public Interactions,Police Person | Dallas OpenData,"",200,Dallas OpenData | Dallas OpenData,[],"[""Menu""]",[],[],[],[],Skip to Main Content Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Search Search Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Sign In Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Select a column to filter... Use text Use a number Use a boolean -4392,https://www.dallasopendata.com/Public-Safety/Police-Involved-Vehicles/hd9z-g72a/explore,Field Contacts,Police & Public Interactions,Police Involved Vehicles | Dallas OpenData,"",200,Dallas OpenData | Dallas OpenData,[],"[""Menu""]",[],[],[],[],Skip to Main Content Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Search Search Search Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Menu Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Sign In Menu Close Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Home About Catalog Video Users Guide FAQs Open Data Policy Data Glossary Developers Story Archive Sign In Search Search Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Select a column to filter... Use text Use a number Use a boolean -4393,https://www.denvergov.org/Government/Agencies-Departments-Offices/Agencies-Departments-Offices-Directory/Police-Department/Police-Records,Records Request Info,Agency-Published Resources,Police Records - City and County of Denver,Release of police records and reports is governed by the Colorado Criminal Justice Records Act. Some reports may not be releasable; others may have certain information redacted as required by law.,200,Home - City and County of Denver,"[""Police Records""]","[""How to Order Police Records"", ""Identification"", ""Records"", ""Civil Liability"", ""View This Page in Other Languages"", ""Questions about Police Records?"", ""Fingerprinting Services"", ""Related Information""]","[""Denver City Government Closed Monday, March 25"", ""Step 1"", ""Step 2"", ""Contact 3-1-1"", ""Visit Other Denver Sites"", ""Share & Connect""]","[""General Information"", ""Request Police Records Online""]",[],[],"opens in new tab or window Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Denver City Government Closed Monday, March 25 Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures Close this announcement Most City and County of Denver offices will be closed Monday, March 25, 2024 in observance of the Cesar Chavez Day holiday. Details about city services and closures " -4394,https://www.denvergov.org/files/assets/public/police-department/documents/discipline-handbook/discipline-handbook.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -4395,https://www.denvergov.org/files/assets/public/police-department/documents/operations-manual/om_book.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -4396,https://denvergov.org/opendata/dataset/hate-crimes,Crime Maps & Reports,Agency-Published Resources,Denver Open Data Catalog: Hate Crimes,"Description -Hate crimes are criminal offenses that are motivated to some extent by the offender's bias. They are different from traditional criminal offenses because they victimize entire groups rather...",200,Home - City and County of Denver,[],"[""Hate Crimes"", ""Description"", ""Disclaimer"", ""About Crime Data"", ""Resources"", ""Details"", ""Tags"", ""Open Data License""]","[""Open Data Catalog""]",[],"[""ONLINE SERVICES"", ""OPEN DATA"", ""A - Z SERVICES""]",[],"Toggle navigation Neighborhood Business Visiting Government Online Services A to Z Toggle navigation Open Data Catalog Home > Hate Crimes Open Data Search Hate Crimes Last updated 2/25/2022 Description Hate crimes are criminal offenses that are motivated to some extent by the offender's bias. They are different from traditional criminal offenses because they victimize entire groups rather than individuals. Hate crimes are determined when one of the motivating factors of the crime was bias, or hatred based upon the offender's perception of the victim as belonging to a group based upon race, gender, religion, sexual identification, nation of origin, or disability. The term hate crime is interchangeable with bias motivated crime. Hate crimes are often confused with hate incidents. Hate incidents might involve bias-motivated name calling or pamphlet distribution but do not rise to the level of a criminal act. Hate incidents can be precursors to criminal activity. The data is dynamic, which allows for additions, deletions and/or modifications at any time, resulting in more accurate information in the database. Due to continuous data entry, the number of records in subsequent extractions are subject to change. The data includes the victims of a hate crime which is indicated by multiple records with the same information. Hate crime data will be updated monthly. Disclaimer The information provided here regarding public safety in Denver are offered as a courtesy by the City and County of Denver. By downloading this data, you acknowledge that you have read and understand the Disclaimer below and agree to be bound by it. Certain information is omitted, in accordance with legal requirements and as described more fully in this Disclaimer. All materials contained on this site are distributed and transmitted ""as is,"" without any representation as to completeness or accuracy and without warranty or guarantee of any kind. The City and County of Denver is not responsible for any error or omission on this site or for the use or interpretation of the results of any research conducted here. About Crime Data The Denver Police Department strives to make crime data as accurate as possible, but there is no avoiding the introduction of errors into this process, which relies on data furnished by many people and that cannot always be verified. Data on this site are updated monthly, adding new incidents and updating existing data with information gathered through the investigative process. Resources Description Format Action Description and Disclaimer of Data docx Download NIBRS Crime Types pdf Open Hate Crimes - CSV csv Download Details Author Denver Police Department Maintainer City and County of Denver, Technology Services / Enterprise Data Management Maintainer Email denvergis@denvergov.org Version 1.0.1 273 total datasets | view all Tags crime Open Data License You are free to copy, distribute, transmit and adapt the data - in this catalog under an open license. For details, please - review the terms of use . Toggle navigation Neighborhood Business Visiting Government Online Services A to Z Toggle navigation Toggle navigation " -4397,https://app.powerbigov.us/view?r=eyJrIjoiZjEwYTI3YWUtODhjZi00MTJiLWEzMGItMDM2NWIzZGRiNjgxIiwidCI6IjBkOWJjNzljLTU4MWItNDQ3Ny1hY2Y3LThkNzBkZDNlNTU1YSJ9,Stops,Police & Public Interactions,Microsoft Power BI,"",200,Power BI,[],[],[],[],[],[],"" -4398,https://policetransparency-mycity.hub.arcgis.com/#datadashboards,List of Data Sources,Info About Agencies,Police Transparency Dashboard,"Discover, analyze and download data from Police Transparency Dashboard. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",200,Police Transparency Dashboard,[],[],[],[],[],[],"" -4399,https://www.cityofdavis.org/city-hall/police-department/officer-involved-shootings,Use of Force Reports,Police & Public Interactions,"","",-1,"","","","","","","","" -4400,https://www.iowacolonytx.gov/police-department/public-information,Records Request Info,Agency-Published Resources,"Public Information | Iowa Colony, TX","",200,"Iowa Colony, TX |","[""Public Information""]","[""How Do I"", ""You are here"", ""Contact Info"", ""News""]","[""Crash Reports"", ""City Hall & Court Hours""]","[""Iowa Colony""]",[],[],Skip to main content -4401,https://www.iowacolonytx.gov/divisions/patrol-division,Personnel Records,Info About Officers,"Patrol Division | Iowa Colony, TX","",200,"Iowa Colony, TX |","[""Patrol Division""]","[""How Do I"", ""You are here"", ""Staff Contacts"", ""Contact Info"", ""News""]","[""City Hall & Court Hours""]","[""Iowa Colony""]",[],[],Skip to main content -4402,https://www.cityofmadison.com/police/data/,List of Data Sources,Info About Agencies,"Data & Information - Police Department - City of Madison, Wisconsin","",200,"City of Madison, WI","[""Data & Information""]","[""Data / Reports"", ""Archived Documents"", ""21st Century Policing Quarterly Data"", ""Contact Madison Police"", ""Report / Contact"", ""Connect with Police""]","[""July - September 2023"", ""April - June 2023""]","[""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data""]",[],[],"Search Menu City of Madison Accounts All Accounts ePayments Municipal Services (Water) Employment Licenses & Permits Email & Text Subscriptions Services Jobs Agencies All Agencies Assessor's Office Attorney's Office Building Inspection Civil Rights Clerk's Office Common Council Community Development Development Services Center Economic Development Employee Assistance Program Engineering Finance Fire Fleet Service Golf Goodman Pool Housing Authority Human Resources Independent Police Monitor Information Technology Madison City Channel Madison Public Library Madison Senior Center Mayor's Office Metro Transit Monona Terrace Municipal Court Office of Business Resources Office of Real Estate Services Olbrich Botanical Gardens Parking Parks Planning Planning, Community & Economic Development Police Public Health Madison & Dane County Public Works Streets & Recycling Traffic Engineering Transportation Treasurer's Office Warner Park Community Recreation Center Water Utility Data Contact Mayor City Council City Staff & Agencies ""Policing in partnership with our community"" Community Districts About Services Safety & Prevention Join the Team Media Data Contact City of Madison Police Data & Information Data & Information Data / Reports 2023-2028 Strategic Plan Community Crime Map Disclaimer & Definitions Video: How to use the Community Crime Map The Community Crime Map is under maintenance, information and updates to the map may not be current. Annual Reports Chief's Quarterly Reports to the Common Council Legal Updates Survey Results Sex Offender Registry (Wisconsin Dept. of Corrections) 2022 Patrol Workload Report Quarterly Community Survey Results View all Reports Archived Documents 2021 Patrol Workload Report EEOP Utilization Report, 2021 Sentinel Event Review by the Quattrone Center posted: 11/16/2021 2020 Patrol Workload Report 2020 Accountability Report posted: 05/20/2021 MPD Update to Council on Ad Hoc Committee Recommendations - July 2020 posted: 02/08/2021 Release of Records - Case 20-227434 posted: 10/02/2020 2019 Patrol Workload Report MPD's Internal Investigation Disposition - June 3, 2019 Incident posted: 09/20/2019 Release of Records - June 3, 2019 Conveyance Mental Health posted: 06/06/2019 Release of Records - February 13, 2019 Whitehorse Middle School posted: 03/05/2019 MPD's 21st Century Policing Response, 2018 2020 Community Outreach Annual Report 2018 Patrol Workload Report 2019 Accountability Report 2018 Accountability Report MPD Response to OIR Report Update MPD Response to OIR Report MPD's 21st Century Policing Response, 2017 MPD's 21st Century Policing Response, 2016 Trust-Based Initiatives and Collaborative Efforts with Madison's Diverse Community View all Archived Documents 21st Century Policing Quarterly Data MPD's 21st Century Policing Response, 2018 July - September 2023 Incident Based Reporting (IBR) Offenses IBR Offenses IBR Offenses Incident Based Reporting (IBR) Arrests IBR Arrests IBR Arrests Personnel Demographics Personnel Demographics Personnel Demographics Traffic Stop Data Traffic Stop Data Traffic Stop Data Use of Force Data Use of Force Data Use of Force Data April - June 2023 Incident Based Reporting (IBR) Offenses IBR Offenses IBR Offenses Incident Based Reporting (IBR) Arrests IBR Arrests IBR Arrests Personnel Demographics Personnel Demographics Personnel Demographics Traffic Stop Data Traffic Stop Data Traffic Stop Data Use of Force Data Use of Force Data Use of Force Data View Archived 21st Century Policing Quarterly Data » " -4403,https://www.cityofmadison.com/police/data/archived-quarterly-data.cfm,Annual & Monthly Reports,Info About Agencies,"Archived 21st Century Policing Quarterly Data - News & Data - Madison Police Department - City of Madison, Wisconsin","",200,"City of Madison, WI","[""Archived 21st Century Policing Quarterly Data""]","[""List of Archived Data"", ""» News & Data"", ""Contact Madison Police"", ""Report / Contact"", ""Connect with Police""]","[""January - March 2023"", ""October - December 2022"", ""July - September 2022"", ""April - June 2022"", ""January - March 2022"", ""October - December 2021"", ""July - September 2021"", ""April - June 2021"", ""January - March 2021"", ""October - December 2020"", ""July - September 2020"", ""April - June 2020"", ""January - March 2020"", ""October - December 2019"", ""July - September 2019"", ""April - June 2019"", ""January - March 2019"", ""October - December 2018"", ""July - September 2018"", ""April - June 2018"", ""January - March 2018"", ""October - December 2017"", ""July - September 2017"", ""April - June 2017"", ""January - March 2017"", ""October - December 2016"", ""July - September 2016"", ""April - June 2016"", ""January - March 2016""]","[""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data""]",[],[],"" -4404,https://www.cityofmadison.com/police/support/records/,Records Request Info,Agency-Published Resources,"Records - Police Department - City of Madison, Wisconsin","",200,"City of Madison, WI",[],"[""Records"", ""Simone Munson"", ""Contact Madison Police"", ""Report / Contact"", ""Connect with Police""]","[""Public Records Requests"", ""Fees for Reports""]",[],[],[],"Search Menu City of Madison Accounts All Accounts ePayments Municipal Services (Water) Employment Licenses & Permits Email & Text Subscriptions Services Jobs Agencies All Agencies Assessor's Office Attorney's Office Building Inspection Civil Rights Clerk's Office Common Council Community Development Development Services Center Economic Development Employee Assistance Program Engineering Finance Fire Fleet Service Golf Goodman Pool Housing Authority Human Resources Independent Police Monitor Information Technology Madison City Channel Madison Public Library Madison Senior Center Mayor's Office Metro Transit Monona Terrace Municipal Court Office of Business Resources Office of Real Estate Services Olbrich Botanical Gardens Parking Parks Planning Planning, Community & Economic Development Police Public Health Madison & Dane County Public Works Streets & Recycling Traffic Engineering Transportation Treasurer's Office Warner Park Community Recreation Center Water Utility Data Contact Mayor City Council City Staff & Agencies ""Policing in partnership with our community"" Community Districts About Services Safety & Prevention Join the Team Media Data Contact City of Madison Police Support & Community Outreach Records Records The mission of the Records Section of the Madison Police Department is to provide administrative support for all members of the department in order to best accomplish the department's mission of providing high quality police services. The Records Section will process police records, external requests for records, and internal technology requests in a timely manner. Public Records Requests The public can access police reports in a number of ways: Call Records at (608) 266-4075. Mail requests to: 211 S. Carroll St. Madison, WI, 53703 Visit in-person: City-County Building 210 Martin Luther King Jr. Blvd. Follow signs to the ground floor Hours: Monday-Friday 8am - 4pm Fax Records at (608) 267-1117. Contact Online Hours: Monday-Friday, 8:00 a.m. - 4:00 p.m. All reports are subject to a review process. Below is a link to a document that explains further the records review process and explains what you can expect when you make a public records request from the Madison Police Department. Public Records Requests Public Records Requests (Spanish) Fees for Reports Below is a link to the detailed Fee List for Madison Police Records. Postage fees will be added when records are mailed. Location fees will be imposed if the cost of location (including searching for and identifying responsive records) is $50 or greater. Prepayment may be required if the total fee exceeds $5. Detailed Fee List for Madison Police Records Simone Munson Records Manager Contact Records Crash/Accident Reports MPD Police Contacts/Visa and Clearance Letters Fingerprinting Lost & Abandoned Property " -4405,https://www.cityofmadison.com/police/newsroom/incidentreports/,Incident Reports,Police & Public Interactions,"Incident Reports - News & Data - Madison Police Department - City of Madison, Wisconsin","",200,"City of Madison, WI","[""Police Incident Reports A Selection of Noteworthy Incident Reports""]","[""& / or Location:"", ""& / or Date:"", ""Contact Madison Police"", ""Report / Contact"", ""Connect with Police""]","[""Subscribe to Email List""]",[],[],[],"" -4406,"https://communitycrimemap.com/?address=Madison,%20WI",Crime Maps & Reports,Agency-Published Resources,LexisNexis® Community Crime Map,"",200,LexisNexis® Community Crime Map,[],[],[],[],[],[],"" -4407,https://www.montgomerycountymd.gov/OLO/Resources/Files/2022_reports/OLOReport2022-12.pdf,Citations,Police & Public Interactions,"","",200,"","","","","","","","" -4408,https://app.powerbigov.us/view?r=eyJrIjoiZTBhNDYzMTMtZTRhMy00OWRkLTk3ZGItZmJlMGQ2OTRjMDQzIiwidCI6IjYwYWZlOWUyLTQ5Y2QtNDliMS04ODUxLTY0ZGYwMjc2YTJlOCJ9&pageName=ReportSection,Stops,Police & Public Interactions,Microsoft Power BI,"",200,Power BI,[],[],[],[],[],[],"" -4410,https://www.montgomerycountymd.gov/pol/data/community-pol-report.html,Annual & Monthly Reports,Info About Agencies,"Community Policing Report, MCPD, Montgomery County, MD","",200," - Montgomery County Maryland -",[],"[""Annual Community Policing Reports"", ""Annual Statistical Data Reports for County Officials""]",[],"[""POLICE CONTACTS"", ""FOR CRIME SOLVERS"", ""DISTRICTS"", ""RESOURCES"", ""FOLLOW US"", ""STAY INFORMED""]",[],[],"Skip to main content County Web Accessibility information including Alternative Format Requests for Disabled Users are provided on this page. An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us Annual Community Policing Reports MCPD CY2022 Community Policing Annual Report MCPD CY2021 Community Policing Annual Report MCPD CY2020 Community Policing Annual Report MCPD CY2019 Community Policing Annual Report MCPD CY2018 Community Policing Annual Report MCPD CY2017 Community Policing Annual Report Annual Statistical Data Reports for County Officials MCPD CY2023 Statistical Data Annual Report (Bills 33-19 and 45-20) ​ MCPD CY2022 Statistical Data Annual Report (Bills 33-19 and 45-20) Montgomery County Police Department Public Safety Headquarters 100 Edison Park Drive · Gaithersburg, MD 20878 Non-emergency: 301-279-8000 POLICE CONTACTS For Emergencies: Call 911 Non-emergency: 301-279-8000 FOR CRIME SOLVERS Anonymous Call: 1-866-411-8477 Submit Crime Tips DISTRICTS 1D Rockville 2D Bethesda 3D Silver Spring 4D Wheaton 5D Germantown 6D Montgomery Village RESOURCES Department Policies MCP Alumni Language Bank FOLLOW US Facebook Twitter YouTube Instagram STAY INFORMED News Releases Performance Stats Community Policing MontgomeryCountyMD.GOV Privacy Policy | User Rights | Accessibility | Social Media Policy | County Code | Language Translations © Copyright 2024. Montgomery County Government. | All Rights Reserved Go Top County Web Accessibility information including Alternative Format Requests for Disabled Users are provided on this page. An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 An official website of Montgomery County, Maryland An official website of Montgomery County, Maryland MC311 Montgomery County Department of Police Search String Search Montgomery County Department of Police Search String Search Montgomery County Department of Police Montgomery County Department of Police Search String Search Search String Search Search String Search Search String Search Search String Search × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us × Translate Site Home About Office of the Chief Districts Bureaus How Do I? Public Safety Data Join Our Team Contact Us Translate Annual Community Policing Reports MCPD CY2022 Community Policing Annual Report MCPD CY2021 Community Policing Annual Report MCPD CY2020 Community Policing Annual Report MCPD CY2019 Community Policing Annual Report MCPD CY2018 Community Policing Annual Report MCPD CY2017 Community Policing Annual Report Annual Statistical Data Reports for County Officials MCPD CY2023 Statistical Data Annual Report (Bills 33-19 and 45-20) ​ MCPD CY2022 Statistical Data Annual Report (Bills 33-19 and 45-20) " -4411,https://spdblotter.seattle.gov/2022/01/14/spd-updates-traffic-stop-guidelines/,Policies & Contracts,Info About Agencies,SPD Updates Traffic Stop Guidelines - SPD Blotter,"",200,403 Forbidden,"[""SPD Updates Traffic Stop Guidelines""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[],SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics SPD Blotter Seattle Police Department (SPD) Home Topics Search Search Search Search Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Find Posts By Topic Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports Police Precincts East Precinct North Precinct Southwest Precinct South Precinct West Precinct Data and Crime Trends Investigations 2018 Homicides 2019 Homicides 2020 Homicides Statements and News Releases Chief of Police News Releases Events Alerts Community Outreach Traffic and Collisions Significant Incident Reports -4412,https://shakeronline.com/714/Policies-Practices,Policies & Contracts,Info About Agencies,"Policies & Practices | Shaker Heights, OH",Learn more about the department's policies.,200,"Shaker Heights, OH | Official Website","[""Policies & Practices""]",[],"[""Bias Free Policing Policy"", ""Body Worn Cameras & Dashcam Video Systems"", ""Duty to Intervene Policy"", ""Officer Involved Critical Incidents Policy"", ""Response to Threats Policy"", ""Other"", ""Contact Us"", ""Police FAQs"", ""Site Links"", ""Loading""]",[],[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Community Engagement Services & Permits How Do I? Home Government Departments Police About Policies & Practices Policies & Practices Learn more about the policies of the Shaker Heights Police Department. Bias Free Policing Policy To expressly prohibit practices and prevent bias in law enforcement activities while reinforcing the department's commitment to unbiased policing. Body Worn Cameras & Dashcam Video Systems Department guidelines for the use of these technologies. Duty to Intervene Policy New effective October 28, 2020 . Guidelines for intervening to prevent or stop misconduct that is being conducted by employees or members of other law enforcement agencies. Officer Involved Critical Incidents Policy Learn about procedures for documenting and post-incident review of Officer involved critical incidents. Response to Threats Policy Amended effective November 25, 2020. Policy for officers responding to a known or perceived threat in furtherance of their sworn duties. Other View the department’s Racial Profile Statement (PDF). View the department’s Officer Involved Critical Incidents Policy (PDF). Bias Free Policing Policy Body Worn Cameras & Dashcam Video Systems Duty to Intervene Policy Officer Involved Critical Incidents Policy Response to Threats Policy Contact Us Meet the Chief Social Worker Recruitment Police Reports Overnight Parking Contact Us Shaker Heights Police Department 3355 Lee Road Shaker Heights, OH 44120 Emergency: 911 or 216-491-1234 (from a cell phone) Non-Emergency: 216-491-1220 Police FAQs Can I park overnight on the street? How do I pay a ticket? How do I report a streetlight outage? Is there a leash law? View All Police FAQs /QuickLinks.aspx Site Links Home Accessibility Intranet Staff Directory Site Map FAQs Document Center Privacy Policy /QuickLinks.aspx Government Websites by CivicPlus® " -4413,https://shakeronline.com/719/Training,Training & Hiring Info,Info About Officers,"Training | Shaker Heights, OH",Learn more about the training received by Shaker Heights police officers.,200,"Shaker Heights, OH | Official Website","[""Training""]","[""De-Escalation Training"", ""Bias-Free Policing Training"", ""LeadDiversity""]","[""Contact Us"", ""Police FAQs"", ""Site Links"", ""Loading""]",[],[],[],Skip to Main Content -4414,https://shakeronline.com/614/Police-Reports,Incident Reports,Police & Public Interactions,"Police Reports | Shaker Heights, OH",Access online police reports.,200,Error retrieving title: dictionary changed size during iteration,"[""Police Reports""]",[],"[""Contact Us"", ""Quick Links"", ""Contact Us"", ""Police FAQs"", ""Site Links"", ""Loading""]","[""Police Department""]",[],[],"Skip to Main Content Create a Website Account - Manage notification subscriptions, save form progress and more. Website Sign In Search About Community Engagement Services & Permits How Do I? Home Government Departments Police Services & Permits Police Reports Police Reports Disclaimer : The Shaker Heights Police Department provides this information as a service to our residents. Some case types are withheld in order to comply with the law and protect victims' rights. Information in these reports may change as the investigation proceeds and additional facts come to light. Persons reading this information should make no assumptions about this information, nor broadcast or publicize it without re-confirmation with the Shaker Heights Police Department. All content provided in police reports is obtained from the public domain and accessible upon request and availability from the Shaker Heights Police Department's Information Unit at 216-491-1220. Contact Us Police Department Physical Address View Map 3355 Lee Road Shaker Heights , OH 44120 3355 Lee Road Shaker Heights OH 44120 Directions Quick Links SHPD on Facebook SHPD on Twitter View All Links /QuickLinks.aspx Police Records Request Contact Us Meet the Chief Social Worker Recruitment Police Reports Overnight Parking Contact Us Shaker Heights Police Department 3355 Lee Road Shaker Heights, OH 44120 Emergency: 911 or 216-491-1234 (from a cell phone) Non-Emergency: 216-491-1220 Police FAQs Can I park overnight on the street? How do I pay a ticket? How do I report a streetlight outage? Is there a leash law? View All Police FAQs /QuickLinks.aspx Site Links Home Accessibility Intranet Staff Directory Site Map FAQs Document Center Privacy Policy /QuickLinks.aspx Government Websites by CivicPlus® " -4415,https://mg.search.org/wp-content/uploads/2022_AnnMtg-NewDirectionsNIBRSAndIncidentBasedResearch.pdf,Annual & Monthly Reports,Info About Agencies,"","",200,"","","","","","","","" -4416,https://nixthe6.org/contracts/,Policies & Contracts,Info About Agencies,Contracts | Nix The Six | Campaign Zero,"",200,Nix The Six | Campaign Zero,"[""""]","["""", ""Contracts""]",[],[],[],[],Research Contributions Contracts About Podcast A project by Campaign Zero Volunteer Donate Menu Police unions have too much power. It’s time to hold them accountable. Contracts Email Address instagram community@nixthe6.org Research Contributions Contracts About Podcast A project by Campaign Zero Volunteer Donate Menu Police unions have too much power. It’s time to hold them accountable. Contracts Email Address instagram community@nixthe6.org Research Contributions Contracts About Podcast A project by Campaign Zero Volunteer Donate Menu Research Contributions Contracts About Podcast A project by Campaign Zero Volunteer Donate Contracts Email Address Email Address -4417,https://www.muckrock.com/foi/knoxville-30436/roster-and-hire-dates-143162/?,Personnel Records,Info About Officers,Roster and hire dates • MuckRock,MuckRock is a collaborative news site that gives you the tools to hold the government accountable.,200,MuckRock,"[""Roster and hire dates""]","[""Communications"", ""Files""]","[""""]",[],[],[],"" -4418,https://www.muckrock.com/foi/pittsburgh-130/calls-for-service-144982/,Calls for Service,Police & Public Interactions,Calls for service • MuckRock,MuckRock is a collaborative news site that gives you the tools to hold the government accountable.,200,MuckRock,"[""Calls for service""]","[""Communications"", ""Files""]","[""""]",[],[],[],"" -4419,https://www.tcole.texas.gov/content/racial-profiling-reports,Stops,Police & Public Interactions,Racial Profiling Reports | Texas Commission on Law Enforcement,"Law Enforcement Agency Requirements*PLEASE NOTE: Reporting for the 2023 racial profiling report opened January 1, 2024, and will be available until March 1, 2024, for traffic stops conducted in 2023.  (click here for a sample of the questions)",200,Homepage | Texas Commission on Law Enforcement,"[""Racial Profiling Reports""]","[""Law Enforcement Agency Requirements"", ""Resources"", ""Support"", ""Texas Law Enforcement Agency Racial Profiling Reports Submitted to TCOLE"", ""Important Links"", ""Helpful Links""]",[],[],[],[],"" -4420,https://insights.cincinnati-oh.gov/stories/s/qurw-azge,Complaints & Misconduct,Info About Officers,Closed Citizen Complaints,"",200,CincyInsights,[],"[""Menu""]",[],[],"[""How to use this dashboard"", ""About this data""]",[],Skip to main content Skip to footer links Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Menu Close Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Search Search Search Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Menu Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Initiatives Results Cincy Sign In Sign In Menu Close Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Sign In Search Home Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Feedback Topics Neighborhoods & Development Internal Operations Public Services Public Safety Health & Environment Initiatives Results Cincy Sign In Search Search -4421,https://data.cincinnati-oh.gov/Safety/Citizen-Complaint-Authority-CCA-Closed-Complaints/ii65-eyg6/explore,Complaints & Misconduct,Info About Officers,Citizen Complaint Authority (CCA) Closed Complaints | Tyler Data & Insights,"",200,Cincinnati Open Data Portal | Tyler Data & Insights,[],"[""Menu""]",[],[],[],[],Skip to Main Content Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Search Search Search Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Menu Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Open Data How-To How-To Packet Video Guides Sign In Sign In Menu Close Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Sign In Search Home Suggest a Dataset Open Data How-To How-To Packet Video Guides CincyInsights Open Data How-To How-To Packet Video Guides Sign In Search Search Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Select a column to filter... Use text Use a number Use a boolean -4422,https://phillypolice.com/accountability/findings/#!#%2F_ga=2.88868763.1007266185.1596139754-12687582.1596139754,Complaints & Misconduct,Info About Officers,Accountability | Philadelphia Police Department,"",200,Philadelphia Police Department | Philadelphia Police Department,[],"[""Begin typing to search"", ""Results""]","[""Complaints Against Police (CAP) Findings"", ""Navigation""]","[""News"", ""Districts"", ""Accountability"", ""Programs & Services"", ""Forms"", ""Crime Maps & Stats"", ""PPD Digital"", ""Careers"", ""Search""]",[],[],"Begin typing to search X Results News Districts Accountability Programs & Services Forms Crime Maps & Stats Careers Complaints Against Police (CAP) Findings The Philadelphia Police Department is committed to open and transparent engagement. This engagement includes sharing information about Complaints Against Police (CAPs) here on our accountability page and on OpenDataPhilly.org. The table below shows filed complaint findings. A summary of each complaint can be seen by clicking “View Details” on the complaint row. Once in the ""View Details"" box, findings associated with the complaint can be accessed by clicking the ""Disciplinary Findings"" button at the top of the box. Accountability Home Page File a complaint Explore on the OpenData portal Legend CAP Findings CAP Number P.O. Sex/Race Complainant Age/Race/Sex Classification Findings Disciplinary Findings Details Rows per page: 10 5 10 15 1 - of Navigation News Districts Accountability Programs & Services Forms Crime Maps & Stats PPD Digital Careers Search City of Philadelphia • Mayor's Office • City Council • Courts • District Attorney CONTACT Police Headquarters 750 Race Street Philadelphia, PA 19106 TIPS DIAL OR TEXT 215.686.TIPS (8477) EMERGENCY 911 NON-EMERGENCY 311 FILE A POLICE REPORT Dial 911 or visit your district headquarters Media Inquiries police.public_affairs@phila.gov ABOUT US The Philadelphia Police Department (PPD) is the nation's fourth largest police department, with over 6600 sworn members and 800 civilian personnel. The PPD is the primary law enforcement agency responsible for serving Philadelphia County, extending over 140 square-miles in which approximately 1.5 million reside. About the Department Mission Leadership Fallen Officers Partners Press Inquiries Contact LATEST NEWS Missing Person - Terry Lee Heckman - From the 19th District Missing Person - Robert Lee Hall - From the 35th District LATEST TWEETS Wanted: Suspect for Auto vs Pedestrian in the 9th District [... 2 years ago Wanted: Suspect for Aggravated Assault in the 3rd District [... 3 years ago Today, we say goodbye to our dear friend, Emanuel ""Manny"" St... 3 years ago HONOR • SERVICE • INTEGRITY © 2010-2021 Philadelphia Police Department Begin typing to search X Results Begin typing to search X Begin typing to search X Begin typing to search X X Results Results Results Results News Districts Accountability Programs & Services Forms Crime Maps & Stats Careers News Districts Accountability Programs & Services Forms Crime Maps & Stats Careers News Districts Accountability Programs & Services Forms Crime Maps & Stats Careers News Districts Accountability Programs & Services Forms Crime Maps & Stats Careers News Districts Accountability Programs & Services Forms Crime Maps & Stats Careers " -4423,https://data.hartford.gov/Public-Safety/Police-911-Calls-for-Service-05122021-to-Current/uaxa-ans5/explore,Calls for Service,Police & Public Interactions,Police 911 Calls for Service 05122021 to Current | Data | City of Hartford,"",200,Data | City of Hartford | Data | City of Hartford,[],"[""Menu""]",[],[],[],[],Skip to Main Content HartfordData Sign In Catalog Developers Help Menu Menu Close Catalog Developers Help Sign In Search HartfordData Sign In Catalog Developers Help Menu HartfordData Sign In Catalog Developers Help Menu Sign In Sign In Catalog Developers Help Menu Close Catalog Developers Help Sign In Search Catalog Developers Help Sign In Search Catalog Developers Help Sign In Search Search Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Select a column to filter... Use text Use a number Use a boolean Select a column to filter... Use text Use a number Use a boolean Select a column to filter... Use text Use a number Use a boolean Select a column to filter... Use text Use a number Use a boolean Select a column to filter... Use text Use a number Use a boolean Select a column to filter... Use text Use a number Use a boolean Select a column to filter... Use text Use a number Use a boolean Use text Use a number Use a boolean Use text Use a number Use a boolean Use text Use a number Use a boolean Use text Use text Use a number Use a number Use a boolean Use a boolean Apply -4424,https://data.cityofnewyork.us/Public-Safety/911-End-to-End-Data/t7p9-n9dy/explore,Calls for Service,Police & Public Interactions,911 End-to-End Data | NYC Open Data,"",200,403 Forbidden,[],"[""Menu""]",[],[],[],[],Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply Back to Primer Switch to Grid View Undo last applied change Redo last applied change Search Export Fetching row count... Fetching row count... Filters Group Column Manager Filters | Clear all Select a column to filter... Use text Use a number Use a boolean Apply -4425,https://data.boston.gov/dataset/boston-police-department-fio,Field Contacts,Police & Public Interactions,BPD Field Interrogation and Observation (FIO) - Dataset - Analyze Boston,"",200,Welcome - Analyze Boston,"[""BPD Field Interrogation and Observation (FIO)"", ""Boston Police Department"", ""BPD Field Interrogation and Observation (FIO)""]","[""Organization"", ""Social"", ""License"", ""Data and Resources""]","[""About the FIO Records (Mark43) Files (Sept 29 - Dec 31 2022)"", ""About the FIO Records 2015 (New RMS) and 2016, 2017, 2018, 2019, and 2020 (Jan 1 - Sept 29 2020) Files"", ""About the FIO Records 2011 - 2015 (Old RMS) File"", ""Additional Notes"", ""Tags"", ""Additional Info"", ""About the FIO Records (Mark43) Files (Sept 29 - Dec 31 2022)"", ""About the FIO Records 2015 (New RMS) and 2016, 2017, 2018, 2019, and 2020 (Jan 1 - Sept 29 2020) Files"", ""About the FIO Records 2011 - 2015 (Old RMS) File"", ""Additional Notes""]",[],[],[],Home Boston.gov Log in Register Showcases News Datasets Organizations Topics Tips for Users About Contact Home Boston.gov Log in Register Showcases News Datasets Organizations Topics Tips for Users About Contact Log in Register -4426,https://www.wokewindows.org/exports,List of Data Sources,Info About Agencies,"","",500,"","","","","","","","" -4427,https://qmr.news/public-records/,List of Data Sources,Info About Agencies,Public Records – The Mass Dump,"",200,Not Acceptable!,"[""Public Records""]",[],[],[],[],[],"Search Search The Mass Dump Newsletter The Mass Dump March 25, 2024 A massive dump of Massachusetts public records open menu Back Home Newsletter Podcast Support This Project Contact Public Records Below, you can explore a database of public records posted to the site. New records are being added all the time. Agency Topic File Download Date Received Provided By The Mass Dump A massive dump of Massachusetts public records Newsletter Mission News Theme by Compete Themes. Search Search The Mass Dump Newsletter The Mass Dump March 25, 2024 A massive dump of Massachusetts public records open menu Back Home Newsletter Podcast Support This Project Contact Public Records Below, you can explore a database of public records posted to the site. New records are being added all the time. Agency Topic File Download Date Received Provided By The Mass Dump A massive dump of Massachusetts public records Newsletter Mission News Theme by Compete Themes. Search Search The Mass Dump Newsletter Search The Mass Dump Search The Mass Dump Search The Mass Dump The Mass Dump March 25, 2024 A massive dump of Massachusetts public records The Mass Dump Back Home Newsletter Podcast Support This Project Contact Back Home Newsletter Podcast Support This Project Contact Public Records Below, you can explore a database of public records posted to the site. New records are being added all the time. Agency Topic File Download Date Received Provided By Public Records Below, you can explore a database of public records posted to the site. New records are being added all the time. Agency Topic File Download Date Received Provided By Public Records Below, you can explore a database of public records posted to the site. New records are being added all the time. Agency Topic File Download Date Received Provided By Public Records Below, you can explore a database of public records posted to the site. New records are being added all the time. Agency Topic File Download Date Received Provided By Public Records Below, you can explore a database of public records posted to the site. New records are being added all the time. Agency Topic File Download Date Received Provided By Below, you can explore a database of public records posted to the site. New records are being added all the time. Agency Topic File Download Date Received Provided By Agency Topic File Download Date Received Provided By Agency Topic File Download Date Received Provided By The Mass Dump A massive dump of Massachusetts public records Newsletter The Mass Dump Mission News Theme by Compete Themes. " -4428,https://www.publicsource.org/pittsburgh-bureau-police-discipline-complaints-disciplinary-matrix-new-chief/,Complaints & Misconduct,Info About Officers,First year under Mayor Gainey saw fewer complaints vs police,"Pittsburgh in 2022 saw some of the lowest numbers of complaints against police, and disciplinary actions within the bureau, in a decade.",200,PublicSource: Pittsburgh & Allegheny County news that matters,"[""Complaints against Pittsburgh police dropped in 2022, and this year could set a long-term tone""]","[""MOST READ PUBLICSOURCE STORIES"", ""About the data"", ""Know more than you did before? Support this work with a gift!"", ""Rich Lord""]","[""Share this:"", ""Disappearing evictions? Bill would take most landlord-tenant complaint records out of the public eye"", ""What proposed performance-based funding could mean for Pitt, other state-related universities"", ""Dancing across the checkouts: My brother shows that more people with disabilities can flourish through work"", ""PPS poised to sue county over property assessments"", ""Walnut Capital receives greenlight for Oakland residential redevelopment""]",[],[],[],Sign up for PublicSource's Roundup newsletter to get our journalism sent to your inbox three times a week for free. Email (Required) Email This field is for validation purposes and should be left unchanged. Δ Sign up for PublicSource's Roundup newsletter to get our journalism sent to your inbox three times a week for free. Email (Required) Email This field is for validation purposes and should be left unchanged. Δ Sign up for PublicSource's Roundup newsletter to get our journalism sent to your inbox three times a week for free. Email (Required) Email This field is for validation purposes and should be left unchanged. Δ Sign up for PublicSource's Roundup newsletter to get our journalism sent to your inbox three times a week for free. Email (Required) Email This field is for validation purposes and should be left unchanged. Δ Email (Required) Email This field is for validation purposes and should be left unchanged. Δ Email (Required) Email This field is for validation purposes and should be left unchanged. Email (Required) Email This field is for validation purposes and should be left unchanged. Email (Required) Email This field is for validation purposes and should be left unchanged. This field is for validation purposes and should be left unchanged. SPECIAL PROJECTS FIRST-PERSON ESSAYS DEVELOP PGH BOARD EXPLORER SELVES NEWSLETTER PUBLIC-SERVICE GUIDES KNOW PITTSBURGH. FOR REAL. INSIDE OUR NEWSROOM ABOUT NEWSLETTERS OUR MISSION CONTACT US STAFF PITCHES/TIPS LEAK TO US EVENTS JOBS FAQS LOCAL EVENTS PARTNERS PRIVACY POLICY ADVERTISE WITH US WHO SUPPORTS US DONATION/MEMBERSHIP FAQ REPUBLISHING GUIDELINES WORKING WITH PUBLICSOURCE INTERN TESTIMONIALS SPECIAL PROJECTS FIRST-PERSON ESSAYS DEVELOP PGH BOARD EXPLORER SELVES NEWSLETTER PUBLIC-SERVICE GUIDES KNOW PITTSBURGH. FOR REAL. INSIDE OUR NEWSROOM ABOUT NEWSLETTERS OUR MISSION CONTACT US STAFF PITCHES/TIPS LEAK TO US EVENTS JOBS FAQS LOCAL EVENTS PARTNERS PRIVACY POLICY ADVERTISE WITH US WHO SUPPORTS US DONATION/MEMBERSHIP FAQ REPUBLISHING GUIDELINES WORKING WITH PUBLICSOURCE INTERN TESTIMONIALS SPECIAL PROJECTS FIRST-PERSON ESSAYS DEVELOP PGH BOARD EXPLORER SELVES NEWSLETTER PUBLIC-SERVICE GUIDES KNOW PITTSBURGH. FOR REAL. INSIDE OUR NEWSROOM ABOUT NEWSLETTERS OUR MISSION CONTACT US STAFF PITCHES/TIPS LEAK TO US EVENTS JOBS FAQS LOCAL EVENTS PARTNERS PRIVACY POLICY ADVERTISE WITH US WHO SUPPORTS US DONATION/MEMBERSHIP FAQ REPUBLISHING GUIDELINES WORKING WITH PUBLICSOURCE INTERN TESTIMONIALS -4429,https://www.50-a.org/,Complaints & Misconduct,Info About Officers,50-a.org: search NYPD misconduct,"Search NYPD officer misconduct. A website of Civilian Complaint Review Board complaints, police misconduct records, lawsuits and related public NYPD data.",200,50-a.org: search NYPD misconduct,[],[],[],[],[],[],"Lookup misconduct by NYPD officers. Search by Officer Name or Badge Number Search Search Search File a complaint with the NYC Civilian Complaint Review Board Lookup by NYPD Precinct or Unit Officers with the most complaints 'Adverse Credibility' lists from District Attorneys Recently added and recently updated complaints Other ways to search CCRB data: CCRB NYPD Member of Service Histories CCRB Complaints Database at NYC OpenData The Legal Aid Society Law Enforcement Lookup NYCLU Misconduct Complaint database ProPublica search This database contains 472,000 allegations - from 170,000 complaints - through March 2024, - along with other records of 90,600 police officers. " -4430,https://bpdwatch.com/browse,Personnel Records,Info About Officers,Browse BPD Watch,Browse a department on BPD Watch.,200,BPD Watch,[],"[""Baltimore Police Department"", ""Baltimore County Police Department""]","[""Baltimore State's Attorney's Office's Do Not Call list"", ""Baltimore State's Attorney's Office's list of officers with credibility issues""]",[],"[""BPD Watch"", ""Contact"", ""Navigation""]",[],"Toggle navigation Browse Find an Officer Submit Images Volunteer About Register Log In Toggle navigation Browse Find an Officer Submit Images Volunteer About Register Log In Browse a Department Browse a Department Browse a Department Baltimore Police Department Available data range: 5/3/2018 - 11/18/2021. See the raw datasets here. Officers Incidents Baltimore State's Attorney's Office's Do Not Call list The Baltimore State's Attorney's Office compiled a list of officers they won't call to testify in court, either because of criminal convictions or substantiated claims of misconduct. See the list Baltimore State's Attorney's Office's list of officers with credibility issues The Baltimore State's Attorney's Office compiled a larger list of officers about whom they have concerns regarding their integrity and whether their testimony in court can be trusted. These officers have not had allegations against them sustained, are not prohibited from testifying in court, and most are actively employed with BPD. See the list Baltimore County Police Department Available data from 8/11/2021. See the raw datasets here. Officers Incidents Baltimore Police Department Available data range: 5/3/2018 - 11/18/2021. See the raw datasets here. Officers Incidents Baltimore State's Attorney's Office's Do Not Call list The Baltimore State's Attorney's Office compiled a list of officers they won't call to testify in court, either because of criminal convictions or substantiated claims of misconduct. See the list Baltimore State's Attorney's Office's list of officers with credibility issues The Baltimore State's Attorney's Office compiled a larger list of officers about whom they have concerns regarding their integrity and whether their testimony in court can be trusted. These officers have not had allegations against them sustained, are not prohibited from testifying in court, and most are actively employed with BPD. See the list Baltimore County Police Department Available data from 8/11/2021. See the raw datasets here. Officers Incidents Baltimore Police Department Available data range: 5/3/2018 - 11/18/2021. See the raw datasets here. Officers Incidents Baltimore State's Attorney's Office's Do Not Call list The Baltimore State's Attorney's Office compiled a list of officers they won't call to testify in court, either because of criminal convictions or substantiated claims of misconduct. See the list Baltimore State's Attorney's Office's list of officers with credibility issues The Baltimore State's Attorney's Office compiled a larger list of officers about whom they have concerns regarding their integrity and whether their testimony in court can be trusted. These officers have not had allegations against them sustained, are not prohibited from testifying in court, and most are actively employed with BPD. See the list Baltimore County Police Department Available data from 8/11/2021. See the raw datasets here. Officers Incidents BPD Watch A project by Open Justice Baltimore, a Fusion Partnerships Program. Open Justice Baltimore Fusion Partnerships Contact Privacy Policy Navigation Find an Officer Submit Images Volunteer About BPD Watch A project by Open Justice Baltimore, a Fusion Partnerships Program. Open Justice Baltimore Fusion Partnerships Contact Privacy Policy Navigation Find an Officer Submit Images Volunteer About " -4431,https://mdcaseexplorer.com/,Court Cases,Jails & Courts Specific,MD Case Explorer,"",200,MD Case Explorer,[],[],[],[],[],[],"" -4432,https://policefundingdatabase.org/explore-the-database/find-a-location/,Budgets & Finances,Info About Agencies,Find a location | Police Funding Database | LDF | TMI,"Explore the cities, counties, and states tracked by LDF’s National Police Funding Database. ",200,Police Funding Database | LDF | TMI,"[""Find a location""]","[""JUMP TO A STATE:"", ""Follow the Thurgood Marshall Institute"", ""Sign up for updates"", ""Disclaimer""]",[],[],[],[],This site requires JavaScript. -4433,https://www.opendatapolicingnc.com/stop,Stops,Police & Public Interactions,Open Data Policing,"",200,Open Data Policing,"[""Find a Traffic Stop""]","[""Stops (29,972,748 total)""]","[""Basic Search"", ""Advanced Search"", ""About Open Data Policing"", ""Donate"", ""Connect""]",[],[],[],About Open Data Policing About Open Data Policing About About -4434,https://docs.google.com/spreadsheets/d/151J17PmQualbo7ONsLtei6I0jE_6C5Ut/edit?usp=sharing&ouid=106943000769599966023&rtpof=true&sd=true,Citations,Police & Public Interactions,Non-Haz Citations 2021 and 2022 EDH.xlsx - Google Sheets,"",200,Sign in - Google Accounts,[],[],[],[],[],[],"JavaScript isn't enabled in your browser, so this file can't be opened. Enable and reload. JavaScript isn't enabled in your browser, so this file can't be opened. Enable and reload. JavaScript isn't enabled in your browser, so this file can't be opened. Enable and reload. Non-Haz Citations 2021 and 2022 EDH .xlsx Saved to Drive Share Sign in This version of Google Chrome is no longer supported. Please upgrade to a supported browser . Dismiss File Edit View Insert Format Data Tools Help Accessibility Unsaved changes to Drive Accessibility View only Copy chart Edit chart Publish chart Download chart Delete chart Today Settings Support CaseNumber Non-Haz Citations 2021 and 2022 EDH .xlsx Saved to Drive Share Sign in This version of Google Chrome is no longer supported. Please upgrade to a supported browser . Dismiss Non-Haz Citations 2021 and 2022 EDH .xlsx Saved to Drive Share Sign in Non-Haz Citations 2021 and 2022 EDH .xlsx Saved to Drive Share Sign in Non-Haz Citations 2021 and 2022 EDH .xlsx Saved to Drive Share Sign in Non-Haz Citations 2021 and 2022 EDH .xlsx Saved to Drive Non-Haz Citations 2021 and 2022 EDH .xlsx Saved to Drive Non-Haz Citations 2021 and 2022 EDH Non-Haz Citations 2021 and 2022 EDH .xlsx .xlsx Saved to Drive Saved to Drive Saved to Drive Saved to Drive Saved to Drive Share Sign in Share Sign in Sign in Sign in Sign in This version of Google Chrome is no longer supported. Please upgrade to a supported browser . Dismiss This version of Google Chrome is no longer supported. Please upgrade to a supported browser . Dismiss This version of Google Chrome is no longer supported. Please upgrade to a supported browser . Dismiss File Edit View Insert Format Data Tools Help Accessibility Unsaved changes to Drive Accessibility View only Copy chart Edit chart Publish chart Download chart Delete chart Today Settings Support File Edit View Insert Format Data Tools Help Accessibility Unsaved changes to Drive File Edit View Insert Format Data Tools Help Accessibility File Edit View Insert Format Data Tools Help Accessibility Unsaved changes to Drive Unsaved changes to Drive Accessibility View only Copy chart Edit chart Publish chart Download chart Delete chart Today Settings Support Accessibility View only Copy chart Edit chart Publish chart Download chart Delete chart Today Settings Support Accessibility View only Accessibility Accessibility Accessibility Accessibility View only View only Copy chart Edit chart Publish chart Download chart Delete chart Copy chart Edit chart Publish chart Download chart Delete chart Copy chart Copy chart Copy chart Edit chart Edit chart Edit chart Publish chart Publish chart Publish chart Download chart Download chart Download chart Download chart Delete chart Delete chart Delete chart Today Settings Support Today Settings Support Today Today Today Settings Settings Settings Support Support Support CaseNumber CaseNumber CaseNumber CaseNumber CaseNumber CaseNumber CaseNumber " -4435,https://www.muckrock.com/foi/pittsburgh-130/q1-2023-traffic-stops-144011/,Stops,Police & Public Interactions,Q1 2023 Traffic Stops • MuckRock,MuckRock is a collaborative news site that gives you the tools to hold the government accountable.,200,MuckRock,"[""Q1 2023 Traffic Stops""]","[""Communications"", ""Files""]","[""""]",[],[],[],"" -4436,https://github.com/data-liberation-project/dea-theft-and-loss-counts,Incident Reports,Police & Public Interactions,"GitHub - data-liberation-project/dea-theft-and-loss-counts: Spreadsheets, obtained via FOIA, quantifying thefts/losses of controlled substances (and regulated chemicals) reported to the DEA.","Spreadsheets, obtained via FOIA, quantifying thefts/losses of controlled substances (and regulated chemicals) reported to the DEA. - data-liberation-project/dea-theft-and-loss-counts",200,GitHub: Let’s build from here · GitHub,"[""Search code, repositories, users, issues, pull requests..."", ""Provide feedback"", ""Saved searches"", ""data-liberation-project/dea-theft-and-loss-counts"", ""Data: Theft/Loss of Controlled Substances""]","[""Use saved searches to filter your results more quickly"", ""Folders and files"", ""Latest commit"", ""History"", ""Repository files navigation"", ""Background"", ""Spreadsheets provided by the DEA"", ""“Tidy” CSV files"", ""Licensing"", ""About"", ""Releases"", ""Languages"", ""Footer""]","[""data"", ""data"", ""scripts"", ""scripts"", "".gitignore"", "".gitignore"", ""Makefile"", ""Makefile"", ""README.md"", ""README.md"", ""requirements.in"", ""requirements.in"", ""requirements.txt"", ""requirements.txt"", ""setup.cfg"", ""setup.cfg"", ""DEA disclaimer"", ""DEA glossary"", ""“Business activity”"", ""“Loss type”"", ""Years covered"", ""Notes on the conversion"", ""Resources"", ""Stars"", ""Watchers"", ""Forks"", ""Footer navigation""]",[],[],[],"" -4437,https://www.dps.arkansas.gov/crime-info-support/arkansas-crime-information-center/,List of Data Sources,Info About Agencies,Crime Information Center - Arkansas Department of Public Safety,"",200,Home - Arkansas Department of Public Safety,"[""Flag Status""]","[""Arkansas Crime Information Center"", ""2024 ACIC CJIS Training Symposium"", ""ACIC Director"", ""Jeff Long"", ""2024 ACIC CJIS Training Symposium"", ""ACIC Director"", ""Jeff Long"", ""Online Services"", ""HELPFUL Links"", ""ACIC News"", ""ARKANSAS ICAC TASK FORCE MARKS 20 YEARS OF PROTECTING CHILDREN"", ""October 23, 2023"", ""ACIC CALENDAR"", ""Contact ACIC"", ""Helpful ACIC links"", ""Connect with ACIC"", ""Respect. Integrity. CUSTOMER SERVICE. TEAMWORK. SERVANT LEADERSHIP. CONTINUOUS IMPROVEMENT"", """", ""© 2024 All rights Reserved. Arkansas.gov""]",[],[],"[""About DPS"", ""DPS Links"", ""DPS Address"", ""Your Arkansas.gov"", ""Top Online Services"", ""Helpful Information""]",[],"" -4438,https://atlasofsurveillance.org/,Misc Police Activity,Police & Public Interactions,Atlas of Surveillance,"",200,Atlas of Surveillance,"[""Atlas of Surveillance""]","[""Documenting Police Tech in Our Communities with Open Source Research"", ""What is the Atlas?""]",[],[],[],[],"A project of the Electronic Frontier Foundation Home Map Search the Data Special Reports Special Reports Real-Time Crime Centers Albuquerque Real-Time Crime Center Atlanta Loudermilk Video Integration Center Detroit Real-Time Crime Center Fresno Real-Time Crime Center (Suspended) Miami Gardens Real-Time Crime Center New Orleans Real-Time Crime Center Ogden Area Tactical Analysis Center Sacramento Real-Time Crime Center Southwest Border Communities Cochise County, Arizona Doña Ana County, New Mexico El Paso County, Texas Pima County, Arizona San Diego County, California Webb County, Texas Campus Surveillance Scholars Under Surveillance: How Campus Police Use High Tech to Spy on Students Data Library Glossary About Methodology Collaborate Atlas of Surveillance is a project of the Electronic Frontier Foundation Privacy Policy CC-by Atlas of Surveillance is a project of the Electronic Frontier Foundation Privacy Policy CC-by Privacy Policy CC-by Atlas of Surveillance Documenting Police Tech in Our Communities with Open Source Research Search our database of police tech — enter a city, county, state or agency in the United States. Explore our interactive map of police tech in the U.S. (loads 3rd party assets). Explore the Map What is the Atlas? The Atlas of Surveillance is a database of surveillance technologies deployed by law enforcement in communities across the United States. This includes drones, body-worn cameras, automated license plate readers, facial recognition, and more. This research was compiled by more than 1,000 students and volunteers, and incorporates datasets from a variety of public and non-profit sources. Atlas of Surveillance Documenting Police Tech in Our Communities with Open Source Research Search our database of police tech — enter a city, county, state or agency in the United States. Explore our interactive map of police tech in the U.S. (loads 3rd party assets). Explore the Map What is the Atlas? The Atlas of Surveillance is a database of surveillance technologies deployed by law enforcement in communities across the United States. This includes drones, body-worn cameras, automated license plate readers, facial recognition, and more. This research was compiled by more than 1,000 students and volunteers, and incorporates datasets from a variety of public and non-profit sources. Atlas of Surveillance Documenting Police Tech in Our Communities with Open Source Research Search our database of police tech — enter a city, county, state or agency in the United States. Explore our interactive map of police tech in the U.S. (loads 3rd party assets). Explore the Map What is the Atlas? The Atlas of Surveillance is a database of surveillance technologies deployed by law enforcement in communities across the United States. This includes drones, body-worn cameras, automated license plate readers, facial recognition, and more. This research was compiled by more than 1,000 students and volunteers, and incorporates datasets from a variety of public and non-profit sources. Atlas of Surveillance Documenting Police Tech in Our Communities with Open Source Research Search our database of police tech — enter a city, county, state or agency in the United States. " -4439,https://apps.pittsburghpa.gov/redtail/images/20764_2023_2025_CONTRACT_RATIFICATION_.pdf,Policies & Contracts,Info About Agencies,"","",200,"","","","","","","","" -4440,https://www.mass.gov/info-details/officer-disciplinary-records-database,Complaints & Misconduct,Info About Officers,Officer Disciplinary Records database | Mass.gov,View the database of active law enforcement officer disciplinary records here.,200,Mass.gov,"[""Officer Disciplinary Records database""]","[""Table of Contents"", ""Disciplinary records database"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[],"" -4441,https://www.muckrock.com/foi/rockwood-30523/roster-and-hire-dates-143170/?,Personnel Records,Info About Officers,Roster and hire dates • MuckRock,MuckRock is a collaborative news site that gives you the tools to hold the government accountable.,200,MuckRock,"[""Roster and hire dates""]","[""Communications"", ""Files""]",[],[],[],[],"" -4442,https://public.tableau.com/app/profile/abolitionist.law.center/viz/ALCBailDashboard/ALCBailDashboard,Court Cases,Jails & Courts Specific,Free Data Visualization Software | Tableau Public,"Tableau Public is a free platform that lets anyone explore, create, and share interactive data visualizations online using public data.",200,Error retrieving title: 'NoneType' object has no attribute 'text',[],"[""Cookie Consent Manager""]","[""General Information"", ""Required Cookies"", ""Functional Cookies"", ""Advertising Cookies"", ""General Information"", ""Required Cookies"", ""Functional Cookies"", ""Advertising Cookies"", ""Back Button Back"", """"]","[""""]",[],[],"Create Learn Sign In Who are the DataFam and what do they do on Tableau Public? Watch a 2-minute overview → Loading... English (US) Deutsch English (UK) English (US) Español Français (Canada) Français (France) Italiano 日本語 한국어 Português Svenska ไทย 简体中文 繁體中文 System Status Blog FAQ About Tableau Products Careers Contact Us Legal Privacy Data Policy Uninstall Cookie Preferences Your Privacy Choices © 2024 Tableau Software, LLC, a Salesforce Company. All Rights Reserved. Create Learn Sign In Who are the DataFam and what do they do on Tableau Public? Watch a 2-minute overview → Loading... English (US) Deutsch English (UK) English (US) Español Français (Canada) Français (France) Italiano 日本語 한국어 Português Svenska ไทย 简体中文 繁體中文 System Status Blog FAQ About Tableau Products Careers Contact Us Legal Privacy Data Policy Uninstall Cookie Preferences Your Privacy Choices © 2024 Tableau Software, LLC, a Salesforce Company. All Rights Reserved. Create Learn Sign In Create Learn Create Learn Create Create Sign In Sign In Who are the DataFam and what do they do on Tableau Public? Watch a 2-minute overview → Who are the DataFam and what do they do on Tableau Public? Watch a 2-minute overview → Loading... Loading... English (US) Deutsch English (UK) English (US) Español Français (Canada) Français (France) Italiano 日本語 한국어 Português Svenska ไทย 简体中文 繁體中文 System Status Blog FAQ About Tableau Products Careers Contact Us English (US) Deutsch English (UK) English (US) Español Français (Canada) Français (France) Italiano 日本語 한국어 Português Svenska ไทย 简体中文 繁體中文 System Status Blog FAQ About Tableau Products Careers Contact Us English (US) Deutsch English (UK) English (US) Español Français (Canada) Français (France) Italiano 日本語 한국어 Português Svenska ไทย 简体中文 繁體中文 English (US) Deutsch English (UK) English (US) Español Français (Canada) Français (France) Italiano 日本語 한국어 Português Svenska ไทย 简体中文 繁體中文 English (US) Legal Privacy Data Policy Uninstall Cookie Preferences Your Privacy Choices © 2024 Tableau Software, LLC, a Salesforce Company. All Rights Reserved. " -4443,https://documents.alleghenycounty.us/PAVClient/ContractSearch/index.html,Policies & Contracts,Info About Agencies,Contracts Portal | Allegheny County,"",200,IIS Windows Server,[],[],[],"[""Search"", ""Results""]",[],[],English German Spanish French Italian Japanese Korean Dutch Portuguese Romanian Turkish Chinese (Simplified) Chinese (Traditional) Search Search Type Contracts - 2015 Use an * at the end of a vendor name when searching if you are unsure of a vendor’s complete name. From Date To Date Agreement # Contract Type OJ OS OU Vendor Name Submitting Department/Division ADMINISTRATIVE SERVICES BUDGET AND FINANCE CAPITAL CHILDREN INITIATIVES CLERK OF COURTS COMPUTER SERVICES CONTROLLER COUNTY COUNCIL COUNTY EXECUTIVE COUNTY MANAGER COUNTY SOLICITOR COURT OF COMMON PLEAS COURT RECORDS DEI DEPT SERVICES DISTRICT ATTORNEY DPW ECONOMIC DEVELOPMENT EMERGENCY MANAGEMENT EMERGENCY SERVICES FACILITIES MANAGEMENT HEALTH HUMAN RESOURCES HUMAN SERVICES HUMAN SERVICES - HUD INFORMATION TECHNOLOGY JAIL JURY COMMISSIONERS JUVENILE COURT PLACEMENT KANE - CENTRAL KANE - GLEN HAZEL KANE - MCKEESPORT KANE - PHARMACY KANE - ROSS KANE - SCOTT LAW M/W/DBE MEDICAL EXAMINER MISCELLANEOUS AGENCIES NON-DEPT EXPENDITURES NON-DEPT REVENUES OPERATIONS PARKS PGH INTL AIRPORT POLICE PROPERTY ASSESSMENT BOARD PROTHONOTARY PUBLIC DEFENDER PUBLIC WORKS CAPITAL PUBLIC WORKS OPERATING REAL ESTATE REAL ESTATE REGISTRY AND DEEDS RECORDER OF DEEDS REGISTER OF WILLS RETIREMENT SHERIFF SHUMAN SPECIAL EVENTS SUSTAINABILITY TELECOM TREASURER UTILITIES VETERANS SERVICES Start Date Search Reset Results Loading... English German Spanish French Italian Japanese Korean Dutch Portuguese Romanian Turkish Chinese (Simplified) Chinese (Traditional) English German Spanish French Italian Japanese Korean Dutch Portuguese Romanian Turkish Chinese (Simplified) Chinese (Traditional) English German Spanish French Italian Japanese Korean Dutch Portuguese Romanian Turkish Chinese (Simplified) Chinese (Traditional) English German Spanish French Italian Japanese Korean Dutch Portuguese Romanian Turkish Chinese (Simplified) Chinese (Traditional) Search Search Type Contracts - 2015 Use an * at the end of a vendor name when searching if you are unsure of a vendor’s complete name. From Date To Date Agreement # Contract Type OJ OS OU Vendor Name Submitting Department/Division ADMINISTRATIVE SERVICES BUDGET AND FINANCE CAPITAL CHILDREN INITIATIVES CLERK OF COURTS COMPUTER SERVICES CONTROLLER COUNTY COUNCIL COUNTY EXECUTIVE COUNTY MANAGER COUNTY SOLICITOR COURT OF COMMON PLEAS COURT RECORDS DEI DEPT SERVICES DISTRICT ATTORNEY DPW ECONOMIC DEVELOPMENT EMERGENCY MANAGEMENT EMERGENCY SERVICES FACILITIES MANAGEMENT HEALTH HUMAN RESOURCES HUMAN SERVICES HUMAN SERVICES - HUD INFORMATION TECHNOLOGY JAIL JURY COMMISSIONERS JUVENILE COURT PLACEMENT KANE - CENTRAL KANE - GLEN HAZEL KANE - MCKEESPORT KANE - PHARMACY KANE - ROSS KANE - SCOTT LAW M/W/DBE MEDICAL EXAMINER MISCELLANEOUS AGENCIES NON-DEPT EXPENDITURES NON-DEPT REVENUES OPERATIONS PARKS PGH INTL AIRPORT POLICE PROPERTY ASSESSMENT BOARD PROTHONOTARY PUBLIC DEFENDER PUBLIC WORKS CAPITAL PUBLIC WORKS OPERATING REAL ESTATE REAL ESTATE REGISTRY AND DEEDS RECORDER OF DEEDS REGISTER OF WILLS RETIREMENT SHERIFF SHUMAN SPECIAL EVENTS SUSTAINABILITY TELECOM TREASURER UTILITIES VETERANS SERVICES Start Date Search Reset Results Loading... -4444,https://alleghenycontroller.com/contact/right-to-know-request/,Records Request Info,Agency-Published Resources,Right To Know Request -,"",200,Allegheny County Controller Corey O'Connor,"[""Right To Know Request""]","[""You are about to leave AlleghenyController.com."", ""10"", ""You are about to leave AlleghenyController.com."", ""10""]",[],"[""Right To Know Request"", ""THE CONTROLLER"", ""DOCUMENTS & DATA"", ""TOOLS & RESOURCES"", ""Register As Employer"", ""Register As Constable""]",[],[],"THE CONTROLLER About the Controller Controller Duties & Functions Press Releases Boards Jail Oversight Board RETIREMENT BOARD Investment board Depository Board Contact DOCUMENTS & DATA Annual Reports Special Reports All Audits & Reports Data Dashboards Contracts County Budget OpenGov Climate Action Recommendations Jail Board Documents Tools & Resources Property Taxes Property Tax Estimate Worksheet Property Tax Appeal Guide Utility Assistance LGBTQ Resources Jail Reporting Prevailing Wage Constables Job Opportunities CONTACT Select Page THE CONTROLLER About the Controller Controller Duties & Functions Press Releases Boards Jail Oversight Board RETIREMENT BOARD Investment board Depository Board Contact DOCUMENTS & DATA Annual Reports Special Reports All Audits & Reports Data Dashboards Contracts County Budget OpenGov Climate Action Recommendations Jail Board Documents Tools & Resources Property Taxes Property Tax Estimate Worksheet Property Tax Appeal Guide Utility Assistance LGBTQ Resources Jail Reporting Prevailing Wage Constables Job Opportunities CONTACT Search for: Search for: Right To Know Request Home » CONTACT » Right To Know Request Right To Know Request The Right-to-Know Law provides access to records or documents. Pennsylvania’s Right to Know Request provides for access to public information, for a designated open-records officer in each Commonwealth agency, local agency, judicial agency and legislative agency, for procedure, for appeal of agency determination, for judicial review and for the Office of Open Records. The Controller’s Office has chosen to use the Standard Request Form promulgated by the Pennsylvania Open Records Office. This form may be downloaded from the website of the Pennsylvania Office of Open Records . Please email your completed Right To Know Request form with your contact information to info@alleghenycontroller.com. If you need immediate assistance, please call our office directly (412) 350-4660 Popular Services REPORTS AND AUDITS REPORT WASTE OR ABUSE RIGHT TO KNOW REQUEST PROPERTY TAX ESTIMATE WORKSHEET JAIL OVERSIGHT CONTRACTS ONLINE THE CONTROLLER About the Controller Controller’s Duties & Functions Press Releases Jail Oversight Board Retirement board Investment board Depository Board Contact DOCUMENTS & DATA Annual Reports Special Reports All Audits & Reports Data Dashboards Contracts County Budget OpenGov Climate Action Recommendations Jail Board Documents TOOLS & RESOURCES Property Taxes Utility Assistance LGBTQ Resources Jail Reporting Prevailing Wage Constables Job Opportunities Contact Us undefined Privacy Policy Terms & Conditions © 2024 Allegheny County Controller. All Rights Reserved. " -4445,https://alleghenycontroller.com/the-controller/jail-oversight-board/,List of Data Sources,Info About Agencies,Jail Oversight Board -,"",200,Allegheny County Controller Corey O'Connor,"[""Jail Oversight Board"", ""Community Resources""]","["""", ""Meetings"", """", ""Public Comments"", """", ""Records and Information"", """", ""Incarcerated Individuals Welfare Fund"", ""Warden's reports"", ""Meeting minutes"", ""Meeting Agendas"", ""Past Public Comments"", ""Other Jail Oversight Board Documents"", ""You are about to leave AlleghenyController.com."", ""10"", ""You are about to leave AlleghenyController.com."", ""10""]","["""", ""Members""]","[""THE CONTROLLER"", ""DOCUMENTS & DATA"", ""TOOLS & RESOURCES"", ""Register As Employer"", ""Register As Constable""]",[],[],"" -4446,https://www.anaheim.net/FormCenter/Police-Department-13/Public-Record-Request-97,Records Request Info,Agency-Published Resources,Form Center • Public Record Request,"",200,"Anaheim, CA - Official Website | Official Website","[""Form Center""]","[""Public Record Request""]","[""Search Forms:"", ""Contact Us"", ""Helpful Links"", ""Quick Links"", ""Loading""]",[],[],[],"Skip to Main Content Search Pay & Apply Find & Report Community Info Departments Home Form Center Form Center Search Forms: Search Forms Select a Category All Categories Anaheim Anytime Feedback Anaheim Fire & Rescue Anaheim Housing Authority Anaheim Newsletter Anaheim Workforce Connection City Administration City Clerk City Council Community Services Convention Center Convention, Sports & Entertainment Economic Development Fire & Rescue Library Planning and Building Police Department Public Utilities Public Works Test Forms By signing in or creating an account , some fields will auto-populate with your information. Public Record Request Sign in to Save Progress This form has been modified since it was saved. Please review all fields before submitting. Please select the type of request: Request type: * Incident History Calls For Service Other Date and time of incident: * Date and time of incident: Date and time of incident: Location * Additional information: Address: * Date and time frame: * Date and time frame: Start Date Date and time frame: Start Time — Date and time frame: End Date Date and time frame: End Time Additional information: Describe what you're looking for: * Please provide your information: Your name: * Your address: * City * State * Zip * Your phone number: * Your email address: * Le ave T his Bla nk: Receive an email copy of this form. Email address This field is not part of the form submission. Submit * indicates a required field Contact Us City of Anaheim 200 S. Anaheim Blvd. Anaheim, CA 92805 ( 714) 765-4311 Dial 311 Helpful Links City Council Agenda City Council Video FY 2023/24 Adopted Budget News and Media Center Anaheim Newsletter Visit Anaheim /QuickLinks.aspx Quick Links Contact Us Home Site Map Accessibility Disability & Civil Rights Program Copyright Notices /QuickLinks.aspx Government Websites by CivicPlus® " -4447,https://pittsburghpa.gov/police/data-portal,Crime Maps & Reports,Agency-Published Resources,Police Data Portal | pittsburghpa.gov,"",200,"City of Pittsburgh - Announcements, Special Events, Press Releases, City Permits, Careers, Pay your taxes, view Burgh's Eye View and more!","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GUÍA DE RESIDENTES"", """", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Links"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Zones"", ""Police Data"", ""Resources"", ""News""]",[],[],"PITTSBURGH REGISTER TO VOTE GUÍA DE RESIDENTES 311 COVID-19 UPDATES BUILDING ACCESSIBILITY CONTACT US FOLLOW US RESIDENTS 311 Citiparks Citizen Police Review Board City Planning Commission On Human Relations Engage PGH Ethics Hearing Board Finance Financial Empowerment Center Innovation & Performance Human Resources and Civil Service Job Opportunities Mobility & Infrastructure Office of Community Health & Safety Office of Film & Event Management Permits, Licenses, & Inspections Public Safety Public Works Schenley Skating Rink Special Events Voting Districts & Polling Places Winter Resource Center VISITORS Citiparks Engage PGH Explore Pittsburgh Next Pittsburgh Office of Film & Event Management Schenley Skating Rink Special Events VisitPittsburgh Welcoming Pittsburgh BUSINESS Bid Opportunities City Planning Finance Innovation & Performance Legislative Information Center Mobility & Infrastructure PGH Lab Permits, Licenses, & Inspections CITY HALL Boards, Authorities, Commissions City Clerk's Office City Council City Council Meetings, Agendas Community Development Block Grant Program Comprehensive Municipal Pension Trust Fund Controller's Office Human Resources and Civil Service Law Mayor's Cabinet Mayor's Office Municipal Pension Fund Office of Management & Budget Office of Municipal Investigations Public Safety City Hall History - Public Tours ONLINE APPS OneStopPGH Bid Opportunities CivicCentral Burgh's Eye View Dashburgh Engage PGH Facility Reservations Fiscal Focus Live Website Traffic Online Alarm Registration Open Book PGH Pay Parking Tickets PPA GoMobile PGH Pay PPAP Parking Lease Pay Real Estate Taxes PGH Watchdog Snow Angels Snow Plow Tracker Film & Event Permits Trash Schedule App CITY INFO About Pittsburgh City Directory Policies Press Releases Public Safety Blotter Refuse & Recycling Collection Tax Forms Council Meetings & Hearings Website Release Notes City Careers Women's Suffrage Centennial City Internships Citywide Event Schedule " -4449,https://data.cityofnewyork.us/Public-Safety/NYPD-Use-of-Force-Incidents/f4tj-796d,Use of Force Reports,Police & Public Interactions,NYPD Use of Force Incidents | NYC Open Data,"",200,403 Forbidden,"[""Manage Featured Content""]","[""Menu"", ""Access this Dataset via OData"", ""NYPD Use of Force Incidents"", ""About this Dataset"", ""What's in this Dataset?"", ""Columns in this Dataset"", ""Dataset Changelog"", ""NYPD Use of Force Incidents"", ""Open this dataset in Carto?"", ""Open this dataset in Plot.ly?"", ""Send a Message to the Owner of this Dataset"", ""Featured Content""]","[""Data Collection"", ""Dataset Information"", ""Update"", ""Attachments"", ""Topics"", ""Oops, something isn't right.""]",[],[],"[""OData Endpoint""]",Skip to Main Content Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Menu Sign In Sign In Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Menu Close Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us Sign In Search Home Data About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Contact Us About Overview Dashboard Open Data Law Learn How To Join a class Project Gallery Open Data Week Glossary FAQ Sign In Search Search diff --git a/hugging_face/testing/data/labeled-urls-headers_all.csv b/hugging_face/testing/data/labeled-urls-headers_all.csv deleted file mode 100644 index 69c5238d..00000000 --- a/hugging_face/testing/data/labeled-urls-headers_all.csv +++ /dev/null @@ -1,5235 +0,0 @@ -id,url,label,http_response,html_title,meta_description,h1,h2,h3,h4,h5,h6 -1,https://delcopa.gov/council/2016minutes/101216minutes.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -2,https://www.mass.gov/doc/coping-with-overdose-fatalities/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -3,http://www.longbeach.gov/police/press-releases/murder-7-/,Media Bulletins,200,MURDER(7),"","[""Long BeachPolice Department""]",[],[],[],[],[] -4,https://www.lynchburgvapolice.gov/wp-content/uploads/2021/05/img_1545.jpg,Poor Data Source,404,"","",,,,,, -5,http://police.portlandmaine.gov/526/permit-license-fees,Resources,200,"Permit & License Fees | Portland, ME - Official Website",See a list of permit and license fees.,"[""Permit & License Fees""]",[],[],[],[],[] -6,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2012_and_prior_archived_news/police_graduate_18_recruits,Personnel Records,200," - Police Graduate 18 Recruits - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Police Graduate 18 Recruits""]",[],[],[],[] -7,https://police.greenvillesc.gov/1996/getting-here-parking,Contact Info & Agency Meta,200,"Getting Here & Parking | Greenville, SC - Official Website","Find location information, directions and parking for Unity Park.","[""\r\n\r\nGetting Here & Parking\t\t""]","[""WEEKEND TROLLEY""]","[""Loading"", ""GETTING HERE\u00a0"", ""Parking\u00a0"", ""click map for downloadable pdf""]","[""Parking Garages\u00a0"", ""Swamp Rabbit Trail\u00a0""]",[],[] -8,http://lafayettepolice.us/3386/donate,Resources,404,"","",,,,,, -9,http://www.lafayettepolice.us/2111/youth-classes-and-weekend-workshops,Misc Police Activity,200,"Youth Classes and Weekend Workshops | Lafayette, IN - Official Website","","[""\r\n\r\nYouth Classes and Weekend Workshops\t\t""]",[],"[""Loading"", ""Select a Program:"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -10,https://norfolkne.gov/assets/site/documentcentral/police/archived-arrests/2020-arrests/may-arrests.pdf,Arrest Records,200,"","",[],[],[],[],[],[] -11,http://www.longbeach.gov/police/press-releases/murder-18-/,Media Bulletins,200,MURDER(18),"","[""Long BeachPolice Department""]",[],[],[],[],[] -12,https://www.edmondswa.gov/government/departments/police_department/anonymous_tip,Contact Info & Agency Meta,200," - Anonymous Tip - City of Edmonds, WA -","","[""City of Edmonds - Washington""]","[""Anonymous Tip""]","[""Edmonds Police Department"", ""Recruitment and Hiring""]",[],[],[] -13,https://www.southamptontownnypolice.gov/1698/calissa-restaurant,Not Criminal Justice Related,200,"Calissa Restaurant | Southampton, NY - Official Website","","[""\r\n\r\nCalissa Restaurant\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]","[""Summary Sheet"", ""WQIPP - Fund Application""]",[],[] -14,https://ose.louisiana.gov/event/police-communications-officer-i-5/,Poor Data Source,200,Police Communications Officer I | Louisiana Office of State Examiner,"","["""", ""Police Communications Officer I""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -15,https://www.mass.gov/doc/essential-functions-for-municipal-police-officers/download,Policies & Contracts,200,"","",[],[],[],[],[],[] -16,https://www.jacksonms.gov/documents/mayoral-executive-order-amending-the-city-of-jackson-police-departments-use-of-force-policy/,Media Bulletins,200,"MAYORAL EXECUTIVE ORDER AMENDING THE CITY OF JACKSON POLICE DEPARTMENT'S USE OF FORCE POLICY - Jackson, MS","","[""\n\n MAYORAL EXECUTIVE ORDER AMENDING THE CITY OF JACKSON POLICE DEPARTMENT\u2019S USE OF FORCE POLICY""]","[""Primary menu links"", ""Action toolbar"", ""Documents and forms"", ""Contact"", ""Subscribe"", ""Connect""]",[],"[""Cold Weather Shelter - Open""]","["""", """", """"]",[] -17,http://www.longbeach.gov/police/press-releases/murder-600-block-of-e-9th-street/,Media Bulletins,200,MURDER 600 block of E 9th Street,"","[""Long BeachPolice Department""]",[],[],[],[],[] -18,https://www.dps.arkansas.gov/law-enforcement/arkansas-state-police/divisions/highway-patrol/troop-c-commander/,Personnel Records,200,Troop C Commander - Arkansas Department of Public Safety,"","["" Flag Status""]","[""Troop C Commander"", ""Contact ASP"", ""Helpful ASP links"", ""Connect with ASP"", ""Respect. Integrity. \nCUSTOMER SERVICE. TEAMWORK. \nSERVANT LEADERSHIP. \nCONTINUOUS IMPROVEMENT"", """", ""\u00a9 2024 All rights Reserved. Arkansas.gov ""]","[""Captain John Carter""]",[],"[""About DPS"", ""DPS Links"", ""DPS Address"", ""Your Arkansas.gov"", ""Top Online Services"", ""Helpful Information""]",[] -19,https://www.roseville.ca.us/government/departments/police_department/community_services/my_neighborhood_officer/neighborhood_officer_program_information,Misc Police Activity,200," - Neighborhood Officer Program Information - City of Roseville -",Reasons for Neighborhood Officer program and scheduling information,"[""City of Roseville""]","[""Neighborhood Officer Program Information""]","[""Roseville Police Department ""]",[],[],[] -20,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2021_news_releases/arrest_leads_to_officer_injury,Media Bulletins,200," - Arrest Leads to Officer Injury - Village of Pleasant Prairie -","",[],"[""Arrest Leads to Officer Injury""]","[""Follow Us on Social Media""]",[],[],[] -21,https://cityofmebanenc.gov/documents/police-officer-2/police-officer-updated-2-21-2022/,Resources,200,"Police Officer (Updated 2-21-2022) - Mebane, NC","","[""Police Officer (Updated 2-21-2022)""]","[""Primary menu links"", ""Action toolbar"", ""Recent news"", ""Welcome"", ""Engage"", ""Help""]","[""Request for Bids: Elevated Water Storage Tank"", ""Request for Qualifications: West Ten Road Water Connector"", ""Request for Bids: Holt Street Greenway"", ""Thank You Chief Louis"", ""Request for Bids- W. Carr Street Sidewalk Improvements""]",[],[],[] -22,https://www.eutawal.gov/policeman/,Poor Data Source,404,"","",,,,,, -23,http://www.longbeach.gov/police/press-releases/murder-investigation4/,Media Bulletins,200,MURDER INVESTIGATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -24,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/090921blotter.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -25,https://delcopa.gov/planning/programsandinitiatives/heritagecommission/historyofhcpreservationawards.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -26,https://www.antioch.il.gov/wpfb-file/12-13-11-police-pension-fund-agenda-pdf/,Poor Data Source,200,"12-13-11 Police Pension Fund Agenda - Antioch, IL",8426 12 13 11 police pension fund agenda pdf commissions agendas 2011 1323382236 7fbda0786265e371ec5e6ffad4bd173e 217x300 _ppssu55rtwkq thumb jpg 08 17 10 36 0 pdf application page_text num_pages pdf_pages pdf_2text timings,"[""12-13-11 Police Pension Fund Agenda""]",[],[],[],[],[] -27,https://www.bedminster.us/government/police/history,Contact Info & Agency Meta,200," - History - Township of Bedminster -","","[""Bedminster Township""]","[""History""]","[""Bedminster Township""]",[],[],[] -28,https://www.ci.neenah.wi.us/departments/police/neighborhood-policing/,Policies & Contracts,200,Neighborhood Policing – City of Neenah,"","[""Neighborhood Policing""]","[""In This Department""]","[""Neighborhood Policing: Partnerships that Work""]",[],[],[] -29,http://www.lafayettepolice.us/1635/learning-adventures-camps-ages-5-7,Not Criminal Justice Related,200,"Learning Adventures Camps (ages 5-7) | Lafayette, IN - Official Website","","[""\r\n\r\nLearning Adventures Camps (ages 5-7)\t\t""]","[""About Learning Adventures Camps"", ""Registration for 2024 Zoo Camps opens February 1, 2024!"", ""2024 Learning Adventures (ages 5-7) Camp Schedule:*Please note, while we try to keep this schedule and open/closed status as current as possible, there may be delays in website updates.\u00a0"", ""Learning Adventures (ages 5-7) Camp Fees:"", ""Questions?\u00a0 Please call the Education Department at (765) 807-1540 or email zooeducation@lafayette.in.gov.""]","[""Loading"", ""If your desired session is full, you can join the wait list on our registration portal."", ""Contact Us"", ""FAQs"", ""Site Links""]","[""Please review before registering:""]",[],[] -30,https://www.sheridanwy.gov/faq_s/police_department,Contact Info & Agency Meta,200," - Police Department FAQ - City of Sheridan, WY -","","[""City of Sheridan""]","[""Police Department FAQ"", ""\n""]",[],[],[],[] -31,https://www.sandyspringsgapolice.gov/category/uncategorized/,Poor Data Source,200,Uncategorized – Sandy Springs Police Department,"","[""\n\t\t\t\tUncategorized\t\t\t""]","[""Hello world!""]",[],[],[],[] -32,https://mukilteowa.gov/news/mukilteo-seeks-new-police-chief/,Personnel Records,200," - City of Mukilteo - | Mukilteo Seeks New Police Chief - City of Mukilteo ","","[""\n\t\t Mukilteo Seeks New Police Chief\t\t ""]","[""\n\t\t\t\t\t\tSign up for notifications\n\t\t\t\t\t""]",[],[],[],[] -33,https://www.foxcrossingwi.gov/departments/police-department/community-policing/tricom/,Poor Data Source,200,tricom - Fox Crossing Fox Crossing,"",[],"[""Community Policing \u00bb tricom""]",[],[],[],[] -34,https://www.edmondswa.gov/government/departments/police_department/public_information/can_you_i_d_me_,Wanted Persons,200,Can You ID Me - Home,"","[""CAN YOU ID ME?"", ""499""]","[""Subjects Identified"", ""DO YOU KNOW THESE PEOPLE?""]","[""CanYouID.me is Washington State\u2019s most comprehensive unknown subject identification site.""]",[],"[""DO YOU RECOGNIZE ANYONE IN THESE PHOTOGRAPHS?"", ""DO YOU RECOGNIZE ANYONE IN THESE PHOTOGRAPHS?""]",[] -35,https://www.lynchburgvapolice.gov/traffic-safety-information/,List of Data Sources,200,Traffic Safety Information - Lynchburg Police Department,"","[""Traffic Safety Information""]","[""Traffic Safety Links""]",[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],"[""LPD Traffic Data"", ""Virginia State Police H.E.A.T. Program (Help Eliminate Auto Theft)"", ""Virginia Drive Smart"", ""Smart, Safe, and Sober"", ""Virginia Department of Motor Vehicles \u2013 Highway Safety"", ""Virginia\u2019s Child Safety Belt Laws"", ""Child Safety Seat Guidelines"", ""Teen Driving"", ""Virginia DMV Practice Driver\u2019s License tests"", ""Virginia DMV Motorcycle Safety"", ""Work Zone Safety Info""]" -36,http://chico.ca.us/post/police-community-advisory-board-pcab,Media Bulletins,404,"","",,,,,, -37,http://www.lafayettepolice.us/488/swimming-lessons,Not Criminal Justice Related,200,"Swimming Lessons | Lafayette, IN - Official Website",Sign up for swimming lessons at the Castaway Bay Aquatic Center in Lafayette.,"[""\r\n\r\nSwimming Lessons\t\t""]","[""Youth Swimming Lessons"", ""Fees"", ""Register"", ""Adult Swimming Lessons"", ""Jim Sharp""]","[""Loading"", ""Schedule"", ""Class Times"", """", ""Contact Us"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -38,https://alpha.austin.gov/police-oversight/written-reprimand-of-officer-jason-goodman/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -39,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2013_archived_news/december_2013/arlington_police_remind_safe_holiday_season,Media Bulletins,200," - Arlington Police Remind Motorists to Have Safe Holiday Season - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Arlington Police Remind Motorists to Have Safe Holiday Season""]",[],[],[],[] -40,https://www.antioch.il.gov/police-department/,List of Data Sources,200,"Police Department - Antioch, IL","","[""Police Department""]",[],[],"[""Employment"", ""Press Releases"", ""Police Blotter"", ""Juvenile Law Enforcement Record Automatic Expungement"", ""Citizen Complaint"", ""9-1-1 Dispatch Center""]",[],[] -41,https://decaturil.gov/decatur-police-department-to-host-coffee-with-a-cop-on-august-8-2018/,Misc Police Activity,200,"Decatur Police Department to Host Coffee with a Cop on August 8, 2018 - City of Decatur, IL","","[""Decatur Police Department to Host Coffee with a Cop on August 8, 2018""]","[""City of Decatur News"", ""Accessibility (CTRL+M)""]",[],[],[],[] -42,https://www.newcastlewa.gov/departments/police/solicitors,Not Criminal Justice Related,200," - Solicitor Permits - City of Newcastle -","",[],"[""City of Newcastle""]","[""2023 Active Solicitor Permits""]","[""City of NewcastleWashington""]",[],[] -43,https://www.hayward-ca.gov/discover/news/mar21/hayward-police-departments-community-academy-goes-virtual-april,Misc Police Activity,200,Hayward Police Department’s Community Academy goes virtual in April | City of Hayward - Official website,Community Academy.png The Hayward Police Department is offering special online sessions of its Community Academy program in English and Spanish over four weeks this April.The Hayward Police Department’s Community Academy is a certified educational program designed to give community members a working knowledge of how the Police Department is organized and operates in Hayward.,"[""Hayward Police Department\u2019s Community Academy goes virtual in April""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""Community Academy.png"", ""You are here. So is everything else."", ""Search form""]",[],"[""Re-CAP: Hayward\u2019s Updated Climate Action Plan (CAP)"", ""Try induction cooking for free through Ava Community Energy\u2019s Induction Cooktop Lending Program!"", ""The City of Hayward\u2019s Fight Against Food Waste"", ""Decoding Plastic Recycling In California"", ""Keep Hayward Clean and Green with Adopt-A-Block!"", ""City Hall and Nonessential Services Closures: Monday, Feb 12 and Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""Library Closure January 15, 2024"", ""Library Closure: December 23 2023 - January 1 2024"", ""Library closure: November 23 - November 26, 2023."", ""YOU ARE HERE.SO IS EVERYTHING ELSE."", ""Related News"", ""\u200bOrchard Avenue traffic calming project is topic of Monday, Jan. 22, community meeting"", ""City Hall and Nonessential Services Closures: Monday, Feb 12 and Monday, Feb. 19"", ""Monthly workshops about new Hayward sidewalk vending ordinance begin Jan. 31"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -44,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/031422summary.pdf,Daily Activity Logs,404,"","",,,,,, -45,https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-4/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -46,https://alpha.austin.gov/es/police-oversight/2020-06-30-7/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -47,https://spdblotter.seattle.gov/2013/05/02/man-leads-police-on-chase-in-stolen-patrol-car-after-attacking-bus-riders-officers/,Media Bulletins,200,"Man Leads Police On Chase In Stolen Patrol Car After Attacking Bus Rider, Officers (Updated) - SPD Blotter","","[""Man Leads Police On Chase In Stolen Patrol Car After Attacking Bus Rider, Officers (Updated)""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -48,http://www.ryepolice.us/announcements/dmv-phone-scam,Media Bulletins,200,Rye Police Department DMV Phone Scam - Rye Police Department,"","[""DMV Phone Scam""]","[""DMV Phone Scam""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -49,https://www.mass.gov/doc/2021-foxborough-police-sergeant-sole-assessment-center-examination-in-title-employment-verification-form/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -50,https://www.pleasantprairiewi.gov/news/2017_news/1_20_2017___shop_with_a_cop,Media Bulletins,200," - 1/20/2017 | Shop With a Cop - Village of Pleasant Prairie -","",[],"[""1/20/2017 | Shop With a Cop""]","[""Follow Us on Social Media""]",[],[],[] -51,https://www.bedminster.us/government/police/tips,Contact Info & Agency Meta,200," - Tips - Township of Bedminster -","","[""Bedminster Township""]","[""Tips""]","[""Bedminster Township""]",[],[],[] -52,https://champaignil.gov/2019/02/20/champaign-police-investigating-tuesday-night-shooting/,Misc Police Activity,200,Champaign Police Investigating Tuesday Night Shooting - City of Champaign,"On Tuesday, Feb. 19, 2019, at approximately 9:32 p.m., a Champaign Police Officer responded to the 1200 block of W Beardsley Avenue after hearing apparent gun shots while on patrol, which was followed by a citizen report of shots heard in the same area.","[""Champaign Police Investigating Tuesday Night Shooting""]","[""News Releases"", ""Department News""]",[],[],[],[] -53,https://champaignil.gov/2012/04/05/champaign-police-officers-cook-with-%e2%80%9ckids-in-the-kitchen%e2%80%9d/,Media Bulletins,200,Champaign Police Officers Cook with “Kids in the Kitchen” - City of Champaign,"","[""Champaign Police Officers Cook with \u201cKids in the Kitchen\u201d""]","[""News Releases"", ""Department News""]",[],[],[],[] -54,https://www.gurnee.il.us/government/departments/police-department/community-involvement/parking,Policies & Contracts,200," - Parking -","","[""Police Department""]","[""Parking on Village Streets""]","[""Village Hall""]",[],[],[] -55,https://www.ci.auburn.in.us/wp-content/uploads/2019/08/police-rad-class-2.jpg,Poor Data Source,404,"","",,,,,, -56,https://delcopa.gov/treasurer/pdf/2021reassessmentvalues/25.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -57,https://delcopa.gov/departments/liveworkplay.html,Not Criminal Justice Related,200,"Live, Work & Play - Delaware County, Pennsylvania","","[""Live, Work and Play in Delco, PA""]","[""Delco is a great place to live, work and play!""]","[""Live"", ""Work"", ""Play"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -58,https://www.stcharlesil.gov/events/public-meetings/police-pension-board/10889,Policies & Contracts,200,"Police Pension Board 12/6/2017 | Events | City of St Charles, IL",Police Pension Board on 12/6/2017,"[""\n\n City of St. Charles, Illinois \n"", ""Police Pension Board""]","[""You are here"", ""\n Committee/Commission "", ""\n View more events "", ""\n Documents on this site "", ""\n Accessibility "", ""\n Key Resources "", ""\n Connect With Us ""]",[],[],[],[] -59,https://coloradosprings.gov/police-department/article/news/man-posing-realtor-arrested,Media Bulletins,200,Man Posing as Realtor Arrested | City of Colorado Springs,"","[""\nMan Posing as Realtor Arrested\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -60,https://police.greenvillesc.gov/160/services,Resources,200,"Services | Greenville, SC - Official Website",Explore the services that the Police Department provides to the City of Greenville.,"[""\r\n\r\nServices\t\t""]",[],"[""Loading""]","[""\nAnimal Control\n"", ""\nFAQs\n"", ""\nGRAVITY\n"", ""\nNeighborhoods\n"", ""\nHeroes Softball Game\n"", ""\nCrime Prevention Services\n"", ""\nHire an Officer\n"", ""\nVictim Services\n"", ""\nCommunity Care Program\n"", ""\nCitizens Academy\n"", ""\nResources\n"", ""\nPedestrian and Bicycle Safety\n"", ""\nTraffic Safety\n""]",[],[] -61,https://cheswold.delaware.gov/cheswold-police-department-policy-and-procedure-manual/snow-energency-plan/,Policies & Contracts,200,Snow Energency Plan - Town of Cheswold,"","[""Cheswold""]","[""Delaware"", ""Snow Energency Plan""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[] -62,http://boro.dormont.pa.us/labor-agreements/police_union_contract_-_extended/,Policies & Contracts,200,Police_Union_Contract_-_Extended | Borough of Dormont,"","[""Police_Union_Contract_-_Extended""]",[],[],"[""Popular Resources"", ""Departments"", ""Resources""]",[],[] -63,https://coloradosprings.gov/police-department/article/news/motorcyclist-identified-austin-bluffs,Media Bulletins,200,Motorcyclist identified from Austin Bluffs Fatal Crash | City of Colorado Springs,"","[""\nMotorcyclist identified from Austin Bluffs Fatal Crash\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -64,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-agencies/1923-police-benevolent-association-new-york-state-inc-pbanys-dues-increase,Misc Police Activity,200,State Agencies Bulletin No. 1923 | Office of the New York State Comptroller,State Agencies Bulletin No. 1923,"[""\nState Agencies Bulletin No. 1923\n"", "" ""]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Effective Dates"", ""OSC Actions"", ""Agency Actions"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[] -65,https://www.arlingtontx.gov/city_hall/departments/police/recruiting/internships,Resources,200," - Internships - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Internships""]",[],"[""The Arlington Police Department offers internships for college students interested in a career in law enforcement. Interns will have the opportunity to shadow, ride out, and learn directly from a variety of units within the department."", ""Eligibility"", ""Application Procedure"", ""Application Deadlines"", ""Internship Coordinator""]",[],[] -66,https://www.coppelltx.gov/faq.aspx?qid=351,Not Criminal Justice Related,200,FAQs • Will the rate structure change result in additional r,"",[],"[""\n\u25bc\r\nUtility Billing - Rates & Increasing Block Rate Structure\t\t"", ""Contact a Plumber & Obtain a Permit""]","[""Loading"", ""Categories"", ""Example: Customer A"", ""Example: Customer B"", ""Example: Customer C"", ""Live Edit""]",[],[],[] -67,https://cityofpowell.us/police-agency/traffic-surveys/traffic-survey-report-1-3-18/,Misc Police Activity,200,"City of Powell, Ohio | Traffic Survey Report 1-3-18","","[""\n Traffic Survey Report 1-3-18\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -68,https://www.bristolri.gov/departments/police/public-safety-services/police-detail-request/,Resources,404,"","",,,,,, -69,https://takomaparkmd.gov/government/police/crime-prevention/burglary-prevention/,Media Bulletins,200,Burglary Prevention | City of Takoma Park,"","[""Burglary Prevention""]","[""Crime Prevention & Safety Tips Sections""]",[],"[""Library Renovations: Updated: January 23, 2024 - We Continue to Work Around the Winter Weather"", ""Still looking? Try searching for what you need."", ""Still looking? Try searching for what you need."", ""Still looking? Try searching for what you need."", ""Still looking? Try searching for what you need."", ""Still looking? Try searching for what you need."", ""Still looking? Try searching for what you need.""]",[],"[""Government"", ""Services"", ""Initiatives"", ""News"", ""About Takoma Park"", ""Events & Meetings""]" -70,https://fenwickisland.delaware.gov/comprehensive-plan/town-of-fenwick-island-fi-comp-plan_cleancopy_version6/,Not Criminal Justice Related,200,town-of-fenwick-island-fi-comp-plan_cleancopy_version6 - Fenwick Island,"",[],"[""town-of-fenwick-island-fi-comp-plan_cleancopy_version6""]","[""Menu""]",[],[],[] -71,https://delcopa.gov/employment/jobpostings/deputydirector_workforcedevelopment.html,Not Criminal Justice Related,200,"Deputy Director Workforce Development - Delaware County, Pennsylvania","","[""Deputy Director Workforce Development""]",[],"[""Duties of Position"", ""QUALIFICATIONS / REQUIREMENTS"", ""Delco Jobs Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""StrategicPlanning:"", ""Labor Market Data:"", ""Workforce System Oversight:"", ""Supervisory Responsibilities:"", ""Leadership"", ""Administrative:"", ""Contact""]",[],[] -72,https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scope-24/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -73,https://coloradosprings.gov/police-department/article/news/cspd-asks-communitys-help-fatal-crash,Media Bulletins,200,CSPD Asks for the Community’s Help in Fatal Crash | City of Colorado Springs,"","[""\nCSPD Asks for the Community\u2019s Help in Fatal Crash\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -74,http://www.longbeach.gov/police/press-releases/traffic-fatality-22-/,Media Bulletins,200,TRAFFIC FATALITY(22),"","[""Long BeachPolice Department""]",[],[],[],[],[] -75,https://delcopa.gov/publicrelations/releases/2021/covidtesting_darbyfeb3.html,Not Criminal Justice Related,200,"Delaware County Conducting Drive-Thru COVID-19 Testing in Darby during the Week of February 15 - Delaware County, Pennsylvania","","[""Delaware County Conducting Drive-Thru COVID-19 Testing in Darby during the Week of February 15""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -76,https://raleighnc.gov/safety/police-administrative-services-division,Resources,200,Police Administrative Services Division | Raleighnc.gov,"","[""Police Administrative Services Division\n""]","[""Main navigation"", ""Secondary"", ""Main navigation"", ""Share"", ""Contact"", ""Subscribe"", ""City of Raleigh/s social media accounts"", ""Select Language""]",[],[],[],[] -77,https://coloradosprings.gov/police-department/article/news/cspd-conduct-abandoned-or-out-compliance,Media Bulletins,200,CSPD to conduct Abandoned or Out of Compliance Vehicle Deployment | City of Colorado Springs,"","[""\nCSPD to conduct Abandoned or Out of Compliance Vehicle Deployment\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -78,https://es.carpinteriaca.gov/wp-content/uploads/2022/11/palms-copy-scaled.jpg,Poor Data Source,404,"","",,,,,, -79,https://coloradosprings.gov/police-department/article/news/i-25-traffic-safety-deployment-after-stop,Media Bulletins,200,I-25 Traffic Safety Deployment- After the Stop | City of Colorado Springs,"","[""\nI-25 Traffic Safety Deployment- After the Stop\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -80,https://dccouncil.gov/judiciary-public-safety/copy-of-ag0-fy-2019-proposed-schedule-a-two-position-changes-1/,Annual & Monthly Reports,200,Copy of AG0 FY 2019 Proposed Schedule A (Two Position Changes)-1 • Council of the District of Columbia,"","[""Copy of AG0 FY 2019 Proposed Schedule A (Two Position Changes)-1""]",[],[],[],[],[] -81,https://barnegatpolice.us/warrant-arrest-2/,Arrest Records,200,Warrant Arrest - Barnegat Township Police Department,"","[""Warrant Arrest""]","[""Warrant Arrest""]","[""\n\t\t\t\t\t\tAbout the Author: \t\t\t\t\t\tBTPD "", ""\n\t\t\t\t\t\tRelated Posts\t\t\t\t\t""]","[""Share This Story, Choose Your Platform!"", ""\n\n\t\t\t\t\t\tRobbery Arrest\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tDWI Arrest\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tDWI Arrest\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tRobbery Investigation Leads to Multiple Arrests, Recovery of Handgun\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tDWI Arrests\t\t\t\t\t\n"", ""Resources"", ""Directions"", ""Quick Links""]",[],[] -82,https://www.mass.gov/doc/606-cmr-1500-clean-copy/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -83,https://training.detroitmi.gov/bn/departments/paulaisa-baibhaaga/detroit-police-department-shield-program/paraogaraama-ebam-saebaa,Poor Data Source,503,"","",,,,,, -84,https://www.mass.gov/info-details/audit-of-the-massachusetts-commission-on-the-status-of-women-objectives-scope-and-methodology,Not Criminal Justice Related,200,"Audit of the Massachusetts Commission on the Status of Women Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Massachusetts Commission on the Status of Women.,"[""\nAudit of the Massachusetts Commission on the Status of Women Objectives, Scope, and Methodology\n""]","[""Table of Contents\n for the audit, Audit of the Massachusetts Commission on the Status of Women (MCSW)"", ""Table of Contents"", ""Overview\n "", ""Commissioner Appointments \n "", ""Open Meeting Law Compliance\n "", ""Certification of Online Training Program Completion\n "", ""MCSW Regional Commission Bylaws\n "", ""Data Reliability\n "", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -85,http://www.longbeach.gov/police/press-releases/pursuit-with-traffic-fatality---3rd-street-and-temple-avenue/,Media Bulletins,200,PURSUIT WITH TRAFFIC FATALITY - 3RD STREET AND TEMPLE AVENUE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -86,http://www.ryepolice.us/logs/police-logs-for-6-3-20-6-9-20,Daily Activity Logs,200,Rye Police Department Police Logs for 6/3/20-6/9/20 - Rye Police Department,"","[""Police Logs for 6/3/20-6/9/20""]","[""Police Logs for 6/3/20-6/9/20""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -87,http://www.ryepolice.us/logs/police-logs-for-11216-11816,Daily Activity Logs,200,Rye Police Department Police Logs for 11/2/16-11/8/16 - Rye Police Department,"","[""Police Logs for 11/2/16-11/8/16""]","[""Police Logs for 11/2/16-11/8/16""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -88,https://delcopa.gov/sheriff/pdf/atf_letter.pdf,Media Bulletins,200,"","",[],[],[],[],[],[] -89,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/010322arrests.pdf,Arrest Records,200,"","",[],[],[],[],[],[] -90,https://www.sandiego.gov/department-document/police-investigate-homicide-lincoln-park-0,Media Bulletins,200,Police Investigate Homicide In Lincoln Park | City of San Diego Official Website,"","[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Police Investigate Homicide In Lincoln Park"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -91,https://alpha.austin.gov/es/police-oversight/2020-08-26-2/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -92,https://wyoming.delaware.gov/police-department/irma/,Poor Data Source,200,Irma - Town of Wyoming,"","[""Wyoming""]","[""Delaware"", ""Irma""]","[""Menu"", ""Contact Us""]",[],[],[] -93,http://www.princetoniowa.us/chapter-30---police-department.html,Resources,200,CHAPTER 30 - Police Department,"",[],"[""Return to Table of Contents""]",[],[],[],[] -94,https://rexburg.us/police-identify-man-who-died-in-shooting-at-taylorsville-apartment-complex/,Poor Data Source,522,"","",,,,,, -95,https://bouldercolorado.gov/news/boulder-police-searching-additional-victims-witnesses-investigation,Media Bulletins,200,"Boulder Police Searching for Additional Victims, Witnesses in Investigation | City of Boulder","","[""Boulder Police Searching for Additional Victims, Witnesses in Investigation\n""]","[""Breadcrumb"", ""Details"", ""Keep Reading""]","[""\nBoulder Police and Boulder County Sheriff\u2019s Office Arrest Man in Shooting Incident\n\n"", ""\nBoulder Police Investigating Fatal Traffic Crash\n\n"", ""\nBoulder Police and Fire Communications Receives National Certification\n\n"", ""\nJonBenet Ramsey Homicide Investigation Update\u2014December 2023\n\n""]",[],[],[] -96,https://www.villageofallouezwi.gov/depts/police/prescription-drug-collections/,Resources,200,Prescription Drug Collection - Allouez WI,See a list of ongoing collection sites. Proper disposal of prescription drug collections is necessary to insure the drugs are completely destroyed.,"[""Prescription Drug Collections""]","[""Preparing Items for Drop Off"", ""Alternative Medication Drop Off Sites"", ""Public Safety Forms""]",[],"[""Allouez Village Hall"", ""How to Package Items for Drop Off"", ""Collected"", ""Not Collected"", ""PUBLIC SAFETY PAGES"", ""POLICE DEPARTMENT"", ""FIRE DEPARTMENT"", ""House Check Request""]","[""Subscribe to Village Updates""]",[] -97,https://www.southamptontownnypolice.gov/439/southampton-shinnecock-hills-tuckahoe-ca,Resources,200,"Southampton / Shinnecock Hills / Tuckahoe CAC | Southampton, NY - Official Website",Find out more about the Southampton / Shinnecock Hills / Tuckahoe Citizen Advisory Committee.,"[""\r\n\r\nSouthampton / Shinnecock Hills / Tuckahoe CAC \t\t""]","[""Meetings"", ""Members""]","[""Loading"", ""Site Tools"", ""Quick Links"", ""Contact Us"", ""Site Links""]",[],[],[] -98,https://cityofpowell.us/powell-police-officer-audrey-wilt-named-2022-cit-officer-of-the-year-by-delaware-morrow-mental-health-recovery-services-board/hrytzikwilt22citofficeroftheyear/,Poor Data Source,200,"City of Powell, Ohio | HrytzikWilt22CITOfficeroftheYear","","[""\n HrytzikWilt22CITOfficeroftheYear\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -99,https://southamptontownnypolice.gov/1702/lake-agawam--injection-well-prb-sh-villa,Not Criminal Justice Related,200,"Lake Agawam- Injection Well PRB (SH Village) | Southampton, NY - Official Website","","[""\r\n\r\nLake Agawam- Injection Well PRB (SH Village)\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]","[""Summary Sheet"", ""WQIPP - Fund Application""]",[],[] -100,https://www.mass.gov/event/jlmc-17-6105-watertown-police-association-3a-hearing-open-meeting-notice-05-09-2018-2018-05-09t100000-0400-2018-05-09t170000-0400,Misc Police Activity,200,JLMC-17-6105 Watertown Police Association 3(A) Hearing Open Meeting Notice 05-09-2018 | Mass.gov,JLMC-17-6105 Watertown Police Association 3(A) Hearing Open Meeting Notice 05-09-2018,"[""\n JLMC-17-6105 Watertown Police Association 3(A) Hearing Open Meeting Notice 05-09-2018 \n ""]","[""\n\nAddress\n"", ""Overview\n of JLMC-17-6105 Watertown Police Association 3(A) Hearing Open Meeting Notice 05-09-2018 "", ""Additional Resources\n for JLMC-17-6105 Watertown Police Association 3(A) Hearing Open Meeting Notice 05-09-2018 "", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -101,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/090721blotter.pdf,Calls for Service,200,"","",[],[],[],[],[],[] -102,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/012222blotter.pdf,Poor Data Source,404,"","",,,,,, -103,https://www.coppelltx.gov/939/events-activities,Not Criminal Justice Related,200,"Events & Activities | Coppell, TX","","[""\r\n\r\nEvents & Activities\t\t""]","[""Register for Classes!"", ""ADA Notice""]","[""Loading"", ""How to Register for Classes""]",[],[],[] -104,https://alpha.austin.gov/es/police-oversight/temporary-suspension-of-officer-william-norrell/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -105,https://alpha.austin.gov/police-oversight/2020-08-17-9/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -106,https://bouldercolorado.gov/news/police-chief-maris-herold-op-ed-police-reform,Media Bulletins,200,Police Chief Maris Herold Op-Ed on Police Reform | City of Boulder,"","[""Police Chief Maris Herold Op-Ed on Police Reform\n""]","[""Breadcrumb"", ""Details"", ""Holistic governance is key to police reform "", ""Keep Reading""]","[""\nBoulder Police and Boulder County Sheriff\u2019s Office Arrest Man in Shooting Incident\n\n"", ""\nBoulder Police Investigating Fatal Traffic Crash\n\n"", ""\nBoulder Police and Fire Communications Receives National Certification\n\n"", ""\nJonBenet Ramsey Homicide Investigation Update\u2014December 2023\n\n""]",[],[],[] -107,https://ose.louisiana.gov/event/police-communications-officer-20/,Poor Data Source,200,Police Communications Officer | Louisiana Office of State Examiner,"","["""", ""Police Communications Officer""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -108,https://www.stpaul.gov/departments/police/administration-office-chief/community-engagement-division/community-partnerships,Contact Info & Agency Meta,200,Community Partnerships Unit | Saint Paul Minnesota,Overview The City Wide Services Unit is part of the Operations Division of the Saint Paul Police Department and consists of the following seven (7) functio,"[""\nCommunity Partnerships Unit\n""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""\n In This Section\n "", ""Overview"", ""A Community Outreach Program (A.C.O.P.)"", ""\n Contact Us\n "", ""Footer""]","[""\n You are using an unsupported browser. Please use Microsoft Edge.\n "", ""\n Contact The City\n "", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[] -109,https://www.woburnma.gov/government/recreation/spring-summer-brochure-2018-final-copy/,Not Criminal Justice Related,200,Spring & Summer Brochure 2018 - City of Woburn,"","[""Spring & Summer Brochure 2018""]",[],"[""Get Text & Email Updates!""]","[""Post Details""]",[],[] -110,https://southamptontownnypolice.gov/faq.aspx?qid=270,Contact Info & Agency Meta,200,FAQs • Do I have to renew operating permits every year?,"",[],"[""\n\u25bc\r\nPublic Safety - Fire Prevention\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -111,https://brooklynwi.gov/open-house-brooklyn-police-dane-county-sheriffs-office-april-8-at-6pm-or-april-9-at-6pm-at-community-bldg/,Poor Data Source,200,Open House – Brooklyn Police – Dane County Sheriff’s Office – April 8 at 6pm or April 9 at 6pm at Community Bldg - Village of Brooklyn,"",[],"[""Open House \u2013 Brooklyn Police \u2013 Dane County Sheriff\u2019s Office \u2013 April 8 at 6pm or April 9 at 6pm at Community Bldg"", ""Post navigation""]","[""Contact Us"", ""Office Hours"", ""Department Contacts""]",[],[],[] -112,https://alpha.austin.gov/en/police-oversight/documents-regarding-the-use-of-racial-profiling-in-policin/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -113,https://ridgelandsc.gov/police-department/daily-arrest-reports-may,Arrest Records,200,Town of Ridgeland,Town of Ridgeland,"[""Police Department""]","[""Daily Arrest Reports - May""]",[],[],[],[] -114,https://www.mass.gov/doc/maldenpolicesergeant3554rtf/download,Poor Data Source,200,"","",[],[],[],[],[],[] -115,https://spdblotter.seattle.gov/2018/05/21/detective-cookies-urban-youth-chess-club-announces-kids-vs-cops-chess-rumble-tournament/,Misc Police Activity,200,Detective Cookie's Urban Youth Chess Club Announces “Kids Vs. Cops” Chess Rumble Tournament - SPD Blotter,"","[""Detective Cookie\u2019s Urban Youth Chess Club Announces \u201cKids Vs. Cops\u201d Chess Rumble Tournament""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -116,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0439/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -117,https://delcopa.gov/planning/programsandinitiatives/commissionsandtaskforces.html,Contact Info & Agency Meta,200,Commissions and Task Forces,"","[""Commissions and Task Forces""]",[],"[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -118,https://coloradosprings.gov/police-department/page/cases-interest-randy-bishop,Officer Involved Shootings,200,Cases of Interest: Randy Bishop | City of Colorado Springs,"","[""\nCases of Interest: Randy Bishop\n""]","[""Search"", ""CSPD Case of Interest: Randy Bishop Officer Involved Shooting"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],"[""Memorial Hospital Redacted Arrest Warrant for Randy Bishop"", ""Officer Becker Body Worn Camera: 01/11/2020, 11:57 PM"", ""\u00a0"", ""\u00a0"", ""Officer Becker Body Worn Camera: 01/12/2020, 12:02 AM"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""Officer Mattox Body Worn Camera: 01/11/2020, 11:59 PM"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""Officer Involved Shooting Redacted Arrest Warrant"", ""Officer Colliver, Murphy, Weems, and Owen's\u00a0Body Worn Camera: 01/26/2020,\u00a012:07 PM"", ""Redacted POWPO Arrest Warrant."", ""Court Conclusion""]","[""REPORT ONLINE""]",[] -119,https://www.wakeforestnc.gov/news/police-department-turkey-drive-continues-through-november-20,Media Bulletins,200,"Police Department Turkey Drive continues through November 20 | Town of Wake Forest, NC","The Wake Forest Police Department (WFPD) is accepting monetary donations through Saturday, Nov. 20, as part of its 15th Annual Turkey Drive. Area residents can support this worthy cause by submitting online donations via PayPal at http://bit.ly/WFPDTurkeyDrive.Cash and checks written to the Wake Forest Police Department are also accepted. Anyone wishing to contribute cash or","[""Police Department Turkey Drive continues through November 20""]","[""wake_forest_cares_wfc_2021-3_1.jpg"", ""Search form"", ""You are here""]",[],[],[],[] -120,https://delcopa.gov/row/pdf/2020/informationforcouplesgettingmarriedform.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -121,https://coloradosprings.gov/police-department/article/news/traffic-fatality-3500-block-austin-bluffs,Media Bulletins,200,Traffic Fatality 3500 Block of Austin Bluffs Parkway | City of Colorado Springs,"","[""\nTraffic Fatality 3500 Block of Austin Bluffs Parkway\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -122,https://delcopa.gov/courts/pdf/mdjlistmuni01jan2018.pdf,Contact Info & Agency Meta,200,"","",[],[],[],[],[],[] -123,https://www.mooresville.in.gov/event/police-commission-3/,Poor Data Source,200,Police Commission | Town of Mooresville,"","[""Police Commission""]","[""November 18, 2022 @ 5:00 pm - 6:00 pm"", "" Details "", "" Venue ""]",[],[],[],[] -124,https://delcopa.gov/planning/pdf/demodata/minoritypopulation2020map.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -125,http://lafayettepolice.us/208/police-officer-lateral-entry-program,Training & Hiring Info,200,"Police Officer Lateral Entry Program | Lafayette, IN - Official Website",The Lafayette Police Department has long recognized the value of those applicants who have law enforcement experience and provides starting salary/pay incentives commensurate with an applicant's experience.,"[""\r\n\r\nPolice Officer Lateral Entry Program\t\t""]","[""We Are Actively Looking For Lateral Police Officers To Join Us."", ""Transferring Officers""]","[""Loading"", ""Requirements"", ""About the Program"", ""Salary"", ""Paid Time Off"", ""Contact Us"", ""Lieutenant Randy Sherer"", ""Administrative Services Division"", """", """", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -126,https://www.pleasantprairiewi.gov/news/2016_news/shop_with_a_cop__firefighter,Misc Police Activity,200," - Shop with a Cop/Firefighter - Village of Pleasant Prairie -","",[],"[""Shop with a Cop/Firefighter""]","[""Follow Us on Social Media""]",[],[],[] -127,https://delcopa.gov/health/news/dchdtorelocatecovid19vaccinationclinics.html,Not Criminal Justice Related,200,"Environmental Health - Health Department - Delaware County, Pennsylvania","","[""Division of Environmental Health""]",[],"["""", ""Health Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -128,https://spdblotter.seattle.gov/2018/06/01/seattle-police-officer-charged-with-assault/,Poor Data Source,200,UPDATED: Seattle Police Officer Charged With Assault - SPD Blotter,"","[""UPDATED: Seattle Police Officer Charged With Assault""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -129,https://delcopa.gov/meo/careers/forensicinvestigator.html,Not Criminal Justice Related,200,"Forensic Investigator - Delaware County, Pennsylvania","","[""Forensic Investigator""]",[],"[""Qualifications"", ""Preferred Qualifications"", ""Responsibilities include but are not limited to"", ""Certifications"", ""Medical Examiner Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -130,http://www.longbeach.gov/police/press-releases/motorcycle-safety-operation-proves-effective/,Media Bulletins,200,MOTORCYCLE SAFETY OPERATION PROVES EFFECTIVE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -131,https://council.seattle.gov/2011/12/16/justice-department-findings-on-seattle-police/,Poor Data Source,200,Justice Department Findings on Seattle Police - Seattle City Council Blog,"","[""Justice Department Findings on Seattle Police""]",[],"[""HELPFUL LINKS"", ""Make your voice heard"", ""Councilmembers""]",[],[],[] -132,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/110221summary.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -133,https://www.mass.gov/doc/jlm-17-5884-city-of-quincy-and-quincy-police-patrol-officers-association-february-8-2019/download,Policies & Contracts,200,"","",[],[],[],[],[],[] -134,https://www.mass.gov/doc/2022-tewksbury-police-lieutenant-sole-assessment-employment-verification-form/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -135,https://www.newcastlewa.gov/departments/police/safe_place_program,Resources,200," - Safe Place Program - City of Newcastle -","",[],"[""City of Newcastle""]",[],"[""City of NewcastleWashington""]",[],[] -136,https://www.roseville.ca.us/government/departments/police_department/crime_log/crime_log_feb_15_-_feb_28__2020,Crime Maps & Reports,404,"","",,,,,, -137,https://springfield-or.gov/event/springfield-police-advisory-committee-spac-19/,Poor Data Source,200,Springfield Police Advisory Committee (SPAC) - City of Springfield Oregon,"",[],"[""Springfield Police Advisory Committee (SPAC)""]","[""December 1, 2022 @ 6:00 pm - 7:30 pm"", ""Event Navigation""]","[""Share This Story, Choose Your Platform!"", "" Details "", "" Venue "", ""Organizer""]",[],[] -138,https://delcopa.gov/departments/history.html,Not Criminal Justice Related,200,"History - At a Glance - Delaware County, Pennsylvania","","[""Your County at a Glance: History""]",[],"[""The History of Delaware County"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -139,https://www.stcharlesil.gov/events/public-meetings/2018-01-08-230000/regular-meeting-board-fire-and-police-commissioners,Poor Data Source,200,"Regular Meeting of the Board of Fire and Police Commissioners 1/8/2018 | Events | City of St Charles, IL",Regular Meeting of the Board of Fire and Police Commissioners on 1/8/2018,"[""\n\n City of St. Charles, Illinois \n"", ""Regular Meeting of the Board of Fire and Police Commissioners""]","[""You are here"", ""2nd Floor Fire Department Training Conference Room"", ""\n Committee/Commission "", ""\n View more events "", ""\n Documents on this site "", ""\n Accessibility "", ""\n Key Resources "", ""\n Connect With Us ""]",[],[],[],[] -140,https://www.mass.gov/doc/christine-kennedy-v-city-of-chicopee-school-dept/download,Court Cases,200,"","",[],[],[],[],[],[] -141,https://delcopa.gov/publicrelations/releases/2019/passportmonth.html,Not Criminal Justice Related,200,"September is National Passport Month - Delaware County, Pennsylvania","","[""September is National Passport Month""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -142,https://detroitmi.gov/departments/police-department/detroit-police-department-office-civil-rights/definitions-consent-decree,Policies & Contracts,200,Definitions of Consent Decree | City of Detroit,"On July 18, 2003 the Detroit Police Department, the City of Detroit and the United States Department of Justice entered into two consent decrees. The first consent decree deals with the Use of Force, Arrest and Witness Detention. The second decree concerns the Conditions of Confinement in our holding facilities.        1.  As used in this Agreement: a. The term “actively resisting” means the subject is making physically evasive movements to defeat an officer's attempt at control, including bracing, tensing, pulling away, or pushing.  b. The term “arrest” means a seizure of greater scope or duration than an investigatory or Terry stop. An arrest is lawful when supported by probable cause. c. The term “auditable form” or “auditable log” means a discrete record of the relevant information maintained separate and independent of blotters and other forms maintained by the DPD. d. The term “canine apprehension” means any time a canine is deployed and plays a clear and well-documented role in the capture of a person. The mere presence of a canine at the scene of an arrest shall not be counted as an apprehension. e. The term “canine bite ratio” means the number of apprehensions accomplished by means of a dog bite divided by the total number of apprehensions (both with and without a bite). f. The term “canine deployment” means any situation, except in cases involving an on-leash article search only, in which a canine is brought to the scene and either: i) the canine is released from the police car in furtherance of the police action; or ii) the suspect gives up immediately after an announcement is made that if he/she does not surrender the canine will be released. g. The term “City” means the City of Detroit, including its agents, officers and employees. h. The term “Collective Bargaining Agreements” means the labor agreements by and between the City and the Detroit Police Officers Association, the Detroit Police Lieutenants and Sergeants Association, the Detroit Police Command Officers Association, the Police Officer Labor Council, and Local 2394 of the American Federation of State, County, and Municipal Employees in effect on the effective date of this Agreement. i. The term “command investigation” means an investigation conducted by a DPD officer’s or employee’s supervisor. j. The term “complaint” means an allegation from any source of any misconduct by DPD personnel. k. The term “conveyance” means any instance when the DPD transports a non-DPD employee for any purpose. l. The term “critical firearm discharge” means each discharge of a firearm by a DPD officer with the exception of range and training discharges and discharges at animals. m. The term “DOJ” means the United States Department of Justice and its agents and employees. n. The term “DPD” means the Detroit Police Department, its agents and its employees (both sworn and unsworn). o. The term “DPD unit” means any officially designated organization of officers within the DPD, including precincts and specialized units. p. The term “discipline” means a written reprimand, suspension, demotion or dismissal. q. The term “effective date” means the day this Agreement is entered by the Court. r. The term “escorting” means the use of light physical pressure to guide a person, or keep a person in place. s. The term “FTO” means a field training officer. t. The term “force” means the following actions by an officer: any physical strike or instrumental contact with a person; any intentional attempted physical strike or instrumental contact that does not take effect; or any significant physical contact that restricts the movement of a person. The term includes the discharge of firearms; the use of chemical spray, choke holds or hard hands; the taking of a subject to the ground; or the deployment of a canine. The term does not include escorting or handcuffing a person, with no or minimal resistance. Use of force is lawful if it is objectively reasonable under the circumstances and the minimum amount of force necessary to effect an arrest or protect the officer or other person. u. The term “hard hands” means using physical pressure to force a person against an object or the ground, or the use of physical strength or skill that causes pain or leaves a mark. v. The term “hold” means any outstanding charge(s) or warrant(s) other than those which serve as the predicate for the current arrest. w. The term “IAD” means the section of the DPD that investigates serious uses of force and allegations of criminal misconduct by DPD employees. x. The term “including” means “including, but not limited to.” y. The term “injury” means any impairment of physical condition or pain. z. The term “investigatory stop,” or “Terry stop,” means a limited seizure. An investigatory stop is lawful when supported by reasonable suspicion and narrowly tailored in scope and duration to the reasons supporting the seizure. aa. The term “material witness” means a witness subpoenaed to testify in a criminal case. bb. The term “misconduct” means any conduct by a DPD employee that violates DPD policy or the law. cc. The term “non-disciplinary corrective action” means counseling, training or other action apart from discipline taken by a DPD supervisor to enable or encourage an officer to modify or improve his or her performance. dd. The term “OCI” means the Office of the Chief Investigator, which has responsibility for investigating external complaints. ee. The term “parties” means the DOJ, the City and the DPD. ff. The term “police officer” or “officer” means any law enforcement officer employed by the DPD, including supervisors. gg. The term “prisoner injury” means an injury, or complaint of injury, that occurs in the course of taking or after an individual was taken into DPD custody that is not attributed to a use of force by a DPD employee. hh. The term “probable cause” means a reasonable belief that an individual has committed, is committing, or is about to commit an offense. ii. The term “prompt judicial review” means the presentment of an arrestee before a court of appropriate jurisdiction for a probable cause determination as soon after an arrest as is reasonably feasible. A reasonably feasible time period is the period of time necessary to schedule the arraignment and complete the administrative processing of the arrestee and shall not exceed 48 hours of the arrest, absent extraordinary circumstances. jj. The term “proper use of force decision making” means the use of reasonable force, including proper tactics, and de-escalation techniques. kk. The term “reasonable suspicion” means the specific facts and reasonable inferences drawn from those facts to convince an ordinarily prudent person that criminality is at hand. ll. The term “seizure,” or “detention,” means any restriction on the liberty interest of an individual. A seizure occurs when an officer's words or actions convey to a reasonable person that he or she is not free to leave. mm. The term “serious bodily injury” means an injury that involves a loss of consciousness, extreme physical pain, protracted and obvious disfigurement, protracted loss or impairment of the function of a body part or organ, or a substantial risk of death. nn. The term “serious use of force” means any action by a DPD officer that involves: i) the use of deadly force, including all critical firearms discharges; ii) a use of force in which the person suffers serious bodily injury or requires hospital admission; iii) a canine bite; and iv) the use of chemical spray against a restrained person. oo. The term “shall” means that the provision imposes a mandatory duty. pp. The term “supervisor” means a sworn DPD employee at the rank of sergeant or above and non-sworn employees with oversight responsibility for DPD employees.","[""\nDefinitions of Consent Decree\n""]","[""Top Links"", ""Site Menu""]","[""\u00a0""]",[],[],[] -143,https://delcopa.gov/publicrelations/releases/2020/delcoraterminated2.html,Not Criminal Justice Related,200,"Delaware County Council Terminates DELCORA - Delaware County, Pennsylvania","","[""Delaware County Council Terminates DELCORA""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""In a 4-0 vote, County Council terminated DELCORA and returned control to County taxpayers""]",[],[] -144,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0376-3/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -145,http://www.lafayettepolice.us/152/animal-control,Contact Info & Agency Meta,200,"Animal Control | Lafayette, IN - Official Website","","[""\r\n\r\nAnimal Control\t\t""]","[""Officer Hours"", ""Reporting Issues & Concerns""]","[""Loading"", ""Contact Us"", ""Animal Control Office"", ""Hours"", ""Quick Links"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -146,http://www.longbeach.gov/police/press-releases/murder-2300-blk-spaulding/,Poor Data Source,200,MURDER 2300 BLK SPAULDING,"","[""Long BeachPolice Department""]",[],[],[],[],[] -147,https://police.greenvillesc.gov/faq.aspx?qid=443,Not Criminal Justice Related,200,FAQs • One of the “nodes” is close to where I live. How soon,"",[],"[""\n\u25bc\r\nGVL2040 Comprehensive Plan - Report to the Community FAQs\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -148,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/112821blotter.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -149,http://www.lafayettepolice.us/2338/housing,Not Criminal Justice Related,200,"Housing | Lafayette, IN - Official Website","","[""\r\n\r\nHousing\t\t""]","[""Realtor John Townsend - Trueblood Real Estate"", ""FirstOption Mortgage"", ""Bradford Place Apartments"", ""James Management Group""]","[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -150,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/051521blotter.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -151,https://www.mass.gov/doc/jlm-13-2733-city-of-beverly-and-beverly-police-superiors-association-july-29-2015/download,Policies & Contracts,200,"","",[],[],[],[],[],[] -152,https://townofnederland.colorado.gov/police,Contact Info & Agency Meta,200,Law Enforcement | Town of Nederland,"","[""\nLaw Enforcement\n""]","[""Police Services""]","[""\n"", """", ""\n"", ""\n\n\n\n Pay a Fine or Ticket\n \n\n"", ""\n\n\n\n Police Records Request\n \n\n"", ""\n\n\n\n Kudos and Concerns\n \n\n"", """", ""\n\n\n\n Colorado Sex Offender Registry\n \n\n"", ""\n\n\n\n Notice: Fingerprinting Services Discontinued\n \n\n"", ""\n"", ""\n""]",[],[],"[""Contact Info"", ""Want to leave some feedback for an officer? Fill out the form below with as much information as you would like, and we will send it to the Boulder County Sheriff Office for review. You can leave contact information, or leave it black if you wish to remain anonymous.""]" -153,http://www.lafayettepolice.us/296/compliments-concerns,Poor Data Source,200,"Compliments & Concerns | Lafayette, IN - Official Website",We encourage citizens to send in their commendations and complaints so that we can continue growing with our community.,"[""\r\n\r\nCompliments & Concerns\t\t""]","[""Commendations""]","[""Loading"", ""Ways to Send a Compliment"", ""Reasons For Commendation"", ""Received Commendations"", ""Contact Us"", ""Captain Brian Gossard"", """", ""Police Department"", """", ""FAQs"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -154,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-results-1-/,Media Bulletins,200,DUI SATURATION PATROL RESULTS(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -155,https://chandlerazpd.gov/police-facilities/desert-breeze-substation/,Contact Info & Agency Meta,200,Desert Breeze Substation – Chandler Police Department,"","[""Desert Breeze Substation""]",[],"[""Precinct Leadership"", ""Precinct Headquarters"", ""Quick Links"", ""Police Facilities"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n""]","[""Zac Cummard - Commander"", "" Contact"", "" About the Department"", "" Latest News"", ""\n Courage, Pride, Dedication\n \n \u00a9 2024 Chandler Police Department \n""]",[],[] -156,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2019_news_releases/police_arrest_three_zion_men_in_kidnapping_event,Media Bulletins,200," - Police Arrest Three Zion Men in Kidnapping Event - Village of Pleasant Prairie -","",[],"[""Police Arrest Three Zion Men in Kidnapping Event""]","[""Follow Us on Social Media""]",[],[],[] -157,http://www.longbeach.gov/police/press-releases/murder---6400-block-of-coronado-avenue/,Media Bulletins,200,MURDER - 6400 block of Coronado Avenue,"","[""Long BeachPolice Department""]",[],[],[],[],[] -158,https://www.townofhamburgny.gov/citizens-police-academy/,Training & Hiring Info,404,"","",,,,,, -159,https://delcopa.gov/vote/pdf/2022/p2022-write-in-cumulation-request.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -160,https://www.roseville.ca.us/government/departments/police_department/crime_log/crime_log_oct_03_-_oct_16__2020,Crime Maps & Reports,404,"","",,,,,, -161,https://www.clarkstown.gov/police/child-safety-seats/,Media Bulletins,200," - Child Safety Seats – Town of Clarkstown ","","[""Child Safety Seats""]","[""Town of Clarkstown"", ""Town of Clarkstown"", ""Child Safety Seats"", ""Schedule A Car Seat Appointment"", ""NYS Child Restaint Law FAQ"", ""Government"", ""How Do I?"", ""Quick Links""]","[""Town of Clarkstown"", ""Town of Clarkstown"", ""Town of Clarkstown"", ""Sign up for our Newsletter"", ""\u00a9 2021 Town of Clarkstown""]",[],"[""The next child seat event will be on Sunday February 19th from 9am till 12pm at the Bardonia Fire House.\u00a0\u00a0""]","[""Departments"", ""Sign Up"", ""Find"", ""Apply"", ""Report"", ""Pay For""]" -162,https://detroitmi.gov/departments/police-department/abandoned-vehicle,Policies & Contracts,200,Abandoned Vehicle | City of Detroit,"Abandoned vehicles create community problems. Street cleaning and snow removal become difficult tasks with abandoned vehicles in the way. Abandoned vehicles in yards are possible fire hazards. Abandoned vehicles project a negative image of our city. Together, we can give Detroit the necessary makeover to produce clean streets. If the vehicle is your own: move it, have it towed, or donate it. If the vehicle is not yours; REPORT it to your local police precinct. City Ord. - Sec. 55-6-85. When are vehicles deemed abandoned. The following conditions are required before any vehicle shall be deemed to be an abandoned vehicle: (1) The vehicle shall be abandoned when it has remained on a public street, highway, alley or public place for a period of forty-eight (48) continuous hours or more and from its condition and the surrounding circumstances, shall reasonably appear to be unclaimed, discarded, deserted or abandoned. (2) A vehicle is deemed abandoned on private property when it has remained on the private property for a period of forty-eight (48) continuous hours or more without the consent of the owner or lessee of the property, or for a period of forty-eight (48) continuous hours or more after the consent of the owner has been revoked. (Code 1964, § 38-15-2)","[""\nAbandoned Vehicle\n""]","[""Top Links"", ""Site Menu"", ""News & Events"", ""Contacts""]",[],[],[],[] -163,http://www.lafayettepolice.us/1879/water-tips,Not Criminal Justice Related,200,"Water Tips | Lafayette, IN - Official Website",Tips on water consumption and water equipment.,"[""\r\n\r\nWater Tips\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -164,https://springfield-or.gov/copy-of-springfield-police-seeking-community-input-via-online-survey/,Poor Data Source,200,Springfield Police Seeking Community Input Via Online Survey - City of Springfield Oregon,"","[""Springfield Police Seeking Community Input Via Online Survey""]",[],[],[],[],[] -165,https://hollister.ca.gov/government/city-departments/police/social-networking/,Contact Info & Agency Meta,200,"Social Networking – City of Hollister, California","",[],[],"[""Follow Us on..."", ""Follow HPD\u2026."", ""Hollister Police Social Media Guide"", ""We are Hiring"", ""Follow Us on....""]",[],[],[] -166,https://www.antioch.il.gov/wpfb-file/03-10-17-police-and-fire-agenda-pdf-3/,Poor Data Source,200,"03-10-17 Police And Fire Agenda - Antioch, IL",9106 03 10 17 police and fire agenda pdf commissions commission agendas 2017 1489012459 ab4ffd3c187e6425c1be0346d2cb25ab 219x300 _3ldvcho1f1gc thumb jpg 08 34 19 0 pdf application trustees mary c dominiak ed macek jerry t johnson scott a pierce jay jozwiak ted p poulos lawrence m hanson mayor lori k romine village clerk notice of public meeting,"[""03-10-17 Police And Fire Agenda""]",[],[],[],[],[] -167,https://www.mass.gov/doc/anderson-deborah-v-boston-police-department-71510/download,Court Cases,200,"","",[],[],[],[],[],[] -168,https://spdblotter.seattle.gov/2012/08/28/two-arrested-for-trying-to-pimp-undercover-cops-at-westlake/,Media Bulletins,200,Two Arrested For Trying to Pimp Undercover Cops At Westlake - SPD Blotter,"","[""Two Arrested For Trying to Pimp Undercover Cops At Westlake""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -169,http://www.tampa.gov/police/recruit-scholarship-program,Resources,200,Police Recruit Scholarship Program | City of Tampa,"The Tampa Police Department seeks the best possible candidates to become police officers with our agency. The department seeks those who have an interest in law enforcement and have no prior law enforcement certification. In order to attract the best-qualified candidates, the department developed the Police Recruit Scholarship Program. Those selected for this program are enrolled in the local Police Academy.","[""Police Recruit Scholarship Program\n""]","[""Police Department"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[] -170,http://lafayettepolice.us/340/guard-rail-repair-replacement,Not Criminal Justice Related,200,"Guard Rail Repair & Replacement | Lafayette, IN - Official Website",The Lafayette Street Department maintains and repairs publicly owned guard rails within the City. ,"[""\r\n\r\nGuard Rail Repair & Replacement\t\t""]",[],"[""Loading"", ""Contact Us"", ""\n"", ""\n\r\nDan Crowell"", ""Street Department"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -171,https://www.montgomeryohio.gov/topics/police-safety-programs/,Poor Data Source,200,"Police Safety Programs Toggle Archives - Montgomery, Ohio","","[""FAQ Topic: Police Safety Programs Toggle""]","[""Primary menu links"", ""Action toolbar"", ""Speaker Requests"", ""Safety Village"", ""Safe Zone for Online Purchases"", ""Neighborhood Watch"", ""HomeSafe Checks"", ""Fingerprinting"", ""Community Emergency Response Team (CERT)1"", ""Background Record Check"", ""Welcome"", ""Engage"", ""Help"", ""Mental Health Resource""]",[],[],[],[] -172,https://chandlerazpd.gov/2013/07/prescription-medication-drop-boxes-now-accessible-in-all-chandler-police-stations/,Media Bulletins,200,Prescription Medication Drop-Boxes Now Accessible In All Chandler Police Stations – Chandler Police Department,"","[""Prescription Medication Drop-Boxes Now Accessible In All Chandler Police Stations""]",[],"[""Quick Links"", ""News Archives"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n""]","[""\n\n\t\tJuly 26, 2013\t\n"", "" Contact"", "" About the Department"", "" Latest News"", ""\n Courage, Pride, Dedication\n \n \u00a9 2024 Chandler Police Department \n""]",[],[] -173,https://www.mass.gov/doc/2022-dalton-police-sergeant-sole-assessment-center-examination-employment-verification-form/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -174,https://southamptontownnypolice.gov/775/county-road-39-corridor,Not Criminal Justice Related,200,"County Road 39 Corridor Land Use Plan | Southampton, NY - Official Website","","[""\r\n\r\nCounty Road 39 Corridor Land Use Plan\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]",[],[],[] -175,https://www.stcharlesil.gov/news/2018/07/25/police-bike-patrol-unit-patrols-where-cars-can%e2%80%99t,Poor Data Source,200,"Police Bike Patrol Unit Patrols Where Cars Can’t | News | City of St Charles, IL",City news: Police Bike Patrol Unit Patrols Where Cars Can’t,"[""\n\n City of St. Charles, Illinois \n"", ""Police Bike Patrol Unit Patrols Where Cars Can\u2019t""]","[""You are here"", ""\n Key Resources "", ""\n Connect With Us ""]",[],[],[],[] -176,https://www.mass.gov/doc/appendix-x-family-assistance-copayments-and-deductibles-0/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -177,https://www.elburn.il.us/event/board-of-police-commissioners-2022-09-22/,Poor Data Source,404,"","",,,,,, -178,https://www.coppelltx.gov/faq.aspx?qid=142,Not Criminal Justice Related,200,FAQs • Can I have a birthday party at Life Safety Park?,"",[],"[""\n\u25bc\r\nLife Safety Park\t\t"", ""About the Park"", ""Teachers"", ""Parents/Caregivers"", ""Helpful Resources"", ""Teachers"", ""Parents/Caregivers""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -179,https://www.montebelloca.gov/departments/police/divisions/patrol/district_policing,Contact Info & Agency Meta,200,"","",[],[],[],[],[],[] -180,https://www.mass.gov/doc/randolph-covered-police-firefighterpdf/download,Poor Data Source,200,"","",[],[],[],[],[],[] -181,https://brookfieldil.gov/village-manager-selects-new-police-chief/petrak-press-release/,Media Bulletins,404,"","",,,,,, -182,https://delcopa.gov/courts/judges/pileggi.html,Poor Data Source,200,Judge Dominic F. Pileggi - Delaware County Court of Common Pleas,"","[""Judge Dominic F. Pileggi""]",[],"[""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[] -183,https://pittsburghpa.gov/files/police/orders/ch4/43-10.01-juvenile-policy-legal-mandates-regarding-child-abuse.pdf,Poor Data Source,404,"","",,,,,, -184,https://www.providenceri.gov/hr/wellness/cop-manage-anxiety-9-11/,Poor Data Source,200,City of Providence CoP Manage Anxiety 9.11 - City of Providence,"","[""CoP Manage Anxiety 9.11""]","[""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""SIGN UP FOR OUR WEEKLY E-NEWS | \nHaga clic aqu\u00ed para espa\u00f1ol"", ""Lists*""]",[],[],[] -185,https://spdblotter.seattle.gov/2017/01/07/police-respond-to-three-fatal-heroin-overdoses-remind-public-of-good-samaritan-law/,Media Bulletins,-1,"","",,,,,, -186,https://champaignil.gov/2012/05/14/police-respond-to-weapon-call-central-high-school-610-w-university-ave/,Media Bulletins,200,"Police Respond to Weapon Call (Central High School, 610 W. University Ave.) - City of Champaign","","[""Police Respond to Weapon Call (Central High School, 610 W. University Ave.)""]","[""News Releases"", ""Department News""]",[],[],[],[] -187,https://www.ci.plymouth.mi.us/services/police,Poor Data Source,200," - Police - City of Plymouth, MI -","","[""Police""]",[],[],[],[],[] -188,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0202/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -189,https://www.rentonwa.gov/city_hall/police/police_services/special_operations,Contact Info & Agency Meta,200," - Special Operations - City of Renton -","","[""CITY OF RENTON\r\n\t\t\t\t\tWASHINGTON""]","[""Special Operations""]",[],"[""SWAT"", ""Directed Enforcement Team (DET)"", ""Special Enforcement Team (SET)"", ""Drug Activity and Reporting""]",[],[] -190,https://alpha.austin.gov/es/police-oversight/2020-06-05-13/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -191,https://dagsboro.delaware.gov/ngg_tag/new-police-cars/,Poor Data Source,200,New Police Cars Archives - Town of Dagsboro,"",[],"[""Images tagged \""new-police-cars\""""]","[""Menu"", ""Online Payments"", ""Agendas & Minutes"", ""Contact Us"", ""Connect With Us!""]",[],[],[] -192,https://norfolkne.gov/government/departments/police-division/press-releases/may-13th-press-release.html,Media Bulletins,200,"May 13th Press Release - City of Norfolk, NE","","[""City of Norfolk, NE"", ""Police Division"", ""May 13th Press Release""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]" -193,https://www.coppelltx.gov/faq.aspx?qid=106,Not Criminal Justice Related,200,FAQs • Is it legal to burn trash in Coppell?,"",[],"[""\n\u25bc\r\nFire Department - Services & Education\t\t"", ""Helpful Resources"", ""Helpful Resources"", ""Helpful Resources"", ""Helpful Resources"", ""Emergency Medical Services (EMS) Patient Medical Records and/or Medical Billing Records""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -194,https://police.bixbyok.gov/faq.aspx?qid=83,Resources,200,FAQs • How do I change my password?,"",[],"[""\n\u25bc\r\nNixle Alert System\t\t""]","[""Loading"", ""Categories"", ""Live Edit"", ""Helpful Links"", ""FAQs"", ""Site Links""]",[],[],[] -195,https://beaumonttexas.gov/beaumont-police-arrest-3-for-aggravated-sexual-assault-aggravated-robbery-and-aggravated-kidnapping-1155-ih-10-n/,Poor Data Source,404,"","",,,,,, -196,https://police.crystalmn.gov/police/services/request_a_report,Records Request Info,200," - Request a Report - City of Crystal-Police -","","[""Request a Report""]",[],"[""Sign up for a city newsletter or notification."", ""Police Department"", ""Lobby Hours:""]","[""Report requests will be processed within 10 business days."", ""Monday - Friday""]",[],[] -197,https://www.southamptontownnypolice.gov/608/animal-control,Not Criminal Justice Related,200,"Animal Control | Southampton, NY - Official Website","","[""\r\n\r\nAnimal Control\t\t""]","[""Cruelty & Neglect Complaints"", ""Resources"", ""SPCAs, Humane Societies & Shelters"", ""Government Agencies"", ""Law Enforcement Sites"", ""Animal Control Agencies"", ""Miscellaneous Local Links"", ""Dog Licenses""]","[""Loading"", ""Site Tools"", ""Contact Us"", ""Animal Control Office"", ""Ryan Murphy"", """", ""FAQs"", ""Contact Us"", ""Site Links""]",[],[],[] -198,https://www.lomalinda-ca.gov/services/police_department/tips,Resources,200," - Tips - City of Loma Linda -","","[""Tips""]",[],[],"[""City Hall Hours:"", ""Building & Safety Hours:"", ""Quick Links:""]",[],[] -199,https://www.mass.gov/doc/sco-pace-disenrol-scopdf/download,Not Criminal Justice Related,-1,"","",,,,,, -200,https://www.mass.gov/doc/unit-5-cops-salary-chart-effective-742021/download,Poor Data Source,200,"","",[],[],[],[],[],[] -201,https://www.fortworthtexas.gov/departments/police/events/police-chief-finalist,Poor Data Source,404,"","",,,,,, -202,https://www.antioch.il.gov/wpfb-file/police-blotter-02-01-21-to-02-07-21-pdf/,Arrest Records,200,"Police Blotter 02-01-21 To 02-07-21 - Antioch, IL",17529 police blotter 02 01 21 to 07 pdf police_department police_blotters 2021 1625764667 887817471521d7d07cbd900fcd6c9e7e c0831aa0de873faa40423ef928807e829deda5db0008083727a1946e5c9c09fc 300x160 _crkpbiaiahbd thumb jpg 03 16 08 52 34 0 207 46 13 189 23 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17 pagefailed_18 pagefailed_19 pagefailed_20 pagefailed_21 pagefailed_22,"[""Police Blotter 02-01-21 To 02-07-21""]",[],[],[],[],[] -203,http://www.cityofpataskalaohio.gov/cop_people/tom-lee/,Not Criminal Justice Related,200,Tom Lee - City Of Pataskala,Official Website,"[""\n\t\t\t\tCity Of Pataskala\t\t\t"", ""\n\t\t\t\t\tTom Lee\t\t\t\t""]","[""\n\t\t\t\tOfficial Website\t\t\t""]",[],"[""\n\t\t\t\t\t\tTom LeeCouncil Member Ward 1\n""]",[],[] -204,https://hutchinsonmn.gov/document_category/police/,Poor Data Source,200,Police Archives - City of Hutchinson,"","[""Police""]","[""Footer""]",[],[],[],[] -205,https://www.mass.gov/doc/gardnerpolicesergeant2119rtf/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -206,https://www.ci.oakley.ca.us/police-accident-reports/,Accident Reports,200,Police Accident Reports - City of Oakley,"","[""Police Accident Reports""]",[],[],[],[],[] -207,https://delcopa.gov/jdboard/index.html,Contact Info & Agency Meta,200,"Board of Managers of Juvenile Detention - Delaware County, Pennsylvania","","[""Board of Managers of Juvenile Detention""]",[],"[""Mission"", ""Board Members"", ""MEETING SCHEDULE"", ""BYLAWS"", ""ORDINANCE"", ""HELPFUL RESOURCES"", ""NEWS RELEASES"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""2024""]",[],[] -208,https://barnegatpolice.us/wpdmpro-sitemap.xml,Poor Data Source,200,"","",[],[],[],[],[],[] -209,https://www.ci.san-bernardino.ca.us/city_hall/police_department/over_100_years_of_service/historical_photos,Not Criminal Justice Related,200," - Historical Photos - City of San Bernardino -","","[""City of San Bernardino California""]","[""Historical Photos""]",[],[],[],[] -210,https://delcopa.gov/council/2018minutes/103118minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -211,http://www.longbeach.gov/police/press-releases/civilian-employee-arrested/,Media Bulletins,200,CIVILIAN POLICE DEPARTMENT ARRESTED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -212,https://hollister.ca.gov/government/city-departments/police/incident-reports/,Resources,200,"Incident Reports – City of Hollister, California","",[],[],"[""Follow Us on..."", ""Hollister Police Incident Report"", ""Incident Reporting"", ""We are Hiring"", ""Follow Us on....""]",[],[],[] -213,"https://norfolkne.gov/government/departments/police-division/press-releases/february-14,-2022-press-release.html",Media Bulletins,200,"February 14, 2022 Press Release - City of Norfolk, NE","","[""City of Norfolk, NE"", ""Police Division"", ""February 14, 2022 Press Release""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]" -214,https://www.southamptontownnypolice.gov/faq.aspx?qid=138,Training & Hiring Info,200,FAQs • How can I find out about any job opportunities?,"",[],"[""\n\u25bc\r\nHuman Resources\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -215,http://www.lafayettepolice.us/714/city-website-policy,Not Criminal Justice Related,200,"City Website Policy | Lafayette, IN - Official Website","The City of Lafayette, IN local government agency is committed to protecting the rights of all our website visitors. We recognize our obligation to keep sensitive information secure and have created this privacy statement to share our information gathering and dissemination practices for this website. ","[""\r\n\r\nCity Website Policy\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -216,https://www.bedminster.us/government/police/vision__mission___core_values/body_camera,Poor Data Source,200," - Body Camera - Township of Bedminster -","","[""Bedminster Township""]","[""Body Camera""]","[""Bedminster Township""]",[],[],[] -217,https://www.mass.gov/doc/tavares-bruce-v-fall-river-police-department-51707/download,Court Cases,200,"","",[],[],[],[],[],[] -218,https://delcopa.gov/vote/pdf/2021/delco-boe-meeting-notice_certification-municipal-primary-results_6-7-2021.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -219,https://delcopa.gov/sheriff/pdf/list1.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -220,http://www.lafayettepolice.us/3469/gis-zoning-maps,Resources,200,"GIS & Zoning Maps | Lafayette, IN - Official Website","Check whether you are in city limits, what your zoning is and property owner information.","[""\r\n\r\nGIS & Zoning Maps\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -221,https://www.east-windsor.nj.us/police-athletic-league,Misc Police Activity,200,"Official Website of East Windsor Township, New Jersey - Police Athletic League","",[],"[""Police Athletic League""]",[],[],[],[] -222,http://www.longbeach.gov/police/press-releases/murder2/,Media Bulletins,200,MURDER (HARBOR AVE & 15TH ST.),"","[""Long BeachPolice Department""]",[],[],[],[],[] -223,https://www.tukwilawa.gov/departments/police/annual-reports/pd-2004report/,Poor Data Source,200,PD-2004report - City of Tukwila,"","[""City of Tukwila News""]","[""PD-2004report""]",[],"[""\nCity of Tukwila\n""]","[""I am a..."", ""Online Services"", ""Most Requested Forms""]",[] -224,https://springfield-or.gov/city/police-department/patrol/k9-team/,Contact Info & Agency Meta,200,K-9 Program - City of Springfield Oregon,"","[""Springfield Police K-9 Program""]",[],[],"[""Police""]",[],[] -225,https://www.stpaul.gov/departments/police/administration-office-chief/community-engagement-division/special-events-application-sppd,Not Criminal Justice Related,200,Special Events Application (SPPD) | Saint Paul Minnesota,"Please read and follow all directions to ensure processing and permit submissions are complete. Incomplete applications will not be processed. Click on each link below in sequential order:Per City Ordinance, all recurring events are required to submit their application ninety (90) days in advance of the event. NEW events must submit no less than sixty (60) days prior. If your event is happening within that 60 day window, please call first to determine whether the application can be processed.","[""\nSpecial Events Application (SPPD)\n""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Footer""]","[""\n You are using an unsupported browser. Please use Microsoft Edge.\n "", ""Please read and follow all directions to ensure processing and permit submissions are complete.\u00a0Incomplete applications will not be processed.\u00a0Click on each link below in sequential order:"", ""2024 Event Applications:"", ""\n Contact The City\n "", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[] -226,https://www.lynchburgvapolice.gov/wp-content/uploads/2021/06/lpd-seal-e1662580813573.png,Poor Data Source,404,"","",,,,,, -227,https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/citations-for-summary-of-policy-language-recommendations/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -228,https://detroitmi.gov/departments/police-department/detroit-police-department-shield-program/detroit-police-shield-partners,Contact Info & Agency Meta,200,Detroit Police Shield Partners | City of Detroit,"","[""\nDetroit Police Shield Partners\n""]","[""Top Links"", ""Site Menu""]",[],"[""CONTACTS""]",[],[] -229,https://www.mass.gov/info-details/audit-of-the-office-for-refugees-and-immigrants-objectives-scope-and-methodology,Not Criminal Justice Related,200,"Audit of the Office for Refugees and Immigrants Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Office for Refugees and Immigrants.,"[""\nAudit of the Office for Refugees and Immigrants Objectives, Scope, and Methodology\n""]","[""Table of Contents\n for the audit, Audit of the Office for Refugees and Immigrants"", ""Appendix\n "", ""Table of Contents"", ""Overview\n "", ""Data Reliability\n "", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -230,https://delcopa.gov/dropbox/,Not Criminal Justice Related,200,Untitled Document,"",[],[],[],[],[],[] -231,https://delcopa.gov/sustainability/presentations/22/06ruthabbe.pptx,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -232,http://www.longbeach.gov/police/press-releases/public-s-help-needed-in-hit-and-run-investigation/,Media Bulletins,200,Public's Help Needed in Hit and Run Investigation,"","[""Long BeachPolice Department""]",[],[],[],[],[] -233,https://takomaparkmd.gov/government/police/covid-19-info-resources/,Not Criminal Justice Related,404,"","",,,,,, -234,https://www.southamptontownnypolice.gov/faq.aspx?qid=259,Not Criminal Justice Related,200,FAQs • Does the shelter have a veterinary clinic?,"",[],"[""\n\u25bc\r\nPublic Safety - Animal Shelter\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -235,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/arrests/092322arrests.pdf,Poor Data Source,404,"","",,,,,, -236,http://www.lafayettepolice.us/456/special-events,Not Criminal Justice Related,200,"Facilities | Lafayette, IN - Official Website",View the 3 different aquatic facilities that open to the public.,[],[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]","[""\nCastaway Bay\n"", ""\nTropicanoe Cove\n""]",[],[] -237,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/082621summary.pdf,Daily Activity Logs,200,"","",[],[],[],[],[],[] -238,https://www.mass.gov/doc/handout-for-the-may-24-2018-design-public-hearing-in-chicopee/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -239,https://oceancitymd.gov/oc/ocean-city-police-sergeant-retires-after-27-years-of-service/,Media Bulletins,200,"Ocean City Police Sergeant Retires After 27+ Years of Service – Town of Ocean City, Maryland","","[""Ocean City Police Sergeant Retires After 27+ Years of Service""]","[""Post navigation""]","[""Related posts""]",[],[],[] -240,https://delcopa.gov/sustainability/commission/meetingminutes/sustainabilitycommissionkick-offmeetingminutesoct2020.pdf,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -241,https://delcopa.gov/publicrelations/publicrelations/releases/2020/herobowlboard.html,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -242,https://www.mass.gov/doc/minutes-of-april-2019-chicopee/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -243,https://www.roseville.ca.us/government/departments/police_department/divisions/police_explorers,Resources,200," - Police Explorers - City of Roseville -","","[""City of Roseville""]","[""Police Explorers""]","[""Roseville Police Department ""]",[],[],[] -244,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-130-2010-state-police-expertise-pay,Media Bulletins,200,State Police Bulletin No. SP-130 | Office of the New York State Comptroller,To notify the Division of State Police of the new Additional Pay code and procedures for processing Expertise Pay,"[""\nState Police Bulletin No. SP-130\n"", "" ""]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Background"", ""Effective Date(s)"", ""Payment Information and Eligibility Criteria"", ""OSC Actions"", ""Control-D Report"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]","[""NPAY770 One Time Payment Report""]",[] -245,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/080822summary.pdf,Poor Data Source,404,"","",,,,,, -246,https://www.antioch.il.gov/wpfb-file/10-22-13-police-and-fire-agenda-pdf-3/,Poor Data Source,200,"10-22-13 Police And Fire Agenda - Antioch, IL",9062 10 22 13 police and fire agenda pdf commissions commission agendas 2013 1381956042 206c0dca275a24506b8ab566c4ad85f9 213x300 _kkntdsgansvd thumb jpg 16 15 40 42 0 pdf application trustees dennis b crosby scott a pierce mary c dominiak ted p poulos jerry t johnson george sakas lawrence m hanson mayor lori k folbrick village clerk notice of,"[""10-22-13 Police And Fire Agenda""]",[],[],[],[],[] -247,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/053022blotter.pdf,Poor Data Source,404,"","",,,,,, -248,https://www.lynchburgvapolice.gov/news-updates/homicide-1100-blk-of-15th-street/,Media Bulletins,200,HOMICIDE 1100-BLK OF 15TH STREET - Lynchburg Police Department,"","[""HOMICIDE 1100-BLK OF 15TH STREET""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[] -249,https://www.antioch.il.gov/wpfb-file/04-19-16-police-pension-agenda-pdf/,Media Bulletins,200,"04-19-16 Police Pension Agenda - Antioch, IL",8427 04 19 16 police pension agenda pdf commissions fund agendas 2016 1460742126 02c861b2676b01cc56cb3a86703c52d6 213x300 _extdmrzqpxvu thumb jpg 15 12 42 06 0 pdf application trustees mary c dominiak ed macek jerry t johnson scott a pierce jay jozwiak ted p poulos lawrence m hanson mayor lori k folbrick village clerk agenda of antioch lake,"[""04-19-16 Police Pension Agenda""]",[],[],[],[],[] -250,https://delcopa.gov/publicrelations/releases/2020/pdf/citizencorpsorienationfeb21.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -251,https://piedmont.ca.gov/services___departments/police/transparency_portal/training_materials,Policies & Contracts,200," - Training Materials - City of Piedmont -","","[""\r\n City of\r\n Piedmont""]",[],[],[],[],[] -252,https://police.birminghamal.gov/command-staff/lieutenant-richard-haluska/,Contact Info & Agency Meta,200,Lieutenant Richard Haluska | Birmingham Police Department,"","[""\n\n\n Birmingham Police Department\n\n\t\t\t\t\tCommitment | Excellence | Integrity\t\t\t\t\n\n""]","[""Putting People First"", ""Lieutenant Richard Haluska""]",[],"[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[] -253,https://cityofgulfbreeze.us/staff/police-general/,Contact Info & Agency Meta,200,Police General - City of Gulf Breeze,"","[""Police General""]","[""Mobile Menu"", ""Before Header"", ""Header Right"", ""Police General"", ""Primary Sidebar"", ""Footer"", ""\nWhat can we help you find?\n""]","[""Colleagues"", ""Police Redlight"", ""Police Permits"", ""No Active Advisories"", "" City Projects"", ""Get Text Updates"", ""City of Gulf Breeze"", ""Most Requested"", ""County Agencies"", ""State Sites""]","[""Highpoint Water Main Replacement"", ""Eufaula Outfall Treatment Unit \u2013 RESTORE"", ""Fairpoint Septic-to-Sewer (STS) Conversion"", ""City Hall""]",[],[] -254,https://southamptontownnypolice.gov/1151/sustainability---transportation,Not Criminal Justice Related,404,"","",,,,,, -255,https://spdblotter.seattle.gov/2014/07/02/ive-got-a-pistol-too-man-tells-police-before-officer-involved-shooting/,Media Bulletins,200,"""I've Got a Pistol, Too"" Man Tells Police Before Officer-Involved Shooting - SPD Blotter","","[""\u201cI\u2019ve Got a Pistol, Too\u201d Man Tells Police Before Officer-Involved Shooting""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -256,https://www.southamptontownnypolice.gov/137/town-council-office,Not Criminal Justice Related,200,"Town Council Office | Southampton, NY - Official Website",Meet the town's council members.,"[""\r\n\r\nTown Council Office\t\t""]","[""Members"", ""About the Council""]","[""Loading"", ""Site Tools"", ""Legal Authority"", ""Contact Us"", ""Paula Godfrey"", """", ""Tajea Anderson"", ""Contact Us"", ""Site Links""]",[],[],[] -257,https://spdblotter.seattle.gov/2008/10/02/seattle-police-investigate-possible-attempt-abduction/,Media Bulletins,200,Seattle Police Investigate Possible Attempt Abduction - SPD Blotter,"","[""Seattle Police Investigate Possible Attempt Abduction""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -258,https://sanfordfl.gov/wp-content/uploads/2020/07/police_employment.jpg,Poor Data Source,200,"","",[],[],[],[],[],[] -259,https://harrington.delaware.gov/links-forms/citizens-police-academy-flyer/,Poor Data Source,200,Citizen’s Police Academy Flyer - City of Harrington,"","[""HARRINGTON""]","[""Citizen\u2019s Police Academy Flyer""]","[""Menu""]","[""\u00a0"", "" Quick Links"", ""To view City of Harrington Meeting Agendas, click on the Civic Web Logo above""]",[],[] -260,https://spdblotter.seattle.gov/2013/07/23/police-investigating-gunfire-in-rainier-beach/,Media Bulletins,200,Police Investigating Gunfire In Rainier Beach - SPD Blotter,"","[""Police Investigating Gunfire In Rainier Beach""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -261,https://chandlerazpd.gov/2013/01/chandler-police-explorers-host-competition-2/,Media Bulletins,200,Chandler Police Explorers Host Competition – Chandler Police Department,"","[""Chandler Police Explorers Host Competition""]",[],"[""Quick Links"", ""News Archives"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n""]","[""\n\n\t\tJanuary 17, 2013\t\n"", "" Contact"", "" About the Department"", "" Latest News"", ""\n Courage, Pride, Dedication\n \n \u00a9 2024 Chandler Police Department \n""]",[],[] -262,https://dps.georgia.gov/job-vacancy-announcement-georgia-capitol-police-officer-four-positions-0,Media Bulletins,200,Job Vacancy Announcement-Georgia Capitol Police Officer (Four Positions) | Georgia Department of Public Safety,Job Vacancy Announcement: Georgia Capitol Police Officer (Four Positions)Location: Capitol Police Division- Capitol Hill- Atlanta (Fulton County),"[""\n Job Vacancy Announcement-Georgia Capitol Police Officer (Four Positions)\n \n ""]","[""Main navigation"", ""Search this site"", ""Breadcrumb"", ""How can we help?"", ""About Us"", ""Get in Touch""]","[""Popular searches"", ""Call Us"", ""Visit"", ""Mail"", ""Hours""]",[],[],[] -263,http://www.longbeach.gov/police/press-releases/murder-investigation6/,Media Bulletins,200,MURDER INVESTIGATION (500 BLOCK OF RHEA STREET),"","[""Long BeachPolice Department""]",[],[],[],[],[] -264,https://police.greenvillesc.gov/faq.aspx?qid=317,Resources,200,FAQs • Where are you located?,"",[],"[""\n\u25bc\r\nMunicipal Court - General\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -265,https://southamptontownnypolice.gov/722/great-east-end-cleanup---2022,Poor Data Source,404,"","",,,,,, -266,http://www.ryepolice.us/parking/attachment/parkingappeal-2,Resources,200,Rye Police Department Parking Appeal Form - Rye Police Department,"","[""Parking Appeal Form""]","[""Parking Appeal Form""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -267,https://www.roseville.ca.us/government/departments/electric_utility/about_us/building_and_renovation_copy/request_for_proposal_archived,Poor Data Source,200," - Bids & RFP's - City of Roseville -","","[""City of Roseville""]","[""Bids & RFP's""]","[""City of Roseville""]",[],[],[] -268,https://www.knoxvilletn.gov/archived_news_stories/2009/knoxville_police_prepared_for_holiday_traffic,Media Bulletins,200," - Knoxville Police Prepared For Holiday Traffic - City of Knoxville -",communications*,"[""Knoxville Police Prepared For Holiday Traffic"", ""Communications Director"", ""Knoxville Police Prepared For Holiday Traffic""]",[],[],[],[],[] -269,https://coloradosprings.gov/police-department/article/news/colorado-springs-police-departments-k9-zev,Media Bulletins,200,Colorado Springs Police Department’s K9 Zev to get donation of body armor | City of Colorado Springs,"","[""\nColorado Springs Police Department\u2019s K9 Zev to get donation of body armor\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -270,https://rexburg.us/police-identify-woman-killed-in-9-vehicle-crash-in-sandy/,Poor Data Source,522,"","",,,,,, -271,https://beaumonttexas.gov/beaumont-police-investigating-homicide-4300-woodlawn/,Poor Data Source,404,"","",,,,,, -272,https://delcopa.gov/sustainability/pdf/raise/trailplanappendixe.pdf,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -273,https://www.mass.gov/doc/chaves-david-v-boston-police-department-related-superior-court-order-42711/download,Court Cases,200,"","",[],[],[],[],[],[] -274,https://www.ci.vallejo.ca.us/our_city/departments_divisions/police_department,Contact Info & Agency Meta,200," - Home - City of Vallejo Police Department -","","[""Our mission""]",[],"[""Vallejo Police Department""]",[],[],[] -275,https://www.mass.gov/doc/shackford-michael-v-boston-police-department-72414/download,Court Cases,200,"","",[],[],[],[],[],[] -276,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/041422blotter.pdf,Poor Data Source,404,"","",,,,,, -277,https://www.ci.san-bernardino.ca.us/city_hall/police_department/emergency_management/cert/cert_basic_training,Not Criminal Justice Related,200," - CERT Basic Training - City of San Bernardino -","","[""City of San Bernardino California""]","[""CERT Basic Training""]",[],[],[],[] -278,https://beaumonttexas.gov/beaumont-police-investigating-aggravated-robbery-2568-college/,Poor Data Source,404,"","",,,,,, -279,https://police.crystalmn.gov/police/community_outreach/run_for_leo,Misc Police Activity,200," - Crystal K9 Run - City of Crystal-Police -","","[""Crystal K9 Run""]",[],"[""Sign up for a city newsletter or notification."", ""Police Department"", ""Lobby Hours:""]","[""Monday - Friday""]",[],[] -280,https://wyoming.delaware.gov/wp-content/uploads/sites/33/nggallery/3rd-annual-wyoming-police-department-fishing-derby/p1010878.jpg,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -281,http://www.longbeach.gov/police/press-releases/robbery-suspects-arrestd-and-charged/,Media Bulletins,200,ROBBERY SUSPECTS ARRESTD and CHARGED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -282,https://www.huntsvilleal.gov/huntsville-police-launch-summer-slowdown-campaign/,Media Bulletins,200,Huntsville Police Launch Summer Slowdown Campaign - City of Huntsville,"","[""Huntsville Police Launch Summer Slowdown Campaign""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],"[""WATCH\n\nSummer Slowdown: Construction Zones"", ""Summer Slowdown: Daily Commute "", ""Summer Slowdown: Neighborhoods"", """"]","[""Browse By Month "", ""Browse By Category "", ""Share & Print""]",[] -283,https://ose.louisiana.gov/event/supervisor-of-police-records/,Poor Data Source,200,Supervisor of Police Records | Louisiana Office of State Examiner,"","["""", ""Supervisor of Police Records""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -284,https://alpha.austin.gov/es/police-oversight/2021-03-05-7/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -285,https://alpha.austin.gov/police-oversight/formal-complaint-follow-up-investigations/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -286,http://www.ryepolice.us/logs/police-logs-for-4-8-20-4-15-20,Daily Activity Logs,200,Rye Police Department Police Logs for 4/8/20-4/15/20 - Rye Police Department,"","[""Police Logs for 4/8/20-4/15/20""]","[""Police Logs for 4/8/20-4/15/20""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -287,http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested-and-charges-filed/,Media Bulletins,200,ROBBERY SUSPECT ARRESTED AND CHARGES FILED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -288,https://delcopa.gov/ich/resources/healthclinics.html,Not Criminal Justice Related,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -289,https://www.mass.gov/doc/revocation-establishment-and-merging-of-police-promotional-eligible-lists-4/download,Policies & Contracts,200,"","",[],[],[],[],[],[] -290,https://champaignil.gov/tag/coffee-with-a-cop/,Misc Police Activity,200,Coffee with a Cop Archives - City of Champaign,"","[""Items tagged: Coffee with a Cop""]","[""Champaign Police Join Community for Coffee with a Cop"", ""Champaign Police Pull Up a Chair for Coffee with a Cop"", ""Champaign Police Announces Return of \u201cCoffee with a Cop\u201d"", ""Champaign Police Invite Community Members for Coffee and Conversation"", ""Champaign Police Invite Community Members for Coffee and Conversation"", ""News Releases"", ""Department News""]",[],[],[],[] -291,https://coloradosprings.gov/police-department/article/news/update-attempted-homicide-4300-block,Media Bulletins,200,Update: Attempted Homicide 4300 block of Airport Road | City of Colorado Springs,"","[""\nUpdate: Attempted Homicide 4300 block of Airport Road\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -292,https://www.sanramon.ca.gov/our_city/departments_and_divisions/police/srpd_calendar,Poor Data Source,200," - SRPD Calendar - City of San Ramon -","","[""SRPD Calendar""]","[""Contact Us"", ""Useful Links""]",[],[],[],[] -293,https://alpha.austin.gov/es/police-oversight/formal-complaint-family-violence-involving-mental-illness-and-other-policy-violations/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -294,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0765/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -295,https://delcopa.gov/publicrelations/releases/2021/covid_vaccinebooster.html,Media Bulletins,200,"Delaware County COVID-19 Task Force Offering COVID-19 Vaccine Booster Beginning Sept. 28 - Delaware County, Pennsylvania","","[""Delaware County COVID-19 Task Force Offering COVID-19 Vaccine Booster Beginning Sept. 28""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -296,https://ridgelandsc.gov/police-department/daily-crime-reports-may,Crime Maps & Reports,200,Town of Ridgeland,Town of Ridgeland,"[""Police Department""]","[""Daily Crime Reports - May""]",[],[],[],[] -297,https://alpha.austin.gov/police-oversight/formal-complaints-de-escalation-of-potential/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -298,https://delcopa.gov/courts/pdf/emergencyjudicialorders/fourthorderextendingstayofresidentialpropertyejectment.pdf,Court Cases,200,"","",[],[],[],[],[],[] -299,https://delcopa.gov/publicrelations/releases/2020/councilreforms.html,Not Criminal Justice Related,200,"During Their First Public Meeting Delaware County Council Announces Reforms to Make Government More Open and Accessible to Residents and Workers - Delaware County, Pennsylvania","","["" County Council Announces Reforms ""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],"[""\u00a0"", ""New Majority Announces Public Process to Develop and \r\n\t\t Implement Broad Ethics and Government""]",[] -300,http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested---charges-filed/,Media Bulletins,200,ROBBERY SUSPECT ARRESTED & CHARGES FILED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -301,https://champaignil.gov/tag/champaign-police-officers/,Poor Data Source,200,Champaign Police Officers Archives - City of Champaign,"","[""Items tagged: Champaign Police Officers""]","[""Champaign Police Respond to Call for Service; Two Officers Shot, Suspect Deceased"", ""News Releases"", ""Department News""]",[],[],[],[] -302,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-25-fitness-payment,Media Bulletins,200,State Police Bulletin No. SP-25 | Office of the New York State Comptroller,Investigators and Senior Investigators in bargaining unit 62 are entitled to their final fitness payment,"[""\nState Police Bulletin No. SP-25\n"", "" ""]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Employees Affected"", ""Payroll Register/Check Stub"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[] -303,https://delcopa.gov/planning/pdf/applicationforact247review.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -304,http://www.police.wallingfordct.gov/divisions/,Contact Info & Agency Meta,200,"Divisions | Wallingford, CT Police Department","The Wallingford Police Department consists of six divisions as well as several units, each with their own area of responsibility in keeping our town safe.","[""Divisions""]",[],[],[],[],[] -305,http://lafayettepolice.us/3391/census-2020,Not Criminal Justice Related,200,"Census 2020 | Lafayette, IN - Official Website",Complete Count Committee resources,"[""\r\n\r\nCensus 2020\t\t"", ""The Census: Your Response Matters!"", ""CENSUS IS HIRING IN GREATER LAFAYETTE!""]","[""Health clinics. Fire departments. Schools. Even roads and highways. The census can shape many different aspects of your community.\u00a0"", ""Learn more about the Census and why it\u2019s so important""]","[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -306,https://mattoon.illinois.gov/government/police-department/police-officer-hiring/,Training & Hiring Info,200,"Police Officer Hiring Information - City of Mattoon, Illinois","","[""Becoming a Police Officer""]",[],"[""Mattoon Police Department Contact Information"", ""Police Department Links"", ""City Departments""]","[""Popular Links"", ""Business"", ""City Employees"", ""Residents"", ""Mattoon City Info""]",[],[] -307,https://www.elburn.il.us/village-staff-directory/name/police-and-fire-emergencies/,Poor Data Source,200,"Police and Fire Emergencies | Village Staff Directory | Village of Elburn, Illinois","","[""Police and Fire Emergencies | Village Staff Directory""]","["" Police and Fire Emergencies\n""]",[],[],"[""Links"", ""Main Contact Info"", ""Follow Us""]",[] -308,http://lafayettepolice.us/3469/gis-zoning-maps,Not Criminal Justice Related,200,"GIS & Zoning Maps | Lafayette, IN - Official Website","Check whether you are in city limits, what your zoning is and property owner information.","[""\r\n\r\nGIS & Zoning Maps\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -309,https://www.antioch.il.gov/event/police-and-fire-commission/,Poor Data Source,200,"Police and Fire Commission - Antioch, IL","","[""Police and Fire Commission""]",[],[],[],[],[] -310,http://www.rocklin.ca.us/news/rocklin-appoints-police-chief-chad-butler-interim-city-manager,Media Bulletins,200,Rocklin Appoints Police Chief Chad Butler as Interim City Manager - City of Rocklin,"","[""\nCity of Rocklin\n"", ""\nRocklin Appoints Police Chief Chad Butler as Interim City Manager\n""]","[""\n\nFacebook\n\n"", ""\n\nTwitter\n\n"", ""\n\nInstagram\n\n"", ""\n\nContact Us\n\n"", ""\n\nAgendas & Minutes\n\n"", ""\n\nCalendar\n\n"", ""\n\nDepartments\n\n"", ""\n\nMunicipal Code\n\n"", ""\n\nPublic Hearing Notices\n\n"", ""\n\nTransparency\n\n"", ""\n\nWebsite Feedback\n\n"", ""Share this page"", ""This item appears in"", ""Locations"", ""\n\nCity Hall\n\n"", ""\n\nCorp Yard\n\n"", ""\n\nHistorical Sites\n\n"", ""\n\nFire Administration\n\n"", ""\n\nParks\n\n"", ""\n\nPolice Station\n\n"", ""\n\nQuarry Park\n\n"", ""Resources"", ""\n\nAccessibility / ADA Information\n\n"", ""\n\nEmployment\n\n"", ""\n\nBids and RFPs\n\n"", ""\n\nSitemap\n\n"", ""\n\nVolunteer\n\n"", ""\n\nWeb Policies\n\n"", ""Connect"", ""\n\nContact Us\n\n"", ""\n\nCity Newsroom\n\n"", ""\n\nCity Phone Numbers\n\n"", ""\n\neNewsletter Signup\n\n"", ""\n\nSocial Media\n\n"", ""Get Started"", ""\n\nCity Council Agendas\n\n"", ""\n\nAgendas & Public Notices\n\n"", ""\n\nQuarry Park\n\n"", ""\n\nJob Openings\n\n"", ""\n\nRent a Venue\n\n"", ""\n\nReport a Community Issue\n\n"", ""\n\nView Traffic Alerts\n\n"", ""\n\nPolice Department\n\n"", ""Proud Partners"", ""\n\nQuarry Park\n\n"", ""\n\nAstound Broadband\n\n"", ""\n\nRocklin, California\n\n"", ""Log in"", ""Commands""]",[],[],[],[] -311,https://www.rentonwa.gov/city_hall/police/administrative_services/community_programs/renton_police_safe_place,Resources,200," - Renton Police Safe Place - City of Renton -","","[""CITY OF RENTON\r\n\t\t\t\t\tWASHINGTON""]","[""Renton Police Safe Place""]",[],"[""How It Works"", ""The Importance of Reporting Hate Crimes"", ""Ways to Report Hate Crimes"", ""Information for Participating Businesses and Organizations"", ""How can my business or organization participate?"", ""What are my responsibilities?"", ""Our Partners""]","[""Renton PD Safe Place Program Liaison""]","[""Ofcr. Roseanne Hynes""]" -312,https://police.greenvillesc.gov/1757/reserve-a-conference-room,Not Criminal Justice Related,200,"My Account • Greenville, SC • CivicEngage","Engage your community – connect to news, events and information you care about.","[""Website Sign In""]","[""Sign In""]","[""Loading""]",[],[],[] -313,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/march-16-activity-report/,Incident Reports,200,March 16 Activity Report - Town of Cheswold,"","[""Cheswold""]","[""Delaware"", ""March 16 Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[] -314,https://alpha.austin.gov/police-oversight/formal-complaint-acts-bringing-discredit-4/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -315,https://coloradosprings.gov/police-department/page/colorado-springs-police-cadet-program-0,Resources,200,Colorado Springs Police Cadet Program | City of Colorado Springs,"","[""\nColorado Springs Police Cadet Program\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],"[""\u00a0"", ""\u00a0"", ""Colorado Springs Police Cadet Program"", ""Program Requirements"", ""Activities"", ""Training"", ""Application""]","[""REPORT ONLINE""]",[] -316,https://delcopa.gov/employment/jobpostings/dba.html,Not Criminal Justice Related,200,"Database Administrator - Delaware County, Pennsylvania","","[""Database Administrator""]",[],"[""Delco Jobs Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Summary"", ""Essential Duties"", ""Qualifications"", ""Contact""]",[],[] -317,https://champaignil.gov/2020/08/18/chief-of-police-anthony-cobb-issues-statement-regarding-vandalism-of-champaign-police-department/,Media Bulletins,200,Chief of Police Anthony Cobb Issues Statement Regarding Vandalism of Champaign Police Department - City of Champaign,"","[""Chief of Police Anthony Cobb Issues Statement Regarding Vandalism of Champaign Police Department""]","[""News Releases"", ""Department News""]",[],[],[],[] -318,https://champaignil.gov/police/news-data/police-body-cameras/,Media Bulletins,200,Police Body Cameras - City of Champaign,"","[""Police Body Cameras"", ""Frequently Asked Questions\u00a0"", ""Policy and Reports""]","[""Police Department"", ""Quick Links"", ""Police Department News"", ""Contact Us""]",[],"[""\n\n Q: Will all CPD Officers wear body cameras? \n \n"", ""\n\n Q: Where will the body cameras be placed on the officer\u2019s uniform? \n \n"", ""\n\n Q: Does the officer need to ask my consent to record? \n \n"", ""\n\n Q: What if I don\u2019t want to be recorded?\n \n"", ""\n\n Q: Are police body cameras on at all times?\n \n"", ""\n\n Q: When is an officer able to turn his or her body camera off?\n \n"", ""\n\n Q: Will the Department now have a full account of what takes place during an incident? \n \n"", ""\n\n Q: How will the video recordings be stored and how long do you keep them?\n \n"", ""\n\n Q: Will the Department continue its use of in-car cameras? \n \n"", ""\n\n Q: Who do I contact if I have a question or complaint about an officer\u2019s decision to activate or deactivate his or her body camera?\n \n""]",[],[] -319,https://biloxi.ms.us/podcast/meet-biloxi-police-fire-at-a-fun-event/,Poor Data Source,200,City of Biloxi | The Official Website of the City of Biloxi,"",[],[],"[""News from the City of Biloxi""]",[],[],[] -320,https://delcopa.gov/planning/planningeducation.html,Not Criminal Justice Related,200,Planning Education,"","[""Planning Education""]",[],"[""I\u2019m interested in\u2026"", ""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -321,https://claytonca.gov/police/community-youth-outreach/smart911/,Media Bulletins,200,Smart911 – City of Clayton,"","[""Smart911""]",[],"[""Apply for"", ""View"", ""Rent/Reserve"", ""Report"", ""Learn About"", ""Request"", ""Register"", ""Press Release"", ""How Does Smart911 Help?"", ""Fact Sheet"", ""Frequently Asked Questions"", ""City Offices are located at:"", ""Clayton City Hall\n6000 Heritage Trail, Clayton, CA 94517"", """", ""Staff is available during our office hours:"", ""Monday to Thursday 9:00 a.m. to 5:00 p.m."", """", ""Telephone: (925) 673-7300"", ""Fax: (925) 672-4917\n"", ""Online: City Hall Form "", """", ""More Contact Information""]",[],[],[] -322,https://www.arlingtonva.us/government/programs/housing/housing-arlington-latest-news/county-board-reviews-scope-and-charge-for-missing-middle-housing-study,Not Criminal Justice Related,200,County Board Reviews Scope and Charge for Missing Middle Housing Study – Official Website of Arlington County Virginia Government,"September 23, 2020 | Updated: October 2, 2020 PROGRAM NEWS:Study Kick Off Scheduled for Oct. 28 at 7 p.m.At a work session on Sept. 22, the County Board reviewed and discussed a revised Missing Middle Housing Study Scope and Charge, which was shaped by community feedback and...","[""County Board Reviews Scope and Charge for Missing Middle Housing Study""]",[],"[""CONTACT US"", ""QUICK LINKS"", ""CONNECT"", ""STAY INFORMED""]",[],[],[] -323,http://lafayettepolice.us/1693/fountain-plaza-and-sculptures,Not Criminal Justice Related,200,"Fountain Plaza and Sculptures | Lafayette, IN - Official Website","","[""\r\n\r\nFountain Plaza and Sculptures\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -324,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0716/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -325,https://sanramon.ca.gov/our_city/departments_and_divisions/police/community_programs/youth_services/police_explorers,Misc Police Activity,200," - Police Explorers - City of San Ramon -","","[""Police Explorers""]","[""Contact Us"", ""\nPolice Explorers"", ""Contact Us"", ""Useful Links""]",[],[],[],[] -326,http://lafayettepolice.us/455/aquatics,Not Criminal Justice Related,200,"Aquatics | Lafayette, IN - Official Website","Take a look at the 3 different aquatic centers open to the public and find out how to book a private party, sign up for programs and more.","[""\r\n\r\nAquatics\t\t""]",[],"[""Loading"", ""News Flash"", ""January 2024"", ""Alerts"", ""FAQs"", ""Contact Us"", ""FAQs"", ""Site Links""]","[""\nParks Department is Hiring Seasonal Positions! \n"", ""\n2024 Lifeguard Certification Course Registration Open Now! \n""]",[],[] -327,http://police.portlandmaine.gov/396/tickets,Contact Info & Agency Meta,200,"Tickets | Portland, ME - Official Website","Welcome to the beautiful historic City of Portland. We hope you enjoy your visit. We encourage you to make use of our many conveniently located parking garages and lots. For your convenience, we’ve included a link to view the downtown Portland.","[""Tickets""]",[],[],[],[],[] -328,https://www.normanok.gov/public-safety/police-department/divisions/investigations/registered-offenders,Resources,200,"Registered Offenders | City of Norman, OK",A listing of all registered offenders in the City of Norman,"[""City of Norman, OK"", ""City of Norman, OK"", ""Registered Offenders\n""]","[""What can we help you find?"", ""Breadcrumb"", ""Footer menu"", ""Footer Second Column"", ""Connect with Us""]","[""Public Safety""]","[""\nNOTICE\n"", ""\nNOTICE\n"", ""\nNOTICE\n""]","[""Winter Weather Information"", ""Business and Citizen Self-Service Portal"", ""Information on City Council and Committee Meetings""]",[] -329,https://delcopa.gov/vote/pdf/2021/delcoboardelections_meeting_legalnotice_0407-2021.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -330,https://www.mooresville.in.gov/event/mpd-police-commission-meeting-3/,Poor Data Source,200,MPD Police Commission Meeting – Cancelled | Town of Mooresville,"","[""MPD Police Commission Meeting \u2013 Cancelled""]","[""May 21, 2020 @ 6:00 pm - 7:00 pm"", "" Details "", ""Organizer"", "" Venue ""]",[],[],[],[] -331,https://coloradosprings.gov/city-council/article/public-notice/police-cso-graduation,Media Bulletins,200,Police CSO Graduation | City of Colorado Springs,"","[""\nPolice CSO Graduation\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -332,https://www.coppelltx.gov/340/get-involved,Resources,200,"Get Involved | Coppell, TX",There are a variety of ways that you can volunteer with the Cozby Library and Community Commons or other community organizations.,"[""\r\n\r\nGet Involved\t\t""]","[""Library Volunteers""]","[""Loading"", ""Adult Volunteers"", ""Friends of the Cozby Library & Community Commons"", ""Teen Volunteers"", ""Volunteer Opportunities in DFW""]",[],[],[] -333,https://alpha.austin.gov/es/police-oversight/2020-08-14-3/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -334,https://www.knoxvilletn.gov/archived_news_stories/2010/knoxville_police_prepared_for_increase_of_holiday_,Media Bulletins,200," - Knoxville Police Prepared for Increase of Holiday Traffic - City of Knoxville -",communications*,"[""Knoxville Police Prepared for Increase of Holiday Traffic"", ""Communications Director"", ""Knoxville Police Prepared for Increase of Holiday Traffic""]",[],[],[],[],[] -335,http://www.lafayettepolice.us/faq.aspx?qid=142,Not Criminal Justice Related,200,FAQs • What are the benefits of designating my property as p,"",[],"[""\n\u25bc\r\nHistoric Preservation Commission\t\t"", """"]","[""Loading"", ""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -336,https://police.kingstontn.gov/events/categories/,Poor Data Source,200,Categories – Kingston Police Department,"","[""Categories""]",[],[],[],[],[] -337,https://www.plymouthmi.gov/government/departments/police/preliminary_breath_tests,Contact Info & Agency Meta,200," - Preliminary Breath tests - City of Plymouth, MI -","","[""Preliminary Breath tests""]",[],[],[],[],[] -338,https://www.minneapolismn.gov/government/departments/police/professional-standards/discipline-matrix/,Policies & Contracts,200,Discipline Matrix and Narrative - City of Minneapolis,You can read how the Minneapolis Police Department (MPD) imposes employee discipline. ,"[""Discipline matrix and narrative"", ""Need help? We're here for you.""]","[""What to know"", ""Documents"", ""Contact us""]","[""\n\r\n Discipline matrix and narrative\r\n \n"", ""Minneapolis Police Department"", ""Connect with the Minneapolis Police Department""]","["" Request accessible format""]",[],[] -339,https://cityofpowell.us/powell-police-searching-for-suspect-after-attempted-home-robbery/41-3/,Poor Data Source,200,"City of Powell, Ohio | 41.3","","[""\n 41.3\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -340,https://ci.san-bernardino.ca.us/city_hall/police_department/online_reports,Poor Data Source,200," - Online Reports - City of San Bernardino -","","[""City of San Bernardino California""]","[""Online Reports""]",[],[],[],[] -341,https://delcopa.gov/treasurer/pdf/2021reassessmentvalues/03.pdf,Poor Data Source,200,"","",[],[],[],[],[],[] -342,https://delcopa.gov/publicrelations/releases/2019/domesticviolenceawareness.html,Media Bulletins,200,"Recognizing October as Domestic Violence Awareness Month - Delaware County, Pennsylvania","","[""Recognizing October as Domestic Violence Awareness Month""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -343,https://virginiabeach.gov/whats-up/whats-new/commonwealth-v-nathaniel-lee-campbell-maximum-sentence-of-10-years-for-man-who-killed-military-police-officer-in-crash,Media Bulletins,404,"","",,,,,, -344,http://www.lafayettepolice.us/759/burn-leaves-on-a-city-street,Media Bulletins,200,"Burn Leaves on a City Street | Lafayette, IN - Official Website",Can I burn leaves on a City street?,"[""\r\n\r\nBurn Leaves on a City Street\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -345,https://cityofpowell.us/government/employment-opportunities/police-officer-selection-process/,Training & Hiring Info,200,"City of Powell, Ohio | Police Officer Selection Process","","[""\n Police Officer Selection Process\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -346,https://www.normanok.gov/public-safety/police-department/community-outreach/citizens-police-academy,Poor Data Source,200,"Citizens Police Academy | City of Norman, OK",The Citizens Police Academy offers citizens insight into how police officers perform their duties and how the department serves the community.  The success of any police agency depends largely upon the cooperation and support it receives from the citizens it serves.,"[""City of Norman, OK"", ""City of Norman, OK"", ""Citizens Police Academy\n""]","[""What can we help you find?"", ""Breadcrumb"", ""\n Contact NPD\n"", ""Footer menu"", ""Footer Second Column"", ""Connect with Us""]","[""Community Outreach""]","[""\nNOTICE\n"", ""\nNOTICE\n"", ""\nNOTICE\n""]","[""Winter Weather Information"", ""Business and Citizen Self-Service Portal"", ""Information on City Council and Committee Meetings""]",[] -347,https://www.dps.arkansas.gov/law-enforcement/arkansas-state-police/divisions/crimes-against-children/,Contact Info & Agency Meta,200,Crimes Against Children - Arkansas Department of Public Safety,"","["" Flag Status""]","[""Crimes Against Children"", ""Reports of Child Maltreatment"", ""Crimes Against Children Division Commander & Staff"", ""Crimes Against Children Division Administrators"", ""Crimes Against Children Area Administrators"", ""Contact ASP"", ""Helpful ASP links"", ""Connect with ASP"", ""Respect. Integrity. \nCUSTOMER SERVICE. TEAMWORK. \nSERVANT LEADERSHIP. \nCONTINUOUS IMPROVEMENT"", """", ""\u00a9 2024 All rights Reserved. Arkansas.gov ""]","[""Major Jeffrey Drew"", ""Dan Mack"", ""Kalika Rogers"", ""Tonya Tackett"", ""Sara King"", ""Jamey Nesbitt"", ""Lee Ann Stidham"", ""Tara Flute"", ""Michelle Gatlin"", ""Lorra Wicker"", ""Andrea Carter"", ""Laurie Stephens"", ""Pamela Meeks""]",[],"[""About DPS"", ""DPS Links"", ""DPS Address"", ""Your Arkansas.gov"", ""Top Online Services"", ""Helpful Information""]",[] -348,http://lafayettepolice.us/3532/schools-out-day-camps,Media Bulletins,200,"School's Out Day Camps | Lafayette, IN - Official Website","","[""\r\n\r\nSchool's Out Day Camps\t\t""]","[""2023 School's Out Day Camp Dates"", ""School's Out Day Camp Fees:"", ""Questions? \u00a0Please contact the Education Department at zooeducation@lafayette.in.gov or (765) 807-1540.""]","[""Loading"", ""LOOKING FOR SPRING BREAK INFO? Click here for our Spring Break Safari Camp page."", ""Online Registration Portal"", ""Contact Us"", ""FAQs"", ""Site Links""]","[""Please review before registering:""]",[],[] -349,https://www.lasalle-il.gov/shared-police-services-committee-4,Poor Data Source,200,Shared Police Services Committee | City of La Salle,"","[""Shared Police Services Committee\n""]","[""Main navigation"", ""Main Menu"", ""Important Info""]",[],[],[],[] -350,https://www.minneapolismn.gov/government/programs-initiatives/community-safety/focus-areas/alternatives-police-response/new-pilot-response/,Policies & Contracts,200,Community Safety Work - City of Minneapolis,We're focusing on three key areas to improve community safety in our city.,"[""Community safety work"", ""Need help? We're here for you.""]","[""Overview"", ""Key areas"", ""Related links"", ""Community safety in different languages from 2021"", ""Contact us""]","[""Alternatives to police response"", ""Violence prevention"", ""Police policy reform"", ""Unarmed public safety responses"", ""Public health approach to violence"", ""Behavioral crisis response"", ""See language translation pages"", ""Alternatives to police response"", ""Police policy reform"", ""Community Safety Office""]","[""Learn more"", ""Learn more"", ""Learn more""]",[],[] -351,https://delcopa.gov/purchasing/bidsprops/cp081921_addendum4.pdf,Poor Data Source,200,"","",[],[],[],[],[],[] -352,https://www.mass.gov/doc/summary-results-of-recent-lead-and-copper-drinking-water-testing-at-massachusetts-schools/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -353,http://www.cityofpataskalaohio.gov/city-of-pataskala-careers/ordinance-2021-4399-exhibit-a-full-time-police-clerk-2/,Poor Data Source,200,Ordinance-2021-4399-Exhibit-A-Full-Time-Police-Clerk - City Of Pataskala,Official Website,"[""\n\t\t\t\tCity Of Pataskala\t\t\t""]","[""\n\t\t\t\tOfficial Website\t\t\t""]",[],[],[],[] -354,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/july-2021-activity-report/,Crime Maps & Reports,200,July 2021 - Activity Report - Town of Cheswold,"","[""Cheswold""]","[""Delaware"", ""July 2021 \u2013 Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[] -355,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/072521blotter.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -356,https://delcopa.gov/publicrelations/releases/2021/deppublichearing_0922.html,Not Criminal Justice Related,200,"DEP Holds Public Hearing Regarding Covanta on Sept. 22 - Delaware County, Pennsylvania","","[""DEP Holds Public Hearing Regarding Covanta on Sept. 22""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -357,http://www.lafayettepolice.us/1716/emu,Not Criminal Justice Related,200,"Emu | Lafayette, IN - Official Website","","[""\r\n\r\nEmu\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -358,https://www.coppelltx.gov/530/virtual-recreation,Poor Data Source,404,"","",,,,,, -359,https://coloradosprings.gov/police-department/article/news/shooting-investigation-1800-block-monterey,Media Bulletins,200,Shooting Investigation 1800 Block Monterey Road | City of Colorado Springs,"","[""\nShooting Investigation 1800 Block Monterey Road\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -360,https://www.antioch.il.gov/wpfb-file/01-14-14-police-and-fire-agenda-pdf-2/,Poor Data Source,200,"01-14-14 Police And Fire Agenda - Antioch, IL",01 14 police and fire agenda pdf commissions commission agendas 2014 08 17 51 0000,"[""01-14-14 Police And Fire Agenda""]",[],[],[],[],[] -361,https://www.gov.ca.gov/2022/02/27/governor-newsom-statement-on-death-of-salinas-police-officer-2-27-22/,Media Bulletins,200,Governor Newsom Statement on Death of Salinas Police Officer 2.27.22 | California Governor,SACRAMENTO – Governor Gavin Newsom today issued the following statement regarding the death of Salinas Police Department Officer Jorge David Alvarado: “Our…,"[""Governor Newsom Statement on Death of Salinas Police Officer 2.27.22""]",[],[],"[""Recent News"", ""Archives"", ""Categories""]",[],[] -362,https://www.southamptontownnypolice.gov/1446/hampton-resorts-atlantic-hotel-ia-system,Not Criminal Justice Related,200,"Hampton Resorts (Atlantic Hotel) IA System | Southampton, NY - Official Website","","[""\r\n\r\nHampton Resorts (Atlantic Hotel) IA System\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]","[""WQIP - Fund Application"", ""Summary Sheet""]",[],[] -363,https://delcopa.gov/departments/emergencyservices.html,Not Criminal Justice Related,200,"Emergency Services - Delaware County, Pennsylvania","","[""Emergency Services""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -364,https://www.roundrocktexas.gov/news/police-arrest-two-suspects-series-vehicle-burglaries/,Media Bulletins,200,Police arrest two suspects for series of vehicle burglaries - City of Round Rock,"",[],[],"[""Police arrest two suspects for series of vehicle burglaries""]","[""Site Search"", ""Follow Us""]",[],[] -365,https://www.coronadelmar.us/residents-show-support-for-the-newport-beach-police-department-media-4/,Poor Data Source,200,Residents Show Support for the Newport Beach Police Department-media-4 | Corona del Mar California,"","[""Residents Show Support for the Newport Beach Police Department-media-4""]","[""Menu"", "" Be First to Comment"", ""Subscribe"", """", """"]","[""Leave a Reply Cancel reply"", """"]",[],[],[] -366,https://santabarbaraca.gov/government/departments/police-department/funciones-miscelaneos,Misc Police Activity,200,Funciones Misceláneos | City of Santa Barbara,• Permisos de alarma El Departamento de Policía de Santa Barbara responde anualmente a miles de llamadas de alarmas falsas. Estas respuestas innecesarias resultan en una enorme carga de mano de obra y gastos; lo que a su vez reduce el tiempo disponible para responder a emergencias urgentes.,"[""Funciones Miscel\u00e1neos""]","[""Breadcrumb"", ""This is the prefooter section"", ""Main Footer"", ""City Hall"", ""Mailing Address"", ""Newsletters""]",[],[],[],[] -367,https://www.antioch.il.gov/wpfb-file/04-08-14-police-pension-agenda-pdf-3/,Poor Data Source,200,"04-08-14 Police Pension Agenda - Antioch, IL",10574 04 08 14 police pension agenda pdf commissions fund agendas 2014 1396623746 2c4916e7dd6a45db57ba715eb2e88686 213x300 _npkxhbratshx thumb jpg 10 02 26 0 pdf application trustees dennis b crosby jay jozwiak mary c dominiak scott a pierce jerry t johnson ted p poulos lawrence m hanson mayor lori k folbrick village clerk agenda of antioch lake,"[""04-08-14 Police Pension Agenda""]",[],[],[],[],[] -368,http://www.ryepolice.us/event/makn-llc-dba-mission-portsmouth,Not Criminal Justice Related,200,"Rye Police Department MAKN, LLC dba Mission Portsmouth - Rye Police Department","","["""", ""MAKN, LLC dba Mission Portsmouth""]","[""June 15, 2017 @ 5:00 am - October 15, 2017 @ 7:00 am"", "" Details "", ""Organizer"", "" Venue ""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -369,https://www.kenedytx.gov/2022/04/18/kenedy-police-departments-k9-robbie-to-get-donation-of-body-armor/,Media Bulletins,200,Kenedy Police Department’s K9 Robbie to get donation of body armor,"Kenedy Police Department’s K9 Robbie to get donation of body armor . Kenedy is a small town with big opportunities, located in the heart of the South Texas.","[""Kenedy Police Department\u2019s K9 Robbie to get donation of body armor""]",[],"[""Resources & Links"", ""Recent City News"", ""City News Archives"", ""Recent Meeting Agendas"", ""Kenedy Weather"", ""Featured News"", ""Transparency & Documents"", ""Recent Documents"", ""About Kenedy"", ""Recent City News"", ""Recent Documents"", ""Contact Us""]","["" JANUARY 29, 2024 EDC 4B Regular Meeting Agenda "", "" JANUARY 23, 2024 CITY COUNCIL MEETING AGENDA "", "" JANUARY 9, 2024 CITY COUNCIL MEETING AGENDA cancelled "", ""Local Time"", "" Today"", "" Wednesday"", "" Thursday"", "" Friday"", "" Kenedy Economic Development Corporation (4B) Website Launches\t"", "" JANUARY 29, 2024 EDC 4B Regular Meeting Agenda "", "" JANUARY 23, 2024 CITY COUNCIL MEETING AGENDA "", "" GLO CDBG-MIT MOD Posting App "", "" ADOPTED BUDGET FY 2023-2024 "", "" JANUARY 9, 2024 CITY COUNCIL MEETING AGENDA cancelled "", "" January 9, 2024 Airport Regular Meeting Cancelled "", "" JANUARY 8, 2024 CITY COUNCIL / FIRE DEPT JOINT WORKSHOP MEETING AGENDA "", "" JANUARY 29, 2024 EDC 4B Regular Meeting Agenda "", "" JANUARY 23, 2024 CITY COUNCIL MEETING AGENDA "", "" GLO CDBG-MIT MOD Posting App "", "" ADOPTED BUDGET FY 2023-2024 "", "" JANUARY 9, 2024 CITY COUNCIL MEETING AGENDA cancelled ""]","["" January 23, 2024"", "" January 24, 2024"", "" January 25, 2024"", "" January 26, 2024""]","["" Previous\t"", "" Next\t""]" -370,http://www.lafayettepolice.us/873/fire-stopping,Not Criminal Justice Related,200,"Fire Stopping | Lafayette, IN - Official Website",Find out more about fire-stopping materials and practices.,"[""\r\n\r\nFire Stopping\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -371,https://www.antioch.il.gov/wpfb-file/04-10-18-police-and-fire-agenda-pdf/,Poor Data Source,200,"04-10-18 Police And Fire Agenda - Antioch, IL",15646 04 10 18 police and fire agenda pdf commissions commission agendas 2018 1625758283 fe2413af4681e60c033482af6dde0466 7a26e41a326bbad9ee17487303d2ac31b426c4983a4edb45e9909830d1136370 219x300 _zug308fuvbmx thumb jpg 06 15 13 49 0 66 249 64 133 2021 07 02 24 28 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17 pagefailed_18,"[""04-10-18 Police And Fire Agenda""]",[],[],[],[],[] -372,http://lafayettepolice.us/2144/events,Not Criminal Justice Related,200,"Events | Lafayette, IN - Official Website","","[""\r\n\r\nEvents\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]","[""\r\n\t\t\t\t\tBoo at the Zoo\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tReindeer Rendezvous\r\n\t\t\t\t""]",[],[] -373,https://delcopa.gov/vote/pdf/2021/minutes01_15_2021.pdf,Poor Data Source,200,"","",[],[],[],[],[],[] -374,https://delcopa.gov/planning/pubs/osrgp/vol-iii_chapter7uplandcountypark.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -375,https://cityofyuma.colorado.gov/departments/emergency-services/police-department/police-department-staff,Personnel Records,200,Police Department Staff | City of Yuma,                   ,"[""\nPolice Department Staff\n""]","[""Police Department Staff""]","[""\n\n\n\n Police Chief Jerry Thompson\n \n\n"", ""\n\n\n\n Sergeant James Thomson\n \n\n"", ""\n\n\n\n Sergeant Curtis Witte\n \n\n"", ""\n\n\n\n Patrol Officer Cameron Josh \n \n\n"", ""\n\n\n\n Patrol Officer Patrick Laybourn \n \n\n""]",[],[],[] -376,https://www.mass.gov/doc/mptc-police-standards-subcommittee-open-meeting-notice-060821/download,Policies & Contracts,200,"","",[],[],[],[],[],[] -377,https://delcopa.gov/vote/candidatelist.html,Not Criminal Justice Related,200,Election Ballot Offices,"",[],[],[],[],[],[] -378,https://delcopa.gov/purchasing/bidsprops/delcomicrowavekmz.zip,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -379,https://www.mass.gov/doc/woburnpolicelieutenant5802rtf/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -380,https://delcopa.gov/employment/jobpostings/communityengagementspecialist.html,Training & Hiring Info,200,"Community Engagement Specialist - Delaware County, Pennsylvania","","[""Community Engagement Specialist""]",[],"[""Delco Jobs Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Position Description"", ""Essential Duties"", ""Skills"", ""Qualifications"", ""Contact""]",[],[] -381,https://police.crystalmn.gov/g_o_v_e_r_n_m_e_n_t/departments_a-_z/administration,Contact Info & Agency Meta,200," - Administration - City of Crystal -",Links and information about the City of Crystal Administration Department.,"[""Administration""]","[""City Hall""]","[""Sign up for a city newsletter or notification."", ""City Hall"", ""Regular Hours:""]","[""Monday - Friday""]",[],[] -382,https://coloradosprings.gov/police-department/article/news/public-assistance-needed-identify-sexual,Media Bulletins,200,Public Assistance Needed to Identify Sexual Assault Suspect | City of Colorado Springs,"","[""\nPublic Assistance Needed to Identify Sexual Assault Suspect\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -383,https://delcopa.gov/publicrelations/releases/2019/girlsspark.html,Not Criminal Justice Related,200,"County Council Recognizing the Girls Spark Conference - Delaware County, Pennsylvania","","[""County Council Recognizing the Girls Spark Conference""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -384,https://www.providenceri.gov/providence-police-department-deploy-axon-2-body-worn-cameras/police-body-camera/,Poor Data Source,200,City of Providence Providence Police Body Camera - City of Providence,"","[""Providence Police Body Camera""]","[""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""SIGN UP FOR OUR WEEKLY E-NEWS | \nHaga clic aqu\u00ed para espa\u00f1ol"", ""Lists*""]",[],[],[] -385,https://southamptontownnypolice.gov/1/home,Not Criminal Justice Related,200,"Southampton, NY - Official Website | Official Website","","[""Latest News"", ""Special Announcements"", ""Popular Links"", ""Upcoming Events""]",[],"[""Loading"", ""Site Tools"", ""News Flash"", ""Calendar"", ""January 2024"", ""Calendar"", ""January 2024"", ""Contact Us"", ""Site Links""]","[""\nCouncilmember Iasilli Calls on New York State to Halt Artificial Propagation Program \n"", ""\nPartial Rescission Order 01-18-2024 \n"", ""\nMcNamara Announces Launch of 2024 Hometown Heroes Banner Program \n"", ""\nDAMAGE REPORTING TOOL LAUNCHED \n"", ""\nEmergency Shellfish Closures - All that area of North Sea Harbor and Wooley Pond. \n"", ""\nEXTENDING TEMPORARY BEACH DRIVING CLOSURES ON SOUTHAMPTON BEACHES UNTIL 1/15/24 \n"", ""\nEmergency Work and Temporary Beach Access Restrictions \n"", ""\nU.S. Department of Energy Recognizes Town of Southampton \n"", ""\nOfficers and Explorers Spread Holiday Cheer \n"", ""\nTown Affirmative Action Task Force Members Needed \n"", ""\n2023 End of Year Newsletter \n"", ""\nPublic Hearing has been scheduled for the Town of Southampton Climate Action Plan \n"", ""Southampton: Plus One ADU Program"", ""Hometown Hero Banner Program"", ""Edith Windsor Heart Program"", ""January 23"", ""January 24"", ""January 25"", ""January 24"", ""January 25"", ""January 26"", ""January 29"", ""January 30""]",[],[] -386,http://police.portlandmaine.gov/638/nathan-clifford-re-use-advisory-task-for,Media Bulletins,200,"Nathan Clifford Re-Use Advisory Task Force | Portland, ME - Official Website","On December 17, 2012, the Portland City Council voted to approve the recommendations of the Nathan Clifford Re-Use Advisory Task Force.","[""Nathan Clifford Re-Use Advisory Task Force""]",[],[],[],[],[] -387,http://www.longbeach.gov/police/press-releases/traffic-fatality---palo-verde-ave-and-los-coyotes-diagonal/,Media Bulletins,200,TRAFFIC FATALITY - PALO VERDE AVE AND LOS COYOTES DIAGONAL,"","[""Long BeachPolice Department""]",[],[],[],[],[] -388,https://www.southamptontownnypolice.gov/442/community-preservation-advisory-board,Media Bulletins,200,"Community Preservation Advisory Board | Southampton, NY - Official Website",View the members of the Community Preservation Advisory Board.,"[""\r\n\r\nCommunity Preservation Advisory Board\t\t""]","[""Meetings"", ""Members""]","[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]",[],[],[] -389,https://spdblotter.seattle.gov/2015/03/24/police-arrest-suspect-in-violent-robbery-at-rainier-beach-doughnut-shop/,Media Bulletins,200,Police Arrest Suspect In Violent Robbery At Rainier Beach Doughnut Shop - SPD Blotter,"","[""Police Arrest Suspect In Violent Robbery At Rainier Beach Doughnut Shop""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -390,https://delcopa.gov/treasurer/forms/2023appealformscommercial.pdf,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -391,https://www.lynchburgvapolice.gov/wp-content/uploads/2021/03/dsc0161-scaled.jpg,Poor Data Source,404,"","",,,,,, -392,http://www.longbeach.gov/police/press-releases/traffic-fatality-pacific-coast-highway-and-lime-avenue/,Media Bulletins,200,Traffic Fatality: Pacific Coast Highway and Lime Avenue,"","[""Long BeachPolice Department""]",[],[],[],[],[] -393,https://alpha.austin.gov/police-oversight/2020-11-12/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -394,http://www.longbeach.gov/police/press-releases/arrests-made-in-two-robberies--charges-filed/,Media Bulletins,200,ARRESTS MADE IN TWO ROBBERIES; CHARGES FILED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -395,http://www.lafayettepolice.us/list.aspx,Resources,200,"Notify Me • Lafayette, IN • CivicEngage","","[""Notify Me\u00ae""]","[""Please sign in to subscribe, unsubscribe, or manage your subscriptions"", ""Your Profile Information"", ""\u25bc Notify Me"", ""\u25bc Agenda Center"", ""\u25bc Alert Center"", ""\u25bc Bid Postings"", ""\u25bc Calendar"", ""\u25bc Government Jobs"", ""\u25bc News Flash""]","[""Loading"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -396,https://www.coppelltx.gov/faq.aspx?qid=432,Resources,404,"","",,,,,, -397,https://www.hayward-ca.gov/discover/news/may21/hayward-police-department-maintains-national-law-enforcement-accreditation-calea,Media Bulletins,200,Hayward Police Department Maintains National Law Enforcement Accreditation by CALEA | City of Hayward - Official website,"Hayward Police Department Maintains National Law Enforcement Accreditation by CALEAÒGainesville, VA – The Hayward Police Department was awarded national accreditation on March 27, 2021 by the Commission on Accreditation for Law Enforcement Agencies, Inc. (CALEAÒ) in the Advanced Law Enforcement Accredtation program.","[""Hayward Police Department Maintains National Law Enforcement Accreditation by CALEA""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form""]",[],"[""Re-CAP: Hayward\u2019s Updated Climate Action Plan (CAP)"", ""Try induction cooking for free through Ava Community Energy\u2019s Induction Cooktop Lending Program!"", ""The City of Hayward\u2019s Fight Against Food Waste"", ""Decoding Plastic Recycling In California"", ""Keep Hayward Clean and Green with Adopt-A-Block!"", ""City Hall and Nonessential Services Closures: Monday, Feb 12 and Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""Library Closure January 15, 2024"", ""Library Closure: December 23 2023 - January 1 2024"", ""Library closure: November 23 - November 26, 2023."", ""YOU ARE HERE.SO IS EVERYTHING ELSE."", ""Related News"", ""Upcoming DUI Checkpoint"", ""Annual Dr. Martin Luther King Jr. Birthday Celebration event returns Jan. 15"", ""Acting Chief Bryan Matthews named Hayward\u2019s 16th Chief of Police"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -398,https://delcopa.gov/council/2019minutes/111319minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -399,https://www.lynchburgvapolice.gov/wp-content/uploads/2022/02/cotw-1-e1644350006495.jpg,Poor Data Source,404,"","",,,,,, -400,https://www.stcharlesil.gov/news/2021/04/01/welcome-new-police-officers,Media Bulletins,200,City News and Events | City of St. Charles IL,"Overview of the latest news and events for the City of St. Charles, IL","[""\n\n City of St. Charles, Illinois \n"", ""News & Events""]","[""You are here"", ""News Menu \u2630"", ""Downtown Parking Study Update "", ""1st Street Plaza Grand Opening"", ""Restaurant Week"", "" New Online Utility Payment Portal "", ""Happy New Year! The January 2024 City News is Out"", ""First Street Plaza Official Opening"", ""2023 City Highlights"", ""St. Charles Police Announce New C.A.R.E.S. Program for Residents at Risk"", ""Financial Report Makes It Easy to Review City Finances"", ""City of St. Charles Recognized for Hiring Veterans"", ""\n Coming up "", ""708 Mental Heath Board"", ""1st Street Plaza Grand Opening"", ""Zoning Board of Appeals "", ""Restaurant Week"", ""Youth Commission Meeting"", ""City Council Meeting"", ""Government Operations Committee Meeting"", ""Plan Commission Meeting"", ""Historic Preservation Commission Meeting"", ""Natural Resources Commission"", ""\n View more events "", ""\n Key Resources "", ""\n Connect With Us ""]",[],[],[],[] -401,https://alpha.austin.gov/en/police-oversight/written-reprimand-of-officer-david-lara/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -402,http://www.longbeach.gov/police/press-releases/suspect-arrested-for-murder-of-high-school-student/,Media Bulletins,200,SUSPECT ARRESTED FOR MURDER OF HIGH SCHOOL STUDENT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -403,https://alpha.austin.gov/es/police-oversight/formal-complaint-purpose-and-scope-and-other-policy-violations-9/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -404,https://www.hermonmaine.gov/departments/police-department/gallery/,Poor Data Source,200,Gallery | Hermon,  Prescription Drug Take Back Hermon Harvest & Homecoming. Prescription Drug Take Back at the Hermon Harvest & Homecoming. Marijuana Plant Seiz ...,"[""Gallery""]","[""Penobscot County Sheriff's Department""]",[],[],[],[] -405,https://delcopa.gov/departments/recorderofdeeds.html,Contact Info & Agency Meta,200,"Recorder of Deeds - Delaware County, Pennsylvania","","[""Recorder of Deeds""]",[],"[""DOCUMENT TYPES"", ""Forms"", ""Frequently Asked Questions"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Update as of January 2024."", ""All recordings can be e-recorded with one of our 4 companies below OR brought in with a self-addressed, stamped return envelope and payment."", ""What we can do at the counter:"", ""1.\tNotaries Public to be sworn in \u2013 see FAQ below for pricing\r\n\r\n\t2.\tMilitary Paperwork and Picture ID\u2019s\r\n\r\n\t3.\tPlan recordings"", ""Copies of documents can be obtained online at our public access site at www.delcopa.gov/publicaccess/index.html."", ""1.\tUse Real Estate/Tax System to do an address search and obtain a Parcel ID Number.\r\n\r\n\t2.\tUse Recorder of Deeds to search by Parcel ID Number or Name."", ""Transfer Tax for our county is 1% state and 1% local with these exceptions:"", ""1.\tRadnor Township \u2013 1.5%\r\n\r\n\t2.\tUpper Darby Township \u2013 1.5% (effective 1/1/22)\r\n\r\n\t3.\tUpper Providence Township \u2013 2%\r\n\t\r\n\t4. Chester City \u2013 1.5% (effective 9/1/23)"", ""QUESTIONING IF A TRANSFER IS TAXABLE?\r\n\tContact: RA-BITRealyTransferTax@pa.gov"", ""PLEASE READ THE FREQUENTLY ASKED QUESTIONS BELOW"", ""IF YOU NEED TO CALL THE OFFICE, PLEASE HAVE YOUR PARCEL ID NUMBER READY"", ""E-RECORDING IN DELAWARE COUNTY:"", ""THE DELAWARE COUNTY RECORDER OF DEEDS BEGAN ACCEPTING ELECTRONICALLY RECORDED DOCUMENTS IN LATE 2020 FROM FOUR SUBMITTING VENDORS. MANY CUSTOMERS SUCH AS MORTGAGE COMPANIES, ATTORNEYS, BANKS AND TITLE COMPANIES ARE ABLE TO UPLOAD AND SUBMIT DOCUMENTS. SOME SAVINGS CAN BE REALIZED IN POSTAGE, PAPER AND COPYING COSTS. DOCUMENTS, AFTER ERECORDING, ARE RETURNED TO THE CUSTOMER VIA THEIR SUBMITTER. ONLY THOSE DOCUMENT TYPES ACCEPTED FOR RECORDING THROUGH THE REGULAR MAIL ARE ALSO ACCEPTABLE FOR ERECORDING."", ""THE FOUR SUBMITTING VENDORS WHO WORK WITH THE OFFICE ARE LISTED BELOW. CONTACT ONE OR MORE OF THEM TO OBTAIN FURTHER INFORMATION ON THE E-RECORDING PROCESS AND PRICING:"", ""SIMPLIFILE (800) 460-5657\nWWW.SIMPLIFILE.COM"", ""CSC (CORPORATION SERVICE COMPANY) (866) 652-0111\nWWW.ERECORDING.COM"", ""EPN (ERECORDING PARTNERS NETWORK) (888) 325-3365\nWWW.GOEPN.COM"", ""INDECOMM GLOBAL SERVICES (877) 272- 5250\nDMG.INDECOMM.NET""]",[],[] -406,https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-8/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -407,https://www.tukwilawa.gov/event/virtual-town-hall-with-chief-of-police/,Poor Data Source,200,Virtual Town Hall with Chief of Police - City of Tukwila,"","[""Virtual Town Hall with Chief of Police""]","[""June 15, 2021 @ 6:00 pm - 8:00 pm"", "" Details "", ""Related Events""]","[""Arts Commission \u2013 Rescheduled to 1/27"", ""Planning Commission"", ""Special Arts Commission""]","[""\nCity of Tukwila\n""]","[""I am a..."", ""Online Services"", ""Most Requested Forms""]",[] -408,https://www.coppelltx.gov/faq.aspx?qid=119,Resources,200,FAQs • Where can I find maps?,"",[],"[""\n\u25bc\r\nPlanning\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -409,http://www.longbeach.gov/police/,Contact Info & Agency Meta,200,Police,Long Beach Police Department,"[""Police Department""]",[],"[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""Police Department"", ""We're Hiring! Join LBPD Today!"", ""Latest News"", ""\r\n Phone Numbers\r\n "", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""Crime Lab Survey"", ""\u00a0""]",[] -410,https://www.warracres-ok.gov/police-department-history/warr-acres-pd-first-patch/,Poor Data Source,200,Warr Acres PD First Patch - City of Warr Acres,"","[""Warr Acres PD First Patch""]","[""Primary menu links"", ""Action toolbar"", ""Contact""]",[],[],"[""How do I report food safety concerns?""]",[] -411,https://police.greenvillesc.gov/faq.aspx?qid=382,Not Criminal Justice Related,200,FAQs • Are figure skates available? ,"",[],"[""\n\u25bc\r\nIce on Main\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -412,https://www.southamptontownnypolice.gov/faq.aspx?qid=421,Not Criminal Justice Related,200,FAQs • What happens if there is bad weather?,"",[],"[""\n\u25bc\r\nSFCC - South Fork Commuter Connection\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -413,https://ose.louisiana.gov/event/police-sergeant-18/,Poor Data Source,200,Police Sergeant | Louisiana Office of State Examiner,"","["""", ""Police Sergeant""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -414,https://www.providenceri.gov/officer-louis-salinaro-k-9-gero-locate-apprehend-subject-wanted-police-hiding-basement/press-release-k9/,Poor Data Source,200,City of Providence K9-Gero - City of Providence,"","[""K9-Gero""]","[""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""SIGN UP FOR OUR WEEKLY E-NEWS | \nHaga clic aqu\u00ed para espa\u00f1ol"", ""Lists*""]",[],[],[] -415,http://www.ryepolice.us/logs/police-logs-11-09-22-11-15-22,Daily Activity Logs,200,Rye Police Department Police Logs 11/09/22-11/15/22 - Rye Police Department,"","[""Police Logs 11/09/22-11/15/22""]","[""Police Logs 11/09/22-11/15/22""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -416,https://delcopa.gov/planning/pubs/connectivityranking.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -417,https://www.sandiego.gov/department-document/commission-police-practices-members-psln-committee-re-list-recommendations,Resources,200,Commission on Police Practices to Members of the PS&LN Committee Re: List of Recommendations for Implementation Ordinance | City of San Diego Official Website,Memo 12/1/21 Commission Timeline,"[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Commission on Police Practices to Members of the PS&LN Committee Re: List of Recommendations for Implementation Ordinance"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -418,https://www.stpaul.gov/departments/police/21st-century-policing-report/pillar-1-trust-and-legitimacy/report-7,Media Bulletins,200,Report Recommendation 1.9 | Saint Paul Minnesota,Law enforcement agencies should build relationships based on trust with immigrant communities.,"[""\nReport Recommendation 1.9\n""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Footer""]","[""\n You are using an unsupported browser. Please use Microsoft Edge.\n "", ""\n SPPD is committed to community\n "", ""\n SPPD is committed to racial equity\n "", ""\n SPPD supports our immigrant communities\n "", ""\n SPPD serves and protects all of our communities regardless of immigration status\n "", ""\n SPPD serves all victims\n "", ""\n SPPD employs officers fluent in community languages\n "", ""\n SPPD is committed to equal access\n "", ""\n SPPD publishes in five languages and is committed to more\n "", ""\n SPPD partners with diverse community services\n "", ""\n SPPD Response\n "", ""\n Contact The City\n "", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured"", ""\n Reference Data\n "", ""\n Reference Data\n "", ""\n Reference Data\n "", ""\n Reference Data\n "", ""\n Reference Data\n ""]",[],[] -419,https://www.grovecityohio.gov/division-of-police/coin-survey/,Not Criminal Justice Related,404,"","",,,,,, -420,https://www.antioch.il.gov/wpfb-file/11-16-10-police-pension-fund-agenda-pdf-4/,Poor Data Source,200,"11-16-10 Police Pension Fund Agenda - Antioch, IL",13482 11 16 10 police pension fund agenda pdf commissions agendas 2010 1625758337 5ae0d0488d071428938164121e27df1d 2ef1356bfc60a11d27041adfb24a51b133cf753a2322a8741f57a4d30267ac55 224x300 _wrnjqxl1aexj thumb jpg 2017 05 17 08 41 32 0 40 77 167 25 2021 06 38 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17 pagefailed_18 pagefailed_19,"[""11-16-10 Police Pension Fund Agenda""]",[],[],[],[],[] -421,http://www.longbeach.gov/globalassets/police/media-library/images/press-releases/2015/thumb_bobbysketch-.jpg,Poor Data Source,200,City of Long Beach,"",[],"[""Page Not Found""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[] -422,http://www.longbeach.gov/police/press-releases/robbery-suspects-arrested--charged/,Media Bulletins,200,ROBBERY SUSPECTS ARRESTED & CHARGED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -423,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0372/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -424,https://champaignil.gov/tag/police-continue-to-seek-suspect-in-september-12-bank-robbery-regions-bank/,Media Bulletins,200,Police Continue to Seek Suspect in September 12 Bank Robbery – Regions Bank Archives - City of Champaign,"","[""Items tagged: Police Continue to Seek Suspect in September 12 Bank Robbery \u2013 Regions Bank""]","[""Police Continue to Seek Suspect in September 12 Bank Robbery \u2013 Regions Bank"", ""News Releases"", ""Department News""]",[],[],[],[] -425,https://www.dps.arkansas.gov/law-enforcement/arkansas-state-police/directors-office/asp-commission/,Contact Info & Agency Meta,200,ASP Commission - Arkansas Department of Public Safety,"","["" Flag Status""]","[""ASP Commission"", ""Meeting Minutes"", ""Commission Rules"", ""Contact ASP"", ""Helpful ASP links"", ""Connect with ASP"", ""Respect. Integrity. \nCUSTOMER SERVICE. TEAMWORK. \nSERVANT LEADERSHIP. \nCONTINUOUS IMPROVEMENT"", """", ""\u00a9 2024 All rights Reserved. Arkansas.gov ""]","[""Jeffery Teague"", ""John Allison"", ""Jim Hinkle"", ""Ken Reeves"", ""Neff Basore"", ""Mike Akin"", ""Stephen Edwards""]",[],"[""About DPS"", ""DPS Links"", ""DPS Address"", ""Your Arkansas.gov"", ""Top Online Services"", ""Helpful Information""]",[] -426,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0455/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -427,https://coloradosprings.gov/police-department/page/investigations-division,Poor Data Source,403,"","",,,,,, -428,https://www.rentonwa.gov/city_hall/police/investigations/domestic_violence/cycle_of_violence,Media Bulletins,200," - Cycle of Violence - City of Renton -","","[""CITY OF RENTON\r\n\t\t\t\t\tWASHINGTON""]","[""Cycle of Violence""]",[],"[""Phase 1: Tension Building Phase"", ""Batterer may:"", ""Partner may:"", ""Phase 2: Crisis Phase"", ""Batterer may:"", ""Partner may:"", ""Phase 3: Calmer Phase"", ""Batterer may:"", ""Partner may:""]","[""""]","[""Domestic Violence Victim Advocate""]" -429,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2019_news_releases/release_of_sex_offender_into_community_-_navarro,Media Bulletins,200," - Release of Sex Offender into Community - Navarro - Village of Pleasant Prairie -","",[],"[""Release of Sex Offender into Community - Navarro""]","[""Follow Us on Social Media""]",[],[],[] -430,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/091421arrests.pdf,Arrest Records,200,"","",[],[],[],[],[],[] -431,https://data.charlottenc.gov/datasets/cmpd-police-wrecker-zones,Poor Data Source,200,City of Charlotte Open Data Portal,"Charlotte's Open Data Portal, The City of Charlotte's Open Data Portal allows users to search, explore and discover relevant datasets that are served out by the City of Charlotte, NC.",[],[],[],[],[],[] -432,http://www.lafayettepolice.us/614/find,Resources,200,"Find | Lafayette, IN - Official Website","Find links to BuyCrash.com, forms and applications, fugitive search, the police memorial wall, and the honor guard.","[""\r\n\r\nFind\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]","[""\nForms & Applications\n"", ""\nBuyCrash.com\n""]",[],[] -433,http://www.longbeach.gov/police/press-releases/lbpd-joins-crackdown-on-texting---hand-held-cell-use-behind-the-wheel/,Media Bulletins,200,LBPD JOINS CRACKDOWN ON TEXTING & HAND-HELD CELL USE BEHIND THE WHEEL,"","[""Long BeachPolice Department""]",[],[],[],[],[] -434,https://www.ashevillenc.gov/wp-content/uploads/2019/03/crime-scene-investigation-police2.jpg,Poor Data Source,200,"","",[],[],[],[],[],[] -435,https://champaignil.gov/2019/09/29/champaign-police-investigating-shooting-2/,Media Bulletins,200,Champaign Police Investigating Shooting - City of Champaign,"","[""Champaign Police Investigating Shooting""]","[""News Releases"", ""Department News""]",[],[],[],[] -436,https://alpha.austin.gov/en/police-oversight/community-police-review-commission-memo-2019-0267/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -437,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-1022/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -438,https://spdblotter.seattle.gov/2012/08/03/seattle-neighborhood-group-and-seattle-police-department-team-up-to-tackle-graffiti-in-little-saigon/,Media Bulletins,200,Seattle Neighborhood Group and Seattle Police Department team up to tackle graffiti in Little Saigon - SPD Blotter,"","[""Seattle Neighborhood Group and Seattle Police Department team up to tackle graffiti in Little Saigon""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -439,https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scope-and-other-policy-violations-9/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -440,https://normandyparkwa.gov/city-news/police-department/happy-thanksgiving/,Not Criminal Justice Related,200,Happy Thanksgiving - City of Normandy Park,"Happy Thanksgiving! Speaking of thankful, if you really want the community to be thankful please donate your blood next week at Normandy Park...","[""Happy Thanksgiving""]","[""Save a life today!"", ""\nTOYS FOR TOTS\n"", ""\nNormandy Park Paws on Patrol\n"", ""\nNormandy Park February Blood Drive\n"", ""Receive news & updates"", ""Success!"", ""Subscribe To Our Newsletter"", ""You have Successfully Subscribed!""]",[],"[""Normandy Park City Hall"", ""City Hall Hours""]","[""Dan Yourkoski, Police Chief""]",[] -441,https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-1/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -442,https://www.hendersonvillenc.gov/police-department/information-crime-safety-tips/winter-safety-tips,Poor Data Source,200,"Winter Safety Tips | City of Hendersonville, NC | Official Website","Winter Weather Terms WatchesWinter Storm Watch: Issued for the possibility of severe life-threatening winter weather conditions including: heavy snow, heavy ice and/or near blizzard conditions. Forecasters are typically 50 percent confident that severe winter weather will materialize when a watch is issued. Blizzard Watch: Issued for the possibility of blizzard conditions.","[""Winter Safety Tips""]","[""Search form"", ""You are here""]",[],"[""Winter Weather Terms "", ""Home Safety"", ""Neighbors Helping Neighbors""]",[],[] -443,https://www.mass.gov/doc/notification-of-copper-algaecide-application/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -444,https://champaignil.gov/2010/05/04/champaign-police-celebrates-olympic-champion/,Not Criminal Justice Related,200,Champaign Police Celebrates Olympic Champion - City of Champaign,"","[""Champaign Police Celebrates Olympic Champion""]","[""News Releases"", ""Department News""]","[""The Police Benevolent & Protective Association Hosts a Meet and Greet for Olympic Champion Katherine Reutter""]",[],[],[] -445,https://alpha.austin.gov/es/police-oversight/2020-08-10-3/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -446,http://lafayettepolice.us/765/request-a-report,Not Criminal Justice Related,200,"Request a Report | Lafayette, IN - Official Website","To request a fire report, please complete the report request form and email it or stop by our office.","[""\r\n\r\nRequest a Report\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -447,https://www.antioch.il.gov/event/police-fire-commission-cancelled/,Not Criminal Justice Related,200,"Police & Fire Commission – Cancelled - Antioch, IL","","[""Police & Fire Commission \u2013 Cancelled""]",[],[],[],[],[] -448,https://www.lynchburgvapolice.gov/wp-content/uploads/2021/06/lpd-seal-e1662580813573.png,Poor Data Source,404,"","",,,,,, -449,https://osp.maryland.gov/2020/01/17/january-17-2020-greensboro-police-chief-pleads-guilty-to-misconduct-in-office/,Media Bulletins,200,"January 17, 2020: Greensboro Police Chief Pleads Guilty to Misconduct in Office ","",[],"["" \r\nQuick Links"", ""January 17, 2020: Greensboro Police Chief Pleads Guilty to Misconduct in Office""]",[],[],[],[] -450,https://ci.new-hope.mn.us/city_hall/police_department/records_division/temporary_permit_to_purchase_procedure,Poor Data Source,200," - Temporary Permit to Purchase Procedure - City of New Hope -","","[""City of New Hope"", ""\r\n \tCity of New HopeMinnesota""]","[""Temporary Permit to Purchase Procedure ""]",[],[],[],[] -451,https://www.austintexas.gov/blog/good-police-work,Media Bulletins,200,Good Police Work | AustinTexas.gov,Gentleman: I know you both are quite busy managing and keeping our City safe.,"[""Good Police Work""]","[""Action Navigation"", ""GTranslate"", ""Main menu"", ""Frequently Viewed Departments"", ""Make a Difference"", ""Share"", ""About this blog"", ""Archives"", ""Pagination"", ""Footer Menu"", ""Second Footer Menu""]","[""Resident"", ""Business"", ""Government"", ""Departments"", ""Connect"", ""Good Police Work"", ""2021 February\n"", ""2020 January\n"", ""2020 January\n"", ""2020 January\n"", ""2020 January\n"", ""2020 January\n"", ""2019 December\n"", ""2019 December\n"", ""2019 November\n"", ""2019 November\n""]",[],[],[] -452,http://sheriff.co.seneca.ny.us/the-department/copy-of-biography-the-chief-deputy-2/,Contact Info & Agency Meta,200,"Biography: The Chief Deputy – Seneca County Sheriff, New York","","[""Biography: The Chief Deputy""]",[],[],[],[],[] -453,https://hollister.ca.gov/government/city-departments/police/,List of Data Sources,200,"Police – City of Hollister, California","","[""\u00a0San Benito County Opioid Task Force""]",[],"[""Follow Us on..."", ""A Message from Chief Reynoso"", ""San Benito County Public Safety PSA"", ""HPD Values and Vision"", ""Follow Us on....""]",[],[],[] -454,https://delcopa.gov/courts/juvenilecourt/upperdarbyprobation.html,Contact Info & Agency Meta,200,Havertown (Upper Darby) Juvenile Probation Office - Delaware County Court of Common Pleas,"","[""Havertown (Upper Darby) Juvenile Probation Office""]",[],"[""Juvenile Court & Probation Services Navigation"", ""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[] -455,http://www.ryepolice.us/wp-content/uploads/lynch_dan.jpg,Poor Data Source,200,"","",[],[],[],[],[],[] -456,https://delcopa.gov/council/2017minutes/012517minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -457,https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-46/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -458,https://champaignil.gov/tag/police-request-community-assistance-in-fatal-shooting-investigation/,Media Bulletins,200,Police Request Community Assistance in Fatal Shooting Investigation Archives - City of Champaign,"","[""Items tagged: Police Request Community Assistance in Fatal Shooting Investigation""]","[""UPDATE: Police Request Community Assistance in Fatal Shooting Investigation"", ""News Releases"", ""Department News""]",[],[],[],[] -459,https://alpha.austin.gov/es/police-oversight/community-feedback-and-final-recommendations-ban-chokeholds-and-strangleholds/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -460,https://coloradosprings.gov/police-department/article/calendar-event/holiday-hill,Misc Police Activity,200,Holiday on the Hill | City of Colorado Springs,"","[""\nHoliday on the Hill\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -461,https://www.naperville.il.us/services/naperville-police-department/community-education-and-crime-prevention/paws-on-patrol/,Resources,200,Paws on Patrol | The City of Naperville,Paws on Patrol is a dog walker watch program that encourages residents to act as extra eyes and ears while out walking their dogs and report suspicious activity in their neighborhoods to police.,"[""Paws on Patrol""]","[""Community Education and Crime Prevention "", ""Sniff out criminal activity while on your daily walks!"", ""Get involved!"", ""Watch NCTV17 Coverage of Paws on Patrol"", ""\nNaperville Police Department\n""]","[""Explore""]",[],"[""Helping Residents Build a Better Community"", ""Resources for Doing Business in Naperville""]",[] -462,https://www.police.wallingfordct.gov/careers/current-employment-opportunities/,Resources,200,Current Employment Opportunities | Wallingford Police Department,Current Employment Opportunities,"[""Current Employment Opportunities""]",[],[],[],[],[] -463,https://www.coppelltx.gov/376/command-staff,Contact Info & Agency Meta,200,"Command Staff | Coppell, TX",Meet the Coppell Police Department Command Staff.,"[""\r\n\r\nCommand Staff\t\t""]",[],"[""Loading"", ""Contact Us""]","[""Police Department""]",[],[] -464,https://alpha.austin.gov/es/police-oversight/8-26-20-3/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -465,https://coloradosprings.gov/police-department/article/news/officer-involved-shooting-i25-and-north,Media Bulletins,200,Officer Involved Shooting I25 and North Academy Boulevard | City of Colorado Springs,"","[""\nOfficer Involved Shooting I25 and North Academy Boulevard\n""]","[""Search"", ""Update:"", ""Original post:"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -466,https://www.arlingtontx.gov/news/my_arlington_t_x/news_stories/police_chief_al_jones,Media Bulletins,200," - Al Jones Appointed as New Arlington Police Chief - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Al Jones Appointed as New Arlington Police Chief""]",[],[],[],[] -467,https://www.sandiego.gov/risk-management/flexible-benefits/fbp-police-safety-members-fy2022,Policies & Contracts,200,Flexible Benefits Plan Options for Police Safety Members FY 2022 and Short Plan Year 2022 | City of San Diego Official Website,"","[""City of San Diego Official Website"", ""Flexible Benefits Plan Options for Police Safety Members FY 2022 and Short Plan Year 2022""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""FBP Credits"", ""FBP Options"", ""Sharp Plan Additional Information"", ""Services"", ""Contact Info"", ""Orientation Materials"", ""Additional Resources"", ""Forms"", ""Footer""]","[""Medical Plans"", ""Kaiser Permanente Traditional (HMO) Information"", ""Kaiser Permanente Traditional (HMO) Premiums"", ""Kaiser Permanente Deductible (HMO) Information"", ""Kaiser Permanente Deductible (HMO) Premiums"", ""Kaiser Partner Site"", ""Kaiser Additional Information"", ""Cigna (HMO) Information"", ""Cigna (HMO) Premiums"", ""Cigna Scripps Select (HMO) Premiums"", ""Cigna Open Access Plan (OAP) PPO Information"", ""Cigna Open Access Plan (OAP) PPO Premiums"", ""Cigna Additional Information"", ""Cigna Partnersite"", ""SDPEBA/Sharp Classic (HMO) Information"", ""SDPEBA/Sharp Classic (HMO) Premiums"", ""SDPEBA/Sharp Select (HMO) Information"", ""SDPEBA/Sharp Select (HMO) Premiums"", ""SDPEBA/Sharp Saver Deductible (HMO) Information"", ""SDPEBA/Sharp Saver Deductible (HMO) Premiums"", ""POA ALADS California Care Basic (HMO - No Dental) Information"", ""POA ALADS California Care Basic (HMO - No Dental) Premiums"", ""POA ALADS California Care Premier (HMO - with Dental) Information"", ""POA ALADS California Care Premier (HMO - with Dental) Premiums"", ""Dental Plans (Optional)"", ""Delta Dental\u00a0(DHMO) Information"", ""Delta Dental\u00a0(DHMO) Premiums"", ""Delta Dental (DPO) Information"", ""Delta Dental (DPO) Premiums"", ""Delta Dental Additional Information"", ""Delta Dental Partner Site"", ""Vision Plans (Optional)"", ""City VSP Information"", ""City VSP Premiums"", ""City VSP Partnersites"", ""Life Insurance Plans""]","[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -468,https://hamiltonma.gov/events/event/police-training-gun-club-3/,Poor Data Source,200,"Police Training @ Gun Club - Town of Hamilton, MA","","[""Police Training @ Gun Club""]",[],"[""Stay Connected"", ""About Hamilton"", ""Contact"", ""Useful Links""]","[""Event Details"", ""Give Feedback""]","[""Where Do I Go For..."", ""Shop Local""]","[""Today: January 24, 2024"", ""\nWhere Do I Go For...\n\n More \n\n""]" -469,https://brookfieldil.gov/2021-04-28-regular-police-pension-board-meeting-agenda-for-posting/,Poor Data Source,404,"","",,,,,, -470,http://www.longbeach.gov/police/press-releases/charges-filed-on-carjacking-suspect--a-convicted-felon-on-post-release-community-supervision/,Media Bulletins,200,CHARGES FILED ON CARJACKING SUSPECT; A CONVICTED FELON ON POST RELEASE COMMUNITY SUPERVISION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -471,http://www.longbeach.gov/police/press-releases/murder-1300-block-of-wesley-drive/,Media Bulletins,200,MURDER 1300 BLOCK OF WESLEY DRIVE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -472,http://www.longbeach.gov/police/press-releases/this-labor-day-and-every-day-drive-sober-or-get-pulled-over/,Media Bulletins,200,"THIS LABOR DAY, AND EVERY DAY: DRIVE SOBER OR GET PULLED OVER","","[""Long BeachPolice Department""]",[],[],[],[],[] -473,https://coloradosprings.gov/police-department/article/news/fatal-crash-marksheffel-road-and-dublin-0,Media Bulletins,200,Fatal Crash Marksheffel Road and Dublin Boulevard | City of Colorado Springs,"","[""\nFatal Crash Marksheffel Road and Dublin Boulevard\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -474,https://www.roundrocktexas.gov/city-departments/police/divisions/training-division/,Contact Info & Agency Meta,200,Training Division - City of Round Rock,"","[""Training Division""]",[],"[""Training Division Contacts"", ""Round Rock Police Department""]","[""Lt. Woody Sitz"", ""Sgt. Aaron Mitchell"", ""Sgt. Jason Huf"", ""Site Search"", ""Follow Us""]",[],[] -475,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0486/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -476,https://alpha.austin.gov/government-business/connect-with-city/contribute-to-police-oversight/complaint-process/,Policies & Contracts,200,Maintenance Notice,"",[],[],[],[],[],[] -477,https://delcopa.gov/sheriff/realestate.html,Not Criminal Justice Related,200,"Real Estate Department - Sheriff Sales - Delaware County, Pennsylvania","","[""Real Estate Department - Sheriff Sales""]","[""Fax the Warrant Division\r\n\t\t610-891-5255""]","[""Frequently Asked Questions"", ""Sheriff's Office Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""When do the Sheriff's Sales take place?"", ""Where are the Sheriff's Sales held?"", ""Can I obtain a list of the properties to be sold?"", ""If I see a property I want to buy, can I inspect it before the sale?"", ""How do I buy a property at Sheriff's Sale?"", ""What is hand money?"", ""When do I have to pay the rest of the money?"", ""Why does the Sheriff's Office highly recommend that you consult your own attorney for advice about how to purchase property at Sheriff's Sale?"", ""Do Sheriff's Sales differ from Tax Sales or Judicial Sales?""]",[],[] -478,https://delcopa.gov/publicrelations/releases/2021/pdf/phonescam.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -479,https://www.ci.rohnert-park.ca.us/city_hall/departments/development_services/copy_of_downtown/demo_downtown_news,Not Criminal Justice Related,200," - Demo Downtown News - City of Rohnert Park -","","[""City of Rohnert Park""]","[""Rohnert Park""]","[""Demo Downtown News""]",[],[],[] -480,https://townofcampbellwi.gov/public-safety/police/contact-an-officer/,Contact Info & Agency Meta,200,Contact an Officer - Town of Campbell,"","[""Contact an Officer""]",[],"[""Quick Links"", ""About"", ""Government"", ""Services"", ""Public Safety""]",[],[],[] -481,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/080421arrests.pdf,Arrest Records,200,"","",[],[],[],[],[],[] -482,https://whitestown.in.gov/news/whitestown-police-detectives-arrest-local-man-on-child-molestation-charges/,Media Bulletins,200,Whitestown Police Detectives Arrest Local Man on Child Molestation Charges - Town of Whitestown,"","[""Recent News"", ""Whitestown Police Detectives Arrest Local Man on Child Molestation Charges""]","[""How can we help?"", ""Recent News Articles"", ""\nHow to use a HAWK signal\n"", ""\nWhitestown Town Council Announces 2024 Board Appointments\n"", ""Visit Us"", ""Contact Us"", ""Stay Connected""]",[],[],[],[] -483,http://lafayettepolice.us/456/special-events,Not Criminal Justice Related,200,"Facilities | Lafayette, IN - Official Website",View the 3 different aquatic facilities that open to the public.,[],[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]","[""\nCastaway Bay\n"", ""\nTropicanoe Cove\n""]",[],[] -484,https://www.clarkstown.gov/police/surveillance-camera-registration/,Resources,200," - Surveillance Camera Registration – Town of Clarkstown ","","[""Surveillance Camera Registration""]","[""Town of Clarkstown"", ""Town of Clarkstown"", ""Government"", ""How Do I?"", ""Quick Links""]","[""Town of Clarkstown"", ""Town of Clarkstown"", ""Town of Clarkstown"", ""Sign up for our Newsletter"", ""\u00a9 2021 Town of Clarkstown""]",[],[],"[""Departments"", ""Sign Up"", ""Find"", ""Apply"", ""Report"", ""Pay For""]" -485,https://delcopa.gov/publicrelations/releases/2022/delcoartsweek.html,Not Criminal Justice Related,200,"The Arts Come Alive in Delco This Fall! - Delaware County, Pennsylvania","","[""The Arts Come Alive in Delco This Fall!""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Delco Arts Week being held October 1 through October 9""]",[],[] -486,https://spdblotter.seattle.gov/2013/05/02/mayor-council-signal-intent-to-site-and-build-new-police-station-for-north-precinct/,Media Bulletins,200,"Mayor, Council Signal Intent to Site and Build New Police Station for North Precinct - SPD Blotter","","[""Mayor, Council Signal Intent to Site and Build New Police Station for North Precinct""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -487,https://www.coronadelmar.us/safes-cash-pricey-watches-and-jewelry-police-documents-reveal-items-stolen-in-rash-of/,Media Bulletins,200,"Safes, cash, pricey watches and jewelry — police documents reveal items stolen in rash of … | Corona del Mar California","","[""Safes, cash, pricey watches and jewelry \u2014 police documents reveal items stolen in rash of \u2026""]","[""Menu"", "" Be First to Comment"", ""Subscribe"", """", """"]","[""Share this:"", ""Like this:"", ""Related"", ""Leave a Reply Cancel reply"", """"]",[],[],[] -488,https://www.knoxvilletn.gov/government/mayors_office/c_o_v_i_d-19___coronavirus_/stress_and_coping/knox_well/kid___parent_resources/general_adult_resources,Resources,200," - General Adult Resources - City of Knoxville -",covid19*,"[""General Adult Resources"", """"]",[],[],[],[],[] -489,https://oceancitymd.gov/oc/ocean-city-police-captain-austin-retires-after-31-years-of-service/,Media Bulletins,200,"Ocean City Police Captain Austin Retires After 31 Years of Service – Town of Ocean City, Maryland","",[],"[""Post navigation""]","[""Related posts""]",[],[],[] -490,https://www.rolesvillenc.gov/police,Contact Info & Agency Meta,200,"Police | Town of Rolesville, NC","","[""Police\n""]","[""Support Menu"", ""Social Media"", ""Main navigation"", ""Social Media"", ""Footer""]",[],[],"[""Connect with us""]",[] -491,https://www.prescott-az.gov/services-safety/police/reporting/accident-reports-on-line/,Contact Info & Agency Meta,200,Prescott Police | Prescott Police Department | Dedicated to Public Safety,Prescott Police Department provides the highest level of service in a collaborative effort with our community. Public Safety is Job #1.,[],"[""PUBLIC SAFETY IS JOB ONE!"", ""Keep in Touch""]","[""PrescottPolice"", ""Values"", ""Crime Prevention""]",[],[],[] -492,https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-40/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -493,https://delcopa.gov/controller/pdf/2020/dccwfinal-signed.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -494,https://www.antioch.il.gov/wpfb_file_category/commissions-police-and-fire-commission-agendas-2014-commissions-police-and-fire-commission-agendas-commissions-police-and-fire-commission-commissions/,Poor Data Source,200,"2014 - Antioch, IL","","[""Archives: 2014""]",[],"[""12-06-14 Police And Fire Agenda"", ""11-15-14 Police And Fire Agenda"", ""11-01-14 Police And Fire Agenda"", ""10-23-14 Police And Fire Agenda"", ""10-14-14 Police And Fire Agenda"", ""08-04-14 Police And Fire Agenda"", ""07-08-14 Police And Fire Agenda""]",[],[],[] -495,https://alpha.austin.gov/es/police-oversight/2020-06-12-11/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -496,http://www.lafayettepolice.us/214/application-process,Policies & Contracts,200,"Application/Appointment Process | Lafayette, IN - Official Website",Learn about the application and appointment process for becoming a police officer in Lafayette.,"[""\r\n\r\nApplication/Appointment Process\t\t""]","[""The Lafayette Police Force is An Equal Opportunity Employer"", ""\nApplication/Appointment Process""]","[""Loading"", ""\nAppointment Steps"", ""Probationary Period"", ""Availability Constraints"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -497,https://www.knightdalenc.gov/departments/police/crime-prevention/crime-stoppers,Contact Info & Agency Meta,200,"Crime Stoppers | Town of Knightdale, NC","","[""Crime Stoppers\n""]","[""Main navigation"", ""Social"", ""Footer Menu""]","[""Town of Knightdale, NC""]",[],[],[] -498,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0255/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -499,https://www.sandiego.gov/department-document/commission-police-practices-makes-recommendations-san-diego-police-department%e2%80%99s,Policies & Contracts,404,"","",,,,,, -500,https://www.casperwy.gov/news/news/newsroom/casper_police_officer_involved_shooting,Poor Data Source,404,"","",,,,,, -501,http://www.ryepolice.us/logs/police-logs-for-8-8-18-8-14-18,Dispatch Logs,200,Rye Police Department Police Logs for 8/8/18-8/14/18 - Rye Police Department,"","[""Police Logs for 8/8/18-8/14/18""]","[""Police Logs for 8/8/18-8/14/18""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -502,https://delcopa.gov/planning/programsandinitiatives/heritagecommission/upcomingevents.html,Not Criminal Justice Related,200,Heritage Commission of Delaware County - Upcoming Events,"","[""Heritage Commission of Delaware County - Upcoming Events""]","[""Upcoming Events""]","[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -503,https://www.mass.gov/doc/municipal-police-training-committee-mptc-open-meeting-notice-061522/download,Media Bulletins,200,"","",[],[],[],[],[],[] -504,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-1002/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -505,https://www.sandiego.gov/police/contact,Contact Info & Agency Meta,200,Contact | City of San Diego Official Website,"","[""City of San Diego Official Website"", ""Contact""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Liaisons"", ""Directory"", ""Pages"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -506,https://delcopa.gov/publicrelations/releases/2021/votebymail1018.html,Not Criminal Justice Related,200,"Municipal Election Vote-by-Mail Ballots Due to Arrive by Monday, October 18 - Delaware County, Pennsylvania","","[""Municipal Election Vote-by-Mail Ballots Due to Arrive by Monday, October 18""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Voters advised to disregard erroneous PA Department of State ballot mail dates""]",[],[] -507,https://dps.iowa.gov/dci-and-ames-police-department-investigate-suspicious-death,Media Bulletins,200,DCI and Ames Police Department Investigate Suspicious Death | Iowa Department of Public Safety,"February 21, 2021 AMES, Iowa - This is not a press release from the Iowa Department of Public Safety. It is being distributed on behalf of the Ames Police Department as a result of the Division of Criminal Investigation's assistance to local authorities in this case.","[""\n\n Iowa Department of\n \n\n Public Safety\n \n"", ""DCI and Ames Police Department Investigate Suspicious Death\n""]",[],[],[],[],[] -508,http://www.longbeach.gov/police/press-releases/dui-checkpoint/,Media Bulletins,200,DUI Checkpoint,"","[""Long BeachPolice Department""]",[],[],[],[],[] -509,https://training.detroitmi.gov/departments/police-department/project-green-light-detroit/agreements,Media Bulletins,503,"","",,,,,, -510,https://www.antioch.il.gov/wpfb-file/10-11-11-police-and-fire-agenda-pdf-5/,Poor Data Source,200,"10-11-11 Police And Fire Agenda - Antioch, IL",10 11 police and fire agenda pdf commissions commission agendas 2011 2017 05 17 08 41 32 0000,"[""10-11-11 Police And Fire Agenda""]",[],[],[],[],[] -511,http://cityofcanalfulton-oh.gov/police-department-hiring-entry-level-police-officer/,Training & Hiring Info,404,"","",,,,,, -512,https://police.crystalmn.gov/r_e_s_i_d_e_n_t/public_works,Not Criminal Justice Related,200," - Public Works - City of Crystal -",Links and information related to the City of Crystal Public Works Department.,"[""Public Works""]","[""Crystal Public Works""]","[""Sign up for a city newsletter or notification."", ""City Hall"", ""Regular Hours:""]","[""Monday - Friday""]",[],[] -513,https://www.ci.plymouth.mi.us/government/departments/police/history,Not Criminal Justice Related,200," - History - City of Plymouth, MI -","","[""History""]",[],[],[],[],[] -514,https://rexburg.us/police-ask-for-help-finding-man-who-left-for-work-and-hasnt-been-seen-since/,Media Bulletins,522,"","",,,,,, -515,https://spdblotter.seattle.gov/2014/12/17/police-increasing-patrols-after-early-morning-gunfire-near-south-seattle-school/,Media Bulletins,200,Police Increasing Patrols After Early Morning Gunfire Near South Seattle School - SPD Blotter,"","[""Police Increasing Patrols After Early Morning Gunfire Near South Seattle School""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -516,https://coloradosprings.gov/police-department/article/news/multiple-arrests-internet-crimes-against,Media Bulletins,200,Multiple Arrests by Internet Crimes Against Children Task Force | City of Colorado Springs,"","[""\nMultiple Arrests by Internet Crimes Against Children Task Force\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -517,https://www.lynchburgvapolice.gov/news-updates/2124/,Media Bulletins,404,"","",,,,,, -518,https://www.mass.gov/event/2022-pittsfield-police-department-open-house-5-pm-2022-01-11t170000-0500-2022-01-11t180000-0500,Resources,200,2022 Pittsfield Police Department Open House - 5 PM | Mass.gov,"","[""\n 2022 Pittsfield Police Department Open House - 5 PM\n ""]","[""Overview\n of 2022 Pittsfield Police Department Open House - 5 PM"", ""Additional Resources\n for 2022 Pittsfield Police Department Open House - 5 PM"", ""Participating Organizations\n "", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -519,https://brookfieldil.gov/publication/july-1-2020-board-of-fire-and-police-commissioners/,Poor Data Source,404,"","",,,,,, -520,https://delcopa.gov/sustainability/pdf/raise/potentialeconomicimptwaterfront.pdf,Not Criminal Justice Related,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -521,https://www.providenceri.gov/police/explorers-program/attention/,Poor Data Source,200,City of Providence Attention - City of Providence,"","[""Attention""]","[""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""SIGN UP FOR OUR WEEKLY E-NEWS | \nHaga clic aqu\u00ed para espa\u00f1ol"", ""Lists*""]",[],[],[] -522,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/021121summary.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -523,https://piedmont.ca.gov/services___departments/police/services/social_media,Contact Info & Agency Meta,200," - Social Media - City of Piedmont -","","[""\r\n City of\r\n Piedmont""]",[],[],[],[],[] -524,https://gonzalesca.gov/services/police/how-do-i/learn-what-crime-rate-gonzales,Resources,200,Learn what the crime rate is in Gonzales? | City of Gonzales,"Official City of Gonzales, CA website. Find the latest news, events, and information for residents and businesses....","[""The City of Gonzales, California"", ""The City of Gonzales, California""]","[""Top menu"", ""Learn what the crime rate is in Gonzales?""]",[],"[""CITY OF GONZALES""]",[],[] -525,https://council.seattle.gov/2022/08/19/west-seattle-bridge-police-recruitment-and-incentives-bill-passes-abortion-access-bill-signing-metropolitan-parks-district-public-hearing-small-tenant-improvement-fund-seattle-restored-program/,Policies & Contracts,200,West Seattle Bridge; Police Recruitment and Incentives Bill Passes; Abortion Access Bill Signing; Metropolitan Parks District Public Hearing; Small Tenant Improvement Fund; Seattle Restored Program – Landlords and Artists/Entrepreneurs Can Apply; King County Assessor Valuations and Appeals; No Newsletter Next Two Weeks - Seattle City Council Blog,"",[],"[""West Seattle Bridge; Police Recruitment and Incentives Bill Passes; Abortion Access Bill Signing; Metropolitan Parks District Public Hearing; Small Tenant Improvement Fund; Seattle Restored Program \u2013 Landlords and Artists/Entrepreneurs Can Apply; King County Assessor Valuations and Appeals; No Newsletter Next Two Weeks"", ""More posts""]","[""West Seattle Bridge"", ""Police Recruitment and Incentives Bill Passes"", ""Abortion Access Bill Signing"", ""Metropolitan Parks District Public Hearing"", ""Small Tenant Improvement Fund"", ""Seattle Restored Program \u2013 Landlords and Artists/Entrepreneurs Can Apply"", ""King County Assessor Valuations and Appeals"", ""No Newsletter Next Two Weeks"", ""\nTanya Woo appointed to fill vacancy on Seattle City Council\n"", ""\nSeattle CityClub to host public forum with finalists to fill Council vacancy\n"", ""\nSeattle City Council identifies eight finalists for vacancy\u00a0\n"", ""HELPFUL LINKS"", ""Make your voice heard"", ""Councilmembers""]",[],[],[] -526,https://estespark.colorado.gov/departments/police/operations/patrol/code-enforcement/report-a-potential-code-violation,Not Criminal Justice Related,200,Report a Potential Code Violation | Town of Estes Park,"","[""\nReport a Potential Code Violation\n""]",[],"["""", ""\n"", ""\nLanguage Translation\n""]",[],[],[] -527,https://oceancitymd.gov/oc/worcester-county-law-enforcement-agencies-to-co-host-citizens-police-academy/,Misc Police Activity,200,"Worcester County Law Enforcement Agencies to Co-Host Citizens Police Academy – Town of Ocean City, Maryland","","[""Worcester County Law Enforcement Agencies to Co-Host Citizens Police Academy""]","[""Post navigation""]","[""Related posts""]",[],[],[] -528,https://delcopa.gov/ich/pdfs/covid_govwolf_march12.pdf,Not Criminal Justice Related,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -529,http://www.longbeach.gov/police/news/south-division-forum/,Media Bulletins,200,South Division Forum,"Join South Patrol Division Commander Michael Lewis for the next Community Forum on Wednesday, June 21, 2017, 6:00 p.m., to 8:00 p.m.","[""Police Department"", ""South Division Commander's Community Forum""]",[],"[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""Crime Lab Survey"", ""\u00a0""]",[] -530,https://delcopa.gov/departments/heatplan/heatsafetytips.pdf,Media Bulletins,200,"","",[],[],[],[],[],[] -531,"https://norfolkne.gov/government/departments/police-division/press-releases/march-11,-2021-press-release.html",Media Bulletins,200,"March 11, 2021 Press Release - City of Norfolk, NE","","[""City of Norfolk, NE"", ""Police Division"", ""March 11, 2021 Press Release""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]" -532,https://www.newhopemn.gov/news___features/now_recruiting_police_reserves,Training & Hiring Info,404,"","",,,,,, -533,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/arrests/083022arrests.pdf,Arrest Records,404,"","",,,,,, -534,https://rockfordil.gov/police-lgbtqia-liaison/,Contact Info & Agency Meta,404,"","",,,,,, -535,https://www.sandiego.gov/police/community,Resources,200,Community | City of San Diego Official Website,"","[""City of San Diego Official Website"", ""Community""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Community"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -536,https://www.naperville.il.us/services/naperville-police-department/programs-and-services/fingerprinting/,Resources,200,Fingerprinting | The City of Naperville,The Naperville Police Department offers fingerprinting services to Naperville residents for a $10.00 fee.,"[""Fingerprinting""]","[""Programs and Services "", ""Naperville Police Department""]","[""Explore""]",[],"[""Helping Residents Build a Better Community"", ""Resources for Doing Business in Naperville""]",[] -537,https://spdblotter.seattle.gov/2013/02/25/if-you-see-a-handcuffed-man-walking-around-near-harborview-give-police-a-call/,Media Bulletins,200,"If You See a Handcuffed Man Walking Around Near Harborview, Give Police a Call - SPD Blotter","","[""If You See a Handcuffed Man Walking Around Near Harborview, Give Police a Call""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -538,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0421/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -539,https://coloradosprings.gov/police-department/page/falcon-division,Contact Info & Agency Meta,200,Falcon Division | City of Colorado Springs,"","[""\nFalcon Division\n""]","[""Search"", ""Falcon Division (Northwest)"", ""About Falcon"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],"[""HOURS:""]","[""REPORT ONLINE""]",[] -540,https://wyoming.delaware.gov/police-department/policedepartmentapplication2017/,Training & Hiring Info,200,PoliceDepartmentApplication - Town of Wyoming,"","[""Wyoming""]","[""Delaware"", ""PoliceDepartmentApplication""]","[""Menu"", ""Contact Us""]",[],[],[] -541,http://lafayettepolice.us/149/departments-a---f,Contact Info & Agency Meta,200,"Departments A - F | Lafayette, IN - Official Website",Learn about the departments and divisions A - F that make up the city government. ,"[""\r\n\r\nDepartments A - F\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]","[""\nAnimal Control\n"", ""\nCity Attorney\n"", ""\nCity Clerk\n"", ""\nCity Controller\n"", ""\nCommunications and Marketing\n"", ""\nEconomic Development\n"", ""\nEngineering & Public Works\n"", ""\nFacilities\n"", ""\nFire Department\n"", ""\nFleet Maintenance\n""]",[],[] -542,https://delcopa.gov/sustainability/sustainabilityplan.html,Not Criminal Justice Related,200,Sustain Delco: A Sustainability Plan for Delaware County,"","[""Sustain Delco: A Sustainability Plan for Delaware County""]",[],"[""Office of Sustainability Navigation\r\n"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Sustain Delco: A Sustainability Plan for Delaware County, Pennsylvania""]",[],"[""What is a Sustainability and Climate Action Plan?"", ""Why is a Sustainability and Climate Action Plan Important for Delaware County?"", ""EXPLORE SUSTAIN DELCO: A SUSTAINABILITY PLAN FOR DELAWARE COUNTY""]" -543,https://hollister.ca.gov/government/city-departments/police/,Contact Info & Agency Meta,200,"Police – City of Hollister, California","","[""\u00a0San Benito County Opioid Task Force""]",[],"[""Follow Us on..."", ""A Message from Chief Reynoso"", ""San Benito County Public Safety PSA"", ""HPD Values and Vision"", ""Follow Us on....""]",[],[],[] -544,https://spdblotter.seattle.gov/2022/05/26/police-arrest-one-seize-gun-drugs-cash-downtown-thursday-evening/,Media Bulletins,200,"Police Arrest One, Seize Gun, Drugs, Cash Downtown Thursday Evening - SPD Blotter","","[""Police Arrest One, Seize Gun, Drugs, Cash Downtown Thursday Evening""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -545,http://www.longbeach.gov/police/press-releases/l-b-p-d--receives-grant-for-special-traffic-enforce----crash-prevention/,Media Bulletins,200,L.B.P.D. Receives Grant for Special Traffic Enforce. & Crash Prevention,"","[""Long BeachPolice Department""]",[],[],[],[],[] -546,https://ci.san-bernardino.ca.us/city_hall/police_department/public_safety/traffic_safety_programs/alpr_statistics,Poor Data Source,200," - ALPR Statistics - City of San Bernardino -","","[""City of San Bernardino California""]","[""ALPR Statistics""]",[],[],[],[] -547,https://www.knoxvilletn.gov/government/city_departments_offices/police_department/field_operations_bureau/community_partnership_officers/c_p_t_e_d_security_surveys,Resources,200," - CPTED Security Surveys - City of Knoxville -",police*,"[""CPTED Security Surveys"", ""Police Chief""]",[],[],[],[],[] -548,https://www.mass.gov/news/environmental-police-officer-ab-exam-update,Training & Hiring Info,200,Environmental Police Officer A/B Exam Update | Mass.gov,"Eligible List Establishment Date: January 15, 2021","[""\nNews\u00a0\n Environmental Police Officer A/B Exam Update\n ""]","[""\n\nCivil Service\u00a0\n\n"", ""Related to Environmental Police Officer A/B Exam Update"", ""Help Us Improve Mass.gov with your feedback""]","[""\n\n2020 Environmental Police Officer A/B Exam\u00a0\n\n""]",[],[],[] -549,https://coloradosprings.gov/tag/police,Media Bulletins,404,"","",,,,,, -550,https://www.lasalle-il.gov/departments/police-department,Contact Info & Agency Meta,200,Police Department | City of La Salle,"The mission of the LaSalle Police Department, in cooperation with our community, is to protect life and property, and enhance the quality of life for all our citizens.","[""Police Department\n""]","[""Main navigation"", ""Breadcrumb"", ""Mission Statement"", ""The Illinois Valley's Finest"", ""Police Department Information"", ""Main Menu"", ""Important Info""]",[],[],[],[] -551,https://www.sandiego.gov/event/community-coffee-cop,Poor Data Source,403,"","",,,,,, -552,https://www.mass.gov/doc/police-standards-subcommittee-open-meeting-notice-agenda/download,Poor Data Source,200,"","",[],[],[],[],[],[] -553,https://www.dps.nm.gov/blog/2022/04/12/update-cancel-silver-alert-belen-nm-sally-krieger-has-been-located-and-is-safe-please-refer-all-inquiries-and-questions-to-belen-police-department-at-505-865-9130/,Media Bulletins,200,"UPDATE: CANCEL Silver Alert - Belen, NM - Sally Krieger has been located and is safe. Please refer all inquiries and questions to Belen Police Department at (505) 865-9130. - NM Department of Public Safety","","[""UPDATE: CANCEL Silver Alert \u2013 Belen, NM \u2013 Sally Krieger has been located and is safe. Please refer all inquiries and questions to Belen Police Department at (505) 865-9130.""]",[],"[""Location"", ""Sitemap"", ""Quick Links"", ""Social Media Links""]",[],[],[] -554,http://www.longbeach.gov/press-releases/jason-campbell-appointed-police-administration-bureau-chief/,Media Bulletins,200,Jason Campbell Appointed Police Administration Bureau Chief,"","[""PRESS RELEASE""]",[],[],[],[],[] -555,http://www.tampa.gov/news/tampa-police-work-identify-battery-suspect-64991,Media Bulletins,200,Tampa Police Work to Identify Battery Suspect | City of Tampa,                ,"[""Tampa Police Work to Identify Battery Suspect\n""]","[""Information Resources"", ""\nLatest News\n"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[] -556,https://cityofgulfbreeze.us/departments/police/faqs-2/,Resources,200,FAQS - City of Gulf Breeze,Question: How do I obtain a Crash report? Answer: Obtain Crash Report Online It’s now possible to obtain a copy of a crash report online. The following information is required to request the report: Date of collision Driver’s last name Crash report number Name of agency investigating the crash Simply visit FLHSMV's website and enter the,"[""FAQS""]","[""Mobile Menu"", ""Before Header"", ""Header Right"", ""Primary Sidebar"", ""Footer"", ""\nWhat can we help you find?\n""]","[""Departments"", ""No Active Advisories"", "" City Projects"", ""Get Text Updates"", ""City of Gulf Breeze"", ""Most Requested"", ""County Agencies"", ""State Sites""]","[""Question: How do I obtain a Crash report?"", ""Answer: "", ""Question: How do I obtain a police report?"", ""Question: How can I get fingerprinted or obtain a V.I.N. verification?"", ""Question: I have had several phone calls from people representing themselves as police officers and asking for donations. Are these police officers and what is the money used for? "", ""Question: I received a call from a company claiming I had won a trip, but in order to claim my prize, I have to give them my bank account number, social security number, credit card number or some money. What should I do? Is this a scam? "", ""Question: Can you tell me if there\u2019s a warrant out for my arrest?\u00a0"", ""Question: Can you tell me if someone is in jail? "", ""Question: What can I do about speeding in my neighborhood?\u00a0"", ""Question: How can I become a police officer?\u00a0"", ""Question: I received a traffic citation I do not agree with. What can I do about it?\u00a0"", ""Question: I saw a strange car in my neighborhood, but am unsure about calling the police when something like that happens."", ""Question: How do I recover my personal property from the Police Department?"", ""Question: I am going out of town; Can I have an officer check on my house while I am gone?\u00a0"", ""Question: What does the Police Department do with found property that is turned in by the public or submitted by officers?\u00a0"", ""Highpoint Water Main Replacement"", ""Eufaula Outfall Treatment Unit \u2013 RESTORE"", ""Fairpoint Septic-to-Sewer (STS) Conversion"", ""City Hall""]",[],[] -557,https://spdblotter.seattle.gov/2014/03/08/citizens-respond-to-a-woman-in-distress-and-hold-down-robbery-suspect-until-police-arrive/,Media Bulletins,200,Citizens Respond To A Woman In Distress And Hold Down Robbery Suspect Until Police Arrive - SPD Blotter,"","[""Citizens Respond To A Woman In Distress And Hold Down Robbery Suspect Until Police Arrive""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -558,http://www.longbeach.gov/police/press-releases/traffic-fatality-anaheim-st-and-long-beach-blv/,Media Bulletins,200,TRAFFIC FATALITY ANAHEIM ST AND LONG BEACH BLV,"","[""Long BeachPolice Department""]",[],[],[],[],[] -559,http://www.longbeach.gov/police/press-releases/sexual-assault-suspect-arrested--additional-victims-sought/,Media Bulletins,200,SEXUAL ASSAULT SUSPECT ARRESTED; ADDITIONAL VICTIMS SOUGHT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -560,https://delcopa.gov/publicrelations/releases/2019/pdf/nationalcrimevictimsrightsweekeventflyer2019.pdf,Poor Data Source,200,"","",[],[],[],[],[],[] -561,https://www.rolesvillenc.gov/police/frequently-asked-questions,Contact Info & Agency Meta,200,"Frequently Asked Questions | Town of Rolesville, NC","","[""Frequently Asked Questions\n""]","[""Support Menu"", ""Social Media"", ""Main navigation"", ""Social Media"", ""Footer""]","[""NEEDING ASSISTANCE"", ""TRAFFIC ACCIDENTS"", ""FIREARMS"", ""FINGERPRINTING"", ""RESTRAINING ORDERS"", ""ANIMAL COMPLAINTS"", ""TRAFFIC TICKETS\u00a0\u00a0"", ""CAR SEATS"", ""COMPLIMENTS & COMPLAINTS"", ""CIVIL CITATIONS""]","[""When do I call 911?"", ""Should I call the police if I see something suspicious or unusual?"", ""What do I do if I am involved in a traffic crash?"", ""I was involved in a traffic crash.\u00a0 How can I get a copy of the report?"", ""How do I obtain a firearm purchase permit or concealed carry permit?"", ""I need to be fingerprinted for a job. Can I visit the police station to have this done?"", ""How do I\u00a0file a restraining order or domestic violence protection order against someone?"", ""Does the Rolesville Police Department handle animal complaints?"", ""I received a traffic ticket, but I forgot my court date. How can I found out when I\u2019m supposed to go to court?"", ""I received a warning ticket for a traffic violation. How do I handle this?"", ""How can I found out if my child is still required to ride in the car with a booster seat?"", ""How can I go about complimenting an officer or filing a complaint?"", ""I received a civil citation from a Rolesville officer, how do I make an appeal?""]","[""Connect with us""]",[] -562,https://ethics.ny.gov/news/jcope-settles-lobbyist-alleged-lobbying-law-gift-violation,Media Bulletins,200,JCOPE Settles with Lobbyist on Alleged Lobbying Law Gift Violation | New York State Commission on Ethics and Lobbying in Government,JCOPE settles alleged Lobbying Law gift violation,"[""\n New York State\n Commission on Ethics and Lobbying in Government\n"", ""\nJCOPE Settles with Lobbyist on Alleged Lobbying Law Gift Violation\n""]","[""SHARE"", ""\n Contact Communications and Public Information Office\n"", ""CONNECT WITH US""]","[""\nFred Hiffa Substantial Basis Investigation and Settlement Agreement\n\n"", ""Contact us by phone:"", ""Contact us by email:"", ""Mailing Address:"", ""Translation Services""]",[],[],[] -563,https://spdblotter.seattle.gov/2017/06/05/police-conducting-death-investigation-at-sr-509-encampment/,Media Bulletins,200,(UPDATE) Two Men Arrested Following Death Investigation at SR-509 Encampment - SPD Blotter,"","[""(UPDATE) Two Men Arrested Following Death Investigation at SR-509 Encampment""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -564,https://alpha.austin.gov/es/police-oversight/2020-06-4-8/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -565,https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-22/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -566,https://delcopa.gov/publicrelations/releases/2020/votingdemo_canceled.html,Media Bulletins,200,"Delaware County Cancels Voting Machine Demonstrations - Delaware County, Pennsylvania","","[""Delaware County Cancels Voting Machine Demonstrations""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Demonstrations cancelled to adhere to social distancing guidance to prevent the spread of COVID-19""]",[],[] -567,https://delcopa.gov/publicrelations/releases/2018/jurorphonesscam.pdf,Media Bulletins,200,"","",[],[],[],[],[],[] -568,https://www.waynesvillenc.gov/departments/police/about-us,Contact Info & Agency Meta,200,"About Us | The Town of Waynesville, NC",Mission Statement  “Our mission is to provide a safe environment for all citizens through the collective contributions of the community. Pride and integrity reflect our dedication to community values”. Statement of Values The Waynesville Police Department holds forth professional integrity as our most fundamental value. Professional integrity includes:,"[""About Us\n""]","[""Secondary navigation"", ""Main navigation"", ""Breadcrumb"", ""Waynesville Police""]","[""Mission Statement\u00a0"", ""Statement\u00a0of Values"", ""\u00a0"", ""Three divisions\u00a0"", ""Communications""]","[""Personal Integrity"", ""Professionalism"", ""Respect"", ""Fairness"", ""Loyalty"", ""Contact Information"", ""Stay Connected""]",[],[] -569,https://beaumonttexas.gov/beaumont-police-investigating-fatality-accident-2400-block-of-s-mlk/,Poor Data Source,404,"","",,,,,, -570,https://www.knoxvilletn.gov/government/city_departments_offices/police_department/management_services_bureau/recruitment_job_opportunities/basic_info_for_becoming_a_police_cadet,Training & Hiring Info,200,Become a Cadet - Join Knoxville Police Department,"","[""Become A Cadet""]","[""Feel drawn to a career as a police officer but not yet\u00a021?""]","[""Cadet Benefits and Compensations"", ""DO I QUALIFY?""]",[],[],"[""Health insurance with prescription, dental, and vision"", ""Health insurance with prescription, dental, and vision"", ""Long-term disability insurance"", ""Long-term disability insurance"", ""Life insurance and longevity pay"", ""Life insurance and longevity pay"", ""Up to $3,000 per year in tuition reimbursement"", ""Up to $3,000 per year in tuition reimbursement"", ""457B retirement plan (deferred compensation)"", ""457B retirement plan (deferred compensation)"", ""YMCA membership discount"", ""YMCA membership discount"", ""Health insurance with prescription, dental, and vision"", ""Health insurance with prescription, dental, and vision"", ""Our Ideal Candidate""]" -571,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0103/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -572,http://www.ryepolice.us/pressrelease/pioneer-rd-closed-due-to-crash,Not Criminal Justice Related,200,Rye Police Department Pioneer Rd Closed Due to Crash - Rye Police Department,"","[""Pioneer Rd Closed Due to Crash""]","[""Pioneer Rd Closed Due to Crash""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -573,http://www.lafayettepolice.us/faq.aspx?qid=183,Not Criminal Justice Related,200,FAQs • What locations need a Class K extinguisher?,"",[],"[""\n\u25bc\r\nFire Extinguishers\t\t""]","[""Loading"", ""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -574,https://riag.ri.gov/press-releases/state-federal-and-law-enforcement-leaders-announce-16-million-grants-police,Media Bulletins,200,"State, federal, and law enforcement leaders announce $16 million in grants for police departments statewide for body-worn cameras | Rhode Island Attorney General's Office","","[""State, federal, and law enforcement leaders announce $16 million in grants for police departments statewide for body-worn cameras""]",[],[],[],[],[] -575,https://www.stmatthewsky.gov/police/srt-vehicle/,Poor Data Source,200,SRT Vehicle - City of St Matthews,"","[""SRT Vehicle""]",[],[],[],[],[] -576,https://www.ci.corcoran.mn.us/public_services/police/training_and_safety/emergency_preparedness_guide,Not Criminal Justice Related,200," - Emergency Preparedness Guide - City of Corcoran -","","[""Emergency Preparedness Guide""]",[],[],[],[],[] -577,http://www.longbeach.gov/police/press-releases/traffic-fatality-artesia-and-myrtle1/,Media Bulletins,200,TRAFFIC FATALITY ARTESIA AND MYRTLE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -578,http://www.ryepolice.us/logs/police-logs-for-71316-71916,Daily Activity Logs,200,Rye Police Department Police Logs for 7/13/16-7/19/16 - Rye Police Department,"","[""Police Logs for 7/13/16-7/19/16""]","[""Police Logs for 7/13/16-7/19/16""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -579,http://www.longbeach.gov/police/press-releases/dui-checkpoint-proves-effective-4-/,Media Bulletins,200,DUI CHECKPOINT PROVES EFFECTIVE(4),"","[""Long BeachPolice Department""]",[],[],[],[],[] -580,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/111522blotter.pdf,Poor Data Source,404,"","",,,,,, -581,https://www.huntsvilleal.gov/videos/huntsville-police-departments-captain-mccarver-lets-grow-together/,Poor Data Source,200,Huntsville Police Department's Captain McCarver: Let's Grow Together - City of Huntsville,"","[""Huntsville Police Department\u2019s Captain McCarver: Let\u2019s Grow Together""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],[],[],[] -582,http://www.ryepolice.us/pressrelease/positive-covid-19-case-at-rye-recycling-center/attachment/ryerecyclecase-2020-dhhs-edits-covid-09282020,Not Criminal Justice Related,200,Rye Police Department RyeRecycleCase-2020-DHHS edits Covid 09282020 - Rye Police Department,"","[""RyeRecycleCase-2020-DHHS edits Covid 09282020""]","[""RyeRecycleCase-2020-DHHS edits Covid 09282020""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -583,https://police.greenvillesc.gov/313/trails-bikes,Not Criminal Justice Related,200,"Trails & Bikes | Greenville, SC - Official Website","Learn all about the Greenways Master Plan, and find your way around Greenville using our systems of trails and greenways.","[""\r\n\r\nTrails & Bikes\t\t""]","[""Trails & Greenways: A Top Priority"", ""Augusta Street Bike Boulevard""]","[""Loading""]",[],[],[] -584,http://www.lafayettepolice.us/851/fire-resistance-rated-construction,Not Criminal Justice Related,200,"Fire Resistance Rated Construction | Lafayette, IN - Official Website",Fire-Resistance-Rated Construction is building construction in which the structural members are used for the separation of adjacent spaces to safeguard against the spread of fire and smoke within a building.,"[""\r\n\r\nFire Resistance Rated Construction\t\t""]",[],"[""Loading"", ""Contact Us"", ""Brian Alkire"", ""Fire Prevention Bureau"", ""Hours"", ""FAQs"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -585,http://www.longbeach.gov/police/press-releases/arrests-made-in-murder-case/,Media Bulletins,200,ARRESTS MADE IN MURDER CASE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -586,https://cityoflakewood.us/police-homepage/lakewood-police-apply-for-a-job/,Poor Data Source,404,"","",,,,,, -587,http://lafayettepolice.us/3547/e-sports,Not Criminal Justice Related,404,"","",,,,,, -588,https://www.lynchburgvapolice.gov/news-updates/update-child-found-wandering-on-linkhorne-road-mother-located/,Media Bulletins,200,[UPDATE] Child Found Wandering on Linkhorne Road - Mother Located - Lynchburg Police Department,"","[""[UPDATE] Child Found Wandering on Linkhorne Road \u2013 Mother Located""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[] -589,https://spdblotter.seattle.gov/2019/07/25/police-arrest-suspected-heroin-dealer-arrested-downtown/,Media Bulletins,200,Suspected Heroin Dealer Arrested Downtown - SPD Blotter,"","[""Suspected Heroin Dealer Arrested Downtown""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -590,https://spdblotter.seattle.gov/2021/08/19/police-arrest-woman-for-violating-court-order-protecting-mayor-durkan/,Media Bulletins,200,Police Arrest Woman for Violating Court Order Protecting Mayor Durkan - SPD Blotter,"","[""Police Arrest Woman for Violating Court Order Protecting Mayor Durkan""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -591,http://www.police.wallingfordct.gov/police-station-project/,Contact Info & Agency Meta,200,Police Station Project | Wallingford Police Department,Police Station Project,"[""2022 Police Station Project"", ""New Police Headquarters Construction Photos"", ""New Police Headquarters Construction Photos"", ""New Police Headquarters Construction Photos"", ""Work Continues on Design of New Wallingford Police Station"", ""Wallingford Acquires Former 3M Building for New Police Station"", ""Wallingford Town Council Approves Purchase of Site for New Police Station""]","[""RSS Feed\u00a0""]",[],[],[],[] -592,https://www.floresvilletx.gov/departments/police/complaints-commendations/,Contact Info & Agency Meta,200,Complaints & Commendations - Police Department - City of Floresville,Our complaint system and disciplinary procedures subject Floresville police officers to corrective action and protect them from unwarranted criticism.,"[""Complaints & Commendations""]","[""I\u2019m looking for...""]","[""Internal Affairs"", ""Reporting Procedure"", ""Types of Complaints\u00a0"", ""Complaint Investigation and Disposition Process"", ""Complaint Disposition"", ""Note"", ""Commendations"", ""Police Pages"", ""Government"", ""Departments"", ""Community"", ""Contact & Feedback""]",[],[],[] -593,https://delcopa.gov/ojs/efileforms/court admin forms for efile/writofexecutionnotice.pdf,Poor Data Source,200,"","",[],[],[],[],[],[] -594,http://www.longbeach.gov/police/press-releases/police-seek-public-s-help-with-identifying-financial-crimes-suspect/,Media Bulletins,200,Police Seek Public's Help with Identifying Financial Crimes Suspect,"","[""Long BeachPolice Department""]",[],[],[],[],[] -595,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2019_news_releases/coffee_with_a_cop,Media Bulletins,200," - Coffee with a Cop - Village of Pleasant Prairie -","",[],"[""Coffee with a Cop""]","[""Follow Us on Social Media""]",[],[],[] -596,https://police.greenvillesc.gov/599/paratransit-information,Not Criminal Justice Related,200,"Paratransit Information | Greenville, SC - Official Website","Greenville Area Paratransit (GAP) is an American with Disabilities Act paratransit service provided for individuals who, because of their disability, are unable to use Greenlink's fixed route bus service. Learn all about eligibility, service hours, and service area. From this page you can also schedule rides and file appeals.","[""\r\n\r\nParatransit Information\t\t""]",[],"[""Loading"", ""Begin the process by downloading an application.""]","[""Download the GAP Rider's Handbook"", ""ADA Grievance Form""]",[],[] -597,https://www.fultoncountyga.gov/news/2021/07/23/fulton-county-police-observe-national-night-out,Media Bulletins,200,Fulton County Police Observe National Night Out,"","[""Fulton County Police Observe National Night Out"", ""Fulton County Police Observe National Night Out""]",[],"[""\r\n Share This Story\r\n ""]","[""\r\n Contact Us\r\n \n"", ""\r\n Helpful Links\r\n \n""]",[],"[""License & Certificates"", ""License & Certificates"", ""Voting & Elections"", ""Voting & Elections"", ""Health Services"", ""Health Services"", ""Libraries & Arts"", ""Libraries & Arts"", ""Animal Services"", ""Animal Services"", ""Youth"", ""Youth"", ""Seniors"", ""Seniors"", ""Water"", ""Water"", ""Public Safety"", ""Public Safety"", ""Courts"", ""Courts"", ""Human Services"", ""Human Services"", ""Other"", ""Other"", ""Property"", ""Property"", ""Vehicles"", ""Vehicles"", ""Water"", ""Water"", ""Doing Business with FC"", ""Doing Business with FC"", ""Bid Opportunities"", ""Bid Opportunities"", ""Economic Development"", ""Economic Development"", ""Permits and Inspections"", ""Permits and Inspections"", ""Courts"", ""Courts"", ""Justice Agencies"", ""Justice Agencies"", ""Court Services"", ""Court Services"", ""Board of Commissioners"", ""Board of Commissioners"", ""Clerk to the Commission"", ""Clerk to the Commission"", ""BOC Meeting Schedule"", ""BOC Meeting Schedule"", ""Agendas and Minutes"", ""Agendas and Minutes"", ""Watch Previous Board Meetings"", ""Watch Previous Board Meetings"", ""Citizen Engagement"", ""Citizen Engagement"", ""CourtWatch"", ""CourtWatch"", ""Tours and Requests"", ""Tours and Requests"", ""Volunteer Opportunities"", ""Volunteer Opportunities"", ""Youth Programs"", ""Youth Programs"", ""About Fulton County"", ""About Fulton County"", ""Executive Leadership"", ""Executive Leadership"", ""Fulton County Departments"", ""Fulton County Departments"", ""Fulton County Initiatives"", ""Fulton County Initiatives"", ""Open Government"", ""Open Government""]" -598,https://www.sandiego.gov/department-document/march242009100-16th-streetaudioofficer-k-copeland-walkthroughredactedkmwav,Misc Police Activity,404,"","",,,,,, -599,https://delcopa.gov/publicrelations/releases/2020/babyitempickup_june19.html,Not Criminal Justice Related,200,"Baby Item Pick Up to be held June 19 - Delaware County, Pennsylvania","","[""Baby Item Pick Up to be held June 19""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -600,https://broadview-il.gov/events/police-and-fire-committee-meeting/,Poor Data Source,200,Police and Fire Committee Meeting | Broadview,"","[""Police and Fire Committee Meeting""]",[],"[""Leave a Reply Cancel reply"", ""I Want To"", ""Upcoming Events"", ""About Broadview, IL"", ""Phone Numbers"", ""Join Our Newsletter"", ""Broadview Municipal Building""]",[],[],[] -601,https://jamestownnd.gov/event/public-works-police-fire-committees-2-2023-06-22/,Poor Data Source,200,Public Works; Police & Fire Committees - City of Jamestown,"","[""\n\n\n\n"", ""Public Works; Police & Fire Committees"", ""\r\n\tCity Hall Offices""]","[""June 22, 2023 @ 4:00 PM"", "" Details "", "" Venue ""]","[""Event Navigation"", ""Event Navigation"", ""Social"", ""Menu""]",[],[],[] -602,https://police.birminghamal.gov/command-staff/captains/,Contact Info & Agency Meta,200,Captains | Birmingham Police Department,"","[""\n\n\n Birmingham Police Department\n\n\t\t\t\t\tCommitment | Excellence | Integrity\t\t\t\t\n\n""]","[""Putting People First"", ""Captains""]",[],"[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[] -603,http://www.longbeach.gov/police/press-releases/long-beach-police-seeking-the-public-s-help-in-identifying-armed-robbery-suspect---video-footage-available--/,Media Bulletins,200,LONG BEACH POLICE SEEKING THE PUBLIC'S HELP IN IDENTIFYING ARMED ROBBERY SUSPECT --VIDEO FOOTAGE AVAILABLE--,"","[""Long BeachPolice Department""]",[],[],[],[],[] -604,http://lafayettepolice.us/316/housing-information-and-application,Not Criminal Justice Related,200,"Housing Choice Voucher Application Information | Lafayette, IN - Official Website",Applications are currently being accepted.,"[""\r\n\r\nHousing Choice Voucher\u00a0Application Information\t\t""]","[""\n\nMichelle Reynolds \n""]","[""Loading"", ""Contact Us"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -605,https://spdblotter.seattle.gov/2020/05/30/police-respond-to-protests-property-damage-arrest-seven/,Media Bulletins,200,"Police Respond to Protests, Property Damage, Arrest Seven - SPD Blotter","","[""Police Respond to Protests, Property Damage, Arrest Seven""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -606,https://southamptontownnypolice.gov/205/adopt-a-planting-program,Not Criminal Justice Related,200,"Adopt a Planting Program | Southampton, NY - Official Website",Discover how to take part in the Adopt a Planting Program and help maintain a planting area.,"[""\r\n\r\nAdopt a Planting Program\t\t""]","[""Adopt A Planting Program""]","[""Loading"", ""Site Tools"", ""Contact Us"", ""Charles McArdle\u00a0"", ""Hours"", ""Contact Us"", ""Site Links""]",[],[],[] -607,https://townofpaonia.colorado.gov/paonia-police-department-employment-application,Training & Hiring Info,200,Paonia Police Department Employment Application | Town of Paonia,"","[""\nPaonia Police Department Employment Application\n""]",[],"["""", ""\n"", """"]",[],[],[] -608,https://delcopa.gov/controller/pdf/2017andolder/sheriffaudit2017.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -609,http://www.longbeach.gov/police/press-releases/holiday-toy-drive-collection/,Media Bulletins,200,HOLIDAY TOY DRIVE COLLECTION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -610,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0825/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -611,https://police.greenvillesc.gov/faq.aspx?qid=445,Poor Data Source,200,FAQs • Where will all of this new affordable housing go? Who,"",[],"[""\n\u25bc\r\nGVL2040 Comprehensive Plan - Report to the Community FAQs\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -612,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/january-2020-activity-report/,Annual & Monthly Reports,200,January 2020 - Activity Report - Town of Cheswold,"","[""Cheswold""]","[""Delaware"", ""January 2020 \u2013 Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[] -613,https://delcopa.gov/sustainability/conference.html,Not Criminal Justice Related,200,Delaware County Sustainability Conference,"","[""Delaware County Sustainability Conference""]",[],"[""Office of Sustainability Navigation\r\n"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -614,https://www.wakeforestnc.gov/police/crime-prevention/reporting-suspicious-activity,Resources,200,"Reporting Suspicious Activity | Town of Wake Forest, NC","Prevention is everyone's responsibility.We are one neighborhood, one state, one nation;and it is the responsibility of all to remain vigilantand to report suspicious behavior.One call can make a difference. Reporting Suspicious Activity Police Emergency Number - 919-556-9111 or 911 If you suspect that the suspicious behavior that you detected is actually a crime-in-progress,","[""Reporting Suspicious Activity""]","[""fnow_may2019-40.jpg"", ""Search form"", ""You are here""]",[],[],[],[] -615,https://ose.louisiana.gov/event/police-sergeant-80/,Contact Info & Agency Meta,200,Police Sergeant | Louisiana Office of State Examiner,"","["""", ""Police Sergeant""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -616,https://pittsburghpa.gov/files/police/orders/ch6/68-02-grafitti-tracking-system.pdf,Poor Data Source,404,"","",,,,,, -617,http://www.tampa.gov/events/national-coffee-cop-day/105796,Poor Data Source,404,"","",,,,,, -618,"https://norfolkne.gov/government/departments/police-division/press-releases/april-27,-2021-press-release.html",Media Bulletins,200,"April 27, 2021 Press Release - City of Norfolk, NE","","[""City of Norfolk, NE"", ""Police Division"", ""April 27, 2021 Press Release""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]" -619,https://police.birminghamal.gov/wp-content/uploads/2020/01/dsc_2278-225.jpg,Poor Data Source,404,"","",,,,,, -620,https://delcopa.gov/vote/pdf/2021/delco_boe-meeting-notice_04-28-2021.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -621,https://delcopa.gov/vote/becomingapollworker.html,Not Criminal Justice Related,200,"Becoming a Poll Worker - Delaware County, Pennsylvania","","[""Becoming a Poll Worker""]",[],"[""How to Become a Poll Worker"", ""Poll Worker Requirements"", ""Student Poll Worker Program"", ""Poll Worker Positions"", ""Poll Worker Pay: Election Day"", ""Poll Worker Pay: Training Pay"", ""Filling Vacancies in an Election Board: Vacancy Kits"", ""Filling Vacancies in an Election Board: Emergency Appointments"", ""Questions?"", ""Delco Votes!"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -622,http://www.longbeach.gov/police/press-releases/undetermined-death-investigation-2-/,Media Bulletins,200,UNDETERMINED DEATH INVESTIGATION(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -623,https://ci.san-bernardino.ca.us/city_hall/police_department/crime_statistics/about_ucr_statistics/part_2_crimes,Poor Data Source,200," - Part 2 Crimes - City of San Bernardino -","","[""City of San Bernardino California""]","[""Part 2 Crimes""]",[],[],[],[] -624,https://police.greenvillesc.gov/2025/project-safe-neighborhoods,Resources,200,"Project Safe Neighborhoods | Greenville, SC - Official Website","Project Safe Neighborhoods is designed to build strong partnerships between the community, service providers and law enforcement to reduce firearm violence and prevent youth from becoming involved in gangs.","[""\r\n\r\nProject Safe Neighborhoods\t\t""]",[],"[""Loading"", ""Project Safe Neighborhoods Kick Off Event""]",[],[],[] -625,https://delcopa.gov/publicrelations/releases/2022/pdf/vetresourcefair.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -626,http://www.ryepolice.us/event/annies-angels-rye-by-the-sea-duathlon-2,Not Criminal Justice Related,200,Rye Police Department Annie's Angels Rye by the Sea Duathlon - Rye Police Department,"","["""", ""Annie\u2019s Angels Rye by the Sea Duathlon""]","[""June 1, 2019 @ 8:00 am - 11:00 am"", "" Details "", ""Organizer""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -627,https://southamptontownnypolice.gov/faq.aspx?qid=437,Resources,200,FAQs • How much are the permits this year? ,"",[],"[""\n\u25bc\r\nFAQ (COVID-19) | Southampton Town Beaches \t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -628,https://frederica.delaware.gov/2016/06/27/ad-for-part-time-police-office/townoffred-50-121467-1/,Media Bulletins,200,Ad for Part Time Police Officer - Frederica,"","[""Frederica""]","[""Delaware"", ""Ad for Part Time Police Officer""]","[""Menu"", ""Online Bill Pay"", ""Connect With Us!""]",[],[],[] -629,https://www.knoxvilletn.gov/government/city_departments_offices/police_department/management_services_bureau/community_police_academy,Media Bulletins,200," - Community Police Academy - City of Knoxville -",police*,"[""Community Police Academy"", ""Police Chief""]",[],[],[],[],[] -630,https://www.southamptontownnypolice.gov/493/pump-out-boat-program,Not Criminal Justice Related,200,"Pump Out Boat Program | Southampton, NY - Official Website",Discover how the Pump Out Boat Program helps protect the town's shellfish beds and keep the waters safe and clean for swimming and recreation. ,"[""\r\n\r\nPump Out Boat Program\t\t""]","[""Availability""]","[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]",[],[],[] -631,https://www.sandiego.gov/form/get-it-done-police,Contact Info & Agency Meta,200,Get It Done - Police | City of San Diego Official Website,"","[""City of San Diego Official Website"", ""Get It Done - Police\n""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -632,https://www.minneapolismn.gov/government/departments/police/,Contact Info & Agency Meta,200,Police - City of Minneapolis,We in the Minneapolis Police Department gain our authority from the community. We recognize that public safety is not just the absence of crime but the presence of justice.,"[""Police Department"", ""Need help? We're here for you.""]","[""2023 Minneapolis Police year in review"", ""I want to"", ""Explore this section"", ""Staff and volunteers"", ""Bureaus"", ""Related programs and initiatives"", ""Stay Informed"", ""Related links"", ""Access to police services"", ""Report an issue"", ""Contact us""]","[""\r\n Read and give feedback on police policies\r\n "", ""\r\n File an online police report\r\n "", ""\r\n Apply for a police job\r\n "", ""\r\n Read about contract negotiations\r\n "", ""Minneapolis police precincts"", ""Police auctions"", ""Reclaim property"", ""Gun permits"", ""Policy and Procedure Manual"", ""Oath of Office"", ""Police chief and administration"", ""Crime prevention specialists"", ""Chaplains"", ""Police Reserve"", ""Investigations"", ""Patrol"", ""Professional Standards"", ""National Night Out"", ""Police Explorers"", ""U and T visa"", ""Women's Leadership Academy"", ""View data and reports"", ""File online"", ""View resources"", ""Minneapolis Police Department"", ""Connect with the Minneapolis Police Department""]",[],[],[] -633,https://council.seattle.gov/2016/09/15/councilmember-johnsons-statement-on-the-north-precinct-police-station/,Not Criminal Justice Related,200,Councilmember Johnson’s Statement on the North Precinct Police Station - Seattle City Council Blog,"","[""Councilmember Johnson\u2019s Statement on the North Precinct Police Station""]",[],"[""HELPFUL LINKS"", ""Make your voice heard"", ""Councilmembers""]",[],[],[] -634,https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-29/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -635,https://www.cityofrc.us/news/rancho-cucamonga-welcomes-new-police-chief,Media Bulletins,200,Rancho Cucamonga Welcomes New Police Chief | City of Rancho Cucamonga, ,"[""\n\nRancho Cucamonga Welcomes New Police Chief\n\n\n""]","[""Utility Menu"", ""Breadcrumb"", ""Footer Menu"", ""Main navigation""]",[],[],[],[] -636,https://arcadia-fl.gov/departments/police/,Contact Info & Agency Meta,200,Arcadia Police Department – City of Arcadia,"","[""\r\n City of Arcadia, Florida"", ""Arcadia Police Department""]","[""\n\t\t\t\t\t\tUpcoming Events\t\t\t\t\t""]","[""Arcadia Police\u00a0\u2013\u00a0(863) 494-2222 for Non-Emergency\u00a0\u2013\nCall 9-1-1 for Emergencies Only"", ""\n\n\t\tCity Council Meeting\t\n"", ""\n\n\t\tCity Council Meeting\t\n"", ""\n\n\t\tCity Council Meeting\t\n"", ""\n\n\t\tCity Council Meeting\t\n"", ""\n\n\t\tCity Council Meeting\t\n"", ""\r\n Address"", ""\r\n Get in touch"", ""\r\n Contact""]","[""Search This Site"", ""Contact the Arcadia Police"", ""Pay Utilities Bill Online"", ""Follow the Arcadia Police on Facebook"", ""Search for Loved Ones in the Cemetery"", ""Follow us on Facebook"", ""Quick Links"", ""Helpful Websites"", ""Categories""]",[],[] -637,https://delcopa.gov/weightsmeasures/pdf/complaintform.pdf,Complaints & Misconduct,200,"","",[],[],[],[],[],[] -638,https://www.ci.san-bernardino.ca.us/city_hall/police_department/crime_statistics/about_ucr_statistics/arrest_statistics/arrest_statistics_-_2008,Crime Maps & Reports,200," - Arrest Statistics - 2008 - City of San Bernardino -","","[""City of San Bernardino California""]","[""Arrest Statistics - 2008""]",[],[],[],[] -639,https://www.mass.gov/doc/gardnerpolicelieutenant2374rtf/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -640,https://www.coronadelmar.us/newport-beach-police-department-issues-citations-for-selling-alcohol-to-minors/,Media Bulletins,200,Newport Beach Police Department Issues Citations for Selling Alcohol to Minors | Corona del Mar California,"","[""Newport Beach Police Department Issues Citations for Selling Alcohol to Minors""]","[""Menu"", "" Be First to Comment"", ""Subscribe"", """", """"]","[""Share this:"", ""Like this:"", ""Related"", ""Leave a Reply Cancel reply"", """"]",[],[],[] -641,https://www.sandiego.gov/police/news-center/cold-cases/sleiman-hallak,Wanted Persons,200,Sleiman Hallak | City of San Diego Official Website,"Sleiman Hallak owned the Moonlight Market at Skyline and Meadowbrook for more than twenty years. He was known around the neighborhood as Pops. On Wednesday, April 17, 1996, at about 10:30 a.m., Hallak was working at the store counter waiting on a cigarette dealer when a black male armed with a gun entered the store and demanded that Hallak give up the money. When Hallak did not respond quickly enough, the suspect shot him to death and stole the money from the register and a handgun from the store.","[""City of San Diego Official Website"", ""Cold Case: Sleiman Hallak\n""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""News Center"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -642,https://www.dps.arkansas.gov/news/settlement-agreement-in-civil-action-against-state-police/,Media Bulletins,200,SETTLEMENT AGREEMENT IN CIVIL ACTION AGAINST STATE POLICE - Arkansas Department of Public Safety,"","["" Flag Status""]","[""NEWS"", ""SETTLEMENT AGREEMENT IN CIVIL ACTION AGAINST STATE POLICE"", ""Respect. Integrity. \nCUSTOMER SERVICE. TEAMWORK. \nSERVANT LEADERSHIP. \nCONTINUOUS IMPROVEMENT"", """", ""\u00a9 2024 All rights Reserved. Arkansas.gov ""]",[],"[""Share this post""]","[""About DPS"", ""DPS Links"", ""DPS Address"", ""Your Arkansas.gov"", ""Top Online Services"", ""Helpful Information""]",[] -643,https://cheswold.delaware.gov/2015/03/06/cheswold-police-department-dea-sponsoring-national-take-back-day-sept-27-2014/,Not Criminal Justice Related,200,"Cheswold Police Department /DEA Sponsoring National Take Back Day Sept. 27, 2014 - Town of Cheswold - Kent County, Delaware","","[""Cheswold""]","[""Delaware"", ""Cheswold Police Department /DEA Sponsoring National Take Back Day Sept. 27, 2014""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[] -644,http://www.longbeach.gov/police/press-releases/murder3/,Media Bulletins,200,MURDER (900 Block of Hoffman),"","[""Long BeachPolice Department""]",[],[],[],[],[] -645,https://pharr-tx.gov/ngg_tag/pharr-police-department-athletic-league/,Not Criminal Justice Related,200,Pharr Police Department Athletic League – City of Pharr,"","[""Images tagged \""pharr-police-department-athletic-league\""""]",[],[],[],[],[] -646,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/102821summary.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -647,https://www.southamptontownnypolice.gov/faq.aspx?qid=249,Not Criminal Justice Related,200,FAQs • What are the hours of operation for the Southampton A,"",[],"[""\n\u25bc\r\nPublic Safety - Animal Control\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -648,https://delcopa.gov/heroin/tipsforprevention.html,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -649,https://www.woburnma.gov/government/police/police-records-request/arrest-records/,Arrest Records,200,Arrest Records - City of Woburn,"","[""Arrest Records""]",[],"[""Get Text & Email Updates!""]",[],[],[] -650,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol/,Media Bulletins,200,DUI Saturation Patrol,"","[""Long BeachPolice Department""]",[],[],[],[],[] -651,https://police.greenvillesc.gov/874/transparency-portal,Resources,200,"Transparency | Greenville, SC - Official Website",The City of Greenville is committed to an open government.,"[""\r\n\r\nTransparency\t\t""]","[""Subscribe""]","[""Loading""]",[],[],[] -652,http://www.longbeach.gov/police/press-releases/fatal-traffic-accident-1-/,Media Bulletins,200,FATAL TRAFFIC ACCIDENT(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -653,https://coloradosprings.gov/police-department/page/commander-rigdon,Poor Data Source,403,"","",,,,,, -654,https://lockhavenpa.gov/government/manager/personnel/lifeins_ft_police/,Not Criminal Justice Related,200,"Group Life: Full-time Police - City of Lock Haven, PA","","[""City of Lock Haven, PA"", ""Group Life: Full-time Police""]","[""""]","[""Quick Links"", "" River (Latest Observation)"", ""Archives"", ""Categories"", ""Meta""]",[],[],[] -655,https://www.newarknj.gov/news/mayor-ras-j-barakas-statement-on-police-chief-darnell-henry,Media Bulletins,200,News: MAYOR RAS J. BARAKA’S STATEMENT ON POLICE CHIEF DARNELL HENRY,"Official Page of Newark, NJ News: MAYOR RAS J. BARAKA’S STATEMENT ON POLICE CHIEF DARNELL HENRY","[""City of"", ""NEWARK"", ""September 3, 2020"", ""MAYOR RAS J. BARAKA\u2019S STATEMENT ON POLICE CHIEF DARNELL HENRY"", ""City of"", ""NEWARK""]","[""News"", ""Mayor Ras j baraka""]",[],[],[],[] -656,https://alpha.austin.gov/es/police-oversight/2020-09-17-08/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -657,http://www.longbeach.gov/police/press-releases/k-9-officer-is-partnered-with-new-police-service-dog/,Media Bulletins,200,K-9 Officer is Partnered with New Police Service Dog,"","[""Long BeachPolice Department""]",[],[],[],[],[] -658,https://columbiacitypolice.us/documents/publiccomplaint.pdf,Complaints & Misconduct,200,"","",[],[],[],[],[],[] -659,https://www.southamptontownnypolice.gov/1695/2022-tentative-roll-assessment-rolls,List of Data Sources,200,"2023 Tentative Roll Assessment Roll | Southampton, NY - Official Website","","[""\r\n\r\n2023 Tentative Roll Assessment Roll\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]",[],[],[] -660,https://www.corcoranmn.gov/public_services/police/press_releases_records_and_complaint_recognition/press_releases,List of Data Sources,200," - Press Releases - City of Corcoran -","","[""Press Releases""]",[],[],[],[],[] -661,http://lafayettepolice.us/1079/staff,Contact Info & Agency Meta,200,"Staff | Lafayette, IN - Official Website","","[""\r\n\r\nStaff\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -662,https://delcopa.gov/publicrelations/releases/2021/covid_countiesvaccinestatement.html,Not Criminal Justice Related,200,"Southeast Pennsylvania Counties Issue Statement on COVID-19 Vaccine Distribution - Delaware County, Pennsylvania","","[""Southeast Pennsylvania Counties Issue Statement on COVID-19 Vaccine Distribution""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -663,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0838/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -664,http://www.longbeach.gov/police/about-the-lbpd/bureaus/investigations-bureau/detective-division/auto-theft-detail-and-t.r.a.p/,Resources,200,Auto Theft Detail and T.R.A.P.,"","[""Police Department""]","[""Auto Theft Detail And T.R.A.P""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""\u00a0TASK FORCE FOR REGIONAL AUTO THEFT PREVENTION (T.R.A.P.)"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk"", ""\u00a0REPORTING AUTO THEFT"", ""\u00a0CHECKING YOUR AUTO THEFT CASE STATUS"", ""\u00a0RENTAL CAR THEFTS AND EMBEZZLEMENT"", ""\u00a0FAILURE TO RETURN A BORROWED CAR"", ""\u00a0LAWS PERTAINING TO AUTO THEFT\u00a0""]","[""Long Beach Police non-emergency (562) 435-6711"", ""Long Beach Police business desks:"", ""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""Crime Lab Survey"", ""\u00a0""]",[] -665,https://delcopa.gov/ich/resources/covid19/pdf/coronavirustestingifnohealthcareprovider.pdf,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -666,https://rocklandmaine.gov/police-department/officer-duhamel-promoted-to-patrol-sergeant/attachment/f45111ed-37de-4a3d-b8e7-099f09cad7fb-15/,Poor Data Source,200,"F45111ED-37DE-4A3D-B8E7-099F09CAD7FB.jpeg | The City of Rockland, Maine","","[""F45111ED-37DE-4A3D-B8E7-099F09CAD7FB.jpeg""]",[],"[""All Current Alerts & Announcements"", ""Current Weather"", ""City of Rockland""]",[],[],[] -667,https://www.madera.gov/wp-content/uploads/2016/05/madera-south-copy.jpg,Poor Data Source,404,"","",,,,,, -668,https://www.fortworthtexas.gov/departments/police/public-safety/fw-pd-central-hemphill,Contact Info & Agency Meta,200," - Welcome to the Fort Worth Police Department -","","[""Police Department""]","[""Learn what we're doing with the #FortWorthSafe Strategy"", ""Accident Reports"", ""Online Reporting"", ""Search One Address. Find Everything."", ""Executive Staff"", ""Inside FWPD"", ""Patrol Commanders"", ""Help Us Solve a Crime"", ""Community Camera Program"", ""Most Wanted"", ""CrimeMapping.com""]","[""#FortWorthSafe Strategy"", ""Professional Standards"", ""Procedural Justice"", ""Chief of Police Neil Noakes"", ""Executive Assistant Chief Robert Alldredge"", ""Assistant Chief Julie Swearingin"", ""Assistant Chief Joseph Sparrow"", ""Deputy Chief Buck Wheeler"", ""Deputy Chief Mark Barthen"", ""Deputy Chief Pedro \""Kiki\"" Criado"", ""Deputy Chief David Carabajal"", ""Deputy Chief Chad Mahaffey"", ""Deputy Chief Monica Martin"", ""Assistant Police Director Leo Luna"", ""Assistant Police Director Keith Morris"", ""Central Commander - Chris Daniels"", ""East Commander - Antione Williams"", ""North Commander - Sean Kenjura"", ""Northwest Commander - Jason Kim"", ""South Commander - Andre Smith"", ""West Commander - Stefanie RIcks"", ""Felicita Olguin, 81 years old"", ""Derek Locke, 30 years old"", ""Richard Hutchinson, 32 years old"", ""Trina Lane, 23 year-old black female"", ""Miguel Ruiz, DOB: 05/14/1997"", ""Nestor Moreno, DOB: 02/26/1973"", ""Shallen Clark, DOB: 11/17/1995"", ""Eric Sosa, DOB: 12/30/1981"", ""Jesus Roman, DOB: 06/20/2004"", ""Christopher Powell, DOB: 03/07/1973"", ""Brandon Stickel, DOB: 07/23/1997"", ""Fernando Trevino-Alvarado, DOB: 08/28/1975"", ""Ruben Buckner, DOB: 07/28/1968"", ""Larry D. Johnson Sr., DOB: 02/16/1964"", ""Resources"", ""Helpful Links"", ""Connect With FWPD""]",[],[],[] -669,https://delcopa.gov/publicrelations/releases/2019/pdf/2019stateofthecounty.pdf,Media Bulletins,200,"","",[],[],[],[],[],[] -670,https://police.greenvillesc.gov/304/health-wellness,Not Criminal Justice Related,200,"Employee Health Center | Greenville, SC - Official Website",Learn about the City's initiatives to promote healthy lifestyles and read about the award-winning Health and Wellness Program.,"[""\r\n\r\nEmployee Health Center\t\t""]","[""On-site Walk-in Clinic"", ""Award Winning Health and Wellness Program"", ""Annual Physicals"", ""Lunch and Learns"", ""Award Winning On-site Tobacco Cessation Program"", ""Bicycle Commuter Tax Provision"", ""Employee Assistance Program (EAP)"", ""Mobile RN Program"", ""Nurse Practitioner"", ""Vaccinations"", ""Vaccinations"", ""Other Wellness Programs""]","[""Loading"", ""Contacts""]","[""Human Resources""]",[],[] -671,https://champaignil.gov/2010/08/05/champaign-police-hosts-pool-party-for-youth/,Media Bulletins,200,Champaign Police Hosts Pool Party for Youth - City of Champaign,"","[""Champaign Police Hosts Pool Party for Youth""]","[""News Releases"", ""Department News""]",[],[],[],[] -672,https://police.bixbyok.gov/faq.aspx?qid=79,Resources,200,FAQs • Can I limit the number of SMS (text) messages I recei,"",[],"[""\n\u25bc\r\nNixle Alert System\t\t""]","[""Loading"", ""Categories"", ""Live Edit"", ""Helpful Links"", ""FAQs"", ""Site Links""]",[],[],[] -673,https://spdblotter.seattle.gov/2018/12/02/theater-cancels-matinee-police-investigate-after-theater-employees-discover-threats-on-facebook/,Media Bulletins,200,"Theater Cancels Matinee, Police Investigate After Theater Employees Discover Threats on Facebook - SPD Blotter","","[""Theater Cancels Matinee, Police Investigate After Theater Employees Discover Threats on Facebook""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -674,https://www.mass.gov/info-details/audit-of-the-massachusetts-cultural-council-objectives-scope-and-methodology,Not Criminal Justice Related,200,"Audit of the Massachusetts Cultural Council Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Massachusetts Cultural Council,"[""\nAudit of the Massachusetts Cultural Council Objectives, Scope, and Methodology\n""]","[""Table of Contents\n for the audit, Audit of the Massachusetts Cultural Council"", ""Appendix\n "", ""Table of Contents"", ""Overview\n "", ""Grants to Individuals\n "", ""Cultural Organization Economic Recovery Program Grants\n "", ""ICP\n "", ""Cybersecurity Awareness Training\n "", ""Data Reliability\n "", ""Help Us Improve Mass.gov with your feedback""]","[""Go Smart"", ""Pearl"", ""MMARS""]",[],[],[] -675,https://www.montebelloca.gov/departments/police/services/pay_a_parking_ticket,Poor Data Source,200," - Pay a Parking Ticket - City of Montebello -","","[""City of Montebello""]","[""Pay a Parking Ticket""]","[""FREQUENTLY ASKED QUESTIONS / PAY A PARKING TICKET""]",[],[],[] -676,https://delcopa.gov/publicrelations/releases/2020/covid_twoadditionaldeaths.html,Not Criminal Justice Related,200,"Two Additional COVID-19 Related Deaths Reported in Delaware County - Delaware County, Pennsylvania","","[""Two Additional COVID-19 Related Deaths Reported in Delaware County""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -677,https://www.foxcrossingwi.gov/foxcrossingwi.gov/police/,Annual & Monthly Reports,200,Police Archives - Fox Crossing Fox Crossing,"","[""""]",[],[],[],[],[] -678,https://www.troyny.gov/photos-troy-community-commemorates-retirement-of-troy-police-chief-john-tedesco/,Poor Data Source,404,"","",,,,,, -679,https://delcopa.gov/vetaffairs/forms/instructionsforfilingaclaim.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -680,https://www.littlerock.gov/media/5607/05-22-19-police.pdf,Media Bulletins,200,"","",[],[],[],[],[],[] -681,https://dccouncil.gov/judiciary-public-safety/copy-of-fb0-fy19-attachment-i-contracts-and-grants/,Policies & Contracts,200,Copy of FB0 - FY19 - Attachment I - Contracts and Grants • Council of the District of Columbia,"","[""Copy of FB0 \u2013 FY19 \u2013 Attachment I \u2013 Contracts and Grants""]",[],[],[],[],[] -682,https://northbrunswicknj.gov/wp-content/uploads/2020/09/national-police-week-2.jpg,Poor Data Source,200,"","",[],[],[],[],[],[] -683,https://www.coppelltx.gov/faq.aspx?qid=155,Not Criminal Justice Related,200,FAQs • What Minimum Control Measures (MCMs) will the City of,"",[],"[""Annual Report"", ""\n\u25bc\r\nStormwater Management\t\t"", ""More Information"", ""Annual Report""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -684,https://spdblotter.seattle.gov/2021/06/08/police-seize-five-firearms-following-crisis-call-arrest-man-for-earlier-drive-by-shooting/,Media Bulletins,200,"Police Seize Five Firearms Following Crisis Call, Arrest Man For Earlier Drive-By Shooting - SPD Blotter","","[""Police Seize Five Firearms Following Crisis Call, Arrest Man For Earlier Drive-By Shooting""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -685,http://www.longbeach.gov/police/press-releases/fatality-1-/,Media Bulletins,200,FATALITY(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -686,https://www.sandiego.gov/department-document/san-diego-kicks-community-conversations-about-next-police-chief,Media Bulletins,200,San Diego Kicks Off Community Conversations About Next Police Chief | City of San Diego Official Website,"","[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""San Diego Kicks Off Community Conversations About Next Police Chief"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -687,http://www.longbeach.gov/police/press-releases/murder-20-/,Media Bulletins,200,MURDER(20),"","[""Long BeachPolice Department""]",[],[],[],[],[] -688,http://www.longbeach.gov/police/press-releases/traffic-fatality---palo-verde-ave-and-los-coyotes-diagonal/,Media Bulletins,200,TRAFFIC FATALITY - PALO VERDE AVE AND LOS COYOTES DIAGONAL,"","[""Long BeachPolice Department""]",[],[],[],[],[] -689,https://norfolkne.gov/government/departments/police-division/press-releases/may-21st-press-release.html,Media Bulletins,200,"May 21st Press Release - City of Norfolk, NE","","[""City of Norfolk, NE"", ""Police Division"", ""May 21st Press Release""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]" -690,https://alpha.austin.gov/police-oversight/formal-complaint-when-department-issued-bwc-system-use-is-required/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -691,https://www.southamptontownnypolice.gov/1469/kenyatta-nash,Poor Data Source,404,"","",,,,,, -692,https://www.elburn.il.us/police-department/,Personnel Records,200,"Police Department | Village of Elburn, Illinois","","[""Police Department"", ""AUTO STICKERS"", ""CHILD SAFETY SEAT CERTIFIED INSTALLATION"", ""CRIME PREVENTION"", ""FORMS AND DOCUMENTS"", ""LAWS/ORDINANCES"", ""LINKS OF INTEREST"", ""METRA INFORMATION"", ""METRA FAQ"", ""ONLINE REPORTING"", ""POLICE DEPARTMENT FAQ"", ""REGISTERED SEX OFFENDERS"", ""SCHOOL ZONE SAFETY"", ""STATE\u2019S ATTORNEY\u2019S OFFICE"", ""VACATION WATCH"", ""PROPOSED POLICE STATION INFO""]",[],"[""\nADMINISTRATION DIVISION\n"", ""\nCRIMINAL INVESTIGATIONS\n"", ""\nRECORDS\n"", ""\nPATROL\n"", ""\nCOMMUNITY SERVICE OFFICER\n"", ""\nCROSSING GUARDS\n""]","[""Chief\u2019s Message"", ""NEWS & PRESS RELEASES"", ""IMPORTANT LINKS"", ""Department Overview"", ""Annual & Quarterly Reports""]","[""ComEd Prepares for Ice Storms in Northern Illinois"", ""Proposed Police Station Updates"", ""Unscheduled Intercity Bus Permit"", ""Links"", ""Main Contact Info"", ""Follow Us""]",[] -693,https://ci.san-bernardino.ca.us/city_hall/police_department/contacting_sbpd,Contact Info & Agency Meta,200," - Contacting SBPD - City of San Bernardino -","","[""City of San Bernardino California""]","[""Contacting SBPD""]",[],[],[],[] -694,http://www.tampa.gov/police/memorial/thank-you,Media Bulletins,200,A Message of Thanks - August 2009 | City of Tampa,Citizens of Tampa Tampa Fire Rescue Mayor Iorio Hillsborough County Sheriffs Office Tampa Business Community THANK YOU!,"[""A Message of Thanks - August 2009\n""]","[""Police Department"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[] -695,http://www.longbeach.gov/police/press-releases/update---arrest-made-in-murder-5900-block-of-l-b--blvd-/,Media Bulletins,200,MURDER - UPDATE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -696,https://southamptontownnypolice.gov/1139/office-of-sustainability,Poor Data Source,404,"","",,,,,, -697,https://police.bixbyok.gov/faq.aspx?qid=77,Resources,200,FAQs • Can I register with an international telephone number,"",[],"[""\n\u25bc\r\nNixle Alert System\t\t""]","[""Loading"", ""Categories"", ""Live Edit"", ""Helpful Links"", ""FAQs"", ""Site Links""]",[],[],[] -698,https://delcopa.gov/prison/pdfs/wardensreportapril2022.pdf,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -699,https://www.antioch.il.gov/wpfb-file/08-11-10-police-and-fire-commission-minutes-pdf/,Poor Data Source,200,"08-11-10 Police And Fire Commission Minutes - Antioch, IL",8006 08 11 10 police and fire commission minutes pdf commissions 2010 1284749388 415e95087ff8cdaefd2217d9ff094969 213x300 _clxydlrnkv7j thumb jpg 09 17 13 49 48 0 pdf application num_pages pdf_pages timings,"[""08-11-10 Police And Fire Commission Minutes""]",[],[],[],[],[] -700,https://delcopa.gov/planning/pdf/mapping/colwyn.pdf,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -701,http://www.ryepolice.us/logs/police-logs-for-1-9-19-1-15-19,Daily Activity Logs,200,Rye Police Department Police Logs for 1/9/19-1/15/19 - Rye Police Department,"","[""Police Logs for 1/9/19-1/15/19""]","[""Police Logs for 1/9/19-1/15/19""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -702,https://champaignil.gov/police/news-data/traffic/,Contact Info & Agency Meta,200,Traffic - City of Champaign,"",[],"[""Police Department"", ""Quick Links"", ""Police Department News"", ""Contact Us""]",[],[],[],[] -703,https://www.minneapolismn.gov/resident-services/public-safety/police-public-safety/police-reports-and-data-requests/frequently-requested/critical-incidents/feb-2-2022-officer-involved-shooting/,Media Bulletins,200,"February 2, 2022 Officer-Involved Shooting - City of Minneapolis","Public data gathered by the Minneapolis Police Department related to the February 2, 2022 officer-involved shooting.","[""February 2, 2022 officer-involved shooting"", ""Need help? We're here for you.""]","[""Body-worn camera video - Incident 22-022798"", ""Citations"", ""Documents"", ""Officer involved in incident"", ""Note about Officer complaints and discipline"", ""Body Camera, Street Camera, and Squad Camera Footage""]","[""\n\r\n Still image from body-worn camera video - Incident 22-022798\r\n \n"", ""\n\r\n Hennepin County Medical Examiner Press Release Report\r\n \n"", ""\n\r\n 22-022798 General Offense Public Information Report\r\n \n"", ""\n\r\n 22-022798 Incident Detail Report\r\n \n"", ""\n\r\n 22-0004855 Fire Incident Detail Report\r\n \n"", ""\n\r\n 22-0004855 Fire Incident Report\r\n \n"", ""\n\r\n MPD News Release\r\n \n"", ""\n\r\n MPD News Release Photo 1\r\n \n"", ""\n\r\n MPD News Release Photo 2\r\n \n"", ""\n\r\n Public Personnel File for Mark Hanneman\r\n \n"", ""\n\r\n Employee Complaint Summary for Mark Hanneman\r\n \n""]","["" Request accessible format"", "" Request accessible format"", "" Request accessible format"", "" Request accessible format"", "" Request accessible format"", "" Request accessible format"", "" Request accessible format"", "" Request accessible format"", "" Request accessible format"", "" Request accessible format"", "" Request accessible format""]",[],[] -704,http://www.tampa.gov/news/tampa-police-officer-killed-line-duty-66406,Media Bulletins,200,Tampa Police Officer Killed in the Line of Duty | City of Tampa,"Master Patrol Officer Jesse Madsen was killed early Tuesday morning when his police vehicle was struck by a wrong way driver on Interstate 275. Just before 1:00 AM on Tuesday morning, Tampa Police began receiving calls about a white vehicle driving southbound in the northbound lanes of I275 at a high rate of speed and swerving through the lanes. Within a minute of the original call, the vehicle crashed into Officer Madsen’s police vehicle between the Hillsborough and Sligh Avenue exits. The impact killed both Jesse and the driver of the white sedan.","[""Tampa Police Officer Killed in the Line of Duty\n""]","[""Information Resources"", ""\nLatest News\n"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[] -705,http://www.cityofpataskalaohio.gov/government/clerk-of-council/public-notices/advertisement-of-legislation-passed-september-5-2017-copy/,Not Criminal Justice Related,200,"Advertisement of Legislation passed September 5, 2017 - Copy - City Of Pataskala",Official Website,"[""\n\t\t\t\tCity Of Pataskala\t\t\t""]","[""\n\t\t\t\tOfficial Website\t\t\t""]",[],[],[],[] -706,http://www.ryepolice.us/wp-content/uploads/scannerpd@town.rye_.nh_.us_20180430_142152_001.jpg,Media Bulletins,200,"","",[],[],[],[],[],[] -707,https://delcopa.gov/ich/resources/covid19/pdf/spcapressrelease.pdf,Not Criminal Justice Related,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -708,https://www.antioch.il.gov/wpfb-file/01-24-12-police-and-fire-agenda-pdf-5/,Poor Data Source,200,"01-24-12 Police And Fire Agenda - Antioch, IL",13144 01 24 12 police and fire agenda pdf commissions commission agendas 2012 1625758258 b0e21da6b80d9f67c4c403d35dad9303 7e7aa0fe814a0af3daa3feb9bbf49ac8d0d6f1c32554399c92c72dff4c5a8f53 213x300 _moswe3wb2frl thumb jpg 2017 05 17 08 41 32 0 66 249 146 2021 06 28 15 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17 pagefailed_18,"[""01-24-12 Police And Fire Agenda""]",[],[],[],[],[] -709,https://bouldercolorado.gov/events/police-chief-town-hall-person-virtual-1,Contact Info & Agency Meta,200,Police Chief Town Hall (in person & virtual) | City of Boulder,"","[""Police Chief Town Hall (in person & virtual)\n""]","[""Breadcrumb"", ""Details"", ""Boulder Police Department Virtual Town Halls"", ""Meeting Details"", ""More Resources""]",[],[],[],[] -710,https://florence-ky.gov/police-department-easter-drive-thru/,Not Criminal Justice Related,200,Police Department Easter Drive Thru - City of Florence,"","[""Police Department Easter Drive Thru""]","[""Recent News"", ""City of Florence 2024 Events Calendar"", ""City of Florence sets Public Meeting for January 31, 2024 to obtain input for Parks Master Plan Survey"", ""Help us spread the love \u2013 Valentine\u2019s for Troops"", ""Sign Up for Our Newsletter""]",[],[],[],[] -711,https://health.wyo.gov/healthcarefin/chip/kid-care-chip-copays/providers-handout-light/,Not Criminal Justice Related,200,Providers Handout light - Wyoming Department of Health,"","[""Providers Handout light""]","[""Kid Care CHIP""]",[],[],"[""Contact Info:""]",[] -712,https://chandlerazpd.gov/2015/02/chandler-police-department-offering-non-emergency-text-messaging/,Media Bulletins,200,Chandler Police Department Offering Non-Emergency Text Messaging – Chandler Police Department,"","[""Chandler Police Department Offering Non-Emergency Text Messaging""]",[],"[""Quick Links"", ""News Archives"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n""]","[""\n\n\t\tFebruary 18, 2015\t\n"", "" Contact"", "" About the Department"", "" Latest News"", ""\n Courage, Pride, Dedication\n \n \u00a9 2024 Chandler Police Department \n""]",[],[] -713,http://www.longbeach.gov/police/press-releases/graduation-and-summer-break-safety-tips-1-/,Resources,200,GRADUATION AND SUMMER BREAK SAFETY TIPS(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -714,https://coloradosprings.gov/police-department/article/news/community-assistance-bank-robbery-suspects,Media Bulletins,403,"","",,,,,, -715,https://coloradosprings.gov/police-department/article/news/motorcyclist-identified-fountain-boulevard,Media Bulletins,200,Motorcyclist identified from Fountain Boulevard and Highway 24 bypass crash | City of Colorado Springs,"","[""\nMotorcyclist identified from Fountain Boulevard and Highway 24 bypass crash\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -716,https://www.hickoryhillspd.us/2016/09/message-from-the-chief-of-police-2/,Media Bulletins,200,Message From The Chief of Police,"","[""Message From The Chief of Police""]","["""", ""Post navigation""]",[],"[""Report a Concern"", ""Investigative Tip Line"", ""Hot Links"", ""Contact Information""]",[],[] -717,https://www.mass.gov/doc/01222016-dmf-scoping-meeting-scheduled-for-february-8-2016-potential-changes-to-summertime/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -718,https://police.birminghamal.gov/contacts/,Contact Info & Agency Meta,200,Contacts | Birmingham Police Department,"","[""\n\n\n Birmingham Police Department\n\n\t\t\t\t\tCommitment | Excellence | Integrity\t\t\t\t\n\n""]","[""Putting People First"", ""Contacts""]","[""Division/Precinct"", ""Address"", ""Phone Number""]","[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[] -719,https://sanramon.ca.gov/police/victim,Resources,200," - Victim's Rights Information - City of San Ramon -","","[""Victim's Rights Information""]","[""Contact Us"", ""Victim's Rights"", ""Contact Us"", ""Useful Links""]",[],[],[],[] -720,https://delcopa.gov/ich/resources/covid19/pdf/contactidentification.pdf,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -721,https://delcopa.gov/publicrelations/releases/2022/delcolaunchesfreefraudsleuthsoftwaretohelpfightpropertyfraud.html,Not Criminal Justice Related,200,"Delaware County Launches Free FraudSleuth® Software to Help Residents Fight Property Fraud - Delaware County, Pennsylvania","","[""Delaware County Launches Free FraudSleuth\u00ae Software to Help Residents Fight Property Fraud""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -722,https://spdblotter.seattle.gov/2022/08/26/police-investigating-fatal-shooting-on-aurora/,Media Bulletins,200,Police Investigating Fatal Shooting on Aurora - SPD Blotter,"","[""Police Investigating Fatal Shooting on Aurora""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -723,http://www.lafayettepolice.us/faq.aspx?qid=247,Training & Hiring Info,200,FAQs • What are the age requirements to be hired with the LP,"",[],"[""\n\u25bc\r\nPolice Employment FAQs\t\t""]","[""Loading"", ""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -724,https://covington.va.us/city-government/city-departments/police/police-patrol/tfrydare/,Misc Police Activity,200,Tfrydare - Covington City,"","[""Tfrydare""]","[""\nTOP ONLINE LINKS\n""]","[""Leave a Comment""]",[],[],[] -725,https://www.sandiego.gov/department-document/copy-resolution-no-79288,Not Criminal Justice Related,404,"","",,,,,, -726,http://police.portlandmaine.gov/668/finance-committee,Not Criminal Justice Related,200,"Finance Committee | Portland, ME - Official Website",The Finance Committee reviews the city manager’s recommended operating and capital budgets and the school superintendent’s operating budget and makes recommendations to the City Council regarding those budgets.,"[""Finance Committee""]",[],[],[],[],[] -727,http://www.police.wallingfordct.gov/divisions/records-division/,Records Request Info,200,"Records Division | Wallingford, CT Police Department","The WPD's Records Division is responsible for maintaining investigatory reports, evidence, found property and criminal history information.","[""Records Division""]","[""The Records Division is Responsible For:"", ""Records Division Members""]",[],[],[],[] -728,https://rocklandmaine.gov/events/police-review-committee-meeting-14/,Not Criminal Justice Related,200,"Police Review Committee Meeting | The City of Rockland, Maine","Monday, 13 June 2022 - 430pm Zoom Meeting Link - https://us02web.zoom.us/j/5040315241?pwd=eFhHaWJ4ZmhNakRmQ0VIQko4VmlKUT09 Facilitator: Emily Note Taker: Angela","[""Police Review Committee Meeting"", ""Police Review Committee Meeting""]",[],"[""All Current Alerts & Announcements"", ""Current Weather"", ""Date"", ""Time"", ""Leave a Comment Cancel reply"", ""City of Rockland""]",[],[],[] -729,https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-3/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -730,https://sanfordfl.gov/wp-content/uploads/2020/07/police_employment.jpg,Poor Data Source,200,"","",[],[],[],[],[],[] -731,"https://norfolkne.gov/government/departments/police-division/press-releases/january-12,-2022-press-release.html",Media Bulletins,200,"January 12, 2022 Press Release - City of Norfolk, NE","","[""City of Norfolk, NE"", ""Police Division"", ""January 12, 2022 Press Release""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]" -732,https://dagsboro.delaware.gov/wp-content/blogs.dir/106/files/police-department/newpolicecars2008-001.jpg,Poor Data Source,404,"","",,,,,, -733,https://www.ashevillenc.gov/news/asheville-police-be-a-connection-for-children-during-child-abuse-prevention-month/,Resources,200,Asheville Police: ‘Be A Connection’ for children during Child Abuse Prevention Month - The City of Asheville,"","[""Asheville Police: \u2018Be A Connection\u2019 for children during Child Abuse Prevention Month""]",[],[],[],[],[] -734,https://policeanalysis.tucsonaz.gov/items/9fb161581d264cf99cc9e6da47dafa36,Poor Data Source,200,Tucson Police Data & Analysis,"As part of our commitment to transparency and accountability, the Tucson Police Department is empowering community members to explore and download policing data.",[],[],[],[],[],[] -735,https://www.clintonvillewi.gov/government/departments/police/use_of_force_policies,Policies & Contracts,200," - Use of Force Policies - City of Clintonville -","","[""City of ClintonvilleTrucker Pride"", ""USE OF FORCE POLICY\n\nUSE OF LESS LETHAL WEAPONS POLICY\n\nUSE OF DEADLY FORCE POLICY""]","[""Use of Force Policies""]","[""City of Clintonville"", ""City Hall Hours of Operation""]",[],[],[] -736,https://www.auburnwa.gov/city_hall/police/community_programs/crime_prevention/crime_prevention_through_environmental_design,Resources,200," - Crime Prevention Through Environmental Design - City of Auburn -","",[],[],"[""City Hall"", ""Residents"", ""Business"", ""Visitors""]",[],[],[] -737,https://www.newhopemn.gov/city_hall/police_department/community_services_crime_prevention,Resources,200," - Community Services & Crime Prevention - City of New Hope -","","[""City of New Hope"", ""\r\n \tCity of New HopeMinnesota""]","[""Community Services & Crime Prevention"", """", ""Annual Bike Rodeo"", ""Prevent Bike Theft""]","[""Contact:""]",[],[],[] -738,https://www.gurnee.il.us/events/2022/05/12/default-calendar/police-department-blood-drive,Misc Police Activity,200," - Gurnee Police Department Blood Drive -","","[""Events"", ""Events View Calendar""]","[""Gurnee Police Department Blood Drive""]","[""Village Hall""]",[],[],[] -739,https://delcopa.gov/courts/pretrialbail.html,Contact Info & Agency Meta,200,Bail Agency/Pre-Trial Bail - Delaware County Court of Common Pleas,"","[""Bail Agency/Pre-Trial Bail""]",[],"[""Mission Statement"", ""Bail Agency Procedures"", ""Video Teleconferencing"", ""Pre-Trial Services"", ""Hearings"", ""Veterans Court"", ""Technology Databases"", ""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[] -740,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2017_archived_news/january_2017/citizens_can_help_police_keep_neighborhoods,Media Bulletins,200," - Citizens Can Help Police Keep Neighborhoods Safe Through Dog Walker Watch Program - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Citizens Can Help Police Keep Neighborhoods Safe Through Dog Walker Watch Program""]","[""Dog Walker Watch Training Schedule""]",[],[],[] -741,http://www.longbeach.gov/police/press-releases/traffic-fatality-7th-and-santiago/,Poor Data Source,200,TRAFFIC FATALITY 7TH AND SANTIAGO,"","[""Long BeachPolice Department""]",[],[],[],[],[] -742,https://police.bixbyok.gov/faq.aspx?qid=107,Not Criminal Justice Related,200,FAQs • What times is Bixhoma Lake open?,"",[],"[""\n\u25bc\r\nParks-Lake Bixhoma\t\t""]","[""Loading"", ""Categories"", ""Live Edit"", ""Helpful Links"", ""FAQs"", ""Site Links""]",[],[],[] -743,https://www.coronadelmar.us/nb-police-department-says-drive-sober-or-get-pulled-over/,Poor Data Source,200,NB Police Department Says ‘Drive Sober or Get Pulled Over’ | Corona del Mar California,"","[""NB Police Department Says \u2018Drive Sober or Get Pulled Over\u2019""]","[""Menu"", "" Be First to Comment"", ""Subscribe"", """", """"]","[""Share this:"", ""Like this:"", ""Related"", ""Leave a Reply Cancel reply"", """"]",[],[],[] -744,https://spdblotter.seattle.gov/2016/03/31/police-investigating-two-overnight-shootings-in-rainier-valley/,Media Bulletins,200,Police Investigating Two Overnight Shootings In Rainier Valley - SPD Blotter,"","[""Police Investigating Two Overnight Shootings In Rainier Valley""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -745,http://www.longbeach.gov/police/press-releases/police-seek-additional-indecent-exposure-victims-1-/,Media Bulletins,200,POLICE SEEK ADDITIONAL INDECENT EXPOSURE VICTIMS(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -746,https://delcopa.gov/vote/pdf/2022/mail-in-ballot-application_delco(spanish).pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -747,https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-27/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -748,https://cityofpowell.us/police-agency/traffic-surveys/ridge-side-dr/,Not Criminal Justice Related,200,"City of Powell, Ohio | Ridge Side Dr","","[""\n Ridge Side Dr\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -749,https://www.mass.gov/doc/walpolepolicelieutenant6835rtf/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -750,http://lafayettepolice.us/826/fire-blocking,Not Criminal Justice Related,200,"Fire Blocking | Lafayette, IN - Official Website","In combustible construction, fire blocking shall be installed to cut off concealed draft openings (both vertical and horizontal) and shall form an effective barrier between floors, between a top story and a roof or attic space.","[""\r\n\r\nFire Blocking\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -751,https://spdblotter.seattle.gov/2021/05/04/police-arrest-two-felons-in-stolen-car-with-drugs-and-gun-in-cid/,Media Bulletins,200,"Police Arrest Two Felons in Stolen Car with Drugs, and Gun in CID - SPD Blotter","","[""Police Arrest Two Felons in Stolen Car with Drugs, and Gun in CID""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -752,https://delcopa.gov/planning/demodata/ridleyparkborough.html,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -753,https://chandlerazpd.gov/police-leadership/chris-perez/,Personnel Records,200,Chris Pérez – Chandler Police Department,"","[""Commander Chris P\u00e9rez""]",[],"[""Quick Links"", ""Police Administration"", ""Police Leadership"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n""]","["" Contact"", "" About the Department"", "" Latest News"", ""\n Courage, Pride, Dedication\n \n \u00a9 2024 Chandler Police Department \n""]",[],[] -754,https://www.stpaul.gov/departments/police/level-ii-notifications,Resources,200,Level II Notifications | Saint Paul Minnesota,Thank you for your request Thank you for submitting your request to receive notification regarding offenders assigned to risk level II. A confirmation emai,"[""\nLevel II Notifications\n""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Footer""]","[""\n You are using an unsupported browser. Please use Microsoft Edge.\n "", ""\n Contact The City\n "", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[] -755,https://www.mass.gov/doc/plaza-justiniano-v-boston-police-department-related-superior-court-decision-81909/download,Court Cases,200,"","",[],[],[],[],[],[] -756,https://council.seattle.gov/2014/05/22/police-chief-confirmation-schedule-updated/,Not Criminal Justice Related,200,Police Chief confirmation schedule updated - Seattle City Council Blog,"","[""Police Chief confirmation schedule updated""]",[],"[""HELPFUL LINKS"", ""Make your voice heard"", ""Councilmembers""]",[],[],[] -757,http://www.longbeach.gov/police/press-releases/traffic-fatality9/,Media Bulletins,200,TRAFFIC FATALITY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -758,https://www.mass.gov/doc/cordeiro-jeffrey-v-boston-police-department-related-superior-court-decision-13111/download,Court Cases,200,"","",[],[],[],[],[],[] -759,https://www.stcharlesil.gov/departments/police/overview/tactical-response-unit-tru,Contact Info & Agency Meta,200,"Tactical Response Unit (TRU) | City of St Charles, IL","In late 2007 the Police Department merged its Tactical Response Unit (TRU) with the Kane County Sheriff's Office Special Weapons and Tactics (SWAT) team. The TRU had been operating since 1994; it successfully handled such high-profile cases as the Halloween shooting of trick-or-treaters in 2003, as well as high-risk incidents such as barricaded subjects, hostages, and","[""\n\n City of St. Charles, Illinois \n"", ""Tactical Response Unit (TRU)""]","[""You are here"", ""Police Department"", ""\n Key Resources "", ""\n Connect With Us ""]",[],[],[],[] -760,https://southamptontownnypolice.gov/206/printable-permit-applications,Not Criminal Justice Related,200,"Printable Permit Applications | Southampton, NY - Official Website",View an explanation of different permits and how you can apply for them.,"[""\r\n\r\nPrintable Permit Applications\t\t""]","[""Explanation of Permits""]","[""Loading"", ""Site Tools"", ""Contact Us"", ""Charles McArdle\u00a0"", ""Hours"", ""Contact Us"", ""Site Links""]",[],[],[] -761,https://coloradosprings.gov/police-department/article/news/colorado-springs-police-department-0,Not Criminal Justice Related,200,Colorado Springs Police Department recognized for prestigious interactive media award | City of Colorado Springs,"","[""\nColorado Springs Police Department recognized for prestigious interactive media award\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]","[""About the Horizon Interactive Awards""]",[],"[""REPORT ONLINE""]",[] -762,https://www.clermontpolice.in.gov/post/traffic-alert-town-parade,Media Bulletins,200,Traffic Alert: Town Parade,"","[""Traffic Alert: Town Parade""]","[""Recent Posts""]",[],[],[],[] -763,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/august-17-activity-report/,Annual & Monthly Reports,200,August 17 Activity Report - Town of Cheswold,"","[""Cheswold""]","[""Delaware"", ""August 17 Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[] -764,https://cityofvanalstyne.us/departments/police/emergency-preparedness/,Resources,200,"Emergency Preparedness – CodeRED – City of Van Alstyne, Texas","","[""Emergency Preparedness \u2013 CodeRED""]","[""Seconds Count in an Emergency"", ""Are you in the Database?"", ""VAN ALSTYNE POLICE"", ""MORE VAPD NEWS ON OUR FACEBOOK PAGE:"", ""Contact VAPD:"", ""REACHING CITY HALL:""]",[],"[""For Emergencies Call 9-1-1""]",[],[] -765,https://beaumonttexas.gov/beaumont-police-investigating-aggravated-assault-400-block-of-giles/,Media Bulletins,404,"","",,,,,, -766,https://champaignil.gov/2022/02/20/champaign-police-investigating-overnight-battery-shooting/,Media Bulletins,200,"Champaign Police Investigating Overnight Battery, Shooting - City of Champaign","","[""Champaign Police Investigating Overnight Battery, Shooting""]","[""News Releases"", ""Department News""]",[],[],[],[] -767,https://coloradosprings.gov/police-department/article/news/cspd-takes-part-calea-accreditation,Media Bulletins,200,CSPD takes part in CALEA accreditation assessment | City of Colorado Springs,"","[""\nCSPD takes part in CALEA accreditation assessment\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -768,https://www.stmatthewsky.gov/police/how-do-i-submit/,Records Request Info,200,How Do I Submit - City of St Matthews,"","[""How Do I Submit""]",[],"[""Open Records Request"", ""Citizen Feedback"", ""Complaint on an Officer""]",[],[],[] -769,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0264/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -770,https://johnstown.colorado.gov/news-article/johnstown-police-department-is-participating-in-7-11s-operation-chill,Media Bulletins,200,Johnstown Police Department is Participating in 7-11's Operation Chill | Town of Johnstown,Law Enforcement Officers in Johnstown to Reward Local Kids for Good Behavior with Free 7-Eleven Slurpee® Drink Coupons ,"[""\nJohnstown Police Department is Participating in 7-11's Operation Chill\n""]","[""Recent""]","[""Johnstown Approves Changes to Land Use and Development Code"", ""Johnstown Welcomes Kroger Grocery Facility to Region"", ""Highway 402 Park-n-Ride Lot Closure"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n""]",[],[],[] -771,https://coloradosprings.gov/police-department/article/news/update-officer-involved-shooting,Media Bulletins,200,Update – Officer Involved Shooting | City of Colorado Springs,"","[""\nUpdate \u2013 Officer Involved Shooting\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -772,https://www.ashevillenc.gov/department/police/office-of-the-chief/submit-a-commendation/,Contact Info & Agency Meta,200,Thank a police department employee - The City of Asheville,"","[""\n Thank a police department employee ""]",[],[],[],[],[] -773,https://delcopa.gov/prison/21job.html,Misc Police Activity,200,"2021 Jail Oversight Board Meetings - Delaware County, Pennsylvania","","[""2021 Jail Oversight Board Meetings""]",[],"["" George Hill Correctional \r\n\t Facility Navigation "", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -774,https://www.austintexas.gov/content/firefighters-and-police-officers-and-emergency-medical-services-personnel-civil-service-commission-2013-meetings-page-1,Misc Police Activity,200,Firefighters and Police Officers and Emergency Medical Services Personnel Civil Service Commission - 2013 Meetings - Page 1 | AustinTexas.gov,"","[""Firefighters and Police Officers and Emergency Medical Services Personnel Civil Service Commission - 2013 Meetings - Page 1"", ""2013 Meetings: Firefighters' and Police Officers' and Emergency Medical Services Personnel Civil Service Commission""]","[""Action Navigation"", ""GTranslate"", ""Main menu"", ""Frequently Viewed Departments"", ""City Clerk"", ""2013 Meetings: Page 1 of 2\u00a0\u00a0."", ""Go to page: \u00a0\u00a01\u00a0\u00a0\u00a0\u00a02\u00a0\u00a0."", ""2013 Meetings: Page 1 of 2\u00a0\u00a0."", ""Go to page: \u00a0\u00a01\u00a0\u00a0\u00a0\u00a02\u00a0\u00a0."", ""Footer Menu"", ""Second Footer Menu""]","[""Resident"", ""Business"", ""Government"", ""Departments"", ""Connect""]",[],"[""April 1, 2013"", ""Regular Meeting of the Firefighters' and Police Officers' and Emergency Medical Services Personnel Civil Service Commission - Regular Meeting"", ""Agenda\u00a0\u00a0(96KB)"", ""March 21, 2013"", ""Event - Temporary Suspension hearing - Officer Kevin DeLaRue"", ""Event Notice - Temporary Suspension - Officer DeLaRue\u00a0\u00a0(26KB)"", ""March 4, 2013 (Cancelled)"", ""Regular Meeting of the Firefighters' and Police Officers' and Emergency Medical Services Personnel Civil Service Commission - Regular Meeting Canceled"", ""Cancellation Notice - Regular meeting canceled\u00a0\u00a0(107KB)"", ""February 11, 2013"", ""Event - Civil Service Hearing - Temporary Suspension Appeal - Fire Captain Daniel O'Dell"", ""Event Notice\u00a0\u00a0(70KB)"", ""February 11, 2013"", ""Special Called Meeting of the Firefighters' and Police Officers' and Emergency Medical Services Personnel Civil Service Commission - CIVIL SERVICE COMMISSION SPECIAL CALLED MEETING "", ""Agenda\u00a0\u00a0(98KB)"", ""February 4, 2013 (Cancelled)"", ""Regular Meeting of the Firefighters' and Police Officers' and Emergency Medical Services Personnel Civil Service Commission - Regular Meeting Canceled "", ""Cancellation Notice - Regular Meeting Cancelled\u00a0\u00a0(107KB)"", ""January 31, 2013"", ""Event - Civil Service Hearing - Temporary Suspension Appeal - Firefighter Marja Juraschek"", ""Event Notice\u00a0\u00a0(71KB)"", ""January 18, 2013"", ""Special Called Meeting of the Firefighters' and Police Officers' and Emergency Medical Services Personnel Civil Service Commission - CIVIL SERVICE COMMISSION SPECIAL CALLED MEETING "", ""Agenda - CIVIL SERVICE COMMISSION SPECIAL CALLED MEETING\u00a0\u00a0(97KB)"", ""Approved Minutes\u00a0\u00a0(98KB)""]",[] -775,http://www.longbeach.gov/police/press-releases/felony-suspects-arrested-and-charged/,Media Bulletins,200,FELONY SUSPECTS ARRESTED AND CHARGED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -776,http://police.portlandmaine.gov/788/sound-oversight-committee,Misc Police Activity,200,"Sound Oversight Committee | Portland, ME - Official Website","The Sound Oversight Committee meets on an as needed basis, as issues arise with entertainment licenses within the City of Portland.","[""Sound Oversight Committee""]",[],[],[],[],[] -777,https://www.lasalle-il.gov/shared-police-services-committee-0,Misc Police Activity,200,Shared Police Services Committee | City of La Salle,"","[""Shared Police Services Committee\n""]","[""Main navigation"", ""Main Menu"", ""Important Info""]",[],[],[],[] -778,https://dps.georgia.gov/press-releases/2008-02-08/gsp-and-atlanta-police-announce-new-partnership,Poor Data Source,404,"","",,,,,, -779,https://www.mass.gov/doc/emergencycarrulespromulgated02062008red-linedcopypdf/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -780,https://www.cityofauburnwa.gov/city_hall/police/dispute_resolution,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -781,https://southamptontownnypolice.gov/325/duties-responsibilities,Not Criminal Justice Related,200,"Duties & Responsibilities | Southampton, NY - Official Website",Review the duties and responsibilities of the Landmarks and Historic District Board.,"[""\r\n\r\nDuties & Responsibilities\t\t""]","[""I. Landmarks & Historic Districts (See ST Code 330-320)"", ""II. Certificate of Appropriateness (See ST Code 330-322 through 330-324)"", ""III. Hamlet Heritage Resource Areas (See ST Code 330-331)"", ""IV. Demolition and Construction Applications for Structures Built Before 1941"", ""Landmarks Board"", ""Town Hall - Department of Land Management""]","[""Loading"", ""Site Tools"", ""Contact Us"", ""Quick Links"", ""Contact Us"", ""Site Links""]",[],[],[] -782,https://icjia.illinois.gov/about/publications/a-profile-of-the-illinois-state-police-motor-vehicle-theft-intelligence-clearinghouse/,Poor Data Source,200,ICJIA | Illinois Criminal Justice Information Authority,Illinois Criminal Justice Information Authority,[],[],[],[],[],[] -783,https://www.colma.ca.gov/documents/executive-assistant-chief-police/,Training & Hiring Info,200,Executive Assistant to Chief of Police - Town of Colma,"","[""\n\n Executive Assistant to Chief of Police""]","[""Primary menu links"", ""Action toolbar"", ""Documents and forms"", ""Contact"", ""Subscribe"", ""Connect""]",[],[],[],[] -784,https://delcopa.gov/publicrelations/releases/2020/votingsystemdemo.html,Not Criminal Justice Related,200,"Delaware County Holds Demonstration of New Voting System - Delaware County, Pennsylvania","","[""Delaware County Holds Demonstration \r\n of New Voting System""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Hart Verity 2.3.4 Voting System on display at Courthouse Feb. 10-14""]",[],[] -785,https://santabarbaraca.gov/press-releases/community-members-help-santa-barbara-police-apprehend-reckless-driver,Media Bulletins,200,Community Members Help Santa Barbara Police Apprehend Reckless Driver | City of Santa Barbara,"On July 14, 2021, around 0930am, a Santa Barbara Police Officer was on patrol in the area of Cabrillo Blvd. and Stearns Wharf when he was flagged-down by a community member regarding a subject trying to instigate numerous physical altercations in the area of the Wharf. The Officer attempted to conduct a traffic stop of the subject who was driving a vehicle. The suspect fled west on Cabrillo Blvd in their vehicle, away from the Officer. The Officer lost sight of the vehicle, and responding police units set up a perimeter in the Natoma Avenue neighborhood.","[""Community Members Help Santa Barbara Police Apprehend Reckless Driver""]","[""Breadcrumb"", ""Contact"", ""This is the prefooter section"", ""Main Footer"", ""City Hall"", ""Mailing Address"", ""Newsletters""]",[],[],[],[] -786,https://www.southamptontownnypolice.gov/faq.aspx?qid=322,Not Criminal Justice Related,200,FAQs • When is deer hunting season in the Town of Southampto,"",[],"[""\n\u25bc\r\nHunting Season\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -787,https://www.mass.gov/lists/don-northeast-endoscopy,Not Criminal Justice Related,200,DoN - Northeast Endoscopy | Mass.gov,Determination of Need application materials received by the Department of Public Health for Northeast Endoscopy.,"[""\nDoN - Northeast Endoscopy\n""]","[""Table of Contents"", ""Application documents\n "", ""Decision letter\n "", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -788,https://delcopa.gov/prison/pdfs/dresscodevisitors2022.pdf,Poor Data Source,200,"","",[],[],[],[],[],[] -789,http://www.lafayettepolice.us/2067/residential-projects,Not Criminal Justice Related,200,"Residential Projects | Lafayette, IN - Official Website","","[""\r\n\r\nResidential Projects\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -790,https://southamptontownnypolice.gov/456/planning-policy-advisory-committee,Not Criminal Justice Related,200,"Planning Policy Advisory Committee | Southampton, NY - Official Website",View the members of the Planning Policy Advisory Committee.,"[""\r\n\r\nPlanning Policy Advisory Committee\t\t""]","[""Members""]","[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]",[],[],[] -791,https://www.sandiego.gov/police/news-center/cold-cases/carole-defleice,Poor Data Source,200,Carole DeFleice | City of San Diego Official Website,"Carole DeFleice, also known as Nina Star, had been in San Diego for about six weeks prior to her murder. During this time she had been working as a prostitute along El Cajon Boulevard. She was living at the Sea Point Motel and taking her dates to the Aztec Motel at the dead-end of 4400 Camino Del Rio South. DeFleice was last seen alive on El Cajon Boulevard at around 9 p.m. on Friday night, February 25, 1984. DeFleice told a close friend she had plans to get picked up for a date at about 11:00 p.m.","[""City of San Diego Official Website"", ""Cold Case: Carole DeFleice\n""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""News Center"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -792,https://delcopa.gov/publicrelations/releases/2019/htf_communityday.html,Not Criminal Justice Related,200,"Community Day celebrates recovery, recognizes partners in drug prevention - Delaware County, Pennsylvania","","[""Community Day celebrates recovery, recognizes partners in drug prevention""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -793,http://lafayettepolice.us/1846/berlowitz-development-area-master-plan,Not Criminal Justice Related,200,"Berlowitz Development Area Master Plan | Lafayette, IN - Official Website",Berlowitz Development Area Master Plan,"[""\r\n\r\nBerlowitz Development Area Master Plan\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -794,https://champaignil.gov/police/about-us/recruitment/,Training & Hiring Info,200,Recruitment - City of Champaign,"","[""Police Recruitment"", ""Join Champaign PD"", ""Experienced Police Officer"", ""Entry Level Police Officer""]","[""Police Department"", ""Quick Links"", ""Police Department News"", ""Contact Us""]",[],"[""\n\n About Champaign\n \n"", ""\n\n Applying to the Champaign Police Department\n \n"", ""\n\n Experienced Officer Incentive Program\n \n"", ""\n\n Basic Requirements\n \n"", ""\n\n Hiring Process\n \n"", ""\n\n Salary & Benefits\n \n"", ""\n\n Basic Requirements\n \n"", ""\n\n Hiring Process\n \n"", ""\n\n Important Dates\n \n"", ""\n\n Salary & Benefits\n \n"", ""\n\n Frequently Asked Questions\n \n""]",[],[] -795,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0364/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -796,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/040921blotter.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -797,http://www.ryepolice.us/wp-content/uploads/storm-preparedness-1.jpg,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -798,https://champaignil.gov/2013/11/25/champaign-police-respond-to-check-welfare-and-shots-heard-call-2000-block-of-cynthia-drive/,Media Bulletins,200,Champaign Police Respond to Check Welfare and Shots Heard Call (2000 Block of Cynthia Drive) - City of Champaign,"","[""Champaign Police Respond to Check Welfare and Shots Heard Call (2000 Block of Cynthia Drive)""]","[""News Releases"", ""Department News""]",[],[],[],[] -799,https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-4/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -800,http://www.longbeach.gov/police/news/$10-000-reward-issued-in-fatal-hit-and-run-case/,Media Bulletins,200,"$10,000 REWARD ISSUED IN FATAL HIT AND RUN CASE","The fatal hit & run collision of disabled man occurred on February 13, 2015.  Anyone with information is urged to call the LBPD Collision Investigation Detail at (562) 570-7355.","[""Police Department"", ""$10,000 REWARD ISSUED IN FATAL HIT AND RUN CASE""]",[],"[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""Crime Lab Survey"", ""\u00a0""]",[] -801,https://www.antioch.il.gov/wpfb-file/02-14-12-police-pension-agenda-pdf-5/,Poor Data Source,200,"02-14-12 Police Pension Agenda - Antioch, IL",02 14 12 police pension agenda pdf commissions fund agendas 2012 2017 05 17 08 41 32 0000,"[""02-14-12 Police Pension Agenda""]",[],[],[],[],[] -802,https://police.greenvillesc.gov/faq.aspx?qid=156,Poor Data Source,200,"FAQs • I know I can't talk to the judge, but you're ni","",[],"[""\n\u25bc\r\nMunicipal Court - Judicial Communications\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -803,https://coloradosprings.gov/police-department/article/news/cspd-accident-alert-status-may-7-11-2021,Media Bulletins,200,"CSPD on Accident Alert Status from May 7 – 11, 2021 | City of Colorado Springs","","[""\nCSPD on Accident Alert Status from May 7 \u2013 11, 2021\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -804,https://dccouncil.gov/judiciary-public-safety/copy-of-fi0_fy19_attachment-i/,Not Criminal Justice Related,200,Copy of FI0_FY19_Attachment I • Council of the District of Columbia,"","[""Copy of FI0_FY19_Attachment I""]",[],[],[],[],[] -805,https://www.coppelltx.gov/268/cpr-aed-courses,Not Criminal Justice Related,200,"CPR-AED Courses​​ | Coppell, TX",CPR classes are held once a month at the Life Safety Park. ,"[""\r\n\r\nCPR-AED Courses\u200b\u200b\t\t""]","[""Fire Station #1"", ""Fire Station #2"", ""Fire Station #3"", ""Fire Station #4""]","[""Loading""]",[],[],[] -806,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/062121summary.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -807,https://police.bixbyok.gov/formcenter,Contact Info & Agency Meta,200,"Form Center • Bixby Police Department, OK • CivicEngage","","[""Form Center""]","[""\u25bcPolice Department""]","[""Loading"", ""Search Forms:"", ""Helpful Links"", ""FAQs"", ""Site Links""]",[],[],[] -808,https://www.lynchburgvapolice.gov/wp-content/uploads/2022/02/id-2.png,Poor Data Source,404,"","",,,,,, -809,https://spdblotter.seattle.gov/2017/10/27/police-recover-gun-stolen-car-and-arrest-two-prowlers/,Media Bulletins,200,"Police Recover Gun, Stolen Car and Arrest Two Prowlers - SPD Blotter","","[""Police Recover Gun, Stolen Car and Arrest Two Prowlers""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -810,https://delcopa.gov/courts/judges/scanlon.html,Not Criminal Justice Related,200,Judge Anthony D. Scanlon - Delaware County Court of Common Pleas,"","[""Judge Anthony D. Scanlon""]",[],"[""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[] -811,http://www.ryepolice.us/logs/police-logs-for-62817-7417,Calls for Service,200,Rye Police Department Police Logs for 6/28/17-7/4/17 - Rye Police Department,"","[""Police Logs for 6/28/17-7/4/17""]","[""Police Logs for 6/28/17-7/4/17""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -812,https://www.east-windsor.nj.us/police-reports,Resources,200,"Official Website of East Windsor Township, New Jersey - Police Reports","",[],"[""Police Reports""]","[""RECORDS FEE SCHEDULE"", ""ALL FEES LISTED BELOW MUST BE PAID IN FULL\r\nPRIOR TO BEING SENT BY MAIL OR FACSIMILE - NO EXCEPTIONS"", ""I.\u00a0 INCIDENT (INVESTIGATION) REPORTS:"", ""II.\u00a0 ACCIDENT REPORTS:"", ""III.\u00a0DISCOVERY Requests from Attorneys/Defendants via mail"", ""IV. PERSONAL RECORDS (BACKGROUND) CHECK:"", ""V. ADDITIONAL REPRODUCTION FEES (In addition to fees listed above)""]",[],[],[] -813,https://www.ci.san-bernardino.ca.us/city_hall/police_department/records_bureau,Records Request Info,200," - Records Bureau - City of San Bernardino -","","[""City of San Bernardino California""]","[""Records Bureau""]",[],[],[],[] -814,https://www.rosslynfarmspa.gov/police-activity-reports/november-police-activity-report-2021/,Annual & Monthly Reports,200,Police Activity Report November 2021 - Police Activity Reports - Borough of Rosslyn Farms,"","[""Police Activity Report November 2021""]","[""Post navigation"", ""Special Notices"", ""Council News"", ""Police Activity Reports"", ""Today\u2019s Events"", ""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]",[],[],[],[] -815,https://delcopa.gov/row/notices.html,Not Criminal Justice Related,200,"Notices - Delaware County, Pennsylvania","","[""Notices""]",[],"[""Register of Wills Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -816,https://www.pleasantprairiewi.gov/news/2022_news/police_and_fire_station_design_contracts,Poor Data Source,200," - Police and Fire Station Design Contracts - Village of Pleasant Prairie -","",[],"[""Police and Fire Station Design Contracts""]","[""Follow Us on Social Media""]",[],[],[] -817,http://lafayettepolice.us/faq.aspx?qid=92,Media Bulletins,200,FAQs • I really hate the color and design of our license pla,"",[],"[""\n\u25bc\r\nPolice\t\t""]","[""Loading"", ""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -818,https://bolivar.mo.us/shop-with-a-copr/img_1198-2/,Poor Data Source,200,"IMG_1198 - City of Bolivar, Missouri","","[""IMG_1198""]",[],[],[],[],[] -819,https://champaignil.gov/2012/10/25/life-as-a-police-officer/,Misc Police Activity,200,“Life as a Police Officer” - City of Champaign,"","[""\u201cLife as a Police Officer\u201d""]","[""News Releases"", ""Department News""]",[],[],[],[] -820,https://alpha.austin.gov/en/police-oversight/formal-complaint-acts-bringing-discredit-upon-the-department-and-employee-domestic-violence/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -821,https://springfield-or.gov/city/police-department/open-data/,List of Data Sources,200,Open Data - City of Springfield Oregon,"","[""Follow us @SPDOregon""]",[],[],"[""Police""]",[],[] -822,https://www.mass.gov/info-details/audit-of-the-norfolk-sheriffs-office-civil-process-division-objectives-scope-and-methodology,Resources,200,"Audit of the Norfolk Sheriff’s Office—Civil Process Division Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Norfolk Sheriff’s Office—Civil Process Division,"[""\nAudit of the Norfolk Sheriff\u2019s Office\u2014Civil Process Division Objectives, Scope, and Methodology\n""]","[""Table of Contents\n for the audit, Audit of the Norfolk Sheriff\u2019s Office\u2014Civil Process Division"", ""Table of Contents"", ""Overview\n "", ""Collection of Fees for the Delivery of Legal Services\n "", ""Contracting Process for Goods and Services\n "", ""Administration of Non-Payroll Expenses\n "", ""Reconciling Bank Accounts\n "", ""Authorizing Payments to Deputy Sheriffs\n "", ""Data Reliability\n "", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -823,https://champaignil.gov/2019/05/11/police-investigating-two-overnight-shootings/,Media Bulletins,200,Police Investigating Two Overnight Shootings - City of Champaign,"","[""Police Investigating Two Overnight Shootings""]","[""News Releases"", ""Department News""]",[],[],[],[] -824,https://www.doj.state.or.us/venue/portland-police-bureau/,Contact Info & Agency Meta,200,Portland Police Bureau - Oregon Department of Justice : Media,"","["""", ""\nPortland Police Bureau\n"", ""Portland Police Bureau""]","[""Oregon Department of Justice"", ""Portland Police Bureau"", ""Upcoming Events""]","[""Attorney General Ellen F. Rosenblum""]",[],[],[] -825,https://www.mass.gov/doc/regional-assessment-center-initiative-memo-police-chief-and-deputy-police-chief-0/download,Policies & Contracts,200,"","",[],[],[],[],[],[] -826,https://www.mass.gov/info-details/audit-of-the-quinsigamond-community-college-foundation-objectives-scope-and-methodology,Not Criminal Justice Related,200,"Audit of the Quinsigamond Community College Foundation Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Quinsigamond Community College Foundation.,"[""\nAudit of the Quinsigamond Community College Foundation Objectives, Scope, and Methodology\n""]","[""Table of Contents\n for the audit, Audit of the Quinsigamond Community College Foundation"", ""Table of Contents"", ""Overview\n "", ""Data Reliability\n "", ""Conclusion\n "", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -827,https://www.roseville.ca.us/government/departments/police_department/press_releases,Media Bulletins,200," - Press Releases - City of Roseville -","","[""City of Roseville""]","[""Press Releases""]","[""Roseville Police Department ""]",[],[],[] -828,https://ose.louisiana.gov/event/police-forensic-scientist-3/,Training & Hiring Info,200,Police Forensic Scientist | Louisiana Office of State Examiner,"","["""", ""Police Forensic Scientist""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -829,https://detroitmi.gov/departments/police-department/detroit-police-department-shield-program/faith-based-partners,Resources,200,Faith-Based Partners | City of Detroit,"Why Join SHIELD?  The Detroit Police Department Shield program is committed to an open line of communication between faith-based leaders and law enforcement agencies to effectively deter terrorism, homegrown violent extremists, and crimes that affect houses of worship.  Benefits of DPD SHIELD Partnership  We have a shared responsibility to provide for the safety and security of our community. The DPD SHIELD Program serves as the tool to accomplish this task; however, only by collaborating can we achieve success. As a member of the DPD SHIELD Program, you will have an opportunity to take an active role in helping to make Detroit a wonderful place to live, work, and raise a family.       Resources Faith-Based Community Resources The Cybersecurity and Infrastructure Security Agency (CISA) in partnership with the Department of Homeland Security for Faith-Based and Neighborhood Partnerships and the Faith-Based Information Sharing and Analysis Organization have developed resources that assist in securing faith-based organization’s physical and cybersecurity.  CISA (5) Ways to Improve the Safety and Security of Your Place of Worship or Community Spaces CISA Security Self-Assessment DHS Center for Faith-Based and Neighborhood Partnerships Resources The Power of Hello Guide for Houses of Worship Additional Resources The Faith-Based Information Sharing & Analysis Organization (FB-ISAO) CAIR - Best Practices for Mosque and Community Safety Synagogue Security Toolkit Secure Community Network    ","[""\nFaith-Based Partners\n""]","[""Top Links"", ""Site Menu"", ""\nDetroit Police Shield FAQs\n\n""]","[""Why Join SHIELD?\u00a0"", ""\nBenefits of DPD SHIELD Partnership\u00a0"", ""Resources""]","[""CONTACTS""]",[],[] -830,https://www.ci.rohnert-park.ca.us/i_want_to__/police_transparency,List of Data Sources,200," - Transparency - City of Rohnert Park -","","[""City of Rohnert Park""]","[""Rohnert Park""]","[""Transparency""]",[],[],"[""The Rohnert Park Department of Public Safety believes in open and accessible government, meaningful engagement, and mutual accountability.""]" -831,https://delcopa.gov/sustainability/pdf/raise/populationforecast-2015-2045_2016.pdf,Not Criminal Justice Related,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -832,https://cityofpowell.us/police-agency/traffic-surveys/traffic-survey-report-4-2-18-1/,Poor Data Source,200,"City of Powell, Ohio | Traffic Survey Report 4-2-18 (1)","","[""\n Traffic Survey Report 4-2-18 (1)\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -833,https://spdblotter.seattle.gov/2019/06/22/police-arrest-man-in-greenwood-following-saturday-morning-stabbing/,Media Bulletins,200,Police Arrest Man in Greenwood Following Saturday Morning Stabbing - SPD Blotter,"","[""Police Arrest Man in Greenwood Following Saturday Morning Stabbing""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -834,https://delcopa.gov/council/2016minutes/062216minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -835,https://police.birminghamal.gov/services/,Resources,200,Services | Birmingham Police Department,"","[""\n\n\n Birmingham Police Department\n\n\t\t\t\t\tCommitment | Excellence | Integrity\t\t\t\t\n\n""]","[""Putting People First"", ""Services""]","[""Accident, incident, offense $5"", ""Archived reports $25"", ""Background Checks (Local), $10"", ""Fingerprinting \u2013 Fingerprinting services are suspended until further notice."", ""Sex Offender Fee $10/mo"", ""Taxi License \u2013 (Initial, Renewal) $30"", """", """"]","[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[] -836,https://www.stpaul.gov/departments/police/21st-century-policing-report/pillar-2-policy-and-oversight/report-4,List of Data Sources,200,Report Recommendation 2.6 | Saint Paul Minnesota,"Collect, maintain, and analyze demographic data on detentions (stops, frisks, searches, summons, and arrests), disaggregated by school and non-school contacts.","[""\nReport Recommendation 2.6\n""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Footer""]","[""\n You are using an unsupported browser. Please use Microsoft Edge.\n "", ""\n SPPD is committed to transparency\n "", ""\n SPPD Response\n "", ""\n Contact The City\n "", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured"", ""\n Reference Data\n "", ""\n Reference Data\n ""]",[],[] -837,https://www.coppelltx.gov/faq.aspx?qid=439,Not Criminal Justice Related,404,"","",,,,,, -838,https://delcopa.gov/publicrelations/releases/2019/pdf/recoveryeventflyer.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -839,https://cityofmebanenc.gov/police-staff/officer-s-r-jones-min/,Poor Data Source,200,"Officer Jones - Mebane, NC","","[""Officer Jones""]","[""Primary menu links"", ""Action toolbar"", ""Welcome"", ""Engage"", ""Help""]",[],[],[],[] -840,https://www.southamptontownnypolice.gov/786/2015-budgets,Not Criminal Justice Related,404,"","",,,,,, -841,https://spdblotter.seattle.gov/2016/06/19/police-wound-knife-wielding-domestic-violence-suspect-during-confrontation-in-jackson-place-neighborhood/,Media Bulletins,200,Police Wound Knife-Wielding Domestic Violence Suspect During Confrontation in Jackson Place Neighborhood - SPD Blotter,"","[""Police Wound Knife-Wielding Domestic Violence Suspect During Confrontation in Jackson Place Neighborhood""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -842,http://www.longbeach.gov/police/press-releases/traffic-fatality----pacific-coast-highway710-freeway-overpass/,Media Bulletins,200,TRAFFIC FATALITY - PACIFIC COAST HIGHWAY &710 FREEWAY OVERPASS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -843,https://www.mass.gov/doc/chicopee-maximum-capacity-sports-bar-grille-violation-4-8-13/download,Media Bulletins,200,"","",[],[],[],[],[],[] -844,https://www.montebelloca.gov/departments/police/news/all_news_articles/etch_catch,Misc Police Activity,200," - Etch & Catch - City of Montebello -","","[""City of Montebello""]","[""Etch & Catch""]",[],[],[],[] -845,https://delcopa.gov/employment/jobpostings/senioradministrativespecialist.html,Not Criminal Justice Related,200,"Senior Administrative Specialist - Delaware County, Pennsylvania","","[""Senior Administrative Specialist""]",[],"[""Delco Jobs Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Summary"", ""Essential Duties"", ""Qualifications"", ""Contact""]",[],[] -846,https://linden-nj.gov/parent-university-helping-cope-with-anxiety-in-your-children/,Not Criminal Justice Related,200,Parent University – Helping Cope With Anxiety In Your Child(ren) – City of Linden,"","[""\n\n\t\t\tParent University \u2013 Helping Cope With Anxiety In Your Child(ren)\n\t\t""]",[],"[""Side Menu"", ""Weather Info"", ""Coat Drive 2021"", ""Nixle Alerts"", ""Recent Public Notices"", ""New Online Forms & Applications"", ""Upcoming Events"", ""About Linden"", ""Upcoming Events"", ""Important Forms, Docs & Applications"", ""Linden City Hall""]","[""Local Time"", ""\n\t\t\t\t\t\t\t\t\tToday\t\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\t\t\tWednesday\t\t\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\t\t\tThursday\t\t\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\t\t\tFriday\t\t\t\t\t\t\t\t\t"", ""\n\n\t \t\t\t\t\tCoat Drive 2021\t \t\t\t\t\n"", ""\n\n\t\t \t\t\t\t\tPublic Notice for the Request for Qualifications for General Management Consulting Services.\t\t \t\t\t\t\n"", ""\n\n\t\t \t\t\t\t\tJanuary Planning Board Meeting \u2013 Cancelled\t\t \t\t\t\t\n"", ""\n\n\t\t \t\t\t\t\tNotice RE New City Administrator and Assistant City Administrator Job Positions Available In The City of Linden\t\t \t\t\t\t\n"", ""\n\n\t\t \t\t\t\t\tNotice RE New Clerk 2 Public Works Position Available In The City of Linden\t\t \t\t\t\t\n"", ""\n\n\t\t \t\t\t\t\tNotice RE Public Safety Telecommunicator Trainee Position Available In The Linden Police Department\t\t \t\t\t\t\n"", ""\n\n\t\t \t\t\t\t\tMixed Martial Arts\t\t \t\t\t\t\n"", ""\n\n\t\t \t\t\t\t\tMixed Martial Arts\t\t \t\t\t\t\n"", ""\n\n\t\t \t\t\t\t\tKids\u2019 Fitness and Tumbling\t\t \t\t\t\t\n"", ""\n\n\t\t \t\t\t\t\tIntro Boot Camp Exercise Class\t\t \t\t\t\t\n"", ""\n\n\t\t \t\t\t\t\tMixed Martial Arts\t\t \t\t\t\t\n"", ""\n\n\t\t \t\t\t\t\tMixed Martial Arts\t\t \t\t\t\t\n"", ""\n\n\t\t \t\t\t\t\tGuidance for Lead Hazard Evaluation Program in Pre-1978 Residential Rentals\t\t \t\t\t\t\n"", ""\n\n\t\t \t\t\t\t\tLead Hazard Owner Registration & Exemptions\t\t \t\t\t\t\n""]","[""\n\t\t\t\t\t\t\t\t\tJanuary 23, 2024\t\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\t\t\tJanuary 24, 2024\t\t\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\t\t\tJanuary 25, 2024\t\t\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\t\t\tJanuary 26, 2024\t\t\t\t\t\t\t\t\t""]","[""\n\n\t\t\t\t\t\t\t\t\tPrevious\t\t\t\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\t\t\t\tNext\t\t\t\t\t\t\t\t\n""]" -847,https://bouldercolorado.gov/events/police-oversight-panel-18,Resources,200,Police Oversight Panel | City of Boulder,"","[""Police Oversight Panel\n""]","[""Breadcrumb"", ""Details"", ""Police Oversight Panel Meetings"", ""Meeting Details"", ""More Resources""]","[""\nPolice Oversight Panel Subcomittee: Legacy Meeting\n\n"", ""\nPolice Oversight Panel: Meeting with Interim Chief Redfern\n\n"", ""\nPolice Oversight Panel Subcommittee: Community Engagement Meeting\n\n"", ""\nPolice Oversight Panel Subcomittee: Co-Chairs and IPM Meeting\n\n"", ""\nPolice Oversight Panel: All Panel Meeting\n\n"", ""\nPolice Oversight Panel Subcommitee: Co-Chairs and IPM Meeting\n\n""]",[],[],[] -848,https://cityofpowell.us/police-agency/traffic-surveys/traffic-survey-report-5-15-18/,Poor Data Source,200,"City of Powell, Ohio | Traffic Survey Report 5-15-18","","[""\n Traffic Survey Report 5-15-18\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -849,https://www.sandiego.gov/department-document/san-diego-police-announce-arrest-balboa-park-sexual-assault-case,Media Bulletins,200,San Diego Police Announce Arrest in Balboa Park Sexual Assault Case | City of San Diego Official Website,"","[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""San Diego Police Announce Arrest in Balboa Park Sexual Assault Case"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -850,http://www.longbeach.gov/police/press-releases/critical-missing-person---edward-merrill-dephore/,Media Bulletins,200,CRITICAL MISSING PERSON - EDWARD MERRILL DEPHORE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -851,http://police.portlandmaine.gov/623/green-packaging-working-group,Not Criminal Justice Related,200,"Green Packaging Working Group | Portland, ME - Official Website",The Portland City Council has formed the Green Packaging Working Group to investigate the possibility of reducing or eliminating the use of plastic packaging in the city.,"[""Green Packaging Working Group""]",[],[],[],[],[] -852,https://delcopa.gov/ojs/ojsforms/divorcefees.pdf,Contact Info & Agency Meta,200,"","",[],[],[],[],[],[] -853,http://boro.dormont.pa.us/wp-content/uploads/2022/04/5j3a9282-10-copy-scaled.jpg,Not Criminal Justice Related,404,"","",,,,,, -854,https://delcopa.gov/publicrelations/releases/2020/gamingauthoritymeeting.html,Not Criminal Justice Related,200,"Streaming of the Gaming Authority Meeting – 11-16-2020 - Delaware County, Pennsylvania","","[""Streaming of the Gaming Authority Meeting \u2013 11-16-2020""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -855,https://wyoming.delaware.gov/wp-content/uploads/sites/33/nggallery/3rd-annual-wyoming-police-department-fishing-derby/p1010883.jpg,Poor Data Source,200,"","",[],[],[],[],[],[] -856,https://townoflandisnc.gov/departments/public-safety/police-department/faqs/,Resources,200,"FAQ's - Town of Landis, NC","","[""Landis Police FAQ\u2019s""]","[""Frequently Asked Questions""]","[""How Do I Contact the Police?"", ""How do I get a Police Report?"", ""How do I get a Gun Permit?"", ""How do I register an alarm system?""]","[""Patch Requests"", ""How Can We Help You?"", ""Other Helpful Links"", ""Contact Town of Landis""]",[],[] -857,http://www.longbeach.gov/police/press-releases/motorcycle-safety-operation-proves-effective-2-/,Media Bulletins,200,MOTORCYCLE SAFETY OPERATION PROVES EFFECTIVE(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -858,https://www.wakeforestnc.gov/police/operations/special-operations/tactical-services-unit,Contact Info & Agency Meta,200,"Tactical Services Unit | Town of Wake Forest, NC","The Tactical Service Unit is a part-time tactical unit trained and equipped to respond to critical incidents. Members of the Tactical Service Unit are trained in several high risk areas such as, high risk warrant service, barricaded subjects, and hostage rescue.The Tactical Service Unit, which includes two fully-trained snipers/observers, was created in the summer of 1998 and","[""Tactical Services Unit""]","[""fnow_may2019-40.jpg"", ""Search form"", ""You are here""]",[],[],[],[] -859,https://jordanmn.gov/city-departments/jordan-police-department/frequently-used-forms/,Training & Hiring Info,200,"Frequently Used Forms – City of Jordan, Minnesota","","[""\r\n\t\t\t\t\t\t\tFrequently Used Forms\t\t\t\t\t\t""]",[],"[""Live Shop Dine Jordan"", ""CONTACT US"", ""USEFUL LINKS"", ""Notices"", ""Upcoming Events"", ""About Jordan"", ""Phone Numbers"", ""Join Our Newsletter"", ""City of Jordan City Hall ""]","[""HELP WANTED- ELECTION JUDGES \u2013 2024 ELECTION"", ""Pubic Notice \u2013 Ordinance 2023-09"", ""Public Hearing Notice- Second Reading of Ordinance 2023-08"", ""Celebration of Funding for Highway 169, 282, and 9\u2019s Infrastructure Upgrades"", ""Fall Compost Pickup Days Wednesday, October 25th and Thursday, October 26th.""]",[],[] -860,https://delcopa.gov/planning/forms.html,Not Criminal Justice Related,200,Forms,"","[""Forms""]",[],"[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -861,https://delcopa.gov/courts/domesticrelations/forms.html,Not Criminal Justice Related,200,"Forms - Delaware County, Pennsylvania","","[""Forms""]",[],"[""Domestic Relations Navigation"", ""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[] -862,https://delcopa.gov/planning/pdf/greenspace/taskforce/andrew bunting.pdf,Not Criminal Justice Related,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -863,https://www.stpaul.gov/departments/police/administration-office-chief/support-services-administration/police-impound-lot-1,Resources,200,Online Auction | Saint Paul Minnesota,Selected Impound vehicles are sent to an online auction: Please go to the following site to look at current auctions - www.CrankyApe.com Lake Elmo Loaction,"[""\nOnline Auction\n""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Footer""]","[""\n You are using an unsupported browser. Please use Microsoft Edge.\n "", ""\n Contact The City\n "", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[] -864,https://www.sandiego.gov/police/news-center/cold-cases/dave-earl-carr,Media Bulletins,200,Dave Earl Carr | City of San Diego Official Website,"On May 12, 1994 SDPD officers responded to a shooting at 5114 El Cajon Blvd. and found the victim Dale Carr unconscious and suffering from a gunshot wound. Carr was rushed to a hospital but died from his injury. An investigation developed the following information: Carr had a prostitute working out of his apartment. Earlier that evening, a customer had visited Carr's apartment. Carr accepted the customers payment up front, but later argued with him over the amount of change due. Carr refused to back down and the man left angry.","[""City of San Diego Official Website"", ""Cold Case: Dave Earl Carr\n""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""News Center"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -865,https://bolivar.mo.us/shop-with-a-copr/img_1184-2/,Poor Data Source,200,"IMG_1184 - City of Bolivar, Missouri","","[""IMG_1184""]",[],[],[],[],[] -866,https://coloradosprings.gov/police-department/article/news/update-december-21-officer-involved,Officer Involved Shootings,200,Update: December 21 officer involved shooting | City of Colorado Springs,"","[""\nUpdate: December 21 officer involved shooting\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -867,https://www.lakewoodoh.gov/coffee-with-a-cop-set-for-friday-december-1st/,Misc Police Activity,200,"Coffee With A Cop set for Friday, December 1st | The City of Lakewood, Ohio","The Lakewood Police Department will host another ""Coffee With A Cop"" event on Friday, December 1, 2017 from 8:00 a.m. to 10:00 a.m. at Playgrounds, 15715","[""Coffee With A Cop set for Friday, December 1st""]",[],"[""Recent News"", ""Upcoming Events"", ""Most Popular Pages""]",[],[],[] -868,https://www.mass.gov/doc/lynn-police-credit-union-cra-public-evaluation-0/download,Poor Data Source,200,"","",[],[],[],[],[],[] -869,https://www.southamptontownnypolice.gov/1197/hampton-hills-association---bulkhead,Not Criminal Justice Related,200,"Hampton Hills Association | Southampton, NY - Official Website","","[""\r\n\r\nHampton Hills Association\t\t""]","[""WQIP - Committee Interview""]","[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]","[""WQIP - Proposal Summary"", ""WQIP - Fund Application""]",[],[] -870,https://coloradosprings.gov/police-department/page/patrol-bureau,Contact Info & Agency Meta,200,Patrol Bureau | City of Colorado Springs,"","[""\nPatrol Bureau\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]","[""\n\n\n\n Stetson Hills (Northeast)\n \n"", ""\n Stetson Hills (Northeast)\n "", ""\n\n\n\n Sand Creek (Southeast)\n \n"", ""\n Sand Creek (Southeast)\n "", ""\n\n\n\n Gold Hill (Southwest)\n \n"", ""\n Gold Hill (Southwest)\n "", ""\n\n\n\n Falcon (Northwest)\n \n"", ""\n Falcon (Northwest)\n "", ""\n\n\n\n School Resource Unit\n \n"", ""\n School Resource Unit\n "", ""\n\n\n\n Community Service Officer Unit (CSO)\n \n"", ""\n Community Service Officer Unit (CSO)\n "", ""\n\n\n\n DUI Unit\n \n"", ""\n DUI Unit\n "", ""\n\n\n\n Divisional Property Crimes Detectives\n \n"", ""\n Divisional Property Crimes Detectives\n "", ""\n\n\n\n Crime Prevention Officers\n \n"", ""\n Crime Prevention Officers\n "", ""\n\n\n\n The Homeless Outreach Team (HOT)\n \n"", ""\n The Homeless Outreach Team (HOT)\n "", ""\n\n\n\n Gang Unit\n \n"", ""\n Gang Unit\n "", ""\n\n\n\n Community Response Team\n \n"", ""\n Community Response Team\n ""]","[""Patrol\u00a0Bureau\u00a0""]","[""REPORT ONLINE""]",[] -871,https://norfolkne.gov/government/departments/police-division/press-releases/august-14-press-release.html,Media Bulletins,200,"August 14 Press Release - City of Norfolk, NE","","[""City of Norfolk, NE"", ""Police Division"", ""August 14 Press Release""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]" -872,https://bouldercolorado.gov/news/boulder-police-looking-unlawful-sexual-contact-suspect,Media Bulletins,200,Boulder Police Looking for Unlawful Sexual Contact Suspect | City of Boulder,"","[""Boulder Police Looking for Unlawful Sexual Contact Suspect\n""]","[""Breadcrumb"", ""Details"", ""Boulder Police are working to identify a man that assaulted an adult woman "", ""Keep Reading""]","[""\nBoulder Police and Boulder County Sheriff\u2019s Office Arrest Man in Shooting Incident\n\n"", ""\nBoulder Police Investigating Fatal Traffic Crash\n\n"", ""\nBoulder Police and Fire Communications Receives National Certification\n\n"", ""\nJonBenet Ramsey Homicide Investigation Update\u2014December 2023\n\n""]",[],[],[] -873,http://police.portlandmaine.gov/225/fire-department-careers,Not Criminal Justice Related,200,"Fire Department Careers | Portland, ME - Official Website","The Portland Fire Department accepts employment applications when the need for an eligibility list is determined, which typically occurs on an annual basis. Hiring information and applications will be available on the HR website when the application period is open.","[""Fire Department Careers""]",[],[],[],[],[] -874,https://www.arlingtontx.gov/news/my_arlington_t_x/police_news_releases/fatality_crash_report__2019-00690088,Media Bulletins,200," - Fatality Crash Report #2019-00690088 - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Fatality Crash Report #2019-00690088""]",[],[],[],[] -875,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/031621summary.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -876,http://www.ryepolice.us/announcements/state-of-new-hampshire-department-of-safety-press-release-extreme-heat/attachment/heat-press-release,Media Bulletins,200,Rye Police Department Heat Press Release - Rye Police Department,"","[""Heat Press Release""]","[""Heat Press Release""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -877,http://www.ryepolice.us/logs/police-logs-for-3-6-19-3-12-19,Daily Activity Logs,200,Rye Police Department Police Logs for 3/6/19-3/12/19 - Rye Police Department,"","[""Police Logs for 3/6/19-3/12/19""]","[""Police Logs for 3/6/19-3/12/19""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -878,https://delcopa.gov/planning/programsandinitiatives/bicyclemasterplans.html,Not Criminal Justice Related,200,BicycleMaster Plans,"","[""Bicycle Master Plans""]","[""Create a Bicycle Master Plan"", ""Funding Assistance"", ""Find Bicycle Routes and Trails""]","[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -879,https://delcopa.gov/council/2015minutes/092315minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -880,https://www.littlerock.gov/news/new-little-rock-police-department-chief-to-hold-public-meetings-in-all-city-wards/,Media Bulletins,200,New Little Rock Police Department Chief to Hold Public Meetings in All City Wards | City of Little Rock,"",[],"[""\nMedia Release \n""]",[],[],[],[] -881,https://www.mass.gov/event/scoping-meeting-ma-response-to-anticipated-changes-to-federal-atlantic-large-whale-take-reduction-plan-affecting-trap-fisheries-2020-02-19t180000-0500-2020-02-19t200000-0500,Not Criminal Justice Related,200,Scoping Meeting: MA Response to Anticipated Changes to Federal Atlantic Large Whale Take Reduction Plan Affecting Trap Fisheries | Mass.gov,DMF has scheduled two scoping meetings to discuss the state’s response to anticipated changes to the federal Atlantic Large Whale Take Reduction Plan (ALWTRP).,"[""\nPublic Meeting Notice\u00a0\n Scoping Meeting: MA Response to Anticipated Changes to Federal Atlantic Large Whale Take Reduction Plan Affecting Trap Fisheries\n ""]","[""\n\nAddress\n"", ""Contact\n for Scoping Meeting: MA Response to Anticipated Changes to Federal Atlantic Large Whale Take Reduction Plan Affecting Trap Fisheries"", ""Overview\n of Scoping Meeting: MA Response to Anticipated Changes to Federal Atlantic Large Whale Take Reduction Plan Affecting Trap Fisheries"", ""Additional Resources\n for Scoping Meeting: MA Response to Anticipated Changes to Federal Atlantic Large Whale Take Reduction Plan Affecting Trap Fisheries"", ""Contact\n for Scoping Meeting: MA Response to Anticipated Changes to Federal Atlantic Large Whale Take Reduction Plan Affecting Trap Fisheries"", ""Participating Organizations\n "", ""Contact for Scoping Meeting: MA Response to Anticipated Changes to Federal Atlantic Large Whale Take Reduction Plan Affecting Trap Fisheries"", ""Upcoming Events\n for Scoping Meeting: MA Response to Anticipated Changes to Federal Atlantic Large Whale Take Reduction Plan Affecting Trap Fisheries"", ""Help Us Improve Mass.gov with your feedback""]","[""\n Division of Marine Fisheries\n "", ""\n Division of Marine Fisheries\n "", ""\n Division of Marine Fisheries\n ""]","[""\n\nPhone\n"", ""\n\nOnline\n"", ""\n\nFax\n"", ""\n\nPhone\n"", ""\n\nOnline\n"", ""\n\nFax\n"", ""\n\nPhone\n"", ""\n\nOnline\n"", ""\n\nFax\n""]",[],[] -882,https://wrightstown.us/police-reports/11-29-2015-12-05-2015/,Media Bulletins,200,11-29-2015 - 12-05-2015 - Village of Wrightstown,"","[""11-29-2015 \u2013 12-05-2015""]","[""Recent News"", ""\n\t\t\t\t\t\tUpcoming Events\t\t\t\t\t""]",[],"[""Village Hall"", ""Public Works"", ""Police Department"", ""Fire Department"", ""Join Us on Social Media""]",[],[] -883,https://sanramon.ca.gov/our_city/departments_and_divisions/police/alarms,Policies & Contracts,200," - Alarm Registration Program - City of San Ramon -","","[""Alarm Registration Program""]","[""Contact Us"", ""Alarm Registration Program"", ""Contact Us"", ""Useful Links""]",[],[],[],[] -884,http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-3-/,Media Bulletins,200,DUI-DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND(3),"","[""Long BeachPolice Department""]",[],[],[],[],[] -885,https://www.stcharlesil.gov/departments/police/overview/bike-patrol,Media Bulletins,200,"Bike Patrol | City of St Charles, IL","The St. Charles bicycle patrol unit is an ""as needed"" unit that was started in May of 1993 with the help of the staff from the Bike Rack here in St. Charles. The bicycle patrol is used to supplement the three patrol shifts during the summer months.","[""\n\n City of St. Charles, Illinois \n"", ""Bike Patrol""]","[""You are here"", ""Police Department"", ""\n Key Resources "", ""\n Connect With Us ""]",[],[],[],[] -886,https://ridgelandsc.gov/police-department/daily-arrest-reports-december-2019,Arrest Records,200,Town of Ridgeland,Town of Ridgeland,"[""Police Department""]","[""Daily Arrest Reports - December 2019""]",[],[],[],[] -887,https://barnegatpolice.us/wp-content/uploads/2018/05/contactuspageheader-300x135.jpg,Poor Data Source,200,"","",[],[],[],[],[],[] -888,https://www.bedminster.us/police_fire_rescue/far_hills__bedminster_fire_dept,Not Criminal Justice Related,200," - Far Hills-Bedminster Fire Dept. - Township of Bedminster -","","[""Bedminster Township""]","[""Far Hills-Bedminster Fire Dept.""]","[""Bedminster Township""]",[],[],[] -889,https://brewermaine.gov/news/brewer-police-pull-woman-from-joshua-chamberlain-bridge/bridges-1gd-jpg/,Poor Data Source,200,"• The City of Brewer, Maine","","[""Brewer News""]",[],[],[],[],[] -890,https://www.mass.gov/how-to/register-for-cops-on-bicycles-with-education-for-bicyclists-cobweb,Misc Police Activity,403,"","",,,,,, -891,https://ijjc.illinois.gov/newsroom/mayor-emanuel-chicago-police-department-department-family-and-support-services-announce-40/,Poor Data Source,200,"Mayor Emanuel, Chicago Police Department, Department of Family and Support Services Announce a 40 Percent Decrease in Youth Violence in 2013 – Illinois Juvenile Justice Commission","","[""Mayor Emanuel, Chicago Police Department, Department of Family and Support Services Announce a 40 Percent Decrease in Youth Violence in 2013""]",[],[],[],[],[] -892,https://www.kennesaw-ga.gov/business-resources/copy-of-buttons-for-business-assistance/,Not Criminal Justice Related,200,Copy of Buttons for Business Assistance - City of Kennesaw,"","[""Copy of Buttons for Business Assistance""]","[""\n\t\t\t\t\t\tUpcoming Events\t\t\t\t\t""]","[""\n\n\t\tGentle Flow Yoga\t\n"", ""\n\n\t\tKENNESAW DEVELOPMENT AUTHORITY \u2013 Special Called\t\n"", ""\n\n\t\tPLAN REVIEW COMMITTEE\t\n"", ""\n\n\t\tConstruction Board of Adjustment and Appeals\t\n"", ""\n\n\t\tDog Days at the Gardens\t\n""]","[""Contact Us""]",[],[] -893,https://www.lynchburgvapolice.gov/news-updates/shots-fired-on-hillside-court/,Media Bulletins,200,Shots Fired on Hillside Court  - Lynchburg Police Department,"","[""Shots Fired on Hillside Court\u00a0""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[] -894,https://delcopa.gov/planning/pdf/mapping/norwood.pdf,Not Criminal Justice Related,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -895,https://delcopa.gov/sustainability/commission/meetingminutes/sustcommmtg_minutes_2021-9-17.pdf,Not Criminal Justice Related,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -896,https://delcopa.gov/ich/resources/covid19/pdf/govwolf_dangersofnoprotection.pdf,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -897,http://lafayettepolice.us/754/indiana-building-code-occupancy-classifi,Not Criminal Justice Related,200,"Indiana Building Code Occupancy Classifications | Lafayette, IN - Official Website",Structures or portions of structures shall be classified with respect to occupancy in one or more of the groups listed.,"[""\r\n\r\nIndiana Building Code Occupancy Classifications\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -898,http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-one-arrest1/,Media Bulletins,200,DUI CHECKPOINT NETS ONE ARREST,"","[""Long BeachPolice Department""]",[],[],[],[],[] -899,https://alpha.austin.gov/es/police-oversight/indefinite-suspension-of-officer-bryan-black-and-appeals-finding/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -900,https://delcopa.gov/council/2017minutes/121317minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -901,http://www.ryepolice.us/pressrelease/stolen-f-350-with-dump-trailer,Media Bulletins,200,Rye Police Department Stolen F-350 with Dump Trailer - Rye Police Department,"","[""Stolen F-350 with Dump Trailer""]","[""Stolen F-350 with Dump Trailer""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -902,https://www.williamsaz.gov/departments_and_services/police_department/forms,Poor Data Source,200," - Forms - City of Williams, AZ -","","[""City of Williams, Arizona""]","[""Forms""]","[""City of Williams, AZ""]",[],[],[] -903,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2017_archived_news/october_2017/arlington_polices_national_night_out_continues,Poor Data Source,200," - Despite the Rain, Arlington Police’s National Night Out Continues to Shine - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Despite the Rain, Arlington Police\u2019s National Night Out Continues to Shine""]",[],[],[],[] -904,http://lafayettepolice.us/144/find,Resources,200,"Find | Lafayette, IN - Official Website",Find quick access to pages that are viewed most often.,"[""\r\n\r\nFind\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]","[""\nApartment Safety\n"", ""\nCarbon Monoxide Detectors\n"", ""\nHome Emergency Plans\n"", ""\nLive Council Meetings\n"", ""\nLPD Memorial Wall\n"", ""\nPolice Honor Guard\n""]",[],[] -905,http://www.longbeach.gov/insidelb/blogs/conversations-with-a-long-beach-police-department-crime-analyst/,Poor Data Source,200,Crime Analyst Helps Increase Safety in Long Beach Thanks To Measure A,"","[""InsideLB"", ""Crime Analyst Helps Increase Safety In Long Beach Thanks To Measure A""]",[],"[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""Series"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[] -906,https://www.dps.ms.gov/capitol-police/patrol-division,Contact Info & Agency Meta,200,Capitol Police Patrol Division | Mississippi Department of Public Safety,"The Capitol Police Patrol Division is comprised of men and women who are committed to providing a safe and secure environment for elected officials, state employees and visitors to the Capitol and its associated buildings within the Capitol Complex Improvement District. These men and women provide law enforcement and security services by providing a uniformed presence to the Capitol Building and throughout the Capitol Complex District. These services are delivered through active and directed patrols, security checkpoints and random inspections.","[""\n\n\n\n\nCapitol Police Patrol Division\n\n""]","[""Divisions Menu"", ""Resources Menu"", ""\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nCapitol Police Patrol Division\n\n\n\n\n\n\n"", ""Capitol Police Menu"", ""Footer menu""]",[],"[""\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nDPS Home\n\n\nCapitol Police\n\n\n Capitol Police Patrol Division\n \n\n\n\n\n\n\n\n\n\n\n\n""]",[],[] -907,http://police.portlandmaine.gov/1125/neighborhoods-islands-directory,Not Criminal Justice Related,200,"Neighborhoods & Islands Directory | Portland, ME - Official Website",A listing of neighborhoods & islands.,"[""Neighborhoods & Islands Directory""]",[],[],"[""About the Portland Neighborhood Connector Project"", ""Back Cove Neighborhood Association"", ""Bayside Neighborhood Association"", ""Deering Center Neighborhood Association"", ""Deering Highlands Neighborhood Association"", ""East Bayside Neighborhood Organization"", ""East Deering Neighborhood Association"", ""Friends of Allen's Corner"", ""Friends of Morrill's Corner"", ""Friends of Woodfords Corner"", ""Hobart Street Wildlife Sanctuary"", ""India Street Neighborhood Association"", ""Island Services"", ""Libbytown Neighborhood Association"", ""Munjoy Hill Neighborhood Organization"", ""Nason's Corner Neighborhood Association"", ""Neighborhood Association Contact List (PDF)"", ""North Deering Neighborhood Association"", ""Parkside Neighborhood Association"", ""Peaks Island Council"", ""Riverton Community Association"", ""Saint John Valley Neighborhood Association"", ""Stroudwater Neighborhood Association"", ""University Neighborhood Organization (UNO)"", ""West End Neighborhood Association"", ""Western Promenade Neighborhood Association"", ""Woodfords-Oakdale Neighborhood Association""]",[],[] -908,http://www.lafayettepolice.us/1122/rent-a-pool,Not Criminal Justice Related,200,"Rent A Pool | Lafayette, IN - Official Website",Rent A Pool,"[""\r\n\r\nRent A Pool\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]","[""\nPrivate Rentals\n""]",[],[] -909,https://delcopa.gov/sustainability/pdf/raise/highlandavetod2009.pdf,Not Criminal Justice Related,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -910,http://www.ryepolice.us/logs/police-logs-for-11-7-18-11-13-18,Daily Activity Logs,200,Rye Police Department Police Logs for 11/7/18-11/13/18 - Rye Police Department,"","[""Police Logs for 11/7/18-11/13/18""]","[""Police Logs for 11/7/18-11/13/18""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -911,https://champaignil.gov/police-slide-sitemap.xml,Poor Data Source,200,"","",[],[],[],[],[],[] -912,https://www.stpaul.gov/departments/police/saint-paul-police-manual/10000-department-policy,Policies & Contracts,200,100.00 Department Policy | Saint Paul Minnesota,"The Saint Paul Police Department has published this online policy manual as part of our commitment to transparency. The online manual should be used for informational purposes only. Certain not public data have been redacted according to the Minnesota Government Data Practices Act, including sections 13.82 and 13.37. The Saint Paul Police Department manual is a living document that is updated and amended as needed, and the online manual will be updated to reflect current official policy.","[""\n100.00 Department Policy\n""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""The Saint Paul Police Department has published this online policy manual as part of our commitment to transparency."", ""\n 100.00 Department Policy\n "", ""Footer""]","[""\n You are using an unsupported browser. Please use Microsoft Edge.\n "", ""\n 110.00 Department Functions\n "", ""\n 120.00 Law Enforcement Code of Ethics\n "", ""\n 121.00 Oath of Office\n "", ""\n 131.00 Purpose\n "", ""\n 132.00 Primary Objective\n "", ""\n 133.01 Prevention of Crime\n "", ""\n 133.02 Deterrence of Crime\n "", ""\n 133.03 Apprehension of Offenders\n "", ""\n 133.04 Recovery and Return of Property\n "", ""\n 133.05 Movement of Traffic\n "", ""\n 133.06 Public Service\n "", ""\n 150.01 Loyalty\n "", ""\n 150.02 Conduct Unbecoming an Officer\n "", ""\n 150.03 Respect for Constitutional Rights\n "", ""\n 150.05 Integrity\n "", ""\n 150.06 Courtesy\n "", ""\n 150.07 Compliance with Lawful Orders\n "", ""\n 150.08 Use of Intoxicants\n "", ""\n 150.09 Attention to Duty\n "", ""\n 150.10 Financial Obligations\n "", ""\n 150.11 Outside Employment\n "", ""\n 150.12 Employee Grievances\n "", ""\n 150.13 Commendations\n "", ""\n 150.14 Discipline\n "", ""\n 160.01 General Provisions\n "", ""\n 160.02 Individual Dignity\n "", ""\n 160.03 Role of the Individual Officer\n "", ""\n 160.04 Equality of Enforcement\n "", ""\n 160.05 Responsiveness to the Community\n "", ""\n 160.06 Openness of Operation\n "", ""\n 160.07 Interpersonal Communication\n "", ""\n 160.08 Training in Human and Community Relations\n "", ""\n 170.00 Discretion\n "", ""\n 170.01 Police Action Based on Legal Justification\n "", ""\n 170.02 Alternatives to Arrest\n "", ""\n 180.11 On-Duty, Within City, Fully Responsible\n "", ""\n 180.12 On-Duty, Outside of City, Fully Responsible\n "", ""\n 180.20 Off-Duty, Within City, Fully Responsible\n "", ""\n 180.21 Off-Duty, Outside of City, Limited Police Authority\n "", ""\n 180.30 No Peace Officer Authority Outside State\n "", ""\n 180.40 Duty Status\n "", ""\n 180.50 Injured On Duty\n "", ""\n 190.01 Traffic Enforcement Objective\n "", ""\n 190.02 Violator Contact\n "", ""\n 190.03 Non-Resident Violators\n "", ""\n 190.04 Enforcement of Parking Regulations\n "", ""\n 190.05 Strategic Traffic Enforcement\n "", ""\n 190.06 Visible and Covert Patrol\n "", ""\n 190.07 Crash Investigation\n "", ""\n 191.00 Vice Enforcement and Organized Crime Suppression\n "", ""\n 192.00 Narcotic Enforcement\n "", ""\n 193.00 Administration\n "", ""\n 193.01 Command Responsibility\n "", ""\n 193.02 Transfer of Command\n "", ""\n 193.03 Command Concerns for Welfare\n "", ""\n 193.04 Community Liaison by Unit Heads\n "", ""\n 193.05 Planning Responsibility \n "", ""\n 193.08 Completed Staff Work\n "", ""\n 193.09 Department Directives\n "", ""\n 193.10 Administration of Discipline\n "", ""\n 193.11 Organizational Principles\n "", ""\n 193.13 Inspection and Control\n "", ""\n 193.14 Personnel\n "", ""\n 193.15 Training\n "", ""\n 193.16 Civilian Employees\n "", ""\n 193.17 Budgeting\n "", ""\n 193.18 Supervision \n "", ""\n 193.19 Field Supervision\n "", ""\n 193.20 Authority Commensurate with Responsibility\n "", ""\n Contact The City\n "", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[] -913,https://coloradosprings.gov/police-department/article/news/motorcycle-driver-fatal-accident,Media Bulletins,200,Motorcycle Driver of Fatal Accident Identified | City of Colorado Springs,"","[""\nMotorcycle Driver of Fatal Accident Identified\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -914,https://dccouncil.gov/judiciary-public-safety/copy-of-ag0_fy_2019-schedule-a-1/,Not Criminal Justice Related,200,Copy of AG0_FY_2019 Schedule A-1 • Council of the District of Columbia,"","[""Copy of AG0_FY_2019 Schedule A-1""]",[],[],[],[],[] -915,https://hilliardohio.gov/hilliard-schools-and-police-collaborate-with-attorney-general-to-prevent-school-violence/,Media Bulletins,200,Hilliard Schools and Police Collaborate with Attorney General to Prevent School Violence - City of Hilliard,Hilliard City Schools and Hilliard Division of Police joined Ohio Attorney General Dave Yost Wednesday in announcing new curriculum tools that can help,"[""News"", ""Hilliard Schools and Police Collaborate with Attorney General to Prevent School Violence""]",[],[],"[""Recent Articles"", ""Hilliard Newsletter"", ""City Hall and Admin"", ""Hilliard Mayor's Court"", ""Division of Police"", ""Police Assistance"", ""Police Records and General Assistance"", ""Norwich Township Fire"", ""Hilliard Recreation & Parks"", ""Hilliard Newsletter"", ""Quick Links"", ""Stay connected with us""]",[],"[""Click the \u2018x\u2019 to opt out.""]" -916,https://spdblotter.seattle.gov/2019/08/13/police-investigating-after-woman-pepper-sprays-employee-at-university-district-store/,Media Bulletins,200,Police Investigating After Woman Pepper Sprays Employee at University District Store - SPD Blotter,"","[""Police Investigating After Woman Pepper Sprays Employee at University District Store""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -917,https://www.huntsvilleal.gov/videos/never-forgotten-huntsville-police-remembers-fallen-officers/,Poor Data Source,200,Never Forgotten: Huntsville Police remembers fallen officers - City of Huntsville,"","[""Never Forgotten: Huntsville Police remembers fallen officers""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],[],[],[] -918,https://northbrunswicknj.gov/programs_and_service/obtain-a-police-incident-report/,Resources,200,Obtain a Police Incident Report - Township of North Brunswick,"","[""Obtain a Police Incident Report""]",[],[],"[""Police Records Bureau""]","[""Department Page""]",[] -919,https://www.pullman-wa.gov/government/departments/police_department/news___statistics/national_public_safety_telecommunicators_week_2022,Media Bulletins,404,"","",,,,,, -920,https://www.huntsvilleal.gov/videos/huntsville-police-honor-fallen-officers-with-remembrance-ceremony/,Poor Data Source,200,Huntsville Police Honor Fallen Officers with Remembrance Ceremony - City of Huntsville,"","[""Huntsville Police Honor Fallen Officers with Remembrance Ceremony""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],[],[],[] -921,https://champaignil.gov/2012/04/25/police-investigate-shooting-clock-st-bellefontaine-st/,Media Bulletins,200,Police Investigate Shooting (Clock St./Bellefontaine St.) - City of Champaign,"","[""Police Investigate Shooting (Clock St./Bellefontaine St.)""]","[""News Releases"", ""Department News""]",[],[],[],[] -922,https://www.coppelltx.gov/916/interlibrary-loan,Not Criminal Justice Related,200,"InterLibrary Loan | Coppell, TX",Interlibrary loan is a service that provides access to library materials that are not available at this library. ,"[""\r\n\r\nInterLibrary Loan\t\t""]",[],"[""Loading""]",[],[],[] -923,https://www.southamptontownnypolice.gov/bids.aspx,Poor Data Source,200,"Bid Postings • Southampton, NY • CivicEngage","",[],[],"[""Loading"", ""Site Tools"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -924,https://www.coppelltx.gov/389/crime-prevention,Resources,200,"Crime Prevention | Coppell, TX",Access information on how to protect yourself and your community from crime.,"[""\r\n\r\nCrime Prevention\t\t""]",[],"[""Loading"", ""Quick Links""]","[""\nComputer Crime\n"", ""\nCredit Card Fraud\n"", ""\nCurfew Hours for Minors\n"", ""\nDrugs: Shatter the Myths (PDF)\n"", ""\nFraud Crimes & Identity Theft FAQs\n"", ""\nHelpful Links\n"", ""\nOperation Secure Car\n"", ""\nFentanyl Resources\n""]",[],[] -925,https://www.giddingspolice-tx.us/join-the-force,Training & Hiring Info,200,Join the Force | Giddings Police Department,"","[""APPLY NOW""]","[""ADDITIONAL LINKS""]",[],[],[],[] -926,https://delcopa.gov/council/2021minutes/040721minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -927,https://icjia.illinois.gov/about/publications/community-policing-accountability-in-management-in-the-chicago-police-department/,Policies & Contracts,200,ICJIA | Illinois Criminal Justice Information Authority,Illinois Criminal Justice Information Authority,[],[],[],[],[],[] -928,https://dps.georgia.gov/job-vacancy-announcement-georgia-capitol-police-officer-5,Media Bulletins,200,Job Vacancy Announcement-Georgia Capitol Police Officer | Georgia Department of Public Safety,Job Vacancy Announcement-Georgia Capitol Police Officer ,"[""\n Job Vacancy Announcement-Georgia Capitol Police Officer \n \n ""]","[""Main navigation"", ""Search this site"", ""Breadcrumb"", ""How can we help?"", ""About Us"", ""Get in Touch""]","[""Popular searches"", ""Call Us"", ""Visit"", ""Mail"", ""Hours""]",[],[],[] -929,https://ose.louisiana.gov/event/police-officer-first-class-11/,Training & Hiring Info,200,Police Officer First Class | Louisiana Office of State Examiner,"","["""", ""Police Officer First Class""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -930,https://www.bristolri.gov/departments/police/police-branches/honor-guard/,Poor Data Source,404,"","",,,,,, -931,https://police.greenvillesc.gov/424/explore-downtown,Not Criminal Justice Related,200,"Downtown Greenville | Greenville, SC - Official Website",Downtown Greenville has become a favorite destination for upstate diners and shoppers who want to experience a unique variety of dining experiences unmatched in the region. ,"[""\r\n\r\nDowntown Greenville\t\t""]","[""Find Parking Downtown"", ""Falls Park on the Reedy"", ""THE GREENVILLE STORY""]","[""Loading"", ""Downtown Map & Directory: Click to View""]",[],[],[] -932,http://lafayettepolice.us/595/business-owners,Not Criminal Justice Related,200,"Business Owners | Lafayette, IN - Official Website",Our fire inspectors have the responsibility to inspect existing businesses on a frequent basis to insure the building meets minimum fire and life safety requirements.,"[""\r\n\r\nBusiness Owners\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -933,https://delcopa.gov/vote/pdf/2020/pollworkers/howtovotewiththescannerposter.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -934,https://columbiacitypolice.us/photogallary.html,Poor Data Source,200, Columbia City Police Department:Home ,"","[""Photo Gallery""]",[],[],"[""Quick Links""]",[],[] -935,https://www.mass.gov/doc/david-casey-v-town-of-natick-police-department/download,Court Cases,200,"","",[],[],[],[],[],[] -936,http://www.ryepolice.us/announcements/rye-public-safety-building-open-house,Not Criminal Justice Related,200,Rye Police Department Rye Public Safety Building Open House - Rye Police Department,"","[""Rye Public Safety Building Open House""]","[""Rye Public Safety Building Open House""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -937,http://www.longbeach.gov/police/press-releases/missing-child-found/,Media Bulletins,200,MISSING CHILD FOUND,"","[""Long BeachPolice Department""]",[],[],[],[],[] -938,https://coloradosprings.gov/police-department/article/news/drug-take-back-april-24th-2021,Media Bulletins,200,Drug Take Back April 24th 2021 | City of Colorado Springs,"","[""\nDrug Take Back April 24th 2021\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -939,https://alpha.austin.gov/en/police-oversight/2020-06-08-4/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -940,https://unioncitypa.us/police/uc-police-employment-application-2022/,Training & Hiring Info,200,"UC Police Employment Application 2022 | Union City, Pennsylvania",Download Application Packet,"[""UC Police Employment Application 2022""]",[],"[""Recent News"", ""Categories"", ""Categories"", ""Recent News""]","[""admin""]",[],[] -941,https://www.ci.northville.mi.us/services/police_department/service_fees,Policies & Contracts,200," - Fee schedule - City of Northville, MI -","","[""Fee schedule""]",[],[],[],[],[] -942,https://rockymountnc.gov/police/,Contact Info & Agency Meta,200,Police | Rocky Mount NC,"","[""Police Department""]","[""Robert Hassell""]","[""City raises starting salary for police officers to $60,000 annually""]","[""Police Department Menu""]",[],[] -943,https://ci.piedmont.ca.us/services___departments/police/transparency_portal/department_policies,Poor Data Source,200," - Department Policies - City of Piedmont -","","[""\r\n City of\r\n Piedmont""]",[],[],[],[],[] -944,http://www.longbeach.gov/police/press-releases/murder-investigation3/,Media Bulletins,200,Murder Investigation,"","[""Long BeachPolice Department""]",[],[],[],[],[] -945,https://champaignil.gov/2013/12/04/champaign-police-make-arrest-in-roper-street-homicide/,Media Bulletins,200,Champaign Police Make Arrest in Roper Street Homicide - City of Champaign,"","[""Champaign Police Make Arrest in Roper Street Homicide""]","[""News Releases"", ""Department News""]",[],[],[],[] -946,http://www.longbeach.gov/police/press-releases/don-t-spend-the-holidays-in-jail--drive-safely-or-get-pulled-over/,Media Bulletins,200,DON'T SPEND THE HOLIDAYS IN JAIL; DRIVE SAFELY OR GET PULLED OVER,"","[""Long BeachPolice Department""]",[],[],[],[],[] -947,https://portorchardwa.gov/press-releases/pr-22-003-police-investigate-shooting-related-to-stolen-vehicle/,Media Bulletins,200,PR 22-003 - Police Investigate Shooting Related to Stolen Vehicle - Port Orchard,"","[""PR 22-003 \u2013 Police Investigate Shooting Related to Stolen Vehicle""]","[""Primary menu links"", ""Action toolbar"", ""Contact"", ""Subscribe"", ""Connect""]",[],[],[],[] -948,http://www.ryepolice.us/wp-content/uploads/harbor-rd-closure.png,Poor Data Source,200,"","",[],[],[],[],[],[] -949,https://police.greenvillesc.gov/736/heritage-green,Not Criminal Justice Related,200,"Heritage Green | Greenville, SC - Official Website","Nestled in the heart of downtown Greenville, South Carolina, Heritage Green is urban arts and cultural campus. Heritage Green is located on College Street, just past Academy Street, three blocks from the Hyatt Regency.","[""\r\n\r\nHeritage Green\t\t""]",[],"[""Loading""]",[],[],[] -950,https://delcopa.gov/publicrelations/releases/2019/emergencypreparedness.html,Not Criminal Justice Related,200,"September Recognized as National Emergency Preparedness Month - Delaware County, Pennsylvania","","[""September Recognized as National Emergency Preparedness Month""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Delco residents urged to take steps to prepare for a disaster or emergency""]",[],[] -951,http://www.lafayettepolice.us/1798/accessibility,Not Criminal Justice Related,200,"Accessibility | Lafayette, IN - Official Website","","[""\r\n\r\nAccessibility\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -952,https://www.lynchburgvapolice.gov/department-information/,Contact Info & Agency Meta,200,Department Information - Lynchburg Police Department,"","[""Department Information""]",[],"[""About the LPD"", ""Opportunities""]","[""Annual Budget"", ""Grants"", "" "", ""Training"", "" "", ""Officer Demographics"", ""Contact Us"", ""Site Links"", ""Site Links""]",[],"[""LPD Officers receive 880 hours of training in the police basic school. Each year, our officers complete more than 8,000 cumulative hours of training. This includes de-escalation training, firearms qualification, bias-free policing, Crisis Intervention Training, and more.\u00a0"", ""The LPD wants our officers to reflect the diverse fabric of our community. This remains an ongoing effort of the department."", ""\u00a0"", ""White Officers: 84%"", ""Black Officers: 12%"", ""Hispanic Officers: 4%"", ""Female Officers: 18%"", ""Male Officers: 82%"", ""\u00a0""]" -953,https://police.greenvillesc.gov/faq.aspx?qid=575,Not Criminal Justice Related,200,FAQs • Where can I park?,"",[],"[""\n\u25bc\r\nClemson MBA Fireworks on the Fourth\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -954,https://delcopa.gov/publicrelations/releases/2020/keepthecheerhere.html,Not Criminal Justice Related,200,"Delco Launches Keep the Cheer Here Social Media Campaign - Delaware County, Pennsylvania","","[""Delco Launches Keep the Cheer Here Social Media Campaign""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Residents encouraged to tag a local Delco business on social media and win a gift card!""]",[],[] -955,https://champaignil.gov/police/resources/bullying-prevention/,Resources,200,Bullying Prevention - City of Champaign,"","[""Bullying Prevention""]","[""Police Department"", ""Quick Links"", ""Police Department News"", ""Contact Us""]",[],"[""\n\n Types of Bullying Behavior\n \n"", ""\n\n What Bullying is Not\n \n"", ""\n\n Bullying - The Experience\n \n"", ""\n\n Responding to Bullying\n \n"", ""\n\n Addressing Bullying\n \n"", ""\n\n The Criminal Consequences of Bullying\n \n""]",[],[] -956,https://www.foxcrossingwi.gov/departments/police-department/resources/bullies/,Poor Data Source,200,Bullies - Fox Crossing Fox Crossing,"","["""", """", ""Bullies""]",[],[],[],[],[] -957,http://lafayettepolice.us/761/location-of-smoke-detectors,Not Criminal Justice Related,200,"Location of Smoke Detectors | Lafayette, IN - Official Website",Where should smoke detectors/alarms be located?,"[""\r\n\r\nLocation of Smoke Detectors\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -958,https://sf.gov/get-copy-confidential-marriage-certificate,Resources,200,Get a copy of a confidential marriage certificate | San Francisco,"If you had a confidential marriage in San Francisco, get a copy of your marriage certificate from the County Clerk.","[""Get a copy of a confidential marriage certificate""]","[""What to do"", ""Get help"", ""Footer menu"", ""Footer Bottom""]","[""1. Wait 4 weeks after the license has been returned for registration"", ""2. Prepare your payment"", ""3. Request a copy of your confidential marriage certificate"", ""In-Person"", ""Mail"", ""Office of the County Clerk"", ""Phone""]","["""", ""Departments""]",[],[] -959,https://www.mass.gov/doc/westfordpolicesergeant5443rtf/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -960,https://www.mass.gov/doc/chicopee-city-hall-april-2007-0/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -961,https://joinstatepolice.ny.gov/15-mile-run,Training & Hiring Info,200,1.5 Mile Run | Join the State Police,The candidate will run 6 laps on a 440-yard (1/4 mile) track to complete the 1.5-mile run as fast as possible.,"[""\n Join the State Police\n"", ""1.5 Mile Run\n""]","[""SHARE"", ""\n\n\n Overview\n \n \n "", ""\n\n\n Fitness Norms\n \n \n "", ""\n\n\n Stretching Basics\n \n \n "", ""\n\n\n Training\n \n \n "", ""\n\n\n Caution\n \n \n "", ""CONNECT WITH US""]","[""Translation Services""]",[],[],[] -962,https://estespark.colorado.gov/departments/police/operations-landing-page,Contact Info & Agency Meta,200,Operations- Landing Page | Town of Estes Park,"","[""\nOperations- Landing Page\n""]","[""Serving the Estes Park Community for Over 100 Years"", ""Branches of Operations"", ""Services""]","[""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\n"", ""\nLanguage Translation\n""]",[],[],[] -963,https://delcopa.gov/planning/pdf/mapping/brookhaven.pdf,Not Criminal Justice Related,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -964,https://www.mass.gov/doc/instructions-dcamm-scoping-form-for-maab-compliance/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -965,https://www.jacksontn.gov/government/departments/police/citizen_engagement/national_night_out,Misc Police Activity,404,"","",,,,,, -966,https://westplains.gov/first-annual-community-police-academy/,Poor Data Source,404,"","",,,,,, -967,https://chandlerazpd.gov/2011/02/police-need-help-identifying-burglary-and-fraud-suspects/,Media Bulletins,200,Police Need Help Identifying Burglary and Fraud Suspects – Chandler Police Department,"","[""Police Need Help Identifying Burglary and Fraud Suspects""]",[],"[""Quick Links"", ""News Archives"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n""]","[""\n\n\t\tFebruary 11, 2011\t\n"", "" Contact"", "" About the Department"", "" Latest News"", ""\n Courage, Pride, Dedication\n \n \u00a9 2024 Chandler Police Department \n""]",[],[] -968,https://www.southamptontownnypolice.gov/faq.aspx?qid=284,Not Criminal Justice Related,200,FAQs • What type of vital records are available from the Tow,"",[],"[""\n\u25bc\r\nTown Clerk - Records\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -969,https://www.sandiego.gov/department-document/san-diego-police-arrest-suspect-horton-plaza-homicide,Media Bulletins,200,San Diego Police Arrest Suspect in Horton Plaza Homicide | City of San Diego Official Website,"","[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""San Diego Police Arrest Suspect in Horton Plaza Homicide"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -970,https://www.providenceri.gov/police-city-officials-announce-progress-continued-efforts-related-illegal-vehicles/press-release-illegal-vehicles/,Poor Data Source,200,City of Providence Press-Release-illegal-vehicles - City of Providence,"","[""Press-Release-illegal-vehicles""]","[""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""SIGN UP FOR OUR WEEKLY E-NEWS | \nHaga clic aqu\u00ed para espa\u00f1ol"", ""Lists*""]",[],[],[] -971,https://delcopa.gov/publicrelations/releases/2019/emergencypreparedness.html,Not Criminal Justice Related,200,"September Recognized as National Emergency Preparedness Month - Delaware County, Pennsylvania","","[""September Recognized as National Emergency Preparedness Month""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Delco residents urged to take steps to prepare for a disaster or emergency""]",[],[] -972,https://beaumonttexas.gov/bpd-police-memorial-ceremony-thursday-may-19-2022-at-900-am/,Poor Data Source,404,"","",,,,,, -973,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-103-fitness-bonus-payment-fiscal-year-2007-08,Training & Hiring Info,200,State Police Bulletin No. SP-103 | Office of the New York State Comptroller,To notify the Division of State Police of the procedures for processing Fitness Bonus Payments,"[""\nState Police Bulletin No. SP-103\n"", "" ""]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Background"", ""Effective Date(s)"", ""Eligibility"", ""Agency Actions"", ""Deduction Information"", ""Undeliverable Checks"", ""Payroll Register and Employee\u2019s Paycheck/Advice"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[] -974,http://www.longbeach.gov/police/press-releases/two-cited-during-undercover-vice-operation/,Media Bulletins,200,TWO CITED DURING UNDERCOVER VICE OPERATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -975,https://www.jerseycitynj.gov/news/pressreleases20182017/jersey_city_police_department_reaches_record_numbe,Media Bulletins,200," - JCPD Reaches Record Numbers - City of Jersey City -","","[""Jersey City""]","[""JCPD Reaches Record Numbers""]",[],[],[],[] -976,https://delcopa.gov/publicrelations/releases/2019/pdf/youthmentalhealthfirstaiddec3.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -977,https://www.roseville.ca.us/government/departments/police_department/resources/crime___arrest_information/neighborhood_police_activity_digests,Poor Data Source,404,"","",,,,,, -978,https://delcopa.gov/council/index.html,Not Criminal Justice Related,200,"County Council - Delaware County, Pennsylvania","","[""County Council""]",[],"[""MEMBERS OF THE DELAWARE COUNTY COUNCIL"", ""Helpful County Council Links"", ""County Council Function"", ""County Council Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -979,https://www.waynesvillenc.gov/services/file-police-report,Contact Info & Agency Meta,200,"File a Police Report | The Town of Waynesville, NC","To file a police report, please call 828-456-5363 to arrange to have an officer meet you at the scene of the crime, or come into the Police Station at 9 South Main St and meet with an officer. Call 911 only for emergencies.","[""File a Police Report\n""]","[""Secondary navigation"", ""Main navigation"", ""Breadcrumb""]",[],"[""Contact Information"", ""Stay Connected""]",[],[] -980,https://sanramon.ca.gov/our_city/departments_and_divisions/police/divisions_and_units/youth_and_family/youth_resource_officer,Contact Info & Agency Meta,200," - Youth Resource Officer - City of San Ramon -","","[""Youth Resource Officer""]","[""Contact Us"", ""Youth Resource Officer"", ""Contact Us"", ""Useful Links""]",[],[],[],[] -981,https://www.mass.gov/locations/chicopee-retirement-system/locations,Not Criminal Justice Related,200,Locations | Mass.gov,"","[""\n Other locations related to Chicopee Retirement System\n ""]","[""""]",[],[],[],[] -982,https://martinsville.in.gov/departments-services/police-department/,Contact Info & Agency Meta,200,"Police Department | Martinsville, IN","It is the mission of the Martinsville Police Department to safeguard the lives and property of the people we serve, to reduce the incidence and fear of crime and to enhance public safety while working with our community to improve the quality of life.","[""\r\n\r\nPolice Department\t\t""]","[""Programs"", ""Services"", ""Golf Cart Inspections"", ""Connect with the Martinsville Police Department""]","[""Loading"", ""Curfew & Code Enforcement"", ""Operation Sheepdog"", ""Citizens Police Academy"", ""National Night out"", ""Coffee with a Cop"", ""Clothe a Child Project"", ""Dual Credit Partnership"", ""DARE Program"", ""Fraud Protection Presentations"", ""K9 Demonstrations for Students"", ""Free Home Safety Visits"", ""Vacation Watches"", ""Nuisance, Suspected Drug House"", ""Speed Trailer"", ""VIN Inspections"", ""Firearms License"", ""Parking Tickets"", ""Crash / Incident Reports"", ""Contact Us"", ""Hours"", ""Contact Us"", ""Quick Links"", ""Helpful Links""]","[""Police Department""]",[],[] -983,https://champaignil.gov/2020/10/22/champaign-police-seeking-armed-robbery-suspect/,Media Bulletins,200,Champaign Police Seeking Armed Robbery Suspect - City of Champaign,"","[""Champaign Police Seeking Armed Robbery Suspect""]","[""News Releases"", ""Department News""]",[],[],[],[] -984,https://alpha.austin.gov/en/police-oversight/formal-complaint-arrest-requirement-assaultive-offenses-and-other-policy-violations/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -985,https://camptonhills.illinois.gov/village-of-campton-hills-police-department/request-for-public-records-form/,Records Request Info,200,Request for Public Records Form – Village of Campton Hills,"",[],"[""Request for Public Records Form"", ""\u00a9 2024 All Rights Reserved Village of Campton Hills.""]",[],"[""Recognition"", ""Follow Us"", ""Important Links"", ""Contact Us""]",[],[] -986,https://southamptontownnypolice.gov/1000/adopted-studies,Not Criminal Justice Related,200,"Adopted Studies | Southampton, NY - Official Website","","[""\r\n\r\nAdopted Studies\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]","[""\nCommunity Preservation Plan (Adopted August 1998) \n"", ""\nDeer Protection & Mngmt Plan \n"", ""\nHousing Plan (CPF Referendum)\n"", ""\nSag Harbor Gateway Plan (Adopted Mar. 2009) (PDF)\n""]",[],[] -987,https://www.antioch.il.gov/wpfb-file/12-11-12-police-pension-agenda-pdf-4/,Media Bulletins,200,"12-11-12 Police Pension Agenda - Antioch, IL",13516 12 11 police pension agenda pdf commissions fund agendas 2012 1625758338 34a3f5b920003b78ea472a9fa24dae0a a7cc2c799489b8cddb7e99d7bd8c51436f44ae62c5f317b119f38278dad9de70 213x300 _jyolygdyi9gj thumb jpg 2017 05 17 08 41 32 0 40 77 167 2021 06 26 15 51 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17 pagefailed_18 pagefailed_19,"[""12-11-12 Police Pension Agenda""]",[],[],[],[],[] -988,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/040621blotter.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -989,https://delcopa.gov/courts/judges/scanlon.html,Poor Data Source,200,Judge Anthony D. Scanlon - Delaware County Court of Common Pleas,"","[""Judge Anthony D. Scanlon""]",[],"[""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[] -990,https://www.mass.gov/doc/opencompetitiveeducationandexperienceratingworksheetforpoliceofficerdoc/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -991,https://www.troyny.gov/troy-police-seek-publics-help-in-solving-double-homicide-case/,Poor Data Source,404,"","",,,,,, -992,https://www.sandyspringsgapolice.gov/apartment-safety-checker/,Resources,200,Apartment Safety Checker – Sandy Springs Police Department,"","[""Apartment Safety Checker""]",[],[],[],[],[] -993,http://www.lafayettepolice.us/782/recruitment,Training & Hiring Info,200,"Recruitment | Lafayette, IN - Official Website",Review the Lafayette Fire Department recruitment process so you know what to expect when the next opening comes around.,"[""\r\n\r\nRecruitment\t\t""]","[""Lafayette Fire Department Recruitment Process"", ""Application / Appointment Process""]","[""Loading"", ""Pre-Employment"", ""Contact Us"", ""Brian Alkire"", ""Fire Department"", ""Hours"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -994,https://coloradosprings.gov/police-department/page/meth-lab-cleanup,Poor Data Source,403,"","",,,,,, -995,https://training.detroitmi.gov/departments/police-department/detroit-police-department-office-civil-rights/definitions-consent-decree,Policies & Contracts,503,"","",,,,,, -996,http://police.portlandmaine.gov/676/design-manual-overhaul-2021,Not Criminal Justice Related,200,"Design Manual Overhaul 2021 | Portland, ME - Official Website",The Planning and Urban Development Department is reviewing and revising the City of Portland Design Manual. The Design Manual regulations apply to Site Plan applications in certain zones and are in addition to the zoning requirements.,"[""Design Manual Overhaul 2021""]",[],[],[],[],[] -997,https://www.antioch.il.gov/event/police-pension-board-special-meeting-2/,Poor Data Source,200,"Police Pension Board Special Meeting - Antioch, IL","","[""Police Pension Board Special Meeting""]",[],[],[],[],[] -998,https://detroitmi.gov/bn/departments/paulaisa-baibhaaga/detroit-police-department-shield-program/paraogaraama-ebam-saebaa,Poor Data Source,200,প্রোগ্রাম এবং সেবা | City of Detroit,"DPD SHIELD প্রোগ্রামটি বিভিন্ন শ্রোতাদের আলিঙ্গন করার জন্য ডিজাইন করা হয়েছে যেমন নিরাপত্তা পরিচালক, নিরাপত্তা ব্যবস্থাপক, সম্প্রদায়ের নেতা, ব্যবসায়িক নির্বাহী, ব্যবসার মালিক, শিক্ষাবিদ, বিশ্বাস-ভিত্তিক সম্প্রদায় এবং অন্যান্য যাদের নিজ নিজ কর্মীদের নিরাপত্তা নিশ্চিত করার দায়িত্ব রয়েছে। ব্যবসা বা প্রতিষ্ঠান। একটি সফল প্রোগ্রামের চাবিকাঠি এবং সেইসাথে আমাদের সম্প্রদায়গুলিকে সুরক্ষিত করা হল তথ্যের পারস্পরিক প্রবাহকে উত্সাহিত করা। DPD SHIELD প্রোগ্রাম তার অংশীদারদের অবগত এবং স্থিতিস্থাপক রাখতে গুরুত্বপূর্ণ সংস্থান এবং প্রশিক্ষণ প্রদান করে।","[""\n\u09aa\u09cd\u09b0\u09cb\u0997\u09cd\u09b0\u09be\u09ae \u098f\u09ac\u0982 \u09b8\u09c7\u09ac\u09be\n""]","[""Top Links"", ""Site Menu"", ""\n\u09a1\u09c7\u099f\u09cd\u09b0\u09af\u09bc\u09c7\u099f \u09aa\u09c1\u09b2\u09bf\u09b6 \u09b6\u09bf\u09b2\u09cd\u09a1 FAQs\n\n""]",[],"[""\u09aa\u09b0\u09bf\u099a\u09bf\u09a4\u09bf"", ""\u09a1\u09bf\u09aa\u09be\u09b0\u09cd\u099f\u09ae\u09c7\u09a8\u09cd\u099f \u09ae\u09c7\u09a8\u09c1""]",[],[] -999,https://www.newarknj.gov/news/mayor-barak-and-public-safety-director-ambrose-release-details-on-stepped-up-police-presence-for-new-years-eve,Media Bulletins,200,News: Mayor Baraka and Public Safety Director Ambrose Release Details on Stepped up Police Presence for New Year's Eve,"Official Page of Newark, NJ News: Mayor Baraka and Public Safety Director Ambrose Release Details on Stepped up Police Presence for New Year's Eve","[""City of"", ""NEWARK"", ""January 2, 2017"", ""Mayor Baraka and Public Safety Director Ambrose Release Details on Stepped up Police Presence for New Year's Eve "", ""City of"", ""NEWARK""]","[""News"", ""Mayor Ras j baraka""]",[],[],[],[] -1000,https://www.huntsvilleal.gov/city-calendar-event/deadline-apply-58th-session-huntsville-police-academy/,Training & Hiring Info,200,Deadline to Apply for 58th Session of Huntsville Police Academy - City of Huntsville,"","[""Deadline to Apply for 58th Session of Huntsville Police Academy""]","[""Event Details:"", ""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]","[""Huntsville Police Academy""]",[],[],[] -1001,https://champaignil.gov/2022/05/19/police-department-hosts-employee-awards-ceremony/,Not Criminal Justice Related,200,Police Department Hosts Employee Awards Ceremony - City of Champaign,"","[""Police Department Hosts Employee Awards Ceremony""]","[""News Releases"", ""Department News""]",[],[],[],[] -1002,https://www.antiochca.gov/police/animal-services/animal-services-faqs/,Poor Data Source,200,"Animal Services FAQs – City of Antioch, California","",[],"[""Animal Services"", ""Related Links"", ""Contact Info""]","[""Animal Services FAQs""]","[""\nSend Message\n""]","[""Joe Vigil"", ""Acting Chief of Police"", ""Catriona Cottle"", ""Acting Animal Services Manager""]",[] -1003,http://police.portlandmaine.gov/449/contact-us,Contact Info & Agency Meta,200,"Contact Us | Portland, ME - Official Website","Discover contact information for the Parks, Recreation, and Facilities Department.","[""Contact Us""]",[],[],[],[],[] -1004,https://hollister.ca.gov/government/city-departments/police/comments/,Contact Info & Agency Meta,200,"Comments – City of Hollister, California","",[],[],"[""Follow Us on..."", ""Hollister Police Comments / Feedback"", ""We are Hiring"", ""Follow Us on....""]","[""Commendations / Complaints""]",[],[] -1005,https://delcopa.gov/employment/jobpostings/clerktypist2_childrenservices.html,Not Criminal Justice Related,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1006,https://newtownohio.gov/police/department-news/,Media Bulletins,200,"Department News - Newtown, Ohio","","[""Newtown, Ohio"", ""Police Department News""]",[],"[""Police Department""]",[],[],[] -1007,https://www.stpaul.gov/departments/police/projects,Not Criminal Justice Related,200,Projects | Saint Paul Minnesota,Overview The following items highlight special programs that are of interest to the community. Blueprint for Safety Juvenile Drug Testing Parent Educationa,"[""\nProjects\n""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Overview"", ""IL3CP concentration on curfew and community"", ""Footer""]","[""\n You are using an unsupported browser. Please use Microsoft Edge.\n "", ""\n Contact The City\n "", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[] -1008,https://www.coppelltx.gov/faq.aspx?qid=396,Not Criminal Justice Related,200,FAQs • Do I need to register for an account if I don’t pay m,"",[],"[""\n\u25bc\r\nCitizen Self Service Utility Payment Portal\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -1009,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/062121blotter.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -1010,https://www.southamptontownnypolice.gov/1696/2022-wqip---applications-proposal-summar,Not Criminal Justice Related,200,"2022 WQIP - Applications & Proposal Summaries | Southampton, NY - Official Website","","[""\r\n\r\n2022 WQIP - Applications & Proposal Summaries\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]","[""\r\n\t\t\t\t\tOld Town Pond Watershed Bioswales (SH Village)\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tPhillips Pond Watershed Bioswales (SH Village)\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tWickapogue Pond Watershed Bioswales (SH Village)\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tLake Agawam Stormwater - Trustees\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tArmin and Judy\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tCalissa Restaurant\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tPeconic Land Trust Bridge Gardens\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tQuogue Wildlife Refuge Constructed Wetland\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tRiverside Sewer System\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tSag Harbor - Sewer Expansion (Sewersheds K & L)\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tHarbour House (Library Avenue Owners Corp.)\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tLake Agawam Algae Harvesting Phase - (SH Village)\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tMecox Bay Inlet - Trustees\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tOld Town Pond Dredging (SH Village)\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tSagaponack Pond Aquatic Habitat Restoration - Trustees\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tEmma Elliston Park - Rain Gardens (SH Town)\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tLake Agawam- Injection Well PRB (SH Village)\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tPoxabogue Pond-Groundwater Seepage and Nutrient Input\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tWest Main Street Bioswale (SH Village)\r\n\t\t\t\t""]",[],[] -1011,https://www.mass.gov/doc/municipal-police-training-committee-mptc-meeting-minutes-042022/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -1012,https://delcopa.gov/publicrelations/releases/2019/mumps.html,Not Criminal Justice Related,200,"Delaware County Provides Update on Recent Outbreak of Mumps - Delaware County, Pennsylvania","","[""Delaware County Provides Update on Recent Outbreak of Mumps""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Senior Medial Advisor urges residents to get vaccinated""]",[],[] -1013,https://port-orange.us/2014/11/18/vehicle-break-ins-rise-port-orange-police-warn-residents/,Media Bulletins,-1,"","",,,,,, -1014,https://delcopa.gov/courts/judges/capuzzi.html,Poor Data Source,200,"Judge John P. Capuzzi, Sr - Delaware County Court of Common Pleas","","[""Judge John P. Capuzzi, Sr""]",[],"[""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[] -1015,https://www.mass.gov/doc/monteiro-lencol-v-boston-police-department-101614/download,Court Cases,200,"","",[],[],[],[],[],[] -1016,http://www.lafayettepolice.us/321/landlordowner-information,Not Criminal Justice Related,200,"Owner Information | Lafayette, IN - Official Website",The Housing Authority pays the landlord directly each month on behalf of the participant. ,"[""\r\n\r\nOwner Information\t\t""]","[""\n\nMichelle Reynolds \n""]","[""Loading"", ""Contact Us"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1017,https://delcopa.gov/electionsbureau/absenteevoting.html,Not Criminal Justice Related,200,Untitled Document,"",[],[],[],[],[],[] -1018,https://coloradosprings.gov/police-department/article/news/traffic-fatality-s-chelton-road-and,Media Bulletins,200,Traffic Fatality S. Chelton Road and Zebulon Drive | City of Colorado Springs,"","[""\nTraffic Fatality S. Chelton Road and Zebulon Drive\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -1019,https://strafford.nh.gov/event/police-chief-search-committee-3/,Training & Hiring Info,200,Police Chief Search Committee | Town of Strafford NH,"","[""Police Chief Search Committee""]","[""PRESIDENTIAL PRIMARY ELECTION - TUESDAY, JANUARY 23RD - TOWN HALL - POLLS OPEN 8AM-7PM"", ""November 22, 2022 @ 5:30 pm"", "" Details ""]","[""STRAFFORD NH MAP"", ""STRAFFORD TOWN HALL""]",[],[],[] -1020,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/050321blotter.pdf,Daily Activity Logs,200,"","",[],[],[],[],[],[] -1021,https://delcopa.gov/controller/pdf/retirement/2018/0523retirementboardminutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1022,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/060421blotter.pdf,Dispatch Recordings,200,"","",[],[],[],[],[],[] -1023,https://www.knoxvilletn.gov/government/mayors_office/c_o_v_i_d-19___coronavirus_/stress_and_coping/knox_well/general_adult_resources/kid___parent_resources,Not Criminal Justice Related,200," - Kid & Parent Resources - City of Knoxville -",nothing*,"[""Kid & Parent Resources""]",[],[],[],[],[] -1024,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/060521summary.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -1025,https://southcoffeyvilleok.gov/police-department/city-hall-south-coffeyville/,Not Criminal Justice Related,200," -City Hall South Coffeyville Oklahoma -","",[],"[""\n City Hall South Coffeyville Oklahoma ""]","[""Contact Town of South Coffeyville"", """"]",[],[],[] -1026,https://champaignil.gov/2017/12/22/police-investigate-shooting-2400-block-n-neil-street/,Media Bulletins,200,Police Investigate Shooting - 2400 Block of N. Neil Street - City of Champaign,"","[""Police Investigate Shooting \u2013 2400 Block of N. Neil Street""]","[""News Releases"", ""Department News""]",[],[],[],[] -1027,http://police.portlandmaine.gov/279/general-assistance-reports,Poor Data Source,404,"","",,,,,, -1028,https://sheriff.berkeleycountysc.gov/community/citizen-police-academy/,Training & Hiring Info,200,Citizen Police Academy – Berkeley County Sheriff's Office,"",[],"[""Citizen Police Academy""]",[],[],[],[] -1029,https://www.sandiego.gov/department-document/copy-sublease-3,Not Criminal Justice Related,404,"","",,,,,, -1030,https://www.hayward-ca.gov/discover/news/apr21/police-blotter-april-4-10-2021-0,Crime Maps & Reports,200,"Police Blotter: April 4-10, 2021 | City of Hayward - Official website","STATISTICAL HIGHLIGHTSApril 4-10, 2021 Weekly Arrests (Includes cite/released):61 Homicide 0Weekly Calls for Service: 2,064 Assault—Great Bodily Injury 3Weekly Reports Taken:224 Burglary— Nonresidential 1Weekly Complaints(against HPD):0 Burglary—Residential 1Weekly Calls Received:6,023 Theft 26This data is subject to change and based on crimes that were reported to have","[""Police Blotter: April 4-10, 2021""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form""]",[],"[""STATISTICAL HIGHLIGHTS"", ""April 4-10, 2021"", ""\u00a0"", ""\u00a0"", ""\u00a0 \u00a0\u00a0"", ""Significant Incidents"", ""Re-CAP: Hayward\u2019s Updated Climate Action Plan (CAP)"", ""Try induction cooking for free through Ava Community Energy\u2019s Induction Cooktop Lending Program!"", ""The City of Hayward\u2019s Fight Against Food Waste"", ""Decoding Plastic Recycling In California"", ""Keep Hayward Clean and Green with Adopt-A-Block!"", ""City Hall and Nonessential Services Closures: Monday, Feb 12 and Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""Library Closure January 15, 2024"", ""Library Closure: December 23 2023 - January 1 2024"", ""Library closure: November 23 - November 26, 2023."", ""YOU ARE HERE.SO IS EVERYTHING ELSE."", ""Related News"", ""Police Blotter: December 3-9, 2023"", ""Police Blotter - November 26-December 2, 2023"", ""Police Blotter - November 19-25, 2023"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -1031,https://ose.louisiana.gov/event/police-communications-officer-57/,Poor Data Source,200,Police Communications Officer | Louisiana Office of State Examiner,"","["""", ""Police Communications Officer""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -1032,https://www.southamptontownnypolice.gov/466/emergency-notifications,Not Criminal Justice Related,200,"Emergency Notifications Systems | Southampton, NY - Official Website","","[""\r\n\r\nEmergency Notifications Systems\t\t""]","[""Facebook & Twitter"", ""Southampton Town Emergency Management""]","[""Loading"", ""Site Tools"", ""Contact Us"", ""Ryan Murphy"", ""Code Enforcement"", ""Emergency Management Team"", ""Contact Us"", ""Site Links""]",[],[],[] -1033,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-34-2000-holiday-bonus-pay,Media Bulletins,200,State Police Bulletin No. SP-34 | Office of the New York State Comptroller,To provide agency procedures for processing the payment,"[""\nState Police Bulletin No. SP-34\n"", "" ""]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Effective Date"", ""Background"", ""Payment Amount and Eligibility Criteria"", ""Processing Instructions"", ""Additional Taxes"", ""Payroll Register and Employee's Check Stub"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[] -1034,http://www.longbeach.gov/police/press-releases/dui-enforcement-operation-1-/,Media Bulletins,200,DUI ENFORCEMENT OPERATION(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1035,https://pharr-tx.gov/individual-arrested-by-pharr-police-dies-at-hospital/,Media Bulletins,200,Individual arrested by Pharr police dies at hospital – City of Pharr,"","[""Individual arrested by Pharr police dies at hospital""]","["""", ""Individual arrested by Pharr police\u00a0dies at hospital""]",[],[],[],[] -1036,http://www.longbeach.gov/police/press-releases/fireworks-seized/,Media Bulletins,200,FIREWORKS SEIZED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1037,https://www.minneapolismn.gov/government/programs-initiatives/police-explorers/police-explorer-form/,Resources,200,Police Explorer Form - City of Minneapolis,You can complete this form to tell us you are interested in becoming an Explorer. ,"[""Police Explorer form"", ""Need help? We're here for you.""]","[""What to do"", ""Police Explorer Form"", ""Contact us""]","[""\n Request accessible format\r\n "", ""Police Explorer Advisors""]",[],[],[] -1038,https://www.antiochca.gov/police/child-safety-programs-events/,Misc Police Activity,200,"Child Safety – City of Antioch, California","",[],"[""Contact Info""]","[""Child Safety Programs and Events""]","[""\nSend Message\n""]","[""Joe Vigil"", ""Acting Chief of Police"", ""Captain Morefield"", ""Field Services"", ""Lt. Mellone"", ""Professional Standards""]",[] -1039,https://delcopa.gov/purchasing/bidsprops/delcomicrowavekmz.zip,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1040,https://www.lynchburgvapolice.gov/news-updates/crime-of-the-week-may-18-2021/,Media Bulletins,200,"Crime of the Week - May 18, 2021 - Lynchburg Police Department","","[""Crime of the Week \u2013 May 18, 2021""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[] -1041,https://champaignil.gov/2015/04/21/2014-police-department-employee-awards/,Misc Police Activity,200,2014 Police Department Employee Awards - City of Champaign,"","[""2014 Police Department Employee Awards""]","[""News Releases"", ""Department News""]",[],[],[],[] -1042,https://www.sandiego.gov/department-document/sdpd-investigate-attempted-murder-police-officer-jamacha-lolita,Media Bulletins,200,SDPD Investigate Attempted Murder Of Police Officer In Jamacha Lolita | City of San Diego Official Website,"","[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""SDPD Investigate Attempted Murder Of Police Officer In Jamacha Lolita"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -1043,https://southamptontownnypolice.gov/faq.aspx?qid=257,Not Criminal Justice Related,200,FAQs • Can I board my dog or cat at the shelter?,"",[],"[""\n\u25bc\r\nPublic Safety - Animal Shelter\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1044,https://www.hayward-ca.gov/discover/news/may21/police-blotter-may-16-22-2021,Crime Maps & Reports,200,"Police Blotter: May 16-22, 2021 | City of Hayward - Official website","STATISTICAL HIGHLIGHTSMay 16 - 22, 2021 Weekly Arrests (Includes cite/released):45 Homicide 0Weekly Calls for Service: 1,960 Assault—Great Bodily Injury 0Weekly Reports Taken:204 Burglary— Nonresidential 4Weekly Complaints(against HPD):0 Burglary—Residential 2Weekly Calls Received:5,418 Theft 29This data is subject to change and based on crimes that were reported to have","[""Police Blotter: May 16-22, 2021""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form""]",[],"[""STATISTICAL HIGHLIGHTS"", ""May 16 - 22, 2021"", ""\u00a0"", ""\u00a0"", ""\u00a0 \u00a0\u00a0"", ""Significant Incidents"", ""Re-CAP: Hayward\u2019s Updated Climate Action Plan (CAP)"", ""Try induction cooking for free through Ava Community Energy\u2019s Induction Cooktop Lending Program!"", ""The City of Hayward\u2019s Fight Against Food Waste"", ""Decoding Plastic Recycling In California"", ""Keep Hayward Clean and Green with Adopt-A-Block!"", ""City Hall and Nonessential Services Closures: Monday, Feb 12 and Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""Library Closure January 15, 2024"", ""Library Closure: December 23 2023 - January 1 2024"", ""Library closure: November 23 - November 26, 2023."", ""YOU ARE HERE.SO IS EVERYTHING ELSE."", ""Related News"", ""Police Blotter: December 3-9, 2023"", ""Police Blotter - November 26-December 2, 2023"", ""Police Blotter - November 19-25, 2023"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -1045,https://www.lakewoodoh.gov/coffee-with-a-cop-set-for-friday-october-26th/,Misc Police Activity,200,"Coffee with a Cop set for Friday, October 26th | The City of Lakewood, Ohio","The Lakewood Police Department will host another ""Coffee With A Cop"" event on Friday, October 26, 2018 from 8:00 a.m. to 10:00 a.m. at Dunkin Donuts, 17609","[""Coffee with a Cop set for Friday, October 26th""]",[],"[""Recent News"", ""Upcoming Events"", ""Most Popular Pages""]",[],[],[] -1046,https://rexburg.us/police-ask-for-help-finding-woman-who-went-missing-tuesday-in-juab-county/,Media Bulletins,522,"","",,,,,, -1047,https://www.minneapolismn.gov/government/programs-initiatives/community-safety/focus-areas/alternatives-police-response/new-pilot-response/,Policies & Contracts,200,Community Safety Work - City of Minneapolis,We're focusing on three key areas to improve community safety in our city.,"[""Community safety work"", ""Need help? We're here for you.""]","[""Overview"", ""Key areas"", ""Related links"", ""Community safety in different languages from 2021"", ""Contact us""]","[""Alternatives to police response"", ""Violence prevention"", ""Police policy reform"", ""Unarmed public safety responses"", ""Public health approach to violence"", ""Behavioral crisis response"", ""See language translation pages"", ""Alternatives to police response"", ""Police policy reform"", ""Community Safety Office""]","[""Learn more"", ""Learn more"", ""Learn more""]",[],[] -1048,https://www.minneapolismn.gov/government/departments/police/precincts/precinct-4/,Contact Info & Agency Meta,200,Precinct 4 - City of Minneapolis,The 4th precinct is headquarters for Patrol Officers and Precinct Investigations. The precinct also has a Community Response team and Community Crime Prevention unit.,"[""4th Precinct"", ""Need help? We're here for you.""]","[""4th Precinct"", ""Access to police services"", ""Contact us""]","[""4th\u00a0Precinct""]",[],[],[] -1049,https://sanfordfl.gov/government/police/,Contact Info & Agency Meta,200,"Police | Sanford, FL","It is the mission of the Sanford Police Department to enhance the quality of life in our city by working in partnership with the community, to enforce the laws, preserve the peace, reduce fear, and provide a safe environment.","[""\n\t\t\t\t\t\t\t\tPolice\t\t\t\t\t\t\t""]","[""Accreditation\n""]","[""Message from the Chief""]","[""Connect With Us"", ""Most Requested"", ""Explore"", ""Stay Connected"", ""City of Sanford, FL | The Friendly City""]",[],[] -1050,https://columbiacitypolice.us/documents/firearm responsibility.pdf,Resources,200,"","",[],[],[],[],[],[] -1051,https://santabarbaraca.gov/press-releases/magical-winter-wonderland-experience-deserving-families-hosted-santa-barbara-police,Not Criminal Justice Related,200,Magical Winter Wonderland Experience for Deserving Families hosted by the Santa Barbara Police Activities League | City of Santa Barbara,"The Santa Barbara Police Department and the Santa Barbara Police Activities League (PAL) would like to formally invite all members of the media to attend the 21st annual Winter Wonderland Event on Thursday, December 15, 2021. The event will be held between 6:00-8:00pm at the Carousel House located on Cabrillo Blvd.","[""Magical Winter Wonderland Experience for Deserving Families hosted by the Santa Barbara Police Activities League""]","[""Breadcrumb"", ""Contact"", ""This is the prefooter section"", ""Main Footer"", ""City Hall"", ""Mailing Address"", ""Newsletters""]",[],[],[],[] -1052,https://www.burienwa.gov/residents/public_safety/police/lead_program,Resources,200," - LEAD Program - City of Burien -","","[""City of Burien""]","[""LEAD Program""]",[],[],[],[] -1053,https://chandlerazpd.gov/2019/11/vehicle-burglary-crew-arrested-after-fleeing-from-police/,Media Bulletins,200,Vehicle Burglary Crew Arrested After Fleeing From Police – Chandler Police Department,"","[""Vehicle Burglary Crew Arrested After Fleeing From Police""]",[],"[""Quick Links"", ""News Archives"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n""]","[""\n\n\t\tNovember 12, 2019\t\n"", "" Contact"", "" About the Department"", "" Latest News"", ""\n Courage, Pride, Dedication\n \n \u00a9 2024 Chandler Police Department \n""]",[],[] -1054,https://www.southamptontownnypolice.gov/182/teen-assessment-project,Resources,200,"Teen Assessment Project | Southampton, NY - Official Website","The Teen Assessment Project (TAP) survey asks lifestyle questions of students in grades 8, 10, and 12.","[""\r\n\r\nTeen Assessment Project\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", """", ""Contact Us"", ""Site Links""]","[""TAP Reports""]",[],[] -1055,https://alpha.austin.gov/police-oversight/2020-08-17-2/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1056,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0021/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1057,https://rockfordil.gov/calendars/category/police-department/,Poor Data Source,404,"","",,,,,, -1058,https://delcopa.gov/council/2019minutes/121819minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1059,https://www.mass.gov/service-details/becoming-an-environmental-police-officer,Training & Hiring Info,200,Becoming an Environmental Police Officer | Mass.gov,"Learn about the duties and requirements, including exams, for environmental police officers.","[""\nBecoming an Environmental Police Officer\n""]","[""Duties\n "", ""Entrance Requirements\n "", ""Help Us Improve Mass.gov with your feedback""]","[""Additional Resources\n ""]",[],[],[] -1060,https://www.roundrocktexas.gov/wp-content/uploads/2021/12/recycling-wide-copy-1.jpg,Poor Data Source,404,"","",,,,,, -1061,https://www.huntsvilleal.gov/city-calendar-event/apply-to-be-a-huntsville-police-officer/,Training & Hiring Info,200,Apply to be a Huntsville Police Officer - City of Huntsville,"","[""Apply to be a Huntsville Police Officer""]","[""Event Details:"", ""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],[],[],[] -1062,https://coloradosprings.gov/police-department/page/cspd-salary-benefits,Resources,200,CSPD Salary & Benefits | City of Colorado Springs,"","[""\nCSPD Salary & Benefits\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]","[""Below is the monthly pay scale for each grade:\n\u00a0""]",[],"[""REPORT ONLINE""]",[] -1063,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0680/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1064,https://www.mass.gov/doc/municipal-police-training-committee-mptc-meeting-minutes-62119/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1065,https://delcopa.gov/courts/pdf/emergencyjudicialorders/presidentjudgeadministrativeorderfamilysectionoperationalandschedulingprotocols.pdf,Court Cases,200,"","",[],[],[],[],[],[] -1066,https://alpha.austin.gov/es/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/bwc-dmav-data-analysis-methodology/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1067,https://www.goldenbeach.us/documents/reso-1550-03-authorizing-the-donation-of-an-obsolete-police-vehicle-light-bar/,Not Criminal Justice Related,200,RESO 1550.03 authorizing the donation of an obsolete police vehicle light bar – Golden Beach: A Town Unlike Any Other,"",[],[],"[""About Golden Beach"", ""Phone Numbers"", ""Town Hall ""]","[""\n\nRESO 1550.03 authorizing the donation of an obsolete police vehicle light bar\n(45 kB)\n""]",[],[] -1068,https://www.doravillepolice.us/join-dpd/requirements/,Training & Hiring Info,200,Requirements | Doraville,"","[""Requirements"", ""Requirements""]",[],[],"[""REQUIREMENTS""]",[],[] -1069,http://www.longbeach.gov/police/press-releases/arrest-made-in-2-murder-cases/,Media Bulletins,200,ARREST MADE IN 2 MURDER CASES,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1070,https://www.mass.gov/doc/robert-dececcopdf/download,Poor Data Source,200,"","",[],[],[],[],[],[] -1071,https://delcopa.gov/recycle/paint.html,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1072,https://www.pinevillenc.gov/government/departments/police/services/,Resources,200,"Services - Town of Pineville, NC","","[""Services"", ""Police Services"", ""Town of Pineville Updates""]","[""Town of Pineville Police Services"", ""Overview"", ""Records"", ""Communications"", ""Criminal Investigations"", ""Patrol"", ""K9 Unit"", ""SRT"", ""Off-Duty Management"", ""Town of Pineville Contacts"", ""Important News & Updates"", ""Advisory Board Openings for Pineville Residents"", ""Pineville Community Meeting"", ""Property Tax Listings"", ""Follow Pineville on Facebook""]","[""ADVISE THE TELECOMMUNICATOR IF ANY WEAPONS ARE INVOLVED"", ""K-9 Max"", ""K-9 Gator"", ""Deployments"", ""Training and Requirements"", ""Off Duty Management provides the following to the customer:"", ""Rates"", ""Vehicle Rate-no charge"", ""Restrictions"", ""Emergency: Police, Fire & Rescue"", ""Non-Emergency:"", ""Town Hall Mailing Address:"", ""Town Hall Physical Address:"", ""Town Hall Office Hours:""]","[""What to do when calling 9-1-1"", ""Specify the kind of Emergency"", ""Location of the Incident"", ""Phone Number"", ""People Information"", ""Additional Circumstances"", ""LISTEN"", ""Hearing Impaired"", ""Non-English Speaking Citizens"", ""Tenemos int\u00e9rpretes a su disposici\u00f3n"", ""When to Call 9-1-1""]",[],[] -1073,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0800/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1074,https://www.coppelltx.gov/203/election-information,Not Criminal Justice Related,200,"Upcoming Election Information | Coppell, TX","Access information and resources regarding upcoming elections in Coppell, Texas.","[""\r\n\r\nUpcoming Election Information\t\t""]","[""Tuesday, March 5, 2024, Primary Election, 7 AM to 7 PM"", ""Saturday, May 4, 2024, Joint Election, 7 AM to 7 PM"", ""Voting Assistance for Special Needs""]","[""Loading"", ""Dallas County"", ""Denton County"", ""Important Dates:"", ""Future Elections"", ""Contact Us"", ""Quick Links"", ""Voter Resources"", ""Voter FAQs""]","[""City Secretary's Office""]",[],[] -1075,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/october-14-activity-report/,Incident Reports,200,October 14 Activity Report - Town of Cheswold,"","[""Cheswold""]","[""Delaware"", ""October 14 Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[] -1076,http://www.longbeach.gov/police/press-releases/$10000-reward-issued-in-fatal-hit---run-investigation/,Media Bulletins,200,$10000 REWARD ISSUED IN FATAL HIT & RUN INVESTIGATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1077,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/031522summary.pdf,Poor Data Source,404,"","",,,,,, -1078,http://www.lafayettepolice.us/faq.aspx?qid=168,Not Criminal Justice Related,200,FAQs • Where should smoke detectors/alarms be located?,"",[],"[""\n\u25bc\r\nSmoke Alarms & Detectors\t\t""]","[""Loading"", ""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1079,https://www.hayward-ca.gov/police-department/programs/hayward-eyes,Resources,200,Programs | City of Hayward - Official website,"","[""Active in the Community""]","[""Ambassador Program"", "" Business Watch Program"", ""Chabot College Partnership"", ""Community Academy"", ""Crime Free Multi-Housing Program"", ""False Alarm Reduction Program"", ""National Night Out "", ""Police Activities League (PAL)"", ""Neighborhood Alert Program"", ""Police Department Tours"", ""Reserve Officer Program "", ""Ride Along Program"", ""Stop Graffiti Rewards Program"", ""V.I.P.S. Program"", ""Youth Academy"", ""You are here. So is everything else."", ""Search form""]",[],"[""Receive crime bulletins and alerts"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -1080,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/may-17-activity-report/,Daily Activity Logs,200,May 17 Activity Report - Town of Cheswold,"","[""Cheswold""]","[""Delaware"", ""May 17 Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[] -1081,https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/bwc-dmav-data-analysis-additional-information/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1082,https://delcopa.gov/publicrelations/releases/2020/blooddrive.html,Not Criminal Justice Related,200,"Delaware County Holds Community Blood Drive on May 5 - Delaware County, Pennsylvania","","[""Delaware County Holds Community Blood Drive on May 5""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Urgent need for blood and plasma donations during COVID-19 pandemic""]",[],[] -1083,http://www.ryepolice.us/wp-content/uploads/deterra-intro.jpg,Poor Data Source,200,"","",[],[],[],[],[],[] -1084,https://www.mass.gov/doc/merging-of-police-officer-list-memorandum-to-police-appointing-authorities/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1085,http://www.longbeach.gov/police/press-releases/arrest-made-in-sexual-assault-case/,Media Bulletins,200,ARREST MADE IN SEXUAL ASSAULT CASE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1086,https://www.roundrocktexas.gov/news/police-identify-victim-fatal-auto-pedestrian-crash-mays-street/,Media Bulletins,200,Police identify victim from fatal auto-pedestrian crash at Mays and Main streets - City of Round Rock,"",[],[],"[""Police identify victim from fatal auto-pedestrian crash at Mays and Main streets""]","[""Site Search"", ""Follow Us""]",[],[] -1087,http://www.longbeach.gov/police/press-releases/murder-26-/,Media Bulletins,200,MURDER(26),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1088,https://alpha.austin.gov/en/police-oversight/formal-complaint-opo-declines-to-make-a-recommendation-5/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1089,https://www.mass.gov/news/dighton-police-chief-robert-macdonald-pays-7000-civil-penalty-for-conflict-of-interest-law-violations,Media Bulletins,200,"Dighton Police Chief Robert MacDonald Pays $7,000 Civil Penalty for Conflict of Interest Law Violations | Mass.gov","","[""\nPress Release\u00a0\n Dighton Police Chief Robert MacDonald Pays $7,000 Civil Penalty for Conflict of Interest Law Violations\n ""]","[""Media Contact for Dighton Police Chief Robert MacDonald Pays $7,000 Civil Penalty for Conflict of Interest Law Violations"", ""Media Contact\n for Dighton Police Chief Robert MacDonald Pays $7,000 Civil Penalty for Conflict of Interest Law Violations"", ""\n\nState Ethics Commission\u00a0\n\n"", ""Media Contact for Dighton Police Chief Robert MacDonald Pays $7,000 Civil Penalty for Conflict of Interest Law Violations"", ""Related to Dighton Police Chief Robert MacDonald Pays $7,000 Civil Penalty for Conflict of Interest Law Violations"", ""Help Us Improve Mass.gov with your feedback""]","[""\n Gerry Tuoti, Public Information Officer\n "", ""\n Gerry Tuoti, Public Information Officer\n "", ""\n Gerry Tuoti, Public Information Officer\n "", ""\n\nRobert MacDonald Disposition Agreement\u00a0\n\n"", ""\n\nState Ethics Commission\u00a0\n\n""]","[""\n\nPhone\n"", ""\n\nOnline\n"", ""MacDonald recommended his son for appointment as full-time police officer"", ""\n\nPhone\n"", ""\n\nOnline\n"", ""\n\nPhone\n"", ""\n\nOnline\n""]",[],[] -1090,https://www.mass.gov/doc/ung-dararith-v-lowell-police-department-82009/download,Court Cases,200,"","",[],[],[],[],[],[] -1091,https://www.coppelltx.gov/482/water-backflow-prevention,Not Criminal Justice Related,200,"Water Backflow Prevention | Coppell, TX",The purpose of a backflow prevention device is to keep unsafe drinking water from mixing with the potable water supply.,"[""\r\n\r\nWater Backflow Prevention\t\t""]","[""Backflow Prevention Assembly Testers""]","[""Loading""]",[],[],[] -1092,http://www.hickoryhillspd.us/2022/05/the-hickory-hills-police-departments-distracted-driving-enforcement-results/,Resources,200,The Hickory Hills Police Department’s Distracted Driving Enforcement Results,"","[""The Hickory Hills Police Department\u2019s Distracted Driving Enforcement Results""]","["""", ""Post navigation""]",[],"[""Report a Concern"", ""Investigative Tip Line"", ""Hot Links"", ""Contact Information""]",[],[] -1093,http://www.longbeach.gov/police/press-releases/charges-filed-in-murder-case/,Media Bulletins,200,CHARGES FILED IN MURDER CASE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1094,https://www.antioch.il.gov/wpfb-file/11-29-10-police-and-fire-agenda-pdf-2/,Poor Data Source,200,"11-29-10 Police And Fire Agenda - Antioch, IL",11 29 10 police and fire agenda pdf commissions commission agendas 2010 24 16 45 0000,"[""11-29-10 Police And Fire Agenda""]",[],[],[],[],[] -1095,https://delcopa.gov/council/2015minutes/042215minutes.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -1096,https://santabarbaraca.gov/press-releases/santa-barbara-police-department-promotes-three-officers,Personnel Records,200,Santa Barbara Police Department Promotes Three Officers | City of Santa Barbara,"The Santa Barbara Police Department is proud to announce the promotion of three sworn law enforcement officers. Chief Bernard Melekian promoted Brian Miller from Sergeant to Lieutenant, and Detective Nathan Beltran, and Detective Andre Miller both to Sergeant. ","[""Santa Barbara Police Department Promotes Three Officers""]","[""Breadcrumb"", ""Contact"", ""This is the prefooter section"", ""Main Footer"", ""City Hall"", ""Mailing Address"", ""Newsletters""]",[],[],[],[] -1097,https://www.ci.bonney-lake.wa.us/news/what_s_new/message_from_the_police_chief_on_2021_legislation,Poor Data Source,404,"","",,,,,, -1098,https://springfield-or.gov/event/springfield-police-advisory-committee-spac-21/,Not Criminal Justice Related,200,Springfield Police Advisory Committee (SPAC) - City of Springfield Oregon,"",[],"[""Springfield Police Advisory Committee (SPAC)""]","[""October 5, 2023 @ 6:00 pm - 7:30 pm"", ""Event Navigation""]","[""Share This Story, Choose Your Platform!"", "" Details ""]",[],[] -1099,https://www.rockvillecentrepolice.us/situational-awareness/,Media Bulletins,200,Situational Awareness | Rockville Centre Police Department,"",[],"[""Situational Awareness"", ""News and alerts mailing list"", ""Success!"", ""ROCKVILLE CENTRE POLICE DEPARTMENT"", ""OUR MISSION""]","[""If you see suspicious activity, call the Rockville Centre Police Department immediately (911)""]",[],[],[] -1100,https://www.minneapolismn.gov/government/departments/police/precincts/,Geographic,200,Precincts - City of Minneapolis,Minneapolis is divided into five precincts. Find yours.,"[""Minneapolis police precincts"", ""Need help? We're here for you.""]","[""I want to"", ""Explore our precincts"", ""Access to police services""]","[""\r\n Find a precinct by address or map\r\n "", ""1st Precinct"", ""2nd Precinct"", ""3rd Precinct"", ""4th Precinct"", ""5th Precinct"", ""Minneapolis Police Department"", ""Connect with the Minneapolis Police Department""]",[],[],[] -1101,https://alpha.austin.gov/es/police-oversight/official-complaint-documents-related-to-protests/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1102,https://delcopa.gov/publicrelations/releases/2020/spottedlanternflytreatment.html,Not Criminal Justice Related,200,"Delaware County Awarded Grant for Treatment of Spotted Lanternflies - Delaware County, Pennsylvania","","[""Delaware County Awarded Grant for Treatment of Spotted Lanternflies""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1103,http://www.longbeach.gov/police/press-releases/murder-suicide-investigation/,Media Bulletins,200,MURDER-SUICIDE INVESTIGATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1104,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/022722blotter.pdf,Poor Data Source,404,"","",,,,,, -1105,https://pittsburghpa.gov/files/police/orders/ch6/69-05-pictures-videos-&-audio-recordings-of-police-officers-while-in-public-spaces.pdf,Poor Data Source,404,"","",,,,,, -1106,https://www.southamptontownnypolice.gov/366/skate-parks,Resources,200,"Skate Parks | Southampton, NY - Official Website","","[""\r\n\r\nSkate Parks\t\t""]",[],"[""Loading"", ""Site Tools"", ""Rules & Safety"", ""Skate Park\u00a0"", ""Contact Us"", ""Site Links""]",[],[],[] -1107,http://www.longbeach.gov/police/press-releases/attempt-murder-suspect-arrested/,Media Bulletins,200,ATTEMPT MURDER SUSPECT ARRESTED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1108,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0201/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1109,https://pittsburghpa.gov/police/task-force-police-reform,Resources,200,Response to Community Task Force On Police Reform | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", """", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""PBP Response to Mayor's Community Task Force Recommendations"", ""Police Links""]",[],[] -1110,https://pittsburghpa.gov/police/police-zone4,Contact Info & Agency Meta,200,Police Zone 4 | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Police Zone 4"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[] -1111,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/092522summary.pdf,Poor Data Source,404,"","",,,,,, -1112,https://www.littlerock.gov/media/4332/robert-ryan-hunter-copy.png?width=204&height=248,Poor Data Source,200,"","",[],[],[],[],[],[] -1113,https://sanfordfl.gov/wp-content/uploads/2021/10/rateourservice_police.png,Poor Data Source,200,"","",[],[],[],[],[],[] -1114,http://www.lafayettepolice.us/faq.aspx?qid=116,Complaints & Misconduct,200,FAQs • Will I receive updates about my complaint status?,"",[],"[""\n\u25bc\r\nPolice Complaints\t\t""]","[""Loading"", ""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1115,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/071921summary.pdf,Poor Data Source,200,"","",[],[],[],[],[],[] -1116,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/063021summary.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -1117,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0967/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1118,http://www.longbeach.gov/police/press-releases/traffic-fatality---harvy-way-and-bellflower-blvd/,Media Bulletins,200,TRAFFIC FATALITY - HARVY WAY AND BELLFLOWER BLVD,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1119,https://hilliardohio.gov/remembering-hilliard-police-officer-sean-johnson/,Not Criminal Justice Related,200,Remembering Hilliard Police Officer Sean Johnson - City of Hilliard,"May 19, 2016 is a day we will never forget. Today marks six years since we lost Officer Sean Johnson. It’s not how he died that made him a hero, but how","[""Remembering Hilliard Police Officer Sean Johnson""]","[""Related News Posts"", ""HPD Taking the Plunge For Special Olympics"", ""Detective Metz retires after 38 years with Hilliard police"", ""HPD Accepting Applications for Citizen\u2019s Police Academy""]",[],"[""City Hall and Admin"", ""Hilliard Mayor's Court"", ""Division of Police"", ""Police Assistance"", ""Police Records and General Assistance"", ""Norwich Township Fire"", ""Hilliard Recreation & Parks"", ""Hilliard Newsletter"", ""Quick Links"", ""Stay connected with us""]",[],"[""Click the \u2018x\u2019 to opt out.""]" -1120,https://www.mass.gov/doc/william-j-wagner-president-chicopee-savings-bank/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1121,https://www.mass.gov/locations/state-police-boston-barracks/locations,Geographic,200,Locations | Mass.gov,"","[""\n Other locations related to State Police Boston Barracks\n ""]","[""Showing 1 - 5 of 5 results for:"", ""\n\nState Police Foxboro Barracks\u00a0\n\n"", ""\n\nState Police Framingham Barracks\u00a0\n\n"", ""\n\nState Police Government Center Barracks\u00a0\n\n"", ""\n\nState Police Milton Barracks\u00a0\n\n"", ""\n\nState Police South Boston Barracks\u00a0\n\n""]",[],[],[],[] -1122,https://www.mass.gov/doc/lynch-matthew-v-bridgewater-police-department-121913/download,Court Cases,200,"","",[],[],[],[],[],[] -1123,http://www.lafayettepolice.us/1587/cpz-history,Not Criminal Justice Related,200,"CPZ History | Lafayette, IN - Official Website","","[""\r\n\r\nCPZ History\t\t""]",[],"[""Loading"", ""1870's"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1124,https://police.crystalmn.gov/g_o_v_e_r_n_m_e_n_t/departments_a-_z/assessing,Not Criminal Justice Related,200," - Assessments - City of Crystal -",Links and information about City of Crystal assessing and property tax records.,"[""Assessments""]","[""City Assessment Contact""]","[""Sign up for a city newsletter or notification."", ""City Hall"", ""Regular Hours:""]","[""Monday - Friday""]",[],[] -1125,https://broadview-il.gov/documents/police-department-board-report-may-2022/,Poor Data Source,200,Police Department Board Report – May 2022 | Broadview,"","[""Police Department Board Report \u2013 May 2022""]",[],"[""Featured Gallery"", ""Categories"", ""About Broadview, IL"", ""Phone Numbers"", ""Join Our Newsletter"", ""Broadview Municipal Building""]","[""\n\nPolice Department Board Report \u2013 May 2022\n(339 kB)\n""]",[],[] -1126,https://statepatrol.nebraska.gov/nsp-investigating-milford-police-officer-involved-shooting,Poor Data Source,403,"","",,,,,, -1127,http://www.longbeach.gov/police/press-releases/traffic-fatality-wardlow-and-magnolia/,Media Bulletins,200,TRAFFIC FATALITY WARDLOW AND MAGNOLIA,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1128,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0973/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1129,https://data.naperville.il.us/datasets/police-department-accidents,Poor Data Source,200,Open Data Naperville,Naperville Open Data site,[],[],[],[],[],[] -1130,https://www.southamptontownnypolice.gov/292/sag-harbor,Not Criminal Justice Related,200,"Sag Harbor | Southampton, NY - Official Website","","[""\r\n\r\nSag Harbor\t\t""]","[""Sag Harbor - Local Information & Resources""]","[""Loading"", ""Site Tools"", ""Contact Us"", ""Quick Links"", ""Contact Us"", ""Site Links""]",[],[],[] -1131,https://www.sandyspringsgapolice.gov/intelligence-and-technology-division/,Contact Info & Agency Meta,200,Intelligence and Technology Division – Sandy Springs Police Department,"","[""Intelligence and Technology Division""]","[""Criminal Intelligence Unit"", ""Technology Unit"", ""Records Unit"", ""Georgia Crime Information Center (GCIC) Unit""]",[],[],[],[] -1132,https://www.colma.ca.gov/documents/executive-assistant-chief-police/jd-executive-assistant-to-chief-of-police-6-24/,Media Bulletins,200,JD - Executive Assistant to Chief of Police 6-24 - Town of Colma,"","[""JD \u2013 Executive Assistant to Chief of Police 6-24""]","[""Primary menu links"", ""Action toolbar"", ""Recent news"", ""Contact"", ""Subscribe"", ""Connect""]","[""Postcard Survey"", ""LiveWire \u2013 January 2024"", ""Crime Bulletin \u2013 December 2023"", ""C/CAG\u2019s Countywide Local Road Safety Plan"", ""Crime Bulletin \u2013 November 2023""]",[],[],[] -1133,https://brookfieldil.gov/publication/05510-may-5-2010-fire-and-police-commission/,Poor Data Source,404,"","",,,,,, -1134,https://delcopa.gov/publicrelations/releases/2021/hurricaneida.html,Not Criminal Justice Related,200,"MAJOR DISASTER DECLARATION AND FEMA ASSISTANCE in Delaware County - Delaware County, Pennsylvania","","[""MAJOR DISASTER DECLARATION AND FEMA ASSISTANCE""]","[""MAJOR DISASTER DECLARATION AND FEMA ASSISTANCE""]","[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1135,https://www.goldenbeach.us/police-department/beach-patrol/,Misc Police Activity,200,Beach Patrol – Golden Beach: A Town Unlike Any Other,"","[""\r\n\t\t\t\t\t\t\tBeach Patrol\t\t\t\t\t\t""]","[""Beach Warning Flag Meanings""]","[""Quick Links"", ""Documents"", ""About Golden Beach"", ""Phone Numbers"", ""Town Hall ""]","[""\nAnnual Report 2022\n"", ""\nAnnual Report 2021\n"", ""\nAnnual Report 2020\n"", ""\nAnnual report for 2019\n""]",[],[] -1136,https://www.southbendin.gov/job/police-officer-lateral-entry-in-south-bend/,Training & Hiring Info,200,"Police Officer Lateral Entry (IN, South Bend) - South Bend, Indiana","","[""Police Officer Lateral Entry (IN, South Bend)""]","[""Post navigation""]","[""Leave a Reply Cancel reply"", ""How was your experience?"", ""Mobile Navigation Menu"", ""WELCOME TO THE CITY OF SOUTH BEND\u2019S NEW WEBSITE"", ""311 SERVICE CENTER"", ""CONNECT WITH ELECTED OFFICIALS"", ""PAY BILLS ONLINE"", ""TRASH INFORMATION"", ""VENUES PARKS & ARTS"", ""PROVIDE FEEDBACK"", ""YOU\u2019RE READY!""]","[""CONNECT"", ""My Government"", ""311 Service Portal""]","[""Take Action"", ""Service""]",[] -1137,https://delcopa.gov/treasurer/forms/bingo_law.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1138,https://www.stpaul.gov/departments/police/blueprint-safety,Policies & Contracts,200,Blueprint for Safety | Saint Paul Minnesota,"BLUEPRINT FOR SAFETY The Saint Paul Blueprint for Safety is a model that was created to link the city's criminal justice agencies together in a coherent, p","[""\nBlueprint for Safety\n""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Footer""]","[""\n You are using an unsupported browser. Please use Microsoft Edge.\n "", ""\n Contact The City\n "", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[] -1139,https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations55/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -1140,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-141-fitness-bonus-payment-state-fiscal-year-2011-12,Media Bulletins,-1,"","",,,,,, -1141,https://cityofsalemnj.gov/police-fire-ems/,Contact Info & Agency Meta,200,"Police, Fire, EMS | City of Salem New Jersey","","[""Police, Fire, EMS""]","[""POLICE"", ""FIRE DEPARTMENT"", ""EMS"", ""All Emergencies"", ""Poison Control Hotline"", ""Police, Non-Emergency"", ""County Courthouse"", ""City Administrator"", ""City Clerk"", ""City Finance Office"", ""Municipal City Court"", ""Water & Sewer Dept"", ""Street Department"", ""Building Inspector"", ""Tax Assessor"", ""Tax Collector"", ""Salem Mem. Hospital"", ""Salem High School"", ""Salem Middle School"", ""Fenwick Academy""]","[""Officers"", ""City of Salem Body Worn Camera Policy"", ""Annual Reports"", ""Internal Affairs Policy"", ""Early Intervention System"", ""Recruitment"", ""Firearm Permits & IDs"", ""Immigration"", ""DOCUMENTS:"", ""Fire Incident Report"", ""Become a Volunteer Firefighter"", ""2020 Fire Safety Sheet"", ""American Legion Ambulance Association ""]",[],[],[] -1142,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0547/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -1143,https://www.southamptontownnypolice.gov/faq.aspx?qid=505,Poor Data Source,200,"FAQs • I renewed my registration with the DMV, but have yet ","",[],"[""\n\u25bc\r\nParks & Rec\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1144,https://manitowoccountywi.gov/departments/joint-dispatch-center/policefireems-contact-information/,Contact Info & Agency Meta,200,Manitowoc County - Police/Fire/EMS Contact Information - Manitowoc County,"","[""\n Police/Fire/EMS Contact Information ""]",[],"[""Manitowoc County Police, Fire and EMS""]",[],"[""\nDepartments\n""]","[""\nJoint Dispatch Center\n"", ""CONTACT"", ""ALERTS"", ""DIRECTORY"", ""LEGALS""]" -1145,http://www.lafayettepolice.us/2201/outdoor-maintenance,Resources,200,"Outdoor Maintenance | Lafayette, IN - Official Website",How to maintain your lawn and outdoor areas to reduce stormwater pollution.,"[""\r\n\r\nOutdoor Maintenance\t\t""]","[""Mowing"", ""Pets"", ""Car Washing"", ""Leaves and Fertilizer"", ""Swimming Pools"", ""Watering the Garden""]","[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1146,https://www.edmondswa.gov/government/departments/police_department/security_camera_registration,Resources,200," - Security Camera Registration - City of Edmonds, WA -","","[""City of Edmonds - Washington""]","[""Security Camera Registration""]","[""Edmonds Police Department"", ""Recruitment and Hiring""]",[],[],[] -1147,https://police.crystalmn.gov/police/contact_us/crime_report,Poor Data Source,200," - Crime Reporting System - City of Crystal-Police -","","[""Crime Reporting System""]",[],"[""Sign up for a city newsletter or notification."", ""Police Department"", ""Lobby Hours:""]","[""Bolded fields are required"", ""Monday - Friday""]",[],[] -1148,https://delcopa.gov/treasurer/pdf/2021reassessmentvalues/10.pdf,Annual & Monthly Reports,200,"","",[],[],[],[],[],[] -1149,https://www.dps.nm.gov/blog/2021/12/08/update-cancel-silver-alert-rio-rancho-police-department-eric-engquist/,Incident Reports,200,UPDATE: CANCEL SILVER ALERT – Rio Rancho Police Department – Eric Engquist - NM Department of Public Safety,"","[""UPDATE: CANCEL SILVER ALERT \u2013 Rio Rancho Police Department \u2013 Eric Engquist""]",[],"[""Location"", ""Sitemap"", ""Quick Links"", ""Social Media Links""]",[],[],[] -1150,https://www.lynchburgvapolice.gov/news-updates/e-c-glass-on-lockdown-due-to-suspicious-phone-call/,Media Bulletins,200,E. C. Glass on Lockdown Due to Suspicious Phone Call  - Lynchburg Police Department,"","[""E. C. Glass on Lockdown Due to Suspicious Phone Call\u00a0""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[] -1151,https://delcopa.gov/prison/mail.html,Poor Data Source,200,"Sending Mail to an Inmates - Delaware County, Pennsylvania","","[""Sending Mail to an Inmates""]",[],"[""Mail Scanning"", "" George Hill Correctional \r\n\t Facility Navigation "", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1152,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0868/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1153,http://www.longbeach.gov/police/press-releases/roadway-safety-is-important-for-everyone-to-follow/,Policies & Contracts,200,ROADWAY SAFETY IS IMPORTANT FOR EVERYONE TO FOLLOW,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1154,http://www.tampa.gov/police/info/domestic-violence/options,Resources,200,Domestic Violence - Options | City of Tampa,"Stay with the AbuserMake a safety plan.Call the police if you are being abused.Attend a support group, call (813) 621-7233.File Criminal ChargeCall the police.Sends a message to the abuser that abuse will no longer be tolerated.Police may arrest on scene.","[""Domestic Violence - Options \n""]","[""Police Department"", ""Stay with the Abuser"", ""File Criminal Charge"", ""File Injunction for Protection"", ""Leave the Abuser"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[] -1155,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/052722summary.pdf,Daily Activity Logs,404,"","",,,,,, -1156,https://www.roseville.ca.us/government/departments/police_department/crime_log/crime_log_may_14__2021_-_june_04__2021,Poor Data Source,404,"","",,,,,, -1157,https://champaignil.gov/police/community-engagement/neighborhood-watch/,Resources,200,Neighborhood Watch - City of Champaign,"","[""Neighborhood Watch""]","[""Police Department"", ""Quick Links"", ""Police Department News"", ""Contact Us""]",[],[],[],[] -1158,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-59-dues-increase-rehired-retirees-who-are-members-police-benevolent,Media Bulletins,200,State Police Bulletin No. SP-59 | Office of the New York State Comptroller,To explain an automatic dues increase,"[""\nState Police Bulletin No. SP-59\n"", "" ""]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Effective Date"", ""OSC Actions"", ""Agency Actions"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[] -1159,https://cityofpowell.us/government/building-department/city-of-powell-commercial-building/checklist-cop-comm-tent-01-08-19/,Resources,200,"City of Powell, Ohio | Checklist COP Comm Tent 01.08.19","","[""\n Checklist COP Comm Tent 01.08.19\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -1160,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0900/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1161,https://www.mass.gov/doc/fas-31-2018-hcpcs-code-revisions-new-prior-authorization-requirement-for-knee-arthroscopy/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1162,https://www.coppelltx.gov/1051/s-belt-line-reconstruction-updates,Not Criminal Justice Related,200,"S Belt Line Reconstruction Updates | Coppell, TX",Read the latest updates from the S Belt Line Reconstruction Project. Construction is expected to be completed in Spring 2023.,"[""\r\n\r\nS Belt Line Reconstruction Updates\t\t""]",[],"[""Loading"", ""Friday, January 19"", """", ""Friday, January 12"", """", ""Friday, January 05"", ""Friday, December 22"", ""Friday, December 15"", ""Friday, December 8"", ""Friday, December 1"", ""Friday, November 16"", """", ""Friday, November 10"", """", ""Friday, November 3"", ""Friday, October 27"", ""Friday, October 20"", ""Friday, October 13"", """", ""Friday, October 6"", ""Friday, September 29"", """", ""Friday, September 22"", """", ""Friday, September 15"", ""Friday, September 1"", ""Friday, August 25"", """", ""Friday, August 18"", """", ""Friday, August 11"", """", ""Friday, August 4"", ""Friday, July 28, 2023"", ""Friday, July 14, 2023"", """", ""Friday, July 7, 2023"", """", ""Friday, June 30, 2023"", """", ""Friday, June 16, 2023"", """", ""Friday, June 9, 2023"", """", ""Friday, May 29, 2023"", """", ""Friday, May 19, 2023"", """", ""Friday, May 12, 2023"", """", ""Friday, May 5, 2023"", """", ""Friday, April 28, 2023"", """", ""Friday, April 21, 2023"", """", ""Friday, April 14, 2023"", """", ""Friday, April 7, 2023"", """", """", ""Friday, March 31, 2023"", """", ""Friday, March 24, 2023"", """", ""Friday, March 17, 2023"", """", ""Friday, March 3, 2023"", """", ""Friday, February 17, 2023"", """", ""Friday, February 10, 2023"", """", ""Friday, February 3, 2023"", """", ""Friday, January 20, 2023"", """", ""Friday, January 13, 2023"", """", ""Friday, January 6, 2023"", """", ""Friday, December 16, 2022"", """", ""Friday, December 9, 2022"", """", ""Friday, December 2, 2022"", """", ""Friday, November 25, 2022"", """", ""Friday, November 18, 2022"", """", ""Friday, November 11, 2022"", """", ""Friday, November 4, 2022"", """", ""Friday, October 28, 2022"", """", """", ""Friday, October 21, 2022"", """", """", ""Friday, October 14, 2022"", ""Friday, October 7, 2022"", ""Friday, September 30, 2022"", ""Friday, September 16, 2022"", ""Friday, September 9, 2022"", ""Friday, September 2, 2022"", ""Friday, August 26, 2022"", ""Friday, August 19, 2022"", ""Friday, August 12, 2022"", ""Friday, August 5, 2022"", ""Friday, July 29, 2022"", ""Friday, July 22, 2022"", ""Friday, July 15, 2022"", ""Friday, July 8, 2022"", ""Friday, July 1, 2022"", ""Friday, June 24, 2022"", ""Friday, June 17, 2022"", ""Friday, June 10, 2022"", ""Friday, June 3, 2022"", ""Friday, May 27, 2022"", ""Friday, May 20, 2022"", ""Friday, May 13, 2022"", ""Friday, May 6, 2022"", ""Friday, April 29, 2022"", ""Friday, April 22, 2022"", ""Friday, April 15, 2022"", ""Friday, April 8, 2022"", ""Friday, April 1, 2022"", ""Friday, March 25, 2022"", ""Friday, March 18, 2022"", ""Friday, March 11, 2022"", ""Friday, March 4, 2022"", ""Contact Us""]","[""Public Works"", ""\n"", ""\n""]",[],[] -1163,https://delcopa.gov/planning/pubs/delco2035economicdevelopmentplan.html,Not Criminal Justice Related,200,Delaware County 2035 Economic Development Plan,"","[""Delaware County 2035 Economic Development Plan \n""]",[],"[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1164,https://www.farmingtonmn.gov/government/departments/police/divisions/crime_scene_unit,Resources,200," - Crime Scene Unit - City of Farmington -","","[""City of Farmington""]","[""Crime Scene Unit""]",[],[],[],[] -1165,https://cityofpowell.us/reports/auto-draft-91/07-2017-police-report/,Annual & Monthly Reports,200,"City of Powell, Ohio | 07.2017 Police Report","","[""\n 07.2017 Police Report\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -1166,https://beaumonttexas.gov/beaumont-police-investigating-aggravated-robbery-grant-irving-intersection/,Media Bulletins,404,"","",,,,,, -1167,https://www.roseville.ca.us/government/departments/police_department/contact_roseville_police/ride-_along_application,Poor Data Source,200," - Ride-Along Application - City of Roseville -","","[""City of Roseville""]","[""Ride-Along Application""]","[""Roseville Police Department ""]",[],[],[] -1168,https://www.stpaul.gov/departments/police/department-history,Not Criminal Justice Related,200,Department History | Saint Paul Minnesota,Saint Paul Police History The Saint Paul Police Department is proud of its rich history of service. The department has grown since its beginning in 1854 to,"[""\nDepartment History\n""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""\n In This Section\n "", ""Saint Paul Police History"", ""Badges of the Police Department"", ""Vehicles of the Police Department"", ""Uniforms of the Department"", ""Links to the Past"", ""Footer""]","[""\n You are using an unsupported browser. Please use Microsoft Edge.\n "", ""\n Contact The City\n "", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[] -1169,https://police.greenvillesc.gov/526/colonel-elias-earle-historic-district,Not Criminal Justice Related,-1,"","",,,,,, -1170,https://delcopa.gov/jdboard/pdfs/agenda_2021_12_21.pdf,Poor Data Source,200,"","",[],[],[],[],[],[] -1171,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/010622summary.pdf,Daily Activity Logs,200,"","",[],[],[],[],[],[] -1172,https://www.harrisonburgva.gov/online-police-reporting-faq,Poor Data Source,-1,"","",,,,,, -1173,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/bike-patrol.pdf,Media Bulletins,200,"","",[],[],[],[],[],[] -1174,https://edenny.gov/honoring-edens-police-chief-and-lieutenant/,Media Bulletins,200,"Honoring Eden’s Police Chief and Lieutenant | Town of Eden, New York","","[""Honoring Eden\u2019s Police Chief and Lieutenant""]",[],[],"[""Contact Information""]",[],[] -1175,http://www.longbeach.gov/police/press-releases/toddlers-found-alone--police-asking-for-help-in-determining-their-identity-and-locating-parents/,Media Bulletins,200,TODDLERS FOUND ALONE; POLICE ASKING FOR HELP IN DETERMINING THEIR IDENTITY AND LOCATING PARENTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1176,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/070121arrests.pdf,Arrest Records,-1,"","",,,,,, -1177,https://www.florenceaz.gov/florence-police-department-citizen-academy/,Resources,200,Florence Police Department Citizen Academy – Town of Florence,"","[""Florence Police Department Citizen Academy""]","[""\n\t\t\t\t\tAbout the Author: \t\t\t\t\t\tShaun Courtney ""]","[""Visitors"", ""Events"", ""Business Information"", ""Services"", ""Town Departments"", ""News Categories"", ""Utilities""]","[""Teen Council Meeting January 24, 2024"", ""Charles Whitlow Rodeo Grounds Advisory Board January 25, 2024"", ""Historic District Advisory Commission January 31, 2024"", ""Planning and Zoning Commission February 1, 2024"", ""Town Council Meeting February 5, 2024"", ""Dive into Summer Opportunities at Florence\u2019s Aquatic Center Job Fair"", ""Major Equipment Upgrades Coming to Florence Fitness Center"", ""Florence\u2019s Western Heritage Comes Alive: The 91st Annual Jr. Parada"", ""Share This Story, Choose Your Platform!"", ""Recent Posts""]",[],[] -1178,https://coloradosprings.gov/police-department/article/news/homicide-investigation-3200-block-heather,Media Bulletins,-1,"","",,,,,, -1179,https://www.arlingtonva.us/government/projects/plans-studies/land-use/crystal-city-building-heights-study/process-scope-timeline,Media Bulletins,200,"Crystal City Building Heights Study: Process, Scope and Timeline – Official Website of Arlington County Virginia Government",ProcessThe study will be divided into four phases:Development of guidance to assist evaluation of building height impactsBuilding heights assessmentPolicy guidance updateZoning Ordinance amendmentCommunity engagement will be incorporated throughout the study process. The Long...,"[""Crystal City Building Heights Study: Process, Scope and Timeline""]","[""\n"", ""\r\n\t\t\tContact\r\n\t\t"", ""\r\n\t\t\tEvents\r\n\t\t"", ""\r\n\t\t\tSubscribe\r\n\t\t""]","[""Process"", ""Scope"", ""Timeline"", ""CONTACT US"", ""QUICK LINKS"", ""CONNECT"", ""STAY INFORMED""]","[""Media""]",[],[] -1180,https://cityofspoonerwi.gov/spooner-police-ordinances/,Resources,-1,"","",,,,,, -1181,https://www.antioch.il.gov/wpfb-file/01-17-12-police-and-fire-agenda-pdf-3/,Poor Data Source,200,"01-17-12 Police And Fire Agenda - Antioch, IL",9072 01 17 12 police and fire agenda pdf commissions commission agendas 2012 1326484492 217183b94f59e5f5ad44921de1bc893f 213x300 _sn5tggobfiam thumb jpg 13 14 54 52 0 pdf application trustees dennis b crosby scott a pierce mary c dominiak ted p poulos jay jozwiak george sakas lawrence m hanson mayor candi l rowe village clerk notice of public,"[""01-17-12 Police And Fire Agenda""]",[],[],[],[],[] -1182,https://www.sandyspringsgapolice.gov/chatcomm911/,Resources,-1,"","",,,,,, -1183,https://training.detroitmi.gov/departments/police-department/project-green-light-detroit/agreements,Not Criminal Justice Related,503,"","",,,,,, -1184,https://delcopa.gov/publicrelations/releases/2021/mailballotrequestdeadline.html,Media Bulletins,-1,"","",,,,,, -1185,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0204/,Complaints & Misconduct,-1,"","",,,,,, -1186,https://www.dps.nm.gov/blog/2022/03/05/update-3-nmsp-investigates-fatal-crash-on-i-25-involving-the-santa-fe-police-department-during-pursuit-of-carjacking-and-kidnapping-suspect/,Media Bulletins,-1,"","",,,,,, -1187,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0481/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -1188,https://delcopa.gov/planning/education/plannersportfolios/plannersportfolioaginginplace.html,Not Criminal Justice Related,200,Planner’s Portfolio: Aging In Place,"","[""Planner\u2019s Portfolio: Aging In Place""]",[],"[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1189,https://www.mass.gov/doc/boston-police-department-drug-test-appeals-related-superior-court-decision-8222/download,Misc Police Activity,200,"","",[],[],[],[],[],[] -1190,https://www.montgomerycountymd.gov/ccm/mcpolicebeat.html,Media Bulletins,-1,"","",,,,,, -1191,https://southamptontownnypolice.gov/faq.aspx?qid=546,Resources,200,FAQs • Where can I report injured wildlife animals?,"",[],"[""\n\u25bc\r\nCitizens' Response Center\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1192,https://southamptontownnypolice.gov/187/youth-advisory-committee,Resources,200,"Youth Advisory Committee (YAC) | Southampton, NY - Official Website",Learn about the responsibilities of the Youth Advisory Committee.,"[""\r\n\r\nYouth Advisory Committee (YAC)\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", """", ""Contact Us"", ""Site Links""]",[],[],[] -1193,https://delcopa.gov/vote/news/20emergencyabsenteeballots.html,Not Criminal Justice Related,200,"Information on Emergency Absentee Ballots - Delaware County, Pennsylvania","","[""Information on Emergency Absentee Ballots""]",[],"[""Delco Votes!"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Emergency Absentee Ballots"", ""Important Notice""]",[],[] -1194,https://www.antiochca.gov/police/alarm-registration/,Resources,200,"Alarm Registration – City of Antioch, California","",[],"[""Contact Info""]","[""Alarm Registration""]","[""\nSend Message\n""]","[""Joe Vigil"", ""Acting Chief of Police"", ""Captain Morefield"", ""Field Services"", ""Lt. Mellone"", ""Professional Standards""]",[] -1195,https://coloradosprings.gov/police-department/article/news/recovered-property-february-2021,Media Bulletins,200,Recovered Property: February 2021 Investigation | City of Colorado Springs,"","[""\nRecovered Property: February 2021 Investigation\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -1196,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0868/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -1197,https://delcopa.gov/hcd/pdfs/leadinformationforhomeowners.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1198,https://www.sandiego.gov/department-document/police-identify-attempted-murder-victim-oak-park,Media Bulletins,200,Police Identify Attempted Murder Victim In Oak Park | City of San Diego Official Website,"","[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Police Identify Attempted Murder Victim In Oak Park"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -1199,https://ci.san-bernardino.ca.us/news/archived_news/downtown_specific_plan_scoping_meeting,Not Criminal Justice Related,200," - Downtown Specific Plan Scoping Meeting - City of San Bernardino -","","[""City of San Bernardino California""]","[""Downtown Specific Plan Scoping Meeting""]",[],[],[],[] -1200,https://springfield-or.gov/coffee-with-a-cop-scheduled-for-afternoon-on-november-4th/,Media Bulletins,200,Coffee With a Cop Scheduled for Afternoon on November 4th - City of Springfield Oregon,"","[""Coffee With a Cop Scheduled for Afternoon on November 4th""]",[],[],[],[],[] -1201,https://alpha.austin.gov/police-oversight/2020-08-17/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1202,https://coloradosprings.gov/police-department/article/news/update-homicide-investigation-200-block-e,Incident Reports,200,Update - Homicide Investigation: 200 Block of E. Arvada Street | City of Colorado Springs,"","[""\nUpdate - Homicide Investigation: 200 Block of E. Arvada Street\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -1203,https://normandyparkwa.gov/police-services/,Media Bulletins,200,Police Services - City of Normandy Park,"The Normandy Park Police Department provides 24 hours a day, 7 days a week patrol and emergency response service to approximately 6,500 citizens ...","[""Police Services""]","["""", ""Serving approximately 6,500\u00a0citizens over 2.5 square miles"", ""Police News & Updates"", ""\nTOYS FOR TOTS\n"", ""\nNormandy Park Paws on Patrol\n"", ""\nNormandy Park February Blood Drive\n"", ""\nFebruary Blood Drive\n"", ""Steering Wheel Locks!"", """", """", """", ""Police Blotter & Reports"", ""Unclaimed & Recovered Property"", ""Common Questions"", ""Receive news & updates"", ""Success!"", ""Subscribe To Our Newsletter"", ""You have Successfully Subscribed!""]","[""Reserve Officers Unit"", ""\n\n\t\tBlood Drive\t\n"", ""\n\n\t\tBlood Drive\t\n"", ""Services"", ""Concealed Pistol Licenses"", ""Fingerprinting"", ""Contacts""]","[""Normandy Park City Hall"", ""City Hall Hours""]","[""Interested in a law enforcement career""]",[] -1204,https://www.southamptontownnypolice.gov/1557/southampton-sustainability-drawdown-east,Poor Data Source,404,"","",,,,,, -1205,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_releases/police_investigate_1993_john_doe_case,Media Bulletins,404,"","",,,,,, -1206,https://www.roundrocktexas.gov/wp-content/uploads/2020/02/rrpd_police_patch.png,Poor Data Source,200,"","",[],[],[],[],[],[] -1207,https://police.greenvillesc.gov/faq.aspx?qid=546,Not Criminal Justice Related,200,FAQs • How are the submissions judged?,"",[],"[""\n\u25bc\r\nGreenlink Art Contest\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -1208,https://southamptontownnypolice.gov/891/dune-road-reconstruction,Not Criminal Justice Related,200,"Dune Road Reconstruction | Southampton, NY - Official Website","","[""\r\n\r\nDune Road Reconstruction\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]",[],[],[] -1209,http://www.ryepolice.us/./pressrelease,Media Bulletins,200,Rye Police Department Press Releases - Rye Police Department,"","[""Press Releases""]","[""Hiring Police Officer"", ""Town of Rye Hiring Part Time Seasonal Parking Enforcement"", ""Hiring Animal Control Officer"", ""Vaccination Clinic"", ""Stolen F-350 with Dump Trailer""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -1210,https://www.waterloo.il.us/departments/police-department/,Media Bulletins,200,"Police Department - City of Waterloo, IL","","[""Police Department""]",[],"[""Mission Statement"", ""D.A.R.E. Program"", ""Domestic Violence Program"", ""Waterloo\u2019s Emergency Notification System"", ""\nContact Us\n""]","[""Departments"", ""About the Department"", ""Additional Resources"", ""Police Chief\n""]",[],[] -1211,https://townofspringfield.colorado.gov/police-department-9,Resources,200,Springfield Police Department | Town of Springfield,                                          ,"[""\nSpringfield Police Department\n""]",[],"[""\n"", ""\n"", ""\nTown of Springfield\n""]",[],[],[] -1212,https://ose.louisiana.gov/event/police-lieutenant-10/,Poor Data Source,200,Police Lieutenant | Louisiana Office of State Examiner,"","["""", ""Police Lieutenant""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -1213,https://coloradosprings.gov/police-department/article/news/seeking-community-assistance,Media Bulletins,200,Seeking Community Assistance | City of Colorado Springs,"","[""\nSeeking Community Assistance\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -1214,https://coloradosprings.gov/police-department/article/news/homicide-investigation-2001-e-platte-ave,Media Bulletins,200,Homicide Investigation 2001 E Platte Ave | City of Colorado Springs,"","[""\nHomicide Investigation 2001 E Platte Ave\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -1215,https://alpha.austin.gov/en/police-oversight/2020-06-08-6/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1216,http://lafayettepolice.us/9/how-do-i,Not Criminal Justice Related,200,"How Do I... | Lafayette, IN - Official Website",Obtain access to frequently requested pages and information.,"[""\r\n\r\nHow Do I...\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]","[""\nAccess\n"", ""\nApply For\n"", ""\nContact\n"", ""\nFind\n"", ""\nSign Up For\n"", ""\nSubmit\n"", ""\nVisit\n""]",[],[] -1217,https://www.hickoryhillspd.us/2018/10/police-chief-announces-his-retirement/,Media Bulletins,200,Police Chief Announces His Retirement,"","[""Police Chief Announces His Retirement""]","["""", ""Post navigation""]",[],"[""Report a Concern"", ""Investigative Tip Line"", ""Hot Links"", ""Contact Information""]",[],[] -1218,https://mukilteowa.gov/news/mukilteo-police-brings-awareness-to-domestic-violence/,Media Bulletins,200," - City of Mukilteo - | Mukilteo Police Brings Awareness to Domestic Violence - City of Mukilteo ","","[""\n\t\t Mukilteo Police Brings Awareness to Domestic Violence\t\t ""]","[""\n\t\t\t\t\t\tSign up for notifications\n\t\t\t\t\t""]",[],[],[],[] -1219,https://www.desmoineswa.gov/departments/police/programs_services/his_victim_notification_program,Resources,200," - ICE & HSI Victim Notification Program - City of Des Moines, WA -","","[""City of Des Moines, WA""]","[""ICE & HSI Victim Notification Program""]",[],[],[],[] -1220,https://www.arlingtontx.gov/news/my_arlington_t_x/news_stories/police_chief_community_welcome,Media Bulletins,200," - Arlington to Host Community Event Jan. 25 to Welcome New Chief of Police Al Jones - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Arlington to Host Community Event Jan. 25 to Welcome New Chief of Police Al Jones""]",[],[],[],[] -1221,https://www.austintexas.gov/blog/austin-green-business-leader-featured-member-st-andrews-episcopal-school,Not Criminal Justice Related,200,Austin Green Business Leader | Featured Member: St. Andrew’s Episcopal School | AustinTexas.gov,You may have heard of the Austin Green Business Leader program but perhaps are still unsure of how the program works or who the members are. We’ll be featuring different members throughout the year to introduce the great businesses helping make Austin an even better place to live and do business!,"[""Austin Green Business Leader | Featured Member: St. Andrew\u2019s Episcopal School""]","[""Action Navigation"", ""GTranslate"", ""Main menu"", ""Frequently Viewed Departments"", ""Sustainable Austin Blog"", ""Share"", ""About this blog"", ""Tags"", ""Archives"", ""Pagination"", ""Footer Menu"", ""Second Footer Menu""]","[""Resident"", ""Business"", ""Government"", ""Departments"", ""Connect"", ""Austin Green Business Leader | Featured Member: St. Andrew\u2019s Episcopal School"", """", ""Who is St. Andrew's Episcopal School?"", ""What makes them a Green Business Leader?"", ""Is your business a green business?"", ""2023 December\n"", ""2023 December\n"", ""2023 November\n"", ""2023 November\n"", ""2023 November\n"", ""2023 October\n"", ""2023 October\n"", ""2023 September\n"", ""2023 August\n"", ""2023 August\n""]",[],[],[] -1222,https://vpd.vernonia-or.gov/blotter/2019/02/01/january-2019-police-blotter/,Dispatch Logs,200,January 2019 Police Blotter | Vernonia Police Department,January 2019,"[""Vernonia Police Blotter for January 2019""]",[],[],"[""Latest Blotter""]","[""REPORTS TAKEN"", ""CITATION/OTHER"", ""OCTOBER 2023 Police Blotter"", ""SEPTEMBER 2023 Police Blotter"", ""AUGUST 2023 Police Blotter"", ""JULY 2023 Police Blotter"", ""JUNE 2023 Police Blotter""]",[] -1223,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-201-2019-state-police-hazardous-duty-pay,Media Bulletins,200,State Police Bulletin No. SP-201 | Office of the New York State Comptroller,The purpose of this bulletin is to inform the Division of State Police of OSC’s automatic processing of 2019 State Police Hazardous Duty Pay.,"[""\nState Police Bulletin No. SP-201\n"", "" ""]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Background"", ""Effective Date(s)"", ""Eligibility Criteria"", ""OSC Actions"", ""Control-D Report"", ""Overtime Calculation Information "", ""Retirement Information"", ""Tax Information"", ""Payroll Register and Employee\u2019s Paycheck/Advice"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[] -1224,http://www.longbeach.gov/police/press-releases/motorcycle-safety-operation-a-success/,Media Bulletins,200,MOTORCYCLE SAFETY OPERATION A SUCCESS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1225,http://www.longbeach.gov/police/press-releases/murder---900-block-of-elm/,Media Bulletins,200,Murder - 900 Block of Elm,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1226,http://www.police.wallingfordct.gov/,Resources,200,"Wallingford, CT Police Department","The Wallingford Police Department is a progressive, professional department with a strong emphasis on community relations and outreach.","[""\r\n The Wallingford Police Department is hiring for the position of Entry Level Police Officer. Click Alert for information. \u00a0\u00a0\u203a\r\n "", ""Guardians of the Community Since 1913 ""]","[""How Do I?"", ""News"", ""Town of Wallingford Police Department""]","[""Town of Wallingford Parking Ban"", ""Bring Me Back Home Program"", ""Turkey Trot - Press release 2023""]",[],[],[] -1227,https://norfolkne.gov/assets/site/documentcentral/police/archived-calls-for-service/2020-calls-for-service/5.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -1228,https://www.scribner-ne.gov/help-define-our-schools-future/copy-of-scribner-profile-pics-2020/,Poor Data Source,200,"","",[],[],[],[],[],[] -1229,https://cityofpowell.us/reports/auto-draft-223/04-2019-police-department/,Annual & Monthly Reports,200,"City of Powell, Ohio | 04.2019 Police Department","","[""\n 04.2019 Police Department\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -1230,http://lafayettepolice.us/faq.aspx?qid=125,Not Criminal Justice Related,200,FAQs • What are the benefits of a rain garden?,"",[],"[""\n\u25bc\r\nRain Gardens\t\t""]","[""Loading"", ""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1231,https://www.sandiego.gov/police/contact/meeting-request,Contact Info & Agency Meta,200,Meeting with the Chief Request Form | City of San Diego Official Website,"In completing your request, please be as comprehensive, detailed and specific as possible in your responses to questions included on the form. An acknowledgement of your request will be provided to you by email. While we appreciate a need for certainty regarding your request, please be assured that additional phone calls or invitations are not necessary unless requested. Please note that we cannot confirm events more than 6-8 weeks in advance. This form is used in a review process and is not a confirmation for the Chiefs attendance.","[""City of San Diego Official Website"", ""Meeting with the Chief Request Form\n""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -1232,https://hilliardohio.gov/introducing-newest-police-officer-k9-jawaak/,Media Bulletins,404,"","",,,,,, -1233,https://www.sandiego.gov/police/data-transparency/crime-statistics/annual-crime-reports,Crime Maps & Reports,200,City of San Diego Annual Crime Reports | City of San Diego Official Website,"","[""City of San Diego Official Website"", ""City of San Diego Annual Crime Reports""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Actual Crimes"", ""Crime Rates per 1,000 Population"", ""Data & Transparency"", ""Footer""]","[""City of San Diego"", ""By Neighborhood"", ""City of San Diego"", ""By Neighborhood""]","[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -1234,https://www.lynchburgvapolice.gov/lpd-policies-and-procedures/,Poor Data Source,200,LPD Policies and Procedures - Lynchburg Police Department,"","[""LPD Policies and Procedures""]",[],[],"[""More information"", ""Contact Us"", ""Site Links"", ""Site Links""]",[],[] -1235,https://delcopa.gov/courts/pdf/emergencyjudicialorders/secondemergencyorderextensionandamendments_juveniledelinquencyanddependencymatters.pdf,Court Cases,200,"","",[],[],[],[],[],[] -1236,http://www.longbeach.gov/police/press-releases/long-beach-police-seeking-the-public-s-help-in-identifying-armed-robbery-suspect---video-footage-available--/,Wanted Persons,200,LONG BEACH POLICE SEEKING THE PUBLIC'S HELP IN IDENTIFYING ARMED ROBBERY SUSPECT --VIDEO FOOTAGE AVAILABLE--,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1237,https://cityofgulfbreeze.us/departments/police/divisions/,Resources,200,Divisions - City of Gulf Breeze,"Uniformed Patrol Division The Uniform Patrol Division is responsible for providing 24-hour response to calls for police service, conducting patrol activities, traffic enforcement, investigating crimes, and performing other law enforcement services. The Uniform Patrol Division is also responsible for overseeing the Police Department’s K-9 program. Patrol The Police Department maintains two Patrol Platoons respectively designated","[""Divisions""]","[""Mobile Menu"", ""Before Header"", ""Header Right"", ""Primary Sidebar"", ""Footer"", ""\nWhat can we help you find?\n""]","[""Departments"", ""No Active Advisories"", "" City Projects"", ""Get Text Updates"", ""City of Gulf Breeze"", ""Most Requested"", ""County Agencies"", ""State Sites""]","[""Uniformed Patrol Division\n"", ""Patrol"", """", ""\nCommunications"", ""Investigations"", ""Highpoint Water Main Replacement"", ""Eufaula Outfall Treatment Unit \u2013 RESTORE"", ""Fairpoint Septic-to-Sewer (STS) Conversion"", ""City Hall""]",[],[] -1238,https://www.austintexas.gov/blog/office-police-oversight-community-event-apd-use-force,Media Bulletins,200,"Office of Police Oversight Community Event, APD Use of Force | AustinTexas.gov","  The Office of Police Oversight hosted a community event to review Austin Police Department use of force policies, collect input, and make new recommendations.","[""Office of Police Oversight Community Event, APD Use of Force""]","[""Action Navigation"", ""GTranslate"", ""Reimagining Public Safety Menu"", ""Reimagining Public Safety Blog"", ""Share"", ""About this blog"", ""Archives"", ""Pagination"", ""Footer Menu"", ""Second Footer Menu""]","[""Office of Police Oversight Community Event, APD Use of Force"", ""2021 June\n"", ""2021 June\n"", ""2021 May\n"", ""2021 May\n"", ""2021 May\n"", ""2021 May\n"", ""2021 May\n"", ""2021 April\n"", ""2021 March\n"", ""2021 March\n""]","[""Meeting Summary"", ""3 steps to get involved:\u00a0\u00a0""]",[],[] -1239,http://www.lafayettepolice.us/1598/castaway-bay,Not Criminal Justice Related,200,"Castaway Bay | Lafayette, IN - Official Website","","[""\r\n\r\nCastaway Bay\t\t"", ""Hours of Operation"", ""Pool Admission Fees"", """", ""Special Rates:""]","[""Daily Admission Fees"", ""Family Night Admission Fees*"", """", ""Purchase a Season Pass!"", """", ""Family Night Tuesdays\n"", ""Location & Contact Information""]","[""Loading"", ""Non-Profit Rate"", ""Private Rentals"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1240,https://delcopa.gov/treasurer/pdf/2021reassessmentvalues/39.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1241,https://www.westmayfieldborough.us/cropped-white-blank-header-banner-copy1-jpg/,Poor Data Source,200,cropped-White-blank-header-banner-Copy1.jpg – West Mayfield Borough,"","[""cropped-White-blank-header-banner-Copy1.jpg""]",[],[],[],[],[] -1242,https://delcopa.gov/publicrelations/publicrelations/releases/2020/index.html,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1243,https://alpha.austin.gov/police-oversight/formal-complaint-de-escalation-of-potential-force-encount-3/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1244,https://delcopa.gov/planning/pubs/portfolio-14_foodsystems.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1245,https://www.mass.gov/doc/copleydental2013-003rfd/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1246,https://brecknocktownship.us/police-and-emergency-services/,Contact Info & Agency Meta,200,"Police and Emergency Services | Brecknock Township, PA","","[""Brecknock Township, PA"", ""Police and Emergency Services""]","[""Lancaster County \u2022 1026 Dry Tavern Rd \u2022 Denver, PA 17517""]","[""Main menu"", ""Latest News"", ""Upcoming Events""]",[],[],[] -1247,https://gonzalesca.gov/services/police/police-department-staff,Contact Info & Agency Meta,200,Police Department Staff | City of Gonzales,"Official City of Gonzales, CA website. Find the latest news, events, and information for residents and businesses....","[""The City of Gonzales, California"", ""The City of Gonzales, California""]","[""Top menu"", ""Police Department Staff""]","[""Side Menu for Services"", ""Keith Wise - Chief of Police"", ""JUAN MENDOZA - CAPTAIN"", ""SANTIAGO MELGOZA - Sergeant"", ""HERBERT BOWEN - SERGEANT"", ""CESAR CASTILLO - CORPORAL/ EXPLORER ADVISOR"", ""NATHAN CORDOBA - CORPORAL"", ""ALEX PRUNEDA - OFFICER"", ""MIGUEL PEREZ - SCHOOL RESOURCE OFFICER "", ""ULYSES FIERROS - OFFICER"", ""DAVID RIVERA - OFFICER"", ""TAYLOR RIVAS - OFFICER"", ""JOSHUA MACIAS - OFFICER"", ""ANDREA CASILLAS - RECORDS SUPERVISOR"", ""ESTHER VALDEZ - ADMINISTRATIVE ASSISTANT"", ""IVAN CORREA - Community Service Officer ""]","[""CITY OF GONZALES""]",[],[] -1248,https://bolivar.mo.us/shop-with-a-copr/img_1333-2/,Poor Data Source,200,"IMG_1333 - City of Bolivar, Missouri","","[""IMG_1333""]",[],[],[],[],[] -1249,https://www.rentonwa.gov/city_hall/police/police_services/8_can_t_wait/require_use_of_force_continuum,Policies & Contracts,200," - Require Use Of Force Continuum - City of Renton -","","[""CITY OF RENTON\r\n\t\t\t\t\tWASHINGTON""]","[""Require Use Of Force Continuum""]",[],"[""POLICY 300.4 USE OF FORCE"", ""SOP 107.3 SPECTRUM OF FORCE"", ""Renton Police Department Comments"", ""Eight Can't Wait""]",[],[] -1250,https://chester-ny.gov/town-departments/police/house-check-request/,Resources,200,"House Check Request – Town of Chester, Orange County New York!","","[""\n \tHouse Check Request ""]",[],[],"[""Town Hall"", ""Police Department"", ""Follow us on YouTube"", ""\u00a9 The Town of Chester NY | All Rights Reserved""]",[],[] -1251,https://www.mass.gov/doc/reference-copy-of-2016-massdep-municipal-solid-waste-recycling-survey/download,Not Criminal Justice Related,200,"","",,,,,, -1252,https://www.minneapolismn.gov/resident-services/public-safety/police-public-safety/police-reports-and-data-requests/frequently-requested/critical-incidents/feb-2-2022-officer-involved-shooting/,Officer Involved Shootings,200,"February 2, 2022 Officer-Involved Shooting - City of Minneapolis","Public data gathered by the Minneapolis Police Department related to the February 2, 2022 officer-involved shooting.","[""February 2, 2022 officer-involved shooting"", ""Need help? We're here for you.""]","[""Body-worn camera video - Incident 22-022798"", ""Citations"", ""Documents"", ""Officer involved in incident"", ""Note about Officer complaints and discipline"", ""Body Camera, Street Camera, and Squad Camera Footage""]","[""\n\r\n Still image from body-worn camera video - Incident 22-022798\r\n \n"", ""\n\r\n Hennepin County Medical Examiner Press Release Report\r\n \n"", ""\n\r\n 22-022798 General Offense Public Information Report\r\n \n"", ""\n\r\n 22-022798 Incident Detail Report\r\n \n"", ""\n\r\n 22-0004855 Fire Incident Detail Report\r\n \n"", ""\n\r\n 22-0004855 Fire Incident Report\r\n \n"", ""\n\r\n MPD News Release\r\n \n"", ""\n\r\n MPD News Release Photo 1\r\n \n"", ""\n\r\n MPD News Release Photo 2\r\n \n"", ""\n\r\n Public Personnel File for Mark Hanneman\r\n \n"", ""\n\r\n Employee Complaint Summary for Mark Hanneman\r\n \n""]","["" Request accessible format"", "" Request accessible format"", "" Request accessible format"", "" Request accessible format"", "" Request accessible format"", "" Request accessible format"", "" Request accessible format"", "" Request accessible format"", "" Request accessible format"", "" Request accessible format"", "" Request accessible format""]",[],[] -1253,https://www.lynchburgvapolice.gov/wp-content/uploads/2022/05/pwm-2-4.jpg,Poor Data Source,404,"","",,,,,, -1254,https://directory.arkansas.gov/agency/department-of-public-safety/arkansas-state-police/news/crack-down-on-speeders-part-of-statewide-traffic-safety-blitz-obey-the-sign-or-pay-the-fine/,Poor Data Source,200,State Directory – Arkansas.gov,"","["" Flag Status""]","[""\n\n\t\t\t\t\t\tDiscover More\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tDiscover More\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tDiscover More\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tDiscover More\t\t\t\t\t\n"", ""What can we help you find?"", ""Search the Directories"", ""Flag Status"", """"]","[""Government Resources"", ""Business Resources"", ""Residents Resources"", ""Visiting Resources"", ""State Directory"", ""Agencies"", ""Services"", ""Employees"", ""Your Arkansas.gov"", ""Top Online Services"", ""helpful information""]","[""Was the information on this page helpful?""]",[],[] -1255,https://www.coppelltx.gov/faq.aspx?qid=218,Not Criminal Justice Related,200,"FAQs • I just had new sod put down, I need to water daily - ","",[],"[""Water Variances"", ""\n\u25bc\r\nWater & Wastewater\t\t"", ""High Pressure"", ""Improved Accuracy"", ""Enhanced Customer Service"", ""Irrigation Box"", ""Lake Ray Hubbard"", ""Dallas Long Range Water Supply Plan"", ""Seasonal Taste"", ""Water Variances"", ""Examples""]","[""Loading"", ""Categories"", ""Penalty Fine"", ""Penalty Fine"", ""Live Edit""]",[],[],[] -1256,https://dccouncil.gov/donation-disclosures/copy-of-april-2018-donation-disclosure-2/,Not Criminal Justice Related,200,Copy of April 2018 Donation Disclosure • Council of the District of Columbia,"","[""Copy of April 2018 Donation Disclosure""]",[],[],[],[],[] -1257,https://alpha.austin.gov/es/police-oversight/memo-changes-to-apd-impartial-attitude-and-courtesyper/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1258,https://www.santamonica.gov/press/2022/09/21/santa-monica-police-holding-motorcycle-safety-enforcement-operation-september-23-2022,Media Bulletins,200,"santamonica.gov - Santa Monica Police Holding Motorcycle Safety Enforcement Operation September 23, 2022","","[""Santa Monica Police Holding Motorcycle Safety Enforcement Operation September 23, 2022""]","[""Media Contact"", ""Categories"", ""Departments""]",[],[],[],"[""Your City Hall"", ""Latest"", ""Legal"", ""follow us""]" -1259,https://www.providenceri.gov/hr/wellness/cop-9-elements-of-longevity-flyer-10-23/,Poor Data Source,200,City of Providence CoP 9 Elements of Longevity Flyer 10.23 - City of Providence,"","[""CoP 9 Elements of Longevity Flyer 10.23""]","[""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""SIGN UP FOR OUR WEEKLY E-NEWS | \nHaga clic aqu\u00ed para espa\u00f1ol"", ""Lists*""]",[],[],[] -1260,https://delcopa.gov/planning/pdf/mapping/media.pdf,Not Criminal Justice Related,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1261,https://police.crystalmn.gov/emergency_center,Media Bulletins,200," - Emergency Center - City of Crystal-Police -","","[""Emergency Center""]",[],"[""Sign up for a city newsletter or notification."", ""Police Department"", ""Lobby Hours:""]","[""Monday - Friday""]",[],[] -1262,https://www.dps.nm.gov/blog/2021/07/07/state-police-officer-attacked-by-felon-with-a-loaded-gun-in-pecos-nm/,Media Bulletins,200,"State Police Officer Attacked by Felon with a Loaded Gun in Pecos, NM - NM Department of Public Safety","","[""State Police Officer Attacked by Felon with a Loaded Gun in Pecos, NM""]",[],"[""Location"", ""Sitemap"", ""Quick Links"", ""Social Media Links""]",[],[],[] -1263,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0473/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -1264,https://police.birminghamal.gov/bureaus/administrative/,Contact Info & Agency Meta,200,Office of Administration | Birmingham Police Department,"","[""\n\n\n Birmingham Police Department\n\n\t\t\t\t\tCommitment | Excellence | Integrity\t\t\t\t\n\n""]","[""Putting People First"", ""Office of Administration""]",[],"[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[] -1265,https://www.southamptontownnypolice.gov/faq.aspx?qid=463,Not Criminal Justice Related,200,FAQs • I am putting in a wood deck at grade. Do I need a bu,"",[],"[""\n\u25bc\r\nLand Management - Building & Zoning\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Residential Building Permit Application Checklists"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1266,https://www.goldenbeach.us/documents/reso-2034-09-authorizing-the-purchase-of-two-new-police-patrol-boat-motors/,Media Bulletins,200,RESO 2034.09 authorizing the purchase of two new police patrol boat motors – Golden Beach: A Town Unlike Any Other,"",[],[],"[""About Golden Beach"", ""Phone Numbers"", ""Town Hall ""]","[""\n\nRESO 2034.09 authorizing the purchase of two new police patrol boat motors\n(2 MB)\n""]",[],[] -1267,http://www.longbeach.gov/police/how-do-i/permits-fees-and-licensing/~/link/dea878b9816040a8afeeaa7799933a7f.aspx,Poor Data Source,200,City of Long Beach,"",[],"[""Page Not Found""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[] -1268,https://police.greenvillesc.gov/513/parking,Not Criminal Justice Related,200,"Parking | Greenville, SC - Official Website","The Parking Division, organizationally located in the Public Works Department, oversees the operation of all City garages and parking lots.","[""\r\n\r\nParking\t\t""]","[""ParkMobile"", ""HISTORIC DISTRICT PARKING PERMITS"", ""SOUTH MAIN STREET PARKING LOT OPEN"", ""Discount Parking"", ""Find Parking Downtown"", ""TEMPORARY ON-STREET PARKING APPLICATION""]","[""Loading"", ""Available Parking"", ""Contacts"", ""Quick Links"", ""Upcoming Road Closures""]","[""\r\n\t\t\t\t\tPam Corbin\r\n\t\t\t\t\t\r\n\t\t\t\t"", ""Thu Jan. 25 "", ""Sat Feb. 24 "", ""Sat Feb. 24 "", ""Sat Mar. 9 "", ""Thu Mar. 14 "", ""Fri Mar. 15 "", ""Thu Mar. 21 "", ""Fri Mar. 22 "", ""Sun Mar. 24 "", ""Thu Mar. 28 ""]",[],[] -1269,https://delcopa.gov/departments/parks/sagelife.com/plush-mills/,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1270,https://delcopa.gov/publicrelations/releases/2021/statement_capitolbuildingviolencejan6.html,Media Bulletins,200,"Delaware Council Issues Quote Addressing Violence at the Capitol Building on Jan. 6 - Delaware County, Pennsylvania","","[""Delaware Council Issues Quote Addressing Violence at the Capitol Building on Jan. 6""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1271,http://www.longbeach.gov/police/press-releases/undetermined-death2/,Media Bulletins,200,UNDETERMINED DEATH,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1272,https://police.bixbyok.gov/1260/communications,Contact Info & Agency Meta,200,"Communications | Bixby Police Department, OK","The Bixby Police Communications Division is locally maintained and monitored 24 hours a day, seven days a week including holidays.","[""\r\n\r\nCommunications\t\t""]","[""Responsibilities"", ""What to Know Before You Dial 911"", ""When To Use 911"", ""What to Not Do Regarding Dialing 911"", ""Calling 911""]","[""Loading"", ""Helpful Links"", ""FAQs"", ""Site Links""]",[],[],[] -1273,http://www.longbeach.gov/police/press-releases/murder-locust-and-12th/,Media Bulletins,200,MURDER LOCUST AND 12TH,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1274,https://ridgelandsc.gov/police-department/daily-arrest-reports-april,Poor Data Source,200,Town of Ridgeland,Town of Ridgeland,"[""Police Department""]","[""Daily Arrest Reports - April""]",[],[],[],[] -1275,https://www.sandiego.gov/department-document/copy-agreement,Poor Data Source,404,"","",,,,,, -1276,http://www.tampa.gov/police/online-reporting,Resources,200,Online Reporting | City of Tampa,IF THIS IS AN EMERGENCY PLEASE CALL 911.   Welcome to the Tampa Police Depa,"[""Online Reporting\n""]","[""Police Department"", ""\n REPORTING CRITERIA\n \u00b6"", ""\n \u200b\u200b\u200b\u200b\u200b\u200b\u200bTYPES OF CRIMES THAT CAN BE REPORTED\n \u00b6"", ""\n AFTER SUBMITTING THE REPORT\n \u00b6"", ""\n Make a Report\n \u00b6"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]","[""TYPES OF CRIMES THAT CAN BE REPORTED BUT REQUIRE ADDITIONAL FORM"", ""ADDITIONAL ITEMS YOU CAN FILE ONLINE FOR DOCUMENTATION PURPOSES""]",[],[],[] -1277,http://www.lafayettepolice.us/faq.aspx?qid=150,Not Criminal Justice Related,200,FAQs • Where do I go to apply for a Building Permit?,"",[],"[""\n\u25bc\r\nFire Department - New Construction & Addition / Remodel\t\t""]","[""Loading"", ""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1278,https://southamptontownnypolice.gov/786/2015-budgets,Poor Data Source,404,"","",,,,,, -1279,https://delcopa.gov/planning/greenspace/greenspaceroe.html,Not Criminal Justice Related,200,Delaware County Return on Environment | Planning Department,"","[""Delaware County Return on Environment Study""]",[],"[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1280,https://delcopa.gov/publicrelations/releases/2019/narcanatdccc.html,Resources,200,"Life-saving Narcan accessible in Delaware County Community College AED cabinets - Delaware County, Pennsylvania","","[""Life-saving Narcan accessible in Delaware County Community College AED cabinets""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1281,http://www.longbeach.gov/police/press-releases/spring-break-safety-tips-1-/,Media Bulletins,200,Spring Break Safety Tips(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1282,http://www.lafayettepolice.us/2319/travel,Not Criminal Justice Related,200,"Travel | Lafayette, IN - Official Website","","[""\r\n\r\nTravel\t\t""]","[""City of Orlando, FL"", ""Dream Vacations""]","[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1283,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0792/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1284,https://bouldercolorado.gov/news/boulder-police-investigating-fatal-traffic-crash-friday,Media Bulletins,200,Boulder Police Investigating a Fatal Traffic Crash Friday | City of Boulder,"","[""Boulder Police Investigating a Fatal Traffic Crash Friday\n""]","[""Breadcrumb"", ""Details"", ""Keep Reading""]","[""\nBoulder Police and Boulder County Sheriff\u2019s Office Arrest Man in Shooting Incident\n\n"", ""\nBoulder Police Investigating Fatal Traffic Crash\n\n"", ""\nBoulder Police and Fire Communications Receives National Certification\n\n"", ""\nJonBenet Ramsey Homicide Investigation Update\u2014December 2023\n\n""]",[],[],[] -1285,https://www.hayward-ca.gov/discover/news/oct16/turn-your-prescription-drugs-hayward-police-department-1022,Poor Data Source,404,"","",,,,,, -1286,https://www.lasalle-il.gov/departments/police-department/registered-sex-offenders,Sex Offender Registry,200,Registered Sex Offenders | City of La Salle,"Sex offenders residing in the City of LaSalle are required by law to register with the LaSalle Police Department.  The LaSalle Police Department was the first agency in the Illinois Valley to go beyond what is required by law.  In addition to keeping up to date files, photos and conviction records, the LaSalle Police Department verifies sex offender addresses numerous times a year to help ensure compliance.  Much of this information, including photos of registered sex offenders is available online to the general public.","[""Registered Sex Offenders\n""]","[""Main navigation"", ""Breadcrumb"", ""Main Menu"", ""Important Info""]",[],[],[],[] -1287,https://www.hayward-ca.gov/your-government/departments/police,Resources,200,Police | City of Hayward - Official website,"In partnership with the community, we will create and maintain neighborhoods capable of sustaining civic life. We commit to reducing the levels of crime, fear, and disorder through community-based, problem-oriented, and data-driven policing","[""Police""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form""]","[""Services & Programs""]","[""Department Director"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]","[""Services"", ""Programs"", ""Bryan Matthews""]","[""Office Hours"", ""Lost and found animals"", ""Obtain a dog license"", ""Report an animal emergency"", ""Report animal abuse"", ""Report animal problems (noisy, wild, stray, dead)"", ""Spay or neuter your pet"", ""Surrender your pet"", ""Volunteer at the Animal Shelter"", ""Child, youth & family counseling"", ""Youth and Family Services Bureau"", ""Compliment an officer"", ""File a police report"", ""Police recruitment and employment"", ""Report neighborhood drug activity"", ""Request a police ride along"", ""Request a police station tour"", ""Request copies of police reports"", ""Report a traffic problem"", ""Report/prevent identity theft"", ""Sign up for Hayward Neighborhood Alert"", ""Adopt an animal"", ""Traffic accident investigation and reports"", ""Submit a Public Records Act Request to the Hayward Police Department"", ""Report an abandoned/inoperable vehicles on a public street"", ""Report Illegal Fireworks"", ""Make a donation to the Hayward Animal Shelter"", ""Hayward Evaluation And Response Teams (HEART) Program"", ""Resources for victims of domestic violence & human trafficking"", ""Crisis hotlines"", ""Sign-up to receive emergency alerts from the City, Fire and Police departments"", ""Find crime prevention resources & tips""]" -1288,https://delcopa.gov/courts/judges/brennan.html,Contact Info & Agency Meta,200,Judge Mary Alice Brennan - Delaware County Court of Common Pleas,"","[""Judge Mary Alice Brennan""]",[],"[""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[] -1289,https://delcopa.gov/publicrelations/releases/2021/covid_popupvaccinationprogram.html,Not Criminal Justice Related,200,"Delaware County Launches Pop-Up COVID-19 Vaccination Program - Delaware County, Pennsylvania","","[""Delaware County Launches Pop-Up COVID-19 Vaccination Program""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Mobile Vaccination Team to Visit Municipalities throughout the County""]",[],[] -1290,https://delcopa.gov/publicrelations/releases/2022/gwhgraduation.html,Media Bulletins,200,"George W. Hill Correctional Facility Training Academy Graduates 16 New Correctional Officers - Delaware County, Pennsylvania","","[""George W. Hill Correctional Facility Training Academy Graduates 16 New Correctional Officers""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1291,https://www.southamptontownnypolice.gov/faq.aspx?qid=373,Not Criminal Justice Related,200,FAQs • Should I have multiple phone numbers on file with my ,"",[],"[""\n\u25bc\r\nComptroller - Alarm Billing\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1292,https://pittsburghpa.gov/files/police/orders/ch1/16-01-standards-of-conduct.pdf,Poor Data Source,404,"","",,,,,, -1293,http://police.portlandmaine.gov/1167/ocean-gateway,Not Criminal Justice Related,200,"Ocean Gateway | Portland, ME - Official Website",Ocean Gateway,"[""Ocean Gateway""]",[],[],[],[],[] -1294,https://www.ci.san-bernardino.ca.us/news/archived_news/downtown_specific_plan_scoping_meeting,Not Criminal Justice Related,200," - Downtown Specific Plan Scoping Meeting - City of San Bernardino -","","[""City of San Bernardino California""]","[""Downtown Specific Plan Scoping Meeting""]",[],[],[],[] -1295,http://www.longbeach.gov/police/press-releases/traffic-fatality---burnett-street-and-pacific-avenue/,Media Bulletins,200,TRAFFIC FATALITY - BURNETT STREET AND PACIFIC AVENUE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1296,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/011322blotter.pdf,Media Bulletins,404,"","",,,,,, -1297,https://alpha.austin.gov/police-oversight/formal-complaint-incident-reporting-and-other-policy-violations/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1298,http://www.longbeach.gov/police/press-releases/reward-issued-in-2013-murder-investigation/,Media Bulletins,200,REWARD ISSUED IN 2013 MURDER INVESTIGATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1299,http://chico.ca.us/post/chico-police-utilize-grant-money-dui-enforcement,Media Bulletins,404,"","",,,,,, -1300,https://www.southamptontownnypolice.gov/faq.aspx?qid=400,Not Criminal Justice Related,200,FAQs • Why do some homeowners have a pathway through the mid,"",[],"[""\n\u25bc\r\nTrustees - Endangered Species\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1301,https://hilliardohio.gov/hilliard-officer-named-central-ohios-top-cop/,Poor Data Source,404,"","",,,,,, -1302,https://www.knoxvilletn.gov/government/city_departments_offices/police_department/field_operations_bureau/inspections_unit/taxi_limo_services/application_for_certificate_of_public_convenience_and_necessity___p_d_f_,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1303,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/041222blotter.pdf,Poor Data Source,404,"","",,,,,, -1304,http://www.longbeach.gov/police/press-releases/halloween-safety-tips2/,Media Bulletins,200,HALLOWEEN SAFETY TIPS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1305,https://delcopa.gov/employment/jobpostings/clerical.html,Training & Hiring Info,200,"Blank - Delaware County, Pennsylvania","","[""Clerical""]",[],"[""Delco Jobs Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Clerical""]",[],[] -1306,https://alpha.austin.gov/police-oversight/body-worn-cameras-and-dashboard-cameras-final-recommendations-report/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1307,https://delcopa.gov/vote/news/20nov5update.html,Not Criminal Justice Related,200,"Nov. 5th 3pm update from the Delaware County Bureau of Elections - Delaware County, Pennsylvania","","[""Nov. 5th 3pm update from the Delaware County Bureau of Elections""]",[],"[""Delco Votes!"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1308,https://londonky.gov/london-police-promote-officers/,Personnel Records,200,"London Police Promote Officers – City of London, Kentucky","","[""\n\n\t\t\t\t\t\tLondon Police Promote Officers\t\t\t\t\t\n\t\t\t\t\t""]",[],"[""Search"", ""Archive"", ""About London"", ""London City Hall""]",[],"[""Sign In"", ""Lost Password""]",[] -1309,http://www.cityofpataskalaohio.gov/cop_folder/minutes-2015/,List of Data Sources,200,Minutes 2015 - City Of Pataskala,Official Website,"[""\n\t\t\t\tCity Of Pataskala\t\t\t"", ""\n Minutes 2015\t\t\t\t""]","[""\n\t\t\t\tOfficial Website\t\t\t""]",[],[],[],[] -1310,https://www.sandiego.gov/police/recruiting/volunteer/sddcrt-application-submit,Poor Data Source,200,SDCCRT Program Application Submitted | City of San Diego Official Website,"","[""City of San Diego Official Website"", ""SDCCRT Program Application Submitted""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Join Us"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -1311,https://police.greenvillesc.gov/653/benefits-and-incentives-for-firefighters,Not Criminal Justice Related,200,"Benefits and Incentives for Firefighters | Greenville, SC - Official Website","View medical, holiday, and retirement benefits for Greenville firefighters.","[""\r\n\r\nBenefits and Incentives for Firefighters\t\t""]","[""Equipment Incentives"", ""Compensation Incentives""]","[""Loading"", ""Contact Us""]","[""Human Resources""]",[],[] -1312,http://www.longbeach.gov/police/press-releases/buzzed-driving-is-drunk-driving/,Media Bulletins,200,Buzzed Driving Is Drunk Driving,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1313,https://www.southamptontownnypolice.gov/1450/southampton-village---agawam-pond-phase-,Not Criminal Justice Related,-1,"","",,,,,, -1314,https://www.mass.gov/info-details/situational-analysis-of-municipal-police-in-service-training-in-the-commonwealth,Training & Hiring Info,200,Situational Analysis of Municipal Police In-Service Training in the Commonwealth | Mass.gov,An overview of the history and current state of municipal police in-service training in Massachusetts,"[""\nSituational Analysis of Municipal Police In-Service Training in the Commonwealth\n""]","[""Table of Contents\n for the report, Municipal Police In-Service Training: Funding and Cooperation across the Commonwealth"", ""Appendix\n "", ""Table of Contents"", ""1. Municipal Police Training and the Municipal Police Training Committee: An Introduction\n "", ""2. Legal and Legislative Analysis\n "", ""3. MPTC Training Sources \n "", ""4. Finance\n "", ""Help Us Improve Mass.gov with your feedback""]","[""New Recruit Training"", ""In-Service Training"", ""Specialized Training"", ""Other Legislative Requirements"", ""Liability for Failure to Train"", ""MPTC-Authorized Police Academies"", ""\u00a0"", ""Other Training Sources""]",[],[],[] -1315,https://detroitmi.gov/es/departments/aeropuerto-internacional-coleman-young/mi-vuelo-paseos-en-helicoptero,Poor Data Source,200,Mi Vuelo Paseos en Helicóptero | City of Detroit,"Fundada en Metro-Detroit en 2016 en el aeropuerto Coleman A. Young, My Flight Tours se ha expandido mucho más allá del área de Detroit y en algunos de los destinos turísticos más populares de Michigan y más allá. Con la mayor cantidad de ubicaciones en todo el estado, My Flight Tours es el operador turístico más grande de Michigan. My Flight fue fundado por un joven empresario con el fin de compartir su pasión y amor por el vuelo con otros, notó la necesidad en el mercado de viajes en helicóptero asequibles y familiares. Esta es exactamente la experiencia que aún brindamos a nuestros clientes en la actualidad. Nuestros recorridos turísticos en helicóptero brindan a los clientes una vista panorámica única de Michigan con comodidad y estilo. El compromiso de My Flight Tours con el servicio al cliente solo se compara con su compromiso con la seguridad. Con la seguridad al frente de nuestra operación, My Flight se enorgullece de tener un registro de CERO accidentes e incidentes. Este logro habla de la dedicación continua tanto al mantenimiento como a la capacitación en seguridad. El equipo de My Flight supera con creces las expectativas de cualquier otro operador turístico en helicóptero. Saludan personalmente a cada pasajero, brindan una orientación completa del vuelo antes de la salida e interactúan con los invitados en cada paso del camino. Nuestro equipo es la cara de My Flight y los pasajeros a menudo acreditan su experiencia memorable a nuestro equipo y lo más destacado de su vuelo. Con nuestro inigualable servicio al cliente, los pilotos más capacitados, los más altos estándares de seguridad y opciones únicas de recorridos que se expanden continuamente, My Flight sigue siendo líder en la industria de recorridos turísticos en helicóptero. My Flight presta servicios a aproximadamente 30 clientes por día. My Flight Helicopter Tours My Flight Helicopter Tours 2","[""\nMi Vuelo Paseos en Helic\u00f3ptero\n""]","[""Top Links"", ""Site Menu"", ""Documentos""]",[],"[""CONTACTOS"", ""MEN\u00da DE DEPARTAMENTO""]","[""My Flight One year""]",[] -1316,https://www.providenceri.gov/police/providence-police-recruitment-application/clements_e-sig/,Poor Data Source,200,City of Providence clements_e-sig - City of Providence,"","[""clements_e-sig""]","[""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""SIGN UP FOR OUR WEEKLY E-NEWS | \nHaga clic aqu\u00ed para espa\u00f1ol"", ""Lists*""]",[],[],[] -1317,https://www.lakewoodoh.gov/coffee-with-a-cop-set-for-may-4th/,Not Criminal Justice Related,200,"Coffee with a Cop set for May 4th | The City of Lakewood, Ohio","The Lakewood Police Department will host another ""Coffee With A Cop"" event on Wednesday, May4, 2022 from 9:00 a.m. to 11:00 1.m. at The Doughnut Pantry, 14600","[""Coffee with a Cop set for May 4th""]",[],"[""Recent News"", ""Upcoming Events"", ""Most Popular Pages""]",[],[],[] -1318,https://bolivar.mo.us/shop-with-a-copr/img_1293-2/,Poor Data Source,200,"IMG_1293 - City of Bolivar, Missouri","","[""IMG_1293""]",[],[],[],[],[] -1319,http://www.longbeach.gov/police/press-releases/september-is-california-pedestrian-safety-month/,Media Bulletins,200,SEPTEMBER IS CALIFORNIA PEDESTRIAN SAFETY MONTH,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1320,https://www.mass.gov/regulations/118-cmr-100-scope-and-authority,Court Cases,200,118 CMR 1.00: Scope and authority | Mass.gov,"118 CMR establishes the procedures and standards the Commission utilizes to effectuate the purposes of the Commission including, but not limited to, the investigation and remediation of abuse of persons with disabilities who reside in the Commonwealth of Massachusetts, or of nonresident persons with disabilities who are abused while in the Commonwealth of Massachusetts, the investigation and remediation of instances of retaliation against a person for having reported such abuse or cooperated in the investigation of abuse, and the administration of the registry of care providers against whom the Commission has made a substantiated finding of registrable abuse. Download a PDF copy of the regulation below.","[""\nRegulation\u00a0\n 118 CMR 1.00: Scope and authority\n ""]","[""Table of Contents\n for the law library, 118 CMR"", ""Contact for 118 CMR 1.00: Scope and authority"", ""Table of Contents"", ""Downloads\n for 118 CMR 1.00: Scope and authority"", ""Contact\n for 118 CMR 1.00: Scope and authority"", ""Contact for 118 CMR 1.00: Scope and authority"", ""Help Us Improve Mass.gov with your feedback""]","[""\n Trial Court Law Libraries\n "", ""\n Trial Court Law Libraries\n "", ""\n Trial Court Law Libraries\n ""]","[""\n\nOnline\n"", ""\n\nOnline\n"", ""\n\nOnline\n""]",[],[] -1321,https://southamptontownnypolice.gov/faq.aspx?qid=490,Resources,200,FAQs • When will the beach be open?,"",[],"[""\n\u25bc\r\nParks & Rec\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1322,http://www.longbeach.gov/police/press-releases/l.b.p.d2.-promotes-new-leaders/,Media Bulletins,200,L.B.P.D. PROMOTES NEW LEADERS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1323,https://police.greenvillesc.gov/faq.aspx?qid=598,Resources,200,FAQs • Who is facilitating the event?,"",[],"[""\n\u25bc\r\nProject Safe Neighborhoods\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -1324,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/080521blotter.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -1325,https://www.poconopa.gov/police/,Contact Info & Agency Meta,200,Police | Pocono Township,"",[],"[""\n\n\n\n Police Department \n"", ""\n\n\n\n\n Programs & Services \n"", ""\n\n\n\n\n FAQ \n""]","[""Contact Info"", ""Mission Statement"", ""Department Roster"", ""Detective Division"", ""Patrol Division"", ""\""We Care\"" Program"", ""Drug Collection Unit"", ""Vacation Property Checks "", ""Right To Know Request"", ""Quick Links""]",[],"[""Hours of Operation:"", ""James Wagner"", ""Eric Rath"", ""Laura J. Fluegel"", ""Jill Kozic"", ""James Wagner"", ""Earl Ackerman"", ""Michael Scicutella"", ""Douglas Smith"", ""Aaron Anglemyer"", ""Austin Anglemyer"", ""James Scott"", ""Christopher Gupko"", ""Marc Iannazzo"", ""Larry Miller "", ""Ryan Melley"", ""Joseph Bianchi "", ""Raymond Kuehner"", ""Christopher Chiusano"", ""Thomas Moser"", ""Devin Dehart"", ""Liam Rebetje"", ""Alex Bagley"", ""Kylie Tausendfreundt"", ""\n\n\n\n What do I do about Abandoned Vehicles "", ""\n\n\n\n What are The Directions to Pocono Township Police Department?\u2029 "", ""\n\n\n\n Where do I get information for non-criminal Finger Printing? "", ""\n\n\n\n How do I make a Police Report? "", ""\n\n\n\n How do I obtain a Copy of a Police Report? "", ""\n\n\n\n How do I obtain a Copy of an Accident Report? "", ""\n\n\n\n Do I have to register my alarm system? "", ""\n\n\n\n How do I register my alarm system? "", ""\n\n\n\n Where do I pay my ticket? ""]",[] -1326,https://cityofyuma.colorado.gov/departments/emergency-services/police-department/police-department-staff,Personnel Records,200,Police Department Staff | City of Yuma,                   ,"[""\nPolice Department Staff\n""]","[""Police Department Staff""]","[""\n\n\n\n Police Chief Jerry Thompson\n \n\n"", ""\n\n\n\n Sergeant James Thomson\n \n\n"", ""\n\n\n\n Sergeant Curtis Witte\n \n\n"", ""\n\n\n\n Patrol Officer Cameron Josh \n \n\n"", ""\n\n\n\n Patrol Officer Patrick Laybourn \n \n\n""]",[],[],[] -1327,https://delcopa.gov/council/newsletter/index.html,Not Criminal Justice Related,200,"The Delaware County Weekly Newsletter - Delaware County, Pennsylvania","","[""The Delaware County Weekly Newsletter""]",[],"[""County Council Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""THE DELAWARE COUNTY WEEKLY"", ""January 2024 Editions"", ""December 2023 Editions"", ""November 2023 Editions"", ""October 2023 Editions"", ""September 2023 Editions"", ""August 2023 Editions"", ""July 2023 Editions"", ""June 2023 Editions"", ""May 2023 Editions"", ""April 2023 Editions"", ""March 2023 Editions"", ""February 2023 Editions"", ""January 2023 Editions""]",[],[] -1328,http://www.longbeach.gov/police/press-releases/murder---3100-block-e-artesia-blvd/,Media Bulletins,200,MURDER,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1329,https://www.memphistn.gov/news/wpfd_file/resolution-requesting-the-memphis-police-department-to-enforce-the-curfews-of-the-child-curfew-act-of-1995-and-work-with-the-city-of-memphis-administration-on-a-proposal-for-a-designated-curfew-center/,Poor Data Source,404,"","",,,,,, -1330,https://police.bixbyok.gov/faq.aspx?qid=94,Resources,200,FAQs • How do I find out if I or someone else has a warrant?,"",[],"[""\n\u25bc\r\nPolice\t\t"", ""Hours of Operations""]","[""Loading"", ""Categories"", ""Live Edit"", ""Helpful Links"", ""FAQs"", ""Site Links""]",[],[],[] -1331,https://cityofyuma.colorado.gov/departments/emergency-services/police-department/police-department-fees,Resources,200,Police Department Fees | City of Yuma,"","[""\nPolice Department Fees\n""]",[],"[""\nFee Schedule \n""]",[],[],[] -1332,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0182/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1333,http://www.longbeach.gov/police/press-releases/juvenile-investigations-operation-results-in-6-arrests/,Media Bulletins,200,JUVENILE INVESTIGATIONS OPERATION RESULTS IN 6 ARRESTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1334,https://www.mass.gov/regulations/700-cmr-600-use-of-road-flaggers-and-police-details-on-public-works-projects,Misc Police Activity,200,700 CMR 6.00: Use of road flaggers and police details on public works projects | Mass.gov,"700 CMR 6.00 ensures the safety of pedestrians, motorists, bicyclists, and workers on, or near, a Public Works Projects and reduces overall costs through the effective use of Traffic Control Devices, Road Flaggers, and Police Details and through the efficient expenditure of public funds. Download a PDF copy of the regulation below.","[""\nRegulation\u00a0\n 700 CMR 6.00: Use of road flaggers and police details on public works projects\n ""]","[""Table of Contents\n for the law library, 700 CMR"", ""Contact for 700 CMR 6.00: Use of road flaggers and police details on public works projects"", ""Table of Contents"", ""Downloads\n for 700 CMR 6.00: Use of road flaggers and police details on public works projects"", ""Contact\n for 700 CMR 6.00: Use of road flaggers and police details on public works projects"", ""Contact for 700 CMR 6.00: Use of road flaggers and police details on public works projects"", ""Help Us Improve Mass.gov with your feedback""]","[""\n Trial Court Law Libraries\n "", ""\n Trial Court Law Libraries\n "", ""\n Trial Court Law Libraries\n ""]","[""\n\nOnline\n"", ""\n\nOnline\n"", ""\n\nOnline\n""]",[],[] -1335,https://delcopa.gov/publicrelations/releases/2020/passportservicesresumejuly6.html,Not Criminal Justice Related,200,"Delaware County will be resuming passport services on July 6 - Delaware County, Pennsylvania","","[""Delaware County will be resuming passport services on July 6""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1336,http://www.longbeach.gov/police/press-releases/lbpd-swat-officers-shot-at-during-search-warrant-service/,Media Bulletins,200,LBPD SWAT OFFICERS SHOT AT DURING SEARCH WARRANT SERVICE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1337,https://www.lynchburgvapolice.gov/resources/,Resources,200,Resources - Lynchburg Police Department,"","[""Resources""]",[],"[""Below are some additional resources and links to our community partners.""]","[""Contact Us"", ""Site Links"", ""Site Links""]",[],"[""Lynchburg Police Foundation\u00a0"", ""Office of the Commonwealth\u2019s Attorney"", ""Central Virginia Crime Stoppers Tip Line"", ""Lynchburg Redevelopment and Housing Authority"", ""Police to Citizen \u2013 online reporting\u00a0"", ""Horizon Behavioral Health"", ""Department of Social Services\u00a0"", ""Lynchburg Community Action Group\u00a0"", ""Lynchburg General District Court"", ""Lynchburg Circuit Court\u00a0"", ""Lynchburg Juvenile and Domestic Relations Court\u00a0"", ""Ring Neighborhood Portal"", ""City of Lynchburg"", ""Citizens First Information Center \u2013 City of Lynchburg""]" -1338,https://delcopa.gov/planning/pubs/delco2035/historicplan.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1339,https://spdblotter.seattle.gov/2021/01/27/police-arrest-u-district-rape-suspect/,Media Bulletins,200,Police Arrest U-District Rape Suspect - SPD Blotter,"","[""Police Arrest U-District Rape Suspect""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -1340,https://beaumonttexas.gov/beaumont-police-investigating-overnight-shooting-at-2550-ih-10-east/,Poor Data Source,404,"","",,,,,, -1341,https://ose.louisiana.gov/event/police-communications-officer-ii/,Poor Data Source,200,Police Communications Officer II | Louisiana Office of State Examiner,"","["""", ""Police Communications Officer II""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -1342,http://www.longbeach.gov/police/how-do-i/prevent-crime/general-guidelines-for-retail-stores/,Resources,200,General Guidelines for Retail Stores,"

GENERAL GUIDELINES FOR RETAIL STORES -   - Implementing these safety recommendations will make your business ""crime unfriendly."" Remember, most crimes are crimes of opportunity...don't allow your business to be an easy target! - - Lighting is an important factor to consider when crime-proofing your business

","[""Police Department""]","[""GENERAL GUIDELINES FOR RETAIL STORES""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""How To Prevent Crime"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", ""\u00a0"", ""\u00a0\u00a0"", ""\u00a0"", ""Crime Lab Survey"", ""\u00a0""]",[] -1343,https://alpha.austin.gov/es/police-oversight/2020-06-17-7/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1344,http://www.lafayettepolice.us/faq.aspx?qid=68,Not Criminal Justice Related,200,"FAQs • How do I dispose of large items like carpet, sinks, s","",[],"[""\n\u25bc\r\nSanitation Department\t\t""]","[""Loading"", ""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1345,https://www.mass.gov/info-details/audit-of-mount-wachusett-community-college-objectives-scope-and-methodology,Not Criminal Justice Related,200,"Audit of Mount Wachusett Community College Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing Mount Wachusett Community College.,"[""\nAudit of Mount Wachusett Community College Objectives, Scope, and Methodology\n""]","[""Table of Contents\n for the audit, Audit of Mount Wachusett Community College"", ""Table of Contents"", ""Overview \n "", ""Data Reliability\n "", ""Practicum Course Registration\n "", ""Auxiliary Services Operations\n "", ""Strategic Plan\n "", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -1346,http://lafayettepolice.us/faq.aspx?qid=80,Resources,200,FAQs • How do I obtain a handgun permit?,"",[],"[""\n\u25bc\r\nPolice\t\t""]","[""Loading"", ""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1347,https://columbiacitypolice.us/photos/group 2017.jpg,Poor Data Source,200,"","",[],[],[],[],[],[] -1348,https://police.greenvillesc.gov/faq.aspx?qid=140,Resources,200,FAQs • What have I been charged with?,"",[],"[""\n\u25bc\r\nMunicipal Court - General Legal Questions\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -1349,https://www.coronadelmar.us/newport-beach-mourns-locals-killed-in-helicopter-crash/,Not Criminal Justice Related,200,Newport Beach Mourns Locals Killed in Helicopter Crash | Corona del Mar California,"","[""Newport Beach Mourns Locals Killed in Helicopter Crash""]","[""Menu"", "" Be First to Comment"", ""Subscribe"", """", """"]","[""Share this:"", ""Like this:"", ""Related"", ""Leave a Reply Cancel reply"", """"]",[],[],[] -1350,https://www.mass.gov/doc/municipal-police-training-committee-meeting-minutes-091521/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -1351,https://www.madera.gov/tr-accordion/police-programs/,Not Criminal Justice Related,-1,"","",,,,,, -1352,https://mountpocono-pa.gov/question/how-do-i-reach-the-police-department-with-a-non-emergency/,Contact Info & Agency Meta,200,"How do I reach the police department with a non emergency? - Mount Pocono, PA","","[""How do I reach the police department with a non emergency?""]","[""Action toolbar"", ""Primary menu links"", ""Welcome"", ""Engage"", ""Help""]",[],[],[],[] -1353,https://champaignil.gov/2021/04/03/champaign-police-investigating-overnight-shooting-2/,Media Bulletins,200,Champaign Police Investigating Overnight Shooting - City of Champaign,"","[""Champaign Police Investigating Overnight Shooting""]","[""News Releases"", ""Department News""]",[],[],[],[] -1354,https://alpha.austin.gov/en/police-oversight/2020-11-01/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1355,https://southamptontownnypolice.gov/256/town-law-200-procedure,Resources,200,"Town Law 200 Procedure | Southampton, NY - Official Website",Learn about the procedure of the town law 200.,"[""\r\n\r\nTown Law 200 Procedure\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]",[],[],[] -1356,https://www.somervillema.gov/news/femino-named-interim-acting-chief-police,Personnel Records,200,FEMINO NAMED INTERIM ACTING CHIEF OF POLICE | City of Somerville,"SOMERVILLE - Mayor Joseph A. Curtatone announced today that Somerville Police Captain Charles Femino has agreed to serve as the Interim Acting Chief of Police beginning on Dec. 1, 2013, until a permanent replacement is found for departing Chief Thomas Pasquarello.  ","[""\nFEMINO NAMED INTERIM ACTING CHIEF OF POLICE\n""]","[""Captain Charles Femino current Chief of Detectives, with department since 1984""]","[""Feedback"", ""Download Mobile Apps"", ""Sign up for City eNews"", ""Connect With Us""]",[],[],[] -1357,https://police.greenvillesc.gov/faq.aspx,Resources,200,"FAQs • Greenville, SC • CivicEngage","",[],"[""\n\u25bc\r\nAffordable Housing\t\t"", ""\n\u25bc\r\nAnimal Control\t\t"", ""\n\u25bc\r\nBusiness Licenses - Fees\t\t"", ""\n\u25bc\r\nBusiness Licenses - General\t\t"", ""\n\u25bc\r\nBusiness Licenses - Penalties\t\t"", ""\n\u25bc\r\nClemson MBA Fireworks on the Fourth\t\t"", ""\n\u25bc\r\nComposting\t\t"", ""\n\u25bc\r\nCOVID-FAQs-Intranet\t\t"", ""\n\u25bc\r\nCultural Corridor\t\t"", ""\n\u25bc\r\nFlashing Yellow Left-Turn Signals\t\t"", ""\n\u25bc\r\nGreenlink\t\t"", ""\n\u25bc\r\nGreenlink Art Contest\t\t"", ""\n\u25bc\r\nGreenville Development Code\t\t"", ""\n\u25bc\r\nGreenville Jazz Fest\t\t"", ""\n\u25bc\r\nGvl2040 Comprehensive Plan\t\t"", ""\n\u25bc\r\nGVL2040 Comprehensive Plan - Report to the Community FAQs\t\t"", ""\n\u25bc\r\nHistoric Resources Survey\t\t"", ""\n\u25bc\r\nIce on Main\t\t"", ""\n\u25bc\r\nMiguel Rosales Interview\t\t"", ""\n\u25bc\r\nMoonlight Movies\t\t"", ""\n\u25bc\r\nMunicipal Court - Appeals & Records for Reconsideration\t\t"", ""\n\u25bc\r\nMunicipal Court - Community Service\t\t"", ""\n\u25bc\r\nMunicipal Court - Court Appearances\t\t"", ""\n\u25bc\r\nMunicipal Court - Criminal Domestic Violence Program\t\t"", ""\n\u25bc\r\nMunicipal Court - Driver's License Issues\t\t"", ""\n\u25bc\r\nMunicipal Court - Financial, Fines & Fees\t\t"", ""\n\u25bc\r\nMunicipal Court - General\t\t"", ""\n\u25bc\r\nMunicipal Court - General Legal Questions\t\t"", ""\n\u25bc\r\nMunicipal Court - House Arrest\t\t"", ""\n\u25bc\r\nMunicipal Court - Jail\t\t"", ""\n\u25bc\r\nMunicipal Court - Judicial Communications\t\t"", ""\n\u25bc\r\nMunicipal Court - Records & Warrants\t\t"", ""\n\u25bc\r\nMunicipal Court - Restraining Orders, Orders of Protection, Harassment\t\t"", ""\n\u25bc\r\nPlanning & Zoning \t\t"", ""\n\u25bc\r\nPolice Department\t\t"", ""\n\u25bc\r\nPolice Mediation\t\t"", ""\n\u25bc\r\nProject Safe Neighborhoods\t\t"", ""\n\u25bc\r\nRecreation - Pickleball\t\t"", ""\n\u25bc\r\nRecycling\t\t"", ""\n\u25bc\r\nRight of Way & Trees\t\t"", ""\n\u25bc\r\nSanitary Sewer\t\t"", ""\n\u25bc\r\nShort-Term Rentals\t\t"", ""\n\u25bc\r\nSound Check\t\t"", ""\n\u25bc\r\nStorm Water\t\t"", ""\n\u25bc\r\nStreets & Sidewalks\t\t"", ""\n\u25bc\r\nSwamp Rabbit Trail\t\t"", ""\n\u25bc\r\nTuition Reimbursement\t\t"", ""\n\u25bc\r\nUnity Park Open\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -1358,"https://norfolkne.gov/government/departments/police-division/press-releases/january-4,-2021-press-release.html",Media Bulletins,200,"January 4, 2021 Press Release - City of Norfolk, NE","","[""City of Norfolk, NE"", ""Police Division"", ""January 4, 2021 Press Release""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]" -1359,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-42-permanent-rank-sergeant-payment-employees-represented-nys-police,Media Bulletins,200,State Police Bulletin No. SP-42 | Office of the New York State Comptroller,To notify the Division of State Police of the procedure for processing the 2001-2002 payment,"[""\nState Police Bulletin No. SP-42\n"", "" ""]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Payment Date(s)"", ""Contract Provision and Eligibility Criteria"", ""Agency Processing Instructions"", ""Payroll Register and Employees Check/Advice"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[] -1360,https://www.mass.gov/doc/municipal-police-training-committee-mptc-meeting-agenda-71719/download,Misc Police Activity,200,"","",[],[],[],[],[],[] -1361,http://www.ryepolice.us/logs/police-logs-for-12517-13117,Daily Activity Logs,200,Rye Police Department Police Logs for 1/25/17-1/31/17 - Rye Police Department,"","[""Police Logs for 1/25/17-1/31/17""]","[""Police Logs for 1/25/17-1/31/17""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -1362,https://police.greenvillesc.gov/994/crisis-intervention,Resources,200,"Crisis Intervention Team (CIT) | Greenville, SC - Official Website",Information about the Police Department's Crisis Intervention Team,"[""\r\n\r\nCrisis Intervention Team (CIT)\t\t""]",[],"[""Loading"", ""Officer Participation""]",[],[],[] -1363,https://alvordtx.gov/question/how-can-i-obtain-a-copy-of-the-municipal-codes/,Resources,200,"How can I obtain a copy of the municipal codes? - Alvord, TX","","[""How can I obtain a copy of the municipal codes?""]","[""Primary menu links"", ""Action toolbar"", ""Welcome"", ""Engage"", ""Help""]",[],[],[],[] -1364,http://www.longbeach.gov/police/press-releases/murder-investigation---wardlow--orange/,Media Bulletins,200,*UPDATE* REWARD ISSUED IN MURDER INVESTIGATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1365,https://louisvilleky.gov/news/louisville-metro-police-foundation-endorses-louisville-affordable-housing-trust-fund,Not Criminal Justice Related,403,"","",,,,,, -1366,http://www.longbeach.gov/police/press-releases/murder-1600-block-of-pine-avenue/,Media Bulletins,200,Murder (1600 Block of Pine Avenue),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1367,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0415/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1368,https://delcopa.gov/publicrelations/releases/18pdfs/18emergencypreparednessmonth.pdf,Media Bulletins,200,"","",[],[],[],[],[],[] -1369,http://lafayettepolice.us/773/foam-systems,Not Criminal Justice Related,200,"Foam Systems | Lafayette, IN - Official Website",Fire fighting foam systems suppress fire by separating the fuel from the air (oxygen).,"[""\r\n\r\nFoam Systems\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1370,https://www.newarknj.gov/news/mayor-ras-j-barakas-statement-on-appointment-of-brian-ohara-as-deputy-mayor-of-strategic-initiatives-for-police-services-public-safety,Personnel Records,200,News: MAYOR RAS J. BARAKA’S STATEMENT ON APPOINTMENT OF BRIAN O’HARA AS DEPUTY MAYOR OF STRATEGIC INITIATIVES FOR POLICE SERVICES/PUBLIC SAFETY,"Official Page of Newark, NJ News: MAYOR RAS J. BARAKA’S STATEMENT ON APPOINTMENT OF BRIAN O’HARA AS DEPUTY MAYOR OF STRATEGIC INITIATIVES FOR POLICE SERVICES/PUBLIC SAFETY","[""City of"", ""NEWARK"", ""June 30, 2022"", ""MAYOR RAS J. BARAKA\u2019S STATEMENT ON APPOINTMENT OF BRIAN O\u2019HARA AS DEPUTY MAYOR OF STRATEGIC INITIATIVES FOR POLICE SERVICES/PUBLIC SAFETY "", ""City of"", ""NEWARK""]","[""News"", ""Mayor Ras j baraka""]",[],[],[],[] -1371,https://mtcb.colorado.gov/departments-services/police,Contact Info & Agency Meta,200,Police | Town of Mt. Crested Butte,"The Mt. Crested Butte Police Department's goal is to create and sustain a safe and relaxed environment within our jurisdiction. Through education, enforcement, investigation, and cooperation with our community Mt. CB PD helps address crime, road safety, and other quality of life issues ensuring a safe and friendly experience for guests and locals alike.","[""\nPolice\n""]",[],"[""\n"", ""\n"", ""\n"", """"]",[],[],[] -1372,http://www.lafayettepolice.us/725/fireworks-safety,Not Criminal Justice Related,200,"Fireworks Safety | Lafayette, IN - Official Website",Find the rules for using fireworks in the City limits of Lafayette.,"[""\r\n\r\nFireworks Safety\t\t""]",[],"[""Loading"", ""Quick Links"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1373,https://www.cityofrc.us/public-safety/police/crime-mapping,Crime Maps & Reports,200,Crime Mapping | City of Rancho Cucamonga,"","[""Crime Mapping\n""]","[""Utility Menu"", ""Breadcrumb"", ""Footer Menu"", ""Main navigation""]",[],[],[],[] -1374,https://delcopa.gov/courts/pdf/jd/2017preareport.pdf,Annual & Monthly Reports,200,"","",[],[],[],[],[],[] -1375,https://delcopa.gov/publicrelations/releases/2020/pdf/govwolf_indoorrestaurants50percent.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1376,http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-8-/,Media Bulletins,200,DUI-DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND(8),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1377,https://delcopa.gov/prison/pdfs/wardereports/2021/wardensreportmay2021.pdf,Annual & Monthly Reports,200,"","",[],[],[],[],[],[] -1378,https://www.goldenbeach.us/documents/resolution-2219-12-authorizing-the-participation-in-a-lease-agreement-for-two-police-motorcycles/,Policies & Contracts,200,RESO 2219.12 Authorizing the participation in a lease agreement for two police motorcycles – Golden Beach: A Town Unlike Any Other,"",[],[],"[""About Golden Beach"", ""Phone Numbers"", ""Town Hall ""]","[""\n\nRESO 2219.12 Authorizing the participation in a lease agreement for two police motorcycles\n(65 kB)\n""]",[],[] -1379,https://felton.delaware.gov/police/request-for-security-check-form/,Resources,200,Request for Security Check Form - Town of Felton,"","[""Felton""]","[""Delaware"", ""Request for Security Check Form""]","[""Menu"", ""Contact Us"", ""\""A Great Delaware Small Town\""""]",[],[],[] -1380,https://delcopa.gov/publicrelations/releases/2021/covid_jan15update.html,Not Criminal Justice Related,200,"Jan. 15 Update on COVID-19 Vaccinations in Delaware County - Delaware County, Pennsylvania","","[""Jan. 15 Update on COVID-19 Vaccinations in Delaware County""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Phase 1B now includes residents age 65 years and older""]",[],[] -1381,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0391/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1382,https://www.southamptontownnypolice.gov/1084/ia-owts-requirements,Not Criminal Justice Related,200,"I/A OWTS Requirements | Southampton, NY - Official Website",Innovative and Alternative On-Site Wastewater Treatment System (I/A OWTS) Requirements ,"[""\r\n\r\nI/A OWTS Requirements\t\t""]","[""Innovative and Alternative On-Site Wastewater Treatment System (I/A OWTS) Requirements""]","[""Loading"", ""Site Tools"", ""Additional Water Quality Information"", ""Contact Us"", ""Site Links""]",[],[],[] -1383,https://brookfieldil.gov/publication/special-fire-police-commission-meeting-august-23-2017/,Poor Data Source,404,"","",,,,,, -1384,https://delcopa.gov/employment/jobpostings/caseworker2_oid.html,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1385,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/022621blotter.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -1386,http://police.portlandmaine.gov/660/cdbg-priority-task-force,Not Criminal Justice Related,200,"CDBG Priority Task Force | Portland, ME - Official Website",This group's focus is on reevaluating the Community Development Block Grant priorities.,"[""CDBG Priority Task Force""]",[],[],[],[],[] -1387,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0756/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1388,https://alpha.austin.gov/es/police-oversight/indefinite-suspension-of-officer-jordan-wagstaff/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1389,https://port-orange.us/2013/08/07/volusia-co-sheriffs-helicopter-makes-emergency-landing-on-beach/,Media Bulletins,-1,"","",,,,,, -1390,https://brookfieldil.gov/calendar/police-pension-fund-board-of-trustees-meeting/,Poor Data Source,404,"","",,,,,, -1391,https://mountpocono-pa.gov/topics/police-courts/,Resources,200,"Police Archives - Mount Pocono, PA","","[""FAQ Topic: Police""]","[""Action toolbar"", ""Primary menu links"", ""Who do I call about police-related non-emergencies?"", ""How do I get a copy of a police report?"", ""How do I file a police report?"", ""Welcome"", ""Engage"", ""Help""]",[],[],[],[] -1392,https://cityofpowell.us/government/employment-opportunities/police-officer-selection-process-6/,Resources,200,"City of Powell, Ohio | Police Officer Selection Process","","[""\n Police Officer Selection Process\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -1393,https://delcopa.gov/ems/pdfdocs/initialcertificationeducationtesting/2022regionalemslistmap.pdf,Geographic,200,"","",[],[],[],[],[],[] -1394,http://chico.ca.us/police-department-volunteers,Media Bulletins,404,"","",,,,,, -1395,http://www.longbeach.gov/police/press-releases/two-arrested-and-numerous-guns-seized/,Media Bulletins,200,TWO ARRESTED AND NUMEROUS GUNS SEIZED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1396,http://www.lafayettepolice.us/faq.aspx?qid=208,Not Criminal Justice Related,200,FAQs • Are “floaties” or flotation devices allowed? ,"",[],"[""\n\u25bc\r\nParks and Recreation - Aquatics\t\t""]","[""Loading"", ""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1397,https://alpha.austin.gov/es/police-oversight/temporary-suspension-of-officer-jeremy-bohannon/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1398,https://alpha.austin.gov/police-oversight/temporary-suspension-of-officer-ryan-seweryn-2/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1399,https://www.ci.san-bernardino.ca.us/city_hall/police_department/crime_statistics/about_ucr_statistics/arrest_statistics/arrest_statistics-2009,Crime Statistics,200," - Arrest Statistics - 2009 - City of San Bernardino -","","[""City of San Bernardino California""]","[""Arrest Statistics - 2009""]",[],[],[],[] -1400,https://www.mass.gov/locations/state-police-millbury-barracks/locations,Geographic,200,Locations | Mass.gov,"","[""\n Other locations related to State Police Millbury Barracks\n ""]","[""Showing 1 - 7 of 7 results for:"", ""\n\nState Police Athol Barracks\u00a0\n\n"", ""\n\nState Police Belchertown Barracks\u00a0\n\n"", ""\n\nState Police Brookfield Barracks\u00a0\n\n"", ""\n\nState Police Devens Barracks\u00a0\n\n"", ""\n\nState Police Holden Barracks\u00a0\n\n"", ""\n\nState Police Leominster Barracks\u00a0\n\n"", ""\n\nState Police Sturbridge Barracks\u00a0\n\n""]",[],[],[],[] -1401,https://www.coppelltx.gov/faq.aspx?qid=309,Not Criminal Justice Related,200,FAQs • Why did the City choose to participate in the program,"",[],"[""\n\u25bc\r\nTexas Power Switch\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -1402,https://southcoffeyvilleok.gov/police-department/screen-shot-2016-09-27-at-4-41-47-pm/,Poor Data Source,200," -screen-shot-2016-09-27-at-4-41-47-pm -","",[],"[""\n screen-shot-2016-09-27-at-4-41-47-pm ""]","[""Contact Town of South Coffeyville"", """"]",[],[],[] -1403,http://www.longbeach.gov/police/press-releases/halloween-safety-tips/,Media Bulletins,200,HALLOWEEN SAFETY TIPS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1404,http://www.ryepolice.us/logs/police-logs-for-21716-22316,Calls for Service,200,Rye Police Department Police Logs for 2/17/16-2/23/16 - Rye Police Department,"","[""Police Logs for 2/17/16-2/23/16""]","[""Police Logs for 2/17/16-2/23/16""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -1405,https://www.southbendin.gov/police/,Contact Info & Agency Meta,200,South Bend Police Department | South Bend Police Department,"","[""South Bend Police Department""]","[""MISSION"", ""VISION"", ""Useful Links"", ""Participate"", ""Meet the Department"", ""REGISTER A CAMERA"", ""South Bend"", ""Social Media""]","[""2024 Spring Citizens Police Academy"", ""NEED TO FILL OUT A SHOPLIFTING FORM?"", ""NEW! File an Online Police Report"", ""View the Public Information Bulletin"", ""Register Your Security Camera with SBPD"", ""Click here to read a message from the Chief"", ""get involved in your community"", ""Police Athletic League"", ""Michiana Crime Stoppers"", ""Cadets and Jr. Cadets"", ""Volunteer with SBPD"", ""Neighborhood Watch"", ""Group Violence Intervention"", ""an introduction to your officers and civilians who serve"", ""Police Crime Reports"", ""stay connected, be informed""]","[""Travis KuklaPatrolman (First Class)Learn More"", ""Sienna SearsPatrolman (First Class)Learn More"", ""Jarveair BournPatrolman (First Class)Learn More"", ""Brianne FentonCrime AnalystLearn More"", ""Tricia DealManager of Property & Evidence RoomLearn More""]",[],[] -1406,https://beaumonttexas.gov/beaumont-police-investigating-officer-involved-shooting-lindbergh-overpass/,Poor Data Source,404,"","",,,,,, -1407,https://police.greenvillesc.gov/324/business-assistance,Not Criminal Justice Related,200,"Business Assistance | Greenville, SC - Official Website",Review links and information on various incentives and programs for business assistance. ,"[""\r\n\r\nBusiness Assistance\t\t""]","[""Business License Incentive"", ""LADDER"", ""State & County Incentives""]","[""Loading""]",[],[],[] -1408,https://www.wakeforestnc.gov/police/about-us/police-jobs/police-officer-employment,Training & Hiring Info,200,"Police Officer Employment | Town of Wake Forest, NC",The following is a general progression of the application process and will indicate where a candidate is in the hiring process:Complete an application of employment for the Town of Wake Forest online through NEOGOV.,"[""Police Officer Employment""]","[""joyner_park_1.jpg"", ""Search form"", ""You are here""]","[""Minimum Qualifications\u00a0"", ""Additional Benefits"", "" Police Officer Starting Salaries Based on Experience"", "" Additions to Salaries"", "" Pay Scale""]",[],[],[] -1409,https://spdblotter.seattle.gov/2019/01/25/police-arrest-man-following-stabbing-in-pioneer-square-neighborhood/,Media Bulletins,200,Police Arrest Man Following Thursday Night Stabbing in Pioneer Square Neighborhood - SPD Blotter,"","[""Police Arrest Man Following Thursday Night Stabbing in Pioneer Square Neighborhood""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -1410,https://www.mass.gov/doc/2020-chelmsford-police-lieutenant-sole-assessment-center-examination-in-title-employment/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -1411,http://www.longbeach.gov/police/press-releases/fatal-traffic-collision/,Media Bulletins,200,FATAL TRAFFIC COLLISION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1412,https://oceansprings-ms.gov/form-pdf/ospd-police-reserve-application/,Poor Data Source,404,"","",,,,,, -1413,https://www.alamoheightstx.gov/public-safety/police/services/solicitor-information/,Resources,200,Solicitor Information - City of Alamo Heights,"","[""Solicitor Information""]","[""Definitions:""]",[],[],[],[] -1414,https://elkhartlakewi.gov/departments/police/meet-us/,Personnel Records,200,Meet Us - Village of Elkhart Lake,"","[""\nVILLAGE OF ELKHART LAKE POLICE DEPARTMENT STAFF\n""]","[""CONTACT US"", ""MORE ABOUT ELPD"", ""VILLAGE DEPARTMENTS""]","[""\nK-9 Copper\n"", ""\nMichael Meeusen, Chief of Police\n"", ""\nJeremiah Pritzl, Sergeant\n"", ""\nTravis Auch, School Resource Officer\n"", ""\nBrenda Garcia, Police Officer\n"", ""\nK-9 Copper\n"", ""\nBrad Abel, Police Officer\n"", ""\nRobert Toeller, Police Officer\n"", ""\nDylan Ninmer, Police Officer\n"", ""\nThomas Kultgen, Police Officer\n"", ""\nEvan Gilbert, Police Officer\n"", ""\nKelly Sippel, Police Officer\n"", ""\nPhil Schaefer, Police Officer\n"", ""\nTyler Olig, Police Officer\n"", ""\nAmy Gross, Police Officer\n"", ""\nMarcus Anderson, Police Officer\n"", ""\nNoah Bramstedt, Police Officer\n"", ""\nVILLAGE DEPARTMENTS\n"", ""\nVILLAGE SERVICES\n"", ""\nKEY VILLAGE CONTACTS\n""]",[],[],[] -1415,https://www.sanramon.ca.gov/our_city/departments_and_divisions/police/police_news/weekly_arrest_log,Arrest Records,200," - Weekly Arrest Log - City of San Ramon -","","[""Weekly Arrest Log""]","[""Contact Us"", ""Useful Links""]",[],[],[],[] -1416,https://www.dps.nm.gov/blog/2022/10/22/silver-alert-alamogordo-police-department-ralph-magruder/,Resources,200,SILVER ALERT – Otero County Sheriff's Office– Ralph Magruder - NM Department of Public Safety,"","[""SILVER ALERT \u2013 Otero County Sheriff\u2019s Office\u2013 Ralph Magruder""]",[],"[""Location"", ""Sitemap"", ""Quick Links"", ""Social Media Links""]",[],[],[] -1417,https://www.ashevillenc.gov/news/asheville-police-department-to-add-patrol-district-realign-existing-districts-in-2020/,Media Bulletins,200,"Asheville Police Department to add patrol district, realign existing districts in 2020 - The City of Asheville","","[""Asheville Police Department to add patrol district, realign existing districts in 2020""]",[],"[""What are patrol districts?"", ""Why does law enforcement utilize patrol districts and beats?"", ""What will happen to the downtown unit?""]",[],[],[] -1418,https://www.naperville.il.us/services/naperville-police-department/programs-and-services/police-department-tours/,Resources,200,Police Department Tours | The City of Naperville,Facility tours are educational and structured to help residents better understand the workings of a police department.,"[""Police Department Tours""]","[""Programs and Services "", ""Request a Tour"", ""Contact Us"", ""\nNaperville Police Department\n""]","[""Explore"", ""TOUR INFORMATION"", ""TOUR INFORMATION"", ""REQUESTOR INFORMATION"", ""REQUESTOR INFORMATION"", ""GROUP INFORMATION"", ""GROUP INFORMATION""]",[],"[""Helping Residents Build a Better Community"", ""Resources for Doing Business in Naperville""]",[] -1419,https://southamptontownnypolice.gov/faq.aspx?qid=499,Resources,200,FAQs • What beaches are Southampton Town beaches?,"",[],"[""\n\u25bc\r\nParks & Rec\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1420,https://spdblotter.seattle.gov/2014/05/16/police-bolstering-patrols-as-detectives-investigate-recent-shootings/,Media Bulletins,200,Police Bolstering Patrols As Detectives Investigate Recent Shootings - SPD Blotter,"","[""Police Bolstering Patrols As Detectives Investigate Recent Shootings""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -1421,https://www.newlexingtonohio.gov/resources/forms/police-department-public-records-request-form/,Records Request Info,200,Police Department Public Records Request Form - Village of New Lexington,"New Lexington, Ohio","[""Police Department Records Request Form""]",[],[],[],[],[] -1422,https://champaignil.gov/police/resources/gun-violence-prevention-and-response/,Resources,200,Gun Violence Prevention and Response - City of Champaign,"","[""Gun Violence Prevention and Response""]","[""Police Department"", ""Quick Links"", ""Police Department News"", ""Contact Us""]","["""", ""Jump to the latest shooting incident statistics"", ""What is the City of Champaign Doing to Combat Gun Violence?"", ""Community Resources"", ""Shooting Incident Statistics""]",[],[],[] -1423,https://townofkremmling.colorado.gov/departments/police,Resources,200,Police | Town of Kremmling,"","[""\nPolice\n""]","[""Frequently Asked Questions"", ""Town of Kremmling"", ""We're Social""]","[""\n"", ""\n"", ""\n"", ""\n""]",[],[],[] -1424,http://www.longbeach.gov/police/press-releases/murder-23-/,Media Bulletins,200,MURDER(23),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1425,http://www.longbeach.gov/police/press-releases/murder-pch-and-pacific/,Media Bulletins,200,MURDER PCH AND PACIFIC,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1426,https://champaignil.gov/2014/03/24/police-arrest-one-suspect-in-home-invasion/,Media Bulletins,200,Police Arrest One Suspect in Home Invasion - City of Champaign,"","[""Police Arrest One Suspect in Home Invasion""]","[""News Releases"", ""Department News""]",[],[],[],[] -1427,https://www.mass.gov/doc/rossi-cully-v-duxbury-police-department-related-superior-court-decision-52710/download,Court Cases,200,"","",[],[],[],[],[],[] -1428,https://galenaks.gov/view-more-http-emjophotography-pass-us-galenapolicedepartment2018-8/,Poor Data Source,200,"PO Fleming – City of Galena, Kansas","","[""\n\n\t\t\tPO Fleming\n\t\t""]","[""\n 0 Comments ""]","[""Weather Info"", ""Featured Gallery"", ""Notice Categories"", ""Notices"", ""Interesting Places"", ""About GALENAKS.GOV"", ""Upcoming Events"", ""Important Forms"", ""Quick Contact""]","[""Leave a comment Cancel reply"", ""Local Time"", ""\n\t\t\t\t\t\t\tToday\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\tWednesday\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\tThursday\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\tFriday\t\t\t\t\t\t\t"", ""\n\n\t\t\t\t\tGalena Police Department 2018\t\t\t\t\n"", ""\n\n \t\t\t\t\tCherokee County Floodplain Mapping Update \u2013 Open House \u2013 AUG 9 \t\t\t\t\n"", ""\n\n \t\t\t\t\tSeasonal Positions Available Now \t\t\t\t\n"", ""\n\n \t\t\t\t\tCode Enforcement Officer \t\t\t\t\n"", ""\n\n \t\t\t\t\tFREE LEAD TESTING AND CLEANUP OPPORTUNITY \t\t\t\t\n"", ""\n\n\t \t\t\t\t\tHuddleston Plumbing LLC\t \t\t\t\t\n"", ""\n\n\t \t\t\t\t\tTimberwolf Custom Creations\t \t\t\t\t\n"", ""\n\n \t\t\t\t\tGame Day and Special Events for Seniors \t\t\t\t\n"", ""\n\n \t\t\t\t\tGalena Senior Citizens Weekly Meal \t\t\t\t\n"", ""\n\n \t\t\t\t\tZoning Map for the City of Galena \t\t\t\t\n"", ""\n\n \t\t\t\t\t2023 COUNCIL MEETING MINUTES \t\t\t\t\n""]","[""\n\t\t\t\t\t\t\tJanuary 23, 2024\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\tJanuary 24, 2024\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\tJanuary 25, 2024\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\tJanuary 26, 2024\t\t\t\t\t\t\t""]",[] -1429,http://www.longbeach.gov/police/press-releases/significant-crime-reduction-during-first-year-metro-blue-line-contract/,Media Bulletins,200,SIGNIFICANT CRIME REDUCTION DURING FIRST YEAR METRO BLUE LINE CONTRACT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1430,https://southamptontownnypolice.gov/faq.aspx?qid=297,Resources,200,FAQs • Does the Trustee’s Office handle shellfish permits?,"",[],"[""\n\u25bc\r\nTrustees\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1431,https://www.mass.gov/doc/copper-in-drinking-water-faq-english-0/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1432,https://police.beaumonttexas.gov/taxonomy-template/,Poor Data Source,200,"Taxonomy template – City of Beaumont, Texas","","[""Taxonomy template""]",[],[],"[""Quick Links"", ""\u00a0""]",[],[] -1433,http://www.longbeach.gov/police/press-releases/directed-enforcement-patrols-and-bicycle-theft-sting-results-in-arrests/,Media Bulletins,200,DIRECTED ENFORCEMENT PATROLS AND BICYCLE THEFT STING RESULTS IN ARRESTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1434,http://www.lafayettepolice.us/354/juvenile-investigations,Resources,200,"Special Victims Unit | Lafayette, IN - Official Website",The mission of the Juvenile Division is to investigate crimes against juveniles and those offenses committed by juveniles.,"[""\r\n\r\nSpecial Victims Unit\t\t""]","[""RESPONSIBILITIES"", ""-----------------------------------------------------------------------------"", ""RESOURCES""]","[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1435,https://www.mass.gov/directive/directive-93-7-exempt-sales-of-copying-machines-and-related-items,Not Criminal Justice Related,200,Directive 93-7: Exempt Sales of Copying Machines and Related Items | Mass.gov,"Sales and Use Tax ISSUE: When are retail sales of copying machines, related supplies, photocopies and service contracts exempt from sales tax? DIRECTIVE: Copying Machines. Retail sales of copying machines are subject to sales tax unless the copier is used directly and exclusively in an industrial plant in the actual manufacture of tangible personal property to be sold. See G.L. c. 64H, § 6(s). Supplies. The retail sale of copying machine supplies such as paper, toner and ink are exempt if the photocopies produced from these ingredient or component materials will be sold. See G.L. c. 64H, § 6(r). Retail sales of supplies that do not become an ingredient or component part of tangible personal property to be sold are exempt only if they are consumed and used directly and exclusively in an industrial plant in the actual manufacture of tangible personal property to be sold. See G.L. c. 64H, § 6(s). Photocopies. Retail sales of photocopies are subject to sales tax. Service Contracts. Generally, when the sales price of a service contract is separately stated from the sales price of the equipment and the purchase of the contract is optional, the purchase of the service contract is not subject to sales tax. The cost of a mandatory service contract which the buyer must purchase as part of the sale of the copying machine is included in the taxable sale price of the machine. See 830 CMR 64H.1.1(5)(g), for information regarding taxation of service contracts and replacement parts. Sales to Exempt Purchasers. Retail sales of tangible personal property, including copying machines, supplies and photocopies to government agencies or under certain circumstances to tax exempt organizations qualified under § 501(c)(3) of the Internal Revenue Code, are exempt from tax under G.L. c. 64H, § 6(d) and § 6(e) respectively. DISCUSSION OF LAW: General Laws Chapter 64H, § 2, imposes a tax upon retail sales in the commonwealth by any vendor of tangible personal property or telecommunications services unless specifically exempt. The definition of ""sales"" includes leases and rentals. G.L. c. 64H, § 1. However, the sale of any item of tangible personal property may be exempt if it is sold for an exempt use or if it is sold to an exempt purchaser. 1. Exempt Use a. Copying Machines General Laws Chapter 64H, § 6(s), exempts from taxation sales of machinery, and its replacement parts, used directly and exclusively in an industrial plant in the actual manufacture of tangible personal property to be sold. Machinery is ""used directly and exclusively"" in the manufacture of tangible personal property to be sold only where it is used solely during a manufacturing operation to cause a direct and immediate physical change upon such property. Id. An industrial plant is a factory at a fixed location primarily engaged in the manufacture, conversion or processing of tangible personal property to be sold in the regular course of business. b. Supplies General Laws Chapter 64H, § 6(r), exempts from taxation sales of materials, tools and fuel, or their substitutes, which become an ingredient or component part of tangible personal property to be sold. Materials, tools and fuel which do not become an ingredient or component part of tangible personal property to be sold may be exempt if they are consumed and used directly and exclusively in an industrial plant in the actual manufacture of tangible personal property to be sold. Id. A material, tool or fuel is ""consumed and used directly and exclusively in an industrial plant in the actual manufacture of tangible personal property to be sold"" only if its normal useful life is less than one year, or if its cost is allowable as an ordinary and necessary business expense for federal income tax purposes. Id. 2. Exempt Purchaser General Laws Chapter 64H, § 6(d), exempts from sales tax sales to the United States, the commonwealth, or their respective agencies. Sales to organizations exempt from taxation pursuant to section 501(c)(3) of the Internal Revenue Code (""tax exempt""), are exempt from sales tax provided that the tangible personal property sold is used in the conduct of the organization's exempt enterprise, and the organization obtains a certificate from the Commissioner of Revenue stating it is entitled to the exemption, and the vendor keeps a proper record of the sale. See G.L. c. 64H, § 6(e). EXAMPLES: 1. A company operating a photoprocessing business at a fixed location purchases a copying machine. The company's primary activity is the manufacturing of photographic images to be sold in the regular course of the company's business. The copying machine is used solely to cause a direct and immediate physical change upon the property to be sold during photoprocessing operations. The company also purchases supplies for the copying machine. The company's premises qualifies as a ""factory"" since the primary activity there consists of using mechanical power in photoprocessing manufacturing operations. See Letter Rulings 85-40 and 89-7, and Directive 88-9. The company's premises qualifies as an ""industrial plant"" because it consists of a factory at a fixed location used primarily for the manufacture of tangible personal property to be sold in the regular course of the company's business. The sale of the copying machine is exempt from tax since the machine is used directly and exclusively in an industrial plant in the actual manufacture of tangible personal property to be sold. The sales of supplies used in this machine are exempt if the supplies become an ingredient or component part of tangible personal property to be sold. Supplies that do not become an ingredient or component part of the tangible personal property sold are exempt only if they are consumed and used directly and exclusively in the industrial plant in the actual manufacture of tangible personal property to be sold. Sales of the photocopies are generally taxable. 2. Copying machines are leased for use by various ""tax exempt"" organizations that qualify for exemption under G.L. c. 64H, § 6(e) as discussed above and government entities, such as public universities and public libraries. These organizations and entities also purchase supplies for the copying machines, and make the copying machines availables to the general public. Leases of the copying machines and sales of supplies to qualified ""tax exempt"" organizations are exempt from taxation. Leases of the copying machines and sales of supplies to the federal government and its agencies, and to the commonwealth and its agencies, are exempt from taxation. Sales of tangible personal property by such ""tax exempt"" organizations and government agencies, however, are generally taxable. Thus, sales of photocopies by these institutions are generally subject to tax. See G.L. c. 64H, § 1, (definition of ""retailer""); see also DOR Directive 91-1 and Letter Ruling 92-3. CONCLUSION: Depending on the facts of each transaction, retail sales of copying machines, although generally taxable, may be exempt from taxation pursuant to G.L. c. 64H, § 6(d), § 6(e) or § 6(s). Sales of copying machine supplies, also generally taxable, may be exempt from taxation pursuant to G.L. c. 64H, § 6(d), § 6(e), § 6(r), or § 6(s). Generally, sales of photocopies are subject to tax. Exempt Usage. When claiming an exemption based on use pursuant to G.L. c. 64H, § 6(r) or § 6(s), a properly completed Form ST-12 certifying that the property is being purchased for an exempt use must be presented by the purchaser to the vendor. See 830 CMR 64H.8.1(5). Exempt Purchaser. When claiming an exemption as an exempt purchaser pursuant to G.L. c. 64H, § 6(d) or § 6(e), a properly completed Form ST-5 with an ST-2 copy (required for tax exempt organizations only) certifying that the purchaser is exempt must be presented by the purchaser to the vendor. See 830 CMR 64H.8.1(5). If a government entity claims the exemption but does not offer an Exempt Purchaser Certificate the vendor, to sell tax free, must obtain adequate documentation, generally, a copy of the government check, verifying that the purchaser is a government entity.   /s/Mitchell Adams Mitchell Adams Commissioner of Revenue   MA:HMP:kt   December 21, 1993   DOR-D 93-7","[""\nDirective\u00a0\n Directive 93-7: Exempt Sales of Copying Machines and Related Items\n ""]","[""Table of Contents"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -1436,http://www.longbeach.gov/police/press-releases/defendant-sentenced-to-45-years-for-charges-relating-to-human-trafficking/,Media Bulletins,200,DEFENDANT SENTENCED TO 45 YEARS FOR CHARGES RELATING TO HUMAN TRAFFICKING,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1437,https://delcopa.gov/publicrelations/releases/2018/2019doglicenses.html,Resources,200,"2019 Dog Licenses now available - Delaware County, Pennsylvania","","[""2019 Dog Licenses now available""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1438,https://www.knoxvilletn.gov/government/mayors_office/c_o_v_i_d-19___coronavirus_/stress_and_coping/knox_well/kid___parent_resources,Resources,200," - Kid & Parent Resources - City of Knoxville -",nothing*,"[""Kid & Parent Resources""]",[],[],[],[],[] -1439,https://spdblotter.seattle.gov/2016/08/17/police-search-for-leads-on-teen-girls-suspected-in-south-seattle-bleach-attacks/,Media Bulletins,200,Police Search for Leads on Teen Girls Suspected In South Seattle Bleach Attacks - SPD Blotter,"","[""Police Search for Leads on Teen Girls Suspected In South Seattle Bleach Attacks""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -1440,https://www.chesterfield.in.gov/departments/police/,Resources,200,Police Department – Town of Chesterfield,"","[""Menu"", ""Town of Chesterfield"", ""Police Department"", ""I Want to\u2026"", ""Recent News"", ""Upcoming Events""]","[""A Progressive Community Est. 1858"", """"]","[""Police and Accident Reports""]",[],[],[] -1441,https://www.mass.gov/doc/fitchburgpolicesergeant7929rtf/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -1442,http://www.tampa.gov/police/info/honoring-our-heroes/curtis-and-kocab/david-curtis,Personnel Records,200,Officer David Lamar Curtis | City of Tampa,"October 3, 1978 - June 29, 2010","[""Officer David Lamar Curtis \n""]","[""Police Department"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[] -1443,https://www.antioch.il.gov/wpfb-file/08-03-11-police-and-fire-agenda-pdf/,Media Bulletins,200,"08-03-11 Police And Fire Agenda - Antioch, IL",8038 08 03 11 police and fire agenda pdf commissions commission agendas 2011 1311972182 b5a97d493539b841a8655f0d9c16d00b 217x300 _xa4zmw67zhfv thumb jpg 07 29 15 43 02 0 pdf application page_text num_pages analyze pdf_pages pdf_2text timings,"[""08-03-11 Police And Fire Agenda""]",[],[],[],[],[] -1444,https://www.southamptontownnypolice.gov/1782/2023-budgets,Resources,200,"2023 Budgets | Southampton, NY - Official Website","","[""\r\n\r\n2023 Budgets\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]","[""\r\n\t\t\t\t\t2023 Tentative Budget - Operating\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t2023 Tentative Budget - Capital\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t2023 Adopted Budget - Operating\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t2023 Adopted Budget - Capital\r\n\t\t\t\t""]",[],[] -1445,https://alpha.austin.gov/es/police-oversight/2020-06-30-2/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1446,https://www.coronadelmar.us/procession-honors-newport-beach-police-detective/,Not Criminal Justice Related,200,Procession Honors Newport Beach Police Detective | Corona del Mar California,"","[""Procession Honors Newport Beach Police Detective""]","[""Menu"", "" Be First to Comment"", ""Subscribe"", """", """"]","[""Share this:"", ""Like this:"", ""Related"", ""Leave a Reply Cancel reply"", """"]",[],[],[] -1447,https://coloradosprings.gov/police-department/article/news/las-vegas-street-and-south-tejon-street,Media Bulletins,200,Las Vegas Street and South Tejon Street | City of Colorado Springs,"","[""\nLas Vegas Street and South Tejon Street\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -1448,https://rocklandmaine.gov/events/police-review-committee-meeting-18/,Poor Data Source,200,"Police Review Committee Meeting | The City of Rockland, Maine","Monday, 25 July 2022 - 430pm Zoom Meeting Link - https://us02web.zoom.us/j/5040315241?pwd=eFhHaWJ4ZmhNakRmQ0VIQko4VmlKUT09 Facilitator: Emily Note Taker: Jan","[""Police Review Committee Meeting"", ""Police Review Committee Meeting""]",[],"[""All Current Alerts & Announcements"", ""Current Weather"", ""Date"", ""Time"", ""Leave a Comment Cancel reply"", ""City of Rockland""]",[],[],[] -1449,https://coloradosprings.gov/police-department/article/news/city-ordinance-area-expanded,Media Bulletins,200,City Ordinance Area Expanded | City of Colorado Springs,"","[""\n City Ordinance Area Expanded\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -1450,https://delcopa.gov/publicrelations/releases/2022/delcohonoredtoreceivegovernersawardforlocalgovtexcellence.html,Media Bulletins,200,"Delaware County Honored to Receive the Governor’s Award for Local Government Excellence - Delaware County, Pennsylvania","","[""Delaware County Honored to Receive the Governor\u2019s Award for Local Government Excellence""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1451,https://delcopa.gov/health/pages/animalbites.html,Resources,200,"Animal Bites to Humans - Delaware County, Pennsylvania","","[""Animal Bites to Humans""]",[],"["""", ""Health Dept Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1452,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/011321arrests.pdf,Arrest Records,200,"","",[],[],[],[],[],[] -1453,http://www.longbeach.gov/police/press-releases/dui-drivers-license-checkpoint/,Media Bulletins,200,DUI DRIVERS LICENSE CHECKPOINT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1454,https://www.mass.gov/doc/perry-brian-v-boston-police-department-92012/download,Court Cases,200,"","",[],[],[],[],[],[] -1455,https://www.memphistn.gov/government/police-department/in-memoriam/,Poor Data Source,404,"","",,,,,, -1456,https://www.mass.gov/doc/hamm-brendan-v-boston-police-department-111308/download,Court Cases,200,"","",[],[],[],[],[],[] -1457,https://www.coppelltx.gov/666/sustainability-data,Poor Data Source,404,"","",,,,,, -1458,https://edenny.gov/town-of-eden-police-reform-plan/,Contact Info & Agency Meta,200,"Town of Eden Police Reform Plan | Town of Eden, New York","","[""Town of Eden Police Reform Plan""]",[],[],"[""Contact Information""]",[],[] -1459,https://police.crystalmn.gov/r_e_s_i_d_e_n_t/community_development/permits_and_inspections,Resources,200," - Permits and Inspections - City of Crystal -",Links and information about permits and inspections in the City of Crystal.,"[""Permits and Inspections""]",[],"[""Sign up for a city newsletter or notification."", ""City Hall"", ""Regular Hours:""]","[""Monday - Friday""]",[],[] -1460,https://www.mass.gov/news/police-arrest-juvenile-for-homicide-in-adams-death,Media Bulletins,200,Police Arrest Juvenile For Homicide In Adams Death | Mass.gov,"Authorities arrested a juvenile for homicide in the death of Benjamin Martinez, 34, of Springfield.","[""\nPress Release\u00a0\n Police Arrest Juvenile For Homicide In Adams Death\n ""]","[""Media Contact for Police Arrest Juvenile For Homicide In Adams Death"", ""Media Contact\n for Police Arrest Juvenile For Homicide In Adams Death"", ""\n\nBerkshire District Attorney's Office\u00a0\n\n"", ""Media Contact for Police Arrest Juvenile For Homicide In Adams Death"", ""Help Us Improve Mass.gov with your feedback""]","[""\n Andrew McKeever, Director of Communications\n "", ""\n Andrew McKeever, Director of Communications\n "", ""\n Andrew McKeever, Director of Communications\n ""]","[""\n\nPhone\n"", ""\n\nOnline\n"", ""\n\nPhone\n"", ""\n\nOnline\n"", ""\n\nPhone\n"", ""\n\nOnline\n""]",[],[] -1461,https://www.roseville.ca.us/government/departments/police_department/social_services/shop_with_a_cop,Misc Police Activity,200," - Shop with a cop - City of Roseville -","","[""City of Roseville""]","[""Shop with a cop""]","[""Roseville Police Department ""]",[],[],[] -1462,https://alpha.austin.gov/en/police-oversight/2020-06-12-3/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1463,https://www.mass.gov/regulations/515-cmr-500-standards-of-skill-for-special-state-police-officers,Training & Hiring Info,200,515 CMR 5.00: Standards of skill for special state police officers | Mass.gov,"515 CMR 5.00 ensures proper standards of skill for special state police officers pursuant to the terms and provisions of M.G.L. c. 22C, § 69. Download a PDF copy of the regulation below.","[""\nRegulation\u00a0\n 515 CMR 5.00: Standards of skill for special state police officers\n ""]","[""Table of Contents\n for the law library, 515 CMR"", ""Contact for 515 CMR 5.00: Standards of skill for special state police officers"", ""Table of Contents"", ""Downloads\n for 515 CMR 5.00: Standards of skill for special state police officers"", ""Contact\n for 515 CMR 5.00: Standards of skill for special state police officers"", ""Contact for 515 CMR 5.00: Standards of skill for special state police officers"", ""Help Us Improve Mass.gov with your feedback""]","[""\n Trial Court Law Libraries\n "", ""\n Trial Court Law Libraries\n "", ""\n Trial Court Law Libraries\n ""]","[""\n\nOnline\n"", ""\n\nOnline\n"", ""\n\nOnline\n""]",[],[] -1464,https://www.ci.rohnert-park.ca.us/city_hall/departments/public_safety/police_services/permits___licensing/solicitors_peddlers_permit,Resources,200," - Solicitors/Peddlers Permit - City of Rohnert Park -","","[""City of Rohnert Park""]","[""Rohnert Park""]","[""Solicitors/Peddlers Permit""]","[""\nSolicitors/Peddlers Permit""]",[],[] -1465,https://council.seattle.gov/2011/07/14/seattle-city-council-seeking-candidates-for-police-accountability-review-board/,Media Bulletins,200,Seattle City Council seeking candidates for police accountability review board - Seattle City Council Blog,"","[""Seattle City Council seeking candidates for police accountability review board""]",[],"[""HELPFUL LINKS"", ""Make your voice heard"", ""Councilmembers""]",[],[],[] -1466,https://directory.arkansas.gov/agency/arkansas-fire-and-police-pension-review-board/questions/,Poor Data Source,200,State Directory – Arkansas.gov,"","["" Flag Status""]","[""\n\n\t\t\t\t\t\tDiscover More\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tDiscover More\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tDiscover More\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tDiscover More\t\t\t\t\t\n"", ""What can we help you find?"", ""Search the Directories"", ""Flag Status"", """"]","[""Government Resources"", ""Business Resources"", ""Residents Resources"", ""Visiting Resources"", ""State Directory"", ""Agencies"", ""Services"", ""Employees"", ""Your Arkansas.gov"", ""Top Online Services"", ""helpful information""]","[""Was the information on this page helpful?""]",[],[] -1467,https://www.mass.gov/doc/pdf-copy-of-the-field-auditor-i-performance-audits-chicopee-job-description-2020-05-06/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -1468,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0031-2/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1469,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/081722blotter.pdf,Poor Data Source,404,"","",,,,,, -1470,https://edmonstonmd.gov/prince-georges-county-news-police-chief-town-hall-beautification/,Not Criminal Justice Related,200,"County News: Police Chief Town Hall, Beautification - Town of Edmonston","Police Chief Town Hall Recording County Executive Angela Alsobrooks and Acting Chief of Police Malik Aziz held a town hall to discuss community policing, police reform, and a new summer crime initiative that is now underway. Residents can watch the town hall below. https://www.youtube.com/watch?v=oyMrHhKoY40 Beautification Survey If you live in…","[""County News: Police Chief Town Hall, Beautification""]","[""Town Hall"", ""Police Department"", ""Town Hall"", ""Police Department"", ""Town Hall"", ""Police Department"", ""Town Hall"", ""Police Department"", ""Police Chief Town Hall Recording"", ""Beautification Survey"", ""Encuesta de embellecimiento del condado"", ""Beautify and Comply!"", ""\u00a1Embellece tu propiedad y ll\u00e9vala al Cumplimiento!"", ""Town of Edmonston"", ""Police Department"", ""Quick Links"", ""Quick Links""]",[],[],[],"[""Town Hall"", ""Office hours"", ""administrative offices"", ""contACT THE POLICE DEPARTMENT""]" -1471,https://www.dps.nm.gov/blog/2022/03/24/new-mexico-state-police-arrest-fugitive-tennessee-murder-suspects/,Media Bulletins,200,New Mexico State Police Arrest Fugitive Tennessee Murder Suspects - NM Department of Public Safety,"","[""New Mexico State Police Arrest Fugitive Tennessee Murder Suspects""]",[],"[""Location"", ""Sitemap"", ""Quick Links"", ""Social Media Links""]",[],[],[] -1472,https://www.southamptontownnypolice.gov/943/the-hills---deis-april-2016,Resources,200,"The Hills - DEIS-April 2016 | Southampton, NY - Official Website","","[""\r\n\r\nThe Hills - DEIS-April 2016\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]","[""The Hills - DEIS-April 2016 "", ""DEIS Appendices"", ""DEIS Plans""]",[],[] -1473,https://www.florenceaz.gov/police-hosting-a-town-hall-meeting-on-december-9th/,Misc Police Activity,200,Police Hosting a Town Hall Meeting on December 9th – Town of Florence,"","[""Police Hosting a Town Hall Meeting on December 9th""]","[""\n\t\t\t\t\tAbout the Author: \t\t\t\t\t\tShaun Courtney ""]","[""Visitors"", ""Events"", ""Business Information"", ""Services"", ""Town Departments"", ""News Categories"", ""Utilities""]","[""Teen Council Meeting January 24, 2024"", ""Charles Whitlow Rodeo Grounds Advisory Board January 25, 2024"", ""Historic District Advisory Commission January 31, 2024"", ""Planning and Zoning Commission February 1, 2024"", ""Town Council Meeting February 5, 2024"", ""Dive into Summer Opportunities at Florence\u2019s Aquatic Center Job Fair"", ""Major Equipment Upgrades Coming to Florence Fitness Center"", ""Florence\u2019s Western Heritage Comes Alive: The 91st Annual Jr. Parada"", ""Share This Story, Choose Your Platform!"", ""Recent Posts""]",[],[] -1474,https://www.hayward-ca.gov/discover/news/sep21/police-blotter-august-22-28-2021,Media Bulletins,200,"Police Blotter: August 22-28, 2021 | City of Hayward - Official website","STATISTICAL HIGHLIGHTSAugust 22-28, 2021 Weekly Arrests (Includes cite/released):44 Homicide 0Weekly Calls for Service: 2,070 Assault—Great Bodily Injury 2Weekly Reports Taken:194 Burglary— Nonresidential 8Weekly Complaints(against HPD):0 Burglary—Residential 3Weekly Calls Received:5,876 Theft 25This data is subject to change and based on crimes that were reported to have","[""Police Blotter: August 22-28, 2021""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form""]",[],"[""STATISTICAL HIGHLIGHTS"", ""August 22-28, 2021"", ""\u00a0"", ""\u00a0"", ""\u00a0 \u00a0\u00a0"", ""Significant Incidents"", ""Re-CAP: Hayward\u2019s Updated Climate Action Plan (CAP)"", ""Try induction cooking for free through Ava Community Energy\u2019s Induction Cooktop Lending Program!"", ""The City of Hayward\u2019s Fight Against Food Waste"", ""Decoding Plastic Recycling In California"", ""Keep Hayward Clean and Green with Adopt-A-Block!"", ""City Hall and Nonessential Services Closures: Monday, Feb 12 and Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""Library Closure January 15, 2024"", ""Library Closure: December 23 2023 - January 1 2024"", ""Library closure: November 23 - November 26, 2023."", ""YOU ARE HERE.SO IS EVERYTHING ELSE."", ""Related News"", ""Police Blotter: December 3-9, 2023"", ""Police Blotter - November 26-December 2, 2023"", ""Police Blotter - November 19-25, 2023"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -1475,http://police.portlandmaine.gov/552/peaks-island-services,Not Criminal Justice Related,200,"Peaks Island Services | Portland, ME - Official Website",Learn abut services to Peaks Island.,"[""Peaks Island Services""]",[],[],[],[],[] -1476,https://beaumonttexas.gov/beaumont-police-arrest-hike-bike-auto-burglar-6450-folsom/,Poor Data Source,404,"","",,,,,, -1477,http://www.ryepolice.us/logs/police-logs-07-27-2022-08-02-2022,Daily Activity Logs,200,Rye Police Department Police Logs 07/27/2022-08/02/2022 - Rye Police Department,"","[""Police Logs 07/27/2022-08/02/2022""]","[""Police Logs 07/27/2022-08/02/2022""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -1478,https://alpha.austin.gov/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/office-of-police-oversight-official-reports/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1479,https://coloradosprings.gov/police-department/page/vin-verification-services,Resources,200,VIN Verification Services | City of Colorado Springs,"","[""\nVIN Verification Services\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]","[""VIN Verification Services""]",[],"[""REPORT ONLINE""]",[] -1480,https://hollister.ca.gov/government/city-departments/police/join-our-team/,Training & Hiring Info,200,"Join Our Team – City of Hollister, California","",[],[],"[""Follow Us on..."", ""Join Our Team"", ""We are Hiring"", ""Follow Us on....""]",[],[],[] -1481,https://www.mass.gov/doc/fitzgibbon-daniel-v-boston-police-department-related-superior-court-decision-32113/download,Court Cases,200,"","",[],[],[],[],[],[] -1482,https://delcopa.gov/pdf/2021budget.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -1483,http://www.longbeach.gov/police/about-the-lbpd/bureaus/investigations-bureau/detective-division/auto-theft-detail-and-t.r.a.p/,Resources,200,Auto Theft Detail and T.R.A.P.,"","[""Police Department""]","[""Auto Theft Detail And T.R.A.P""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""\u00a0TASK FORCE FOR REGIONAL AUTO THEFT PREVENTION (T.R.A.P.)"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk"", ""\u00a0REPORTING AUTO THEFT"", ""\u00a0CHECKING YOUR AUTO THEFT CASE STATUS"", ""\u00a0RENTAL CAR THEFTS AND EMBEZZLEMENT"", ""\u00a0FAILURE TO RETURN A BORROWED CAR"", ""\u00a0LAWS PERTAINING TO AUTO THEFT\u00a0""]","[""Long Beach Police non-emergency (562) 435-6711"", ""Long Beach Police business desks:"", ""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""Crime Lab Survey"", ""\u00a0""]",[] -1484,https://www.ci.san-ramon.ca.us/our_city/departments_and_divisions/police/srpd-downloads,Poor Data Source,200," - SRPD Downloads - City of San Ramon -","","[""SRPD Downloads""]","[""Contact Us"", ""Useful Links""]",[],[],[],[] -1485,https://www.antioch.il.gov/event/police-fire-commission-special-meeting-4/,Poor Data Source,200,"Police & Fire Commission Special Meeting - Antioch, IL","","[""Police & Fire Commission Special Meeting""]",[],[],[],[],[] -1486,http://www.longbeach.gov/police/press-releases/murder-investigation---2300-block-of-elm-avenue/,Media Bulletins,200,MURDER INVESTIGATION - 2300 BLOCK OF ELM AVENUE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1487,https://dps.iowa.gov/former-clarksville-police-officer-arrested,Media Bulletins,200,Former Clarksville Police Officer Arrested | Iowa Department of Public Safety,"September 1, 2022 Butler County, Iowa - On March 4, 2022, a minor under the age of 18 reported to the Butler County Sheriff’s Office that Clarksville police officer Mike Tobin had showed the minor sexually explicit images and videos that were evidence in a pending criminal case.  Those images included nude images of minors.   Tobin’s employment with the City of Clarksville was discontinued on March 5th, 2022. The Iowa Division of Criminal Investigation was asked to assist with the investigation.","[""\n\n Iowa Department of\n \n\n Public Safety\n \n"", ""Former Clarksville Police Officer Arrested \n""]",[],[],[],[],[] -1488,http://www.longbeach.gov/police/press-releases/dui-checkpoint-1-/,Media Bulletins,200,DUI CHECKPOINT(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1489,https://alpha.austin.gov/es/police-oversight/formal-complaint-de-escalation-of-potential-force-encounters-and-other-policy-violations-3/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1490,https://www.southamptontownnypolice.gov/faq.aspx?qid=554,Resources,200,FAQs • How do I upload a completed documents?,"",[],"[""\n\u25bc\r\nOnline Service Assistance\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1491,https://www.southamptontownnypolice.gov/faq.aspx?qid=78,Resources,200,FAQs • A house in my neighborhood burned down. How long do I,"",[],"[""\n\u25bc\r\nPublic Safety - Code Enforcement\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1492,http://www.longbeach.gov/police/press-releases/charges-filed-against-robbery-suspects/,Media Bulletins,200,CHARGES FILED AGAINST ROBBERY SUSPECTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1493,http://www.longbeach.gov/police/press-releases/improving-motorcycle-safety-aim-of-l-b-p-d--operation-2-/,Media Bulletins,200,Improving Motorcycle Safety Aim of L.B.P.D. Operation(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1494,https://bouldercolorado.gov/events/police-oversight-panel-community-engagement-committee-meeting-0,Misc Police Activity,200,Police Oversight Panel - Community Engagement Committee Meeting | City of Boulder,"","[""Police Oversight Panel - Community Engagement Committee Meeting\n""]","[""Breadcrumb"", ""Details"", ""Police Oversight Panel Meetings"", ""Meeting Details"", ""More Resources""]","[""\nPolice Oversight Panel Subcomittee: Legacy Meeting\n\n"", ""\nPolice Oversight Panel: Meeting with Interim Chief Redfern\n\n"", ""\nPolice Oversight Panel Subcommittee: Community Engagement Meeting\n\n"", ""\nPolice Oversight Panel Subcomittee: Co-Chairs and IPM Meeting\n\n"", ""\nPolice Oversight Panel: All Panel Meeting\n\n"", ""\nPolice Oversight Panel Subcommitee: Co-Chairs and IPM Meeting\n\n""]",[],[],[] -1495,http://police.portlandmaine.gov/650/needle-exchange-program,Resources,200,"Needle Exchange Program | Portland, ME - Official Website",Discover the harm reduction services offered by Portland Public Health including our needle exchange program. ,"[""Needle Exchange Program""]",[],[],[],[],[] -1496,https://delcopa.gov/departments/parks/pdf/redwoodmonthlyschedule.pdf,Poor Data Source,200,"","",[],[],[],[],[],[] -1497,https://delcopa.gov/publicrelations/releases/2018/hopefortheholidays.html,Media Bulletins,200,"Heroin Task Force connects residents with treatment this holiday season - Delaware County, Pennsylvania","","[""Heroin Task Force connects residents with treatment this holiday season""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1498,https://detroitmi.gov/es/departments/departamento-de-policia/detroit-police-department-shield-program/recursos-de-socios-comunitarios,Poor Data Source,200,Recursos de socios comunitarios | City of Detroit,"¿Por qué unirse a SHIELD? Con el crecimiento de una ciudad próspera y la promesa de un mayor comercio en Detroit, surgen mayores preocupaciones de seguridad para las fuerzas del orden público, los dueños de negocios, los centros de culto y los ciudadanos por igual. Los sectores público y privado son más fuertes trabajando juntos que cada uno solo. Esta asociación es la piedra angular en la defensa de la Ciudad contra el terrorismo. DPD Shield es un destino central para obtener información crítica e involucrar a los recursos del departamento de policía. DPD Shield también busca información de nuestra comunidad y socios del sector privado para ayudar en nuestros esfuerzos para mantener la Ciudad Lo que pedimos El programa DPD SHIELD es una vía de comunicación de dos vías. La clave del éxito es que la información fluya en dos direcciones. Los socios de la comunidad sirven como los ojos y los oídos del DPD SHIELD y sirven para impactar directamente los esfuerzos para prevenir el crimen y los actos de terrorismo al informar sobre comportamientos sospechosos lo antes posible. Además, reconocemos que nuestros socios comunitarios están especialmente calificados para ayudar al personal del Departamento de Policía de Detroit durante un incidente. Sabes lo que pertenece y lo que está fuera de lugar. Compartiendo su perspectiva y trabajando juntos, estamos mejor preparados para enfrentar los desafíos más difíciles.","[""\nRecursos de socios comunitarios\n""]","[""Top Links"", ""Site Menu"", ""\nPreguntas frecuentes sobre el escudo de la polic\u00eda de Detroit\n\n""]",[],"[""CONTACTOS"", ""MEN\u00da DE DEPARTAMENTO""]",[],[] -1499,https://www.normanok.gov/public-safety/police-department/divisions/professional-standards,Complaints & Misconduct,200,"Professional Standards | City of Norman, OK",Information on the Norman Police Department's Professional Standards Division.,"[""City of Norman, OK"", ""City of Norman, OK"", ""Professional Standards\n""]","[""What can we help you find?"", ""Breadcrumb"", ""\n Make A Formal Complaint \n"", ""\n Commend An Officer or NPD Employee\n"", ""Footer menu"", ""Footer Second Column"", ""Connect with Us""]","[""Divisions""]","[""\nNOTICE\n"", ""\nNOTICE\n"", ""\nNOTICE\n""]","[""Winter Weather Information"", ""Business and Citizen Self-Service Portal"", ""Information on City Council and Committee Meetings""]",[] -1500,http://www.longbeach.gov/police/press-releases/traffic-fatality7/,Media Bulletins,200,TRAFFIC FATALITY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1501,https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/contribute-to-police-oversight/file-a-complaint-about-an-austin-police-officer/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1502,https://pittsburghpa.gov/police/police-administration,Poor Data Source,200,Administration Branch | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Administration Branch"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Branches"", ""About Police"", ""Community Engagement Office"", ""Police Zones"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[] -1503,http://www.longbeach.gov/police/press-releases/dui-enforcement-operations-planned-this-weekend-3-/,Media Bulletins,200,DUI ENFORCEMENT OPERATIONS PLANNED THIS WEEKEND(3),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1504,https://www.mass.gov/event/2022-lowell-police-open-house-2022-01-10t170000-0500-2022-01-10t190000-0500,Poor Data Source,200,2022 Lowell Police Open House | Mass.gov,"","[""\n 2022 Lowell Police Open House\n ""]","[""Overview\n of 2022 Lowell Police Open House"", ""Participating Organizations\n "", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -1505,https://www.lynchburgvapolice.gov/wp-content/uploads/2022/10/suspect-express-lane-76-gas-10.27.2022-e1666893965762.png,Poor Data Source,404,"","",,,,,, -1506,https://southcoffeyvilleok.gov/police-department/contact/,Contact Info & Agency Meta,200," -Contact Police Department -","",[],"[""\n Contact Police Department "", ""South Coffeyville Police Department""]","[""Contact Town of South Coffeyville"", """"]",[],"[""\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tCall Us\t\t\t\t\t\t\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tEmail us at\t\t\t\t\t\t\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tVisit the Police Station\t\t\t\t\t\t\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tJoin the SCPD\t\t\t\t\t\t\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tDonate to SCPD\t\t\t\t\t\t\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSend Us Mail\t\t\t\t\t\t\t\t\t\t\t\t\t""]",[] -1507,https://www.pleasantprairiewi.gov/departments/police/retail_theft_reporting,Resources,200," - Retail Theft Reporting - Village of Pleasant Prairie -","",[],"[""Retail Theft Reporting""]","[""Follow Us on Social Media""]","[""PLEASANT PRAIRIE POLICE DEPARTMENT RETAIL THEFT REPORTING PROCEDURE"", ""INSTRUCTIONS FOR STORE EMPLOYEES""]","[""Before reporting a Retail Theft, please follow below for proper reporting procedures:"", ""\u2022\u00a0\u00a0Contact the Pleasant Prairie Police Department immediately if:"", ""\u2022 Complete a Retail Theft Packet if any of the below situations apply:"", ""\u2022 Do not call if you do not wish to prosecute or can\u2019t articulate what was taken."", """", ""\n\nPlease call or deliver the completed packet within 7 days of the theft:""]",[] -1508,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/042622summary.pdf,Poor Data Source,404,"","",,,,,, -1509,https://delcopa.gov/council/2020minutes/05202020minutes.pdf,Poor Data Source,200,"","",[],[],[],[],[],[] -1510,https://www.sandiego.gov/department-document/mayor-glorias-appointment-citizens-advisory-board-policecommunity-relations,Media Bulletins,200,Mayor Gloria's Appointment to the Citizen's Advisory Board on Police/Community Relations | City of San Diego Official Website,"","[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Mayor Gloria's Appointment to the Citizen's Advisory Board on Police/Community Relations"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -1511,https://www.mass.gov/doc/chicopee-district-court/download,Misc Police Activity,200,"","",[],[],[],[],[],[] -1512,https://delcopa.gov/controller/pdf/2022/faq-changetothecustodialbankfordelawarecountyretirementaccounts.pdf,Resources,200,"","",[],[],[],[],[],[] -1513,https://www.troyny.gov/mayor-madden-announces-the-promotion-of-steven-barker-to-the-rank-of-assistant-chief-of-police/,Poor Data Source,404,"","",,,,,, -1514,http://www.longbeach.gov/police/press-releases/traffic-fatality-5-/,Media Bulletins,200,TRAFFIC FATALITY(5),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1515,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/january-16-activity-report/,Incident Reports,200,January 16 Activity Report - Town of Cheswold,"","[""Cheswold""]","[""Delaware"", ""January 16 Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[] -1516,https://delcopa.gov/courts/judges/kelly.html,Personnel Records,200,President Judge Kevin F. Kelly - Delaware County Court of Common Pleas,"","[""Judge Kevin F. Kelly""]",[],"[""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[] -1517,https://www.mass.gov/doc/the-challenging-investment-climate-how-to-cope/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1518,http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested-and-charged-2-/,Media Bulletins,200,ROBBERY SUSPECT ARRESTED AND CHARGED(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1519,https://twp.northfield.il.us/coffee-with-a-cop-northbrook/,Poor Data Source,404,"","",,,,,, -1520,https://delcopa.gov/publicrelations/releases/2021/pdf/delcoerainpersonflyer.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1521,https://www.naperville.il.us/services/naperville-police-department/programs-and-services/false-alarm-reduction-program/,Resources,200,False Alarm Reduction Program | The City of Naperville,Security system false alarms are the Naperville Police Department's third most frequent call for service. This program seeks to reduce the frequency of such calls.,"[""False Alarm Reduction Program""]","[""Programs and Services "", ""What is a false alarm?"", ""Are false alarms a problem in Naperville?"", ""What happens when your burglar alarm system is activated?"", ""Before you activate your alarm system:"", ""What are the most frequent causes of false alarms?"", ""What are the consequences of having a police response for an activated false burglar alarm?"", ""Do I need a permit or to register my burglary alarm system?"", ""Contact"", ""Alarm Statistics for 2020"", ""\nNaperville Police Department\n""]","[""Explore""]","[""\nJulie Smith\n""]","[""Helping Residents Build a Better Community"", ""Resources for Doing Business in Naperville""]",[] -1522,https://alpha.austin.gov/police-oversight/2020-06-4-18/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1523,https://www.va.gov/martinsburg-health-care/stories/martinsburg-vamc-premiers-use-of-disposable-duodenoscopes/,Not Criminal Justice Related,200,Martinsburg VAMC Premiers Use Of Disposable Duodenoscopes | VA Martinsburg Health Care | Veterans Affairs,"A single use duodenoscope eliminates the need for reprocessing and allows physicians to use a new, completely sterile device for every procedure.","[""Martinsburg VAMC premiers use of disposable duodenoscopes""]",[],[],[],[],[] -1524,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0460/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1525,https://spdblotter.seattle.gov/2012/03/02/south-seattle-residents-police-team-up-to-take-back-rainier-beach/,Misc Police Activity,200,"South Seattle Residents, Police Team Up to ""Take Back"" Rainier Beach - SPD Blotter","","[""South Seattle Residents, Police Team Up to \u201cTake Back\u201d Rainier Beach""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -1526,https://delcopa.gov/publicrelations/releases/2019/prisonboardmeetingcancelled.html,Poor Data Source,200,"Oct. 8 Board of Prison Inspectors meeting cancelled - Delaware County, Pennsylvania","","[""Oct. 8 Board of Prison Inspectors meeting cancelled""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1527,https://delcopa.gov/ojs/efileforms/ojs forms for efile/writofsummons.pdf,Poor Data Source,200,"","",[],[],[],[],[],[] -1528,https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/summary-of-overarching-recommendations/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1529,https://delcopa.gov/workshops/,Not Criminal Justice Related,200,Untitled Document,"",[],[],[],[],[],[] -1530,https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scoperesponsibility-to-the-community-and-other-policy-violations-1/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1531,https://ose.louisiana.gov/event/chief-of-police/,Poor Data Source,200,Chief of Police | Louisiana Office of State Examiner,"","["""", ""Chief of Police""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -1532,http://www.longbeach.gov/police/press-releases/l-b-p-d--offers-holiday-safety-tips/,Media Bulletins,200,L.B.P.D. Offers Holiday Safety Tips,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1533,https://www.sandiego.gov/department-document/police-identify-emerald-hills-homicide-victim,Media Bulletins,200,Police Identify Emerald Hills Homicide Victim | City of San Diego Official Website,"","[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Police Identify Emerald Hills Homicide Victim"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -1534,https://rocklandmaine.gov/police-department/pedestrian-safety-crosswalk-safety/attachment/crosswalk-enforcement-2/,Poor Data Source,200,"Crosswalk Enforcement | The City of Rockland, Maine","","[""Crosswalk Enforcement""]",[],"[""All Current Alerts & Announcements"", ""Current Weather"", ""City of Rockland""]",[],[],[] -1535,https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-and-courtesy-and-other-policy-violations-6/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1536,https://ci.piedmont.ca.us/services___departments/police/services/request_a_report,Resources,200," - Request a Report - City of Piedmont -","","[""\r\n City of\r\n Piedmont""]",[],"[""\n"", ""How to Obtain a Police Report or Records Release""]",[],[],[] -1537,http://www.longbeach.gov/police/press-releases/dui---driver-s-license-checkpoint-planned-this-weekend-2147407661/,Media Bulletins,200,DUI & Driver's License Checkpoint Planned this Weekend,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1538,http://www.longbeach.gov/police/press-releases/sexual-assault-suspect-arrested--additional-victims-sought/,Media Bulletins,200,SEXUAL ASSAULT SUSPECT ARRESTED; ADDITIONAL VICTIMS SOUGHT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1539,https://www.southamptontownnypolice.gov/1560/candle-light-vigil,Misc Police Activity,200,"Candle Light Vigil | Southampton, NY - Official Website","","[""\r\n\r\nCandle Light Vigil\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]",[],[],[] -1540,https://www.southamptontownnypolice.gov/faq.aspx?qid=425,Resources,200,FAQs • Will Cooper’s Beach be open? ,"",[],"[""\n\u25bc\r\nFAQ (COVID-19) | Southampton Town Beaches \t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1541,http://www.tampa.gov/police/info/honoring-our-heroes/1998/detective-randy-bell,Media Bulletins,200,Detective Randy Bell | City of Tampa,"On May 19, 1998, Detective Randy Bell, age 44 and Detective Ricky Childers, age 46, were assigned to the Homicide Squad. They were conducting an investigation involving the shooting death of a 4-year-old boy with an assault rifle. Detectives Bell and Childers took the father of the boy, Bennett, to Police headquarters for interviewing. Due to Bennett's inconsistent interview, he was taken back to the crime scene to re-enact his statements to the detectives. Unknown to the detectives, Mr. Bennett provided a false name and date of birth. In truth, Mr.","[""Detective Randy Bell\n""]","[""Police Department"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[] -1542,https://alpha.austin.gov/es/police-oversight/formal-complaint-2020-1346/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1543,http://www.longbeach.gov/police/press-releases/officer-involved-shootings-occur-after-suspect-fires-at-officers--leads-police-on-vehicle-pursuit/,Media Bulletins,200,OFFICER INVOLVED SHOOTINGS OCCUR AFTER SUSPECT FIRES AT OFFICERS; LEADS POLICE ON VEHICLE PURSUIT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1544,https://www.coppelltx.gov/903/coppell-recreation-and-development-corpo,Not Criminal Justice Related,200,"Coppell Recreation and Development Corporation | Coppell, TX",Learn more about this voter authorized sales tax revenue fund.,"[""\r\n\r\nCoppell Recreation and Development Corporation\t\t""]","[""Question or Comment? ""]","[""Loading"", ""Contact Us""]","[""Strategic Financial Engagement""]",[],[] -1545,https://www.sanramon.ca.gov/our_city/departments_and_divisions/police/victims_rights_information/domestic_violence,Resources,200," - Domestic Violence - City of San Ramon -","","[""Domestic Violence""]","[""Contact Us"", ""Contact Us"", ""Useful Links""]","[""RESOURCE INFORMATION FOR VICTIMS OF DOMESTIC VIOLENCE""]",[],[],[] -1546,https://www.mass.gov/doc/cruceta-neysa-v-boston-police-department-4512/download,Court Cases,200,"","",[],[],[],[],[],[] -1547,https://www.montgomeryohio.gov/police-department-2020-annual-report/office-otte-sro/,Poor Data Source,200,"- Montgomery, Ohio","","[""""]","[""Primary menu links"", ""Action toolbar"", ""Welcome"", ""Engage"", ""Help"", ""Mental Health Resource""]",[],[],[],[] -1548,https://dccouncil.gov/donation-disclosures/copy-of-april-2018-donation-disclosure-4/,Media Bulletins,200,Copy of April 2018 Donation Disclosure • Council of the District of Columbia,"","[""Copy of April 2018 Donation Disclosure""]",[],[],[],[],[] -1549,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/092421arrests.pdf,Arrest Records,200,"","",[],[],[],[],[],[] -1550,https://champaignil.gov/2014/04/23/fire-and-police-memorial-public-dedication-ceremony/,Not Criminal Justice Related,200,Fire and Police Memorial Public Dedication Ceremony - Update - City of Champaign,"","[""Fire and Police Memorial Public Dedication Ceremony \u2013 Update""]","[""News Releases"", ""Department News""]",[],[],[],[] -1551,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0976/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1552,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2017_news_releases/police_continue_missing_person_investigation,Media Bulletins,200," - Police Continue Missing Person Investigation - Village of Pleasant Prairie -","",[],"[""Police Continue Missing Person Investigation""]","[""Follow Us on Social Media""]",[],[],[] -1553,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0129/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1554,http://www.longbeach.gov/police/press-releases/business-license-operation-conducted/,Media Bulletins,200,BUSINESS LICENSE OPERATION CONDUCTED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1555,https://www.antioch.il.gov/wpfb-file/08-11-10-police-and-fire-commission-minutes-pdf-2/,Not Criminal Justice Related,200,"08-11-10 Police And Fire Commission Minutes - Antioch, IL",8960 08 11 10 police and fire commission minutes pdf commissions 2010 1284749388 415e95087ff8cdaefd2217d9ff094969 213x300 _zutqomf10kfw thumb jpg 09 17 13 49 48 0 pdf application num_pages pdf_pages timings,"[""08-11-10 Police And Fire Commission Minutes""]",[],[],[],[],[] -1556,https://delcopa.gov/publicrelations/releases/2020/staythecourse.html,Media Bulletins,200,"Governor Urges Residents, Business Owners and Politicians to “Stay the Course” - Delaware County, Pennsylvania","","[""Governor Urges Residents, Business Owners and Politicians to \u201cStay the Course\u201d""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1557,http://www.longbeach.gov/police/press-releases/robbery-suspects-arrested/,Media Bulletins,200,ROBBERY SUSPECTS ARRESTED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1558,https://delcopa.gov/jdboard/pdfs/minutes_2021_09_21.pdf,Misc Police Activity,200,"","",[],[],[],[],[],[] -1559,https://police.kingstontn.gov/team/raymond-gold/,Poor Data Source,200,Raymond Gold – Kingston Police Department,"",[],[],[],[],[],[] -1560,https://www.montebelloca.gov/departments/police/news/all_news_articles/national_night_out_2021,Misc Police Activity,200," - National Night Out 2021 - City of Montebello -","","[""City of Montebello""]","[""National Night Out 2021""]",[],[],[],[] -1561,https://www.lynchburgvapolice.gov/wp-content/uploads/2021/05/headlamp-2940-scaled.jpg,Poor Data Source,200,"","",[],[],[],[],[],[] -1562,http://www.ryepolice.us/logs/police-logs-for-4-22-20-4-28-20,Daily Activity Logs,200,Rye Police Department Police Logs for 4/22/20-4/28/20 - Rye Police Department,"","[""Police Logs for 4/22/20-4/28/20""]","[""Police Logs for 4/22/20-4/28/20""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -1563,https://mtcb.colorado.gov/police/animal-regulations-ordinances,Resources,200,Animal Regulations & Ordinances | Town of Mt. Crested Butte,Dog Registration The town of Mt. Crested Butte requires your dog to be registered. Proof of rabies vaccination will be required to register your dog. Fees to register are $10 if the dog has been spayed or neutered or $25 if they have not. Licenses are not transferable and are non-refundable. To renew or pay for a lost tag is $5. To obtain a dog license you have a few options:,"[""\nAnimal Regulations & Ordinances\n""]",[],"[""\n"", """"]",[],[],"[""Dog Registration"", ""Animal Ordinances in Mt. Crested Butte""]" -1564,http://www.ryepolice.us/logs/police-logs-for-52516-53116,Daily Activity Logs,200,Rye Police Department Police Logs for 5/25/16-5/31/16 - Rye Police Department,"","[""Police Logs for 5/25/16-5/31/16""]","[""Police Logs for 5/25/16-5/31/16""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -1565,https://delcopa.gov/ich/resources/covid19/pdf/delcocovid19vaccinationsites.pdf,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1566,https://delcopa.gov/publicrelations/releases/2019/energyefficiency.html,Not Criminal Justice Related,200,"Delaware County Participates in Energy Efficiency Day 2019 - Delaware County, Pennsylvania","","[""Delaware County Participates in Energy Efficiency Day 2019""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""4th annual national event urges citizens to \u201cSave Money. Cut Carbon. Breathe Easier.\u201d""]",[],[] -1567,https://cheswold.delaware.gov/cheswold-police-department-policy-and-procedure-manual/reports/,Policies & Contracts,200,Reports - Town of Cheswold,"","[""Cheswold""]","[""Delaware"", ""Reports""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[] -1568,http://police.portlandmaine.gov/400/payments,Resources,200,"Payments | Portland, ME - Official Website",The City of Portland offers four ways to make parking ticket payments so that you can choose the method that is most convenient for you.,"[""Payments""]",[],[],[],[],[] -1569,https://delcopa.gov/courts/pdf/emergencyjudicialorders/sixthemergencyextensionorder_criminalsection.pdf,Court Cases,200,"","",[],[],[],[],[],[] -1570,https://www.mass.gov/doc/cspolicechiefeeinstructions2010doc/download,Poor Data Source,200,"","",[],[],[],[],[],[] -1571,https://www.mass.gov/doc/011718-public-scoping-meeting-commercial-menhaden-management/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1572,https://delcopa.gov/pollingplace/,Not Criminal Justice Related,200,Untitled Document,"",[],[],[],[],[],[] -1573,https://police.greenvillesc.gov/1826/laurens-road-transit-study,Not Criminal Justice Related,404,"","",,,,,, -1574,http://lafayettepolice.us/1099/operations,Poor Data Source,200,"Operations | Lafayette, IN - Official Website","","[""\r\n\r\nOperations\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]","[""\nCommunity Services\n"", ""\nDivisions\n""]",[],[] -1575,https://www.mass.gov/doc/2021-hanover-police-lieutenant-sole-assessment-center-examination-employment-verification-form/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1576,http://www.ryepolice.us/logs/police-logs-for-7-25-18-7-31-18,Daily Activity Logs,200,Rye Police Department Police Logs for 7/25/18-7/31/18 - Rye Police Department,"","[""Police Logs for 7/25/18-7/31/18""]","[""Police Logs for 7/25/18-7/31/18""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -1577,https://hollister.ca.gov/government/city-departments/police/,Media Bulletins,200,"Police – City of Hollister, California","","[""\u00a0San Benito County Opioid Task Force""]",[],"[""Follow Us on..."", ""A Message from Chief Reynoso"", ""San Benito County Public Safety PSA"", ""HPD Values and Vision"", ""Follow Us on....""]",[],[],[] -1578,https://www.foxcrossingwi.gov/departments/police-department/patrol/wreck/,Poor Data Source,200,wreck - Fox Crossing Fox Crossing,"",[],"[""Patrol \u00bb wreck""]",[],[],[],[] -1579,https://www.lakewoodoh.gov/coffee-with-a-cop-set-for-friday-january-12th/,Misc Police Activity,200,"Coffee with a Cop set for Friday, January 12th | The City of Lakewood, Ohio","The Lakewood Police Department will host another ""Coffee With A Cop"" event on Friday, January 12, 2018 from 8:00 a.m. to 10:00 a.m. at McDonald's , 16407","[""Coffee with a Cop set for Friday, January 12th""]",[],"[""Recent News"", ""Upcoming Events"", ""Most Popular Pages""]",[],[],[] -1580,https://www.panynj.gov/police/en/about/leadership.html#main,Personnel Records,200,Leadership,"",[],[],[],[],[],[] -1581,https://gonzalesca.gov/services/police/how-do-i/learn-what-do-if-i-become-victim-crime,Resources,200,Learn what to do if I become the victim of a crime? | City of Gonzales,"Official City of Gonzales, CA website. Find the latest news, events, and information for residents and businesses....","[""The City of Gonzales, California"", ""The City of Gonzales, California""]","[""Top menu"", ""Learn what to do if I become the victim of a crime?""]",[],"[""CITY OF GONZALES""]",[],[] -1582,https://southamptontownnypolice.gov/faq.aspx?qid=323,Not Criminal Justice Related,200,FAQs • Who regulates deer hunting in the Town of Southampton,"",[],"[""\n\u25bc\r\nHunting Season\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1583,https://www.hayward-ca.gov/police-department/public-services/youth-family-services-bureau/contact,Resources,200,Contact | City of Hayward - Official website,"We have experienced mental health counselors answering the phone during business hours who can provide information and referrals to meet a range of needs. Sometimes, it can be difficult to reach out for help, but the supportive YFSB counselors can walk you through the process and make sure your family receives the services they need.To find out more about which YFSB counseling",[],"[""Contact"", ""You are here. So is everything else."", ""Search form""]",[],"[""Receive crime bulletins and alerts"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -1584,http://lafayettepolice.us/3400/enrichment-and-training-programs,Not Criminal Justice Related,200,"Enrichment and Training Programs | Lafayette, IN - Official Website","","[""\r\n\r\nEnrichment and Training Programs\t\t""]","[""About Enrichment"", ""CPZ\u2019s Enrichment Program"", ""How You Can Help""]","[""Loading"", ""Click below to view our Amazon Wishlist"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1585,https://delcopa.gov/vetaffairs/forms/va26-1880-are.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1586,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0034/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1587,https://champaignil.gov/tag/police-chief-recruitment/,Media Bulletins,200,Police Chief Recruitment Archives - City of Champaign,"","[""Items tagged: Police Chief Recruitment""]","[""City of Champaign Announces Finalists for Chief of Police Position"", ""City of Champaign Extends Application Deadline for Police Chief Recruitment"", ""Community Meetings Held for Public Works Director and Police Chief Recruitments"", ""News Releases"", ""Department News""]",[],[],[],[] -1588,http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-8-/,Media Bulletins,200,DUI-DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND(8),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1589,https://southamptontownnypolice.gov/faq.aspx?qid=485,Not Criminal Justice Related,200,FAQs • How long does it take to receive my rebate?,"",[],"[""\n\u25bc\r\nSeptic Rebate Program\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1590,https://www.antioch.il.gov/2017/09/18/police-department-media-release-2/,Media Bulletins,200,"Police Department Media Release - Antioch, IL","Media Release September 18, 2017 Antioch, IL- On September 14, 2017, an off-duty Antioch Police Officer was returning to Antioch from training while driving a police vehicle. Around 5:00pm he noticed that a silver vehicle appeared to be following him. The driver of the vehicle, later identified as 68 year old David L. Larsen, of","[""Police Department Media Release""]",[],[],[],[],[] -1591,https://www.southamptontownnypolice.gov/faq.aspx?qid=443,Resources,200,FAQs • Can I get a beach permit if I do not own a vehicle?,"",[],"[""\n\u25bc\r\nFAQ (COVID-19) | Southampton Town Beaches \t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1592,https://delcopa.gov/publicrelations/releases/18pdfs/18opioidmentalsummit.pdf,Misc Police Activity,200,"","",[],[],[],[],[],[] -1593,https://www.huntsvilleal.gov/huntsville-police-department-honors-12-fallen-officers-2/,Media Bulletins,200,Huntsville Police Department honors 12 fallen officers - City of Huntsville,"","[""Huntsville Police Department honors 12 fallen officers""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],[],"[""Browse By Month "", ""Browse By Category "", ""Share & Print"", ""Huntsville Police Department honors 12 fallen officers""]",[] -1594,https://alpha.austin.gov/police-oversight/formal-complaint-purpose-and-scope-10/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1595,https://council.seattle.gov/2016/09/15/our-north-seattle-police-precinct/,Policies & Contracts,200,Our North Seattle Police Precinct - Seattle City Council Blog,"","[""Our North Seattle Police Precinct""]",[],"[""HELPFUL LINKS"", ""Make your voice heard"", ""Councilmembers""]",[],[],[] -1596,https://www.southamptontownnypolice.gov/1629/nitrogen-reducing-biofilter-incarnation-,Not Criminal Justice Related,200,"Nitrogen Reducing Biofilter (Incarnation Lutheran Church, Bridgehampton) | Southampton, NY - Official Website","","[""\r\n\r\nNitrogen Reducing Biofilter (Incarnation Lutheran Church, Bridgehampton) \t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]","[""WQIPP - Fund Application"", ""Summary Sheet""]",[],[] -1597,https://spdblotter.seattle.gov/2011/03/04/one-day-community-police-academy/,Media Bulletins,200,One-day Community Police Academy - SPD Blotter,"","[""One-day Community Police Academy""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -1598,https://southamptontownnypolice.gov/faq.aspx?qid=266,Complaints & Misconduct,200,FAQs • How do I report a violation?,"",[],"[""\n\u25bc\r\nPublic Safety - Fire Prevention\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1599,https://norfolkne.gov/assets/site/documentcentral/police/archived-arrests/2017-arrests/oct-2017-arrests.pdf,Arrest Records,200,"","",[],[],[],[],[],[] -1600,https://owd.boston.gov/wp-content/uploads/2022/06/davidramos3-1-copy.jpg,Poor Data Source,404,"","",,,,,, -1601,https://delcopa.gov/courts/domesticrelations/forms/directdepositenrollment.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1602,http://www.longbeach.gov/police/press-releases/traffic-fatality3/,Media Bulletins,200,Traffic Fatality (Carson & California),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1603,https://www.knoxvilletn.gov/government/city_departments_offices/community_empowerment/police_advisory_review_committee,Misc Police Activity,404,"","",,,,,, -1604,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2018_archived_news/september_2018/two_arlington_police_officers_honored_by_governor,Media Bulletins,200," - Two Arlington Police Officers Honored by Governor with Star of Texas Award - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Two Arlington Police Officers Honored by Governor with Star of Texas Award""]",[],[],[],[] -1605,https://www.colma.ca.gov/question/how-do-i-get-a-copy-of-a-birth-certificate/,Resources,200,How do I get a copy of a birth certificate? - Town of Colma,"","[""How do I get a copy of a birth certificate?""]","[""Primary menu links"", ""Action toolbar"", ""Contact"", ""Subscribe"", ""Connect""]",[],[],[],[] -1606,https://beaumonttexas.gov/beaumont-police-traffic-division-investigating-a-fatality-crash-eastex-frwy-and-chinn-ln/,Poor Data Source,404,"","",,,,,, -1607,http://www.longbeach.gov/police/press-releases/lbpd-recruit-academy-graduation-ceremony-held-today/,Media Bulletins,200,LBPD RECRUIT ACADEMY GRADUATION CEREMONY HELD TODAY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1608,http://beaverpolice.us/event/beaver-county-symphonic-wind-ensemble-concert/,Not Criminal Justice Related,200,Beaver County Symphonic Wind Ensemble Concert – Beaver Police Department,"","[""Beaver County Symphonic Wind Ensemble Concert""]","[""\u00a9 2023 Beaver Police Department |"", ""\u00a9 2023 Beaver Police Department |""]","[""Archives"", ""Recent Comments"", ""\r\n Post navigation "", ""Subscribe to our Newsletter"", ""Upcoming Events""]",[],[],[] -1609,https://hilliardohio.gov/tag/police-recruitment/,Poor Data Source,200,police recruitment,"","[""""]",[],"[""Filter News"", ""Archive""]","[""Have any news to share?"", ""There are no news articles under this category."", ""City Hall and Admin"", ""Hilliard Mayor's Court"", ""Division of Police"", ""Police Assistance"", ""Police Records and General Assistance"", ""Norwich Township Fire"", ""Hilliard Recreation & Parks"", ""Hilliard Newsletter"", ""Quick Links"", ""Stay connected with us""]",[],"[""Click the \u2018x\u2019 to opt out.""]" -1610,https://brookfieldil.gov/publication/050609-may-6-2009-fire-and-police-commission/,Poor Data Source,404,"","",,,,,, -1611,https://www.southamptontownnypolice.gov/faq.aspx?qid=262,Not Criminal Justice Related,200,FAQs • Why do the fire marshals perform business inspections,"",[],"[""\n\u25bc\r\nPublic Safety - Fire Prevention\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1612,https://www.sandiego.gov/department-document/police-identify-burned-homicide-victim-bay-park,Media Bulletins,200,Police Identify Burned Homicide Victim In Bay Park | City of San Diego Official Website,"","[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Police Identify Burned Homicide Victim In Bay Park"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -1613,https://delcopa.gov/council/2018minutes/101718minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1614,https://hollister.ca.gov/government/city-departments/police/,Personnel Records,200,"Police – City of Hollister, California","","[""\u00a0San Benito County Opioid Task Force""]",[],"[""Follow Us on..."", ""A Message from Chief Reynoso"", ""San Benito County Public Safety PSA"", ""HPD Values and Vision"", ""Follow Us on....""]",[],[],[] -1615,https://alpha.austin.gov/es/police-oversight/2020-06-09-14/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1616,https://delcopa.gov/sustainability/presentations/22/12_victordonnay_v2.pptx,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1617,https://coloradosprings.gov/police-department/page/cspd-community-survey,Poor Data Source,403,"","",,,,,, -1618,http://chico.ca.us/post/chico-police-officer-mark-bass-honored-chico-noon-exchange-74th-annual-peace-officer-year,Media Bulletins,404,"","",,,,,, -1619,https://www.roseville.ca.us/government/departments/police_department/community_services/my_neighborhood_officer/beat_4,Resources,200," - Beat 4 - City of Roseville -","","[""City of Roseville""]","[""Beat 4""]","[""Roseville Police Department ""]",[],[],[] -1620,http://www.longbeach.gov/police/press-releases/murder-suicide-1500-block-of-park-avenue/,Media Bulletins,200,MURDER SUICIDE 1500 BLOCK OF PARK AVENUE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1621,https://www.happyvalleyor.gov/services/police-department/reporting-accidents/,Resources,200,Reporting Accidents | City of Happy Valley,"","[""Reporting Accidents""]","[""City Hall"", ""Business"", ""Community"", ""How Do I?""]","[""City of Happy Valley"", ""Government"", ""Take Action""]","[""\n16000 SE Misty Drive, Happy Valley, OR 97086\n"", ""(503) 783-3800 | [email\u00a0protected]""]","[""Oregon law requires that drivers involved in an accident file an accident report if the accident involves any of the following conditions:""]","[""General"", ""Departments"", ""Boards & Commissions"", ""General"", ""Resources"", ""Divisions"", ""General"", ""Amenities"", ""Services""]" -1622,https://www.gov.ca.gov/2020/04/02/governor-newsom-statement-on-death-of-santa-rosa-police-detective/,Poor Data Source,200,Governor Newsom Statement on Death of Santa Rosa Police Detective | California Governor,SACRAMENTO — Governor Gavin Newsom today issued the following statement regarding the death of Santa Rosa Police Department Detective Marylou Armer: “Jennifer…,"[""Governor Newsom Statement on Death of Santa Rosa Police Detective""]",[],[],"[""Recent News"", ""Archives"", ""Categories""]",[],[] -1623,https://www.milpitas.gov/milpitas/departments/police/recruitment-training/,Poor Data Source,404,"","",,,,,, -1624,http://www.longbeach.gov/police/press-releases/arsonist-sought-in-flag-burning-case/,Media Bulletins,200,ARSONIST SOUGHT IN FLAG BURNING CASE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1625,https://delcopa.gov/departments/womenscommission/20history.html,Not Criminal Justice Related,200,"Women's History Month 2020 - Delaware County, Pennsylvania","","[""Women's History Month 2020""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""The Delaware County Women's Commission postponed the Women's History Month Breakfast originally scheduled for March 25, 2020, rescheduled to May 13, 2020, then eventually cancelled."", ""The 2020 theme, rolled into the 2021 theme since \u201cValiant Women of the Vote\u201d was such a significant anniversary of the right to vote for women in 1920!. Unfortunately, due to the pandemic, we did not celebrate in person in 2021. However, our winners received recognition at the County Council meeting on March 17, 2021 and received a gift card in the following month to recognize their achievement.""]",[],[] -1626,http://www.longbeach.gov/police/press-releases/traffic-fatality-spring-street-west-of-el-dorado-park/,Media Bulletins,200,TRAFFIC FATALITY - Spring Street West of El Dorado Park,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1627,https://www.southamptontownnypolice.gov/faq.aspx?qid=510,Resources,200,FAQs • How can I purchase a Village permit? ,"",[],"[""\n\u25bc\r\nParks & Rec\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1628,https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-42/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1629,https://ci.newcastle.wa.us/departments/police/e-_alerts,Resources,200," - E-News - City of Newcastle -","",[],"[""City of Newcastle""]",[],"[""City of NewcastleWashington"", ""Newsletters"", ""Public Meeting Notices"", ""Employment Opportunities""]",[],[] -1630,http://www.longbeach.gov/police/press-releases/traffic-fatality-pch--myrtle-ave/,Media Bulletins,200,Traffic Fatality PCH / Myrtle Ave,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1631,https://www.mass.gov/doc/05-14-15-police-and-school-officials-attend-da-morrisseys-safe-and-supportive-schools-0/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1632,https://www.mass.gov/doc/emergencywaiverpcopdf/download,Poor Data Source,200,"","",[],[],[],[],[],[] -1633,https://www.antioch.il.gov/wpfb-file/12-13-11-police-pension-fund-agenda-pdf-4/,Policies & Contracts,200,"12-13-11 Police Pension Fund Agenda - Antioch, IL",13491 12 13 11 police pension fund agenda pdf commissions agendas 2011 1625758338 7fbda0786265e371ec5e6ffad4bd173e 56c15fa57ff824b7283a17b27825a5436651578c6fa9ea2e742221c5e8297cba 217x300 _1l28v3ffmhil thumb jpg 2017 05 17 08 41 32 0 157 55 39 34 2021 06 02 49 25 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17,"[""12-13-11 Police Pension Fund Agenda""]",[],[],[],[],[] -1634,https://www.mass.gov/doc/state-police-academy-rules-and-regulations/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -1635,https://www.crystalmn.gov/how_do_i____/contact/police_department,Contact Info & Agency Meta,200," - Contact Us - City of Crystal-Police -",Locations and contact information to the City of Crystal Police Department.,"[""Contact Us""]","[""Deputy Police Chief"", ""Police Chief""]","[""Sign up for a city newsletter or notification."", ""Police Department"", ""Lobby Hours:""]","[""Monday - Friday""]",[],[] -1636,https://www.roundrocktexas.gov/news/police-investigate-new-years-eve-auto-pedestrian-collision/,Media Bulletins,200,Police investigate New Year's Eve auto-pedestrian collision - City of Round Rock,"",[],[],"[""Police investigate New Year\u2019s Eve auto-pedestrian collision""]","[""Site Search"", ""Follow Us""]",[],[] -1637,http://www.longbeach.gov/police/press-releases/murder-investigation8/,Media Bulletins,200,MURDER INVESTIGATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1638,https://www.roseville.ca.us/news/archive_news/2017_archive_news/police_digest_120117,Poor Data Source,404,"","",,,,,, -1639,https://www.huntsvilleal.gov/organizer/huntsville-police-department/,Misc Police Activity,200,Huntsville Police Department – City of Huntsville,"","[""City Calendar""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],[],[],[] -1640,https://brimfieldohio.gov/event/bpd-coffee-with-a-cop/,Misc Police Activity,404,"","",,,,,, -1641,https://shelbycity.oh.gov/wp-content/uploads/2020/03/downtown-flag-dark-copy-150x150.jpg,Poor Data Source,200,"","",[],[],[],[],[],[] -1642,https://delcopa.gov/ampembed?url=https://delcowebmedia2-usea.streaming.media.azure.net/79bc7ec7-9862-4100-bfd8-06a71de3d5af/delaware county covid-19 memoria.ism/manifest,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1643,https://police.greenvillesc.gov/faq.aspx?qid=63,Resources,200,FAQs • How can I find information about a specific city prop,"",[],"[""\n\u25bc\r\nPlanning & Zoning \t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -1644,https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-courtesy-department-issued-bwc/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1645,http://edmonstonmd.gov/departments-services/police/photo-enforcement/,Resources,404,"","",,,,,, -1646,https://health.wyo.gov/publichealth/office-of-performance-improvement-and-health-equity/sha/health-improvement-strategy/copy-of-ship-access-cga-video-es/,Resources,200,Copy of SHIP-Access-CGA Video-ES - Wyoming Department of Health,"","[""Copy of SHIP-Access-CGA Video-ES""]","[""Office of Training, Performance, and Equity""]",[],[],"[""Contact Info:""]",[] -1647,https://www.mass.gov/doc/flaherty-and-mccarthy-v-boston-police-department-12909/download,Court Cases,200,"","",[],[],[],[],[],[] -1648,https://www.mass.gov/doc/municipal-police-training-committee-cjt/download,Poor Data Source,404,"","",,,,,, -1649,https://delcopa.gov/council/2016minutes/080316minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1650,https://www.lynchburgvapolice.gov/wp-content/uploads/2021/05/headlamp-2940-scaled.jpg,Poor Data Source,200,"","",[],[],[],[],[],[] -1651,https://coloradosprings.gov/police-department/article/news/traffic-fatality-1200-block-north-academy,Media Bulletins,200,Traffic Fatality: 1200 Block of North Academy Boulevard | City of Colorado Springs,"","[""\nTraffic Fatality: 1200 Block of North Academy Boulevard\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -1652,https://delcopa.gov/planning/pubs/saldoappenixcpreliminary.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1653,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/040421summary.pdf,Daily Activity Logs,200,"","",[],[],[],[],[],[] -1654,http://www.longbeach.gov/police/press-releases/found---critical-missing-person---/,Media Bulletins,200,FOUND---CRITICAL MISSING PERSON---,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1655,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-2-/,Media Bulletins,200,DUI Saturation Patrol(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1656,https://www.mass.gov/info-details/audit-of-the-worcester-state-university-objectives-scope-and-methodology,Not Criminal Justice Related,200,"Audit of the Worcester State University Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Worcester State University,"[""\nAudit of the Worcester State University Objectives, Scope, and Methodology\n""]","[""Table of Contents\n for the audit, Audit of the Worcester State University"", ""Table of Contents"", ""Overview\n "", ""Data Reliability\n "", ""Conclusion\n "", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -1657,https://wrightstown.us/police-crime-prevention-programs/neighborhood-watch/img_2876/,Poor Data Source,200,IMG_2876 - Village of Wrightstown,"","[""IMG_2876""]","[""Recent News"", ""\n\t\t\t\t\t\tUpcoming Events\t\t\t\t\t""]",[],"[""Village Hall"", ""Public Works"", ""Police Department"", ""Fire Department"", ""Join Us on Social Media""]",[],[] -1658,https://southamptontownnypolice.gov/214/transportation-traffic-safety,Not Criminal Justice Related,200,"Municipal Work's - Transportation & Traffic Safety | Southampton, NY - Official Website",Find out what the responsibilities are for the Intermodal Transportation Division.,"[""\r\n\r\nMunicipal Work's - Transportation & Traffic Safety\t\t""]","[""Traffic Safety"", ""Transportation Commission"", ""Public Transportation"", """"]","[""Loading"", ""Site Tools"", ""Contact Us"", ""Department of Municipal Works"", ""FAQs"", ""Contact Us"", ""Site Links""]",[],[],[] -1659,https://www.rentonwa.gov/city_hall/police/staff_services,Resources,200," - Staff Services - City of Renton -","Staff services provide Fingerprint Services, Concealed Pistol License, Public Record Requests, Med-Project Kiosk.","[""CITY OF RENTON\r\n\t\t\t\t\tWASHINGTON""]","[""Staff Services""]",[],"[""Concealed Pistol License"", ""Do you live within the Renton City limits?"", ""For an Original Concealed Pistol License"", ""Fee"", ""Renewing Concealed Pistol Licenses"", ""Fees"", ""Public Records Requests"", ""Med-Project Kiosk"", ""Not Accepted""]","[""S. Cour, Manager""]","[""Staff Services Division""]" -1660,http://beaverpolice.us/staff-members/eric-schwartz/,Poor Data Source,404,"","",,,,,, -1661,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0159/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1662,http://www.ryepolice.us/announcements/new-rye-animal-control-instragram/attachment/dumpster-divers,Poor Data Source,200,Rye Police Department Dumpster Divers - Rye Police Department,"","[""Dumpster Divers""]","[""Dumpster Divers""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -1663,https://www.wakeforestnc.gov/police/public-information/firing-range,Resources,200,"Firing Range | Town of Wake Forest, NC","The Wake Forest Police Department operates it's own firing range. Located behind the Flaherty Park Community Center, 1226 N. White St., the firing range is surrounded by a security fence that is locked at all times, unless in use by police department personnel. The firing range is NOT open to the public.The range is utilized by the department for required yearly qualifications","[""Firing Range""]","[""img_0371.jpg"", ""Search form"", ""You are here""]",[],[],[],"[""2023 Training Schedule\u00a0\u00a0""]" -1664,https://www.antioch.il.gov/wpfb-file/coffee-with-the-cop-oct-pdf/,Misc Police Activity,200,"Coffee With The Cop Oct - Antioch, IL",15191 coffee with the cop oct pdf event documents 2017 1625759877 70716cc0549a2ad9a2febce0275526fa 5bc8dbb72585c97ef21ff0adf7098646ac0ec42c3ecce91bf227a8aef423a06d 234x300 _h19howtsjv7j thumb jpg 09 07 10 03 34 0 106 50 141 2021 05 25 14 40 32 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17 pagefailed_18 pagefailed_19 pagefailed_20,"[""Coffee With The Cop Oct""]",[],[],[],[],[] -1665,https://www.coronadelmar.us/police-investigating-social-media-threat-against-newport-mesa-unified-high-schools/,Media Bulletins,200,Police investigating social media threat against Newport-Mesa Unified high schools … | Corona del Mar California,"","[""Police investigating social media threat against Newport-Mesa Unified high schools \u2026""]","[""Menu"", "" Be First to Comment"", ""Subscribe"", """", """"]","[""Share this:"", ""Like this:"", ""Related"", ""Leave a Reply Cancel reply"", """"]",[],[],[] -1666,http://www.longbeach.gov/police/press-releases/murder-investigation---4th-street-and-pacific-avenue/,Media Bulletins,200,Murder Investigation - 4th Street and Pacific Avenue,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1667,https://www.coronadelmar.us/newport-beach-mourns-locals-killed-in-helicopter-crash-media-6/,Not Criminal Justice Related,200,Newport Beach Mourns Locals Killed in Helicopter Crash-media-6 | Corona del Mar California,"","[""Newport Beach Mourns Locals Killed in Helicopter Crash-media-6""]","[""Menu"", "" Be First to Comment"", ""Subscribe"", """", """"]","[""Leave a Reply Cancel reply"", """"]",[],[],[] -1668,https://southamptontownnypolice.gov/439/southampton-shinnecock-hills-tuckahoe-ca,Not Criminal Justice Related,200,"Southampton / Shinnecock Hills / Tuckahoe CAC | Southampton, NY - Official Website",Find out more about the Southampton / Shinnecock Hills / Tuckahoe Citizen Advisory Committee.,"[""\r\n\r\nSouthampton / Shinnecock Hills / Tuckahoe CAC \t\t""]","[""Meetings"", ""Members""]","[""Loading"", ""Site Tools"", ""Quick Links"", ""Contact Us"", ""Site Links""]",[],[],[] -1669,https://santabarbaraca.gov/news/santa-barbara-police-requesting-assistance-locating-attempt-murder-suspect,Media Bulletins,200,Santa Barbara Police Requesting Assistance in Locating Attempt Murder Suspect | City of Santa Barbara,The Santa Barbara Police Department is requesting the assistance of the public in locating the whereabouts of a subject who is wanted for attempt murder and several felony firearms violations.,"[""Santa Barbara Police Requesting Assistance in Locating Attempt Murder Suspect""]","[""Breadcrumb"", ""This is the prefooter section"", ""Main Footer"", ""City Hall"", ""Mailing Address"", ""Newsletters""]",[],[],[],[] -1670,https://www.hickoryhillspd.us/2014/06/message-from-the-chief-of-police/,Poor Data Source,200,Message From The Chief of Police,"","[""Message From The Chief of Police""]","["""", ""Post navigation""]",[],"[""Report a Concern"", ""Investigative Tip Line"", ""Hot Links"", ""Contact Information""]",[],[] -1671,https://www.woodvillageor.gov/departments/public-safety/police-law-enforcement/,Resources,404,"","",,,,,, -1672,https://www.mass.gov/info-details/the-massachusetts-port-authority-audit-objectives-scope-and-methodology,Policies & Contracts,200,"The Massachusetts Port Authority Audit Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Massachusetts Port Authority.,"[""\nThe Massachusetts Port Authority Audit Objectives, Scope, and Methodology\n""]","[""Table of Contents\n for the audit, Audit of the Massachusetts Port Authority"", ""Table of Contents"", ""Overview\n "", ""Data Reliability\n "", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -1673,https://www.coppelltx.gov/faq.aspx?qid=249,Resources,200,FAQs • Can the City stop the installation of 5G/Small Cell u,"",[],"[""\n\u25bc\r\n5G / Small Cell\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -1674,https://www.hayward-ca.gov/police-department/programs/business-watch-program,Resources,200,Business Watch Program | City of Hayward - Official website,"Lessen the Opportunities for the CriminalsTake control of what happens in your business community and lessen your chances of becoming a victim. Through ""Business Watch,"" you will be making crimes against yourself and your fellow business neighbors as difficult as possible.What is Business Watch?Business Watch is a crime prevention program that enlists the active participation",[],"[""Business Watch Program"", ""You are here. So is everything else."", ""Search form""]",[],"[""Lessen the Opportunities for the Criminals"", ""What is Business Watch?"", ""What are the Benefits of participating in Business Watch?"", ""How do I start a Business Watch?"", ""How do I learn more about Business Watch?"", ""Receive crime bulletins and alerts"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -1675,http://www.longbeach.gov/police/press-releases/residential-burglary-suspect-arrested/,Media Bulletins,200,RESIDENTIAL BURGLARY SUSPECT ARRESTED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1676,https://www.burienwa.gov/news_events/city_newsroom/news_announcements/burien_police_chief_promoted_within_kcso,Media Bulletins,200," - Burien Police Chief Promoted Within KCSO - City of Burien -","Burien Police Chief Theodore “Ted” Boe has accepted a promotion to serve as Patrol Operations Division Chief for King County Sheriff’s Office, effective January 1, 2023.","[""City of Burien""]","[""Burien Police Chief Promoted Within KCSO""]",[],[],[],[] -1677,https://www.lynchburgvapolice.gov/news-updates/update-news-release-incident-involving-lpd-officer/,Media Bulletins,200,[UPDATE] NEWS RELEASE: INCIDENT INVOLVING LPD OFFICER - Lynchburg Police Department,"","[""[UPDATE] NEWS RELEASE: INCIDENT INVOLVING LPD OFFICER""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[] -1678,https://delcopa.gov/vsc/,Not Criminal Justice Related,200,Untitled Document,"",[],[],[],[],[],[] -1679,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/arrests/070722arrests.pdf,Poor Data Source,404,"","",,,,,, -1680,http://www.ryepolice.us/westnile,Not Criminal Justice Related,200,Rye Police Department West Nile / EEE - Rye Police Department,"","[""West Nile / EEE""]","[""West Nile Virus"", ""Eastern Equine Encephalitis"", ""The Spread of EEE and WNV"", ""Prevention Guidelines"", ""Dead Bird Testing""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -1681,https://www.ashevillenc.gov/news/asheville-police-department-launches-online-reporting-as-part-of-upgraded-police-to-citizen-tool/,Media Bulletins,200,Asheville Police Department launches online reporting as part of upgraded Police to Citizen Tool - The City of Asheville,"","[""Asheville Police Department launches online reporting as part of\u00a0upgraded Police to Citizen Tool""]",[],[],[],[],[] -1682,https://delcopa.gov/courts/juror/eresponse.html,Resources,200,Juror eResponse - Delaware County Court of Common Pleas,"","[""Juror eResponse""]",[],"[""Jury Services Navigation"", ""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[] -1683,https://www.mass.gov/doc/public-meeting-ma-state-police-lower-basin-barracks-modernization/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1684,https://norfolkne.gov/assets/site/documentcentral/police/archived-calls-for-service/2017-calls-for-service/march2017cfs.pdf,Calls for Service,200,"","",[],[],[],[],[],[] -1685,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/111821summary.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -1686,http://www.greenvillenc.gov/government/police/mental-health-crisis-services,Poor Data Source,404,"","",,,,,, -1687,https://www.roseville.ca.us/government/departments/electric_utility/rebates___energy_savings/your_trusted_solar_advisor_copy,Not Criminal Justice Related,200," - Your Trusted Solar Advisor - City of Roseville -","","[""City of Roseville""]","[""Your Trusted Solar Advisor""]","[""\nCONTACT US"", ""City of Roseville""]",[],[],[] -1688,https://delcopa.gov/publicrelations/releases/2020/covidtesting_canceledmillbournesept.html,Not Criminal Justice Related,200,"Delaware County Cancels COVID-19 Public Testing Site in Millbourne - Delaware County, Pennsylvania","","[""Delaware County Cancels COVID-19 Public Testing Site in Millbourne""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""September 17 drive-thru and walk-up testing for Delaware County residents and workers canceled""]",[],[] -1689,https://www.lynchburgvapolice.gov/wp-content/uploads/2021/06/lynchburg-police-patch-new-w-red.png,Poor Data Source,404,"","",,,,,, -1690,http://www.longbeach.gov/police/press-releases/charges-filed-in-2002-murder/,Media Bulletins,200,Charges Filed in 2002 Murder,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1691,https://www.gurnee.il.us/events/2017/06/10/default-calendar/2017-outrun-the-cops!,Not Criminal Justice Related,200," - 2017 Outrun The Cops! -","","[""Events"", ""Events View Calendar""]","[""2017 Outrun The Cops!""]","[""Village Hall""]",[],[],[] -1692,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/092921blotter.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -1693,https://santabarbaraca.gov/government/departments/santa-barbara-police-department,Contact Info & Agency Meta,200,Santa Barbara Police Department | City of Santa Barbara,For any Emergency Dial: 9-1-1  Non-Emergency Dispatch: 805-882-8900,"[""Santa Barbara Police Department""]","[""For any Emergency Dial: 9-1-1"", ""\u00a0Non-Emergency Dispatch: 805-882-8900"", ""Police Department Information"", ""News Feed & Media Releases"", ""Contact Us"", ""This is the prefooter section"", ""Main Footer"", ""City Hall"", ""Mailing Address"", ""Newsletters""]",[],[],"[""Currently, the Police Department Lobby will be open for in-person service during the following days and times:"", ""CCW APPLICATION INFORMATION"", ""WEAPONS/RANGE QUALIFICATIONS AND TRAINING"", ""APPLY FOR A CCW""]",[] -1694,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2019_news_releases/19-_year-_old_suffers_fatal_gunshot_wound_update,Not Criminal Justice Related,200," - 19-Year-Old Suffers Fatal Gunshot Wound Update - Village of Pleasant Prairie -","",[],"[""19-Year-Old Suffers Fatal Gunshot Wound Update""]","[""Follow Us on Social Media""]",[],[],[] -1695,https://www.prescott-az.gov/services-safety/police/police-program-and-services/,Contact Info & Agency Meta,200,Prescott Police | Prescott Police Department | Dedicated to Public Safety,Prescott Police Department provides the highest level of service in a collaborative effort with our community. Public Safety is Job #1.,[],"[""PUBLIC SAFETY IS JOB ONE!"", ""Keep in Touch""]","[""PrescottPolice"", ""Values"", ""Crime Prevention""]",[],[],[] -1696,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/060721summary1.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -1697,https://delcopa.gov/planning/programsandinitiatives/naturalresourceprotection.html,Resources,200,Natural Resource Protection,"","[""Natural Resource Protection""]","["" Natural Resource Protection Assistance\n"", "" Natural Heritage Inventory\n""]","[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1698,https://www.edmondswa.gov/services/police,Contact Info & Agency Meta,200," - Police Department - City of Edmonds, WA -","","[""City of Edmonds - Washington""]","[""Police Department""]","[""Service\u00a0 Integrity\u00a0 Respect\u00a0 Stewardship"", ""Michelle Bennett\n\nChief of Police"", ""Edmonds Police Department"", ""Recruitment and Hiring""]",[],[],[] -1699,https://www.southamptontownnypolice.gov/faq.aspx?qid=79,Not Criminal Justice Related,200,FAQs • How do I report overcrowding conditions in a bar or n,"",[],"[""\n\u25bc\r\nPublic Safety - Code Enforcement\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1700,https://coloradosprings.gov/police-department/page/coffee-cop,Not Criminal Justice Related,200,Coffee with a Cop | City of Colorado Springs,"","[""\nCoffee with a Cop\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -1701,https://www.wheelingwv.gov/policejobs,Training & Hiring Info,200,Police Employment,Official Website for the City of Wheeling West Virginia,"[""Police Employment""]",[],"[""Contact Info""]",[],[],[] -1702,http://www.ryepolice.us/announcements/aquarion-water-company-boil-order-8-23-19,Not Criminal Justice Related,200,Rye Police Department AQUARION WATER COMPANY BOIL ORDER! 8/23/19 - Rye Police Department,"","[""AQUARION WATER COMPANY BOIL ORDER! 8/23/19""]","[""AQUARION WATER COMPANY BOIL ORDER! 8/23/19""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -1703,https://delcopa.gov/delcoready/involved.html,Resources,200,"Be Involved - Delaware County, Pennsylvania","","[""Be Involved""]","[""Be Involved ""]","[""Delco Ready Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1704,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0889/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1705,https://delcopa.gov/publicrelations/releases/2019/airforceflagraising.html,Not Criminal Justice Related,200,"United States Air Force flag raised to commemorate anniversary - Delaware County, Pennsylvania","","[""United States Air Force flag raised to commemorate anniversary""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1706,https://police.birminghamal.gov/command-staff/lieutenants/,Personnel Records,200,Lieutenants | Birmingham Police Department,"","[""\n\n\n Birmingham Police Department\n\n\t\t\t\t\tCommitment | Excellence | Integrity\t\t\t\t\n\n""]","[""Putting People First"", ""Lieutenants""]",[],"[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[] -1707,https://www.mass.gov/info-details/audit-of-the-massachusetts-bay-transportation-authority-objectives-scope-and-methodology,Not Criminal Justice Related,200,"Audit of the Massachusetts Bay Transportation Authority Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Massachusetts Bay Transportation Authority.,"[""\nAudit of the Massachusetts Bay Transportation Authority Objectives, Scope, and Methodology\n""]","[""Table of Contents\n for the audit, Audit of the Massachusetts Bay Transportation Authority (MBTA)"", ""Table of Contents"", ""Overview\n "", ""Data Reliability\n "", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -1708,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0765/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1709,http://www.longbeach.gov/police/press-releases/fatal-hit-and-run/,Media Bulletins,200,LBPD ASKING FOR PUBLIC'S HELP:FATAL HIT AND RUN,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1710,https://ose.louisiana.gov/event/police-communications-officer-34/,Poor Data Source,200,Police Communications Officer | Louisiana Office of State Examiner,"","["""", ""Police Communications Officer""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -1711,https://www.ci.san-ramon.ca.us/our_city/departments_and_divisions/police/victims_rights_information/hate_violence,Poor Data Source,200,"","",[],[],[],[],[],[] -1712,https://delcopa.gov/planning/pdf/demodata/povertystatus.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1713,https://www.lynchburgvapolice.gov/wp-content/uploads/2022/02/20220201_162001000_ios.jpg,Poor Data Source,404,"","",,,,,, -1714,http://www.longbeach.gov/police/press-releases/murder-1200-block-of-e--17th-street/,Media Bulletins,200,MURDER 1200 block of E. 17th Street,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1715,https://www.mass.gov/doc/municipal-police-training-committee-mptc-meeting-minutes-101619/download,Misc Police Activity,200,"","",[],[],[],[],[],[] -1716,https://www.arlingtontx.gov/news/my_arlington_t_x/news_stories/arlington_police_chief_announces_retirement,Media Bulletins,200," - Arlington Police Chief Announces Retirement - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Arlington Police Chief Announces Retirement""]",[],[],[],[] -1717,https://coloradosprings.gov/article/news/balltoberfest-collects-donated-sports-balls-police-departments-play-cos,Not Criminal Justice Related,200,Balltoberfest collects donated sports balls for police department's Play COS | City of Colorado Springs,"","[""\nBalltoberfest collects donated sports balls for police department's Play COS\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]","[""About the Play COS Program""]",[],"[""REPORT ONLINE""]",[] -1718,https://www.florenceaz.gov/jobs/police-records-clerk/,Poor Data Source,404,"","",,,,,, -1719,https://coloradosprings.gov/police-department/article/news/homicide-investigation-3500-block-south,Media Bulletins,200,Homicide Investigation: 3500 Block of South Chelton Loop | City of Colorado Springs,"","[""\nHomicide Investigation: 3500 Block of South Chelton Loop\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -1720,http://www.longbeach.gov/police/press-releases/murder--9th-st----locust-ave--/,Media Bulletins,200,Murder (9th St. & Locust Ave.),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1721,https://www.pleasantprairiewi.gov/news/2021_news/police_department_celebrates_50_years_of_service,Media Bulletins,200," - Police Department Celebrates 50 Years of Service - Village of Pleasant Prairie -","",[],"[""Police Department Celebrates 50 Years of Service""]","[""Follow Us on Social Media""]",[],[],[] -1722,https://www.sandiego.gov/department-document/san-diego-police-announce-arrests-home-invasion-series,Media Bulletins,200,San Diego Police Announce Arrests in Home Invasion Series | City of San Diego Official Website,"","[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""San Diego Police Announce Arrests in Home Invasion Series"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -1723,http://www.ryepolice.us/pressrelease/birchwood-drive-reckless-conduct-press-release/attachment/hordon,Poor Data Source,200,Rye Police Department hordon - Rye Police Department,"","[""hordon""]","[""hordon""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -1724,https://champaignil.gov/police/about-us/policies-and-procedures/,Policies & Contracts,200,Policies and Procedures - City of Champaign,"","[""Policies and Procedures""]","[""Police Department"", ""Quick Links"", ""Police Department News"", ""Contact Us""]",[],[],[],[] -1725,http://www.longbeach.gov/police/press-releases/dui-enforcement-operation-planned-st--patrick-s-day/,Media Bulletins,200,DUI ENFORCEMENT OPERATION PLANNED ST. PATRICK'S DAY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1726,https://civicpride.jacksontn.gov/government/public_notices___press_releases/newjpdchiefofpolice,Not Criminal Justice Related,200," - Mayor's Civic Pride Awards - City of Jackson, TN -",Welcome to the official website of City of Jackson in Tennessee.,"[""City of Jackson TN"", ""2023 Mayor's Civic Pride Award Nominations"", ""City of Jackson TN""]","[""Mayor's Civic Pride Awards""]","[""JUDGING CRITERIA""]",[],[],[] -1727,https://police.greenvillesc.gov/1643/photo-gallery,Resources,200,"Photo Gallery | Greenville, SC - Official Website",View photos from the Comp Plan Steering Committee,"[""\r\n\r\nPhoto Gallery\t\t""]",[],"[""Loading""]",[],[],[] -1728,https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scoperesponsibility-to-the-community-and-other-policy-violations-13/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1729,https://delcopa.gov/council/2015minutes/032515minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1730,https://norfolkne.gov/government/departments/police-division/press-releases/,List of Data Sources,200,"Press Releases - City of Norfolk, NE","","[""City of Norfolk, NE"", ""Police Division"", ""Press Releases""]",[],"[""January 22nd Press Release 2024"", ""January 11th Press Release 2024"", ""January 4th Press Release 2024"", ""December 15th Press Release 2023"", ""December 1st Press Release 2023"", ""November 30th Press Release 2023"", ""November 27th Press Release 2023"", ""November 9th Press Release 2023"", ""October 25th Press Release 2023"", ""October 24th Press Release 2023""]",[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]" -1731,http://www.lafayettepolice.us/175/physical-tactics-room,Training & Hiring Info,200,"Physical Tactics Room | Lafayette, IN - Official Website",View a list of the amenities of the defensive tactics training room.,"[""\r\n\r\nPhysical Tactics Room\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]","[""Defensive Tactics Mat"", ""Weapons Lockers""]",[],[] -1732,http://www.longbeach.gov/police/press-releases/officer-involved-shooting2/,Media Bulletins,200,Officer Involved Shooting,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1733,https://www.douglas.co.us/documents/how-to-open-a-copy-account-with-douglas-county.pdf/,Records Request Info,200,"","",[],[],[],[],[],[] -1734,https://www.ashevillenc.gov/news/asheville-police-release-citizen-complaint-and-9-1-1-call-data-on-open-data-portal/,Resources,200,Asheville Police release citizen complaint and 9-1-1 call data on Open Data Portal - The City of Asheville,"","[""Asheville Police release citizen complaint and 9-1-1 call data on Open Data Portal""]",[],[],[],[],[] -1735,http://www.longbeach.gov/police/press-releases/crime-continues-to-decrease-in-long-beach/,Media Bulletins,200,CRIME CONTINUES TO DECREASE IN LONG BEACH,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1736,https://www.michigan.gov/som/government/state-license-search/l/law-enforcement-officer-police,Poor Data Source,200,SOM - 404 - Page Not Found,"","[""404 - Page Not Found""]","[""About""]","[""Popular on michigan.gov"", ""How Do I..."", ""Careers""]",[],[],[] -1737,https://www.colma.ca.gov/documents/jd-police-commander/,Training & Hiring Info,200,Police Commander - Town of Colma,"","[""\n\n Police Commander""]","[""Primary menu links"", ""Action toolbar"", ""Documents and forms"", ""Contact"", ""Subscribe"", ""Connect""]",[],[],[],[] -1738,https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/how-to-use-official-documents/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1739,https://civicpride.jacksontn.gov/government/departments/police/divisions/administrative/law_enforcement_technologies,Not Criminal Justice Related,200," - Mayor's Civic Pride Awards - City of Jackson, TN -",Welcome to the official website of City of Jackson in Tennessee.,"[""City of Jackson TN"", ""2023 Mayor's Civic Pride Award Nominations"", ""City of Jackson TN""]","[""Mayor's Civic Pride Awards""]","[""JUDGING CRITERIA""]",[],[],[] -1740,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/arrests/021622arrests.pdf,Poor Data Source,404,"","",,,,,, -1741,https://delcopa.gov/ojs/ojsforms/cifinfosheet.pdf,Resources,200,"","",[],[],[],[],[],[] -1742,http://www.longbeach.gov/police/press-releases/l-b-p-d--academy-graduation-ceremony-held-today/,Media Bulletins,200,L.B.P.D. ACADEMY GRADUATION CEREMONY HELD TODAY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1743,https://ethics.ny.gov/news/jcope-settles-public-officers-law-violation-former-mta-employee,Media Bulletins,200,JCOPE Settles Public Officers Law Violation with Former MTA Employee | New York State Commission on Ethics and Lobbying in Government,"","[""\n New York State\n Commission on Ethics and Lobbying in Government\n"", ""\nJCOPE Settles Public Officers Law Violation with Former MTA Employee\n""]","[""SHARE"", ""\n Contact Communications and Public Information Office\n"", ""CONNECT WITH US""]","[""\nShivanand Kalipersadsingh Substantial Basis Investigation Report and Settlement Agreement\n\n"", ""Contact us by phone:"", ""Contact us by email:"", ""Mailing Address:"", ""Translation Services""]",[],[],[] -1744,https://sanramon.ca.gov/our_city/departments_and_divisions/police/community_programs/youth_services/station_tours,Resources,200," - Station Tours - City of San Ramon -","","[""Station Tours""]","[""Contact Us"", ""Station Tours"", ""Contact Us"", ""Useful Links""]",[],[],[],[] -1745,http://police.portlandmaine.gov/293/elder-services,Resources,200,"Elder Services | Portland, ME - Official Website",Our mission is to creatively and collaboratively address issues that present hardships for Portland residents as they age.,"[""Elder Services""]",[],[],[],[],[] -1746,https://www.ci.san-ramon.ca.us/our_city/departments_and_divisions/police/fee_and_forms/violation_of_city_ordinance,Resources,200," - Violation of City Ordinance - City of San Ramon -","","[""Violation of City Ordinance""]","[""Contact Us"", ""Useful Links""]",[],[],[],[] -1747,https://www.mass.gov/doc/wallace-patrick-v-beverly-police-department-11608/download,Court Cases,200,"","",[],[],[],[],[],[] -1748,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/093021blotter.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -1749,https://www.lasalle-il.gov/about-la-salle/city-governance/city-committees/police-judiciary,Contact Info & Agency Meta,200,Police & Judiciary | City of La Salle,"","[""Police & Judiciary\n""]","[""Main navigation"", ""Breadcrumb"", ""Main Menu"", ""Important Info""]",[],[],[],[] -1750,https://spdblotter.seattle.gov/2015/08/26/police-need-your-help-to-find-missing-toddler-kevin-szal/,Media Bulletins,200,(Update) FOUND - Police Need Your Help to Find Missing Toddler Kevin Szal - SPD Blotter,"","[""(Update) FOUND \u2013 Police Need Your Help to Find Missing Toddler Kevin Szal""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -1751,https://www.sandiego.gov/department-document/update-police-investigate-murder-clairemont,Media Bulletins,200,Update Police Investigate Murder in Clairemont | City of San Diego Official Website,"","[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Update Police Investigate Murder in Clairemont"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -1752,https://www.mass.gov/doc/bcntsaplymouthreverecopperamendmentpdf/download,Poor Data Source,200,"","",[],[],[],[],[],[] -1753,http://www.ryepolice.us/pressrelease/rye-beaches-reopening-june-1-2020-press-release/attachment/press-release_0001,Media Bulletins,200,Rye Police Department Press Release_0001 - Rye Police Department,"","[""Press Release_0001""]","[""Press Release_0001""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -1754,https://detroitmi.gov/departments/police-department/detroit-police-department-shield-program/community-partner-resources,Misc Police Activity,200,Community Partner Resources | City of Detroit,"Why Join SHIELD?  With the growth of a thriving city and the promise of greater commerce in Detroit comes increased security concerns for law enforcement, business owners, worship centers and citizens alike. The public and private sectors are stronger working together than either is alone. This partnership is the cornerstone in defending the City against terrorism. DPD Shield is a central destination to obtain critical information and engage police department resources. DPD Shield also seeks information from our community and private sector partners to assist in our efforts to keep the City   What We Ask The DPD SHIELD program is a communication two-way street. The key to success is information flowing in two directions. Community partners serve as the eyes and ears of the DPD SHIELD and serve to directly impact efforts to prevent crime and acts of terrorism by reporting suspicious behavior as soon as possible. In addition, we recognize that our community partners are uniquely qualified to assist the Detroit Police Department personnel during an incident. You know what belongs and what is out of place. Sharing your perspective and working together, we are better prepared to face the most difficult challenges.  ","[""\nCommunity Partner Resources\n""]","[""Top Links"", ""Site Menu"", ""\nDetroit Police Shield FAQs\n\n""]",[],"[""CONTACTS""]",[],[] -1755,https://www.southamptontownnypolice.gov/faq.aspx?qid=539,Not Criminal Justice Related,200,FAQs • Do I need to register my alarm system?,"",[],"[""\n\u25bc\r\nCitizens' Response Center\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1756,https://www.lynchburgvapolice.gov/news-updates/attempted-armed-robbery-at-att-store/,Media Bulletins,200,Attempted Armed Robbery at AT&T Store - Lynchburg Police Department,"","[""Attempted Armed Robbery at AT&T Store""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[] -1757,https://delcopa.gov/publicrelations/releases/2020/blackhistorymonth.html,Not Criminal Justice Related,200,"Delaware County Celebrates Black History Month - Delaware County, Pennsylvania","","[""Delaware County Celebrates Black History Month""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Council Vice Chair Dr. Monica Taylor speaks to students \r\n\t at Drexel Hill Middle School""]",[],[] -1758,http://www.longbeach.gov/police/press-releases/traffic-fatality-14-/,Media Bulletins,200,TRAFFIC FATALITY(14),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1759,https://www.foxcrossingwi.gov/departments/police-department/history/badge1/,Poor Data Source,200,badge1 - Fox Crossing Fox Crossing,"",[],"[""History \u00bb badge1""]",[],[],[],[] -1760,https://www.knoxvilletn.gov/archived_news_stories/2008/police_explorer_class_orientation,Not Criminal Justice Related,200," - Police Explorer Class Orientation - City of Knoxville -",communications*,"[""Police Explorer Class Orientation"", ""Communications Director"", ""Police Explorer Class Orientation""]",[],[],[],[],[] -1761,https://coloradosprings.gov/police-department/article/news/officer-involved-shooting-march-7-2022,Officer Involved Shootings,200,"Officer-Involved Shooting March 7, 2022 | City of Colorado Springs","","[""\nOfficer-Involved Shooting March 7, 2022\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -1762,https://coloradosprings.gov/police-department/article/news/cspd-accident-alert-status-may-7-11-2021,Media Bulletins,200,"CSPD on Accident Alert Status from May 7 – 11, 2021 | City of Colorado Springs","","[""\nCSPD on Accident Alert Status from May 7 \u2013 11, 2021\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -1763,http://www.longbeach.gov/police/press-releases/felony-robbery-suspect-arrested-and-charged-1-/,Media Bulletins,200,FELONY ROBBERY SUSPECT ARRESTED AND CHARGED(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1764,https://www.osc.state.ny.us/local-government/audits/fire-company-or-department/2015/12/18/copenhagen-fire-department-controls-over-financial-activities,Not Criminal Justice Related,200,Copenhagen Fire Department – Controls Over Financial Activities (2015M-270) | Office of the New York State Comptroller,Copenhagen Fire Department – Controls Over Financial Activities (2015M-270),"[""\nCopenhagen Fire Department \u2013 Controls Over Financial Activities (2015M-270)\n"", "" ""]","[""Main navigation""]","[""Local Government and School Accountability Contact Information:"", ""How would you rate our website?""]","[""Disclaimer"", ""Purpose of Audit"", ""Background"", ""Key Findings"", ""Key Recommendations"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[] -1765,https://hilliardohio.gov/hilliard-polices-sgt-higgins-retires-april/,Media Bulletins,200,Hilliard Police’s Sgt. Higgins retires April 9 - City of Hilliard,John Higgins isn’t sure if serving as a AAA School Safety Officer at Harrisburg Elementary School in 1975 inspired him to become a police officer or was,"[""News"", ""Hilliard Police\u2019s Sgt. Higgins retires April 9""]",[],[],"[""Recent Articles"", ""Hilliard Newsletter"", ""City Hall and Admin"", ""Hilliard Mayor's Court"", ""Division of Police"", ""Police Assistance"", ""Police Records and General Assistance"", ""Norwich Township Fire"", ""Hilliard Recreation & Parks"", ""Hilliard Newsletter"", ""Quick Links"", ""Stay connected with us""]",[],"[""Click the \u2018x\u2019 to opt out.""]" -1766,https://delcopa.gov/courts/specialtycourts/pdf/drugtreatment/treatment court - general rules.pdf,Resources,200,"","",[],[],[],[],[],[] -1767,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2018_archived_news/july_2018/july_2018_arlington_police_community_newsletter,Media Bulletins,200," - July 2018 Arlington Police Community Newsletter Available - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""July 2018 Arlington Police Community Newsletter Available""]",[],[],[],[] -1768,http://www.longbeach.gov/police/how-do-i/get-inmate-information/,Resources,200,Get Inmate Information,Long Beach Police Department- Get Inmate Information,"[""Police Department""]","[""REMOTE INMATE VISITATION"", ""INMATE INFORMATION""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", """", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk"", ""Have a question about visitation of inmates housed at the Long Beach Police Department?"", ""Call (562) 570-7260"", ""Have a question about visitation of inmates housed at the Los Angeles County Jail?"", ""Call (213) 473-6080""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""Crime Lab Survey"", ""\u00a0""]",[] -1769,http://www.lafayettepolice.us/726/home-emergency-plans,Contact Info & Agency Meta,200,"Home Emergency Plans | Lafayette, IN - Official Website",Make a fire escape plan and practice the safe ways to get out of the house if there is a fire.,"[""\r\n\r\nHome Emergency Plans\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1770,https://delcopa.gov/council/2019minutes/010919minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1771,https://covington.va.us/city-government/city-departments/police/,Media Bulletins,200,Police - Covington City,"","[""\nPolice\n"", ""\nPolice\n""]","[""\nCovington Appoints New Chief of Police and Director of Public Safety\n"", ""\nTOP ONLINE LINKS\n""]","[""Wish to make a complaint?"", ""OFFICER COMMENDATION"", ""THE AWARE FOUNDATION, INC.""]","[""NOTICES"", ""\nMAPLE AVENUE PROJECT UPDATE "", ""\nROUTE 18 THERMO STRIPING "", ""CALENDAR""]",[],[] -1772,https://www.southamptontownnypolice.gov/899/law-enforcement-career-exploring-program,Training & Hiring Info,200,"Law Enforcement Career Exploring Program | Southampton, NY - Official Website","Law Enforcement Career Exploring is open to young men and women ages 14 and not yet 21 years old with an interest in learning more about careers in the field of law enforcement. -","[""\r\n\r\nLaw Enforcement Career Exploring Program\t\t""]","[""Law Enforcement Career Exploring Program""]","[""Loading"", ""Site Tools"", ""Contact Us"", ""Contact Us"", ""Site Links""]",[],[],[] -1773,https://delcopa.gov/sustainability/presentations/22/11_kellysanders_v1.pptx,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1774,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0725/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1775,https://www.lynchburgvapolice.gov/news-updates/shooting-scene-on-golf-park-drive/,Media Bulletins,200,Shooting Scene on Golf Park Drive - Lynchburg Police Department,"","[""Shooting Scene on Golf Park Drive""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[] -1776,https://www.montgomeryohio.gov/historic-photos/police-officers-1970_50506081303_o/,Poor Data Source,200,"- Montgomery, Ohio","","[""""]","[""Primary menu links"", ""Action toolbar"", ""Welcome"", ""Engage"", ""Help"", ""Mental Health Resource""]",[],[],[],[] -1777,https://www.montgomeryohio.gov/police-department-citizen-complaint-notice/,Complaints & Misconduct,200,"Police Department Citizen Complaint Notice - Montgomery, Ohio","","[""Police Department Citizen Complaint Notice""]","[""Primary menu links"", ""Action toolbar"", ""Welcome"", ""Engage"", ""Help"", ""Mental Health Resource""]",[],[],[],[] -1778,https://www.doj.state.or.us/events/predicting-intimate-partner-violence-injuries-based-on-police-reports/,Poor Data Source,200,Predicting Intimate Partner Violence Injuries Based on Police Reports - Oregon Department of Justice ,"","["""", ""\nPredicting Intimate Partner Violence Injuries Based on Police Reports\n""]","[""Oregon Department of Justice"", ""Predicting Intimate Partner Violence Injuries Based on Police Reports""]","[""Attorney General Ellen F. Rosenblum"", ""Event Navigation"", "" Details "", ""Organizer"", "" Target Audiences "", "" Venue "", ""Event Navigation""]","[""January 16, 2019 @ 12:00 pm - 1:00 pm""]",[],[] -1779,https://alpha.austin.gov/es/police-oversight/formal-complaint-de-escalation-of-potential-force-encounters-and-other-policy-violations-7/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1780,https://alpha.austin.gov/es/police-oversight/9-17-20-3/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1781,https://delcopa.gov/planning/pdf/mapping/tinicum.pdf,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1782,https://detroitmi.gov/departments/police-department/senior-citizens-911-profile,Resources,200,Senior Citizens 911 Profile | City of Detroit,"The Detroit Police Department is firmly committed to providing professional service to all residents.  However, in an effort to improve our service delivery model for our senior citizens (65 years of age or older) the Detroit Police Department will be implementing a new service: Senior 911 Profile. This service will allow our senior citizens to have their individual profiles stored in our 911 database and provide critical care information to the 911 call-takers in the event of an emergency situation. This should improve the call taking, dispatch and emergency response process. If you would like to take advantage of the Senior 911 Profile Agreement, please download or print out the agreement located below.  Please read the agreement in its entirety, fill out all of the required fields marked with an asterisk *, and complete any additional information that you would like to include. Senior-Citizens-911-Profile   The profile can be faxed to (313) 596-1610.  Please include a copy of your Michigan State I.D. or Driver's License. The profile can also be hand delivered to any Detroit Police Department Precinct.  However, if someone else is dropping off the profile for you, you must include a copy of your Michigan State I.D. or Driver's License with your profile.","[""\nSenior Citizens 911 Profile\n""]","[""Top Links"", ""Site Menu""]",[],[],[],[] -1783,https://pittsburghpa.gov/police/ssd,Poor Data Source,200,"","","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", """", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],[],[],[],[] -1784,http://www.longbeach.gov/police/press-releases/in-custody-death-1-/,Media Bulletins,200,IN-CUSTODY DEATH(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1785,https://www.hayward-ca.gov/police-department/public-services/youth-family-services-bureau//curfew-violations,Media Bulletins,200,Curfew Violations | City of Hayward - Official website,Minor Prohibited in Pool RoomsOffensesDefinitionsRestricted hours for curfew violations are:Sunday through Thursday 10:00 am – 6:00 amFriday and Saturday 12:01 am – 6:00 amService Contacts:Report a suspected curfew offender by calling 510.293.7000.,[],"[""Curfew Violations"", ""You are here. So is everything else."", ""Search form""]",[],"[""Receive crime bulletins and alerts"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -1786,https://dccouncil.gov/judiciary-public-safety/copy-of-fo0_fy19_attachment-iv/,Annual & Monthly Reports,200,Copy of FO0_FY19_Attachment IV • Council of the District of Columbia,"","[""Copy of FO0_FY19_Attachment IV""]",[],[],[],[],[] -1787,http://www.longbeach.gov/police/press-releases/deceased-infant-found-in-alley/,Media Bulletins,200,DECEASED INFANT FOUND IN ALLEY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1788,https://toddmissiontx.gov/mp_teams/police-department/,Contact Info & Agency Meta,200,Police Department – City of Todd Mission,"",[],"[""Gateway to the Texas Renaissance Festival"", ""Ryan Rutledge"", ""Ryan Schroeder"", ""Keith Winford"", ""Events""]","[""Todd Mission City Hall""]",[],[],[] -1789,https://police.birminghamal.gov/bureaus/patrol/tactical-operations-precinct/,Contact Info & Agency Meta,200,Tactical Operations Precinct | Birmingham Police Department,"","[""\n\n\n Birmingham Police Department\n\n\t\t\t\t\tCommitment | Excellence | Integrity\t\t\t\t\n\n""]","[""Putting People First"", ""Tactical Operations Precinct""]",[],"[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[] -1790,https://www.mass.gov/doc/jlm-13-2559-city-of-springfield-and-international-brotherhood-of-police-officers-local-364/download,Misc Police Activity,200,"","",[],[],[],[],[],[] -1791,https://www.southamptontownnypolice.gov/1340/endangered-species-resolutions,Not Criminal Justice Related,200,"Resolutions related to 4 x 4 Permits | Southampton, NY - Official Website","","[""\r\n\r\nResolutions related to 4 x 4 Permits\t\t""]","[""Southampton Town, NY Waterfowl Hunting""]","[""Loading"", ""Site Tools"", ""Endangered Species Annual Reports"", ""Contact Us"", ""Site Links""]","[""Endangered Species Resolutions""]",[],[] -1792,https://alpha.austin.gov/es/police-oversight/recommendations-for-improving-apds-policy-development-practices/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1793,http://www.lafayettepolice.us/1618/research-participation-spotlight,Not Criminal Justice Related,200,"Research Participation Spotlight | Lafayette, IN - Official Website","","[""\r\n\r\nResearch Participation Spotlight\t\t""]",[],"[""Loading"", ""Hellbenders "", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1794,https://spdblotter.seattle.gov/2012/07/03/spd-taking-applications-for-autumn-community-police-academy/,Media Bulletins,200,Seattle Police Accepting Applications for Autumn 2012 Community Police Academy - SPD Blotter,"","[""Seattle Police Accepting Applications for Autumn 2012 Community Police Academy""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -1795,http://www.tampa.gov/news/tampa-police-conduct-death-investigation-interstate-275-76591,Poor Data Source,200,Tampa Police Conduct Death Investigation on Interstate 275 | City of Tampa,"Late Tuesday night, Tampa Police responded to what was originally reported as a vehicle crashing into the guardrail in the southbound lanes of Interstate 275. Officers arrived to find a 2015 blue Dodge with multiple bullet holes resting against the center concrete guardrail. The driver, a 22-year-old black male, was found suffering from a gunshot to the upper body. Tampa Fire Rescue transported the driver to a nearby hospital where he was pronounced deceased. The southbound lanes of the interstate were closed at 11:31 PM to allow the scene to be processed, reopening at 6:30 AM.","[""Tampa Police Conduct Death Investigation on Interstate 275\n""]","[""Information Resources"", ""\nLatest News\n"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[] -1796,https://champaignil.gov/2012/03/22/police-officer-written-exam/,Training & Hiring Info,200,Police Officer Written Exam - City of Champaign,"","[""Police Officer Written Exam""]","[""News Releases"", ""Department News""]",[],[],[],[] -1797,https://audgen.michigan.gov/complete-projects/michigan-state-police-retirement-system/r071015416/,List of Data Sources,200,r071015416 - Michigan Office of the Auditor General,"","[""r071015416""]","[""Homepage under OAG logo \u2013 Notifications"", ""Post navigation""]",[],"[""Auditor General""]","[""Doug Ringler, CPA, CIA\n\t\t\t\tAuditor General""]",[] -1798,https://cityofpowell.us/reports/auto-draft-322/2020-08-police-department/,Annual & Monthly Reports,200,"City of Powell, Ohio | 2020.08 Police Department","","[""\n 2020.08 Police Department\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -1799,http://police.portlandmaine.gov/652/portland-community-free-clinic,Resources,200,"Portland Community Free Clinic | Portland, ME - Official Website",Patients of the Portland Community Free Clinic with urgent needs should go to urgent care or the emergency department.,"[""Portland Community Free Clinic""]",[],[],[],[],[] -1800,https://barnegatpolice.us/download/missing-person-report-ncic/,Resources,200,Missing Person Report NCIC - Barnegat Township Police Department,"","[""Missing Person Report NCIC"", ""Missing Person Report NCIC""]","[""Missing Person Report NCIC""]","[""\n\t\t\t\t\t\tAbout the Author: \t\t\t\t\t\tBTPD ""]","[""Share This Story, Choose Your Platform!"", ""Resources"", ""Directions"", ""Quick Links""]",[],[] -1801,https://delcopa.gov/courts/domesticrelations/changeofaddress.html,Resources,200,"Copies of your Court Orders- Delaware County, Pennsylvania","","[""Change Your Address""]",[],"[""Domestic Relations Navigation"", ""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[] -1802,https://www.newcarrolltonmd.gov/government/departments/police_department/how_do_i__/vehicle_release,Contact Info & Agency Meta,404,"","",,,,,, -1803,https://www.colma.ca.gov/document_taxonomy/police-department/,List of Data Sources,200,Police Department Archives - Town of Colma,"","[""Document Types: Police Department""]","[""Primary menu links"", ""Action toolbar"", ""PD Press Release \u2013 C23-0912-05"", ""Colma PD Press Release \u2013 C23-0501-04"", ""Colma PD Press Release \u2013 C23-0424-04 and C23-0426-07"", ""Press Release \u2013 BART Fare Evasion Detail"", ""Press Release \u2013 C22-0420-01"", ""Press Release C22-0106-04"", ""CPD Press Release C21-0913-02"", ""PD Press Release C21-0111-01"", ""Press Release \u2013 C20-1212-01"", ""Press Release \u2013 C20-1127-01"", ""Posts navigation"", ""Contact"", ""Subscribe"", ""Connect""]",[],[],[],[] -1804,https://www.fortworthtexas.gov/departments/police/professional-standards,List of Data Sources,200," - Professional Standards Division -","","[""Police Department""]","[""Professional Standards Division"", ""Search One Address. Find Everything.""]","[""Support Services"", ""Internal Affairs Mission & Purpose"", ""Misconduct Investigation Examples"", ""Complaint Process"", ""Disposition"", ""Legal Stuff"", ""Public Information Requests"", ""Resources"", ""Helpful Links"", ""Connect With FWPD""]",[],[],[] -1805,https://brookfieldil.gov/police-pension-board-012920/,Poor Data Source,404,"","",,,,,, -1806,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0373/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1807,https://alpha.austin.gov/en/police-oversight/temporary-suspension-of-police-sergeant-jeffrey-dwyer/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1808,http://www.longbeach.gov/police/press-releases/murder-46-/,Media Bulletins,200,MURDER(46),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1809,https://www.southamptontownnypolice.gov/1325/mill-pond-association,Not Criminal Justice Related,200,"Mill Pond Association | Southampton, NY - Official Website","","[""\r\n\r\nMill Pond Association\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]","[""WQIP - Proposal Summary"", ""WQIP - Fund Application"", ""\u00a0Public Hearing Presentation"", ""2020 REPORT""]",[],[] -1810,https://www.southamptontownnypolice.gov/1323/village-of-sag-harbor---green-infrastruc,Not Criminal Justice Related,200,"Village of Sag Harbor - Green Infrastructure | Southampton, NY - Official Website","","[""\r\n\r\nVillage of Sag Harbor - Green Infrastructure \t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]","[""WQIP - Proposal Summary"", ""WQIP - Fund Application""]",[],[] -1811,https://elkhartlakewi.gov/departments/police/,Contact Info & Agency Meta,200,Police - Village of Elkhart Lake,"","[""VILLAGE OF ELKHART LAKE POLICE DEPARTMENT""]","[""Frequently Asked Questions"", ""Pay Tickets & Fines Online"", ""Medications Drop Box"", ""Elkhart Lake Police Department History"", ""CONTACT US"", ""MORE ABOUT ELPD"", ""VILLAGE DEPARTMENTS"", ""ELPD on Facebook""]","[""Vision"", ""Mission Statement"", ""Core Values"", ""\nVILLAGE DEPARTMENTS\n"", ""\nVILLAGE SERVICES\n"", ""\nKEY VILLAGE CONTACTS\n""]",[],[],[] -1812,https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scoperesponsibility-to-the-community-and-other-policy-violations-7/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1813,https://columbiacitypolice.us/documents/daily stats/3.23.21.pdf,Poor Data Source,404,"","",,,,,, -1814,http://police.portlandmaine.gov/844/friends-of-woodfords-corner,Not Criminal Justice Related,200,"Friends of Woodfords Corner | Portland, ME - Official Website","Friends of Woodfords Corner (FWC) began September 2015, when Woodfords Corner area neighbors came together to engage in community/city development.","[""Friends of Woodfords Corner""]",[],[],[],[],[] -1815,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0145/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1816,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-nets-3-arrest/,Media Bulletins,200,DUI saturation Patrol Nets 3 Arrest,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1817,https://www.southamptontownnypolice.gov/154/forms-applications,Resources,200,"Forms & Applications | Southampton, NY - Official Website","","[""\r\n\r\nForms & Applications\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Hon. Theresa A. Kiernan"", ""Hours"", ""Contact Us"", ""Site Links""]",[],[],[] -1818,https://www.antioch.il.gov/wpfb-file/04-14-15-police-and-fire-agenda-pdf-3/,Poor Data Source,200,"04-14-15 Police And Fire Agenda - Antioch, IL",8973 04 14 15 police and fire agenda pdf commissions commission agendas 2015 1428503395 36b727dd979e485336f834a1dcb52384 219x300 _es8j3agu7jf9 thumb jpg 08 09 29 55 0 pdf application trustees dennis b crosby jay jozwiak mary c dominiak scott a pierce jerry t johnson ted p poulos lawrence m hanson mayor lori k folbrick village clerk notice of,"[""04-14-15 Police And Fire Agenda""]",[],[],[],[],[] -1819,https://delcopa.gov/planning/pubs/delco2035transportationplan.html,Not Criminal Justice Related,200,Delaware County 2035 Transportation Plan,"","[""Delaware County 2035 Transportation Plan""]",[],"[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1820,https://www.antioch.il.gov/wpfb-file/nicorcoppernotice-pdf-3/,Not Criminal Justice Related,200,"Nicorcoppernotice - Antioch, IL",13520 nicorcoppernotice pdf news 2015 1625761363 2e2e175782d1e691570cab42162ae390 c3407f1dd7454c9da0e473bb3ac25408bb71668af83b7ffc07122e6a04d8511a 216x300 _dtun2pmmilyr thumb jpg 2017 05 17 08 41 0 174 208 226 95 2021 06 24 16 34 31 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17 pagefailed_18 pagefailed_19 pagefailed_20 pagefailed_21 pagefailed_22 pagefailed_23 pagefailed_24,"[""Nicorcoppernotice""]",[],[],[],[],[] -1821,https://www.giddingspolice-tx.us/about-1,Complaints & Misconduct,200,How are we doing? | Giddings Police Department,"","[""PRAISE""]","[""COMPLAINT""]",[],[],[],[] -1822,http://lafayettepolice.us/441/how-you-can-help,Not Criminal Justice Related,200,"How You Can Help | Lafayette, IN - Official Website","The City of Lafayette is improving water quality in the Wabash River and other streams with significant investments in its sanitary and stormwater capital programs, but every little bit helps. ","[""\r\n\r\nHow You Can Help\t\t""]","[""Learn More"", "" Resources""]","[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1823,https://www.woburnma.gov/government/police/policies-and-procedures-for-issuing-a-ltc-with-application/,Training & Hiring Info,200,Policies and Procedures for Issuing a LTC With Application - City of Woburn,"","[""Policies and Procedures for Issuing a LTC With Application""]",[],"[""Get Text & Email Updates!""]","[""Post Details""]",[],[] -1824,http://www.longbeach.gov/police/press-releases/murder-anaheim-st.--walnut-ave/,Media Bulletins,200,MURDER (Anaheim St. & Walnut Ave.),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1825,https://www.ci.rohnert-park.ca.us/services/emergency_services/police_and_fire_services,Resources,200," - Public Safety - City of Rohnert Park -","","[""City of Rohnert Park""]","[""Events"", ""Rohnert Park""]","[""Public Safety""]","[""Public Safety""]",[],[] -1826,http://www.longbeach.gov/police/press-releases/critical-missing-person-rosa-ella-brady/,Media Bulletins,200,CRITICAL MISSING PERSON-ROSA ELLA BRADY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1827,https://cityofpowell.us/powell-police-chief-stephen-hrytzik-elected-section-iv-representative-of-fbi-national-academy-associates/chiefhrytzik_credit_klattephotography/,Contact Info & Agency Meta,200,"City of Powell, Ohio | ChiefHrytzik_credit_KlattePhotography","","[""\n ChiefHrytzik_credit_KlattePhotography\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -1828,http://police.byram-ms.us/news/,Poor Data Source,200,News | Byram Police Department | Byram Police Department,"","[""Read the full report here."", ""Arrest Made in Holiday Inn Express Shooting""]","[""\nByram Police Releases 2020 Annual Report\n"", ""\nArrest Made in Byram Armed Robberies\n"", ""\nBradford Place Auto Burglary\n"", ""\nGovernor Reeves Executive Order RE: COVID-19\n"", ""\nCOVID-19 Resources\n"", ""\nUpdated Website\n"", ""Byram Weather""]","[""Byram Police Department""]",[],[],[] -1829,https://delcopa.gov/courts/domesticrelations/copiesoforder.html,Resources,200,"Copies of Your Court Orders - Delaware County, Pennsylvania","","[""Copies of Your Court Orders""]",[],"[""Domestic Relations Navigation"", ""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[] -1830,https://riag.ri.gov/press-releases/pawtucket-police-officer-charged-west-greenwich-shooting-incident,Officer Involved Shootings,200,Pawtucket police officer charged in West Greenwich shooting incident | Rhode Island Attorney General's Office,"","[""Pawtucket police officer charged in West Greenwich shooting incident""]",[],[],[],[],[] -1831,https://alpha.austin.gov/en/police-oversight/formal-complaint-insubordination-and-other-policy-violations/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1832,https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scoperesponsibility-to-the-community-and-other-policy-violations-5/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1833,https://www.antioch.il.gov/wpfb-file/09-09-11-police-pension-fund-agenda-pdf-2/,Poor Data Source,200,"09-09-11 Police Pension Fund Agenda - Antioch, IL",09 11 police pension fund agenda pdf commissions agendas 2011 07 13 12 04 0000,"[""09-09-11 Police Pension Fund Agenda""]",[],[],[],[],[] -1834,http://www.longbeach.gov/police/press-releases/traffic-fatality-5-/,Media Bulletins,200,TRAFFIC FATALITY(5),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1835,https://www.mass.gov/doc/proposed-amendments-to-115-cmr-100-scope-and-authority-0/download,Policies & Contracts,200,"","",[],[],[],[],[],[] -1836,https://delcopa.gov/publicrelations/releases/18pdfs/18hearthealthwearred .pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1837,https://cityofpowell.us/government/building-department/city-of-powell-commercial-building/checklist-cop-comm-change-of-occ-01-08-19/,Resources,200,"City of Powell, Ohio | Checklist COP Comm Change of Occ 01.08.19","","[""\n Checklist COP Comm Change of Occ 01.08.19\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -1838,https://www.stpaul.gov/departments/police/administration-office-chief/operations-division/canine-k-9-unit,Training & Hiring Info,200,Canine (K-9) Unit | Saint Paul Minnesota,The Saint Paul Police Canine (K-9) Unit is the second oldest police canine organization in the United States. We operate with approximately fifteen Officer/Canine teams and provide 24/7 coverage. The mission of the Canine (K-9) Unit is to support the patrol districts with all patrol functions.,"[""\nCanine (K-9) Unit\n""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""\n Contact Us\n "", ""Footer""]","[""\n You are using an unsupported browser. Please use Microsoft Edge.\n "", ""\n Contact The City\n "", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[] -1839,https://coloradosprings.gov/police-department/page/colorado-springs-police-department-birthday,Not Criminal Justice Related,200,Colorado Springs Police Department Birthday Program | City of Colorado Springs,"","[""\nColorado Springs Police Department Birthday Program\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -1840,https://alpha.austin.gov/es/police-oversight/message-from-the-office-of-police-oversight-director/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1841,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/102122summary.pdf,Poor Data Source,404,"","",,,,,, -1842,https://norfolkne.gov/assets/site/documentcentral/police/statistical-reports/ytd-mayor-030120.pdf,Annual & Monthly Reports,200,"","",[],[],[],[],[],[] -1843,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/may-2018-activity-report/,Annual & Monthly Reports,200,May 2018 Activity Report - Town of Cheswold,"","[""Cheswold""]","[""Delaware"", ""May 2018 Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[] -1844,https://www.mass.gov/how-to/submit-a-public-records-request-to-the-municipal-police-training-committee,Resources,200,Submit a public records request to the Municipal Police Training Committee | Mass.gov,Request public records online from the Municipal Police Training Committee.,"[""\n Submit a public records request to the Municipal Police Training Committee\n ""]","[""Contacts\n "", ""The Details\n of Submit a public records request to the Municipal Police Training Committee"", ""Contacts\n "", ""Help Us Improve Mass.gov with your feedback""]","[""\n Primary Records Access Officer\n "", ""the Contents of the Submit a public records request to the Municipal Police Training Committee page"", ""What you need\n for Submit a public records request to the Municipal Police Training Committee"", ""How to request\n Submit a public records request to the Municipal Police Training Committee"", ""Contact\n for Submit a public records request to the Municipal Police Training Committee"", ""\n Primary Records Access Officer\n ""]","[""\n\nOnline\n"", ""\n\n\n\n\n Online\n +\n\n"", ""\n Primary Records Access Officer\n "", ""\n\nOnline\n""]","[""\n\nOnline\n""]",[] -1845,https://ose.louisiana.gov/event/police-communications-officer-52/,Poor Data Source,200,Police Communications Officer | Louisiana Office of State Examiner,"","["""", ""Police Communications Officer""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -1846,https://www.minneapolismn.gov/government/programs-initiatives/community-safety/background/police-operational-assessment/mpd-operational-assessment-contract/,Policies & Contracts,200,Community Safety Work - City of Minneapolis,We're focusing on three key areas to improve community safety in our city.,"[""Community safety work"", ""Need help? We're here for you.""]","[""Overview"", ""Key areas"", ""Related links"", ""Community safety in different languages from 2021"", ""Contact us""]","[""Alternatives to police response"", ""Violence prevention"", ""Police policy reform"", ""Unarmed public safety responses"", ""Public health approach to violence"", ""Behavioral crisis response"", ""See language translation pages"", ""Alternatives to police response"", ""Police policy reform"", ""Community Safety Office""]","[""Learn more"", ""Learn more"", ""Learn more""]",[],[] -1847,https://delcopa.gov/courts/districtjudges/index.html,Media Bulletins,200,Magisterial District Judges - Delaware County Court of Common Pleas,"","[""Magisterial District Judges""]",[],"[""Notice"", ""Magisterial District Court Navigation"", ""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[] -1848,http://www.cityofpataskalaohio.gov/cop_folder/minutes-2015/january-5-2015-council-public-hearing/,Not Criminal Justice Related,200,"January 5, 2015 Council Public Hearing - City Of Pataskala",Official Website,"[""\n\t\t\t\tCity Of Pataskala\t\t\t"", ""\n\t\t\t\t\tJanuary 5, 2015 Council Public Hearing\t\t\t\t""]","[""\n\t\t\t\tOfficial Website\t\t\t"", ""Categories""]",[],[],[],[] -1849,https://delcopa.gov/publicrelations/releases/2020/flushot_broomall.html,Not Criminal Justice Related,200,"Delaware County Hosts Public Flu Shot Clinic October 16 and 17 in Broomall - Delaware County, Pennsylvania","","[""Delaware County Hosts Public Flu Shot Clinic October 16 and 17 in Broomall""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1850,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0323/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1851,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/092022blotter.pdf,Dispatch Logs,404,"","",,,,,, -1852,https://www.roseville.ca.us/government/departments/police_department/divisions/k-9,Misc Police Activity,200," - K-9 - City of Roseville -","","[""City of Roseville""]","[""K-9""]","[""Roseville Police Department ""]",[],[],[] -1853,http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-one-arrest2/,Media Bulletins,200,DUI CHECKPOINT NETS TWO ARRESTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1854,https://alpha.austin.gov/police-oversight/know-your-rights-video-series/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1855,https://toddmissiontx.gov/departments/police-department/mission-statement/,Policies & Contracts,200,Mission Statement – City of Todd Mission,"","[""Mission Statement"", ""MISSION"", ""INTEGRITY"", ""RESPECT"", ""FAIRNESS""]","[""Gateway to the Texas Renaissance Festival"", ""Department Menu""]","[""Todd Mission City Hall""]",[],[],[] -1856,https://delcopa.gov/planning/demodata/municipalinformation.html,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1857,https://alpha.austin.gov/en/police-oversight/written-reprimand-of-officer-david-freston/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1858,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/122421blotter.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -1859,https://www.pleasantprairiewi.gov/news/2014_news/police_department_live,Poor Data Source,200," - Police Department Live - Village of Pleasant Prairie -","",[],"[""Police Department Live""]","[""Follow Us on Social Media""]",[],[],[] -1860,https://delcopa.gov/publicrelations/releases/2021/emergencybroadbandbenefitprogram.html,Not Criminal Justice Related,200,"Emergency Broadband Benefit Program - Delaware County, Pennsylvania","","[""Emergency Broadband Benefit Program""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1861,https://www.osc.state.ny.us/state-agencies/payroll-bulletins/state-police/sp-216-april-2021-increases-location-pay-supplemental-location-pay-expanded,Media Bulletins,200,State Police Bulletin No. SP-216 | Office of the New York State Comptroller,State Police Bulletin No. SP-216,"[""\nState Police Bulletin No. SP-216\n"", "" ""]","[""Main navigation""]","[""How would you rate our website?""]","[""Disclaimer"", ""Purpose"", ""Affected Employees"", ""Background"", ""Effective Dates"", ""Eligibility Criteria"", ""OSC Actions"", ""Agency Actions"", ""Control-D Report Available After Processing"", ""Tax Information"", ""Payroll Register and Employee\u2019s Paycheck/Advice"", ""Questions"", ""Newsletter Sign-Up Confirmation"", ""Thank you for subscribing to the Comptroller's Weekly Newsletter!""]",[],[] -1862,https://cityofpowell.us/police-agency/traffic-surveys/traffic-survey-report-1-13-20-2/,Contact Info & Agency Meta,200,"City of Powell, Ohio | Traffic Survey Report 1-13-20","","[""\n Traffic Survey Report 1-13-20\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -1863,https://townofcampbellwi.gov/public-safety/police/forms/,Poor Data Source,200,Police Department Forms - Town of Campbell,"","[""Police Department Forms""]",[],"[""Police Department Records Request Form & Fee Schedule\n"", ""New Parking Contestment Form"", ""Police Forms for Your Use"", ""Citizen Report Form"", ""Quick Links"", ""About"", ""Government"", ""Services"", ""Public Safety""]",[],[],[] -1864,https://alpha.austin.gov/es/police-oversight/formal-complaint-search-protocol/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1865,https://www.antioch.il.gov/wpfb-file/12-11-12-police-pension-agenda-pdf-5/,Poor Data Source,200,"12-11-12 Police Pension Agenda - Antioch, IL",12 11 police pension agenda pdf commissions fund agendas 2012 2017 05 17 08 41 32 0000,"[""12-11-12 Police Pension Agenda""]",[],[],[],[],[] -1866,https://delcopa.gov/planning/calendar/eventcalendar_june.html,Misc Police Activity,200,"Calendar - Delaware County, Pennsylvania","","[""Calendar"", ""JUNE 2024""]",[],"[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1867,https://www.mass.gov/doc/chelmsford-police-department-promotion-investigation-report/download,Court Cases,200,"","",[],[],[],[],[],[] -1868,https://www.troyny.gov/photos-troy-police-department-appoints-new-officers/,Media Bulletins,404,"","",,,,,, -1869,http://www.paloshillspolice.us/wp-content/uploads/2013/05/redlight.jpg,Poor Data Source,404,"","",,,,,, -1870,https://www.bedminster.us/police_fire_rescue/police_department,Contact Info & Agency Meta,200," - Police - Township of Bedminster -","","[""Bedminster Township""]","[""Police""]","[""Bedminster Township""]",[],[],[] -1871,https://scrantonpa.gov/your-government/police-department/juvenile-unit/,Contact Info & Agency Meta,200,Juvenile Unit – City of Scranton,"","[""Juvenile Unit""]","[""Quick Links"", ""City of Scranton""]",[],[],[],[] -1872,http://www.longbeach.gov/police/press-releases/applications-for-volunteer-senior-police-partners-program-now-being-accepted/,Media Bulletins,200,APPLICATIONS FOR VOLUNTEER SENIOR POLICE PARTNER PROGRAM NOW BEING ACCEPTED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1873,https://www.va.gov/eastern-oklahoma-health-care/stories/va-suicide-prevention-program-recognizes-tulsa-police-officer/,Media Bulletins,200,VA Suicide Prevention Program Recognizes Tulsa Police Officer | VA Eastern Oklahoma Health Care | Veterans Affairs,"On Sept. 28, Mark Morgan, director, Eastern Oklahoma VA Health Care System, presented a VA challenge coin to Tulsa Police Officer Demita Kinnard in recognition of her assistance to the VA Suicide Prevention Program.","[""VA Suicide Prevention Program recognizes Tulsa Police Officer""]",[],[],[],[],[] -1874,https://champaignil.gov/2017/09/07/now-cgtv-champaign-police-department-employee-awards-ceremony/,Not Criminal Justice Related,200,Now on CGTV: Champaign Police Department Employee Awards Ceremony - City of Champaign,"","[""Now on CGTV: Champaign Police Department Employee Awards Ceremony""]","[""News Releases"", ""Department News""]",[],[],[],[] -1875,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0647/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -1876,http://www.longbeach.gov/police/about-the-lbpd/employment/long-beach-mounted-police/,Misc Police Activity,200,Long Beach Mounted Police,"

LONG BEACH MOUNTED POLICE -   - The Long Beach Mounted Police is a non-profit corporation with a duly elected Board of Directors. They maintain their own insurance and oversee other business matters and investments. Membership includes riders and non-riders who are supporters of equestrian activities.   - For mo

","[""Police Department""]","[""LONG BEACH MOUNTED POLICE""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""Volunteer Opportunities"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", ""\u00a0"", ""\u00a0\u00a0"", ""\u00a0"", ""Crime Lab Survey"", ""\u00a0""]",[] -1877,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2016_archived_news/may_2016/arlington_honors_police_salutes_sacrifice,Media Bulletins,200," - Arlington Honors Police Service, Salutes Sacrifice - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Arlington Honors Police Service, Salutes Sacrifice""]",[],[],[],[] -1878,https://delcopa.gov/sustainability/pdf/raise/eastcostgreenwaytrailfeasibilitystudy_2009.pdf,Not Criminal Justice Related,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1879,http://www.longbeach.gov/police/press-releases/murder-1600-block-of-pine-avenue/,Media Bulletins,200,Murder (1600 Block of Pine Avenue),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1880,https://spdblotter.seattle.gov/2010/08/09/john-diaz-confirmed-as-new-chief-of-police/,Media Bulletins,200,John Diaz confirmed as new Chief of Police - SPD Blotter,"","[""John Diaz confirmed as new Chief of Police""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -1881,https://spdblotter.seattle.gov/2010/02/01/police-arrest-grab-n-go-bandit/,Media Bulletins,200,"""Grab-N-Go"" bandit arrested - SPD Blotter","","[""\u201cGrab-N-Go\u201d bandit arrested""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -1882,https://www.sandiego.gov/department-document/san-diego-police-arrest-two-suspects-multiple-car-burglaries,Media Bulletins,200,San Diego Police Arrest Two Suspects for Multiple Car Burglaries | City of San Diego Official Website,"","[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""San Diego Police Arrest Two Suspects for Multiple Car Burglaries"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -1883,https://www.antioch.il.gov/2019/11/21/police-fire-commission-special-meeting/,Misc Police Activity,200,"Police & Fire Commission Special Meeting - Antioch, IL","","[""Police & Fire Commission Special Meeting""]",[],[],[],[],[] -1884,http://www.longbeach.gov/police/press-releases/police-seek-publics-help/,Media Bulletins,200,POLICE SEEK PUBLICS HELP,"","[""Long BeachPolice Department""]",[],"[""UPDATE: On November 10, 2015, Long Beach City Council approved a $25,000 reward that raises the total reward to $75,000.""]",[],[],[] -1885,https://www.mass.gov/regulations/273-cmr-400-scope-of-practice,Not Criminal Justice Related,200,273 CMR 4.00: Scope of practice | Mass.gov,273 CMR 4.00 establishes the scope of practice for the practice of naturopathic health care. Download a PDF copy of the regulation below.,"[""\nRegulation\u00a0\n 273 CMR 4.00: Scope of practice\n ""]","[""Table of Contents\n for the law library, 273 CMR"", ""Contact for 273 CMR 4.00: Scope of practice"", ""Table of Contents"", ""Downloads\n for 273 CMR 4.00: Scope of practice"", ""Contact\n for 273 CMR 4.00: Scope of practice"", ""Contact for 273 CMR 4.00: Scope of practice"", ""Help Us Improve Mass.gov with your feedback""]","[""\n Trial Court Law Libraries\n "", ""\n Trial Court Law Libraries\n "", ""\n Trial Court Law Libraries\n ""]","[""\n\nOnline\n"", ""\n\nOnline\n"", ""\n\nOnline\n""]",[],[] -1886,https://champaignil.gov/tag/youth-police-academy/,Media Bulletins,200,Youth Police Academy Archives - City of Champaign,"","[""Items tagged: Youth Police Academy""]","[""Reserve Your Spot Today! Citizen Police Academy and Youth Police Academy"", ""News Releases"", ""Department News""]",[],[],[],[] -1887,https://delcopa.gov/planning/pubs/delco2035.html,Not Criminal Justice Related,200,"Delaware County 2035- Delaware County, Pennsylvania","","[""Delaware County 2035""]","[""Component Plans""]","[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1888,https://www.sandiego.gov/department-document/resolution-no-115919-copy,Poor Data Source,404,"","",,,,,, -1889,https://southamptontownnypolice.gov/faq.aspx?qid=237,Not Criminal Justice Related,200,FAQs • What happens if I pay my taxes late?,"",[],"[""\n\u25bc\r\nTax Receiver\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""In Person"", ""Mail"", ""Online Services"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -1890,https://champaignil.gov/police/about-us/level-up-experienced-officer-interest-form/,Contact Info & Agency Meta,404,"","",,,,,, -1891,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/052421arrests.pdf,Arrest Records,200,"","",[],[],[],[],[],[] -1892,https://www.londonohio.gov/copy-of-city-ordances,Poor Data Source,200,Ohio Revised Code | City of London,"",[],[],[],[],[],[] -1893,https://estespark.colorado.gov/departments/police/operations/patrol,Contact Info & Agency Meta,200,Patrol | Town of Estes Park,"","[""\nPatrol\n""]","[""Providing Quality Police Services""]","[""\n"", ""\nWhat we do\n"", ""\nThe Town\n"", ""\n\n\n\n Animal Control\n \n\n"", ""\n\n\n\n Code Enforcement\n \n\n"", ""\n\n\n\n DUI Enforcement\n \n\n"", ""\n\n\n\n School Resource Officer (SRO)\n \n\n"", ""\n"", ""\nLanguage Translation\n""]",[],[],[] -1894,https://www.tukwilawa.gov/departments/police/police-department-services/online-reporting/,Resources,200,Online Reporting - City of Tukwila,"","[""Online Reporting""]",[],"[""Government""]","[""\nCity of Tukwila\n""]","[""I am a..."", ""Online Services"", ""Most Requested Forms""]",[] -1895,https://www.sandiego.gov/police/recruiting/contact,Contact Info & Agency Meta,200,Join Us Contact | City of San Diego Official Website,The following contact information and form are for theSDPD Recruiting Unit only. SeeContact Police Dispatchfor dispatch information and the dispatch contact form.,"[""City of San Diego Official Website"", ""Join Us Contact\n""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", """", ""Footer""]","[""Recruiting Officers"", ""Dispatch Recruiting""]","[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -1896,https://delcopa.gov/publicrelations/releases/2021/sheriffsofficeaccreditation.html,Media Bulletins,200,"Delaware County Sheriff's Office Earns Law Enforcement Accreditation - Delaware County, Pennsylvania","","[""Delaware County Sheriff's Office Earns Law Enforcement Accreditation""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1897,https://www.roseville.ca.us/news/what_s_happening_in_roseville/police_thank_local_community,Media Bulletins,200," - Police thank local community for RPAL support - City of Roseville -",Residents of a newly developed Fiddyment Farm neighborhood came together on July Fourth in celebration and support of the greater Roseville community.,"[""City of Roseville""]","[""Police thank local community for RPAL support"", ""Police thank you local community for RPAL support"", ""Featured Stories""]","[""Check out our Job Fair!"", ""Anticipating the future"", ""Keeping Roseville green: waste audits in your neighborhood"", ""Food, fun & dancing - Join us at the Senior (50+) Prom"", ""Original Stories Author Panel Discusses California\u2019s Indigenous History and Future at the Maidu Museum February 17"", ""City of Roseville""]",[],[],[] -1898,http://www.longbeach.gov/police/press-releases/l-b-p-d--dui-checkpoint-proves-effective/,Media Bulletins,200,L.B.P.D. DUI CHECKPOINT PROVES EFFECTIVE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1899,https://www.sandiego.gov/department-document/police-officer-cleared-shooting-jury-finds-actions-were-reasonable,Officer Involved Shootings,200,Police Officer Cleared in Shooting; Jury Finds Actions Were Reasonable | City of San Diego Official Website,"","[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Police Officer Cleared in Shooting; Jury Finds Actions Were Reasonable"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -1900,https://www.roundrocktexas.gov/news/police-seek-assistance-locating-robbery-suspect-3/,Media Bulletins,200,Bank robbery suspect arrested following public assistance - City of Round Rock,"",[],[],"[""Bank robbery suspect arrested following public assistance""]","[""Site Search"", ""Follow Us""]",[],[] -1901,https://www.plymouthmi.gov/government/departments/police/forms_and_documents/i_c_m_a_public_safety_reports,Annual & Monthly Reports,200," - ICMA Public Safety Reports - City of Plymouth, MI -","","[""ICMA Public Safety Reports""]",[],[],[],[],[] -1902,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0351/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -1903,https://www.stpaul.gov/departments/police/connect-with-department/minnesota-crime-alert-network,Contact Info & Agency Meta,200,Minnesota Crime Alert Network | Saint Paul Minnesota,"Minnesota Crime Alert Network The Saint Paul Police Department, Bureau of Criminal Apprehension and the Minnesota Department of Public Safety are inviting","[""\nMinnesota Crime Alert Network\n""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Minnesota Crime Alert Network"", ""Footer""]","[""\n You are using an unsupported browser. Please use Microsoft Edge.\n "", ""\n Contact The City\n "", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[] -1904,https://alpha.austin.gov/en/police-oversight/formal-complaint-purpose-and-scope-12/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1905,https://pittsburghpa.gov/files/police/orders/ch3/35-03-infectious-disease-kits.pdf,Poor Data Source,404,"","",,,,,, -1906,https://www.minneapolismn.gov/news/2022/september/new-police-chief-/,Poor Data Source,300,300 Multiple Choices,"","[""Multiple Choices""]",[],[],[],[],[] -1907,https://coloradosprings.gov/police-department/article/news/traffic-fatality-briargate-parkway-and-1,Media Bulletins,200,Traffic Fatality: Briargate Parkway and Chapel Hills Drive | City of Colorado Springs,"","[""\nTraffic Fatality: Briargate Parkway and Chapel Hills Drive\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -1908,http://www.lafayettepolice.us/3537/report-an-issue,Resources,200,"Report an Issue | Lafayette, IN - Official Website",Reporting landing page for SeeClickFix request categories.,"[""\r\n\r\nReport an Issue\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1909,https://coloradosprings.gov/police-department/article/news/cspd-asks-communitys-help-fatal-crash,Media Bulletins,200,CSPD Asks for the Community’s Help in Fatal Crash | City of Colorado Springs,"","[""\nCSPD Asks for the Community\u2019s Help in Fatal Crash\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -1910,http://police.portlandmaine.gov/1170/maine-state-pier,Not Criminal Justice Related,200,"Maine State Pier | Portland, ME - Official Website","","[""Maine State Pier""]",[],[],[],[],[] -1911,https://alpha.austin.gov/en/police-oversight/2020-08-26-12/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -1912,https://www.roundrocktexas.gov/news/round-rock-police-investigate-suspicious-death-subject-in-custody/,Media Bulletins,200,Police investigate murder at storage facility - City of Round Rock,"",[],[],"[""Police investigate murder at storage facility""]","[""Site Search"", ""Follow Us""]",[],[] -1913,http://www.longbeach.gov/police/press-releases/murder-3500-block-of-faust-ave/,Media Bulletins,200,Murder 3500 Block of Faust Ave,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1914,https://www.antioch.il.gov/wpfb-file/national-coffee-with-a-cop-flyer-template-ppt-pdf/,Misc Police Activity,200,"National-Coffee-With-A-Cop-Flyer-Template-ppt - Antioch, IL",15230 national coffee with a cop flyer template ppt pdf event documents 2017 1625759890 364503d45be0a2fb8c68180abac5d6cd 15a3caf730ab8522c6cbb9cef220d9e955aab263a9e0b28c90daa8b038d5efb9 225x300 _razo576asevc thumb jpg 09 18 14 17 40 0 216 125 48 192 2021 07 13 26 38 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17,"[""National-Coffee-With-A-Cop-Flyer-Template-ppt""]",[],[],[],[],[] -1915,http://www.longbeach.gov/police/press-releases/murder-19-/,Media Bulletins,200,MURDER(19),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1916,https://pittsburghpa.gov/files/police/orders/ch2/25-02-reinstatement-voluntary-break-in-service.pdf,Poor Data Source,404,"","",,,,,, -1917,http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-one-arrest---numerous-citations/,Media Bulletins,200,DUI CHECKPOINT NETS ONE ARREST & NUMEROUS CITATIONS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1918,https://dccouncil.gov/donation-disclosures/copy-of-december-2018-donation-disclosures-3/,Not Criminal Justice Related,200,Copy of December 2018 Donation Disclosures • Council of the District of Columbia,"","[""Copy of December 2018 Donation Disclosures""]",[],[],[],[],[] -1919,https://www.sandyspringsgapolice.gov/north-metro-s-w-a-t/,Contact Info & Agency Meta,200,North Metro S.W.A.T. – Sandy Springs Police Department,"","[""North Metro S.W.A.T.""]",[],[],[],[],[] -1920,https://www.ashevillenc.gov/news/three-promoted-in-asheville-police-dept/,Media Bulletins,200,Three promoted in Asheville Police Dept. - The City of Asheville,"","[""Three promoted in Asheville Police Dept.""]",[],[],[],[],[] -1921,https://www.east-windsor.nj.us//police/cpanel,Poor Data Source,200,"Official Website of East Windsor Township, New Jersey - REDIRECT - EWPD CPanel","",[],[],[],[],[],[] -1922,https://www.dps.nm.gov/blog/2021/04/14/new-mexico-state-police-arrests-driver-for-vehicular-homicide-in-chaves-county/,Media Bulletins,200,New Mexico State Police Arrests Driver for Vehicular Homicide in Chaves County - NM Department of Public Safety,"","[""New Mexico State Police Arrests Driver for Vehicular Homicide in Chaves County""]",[],"[""Location"", ""Sitemap"", ""Quick Links"", ""Social Media Links""]",[],[],[] -1923,https://cityofpowell.us/police-agency/traffic-surveys/traffic-survey-report-11-13-17-2/,Not Criminal Justice Related,200,"City of Powell, Ohio | Traffic Survey Report 11-13-17","","[""\n Traffic Survey Report 11-13-17\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -1924,https://ose.louisiana.gov/event/police-officer-20/,Poor Data Source,200,Police Officer | Louisiana Office of State Examiner,"","["""", ""Police Officer""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -1925,https://delcopa.gov/publicrelations/releases/2021/covid_vaccineupdate0217.html,Media Bulletins,200,"Delaware County’s Feb. 17 Update on COVID-19 Vaccine Efforts - Delaware County, Pennsylvania","","[""Delaware County\u2019s Feb. 17 Update on COVID-19 Vaccine Efforts""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1926,http://www.longbeach.gov/police/press-releases/police-asking-for-publics-help-in-identifying-person-of-interest-in-sexual-battery/,Media Bulletins,200,POLICE ASKING FOR PUBLIC'S HELP IN IDENTIFYING PERSON OF INTEREST IN SEXUAL BATTERY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1927,http://www.longbeach.gov/police/press-releases/fireworks-seized/,Media Bulletins,200,FIREWORKS SEIZED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1928,https://alpha.austin.gov/es/police-oversight/formal-complaint-responsibility-to-the-community-2/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1929,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0014/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -1930,https://www.ci.san-ramon.ca.us/our_city/departments_and_divisions/police/victims_rights_information/survivor_of_sexual_assault,Resources,200," - Survivor of Sexual Assault - City of San Ramon -","","[""Survivor of Sexual Assault""]","[""YOUR RIGHTS AS A SURVIVOR OF SEXUAL ASSAULT:"", ""Contact Us"", ""Useful Links""]","[""YOU HAVE THE RIGHT TO"", ""YOU HAVE THE RIGHT TO"", ""YOU HAVE THE RIGHT TO""]",[],[],[] -1931,https://www.elrenook.gov/departments/police-department/services-resources/resource-numbers/,Contact Info & Agency Meta,404,"","",,,,,, -1932,https://www.attorneygeneral.utah.gov/wp-content/uploads/2015/03/img_7489-copy-2.jpg,Media Bulletins,404,"","",,,,,, -1933,https://www.mass.gov/doc/october-30-1996-out-of-state-domestic-violence-restraining-orders-with-a-copy-of-memorandum/download,Policies & Contracts,200,"","",[],[],[],[],[],[] -1934,https://www.alamoheightstx.gov/public-safety/police/divisions/,Contact Info & Agency Meta,200,Divisions - City of Alamo Heights,"","[""Divisions""]","[""Patrol Operations Division"", ""Support Services Division"", ""Police Administrative Office"", ""Criminal Investigations Division"", ""Emergency Services Center"", ""Animal Care Services""]",[],[],[],[] -1935,https://delcopa.gov/planning/pubs/portfolio-12_tacticalplacemaking.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1936,https://icjia.illinois.gov/researchhub/articles/law-enforcement-response-to-mental-health-crisis-incidents-a-survey-of-illinois-police-and-sheriff-s-departments/,Media Bulletins,200,ICJIA | Illinois Criminal Justice Information Authority,Illinois Criminal Justice Information Authority,[],[],[],[],[],[] -1937,http://www.longbeach.gov/police/press-releases/traffic-fatality-20-/,Media Bulletins,200,TRAFFIC FATALITY(20),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1938,https://southamptontownnypolice.gov/1663/2022-adopted-budget-operating,List of Data Sources,200,"2022 Adopted Budget Operating | Southampton, NY - Official Website","","[""\r\n\r\n2022 Adopted Budget Operating\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]",[],[],[] -1939,https://delcopa.gov/purchasing/bidsprops/kyo878.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1940,http://www.longbeach.gov/police/press-releases/murder-investigation/,Media Bulletins,200,MURDER INVESTIGATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1941,https://www.fortworthtexas.gov/departments/hr/administration/prr/police-prr,Policies & Contracts,200,Personnel Rules and Regulations for Commissioned Police Officers – Welcome to the City of Fort Worth,Personnel Rules and Regulations for Sworn Police Officers.,"[""Personnel Rules and Regulations for Commissioned Police Officers""]","[""Chapter 143 of the Texas Local Government Code"", ""Chapters 141 and 142 of the Texas Local Government Code"", ""Meet and Confer Labor Agreement"", ""Fort Worth Fire Fighters\u2019 and Police Officers\u2019 Civil Service Commission"", ""Management Rights"", ""Amendments"", ""Department Rules and Regulations"", ""Waivers"", ""Clarifications"", ""Quarantine/Traumatic Leave"", ""Related Information"", ""\nAccommodations & Accessibilities\n"", ""About Fort Worth"", ""City Council"", ""Public Safety"", ""\u00a0Business"", ""Get Connected. Stay Informed.""]","["""", ""Effective September 1, 2021\u00a0""]",[],[],[] -1942,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/blotter/022622blotter.pdf,Poor Data Source,404,"","",,,,,, -1943,https://joinmpd.dc.gov/metropolitan-police/reserve-police-officer,Training & Hiring Info,200,Reserve Police Officer | joinmpd.dc.gov,Reserve Police Officer,"[""Reserve Police Officer""]","[""joinmpd.dc.gov"", ""Main menu"", ""Main menu"", ""Navigation""]","[""Becoming a Reserve Officer""]",[],[],[] -1944,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0932/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1945,https://delcopa.gov/ojs/ojsforms/praecipetosettlediscontinue.pdf,Resources,200,"","",[],[],[],[],[],[] -1946,http://www.longbeach.gov/police/about-the-lbpd/bureaus/investigations-bureau/officer-involved-shooting-investigation-process/,Policies & Contracts,200,OFFICER INVOLVED SHOOTING INVESTIGATION PROCESS,"

  - OFFICER INVOLVED SHOOTING INVESTIGATION PROCESS - To demonstrate the level of investigation, review, evaluation, and actions our Department takes when an officer involved shooting occurs, an overview of the process is provided below:   - Homicide Detail detectives, field supervisors, and departmental manager

","[""Police Department""]",[],"[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""OFFICER INVOLVED SHOOTING INVESTIGATION PROCESS"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""Crime Lab Survey"", ""\u00a0""]",[] -1947,https://delcopa.gov/council/2020minutes/10072020minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1948,https://www.ci.rohnert-park.ca.us/city_hall/departments/public_works/drainage___stormwater/creeks__environmental_information/copeland_test,Not Criminal Justice Related,200," - Copeland Test - City of Rohnert Park -","","[""City of Rohnert Park""]","[""Rohnert Park""]","[""Copeland Test"", ""Daily Acts is making its way to Rohnert Park!""]",[],[],[] -1949,https://champaignil.gov/2022/08/27/champaign-police-investigating-overnight-shooting-incidents/,Media Bulletins,200,Champaign Police Investigating Overnight Shooting Incidents - City of Champaign,"","[""Champaign Police Investigating Overnight Shooting Incidents""]","[""News Releases"", ""Department News""]",[],[],[],[] -1950,https://delcopa.gov/publicrelations/releases/2020/pdf/delawarecountynovemberflushotclinics_mercyfitz.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1951,https://www.jacksontn.gov/government/departments/police/daily_arrest_reports,Poor Data Source,200," - Daily Arrest Reports - City of Jackson, TN -",Welcome to the official website of City of Jackson in Tennessee.,"[""City of Jackson TN"", ""City of Jackson TN""]","[""Daily Arrest Reports""]",[],[],[],[] -1952,https://alpha.austin.gov/police-oversight/2020-06-4-17/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1953,https://louisvilleky.gov/police/forms/submit-crime-tip,Resources,403,"","",,,,,, -1954,https://bolivar.mo.us/shop-with-a-copr/img_3318/,Poor Data Source,200,"IMG_3318 - City of Bolivar, Missouri","","[""IMG_3318""]",[],[],[],[],[] -1955,https://www.farmingtonmn.gov/government/departments/police/staff_directory,Poor Data Source,404,"","",,,,,, -1956,https://delcopa.gov/vote/pdf/2021/delco-boe_legal-notice_public-meeting_9-20-2021.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1957,https://www.panynj.gov/police/en/about/leadership.html,Personnel Records,200,Leadership,"",[],[],[],[],[],[] -1958,https://rexburg.us/police-investigating-road-rage-after-man-killed-in-box-elder-county-rollover-thursday/,Poor Data Source,522,"","",,,,,, -1959,https://cheswold.delaware.gov/cheswold-police-department-policy-and-procedure-manual/directive-10-2-43-naloxone-programs/,Policies & Contracts,200,Directive 10-2-43 Naloxone Programs - Town of Cheswold,"","[""Cheswold""]","[""Delaware"", ""Directive 10-2-43 Naloxone Programs""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[] -1960,https://policing.cityofpleasantonca.gov/police-department-faqs/,Resources,200,Police Department FAQs | Policing in Pleasanton,"","[""Police Department FAQs""]",[],"[""Submit a Comment Cancel reply""]",[],[],[] -1961,https://delcopa.gov/health/pdf/agendaminutes/bohagenda_jan_6_22.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1962,https://alpha.austin.gov/en/police-oversight/bwc-dmav-the-role-of-vendors-and-community-input-in-policy/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1963,https://champaignil.gov/tag/champaign-police-arrest-kidnapping-suspect/,Media Bulletins,200,Champaign Police Arrest Kidnapping Suspect Archives - City of Champaign,"","[""Items tagged: Champaign Police Arrest Kidnapping Suspect""]","[""Champaign Police Arrest Kidnapping Suspect"", ""News Releases"", ""Department News""]",[],[],[],[] -1964,https://delcopa.gov/hcd/cdbg.html,Not Criminal Justice Related,200,CDBG Program,"","[""CDBG Program""]",[],"[""Housing & Community Development Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1965,https://delcopa.gov/ich/pdfs/covid_govwolf_medicaidchip.pdf,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -1966,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0328/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1967,http://www.longbeach.gov/police/press-releases/murder-31-/,Media Bulletins,200,MURDER(31),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1968,https://www.knoxvilletn.gov/government/boards_commissions/police_advisory_review_committee_parc/p_a_r_c_20th_anniversary/history_of_p_a_r_c___p_d_f_,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1969,http://www.longbeach.gov/police/press-releases/arrest-made-in-2007-murder-case/,Media Bulletins,200,ARREST MADE IN 2007 MURDER CASE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1970,https://www.southamptontownnypolice.gov/1056/xeriscaping,Not Criminal Justice Related,200,"Xeriscaping | Southampton, NY - Official Website","","[""\r\n\r\nXeriscaping\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]",[],[],[] -1971,http://www.longbeach.gov/police/press-releases/update---companion-dog-taken-in-vehicle-theft/,Media Bulletins,200,UPDATE - COMPANION DOG TAKEN IN VEHICLE THEFT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1972,https://delcopa.gov/vote/pdf/2022/2022primary-electiondayguidedigitaleditionv-rev1.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -1973,https://dccouncil.gov/judiciary-public-safety/copy-of-ag0_fy19_-attachment-iv/,Annual & Monthly Reports,200,Copy of AG0_FY19_ Attachment IV • Council of the District of Columbia,"","[""Copy of AG0_FY19_ Attachment IV""]",[],[],[],[],[] -1974,http://www.longbeach.gov/police/press-releases/undetermined-deaths--possibly-related-to-carbon-monoxide-poisoning/,Media Bulletins,200,UNDETERMINED DEATHS; POSSIBLY RELATED TO CARBON MONOXIDE POISONING,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1975,https://www.cityofladue-mo.gov/departments/police-department/annual-reports-158,Annual & Monthly Reports,200,Annual Reports | City of Ladue,"","[""Annual Reports""]","[""Upcoming Events""]",[],[],[],[] -1976,"https://norfolkne.gov/government/departments/police-division/press-releases/march-4,-2021-press-release.html",Media Bulletins,200,"March 4, 2021 Press Release - City of Norfolk, NE","","[""City of Norfolk, NE"", ""Police Division"", ""March 4, 2021 Press Release""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]" -1977,http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested--charges-filed/,Media Bulletins,200,ROBBERY SUSPECT ARRESTED; CHARGES FILED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1978,https://alpha.austin.gov/police-oversight/formal-complaint-impartial-attitude-and-courtesy-13/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -1979,http://www.longbeach.gov/police/press-releases/dui-checkpoint/,Media Bulletins,200,DUI Checkpoint,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1980,http://www.longbeach.gov/police/press-releases/traffic-fatality---long-beach-blvd.--cambridge-st/,Media Bulletins,200,Traffic Fatality - Long Beach Blvd. & Cambridge St.,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1981,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/071421blotter.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -1982,http://www.longbeach.gov/police/press-releases/halloween-safety-tips-1-/,Media Bulletins,200,Halloween Safety Tips(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -1983,https://www.ashevillenc.gov/wp-content/uploads/2016/08/citizens-police-academy.jpg,Poor Data Source,200,"","",[],[],[],[],[],[] -1984,https://www.lyndhurstohio.gov/police-crime-prevention-run-hide-fight.html,Poor Data Source,404,"","",,,,,, -1985,https://www.hayward-ca.gov/discover/news/feb19/applicants-sought-new-police-community-advisory-panel,Training & Hiring Info,200,Applicants sought for new police Community Advisory Panel | City of Hayward - Official website,Hayward residents interested in serving on a new Community Advisory Panel to the Hayward Chief of Police are invited to submit applications for consideration and potential selection.The purpose of the Community Advisory Panel is to improve trust and strengthen understanding between the Hayward Police Department and Hayward community members by creating a structure and venue,"[""Applicants sought for new police Community Advisory Panel ""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form""]",[],"[""Re-CAP: Hayward\u2019s Updated Climate Action Plan (CAP)"", ""Try induction cooking for free through Ava Community Energy\u2019s Induction Cooktop Lending Program!"", ""The City of Hayward\u2019s Fight Against Food Waste"", ""Decoding Plastic Recycling In California"", ""Keep Hayward Clean and Green with Adopt-A-Block!"", ""City Hall and Nonessential Services Closures: Monday, Feb 12 and Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""Library Closure January 15, 2024"", ""Library Closure: December 23 2023 - January 1 2024"", ""Library closure: November 23 - November 26, 2023."", ""YOU ARE HERE.SO IS EVERYTHING ELSE."", ""Related News"", ""Annual Dr. Martin Luther King Jr. Birthday Celebration event returns Jan. 15"", ""Public reception Thursday for Chabot College President Cooks and Hayward Unified Superintendent Reimann "", ""City of Hayward holiday business closure and service changes"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -1986,https://southamptontownnypolice.gov/169/parent-resources,Resources,200,"Parent Resources | Southampton, NY - Official Website",Find valuable parenting resources through the Youth Bureau.,"[""\r\n\r\nParent Resources\t\t""]","[""Parents with a Purpose Resources"", ""Preventing Youth Drug Use"", ""Teen Drinking Information""]","[""Loading"", ""Site Tools"", ""Contact Us"", """", ""Contact Us"", ""Site Links""]",[],[],[] -1987,https://www.mass.gov/doc/essential-functions-of-a-police-officer/download,Poor Data Source,200,"","",[],[],[],[],[],[] -1988,http://www.longbeach.gov/police/press-releases/l.b.p.d2.-promotes-new-leaders/,Media Bulletins,200,L.B.P.D. PROMOTES NEW LEADERS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1989,https://www.jacksonms.gov/meetings/bid-opening-jpd-november-30-2021/jpd-rfp-catering-services-for-the-city-of-jackson-police-training-academy/,Not Criminal Justice Related,200,"JPD RFP-Catering Services for The City of Jackson-Police Training Academy - Jackson, MS","","[""JPD RFP-Catering Services for The City of Jackson-Police Training Academy""]","[""Primary menu links"", ""Action toolbar"", ""Recent news"", ""Contact"", ""Subscribe"", ""Connect""]","[""Extreme weather updates for Wednesday, January 17"", ""H.O.P.E. for the Holidays event Thursday"", ""Roll-Off Dumpster Day Dec. 9"", ""City seeking donations for \u2018Blanket Drive\u2019"", ""Jackson Gears Up for 13th\u00a0annual \u2018Doing Business with the City\u2019\u00a0""]","[""Cold Weather Shelter - Open""]","["""", """", """"]",[] -1990,https://www.stpaul.gov/departments/police/21st-century-policing-report/pillar-2-policy-and-oversight/report-0,List of Data Sources,200,Report Recommendation 2.2 | Saint Paul Minnesota,"Ensure comprehensive policies on the use of force that include training, investigations, prosecutions, data collection, and information sharing that are clear, concise, and openly available for public inspection.","[""\nReport Recommendation 2.2\n""]","[""Main Navigation"", ""Popular Topics"", ""Breadcrumb"", ""Footer""]","[""\n You are using an unsupported browser. Please use Microsoft Edge.\n "", ""\n SPPD has comprehensive use-of-force policies\n "", ""\n SPPD posts interactive policies online\n "", ""\n SPPD emphasizes minimal force\n "", ""\n SPPD regularly trains use of force\n "", ""\n SPPD is committed to crisis intervention training\n "", ""\n SPPD is investing in training\n "", ""\n SPPD is committed to community safety\n "", ""\n SPPD is committed to transparency\n "", ""\n SPPD is committed to transparency\n "", ""\n SPPD is committed to transparency\n "", ""\n SPPD is committed to transparency\n "", ""\n SPPD is committed to transparency\n "", ""\n SPPD is committed to transparency\n "", ""\n SPPD is committed to transparency\n "", ""\n SPPD reviews all uses of force\n "", ""\n SPPD is committed to excellence\n "", ""\n Contact The City\n "", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured"", ""\n Reference Data\n "", ""\n Reference Data\n "", ""\n Reference Data\n "", ""\n Reference Data\n "", ""\n Reference Data\n "", ""\n Reference Data\n "", ""\n Reference Data\n "", ""\n Reference Data\n "", ""\n Reference Data\n ""]",[],[] -1991,https://delcopa.gov/publicrelations/releases/2020/pdf/citizencorptrainingaug27.pdf,Media Bulletins,200,"","",[],[],[],[],[],[] -1992,http://www.longbeach.gov/police/press-releases/l.b.p.d.-seizes-large-quantity-of-fireworks/,Media Bulletins,200,L.B.P.D. SEIZES LARGE QUANTITY OF FIREWORKS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1993,https://www.coppelltx.gov/217/emergency-notification-system-notifycopp,Resources,200,"Emergency Notification System (NotifyCoppell) | Coppell, TX",Learn about the NotifyCoppell system and what you receive when you sign up for it. ,"[""\r\n\r\nEmergency Notification System (NotifyCoppell)\t\t""]","[""Fire Station #1"", ""Fire Station #2"", ""Fire Station #3"", ""Fire Station #4""]","[""Loading""]",[],[],[] -1994,https://www.sandiego.gov/police/news-center/cold-cases/frank-lee-foust,Media Bulletins,200,Frank Lee Foust | City of San Diego Official Website,"Officers were called to the scene after the building manager checked on an occupant and found him dead. The tenant had been shot at close range with a small caliber handgun. According to other tenants and the manager, the victim was last seen alive two days prior to being found. The victim was a 35-year-old black male who worked as a welder, and was a self employed artist. The victim's wallet and personal property were not taken. There is no known motive for the crime.","[""City of San Diego Official Website"", ""Cold Case: Frank Lee Foust\n""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""News Center"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -1995,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-results/,Media Bulletins,200,DUI SATURATION PATROL RESULTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1996,http://www.lafayettepolice.us/2356/photos,Not Criminal Justice Related,200,"Photos | Lafayette, IN - Official Website","","[""\r\n\r\nPhotos\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -1997,https://wyomingohio.gov/departments/police-department-2/coyote-information/,Poor Data Source,404,"","",,,,,, -1998,http://www.longbeach.gov/police/press-releases/l-b-p-d--seeks-public-s-help-in-robbery-being-investigated-as-hate-crime/,Media Bulletins,200,L.B.P.D. SEEKS PUBLIC'S HELP IN ROBBERY BEING INVESTIGATED AS HATE CRIME,"","[""Long BeachPolice Department""]",[],[],[],[],[] -1999,https://alpha.austin.gov/es/police-oversight/formal-complaint-acts-bringing-discredit-upon-the-department/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2000,https://www.roundrocktexas.gov/news/police-looking-witnesses-fatal-collision/,Media Bulletins,200,Police looking for witnesses to fatal collision - City of Round Rock,"",[],[],"[""Police looking for witnesses to fatal collision""]","[""Site Search"", ""Follow Us""]",[],[] -2001,https://champaignil.gov/2015/03/02/champaign-police-investigate-downtown-shooting/,Media Bulletins,200,Champaign Police Investigate Downtown Shooting - City of Champaign,"","[""Champaign Police Investigate Downtown Shooting""]","[""News Releases"", ""Department News""]",[],[],[],[] -2002,http://www.longbeach.gov/police/press-releases/murder-6700-block-gardenia/,Media Bulletins,200,MURDER 6700 BLOCK GARDENIA,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2003,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0876/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2004,http://www.longbeach.gov/police/press-releases/residential-robbery-suspects-charged/,Media Bulletins,200,RESIDENTIAL ROBBERY SUSPECTS CHARGED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2005,https://mukilteowa.gov/departments/police/gun-safety-class-scholarship-program/,Resources,200," - City of Mukilteo - | Gun Safety Class Scholarship Program - City of Mukilteo ","","[""\n\t\t Gun Safety Class Scholarship Program\t\t ""]","[""\n\t\t\t\t\t\tSign up for notifications\n\t\t\t\t\t""]","[""Gun Safety Scholarship Program Application""]",[],[],[] -2006,https://police.birminghamal.gov/command-staff/captain-raymond-hollis-crutchfield/,Poor Data Source,404,"","",,,,,, -2007,https://www.arlingtontx.gov/city_hall/departments/police/community/crime_prevention,Poor Data Source,404,"","",,,,,, -2008,http://www.longbeach.gov/police/press-releases/automotive-business-compliance-checks-conducted/,Media Bulletins,200,AUTOMOTIVE BUSINESS COMPLIANCE CHECKS CONDUCTED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2009,https://alpha.austin.gov/es/police-oversight/2020-09-17-7/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2010,https://www.ci.san-bernardino.ca.us/city_hall/police_department/online_services,Resources,200," - Online Services - City of San Bernardino -","","[""City of San Bernardino California""]","[""Online Services""]",[],[],[],[] -2011,https://www.foxcrossingwi.gov/departments/police-department/history/30712442_10155740250625958_5846323570807930880_n/,Poor Data Source,200,30712442_10155740250625958_5846323570807930880_n - Fox Crossing Fox Crossing,"",[],"[""History \u00bb 30712442_10155740250625958_5846323570807930880_n""]",[],[],[],[] -2012,https://www.mass.gov/doc/riva-albert-v-boston-police-department-related-superior-court-decision-21210/download,Court Cases,200,"","",[],[],[],[],[],[] -2013,https://police.crystalmn.gov/our_city/boards_and_commissions/parks___recreation_commission,Not Criminal Justice Related,200," - Parks and Recreation Commission - City of Crystal -",Information related to the City of Crystal Parks & Recreation Commission.,"[""Parks and Recreation Commission""]","[""Recreation Director""]","[""Sign up for a city newsletter or notification."", ""City Hall"", ""Regular Hours:""]","[""Monday - Friday""]",[],[] -2014,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0871/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2015,http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested-and-charged-2-/,Media Bulletins,200,ROBBERY SUSPECT ARRESTED AND CHARGED(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2016,http://lafayettepolice.us/faq.aspx?qid=131,Not Criminal Justice Related,200,FAQs • Are there any districts already in Lafayette?,"",[],"["""", ""\n\u25bc\r\nHistoric Preservation Commission\t\t"", """"]","[""Loading"", ""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -2017,https://www.mass.gov/doc/berrios-crystal-v-boston-police-department-3316/download,Court Cases,200,"","",[],[],[],[],[],[] -2018,https://www.stmatthewsky.gov/public-works/application-for-employment-current-copy/,Training & Hiring Info,200,Application for Employment current - Copy - City of St Matthews,"","[""Application for Employment current \u2013 Copy""]",[],[],[],[],[] -2019,https://www.austintexas.gov/page/commend-austin-police-officer,Contact Info & Agency Meta,200,Commend an Austin Police Officer | AustinTexas.gov,Online Form - Commend an Austin Police Officer,"[""Commend an Austin Police Officer""]","[""Action Navigation"", ""GTranslate"", ""Main menu"", ""Frequently Viewed Departments"", ""Footer Menu"", ""Second Footer Menu""]","[""Resident"", ""Business"", ""Government"", ""Departments"", ""Connect""]",[],[],[] -2020,http://www.longbeach.gov/police/press-releases/students-returning-to-school-motorists-urged-to-drive-carefully/,Media Bulletins,200,STUDENTS RETURNING TO SCHOOL; MOTORISTS URGED TO DRIVE CAREFULLY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2021,https://coloradosprings.gov/police-department/page/commander-howard,Poor Data Source,403,"","",,,,,, -2022,https://www.minneapolismn.gov/resident-services/public-safety/police-public-safety/police-reports-and-data-requests/sex-offender-community-notification/,Resources,200,Sex Offender Community Notification - City of Minneapolis,The City notifies communities when a sex offender moves in. You can search for sex offenders online.,"[""Sex offender community notification"", ""Need help? We're here for you.""]","[""Community notification"", ""Sex offender search"", ""Minneapolis Police resources"", ""Community resources"", ""Help from crime prevention specialists"", ""Contact us""]","[""Jamie Kieffer"", """", ""Minneapolis Police Department"", ""Connect with the Minneapolis Police Department""]",[],[],[] -2023,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0003/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2024,http://www.longbeach.gov/police/press-releases/graduation-and-summer-break-safety-tips2/,Media Bulletins,200,GRADUATION AND SUMMER BREAK SAFETY TIPS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2025,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/060721arrests.pdf,Arrest Records,200,"","",[],[],[],[],[],[] -2026,https://norfolkne.gov/assets/site/documentcentral/police/statistical-reports/2021-statistical/mayormonthly050121.pdf,Annual & Monthly Reports,200,"","",[],[],[],[],[],[] -2027,https://delcopa.gov/planning/pdf/agendas/2021/agenda202107.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2028,https://www.lynchburgvapolice.gov/news-updates/update-suspect-sought-in-cornerstone-street-homicide/,Media Bulletins,200,[UPDATE] Suspect Sought in Cornerstone Street Homicide  - Lynchburg Police Department,"","[""[UPDATE] Suspect Sought in Cornerstone Street\u00a0Homicide\u00a0""]",[],[],"[""Contact Us"", ""Site Links"", ""Site Links""]",[],[] -2029,https://www.coppelltx.gov/1045/connect-with-oncor,Not Criminal Justice Related,200,"Connect with Oncor | Coppell, TX","Learn how to report power outages, downed power lines, and streetlight outages on Oncor.com. Learn how to receive alerts from Oncor. ","[""\r\n\r\nConnect with Oncor\t\t""]",[],"[""Loading"", ""Oncor Overview"", ""Report Outages or Downed Lines"", ""Receive Alerts from Oncor"", ""What is the difference between Oncor and my electricity service provider?"", ""ERCOT""]",[],[],[] -2030,https://www.mass.gov/info-details/2022-audit-of-the-bridgewater-state-university-objectives-scope-and-methodology,Annual & Monthly Reports,200,"2022 Audit of the Bridgewater State University Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Bridgewater State University,"[""\n2022 Audit of the Bridgewater State University Objectives, Scope, and Methodology\n""]","[""Table of Contents\n for the audit, Audit of the Bridgewater State University"", ""Table of Contents"", ""Overview\n "", ""Data Reliability\n "", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -2031,https://police.birminghamal.gov/command-staff/captain-james-jackson/,Personnel Records,200,Captain James Jackson | Birmingham Police Department,"","[""\n\n\n Birmingham Police Department\n\n\t\t\t\t\tCommitment | Excellence | Integrity\t\t\t\t\n\n""]","[""Putting People First"", ""Captain James Jackson""]",[],"[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[] -2032,https://delcopa.gov/vote/military-overseas.html,Not Criminal Justice Related,200,"Military & Overseas Resources - Delaware County, Pennsylvania","","[""Military & Overseas Resources""]",[],"[""Military and Overseas Voters"", ""Delco Votes!"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2033,https://spdblotter.seattle.gov/2014/12/30/police-arrest-christmas-day-bank-burglar/,Media Bulletins,200,Police Arrest Christmas Day Bank Burglar - SPD Blotter,"","[""Police Arrest Christmas Day Bank Burglar""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -2034,https://alpha.austin.gov/es/police-oversight/2020-06-05-1/,Not Criminal Justice Related,200,Maintenance Notice,"",[],[],[],[],[],[] -2035,https://delcopa.gov/courts/pdf/21noticetothebarpublic_boardofmanagers_juveniledetentioncenter.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2036,http://www.longbeach.gov/police/press-releases/juvenile-held-in-connection-with-robbery-case/,Media Bulletins,200,JUVENILE HELD IN CONNECTION WITH ROBBERY CASE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2037,http://www.longbeach.gov/police/press-releases/significant-crime-reduction-during-first-year-metro-blue-line-contract/,Media Bulletins,200,SIGNIFICANT CRIME REDUCTION DURING FIRST YEAR METRO BLUE LINE CONTRACT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2038,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2017_news_releases/police_launch_community_camera_partnership_program,Media Bulletins,200," - Police Launch Community Camera Partnership Program - Village of Pleasant Prairie -","",[],"[""Police Launch Community Camera Partnership Program""]","[""Follow Us on Social Media""]",[],[],[] -2039,https://spdblotter.seattle.gov/2017/03/13/suspected-prowler-arrested-after-police-spot-him-peering-into-cars-at-downtown-garage/,Media Bulletins,200,Suspected Prowler Arrested After Police Spot Him Peering Into Cars at Downtown Garage - SPD Blotter,"","[""Suspected Prowler Arrested After Police Spot Him Peering Into Cars at Downtown Garage""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -2040,http://www.norwoodma.gov/departments/police/report_a_tip.php,Resources,200,"Welcome to Town of Norwood, Massachusetts","Welcome to Town of Norwood, Massachusetts","[""Report a Tip""]",[],[],[],[],[] -2041,http://www.longbeach.gov/police/press-releases/murder-36-/,Media Bulletins,200,MURDER(36),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2042,https://delcopa.gov/publicrelations/releases/2020/thankyoufirstresponders.html,Media Bulletins,200,"Thank You Citizens Corps of Delaware County - Delaware County, Pennsylvania","","[""Thank you Citizens Corps of Delaware County""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""\u00a0""]",[],[] -2043,https://delcopa.gov/courts/judges/kelly.html,Personnel Records,200,President Judge Kevin F. Kelly - Delaware County Court of Common Pleas,"","[""Judge Kevin F. Kelly""]",[],"[""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[] -2044,https://cityofsweetwater.fl.gov/event/sweetwater-police-pension-plan-board-of-trustees-meeting/,Policies & Contracts,200,Agendas & Minutes - City of Sweetwater,"",[],"[""Agendas & Minutes""]","["""", ""Contact City Hall"", ""Office Hours""]",[],"[""Search Meeting Minutes, Agendas & Packets""]",[] -2045,https://coloradosprings.gov/police-department/article/news/update-homicide-investigation-3125-sinton,Media Bulletins,200,Update Homicide Investigation at 3125 Sinton Road | City of Colorado Springs,"","[""\nUpdate Homicide Investigation at 3125 Sinton Road\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -2046,https://hilliardohio.gov/hpd-partners-with-neighboring-police-agencies-for-career-day/,Misc Police Activity,200,HPD Partners with Neighboring Police Agencies for Career Day - City of Hilliard,"The Hilliard Division of Police will join other nearby police agencies June 15 for a special Suburban Police Career Day. The event, the first of its kind","[""News"", ""HPD Partners with Neighboring Police Agencies for Career Day""]",[],[],"[""Recent Articles"", ""Hilliard Newsletter"", ""City Hall and Admin"", ""Hilliard Mayor's Court"", ""Division of Police"", ""Police Assistance"", ""Police Records and General Assistance"", ""Norwich Township Fire"", ""Hilliard Recreation & Parks"", ""Hilliard Newsletter"", ""Quick Links"", ""Stay connected with us""]",[],"[""Click the \u2018x\u2019 to opt out.""]" -2047,https://alpha.austin.gov/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/bwc-dmav-data-analysis-data-cleaning-operations/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2048,https://ridgelandsc.gov/police-department/daily-crime-reports-march-2022,Crime Maps & Reports,200,Town of Ridgeland,Town of Ridgeland,"[""Police Department""]","[""Daily Crime Reports - March 2022""]",[],"[""March 31"", ""March 30"", ""March 29"", ""March 28"", ""March 27"", ""March 26"", ""March 25"", ""March 24"", ""March 23"", ""March 22"", ""March 21"", ""March 20"", ""March 19"", ""March 18"", ""March 17"", ""March 16"", ""March 15"", ""March 14"", ""March 13"", ""March 12"", ""March 11"", ""March 10"", ""March 9"", ""March 8"", ""March 7"", ""March 6"", ""March 5"", ""March 4"", ""March 3"", ""March 2"", ""March 1""]",[],[] -2049,http://www.longbeach.gov/police/press-releases/motorcycle-safety-operation-results/,Media Bulletins,200,MOTORCYCLE SAFETY OPERATION RESULTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2050,https://spdblotter.seattle.gov/2022/06/30/police-arrest-woman-for-shooting-outside-capitol-hill-apartment/,Media Bulletins,200,Police Arrest Woman for Shooting Outside Capitol Hill Apartment - SPD Blotter,"","[""Police Arrest Woman for Shooting Outside Capitol Hill Apartment""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -2051,https://www.mass.gov/info-details/audit-of-the-office-of-the-commissioner-of-probation-objectives-scope-and-methodology,Not Criminal Justice Related,200,"Audit of the Office of the Commissioner of Probation Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Office of the Commissioner of Probation.,"[""\nAudit of the Office of the Commissioner of Probation Objectives, Scope, and Methodology\n""]","[""Table of Contents\n for the audit, Audit of the Office of the Commissioner of Probation (OCP)"", ""Appendix\n "", ""Table of Contents"", ""Overview\n "", ""Enrollment of GPS and SCRAM Participants\n "", ""Monitoring of GPS Alerts\n "", ""Monitoring of SCRAM Alerts\n "", ""Review of Juvenile Record Requests\n "", ""Data Reliability\n "", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -2052,https://www.mass.gov/doc/national-environmental-policy-act-review-scoping-summary-report-i-90-allston-multimodal-project/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2053,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2020_news_releases/police_continue_manhunt,Media Bulletins,200," - Police Continue Manhunt - Village of Pleasant Prairie -","",[],"[""Police Continue Manhunt""]","[""Follow Us on Social Media""]",[],[],[] -2054,http://www.longbeach.gov/police/press-releases/felony-suspect-arrested/,Media Bulletins,200,FELONY SUSPECT ARRESTED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2055,https://southamptontownnypolice.gov/1543/policies-for-the-zba,Policies & Contracts,200,"Policies for the ZBA | Southampton, NY - Official Website","","[""\r\n\r\nPolicies for the ZBA \t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]",[],[],[] -2056,https://whitestown.in.gov/news/christmas-with-a-cop/,Media Bulletins,200,Christmas with a Cop - Town of Whitestown,"","[""Recent News"", ""Christmas with a Cop""]","[""How can we help?"", ""Recent News Articles"", ""\nHow to use a HAWK signal\n"", ""\nWhitestown Town Council Announces 2024 Board Appointments\n"", ""Visit Us"", ""Contact Us"", ""Stay Connected""]",[],[],[],[] -2057,http://www.longbeach.gov/police/press-releases/identity-theft-suspect-charged-with-11-felony-counts/,Media Bulletins,200,IDENTITY THEFT SUSPECT CHARGED WITH 11 FELONY COUNTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2058,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0718/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2059,http://www.longbeach.gov/police/press-releases/murder-13-/,Media Bulletins,200,MURDER(13),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2060,https://delcopa.gov/heroin/tipsforprevention.html,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2061,https://www.roseville.ca.us/government/departments/police_department/crime_log/crime_log_feb_18_-_march_3__2019,Poor Data Source,404,"","",,,,,, -2062,https://www.lehi-ut.gov/departments/police/,Contact Info & Agency Meta,200,Police - Lehi City,"","[""Police""]","[""Lehi City Police Records Request Form"", ""incident reporting system"", ""Lehi City Police Department Bicycle Registration"", ""More Information"", ""Related Pages""]","["""", ""To report an incident CLICK HERE"", ""Lehi Police Department"", ""Office Hours""]",[],[],[] -2063,https://spdblotter.seattle.gov/2020/07/25/police-make-dozens-of-arrests-after-explosion-damages-east-precinct-and-march-turns-to-riot/,Media Bulletins,200,Police Make Dozens of Arrests After Explosion Damages East Precinct and March Turns to Riot - SPD Blotter,"","[""Police Make Dozens of Arrests After Explosion Damages East Precinct and March Turns to Riot""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -2064,https://www.almaarkansas.gov/downloads/alma-police-car/,Poor Data Source,200,"alma-police-car | City of Alma, Arkansas","","[""alma-police-car""]",[],[],[],"[""Helpful Numbers"", ""Community Links""]","[""Sitemap \u00a0\u00a0/\u00a0\u00a0 Privacy \u00a0\u00a0/\u00a0\u00a0 Arkansas Web Design""]" -2065,http://www.ryepolice.us/logs/police-logs-for-4-3-19-4-9-19,Daily Activity Logs,200,Rye Police Department Police Logs for 4/3/19-4/9/19 - Rye Police Department,"","[""Police Logs for 4/3/19-4/9/19""]","[""Police Logs for 4/3/19-4/9/19""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -2066,https://www.coppelltx.gov/555/nancy-monroe,Not Criminal Justice Related,404,"","",,,,,, -2067,http://www.ryepolice.us/wp-content/uploads/wallis-sands-half-marathon-route.jpg,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2068,http://www.longbeach.gov/police/press-releases/murder-orange-and-washington/,Media Bulletins,200,MURDER-Orange and Washington,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2069,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2014_archived_news/october_2014/uta_spotlight_arlington_police_students_celebrate,Media Bulletins,200," - UTA Spotlight: Arlington Police, Students Celebrate National Night Out - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""UTA Spotlight: Arlington Police, Students Celebrate National Night Out""]",[],[],[],[] -2070,https://police.greenvillesc.gov/faq.aspx?qid=222,Complaints & Misconduct,200,FAQs • How can I file a complaint about an officer?,"",[],"[""\n\u25bc\r\nPolice Department\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -2071,https://beaumonttexas.gov/police-investigating-aggravated-assault-4600-block-detroit/,Poor Data Source,404,"","",,,,,, -2072,https://rexburg.us/police-identify-man-killed-in-motorcycle-crash-in-logan-canyon/,Poor Data Source,522,"","",,,,,, -2073,https://champaignil.gov/tag/copper-road/,List of Data Sources,200,Copper Road Archives - City of Champaign,"","[""Items tagged: Copper Road""]","[""Copper Ridge Road Lane Closure (between Mullikin Drive and Copper Road)"", ""2023 Concrete Street Improvements Project"", ""2023 Concrete Street Improvements Project"", ""Copper Ridge Road Closure (between Copper Road and Mullikin Drive)"", ""News Releases"", ""Department News""]",[],[],[],[] -2074,https://www.police.wallingfordct.gov/about-us/history/,Not Criminal Justice Related,200,"Our History | Wallingford, CT Police Department","The Wallingford Police Department (WPD) formed in 1913, when it consisted of a single officer serving approximately 11,000 people.","[""Our History""]","[""Wallingford Police Department Through the Years""]",[],[],[],[] -2075,http://www.longbeach.gov/police/press-releases/traffic-fatality---willow-st.-and-golden-ave/,Media Bulletins,200,TRAFFIC FATALITY - WILLOW ST. AND GOLDEN AVE.,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2076,https://www.townofnewhartfordny.gov/police-commission-minutes,Poor Data Source,200,Official Website for the Town of New Hartford New York - Police Commission Minutes,Warren New Hampshire,[],"[""Town of New Hartfordat \""The Orchards\""""]","[""Contact Us"", ""Social Media"", ""Quick Links"", ""Site Links""]",[],[],[] -2077,https://barnegatpolice.us/six-arrested-drug-charges/,Media Bulletins,200,Six Arrested on Drug Charges - Barnegat Township Police Department,"","[""Six Arrested on Drug Charges""]","[""Six Arrested on Drug Charges""]","[""\n\t\t\t\t\t\tAbout the Author: \t\t\t\t\t\tBTPD "", ""\n\t\t\t\t\t\tRelated Posts\t\t\t\t\t""]","[""Share This Story, Choose Your Platform!"", ""\n\n\t\t\t\t\t\tRobbery Arrest\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tDWI Arrest\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tDWI Arrest\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tRobbery Investigation Leads to Multiple Arrests, Recovery of Handgun\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tDWI Arrests\t\t\t\t\t\n"", ""Resources"", ""Directions"", ""Quick Links""]",[],[] -2078,https://chandlerazpd.gov/2014/09/chandler-police-looking-for-g-a-i-n-participants-4/,Media Bulletins,200,Chandler Police Looking for G.A.I.N. Participants – Chandler Police Department,"","[""Chandler Police Looking for G.A.I.N. Participants""]",[],"[""Quick Links"", ""News Archives"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n""]","[""\n\n\t\tSeptember 2, 2014\t\n"", "" Contact"", "" About the Department"", "" Latest News"", ""\n Courage, Pride, Dedication\n \n \u00a9 2024 Chandler Police Department \n""]",[],[] -2079,https://wrightstown.us/police-community-information/driving-in-school-zones/,Resources,200,Driving in School Zones - Village of Wrightstown,"","[""Driving in School Zones""]","[""ALWAYS DRIVE SAFELY IN SCHOOL ZONES"", ""Recent News"", ""\n\t\t\t\t\t\tUpcoming Events\t\t\t\t\t""]",[],"[""Village Hall"", ""Public Works"", ""Police Department"", ""Fire Department"", ""Join Us on Social Media""]",[],[] -2080,https://delcopa.gov/planning/pubs/index.html,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2081,http://www.cityofpataskalaohio.gov/cop_folder/2015-legislation-under-public-notices/advertisement-of-legislation-passed-december-1-2014-2/,Not Criminal Justice Related,200,"Advertisement of Legislation passed December 1, 2014 - City Of Pataskala",Official Website,"[""\n\t\t\t\tCity Of Pataskala\t\t\t"", ""\n\t\t\t\t\tAdvertisement of Legislation passed December 1, 2014\t\t\t\t""]","[""\n\t\t\t\tOfficial Website\t\t\t"", ""Categories""]",[],[],[],[] -2082,http://www.longbeach.gov/police/press-releases/weapon-crusher/,Media Bulletins,200,Weapon Crusher,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2083,https://alpha.austin.gov/en/police-oversight/policy-review-and-recommendations-8-cant-wait/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2084,https://dps.iowa.gov/marshalltown-police-department-makes-arrest-part-death-investigation,Media Bulletins,200,Marshalltown Police Department Makes Arrest as Part of Death Investigation | Iowa Department of Public Safety,"January 24, 2022 Marshalltown, Iowa - This is not a press release from the Iowa Department of Public Safety. It is being shared as a result of the Division of Criminal Investigation's assistance with this investigation.","[""\n\n Iowa Department of\n \n\n Public Safety\n \n"", ""Marshalltown Police Department Makes Arrest as Part of Death Investigation\n""]",[],[],[],[],[] -2085,https://www.mass.gov/news/reminders-being-issued-by-massdot-eopss-massachusetts-state-police-and-transportation-partners,Media Bulletins,200,"Reminders being issued by MassDOT, EOPSS, Massachusetts State Police and Transportation Partners | Mass.gov","Drive Slower, Drive Hands-Free, ""Look Twice to save a Life"", Wear A Seatbelt","[""\nNews\u00a0\n Reminders being issued by MassDOT, EOPSS, Massachusetts State Police and Transportation Partners\n ""]","[""Media Contact for Reminders being issued by MassDOT, EOPSS, Massachusetts State Police and Transportation Partners"", ""Media Contact\n for Reminders being issued by MassDOT, EOPSS, Massachusetts State Police and Transportation Partners"", ""\n\nMassachusetts Department of Transportation\u00a0\n\n"", ""Media Contact for Reminders being issued by MassDOT, EOPSS, Massachusetts State Police and Transportation Partners"", ""Help Us Improve Mass.gov with your feedback""]","[""\n MassDOT Communications Office\n "", ""\n MassDOT Communications Office\n "", ""\n MassDOT Communications Office\n ""]","[""\n\nPhone\n"", ""\n\nPhone\n"", ""\n\nPhone\n""]",[],[] -2086,https://southamptontownnypolice.gov/1034/2017-adopted-budget---capital,Annual & Monthly Reports,200,"2017 Adopted Budget - Capital | Southampton, NY - Official Website","","[""\r\n\r\n2017 Adopted Budget - Capital \t\t""]",[],"[""Loading"", ""Site Tools"", ""2017 Adopted Budget - Capital "", ""Contact Us"", ""Site Links""]",[],[],[] -2087,https://www.foxcrossingwi.gov/departments/police-department/history/,Misc Police Activity,200,History - Fox Crossing Fox Crossing,"","[""""]",[],"[""History""]",[],[],"["""", ""Evolution of our patch"", """", """", ""Evolution of our badge""]" -2088,https://rocklandmaine.gov/events/police-review-committee/,Poor Data Source,200,"Police Review Committee | The City of Rockland, Maine","","[""Police Review Committee"", ""Police Review Committee""]",[],"[""All Current Alerts & Announcements"", ""Current Weather"", ""Date"", ""Time"", ""Location"", ""Leave a Comment Cancel reply"", ""City of Rockland""]",[],[],[] -2089,http://www.longbeach.gov/police/press-releases/murder-1300-block-11th/,Media Bulletins,200,murder 1300 block 11th,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2090,https://coloradosprings.gov/police-department/page/metro-crime-lab,Misc Police Activity,200,Metro Crime Lab | City of Colorado Springs,"","[""\nMetro Crime Lab \n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]","[""\n\n\n\n Chemistry\n \n"", ""\n Chemistry\n "", ""\n\n\n\n Crime Scene Investigations\n \n"", ""\n Crime Scene Investigations\n "", ""\n\n\n\n DNA\n \n"", ""\n DNA\n "", ""\n\n\n\n Firearms\n \n"", ""\n Firearms\n "", ""\n\n\n\n Latent Fingerprint Examinations\n \n"", ""\n Latent Fingerprint Examinations\n ""]",[],"[""REPORT ONLINE""]",[] -2091,http://www.longbeach.gov/police/press-releases/dui-saturation-patrols-planned-this-weekend/,Media Bulletins,200,DUI SATURATION PATROLS PLANNED THIS WEEKEND,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2092,https://delcopa.gov/publicrelations/releases/2020/covidtesting_lansdowneaug.html,Not Criminal Justice Related,200,"Delaware County Announces COVID-19 Public Testing Site in Lansdowne - Delaware County, Pennsylvania","","[""Delaware County Announces COVID-19 Public Testing Site in Lansdowne""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Drive-thru and walk-up testing available for Delaware County residents on August 11, 12 and 13""]",[],[] -2093,https://balharbourfl.gov/departments/police/request-crash-report/,Accident Reports,200,Request Crash Report - Bal Harbour Residents,"","[""Request Crash Report""]",[],[],[],[],[] -2094,https://spdblotter.seattle.gov/2015/04/30/barefoot-felon-ditches-stolen-car-gun-at-mcdonalds-leads-police-on-chase/,Media Bulletins,200,"Barefoot Felon Ditches Stolen Car, Gun at McDonald's, Leads Police On Chase - SPD Blotter","","[""Barefoot Felon Ditches Stolen Car, Gun at McDonald\u2019s, Leads Police On Chase""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -2095,http://www.longbeach.gov/police/press-releases/dui-drivers-license-checkpoint-planned-this-weekend-2147438636/,Media Bulletins,200,DUI-DRIVERS LICENSE CHECKPOINT PLANNED THIS WEEKEND,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2096,http://www.longbeach.gov/police/press-releases/assault-investigation-leads-to-firearm-discharge/,Media Bulletins,200,ASSAULT INVESTIGATION LEADS TO FIREARM DISCHARGE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2097,https://alpha.austin.gov/police-oversight/2020-06-12-5/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2098,https://www.memphistn.gov/news/wpfd_file/police-services-18/,Poor Data Source,404,"","",,,,,, -2099,http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested-2-/,Media Bulletins,200,ROBBERY SUSPECT ARRESTED(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2100,https://delcopa.gov/sustainability/pdf/raise/ihpinterprativesignageguidelinesvoliidesignhandbook_2013.pdf,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2101,https://directory.arkansas.gov/agency/secretary-of-state/state-capitol-police/employees/john-watt/,List of Data Sources,200,State Directory – Arkansas.gov,"","["" Flag Status""]","[""\n\n\t\t\t\t\t\tDiscover More\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tDiscover More\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tDiscover More\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tDiscover More\t\t\t\t\t\n"", ""What can we help you find?"", ""Search the Directories"", ""Flag Status"", """"]","[""Government Resources"", ""Business Resources"", ""Residents Resources"", ""Visiting Resources"", ""State Directory"", ""Agencies"", ""Services"", ""Employees"", ""Your Arkansas.gov"", ""Top Online Services"", ""helpful information""]","[""Was the information on this page helpful?""]",[],[] -2102,https://delcopa.gov/planning/pdf/programsandinitiatives/implementingenforcingfloodplainordinance.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2103,http://www.longbeach.gov/police/press-releases/traffic-fatality4/,Media Bulletins,200,TRAFFIC FATALITY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2104,https://www.southamptontownnypolice.gov/agendacenter,Not Criminal Justice Related,200,"Agenda Center • Southampton, NY • CivicEngage","","[""Agenda Center""]","[""\u25bcConservation Board"", ""\u25bcHampton Bays CAC"", ""\u25bcLandmarks & Historic Districts Board"", ""\u25bcLRB - Licensing Review Board Agenda"", ""\u25bcNorth Sea CAC"", ""\u25bcRoad Review Committee"", ""\u25bcTrustees"", ""\u25bcWater Mill CAC"", ""\u25bcZoning Board of Appeals""]","[""Loading"", ""Site Tools"", ""Tools"", ""Search Agendas by:"", ""Contact Us"", ""Site Links""]","[""\n\nJan 24, 2024\r\n\t\t\t\r\n\t\t\t\t\u2009\u2014\u2009Amended Jan 23, 2024 9:45 AM\r\n\t\t\t\r\n\t\t\t"", ""\n\nJan 10, 2024\r\n\t\t\t\r\n\t\t\t\t\u2009\u2014\u2009Amended Jan 9, 2024 3:13 PM\r\n\t\t\t\r\n\t\t\t"", ""\n\nSep 23, 2021\r\n\t\t\t\r\n\t\t\t\t\u2009\u2014\u2009Amended Sep 22, 2021 7:41 AM\r\n\t\t\t\r\n\t\t\t"", ""\n\nJan 16, 2024\r\n\t\t\t\r\n\t\t\t\t\t\t\u2009\u2014\u2009Posted Jan 10, 2024 12:38 PM\r\n\t\t\t\t\t\r\n\t\t\t"", ""\n\nJun 8, 2022\r\n\t\t\t\r\n\t\t\t\t\t\t\u2009\u2014\u2009Posted Jun 15, 2022 11:58 AM\r\n\t\t\t\t\t\r\n\t\t\t"", ""\n\nMay 11, 2022\r\n\t\t\t\r\n\t\t\t\t\t\t\u2009\u2014\u2009Posted May 11, 2022 12:21 PM\r\n\t\t\t\t\t\r\n\t\t\t"", ""\n\nApr 13, 2022\r\n\t\t\t\r\n\t\t\t\t\t\t\u2009\u2014\u2009Posted Apr 13, 2022 3:39 PM\r\n\t\t\t\t\t\r\n\t\t\t"", ""\n\nMar 9, 2022\r\n\t\t\t\r\n\t\t\t\t\t\t\u2009\u2014\u2009Posted Mar 9, 2022 11:54 AM\r\n\t\t\t\t\t\r\n\t\t\t"", ""\n\nFeb 9, 2022\r\n\t\t\t\r\n\t\t\t\t\t\t\u2009\u2014\u2009Posted Feb 9, 2022 11:54 AM\r\n\t\t\t\t\t\r\n\t\t\t"", ""\n\nJan 12, 2022\r\n\t\t\t\r\n\t\t\t\t\u2009\u2014\u2009Amended Jan 19, 2022 12:12 PM\r\n\t\t\t\r\n\t\t\t"", ""\n\nDec 17, 2021\r\n\t\t\t\r\n\t\t\t\t\t\t\u2009\u2014\u2009Posted Dec 9, 2021 11:33 AM\r\n\t\t\t\t\t\r\n\t\t\t"", ""\n\nFeb 14, 2023\r\n\t\t\t\r\n\t\t\t\t\t\t\u2009\u2014\u2009Posted Feb 13, 2023 3:20 PM\r\n\t\t\t\t\t\r\n\t\t\t"", ""\n\nJan 10, 2023\r\n\t\t\t\r\n\t\t\t\t\t\t\u2009\u2014\u2009Posted Jan 9, 2023 9:35 AM\r\n\t\t\t\t\t\r\n\t\t\t"", ""\n\nJan 22, 2024\r\n\t\t\t\r\n\t\t\t\t\t\t\u2009\u2014\u2009Posted Jan 18, 2024 4:15 PM\r\n\t\t\t\t\t\r\n\t\t\t"", ""\n\nJan 22, 2024\r\n\t\t\t\r\n\t\t\t\t\t\t\u2009\u2014\u2009Posted Jan 18, 2024 4:16 PM\r\n\t\t\t\t\t\r\n\t\t\t"", ""\n\nJan 8, 2024\r\n\t\t\t\r\n\t\t\t\t\t\t\u2009\u2014\u2009Posted Jan 5, 2024 7:58 AM\r\n\t\t\t\t\t\r\n\t\t\t"", ""\n\nApr 10, 2023\r\n\t\t\t\r\n\t\t\t\t\t\t\u2009\u2014\u2009Posted Mar 27, 2023 12:17 PM\r\n\t\t\t\t\t\r\n\t\t\t"", ""\n\nJan 18, 2024\r\n\t\t\t\r\n\t\t\t\t\t\t\u2009\u2014\u2009Posted Jan 12, 2024 4:02 PM\r\n\t\t\t\t\t\r\n\t\t\t"", ""\n\nJan 4, 2024\r\n\t\t\t\r\n\t\t\t\t\t\t\u2009\u2014\u2009Posted Jan 3, 2024 2:42 PM\r\n\t\t\t\t\t\r\n\t\t\t""]",[],[] -2105,http://police.portlandmaine.gov/499/cemeteries,Not Criminal Justice Related,200,"Cemeteries | Portland, ME - Official Website",The history of a town or city can be traced through their cemeteries - Portland's cemeteries are a fine example of this.,"[""Cemeteries""]",[],[],[],[],[] -2106,http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-three-arrests2/,Media Bulletins,200,DUI Checkpoint Nets Three Arrests(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2107,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/052721summary.pdf,Dispatch Logs,200,"","",[],[],[],[],[],[] -2108,https://bolivar.mo.us/shop-with-a-copr/p1018068/,Not Criminal Justice Related,200,"P1018068 - City of Bolivar, Missouri","","[""P1018068""]",[],[],[],[],[] -2109,http://www.longbeach.gov/police/press-releases/murder-investigation---atlantic-ave.-and-south-st/,Media Bulletins,200,*UPDATE* MURDER INVESTIGATION - ATLANTIC AVE. AND SOUTH ST.,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2110,https://www.antioch.il.gov/wpfb_file_category/commissions-police-pension-fund-agendas-2011-commissions-police-pension-fund-agendas-commissions-police-pension-fund-commissions-commissions-police-pension-fund/,List of Data Sources,200,"2011 - Antioch, IL","","[""Archives: 2011""]",[],"[""12-13-11 Police Pension Fund Agenda"", ""12-13-11 Police Pension Fund Agenda"", ""06-29-11 Police Pension Fund Agenda"", ""06-29-11 Police Pension Fund Agenda"", ""04-12-11 Police Pension Fund Agenda"", ""04-12-11 Police Pension Fund Agenda"", ""09-09-11 Police Pension Fund Agenda""]",[],[],[] -2111,https://delcopa.gov/planning/mapping/custommaprequests.html,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2112,http://www.longbeach.gov/police/press-releases/second-warrant-clearing-event/,Media Bulletins,200,SECOND WARRANT CLEARING EVENT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2113,https://delcopa.gov/publicrelations/releases/2020/earthday.html,Not Criminal Justice Related,200,"Celebrating the 50th Anniversary of Earth Day in Delco - Delaware County, Pennsylvania","","[""Celebrating the 50th Anniversary of Earth Day in Delco""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Ways to celebrate and participate in Earth Day amid the COVID-19 Pandemic""]",[],[] -2114,https://www.antiochca.gov/police/oes/,Resources,200,"Disaster Preparedness – City of Antioch, California","",[],"[""Contact Info""]","[""Office of Emergency Services (OES)""]","[""\nSend Message\n"", ""Disaster Preparedness"", ""\n\n""]","[""Joe Vigil"", ""Acting Chief of Police"", ""Captain Morefield"", ""Field Services"", ""Lt. Mellone"", ""Professional Standards"", ""\nCert: Citizens Emergency Response Team""]",[] -2115,https://www.naperville.il.us/services/naperville-police-department/programs-and-services/internship-program/,Training & Hiring Info,200,Internship Program | The City of Naperville,"The NPD Internship Program provides an inclusive, high-quality, safe and advanced educational experience for qualified individuals considering a career in the field of law enforcement.","[""Internship Program""]","[""Programs and Services "", ""Mission Statement"", ""Intern Testimonials"", ""\nNaperville Police Department\n""]","[""Explore""]",[],"[""Helping Residents Build a Better Community"", ""Resources for Doing Business in Naperville""]",[] -2116,https://www.antioch.il.gov/wpfb-file/11-02-16-police-pension-agenda-pdf-3/,Poor Data Source,200,"11-02-16 Police Pension Agenda - Antioch, IL",10564 11 02 16 police pension agenda pdf commissions fund agendas 2016 1477667300 c4564de1e4399e021859da3cf353db29 213x300 _yl6booqzxldd thumb jpg 10 28 08 20 0 pdf application trustees mary c dominiak ed macek jerry t johnson scott a pierce jay jozwiak ted p poulos lawrence m hanson mayor lori k romine village clerk agenda of antioch lake,"[""11-02-16 Police Pension Agenda""]",[],[],[],[],[] -2117,https://police.crystalmn.gov/how_do_i_/report_an_issue/street_light_outage,Not Criminal Justice Related,200,Xcel Energy,"",[],[],[],[],[],[] -2118,https://www.gurnee.il.us/government/departments/police-department/community-involvement/gurnee-citizen-police-academy/gurnee-citizen-police-academy/week-12,Training & Hiring Info,200," - Gurnee Citizen Police Academy -","","[""Police Department""]","[""Gurnee Citizen Police Academy"", ""Youth Citizen Police Academy""]","[""Now accepting applications for the Spring 2024 session!"", ""Click here to register for the Gurnee Citizen Police Academy"", ""Village Hall""]",[],[],[] -2119,https://biloxi.ms.us/police-fire-showcase-is-saturday-at-point-cadet/,Not Criminal Justice Related,200,"Police, fire showcase is Saturday at Point Cadet","","[""Police, fire showcase is Saturday at Point Cadet""]",[],[],[],[],[] -2120,https://www.southamptontownnypolice.gov/faq.aspx?qid=413,Resources,200,FAQs • How will you alert the public on updates on beach dri,"",[],"[""\n\u25bc\r\nTrustees - Endangered Species\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -2121,http://www.longbeach.gov/police/press-releases/traffic-fatality-3-/,Media Bulletins,200,TRAFFIC FATALITY(3),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2122,http://www.longbeach.gov/police/press-releases/---located----critical-missing-person/,Media Bulletins,200,---LOCATED--- CRITICAL MISSING PERSON,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2123,http://www.longbeach.gov/police/press-releases/fatality-1-/,Media Bulletins,200,FATALITY(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2124,https://www.mass.gov/event/police-standards-subcommittee-open-meeting-2022-07-12t090000-0400-2022-07-12t100000-0400,Media Bulletins,200,Police Standards Subcommittee Open Meeting | Mass.gov,"","[""\nPublic Hearing Notice\u00a0\n Police Standards Subcommittee Open Meeting\n ""]","[""\n\nAddress\n"", ""Overview\n of Police Standards Subcommittee Open Meeting"", ""Additional Resources\n for Police Standards Subcommittee Open Meeting"", ""Participating Organizations\n "", ""Help Us Improve Mass.gov with your feedback""]","[""Agenda\n ""]",[],[],[] -2125,https://www.hayward-ca.gov/discover/news/jul22/police-blotter-july-10-16-2022,Media Bulletins,200,"Police Blotter - July 10-16, 2022 | City of Hayward - Official website","STATISTICAL HIGHLIGHTSJuly 10-16, 2022 Weekly Arrests (Includes cite/released):66 Homicide 0Weekly Calls for Service: 1,968 Assault—Great Bodily Injury 5Weekly Reports Taken:230 Burglary— Non Residential 10Weekly Complaints(against HPD):2 Burglary—Residential 1Weekly Calls Received:5,644 Larceny 26This data is subject to change and based on crimes that were re-ported to have","[""Police Blotter - July 10-16, 2022""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form""]",[],"[""STATISTICAL HIGHLIGHTS"", ""July 10-16, 2022"", ""\u00a0"", ""\u00a0"", ""\u00a0 \u00a0\u00a0"", ""CASE SYNOPSIS"", ""Re-CAP: Hayward\u2019s Updated Climate Action Plan (CAP)"", ""Try induction cooking for free through Ava Community Energy\u2019s Induction Cooktop Lending Program!"", ""The City of Hayward\u2019s Fight Against Food Waste"", ""Decoding Plastic Recycling In California"", ""Keep Hayward Clean and Green with Adopt-A-Block!"", ""City Hall and Nonessential Services Closures: Monday, Feb 12 and Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""Library Closure January 15, 2024"", ""Library Closure: December 23 2023 - January 1 2024"", ""Library closure: November 23 - November 26, 2023."", ""YOU ARE HERE.SO IS EVERYTHING ELSE."", ""Related News"", ""Police Blotter: December 3-9, 2023"", ""Police Blotter - November 26-December 2, 2023"", ""Police Blotter - November 19-25, 2023"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -2126,https://dps.iowa.gov/former-pleasantville-police-officer-charged-sexual-abuse-minor,Media Bulletins,200,Former Pleasantville Police Officer Charged With Sexual Abuse of Minor | Iowa Department of Public Safety,"November 16, 2021 DES MOINES, Iowa - On November 12, 2021, at the request of the Pleasantville Police Department, Division of Criminal Investigation agents began a criminal investigation into allegations of sexual contact between a then-police officer with the Pleasantville Police Department and a 15-year-old juvenile. ","[""\n\n Iowa Department of\n \n\n Public Safety\n \n"", ""Former Pleasantville Police Officer Charged With Sexual Abuse of Minor\n""]",[],[],[],[],[] -2127,http://www.longbeach.gov/police/press-releases/arrests-made-in-illegal-firework-investigation/,Media Bulletins,200,ARRESTS MADE IN ILLEGAL FIREWORK INVESTIGATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2128,http://www.longbeach.gov/police/press-releases/traffic-fatality--cherry-ave---cherry-circle/,Media Bulletins,200,Traffic Fatality (Cherry Ave & Cherry Circle,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2129,https://www.hayward-ca.gov/discover/news/jul21/police-blotter-june-27-july-3-2021,Media Bulletins,200,"Police Blotter: June 27-July 3, 2021 | City of Hayward - Official website","STATISTICAL HIGHLIGHTSJune 27-July 3, 2021 Weekly Arrests (Includes cite/released):33 Homicide 0Weekly Calls for Service: 2,167 Assault—Great Bodily Injury 1Weekly Reports Taken:195 Burglary— Nonresidential 4Weekly Complaints(against HPD):0 Burglary—Residential 26Weekly Calls Received:6,325 Theft 26This data is subject to change and based on crimes that were reported to have","[""Police Blotter: June 27-July 3, 2021""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form""]",[],"[""STATISTICAL HIGHLIGHTS"", ""June 27-July 3, 2021"", ""\u00a0"", ""\u00a0"", ""\u00a0 \u00a0\u00a0"", ""Significant Incidents"", ""Re-CAP: Hayward\u2019s Updated Climate Action Plan (CAP)"", ""Try induction cooking for free through Ava Community Energy\u2019s Induction Cooktop Lending Program!"", ""The City of Hayward\u2019s Fight Against Food Waste"", ""Decoding Plastic Recycling In California"", ""Keep Hayward Clean and Green with Adopt-A-Block!"", ""City Hall and Nonessential Services Closures: Monday, Feb 12 and Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""Library Closure January 15, 2024"", ""Library Closure: December 23 2023 - January 1 2024"", ""Library closure: November 23 - November 26, 2023."", ""YOU ARE HERE.SO IS EVERYTHING ELSE."", ""Related News"", ""Police Blotter: December 3-9, 2023"", ""Police Blotter - November 26-December 2, 2023"", ""Police Blotter - November 19-25, 2023"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -2130,http://lafayettepolice.us/3404/census-2020,Not Criminal Justice Related,200,"Census 2020 | Lafayette, IN - Official Website","Everything you need to know about the United States 2020 Census, including why everyone should fill out the census, how to do it, and how the information is used.","[""\r\n\r\nCensus 2020\t\t"", ""The Census: Your Response Matters!"", ""CENSUS IS HIRING IN GREATER LAFAYETTE!""]","[""Health clinics. Fire departments. Schools. Even roads and highways. The census can shape many different aspects of your community.\u00a0"", ""Learn more about the Census and why it\u2019s so important""]","[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -2131,"https://norfolkne.gov/government/departments/police-division/press-releases/july-11,-2021-press-release.html",Media Bulletins,200,"July 19, 2021 Press Release - City of Norfolk, NE","","[""City of Norfolk, NE"", ""Police Division"", ""July 19, 2021 Press Release""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]" -2132,https://www.mass.gov/doc/draft-scope-of-work-2016-cd-debris-industry-study/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2133,http://www.longbeach.gov/police/press-releases/shooting-200-block-of-artesia/,Media Bulletins,200,Shooting 200 block of Artesia,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2134,https://coloradosprings.gov/police-department/article/news/traffic-fatality-woodman-road-and-campus,Media Bulletins,200,Traffic Fatality Woodman Road and Campus Drive | City of Colorado Springs,"","[""\nTraffic Fatality Woodman Road and Campus Drive\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -2135,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/080321summary.pdf,Daily Activity Logs,200,"","",[],[],[],[],[],[] -2136,http://www.longbeach.gov/police/press-releases/dui---driver-s-license-checkpoint-planned-this-weekend/,Media Bulletins,200,DUI - DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2137,https://alpha.austin.gov/police-oversight/formal-complaint-responsibility-to-know-and-compl-2/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2138,https://www.gurnee.il.us/government/departments/police-department/community-involvement/gurnee-citizen-police-academy/gurnee-citizen-police-academy/week-4,Media Bulletins,200," - Gurnee Citizen Police Academy -","","[""Police Department""]","[""Gurnee Citizen Police Academy"", ""Youth Citizen Police Academy""]","[""Now accepting applications for the Spring 2024 session!"", ""Click here to register for the Gurnee Citizen Police Academy"", ""Village Hall""]",[],[],[] -2139,https://www.roundrocktexas.gov/wp-content/uploads/2019/12/coffee_cop.png,Poor Data Source,200,"","",[],[],[],[],[],[] -2140,http://www.longbeach.gov/police/press-releases/robbery-suspect-arrested-and-charged-1-/,Media Bulletins,200,ROBBERY SUSPECT ARRESTED AND CHARGED(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2141,https://wyomingohio.gov/departments/police-department-2/commend-an-officer/,Poor Data Source,404,"","",,,,,, -2142,https://coloradosprings.gov/police-department/article/news/shooting-investigation-1800-block-monterey,Media Bulletins,200,Shooting Investigation 1800 Block Monterey Road | City of Colorado Springs,"","[""\nShooting Investigation 1800 Block Monterey Road\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -2143,https://police.birminghamal.gov/bureaus/support-operations/records/,Resources,200,Services | Birmingham Police Department,"","[""\n\n\n Birmingham Police Department\n\n\t\t\t\t\tCommitment | Excellence | Integrity\t\t\t\t\n\n""]","[""Putting People First"", ""Services""]",[],"[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[] -2144,https://norfolkne.gov/government/departments/police-division/press-releases/october-3rd-press-release-2022.html,Media Bulletins,200,"October 3rd Press Release 2022 - City of Norfolk, NE","","[""City of Norfolk, NE"", ""Police Division"", ""October 3rd Press Release 2022""]",[],[],[],"[""Still looking for something?""]","[""Contact Us"", ""Pay or Apply..."", ""Government..."", ""Services..."", ""Business..."", ""Amenities...""]" -2145,https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-53/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2146,http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-5-/,Media Bulletins,200,DUI-DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND(5),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2147,http://www.longbeach.gov/police/press-releases/robberymurder-investigation---1900-block-of-pacific-ave/,Media Bulletins,200,ROBBERY/MURDER INVESTIGATION - 1900 BLOCK OF PACIFIC AVE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2148,https://delcopa.gov/courts/familycourtadvisory.html,Resources,200,Family Law Advisory Council,"","[""Family Law Advisory Council""]",[],"[""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[] -2149,https://delcopa.gov/publicrelations/releases/18pdfs/18efilingprogramoct11.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2150,http://www.longbeach.gov/police/press-releases/traffic-fatality-7th-and-olive/,Media Bulletins,200,TRAFFIC FATALITY 7TH AND OLIVE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2151,https://www.antioch.il.gov/wpfb-file/11-07-16-police-and-fire-agenda-pdf-5/,Poor Data Source,200,"11-07-16 Police And Fire Agenda - Antioch, IL",11 07 16 police and fire agenda pdf commissions commission agendas 2016 2017 05 17 08 41 32 0000,"[""11-07-16 Police And Fire Agenda""]",[],[],[],[],[] -2152,https://sanramon.ca.gov/policenews,List of Data Sources,200," - Police News - City of San Ramon -","","[""Police News""]","[""Contact Us"", ""Useful Links""]","["">>>Read Archived Police News""]",[],[],[] -2153,https://spdblotter.seattle.gov/2015/06/19/police-sting-blackmailer-after-she-tries-to-extort-woman-over-lurid-cellphone-pics/,Media Bulletins,200,Police Sting Blackmailer After She Tries to Extort Woman Over Lurid Cellphone Pics - SPD Blotter,"","[""Police Sting Blackmailer After She Tries to Extort Woman Over Lurid Cellphone Pics""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -2154,https://www.dps.arkansas.gov/law-enforcement/arkansas-state-police/divisions/highway-patrol/troop-j-commander/,Personnel Records,200,Troop J Commander - Arkansas Department of Public Safety,"","["" Flag Status""]","[""Troop J Commander"", ""Contact ASP"", ""Helpful ASP links"", ""Connect with ASP"", ""Respect. Integrity. \nCUSTOMER SERVICE. TEAMWORK. \nSERVANT LEADERSHIP. \nCONTINUOUS IMPROVEMENT"", """", ""\u00a9 2024 All rights Reserved. Arkansas.gov ""]","[""Captain Kyle Drown""]",[],"[""About DPS"", ""DPS Links"", ""DPS Address"", ""Your Arkansas.gov"", ""Top Online Services"", ""Helpful Information""]",[] -2155,http://www.longbeach.gov/police/press-releases/click-it-or-ticket-campaign-starts-may-22/,Media Bulletins,200,CLICK IT OR TICKET CAMPAIGN STARTS MAY 22,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2156,http://lafayettepolice.us/735/youth-fire-setter-program,Not Criminal Justice Related,200,"Youth Fire Setter Program | Lafayette, IN - Official Website","The Youth Firesetting Program is a program designed to teach children and parents that matches and lighters are tools, not toys.","[""\r\n\r\nYouth Fire Setter Program\t\t""]",[],"[""Loading"", ""Contact Us"", ""Todd Trent"", ""Lafayette Fire Department"", ""Hours"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -2157,http://www.longbeach.gov/police/press-releases/murder-and-weapons-charges-filed-in-january-homicide/,Media Bulletins,200,MURDER AND WEAPONS CHARGES FILED IN JANUARY HOMICIDE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2158,https://estespark.colorado.gov/departments/police/support-services/auxiliary-unit,Training & Hiring Info,200,Auxiliary Unit | Town of Estes Park,"","[""\nAuxiliary Unit\n""]",[],"[""\n"", ""\nEstes Park Police Department Auxiliary Unit\n"", ""\n"", ""\n"", ""\n"", ""\nLanguage Translation\n""]",[],"[""Outstanding volunteers who contribute to a wonderful Town""]",[] -2159,http://www.longbeach.gov/police/press-releases/traffic-fatality--lb-blvd----market-street-/,Media Bulletins,200,Traffic Fatality (LB Blvd. & Market Street),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2160,http://www.paloshillspolice.us/wp-content/uploads/2017/02/bozen_17.jpg,Poor Data Source,404,"","",,,,,, -2161,http://www.longbeach.gov/police/press-releases/officerinvolvedshooting/,Media Bulletins,200,officerinvolvedshooting,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2162,https://champaignil.gov/tag/champaign-police-department-releases-holiday-traffic-enforcement-numbers/,Media Bulletins,200,Champaign Police Department releases holiday traffic enforcement numbers Archives - City of Champaign,"","[""Items tagged: Champaign Police Department releases holiday traffic enforcement numbers""]","[""Champaign Police Department releases holiday traffic enforcement numbers"", ""News Releases"", ""Department News""]",[],[],[],[] -2163,http://police.portlandmaine.gov/805/orders-as-passed-fiscal-year-2017-to-201,List of Data Sources,200,"Orders as Passed Fiscal Year 2017 to 2018 | Portland, ME - Official Website",View Orders as Passed in the Fiscal Year 2017 to 2018.,"[""Orders as Passed Fiscal Year 2017 to 2018""]",[],[],[],[],[] -2164,https://www.southamptontownnypolice.gov/faq.aspx?qid=452,Not Criminal Justice Related,200,FAQs • I am experiencing ePermitting problems such as upload,"",[],"[""\n\u25bc\r\nTrustees\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -2165,https://www.milpitas.gov/milpitas/departments/police/investigations/,Poor Data Source,404,"","",,,,,, -2166,https://police.birminghamal.gov/aboutfuture/,Contact Info & Agency Meta,200,About | Birmingham Police Department,"","[""\n\n\n Birmingham Police Department\n\n\t\t\t\t\tCommitment | Excellence | Integrity\t\t\t\t\n\n""]","[""Putting People First"", ""About""]",[],"[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[] -2167,https://coloradosprings.gov/police-department/page/police-blotter,Media Bulletins,200,Police Blotter | City of Colorado Springs,"","[""\nPolice Blotter \n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -2168,https://www.pinevillenc.gov/organizer/pineville-police-2/,Poor Data Source,200,"pineville police – Town of Pineville, NC","","[""Upcoming Events"", ""\n\t\tpineville police\t"", ""Town of Pineville Updates""]","[""Town of Pineville Contacts"", ""Important News & Updates"", ""Advisory Board Openings for Pineville Residents"", ""Pineville Community Meeting"", ""Property Tax Listings"", ""Follow Pineville on Facebook""]","[""Emergency: Police, Fire & Rescue"", ""Non-Emergency:"", ""Town Hall Mailing Address:"", ""Town Hall Physical Address:"", ""Town Hall Office Hours:""]",[],[],[] -2169,http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-7-/,Media Bulletins,200,DUI-DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND(7),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2170,http://police.byram-ms.us/bradford-place-auto-burglary/,Media Bulletins,200,Bradford Place Auto Burglary | Byram Police Department,"","[""Bradford Place Auto Burglary""]","[""Byram Weather""]","[""Post navigation"", ""Byram Police Department""]",[],[],[] -2171,https://delcopa.gov/publicrelations/releases/2022/pacareerlinkdelcohostsfreecareerworkshopthroughjune.html,Not Criminal Justice Related,200,"PA CareerLink® Delaware County Hosts Free Career Workshops April Through June - Delaware County, Pennsylvania","","[""PA CareerLink\u00ae Delaware County Hosts Free Career Workshops April Through June""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2172,http://www.longbeach.gov/police/press-releases/reward-issued-in-2014-case/,Media Bulletins,200,REWARD ISSUED IN 2014 CASE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2173,https://www.hayward-ca.gov/discover/news/may21/police-blotter-may-2-8-2021,Media Bulletins,200,"Police Blotter: May 2-8, 2021 | City of Hayward - Official website","STATISTICAL HIGHLIGHTSMay 2-8, 2021 Weekly Arrests (Includes cite/released):37 Homicide 0Weekly Calls for Service: 2,101 Assault—Great Bodily Injury 2Weekly Reports Taken:193 Burglary— Nonresidential 4Weekly Complaints(against HPD):0 Burglary—Residential 1Weekly Calls Received:5,541 Theft 18This data is subject to change and based on crimes that were reported to have occurred","[""Police Blotter: May 2-8, 2021""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form""]",[],"[""STATISTICAL HIGHLIGHTS"", ""May 2-8, 2021"", ""\u00a0"", ""\u00a0"", ""\u00a0 \u00a0\u00a0"", ""Significant Incidents"", ""Re-CAP: Hayward\u2019s Updated Climate Action Plan (CAP)"", ""Try induction cooking for free through Ava Community Energy\u2019s Induction Cooktop Lending Program!"", ""The City of Hayward\u2019s Fight Against Food Waste"", ""Decoding Plastic Recycling In California"", ""Keep Hayward Clean and Green with Adopt-A-Block!"", ""City Hall and Nonessential Services Closures: Monday, Feb 12 and Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""Library Closure January 15, 2024"", ""Library Closure: December 23 2023 - January 1 2024"", ""Library closure: November 23 - November 26, 2023."", ""YOU ARE HERE.SO IS EVERYTHING ELSE."", ""Related News"", ""Police Blotter: December 3-9, 2023"", ""Police Blotter - November 26-December 2, 2023"", ""Police Blotter - November 19-25, 2023"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -2174,https://www.knoxvilletn.gov/government/city_departments_offices/police_department/investigations_bureau/special_crimes_unit/domestic_violence_help,Resources,200," - Domestic Violence Help - City of Knoxville -",police*,"[""Domestic Violence Help"", ""Police Chief""]",[],[],[],[],[] -2175,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/042021blotter.pdf,Media Bulletins,200,"","",[],[],[],[],[],[] -2176,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2021_news_releases/police_announce_promotions,Media Bulletins,200," - Police Announce Promotions - Village of Pleasant Prairie -","",[],"[""Police Announce Promotions""]","[""Follow Us on Social Media""]",[],[],[] -2177,https://www.lynchburgvapolice.gov/wp-content/uploads/2021/06/lpd-seal-e1662580813573.png,Poor Data Source,404,"","",,,,,, -2178,https://www.knoxvilletn.gov/government/city_departments_offices/civil_service_department/how_to_apply_for_police,Training & Hiring Info,200," - How to Apply for Police Officer - City of Knoxville -",civil*,"[""How to Apply for Police Officer"", ""Civil Service Director""]","[""Civil Service is currently accepting applications for Police Officer Recruit, Lateral Entry Recruit, and Cadet!\n\nClick HERE to apply!""]","[""HERE""]",[],[],[] -2179,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/020921blotter.pdf,Media Bulletins,200,"","",[],[],[],[],[],[] -2180,https://delcopa.gov/planning/developmentreview.html,Not Criminal Justice Related,200,Development Review,"","[""Development Review""]",[],"[""I\u2019m interested in\u2026"", ""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2181,http://www.longbeach.gov/police/press-releases/murder-investigation---1400-blk-pacific-ave/,Media Bulletins,200,MURDER INVESTIGATION - 1400 BLK PACIFIC AVE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2182,https://www.ashevillenc.gov/news/asheville-police-urge-motorcycle-caution-on-town-mountain-road/,Media Bulletins,200,Asheville Police urge motorcycle caution on Town Mountain Road - The City of Asheville,"","[""Asheville Police urge motorcycle caution on Town Mountain Road""]",[],[],[],[],[] -2183,https://delcopa.gov/controller/pdf/unclaimed/unclaimedfundslist.pdf,Resources,200,"","",[],[],[],[],[],[] -2184,https://www.southamptontownnypolice.gov/faq.aspx?qid=288,Resources,200,FAQs • How do I contact the Bay Constable,"",[],"[""\n\u25bc\r\nTown Police\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -2185,http://www.longbeach.gov/police/press-releases/national-pharmaceutical-take-back-event/,Media Bulletins,200,NATIONAL PHARMACEUTICAL TAKE-BACK EVENT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2186,http://www.longbeach.gov/police/press-releases/police-seek-public-s-help-with-july-2014-murder-case--sketches-of-persons-of-interest-released/,Media Bulletins,200,POLICE SEEK PUBLIC'S HELP WITH JULY 2014 MURDER CASE; SKETCHES OF PERSONS OF INTEREST RELEASED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2187,https://pittsburghpa.gov/police/police-contacts,Poor Data Source,200,"","","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", """", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],[],[],[],[] -2188,http://www.longbeach.gov/police/about-the-lbpd/employment/join-lbpd/step-8/,Training & Hiring Info,200,Step 8: Medical Screening,"","[""Police Department""]","[""Step 8: Medical Screening""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""\r\n Contact Info:\r\n "", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[] -2189,http://www.longbeach.gov/police/press-releases/murder-1300-block-of-wesley-drive/,Media Bulletins,200,MURDER 1300 BLOCK OF WESLEY DRIVE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2190,https://controller.phila.gov/office-of-the-city-controller-announces-community-council-members-to-support-review-of-the-philadelphia-police-department/,Media Bulletins,200,Office of the City Controller Announces Community Council Members to Support Review of the Philadelphia Police Department - Office of the Controller,"","[""\n\t\t\t\t\t\t\tPress Releases\t\t\t\t\t\t"", ""Press Releases: Office of the City Controller Announces Community Council Members to Support Review of the Philadelphia Police Department""]","[""Main Navigation"", ""Post Metadata"", ""Press Releases Pagination"", ""Footer""]","[""Post Categories:"", ""Post Tags:"", ""Contact Information"", ""Quick Links"", ""Newsletter Signup"", ""Copyright Information"", ""Legal Links""]","[""Address""]",[],[] -2191,https://alpha.austin.gov/police-oversight/formal-complaint-arrest-requirement-for-assaultive-offenses-and-responsibility-to-know-and-comply/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2192,http://www.longbeach.gov/police/press-releases/police-seek-additional-indecent-exposure-victims/,Media Bulletins,200,POLICE SEEK ADDITIONAL INDECENT EXPOSURE VICTIMS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2193,https://www.prospertx.gov/residents/police/police-department/about-the-department/,Poor Data Source,404,"","",,,,,, -2194,https://www.antioch.il.gov/wpfb-file/04-10-12-police-pension-agenda-pdf-5/,Poor Data Source,200,"04-10-12 Police Pension Agenda - Antioch, IL",04 10 12 police pension agenda pdf commissions fund agendas 2012 2017 05 17 08 41 32 0000,"[""04-10-12 Police Pension Agenda""]",[],[],[],[],[] -2195,https://cheswold.delaware.gov/cheswold-police-department-yearly-traffic-statistics/march-2021-traffic-stop-report/,Annual & Monthly Reports,200,March 2021 - Traffic Stop Report - Town of Cheswold,"","[""Cheswold""]","[""Delaware"", ""March 2021 \u2013 Traffic Stop Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[] -2196,https://police.greenvillesc.gov/1719/internships,Resources,200,"Academic Internship and Research Program | Greenville, SC - Official Website",GPD offers internships to qualified students.,"[""\r\n\r\nAcademic Internship and Research Program\t\t""]","[""Internships""]","[""Loading"", ""Internship FAQs"", ""Contacts"", ""Internships""]",[],[],[] -2197,http://www.longbeach.gov/police/press-releases/murder-investigation4/,Media Bulletins,200,MURDER INVESTIGATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2198,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0714/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2199,https://coloradosprings.gov/police-department/article/news/update-officer-involved-shooting-hwy-115,Officer Involved Shootings,200,Update Officer Involved Shooting Hwy 115 and Fort Carson gate 2 | City of Colorado Springs,"","[""\nUpdate Officer Involved Shooting Hwy 115 and Fort Carson gate 2\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -2200,http://www.longbeach.gov/police/press-releases/pedestrian-safety-operation-a-success/,Media Bulletins,200,PEDESTRIAN SAFETY OPERATION A SUCCESS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2201,http://www.longbeach.gov/police/press-releases/l.b.p.d.-promotes-assistant-chief/,Media Bulletins,200,L.B.P.D. PROMOTES NEW ASSISTANT CHIEF,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2202,https://delcopa.gov/departments/parks/pdf/dogparkapplication.pdf,Resources,200,"","",[],[],[],[],[],[] -2203,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/blotter/010122blotter.pdf,Daily Activity Logs,200,"","",[],[],[],[],[],[] -2204,http://www.ryepolice.us/pressrelease/press-release-burglary-suspect,Media Bulletins,200,Rye Police Department Press Release - Burglary Suspect - Rye Police Department,"","[""Press Release - Burglary Suspect""]","[""Press Release \u2013 Burglary Suspect""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -2205,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/092722summary.pdf,Poor Data Source,404,"","",,,,,, -2206,https://www.coppelltx.gov/644/pay-bills-fines,Resources,200,"Pay Bills & Fines | Coppell, TX",Learn how to pay for utility bills and pay fines and citations.,"[""\r\n\r\nPay Bills & Fines\t\t""]",[],"[""Loading""]","[""\nPay Citation\n"", ""\nPay Tax Bill\n"", ""\nPay Water Bill\n""]",[],[] -2207,https://police.greenvillesc.gov/1865/credit-union,Not Criminal Justice Related,200,"My Account • Greenville, SC • CivicEngage","Engage your community – connect to news, events and information you care about.","[""Website Sign In""]","[""Sign In""]","[""Loading""]",[],[],[] -2208,http://www.lafayettepolice.us/826/fire-blocking,Not Criminal Justice Related,200,"Fire Blocking | Lafayette, IN - Official Website","In combustible construction, fire blocking shall be installed to cut off concealed draft openings (both vertical and horizontal) and shall form an effective barrier between floors, between a top story and a roof or attic space.","[""\r\n\r\nFire Blocking\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -2209,https://dccouncil.gov/donation-disclosures/copy-of-april-2019-donation-disclosures-2/,Policies & Contracts,200,Copy of April 2019 Donation Disclosures • Council of the District of Columbia,"","[""Copy of April 2019 Donation Disclosures""]",[],[],[],[],[] -2210,https://alpha.austin.gov/es/police-oversight/2020-06-4-15/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2211,https://www.lynchburgvapolice.gov/wp-content/uploads/2022/01/veh-3.jpg,Poor Data Source,404,"","",,,,,, -2212,https://www.cityofladue-mo.gov/departments/police-department/community/maps-167,Not Criminal Justice Related,200,Maps | City of Ladue,"","[""Maps""]","[""Upcoming Events""]",[],[],[],[] -2213,https://www.antioch.il.gov/wpfb-file/12-09-14-police-pension-agenda-pdf/,Poor Data Source,200,"12-09-14 Police Pension Agenda - Antioch, IL",8436 12 09 14 police pension agenda pdf commissions fund agendas 2014 1417450543 2a9c5dc94f4b22a9f99a6d66b140c03a 219x300 _cvau8geaxfzv thumb jpg 01 11 15 43 0 pdf application trustees dennis b crosby jay jozwiak mary c dominiak scott a pierce jerry t johnson ted p poulos lawrence m hanson mayor lori k folbrick village clerk agenda of antioch,"[""12-09-14 Police Pension Agenda""]",[],[],[],[],[] -2214,https://www.coppelltx.gov/592/hotel-occupancy-tax,Not Criminal Justice Related,200,"Hotel Occupancy Tax | Coppell, TX",The City of Coppell levies a tax rate of 7% on the cost of occupancy of any sleeping room furnished by any hotel where the cost of occupancy is at the rate of two dollars or more per day.,"[""\r\n\r\nHotel Occupancy Tax\t\t""]","[""People Who Must File a Hotel Occupancy Report"", ""When to File""]","[""Loading"", ""Holidays & Weekends"", ""Documents"", ""Contact Us"", ""Quick Links""]","[""Hotel Occupancy Tax""]",[],[] -2215,https://www.montgomeryohio.gov/meet-steve-coppel-a-diversity-inclusion-committee-member/steve-coppel/,Not Criminal Justice Related,200,"- Montgomery, Ohio","","[""""]","[""Primary menu links"", ""Action toolbar"", ""Recent news"", ""Welcome"", ""Engage"", ""Help"", ""Mental Health Resource""]","[""Unlimited Yard Waste Continues and Holiday Greenery Pick-up Begins"", ""2023 Landmark Ornament Now Available"", ""Mills-Reynolds Joins Montgomery City Council"", ""Three Montgomery City Council Members Sworn into New Terms of Office"", ""Thank you, Montgomery!""]",[],[],[] -2216,https://ci.guadalupe.ca.us/documents/police-officer/,Training & Hiring Info,200,"Police Officer – The City of Guadalupe, California","","[""Police Officer""]","[""Document Links"", ""Leaving our website"", ""Exiting our website""]",[],[],[],[] -2217,http://www.longbeach.gov/police/press-releases/undetermined-death-investigation3/,Media Bulletins,200,UNDETERMINED DEATH INVESTIGATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2218,https://barnegatpolice.us/download/field-check/,Field Contacts,200,Field Check - Barnegat Township Police Department,"","[""Field Check"", ""Field Check""]","[""Field Check""]","[""\n\t\t\t\t\t\tAbout the Author: \t\t\t\t\t\tBTPD ""]","[""Share This Story, Choose Your Platform!"", ""Resources"", ""Directions"", ""Quick Links""]",[],[] -2219,https://www.cityofpinebluff-ar.gov/copycred,Not Criminal Justice Related,200,"Accessibility, Copyrights, Credits & Privacy - City Of Pine Bluff","",[],"[""Accessibility, Copyrights, Credits & Privacy""]",[],[],[],[] -2220,https://delcopa.gov/publicrelations/releases/2021/whatvoterscanexpect.html,Not Criminal Justice Related,200,"What Delaware County Voters Can Expect on Election Day - Delaware County, Pennsylvania","","[""What Delaware County Voters Can Expect on Election Day""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2221,http://www.longbeach.gov/police/press-releases/five-cited-during-undercover-vice-operation/,Media Bulletins,200,FIVE CITED DURING UNDERCOVER VICE OPERATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2222,https://www.foxcrossingwi.gov/departments/police-department/resources/83-07_use-of-force/,Poor Data Source,200,83-07_Use of Force - Fox Crossing Fox Crossing,"","["""", """", ""83-07_Use of Force""]",[],[],[],[],[] -2223,http://www.longbeach.gov/police/press-releases/two-arrested--drugs--cash-and-guns-seized-in-connection-with-drug-trafficking/,Media Bulletins,200,"TWO ARRESTED; DRUGS, CASH AND GUNS SEIZED IN CONNECTION WITH DRUG TRAFFICKING","","[""Long BeachPolice Department""]",[],[],[],[],[] -2224,http://www.ryepolice.us/announcements/holiday-parade,Not Criminal Justice Related,200,Rye Police Department HoLiDaY PaRaDe!!!!!!! - Rye Police Department,"","[""HoLiDaY PaRaDe!!!!!!!""]","[""HoLiDaY PaRaDe!!!!!!!""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -2225,https://www.coronadelmar.us/gambler-left-puppy-in-hot-car-with-mouth-taped-shut-at-vegas-casino-police-say/,Media Bulletins,200,"Gambler left puppy in hot car with mouth taped shut at Vegas casino, police say | Corona del Mar California","","[""Gambler left puppy in hot car with mouth taped shut at Vegas casino, police say""]","[""Menu"", "" Be First to Comment"", ""Subscribe"", """", """"]","[""Share this:"", ""Like this:"", ""Related"", ""Leave a Reply Cancel reply"", """"]",[],[],[] -2226,https://delcopa.gov/vote/pdf/latecontributions_24hourreport.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2227,https://police.greenvillesc.gov/232/jury-duty,Not Criminal Justice Related,200,"Jury Duty | Greenville, SC - Official Website",Jurors for Greenville Municipal Court are randomly selected from a database that contains information from the South Carolina Election Commission and the South Carolina Highway Department. ,"[""\r\n\r\nJury Duty\t\t""]","[""Jury Selection"", ""Reporting for Jury Duty"", ""For More Information""]","[""Loading"", ""Contacts""]","[""\r\n\t\t\t\t\tPam Larson\r\n\t\t\t\t\t\r\n\t\t\t\t"", ""Municipal Court""]",[],[] -2228,https://brookfieldil.gov/publication/fire-and-police-commission-special-meeting-december-17-2015/,Poor Data Source,404,"","",,,,,, -2229,https://www.mass.gov/doc/2016-deputy-police-chief-employmentexperience-form-for-attleboro-examination-0/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -2230,https://www.warracres-ok.gov/police-department-history/warr-acres-old4/,Poor Data Source,200,Warr Acres OLD4 - City of Warr Acres,"","[""Warr Acres OLD4""]","[""Primary menu links"", ""Action toolbar"", ""Contact""]",[],[],"[""How do I reserve a park facility?""]",[] -2231,https://www.sandiego.gov/police/recruiting/contact/dispatch,Training & Hiring Info,200,Contact Police Dispatch | City of San Diego Official Website,"If you are interested in an application packet, or have questions about becoming a dispatcher, please complete the following contact form. This form is for Police Dispatch only. See Contact the SDPD Recruiting Unit for officer recruiting information and contact form. This form must be completed by a person eighteen years old or older.","[""City of San Diego Official Website"", ""Contact Police Dispatch\n""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", """", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -2232,https://www.eutawal.gov/news/national-police-week-2022/,Poor Data Source,200,National Police Week 2022 – The City of Eutaw Alabama,"","[""National Police Week 2022""]","[""Recent Posts"", ""Recent Comments"", ""Our Links"", ""Green County Links"", ""More Links..."", ""Gateway to the Black Belt \u00ae""]",[],"[""The City of Eutaw Alabama""]",[],[] -2233,https://www.coppelltx.gov/929/earthfest,Not Criminal Justice Related,200,"Earthfest | Coppell, TX",Celebrate EarthFest at the Biodiversity Education Center! EarthFest is a celebration of Coppell's commitment to the environment - an entertaining and educational experience! Visit environmental education booths to learn how you can lead a more sustainable lifestyle and explore Coppell Nature Park. ,"[""\r\n\r\nEarthfest\t\t""]",[],"[""Loading"", ""Saturday, April 20 \u2022 11 a.m. \u2013 1 p.m."", ""Activities"", ""Parking Information""]",[],[],[] -2234,https://police.greenvillesc.gov/427/minoritywoman-owned-business-enterprise-,Not Criminal Justice Related,200,"Minority/Woman-Owned Business Enterprise Program | Greenville, SC - Official Website","To promote free competition and equal opportunity, the City of Greenville is committed to assisting small, minority-owned and woman-owned businesses in becoming active vendors with the City of Greenville.","[""\r\n\r\nMinority/Woman-Owned Business Enterprise Program\t\t""]","[""About the Program"", ""City Policies"", ""Intent"", ""Definitions"", ""Preference in Scoring Proposals""]","[""Loading"", ""Contacts"", ""Quick Link""]","[""\r\n\t\t\t\t\tRod Gray\r\n\t\t\t\t\t\r\n\t\t\t\t"", ""Purchasing Division""]",[],[] -2235,https://police.bixbyok.gov/256/find-laws-pertaining-to-the-city-of-bixb,Not Criminal Justice Related,200,"Find Laws pertaining to the City of Bixby | Bixby Police Department, OK","","[""\r\n\r\nFind Laws pertaining to the City of Bixby\t\t""]",[],"[""Loading"", ""Helpful Links"", ""FAQs"", ""Site Links""]","[""\r\n\t\t\t\t\tBixby City Code\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tOklahoma State Statute\r\n\t\t\t\t""]",[],[] -2236,https://coloradosprings.gov/police-department/webform/chiefs-youth-advisory-council-application,Resources,200,Chief's Youth Advisory Council Application | City of Colorado Springs,"","[""\nChief's Youth Advisory Council Application\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -2237,https://coloradosprings.gov/police-department/article/news/traffic-fatality-marksheffel-road-and-0,Media Bulletins,200,Traffic Fatality: Marksheffel Road and Drennan Road | City of Colorado Springs,"","[""\nTraffic Fatality: Marksheffel Road and Drennan Road\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -2238,https://springfield-or.gov/event/springfield-police-advisory-committee-spac-13/,Not Criminal Justice Related,200,Springfield Police Advisory Committee (SPAC) - City of Springfield Oregon,"",[],"[""Springfield Police Advisory Committee (SPAC)""]","[""May 5, 2022 @ 6:00 pm - 7:30 pm"", ""Event Navigation""]","[""Share This Story, Choose Your Platform!"", "" Details "", "" Venue "", ""Organizer""]",[],[] -2239,http://www.longbeach.gov/police/press-releases/fumigation-burglaries/,Media Bulletins,200,FUMIGATION BURGLARIES,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2240,https://delcopa.gov/planning/pubs/openspaceplanvoliii.html,Not Criminal Justice Related,200,"Delaware County 2035 Open Space, Recreation, and Greenway Plan","","[""Volume III: CountyParks and Recreation Plan \n""]",[],"[""Planning Department Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2241,http://www.longbeach.gov/press-releases/city-manager-announces-potential-recruitment-process-for-police-chief/,Media Bulletins,200,City Manager Announces Potential Recruitment Process for Police Chief,"","[""PRESS RELEASE""]",[],[],[],[],[] -2242,http://www.longbeach.gov/police/press-releases/warrant--expungement-servicing-event/,Media Bulletins,200,WARRANT & EXPUNGEMENT SERVICING EVENT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2243,http://www.longbeach.gov/police/press-releases/police-seeking-the-public-s-help-with-identifying-armed-robbery-suspect-from-video/,Media Bulletins,200,POLICE SEEKING THE PUBLIC'S HELP WITH IDENTIFYING ARMED ROBBERY SUSPECT FROM VIDEO,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2244,http://www.longbeach.gov/police/press-releases/click-it-or-ticket-campaign-starts-may-21st/,Media Bulletins,200,CLICK IT OR TICKET CAMPAIGN STARTS MAY 21ST,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2245,http://www.longbeach.gov/police/press-releases/dui-checkpoint-proves-effective-2-/,Media Bulletins,200,DUI CHECKPOINT PROVES EFFECTIVE(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2246,http://www.longbeach.gov/police/press-releases/murder-200-block-of-liberty-court/,Media Bulletins,200,MURDER 200 BLOCK OF LIBERTY COURT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2247,http://www.longbeach.gov/police/press-releases/super-bowl-driving-impaired-enforcement/,Media Bulletins,200,SUPER BOWL IMPAIRED DRIVER ENFORCEMENT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2248,http://www.longbeach.gov/police/press-releases/murder-14-/,Media Bulletins,200,MURDER(14),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2249,http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-tomorrow/,Media Bulletins,200,DUI/DRIVERS LICENSE CHECKPOINT PLANNED TOMORROW,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2250,http://www.longbeach.gov/police/press-releases/click-it-or-ticket-campaign-begins-may-18th/,Media Bulletins,200,CLICK IT OR TICKET CAMPAIGN BEGINS MAY 18TH,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2251,http://www.longbeach.gov/police/press-releases/murder---3100-block-e-artesia-blvd/,Media Bulletins,200,MURDER,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2252,http://www.longbeach.gov/police/press-releases/traffic-fatality--ocean-blvd----710-transition-/,Media Bulletins,200,Traffic Fatality (Ocean Blvd. & 710 Transition),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2253,http://www.longbeach.gov/police/press-releases/traffic-fatality---obispo-ave-and-broadway/,Media Bulletins,200,TRAFFIC FATALITY - OBISPO AVE AND BROADWAY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2254,http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-this-weekend7/,Media Bulletins,200,DUI/DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2255,http://www.longbeach.gov/police/press-releases/dui-enforcement-operations-planned-this-weekend-6-/,Media Bulletins,200,DUI ENFORCEMENT OPERATIONS PLANNED THIS WEEKEND(6),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2256,http://www.longbeach.gov/police/press-releases/checkpoint/,Media Bulletins,200,CHECKPOINT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2257,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-nets-four-arrests/,Media Bulletins,200,DUI SATURATION PATROL NETS FOUR ARRESTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2258,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-proves-effective-6-/,Media Bulletins,200,DUI SATURATION PATROL PROVES EFFECTIVE(6),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2259,http://www.longbeach.gov/police/press-releases/traffic-fatality3/,Media Bulletins,200,Traffic Fatality (Carson & California),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2260,http://www.longbeach.gov/police/press-releases/charges-filed-against-three-suspects-for-brutal-crime/,Media Bulletins,200,CHARGES FILED AGAINST THREE SUSPECTS FOR BRUTAL CRIME,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2261,http://www.longbeach.gov/police/press-releases/distracting-driving-will-be-enforced/,Media Bulletins,200,Distracting Driving Will be Enforced,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2262,http://www.longbeach.gov/police/press-releases/robbery-suspects-arrestd-and-charged/,Media Bulletins,200,ROBBERY SUSPECTS ARRESTD and CHARGED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2263,http://www.longbeach.gov/police/press-releases/arrest-made-and-charges-filed-in-human-trafficking-of-a-minor-case/,Media Bulletins,200,ARREST MADE AND CHARGES FILED IN HUMAN TRAFFICKING OF A MINOR CASE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2264,http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-this-weekend4/,Media Bulletins,200,DUI/DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2265,http://www.longbeach.gov/police/press-releases/traffic-fatality-2-/,Media Bulletins,200,TRAFFIC FATALITY(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2266,http://www.longbeach.gov/police/press-releases/traffic-fatality-marina-dr---studebaker/,Media Bulletins,200,TRAFFIC FATALITY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2267,http://www.longbeach.gov/police/press-releases/bird-theft-suspect-arrested--two-others-remain-outstanding/,Media Bulletins,200,BIRD THEFT SUSPECT ARRESTED; TWO OTHERS REMAIN OUTSTANDING,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2268,http://www.longbeach.gov/police/press-releases/murder-1100-block-locust/,Media Bulletins,200,murder 1100 block locust,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2269,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-nets-five-arrests/,Media Bulletins,200,DUI SATURATION PATROL NETS FIVE ARRESTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2270,http://www.longbeach.gov/police/press-releases/frequently-requested-lbpd-policies-available-on-website/,Media Bulletins,200,Frequently Requested LBPD Policies Available on Website,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2271,http://www.longbeach.gov/police/press-releases/graduation-and-summer-break-safety-tips-1-/,Media Bulletins,200,GRADUATION AND SUMMER BREAK SAFETY TIPS(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2272,http://www.longbeach.gov/press-releases/long-beach-police-lieutenant-reunites-with-resident-he-helped/,Media Bulletins,200,Long Beach Police Lieutenant Reunites With Resident He Helped,"","[""PRESS RELEASE""]",[],[],[],[],[] -2273,http://www.longbeach.gov/police/press-releases/three-suspects-arrested-for-2013-murder/,Media Bulletins,200,THREE SUSPECTS ARRESTED FOR 2013 MURDER,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2274,https://www.coppelltx.gov/524/state-of-the-city,Not Criminal Justice Related,200,"State of the City | Coppell, TX",Check out the most recent Coppell State of the City address.,"[""\r\n\r\nState of the City\t\t""]","[""2022 State of the City"", ""The presentation included information about:""]","[""Loading""]",[],[],[] -2275,http://www.longbeach.gov/police/press-releases/motorcycle-safety-operation/,Media Bulletins,200,IMPROVING MOTORCYCLE SAFETY AIM OF LONG BEACH POLICE DEPARTMENT OPERATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2276,https://southamptontownnypolice.gov/faq.aspx?qid=299,Contact Info & Agency Meta,200,"FAQs • I want to build a dock off my property, what do I nee","",[],"[""\n\u25bc\r\nTrustees\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -2277,https://coloradosprings.gov/police-department/article/news/suspect-multiple-armed-robberies-arrested,Media Bulletins,200,Suspect in multiple armed robberies arrested | City of Colorado Springs,"","[""\nSuspect in multiple armed robberies arrested\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -2278,https://alpha.austin.gov/en/police-oversight/formal-complaints-opo-processed-on-june-5-purpose-and-scopecommunity-policing-and-other-policy-violations/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2279,http://www.longbeach.gov/police/press-releases/murder-investigation---1200-block-of-chestnut/,Media Bulletins,200,MURDER INVESTIGATION - 1200 BLOCK OF CHESTNUT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2280,https://www.desmoineswa.gov/departments/police/online_crime_reporting/spanish_online_police_reporting,Poor Data Source,200," - Spanish Online Police Reporting - City of Des Moines, WA -","","[""City of Des Moines, WA""]","[""Spanish Online Police Reporting""]",[],[],[],[] -2281,https://www.trinidad.co.gov/police-department,Poor Data Source,404,"","",,,,,, -2282,https://www.newcarrolltonmd.gov/government/departments/police_department/ncpd_news,List of Data Sources,404,"","",,,,,, -2283,http://lafayettepolice.us/616/commercial-kitchen-operations,Not Criminal Justice Related,200,"Commercial Kitchen Operations | Lafayette, IN - Official Website","If your business operates a commercial kitchen, you'll want to know these rules and regulations for equipment and facilities. ","[""\r\n\r\nCommercial Kitchen Operations\t\t""]","[""Commercial Kitchen Ventilation"", ""Exhaust Air\n"", ""Replacement Air"", ""Capture and Containment Of Vapors & Heat"", ""Exhaust System Components"", ""Capture & Containment"", ""Ventilation Performance Test"", ""Performance Evaluation"", ""Test Conditions"", ""Pre-Engineered Fire Suppression System""]","[""Loading"", ""\n"", ""Basic Commercial Kitchen"", ""New Construction"", ""Existing Systems"", ""Verification"", ""Final Report"", ""Standard"", ""Testing"", ""Contact Us"", ""Brian Alkire"", ""Fire Department"", ""Hours"", ""Quick Links"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -2284,http://www.longbeach.gov/police/press-releases/2014-robbery-victim-dies--reward-renewed/,Media Bulletins,200,2014 Robbery Victim Dies; Reward Renewed,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2285,http://www.longbeach.gov/police/press-releases/motorcycle-safety-is-aim-of-l-b-p-d--operation/,Media Bulletins,200,MOTORCYCLE SAFETY IS AIM OF L.B.P.D. OPERATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2286,http://www.longbeach.gov/police/press-releases/human-sex-trafficking-task-force-operation/,Media Bulletins,200,HUMAN SEX TRAFFICKING TASK FORCE OPERATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2287,http://www.longbeach.gov/police/press-releases/traffic-fatality-10-/,Media Bulletins,200,TRAFFIC FATALITY(10),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2288,http://www.longbeach.gov/police/press-releases/charges-filed-against-former-police-officer/,Media Bulletins,200,Charges Filed Against Former Police Officer,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2289,http://www.longbeach.gov/police/press-releases/critical-missing---beltran-carmelo/,Media Bulletins,200,"LOCATED: CRITICAL MISSING PERSON - BELTRAN, CARMELO","","[""Long BeachPolice Department""]",[],[],[],[],[] -2290,http://www.longbeach.gov/police/press-releases/update--excavation-to-be-conducted-in-missing-person-cold-case-investigation/,Media Bulletins,200,UPDATE: EXCAVATION TO BE CONDUCTED IN MISSING PERSON COLD CASE INVESTIGATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2291,http://www.longbeach.gov/police/press-releases/murder-1900-block-chestnut-ave/,Media Bulletins,200,MURDER 1900 block Chestnut Ave,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2292,http://www.longbeach.gov/police/press-releases/tailgates-being-targeted--community-encouraged-to-take-precautions/,Media Bulletins,200,TAILGATES BEING TARGETED; COMMUNITY ENCOURAGED TO TAKE PRECAUTIONS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2293,http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-14-/,Media Bulletins,200,DUI-Driver's License Checkpoint Planned this Weekend(14),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2294,http://www.longbeach.gov/police/press-releases/donut-boy-visits-l.b.p2.d/,Media Bulletins,200,DONUT BOY VISITS L.B.P.D,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2295,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-proves-effective-10-/,Media Bulletins,200,DUI SATURATION PATROL PROVES EFFECTIVE(10),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2296,http://www.longbeach.gov/police/press-releases/traffic-fatality---pacific-avenue-and-burnett-street/,Media Bulletins,200,TRAFFIC FATALITY - PACIFIC AVENUE AND BURNETT STREET,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2297,http://www.longbeach.gov/police/press-releases/long-beach-police-dui-checkpoint-proves-effective-2-/,Media Bulletins,200,LONG BEACH POLICE DUI CHECKPOINT PROVES EFFECTIVE(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2298,http://www.longbeach.gov/police/press-releases/human-trafficking-suspect-arrested/,Media Bulletins,200,HUMAN TRAFFICKING SUSPECT ARRESTED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2299,http://www.longbeach.gov/police/press-releases/halloween-safety-tips-2-/,Media Bulletins,200,HALLOWEEN SAFETY TIPS(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2300,http://www.longbeach.gov/police/press-releases/police-seek-additional-indecent-exposure-victims-1-/,Media Bulletins,200,POLICE SEEK ADDITIONAL INDECENT EXPOSURE VICTIMS(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2301,http://www.longbeach.gov/police/press-releases/publics-help-needed-to-identify-hit-and-run-suspects/,Media Bulletins,200,PUBLIC’S HELP SOUGHT IN IDENTIFYING HIT AND RUN SUSPECTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2302,http://www.longbeach.gov/police/press-releases/traffic-fatality-15-/,Media Bulletins,200,Traffic Fatality(15),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2303,http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-one-arrest2/,Media Bulletins,200,DUI CHECKPOINT NETS TWO ARRESTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2304,http://www.longbeach.gov/police/press-releases/arrest-made---charges-filed-in-2013-shooting-case/,Media Bulletins,200,ARREST MADE & CHARGES FILED IN 2013 SHOOTING CASE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2305,http://www.longbeach.gov/police/press-releases/winter-break-safety-tips-for-youth/,Media Bulletins,200,Winter Break Safety Tips for Youth,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2306,http://www.longbeach.gov/police/press-releases/police---fire-memorial-ceremony/,Media Bulletins,200,POLICE & FIRE MEMORIAL CEREMONY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2307,http://www.longbeach.gov/police/press-releases/murder-charges-filed/,Media Bulletins,200,MURDER CHARGES FILED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2308,http://www.longbeach.gov/police/press-releases/robbery-suspects-arrested-and-charged/,Media Bulletins,200,ROBBERY SUSPECTS ARRESTED AND CHARGED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2309,http://www.longbeach.gov/police/press-releases/murder2/,Media Bulletins,200,MURDER (HARBOR AVE & 15TH ST.),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2310,http://www.longbeach.gov/police/press-releases/traffic-fatality---cherry-and-carson/,Media Bulletins,200,TRAFFIC FATALITY - CHERRY and CARSON,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2311,http://www.longbeach.gov/police/press-releases/l-b-p-d--offers-holiday-safety-tips/,Media Bulletins,200,L.B.P.D. Offers Holiday Safety Tips,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2312,https://www.elburn.il.us/police-department/vacation-watch/,Poor Data Source,200,"Vacation Watch | Village of Elburn, Illinois","","[""Vacation Watch""]",[],[],"[""Vacation Watch""]","[""Links"", ""Main Contact Info"", ""Follow Us""]",[] -2313,https://www.foxcrossingwi.gov/departments/police-department/resources/vine/,Poor Data Source,200,vine - Fox Crossing Fox Crossing,"",[],"[""Resources \u00bb vine""]",[],[],[],[] -2314,https://spdblotter.seattle.gov/2021/10/03/driver-of-stolen-vehicle-arrested-after-ramming-police-cars-gas-station/,Media Bulletins,200,"Driver of Stolen Vehicle Arrested After Ramming Police Cars, Gas Station - SPD Blotter","","[""Driver of Stolen Vehicle Arrested After Ramming Police Cars, Gas Station""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -2315,https://spdblotter.seattle.gov/2011/06/14/anti-police-graffiti-incident/,Media Bulletins,200,Anti-Police Graffiti incident - SPD Blotter,"","[""Anti-Police Graffiti incident""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -2316,http://www.longbeach.gov/police/press-releases/arrests-made-in-the-kidnapping-murder-of-3-week-old-eliza-delacruz/,Media Bulletins,200,ARRESTS MADE IN THE KIDNAPPING-MURDER OF 3-WEEK-OLD ELIZA DELACRUZ,"","[""Long BeachPolice Department""]",[],"[""POSSIBLE MOTIVE FOR THE KIDNAPPING"", ""RECAP OF THE JANUARY 3, 2015 EVENTS"", ""CONNECTION TO AN EL SEGUNDO ASSAULT CASE"", ""RELEASE OF SKETCHES AND VIDEO LED TO TIPS"", ""PUBLIC\u2019S HELP SOUGHT"", ""THANK YOU""]",[],[],[] -2317,http://www.longbeach.gov/police/press-releases/don-t-be-a-victim-of-fraud-this-holiday-season/,Media Bulletins,200,DON'T BE A VICTIM OF FRAUD THIS HOLIDAY SEASON,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2318,http://www.longbeach.gov/police/press-releases/traffic-fatality---pacific-avenue-and-burnett-street/,Media Bulletins,200,TRAFFIC FATALITY - PACIFIC AVENUE AND BURNETT STREET,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2319,http://www.longbeach.gov/police/press-releases/students-return-to-school-motorists-urged-to-drive-carefully/,Media Bulletins,200,STUDENTS RETURN TO SCHOOL; MOTORISTS URGED TO DRIVE CAREFULLY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2320,http://www.longbeach.gov/press-releases/city-of-long-beach-initiates-outside-review-of-police-department-direct-messaging-application/,Media Bulletins,200,City of Long Beach Initiates Outside Review of Police Department Direct Messaging Application,"","[""PRESS RELEASE""]",[],[],[],[],[] -2321,http://www.longbeach.gov/police/press-releases/murder-investigation/,Media Bulletins,200,MURDER INVESTIGATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2322,http://www.longbeach.gov/police/press-releases/murder-investigation---2300-block-of-elm-avenue/,Media Bulletins,200,MURDER INVESTIGATION - 2300 BLOCK OF ELM AVENUE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2323,http://www.longbeach.gov/police/press-releases/critical-missing-person/,Media Bulletins,200,CRITICAL MISSING PERSON,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2324,http://www.longbeach.gov/police/press-releases/homicide-investigation/,Media Bulletins,200,HOMICIDE INVESTIGATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2325,http://www.longbeach.gov/police/press-releases/long-beach-police-investigate-attempt-murder-of-chp-officer-following-pursuit/,Media Bulletins,200,LONG BEACH POLICE INVESTIGATE ATTEMPT MURDER OF CHP OFFICER FOLLOWING PURSUIT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2326,http://www.longbeach.gov/police/press-releases/annual-police-and-fire-memorial-ceremony-will-include-addition-of-officer-william-h--waggoner/,Media Bulletins,200,ANNUAL POLICE AND FIRE MEMORIAL CEREMONY WILL INCLUDE ADDITION OF OFFICER WILLIAM H. WAGGONER,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2327,http://www.longbeach.gov/police/press-releases/traffic-fatality---lakewood-blvd-and-sb-405-fwy/,Media Bulletins,200,TRAFFIC FATALITY - LAKEWOOD BLVD AND SB 405 FWY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2328,http://www.longbeach.gov/police/press-releases/murder-600-block-burnett/,Media Bulletins,200,Murder 600 block Burnett,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2329,http://www.longbeach.gov/police/press-releases/l.b.p.d.-announces-appointment-of-new-commanders--changes-in-command-staff-assignments/,Media Bulletins,200,L.B.P.D. ANNOUNCES APPOINTMENT OF NEW COMMANDERS & CHANGES IN COMMAND STAFF ASSIGNMENTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2330,http://www.longbeach.gov/police/press-releases/five-cited-during-undercover-vice-operation/,Media Bulletins,200,FIVE CITED DURING UNDERCOVER VICE OPERATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2331,http://www.longbeach.gov/police/press-releases/traffic-fatality---woodruff-avenue--conant-street/,Media Bulletins,200,TRAFFIC FATALITY - WOODRUFF AVENUE & CONANT STREET,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2332,http://www.longbeach.gov/police/press-releases/murder-25-/,Media Bulletins,200,MURDER(25),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2333,http://www.longbeach.gov/police/press-releases/long-beach-police-announce-appointment-of-new-commander-and-assignment-of-next-west-division-commander/,Media Bulletins,200,LONG BEACH POLICE ANNOUNCE APPOINTMENT OF NEW COMMANDER AND ASSIGNMENT OF NEXT WEST DIVISION COMMANDER,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2334,http://www.longbeach.gov/police/press-releases/murder-investigation----1000-block-of-east-11th-street/,Media Bulletins,200,MURDER INVESTIGATION - 1000 BLOCK OF EAST 11TH STREET,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2335,http://www.longbeach.gov/police/press-releases/traffic-fatality---woodruff-avenue--conant-street/,Media Bulletins,200,TRAFFIC FATALITY - WOODRUFF AVENUE & CONANT STREET,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2336,http://www.longbeach.gov/press-releases/jason-campbell-appointed-police-administration-bureau-chief/,Media Bulletins,200,Jason Campbell Appointed Police Administration Bureau Chief,"","[""PRESS RELEASE""]",[],[],[],[],[] -2337,http://www.longbeach.gov/police/press-releases/officer-involved-shooting---2500-lb-blvd/,Media Bulletins,200,Officer Involved Shooting - 2500 LB Blvd,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2338,http://www.longbeach.gov/police/press-releases/traffic-fatality---willow-st.-and-golden-ave/,Media Bulletins,200,TRAFFIC FATALITY - WILLOW ST. AND GOLDEN AVE.,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2339,http://www.longbeach.gov/police/press-releases/critical-missing-person--douglas-grant/,Media Bulletins,200,CRITICAL MISSING PERSON- DOUGLAS GRANT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2340,http://www.longbeach.gov/police/press-releases/murder-investigation-market-st--orange-ave/,Media Bulletins,200,MURDER INVESTIGATION (MARKET ST & ORANGE AVE),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2341,http://www.longbeach.gov/police/press-releases/murder-36-/,Media Bulletins,200,MURDER(36),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2342,http://www.longbeach.gov/police/press-releases/improving-motorcycle-safety-aim-of-l-b-p-d--operation/,Media Bulletins,200,IMPROVING MOTORCYCLE SAFETY AIM OF L.B.P.D. OPERATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2343,http://www.longbeach.gov/police/press-releases/improving-motorcycle-safety-aim-of-operation/,Media Bulletins,200,IMPROVING MOTORCYCLE SAFETY AIM OF OPERATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2344,http://www.longbeach.gov/police/press-releases/lbpd-academy-graduation-ceremony/,Media Bulletins,200,LBPD ACADEMY GRADUATION CEREMONY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2345,http://www.longbeach.gov/police/press-releases/traffic-fatality-1900-block-pch/,Media Bulletins,200,TRAFFIC FATALITY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2346,http://www.longbeach.gov/press-releases/long-beach-police-department-south-division-to-host-open-house/,Media Bulletins,200,Long Beach Police Department South Division to Host Open House,"","[""PRESS RELEASE""]",[],[],[],[],[] -2347,http://www.longbeach.gov/police/press-releases/murder-investigation2/,Media Bulletins,200,MURDER INVESTIGATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2348,http://www.longbeach.gov/police/press-releases/traffic-fatality-artesia-and-myrtle/,Media Bulletins,200,TRAFFIC FATALITY ARTESIA AND MYRTLE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2349,http://www.longbeach.gov/police/press-releases/traffic-fatality---cherry-and-carson/,Media Bulletins,200,TRAFFIC FATALITY - CHERRY and CARSON,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2350,http://www.longbeach.gov/police/press-releases/traffic-fatality-8-/,Media Bulletins,200,TRAFFIC FATALITY(8),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2351,http://www.longbeach.gov/police/press-releases/murder-44-/,Media Bulletins,200,Murder(44),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2352,http://www.longbeach.gov/police/press-releases/charges-filed-in-murder-investigation/,Media Bulletins,200,CHARGES FILED IN MURDER INVESTIGATION,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2353,http://www.longbeach.gov/police/press-releases/murder-investigation---600-block-of-cedar-ave/,Media Bulletins,200,MURDER INVESTIGATION - 600 BLOCK OF CEDAR AVE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2354,http://www.longbeach.gov/police/press-releases/parents-arrested-for-murder-in-2013-suspicious-death-of-1-month-old-infant/,Media Bulletins,200,PARENTS ARRESTED FOR MURDER IN 2013 SUSPICIOUS DEATH OF 1-MONTH-OLD-INFANT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2355,http://www.longbeach.gov/police/press-releases/operation-results-in-multiple-arrests--confiscation-of-numerous-firearms/,Media Bulletins,200,OPERATION RESULTS IN MULTIPLE ARRESTS & CONFISCATION OF NUMEROUS FIREARMS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2356,http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-this-weekend3/,Media Bulletins,200,DUI/DRIVERS LICENSE CHECKPOINT PLANNED THIS WEEKEND,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2357,http://www.longbeach.gov/police/press-releases/assault-investigation-leads-to-firearm-discharge/,Media Bulletins,200,ASSAULT INVESTIGATION LEADS TO FIREARM DISCHARGE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2358,http://www.longbeach.gov/police/press-releases/traffic-fatality-shoreline-dr-and-710-fwy/,Media Bulletins,200,TRAFFIC FATALITY: SHORELINE DR AND 710 FWY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2359,http://www.longbeach.gov/police/press-releases/in-custody-death/,Media Bulletins,200,IN-CUSTODY DEATH,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2360,http://www.longbeach.gov/police/press-releases/publics-help-sought-in-indecent-exposure/,Media Bulletins,200,PUBLIC'S HELP SOUGHT IN INDECENT EXPOSURE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2361,https://delcopa.gov/treasurer/pdf/2021reassessmentvalues/36.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2362,https://www.mass.gov/doc/2017-police-officer-and-state-trooper-exam-poster/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -2363,https://coloradosprings.gov/mayors-office/article/news/mayor-and-police-statements-about-bailey-civil,Media Bulletins,200,Mayor and police statements about Bailey civil settlement | City of Colorado Springs,"","[""\nMayor and police statements about Bailey civil settlement\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -2364,http://www.lafayettepolice.us/493/sports-programs,Not Criminal Justice Related,200,"Sports Programs | Lafayette, IN - Official Website",Young people can choose from several different sports programs for fun and fitness. ,"[""\r\n\r\nSports Programs\t\t"", ""Winter 2024 Session\u00a0"", """", ""Fall 2024 Session\u00a0""]","[""NOTE: Due to the COVID-19 pandemic programs and events are subject to change based on local and state guidelines. McAllister Recreation Center will provide updates as they become available. Thank you.Youth Basketball"", ""Flag Football"", ""Summer and Fall Tennis""]","[""Loading"", ""2023 Information"", ""More Information"", ""Contact Us"", ""McAllister Recreation Center"", ""Hours"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -2365,https://www.newarknj.gov/resources/instructions-for-crane-or-helicopter-lift,Not Criminal Justice Related,200,Resources: Instructions for Crane or Helicopter Lift,"Official Page of Newark, NJ Resources: Instructions for Crane or Helicopter Lift","[""City of"", ""NEWARK"", ""City of"", ""NEWARK""]","[""Instructions for Crane or Helicopter Lift"", ""Mayor Ras j baraka""]",[],[],[],[] -2366,https://www.sandiego.gov/police/news-center/cold-cases/maria-cortes,Crime Maps & Reports,200,Maria Cortes | City of San Diego Official Website,"Maria Cortes was a Mexican national who worked as a housekeeper and child care provider. She had a two-year-old daughter named Briana. Those close to Cortes described her as a devoted mother and a hard worker, dedicated to making a better life for Briana and becoming a legal citizen herself. Cortes had no car and used buses for transportation, often riding two or more buses in one trip and sometimes walking alone at night to get home from work.","[""City of San Diego Official Website"", ""Cold Case: Maria Cortes\n""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""News Center"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -2367,https://delcopa.gov/publicrelations/releases/2018/18redribbonweek.html,Not Criminal Justice Related,200,"Public Relations - Delaware County, Pennsylvania","","[""Public Relations Releases""]",[],"[""Recognizing October 23-31 as Red Ribbon Week"", ""\n\n"", ""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2368,https://www.coppelltx.gov/953/lifelong-learning,Not Criminal Justice Related,200,"Lifelong Learning | Coppell, TX","Whether you want to learn a new hobby, start a career, or learn a new language, Lifelong Learning Databases are the best way to continue your education.","[""\r\n\r\nLifelong Learning\t\t""]","[""Database Password""]","[""Loading""]",[],[],[] -2369,https://wildwoodpolice-fl.gov/wpd-history/,Poor Data Source,200,WPD History - Wildwood Police,"","[""Wildwood PD History""]","[""Contact Information:""]",[],[],[],[] -2370,https://cityofsweetwater.fl.gov/event/sweetwater-police-pension-plan-board-of-trustees-meeting-3/,Not Criminal Justice Related,200,Agendas & Minutes - City of Sweetwater,"",[],"[""Agendas & Minutes""]","["""", ""Contact City Hall"", ""Office Hours""]",[],"[""Search Meeting Minutes, Agendas & Packets""]",[] -2371,https://www.mass.gov/doc/cancer-cervical-chicopee/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2372,https://dccouncil.gov/donation-disclosures/copy-of-august-2018-donation-disclosures-5/,Not Criminal Justice Related,200,Copy of August 2018 Donation Disclosures • Council of the District of Columbia,"","[""Copy of August 2018 Donation Disclosures""]",[],[],[],[],[] -2373,https://ose.louisiana.gov/event/police-lieutenant/,Poor Data Source,200,Police Lieutenant | Louisiana Office of State Examiner,"","["""", ""Police Lieutenant""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -2374,https://delcopa.gov/departments/pdfs/2020adoptedbudget.pdf,Annual & Monthly Reports,200,"","",[],[],[],[],[],[] -2375,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/arrests/082321arrests.pdf,Arrest Records,200,"","",[],[],[],[],[],[] -2376,https://www.mass.gov/letter-ruling/letter-ruling-81-13-printing-and-photocopying-equipment,Not Criminal Justice Related,200,Letter Ruling 81-13: Printing and Photocopying Equipment | Mass.gov,"Sales and Use Tax   February 2, 1981 ********** (**********""Center"") is a small printing and photocopying business. You inquire whether the ********** Center's purchase of the following equipment used in its printing operations is subject to the sales tax: (1) offset printing presses; (2) padding presses that bind cardboard or other backing to pads of paper; (3) folding machines; (4) machines used to staple booklets, brochures and the like; (5) collating machines; (6) paper-cutting machines; (7) paper drills; (8) joggers used to align sheets of paper into compact piles; (9) cameras used in plate-making; (10) light tables used for layout work and setting out printing jobs; and (11) typesetting machines. Massachusetts General Laws Chapter 64H, Section 6(r) exempts from sales taxation sales of materials, tools and fuel, or any substitute therefor, which are consumed and used directly and exclusively in an industrial plant in the actual manufacture of tangible personal property to be sold. Chapter 64H, Section 6(s) exempts from sales taxation sales of machinery or replacement parts thereof used directly and exclusively in an industrial plant in the actual manufacture, conversion or processing of tangible personal property to be sold. To be exempt, machinery must be (a) used solely during a manufacturing, conversion or processing operation 1. to effect a direct and immediate physical change upon tangible personal property to be sold; 2. to guide or measure a direct and immediate physical change upon such property where the guiding or measuring is an integral and essential part of tuning, verifying or aligning the parts of such property; or 3. to test or measure such property where the testing or measuring is an integral part of the production flow or function; or (b) used solely to 1. store; 2. transport or convey; or 3. handle such property during the operations listed in (a) above; or (c) used solely to place such property in the container, package or wrapping in which it is normally sold to the ultimate consumer. If machinery does not satisfy the above criteria, it is not exempt even if its operation, function or purpose is an integral or essential part of a continuous production flow or manufacturing process. Based on the foregoing, it is ruled that: (1) sales to the ********** Center of items (1) through (8) (the printing presses, padding presses, folding, stapling, collating and paper-cutting machines, paper drills and joggers) are exempt from tax; and (2) sales to the ********** Center of items (9) through (11) (the cameras used in platemaking, light tables and typesetting machines) are subject to tax. I am enclosing a copy of Regulation 830 CMR 64H.04. Very truly yours, /s/L. Joyce Hampers L. Joyce Hampers Commissioner of Revenue LJH:JXD:mf Enclosure LR 81-13","[""\nLetter Ruling\u00a0\n Letter Ruling 81-13: Printing and Photocopying Equipment\n ""]","[""Table of Contents"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -2377,https://www.mass.gov/doc/case-study-city-of-chicopee/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2378,http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-arrests/,Media Bulletins,200,DUI CHECKPOINT NETS ARRESTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2379,http://www.longbeach.gov/police/press-releases/murder-100-block-48th/,Media Bulletins,200,MURDER,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2380,http://www.longbeach.gov/police/press-releases/undetermined-death-investigation-1-/,Media Bulletins,200,UNDETERMINED DEATH INVESTIGATION(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2381,http://www.longbeach.gov/police/press-releases/traffic-fatality-clark-and-eagle/,Media Bulletins,200,TRAFFIC FATALITY CLARK AND EAGLE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2382,http://www.longbeach.gov/police/press-releases/murder-5400-block-atlantic/,Media Bulletins,200,MURDER 5400 BLOCK ATLANTIC,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2383,http://www.longbeach.gov/police/press-releases/l.b.p.d.-announces-appointment-of-new-commanders--changes-in-command-staff-assignments/,Media Bulletins,200,L.B.P.D. ANNOUNCES APPOINTMENT OF NEW COMMANDERS & CHANGES IN COMMAND STAFF ASSIGNMENTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2384,http://www.longbeach.gov/police/press-releases/undetermined-deaths-do-not-appear-related/,Media Bulletins,200,Undetermined Deaths Do Not Appear Related,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2385,http://www.longbeach.gov/police/press-releases/murder-investigation---800-block-of-alamitos-avenue/,Media Bulletins,200,MURDER INVESTIGATION - 800 BLOCK OF ALAMITOS AVENUE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2386,http://www.longbeach.gov/globalassets/police/media-library/images/press-releases/2016/thumb_halloween---kids-in-costume.png,Poor Data Source,200,City of Long Beach,"",[],"[""Page Not Found""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[] -2387,http://www.longbeach.gov/police/press-releases/missing-person---kylexia-newman/,Media Bulletins,200,MISSING PERSON - KYLEXIA NEWMAN,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2388,http://www.longbeach.gov/police/press-releases/dui-checkpoint-proves-effective-1-/,Media Bulletins,200,DUI CHECKPOINT PROVES EFFECTIVE(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2389,http://www.longbeach.gov/police/press-releases/traffic-fatality-22-/,Media Bulletins,200,TRAFFIC FATALITY(22),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2390,http://www.longbeach.gov/police/press-releases/felony-robbery-suspect-arrested/,Media Bulletins,200,FELONY ROBBERY SUSPECT ARRESTED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2391,http://www.longbeach.gov/police/press-releases/two-arrested---charged-in-two-shootings/,Media Bulletins,200,Two Arrested & Charged in Two Shootings,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2392,http://www.longbeach.gov/police/press-releases/---located---missing-3-week-old-infant-found-deceased-in-san-diego-county/,Media Bulletins,200,---LOCATED---MISSING 3-WEEK-OLD INFANT FOUND DECEASED IN SAN DIEGO COUNTY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2393,http://www.longbeach.gov/police/press-releases/murder-1300-block-wesley-dr/,Media Bulletins,200,Murder 1300 block Wesley Dr,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2394,http://www.longbeach.gov/police/press-releases/fatality-7-/,Media Bulletins,200,FATALITY(7),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2395,http://www.longbeach.gov/police/press-releases/publics-help-sought-in-locating-hit--run-suspect/,Media Bulletins,200,PUBLIC'S HELP SOUGHT IN LOCATING HIT & RUN SUSPECT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2396,http://www.longbeach.gov/police/press-releases/traffic-fatality-spring-street-west-of-el-dorado-park/,Media Bulletins,200,TRAFFIC FATALITY - Spring Street West of El Dorado Park,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2397,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-proves-effective-1-/,Media Bulletins,200,DUI SATURATION PATROL PROVES EFFECTIVE(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2398,http://www.longbeach.gov/police/press-releases/robbery-suspects-arrested-1-/,Media Bulletins,200,robbery suspects arrested(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2399,http://www.longbeach.gov/police/press-releases/murder-1300-block-of-pine/,Media Bulletins,200,MURDER 1300 BLOCK OF PINE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2400,http://www.longbeach.gov/police/press-releases/murder-28-/,Media Bulletins,200,MURDER(28),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2401,http://www.longbeach.gov/attorney/press-releases/court-dismisses-lawsuits-by-two-long-beach-police-officers-against-the-city-of-long-beach/,Media Bulletins,200,Court Dismisses Lawsuits by Two Long Beach Police Officers Against the City of Long Beach,"","[""Charles ParkinLong BeachCity Attorney""]",[],[],[],[],[] -2402,http://www.longbeach.gov/police/press-releases/fatality-3-/,Media Bulletins,200,FATALITY(3),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2403,http://www.longbeach.gov/police/press-releases/police-impersonator/,Media Bulletins,200,Police Impersonator,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2404,http://www.longbeach.gov/police/press-releases/publics-help-needed-to-identify-robbery-suspects/,Media Bulletins,200,PUBLIC’S HELP NEEDED TO IDENTIFY ROBBERY SUSPECTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2405,http://www.longbeach.gov/police/press-releases/traffic-fatality---ocean-blvd-and-ca-47/,Media Bulletins,200,TRAFFIC FATALITY - OCEAN BLVD AND CA-47,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2406,http://www.longbeach.gov/police/press-releases/arrest-made-in-sexual-assault-case-1-/,Media Bulletins,200,ARREST MADE IN SEXUAL ASSAULT CASE(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2407,http://www.longbeach.gov/police/press-releases/body-found-1000-block-of-w--carson-street/,Media Bulletins,200,BODY FOUND 1000 BLOCK OF W. CARSON STREET,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2408,http://www.longbeach.gov/police/press-releases/three-arrested-and-charged-with-murder/,Media Bulletins,200,THREE ARRESTED AND CHARGED WITH MURDER,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2409,http://www.longbeach.gov/police/press-releases/l.b.p.d-announces-appointment-of-new-commander/,Media Bulletins,200,L.B.P.D ANNOUNCES APPOINTMENT OF NEW COMMANDER & CHANGES IN COMMAND STAFF ASSIGNMENTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2410,http://www.longbeach.gov/police/press-releases/police-seek-public-s-help-to-identify-burglary-suspect/,Media Bulletins,200,POLICE SEEK PUBLIC'S HELP TO IDENTIFY BURGLARY SUSPECT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2411,http://www.longbeach.gov/police/press-releases/results-of-saturday-s-l-b-p-d--s-driving-under-the-influence-saturation-patrol/,Media Bulletins,200,Results of Saturday's L.B.P.D.'s Driving Under the Influence Saturation Patrol,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2412,http://www.longbeach.gov/attorney/press-releases/court-dismisses-lawsuits-by-two-long-beach-police-officers-against-the-city-of-long-beach/,Media Bulletins,200,Court Dismisses Lawsuits by Two Long Beach Police Officers Against the City of Long Beach,"","[""Charles ParkinLong BeachCity Attorney""]",[],[],[],[],[] -2413,http://www.longbeach.gov/police/press-releases/traffic-fatality-2200-block-of-golden-ave/,Media Bulletins,200,Traffic Fatality (2200 block of Golden Ave),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2414,http://www.longbeach.gov/police/press-releases/found---critical-missing-person----1-/,Media Bulletins,200,FOUND---CRITICAL MISSING PERSON---(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2415,http://www.longbeach.gov/police/press-releases/traffic-fatality--4th---obispo-/,Media Bulletins,200,TRAFFIC FATALITY (4th & Obispo),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2416,http://www.longbeach.gov/press-releases/long-beach-police-department-awarded-blue-line-security-contract/,Media Bulletins,200,Long Beach Police Department Awarded Blue Line Security Contract,"","[""PRESS RELEASE""]",[],[],[],[],[] -2417,http://www.longbeach.gov/police/press-releases/murder-22-/,Media Bulletins,200,Murder(22),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2418,http://www.longbeach.gov/police/press-releases/store-clerk-struck-by-gunfire-during-robbery--public-s-help-sought-to-identify-suspect/,Media Bulletins,200,STORE CLERK STRUCK BY GUNFIRE DURING ROBBERY; PUBLIC'S HELP SOUGHT TO IDENTIFY SUSPECT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2419,http://www.longbeach.gov/police/press-releases/officer-involved-shooting-4-/,Media Bulletins,200,OFFICER INVOLVED SHOOTING(4),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2420,http://www.longbeach.gov/police/press-releases/dui-enforcement-operation-planned-this-weekend/,Media Bulletins,200,DUI ENFORCEMENT OPERATION PLANNED THIS WEEKEND,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2421,http://www.longbeach.gov/police/press-releases/dui-checkpoint-planned-this-weekend-1-/,Media Bulletins,200,DUI CHECKPOINT PLANNED THIS WEEKEND(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2422,http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-this-weekend6/,Media Bulletins,200,DUI/DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2423,http://www.longbeach.gov/police/press-releases/dui-enforcement-operation-planned-for-long-beach-pride/,Media Bulletins,200,DUI ENFORCEMENT OPERATION PLANNED FOR LONG BEACH PRIDE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2424,http://www.longbeach.gov/police/press-releases/dui-checkpoint-2-/,Media Bulletins,200,DUI CHECKPOINT(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2425,http://www.longbeach.gov/press-releases/outside-review-of-police-department-direct-messaging-application-complete/,Media Bulletins,200,Outside Review of Police Department Direct Messaging Application Complete,"","[""PRESS RELEASE""]",[],[],[],[],[] -2426,http://www.longbeach.gov/police/press-releases/two-suspects-arrested-for-string-of-commercial-burglaries/,Media Bulletins,200,TWO SUSPECTS ARRESTED FOR STRING OF COMMERCIAL BURGLARIES,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2427,http://www.longbeach.gov/press-releases/long-beach-police-lieutenant-reunites-with-resident-he-helped/,Media Bulletins,200,Long Beach Police Lieutenant Reunites With Resident He Helped,"","[""PRESS RELEASE""]",[],[],[],[],[] -2428,http://www.longbeach.gov/police/press-releases/search-warrant-operation/,Media Bulletins,200,Search Warrant Operation,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2429,http://www.longbeach.gov/press-releases/long-beach-city-council-restores-paramedic-rescue-12--reinstates-police-academy-operations-with-measure-a-funding/,Media Bulletins,200,"Long Beach City Council Restores Paramedic Rescue 12, Reinstates Police Academy Operations with Measure A Funding","","[""PRESS RELEASE""]",[],[],[],[],[] -2430,http://www.longbeach.gov/police/press-releases/st-patricks-day-saturation-patrol/,Media Bulletins,200,"THIS ST. PATRICK’S DAY, PLAN BEFORE YOU PARTY!","","[""Long BeachPolice Department""]",[],[],[],[],[] -2431,http://www.longbeach.gov/police/press-releases/murder-1300-block-11th/,Media Bulletins,200,murder 1300 block 11th,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2432,https://www.southamptontownnypolice.gov/1767/liberty-gardens,List of Data Sources,200,"Liberty Gardens | Southampton, NY - Official Website","","[""\r\n\r\nLiberty Gardens\t\t""]",[],"[""Loading"", ""Site Tools"", ""Liberty Gardens (Revised FEIS)"", ""Contact Us"", ""Site Links""]","[""FEIS Liberty Gardens"", ""Plan"", ""Appendices"", ""DEIS Liberty Gardens"", ""Plan"", ""Appendices""]",[],[] -2433,http://www.longbeach.gov/police/press-releases/academy-graduation---class-90/,Media Bulletins,200,L.B.P.D. RECRUIT ACADEMY GRADUATION CEREMONY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2434,http://www.longbeach.gov/police/press-releases/operation-results-in-multiple-arrests--confiscation-of-numerous-firearms/,Media Bulletins,200,OPERATION RESULTS IN MULTIPLE ARRESTS & CONFISCATION OF NUMEROUS FIREARMS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2435,http://www.longbeach.gov/press-releases/richard-rocchi-appointed-deputy-police-chief/,Media Bulletins,200,Richard Rocchi Appointed Deputy Police Chief,"","[""PRESS RELEASE""]",[],[],[],[],[] -2436,http://www.longbeach.gov/police/press-releases/fatality-2-/,Media Bulletins,200,FATALITY(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2437,http://www.longbeach.gov/police/press-releases/lbpd-promotes-new-leaders/,Media Bulletins,200,LBPD PROMOTES NEW LEADERS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2438,http://www.longbeach.gov/police/press-releases/publics-help-sought-in-locating-hit--run-suspect/,Media Bulletins,200,PUBLIC'S HELP SOUGHT IN LOCATING HIT & RUN SUSPECT,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2439,http://www.longbeach.gov/police/press-releases/police-seek-public-s-help-to-identify-vehicle-theft-suspects/,Media Bulletins,200,POLICE SEEK PUBLIC'S HELP TO IDENTIFY VEHICLE THEFT SUSPECTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2440,http://www.longbeach.gov/police/press-releases/felony-suspects-arrested-and-charged/,Media Bulletins,200,FELONY SUSPECTS ARRESTED AND CHARGED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2441,http://www.longbeach.gov/police/press-releases/police-seek-help/,Media Bulletins,200,POLICE SEEK HELP,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2442,http://www.longbeach.gov/police/press-releases/traffic-fatality-6-/,Media Bulletins,200,TRAFFIC FATALITY(6),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2443,http://www.longbeach.gov/police/press-releases/arrest-made-in-sexual-assault-case/,Media Bulletins,200,ARREST MADE IN SEXUAL ASSAULT CASE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2444,http://www.longbeach.gov/police/press-releases/suspect-arrested-and-charged-for-1996-murder/,Media Bulletins,200,SUSPECT ARRESTED AND CHARGED FOR 1996 MURDER,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2445,http://www.longbeach.gov/police/press-releases/traffic-fatality---harvy-way-and-bellflower-blvd/,Media Bulletins,200,TRAFFIC FATALITY - HARVY WAY AND BELLFLOWER BLVD,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2446,http://www.longbeach.gov/police/press-releases/duidrivers-license-checkpoint-planned-this-weekend7/,Media Bulletins,200,DUI/DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2447,http://www.longbeach.gov/police/press-releases/arrest-made-and-charges-filed-in-july-4th-murder/,Media Bulletins,200,ARREST MADE AND CHARGES FILED IN JULY 4TH MURDER,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2448,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-nets-five-arrests/,Media Bulletins,200,DUI SATURATION PATROL NETS FIVE ARRESTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2449,http://www.longbeach.gov/police/press-releases/officer-involved-shooting--no-injuries-sustained/,Media Bulletins,200,OFFICER INVOLVED SHOOTING; NO INJURIES SUSTAINED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2450,http://www.longbeach.gov/police/press-releases/long-beach-police-inspect-37-businesses-for-alcohol-sales-compliance/,Media Bulletins,200,LONG BEACH POLICE INSPECT 37 BUSINESSES FOR ALCOHOL SALES COMPLIANCE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2451,https://coloradosprings.gov/police-department/page/report-traffic-complaint,Calls for Service,200,Report a Traffic Complaint | City of Colorado Springs,"","[""\nReport a Traffic Complaint\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -2452,http://www.longbeach.gov/press-releases/robert-g-luna-to-be-sworn-in-as-chief-of-police-for-city-of-long-beach-on-saturday-november-22/,Media Bulletins,200,Robert G Luna to be Sworn In as Chief of Police for City of Long Beach on Saturday November 22,"","[""PRESS RELEASE""]",[],[],[],[],[] -2453,http://www.longbeach.gov/police/press-releases/murder---6300-block-of-knight-avenue/,Media Bulletins,200,MURDER - 6300 BLOCK OF KNIGHT AVENUE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2454,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-results/,Media Bulletins,200,DUI SATURATION PATROL RESULTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2455,http://www.longbeach.gov/police/press-releases/the-north-patrol-division-directed-enforcement-team-cracks-down-on-criminal-street-gang/,Media Bulletins,200,THE NORTH PATROL DIVISION DIRECTED ENFORCEMENT TEAM CRACKS DOWN ON CRIMINAL STREET GANG,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2456,http://www.longbeach.gov/police/press-releases/police-asking-for-public-s-help-in-identifying-person-of-interest-in-sexual-battery/,Media Bulletins,200,POLICE ASKING FOR PUBLIC'S HELP IN IDENTIFYING PERSON OF INTEREST IN SEXUAL BATTERY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2457,http://www.longbeach.gov/police/press-releases/students-return-to-school--motorists-urged-to-drive-carefully/,Media Bulletins,200,STUDENTS RETURN TO SCHOOL; MOTORISTS URGED TO DRIVE CAREFULLY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2458,http://www.longbeach.gov/police/press-releases/drug-lab-discovered-at-residence--two-suspects-in-custody/,Media Bulletins,200,DRUG LAB DISCOVERED AT RESIDENCE; TWO SUSPECTS IN CUSTODY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2459,http://www.longbeach.gov/police/press-releases/officer-involved-shooting-1700-block-of-marine-avenu-wilmington/,Media Bulletins,200,Officer Involved Shooting 1700 block of Marine Avenu Wilmington,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2460,http://www.longbeach.gov/police/press-releases/murder-investigation---4th-street-and-pacific-avenue/,Media Bulletins,200,Murder Investigation - 4th Street and Pacific Avenue,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2461,http://www.longbeach.gov/police/press-releases/trafficfatality-2-/,Media Bulletins,200,TRAFFICFATALITY(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2462,http://www.longbeach.gov/police/press-releases/dui-driver-s-license-checkpoint-planned-this-weekend-7-/,Media Bulletins,200,DUI-DRIVER'S LICENSE CHECKPOINT PLANNED THIS WEEKEND(7),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2463,http://www.longbeach.gov/police/press-releases/search-and-rescue-orientation-meeting/,Media Bulletins,200,SEARCH AND RESCUE ORIENTATION MEETING,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2464,http://www.longbeach.gov/police/press-releases/l-b-p-d--saturation-patrol-proves-effective/,Media Bulletins,200,L.B.P.D. SATURATION PATROL PROVES EFFECTIVE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2465,http://www.longbeach.gov/police/press-releases/dui-drivers-license-checkpoint-planned-this-weekend/,Media Bulletins,200,DUI DRIVERS LICENSE CHECKPOINT PLANNED THIS WEEKEND,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2466,http://www.longbeach.gov/police/press-releases/robbery-suspects-arrested/,Media Bulletins,200,ROBBERY SUSPECTS ARRESTED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2467,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2017_archived_news/september_2017/national_night_out_arlington_police_on_oct_3_2017,Media Bulletins,200," - Ask Arlington: Enjoy National Night Out with Arlington Police on Oct. 3, 2017 - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Ask Arlington: Enjoy National Night Out with Arlington Police on Oct. 3, 2017""]",[],[],[],[] -2468,https://www.columbus.in.gov/event/columbus-police-review-board/,Poor Data Source,404,"","",,,,,, -2469,https://spdblotter.seattle.gov/2012/02/06/the-seattle-police-foundation-thanks-the-seattle-hotel-association-for-hosting-the-evening-of-hope-gala/,Media Bulletins,200,The Seattle Police Foundation thanks the Seattle Hotel Association for hosting the Evening of Hope gala - SPD Blotter,"","[""The Seattle Police Foundation thanks the Seattle Hotel Association for hosting the Evening of Hope gala""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -2470,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/arrests/081622arrests.pdf,Poor Data Source,404,"","",,,,,, -2471,https://alpha.austin.gov/en/police-oversight/oral-reprimand-of-officer-ivan-figueroa/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2472,https://www.orovalleyaz.gov/government/news/oro-valley-town-council-to-vote-on-police-chief-appointment-february-5,Media Bulletins,200,Oro Valley Town Council to vote on police chief appointment February 5 – Oro Valley | it's in our nature,"Today the Town of Oro Valley released its agenda for February 5, 2020, which includes as one of the Town Council’s items for business the appointment of Oro Valley Commander Kara M. Riley as its next police chief.","[""Oro Valley Town Council to vote on police chief appointment February 5""]",[],"[""OV 50th Anniversary Announcement"", ""Town of Oro Valley"", ""Connect with us""]",[],[],[] -2473,https://www.richmondindiana.gov/docs/current-city-police-districts-map,Geographic,200,Current City Police Districts Map,"","[""Documents, Forms, & Transactions""]","[""Current City Police Districts Map"", ""Stay Connected""]","[""""]","[""Due Date"", ""Contact"", ""City of Richmond""]",[],[] -2474,https://delcopa.gov/publicrelations/releases/2022/delcopollingplacesfinalizedformay17primary.html,Not Criminal Justice Related,200,"Delaware County Polling Places Finalized for the May 17 Primary Election - Delaware County, Pennsylvania","","[""Delaware County Polling Places Finalized for the May 17 Primary Election""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Only registered Republicans and Democrats may participate at this Primary"", ""Additional Resources: The Election Hotline, Voter Service Center and the Delco Votes! website""]",[],[] -2475,https://brookfieldil.gov/publication/42413-april-24-2013-police-pension-board/,Poor Data Source,404,"","",,,,,, -2476,https://ci.san-bernardino.ca.us/city_hall/police_department/crime_statistics/about_ucr_statistics/arson_statistics/arson_statistics-2018,Crime Statistics,200," - Arson Statistics - 2018 - City of San Bernardino -","","[""City of San Bernardino California""]","[""Arson Statistics - 2018""]",[],[],[],[] -2477,https://www.roseville.ca.us/news/archive_news/2017_archive_news/police_digest__december_15__2017,Poor Data Source,404,"","",,,,,, -2478,http://www.greenvillenc.gov/government/police/community-services-and-crime-prevention/cops-and-barbers,Contact Info & Agency Meta,200," - - Cops and Barbers | Greenville, NC - -","","[""Greenville, NC"", ""Cops and Barbers""]","[""Jump to subpage..."", ""Related Links""]",[],[],[],[] -2479,https://delcopa.gov/publicrelations/releases/2020/courtsgovcenter.html,Not Criminal Justice Related,200,Government Center Closed to the public on March 16/Limited Court Operations March 16 and 17,"","[""Government Center Closed to the public on March 16/Limited Court Operations March 16 and 17""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2480,https://coloradosprings.gov/police-department/article/news/homicide-investigation-6600-block-bugle-dr,Media Bulletins,200,Homicide Investigation: 6600 Block of Bugle Dr. | City of Colorado Springs,"","[""\nHomicide Investigation: 6600 Block of Bugle Dr.\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -2481,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0725/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2482,https://alpha.austin.gov/police-oversight/formal-complaint-de-escalation-of-potential-force-6/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2483,https://delcopa.gov/ems/pdfdocs/licensureprogramco/alsambulanceinspchklst.xls,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2484,https://www.woodvillageor.gov/departments/public-safety/police-law-enforcement/,Poor Data Source,404,"","",,,,,, -2485,https://www.madera.gov/home/departments/police/,Annual & Monthly Reports,200,Police Department - City of Madera,The Heart of California,"[""City of MaderaPolice Department""]","[""Department Overview"", ""Contact Information""]","[""Share this:""]",[],[],[] -2486,https://brookfieldil.gov/publication/11613-november-6-2013-fire-and-police-commission/,Poor Data Source,404,"","",,,,,, -2487,https://beaverpa.us/a-message-from-the-police-department-2/,Poor Data Source,404,"","",,,,,, -2488,https://delcopa.gov/ojs/ojsforms/15noticeofproposedrelocation.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2489,http://lafayettepolice.us/2359/brown-street,Not Criminal Justice Related,200,"Brown Street | Lafayette, IN - Official Website","","[""\r\n\r\nBrown Street\t\t""]","[""Brown Street Sewer""]","[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -2490,https://www.bedminster.us/police_fire_rescue/pottersville_volunteer_fire_co_,Not Criminal Justice Related,200," - Pottersville Volunteer Fire Co. - Township of Bedminster -","","[""Bedminster Township""]","[""Pottersville Volunteer Fire Co.""]","[""Bedminster Township""]",[],[],[] -2491,https://brookfieldil.gov/publication/043009-april-30-2009-police-pension-board/,Poor Data Source,404,"","",,,,,, -2492,https://www.goldenbeach.us/police-department/k-9-unit/,Contact Info & Agency Meta,200,k-9 Unit – Golden Beach: A Town Unlike Any Other,"","[""\r\n\t\t\t\t\t\t\tk-9 Unit\t\t\t\t\t\t""]",[],"[""Quick Links"", ""Documents"", ""About Golden Beach"", ""Phone Numbers"", ""Town Hall ""]","[""\nAnnual Report 2022\n"", ""\nAnnual Report 2021\n"", ""\nAnnual Report 2020\n"", ""\nAnnual report for 2019\n""]",[],[] -2493,https://www.wakeforestnc.gov/communications/town-news/police-news,Media Bulletins,200,"Police News | Town of Wake Forest, NC","","[""Police News""]","[""flag_raising_ceremony.jpg"", ""Search form"", ""You are here"", ""Pages""]","[""Crash causing delays along northbound Capital Boulevard/US 1"", ""WFPD & Torchy\u2019s Tacos partnering to support Special Olympics February 7"", ""Crash closes lanes along southbound Capital Boulevard/US 1"", ""Crash closes lanes along Dr. Calvin Jones Highway/NC 98 Bypass"", ""Raleigh man arrested for solicitation for murder"", ""Police Department warns residents about unapproved fundraising for USDSA"", ""Crash closes northbound Capital Boulevard/US 1"", ""Water main break along North Main Street/US 1A"", ""Traffic Alert \u2013 South Main Street/US 1A"", ""Raleigh Water closes portion of Elm Avenue""]",[],[],[] -2494,https://southbethany.delaware.gov/police-department/instruction-page-for-ticket-or-summons/,Poor Data Source,200,Instruction Page for Ticket or Summons - South Bethany,"","[""South Bethany""]","[""Instruction Page for Ticket or Summons""]","[""Menu""]",[],[],[] -2495,https://norfolkne.gov/assets/site/documentcentral/police/2021-daily-reports/summary/102521summary1.pdf,Crime Statistics,200,"","",[],[],[],[],[],[] -2496,https://www.roundrocktexas.gov/city-departments/police/divisions/,Contact Info & Agency Meta,200,Divisions - City of Round Rock,"","[""Divisions""]",[],"[""Community Affairs"", ""Office of the Chief"", ""Criminal Investigations Division"", ""Patrol Division"", ""Special Operations Division"", ""Training Division"", ""Support Services"", ""Round Rock Police Department""]","[""Site Search"", ""Follow Us""]",[],[] -2497,https://delcopa.gov/planning/pdf/agendas/2022/agenda202201.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2498,https://www.ci.northville.mi.us/services/police_department/police_news/joashua_clines_joins_police_dept_,Media Bulletins,200," - Joashua Clines joins Police Dept. - City of Northville, MI -",Officer Clines has a degree from Auburn University in his home state of Alabama but his true calling is serving as a police officer.,"[""Joashua Clines joins Police Dept.""]",[],[],[],[],[] -2499,https://southamptontownnypolice.gov/faq.aspx?qid=102,Not Criminal Justice Related,200,"FAQs • What land can be preserved through the TDR program, a","",[],"[""\n\u25bc\r\nTransfer of Development Rights\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -2500,https://www.ci.auburn.in.us/wp-content/uploads/2017/11/auburnpolicecar-1000x650.jpg,Poor Data Source,404,"","",,,,,, -2501,https://delcopa.gov/controller/pdf/retirement/2021/210310minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2502,https://www.hayward-ca.gov/discover/news/jun22/police-blotter-may-22-28-2022,Crime Statistics,200,"Police Blotter: May 22-28, 2022 | City of Hayward - Official website","STATISTICAL HIGHLIGHTSMay 22-28, 2022 Weekly Arrests (Includes cite/released):42 Homicide 0Weekly Calls for Service: 1,981 Assault—Great Bodily Injury 7Weekly Reports Taken:174 Burglary— Nonresidential 10Weekly Complaints(against HPD):1 Burglary—Residential 0Weekly Calls Received:5,537 Theft 19This data is subject to change and based on crimes that were reported to have","[""Police Blotter: May 22-28, 2022""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form""]",[],"[""STATISTICAL HIGHLIGHTS"", ""May 22-28, 2022"", ""\u00a0"", ""\u00a0"", ""\u00a0 \u00a0\u00a0"", ""Significant Incidents"", ""Re-CAP: Hayward\u2019s Updated Climate Action Plan (CAP)"", ""Try induction cooking for free through Ava Community Energy\u2019s Induction Cooktop Lending Program!"", ""The City of Hayward\u2019s Fight Against Food Waste"", ""Decoding Plastic Recycling In California"", ""Keep Hayward Clean and Green with Adopt-A-Block!"", ""City Hall and Nonessential Services Closures: Monday, Feb 12 and Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""Library Closure January 15, 2024"", ""Library Closure: December 23 2023 - January 1 2024"", ""Library closure: November 23 - November 26, 2023."", ""YOU ARE HERE.SO IS EVERYTHING ELSE."", ""Related News"", ""Police Blotter: December 3-9, 2023"", ""Police Blotter - November 26-December 2, 2023"", ""Police Blotter - November 19-25, 2023"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -2503,https://www.mass.gov/doc/camacho-michael-v-mass-environmental-police-1815/download,Court Cases,200,"","",[],[],[],[],[],[] -2504,https://camptonhills.illinois.gov/police-pension-fund-board/,Contact Info & Agency Meta,200,Police Pension Fund Board – Village of Campton Hills,"",[],"[""Police Pension Fund Board"", ""Purpose"", ""Board Members"", ""Daniel Hoffman"", ""Thomas L. Clark"", ""Randy Johnson"", ""Tom Blincoe"", ""William Mair \n"", ""\u00a9 2024 All Rights Reserved Village of Campton Hills.""]",[],"[""Police Pension Fund Meeting"", ""Recognition"", ""Follow Us"", ""Important Links"", ""Contact Us""]",[],[] -2505,https://beaumonttexas.gov/beaumont-police-arrest-a-man-and-woman-after-committing-an-aggravated-robbery-at-6155-eastex/,Poor Data Source,404,"","",,,,,, -2506,https://ci.san-bernardino.ca.us/city_hall/police_department/sb_978/new_patrol_rifle_powerpoint_complete,Policies & Contracts,200,"","",[],[],[],[],[],[] -2507,https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-47/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2508,https://coloradosprings.gov/police-department/page/professional-standards-division,Poor Data Source,403,"","",,,,,, -2509,https://delcopa.gov/courts/admininstration/lap.html,Contact Info & Agency Meta,200,Language Access Plan - Delaware County Court of Common Pleas,"","[""Language Access Plan""]",[],"[""\u00a0"", ""Court Administration Navigation"", ""Contact Us"", ""Courts Quick Links"", ""Government Center Quick Links"", ""About Delaware County""]",[],[],[] -2510,https://www.foxcrossingwi.gov/event/police-fire-commission/,Poor Data Source,200,Police & Fire Commission - Fox Crossing Fox Crossing,"","["""", """", ""Police & Fire Commission""]","[""mtg05-19-2015pol&fire""]",[],[],[],[] -2511,https://southamptontownnypolice.gov/1387/final-supplemental-geis,Not Criminal Justice Related,200,"FINAL Supplemental GEIS | Southampton, NY - Official Website","","[""\r\n\r\nFINAL Supplemental GEIS\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]",[],[],[] -2512,http://www.lafayettepolice.us/438/online-crime-reporting,Contact Info & Agency Meta,200,"Online Crime Reporting | Lafayette, IN - Official Website",Our goal is to provide you with an easy to use tool for reporting crime in the City of Lafayette.,"[""\r\n\r\nOnline Crime Reporting\t\t""]","["""", ""Instructions & Information About Your Online Report""]","[""Loading"", ""Reports Not Accepted With This Form"", ""Reporting Categories"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -2513,https://delcopa.gov/publicrelations/releases/2019/newvotingsystem.html,Not Criminal Justice Related,200,"Delaware County Council Approves purchase of New Voting System - Delaware County, Pennsylvania","","[""Delaware County Council Approves purchase of New Voting System""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Council unanimously votes to purchase Hart Verity 2.3.4 Voting System""]",[],[] -2514,https://delcopa.gov/purchasing/bidsprops/cadserver_e-102121.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2515,https://scrantonpa.gov/wpdm-package/police-union-collective-bargaining-agreement-exp-2021/,Poor Data Source,404,"","",,,,,, -2516,http://www.longbeach.gov/police/press-releases/shooting-200-block-of-artesia/,Media Bulletins,200,Shooting 200 block of Artesia,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2517,https://www.danversma.gov/documents/records-and-billings-clerk-police-department/,Poor Data Source,404,"","",,,,,, -2518,https://beaumonttexas.gov/beaumont-police-detectives-charge-2-in-august-25-2021-homicide-aggravated-robbery/,Poor Data Source,404,"","",,,,,, -2519,https://health.wyo.gov/publichealth/immunization/influenza-flu/stethoscope-3/,Not Criminal Justice Related,404,"","",,,,,, -2520,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0348/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2521,http://lafayettepolice.us/1086/i-want-to,Not Criminal Justice Related,200,"I Want To... | Lafayette, IN - Official Website","","[""\r\n\r\nI Want To...\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]","[""\r\n\t\t\t\t\t...book a birthday party\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t...find out more about camps and classes\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t...schedule a tour\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t...find out more about school visits\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t...become a member\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t...volunteer at the zoo\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t...find out about special events\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t...reserve a picnic shelter\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t...get information about the water park\r\n\t\t\t\t""]",[],[] -2522,https://police.bixbyok.gov/224/submit-a-tip,Contact Info & Agency Meta,200,"Submit a Tip | Bixby Police Department, OK",If you observe an emergency or crime in progress please call 911 or contact Bixby Communications Non-Emergency number 918-366-8294.,"[""\r\n\r\nSubmit a Tip\t\t""]","[""Suspicious Activities & Tips"", ""Or""]","[""Loading"", ""Metro Crime Stoppers App"", ""National Center for Missing & Exploited Children (NCMEC)"", ""Federal Bureau of Investigations"", ""Oklahoma Information Fusion Center (OIFC)"", ""Helpful Links"", ""FAQs"", ""Site Links""]",[],[],[] -2523,https://www.deerpark-oh.gov/departments/police-department/police-department-contacts/,Contact Info & Agency Meta,200,Departments - Police Department - Police Department Contacts | City of Deer Park,"","[""Police Department Contacts""]",[],"[""E-Mail List""]","[""Police Officers work odd hours and have other obligations such as court appearances\u00a0or training that can make contacting them difficult.""]",[],[] -2524,https://delcopa.gov/planning/pdf/mapping/eddystone.pdf,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2525,https://www.coppelltx.gov/1054/special-interest-funding,Poor Data Source,404,"","",,,,,, -2526,https://norfolkne.gov/assets/site/documentcentral/police/2022-daily-reports/summary/043022summary.pdf,Poor Data Source,404,"","",,,,,, -2527,https://delcopa.gov/council/2018minutes/080818minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2528,https://delcopa.gov/planning/pdf/agendas/2019/agenda201910.pdf,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2529,https://delcopa.gov/courts/index.html,Resources,200,Delaware County Court of Common Pleas,"",[],"[""Delaware County court of common pleas:""]","[""Juror eResponse"", ""E-Filing"", ""Magisterial District Judges"", ""Domestic Relations"", ""Second Chance Court"", ""Pennsylvania\u2019s Unified Judicial System"", ""Employment Opportunities"", ""Notice to the Public"", ""Updates:"", ""Emergency Orders:"", ""Contact Us"", ""Court Quick Links: \n"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2530,https://www.mass.gov/doc/2022-police-sergeant-3yp-442-exam-poster/download,Training & Hiring Info,200,"","",[],[],[],[],[],[] -2531,https://www.southamptontownnypolice.gov/faq.aspx?qid=126,Not Criminal Justice Related,200,FAQs • Does the Town of Southampton have a community advocac,"",[],"[""\n\u25bc\r\nCommunity Services\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -2532,https://delcopa.gov/publicrelations/releases/2018/18spottedlanternfly.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2533,https://www.southamptontownnypolice.gov/faq.aspx?qid=120,Not Criminal Justice Related,200,FAQs • What is my assessment based on?,"",[],"[""\n\u25bc\r\nAssessor\u2019s Office\t\t""]","[""Loading"", ""Site Tools"", ""Categories"", ""Live Edit"", ""Contact Us"", ""Site Links""]",[],[],[] -2534,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0442/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -2535,https://mukilteowa.gov/news/mukilteo-police-department-public-safety-community-survey/,Media Bulletins,200," - City of Mukilteo - | Mukilteo Police Department Public Safety Community Survey - City of Mukilteo ","","[""\n\t\t Mukilteo Police Department Public Safety Community Survey\t\t ""]","[""\n\t\t\t\t\t\tSign up for notifications\n\t\t\t\t\t""]","[""""]",[],[],[] -2536,http://www.lafayettepolice.us/771/tactical-rescue-team,Contact Info & Agency Meta,200,"Tactical Rescue Team | Lafayette, IN - Official Website","The Tactical Rescue Team is highly trained in rope rescue, confined space rescue, trench rescue and structural collapse.","[""\r\n\r\nTactical Rescue Team\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -2537,https://hutchinsonmn.gov/departmentsfacilities/police-services/annual-report/,Annual & Monthly Reports,200,"","",[],[],[],[],[],[] -2538,https://alpha.austin.gov/police-oversight/formal-complaint-purpose-and-scope-impartial-attitude-and-courtesy-secure-and-identify-witnesses-and-other-policy-violations/,Complaints & Misconduct,200,Maintenance Notice,"",[],[],[],[],[],[] -2539,https://www.southamptontownnypolice.gov/1370/2020-budgets,List of Data Sources,200,"2020 Budgets | Southampton, NY - Official Website","","[""\r\n\r\n2020 Budgets \t\t""]",[],"[""Loading"", ""Site Tools"", ""2020 Budget"", ""Contact Us"", ""Site Links""]","[""\r\n\t\t\t\t\t2020 Adopted Budget - Capital\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t2020 Adopted Budget - Operating\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t2020 Tentative Budget - Operating\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t2020 Tentative Budget - Capital\r\n\t\t\t\t""]",[],[] -2540,https://www.coppelltx.gov/1083/sunshine-room,Not Criminal Justice Related,200,"Sunshine Room | Coppell, TX","","[""\r\n\r\nSunshine Room\t\t""]","[""Hours"", ""Pricing"", ""Policies""]","[""Loading""]",[],[],[] -2541,https://www.jacksontn.gov/government/departments/police/command_staff/captain_jeff_shepard,Personnel Records,200," - Captain Jeff Shepard - City of Jackson, TN -",Welcome to the official website of City of Jackson in Tennessee.,"[""City of Jackson TN"", ""City of Jackson TN""]","[""Captain Jeff Shepard""]",[],[],[],[] -2542,https://www.antioch.il.gov/wpfb-file/12-06-14-police-and-fire-agenda-pdf-3/,Poor Data Source,200,"12-06-14 Police And Fire Agenda - Antioch, IL",9050 12 06 14 police and fire agenda pdf commissions commission agendas 2014 1417710895 78bd0244bc4e662012baf7d5e1f731d0 219x300 _g9ufrmyiaujy thumb jpg 04 11 34 55 0 pdf application trustees dennis b crosby jay jozwiak mary c dominiak scott a pierce jerry t johnson ted p poulos lawrence m hanson mayor lori k folbrick village clerk notice of,"[""12-06-14 Police And Fire Agenda""]",[],[],[],[],[] -2543,https://delcopa.gov/treasurer/propertyassessment.html,Not Criminal Justice Related,200,"Property Assessment - Delaware County, Pennsylvania","","[""Property Assessment""]",[],"[""Treasurer Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2544,https://delcopa.gov/ojs/ojsforms/rulesconfidentiality.pdf,Records Request Info,200,"","",[],[],[],[],[],[] -2545,https://virginiabeach.gov/whats-up/whats-new/commonwealth-v-jasper-miles-wynn-60-years-to-serve-for-shooting-at-police-following-7-eleven-robbery,Not Criminal Justice Related,404,"","",,,,,, -2546,http://www.ryepolice.us/chief/attachment/chiefphoto,Poor Data Source,200,Rye Police Department Chief Kevin Walsh - Rye Police Department,"","[""Chief Kevin Walsh""]","[""Chief Kevin Walsh""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -2547,https://police.greenvillesc.gov/faq.aspx?qid=213,Not Criminal Justice Related,200,FAQs • Can other people operate under my license?,"",[],"[""\n\u25bc\r\nBusiness Licenses - General\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -2548,https://www.stpaul.gov/news/mayor-melvin-carter-statement-saint-paul-police-officer-involved-shooting-midway-neighborhood,Media Bulletins,200,Mayor Melvin Carter Statement on Saint Paul Police Officer-Involved Shooting in Midway Neighborhood | Saint Paul Minnesota,"FOR IMMEDIATE RELEASE September 15, 2019","[""\nMayor Melvin Carter Statement on Saint Paul Police Officer-Involved Shooting in Midway Neighborhood\n""]","[""Main Navigation"", ""Popular Topics"", ""Footer""]","[""\n You are using an unsupported browser. Please use Microsoft Edge.\n "", ""\n Contact The City\n "", ""Email Us"", ""Call 651-266-8989""]","[""Business Spotlight"", ""Featured"", ""Business Spotlight"", ""Featured""]",[],[] -2549,http://www.lafayettepolice.us/753/process-overview,Not Criminal Justice Related,200,"Process Overview | Lafayette, IN - Official Website",General building plan review is initiated through the City's Engineering Department.,"[""\r\n\r\nProcess Overview\t\t""]","[""Additional Information""]","[""Loading"", ""Quick Links"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -2550,https://alpha.austin.gov/en/police-oversight/formal-complaint-responsibility-to-know-and-comply-and-ot/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2551,https://www.foxcrossingwi.gov/departments/police-department/resources/tmpd-burg-prev-pers-safe-home-svc-safe/,Poor Data Source,200,Home Safety - Fox Crossing Fox Crossing,"","["""", """", ""Home Safety""]",[],[],[],[],[] -2552,https://www.memphistn.gov/government/city-court-clerk/ticket-prices/ridgeway-police-station/,Poor Data Source,404,"","",,,,,, -2553,https://www.coppelltx.gov/417/investigations-division,Contact Info & Agency Meta,200,"Investigations and Administration Division | Coppell, TX",The Investigations Division is comprised of nine sworn personnel and one civilian. These officers staff the Criminal Investigations Unit and the Proactive Criminal Enforcement (PACE) Unit. Criminal Investigations personnel also handle the registration of convicted sex offenders and provide coordination for the local Crime Stoppers program.,"[""\r\n\r\nInvestigations and Administration Division\t\t""]","[""Professional Standards"", ""Training"", ""North Texas Emergency Communications Center"", ""Responsibilities""]","[""Loading"", ""Detective Duties"", ""Contact Us""]","[""Police Department""]",[],[] -2554,https://delcopa.gov/ich/resources/covid19/businesspresentation.html,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2555,https://delcopa.gov/planning/pubs/osrgp/vol-iii_chapter3glenprovidencecountypark.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2556,https://spdblotter.seattle.gov/2017/06/07/police-seize-two-guns-arrest-wanted-felon/,Media Bulletins,200,"Police Seize Two Guns, Arrest Wanted Felon - SPD Blotter","","[""Police Seize Two Guns, Arrest Wanted Felon""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -2557,https://chandlerazpd.gov/2019/12/chandler-police-investigate-animal-cruelty/,Media Bulletins,200,Chandler Police Investigate Animal Cruelty – Chandler Police Department,"","[""Chandler Police Investigate Animal Cruelty""]",[],"[""Quick Links"", ""News Archives"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n"", ""\n\n\n\n""]","[""\n\n\t\tDecember 17, 2019\t\n"", "" Contact"", "" About the Department"", "" Latest News"", ""\n Courage, Pride, Dedication\n \n \u00a9 2024 Chandler Police Department \n""]",[],[] -2558,https://www.hayward-ca.gov/discover/news/apr21/police-blotter-april-18-24-2021,Annual & Monthly Reports,200,"Police Blotter: April 18-24, 2021 | City of Hayward - Official website","STATISTICAL HIGHLIGHTSapril 18-24, 2021 Weekly Arrests (Includes cite/released):23 Homicide 0Weekly Calls for Service: 1,864 Assault—Great Bodily Injury 2Weekly Reports Taken:183 Burglary— Nonresidential 3Weekly Complaints(against HPD):0 Burglary—Residential 4Weekly Calls Received:5,064 Theft 23This data is subject to change and based on crimes that were reported to have","[""Police Blotter: April 18-24, 2021""]","[""Look Deeper"", ""Welcome home"", ""Where opportunity lives"", ""Find what you need. Fast."", ""Working for You"", ""Your Hayward Environment"", ""You are here. So is everything else."", ""Search form""]",[],"[""STATISTICAL HIGHLIGHTS"", ""april 18-24, 2021"", ""\u00a0"", ""\u00a0"", ""\u00a0 \u00a0\u00a0"", ""Significant Incidents"", ""Re-CAP: Hayward\u2019s Updated Climate Action Plan (CAP)"", ""Try induction cooking for free through Ava Community Energy\u2019s Induction Cooktop Lending Program!"", ""The City of Hayward\u2019s Fight Against Food Waste"", ""Decoding Plastic Recycling In California"", ""Keep Hayward Clean and Green with Adopt-A-Block!"", ""City Hall and Nonessential Services Closures: Monday, Feb 12 and Monday, Feb. 19"", ""City Hall and Nonessential Services Closure: Monday, Jan. 15, 2024"", ""Library Closure January 15, 2024"", ""Library Closure: December 23 2023 - January 1 2024"", ""Library closure: November 23 - November 26, 2023."", ""YOU ARE HERE.SO IS EVERYTHING ELSE."", ""Related News"", ""Police Blotter: December 3-9, 2023"", ""Police Blotter - November 26-December 2, 2023"", ""Police Blotter - November 19-25, 2023"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -2559,https://spdblotter.seattle.gov/2022/07/18/police-arrest-security-guard-in-capitol-hill-after-he-fights-stabs-trespasser/,Media Bulletins,200,"Police Arrest Security Guard in Capitol Hill After He Fights, Stabs Trespasser - SPD Blotter","","[""Police Arrest Security Guard in Capitol Hill After He Fights, Stabs Trespasser""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -2560,https://www.hayward-ca.gov/police-department/crime-prevention/hate-crimes,Contact Info & Agency Meta,200,Protecting yourself and others from hate crimes | City of Hayward - Official website,"Hate crime or hate incident? It is important to know the difference between a hate crime and a hate incident. A hate incident is an action or behavior motivated by hate but legally protected by the First Amendment right to freedom of expression. Examples of hate incidents include: name-calling, insults, distributing hate material in public places, and displaying hate material",[],"[""Protecting yourself and others from hate crimes"", ""You are here. So is everything else."", ""Search form""]",[],"[""How to spot a hate crime:"", ""If you are a hate crime victim, you should:\u00a0"", ""What you and your community can do:\u00a0"", ""Where to find help:\u00a0"", ""Receive crime bulletins and alerts"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -2561,https://alpha.austin.gov/es/police-oversight/notice-of-complaint-related-to-2022-0487/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2562,http://police.portlandmaine.gov/596/winter-operations,Not Criminal Justice Related,200,"Winter Operations | Portland, ME - Official Website","During the winter months, the Public Works Dispatch office is open 24 hours a day and crews are assigned to shifts to respond 24/7 to weather events. ","[""Winter Operations""]",[],[],[],[],[] -2563,http://www.ryepolice.us/logs/police-logs-12-15-21-12-21-21,Daily Activity Logs,200,Rye Police Department Police Logs 12/15/21-12/21/21 - Rye Police Department,"","[""Police Logs 12/15/21-12/21/21""]","[""Police Logs 12/15/21-12/21/21""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -2564,https://roxburynj.us/721/how-do-i-obtain-a-police-report,Records Request Info,200,"How do I obtain a police report | Township of Roxbury, NJ - Official Website","","[""\r\n\r\nHow do I obtain a police report\t\t""]",[],"[""Loading""]",[],[],[] -2565,https://www.milpitas.gov/milpitas/departments/police/department-training/,Poor Data Source,404,"","",,,,,, -2566,https://detroitmi.gov/departments/police-department/dpd-surveillance-technology-reports-documents,List of Data Sources,200,DPD Surveillance Technology Reports & Documents | City of Detroit,"This technology aims to detect outdoor audible gunfire within the coverage area using acoustic sensors capable of pinpointing the accurate location of a gunfire event. This technology is used to address crime in real-time and support criminal investigations. The contents of the Surveillance Technology Reports shall reflect the full and accurate proposed use of surveillance technology submitted.  The Surveillance Technology Report shall be a publicly released report, written by the requesting agency or, in the case of the Police Department, in conjunction with the Board of Police Commissioners. Below are Technology Specification Reports, relevant department and City Council documents, and other supplemental materials pertaining to the use of Surveillance Technology.   Community Input Over Government Surveillance Ordinance CIOGS Ordinance Surveillance Technology Specification Reports Gunshot Detection Spec Report Gunshot Detection Spec Report Update 12/15/22 Proper use of the Gunshot Detection System System Policy Manual Board of Police Commissioners' Letter of Support BOPC Shotspotter Letter        ","[""\nDPD Surveillance Technology Reports & Documents\n""]","[""Top Links"", ""Site Menu"", ""Documents""]",[],[],"[""\u00a0"", ""Community Input Over Government Surveillance Ordinance"", ""Surveillance Technology Specification Reports"", ""Proper use of the Gunshot Detection System"", ""Board of Police Commissioners' Letter of Support"", ""Gunshot Detection Spec Report Update 12/15/22"", ""BOPC Shotspotter Letter of Support"", ""Gunshot Detection System Policy"", ""Surveillance Technology Specification Reports"", ""Community Input Over Governmental Surveillance Ordinance""]",[] -2567,https://www.sandiego.gov/police/services/child-abuse,Resources,200,Child Abuse | City of San Diego Official Website,"","[""City of San Diego Official Website"", ""Child Abuse""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Report Child Abuse or Welfare Concerns for a Child"", ""Types of Child Abuse"", ""Signs of Child Abuse"", ""Services"", ""Footer""]","[""Physical Abuse"", ""Sexual Abuse"", ""Emotional Abuse"", ""Neglect""]","[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -2568,https://www.southbendin.gov/transparency-and-performance/police-transparency-hub/sbpd-compliments-and-complaints-data/,Complaints & Misconduct,200,"SBPD Compliments, Complaints & Investigations Data - South Bend, Indiana","","[""SBPD Compliments, Complaints & Investigations Data""]","[""INTERACTIONS, COMPLAINTS, AND INVESTIGATIONS DASHBOARD"", ""COMMENDATIONS DATA"", ""MAPS"", ""FEATURED UPDATES""]","[""PAGE NAVIGATION"", ""PAGE DESCRIPTION"", ""EXTERNAL LINKS"", ""ACCESS OUR POLICE INTERACTIONS DATASETS BELOW!"", ""COMPLAINTS INVESTIGATION PROCESS"", ""WANT TO DOWNLOAD THE POLICE COMMENDATIONS DATASET?"", ""USE OF FORCE DATA STORY"", ""USE OF FORCE INCIDENTS"", ""WANT TO DOWNLOAD THIS DATASET?"", ""MORE"", ""HAVE FEEDBACK FOR THE TRANSPARENCY HUB?"", ""How was your experience?"", ""Mobile Navigation Menu"", ""WELCOME TO THE CITY OF SOUTH BEND\u2019S NEW WEBSITE"", ""311 SERVICE CENTER"", ""CONNECT WITH ELECTED OFFICIALS"", ""PAY BILLS ONLINE"", ""TRASH INFORMATION"", ""VENUES PARKS & ARTS"", ""PROVIDE FEEDBACK"", ""YOU\u2019RE READY!""]","[""\n\n\t\t\tCommend an Officer \t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\n"", ""\n\n\t\t\tSubmit a Complaint \t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\n"", ""\n\n\t\t\tCommunity Complaints Dataset\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\n"", ""\n\n\t\t\tAdministrative Complaints Dataset \t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\n"", ""\n\n\t\t\tUse of Force Dataset \t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\n"", ""\n\n\t\t\tOfficer Commendations Data\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\n"", ""\n\n\t\t\tHistoric Use of Force Data \t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\n"", ""\n\n\t\t\tUse of Force Incidents Data \t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\n"", ""Guided Tour of South Bend\u2019s Updated Police Dashboards"", ""Board of Public Safety to Hold Next Community Action Group Meeting"", ""Data\u00a0+ Context: Police Recruiting"", ""CONNECT"", ""My Government"", ""311 Service Portal""]","[""Take Action"", ""Service""]",[] -2569,https://barnegatpolice.us/download/codis-dna-refusal-form/,Not Criminal Justice Related,200,CODIS DNA Refusal Form - Barnegat Township Police Department,"","[""CODIS DNA Refusal Form"", ""CODIS DNA Refusal Form""]","[""CODIS DNA Refusal Form""]","[""\n\t\t\t\t\t\tAbout the Author: \t\t\t\t\t\tBTPD ""]","[""Share This Story, Choose Your Platform!"", ""Resources"", ""Directions"", ""Quick Links""]",[],[] -2570,https://www.antioch.il.gov/wpfb-file/15th-annual-cop-on-a-rooftop-pdf-5/,Poor Data Source,200,"15th Annual Cop On A Rooftop - Antioch, IL",12394 15th annual cop on a rooftop pdf event documents 2017 1625759862 c7a316267c0d0b6566d1247ef084b811 6856f29d7d85b040bd885ac821c6b27744cff50498d6594f14313bd982958634 232x300 _xzk2g0n3rtby thumb jpg 05 17 08 41 37 0 66 249 64 156 2021 06 21 11 40 20 pdf application num_pages pagefailed_1 pagefailed_2 pagefailed_3 pagefailed_4 pagefailed_5 pagefailed_6 pagefailed_7 pagefailed_8 pagefailed_9 pagefailed_10 pagefailed_11 pagefailed_12 pagefailed_13 pagefailed_14 pagefailed_15 pagefailed_16 pagefailed_17 pagefailed_18,"[""15th Annual Cop On A Rooftop""]",[],[],[],[],[] -2571,https://champaignil.gov/2015/05/01/champaign-police-arrest-armed-robbery-suspect/,Media Bulletins,200,Champaign Police Arrest Armed Robbery Suspect - City of Champaign,"","[""Champaign Police Arrest Armed Robbery Suspect""]","[""News Releases"", ""Department News""]",[],[],[],[] -2572,https://police.greenvillesc.gov/430/historical-archives,List of Data Sources,200,"Historical Archives | Greenville, SC - Official Website",View past mayors and City Councils who have served the City of Greenville.,"[""\r\n\r\nHistorical Archives\t\t""]",[],"[""Loading""]","[""\n175th Anniversary Brochure (PDF)\n"", ""\nCity Council Archives\n"", ""\nMayor Archives\n""]",[],[] -2573,https://delcopa.gov/vote/pdf/2020/brdmeetinglegalnotice_09172020.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2574,https://delcopa.gov/publicrelations/releases/2019/chronicdiseaseselfmanagement.html,Not Criminal Justice Related,200,"Self-Manage Your Chronic Diseases for a Better Life! - Delaware County, Pennsylvania","","[""Self-Manage Your Chronic Diseases for a Better Life!""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2575,https://www.mass.gov/doc/2014-reading-list-for-brookline-police-sergeant-lieutenant-and-captain-promotional-examinations/download,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2576,https://detroitmi.gov/departments/police-department/detroit-rewards-tv/about-rewards-tv,Not Criminal Justice Related,200,About Rewards TV | City of Detroit,"The purpose of Rewards TV is simply to empower our community to report criminal activity. The website and television program both focus on major crimes and provide financial incentives to community members who speak up. The show will feature the victim’s family members, detective interviews, and exclusive surveillance video that will help solve the case. Cash Reward Guidelines To be eligible for a Detroit Rewards TV cash reward, a tip must be received through the Crime Stoppers 1-800-SPEAK UP (1-800-773-2587) hotline, web, or text message. These forms of communication are available 24 hours a day 7 days a week. When a tipster calls this number they are given a secret identification number only known by the tipster and the Call Center.  The tipster is advised not to share this number with anyone other than the call Center dispatcher or staff members from Crime Stoppers. Tipsters are also asked by the Call Center dispatcher if they provided this information to law enforcement. If the tipster answers this question with a yes it will be noted on the tip sheets and the tipster will be advised to call staff members from Crime Stoppers for an update. Crime Stoppers staff members will advise all tipsters concerning the status and their eligibility for a reward based on their tip information. Tipsters are only eligible for a reward if: They provide this information first to Detroit Rewards TV and not Law Enforcement. Their tip must move the case forward When a Crime Stopper staff members receive a disposition sheet from the law enforcement agency/department indicating that the tip they reviewed led to either of the above requirements then a reward may be justified unless the tipster provided this information to Law Enforcement first. If a reward is granted by members of the Detroit Rewards TV Selection Committee the tipster will call utilizing their secret number to be guided on the retrieving of their reward. ","[""\u00a0DetroitRewards.tv\u00a0"", ""\nAbout Rewards TV\n""]","[""Top Links"", ""Site Menu"", ""Cash Reward Guidelines""]",[],[],[],[] -2577,https://delcopa.gov/planning/pdf/demodata/populationchange2010-2020.pdf,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2578,https://council.seattle.gov/2012/02/27/seattle-police-department-is-hiring-police-officers/,Media Bulletins,200,Seattle Police Department is hiring police officers - Seattle City Council Blog,"","[""Seattle Police Department is hiring police officers""]",[],"[""HELPFUL LINKS"", ""Make your voice heard"", ""Councilmembers""]",[],[],[] -2579,https://police.greenvillesc.gov/faq.aspx?qid=131,Resources,200,FAQs • Why did I receive this charge?,"",[],"[""\n\u25bc\r\nMunicipal Court - General Legal Questions\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -2580,https://ose.louisiana.gov/event/police-lieutenant-44/,Poor Data Source,200,Police Lieutenant | Louisiana Office of State Examiner,"","["""", ""Police Lieutenant""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -2581,http://police.portlandmaine.gov/278/safety-tips,Not Criminal Justice Related,200,"Safety Tips | Portland, ME - Official Website",Go over documents related to Safety Tips.,"[""Safety Tips""]",[],[],[],[],[] -2582,https://police.greenvillesc.gov/faq.aspx?qid=591,Not Criminal Justice Related,200,FAQs • What are the Greenville Water Splash Pad hours?,"",[],"[""\n\u25bc\r\nUnity Park Open\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -2583,http://www.longbeach.gov/police/press-releases/traffic-fatality-shoreline-dr-and-710-fwy/,Media Bulletins,200,TRAFFIC FATALITY: SHORELINE DR AND 710 FWY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2584,http://www.longbeach.gov/police/press-releases/dui-enforcement-operations-planned-this-weekend-2-/,Media Bulletins,200,DUI ENFORCEMENT OPERATIONS PLANNED THIS WEEKEND(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2585,http://beaverpolice.us/wp-sitemap-posts-ai1ec_event-1.xml,List of Data Sources,200,"","",[],[],[],[],[],[] -2586,https://coloradosprings.gov/police-department/article/news/homicide-investigation-2001-e-platte-ave,Media Bulletins,200,Homicide Investigation 2001 E Platte Ave | City of Colorado Springs,"","[""\nHomicide Investigation 2001 E Platte Ave\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -2587,http://www.longbeach.gov/police/press-releases/traffic-fatality-21-/,Media Bulletins,200,Traffic Fatality(21),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2588,https://oceancitymd.gov/oc/ocean-city-police-investigating-fatal-pedestrian-collision/,Media Bulletins,200,"Ocean City Police Investigating Fatal Pedestrian Collision – Town of Ocean City, Maryland","",[],"[""Post navigation""]","[""Related posts""]",[],[],[] -2589,https://www.sandiego.gov/department-document/police-chief-recruitment-process-update-august-22-2017,Training & Hiring Info,200,"Police Chief Recruitment Process - Update (August 22, 2017) | City of San Diego Official Website","","[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Police Chief Recruitment Process - Update (August 22, 2017)"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -2590,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2016_archived_news/december_2016/volunteer_for_arlington_police_department_s_dog,Not Criminal Justice Related,200," - Volunteer for Arlington Police Department’s Dog Walker Watch Program - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Volunteer for Arlington Police Department\u2019s Dog Walker Watch Program""]",[],[],[],[] -2591,https://alpha.austin.gov/en/police-oversight/notice-of-complaint-related-to-2022-0721/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2592,http://www.longbeach.gov/police/press-releases/officer-involved-shooting3/,Media Bulletins,200,OFFICER INVOLVED SHOOTING,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2593,http://www.longbeach.gov/police/press-releases/traffic-fatality---lakewood-blvd-and-sb-405-fwy/,Media Bulletins,200,TRAFFIC FATALITY - LAKEWOOD BLVD AND SB 405 FWY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2594,https://www.wakeforestnc.gov/police/public-information,Resources,200,"Public Information | Town of Wake Forest, NC","News MediaTown of Wake Forest Communications & Public Affairs Director Bill Crabtree serves as the news media's main point of contact for the Wake Forest Police Department. We are committed to ensuring that the public is informed with current and accurate information about the Wake Forest Police Department's activities, strategies, and policies. We believe that transparency is","[""Public Information""]","[""seminary2.jpg"", ""Search form"", ""You are here""]","[""News Media"", ""AMBER Alert"", ""Firing Range"", ""News Releases\u00a0"", ""Paying Parking Tickets"", ""Police to Citizen (P2C)"", ""Precious Metals Permits\u00a0"", ""Property Collection\u00a0"", ""Silver Alert\u00a0"", ""Urban Archery Application"", ""Application for Permit to Sell or Solicit""]",[],[],[] -2595,https://www.arlingtontx.gov/news/my_arlington_t_x/news_archive/2017_archived_news/march_2017/february_2017_arlington_police_community,Media Bulletins,200," - February 2017 Arlington Police Community Newsletter Available - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""February 2017 Arlington Police Community Newsletter Available""]",[],[],[],[] -2596,http://www.tampa.gov/news/tampa-police-investigate-shooting-genesee-st-76411,Media Bulletins,200,Tampa Police Investigate Shooting on Genesee St | City of Tampa,"At 3:00 PM Friday afternoon, Tampa Police responded to the report of gunshots in the 3400 block of E. Genesee St.  Officers arrived to find an adult male victim, who was transported to a nearby hospital, listed in stable condition. Anyone with information is asked to contact Crimestoppers of Tampa Bay at 800.873.TIPS. It is still early in the investigation and updates will be provided as they become available.","[""Tampa Police Investigate Shooting on Genesee St\n""]","[""Information Resources"", ""\nLatest News\n"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[] -2597,https://cityofpowell.us/powell-police-officer-audrey-wilt-named-2022-cit-officer-of-the-year-by-delaware-morrow-mental-health-recovery-services-board/,Media Bulletins,200,"City of Powell, Ohio | Powell Police Officer Audrey Wilt Named 2022 CIT Officer of the Year by Delaware-Morrow Mental Health & Recovery Services Board",Officer Audrey Wilt named 2022 CIT Officer of the Year by the Delaware-Morrow Mental Health & Recovery Services Board.,"[""\n Powell Police Officer Audrey Wilt Named 2022 CIT Officer of the Year by Delaware-Morrow Mental Health & Recovery Services Board\n \n ""]","[""CONTACT INFO\n"", ""HELPFUL LINKS"", ""\n LET'S CONNECT\n ""]","[""you're at home in Powell""]","[""614.885.5380"", ""47 Hall Street, Powell, OH 43065"", ""Signup for our newsletter""]",[],[] -2598,https://www.sandiego.gov/police/about/chief,Personnel Records,200,About the Chief | City of San Diego Official Website,"","[""City of San Diego Official Website"", ""About the Chief""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""David Nisleit"", ""About"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -2599,https://southamptontownnypolice.gov/1624/public-information,Not Criminal Justice Related,200,"Public Information | Southampton, NY - Official Website","","[""\r\n\r\nPublic Information\t\t""]",[],"[""Loading"", ""Site Tools"", ""Contact Us"", ""Site Links""]",[],[],[] -2600,https://www.somervillema.gov/policebodycameras,Media Bulletins,200,City of Somerville & Police Union Reach Agreement to Deploy Patrol Officer Body Cameras | City of Somerville,"After several years of negotiations, the City of Somerville and the Somerville Police Employees Association (SPEA) union, which represents Somerville patrol officers, have reached an agreement to implement body-worn cameras. The agreement represents a collaborative breakthrough for policing transparency in Somerville and establishes Somerville as an early regional adopter of this important technology. ","[""\nCity of Somerville & Police Union Reach Agreement to Deploy Patrol Officer Body Cameras\n""]","[""After years of negotiations, the agreement represents a collaborative breakthrough for policing transparency ""]","[""Feedback"", ""Download Mobile Apps"", ""Sign up for City eNews"", ""Connect With Us""]",[],[],[] -2601,https://www.richmondindiana.gov/news/chief-of-police-michael-britt-officer-seara-burton,Media Bulletins,200,Message from Chief of Police Michael Britt on Officer Seara Burton | City of Richmond,"","[""News""]","[""Message from Chief of Police Michael Britt on Officer Seara Burton"", ""Stay Connected""]",[],"[""Contact"", ""City of Richmond""]",[],[] -2602,https://www.ci.san-bernardino.ca.us/city_hall/police_department/department_goals/improve_quality_of_life,Crime Statistics,200," - Improve Quality of Life - City of San Bernardino -","","[""City of San Bernardino California""]","[""Improve Quality of Life""]",[],[],[],[] -2603,http://www.longbeach.gov/police/press-releases/officer-involved-shooting-6-/,Media Bulletins,200,Officer Involved Shooting(6),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2604,https://detroitmi.gov/es/departments/departamento-de-agua-y-alcantarillado/atencion-al-cliente/que-hacer-si-tiene-una-copia-de-seguridad-de-alcantarillado,Not Criminal Justice Related,200,Agua y Alcantarillado Mantenimiento/Emergencias | City of Detroit,"El Departamento de Agua y Alcantarillado de Detroit (DWSD) mantiene 2,700 millas de tuberías de distribución de agua (tuberías principales de agua) y 3,000 millas de tuberías de recolección de alcantarillado. DWSD tiene un programa de mantenimiento preventivo agresivo, un Programa de mejora de capital de cinco años para comenzar a abordar nuestra infraestructura obsoleta y cuenta con un equipo de servicios de campo capacitado que responde a las emergencias. Si necesita informar una emergencia de agua o alcantarillado, llame al 313-267-8000 y presione la opción 4, o use la aplicación móvil de Improve Detroit . SISTEMA DE AGUA: El sistema de agua en Detroit incluye las plantas de tratamiento de agua potable, bombas, líneas de transmisión, tuberías de distribución o cañerías de agua, válvulas, hidrantes y líneas de servicio de agua. Mira este video animado . ¿Tiene una rotura principal de agua? Los inviernos fríos de Detroit, los deshielos primaverales y el calor extremo del verano pueden provocar roturas en las tuberías que llevan el agua a nuestros clientes. Cada vez que el suelo cambia debido a cambios drásticos de temperatura, puede ejercer presión sobre las tuberías. El Departamento de Agua y Alcantarillado de Detroit (DWSD) tiene un programa agresivo de detección de fugas y un Programa de Mejora de Capital para actualizar el sistema. Tú también puedes ayudar. Se pueden perder millones de galones de valiosos recursos de agua potable en poco tiempo, por lo que la detección rápida de una ruptura de la tubería de agua es fundamental. Si sospecha que hay una fuga en su vecindario, llámenos al 313-267-8000 o use la aplicación móvil de Improve Detroit . Mire este video para aprender cómo DWSD responde a las roturas de tuberías principales. ¿Quién es responsable de las tuberías de agua? DWSD es responsable del mantenimiento del sistema de distribución de agua, incluidas las tuberías principales y de servicio de agua hasta el tope de la acera (válvula de encendido/apagado cerca o en la acera). El dueño de la propiedad es responsable de la línea de servicio de agua desde la acera hasta el interior de la casa o negocio y la plomería interna dentro de la casa/estructura. Si la parte privada de la línea de servicio de agua se agrieta o falla, es responsabilidad del dueño de la propiedad contratar a un plomero con licencia y obtener el permiso de la ciudad correspondiente para realizar la reparación. Ver imagen a continuación. DRENAJE: El sistema de recolección de alcantarillado en Detroit consta de líneas laterales de alcantarillado (privadas), tuberías de recolección de alcantarillado que utilizan principalmente la gravedad, tuberías de aguas pluviales, sumideros, infraestructura verde de aguas pluviales , bombas, instalaciones de desbordamiento de alcantarillado combinado y la planta de tratamiento de aguas residuales. ¿Está su calle inundada? DWSD lanzó un programa de inspección y limpieza de cuencas colectoras en 2017 para reducir las inundaciones en las calles de los vecindarios. Hasta noviembre de 2020, los equipos de DWSD han inspeccionado y limpiado 30 000 sumideros (drenajes pluviales). Hay aproximadamente 90,000 sumideros que DWSD es responsable de mantener. Esto no incluye las cuencas en autopistas, carreteras estatales o del condado, como M-10 Lodge Freeway y Woodward Avenue, que son responsabilidad del MDOT. Lea sobre el programa aquí . Si experimenta inundaciones en las calles, por su seguridad, no conduzca ni camine por un área inundada. Repórtelo llamando al 313-267-8000 y presione la opción 4, o use la aplicación móvil de Improve Detroit . Se alienta a los propietarios/inquilinos a que recojan los recortes de césped, las hojas, la basura y otros desechos frente a sus hogares y negocios y los eliminen adecuadamente, ya sea en el césped o en bolsas de basura. Los escombros que no se barren ni se quitan con una pala del frente de su propiedad pueden obstruir los sumideros y potencialmente inundar su calle. Mire este video para obtener más información . ¿Tiene un desbordamiento o una copia de seguridad de alcantarillado? Comuníquese con DWSD al 313-267-8000 y presione la opción 4 o use la aplicación móvil Improve Detroit al descubrir un desbordamiento o un desbordamiento de alcantarillado. Si tiene un desbordamiento o un desbordamiento de alcantarillado en su hogar o negocio, consulte la información de reclamo por daños de DWSD. La ley estatal requiere que presente un reclamo por escrito con su empresa local de servicios de agua, DWSD en este caso, dentro de los 45 días posteriores al descubrimiento del desbordamiento o el desbordamiento. ¿Quién es responsable de las tuberías de alcantarillado? DWSD es responsable del sistema de recolección de alcantarillado. Los propietarios son responsables de los drenajes dentro de la casa/estructura, en la propiedad privada y la línea de alcantarillado que viene desde la estructura hasta la conexión en la tubería de recolección de alcantarillado de la ciudad. La mayoría de las líneas de alcantarillado se conectan en el callejón o antiguo callejón (aquellos que la ciudad dejó vacantes a los propietarios), mientras que solo unos pocos vecindarios tienen la línea de alcantarillado conectada debajo de la calle frente a la casa/estructura. Si la línea de alcantarillado de la casa/estructura falla, se agrieta o se derrumba de la conexión de alcantarillado de la ciudad, es responsabilidad del propietario privado contratar a un plomero con licencia y obtener el permiso de la ciudad correspondiente para realizar la reparación. Ver imagen a continuación.","[""\nAgua y Alcantarillado Mantenimiento/Emergencias\n""]","[""Top Links"", ""Site Menu"", "" SISTEMA DE AGUA:"", "" DRENAJE:"", ""Documentos""]","["" \u00bfTiene una rotura principal de agua?"", "" \u00bfQui\u00e9n es responsable de las tuber\u00edas de agua?"", "" \u00bfEst\u00e1 su calle inundada?"", "" \u00bfTiene un desbordamiento o una copia de seguridad de alcantarillado?"", "" \u00bfQui\u00e9n es responsable de las tuber\u00edas de alcantarillado?""]","[""MEN\u00da DE DEPARTAMENTO""]","[""DWSD Tips to Reduce Flooding""]",[] -2605,https://bouldercolorado.gov/events/police-oversight-panel-0,Poor Data Source,200,Police Oversight Panel | City of Boulder,"","[""Police Oversight Panel\n""]","[""Breadcrumb"", ""Details"", ""Police Oversight Panel Meetings"", ""Meeting Details"", ""More Resources""]","[""\nPolice Oversight Panel Subcomittee: Legacy Meeting\n\n"", ""\nPolice Oversight Panel: Meeting with Interim Chief Redfern\n\n"", ""\nPolice Oversight Panel Subcommittee: Community Engagement Meeting\n\n"", ""\nPolice Oversight Panel Subcomittee: Co-Chairs and IPM Meeting\n\n"", ""\nPolice Oversight Panel: All Panel Meeting\n\n"", ""\nPolice Oversight Panel Subcommitee: Co-Chairs and IPM Meeting\n\n""]",[],[],[] -2606,https://delcopa.gov/pdf/animalshelterrfpfinal.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2607,https://www.scribner-ne.gov/wp-content/uploads/helicopter-3.jpg,Poor Data Source,404,"","",,,,,, -2608,https://www.montgomeryohio.gov/police-resources/,Poor Data Source,200,"Police resources - Montgomery, Ohio","",[],"[""Primary menu links"", ""Action toolbar"", ""Welcome"", ""Engage"", ""Help"", ""Mental Health Resource""]",[],[],[],[] -2609,https://www.southamptontownnypolice.gov/878/deer-protection-and-management-advisory-,Not Criminal Justice Related,200,"Deer Protection and Management Advisory Committee | Southampton, NY - Official Website",The Town of Southampton created the Deer Protection and Management Advisory Committee as a key component to finding a unified approach to sustaining deer populations while balancing human needs.,"[""\r\n\r\nDeer Protection and Management Advisory Committee\t\t""]","[""Members"", "".Deer Management Program"", ""Deer Protection and Management Plan Goals"", ""Deer Management Strategies:"", ""Hunting"", ""Agriculture"", ""Sterilization"", ""Immunocontraception"", ""Marty Shea"", ""Information Concerning Ticks""]","[""Loading"", ""Site Tools"", ""DEER NEWS AND NOTES:"", ""Contact Us"", ""FAQs"", ""Contact Us"", ""Site Links""]",[],[],[] -2610,https://www.ci.bellefontaine.oh.us/announcements/bellefontaine-police-accepting-lateral-transfer-applicants,Training & Hiring Info,200,"Bellefontaine Police Accepting Lateral Transfer Applicants - City of Bellefontaine, Ohio","We’re searching for the best! If you want to join a team that’s committed to excellence and committed to community policing, look no further! We offer competitive wage and benefits, paid vacations, education incentives, and quality training opportunitie",[],"[""BPD Announcements"", ""\nBellefontaine Police Accepting Lateral Transfer Applicants\n"", ""Bellefontaine Police Department"", ""Archives"", ""Categories""]",[],[],[],[] -2611,https://www.lehi-ut.gov/departments/police/lehi-police-ride-along/,Misc Police Activity,200,Lehi Police Ride-Along - Lehi City,"","[""Lehi Police Ride-Along""]","[""RIDE ALONG APPLICATION"", ""Related Pages""]","[""OTHER RIDE-ALONG GOALS:"", ""GENERAL PROCEDURES:"", ""HOW DO YOU SIGN UP FOR A RIDE-ALONG"", ""Please complete the following:(Note: Any application that is incomplete will not be processed)"", ""THE RIDE-ALONG PARTICIPANT MUST AGREE TO ABIDE BY THE FOLLOWING RULES OF CONDUCT""]",[],[],[] -2612,https://delcopa.gov/council/2015minutes/081215minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2613,https://hilliardohio.gov/coffee-with-a-cop-2/,Poor Data Source,200,Join HPD for Coffee with a Cop - City of Hilliard,No agendas. No presentations. No speeches. Just casual conversation. Join the Hilliard Division of Police for a very special cup of morning Joe from 9,"[""News"", ""Join HPD for Coffee with a Cop""]",[],[],"[""Recent Articles"", ""Hilliard Newsletter"", ""City Hall and Admin"", ""Hilliard Mayor's Court"", ""Division of Police"", ""Police Assistance"", ""Police Records and General Assistance"", ""Norwich Township Fire"", ""Hilliard Recreation & Parks"", ""Hilliard Newsletter"", ""Quick Links"", ""Stay connected with us""]",[],"[""Click the \u2018x\u2019 to opt out.""]" -2614,https://southamptontownnypolice.gov/335/services-programs,Not Criminal Justice Related,200,"Services & Programs | Southampton, NY - Official Website","","[""\r\n\r\nServices & Programs\t\t""]","[""Municipal Works -\u00a0Waste Management"", ""Edward Thompson"", ""Recycling CenterHours & Locations \u00a0\u00a0""]","[""Loading"", ""Site Tools"", ""Contact Us"", ""Quick Links"", ""Contact Us"", ""Site Links""]","[""\nGuest Speaker\n"", ""\n STOP Program (Hazardous Waste)\n"", ""\nPublic Education & Outreach\n"", ""\nTours\n""]",[],[] -2615,http://www.longbeach.gov/police/press-releases/arrest-made-in-murder-case-2-/,Media Bulletins,200,ARREST MADE IN MURDER CASE(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2616,https://bouldercolorado.gov/police-master-plan-process-subcommittee,Policies & Contracts,200,Police Master Plan Process Subcommittee | City of Boulder,"","[""Police Master Plan Process Subcommittee\n""]","[""Breadcrumb"", "" Contact Police Master Plan Process Subcommittee\n\n"", ""Purpose and Role "", ""Members"", ""Meeting Schedule"", ""Meeting Materials""]",[],[],[],[] -2617,https://www.naperville.il.us/2022-news-articles/naperville-police-investigate-personal-injury-hit-and-run-crash/,Media Bulletins,404,"","",,,,,, -2618,https://cityofyuma.colorado.gov/departments/emergency-services/police-department,List of Data Sources,200,Police Department | City of Yuma,"","[""\nPolice Department\n""]",[],"[""\nOur Mission\n""]","[""Forms and Resources""]",[],[] -2619,http://police.byram-ms.us/wpt_slider/sro/,Poor Data Source,200,sro | Byram Police Department,"","[""sro""]","[""Byram Weather""]","[""Post navigation"", ""Byram Police Department""]",[],[],[] -2620,https://www.lincolnca.gov/en/living-here/police-department.aspx?_mid_=484,Resources,200," - - - - Police Department - - - City of Lincoln -","","[""\r\n \n \n Police Department\n \r\n ""]","[""Online Reports Include:"", ""Do Not"", ""Contact Us"", ""Resources"", ""Browser Compatibility Notification""]",[],[],[],[] -2621,https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-courtesy-department-issued-bwc/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2622,https://covington.va.us/city-government/city-departments/police/police-patrol/,Misc Police Activity,200,Police Patrol - Covington City,"","[""\nPolice Patrol\n"", ""\nPolice Patrol\n""]","[""\nTOP ONLINE LINKS\n""]",[],"[""NOTICES"", ""\nMAPLE AVENUE PROJECT UPDATE "", ""\nROUTE 18 THERMO STRIPING "", ""CALENDAR""]",[],[] -2623,https://www.desmoineswa.gov/departments/police/forms_documents,Resources,200," - Forms / Documents - City of Des Moines, WA -","","[""City of Des Moines, WA""]","[""Forms / Documents""]",[],[],[],[] -2624,https://alpha.austin.gov/en/health-safety/accountability-and-transparency-in-policing/police-feedback-and-records/bwc-dmav-vendors-glossary-and-additional-information/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2625,http://lafayettepolice.us/1585/concessions-nearby-restaurants,Not Criminal Justice Related,200,"Concessions / Nearby Restaurants | Lafayette, IN - Official Website","","[""\r\n\r\nConcessions / Nearby Restaurants\t\t""]",[],"[""Loading"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -2626,https://www.rentonwa.gov/city_hall/police/patrol_operations/false_alarm_reduction_program,Misc Police Activity,200," - False Alarm Reduction Program - City of Renton -","","[""CITY OF RENTON\r\n\t\t\t\t\tWASHINGTON""]","[""False Alarm Reduction Program""]",[],"[""City of Renton Kicks Off a New False Alarm Reduction Program"", ""Appeal Guidelines"", ""False Alarm Prevention Tips"", ""Frequently Asked Questions""]",[],[] -2627,https://spdblotter.seattle.gov/2014/10/20/police-investigating-collision-between-vehicle-and-pedestrian-in-northgate-area/,Media Bulletins,200,Police Investigating Collision Between Vehicle and Pedestrian in Northgate Area - SPD Blotter,"","[""Police Investigating Collision Between Vehicle and Pedestrian in Northgate Area""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -2628,https://champaignil.gov/2014/08/11/champaign-police-investigate-domestic-battery-shooting/,Media Bulletins,200,Champaign Police Investigate Domestic Battery Shooting - City of Champaign,"","[""Champaign Police Investigate Domestic Battery Shooting""]","[""News Releases"", ""Department News""]",[],[],[],[] -2629,https://www.mass.gov/doc/attachment-a-police-departments/download,Poor Data Source,200,"","",[],[],[],[],[],[] -2630,https://delcopa.gov/ems/pdfdocs/initialcertificationeducationtesting/emsinstructorchecklist.doc,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2631,https://www.mass.gov/info-details/audit-of-the-massachusetts-rehabilitation-commission-objectives-scope-and-methodology,Media Bulletins,200,"Audit of the Massachusetts Rehabilitation Commission Objectives, Scope, and Methodology | Mass.gov",An overview of the purpose and process of auditing the Massachusetts Rehabilitation Commission,"[""\nAudit of the Massachusetts Rehabilitation Commission Objectives, Scope, and Methodology\n""]","[""Table of Contents\n for the audit, Audit of the Massachusetts Rehabilitation Commission"", ""Table of Contents"", ""Overview\n "", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -2632,https://cheswold.delaware.gov/cheswold-police-department-crime-statistics/may-19-activity-report/,Annual & Monthly Reports,200,May 19 Activity Report - Town of Cheswold,"","[""Cheswold""]","[""Delaware"", ""May 19 Activity Report""]","[""Menu""]","[""Address:"", ""Call Us:"", ""Reach Out:""]",[],[] -2633,https://delcopa.gov/publicrelations/releases/2021/primary_electiondayguide.html,Not Criminal Justice Related,200,"The Delaware County 2021 Municipal Primary Election Day Guide - Delaware County, Pennsylvania","","[""The Delaware County 2021 Municipal Primary Election Day Guide""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Polling Places, Secured Ballot Drop Boxes, Mask Guidance, Late Vote-by-Mail Ballot Options, and more!"", ""SAMPLE BALLOTS AND BALLOT MEASURES"", ""FINDING YOUR POLLING PLACE"", ""SECURED BALLOT DROP BOXES"", ""VOTING BY MAIL"", ""NAKED BALLOTS"", ""LATE OR MISSING VOTE-BY-MAIL BALLOTS"", ""DELAWARE COUNTY\u2019s ELECTION HOTLINE AND VOTER SERVICE CENTER"", ""COVID-19 GUIDANCE: MASKS AND SOCIAL DISTANCING""]",[],[] -2634,https://www.memphistn.gov/news/category/police/,Media Bulletins,404,"","",,,,,, -2635,http://police.byram-ms.us/contact-us/recordsrequest/,Records Request Info,200,Police Records Request | Byram Police Department,"","[""Police Records Request""]","[""Byram Weather""]","[""Byram Police Department""]",[],[],[] -2636,https://delcopa.gov/clerk/boardpositions/sustainability.html,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2637,https://delcopa.gov/publicrelations/releases/2021/healthyfortheholidays.html,Not Criminal Justice Related,200,"Delaware County Urges Residents to be ‘Healthy for the Holidays’ - Delaware County, Pennsylvania","","[""Delaware County Urges Residents to be \u2018Healthy for the Holidays\u2019""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Healthy for the Holidays: Boosters"", ""Healthy for the Holidays: Children Ages 5 to 11 and Adolescents"", ""Healthy for the Holidays: Immunocompromised and Homebound Individuals"", ""Healthy for the Holidays: Where to Get the COVID-19 Vaccine"", ""Healthy for the Holidays: Testing"", ""Healthy for the Holidays: Staying Safe for Those Not Vaccinated or Around Unvaccinated People""]",[],[] -2638,https://pharr-tx.gov/animated-columns/pharr-police/,Poor Data Source,200,Pharr Police – City of Pharr,"","[""Pharr Police""]",[],[],[],[],[] -2639,http://lafayettepolice.us/1672/internships,Training & Hiring Info,200,"Internships | Lafayette, IN - Official Website","","[""\r\n\r\nInternships\t\t""]","[""Columbian Park Zoo offers a variety of exciting internship opportunities for current college students or recent graduates. \u00a0All academic majors are encouraged to apply."", ""For questions or additional information, please contact the Volunteer Coordinator at 765-807-1543 or cnave@lafayette.in.gov""]","[""Loading"", """", ""Internship Focus Areas (varies seasonally):"", ""Seasons and Time Commitments:"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -2640,http://www.lafayettepolice.us/faq.aspx?qid=122,Not Criminal Justice Related,200,FAQs • Whom should I contact for assistance with a drainage ,"",[],"[""\n\u25bc\r\nWater Quality, Watersheds & Stormwater\t\t""]","[""Loading"", ""Categories"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Site Links""]",[],[],[] -2641,http://www.longbeach.gov/police/press-releases/traffic-fatality-4-/,Media Bulletins,200,TRAFFIC FATALITY(4),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2642,https://rexburg.us/unified-police-locate-person-of-interest-in-suspicious-death-in-taylorsville/,Poor Data Source,522,"","",,,,,, -2643,https://www.pleasantprairiewi.gov/departments/police/news/police_and_fire___rescue_news_archive/2021_news_releases/w_i_l_e_a_g_re-_accreditation,Media Bulletins,200," - WILEAG Re-Accreditation - Village of Pleasant Prairie -","",[],"[""WILEAG Re-Accreditation""]","[""Follow Us on Social Media""]",[],[],[] -2644,https://www.mass.gov/doc/semexant-jeffrey-v-boston-police-department-52121/download,Court Cases,200,"","",[],[],[],[],[],[] -2645,https://www.mass.gov/doc/beauregard-david-v-city-of-chicopee-4920/download,Court Cases,200,"","",[],[],[],[],[],[] -2646,http://www.longbeach.gov/police/about-the-lbpd/,Contact Info & Agency Meta,200,About the LBPD,"

- -  

","[""Police Department""]","[""About the LBPD""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", """", ""LBPD Year in Review"", ""LBPD COMMAND STAFF"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""Crime Lab Survey"", ""\u00a0""]",[] -2647,https://www.wakeforestnc.gov/news/joyner-park-restrooms-destroyed-vandals-police-seek-public%e2%80%99s-help-identifying-culprits,Media Bulletins,200,"Joyner Park restrooms destroyed by vandals, police seek public’s help identifying culprits | Town of Wake Forest, NC","The Wake Forest Police Department is asking for the public’s help identifying the person or persons responsible for vandalizing the restrooms at E. Carroll Joyner Park, 701 Harris Road. Sometime late Saturday evening or early Sunday morning, vandals used rocks and other items to shatter glass doors and mirrors, clog toilets, and smash sinks.“I’m disgusted that someone would so","[""Joyner Park restrooms destroyed by vandals, police seek public\u2019s help identifying culprits""]","[""wake_forest_cares_wfc_2021-3_1.jpg"", ""Search form"", ""You are here""]",[],[],[],[] -2648,https://detroitmi.gov/departments/law-department/submit-foia-request/non-routine-or-complex-police-foia-request,Poor Data Source,403,"","",,,,,, -2649,https://townofeaton.colorado.gov/departments/police-department,Resources,200,Police Department | Town of Eaton,Hours of Operation / Curfew Hours / Animal Control / Drug Take Back Kiosk / Trailer Parking / Public Information Officer / Eaton Municipal Court / Snow Removal / Complaints or Compliments / Protect Yourself and Prop,"[""\nPolice Department\n"", ""Hours of Operation / Curfew Hours / Animal Control / Drug Take Back Kiosk\u00a0/ Trailer Parking / Public Information Officer / Eaton Municipal Court / Snow Removal / Complaints or Compliments / Protect Yourself and Property / Speaking Engagements / Employment / Toys from a Cop / Patch Collectors / 2021 Statistical Report / Personnel "", ""Hours of Operation"", ""Curfew Hours"", ""Animal Control"", ""Drug Take Back Kiosk"", ""Trailer Parking"", ""Public Information Officer"", ""Eaton Municipal Court"", ""Snow Removal"", ""Complaints or Compliments"", ""Protect Yourself and Your Property"", ""Officers Available for Speaking Engagements"", ""Employment with Eaton Police Department"", ""Toys From a Cop"", ""Police Patch Collectors"", ""Eaton Police Department - 2021 Statistical Highlight Summary Report"", ""Personnel""]",[],"[""\n""]",[],[],[] -2650,https://delcopa.gov/publicrelations/releases/2021/wellnesscenteropening.html,Not Criminal Justice Related,200,"Delaware County Council Officially Opens the Delaware County Wellness Center - Delaware County, Pennsylvania","","[""Delaware County Council Officially Opens the Delaware County Wellness Center""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Timeline:"", ""Vaccination Efforts:""]",[],[] -2651,https://www.antioch.il.gov/wpfb-file/04-09-13-police-pension-agenda-pdf/,Poor Data Source,200,"04-09-13 Police Pension Agenda - Antioch, IL",8444 04 09 13 police pension agenda pdf commissions fund agendas 2013 1365184892 5ac397bb3e0fdc037dd88aca92cea1f3 213x300 _mebhnck4ak6y thumb jpg 05 01 32 0 pdf application trustees dennis b crosby scott a pierce mary c dominiak ted p poulos jay jozwiak george sakas lawrence m hanson mayor lori k folbrick village clerk agenda of antioch lake county,"[""04-09-13 Police Pension Agenda""]",[],[],[],[],[] -2652,https://www.jacksonms.gov/meetings/personnel-management-administration-police-and-fire/,Resources,200,"Personnel Management, Administration, Police and Fire - Jackson, MS","","[""\n Personnel Management, Administration, Police and Fire ""]","[""Primary menu links"", ""Action toolbar"", ""Contact"", ""Subscribe"", ""Connect""]","[""9:00 am\nJackson City Hall\n""]","[""Cold Weather Shelter - Open""]","["""", """", """"]","[""219 S President St, Jackson 39205""]" -2653,https://sf.gov/departments/department-police-accountability,Resources,200,Department of Police Accountability | San Francisco,We investigate complaints about police officers and recommend policy changes.,"[""Department of Police Accountability""]","[""Meetings"", ""Services"", ""\n News\n "", ""Events"", ""Resources"", ""About"", ""Contact"", ""Footer menu"", ""Footer Bottom""]","[""Upcoming meetings"", ""Past meetings"", ""\n \n Policing concerns\n\n "", ""\n \n Volunteering\n\n "", ""Department of Police Accountability""]","["""", """"]",[],[] -2654,https://alpha.austin.gov/es/police-oversight/formal-complaint-obedience-to-orders/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2655,https://www.southamptontownnypolice.gov/953/lyzon-hat-shop,Not Criminal Justice Related,200,"Lyzon Hat Shop | Southampton, NY - Official Website","","[""\r\n\r\nLyzon Hat Shop\t\t""]","[""Lyzon Hat Shop"", ""TIME-LINE:""]","[""Loading"", ""Site Tools"", ""Contact Us"", ""Maria Z. Moore"", ""Contact Us"", ""Site Links""]",[],[],[] -2656,https://alpha.austin.gov/en/police-oversight/formal-complaint-impartial-attitude-and-courtesy-4/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2657,http://www.longbeach.gov/police/press-releases/murder-37-/,Media Bulletins,200,MURDER(37),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2658,https://www.belen-nm.gov/wp-content/uploads/2021/01/120193874_3263039293803054_6835373498020090735_o-copy.jpg,Poor Data Source,200,"","",[],[],[],[],[],[] -2659,https://www.coppelltx.gov/faq.aspx?qid=232,Resources,200,FAQs • What can be done about speeding on my residential str,"",[],"[""Speed Study"", ""Speed Bumps"", ""\n\u25bc\r\nTraffic\t\t"", ""Distance Between Traffic Signals"", ""Time Frame for Installation of a Traffic Signal"", ""Eligibility"", ""Alternate Routes"", ""Reasons to Not Install Speed Bumps"", ""Studies"", ""Amount of Feet Needed on Streets"", ""No Parking Areas"", ""Report a Car"", ""Speed Study"", ""Speed Bumps"", ""Example to Not Install Stop Signs"", ""When Stop Signs Are Installed""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -2660,https://spdblotter.seattle.gov/2017/12/05/police-need-your-help-identifying-man-who-robbed-two-lower-queen-anne-businesses/,Media Bulletins,200,Police Need Your Help Identifying Man Who Robbed Two Lower Queen Anne Businesses - SPD Blotter,"","[""Police Need Your Help Identifying Man Who Robbed Two Lower Queen Anne Businesses""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -2661,https://www.mass.gov/info-details/oig-annual-report-2019-division-of-state-police-oversight,Annual & Monthly Reports,200,OIG Annual Report 2019: Division of State Police Oversight | Mass.gov,Part VI of the Office of the Inspector General's 2019 Annual Report.,"[""\nOIG Annual Report 2019: Division of State Police Oversight\n""]","[""Table of Contents\n for the report, Office of the Inspector General Annual Report 2019"", ""Table of Contents"", ""Overview\n "", ""I. Audits, Investigations and Reviews\n "", ""II. The MSP\u2019s Efforts to Achieve Certification and Accreditation\n "", ""III. The MSP\u2019s Efforts to Modernize and Centralize\n "", ""Related\n "", ""Related\n "", ""Help Us Improve Mass.gov with your feedback""]","[""The Division of State Police Oversight:"", ""Additional Resources\n ""]",[],[],[] -2662,https://www.hayward-ca.gov/police-department/public-services/crisis-intervention,Resources,200,Crisis Intervention | City of Hayward - Official website,"Crisis intervention is not a stand-alone “program,” but is a service provided by the entire counseling staff regardless of their assigned program.",[],"[""Crisis Intervention"", ""You are here. So is everything else."", ""Search form""]",[],"[""Common crisis services include:"", ""Hours of Operation:\u00a0"", ""Office Location:"", ""Receive crime bulletins and alerts"", ""Report\n Problems"", ""Ask\n Questions"", ""Make a\n Suggestion"", ""Translate"", ""Search""]",[],[] -2663,http://www.longbeach.gov/police/press-releases/celebrate-the-4th-of-july-holiday-responsibly/,Media Bulletins,200,Celebrate the 4th of July Holiday Responsibly,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2664,https://www.pinevillenc.gov/government/departments/police/join-ppd/,Training & Hiring Info,200,"Join PPD - Town of Pineville, NC","","[""Join PPD"", ""Join PPD"", ""Town of Pineville Updates""]","[""Join Pineville Police Department"", ""Town of Pineville Contacts"", ""Important News & Updates"", ""Advisory Board Openings for Pineville Residents"", ""Pineville Community Meeting"", ""Property Tax Listings"", ""Follow Pineville on Facebook""]","[""Basic Law Enforcement Training Programs"", ""Apply through our Human Resources Department:"", ""Emergency: Police, Fire & Rescue"", ""Non-Emergency:"", ""Town Hall Mailing Address:"", ""Town Hall Physical Address:"", ""Town Hall Office Hours:""]",[],[],[] -2665,https://delcopa.gov/sustainability/commission/otherpdfs/sustcommmtg_slidedeck_2021-8-19.pdf,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2666,https://coloradosprings.gov/police-department/page/alternate-education-program,Resources,200,Alternate Education Program | City of Colorado Springs,"","[""\nAlternate Education Program\n""]","[""Search"", ""Educational Program"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]","[""Do you have some college credits?"", ""Do you need to get some college credits?\u00a0"", ""Do you have military experience?\u00a0""]","[""Participating Schools with CSPD AEP:""]","[""CSU - Global\u00a0"", ""Pikes Peak State College"", ""REPORT ONLINE""]",[] -2667,https://www.tukwilawa.gov/departments/police/command-staff-bios/pd-boyd-kraig-bio-pic/,Media Bulletins,200,"PD-Boyd, Kraig Bio Pic - City of Tukwila","","[""City of Tukwila News""]","[""PD-Boyd, Kraig Bio Pic""]",[],"[""\nCity of Tukwila\n""]","[""I am a..."", ""Online Services"", ""Most Requested Forms""]",[] -2668,https://coloradosprings.gov/police-department/article/news/adrian-vasquez-serve-interim-police-chief,Media Bulletins,200,Adrian Vasquez to serve as interim police chief following Niski retirement | City of Colorado Springs,"","[""\nAdrian Vasquez to serve as interim police chief following Niski retirement\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -2669,https://www.gurnee.il.us/government/departments/police-department/community-involvement/gurnee-citizen-police-academy/gurnee-citizen-police-academy/week-6,Training & Hiring Info,200," - Gurnee Citizen Police Academy -","","[""Police Department""]","[""Gurnee Citizen Police Academy"", ""Youth Citizen Police Academy""]","[""Now accepting applications for the Spring 2024 session!"", ""Click here to register for the Gurnee Citizen Police Academy"", ""Village Hall""]",[],[],[] -2670,https://delcopa.gov/council/2018minutes/050218minutes.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2671,https://brookfieldil.gov/brookfields-police-and-fire-chiefs-safety-talk-for-seniors-9-19-19/mtc-2019-poster-3/,Poor Data Source,404,"","",,,,,, -2672,https://alpha.austin.gov/police-oversight/joint-report-analysis-of-apd-racial-profiling-data/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2673,https://delcopa.gov/publicrelations/releases/2020/delcocares_sept1.html,Not Criminal Justice Related,200,"Applications for Delco CARES Housing Assistance Program Available September 1 - Delaware County, Pennsylvania","","[""Applications for Delco CARES Housing Assistance Program Available September 1""]",[],"[""Public Relations Navigation"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]","[""Residents affected by the COVID-19 Pandemic may be eligible for mortgage, rent, and utility assistance""]",[],[] -2674,https://www.milpitas.gov/milpitas/departments/police/community-relations/citizen-volunteer-and-explorer-applications/,Poor Data Source,404,"","",,,,,, -2675,https://www.mass.gov/news/governor-baker-signs-police-reform-legislation,Poor Data Source,403,"","",,,,,, -2676,https://frederica.delaware.gov/tag/police-officer/,Training & Hiring Info,200,police officer Archives - Frederica,"","[""Frederica""]","[""Delaware"", ""Ad for Part-Time Police Officer""]","[""Menu"", ""Online Bill Pay"", ""Connect With Us!""]","[""Posts Tagged With: \u201cpolice officer\u201d""]",[],[] -2677,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0250/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2678,https://alpha.austin.gov/police-oversight/formal-complaint-obedience-to-orders-insubordination/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2679,http://www.tampa.gov/fire-and-police-pension/info/meeting-notices,List of Data Sources,200,Notices For Upcoming Meetings | City of Tampa, ,"[""Notices For Upcoming Meetings\n""]","[""Fire And Police Pension"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[] -2680,http://www.longbeach.gov/police/contact-us/,Contact Info & Agency Meta,200,Contact Us,Long Beach Police Department - Contact Us,"[""Police Department""]","[""Police Department Phone List""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""Crime Lab Survey"", ""\u00a0""]",[] -2681,http://www.longbeach.gov/police/press-releases/dui-checkpoint-nets-two-arrests-3-/,Media Bulletins,200,DUI Checkpoint Nets Two Arrests(3),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2682,https://dagsboro.delaware.gov/police-department/police-department/nick-disciullo-promotion-2019-2/,Poor Data Source,200,Nick Disciullo promotion 2019 - Town of Dagsboro,"",[],"[""Nick Disciullo promotion 2019""]","[""Menu"", ""Online Payments"", ""Agendas & Minutes"", ""Contact Us"", ""Connect With Us!""]",[],[],[] -2683,https://www.sandiego.gov/department-document/police-arrest-suspect-encanto-homicide,Media Bulletins,200,Police Arrest Suspect In Encanto Homicide | City of San Diego Official Website,"","[""City of San Diego Official Website""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Police Arrest Suspect In Encanto Homicide"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -2684,https://wildwoodpolice-fl.gov/attempt_to_identify_type-sitemap.xml,Poor Data Source,200,"","",[],[],[],[],[],[] -2685,https://police.greenvillesc.gov/faq.aspx?qid=359,Not Criminal Justice Related,200,FAQs • Is automated collection safer than manual?,"",[],"[""\n\u25bc\r\nRecycling\t\t""]","[""Loading"", ""Categories"", ""Live Edit""]",[],[],[] -2686,http://www.longbeach.gov/police/press-releases/critical-missing-juvenile---michael-veal/,Media Bulletins,200,CRITICAL MISSING JUVENILE - MICHAEL VEAL,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2687,https://delcopa.gov/vote/votebymail.html,Not Criminal Justice Related,200,"Vote-by-Mail Ballots - Delaware County, Pennsylvania","","[""Vote-by-Mail Ballots""]",[],"[""About Vote-by-Mail Ballots"", ""Important Vote-by-Mail Dates"", ""APPLYING FOR YOUR VOTE-BY-MAIL BALLOT"", ""RECEIVING AND COMPLETING YOUR MAIL-IN BALLOT OR ABSENTEE BALLOT"", ""VOTE-BY-MAIL ELECTION BALLOT STATUS CHECK"", ""RETURNING YOUR MAIL-IN/ABSENTEE BALLOT"", ""LAST MINUTE EMERGENCIES"", ""MILITARY AND OVERSEAS VOTERS"", ""HOW TO VOTE IN-PERSON IF YOU HAVE RECEIVED A VOTE-BY-MAIL BALLOT"", ""Delco Votes!"", ""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2688,https://www.dps.nm.gov/blog/2021/02/10/update-cancel-amber-alert-albuquerque-police-department/,Media Bulletins,200,UPDATE: CANCEL AMBER ALERT-Albuquerque Police Department. - NM Department of Public Safety,"","[""UPDATE: CANCEL AMBER ALERT-Albuquerque Police Department.""]",[],"[""Location"", ""Sitemap"", ""Quick Links"", ""Social Media Links""]",[],[],[] -2689,https://oceancitymd.gov/oc/ocean-city-police-arrest-two-individuals-after-a-serious-assault/,Media Bulletins,200,"Ocean City Police Arrest Two Individuals After a Serious Assault – Town of Ocean City, Maryland","",[],"[""Post navigation""]","[""Related posts""]",[],[],[] -2690,https://alpha.austin.gov/police-oversight/notice-of-complaint-related-to-2022-0674/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2691,https://delcopa.gov/planning/pdf/agendas/2020/agenda202010.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2692,http://www.longbeach.gov/police/press-releases/traffic-fatality-pico-and-pier-c/,Media Bulletins,200,TRAFFIC FATALITY PICO and PIER C,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2693,https://townofspringfield.colorado.gov/departments/police-department/winter-vehicle-safety-kits,Poor Data Source,404,"","",,,,,, -2694,http://www.longbeach.gov/police/press-releases/traffic-fatality-7-/,Media Bulletins,200,TRAFFIC FATALITY(7),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2695,https://ose.louisiana.gov/event/police-corporal-14/,Poor Data Source,200,Police Corporal | Louisiana Office of State Examiner,"","["""", ""Police Corporal""]",[],"[""Promotional Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -2696,https://delcopa.gov/planning/pdf/currentprojects/rosetreeplayoverallsiteloc.pdf,Not Criminal Justice Related,200,"","",[],[],[],[],[],[] -2697,https://delcopa.gov/publicrelations/releases/2022/www.vaccines.gov,Poor Data Source,200,"404 - Delaware County, Pennsylvania","","[""404 Error""]",[],"[""Contact Us"", ""Press Releases"", ""Quick Links"", ""About Delaware County""]",[],[],[] -2698,http://www.longbeach.gov/police/press-releases/murder-ruled-self-defense/,Media Bulletins,200,MURDER RULED SELF-DEFENSE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2699,http://www.lafayettepolice.us/1/home,Poor Data Source,200,"Lafayette, IN - Official Website | Official Website","","[""Popular Links"", ""Stay Up to Date""]",[],"[""Loading"", ""Quick Links"", ""January 2024"", ""January 2024"", ""Contact Us"", ""FAQs"", ""Site Links""]","[""Holiday lights at Riehle Plaza"", ""Family on pedal boat in Columbian Park lagoon"", ""America concert at Loeb Stadium"", ""Pickelball courts at McCaw Park"", ""Nick Bostic Marquis de Lafayette presentation at Aviators game"", ""Sunset from inside Loeb Stadium"", ""Goat kids at Columbian Park Zoo Petting Zoo area"", ""Rush Pavilion and the Lagoon"", ""\nExtreme Cold Worker Safety Tips from OSHA \n"", ""\nProtect Your Pipes! \n"", ""\nIt's cold for your pets too! \n"", ""\nWinter Car Emergency Kit \n"", ""\nGot Boots? \n"", ""\nAvoid Ticket Scams! \n"", ""\nINDOT Teal Road Reconstruction \n"", ""Thu Jan. 25 "", ""Mon Jan. 29 "", ""Tue Jan. 30 "", ""Thu Jan. 25 "", ""Mon Jan. 29 "", ""Tue Jan. 30 "", ""ccc""]",[],[] -2700,https://beaumonttexas.gov/beaumont-police-arrest-port-arthur-man-for-murder/,Media Bulletins,404,"","",,,,,, -2701,https://alpha.austin.gov/es/police-oversight/formal-complaint-impartial-attitude-and-courtesy-28/,Poor Data Source,200,Maintenance Notice,"",[],[],[],[],[],[] -2702,https://rexburg.us/police-man-sexually-abused-hairstylist-in-ogden-barbershop/,Media Bulletins,522,"","",,,,,, -2703,http://www.longbeach.gov/police/press-releases/two-suspects-arrested-in-murder-case/,Media Bulletins,200,TWO SUSPECTS ARRESTED IN MURDER CASE,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2704,http://www.longbeach.gov/police/press-releases/dui-drivers-license-checkpoint-planned-this-weekend-1-/,Media Bulletins,200,DUI DRIVERS LICENSE CHECKPOINT PLANNED THIS WEEKEND(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2705,https://delcopa.gov/arpa/pdf/20220731annualarpareportfiled7-29-22final.pdf,Annual & Monthly Reports,200,"","",[],[],[],[],[],[] -2706,https://brookfieldil.gov/publication/072512-july-25-2012-brookfield-police-pension-board/,Poor Data Source,404,"","",,,,,, -2707,https://southamptontownnypolice.gov/1370/2020-budgets,List of Data Sources,200,"2020 Budgets | Southampton, NY - Official Website","","[""\r\n\r\n2020 Budgets \t\t""]",[],"[""Loading"", ""Site Tools"", ""2020 Budget"", ""Contact Us"", ""Site Links""]","[""\r\n\t\t\t\t\t2020 Adopted Budget - Capital\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t2020 Adopted Budget - Operating\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t2020 Tentative Budget - Operating\r\n\t\t\t\t"", ""\r\n\t\t\t\t\t2020 Tentative Budget - Capital\r\n\t\t\t\t""]",[],[] -2708,http://www.longbeach.gov/police/press-releases/protect-yourself-from-fraud-this-holiday-season/,Media Bulletins,200,Protect Yourself from Fraud this Holiday Season,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2709,https://delcopa.gov/courts/pdf/emergencyjudicialorders/fifthemergencyorderextendingearlyparolereviewandsuchpossiblerelease.pdf,Court Cases,200,"","",[],[],[],[],[],[] -2710,http://www.longbeach.gov/police/press-releases/juvenile-investigations-operation-results-in-6-arrests/,Media Bulletins,200,JUVENILE INVESTIGATIONS OPERATION RESULTS IN 6 ARRESTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2711,https://barnegatpolice.us/barnegat-police-department-2/professional-standards/,Policies & Contracts,200,Professional Standards - Barnegat Township Police Department,"","[""Professional Standards""]",[],[],"[""Directions"", ""Quick Links""]",[],[] -2712,http://www.longbeach.gov/police/press-releases/charges-filed-in-attempt-murder-case/,Media Bulletins,200,Charges Filed in Attempt Murder Case,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2713,http://www.longbeach.gov/police/press-releases/traffic-fatality27/,Media Bulletins,200,TRAFFIC FATALITY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2714,https://www.ci.neenah.wi.us/departments/police/police-annual-reports/survey-results/,List of Data Sources,200,Survey Results – City of Neenah,"","[""Survey Results""]","[""In This Department""]",[],[],[],[] -2715,http://www.longbeach.gov/press-releases/robert-g--luna-appointed-police-chief-of-long-beach/,Media Bulletins,200,Robert G. Luna Appointed Police Chief of Long Beach,"","[""PRESS RELEASE""]",[],[],[],[],[] -2716,http://www.longbeach.gov/police/press-releases/long-beach-police-are-asking-for-the-public-s-help/,Media Bulletins,200,Long Beach Police are asking for the public’s help,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2717,http://www.longbeach.gov/police/press-releases/officer-involved-shooting-2800-block-15th/,Media Bulletins,200,OFFICER INVOLVED SHOOTING 2800 BLOCK 15TH,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2718,http://www.longbeach.gov/police/press-releases/dui-checkpoint-results/,Media Bulletins,200,DUI CHECKPOINT RESULTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2719,http://www.longbeach.gov/police/press-releases/murder-44-/,Media Bulletins,200,Murder(44),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2720,http://www.longbeach.gov/police/press-releases/identity-theft-suspect-charged-with-11-felony-counts/,Media Bulletins,200,IDENTITY THEFT SUSPECT CHARGED WITH 11 FELONY COUNTS,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2721,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-proves-effective-2-/,Media Bulletins,200,DUI SATURATION PATROL PROVES EFFECTIVE(2),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2722,http://www.longbeach.gov/police/press-releases/dui-saturation-patrol-proves-effective-7-/,Media Bulletins,200,DUI SATURATION PATROL PROVES EFFECTIVE(7),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2723,https://springfield-or.gov/event/springfield-police-advisory-committee-meeting/,Poor Data Source,200,Springfield Police Advisory Committee Meeting - City of Springfield Oregon,"",[],"[""Springfield Police Advisory Committee Meeting""]","[""September 3, 2020 @ 6:00 pm - 7:30 pm"", ""Event Navigation""]","[""Share This Story, Choose Your Platform!"", "" Details "", "" Venue ""]",[],[] -2724,http://www.longbeach.gov/police/press-releases/traffic-fatality7/,Media Bulletins,200,TRAFFIC FATALITY,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2725,http://www.longbeach.gov/police/press-releases/national-night-out-set-for-august-4th/,Media Bulletins,200,NATIONAL NIGHT OUT SET FOR AUGUST 4TH,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2726,http://www.longbeach.gov/police/press-releases/human-trafficking-charges-filed-and-additional-victims-sought/,Media Bulletins,200,Human Trafficking Charges Filed and Additional Victims Sought,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2727,http://www.longbeach.gov/police/press-releases/police---fire-memorial-ceremony-1-/,Media Bulletins,200,POLICE & FIRE MEMORIAL CEREMONY(1),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2728,http://www.longbeach.gov/police/press-releases/dui-drivers-license-checkpoint-planned/,Media Bulletins,200,DUI DRIVERS LICENSE CHECKPOINT PLANNED,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2729,https://coloradosprings.gov/police-department/webform/community-outreach-request,Resources,200,Community Outreach Request | City of Colorado Springs,"","[""\nCommunity Outreach Request\n""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -2730,http://www.longbeach.gov/police/press-releases/traffic-fatality-pch-and-studebaker-rd/,Media Bulletins,200,TRAFFIC FATALITY PCH AND STUDEBAKER RD,"","[""Long BeachPolice Department""]",[],[],[],[],[] -2731,http://www.longbeach.gov/police/press-releases/murder-6-/,Media Bulletins,200,MURDER(6),"","[""Long BeachPolice Department""]",[],[],[],[],[] -2732,https://ose.louisiana.gov/event/police-records-clerk-3/,Poor Data Source,200,Police Records Clerk | Louisiana Office of State Examiner,"","["""", ""Police Records Clerk""]",[],"[""Competitive Level""]",[],[],"[""Recent Posts"", ""Archives"", ""Categories"", ""Meta""]" -2733,https://bjs.ojp.gov/content/pub/pdf/ccpuf.pdf,Complaints & Misconduct,200,"","",[],[],[],[],[],[] -2734,https://www.muckrock.com/foi/detroit-314/shotspotter-policies-140369/#file-1067485,Policies & Contracts,200,ShotSpotter policies • MuckRock,MuckRock is a collaborative news site that gives you the tools to hold the government accountable.,"[""ShotSpotter policies""]","[""Communications"", ""Files""]","[""""]",[],[],[] -2735,https://www.documentcloud.org/documents/23741390-allegheny-county-jail-experience-survey-report-and-response,Surveys,200,DocumentCloud,"",[],[],[],[],[],[] -2736,https://www.documentcloud.org/documents/23741389-allegheny-county-jail-needs-assessment-2022,Surveys,200,DocumentCloud,"",[],[],[],[],[],[] -2737,https://www.alleghenycounty.us/Government/County-Jail/Policies,Policies & Contracts,200,"Policies - Allegheny County, PA",Allegheny County Jail PoliciesSafety PoliciesSanitizing Procedures for Food Utensils and Drinking CupsSanitationInfectious Disease ProceduresWater SupplyFacility and EquipmentSecurity PoliciesManagement of Inmate RecordsImmigration Detainers and WarrantsTransfer of Articles...,"[""Policies""]","[""Allegheny County Jail Policies"", ""Healthcare Policies"", ""Governance & Administration""]","[""Safety Policies"", ""Security Policies"", ""Inmate Care Policies"", ""Programs and Inmate Services Policies"", ""Justice and Order Policies"", ""Administration and Management Policies"", ""Contact Us"", ""Quick Links"", ""Get Social""]",[],[],[] -2738,https://pcpa.memberclicks.net/accredited-agencies,Contact Info & Agency Meta,200,Accredited Agencies,"",[],"[""Accredited Agencies""]","[""Pennsylvania Chiefs of Police Association""]",[],[],"[""Return to PCPA Home"", ""Return to PCPA Home"", ""Return to PCPA Home""]" -2739,https://www.ucr.pa.gov/PAUCRSPUBLIC,Crime Statistics,200,Home,UCR Repository System,[],[],[],[],"[""Welcome to the Crime in Pennsylvania Dashboard"", ""Crime Dashboard""]",[] -2740,https://pittsburghpa.gov/police/manual-procedural-orders,Policies & Contracts,200,Pittsburgh Police Policies and Procedural Manual | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Manual Of Procedural Orders"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""Voice\u00a0 \u00a0 \u00a0 \u00a0 \u00a0Neutrality\u00a0 \u00a0 \u00a0 \u00a0 \u00a0Respect\u00a0 \u00a0 \u00a0 \u00a0 \u00a0Trustworthiness\u00a0""]","[""DEPARTMENT MENU""]","[""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Zones"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[] -2741,https://mappingpoliceviolence.us/,Use of Force Reports,200,Mapping Police Violence,"Official home of America's most comprehensive database of police violence. -Get the facts about police brutality and how to address it.","[""Mapping Police Violence"", ""Mapping Police Violence"", ""Police have killed 44 people so far in 2024. Police killed at least 1,243 people in 2023."", ""Mapping Police Violence""]","[""Learn More""]","[""Police killed at least 1,243 people in 2023. Black people were 27% of those killed by police in 2023 despite being only 13% of the population.""]",[],[],[] -2742,https://pasdc.maps.arcgis.com/apps/webappviewer/index.html?id=70c54a213ef94b659b6b77da88ed43b0,Contact Info & Agency Meta,200,ArcGIS Web Application,"","[""""]",[],[],[],[],[] -2743,http://wwso.co.goodhue.mn.us/cis_reports/jail%20roster%20internet.pdf,Incarceration Records,200,"","",[],[],[],[],[],[] -2744,https://www.cannonfallsbeacon.com/search/?q=police+reports&s=start_time&sd=desc&l=10&t=*&nsa=eedition,Incident Reports,200,Search results for 'police reports' | cannonfallsbeacon.com,"",[],"[""\n Search\n \n / 239 results found\n\n \n \n Showing: 1-10 of 239\n\n""]","[""\n\n \n\n \n The last two weeks' Goodhue County Sheriff reports"", ""\n\n \n\n \n Yesteryear: Mary Lou Endres is 'the rosary lady'"", ""\n\n \n\n \n The past two weeks' Cannon Falls Police reports"", ""\n\n \n\n \n This week's Goodhue County Sheriff reports"", ""\n\n \n\n \n This week's Goodhue County Sheriff reports"", ""\n\n \n\n \n This week's Cannon Falls Police, Goodhue County Sheriff reports"", ""\n\n \n\n \n 4 Tips to Gift Safely and Avoid Gift Card Scams This Holiday Season"", ""\n\n \n\n \n Cannon Falls Police, Goodhue County Sheriff reports"", ""\n\n \n\n \n Take Charge of Family Security: 5 Vital Actions for a Safe New Year"", ""\n\n \n\n \n Four Cannon Falls police officers receive their badges during pinning ceremony"", ""\n\n \n\n \n Cannon Falls Beacon"", ""\n \n About Us\n \n ""]","["""", """", """", ""\n \n Most Popular Stories\n \n "", ""\n \n Latest e-Edition\n \n "", ""\n \n Newsletters\n \n "", ""Cannon Falls Beacon e-Edition"", ""Headlines from Cannon Falls Beacon"", ""\n\n \n Weather\n \n \n"", ""\n\n \n Submit Your News\n \n \n"", ""\n \n Calendar\n \n "", ""Browser Compatibility""]","[""\n\n \n\n \n The last two weeks' Goodhue County Sheriff reports"", ""\n\n \n\n \n From St. Paul: The latest on Minnesota\u2019s new flag & seal, Red Flag laws & earned sick time"", ""\n\n \n\n \n Bomber grapplers fall to Stewartville on Parents Night"", ""\n\n \n\n \n Letter to the Editor: Keep our town alive"", ""\n\n \n\n \n Yesteryear: Mary Lou Endres is 'the rosary lady'""]",[] -2745,http://wwso.co.goodhue.mn.us/cis_reports/public%20warrant%20list.rpt.html,Wanted Persons,200,"","",[],[],[],[],[],[] -2746,https://www.muckrock.com/foi/detroit-314/shotspotter-policies-140369/#files,Policies & Contracts,200,ShotSpotter policies • MuckRock,MuckRock is a collaborative news site that gives you the tools to hold the government accountable.,"[""ShotSpotter policies""]","[""Communications"", ""Files""]","[""""]",[],[],[] -2747,https://data.lacounty.gov/datasets/lacounty::sheriff-all-shooting-incidents-for-deputy-involved-shootings-2010-to-present-deputy-shootings/about,Officer Involved Shootings,200,Sheriff All Shooting Incidents for Deputy Involved Shootings 2010 to Present (Deputy Shootings),All Shooting Incident Types for Deputy Involved Shootings 2010 to Present,[],[],[],[],[],[] -2748,https://www.alleghenycounty.us/Government/Departments-and-Offices/County-Council/Council-Meetings/Police-Review-Board-Meeting,Policies & Contracts,200,"Police Review Board Meeting - Allegheny County, PA","In 2021, Allegheny County Council passed legislation creating the Independent Police Review Board to receive and review allegations of misconduct filed by members of the public against police officers employed by the Allegheny County Police Department. The nine-member board is...","[""Police Review Board Meeting""]",[],"[""Contact Us"", ""Quick Links"", ""Get Social""]",[],[],[] -2749,https://www.lakesheriff.com/969/Use-of-Force,Use of Force Reports,200,"Use of Force | Lake County, CA",Gather information about documented use of force in Officer Involved Shooting and Critical Incidents in Lake County.,"[""\r\n\r\nUse of Force\t\t""]","[""Officer Involved Shooting (OIS) & Critical Incidents"", ""Objectively Reasonable""]","[""Loading"", ""Contact Us"", ""Quick Links"", ""Helpful Links""]","[""Administrative Office"", ""Assessor"", ""Community Development Department"", ""Tax Collector""]",[],[] -2750,https://www.cityoflamesa.us/1650/SB1421-Public-Records,Incident Reports,200,"SB1421 Public Records | La Mesa, CA - Official Website","","[""\r\n\r\nSB1421 Public Records \t\t""]","[""Penal Code \u00a7 832.7(b)(1)(A)(i): \""A record relating to the report, investigation, or findings of\u2026 an incident involving the discharge of a firearm at a person by a peace officer or custodial officer."", ""Penal Code \u00a7 832.7(b)(1)(A)(ii): \""A record relating to the report, investigation, or findings of\u2026 an incident in which the use of force by a peace officer or custodial officer against a person resulted in death, or in great bodily injury.\"""", ""Penal Code \u00a7 832.7(b)(1)(B): \""Any record relating to an incident in which a sustained finding was made by any law enforcement agency or oversight agency that a peace officer or custodial officer engaged in sexual assault involving a member of the public.\"" \u00a0 \u00a0\u00a0 \u00a0\u00a0"", ""Penal Code \u00a7 832.7(b)(1)(C): \""Any record relating to an incident in which a sustained finding was made by any law enforcement agency or oversight agency of dishonesty by a peace officer or custodial officer directly relating to the reporting, investigation, or prosecution of a crime, or directly relating to the reporting of, or investigation of misconduct by, another peace officer or custodial officer, including, but not limited to, any sustained finding of perjury, false statements, filing false reports, destruction, falsifying, or concealing of evidence.\"" \u00a0 \u00a0\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0"", ""Penal Code 832.7(A) (iii): A sustained finding involving a complaint that alleges unreasonable or excessive force."", ""Penal Code 832.7(A) (iv): A sustained finding that an officer failed to intervene against another officer using force that is clearly unreasonable or excessive."", ""Penal Code 832.7 (D): Any record relating to an incident in which a sustained finding was made by any law enforcement agency or oversight agency that a peace officer or custodial officer engaged in conduct including, but not limited to, verbal statements, writings, online posts, recordings, and gestures, involving prejudice or discrimination against a person on the basis of race, religious creed, color, national origin, ancestry, physical disability, mental disability, medical condition, genetic information, marital status, sex, gender, gender identity, gender expression, age, sexual orientation, or military and veteran status."", ""Penal Code 832.7 (E): A sustained finding made by any law enforcement agency or oversight agency that the peace officer made an unlawful arrest or conducted an unlawful search.""]","[""Loading"", ""Contact Us"", ""Site Links""]","[""No Record \u00a0 \u00a0 \u00a0 \u00a0""]",[],[] -2751,https://data.wprdc.org/dataset/arrest-data,Arrest Records,200,Pittsburgh Police Arrest Data - Dataset - CKAN,"","[""Pittsburgh Police Arrest Data"", ""City of Pittsburgh\n \n "", ""\n \n Pittsburgh Police Arrest Data\n \n \n \n "", ""Data Use Agreement""]","["" Organization"", "" Social"", "" License"", ""Data and Resources"", ""Terms of use"", ""\ud83d\udea7 Under Construction""]","[""Additional Info""]",[],[],[] -2752,https://data.wprdc.org/dataset/non-traffic-citations,Citations,200,Non-Traffic Citations - Dataset - CKAN,"","[""Non-Traffic Citations"", ""City of Pittsburgh\n \n "", ""\n \n Non-Traffic Citations\n \n \n \n "", ""Data Use Agreement""]","["" Organization"", "" Social"", "" License"", ""Data and Resources"", ""Terms of use"", ""\ud83d\udea7 Under Construction""]","[""Additional Info""]",[],[],[] -2753,https://www.traviscountytx.gov/district-clerk/case-information-records,Court Cases,200,Case Information & Records,"Welcome to the official website of Travis County, Texas. ","[""\n\t\t\t\t\t\t\tCase Information & Records\t\t\t\t\t""]","[""On This Page"", ""Online Case Records Search"", ""Official/Certified/Authenticated Document Copies"", ""Administrative Record Copies""]","[""Online"", ""By Mail"", ""In Person""]",[],"[""Can\u2019t find what you\u2019re looking for?""]",[] -2754,https://www.longbeach.gov/police/about-the-lbpd/lbpd-sb-978/,Policies & Contracts,200,"Policies, Procedures & Training (SB 978)","POLICIES, PROCEDURES & TRAINING SB978","[""Police Department""]","[""Policies, Procedures & Training (SB 978)"", ""Basic Academy Training\u00a0"", ""Field Training Officer Program"", ""Manuals, Orders & In-Service Training"", ""Ongoing Professional Training"", ""Records Retention Schedule""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""Training Division"", ""Senate Bill 978"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""LBPD SB 978""]",[] -2755,http://beaumontpd.org/1194/Crime-Statistics,Crime Statistics,200,"Crime Statistics | Beaumont, CA - Official Website",View crime statistics and check out our community crime map. ,"[""\r\n\r\nCrime Statistics\t\t""]","[""Crime Statistics and Calls for Service in the City of Beaumont"", ""National Incident Based Reporting (NIBRS)"", ""Beaumont Police Department Annual Report"", ""Press Log""]","[""Loading"", ""FAQs"", ""Contact Us"", ""Quick Links"", ""Connect With Us""]",[],[],[] -2756,https://data.lacity.org,List of Data Sources,200,"DataLA: Information, Insights, and Analysis from the City of Angels | Los Angeles - Open Data Portal","",[],"[""Menu""]",[],[],[],[] -2757,http://www.holmescountysheriff.org/public-information-request/,Records Request Info,200,Public Information Request – Holmes County Sheriff's Office,"","[""Public Information Request""]",[],"[""Public Information Request"", ""\nLinks & Downloadable Resources\n""]","[""Address"", ""Phone"", ""FAX"", ""Email""]",[],"[""The Holmes County Sheriff's Office""]" -2758,https://webmaster2166.wixsite.com/bartowso/online-forms,List of Data Sources,200,Online Forms | Bartow Co. S.O.,"","[""BARTOW COUNTY SHERIFF'S OFFICE"", ""104 ZENA DRIVE \u2666 P.O. BOX 476 \u2666 CARTERSVILLE, GEORGIA 30121"", ""CLARK MILLSAP"", ""SHERIFF ""]","[""ONLINE FORMS""]",[],[],[],"[""Main/Jail: 770-382-5050"", ""Non -Emerg/Dispatch: 770-387-5195"", ""Fax: 678-721-3206"", ""Emergencies:\u00a0Dial 9-1-1""]" -2759,https://rdx.stldata.org/dataset/crime-data-0,Crime Statistics,200,Crime Data | St. Louis Regional Data Exchange,"",[],"[""Primary tabs"", ""\n License "", ""\n Other Access "", ""\n Crime Data ""]",[],"[""Data and Resources""]",[],[] -2760,https://cityprotect.com/agency/4cdd5d7e-3326-4be1-9958-4b68c0270c91,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2761,https://data.wprdc.org/dataset/police-incident-blotter,Crime Maps & Reports,200,Police Incident Blotter (30 Day) - Dataset - CKAN,"","[""Police Incident Blotter (30 Day)"", ""City of Pittsburgh\n \n "", ""\n \n Police Incident Blotter (30 Day)\n \n \n \n "", ""Data Use Agreement""]","["" Organization"", "" Social"", "" License"", ""Data and Resources"", ""Terms of use"", ""\ud83d\udea7 Under Construction""]","[""Additional Info""]",[],[],[] -2762,https://www.burke.k12.ga.us/apps/pages/index.jsp?uREC_ID=324393&type=d&pREC_ID=733056,List of Data Sources,200,Records Request – Records/Transcripts – Burke County Public Schools,"The Burke County Public School District (BCPS) is located in Waynesboro, Georgia. They serve grades PreK-12. Home of the Burke County Bears!","[""Records Request""]",[],"[""SELECT THE BUTTON BELOW TO REQUEST STUDENT RECORDS:""]",[],[],[] -2763,https://collegeparkga.justfoia.com/publicportal/home/search,List of Data Sources,200,JustFOIA Public Portal,"",[],[],[],[],[],[] -2764,http://www.huroncountysheriff.org/contact.html,Contact Info & Agency Meta,404,"","",,,,,, -2765,https://csucpd.crimegraphics.com/2013/default.aspx#CLERYMenu,Crime Maps & Reports,200," - CrimeGraphics.com -","",[],[],[],[],[],[] -2766,https://inmates.seorj.com/ArchonixXJailPublic/Default.aspx,Booking Reports,200," -","","[""\n\n \u00a0\u00a0""]","[""\n SOUTHEASTERN OHIO REGIONAL JAIL""]",[],[],[],[] -2767,http://co.hardin.oh.us/sheriff/services.php,Resources,200,Hardin County Sheriff,"",[],"[""Services"", ""Contact""]","[""FEES: "", ""Webchecks:"", ""PAYMENT:"", ""RECORDS REQUESTS: ""]",[],[],[] -2768,https://cityprotect.com/agency/af073ea8-cc03-4171-99df-511e7047f348,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2769,https://cityprotect.com/agency/e8a9e4ae-3011-48f5-bb98-e22a7d3331b9,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2770,https://cityprotect.com/agency/220a9fbb-967f-41b9-a1a9-7f7022f2b1b1,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2771,https://cityprotect.com/agency/94080d2d-11c8-4896-82d9-cbd38ade5df6,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2772,https://cityprotect.com/agency/470018e6-48e7-4007-9fb7-077dbd34c572,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2773,https://cityprotect.com/agency/1f1336f9-4f15-4542-97f0-ea70b206149f,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2774,https://www.sheriffalerts.com/cap_main.php?office=54658,Sex Offender Registry,403,"","",,,,,, -2775,https://www.goldenwestcollege.edu/public-safety/statistics/index.html,List of Data Sources,200," - Campus Crime Statistics | Linfield University - - ","",[],[],[],[],[],[] -2776,https://cityprotect.com/agency/cf2638f7-c65d-4194-abc4-9feeedc209f2,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2777,https://sanduskycountyoh.gov/index.php?page=sheriff,List of Data Sources,200,"Sandusky County, Ohio - Sheriff","","[""Sandusky County Sheriff's Office""]","[""Links for information:""]",[],[],[],[] -2778,https://cityprotect.com/agency/mpd,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2779,https://www.opendatanetwork.com/dataset/www.dallasopendata.com/4gmt-jyx2,Use of Force Reports,200,Dallas Police Officer-Involved Shootings,"","[""Open Data Network"", ""Dallas Police Officer-Involved Shootings""]",[],[],[],[],[] -2780,https://cityprotect.com/agency/cowl,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2781,https://cityprotect.com/agency/5bba22f7-cd1e-4b02-beaa-4508c8d0996b,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2782,https://cityprotect.com/agency/lcpd,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2783,https://cityprotect.com/agency/55038d63-a7c2-4e66-80ec-9dc9127cd868,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2784,http://www.beverlyhills.org/departments/policedepartment/crimeinformation/crimestatistics/web.jsp,Crime Statistics,200,Crime Statistics,"",[],[],[],[],[],[] -2785,https://data.cityofberkeley.info/Public-Safety/Berkeley-PD-Calls-for-Service/k2nh-s5h5,Crime Maps & Reports,200,Berkeley PD - Calls for Service | Open Data | City of Berkeley,"","[""""]","[""Menu""]",[],[],[],[] -2786,https://bpd.crimegraphics.com/2013/default.aspx,Crime Maps & Reports,200," - CrimeGraphics.com -","",[],[],[],[],[],[] -2787,https://cityprotect.com/agency/5d2ef925-427e-4154-b775-d73e7b19f9da,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2788,https://data.wprdc.org/dataset/uniform-crime-reporting-data,Crime Maps & Reports,200,Police Incident Blotter (Archive) - Dataset - CKAN,"","[""Police Incident Blotter (Archive)"", ""City of Pittsburgh\n \n "", ""\n \n Police Incident Blotter (Archive)\n \n \n \n "", ""Data Use Agreement""]","["" Organization"", "" Social"", "" License"", ""Data and Resources"", ""Terms of use"", ""\ud83d\udea7 Under Construction""]","[""Additional Info""]",[],[],[] -2789,https://www.citruscollege.edu/campussafety/Pages/CampusCrimeStatistics.aspx,Crime Statistics,200," - - Campus Crime Statistics and Crime Logs - -","","[""\r\n\t\t\t\tCampus Safety""]","[""\n\r\n\t\r\n\t\t\t\t\t\t\tCampus Crime Statistics and Crime Logs\r\n\t\t\t\t\t \r\n\n""]","[""\nCampus Crime Log "", ""\nCampus Crime Statistics""]",[],[],[] -2790,https://data.cityofberkeley.info/Public-Safety/Berkeley-PD-Stop-Data-Jan-26-2015-to-Sep-30-2020-/4tbf-3yt8,Stops,200,Open Data | City of Berkeley,"",[],"[""Menu""]",[],[],[],[] -2791,https://www.gordonstate.edu/departments/open-records/index.html,List of Data Sources,200," - Open Records | Gordon State College - ",Gordon State College,"[""Open Records""]",[],[],"[""Georgia Open Records Act (O.C.G.A. 50-18-70)"", ""More Information"", ""Stay Connected""]",[],[] -2792,https://cityprotect.com/agency/impd,List of Data Sources,200,CityProtect,"",[],[],[],[],[],[] -2793,http://state.sor.gbi.ga.gov/sort_public/SearchOffender.aspx,Sex Offender Registry,200," - Georgia Sex Offender Registry -","In accordance with O.C.G.A. § 42-1-12, the Georgia Bureau of Investigation - (GBI) is the central repository for Georgia's Violent Sexual Offender Registry. - The Georgia Bureau of Investigation makes every effort to ensure that the information contained in - the Georgia Sex Offender Registry is accurate. As the information is provided by other agencies - and entities and is continuously changing, the GBI makes no promise or any express or implied - guarantee concerning the accuracy of this information.",[],[],[],"[""Conditions of Use:""]",[],[] -2794,https://www.cityofcartersville.org/DocumentCenter/View/4973/RECORDS-REQUEST-FORM-UPDATED-3-23-20211?bidId=,List of Data Sources,404,"","",,,,,, -2795,https://www.cityprotect.com/agency/carrolltonpd/download,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2796,https://loraincountysheriff.com/annual-law-enforcement-reports/,Annual & Monthly Reports,200,Annual Law Enforcement Reports,To view this year and past reports click one of the links below Annual Law Enforcement Reports 2022 Annual Report 2021 Annual Report 2020 Annual Report 2019 Annual Report,"[""Annual Law Enforcement Reports""]","[""""]","["""", ""To view this year and past reports click one of the links below""]","[""Annual Law Enforcement Reports""]",[],[] -2797,https://stewartcountysheriff.org/faq.htm,List of Data Sources,200,Stewart County Georgia Sheriff's Office FAQ,"Stewart County Sheriff and Sheriff's Office located in Lumpkin Georgia. Serving Lumpkin, Richland, Louvale, Red Hill and other rural areas in Stewart County.",[],[],[],[],[],[] -2798,https://cityprotect.com/agency/743e18dd-1384-4a30-a3f9-6ff22d321f25,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2799,https://police.losrios.edu/clery,Annual & Monthly Reports,200,Annual Clery Report | Los Rios Police Department,"Per the federal Jeanne Clery Act, Los Rios' annual Clery Report includes information about our safety and security policies along with crime statistics for all of our colleges and centers.","["" Annual Clery Report\n""]","[""Frequently Asked Questions"", ""Crime and Reporting""]","[""\nWho was Jeanne Clery?\n"", ""\nWhat types of crimes must be reported?\n"", ""\nWhat is a hate crime?\n""]",[],"[""Types of reportable crimes"", ""Geographical breakdown"", ""Hate crimes""]",[] -2800,https://www.cpp.edu/police/daily-crime-and-fire-log.shtml,Crime Maps & Reports,200," - Daily Crime & Fire Logs - ",Current and previous crime and fire logs for Cal Poly Pomona,"[""Daily Crime and Fire Logs""]","[""Popular Searches"", ""Click on the link to download report""]","[""\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Current Logs\n \n"", ""\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Past Logs\n \n""]",[],[],[] -2801,https://bcso.crimegraphics.com/2013/default.aspx,Crime Maps & Reports,200," - CrimeGraphics.com -","",[],[],[],[],[],[] -2802,https://home.chicagopolice.org/information/police-records-procedures/,Records Request Info,403,"","",,,,,, -2803,https://cityprotect.com/agency/a5f46abe-f050-4f93-b2a2-f5b9e3285041,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2804,http://cityofclaxton.net/,List of Data Sources,200,Home,"",[],[],[],[],[],[] -2805,http://www.buttecounty.net/sheriffcoroner/bookinglogs,Arrest Records,404,"","",,,,,, -2806,https://data.wprdc.org/dataset/police-zones,Geographic,200,Police Zones - Dataset - CKAN,"","[""Police Zones"", ""City of Pittsburgh\n \n "", ""\n \n Police Zones\n \n \n \n "", ""Data Use Agreement""]","["" Organization"", "" Social"", "" License"", ""Data and Resources"", ""Terms of use"", ""\ud83d\udea7 Under Construction""]","[""Additional Info""]",[],[],[] -2807,https://www.ci.brea.ca.us/DocumentCenter/View/1329/Website-Content-User-Policy,Records Request Info,200,"","",[],[],[],[],[],[] -2808,https://data.wprdc.org/dataset/police-sectors,Geographic,200,Police Sectors - Dataset - CKAN,"","[""Police Sectors"", ""City of Pittsburgh\n \n "", ""\n \n Police Sectors\n \n \n \n "", ""Data Use Agreement""]","["" Organization"", "" Social"", "" License"", ""Data and Resources"", ""Terms of use"", ""\ud83d\udea7 Under Construction""]","[""Additional Info""]",[],[],[] -2809,https://lrpd.crimegraphics.com/2013/default.aspx,Crime Maps & Reports,200," - CrimeGraphics.com -","",[],[],[],[],[],[] -2810,https://cityprotect.com/agency/0584dd4d-dffd-43bf-8052-03c3863991de,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2811,https://www.elcamino.edu/about/depts/police/cleryact/index.aspx,Annual & Monthly Reports,200,"Clery Act & Crime Prevention | El Camino College | Torrance, CA","","[""Clery Act & Crime Prevention""]","[""Search El Camino College"", ""Clery Act"", ""Crime Prevention"", ""Active Shooter"", ""Bike Theft"", ""Campus Safety"", ""Drug and Alcohol Abuse Prevention Program"", ""Identity Theft"", ""Megan's Law"", ""Prevention Info"", ""Victim Assistance"", ""What To Do if You're Stopped"", ""About El Camino"", ""Info for Students"", ""Info for Faculty & Staff"", ""Industry &Community Resources""]","[""Translate the Page"", ""Annual Security Report"", ""Purpose"", ""Obtain a Copy"", ""Additional Resources""]",[],[],[] -2812,https://www.athenssheriff.com/contact-us,Contact Info & Agency Meta,200,Contact Us | My Site,"","[""Contact Us""]","[""Administrative Office"", ""Jail Information\nOur office uses Southeastern Ohio Regional Jail (SEORJ) to house its inmates. For information on a prisoner, or to see if a particular person is in jail, call 740-753-4060 or visit the jail website at www.SEORJ.com."", ""Administrative Staff"", ""Lieutenants"", ""Detectives"", ""Deputies"", ""Community Relations & School Resource"", ""Athens County Crime Solvers Anonymous"", ""Athens County Government"", ""Athens County Health Department"", ""Athens County 9-1-1"", ""Common Pleas Court"", ""Municipal Court"", ""CONTACT INFORMATION"", ""Athens County Sheriff's Office"", ""13 W. Washington Street, Athens, Ohio 45701"", ""SEORJ""]",[],[],[],[] -2813,http://woodcountysheriff.com/services/publicrecordspolicy/,Records Request Info,404,"","",,,,,, -2814,https://cityprotect.com/agency/b5a393c6-c69e-4be3-b7cc-2b592b96d06e,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2815,http://alleghanycounty-nc.gov/sheriff.php,Contact Info & Agency Meta,200,"Sheriff’s Office – Alleghany County, North Carolina","","[""Sheriff\u2019s Office""]","[""Recent Posts"", ""Archives"", ""Categories""]",[],[],[],[] -2816,https://www.opendataphilly.org/,List of Data Sources,200,OpenDataPhilly,"OpenDataPhilly is a catalog of open data in the Philadelphia region. In addition to being the official open data repository for the City of Philadelphia, it includes data sets from many organizations in the region.","[""Welcome to OpenDataPhilly""]",[],"[""Browse by Category""]",[],[],[] -2817,https://public.coderedweb.com/CNE/en-US/D43D82D599C9,List of Data Sources,200,Community Notification Enrollment,"","[""Would you like to create a managed account?""]",[],[],[],[],[] -2818,https://www.dougherty.ga.us/public-safety/dcpd/obtain-reports,List of Data Sources,200,Obtain Reports,Doughterty County GA Website,"[""Obtain Reports""]","[""Quick Links"", ""Section Links"", ""How to Obtain Reports""]",[],[],[],"["" Board of Commissioners "", "" Citizen Info "", "" County Departments "", "" County Administration "", "" Judicial System "", "" Public Safety "", "" About Dougherty County "", "" Community "", "" Things to Do "", "" Public Resources "", "" News & Events "", "" Citizen Information ""]" -2819,https://cityprotect.com/agency/144ade76-2309-4dff-8a35-717df4cd4093,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2820,https://www.clayton.k12.ga.us/departments/safety_and_security/forms,List of Data Sources,404,"","",,,,,, -2821,https://www.atlantapd.org/i-want-to/ops-reports/-folder-133,Annual & Monthly Reports,200," - - OPS Reports | Atlanta Police Department - -","","[""Atlanta Police Department"", ""OPS Reports""]","[""Jump to subpage...""]",[],[],[],[] -2822,http://www.baconcountyso.com/contact.html,List of Data Sources,403,"","",,,,,, -2823,http://66.110.195.53/p2c_dcso/jailinmates.aspx,Arrest Records,200," - Dougherty County Sheriff's Office P2C -","",[],[],[],[],[],[] -2824,https://www.burbankpd.org/crime-information/crime-statistics/,Crime Statistics,200,"",Burbank Police Department provides daily arrest log and crime statistics for the City of Burbank,"[""Follow Us"", ""Crime Statistics"", ""Sign Up for our Newsletter/E-Alerts"", ""Follow Us""]","[""Burbank Police"", ""Resources""]","[""Documents""]",[],[],[] -2825,https://data.wprdc.org/dataset/officer-training,Training & Hiring Info,200,Police Officer Training - Dataset - CKAN,"","[""Police Officer Training"", ""City of Pittsburgh\n \n "", ""\n \n Police Officer Training\n \n \n \n "", ""Data Use Agreement""]","["" Organization"", "" Social"", "" License"", ""Data and Resources"", ""Terms of use"", ""\ud83d\udea7 Under Construction""]","[""Additional Info""]",[],[],[] -2826,https://data.cincinnati-oh.gov,List of Data Sources,200,Cincinnati Open Data Portal | Tyler Data & Insights,"","[""""]","[""Menu""]",[],"[""""]",[],[] -2827,https://cityprotect.com/agency/2e8bd965-60bd-4e70-886e-f0a24772e434,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2828,http://www.newtonsheriffga.org/records_faq.html,List of Data Sources,404,"","",,,,,, -2829,https://cityprotect.com/agency/1c052f54-adbd-480b-aa8b-a712c1c851f4,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2830,https://hsupd.crimegraphics.com/2013/default.aspx,Crime Maps & Reports,200," - CrimeGraphics.com -","",[],[],[],[],[],[] -2831,https://data.wprdc.org/dataset/police-civil-actions,Misc Police Activity,200,Police Civil Actions - Dataset - CKAN,"","[""Police Civil Actions"", ""City of Pittsburgh\n \n "", ""\n \n Police Civil Actions\n \n \n \n "", ""Data Use Agreement""]","["" Organization"", "" Social"", "" License"", ""Data and Resources"", ""Terms of use"", ""\ud83d\udea7 Under Construction""]","[""Additional Info""]",[],[],[] -2832,https://www1.nyc.gov/site/finance/sheriff-courts/sheriff.page,Policies & Contracts,200,Sheriff,"","[""Sheriff""]",[],"[""This Office enforces court mandates and processes including:"", ""The majority of our duties include:"", ""Forms"", ""General Forms""]","[""Sheriff's Bureau of Criminal Investigation (BCI)""]",[],[] -2833,https://cityprotect.com/agency/antiochcapolicedepartment,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2834,https://cityprotect.com/agency/mhpdnc,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2835,https://www.citruscollege.edu/campussafety/Pages/AnnualReports.aspx,Annual & Monthly Reports,200," - - Annual Security Report - -","","[""\r\n\t\t\t\tCampus Safety""]","[""\n\r\n\t\r\n\t\t\t\t\t\t\tAnnual Security Report\r\n\t\t\t\t\t \r\n\n""]",[],[],[],[] -2836,https://cityprotect.com/agency/maryvillepdtn,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2837,https://www.cypressca.org/government/departments/police/crime-information/crime-mapping,List of Data Sources,404,"","",,,,,, -2838,https://lithoniacity.org/CityClerk.aspx?CNID=3699,List of Data Sources,200," - Lithonia, GA - City Clerk -","Lithonia, GA - Official City Website","[""City Clerk""]","[""Occupational Tax Certificate (Business License) administrative fee and processing procedures"", ""Press Release Announcing a Proposed Property Tax Increase"", ""Trains Blocking Intersections? Report It Immediately."", ""COVID-19 Response"", ""Celebrating Black History Month"", ""About the Office of the City Clerk"", ""Ashley Waters""]","[""City Clerk"", ""Lithonia City Hall"", ""Follow Us""]",[],[],[] -2839,https://opendata.howardcountymd.gov/,List of Data Sources,200,"Howard County - Open Data Portal | Open Data Portal -","","[""Welcome to Howard County Open Data""]","[""Menu"", ""Money and Finance"", ""Public Safety"", ""Utilities and Public Works"", ""Community Services"", ""Recreation and Parks"", ""Planning and Zoning"", ""Energy and Environment"", ""Transportation"", ""County Administration"", ""Licenses and Permits"", ""Maps, Locations and Boundaries"", ""Demographics"", ""Health"", ""Libraries"", ""Education"", ""Economic Development"", ""Featured Dataset: Building, Electrical, Fire, Grading, Mechanical, Plumbing & Sign Permits: 2010 - Present"", ""Featured Dataset: Presubmission Community Meetings"", ""Featured Dataset: Capital Project Expenditures and Budgets: FY 2015"", ""Featured Dataset: Bus Routes""]",[],[],[],[] -2840,https://www.fresnostate.edu/adminserv/police/documents/,Crime Maps & Reports,403,"","",,,,,, -2841,https://cityprotect.com/agency/b0a52afd-b494-4168-a615-a0c6423284a3,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2842,https://cityprotect.com/agency/3a33f406-0418-42ff-b0ab-19d39bcbc652,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2843,https://www.ci.brea.ca.us/DocumentCenter/View/116/CrimeStats_Brea,Crime Statistics,200,"","",[],[],[],[],"[""Z\ufffdT\ufffd\ufffd\ufffd\ufffd/q\ufffd\ufffdX\ufffd{\ufffd\u0018\u0011\ufffd\u0010\ufffd\ufffd\u000bu\ufffdc\ufffd ,0o\ufffdT\ufffd\ufffdo\ufffd;\ufffd64s\ufffd3\ufffd\u0019Z\ufffd\ufffd\ufffdZ\u0013\ufffd\ufffd\ufffd\u0007+4\ufffd\ufffd\b\ufffd\ufffd\ufffd`\ufffd(\ufffd|.UWW;\ufffd\ufffd;+\ufffd\u069c1N\ufffdC\u0012\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdy#J\ufffd<\ufffdUz\ufffd\u02b6\ufffdT\ufffdH\ufffdE\ufffd\u00069\ufffd\ufffd\u0011\ufffd\ufffde\u0001\u044c\rh'\ufffd@\ufffdL\ufffd\ufffd\u06b2b\ufffdE\ufffd[\ufffd\ufffdR\u000b+\u0017.\u0126\ufffdU'\ufffd\ufffdm\ufffd\ufffd\ufffdgr\ufffd\ufffd\ufffd\b\ufffd1\ufffd\ufffd&\u0001\ufffd\u00148\ufffd'\u0016&\u0017D\ufffd{9\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\ufffdJg\ufffd\ufffd\u00104\ufffd\ufffd\ufffd3\ufffd\ufffd\b\u0019\ufffd_\ufffd\ufffd\u0002Dj\u0003\t\ufffd\u000e\ufffd\ufffd\ufffd\ufffd\ufffd4-C8\ufffd\ufffd\ufffdF']DB\u0007\ufffd\ufffd,\ufffd2J\ufffd\u0381\ufffd\ufffd\ufffdX\ufffd\ufffd\ufffdB\ud145*\ufffd\ufffdp,\ufffd?/\u0019\ufffd\ufffd\ufffdH\ufffd\u001c\tf\ufffd`\ufffd[ \u0013\ufffd\u0103\ufffd\ufffdI\ufffd\u007f\ufffd*\ufffd\ufffd\u0000\u00124\ufffd`u\ufffd\ufffd[\ufffd\t\ufffdhg\u001eJO\ufffds\ufffd\ufffd\ufffd\ufffd^v\ufffd\\<\ufffdt\u0004\ufffd24G\u0019ab\ufffd?\u001b.\ufffd\ufffd0\ufffdg\ufffd\ufffd\ufffd(H\u0014\u023f\ufffd\ufffd2\u007f\ufffd\ufffdsl\ufffd\u001d\ufffdsp\u0c43\u03d6\u037ev\ufffd}\r\ufffd\u001f\ufffdKu}mEMM}\u0005\f\u001f\ufffd\u007f\u0696\ufffd\ufffd\ufffd[\u0007\ufffd\ufffd3\u0019L\u067cm\ufffd\u06ad\u05ec \ufffdr&\u001fDcpa$\u03e7h\u0002\u0221\b\ufffd\ufffdGi\ufffd\ufffd\ufffd#\ufffdwV\ufffd\ufffd\ufffd\ufffdR\ufffd\ufffd|\u001e\ufffd\ufffd\""\u0014#\u6310\ufffd',\u062c\ufffd1\ufffd\ufffdRf\ufffd\u07b9\ufffd\ufffdo\ufffd20\ufffd\ufffd.\ufffd\nFn\u00128l*o\ufffdHX\ufffdd\ufffdeli6\ufffd/\u001a\u0012\ufffd\ufffd\ufffd(\ufffd\u001e\ufffd\u001be>\u0003g\ufffd\ufffd\u0c77\ufffd\b\ufffd\u001e\ufffd\ufffdO,\ufffd\u000b9\u0012\ufffd\ufffd\ufffd\u0234\b\ufffdh\u0015\n,J\ufffd9\ufffd/\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001eD_\u0019\ufffd\ufffdhQ8\ufffd8$I$>'~8\u0002\ufffd\u0013 |\ufffdBb\ufffd%\ufffd3\ufffd\ufffd9\u0016\ufffd\u001d\u001c6[\u001b\u0018{N\ufffd\ufffd\ufffdB[A\ufffdw\u0016O\ufffdajx\u0454\u0005\ufffd\ufffdx8\ufffdK$\ufffd\ufffd\ufffd\u0773a\u000f\ufffd\""\u001eo\ufffd;lzCI*T\ufffd\ufffd\ufffdK\u000f\ufffd\ufffd\ufffd&\ufffd\u0566)\ufffdI_\ufffd\ufffdv\u0010\ufffd/\ufffd\ufffdW\ufffd\ufffdD\ufffd\ufffd\ufffdv\ufffd\ufffd@ \ufffd\ufffd\ufffd:h\ufffd\ufffdtZ\u0018\ufffd\t6\ufffd,U\ufffd\ufffd#\ufffd\ufffd\ufffd(\ufffdF\ufffdY\ufffd\ufffd\ufffd}\ufffd)\ufffd=>#\ufffd\ufffd\ufffd\ufffd\ufffd\u0199\ufffd\u0014\ufffdU\ufffd\u000b\u0013\ufffd\u0016\ufffd\ufffd\ufffd\ufffdr\ufffd\ufffdW_\ufffdXL*\ufffdC\u0003o\ufffdx\u0007\u0017\ufffd\ufffd5\u001c\ufffd\ufffd\ufffdnh.\ufffdYC\ufffd\ufffdS\ufffd\ufffd\ufffd\\0\u0006}\ufffdg\u0010\ufffdK\ufffd\u0005|}\ufffd\ufffd\ufffd\ufffd\ufffdg\ufffd\ufffd\ufffd:\ufffd\ufffd\ufffdy*\u07abN\ufffd@\ufffd|;Q\ufffd\ufffdI\u001e\ufffd7\u001dq\ufffd\u0017\ufffd\ufffd2\u000b\u0005\ufffd#\""b\u0003f\ufffd\ufffdn\ufffd\ufffdM/A\ufffd\u03a8\ufffd\ufffdw\u0017T9\ufffd^\ufffd\ufffdZ\ufffdHu\u0012\ufffd\ufffd\u0014-\ufffd5wn\ufffd7\ufffd\u001f.=\ufffd\ufffd\u001ad5\ufffdt\ufffd\ufffd\u000f\ufffd\ufffda\ufffd\ufffd\u0004\ufffdu9\ufffdyKJ\u0003\ufffd4\u0018K`<\ufffd$\ufffd\ufffdPF\u0006\ufffd[\u0015\ufffd_\ufffd.-#\ufffd\\\ufffd2\ufffd\ufffdDYM\ufffd\ufffd\ufffde\uf8e7\ufffd\ufffdP\ufffd\f\u0001\ufffd#`\ufffd}\ufffdA`\u001c\ufffdO0\ufffdw\ufffd\ufffd;]\ufffd\ufffd#?\ufffd\ufffd\ufffdv\u001fg/c\u0000\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\u001a;C\u0019\ufffd:\ufffd\u000b\u0007\ufffdY\ufffd\b\u0002\n\ufffdQ\ufffd\ufffdR\u06a46\ufffdu\ufffdT\u0464\ufffd\t\fB|\ufffd\ufffd\ufffd\ufffd@O\ufffd\ufffd\ufffd\ufffd_\u0014tOfw\ufffd0\ufffdAA\ufffdc\ufffd:dK\u007fY\ufffd\ufffd\u0005Q\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd-\ufffd\ufffd\ufffd\ufffd\ufffdZ\ufffd\ufffdk1\ufffdb\ufffd\u0004x\ufffd:.P\ufffd[\fN\ufffd\ufffd\ufffd\ufffd\r5\u0005\ufffdJ'x\ufffd\ufffd2\ufffd\u0016\u0003\ufffd\ufffd\ufffd\b\ufffdhD\ufffd\u0408\ufffdp\ufffdK\ufffdz\u000e3\f\u07e2\u05a0\ufffd\ufffd\ufffd\ufffd\ufffdW\ufffd\u0019D8\u000b\ufffd\f\ufffd\ufffd\ufffd$Z\ufffdw\ufffdWT\u0004\ufffd/\ufffd\r\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdl\ufffdLf\ufffd\ufffd\ufffd3^D`9f$@HQ4,\ufffd\ufffd\u000234\u000f\ufffd\u00026\ufffd3D\u0018\ufffd\ufffd\u0000\ufffd\ufffdNg\ufffd\u001d\u0007\\\u2cb9\u001c\f\ufffd\n9\t\ufffd\ufffd|\ufffd\u0006.\ufffd\ufffd\ufffd\ufffd\ufffdK\u001a\ufffdyb\ufffd\ufffdO\ufffd`\ufffd\ufffdv\ufffd5\ufffd\u06cc\ufffd\ufffd\ufffdT\ufffdS\ufffd\ufffd\ufffd\ufffd\ufffd\u00eeZ\ufffd\u001c\ufffd\u0019s\ufffd\ufffd\ufffd\ufffd=\ufffdj\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\u0017\ufffd&\ufffd'\bJ\ufffd\ufffdeD\ufffdB\ufffd\u0002\u0001 \ufffdN\b\u0004|\ufffdc)\ufffd\ufffd8\u00068G\ufffdR\ufffd)M\ufffd\ufffd\ufffd!\ufffd\ufffdq\ufffd\ufffd\ufffd:\ufffd\u0002\ufffd\ufffdzf\ufffd\u0089+g\ufffd\ufffd\u0016\ufffdu\ufffd%\u0001\ufffd \r\ufffd*\ufffd\ufffd\u001a!9k\u0016Gi\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd \ufffd\ufffd\u01b1\n\ufffd\ufffd\u00136{\ufffdC\ufffd\ufffdb\ufffdJ\ufffd/\ufffd\ufffd\u0010\ufffd\u0519\ufffdXF\ufffdY\ufffd/\ufffd\ufffd\ufffd}|\u0014J\ufffd|\u000e\u0017?\ufffd\ufffd9\ufffd\ufffd\ufffd0\u001d\ufffd??\ufffdn\f\fc\ufffd\ufffdx2\u000f5+\ufffd\u00d1\ufffdl\ufffd\u0015\ufffd\ufffdl\u0001*>\ufffd\ufffd\u0001\ufffdRL\ufffd4\ufffd[\ufffd\ufffdQ\ufffdL~a\ufffd\ufffd\ufffd\ufffd\ufffdy\ufffd\ufffd\ufffd\ufffd~\ufffdS\ufffd\ufffdo\ufffd\ufffd\ufffd\ufffd>\ufffd\ufffd\ufffd4?yo\ufffd\ufffd<]\ufffd\ufffdy\ufffd\ufffd\u1d79S\ufffd-\ufffd\ufffd\u07b7b\ufffd\ufffd_]\ufffd\ufffd\ufffdS\ufffd\ufffd7u\ufffd\ufffdu\n\ufffd\ufffd\""+\u0010#+\ufffd\u0010\u0007h\ufffdDT *\u0016A=e\u0016A\u9c71\ufffd\ufffd\ufffdmM\ufffd7\u001dV\ua6a4\ufffd\ufffd\ufffd\ufffd\f\ufffdf\u0017>\ufffd\u0018\ufffd@\t\ufffd\ufffd\ufffd\b\ufffd\ufffd'\u0017\ufffd\u0004@\u0006\ufffd\u0000\u0002\u0017\ufffdB+x\ufffdu\f\ufffdi\ufffdF\ufffd\ufffd\u0019n\ufffd\ufffd\b\ufffdn>\ufffdG\u0012y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0019\ufffd\ufffd\ufffd\ufffdb\ufffd\ufffd\u0001\ufffd'3\u0007\u0016\ufffdHV\u0001\ufffd$\ufffd$\ufffd\ufffdE\ufffdy\ufffd\ufffd\ufffd*\ufffdl\ufffd\u0006\ufffd+\ufffd)D\ufffd\ufffd\ufffd}Z\ufffd\ufffdk\ufffd-k\""\u0003\ufffd^\ufffd\ufffdeSI\u0017\ufffdF\ufffd\ufffd_\u04f1\ufffd\ufffdy\ufffd>\ufffd\u007f\u026b\u007f;\ufffdt\ufffd\r{n\ufffdM\ufffd\ufffd$\ufffd\ufffd\ufffdv\ufffdu\ufffd\u0016\ufffd\ufffd\ufffd\u0275\ufffd^\ufffd\ufffd#?\ufffdYI\ufffd\ufffd\u0017\u0013Ab&\u001d\ufffd\ufffd\u0002P\f\u0010Z\ufffd\u00180\ufffd\ufffdO\ufffd\ufffdz\ufffd\u001e@\ufffd\ufffd\ufffd\ufffdB\ufffd\u0007z\ufffd\ufffd\u0006\u0000\ufffd\ufffd\u0741@\ufffdr\ufffdVg\ufffd8\u0014Y\u001c[\ufffd\u0007\u001fi<\ufffd\ufffd\bAG\ufffd\ufffd\ufffd0z\\\ufffd\ufffdC| \ufffd\ufffd\ufffd\ufffd\ufffdD!\ufffd\ufffd\u007f\ufffd\u0440\ufffd\ufffdGs\ufffd\ufffd\ufffd\\\ufffd\ufffd\ufffd;O\ufffd\ufffd/\ufffd\ufffd\ufffd7\ufffd\u0288V\ufffd\ufffdp\ufffds\u65b7\ufffd\ufffd=\u0002\ufffd-\ufffdaF\ufffd\ufffdb\ufffd\u0005\ufffd6\ufffd|\ufffd\ufffd\ufffd_\u001c9\r6\ufffd\ufffd\ufffd\u0394\ufffd\ufffdb\ufffdX^^}\ufffd\ufffd`\ufffd\u0553n\ufffd\u0013lG6\ufffd\ufffdy\ufffd\ufffd\""O!%\u001ai1!\u0011s%\\\u023dW\"" \ufffd\u0016\ufffd\ufffd$\ufffd\u001c\ufffd\ufffd\ufffd\u012c\ufffdXd\ufffd\ufffd\ufffd8\ufffd\u0019\ufffd\ufffd\ufffd8A\ufffd\ufffd^\u0004\ufffd\ufffd%)h^\ufffd\u0019\u00031;\ufffdJR\ufffd)\ufffd\ufffd\u7bc2\ufffd\ufffd~\u007f\u0526\u0016_e\ufffd\ufffd\ufffd3\ufffd\ufffd\ufffd\ufffd\ufffd2\ufffd\ufffd$\u000e\ufffd\""\ufffd\ufffdoB\u07b6\ufffd\ufffd *\ufffd\ufffdt\u0005\ufffdq\n\ufffd\ufffdf+\ufffdeC\ufffdM\u01f7\r\ufffd\ufffd:\u001f\ufffd\r\ufffd:^\ufffd\ufffd\ufffd\u0010\ufffd\u0010\ufffd\ufffd\ufffdI\ufffd\ufffdm\ufffdvG\""\ufffd\ufffd\u076a\ufffdn1[\ufffd\ufffd\ufffd\ufffd|\ufffd\u0321\n,\ufffd|)\u001a\ufffd\u007fu\ufffd^\ufffd\ufffd#s\ufffdob\r8Tk\ufffdG\u0465\ufffd\n6\ufffd+\ufffdZ\ufffd\ufffd\ufffd\ufffd\ufffdqm\ufffd\ufffdF\ufffd\u0526\u000fo\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\u03de\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0012\u035dS\ufffd]\u0014\ufffd\ufffd\ufffd5\u0007U'\ufffd7%\u014f\ufffd\ufffd\ufffd\u0679\ufffd?^\ufffd}\ufffdt\ufffdd\ufffdG\ufffd\u001f\ufffd\ufffd\ufffd\ufffde\u000f\u0002\ufffd]\ufffd\ufffd\u07a2\ufffd\ufffd7\ufffdR\ufffd\ufffd(\ufffd\ufffd\ufffdw{}a\ufffd<\u0014n\ufffdG\ufffdxh\u012dCD?\ufffd\""\ufffd\u00128\ufffd\u0015\n\ufffdb1\ufffd\ufffd\ufffdi\ufffdXm\ufffd\u0007\ufffdh\ufffd\u0404\ufffd\ufffdt\f8h1\u0000r\ufffdn\ufffd\ufffdSR\ufffd[\ufffd^oXiyo\ufffd\ufffdC\ufffd\u0007k\ufffd\ufffdX\ufffd\u0013\ufffd\ufffd\u07e5U*\ufffd$\ufffdS\ufffd\u00156\ufffdI\u001b\ufffd\u001cA\""\ufffdh\u5d32\u0002\ufffd\ufffd\ufffd\ufffdy+\ufffdo_\ufffd\ufffd}\u007f\ufffd\ufffd \ufffd\ufffd\ufffd^tT\ufffd\ufffd:\u001e\ufffd\ufffd)\ufffdN^1\u007f\ufffd\ufffd&\ufffd\ufffd\ufffd\ufffd\ufffd\u0016*\u0016^\ufffd\ufffd\ufffd\ufffdo\ufffdf>`\ufffdw\ufffd\ufffd\ufffdW\n\ufffd\u0524UK\ufffd\u001aS\ufffd\ufffdg\u001d\ufffd\u007f\ufffd\ufffd8\""\ufffdBV0\ufffd\ufffdP\ufffd\ufffd\u0018\ufffd\ufffd;\u0530\ubc02\ufffd\ufffd5j\ufffd\ufffd\t\ufffd\ufffd\u0014\ufffdT<\r\u000f?\\\ufffd\u0014OM\ufffd\u0012\ufffd3\u001bp\ufffd\ufffd0\ufffdW6\u0004\ufffdO\ufffd\ufffd\u000b\u00f3T\u001e\ufffdvt\ufffd\ufffd\ufffdl5i\""\ufffdjpt\u001b\u000e\ufffdI\ufffdJ\ufffd\ufffd-\ufffd\u05b7\ufffd\ufffd\ufffd]:\ufffd \ufffds\u001eGc\ufffd\ufffd\ufffd\ufffd\u0019\ufffd\ufffd\u000b\u05fc\ufffd\ufffd:o\ufffd\f\ufffd\ufffd\ufffd\u0007]\ufffd{\u0005_/Gc\ufffd\ufffd\ufffd\ufffdg\ufffdk\ufffd\ufffd(\ufffdA\ufffd\u000b7\ufffd\ufffd\ufffd\ufffdc\ufffdQ\u0003\ufffd\ufffd6\ufffd\ufffd\bqSu\ufffd\ufffd7}\ufffdu\ufffd\ufffd;!!\ufffd\ufffds\u000e\ufffd\u0002X0D\ufffdy\ufffd\ufffd\u0011C4a\u0010\ufffd\ufffd\ufffd\ufffd]\ufffd=\ufffdp\ufffd\ufffd/=\ufffd@\ufffd\ufffd\ufffdP\ufffd&\ufffdZ\ufffdm\u001c\ufffdc\ufffd\ufffd$\ufffd\ufffd\ufffd\ufffd\ufffd5\u001f?p\ufffd?\ufffd\u00183\ufffd;\ufffd\u0453(\ufffdIM\ufffdTq\ufffd\ufffdH%\ufffd\tD\ufffd\ufffd\u001b\ufffd>\ufffd<\ufffd\u001cf\u001e`\ufffd\""_\ufffd\u0013sa\ufffd\ufffdc\ufffd/\ufffd\u001f\ufffdrGy\ufffd-\ufffd\ufffd\ufffd\u001e@\ufffd:\ufffdfa$\u00062s\u0421\ufffdM\ufffd\ufffd\ufffdfC\ufffd\ufffdt\ufffdf\ufffdR\ufffd\ufffd\u0018.\ufffdg\ufffdq\ufffdGrg\u0014ro\ufffd\\`wH\ufffd\u0241\ufffd\u000b\u000f\ufffd\ufffd\u001d\ufffdYM\ufffdY\ufffd\ufffdI\ufffd6\u001c\ufffd+\ufffd\u001a\u0011\u000e\ufffd\nG\ufffd\ufffd\ufffd\ufffd\ufffd\u0015\ufffdt%\u001b\ufffd\u0001\ufffd\u07da)\u001d\u001a\ufffd\ufffd\ufffd93f?\n\\2\u001eEs\ufffd7\ufffdd~/O\ufffd\ufffdjI\u0019\u051aL\ufffd\\M<\ufffd\ufffd\ufffdB\ufffd}4/_]8.\ufffd\ufffdL\ufffdO'\u0002\ufffd\ufffd\u0007%\ufffd\u001fo\ufffd+\ufffd3\ufffd\ufffd2X \u001d\u001f4\ufffd\u007fji\ufffd\ufffd*\u0745\ufffd\ufffdC\ufffd\ufffd\ufffd*\ufffd\ufffd\ufffd9\ufffd\u007fn\ufffd\u001b:\ufffd\ufffdiW\u53ce\ufffd]o\ufffdJ\u0015\n1\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd[\u001f\ufffd\ufffd}\ufffd\ufffdU\u001b\ufffdY\ufffdUw\ufffd0\ufffd\ufffd\ufffd'\u001fj\ufffd7 \ufffd\u0018\u000bY_\u001cY\ufffd\u0007X32\ufffd<\u0016\ufffd\ufffdn,\ufffd\ufffd\u0004\u000b\u0018H\u0002\ufffd\u0000>\ufffd$Z\ufffd.\ufffd\u0004\bd\ufffd\ufffd\u007f\ufffd<\u001d!\ufffd\u0006\ufffd?\u0014\u000b\ufffd\ufffdc\ufffd\ufffd\ufffd\ufffd\u0000i\ufffdab\ufffd\ufffdw|oo\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd7,\ufffd\ufffdl\ufffd\ufffd[KV\u0015\ufffd$;\ufffd\u000e\ufffdd\ufffdz\ufffd\ufffd\ufffd-\ufffd6\ufffd\ufffdh\ufffd?\u000e\u000e\ufffd\ufffd\ufffdf\u0652\u001b\ufffd\ufffd]))'\u007f,\ufffd\u06d8_0{\ufffd\ufffd\ufffd\ufffd0\b)\ufffd\u001e!\ufffdQ\ufffd8\ufffd\ufffdJ\ufffdx\u0000\ufffdC%Y$\""w@\ufffd\u0010\ufffd\ufffd\ufffdU\ufffd\ufffd\ufffd\rP\ufffd\ufffd\ufffd\ufffd\u0011WE\ufffd\ufffdF\ufffd\u0019\u0011\ufffd\u001c\u001a\ufffd\u0002u\ufffd\ufffd{\ufffdw)\ufffd\u0724\ufffd\ufffd\ufffd\u0006\ufffd\ufffdCy(s\ufffd=\ufffdL\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000eM[\ufffd\ufffd\ufffd\ufffd}\ufffd\ufffd\u0015p\ufffd\u07d8\u000b%\ufffd\ufffdt\u0085\ufffdUS\""\ufffd\ufffd,\ufffd\u0019\ufffd\ufffd*\ufffd`\u0014\ufffd\ufffd\ufffd\ufffd\ufffdy\ufffd\u001f`\ufffd'\b\ufffd\u0014\ufffdX+\ufffd\u007fr\f#\ufffd[\ufffd@\ufffd{\r\ufffd\u04d1\ufffd\ufffd\u0012\ufffdY\ufffdCp%\b\u0108\u0011\ufffd\ufffd9\u0000\ufffd\""c\ufffd(\ufffd\ufffd@L\ufffdf\ufffd\u0004\u001b\u0015Y\u000b\ufffd\u0744Fwa\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\b\ufffdL\u001f\ufffd\ufffd08\ufffd\ufffd\u0017\ufffd94\ufffd5F\ufffds\ufffd\nA\u001c\ufffd\ufffdLj\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\b\ufffd0\ufffd\u000fE\ufffd#\ufffds\ufffd,\ufffd)\ufffd\ufffdJai\u001e\ufffd`@\ufffdp\u000e\ufffd\b\u0016!\u007f\ufffd\ufffd9N\u0004sv\ufffd\ufffd\t\fs\ufffd\ufffd\ufffd\ufffd\ufffdE&\u0000\ufffd\ufffdb&\u0002\u001d\u0013\ufffd\ufffdA_\ufffd\ufffd\ufffd\rz\ufffd\u001f*\ufffd}\u000bR\ufffdr\ufffd*r\u037ak\ufffd5t\ufffd\u01dbk\u00165\ufffd\ufffdo\ufffd\ufffdm_\ufffd_5z|\ufffd\ufffd\ufffds\u0017\u031e\ufffd@<\ufffd\ufffdvVId\ufffd\ufffd\ufffd\u03c7A\ufffd\ufffdk\ufffd>\ufffd\u0001Iv\u025c\u000f\u0017\u001e\ufffd{\ufffd\ufffd\u0487\u0000w\ufffd\ufffd\ufffd\u001b6o_?J\ufffdz[\ufffd\ufffd\ufffd=\ufffd6NZ\ufffdWH?\ufffd\ufffdf\ufffd\ufffd\u0016\u02af\ufffd\u001cJ\u0012Y\ufffdVh\ufffdOK\ufffd\u0016-~\ufffd\ufffd\u0010\ufffd\ufffdYXk\ufffd\ufffd\u0015\ufffd\u0014\u001a1B\n\ufffdVf\ufffdi\u001a#\u0019/\u0005I\u0019\ufffd\ufffdV\ufffd\u000f\ufffd\ufffd\u0167\ufffd'\u0724\ufffd\u001dC`\n{\ufffdp\ufffd-\ufffd\ufffdx+Ie\u001e?\ufffd\ufffd\ufffd\ufffd\u0692\ufffdE\ufffd0\ufffd\u0016\b\ufffd\ufffdZ\ufffd\ufffd\ufffd\ufffd-\ufffd8\ufffd\ufffd\ufffd\ufffd\u001eg^\ufffd\u411bN\ufffd\ufffdE\ufffd\u000b*\ufffdD\ufffd\ufffd& \u0012\u01fc\ufffd\r\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd7W\ufffdd\ufffd\u001ba\ufffd\ufffd\ufffd\ufffdV\ufffd\ufffd\u0018\t\ufffdx38\ufffd\ufffdF\ufffd}\ufffd\ufffdn\ufffd\u0018Z\ufffd{X\ufffd\u001f@\u0016\ufffd\ufffd\ufffdi\ufffd\ufffd\ufffdL\ufffd4\ufffd\u0017\u000f\ufffd\ufffdv\ufffd\ufffd\ufffd6\ufffd\ufffd\ufffd4\ufffd\u03d5kr\ufffdO\ufffdzt\ufffd\ufffd\u0f1dS\ufffd/0\ufffd\u0018\ufffdC\ufffdYd)\ufffd\ufffd\u0006X\ufffd\ufffdSw\ufffd\u0697\\\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdO\ufffd\ufffd\ufffd\u001c\ufffd\ufffd\ufffdy\ufffd\ufffd\ufffd\ufffd\ufffd0\ufffd\ufffd\u0002\ufffd\ufffd\u0002\ufffd\ufffd@xi\ufffd\ufffd\ufffdzq\ufffd\ufffdg\ufffd\ufffd\ufffd\u0010\ufffdR\ufffd\u0258\ufffdv\ufffdL\ufffdq\ufffd\""^\ufffd\ufffda7\ufffdt\ufffdBc\ufffd\ufffdh\ufffd\ufffdN\ufffd)w*\ufffd&\u0007\ufffd\ufffds9\ufffd\ufffd\u0766\u0016q@[\u001b\u0014*\ufffdn\ufffd\ufffd\ufffdR\ufffd\ufffd\ufffdU+\ufffd\ufffd\ufffdj\ufffd\u001b\ufffd\ufffdnb:\u001d\u000eqj8$r\u0014:\ufffd\u03a6\ufffd\""\ufffd3\ufffd&,\u0012\ufffd\ufffd\u0015\u0010|\ufffd\ufffd?\ufffd\ufffd8\\\ufffd\u001br\ufffd\u0017Q|\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdy\ufffd\u000e%[b\ufffd+\u001c<\ufffd\u0019^\ufffd\\\u0001\ufffd\ufffd0\ufffdw\ufffd(\ufffd\ufffd\ufffd\ufffd\u0016\u0017\ufffd\u0005\ufffd\ufffd\ufffdW[Vu4w\ufffd\ufffd\ufffd\ufffd&)n\u0734\ufffdy\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd.\ufffd\ufffd\ufffdl\ufffdw\ufffd\ufffd\ufffd\ufffd\ufffdy\ufffd\ufffd\u0246T\ufffdA\ufffd1:#Q\ufffd3\ufffdo\ufffd\ufffd3\u064at*\ufffd\u001e\""\ufffd\ufffd\u001e\ufffdY,4\n\ufffd\ufffdS\ufffd\ufffd\ufffdi#)3Z\ufffd\ufffd\u0000\u001a\ufffdv\u0015.\ufffdPI\ufffdZ\u0621\u0005\ufffdO\ufffd\u001e\ufffd\u0016\u0000)\ufffd\ufffd\ufffd\ufffd)H\ufffd\ufffd\ufffdUj\ufffdE\ufffd\u0017\ufffd\ufffd\ufffd\f\ufffdx\ue24c]\ufffd\ufffd\ufffd\ufffdl\ufffd\u031egt\ufffdB\ufffdk\ufffd\ufffd\u03c6\ufffd@\u001ay\ufffdg MIX\ufffd\ufffde\ufffd=\ufffd%\u03ee\ufffd\t\u0000\ufffd\ufffd\ufffd7\ufffd\ufffdNj\ufffd5\ufffdvJ=x\u0628\ufffd\t\ufffd\u02d9\ufffd`wy\ufffd\ufffd-/\u001dm\ufffd\u000fg?~]\ufffd\ufffd\ufffdJ\u0017x\ufffd+S\ufffd\ufffd\ufffd\ufffd\ufffdX\u07ba\ufffdz\u0013\ufffd\ufffd\u00014\ufffd\""\ufffdA-\ufffdom\ufffd\ufffdL\ufffdx:\ufffd\ufffd\ufffd\ufffd\ufffd2-Z\ufffd\ufffd\""s\ufffd\ufffd\ufffduZ\ufffd'\b\ufffdh\ufffd\ufffd\ufffdS\ufffd\u0011\ufffd%\ufffd\ufffd\ufffd\ufffd\u001aM\ufffdux\u0013B\u0019\ufffd\ufffd\ufffdc\u001c1\ufffd\ufffd\""\u007fr\ufffdK\ufffd\ufffd\ufffd\u05145U\ufffd\ufffd\ufffd?vl\ufffd\ufffd\ufffd\u0017<\u0005\ufffdB1\ufffd\ufffd\ufffd0iR\ufffd;P\u0006o\ufffd\ufffdVPs\ufffd\ufffdi['=}\ufffd\u04f7\b\ufffd)\u0002\ufffd^\u0333\u0016-Y\ufffd\ufffd\ufffd1\r\ufffdo\u0010\u01a0\ufffd\ufffd\u0005\ufffd\ufffd0\ufffd\u0013r\t\ufffd\u0018q\ufffdO\ufffd\u001e\u0487\u0097\bY\ufffdL(\ufffd\ufffdo\ufffdmc\ufffd\ufffd\""\u0386\""\ufffd\f'\ufffd\u001d\ufffd\ufffd\ufffd\ufffd\ufffd\u001e\ufffd\u05eb\u0015\ufffd\ufffd\ufffdG\ufffd\ufffd.\ufffd\ufffd\ufffd\ufffd\u0010\ufffdl\ufffd@\ufffdO~!\ufffdy\ufffd\ufffd\ufffd\u0019\ufffdR\ufffd\ufffd\ufffd\u0012@\""\ufffd\""Vk\u0004FN\ufffdV\r\ufffdzz}X\ufffd\ufffd\u04f4\ufffd\ufffd\u000b\ufffd\ufffdi\ufffd\ufffd1l\ufffd\ufffda\ufffd\b\u000e\ufffdBe\ufffdaQ\ufffd&\ufffdo\ufffd\u007fy\u0001^\u012f5\ufffdbF<6\ufffd\ufffdq\ufffd\ufffd\u001a3p\ufffd\ufffd\ufffd\u000f\ufffd\u001e^\ufffdd\ufffd\ufffd@w\ufffd\ufffd\ufffdgo\ufffd\ufffd\ufffd\ufffdY\ufffd\ufffdM\ufffdu\u0575\ufffd\ufffd\ufffdT\ufffdZ\ufffd\\\ufffdJQ_\ufffd\ufffdnoYY\ufffdX\ufffd|S\ufffd\ufffd\ufffdmXTV9\ufffd\ufffd~\u0781\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd:\ufffd|\u0294\ufffd\ufffd\ufffduF\u0007\ufffd\ufffd\ufffdh\ufffd64c\u001d\ufffd\ufffd\ufffd\ufffd<\ufffd\u0010\ufffdOi\ufffdP\ufffdS\u0620\ufffd4\ufffd\ufffd\uac29\u8409Hx\ufffd\u0011\ufffd\ufffd\ufffd\u0018\ufffd|7sf\ufffd\ufffdcI*>\ufffd\ufffd6\u0207\ufffd\ufffd9\ufffd\u00121W\u0016\ufffdN\ufffd\\\ufffd\ufffdG\u0006[\ufffd\ufffd\ufffdux\ufffd\ufffdG\ufffd>[W\u046a7\ufffdDn\ufffd\ufffd3*I\ufffd\ufffdq^\ufffd\ufffd\ufffd\ufffd\ufffd\u001d\ufffdM~\ufffd\u021f\ufffd\ufffd\ufffd\ufffdI\ufffd\ufffdO\u000f\ufffd\ufffduNK\ufffd\ufffd\ufffd\nZH\u001f\ufffd\ufffd\ufffd\u00041\ufffd\ufffd\u0010=\u000b\b\ufffd\u0018\ufffd\u00115\ufffd\u0018\ufffd\ufffd\u00bc\r\u0015\ufffd\ufffd\ufffd\ufffd-\ufffd\u001f\ufffd\ufffd3o\ufffd\u07f0-\ufffddZ\ufffd\ufffd{\ufffdI\u001a\ufffd\\\ufffdi\u0019@-E\ufffd{\ufffd\u02f4\f2\ufffd\ufffdnR\ufffdZ\ufffdgZz\ufffd{\ufffd\ufffd{vdZ\ufffd\ufffd\u0016\u001b\u06f23\ufffd2g\ufffd64\ufffd3\ufffd\ufffd]\ufffdO\b\ufffd\ufffd\ufffd\u0015\ufffd\ufffd6v\u0000\ufffd\r\ufffdna{y\ufffd\u0012\ufffd\""\u0509\ufffd\ufffd\ufffd\u000e\ufffdQ\ufffdk.\ufffd\u06ca\ufffd*\ufffd|\u020e7\ufffdg/\ufffd\ufffd\r\ufffd\ufffd\""\ufffds\ufffd\ufffdQ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdh\u0016\u001fAv\u0016\ufffdO\ufffd\u067b\ufffd\ufffdOz\ufffdO\ufffd`\ufffdD\u03d1\ufffd\ufffd\u001fe\ufffd\ufffd\ufffd~\u001b\u06ff3wg]\ufffd\ufffd\u0004\u0007\u03d4\ufffd\ufffd}\u000e\ufffd\u0015\ufffd\ufffd\bQO\ufffd\ud9b1\udccbC\ufffd1\ufffd\u007f\ufffd\ufffd:1b7\ufffd\ufffd.\ufffd\ufffdk\ufffd\u0018\ufffd\u0019\ufffd P\ufffd\ufffd\u001c\ufffd\ufffd\ufffdJw\ufffd\u0019\ufffd3\ufffd\ufffd\\J\ufffd\b\ufffd\ufffd$\ufffd\\\ufffdz\ufffd\ufffd?\ufffd\ufffd\ufffd\ufffdi\ufffd\b<\f\ufffd;U\u0010\ufffd\ufffdQ6\u001a\ufffd\ufffd_\fj\u001980\ufffd\u0010\ufffd_\ufffd79y(;\ufffdE\ufffd\u03b0@D\ufffd\ufffdI\ufffdJ\ufffd\u0006w*K`\ufffd.\ufffdx\u0011~\ufffd\r\ufffd{\ufffd)~\ufffd\ufffd\ufffd8\ufffd\ufffdX\ufffd/\ufffd$\ufffd\ufffd\ufffd\u0004\ufffd\ufffdv\ufffd\bc\u0013\ufffd\ufffd+w\ufffd\ufffd\ufffd\ufffd\ufffdY\ufffd4~ \ufffdG\ufffd\u0018\u0270~1BJ \ufffd\ufffdG\ud25a8ybQ\u00acQ\ufffd\ufffdi\ufffdI\ufffd\ufffd\u0019?5?|V\u0498\ufffd\ufffd\ufffdc\ufffd\ufffd\ufffd\ufffd\u0015'\ufffd\u000b\u000f\ufffd\ufffd89<\u014f\ufffd+W\ufffd\ufffd\ufffd\u0517j\fK\ufffdI\ufffd\ufffd\n\u0014\ufffd\ufffdE\ufffd\ufffduQb\u0005\ufffd\u000eI\ufffd\u001e\ufffd\u0017\ufffd\u0014L\ufffd\u001c\u001b\u001f&\ufffd0\u05af7\ufffd\u0014\ufffd\ufffd\ufffd)\ufffd\ufffdw\ufffd\ufffd\ufffd(\ufffd\u001a\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdvW\ufffd/Eu\ufffd\u000e\ufffdK\ufffdYha\u0016\f\u0729\u0006S-*UtL\u0018\ufffd\u0004\ufffdv\ufffd$HK$I\ufffd\u00121\ufffd\ufffd\u0189\ufffd\ufffd\ufffd\ufffd\ufffdYO\ufffd\ufffd5p\ufffd\u0015\u001d\ufffd?\ufffd-\u0018\ufffdL\ufffd\ufffd\u0526%\ufffd\ufffd\u00b8\ufffd0\u007f9m\ufffd\ufffd\ufffd\u048a>a0\ufffd\ufffd\u001b\ufffd\ufffd(!\ufffdQE\ufffd'\ufffd}\ufffdU\ufffd~\ufffd\u0011J\ufffd\ufffd\u000bXL\ufffd%\u000f\ufffd/f\ufffdZ\u0010\ufffd/\ud80e\udd94$'%\ufffd\ufffdK\n+\tM\b)Q'\ufffdJ\ufffd\t\ufffd\u0012Io\ufffd{\ufffdaF{}\ufffd&\ufffd\ufffd\u001dW\u0012`|``p\ufffd\u7346\ufffd\ufffdB\ufffd\ufffd~:$^\u0011\u001cI=\u0012\u0012\u001b \ufffdg\ufffd\t\ufffd\u000e\ufffdb\u28a2\ufffd\ufffdR\ufffd\ufffd\ufffd\u038a\ufffd\ufffd\u0000\ufffdX \ufffd\ufffd\ufffdR\u000bUa\ufffd\ufffd\\A\ufffdZ\ufffd\ufffd\ufffd\ufffd\u040c\ufffd\ufffd\u0001\ufffd\ufffd*\u0010\ufffd\ufffd\u057fN|\ufffd\ufffdQy\ufffd/\u036f\ufffd\ufffdc\ufffd\u0019 \ufffd>E}\u0016\u0013y?`z\ufffd\ufffd@E`U`U\ufffd \ufffd:\ufffdT\u0429\ufffd\ufffd\ufffd\u0007@\ufffd\ufffd\n\t\u0011\ufffd\u000f\ufffd\u0290\ufffd\ufffd\u001cu\ufffd\ufffd\ufffd\ufffdF\ufffd06l>\ufffd\ufffd}'\ufffd=\u0002'{,\ufffd\ufffd\u000f\""\ufffdA\ufffd\"">\ufffd3\ufffd\ufffd\u0019U\ufffd\u0017\u020a\ufffdmQ\ufffdD\u001d\ufffd\ufffd\ufffd\ufffd\ufffd\nni\ufffd\ufffd\u001d\ufffd\ufffdS\u0012\ufffd\u001b\ufffd\ufffd\ufffd0\ufffd\ufffd,c\u001ef61[\ufffd]\u0315\ufffd\ufffd\ufffd\ufffdXbRcv\ufffd|\u0017k\ufffd\ufffd\u0010\ufffd\u0016\ufffd\u00177\ufffd\u0208\ufffd\ufffdq\ufffd\ufffd\ufffd+\ufffd;\u0019\u001f\u001b\ufffd\u0013K\ufffd%Q\ufffd8=\t%=\ufffd\ufffdm\ufffd\ufffd~MX\ufffd\u0005\ufffd\ufffd\ufffd[R\u0002Sl^\u0498\ufffd`\ufffdz\""O\ufffd\ufffd-\ufffd\ufffd\ufffdC)G\ufffd\ufffdt\u0297)?\u0011\ufffd=U\ufffd\u001a\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\r\ufffdW\ufffd0\ufffd\u000f\u0011&-#\ufffd\ufffd\ufffdqi\ufffd\u0791\ufffd\u0003r6=&\ufffd\ufffd#\ufffd8\u0278\u000b\ufffd\ufffd\u02dc\ufffd\u0005\u001ey\ufffd\u0711;rG\ufffd\ufffd\u001d\ufffd#w\ufffd\u0711;rG\ufffd\ufffd\u001d\ufffd#w\ufffd\u0711\ufffdW\ufffd<\u0003\ufffd\u0010\f\ufffd\ufffd\ufffdv\u0015\ufffd\ufffd\ufffd\ufffd #\ufffd\ufffd$\ufffd\ufffd\ufffd\ufffdi\n\ufffd\bg\ufffdi\u0001\ufffd*\ufffdmh\ufffd\ufffd(\ufffd\ufffdB\ufffdV\ufffd\ufffdi\u0011\ufffd\ufffd\ufffdi1\ufffdw\ufffdi\t\ufffd\ufffdp\ufffdi)J\u0016\n\ufffd\ufffd\f\ufffdP\ufffd\ufffdi\ufffdD\ufffd\u0019K\ufffd\ufffd)\ufffd\ufffd\ufffd\u0012%)?\ufffd\ufffdn\u0334\u00073\ufffd\ufffd K\ufffd;\ufffd\ufffd\ufffdD\ufffd\u02a7\u0005H\ufffdw\ufffdO\ufffd(\ufffdo?\ufffd\u0016\""\ufffd\ufffda>-\ufffd\ufffd\ufffd|Z\f\ufffd3|Z\ufffd\u0006\ufffd\ufffd\ufffdi)\nRQ|Z\ufffdb\ufffd\ufffd\ufffdi9\ufffd\ufffdg,\u0005J\ufffd\u001f\u0127\ufffd(\ufffd\ufffd\ufffd\ufffdU\ufffdq\ufffdE|\ufffd\u0007\ufffd\u0005\f\u0006$\ufffdP\ufffd\u06d9Ksv\ufffd\u049c\ufffd\ufffd4gg.\ufffd\u0659Ksv\ufffd\u049c\ufffd\ufffd4gg.\ufffd\u0659Ksv\ufffd\u049c\ufffd\ufffd4gg.\ufffd\u0659K\ufffdx6\ufffd4g\ufffdq\u0200\ufffd\u0206,\ufffd\u000e\ufffd\u0291\u00031\ufffd\ufffdFV\u0010#\ufffd\ufffd\u000eJ\u02a1\ufffd\fu\u941e\t\ufffdj\ufffdkB\u001aT\u0007\u007f\ufffd\ufffd\ufffd\u001e\ufffd:P%\ufffd\ufffd{\ufffd\ufffde\u0016\ufffd\ufffd\ufffd\ub875\u0003~\ufffdB^G\ufffda\ufffdX\u0003.\ufffd@{<\ufffd\u0015Z\u001a\ufffd\ufffdZ^\ufffd\ufffd\ufffdk\ufffdn+\ufffdm0\ufffd\u0001\ufffd\u001c<\ufffd2\ufffd\u0003\ufffd\ufffdq\u0018\u024cp/7.\ufffd\u0007\ufffdm\ufffdT\ufffdr\ufffd\u001cR=y\ufffd\ufffd\ufffdY\ufffdJ\ufffd:\u88c5|*\ufffd\u0017\ufffd7\ufffd\u001f7\ufffd3N\ufffd\u0019\ufffd\ufffd1\ufffd\ufffd\ufffdI\u000b\ufffdon\ufffd\u001a~\ufffd\ufffd\ufffd\u0016fS\rc\ufffdy\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd}?\ufffd\ufffd\ufffd\ufffd2\ufffd.7\ufffd\ufffda\ufffd\ufffd\u06b6[\ufffd\ufffdh\ufffd\ufffd2\ufffd[;\ufffd\ufffd\ufffdY9\u0dc5\ufffd\ufffd\ufffd3p\ufffd\ufffdG\\\u0003\ufffd8\ufffdg\ufffd\ufffd\ufffdA\u01b3\u0012kj\ufffd~n\ufffd:(\ufffd!3\ufffd@\ufffd\ufffdf\ufffdqO\u04c3Uz\ufffd\u0017\u000b\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdf\bZ\ufffd7\ufffdzpK#\ufffd\ufffdw\u001c\ufffd\u001e\u001a\f\ufffd\ufffd^\ufffd\ufffd+\ufffd\ufffd[\u0019\ufffd\u0007\ufffd-#\ufffd\ufffd|[IlnE\u0003P\u0006H\r\ufffdt\u22de\ufffdK'c\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd \u05b1\ufffd\ufffd:(u\ufffd\ufffd\u000ei<\ufffdr\ufffd\ufffd\u0006\u4e27\ufffd\ufffd\ufffdZ\ufffd4\ufffd\ufffdB,\ufffdD\ufffd\ufffd\ufffd\ufffdPb#\ufffd\ufffd\ufffd>\ufffd\ufffdg\u0004a\ufffd\r*\bj\ufffd\ufffd\u0003\ufffd*\ufffd\ufffd3\u0014\ufffda\ufffd\ufffdv\u001ab?\ufffdc\ufffd=z\ufffd\u0002\u001d\u90f5\ufffd\ufffd\ufffd\ufffd\ufffdgu\u001a\ufffdqq\ufffdk\ufffdE\ufffdn\u05b9\ufffd\ufffdy\ufffdH\ufffd\ufffd2\u000fR\u0015$\ufffd\ufffd\ufffd\u0019\ufffd\ufffd\ufffd\ufffd:\u0497\ufffdrx\u0015q\ufffd\ufffd8\u0016\u0010\ufffdt\ufffde5\u0133:XA\u0006\ufffd\n\ufffd\ufffd\ufffd{VD\ufffd\ufffd\ufffdY\ufffd\ufffdS\ufffd+QK\""\ufffdwLw\ufffd\u001d\ufffdz\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdc\nC\ufffd\u03f1#\ufffd\ufffd^\u074c\ufffd\u0001\ufffd?Z\ufffdk\ufffdN8\ufffdc\ufffd\ufffdc\u0015;\ufffd\n\u0017w8\ufffd\ufffd\b\ufffdj\ufffdOo\ufffd\ufffd\ufffd\ufffdb\u0013\u0017\u0003\ufffd\u0019\ufffd\ufffd\u0015\ufffd8\u001b\ufffdQ\""\ufffd3\ufffd\ufffd\u0081z\ufffd\ufffd\b\u05647\ufffdB\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdn\ufffd\f\ufffd\u001a\r\ufffd 84\ufffd\u007f\r\ufffd,7\ufffd\ufffd\ufffdG=D\ufffd#\ufffd\u0010fV\""nW\ufffd\ufffdT\ufffdv\ufffd\u0013-\u001c\u0003L\ufffd\ufffd\ufffd\u001aZr\ufffd3\ufffd{\ufffd\u001dl\ufffd\ufffdo\u0001-=m2\ufffd\ufffd\ufffd\ufffdz\u000f\ufffd\ufffd\ufffd\ufffd\u02ed\ufffd\u06cb\ufffd\ufffd\u86ca\ufffd\ufffd\u0007\u0000\ufffd@\ufffd\ufffdVz!\ufffd\ufffdAa\ufffd\u001b\ufffd\ufffd|\ufffd\ufffd-fX\u0000I\ufffd~\u0010>\u02b0\ufffd=\ufffdA\u00ffCK\ufffd\ufffd\b\n\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd{\u0000.`\ufffd\u0006\u0012\u000b$\u0019`\u0014\u0007D)\ufffd\ufffd\ufffd\ufffd:X05f\ufffdE\ufffd\ufffdi=\r\u001f|mx:\u0016\u0012\ufffd \\Y!b\ufffd\ufffdx\ufffd\ufffdM\ufffd\ufffdh\ufffdiQ\ufffd\f\ufffdu|s\ufffd\u0010\u0012\ufffd,\ufffd\ufffd2\u0003`N\ufffd\u001d\n\u0010\ufffdg\ufffd\ufffd\ufffd\u001a`u\ufffd\ufffdn\ufffdu\ufffd\ufffd\tW\ufffd&\ufffd8\ufffd\ufffd%\ufffd_\ufffdDT\u0012\ufffd=L^\u0001\ufffdw\ufffd\ufffd\u07adTR\u0406\ufffd\ufffdv\u06ebT\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000f\ufffd\u0017\ufffdo\ufffd\ufffd\ufffd?i\u007f\ufffdv\ufffd\u0007\u0004@{\ufffd\ufffd\ufffd+\ufffdB\ufffd^\b\ufffd\ufffd!\u0011\u0096S\ufffdo&EJ8\ufffd\ufffd\ufffd\u001c\ufffd\u0007\ufffd(\u0001p\ufffd\n\ufffd\ufffd?\u001c\ufffd\u0007\ufffd\ufffdEh)Z\ufffd\u001e@\u001bQ\u0013\u0686\ufffd\ufffd\ufffd\ufffd\n\ufffd*Z\ufffd\ufffdF\u000f\ufffdO\ufffdj\ufffd-z\u0018]Fk(\u001a\ufffd\ufffd|\ufffdz*\u0014m\ufffd\ufffd\ufffdF*\u0003m\ufffd\n\u0463\ufffdH\ufffdYj\u0006\ufffd=e\ufffd.Pv:\ufffdr\ufffd6j9m\ufffd6\ufffd\u000ej;]C=O\ufffdR\ufffd\ufffd:\ufffd$\ufffd\ufffd\ufffd\ufffd^H}C/\ufffd\ufffd\ufffd\u0006\ufffdwz\ufffd\u0000p\n\ufffd\ufffd\ufffd.\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\u0001{2`/\u0000\ufffd\u0013\u0000\ufffdl\ufffd>\u000fJ\ufffd\u0000\ufffd2\ufffd\ufffd\u000e\ufffd7\u0003\ufffd=\ufffd{\u0005\ufffd\u001f\u0007\ufffd\u001f\u0002\ufffdV\ufffd~\t\ufffdw\u0000v\u0015`W\u0003\ufffdX\ufffd\ufffd\u000e\ufffd\ufffd\u0003\ufffd\u0011\ufffd}\u0012`/\u0003\ufffdu\ufffd}1`\u007f\b\ufffdo\u0000\ufffdO\u0001\ufffd\ufffd\ufffd\ufffd\r\ufffd\ufffd\u001e`\ufffd\f\ufffd\ufffd\u0000\u062f\u044b\u0004\""\ufffdA\ufffd\u0007\ufffd\ufffd\u00177\ufffd\ufffd\ufffd.\ufffd\ufffd\ufffd\u0017\ufffdG\u0002\ufffd|\ufffd>\u0002\ufffd\ufffd\u0001\ufffdf\ufffd\ufffd?\ufffd\ufffd\n\ufffdo\u0001\ufffd\u0000\ufffdK\ufffd\ufffd(`\ufffd\u0000\ufffd\u007f\u0001\ufffd\u007fB\u000fR\""\ufffd\ufffd\nD\u000f\u0003\ufffd5T\u001e`\u001f\r\u0627\u0002v\r`7\u0001\ufffd\ufffd\ufffd}\u0019`\u007f\f\ufffd\u001f\u0000\ufffd\u0002\ufffd\ufffd\ufffd\ufffdC\ufffd~\u000e\ufffd\ufffd\u0001\ufffd.\ufffdV\ufffdC\ufffd\t\""\ufffd\u0005\ufffdTz\ufffd` `\ufffd\u001b\ufffdO\u0005\uc940}aO\ufffd\ufffdS\u007f\ufffd\ufffd\u0016\ufffd/\u0003\ufffd\u001b\u0001\ufffdN\ufffd\ufffd\u001f\ufffd\u001f\u0001\ufffd\ufffdA\ufffd\u0017\ufffd\ufffd\u0007\ufffd\ufffd\u000e\ufffd\u0003\u0000{\f`\ufffd\u0002\ufffd\ufffd\u0001\ufffd\f\ufffd\ufffd\u0003\ufffdV\ufffd^\u000f\ufffdW\u0002\ufffd\ufffd\ufffd\ufffdi\ufffd~\u0014\ufffd\ufffd\u0004\ufffdg\u0001\ufffd9\ufffd\ufffd\u0006\u063b\ufffd\u001a\ufffd]\u000b\ufffd\ufffd\u0000\ufffd\u0002\ufffd\ufffd\u0010p/\u0012\ufffd\u0004\ufffdz\ufffd^\u0005\ufffdW\ufffd\ufffd.\ufffd\ufffd\u000b{_\ufffd\ufffd\u0002\ufffdG\u0000\ufffdi\ufffd\ufffd\n\ufffd\ufffd\u0002\ufffd\u0003\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd+\ufffd\u0781\ufffd(\u0019ZF%\ufffd\u0015T6ZI\r\u0003\ufffd\u001a\ufffd^\u0005\ufffd\u001b\u0001\ufffd&\ufffd\ufffd,`\u007f\u0005\ufffd\ufffd\u0000\ufffd\u001f\u0001\ufffd\ufffd\u0001\ufffd5\ufffdY\ufffd\ufffd\ufffd^\ufffdH]\u0010\ufffd\ufffdy\ufffdA\ufffdM0\ufffd\ufffd\u000b\ufffd\ufffd\u000eA\u0005`\ufffd\u0001\ufffd\ufffd\u0001\ufffdf\ufffd\ufffd\u001b\ufffd\u001f\u0002\ufffdo\u0003\ufffd3\ufffd\ufffd\u0015\ufffd\ufffd\ufffd]9\ufffd\u000b{\u0014`\u001f\u0004\ufffdg\u0003v\u000b`_\r\ufffd\ufffd\u0002\ufffd\u0016\ufffd\ufffd#\ufffd\ufffd\ufffd\ufffd\ufffdT4z\ufffd*\u0006\ufffd\ufffd\u0001\ufffd\t\ufffd/\u0004\ufffd\u0001\ufffdW\u0000\ufffd\ufffd\ufffd\ufffd\u000b\ufffd~\u0003\ufffd\u0015\u0004\ufffd\ufffd\ufffd\u0014\ufffdA\ufffd\u001fm\u0014\ufffdD\ufffd\u0005\ufffd\u0463\u00023`\u007f\u0000\ufffd\ufffd\u0000\ufffd{\u0000\ufffd\ufffd\ufffd-\ufffd\ufffd=\ufffd\ufffdEt\r\u001dG\ufffd\ufffd\ufffd\ufffd:ZG/\ufffd\ufffd\u0017\ufffd\ufffd\ufffdE\ufffd\u0011\ufffd\ufffd>E\ufffd?\u0003~\ufffdq<\ufffdJ\ufffdT\ufffdQ^^_^^\ufffd!\u0015C\ufffdP\ufffdKWHj\u068dP^nl\ufffd\n\ufffdT\ufffdVJ\ufffd6\ufffd\fI\ufffd\ufffd8\ufffd]\ufffd,\""C\ufffdy'i^`<\u0001\ufffd\ufffd\u0000g$\ufffd\ufffd\ufffd\u001e7\ufffdBM\u05e3j|\u0015BJ*\ufffdV\ufffd\ufffd\ufffd3b1\u0012\ufffd\ufffd\ufffd\u0575g\ufffdeb$\ufffd\ufffd\ufffd\ufffd\ufffd\u001a\ufffd\u0015\ufffd\ufffd\ufffd\ufffdm\ufffd\ufffdm\ufffdLL\ufffd$\u0005jh\u0003W=\ufffd\ufffd\ufffdm'\u0015\ufffd\ufffd?{\ufffd\ufffdl\ufffd_\ufffd.\ufffdx\ufffd\ufffd$\u0013\""\ufffd\ufffd\ufffd\u0014\ufffd\u0012\ufffd$\ufffdZ\u02a3\u0017\u02d1Xq\u001d\ufffd\ufffd\ufffd\\t\ufffd%H,i'\ufffd0 Im\u000b\\\ufffd\u0004\ufffdO\u000e\ufffdCH\ufffd\ufffd\ufffd[\ufffd\ufffdZ\ufffd\""\ufffdCii;\u0014W\ufffd\\\ufffd\ufffdJ\ufffde\ufffd2$\ufffd_t\ufffd\ufffd\ufffd.\ufffd\b\ufffd\ufffd\ufffd\u0000\ufffd\u0017+Q6\ufffd\ufffdN\ufffd\u0013h\ufffd\ufffd\u0012PB\ufffdK*\ufffd\ufffdBlc\u0017r\ufffdh\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd06\u0270m,\ufffd8\ufffd\ufffd\ufffdR\ufffd\ufffd\ufffd\ufffd\u001dR\u0011\u0005\u0019\ufffd\ufffdM\ufffd\ufffd\ufffdFj\nJ]\ufffd>\u001d\ufffd\ufffdj\ufffd--uk\ufffd\ufffd\ufffd\ufffdT\ufffdRm\u0015\ufffd\ufffd]\ufffd\u016d\""\ufffd\ufffd\ufffdu\u001fS\ufffd&\ufffdSR\ufffd\u0006b\ufffd:\ufffd\u001e\u0019\ufffd\ufffd\ufffd> \ufffdNlR)q\""\ufffd\u0006\ufffd\u0003\ufffd\r \ufffdL\ufffdd\ufffd\ufffdr-\ufffd\ufffd\u000e\ufffdjs\u001bX\ufffd@2Ekk\ufffd\ufffd\ufffdu\u000f\ufffdX\ufffdb\u05f9V\ufffd\ufffd\ufffd\ufffd8\ufffd\u0000C\ufffd\ufffd\ufffd.\ufffd\ufffdM\u00115Q.\ufffdV\ufffd!\t%\ufffd\ufffd$\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd7I@\ufffd4\\\ufffd\ufffd\ufffdY~n\u0016\ufffdp\u000f\ufffd$\ufffd\ufffdI\ufffd\ufffd\ufffd(v\ufffd\ufffd\ufffdoI\ufffdDb\ufffdO\ufffd\ufffd\ufffdr\""\u05ecb)\u0012K\u007f\""\ufffdn\ufffd$\""\u000fI0\ufffd.\ufffdt\u0005\u0005~\u007f \ufffdLF\ufffd\ufffd\u0005\ufffd\ufffdS\u0001\ufffd\ufffd\u007f\u0683&2\u0001%\ufffdh\ufffd\ufffdD\ufffdy\ufffd\ufffd \ufffdy\ufffdRKr\ufffdu\u001f\ufffd\u0014\ufffd\u0003\ufffdpT!\ufffd\u000e\ufffd\ufffd]\ufffdT\ufffd\ufffdq\ufffd\ufffd\n\u07ef\u00038E\ufffd\ufffd\ufffdY\ufffd##`\ufffd\ufffd\ufffd\u0014b\ufffd\ufffd\ufffd\ufffdB\u073a\ufffde&\ufffd\ufffd\u0015\ufffdLU\ufffd\\\ufffd\ufffdb\u03b8\ufffd\f\u011fa\\r)%\ufffdw\u0002)\u001a03:\ufffd\u0012J.\u001bT~\u0014O\ufffdh\ufffd \ufffd\ufffd\ufffd+:\ufffd\u000bS\ufffdn\u0462N$\u0017\""\ufffd\ufffd@\ufffdX\ufffd\\\u0553A\u001c\ufffd\ufffd\ufffd\ufffd\ufffdc\ufffd*/$\ufffd1\ufffd8\u0016\ufffd\u06aeG\ufffd4\ufffdK\ufffd\\\u6991\ufffdP\""\ufffd$\ufffd\ufffdU\ufffd#\r\ufffd\n&e\ufffdc\ufffd\ufffdID\ufffdD\ufffd\ufffd\u0004\ufffd\ufffdJd>bq\u0003\ufffd\ufffd\u001a\ufffd\u0018\ufffdji\ufffdp\u001d\ufffd\ufffd^\u0012iQyyaiC\ufffd\ufffdc\rr\u0019V\ufffdJA\ufffd\ufffd3N\ufffd9\ufffdl\ufffd\ufffd\u0002X8\ufffd\ua65cD\ufffd$\ufffdnjarIdH\""\ufffd\ufffdC\u0007F+\ufffd'\ufffd\ufffd^\""F\u0012\ta\u0019\ufffd\u6836Z\u000b6\ufffd\ufffdD\ufffd\ufffd8\ufffd\u0001\ufffd$\u0018\u001d?]<\ufffd\uda8b\udd4c\ufffdg\ufffd\u0007\u0016\ufffd:C\ufffdr9\u061e\ufffdZ%\ufffdt\ufffdp\ufffd\u0007l{\ufffdx\ufffdS@S\""Qk\ufffd\\\u0000\u0004sy\ufffd&\u0014\ufffd\ufffd\u03de]\ufffd\ufffd\u0618_\ufffd\ufffdn\ufffdb\ufffd\\\ufffdf\u001c\ufffdAj\ufffdO4\ufffd\ufffdR\ufffd\ufffd\u0006\ufffd\u07dd\ufffdNg\ufffdX\ufffdt\ufffd\ufffdd\ufffdl\ufffd\ufffd\ufffd\ufffd\ufffd<\ufffd\ufffd&\ufffdR\ufffd\ufffdcY\ufffd/T\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdb\ufffdxJ\tO<\u0011$\ufffd6\ufffd1\ufffd\ufffd\u0015>H\ufffd[\u02f4\u0014\ufffd8[`\u0006\u000bj\u0005-B\u0010i\ufffd_\ufffd\u007f\ufffdz\ufffd\\\ufffdE=%%\ufffdi\ufffdZ[\ufffd\ufffd3Kg\ufffd\ufffd\u0007\u0019VZ\\\ufffd\ufffdF\u0014\f\u0002\u0005G\ufffd\u0762\ufffd\r\ufffd3\ufffd\ufffd\ufffd$\ufffdlO\u0012\ufffdx\u0012*\ufffdH\ufffdI\ufffda!\ufffdZ\ufffdq\ufffd{\ufffdV!\ufffd\u0014r`\ufffd\ufffd\ufffd\ufffd\ufffd`\ufffdN\ufffd\ufffd\ufffd^4T\u0210B\ufffd\ufffd\ufffdO\ufffd\ufffd\u0010\""E7\u0011\ufffdKp\""\ufffd\ufffdd\ufffdo\u05aa9\ufffdv\u00183Q~\ufffdL\ufffd\ufffd\ufffd\u3b75\ufffd\u0010]\ufffd\ufffd\ufffd[2Q\u054b\ufffd\ufffd\ufffd\ufffd\ufffdLlq\ufffd\ufffd\ufffd5/r\u075a\ufffd\ufffd\ufffd\f\u0013\ufffdlY\ufffdM\ufffd\u0018~S&\ufffd\ufffd\ufffd\ufffd\ufffd\u0017\u0015\ufffd\u001bw\ufffd\ufffdS\u0001\u0015\ufffd\u001c\u0017)\ufffd\ufffd\u0379\ufffd\ufffdQ\n\u000f\u06f4\ufffd\ufffd\ufffd\ufffdD\u0133EZ\r\ufffd\ufffdF[\ufffd\ufffdS\n%4\ufffd\ufffdR\ufffd[\ufffd\ufffd\u0013\ufffd\ufffd\ufffd\ufffd\ufffd/\ufffd\ufffdRxq\ufffd\u001e/v\u0012-Ed\u0010\ufffd\ufffd\u00b9\""n@\u000f?A\ufffd\u001c)\u0014]\ufffd\u0016\u05eab%\ufffdH\ufffd\ufffd\u4ff8J\ufffd\ufffd(\u0013n3\u00fc\ufffd\ufffd\u0012J*\ufffdmQ\u0016\u001a\ufffd\ufffdJ\u0019R\ufffd\ufffd\\\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0016\ufffdc\u0000e\ufffd\ufffd\ufffd\u0004\ufffdD\ufffd\ufffd\f\ufffdx\ufffd@\u0003\ufffdDga9\ufffd\u001a\ufffd\ufffdS\ufffd\ufffd\b\ufffdr\ufffd\ufffdc\ufffd\ufffd8\ufffd\u058b\ufffd\ufffd\ufffd\u001ef\ufffd\ufffd)\ufffdH\ufffdEm8t\ufffd \ufffd\ufffd7\ufffd1\ufffd\ufffd\ufffd\ufffdR/UR)%\ufffd\ufffd\ufffdr\ufffd\ufffd{i>\ufffdC\f3\ufffd\u0005\ufffdV\b\u001b\ufffd\\\ufffd\ufffdn\ufffd\u0003\ufffd\ufffd\ufffd\ufffdS\ufffd4(\u000b$\u001c\u0004&\ufffdBR\ufffd+\u0005Z?\ufffd_n3\u0016\ufffdK\ufffd\ufffd^S\u0015\ufffd2\""9\ufffd\ufffd\ufffd\ufffd\ufffd\u0014&\ufffd\ufffdE\ufffd\u0002|fhkS\b\u0004\n\ufffd\ufffd\u0007\u3544\ufffd\ufffdu\ufffd\ufffd\u000e\ufffd)\ufffd\u0002\ufffd\ufffdCy\ufffdC!\ufffd\ufffd\ufffdSMb\ufffd\u050f\u0019\ufffd\u0669\ufffd\b\ufffdr\u0001f}\ufffd\u0012h\ufffd\u0087\ufffd\ufffd\ufffd\ufffd\u03ff\ufffd\u0014\ufffd|WW\ufffd\ufffd'\ufffdg\ufffdr\ufffdW\ufffd\ufffd\u0015\u0003i\ufffd\ufffd\u0016\ufffd\ufffd\ufffdE}\u001f7\ufffd\ufffd\ufffd\ufffd\u00bf\u05af\u0005\ufffd\u001f\ufffd\ufffd^a]\ufffd\ufffd\\\b\""-\ufffd+T\ufffd)\ufffd\ufffd\u000b\u065dx\ufffd\ufffdr\u065d\ufffd\ufffd\ufffd]H%\ufffdT\ufffd(g\ufffd\ufffd\ufffdlE\ufffdb\ufffd\ufffd(\ufffdRP*\u0015\ufffd\u001b\u0013\ufffd[\ufffd\ufffdx\u0001\ufffd[\ufffd\ufffdv\ufffd\u000f\ufffd\ufffdk+\ufffd-\ufffd\ufffd\ufffdx\bKE\u0001\ufffd\ufffd\ufffd\u0482\ufffdz\ufffd/\n\ufffd\ufffd[{\\\ufffd\u0004\ufffd\ufffd\t\ufffd\ufffdk\ufffd\u001d\ufffd \ufffdn=U\ufffd\ufffd\ufffdA\ufffd%\ufffdT+~k\ufffd\ufffd\ufffd\ufffd\u0002g\u007fg\u0004\u0014yW\ufffd\ufffd\ufffd t\u001e\ufffd\u0005\ufffd\ufffdQ\ufffd\ufffd\ufffd\ufffdgT\ufffdT\u0261W\u001b?F\r\u001c\ufffd\ufffdc\ufffd\ufffd-pD\ufffd\ufffd\ufffdo\b\ufffdA\u0018\ufffdB\u2909\u00149\ufffd\ufffdo0 \ufffd=?\ufffd]E\u0007\u0250\ufffdO]G\ufffd\ufffd?\ufffd\n\ufffdU\ufffd\u00165ja\ufffdO)jq\ufffd\ufffd\ufffdQ\u0763N\ufffdQ'\u001d\ufffd\u0014\ufffd\u001fe\ufffdS\ufffd\u02ff\ufffd\ufffd~\ufffd\u0013\ufffd\ufffd+\ufffd\u0019\ufffd\u0015|:\ufffd\u03a5\u0007\ufffd\ufffd`\ufffd\u025c\ufffd\ufffd\ufffd\u0018S\ufffdy\ufffd\ufffdX\ufffd\ufffd|\ufffdR\ufffd\ufffd{\ufffd+\ufffd\ufffdx\u0002\ufffd\u0006rCDl`\u001b#\u058ae\ufffdM\ufffd\ufffd\ufffd\ufffd(\ufffd\ufffd\ufffd1\ufffd\u0011\ufffd\u001a\u0004\u0014\ufffd\ufffd`ebQ\ufffd\u000f-\b\u0013!V#\ufffd\ufffd\ufffd)!\u0558\u000f7[\u0353\ufffdIl\ufffdWI\ufffd\ufffdHg8\ufffd\u0016\ufffd\u0004\b\ufffdv\ufffdhZO\u001e\ufffd\u000f\ufffd\ufffdF{)\u0013\u0006j]\ufffd\ufffdx\ufffd\ufffd\ufffdG_\ufffd:\u007f\ufffd\ufffd\ufffd\ufffdk8\ufffd`bs\ufffdz2\ufffd(<\ufffd6\ufffd\ufffd4\ufffd\ufffd+\ufffd\u0003\ufffdw\u001b\u001d\u001bx\ufffd\ufffd=\u054f/%\ufffd\ufffd\ufffd*\u000fZ8\ufffd \ufffd\ufffd\ufffd\ufffd\ufffd\n\ufffd\u0001\ufffd\ufffd\ufffd3\u0003X\u007f\ufffd\ufffd\u0006\u0227k\ufffd\u0006s\ufffd\ufffdb\ufffd\ufffdc}p\ufffd$@R\ufffd\u05d9,f]f$\u001b\ufffdK\ufffd\u0001A7}\ufffd\ufffd\u0019\ufffdF\ufffdz:@\ufffd]?\ufffd`\u04a7MvhLVf\ufffd\ufffd\ufffdld\ufffd*3\ufffd\ufffd\ufffd\ufffdg\ufffd\ufffd\u0016\ufffdf\ufffd\u0003\ufffd\u0002\ufffd,\ufffd\u417f\u0004\ufffd\ufffd\ufffd\ufffdzE\u0000=x\ufffd\ufffd\ufffdD6\ufffd\ufffdE\ufffd\ufffd\u001a\ufffd\ufffd\ufffd\u0130\ufffd\u00d9\ufffd\ufffd\u000f\u0018\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd?lpZ\ufffd\ufffd\ufffd\ufffd\ufffdx6\ufffd\ufffdP\ufffdM'4\ufffd{\ufffd\ufffd6R1\ufffd\u0006\ufffdD\ufffdn\ufffd|\u0011\ufffd\ufffd\u0005\ufffd\u0014\ufffd\ufffd\u0017\ufffd\ufffd)\ufffd3\u001f\ufffd8\ufffd\ufffd\u03e1\u07d6\ufffd\ufffdO\u0007o\ufffd\ufffd\ufffd\u001f\ufffd\u001e\ufffd\ufffd\u0717\u27f9w\ufffd\ufffdA\ufffd\ufffd\ufffd\ufffd\ufffd^2\ufffd\ufffd\ufffd_\ufffd\ufffd\ufffdlJ\n\ufffd\ufffdV\u3eed\ufffd5\ufffds\ufffd\ufffdM\ufffd\ufffde\u0767\ufffd\ufffd\u0013\ufffd/\u001e\ufffd\ufffd\ufffd\ufffd%\u0343\u001b\ufffd\ufffdk%\ufffdA\u001b\ufffd-z\ufffdy\ufffd\ufffd\u001e\ufffd\ufffd\ufffd\ufffd_?|\ufffd?_\ufffd1\ufffd\u0783{_\ufffdh\ufffd\ufffd.?\ufffd?\ufffdT\u027b\ufffd\u0607\ufffd\ufffd2N\ufffdnZ\ufffdnJ\ufffd1\u00eb\ufffd\u0007\ufffd\ufffd\ufffd~\ufffdk\ufffdw\ufffd+\ufffd\ufffdj\u001fQ\ufffd\u058f\ufffd\u0013\ufffd\ufffd)c\ufffd\ufffd\ufffd\ufffd~\ufffd\ufffd\ufffd=\ufffd\ufffd:\ufffd\\\u0767\ufffd\ufffd\ufffd_DO;Bn\ufffd\u01d0\u001ds&/Z-`\ufffd\ufffd\ufffd\b\ufffd\ufffd\u001f\ufffd8\u000b'\ufffd\ufffd>u\u056eK\ufffd\ufffd}i\u0161\ufffd\ufffdb*\ufffdF\ufffd\ufffd\ufffdb\u0011(\ufffd\ufffd\ufffdQ\ufffdH\u02de+\ufffdF\ufffd\ufffdqc.\ufffd\ufffdj\ufffd\ufffd\ufffdI\ufffd\ufffd\u000f\ufffd6=\u0005'nD=\ufffdH\ufffd\ufffd\""\""6\u0002L\u001a\ufffd#\f\u0016\u0006\ufffdkBj\ufffd~\ufffd\ufffdj\ufffd_Z\ufffd\ufffd\u000b{\ufffde!\ufffd\t\ufffd\""b\ufffdj6\ufffd\u0019\u0018\ufffd\ufffd\ufffdi\ufffd\b\ufffd\ufffdb\ufffd\ufffd\ufffd\ufffd\u000f\ufffd\ufffd;\ufffd{\ufffd\ufffd\ufffd\ufffd\u001bD\t\u01f1c\ufffd\ufffd\ufffd#\ufffd\ufffd7\r\ufffd\u001f%im\ufffd^\ufffd\ufffd\ufffd\ufffd\f\ufffd4\ufffd\u007f,g\ufffd\ufffd\u0011{\ufffd8\u0011H\ufffd\u000eM\ufffd\u0019b)\ufffdK\ufffdHBQ\u00b1\ufffd\ufffd\ufffd(w\ufffd\u00154\u0015\ufffd\ufffdY\u0015\u0019\u0000?\ufffd\ufffd\ufffdf\u0007\u001b\ufffd\ufffd\ufffd\u000b1\u0005y\ufffd\ufffd\ufffd\ufffdz\ufffd1KF}\ufffd\ufffd'\u000b\ufffd\ufffd\u0012/\ufffd\ufffd>*\ufffd\ufffd\u00077jN\ufffd\ufffd-\\\ufffd\ufffdT\ufffd\ufffd\ufffd\ufffdw\ufffd~\u001a\ufffd\ufffdhx\ufffd\ufffdq\u07deT\ufffdl\ufffd\ufffd\ufffd\ufffd\u0015~\ufffd\ufffdY\ufffd\ufffdh~\\';cK<\ufffd\ufffd1\ufffd\u00b1x\ufffdt\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd>\ufffd~\ufffd\ufffd\u026d\u01a2\ufffd\ufffd\ufffd$\ufffd\ufffd\ufffd~\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffdi\ufffd6G?T\ufffd4'\ufffd\ufffd\ufffd\ufffdw\ufffd\u02ce{\ufffd\ufffdk\r\ufffdN\ufffd\u001f\ufffdC\ufffd_&\ufffd=\ufffdu\ufffd\ufffd\ufffd\u0553,\ufffdM(V'\ufffd\ufffdXX\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffdK\ufffd\ufffd\ufffd7jN\ufffd\ufffdu\ufffd\ufffdv\ufffd\ufffdNzg\ufffd\ufffd\ufffd\u059e\u063e\ufffd\u02fc\ufffd\ufffd\ufffd\ufffdZ~\ufffd\rh\u000e\ufffd/y\ufffd\ufffd\u03d8\ufffd\ufffd\ufffd\u0015\r\ufffd\ufffd\ufffdQY\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd=\ufffd}\u05e9M5\u03f6\ufffd\ufffd\ufffdx}\ufffd\ufffd\ufffdI\ufffd\u0019\ufffd<\ufffd\ufffdzM\ufffd\ufffd\u001d\ufffd\ufffd2\ufffd\ufffd/\u000f\ufffd\ufffdQ\ufffdt\ufffd|\ufffd\ufffd\u02c5}\ufffdF1,\u0019\ufffd\ufffdw\u0014\ufffd\u0672\ufffd\ufffd\u000b\ufffd_K\ufffdc\u0014S@\u0014k\ufffdKbE\u0012\ufffd\ufffd-\ufffd(\ufffdz\ufffd\ufffd\ufffdl\ufffd0\u31eb\ufffdX\ufffd\u0016\ufffdL\u0012\ufffd\ufffd\u0642\ufffd\ufffd,\u0016$\ufffd\u000bf\ufffdY\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd[\ufffd\ufffdi4zm\ufffd\ufffd\u000b>\ufffd/^<:\ufffdi\ufffd\u0001\ufffd\ufffd\u0005\ufffd\ufffd4 z\u058b\ufffd\ufffd{\ufffd\u030e%\ufffdoV\ufffd\ufffd\ufffdscq\ufffd\ufffdK&\ufffd\\\ufffdR\ufffd\u00e7\ufffd\ufffd\ufffdC\ufffd7\ufffd9u1\ufffd\u001bN\ufffd\u0263kg\ufffd\ufffd\ufffd|\ufffdLtN\ufffd\ufffd\ufffd/o\ufffdrhM\ufffd\u001b\ufffdwwT\ufffd`\ufffd\ufffd\u049b\ufffd\ufffdd\ufffd\ufffd>\u0630~\ufffd\u001b\ufffdc\ufffd>\ufffdg\u0708\ufffd\u007fd\ufffd\ufffdz&\ufffd\ufffdi\ufffd\ufffd[\ufffd\ufffd\ufffd\ufffd_6\ufffd]\ufffdTF\u049bQ\u0013\ufffd?m\ufffd,\ufffd?~\ufffd\u046b\ufffdV\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd[\ufffd\ufffd8\ufffd\ufffd\ufffd9\ufffd_\ufffd\ufffd\ufffd\u0019\ufffd+\u0015\ufffd?V|\ufffd\ufffd\ufffdq7L#\u0007\ufffd\ufffd\ufffd\u0011\ufffd\ufffd\ufffd>\ufffdT\ufffd\ufffd\ufffdg\ufffd>\u001a\ufffdU;u\u0265\ufffdu\u0017\ufffd\ufffd9\ufffd\u007f\u001c\ufffd\u001c:\ufffd\ufffd\ufffdZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdLir\ufffd+\ufffd\ufffd\ufffd>(\u1fb6\ufffd>\u001f\ufffd\ufffd8\ufffdV=\ufffdI\ufffd\ufffd\u07f2\u0003\u0003b\ufffd\ufffdy{C\ufffdk\ufffd\ufffd\ufffd\r;\ufffd4\ufffd?\ufffd\ufffd?\u001a-8\ufffd\ufffd\u0799?\ufffd}yW9\ufffd\ufffd>6\ufffd\ufffd\ufffd\ufffdgK\u0004\ufffd$\ufffd\ufffd\u0007\ufffd\ufffd\u007f\ufffd\ufffd\ufffd\ufffd4_\ufffd\u000e\b\ufffd\u001c\ufffd\ufffdx\ufffd\ufffdq\ufffd\ufffd\ufffd\u02ff\ufffd\ufffd\ufffd\ufffdRU\ufffd\ufffd-\ufffd\ufffd\ufffd\ufffdk\u0230\ub1d7\ufffdS\ufffdr?MX6\ufffd\ufffd\ufffd\ufffd$\u01f5\ufffd\ufffd\ufffd\u007feE\u02d8\ufffd\u04b9\ufffd\ufffd=$\ufffd\ufffd\ufffd-{\ufffd\ufffd\ufffd\ufffd \ufffd?\ufffdk\ufffdG\u001f\ufffdI\ufffd=wa\ufffdi\ufffdbtr\ufffd\ufffdK\ufffd\ufffd\ufffd\ufffd\ufffd|\ufffdOn\ufffd\ufffdy\u0155\ufffdA\ufffd\ufffd->\ufffd-\ufffd\b&L\u001f\u0015\ufffd\ufffd\ufffd\ufffd>\ufffd\u001c\ufffd\ufffd\ufffdQ\u00dc\u05f6=\ufffd2\u071f\ufffd\ufffd\ufffd\ufffd\""\ufffde\u001e\ufffd\ufffd\ufffd\ufffd\ufffdC\ufffd]\ufffd|\\\ufffd\ufffd\ufffd_fV\ufffd\""\ufffd\ufffd\ufffd}\ufffd3/\ufffd\u001e\ufffdS\ufffdE\ufffdG\ufffd\u0004\ufffd'Vf/\u001b\ufffd\ufffd\ufffd\ufffd\\\u001bg\ufffd6S\ufffd\ufffdRs./<\ufffd`\ufffdOg\u0396\ufffdkN\ufffd\ufffda3\ufffd\u000b\u0012'\ufffd6\ufffd\ufffd}U_]\ufffd\ufffd\ufffd\ufffd3?\u000e\ufffd\ufffd&oj\ufffdZ\ufffd?\ufffd\ufffd\ufffd\ufffd?\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdg\ufffdE^\ufffd^1\ufffd\ufffd\u000bC\ufffd\ufffd\ufffd\ufffd4c\ufffd\b\ufffd&\ufffd\ufffd7\ufffd]\ufffd\ufffd\ufffdb\ufffd\ufffdY\ufffd\ufffdz\u7649\u0015\ufffdw^\ufffd\ufffd\ud978\udcff|W\u0017y\ufffd\ufffd\u0019\ufffd\ufffd\ufffdV\ufffdj\ufffdff\ufffdw};\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdB\ufffd0d\ufffd\ufffd3J\ufffd\ufffd\ufffdE\ufffd\ufffd\ufffd\ufffd_\t_\ufffd\u001d(\ufffd\ufffd\ufffd\ufffd#\ufffd\u0690\ufffd\ufffd\ufffd+2\ufffdw\u001d>\ufffd\u0740\ufffd\u03d3\ufffd\u0017\u07ed[\ufffd?\ufffd\ufffd\u007f\u9cf9/\ufffdh,\ufffdx\ufffd\ufffd\ufffd\ufffd\u3a67\ufffd5\ufffd0[zd\ufffd\ufffd\ufffd\ufffd~\ufffd2M\ufffd9NL\ufffdp\ufffd(\ufffd\ufffd\u001e\ufffd3\ufffd\u0007\ufffd5\ufffd\ufffd9$\ufffd\ufffd>\ufffd\ufffd!\ufffdT.[\ufffd\ufffd\ufffd\u02e9:*4\ufffd\u00066f\ufffd\ufffd!=\ne\u001e\ufffd\u0002\rS\ufffd\ufffd\u0019\ufffd\u001d6K,\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\u01a1g\u0006W;\ufffd\ufffd\u001cu8\ufffd\ufffd\ufffdl\u000e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u061e\ufffdI\ufffd\ufffd,\ufffd\ufffd\u03dd\ufffd\ufffd,\ufffdo\ufffdf\ufffd\ufffd\ufffdg\ufffd\ufffd%\ufffd\ufffdK\u000f=\ufffd\ufffd\ufffd\u07fc\ufffd\ufffd\u0609{O}\ufffd\u001e\u001f\ufffd{\ufffd]\u001f\ufffd\ufffd\ufffd`\u0019\ufffd\u001f%\u001fO\ufffd\u00104z}\ufffd!\ufffd\ufffd|/\ufffd\ufffd\u000f4\ufffd\ufffd\ufffd\ufffd\u007fZ!\ufffd\ufffd#\ufffd\u0736\ufffd%\ufffd\ufffd\ufffdeO\\\ufffdZ\u0011\ufffd\u06b1\ufffd\ufffd\ufffd\u007f\ufffd\u001f\ufffd\u0536#\ufffd\ufffd\ufffdy\ufffd\ufffd\ufffd\ufffd\ufffdN\ufffd\ufffd\ufffd\ufffd}C\ufffd\ufffd\u007f\ufffd\ufffd\ud904\udebf'}>b\ufffd\ufffd\ufffd%\ufffdHO|\ufffdi\ufffd\ufffd\u0012\ufffdt\ufffd\ufffd\ufffdk\u05b0\ufffdeWf\ufffdO\ufffd\ufffd\ufffd\u0266\u0003\u0017\ufffd75\ufffd\u007f\u0018pE\ufffd\ufffddS\u024b\ufffd\ufffdl\u001d\ufffd\ufffd\u001eY\ufffd\u062f|\ufffd\ufffdo?\u0012/\ufffd{\ufffdoKw\ufffd\ufffd\f\ufffd5n]zqjm'\ufffdX\ufffdD\ufffd\u0003\u020f\u001dq\ufffd\ufffd/cG\ufffdv'\ufffd\ufffda\ufffd;\ufffdiwh\ufffdrz6\ufffd\ufffd\ufffd\r\ufffdvw\ufffd\u03bdc\ufffd3\ufffdJ\u0002\ufffd\ufffd\ufffdDnS\u0018\u034ed\ufffd7\u000fm\u001e\ufffdTt\ufffd\ufffdbO\ufffd\rF\u0121\ufffdl\bS\ufffd6\ufffdQ,\ufffdn^\u001bB\ufffd\u007f\ufffdH\ufffd\ufffd1\ufffd\ufffdz\ufffd\ufffda\ufffd\ufffd\u07e6\ufffd\ufffd\ue947\ufffd}\ufffd\u00cb{k>;U7i\u001c\ufffd?\ufffdQ5\u02e4\f\ufffds\ufffd?\u0016>|(\ufffdL\ufffd\ufffd\ufffdLe\ufffd\ufffd\u000b\ufffd\u001d\ufffd\u0004\ufffd\ufffdb\ufffd<\u001e\ufffd}\ufffd\u332d\ufffd-K\u027e\ufffd\ufffd\ufffd3\ufffd\ufffd\u0013%sdM\ufffd%\u0006\u0011Ci03\ufffd\u001a\ufffd,!%k\ufffd\f\ufffd\ufffd\ufffd\u6511eB\u001c\u001c\ufffd=t\ufffd\ufffd-\ufffdA%\ufffd\ufffd\f\u0743[\ufffd{\ufffd\ufffd\ufffd\u039f\ufffd\ufffd\ufffd\ufffd-\ufffd\ufffd|\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd^\ufffd\ufffd\""\ufffd5^\u007f\u0536\ufffd\ufffd\ufffd\u0208(cdQ\u0015v1\ufffd}F\ufffdqn\ufffd6\ufffd\ufffd\ufffd9\ufffdxt\ufffd\ufffdk\ufffd\ufffd\ufffd7\u0013\ufffd\ufffdz\bu\ufffdI\ufffd\ufffd\ufffd\ufffdLS7!2R\ufffd\ufffd>\ufffd\ufffd\ufffd\ufffdC9?\ufffd\ufffd\ufffd\ufffd\u00164\u02fc\ufffd\ufffd\u001e\ufffdL%k\ufffd9\ufffd\ufffdh\ufffd5\ufffd\ue937?-VBo\ufffdM\b\ufffd\r\ufffdC0\\G1\u0010\ufffd<}^\ufffd\ufffdUv\ufffd\ufffdzv\ufffd\ufffd\u000b/\ufffd\u0007\u0799\ufffd^nTSt\u0265\ufffd\ufffd\u000e\u0003\u001b\ufffdv\ufffd\n\ufffd\ufffd\u0003Z\ufffd\ufffd\ufffdN\ufffd\ufffd\u0007\ufffd\ufffd\ufffd:\u0007\ufffd\ufffd\ufffdkWz\ufffdQ\ufffda\u0013\ufffd\ufffdF\ufffdY\ufffdLf\ufffdO\ufffd+\ufffd8\ufffd\ufffd\u0001G{ \ufffdwW\ufffd\ufffd\ufffdPPe\r\u0011ro\ufffd\u0011C\ufffd\u0013\u0017\ufffd\ufffd(U\ufffd0\ufffd\ufffd\ufffd4\u0013\ufffdp\ufffd\ufffd=\ufffd\u001a\u056c\ufffd4\ufffd`\ufffd\ufffdU\ufffd\u0005\u0007#C\ufffdj\n\ufffd\ufffd\ufffdls\ufffd\ufffdg\u0002N\ufffd\ufffd%\u0000xM\u001a\ufffd\b5gII\ufffd\u001bN)NU-\u001b\ufffd)u\ufffd!\b'\u000fA\ufffde\\\u001d\ufffdm\ufffd\ufffd\u0007\ufffd3[5\u0003j\ufffd\ufffd0\ufffd\ufffd\ufffd%i\u0019\ufffd:9\ufffdGe\ufffdtb\ufffd\ufffdn?\ufffd\ufffd\ufffd\ufffdi\u000fN,\ufffd\u0006l\\C\ufffd\ufffd\ufffd>d\ufffd\u001c'\ufffd\ufffdU\ufffd)\u001a\ufffd\ufffd\u0001\ufffdQ.\ufffdO\ufffd\ufffd\ufffd|\ufffd\ufffd\ufffd\u0015\ufffd3\u059a\ufffd\ufffd(\u0522(\ufffd4\u000f[H!\ufffd\u0004\t\ufffd'F\ufffd\u0005I\ufffd\u0010\ufffd\ufffd\ufffd\ufffd\u001c\ufffddi\ufffd\ufffd\ufffdV\ufffd\ufffdwb\ufffd-\ufffd\ufffd\ufffd\u001f\u0019=\u0003b\ufffda\ufffd>\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\n\ufffd\ufffd\u001a\u001d\ufffd\ufffdL\ufffd\ufffd}\ufffd\ufffd,=\ufffd\ufffd\ufffd\ufffd-|\ufffd\u001b\u0000\ufffd\r\u000f\u0010Y\ufffd\ufffdD\u0001\u05cd\ufffd-\u00140}\ufffd\u0002\u00a3\ufffd/K1\u0002\u0000\ufffd$\ufffd\ufffd_I\ufffd\u001dA\u0000\ufffdcC\u001d\u0001\ufffdi|\ufffd\ufffd\ufffd\""\u001c\ufffd,\ufffd\ud085\b\ufffd\ufffd\u001d\ufffdMv\ufffd\ufffd\ufffd\ufffd\\\ufffd\ufffdj \ufffd\b\ufffd\ufffd>\ufffd\u0007D\u001eS\ufffd\u01cb\ufffd\ufffd$\ufffd\r\ufffd!\ufffdS\u000e\u0016\u000f\ufffd\ufffd\ufffdB\ufffd\ufffd\u01d7\u001b8\ufffd^\u001f\ufffdm\ufffd\ufffd\u0003/\ufffd\u05e7\ufffd\ufffd6k\ufffd0\ufffd\ufffd\r\ufffdb8q\u001eQ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdd!\ufffdLy\ufffdt\u000ee\ufffd*gWj(\u9fefX\ufffd\ufffd[\ufffd2\u017e\ufffd\ufffd\u0010\u02d4W\ufffd$\ufffd\ufffd\u0010/l\ufffdp\ufffd\ufffd\u000b\u02b1\n\u7fa7P\ufffd\ufffdB\ufffd_\ufffdK\ufffdN\ufffd\ufffd\ufffdF\ufffd\ufffd\ufffd=\ufffd\ufffd=\u0530\ufffd$\u0014\ufffdr\ufffd\ufffd\ufffd\ufffd\ufffdA6\ufffd\u001e'\\\u001eRa\ufffd\ufffd\ufffd\ufffd\u0017R\ufffd\ufffd3\ufffd6\ufffd\ufffd\ufffd#nj#\ufffd\ufffd\u000f\u001c\ufffd\u056c@\ufffd\ufffd\ufffd\ufffd\u001a\u07bc\ufffd\u001fZ\u001e\u001a)\u072f[\u0016\ufffd<\u0019c\u001e!\ufffdH\ufffd\u067f\ufffd\ufffd\ufffd\\\ufffdb\ufffdX\ufffd\ufffd;\ufffd\ufffd\u00a4SV^\ufffd\ufffd~\ufffd3\ufffd\ufffd\ufffd\ufffd\ufffd\u69a4\ufffdl\ufffd\ufffd\ufffd\ufffd\ufffdS\ufffd\ufffdp\ufffdtP:\ufffd\ufffd\ufffd\ufffdL\ufffd\ufffd\u001f]\u0017\u06adhqIQ\ufffdO$1\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffde\ufffd4~8\ufffd\ufffd\u01f2\ufffdb\u0011\ufffd\ufffd^3n\ufffd\ufffdF\u4459\ufffd\u0463\ufffd\ufffd]\ufffd&\ufffdVO\u001f\ufffd\ufffd\ufffd0-t\ufffd\u001da=\ufffdc\u7779-\ufffdB(+\f#\ufffdE \ufffd\ufffd'\u0002\ufffd\u001a\ufffd\ufffd\ufffd&\u0013\u001ad\ufffd)id\ufffd \ufffd\u060f\ufffd\ufffd\ufffd5\u0004\ufffd\u0003'd\ufffdhF\ufffd\ufffd\ufffd\""\ufffd\ufffd\ufffd\ufffd\u03d8\""\ufffd\ufffd\ufffd\ufffdC3\ufffd\ufffd%\ufffdK\ufffdF\ufffdR\ufffdCg{gM&\ufffd\n\u0005|\ufffd\ufffd\u0005ag\t\ufffd\ufffd\u0731\ufffd\u5c08\ufffd\ufffdw\ufffdh!\ufffd\ufffd\u0362\u001b\ufffd\u0013\ufffd\u0012\ufffd\u05cd\\=\u0016\ufffdt\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK_\ufffdY\ufffd]\ufffdG\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u023c\ufffdak\ufffd\u0010\ufffd\ufffd\u000fsV*\u0003\ufffd\ufffdo\u0004\ufffd\ufffdn\ufffd\u0012\u0589\ufffdQ\ufffd\ufffd\nU\ufffd]i\b\ufffd@_\ufffd\ufffdVo\ufffd\ufffdU\ufffdv\ufffd~\ufffd\ufffd+\u0014MJ-/\ufffd\ufffd3\ufffdFX\ufffd\ufffd\ufffd\ufffd>\ufffd\ufffd\u001f;\ufffdLD\ufffd\ufffd\rb\ufffd\ufffdK7|\ufffdt\u0660\n\u0019\ufffd:\ufffdy\ufffd\u000fEC\ufffd4F\ufffd\ufffd\u000ei)o\ufffd,?IX2R\u001c\\\ufffdj\ufffdQ\ufffd\ufffd\ufffd-~[\""7\ufffd\ufffdz\ufffd\ufffd$]>5\u0354K\u0007\ufffd\ufffd'\ufffdW\ufffd\u0001!8\ufffd\u0428\ufffd\ufffd1\ufffdg\ufffd\u0006{\u0013{}\ufffdO\ufffdo\ufffd\ufffd_\tD[\u001e\ufffdSG\\\ufffd\u0013\ufffd\\\ufffd,\ufffd2\ufffd\ufffd)\ufffdVn\u001f\ufffd\ufffd\u001fPP\ufffdi\ufffdga\ufffdg\ufffd\ufffd\ufffd\u0012\ufffd\ufffdL\ufffd\ufffdO(\ufffd\ufffdG\u0012.\ufffd\u0004\b\ufffd\u001d/\b~\ufffd\u000f\ufffd\ufffdmp\ufffdr\ufffdl\u0010E\u001dN\ufffd\u001c\u001aXZY\ufffdO\ufffd-7\ufffd,/\ufffd}\ufffd\u0019ut\u0311\ufffdN\ufffd.k\bk\u0007kY\ufffd8\u007f\ufffd\ufffd\ufffd\u00c5\u007f4\t3\ufffd\u000e\u001d\ufffd\ufffdK~n\ufffd\u00136\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK6\ufffd\ufffd_J\ufffd\ufffdkb\u0313N\u0010ogPh,\ufffd\ufffd\ufffd;\u001e\""\ufffd\ufffd\u0519\ufffd\ufffd\ufffd\ufffdK\ufffd\u001a'\ufffd\u0017\ufffd\ufffd\ufffd&\ufffd\ufffdZ\ufffd\ufffdV\ufffd\ufffd\ufffd\ufffd\u000b\ufffd\n\ufffdL\u001fI\ufffd\t\ufffd|\ufffdH{\u0007\ufffd\ufffd\ufffd\ufffd\u01fe\u0003\u0013\ufffd}\ufffdJ\u0581Y\ufffd\u05c7\ufffd\ufffd\u0428\ufffd:\u001d\ufffd6f\ufffd4\ufffd\ufffd\u0014\u0019\ufffd\u000f!\ufffd\ufffd?\ufffd^\ufffd\ufffdv\ufffd\ufffd\ufffds\u001d9:\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd'\u0006-\u0019\ufffd\ufffd\ufffd\u0004c\ufffd\r\\v]\r\u001a}\ufffd\ufffd\ufffd\""\u001f'\ufffd\ufffd\u0019\ufffd\ufffd\\\n\u0010\ufffd\ufffd@\ufffd\ufffd@x\ufffd\ufffd\r\ufffd\ufffd\ufffd\u0006\ufffd\u001c\ufffd\ufffd\u009fn.>\ufffd\f\ufffdLp\ufffd\ufffd\ufffd.\ufffdY\ufffd\ufffdp.`w\ufffd\u0000 \ufffd\u04d0\u0019N_\ufffd$\ufffd\ufffd\ufffd\ufffd{_\u001cF\ufffd\ufffd\u009d\ufffd8\u03ccT7T\u0001\u001e\ufffd\ufffdp\ufffdm\u0000k\u0012\ufffd \ufffd]\u001f\ufffd\ufffd\ufffdN;\ufffd!\ufffd\u033f\ufffdl\ufffdm\ufffd\ufffd\ufffdWlf&22X=\ufffd\ufffd\u00b7\ufffd\u007f\ufffdi/\u0016\ufffdIL\ufffd^z\\\ufffd\r\u0011\ufffd\u000f?XNy4\ufffdr\u0006\ufffdC\""\u0004\ufffd\ufffd\ufffd\ufffd\ufffd\u0003AX1\ufffd\ufffdW\ufffd'>/zQL\ufffd\ufffd\u0015K\ufffd\ufffd\ufffdI\ufffd*\ufffd#\ufffdiU\ufffd=M\u0012P\u0006\ufffd\u0006\ufffd\u0424\ufffd\u0012\ufffd\u001b/`^.\ufffd\ufffdI\u001f\u025ep\u041fHK\ufffd\ufffdI\ufffdx\u03f6\ufffd\ufffd!\ufffd\ufffd\ufffd4N\ufffd\u0011\u02e0\ufffd[\ufffdL\ufffd4WC\u017b\ufffdc\ufffdM\ufffd\ufffd F\ufffd\ufffdF\ufffd\u001e\ufffd\u001d6lru\u001a\ufffd&\ufffd\ufffd\ufffd\ufffd\ufffd\u0015\u001c\u01b9\ufffdFt\ufffd'FF\ufffdYs\ufffd\ufffdy\ufffdB\u001fDRlE\u001a%y\ufffd\ufffd;f\ufffd]M\ufffd]\ufffd\ufffd\ufffd\ufffdh\ufffd\ufffdl\ufffd>\ufffd\ufffd\ufffdj\ufffd\u001bP\ufffd\ufffd\ufffd\u0001^\ufffd\ufffd\u000bk\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\u001ePy\ufffd\u0002\ufffd\ufffd\ufffd^\u0018J\u0676\ufffd sg\u001eM(\ufffd\ufffd\u000e\ufffd\ufffdv\r\u000b\ufffd{s\u001b\u0019\u000e\ufffd\ufffd\u0002\ufffd\ufffd\ufffdpU\ufffdo\""r\u0006\u007f\ufffd`\u0119mr\ufffd\ufffd2\ufffd *\ufffd\ufffd\ufffd\ufffdP\ufffdW\ufffdi3V\ufffd/>zw{9\ufffd\ufffdb\ufffd\u0001\ufffd\ufffd\bk\ufffd\ufffd\ufffd\ufffdB\ufffd#5\u007f\ufffdH\ufffd\ufffdxndK\ufffdt\ufffd6.\u053b\ufffdO\ufffdIS\ufffd\ufffd\ufffd\u01b1\ufffd\ufffdk\u0015~\ufffd\u008cU\ufffd^7j\ufffd\ufffdk\ufffdj+\ufffdX\u00131\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0005M\u0016\u012f\n7.D\ufffdtA\ufffd\ufffd\ufffdj\ufffdh\u0015\ufffd>\r2\u0007\u0018\u000b3\ufffd\u001b0\ufffdC1=\ufffd\u001ei\u0016fj\ufffd\u00067D\ufffd,\ufffd\ufffd\u01aa\u0007\ufffdK+tY?HY\ufffdI\ufffd\ufffd\u001fx\ufffd\u0011\ufffdDyq\ufffd\ufffd\ufffd\ufffd\ufffda\ufffd\ufffd\ufffd\u0013\ufffds\ufffd\f\ufffd\ufffd,\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdm7 \ufffda\ufffd#t[\ufffd\u059di\ufffd\u0015$\\\ufffd*'\u0010L>\ufffd\ufffd`\ufffd\u001az\ufffdy\ufffd\ufffd~2\ufffd}\u34dc\ufffd\ufffd\ufffd\u019b\ufffd\n\u0017\ufffd\ufffd-\ufffd'pk8RB\ufffd\ufffd\u0719JO\ufffd\ufffd{\ufffde\tx\ufffd,\ufffd\ufffd[\ufffd\ufffd6\u007f\ufffd\ufffd\u0007\ufffdA-\ufffd\r\nendstream\r\nendobj\r\n782 0 obj\r\n[ 220 0 0 0 0 0 688 0 0 0 0 0 0 332 205 0 554 554 554 554 554 554 554 554 554 554 0 0 0 0 0 0 0 623 611 563 662 575 537 611 687 324 307 0 537 815 0 653 568 0 621 496 593 648 604 921 0 0 0 0 0 0 0 0 0 488 547 441 555 488 303 494 552 278 0 524 271 832 558 531 556 547 414 430 338 552 504 774 483 504 455] \r\nendobj\r\n783 0 obj\r\n<>\r\nstream\r\nx\ufffd\ufffd}\u000b|T\u0575\ufffd\ufffd\u7719d\ufffdI\ufffdL2dHr&C\u0002dB&\u0244\ufffd\ufffd@&O \u0011\b!H\ufffd\ufffd&d\u0002\u0001#\ufffd\ufffd\u0007V Vy8<4>Z_Ul\ufffd\ufffd\ufffd\ufffdq\u0012l\u001b\ufffd\ufffdh)\ufffd^\ufffd\ufffdZ\ufffd\ufffdk\ufffd\ufffd\ufffdU)\u8d6dXI\ufffd\ufffd\ufffd3\u0013\u0003\ufffd\ufffd\ufffdw\ufffd\ufffd\ufffd~\ufffd\ufffd\ufffd\ufffdk\ufffd\ufffd\ufffd\ufffd{\ufffd\ufffd:G\ufffd\ufffd\u0018\u0011\ufffd\ufffd\u0014j\ufffd\ufffd\ufffdm\ufffd.cN2\ufffd\r\ufffd\u0010\ufffd\ufffd\ufffdU_R\ufffd{\ufffd`%\ufffd5\u001f\u0012\ufffd\ufffd[\ufffd\ufffdSr\ufffd\ufffd\ufffd\ufffdDl'j\ufffdu\\\u067e\ufffd;\ufffd\u0007*\ufffd\ufffd\u0289\ufffd\u078ek{TY\ufffd\ufffd\ue6bb\ufffd\ufffd\u001f\\\ufffd~\ufffd\ufffd\ufffd=d\ufffd\u0012\ufffd\u001eD#\ufffdVwoZ\ufffd#\ufffd\ufffdDW\ufffd\u0012\u001d\ufffd\ufffd\ufffd\ufffd\u001e\ufffdh\ufffdsG\ufffd\ufffd\b\u007fe]PX\ufffdNw\""_\ufffd\ufffd\ufffd\ufffd+{\ufffdOQg\u06d1\u007f\ufffd\ufffdf~\ufffdU\u001d\ufffd\ufffd*\ufffdH\u030e:3\ufffd\\\ufffd~\ufffd\ufffdI\ufffd\u0015\ufffdg]\ufffdW\ufffd\ufffd\ufffdi/\ufffdN\ufffdrb\ufffd\ufffd\u000f\u0532\ufffd\ufffd\ufffd\ufffd\u0006\u02cf\ufffd%\ufffd\u0002\u007f\ufffd;\ufffd_\ufffd\ufffdgd;\ufffd`R\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffdP>&\ufffd\ufffd\u0006mRz\ufffd:]#]\ufffd\ufffd\u0007\ufffd\u0011x\u001d\ufffd-\ufffdI\ufffd\u0007\ufffdL^\ufffd\ufffd\ufffd\ufffd\ufffd\u001a.\ufffd\ufffdu\ufffd.\ufffd$\ufffd\u001f\ufffd&\ufffdCZ\ufffd\ufffd+I:M\ufffd\ufffd\ufffdT.}\ufffdV\ufffd\ufffdi\ufffd\ufffd'Z\ufffd\u07a1F\ufffdT%\u03e5*\ufffd4\ufffd\ufffdv\ufffd8\ufffd\ufffd\ufffdW~M\ufffd\ufffdE@\u0001\ufffdh6\ufffd.\ufffdn\ufffd\ufffd\ufffd\ufffdt\ufffd4\ufffd\n\ufffdF\ufffdRh\ufffd\ufffde\ufffdHo\ufffd\u0004.KO\u04bc\ufffd\ufffd\ufffd\ufffdz)\ufffd\ufffdQ\ufffdv\ufffd\ufffd=$\u0366\ufffd\ufffd\ufffd\ufffdma\ufffdsb\ufffd\ufffdJQ\ufffd\u001b\ufffd-0\ufffd\ufffd\ufffd\ufffd:\u0018\ufffd\u0018\ufffd(F\ufffd\u0003I\u03a5\ufffd\u03e3]\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd-\ufffd/*\ufffd5\ufffd\""_\ufffd\ufffd%J9\ufffd\u0004\ufffd\u001c\ufffd\ufffdA\u000er;\ufffd\u001f\ufffd\n\ufffd\ufffd\ufffd\u0001_\u0007\ufffd\u0000{\ufffd]\u0019\ufffdV\ufffd\ufffdM\u049bT \ufffd\ufffd\ufffd\ufffd\ufffdx\u000e\u000f\ufffd\u001c\ufffdmZ\ufffd,\ufffd\ufffd\ufffdW\ufffdo\u001d\ufffd\u0007\ufffd\ufffd\u0005;` \ufffd\ufffd\u000e\ufffd\u0003\ufffd\u0004|\u0011\ufffdK\u062d\ufffd\ufffd\\\ufffd\ufffd\ufffdj\ufffd\u0002t\u0000\u001b\ufffd\ufffd\ufffdv`5pcD\u007f\ufffd\ufffd\ufffd\ufffdy\ufffd\ufffd<\ufffd\ufffdW\ufffd\u001fid\ufffd\ufffd\u01b3\ufffdB\ufffd\ufffd\u0015\ufffd\u02c0T\ufffd~\ufffd\ufffd\ufffdg\ufffd\ufffd\ufffd\u001f(W\ufffd\u0360\u0015\ufffdAZ!\ufffd_\ufffd|ID\ufffd\u0017\ufffdY\u001f\ufffdJy9\ufffd\ufffdE\ufffdC\ufffdEN\ufffd2\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd6\ufffd\ufffd\ufffd\ufffd2\ufffd\ufffd\u0018-\u000f\ufffd\ufffd\ufffdQ\ufffd\ufffdt:4)\u0017\ufffd\ufffd(\u00a7\ufffd]\rj\ufffd&\u874e\ufffdf\ufffdFM\ufffd\u001c\ufffd#\ufffd+\ufffd\ufffd\u029d\u0001\ufffd\ufffdV-+\ufffd\r\u0004.\ufffdIL\ufffd\ufffd\ufffd\u0005\u075c\ufffdB\ufffd~\u3e1aZ\ufffdR\ufffd\ufffd\ufffd;\ufffdl\ufffd\ufffdL9iT\ufffdMr\ufffd#fH\ufffd\u001by4\ufffd\ufffd\ufffd\ufffdR4f\ufffd\ufffd.\ufffd\ufffd\u0004\ufffdv\ufffd\ufffd\""1\ufffd\u000b\ufffdu\ufffd\u0005\ufffd \ufffd\ufffd\ufffdObz&\u001cQ\ufffd\u001aRC\u036d\u0016/D\ufffd\ufffdF\ud645\ufffd\ufffd\ufffd\t5\ufffd\ufffd\ufffd\u0004(H(\ufffd?!\u0011\ufffdD\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd8\ufffd\tA2\ufffdM\ufffd(>\t\ufffd\ufffd\ufffd\ufffdq\ufffd\ufffd\ufffd\ufffd\ufffd \ufffdj\u00117\ufffd\ufffd|R282\ufffd{l\u0011\ufffdZTJ\tK\ufffdNh\ufffd\u001a-.\ufffd\tu\ufffd\ufffdo\ufffdh\ufffd\ufffd_0\u0014\ufffd=h\ufffd\ufffdmnc\ufffd\u0015l_\u07aa\ufffd\ufffd0\ufffd'9\ufffd\ufffd\ufffdE\u001b\ufffd\u0634\u0014*4\u0005\ufffdu\ufffd|\ufffdk\u0005\u34e7\ufffdu\ufffd!\ufffdm\u001b\ufffd\ufffd\ufffdO\ufffdy\ufffd`Wg\u001b_&\ufffd\ufffdU\ufffd2V\u04fa\ufffd9\ufffd\u042cH\ufffd4\ufffd[K\ufffdY\ufffd\ro8\ufffdP\ufffd}\ufffd\u02b3\ufffd\ufffd\u000eU\u06c7\ufffd)ur\ufffdE`G\ufffdCu.\ufffd\u0006guk\ufffd\ufffd\ufffdxF\ufffdM\ufffd\u01b9A19\ufffd]\ufffd\ufffd\u05bbrmx\ufffd\ufffd\uf3ae\u007fg\u022c\u0019\ufffd\ufffd\ufffd\ufffd`~PST\ufffd\ufffd2\u0636\ufffdwym;\u001ff\ufffdZ5\ufffd\ufffdS\fu\ufffd\u0018\u001a\u05abZ\ufffd\ufffd\ufffd\ufffdW\ufffd\ufffd\u0168\ufffd\ufffd\ufffd\ufffd\ufffdU\ufffdI\ufffd\u00188\u00049\ufffd\u00baN\ufffd6\ufffd\ufffd+\ufffdBu\ufffd\ufffd\ufffdA\ufffd>\ufffde\u0014|\ufffd\u007f\ufffd'\u001cn\ufffd\ufffd\ufffdh\ufffd\u0016\ufffdP\ufffd\ufffd\u0003\ufffd\ufffdo\ufffd\rDT\u0011\ufffd\ufffd\ufffd\u001a/i\ufffd\r\u0004\ufffd\ufffdy\ufffd\ufffd\u0016\ufffd\ufffdCW\ufffdRC\ufffdc\\\ufffd\ufffd\ufffd6;\ufffd\ufffdlhJAcsk]\ufffdC\ufffd^\ufffdjZg\ufffd\ufffd;NAnl\u001aU3;lB\ufffdS\ufffdp\ufffd\u001a\u0017\ufffd\u001a\u0017\ufffdWAW\ufffd\ufffd\ufffd\ufffd7\ufffd4:\ufffd0\ufffd\ufffd\u000b\ufffd\ufffd\ufffd\ufffdayyk\ufffd\ufffd\ufffd-\u0014\ufffdw\ufffd\ufffd\ufffd\ufffdP\ufffd\ufffdH\ufffdJ\ufffdjv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd6Ul\u007f\u0006\ufffdc\ufffd\u001cZ\ufffd\ufffdfn\ufffdb\ufffd\ufffd\fqw*_{\ufffd\u034dZ\ufffd\ufffde|\ufffd\ufffd\u056e\ufffd\ufffd\ufffdQ\ufffdr\ufffd;\ufffd\ufffdQ\ufffd\ufffd\ufffdW\u001c\ufffdsX\ufffd\ufffd\u0003|\u03c5\ufffd\ufffdo\ufffd8\ufffd\u001cj=?j\u0006qB84s9\u07f2\ufffd\ufffd\ufffdV\ufffd\u000e\ufffd~\u0005\ufffd^Y\u0004\ufffd\u000e\ufffdk\ufffd@n\u075aE\ufffd`aeF\u0016\u000f?\u0003\u0017F\ufffdp\ufffdt\ufffd\ufffd\ufffdk\ufffdO+\ufffd\ufffdz\u0017\ufffd\ufffd\ufffd*\ufffdt\f\ufffd\ufffd\ufffd\ufffd<\ufffd\ufffdh\ufffdm1/\u9356\ufffdVosa\ufffd\uc34b\ufffd\ufffd\ufffd\u001e\ufffd\ufffdC\u0016\ufffdU\ufffdyD\ufffd\ufffd\ufffd\u001b\u0506Z0\ufffd\u000f\u02f5\ufffd\ufffd\ufffd\u0527\u0534\ufffd\u000e)\""I\u000e\ufffdK\tn\u001ce\u0015Z\ufffd[T\ufffd1\ufffd\ufffd\u00192\ufffd\ufffd\ufffd]\ufffd\u066d)5\ufffdC\ufffd\ufffd\ufffdj\ufffd\ufffdc\ufffd\ufffd\ufffd\ufffd;\b'\ufffd\ufffd2~\ufffdR\ufffdYc\u0015\u001aK\ufffdz\u00b9*\ufffdw9\ufffd\u001c\ufffd\ufffd\u000bI\ufffd\u000b\ufffdEV\ufffd\ufffdaE.\ufffd`\ufffd\ufffd\ufffd\u0006\u001b\ufffd\u000b\ufffds\ufffd\ufffd-V\u0017\u001f\ufffd1q\ufffdEN\ufffd\ufffdz\ufffd\ufffd\u001c\u03b0EC@K\ufffdg\ufffd\ufffd\ufffd\ufffd`\u8be3\ufffdU\ufffdI\ufffd\ufffd\ufffdP\bj\ufffd\ufffd\ufffd'[S\ufffdj\u0151\u0010p\ufffdU\u000f\ufffd\ufffdh\ufffd\ufffdG \ufffd\ufffdM\u001c\ufffd%\u000e\u001e\u000e\ufffd\ufffdkmJ\ufffdg]\ufffdX\ufffd7\ufffd\u000etM\ufffd\u0017\u007f>F\ufffdNE\ufffdb\ufffd\ufffd\ufffdF\ufffdT\ufffd\ufffd(\ufffd\ufffd\\>\ufffd\ufffd\ufffdG\ufffd\u0018\ufffd\ufffd\ufffdc\ufffd9\ufffd\ufffd\ufffd\ufffd\u06b1P3\ufffd\u0002\u0017\u000byc\ufffdy\ufffd1\ufffd\ufffd\ufffd\ufffd\u0453\ufffd\ufffdU\ufffdwG\ufffd\ufffd\ufffd\u074e\ufffd\ufffd9\u0017\u0014\u03cd\u0016\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd9\u0014\n\ufffd\ufffd\u0004\u0006~G?\u0013\ufffd\ufffdfW@[\ufffd\u000e\ufffd\ufffd\ufffdn\ufffd\ufffd\ufffd\ufffd\u026f\ufffdx2:[\ufffdj0\ufffd<\ufffd\ufffd\ufffdv\u0004\u000f\ufffd\u0014q\f\ufffd\ufffd\ufffd<\ufffdq\ufffd@\ufffd\ufffd\""\ufffd#b\ufffd\ufffd\ufffdZ\""z\ufffd7&\ufffd\ufffd\n\ufffd\u000e\ufffd\ufffd\ufffd\ufffd\u0003]\ufffdOq7\u000b\u0007\ufffd\ufffdu=N0\ufffdi\ufffd)\u000e\ufffdZR\ufffd\ufffdv\u001c\ufffd\ufffd\ufffd\ufffd\u0438\u02a3\ufffd\ufffd+^\ufffd\ufffd\ufffd#am\u001c\u001f\ufffdQ\ufffd\u000e\ufffd\f\ufffd|\u0775\ufffd9\ufffdpd\ufffd\u0646o\u0006\""\u0007\ufffd\ufffd\ufffd\u0014\b]\ufffd\u0416\ufffd\u0689\ufffdP\ufffd$\u0521P|\ufffd\ufffd+\ufffd\ufffd\u0015\ufffd4\ufffd.\u000b\ufffdr\u001d8\ufffdW\ufffd\ufffdN\ufffdW-\ufffd\u001b\ufffd\ufffd\ufffd\u0011T}\ufffd\ufffd\ufffd]\ufffd\ufffdR\ufffdt\ufffd\u0006+\ufffd\ufffd\ufffd/\ufffdw\ufffd\ufffd\ufffd4\u0500\ufffd\u000659p\ufffd\ufffd\ufffdPN5\u0018\ufffdV.~\ufffd\ufffdC\ufffd\ufffd\u001a\ufffd1F\ufffdqQ8\u000f\ufffdgDs,\ufffd\u000bOoH[}~\ufffdk4[\ufffd\ufffd\u001f\ufffd\u000b#\u03cfJ\ufffd\ufffdh\ufffd\ufffdZ\ufffd\u058d\ufffd\u001a5\ufffds\ufffd\ufffd\u0013\ufffdk:\ufffd\ufffd\ufffd\ufffd\u02b39\ufffd0m\ufffd\u001b\u0005\u001b\u0002\ufffdo\ufffd\ufffd\u000e\ufffdu%\ufffd?\u001c\ufffdV\ufffd\u000f\ufffd\u0011\ufffd\ufffd=\u0012\ufffdHK\ufffd:\ufffdy.\ufffdS\u0018\ufffd\u0013\u001c\ufffd\ufffdh\ufffdMj[@m\ufffd\ufffd\ufffd\u0016\ufffd\u0017A\ufffdO\ufffd\ufffdv\ufffd\ufffdj\ufffdwBSxx\ufffd,\u001e\ufffd\ufffd\ufffd%\ufffd\ufffd\b\ufffd\u001f\ufffdJ\ufffd2\ufffd\ufffd\ufffd\u0012}\ufffd\u0010\ufffd\ufffd\ufffd\u8105\ufffdA#n\ufffd\u020e\ufffd\ufffde;\ufffd\ufffd\ufffdV\u02f5\ufffd\ufffd\ufffde\u000e\u0004v\n\u001d&\ufffd\r?j\ufffd\ufffd\u0006u\ufffd}\u0014\u0015\ufffdF\ufffd\u000f\ufffd\ufffd_\ufffd\ufffd_\ufffd\u0099\ufffdp:*\ufffd)*\ufffd\ufffd\n\ufffdF\ufffdw\ufffd\ufffd\ufffd\u009bQ\u1368\ufffdzT\ufffd]T8\u0019\u0015ND\ufffd_D\ufffd\ufffdG\ufffd\u0017\ufffd\ufffd\u03e2\ufffdsQ\ufffdxT8\u0016\u0015\ufffdE\ufffd\u06e2\ufffd\u07a8\u0010\ufffd\n;\ufffd\u008e\ufffd\ufffd=*,\ufffd\nK\ufffdB *\ufffdF\ufffd\ufffd\ufffd\ufffd\u0014\u0015.\ufffd\n\ufffdQ\ufffd!*\ufffdE\ufffd\ufffd\ufffd\ufffd\ufffd\nS\ufffdBAT0D\ufffd\ufffd\ufffd\ufffd\ufffd\b\ufffd\u0003\ufffd\ufffd\u0017\ufffd=\ufffd\ufffd\b~Z\ufffdS\ufffd\ufffd+\ufffd\u06c2\ufffd)\ufffd\u001b\ufffd\ufffd.\ufffdI\ufffd\u007f+\ufffd\ufffd\ufffd\ufffd,\ufffd/\u0004?.\ufffd1\ufffd\ufffd\u0015\ufffd\ufffd\ufffd?#\ufffdQ\ufffd\ufffd\b\ufffd\ufffd\ufffdC\ufffd?)\ufffd\u000f\u0005?$x\ufffd\ufffd\u0007\u0005\u007fD\ufffd\ufffd\ufffd\ufffd\u0013|\ufffd\ufffd{\u0004\ufffd-\ufffd.\ufffdC\ufffd\ufffd*\ufffd6\ufffdo\u0011\ufffdfp\ufffd\ufffd\u0006\ufffdW\ufffd\n\ufffdE\ufffd\u0342\ufffd\u0014|\ufffd\ufffdM\ufffd\ufffd\u0011\ufffdZ\ufffdd\ufffdMU\u001dJ\u0015e\u0003\u001e\ufffd\u0012X\u0000\\\u000e\\\u0005l\u0005n\u0003\u001e\u0002\u000e\u0002O\u0002?\u0003\ufffd\ufffdr\ufffdm<\u0015\ufffd\ufffd\u001f\ufffd\ufffd\ufffd>@\u0003\ufffd\ufffd\ufffd\u0013\ufffd\u0019 \u001e^\ufffd\ufffd\ufffdW/\ufffdz\ufffd\ufffd\u000b\ufffd^x\ufffd\u00ab\u0017^\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\u0014\u05a5\ufffd.\ufffdu)\ufffdKa]\n\ufffdR\ufffdC\ufffd.z\r8\r\ufffdd\u0002\ufffd\u0006*\ufffd\u02c1\ufffd\u0014\ufffd\u07e5;\ufffd;\ufffd\ufffd\u001b:'\r\ufffd{\ufffd\u0709sg\ufffd)\ufffdD\u001e\u001ay~\ufffd\ufffd\u0219\u0011e}U\ufffd\ufffd\ufffdn\u000f\ufffd?\u000f\ufffd\u0000\ufffd(\ufffd~\ufffdr\ufffd3OH\ufffd\ufffd\ufffd,\ufffd\u0013\ufffd\ufffd\ufffd\u05f0\ufffdVX\ufffd\ufffdO\u0000\u0012\ufffdM\ufffdy%\ufffdQf\ufffdc\ufffd*\ufffd\u0012'\ufffdz\ufffdR\ufffd\ufffd}\ufffd\ufffd\u0001\u000fP\t,\u0000.\u0007\ufffd\ufffd\u001a\ufffdi`Dz\ufffd\ufffdH~\ufffdDZ\ufffd\ufffd\u0017\u007f\t\ufffd\ufffd\u001b\ufffd\u001c_\ufffdq\ufffd\u000b?\ufffd|\ufffdu`W\ufffd\u0007\ufffd\n\ufffdui\ufffd+\ufffdm\ufffd:\ufffd\ufffdT\ufffd\ufffd\ufffdk\ufffdV\ufffd\u0001\ufffd\ufffdJutvm\u06d01nc\ufffd\r5\u371b\ufffdqU\ufffd\ufffd\u001dt/ \ufffdx\ufffd\u0002.I\ufffdJ\ufffdI\ufffd\ufffdQ\ufffd#\ufffdnC\u001a\ufffdvI\ufffd\ufffdH\u000e\ufffd^\ufffd\u0005`H\ufffd\u000f\u0001?\u0000~\r(\ufffd#\ufffd\ufffd:%I\u000f\ufffd\ufffd\ufffdH\u001f@\ufffd\u0007)i\ufffd-i\ufffd@\ufffd\ufffdw\u0018\ufffd}\\\ufffd\u0290\ufffd(m\ufffd\u0014\ufffd\ufffd\ufffd\ufffd\u001bI\ufffdt\ufffdt\u0003\u001e\ufffd\ufffd\ufffd\ufffdHz\ufffd\ufffdD\u8bd3V\ufffdt\ufffd\ufffdd@\ufffd\ufffd\ufffd\ufffd~\ufffd\ufffd\ufffd~(]\ufffdrn\ufffd\u000ez\ufffd\ufffd\u001c*\ufffd\ufffd\fUU\ufffd\u0006\u001a\u0007|\u0013\ufffd\ufffdf\rr\ufffdBz\u000b\ufffd\ufffd[\ufffdM\ufffd\ufffd\u001bo\u0017\ufffdD\ufffd\ufffdHy?\ufffd\u0010I7I\ufffd\ufffd\ufffd\ufffdUxFrK\ufffd\""\ufffd\ufffdk\""\ufffd\ufffdH\ufffd*b\ufffd#]*\ufffd6F\u04ab\ufffdK\u0007\ufffd\u0713\ufffd\ufffd\ufffdg\ufffd\ufffdsi\ufffdt\ufffdt9B\ufffdPj\ufffd\u0016!\ufffd/-\ufffd\ufffd\u0010\ufffdDi>\ufffd\ufffd\u0012\ufffd\u00154\u0003r\u0000\ufffd\ufffd5\ufffd\u07cf\ufffdw\ufffd\ufffd\ufffd4AZ\ufffd\u001aW \ufffd\u001d\ufffd\u0509\ufffd\r\ufffdV\""]C\u0015R\u0007\ufffd\u0006\ufffd\u0000\u0016\u0002\ufffdZ\ufffdBD\ufffdF\ufffd`\ufffd\ufffdx\ufffd\n\ufffdg!\ufffdG=S\ufffd j\ufffdU6\ufffd\u0019\u0543\u001f\u0005$i\u0006\ufffd\ufffdP\ufffdC\ufffdG7-b\ufffd}\u001c\ufffd\ufffdw %\ufffdW\ufffd&y\""\u0005\ufffd\ufffdt\nR\ufffd@A$\uf3a4\ufffd\ufffd\ufffds\u03ee\ufffdF\ufffd\ufffd\u000e\ufffd\u0011\u0465\u0019\ufffd\ufffd\u001a\ufffd r=\ufffdV\ufffd\ufffd\u0322\ufffd*\ufffd\ufffdS%R\ufffd\ufffd\ufffd\u0011}y$-\ufffd\ufffdS#\ufffd\u001aIK#\ufffd\ufffd#iQD?9\ufffdN\ufffd\ufffd\u0018B\ufffdj\u001d\ufffd2\ufffd\u000fK%\u0018r\ufffdd\ufffd\ufffdaR\u0012%\ufffd9\""\ufffd\ufffd\fR\ufffd\ufffd\ufffdx \u0011\ufffdOGo\ufffd19\ufffd\ufffd\ufffdDLN:&'\u001e\ufffd\ufffd\ufffd\u0249G\ufffd\u000b5r1\u0019\ufffd\ufffd4\u0003\ufffd\ufffd#ua\""2\ufffd\f \u001dH\u0004\u2a42-b\ufffd\ufffd\ufffd\ufffd\ufffdHz)[\ufffdc\ufffd\u0016G\ufffd%H\ufffd\ufffdU\ufffd\""\ufffd67{9\ufffd\ufffd\ufffdN\ud807\udc53\ufffd\ufffd\u0004{G\ufffd\ufffd\ufffdr\ufffdw\ufffd;\ufffd\ufffd\u001f\ufffd\u000b\u0003\ufffd\u0004l\ufffd!\ufffd\f\u0014\u0017G\u0004l\ufffd\ufffd\ufffd\ufffdG\u007f\ufffd\ufffd\ufffd`!\u000f\u0014\u0014\ufffd\u001ec2C(\u0006\ufffds\\\ufffd\ufffdxh(+\ufffd\u0015UffF\ufffd\ufffd\u01cf*\u001d\ufffd\ufffd25#\""\ufffd&\ufffdD$\ufffd!\u0001\ufffd\ufffd\ufffd!\u007f\ufffd.H\ufffd\ufffd U%0\ufffd\u00be\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\r4-\u0016=\ufffdC.\u0017\ufffd\u0011}?3\ufffd\ufffd\u007f\ufffd\ufffd\u0010\ufffd\ufffd\u00c4\\\u07e5\ufffd,\u079f\ufffd~\ufffd\ufffd=\ufffd\u0197$\ufffd\ufffd\ufffd\ufffd{jH\u7181\u007f\ufffdC))>\ufffd\u0003\ufffd\""\ufffd\u0003\ufffd1\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd)\ufffd\u007f\ufffdWq\ufffd{\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdwG\ufffd\ufffd\ufffd\ufffdwO\ufffdd\ufffdw\ufffd\ufffdCV;\ufffdLp~\ufffd\ufffd\ufffd\u0679\ufffd\u007f\u001fd\t\ufffd\ufffd\uc7bb\ufffd{\u0683\ufffdKwKn\ufffd\ufffd\ufffd\ufffd}\ufffd_f\ufffd+\ufffd\ufffdW\ufffdf\ufffd\ufffd2V\ufffd\ufffd\ufffd\u034a\u0006\ufffd+n<\\\f\u001c\ufffd\u0254\ufffd\ufffd2\ufffd\u0002\ufffd|\ufffd]\ufffd\u001a\ufffdM\ufffd\ufffdV\ufffd\ufffd0[\ufffdZ\ufffd\ufffdLU\ufffdX\u000b\ufffd\ufffdB\u0012\ufffd\ufffdv\ufffd\ufffd\u0641\ufffdO\ueb51t'\ufffdMT\u070b\ufffd\ufffdo;\ufffdM\u7bac2\ufffd}\ufffd\ufffds\ufffd(\ufffd9RlC\ufffd\u0002;6\ufffd\ufffd3\u001b7PR\ufffd\ufffd\ufffdA\ufffd\ufffd\ufffd\ufffdo\ufffd\u0134\ufffd-\ufffd\u06de\ufffd\ufffd\u9cf2\ufffd\ufffdg\u0014\ufffd\ufffd\u0019g\u000e\ufffd\u001ez\u0196.\u04a3\ufffd\ufffdH\ufffd2\ufffd\ufffd\ufffd\ufffd)\u017e\ufffd\ufffd\ufffd\ufffdB\ufffd\ufffdM\f\ufffd\u05d1y=?\ufffdw\ufffd\u0018V\u0431\ufffdZa\u007fl\ufffdD\ufffd~\ufffdXz\ufffd\ufffd\ufffd\u0019Fm\u0018xU4\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd{\ufffdm\ufffd?\ufffd\ufffd\ufffd\u001d\ufffd\u05f9\ufffd11\ufffd\ufffd\ufffd3}C\u0007\u0015\ufffd/\u000e\ufffd\ufffd\u00077\ufffd~\u055a\ufffd\ufffd\ufffd\u000f\ufffd\ufffd\ufffd\ufffd\ufffd2\ufffdrWY\ufffdp\ufffdk\ufffd[t\ufffdd\u0017|\ufffd\u07a3s\ufffd\t)\ufffd[C:w\bq\ufffd\ufffd\ufffd~\ufffd\ufffd\ufffd\ufffd^\ufffd\ufffd>\ufffdOq\ufffdFh\ufffd\uf594\ufffd\ufffd\ufffd5^}\ufffd\ufffd\ufffdpZ7;\ufffd\ufffdW\bw\ufffd\ufffd0\ufffd\ufffdc\ufffdP\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0017{\u0011\ufffd\ufffd\ufffd2\ufffd\u0016\ufffdj3\ufffd8\u0005\ufffd\ufffd\ufffdm\u0756\ufffd\ufffds\u001bs\ufffd\u0000nA+7\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd&\ufffd\ufffd\ufffd\uadf1\ufffdm,o\u001bsL\ufffd\ufffd\ufffdl\ufffd\ufffd6k\ufffd\ufffd\ufffd\u0019Kl\ufffdb\ufffd\ufffd\ufffd&{lTh;\ufffd\ufffdI=[tV\u029b\ufffd\ufffd\u0012\ufffdD\ufffd\f\ufffda\b\ufffd\ufffd\f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd{M\ufffd\ufffd\ufffd0KdF\u007f\ufffd\ufffd\ufffd2\ufffd\ufffdq\u0019I6sz\ufffdUIM\ufffd\ufffd\ufffdCg\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd+\ufffd\ufffd\ufffd\u001e<\ufffd\ufffd=qVG\ufffd,q\ufffds\ufffd\ufffd\u0018K\ufffdJ\ufffd\ufffd/R\ufffdVq\ufffd\ufffd\u0015\u007f\ufffd(\ufffd\u022f\ufffdT\ufffdW1\ufffd\""\ufffdB\ufffd\u022apT\ufffd+l\u0015\ufffd\nS\ufffd\ufffdB_!WP\ufffd\ufffd\ufffd\ufffdma\ufffd\ufffd\ufffd\u001a[\ufffd\ufffd\u0014\ufffdtQ\ufffd\ufffdu7\u000e\ufffdj\ufffdV\ufffdn\ufffd\fM\ufffdZ\ufffd\u0019\ufffd\u001b\ufffdV\ufffdvbG\ufffdh\ufffdN\ufffd.\ufffdh\u059a\ufffd\ufffdZ\u0007\ufffd8^\ufffd\ufffdq\u0018\u000b\ufffd\ufffd\u01b6m{\u0002nwf\ufffd\u0016l\\\ufffd: \ufffd\ufffdfV\u0007\ufffd\u0012!\ufffd~;dj\ufffdJ\u0016j\u000eW\ufffd\ufffdb\ufffd\ufffd\ufffdh\ufffd\ufffd'\ufffd\ufffd\u001fA\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\u001d\ufffd\nb\u001bAa\ufffdH\ufffd\ufffdt\f\ufffd\ufffdh;\u0017m}l\u0011O\ufffd\ufffd\ufffd\ufffd;\ufffd\u169e\ufffd\ufffd\f/\ufffd\u0006\ufffd\ufffd;9\ufffdq\ufffd\ufffdu(:\ufffd\ufffdI\ufffdg\ufffd\ufffd>\ufffdD\ufffd4\ufffdV\ufffd)\ufffd\u0420\ufffd\ufffdlj\ufffd\ufffd\ufffdo\ufffdQ\u000b67jYM\ufffd\u06b4\fWu\ufffd\ufffd\freM\u02f4dW5|o\fS\u000f\ufffd\\\ufffd\ufffdODD'\ufffd{l\ufffd\u0119\u001el\u0672\u05aa\u000e6LA\ufffd\u0011p\u0016\ufffd\u0010\ufffd+\ufffd\u0017\ufffd\fp\u001a\ufffd\u0013p\nx\u0017x\u0007\ufffd=\ufffd&\ufffd\u0006\ufffd:\ufffd;\ufffd$p\u0002\ufffd\u0005\ufffds\ufffd\u0005\ufffdg\ufffds\ufffdq\ufffd\u0018\ufffd\u000f\ufffd\r\ufffd\u000b\ufffd\ufffd\ufffd\ufffd\u000e`;\ufffd\fX\n\u0004\ufffdV\ufffd\u0005h\u0002.\u0001\u001a\ufffd\u0006\ufffd\f(\u0002<\ufffd\u0014\ufffd\u00000\u0000q\ufffd\u03bf&\ufffdA\ufffd\ufffd\ufffd{\ufffd3\ufffd\ufffd\ufffdS\ufffdw\ufffdo\u0007\ufffd\f\ufffd\u0011|=x2\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\u001e\u000f\u001e\u000b>\u001b\ufffdi\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001f\u0006\u000f\u0005\ufffd\ufffd\u0007\ufffd\ufffd\u0004\ufffd\u0007\ufffd\u0005\ufffd\u0006\ufffd\u0004w\u0007w\u0005C\ufffd[\ufffd\u06c2\ufffd\u0004o\u000e\ufffd\u0006\ufffd\u0006\ufffd\u00047\u0007W\u0006\u0017\u0006\ufffd\ufffds\ufffd\ufffd\ufffd\ufffd\ufffdEW\ufffd\u007f9\u0005\ufffd5\ufffd\ufffd\ufffd\ufffd\ufffd\u0011\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\ufffd(\ufffd\ufffd{D\ufffd\ufffd\ufffd\ufffd2^\ufffd\ufffd\ufffdyT?\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd$\u03e4$\ufffdE\ufffd\ufffd\ufffd\ufffdN\ufffdyd\ufffdX\ufffdO\ufffd|\""\ufffdJ|\u0004\ufffd\ufffd4TM\ufffd#\u0006\u001d\ufffd\ufffdz\ufffd\ufffd\ufffd_q~\ufffd\u001f\ufffd^\ufffd\ufffd\ufffd\ufffd\ufffd\u000f\ufffd7r\ufffd\u001e\ufffdC\ufffd\ufffd\ufffd\ufffd\ufffd]\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\""\u001f\ufffd\ufffd\ufffd-\ufffd\u000f\ufffd\u0005\ufffd\ufffd4\ufffd\u0016\ufffde\ufffd\ufffd<\u001bh?=\u0012\ufffd\ufffd\ufffd\u06a8\ufffd\ufffdwsf!\ufffd\ufffd\ufffd\ufffdYz\ufffd\ufffd\ufffd>\ufffd\ufffd\ufffd\ufffdj\ufffdN\ufffdr5\r\ufffd\ufffd\ufffd\ufffd\u0001\ufffdfQ\u001fF{\u0017}\ufffd\u001e\ufffdF\ufffd~\ufffdo\ufffd\ufffd$\ufffd\t\ufffd\ufffd\ufffd\ufffdF\ufffd:i\ufffd\u001b\ufffd\ufffd\u000b\""\ufffd\ufffd&\ufffdC\ufffd\u0477zDi\u0003\ufffdC\ufffdK\ufffd =J\ufffd\ufffdO\ufffdB\ufffd85\u04c3\ufffd'(^\ufffd\ufffd35\ufffd\u001f\ufffd\ufffd\ufffd\ufffd\ufffd]\ufffd\ufffd%\ufffd%\ufffd$\ufffd{\ufffd\ufffdn\ufffd\u0007\u9dc4W\u007f\ufffdm\ufffd\ufffd\u007f<{\ufffd\ufffdn\ufffd{0\ufffd[h/\ufffdt\ufffd~]\ufffd\ufffd4Wg\u04b1\ufffdw\ufffdo\ufffd)\ufffd\ufffd\u061fQ\ufffd\bv\ufffd\ufffd\ufffd_\ufffd\ufffd\ufffd\u0017\ufffd+\ufffd\ufffd\ufffd\ufffd\u001d\u001c\ufffd\ufffd\ufffd\ufffdj\ufffdE7ax\ufffd\ufffd\ufffd\ufffd\ufffd~E\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd:\ufffd\u0002+\ufffdY\ufffd\ufffd\\$\ufffdX>)\ufffd\ufffd\ufffd)z\ufffdq\ufffdW\ufffdJ!]G_\ufffd\u041f\ufffdN\ufffdR\u0016*\ufffd\ufffd\ufffdJ\ufffdn\""\ufffd\ufffdqW5\ufffd\u0012\ufffdUm\ufffd/\ufffd\ufffd\ufffdF\ufffd\ufffd\u3295;t\ufffd\ufffd\ufffd\ufffd\ufffdG:\ufffdo)v\ufffd\ufffd\u06ce\ufffd\ufffdN\ufffd\ufffd~U\ufffd\ufffd%\ufffdl\u05f5\ufffd$*\ufffd\""*\ufffdF\u007f\ufffd\ufffdS:ir\u0001\u0015d&\u0016\u0017\ufffd\u0016$\u0016\u0016&\u0016\ufffd*S\ufffdh\ufffd\ufffd\ufffdkMII\ufffd\ufffd\u000b\ufffde\ufffd<^\ufffd\ufffd\ufffd\ufffd7/\u001d/\ufffdXY\ufffd\ufffd\u00032\u001f7\u001f\ufffdx\ufffd\ufffdK\u033f9Z\\\u0126\ufffd\u0392\ufffd\u0352\ufffd\ufffd\ufffdr\ufffd\ufffd8\ufffd\u05322oI\ufffddKE&Y\ufffd\ufffd\ufffdm\ufffd\ufffd\ufffd\ufffdpH\ufffd\ufffdi\ufffd\u0013\ufffd\ufffd\u001c\ufffd\ufffdYj\u0444q\ufffd\ufffd\ufffd[k\ufffd;f\ufffd7M\ufffd(P\ufffdlq\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdr\ufffd\ufffd\ufffd\ufffd\u000fii\ufffd\ufffdS'\ufffd\ufffdx}\ufffd\ufffd\ufffd\ufffd\t%Y_\ufffd*\ufffd\ufffd\ufffdO\u039b5\ufffd~\ufffd\ufffd`\ufffd\ufffd\ufffdu\u000f?<\ufffd\ufffdr\ufffd\ufffdV)\u007f\ufffd\ufffd\ufffd\u0018 I\ufffd\ufffdX\ufffd\ufffd\ufffdl\u02a1'\ufffdm\ufffdV\u007fm\ufffd\ufffd\ufffd\ufffdKLPs\ufffds\ufffd\ufffdsTg\ufffd\ufffdK\ufffdedgOHNO\ufffdO\ufffdIU\u0013\ufffd>\ufffdI]\ufffdJ\u0016YU\ufffdV\ufffd\ufffd%[\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffdw\ufffd9v\ufffd*\ufffd\ufffdt\ufffd\ufffdB\ufffd^\ufffd\ufffdg\ufffd\\~\u064a\ufffdSn\ufffd\ufffd|\ufffd\""f\ufffdx\ufffdV\u001f\ufffd\u015a\ufffdx\ufffd\ufffd\u001dCCC\u001c\ufffd\u000e\u007fN\ufffd\ufffd\ufffd\ufffd\u000b\ufffd\ufffd\ufffdm\u0017\ufffd-\ufffd5\ufffd\f\ufffdp\u001bpN\ufffd%!\ufffd\u0013':\ufffd\ufffdz[jZ\ufffd\u0349\ufffdNc^\ufffd%\ufffd\u06d8S\ufffd\u01d7\u0014\ufffd\u0366\ufffd\ufffd\u009c\f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd&\ufffd\ufffd\u001fd-\ufffd\ufffd\ufffd)\u001f\u001fb_}\ufffd8\ufffd\ue790\ufffd\ufffd\ufffd\ufffd\ufffd\r\ufffddW\ufffd\u001b\ufffd\ufffd\r\ubed4E\u007f{d~sab\ufffd4^\ufffd\u01bf9\ufffd\t1[\ufffd[\""\ufffd\ufffd\ufffd\u0010Q\ufffd\ufffdf+\ufffd\ufffd/\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdIE\ufffdS\ufffd)}\ufffd\ufffdLv\ufffd6\ufffdj\u0313\ufffd\ufffd\ufffd~c\ufffdZ\ufffdl\ufffd\ufffdt\u0016\ufffd\ufffd\ufffdR\\\\\ufffd\ufffd\u07aa\ufffd,\ufffd@NZ|\ufffdS\ufffd\ufffd2\ufffd\ufffdSn\f3\""A\ufffdD\ufffdW\\\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd3\ufffd\ufffdus\ufffd}\ufffdF\ufffd[W\ufffd=n\u0004\ufffd8\ufffd\u5470\ufffd\u0016J\u0013\ufffd:K\ufffd\ufffdl\ufffdz}\ufffd-\ufffd\ufffd\u44b2\ufffd(q\ufffd\ufffd\ufffd,\ufffd4oI\u0019\ufffdyy.\u05e6Y\ufffdI\t\ufffdy(y\ufffd\ufffdj\ufffd\u0017\ufffd\u073d\ufffd\ufffd\ufffd'\ufffd\ufffd\ufffd\u0005\u0755y7f\ufffd]zs_\ufffd\ucefex\u007f\ufffdy\ufffd\u0006\ufffd\ufffd\ufffd\ufffdeK*\ufffd\u0776fIo\ufffd\u0004\ufffd\ufffdo]\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd]\ufffd\ufffd,]\ufffd\ufffd}tn]\\\ufffdM\ufffd\ufffd[f\u0011\ufffd\ufffdF\ufffd(V\ufffd1\ufffd~(beN5'\ufffd\u691a\ufffd\ufffd[\ufffd\ufffd\ufffd\ufffdt\u001a\u001c9\ufffd/\ufffd\n\u000b\ufffdIj\ufffd\ufffd\ufffd\u0014\ufffd,e\ufffd'\ufffd\ufffd}\ufffd\ufffd\ufffd,\ufffd\ufffd\ufffd\ufffdR\ufffd\ufffd^/%\ufffd\ufffd\ufffd\ufffd\u055a\ufffd\ufffd%\ufffds\ufffd\ufffd\ufffd\ufffd\ufffdh>|\ufffdRD,\ufffds\ufffd\u0011,\n\ufffd\ufffd|\u0004\ufffd\ufffd\ufffd\ufffde^\ufffd\ufffd\ufffdn\ufffdZ_w\ufffd\u0012\u000e\ufffdXG\b+\ufffd\ufffdD\ufffdY\ufffd\""r\u04fc\u0016D4\ufffd,\ufffd\ufffd\t\u07924\ufffd\ufffdaoXY\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd5[\ufffd\ufffd\ufffd\ufffd\ufffd\u000e\u000f\u007f\ufffd\ufffd\u9ff7\ufffd>]\ufffd\ufffd;KV\u0017\ufffd:|\ufffdGG\ufffd\ufffd\ufffd\ufffdY\ufffd1\ufffd\ufffdq\ufffdX+[\ufffd\u0012\ufffd\ufffdR\ufffd\u0017\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffdb\u0011)\u0551%g\ufffd9\ufffd\u000e,\""\ufffd5\ufffdx\ufffd6y\ufffd<\ufffd/YN\u065c\ufffd;e\ufffdV\ufffd\b\ufffdI>\ufffd1\ub14f\ufffd\ufffd\ufffd\ufffd\ufffdF\ufffd\ufffd}\ufffd\u0251\ufffd\u0011^\u0018\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0014\ufffd\ufffdfqM\ufffdpf)SK%\u001cJq\ufffd\u0017NJK\ufffdR\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\u001a\ufffd+\ufffd=\ufffdu\u07e4\ufffd-\ufffdt_Z6\ufffd_\ufffdU;\ufffd\u0618\ufffd\u3bd3\ufffd\ufffd+s\ufffd\f\u0016}\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0212K\ufffd'\ufffdP\ufffdW\\\ufffd\ub6dd\ufffd\ufffdt\ufffd+\ufffd\ufffdF\ufffd\u0752\ufffdQ\u0015\ufffds|L\ufffd\ufffd42\ufffdo4\u0018\ufffd\u0012\ufffd\ufffd\ufffd\ufffdd@c\ufffd\ufffd\u000f\ufffd5\ufffd\u03dfP\ufffd\ufffd\ufffd\u0753\ufffd:P\ufffdc\ufffd\ufffd}\ufffd\ufffd\ufffd)\u0007j\u000b\r\ufffd\ufffd\ufffdP\ufffd\ufffd7Y\ufffdv\ufffd_\ufffd\ufffdNu\u007fvvQ\ufffd}\ufffd\ufffd\ufffd\ufffd\u0011L,\ufffdH8\ufffd\ufffd\t\ufffd\u73ba\ufffd\ufffd{\ufffd\ufffda>\ufffd#\u0014\ufffd\ufffd~\ufffd;\ufffd\ufffd\ufffd\u05dd\ufffdc\ufffd\ufffd\ufffd)4\ufffdu\u0017\ufffd\ufffdy\ufffd\ufffd(?g\ufffd\u001e\""\ufffdAq9-\ufffd\ufffd\ufffd\u05c6\ufffd\ufffd,\ufffd%O\ufffd\ufffd\ufffdOv\ufffd\ufffd\ufffd4\ufffd9\ufffd\ufffd'\u000e\u001fy\ufffd\ufffd\ufffdi\ufffd\ufffd\ufffd\u001c\ufffd\ufffd%6\ufffdxfANzjG\ufffd\ufffd+#[O\ufffdx\ufffd\ufffd\ufffd\r%Y\ufffd\ufffd>\u0018W\ufffd\u001f\ueb58\ufffdq\ufffdI\ufffd\ufffd\ufffd\u0675\ufffd\u000f\ufffd\ufffd\ufffd\""Q5 \ufffd\ufffd\ufffd\ufffdX)\ufffd(\u065c\ufffd&\ufffdK\u0592u\u00069\ufffd I\ufffd\u0006C\ufffdl\ufffdd[<\ufffd\ufffd\ufffd'-:\ufffd%\ufffd\ufffdO\u0006f\ufffd\r\ufffdY\ufffd>C\ufffd\ufffd\ufffd\ufffd\u0003\ufffdY\ufffd\ufffd\u000f\ufffd\ufffd\ufffd\ufffd\ufffd}\ufffd\ufffdi\ufffd%9\ufffd\ufffd\ufffd[`H\ufffd\ufffdXLq\ufffd{y\ufffd\u000f\ufffdsG\ufffd\ufffd\ufffd\ufffdj>\n\u0005_w\ufffdc\ufffd\u0011\ufffd\ufffdy]0\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdq\ufffd\ufffd\ufffdk\ufffd\u001c\u000e\ufffd\ufffd]\u0011\ufffd\ufffd|a|S\ufffdY>6\ufffd\ufffd\ufffdi\ufffd\ufffdT\u0014\u000f\ufffd\ufffd\ufffdppM9\ufffd\ufffd\ufffd\u0572I\u00f5c\ufffdZ\ufffdR`=w\""\ufffdv\ufffd\ufffd\ufffd\u06ba\ufffd\ufffd\ufffd+\ufffd\ufffd\ufffdp\ufffd\ufffd\u0017\ufffd\ufffdIu\u000fN\ufffd)tTD5cRn^.\ufffd\ufffd\ufffd\u04fd{\ufffd\ufffdSG\ufffd\ufffd\u07b3\ufffd\ufffd\ufffd\ufffdM\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\u009aY\ufffdU\ufffdS\ufffdJ\ufffd)$\ufffdY\ufffd6\u0266>\ufffd\u06d5\ufffd\ufffd+*\ufffd\u001bl\ufffd=\ufffd~\ufffd6>\u075a[\\*\u7538\\9\u0007j]2m-HJ\ufffdn\ufffd\u07da\ufffd1\u001f2\ufffdy\ufffd\u001e\ufffdX\ufffd|\u001d\ufffd\u0000\ufffd\ufffd\ufffdC\ufffdx\ufffd\ufffdlt\u001e2\ufffd\ufffd\ufffd\ufffd\ufffd\u0016^?\ufffd\ufffd\ufffd\u0017\ufffd\u0017\ufffd\ufffd\ufffdm.\u001e'\ufffdk\ufffd\ufffd\ufffd\u0005%b\u0001}40\ufffdM\ufffd]\ufffd\ufffd\ufffd;qx\u0174\u0002\u02f9\u0017\r\ufffd\u0245\ufffd\ufffd\""K\ufffd=R01=Q*\ufffdL\ufffd\ufffd\ufffdV^`\ufffdh\ufffdtW\ufffd5\ufffd\ufffd89\ufffd~\u0011\ufffd\ufffd\ufffd\ufffd\ufffdY\u0013\ufffd\ufffd\ufffd\ufffdYqb\ufffd\ufffd\ufffdn\ufffdA\ufffdr\ufffd?\ufffd\fSW}s\u4714\ufffd\u0011\ufffd\f\ufffd\u0010\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000f\ufffd\ufffd\u066c)\ufffd\u0003\ufffd)\b\ufffd\ufffd\u0013\u0019~x\u001bb\ufffd\u07c3\r\ufffd\ufffd\u0018\ufffd\ufffd\ufffd3~\ufffd\u0001\ufffdo\ufffd~/\ufffd\ufffd\ufffd\u0000\ufffd\ufffdG\u007f\ufffdw\ufffd?\ufffd%\u0012\ufffd/liT%\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd>\ufffdbI6%\u001f\ufffd5\u024a.mk\ufffd\ufffd\ufffd\u0452h\ufffd\""\ufffd`Pt}\ufffd\ufffd*\u04abp\ufffd\ufffd\u00042Qtit\ufffd\ufffd{*\ufffd\ufffd\ufffdlm\u0234L\ufffd\u0019\ufffdO\ufffd\ufffdC\u0657\ufffd\ufffdQ\ufffd\ufffdvu\ufffd}u\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd=\ufffd[\ufffdH#\ufffd%\ufffd\ufffd\ufffd,\ufffd\ufffde\ufffd\ufffd`\ufffd`[\\\ufffd\ufffd\u0016\u0018\ufffd\u0001\u0007\ufffd \ufffd$\ufffd\ufffd\bHv\u0003!\ufffdu\ufffd/\ufffd8r\ufffd\ufffd1\ufffd\u0011c\ufffd\ufffd&\u0001\ufffd\ufffdVu\ufffd\ufffdF\ufffd\ufffd\ufffd{\u0018\ufffdz\ufffdg\ufffd\ufffd\ufffd_}\ufffd\ufffdO_\u0017_\u0013\u0018\u063eFv\ufffd\ufffd\u001bq1\ufffd\ufffd\ufffd\ufffdZ<\u0104\ufffd\ufffd(\ufffd\ufffd\u0564\u000e\ufffd\ufffd,\ufffdEQQ\ufffdP\ufffd!Nk\ufffd\ufffd\u05a7\ufffd,\u0528\u000f\ufffdT>b\u000f-\ufffd]\ufffd\n%\u007f%y+fv\u001c-q\ufffd\ufffd\u0007\ufffd\ufffd\ufffd(@K\ufffdv\ufffd\ufffdes]\ufffd\ufffd\ufffdg\ufffd\""\ufffd\u0011\ufffd{\ufffd\ufffdm\ufffds\ufffd\ufffdjD\u0626[\ufffd\ufffd\ufffdKcc\ufffd\u03b9\ufffd\ufffd1\ufffd\ufffd\n\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffdm%\ufffd\""\ufffd\ufffdf;\ufffd6U\ufffd\ufffdBXk\ufffd\ufffdP8\ufffdTY\u001f&r\ufffd\ufffdS\ufffd\u0016\ufffd\t\u000b\ufffdnk\ufffd!Chn\ufffd*NY\ufffd\u0016h2\ufffd;\ufffd\u0005\ufffd\u075b\u031c`\ufffdi\ufffd\u0005Lk\ufffd\ufffd\ufffd\ufffd\u0000\ufffd\u0011\ufffd\r\ufffd;)\ufffd\u0014\ufffdE\ufffd\ufffd)\ufffd\ufffd\u0011\ufffd\u84c5L\rU'\ufffd*\u0001l\t\ufffd\ufffddj\u000b\u0002\ufffd\ufffdj\ufffd\\j6\u0000\ufffd\u0015z,EA\ufffd6\u0016\ufffdh\ufffd\ufffd\ufffd_w-\ufffd \ufffd\ufffd\ufffd{\u000f\ufffdX\ufffd\rl\u0004w\ufffde\ufffd \ufffds_\ufffd\ufffd\ufffd\u0010\u001a\\\n\ufffdL\ufffd\ufffd\ufffd9?<\ufffd\ufffd\u001f{\ufffd\ufffd\ufffd<\u001az\ufffd\u0000\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd|5\ufffdp\ufffd\ufffdE\ufffd0C3\ufffdq\ufffd\ufffd\u0005]\ufffd\ufffd2\ufffdm6[\ufffdx\ufffd<\ufffd\u001e\ufffd\ufffdY\ufffd(\ufffd#\u008c\""\u0011\ufffd\u486aZV\ufffdG\ufffd@$\ufffdr\b\u0013J\ufffd\u0010\ufffdfR\u0001h\u0013r\ufffd&\u0011\u0019\u0019H\ufffd\ufffd\u001b\u007f|p\ufffd\ufffd\ufffd\ufffdo\ufffd\ufffd\ufffd\u0017x\ufffd\u000b\u07fc\ufffd\u0451\ufffd_\ufffd|\ufffd\u001d+\ufffd\ufffd\ufffd\u0019 \ufffd\ufffd[\ufffd\ufffd\ufffd*\ufffd\ufffd\u07fe\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd7\ufffd\ufffd\ufffd\u0015_\ufffd\u001dZ5\ufffd\ufffdvA\ufffd\ufffd\ufffdU\u00aa\ufffd.\u001f\ufffd\u001d\ufffd\\.\ufffd[E\ufffd\u0017\ufffd\u001d\ufffd<\u0006\ufffd\ufffd\ufffdB)\ufffd`\ufffd\u0629\ufffd\t\u00c2`%r\ufffd.\u07e1\ufffd4\u0004\ufffd0\u001fS\u000b\ufffd\ufffd0\ufffdu\u000by+\ufffd9\ufffd\ufffdh\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\u001c\ufffd\ufffd&\ufffd\ufffd\ufffd?Y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdxhQz\ufffd\uefad\ufffd\ufffdqV;W&/\ufffd\ufffd\ufffd\ufffdv\ufffde\ufffd;\ufffdXu\ufffd\ufffd[FH\ufffd\ufffd\rQ\ufffd!J\ufffd\ufffd\ufffd\ufffd\ufffdD.G\ufffd\u001c\ufffd\u0011\u0469\f\ufffd\u0011\ufffd|\ufffd\ufffd(\ufffd\ufffdSes'\ufffd\ufffd\ufffdv\ufffdg\ufffdl\ufffdf7\ufffd\u000fmY\ufffd\ufffd\ufffd<\ufffd\ufffd\ufffdCc\ufffd\u0016`\ufffd\u07b9\u000fi\ufffdHs}\ufffd\u001d\u0002\ufffdS\ufffd\u0248L\ufffd\b)/\ufffdC\ufffd\u05e8\ufffd\u0013vhGZ\f\ufffd\ufffd\u0420\ufffd\ufffd\ufffd\ufffd\ufffd}>\ufffdf\u000f\ufffd7~c\ufffd\ufffdI@\ufffd9!q\ufffd\u000e\ufffd\n\ufffd\ufffd\ufffd1h\ufffd\ufffd\u0011\t;RYAA\ufffdb\ufffd\ufffd9\ufffd\u0017P\ufffd,\ufffd\u0018\u014d\ufffd>Y\ufffd\u0016k2\ufffd\u05b6G0\ufffd6O\ufffd\ufffdho\ufffdt5'\ufffd\ufffd\b\ufffd\u001e^uY\ufffd\ufffd\u001c!\u0019\ufffd\ufffdfC\ufffd%\u0019a*^\ufffd\u0004Q\ufffd\u000e\ufffd\ufffd7\u0011\ufffd9b\ufffd@\ufffdK%\ufffd \u0015\ufffd$R\ufffdjAA4i\ufffd\ufffd\ufffd#\ufffd\ufffdc\ufffd\ufffd\ufffdc\ufffd\ufffd\ufffdA\r*\ufffdr\ufffdo\ufffdO\ufffd`\ufffd\ufffd\u0019\ufffdQZ\ufffd%\ufffdn\ufffd\ufffd\ufffd\u00104\u0004\u000bj\u0004W\ufffd\ufffdL$\ufffd\ufffd\ufffd\ufffdn\ufffd\ufffd\ufffd\ufffd\ufffd\t\ufffd\ufffda\ufffd\ufffd\ufffd\u00d7\ufffd\f\ufffd\u0018r`h\ufffd@G\ufffd\u0006\ufffd~\ufffd\ufffd\u001d\ufffd\u000b\u0012\ufffd\ufffd\ufffd\ufffdA~iQ\ufffd\ufffd\u054b\ufffd\ufffd|i\ufffd\ufffd\u0005\ufffd\ufffde_\ufffd\ufffd\ufffd\u00101\u0003\u0015*\u000bx\u028ah\ufffd\r\ufffd\ufffdO<.\u0438R\ufffd3\ufffdQ\ufffdOc\u0000#J|\ufffd\u0014nU\ufffdV%\u072a95\ufffd\ufffdP\ufffdU;\u0019\ufffd\u0147O:A\u0002\ufffd\u078c\ufffdM\ufffd\ufffd\u0004t\ufffd\ufffdN\ufffd\ufffd\ufffd\ufffd~y\ufffd\ufffd\ufffd\ufffd\u07159.\ufffd\ufffdqa?K\b\ufffd\u0012\ufffd\ufffd\ufffdk\ufffd\u0001\ufffdN\ufffd\ufffd\rX\u001bI\f\ufffd\u0018\ufffdb~aN\ufffd\ufffd,\u0003\ufffd\ufffdA\ufffd5J\u0014j1\ufffd\ufffd\ufffd\u9b0d\ufffd\ufffd\u0007^\ufffdN\r\ufffd\ufffd\ufffd\ufffdx>\u0017\ufffd7\ufffd\ufffd\ufffdeQf\ufffdS\u065a\u0081\u0179s\ufffd\ufffdV&\u0011\ufffd\ufffdKm\b\ufffdj\""+\ufffd\u007f\ufffdM\ufffd\ufffd\ufffdhT\ufffd\u0013\ufffd\ufffdr\u0013\ufffdG\ufffdxZ\ufffd\u00c9\u000b\ufffdqH\ufffd\ufffd\ufffd%\ufffd\ufffd&\ufffdJ\u001cE\ufffd\u0016\ufffd`\u0014\ufffd\tFM\ufffd\u00126Y i\ufffd:=P\ufffdF\ufffdq\ufffd\f\ufffd-\ufffdT\ufffdp\ufffdb\ufffd\u0010$0\ufffdTf\ufffd T\ufffd\ufffd\n\ufffdn\u062e\u0005G\ufffd]\ufffd\ufffd\ufffdG0OX\ufffd)\""G,\r\ufffd\ufffd\u000eYg\u000b+\ufffd\u0005\ufffd\u0000bv\ufffd\u001bz\f(\u0000\ufffd\ufffd\ufffd!\ufffd8\u0004\ufffd\ufffd?\ufffd\ufffd\ufffd\ufffdM\u001eO\ufffd\u000f\ufffd\u065d3\ufffd?\u0005}O\u0003\ufffd\ufffd\ufffd\ufffdNp\ufffd'\ufffd:\ufffd\ufffd\u001f\ufffd\ufffd\ufffd\ufffdIYwyU\u038er>]6\u0019\ufffd\ufffdu\ufffd}\ufffd\ufffd\ufffd\u000e\ufffd\ufffd\ufffd\ufffd\ufffd\u054a\ufffdeO\ufffd\u001b\ufffd\ufffd8n-A\ufffd\ufffd9\u00041\""D\u001e\\%r\n\\x\ufffd;X\u07089\ufffdr\u001a|G\ufffd\ufffd[\u0016;z\ufffdm\ufffd\ufffd\ufffd*1\ufffd6\n\ufffd\ufffdp\ufffd\ufffd{\ufffd\ufffdi\ufffdie\ufffd\ufffd\ufffd.\ufffd>\ufffd}\\+\ufffdA\ufffd\u059e\u0005iY\u001a\ufffd\ufffd\ufffd\u026c\ufffd\ufffdL9l\ufffd1Y\ufffdq\ufffd9F\ufffdE\u0017\ufffd\ufffd\u74a2\u0466\ufffd\ufffd1\ufffdWv\ufffd\ufffdmI\ufffd\u001c\u0019Zh;\r\ufffdG\ufffd4c6\ufffd<\ufffd@\u001b\ufffdy<\ufffd\u001a\ufffdh>\u07dc\ufffdT\ufffdW8AR\ufffd\u0004\tG4\u0011\u0005\u001e\ufffd\ufffd\u001b\ufffd\u0019\ufffdFP\ufffd9\ufffd\u001c\ufffd\ufffdI\ufffd\u001dQ\ufffd\u0013M\ufffd/\ufffd\u0002\u0014F\u0012ya \r\u0004\ufffd\ufffd\u0005\ufffd\ufffd\ufffdT\u001fG\u013c\ufffd\ufffdH+\ufffdj9D\ufffd1\ufffdkZ\ufffd@\ufffd,\ufffd\ufffd*\ufffdd>*\u001c\ufffdQa\ufffd\u001f\ufffd\ufffdi\ufffd\ufffd\ufffd\u0664\u0015\ufffd\u0017B\ufffd:\ufffd,$'0B\u00112\ufffdH\ufffd\ufffd9\u0014\u0016c\ufffdB\u0019DA\ufffd\ufffdw0\ufffdb\ufffd\u0006\ufffd\b \u0000\u0016\ufffdIj\ufffdc\ufffdF\ufffd\ufffd\u0006~\ufffd\ufffd\ufffd\ufffd,\ufffdh\u06f7i\ufffd\u07be\ufffd7\ufffdH\ufffd9\ufffd\ufffd\u007f\ufffd\ufffd\u066b\ufffd\ufffdlyW\ufffd\u0003\ufffd\ufffd\u00ddW\r~\ufffd\ufffd\ufffd\ufffd\ufffd7\ufffd/[vg>\ufffd\ufffds\u001f\u007fx\ufffd\ufffd\ufffdk\ufffd\ufffd\ufffd+\ufffd\ufffd+\ufffd}\ufffd\ufffd\ufffd\ufffdX\u0003\ufffdH\u0003>\ufffdO\u0013.\""M|Q\ufffdhM .G\ufffdl\ufffd\ufffd\ufffd\b\ufffdZi}P\u001f\ufffd\ufffd)Nou\ufffdg\ufffd\u000e\ufffd\u0005\ufffd\ufffd\""\ufffd~=\u058eH$K\ufffd\u04eeIF\ufffdA\ufffdrA\uece7!\ufffd\ufffdzzj\ufffd\ufffd\ufffd\ufffdm\u0002\ufffd\ufffdt\ufffd>\ufffdT\u0015\ufffd\ufffd\ufffd$\ufffd\ufffd\ufffd\u001e\ufffdW\ufffd\u001eX\ufffd\u001df\ufffdUQe\u0014yWd\u001fm\u0005\ufffd\u001f1j\ufffd\ufffd`\u0001\ufffd\ufffd\ufffdW=\ufffd|\ufffd\ufffd\u000f\ufffd\f\u000e@=\u001b-\ufffd\ufffd4\ufffd{\u0016eo\ufffdu\ufffd\ufffd\ufffda\ufffd\u0005\u000b\ufffd\ufffdW\ufffd\ufffd\ufffd'O\\\ufffd\ft\u0472\ufffdM#-\u001e\ufffd\ufffdY\ufffd\ufffd\ufffdc\ufffd<\ufffd\ufffdK/\ufffd$8\\I#\ufffdq%\ufffd\ufffd2d\u0015~ig\ufffd\ufffd\u0003Y@>\u0007\u0000\ufffd\ufffde\ufffd|\ufffd\ufffd6\ufffdLP\ufffd5\u0001\ufffd\u0004\ufffd\ufffd\ufffdE\ufffd\u0015\u0013eC\ufffd\ufffd4g\ufffdz\u0015P1\ufffdyi\ufffd\u0598|\f\u0013$\ufffdek\ufffd9\u0005\ufffd\ufffd]\ufffd\ufffd~\u001ck%!\ufffd\ufffdJ\ufffd\ufffdo`\u057cf\u00f8\ufffd~\ufffda\ufffd\ufffd\ufffdO\b\ufffdK\r\udb29\ude21\ufffd\ufffd\u0013\u06e8\ufffd*\ufffdu\ufffd\ufffdE\ufffd\ufffd4X\u0481G\u0012|n\u001dR\b\ufffd\ufffd\ufffd5@\ufffdS\tp\ufffd\ufffd=\ufffd|_n\ufffd\ufffdc\ufffd\ufffd44\ufffd\u0005\ufffdXX\ufffdvu\ufffd\u0007\ufffd\ufffd~u\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd{\u0017z\ufffd\u001d\ufffd\\y\ufffd\ufffd\ufffdr_{W\ufffd\ufffd\ufffd\ufffd\ufffd'o\u017b\ufffd\ufffdS\ufffd$\u049e\u0000\ufffd\ufffd\u0004^\ufffd\ufffd\ufffd\ufffd45S\ufffd-\u0005s\u0196\ufffd\u0019\u0312@\ufffd\ufffdE\u001a\ufffd\ufffd\ufffdT\u0314\ufffd\ufffd\nh&M\ufffd\u0000\fb5\ufffd\u0006\u001e\f\ufffd7a\u001eIv}\ufffd\u0006I\ufffd\ufffdw}m\ufffdIA\ufffd\ufffd\ufffd\ufffdb\ufffd_\ufffd\ufffdk2\u001f?v\ufffd\u0015\ufffd\u07d1\ufffd\ufffdak\u06ce4\ufffda\ufffdYv\ufffd[/\t\ufffd\ufffd\ufffd1V\ufffd\ufffd\b\ufffd\ufffdp~\ufffd\ufffdJ\f\ufffd\u07b2\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001f\ufffdejh\ufffd\u02ac\ufffd:\ufffd\u0729\ufffd\u0003=S\ufffd\u0016=aM\ufffd\ufffdD\ufffds8\ufffd\ufffd\ufffdJ\ufffdk\u001f\ufffd\ufffdo\u0018\ufffdH\ufffdj*US,\ufffd\ufffd\ufffdO]\ufffd:\ufffd\u0109\u001f\ufffd\ufffdi\ufffd\ufffdP\ufffd\ufffdye\ufffd\ufffd*\ufffdt\ufffd\ufffd\ufffd)\u0016\u001eLL'\ufffd2\u0014rd\r\ufffdD\f\ufffdK\u001e\ufffd\r\ufffdU\u0017\ufffd\ufffd\ufffdj\ufffd\ufffd/~u\ufffd\ufffdwl\ufffd\u007fe\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd^\ufffdH\ufffd(_q\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd_?\ufffd\ufffd\u04ed\u072eg\u000e\ufffdnxb\ufffdk\u0000\ufffd\ufffd\u07b3\ufffd\ufffdc8\ufffd/F,\ufffdO\ufffd\ufffd\u0011M\ufffd\u000bb\ufffd@\ufffdT)g\ufffd*\u000bmB\nf\u0005\u001f&)\ufffdG\ufffd|\ufffdc\ufffd\ufffd|r=\ufffdam\ufffd\u0005\ufffd\u0015\ufffd\ufffds\ufffd`\ufffd\u00117ns\ufffd\u001f\ufffd%\ufffdI\u001b\ufffd\ufffd\ufffd\ufffd`\ufffdB\ufffd\ufffd\ufffd\ufffd_c\ufffd\t\ufffd\u001f\ufffd\u001b\ufffd\ufffd\ufffdS\ufffd\ufffdPW\ufffd \ufffd\u0003Mf\ufffd\ufffdI\ufffdau\ufffdit\ufffdi\u001e\ufffd\ufffd\ufffd\ufffda[\u0013\ufffdI\u0016\ufffd=\u0002\ufffd\u0005\ufffd8\u0016\""\u001c\ufffd\ufffdl[7\ufffd[\ufffd%\ufffd\ufffd=.\u007f\u0016\u022d\ufffd\ufffd\ufffdx\ufffd\ufffd\ufffd)b\ufffd\ufffd\u0014\ufffd\ufffdF\ufffdL\ufffdu\ufffd\ufffd\ufffdm[\ufffdB\u069f\ufffd8\ufffd\ufffd\ufffd\ufffd\ufffdO\ufffd\ufffd\ufffd\u0016\u0014\ufffd\ufffdB\u00049^@\ufffd\ufffdQH_}`ST\ufffd\ufffd\u039c)\ufffdm\u001c\ufffd\u0012\ufffd\ufffd\u001e\ufffd\u0017\ufffd\u0011iW\ufffd\ufffd%\ufffd\ufffd+\u0004\ufffd\ufffd\ufffd\ufffd/\ufffdF5\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\u06dai\ufffd\ufffd\ufffd\ufffd\f\ufffd\f,\ufffd\b\u001aX\ufffd\u001f\ufffdh/\ufffd\ufffdO\ufffd\u0017hy\u0010\ufffdt\ufffd\u0002\ufffd0\ufffd\ufffd\ufffd\ufffdS\ufffd\n\ufffdLqvW\ufffd\u0007\ufffdLe\ufffdF\u0017\u0018\ta\u001e\ufffd\u0011;C!\ufffd\ufffd\ufffdod\ufffdG3`d\ufffd\ufffdYA\ufffdc9Y\ufffds\ufffd\ufffdFf-\ufffd[\n\u0004\ufffdr\u0004\ufffdZ-\ufffd>1b\ufffd\ufffd,\ufffdO\b*{<)\ufffd\u0018P8g\ufffd\ufffd;\ny\u0012\ufffdA\u000f\ufffd\ufffd\ufffde.\ufffd\u0003\ufffd\ufffd\u0013\ufffdS\u001eG9T\u0006\ufffdJ:\ufffd\u0015\u0012\ufffdm\ufffdHp\ufffdU5U\ufffd\ufffd!7O|X\u0174NU1\ufffdS\u054c\ufffd\ufffd8I\u0011S\ufffd\ufffdI\ufffdJ\ufffd\ufffd\t\ufffd\ufffdR\ufffdR(G\u0013\u0003\ufffdl\ufffd\u0012r\ufffd6\u001c\ufffd\ufffd+\ufffdh\ufffd\u001f\b\ufffdF\u02ad\u0015\ufffdB\ufffd>\u04b6D0\u0000\ufffd\ufffd=\ufffd7\ufffd\ufffd\ufffd-/\ufffd\ufffd\ufffd\ufffd\u001f\ufffd\ufffd\ufffdX\ufffd\ufffd\ufffdm3_\ufffd]1\ufffdi\ufffdV\u0016\u0016\ufffd\u077b\ufffd2\u0004\ufffd\ufffd\u001f\ufffd|S\ufffd\ufffd\ufffd\ufffdW\ufffdo\ufffd\ufffd^(<\ufffd\u043a;\u0286h\ufffdcj)\\\ufffd\ufffdz\ufffd\ufffd~\ufffdyKG{8B\ufffd\ufffd\u001a\ufffd\ufffd\ufffd2[q|\ufffd\ufffd(3\ufffd/n\ufffdJ<\ufffd~\u055e\ufffdq#\ufffd\ufffdm\u0007\ufffd\u5d7957\ufffd\ufffd~\ufffdTde\ube95\ufffdu%WK\u008e-\ufffdC\ufffda\u0000\ufffd\ufffd\u000e\u027b\ufffd \ufffd*\u0019C\u0017\ufffd/\u0004\ufffd\ufffdL\u0012\ufffd\u2c59\ufffd)n\ufffd\u0001\ufffdl\ufffd\ufffdC{\ufffdL\ufffd\ufffd(\u0002\u0764\ufffdV\""\ufffd\ufffdY\ufffd\u0000\ufffd\ufffd\ufffdv\ufffd\ufffd\u0017|\ufffd\ufffd\ufffdE\ufffd\ufffd\ufffd\ufffd\u00b0\u0090r7\ufffd\u000bx,\u047b#\u05ceqs\u001d$x\ufffd\u059d\ufffdZ35\ufffd\ufffdR\nV\u007fO\ufffd\u0002\ufffdj\u0662\ufffd\ufffd\ufffd\ufffdU\ufffdq3\u0015\ufffd\ufffdo\ufffd\u0006X\ufffds\ufffdP\ufffd[\ufffdT\ufffd\ufffdI\ufffd:l\ufffdB\f\ufffd\ufffd\ufffd \ufffd\ufffd\u001e\ufffd\ufffde\ufffd\ufffde\ufffd\u076b{\ufffd(\ufffd\u0499|\ufffde\ufffd\ufffd<8\u8a8c$\ufffd;\ufffd\u001dQ\ufffdV\ufffdK8P\ufffd\u0007\ufffd\ufffd/G\ufffd{O^F&d\ufffdpU\ufffd\ufffd\ufffde3e\ufffd\ufffd\u0016!)r\ufffdn\b(\ufffd\u0016$)\ufffd\u0011\ufffd\ufffd\u0010\ufffd#\ufffdIR#\u0001]\ufffd\ufffd1M&\ufffd|\ufffd\u0004}\ufffd@\u0000r\ufffd\ufffd\u0018\u0003\ufffd~\u0283\ufffd\ufffdCR\ufffd\ufffdZ\ufffdh<5\ufffdb\ufffdjb<\ufffdsRrK\ufffd`\u000b\ufffdWFq`\u00148\u0007\ufffd\u001c\ufffd<\ufffdg\ufffd2[.\ufffd^\u0017\ufffd*\ufffd7\ufffd\ufffd/\ufffd\ufffd\ufffd)Dr\ufffd \ufffd\u000e\ufffd(\u00eaZ\ufffd\ufffd[V\ufffd\u0007\ufffd\ufffdQ\u000f\u048d\u0012\ufffd\r\ufffdx]\ufffd\u001cL\u0017\ufffd\u016bF\ufffdX\ufffdi\ufffd[$]\ufffd&\ufffd\ufffd\ufffdN\ufffd%\u0004\ufffd\u001cI\ufffd\bR'#\b\ufffd\ufffd\ufffd\ufffdt&=Svf,\ufffda\ufffdLQ\ufffd]3\ufffdn\ufffd\u0003\u0006\ufffd\ufffd\u001e\ufffd\u0013\ufffd\ufffdV\ufffd\ufffdV\ufffd1l^\ufffd\u0017\ufffdWT\ufffd\ufffda\ufffd\ufffdx;\u0017\ufffd\u0006Aw\ufffd\\\ufffd\u007f\ufffd\u0011\ufffdF\ufffdY\u0004U\u0012\ufffdH\ufffd\ufffd\ufffdQ0\ufffd\n\ufffd\ufffd\ufffdV\ufffd\u007f)\u0003S(\ufffdJ`\ufffd\ufffdY\b\u001b6Ql\ufffd\ufffdF\ufffd\ufffdt\ufffd\ufffd\ufffd[\uc976tF\ufffd\n'\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd,\ufffd\ufffda\ufffd\u0006R_\b\ufffd}\ufffdv\ufffd\ufffdk\ufffdQ\ufffdRR62\ufffdT\ufffd\ufffddGif@\ufffd\u02e9\ufffd\ufffd7\ufffd\u0003}=\ufffd\ufffdC\ufffd\ufffdr\ufffd\u001fO\ufffdt\u001f\t\ufffd\ufffd\ufffd]\ufffd\ufffd\ufffdF}\u0013\ufffd\u0001~\ufffd\ufffda%F\u0004m\ufffd\u0214\n\u0014+\ufffdoaf\ufffdf\ufffd\u0002\ufffd\ufffd\ufffd\ufffdK\f\u054b \ufffd\ufffd1\ufffdi\ufffd\u0017,\ufffd\u0007\u0005\ufffdH\u0015\ufffdy\ufffdx\ufffd~\uea90\u0015(6\u009f\u0013\ufffd\ufffdKX\ufffd*\ufffd\n\ufffd5\ufffd\ufffd\u0017\ufffd\u001ed\ufffd%\ufffd\u0017\u0012\ufffd\u0004\ufffdB\ufffd\ufffd\ufffd\ufffd\ufffd9\u000b\ufffd\ufffd\ufffd[[Zg\ufffdK\u001c-\ufffd\ufffd\ufffdn\ufffd0>S\ufffd@\u0001u,9(\ufffdW\ufffd\ufffd\ufffdi\ufffd\ufffdV\ufffd&KX\ufffd\u0010Y\ufffd'\ufffd\u001dT\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd-\ufffd.acB\u000f\ufffd\ufffd\ufffd\u0016=\ufffd\ufffd\ufffdl\""*\ufffdk0/\ufffd`t\ufffd\ufffd\ufffd\ufffd\ufffd=\ufffd\u03edA\u0186\ufffd\r{\ufffdd\u0012\ufffd|\u0001\ufffd&q]\ufffdpJJ\ufffdE\u0003,\ufffdK\u000e\ufffdD\u001f\ufffdwv\ufffd\u04aa\ufffd\u0005+\ufffd\ufffd\ufffdh\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd\u0007\u044dA\ufffdF\u0005gv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004k\u0006\ufffd\f\ufffd\ufffdJ\ufffd\ufffd\ufffd\ufffdm\u000b\ufffd7\ufffd\ufffdo\ufffd\ufffdj\ufffdH\ufffd\ufffd\u0002vtj\ufffd\u0019HGb\u0003KC\ufffd\ufffdi,\ufffd@\ufffd\u001d\ufffd,\ufffd(\ufffd\ufffdp\ufffd\ufffd1\ufffd\ufffd\u0013x\ufffd\u000b\u0006d\ufffd\ufffd0\ufffd~\ufffdH%\u001a]z\ufffd\u0015\ufffd\ufffd#\u001d>VW\ufffd\ufffd+w\ufffdE\\\ufffdod\ufffd\ufffd\u007fh\ue4f5\ufffd\ufffd\t\ufffd6<8\ufffd\ufffd\ufffdS,\u0005,\ufffdFx\ufffd\ufffdGD\u0750e\ufffdn\ufffd\ufffd'\u0004\ufffd\ufffdJc\u0465pDi\u0097$\ufffd\ufffd]%H\u0002\u0012\ufffd\ufffd\ufffd\u0012\u007f6\u0016\ufffd\u0394cT\ufffd\ufffd\ufffd\ufffdd+K\ufffdN\ufffdT\ufffdM\t\ufffdd\ufffd\ufffd\u05f0\u0014\u0003\ufffd\ufffd\ufffd6\ufffd\ufffd@\ufffd&\ufffd\u0013\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\u0019a\nqx4r\u0016eSY1}\u0017\ufffd$\ufffd\u0019\ufffd\u014co\ufffd\n\ufffd\ufffd\ufffd\ufffdH\ufffd\u0004%\u02c8\ufffdE\ufffd8\ufffd\ufffdhtpED\ufffd5\u0007\ufffd~\ufffd\ufffd0<6\ufffd\u073a\ufffd7aQ\ufffd#\ufffd\u001a\ufffd\u0006\ufffdY\u0010w\u001b\ufffd#\ufffdY\ufffd>\u0468\ufffd\ufffdI\ufffdB.ho\u001e\ufffd.\ufffd\ufffd\u001e\ufffdF\u0013\ufffd9\u0018|\u0003\ufffd>=\ufffd\ufffd\t\ufffd\ufffd\u0012(\ufffd\ufffd\ufffd\b\ufffd\ufffd\u0001\u001dSJ\ufffdJk\ufffd\ufffdu\ufffd\u01a7C\ufffd\ufffd\ufffd\u0018\ufffd\ufffd\u007f\u0017\ufffdc\ufffd\u0007\ufffdm\ufffd7!\ufffd\u0007I\u0001\ufffd%/\ufffd\u001c\u0019\ufffd\ufffdx\ufffd\ufffd\ufffd\ufffdn\ufffd\u001cI\ufffd\u0013\ufffd9s\ufffd\fi~\ufffd\ufffd\u05fe\ufffd\ufffd\ufffd\ufffd\ufffd|\ufffd?\ufffd\ufffd\ufffd\ufffd\r\ufffd\ufffd\ufffd\u0755\ufffd\ufffd\ufffd\ufffd#\u007f\ufffd\ufffd\ufffd{O\ufffdi\u0002|\ufffd\ufffd\ufffd\ufffd\ufffd<\ufffd\ufffd\ufffd\u0017\ufffd~\ufffd\u05bf\ufffd_&\ufffd\""=\ufffd\u0011\ufffd\u0137\ufffdH\ufffd\ufffd%(Mt\u0012\ufffdt$\r\ufffdS\\\ufffd\ufffd\ufffd(x\u000b\ufffd0\ufffdRH\ufffdY\ufffd\ufffdf\ufffdV*\ufffd/'E\u029c\ufffd\u001d\ufffd\ufffd7\ufffd\ufffd l\u000e\ufffd>I\t\ufffd%\ufffd\ufffdX\ufffd(\ufffd\r\ufffdh\ufffd\u00a93\ufffd\u0007u\ufffdQO3k\ufffd\ufffdE\u000b\ufffd\ufffdOU\ufffd\ufffd\ufffd\ufffdtU\ufffd\ufffdB\u001c8)(\u0006J0E\ufffdh\ufffd\u0014c(Ec\ufffd\ufffd-\ufffd\ufffdq\ufffd\ufffd\ufffd^\ufffdn5\ufffd\ufffd\ufffd\ufffdC)\ufffdJ\ufffdc\ufffd\ufffd\u000f\ufffd\ufffdTwet(v\ufffd\ufffd\ufffd~\ufffd\u007f\ufffd\u01bc\ufffdky\ufffd\ufffd\ufffdO\ufffd/]\ufffd\ufffd\ufffdk/\u0017\ufffd\ufffd\r;K|\ufffd\u0003\ufffd\ufffdt\ufffd\u001c&5V\ufffd\ufffdb\ufffd\ufffd\ufffdGNL\ufffd\ufffd\ufffdM\ufffd{}?}\t\u001c\b.Z\ufffd\ufffd\u0019&\ufffd\u000fi\ufffd\ufffd\ufffd\u0011\ufffd\b\u070cx\u0004\u0003\u0002\u03b4*\ufffdK\ufffd\ufffd4\ufffd\ufffdZC\f\ufffd\u0012\ufffd)\ufffd\ufffdQ,m\ufffdO\ufffdr\ufffdL<\ufffd+D\ufffdQb&^8Q\ufffda\ufffd\ufffd,\ufffd\ufffd'44\u001aV\ufffd\ufffd\ufffd\ufffd1\ufffd\ufffdTU\u001c\ufffd1\t\u0017A\ufffd\u02219\ufffdw\u001b+\ufffd\n\u0010\u000f\ufffd\ufffd2p\ufffd\ufffd\u07deM\ufffd\ufffd\ufffd\ufffdk\ufffd#\ufffd_\ufffd\ufffd\ufffd\ufffd\ufffd)\r\ufffd\ufffdl*\ufffd\ufffd\ufffd\ufffdcQ\ufffd\u001d\ufffd\ufffd\u0695\ufffd,v:\f\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\u0003k\ufffd\u0016\ufffd\ufffd\ufffd\ufffdS''\u073e.\ufffd\ufffd\ufffd;\u0007bV\r|}\ufffd\ufffd!\ufffdk?@\ufffdw\ufffd#\u04dd\u0013\ufffd\rL!\ufffdD%\u007f\ufffd\ufffdm\ufffd\ufffd\ufffd\u0342w)#\u03c6)\n\ufffd\b\u0015\ufffd\""\ufffdP%\u07eb\ufffd\ufffd\ufffdD[+r\u001d\ufffd\ufffdi\ufffdJ\u0015\ufffd\u0002\u04e4G\ufffd3\u001e\fI\ufffd\ufffdq\ufffd\ufffdx\ufffdH\ufffd,\u0012\ufffd\b\u0004 zN6FU\u000b\ufffd\ufffdr\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd!\ufffd\ufffdm\ufffdx\ufffdQ\ufffd\ufffd\ufffd/\ufffd\ufffd\ufffdR\ufffdy\u001d\u000e\ufffd\ufffdm\u001b\ufffd\u001e\ufffd\ufffdL\ufffdZ3\ufffd\ufffd>;J<\ufffd\ufffd\u001b\ufffd\ufffd\u0015\ufffd\ufffd&\u0014\ufffd\ufffd\u0012K\u0006\ufffd\ufffd\u07cf\r\ufffd\ufffds\ufffdI3\ufffd\ufffd\f\u001b\ufffd\ufffd\ufffd \ufffd\ufffdV\ufffd\ufffd5\ufffd\ufffdq,v\ufffd\u001f:\u0000\ufffd\u001d>\ufffdA\u001c\u00117\ufffda\ufffd*&k%\u0003\ufffd\u007f\ufffd\ufffd\u0006\ufffd]:2\ufffdk\u0451\ufffd\ufffd\ufffd:N\ufffdD\ufffdI'W\ufffdu\ufffd\u0005\ufffd\ufffd)DxZ\u000e\ufffdSi\ufffdq\ufffdnO\ufffd\ufffd\u0011\u0002\ufffd?\u0019\b\u0014T\ufffd\ufffdz\ufffd\ud131\ufffdg7{\u0010#6\ufffd\ufffd\ufffde\ufffdq\ufffdV6~\rf\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00a6\ufffdxYS\ufffd4]+\ufffd\ufffd\ufffd6;\ufffd\ufffd\ufffd\u05d4r\ufffd\u0002\ufffd``\ufffdZwu\r\ufffd:\ufffd\ufffd&ki\ufffdm\ufffd\ufffd\u0212m\ufffd\ufffd\ufffdi\ufffdr\ufffd\ufffd\u0015_[\ufffd\u0179c<4\ufffd\ua2ed\ufffd1\ufffd\ufffdg\ufffd\ufffd\u0013}\ufffd\ufffd\ufffd'J\u0003\ufffd\ufffd\ufffd\ufffdRs\ufffdixKyq\ufffd\ucc5b__\ufffd\ufffd\n\ufffdR\u0005\ufffd%\u0015\ufffdl\ufffd_v\u0013\ufffdg0v\n_\ufffd\ufffd|Q\ufffd\u0002\ufffd\ufffd\u04c2dr,\r\ufffd>\ufffd\ufffdd*\f\ufffd\ufffd*\f=\ufffdZI\r\ufffd\u0000:\ufffdPr\u001a\u0002Ai\u0347J\ufffd1\ufffd\ufffd\u001e\ufffd\\;\ufffd\u021c(b\u0015}\u0003o\ufffd\ufffd\u015d\u000e\ufffdf\u015e\ufffdo$\ufffd\u000e\ufffdq\ufffd\ufffd\u0007\ufffd\rC\ufffd\ufffdt\ufffdqP\ufffdR\ufffdaUI\t\ufffd\ufffdQ\ufffdv\u0012}\ufffd~\u001c\ufffd\ufffd\ufffd\ufffd?\ufffd\ufffd\ufffd7\u05b6\u0015\u0005\ufffd\ufffdb\f\ufffd\ufffd\ufffdA\ufffd\ufffd~\ufffd\ufffd\ufffd\ufffdnjo\ufffd\r\u0006RC{\ufffdw\ufffd\ufffd0\ufffdW\u0015\ufffd\ufffd8\ufffd\ufffdm|\ufffd\ufffdk{]~o\ufffd@\ufffdcO\ufffdID\ufffd\u000b\u001f\ufffd\ufffd\ufffd\ufffdD\u0013q\ufffd@o\ufffd\ufffd\ufffd\ufffd\ufffd)\ufffd,>\ufffd2\ufffd\ufffd\ufffdi.he\ufffd@\u0013\u00b3\ufffd\ufffdN\ufffd<\ufffdZy@\ufffdK\ufffd\ufffd1\ufffd\ufffd!D\u0017\ufffd\u00002\ufffd=\ufffdxHD*\ufffd\u0015\ufffd\ufffdF4\ufffdI\ufffd\ufffdA\ufffdt\u0015\u000f\ufffd\u0006\u0016j{\ufffd\ufffd\ufffd!\ufffdo\ufffd\ufffd\t\ufffd\ufffd\u065dDi\u000f_\ufffd\ufffd-\u0000nS\ufffd\ufffd#2\ufffd*\ufffd00\ufffd(p+\u0309\u0593]\nj\ufffd\ufffd\ufffd\ufffd\r\u001d\ufffdp7\ufffd>\u000f\ufffd\ufffd\ufffd;\ufffdY8\ufffd\u0003_(\ufffd\ufffd\ufffd\u03af\u001c-K{\ufffd\ufffdVT\u001e\ufffd\u0013\u073c\ufffd'Lc\ufffd3\u0017\ufffd\""\ufffd ~x%~p\ufffd,\ufffd`s\u0016\ufffd\ufffd4\ufffdzW\tW\u0004\ufffd\ufffd\ufffdf\ufffd\u0019\u000f.\ufffd\u0354\ufffdz\ufffd\ufffd)'(\u01804\ufffd\ufffd\ufffd\ufffd\ufffdmj\ufffd\u07c7\u053b+#\ufffdD\ufffd\ufffd~[(?5\u0014\ufffd\ufffd\ufffdW\ufffd\ufffdw\ufffdP\ufffda\ufffd/\ufffd1\ufffd\ufffd\ufffd\ufffd\uff91\ufffd0z\ufffd?\ufffd\ufffdL\ufffdJ\ufffd\ufffdh\""\ufffd\ufffdu\u0003\ufffd\ufffd\ufffd\u001fE\ufffd\ufffdi\ufffd>\ufffd\ufffd3\ufffd+\ufffd\ufffdl\ufffd3\u0444\ufffd\ufffd\ufffd?\u011dw\ufffd\u001f\ufffd\u0016]*!\ufffdt_\ufffdL\u0444\ufffd\u000e\u0013\ufffd\ufffd\ufffd\ufffd\u0006Z\b\ufffd\ufffdB\ufffdP\ufffdr\ufffd\u001b\ufffd\u000f]\ufffd\ufffdb\u0010\""<\ufffd\ufffd\ufffd\""\ufffdx6b.\ufffdi|5\nW\ufffd{]\ufffd\u001d\ufffd\ufffd\ufffdW\ufffdx5\ufffd!\ufffd\u0010&J\ufffd\ufffd@asQ\ufffd\ufffd\ufffd\u0002r\u0015\u0015\u000e\ufffd\ufffdn\ufffd\u0004F#cB\ufffd\ufffd\ud3aa2H\ufffd\ufffd*\u07fc\ufffd\ufffdBC\ufffd\u000f\ufffdB\t\ufffd'r\\sg\ufffd\ufffd0\ufffd\ufffdz\u0001\u0010\ufffd\ufffd\ufffdz\u0001\ufffd\ufffd\ufffdB\u0005\ufffd\ufffd\u007fz\ufffdG\ufffd\u0017\ufffd\ufffd}\u001dq\ufffd\ufffd\u0000\u001c|\ufffd9\ufffd)\ufffd\n\u0191\ufffd\ufffd\ufffd\ufffd[w\ufffd\u001f\ufffd\ufffd\ufffdw*\ufffdn\ufffd\ufffd\ufffdQ\ufffdo\u0012*\ufffd}\n\u078b\fx\u0012i\\\u001f\ufffd\ufffd]\ufffdy\u001f\ufffd6\ufffdb\ufffdO\u0010\ufffd\u06c8\ufffd\ufffd\u001c>q\ufffdo8\ufffd%\ufffd^\ufffd\u001b\ufffdE7\ufffd\u0004a\ufffd\u0005\ufffd&K\u0018\u0006\ufffd\u0001dyA\ufffd&\u000f3\ufffd\ufffdLY\ufffd\ufffd\b\ufffd3!3e\ufffdN\ufffdM\ufffdbXdP1\ufffd1\ufffd\ufffdz\t\ufffd~2\ufffd-\nJ\ufffd\ufffd\ufffd8\ufffd4 \u001eL,\ufffdK\u01f2X!/jkm\u033f\u0019)\ufffd\u0016\u001a\u001ff\ufffd\u001e\ufffd\ufffd6\ufffd\ufffd9\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\b\ufffd\ufffdPdq\ufffd\u007f\ufffd-\ufffd\ufffd;\ufffd\u001b\ufffdC_62\ufffd\u0018\ufffdm\u007fK[\ufffd\ufffd457Y\ufffd\ufffd\ufffd\u0016+\ufffd{\ufffdYp\ufffd\u001ee.\ufffd\ufffdx\ufffdx\ufffd \ufffd\u0010W\ufffd%b\u007f\ufffd\u0015k\ufffdu\u0006e\ufffd\ufffd\ufffdb\u001b A\ufffd\ufffd\ufffdB\ufffd\ufffd.\u03e6]\ufffd{f~X\ufffd\ufffd4\ud9b2\udc2b\ufffdZ\ufffd\ufffdZ9\ufffd\ufffd/-\ufffd\ufffd\ufffd\u001d\ufffd\ufffd\ufffd>%TC\ufffd\ufffdC\u0010W\ufffd\rN\ufffd\ufffd\u0011\ufffd\ufffd\u0012M\u0ce0(\ufffda)\ufffd\u0011\ufffd\ufffdJ\u0013>_\ufffd**\u0017r\u0627f\ufffd\u001f H\ufffd\u00107\ufffd\u007f\ufffd\ufffd\u02ce\u000b.\ufffd\ufffds\ufffdA\ufffd|\ufffd\ufffd0\t\ufffd\ufffd~$\u0014\ufffd4\ufffd4\b\ufffd\ufffd\ufffdq(1\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdKl\ufffdT\ufffdm\ufffdmU\ufffd\ufffdZ](\ufffd\ufffd\u0014\u0006\ufffd\ufffd\ufffdN\u007f$\n\ufffd3\u0011\ufffd\ufffd\ufffd\ufffdW\ufffdL\ufffdC\ufffd\ufffde\ufffd~y\ufffd\ufffd\u5e0fm\ufffdn-\ufffd\ufffd\u000e\u000f\u0002\u001cZ\ufffd\ufffd\ufffd\ufffd\ufffdZ\ufffdv\ufffd\u07dd\ufffd\ufffd<\ufffd\ufffdR\ufffd{\ufffd\u0011\ufffd\ufffd\ufffdg\ufffdKJ\ufffd\u0550\ufffd\ufffd6\ufffdj\ufffdS\ufffd+\ufffd@\uac47\ufffd\ufffd{\ufffd\\+<\ufffd\ufffd\u0006BCkH;\ufffd\ufffdI\u00034Lq\ufffd\u0016\ufffd\f-\ufffd>\ufffd\ufffda\ufffd\ufffd\ufffdm\u0005=v\u0004z\ufffd^\u0003\ufffdG\b\ufffd)\u0010V\ufffdM\u0018 \ufffdGq\ufffd\u0019+j\ufffd\ufffd\ufffd%\ufffd\ufffd\ufffdm\ufffd\ufffd\u0163\ufffd\u0018\u000f$7\ufffd\u000b\ufffd'?wq\ufffd\ufffd]\ufffdT\u0015-m\ufffd\ufffd\ufffd\ufffd3\ufffd\ufffd,\ufffd\ufffd\ufffd\u0000\u007f\u0000\ufffdw\ufffd\ufffd\u0000?\u0016\u0006\\~\ufffd'C\ufffd\ufffd\ufffd\ufffdf\ufffdj\ufffd/\ufffd\u007f\u000f\ufffd\ufffd\u0351\ufffd\u001d\u0004\ufffd?\ufffd`Gh\ufffd\u0010\ufffd\ufffd\ufffd~B\u0007G\ufffd\ufffd\ufffd\u0016\ufffd\u0007\u007fLX\ufffd\u000e\ufffd,-\ufffdng\ufffd\u0016\ufffdv\ufffd\ufffd\ufffd\u0010'&\u5d7d\ufffd\ufffdQZ\ufffd\u0011\ufffd\b\ufffdt\ufffd\ufffdM\u06e5;\ufffd\ufffd/\ufffd\u000e\ufffd}\ufffdN y\ufffdG\ufffd\ufffd\ufffd,J\ufffd\ufffd q\u001d\ufffd\u0017P\u02c3r\ufffd\ufffd\u001048\ufffdA\u007f \b\ufffd\u0006\ufffd\ufffd\ufffd\r\ufffd\ff\ufffd\u0006j\ufffdr\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdej\ufffd\ufffd\u0007Mv\r0{qS\ufffdL\ufffd`\rr\ufffd\ufffdDd\ufffdn\u0015\ufffdIl\ufffd\ufffd\ufffd\ufffd\n\ufffd\ufffd\ufffd\ufffd\r\ufffd\ufffd\ufffd\ufffd\rE\ufffd\ufffd\r3\u0006\ufffd\ufffd_\ufffdX\r\ufffdN~2\ufffdK\ufffd\ufffdU\u0007A\ufffd\ufffd\ufffd\ufffd\ufffd=`\ufffd\u170e\ufffd;\ufffd\ufffd\ufffd|\ufffd\ufffd&\ufffdHO\u0015\ufffde0\u007f\ufffd;}]~M\u000e0\ufffd\ufffd\ufffd\ufffdFe\ufffd\ufffd\ufffde\ufffd\u0111\ufffd \ufffdD\ufffd\ufffdG8\u0010\u0017J\ufffd%;,\u0014e\ufffdX\u0002\ufffd\u0361W\ufffd\ufffdY\ufffdb\u0441\ufffd\ufffd\u0013\ufffd3C\ufffdY\u0720\ufffd\u001c\ufffd\ufffdu\ufffd\ufffdv\u0007\f\ufffd)*n\t\ufffdV\ufffd\ufffd\u0003j \ufffd~\by\ufffd\ufffdJh\ufffd\ufffd_B\\p\u000e\u000f\ufffd\u001c\ufffdT\ufffd$\ufffd\n\u001b\ufffd\ufffd\ufffd\ufffd\u000bO\ufffd\ufffd\u001ej\ufffdj\u0693\b=a\u0295\ufffd\ufffdU\u001a\ufffd\ufffd[--\ufffd\ufffd\ufffd\u0016\ufffd\ufffdY2\u001c\ufffd\u065cL\ufffdl.E\\\ufffd\ufffd\u0018\ufffd\ufffdh<\u0012\ufffd\u0314\ufffdQ\u001d\ufffd{\ufffd\u0007\ufffd\ufffd\ufffd3\ufffd)\ufffdN\ufffd\ufffd-\u0016\ufffd\ufffdL\u0005pgN\ufffdt \ufffd\ufffd\ufffd\ufffd5\ufffd\bi\ufffd\ufffdN\ufffdBC[N\ufffdPD\ufffd\ufffdPS30\ufffd\ufffdS$\ufffd\r5\ufffd\u0005~\ufffd\u007f\ufffd\ufffdk\ufffd\ufffdo\ufffd\ufffd\u001f_Y2\ufffdn\ufffdYY\u02ed\ufffd_\ufffdw\fo\u001e\ufffd\u0012-\ufffd\ufffdD\ufffd@w\ufffd\u0712\u0759\u001c\u001f\ufffd\ufffd\t^\ufffd\ufffd+\ufffdyK\ufffd\ufffd,Z\ufffdB\ufffd\ufffd\u0010\ufffd\ufffd\u0016%*\ufffd\tI\ufffd@,\ufffd\ufffd\u0011=\ufffd?\ufffdE\ufffd\ufffd\ufffd#\ufffd\ufffd\ufffd)\u0003=^\ufffdL9\ufffdU\u02d4&h1[f\ufffd\n3q:\ufffd\u0576D\f\ufffd\ufffdZ\ufffdL\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\u000b\u001abC\ufffd\ufffdYZ\ufffd\u001b\rg6\ufffdtS\ufffd\ufffd\ufffd9I\ufffd\u0019cS\ufffd\ufffd%9\ufffdCmq\u001a\ufffdN%[\ufffd\ufffd\ufffdq\ufffd\u000f%.\ufffdC\ufffdp\u001d\ufffd\ufffd\ufffd\u0013\f\ufffdQ\ufffd\ufffdIo\ufffd\ufffd\u000f;z\ufffd\ufffd>\ufffd\u0015E*\ufffd'\ufffd\ufffdIq6V\ufffdL\ufffdVTJ\ufffd\ufffdfW\ufffd\ufffd!\ufffdL\ufffd\ufffd\ufffd\ufffdj\ufffd\ufffd\u007f\ufffdz\u0005*\ufffd's\ufffd\ufffd\ufffdz\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd;hf+\ufffd\ufffd\u001c\ufffd\ufffd\ufffdQNf\ufffd\ufffd\ufffd\ufffdZ&'NkX\ufffdF\ufffd\ufffdvQ\u02cb\ufffd\ufffd\u0002\u001b\ufffd\u00077t?\ufffd'\ufffd\ufffd\ufffdd\ufffd\ufffd>\ufffd\ufffd\ufffd\ufffd\ufffd\u001a{\ufffd}\ufffd2\bf\u0017 \ufffd/\ufffd5hn\ufffd\ufffd\ufffd\ufffd%b0\u0199`\u0000\u0012\ufffdib\u029ce\u001dY\ufffdJ\ufffdf\ufffdv\ufffd\u0019\ufffd\ufffd\ufffd\"",u\ufffd\u0010?T4\ufffdT\ufffdd~\ufffd\u06e82\u0018ln\ufffd\ufffdf\ufffd#b\ufffd\ufffd\ufffdN\u0001\u00115\ufffd\u02dc\ufffd\ufffd\u0006\""\ufffd\ufffd\u0642\u0003ow\u0000\ufffd\ufffd\ufffd\ufffdQ\u0000 \ufffd\u078ap7\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\u01d5+v\ufffdi\ufffdDS\ufffd\ufffd\u0432\u0001\ufffdm\ufffd\u001cN4'\ufffd-^\ufffd1\ufffd\ufffd\ufffd\ufffd\ufffd\u0776\ufffd\ufffd\ufffdA\ufffd\ufffd\ufffd=\ufffd\ufffd.\u007fP\ufffd\ufffdD~\ufffd\ufffd\u0003\ufffd+\ufffd\ufffd\ufffd\u0014\ufffd\ufffdY\ufffd\u0256\ufffd\ufffdVZ%\ufffd\ufffd4\ufffd\ufffd\u053c\ufffdm\u0002\ufffdX\ufffdE\ufffdv\u0016\ufffd\ufffd:\ufffdC\u0001\ufffd\ufffdQ<5\ufffdB\ufffd#\u0014G\ufffd3eJ\u007fD\ufffds)N\ufffd\ufffd\ufffdih\ufffdn89\ufffd\ufffd(\u0599K=3\ufffd\ufffd%I\ufffd\ufffd\ufffd\ufffd\f\ufffd6\ufffd\ufffd]\u0010\u94319]\ufffd\ufffd<\ufffd\u0012+\ufffd\ufffdG\u001b\u0017\ufffd\u05f7\ufffd \ufffdK\ufffd\ufffdr\ufffdz\ufffd`'8\u0014\u007f\b\u00a6\u0547cP\ufffdcfT\ufffd\u06acH\ufffd\ufffd`m\ufffd\u001ca\ufffd\ufffd\u001dP\ufffd\ufffdnj*\ufffd\ufffd\ufffd\ufffdR\ufffdGA\ufffds\ufffd\ufffd\ufffd\u0013\u0006A\ufffd\\\ufffd\u0162\u0001`\ufffd\u0000j\u000f\u0682\ufffd\ufffd\ufffd\ufffdR+#\ufffd8\ufffd\ufffd\u0131\u0016\ufffdA\tt S\ufffd\ufffd|=2g\ufffd\ufffd\ufffd\ufffdw\u0223\ufffd\ufffdr\ufffd\ufffd=S\ufffdP\u001f\u0013i#\ufffd\u0272fK\u0012\ufffd?\u000e\u0376-\u0011\u0019q'\ufffd nI!\ufffd@m\u0007I2\ufffd \ufffdD?\ufffdZ+\u000b\u000f\nd\ufffd5HT\ufffd\ufffd\u007f\ufffdZ\ufffds\u024c\ufffdG\ufffd\ufffd\ufffdBD\ufffd\ufffd\ufffdD\ufffd;\u0006\ufffd\ufffd8\ufffdt\ufffd\ufffd\ufffd~y[\u0017!\ufffd\ufffds\ufffd\ufffdB\u0013n\""\u0271j't\ufffd\ufffd\ufffd\u001a\ufffdet\ufffd\ufffd\ufffd\u03f0\ufffd\ufffdxF6\u06c2]\ufffd\u0011\ufffd\u0003\ufffd\ufffd-\ufffd\ufffdjPk\ufffd\u0018\ufffdr\ufffd\ufffd\ufffd\ufffdom{\ufffd_\ufffd\ufffd\ufffdM~\ufffdK\ufffd\u001fxp\ufffd\ufffd\u0015\u0007\u001f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffds\ufffd{O\u001f=w\u001b\ufffd}\ufffd/\ufffd\ufffd\ufffd_\ufffd\ufffd\ufffdpF\u000e\ufffd\ufffd*\ufffd]\u001f\ufffd\ufffd0\u0017\ufffdc\u0004\ufffd\ufffd\ufffd)\ufffd\ufffd\u0011>\ufffd\ufffdu)\ufffd\ufffdGo\ufffdX,\u001bp\ufffd\ufffd\ufffd\ufffd!\ufffd\ufffd\ufffdqZ\\\ufffd\ufffd\u000f\u001e\ufffd\n!\ufffd\ufffd\ufffd\ufffdC\ufffdl\ufffd\u0006\ufffdy\ufffd\ufffdt\ufffd\ufffd\ufffd?\ufffdic\t\u0005\ufffd=\ufffd\ufffd\ufffd\ufffdbC\ufffd\ufffd\u001b\u001a\ufffd\ufffd}\ufffd\ufffdj\ufffdc\ufffdy\ufffd\ufffdq\ufffd\ufffd\u000f\ufffdC\ufffd\ufffd\u0015%ny^8'\ufffd\ufffdP\ufffd\ufffd\ufffd\ufffdS\ufffdR2\u001a\ufffd\\\ufffd\ufffd\ufffd4\ufffd'L\u000eS\b\ufffd\ufffdr&\ufffd#\t\ufffdg\u001d\u001a\ufffd\ufffd$W\u0013j\ufffd\ufffd\ufffdx\ufffdD\ufffd\u0019\ufffd\u0019\ufffdx\ufffd\ufffdX,\ufffd|\ufffd/\u0000\u0010\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdG\ufffd\ufffd\n\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\u001a\ufffd\ud968\ude47\ufffd+\ufffd7\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdN/\ufffdm\ufffd\ufffdvSo\ufffdk\ufffd&\ufffd\ufffd\ufffd\ufffd\u05e5\ufffdHG\ufffd\ufffd5nG{\ufffd#<>\ufffdR\u000b\ufffd\ufffd$\ufffd\ufffd;\ufffdg\ufffdA]x\ufffd\ufffdd;\ufffd\ufffd2D\u0007q5\ufffdnc\u0013\ufffd\u001cN\ufffd\ufffd\\\ufffd\ufffd\ufffd\ufffd\f\ufffd\ufffd)\ufffd\u0003\ufffd\ufffd\b\ufffdu\u0011\ufffd\ufffd,kL\ufffd\u0002\ufffd\ufffd\ufffdLKK)\ufffd\ufffd\u0003\ufffdj\ufffdl\ufffdb\ufffd\ufffd\u0017\ufffdR\ufffd\u001a\ufffd\ufffd\ufffdu5\u0005\u001b\ufffdk\b\ufffd\ufffd\u0203\u0006A\ufffd\ufffd\ufffd\u000b\ufffdl\u025e\ufffd\u001cH/\ufffd/w'\ufffd\ufffd\u000bM\ufffd\ufffdC\ufffd\ufffd\ufffd1,\ufffd\u0007\u000fLr\u05ecX)\ufffd|=\ufffdy\ufffd\ufffd\ufffd\ufffdP)\u001fe\ufffd\ufffd\u0000\ufffd?Sp\ufffdr\u001dW}\ufffd\ufffd\ufffdzL\u0480E\ufffd'\ufffdl\ufffd\ufffd\ufffdPe\ufffdD\ufffd\ufffd\u0011\ufffd\ufffdf\ufffd\ufffd\u0013&\b\ufffd6L\ufffd\ufffd0\ufffd\ufffd\ufffde\u0016\u0736t\ufffdKY-\u0018\ufffdY4\ufffd#\u000eG\ufffd?I\u04f9\u0124RY \ufffd\ufffdf{\ufffd\u6b58\ufffdSsb\ufffd\u007f.\ufffd\ufffdS\u0004%\ufffd\u05e0\ufffdX\u0400\ufffdi5\u0128\u007fa{6-\u073a\u04f7\ufffd\ufffd-\ufffdz\ufffd\ufffd\ufffd\u0007\ufffd.<\ufffdf\ufffd\ufffd{q\ufffd\u060e\ufffd\ufffd\ufffd&\u0016'~\ufffd\ufffd\ua9d7\u0002\ufffd\ufffd\ufffd\u022a\ufffd\ufffd>\ufffd#\ufffd7<\ufffd\u001a\ufffdU\ufffd\u001bL\ufffdT\u0016\ufffdWT\n\u0003\ufffd\ufffd\ufffdspM\ufffdGm\ufffd?#Z\ufffdR\ufffd\ufffd\""\ufffdsMF\ufffdNI8\ufffd\ufffd\ufffdo\u0001\ufffd\ufffd\ufffd\ufffd?\ufffd\ufffdsf\u03bc\u001fg\ufffd\ufffd\ufffd#\ufffd\ufffdd\ufffd\ufffd\u0250@B\u0002\u0004\b\ufffd\u001d\ufffd\""B\u0014\u0011D@\u0005\u0522\ufffd\ufffd\ufffd\u00025X\ufffdZK\ufffd^\ufffdG\ufffd\ufffd\ufffd\ufffd[\ufffdj\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd/>\ufffd}\ufffd\ufffd\ufffd\ufffd\ufffd%\ufffd\ufffd\ufffd93\ufffd\u0004Q\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u007f\ufffdH\ufffd0s\ufffd\ufffd\ufffdk\ufffd\ufffdo\ufffd\ufffd\ufffd\ufffdBT\ufffd0I\ufffdR(\ufffd\ufffdS\u02f4\ufffd\ufffd\ufffdf\ufffd\ufffd\ufffd\ufffdG\ufffdr\ufffd?\ufffd8]e\ufffd\ufffd\u0017\ufffd\ufffdb\ufffd\ufffd\ufffd\ufffd\u064f\ufffdMY\n\ufffd\ufffd\u000b\ufffd1T\ufffd\ufffdX\ufffd\ufffdl\ufffd5\ufffd-\ufffd\ufffdg\ufffd\ufffdLKn\ufffd6\ufffde\u0018kbr\ufffd\ufffd\ufffd\u007fN\u000f\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\u0388R\ufffd_S\u0010\ufffdu\u000b\ufffd+\ufffd9$\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdU\t\ufffdX\ufffd\f\ufffd\ufffd\u01e1P\ufffd\ufffd\u0445\ub080\u0001\ufffdQ'\ufffd\ufffdd\f'\ufffdOd\u000f\ufffd-C\ufffd\ufffdo\ufffd\ufffdr\ufffd\u0706\u0010\ufffdE\ufffd\u0011\ufffd\u0003\ufffd\ufffd0\ufffd+,j\ufffda\u000e\ufffd\u0019\ufffd\ufffd\ufffdS\ufffd[=\ufffd\ufffd\u0018o\ufffd}y\u001fx\ufffd\ufffd\u000b\ufffd\ufffd\u0000\ufffd\u04f6|F\ufffd#\u0533~\u0011x\ufffdD!K\ufffd\ufffd\ufffd\ufffd\u07c9\ufffd\ufffd\ufffd~\ufffd\ufffd:~\u0004\ufffd\ufffd\ufffdh\u0013M\ufffdp\ufffd_E\ufffdU\ufffd\ufffdF\ufffd\ufffd\ufffdA \ufffd\ufffd|\ufffdD\n\ufffd0\ufffd\u007f\""\u0015\u04abU\u03fdk6%\u001b\ufffd\ufffdP4\ufffd\ufffd\ufffdo\ufffd\u007fe\ufffdF\ufffd\ufffd \ufffdB|\ufffd\ufffd\ufffd\ufffd\ufffdn\ufffd\u0010\u0597\ufffd\ufffd\ufffd\ufffd?\ufffd\u04e6\u05b9\ufffdL)\ufffd\u007f\u0007\u001ag\ufffd\ufffd\ufffdrA\ufffd\u0001\u0002\ufffd\ufffd\ufffdr\u0019\ufffd\bz\u0007\ufffd\ufffd\ufffd\b\ufffdL\ufffdc\ufffd\u0016!\ufffdW\u1a3bE\u5df8\\a\u0015\ufffd\ufffd\u0007~\ufffdc\ufffd\u0017\ufffd\ufffd\u0001\ufffd!\u007fY\u0010}6\ufffd\ufffd!\ufffdofO \b\u000e\ufffd(\ufffd\t`\ufffd\ufffdo^S\u001a\u00125`\ufffd\u0018E\u007f\ufffd l=\ufffd\u0004l\ufffdht\ufffd\ufffdQ\ufffd\ufffd\ufffd\u10b3\ufffd\ufffd\ufffd\ufffdN\ufffdx\u0014\ufffd\ufffdsB\ufffd\u0011\ufffdx\u001a\u036e@l\ufffdZ%\u0006\ufffd\ufffd\ufffd\r\ufffd(au\ufffd\ufffd\""\ufffdQ\ufffd\ufffdF\\\u00175!3\ufffd\ufffd\ufffda\u0697\ud9a4\udcac\\\ufffd\ufffd\u00053\ufffd\ufffd\ufffdU\ufffd2\ufffdlu\ufffd`U\ufffd\\+\ufffdV\ufffdl\ufffdG\ufffd\ufffdJ\ufffd\ufffd\ufffd\u0011\ufffd\ufffdl\ufffd\u00106\ufffde\ufffd[\n\ufffdWD\u0345\ufffd#\ufffd\u020c\ufffd\ufffd_\ufffd\ufffd\ufffd\u0002`Fpz\ufffd+\ufffd\ufffd\u0005\r\ufffd\ufffd\ufffdz\ufffd\ufffd\ufffdE\ufffd\u0011\ufffd\ufffd\ufffd\ufffdR\ufffd\u000b\ufffdo\ufffd\ufffd\u05ee\ufffd\ufffdNM\u007f\ufffd\ufffdD\ufffdU\ufffd\ufffd\ufffd\ufffdV\ufffd\u007f\ufffd\t'-\ufffd\ufffdj]*\ufffd\ufffd\u00075>+\u000e\ufffd+\ufffdm\ufffd@\u000b.\ufffdd\ufffdj\ufffd)K\ufffd,D/Vp5A\ufffd\u0264\u0006U%\ufffd\ufffd\ufffd\u001a5rA\\2\ufffd\ufffdO\ufffde&I\ufffd\ufffdQ\ufffd\u0010J\ufffd\u0019\ufffd2\u0016\ufffdH\u0012\ufffdW\ufffd\u00042\u0003@\ufffd\u000e\ufffd\ufffd8\u022a\ufffd\ufffd1O)?\ufffdTe\ufffd\ufffdC\ufffd;\u001f\ufffd\u000e\ufffd\ufffdL!\ufffdp\ufffd}\ufffd\ufffd\ufffd\ufffdo\u000fy\r\ufffd\b\ufffd\u0011\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\ufffd\u0017\u0018\ufffdk\t\ufffd3\u0019\ufffdg\ufffd\ufffd\ufffd\ufffdw\ufffd6Wc\ufffd\ufffd\ufffdL\ufffda\ufffd\ufffd?\ufffd\ufffd\u007f\u0543\u0018\u030dh\ufffd\u0006b\u0013\ufffdP\u001e\ufffd\ufffdC.#\f8Z\\@\u007f7(\ufffd8\ufffd\ufffd$$Z\t)\ufffdZ\ufffdP\ufffd\bH\u001c\ufffddzD\ufffd\u000f\ufffd1>\ufffd\u0014r\ufffd\ufffd \ufffd\ufffd#\ufffd\ufffd\by*W:1\ufffdU\ufffd\ufffd\ufffd&\u0006\ufffd\ufffd\u0002\u02c8\u0005\ba\ufffd\ufffd\ufffd\ufffdr5\ufffd\u0005\u04c9\ufffd\ufffd\ufffd\ufffdKd7\ufffdj\ufffd\ufffd\ufffd\ufffd\u000f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004gw\u0000S\ufffd8wN\ufffdL\ufffd;\ufffd\u0010P\ufffd\ufffdI\ufffd/\ufffd\u000b\b\ufffdS\u0000\ufffdnU\ufffd\ufffd\ufffd\ufffd\b\u0011\b\ufffdby\ufffd\u05baa\ufffd|\ufffd~\ufffd\ufffd#f\ufffd\ufffd\u000b\ufffd9\ufffd\ufffdC\ufffd\ufffd(\u0014\ufffd\ufffd\fs\ufffd6\u0323\ufffd2\ufffdPh\ufffdT\u0014\ufffdh/G=\u000e\ufffd\ufffd\ufffdf\r\ufffd\fs\ufffd\ufffd\u0001\ufffd\ufffd~\ufffd\ufffdX\ufffd\u007fD\ufffdw\ufffdl\ufffd\u0001\ufffd\ufffd\ufffd\u001cR\u0004\u0002\ufffd\ufffd\u0010S\ufffd\u0114w\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdg\""\ufffdA\u07f2\ufffd]\u000e\ufffd\ufffd\u0010\ufffd\ufffd\n\ufffd\ufffd\ufffdP)$\u0019o?&&m\ufffd\ufffd\u0002+!t\n\ufffd\ufffd4\\\ufffdT\ufffd\u001b\ufffd\ufffd\ufffdMS\u0493\ufffd\ufffd\ufffd\ufffd\ufffdUwg\ufffdRK\ufffd\ufffdt\ufffd\ufffd\ufffdTw\u0004\ufffd\u0006j\ufffd\ufffd\ufffd\ufffd\ufffd5\ufffd\ufffd\u0729\ufffd\ufffdeUaK\ufffd\ufffd\ufffd\ufffd%jU&@\ufffdn).\ufffd49q\ufffd\ufffd\u0016\ufffd\ufffdd\u0253\ufffd\ufffd\ufffd\u0010Q\ufffd\u0012\u03a1Q\ufffd\ufffd\u022e\u000f+9\ufffdV\t\ufffd\ufffd\ud83c\udc5c\u0019yE\ufffd\u35a7\u0000DoR\u0002\ufffd\ufffdH\u0012\ufffd\ufffd\u01a6\ufffd\ufffd\ufffdz\u0011\ufffd\u0019\ufffd\ufffdbU\ufffd\ufffdn?\ufffd\ufffd\ufffd\ufffd=\ufffdg\ufffdT(+\ufffd \ufffd\u0014\ufffdI\ufffd\u0019\u000bA\u001aS9Y\u0001\ufffdKa\u000b$\ufffd\ufffd\u0005F \ufffd \u0001sqe\ufffdk]cz\ufffde-\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdQ\ufffd@\ufffd\ufffd\ufffd0\ufffd\ufffd[\ufffd|\ufffd\ufffdL\ufffd\u04f9\ufffd\ufffd[V-\ufffd\ufffd\u00130\u001a\ufffd\n\udab8\udf8c\ufffdIJF/j\ufffd\ufffdo\ufffd2\ufffd\ufffd\ufffdV~1Z\ufffd\ufffdh\ufffd\ufffdEk\ufffd@>\ufffdl\u03a4\ufffdI5I+X\u0005T\ufffda9\u001bb\ufffd\ufffd\u001c\ufffd\u0004\ufffd\ufffd\r\ufffdM\ufffd\u001cQ{4\ufffd=\ufffdt3'M\""\ufffd}S\ufffdW\ufffd\ufffd\ufffd\u0019\u05f8>\ufffd\u007f\u0010\""\ufffd\u0002Q\u0015\ufffd\ufffd\u000b\ufffd\ufffd\ufffd!\ufffd\ufffdt\ufffd\ufffdP\ufffd5oV_zn*\ufffd\ufffd\ufffd\ufffdz\ufffd\u0019\ufffd\ufffdOZ\ufffd\ufffd\ufffd\ufffd@\ufffd\ufffdkWm\ufffd\u001c\ufffd\ufffd\u0019\ufffd\ufffd\ufffd,?#\ufffdL\ufffd^\u001f\ufffd\ufffd2\u0013.\ufffd\u0018n\ufffd\b.\u0018\ufffd \u0014\u0007\ufffdL\ufffd&K1\ufffdG\u0018\u001d\ufffd~BR\ufffd\ufffd\""\ufffd\ufffd\ufffdN\ufffd!zA\ufffdv+\ufffdb\ufffd^\ufffd(3\ufffdcm\ufffd\ufffdY,\u007f%z\ufffd+\u00186\u0007p6\ufffd\ufffd\u001a\u001c\ufffd\ufffd6\ufffdU\ufffde\u0018\ufffd\ufffdj\ufffd\u0013\ufffd\ufffd\ufffd\u0010\ufffd,\ufffd\u000f\ufffd\ufffdK)\ufffd!.\t\ufffd[\u0005\u007f\ufffdP\ufffdZ*F3\ufffd\ufffd\u0493\ufffd\ufffdq\ufffd\ufffd\ufffdp\ufffd_cw\ufffd\ufffd`{\ufffd\ufffdSFw\ufffd\ufffd\ufffd\ufffdj\ufffd5\ufffd\ufffd\ufffd\b\ufffd[\u00041\ufffd\ufffdP\u000f\ufffd-\ufffd\ufffdW\ufffd5\ufffd\ufffd\u0004\u0015\ufffd\ufffd\ufffd\ufffd\ufffdi\ufffd$\ufffdN\ufffd\ufffd\u071e\n\ufffd2\u0011kH5^\ufffd\ufffd\ufffd\u0010\ufffd\u0001.E\ufffd`\ufffd\ufffd:\ufffd\ufffd\ufffd\ufffdz\f\ufffd\u001aI\ufffd\ufffdd\ufffd\u0018R(\ufffd\ufffd\u0012A\u001d[\u0010\ufffd&_`\ufffd\u0013F\u0003\ufffd\ufffd\ufffdW\ufffd\u0015\u0002`}\ufffd\ufffd\ufffd\u0010m&\ufffd\ufffd3\ufffd\ufffd4\ufffd@\ufffdQ\bv\ufffdP\u070c\ufffd\ufffd\ufffdz\ufffd\ufffdx\u0012!\ufffd\ufffd\ufffd0\ufffdL2Z\ufffdv\ufffd8\ufffdx\ufffd-i\ufffd4\""\ufffd\ufffdf\ufffdb\ufffdn\u0221\ufffd4\ufffd\ufffdC\ufffd\ufffd\ufffd\""C\ufffdY\ufffdsC\ufffd\ufffdB\rZ\ufffd\ufffd\ufffdp\u000eV\ufffd!\u064a-\""\ufffd\ufffdf\ufffdT\u000b&\n~\ufffdN)5\u001d\ufffd\\p\ufffdx%\ufffd\u0017g'\ufffd\u0019'\ufffd\u0287\ufffdR\u000e\ufffd\ufffd\u001e\ufffdO\u0007\ufffd*\ufffd#\u001c\ufffde\n&\ufffdg\ufffdJ\ufffd\ufffd}\ufffdqAKE\ufffd=\ufffd\ufffd{`Su]ck\ufffd>\ufffdh\ufffd\ufffd}\ufffd\ufffd\n$\ufffdlh\u000b\u0018\ufffd\u0250\ufffd\u001f)\ufffd\u0018\ufffd\ufffd\ufffd\ufffdYeL\ufffdx\ufffd\u0011q\ufffdU\ufffd\ufffdT\ufffd/T!\ufffdV\ufffd}]\u001f\ufffd\ufffd\u0011<\u001e\ufffd{Me\u0446#P\u0019C\ufffd\ufffd\u0019.\ufffd-\ufffd\ufffdB\u06aa\ufffd\ufffdbF\u039ae$\ufffd\f~\ufffd+\u0012*\ufffdC\ufffd\ufffd'ogu\u0013\u0011F\ufffd@\ufffd\u0006\ufffd\u001f\u000e\u001e\ufffd\b\ufffdU\ufffd\ufffd\u03cd)\ufffd\fX\ufffd\ufffd\ufffd\ufffd\nOEO,\ufffd)\ufffdb\ufffdl\ufffd\ufffdR\ufffd\ufffd\ufffdt\ufffd$)5W\ufffd\u0016T\t`\ufffd\ud9d9\udf56x\u01a5\ufffd 7F\u04b8\ufffd\ufffdu^\ufffd\ufffd%`\ufffd \ufffd\ufffd\ufffdSB\u001a\ufffd\ufffd\ufffd\ufffd\ufffd\u007f\ufffd\ufffdpV\ufffd\ufffd\\f~\u000f\ufffd\ufffd\ufffd\ufffd(\u0017\ufffd\u0013\ufffd#Ii\u0011o\ufffd\u0010\ufffd\ufffd\n\ufffd\u0147\t\ufffdqB\ufffd0\ufffd).\ufffd)\ufffdgDu\ufffdj\ufffd\ufffdNRTEo\u001cL\ufffd\ufffd4\ufffd!\u0000\u0188\u001fN\u000f8\ufffd|\u0002\ufffd}\ufffdn\ufffd\ufffd\ufffd?\u007f\u0395S\ufffd3n\ufffd\ufffd-\ufffdI\ufffdD\ufffdt\ufffd|\ufffd\u0005\ufffd\ufffdo\u0019Xs\ufffd;\ufffdw\u5935\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdF\ufffd\u0017f\u0017_]{\u0013\u07c1\u0019\ufffd\u0014\ufffd\u001e\ufffd\b\ufffdX\u000e\ufffd\ufffd.N\ufffd\ufffd\u0012\u001a\ufffd\u0014\t(y\ufffd\u0012\ufffde\u001dl\ufffd\ufffd\ufffd\""02\ufffd\ufffd2\ufffd\ufffd=\t\ufffdg\ufffd\u001c\u03bfa\ufffd\ufffdB[\ufffd\ufffd\ufffd)\ufffd\u0454\ufffd\ufffd#\ufffd\ufffd\ufffdX\ufffd\ufffdd(\u0006\ufffd\ufffdRY\ufffd\ufffd\ufffd\ufffd$;\ufffd\ufffd\u0015.I\ufffdG\""\ufffd\ufffdX.N\b\ufffd\u000b\ufffd_E\ufffdD\ufffd\uc914\ufffd:\u0000\ufffd\nQ\ufffd_b\ufffd\ufffd\ufffdge\ufffdX\ufffd&e\ufffdx}\ufffd\ufffd\ufffd\ufffd\ufffd{;\ufffd{\ufffdz\ufffd\ufffd\ufffd\u00162\u0005\ufffdmF\ufffd!\ufffd#\u007f\ufffdL%\ufffd\u000e\u0004\ufffdk\ufffdh\ufffd*\ufffd\ufffd\ufffd\ufffdC\ufffdF\ufffd\ufffd\ufffd;\ufffd^{5\ufffd\ufffdX\ufffdEXJ\ufffd\ufffd\ufffd&#)9\ufffd\u03da$\u00068\ufffdS\ufffdA\ufffd\u0000@\u0000-@R\u0002\ufffdK\ufffd\ufffd\u0014lL\u001aQ A\ufffd\ufffd\u0014\ufffd\u0001\ufffd\ufffd\u000f\ufffd\ufffd\ufffd,\ufffd\\er\ufffdd\u001dJH\ufffd\ufffd\ufffdIM\ufffdME\ufffd\ufffd~\ufffd\t\ufffd\ufffd\ufffd\ufffd\ufffd\u0013\ufffd?\ufffd\ufffd\ufffd\u001a\\=\ufffd\ufffd\ufffd7\u0450\ufffd\u007f\u0019s\ufffdR\ufffd\ufffd\ufffd\ufffd\u02dbf\u07f2,>;\ufffd\ufffdA\ufffd\ufffd\ufffd\ufffd93\ufffd\u007fz\ufffd\ufffdPo\u0007f\ufffd>\ufffd\ufffd\ufffd\ufffd\ufffd\u00131\u02d4[V_qx2k\ufffd(F}\u0240^N^:\ufffd\ufffd\u07f1u\ufffd\u00166\u0011s\ufffdR\ufffd\ufffd\ufffd<4\ufffd 1\ufffdS!\ufffdE\ufffd_\t\ufffdP\ufffd\ufffdhJ\ufffdYpVH\ufffd_0\ufffd\ufffdRy\ufffd\b\ufffd\f\u0004\ufffd\ufffd!'\ufffd\ufffdoN\ufffd\ufffdx\ufffd\ufffdA\ufffd3gq\ufffd\ufffd\ufffdj\u0016.d\ufffd<\ufffdt\ufffdX$S.\ufffd\u0018\u0246t\ufffd\ufffd \u000bq\ufffd>\ufffd\ufffd\u001cA3\ufffd+\ufffd\u0001\ufffd8\ufffd\ufffdJ\ufffd\u0011\u001b\u001a\ufffdL\ufffd\u001c\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd-h\ufffdUx\ufffd\ufffd\ufffd\u0011\ufffd\ufffdhu\ufffd\ufffd\b\ufffd\ufffd\ufffdw\ufffd\ufffd\""\u001d\n\u0006\ufffd\ufffd!\ufffd#mz\ufffd8\ufffd\u0019\ufffd\ufffd\t\ufffd\udb8d\udccb\u0175|v\ufffd7\u0018\ufffd\ufffd\ufffdE\u0012+\u0003$cY\ufffd\ufffd\ufffdY\ufffd\ufffd[_l\ufffdi\ufffd\u0017&M\ufffdI\u0774\ufffd\ufffdM\ufffd\ufffd\ufffd-\r\ufffd\ufffd\ufffd)\ufffd\ufffd\ufffd\ufffd\ufffdsY>\ufffd\ufffdm\u0005m\ufffdT'\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdLJ-^\ufffd>P_\ufffdM\ufffdC^\ufffd\u059f\ufffd\ufffdg\ufffd\ufffdL=z\b\ufffd=\ufffd\ufffd\ufffd\ufffd\u0010v\ufffdq\ufffdq2Z\ufffd\ufffd\ufffd\ufffd3\ufffdI\u0000R\ufffd\ufffd\ufffd'\ufffd\ufffd\u0012\ufffdz\u0006\ufffd\bE\ufffd\ufffd6\ufffd\u0473\ufffdK\""\u001b\ufffd\ufffd\\N1\ufffd\ufffd\ufffdHu)\ufffdI!\ufffd\ufffd\u0658\u02d2M\ufffd\ufffd\""\ufffd\ufffd\ufffdq#c\ufffd\ufffd\ufffd\\J?HFS6\u017a\u04e7\u0015x\ufffd\rVo\u0352\ufffd\ufffdE\u0017\ufffd\u000f\ufffd\u0012g\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdE\ufffd\ufffdf\ufffd$\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b7%\ufffdD\u0014\ufffdW)\ufffd; \ufffda s\ufffd\ufffd\bC\u0006\ufffd(\ufffd\""\""\u0001\ufffd![\ufffdi\ufffd\u001e\ufffd\ufffd\ufffdC\ufffd\ufffdC\ufffd\ufffd\ufffdC\u0001q_\ufffd\ufffd\ufffdN\u0436\ufffd\ufffdc\ufffdV\ufffd.\ufffdc\ufffd`D\u001d\ufffd\ufffd\ufffd-\ufffd>\ufffdu\ufffd\ufffd\ufffdu\ufffd\ufffd\""#\ufffd:m\ufffd\ufffd~F\""\ufffd\ufffdZ\ufffd\ufffds\ufffd\ufffd=F?\ufffd\ufffdI5{\ufffd\ufffd9\u0019 A|\ufffdI\ufffd\ufffdT\ufffd&x\u0519\ufffd13\ufffd\u000f0I\ufffdA\ufffd\ufffd\u000e\ufffd\u0002d\u044c\ufffd\u001aL~\ufffd1\ufffd\ufffd\b\ufffd\ufffdV\ufffd\uf6a52\u0003\ufffdq\ufffd@\ufffd\ufffd\u024c\u0324\ufffd`\ufffd\u0018\ufffd\ufffd\ufffdje\ufffdiq%\ufffd{\ufffd\ufffd\u0018\ufffd\u0010\ufffd\ufffd\ufffd\ufffdd\ufffd\ufffd\u001c\ufffd\ufffdC\ufffdL\u001e\ufffd\u000e\u0006\u5cabvY\ufffd\ufffd\u0016\ufffd\ufffd\ufffd3\ufffdOX\""!\ufffd\ufffd\t\ufffdh\ufffd\ufffdm\ufffd\u007f\ufffdd\ufffd\ufffdD\ufffdG\ufffdq\ufffd\u0005\ufffdi\ufffd\u0489\ufffd=x\ufffd)XO\u001dFc\ufffd!{\ufffd\ufffd\ufffd\u0016\ufffd\ufffd i\ufffd\ufffdX\u001dPptu6\u0002j\f\u001e)#\ufffd\ufffd\u007f\ufffd\ufffd3\ufffd)\u0016\ufffdIHi\ufffd:\ufffd\b\ufffdK\ufffdv!S}\ufffd\ufffd\ufffdx\ufffda\ufffd\u0007Ws,[\u0019^\ufffd\u0007\ufffdi\u000f\ufffd\ufffdG\u001f\n\u0000\ufffd? \ufffd\ufffd9q\ufffd\ufffd\ufffd&\u007f\u0010\u0010.\ufffdM\ufffd\ufffd\u001a\ufffd\u0018\ufffd\ufffd\ufffd\ufffd4\ufffd\ufffdV\ufffd&`\ufffd\u007f\u0002\ufffdy+\ufffd\ufffd\u068d\u000e\ufffdH\ufffd\ufffdX\ufffd\ufffdB\ufffdK\u0001\ufffd]\u03e2\ufffd\ufffd\u0013\ufffd8=\ufffdq\u01a9`\ufffdQd`u\ufffd\ufffdX\ufffd,\ufffdg\ufffd\u000e\ufffd&\ufffd\ufffd\ufffd6cp\ufffd\u133bbt\ufffd$\ufffd\ufffd\u00025]_\ufffd\u0620\u0013\ufffd5\ufffd\ufffd|\ufffd\ufffdU\ufffd\ufffd\ufffd\ufffd\ufffdG\ufffd\u03c9d\ufffd\ufffd\ufffd{<\ufffd\u001c\ufffdi*\u0014\u0095Aep\ufffd\""\ufffd\\j\ufffd\u007f\ufffdkp\ufffd\ufffd-T\ufffd\ufffdv\u0625\ufffdek\ufffd2\ufffd\ufffdM\u0460\ufffd\ufffd6\ufffd\ufffd\b\\.\ufffdJM=3\ufffd\u0530r\ufffd\u001eMO\ufffd\ufffd\ufffd\ufffd\ufffdt\ufffdJ$I\ufffdBf\ufffdl\u07e66*\ufffdF\ufffdL\ufffd\u0016_\ufffd\ufffd}>#z\u0017\ufffd+\ufffdf=\ufffd>2+h_\u001c\ufffd\ufffdV\u03aea\u0010Sf\ufffd\u001e2\n\ufffd_\ufffd\ufffdP\ufffd\ufffd\ufffd\u0014\ufffd`\u0014\ufffd`z\ufffd!\u0018\ufffdQf\u0013\ufffdX!\ufffd\ufffd\u0015\ufffd\u0005u59\ufffd\ufffd\ufffd\u0018a\u0795jtC6\ufffd\ufffdSNg21\ufffd\ufffd8\ufffd\ufffdlv|\ufffd?\u0013z\u021c\u0014\u0398\ufffd\u0014\ufffd\ufffd\ufffd\ufffd\u001a\ufffd\ufffdKY\u0016H\u0005J\""\u0014\u0014\ufffd\u0005\ufffdEf\ufffd7\u01b2\u001dR\ufffd\ufffd\u0011\ufffd\u0006\ufffdR\ufffd|n\u0010\u000f\ufffd\ufffd[v32\ufffd?\n\ufffd\u000e\ufffd\ufffdx\u0013\ufffd\ufffd\ufffdL+\ufffdX-\ufffd)\ufffd\ufffd\ufffd\u0790\u0005\ufffd\u0003m2\u0693\ufffdS \u01da\u001d\n\ufffd\ufffd*\ufffdx\u0000\ufffd\ufffd4\ufffd\u000b\u001b\ufffd\u001cX\ufffdvN\ufffdV\ufffd*\n*!\ufffd\ufffd\ufffd\u064fY\u0012\n\u0379\\J]\ufffd\ufffd\ufffd_d\u0014dY\ufffdJ\ufffd\u0002\nJE)\ufffd\ufffd>(\ufffd \ufffd$\ufffd\ufffdf\u0005\u0005I5\ufffd%\u001f&Gd\ufffd\u02958m\ufffd$\ufffdeY#$\ufffdq\ufffd\ufffdT\ufffd\ufffd\u00011U\ufffdt\ufffdx\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdt\ufffd\u001a\ufffd-\ufffd\ufffd\ufffd\ufffd7\ufffd83\u0019 \ufffd\u0001\ufffdY%\ufffd\u0007\u0010\ufffdEn\u0018\ufffd\u0015\ufffd\ufffd\ufffd3\ufffdUO&]\ufffd\ufffd\ufffd\ufffd#v\u001dE>\ufffd )cu\ufffd\ufffd\ufffdYS\ufffd\t\ufffd\ufffd\ufffd\ufffd>\ufffd\ufffd\ufffd/\"":\ufffd>b\u00150\b\ufffd\ufffd+\ufffd\u0002\ufffdH\ufffd\ufffd\ufffd_\ufffd\ufffd6\ufffd\u0014\ufffd\ufffd\ufffd\ufffd\ufffd__\ufffd\ufffd\ufffd6\ufffd7\ufffd\ufffd\ufffd\ufffd\\;\ufffd\ufffd\ufffd\ufffd\u0007N\ufffd\ufffd\u000e\u000e\ufffd\ufffd=\ufffd\ufffd\u0010\ufffd\ufffd\ufffd\ufffd\u001b\u0002\ufffd\ufffdW1w\u0019T\u0013;\u001b:]\ufffdz\ufffd\ufffd\ufffd\ufffdqww\ufffdw\ufffdZ-m\ufffd\u0014\ufffd\ufffd\u0017\ufffd\ufffd\t\ufffd\ufffdT\ufffd\ufffd\u0011\ufffd\r\ufffdi\ufffd\ufffdN0 \u03cf7\ufffd*u\ufffd.3>!\ufffd'jQ9\ufffdW\ufffd\ufffd\ufffd\t\ufffd\ufffd\u000b\ufffd\ufffdkmmo><\ufffd.\ufffd\u0016\ufffd\ufffd1\ufffd\ufffd{h@_j\ufffd\ufffd[C\u01b2_\ufffdX\ufffd#\u0004\ufffdb9\ufffda\u001c\ufffd\\\ufffd\ufffd\ufffd\ufffd\ufffdVRD\u0721\ufffd\ufffd\ufffdJ\ufffd\u0016\u0002\ufffd\ufffdia+K\ufffd\u048b\u000b8w\""\f\ufffd\ufffd\ufffd\ufffd\ufffd-\ufffd,i\ufffdicg\ufffd\ufffd\u0007\u0007&]97\ufffdv$fl\ufffd\ufffd}\ufffdI\ufffd\ufffd0\ufffd\ufffdl\ufffd\ufffd\u0004\u0761\ufffd>\ufffd@\ufffd\u0011\u04c9\u0019\ufffd#\u0712@\ufffdX\u001bQ5\ufffd]\ufffdN:\ufffdvX[\ufffd\u0015\b\ufffd]YO&\ufffd\ufffd\ufffd~}y.\u000fa\u0017\ufffd\ufffd\u0010\ufffd\f\ufffd[\ufffdp\ufffd\fy0\ufffd\ufffd\ufffd\u037a\ufffd\ufffd\u04d1\ufffd|\u0016s\ufffd\ufffdb\ufffdt\ufffdh\ufffd\ufffd\ufffd1[\ufffd\fiM\u0193\ufffd\ufffd\ufffd\ufffd9\ufffd5\ufffd\u000bk\u0373D\u02f5\ufffdl\ufffd\ufffdV>\ufffdk\r\ufffd?\ufffdK\ufffdO\ufffd\ufffd#u\ufffdR\u0012\ufffd\ufffd2\t\ufffd;\u001e\u0014\ufffd\\N \ufffd\ufffdH\u0424\ufffd\u0010^\u0001\ufffdx\ufffd}kV\u001f\ufffd\ufffd{\u007f&c\ufffd\ufffd\ufffd\ufffd\ufffd|\ufffd\ufffd\ufffd\ufffdm[R\ufffdVo\ufffd\ufffd\u0001\ufffd\u07f48T\ufffd\ufffdyr\ufffdxq}c\ufffdr~\ufffd\uc169\ufffdS{\u0017e\ufffd3g^\ufffd\ufffdms;i\\\ufffd\ufffd\ufffd]\u077b\ufffd\ufffd\u0386\u0019\ufffd\ufffd\ufffd%-\u001eSfZ\ufffd\ufffd\ufffdsk\ufffd~\ufffd]\ufffd!\u0012\ufffd3\ufffd\u0015\ufffd\u0368\ufffd\ufffd\r\ufffd\\s\ufffd\ufffd\\\u0019j\ufffd\ufffdi\ufffd\u06d5\ufffd\ufffd\ufffd\ufffde\ufffd+\u0006\u0002)x-\u00ae\ufffdQ\u05c3\ufffdBg\ufffd\u001eaO[.\ufffd\u0006\ufffd\ufffd)\ufffd\ufffd\u0012z\ufffd\b\ufffd\ufffd_\ufffd\ufffd%-\ufffdv\u0001\ufffd\u001f\u01cd[\b\u0002\ufffd;\ufffd\ufffd\ufffd5\t\ufffdI\ufffdC\ufffdH\ufffd\u0002\u0010\ufffd?\ufffd\ufffd\ufffdL\u001a\ufffd7\ufffdt\ufffd}\ufffd\ufffdsM\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\ufffd\u001d$\u0510\u0000'\ufffd\ufffd \ufffd\ufffd\u0014\ufffd>>>\u0016\ufffd\u04d2\ufffd\ufffdO\u0013\ufffd\ufffd/\u0005\ufffd\u0003\ufffd\ufffd0\u001f9<\ufffd\ufffd\u0004\u000fT\ufffd\ufffd\ufffd\ufffd\ufffd0~Y8\ufffd\ufffd\u001b\u0017\u000f\ufffd\ufffd\ufffd\u0007\u001f|\ufffd\ufffd0\u0000~B6\ufffd\ufffd\ufffd\u0013\u001a\ufffd\n\u0016\u0012@\ufffd\u0011\ufffd\u0000\ufffd\b\u0001E\u0003\""R_\ufffd\ufffdAlK \u0007\ufffd#\u0003\ufffd?\ufffd\ufffd\ufffd\u0100\ufffd\ufffdl\ufffd\ufffd\ufffdU\ufffd#\ufffd\ufffd\ufffdV\ufffd\u0011\u001aq\ufffdQN%>\ufffd\ufffdab\u0002\ufffd\ufffdG\u022dG0cz\u0006\r\ufffd\u0000=\u0007}FJL\u0012oE \ufffd'8\tZ\u0013\ufffd\u0004\ufffdz\ufffduX\ufffd\u001f\ufffd \ufffd\ufffd\ufffdx\u0012\ufffd\ufffd\ufffdX\ufffdS\ufffd\u0457qYM\u9f65W\ufffd\u0010Ab\ufffd\\\u000f\ufffd.\u02fc\ufffd\u0002=\ufffdl\u0017\ufffd\ufffd\ufffd\u001c@\ufffd&\ufffd[\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdpF\ufffd\ufffd{\u0002\ufffd\ufffd\ufffd\ufffd\u0003\ufffdz@*\ufffd1c\ufffdM\u001c\ufffd]\ufffd\u0013\u0019\ufffd\u0017\ufffd\u0001\ufffd\ufffd%6\ufffd\u0632\ufffdJ\u001f\ufffd\u0013\ufffdu\ufffd\ufffd\ufffd9\ufffd\ufffds\u001f\ufffd'\ufffd0)\ufffd\ufffd\u0004\ufffdl\fM\ufffd.*LX\ufffdz\u03ae5\u001a\u0426\ufffd}\ufffd\u007f\ufffd&5\ufffd\r\u001e\ufffdT)!v)\ufffdv\ufffd\ufffd\ufffd?\ufffd=U:\ufffd\ufffd8F\u01ec\ufffd\ufffdg\ufffd\u0000\ufffd\ufffdp0'1\ufffdwU\ufffd)]\ufffd\ufffd\ufffdvylvc\ufffd1\u001b\u00057\u0016h\ufffd\u0014[\ufffd\ufffdtS\ufffd\ufffd7u\u001e\ufffd8\u0012Tz}\u001d\ufffd[\ufffd\u00034\ufffd\f2k\ufffd\ufffdhB\ufffd\ufffd\ufffdH\ufffd\u0494\u0014\ufffdT\ufffd\b\ufffd\ufffd\u0006Y@\ufffd\ufffd\u001b\u001c\u0006\ufffd\u0002\u00079\ufffd\\\u001e\ufffd\ufffd`\ufffdL\""u\ufffd\ufffd\ufffd\""\ufffd\ufffdL\u00166\ufffdX\""\ufffdr\\E8\u0010\ufffd\ufffd\u0353H\ufffd\ufffd\u057d\u0652\ufffd6f\ufffd\u0005\ufffd\u0012,_S\ufffd\ufffd^\ufffd\t\ufffd\ufffd\ufffdi)\ufffd\b\ufffd\ufffdh\ufffdad\ufffd>\ufffd\ufffd?{\u001f\u07b0ty\ufffd\ufffd\u0005K6\u066f\ufffd\ufffd|\u03f1{\ufffdz\ufffdv\u001e\ufffd8\""Q\ufffdB\u001e\ufffd/\ufffd)\ufffd_\u07d2@\ufffd\ufffd\ufffdy|Y\ufffd\ufffdJh);n\ufffd\u01b1J\bN\ufffdM\ufffd\ufffd+B~\ufffdx\u001b6Pn\u0015/j%\ufffd\ufffd$\u007fO\ufffd\ufffdb\ufffd\u000b;\ufffd=\ufffd\ufffdfQ7\ufffdz\u055ag7\ufffd\ufffd\u0563\ufffd\u03ac\ufffd\u04f9\ufffd\ufffda\ufffd\ufffd\r[\u0014\ufffd\ufffd}=k\ufffd\ub9b6\ufffd\ufffd[\ufffd\ufffdTU\ufffdm\ufffd\ufffde\ufffd\ufffd\ufffd\ufffd{M_H\ufffd\ufffdc\ufffd\ufffd\ufffd\u0017=t\ufffd\ufffd\u0003\ufffd\ufffd\u001b\ufffd\ufffd\ufffd\ufffd[\ufffd\ufffd\ufffd\u01b3\u007f\\\ufffdgf\u01cd}K\ufffdt%zp!5qq\t\u5c76\ufffd8\ufffd*\ufffduRV\ufffd\ufffd\ufffdRi\ufffdlF\ufffd\u0014\ufffd\ufffd-(/\ufffd\ufffd'\ufffd\ufffd\u0004\u001b\ufffd\ufffd\ufffd \ufffd\ufffd.\ufffd'\u0015\u076bT\ufffd\ufffd\ufffd/A\ufffd\ufffd+/]\ufffdg\ufffdcMw\u0005\ufffd` )i\ufffd\u0015\u0012(\ufffd*\u01c1\u000ed\u007f\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffds\ufffd\ud36e\ufffd\ufffd\rC\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdi\ufffdE\ufffd\ufffd\ufffd/l\u9e74f\ry\ufffd0\u0000n`\ufffdj\u001b\u001b\ufffd\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd~\ufffd\u001f|\u02dc'\ufffdj\u001d)O\ufffdz\ufffd7\ufffd\ufffd82p\ufffd;\ufffd\ufffd\ufffdK\ufffd\ufffdO\u0002\ufffd\ufffdB\ufffd\ufffdH\ufffd\ufffdA\ufffd\ufffd\u0012E\u03adC\ufffdd`L\u0014f\u0019?hcL\ufffd\ufffd`\ufffdI\b\ufffd\ufffd\u0625R\ufffd\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdoZ\ufffd\u0013\ufffd\u0011Rcj\ufffd\ufffd\ufffd\\y\ufffd[\ufffdi\bN\ufffd\u0007J\ufffd\ufffd\ufffda\ufffd\ufffd\ufffdmV\ufffd\ufffd5\ufffd:\u0006v\u0017$\u007f\ufffd\ufffd\ufffd\ufffd\u001a\ufffd\ufffdY\u0016\ufffd,\ufffd\ufffdH0\u0016\ufffd\ufffd\ufffd\ufffd\ufffdhLQ\ufffd\ufffd\ufffd\u0458\""\ufffd\u0002.\ufffd\u0010I/\ufffdXL\ufffd\ufffd\u0004m\ufffd#\ufffd\ufffd\ufffd\u045c\ufffd\ufffd\ufffd#L\u0004F\ufffd2\ufffdT\ufffd\u0663\ufffdWY#2\ufffde\ufffd5u:Wf\u0015Y\ufffdV\b\ufffd\ufffdk\u0019O\ufffd\u0549i\ufffd\ufffdrq!n\ufffdZ(\u001fnWp\n\ufffd9\u016aLc\ufffd\ufffd\ufffd\ufffd;\ufffdb\ufffd\u001b7n\ufffd\ufffd\u0016,\ufffd\u0015]O\ufffdn\ufffd\ufffdz\ufffd\u0013O\u001b\u0013\u074b\ufffd?=\ufffdN\ufffd#\ufffd\ufffd\ufffdJ_\ufffd\ufffd\ufffd\u001d\u014eK\u0016\ufffd\ufffd6\u0014_}\ufffd.w\ufffd\ufffd\ufffd\ufffd\ufffd+/\ufffd\ufffd\ufffd!\ufffd\ufffd\u0014\ufffd}\ufffdpc\ufffd6\ufffdMc\u0003:\ufffdR\u0006C!A\ufffdB\ufffd)\ufffd\u0018\ufffd\r\ufffdMW\ufffd\ufffdV\ufffd \ufffd(\ufffd\u0004\u0004\ufffd#\u0014\ufffddB\ufffd\ufffd4\""\u00126fOU\ufffdM\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd.\ufffd#\ufffd\ufffd\ufffd\ufffd\ufffd\ne\ufffd\u0015\\B`R\""\ufffd(_B\ufffdU4b\ufffd\u0197\ufffd\ufffd\u001f_\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\u0017\ufffdz\ufffd\ufffdg\ufffd7\ufffd7\ufffd\ufffd~\ufffd\ufffd\u000bn\ufffd\u0442M\ufffd\ufffd79\ufffd\ufffd\ufffd\u000b5\ufffdoX8\u7ea5I\ufffd@l|\u0004\u0013\ufffd\ufffd\ufffd\ufffdv\u007fcp\u001e3oW\u07fa\u036b.\ufffd\ufffd\u0000\ufffd\u0003\u001aq\u0007\u001b\ufffd#\u0016\ufffd7~&\ufffd\ufffd\ufffd\u001aF.w\ufffd\u000e\ufffd8\ufffd\ufffdi\ufffd\ufffdY\ufffd;\ufffd\ufffdf\ufffd0P\ufffd\ufffd\ufffdovx\ufffd\fE\ufffd\u0001\ufffdT\bv\ufffd\ufffdB.u>M(\ufffdr\ufffd\ufffd\u0000\ufffd\ufffd\u001c!/r\ufffdsuq\ufffd\ufffd)\ufffds\ufffd\ufffd>\ufffdUw+?\u0016\ufffdD[\ufffd\b\ufffdM\ufffd l\u0011n?\ufffd\ufffd\ufffd\rb\ufffd\ufffd\ufffd+^|\u0006\u038d`jp\u0000\ufffdEhE\ufffd\u0407\u001138\ufffd\u0018\u0000\ufffd T\ufffd\n4\u03a3\ufffd\u0007\ufffd\u0010\ufffd?N\u000fX\ufffd\u000f\ufffd\ufffd>\ufffdh\ufffd&\u001d4\ufffd\ufffd^\r\ufffd\u0001\ufffd\ufffd\ufffda\""\ufffd\u0013\ufffd/\ufffd\ufffd\u0010(A\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd:1\ufffd4\ufffd\u0003\u0014\ufffd1\u000e\ufffdh\ufffdk\ufffd\u049d_\ufffd\ufffd:\ufffdmym\u000f\u0019\ufffd\ufffd\ufffd\ufffd\ufffd\u045fTom\ufffd\ufffd\ud915\udddf\ufffd\ufffd\ufffd\n\ufffdV-\ufffd\ufffd\ufffd\ufffd\ufffd\u001c \ufffd0{>\ufffd;\ufffd\ufffd\u007fx\u04cd\u03ec\u0137\ufffd\ufffd\ufffd\""\u0004\u0004I\u0010}\\\ufffdEK$:\ufffd\ufffd\u0006m\ufffds2\ufffd5dEV\ufffd\ufffdR:\u031du,\ufffd\ufffd\""\u06e6B\ufffd8\ufffd\ufffdc\ufffdh\ufffd?\u000f\ufffd\ufffd# \u001a}\t)\ufffd\ufffd\ufffd\u000f\u0014\u0000\ufffd\ufffdH\ufffdQTAm\ufffd\ufffd\ufffd\u000f\ufffd\ufffd\ufffd\u07bdd\ufffd\u045e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffds\ufffd\ufffd@{\ufffd?\ufffdY\ufffd\u0013RJ\ufffd\u001d\ufffdw\ufffdj\ufffdo\ufffd\ufffd\ufffd\ufffd\ufffd#NP\ufffd\ufffd+\u001e\ufffd|\ufffd\u03ee@\ufffd_\ufffd\u0010\ufffd9\ufffd\ufffd\u0019]k\ufffd\ufffd(\ufffdlm\ufffd\ufffd/T/\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd87\u0002\u001f\u0015,\u007f\u0017\ufffd(\u0019~\ufffd\ufffd\u0096\u037d\ufffd\ufffdua'Zz\ufffd\ufffd\ufffd\u0013\ufffd\ufffdv\ufffd#\ufffd\ufffd\ufffd>\u0003\\@\u0007\ufffd\ufffd\ufffdR\ufffdq$\ufffd@\u001b\ufffdV\ufffd!\ufffd;' \ufffdV|\ufffd;\ufffd;\n\ufffd\u0016\ufffd$z\ufffd\ufffd\u001b\ufffd_\ufffd/\ufffd?l\u0015\ufffd\ufffd\ufffd\ufffd0<\ufffd\ufffdh\ufffd\ufffd*\ufffd^\ufffd?\u001d\u07eb\ufffd\b\u001d_(\ufffd`\u001e\ufffd\ufffdX\ufffd\u0002\ufffdq\ufffdv\ufffd\ufffd\u0010ZFN\ufffd6\u000b\ufffd\ufffd\ufffd\ufffd\ufffdX\ufffd}\ufffd\u00077\ufffd\u2b7b\ufffd\ufffd~z,\ufffd^l\ufffd\ufffd\ufffdLa\ufffd\ufffd\u056d\ufffd\ufffd\ufffd\ufffd5\ufffd>'J~\ufffdw\ufffdL\ufffd\u0004l\ufffd?\ufffds=yPe\r\ufffd\u0018[U\ufffd\u67ee\ufffd\ufffd?\ufffd]4\u00d2\ufffd\u0012\ufffd\u01d6o\u0016\u013e8G\ufffd\ufffd\u0005Z\u0006\u0019J\ufffd\ufffd`p\ufffd\ufffd\\\ufffd'\u0017\ufffd\ufffd\u000e\u000e\ufffdw\u000e\u000e0\ufffd7\u000b\ufffd\ufffd\ufffd\ufffd\ufffdk\u0005\ufffd\ufffd\ufffd\ufffd\ufffd|\ufffd\ufffd\ufffd\ufffd.\ufffd\ufffd\ufffd\ufffd\ufffd[\ufffdo\ufffd\ufffdqmw\ufffd\ufffd:\ufffd\u0016\ufffd\u0005\ufffd\u0014<\ufffd\ufffd\ufffd\ufffd\u001f\ufffd\ufffd\ufffd\u000f\ufffdC\ufffd\u0013\ufffd+\ufffd\u0006'\ufffd\ufffd\ufffdY\ufffd\ufffdAz\ufffd\u0010\ufffd^/\ufffd\ufffd\u0688%b\u000fO\ufffd\ufffdh4\ufffd=w\\Y\ufffd6\ufffd\ufffdU%v\ufffd\ufffd\u000e\ufffdx`\ufffd}\u001e\ufffd\u0017\ufffd\ufffda\ufffd\ufffdn\ufffd\u0014c\u001f7\ufffd\u0457\ufffd\u0010\ufffd\t\ufffd\ufffd*{+W8\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdF\ufffd\ufffdd\ufffd\u000e\ufffdg\ufffd\ufffd88U\ufffd\u0000\ufffd\ufffd!hT\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd<\u0019\ufffd\""\ufffdb\ufffd4`F&\u0017\ufffd\ufffd:4\ufffd\u0017\u0005\ufffd{\ufffd0\ufffd\ufffdW\ufffd]\ufffdU/\ufffd2\u06cb\ufffd\u007f\ufffd\ufffd\ufffds\ufffd\u04af`lN\u04d1\ufffd\ufffd\ufffd3\ufffd\ufffd\u0003\f\ufffd\u0016\ufffdc\ufffd\ufffdk\ufffd'pD\ufffd\u001f2\ufffdO\ufffdkL6\ufffd\ufffd-H\ufffd^\u0012l\ufffd\ufffd\ufffd\u001d;\ufffd3\u0642!\ufffd\ufffdb\ufffd\ufffd\ufffdy\ufffd\u033bU\ufffdPpp 4\ufffdK\u0013V\ufffdkp\ufffd\ufffd\u0002*qd\ufffd\u0012t;+H\ufffdN\ufffd|\ufffd>\ufffd\u007f\ufffd\ufffd\u001f\ufffdW\u001a|\ufffdw\ufffd!\ufffd\ufffd-Y\ufffd\ufffd\ufffd\ufffd\ufffdS%\ufffd/\ufffd\ufffd%v_\u0206\ufffd_\ufffd\ufffd\u0004\ufffd\ufffd\ufffdL\ufffd\ufffd\u07ab\u0752%Y\ufffdb\u02cb,y\ufffddy\ufffd+6\u0016X\ufffd\ufffdfc\ufffdP\b\ufffd-l\u0005\ufffd\u0012\ufffd\ufffdm\ufffd\ufffdI !4\u0004\u0002Y\tI\ufffdR7\ufffdI:I \u0010\ufffdI\ufffd.C\ufffdI\ufffd4m\ufffd$\u0374%\u0003u\ufffdO\ufffd\ufffdt\u0006\ufffd`\ufffd;\ufffd\ufffd+\u02c6\ufffd\ufffd\u007f\ufffdg\ufffd\ufffd\u001f\ufffd\ufffd}\ufffd=\ufffd\ufffd\ufffd\ufffd;\ufffd\ufffd\ufffd9\ufffd).\ufffd\ufffd$\ufffd\u0010g<\u0012\u0010\ufffd|\ufffd\u000bB\u001b\ufffd\ufffd\ufffd\ufffd\ufffd\u001c\ufffd\ufffd\ufffd&\f\ufffdhF\ufffd\ufffd\ufffdN\u0018\ufffd!\ufffd_>a`\ufffd\u0003`M\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\u007f\ufffd\ufffd\ufffd\ufffd`@\ufffd#\ufffdK:\ufffd\u059a\ufffd|#\ufffd<\ufffd\ufffd\ufffd\ufffd\\\ufffd~=3\ufffd\ufffd\ufffd]\u0016\ufffdd\ufffd\ufffdGO\ufffd\ufffd\ufffd\ufffd^\ufffd\ufffdd\ufffd\u0017d\ufffd\ufffd<\u001eP\ufffd\u00033\u001bIh)\ufffd.4nr#b\ufffd\ufffd\ufffd\u0013\ufffd6\ufffd[\ufffd\ufffd\ufffd\ufffd\ufffdU\ufffdS\ufffd\ufffd6\ufffdtn\ufffdA\ufffd\ufffd(\ufffdA\ufffd+\ufffd\ufffd*\u000e\ufffde:\ufffd\ufffd\ufffd\u001f4\ufffd\ufffd{\n\n\ufffd\ufffdY{t:\ufffd\ufffd\ufffd\ufffd\ufffd%w+\ufffdt\u0003\ufffd\u025fX@e\ufffd\ufffdm\ufffd\u000f\u0006l\ufffd\n\ufffd#@\ufffd\u0007\u0003F~\ufffd\ufffd\ufffdM>\ufffd\ufffd\\\ufffd\ufffdX\ufffd~\ufffdA7\ufffd\ufffd}\ufffd\u0011\u007f\ufffd\ufffdr&vc4\ufffd\ufffd=;\ufffd\f\ufffd{\ufffd\u001fl|w\ufffd\ufffd\u001fu\u0006\ufffd\ufffd\ufffd1\ufffd\ufffdy\ufffd\ufffd\ufffd\ufffdy\ufffdv&e\ufffd\\\ufffd\ufffd\ufffd\ufffd0k\ufffdu\ufffd\ufffd\ufffd\u033e\ufffdr<;@?\ufffdX1\ufffd\u012aZ\ufffd/\ufffdO~c\ufffd\ufffd\u001b\ufffd\u001eg$\ufffd{\u00168gnm\ufffdik\ufffd]_\ufffd\ufffd\u030d\ufffd\ufffdM;nZ\ufffd\u0356\ufffdE\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\u000eB\ufffdk\ufffd\u0013\u00026\ufffdi\nm\u0003\u00054\ufffd\ufffd\u0097b&\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd>\u007f\ufffd\u0019\ufffd\ufffds\ufffd\u001fI\ufffd0R\ufffd \ufffdr\u001eE\ufffd#\fBWPce%\ufffdOo\ufffd\u001a\u060f%wB\ufffd#$T\ufffd\u0012\ufffd^\ufffd@\u001c\ufffd\ta\ufffd\ufffd\ufffd\ufffd\ufffd0\ufffd\u0010\u0016\ufffdJ\ufffd\u0013$\ufffdQ!Lw\ufffd\u000f\ufffd\ufffdt\ufffd$\ufffdA\ufffdc\ufffd\u0012\ufffd.\u000b%\ufffd\u0001\ufffd#y\u000eB\u001f\u0017R\ufffd\n)\ufffd!\ufffd\u001c\ufffd\ufffdp,\ufffd6&\ufffd\u0016\ufffd\ufffd=-\ufffd\n\ufffdO\b)\ufffd\tY\ufffd\ufffdoH\ufffd'IX\ufffdQ\ufffdA2\ufffd\ufffd\ufffd/\ufffdJ\ufffd\ufffd=\u0010\ufffdT,gS,g\ufffd\ufffdO\u060f\ufffdB\ufffd\ufffdZ\r}\ufffd\u001aI\ufffd\ufffd\u04bdRV\ufffd\ufffdU\ufffd\ufffd\u001a\ufffd\ufffd\ufffd\ufffd\ufffdRZ\u0010O\ufffdVL\ufffdFd\ufffdX\ufffd\ufffd\ufffd\u000e\ufffd\ufffdX\ufffd\ufffd\ufffd\u0013$\u05a3\u0013\ufffd8f;\ufffd\ufffdc\ufffdX\ufffd:\ufffd\ufffd\u0012\ufffdIY\ufffd$\ufffd1\ufffde{e\ufffdlB\ufffd;@\ufffdw\u0639\ufffd\ufffd\ufffd\ufffd\ufffd\u066e\u066ba5\ufffd\u073a!\ufffd9R\ufffd\ufffd\u0734\ufffdv\ufffd^-\ufffd\ufffd\ufffdm\ufffd\ufffd{\ufffdi\ufffdDI\u000b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd*V\u0015\ufffd\ufffdI\ufffd7$\ufffd'I,\ufffd[\t\u0411\ufffd\ufffdn\ufffdkbM4;J\u007f\ufffdM\ufffd[D\ufffd\u007fY\ufffdd\ufffd\ufffd}\u0010\ufffd\""\ufffd\ufffdfT\ufffdNG)\\\u0298\u001b9\ufffd\ufffd\ufffd\u0019\ufffd\u0695\ufffdz}\ufffdz\ufffd\ufffd\ufffdg~\ufffd?\ufffd\ufffd\u007fo\ufffd\ufffd{WP\ufffd<\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdY\ufffd\ufffd%\ufffd[\ufffdo\ufffd\ufffdhom]\ufffd\u0612\u0015z\ufffd\ufffd\ufffd\ufffdq\ufffd\ufffd#k>>\u017c\ufffd\ufffd\u0017\ufffd>\ufffd\ufffd+K\ufffd\ufffdv\u06ee\u001d\ufffd\ufffd\ufffd?0#\ufffd\u03e7\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\u001eV.\u05a6\u001a\ufffd\ufffd\r\u0013\ufffdZ\ufffd\ufffdg\ufffd^/3\ufffd\ufffd77\ufffd:l\ufffd\ufffd$\u0013/\ufffd\ufffd\u0003\ufffd\ufffd\u18b2\ufffd(\ufffd\ufffd\u0000t\ufffd\ufffd\ufffd\ufffd\ufffdR\u001c\ufffd\ufffd\ufffd\ufffdO\u000e\ufffd\ufffd5\ufffd\u000eU\ufffd\ufffd?\u007f\ufffd\u0015\ufffdX\ufffd\u04fa\ufffd\ufffdO\ufffd,\ufffd\ufffd\ufffdt\ufffd\u0015\ufffds\ufffd\ufffdN\ufffdk\ufffd\ufffd\u954c\ufffd\ufffd&\ufffd\ufffd\ufffd\ufffd\ufffd4\ufffd\ufffd>\ufffd\ufffd:X\ufffd\ufffd\ufffd\u0004\ufffd_\ufffdz\ufffdG\u07e1\ufffd[\ufffd]tW\ufffdl\u01e21k\ufffd:\ufffd\u061co0\ufffddf\u001d\ufffd\ufffd\ufffd\ufffd.\ufffd\u001b(\ufffd\ufffd\ufffd\ufffd\u001c\ufffd\u04f0&2\ufffd1\u001a\ufffdQ\ufffd&_.\ufffd\u000f;+\ufffdWF\u007fY\ufffd+\ufffd\ufffd.\u001cXA\u001e\ufffdi\ufffd\ufffd\ufffd\ufffd\ufffd\u02f1N)\u0007\ufffd\ufffda@(E\ufffd\u007f6 \ufffd\ufffd\ufffdk\ufffd|+.\ufffd\ufffd\""Iz\ufffd'\ufffd\ufffd\ufffdC\ufffd\ufffd\ufffdb\ufffd3\ufffd\u0573\ufffd\ufffd\u001e\ufffdF\u0017\ufffdY\ufffd\ufffd\ufffdy\ufffd\n\ufffd\u036b\u001e\ufffdk\ud791V\ufffd:\ufffd\ufffdF+M6\ufffd}?\ufffd\ufffd\ufffd\ufffdV/.\ufffd,\ufffd\ufffd37\ufffdZ=\ufffd\ufffdlY\ufffd\u007f#\ufffd\ufffd7r\ufffd\u0000\ufffd\u078b0R\ufffd\ufffdQ\ufffd\u5705P\ufffd\ufffd\u001e5\u03a98\ufffd\u026cL\ufffd\ufffd\ufffd\ufffdcn\u001b\ufffd\ufffd\ufffd\u0015\ufffdr\ufffd\\\ud921\udef3\ufffd\u031c\ufffd\ufffdL\ufffdn6\ufffd\ufffdt\ufffd$\ufffd\u0346\ufffd\ufffd\u0005\u0005Y\ufffd3\b\u0019\u0563YY.\u0013P\ufffd\ufffd\u0001\ufffd\ufffd%\ufffd\r\u001e\ufffdjk\ufffd\u0007\ufffd.\ufffdw\ufffd\u00159g\u0005\ufffd\u0017\ufffdf\u001d\u000b\ufffd@\ufffd\u0000g'r(\ufffd\u001c:\ufffdX@\ufffd$3\u00182\ufffd\ufffd\u0704\ufffd\ufffdt!5\ufffd\ufffd\ufffd8\ufffd\ufffd\ufffd\uba2dO\ufffd3\ufffd\\\ufffd\ufffd\ufffds\ufffd\ufffd\ufffd\r\ufffd\u06eaW\ufffd[g\ufffdX\ufffd\ufffd\ufffd~\ufffd\ufffd\ufffdys\u001a\ufffd\u001b\ufffd\ufffd\u0773\ufffd\ufffdgT\ufffd\ufffde(4\ufffd\ufffd9}n\ufffd~\ufffd\ufffd\ufffd\ufffdu\ufffd\u02b9\\\ufffd\ufffdi\rsf\ufffd\ufffd=B\u001dX\ufffd%\ufffdw\ufffd<\ufffd\rtuS\ufffd\ufffd\ufffd\ufffd\u0006\ufffdN\ufffdb\u0018\ufffd\ufffd\ufffd)H\ufffd\u0011\u001f\u0016\ufffd \u0016\ufffd9\ufffd\u0018e\u02ca\ufffd\u0010\ufffd\u06de4\u0007^F\ufffdm\u0396\ufffd\ufffdt,\ufffd\u0507\ufffdt\ufffd7\u068abk\ufffd\n\ufffd\ufffd\u0012\ufffd`ID\ufffdl\ufffd\ufffd%\u0011\u01ecwd\ufffd\u01b72\ufffdG\ufffd\u00056\ufffd\ufffdQ\ufffd\\\ufffd\ufffd`\ufffd\ufffdg\u0019$\u0012\u026fU\ufffdR\ufffd*\u0017V\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001c\\XU\ufffd\ufffd:\u0019\ufffd\ufffdco\ufffd8\ufffd\ufffd\ufffd\u0001=\ufffd;\ufffd\u001a\ufffd1\u0006\ufffd\ufffdkh\ufffdP\u0011H,Jc\u0014i\ufffd\ufffd\f\ufffdU\ufffd\ufffd\ufffdJcYqRF\u0012\ufffd\ufffdW%\ufffd&gsr\u04a7\ufffd\fw^QsF\ufffdF\ufffd\ufffd7q\ufffdu\ufffd\u03be\ufffdg\ufffd\ufffdb\ufffdi\ufffd\ufffd\ufffd\ufffdvF\ufffdf,\ufffd2Y\u0001{\ufffda\ufffdS\ufffd\u060c\ufffdv\ufffd\u000bf\ufffdAk\ufffd\ufffd\ufffdm\ufffdU\ufffd\\s>\ufffd*\ufffdq[\ufffdR\u0013\ufffd\ufffd;X\ufffd&\ufffd\u0005M\ufffd\ufffd\ufffd '\ufffd\u044ae\ufffdH\ufffd4 \b\ufffd+\u001e\u000b\ufffd:5\ufffd\ufffd\u040f1z\u000e\ufffd\u0004;\ufffd\u000fqi\u0013\ufffd\u00c2)\u0005\u001f\ufffd\u0018+\b\ufffd\ufffd\u0018gY\ufffd\ufffdM\ufffd\ufffd\ufffd\ufffd\u001d\ufffdS\u0017{\ufffd\u07f4z\ufffd\ufffd]V\ufffd\f\ufffd\rJ\ufffdG1\u001e\ufffd~\u00fed\u06dc\ufffd\ufffd\ufffd\u0007=\u000f\ufffd\ufffd/_\ufffdt\ufffd,9\ufffd9,W\u001bG\ufffd$\ufffdk6\ufffd[:\u0508\ufffd\ufffd\u001bj\ufffd\u001c\ufffdb\u0013\ufffdt+\ufffd\ufffd\fI\ufffd\u001c\ufffd\ufffd\r\ufffdD\ufffdUK\ufffd\ufffd\u0589\u001f\ufffd~j\ufffd\ufffd\ufffdM\f\ufffd\ufffd\u001a\ufffd\ufffd-\ufffd\u001eMM\ufffd\ufffd\u0016\u01d45\u04cd\ufffd\ufffdB\ufffd\ufffd\ufffd\b\ufffd\ufffdh\u000e\ufffd5\ufffd\u0007)P\ufffd\ufffd?\ufffdX\ufffd$\ufffd\ufffd{\u0016G\ufffd\ufffd\ufffd\n\ufffdjwY\ufffd;I\u05dc\ufffd\ufffdS %{\ufffd\u0275)\ufffd\ufffd\ufffd\u000b\ufffd\u0002u:\ufffdY\u000f\ufffd\u30d63\ufffdXm\u0001\ufffd\ufffd0K\ufffd\ufffd\u07f99\ufffd\u001fh\ufffd7\ufffd\ufffdOZ\ufffd\u001f\ufffd\ufffdo\ufffdi\ufffd\u06e3L:%\u0019\ufffdZ'\ufffdF:\ufffd\ufffd*{*'\ufffd\u001c\u9aedhO\ufffd\u0017\ufffdU\ufffd%\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd[\ufffd[&?^]fm\ufffd.^\t\ufffd\ufffd\ufffd\u001a\ufffd\ufffd\ufffd](\u0013Y\u041a\u0013\ufffd\ufffd)q+\ufffd\ufffd,\u00065\ufffd\ufffd\ufffd\ufffd\u0011\ufffd+\ufffd4w\ufffd\ufffd2\ufffd(\ufffd\ufffd$\ufffddj5J\ufffd\\\ufffd\ufffdf\ufffd3\u000e\u001b\f\ufffd\ufffd\ufffd\ufffd+\\\u480e\ufffdZ~#=\ufffd\u0006\ufffd\u039c\ufffd0\ufffdka\ufffd\ufffd{O\ufffdW\ufffd&\ufffdF\u0000M\ufffd\ufffd\ufffd\t\ufffd\u00114:\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u056e\ufffd\ufffd7\u000b\ufffd2\ufffd\ufffd\ufffd\u0017\ufffd\ufffd<\ufffd\ufffd\u0017\u0019\ufffd\u0016\ufffd\ufffd)N\u02f0\u03183\ufffdV\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001a\ufffd\ufffdW\ufffd\u0016\ufffd\ufffda\ufffd_\ufffd\ufffd\ufffd7\ufffd\u001b\ufffdb\ufffdVh\ufffdV\ufffdB7\ufffd\ufffds\ufffd\u0002\n%Y\ufffd\u0011d\ufffd\ufffd)Fr\ufffd_gJP\u0012\ufffd\u0000\ufffd7S\ufffd2\ufffd\ufffdP \ufffd+\ufffd\ufffdHQ\ufffdN\u0003\u007f_\ufffd\ufffd(CV\ufffd\t\ufffdl\ufffdX+\ufffd\u001b\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0019;\ufffd9_~\u001eT\u051cw\ufffd\ufffd\ufffd\u000f\ufffd\ufffdl\ufffd\t\ufffd4\ufffd\ufffd+\u01cf\ufffdR\ufffd6\ufffd\b\ufffd5\ufffdx7\ufffdbfG\ufffd\ufffd\ufffd'\ufffd\ufffd\u038b\u0006_\ufffd\ufffd\ufffdYM\u0005-\ufffd\ufffd\u06ac\ufffde3\ufffd@C\ufffd6\ufffd\ufffd\ufffd\ufffdl:\ufffd\u04fed\u058eFE\ufffd\u0743\ufffd\ufffd\ufffdm\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\""ss\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd?I\ufffd@\u0379\ufffd\ufffd\ufffdZ\u0016FJ\ufffdk\ufffd\u0013\u0019\ufffd\ufffd)9jfYd~\ufffd\ufffd<\ufffd\ufffdV+\u0001\ufffdK\ufffd\ufffd+\ufffd\ufffd\ufffdr\ufffd\ufffdL9\ufffd:\u03f8>\ufffdV\ufffdF\ufffd\ufffd\u0116R\u009b!\ufffd\b\u0001\ufffd\ufffda\ufffd\ufffdH\ufffd\ufffdun_c4\ufffddE\u05a2\ufffd\ufffdW\ufffd\ufffd\ufffd\u036f\ufffd6g\ufffd$p|\ufffd\ufffd'\""\u03ff\u06b0\ufffd\u001a\ufffd{\ufffd\ufffd8\u0667&\ufffdI5p\u0003P\u000b\ufffd\u00005\u001daF\u0319 \ufffdQ\ufffd\u0018)\ufffd{\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd99E\ufffd\ufffd\u0013'\ufffd)l\u0017\ufffd\ufffd\ufffd\ufffdp\ufffd\u0012\ufffd7\ufffd`Ma+\u0010\ufffd\ufffd\u00033~\ufffd\ufffd\f\ufffd2\ufffd\ufffdiZ7\ufffd\ufffdT\ufffd\ufffd(\ufffdkm\ufffdn\ufffd\ufffd9|g\ufffd\u0213\ufffd\ufffd|\ufffd\ufffd\u0001\ufffd\ufffd*w\u001a\\U\ufffd\u0006\ufffd\uef29\u035b\ufffdY\ufffd\u03bb\u007f\ufffd\u0233,f\ufffd%G y!\u001a<\ufffd\ufffdV\ufffd\ufffd\ub969Xv\ufffd\ufffd0S\ufffdMI\ufffdU\ufffd\u0014\ufffd\u0005#\ufffd\u0014kR\ufffd\n\ufffd\ufffd\ufffd\ufffdF\ufffd8(5\ufffdrAA\ufffdR\ufffd\f5\ufffd\ufffd\ufffdl6\u0017g\ufffd\ufffdX-+6$`];\n\ufffd4\ufffd\u001a-'\ufffd\ufffd?O5l\ufffd#\ufffd\ufffd\ufffd\u000e\ufffd\u0012\u000et \ufffd\ufffdC=\ufffd\ufffd/\ufffd{k\ufffd\ufffd\ufffd0%\ufffd\ufffd\ufffd\ufffd\u0001{\ufffdr\ufffd\u0002\ufffd!;\ufffd\ufffd/\ufffd\ufffd\ufffd\ufffd6\ufffd\ufffd\u0000\ufffd3\ufffd\u05b7\ufffd\ufffdS\ufffd\ufffd\ufffd\ufffd\ufffdjn\ufffdz\ufffd{\u01ba\ufffd\ufffdQ\ufffd\ufffdb\ufffd*\ufffd\u06b2gA\ufffd|t\ufffd\u0011\ufffd:\ufffd\ufffd4\ufffd\u001c\ufffdi\u001e\ufffdi>\ufffdg*\u0706\ufffd\ufffd\u0011\ufffd\ufffd\ufffd\ufffdt}\ufffd\u0019+\ufffd\ufffd0\ufffdf\ufffd\ufffd%\ufffd$Q\u0010\ufffdWL\ufffdu\ufffd\ufffd\ufffd_\ufffda\u0000\ufffd\ufffd\u0133g\u0017\u001a\ufffdN\ufffd?\ufffdq\ufffd&Q\ufffd\ufffdhm\ufffd\ufffd\ufffdb\ufffd5\ufffdt\ufffd\ufffd\u050c\ufffd\ufffd\u0017i>\ufffd\u0017\ufffde\ufffd\ufffd\ufffd\u00f7\u000en\t\ufffd\ufffd\""\ufffd\u05add\ufffd#6[\ufffdZ\ufffd\u0566bm\ufffdH\ufffdT\ufffd\u0130\ufffdXQ\ufffd\ufffd\ufffd\u055ai\ufffd\ufffdj4y,z\ufffdq\u001c\ufffd\u0334\u001bO@K\ufffd\ufffd>\ufffd\ufffdX[\ufffd\ufffd\ufffd<]\u0004\ufffd*\u0380J.r6\u001e\ufffd\u0005}\ufffd\ufffd\ufffdg\ufffd\ufffd\ufffd&\u001d\u0006\ufffd\\_Q\ufffdq\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd[g\ufffd\u001a\ufffd\ufffd\f\ufffd\ufffd\u001f^\ufffdH\ufffdS\ufffd\u0014Y\ufffd\n\ufffdAS\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdW\ufffdr\ufffd\ufffd\ufffd\u06b7\ufffd\ufffdDuC\ufffd\ufffd$\r\ufffd\u00d1V\ufffd\u0014,\ufffda\ufffd\ufffd\n4\ufffdNW\ufffd'G\u0000\ufffd\ufffd\""G\u00008\ufffdF\ufffdS\ufffd\""N\ufffd\u001f\ufffd~\u0005j\u02d8zY\ufffd\ufffd\ufffd\ufffd.\ufffd')9+\u0555\ufffd*\ufffd*\ufffd\ufffd\ufffdT\ufffd\ufffd\ufffd\ufffd+.-\ufffd\u0355\ufffd\ufffdc\ufffdZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd>\u000fzp\u0017\ufffdE\ufffdp\ufffd\ufffd5\ufffd-\u00bfxV\u00007\u0017\ufffdl\ufffdm\ufffd\ufffd\ufffd]*\ufffd\ufffd\ufffd\ufffd\ufffdE\ufffd*f\u0010\ufffd\ufffd\u0015f\ufffd\ufffd\ufffdH\u0551j\ufffdx\ufffdn\ufffd\u0014W\ufffdx\u001b\ufffd\ufffd\ufffd\ufffd*\ufffd\u0015\ufffd<\u000bf?\ufffd0\ufffd\ufffd\ufffd:\u0348V$\u001d\ufffdb\ufffdU\ufffd\u02f0:\ufffdi$:p\ufffdF\ufffd\ufffd\ufffdH\ufffd\ufffd\u0015T5P\ufffd\ufffd\u0006;\ufffd\ufffd\ufffd\ufffd\u001b\ufffd;\ufffd$,\u0016\ufffdFbA\ufffd\ufffd\u01f61GA\u0012=2\ufffd\ufffd#\ufffd\ufffd\u00115\ufffdCn\u0010\ufffd\f\ufffd\ufffdr-\ufffd\ufffd\ufffdd\ufffd\ufffd\ufffd\u001fNjN\ufffd\ufffd\ufffdF5\ufffd\u04c2\u0271\u0001\ufffd\ufffd\ufffd1\ufffd%\u001b:\ufffdMe)\ufffd7\ufffd\ufffdb\u0007\ufffd\ufffd\ufffdz\ufffd3\ufffd\rE\ufffd\ufffd\ufffd\u01c4\ufffd\ufffdleW\ufffd\ufffd3`/@\ufffdf\ufffdv+\ufffdRdL\u001d\ufffd'\ufffd\ufffd\ufffdz,@\ufffd\ufffd15U!\ufffd\ufffdd\ufffdF\u0005\ufffd\u056d\ufffd\fh\ufffd\ufffdC\ufffd\ufffd,m\ufffd\u0015\ufffdW\u07a7\ufffd8\ufffd_h\ufffd4%\ufffdk\ufffdn\ufffd\ufffd[\ufffd.h\ufffd\u001c\ufffdt=\u0011\""\ufffd\ufffd\u001d\ufffd*GCne\ufffd\u0011\ufffd\ufffd\ufffd\u029c#i%%X\ufffd\uc91c\\h\ufffdr\ufffd1-\ufffdr\ufffd\u0556\ufffd)5X\ufffd\ufffd\n\u0003H\ufffd\ufffd\u0100\u02ed2\u0016j4\ufffd\n]6\ufffd3\ufffd\ufffdB\ufffd\ufffdUA6WI\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffdEj\ud91d\udd71\u001a)\ufffd\ufffd2A\u0011\ufffd\u0019\ufffd\ufffdy\b<\ufffdwEf\ufffd\ufffd?\ufffd\u001f\ufffd\ufffd8\ufffd\ufffd\ufffd\ufffdv\ufffdc*D\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\u0017g(%b\ufffd\ufffd\ufffd\ufffd\ufffd2\ufffd\u0004\ufffd\ufffd\ufffdz\ufffd\ufffd1\ufffd\u02d26\ufffd\ufffd\ufffdD]\ufffdZ\ufffd\ufffd\u00ab\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001d\ufffdH\ufffd\ufffd\ufffd\ufffd\ufffdOI\ufffdG\ufffd\b=\u0012\ufffd\ufffd\ufffd\ufffd(\r\ufffd!)\ufffd2\ufffd(\u0005Fgt%\t\ufffdB\f\ufffdL5\ufffdy8\ufffd\ufffd@\u007fs\ufffdL\ufffd\ufffd\ufffd\ufffd\u001f\ufffdSV~\ufffd\u039cz\ufffdG\ufffdG6\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdOm\u0019\\\ufffdwn\ufffd\u0018\ufffd\ufffd9?|w\u07cf\ufffd\ufffd\ufffd\ufffd\ufffd{\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdk\u001f\ufffd\ufffd\ufffdw_\ufffdGg9\ufffdL&\ufffd\ufffdm'P&Sr,+K\ufffd\ufffd\ufffd\u0019\ufffd\ufffd\ufffdF$'\ufffd\bi$xz\ufffd\ufffd\ufffdZ$\ufffd\""\u0006\ufffd$\ufffd\u0017B'O\ufffd\ufffd\ufffd\u0014:\u027b\ufffd+}[\ufffdF\u078c\u0017\ufffdEL\ufffd6\ufffd9\ufffd=\ufffdi\ufffd\ufffd\ufffd\u0015\ufffdv\ufffd\ufffd2\ufffd\u000b7o\ufffd\ufffd_W\ufffd\ufffd\ufffdY\ufffd\ufffd\ufffd\ufffdB\ufffd\u0019\ufffd\ufffdd0-\ufffd7-]\ufffd!^\ufffd\ufffd\ufffdE1\ufffdB\ufffd\u0017\u04e1\ufffd\ufffd\u001cs8d\ufffd\u0011{%\ufffd\ufffd\ufffdm\ufffd\ufffd\u0014\ufffd\rJ/K$\ufffd\ufffd6+/\ufffdI\ufffd\ufffd\u03f72Z\ufffdUj5`\ufffd\ufffd\ufffdk\ufffd\u000e\u0006\ufffd\ufffd\u0014\ufffd\u0012zA~;2\ufffd\u07c7n\ufffd<\ufffdf\ufffdv\ufffd8~\ufffdHvH\ufffd7W\u00176\ufffd\u0007\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\ufffdZ\ufffd{\ufffd\u03b5\ufffd\u01ac\u001aG\ufffd\ufffd\ufffd.Wuz\ufffd\ufffd1oA\u00c2\ufffd\\\ufffd\ufffdNt\ufffd\ufffde\ufffd\u0014EI\ufffd\u0100\ufffd\ufffd\r\ufffdo\ufffdThjJ\ufffd4\u0017\u021c\r+|\ufffd\u0002\rs`\ufffdxr\u046c\ufffd\ufffdV\ufffd\u0017t\ufffd\ufffd\ufffd\t\ufffd0'Zr\\a\ufffdq&\ufffd!\u0003`\u001c\u05d9L\u0019N\u03a1{\u0015\ufffd\ufffdcJ^.\ufffdb2\u001a\u000bp#\ufffdK$\ufffdd\ufffdpd'\ufffd\ufffd \ufffd\""\ufffdS\ufffd3\u0015\ufffd\ufffd\ufffdc\ufffd\ufffdL\ufffd\u0007\ufffdT\ufffd\ufffd\u0012\u058c\ufffdG\ufffdIoGfZ:|0\u00117\ufffdp\u0013\u001b\ufffd,\ufffd\ufffd\ufffd\u0016%eX\ufffd\ufffdWhsJ\ufffd_p\ufffd,/\ufffd\ufffd\ufffdT\ufffdJ\ufffd\ufffd-k\ufffd\ufffd\ufffd>C\rT\ufffdZ\ufffd`W\ufffd3\ufffd\ufffd\ufffd\u0013\ufffd}\ufffd\u00009\u000bP\ufffd[\ufffd\ufffd\u0638\u001c\ufffdJ\ufffd*3\r\ufffd\ufffdJt\u0162\ufffd\ufffd\u03696\ufffd\r\u012e:j6\u0017)S\ufffd\ufffdI\ufffd\ufffd\u0013lx\ufffd\ufffd(\ufffd\ufffd+\ufffd\ufffd\bA6\ufffd\ufffd|\ufffd\ufffd\ufffd\ufffd.t\ufffd-_xo\ufffd\ufffd\u0007\ufffd\ufffdb\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdn\ufffd\ufffd\u01d9\u06c4\ufffd\ufffdle\ufffd\ufffdy\u001de\ufffdD\ufffd\ufffd'na\ufffd9\\)w;\u021f\ufffd\ufffd\ufffd\nF\ufffd\ufffdi\ufffd#\u0019\ufffd\f\ufffd\u0000\ufffd0^Q\ufffd\u0019\ufffdZ/\ufffd\ufffd0\""\ufffd\ufffdd2\ufffd\ufffdSdf|\ufffd\u0000\ufffd@g\ufffd\ufffd\ufffd_\u0000\n\ufffd\ufffd\ufffd\ufffd\nA\ufffd\ufffd7\ufffd\ufffd'\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdlJ\ufffdc'\ufffd\ufffd\u0012\ufffd\ufffdQ\ufffd9\ufffd\ufffd\ufffd&g\ufffdd\ufffdS\ufffdn\ufffd9\ufffd\u01ad\ufffd\ufffdye\ufffd\ufffd,10\ufffdj\ufffd\ufffde\ufffd\ufffdS\""#\ufffd,\ufffd\\\ufffd\u0010\ufffd\ufffdAa\u0018\ufffdG\ufffd#\ufffd\u0011\ufffdH\ufffd\u0006I\ufffdX\ufffdb5\ufffd\ufffd\ufffd\\\u045b\ufffdzS\ufffdNg\ufffd\""\ufffd29\ufffd\ufffd4\u0012\ufffdD;\ufffd1\ufffdX4lN\ufffdM-aX\ufffd\u0003\u0019^FA\ufffd\ufffd\\\ufffd\ufffdA\ufffdI\ufffdY\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd;\ufffd\\\ufffd\ufffd\u000bcc\ufffd\ufffd\ufffd[~j\u02333\ufffd\u0005\u0005\ufffd;?\ufffd\ufffd\u01f2\ufffd\n\u0019Kv\ufffdE?~m\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0{\ufffd\ufffd\f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdW\ufffd\ufffdw\ufffdeY2@S\ufffd\ufffd\ufffd\ufffdj\u0010\ufffdM\ufffd1\u001a\ufffd\u0019\ufffd\ufffd\ufffd6\ufffd\ufffd]\u0015}K<]|\ufffd\ufffdM\ufffd2\ufffd/$\ufffd\ufffd\ufffdH\ufffd\ufffd>%k\ufffd#\ufffdF\ufffdi\ufffd\u0006\u0175\ufffd\ufffd\u001c\ufffd\ufffdw\ufffd\ufffdU\u01d3\u0017%\ufffdi\u051a\ufffd\ufffdg\u0010gR\\\ufffd\u0006\ufffd'\ufffd3S\ufffd\ufffd\ufffd\r\ufffd0j\ufffdm\u001c55\ufffd\ufffd\ufffd=\ufffd\u0790\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdQ\ufffdP\ufffd9\u3d8c\u000f3\ufffd\ufffd\ufffdg\ufffd\ufffdz=\ufffdJvM\ufffd;\ufffdl\ufffd\ufffd\u001cQNK\ufffd\u0011k\ufffd\ufffd\ufffd\ufffd\u0236\ufffd\ufffd\ufffd\u070a\ufffd'\ufffd\ufffd\ufffd6_\ufffd58\ufffd\ufffd\ufffd{\ufffd \ufffd`\ufffd\ufffd\ufffd\n\ufffd\ufffd\ufffd+\ufffdE\ufffd\ufffd{\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffdO\ufffd\ufffd\ufffd\ufffd^\ufffd\ufffd\ufffd\ufffdV\u001fr](]V\ufffdA\ufffd\ufffd\ufffd/w\ufffd\ufffd*N|\r\ufffdB\u0145i\ucd1c\u001b\ufffdY\ufffdz\ufffd\ufffd9\ufffd\ufffd\ufffdK\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdU\ufffd#U\u04eb\ufffd\ufffd>\ufffd\ufffdmuauiuM\ufffd\ufffd\ufffd5U5?\ufffd\ufffdQ\ufffd\ufffd9u\ufffdM/\ufffd>2\ufffd;\ufffd/\ufffdw\ufffd\ufffd\ufffda~\ufffd;3\ufffdf\ufffd9co#j\\\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdRg\u001d\ufffd\ufffd\ufffd\ufffd\u0007=\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdY\ufffd\ufffd\ufffdl\ufffd\ufffd\ufffd\u001c\ufffd<\ufffdy)\u039d\ufffd|\ufffd\ufffd\ufffd\ufffd\ufffdl\ufffd\ufffd\ufffd\ufffdu\ufffd\u0017\ufffd\ue63d)\u03bd6\ufffdn\ufffd[s\ufffd\ufffd=\ufffd\ufffd\ufffd\ufffd\u0516\ufffd<\u057c[\ufffd*n\ufffd\ufffd\ufffd\ufffd\ufffd;:\ufffd\ufffd\u079dwj\u0785y\ufffd\ufffdU\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffd/\ufffdbad\ufffd'\ufffd\u0016.\ufffdE\ufffd\ufffdu\u0019\ufffd'\u068a\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u054bO\ufffd\ufffd\ufffdon\u007f\u007f\ufffd\u0704K\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffd\ufffd\ufffd8\ufffd\ufffd\ufffd\ufffd\ufffdC\ufffdG\ufffd\ufffdB\ufffdO2\n\ufffd+\ufffd\\uq\ufffd\ufffd~\u0006%\ufffdV\ufffd~\u0016%'u\ufffd~\u000e\ufffd&\ufffdx\ufffd(.\ufffd\u0018\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdR\ufffd)\ufffd9\ufffd/C\ufffd\""\ufffd\ufffd\ufffd\ufffd\u001c\ufffd\ufffd\ufffd+\ufffd\ufffdX\ufffd$\ufffd\\\ufffd\ufffd\ufffd\ufffd\ufffdP\ufffd]\ufffd/\ufffd\ufffd\ufffddfx\r\u0295c\ufffd\ufffdAR\ufffd\ufffd\ufffd\ufffdH\ufffdy\ufffd\ufffds(E\ufffd4\ufffd\u0017\ufffd\ufffd\u0011#\ufffd\ufffd\u0018\ufffd\ufffd\u0757\ufffd\ufffd\u001f\ufffd~\u0019\ufffd+\ufffd\ufffd~9\ufffdi\ufffd\ufffd~\u0005\ufffd3\u0016?\t\u0675\u0016\u07afD\ufffd\ufffd\ufffd\ufffd_\ufffd\ufffdH{3\ufffdOFU:\u001bH\u0088\ufffd\b+\u0001\ufffd*\ufffd\ufffd\ufffd\ufffd^\ufffdEC\ufffd\u001f\ufffd\ufffd\ufffdo\u0014\ufffd@\ufffdH\\l|/\b\ufffdq\ufffd>\ufffd\u001d\ufffd\ufffd\u000e\ufffd\ufffd\""\ufffdp\ufffd8\u0007|\ufffd\u000b\ufffdq9!\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffdk/\ufffd;\u0004\ufffda(\ufffd\u000f\ufffd\ufffd\ufffdt\u001dD\u000e\\>\ufffd#@4\u00a9\u0004\ufffdh\n\ufffd:\b\ufffd\ufffdw\ufffd\ufffdtp\u012e\ufffd\ufffdnD'D\ufffd\ufffd M'\\;\b/\ufffd\ufffd&\ufffd\\G\ufffd\ufffd\ufffd\u001a`\ufffd,h\ufffdp\ufffd\ufffd7f6\ufffdk\ufffdcw\ufffd6\ufffdP\u0016\ufffd\ufffdF\ufffdq\ufffd\u0000\ufffd\u0015B\ufffd\""\ufffd\ub0f0\u000e\ufffd\u02cdr\ufffd2\ufffd\ufffd\ufffd\ufffd\u023d\ufffd\ufffd\ufffd\r\ufffdp\ufffdF F\ufffdh\u0015\ufffd\ufffdA\ufffd\ufffdz\r\ufffd\u04af\ufffdkz\ufffd\r`M\ufffd.QR^\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd]pg\ufffdh\u001e\ufffd\ufffd_\ufffd)\ufffd=\ufffd$\ufffd\ufffdz\t\ufffdV\ufffd\ufffd\u000fW!\ufffd\ufffdB\ufffd\u0015jS\ufffd\u0007\ufffd\f@\ufffd?g\ufffd\ufffd\ufffdf\ufffdohJ\ufffdB\u000b\ufffd\ufffd\ufffd`y;\biZ\ufffd=\ufffdy\b\ufffd!\u0017\ufffd\u0001\ufffdJH]L\ufffd\ufffd\u0012Rf/\u0109B9\ufffdM7\ufffd\u0013\ufffd\u001c\ufffd\u0ba0\u007f\u0004\ufffdX\ufffd\ufffd\u0010\ufffd\u000f\ufffd\ufffd^\ufffd\ufffd\u0006\u0473 E9*Ee\ufffd\ufffdKl\ufffd\ufffd0\u0012\ufffd\u000buJ\ufffd\u000b\ufffd\ufffd\u0010\u0006\ufffdD\ufffdH\ufffd\u0006h+\ufffd\ufffd4A:l+8\ufffd\ufffd\ufffd6\ufffd\ufffd\ufffdG\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd2a\u07aa\ufffd\u0010F\ufffd\r\u001a\ufffd\ufffd \u0013V'X\u000b\ufffd\u001dl\tA\ufffd\u0001|\ufffd\ufffd\ufffd\u01773\ufffd6\ufffd\ufffd\ufffdHZ\ufffd\ufffd\ufffdVD\ufffd\ufffdrl&\ufffd`\u001d[H\ufffd \ufffd&\ufffd\ufffd\u0010\ufffd\ufffdM|\ufffd\ufffd\ufffd\u0017\ufffd*\r\ufffd[\ufffdm\ufffd%\ufffd<=\ufffdC7\ufffd\ufffd%e\nih\ufffdQR\u000b4\u0004\ufffd\ufffd{\u0001\ufffd\ufffd\ufffdH!\u0126\ufffd\ufffd\ufffd\ufffd\ufffd\r\u0013\ufffd\n\u0013\ufffd5\ufffd\ufffd\ufffd\ufffdH\ufffd(\ufffd\u0007\ufffd\ufffd\ufffd<\u0001\ufffd\ufffd\ufffd\u0208\ufffd\ufffd\ufffd\ufffd\ufffd9\ufffd(\ufffdxR\ufffd\u001c\ufffd\ufffd\ufffdO\ufffd\u0002m\ufffd\ufffd\u001b\ufffd9!\ufffd\u0006\ufffd\ufffd\ufffd\ufffd!\ufffd\u001bo\\;\ufffd\ufffd\ufffd}|*\ufffd\ufffd \ufffd*i\ufffd^\""c\ufffdhI\ufffd.\ufffd\ufffd}\ufffd\ufffdq\ufffd\ufffdx=iH/\ufffdn\ufffdK\u001fi\ufffd\ufffdm{\ufffd\u001a\ufffdX}h\ufffd\ufffd\ufffd\ufffd\ufffd\u000b\ufffd\ufffd^\ufffdU\ufffd\ufffd\u001a\ufffdd.\ufffd\u01cfi\u0011`\ufffd\ufffd?\b\ufffdLf2\ufffd\ufffds7\u0125n\ufffd\ufffdt\ufffd\ufffdm\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u050e\u0002\ufffd\u0005\n\ufffd \u0014\ufffd1Ex\ufffd\u0012d\ufffd\ufffdu!\ufffdJ_\ufffd\ufffdC\ufffd\ufffd(i\ufffd\ufffd\ufffd\u0014\ufffdS\ufffd\ufffdC#\ufffd~\ufffd\ufffd\ufffd~R\u0017\u0013=\ufffd\ufffd\ufffd\ufffdH~R\ufffdA~\ufffdBs\ufffd\ufffd\u000fL\ua07c\ufffd5\t\ufffd\ufffd\ufffd\ufffd$\u007fl\ufffd\ufffd\u0016b\ufffd\ufffd\ufffdvU\ufffd\ufffd'\ufffd\ufffd\ufffd\ufffdm\ufffdu\ufffdq9\ufffdw\bd\ufffd \ufffdZp7n\ufffd^Rv\ufffd\ufffd\ufffd>R\ufffdaR{\u007fy&\ufffdM\ufffd\ufffd\u026c\ufffd\u01a6s\ufffd\u0010\ufffd\ufffd\ufffd\ufffd\u001b\u000b\ufffd\u0014\ufffd8\ufffdZ\ufffd~e\ufffd\u8dd4\ufffdTA\ufffdqi_\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\u0017\u0013s\ufffd\u001b\ufffd:\u0011\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u06b2\ufffd\ufffd\u0019\u000eF\ufffd\ub8d6\ufffd`8\u0014\f{\ufffd\ufffd`_\ufffdef `\t\ufffd\ufffd{\ufffd\u0011K\ufffd\u0017\ufffd7\ufffd\ufffdJ\ufffd\ufffd\ufffd\u001da\ufffd\ufffd\ufffd\ufffdX:|\ufffd>K\ufffd/\ufffd\ufffd\ufffd\ufffduY\ufffd\u0007\u00d6`\ufffd3\ufffd\u0019\u01b7\ufffd>o\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdD\ufffd\ufffd@0\ufffd\ufffd\ufffd\u001d\fvY\u0006z 4\u0014\ufffd\ufffdE!\ufffd7j\ufffd\ufffdz\ufffd\ufffd\ufffd\u007f\ufffd/Rbi\ufffd\ufffd\ufffd7\ufffd\ufffdC\u0016\ufffd&\ufffd\u0018\ty;\ufffdlB\ufffd \u0206E\ufffd\ufffd\u001e\ufffd\ufffd;\ufffd\ufffd\r\ufffd\u0010\ufffd\u001f\ufffdw\ufffdE\ufffd\ufffd\u001f\u000e\ufffd\ufffd|\u0011r\u001bD\ufffd\ufffd\u0007o\ufffd\u0007\ufffd\u0004@\ufffdM\ufffd\ufffd\ufffd%\u0012\r\u0007\ufffd\ufffd\u001d \ufffd?\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\ufffd($\ufffd\ufffdN\ufffd\ufffdy`9\ufffd\n\ufffd\ufffd\u0010\ufffd\u0006r\ufffd\u001c6\ufffd,p\u001fD\u00036\ufffdh\ufffd/l\ufffd\ufffdxA\ufffd(N\u0014\ufffd\u00a5\ufffd7\ufffd\u000bl\ufffdj-\ufffd\ufffdG\ufffd\u039d\ufffd\u0010\ufffd\t\u0017\ufffd\ufffdH\ufffd\ufffd\u0017\u0004\ufffd}\ufffd\u000e|\ufffd\u000f'\ufffd\ufffdA\u000e\u007fg\u0004C\u0002)\ufffd@p\ufffd\u0017\ufffd\ufffdF|\ufffd\ufffd\u001eo\ufffd\ufffd\u0019\ufffd\ufffdy\u0011\ufffd;\ufffd\ufffd}X@(t\b\ufffd\u0000\u0011;|\ufffd($\ufffd\ufffd\u000f%\u0000K_\ufffd\ufffd\ufffd\ufffd*\f\ufffd\ufffd\f\u0004\ufffd]N\u007f\ufffd\ufffd\u001b\u000b\ufffd\u0002W\ufffdP\ufffd R\u007f\ufffd\ufffd\ufffdNo\ufffd@&\ufffd\ufffd\ufffd\ufffd\u0012\u0004\ufffd`)\ufffdP\u0010p8\ufffd\\\u0004L\ufffd\u0019\u0013*VS\ufffd\ufffd`\u007f\ufffd\u000b\ufffd\u0012\t`\ufffd\u0001\ufffda_W\u007f'\ufffd9\u0011\u000b\ufffd\ufffd?\u0010%`|\ufffd\u0001\ufffd\u0004}\u0005Q\ufffd-\ufffd\u0010L\ufffd\u000b\t\ufffd#\ufffdB#\ufffd\ufffd`g?\u0464\ufffd$\u000b\ufffd\ufffd\ufffd\u0003\u07b0e\ufffd\ufffdK\ufffd\ufffdG\ufffd \ufffdx\ufffd\u001f\ufffd\ufffdx-\u0010\ufffd\u001bd\ufffdE1\ufffd^/\ufffd\ufffdM\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdC\ufffd\u001d\ufffd\u0000/\ufffd\\\ufffd\ufffd\r$\ufffdi(\ufffd\u000f@M\ufffd\ufffd\ufffd\ufffd!s`\u0014\bFp\u001d\ufffd\ufffdU\ufffd#@\u000b\ufffd\u000e\ufffdO\ufffd\ufffd\ufffd\ufffd\u0003\u0016\u0015\ufffdy{q\ufffdo\u0010\ufffdE#\ufffd\ufffd\u0016\ufffd\ufffd\ufffdG\f\n\ufffd\u0004\r\ufffd\u001f\ufffd\ufffd\rb\ufffd\ufffd\ufffd\rP\u0003\ufffdI\ufffd\ufffd\u0002$?nP\ufffd\u0010\ufffd\ufffdPH`U\ufffdNu\ufffd5\ufffd:\ufffd\u001e\ufffd\ufffdu`a\ufffdJjk\ufffd\ufffdk\ufffd\ufffd\ufffd]\ufffd^ox\u0003\u0016\u0007\ufffd\ufffdD\ufffd\ufffd\u000e\u0007\ufffdC\ufffdvg\ufffd7\ufffd\ufffd\ufffdm,\f\ufffdi\ufffd\ufffdZ\ufffdV\ufffd\ufffd\ufffd\u001f\u000eZ\ufffd\ufffd]\ufffd\ufffd\r\ufffd\ufffdh4T\ufffdr\r\f\f\ufffd\ufffd\nY\ufffd@\u000e.H\u0017\ufffd\u000e{C=C\ufffd\ufffd\ufffdzhY\ufffdQ\ufffd5\ufffd6Q<0\f\u0005\ufffd\ufffd\ufffd\ufffd\ufffd%\ufffdU\ufffd~\ufffd\ufffd!l\ufffd '\u020eocZ\u042dx\ufffd>\ufffd\ufffd\ufffd\u001f\t\u0005\ufffdC\u000e\ufffdK\u0000\ufffd 86\u0018b\ufffd\ufffd\ufffd\ufffd\u001f\ufffd]K\ufffd\u0010m?\ufffd\ufffd\ufffdp^\u0010\u0000\ufffd\u001c\u0016<\ufffdq\t\ufffd\ufffdi@'\u0003\ufffd\nF\ufffd\ufffd;H\ufffd\ufffdi\ufffd\u0002\ufffdN\ufffd\ufffd\ufffd\uc253l\u0000\n\ufffdv\u001d\ufffd\u0007\ufffd\ufffd\ufffd>\ufffd\u0007f_\ufffd/\ufffdN\ufffd\u0003Wv,:\ufffd\ufffd\ufffd%\ufffdI\ufffd\tM$\nVA\u001b\ufffdP\u0000\ufffd&\ufffd\ufffd\ufffd\u0013\u0002\ufffd~(%\n}\u0013\ufffd\ufffd`\ufffdC\ufffdL\u0006\ufffd\u0002Ao\ufffddz^\ufffd\ufffd\rcu\ufffd\ufffd\ufffd\ufffdN*\u0004\ufffdT\ufffd\u000f\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffdDa\b\ufffd\u001b\ufffd\ufffd\n!\ufffdX\ufffd\ufffd\ufffd\ufffd\u0007\ufffdK\ufffd\ufffd\t\ufffd\nwu\ufffd\ufffd{\ufffd\ufffdK\ufffd\ufffd\u0420\ufffd+\ufffdv;\ufffdD7\ufffda\ufffdO&\u0011S\b\ufffdS\ufffd'\ufffd\u007f\ufffdG\ufffd}\ufffdT2\u0010\ufffd\ufffd\ufffd\ufffd\ufffdU*\u001c\ufffdk\ufffd\ufffd\ufffd\ufffdj\u001c_\ufffd\ufffdU\ufffdk48\ufffdx\ufffd\ufffd\ufffdjq|\ufffd\ufffd_5\ufffdN\u0007\ufffdE\ufffdv\ufffd?\ufffd\u0015\ufffd\ufffd\""\ufffd\ufffdH~\ufffd\ufffd\n\ufffd#)\ufffd\ufffdeh\u001a\ufffd\ufffd\ufffdH\ufffd\u0016\ufffd$\ufffd\u001a)af\ufffd\ufffd\ufffd\ufffd\u001a\ufffd@\u001at/JA#H\ufffd\ufffd =z\u0003\u0019\ufffd(2\ufffd_!\u0013\ufffd\u0014\ufffd\ufffd\ufffdQ:\ufffdq;c@;\ufffd\u001c\ufffd\ufffdq\ufffd;\ufffd:t'\u04ccv1K\ufffd]\ufffd\u0017\ufffdf\ufffd\ufffd\ufffdV\ufffd\ufffd\u064d\ufffda\u001eB{\ufffd\u0011\ufffd\ufffd9\ufffd\ufffde~\ufffd\ufffd3\ufffd\ufffd\u0000\ufffd1\ufffd\ufffd\ufffd\f\ufffd\ufffd|\ufffd\u001e`\ufffd\ufffd\u0007Y%z\ufffd5\ufffd\ufffdY+:\ufffdV\ufffdG\ufffd\u0019\ufffd\u0010\ufffd\ufffdy\ufffd]\ufffd\ufffda\ufffd\ufffd1v\u0003s\ufffd\ufffd\ufffdU\ufffd\u06f80{\u0007\u0017a\u000fpQ\ufffd0\ufffd\ufffd>\ufffdmb_\ufffd\u0006\ufffd\u001fs\ufffd\ufffd{\ufffd\u0010\ufffd\t\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffdq\u06f8\u0014n;\ufffd\u0001\ufffd\ufffd?\ufffd\tW\u001c\ufffd$\u0019\ufffdd\u0000\ufffdb\b\ufffd\ufffd\ufffd\u000f\u0003\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\ufffd6`r\u000f09\u0004L\ufffd\u0000\ufffd\ufffd\u0003\ufffdw\ufffd\u026f\ufffd\ufffd9`r\u0019\ufffd1R`\ufffd\u0007&\u000e`R\rLf\u0003\ufffd6`\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\u00000\ufffd\tL\u000e\u0000\ufffd'\ufffd\ufffd\ufffd\u0003\ufffd\u05c1\ufffdO\ufffd\ufffdG\ufffd\ufffd\f0\ufffdWt\u001f\u0018\ufffd\ufffdl\u0012z\ufffd5\u0000\u0013\u001b0)\u0001&\ufffd\ufffdd\u001e0Y\u0006L:\ufffdI\u001f0\ufffd\u0002Ln\u0007&w\u0001\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffdy`\ufffd\u001a0y\u0013\ufffd|\u0000L~\u0007L>\ufffd8\ufffd\ufffd\ufffdi\ufffd[\ufffd,`\ufffd\u0000&\ufffd\ufffdd\u00160X8\ufffd\ufffdd \ufffdI\u001a0)\u0004&\ufffd\u0010:\u0007\ufffd,\u0003&]\ufffd$\u0002Ln\u0003&\ufffd\u0002\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffd-`\ufffd+`\ufffd\u00190\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\u0019\ufffdd\u00050\ufffd\u0004&a`\ufffd\r\ufffd\ufffd\u0001&\u000f\u0003\ufffdg\ufffd\ufffdq`r\u0012\ufffd\ufffd\u000fL\ufffd\u0000\ufffd?\ufffd}\ufffd\u0004\ufffd\u02e6\ufffd\ufffdl\u0016:\ufffd:\ufffdI=0i\u0006&K\ufffdI\u00070\ufffd\u0003&\ufffd\ufffd\ufffd\u001e`\ufffd00y\u0006\ufffd\u001c\u0005&\ufffd\ufffd\ufffd=`\ufffd+`\ufffd\u00190\ufffd\u0003\u0017\ufffd\u0010\u0017\ufffd\ufffd\\?\u8f89sr\u0003\\=7\ufffd-\u0000&\ufffd\ufffd\ufffd-\ufffdd\b\ufffd\ufffd\u0002&\u0007\ufffd\t>c\ufffd\ufffd\ufffdL\u0014\ufffd\ufffd\ufffd\ufffdn`\ufffd\b0y\u001e\ufffd\ufffd\u00030y\u001f\ufffd\ufffd\u0001&\u007fD\u0006F\tL\ufffd\ufffdd\u001a0i\u0002&\ufffd\u0000&\ufffd\ufffd\ufffdo\ufffd\u027d\ufffd\ufffdQ`\ufffd<09\u0001L\ufffd\u0004&\u001f\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd=\ufffd\u0014\ufffdv\ufffd\ufffd-\u0006&U\ufffdd\u00160Y\fL\ufffd\u0001\ufffd\u00000\u0019\u0004&w\u0000\ufffd\ufffd\ufffd\ufffd1`\ufffd\""0y\u001d\ufffd\ufffd\rL>\u0004&\u007f\u0000&\ufffd\ufffd\ufffd8W\u0169\ufffd0g\u0000&y\ufffdd\u001a0i\u0002&\ufffd\ufffd\ufffd\u000bL6\u0002\ufffda`\ufffd\u0017\ufffd<\u0006L\ufffd\u0007&'\ufffd\ufffd?\u0002\ufffdw'3Q\ufffd!\ufffd\ufffd\u0019\ufffd\ufffd\ufffd\ufffd!\b\ufffd\u000fLV\u0003\ufffd\r\ufffd\ufffdV`\ufffd\u00000\u0019\u0001&'\ufffd\u025b\ufffd\ufffd\f0\ufffd\u001c\ufffd\u0019\u00110\ufffd\u0006&.`2\u000f\ufffd\ufffd\ufffd\ufffd00y\u0004\ufffd<\u0003LN\u0000\ufffd\ufffd\ufffd\ufffd\u0003`r\u0006\ufffd\ufffd\t\ufffd\u0006\ufffd\ufffd&p\ufffd\ufffd\u0016\u0000\ufffd\u001a`\ufffd\u0002L\ufffd\u0002\ufffd\r\ufffdd\u0010\ufffd\ufffd\u0005L\u000e\u0002\ufffdo\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdg\ufffd\ufffdw\ufffd\ufffd\nz\ufffd\ufffd\ufffdC\\.\ufffd\u001cW\u019c\ufffd\u00160c\ufffd\u0012\ufffd,\ufffd\n\ufffd\ufffd\ufffdI\u0018\ufffd\ufffd\u0006L\ufffd\u0003\ufffd'\ufffd\ufffdK\ufffd\ufffd\u0007\ufffd\ufffd\u0017\ufffd\ufffd40\ufffd#w\ufffd\ufffd\u3d8at\ufffd6Q6\ufffd]d\ufffd.\ufffdz2\ufffd\ufffd\ufffd8&\ufffd\ufffdd\u00060Y\u0003\ufffd[\ufffd\ufffd#\ufffd\ufffdy`\ufffd609\u0007L\ufffd\""5\ufffdC\u001a\ufffd\u001c\ufffd0\ufffd\ufffd\ufffd\t\u0001\ufffd\ufffd\ufffd\ufffd;\ufffd\ufffd\r`\ufffd[`2\ufffd\ufffd\ufffdLt;\u8e43]\ufffdv\ufffd\ufffd\ufffd\u001d\ufffd\u000et'\ufffd\u0014\ufffd\u0005u|\u0017\u8ddb}\u001f\ufffd|\ufffd\ufffdp\u0012t\u000f\ufffd\ufffd\ufffdr\ufffdh\u001f\ufffd\b\ufffd\ufffd\ufffd\ufffd~.\ufffd\u000ep\ufffd\ufffd}\u070b\ufffd~\ufffd{\ufffd\u0001n\u0014=\ufffd\ufffd\u001a=\ufffd}\ufffd\u001e\u0016%\ufffd\ufffd\""+zDT\ufffd\u000e\ufffdV2\u03c9\ufffd3gD;\ufffd1\ufffd\ufffd\ufffdY\ufffd~\ufffdJ\ufffd4\u0017\u0016=\ufffdEDosQ\ufffdo\ufffd~\ufffdEn\ufffd\ufffd\ufffd\u0006\ufffd9\u0720x\u001a7$^\ufffdm\u0016\ufffd\ufffd[\ufffd\ufffdr[\ufffd/p\ufffd\u012fs\ufffd\ufffd\ufffd\u0004\ufffd\u007f\ufffd\ufffdg\ufffd\u0014\ufffdi4\ufffd\ufffd\ufffd[<\u0017d\u0012\ufffd\ufffd\ufffd\ufffd\fz<\ufffdK\ufffd\ufffd3\f?\ufffdz\u001cMv\ufffd3\u000b~\ufffd\ufffd/<\ufffdA\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\u000b\ufffd)\ufffd\u001bNs\ufffd\u000e>\ufffd\u0005\ufffdg\u000b\ufffdvA\ufffd!\ufffd\u851b\ufffd\ufffdR\ufffd]\ufffd\ufffd\ufffd21dA/\ufffd/\ufffd\ufffdH\ufffd8=\ufffd\t\ufffdu\u0019,\ufffd[`\ufffd;=L\ufffd\ufffd\ufffd\ufffd\u0006?\ufffd\u001aAJ\u03e0P\""\ufffdh\ufffd\ufffd\ufffd\ufffd\u0006w\r\ufffd\ufffd\ufffdv]$!\ufffd\ufffd5\ufffd\ufffdF\ufffd\u0005\ufffd\ufffd\u000b)\\\ufffd\ufffd\u001a\ufffd,\t\u0252\u039c\ufffd=\ufffd\ufffda\ufffdH\ufffd$b$\ufffd\ufffd\u06e7\t\ufffd\ufffd$\ufffd \ufffd\ufffd\r\ufffd{e\u0017.D\""\ufffd\ufffd\u043e\ufffd\ufffd}\ufffdH\ufffdI&\u001b\u0735k\ufffdC\u0001\ufffd\""\ufffd\ufffd\ufffd\ufffd\\\ufffd\ufffdR\ufffd\ufffd\ufffd*\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\u001b\ufffd\ufffd\u000b\ufffd\ufffd\ufffd\ufffdz\ufffd\ufffd\ufffd\u007f\ufffd\ufffdpn\ufffd\u0006\ufffd\bA\u0012\ufffd6\ufffd\ufffdkk\ufffd\ufffd\ufffdCr\ufffd\r\ufffd\ufffd)\ufffd\u001cI\u0014?G\ufffd\u0004H\u000b:?,\ufffd \ufffd\ufffdg$\u0013\ufffd\ufffd]4w\ufffd\ufffd\ufffd.\u001e\r\ufffd\""\ufffd\ufffd\ufffdd\u0019D\ufffdHnT\t\ufffde\ufffd)\ufffd\bj\ufffd\ufffd\ufffd\b\ufffd\ufffd,$\ufffd\u000f!\ufffd\ufffdz\ufffd\ufffdmmm\u0016\u000b.[\ufffd\ufffdp\u000b\ufffd\u0010+8>\ufffdbi\ufffdP>\u0011\ufffdr\ufffd\r\ufffd\ufffd\ufffd}\u0016\ufffd>\u0002_V\ufffd\ufffd\ufffd\ufffdz\ufffd\ufffdM,\ufffdXvx\ufffda\u0019\ufffd\ufffd\r\u0019\ufffd\ufffd8lT\ufffdhx\ufffd\ufffd\u0018\ufffd\ufffd\ufffd\ufffd\ufffd21#\ufffd\u0012\u001d@\u000bra9e\ufffd?\ufffd\ufffd\u0010\ufffd\ufffd\ufffd\ufffd\u0015\ufffd\b\ufffdd\u0010\r\ufffd\ufffd\ufffdT\u063c\ufffd\u000bY\u0006\t\ufffd4<|Q\ufffdk\u001e_\ufffd\ufffd1p>\ufffdK\ufffd4\u001a\ufffd\ufffd\ufffd\u0016\ufffd\t\ufffdB\ufffdoP\ufffdY'\u0192\ufffd\u0001\ufffd)\ufffd{\ufffd\ufffd\u001e\ufffd\ufffd,o\ufffdeH.3\ufffdrss\ufffdg\ufffd\ufffdT.a\ufffd\ufffdd\ufffd\ufffd\u38ea\u03b5\ufffd\ufffd{\ufffdd.\ufffd\u06fe\ufffd\ufffd\ufffd=\ufffd\ufffd\ufffd\u0207\ufffdR\u001ai\u001aCLi\ufffd)\ufffd\ufffd\ufffd\ufffd\u0018\u0002\ufffd\ufffd\ufffd\u0018!bJ#\ufffd1b\ufffd)\""ED\ufffd\u0018)\""R\ufffdH\u0011\u0011\u0011\ufffd[\ufffd\ufffd\u0011)\""R\u000e\ufffd\ufffd\ufffd\u001c\u000e''\""\ufffd\u001c\ufffd|\ufffd\ufffd\ufffdU[\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd~\u07ec\ufffd\ufffd{\ufffd\u07b5\u05bb\ufffd\ufffd\ufffd&\ufffd\ufffdk\ufffd\ufffd\ufffdR<\u0001\ufffd\ufffd\u04e8^\ufffd$Ja*\u000f\ufffdQ\\W\fT\u0019\u0018\ufffd\u9052:\ufffd\ufffd\u0202\ufffd\ufffd\u0002E\ufffd\ufffd\ufffd\ufffd#H\ufffdq`\f\ufffd\ufffdvRq\ufffd\ufffd\ufffdz\ufffdN \ufffd`\u02a0\ufffd$e\ufffd3X%\u0159T\ufffdI\ufffd\u0000k\ufffd\u0002\ufffdkaM\u0017\ufffd\ufffd\ufffdE\ufffd\u0007CM\ufffd\u019a\ufffd\u0003\ufffd\ufffd0\ufffd\ufffd\ub341\u001fB\ufffd\ufffd7\u0012}z\ufffd9\ufffd\ufffd\u0003\ufffdC\ufffd\u001ew \ufffd\ufffd;t w\u0004\ufffd\ufffd\ufffd2\ufffd;\ufffd}\u0721\u0003\ufffd\ufffd6\ufffdZ\ufffdE\u0005}\ufffdI\ufffd\u0014\u05d4\u0016'\ufffd\ufffd\ufffdc$Z\ufffd\ufffd\ufffd\""\f\u001d\ufffd\u06b4^\ufffdt\ufffd\u03a6}5y\ufffd@\ufffd\ufffd:\ufffd\u001c\ufffdL\ufffd\u0007G\ufffde\ufffd0\ufffd\ufffd\ufffdv\ufffd(\ufffdE}\ufffd\""q\u0007\ufffd\u0007Z\ufffd^(\ufffd\ufffd)>\ufffd\ufffd/\ufffd\ufffd\u0001\ufffdI\ufffd\ufffdu0u9\ufffd\ufffd9\u0015\ufffd\ufffd\ufffdgs\ufffdr|/{\ufffd\ufffd\ufffd\ufffdP\ufffd\ufffd\ufffd\ufffd\ufffd\udbc4\udc70X\ufffd?\ufffd\ufffdT\ufffd.\u0260\ufffd\u0018R\b\ufffd\ufffd(\ufffd\ufffd\u0007\u0006i\ufffdPC\ufffd.I\""`\u0011\u0016M\ufffd(e4I#\ufffdQ_\ufffd5}y\ufffd\u0001C\t\ufffd\ufffd\ufffd'\t\ufffd\ufffdW\ufffd(\ufffd\ufffd\ufffd\ufffd\u0001\u0014\u0016\ufffd\ufffdu\ufffd\u046c\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd_p\u0013>\ufffd\ufffdj\ufffd\u0003X\ufffd\u02f4\ufffd.&\ufffd\ufffdN\ufffdk\ufffd9&\ufffd\ufffd9\ufffd9\ufffd`\""\u0006\ufffd\ufffd\ufffdB\ufffd\u000f!d\ufffd\ufffd-,X\u000b\ufffd\u0005iZ\ufffd\u01a6\ufffd\u000e\u0018eH#\u0006\u001dL\ufffd\ufffdr\ufffdL\ufffd\u0006\ufffd\ufffd\u0018\ufffd'\ufffd\u0565\u000bB}#\ufffd\ufffd\ufffd`\u0016t\ufffd=\ufffd\f\u001ab\ufffd\ufffd\u0016\ufffdf\ufffdg\u0006\ufffd\ufffd\u0004\u01fb\u001a\u001b\ufffd\f\ufffd\ufffd6\u0447}\ufffd\ufffd\u00a9\u0016K\ufffdKa\ufffd\u001d\ufffd\ufffd7\ufffd1\ufffd\ufffd=\ufffdH\ufffd\ufffd\ufffd)\ufffdH\ufffd\ufffd#i\ufffd\ufffdI[\ufffd\ufffd:\ufffd!h&\ufffd/\ufffd\u001e\ufffdBV\ufffd\ufffd\ufffd\ufffd`N\u04d04-\u0012\u0011\ufffd\n4\ufffd\ufffdI\u0019S-\ufffd\rM\ufffd\ufffd\ufffd\ufffd4f\ufffdq\u0011\u0208\ufffd\ufffdf\ufffdj\ufffd\ufffd\ufffd\ufffdb\ufffd+\ufffdU+V\u0014H\u0018\ufffdF\ufffd\ufffd\f\ufffdE\ufffd\u0596\u0004\ufffd\u0006\ufffd<\ufffdA\u000f\ufffd\ufffdK\ufffd \u0014\ufffd\uf41b\u0253d>\u0019\u001b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffd'\ufffd\ufffd4h\ufffd\ufffd\ufffd\ufffdr\ufffdq|\ufffd\ufffd9\u0006\rg\ufffd\ufffd\ufffdZR\u0004\ufffd\u073aFA`\fm\ufffd\ufffd\ufffd\t\ufffd\ufffd\ufffd\u0001Q\ufffdh\ufffd\ufffdF-5\ufffdn\ufffd\ufffd\u0172\ufffd\ufffdU \ufffd\ufffd=\ufffd\ufffdE\ufffd\u0018\ufffdn\u0004\ufffd\ufffd\ufffd.e\u000b\ufffd\ufffdt-\ufffd\ufffd4\ufffd+\u0019Q54]\ufffd\ufffd\ufffd\u0002\ufffdIg\ufffd\ufffd/\ufffd\ufffd\ufffdvk\ufffd\ufffd\ufffdn0\u0010\ufffd!\u001dv\ufffd\""\ufffd\u0000\ufffd\u000b\ufffd\ufffd>\r\ufffd8\ufffd\ufffd\ufffd\ufffdD5\ufffdC\ufffd\ufffd\u0007\u0013\ufffd0\ufffd\ufffd\ufffdgcr\u064f!\ufffd\ufffd1\ufffd\u0000\ufffd\ufffdevS)\ufffd\u0019#5\ufffd\ufffd\ufffd\ufffd\u00127\u0017\ufffd\f\ufffd=\u000eW\u001dTl\ufffd\u001a\u02b2y\ufffd&\ufffd\u0018\ufffdH\u001d\ufffdcw\ufffd\ufffd{]\u0019/S\u0005\ufffdJF\u03eb\ufffd&\b:\ufffd\u001f\ufffdd(\ufffd\ufffd\u000b?I0\ufffd\u0005\ufffd\ufffdIG2\ufffd\u001a,\ufffd\ufffd\ufffd67ubvzNA\ufffd\ufffd=)\ufffd\u0001U\ufffd\ufffd.\ufffd\ufffdT\ufffdE\ufffd\ufffdT.\ufffd\u001d;\ufffd\u0003\ufffd0@SZ\ufffd\u001b]x\ufffd\ufffd\ufffd\ufffd{pl\ufffd\ufffd@\ufffd\ufffd\ufffd\ufffd\u000e\ufffd(\ufffd&\ufffdQ\ufffd\ufffd\ufffdF\u001d\ufffd\ufffd\u01cc\ufffd\ufffd\u0019\ufffd\ufffd\ufffd@\ufffd$\ufffdY>+\ufffdS\ufffdGk\\S\ufffdq\ufffd\ufffdX}\ufffd,\ufffd\u0019\ufffd\u000b\u000b\ufffdzjL\ufffd%\ufffd`j\ufffd\ufffd\ufffd\ufffd\ufffdr\ufffdY FM\ufffd\u007f\ufffd\u000b{\ufffdKnl\ufffdH\ufffd\ufffd^v\u000f\ufffd7v\u0014\u001aN\ufffd0\ufffdo`Hp\u8601\r\ufffdK\f\u001fC\ufffd\u0013(\ufffd\ufffd\ufffd\u00050[@\u0016\ufffd\ufffd\u0018\r_&9\ufffd9\u001b\ufffd\ufffd\u007f8\ufffd!\ufffd0'\u000f\ufffd\ufffd@\ufffd\u001b-\ufffdh\ufffd%}ac\ufffd\ufffdI\ufffd\ufffdT\ufffdh\ufffd\ufffdOO\ufffd\ufffd\ufffd\ufffd\ufffd)\ufffd\ufffd\ufffdY<\u0017s\ufffd\ufffd\u000f\ufffd\ufffd\\\ufffd>\ufffd\u0005U\u001f\ufffd\ufffd\ufffdv(\ufffdC\ufffd'\ufffd\ufffdP?\ufffd:\ufffd\ufffd\ufffd\ufffd\ufffd>\ufffdC\r]\ufffd\u0000\n\u0000(@:\u000f6\ufffd\u0015\u0000N\ufffdF\ufffd3\u000f\ufffd\u0000&\u0002:h(%\u0002p\ufffdg\ufffd\ufffd\u0013{z2\ufffd0\ufffd\u0003\ufffd>\ufffdS\ufffd\u0007%\u0010\ufffdx\u0016KJ\u0001Xg\ufffd\ufffdc\ufffdA\ufffd\ufffdh\ufffdhJ\ufffdh\u0017\ufffd\u0000\ufffd}V\ufffd\ufffd\ufffd\ufffd\u001b$\ufffd\t\ufffd\ufffd\rRr{\ufffd6G:H\u00075\u0000\ufffd\b\u0015~\ufffd\ufffdU\u056cd\u0011i!\t\ufffd\ufffd\ufffdnlB\ufffd\ufffdu\ufffd\ufffd\ufffdZ*Qr]\ufffd8\ufffd8y\ufffd\ufffd\ufffd\ufffdK\ufffdj\ufffd@5\ufffdN#\ufffd}Z\ufffd\u0014\ufffd\ufffd4&\u0016\ufffdp{\u0162\ufffd)3g\ufffdW\u000b\u007f\u0017*\u0000l\rz\ufffd\ufffd/\ufffd\u0004\ufffd\u0011\u0018\ufffd\ufffd\ufffd\u0273W1\u04b505\ufffd\u0018\ufffdMB_\ufffd^\ufffd`\r \u000fQ3P4\ufffd:\ufffdR\ufffd\ufffd\u000e\ufffd\u0246y\ufffdl\ufffd\u0007\u0206\ufffdW6L\ufffd\u0114\u000e\ufffd\u0016\ufffd\ufffd\u0006C\ufffd\ufffdmqk\u2184?\ufffd/++\ufffd\ufffd4\u0019\ufffd)\ufffd*\ufffd\u0016/K\ufffd0-\ufffd\u0200\ufffd\ufffd\u0124\ufffd&\ufffd\ufffd<\u0010/\ufffd'\ufffd\ufffdP\u0016\u007f \ufffd#\u0005\ufffd\ufffd6+?\ufffd\ufffd\ufffd\ufffdH\u057e\u001a\u0007\ufffd\ufffd2RF\ufffd\ufffd<\ufffd\ufffd\ufffd\ufffd \ufffdj\u0724\ufffd&\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u7573J\ufffd\ufffd\fnnwbg|'\u0014\u007f \ufffdcs\ufffd\ufffd'\ufffdW\ufffdx$Q6 |\ufffdn\u0012\ufffdI\ufffd9\ufffd\u0013\ufffd6\r1i\ufffdr\u0006\ufffd\ufffd\u0012\ufffd[\ufffd\ufffddG\u0006\ufffdx\ufffd[fj\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdN\ufffdW\u0272\ufffde?R\u007f\ufffd\u0016B(P\ufffd\ufffd^2\u001b\ufffd&\u0006\ufffd\ufffd\ufffdg\u01fd\ufffd1\ufffd\ufffd\ufffd\ufffd\ufffdY\ufffd\u000ec\ufffdo\ufffd\u0013=\ufffd>8\ufffd\ufffdL\ufffdxY\ufffd\ufffd\u0754FM\ufffd\ufffd\ufffd]\ufffdDMn\ufffdV;\ufffdP\ufffd\ufffd\u0000u\ufffd&\u000e%\ufffd\u000b\ufffd\ufffd\ufffd\u0000\u0371\ufffd|\ufffd`}\u001f\u001a\ufffdc\ufffd0\ufffd\ufffdN\u64c2\u001c\u0016\ufffd*\u0004\u00131\ufffd\u03e6\ufffd\ufffd$\u00bbsw\ufffdlg\ufffdl'\ufffdn\u001a\ufffd\ufffd\ufffdu#\ufffd\u000b\ufffd#\ufffd\ufffd\ufffd&\ufffd*{\ufffd\ufffd\ufffd\ufffdU\ufffd\u036fhm{\u0224\ufffd\ufffd\ufffdS\ufffdb_\ufffdK\ufffd\ufffd\ufffd\ufffdd*\ufffdOY\ufffdf\ufffd_f\ufffdO\ufffd\b\ufffd\ufffd\u0006\u0018\ufffd\ufffdp\u000f\ufffd~\ufffd\u04ce\ufffd\ufffd\ufffd\u059eD\ufffd<\u03e4\ufffdY\u031bQV\ufffd\ufffd;\ufffd&\ufffd\ufffd#\ufffd\ufffdO$\ufffd\u0778{\ufffd<\ufffd\ufffd\ufffd\ufffdO\u001f\u0010\ufffd\ufffd\ufffd\ufffd\ufffd)+#\ufffd\ufffd\ufffd\ufffd\ufffd\n\ufffd\ufffd\ufffd\u001c+\ufffd\ufffdQ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdl\u010db\ufffd\bB;\ufffdI\ufffdimVsr\ufffd[{L\ufffd\ufffdL\ufffd\ufffd\ufffd^\ufffd\ufffd\ufffd$\ufffd\ufffd\ufffd\ufffd\ufffd`w\ufffd\ufffd\ufffd=\ufffd\ufffd\ufffd9\ufffdrB\""\ufffd\ufffd[\u0013\u0007\ufffdNq\ufffd)n\""!\ufffdm\ufffd\ufffd\ufffd\ufffd\u0017\ufffdB\ufffd\ufffdq0\ufffd\ufffd\u0007\ufffd\ufffdOLi\ufffd\u0268\ufffd-S{_\ufffd\u0018\ufffd[\u001f\ufffdy\ufffd6]\u0359\ufffd\ufffd\ua014<-\ufffd?\ufffdZ\ufffdF\ufffd\ufffd\f\ufffd\ufffd\ufffd\u001bn2\ufffd\ufffd\u0007\ufffdk\ufffd\u0001\u0016b\ufffdQ\ufffd\ufffd^e\ufffd\ufffdn\ufffd\ufffdk\ufffd\ufffd(rp\ufffdN\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdc\ufffd0I\u001aa\ufffdU1\ufffd@\ufffd\u001bD\u007f\ufffd\ufffd\ufffdC\ufffd!1\ufffd\ufffd8\ufffdz\ufffd\ufffd\ufffd\u001a\ufffd\ufffdp\ufffd\ufffd\u0003&\ufffd\ufffd\u052aK~\ufffdS\ufffd\u0017\ufffdO\u007f\u0200\ufffdO\ufffd\ufffd\ufffdp3\ufffd\ufffd\ufffdI\ufffd\ufffdg'\ufffd\ufffd\ufffd\ufffd\ufffdY\ufffdU\u000fc\u07e4\ufffd\u001a\u01beY\ufffd\ufffda\ufffd\ufffdi\ufffd\ufffd_\ufffd\ufffd\u0016\rt\ufffd~2\u0011\ufffdA\t\ufffd\u000e%\ufffd\ufffd{\ufffd\u0004i\ufffdb%\ufffd\ufffd\ufffd]\ufffd\u056b\ufffd,I\ufffdE\u0011$\ufffd\ufffdhx\ufffd\ufffd\ufffd\ufffdI\ufffdGI\u00131\u0010z\u02c4B?\ufffd\ufffdR\ufffd\ufffd\ufffd3D\ufffd\ufffd\ufffdI\ufffd%\ufffd`\ufffd\ufffdH\u0193[\ufffd\u0014`a%~\u000f\ue5e4\u0001v\ufffd\ufffd\u0494\ufffd\ufffd<\ufffd\ufffd\ufffd\u0010\ufffd\ufffd{$\u000f\ufffd\ufffd?%\ufffd\ufffd]\ufffd\rQ\ufffdm\ufffdzp\ufffd\ufffd\ufffd^\u0204\ufffd%i!\n\ufffd,X{\ufffd\ufffd\u0007\u41e4\ufffd\ufffd\u0006\""4\ufffd\ufffd\u0004\ufffd\ufffd!\u000f\ufffdF\ufffd+\ufffd{\ufffd\ufffd\ufffd\ufffdb2v\ufffdO\u007f\ufffd'S'N\ufffd\ufffd\u001f\u00162\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd`\ufffdI\f\ufffdo>\ufffd\ufffdqp\ufffd\ufffdL\ufffd\ufffd\ufffd>@\u001e\u0002\u0002?N\ufffd\ufffd\ufffd\ufffd8\ufffd\ufffdD\ufffd5p\ufffd\ufffd\ufffd\ufffd\ufffdL \ufffd\ufffdt;\ufffd\ufffd\u0000'\u0019\ufffd\ufffd\ufffd\u0012\u0019FF\ufffd\ufffdI\u0001\ufffdR~Ln!\ufffd\ufffd:\ufffd\u0000\ufffd\ufffd\u0005\ufffd\ufffd\b\ufffdX\u0016\ufffdZ\u0580\u001fE\u211df6\ufffd_\u4ef0\t\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000e\ufffd\u0006\ufffd}\ufffdM\ufffd8y\ufffda!\ufffd\u0012\ufffd\ufffd-\ufffdk\u0010\ufffd#nB\ufffdZ1k\ufffdta\u0007\ufffdA\ufffdc\ufffd\ufffd\u0011;\u0010\ufffd0\ufffdh\u0011\u016a{\uf666\ufffd\""\ufffd\u0011\ufffd#\ufffd\ufffd\ufffd~\ufffd>M>b\u0011\ufffd8\ufffdR\ufffdI\ufffdS\u0010\ufffd\u0011+\ufffd\ufffd^\ufffd\ufffdF\ufffdE\ufffdGl\ufffd\ufffdY\ufffd&\u0105\ufffdK\u0010\ufffd#\ufffd \ufffdA\\\ufffd\ufffd\ufffd~fm+\ufffd\u000e\ufffd=\ufffd\u0007\u0011\u000f#\u001eC<\ufffdx\ufffd\ufffdY3\ufffd5\ufffd\u0010;\u0010/\u0570\ufffd+\f\ufffd\u0004Q\ufffd\ufffd\ufffd(\""\ufffd\ufffd^\ufffd\ufffdl\ufffd;m\f1\u0007q\u0014b\u001eb!b\ufffd\ufffd{\ufffd+\ufffd\ufffd\u0011'\""\u0781X\ufffdX\ufffdX\ufffd8k\ufffd}\ufffdk\ufffdu\ufffd\r\ufffd\u0348K\u0011[\u0010\ufffd\u035e\ufffds\ufffdv3\ufffdv\ufffd=\ufffd\ufffd\u0010\ufffd\""\ufffd\u0004\u001c\ufffd=\ufffdx\u001e\ufffd\u0013\ufffd2b7\ufffd4\u000e\ufffd;i:D+\ufffd\ufffd\ufffdG\ufffd\""\ufffd\ufffd~\ufffd|vZ.b>b\u0011\ufffd8\ufffdR\ufffdI\ufffdSf?X3;\ufffd\u001c\ufffd\u0012\ufffd\u001a\ufffd\u0016q.b\u001cq~-\ufffd-\ufffd\u0019q1\ufffd2\u0115\ufffd\ufffd\u0011\ufffd!nD\ufffd\ufffdT\u0014\ufffd\ufffd\ufffd\u0016W\u001e\ufffd/\u0013\ufffd\ufffd\ufffd\u6382*~3d\ufffd\ufffd\ufffda\ufffd#\nJ\ufffd\u0007\ufffda\ufffd\ufffd\ufffdK\ufffd\rH\u001d\ufffd6\ufffd\u001c\u0005\ufffd\ufffd6(\ufffd\ufffd\ufffd@\ufffd\u007f\ufffd=\u0007\ufffd\u001f\ufffd\u0007W\n\ufffd\ufffd\ufffd\ufffd\ufffd\\\ufffd7\ufffdi\ufffd\u0013\ufffdB\ufffd\ufffd\u000e\u001d\ufffd\u0012\u0003_B\ufffd\ufffd\ufffd\ufffd7@\ufffd\u001b\""\u000f\ufffdn\u000f<\u001b\ufffd\u035d\u001b\ufffd|\ufffd(<\u067e\ufffd\ufffd\ufffd\ufffd\ufffd\""\u0007\ufffd\u001f\ufffd-\ufffd\ufffd|\ufffd\u0014\ufffd\ufffd\ufffd\u0014\ufffdo\ufffd\ufffd\ufffd.\ufffd\ufffd,!\ufffd\ufffdf\ufffd\ufffd\u001c%g\ufffd%\u001a\ufffd#h!\ufffd@\ufffd\ufffd,\ufffd@\u0017\ufffdUt\u0013\ufffdE\ufffd\ufffd\ufffd\ufffd\""\ufffdq\""\u0017\ufffdFp\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd5p\ufffd\ufffdU\ufffd&\ufffd\u0010w\ufffd\ufffd\ufffd|1?\ufffd\ufffd\ufffd\ufffd\ufffd&~\u0019\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd.A'\ufffdBT\ufffd\u0015\ufffd\ufffd\ufffd\ufffdV\u05b6.\ufffdr\ufffd\u000bC\ufffd\u0007\ufffd\u0005\ufffd?\ufffd\ufffd^K\u0010H\u001a\ufffdk\t\u044c\u001a\u001c\ufffdz\u0007\ufffd\u05f2_b\u01f8\ufffd{n\ufffd\ufffd\ufffdT\u00d5\ufffd\u0578%yM\ufffd\ufffd\ufffd\ufffd\ufffd\r\ufffdm>1 \u000e,\ufffd4\u000f\ufffd\ufffd\ufffd%\ufffd\ufffd7t\r\ufffd}\u0001\u0019\u0012_\ufffd-\ufffd\u06af\ufffdo\u001c\ufffd^\ufffd\ufffd\ufffd\ufffd\u01d8\ufffd\ufffd\ufffd\ufffd\u0013\ufffd\u3145C\ufffd\u001b\u0007\ufffdo\ufffd\u000en\ufffd&\ufffd`\u007f\u0734dH\ufffdmp\ufffdqCf\ufffdf\uf438\u007fH<88>\ufffd\ufffd8\u0007Z/&=0\ufffd\ufffd\ufffdM_5\ufffd\ufffd\fK^'\ufffd\ufffd\ufffd[\u04d3\ufffdI\ufffdW\ufffd\ufffd\u0511\ufffd\ufffd6>u\u0750\ufffdN\ufffd\u000f\u001e\ufffd\ufffd9\ufffdga\ufffd\ufffd\ufffd\ufffd\ufffd}\ufffd\ufffd\ufffd\ufffd\u000f\ufffd\u001f\u001c\u0012?\ufffd\ufffd8\u001d\u0018o\u001b\u0012?9\ufffd\ufffd\ufffd\ufffd\ufffd;\ufffd!q\ufffd\ufffd\ufffd\r_\u0013\u001f2\ufffdwj\u0007\ufffd\ufffd]U\ufffd\ufffd\ufffdJ\ufffd\ufffd\ufffd\u0000\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffdb\u0005\ufffdT\ufffd$vJ\u0012\ufffd\ufffd\ufffd\u0007\ufffd-\ufffdz\ufffdMa\ufffd\ufffd*\ufffd)\ufffd@7\ufffd\ufffdl\u03b86#\u0007\ufffd\u04e0\u001c\ufffd\ufffd\ufffd6\ufffd\ufffd\ufffd\ufffd0\ufffd\ufffd\u001e\u009e*:<\u0019\u0015\ufffd\ufffdd\u0012\ufffd\ufffd*\b;-\ufffd\ufffdn\ufffd\ufffd\u001e\ufffd\ufffd1\ufffd\ufffdu\ufffd\u07c3\ufffd\ufffdba\ufffd\ufffd[j\u000e\ufffd\ufffd\u001a\ufffd'up\ufffdi\ufffd\u0013\ufffd\u0000g\ufffd\ufffdd%Y\u0003eW\ufffdud#\\7\ufffd.n\ufffd\ufffdV\ufffd\u0003\ufffd\ufffd'\ufffd\ufffd~\ufffd\ufffdx\ufffdp\ufffd\ufffd\ufffd-\ufffd\u007fp\ufffd\u0001\ufffdA\ufffd\ufffd\ufffd\ufffd\ufffdr\u001c\ufffdo)\u001f\ufffd\ufffd=\ufffd\ufffd\ufffd\ufffd[\ufffd\u0001\ufffdA\ufffd \ufffd[\u02bb\ufffd\u0013>V\ufffd'\ufffd\ufffd\u0001\ufffd\u000e\ufffd\ufffd-\ufffd\u0003\ufffd\ufffd\n\ufffd#x}K\ufffdS*\ufffdh*\ufffd\ufffdT\ufffd\ufffdT\ufffd\ufffdh\ufffd\u001d\ufffd\ufffd\u0013-\ufffd\u0194\ufffd\ufffd\ufffd\ufffd\ufffd8^\ufffd~n\ufffd~\ufffd\ufffd\ufffd\ufffd\u0604)\u007f\u0114\ufffd,%\ufffd\ufffd`l\uda8f\ude42\ufffd\u001e\ufffd]\u05afH\ufffd\ufffd\ufffd\ufffdTy\tb3a.6\u04edt;\u0759\ufffd)\ufffd\ufffd~H?\ufffd\ufffd\ufffd|\ufffd\ufffd\u001f.\ufffd,\ufffd\""\ufffd\u0013~/\ufffd\u0017\ufffd\ufffd\ufffd-l\u0016\ufffd\n\u001f\n\u01c4\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\t\ufffd\ufffd.|\""\ufffd\u0016\ufffd\n\ufffd\n\ufffd\ufffd\u0010.\t\u007f\u0013.\u000b_\b]\ufffd\u007f\tW\ufffd\ufffd-t\u000b\ufffdG\ufffd\u0011\ufffdj\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000b\ufffd\ufffd\ufffd\ufffd#\ufffd\ufffdc\ufffd\ufffd\ufffd\ufffd\ufffd\u001b\ufffd[\ufffd[\ufffd\ufffd\ufffd\u001d\ufffd\u0014i\ufffdT&\ufffdK3\ufffd{`\ufffd\ufffd\u0001\ufffd\u001de\ufffd\ufffd[\u066b\ufffdS\u000e(\u0007\ufffdw\ufffdC\ufffd{\ufffd\ufffd\ufffda\ufffd\u0003\ufffd\ufffd'\ufffd\ufffdrL\ufffdH9\ufffd|\ufffd\ufffdp\ufffdp%\\\ufffd\\{\\\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdq\u000f\u01f5\ufffd,\ufffd\ufffd\u007fx\ufffd8^~\u000eI\ufffd\u0017\ufffd\ufffd\ufffdU\ufffd\u0000\ufffd\ufffd\u0010\ufffd\ufffd\u007f>r\ufffd\ufffd?K}N]\ufffd\u05ea+\u0515\ufffd\u001c\ufffd%\ufffd%\ufffd\u0017\ufffd\ufffd\ufffd\ufffd\ufffd\\u\ufffd\ufffd*\ufffdK\ufffd5u\u0013\ufffd\ufffd\ufffd\ufffd\ufffd:\ufffd\ufffd\ufffdM\ufffd\ufffd\ufffd\ufffd\u001d\ufffd\u000e\ufffd1u\ufffd\ufffd\ufffdoT[\ufffdC\ufffd\ufffdj\ufffd\ufffd>\u07ec~\ufffd~\ufffd/T\ufffdP\ufffd\ufffd\u007f\ufffdv\ufffd\ufffd\ufffd\u0012g\ufffds,\ufffd\ufffds\ufffds\u0002\ufffd\ufffd9\ufffdy\u0007\ufffd\ufffds\ufffd\ufffd.~\ufffds\ufffds:\ufffd\ufffdy\ufffd\ufffd^\ufffd\u0005g\ufffd\ufffd\ufffdoq\ufffd8k\ufffd\u0017]\u001b][\ufffdU\ufffdw\\\ufffd\ufffdv\ufffdv\ufffd\ufffd\\\ufffd]\ufffd\ufffd\u07fb\ufffd\ufffd\ufffd\ufffd\ufffd]\ufffd\\\ufffd\ufffd?\ufffd\u000e\ufffd\u000e\ufffd\u001b\\\ufffd\ufffd\u033f\ufffdQ\ufffdQ\ufffd\ufffd\u0000\ufffd\ufffd\ufffd\ufffd\ufffd\u0010%\u0019\ufffd\""\ufffd\u0004\u0005\ufffd{z\u0000\u03f6\ufffd\u001e\ufffd\u001ed$\ufffd\u0000\ufffd\ufffd\b2\ufffdE\ufffdkxr\ufffd\ufffd|\ufffd\ufffdA\ufffd1~\ufffd\ufffd\ufffd\u001f&r\\c\ufffdX\ufffd\u01cc%\ufffd\u0004c\t\ufffd3[\ufffd\ufffd$\ufffdw\u0003\ufffdw#\ufffdM\u001f5\ufffd\u0015D\ufffd\ufffd\u0015D\ufffd\ufffd\u0015D[\ufffd\n\ufffd\ufffd\ufffd\n\ufffd\ufffd\ufffd\ufffd''\ufffd\u000b\ufffd\u0001\ufffd\ufffd\u0012\ufffd.\ufffd\u0006\ufffdu\ufffd\ufffdy\ufffd{\ufffdy\ufffd;\ufffdv\u000fB\ufffd\ufffd\ufffdg\ufffd\u0154\ufffdoM\ufffd\ufffd\u007f\ufffd\u0018\ufffd\ufffdtd\ufffdu\ufffdz@=\ufffd\ufffd\ufffd\u001eb<\u0005\ufffd\u001eQ\ufffd\ufffd\u001eU?\u0004\ufffdv\u0003C\u007f\ufffd\u001c\u000b\f\ufffd\ufffd\ufffdy\u0007c'p\ufffd^\ufffdd\u0357\ufffd\u0000x\ufffd\u007f\r\ufffd\u007f\ufffd};\ufffd\r\u0581\ufffd\ufffd\ufffdp\bN\u0004\u00bb\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0007&\ufffd)\ufffd$\ufffdT\ufffd\ufffd\u00142\ufffdL9\ufffdQ\ufffd|S\ufffdi\ufffd\ufffd\ufffd4\ufffd4\ufffdTn\ufffd4U\ufffdjMsMq\ufffd|S\ufffdi\ufffdi\ufffdi\ufffdi\ufffdi\ufffdi\ufffdi\ufffdi\ufffdi\ufffdi\ufffd\ufffd\ufffdt\ufffdt\ufffd\ufffdn:k\ufffd`\ufffdh\ufffd2\ufffd\ufffd\u0005\ufffd\ufffdl5\ufffd\ufffdns\ufffd\u001c5\u000f7\ufffd4\ufffd6\u0017\ufffd\u01daK\ufffd\u0013\u0313\ufffdS\ufffd3\ufffd3\ufffd5\ufffd9\ufffdzs\ufffd\ufffd\u027c\u043c\u013c\ufffd\ufffdb^c^o\ufffdd\ufffdj\ufffda\ufffdc>h>l>f>i>m>g\ufffd0_2_\ufffd\u0010\ufffd\u0592n\u0011-\ufffd\ufffdk\tY\ufffdYFXr-\ufffd\ufffd\""\ufffd8K\ufffde\ufffde\ufffd\ufffd\ufffdRi\ufffd\ufffd\ufffdZ\ufffdZ\ufffd\ufffd\ufffdf\ufffdb\ufffd2\ufffdJ\ufffdj\ufffd:\ufffdF\ufffd\u0016\ufffdv\ufffd.\ufffd~K\ufffd\ufffd\u5125\ufffdr\ufffdr\ufffdr\ufffd\ufffde\ufffd\nV\ufffd\ufffdj\ufffd[\ufffd\u05a05j\u001dn\u001di\u001dm-\ufffd\ufffd\ufffd\ufffdX'X'[\ufffdZgXgZk\ufffds\ufffd\ufffd\ufffd\u0006k\ufffdu\ufffdu\ufffdu\ufffd\ufffd\u017a\u01ba\u07ba\u027a\u057a\u00fa\ufffdz\ufffdz\ufffdz\ufffdz\ufffdz\ufffdz\ufffd\ufffda\ufffdd\ufffdb#6\ufffd\ufffdl\ufffdm.\ufffd\ufffd\u0016\ufffd\r\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdmE\ufffdq\ufffdR\ufffd$\ufffd\u0014[\ufffd\ufffd\ufffdVm\ufffd\ufffd\u0375\ufffdm\ufffdm\u0376\u0176e\ufffd\ufffd\ufffd\u0576u\ufffd\ufffd\ufffd-\ufffd\ufffd\ufffd]\ufffd\ufffd\ufffd6\ufffdQ\ufffd\t[\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd#\n\ufffdA\ufffd\ufffdv\ufffd-\u0006\u01688\\\u001c)\ufffd\u0016\u000b\u0131b\ufffd8A\ufffd,N\u0015g\ufffd3\ufffd\u001a\ufffdk\ufffd\ufffd^\ufffdI\\(.\u0011\ufffd\ufffd-\ufffd\u001aq\ufffd\ufffdI\ufffd*\ufffd\u0010\ufffd\ufffd\u0007\ufffd\ufffd\ufffd1\ufffdxZ<'v\ufffd\ufffd\ufffd+\u0012\ufffd\ufffdR\ufffd$J*\ufffdBRL\u0291F\ufffd\ufffd\ufffdP*\ufffd\ufffd\u00ee\ufffd\u000ex\u0006VHU\ufffd,\ufffdN\ufffd'5J\u000b,\u001b\ufffdE\ufffdRi\ufffd\ufffdJZ\u000b\ufffd*\ufffd6H\ufffd\ufffdmRBj\ufffd\u000eIG\ufffd\ufffd\ufffd)\ufffdt^\ufffd(uI=\ufffd \u001bdQVe/\ufffd<&\ufffd\u0223\ufffd<\ufffdH\u001e'\ufffd\u0293\ufffd)r\ufffd\\)W\u02f5\ufffd\ufffd\u0006\ufffdI^(/\ufffd\ufffd\ufffd-\ufffd\u001ay\ufffd\ufffdI\ufffd*\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffdi\ufffd\ufffd\ufffd!_\ufffd\ufffd\ufffd\ufffd\ufffd)fEV\\JP\ufffd*\u00d5\ufffd\ufffdh\ufffd@\u0019\ufffd\ufffd(\u0013\ufffd;\ufffd2\ufffdB\ufffdRf)u\ufffd<\ufffdQiV\u0016+\ufffd@'V+\ub50d\ufffd\u0016e\ufffd\ufffdK\u066f\ufffd\ufffd^\ufffd\ufffd\u04ae\ufffdU.(\u0017\ufffd.\ufffd\ufffd.\ufffd\rv\u046e\u06bd\ufffd\ufffd=f\u001fa\u03f5\ufffd\u06cb\ufffd\ufffd\ufffd\ufffdI\ufffd)\ufffd\u0019\ufffd\ufffd\ufffd\u001a\ufffd\u001c{\ufffd\ufffd\ufffd\ufffdd_h_b_a_e_k\ufffd`\ufffdl\ufffdfO\ufffd[\ufffd\ufffdG\ufffd\ufffd\ufffd\ufffd\ufffdg\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdn\u0007\ufffd\ufffd9\ufffd\u000e\ufffd\ufffd\ufffd\b;\ufffd;F9\ufffd\u001dE\ufffdq\ufffdR\ufffd$\ufffd\u0014G\ufffd\ufffd\ufffdQ\r\ufffd\ufffd\ufffd;\ufffd;\ufffd\u001d\ufffd\u001d\ufffd\u001c+\u001d\ufffd\u193d\u0471\u0171\u0771\ufffdq\ufffdq\ufffdq\ufffd\ufffd\ufffd8\ufffd\ufffd\ufffd\ufffdr\ufffd\ufffd\ufffdjP\ufffd\ufffd]u\ufffd\ufffd\rSG\ufffd\ufffd\ufffdqE\ufffd8\ufffdT\ufffd\ufffdNQ\ufffd\ufffdJ\ufffdF\ufffd\ufffd\u05ab\rj\ufffd\ufffdH]\n\u06b7J]\u000b\ufffd\ufffd\u0019\u0014/\u0001Z\u05e6\u001eSO\ufffdg\ufffd\u000b\ufffdE\ufffdK\ufffdqj\ufffd\ufffdN\u0469:\ufffd\u03a83\ufffd9\u0299\ufffd,t\u0016;\ufffd;'\ufffd\u0595;g\u00aem\ufffd\ufffd\ufffd\ufffd\ufffdlr.t.q.w\ufffd8\ufffd8\ufffd;79\ufffd:w8[\ufffdm\ufffdc\ufffdS\u03b3\ufffd\u000e\ufffd%\ufffd\u0015\u0017qi]\ufffd.\u0011\ufffd\ufffd^W\ufffd\u0015s\ufffdF\ufffd\ufffd\\\ufffd\ufffdb\ufffdx\ufffdD\ufffd\u001d\ufffd2W\ufffd\ufffd\ufffd5\ufffd5\ufffd\ufffd\ufffdjr-r-u\ufffdp\ufffdr\ufffdumpmvm\ufffd}U\ufffd\ufffd\ufffdu\ufffdu\ufffdu\ufffdu\ufffd\ufffd\ufffd\u4e92A2\ufffd\u0019\ufffd\u0019b\ufffd\ufffd\ufffd\ufffd\bg\f\ufffd\u0018\ufffd\ufffd\ufffdQ\ufffd1\u0016\ufffdkB\ufffd\u4329\u001932ff\ufffdd\ufffd\u0258\ufffd1?ca\ufffd\u048c\u0015\u0019\ufffd2\ufffdfl\ufffd\u0612\ufffd=cW\ufffd\ufffd\ufffd\ufffd\u0019\ufffd3Ne\ufffd\ufffd8\ufffd\u0459q9\ufffd\ufffd\u0379\rn\u046d\ufffd\ufffd\ufffd;\ufffd\ufffdq\ufffdr\ufffd\u000b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd;\ufffde\ufffd\nw\ufffd{\ufffd\ufffd\ufffd=\ufffd\ufffd\ufffd^\ufffd^\ufffd^\ufffdnq\ufffduotou'\u072d\ufffdC\ufffd#\ufffd\ufffd\ufffdS\ufffd3\ufffd\ufffd\ufffdN\ufffdew\ufffd\ufffd\ufffd\ufffd\u03a7\ufffd}\ufffd\ufffd\ufffd\ufffd\ufffd\u00bea\ufffd\u0011\ufffd\\_\ufffd\ufffdH\ufffd\u00d8\ufffd\u001b\ufffd+\ufffdM\ufffdM\ufffd\ufffd*}\u057eZ\ufffd\\_\ufffd7\ufffd\ufffd\ufffd[\ufffd[\ufffdk\ufffd\ufffdm\ufffdm\ufffd%|\ufffd}\ufffd}\ufffd}\ufffd|g|\ufffd}\ufffd\ufffd\u02fen?\ufffd\ufffd\ufffd\ufffd~\ufffd\ufffd\ufffd\ufffd\ufffda\ufffd0\ufffd\b\u007f\ufffd?\ufffd_\ufffd\u001f\ufffd/\ufffdO\ufffdO\ufffd\ufffd+\ufffd\ufffd\ufffdZ\ufffd\\\u007f\ufffd\u007f\ufffd\u007f\ufffd\u007f\ufffd\u007f\ufffd\u007f\ufffd\u007f\ufffd\u007f\ufffd?\ufffdo\ufffd\u001f\ufffd\u001f\ufffd\u001f\ufffd\ufffd\ufffd\ufffd\ufffdw\ufffd/\ufffd\ufffd\u0003\\@\u00170\u0007\ufffd+\ufffd\u000f\ufffd\u0003\ufffd\u0002#\u0002\ufffd\ufffd\ufffd@Q`\\\ufffd40)0%P\u001e\ufffd\fT\u0007j\u0003s\u0003\ufffd\ufffd\ufffd@s`q`Y`e`u`]`c`K`{`W`\u007f\ufffd-p4p\""p:p>p1p%\ufffd\u0005\rA1\ufffd\n\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd`n0?X\u0014\u001c\u0017,\rN\nN\t\ufffd\u0007+\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd`<8?\ufffd\u001c\\\u001c\\\u0016\\\u0019\\\u0013\ufffd\u0010\ufffd\u0012\ufffd\u0011l\r\ufffd\u0005\ufffd\u0005O\u0005\ufffd\u0006;\ufffd\ufffd\ufffd\u0759\\\ufffd.\u04dc)g\ufffd2\ufffd\ufffd\ufffd\ufffda\ufffd#2s3\ufffd3\ufffd2\ufffde\ufffdfN\u029c\ufffdY\ufffdY\ufffdY\ufffdY\ufffd973\ufffd9?\ufffd9sq\ufffd\u0315\ufffd\ufffd3\ufffden\ufffd\u0712\ufffd=sW\ufffd\ufffd\u0336\u0323\ufffd'2\ufffd3\ufffdf^\u023c\ufffd\u0655\ufffd\u0013\u0012B\ufffd\ufffd5d\u000f\ufffdC\ufffdP44<424:T\u0010\u001a\u001b*\tM\bM\u000eM\r\ufffd\b\ufffd\f\u0544\ufffd\ufffdC\r\ufffd\ufffd\ufffd\ufffd\u0412\ufffd\ufffdPKhMh}hShkhGhO\ufffd`\ufffdp\ufffdX\ufffdd\ufffdt\ufffd\\\ufffd#t9\u0513\ufffd\ufffd2g\u0673\ufffdY\ufffd\ufffdY\ufffd\ufffd\ufffd\ufffdf\ufffddM\u021a\ufffd55kF\ufffd\u032c\ufffd\ufffd9Y\ufffdY\rYMY\u000b\ufffd\ufffdd-\ufffdZ\ufffd\ufffd.kS\u05b6\ufffd]Y\u0007\ufffd\ufffdd\ufffd\ufffdj\ufffd:\ufffdu!\ufffdbVWVOX\b\u001b\ufffd\u05b0=\ufffd\u000e\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdpAxl\ufffd$\ufffd\u0019\ufffd\u001c\ufffdrQ]\ufffd\u001c\ufffd\ufffd\ufffd\ufffd?\u001a\ufffd\u000e\ufffd\ufffd\ufffd\ufffdG\ufffdF\ufffdG'E\ufffdF+\ufffdU\ufffdY\u047a\ufffdhctAt\ufffdoqtitetMtCtKtG\ufffd5\ufffd\u0016=\u0016=\u0019=\u001d=\u0017\ufffd^\ufffd^\ufffd&\ufffd\ufffdlm\ufffd9\u06de\ufffd\ufffd\u000eg\u000f\ufffd\u001e\ufffd\ufffd\ufffd=6\ufffd${B\ufffd\ufffd\ufffd\ufffd3\ufffdgf\ufffd\u0004\ufffdf\ufffd\u025e\ufffd=?{a\ufffd\ufffd\ufffd\ufffdk\ufffd7do\ufffd\u079e\ufffd+{\u007fv[\ufffd\ufffd\ufffd\u0013\ufffd\ufffd\ufffdg\ufffd/d_\ufffd\ufffd\ufffd\ufffd\t1C\ufffd\u001a\ufffd\ufffd\u0731`,\u001a\u001b\u001e\u001b\u0019\u001b\u001d+\ufffd\ufffd\ufffd\ufffd\ufffd&\ufffd&\u01e6\ufffdf\ufffdf\ufffdjbsb\ufffd\ufffd\ufffdXSlalIly\ufffd%\ufffd&\ufffd>\ufffd)\ufffd5\ufffd#\ufffd'v0v8v,v2v:v.\ufffd\u0011\ufffd\u0014\ufffdr\r\ufffdF{M\ufffd5\""\ufffd\u061e\ufffdO\ufffd\t~\ufffdD\ufffd\u007f{\u028c\u07cd\ufffd\ufffd\ufffd$\ufffd8H\u0001\ufffd\u0011q\ufffdq\ufffd\ufffd\ufffd\ufffdx\b\u0011r3\ufffdB\ufffdd*\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd|\u0017\ufffd~\ufffd\ufffd\ufffdoc\ufffd\u0007\ufffd#P\ufffd\ufffd%2\ufffd\ufffd%\ufffd\u025dd#y\u0003\u02bdI\ufffd&\ufffd\ufffd\u001d\ufffd\ufffd\ufffdG\u000e\ufffd\ufffd\ufffd\ufffd\u001c\ufffd0\ufffd\ufffdAx\ufffd|@\ufffd\ufffd:r\ufffd\ufffd\u000b\ufffd'\u007f\ufffd\ufffdH>!g\ufffd\ufffd\ufffd\u001c\ufffd_\ufffd\u000b\u0010\ufffdI\u0007\ufffd\f\ufffd.\u0291\ufffd\ufffdO\ufffd\ufffdEz\r\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u022b\ufffd;t4\ufffdH\ufffdh\u0001\ufffdJ\u000b\ufffdM\ufffdmZB\u01d3\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0016:\ufffd\u001c\ufffde\ufffd\ufffd|H\ufffd\ufffd=\ufffd\u0018\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0007\ufffd_\ufffdC\ufffdQr\ufffd\ufffd\ufffdr\ufffd\ufffd\ufffd\ufffda\u007f}\ufffd\ufffd\ufffd\ufffdN.s\ufffd\\#\ufffd\ufffd2n\u00195p\ufffdr\ufffdR#\ufffd\ufffd{\ufffd\ufffdsopoP3\ufffd&\ufffd\ufffdZ\ufffd\u001d\ufffd\u000ej\ufffd\u000eq\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd+\ufffd\ufffds\u073fQ\ufffd\ufffdw\ufffd\u07e9\ufffd\ufffd\u000f\ufffd\ufffd:\ufffd\ufffd\ufffdE\ufffd\ufffd)O\ufffd\ufffdWy\ufffdf\ufffd\u001e\ufffdK\u077c\ufffd\ufffdS/\u001f\ufffd3\ufffd\ufffd\ufffd\ufffd\u0011\u001a\ufffd\ufffd\ufffdj\u001ad;+z\ufffd\ufffdAS\ufffd\ufffd\ufffds\u0017\ufffd\ufffdT:\ufffdKp\ufffdH\ufffd.\ufffd\ufffd\ufffd\u001c\ufffd\b\ufffd\ufffd{\ufffd\ufffd\ufffd\ufffd\ufffdW\ufffd\u0015\ufffd\u0016\u0007\ufffd;xG\ufffd\ufffdvD\u001d3\u0005\ufffd\ufffd\ufffdQ/Lw\ufffds,\u0014j\u001d\ufffd\u001c-\ufffd\ufffdU\ufffdW\ufffd\ufffd\ufffd\ufffd9!\ufffdt|\ufffd8-\ufffd\ufffd8\ufffd8#\ufffd\b\ufffd\ufffds\ufffd*\ufffdy\ufffd\u0005\ufffd%G\ufffd\ufffdsa\ufffd\ufffdo\ufffd\ufffd\t\u001bT\ufffd\ufffd\u0011^U\ufffd\u0530\ufffdQ\ufffd\ufffdQa\ufffd\u001aS\ufffd\t\u007fT\ufffd\ufffd9\ufffd\u0016\ufffd\u001b}OxS\ufffd^\ufffd^x\u0007\ufffdE\ufffdBB\ufffdW\ufffd)\ufffdT\ufffd\ufffd*a\ufffdZ\ufffd\ufffd\b{\ufffdYj\ufffd\ufffd\u000f\ufffdK\ufffd\u0014\u000e\ufffd\u000f\ufffd\u000f\u000b\ufffd\ufffd]\u0002}\r\ufffdu\ufffd7\u0011w!\ufffd\""\u001eDlC<\u0002\ufffd>@,\u001bE\u0526\ufffdM\u0137\u0011O\ufffd\ufffd\u0018\ufffd\ufffd:\ufffd\ufffd\ufffd2:,\ufffdK\ufffd\ufffd\""\u001eDlCd\ufffd\fX\u0180)\ufffdT\ufffd_\u0000\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdZz*e\u0017b+\ufffdA\ufffd6DV\u05c4e\ufffdh\ufffd\ufffd\ufffd,xo\ufffd{\u001b\ufffd\u0106\u0016l\ufffd.\ufffd}\u0011sE\ufffd+b\ufffd\ufffd\ufffdE\ufffd/\ufffd}\ufffd\u001e\u0003\ufffd\u000bK*)|\u001b\ufffd\u0671c\ufffd\u001d-\ufffd1\u074e\ufffd\u000e\ufffdw\u0f4am\ufffdXR\u0152*\ufffd\ufffdb[*\ufffd\ufffdb[*x\ufffd!k\u0445\ufffd\\X\u02c5\ufffd\\X\u078d\ufffdnLwc\ufffd\u001b\ufffd=\ufffd\ufffd\ufffdv=\ufffd\ufffd\ufffdF\ufffd\u0348[\u0011w\""\ufffdE<\ufffd\ufffd\u001e\ufffd\u00070\u06c0X\ufffde\ufffd\ufffdS\ufffd\u0015q;\ufffd\u01c0O\ufffd\ufffd'0\ufffd\t\ufffd}\u0002s\ufffd@\ufffdO\ufffd\ufffd'\ufffd\ufffd\u0013X\ufffdI,\ufffd$\ufffd<\ufffdJi\u0007\\\ufffd}\u07c7\ufffd\ufffd\ufffd\ufffd}Xr\u001f\ufffdq\u001fZ\u06c7\ufffd\ufffd\ufffd\ufffd\ufffdt\ufffd\ufffd5zt!\ufffdu!\ufffd/\u00ba\ufffd\ufffd\u000f\ufffd\ufffd\ufffd\""L\u007f\u001a-?\ufffd\ufffdOc\u07671\ufffdi\ufffd\ufffd4Z~\u001a{\ufffd4\ufffd\u0010\ufffd\u0014\ufffd\\\ufffd\ufffd\ufffd\ufffd\ufffd3\ufffd\ufffd\fZx\u0006\u04df\ufffd\ufffd\ufffd\ufffd\ufffdb+\ufffdb\ufffdg\ufffd\u0333\ufffd\u02b3\ufffd\u02b3\ufffd\u02b3\ufffd\u02b3\ufffdc\ufffd\ufffd\ufffd\ufffd\ufffdsX\ufffd9\ufffd\ufffd\u001c\ufffd\u007f\u001e\u04df\ufffd\ufffd\ufffd1\ufffdyL_\ufffd)+\ufffd\ufffd\u0015\u0307T\ufffdJ\u0002nF\u070a\ufffd\u0013q/\ufffd\u0001\ufffd\ufffd\u0010an\u0019b\ufffd\u0018\ufffd.\ufffd[\u0011\ufffd#2\ufffdz\ufffd7\ufffdm\u0003\ufffd1`\u0019C*}/\ufffd\u0001\ufffd\ufffd\u0010Y-\ufffd\u0019\ufffd\ufffd\u0010\ufffd)\ufffd\u001bj\ufffdt3Z3\ufffd5s*e'\ufffd^\ufffd\u0003\ufffd\ufffd!\ufffd\ufffd\u0016,cE\u000b6\ufffd\ufffd\ufffd\ufffd\u0012\ufffdK\ufffd\u0013\t-H\ufffd.\ufffd}\u0019se\ufffd+c\ufffd\ufffd\ufffde\ufffd/\ufffd}\ufffd\ufffd\ufffd\u078d%\u001d)\u070e\ufffd\uca18\ufffd\ufffd\u0005\u0015\ufffdULw\ufffd\u0013\ufffd]\u0616\u000bK\ufffd\ufffd\ufffd\u000b\ufffdra[.l\u02c5m\ufffd\ufffdl\u0003\ufffd\u0016\ufffdX\u02cd\ufffd\ufffdX\u02cd\u5f58\ufffd\ufffdt/\ufffd{1\u0747)>l\ufffd\ufffd|\u0085\u0018\u00f9k\u0011\ufffd\ufffd\ufffd+\u0001\ufffd\ufffd\ufffd\u05b5\u0701\u0641\ufffd]\ufffd}\ufffd\ufffd0\\G6\ufffdm\ufffd\ufffd\ufffd00\ufffd\f \ufffd:\ufffd\""\u0220\ufffde\ufffd\u0010\u0018\u0c83\ufffd0\ufffd\ufffd \ufffd\u0011|/\ufffd[^4\u0018\t\ufffd:\u0003.1&b\u0010\ufffd\u0006\u0015\u0001\u0015\u0014E\u0011\u0017\u07a9\ufffd\u000b\u0014$\ufffd\ufffd{/\ufffd^\u0797\ufffd?\ufffd:\ufffd\ufffd\ufffd\ufffdW\u056ds\ufffd\ufffdv\ufffd+f\u0011v\u0002\ufffd\u0001\ufffd\u0005\u0001j\r$\ufffd!,DMQ\ufffd\ufffd/B}1jJ\ufffd\ufffd\ufffd8\ufffd,@\ufffd\u001c\u0005\ufffd<@\ufffd$ \ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffdX\ufffdw\""B\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdY\ufffd\ufffd\u000f\ufffd\ufffd\u000b\ufffd)\ufffd\u001e\ufffdHTi\ufffd\ufffdZ\ufffd\u000b\ufffd_B\ufffd~\ufffdF2\ufffd\ufffdZ\ufffd\u023a\ufffd\ufffdd\ufffd\ufffd\u0014\ufffdI\ufffdgY(<\u001b8\u00168\u000e8\u00018\u00118\u00191\ufffd\u0019\ufffdj*p:p&p\u0016\u03bf\ufffd\ufffd\ufffd\u0006\ufffd\ufffdd\ufffd\ufffd\ufffd\u0418\f\ufffd\ufffd\u0418\f\ufffd\ufffdFc:\u06a6C\u000e\u001b\u001c\u000b\u001c\u0007\ufffd\u0000\ufffd\b\ufffd\ufffd\ufffdA\ufffd\ufffd&=\u001e\ufffdOj\ufffd=H\ufffd\u0001Y\ufffd\ufffd\f\ufffd\ufffdG\ufffd\ufffdQ\ufffd|\ufffd\ufffd\uc02c\ufffdd\u0019\u001c\ufffd=_{<\u000353\ufffdc\ufffd\ufffd\ufffd\ufffd\ufffd\u0004p\u0012v\ufffd-\ufffd\ufffd\u0014\ufffd4\ufffd\f\ufffd}8\ufffd\u0012\ufffd\ufffd68\u0006;\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\u0004Pk\ufffdm4V\ufffd\ufffd|\ufffdK\f\ufffd\u0001\ufffd\u0003\ufffd\u0003\u0013@\ufffdoI\ufffd/\ufffd\u0007=\ufffd\ufffdOh\ufffd=H\ufffd\u000eY\ufffdXiP\ufffd\u001fD\u02c3hy\ufffd\ufffdl\ufffd\ufffd\u06ec58\u0006\ufffd$v?]C8\u0006X\u000e\u001c\u000fL\u0000'a'\ufffdbZM\u0001N\u0003\ufffd\u0000\u0787\ufffd\u0018\u000f\ufffdjp\f\ufffd\ufffd\ufffd\u02c1\ufffd\t\ufffd\u0598j4f\ufffdm&d\ufffd\ufffd\u0018`9p<0\u0001\ufffd\ufffd\uc81f\ufffd5K\ufffd'4\ufffd\u001e$o\ufffd\ufffdu\ufffd\u0006u}\nZ\ufffd\ufffde\ufffd\ufffd\ufffd\u000eY\ufffd\ufffdcp\fv\u0012=\ufffd!d\u0003\ufffd\ufffd0\ufffd#\ufffd:\ufffd#(\ufffd2\ufffd\ufffd'\ufffd\u001d\t\u0387\ufffd\u001b\ufffdN\u001a\u0002S\ufffd!S\ufffd\ufffdA\ufffdXsQ\ufffdjr,\ufffdV\f\ufffd\ufffd\ufffd=\ufffd\ufffd!\ufffdCN\ufffd\u001c\ufffd\u001c\ufffd\ufffd +\ufffd\u001ed\u000fr\u001a4\ufffd}|\ufffd\u0002o(C3yYP\u001b\ufffd\ufffd\u0015d\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd$a]$\ufffd\ufffd\b\ufffd\u00b7\ufffdA\ufffd\ufffd\ufffd\uaa2f\ufffd\ufffd]=\ufffd\u000b\ufffd\ufffd}`\ufffdKd\ufffdT\ufffd\ufffd\ufffd\u0018nE^\ufffdb\ufffd\ufffd}\ufffdL\ufffdi\u0415\ufffd\ufffd+-\ufffdct:\ufffd\ufffd:?\ufffd\ufffd\ufffd\u0000\ufffd*\u0013\u0016k\ufffd,)+\u0747\ufffd\u001aA\u001d,\ufffdD\u06da\ufffd[\u0013gkA\ufffd\u0015\ufffdhY\u000b\ufffd\ufffd\u0011x\u0294{P\u0006\ufffd\ufffd\ufffd\ufffdA\ufffd[\u0005\b\ufffd\ufffd\ufffd]A\ufffd\ufffd3\u000e\u0390\f\ufffd\ufffd\ufffdmP\u00aa\ufffd6n \ufffd\ufffd\u000b_\ufffd\ufffd6`%p\u0017\ufffd\ufffd\u000e\ufffd\ufffd\ufffda4\""\u0619\""\ufffd\ufffdC\u000bV0\ufffd\r\ufffd\ufffd\ufffda\ufffd\u001cE\u0006\u0018\ufffd\ufffd(l\ufffd@\ufffdS\t\\\u0002\\I(u6E\ufffd5(\u007fe\ufffds\ufffdO`\u000f\ufffdK\u0011#(u\ufffd\ufffd\b\ufffd\u0430P\ufffd$\ufffd\ufffd\ufffdQO\ufffd\u001a\ufffd$\ufffd\ufffdl\ufffd7\""G\u000e\ufffd\u001c\ufffd\ufffd\ufffd\ufffd \u03c6\\\t\ufffd\u0012\ufffd\u0012\ufffdK /\ufffd\ufffd\f\ufffdJ\ufffd+!\ufffd\u00ea\ufffdA>\ufffd\ufffd.\ufffdN\ufffdk\u0006\ufffd\u0007\ufffdim\ufffd}c\ufffd\ufffd\ufffd\b\ufffd\ufffd\b<\n\ufffdf\ufffdf\u0016jfa\ufffd\ufffd\ufffdXSv\r\ufffd\ufffdD\ufffd\ufffd9\ufffd\ufffdg\ufffd\u001e\ufffd,s\ufffd\u001eY\ufffd\n\ufffdw.l\u0303\ufffdy\u0018\ufffdyX\ufffd\ufffd1{\ufffdX\ufffd\ufffd\u0018Q=Jz\ufffd,D\u06c5\ufffd\ufffd\b\ufffdc\ufffdY9\ufffd\ufffd:\u062b@\ufffd\n\ufffdt\u0005z,\ufffd\ufffd8\ufffd\ufffdr1\ufffd\ufffd\ufffd\u007fe\ufffd\ufffd(\ufffd0c\u0012\ufffd\ufffd\u0520\ufffd,@X%\ufffd\u0018a\ufffdk9\ufffd,\ufffd\u0019\ufffd\ufffd1\ufffd\ufffd\ufffd7\u026d\ufffd\ufffd\u0015\ufffd\ufffd\u0002\ufffdW\ufffd\u01d5X\ufffd+\ufffdt%|Yi|Y\ufffd\ufffd\""\ufffd*\uc42b\ufffds5\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\u001a\ufffd\ufffdky\u001d2\ufffdu8\ufffd\u000e6\ufffd\u0005\ufffd\ufffdf5\ufffd\ufffd\ufffd\ufffd\u0019\ufffd\ufffd\t\ufffd\ufffd\u0477\ufffdh\ufffdh\ufffd\u0015\ufffd\ufffdV\ufffd[\ufffd\u0013\ufffd\ufffd\ufffd\u0019\ufffd\u001e\t\ufffdK\ufffd\ufffd\ufffds\ufffdO \n\u0005\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\u022b\ufffd\""7&T\ufffdt\ufffd}\u00065\ufffd&7\ufffd5\ufffd^\ufffd\ufffd\ufffd\ufffd\ufffd\u00049\u0015r&\ufffdL\ufffd6d\u001b\ufffd\u000b\u0645\ufffdC\ufffd!g@s5=\ufffd:\ufffd\ufffd7v\ufffd\ufffd\ufffd\fj\u0003\ufffd\ufffd\u0004W\u001bz-\ufffd\ufffd\ufffd\ufffd\ufffdr\ucd3c9|K\t\ufffd/P\ufffd\ufffd\ufffd\u0014d\ufffd)zn\ufffd5\u0005X\ufffd\u0006\ufffd<\ufffd\u0005\ufffd\ufffdSW\""\ufffdN3\ufffd\u0015{\u16563\ufffd+\u0003\u0019sF\b\ufffd\u0012zE\ufffd\ufffd\n\ufffd\u0019 Z\u0544E\ufffd\ufffdJ\ufffdzm\ufffdZA\u001d,\ufffd\ufffd6\f\ufffd\ufffd\ufffdh,\ufffdl\u00052ZZ\ufffd\ufffd\u000eV\u0011\ufffd\ufffd(\ufffd0#\ufffd+\ufffd\ufffd\ufffdI\ufffd\ufffd\u001b \ufffd\ufffd|/ta/\ufffd+\u000b}\ufffd\ufffd\u0019/X\u047a\u000e-\""8\u0017\td\ufffd\ufffd\ufffdG_\ufffdh\ufffdJ\ufffd.\ufffd\ufffd\ufffd\u0017?X\u047c6\ufffd\ufffd\ufffd\ufffd\u0005-\ufffd\u0018y\u0014r\ufffd\\s\u001c\ufffdU\ufffd\ufffd\u06a8\ufffd\ufffdua##\ufffd\ufffd6Y\ufffdv\ufffd\u0003\ufffd\ufffd\u0015]\ufffd[\ufffdf\ufffd\u0002\ufffdR\ufffd\u0006n\u0003>\u000f\ufffd\u0001\ufffd\u0002\ufffd\u0005\ufffd\u0003\ufffd\u0002\ufffd\u0006\ufffdU\ufffd\ufffdK\b_\ufffd\u0018:\u0224F\ufffd\u0017\ufffd\ufffdL\ufffd\ufffd)w\ufffdr\ufffd)w\ufffdr\ufffd)I\ufffd\ufffd\ufffd\ufffd!\ufffd\u0006|\u001e\ufffd\u0003\ufffd\u0005\ufffd\u000b\ufffd\u0007\ufffd\ufffd\u0246\ufffd\ufffd\ufffd>\u001b\ufffdg\ufffd\ufffdl\ufffd\ufffd\r\ufffd\ufffd\ufffdq6<\ufffd\ufffd}\f\ufffdch\u001f\u0003\ufffd\u0018z\ufffd\ufffd+\ufffd^1\u83e1o,\ufffd\u000b\ufffd1\ufffd0f\u0018\ufffd\f\u00d8a\u00183\fc\ufffda\ufffd0\ufffd\u0019\ufffd-\ufffd\ufffd\u0005\u0018\ufffd\u0000\ufffd\u0016`\ufffd\u0002\f[\ufffda\u000b0l\u0001\u000fr\ufffdq\u000e<\u0381\ufffd9\ufffd8\u0007\u001e\ufffd\ufffd\ufffd\u001cx\ufffdc\ufffd\ufffd\u0006\ufffd\u0015\u05d9\ufffd\ufffdz~\u001aCOc\ufffdi\f=\ufffd\ufffd\ufffd144\ufffd\ufffd\ufffd\ufffd\ufffd\u0018}\ufffd\ufffdl3\ufffd\ufffd\ufffd\ufffdj\ufffd\ufffdfh\ufffd\f-\ufffd\ufffdJ3X\u0245\ufffd\\X\u0245\ufffd\\x\ufffd\u000b=\ufffd\u0413\u000b=\ufffd\u0413\u000b=\ufffd\u0413\ufffd\ufffd\ufffd5\ufffdk\ufffd7\u05cco\ufffd\u0019\ufffd\\3\ufffd\ufffdf|s\ufffd\ufffd\ufffd\ufffdc|\ufffd\u0018\ufffd8\ufffd7\ufffd\ufffdc|\ufffd\u0018\ufffd8\ufffd7\u000e\u000f:\ufffd\u001e\u04e8\u007f_M\ufffd\u001cp;\ufffd\u001f\ufffd\ufffd\u0013\ufffd\u001bX\t|\u0006\ufffd,\ufffd\ufffd\ufffdNz\ufffd |\t5\ufffd\u0003\ufffd\fJ\ufffd[S>g\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdNS\ufffd6e\ufffd)\ufffd1\u5ce6\ufffd\u0001*\ufffd\u0203\ufffdy\ufffd5\u000f\ufffd\ufffd\ufffd\ufffd\u0014\ufffd\ufffd\u0002\ufffdP\u0000\u001f\n\ufffdC\u0001|(\ufffd\u000f\u0005\ufffd@\ufffdv\ufffdp\u001f\ufffd\u0005\ufffd3\ufffdg\ufffd\u000b:1\ufffd\u0005\u0018\ufffdB\ufffd/\ufffd\ufffdB\ufffd/\ufffd\ufffdBh.\ufffd\ufffdBh(\ufffd\ufffd~h\ufffd\u000fm\ufffd \u0017\ufffdo\u0011\ufffd\u0016\ufffd\ufffd\ufffd\ufffd,4\u0014AC\u0011|+\ufffdoE\ufffd\b\ufffd\u0015As\u00114\u0017\ufffd\ufffd\""\ufffdV\u0004\u07ca\ufffd\ufffd\u0018\ufffd\ufffd\ufffd\ufffd\u0018\ufffd\ufffd\ufffd\ufffd\u0018\ufffd\ufffd\ufffd\ufffd\u0018\ufffd\ufffd\ufffd\ufffd\u0018\u068a\ufffd\ufffd\u0018\ufffd_l\ufffdS\ufffdYO\ufffdf=\u0015\ufffd\ufffdTl\ufffdS\ufffdYO\ufffdf=\u0015\ufffd\ufffdTl\ufffdS\ufffdYO\ufffdf=\ufffd\ufffd\ufffd\u0012\ufffdW\u0002\ufffdJ\ufffd_\t\ufffd+\ufffd\u007f%\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\u0012\ufffdW\u0002\ufffdJ\ufffd\ufffd\u0004lK\ufffd\ufffd\ufffd\ufffdZb|-1\ufffd\ufffd\u0018_K\ufffd\ufffd%\ufffd\ufffd\u0012\ufffdk\t|\u0015\ufffd\ufffd>\ufffdB\ufffdD\ufffd\u001cp;\ufffd\u001f\ufffd\ufffd\u0013\ufffd\u001b\ufffd}*\u0005\ufffdRp(\u0005\ufffdRx_\n\ufffdK\ufffd})\ufffd.\ufffd\ufffdq\ufffd\ufffd\ufffd}\u001c\ufffd\ufffd\ufffd\u001cG\ufffd8z\ufffd\ufffd+\u000e\ufffdq\udbf5\udefe\u0007\ufffd\ufffd\u07f8\ufffd\u00197<\ufffdg\ufffd\ufffd\ufffd\u001b\ufffdq\ufffd3nx\ufffd\r\ufffd\u0006\ufffd\ufffd\u0000<\u001b\ufffdg\u0003\ufffdl\u0000\ufffd\r\ufffd\ufffd\u0001x6\ufffd\u001fe\ufffd\f~\ufffd\ufffd\ufffd2\ufffd]\u0006\ufffd\ufffd\ufffdw\u0019\ufffd.\u000b\ufffdc\ufffd\ufffd\ufffdZ\ufffd\ufffd\u001e \ufffd\ufffd\ufffd\ufffd|\u0014\ufffd\ufffd\ufffd\ufffdy|)_\ufffd\u001f\ufffd?\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\r~\ufffd\u001f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdy^\ufffd_\ufffd\u007f\ufffd\ufffdP\ufffd'\ufffd4\ufffdM\u00165\ufffd'\ufffdEC\ufffd\\\ufffd\u0013]EO\ufffd_\u0014\ufffd!\ufffdT\ufffd-\u0189\ufffdb\ufffdX \ufffd\ufffd,1X\ufffd&\ufffd\u0014c\ufffdd\ufffdY$V\ufffd\ufffdb\ufffdxL<-\ufffd\ufffd=\ufffde\ufffd_\ufffd%\u000e\ufffd\ufffd\ufffd\u000b\u001a\ufffdj2S:\ufffd\ufffd\u0311\ufffdes\ufffd\ufffd\ufffd\f\ufffdti\ufffd,\ufffdi\""[\u024e2_\ufffd\ufffd\u0003\ufffdM\ufffdD\ufffd\ufffd\ufffdr\ufffd\ufffd)\u0017\ufffder\ufffd|X\ufffdB\ufffdJn\ufffd;d\ufffd|\ufffde\ufffd5\ufffd!\ufffd3\ufffdK\ufffd\u001b\ufffd\ufffd'_\ufffdo\ufffdC\ufffd<)\u03c4D(5\u0014\u000e\ufffd\ufffdX\ufffdq\ufffde\ufffdC(/\ufffd;4 4(4$t[\ufffd,BW}4V\ufffd#\ufffdP\ue27c\ufffd\ufffd2\ufffd\""\u02aa\ufffd\ufffdT\ufffd&\ufffdw(wG^A\ufffd'\ufffd{\ufffd\ufffd\ufffdWQVE\ufffdH\ufffd\u001ej\ufffd\u001a\ufffd\u0751\ufffd(\ufffdD^GY\u0019\ufffd\u0013\u02aa\ufffd\u001bTVR\ufffd\ufffd(wG\ufffdD\ufffd'\ufffdg\ufffd\ufffd\ufffd\ufffdPVE\u07a1\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd!\ufffd{\""\uf8ac\ufffd\ufffd\ufffd\ufffd*B\ufffd&\ufffd\ufffd\u0003\ufffd\b\ufffdt\ufffd\ufffd\u01e9\ufffd0\ufffd\ufffd\u0015\ufffd\ufffd\ufffd;b\ufffd\u001d5\ufffd\ufffd\u0019~\u001f\u001a~\u001f\u0019^\u001f\u001b^\ufffd\r\ufffdO\f\ufffdO\r\ufffd\ufffd\ufffd\ufffdg\ufffd\ufffd\ufffd\ufffd\u0017\ufffd\u05d7\ufffd\ufffdi\ufffd\ufffd+\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu6\ufffd\ufffd3\ufffd\ufffd}b\ufffd+r\u0002\ufffdN\ufffd\ufffd\u05da\ufffd/\u0002^\ufffd\fx\ufffd\ufffd\ufffd\ufffd\ufffd\u0014\ufffd\ufffd\u0005\ufffd\ufffd\u4017\ufffd\u0012\u031b\ufffd\u001a\ufffd\ufffd\ufffd\u0002~~z\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\u0001?\ufffdF\ufffd\u02ef\u0019\ufffd\ufffd\ufffd\u0001/\ufffd\nx\ufffdv\ufffd\ufffdW\u0001/\ufffd\tx\ufffd^\ufffd\u02cf\u0004\ufffd|?\ufffd\ufffd\ufffd6\ufffd\ufffd\u0002^>\u05fc\ufffd\ufffdz\ufffd\ufffdZ\ufffd\ufffd\ufffdW\u001d\u00eb\ufffd\ufffdmx\ufffd3\ufffdb\ufffdW\ufffd\ufffdu\ufffd\ufffdU\ufffd\ufffdj`x54\ufffd\u001a\u001b^W\u0018^M\ufffdy\ufffd4\ufffd\ufffd\u001a~\ufffd\f\ufffd\ufffd_\u000b\u00ef\ufffd\ufffd\ufffd\ufffd\ufffdjmx\ufffd1\ufffd\ufffd\u001a^\ufffd\f\ufffd(x]\u0006^\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffddxu6\ufffd\ufffd\u001a^W\u0019^y\ufffdW7\ufffd+\ufffd\ufffd\ufffdax\u0015\u0018^=\r\ufffd^\ufffdWo\u00eb\ufffd\ufffdUhx\ufffd5\ufffd\ufffd\ufffdy\ufffdo\ufffd]c\ufffd\r0\ufffd\ufffd\f\ufffd\ufffd\ufffd_{\ufffd\ufffd\u0002^\ufffd\ufffd\ufffdj=k\ufffd\ufffdL\ufffd|rR/\ufffd\ufffdE\ufffd\ufffdLdt\ufffd\ufffd\ufffd\ufffd5\ufffd\u001f\ufffdc\ufffdc~\ufffd\u007f\u037f\ufffdg\ufffd\u0014I\ufffd\ufffdH\u0015\u0019\""S\ufffd\u0012a\ufffd\ufffd#\ufffd\ufffdv\ufffdT\ufffd\ufffdq9\ufffdv\ufffd;\ufffd\ufffd.y\ufffd\ufffd\u0007\ufffd?\ufffdh9F\ufffd\ufffd\ufffdr\ufffd\u001c/'\ufffdDR\ufffd\ufffd\bYh\ufffd\u000f\ufffd\ufffd#~\ufffd\u007f\u017f\ufffd\ufffd\n!B\ufffd\ufffdH\u0011i\""]\u0520\ufffd\ufffd\u0012\ufffd\ufffd+\ufffd\ufffdny\ufffd\ufffdN^/\ufffd\ufffd\rr\ufffd\ufffd\ufffd\ufffd\u039b\ufffd`y\ufffd\u001c\""\ufffd\ufffd[\ufffd0\ufffdI\ufffd\ufffd\ufffd\ufffd\ufffdIu\ufffd\ufffdx\ufffdz\ufffd\ufffd\u0017d7a\ufffd\ufffdnx\ufffd\ufffd\u001f\ufffd\ufffd\u03d0xx\ufffd$x\ufffd\ufffd%\ufffd\ufffdfh\ufffdG\ufffd\u03b4\ufffdO\ufffd\ufffdL\u000bZ\u0005\u0014\ufffd~\ufffd\t\ufffd\ufffd\u000f\ufffd\ufffd\ufffdsm9Ke\ufffd\ufffdp\ufffd\u053e\ufffd\ufffdr/\u000bQ$\u000b\ufffd^%X}\ufffdTn\ufffd,\ufffd\ufffdnO%\ufffd\ufffd\ufffd\ufffd&|^\ufffdK\ufffd\ufffd^>b>?\u0012|\ufffd^9\ufffd\ufffd\\%W\ufffd\ufffd\u0014'\u0016\ufffdE\ufffdB.\ufffdK\ufffdRy?E\ufffd\ufffdr\ufffd\\ImBz\ufffd\ufffd\u001f\ufffdIP\ufffd\ufffd9K\ufffdO\ufffd'i6\u0005\ufffd\ufffdb\ufffd\ufffd\ufffdJv\ufffd\ufffdeO\ufffd[\u0016\ufffd~\ufffd\u001a\ufffdK\ufffdS\u05a2\ufffd\ufffdY\u02f3Vf\ufffd\ufffdZ\ufffdG@v\ufffd]e\u001eE\ufffd\u0002\u064b\ufffdX\ufffdK\ufffd\ufffd%\ufffd@\ufffd\u00ac\ufffd\ufffdeY+\ufffdVe\ufffd1\u001e\ufffd=4\ufffd\u0013\ufffds\u001eu!\ufffd\ufffd\ufffdG=\u0263\u00bfu\u0551G\ufffd\u0223\ufffd\ufffd\ufffdj\u0494L\ufffd\ufffd\ufffd\ufffd\u0217\ufffd\ufffd\""n\ufffdY\ufffd\ufffd\ufffdc\u0548M\ufffd%\ufffd\ufffd\ufffdY\u0016\ufffd\ufffd\ufffd\ufffd\ufffdZC\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\u001e\ufffd\ufffd\ufffd\ufffdM\ufffd\ufffd\ufffd6\ufffd\ufffd\u0589\u0005Y'\u001ed\ufffd\ufffd\ufffdu\ufffdB\ufffd\u0007\ufffd\ufffd\ufffd:\ufffdJ\ufffd\ufffd[\ufffd\ufffd\ufffd%\ufffdIm\ufffd*^\ufffdW\ufffd\ufffd<\ufffd\ufffd\ufffd4\ufffd\ufffd3x&\ufffd\ufffdk\ufffdZ<\ufffd-ns\ufffd\u001d\ufffdr\ufffdG\ufffd\ufffdk\ufffd,\u001e\ufffdux]\ufffd\ufffd\ufffdQ.v\u0019\ufffd\ufffd\ufffd\ufffd\ufffd\u0001o\ufffd\u001bQfv\u0005o\u00af\ufffdMy3\u079c\ufffd\ufffd<-\ufffd\ufffd\ufffdy\u001b\u0796\ufffd\ufffd\ufffd)k\ufffd\t\ufffd\ufffd;\ufffd\u03bc\u000b\ufffd\u02af\ufffd\u001c\ufffd\u001b\ufffd\ufffd\ufffdy\u000f^\ufffd{\ufffd^\ufffd\ufffd]\ufffd\ufffd\ufffdB\u0797\ufffd\ufffd\ufffd\ufffd5\ufffd\ufffd\u0015\ufffd\ufffdZ~\u001d\ufffd\ufffd\u0017\ufffd\u001b(\u06fb\ufffd\ufffd\ufffdo\ufffd\ufffd-|\b\u001fJ\ufffd\ufffd0^\u0087\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdLp$/\ufffdw\ufffd;\ufffd]\ufffdn~\u000f\ufffd\ufffd\ufffd\ufffd|\f\u001f\ufffd\ufffd\ufffd8>\ufffd\ufffd\ufffd\u0004\ufffd\ufffd'\ufffd\ufffd|\n\ufffd\u02a7Q\ufffd8\ufffd\ufffd\ufffdR6\ufffd)\ufffd\ufffd\ufffd\u0012%b8ez\ufffdS\ufffd7B\ufffd\ufffdHQ&\ue83c\ufffd.\ufffd\u0006\ufffd\u0011\ufffd\u013db\ufffd\u0018CY`9\ufffd\ufffd\ufffd\u0004\ufffd\u0010\u0013\ufffd$\ufffd\t\ufffdP\ufffd8ML\u00173\ufffdL1_\ufffd\u0016_\ufffd3\ufffdk\ufffd\ufffdV|'\ufffdRX\ufffdRHIy`\u0012e\ufffd\ufffde\ufffdL\ufffd\ufffd2\ufffd\ufffd\ufffd\f\ufffd\u0015k\u021a\ufffd\ufffd\fK\ufffdrDE\ufffd\ufffd+=\u0019\ufffd\ufffd\ufffdM\u0019c\ufffd\ufffd\u023a2[\ufffd\u04ff}\ufffd\ufffd\ufffdrY_6\ufffd\re#\ufffd-\ufffdP\ufffd\ufffdI\ufffd\ufffd\ufffdT}\ufffdN\ufffd\ufffdju\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000f\ufffdG\ufffdG\ufffd\ufffd\ufffd\u001f\ufffd?\n\u007f\u001c>\u001e>\u0011\ufffd$\ufffdi\ufffdd\ufffd\ufffd\ufffd\ufffd\ufffdS\ufffd/\ufffd_\ufffdO\ufffd\ufffd\n\ufffd\t\u007f\u001d\ufffd&\ufffdm\ufffd\ufffd\ufffdY\ufffdY\ufffd\u0012\ufffd\ufffdBV\ufffdU\u036an%[)V\ufffd\ufffdf\ufffd[\u0019V\ufffdU\u00eai\u0572\ufffd\ufffd\ufffd\u0007\ufffd7\ufffd?\ufffdo\ufffdo\ufffd\ufffd\ufffd\u007f\ufffd\u000f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u06c7\ufffd\u000f\ufffd#\ufffdQ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd}\ufffd>a\u007fb\u007fj\ufffd\ufffd?\ufffd?\ufffdO\ufffd_\ufffd_\u06a7\ufffd\ufffd\ufffd3\ufffd\ufffd\ufffd7\ufffd\ufffdt\ufffd\ufffd\ufffd*ZRJ\ufffd\ufffdJR\ufffdTu\ufffd\ufffdRT\ufffdJS\ufffd*Ce\ufffd\ufffd\u01aaZ\ufffd\ufffd\ufffd\u02a6\ufffdQ.\u001d\u0011\ufffd\ufffd*KEU\u001dUWe\ufffdz*\ufffd.S9\ufffdrU_5P\rU#\ufffdX]\ufffd\ufffd\ufffd+US\ufffdL5W-TK\ufffd\ufffdZ\ufffd\u05aa\ufffdj\ufffd\u06a9\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd:\ufffd\u03aa\ufffd\ufffdW\ufffdU\u000fU\ufffdz\ufffd^\ufffd\ufffd\ufffdZ\ufffdQ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdk\ufffd\u0000U\ufffd\u0006\ufffdk\ufffdu\ufffdzU\ufffdnP\ufffd\u050d\ufffd&u\ufffd\u001a\ufffdnQC\ufffdPu\ufffd\u001a\ufffdJ\ufffdpu\ufffd\ufffd]\ufffd\ufffd\u0011*\ufffdF\ufffd2u\ufffd\ufffdS\u0765\ufffdV\ufffd\ufffdQ\ufffd^5Z\ufffdQcU\ufffd\u001a\ufffd\u01ab\t*\ufffd&\ufffdIj\ufffd\ufffd\ufffd\ufffd\ufffdij\ufffd\ufffd\ufffdf\ufffd\ufffd\ufffd,5[\ufffdQs\ufffd<5_-QK\ufffd\ufffdj\ufffdZ\ufffdV\ufffd\ufffdj\ufffdZ\ufffd\ufffd\ufffd\ufffdT\ufffd\ufffd\u0016\ufffd\ufffdj\ufffd\ufffdP\ufffd\ufffd1\ufffd\ufffd\ufffdH}\ufffd\u007f\ufffd>W_:\u001f9\u001f;\u01dd\u0013\ufffd'\u03a7\ufffdI\ufffd3\ufffds\ufffd\ufffds\ufffd\ufffd\ufffd9\ufffd|\ufffd|\ufffd|\ufffd|\ufffdu\ufffd\ufffd\ufffd47\ufffd\ufffdp3\ufffd\u001anM\ufffd\ufffd\u001bv-\u05e6!u\\\ufffd\ufffd\u0708\ubef5\ufffd,\ufffd\ufffd[\ufffd\ufffdv\ufffd1\ufffd27\u01fd\u072d\ufffd6w[\ufffd-\ufffd\\\ufffd\ufffd\ufffd\ufffdm\ufffdu\u007f\ufffdvt;\ufffd]\u072e\ufffdUn\ufffd\ufffd\ufffd\ufffdw\ufffd\ufffd=\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdw\ufffdq\u0007\ufffdE\ufffd\ufffdu\ufffd\ufffdn\ufffd{\ufffd;\u023d\u047d\u027d\ufffd\u001d\ufffd\ufffd\ufffd\u000eqou\ufffd\ufffd%\ufffdp\ufffd6\ufffdv\ufffd\ufffd\u001d\ufffd\u01bd\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd]\ufffd\ufffd\ufffd\n\ufffd\ufffd^?\ufffd\ufffdw\ufffd7\ufffd+\ufffd\u0006z\ufffdz\ufffdy\ufffd{\ufffd\ufffd\r\ufffd \ufffdF\ufffd&\ufffdfo\ufffdw\ufffd7\ufffd\u001b\ufffd\ufffd\ufffd\r\ufffdJ\ufffd\ufffd\ufffdm\ufffd\ufffd^\ufffd\ufffdm\ufffd7\ufffd+\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdFy\ufffdz\ufffd\ufffd1\ufffdX\ufffd\ufffd\u001b\ufffd\ufffd&x\to\ufffd7\u025b\ufffdM\ufffdz\u04fc\ufffd\ufffd\fo\ufffdw\ufffd7\u02db\ufffd\ufffd\ufffd\ufffdz\ufffd\ufffd\u000f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\t\ufffd\u0013\ufffdS\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u007f\ufffd\ufffd\ufffd?\ufffd\u007fU\ufffdo\ufffd\ufffd\ufffd\u0466\ufffdf\ufffd\ufffd\ufffd\u0016\u0456\ufffd.\u045e\ufffd^\ufffd\ufffdQ\u0297X\ufffd\ufffd9S\ufffd\u000b\ufffd\u000b6\ufffd\ufffd/O\ufffd\ufffd\ufffd$\ufffd\ufffdM\u01d3\ufffd3\ufffd<1\ufffdm\ufffd\ufffd\ufffd\ufffd\ufffd\u001bx\ufffd\ufffd \ufffd?}\u0013\u03df\ufffd\u0019\u03df\ufffd\ufffd\ufffdO\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u04ff\ufffd\ufffd\ufffdCx\ufffd\ufffd\ufffdE\ufffd\ufffdk\ufffd\ufffd\u04f0~\ufffd\u0001\ufffd\ufffd\ufffd\ufffd/\ufffd\u0017\ufffd\ufffd\ufffd\ufffd/\ufffd\ufffd\u0001\ufffdq\ufffd\ufffd\ufffdN\u0007g\ufffdH\ufffd3\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd$\ufffd\ufffd\u007fP\ufffd\ufffd3\ufffd\ufffdd-\u0011\u000b\ufffd\ufffdh\u0003\ufffd0\ufffd9\ufffdY\ufffd\u001f\ufffd\u001a\ufffd&\ufffd!\ufffd\ufffdF\ufffd\ufffd~Kg+\ufffd\ufffd\u0017\u0000\u0290\ufffdCL\ufffd&\ufffd\ufffd\ufffd\ufffd\ufffdo\u0019jH|\u001b\ufffd\ufffd\r\ufffdH\ufffd\ufffd\ufffd\ufffdy\u0007\u0595\ufffd\ufffd\ufffdi8\ufffd\ufffd|\ufffd\ufffd\ufffdD\ufffd\ufffdP{]\ufffd3\ufffd>\ufffd\u0003\ufffd\u000bn'\ufffd\ufffd$\ufffd\ufffdno \ufffd\ufffd\ufffd\ufffd\ufffd!|\ufffd-$\ufffd\ufffd\u000eD\ufffd\ufffd\u001a\ufffd{\u05505%\ufffd\ufffd\u001b\ufffdu\ufffdv\ufffdo\ufffd\u000f\ufffdM\ufffdYg\ufffd\ufffd\ufffd\ufffd\ufffd_\u04c0t\ufffd\ufffde*\ufffd\ufffdZ\ufffdS\ufffd\ufffd\ufffd\ufffd^\ufffdo\ufffd\ufffd4\ufffd\ufffd\ufffdb\ufffd\""\ufffd\ufffdE\ufffd\ufffd?\ufffd\ufffd\ufffd\ufffd\ufffd#Y\u0019N\u001e\ufffd\u0013\ufffd~\u001f%\ufffd\ufffd\ufffd\ufffdX\ufffd\ufffd(\ufffd\ufffd\ufffdJ\ufffd;\u0154PJy\ufffd\u001db\ufffd\ufffd\u0014-\u000f\ufffd(f\u007fH\u0011\ufffd\u0011\""\ufffdI\ufffd\ufffd:.\u0006Q\ufffd\ufffd\ufffd\u0018\u000f\ufffd\ufffd&\u000e\ufffd8\n\ufffd\ufffd\ufffd\ufffd%\ufffd\ufffd\ufffd\u07f9\ufffd\ufffd\ufffd\u0016\u0005\ufffd\ufffduK(v\ufffd9\u001f\rW\ufffd5\ufffd{\ufffd\ufffd\ufffdCg\u001c:\ufffd8f\u001fUK\ufffd|C-\ufffdl\ufffd3\ufffd\ufffdj\ufffds\r\ufffd\ufffd>c\""%EIw\ufffd;\ufffd\u001d\ub5bb\ufffd\ufffd\ufffd\ufffd\u00047\ufffdNtg\ufffd\ufffd\ufffd9\ufffd\\w\ufffd;\ufffd]\ufffd.t\u0017\ufffd\ufffd\ufffd\ufffd\ufffd\u001aw\ufffd\ufffd\ufffd}\ufffd]\ufffd>\ufffdn\ufffddl\ufffd\ufffd\u007f\u0011]\ufffd\u007fC|m\ufffdw; \ufffdv\ufffdd\ufffd\ufffdI\ufffd\ufffd\ufffd{\ufffd\ufffd\ufffd-\ufffd \ufffd\u000e\ufffd\ufffd1w\ufffd\ufffd)\ufffd^\u0018s\ufffd\ufffd=\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdf\ufffd\ufffd\ufffd:\ufffdR\ufffd\ufffd>\ufffd\ufffd\ufffd[\ufffd\u0019[\ufffd\ufffd\ufffddV\ufffd\ufffd\ufffdn\ufffdE\ufffdG\ufffd\ufffd\u03ce\ufffd~\ufffdC\ufffd\ufffdnE<\ufffd$:\ufffd\ufffdl\ufffd\ufffd*\ufffd\ufffd\ufffd\ufffd@\ufffdg\ufffd\ufffd\u00001\ufffd-\u0016\u05c9\ufffd\ufffd\ufffd\ufffd\u00161\ufffd\ufffd\u0015\ufffd\ufffd0\ufffd^\ufffd\u0015s\u0643b\ufffd\ufffd\ufffdm\ufffdo\ufffd`\ufffd%\ufffd\ufffd\ufffd\ufffd\ufffdI\ufffdI\ufffd\ufffd@RjR*E\ufffd\ufffd\ufffdt\ufffd\u0719I\ufffd\u0014\ufffdk&\ufffd\u0014\ufffd\ufffd$\ufffd\u001d\n?\u001d~\ufffd\ufffdk\u0656M\u0011z\ufffd\ufffd\ufffd\ufffd\ufffd\n\ufffd\ufffd[\ufffd\u0012k\t\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd6[\ufffd\ufffdcg\ufffd9\u0735\ufffd\ufffd\ufffdy\ufffd\ufffd\u043e\ufffdG\ufffd+\ufffd\u6f1e\ufffd\ufffdn\ufffd/\ufffd\ufffd\ufffdy\ufffd\ufffd\ufffdo\ufffd\ufffd\ufffd\ufffd\ufffd`\ufffd\ufffd\u001eb\ufffd\ufffd~\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001ec\ufffd\ufffd\ufffd\u0014\ufffd\u0017\ufffd\ufffdb{\u0005\u001fc\ufffd\ufffd\f`\ufffd\ufffd\ufffd\ufffd\u001a\ufffd\ufffd\ufffd\ufffd}\ufffdoQk\ufffdz\ufffd\ufffd\u06a0\u001e\ufffd\u03e9\ufffd\ufffd&\ufffdC=\ufffd\u001e\ufffd\ufffd\u0013\ufffd)\ufffd\u0015\ufffdSG\ufffd\ufffdN\ufffdr\ufffd\u05dd\ufffd\ufffd+\ufffd\ufffd\fuF\ufffd\u03bd\ufffd\u001c~\ufffdY\ufffd<\""\ufffd\ufffd\ufffd;/\ufffd\u001c\ufffd\u0015\ufffd\ufffd\ufffdI\ufffd\ufffd\ufffd\ufffd[\ufffd-\u0014?\ufffd*\ufffd\n\ufffd\ufffd\ufffd\ufffdm\u0010\ufffd#\ufffdF\ufffd\u0015\ufffd\ufffdo\ufffd\ufffd\u017f\ufffdG\ufffdc\ufffd?j\u0017\ufffd.\u0014OG\ufffdD\ufffd\ufffd_G\ufffd\u0005B\ufffd\u001e-\u0015\ufffd+\ufffd\ufffd}\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\r\ufffd\ufffd\ufffd\ufffd\ufffd?\ufffd?\ufffd\ufffd\ufffd~\ufffd\ufffd\ufffd\ufffd< \u07d0\u0007\ufffd\ufffd\ufffd\ufffd-\ufffd\ufffd|G\ufffdE\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd@\u001e\ufffdG\ufffd1~\u001f\ufffd\ufffdg\ufffd9|.\ufffd\ufffd\ufffd\ufffd\u0005|!_\ufffd+\ufffdb\ufffd\ufffd/\ufffd\ufffd\ufffde|9_\ufffdW\ufffdU|5_\ufffd\ufffd\ufffdu\ufffd\u0001\ufffd^\u0395\ufffd\ufffdD9IN\ufffdS\ufffdT9MN\ufffd3\ufffdLy\ufffd\ufffd\ufffdn\ufffd\ufffd-\ufffd\u0010\ufffdj\ufffd\u0015EiM\ufffd`\ub60f{0\ufffd\ufffdJ;\ufffd\ufffd\ufffd\u001e\ufffd`\u0703\u0019\ufffd\ufffd\u0000\ufffdo\u0018h\u0017\ufffdQ\ufffd\u007fp\ufffdI\ufffd\u0001FP\ufffdUFm,\ufffdJ\ufffdfL\ufffd\u0017\ufffd9\ufffd\b\ufffdB:z\ufffdj\ufffd+\ufffd5KV\ufffd:\ufffd\ufffd9\ufffd\u3c5a\ufffd\ufffdDY\ufffd)pz2\ufffd\ufffd\ufffd\u00142\ufffd\ufffd\ufffd\fdY\ufffd{\ufffd`\ufffdh\ufffd:\ufffdr\ufffd\ufffd\ufffd\u001a\ufffd\ufffd\u0014fW\ufffd\u001d\ufffd5\ufffd\u001d\ufffd\ufffd\ufffd\ufffd\ufffd\bkM\ufffd\ufffd@\ufffd\ufffdG\ufffd\ufffd\ufffd?\u0344\ufffd\ufffd\ufffdO\ufffd\ufffd\ufffd?\ufffd\u0014\u001d)\ufffd\r\ufffdW\ufffdY\u0012y5\ufffd%SL\ufffd\ufffdR\ufffd[*|\u02c0oa\ufffdf;u\ufffdz\ufffd\ufffdeN\u0003V\u001b~f\ufffd\u03d8S\ufffd\fb\ufffd\ufffd\ufffd\ufffd!\ufffd\u0011\ufffdm\no[\ufffd\ufffd6\ufffd\u001d\ufffd\ufffd\u000e\ufffdH\ufffdh\ufffdu\ufffd\ufffd\ufffd\ufffdy\u0001\ufffdt\ufffd\ufffd\u0574\ufffd\re}\ufffd[\ufffdJ\u03bfA\ufffd\ry\ufffd\ufffd\f\ufffdQ\ufffd2\ufffd\ufffdC\ue747\u073b\u001br\ufffd|\ufffd\ufffd\u0751{\ufffd@\ufffd]\ufffd\u073b\ufffd\u03a8Y/\ufffd\ufffd>\ufffd\ufffd\ufffdoqaE\ufffdG\ufffd3<\ufffdFc\ufffd\ufffd\ufffdI\bcP\ufffd\ufffd`\n\ufffd\ufffd\ufffdI\ufffd\u0018d\ufffd\ufffd\ufffd\ufffd,\ufffd\ufffd\ufffdN\ufffd\u001a\ufffd_\ufffd\ufffd$9\ufffd4\u001b\u000e\ufffd\ufffdq\u001a9\ufffd;S\ufffd>\ufffduvnuF\ufffd\ufffd\u0014eN\ufffd;\ufffd3.g\u0013(\ufffdD\ufffdt\ufffd\u0011\ufffd\ufffdr\ufffd\f\ufffd\ufffd\u00034?C\ufffd\u0016\u06bf\ufffd\ufffde\ufffda\u0013\ufffd~\ufffd[\ufffd\ufffd[\u0014\ufffd6\ufffd\ufffd\ufffd\ufffdI\ufffd\ufffd\u0019\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdm\ufffd~\ufffd\u0006o\ufffd\ufffd2\ufffd\ufffd1/;?\ufffd\ufffdZ\ufffd5\ufffd\u0001\ufffd\ufffdmut\tx\ufffdq=0\ufffd\ufffd\ufffde`\ufffd\u0003\u0197\ufffdq}0n\u0000\ufffd\r\ufffdU\ufffduM:\u0019\ufffdb\ufffdi\ufffdg)N\ufffdj\ufffd\ufffd_\u0003\ufffd(\ufffd\ufffd\ufffdh\ufffd\ufffd~\ufffd\ufffd\u06de\ufffd\ufffd\u007f\ufffd\ufffds\ufffd\u0006\ufffdg\ufffd\ufffd\ufffdw\ufffd\ufffd!\u001eb\ufffd\u001c\ufffd\ufffd\u062fF\ufffd\ufffdY}\u0584\ufffdd\ufffd\ufffd&\ufffd\u000f\u001e\u0195\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\u0001\ufffd)\ufffd\f\u0624\ufffd\u0005\ufffd\b\ufffd\u0002\ufffd\ufffdx\u0016@?\u0470\u020c\ufffd+\ufffdWA;\u009b\ufffd\ufffd\u001f\ufffd3\ufffd\ufffdl\u001b{\ufffd=\u03f6\ufffd\u001dl'\ufffd\ufffdv\ufffd\ufffdi\ufffd}\n/\ufffd\ufffdhm\ufffd\ufffd\ufffd\u001db\ufffdyRx_\ufffd\ufffd\ufffdoBk\ufffd\ufffd\ufffd\ufffd\ufffd;\u06bd\ufffdB\ufffdZ\ufffd:\ufffd\u0006{\ufffd=\ufffdw\ufffdM\ufffd\ufffd\ufffd\ufffd\ufffd%\ufffd\ufffd~{\ufffd\ufffd\ufffd^A\ufffd\ufffdj{\ufffd\ufffd\ufffd^g?`\ufffd\ufffd\u001f\ufffd\u001f\ufffd\ufffd\ufffd7\ufffdmR\ufffd\ufffd\ufffd\ufffd\ufffd7\ufffd\ufffd\ufffd\u001b\ufffd\u03bf\ufffd,\ufffd\u001f)\u019b\ufffd\ufffd[\u007f\ufffd\ufffd\u001cv\ufffd\ufffd\ufffdE\ufffd\ufffdj\ufffdzH=\ufffd=\ufffd=\ufffd\ufffd\u001c\ufffd\ufffd\u0015\ufffd!\ufffdYt\ufffd\u001cV\u007fN\ufffdQH\ufffd\ufffd\u001c\ufffd6\ufffds$S>G1\ufffd+\ufffdN\ufffd\ufffdo=\ufffd\ufffd\u007f+}\ufffd\ufffd\ufffd\ub7c9\u0014Og\ufffd7\ufffd\u000b]\ufffdl`=\ufffdl\ufffdr-\u001f32\ufffdO75\ufffdU\ufffd|\ufffd\ufffd6\ufffd\u0016\u0011+\ufffd\u0007}\ufffd\ufffd3*\ufffd\ufffdz\ufffd^\ufffd6_\ufffd\ufffd]\ufffdOK\ufffdG\ufffd\u007f3\ufffd\ufffd\ufffd\ufffdj\ufffd$\u007f\ufffd?\ufffd\u007f\ufffd\ufffd\u0011\ufffd\ufffd\ufffd\ufffd\ufffdU\ufffd\ufffd\ufffda].\ufffdYu\ufffdl\ufffd\ufffd\u0015\ufffd.\ufffdr\ufffd\ufffdVS\ufffd\ufffd\ufffd\ufffdja\ufffd\ufffdr\ufffdVVk\ufffd\ufffd\ufffd\ufffdjg\ufffd\ufffd:X=\ufffd\u0002\ufffd\ufffd\ufffd\ufffd\ufffdm]m\ufffd\ufffd\n\ufffd\ufffdV?\ufffd\ufffdu\ufffd5 <6<.\ufffd\ufffd\ufffdq\ufffd\ufffdg\ufffd~_c}\ufffd\ufffd\ufffdG\ufffd\ufffd\ufffd21J\ufffd\ufffdD\ufffdT\ufffd\ufffd%\u000fZ\ufffd\u0017\u001c\ufffd\ufffd\ufffd#\ufffd\ufffd\ufffd\ufffd\u0005\u0007Y\ufffd\ufffd\ufffd\ufffd\ufffdC\u07cb\ufffd\ufffd\ufffd\ufffd\ufffdA\u07c3\u000b\u000e\ufffd\ufffdW\u000e\ufffd\ufffd\ufffd\ufffd \ufffd\u0017\u001e\ufffdK\u001d\ufffd\u077a\ufffdQ\ufffd\ufffd\ufffd\ufffd\u03e3.:F\ufffdQ\ufffdW\ufffd\u0125\u000e\ufffd\u001e_x\ufffd\ufffd\ufffdu\u0471\ufffd\ufffd\ufffd2\ufffds\u0591\u0566\ufffdz\ufffdQ\ufffd\ufffdc\ufffd\ufffd\ufffdK\ufffd\u0019A\ufffd1\ufffd0\u0006\ufffd\ufffd\ufffd\ufffdt\ufffd\ufffdU\ufffdn`W\u063fS\u000f\ufffd\ufffd\ufffd\u01fd\u01fd_z\ufffd\ufffd\ufffd\ufffd\ufffd\u001d\ufffd\ufffd'\ufffd,\u0175\r\nendstream\r\nendobj\r\n784 0 obj\r\n<>\r\nstream\r\nx\ufffd]\ufffdMn\ufffd0\u0010\ufffd\ufffd\ufffd\ufffd\ufffdt\u0011a;\u0010R\t!\u0011\b\u0012\ufffd\ufffd\ufffd\ufffd\u0007 \ufffd\ufffd\""\u0015c\u0019\ufffd\ufffd\ufffd\ufffd\ufffd$\ufffdb\u0256>\ufffd{3c\ufffd\u00e2.k\ufffd\ufffd$|7\ufffdh`&]\ufffd\ufffd\ufffdi\ufffd\u001a\u0001\ufffd\f\ufffd^\u0005\ufffd\u0013\u064by%<\ufffd\ufffd\ufffd \ufffd\ufffdf\ufffdf\u0018j\u054dA\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffd,d\ufffd\ufffd\ufffd\fOA\ufffdf$\ufffd^]\ufffd\ufffdh,7W\ufffd\u007f`\u00005\u0013\u001ad\u0019\ufffd\ufffd\ufffdD/\ufffd~m\u0007 !\u06b6\ufffd\ufffd\ufffd~^\ufffd\ufffd\ufffd\ufffd\\4\u0010\ufffd\ufffd|3b\ufffd0\ufffdV\ufffdi\ufffd\u0005\ufffd\ufffd\u0695\ufffd\ufffd\ufffd+\u000b@\u0247x\ufffd]\ufffdN|\ufffd\u0006\ufffd;\ufffd\ufffd\ufffd\ufffd\ufffd\u0011\ufffdH\ufffd\u000e)\ufffd=\ufffd\ufffd\ufffd\u0004)F%\ufffd^\ufffdgXe\ufffd\ufffdn\ufffdo\ufffd0Z9\u0019c\u052b\ufffd\ufffd\ufffdq\ufffd\u001e\ufffda\ufffd\ufffdu1\u0588WW\ufffd)\ufffdt@\ufffdW\ufffd\n\ufffdd\ufffd\ufffd\ufffd\ufffdT!\u001d\n\ufffd\ufffd#=\ufffd,I\ufffdt\ufffd7L\ufffd^\u00141\ufffd]\u9a0c\ufffd\ufffd8\ufffd\ufffd\ufffd7t/\ufffd\u0006\u007f\u001f\ufffd\ufffd\u001ac'\ufffd\ufffd\u0003G\ufffd\ufffd+\ufffd\u007f =j\ufffdr\ufffd\u0017\u0000\u04eev\r\nendstream\r\nendobj\r\n785 0 obj\r\n<>\r\nstream\r\nx\ufffd\ufffd}\u0007xT\ufffd\ufffd\ufffd7\ufffd\uc997M%d\t\ufffdaI(\u001b\b-\u0010\ufffdd!\u0005Bh\ufffd,nBKH\ufffd\ufffdN\ufffd`,\ufffdFA\ufffd\ufffd\ufffd\ufffd\u000b\ufffd\ufffd\u0005%X\ufffdk/\ufffd\ufffd\ufffd]\ufffd\ufffd+(*\ufffd\u0017\ufffd\ufffd\ufffd9\ufffd\u000e$\b\ufffd\ufffd\ufffd>\ufffd\ufffd?\ufffd%\ufffd\ufffd|\ufffd\ufffdw\ufffd\u0319\ufffd3{\ufffd\u000b\t\""\ufffd\ufffd\ufffdD\ufffd\ufffdC\ufffdJ\n\ufffd\u001e\ufffd\fi\ufffd\ufffd\u0012\u000e\ufffd\u000f\u001d\ufffd;\ufffd\ufffd\ufffd3H\ufffd]D\u0014\ufffd4f|f\ufffd\ufffd\u001f\ufecfH\ufffd\ufffdV\ufffds*\ufffd\ufffd\ufffd\u075c|\ufffd\u0657\u0011\ufffd\ufffdT.Yl\ufffd5\ufffd\ufffd,\ufffd\ufffdW\ufffd\ufffdP\ufffd\ufffd\ufffds\ufffd|\ufffd\ufffd#ZPE\u0014\ufffd^\ufffd\ufffd\u636c\ufffd7\u0013\u0759M\""\ufffdfFuE\ufffdO\ufffd\ufffd{\ufffd/\u0002\ufffd\ufffd\u0380#\ufffd\ufffdv2?\ufffdO\u001dg\ufffdY\ufffd,\ufffdjJ<\ufffd_\u0010\ufffd\ufffdV;\ufffd\ufffd\ufffd\ufffd\ufffd\u15d2h\u0682\ufffd\ts*\ufffd\ufffd\ufffd\u001e\ufffd\ufffd\u0017\ufffd3\u0010o\ufffdS\ufffd\ufffd\ufffds\ufffd,!\ufffdl\ufffd\u03db[1\ufffdz\ufffdSI|\ufffd\u0013Q\ufffdE\ufffd\ufffd-Z\ufffdl\ufffdu\ufffd\ufffdZ\u0019?\u007fa\ufffd\ufffd\ufffd\ufffd\u001d\ufffd\u0012\ufffd\u0644\ufffd}Er,\ufffd\u0006||\ufffd\ufffd\u007f\n\ufffdF\u000f:HmCH\u0683_\ufffdzA\ufffd[\ufffdK\ufffd\u001c>t\ufffd>to\b\ufffdI\ufffd\ufffd\u0011\u001b\ufffd\u0005\ufffdQ\u0012O\ufffdm9|\ufffd\u0416\u043dF\ufffd\u0016\ufffdv\ufffd\ufffdX\ufffd\u048dd\ufffde\ufffd\ufffd\ufffd\ufffd2i=Ql_\\WC\ufffdnr\ufffdMd\ufffd\u0010\ufffd\ufffd\ufffd\ufffdH\u065eY\u007f\ufffd\ufffdi\u0014BZ\ufffdY\ufffd4\ufffd\ufffd\ufffd>\ufffd\ufffd\u037b\ufffd\ufffdJ\ufffd\u0007\ufffdQ\ufffd\ufffdvr\u0011\u001d6q\u001f\ufffd7k\ufffdv\u0012\u0372N\ufffdi\ufffd\ufffdwJ\ufffd\ufffd\u0011/\ufffdq\ufffdH\u000e\ufffd\ufffdf*\ufffdm\ufffd<\ufffd8i\ufffd^\ufffd\u05b2\ufffd\u007f\u047a\ufffdGL3\ufffd~.m\u0003\u0005\ufffd\ufffd\ufffd\u44f7\rz\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd<\ufffd*\u007fO\ufffdL\u001d\ufffd\ufffd1yN\u0018\ufffd\ufffdi\ufffd\ufffd\ufffd\ufffdQt\ufffdkv\ufffd\ufffd~\ufffd5\ufffd\ufffd\ufffd\u00070\ufffd~\ufffd\ufffdLt\ufffd\ufffd<\ufffd9i]5\ufffdu\ufffd\ufffd\ufffd\ufffd\u02e7\ufffd\ufffdX\ufffd\ufffdt\u000e\ufffd\ufffd\""\u07f2\ufffd\ufffd\ufffd\ufffd_\u03c5\ufffd\u0018\ufffd\ufffd\ufffd\ufffd\ubd0fN\ufffd6(\b\u05fd\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd{\ufffd\ufffd\ufffd'9\ufffd\ufffd\ufffdj\ufffd}'\ufffd\ufffd\u0018*\ufffd\ufffdZ\ufffd\u07e0I\ufffd{\ufffdc\ufffd\ufffdCW\ufffd\u04e8\ufffddu\ufffd\ufffd\ufffd\u001f$\ufffd\u0011[\ufffd\ufffdz\ufffdi\ufffd\ufffd\\C[@iA\ufffdPZ\ufffd\u001b\ufffdf\ufffd\n}\ufffd_\u000f\ufffd\ufffd\ufffdi\u001f\ufffd\ufffd\ufffd\ufffdT\ufffd\ufffd\ufffd'^C\u0599\ufffd\u001d\ufffd\u0005w\ufffd4\ufffd\t\ufffd\ufffdE\ufffd\u0013\ufffd\ufffd\ufffdZi\ufffd&\ufffd\ufffd\ufffd\ufffd \u01887\ufffd\ufffd\ufffd\u017f\ufffd\u07d08U\u0309\u0016TEW\ufffd\ufffd\ufffd/\ufffd\ufffd}\ufffdgv\ufffdx\u007f.y_\ufffds\ufffd\ufffd\ufffdT|\ufffd6\ufffd{Z\ufffd\ufffd{(\ufffdU\ufffd\ufffd(\ufffdT\ufffd\ufffdw\ufffdk#\ufffd\u001cG\ufffd\ufffdE\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffdA?/\ufffd\ufffd8e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdgh\ufffd\ufffd@\u001d~\ufffd\ufffdB\ufffd\ufffd\u02a5m\ufffd<\ufffd_T\ufffd\ufffd6x\ufffd\ufffdD\ufffd\ufffdc\ufffdQ\ufffd\ufffd\ufffdj_R\ufffd\ufffd\ufffd\n1\ufffd\ufffdm\u0019+\ufffdP\ufffdi\u0002b?3\ufffdo\ufffdC\u001b\ufffd\u0003\ufffd\u0007\r\u0015\ufffd\ufffdC\ufffd\ufffd\u0592M\ufffd\ufffd2\ufffd\ufffd\ufffd\u0226\ufffd\ufffd\ufffd\ufffd{o\u007fU\u00fc&\ufffd\ufffd\ufffd\ufffdE\ufffd\u0002\u0016\ufffd\ufffd\ufffdi\u05ca\ufffdS\u0595\u04fe\ufffde|\ufffd\ufffdz\ufffd\ufffdLW\ufffd7\ufffd\ufffd\ufffd!\ufffd}H\ufffd_\ufffda\u0011\ufffd!\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdZ`\ufffd/\ufffd.:\u000fX\ufffd[q\ufffd\u03f4\ufffd7\ufffd\ufffdE\u0017\ufffd\ufffdp\u0016\ufffd\ufffd\ufffd\u048f\ufffd\u06f3\ufffd\ufffd\ufffd.\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd4\ufffd\ufffd\ufffd\u000e\ufffd[\u0fb4F\ufffdQ\u0016\ufffd\u0012\ufffd\ufffd\ufffd\ufffd\u00c1{\ufffd\ufffd\ufffdt\ufffd\u000eT\u0003\ufffd\ufffdJ`\ufffd\ufffd\\\ufffd\ufffd\ufffdm\ufffd\ufffdi\ufffd\ufffd\ufffdJ\ufffdm\ufffd\ufffd\u03e0\n}'\ufffd\ufffd\u000b)S\ufffd\ufffd\ufffd\ufffdh\u001c\ufffd\u0010c\ufffd\r@50\r\u0018\u0000L\u0007*\ufffd)@\ufffd\ufffd\ufffdE\ufffd:\ufffdv\ufffdz\ufffd\ufffd\u007f8\ufffd\r\u0017?\ufffd\f\ufffd\""\ufffdn\u001a\ufffd\ufffdGi\ufffdm\ufffd#\u001f\ufffdD\ufffd\u0012\ufffd}\f\ufffd\ufffd\u01ff\u0003h/\u04d9\ufffd!*\u0007<\u007f\ufffd\ufffdv=e\ufffd\ufffd\ufffdS\u001bG\ufffd\ufffdB\ua98d\ufffdx\ufffd\u0000m\ufffd\ufffd\ufffd\ufffdM\u001d\ufffd3\ufffdk\u0014r\ufffdn\\cs\ufffd\ufffdzn`.O\ufffd__#`\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd}\ufffd\u0334\ufffd\ufffdN\ufffd\ufffd6\ufffdAT\ufffd\u0017\ufffdF\ufffd\u000e\ufffd\u0632^\ufffdF\u001b\ufffd\ufffdd6b'\ufffdF\ufffd\u001c\ufffd\ufffda\u07ec\ufffd2\ufffdm\ufffd\u056e\ufffd3\ufffdz*\ufffd\ufffd`\ufffd\ufffd\ufffd\ufffd?\u06a7\ufffd\u0005,`\u0001\u000bX\ufffd\u0002\u0016\ufffd\ufffd\u0005,`\u0001\u000b\ufffd_\ufffd\ufffdwL\ufffd?\ufffd\uf2ff\ufffd{\ufffd\u0011_\ufffd\ufffd]T~\ufffd4\ufffdk\u0006\ufffdg\u0006,`\u0001\u000bX\ufffd\u0002\u0016\ufffd\ufffd\u0005,`\u0001\u000bX\ufffd\u0002\u0016\ufffd\ufffd\ufffd\ufffd&N\ufffd\ufffd\ufffd\ufffd\ufffdf>\ufffd\ufffd\ufffd\ufffdK\u0001\u000bX\ufffd\u0002\u0016\ufffd\ufffd\u0005,`\u0001\u000bX\ufffd\u0002\u0016\ufffd?\ufffd\ufffd\u0007\u0002\ufffd\ufffd\u0002\u0016\ufffd\ufffd\ufffdoM\ufffdO\ufffd@? \rH\u0007\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\u000f]\ufffd\ufffd\u0006\u0003S\ufffd1~t\u0007\ufffd\ufffd<`\u0018\ufffd\ufffd\ufffd\u4b5b\ufffd\ufffd#\ufffd\u000eX\ufffd\u0002\u0016\ufffd\ufffd\u0005,`\u0001\u000bX\ufffd\u0002\u0016\ufffd\ufffd\u0005,`\u0001\u000bX\ufffd\u0002\u0016\ufffd\ufffd\u0005,`\u0001\u000bX\ufffd\u0002\u0016\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0743\ufffd\u0005\ufffdO6\u074fv\ufffd/I\ufffdC(A\ufffd\ufffd\ufffd$>\ufffdc$\ufffd\ufffdL\ufffd_\u034a\ufffd\u000e\ufffdN]\ufffd?\ufffdA\ufffd4\ufffd\u0192\ufffdf\ufffdRZA[\ufffdn\ufffdN\ufffdDO\ufffd_JFJ\ufffd\ufffd\ufffd)}S\u0006\ufffd\fJ\u0019b\u000f\ufffd[\ufffdy\ufffd\ufffd\ufffd\ufffd\ufffd\u000b\ufffd\u001b\ufffdw\ufffd\ufffdp\ufffd\ufffdl\ufffd{Q\ufffdfG\ufffd\u0394\ufffdlC\ufffd\u0010\ufffd\u0019G\u0015TK\u02cdl\ufffd\u0016\ufffdz\ufffdd\ufffdd#\ufffd\ufffdc\ufffd\u0016\ufffdW\ufffd/2\ufffd\u0011\ufffd\ufffd\ufffd\ufffd\ufffdB\ufffd\ufffddj}s\u0355\u0693z\ufffd>\ufffd\ufffd\ufffd{\u007f\ufffd\ufffd\ufffd\u03feN\ufffdL\ufffd\ufffd\ufffdO\ufffd}\ufffd\ufffd\u84f5{o\ufffd\ufffd\f\""\ufffd\ufffd\ufffd5\u001c\u0018A\ufffd\ufffdYCsi>-\ufffd5\ufffd\ufffdn;\ufffd\ufffd<\ufffd\ufffdW\ufffdQ\ufffdG\ufffdW\ufffdk\ufffd\ufffd\ufffd[_\ufffd{\ufffdZ}\ufffd\ufffdO\ufffdZ\ufffdF\u07ef\u007f\ufffd\u007f\ufffd\u007f\ufffd\u001f\ufffd\u000f\ufffd\ufffdb(\ufffd\ufffd\ufffd\u00042i\u0000\r\ufffd<\ufffdn\u0011\ufffdIe4\ufffd\ufffdh\ufffd\ufffdD\ufffd\ufffd\ufffdd\ufffd^t\u0016cE\ufffd\ufffd,f\ufffdy\ufffdN,\u0011\ufffd\ufffd\u0005\ufffdBq\ufffd\ufffd$\ufffd\u0011\ufffd\ufffd\ufffd\ufffd1\ufffdx\ufffd\ufffd\ufffdt\ufffdI|d2\ufffd\ufffdL\ufffd\ufffd\u0010S\ufffd)\ufffd\u0014n\ufffd0E\ufffd\ufffd\ufffdSt\u0017\ufffdD\ufffd(\ufffd \ufffd\ufffd\ufffd\u001fN\ufffd\u0017\ufffdP\ufffd\ufffd\ufffd\u0798F\ufffdn\ufffd\u04b8O\ufffdd\ufffd}\ufffd\u001d\ufffd\u007f\ufffd\r3\r\ufffd\ufffd9>\u0002lr\u001c\ufffd\ufffdH\ufffd\u001a\ufffdSt\ufffd$#\u0004\ufffd)\ufffd\b5\u0018\ufffd\ufffd|\ufffd\u007f\ufffd\ufffd^m\ufffd\ufffd,\ufffd\ufffd\ufffd'\u00155\ufffd5\ufffd\ufffd\ufffd\ufffd&W\u067a\ufffd\ufffd\u0017-\\0\u007f\ufffd\ufffd9\ufffd\ufffdg\u035c1\ufffd\ufffd\ufffdj\ufffd\ufffd)\ufffd'M,+\ufffd\ufffdK\u018f+\u001e;f\ufffd\ufffd\ufffdE#\n\ufffd\u000f+\ufffd\ufffd\ufffd\u001d:\u01153\ufffd\ufffdA\u0003\u0007\ufffd\ufffd\ufffd\ufffd7+\ufffd{\ufffd\ufffd\ufffd\ufffdi\u001d\u001d\u001dlI\ufffd1\ufffd\ufffd\ufffd\ufffd\u0410\ufffd \ufffdI\ufffd\u0004e\ufffd;\n\ufffd\ufffd\ufffd\ufffdr\ufffd)\ufffd1|x7YvT\ufffdQ\ufffd\ufffdQ\ufffd\ufffdU\ufffd:\ufffdk/7\ufffd\ufffd#]\ufffd\ufffd9!\ufffd\u0151\ufffdc\ufffd\ufffdb\u001fD\ufffd\ufffde\ufffd\ufffd\u001dv\ufffdy\u000e{\ufffd(+\ufffd@o\ufffds\ufffd\u06bd\ufffd\f=\ufffd\u0426t\ufffd\u0010\ufffdBj*Z\ufffd\ufffdf\ufffd\u067d\ufffd\u071e\ufffd-X2\ufffd!\ufffd<\u000f\ufffd\u001a\ufffd\ufffdr\u001d\ufffd\ufffda\ufffd2\ufffd1,\u001c2\u001c\ufffd\ufffd\ufffd1\ufffdQt\u001e,\f\ufffdu\ufffd\u001f\u0428QH\ufffd\ufffd\ufffdWO\u02ef\ufffd\ufffd-\ufffd\ufffd\ufffdYSSK\r\u001f\ufffd\u001a\ufffd\ufffdA\ufffd\ufffd`#\ufffd}\ufffd\ufffd3]ho\ufffd\ufffd\ufffdpQ\ufffd\ufffd\ufffd\ufffd;#\ufffd\u001cU\u0015\ufffd<^\ufffd\u0002\ufffd\u001a\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0018\ufffd\ufffd\ufffd#\ufffd\ufffde\u0167I\ufffd\ufffdjo\ufffd#/\ufffd\ufffdt Y\u0478c\u0017\u0010^s\ufffd\ufffdao8H\ufffdc\ufffd\ufffd\u059e\n\ufffd'(\ufffdr\ufffd\ufffd\ufffd\ufffdxl\ufffdP\ufffd4\ufffdo\ufffd!\ufffd/5U\ufffd\ufffd\ufffd&\u0017MC\ufffd[_\ufffd\u1c9d\ufffdY}\ufffd\ufffdt\ufffdz\ufffdrY\ufffd[\ufffd$\ufffdeM\ufffd\ufffd9\u05bc\u0711*\u001fU~\ufffd\ufffdw\u024c$o\ufffd4{\ufffd\f\ufffd\ufffd\ufffd_\ufffd\u06fdzz\ufffd\ufffd\ufffd\u0019\ufffd+\ufffd\u001b\u001cyy\ufffdK^JE\ufffd*h\ufffd\ufffd\ufffd\u0005N\ufffdz\ufffdFy\ufffdQ>V\u001c~Bu\ufffd\ufffdv\ufffd~54T5\ufffd\ufffd&\ufffd\ufffd\ufffdQ\u0018\u009c{a\ufffdw\ufffd\ufffd\ufffd\ufffd\ufffdt\ufffd\ufffd~v\ufffdh\f\ufffd\ufffd\u0512\ufffd\\\ufffd\ufffd\u0002lw\ufffd\ufffd\n\u0007^u\u0005\r\u0015M\ufffd\ufffd\ufffd\u001a\u001a]\ufffd\ufffd\ufffd\ufffd\ufffd3\u0006`]48\n\ufffd\u001a\u001c\ufffd=\ufffd\ufffdF\ufffd\ufffdyV[W\ufffdk\ufffdR\ufffd(*\u0019\ufffdT\u001a\rmt\ufffd\ufffd\u001b]\ufffd\ufffd\ufffde\ufffd]\u0016\""\ufffd\ufffd%\u001e\ufffd&\ufffd\ufffd\uda46\udd4d\u001dQ\ufffd\ufffde\ufffd\u000b\ufffd\ufffdj\ufffd+\ufffd\ufffd`\ufffd\u0005\ufffdi\u001c\n!F\ufffdu\ufffd\ufffd\ufffd\u07a85\u0019\u000e\ufffd\\\ufffd$\ufffd\ufffd\ufffd(\ufffd\ufffd\ufffd&\ufffd}\u0016\ufffdP\ufffdq!\u0017N\ufffd\ufffdM&\ufffdq\ufffdh\u0013|!\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffdXd\ufffd\u0003\ufffd\u0017\t\u0019\ufffdl\ufffd$\u0007\ufffd\u0015fv\ufffd\ufffdB]\u0011Z\ufffd\ufffd!\ufffd.\u001f<\u000f 6T\ufffd\ufffd\b\u0011)\ufffd\ufffd\ufffd9\ufffdp7\ufffd\ufffd\ufffdP\ufffdu\ufffd\ufffdi\ufffd?\ufffd\u001e\ufffd\ufffdW\u007f\u0307\ufffd\u02f0\u0016\ufffdp=\ufffdq\ufffd\ufffd;p\ufffdy\ufffdG\u0010\ufffd\u001b\ufffd\ufffd\u0018*\r\ufffd0i\u0006\ufffd\u0010\ufffd'\ufffd\ufffd*9\ufffdV\ufffd\ufffdh(/\ufffd\ufffd\u0007%b\ufffd\ufffdWx\ufffdc0y5\ufffd`\ufffd8(\ufffd\u001b\ufffd\u001e\ufffd\rw\f\ufffd\ufffd\u001c\ufffd\ufffda\u007f\ufffd\ufffd\u0007c\ufffdD\ufffd\ufffd-7\u0746r\u00076b\ufffd\u0018\u000fY\u0005\ufffd5]\ufffd\ufffd757\ufffdxR_\ufffd\ufffd+M\ufffdZ\ufffd\u0004\ufffdy\ufffd\ufffdN\ufffd\ufffd\ufffdi#\u00107L\ufffd\u001c\ufffda\ufffd\ufffd\ufffd\n\ufffd\u000fr{d\ufffd\ufffd\ufffd\ufffdR\ufffdK\ufffd\u0010!\ufffd\ufffdPd\b\ufffdg@D\ufffd\ufffdF\ufffd74\ufffd\ufffd\\\ufffdp\u0018\u0012nl\u001d\ufffd\ufffd\ufffdR\ufffd\ufffd\ufffdgf\ufffd\ufffd^-^\u001a\ufffd\u0018\ufffd\rJ\ufffd\ufffdty\ufffd\ufffd\u0486XG/c\ufffd\ufffdZ\u000fK[/)\u0014}\ufffd\ufffd\u001e\ufffdXQ\ufffd\ufffdJy\ufffd\ufffd#\ufffd\ufffdJ\u0007\ufffd*\ufffd\ufffd%\ufffd*\ufffd\u0012\ufffdV\ufffdK%\ufffdP\ufffds%>S\ufffd_J|\ufffd\ufffd'J\ufffdS\ufffd\ufffd\ufffd\ufffdH\ufffd\u000f\ufffd\ufffd@\ufffd\ufffd\ufffd\ufffd\ufffd\u0012\ufffd)\ufffd\u0012\ufffd(\ufffd\u0012o)\ufffd\u0012o(\ufffd\u0012\ufffd)\ufffd\u0012\ufffd(\ufffd\u0012/)\ufffdG\ufffd\u0017\ufffdxA\ufffd\ufffdxN\ufffdg\ufffdxF\ufffd\ufffd\ufffdxJ\ufffd'\ufffdxB\ufffd\ufffd+\ufffd\u0012\ufffd)\ufffd[\ufffdG\ufffdxD\ufffd\ufffd\ufffdxH\ufffd\u0007\ufffdx@\ufffd]J4)\ufffdS\ufffd\ufffd\ufffd\ufffdO\ufffd\u001dJlW\u00a7D\ufffd\u0012^%\ufffdU\ufffd\u001e%\ufffdVb\ufffd\u0012[\ufffd\ufffdK\ufffd;\ufffd\ufffdC\ufffd\u06d5\ufffdM\ufffd[\ufffd\ufffdE\ufffd\ufffd\ufffd\ufffdI\ufffd\u001b\ufffd\u0622\ufffd\rJlV\ufffdz%\ufffdS\ufffdZ%\ufffdQ\ufffdj%\ufffdR\ufffdJ%\ufffdP\ufffdr%.S\ufffdR%\ufffd\ufffd\ufffd%JlR\ufffdb%6*\ufffdA\ufffd\ufffd\ufffd\ufffdP\ufffd\u0006%.P\ufffd|%\ufffd+\ufffdN\ufffd\ufffdJ\ufffdc\ufffdP\ufffd\u001e\ufffd\ufffd=B\u001d{\ufffd:\ufffd\bu\ufffd\u0011\ufffd\ufffd#\u0531G\ufffdc\ufffdP\ufffd\u001e\ufffd\ufffd=B\u001d{\ufffd:\ufffd\bu\ufffd\u0011\ufffd\ufffd#\u0531G\ufffdc\ufffdP\ufffd\u001e\ufffdP\tu\ufffd\u0011\ufffd\ufffd#\ufffd\ufffdG\ufffd\ufffdP\ufffd\u001f\ufffd\ufffd?B\ufffd\u007f\ufffd:\ufffd\bu\ufffd\u0011\ufffd\ufffd#\ufffd\ufffdG\ufffd\ufffdP\ufffd\u001f\ufffd\ufffd?B\ufffd\u007f\ufffd:\ufffd\bu\ufffd\u0011\ufffd\ufffd#\ufffd\ufffdG\ufffd\ufffdP\ufffd\u001f\ufffd\ufffd?B\ufffd\u007f\ufffd:\ufffd\bu\ufffd\u0011\ufffd\ufffd#\ufffd\ufffdG\ufffd\ufffdP\ufffd\u001f\ufffd\ufffd?B\ufffd\u007f\ufffd:\ufffd\bu\ufffd\u0011\ufffd\ufffd#\u0531G\ufffd\u04ceP\ufffd\u001d\ufffdN;B\ufffdv\ufffd:\ufffd\bu\ufffd\u0011\ufffd#\ufffdiG\ufffd\u04ce\ufffd\ufffd.E\ufffdv\ufffd\ufffd\ufffd`\u001b\ufffd\u033e\ufffd\t\ufffds\ufffdt\ufffd\ufffd\ufffd\u0000P=\ufffd\ufffdbZ\ufffdk\u001f\u0001Z\u0365UL+\ufffdV0-\ufffd\ufffd\f\u0001-\ufffd\u40962-a\ufffd\ufffd\ufffd\\Z\u0134\ufffd\ufffd\u000b|)CA\ufffd\ufffd1\ufffd\ufffd9L\ufffdL\ufffd}\ufffd\ufffdA\ufffd\ufffdf2\ufffd`\ufffd\ufffdT\ufffdk\ufffd\u0007\ufffd\ufffdR\u0015S%\ufffd4\ufffd\n\ufffdr\ufffd\ufffdLS\ufffd\ufffdd.Mb\ufffd\ufffdT\ufffdT\ufffd\ufffda:\ufffdi\u0002\ufffd\ufffd\ufffd\ufffdi<\ufffd8\ufffdb\ufffd\ufffdLc\ufffdF3\ufffdb\u001a\ufffdT\ufffd4\ufffdg-\u0004\u00152\r\ufffdYG\ufffd\ufffd1\u0015\ufffd\ufffdE\ufffd|\ufffdu$(\ufffd)\ufffdi(\ufffd\r\ufffdv.\ufffd\u001cn7\ufffd\ufffd\f\ufffdA\u001c9\ufffdi\u00007\ufffd\u03d4\ufffd\u050f\ufffd/S\u0016'\ufffd\ufffd\u051b\ufffd\ufffdb\ufffd\ufffd\u0503\ufffde2u\ufffdv\u07582\ufffd\ufffdL]\ufffd\ufffd0uf\ufffd\u0129\u04d9\ufffd8gG&\u0007S\u0007N\ufffd\ufffdd\ufffdv6\ufffd\ufffdL)L\ud62cL\u027e\ufffd\u0460\ufffdLI\ufffd\ufffd1\ufffd6L\ufffd\ufffdL`\ufffdgg\u001cS,S\f\ufffdY\ufffd\ufffd\ufffd\u0019\ufffd\u0014\ufffd\u0014\ufffdu\ufffdLaL\ufffd\\\u0017\ufffd\u0014\ufffd\u0014\ufffdk;\u0016d\ufffd\ufffd-\u0006\ufffd\ufffdtvj\\\u0012Ld\ufffdhf:j\ufffd\ufffd#\\\ufffd\ufffd\ufffd0\ufffd!\ufffd\ufffd\u000f\ufffd~b\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\u0012\ufffd\u0001_\ufffdx\ufffd\ufffd\\\ufffd\ufffd\ufffd[\ufffd\ufffd\\\ufffd\r\ufffd\ufffdf\ufffd\u01f4\ufffd\ufffdb\ufffd7;\ufffdd\ufffd\ufffd\ufffds\ufffd\ufffd8\ufffd_\\\ufffd\ufffdK\ufffdp\ufffdL\u001f3}\ufffdu\u001f2}\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001e\u04fb\u001c\ufffd\u000e\ufffd\ufffdfz\ufffd\ufffd\ufffdL\u041b\ufffd6\u0013@o0\ufffd\ufffd\ufffd\u05d8^ez\ufffd\ufffde\u000ey\ufffdi\u000f;_dz\ufffd\ufffdy\ufffd\ufffd8\ufffdY\ufffdg\ufffd\ufffd4\ufffdSLO2=\ufffd\ufffdw\ufffd|\ufffdK\ufffd1\ufffdfz\ufffd\ufffd\u001eaz\ufffd\ufffd\u000f1=\ufffd\ufffd\u0000\ufffd.\ufffd&\ufffd\ufffd\u0265\ufffd\ufffd\ufffdc\ufffd\ufffd\ufffd\u0757\ufffd\u0003\ufffd\ufffd\u0012'\ufffd\u001a\ufffd\ufffdL\ufffd2\ufffd\ufffdt7\ufffd6\ufffd\ufffdLw\ufffd\u0012\ufffd_\ufffd;9\ufffd\u001dL\ufffds\ufffdmL\ufffd2\ufffd\ufffdt3\ufffdML72ma\ufffd\ufffd\ufffdm\ufffd,\ufffd3]\ufffdu\ufffd2]\ufffdt5\ufffdU\ufffd\ufffdJ.]\ufffdt9\ufffde\\w)g\ufffd\u001b\ufffd%\\\ufffd\ufffd\ufffdb\ufffd\ufffdL\u001b\ufffd.\ufffd\ufffd\u000b\ufffd\ufffd\ufffdt\u0001\ufffd\ufffdL\ufffd\ufffd\ufffd\u0012*@k}\t\ufffd@\ufffd1\ufffd\ufffdK\ufffd\u0001\ufffd\ufffdt\ufffd/\ufffd\r\ufffd\ufffd%`3\u0016g\ufffd\u0012\ufffd\ufffd\ufffd0\ufffd\ufffd\u6af8\ufffdJ\ufffd\u0015\ufffd\ufffd*\ufffdrn\ufffd\ufffdi)\ufffd\u0012\ufffd:\ufffd\ufffdL\ufffd8\ufffdBn\ufffd\ufffdi\ufffd/\ufffd\u00124\ufffd\ufffd\ufffd\ufffd\ufffd9L\ufffdL\ufffd\ufffdf1\ufffd\ufffdv3\ufffd\ufffds\ufffdj\ufffdy5S\u0015GV2Mc\ufffd`*g\ufffd\ufffd4\ufffdoz2\ufffdl\u0012\ufffdD\ufffd\ufffd2N]\ufffd\u0017\ufffd0\ufffd\ufffd\u075d\ufffd\u0017rs\ufffd\u0012\ufffd\ufffdL\u360a}\ufffd.\ufffdX_\ufffd\ufffd\ufffd\u0018_\ufffd\ufffd\u07a3}\ufffd\ufffdF\ufffd\u2ec1FrH\u0011\ufffd\b_<\ufffd\u0005\ufffd\ufffdK\u00d9\ufffd\ufffd\ufffd\ufffd\u0017\ufffd\u0006\ufffd\ufffd_\u000f\ufffd\ufffd\u015f\u0005\ufffd\ufffd\ufffd\u05c3\ufffd\ufffdb\u000b@C\ufffd\\L9L\ufffd}\ufffdx\ufffd\ufffd3\ufffd4\ufffd\u0017S\n\u001a\ufffd4\ufffd\u0017#\ufffdF\u007f\ufffdl_\ufffd0P?_\ufffd\u0007\ufffd\ufffd\u0017S\u0006\ufffd\ufffd>L\ufffd}1\u0019\ufffd^\u001c\ufffd\ufffd\u0017#o\ufffd\ufffd/F\ufffd\ufffdL\ufffd\ufffd\u073c\u001b_!\ufffd\ufffd\ufffd\u027a2u\ufffdd\ufffd\ufffd:1\ufffd3\ufffd\ufffdb\ufffd(udrp\ufffd\u000e\ufffd3\ufffd\ufffd\ufffd9\ufffd\ufffd\ufffd=\ufffdKaj\ufffddeJfj\ufffdL\u0006%\ufffd,S@m|\ufffd\ufffd\ufffdD\ufffd\u0004\ufffdx\ufffd8\ufffdXn\u0010\ufffd\r,\ufffdf\ufffdb\ufffdd\ufffd\ufffd\ufffdp\ufffd\fcg(S\bS0S\u0010G\ufffd9\ufffd\ufffdN\ufffdIc\u0012L\ufffdj\ufffd\ufffdf\ufffd8\u001a]i;\u0012]e\ufffd\u0019\ufffd0p\b\ufffd\u000f|?\ufffd\ufffd#\ufffd\u0003p\u00108\u0000\ufffd\ufffd\ufffdw\ufffd\ufffd\u0016\ufffd\ufffd\ufffd7\ufffd\ufffd\ufffd>\ufffd\ufffd\u0002_\ufffd\ufffd\ufffd(\u007f\t|\u0001|\u000e|\u00165\ufffd\ufffd\ufffd\ufffd\u0019\ufffdO\ufffdO\ufffd\u007f\u0002\u001f\ufffd\ufffd\u0011\ufffdC\ufffd\u0003\ufffd}\ufffd\ufffd\u0001~\u000fx\u0017x\u0007x;r\ufffd\ufffd\ufffd\u021e\ufffd7\ufffdoD\ufffd\ufffd^\ufffdL\ufffd\ufffd\u0006\ufffd\n\ufffdJ\ufffd\ufffd\ufffd2\ufffd\u0012\ufffd\u0007\ufffd/\ufffd\ufffdB\ufffd\u001c\ufffd\ufffd\ufffd\ufffdA?\u000b\ufffdL\ufffd,\ufffd\u04d13mOE\u03b0=\u00199\ufffd\ufffd\u0004\ufffd\ufffd\u001d\ufffd\u001e\u0007\u001e\u0003\\\u037b\ufffd\ufffd(\ufffd\b\ufffdp\ufffd\u0002\ufffdC\u0011\u000bm\u000fF,\ufffd=\u0010\ufffd\u0636\u000bh\u0002v\ufffd\u007f?p\u001f\ufffdv\ufffdn;|>\ufffd\u0011\ufffd\u0002\ufffd\ufffd/\ufffd\ufffd\u0013\ufffd\ufffdvw\ufffd*\u06f6\ufffd\u0576\ufffd\ufffdklw\u0001w\u0002w\u0000\ufffd\u0003\ufffd\u0001\ufffd\ufffdw\ufffd\ufffd\u0002\ufffd\u0019\ufffd\tmn\u0004o\t\ufffdm\ufffd\u0001z3\ufffd\ufffd\ufffdu\ufffd\ufffd\""\ufffd5\ufffdu5r]\u0005\u07d5\ufffd\u0015\ufffd\ufffd\ufffde\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0012\ufffd\ufffd\u00146\ufffdvq\ufffd\u0018\ufffd\u01b0\ufffd\ra\ufffd\ufffd.\n\ufffd\u0776VO\ufffd\ufffd\ufffdg\ufffd\ufffd\u0015\u0676s\ufffd\ufffd\uecf7\u05bb\ufffdr\ufffdv\ufffd\u067a\ufffd\u001d\ufffdZ\ufffd\ufffd\ufffd\ufffd.Z\ufffdr\ufffd\ufffd\ufffd\ufffdv\ufffd\u0006\ufffd\ufffdr\ufffdp\ufffd\u073a\u00bd\u073d\u053dl\ufffdR\ufffd\u0003\ufffd:\ufffd\ufffd\u05ba\u0006\ufffd\ufffdl\ufffds\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\u0007\ufffd\ufffd\ufffd:\ufffdW'z\ufffd\t\ufffd\ufffd,u\ufffd:=b\ufffd{\ufffd{\ufffd\u0585nZ8va\ufffdB\ufffdB\ufffd@\ufffd\u008f\u0016j\ufffdP\ufffd55\ufffd\u07be\ufffd\u06be\u0000\ufffdZ\ufffd0\ufffdR\ufffd\ufffd=\ufffd=\u007f\ufffd<\ufffd\u071a9\ufffdY\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0019[\ufffd\ufffdk\ufffd\ufffd\ufffd\ufffd[\ufffd\u0715\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\u0653\ufffdS\ufffdNvO\ufffd.sO\ufffdZ\ufffd.\ufffd\ufffd\ufffd\ufffdD\ufffd\ufffd\ufffd\u0012\ufffd{k\ufffd{|v\ufffd{\ufffd\ufffdb\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd.r\ufffd\ufffdZ\ufffd\u001e\ufffd=\ufffd]\ufffdu\ufffd{Xv\ufffd;\u001f7O\ufffd,\ufffd\ufffd\ufffdt\ufffd\ufffd\ufffd\ufffdv\ufffd\tY\ufffd\ufffd\u001eV\ufffd\ufffd#\ufffd~\ufffd\ufffd\ufffd^\ufffdn\ufffd\u001e\u001b\ufffdlK\u05baD\ufffd\u0015\ufffdc\u068aym\ufffdj{q[=:\ufffd$\u0355\ufffd%\ufffd \ufffd\ufffdKm>l\ufffdM\u001bS\ufffd\ufffdM\ufffd\ufffd\u0005\ufffdhI\ufffd'\ufffd\t\ufffd\ufffd\u0012G\ufffd\u0014\u0018\ufffd\ufffd\ufffd\ufffd3\u02f8W[\ufffd#\ufffd :AD'\ufffd\u0012\ufffd\ufffdo\u0012\ufffd:\u0485]\b\u0012\u0016\ufffd\u001e\ufffd\ufffd\u001d\""\ufffdV\ufffd?,\ufffd\u001f\n4\ufffd\u0010\ufffd\ufffd\ufffdY\ufffd\u0014B\u32bc!c'z\ufffd\ufffd\u07b4\ufffd\ufffd\ufffdU\\\ufffd\r:\ufffdK\uec89\ufffdF!6\ufffd\u001a\u007f&\ufffd\u001b/\ufffdP\ufffdQ^\ufffda\u0003\ufffd\f-\ufffd\ufffd\ufffd\ufffd-[R\ufffd\ufffd\u0016y\ufffdv\ufffd\f\ufffd,5!\ufffd\ufffd9eQ\ufffd\""\ufffd\ufffdu\u0006\ufffd|\u0014\ufffd?FOx\ufffd\ufffdE\ufffd\ufffd\u0016\ufffd\ufffd\ufffd\u045a+\u001a\ufffd\ufffd\ufffd\ufffdEi\ufffd9JwE\ufffd\ufffdW\u0010\u001di\ufffd\ufffd\ufffdGs\ufffd\ufffd\u8284G\ufffd_\ufffd\ufffd\ufffd%\u0005\ufffd\ufffdp\u035d\u0013>&\\s\ufffd\ufffd\ufffd\u0016\ufffd\u00bb\ufffd(\ufffd\ufffd}n\ufffd\ufffd\ufffdWv.\ufffd\ufffd\ufffd)\ufffd\u0016;\ufffd_\ufffdJE\ufffd,:\ufffdW\ufffd.Z\ufffd\ufffd\ufffd\ufffd3\ufffd\ufffd\ufffdU\ufffd0\ufffd\ufffdE\ufffd\ufffd\u02b9\ufffd\ufffd[\ufffd\ufffdn\ufffd\ufffd\ufffd\ufffd_\ufffd\ufffdO\ufffd\fi\ufffd\u03a3*\ufffd\\\ufffd\u001c\ufffdl\ufffd\u001e8\u000bX\u0003\ufffd\u0006V\u0001+\ufffd\u0015\ufffdr`\u0019\ufffd\u0014X\u0002\ufffd\u0001\ufffd\ufffdE\ufffd\u0002`>0\u000f\ufffd\u000b\ufffd\u0001j\ufffd\ufffd\ufffd,`&0\u0003\ufffd\u000e\ufffd\u0000\ufffd@\u0015P\tL\u0003*\ufffdr`*0\u0005\ufffd\fL\u0002&\u0002e@)\ufffd\u0001\ufffd\u0004&\u0000n\ufffd\u0004\u0018\u000f\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\u0018`40\n\u0018\t\u0014\u0001#\ufffdB`80\f(\u0000\ufffd< \u0017\u0018\n\f\u0001\\@\u000e0\u00188\u0003\u0018\u0004\f\u0004\u0006\u0000\ufffd\ufffdl\ufffd\u001f\ufffd\u0017\ufffd\u0002\ufffd\u0000\ufffd\ufffd^@O\ufffd\u0007\ufffd\tt\u0007\ufffd\u0001\u0019\ufffd\u0013\ufffd\nt\u0001:\u0003\ufffd\ufffdt \r\ufffd\b8\ufffd\u000e@*`\u0007l@{ \u0005h\u0007X\ufffdd\ufffd-\ufffd\u0004\ufffd\u0001\u0012\ufffd\u0004 \u001e\ufffd\u0003b\ufffd\u0018\ufffd\u0002D\u0003Q@$\u0010\u0001\ufffd\u0003a@(\u0010\u0002\u0004\u0003A\ufffd\u00190\ri\u01a7\u000eh\ufffd\u0000\ufffd\ufffd\u0004|\ufffd(p\u0004\ufffd\u00198\f\u001c\u0002\ufffd\u0003\ufffd\u0004\ufffd\b\ufffd\u0000\u001c\u0004\u000e\u0000\ufffd\u0003\ufffd\u0001\ufffd\u0002\ufffd\ufffdo\ufffd\ufffd\ufffd}\ufffd^\ufffd+\ufffd\ufffd\ufffd\ufffd\ufffd\u0017\ufffd\ufffd\ufffdg\ufffd\ufffd\ufffdO\ufffdO\ufffd\u007f\u0002\u001f\u0003\u001f\u0001\u001f\u0002\u001f\u0000\ufffd\u0003\ufffd\u0000\ufffd\u0003\ufffd\u0005\ufffd\u0001\ufffd\u0006\ufffd\u0002\ufffd\u0004\ufffd\u0000^\u0007^\u0003^\u0005^\u0001^\u0006^\u0002\ufffd\u0000/\u0002/\u0000\ufffd\u0003\ufffd\u0001\ufffd\u0002\ufffd\u0000O\u0003O\u0001O\u0002O\u0000\u007f\u0007\u001e\u0007\u001e\u0003v\u0003\ufffd\u0002\ufffd\u0000\u000f\u0003\u000f\u0001\u000f\u0002\u000f\u0000\ufffd\ufffd&`'p?p\u001f\ufffd\u0003\ufffd\u000e\ufffd\ufffdF\ufffd\u000b\ufffd\u000b\ufffd\u0003\ufffd\rl\u0003\ufffd\u0002w\u0001w\u0002w\u0000\ufffd\u0003\ufffd\u0001\ufffd\u0002\ufffd\u00007\u00037\u00017\u0002[\ufffd\u001b\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd5\ufffd\ufffd\ufffdU\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffde\ufffd\ufffd\ufffd\u07c0K\ufffdM\ufffd\ufffd\ufffdF`\u0003p\u0011p!\ufffd\u0000\\\u0000\ufffd\u000f\ufffd\u0007\ufffd\u0001k\ufffdjH\ufffd\ufffd\ufffd\u0017X\ufffd\u0002\ufffd_`\ufffd\u000b\ufffd\u007f\ufffd\ufffd/\ufffd\ufffd\u0005\u05bf\ufffd\ufffd\u0017X\ufffd\u0002\ufffd_`\ufffd\u000b\ufffd\u007f\ufffd\ufffd/\ufffd\ufffd\u0005\u05bf\ufffd\ufffd\u0017X\ufffdb!\ufffd=@`\u000f\u0010\ufffd\u0003\u0004\ufffd\u0000\ufffd=@`\u000f\u0010\ufffd\u0003\u0004\ufffd\u0000\ufffd=@`\u000f\u0010\ufffd\u0003\u0004\ufffd\u0000\ufffd=@`\u000f\u0010\ufffd\u0003\u0004\ufffd\u0000\ufffd=@`\u000f\u0010\ufffd\u0003\u0004\ufffd\u0000\ufffd=@`\u000f\u0010\ufffd\u0003\u0004\ufffd\u0000\ufffd=@`\u000f\u0010\ufffd\u0003\u0004\ufffd\u0000\ufffd=@`\u000f\u0010\ufffd\u0003\u0004\ufffd\u0000\ufffd\ufffd/\ufffd\ufffd\u0005\u05bf\ufffd\ufffd\u0017X\ufffd\u0002k_`\ufffd\u000b\ufffd}\ufffd\ufffd/\ufffd\ufffd\u0005\u05be\ufffd\ufffd\u0017X\ufffd\u007f\ufffd>\ufffd\u0017\ufffd\ufffd?\ufffd\u0003\u007fq\ufffdE\ufffdZ\u001c\u0324%M\ufffdBD\ufffd\ufffd\ufffd\ufffd^\ufffd\ufffd\ufd4c\ufffdY\ufffd\ufffd\ufffd\ufffd6\u0425\ufffd(\ufffdG\ufffd\ufffd\\\ufffd\ufffdi\u000b\ufffdFw\ufffd\ufffd\u001e\ufffdg\ufffd\ufffd\ufffd[2\ufffdiG\ufffd\ufffd\ufffdP\ufffd\ufffd\ufffd\ufffd(\ufffd\ufffd\ufffdP\udbba\udcf7\u0001M\ufffd\u0016\ufffdKQ\ufffd3\u064f{\ufffd-\ufffd_\ufffd\ufffd\ufffd\ufffd\ufffd\u0356\ufffdMA\ufffd\u0014f\ufffd\ufffd\ufffd^\ufffd\ufffd{q\ufffd\ufffd\u0010^\ufffd(7\ufffd\ufffdem=t\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdG\ufffd=z\ufffd\tcPLe4\ufffd&\ufffdd*\ufffd\n\u073f\ufffd[f312\ufffd\ufffd\ufffd\ufffd\ufffd\\\ufffd4\u0017u\ufffd\ufffdY\ufffd\ufffdTDa{1\ufffd\ufffdy4\u001fXH\ufffd\ufffd\ufffd\ufffd\ufffdg>\ufffd\""\u007fI\ufffd-0\ufffdu\ufffd\u0014?\ufffdh9\ufffd\ufffd\ufffd\ufffd\ufffdV\ufffd?\ufffd\u001a\ufffdU\ufffdYa\ufffd\ufffd\u0001k\ufffd,<\ufffd\ufffd\ufffd\u001cC)f\u03f9t\u001e\ufffd\ufffdS[O\ufffd\ufffd\u0005\ufffdZ\ufffd\ufffd\ufffdj\ufffd\u000b\ufffd\""<\ufffdt\ufffd)\ufffd\ufffdV\ufffdM\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdp\u0019]NW\ufffdU\ufffd\u0017\ufffd\ufffdu'x\ufffd4\ufffd\ufffd\ufffdf\ufffd\u0001sF\ufffd]\u000e\ufffd\r\ufffd\ufffd\ufffd\u000f\ufffdSt\u001f\ufffdC\ufffd\ufffd\ufffd\ufffdXVb\ufffdxD\u0538\ufffd\u0018c8\u001fc\ufffd\nwxn\ufffd\u001e\ufffd\ufffd-=6Zkp\ufffd\ufffd\ufffd\u001a\ufffdw\ufffd\f\ufffdsZ\ufffdX\ufffd\u001fG\u0019y.\""9\u000b?\u0007\ufffde\ufffd\t#\ufffd\t\ufffd\ufffd\ufffd\ufffd\u001dq\ufffdr\ufffd\ufffd\ufffd{[\ufffd\u02afy\ufffdx\\\ufffdbd\ufffd5JR\ufffd\ufffd=\ufffd\ufffd\ufffd\ufffd\ufffd\n\ufffd\u0011\ufffdrT\ufffd\ufffd\t\ufffd\ufffd\r\ufffdn\ufffd\ufffd|,v\ufffdQ\ufffd\ufffdn\ufffd[\ufffd,n7\ufffdb\ufffd\ufffd\u0006};\u0741\ufffd}\u0017m\ufffdm\ufffd9\ufffd[*\ufffd{\ufffdn\ufffd\ufffdy\ufffd\ufffd|\ufffd\ufffdv\ufffdI\ufffdO;\ufffd\ufffd\ufffd\ufffdZ\ufffd\ufffd\ufffd\ufffd\ufffd~\ufffd1\ufffd.z\ufffd\u001e\ufffd\fy\ufffdvc\ufffdy\u001c?\ufffd\ufffd0|\ufffd\ufffd\ufffdO\u0018>.?N\u007fGYFq\ufffd)z\u001a;\ufffds\ufffd<\ufffd@/\u0453(\ufffd1>\ufffdA\ufffdez\ufffd^\ufffd\ufffdD$\ufffd+\ufffd%>\ufffd\ufffd\ufffd\ufffdO)\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\u0018\ufffd\ufffdh\nM\ufffdo\ufffdn'\ufffd9\ufffd\u0012hK\ufffdO\ufffdK\ufffd\u007f\u0487S\ufffd(\ufffd\u0001r\u001b\ufffd\ufffd\u000e\ufffd\b\ufffd\ufffd\ufffd\u001e\ufffd\u00146\n3\ufffd\ufffd\ufffdiG\ufffd\u000f\ufffd$p\ufffd#\ufffdg\u001c\ufffd\ufffd\ufffd\u001b2c\ufffd\\\ufffd\ufffd\ufffd]N\ufffd`\ufffdO\ufffdh4]\ufffd]\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001f|l\ufffdvOL\ufffd\ufffd\ufffd\u001f\ufffd\ufffdq\ufffd\u001eVW|r\ufffd\ufffdZ4\ufffdr\ufffd\ufffd\u04836\ufffd\ufffd19\ufffd\ufffd+\ufffd6\u01e5\u0005o\ufffdE\ufffd\ufffd\u001cg\ufffd\u001e\ufffdL\ufffd\u001e'\ufffd8{\ufffd,\u00151\ufffd1\u0006\u28f4\ufffd\ufffd\ufffd G\ufffd\ufffdZV\ufffd\ufffd\ufffd\ufffd{\ufffd\u001a\ufffde\ufffdIwt\ufffd\ufffd\f_\ufffd\ufffd\ufffd\u0006\ufffd{\ufffd\ufffd\ufffdx\ufffd\u0019\ufffd\u0272\ufffd_\ufffd\ufffdL\u001fs$H[\ufffd\u0219\ufffd\ufffd\ufffd>9:>2\u022c\ufffdK\ufffd\ufffd6(\ufffd2~b\u06a0\ufffd)\ufffdzp\ufffdn\u000e\t\ufffd\ufffdoh\ufffd\ufffd\ufffd\ufffd\u000e\ufffd\u0006\u01e4$$\ufffd\u0106\ufffd\u0126$&\ufffd\ufffd\u0004\u001fy\ufffd\u001cu\ufffd;s\ufffd\ufffd\\S\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdr:\ufffdW\ufffd\ufffdh\ufffd\ufffd\ufffd\ufffd\ufffdIm\ufffd\u000eL-\ufffd\u0010\u001dg1\ufffd\ufffdYb\u0012C\ufffdcc\"":\ufffdM:\ufffd.\ufffd\ufffd\ufffd\ufffd.!\ufffds\u001d\u0019\ufffd\ufffdt4\u001f2\ufffd1\ufffd\u001b\u007fS\ufffd\u001fr\ufffdwQ\ufffd\ufffd/vDX\ufffdHG\ufffd_\ufffd75\ufffd\ufffd\u0011\u000e\u0011\ufffdD\u0018\ufffd+Y\ufffd4\ufffd\ufffd\ufffd4>#\ufffdOWg\ufffd&\ufffd3\ufffd\u0168\ufffd\ufffd\ufffd\ufffd\u0003\u0011\ufffd\u0011I\u001dR\u001ca\ufffd\""\ufffd\u0014A\u0011\ufffd\b\ufffd^\u01e3\ufffd\ufffd\u001c\ufffd#\ufffd\u0011\u0011\ufffd2.\ufffdmvSNNNl\ufffd\ufffd\ufffd\ufffd\ufffd'\u01f4\ufffd\u001f\u0003\u0019\ufffd\u06f2\ufffdWL\ufffd=\ufffds\ufffd\ufffd\ufffd\ufffdtZ]\ufffd2\""\ufffd@m\u02dc-\ufffd$\ufffdD\ufffd\ufffd8\ufffd\u0005\u000f/-11\ufffdxb\ufffd\ufffdT=JwtHO\ufffd\ufffdO\ufffdcj\u0013\ufffd\ufffdSMu!\u0092f\ufffd\ufffd\u0145\ufffd\ufffd\u001d\ufffdl\ufffd\u001e\u0016\ufffdh\ufffd\ufffd\u0016-B\ufffd\ufffd\u0014\u0676S{{\ufffd\ufffd(\ufffdJ\ufffdx\ufffd\ufffdDk\ufffdI\u000f\ufffd\b\u0015\u0003\ufffd>\u001b\u001a\u0019j2GY\u0013M\ufffd\ufffd\u0010]\u000f\ufffd\u000e\ufffdpd%f\ufffd6\""\ufffd\ufffd\ufffdnON\u02a6\u001f\ufffd\u063a\ufffdmI\u00161\ufffdf\ufffd\ufffd\u001f\ufffd\ufffdH\ufffd\ufffd\ufffd\u001d#%\ufffd\u02fb\ufffdsr\ufffd\u000b\ufffd\t.\ufffd'$\ufffdg\ufffd\ufffd\f\u0019\ufffd!\ufffd3dp\ufffd\f\ufffdx\u0000_\ufffd\ufffdy\ufffd}\u0414\ufffd\u001b\ufffdi;\""\ufffd\ufffd\ufffdG\ufffd9\ufffd\ufffd\u001f\ufffdG\u0018\ufffd\ufffd\ufffdp\u025a\ufffd\u0015\ufffd%|w\ufffd\u0016\ufffd\ufffd\ufffd@\u03de\ufffd\u001d\ufffd\ufffd\ufffd\ufffd\ufffdO\ufffd\bo\f.\ufffd\ufffd}9\u018a\ufffd/2'\u007fl\fy\ufffd\u05dd,\ufffd\np\ufffdg-\u0017PXr\ufffdN\u0007j\ufffd\ufffd\""s\uca35\u0014\u0007\ufffd,\ufffdZ\ufffd\ufffd\ufffd\ufffd1\u001a\ufffd\ufffdk&>\ufffd\ufffdH\ud41e\u0015\u04e7o\ufffdT\ufffdu\ufffd\\<\ufffdu\u0467\ufffd\ufffdp\ufffd\u0215\u0013w\\\ufffd\ufffd-{L\ufffd\u00a3\ufffd\ufffd\ufffd\u04a5\ufffdH_|Ye\ufffdD\u742eY\ufffd\ufffd;\u001f=\ufffd\ufffd]6\ufffd\ufffdD\uee3emG\ufffd\r\ufffd]\ufffd\ufffd\ufffd@On\ufffdXt\ufffd\ufffdq\ufffd\ufffd&\ufffd:\ufffd\ufffd\ufffdd\ufffd(Y1\ufffd{\u0270\ufffd\u0630\ufffdqs5\ufffd92\ufffd\ufffd\ufffd\u024e\ufffdc\ufffd\ufffd?\ufffd3\ufffdv4\ufffd]\ufffdq\ufffdoMW4\ufffd7E\ufffd\ufffdc\ufffd1\ufffd\ufffd\ufffd\ufffdh\ufffd\ufffd?\ufffdN\ufffd(\ufffd\ufffd\ufffdQ\u0004\u007f-G\ufffd\ufffd\u001fE\ufffd#Zo\ufffdI\""\ufffdR)]d\ufffd\ufffd\u019b\u001e\u0014])\ufffdz\ufffd\ue361\u0013\ufffd\ufffd\ufffd\ufffdOBd\ufffdpY\ufffd|\u0002#\u0598\ufffd\ufffd$2\ufffd\u05e6\u01a57\ufffd\ufffd\u001d\ufffdq\ufffdLM\ufffd\ufffd\ufffd\u06ac\ufffd\u001e\ufffd?:\u0562%\u0006\ufffd\t\ufffd\ufffd\ufffd\ufffd\ufffdQA-v\ufffd\ufffd\u0004\ufffdN\""\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001c-9uM\u0011\ufffd9$\ufffd5ue\ufffd\ufffd/\u001e5\ufffd\ufffdW\ufffd\u029eUV`\r1\ub990\ufffd^c\u0016\ufffd\ufffd\ufffd\ufffd\ufffd_V\u5989\ufffd\u0016\u0015\ufffd\ufffd\u000e\u000e\u000b\ufffdwZ\ufffdb\ufffd\ufffdt\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd7\ufffd|\ufffd\u0004{WkT\\rl|\ufffd\ufffd\ufffdN\ufffd\ufffd\ufffd\ufffd=\ufffdj\ufffd\ufffdg\rI\ufffdL\u000f\ufffdi/\ufffd\ufffd\u0012\ufffd\\\ufffd\u0018s9\ufffdlt\ufffd1\ufffdSrRE\ufffd\ufffd\ufffdqr~\ufffd\ufffdc\ufffd\ufffdb1LqI\u0018\ufffd\ufffd\u0007\ufffd\ufffd\ufffdd\u001e\ufffdd\ufffd\ufffd&\ufffd\ufffde\ufffd\u007f^&\ufffdG4\ufffdA-\ufffdB1\ufffd\u0011\ufffd\ufffdbk\ufffdHo4\ufffd\\T#\ufffd\ufffd\ufffdw\ufffd\ufffd\ufffdQ\u0018\u0188\u001d\ufffdQ\ufffdf\u0019\ufffd5\ufffd\ufffd\u001bO5\ufffd\ufffdT\u000bn1\ufffd.\ufffdp\ufffd\ufffd\u06ce~mL\ufffd\ufffd;\ufffd\ufffd\ufffd\ufffd\ufffd>\ufffd\ufffdZwo\ufffd\ufffd\ufffd\ufffd%\ufffdmT\u7fb3i\u0016\ufffd\ufffd}\ufffdo\ufffdl\u02f6d\ufffdK\ufffdU^\ufffd\ufffdr\u001c\ufffd$\u000e!\ufffdI\ufffdd\ufffd\ufffd\ufffd$\rY\ni\ufffd\ufffd\u0005\ufffdR\u0002-\ufffd\ufffd\ufffd\ufffdr{{\ufffdh\ufffd\u0609)m\ufffd\ufffd^\ufffd\ufffdB\u001f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdr\ufffd\ufffd^\ufffd\u044aB{\ufffd\ufffd$\ufffd;\ufffd\ufffdH\ufffd\ufffd\u0000\ufffd\u0017\ufffd~\ufffdD\ufffd\ufffd\u035c\ufffd\ufffd-\ufffd\ufffd;g\ufffd\ufffd{7&\ufffd\ufffd\ufffd{\ufffd;\u00d2\u0001\ufffd~\ufffd\ufffd\ufffd6\ufffd\ufffd\ufffdw\ufffdo;\ufffd\ufffdR\ufffd\ufffd\ufffd\ufffd`\ufffdU\ufffd\u0013p\ufffdG\ufffda\ufffdN\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd8\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffdlJs \ufffd?\u0013\ufffd_\u000e\ufffd\u0010-\ufffd\ufffd7\ufffdP\u0018\ufffd\u001d\ufffd\ufffd\ufffd7\ufffd\ufffdF0\ufffd(\ufffd`z\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\u0000\ufffd\b,\ufffdB\ufffd\ufffd\u001a\u0001\ufffdA3DC\u0001GEz\ufffd\ufffd\ufffd\u05ce\ufffd\u0006D\\\ufffdx\u0001\u001f\u007f\ufffd!\ufffd\ufffdRj\ufffd\ufffd\ufffdC\ufffd\u0010\u04ec\ufffdU(\ufffdK\ufffd\u018f\ufffd \ufffdQ\u001c8^F\ufffdFI\ufffd\r\u000e\u0003+)\ufffd58L\u0006\u0007\ufffd\ufffd7sz\ufffd\ufffd`\ufffd3\ufffdZ\ufffdw@\ufffd\ufffd\ufffd\ufffd\u000f\ufffdU \ufffd\ufffd\ufffduP_'\u06ad\ufffd\ufffd\u001fXIL\ufffd\u001a&k\r\ufffd\ufffd\ufffd\ufffdZ\ufffdd\ufffda?\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\t3>\ufffd\ufffd\u000f\ufffd\u0100G#\u000b\u0006p\f}\b\ufffd|a\ufffd\ufffdGx9\ufffd\ufffd\ufffdU\ufffd\ufffd'\ufffd\ufffd&\ufffd3\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdY5\ufffdP0j\ufffd\ufffd\ufffd\ufffd\u0011\ufffdK\ufffd\ufffd[\ufffd\ufffd\ufffd]\ufffdc\ufffd\ufffd\ufffd\ufffd]\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdK\u001b\u0018\ufffd\ufffd\ufffdd\ufffd\u0001\ufffdW\u021e\u000f\ufffd+\u07ae\ufffdX`\ufffd\ufffd\ufffd\ufffd\ufffdc\ufffdQaCn\ufffd(\ufffdy\ufffd`\ufffd5t\ufffd\u001d \u001a\ufffd0\ufffd?9\ufffdg\ufffd\ufffd\ufffd5~\u0015\ufffd H\ufffd\u036c\u0010\ufffd\ufffd\ufffdc^\ufffd4I#\ufffd\ufffd\u000e\u001cX]\ufffd\ufffdx\ufffd\ufffd\u0017\f\u0016@\rt\u0006\u001d_3\ufffdA~\u0003\u0398\u00023\ufffdd\u001b\ufffd\u0007\ufffd\ufffdK\ufffd<\ufffd\ufffd\ufffd\u065a\ufffd\u065a\ufffd\u065a\ufffd\u065a\ufffd\u065a\ufffd\ufffd|\ufffd\ufffd\r\ufffd\ufffd\ufffdl\ufffdx\ufffd\ufffd\ufffd\ufffd\ufffdi\ufffdU\ufffd\ufffd\u0016\ufffd\ufffd<\u000f\ufffd\ufffd\ufffd\ufffd)q\ufffdOZ+X\ufffd\ufffd\u0006\ufffd\ufffd_\ufffd\ufffd\ufffd\ufffd\ufffd0r\ufffd\ufffd\ufffd(\ufffds\ufffd[\u001c\ufffd\uc20e\u0000\ufffdk\ufffd~\ufffd\ufffd\ufffd\ufffd\ufffdmm\ufffd&\u0016\ufffdF\ufffd\ufffd\u001a\ufffd\ufffd>\ufffd1\ufffd\u000btCw\ufffdV\ufffdV\ufffdh\ufffd\ufffd\ufffdJ\t\ufffd\ufffdR\t\ufffdR\ufffdh\ufffd\ufffd\ufffd\ufffdl\ufffd\u0012 \ufffd\ufffd\ufffd!\ufffd\u036a\ufffd\ufffdjkhO\ufffd\ufffdgE\ufffd\ufffd\ufffd\u001b\u0000\ufffdH\u0000\u0005\u0014r\""\ufffd\u0015\ufffd\ufffd\u0011\ufffdl\ufffd&\u0012\ufffd\ufffd\ufffd\u0001zyY\u0019\ufffd\u0005!\ufffd\ufffd7\ufffdC:\u0002\ufffd\t\u001e\ufffd\u0017,\u001a\ufffdJ\ufffdL\ufffd\u0004\ufffd(H\ufffdt\ufffd5y\u0004\ufffd\ufffd\ufffd\u0012\ufffd\u0004\ufffd2\ufffdLf\ufffdIE\ufffd\ufffd8k\ufffd\n6\ufffd\ufffd\ufffdrl\ufffd\u01826\u000e\u07ed\ufffd\u000f\ufffd\uc790\ufffdU\ufffd0\ufffd\u0017|`\ufffd\ufffd\u00cc\ufffd!)\ufffd\u0005\u0000u|\ufffd\ufffd\ufffd\ufffdA\ufffd\ufffd\ufffdqn\ufffd|\ufffd])\ufffd8\ufffd\ufffd,a\u0000\ufffd!\ufffd\ufffdb\ufffd\ufffd,\u0019\ufffd\ufffdL\ufffd\ufffd\u047bN~\u05e0\ufffd\ufffd\ufffd\ufffdM\ufffd\ufffdMH\ufffdneMM\u001c\ufffd=n\ufffd\ufffd\u0017pb\\\ufffd\ufffdG\ufffd\ufffd8|D\u00072I\u016c\ufffd\u001bQ\u0004\ufffd+K\u0001j!\ufffd\ufffdT/(\ufffd\ufffd\ufffd\u000f\ua37e\ufffd_=\ufffd\ufffd_\ufffd\ufffd\ufffdw\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdR\ufffd\\\ufffd\ufffd\ufffdn\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0738\ufffd\ufffd\ufffd\u0103_?wd|\ufffd\ufffd\ufffd\u001e}\ufffd\u001f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0739\uc6bb\ufffd\ufffdp\ufffd3w\u000e\\s\u03cf\u0011\ufffd\ufffd\ufffd\u0001\ufffd<\ufffdu'V\ufffd}\u0013e\ufffd -O\ufffd\ufffd\ufffdJ\ufffd\ufffdM\ufffd\ufffdM\ufffdS\ufffd\ufffd\u0011Yy\u0017T\ufffd\u000b*\u0425Wk\ufffd\u000b\ufffdd\u0017\ufffd\ufffd\ufffde\ufffd\ufffd\u0018M\ufffd\ufffd\ufffdT\ufffd\ufffdCj\ufffd\ufffdra(\ufffdXi\ufffd\ufffd\ufffd\ufffds\""8\ufffd\f\u03df\u0015\ufffd\u0000`b\ufffd\u001a\u0010\ufffd\ufffd\""\ufffd\u0002\ufffd*\ufffd\u001a\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd9\ufffdO\ufffdq\ufffd\u048e\ufffd+\u00076m\ufffdV\ufffd5\ufffd\ufffdU}\ufffdk\ufffd6\ufffd\u0006\ufffd\ufffd\ufffd=rCK\ufffd\ufffd\ufffd\ufffdd\u0018k\ufffd\ufffd=\ufffd\ufffd\ufffd\ufffd\ufffd\u03d4\ufffd'$\ufffdP*\ufffd\ufffd\u0006\ufffd\u001b\ufffd\t\ufffd\u0014\ufffd\ufffd\ufffdod\ufffd\ufffd\u001a\ufffd\\\u001b\ufffd\\\u001b\ufffd\ufffd\u001b\ufffd\ufffd4\u0002k9Q\u0001+\ufffd\ufffdv\u001e*\f\u001c\ufffd\u0002yY\ufffd\ufffd\ufffd@^V \u000f\ufffd\ufffd:k\ufffd^\u001c\u07d6\ufffdS)k+\ufffd\ufffd\ufffdo\ufffd*\ufffd=\ufffdJ`IpIE\ufffd\u0004\n;Z\ufffd\ufffdC\ufffdD0\ufffd\u0007G\u001e\u0017\ufffd\ufffd-\ufffdU@!\u0605\ufffd\u001a\ufffd\u0012\ufffdY\ufffdnR\ufffd\n\ufffdF\ufffd\u0005\ufffd\u000b\ufffdC\ufffd\u0002oS\u0466\ufffd\ufffd\ufffd3\ufffd\ufffd\ufffd\ufffd\ufffdk\ufffdw\u0014\ufffd\nx\ufffd\ufffd\ufffd\ufffd\u07bfcY8\u0439&\u9b6b.7\ufffd\u0532\ufffd\ufffd\ufffd\u02c5\ufffd\ufffd}\ufffd\ufffd\ufffd\ufffd\ufffd\u0007\ufffd \u0007BNm\ufffdh{\ufffd\ufffdo\ufffd\ufffd~\""\ufffdQ\ufffd\ufffd%+g\ufffd:6\f6\ufffd\ufffd\ufffd\ufffde\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffdg7Y\u0019:\ufffd\ufffd5/\u0007\u00110}!GN\u0000_]\ufffd\ufffdK\ufffd\ufffd\u0003\ufffd\ufffd:P\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd!\u01ff\u000eY\ufffd\u001d\ufffdDU*\u0012O\u0019Mx6\ufffd\u0002l!\u0018\u000f\ufffd\ufffd\u000e\u001b\u001c\ufffd\ufffd\u01e1\ufffd\ufffd\u00170\ufffd\u0001\ufffds\ufffd\ufffd\ufffd\ufffd9\ufffd\u0003\ufffd\ufffdg\ufffd\t\ufffdIz?\ufffd\ufffd\ufffd,\ufffd\ufffdy\n\u000fc\ufffd\ufffd\u0012\u000f\ufffdT\ufffd\ufffd\u0011oL\ufffd\ufffdx\ufffd\ufffd;(\ufffd\ufffdo\ufffd--\ufffd\u0011\ufffdu8\u0014\u0015#\u0016\ufffd\u06b2\ufffd\u0003\ufffdr\ufffd\ufffd\ufffd\u000fQ,b\t\ufffdX\b\n\ufffd5p_\ufffd\ufffd+\u0001\ufffd>!\""\ufffd\u0015P\ufffd\t\u0011\ufffdU@\ufffd\ufffdP\u0001FGd\ufffd\u000bA\ufffdZDj\ufffd$\ufffd\ufffdB\ufffd&'\ufffdv\u007fk\ufffdcf\ufffd\u066a\u0002\ufffd\ufffd\ufffd&\ufffdo\ufffd[2\ufffd\u0015\ufffd\u000fo\ufffda\ufffdp\ufffdy\ufffd}\ufffdDF\u0007Z\ufffd4E\ufffd\ufffd\ufffdQE\ufffd\u01da\u001a\ufffd\ufffd\ufffd\ufffd#\ufffdo\ufffd<\ufffd\ufffd\ufffd\\w7(\u0012\ufffd~[\ufffd\ufffd\ufffd20\ufffd\ufffdqy\ufffdqYsm\ufffd\ufffd\ufffdC\ufffd\ufffd\ufffd\ufffd\t\u001e\ufffd\ufffd\ufffd\u0019\r\ufffd\ufffdq\u0006\\\ufffdXgY\u00f2\ufffdx\ufffdud;\ufffdG:\u0010\u007f~\u0003\ufffd\u030f\u001d@\ufffd\u0556\u0002\u0000\ufffdx\ufffd\ufffdYH\u0002?v0\ufffdD\ufffd\u0007e9\ufffd3\ufffd0\ufffd\ufffd\u001fs\ufffd\ufffd&\u000eH\ufffd;H\ufffd\ufffdF\ufffd'\ufffd\ufffd\ufffd\ufffd.x\u01ac\ufffd*D\ufffdx\ufffd\ufffdYp\u0010_!\ufffd\""\u0012\ufffd\u001b\ufffd\ufffd\u000f\u00178.8\ufffd\ufffd:y\u001bb\ufffd'\ufffdN\ufffd=\ufffd\ufffd\ufffd\ufffd\ufffdgy\ufffd\ufffd(u{\ufffd<\ufffd\u00072\ufffd\u001e\ufffd\u0003#\u061cT\ufffd]_\ufffd{a\ufffd\ufffd\ufffdh\ufffdf\u916c\ufffd\u000b-\u0012>\ufffd\ufffd\ufffd\u0014 \ufffdX\ufffd\b_\ufffd\u0015c\u0016Y\u0015\u0016Y\u0015\u0016Y\u0015\u0016Y\u0015\u0016Y\u0015\ufffd\u001f\u0011z\ufffd\ufffdA\u001e\u000f\u0353\u0003\""\ufffd\ufffda\ufffd\ufffdc\ufffd&!\ufffd\ufffd\ufffd\ufffdT$RB\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd[0\ufffd\ufffd\ufffd|\ufffd\ufffd-M\u0017\ufffdfjO\u03c1\ufffd][~xs7 Ev@\ufffd\u066a\ufffd]K\ufffdw\rE\ufffd\ufffd|\ufffd4\ufffd\ufffd\ufffd'\u000ft\ufffd\ufffd9\ufffd\ufffd\f\u00144u\ufffdo\ufffd\u000f][]\ufffd\ufffd\ufffd(i-\ufffd\t \u0002\ufffde\ufffd\ufffd\naAP)l\ufffd:\ufffd\ufffdY\ufffd\ufffdf\ufffd\ufffdS\ufffd5\ufffd\u0005\ufffd\ufffdB\ufffdy\ufffd\u0019\u0010\ufffdP\ufffd\ufffd2\ufffd\ufffdZmpM\u00196*6J\u001d\ufffdh\ufffd7$q!j;u\u001a\ufffd\ufffd!i\ufffd\ufffd^:\ufffdLF\u000fF\ufffd\ufffd\ufffd\u000bc\ufffd\ufffdU4\u0002\u0006-jY\ufffd}\ufffd\ufffd\u0015\ufffdZV\ufffd1\ufffd>\ufffd\ufffdXr4\ufffd\u001a\ufffd\ufffd\u01a0\ufffd\u0015\ufffd\u0012,\ufffd\ufffdR\ufffd\ufffdn!`3\ufffdX\ufffd\ufffd\u000f\ufffd\r-\u0016\ufffd\ufffd\""i5\ufffd\ufffd3\ufffdfI\ufffd\ufffdi&\ufffdUi\u0019\u0012'\u0015\ufffd\ufffd\u000e\ufffd\ufffd\ufffd\ufffd\u0005^\ufffdMy\ufffd\ufffd4\ufffd\u01a1\ufffdS\u0004\ufffd\ufffd0\u000fa9\u0006\ufffdR\ufffdD+\ufffd\ufffd\ufffd\u001e\ufffdcm-S\ufffd\ufffd~2\ufffd.\ufffd\ufffd\ufffd{t\ufffd488\ufffd?\u001d\ufffdz\ufffd\ufffd\ufffd?\ufffdVQ\ufffdk\ufffd~\ufffdI\ufffd+\ufffd\ufffd?V\ufffd\ufffd\ufffdl\ufffd\ufffd\ufffd\ufffd3\u0473b\ufffd#\ufffd?L\ufffd\ufffd\t/\u001f\ufffdye\ufffd1\ufffd\u0010\ufffd\f$\ufffd\u007f5W\ufffd\ufffd\ufffd\ufffd\\\ufffd\ufffd\ufffd\ufffd\ufffdh\u001c\ufffd\ufffd\ufffd\ufffd\ufffd\t\u0017\ufffd\ufffd[\ufffd\u0013\ufffd\ufffd]>\ufffd1\ufffd\ufffd\ufffd=\ufffd\u0011\ufffdn\ufffd\u05b2\ufffd]\ufffd\ufffd\ufffd\u0003M\ufffd\ufffd\u04ce\ufffd|\u007f\ufffd\ufffd\u0196\u007f\ufffd\u0012i\ufffdQa\ub177\ufffd[\ufffd\u0018V\ufffdm\ufffdZ8j\ufffd@I\u07d6R\ufffd-g\ufffd\ufffdv\u0017\ufffd\ufffd\ufffd\ufffd\u0006\u0010\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdZ\ufffd\ufffdj\u001e\ufffd?\ufffdl\ufffde\ufffdX\u000e\ufffd\ufffd\ufffdy\n6\u007f\ufffd\ufffd,gE\u0017\ufffd\u0006(E~\ufffd\ufffdx_\ufffde\ufffd\ufffdGE0\u08be\u000fU\u00b9\ufffd+\ufffd}\ufffd[Y{\ufffd\u04b1F\ufffd\ufffd-\ufffd\ufffd\u0003\ufffd\ufffd\ufffdh_\ufffd\ufffd\u0003\u011eQ\ufffd\ufffd\ufffdR\ufffd;\ufffd\ufffd\ufffd+w/m\u001dm-\ufffd\u042c\ufffd\ufffd\ufffd\ufffdg\ufffd9\ufffd\ufffd/\ufffdp\ufffds/\ufffd\u0767w\ufffd\ufffd\u0001\ufffd\ufffd\u03b3\ufffd\ufffd\ufffdq\u00c3c\ufffd\u001f\ufffdL\ufffd\u0003n\u001a\u0014_\ufffd\ufffd\u0015\ufffd\u0003V\u0000\ufffd=mR7\ufffdH$aK\ufffd0\ufffd8\ufffdvF;\ufffd8\ufffd\ufffdP \ufffdRS]\ufffd\ufffd\ufffd\u0011\ufffd\ufffd\n\ufffd\u0019Q\ufffda1\ufffd\f\\\ufffd+C\ufffd[z\ufffd\u03fet\u0016\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd|\ufffd\ufffd\ufffd}\ufffdN\u001f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000e\t\ufffd\ufffd\u06de\ufffdy\ufffd\ufffd\rM\ufffd\u07aa\ufffd\ufffd\n\ufffd\u0006\u079f\u0016\ufffd_\u0015\ufffd\ufffd\u0415\u00017f\ufffdF\ufffd\u0011\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd5\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\u0004\ufffd\ufffd\ufffdUAVi\f\ufffd\ufffd!\ufffdF\ufffd\ufffd\ufffdf\ufffd\u0006^H\ufffd\u0018\ufffdU\ufffdO\ufffd\u0014\ufffd\ufffd\u03ff\u000e\ufffd@\u0018\u0018\u0015C\ufffd\ufffd3\ufffd\ufffd\ufffd\r\ufffd\nv\ufffd\ufffd\ufffdC\ufffd?\ufffd\ufffdEu\u0003m3\ufffd|\u0018\ufffd\ufffd`\u0010tl\ufffdEFo7\ufffd\ufffd\u007f\ufffd\ufffd\u000bhf\u0017> \ufffd\u00063\u000b`\ufffd\ufffd\ufffd\u0014<\ufffd\ufffd\ufffd\ufffdR90\ufffdCq\ufffd\ufffd\ufffdY\ufffdu\ufffd\u0002\ufffd\ufffd\ufffd\u44c5i\ufffdx\ufffd\u0019\u0011\ufffd\ufffd\u038a\ufffdE\u0515^|\ufffd\u0017\ufffd0\ufffdm\ufffd.\ufffd\u0007\ufffdF\ufffd\ufffd$\ufffdt\ufffd^\ufffd\bC\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffdYV/\u0018\rvp\ufffd\u05f0\ufffddY\ufffd\ufffd>\ufffd\u000f\u07bbx\ufffd-\ufffd-*\ufffd\ufffd\ufffdm\ufffd^t\ufffdu6\ufffdL\u0016V\ufffd\ufffd'\ufffd\ufffd\ufffd\ufffd\ufffdw\u0005\u0005\ufffd\ufffd)\ufffd\ufffd\ufffdi\u0013\ufffd\ufffd#\ufffdM2B\u0010\u001b\ufffdc@\ufffd\ufffd\ufffd\u0268\ufffd\ufffd\ufffd\""\u001a\ufffd\u0004G\u030aM\ufffd18\ufffd\u0018\ufffdT\ufffd\n\u048e\ufffd\u0530\ufffd&\r\ufffd|`!y\ufffdJ\ufffdf\ufffd:\ufffd\ufffdZ\ufffd[\n\ufffd\ufffdt\ufffd\u066d\u0655w\ufffd\ufffdk\ufffd\ufffd\ufffdP\u037a\ufffd_\n\u0018\ufffd\ufffd\u0016\ufffd\ufffd\ufffd-\ufffdfe\ufffd-/\u0735t\ufffd\ufffd\u0017\ufffdu\u0778\ufffd\u0464$\ufffd2:\ufffd\ufffd\ufffd\ufffd\u0572\ufffd\ufffdk\ufffd?\ufffd\ufffd\ufffdb\ufffd\ufffd\u0000>\b)\ufffd\ufffd\ufffd'L.\ufffd`7\ufffd\ufffdw=\ufffd\ufffd\ufffd_\ufffd;h\ufffdx\ufffd\u001e\u0019[\ufffd\ufffdCX\u0014[\ufffd\ufffd\r\ufffd\ufffdk\u05a0\n\ufffd<\u0002f\ufffd\ufffd\n\ufffd\u0000\ufffd]\ufffdBP1\u001c\ufffd\u0010>V9\ufffd\u000eJq\ufffd\u04b4\ufffd\ufffd\ufffdP\np\ufffd\u0017S<$\u007f\u00da\u0001\ufffd^\u0013\ufffdw\ufffd\ufffd\u0001\ufffd\u0019\ufffdH\ufffd\ufffd5\ufffd\ufffd\u001f\u0019\ufffd\ufffd&\ufffd\u032c\ufffd\ufffd\ufffd\ufffd\ufffdM\ufffdc\ufffdoE;\ufffd\ufffd\ufffd^8\ufffdg\ufffd\ufffd\ufffd\u0019\ufffd\ufffd\ufffd\ufffdW\u00033S\ufffd\ufffd\\\u0000\ufffdp\u0002\ufffd\u007fWl\ufffd\ufffd\u0017\ue143w\u0000\ufffdx\u0007\ufffd\ufffdi\u9206\ufffd\ufffd\u0283+\ufffdQ|\ufffd\baO\ufffd\ufffdD\u0013!\u001e\ufffd\u001a\ua177\ufffdoR\ufffdWZ\ufffd\u0016\ufffd\ufffd\ufffd\u0006\ufffdl06+6I\u001d,\ufffd>\u0002S\ufffd%\u0007\""\ufffdbS\ufffdy\ufffd\u0011\r\ufffdo\u0697\ufffd\ufffd\ufffd\ufffd\n\u0017\ufffd\u0019\ufffdE9\ufffd59\ufffdvw\ufffdU\t\ufffde\ufffd{\ufffd,^\ufffd\ufffdeU\ufffdJ\ufffdR\ufffd:\ufffd\ufffdg\ufffd:\r\u001flN\u0011\ufffd-\ufffd<\ufffd^\ufffdo\ufffd]\ufffd\nwi\ufffd\ufffd3\ufffd)`\ufffd\ufffd#\u0506B\ufffd\r\u07a5f\ufffd\ufffd\ufffd\u001e\u0015\ufffd\r\u000b-6\ufffd2\u001d6\ufffdz]\ufffdc\n\u00161\ufffd\ufffd\f\ufffd'\b|\ufffd|\ufffdp\ufffds\ufffdcx\ufffd\ufffd\ufffdb\nD\ufffd%\ufffdfx\u0007\ufffdU\ufffd\ufffd0P\u0185\u0014\ufffd\ufffdD\ufffd\ufffd\ufffd\ufffd:%\ufffd\u001f\ufffd\ufffd\ufffd'\ufffd-*\ufffd\u0015\ufffdtm\ufffd\ufffd&Y\ufffd\ufffd\ufffd\r\ufffdV\u062a\u0006\ufffd\u0263j0\ufffd\ufffd\ufffd\ufffdB\ufffd\ufffd\u2397\ufffdk>\ufffd\ufffde1+\ufffd\u0018\ufffd\ufffd*x\r\f\ufffd\ufffd\ufffd\n\ufffd\ufffd\ufffd\u0006\ufffd\ufffd?D0\u0006\ufffd x\fL\ufffd&z\ufffd|6\u000e\ufffd\ufffd\ufffdZ\ufffdU8\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd>w\ufffdZ\r`\ufffd\ufffd\ufffd\ufffdX\ufffd\ufffdy\ufffd\u0017\ufffd\ufffd\ufffd\ufffd\u0011?sW\ufffdU^\u007f\ufffd3\ufffd\u0006\ufffd4cY\ufffd>\u0003|\ufffd\ufffdI\ufffd\ufffd\ufffd_\ufffd4\ufffd\ufffdaJUi\ufffd\ufffd\ufffd \ufffdT\ufffd\ufffddJU\ufffd\ufffd\ufffd\u0002Y@\n\ufffd>\ufffd\u001beB|\ufffd\ufffd\u0642\ufffd\u05da\ufffd!\u0017\ufffd$\ufffd\ufffd\ufffdwxB\ufffd\ufffd\u001b\ufffda\u001c'p\ufffdwZl.8\ufffd\ufffd\ufffd\ufffd\u0133\ufffd\u020a\n\u0002\u0007\ufffdh\ufffd\ufffdjs\ufffdt\ufffd\ufffd\ufffd\ufffd\u0011\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd>\ufffd\ufffd\ufffd\ufffd\u0395\ufffd\ufffd\ufffd\ufffd\ufffd\u0437\ufffd\ufffdW\ufffdXY\ufffd\ufffd\ufffdJ}a\ufffdn\ufffd/\ufffdEuSq\u0509\ufffd\ufffdy?\ufffd\ufffd\ufffdf\ufffdNn\ufffd\n\ufffdG\ufffd\ufffd\ufffd\ufffd\ufffd<\ufffd\ufffd=\ufffd\ufffd\ufffdQ\ufffdH7+\ufffda\ufffdHWt\ufffd\ufffd\ufffd4\ufffd\ufffd\ufffd\ufffd{\ufffd\ufffd\ufffd\ufffd\ufffdy\ufffd\ufffd{w\ufffd\ufffdO\u001d\ufffd\ufffd\u0774j\u055e\ufffd\ufffd\ufffd\u001f\ufffd\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffdy\u07f2\ufffd\ufffd\u007f~\ufffd\ufffd\ufffd]\ufffd}\ufffd{V\ufffd/\ufffd\ufffdf\ufffd\u001f\ufffd\ufffd\ufffd\ufffd\u035d\ufffd\u001e\ufffd\f\u0005 \ufffd\u0019X\ufffd\u000b\ufffd\ufffde\u0012K\ufffd\ufffd\""L\u0018\u000fn\ufffd\u0005@\u0187\ufffdU(\ufffde\ufffd'\ufffd\u001bK\u001b>\ufffd<\ufffd\b\ufffd\u0522P\ufffd\ufffd\ufffd\u0013\ufffd)\u001f\ufffd\ufffdM\n\ufffd\ufffd3An\ufffd\ufffd\ufffdg\ufffdp!\\\ufffdl\ufffd&\ufffd\ufffdm\ufffd.\ufffd?\ufffd\ufffdf\ufffdZ\ufffd\ufffd\ufffd\u6975\u0002\ufffd#\u0007\ufffd\ufffd\ufffd\ufffd+\ufffd\ufffdf\u0509eS}\ufffd\ufffd\ufffdB\ufffd\ufffd\ufffdi\uc5f0XC=\r\ufffd(\u00d2\ufffd\ufffd({r^>\u0004\ufffd\ufffd\ufffd\u001c1\ufffd\ufffdD\ufffd\ufffdSG\ufffd\ufffd-\ufffd\ufffd\ufffd\ufffdR\u0003LNJ\ufffdS\u029aRGf\u0016\ufffdg\ufffd x,\ufffdjx\ufffd1\u0011\ufffdkk?)%L0C\ufffdI\ufffd?\ufffdt\ufffdQb\ufffd\ufffd\u001ea\u000f\ufffd\""\u041e\ufffd\ufffd*~\ufffd\u0120\ufffd\ufffd\ufffd\ufffd\ufffd\u0013{\ufffd\ufffd\u0019\ufffd\u001a\ufffd\ufffd7uh\ufffd\ufffd\ufffd]Dq)x\u07d7\ufffd\ufffd1\ufffd\ufffd5\ufffd\ufffd\u0001k\ufffd\ufffd\u000b\ufffd8t\ufffd/\u0000\ufffd\ufffd?\u007f[\u05fe-\ufffd\ufffd5\u001df\ufffd\ufffd\ufffd_ux+@\ufffd\ufffd\ufffd\ufffd|El\ufffd\ufffdv\ufffd\ufffd\ufffd#\u0000\ufffd\u0004\ufffd\u0010\ufffdRlT\u0012\ufffd\ufffdZ}\ufffd\ufffd\ufffd\u000f\ufffd\ufffd\ufffd\u0011\u001d\ufffd9#\ufffdk\ufffd\ufffd\ufffd\ufffd{\ufffd\u7928T\ufffd=N\ufffda\ufffd\ufffd\ufffd5\ufffd\ufffd\ufffdH3\ufffd\ufffd\b\ufffd\ufffd&\ufffd\u0013\ufffds/\u07d8\n_\ufffd1U\ufffdC\ufffd@%%\ufffd\b\ufffd\bk.s:|f%\ufffdR\u0017\ufffdu\ufffdm(X\u0001 J\ufffd\ufffd?\u007f]\ufffdU\ufffd\ufffduT\ufffd\ufffd\ufffd\ufffd*\ufffd\ufffd\ufffdc\ufffd\ufffd\u0007\ufffdn[\u0016\u0017\ufffd\f\bF$\ufffdU\ufffd\ufffd\ufffd;j\ufffd\u000f\u0016\ufffd\ufffd\u0017>W\ufffdwC\u0007\ufffdR\ufffd*_,U\ufffd\u007f\ufffd\u0002\ufffdj\ufffd%\""\ufffd\u0010\ufffd\ufffdJ\ufffd^x\ufffd8\u0007\ufffd\u001f\ufffdM\ufffdK'a\ufffd\u000b\u0545\ufffd.\ufffd\ufffd?\ufffd\u0005\ufffdJ\ufffd\ufffdmg\\]\ufffd\ufffd4\b\ufffd\ufffdq\ufffd1f$\ufffd \ufffdk\ufffd\u0003\ufffd\ufffd\u0004\ufffd\u0006\ufffdM#%I\ufffd\ufffdH\u0012\ufffd\u0548\ufffdH\ufffd\u0019\u0011\r7\ufffd\ufffd\uda49\udd66\ufffd\ufffd'\ufffdV\ufffd\ufffd\u02152\ufffdty\ufffds\ufffd\ufffdw\ufffd$\u01b3\ufffdzFA\u0010\ufffd5\ufffd\ufffd{\u05f5Tg\u001b=\ufffd\ufffd\ufffdc\ufffd\u04d5uk\ufffdg*\ufffd\ufffdj\ufffd\ufffd{\ufffd\ufffd*Z\ufffd\u0013\ufffdT\ufffd\ufffd*\ufffdz\ufffd\ufffdt\u0015\u001e\ufffd\ufffd9Xep8\ufffd*\ufffdYor\ufffd8W\ufffde\ufffdh\u000eU\ufffdF\ufffd*\u0013=\ufffd:R\ufffd\ufffd*\ufffd\u0016A\ufffd\ufffdmz#\ufffdl\ufffd.\ufffd\ufffd,\u12b4\u0544\ufffd\ufffd\ufffdka\ufffdw\u0002\ufffdj\u0003\ufffd\ufffd\u015aP\ufffd\ufffd(`N\ufffd,:J\u000fr\ufffd1\u01e4r\ufffd\u072c9\ufffd\u03b3\ufffdGC9\ufffd\u0017\ufffd\""\ufffdf\ufffdGC_\ufffdE\u04e6\ufffd\ufffdOs\u0006\ufffd`\ufffd\ufffd\ufffd\ufffd\ufffdB\u0011@\ufffd\u0001\ufffd&\u007fW\ufffd;w\ufffd\ufffd\ufffd\ufffd,\u000f\ufffd\u0000\u0007\ufffd0\ufffd\ufffd\ufffd7\u0011\u007f\u000e\ufffd\ufffd\ufffd\ufffdj./a\u0004\ufffd\ufffdB\ufffd\u6521)\ufffd\ufffdc!\u0014\ufffd\u0017B\ufffd\u001c\ufffd\u0002\ufffdJ\u0016\ufffd\ufffd\ufffdm\ufffd\ufffdo\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd4\u0001\ufffd\ufffd}F6\ufffd3\ufffdL\ufffd\ufffd\ufffd\ufffdF\ufffd\ufffd\ufffd12\ufffd\ufffd;\ufffd\ufffdiIb\ufffd[\ufffdm\u0005\nq\ufffd\ufffduS\ufffd~PC\ufffd\""fJ8\ufffd\u000fh\ufffd\u0015p\ufffd~\ufffd\u001fU\u02d8\u0015\ufffd\ufffd_\ufffd\ufffdV\ufffd\ufffdj\u0006E@J\ufffd\ufffd\ufffd\ufffd,\n\ufffd\u000b\u001a@\u0002E]\u0011\ufffd%\ufffd\ufffd!'\ufffd\ufffd\ufffd\ufffd\t\ufffd=\u000b+c\ufffdPCC\t;\ufffd[,4C\ufffd@)\ufffd!\ufffd\ufffd\u04a6\ufffd\ufffd_\ufffd)]\ufffd\ufffd\t\ufffd\u0018\u0012\ufffd\u0013\ufffd\u0011p&\ufffd\ufffd\ufffd\ufffdP\ufffd[\u0696\ufffdU\ufffd\ufffdZ\u001c\u001a\ufffdm\ufffd\u0737\ufffd5J\r\ufffd8,\ufffd\ufffd\u001b/|@3\ufffd\ufffd[\ufffd=\ufffd/\ufffdE\ufffdj\ufffd%\u0016S\ufffd\ufffd\ufffdS\ufffd\u0016\ufffd\u0566)\u000b\u0004\ufffd\ufffdy\u0092\ufffdm\ufffd\u01a9\u02a9X@E\ufffd\ufffdt@q\ufffd3\u0012\ufffd\ufffd\ufffdc\ufffdK\u01c6\ufffdA&G\u0017\ufffd+\ufffd\\\ufffd\u0394\f\ufffd\ufffd\ufffd\u06580\ufffd\ufffd\ufffd\ufffd#8{\ufffd5Jc/w\ufffd#6\u0015\ufffd\u0007\ufffd\u0014\ufffd\ufffd\ufffd{\ufffd\u0011;P\ufffd\ufffdapC\ufffd\ufffd\ufffd\u0019\u0019\udabc\ude3f\ufffd\ufffd\ufffd\ufffdr\ufffd\r\f\ufffd>\ufffd\u001f$k\ufffdZ\ufffd\u0012\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\ufffdB\ufffd\ufffdHC\ufffds\ufffd#GT\u001a\ufffd\ufffd\ufffd;\ufffd/\ufffd1\ufffduX\ufffd\ufffd`Ol\u0007\ua265\ufffdHd\u0005%\ufffdFm\ufffd\ufffd\u007f\u0011\ufffda0>sj\u03d4\ufffd6L\ufffd\u0005\ufffd\ufffd\ufffd$\u007fu\u001a\ufffd\fQ.~UD\u0019_p\ufffdK&\ufffd\ufffd\u00168\ufffd\ufffd*\u0000\u0003\ufffd\u03ea\u0019]\ufffd\ufffd.3s\ufffd9\ufffd\u0000\ufffd\u0001\ufffd\ufffdL\ufffdP\ufffd\u000f\ufffd~\ufffd\ufffdL\fJ\ufffd.\u0015\ufffd\ufffd\ufffd/\ufffd*\ufffd\ufffdt\u0002D\ufffd\u001b\ufffd\ufffd2\ufffd\ufffd\u0015R\u0005\ufffd$\ufffd'\ufffd\u001d\ufffd\ufffd\ufffd\u001f\u0016\ufffd?A\ufffd\ufffd\ufffd@ L*C\ufffd\ufffd \u0015\ufffd\ufffd\ufffdpZn\u001e\ufffd\ufffd\ufffd\u0015\ufffdYs\""8M\u0011\ufffd<\u000f\ufffd\ufffd\u0014\u001f\ufffd\ufffd\u0003\u0018\u0015\u001aqxT\b\u000ff\ufffdPp@'\ufffdm\ufffd[=\ufffd\ufffd\ufffdX\ufffd\u0006\ufffdc\u07a7\ufffdC^F\ufffdj\ufffd\ufffd&Y\ufffd:\ufffd#0\ufffd\ufffd\ufffd\u0000jM\ufffd\u06e7\ufffdX\u001dF\ufffd%_\ufffd\b\ufffd\u03a4\ufffd\u0419\u0342\ufffd|\ufffd\u001f\ufffd\ufffd5\u0017rd;\ufffds\ufffd7\ufffdC6\ufffd\ufffduz:\ufffd\ufffd\ufffd\ufffd\ufffd\u05a9\ufffd\ufffd@\u001d\ufffd\ufffd\ufffd\ufffd\ufffdn\ufffd\u001e.B\ufffd\ufffd\ufffd\ufffdHi\ufffdpX\ufffd\ufffdj\f\ufffd\u007f\ufffd&y\r\ufffdI^\ufffdm\ufffd{\ufffd\ufffd\u001d-z4\ufffd\u0013l\ufffd\ufffd[\ufffd\ufffd\ufffd\ufffduD\ufffd3u8V\ufffd\ufffd\ufffd\ufffdtT\ufffd\ufffd\ufffd\ufffd_\ufffd\ufffd~?\ufffdz\ufffd\ufffd\ufffd\ufffd\u0015\ufffd\u0000\ufffdE\u000b{Z`\u000f4:\ufffd}\ufffdXa\u0001\ufffddd\ufffdXR\ufffd\ufffd\u0012\u0007\ufffd\ufffdv\u0311\u04a8\ufffdx\ufffd\ufffdY\u0011\ufffd\ufffd#\ufffd\u0016\u0011\ufffd\ufffd\u0016\n\u022cq\ufffd)\ufffd\ufffd\ufffd[_\u0011\ufffd\\[\ufffdd\ufffd\u000b\u0014\u001d\u0019\ufffd\ufffd6\r;\ufffd\ufffd\ufffd%\ufffd&Q/\u0013\u0019\ufffd\u0013\n\u0005>F\ufffdJ\u0016\ufffd$ \ufffd\ufffdN\ufffd\u0763m\ufffdo(\ufffdc\ufffd\ufffdm\ufffdw7\ufffd\ufffd\ufffd.K\ufffd\ufffd[Z\ufffdf\ufffd\u001c\ufffd8:WN\u05ed\ufffd\ufffd5\ufffd\u01fe\ufffd=\ufffd\ufffdvy\ufffdL\ufffdM\ufffd\ufffdi\ufffdzu{oY\ufffdtGv[_Yo\ufffd\ufffdz\u0007\ufffdH\ufffd^\ufffd\t.{\ufffde\ufffdZq\ufffd5'\ufffd\ufffd\ufffd\u0015\ufffd#\ufffd\ufffd\u0000\ufffd\ufffd\u0000F\ufffdRl\ufffd*\ufffdV\ufffd8\ufffd%\ufffd\ufffd\ufffd\ufffd5\u021d\ufffd\u0006\ufffd\ufffd\ufffd k\u001d\ufffd\u001fi\ufffda\u001e\u007f?\ufffd0G\ufffdp\ufffd\u000bw\ufffdA\u0014#\ufffdo\u001f\u0463\ufffdj\ufffd2\ufffdafeC\ufffd\ufffdR\ufffdT\ufffd8\u001e\ufffds\ufffd\ufffdIpxD1\ufffd\ufffd\u0005\u0000\u009a,\ufffd\ufffd/h~\ufffdqB\u001a\u0017\ufffd\u0003S\ufffd(\rU\ufffd\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\u0002\ufffdmM\ufffdd\ufffd\ufffd\ufffd\ufffd\ufffd\""E\ufffd\u0002\ufffdgx\ufffd\u0005Q\ufffd_%&\ufffd\u001d\ufffd,\ufffd\ufffd\r\ufffd\u0006\ufffd\ufffd\ufffd4\u0420\ufffd\u0003\u0005\ufffd\ufffd-\ufffd\ufffdd\ufffd\ufffd\ufffd9Z\ufffd\ufffd\ufffdne\ufffd\u06d6\ufffd\tw\ufffd\ufffdj[\ufffd(\ufffd\ufffdz\ufffd^>\ufffdTq\u0003+\ufffd\ufffdX\u0152B\ufffdr\ufffd?+\ufffd\u0004\ufffd\ufffdn\ufffd\u1b9e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdx\ufffd\ufffd\ufffd\u0456\ufffd}0\ufffd\ufffd\u0006:\ufffd\ufffd/`\ufffd\ufffd\ufffdP~w\ufffd54ic\ufffd\u001f\ufffd\r=o\ufffd\ufffdm\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd[\u0017\u0794\ufffdu\u0011\ufffd\ufffd&\ufffd\u0175\ufffd\ub794R\ufffd\ufffd\u0004\ufffdqb\ufffd\ufffdG\ufffd\ufffd\u0016\ufffd\u000fq\ufffd\fl\ufffd\ufffdG\ufffd\u0001\u0230\""9\ufffdR\ufffd@yR^XN\ufffd=\ufffd\ufffd$\ufffd\b%\ufffd\u0010\ufffd}\ufffd\ufffdE(d\u000e\n\u1814\ufffd\""7 Q-\ufffd\u000f\ufffd\ufffdF@Z\""V\ufffd\ufffdv\ufffd\ufffdP0BK\ufffd\ufffd\ufffd\u0007\ufffd\ufffd;\ufffd?tmd\ufffd\ufffd\ufffd\ufffd\u0444A\ufffd\u000b\ufffd\ufffdh\ufffd}\ufffd/5\u0592\\\ufffd\u001eQ\ufffd\u001d \ufffd\ufffd\u0017x\ufffdP\ufffd2\ufffd\ufffd\u001d\ufffd\ufffd\ufffd\ufffd\ufffd6\ufffd\ufffd~\ufffd\ufffdh3\ufffd=\ufffdr\u07c9'Fo]\u0015\tF\u0002\ufffd\ufffd%i\ufffd\ufffd\ufffd\ufffd&l\u0017v\nU&\u001b\u01876\ufffd\u07f0\ufffd5\u000ea\ufffdy\ufffd\u0331px\ufffd\ufffd\u0014~\u0006c\u0001+U\ufffd\ufffd\ufffd\ufffdL\ufffd\ufffdi\ufffd\ufffd\ufffdeSY\ufffd)\u06d4M\ufffd\ufffd\u0011\ufffd\u0324\ufffd\u0014S\ufffd\ufffd\u0003\ufffd\ufffd\ufffdg\ufffdY\u0001\ufffd\ufffdC\u0006\n+\ufffd\\{BZ\ufffd\u001c\u001b\ufffdkM\ufffd\ufffd\u0010\u007f\ufffd\u0529\u04fc\ufffdb\u2749\ufffd\u0119\ufffd\ufffd\ufffd\ufffdD`Y}\ufffdP\ufffdH\ufffdd\ufffd\u001b\""\ufffd\ufffd\u001a]@-\u0016\ufffd@\nH\ufffd\ufffd\u001a\u020e\ufffdE\""\ufffd\ti\ufffd\u0012D\ufffd1\ufffdb\ufffd2Niq\ufffd\ufffd\ufffd,|\u0010\n\ufffdD\ufffd\ufffd\ufffd\ufffd\u034b@\ufffdXC!\u0019.\ufffdL\u0754\ufffd\ufffd\u007f\ufffd\ufffd~?g\u00005\ufffd\ufffd\ufffdXc\ufffd\u06b6}=,jm\u0018YU@\ufffd:\ufffd\ufffd\u0011\ufffdFXi\u0292CI\u0019\ufffd\u0015\ufffd\b+\ufffdls\ufffd(B6%\u07bd\ufffd\\e\ufffd\ufffdj\ufffd\u001f\ufffdT\ufffd\ufffd\ufffd\u05d0\r\ufffdK[\ufffd\ufffd\ufffd\ufffd\ufffd+\ufffd\nz\ufffd\ufffd%t\u0003k\ufffd\ufffd\ufffdV\ufffd\ufffd\ufffd\ufffd\t\ufffd\ufffd\b\ufffd\u04d0\ufffdh\u001f\ufffdiy;\u001f\ufffd\ufffd\ufffd\u001e\t\ufffd\u0000\ufffd\u062c\u0017\fj\ufffd\u0309\ufffd\u1d9f\u0714d\u0018gWU\ufffd\ufffd\ufffd*\u0018\ufffdV#{\ufffd\ufffdi\ufffd\fv\ufffd\ufffdK|\u0016\u06fdi\ufffd\ufffdF\ufffdi\u001c\ufffd{2\u03e4T\ufffd\ufffd\ufffd \ufffd\ufffdm\n\ufffd\ufffdNc\ufffd\ufffd><8L\ufffd&S\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd}\ufffd3\ufffd\u0010!\ufffd\u0181\ufffd-\ufffdm\ufffd\u0000\ufffd\ufffd\u0007\ufffdrl/j0\u0000\u0003\ufffd\ufffd\ufffd\u0001*l\ufffd\ufffd\ufffd\tP\ufffd\ufffd\u0003\u0005\ufffdI\u001e\ufffd\ufffd]7\ufffd\u0019&\ufffdI\ufffd$0\u0002$\u007f\ufffd\ufffd\ufffd\""\ufffd\u008d\ufffd\u0012\u001a\u0011\\\ufffd\u0556\u0013\ufffdU\ufffd\ufffde@l\ufffd\u001e`\ufffdr\""\ufffd\u0014\ufffdU\u0000;\ufffd/\ufffd\u0006h\u000bE\ufffd@\ufffd\ufffd\ufffd\ufffda]h)A\ufffd\ufffd\ufffdXr^/\u660fm\u001eD\ufffd\ufffdTs\ufffd\ufffd\ufffd\ufffd\ufffd\u000eG^\ufffd9\ufffd\u05ff\ufffd\ufffdk\r:\u036c\ufffd\ufffdIF\ufffd\f\ufffd\u001d\u9254{\ufffd\ufffd@q\u001af\ufffdP\ufffdYQ\ufffdY#\ufffdc\ufffd\ufffd0\ufffd5eK\ufffdFRp\ufffdR\ufffd\u0007F2h\ufffd\ufffd\ufffd\ufffd\ufffdH\ufffd\ufffdpM\ufffd\ufffd\u03edX\ufffd\ufffdvc\u041bwo\u001f\u751cBk3\ufffd\ufffd\u001a\ufffd\ufffd)\ufffd\u07f1\u001e\ufffd\ufffd\u001b\u0004\ufffd\u0012\ufffd\ufffd2\ufffd\ufffdp\ufffd{+\ufffd\f\u0175\u0006\ufffd\ufffdL\ufffdP`*\r\u001a\ufffdL\ufffd\u0410{\\\u000fb\ufffd#\ufffd\ufffdX\bKb?F\ufffd\ufffd\ufffd\u078c\ufffd\u001cI\ufffd8\ufffdp=9\t\ufffd:$a\ufffdJ\ufffd\u0515\ufffd\ufffd\u0002\u00e2RD\ufffd\u02818*\u0007\ufffd\ufffdB\ufffdr \ufffd\ufffd\ufffd\ufffd4\ufffdzU\u0270\ufffd\ufffdV\ufffd\ufffdd\ufffd\u0003\ufffd:\ufffd\u001dPda\ufffd\ufffd\ufffd[\ufffdE\ufffd\ufffd\ufffd\ufffdR\u0016\u0006\ufffd\ufffd\ufffdY\ufffd\u05a7\ufffdcgE4\u0018\ufffdt(\ufffd-\ufffdO\ufffd2\b\ufffd\ufffd\u000b\u0005S1\f d\u001b\ufffdG\u0018\ufffdi\ufffdOU\ufffd\u001f\ufffdn\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0007oM1&\u000f\ufffdp\ufffd\ufffd]\ufffd\ufffdn\u0007\ufffd\f\ufffd\u000e_k\ufffd7,\u0014\ufffd\ufffd\ue055\u0003\ufffd\u001eY\ufffd\ufffd\ufffd\ufffd=]\ufffd\ufffd\ufffds\ufffd|\u000f\ufffdd\ufffd\ufffd\ufffd\ufffd\u000fN\ufffd\ufffd\ufffdU\u000b\ufffd;\u0006\ufffd\ufffd\u0010`v\u0011\ufffd\u000e{\u0013i\ufffd2\ufffd\ufffd\ufffd0\ufffd@\u001a!\u00170z\ufffd\ufffdk\ufffd\ufffd\n\ufffd$\ufffd\ufffd\u0695\u001e\u0015@\u001c\u000fd\ufffd3s\u0751\ufffd\""\u0004\ufffd\ufffd>\u0007\ufffdB\u001d%'BJ\ufffdw\ufffd\ufffd*\ufffd.\ufffd<\n\ufffd\ufffd\ufffdz\ufffd\u0000u/EwN\u0004\u0012\ufffd\ufffdrbA\ufffdb\ufffdbV\ufffdT\ufffda\u45a6\ufffdN\ufffdV\ufffd\u0004_\ufffd\f\ufffdM @@2\ufffdS\ufffd\u001a`\ufffd\ufffd\u0019\ufffd\ufffd\ufffdD\ufffd\ufffd\u06b6\ufffd\ufffd\u007fRJ\u0005O^\fL\ufffd\ufffd1\ufffd\ufffdD\ufffdUK\ufffd\f\ufffd\ufffd\ufffd*\ufffd2K\ufffd\ufffd\ufffd\u0018-\ufffd\ufffd\u0005\ufffd\ufffd\u058e\ufffdp\ufffd\ufffd\ufffdUK.G\ufffd\ufffdgI\u0012\ufffd'\ufffd\r7^\u0011\ufffd\ufffd\ufffd\u000e\ufffd\ufffd\ufffd\u0018\ufffdQ\ufffdJ\ufffd\ufffd6\u009b\u0765\u0603\u0019\ufffdG\ufffd\ufffd\u0011\u0787\u000f\ufffd<\nq\ufffd\ufffd?>\ufffdw\ufffd\u0004<\ufffd1\u03b4GT\ufffd\u001cp}\u07be\u0019\ufffd\u001f\ufffd'\ufffd)O\ufffd\ufffd\u0003\ufffd\u001f\ufffd<\ufffd\ufffd\ufffdw\ufffd\ufffd\ufffd\u0721\ufffdg\ufffd\ufffd\ufffd\ufffdfz\ufffd\ufffd*e\ufffd\ufffdi!LM\u0003\n\ufffdv\""\u0006J\ufffd\ufffd\ufffd\ufffdF\ufffd Gz\ufffd\""\ufffd\ufffd*YB\ufffdd\""\ufffd\ufffdD\ufffd\ufffdr\ufffd\ufffd\ufffd\ufffd}4s\ufffd#9\u0011^\ufffd\ufffd\ufffd\ufffdx\ud995\udeb4(-4\r\ufffd\ufffd\ufffdR*\u0011^P\u0018\u0249\ufffd\ufffd\ufffdJ\ufffd\ufffd \ufffdK\\^'\ufffd\bX\ufffdh\u0000\u0017\ufffdC\u6af6)\ufffd\u0015\ufffdK\ufffd&Y\ufffd\u0017f\ufffdg\u0005\ufffdC]\ufffdn\ufffd\ufffdm\ufffd\ufffd\ufffd\u0000\ufffdb\ufffdRh\ufffd\fXJ9\ufffd\u0014Pf%\ufffd\ufffd\ufffd\ufffd\u00cc\u0011\u0016b\ufffd\ufffd\ufffd\ufffd\ufffd,\ufffd\ufffd\f?\u0002A\ufffd\ufffdu?*\ufffd^^\ufffd\ufffd\n\ufffd\ufffd-\ufffdN\ufffd\u0012\ufffd\u0007\ufffd\ufffd5{\ufffd\ufffd}-\ufffd\ufffd\ufffd,\ufffd\ufffd\u001b\ufffd\ufffdJ\u024e\ufffdK\ufffdh}\ufffd29\ufffdU\ufffdQ\ufffdI\ufffdY?\ufffd8q\ufffde^j\ufffd+\ufffdt\u001dG\ufffd\ufffdc\ufffd\ufffd@\ufffd\ufffd\ufffd6*\ufffdi\ufffd\u0019`\ufffd\ufffdC\ufffd\u0016\ufffdi\ufffdH\u0010\ufffd\ufffd\u001a\ufffd\u0005\ufffd\ufffd\ufffd\u001a\ufffd\ufffdo\ufffd\ufffd\ufffd\u001a6\ufffd:=\ufffd\u0019\u0335\ufffd\u0006,\ufffd\\2S\ufffduf\ufffd(\u0018\ufffd&\u0005#\ufffd\ufffd\ufffdIhR\t\ufffd\ufffd'\u06d1s5\ufffd\u0013\ufffd\ufffd\ufffd\ufffd\ufffd\bG'\ufffd9\ufffd8\u07b6`\u001f\ufffd\ufffdU\u0000\ufffdS\ufffd\ufffd[\ufffd\ufffdz\u0006*\ufffd\u0003\u0014\ufffd\ufffd\ufffd\u0014*^\ufffdJ\ufffd\u000e\ufffd\ufffdO#]f\ufffd)I\ufffd\ufffd\ufffdd\ufffd\u0002?\ufffd\ufffd\ufffd-|&c@\ufffd \u0003l\ufffd\u001eA\u0018$\u0012\ufffdpA\ufffd\ufffd\ufffdj\ufffd\ufffd\u000b\u0006\ufffd\ufffd[\ufffd\u001b\ufffd\ufffd\ufffdt\u05d4\u0011\ufffd\ufffd\ufffdyc\ufffdxo87\ufffdn\ufffd\ufffd\rdZ\ufffd\ufffd\u0019!\ufffd8]I\u0307\ufffd[/%\ufffde\u001d\b\ufffd\u0001\ufffd1\u000bDlD2\ufffd\""\u00142\u0012\u0389@\f(%\ufffd\u0012A\ufffd\ufffd\ufffd0\ufffd,]\ufffdL\ufffd\ufffd\ufffd\u00fd\\@\u04b4\ufffd\ufffd\ufffd\ufffd\u0014k<\u0004\ufffd'\ufffd\ufffdr\ufffdv_\ufffd'|He\ufffdIC\ufffdT4\u02b8\ufffd)\ufffd;\u000fH\ufffd\ufffd\ufffd\u0017\ufffd0qx\u0012F\ufffdm##m\u0003\ufffd0\ufffdO<0Q\ufffd\ufffdx\ufffd\ufffdm\u0002\ufffdm\ufffd\ufffd\ufffd\ufffd\u02f3w\ufffd\u00d9{s\u0007z'G\ufffd\ufffd\ufffdf6g\u01f2\u0003\u0019\ufffd=\ufffd-\ufffd\ufffd\u00004'\ufffd}|o:\ufffd(\u0004o\ufffd\ufffdR\ufffd4p\ufffd\u000fg\u000e\u071b\u0013\ufffd\ufffd\ufffdr\ufffdb\ufffdv(\u001fDkx\u0005E:'*\ufffd\ufffdZ\ufffdHI\ufffd\ufffd84\u007ft\ufffd\ufffd\ufffd-F\ufffd\ufffd\ufffdeBr\ufffd\ufffd\ufffdk\ufffd\ufffd\ufffdX\ufffd\ufffd\b\ufffd\ufffd,\ufffd\ufffd\ufffd\ufffd\u0006\u0006\u0001\u001f\ufffdA\ufffd\ufffd\ufffd\ufffdS\ufffd\ufffd\u00d4\ufffdra\ufffdc4\n@;l\ufffdF\u0015\ufffd \ufffd\ufffd\u01ce\""?]\ufffd\ufffd\ufffd&\ufffd\ufffd\u066a\ufffd*\u0011\u042a\ufffd\ufffd\ufffd*\ufffd\ufffd\ufffdP\ufffd\u007fM5\ufffd{]\ufffd\u025b2:\ufffd\ufffdkgn\""\ufffd&\ufffd*\ufffd\ufffd\ufffd\u069b\ufffdue\u0012\u0642\ufffd\ufffdy\u000f\u0004\u0597\n*?-?\ufffd\ufffdK\ufffdR\ufffdM\u0005\ufffd\ufffd\u0014\ufffd5\ufffd3'BiKW\ufffdD(\ufffd+\ufffd\u0013\ufffd\u0012\u0017eB0\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdC\ufffd.\ufffd\u0013/\ufffdL\ufffd\u000eg-\ufffd\u030a0C^\ufffd\ufffd\ufffdQ>\ufffd)\ufffdP\ufffd\ufffdRe/\ufffd\ufffd:\u0000 U\u0010J\rc\u0010B\ufffd\ufffdf\u0000\ufffd\ufffdcCz%w\ufffd\\\ufffdD/\ufffdx\ufffd~\u06476`\u000f\""\u001f\u001a\ufffd}\ufffd\u0016\u0004\ufffd\r~\ufffd\ufffd\ufffd8\ufffd\u0616\ufffdl\ufffd\ufffd6M@\ufffd3\ufffde\ufffdx[.\ufffdY\ufffd\u00051\ufffd:\""\fJ\ufffd7.\ufffd\ufffd'\u0012\u0012\ufffd/\ufffdP\u000b\ufffd\ufffd9\ufffd\ufffdC\u001a\u000e\ufffd\ufffd,\u001b\u03c9@B\ufffd-'B\u0019\u0002\u0014rT\u0004R\ufffd\ufffd\u001a/@\n\ufffd\\\u0019Uy\u0017\ufffd\u010d?\ufffd\ufffd\tm\u001b\u0007M\u0015A\ufffdJA\u0012\u0014\ufffd\ufffd9\ufffd\ufffd\ufffdv\ufffd>\ufffd\u0017~pn\ufffd\u0391\u001a0\ufffdS\ufffd\ufffdz\ufffdC\ufffdpJc\ufffd\u04a5d\ufffdU\ufffdd\ufffd~\ufffd'\ufffd\ufffd\ufffdE>y\ufffd\ufffd\u06bb\u01e1\ufffdm\ufffd\u0003\ufffdf\u0000VC\ufffd?\ufffda\b\ufffd\ufffd\ufffd\ufffd\u001dk;\ufffdf\ufffd,O\ufffdww\ufffd\u073e\ufffd\ufffd\ufffd-\ufffd]:\u016e\ufffdTvU\ufffd\u001f\ufffd\ufffd\u0112\ufffd\ufffdL\ufffdB\ufffd#\ufffdB\ufffd2t/\u0015\ufffd)D\ufffd\ufffd\ufffd\""\ufffd\ufffd\ufffd\u0209P\ufffd-(>Jr\ufffd@\ufffd WB\ufffdBeie#\ufffdM\u8ad7\u0007Tq\u0005\ufffd\ufffd\ufffdn\ufffd\ufffd$\ufffd|\ufffd\u02de\ufffd@\u05f3U\u0005\u0005\ufffd\ufffd\ufffd\ufffd\u0005\ufffd#r=h\n\ufffdr\ufffd\u0014H\u0006\ufffd\ufffd\ufffd\uacfb\ufffd\u077a\ufffd\ufffdn9A^l\u0011/_\u001e\ufffds\ufffdL\ufffdPt\u0006\u001d4\u0014\ufffd\ufffd\ufffd\ufffd\u0513\u02ef\ufffd\ufffd%\ufffdE>\u00068\ufffdrl#\ufffd\u0017\ufffd'\u042b\ufffd\ufffd\ufffd\\\b@\u00131%\u0013\ufffd\ufffd^c\ufffd=\u001d\ufffd\ufffd\u0013!\ufffd(\u0004\ufffdb>f\ufffdh\u001e[\u001f.\ufffd\u00a7\ufffd\ufffd\ufffd\ufffd\u0014\ufffd\u000e|m\ufffd\ufffdh\ufffd\u001b\u0019\ufffdE=\u001e\u0015\ufffd\ufffd\ufffd\ufffd\ufffdh\ufffdVTc\ufffd\u001e\ufffdAE\ufffdzS-7\u0002EN\ufffd\ufffd3\ufffd\u5cbd\ufffd@K\ufffd7\u04d0-\ufffdh1\ufffd-\ufffdU*0\ufffdry9\ufffdyo\ufffd\u0006\n\ufffdR\ufffd\ufffd\ufffdD(\ufffd\ufffd%'\ufffdH\ufffd\ufffd\ufffd\u6eebR\ufffd\u0566\ufffd\u0005\n\ufffd\ufffd\ufffdBZ#YF\u001d\ufffd\ufffd\ufffd\ufffd\ufffd,^\ufffd\n2`\ufffd%\u0004U(\ufffdW_\ufffd_&\ufffd-b\ufffdR\ufffd\ufffdW\ufffd\ufffd\ufffd_x?\ufffdm\ufffd>XR\ufffd\ufffd\u0002\u0001\ufffdnjJ\u077b*\ufffd\ufffd\ufffd\u00e2W/\ufffd\ufffd\ufffd<>\ufffd\ufffd$2MM\ufffd\ufffd3\u0747\ufffds\ufffd\f\ufffd\ufffd\ufffdq)\ufffd\ufffd\ufffd\ufffd\u001d\ufffdx\u0012\ufffdh(<\u0012qd\u001c\t\ufffd\ufffdE\t\ufffd\ufffd\beX\ufffd9\u0011I\ufffd\ufffd\u0000Jb\""\ufffdw\ufffd\\\u0006\ufffd\ufffd\u0006l\u0001\ufffd\ufffd\\.\ufffd7_\ufffdpMo\ufffd+\ufffdu\ufffd\u0019\ufffd\ufffdY\u0005k\ufffd\ufffd\u0644W\ufffd?\ufffd\u0095BP\u0018\ufffd\u0006\u001f\ufffd3\ufffd^o\ufffdX\u029cf\u0006\ufffdDqzwE\u0512\ufffdL\ufffd\u021a+\ufffdd%\ufffd\ufffdvp\u007f]x\ufffd\ufffd\ufffd\ufffd*\ufffdr\ufffd\ufffd\n\ufffd\ufffd\ufffd\u001c]\u05bfc\u0019\ufffd\ufffdP\ufffd_\u0007^v/\ufffd\""\ufffdOmm\ufffde\ufffd\ufffd=\u0017^\ufffdF#j!\u06f4\u000f\ufffd\ufffd\ufffd\n]\ufffdR\ufffdUc\u0007\u007f\ufffd[\ufffd\ufffdHxOF\ufffd\ufffd\ufffdQ;\ufffd[\ufffd^\ufffd\ufffd\ufffd\u001a{ouh\u00f9\u068c/k\ufffd\ufffd\u000e\ufffd\bS\u0608\u0010_\ufffd\ufffd\ufffdR\u0015X\ufffd\ufffdwi\u0019\u0018\ufffd%\ufffd\ufffd\u0389Pvc&'\""\u9d60\ufffd\ufffd3\ufffd#\ufffd\ufffd\u0014w+\ufffd\u0017\ufffdg\ufffd9\u0003\ufffd*\ufffd\ufffd\ufffd0\ufffd:\ufffd\ufffd\ufffd9\ufffd\u0007\ufffd\ufffd;\ufffd\ufffd8\ufffd\u0016\ufffd6\ufffd3\ufffd93\ufffd\u0019iF\ufffd\ufffd\ufffd1z\ufffd\u07d2%\ufffd\ufffdSNb\u02cecK~&NB\u0012\ufffd\ufffd@\u0013\ufffd\ufffd\ufffd\ufffd$\ufffd.\ufffd\ufffd\ufffd\n\ufffd\ufffdn\ufffd\u0006\ufffd@\ufffd-\ufffd(\ufffd\ufffd\ufffd\ufffd\ufffd$)\ufffdw\ufffdwSni7\u0732\u0017hi\ufffd\u000f\ufffd\ufffd-\ufffd\ufffd\ufffde\ufffd-\ufffd\ufffd(\ufffd\ufffd33\ufffd\ufffd8\ufffd\ufffd\u001f\ufffdf4s\ufffd\ufffd\ufffd\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdj\ufffd\u0013\ufffdwO\f\ufffd\ufffd\\\ufffdM\u000f\ufffdD\ufffd\u0406|\u0104\ufffd\ufffd\ufffd\ufffd6\u001f\ufffd\u0002\ufffd\u0007\n\ufffd@- \ufffd!m\u0011\u007f\ufffd\ufffd\ufffd\u0006\ufffd\ufffd]\u05c8\u042b\ufffd\ufffd\ufffde\ufffde\ufffd\ufffd\ufffd\ufffd\ufffdRf\ufffdz\u001a\u0780O\u007f\ufffd\ufffd4\ufffd\ufffd\u0006\u06e1\ufffd\ufffd \ufffd}\ufffd\ufffd\u0018'\ufffd\u0001\u0019sh\ufffd%;\ufffdl~Cz#|\t\ufffdV0:\ufffd\ufffd{\ufffd\ufffd\ufffd\ufffdH\u04abZ\ufffd\ufffd\ufffd\u001bg\ufffdW\ufffd\ufffd\u0004\ufffdX2\t\u00160:\ufffd\ufffd\t\ufffdT+\ufffd\""\u06d4\ufffd-*\u03d4L\ufffdC\ufffd\ufffd\ufffdx\ufffd\u05ac\u000eYaJm\ufffd\f\ufffd\u0019=bsP\ufffd\ufffdmN\ufffdJ<|\ufffd\t\ufffd,\ufffd5\ufffdS\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd]\ufffd/W\ufffd\ufffd\ufffd\ufffdW\ufffd\ufffd\ufffd{%8\ufffd\u0006\u001b\ufffdb\ufffd\ufffd\ufffd\ufffd\u0015\ufffdB\ufffd\ufffd\u00022\ufffd8 \u0015\ufffd(f\t\ufffd\u0014/d\ufffd_F{A\ufffd\ufffd\ufffd\ufffd\u001a\ufffd\u007fZ5\ufffd\ufffd\ufffd\u07ee\ufffd\ufffdWR\ufffd\ufffd\ufffd\ufffd\ufffd_\ufffdv\r\u0007\ufffd{\ufffd\u001a\ufffd\ufffdB\ufffdz\u0015\ufffd$\ufffd\u067a\ufffd\u0001\u0012\ufffd,+D\u0014O0P\ufffd\ufffd\u001dj\ufffd&tu\""\ufffdsG\ufffdf\ufffd\ufffd\u001dP\ufffd\u0002m\ufffd\ufffd\u0012\n\ufffd\ufffd'\u0012fJ=\ufffd\u001e\ufffd\nwE\ufffd\ufffd\ufffdO\ufffdw~\ufffdcq\ufffdu\ufffd\ufffdzf2\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd>vC\ufffd\u0018j\t\ufffd\ufffd\u000b\ufffd@\ufffdm\ufffd]\ufffd\ufffd\ufffd\u0000\u0010%\ufffdV\ufffd9\ufffd<\ufffdw\ucf2e\ufffd\ufffdw\ufffd\u07f6\ufffd\ufffd\ufffd\ufffdp\ufffd#;{<\ufffd\ufffdH \ufffd)?\ufffd\ufffd\ufffdM>\u0652\ufffdGr$G\ufffdVmY\ufffd3\ufffd\ufffd%V\ufffd\ufffd\u0016\ufffd\ufffdju\ufffdF\ufffdVm\ufffd\u01e6\ufffd\ufffdn\u07d05\ufffdC\ufffdw\ufffd\ufffd\u0014\ufffd$\ufffd\ufffd\u0018\ufffd,_\ufffd\ufffd\ufffd%\ufffd\ufffdl*i\ufffd[\ufffdk\ufffd\ufffd6bH\u001f_\ufffd~@\ufffd\ufffd\ufffd\ufffd\ufffd\u0612V\ufffdE\u07040\ufffd\ufffdAdq4%}\ufffddW\ufffd\u0433\u05af\ufffd\ufffd\ufffd\ufffd\""\ufffda(\ufffdROFF\ufffd\ufffd\ufffd\n\u0694\ufffd\u007f,\u0007\ufffdy\u001e\ufffd\b\ufffd\t`j\ufffd3\ufffdn\ufffd\ufffdf\ufffd#\ufffd\u64a1\u001a\u0019\ufffd\ufffd\ufffdTi\u0015)\ufffd^\ufffd\""\ufffd\u0196\ufffda\ufffd\u0017\ufffd\ufffd\ufffd\ufffd\ufffd\u0014\ufffd\ufffd\ufffd\ufffdY}\ufffd\ufffd\ufffd\ufffd\u001d6=\ufffdK\u0426M\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\ufffd\u1861\ufffdf\u000eN\r\ufffd\u0019Ji\u059e\ufffd\f\u00b1\ufffd\u01f67\ufffd\u0016\ufffdI\u0010mF\ufffd'ouY\u076bv\ufffd\ufffdL\u0015\ufffd\ufffd\ufffd=\ufffdo\ufffd\ufffd\ufffd=CRlEj\ufffdAq$6\ufffd\ufffd\ufffd&\ufffd\ufffd5w\ufffdXiI\ufffdnAk\ufffd1(U~\ufffd\ufffd%\nJ>\ufffd\ufffd\ufffd6\ufffd\ufffd\ufffdVH\ufffdf\ufffd\ufffd\ufffd\ufffdI\ufffdj\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u7441\ufffdG6c\u001eY\ufffdyl8\ufffd\ufffdw\u001cQB\ufffd\ufffd\ufffdi\ufffdU{6;\u001c\u001d\ufffdo\ufffd\ufffd\u0019T\ufffds\ufffd8\ufffdak\ufffd\ufffd+\ufffd\ufffdd\r\ufffd\ufffd\ufffd0j\ufffd\ufffd\ufffd\u05e5\ufffds\ufffdW\u0017\ufffd\ufffd1\ufffd\ufffd\ufffdVV\ufffd\u001e\u001b\ufffd|\ufffd\u06abo\ufffd6\ufffd\ufffdi\ufffd\ufffd$q\u07e5?\ufffdut\ufffd\ufffd\u0013!\ufffd\t%CUd\""\ufffd7B\u026a\ufffd\ufffdHv+~\u007fcI\u013b\u0012\ufffd\ufffd49Kx\t\ufffd\ufffdR'\ufffd`\ufffdCP\ufffd\ufffd\u0002(\ufffd\u001f*f4\ufffd\u0012+\u0018\ufffd/\ufffdgT\ufffd\ufffd\uabe0\ufffd7s\ufffd\ufffd\ufffd\ufffd*WA\ufffd=\ufffdi^.L\u038a\ufffdC\ufffd) \ufffd\u0000=KacmZ\u045dA\ufffdu\ufffdP\ufffdj\ufffd\ufffd@sw:U\ufffd\ufffd\n\u0740\u001e\ufffd\ufffd\r\ufffdz\ufffd\ufffd9N\ufffd\ufffd\u0016\ufffd\ufffdvd\ufffdh\ufffd\ufffd\u001e\ufffd\ufffdDH\ufffd\u0014\u0005\ufffd\u0016\ufffd\u000f\u000f\ufffd\ufffd\u007f\u0014B\ufffdBl$\ufffdW\ufffd\ufffd[\ufffd09sjmr+* y\ufffd\ufffd\u0007\ufffdIF\ufffd\u0000o4\ufffd\u001b|\ufffd\ufffd\u001f\u0019\ufffdl[\ufffd\ufffd\ufffde,W).\ufffd\u0006/\u0017\ufffdR\ufffdS<.0\ufffd\u0017\ufffd\u0014\ufffd`d\ufffd\ufffd\ufffd\u0018j\ufffdL\u00155\u0011).\ufffd\u0014\ufffd-d\ufffd\ufffd>\ufffd/\\\ufffdN\u07f9\u0000\ufffd\u0006\ufffd\ufffd\r\ufffd\ufffd\ufffd\ufffdn\ufffd\ufffd\ufffd-\ufffd\u0013-\u000e\ufffd$u4T[Skv\f\ufffdn]\ufffd\u000f\ufffd\u0019\u001c\ufffdo\ufffdm\u022f\ufffd\ufffdL\u007f\ufffdS\\5\ufffd\ufffdD\ufffd\ufffd\u07c7xLgV\ufffdH\ufffd\u0003\ufffd\u0015\u001d)LC\ufffdI\ufffd\ufffdf\ufffd<\ufffdi80\u04f8!\ufffd\u0011\ufffdV\ufffd\ufffd\ufffd\u0018\u066a\ufffd\ufffd\ufffd\u03fb\ufffd\ufffd\ufffdJ\ufffd\ufffdfr\ufffdv\ufffdN\u0001\ufffd?A^z\ufffd\ufffd\u0005\ufffd\u0003\ufffd'J4\u0013\u01f1\ufffd\ufffdD\u0001e\ufffd\ufffd.\ufffd\ufffd\ufffd\ufffd\u0011m\ufffd4\u0017\u0011\ufffd\ufffd\u0013\u0011y\f\ufffd.c$\ufffd\ufffd\u001a\ufffd\ufffd)\ufffd_\u03da\ufffdP\u02b9\\D!\ufffd\ufffdA\u000e\ufffd\ufffdt2P\ufffd!\ufffdPA&\ufffd\r\n\u0016\ufffd\u001f\ufffd2#\ufffd|\ufffd\ufffd\ufffd$sxJ\ufffd\u001bh\u001b\ufffd\ufffdT\ufffd=\ufffdQ\ufffdE/J8\""/\ufffdqX4Q\ufffd\ufffdK;\ufffd\ufffdY\ufffdA\u0007(\ufffd\ufffd2\u0011G(\ufffd7k\ufffdU\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd3I\u0016\u0013JmG\u06f2\ufffd\n\ufffd\ufffd\ufffd'\u0010\u00010\ufffd\ufffd\ufffd\u0019\u0014U\""6N\u001a\ufffdP\ufffd\ufffd\ufffd\ufffd\u0017\rO\ufffdP\ufffd\t\u0000\u007f\ufffdx \u001fb\u0018\u001f\ufffd\ufffd\ufffd\ufffdX\ufffd\ufffdp\ufffd\ufffd\u0013\ufffd\ufffdY\ufffd\ufffd\ufffd|\u02e7\ufffd[\ufffd \ufffd\b\ufffd\u001aGX\ufffd\ufffd7\ufffd_c\u000b\u000bLY\ufffd\u0015\ufffd#(\u0015\ufffd\u0005~,1z,\""\ufffdf\ufffd\ufffd\ufffd(\ufffdM\u0089^g&\ufffd`\ufffd\ufffdU_\ufffd\u0010W\ufffd\ufffd\\\u066a\ufffd ^\ufffd\ufffd~\u0019e\ufffd\ufffd\u0017\ufffd\u001co8\ufffd\u001bN\ufffd\u00177\ufffd\ufffdrv-\ufffdf\ufffd\ufffd\ufffd\ufffdJ\ufffd\ufffd%w|\u001a\ufffd\u000f\ufffdW\u00110\ufffdF\ufffd\ufffd\u063f\ufffdo\ufffdg0\ufffdU\u024e\ufffd\u0017E\u0145\ufffd\ufffdd\ufffd\ufffdfJ\ufffdz\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\bZ&\ufffd#\ufffd}\ufffd5suqsN\ufffd=%\ufffd\ufffdj\u000b\ufffdVR\ufffd\u001aG\ufffdn\ufffd\ufffd?R\u0016T\ufffdc\ufffd\u0006r\ufffd}\ufffd6\ufffdv\u0010\ufffd\u0579\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdJe\ufffd\u020e\ufffde\ufffdk\ufffd@\ufffd\ufffd]72\u0014\ufffdtk%\ufffd\ufffd\ufffdF\ufffdKV\ufffd\ufffd\ufffd,p\ufffd\ufffd6N\ufffd\ufffd}\u0256\ufffd\ufffd\u0015.\ufffd\ufffd\ufffd\ufffd\u0002\ufffd^ \ufffda\ufffd\u000b\n\ufffd\u044b*\ufffd,\u016c*\ufffd,\ufffd\u0000\ufffd\u0016\ufffd\ufffdo\ufffd\""\ufffd M@\u0011g\ufffd$\u0003\ufffd?\ufffd\ufffd0X&\ufffd\ufffdiW\ufffd\ufffd\ufffd\u000b\ufffd\u0000\u000b\ufffd\u001a\ufffdE\u0018\ufffdT\ufffd\u0018\ufffd\ufffdp\ufffd\u0012\ufffd\ufffd\ufffd\ufffdX\f\ufffd+\u000b2u@\u001f\u001d\ufffd\u0000Af\u00110!\u0010\ufffd#9\u0006y\ufffd\ufffd\u000e\ufffd\ufffdbw\ufffd\ufffdp\ufffd\ufffd\ufffd@\ufffd\u0002R\u0012\ufffd\ufffd@\ufffd\b\ufffdz\u0010gA\ufffd\u0002)\u0012,\ufffd9\ufffde3\ufffd!Q\u071f\ufffd\u0000\u05d0\ufffd.\ufffd8%\ufffdS$\ufffd2U\ufffd\u0015\ufffd\ufffd\u0019\ufffdN\u0017\ufffd\ufffd'\fG\ufffd\u0001R\ufffd\ufffdB\ufffd\ufffd*X\ufffd\ufffdDsS\u068f\u0012<\f\ufffd\ufffd0\n\u001e&\ufffd\ufffdX\u001f&x\ufffdz\ufffd{\ufffd\ufffd\u07f2\ufffd\ufffd\ufffdt\u0014\ufffd}s\u001f|\ufffd\ufffd\u0007O\u03ee\t(x\ufffd<\ufffd\ufffd&\u02bb\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\u05a7G\ufffd\uf73b\u0005\ufffd\u000f\ufffd\ufffd;*w\ufffdPl\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\u0017\u06e6\ufffdF\ufffd;V;B\ufffd\u0004\ufffd\ufffdb1Nj\ufffd\u0018\ufffd\u000eN\ufffd5N\ufffd5N\u30dc\n\u001f\u000e\u000b\ufffdv%\f\u0003\u0007d\ufffd\ufffd^JD\u01b2q\u0018\u0015q\ufffdq\u0018W\u000f\u00c0w~P\u0018\ufffd2dw\ufffd0\ufffd\ufffd\ufffd\u0241\ufffdR\ufffd\ufffd\ufffdlv\ufffd\ufffdM\ufffd\ufffd\ufffd\ufffd\""O\ufffd\u007f\ufffd\ufffd\ufffd0\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd{\ufffdt\ufffd\ufffd/o\ufffd\ufffd=Cb\ufffd-R\ufffd\u0478\ufffd\ue5da\""\ufffd\u0017\u9794}\ufffd\ufffd\ufffd\u0007\ufffd\u0735c\ufffd\u0015j\""\ufffdG\ufffdo^\ufffd\ufffd\u000e\ufffd\ufffd\u001d\ufffd\ufffd\u001e\ufffd\ufffdY\ufffd\ufffdC\ufffd\u0006\ufffd\f\ufffd\ufffd\u0019\u03a8\ufffd\ufffd`v\ufffdA\ufffd\ufffdi\ufffdU!\u0106\u001c\u05bfRsXk\ufffd\ufffd\ufffd\u001c\ufffd\\\ufffd\ufffd\ufffd*\ufffd\ufffdL@'\ufffd\u0010|\ufffd\ufffd]\ufffd\u001bX\u001cC\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd3\ufffdv\ufffd;\ufffd\ufffd\ufffd\ufffd\ufffdb\u0017v\u0006\ufffd\ufffd.r\u0006^\b\ufffd\ufffd\ufffd\u001a\ufffd\u0001\ufffd\udbc0\udf6d;\ufffd\u0015>rh[rp\ufffdP\u001ae]\ufffd-\ufffd\u0000\ufffd\ufffd4\u0202\u000b\ufffdbD\u043c\ufffd\u0017\ufffd|\ufffd\ufffd\ufffd\u0005+\ufffdVu\ufffd\ufffd|\u0002G|)\u001eO3\ufffd .\ufffdd+\ufffd\ufffd\u00124\ufffd\u0015T\ufffd\u0016\u0010\ufffdZ\u001a\ufffdy!:&\u0710\ufffdc%Cf8.\u0603\u0015\ufffd(\ufffd.e \u007f^\ufffd\u0285\ufffdw2\ufffd/\ufffd\u000bW:\ufffdUj\ufffd_\ufffdr\ufffd\u0010\u0013&C>A2\u0006\ufffd\ufffd\ufffd\ufffd]\ufffd\ufffd\u0751\ufffd\ufffd0\ufffd\ufffd]\ufffd\ufffdBQ\ufffdQG\u0001\ufffd\u0006\ufffd/\u0019\f\u0006\ufffd-7\ufffdy\ufffd\ufffd\ufffd\ufffd\ud838\udf81\ufffd@\ufffd9\ufffd`FY-\ufffd]\ufffd'\ufffd\ufffd0\ufffd\u0000\u0011S\ufffd1?\ufffd;21\ufffd\u0251\ufffd#tC\u00be\u07eb\ufffd\ufffd0\ufffd\ufffd\ufffd\u0000!\ufffdD~8\ufffd\u001fx\ufffd\u0014P\ufffd\ufffd\ufffd|}\ufffdl\u0564}\u0239\u0017qF\ufffdS\ufffd\ufffd8q,\ufffd\ufffd\ufffd%x\u0788\ufffd\ufffd\u2c3d^\ufffdq#i\u033d\ufffd\u027d#\ufffd\ufffd\ufffdK3\u0012\ufffd$\ufffd\ufffd\u0019\u02a07,\ufffd\ufffd0\ufffdzZ>5)\ufffd\u0014J\ufffd\u0590\ufffd\ufffdA7,\ufffd:s\ufffdU%\ufffd*!\ufffdRP\ufffd\u0314\ufffd\ufffd\ufffdg8+\ufffd0-\ufffd\ufffd\ufffd\ufffdzJ>\ufffdU\ufffd_\ufffd\ufffdG>\ufffd:}\ufffdx\ufffd5\ufffd2\ufffdCY\ufffd2\ufffd\ufffdt\ufffd\u0007\n\ufffdDi\ufffd\ufffdu\ufffdDj\ufffd\ufffdd\ufffd\u071d\ufffd\ufffd\u0014\ufffd-q\ufffdJ>]J\u0653\ufffd\u024d\ufffdK\t`^S\ufffdT\ufffdp\u0662\u0001+\u0014I=A\ufffd%\ufffd\u0011\ufffd\ufffd%\u0003\ufffdL\ufffd5+\u06ef\ufffd4\u0019-v\ufffd(\ufffd\""\ufffd\u007f$\ufffddk\ufffd\u065bhO\u0006\ufffd\ufffd\u001b\b\u0005\ufffd\ufffdnz/q\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000b\ufffdJ\ufffd$\ufffdB\ufffd\ufffd\u00113\ufffd\ufffd\ufffdh\ufffdz\ufffd>\ufffdZt\u000b.aw\ufffd\ufffd>\ufffd X\ufffdv\ufffd\ufffd\ufffd\""\ufffd\u000e\ufffd\u0003\ufffd\u0007\u0006\ufffd\ufffd\ufffd\u001a\u001cygr\ufffd\ufffd\ufffd\u0259I*7\ufffd\ufffd\ufffd\ufffd\ufffd\\|\ufffd\ufffd\u0007\ufffd\ufffd\u0013\ufffd]\ufffd\u0007\ufffd\ufffdnPV\ufffd\ufffd\ufffd\u0013\u0011m\u000f\u0016\ufffdi\ufffd\ufffd\ufffd\u0016e_\u04228\ufffd\ufffd\ufffd\ufffd$\u00128\u0010\ufffd\ufffdv\ufffd| 0_U\u001e49\u000213)N\u0006'!f\ufffdv\ufffd>W\ufffdO\u001b\ufffd\ufffdv\u0015>\ufffd%\ufffdW]e\u00c3X\ufffd7\ufffdk\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffd|\ufffda_\ufffd\u0199\ufffdK\ufffde\ufffd*~\u001b\u0002\ufffd\ufffd\ufffdYM\ufffd&u\ufffd1\ufffd\u0136\u0005\ufffdA\ufffd\ufffd\ufffd\n\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0011\ufffd\u001ei\u001d\ufffdp\ufffdp#\ufffd\ufffdN\""\u0675\u001f\ufffdqe,\ufffd\ufffdy\ufffd=\u001b&\ufffd\u0610\ufffd\u0005\ufffdQ\ufffd\ufffd3\ufffd\ufffdjI\ufffdx^\ufffd6\ufffd\u001b\ufffdPZ\u0006S\ufffdao\u043f\fut_\ufffd\ufffd\ufffd\ufffd_\u0013g\u0018g9\u07bfw\u0762\ufffd\ufffd\ufffd-k\u0014\ufffd\ufffdkr\ufffd\ufffd\ufffdn\ufffdA\ufffd?S\ufffd\u0014\u026a\ufffd*\ufffd\ufffd>\u0177\ufffdT\ufffdOD\ufffd{\ufffd\ufffd\ufffd\b\ufffdK\u001a\ufffd\ufffdL_Y\ufffd\u032fh/\ufffd\ufffd\ufffd\u04f11\ufffd\u0012>u\u0001\ufffd>\ufffd\ufffdN_h\u000f\rc\ufffd\u0004/m\ufffd\ufffdWW\ufffd\ufffd\ufffd1\u001b\u0016\ufffd\ufffd\ufffdXH\u00bev\b\u0003\ufffd\ufffd\f\ufffd\u001f\u001e\ufffd_\ufffd\ufffdZ\ufffdc-\ufffd!!\ufffdq\ufffd\ufffd\ufffd?\u001f^*\u0015\ufffd\ufffd\ufffd\t\\:\ufffd\ufffd\ufffd\ufffd\f\ufffdr*3\ufffd\u0019{\u0219\ufffdM^\ufffdK\ufffdg6\u0010\ufffd\ufffd\ufffd\u0015\ufffdrs\ufffd,o6g\ufffd\ufffd\ufffd\u00164Qcc[\u001b&8\ufffd\ufffd\ufffdS\ufffd\ufffd\ufffd<24\u05e3\u0013U\u0439\ufffdf\ufffd\ufffdX&y\ufffd\u073e\u064c\u0000\t\ufffdhQ\ufffd\ufffdn]4\ufffd\u0011I\ufffd(\ufffdi9k\ufffd|Y\u0004\ufffdr\u0010]H\ufffd&-\ufffd't/\ufffd%\ufffdn\ufffd\ufffd\ufffd5\u0000\ufffd\ufffdX\ufffd\ufffd\\\u001e\ufffd\ufffd\u001f\ufffd\ufffd%\u001c\ufffdh1\ufffd\ufffd1T\ufffdC_\ufffd\u000b\ufffdfN\ufffdz\u00032$\ufffdd2\ufffd\ufffd\ufffd\u000e\u0000\ufffd\u4ab5K\ufffd\ufffd\u001bv;\ufffd7\ufffd#\ufffd\u01d8\ufffda\ufffdj\ufffd\ufffd\ufffd\u0012\ufffdT\ufffd\u007f\ufffd_t#\ufffd\ufffd\ufffdw\ufffd\ufffd\ufffd\ufffd\ufffde9\ufffd\u07bf\ufffd&n\ufffd>\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0007\ufffd\ufffd*\ufffd/\ufffdN\ufffd\ufffd\ufffdoF\ufffd\u01baS\ufffd\u01d0\u0003\u06d3+\ufffd\ufffd\u0011W\n\ufffd\n\ufffd\r\u0003b\u000eq$e}o0@k\ufffdt\ufffd\u001f\ufffd\ufffd\ufffd\ufffdo\ufffd\ufffd\ufffd\ufffd\\\ufffd<\ufffdQ\ufffdyl%j\ufffdLU}\ufffdS\ufffdP\ufffd\u0001\ufffdWMO\ufffdab\ufffd\ufffd\ufffd:\u001fzB5\ufffd\ufffdn\ufffdf\ufffd\ufffdh\u0003\ufffd\u06b1\ufffd8 \u0523\ufffd,!\ufffd\u000e\ufffd\u0500MV\n%\ufffd\ufffd\u000e\ufffd\u0018\ufffd@\ufffd\u0000/\""\ufffdu\ufffd/l\ufffd\u0e31+L\ufffd\u000f9\ufffd\u001b\ufffd\u0007\ufffdUl\ufffdV9\""\ufffd\u001es\ufffd9\ufffd#\u04a4\ufffd\u0011\ufffd>8\ufffdw\u0011\ufffd1=\u0005z&0#\ufffdU\ufffde\ufffd55\ufffd\ufffdLy\u0191\ufffdP\u007f\u000b\ufffd\ufffd<\u0015\ufffdG\ufffdc\ufffdXy\ufffd\ufffd\ufffdR\ufffdd\ufffd]\ufffd]d\ufffd\u0004\u164f\ufffdu\ufffd\u0005\ufffdUQQe\u0000\ufffd\ufffdZ\ufffd8'\ufffd!L<\ufffdrN\ufffd\ufffdM\ufffd\ufffd\u000bm\u0011]b\u0017d\u0007]\ufffd\t\""\u666f\ufffd\ufffdv\u001d\ufffd\u0002vM\u0012\\\ufffd\u0001u\u001f\ufffd?\u001f\ufffd\u001f\ufffd!\ufffd\ufffd\ufffd(\ufffd\u0002W\ufffd\u000b(&W\ufffd\u001c\ufffd\ufffd\b\ufffd\ufffd7\ufffd\ufffd\u0002S\ufffdrW\ufffd)\ufffd\u001a\u0012\ufffd\ufffd\ufffd\u001b\ufffdR \u001e\ufffd\ufffd\bc\ufffd\ufffd\ufffd\u001d\ufffd@o\u001b\ufffd\u0013H+K \ufffd,\ufffd\u0012\ufffd'\ufffdfBB\u011b\ufffd\ufffd\u000fg\u0014\ufffd6\ufffdJr\u0001U\ufffd\ufffd\ufffd\ufffdc\ufffd\u0018}8\ufffd\ufffdn\ufffd*r@\ufffd\ufffd\u00028\ufffd\ufffd\ufffd\ufffd$x\ufffdU\ufffd\ufffd\u0003\ufffdB\ufffd\ufffd\ufffd\ufffdOU\ufffd^l\ufffd\ufffd\ufffd\ufffd\f\ufffd\r\ufffd(\ufffdXX\b.\ufffdg\u0002\\\u0012[\ufffd\u0110\u0531`G\ufffd\ufffd\ufffdZ|v\ufffdOb\ufffd\u001e\ufffd[\ufffd\ufffdq\u0211/7\ufffd\u001c\\\ufffd\ufffd\u0002\ufffd4d\ufffd\ufffd\u0018\u07b6q|\ufffdM\u000f\ufffd@\ufffd\ufffdV\ufffd\ufffdMl[\u001d\u06fc\ufffd<\ufffd`\ufffd\u0003D\ufffd\ufffd\u001f\ufffd\ufffd\u0010\ufffdM\ufffd\ufffd\ufffd\ufffd\""\ufffd\ufffd/9\ufffd\u0006{@\ufffd^c\u0001\ufffdW>\ufffd\ufffd\ufffdB\u00ee\ufffd\ufffd\u0016\ufffd\ufffd\ufffd^=\ufffd\ufffdoJ\ufffd\ufffd\ufffd\u0004\ufffd\u0012H\ufffd I\ufffdp\u0012\ufffdX\u0015\u0006\ufffd0\b\ufffd\ufffd\ufffd!\u0010\r\ufffd >\u001b\u0004\ufffd H\b\ufffd\ufffd\u0010\b\ufffd\ufffdX\ufffdd/\ufffd\ufffdP_\ufffdGo\ufffd\fP\ufffd\u000e\ufffd\ufffdft\ufffd\ufffd\u0015B\ufffd\u001b\u1361d%\u013b+\ufffd\ufffd\ufffdP\b\u00de\ufffdL\ufffd\u014c\ufffd\u0007\ufffd\ufffd\ufffd\ufffd\ufffd)T4\ufffd\ufffd$\u0011\u0002\""\ufffd\u001f\ufffd\ufffd\u0007\ufffd\ufffdP2\u000fe\ufffdtS\ufffd3[/\ufffd\u04b0\ufffdcut\ufffdy\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffdq\u025ft\ufffdu\ufffd\ufffdu4\ufffd\u0005\ufffd\ufffdE\ufffd\u0006]MG\ufffd\ufffd\ufffd!\ufffd\ufffd/\ufffd\ufffd_\ufffd\f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd2,\ufffd\ufffdf\ufffd\ufffdd\ufffd\u0018(H\ufffd$|1\\t\u001b\ufffd\ufffd/P\u0006nR\ufffd#\ufffd\ufffd_\ufffd#}/\ufffd\ufffd\u001a\u0422\ufffde\ufffd\ufffd3\ufffdU\u0010\b]\ufffdq&\ufffd\u0005:\ufffd{,\u0007\ufffd!\u0010\u000f\ufffdx\u0000\ufffd\ufffd \ufffd\u0003\t/H\ufffd@\ufffd\u0002\ufffd+\ufffd\ufffdn\ufffd\""\u000bV6\u00011h\u0007c\ufffdj\ufffdF\ufffd%\u000e\ufffd\ufffd\u0018\ufffd-\ufffd\ufffdz\u001a\ufffd\ufffd\ufffdh;\b\ufffd\u0016\ufffd*\ufffd:\u0004\ufffd^qB\ufffd+~R\u0509%\ufffd\\\u0016[+\ufffdJ\ufffd\ufffd@\u0013\ufffd\ufffd\t\ufffdl\ufffdV\ufffd|S\ufffdmM\ufffd\u001ax\ufffd1\ufffd\ufffd\u01d7\u0010\u0327\ufffd\ufffd\ufffd^\ufffd0W0\ufffdW\ufffd,\b\ufffd\u000fP\ufffd\ufffd\ufffd()\ufffd\ufffd*\ufffd\u0018\u0010\u0463tF\ufffd9%\ufffd\ufffd\ufffdM\ufffd\ufffd\u000f\ufffd\ufffd\ufffd\u011b:\ufffdH\u0012\ufffd\ufffdNy\f\ufffd\ufffdK(ECf\u001bz\u0012\ufffd?\ufffd\ufffd\ufffd]:\ufffd\ufffd:*\ufffd6\ufffd\ufffdZ\u0006\ufffd\r\u001f\ufffd{ut\ufffd=\ufffd\ufffdH\ufffd\u0003i\ufffd\ufffd\ufffd\u000eI\u001e\ufffdL\ufffd?\ufffd\ufffdG\ufffd?@\ufffd\u0006\ufffdSo\u0018\n\ufffd\ufffd\ufffd\ufffd\ufffd&\r\u00168\ufffd\u0002\u0016=\ufffdc\u0012\ufffdL\u001a\ufffd!\ufffd\u04c70\ufffd\u0684\u0005<\ufffd\ufffd5\u0018.\ufffd[\ufffd\ufffd`c\rS\ufffd\bk\ufffd37\ufffd\b\u03fav\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdk&\ufffdbQM\u5281\ufffd\ufffd\n7\ufffd\ufffd*\ufffd\u046d'\ufffd\ufffdJ\ufffd`R\\\u0012\u06bft\ufffdU\ufffdU\ufffdxv\ufffd\\B~\u0019\ufffdV\ufffd\u0016rY\ufffd',\ufffdf\ufffd\u0011\ufffd6\ufffd[\ufffd\u000b[ZK\ufffdv\ufffd?g\n\u0014\ufffd\ufffd\ufffd|r(\u0015)\u0004D\ufffd\ufffd\u0675\u0019N\ufffd8W\u001aM\ufffd\u0015\ufffd\ufffd\ufffd(\ufffd%|\ufffd=\ufffd\ufffd\ufffd\ufffd\ufffd\u001a\ufffd\r\ufffd\u0007S\u001d\ufffd\ufffde\u0003m\ufffdQ\u001e:8r'\ufffd\""\ufffd\ufffdI\ufffd\ufffd@\ufffd\u001c\u001c\ufffd\ufffd\u064f\ufffd\ufffd_\u0014f\ufffdcM\ufffd/\ufffd\ufffd\u001bkI\ufffdB\u0002%\ufffdg?Z\ufffd\t\ufffd/V\ufffd\ufffd&\ufffdX\ufffd\ufffdM~\ufffd\ufffd\ufffd_TB\u0000WS\ufffdc\ufffdak\ufffdQ\u040aGL:I\u001d\u001b\ufffdv\u0167?\ufffd\u0019\ufffd\ufffd\u01d6I\ufffd\u001d\u05ae\ufffd\ufffd;ep\ufffd?\r6Ca<\u000b\u001e,\ufffdR`\ufffd\ufffd@%O\u0233\ufffd\u01cc\r\ufffd^T\ufffdYj\ufffdD\u0017\ufffd\ufffd\u0013Uy\ufffdXx\ufffdjl$h\ufffd4\ufffd|\ufffd4-\ufffd\ufffdow\ufffd$Y`\ufffd\u05ef\ucfee\ufffd\u000e\ufffdm\ufffdm\ufffdL\ufffd\u0002\ufffd(\ufffd@r(\u0019\ufffd\ufffd\ufffd\ufffd_\ufffdG+9\ufffd_\u0014\f\ufffd\ufffd[\ufffd\u0013\u001f]9\ufffdo\""\u0013\ufffd\ufffd\u001c\ufffd\ufffdQ\ufffd\ufffd\u04f5\ufffd\ufffd\\\ufffdmu$:\ufffd\u001e\u02b4#K\ufffd\u0010\u001c\ufffd\u001e8\ufffdcD\ufffd\ufffd\u0003\ufffd\ufffd\ufffd\\\u007f\ufffd\ufffdG\ufffd<\ufffds`S\ufffdAx\ufffdG\ufffdfC\ufffdP\u0010%Aq\ufffd\u000e\u0007g\r\u000f;\ufffdku\tf\ufffdE\ufffd\ufffd.\ub940\ufffdz\ufffd\n\ufffd\ufffd\ufffd\ufffd4\ufffd\u0001\u000f\u0005\ufffd\u000b\ufffd\u000eW\ufffd\ufffdN\ufffd\ufffdU\ufffd\ufffdE\ufffd\u001e\u001b\ufffd\ufffd\ufffd3\ufffd\ufffd\ufffdED\ufffd\ufffd/\ufffd\ufffd\ufffd\ufffd\u000eYR\ufffd-\ufffd\ufffdB\ufffd\ufffd\ufffd\ufffdp\ufffd\ufffd3\ufffd\ufffd\u00c9\ufffd\r\fBQ\ufffd~\u075a\ufffdH[\ufffdJ\ufffd\b\ufffd+\ufffd*-\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdF\u0003}\ufffd\ufffd\ufffd\ufffd\ufffdtrp\ufffdC\u001a\u001cq$\ufffd\ufffd\ufffd\ufffdG\ufffd\u001f\ufffd\ufffd\u0018/\ufffdA\\\ufffdwR-\u0016\ufffd,\ufffd\u0003\ufffdKR:\u001e\ufffd?\u04bc'|T>\ufffd\ufffd\ufffd\ufffdg\u078b5\ufffdy\ufffdQ\ufffd\ufffd\ufffdy\ufffd\ufffd\ufffd\u05ac\u007f\ufffd\u06bc'\u001d>ZM\ufffd\ufffd_\ufffd\u0012\ufffd\u048dF\ufffd\ufffd\ue7bc\\\ufffdJ\u01c2\ufffd6x\ufffd\ufffd1\u0014\ufffdq }\ufffd\ufffdl\ufffdoc\ufffd\u001e\ufffd\u001d\""{\ufffd\ufffd\ufffdi\ufffd\ufffd2\\p\ufffd\ufffd\r4I\ufffd_\ufffd\ufffd#MFO\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd^\ufffdz\u001d\ufffd?\ufffd\ufffd\ufffd\ufffduvtN\ufffd\ufffd\ufffd\u0006\ufffd\ufffdFPD\u001a\ufffdG\ufffdsv%1J\\G\ufffdB\ufffdI\ufffd\u0003\u0003D\ufffd\ufffd\ufffdI\ufffd\ufffd\ufffd\u0001\ufffd\u03f6d\ufffdo\u0333\ufffd\u001cX\u007f\ufffd%\ufffd\u00103\ufffd\u0010\u001b\ufffd5\ufffddLw\ufffd\ufffd7\ufffd\ufffdH\u027e\ufffdN\ufffd\u02c7\ufffd\u001cKu@\u0001\ufffdh\f\ufffd\u000eu\ufffd\u00067\ufffdM\ufffdJA\u0010DI\ufffd\ufffd|9x+\u045b\ufffd\ufffd\ufffdUh\u0004\ufffd\ufffd\ufffd/O\ufffd\u0017\u0574h/\ufffd\ufffd\u0012\ufffd\ufffd\u0000M\ufffdM\ufffdU\ufffd\ufffdR\ufffd\u001d\ufffd\ufffd\u0007\ufffd\ufffd\u001d\ufffd\u0012v\u0011>\ufffdh,\u001f\ufffd\u29fc\ufffd\ufffd\ufffdQ:TE\u03c1$\u0015\u0004&\ufffd\ufffdAN,\n\ufffd\ufffdw\ufffd2\ufffdS\ufffdb=\ufffd\ufffd\ufffd}\ufffd;.sY\ufffd\ufffd\ufffd\ufffd.\ufffd\f\ufffd\u001e\ufffd;M\ufffd\u0011\ufffd9\ufffdsM{\ufffd\ufffd\u0099\ufffd\ufffd/\ufffdF\u06fc\ufffd\ufffd\u0791\ufffd}\ufffd\ufffd\ufffd7\u0018q\u02eep\u03e6Vo\ufffd~\ufffd\ufffd\ufffd\ufffd\ufffdIyL\ufffdm\u078c\u01d4k\ufffd\ufffd\u001fq\ufffd\fd\ufffd#\ufffd\ufffdg.\u065aq\ufffd\ufffd\u0005\ufffd\ufffd\ufffd9D\ufffd\ufffddH{\ufffd+\ufffd\\\ufffd\ufffd\ufffd\ufffd\ufffdd\ufffd\u07d4wGV8\ufffdb&_n\ufffd0\ufffd\ufffd;%_\ufffd\ufffd\ufffd&\ufffd\ufffd\ufffd]~?\ufffd\ufffd$\ufffdHPp\u0006q\u0005\u000b\ufffd\ufffdpER\ufffd\ufffd\u0264\u0005a\ufffdK\ufffd\u0005\ufffd+%\u001d\u64d9\ufffd\ufffdn\ufffd>z\ufffd\ufffd\b[lL+\u000e\ufffd\u0218OV\ufffd\ufffdh\u07af\ufffdE&e\u0004\ufffd\ufffdy\ufffd\ufffdwBa\ufffdf\ufffd\u000bNgW\ufffd\ufffd\ufffd\ufffd\u0547\ufffdV\ufffd\u0735\ufffd\ufffd\ufffd\n2\ufffd/uj\ufffd*\u000f\u5cf5\ufffd\ufffd\ufffd\ufffd\ufffd'\ufffd\ufffd\ufffd\ufffd/BNu=\ufffd\ufffd$\ufffd'\ufffd\ufffdZR\ufffdW\u0006?\ufffd\ufffd#\ufffd\u0010Q`\ufffd{\ufffd%\ufffd\ufffdq\ufffd\ufffd\ufffd\ufffd\u001d9\ufffd\ufffd\ufffdT]%\ufffd\u0015\u001c\ufffd\ufffdyD\u0017\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdi\ufffd\u001f\ufffd\ufffdk=\ufffd\ufffd\u0005\ufffd\u0014n\u0385\u00b9\ufffd\ufffdB\ufffdI'\ufffdgH\u0012\ufffd\ufffdM\ufffd\ufffd\ufffdt\ufffdO\ufffd\ufffd~\u0002\ufffd\u0003F\ufffd\ufffd0\ufffd#\ufffd\ufffd\n~z*e$\ufffd2\u203a\ufffd\ufffdL\ufffd7c;F\u07ca\ufffd'\ufffd\ufffdy\ufffd\ufffd\ufffdsH2\ufffd\ufffdK\ufffd\u0019\ufffdv\ufffdJc\ufffdV\ufffd\ufffd`\ufffd\ufffdP\ufffdc\u001d\ufffdw\u001c\u0010\ufffdl\ufffdC\ufffd\u0270\u007f\ufffd\ufffd1\bv)\u0016e\u0005\ufffd\u0015\r\ufffd\u0018\ufffd\ufffdC\ufffd\\>D>\ufffd<\ufffd\ufffdgX\ufffdh\u0015\ufffd\u000e\ufffd\ufffd\ufffdE\ufffd\ufffd\ufffd\ufffd`j\""~\u000b\ufffd\ufffd\ufffd\ufffdv\ufffd\u001c'\ufffd\ufffd0\ufffd\ufffdkw+`]\u0016\ufffd\ufffd]\ufffd\ufffd\u0005\ufffd-\ufffdX\ufffd[\ufffdWp\u0015\u001a$\ufffd`\ufffd\ufffd\ufffd\ufffd\ufffdTn\ufffd\ufffd\ufffd\ufffd%\u0006\ufffd:d\ufffd\ufffd'\ufffdf\ufffd'\ufffd\ufffd+;R\ufffd\ufffd\u053e:\r/\ufffd\ufffd\ufffd\ufffd,\ufffd?D\u020e>H\ufffd}\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001b\ufffdx\ufffd]\ufffd\ufffd\ufffd\u001e#\ufffd*nQr=\ufffd\ufffdWp`\u0018\ufffdm\ufffd\ufffd\ufffdIFp[\ufffd\u001e\ufffd-\ufffd\ufffd\ufffd\ufffdD\ufffdD\u001c\ufffd\ufffd\ufffdF\ufffd\ufffd5\ufffdwv\ufffd\ufffd\u062eL\ufffdK\ufffdI\ufffd\u0011\ufffd\ufffd\ufffd\ufffd:\ufffd\u07b8\ufffd\ufffd\ufffd\ufffd\ufffdRg\ufffdA\b\ufffd&\ufffdr@TZ\ufffd\ufffdf\ufffdk>\ufffd\ufffd\ufffd:\ufffd3\u001a\ufffd\u0014O14\ufffd1h\ufffd\t\ufffdj\ufffd\u0015\r~aW\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd>\ufffd\u0010j\ufffdC\ufffd\ufffd\f%5 \ufffd\""!Wa{\ufffd\u0256Es\ufffd\ufffd\ufffdt\ufffd!\ufffd\ufffd\ufffdy\ufffd\u0006J \ufffd\ufffd\ufffdX\ufffd\f\ufffd\ufffdj\ufffd\ufffd\u0007Q\u0015\u0007(s\u00198\ufffd#\ufffdl\u42ca\ufffd\ufffdP\ufffdIp=\u0002EH:\ufffdEMX\ufffd`\ufffd\ufffd\u000e\ufffd\ufffd\ufffd\ufffd-\u5259J81z`|xO%\ufffdY!\ufffd*\ufffd^\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd{\ufffdg&\ufffd\ufffd\ufffd\ufffdC\ufffd\ufffd\ufffdkJ\ufffd\ufffd$\ufffd\ufffd\ufffd\u07b6\ufffd\ufffd\ufffd`\ufffdo\u001a\ufffd\ufffd\n\ufffd'\ufffd\f{\ufffdd\ufffd\u001b\ufffd]\ufffdf\u000e\ufffd\u07cee~\u001baG\u0002?\u05dc\u000f\ufffdh\u03ccx\ufffd.\ufffd#\ufffd\ufffd\ufffdF\ufffd_Vd\ufffd\ufffdK\u001b%\u007ftu\u3216\ufffdJ\ufffdqq\ufffd\ufffd\ufffd;\ufffd\ufffd\u0754N:4\u0002\ufffd\u0372\u0018v\ufffd^\ufffdrA\ufffd/g\ufffd\ufffd\ufffdh+\ufffd\ufffd\ufffdf'2\u0006\ufffd\ufffdV\ufffdH\ufffd\ufffd\ufffd\f\ufffd*\ufffd\ufffd\ufffd(ji\ufffdO|\fK\ufffd\ufffd\ufffd\ufffddsH\ufffd22\u001c\ufffd\ufffd\ufffd\ufffd\ufffd\u000e|\ufffd\ufffdw*2r\u001e\ufffdR\ufffd\ufffd.\u0011\ufffdc\ufffdZ\u07bf\ufffd\u0003*\ufffd\ufffd\ufffd\u0016rU\u0007\ufffd\u0010\ufffd\ufffd\ufffdni\u000f\ufffd\ufffd\u0005\ufffd\fE\ufffd:\u0397\ufffde{\ufffd=\ufffd\ufffdT\ufffd\ufffd\ufffd\ufffdoM\ufffdy\u001a~C3r4\u001f(@A|\ufffd7M\u0756\ufffd\ufffd:yA0:\ufffd&\ufffd\ufffd\u0016-B8\ufffd\r9\u001c\ufffdR{beF6\u0018M\u001c\ufffdF2\ufffd&\u0454r\ufffd#N9\ufffd+\ufffdE \ufffd\ufffd\u04cf\u0013\u0005EC8MD\u0002\t\ufffdu\ufffd*\ufffd\ufffd\ufffd\ufffd\ufffd.\ufffd\ufffduo\ufffd\u0018\ufffd\ufffd\u000b8 \ufffd\ufffd\ufffd\ufffd{\tk\ufffd\ufffd\ufffd^k\ufffdh\ufffde-Y\ufffd\ufffdU\ufffd^6sLUx\ufffd\u3116\ufffd\u0005+;Ku\ufffdE\ufffd\u0002R}\ufffd9p\ufffd\ufffdd\u007fH\u063ea\ufffd\ufffdy\ufffd\u0018\ufffdj\ufffd\u000f\ufffd#\ufffd\ufffd`\ufffd\u001dgt\fMR\ufffd\ufffd\""\ufffdn\ufffd4\ufffd#]\ufffd\u0013\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd'\ufffd\ufffd\ufffdo-\u0005A\ufffd[0M\u007f\ufffd\ufffd\ufffd\ufffdA\ufffdE\ufffd\ufffdf\ufffd(\ufffd\u0647V\u0013)b\ufffdR3\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u06eb\u0016lQV\u0013A\ufffd\ufffd\u0018<\u0460\ufffd\ufffdj\u0012\ufffdbM\ufffd\ufffdh /\ufffd\u0019\ufffdw\ufffd\""\u0016\ufffd\ufffdn\ufffd\u067ab]\ufffd\ufffd@\ufffd\ufffd\ufffd\u0012\ufffd\ufffdb\ufffd\ufffd\u0496\ufffd\ufffdj[\ufffdK\u0007\u0018e\ufffd\ufffd\ufffd\u053e?T\ufffdgAU;\ufffdc\n\ufffd\ufffd\u0004u\u001d\u001b\ufffdP\ufffd9XBP\f|`\ufffd\u001a\u0487\ufffddqm\ufffdg\ufffd\ufffd\ufffd\ufffd=c\ufffdG\ufffd(K$p\ufffd\ufffdN\ufffd\ufffd\u05ab9\u053fW\u0016H\ufffd.\ufffd'mL}\ufffd\u0016\ufffd\ufffd7i\u0240\ufffd#\ufffd)\ufffdS\u0014g\u000b{\ufffd\u0011;G=M\ufffd\u0006\ufffdk\ufffd\ufffd\u0016\ufffd:LR\u000f\ufffdz\ufffdC\u06e0\ufffde\u0014L5\ufffd\u001e\ufffdN\ufffdy=\ufffdw\ufffdd\ufffd\ufffd$\u001e\ufffd6\ufffd\u0015<\ufffd\ufffd\u0019\n\ufffd\ufffd\ufffd\ufffd'\ufffd\u007f\ufffdq\ufffd&>\ufffd\ufffd\u001e\ufffd\ufffd\u00169\ufffd\ufffde\ufffd`J|\ufffdfYa\u04f3\ufffdV\ufffdz\u047e\ufffd\ufffd\ufffd:f\ufffdl\ufffd'9\ufffd\u0667\ufffdL)vU/\uc00b9h\ufffd\u001d\ufffd:\ufffd\ufffd\ufffd\ufffd\u001a\ufffd^-\u001dt\ufffd\ufffd\ufffdo\ufffdH\ufffd\tI\ufffd\ufffdt\u007fK\ufffd!\ufffd'd7\ufffd{\u0000\ufffd\ufffd2\ufffd\u0411\ufffd\ufffd\ufffdZG\ufffd\ufffd\ufffd\ufffd\ufffdJ,\ufffd\u0017$y+`E\ufffd\ufffd\ufffd23\u0527H\ufffd\u0016\ufffd\ufffd\u00140\ufffd\u0001L;\ufffd\ufffd\ufffdc\u000b@3\ufffd|\u001dhF#x\\!\u0000=S\ufffd\ufffd\ufffd#4{\u0003P\ufffd\u0011\ufffd0\ufffd\ufffdL \ufffd\ufffd\ufffdz=\ufffd8\u0007\u001e|2$\u0007\r\ufffd\ufffd\u001cx\ufffdd\ufffdd\ufffd\ufffd \ufffd\u0018n\ufffdnU\u0166\ufffd%>\u0014\u001e\ufffd5\\\ufffdoC\ufffd\u0005\ufffd:;\ufffd\ufffd\u0002\u0010\ufffd\ufffd\u0002\u0010`\ufffd\u02a4\u001d>\u0001\ufffd\ufffd^e\ufffd\ufffd\ufffdvz%\ufffd\ufffd\b\ufffdi\ufffd\ufffd|N\ufffd_\u00004)\ufffdx\ufffd\ufffd\u011d$e\ufffdf\u0511\ufffd\ufffd\ufffd\u001d \ufffdgY\u000e\u0012\u0014o\u0015\t\u0337_\u0000\ufffd\ufffd\u0350\ufffd\u05ea\ufffd\ufffd\ufffd'g\ufffd6\ufffdK\ufffd\u03c1WJ\ufffd!$\u001ds\ufffd\u0015\""\ufffd\u04b7@6\ufffd\f\ufffd[T\ufffd\ufffdd\u000e\ufffd\ufffdcUx\u0005\u001dy\ufffd\n\ufffd\ufffdL\ufffd\u0019\ufffd\ufffd\ufffd\ufffd\ufffdn\ufffd5R\ufffdm\ufffd\ufffd\u0010\ufffd>f<\ufffdC5\ufffdj\ufffd\u0011 b8v\ufffd\ufffd\u0019\ufffdw\ufffdD\ufffd\u0013~\ufffd\u0007\\\u001aH/\ufffdL\ufffdlwr\ufffd \ufffd`\ufffd\ufffd1\ufffdc\ufffd\ufffde\ufffd\ufffdjs\ufffd\u0246$(\ufffd:\ufffd#\u0018y\ufffdH$\ufffd*w\ufffds\ufffd\ufffdBy\f_\ufffd\ufffd(\u0016s\u0006\ufffd\ufffd\ufffd\u0012\ufffd_\ufffd\ufffd\ufffd\ufffd\ufffd(9`\ufffd\u0016 X;\ufffd\ufffd\ufffd\ufffd3\ufffdN\ufffd\ufffduA0B\u07f7\ufffd\ufffd\ufffdp\ufffd;\ufffd\ufffd\ufffd\ufffd\nm\ufffd4\u0015\ufffd\u0499bW\ufffd\ufffd$\u001d\ufffd\u0324:\ufffd`\ufffd\ufffd\t\u0012p\ufffd~\u000f^\ufffd\ufffd\ufffd\ufffd\ufffd\""b\u061f\ufffd\ufffdy\ufffd\ufffdAH+\ufffd\ufffd\ufffd^g\ufffdX\t\u001f#%\ufffd\ufffd\u001b\ufffd\u0017*^\u000f\ufffdZ,\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ued70\u0012\ufffd\ufffd#^O\u012e7\u001b\\\ufffd@ \ufffd4\u0018\ufffd\ufffd@ \ufffd2\ufffd\u0003\ufffd\ufffd5\ufffd\ufffd\ufffdb\ufffd\u0019\ufffd,\ufffdT\fe<<\ufffd\u0244BY\u0017\u03fb\ufffd\b\ufffd\ufffd\ufffd\ufffdq\ufffd6\ufffd\ufffd.E\ufffd\ufffd\ufffd\u001dD\ufffd\ufffd\ufffd\ufffd3\ufffd\ufffd\ufffd\ufffd\ufffd(\u0001;+\ufffd\ufffd\ufffd\ufffd3\ufffdd\u0243\ufffd\ufffd\ufffd\ufffdF\ufffd\ufffdj\ufffdR\ufffd\u001f\ufffd\u001a\ufffd]\ufffd\ufffd\f\ufffd\u0018k\ufffd\ufffd\t[Y\ufffdA\ufffd\ufffd\ufffdq\ufffd\ufffd\ufffd\ufffd{}Q\ufffd\u0000\ufffdQVo\n\ufffd\ufffd\ufffd\ufffd\""G\u04fc`\ufffd\u03e0/\ufffd\ufffdyg\ufffd\ufffdK\ufffd8\u0395\ufffd4\ufffd\ufffd\ufffd\u000e\ufffd\u0011o\u0010\u001e\u008795\ufffd\ufffd\u0012\ufffd(^\ufffd4_\ufffd\ufffd!\ufffdr_P\ufffd!\ufffdZ\u0000\ufffd\ufffdZ\ufffd\ufffd>(\ufffdH\u000f\ufffd&\ufffd\ufffd*98\ufffd\ufffd\ufffdwF\u076e\ufffd\ufffd\ufffd\ufffd@[.\ufffdz\u001eM\u001fd\ufffd\u0002\ufffdOy\ufffdH\u000f\r\ufffdg\u001e\ufffd\ufffd\u001e\ufffd\u0003\ufffd\ufffd\u0013)\ufffd\ufffd\u0012\ufffd*\ufffd\ufffdB\ufffd\u0006j\ufffd\ufffdT\ufffd\ufffd.\ua021D!\u02dd\ufffd\ufffd\u0006\""\u0653\ufffdY\ufffdC\ufffd\ufffd\ufffd\ufffd5\ufffd\u001f\ufffdNP{\ufffd\ufffd\ufffd\ufffd\t\ufffd\ufffd\ufffd\ufffd\ufffd4\ufffd\ufffd\u0003\ufffd\u0007'v\ufffdq\ufffd\ufffd\u0007j\ufffd\ufffd\ufffdu&\ufffd\ufffd\ufffd\nYt\f9\ufffd3Y\ufffdvW\u0422\ufffd\ufffd5\tz\u001dk\ufffd\ufffd\ufffd\ufffd&\ufffd\u0000{o\ufffd\u0019\ufffd\u0003\ufffd\ufffd\ufffd\u04fa\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdx\u063e3(\ufffd(\ufffd\u001b\ufffdD\ufffd\ufffdY\u0012E\ufffd\u000fT:\ufffdAr\ufffd\u0004.\""\u0004i\n\ufffd\ufffd\u0006\u03119r\u0015!\u0010A%C>\ufffd\ufffd\ufffd\b\\w\u0016\ufffd\u0019\u001d?_E\ufffdK\ufffd{\ufffd\n4\ufffd\u0011*g\ufffdj\ufffd\u0016\ufffd\u0003\ufffdZo\ufffd\ufffd\ufffd\u001f\u0012\ufffd@<\ufffdg$\ufffd\ufffdKP\ufffd\u001b\ufffd\ufffd^ Y\ufffd\u0016(U|\u001e>\ufffd\ufffd\u0013\ufffd\ufffdCD\ufffd((\ufffd\u0016(\ufffd\ufffd@!\ufffdt\n\ufffd\ufffd({\ufffd\ufffd\ufffd\ufffdE\ufffdMJA\ufffdS\ufffd\ufffd\u064b}\ufffd\u0018(\ufffd[\u001c\ufffd\ufffd\ufffd9\n\ufffd,e\ufffd\ufffd\ufffd\u06e6\ufffd]G\u0003\ufffd\ufffdeq[\ufffdT\ufffdd\ufffd7P\ufffdl\u0005p\u0011\ufffd\u001d^\ufffd\ufffdox\ufffd\ufffd\ufffd\ufffd\u001f\u05ee\ufffd\ufffdQ\ufffdi\ufffd\ufffd\ufffd7\ufffd\ufffd\ufffdfg_}\ufffdo\ufffd1\f\ufffdp\ufffd\ufffd\ufffd\u000e{\ufffd\u0016\ufffda\ufffdX\ufffdp\u0011\ufffd\ufffdG`Q=l\ufffd\ufffd\ufffd\ufffd\ufffd\u0016\\\u071e\ufffdQ\bJ\ufffd3\u0005\ufffd\ufffd\ufffd\ufffdeD\ufffdZ\ufffd\ufffd\u000eK{\u001b\ufffdP\u0019\ufffdC\ufffd\ufffd\ufffd\ufffd]\ufffd:(\ufffd\ufffdmq\ufffdL\ufffd\ufffd:==\ufffd#E\ufffd\ufffd\ufffd\ufffd\ufffdM\u0007H\ufffd\ufffdk?y\ufffdFZ\u03d04/\u0019\u007f\u0000\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\f\""\u0007{\ufffd\ufffd.\ufffd&`\u007f\ufffd$\ufffdgus\u0010\ufffd\ufffd\ufffd\u0398\b\ufffdJ0\ufffd\u001b\ufffdB~KR\ufffd @\t\ufffd,\ufffd\ufffd\ufffdo\ufffd\ufffdr'\ufffdB4\u001a\u0007\ufffd>\ufffdd\ufffd?\ufffd\u0004on=}\ufffd\ufffd\ufffd3\u0010|\ufffd\ufffd\u007f\u000b\ufffd9y\u001cl\ufffd\u001b\ufffd\ufffd\ufffd)\ufffdUm\ufffd\u01899H\ufffd\ufffd]\ufffdA\ufffd|\ufffdd\ufffd;\ufffd)x|;<~\u000b\u001f\u007f\ufffd\ufffd\ufffd#\ufffd\n\ufffd%j\u0013\ufffd\u0000\ufffd':1\u015a\ufffd\ufffd@\""\ufffd`\u0005\ufffd\ufffd\ufffd\b\u0002-\ufffd\ufffd\ufffd\n\ufffd\ufffd\u000b'\ufffd\u0006\r\u0003\ufffd\u0001\f\ufffdHXe\ufffdG:\ufffd,\ufffdj1vv&\u0428:\u001c\u000e*\ufffd8\u000bKuv\ufffd\ufffd\ufffd,KU\u0324\ufffd\ufffd3\ufffd\u4942P\u000b\ufffd\ufffd/\u001a\ufffd\u000e\u00070\ufffd\ufffd\ufffd\u00198\u001c~\ufffd\ufffd\ufffd\ufffd\ufffd>\ufffd\ufffd4\ufffdK=\ufffdD\u0012I\ufffd\ufffd\ufffd\u001f\u0005\u0011N%\ufffd1\ufffd%\ufffd\ufffd0\u001f\ufffd\ufffdF\u0012\t\ufffd\ufffdQ@\ufffd\ufffd\ufffd\ufffdG\ufffd\ufffdx\ufffd\u0745V\ufffd\ufffd\ufffd\u001b\ufffdG\ufffd\ufffd\u0770\ufffdy\ufffdC\ufffd\u0010\\\ufffd.\u0014\ufffd\ufffd)\ufffdc\ufffd\ufffd](,Z\u04f4=\ufffd%gd;y\u000f#:,\u0016\ufffd\ufffd88[\ufffd\ufffd\f\ufffd\f\ufffdv\ufffd\ufffds\ufffdq\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd}\ufffd\ufffd,>'\u00b9\ufffd#\ufffdK\ufffdF\u0007\ufffdab\u0003q3q\u0007\ufffd\t\ufffd\ufffd1\ufffdU\ufffd\ufffd\ufffd?\uee96\u0015\ufffd\ufffd\ufffd\ufffd\ufffdTJ(\ufffd\u0003\u0313\u0003c;\ufffdU\u0018\u052cS8\ufffd\n\ufffd\ufffd\u05ef\u001fG7\ufffd\ufffd\ufffd;\u0006\ufffdJ\ufffd\ufffd\ufffd1a\u01ffV\ufffd\ufffd\ufffdaJ\u000bU\ufffd\ufffd\ufffd\ufffdL\t\ufffd\u000b\r\ufffdS\ufffd\ufffd\u0017T4\ufffd\u001c\ufffdg\ufffd\ufffdA\ufffd\ufffd\ufffd\u000e\ufffdp\u0000\ufffdf\ufffd\ufffd\ufffdP\ufffd\u001c\u0005/\u0000U\u007f\ufffdJ\ufffd\u0018\u0013\ufffdS\ufffdo\ufffd|\ufffd\ufffdL|\ufffd=S\u1d5b\ufffdk\ufffd\u0005\ufffdFV\f\ufffd\ufffd\ufffd`\r\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ud800\udd8dA\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd'\ufffdL\ufffd\ufffd*\ufffdD}\ufffd\ufffd\ufffd\ufffd/\ufffd\ufffd\ufffd\ufffd\ufffdU\ufffd^\ufffd\ufffd\ufffdE\ufffd\ufffdjm\ufffdf\ufffd\ufffddK\ufffd-[r\ufffd\ufffd\n\u0018\ufffd\u0017\ufffd\t\ufffd\u0013\u001c\ufffd>\ufffd@\u0002\ufffd@\ufffd\ufffd\r\ufffd@2\ufffdL\b\ufffd#\ufffd3d\ufffd\ufffd\ufffdaNB\u0018\ufffd\ufffd$d\ufffd\u0010\ufffd\t \ufffdU\ufffd{[\ufffde03y\ufffdY\ufffd\ufffd\ufffd\ufffdU\ufffdV\ufffd_\ufffd\u007f\ufffd\ufffd_\ufffd\ufffd\ufffd.\ufffd{\ufffd-^\ufffdz\u4580\ufffdyS\ufffdQ\u001dl\ufffd\u011bC\ufffd}\ufffd\ufffd\ufffd:\ufffd\ufffd&\ufffd\u0018\ufffd:>\ufffd\ufffd\ufffd\u0014\ufffdo\ufffd}U\ufffd\ufffd\u0006*\u0012\ufffdm\r\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffdM\ufffd\ufffd\ufffd\ufffdH\ufffd74<\ufffd56\ufffdw\ufffd\ufffd\""\ufffd\u0010\ufffd\ufffd\\\ufffdO\u0016\ufffdn\ufffd:\ufffdf\t&\ufffd\ufffd\ufffdf\ufffdH sT\u0007\ufffdi\ufffdV\ufffd\ufffd\ufffd`\ufffdd\ufffd\ufffd\ufffdk\ufffd(gY\u07273\u0006\ufffd\u7f31\ufffd\ufffd\ufffd,\ufffdi\u0003\u0013\ufffd\u0013Ak.Gq\ufffd\ufffd\ufffd\ufffd]\ufffd\u001eEZ\ufffd\ufffd\ufffdndO\ufffd\ufffdl~\ufffd\u000e\ufffd+\ufffdf\ufffd\ufffd\ufffd 7\ufffd\ufffd\ufffdX\u0015\""BT\ufffd\u0006\ufffdG\ufffd\ufffd\ufffd)\ufffdU\ufffdo\ufffd\ufffd\ufffd8\ufffd\ufffd\""\ufffd\ufffdT\ufffd\u02d5\ufffdo\u000b\ufffdv\ufffd\ufffd.A\ufffd\ufffd\ufffd\ufffd=\ufffd\ufffd\ufffd\u070eM\ufffd\u0011\ufffd\u001a9\ufffd$x\u037d\u0006\ufffd\u001b\ufffd\u001f\ufffd\ufffd\ufffd.\ufffd\u0004}\u0645\u0526*IV\u00124+\ufffdI>\ufffdq\u0001\ufffdW\u0013|\ufffds\ufffd\ufffd\ufffdl\ufffd\u03a9\ufffde\u0013\ufffd\ufffd\ufffd3ox\u0019Y\ufffdh\ufffd\ufffd\ufffdrY\ufffd\ufffd!\ufffd\u0011\u0005\ufffd(`k\ufffdB\ufffd\ufffd\ufffdk\ufffdUCy\ufffd\ufffd,\u000f\ufffd\ufffd\ufffd\u04fd\ufffd\ufffdin\ufffd\u04d7\ufffdw\ufffd\ufffd\ufffd\ufffd\ufffd@kQ\t\u0012\ufffd\ufffd\t%X\ufffdy(\u01958\ufffdJ_v\ufffd\u07bdqfOr\ufffd\ufffd(\ufffd\ufffdX?\u0010Q\ufffd\ufffd\ufffdr_M\ufffdz\ufffd%3\ufffdi;V\u0019\ufffd\ufffd\ufffd\ufffd\nd\ufffd\ufffd\ufffd\ufffdQ\u007f\ufffd\ufffd\ufffd\ufffdm\ufffdg\ufffd\ufffd\ufffdB{\ufffd\ufffdv0\ufffd\ufffdhk\ufffd5\u001fo\ufffdLW9\u0000\n\ufffd\ufffd@&1\ufffd\ufffd\ufffde#\ufffdP\ufffdS\ufffd\t\ufffdP,4W\ufffd\ufffd1\ufffd*\u04b7\u000f;*u\u0004\ufffdv[2\u001c\ufffd\u0018Bv\ufffd\u019b\ufffd\ufffdP\ufffd.a\ufffdz\ufffd\ufffd\ufffd\ufffd^c4\u0012\ufffd\ufffd\ufffd\u001ds~\ufffd\ufffd\u0000F\ufffd\u0018r7r\u000f\ufffd\u001f\ufffd}\ufffd\ufffd#\u0007\u0007\ufffd\ufffd\u04fd\ufffdW\ufffd\ufffd\u0016\ufffd\u0405\ufffdS\ufffd\ufffd\ufffd\ufffdz\ufffd\ufffd\ufffd\u001f\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\ufffd\t0%?\ufffd$\ufffd\ufffd\ufffdr\ufffd\ufffd\ufffd\tn\ufffd\ufffdY\ufffd\ufffdH\u0000\ufffd\ufffd\u0002J\ufffd\u0689O\ufffd\ufffd\ufffd@\u0019=F\ufffd\u0000\ufffd\tQ.WX\u63d7u\ufffd\ufffdo\ufffd\u000fW\ufffd\u001d\ufffd\ueb76\ufffd7n\ufffd\ufffdZ\ufffd#_\ufffd:|\ufffd\ufffd5\ufffd\ufffd\u05f1\ufffd\ufffd\ufffd[M\ufffdk\ufffd\ufffd\u0004\ufffd5\u0001\u0003\ufffd[ey]$\ufffd.\ufffdJWV\ufffd5\ufffd?\ufffd\ufffdkk\ufffd\u001dlqD7O\f\ufffd\ufffd7\u007f\uf9f3\ufffdC\ufffd'G*\u0007\ufffd\ufffd\ufffd\ufffd\u001aZ\ufffdj\u001dB>\ufffd e\u0002Ujh\u007f\ufffd\u0133\u07ff}[z\ufffd\ufffd\ufffd_\ufffd\ufffd\ufffdo=\ufffd\u035ap\ufffd\ufffd\u00f9\u0012\ufffdBi \ufffd0\ufffdB{]\ufffd:\ufffd/\ufffd1\ufffd\ufffd\ufffd\u001eh\ufffd\ufffd}\ufffd\ufffdf\ufffdH2\u043eyN\u0006\u0017\u001b\u007f\ufffdol\ufffd.\ufffd\ufffd\ufffdn\ufffd\ufffd\ufffd\r\ufffdJ\ufffd\u001a=\ufffdX\ufffd\ufffdY\ufffdz\ufffd~\u06f8\ufffd>7\u03ad\\\ufffd!\ufffd\ufffd\ufffd\u0010\ufffdHg\ufffd\u059c\ufffd\ufffd:\ufffd\ufffd\ufffd4\ufffd\ufffd\ufffd\f\u045as\u0005\ufffd(\ufffd\ufffd9S\u0000\ufffd_q\ufffd\ufffdx\ufffd\ufffdg\u000f\ufffdp\ufffd*\ufffd^m\ufffdj\ufffdj\ufffd'\ufffd\ufffd\u001d&\ufffdD\u02f9\u0012\u0012\u041eE\ufffd\ufffd\u000b\ufffd\ufffd\ufffd/\u0016q\ufffd\ufffd\u0014C\u0006$\ufffd`\u0001\ufffd\t\ufffdc(\ufffd\ufffdAN\ufffd\u0004ty\u000b\ufffd\ufffd\u001ad\u001fCv\u001al\ufffd\ufffdJ\u0017\ufffdBRE\ufffd\ufffd9\ufffd\u055a2\u0016\ufffd\u0014%L\ufffd\u001a\u000e/8J\ufffd\u065d>\ufffd\u001b\ufffd\ufffd\ufffdW\u0000I\ufffd\ufffdK6\ufffds\ufffdE\ufffdn\"".\ufffd\ufffd\ufffd`\ufffd3\u0005\u040av\ufffd\ufffd'\ufffd$\ufffd\""\ufffd>rl\ufffd1\ufffd\ufffd\ufffd\ufffd\u000e\u000foq\ufffd\ufffd\ufffd\ufffdmo\ufffdEr\ufffd\\J\ufffd\ufffd\t\ufffdB\ufffd\u0014U7\rW*u\ufffd\ufffd\u029a\ufffd-a1O,\u0000\ufffd* 3\u0003{\ufffd}\ufffdFB\ufffd\ufffd\ufffd\ufffd\u007f\ufffd\""\u0002\ufffd\b_\ufffd0*\ufffd\ufffduj\ufffd^)\ufffd}\ufffdxg\ufffd\ufffdC\u0005\rV\ufffd\ufffd\u0007v\u00162\r!%\ufffdv\ufffd\ufffdm\ufffd169}U\ufffdO\ufffdLN\ufffd\ufffd\ufffdy\ufffd\u0001\ufffd?\ufffd\ufffd\ufffdL\ufffdTb\u0354\ufffd\ufffd\ufffd\u06d9\ufffdvvz\ufffd\u001c\ufffd\ufffdx\ufffd\u0002\""Sf\ufffdY]\ufffd\ufffd\ufffd(Qk_p\ufffdn\ufffd[GuET\u007f\u001a\ufffd`\ufffd\u0646\ufffdO\u0011\ufffd\ufffdN\ufffd\ufffd\u03b8\ufffd+Rt\ufffd=M\ufffdn\ufffd\ufffdK\u000b}\ufffd\ufffdB\ufffd~\u0003\ufffd\ufffdX\u000fDw\ufffd\ufffdS\u001b\ufffdj/\u0017%\ufffdN\u0011\ufffd\ufffd]W*Y\ufffd?\ufffdf\u000e\ufffd@f\ufffdc\ufffd\r{\u0007\ufffd\u0012>`i\ufffd\ufffd\ufffdc\u0773\r\ufffdM\ufffd\ufffd\ufffd\ufffd\u0003m\ufffdJ\ufffdB..\ufffd\ufffdw\u59db=\ufffdxg<3\ufffd\u0012\u0015\ufffd|.\ufffd\u0015\ufffd3};r\ufffd7\u000f\u0007\ufffd5#\ufffd\ufffd\u039e\u0421\ufffd\u06f6Uk,\u0016\ufffdTm\ufffd(\ufffdr\ufffd\ufffdm\ufffd\ufffd\ufffdW&\u0006sv>aP\u0003e\ufffds\ufffd\u0012\ufffd\ufffd\ufffd\ufffds\ufffd\ufffdQ#\u05d02\ufffd\u02e1\r\ufffd\ufffdo\ufffdNw'%\u0018\u001e\ufffd\ufffd\tf\ufffd}A\u010dr\ufffdH9\u0012d\u03e8\ufffd6\ufffd\ufffd\ufffd\ufffdy\ufffd\\$P\ufffd\ufffd\u000b\u001a?a\u001b\t\u001a=ET{\ufffd\u0018\u0013\ufffds\ufffd\u00106\ufffd*\f\f\u0006\ufffd\u0011\u078a\ufffd\ufffd\ufffd\u0002S\ufffd\ufffd5\ufffd.\ufffdUul\ufffdT6(\u0018\ufffd\ufffdXt'\ufffd/J#ZJ\ufffd\u0000\r\u0006\u000e\ufffd\u018d*\u0015/\ufffdD\ufffd:\ufffd\ufffd?W\u0014+\ufffd<\u0018\ufffd\u0017\ufffd\u000b\ufffd\ufffd\u0005,\ufffd\ufffdY\ufffd\ufffd\\3\ufffd\r\ufffd\u000f\ufffd\ufffd7\ufffd]o\ufffd\ufffd\ufffd\ufffd@\ufffd\u007f\u0003\b\ufffdVe1\ufffd\bN\ufffd\u0010n\ufffd\u0005r\ufffdg'\u001c\u001c\ufffdg\ufffd\ufffd-c\ufffd\ufffd#_\ufffdp\ufffd\ufffd!U\ufffd\ufffd8\ufffdz\ufffd\u0012c\u0011k:\ufffdH\ufffdE\u00149\ufffdN\ufffd\""\ufffd9S1\ufffdY\u0012\ufffd\u015c\ufffdK\ufffd\ufffd\u04f0\ufffd\ufffd\u0002\ufffd^\u0001\ufffd+T\f\ufffd\ufffdBT\ufffd\ufffdr\ufffd}_w\ufffd\u001bs)\u00019\ufffd5\ufffdXD93\r\ufffd?\ufffd55\ufffd\u0015W\ufffdpx\ufffd\u0595\ufffd\u0492\ufffd\ufffd\u0011\ufffd\ufffd^\ufffdo\ty\ufffdJ\ufffd\ufffdR\ufffd\ufffd\ufffd21\ufffdR\ufffdW\ufffd\ufffd9g\ufffd;]y~\ufffd\ufffd\ufffdI\ufffdZ\ufffd\ufffd\ufffd\b@$:\ufffd\ufffdZ?\u075c\u001b\ufffd1sp\ufffd\ufffd\ufffd\u0011V\ufffd@iR:\ufffd\ufffdwq9\ufffd\ufffd\ufffd\ufffd\u007fh\ufffd}\u039b\ufffd\u0015\ufffd\""\ufffd\ufffdVz\ufffd\ufffde\ufffdX\ufffd9\ufffd\ufffd \ufffd,b\r\u0017\u0010Ip!\ufffd\u011d\ufffd\ufffd=\ufffd\u001c\ufffd\u0017QuI\u0003,uJ\u025bM\ufffd\u0004\u0013\nT\ufffdy/\ufffds\u0005\ufffd\u0010\u000e\ufffd/\ufffd\ufffdE\u0007\ufffd\ufffd.\ufffd\u000e\ufffd\ufffd_\u0015\u05a2\u0014\u000e\ufffd\ufffd\ufffd\ufffdGvw_7\ufffds\ufffd\ufffdP\u01c1\ufffdwz\ufffdjC\ufffd\u0000\ufffdI\ufffd\""wj}\u519b\ufffd\ufffd\u001cC~\ufffd`x\ufffd\u0508\ufffd)]r8\ufffdjk\ufffd\u0019l\ufffdF\ufffdv\ufffd\u018c>\ufffd\ufffd\ufffdk\ufffd\ufffd-\ufffd[\u001f\ufffd\ufffd\ufffd\u0637o\ufffdZ-\ufffd)\ufffd2\ufffd\u0002l\u007fe\ufffd\ufffd\ufffd\ufffd\ufffdG\ufffdf\ufffd<\ufffd\ufffd\ufffd\ufffd\u01bcC\ufffd\ufffd(\ufffd<1\u0013\ufffdtna<\ufffdE\ufffdC@v,H})\ufffd\ufffd<\ufffd\ufffd,b-g\u0011-N\u0016\ufffd\uacc6a\ufffd8\ufffdT|\ufffd\b~\u00067\ufffd\ufffd\ufffd\u0015\ufffd\u0017\ufffd\ufffd.\""\ufffd\ufffd:\ufffd\ufffd\u0004F\f8\ufffd8\ufffd\ufffd7\u001f\ufffd\ufffdt\u000e\ufffd\ufffdM\ufffd<\ufffdwsw\t\ufffdB\\\ufffd\ufffd\ufffd]\ufffd\u0016\ufffd8o(\ufffd\f\u0006\u0667\ufffd\ufffde\ufffd/SJ\ufffd-\""\ufffdI\ufffdq\ufffd\u0014&\u0018\ufffdm\u0013\u0018\ufffd_\ufffd6\ufffd\ufffd\ufffdH\u0003\ufffd\ufffd\ufffdn\u00061=\ufffdB\ufffd\ufffd\ufffd\u0012\ufffd\ufffd\u000e\ufffd\u0012.J<\ufffd\ufffd\u0003\u0005Oa\ufffd\ufffdDT\ufffd\ufffd\ufffds\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdM\ufffdy9!\ufffd\ufffdR\ufffd\ufffd\ufffdrPQ\ufffd+\ufffd\ufffde\u0003\ufffdZ\ufffd\ufffd/\ufffd\nrhO\t\ufffd\ufffd\ufffdF@\u0019\ufffdy\ufffdqS\ufffd\ufffd2\ufffd\ufffd\ufffdM\ufffd\ufffd\ufffd\ufffd\ufffdw4V\ufffdQ\ufffd\u0216\ufffd65y\ufffdX\ufffdV\ufffd!\u04f4\ufffd\ufffd\ufffd\ufffd\u0799\ufffd{\ufffd\ufffd\ufffd\uc59d~G\ufffd\u0586\ufffdx\ufffd\ufffd\ufffdoB\ufffd\ufffdn\u001c\u000e\ufffd\ufffd\ufffd\ufffd\ufffdN\ufffd\ufffd\ufffd-\r\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd+C];j\u0012\u001b{\ufffdY\u001c-}\u001b\ufffd\ufffd\u0789\ufffd>O]6e\ufffd<2\ufffd\ufffd`+Uc\ufffdf\ufffd\ufffd\u0015\u001333tFe\ufffdS\u0004\ufffd'\ufffd\ufffd-\ufffd\f(\ufffd\ufffd\u0019\u0000C\ufffde\ufffd\fx\ufffdC\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\u0000\u0015P\u0568O\ufffd\n\ufffd\ufffd6-\ufffdvj\u001e(\u0014>\\\u0012\ufffd\ufffdW\ufffd\ufffdu\ufffd\ufffd\ufffd'V\ufffd?w\ufffd\ufffdP\ufffd2\ufffd\ufffd*\u007f\fNQ\u0015\ufffd9\ufffd\ufffd._g}D)\ufffd\ufffd$\u0002\ufffd\ufffd\ufffd'>qb8\ufffd\u0019j\ufffd\ufffd\ufffd;\ufffd\u001c\ufffd\ufffd\n\u000f\ufffd=\ufffd\ufffd\ufffd\ufffdI{\ufffd\u0004U\ufffd\ufffd\u06a4O\ufffd\ufffd\u06fe\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdOLU\ufffd\b\ufffd\ufffd\ufffd\b\ufffdn\b%\ufffdz\ufffd\ufffdQy\ufffdF\ufffd\ufffd:\ufffd\ufffd\ufffd\u036b\u001b\ufffd\ufffd\ufffd\u03be#O\u0016B\ufffd-\ufffd\ufffdD\ufffd\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\ufffdj&l\ufffd\ufffd\ufffd\ufffdfB-\u00c4\ufffd5\ufffdP[bB\ufffdbB\u038b\ufffd\ufffd\u31ce>\ufffd\ufffd\u0017\ufffd\ufffd\ufffd\ufffd#\ufffdn\ufffd=\ufffd\ufffdNw\ufffdl\ufffd-\ufffdU\ufffdO3\ufffd(\ufffdL\ufffd\ufffd\u0005\u0204\ufffdxh\ufffd\ufffd\\z\ufffdA\ufffd\tf\ufffd\u0013`*\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffdX\u001ff\ufffd\u4919\u0014\ufffd/D\ufffdT8F|`f\ufffdJ\ufffd\ufffd/\u0000\u000fK\u0017\ufffd\ufffd\ufffd\ufffdJ\u0005\u0005\ufffd\ufffd`\ufffd%\ufffd2\ufffd\ufffd+\ufffda\ufffd\u04b6\u0006.\ufffdws9\ufffd\ufffdDR\ufffd\ufffd(_\""\ufffd\ufffdBBe+\ufffdQ\ufffdS\ufffd\n\ufffd\ufffd\u00052!^\u000f\ufffd\u001b\u0000\ufffdT\u0000\ufffd\ufffd\ufffd@C\ufffd\ufffd\u0511b\ufffds%\ufffd\ufffd\ufffd:!i\ufffdk\ufffd\u001e\ufffd}\u0013\ufffdJ\ufffd\ufffd$\ufffd\ufffd\ufffd\u0003|!\ufffd\""v\ufffd\ufffdX\u0013\ufffd\ufffdO\ufffd-\u001f%\ufffd\ufffd\u0018\ufffd\ufffd\ufffd\ufffd\u0000\u0012T,\ufffd5\ufffd\u0017@U^|\u0005:.\u03e1\ufffd\ufffd\u001b\u0757d\ufffd^\ufffd\ufffdo\ufffd`\ufffd\ufffd\ufffd\ufffd\ufffdr>G$\ufffd\ufffd\ufffd\ufffd\ufffd\b1\ufffd)\ufffd\ufffd5*\ufffd\ufffdB\\\ufffd\ufffd\r\ufffd\ufffd\r\u001d\u001f\ufffd\ufffd\ufffd\ufffd\u001b~\u001f\ufffd\u0001\ufffdY\ufffd\ufffd\ufffd\ufffd\ufffdFg\ufffd\ufffd\ufffdk\u0013\ufffd&\ufffd\ufffd\ufffdq:\ufffd\ufffd\ufffdB\ufffdj\ufffd\f\ufffd\ufffd(\ufffd\u0015\ufffd\ufffd)\ufffd\u0007\ufffd%Z\ufffd`-\ufffdt}\ufffd{=\ufffd^\ufffd\ufffdMqd@\ufffd\ufffd\u0000Z\u0310\u0019R\ufffd\ufffdi\ufffd\ufffd\ufffdb\ufffdj\u015bG5WL\ufffdt\ufffd\ufffd\u0004C\ufffd=\u058a\ufffd\u0002\ufffd\u0006+\u0015\ufffd\ufffdh1\ufffd\ufffdS5\ufffd\u001e\ufffd^\ufffd{0-\u0017\ufffd82\ufffd0\ufffd3[\ufffd\ufffd\\o\ufffd\ufffd\u001ch?\b\ufffd\ufffd\ufffd\u0013\u02c4\ufffdiT\ufffdu\ufffd\ufffd\u0013mQ\u0011_\f\ufffd\u001f8_\ufffd\ufffd\ufffd[7|\ufffd\b@\ufffd\ufffdL\ufffdlg\ufffd\ufffd\ufffd\u026dUj\ufffdY.S\ufffd\ufffd\ufffdF\ufffd\ufffdb\ufffd\ufffdL\f-\ufffd\ufffd\ufffd\u001a\ufffd\ufffdKX\ufffd\u0000\u0014\ufffdF\r\ufffdUHdN\ufffdq\t\u0014\ufffd\ufffd\ufffd\ufffdp-\ufffd\u0002\r\ufffd[\ufffd\u00147,\ufffd\ufffd\ufffd%E\ufffd#@\ufffd\""\u06c8\ufffd\u0018\ufffd3\ufffd\u000b\ufffd\u000f\ufffd\ufffd\ufffd5A\ufffd\ufffd\u0007#:i\ufffd\u0017\ufffd\ufffd@1V~iN\ufffd\ufffdV\ufffd8%P\ufffd\ufffd\f\ufffds/C\ufffd\u000f\ufffd]\ufffd\ufffd\ufffdUY\u0003\u0016[\ufffd\""?Eh\ufffd\u001f@\ufffd\u045f\ufffd\ufffdD\ufffdVe6\u891c6\ufffd\ufffd\ufffd\ufffd%\ufffd\ufffdEN\ufffd\u0002\ufffd\ufffd\ufffd4'^\ufffd\ufffd\u0013\ufffd\u000ed\ufffdy\ufffd\u0003Q\ufffd\u0012\u03e2\u0019\ufffd\u0002I\u0003\u0004\u0004\ufffd\ufffd\ufffd\ufffdU\u001b\u0010\ufffd\u066c-\ufffd\ufffds\ufffd\u0011\r\ufffdg\n\ufffd4P\u000e\u0017\nt\ufffdK\ufffd\u001d\ufffd\ufffdkkm:\ufffd\ufffdB\ufffd\u074dGN\u0017\ufffd\u000b\ufffdq\u0002:\ufffd\b\ufffd|Qy\ufffd\ufffd\ufffd\ufffd]]AO\ufffdu\ufffd\ufffdA7\r\ufffdY\ufffdKS)\ufffd\ufffd\u001c\ufffd\ufffd\u0647gSg\ufffd}g6\ufffd\ufffd\ufffdR\ufffd@*\ufffd\ufffd@o\ufffd[\ufffd\ufffdZj6\ufffd,\ufffd\ufffd\u0408c\ufffd[\ufffd,l\u0007z\ufffd\u01c0\u0019c\ufffd:\ufffd\u00056\ufffd\ufffd\ufffds\ufffdV\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd9t*\ufffd\ufffd\ufffd\ufffdX\u000eu\ufffd\ufffd\\\u0011\ufffd\ufffdT\u0012\ufffdIrm\u001c\ufffd\ufffd\ufffd\ufffdq4\u001dG\ufffdq\u0014\ufffdVuO\ufffdBPx\ufffd\b/,\u0299\ufffd\ufffd\u0017\ufffd\ufffd a\t*).|B\ufffd\ufffd\u007f$\ufffdp\u0018w3\u0000Z\u007f\t\ufffd\ufffd\ufffd^\ufffd\ufffd\ufffd\ufffd\u07a6o\u001e\ufffd,J\ufffd\u0014\ufffd\u0017\ufffdJ\u000e\ufffd\u0017\n\ufffd\ufffd\ufffd]B\ufffd\ufffd+@R\u0795 \u93c1\ufffd\ufffd\ufffdu\ufffdh\ufffdE(\ufffd\u001dW?\ufffd\ufffd\ufffdFU\ufffd\ufffd\ufffd\r\u52c5bw\ufffd\ufffd\u0012\ufffd\ufffd\u0018j\ufffd\ufffd#\ufffd'\ufffd\ufffdOh\u0013\u0000J[\u001a\u0000\ufffd\ufffd6\ufffd\r5e\ufffd}\ufffd\u001fX\t\ufffdr\ufffdX*W\ufffdh,%emG\u001ee\ufffd\ufffd\ufffd\ufffd\ufffd\u01bc\u0013b\ufffd\ufffd'\ufffd\u0003\ufffd-\ufffd\ufffd6\ufffd9\ufffd$\ufffd\u0532\ufffdT\ufffd\u0006T\ufffd\ufffd,\ufffd\ufffd\u0015\ufffdJukR\ufffdNAS\ufffd\ufffds\ufffdt\ufffd\u0612\ufffd$\r\ufffdA\\\ufffdu\u001a\ufffdn\u0012\u387f\ufffd\ufffdC\ufffd\u0004H\ufffd\ufffde\ufffd\ufffd\ufffdt\ufffd@\ufffdA\ufffd\ufffd\ufffd\ufffd|\ufffd\u0004\ufffd\ufffdM\ufffdm\tx+\u001b\u001e\u000f\u018blI\ufffdT\u0012+\ufffd\ufffdJ%t\ufffd8r)t\\3\t\ufffd\ufffdD_}\ufffdN)\ufffd\ufffd\ufffd\ufffdE\ufffd=\ufffda\ufffd\ufffd\u0487\u0397>t\ufffd\ufffd\ufffdy8yH\u0011\ufffd\u0007*\ufffdg\ufffd\u0000@\ufffd\u0015\ufffd\ufffd\ufffdM\u007f\ufffd\ufffd\f\ufffd,\ufffd\u0018\ufffd \ufffdE\u001f\ufffd\ufffd\u0001\ufffd\ufffd\u0000\u0203\ufffd\ufffd\u0007h\ufffdo\ufffd\ufffd _r/\ufffd\ufffd\u47e9\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0799\ufffd\ufffd\ufffdl\ufffd\u001e\u0005$\ufffd\ufffd&\ufffd\nx\u036ei\ufffd\ufffd\ufffddO\ufffd0\u000bX\ufffdzK\ufffd\ufffd\u07b0\ufffd>\ufffd1k9~\ufffd\u020dh[\ufffd\ufffd\ufffd\ufffd\ufffdk\ufffdY\ufffd\ufffd\u001aM\ufffd_=\bX~g\ufffdrCo\ufffd\ufffdf\ufffd\ufffd\ufffd\ufffda=\ufffd\ufffd\ufffd%vh\ufffd\ufffd\ufffd\u06ac\ufffdRC\ufffd\ufffdv\ufffd6u\ufffd\ufffd\ufffda\ufffd\ufffd\ufffd\u0019K\ufffdJ\ufffd\ufffd;\ufffd\ufffd7X\u000b(a9\u0005x\ufffd_\ufffd\u001c\ufffd-\ufffdKX\u000f\ufffd\ufffdr\ufffd\ufffd\ufffd`\ufffd \u0003\ufffdF+\ufffd~\ufffd\u02bd&\u072fp\ufffd\ufffd^\ufffd\ufffd\u000f\ufffd\ufffd]\u0007\u001f\u0005t\ufffd\u000f\ufffd\u0004\ufffd\u000f\u0005\ufffd\ufffd\\Wd\ufffd\ufffd\n,~\ufffdx\ufffd!Ot\ufffd=]\u05cfR\u001e\ufffdI{~1\ufffd\ufffd_\ufffdl\ufffd=\ufffd\ufffd\u0013G\u007fq{\u001bu\ufffd\ufffd;\ufffd}k\u071b\ufffd\ufffd{\u0014<}\ufffd\ufffd\ufffda8\u0485O\u0437\ufffd\u001e\u0106\ufffd\u0017\ufffd\ufffd\u02b36\ufffd\ufffd[{\u05b4\u0005\ufffd\u0006\ufffd\ufffd/\ufffde\u000f\ufffd\ufffd\u0019\t4\ufffd\u059e+\u042f\ufffd5\ufffd\ufffd\ufffd|\ufffd\u0013}5\ufffd\ufffdHe\ufffdi-j\ufffd\ufffd\u0012j\t\ufffd\ufffd\u0004\u007f\u0015+\ufffdF\ufffd\ufffdB\ufffdu\ufffds\u001d\u0107\ufffd\""LZ\ufffd%\ufffd\ufffd\ufffd\ufffd\r\ufffd\ufffdq\ufffd\u0003\ufffdo\u0014p\ufffd\ufffd\u001bE\ufffd\ufffd\ufffd\u0012\ufffdO,Y|o(Y|cOWjx\ufffd)h\ue35f\ufffdme\u033d\ufffd\u02db{c\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd8 \ufffd\ufffd\ufffd\ufffd7\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001a\ufffd!\u0005R\ufffd\ufffd\ufffd2\ufffd\ufffd\ufffd\ufffd\u0014\ufffd_\ufffd\u000fV\ufffd\ufffd\ufffd\ufffd`eo\ufffd/\ufffd\ufffd\u001c\ufffd+ \u0013\ufffd'\ufffd\ufffd\ufffdw\ufffd\f\ufffd\ufffdF\u001eA\ufffdR\ufffd\ufffd\ufffdA!\ufffd\u0001fT\ufffd\ufffdZ\ufffd\ufffd\ufffd\ufffdm6{\ufffdBg\ufffd\u001b\ufffd\ufffdI%U\ufffdR\ufffd\\\ufffd\ufffdh\u075c\ufffdm\ufffd{\ufffd\ufffdw=\ufffdV8\ufffd7\u0017\ufffd\ufffd7\ufffd\ufffd=y\t\ufffdS\ufffd\ufffd\u0004\ufffd\u007f\u0005\ufffd\ufffd\u000ed\ufffd)\ufffd_\u0019\t\ufffd|b\ufffd\ufffd,\ufffd\ufffd\u0015\ufffd\ufffd;4\ufffdO\u16bf\ufffd\ufffds%\ufffd\ufffd\ufffdeVw\ufffd\u000b\ufffdMTmh\ufffd\u0201\u0697\ufffd\ufffd\ufffd\ufffd\ufffdlz\ufffd\ufffdl\ufffd\ufffdn\ufffd\u00037v\\\ufffdTP\ufffd\r\ufffd\ufffd\ufffd\ufffd|\ufffdr\ufffd!\u0000\ufffd\ufffd\ufffd\u000e%\ufffd@\ufffd\ufffd\ufffd\ufffd\ufffdg\ufffd\ufffd\u0005\ufffd\ufffd\ufffdN\ufffd|\ufffdU\ufffd\u0001Bk\ufffd!\ufffdTV=\ufffd0C(\ufffd-o\b\ufffdy2\ufffdJ\ufffd\ufffd\ufffdp\ufffd\ufffdZ\ufffd\ufffd\u0019\ufffd\u0006\\\ufffdW\ufffd\u0544Tn6\ufffd\u001cu\ufffd5\u047e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv/|\ufffd9\ufffdu\u0002@\r\ufffdV\u0770M^D\u0017\ufffdyp\u001c\t\u0015\ufffdG)\ufffd\ufffdc\f_\ufffd\u0006l\u0004!\ufffdm\u0011m\ufffd\u001d\ufffdC\ufffd\u0014\ufffd\ufffd\u0015\ufffdN\u0011\ufffd\ufffd\ufffd\u0017\u000b\u02ea\ufffdJu\u0001\ufffd\ufffd\ufffd\r~>\ufffd\ufffd1\u001a\u05cf+\ufffd\ufffd\ufffd,\u001a\u0018sf\ufffd\u0002l\u000fq\ufffd\ufffdEo\ufffd,~\ufffd=h\ufffd~\u000bL'\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\f\ufffd\ufffd\ufffd\ufffd.9\u01bd\ufffd\u0013e:\ufffdI\ufffd\ufffda]b\ufffd\ufffd\t\ufffdp5\ufffd\ufffdc\ufffds\ufffd\ufffd\ufffd>\ufffd\ufffd\ufffd\u001c\u001d \ufffd<\ufffd\ufffd\u0014\ufffd\ufffd?\ufffd\ufffd\ufffdi\ufffd\u0653E\ufffd\ufffd$\u00155\ufffd\u0002\ufffd\ufffd\u062c[&O\ufffd\ufffdu\ufffd\u0001Q\ufffd\u05bc[\ufffd\ufffd\ufffd\u0015r\ufffd\ufffd\u07afA\ufffd\ufffdK\u037bpN\ufffd\ufffd\ufffd9\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002R\u001e\ufffd^/D\ufffdTge~\ufffd\ufffd\ufffd\ufffd\ufffd\ufffduX\b\ufffd\ufffd`@\ufffd\b\ufffd(r\ufffd\u0012\ufffd\ufffdn\ufffd\ufffdP\ufffd\u0018=\ufffd)\ufffd\ufffd\u000f\u001c\u001f\r\ufffdI\ufffdHL\u001a\ufffd\ufffdV\ufffd'5\ufffd5\ufffd\u0011\u0018\u001f\ufffd\ufffd\u001c\ufffd\u0005\ufffd;\ufffdQ@\u001b\u0012\ufffd\ufffd\ufffd?\ufffd\u001c\u0014\ufffdw\ufffd\u00022\ufffds\ufffdO\ufffdm`5\ufffd\u0002\ufffdX`\ufffd@\u001d\ufffdJv^\u0015\ufffdD$\ufffd\ufffd\ufffdA%n\ufffdP\u038b\ufffd)\ufffdcv\ufffdg\ufffd\ufffd\ufffd2\ufffdj\ufffd\ufffd\ufffd\nlu\ufffd\ufffdbA9\ufffdS\u001f/j\u0001\ufffd\ufffd\u0015\u001b{\ufffd+\ufffdz[t\ufffd\ufffd\ufffd\u037b{\ufffd\u000e\ufffd\ufffd7N\u07fe\ufffd\\\ufffd\ufffd\u0013\u0002\ufffd'\u0012\ufffdl\ufffd|\ufffd\ufffd\ufffd&\u0007\ufffd\ufffd\ufffdk\ufffd\f\u001e\ufffd\ufffd<6\ufffd\ufffd,\ufffd\ufffd\ufffd\ufffdU]\ufffd\ufffd\ufffd\ufffd\u000e\ufffdm;\ufffd\ufffd\u0296\u001b\ufffduSK\ufffd\ufffdn\ufffd\ufffd\u0013\ufffd\ufffd^\u0007\ufffd\ufffdE\u0012Qz\ufffdP\ufffdDC\ufffdB\ufffd\ufffd:G\ufffd\nI\ufffdl\ufffd\ufffd.\ufffd=\ufffd\u001e\ufffdQh\ufffd\u0013\ufffdl%Q\u05f2D\ufffd\ufffdDM\ufffd\u0015\ufffd\ufffdn\ufffdx\ufffd\u001aD\r_\u0003D\r_\\\ufffd\ufffdc+\ufffdZ\u0006\ufffd\u000e\ufffd\ufffd\ufffd\ufffd4\u000e\ufffd\ufffdC\ufffd\ufffd\ufffd\ufffd.\ufffd\ufffd\ufffd\ufffdNBw;\u039b\n\ufffd^+\ufffd\ufffdq1\ufffdvH\ufffd9\ufffdn\ufffd\u0013\ufffd\ufffd@\u000bo+\u0018\ufffdi0\ufffd\ufffd\ufffd[\ufffd\ufffd\ufffd\ufffd7\ufffda\ufffd\ufffd\u0017[f\ufffdM>\ufffd\ufffd\ufffd2\ufffdc\u001a\ufffd\ufffd\ufffd|6\u001e\ufffd\ufffdp\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd-]5Zm\ufffdU\ufffdj\ufffd\ufffd\ufffd\u0017\ufffdSx\ufffd\ufffdc\ufffd\ufffd\ufffd\ufffd\ufffdm\ufffd\ufffd\ufffd_\ufffd\ufffd\ufffd\ufffdN'\ufffd\ufffd;9yj2l\ufffd6\ufffd\u0002\u001c\ufffd\u0007Fo\ufffd8|l\ufffd\ufffd\ufffd\ufffdd(0\t~>\ufffd9\ufffd\u0012\u05aa\ufffd\u001d\ufffd\ufffd\u0001\ufffd\ufffdj8\ufffd\ufffd\u0000l\ufffd\ufffd\ufffd\r\ufffd\u0568\ufffdv\ufffd\ufffd\ufffdj\u0018\ufffd\u000ev\ufffd\ufffd,\ufffd\u0014\ufffdZ\ufffd\ufffd\ufffd\ufffdw\ufffdG\ufffd\ufffd\ufffd|\ufffdd\ufffdn\ufffd@\ufffd\ufffdkW\ufffdb\u0016s\ufffd\ufffdB\u001f\u0018\ufffd'\ufffd\ufffdH\ufffdPV\u0015\ufffd\ufffd\ufffdI\ufffd\ufffdTA\ufffd\ufffd\ufffd\u0006=\ufffd\u0006z2\ufffd42\ufffd\u0014O[\ufffd\ufffdTy\u000e!\b$\u0007g\ufffd\u00a7V\u001b\ufffd\u001f\u0005\ufffd\ufffd9\ufffd\ufffd\ufffd\ufffd\ufffd\""\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001u\ufffd\ufffd\n\ufffd\ufffd{\u0005\ufffd:\ufffdp\ufffd\ufffd_k\ufffd\ufffd^1V\ufffd\u007f\ufffd\u0011\""\u0013\u053bM\u6a5b\ufffdcs\ufffd\ufffd\u001a\ufffd\ufffd\ufffd\u00f8|\u0011.t\ufffd\ufffd\u00ed;Z\\\ufffd&\ufffdov\r\u001d\ufffd\ufffd\ufffdO\ufffd7\ufffd\ufffdT\ufffd\ufffdG\u0369\ufffdh\ufffd=\ufffd\ufffd\ufffdb\ufffdV\u01f0T\ufffd+7\ufffd\u001f\ufffdK\bB,\ufffd+\ufffdj\ufffd\ufffd+%\ufffdU\ufffdG\ufffd\ufffd`*\u0004\ufffd\ufffd5\ufffd\ufffda2e\ufffd\u001e\ufffd}sb\ufffd+\ufffd\u000eGf\ufffd\u007flJ$\u05c0>\ufffd\u0004}\ufffd\u0001\ufffd\bz\ufffd\u0554|\ufffd\u0013@\ufffd\ufffd\ufffd\ufffd\u0012J\ufffd\u0017\ufffd)\ufffd_V\ufffd!%!\ufffd\u0017\u000b\ufffd\u0014\ufffd\ufffd\ufffd\u001ad\u023d,\u0019v\ufffd\ufffd\ufffd9\u04f0\ufffd7\ufffd&}#wn\ufffd\ufffd\ufffda\ufffd\ufffdDW\""\ufffd\u0019R\u0018\ufffd]U\ufffd\ufffd \ufffd)\u000e\ufffdt\ufffd\u0003l\ufffd\u000f\ufffd\ufffd\u007f\ufffd\u007f?\ufffd\ufffdr\ufffdK\ufffd\ufffd}`S\ufffd\ufffdp\ufffd\u0000x\u0006\ufffd\ufffd\ufffd\ufffdL\ufffd*\ufffd(\u0015\ufffd\u000e\ufffdHG\ufffd\ufffd\ufffd\ufffd`&ID'V\ufffd\ufffd/\ufffd\ufffdc\ufffd\ufffd\ufffd\ufffd\ufffd-\ufffd\u001b\ufffd<\ufffd\ufffd\ufffd{\ufffd\ufffdr\ufffd\u001a\ufffd\ufffd\u0000\ufffd\ufffd\u020f\u0016\tk\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\n\\(\ufffd\ufffd=\ufffd\ufffda2?1\ufffd\ufffdwH\ufffd\ufffd\u000b\ufffd0T\ufffd\ufffd\ufffd\ufffdBgV\ufffd~\ufffd\u0007\ufffd\ufffd*\ufffdr>_\ufffdW(\ufffd\u0004\u001f\ufffd\ufffd\u0006!*\ufffdhI\ufffd\\\ufffd?\ufffd\ufffdr\ufffdUc\ufffdg{\ufffd\ufffd[X@\ufffd\ufffd\ufffd*\u0006\u0182\ufffd\ufffd'!\ufffd\ufffd7\tx*\bx\ufffd\ufffdyU\b\ufffd9\r\u05af\u00a5\ufffdh\ufffdJ\ufffd\u0010\ufffd\ufffd\ufffd\u0017\ufffd\ufffd+\ufffd\ufffdA\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\nJ\ufffdQ\ufffd\u04a6\ufffdY\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0018\ufffd<\ufffd:\ufffd\ufffd\\a\ufffd\ufffdM\ufffdJ\ufffd\ufffdEl\ufffd\u0011t\u0004-\ufffd\ufffd^\ufffd\ufffd\\.\ufffd\ufffd*.7\ufffdTe:\ufffd\u0004\ufffd\u0014\ufffd\ufffd*\ufffd\ufffd\ufffdb\ufffds\ufffdC\u001b0\ufffd\ufffd\ufffd\ufffd:?\u0003t~y\ufffd<\u0006u~\ufffd\ufffd\ufffdiZ\ufffd\u0007k\u07b1\ufffd\ufffd\ufffdf\ufffdG_\ufffd\ufffdiF\ufffd\ufffdk\ufffd)\ufffdMp\ufffdGW\ufffd\ufffd\ufffd:\u04e5\ufffd>k\ufffd\u000bdv\ufffd7Q\ufffd\ufffd\ufffd\\\fC\ufffdp\ufffd\u04b7W\ufffd\u0526\ufffd\ufffdNs~j\ufffd%\ufffds@\ufffd\ufffd\ufffd8|\ufffd\ufffdN\ufffd2?j\ufffd\ufffdn8\ufffd1\ufffd\ufffd\ufffd\u001f\u001f\t\ufffdT*\ufffd\ufffd4\ufffd\ufffd\u001a)_\u0005\ufffdY\ufffd+\u0019j\f\ufffd\\\ufffd\u018a\u0016\ufffd\ufffd\u0007@@\u001a\u0015\ufffd\ufffd?a\ufffd\ufffds\u0017\ufffd\ufffd\tv\ufffdB\ufffdO\ufffd\ufffd9\ufffd\u0007Z\ufffds\u000eZ\ufffd\ufffdG(9\""I\ufffd\u001b\f\ufffd\ue3c0\ufffd\u007f\ufffd\ufffd\u0014.\ufffd\ufffd\ufffd`\ufffd]\ufffd\ufffdq\ufffd\ufffd#Z\u04ff\ufffd\ufffd\r\ufffd\ufffd~\ufffd\ufffd\ufffd\ufffd\ufffd\\\u000fl\ufffd}\ufffdeWw\ufffd&'J\u03c3\ufffdc\ufffdM@s\ufffd\ufffd\ufffd{\u0003\u0355&G\u0267\u000f\ufffdA,DZ\u0018\ufffdQc! &\u0016,t\u0006\u0011\u0019\ufffd\ufffd\u833c\ufffd\t\u001e\ufffd\ufffd~V\u007f?\ufffd6\ufffd\ufffd\""\ufffd\ufffd\ufffd+\ufffd{\ufffd\ufffd\ufffdL\u0001T\ufffd\ufffd}G}\ufffd[_\ufffd\u040f\ufffd\ufffd\ufffd\ufffdU\ufffd\ufffd\u001f\u001d\ufffd\u001e<\u03d4w\ufffdk\u0019\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd:pM\ufffd\r;z\u05c7?\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd{\ufffd\u024d\ufffd\ufffd]|@r\uda56\udcd9\ufffd[~\ufffd\ufffd}\ufffd\ufffd\ufffdp-bC*\ufffdyj\ufffdHJ\ufffd%\ufffd\u0012\ufffd\ufffd\u001b\ufffd\ufffd\ufffd^\ufffd3\u0001\u00f3:\ufffd\ufffd\ufffd\u000b\ufffd;e\u007f\u0013w>\ufffd\ufffd\ufffdx\ufffd\ufffd#1k\u0015\ufffd;\u001f\ufffd_\ufffd0\ufffd}\u025b\u000f\ufffdl\rr\ufffdd\ufffd\u0019Y\ufffd\ufffd\u001c\ufffd &\ufffd)\u01bc\u0013\ufffd\ufffd;=\u043c\ufffd=\ufffd\ufffd]n\ufffdY}\u001e{\ufffdi\u0004\ufffd\u001b\ufffd\ufffd.\ufffd*\ufffd\n\ufffd\ufffd\u0018\ufffd\ufffd\u05d4\ufffd\ufffdJ\ufffd1<\ufffd\ufffd\ufffd\ufffd}\ufffd\ufffd\ufffd*\ufffd\ufffd\ufffd\ufffd\ufffdOZ\ufffdO\ufffdj\ufffd\u0013Z\ufffd\ufffd,\ufffdu\ufffd\ufffd.\ufffd\ufffdg\ufffdSZ1%.,\ufffd\ufffd\u0016\u0005.\ufffdD|Y\ufffd>\ufffdJ\ufffd@E\ufffd\ufffd\n\ufffd\ufffd[\ufffd\ufffd{\tW\u0642fG\ufffd\""{I\ufffd\ufffd^}#\ufffd#\ufffdQ\ufffde\ufffd\ufffdPOr\ufffdD\u001b\ufffd(\ufffd*-&#\ufffd}$\ufffd\n\u0019\u01fe\ufffdi\ufffd\u0798ke\ufffdl\u0006\ufffd\u0001\u000e\ufffd\ufffdd\ufffdy~\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\nJ\u0018\ufffd\ufffd3\ufffd\ufffd.\ufffdJ\u047a\f\n\ufffdm$\u0000\u0005\ufffdL\ufffd`\u0017<\ufffd])O_\ufffd\u0006yK\u0016 \ufffd\ufffd/7\ufffd\u0011\ufffd\ufffd\ufffd_`U\u0011y\ufffd4}\ufffd\ufffd\u001fi\ufffd\ufffdt\ufffd\ufffd\u000f}p\ufffd\ufffd\ufffd)B\ufffd\u0015K\ufffd&\u0015\ufffd'\u0004Z\ufffd\ufffd^7\ufffdR\ufffd!k\ufffd\u048e~r\ufffdU\ufffd\ufffd\ufffdl\ufffd\ufffd0\u0014\ufffdO\ufffd\f\ufffd\n\ufffd\ufffd\u001f\ufffd\ufffd<\ufffd\ufffd\ufffdh9\ufffd@\ufffd-\ufffd\ufffd>\ufffd\ufffd\u2402\ufffd\u001e(p\ufffd\ufffd%\ufffd[\ufffd\ufffd\ufffdk\ufffd\ufffd\ufffd\ufffd\u007f\u0013\ufffd6\ufffd\ufffd2\ufffd^\ufffd\ufffd/$\u0004\ufffdp\t\u000f\u0010\ufffdJ\ufffd\ufffd\ufffdG\ufffd\u0cf3>m\ufffd\ufffd\u0003\ufffd\ufffd>[\u007f\ufffd\u0014\ufffd\ufffd\u0002}\ufffd\ufffd\ufffd{f\ufffdX\ufffd\ufffd\n\ufffd\u0003\ufffd\ufffd{\ufffdP\tO\ufffdW\ufffd0\ufffd\ufffd\n\ufffd\u0018\ufffd\u00c2\ufffd\ufffd\ufffdV\ufffd=\ufffd\u0018Gx\ufffd\ufffd_kP\ufffd\u001f\ufffdha\ufffd\ufffd\ufffd\ufffd\ufffd\u0013[\ufffd\u0144ZQfP\u001b\t\u001e\ufffd\ufffd\ufffd\ufffd(a\ufffd>Z\ufffdu\ufffd>Z\u000f\ufffd\ufffd\ufffd\ufffdS\ufffd\ufffdV\ufffdD\ufffds\ufffdG\u000b\ufffd\u0012\ufffdb\ufffd'\ufffd\ufffdR\u00f9J\ufffd\ufffd\u00020\ufffd\u000b\ufffd\ufffd\u0006\ufffdeI\ufffd`\u0006E\u0015\ufffd\ufffd\ufffd\ufffd\u01d9*\u001d\ufffd\ufffdY,\u00007\ufffdL2\u0014+{\ufffdje3uY\ufffd\u0010\ufffd\ufffd\ufffd;x\u0017\ufffd\tc\ufffda\u0001J(\ufffd\ufffd\u0001\ufffd\u0010\u000eL\ufffdF\tA\ufffd\ufffd\ufffdC\ufffd!t\ufffdg9\ufffd\ufffd\ufffd>\""}\ufffd>\ufffdGD\ufffd(Pad\u0018\u0135\ufffdAH\u0005\u029c_\ufffd\ufffd\ufffd\ufffd\ufffdc\u02f3\ufffd\u0447\ufffd\ufffd\ufffd\ufffd\u0019K\ufffd\ufffd\ufffd\""H\u0001\ufffd\ufffd]\ufffd(\\\u038b\ufffd\u001dO\u001d\ufffd\ufffd\ufffd)\u007f\ufffd\ufffd\u0511\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdn\u000f\ufffd\ufffdd5\ufffd\ufffd-\ufffd}Y\ufffdN\ufffd\ufffdz\ufffd\u01e7'\u0006\u001e\ufffd\ufffd\ufffd\ufffd\u0017\ufffd\ufffd\u000f'\ueeea\ufffdJ\ufffdy\ufffdG\ufffd\ufffd\ufffd\ufffdH\ufffdY\ufffda\ufffdq\ufffd\ufffdo\u0006X%\ufffdJ\ufffdQp:\u0368\ufffd\fu\ufffdP\ufffd\u0011u\u001aP\ufffd\u001e\ufffd\ufffd}\ufffd\ufffd\ufffd\u001e\u001d\ufffd\ufffd\ufffd'\ufffd0\ufffd9\u001c\ufffd0\ufffd\ufffd\ufffdG|l\ufffd\u0019\u001f\ufffd\ufffd>6\ufffd\ufffd\ufffd\ufffdr\u001f\u001b\ufffd\ufffdW\u0004$$3\ufffd`#\ufffd\u0018~\u0017\ufffd\ufffd\ufffd3x\ufffdg\ufffd${\ufffd\ufffd\ufffd\ufffd9\ufffd\u0016t o!h\ufffd\u0000\ufffd\ufffd\ufffd\u0014\ufffd;\ufffd\ufffd\ufffd\u0011E\ufffd_\ufffd\u0013h\ra\ufffdk\ufffd\ufffd\u007f\ufffd_\ufffd\u001f\ufffd?c\u000f\ufffd\ufffd\ufffd<\ufffd\ufffdL%\ufffd\ufffd\u0005\ufffd\u0016<\ufffd\u001eK\ufffd\ufffd\ufffd\ufffd\ufffdo\ufffd*\ufffd\ufffd\ufffd]\""\ufffdU\ufffd\ufffd\ufffd\ufffd\ufffd\\\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdU\ufffd\ufffd\ufffd\ufffd)\ufffd%zL\ufffd\ufffd\u0004\ufffd7\ufffd\ufffd2\u0018W\ufffd*\ufffd\\V(T\u0003g\ufffd\ufffd>\ufffd\ufffd\ufffd\ufffd\ufffd\u0000q^\ufffd9fDR\ufffd`\ufffd\u00111\u04c5b\u0018E[\fsP^1\ufffd\ufffd\ufffdy\ufffd\ufffdJG\ufffdt\ufffd\ufffd\ufffd\ufffd\u0437\ufffd%\ufffd\u04c1\ufffd\ufffd\u0014\ufffde'\ufffd#\u0012hi\ufffdp\ufffd.3\ufffd=\ufffd@\ufffdM\ufffd\ufffd`\ufffd\ufffd\u000f}^\ufffd@aV\ufffd5\ufffdL\ufffdt\ufffdh\ufffd;x\ufffd\ufffd{h\ufffd\ufffd2\ufffdsNA\ufffdC\ufffd\u0018\ufffd2\f:\ufffd\u0004;z\u0018\ufffd\b@WF\ufffd\u0013\ufffd{;\u0002{;\u0002\u0014\u000e%\ufffdX\ufffd^\ufffdD\ufffd)\u0018\u001f\ufffd\r\ufffd\ufffda0\ufffdER\u0014\u0010\ufffd\\ltK#lid\ufffd\u0003\ufffd\ufffd\ufffdyD\ufffd\ufffd\ufffd\ufffd9\ufffd\ufffd\ufffdX\ufffd\ufffd\ufffd3I\u0006\ufffd[\t\u0006O\ufffd\ufffd\ufffd\ufffd3\u0014\u001d\ufffd:\ufffd\ufffd\u04c2\ufffd\u001e\ufffdG\u0197\ufffdQ\ufffdD\ufffd\ufffd8\ufffd-\ufffd^\ufffdl\n\ufffd\ufffd*RK~\u00170\f[\u0006\u0015s\ufffd,\ufffd.\u016d\ufffd\ufffd\ufffdS\ufffd\ufffd\u0004\ufffdt\ufffd,\ufffd\u0727\u0010\ufffd3t\ufffdT\ufffd\ufffd\ufffd\""\ufffd\ufffd\nMV\u0017\ufffd\u057eh\ufffd \ufffd\ufffdV\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv*\ufffd\ufffd\ufffd\u0012HJ\ufffdw?K\ufffd\ufffdx'\ufffd\ufffd\b\u0003\u0002\ufffdg\ufffdVQ\ufffdN5\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\ufffd\u0002uzP\ufffd\u001bu\ufffdP\ufffd\u0011u\ufffd\u02e7K\ufffd\ufffd\ufffd\ufffd[\ufffd\ufffd\u0568[\ufffd\u0002\ufffd\u0000B\ufffd\ufffdQ'\u0017\ufffd\u001bQz-U0ki@\ufffd\u0003?h\ufffd\u0004\ufffd\u04dd\ufffd\ufffd\ufffd\ufffd\u000b0\u05fb)\u0018$\ufffd\u000b\ufffdQe\ufffd\u0006\u0001\ufffd=\ufffd\u0001\u000e\ufffd\ufffd\ufffd\ufffdP\t\u00120\ufffd\u0002\ufffd,F\""\u001e\ufffd\u02ec\ufffd\\\ufffd\ufffd\ufffd\ufffd\ufffdA\ufffd\ufffd\ufffd\\n8\ufffd\ufffd\u0018\ru\u0018\u0014\u00026;\ufffd?JV\ufffdB?\ufffdf\ufffd\ufffd\u007f\u007f[\ufffd\ufffd\ufffd3t\ufffdT1)\ufffd\ufffd~/!\ufffd8\ufffdD\ufffd\ufffd\u0012W\ufffd+\u0336\ufffd\ufffd8E\ufffd\ufffd\ufffd\ufffd\ufffd.\ufffd{\ufffd\u007f\ufffdRL\ufffd\u0000=\ufffd:%<\ufffd\ufffd(` \u0015\u001c\u0010\ufffdg/8\ufffd\ufffd5\ufffdf\ufffd#\ufffd\ufffd\ufffd\r\ufffd\ufffd\u0006\ufffd\ufffdYS=U\ufffd'A\ufffd\ufffd\ufffd\ufffdk\ufffd\ufffd\u0312Z\u016e\ufffdU\u0423I\f\ufffdU\ufffd3\ufffdO\ufffd`\ufffd\ufffd\ufffd\ufffd\u000b\ufffdW\ufffd\u0011\ufffd\ufffd\u001e\ufffdr\ufffdep \ufffd\ufffd@\ufffd\u0453\ufffd\fN\ufffdg\ufffdJ\u0004\u0001\ufffd\ufffdR\ufffdy\ufffdXE)\ufffd0!-\ufffd\ufffd1n<\ufffd\ufffd+\ufffd\u001fZ\ufffd(t\ufffd\\\u0005\ufffdc\f\ufffd\ufffdQ\ufffd\rvv>?\ufffd\u001a3Q\ufffda\ufffd\ufffd\ufffdYA\ufffd\u0005{\ufffd\ufffd\u0002b\u0007\ufffd~\ufffdK\ufffd\ufffdN\ufffd\ufffdE\ufffd\ufffd\ufffd\ufffd\ufffd\t\ufffd\ufffd\ufffd\ufffdD\u001f\ufffd\ufffd\ufffd\ufffd4\ufffd\ufffd\ufffd$\ufffdAAB\u0007\ufffd2\ufffd\ufffd~\ub883\ufffd\u0012\ufffd\u000e\ufffd\ufffd\ufffdY\u000fM\ufffd\ufffd/\u046c\ufffd\t\u0334'i\ufffd\ufffd\ufffdY\ufffdI\ufffd\u018aH\u001b\ufffdF\u0012\f#\ufffd\ufffd]\u0004i\ufffd \u0664\u001c\ufffd\ufffd\u0017Z\ufffd\ufffd\ufffdI?\ufffdb\ufffd\u0015A0I'\ufffdV\u0004\u06ca~Y\f\ufffd\ufffd'\ufffd\ufffd\ufffd)El%\ufffd\ufffd\ufffd\ufffd\u001c\ufffd~E;\u00a9Y*Q\ufffdiF\ufffd\ufffd{\ufffd\ufffdo\u03836\ufffd\ufffd\ufffdm\b\ufffd%\ufffd\b\ufffd\ufffd\u001c \ufffdT \ufffd}\ufffd\u000bw&K\ufffd\u0001.\ufffd\u0608\ufffddB\u01b5qig\""\u0017\ufffd;\u0013/\u061a)\ufffd\ufffd\u0384\ufffdn\u0004=\ufffd2\u009c(\ufffd\ufffdy\ufffd\u0759\ufffd\u001b=C\ufffd\ufffd Z\ufffd\ufffd>:\ufffdG\ufffd\u001bu\ufffd\ufffdz\ufffdXYa\ufffd\ufffd\u0003\ufffd(-i\u00f2k#h*\ufffd\u001c\ufffd\ufffdp\ufffd\u0011\u0014\ufffdE\ufffdgEd2+\u0002\u000f\ufffd\u914cq1<\u0007gB\u0006\ufffd>\ufffd4\u0003yN\u0001\ufffd\ufffd\u03e0\ufffdLcf*\ufffdqf\ufffdL\u0011\ufffdS\ufffd\ufffd\u000buQ\u001fX\ufffd\ufffd\u0107\ufffdpS$`7E\ufffd\u0553v\ufffd\u0005\ufffd\u0002t!\ufffd7\u001b]>7\ufffd\ufffd\ufffdV\ufffdU\ufffd\u001eo`\ufffdTNo\ufffd\u0004\ufffd\u06e5\ufffd5\ufffd~\ufffd\ufffd[\ufffd\ufffd\ufffd\ufffd\ufaadP\t\ufffd\u01db\u061b\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\u0013\ufffd3\ufffd?\ufffd\ufffd\ufffdm\u00191\ufffdPX\f\u001a\ufffd\f\ufffd+\ufffd\ufffd>\ufffd%\ufffd\ufffd:\ufffds\ufffd\ufffd[<3Y\ufffd\n\ufffd\ufffdZ\ufffd=\ufffd\ufffd\ufffd\ufffd\u001b\ufffd\ufffd\ufffd\f\ufffd\u0001J\u001c\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0012\u001e[\u048a\ufffd\ufffdm\ufffd\ufffd\ufffd\u0652Z\ufffdj\ufffd.\u0011\ufffd%.\ufffd\ufffd\ufffdy\ufffd\u05e0D\u02164\ufffd:\ufffd\ufffd\ufffd\ufffdD\u0116\ufffd\ufffd\ufffd\ufffd\ufffdVb\ufffd$\nZ\ufffd\ufffdu$\ufffd\ufffd\ufffdy\ufffd^\ufffd\ufffd\ufffd-\ufffd\u0007%\ufffd\ufffd\u0012\u0019[2\ufffd9\ufffd\u001d\ufffd\ufffd\n\ufffd\ufffdl\ufffd8\u0582n\ufffd\ufffd\u0002%\n\ufffdd\u0010\ufffd\ufffd\ufffd%JXB\ufffd\n}\u061bX\u001b\ufffd\u05f7\u0018)\ufffd,\u001d)\ufffd\f\ufffd\u0014\ufffdS\ufffd\u0001\ufffdO\ufffd\ufffd.\ufffd\u0014\ufffd\u04c2\ufffd\u0000\ufffd\ufffdi\u0001\ufffdT\ufffdH\ufffd.\ufffdH\ufffd0\ufffdboz\ufffd\ufffd\ufffd\ufffd;\ufffd\ufffd\ufffdv\ufffdg\ufffd\ufffd\u000eC\ufffd\ufffd\""\ufffdP\ufffd4\ufffd\ufffd\ufffd\ufffdz\ufffd\ufffda\ufffd\ufffd\ufffd\u5a2a}kWuuUO5uuuw\ufffd\u0005\ufffd\ufffdG\u001a{\ufffd\ufffd\ufffd<\ufffd\ufffdie\ufffd\ufffd,0\ufffd\ufffd_K^_\ufffd\ufffd]\u001b\ufffd\ufffd\ufffd6\ufffd\ufffd(\ufffd\ufffd{\ufffd\ufffd\u000f[\ufffdw\r-\u0610\u0003H\ufffd\u001eF\u04229H\ufffdIB\u0007q\ufffdh5\ufffd\ufffdR\u001a\u0012\ufffd\u001d\r\ufffd\uf7e0p-\ufffd0k\u0412{\ufffd\n\u0007\ufffd\ufffd\r,\ufffd\ufffd\ufffd\u0002\ufffd\u0013\ufffdP\u001bK\u007f\u0002r\ufffd\ufffd3qO\u0703e\ufffd\ufffd%\ufffd\ufffd\ufffdf\ufffd\ufffd>\ufffd-\ufffd\ufffdv\ufffd\ufffd\u062e\ufffd[C\ufffd\ufffdf\u0005\ufffd&r\u07ea\ufffd\f\ufffd\u001e\ufffdR^\ufffd\ufffd\ufffdz\ufffd\ufffd^#\ufffd;\ufffdL5\ufffdC\ufffdCh\ufffd\ufffd\ufffd.\ufffd\ufffd\ufffd\u0011\u823bi\ufffdFM\ufffd\ufffdh\ufffdp\ufffdgS\ufffd\u02d0X=r\u0005\u0018\u05f3w;\ufffd*\ufffd\ufffds\ufffd\ufffd\ufffd\u075b\u001a/\u0015,\ufffdNQ\u0012\u056c\ufffd\ufffdl\ufffd\ufffd\u0138\ufffd\ufffdq\ufffd\ufffd\ufffd]\ufffd\ufffd\u0015\ufffd\ufffde\ufffd5k\ufffd\u001b\ufffd7V\ufffd\ufffd\ufffd\u000fJ\ufffd\ufffd\u0011\ufffd`\ufffd?8\ufffd/\u0012\ufffd\ufffd,\ufffdCI\u0198\ufffdhI\ufffd\ufffd\ufffd'^u\ufffd\ufffd\u011dN2\ufffdB\ufffd\ufffd\ufffd\u037aB)\ufffd7\ufffdv\ufffd\ufffdy\ufffdQg\ufffdD\u0005srN\\\""\ufffdc\ufffd\ufffd\u000b\ufffd\ufffd!R\ufffdfS\ufffd\ufffdV\ufffd-u\ufffd\ufffd4\ufffd\ufffd\ufffd\ufffd0g\ufffdU\u0013\ufffd\u0011\ufffd\ufffd\ufffd\u0116\\=\ufffd\\\ufffd\ufffdFc\ufffdZ\ufffd\u069d\ufffd,ZfI\u000f\ufffd\ufffdi-\u001aV\ufffdR\u0003\ufffd';\ufffd\ufffd=i\u000f\ufffdd\ufffd\u0004\ufffdo\ufffd\u0018\u000evo\ufffdr\ufffd/\u000e\u000f\ufffd\ufffd\ufffdd\ufffd[\ufffd\ufffd5\u000b\ufffd]\u0010\ufffd\ufffdVG\ufffd\u0369\u0019\ufffd\ufffd\u0011\ufffd\ufffd\u078eD\ufffdh6Z\u001c\u0006\ufffd\ufffd\u045bE\u019e\u001b\ufffd\ro\ufffdp\u0091.\ufffd\u001a\u00188\ufffd\ufffd\ufffd\ufffd\ufffd\u000bf\ufffd\ufffd\u00cd\ufffd\u061b\ufffdL\ufffd%\ufffdB\u001d\ufffd]\ufffd\ufffd\ufffd\ufffdf\ufffd-\\\ufffd\u029c\ufffd\u000b`\ufffdG\ufffd1Cd\ufffd3z\ufffd\u0001\ufffdS*\ufffd\ufffd\ufffd(\ufffd@\ufffd\ufffd\ufffd\u001a8\ufffdd\ufffdV{\u062a?\ufffdc\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd,\ufffd?\ufffd\ufffd\u0012\ufffdy\u0015|?\ufffdj\u0012\ufffd\ufffdq5\u0005\ufffd(h2\ufffdnp\u007fU\u0019\ufffd\u0018\ufffdZ\ufffd\u0002\uf048p}c\ufffd\ufffd\ufffd\ufffd\ufffd;\ufffdZ\ufffd\ufffd\u0018\ufffdhW\ufffd\u001b\ufffd\u0017fUd\ufffdC\\c\ufffd\ufffdY\ufffd\ufffd:^x\ufffd\u0012?HZ^\ufffd\ufffd\u0012\ufffd\ufffd\u07f6#\ufffd\ufffd\ufffd\u0019_\u0011_~\ufffd\ufffd\ufffd\ufffd\u000f\ufffdU*\u0002yP\ufffd\ufffd\ufffd\ufffdd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdl0'\u000b\ufffdQ\u0002WCd\ufffdb\f\u0577\ufffd\t\ufffd\ufffd\u0001o\ufffd\ufffd\ufffd\ufffdG3\ufffdV\u000b;\ufffd\ufffd\ufffdS\ufffd\ufffd\ufffd\ufffdB\u061dr1\ufffd \ufffd\ufffdf\ufffdf\u030c\ufffd}\u001a\u0007\ufffd\ufffd\ufffd\ufffd\uabc3<\ufffd\u0002\ufffd9\t\ufffdT\u001bw\ufffd\n\ufffd\ufffd\u0005\ufffdxZk\ufffdh\ufffdg\ufffd\ufffd\ufffd\u0019\ufffdb9.\ufffd\ufffd>\u0007r\u01e3Q\ufffd\ufffd<\u007f\ufffd\ufffd9\ufffd\u0630o\ufffd\ufffd{4w\ufffd\u00023\ufffd\ufffd\ufffd+\ufffd!\ufffd\ufffdK\ufffd\ufffdL\ufffd\ufffd\ufffd\ufffd;\ufffd\u0005\ufffdhex\u015e\ufffdM\ufffd\ufffd-\ufffd\u06189\u0019u\ufffdi\ufffd\ufffd\ufffdV\u007f\ufffdQ\\\ufffd\ufffd\u0000\ufffd\u068e\ufffdM\ufffd\ufffd\u074c;\u0017\ufffd/v\u001a\ufffd\ufffd\ufffdP\ufffd\ufffd&Z7\r\ufffd[\ufffd~b\""\ufffd\ufffd\ufffd\ufffd\ufffd\u0000I\ufffd\ufffd\ufffd\ufffd7\u0019H\ufffd\ufffd\u0002\ufffd\ufffdi\ufffd\ufffd/\ufffd\ufffd\ufffd\ufffd}F\ufffd8\ufffd\ufffd`\ufffd\u0002Y\ufffd\u0019\u0019X\u00076C\ufffdp\u0562\u0010 /\ufffd\ufffd\ufffdV\u04c1\ufffd \ufffd1\u0011\ufffd\u001b\ufffdA\ufffd\ufffd\u000b\u01d7K\u001aB\u0016\u07a8(\ufffd>l%]\u001d\ufffd\ufffd\t\ufffdVU\ufffd&\ufffd[@\ufffd\ufffd%@\ufffdz\ufffdAO\ufffd\ufffdj\ufffd;\ufffd\ufffdH\\\u0158\u0004A7\ufffd\ufffd\ufffdF\r\u001b}\u0003\ufffd\ufffdw\ufffda\ufffdO\ufffd\u0006\ufffd\ufffd\ufffd.\ufffd\ufffd\u0007e\ufffd\ufffdZ\ufffdN\ufffdH\ufffdZ\u0006\ufffd\ufffd\u0018\ufffd\ufffd\ufffd\ufffd%\ufffd\ufffds\ufffd\u001c$:\ufffd\u0014\ufffd\ufffd&\ufffd\u0015L\ufffd\ufffdt,C`>\u0387\ufffd\ufffd\u0007|\ufffd\ufffd\u000e\ufffd\ufffd\ufffdv\ufffd|;h\u007f\ufffd@2\u0770\u000f\ufffd\ufffd\ufffd\u001ej\ufffd\ufffd\ufffd\ufffdH\ufffdt\ufffdh\u007f\ufffdB4\ufffd\ufffd\ufffd\ufffdV\ufffd\ufffd1\u007f\ufffd]\ufffd\ufffdN\ufffd\u03dbk\ufffd\ufffd\ufffd\ufffd]\ufffd\ufffd\ufffd\ufffdk&\u0003\ufffdA\ufffd\u06ff\ufffd\ufffd\u007fk\ufffds\ufffd\ufffd\ufffd\r\u000fu\ufffd\ufffd\ufffdYO&\ufffd\ufffdj\fu\ufffd\u0003y/7\ufffdx\ufffd\b\ufffd}%\n\ufffd2\ufffd5\ufffdG\ufffdEO\ufffdX\ufffd)\ufffd\u0007\ufffd=\ufffd\ufffd#\ufffd\ufffd\ufffdDK*\""\ufffd\ufffdN\ufffdX}\ufffd\u001a\ufffdy\ufffdF\ufffd?d\u03a5\ufffdH\ufffd\ufffd!\ufffd\ufffdAn!|\ufffd\ufffd\ufffd\ufffd\u0002j:Z1\ufffd\u0001OJR\ufffd-\ufffdJ\ufffd\ufffd\u0012(\u001dG\u06e6\ufffdo9dy\ufffd\ufffd\ufffd\ufffds\ufffd\ufffd\u0019\ufffd\ufffd\ufffd-\ufffd\ufffdWZ\u000eQ\ufffd\ufffd*\ufffd\u0005z\ufffdZ0\ufffd\ufffdp\u001c>A\ufffdu]\u007fL\ufffd\ufffdM\ufffd\u001ds\ufffd&<\u0010\ufffd\ufffd:\ufffd\ufffd\u001a)\u0006Z\ufffd\ufffdd\ufffd\u000b\u01b3\ufffd\ufffd\ufffd:m\ufffd\ufffd=\ufffd\""\u021f\ufffd\ufffd@\ufffd\u001f\ufffd\ufffdX\u0193\u000b\ufffd\u0016\ufffd$\ufffdc\ufffd\u02b2_\ufffdc\ufffdZ=\ufffd\ufffdJ:\ufffd6PZ\ufffd\ufffd\ufffd\u0006\ufffdW^\ufffdm\ufffd<\u0014)n\ufffdD{ym\ufffd*\ufffd\ufffdvO\ufffdg4C\ufffd\ufffd>\ufffd\u000b\ufffd\u0010\ufffd\ufffd\f\ufffd\r\ufffd\u057c\ufffda\fe\ufffd\u001eW\t\ufffdZ\ufffd\ufffd\u001f\ufffd\u884a\ufffd\ufffd\ufffdN\ufffd=^QY,\u00a3\u0015\u000b\ufffd\u013dx\ufffd\ufffdH\ufffd\ufffdw\ufffd\u001f\ufffd\ufffd\ufffdQ\ufffd\u001a\f\ufffd\ufffd\ufffd\ufffd{\u000e(\ufffd,;\ufffd\u000eG\ufffd}t\""\ufffd\u042c\ufffd\ufffd\ufffd\t\ufffd\u0015\ufffdQ\u00c7 \ufffdpxX\ufffdpx#\ufffdp\b\u001e>er\ufffda=\u04f3.\u000eO\ufffd\u0004K\ufffdt\ufffd;/r\ufffd$\ufffd\u0692\u0005.\u000e7w\ufffdw\u0016U@g1\ufffd&V\ufffd\ufffd\ufffd>^\ufffd\ufffd<\ufffd6\ufffdy\ufffd\ufffd'\ufffd\ufffd\u000f\ufffd\u007f\ufffd\ufffd\u007f9\ufffd\ufffd\u0012p\u0015\ufffd\ufffd>|\ufffd\ufffd\ufffd\ufffdcG\ufffd\ufffd\ufffd\u0010[\ufffd\u001e/,\ufffd$,\ufffdz\ufffdt\ufffd\ufffd\ufffd\ufffd\u00ca\ufffdCX\u1407\ufffd\u001bO\ufffd\ufffd\ufffdV<\ufffd\ufffdPA\ufffd'QJ\ufffd|\ufffdY\u001f\ufffd\ufffd\ufffd\u0002\u0002\u0000s}\u001c\ufffd\u0017|y/\ufffda%F\ufffd\u820e\ufffd\ufffd\u000e\u001c\ufffd[\ufffd\ufffd\u0128\ufffd7\ufffd7~\ufffd\ufffd\u68c7\ufffda\ufffdp4\ufffdq\ufffd\u007f\u001e\ufffd\ufffd\ufffd\u0003($)4\ufffdx\u03d1\ufffd\u01e0$\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\""\ufffd bN-g\u0005\ufffd\u0013\ufffd\u0011\u0017\ufffd\ufffd'\u021b\ufffd2\ufffd\n\u000e\u0015\ufffd\ufffd\ufffd_\ufffd#\ufffd\u0013\u0015\ufffd\b\ufffd;Q\ufffd7?\ufffd>\u0018|\ufffdwp\ufffd\ufffd\u022e^\ufffd\ufffd\u007f\ufffd\u0212\ufffd%\ufffdS\ufffd\ufffd\u0010\ufffd\ufffd<\ufffd\u0011\ufffdG8\ufffd2\ufffd\ufffd\u0147\ufffdd\u0012\ufffd?>1r\ufffd\ufffd\\a\ufffdu#\ufffd\ufffd\ufffd\u000e{qy\ufffd\u007f]\ufffd\ufffd\ufffdX\u000e9\ufffd>\ufffd>\ufffd\u0019\ufffd;\ufffd\ufffd\ufffd\r\ufffd|\ufffd\ufffdU\ufffd\ufffd\u0007\ufffd#\ufffd\ufffdy\ufffd\ufffd\ufffdE\ufffd\ufffd\ufffd\ufffdr\ufffdC=\u001f5Q\ufffd\ufffd4o3\ufffd\ufffdx\b5\ufffd\u0000\u0004\u0004O\ufffd4\u0006\u0013g\ufffd\ufffd$\ufffd\ufffda\ufffd\u0237\ufffd\ufffd)B#\ufffd0]\ufffd\ufffd\u0003p\u0000\ufffd\u0002 \ufffd\ufffd\t\u001b\r\u0019\uda8c\udc2dh\ufffd\ufffd\ufffd\u001fC\ufffd9\ufffd`\ufffd\ufffd\ufffdi830\ufffd\b\u001f1\ufffd\ufffdi\\W/\u0005\ufffd%\ufffds\ufffd\ufffd\ufffd\ufffd\ufffd.\ufffd[\ufffdR\u000fU\\\ufffd\u0007+\ufffdo \u0147\u001b*X\ufffd\ufffd\u0005\u001b\ufffdU\u001f2\ufffd\\\ufffd\u03fc\ufffd\u0011d\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdnoO.\ufffd\ufffd5\u001a\ufffd\u001e\ufffd\ufffd\ufffd.V\bu\ufffd\ufffdR\ufffdZ\ufffd\ufffd\ufffd\ufffdh\ufffd\u0351\ufffd8\ufffd*\b\ufffd\u0001Aj\ufffd\ufffd\ufffd`qY\ufffd\ufffd\ufffd\ufffd:\ufffd]\u0011\ufffd\ufffdh\u03a1ax\ufffd*\ufffd\u0004\ufffdg8\ufffd\ufffd7\ufffde\u0003\ufffd&\ufffd\u001au\ufffdl\u0717\u432cJodt\ufffd\ufffd\ufffd\u001ay\ufffd5\ufffd\u0015pd\""\u000eZ%\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\ufffd.\ufffdN\u0005Wo\ufffd\ufffd\u05776p\ufffd\ufffd\ufffd \ufffdl\ufffd\u0004H\ufffd=d\u054ei\r\ufffd\u017f\ufffd\u0773\ufffd}\u001fZ\t\ufffd\u072f\ufffdS\ufffd\u0589\ufffd\u0004N\u000b\ufffdPQ\ufffd\u0000\u001b\ufffd\ufffdf0P\ufffd\u0001\ufffd\ufffdwp#~\u001bV\ufffd\ufffdM\u007f\u0002K\ufffd#g\ufffd-\ufffd\u0016\ufffd\ufffd,\ufffd,\u000b\ufffdGu\ufffd\u001b\ufffd#\ufffdA\ufffd8\u001e\ufffd\ufffdK\u0002\ufffdC\ufffd\ufffd\tY\ufffd}\u000bP\ufffd3\ufffd\ufffd\n\ufffd\u001fI\u001e\ufffdD>NJ\u000f5\u06eb\u000f\ufffdV\u0014\ufffd\u0007\ufffd\ufffdy\u0018\ufffd\u0018\u0019\ufffd\ufffd\u0014-'\ufffd\u0011 \ufffdj\ufffd9\ufffd\u001ew\ufffd\ufffd\ufffdH\ufffd\ufffd\u0333F\u0011\ufffd\ufffd\u0019\ufffd\ufffd\ufffd\u007f\u001a\ufffd\\\u71b2\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd`\u041a-\ufffdq\ufffd\ufffd\ufffd\u001blQG&G\ufffd\""\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0001\ufffd55\ufffd)3\u0004\ufffd\ufffdqX\ufffd\u00102\ufffd\ufffd\ufffd\u000fdQ'J+IZ(\ufffd!\u000f\ufffd\ufffd\""=\u0010\u000e\ufffd\ufffd\u001b\ufffd\ufffd\u0001\ufffd\ufffd\""(\ufffd\ufffd\ufffdx\ufffdD\u001c\ufffd\ufffd\u0003\u0015\ufffd\ufffdu\u007f\u0003\ufffd\ufffd\ufffd\u007f\ufffd\u0004\u000f\ufffdcW\u0017E\ufffd\ufffd\ufffd\ufffd:\ufffd\ufffd\ufffd\ufffd\u067f\ufffd\ufffd\ufffd\u001c\ufffdn\ufffd\u0018\u000b:\ufffdh\ufffd\u000f\ufffdF\ufffdt_\ufffd\b\\\ufffd\ufffdeY\ufffd\u001d\ufffdNW\ufffd\ufffd:\ufffdvG\ufffd\ufffd\ufffd(\ufffd\ufffd'\u0010\ufffd\ufffd?\ufffd\ufffd\ufffd-m$\ufffd\ufffd\ufffd\u001c'\ufffdU\u0014\ufffdv\ufffd\u0006\ufffd\ufffd\ufffd\u028f\ufffd\ufffdmF63\ufffd4\u000b\ufffdX=\ufffd3\ufffdB\ufffd\ufffd\u075f\u0002~XG\ufffd?.\ufffd1\u0013\ufffd\t@8n\ufffd\ufffd\u000e\ufffd\ufffd\ufffdz\ufffd\ufffd\ufffd\ufffd\ufffd4\ufffd:\ufffd\ufffd\ufffd\u001b\ufffdG\ufffd\ufffd\ufffd\ufffdR\ufffdC\ufffd?e\ufffd\u0674\u001f\ufffdU[3\ufffd\ufffd\ufffdl:\ufffd\u0157\ufffd\u330c\u0012\ufffdyg\ufffd\ufffdr\ufffd\ufffd\u001f\ufffds\ufffd4\ufffd\u000e\ufffdY]\ufffd\ufffd\u007fB\ufffd?\ufffd\u0388{3\b\ufffd\ufffd\ufffd\ufffd7\ufffd\ufffd\ufffdO\ufffd\u0005\ufffd{x\ufffd\n}\ufffd\ufffd\ufffd\u0000\ufffd\ufffd$\ufffd3\ufffd\ufffd\ufffdT*\ufffd\ufffd\ub66a\u0014<\ufffd\u0015z\ufffd'\ufffdT.\u0001O`\u001d\ufffd\ufffd/\u3bd3\ufffd\ufffd\ufffd\ufffd)\f\ufffd:w\ufffd\ufffd_&\ufffd\u0005^\ufffdQfL\ufffd\ufffd\ufffd\ufffd\u001f#\u007f\ufffdek\ufffd\ufffd$f\t\ufffd\ufffd\u035caIzS\ufffd\ufffdi\u0096\ufffd\ufffd#\ufffdi\ufffd,~\ufffd\ufffd4\ufffd\ufffd\ufffdU\u0016Jj\u0003H\ufffd\ufffd\ufffdp6\ufffdiW\ufffd\ufffdi\ufffdP\ufffd-x\ufffd+(\ufffd\u0019:2]\ufffd\ufffd7v\ufffd\ufffdY\u6866\ufffdl \ufffd\ufffdJ\u0018k\ufffd\ufffd~\ufffdn\ufffdV%\ufffd\""\ufffd\u0018\ufffd\ufffd\u045e\ufffd\ufffd\ufffd\u001b\ufffdes\u001bn\u001a/\ufffdr\u001aF\ufffd\ufffdu\ufffd\ufffd\ufffdD\ufffd\ufffdc\ufffd\u001d\ufffd\u0240\ufffd3itzb\ufffd\u06e1\ufffd\ufffdf>\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd_i\ufffd\ufffd\u0018\ufffd\ufffdvr\u0014\ufffd\u000e\f_1p\u01ed\u001a\u0003Gi\ufffdR\ufffd\u0017\ufffd\ufffd\ufffd(\ufffdx\u001ck\\O*\ufffdg\ufffd\ufffd/\u0003\ufffd\u00bb\ufffd\ufffdk\u0012\ufffd\u001e\ufffdR\ufffd\ufffdi\ufffd/\ufffd\ufffd\ufffd\ufffd\ufffd\u056f\ufffdO\ufffd\u0014\ufffd\b\ufffd\ufffdW\ufffd\uf13c\ufffd\ufffdr\ufffd\ufffdr\ufffd\u0016\ufffd'\ufffdF\ufffd;\ufffd\ufffdV=\ufffdK\ufffda\ufffd\ufffd\ufffd\ufffd\\\ufffd\ufffd\u05c7\ufffd\ufffd\u0017\u0015\ufffd\fB\u0674\ufffd\ufffd\ufffd\u0006j10\ufffd\ufffd\u0010b\ufffd?\ufffdO\u001b\ufffd\u0d92\u00013\ufffdY6kn\ufffd\ufffd\ufffd\b\u0012\ufffd\ufffd\u001eZ\ufffd\ufffd\""\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u04b9T\ufffdG\u06a6*\ufffd\u0007\u0390\ufffdf\ufffd\ufffd\ufffd\u2af9\ufffd\u0183\u02b0\b\ufffd\ufffd\ufffd\ufffd\u001eu\ufffdB\ufffd(C\u0011ZCf\ufffd\ufffd:\ufffd\u007fj\ufffd\ufffdl\ufffd\ufffd\ufffd`g\u0004\ra\ufffd\ufffdz\ufffd+\ufffdrt\f\ufffd\ufffdY\ufffd\u007f\ufffd\ufffd\u001f\ufffd][\ufffd\ufffd\u0013~\ufffd\ufffd\ufffd\ufffdf\ufffd\ufffd\u001d/\ufffd\u0361\ufffd\ufffd?\ufffd\u001e N\ufffd\ufffd\ufffdr\u0650\ufffdJ\ufffd\ufffd\ufffd)\ufffdc\ufffd\u001d99\ufffd\ufffd|0?V\ufffdM\u0014\ufffd4k\ufffdj%\ufffd\ufffd!u\ufffd|P\u000e\ufffd\ufffd\ufffd^a\u0014\ufffdN\u0005y\ufffdL\ufffd\ufffdw\ufffd\ufffd6~\\\ufffd\ufffd?)\ufffd\ufffd\ufffdz\ufffdy\ufffd@\rS>\ufffd\ufffd9\ufffdz\ufffdq\u0016\ufffd\ufffd\ufffd\f\ufffd\t\ufffd\u05f9\ufffd\ufffd\ufffd\u007f\ufffd\ufffd \ufffd\ufffd\ufffdC\ufffd\u001e\ufffdx#!\ufffd|\ufffd\u00069A\ufffd~\ufffd+$\ufffd9-\u0016;\ufffdV\ufffdV\u007f\u0649\u04fc\ufffdbq\ufffd\u0000\t\ufffd\ufffd\ufffd\ufffd\ufffd$'\ufffd\ufffdW\ufffdx\u0005\ufffd#\ufffdip@R\ufffdSS(\ufffd\u0007A\ufffd\u0006\ufffd\u007fS\u001a\u0015\ufffd\ufffd\ufffd\ufffd/T\ufffd\u000f\ufffdf\ufffd\ufffdbN,\u0006{IJ\ufffdS2\u0016\ufffd>\u000bVc:\ufffd\u0005n\ufffd\u0016\ufffd\u0005V[\u0006\ufffd\ufffd\ufffd\ufffdW3 \ufffd\ufffd\u0003\ufffd,*yv\ufffd\ufffdjv\ufffd\n\ufffdV\ufffd{\ufffd\u001c73\ufffd+\ufffd\ufffd\u00059\u0013\ufffd\ufffd`\u0019 \u0011\ufffd\u001160]A\u000f\ufffd\ufffd\ufffd\ufffd\ufffd^u\ufffdT\ufffd2\u0001\ufffd\ufffd -\ufffd\ufffd\ufffd3\ufffd\""#7O\ufffd/\u001b}\ufffd\u03a1\ufffd\u001f\ufffdV\ufffd9;\ufffd\ufffd\ufffd\ufffd\ufffda\ufffd\ufffd\u0018\ufffd\ufffd\ufffd\ufffdZr\ufffd\ufffd\ufffdS\ufffd\t\ufffdB\ufffd\ufffdrM7#+7ZK\ufffd\ufffd\ufffd@\ufffd\ufffd\ufffd\ufffd0\ufffdr=\u0016\ufffdt\ufffd\ufffd\u0003[|\ufffdmkO~\u0003\u001d\ufffd?|\ufffd\ufffd\ufffd\ufffd\ufffd\u0218\ufffd\ufffd%\ufffd\ufffdK3&\ufffd\ufffdM\ufffd]\ufffd\ufffd\ufffd77\ufffd\u000b\ufffd\ufffd\ufffd\ufffd1\u0016\ufffd/\ufffd\ufffd\u06b5\u0013}\ufffdPZv\u0005\u001bav,R\ufffd\ufffd_\ufffdj\u0010\ufffd9\ufffd\ufffd\ufffdb\ufffd\u007fZ\ufffd\ufffd\ufffd\ufffdMP\u0016Sz%\u000ei}\ufffd\ufffd\\\ufffd\ufffd\u052b\ufffd\u0005\ufffdyL\ufffd\ufffdJ#\ufffd\ufffdg\ufffd\u0200o\ufffd\ufffdTs[\ufffd\u00c1\ufffd-\u0003+h\u0006E~g)\ufffd\u007f\u0216*\u000f%\ufffdw9bqi|Q0\ufffd\u0015T3\ufffd[\u0007B\ufffd\ufffd5U\ufffdM\ufffd\ufffdb\ufffd\ufffd\ufffd| k\ufffd\ufffd\u001f\ufffd\u000294kV\ufffduX\u0001\ufffd\ufffd\ufffd=\ufffd\ufffd\ufffdZ!\ufffd>\u0015\ufffd\ufffd\ufffd\ufffd\u001eX\uc25ei\ufffd}Eaq\ufffd\ufffd\ufffd\ufffd\ufffdy\ufffd\ufffd\ufffd\ufffd\ufffdn\ufffdi\ufffd\ufffd\u074a]\u0607L\ufffd\ufffd4\ufffd\ufffd\ufffd\ufffd\u0005w$\ufffd\u001eh\u001c\ufffd=\ufffd!\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0017\ufffd\ufffd\ufffd$\u00041\ufffd\u0005|@\ufffd\ufffd\u0011\ufffd\u022c\ufffd%!\ufffdW7\ufffdTzI\ufffd\u001c6\ufffdzTkvD\ufffdE\ufffd\ufffd\ufffd\tr\ufffd\ufffd>\uc330\ufffd\u1d05\u000f\u0014}\ufffd\ufffdn1\fj\ufffd\u0017\ufffd!\ufffd\ufffd:\ufffd\u0313v\ufffd\ufffdOk\uaa25\ufffd\ufffd\ufffd|\ufffd\ufffdM\u01bde\u0011\b@{\ufffd\ufffd\ufffdPO\u02af\ufffdm\ufffd\ufffd\ufffdQI\ufffd\ufffdH\ufffd\b\ufffdu\u001e\ufffd{\ufffd@y\u0010\u01757\ufffd\ufffd\ufffd\ufffd\ufffd\u00ab\ufffdi\u01ec\""\ufffd\ufffd\ufffd\ufffd\fjY\u03e8\u001d\ufffdt\ufffd1G\ufffd\ufffd\ufffdH\ufffd\ufffd\u0013Q\ufffd\ufffd2\u0014\u0002\ufffde\ufffdG\r+O~\u001fM\ufffd\u0010\ufffd~\ufffd\u0001%\ufffd\ufffd\u0003\ufffd\ufffd\ufffdf\ufffdi\u0016\ufffd\u000eh\u0013Y\ufffd\u0002[`\ufffd\u0002\ufffdWG\ufffd\u0010\ufffd\r\ufffd\uda17\udd58\u001b\ufffdl\f\ufffd\ufffdQ\ufffd\u0005\ufffd\u0015\ufffd6\ufffd^\ufffdz\u001aU\ufffd\u01ad3\ufffd\ufffdY\u0154F\ufffd\ufffdO\ufffd\u0013&\ufffd>V=\u06c4\u001c\u01e3\ufffd\ufffd\ufffd\u0295E-j\ufffdn\u0012\ufffd50\ufffd:\ufffd\ufffd\ufffd\ufffd\ufffd\ufffde\ufffdhgh\ufffd\u000f\ufffd\u001f[\u0012\n\ufffd\ufffd\u001d\u0006\ufffdi4\u0007\ufffd\ufffd\ufffd\ufffd,g\u0016e\ufffdw\ufffdM\u0004|\ufffd\ufffd?e\u007f\ufffdM9\ufffdY\ufffdBh\ufffd\ufffd\ufffd#\ufffd\u0016\ufffd\ufffd\u0017c\ufffd\ufffd\u068fN\\\ufffd\ufffd0\u0011\ufffd<\ufffd\ufffd \u0005\u0006\ufffd\ufffd\tA\u0305kJL\u0000k\u0003,\u000f\ufffd6\ufffd\ufffdw\u000e\ufffd\u0005\ufffdtd\u033b\ufffd\tO\ufffdF\t,9\r\u0019P\ufffdl\u0720\ufffd%k=\u0015\ufffd\u001c\ufffd\u0000p\ufffd\ufffd4\ufffd<\u001eA\ufffd?VA_@\ufffdo8Y\ufffd_aINC65\ufffd\ufffd\u001b\u0014\ufffd^\u0003=fh\ufffdM\ufffdX\u001f\ufffdW\ufffd\ufffd\ufffdS\ufffdn\u0325\ufffd\ufffdR7\ufffd\ufffd#\ufffd\""\u0000\ufffdG\ufffd~\u0113\u0004\ufffd\ufffd\u01c6\ufffdr\ufffd\ufffd\ufffd\ufffdR~\ufffd^4\ufffd\ufffd\ufffdU\ufffd\u0010\ufffd%=\ufffd/y\ufffd\ufffd[\ufffd\ufffd^+\ufffdM\u0019\ufffd2\ufffd`d`\u0006`P2h\u0018\ufffd\ufffdm\ufffd@_\ufffd\ufffd\ufffd\u0006\ufffd5\ufffd\ufffd\u0002\u0158\ufffd\ufffd\ufffd?\ufffd\u000e]R\ufffd,\u0006\ufffdJ7\ufffd\u001b\ufffd:J\ufffd\u001a\ufffdw\ufffds\u0010\ufffd\ufffd\u001c5\ufffd\ufffdG\u000eC\ufffd\ufffd\ufffd\u00126\ufffd4\u0016\u0002\ufffd\ufffd<\ufffd\ufffd~\ufffd1\ufffd\u0007\u0012[x\n\ufffd\ufffd%0\n\ufffdR\ufffd\u060e\ufffd_*\u001d\ufffd\u001c~\ufffd_\ufffd\ufffd.\ufffd\ufffdW\ufffd\ufffdg\u0007\ufffdk\ufffdL\ufffd\ufffd\ufffd\ufffd8\ufffd\ufffd\ufffd\u000b\ufffd\ufffd\\*\ufffd\u0016\u001a!\ufffdP\u0002\ufffd1\ufffdG+/\n\ufffd\u0000\ufffdZ\ufffd \u00131i)]\u007f\ufffd\ufffd\u00de\ufffd\u0016\ufffd\ufffdz\ufffd\ufffd;\u001e\ufffd,\ufffd\u03ab\u000fyc1\ufffdU\ufffd\\}S\u001e\ufffdxc\ufffd\u001e\ufffd\ufffds\ufffd\ufffd=\ufffd\ufffd\ufffdC\ufffdi\ufffd\u0007Gy\ufffd\ufffd\ufffd\u001d.B\u001c>\ufffd?\ufffd\ufffd\u001a]\ufffd\ufffd\ufffd0\ufffd\u032f\ufffd\ufffd\ufffd^\ufffdGP\ufffd\ufffd\ufffdWO\ufffd2j\ufffd\ufffd>\ufffd\u0005\u0001\ufffd\ufffd\r\ufffd\ufffd)s\u054aGF\ufffd\ufffdS\u0015\ufffd\ufffd=\ufffd\ufffd\ufffdU \u001a\ufffd\u0001\ufffd\u0013Cm\ufffd_\ufffd\ufffd\ufffd\ufffd\u001e\u06b7tb\u03c0\ufffd5\ufffdo\ufffd\ufffd\ufffd\u0001\ufffd\ufffd\ufffd\ufffdrK\ufffd\u001cd\ufffd\ufffd^\ufffd\u0019`\ufffd7\u077f\ufffd\ufffdX\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd,\ufffd\ufffd\ufffd\ufffd\ufffdG&|\ufffdU\u0007\u0006\ufffd\u001d\ufffd\ufffdW\u001dDu\ufffd\u0015\u0014\ufffd\u0002A\ufffd\ufffd\ufffd\ufffdl#t\ufffd\ufffd\u0010JA2\ufffd,*Is0\u00119\ufffdA'\ufffd\ufffd\ufffd\fe\u001e\r/\u001at\ufffdA-\ufffd\ufffd?.qZ\ufffdK\ufffdl\ufffdH\ufffd\ufffd\f`\ufffdU\u0014\ufffd\ufffd\t\u07fcK/\ufffd\ufffd&\ufffd0Ij\ufffd3\ufffd&\ufffd\ufffd\u0001\u0406\ufffd\ufffd\u000ebI\ufffdu\ufffd#\ufffdF\ufffd\u000b^\"">\ufffd\u01d31\ufffdYz\ufffd\ufffd\ufffdM\u0015\ufffd\ufffd\ufffdd^}\ufffd\u0018\u001f30U+od\u012f\ufffd\u0007#\ufffd\u862f+\ufffd\u04d8(F\u0013n\u001f\n\ufffd7\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd;\ufffd\ufffdm\ufffdb\ufffd\ufffd\\N\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000e[\u06d8\ufffdj\ufffd=\u001e=e2\ufffd\u07b6E\ufffd\ufffd\ufffd\ufffd\ufffd}\ufffd\ufffdR\u0006\ufffd\u0007\u001fQ]\ufffd\ufffd`\ufffd'\u04dd-J!\ufffd\ufffd2\ufffd,\u0019+\ufffd\ufffd\ufffdMz7y\ufffdzI\ufffd\ufffd\ufffddI\ufffd!\ufffd\ufffd\u0014\ufffd!\u0003\u0017kC\ufffd4\ufffd\u000b\u039b\ufffd\""\ufffd\ufffdF8\ufffd\u0005[\ufffd\ufffdo&56\u0002\ufffd#\ufffd\ufffd\u0007F#C\ufffd\u0000\ufffd%\u0005\u069b\u001d\ufffdo\ufffdr\ufffd5\ufffdu<\ufffd\ufffd\ufffd\u000ed\ufffd7\u001f\f\ufffdf\ufffd\ufffdN\u0003\ufffd6\ufffd>\u001c\ufffd\ufffd:kKO \ufffd\ufffd\ufffd\ufffd-\ufffdu%\ufffd\ufffd(R\ufffdh\ufffd\u001b-\u0189\ufffd\u0438Q\ufffd\u0018\ufffdP\ufffdW\ufffd{E\ufffd*\t\ufffdY\ufffd\u0492\ufffd\ufffd,\u0517\ufffd\u04f8\u0293\u001d@\ufffd\ufffd\u0004q|\ufffd\ufffdr\ufffd[\u0718\ufffd\ufffd,\ufffd\ufffd\ufffd\ufffd5\u0015\ufffd!\ufffdt\ufffdD\ufffdErJ\u0399x\u0005\""\ufffdvUj\\\ufffd.4\ufffd\ufffd\u0014\ufffdGx\ufffd\ufffd\ufffd\t\ufffd\ufffd!W\ufffd\u05f1\ufffd\u0006\u0018\ufffd`4\u001e\ufffd\ufffd\ufffd\ufffdW\u0001\ufffdK\ufffd\u9aaf\t\u001e\ufffd\ufffd\u0007o\ufffd\u0006\ufffd\ufffd\ufffd\u0000<_-!=\r\u00037>\ufffd\u0680e\ufffd\ufffdT\ufffd\u0006\ufffdq\ufffd\ufffdL\ufffd\ufffd\ufffd\""\ufffd\u0000i\ufffd\ufffd\ufffdd\u001d\u0017\ufffd\u0005\ufffd\ufffd&\ufffd\ufffd\u038c\ufffd\ufffd\ufffdy\u0461\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdKMS\ufffdVcO\ufffd%7\ufffd\u067e?\ufffd\ufffd\u00128\ufffd\u0000n\ufffdZ\ufffdg-\ud391=#\u0001<\u06fbc0\ufffdcX\u0015i\ufffd\ufffd\u0012\u02f3K\ufffd-Z\ufffd\u0011\ufffd`\\4\ufffd\ufffd?\ufffdqo\ufffdj\ufffdC+\ufffd\ufffd`}\ufffdA\ufffd\u001e\ufffd\n\ufffd\ufffd\ufffd\ufffdB$\ufffdRJ\u0393m\ufffdk\ufffd\ufffd\ufffd\ufffd\ufffdC4\u0007\u0015?t\ufffd\ufffd*\ufffd\u0415c+\ufffd\ufffd\ufffdzgvb\ufffdh\ufffdb\ufffd\ufffd\ufffd\ufffd\ufffdR \ufffd\ufffd,\u0284\ufffd\ufffd\u0781Mm\u05ab\ufffd`G\ufffdm\ufffdO\ufffd\ufffdE\ufffd',\ufffdmm[\ufffdb\ufffd\ufffd\ufffd^\ufffd\u077d}\ufffd7(P4\ufffd\ufffd\ufffdj\ufffd\ufffd\ufffd\ufffd\u001dR P\ufffd\ufffd\u000etD%\ufffdyI\ufffd\ufffd\ufffdL\ufffd i\ufffd@\u0014_\ufffd\u0682\ufffd1\ufffdIB\ufffd\ufffd\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\u000f5\ufffdWSJ\ufffd\ufffd\ufffd^\ufffd%|\ufffdF[}\ufffdr\ufffd\u0372\u000eW\ufffd\ufffd\ufffd\u0016V\ufffd\u0018\ufffd\ufffdF^\ufffd\ufffd\ufffd\ufffd\ufffd.^\ufffdl\ufffdx\ufffdn\ufffd\ufffdD\ufffd7O\u0004^|=\ufffd\r\u000bC\ufffd\u001c-i\ufffd\ufffdP\ufffd\ufffd\ufffdh\ufffd\ufffd\ufffd4\u068c\ufffd\ufffd\u028cb3\ufffd\ufffd\ufffd\u0010s\u0017[\ufffd\ufffd\ufffd\ufffd\u0557\u4b7f\ufffds\ufffd\u07f3m\u06daU\ufffd\ufffd\ufffd\ufffd\u0003[z\u001c\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffd\ufffda>\ufffd\ufffdr\ufffder\ufffd\ufffd\ufffd\ufffd'W\ufffd\ufffd\ufffd\u0003;w\ufffd]\u0011\u000fm\ufffdo\u0019+\ufffd\u001c\ufffd\ufffdp\u07cehb;X\ufffd\ufffd\ufffd.X\ufffd\u0001\ufffd\ufffdT\ufffd*.\ufffd\u0004&Z\ufffd\ufffdz1E\u000f\u0002\ufffd\u001eD`\ufffd5u\ufffdbkS\u0014\ufffdf#\u0003\u0272Vy\ufffd\u0000\ufffdC\ufffd\u010cs\ufffd\ufffd\ufffd\ufffd\ufffd\u001a\ufffd\u0010\ufffd\ufffd\ufffd\u0017\ufffd\ufffd\ufffd_Q\ufffd\u02b9\ufffd\ufffdW\ufffd\ufffd\ufffd\ufffd\u001eVUk\ufffd5X^\ufffda\ufffd}\ufffd\ufffd\ufffd\ufffd\ufffd[\ufffdC\ufffd\ufffd\ufffd{J\ufffd\u0001\ufffd\u0006\ufffd\n\ufffdR\ufffd\ufffd\u0002\u0749\ufffd\ufffd\ufffdo\u01ffrl\u0005\u000b\u001b\u0003\ufffdl\ufffd\uad29\ufffd\ufffd\ufffdD\ufffd\ufffd4\ufffdoUt\u4bbe\ufffd\u001d\ufffd\ufffd\ufffdT\ufffd\ufffd\ufffd\u00113\ufffd\ufffd{uc'`/\ufffd\n\u015e\ufffd\ufffd=\ufffd\ufffd\f\ufffd\ufffd\t_\ufffdW\u007f\ufffd\u001fc\ufffdn\ufffd_5j![\u01e6\ufffd\ufffdu\ufffd\ufffd\u0731\ufffd\ufffdwC\ufffd\ufffdS\ufffd\u0017\u0002\u0442\ufffd \ufffd[\u0003\ufffd\ufffdK\ufffd\u001b\ufffd\u001c]\ufffdI\ufffd9\ufffd|\ufffdM\ufffd\ufffd5\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffd\ufffd/\ufffd\u001c}nA\ufffd\ufffd\ufffd'q\ufffd\ufffd\u000em\ufffdmJo>\ufffd\ufffdqr\ufffd]\ufffd\u0011j\ufffd{\ufffd]\u000b\ufffd\u0015\ufffdF\ufffd\ufffd\ufffdg4z\ufffd\ufffd\ufffd\ufffd\t\u0006J\ufffd\ufffd\ufffd,:\ufffd\u001bh\ufffd\ufffd&^\u0010ak\ufffdt\ufffdE\u0014\u053bT*\ufffd\ufffd9)\ufffdz\ufffd\u0004{\u00067\u0013WB\u001c\u0013:\ufffd\ufffdf\ufffdP\ufffdU\u000f\ufffd\ufffdI\r\ufffdR\ufffd\ufffd\ufffdE\ufffde\ufffd}\u000b\ufffd\u001f\u047c\ufffd\ufffd\ufffdn\ufffd\ufffd\ud99f\uddf4y\ufffd\ufffdng6\ufffdy\b\ufffd\ufffd\ufffd\u000eOa\""o\ufffdb\ufffd\ufffd\u0007@\ufffd\ufffdoQN\ufffd\ufffd\ufffd\ufffd\ufffd\u03b4\ufffd\ufffd\ufffdM|\ufffd\u00175j\ufffd\ufffd\ufffdR%\ufffd\ufffd42\ufffdv\ufffdR\u0487q\ufffd\u060d\ufffda\u0653%\ufffd\u000b\ufffd\ufffd,\ufffd\ufffd\ufffd\ufffdJ)\ufffd\u0015\u0001\ufffd\ufffdb\ufffd\ufffdY$\ufffdlL)\ufffd\u001c\ufffd\ufffd\u0010\ufffdV\ufffd\ufffdESS&I\u00a5\ufffd\ufffd\ufffdnoG\ufffd\t{',e\ufffd\ufffd\u0007\u0197N^\u05afa\r\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdv\ufffd\ufffd\ufffdM\u001a\ufffd\ufffd/\ufffd\ufffd\u0676cq\u03f2\r\ufffd`b\ufffd\ufffd\u0431\u070a\u0019\ufffdZ\ufffd,\ufffd*\ufffd0\ufffd6S\ufffd-\u001dC\ufffd\u007f\ufffd\u0761\ufffdg\ufffd\ufffd\u0012\ufffd\ufffd\u07c1\u0003\ufffd\ufffdi\ufffd\ufffd\ufffd\ufffd\ufffd[\ufffd\f\ufffd$\ufffd\ufffd\ufffdh9\ufffd\ufffdzL\ufffdf\ufffd=\ufffd\ufffd\ufffdz,\ufffd%\ufffd\u0012\ufffd\ufffd\u0000$\u0012\ufffd?R\ufffd\u001f\ufffd\ufffdB\ufffd_\u0112}\ufffd!\ufffd \ufffd\u0015\u0003\ufffd[\ufffdB\u001dQ\ufffd\ufffd\ufffd\fe\t\u0016C\ufffd\ufffd_\ufffd\ufffdZXF`A\ufffd\ufffdT\ufffd\ufffd\ufffd\ufffd\u001c\ufffd\u000e\ufffd\u077a\ufffd\u00e91\ufffd\t\ufffdhv\ufffd\u0019}\u07e2\ufffd2\u015a\u0000T\ufffdH\ufffdI\ufffdre\ufffd0\ufffd\ufffd\u001eX\ufffd#X\u001b\ufffd\ufffd\n\u0115r\u0007\u0002$\ufffdW\ufffd\ufffd\ufffd\ufffd\ufffd\u0005f\f\ufffd\ufffd\u0019\ufffd\ufffd,\ufffd\ufffd\ufffdX\ufffd=\ufffd\ufffd`\ufffd\ufffd\ufffdoH\ufffd\ufffdZ\ufffd\u0590Fg\u0319\u001fM\ufffd\ufffds]k\ufffdx\u02b4\ufffdc8\ufffd\ufffd!\u0004\n\ufffd@\ufffd\u00c2\ufffdK.\ufffd\ufffdV\u001d\u0018*\ufffdz\ufffd\u0000\ufffdV\ufffd<\ufffd\ufffdj\ufffdp\ufffd\ufffd\ufffd\ufffdr\u0016F\ufffd]\u00f2\u043b\ufffd\ufffdb\ufffd\ufffd\u001c\ufffd\ufffd\ufffd\ufffd\ufffd\u0608\ufffd\ufffd\ufffd$\ufffd\ufffdQJ\ufffd7Ua\ufffd\u0001C\ufffda\ufffd\\\u0014]=\ufffd\ufffd\ufffd!\ufffd\u0006|\ufffdA\ufffdB\ufffdk\u001cC\ufffd$;?\ufffd\u0013F\ufffd3x1&Jh\ufffd\u0017\ufffd\ufffd<\ufffd\u0007!\u05ec\ufffd\u001f\u027b\ufffd\u0458}\ufffdp\ufffd\ufffd\u001a\\\ufffd \ufffd\b,Qo\ufffd\ufffd\\\ufffd\ufffdx\ufffd\u06aey\u000ba\ufffd[\ufffd\ufffd\ufffd\ubbbaa\ufffd\ufffd\ufffd\u0620<\u06d6\ufffd-\ufffdY\ufffd\ufffd`W\ufffd\ufffd\ufffds\ufffd\u001aqd\ufffdpyhld\u0010\\\ufffd~\u02ea\ufffd\u076b\ufffd\ufffdJ\ufffd'![\ufffd\ufffd\ufffd+\ufffd\ufffd\ufffd\ufffd\u0752\u02f5D:\u0739\ufffd\ufffdI\ufffd\ufffd\\\ufffdd\ufffd\ufffdZ\ufffd\ufffd\ufffdM\ufffd'\ufffdl\ufffd\ufffd\u0006\ufffd\u067a\ufffdz\ufffdf\ufffdNV\ufffd\ufffd\ufffd\ufffd_1Xs\ufffd\ufffd\u0016p\ufffd\ufffd\ufffd\u068d\ufffd2\ufffdhi\ufffd\ufffd\ufffdI\ufffd\n\ufffdRf\u0731\ufffd\u04394mrt\ufffd\ufffd\u001e\\_0m\u057b\ufffd-\ufffd\ufffd\ufffdi\u001fK\ufffd\ufffd\ufffdW\u000e\u001ah\n6\ufffd\u001c\ufffd+\ufffd\ufffd\ufffd)\ufffd\ufffd\u030f\ufffd$\ufffdwC}8XL\ufffd,\u0005\ufffd\ufffd\r\ufffd_\u0019\u000f8\u007fP\ufffd.\ufffd\ufffd\u001e\ufffd\ufffd\ufffdS\ufffd\ufffd\ufffd-\ufffd\ufffd\ufffd\u00182M\ufffd<\ufffdA\ufffdd\ufffd\ufffd\u0017\ufffdF\u0013\\\ufffdy{\ufffd\ufffd\ufffdZy\ufffd`\ufffd6\u001e\u0003\ufffd\u001f$\ufffdTq\u4ed8\u000ec\ufffd\ufffd:\u020d\ufffd\ufffd\u001aS^\ufffd\ufffd\ufffd\u000eM\ufffd\u0013\ufffd1\ufffd\ufffd/\ufffd\ufffd\ufffd\ufffd&\ufffd\u00dc\ufffd\ufffd'\ufffd\ufffd\ufffd\ufffdS\ufffd\u007f@q\ufffdS\ufffd\ufffd\ufffdSExL\ufffdA\ufffd\ufffd\ufffd'\ufffd\ufffd\u0621\ufffdP\""\u51b65\ufffd\ufffdC\ufffd\ufffd(\ufffdf\ufffd\ufffdI\ufffd\u0019\ufffd\ufffdB\ufffd\u0019~\ufffdA#\u001b/\ufffd\u007f\u001c\ufffd\ufffd\ufffd\t|SU\ufffd\ufffd\ufffd\ufffd\u035e\ufffd\u0014\ufffd\n\u0016\ufffd\nH\ufffdR\u04b2\ufffd\u0002bK\u0017Z\ufffdF\u0017V\ufffd\ufffdI\u0686\ufffdIH\ufffdM\u0011B-X\u0016\ufffd8(\ufffdZ\ufffd\u0005\\a\u0018\ufffd\ufffd`\ufffd\ufffd0\ufffd\r\ufffd\ufffdX\ufffd\u0019\u0171\ufffdQ\ufffd\ufffd\ufffdw\u03b9YZ\ufffde\ufffd\ufffd\ufffd\ufffd\ufffdgr\u000fM\ufffdv\ufffdy\ufffd\ufcdc\u001bC\ufffde\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001b\ufffd\ufffd2/2\ufffd\ufffd\ufffd+\ufffd_*\ufffd\ufffd`\uff39\ufffd\u0015N-\ufffdQ4\ufffd\ufffdo\ufffdE\ufffd\u001f\ufffd\ufffd,\ufffdaA\ufffd\u0017\u0017\ufffd]X\ufffd\ufffd_\ufffd\ufffd\ufffd\u0013\u0016\ufffd_2o\ufffd=Wf_\ufffd\ufffdUS\ufffd\ufffdv\u056e\ufffd\ufffd\\=\ufffd\ufffd'\ufffd\ufffd/\ufffd\ufffd4\ufffd\ufffd\tc\ufffd\ufffdb\ufffd*\ufffdc\u001aoz\ufffdt\ufffd<\ufffd<\ufffd\ufffd\ufffd\ufffd^\ufffd\\\ufffdu\ufffd\ufffd\ufffd\u0003\ufffd>\ufffd\u02d6-sU\ufffdTeW\u0015V-\ufffd2WUW\ufffdV\ufffd\ufffdj\ufffd\ufffdTu\u0007-;\ufffd\u001e\ufffd\ufffdg\ufffd\ufffd-\ufffd\ufffdZ][\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdYM\ufffd\ufffd\ufffd\ufffd\ufffd\u001f\\\ufffd\ufffd\ufffd\ufffd\u063d\ufffd3\u0533\ufffd\ufffdu\ufffd\ufffd\ufffd\u0001\ufffd1\ufffdcj\ufffdk\ufffdjSj\ufffdk\u000bk\ufffd\u051ak\ufffdk\u001f\ufffd\ufffd\ufffdt\ufffd\ufffd_*\ufffd\ufffd?[\ufffd\ufffd\ufffd\u05ffQ\u007f\ufffd\ufffd#\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\ufffdA\u07a0o\u0018\ufffd\u0010\ufffd2\ufffd\u1a46\ufffd\u001b^\n\ufffdp\t\ufffdp\t\ufffdp\ufffdo.\u05ccC\ufffdw\u037ek\ufffd\ufffd\ufffdKe\ufffd\n\u0019J\ufffd#\ufffd\ufffdl\ufffdn\ufffdJ\ufffd\u0287W\ufffd\ufffd\ufffd\ufffdp\t\ufffdp\t\ufffdp\t\ufffdp\t\ufffd\ufffd\ufffdb\ufffdW\ufffdwL\ufffd\ufffdK\ufffd\ufffdK\ufffd\ufffd\ufffd\u007fA\ufffd\u0019.\ufffd\ufffd+K\ufffd\ufffd\ufffdW\ufffd>\u04d8\ufffd\ufffdz\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdi\ufffd\ufffd\ufffd\ufffd\ufffdiK\u04c95\ufffdk\ufffd[\u02ef]\ufffd\ufffd\u000fk\u007f\ufffd\ufffd\ufffd\ufffd5\ufffdl\u000f\ufffdp\t\ufffdp\t\ufffdp\t\ufffdp\t\ufffdp\t\ufffdp\t\ufffdp\t\ufffd_Q\ufffd\ufffdK\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ufffd\t\ufffd\ufffd\ufffd?!B\ufffd\ufffd(\ufffd#\ufffd\ufffd\u001fg$m\t\ufffd\ufffd'\u0019)\ufffd-\ufffd\u0005n\ufffd|\ufffdT\ufffd\ufffd\ufffdQp\ufffd\ufffd\u000f\ufffd\ufffd2\ufffd_\ufffd\ufffd\u02bf\ufffd\ufffdj\ufffdR\ufffdJ\ufffd\ufffd\ufffdDU\ufffdT\ufffd\ufffdZ\u0003\ufffdu\ufffd|\ufffdv\ufffd\ufffd\ufffd.UuI\ufffd\ufffdH\ufffd\ufffd/g$7\u0007s\ufffd\ufffd{\u000f\ufffd\u001e\u001c+\ufffdyN5\ufffd \ufffde\ufffd*\ufffd+\ufffd\u0005.:\ufffd\u0006\ufffd.\u000f\ufffd\ufffd\ufffd\ufffd\ufffdwKueH\ufffd\ufffd\ufffd\u001e\ufffd\ufffdTWs\ufffd\u0006O\ufffd\ufffd\u001a.*\ufffd\u0013\ufffd\ufffd\ufffd\u000b\u0002\ufffdu\ufffd\ufffd\ufffd\uf93a\ufffd\u001b4\ufffd\""\ufffd\u001e\ufffd\u0012\ufffdN\ufffd\ufffd\ufffd\u0018\ufffd\u00118\ufffd\ufffd\ub0b2\u000b\u0014N\ufffd\ufffd8\ufffd:\ufffd\ufffd\ufffd3\ufffd\ufffdC\ufffd0\u03ac\ufffd\f\ufffdg\ufffdY\ufffdqfu\u0199\ufffd\u0019gVg\ufffdY\ufffdqf\ufffd\ufffd\ufffdh\ufffd2\ufffd\ufffd8\ufffd\ufffdD.\ufffd3p\t\\2j\ufffd\ufffd\ufffd3q.\ufffd\ufffd\ufffd\ufffdS\ufffdy\u0417\ufffd\ufffd\ufffds\ufffdW#z\ufffd\ufffd\u0679x\ufffd\ufffdr6\u0014\ufffd+D_\u0005W\ufffd17mY\ufffd\u06c2\u0675x5cf\u0004\ufffd\ufffdZ\u0019z,\\\u001df\ufffdc5\u000b\ufffd(\ufffd\u001ahM\ufffdr\ufffdr\u0003\u05ad\ufffd;\ufffdP\ufffd\ufffd\ufffd\ufffd\ufffdq`N\u0003\ufffd\ufffd\ufffd!\u0006d6p\ufffd\u0237\ufffd\u0003\ufffd$.\ufffd\ufffdo\ufffd\nN\ufffd\u0015\ufffd\ufffd\u0011\ufffd\ufffd5L\\\ufffd4w\u000eZ\ufffd\ufffd%\ufffd5\ufffd\ufffd\u001d\u0427\u0018\ufffdV\ufffd\ufffd\ufffd\ufffd\ufffdS\u000e\""7\u000b\ufffd2\ufffd\ufffd^#\ufffd\ufffd[G\ufffd\ufffdC\ufffdT\ufffd\ufffd\ufffd`\ufffdD\ufffd\ufffd\u04ed\u00fd.\ufffdS\ufffdYfJMD\u007f%\ufffd\ufffd\ufffd!\u0013\ufffdc\ufffd\ufffd\ufffd)\ufffd\ufffd\ufffd~\u000b\ufffda\u1ab1'\ufffdl\ufffd\ufffd\ufffd$\ufffd\u007f\ufffdH\ufffd\ufffd\u0526V\ufffd\ufffd^P\u000f2\ufffd\u0014V\ufffd\ufffd\u0006\ufffd4\ufffd\ufffd\ufffdjb\r\ufffda\ufffdO5\ufffd`\u00122}\ufffdt\u000fQ\ufffd\ufffd\u0015+\ufffdU\ufffd\ufffdG\ufffdj@\ufffd\u000e5\u000f\ufffd\ufffd\u001b\ufffd\ufffd\ufffdn\ufffd2\ufffd(\u000b\ufffd\ufffd\u0015\ufffd\u0015\u0012)\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdS\ufffdLTR;\ufffd\ufffdM\ufffdM\ufffdR\ufffd\u001e\ufffd5\ufffd\ufffd\ufffd\ufffdk\ufffdla\ufffd:1\u0016n\ufffd\u0015n\ufffdj\ufffd\ufffd\ufffdX\ufffd)\ufffd\ufffdw\ufffd\ufffd:6\ufffd\ufffd)IiGO5\u0755\ufffd\u99a4\ufffd\u0012\ufffd\u001d\ufffdT\u0017\u0016\u001b~\ufffdLv\u001b\ufffd\u001a\ufffd\t\ufffd\ufffd\ufffd\u0012\ufffd\ufffd1\u05c8\ufffd=\ufffde\ufffd\ufffd\ufffd\ufffd5c\ufffdvav\ufffdKz9(\ufffd2:3(q\ufffdF\ufffdZ=\ufffd\ufffdi]\ufffdv<\ufffd\ufffdPk\ufffd\ufffd\ufffdU\ufffd\u0015\u001a(\ufffd\u001a)JCy\ufffd\ufffd\ufffd.y2\u045f\ufffd\ufffdE\ufffd\ufffd\ufffd\u0016jk\ufffd\u03806L\ufffd\ni\ufffd\u001b\ufffdk\ufffd\ufffd=\u0402Y\ufffd6`%#\ufffd\u0011\u0012\u0001\u057d\ufffd\ufffdg\u001e\u0013$1\ufffd\ufffdM\ufffd\ufffd\ufffd4\ufffdTP[\ufffd\ufffd\ufffd\ufffd\u0574\ufffd\ufffd\ufffd/y\ufffd\ufffd\ufffdb\ufffdDd\ufffd\ufffd{\ufffd\ufffd\ufffdi\ufffd\ufffdHv\ufffd\n\ufffd \u0018\ufffdg\ufffd\ufffd\n\u026f\ufffd\ufffd\ufffd\ufffds\ufffd\ufffd\ufffdo\ufffd\ufffd\ufffd\ufffd&\ufffdj\ufffd\u0019\ufffd?&\ufffd\ufffd@\u0012\u0013\u0017K\ufffdl\ufffd4.r\ufffd\ufffdW8\ufffdd\u001e\u0014\ufffd\ufffd\ufffdq\u0013Q\u0314-\ufffd\ufffd\ufffd,\uf257|n\""\ufffd\r\u0507*\ufffd\u0017\u0011\ufffd4\ufffd\ufffd\b\ufffd\u0019c\ufffd\ufffdlM\u001b\ufffd\ufffdHPN\ufffdey\ufffd\ufffdu.\u001fuS?wR\ufffd\u0019\u0005\ufffd}\u012a\ufffd\ufffd\u001e,\ufffd4P\u048c\ufffd'`m\ufffdl\u007f^0I\ufffd\ufffdDy\u001ce@\ufffd9%\ufffd\b\ufffd\ufffdN\ufffd\ufffd.\ufffd\u0007\ufffd\ufffdEj\u001b\ufffd\ufffdl\ufffd\u0019\ufffdJ5d\u0495Q9\ufffdV\ufffdk1\ufffdt\u0007\ufffd\u001f\ufffdY=\ufffd\u0001\u001d\ufffd~Q&`\ufffd\ufffd\ufffd2\ufffdH\ufffd\u000f\ufffdO\ufffdo\\`\ufffd\ufffd\u001a\ufffd,ZG9\ufffdh<\ufffd\ufffdY\ufffd\ufffd\ufffd\ufffdF\ufffd\ufffd\ufffd\u0014\ufffd\ufffd\ufffd\u0653{\ufffd\ufffd\u0012\ufffd\ufffd\ufffdzy\ufffdWg2\ufffd\ufffdlC\u30dd\ufffdt>{\ufffd\ufffdL\ufffd\ufffd\u027e\u001a\u0004O\u017erM\u000f\ufffd\u0001\ufffd\t\u04c5=-\ufffds\ufffd+\ufffd\ufffda\ufffdg\ufffd\ufffd\ufffd\u0011\ufffdy5e\ufffdg\ufffd\ufffdU,\u001f8\ufffdW\ufffd\u0015\ufffd\ufffd\ufffdxa\ufffd\ufffdL\ufffd1\ufffd\ufffd[\ufffd:d\ufffd\ufffdf\ufffd\ufffd\ufffd(\ufffd\ufffdv\ufffd2\ufffd\ufffd\ufffd\u0011b\ry\ufffd\ufffd\ufffd\ufffd\ufffd*q&Y=\ufffd\ufffdK\ufffd\ufffd\ufffd\ufffd\t\ufffdO\ufffd\ufffdW\ufffdQ\ufffd\u0018i\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u6e7e\ufffd\u0010\ufffd'/Xh\ufffd\ufffd\ufffdO\u0014Vj}bU#\ufffd\b\ufffd\n\ufffd\ufffd\ufffdM\ufffd\ufffd\\\ufffd'w\ufffd\ufffd\ufffd7\ufffd-\ufffdO\u0003~i~\ufffd\ufffd\ufffd\u000bO\u00031\ufffd\ufffd\u001a9\ufffd5\ufffd\ufffd\u0001o^\ufffd>f'\ufffd\u05f0\ufffd\u0013\ufffdt\ufffd\u0004\ufffd\ufffd\ufffdN8\ufffdW\ufffd\ufffd\ufffd#\ufffd+\bD\ufffd;\ufffdY\ufffd\u065by\ufffdE\u068bel\ufffdd\ufffd8\ufffd\ufffdK:}\ufffd\ufffd\u0015\uce68B\ufffd\ufffd\u07cf\ufffd_9\ufffd\ufffd\u001d\ufffd\ufffd\ufffd>w\u001b\ufffd\ufffd~O1r\ufffdS\ufffdo>\ufffd\rl\u0011 d\ufffd\ufffd\u0013nV)\u05db\ufffdX5I\ufffd\ufffdv*k\ufffdi\ufffdO\ufffdn\ua6d2\ufffd\ufffd-\ufffdE\ufffd\ufffdyX{\\\b#s\ufffd;\ufffd\ufffdx\ufffd\ufffd\ufffdq\ufffdw5\ufffd\ufffd\ufffd\ufffdnq}\ufffd\ufffd\ufffd}\u07fbm\ufffd]\ufffd\ufffd\ufffd\ufffd~\ufffd\ufffd\ufffd`\ufffd\ufffd\t\ufffdD~\u001b\ufffdq\ufffdwg\ufffd]\ufffd\ufffdm\t\ufffd\u0010'}\ufffde\ufffd\ufffdV\u0019r\ufffd2\ufffd\u02e8,\u0016\u992a\t\ufffd24\ufffd0\u001bN\ufffd,\ufffdQb\u000b\ufffd\ufffd\ufffd\ufffd\u07be\ufffd\u02e9\ufffd\ufffd\ufffdL\ufffd\u0413\ufffd\ufffdO\u0007I\ufffdQ\ufffd\ufffd\ufffd\ufffd\u001d\ufffd\ufffdA\r}w\ufffd\ufffdXB$0\ufffdW\ufffdg\ufffd\ufffd2\ufffd0\ufffd\ufffd\u001d\ufffd\ufffd\ufffd\ufffd,\ufffd\u0006\ufffd\u0013oZ\ufffd,\u039e\ufffdji\ufffd\\O\ufffdvzF\ufffdO\ufffd\ufffd\ufffdg\ufffds\ufffd\\9\ufffd\ufffd]n\ufffd+\ufffd\ufffd\ufffd$\ufffd\ufffd}\ufffd\u001a\ufffdcQW@{7\ufffdR;]\ufffdE\ufffd\ufffd\ufffd|\ufffdU\u000f\ufffdoY\\\u0006\u001d\ufffd\ufffd2\ufffdZ\ufffd\u04f2\ufffd\ufffdd\ufffdOD\u0016-\ufffd\ufffd|\ufffd\ufffd\u045b\ufffd\ufffd\ufffd\ufffdQ$\ufffd\ufffd\ufffd\ufffdZ@\u03e1,\ufffd+\ufffdg\u001c[\ufffd\u0010\ufffdyh/\ufffd9.\ufffd\u0013i\ufffd\ufffd\ufffdb~\u001e\ufffd\""\ufffdfp\u000b\ufffd\u001e\u0019X\ufffd\ufffd\ufffd,\ufffdk\ufffd7\u0007\ufffd3\ufffdy\ufffd4\ufffd\ufffd\ufffdM\ufffdi\u0016d\ufffd\ufffd\ufffd.\ufffd\u001e\""[:\u0013\ufffd\ufffd\ufffd\ufffd\u0017\u0003\u001a\ufffd\ufffd*\ufffd\ufffd\ufffd,\u0017\ufffdB\ufffd\ufffd%\ufffd\ufffdb\ufffdl\ufffd\u001e\ufffd\ufffd\ufffdI\ufffdy\u000193%IS)#\ufffd2Y3\r\u0012\ufffd\ufffd\u0016\ufffd-\ufffd\ufffd\u0002\ufffd+\ufffd\ufffd\ufffdR\ufffd\ufffd\ufffdyT\ufffdL\ufffd3]2\ufffd\u0004d\ufffdxIW6\ufffd\ufffd/\ufffd\u0010\u001b\u0011\ufffdrP\ufffdZ\ufffdR\u0006YT\ufffd \ufffd4\ufffd.\ufffd\ufffdd\ufffd\ufffd\u0018-\ufffd'D>\ufffdL\ufffd\ufffd\u0016Qz\u0019\u00123\ufffdm\u000em\u0005\ufffdb\ufffdJ\ufffd\ufffd\u0010\ufffd\ufffdA:\ufffd\ufffd\ufffd\u001d`WH_\ufffd,\ufffd!\ufffd\ufffdf\ufffd\ufffd\ufffd\u0007g1\ufffdR\ufffd\ufffd4J.\ufffd\ufffd\ufffd5\ufffdh\ufffd\ufffd\u068a\ufffd\ufffdI\ufffd,\ufffdz\ufffd\ufffdu\u0001\ufffd\ufffd\f:+\ufffdj\\\u0014\ufffdL\ufffdLz\ufffdw\ufffd=\ufffdC$a\ufffd\u0011\u06c6\ufffd\ufffd\ufffdj\ufffd'b\ufffd\ufffd\ufffd\u001f/\ufffd,}6\u0017B=\ufffd2!r\u0015\u0005v>\ufffd\u0288\ufffd]b\ufffd!!Y\u0335\ufffd\\\u000e\ufffd\ufffd\ufffd#\ufffd9\\N\ufffd\ufffd\ufffd:\ufffd\ufffdb\ufffd\ufffd&\u0016Z+*=n\ufffd\ufffd\u2db8j-\ufffd\ufffd\ufffd,K\ufffd\ufffdR'\ufffd;-\ufffd\ufffd\u0006\ufffdE\ufffd168j<\ufffd\ufffdQa5\ufffd&\ufffd\ufffd\ufffdE\ufffd\u0010\ufffd\u0286I\ufffd%\ufffdWR\ufffdXh\ufffd9+\ufffd,\ufffd\ufffd\ufffd0U\ufffdw\ufffd\ufffd\ufffd.f\u0558\ufffdd\ufffd\ufffdJ\ufffd[\ufffd\ufffd\ufffdS\ufffdp\ufffd\ufffd\ufffde6\ufffd\ufffdh\u0013\ufffd\u001d1\u01c1ME\ufffd\ufffd\ufffde\ufffd\ufffdD\ufffd:\ufffd\ufffd\""\ufffd\ufffd\ufffd\u0016\ufffd\u8a74\ufffd\ufffd\ufffd\ufffdb\ufffd\ufffdd\ufffd\ufffd-\ufffdE\ufffd\ufffd\""Z\ufffd\ufffd,f\ufffd\ufffd,\ufffdX\ufffdh\ufffd\ufffdM.\ufffd\ufffd\ufffdG\ufffd0[\ufffd\ufffd\u0014kt\ufffd\ufffd\u0015\ufffd\ufffd.\ufffd\ufffdS\ufffd\ufffd8\ufffd\ufffd&N4;L\ufffd\ufffdj\ufffd\ufffd\ufffda\ufffd\ufffd\ufffd\ufffdp\u0019\ufffd\ufffd\r\u0013\ufffde\ufffd32\u00153m5&\ufffd\ufffd\ufffda\u0007p\ufffd\nn\ufffdq:mV8\u000e\u0019\ufffd\u0017\u00179j@\ufffdA\ufffd\ufffd\u000by\ufffd\ufffd\ufffdn\u0002\ufffd\u0004\ufffdz,q\ufffd\ufffd\ufffdv\u0081\ufffdA\ufffd.+FM\ufffdb\ufffdo#\ufffdhqU[=\u001e,W\ufffd@\ufffd\ufffd#P\ufffdo\u001c.\u007f\ufffd\ufffd\ufffd\u0010w\ufffd\ufffd\ufffd\u0003s\ufffd\ufffd\u0013G\u0731\u0016\ufffd\u0191{\ufffd\u001b\ufffd>u\ufffdVSe\ufffddu\ufffd\ufffdj7\ufffdj\ufffd\ufffdA\ufffd\u001dvxJ\ufffdu\u001c\u000b\ufffd\ufffd\ufffdX\u19e4eQ\u0004_\ufffd\ufffd\ufffd\u001e\ufffd\ufffd\ufffd\u001c\u04bf\u0001\ufffdC\ufffdZ\ufffd)\ufffdX+vAL\ufffdT\ufffd\""\ufffdcv\ufffd\ufffdm\u000e\ufffd\ufffd7=#C\u0005\u03c2:0\u001f\ufffd\ufffdx\ufffd\ufffd\u0002f\u000bQ\ufffd\u0329\ufffd\u061c\ufffd\ufffd\""/\ufffdw\ufffdtb\u0010+\ufffd\ufffdJk\ufffd\ufffdC\ufffdSD1D.w\ufffdh!\""K\ufffd\ufffd\ufffd2\ufffd\u001b\ufffd:\ufffdL\ufffd7B\ufffd\ufffd\u000b\u0016{|\ufffd\ufffd\ufffd\uad18\ufffd\ufffdx\ufffd\ufffdb\""iM\ufffd\u0325RN\u0019\u0007\ufffdR\ufffd\ufffd1@\ufffd9w\u0012\ufffdJd\ufffd\u0650\ufffd\ufffd\ufffdh\ufffd%\ufffd!\ufffd\u0016'\ufffd\u001b\ufffd\ufffd?l\ufffd\ufffdO\ufffd\ufffdd-\u0017;\ufffd\ufffd\u0003\r\""\ufffda\u001c\ufffd\ufffd\ufffdr\ufffd\ufffdB\ufffd8k\ufffd\ufffd\ufffd\ufffd\u0006,\ufffd.\ufffd!\ufffd\ufffd&\ufffd\ufffd\ufffd@\u00c9P\ufffdm!)\ufffd\u1d32\ufffdz^QY\ufffdcK\u00164\u0012i*D]\ufffd\ufffd\ufffd't$aP\ufffdC\u0018\u000b]\ufffd\ufffd@\u000e\ufffd\ufffd,\ufffd\ufffd<~\u0007\u000b\ufffd1\ufffd\ufffdl\ufffd\ufffd7\ufffd\ufffd8\ufffdX\ufffd%\ufffd\ufffd\ufffd;<$dX2\ufffdJa\ufffd\ufffd'8qG>]\u0004\ufffd\ufffde\ufffdU\bj\ufffd\ufffdE0\ufffd\ufffdK\ufffd2\ufffd\ufffd\ufffdg\ufffd\ufffd`\ufffd\""rs\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\u0005~\u0005\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\u0002Z\ufffd\u0013\ufffdh\ufffd?\ufffd\u0001f\ufffd\ufffd\ufffd\u0003\ufffd\u0007\ufffd\u001f\u000f\ufffd?\u001e\ufffd\ufffd\ufffd\u001f\u0011\ufffd\ufffd\ufffd\ufffdO'\ufffd1A\ufffdc\ufffd\ufffd\ufffd\u0004\ufffd\ufffd>&@l\ufffd\ufffd\u001ap\\O4\ufffd\ufffd;\ufffd%\ufffd\ufffdF>\ufffd\ufffd\ufffd'\ufffd\ufffd\ufffd/\ufffd\ufffd}\ufffd\ufffdz=\ufffd9\ufffd\ufffd_:?\""\ufffd\ufffd\u0017\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdr\ufffd/\ufffd\u001f\u0015E\ufffd+\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffd|e\ufffd/\ufffd?`\u0000\ufffd\ufffd7G\ufffd\ufffd \ufffd\ufffd\ufffd\ufffdI\ufffd\ufffd\ufffd\ufffd\ufffd\u0002n\u0018\u0017\ufffdD\u0016\ufffdM\u01a1\ufffd\ufffd\ufffd#\ufffd\ufffd\ufffd-\ufffd\ufffd*a\ufffd\u001a$\ufffdF\ufffd\ufffdfn1\ufffd\u0007\ufffdjn\u0017R\ufffdc\u0018i\ufffde\u072b|?\ufffd\u001d>\ufffd\ufffd;?\ufffd\ufffd\ufffd\u001f\ufffd\ufffd\n\ufffd\ufffd/\ufffd\ufffd\ufffd\ufffd\u0018\ufffd*>\ufffd\ufffd\ufffdW\ufffd\u000e>\ufffd\ufffd\ufffd\ufffd|9\u007f\u001d\ufffd\ufffd_\u01ef\ufffd7\ufffdu#\u007f\u001b\ufffd\ufffdo\ufffd\ufffd\ufffd\u001f\ufffd\ufffd\ufffdO\ufffd>\ufffd\ufffd?\ufffd\ufffd\ufffd\u001f\ufffd\ufffd\ufffd\ufffd'\ufffd9\ufffd)\ufffdD&\u0017\u0016\ufffd\ufffdMv\ufffd\ufffd\ufffd],\ufffd\ufffd\ufffd\n\ufffddI\ufffdM\ufffdLa\ufffd\ufffd@\ufffd*[(\ufffd\ufffdY\ufffd/d.\u17f2U\u0097\ufffd\ufffdB\ufffd\ufffdv\ufffd\ufffd>\ufffd+\ufffd^\ufffdk\ufffdO\ufffdF\ufffdg\ufffd[\ufffd\ufffd\ufffd)\u0667B\ufffd\ufffdS8-;-O\u0015\ufffd9\ufffd\ufffd7\u0017!\ufffdWp\ufffd\u000e\\\u0583\ufffd\u0016p\ufffd\u0007\\\ufffd\ufffd\ufffd~\ufffd\u001c\u0001\ufffdc\ufffd\ufffd!\ufffd\ufffd\u0004\ufffdnp\u0442\ufffd p\u0019\u0005.\u0006p\ufffd\t.s\ufffde1\ufffdT\ufffd\ufffd\u001b\\V\ufffd\ufffd:p\ufffd\r\\v\ufffd\ufffd#\ufffd\ufffd$\ufffd\ufffd\ufffd\ufffd_\ufffd\ufffd8\ufffd|\u0001.\ufffd\u000bsd\np\u0019\u0000.\u0017\ufffd\ufffdE\ufffd\ufffd\u0000.I\ufffd2\u001b\\\u0016\ufffd\ufffd\u0011\\\ufffd\ufffdR\u0007.M\ufffd\t\\\ufffd\u0002\ufffd\u0007\ufffd\ufffd\tpy\u0001\\^\u0003\ufffd\ufffd\ufffd\ufffd\u0004\ufffd\ufffd\u0016\ufffd\u0004A8-D\ufffd\ufffd\u0010p\u0010{sQ\u0187p\u0019\u0002.c\ufffde\u0012\ufffd\ufffd\ufffdK>\ufffd\\\u0005.U\ufffd\ufffd\u0000.-\ufffdr\u0017\ufffd<\u0004.O\ufffd\ufffdapy\u000b\\>\u0002\ufffd\ufffd\ufffd\ufffd\f\u001f\ufffdG\ufffd\ufffd\ufffd\ufffd\ufffd\u0012\ufffd2\u0019\\\ufffd@\ufffd\u0010\\\ufffd\ufffd\ufffd@\ufffd\ufffd\ufffd\ufffd\u001d\\\u001e\u0001\ufffd\ufffd\ufffd\ufffdEp9\u0006.\u001f\ufffdK'\ufffd\ufffd\ufffd}2-\u007f@6\ufffd?$\u001b\ufffd\u001f\ufffd%\ufffdK:\ufffd\u0014\ufffd\u02d5\ufffdb\u0002\ufffd\u001ap\ufffd\u0016\\n\u0004\ufffd\ufffd\ufffde\u0017\ufffd\ufffd\u0011\\\u000e\ufffd\ufffd+\ufffd\ufffd.\ufffd|\u000e.\ufffd\ufffd\ufffd\ufffdJ\ufffdJ\u0018$|-\ufffd\u0012\ufffd\u0011\u0012\ufffdo\ufffd+\ufffdSB.\ufffd,\u0000\u0017#\ufffdT\ufffd\ufffd\ufffd7\u0017\ufffd\ufffd\u0010.C\ufffd%\u0016\\\ufffd\ufffd%\u0013\\J\ufffd\ufffd\f.npi\u0004\ufffd\u07c3\ufffd\u0003\ufffd\ufffd\u0006.\ufffd\ufffd\ufffd\ufffd\u0018\ufffd\u0004\ufffd\u001e^\ufffdG\ufffd\ufffd@$\ufffd\ufffd\u0014\ufffdS\ufffd%\u0013\\\n\ufffd\ufffd\f\\\ufffd\ufffd\ufffdjp\ufffd\u0019\\Z\ufffde7\ufffd\ufffd\ufffd\ufffd+\ufffd\ufffd\u000e\ufffd|\u0006.\ufffd\ufffd\u0016\ufffd\ufffd\ufffdC\u059f\ufffd'\u001b\t.\ufffd\ufffd%\t\\\ufffd\ufffd\""p\ufffd\ufffdK\r\ufffd\ufffd\u0004\ufffd5\ufffd\u0005\\\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\u0006./\ufffd\ufffd_\ufffd\ufffd+\ufffd\u000b\ufffd\u0017\ufffd)D\t_\n#\ufffdN!\u001e\\.\u0007\ufffd\u001cpY\u0002.\ufffd\ufffd\ufffd\u0001\\\ufffd\ufffde3\ufffd\ufffd\ufffd\ufffdC\u0caf7\ufffd\ufffd\u0005!\\.\u0004\ufffd\ufffd\ufffd2\u001d\\\ufffd\ufffd\u0012p\ufffd\u0002\ufffdk\ufffde\u0003\ufffd\u0707\ufffd\u0003\ufffdr\u001c\\N\ufffdK7g\ufffd\ufffd\\%\u001f\u0003.I\ufffd\ufffd\u000e.%\ufffdR\u0006.np\ufffd\ufffd&p\ufffd\u0006.\u007f\u0004\ufffd\u0003\ufffd\ufffd:\ufffd|\u0004.\ufffd\ufffd\ufffddJ~\ufffdl\u0000\ufffdA6\ufffd\ufffd(\ufffd\u0004.)\ufffd\ufffd\u000b.W\ufffd\u000bf\ufffdj\ufffde\u0003\ufffd\ufffd\u001e\\v\ufffd\u02d3\ufffd\ufffd<\ufffd\ufffd\b.\ufffd\ufffd\ufffd\u0003p\ufffdN\ufffdI\ufffd\n[\ufffd\u000f[\ufffd\u0011\ufffd\ta:\ufffd\ufffd\u0005\ufffd%\ufffdR\u0005.\u05c2\ufffd\u0006p\ufffd=\ufffd<\b.O\ufffd\ufffd\u0011py\u0007\\>\u0005\ufffd\ufffd\ufffd\ufffd\u0007iV\u075bK\ufffd\ufffd!\\\ufffd\ufffdK<\ufffd\ufffd\u0005\ufffdJpi\u0000\ufffd\ufffd\ufffd\ufffd{py\b\\^\ufffd\ufffd'\ufffd\u0002^\ufffd\u0016\ufffd\u0003\ufffd\ufffd\ufffd\u0004p\ufffd\u0005.E\ufffd\ufffd\u0004\ufffd\ufffd\ufffd\ufffd\u0002.w\ufffd\ufffdnp\ufffd\u000f.\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd5o\ufffd?8d\ufffd\ufffd\u001aY\u001c_+K\u0003\ufffdy\ufffd\u0014\\\ufffd\ufffd\u001a\\n\u0006\ufffd;\ufffd\ufffdapy\u001a\\^\u0003\ufffd\u007f\ufffdG\u0005\ufffd0G\u0018(\ufffd\b\ufffd\b\u000b\u0005\ufffd`\u0013\ufffd\u0004\u0017\ufffd`\ufffdP$\ufffd\u0012*\ufffd\ufffd:pY\u0007.\ufffd\u0003\ufffd?\ufffdK\u001b\ufffd\ufffd\u0001.\u001f\ufffd\ufffdw\ufffdI\ufffd\u0000\ufffd+\ufffdh\u0010\ufffd\""|#\ufffd\u0014\ufffd\ufffd/\u0010N\ufffd+\ufffd.\ufffdG8-\ufffd\ufffdS\ufffd\u001b\ufffd\ufffdVrn\ufffdU\ufffd\u0013\u0015\u0015\u001b\ufffd\ufffd\ufffd\ufffdQ\ufffd\ufffd\u056a\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdN\ufffdP:\ufffd\ufffd\ufffd\ufffd\ufffdj%\ufffdVw67\ufffd\u0088\u001c#\ufffd^/\ufffdx;\ufffd<\ufffd\ufffd{\ufffdK-pj\ufffd\ufffd.\u001f\ufffd\ufffd\ufffd\u0006:\ufffdj^\ufffdmk\ufffd\u0017\ufffd\ufffd\ufffd\ufffd\ufffd\u000e\u001e\ufffd\ufffd\u035b7n\ufffd\ufffd\ufffd&z\ufffd\ufffdM\ufffd\ufffdd5\""\u000em\ufffd47\ufffdMK[\ufffd)bTK\ufffdZ\ufffd\ufffd\ufffd]\ufffdFt\ufffd&i\u0001\ufffd\ufffdW\ufffd:\ufffd\ufffd\ufffd\ufffdt-\u0015\ufffdn&+(\ufffdR\ufffd$\ufffd8i\ufffd\ufffdL\ufffd$:\ufffd\ufffd\ufffd\ufffd\ufffd\u05ab\ufffd\u0010\u0790\u0499B.LR*\ufffd[ZJ\ufffdN\ufffd\u0002+\ufffd>Lna\nsL/\ufffd\u0423F\ufffd\u000e\ufffd\u001c\nC\ufffd\ufffd\ufffd\ufffd^\\\ufffd\ufffd\ufffd\ufffdn\ufffd6\ufffdE\u0004Q\ufffd\ufffdxTY\ufffd\ufffd\u0264V+\u0005^)\ufffd`\ufffd@p\ufffd\ufffd\ufffd3Du\ufffd\ufffdJ\ufffd\ufffd3\ufffde\ufffd\ucb55J\u0005\ufffdT47\u0017\u0014\ufffd\ufffdR\ufffd)5\ufffd\ufffdfo\t2\ufffd\ufffd(\ufffd\ufffdXJ\nYU\u0441\ufffd\ufffd#DP\u038bS\ufffd\u0017\ufffd\ufffd\ufffd\u0012\ufffd:\u0005\ufffdQ\ufffd\ufffdQQ\""\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001dZ\u0019n Mr\ufffd\ufffd\ufffd&\ufffd\ufffd\ufffd\ufffdU\u0010{\ufffd;\ufffd;EA\ufffd\ufffd[[[\ufffd*\u0018\u0150\ufffde(\u0738\ufffdE\ufffdEu\ufffdZ\ufffdQ\ufffdJ\ufffduI#\ufffdNL\t4\ufffdj\ufffd4\ufffd`((h\u928ab\ufffd\ufffdn$\ufffd$\ufffdP\u00f2F\u0017\ufffd\ufffd\u0018\ufffd\ufffd\ufffd\f\ufffd8)\u03e8\u000e\ufffd\ufffdS\u000b)\ufffd\ufffd\u00149\ufffdP0\ufffd`\ufffd\u0014\ufffd'(8\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdH\ufffd\ufffd\ufffd\ufffd\u04c9\ufffd\ufffd\ufffd\ufffd~$hx\ufffd\ufffd\ufffd\ufffdw;\ufffdf\u0014b\ufffd\ufffd\u0011\u0001v\ufffd\ufffd\ufffdF\\\ufffd/\u0010\u0004\ufffd~Dh\u0014\ufffdF\ufffd\r\r\t%\u000b\t:\ufffd\u000e\ufffd\u0004\u0019(m\ufffd$\u0003rN\ufffd\ufffd8WP\ufffd\u0017;OT\u0203Q\ufffd\ufffdyM\u0000\u033f\u0015\u0016$\ufffdw\ufffd\ufffd\ufffd\u0005\ufffd\u06d4s\u01c5\ufffd'\ufffdBy\ufffd\ufffd\b\u0015\ufffd\ufffd\u0005\ufffdN\ufffd;\ufffd\ufffd\ufffd\ufffd\ufffdm\u007fd\ufffd\ufffd\ufffd\u0004BCCBC\ufffd\ufffd5\u001a\u0012\u001ae\ufffd\ufffd\u0600I\ufffd\ufffd\ufffdF06\ufffd?6XC\ufffd\r4\ufffd\ufffd\ufffdF06\ufffd\ufffd\u0006b\ufffd\ufffd\u0004b\ufffd\ufffd\ufffd\f\ufffd\ufffdcC!\ufffd46R\u0014\u0002\ufffd\ufffd\ufffd0\ufffdC\ufffd\ufffd\ufffd\t\ufffd.\ufffd\ufffd\ufffdh8\ufffdF\ufffd\rD!\u0004S\ufffdU\ufffd\ufffd\u001a%\ufffdQ\ufffd\ufffd\ufffd\ufffdl]D7\ufffd\ufffdY\ufffd\u016c\u0019T\u04ee&\ufffd\u020d\u0018#\u000e\ufffd\ufffde\ufffd\ufffd\ufffd\ufffd)\ufffd\ufffd)\ufffd\ufffd\ufffd\ufffd\ufffdT\ufffd\ufffd\ufffd4Z^\ufffd\ufffd\ufffd\u0696\ufffd-\ufffd\u0016Z6\ufffdh\u053cF{`\u06f6M\ufffd\u05adYs=m\u0358\ufffd\ufffd\\\u0618\bE\u0005\n\ufffdH[\u0348[*\u00069\ufffd(J\ufffd\ufffd\u04e8\ufffd\ufffdw\ufffd\u00027\ufffd+=Y\ufffd\ufffdU\ufffdy=\ufffdI\ufffd\ufffdj\ufffd\ufffd\ufffdA\ufffds\ufffd\t2\ufffd\u000e\ufffdf'\u001d\ufffd\ufffd\u578d\u0018\ufffd\ufffdQ)y\u00159\u03fa\ufffd\ufffd\u0015Z9\ufffdU\u0004\ufffd'\u00053U\ufffd\u0015\ufffd\u0000^L\ufffd\ufffd&\u0004\ufffdD\ufffd\u0010\ufffd\ufffd\u001eM0\ufffd\u0010EZ\ufffd\ufffd\u0006\ufffdyU\u001a^\ufffd\ufffd\ufffd\u001d\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\ufffd_\ufffd&\ufffd\ufffd\ufffd\u007f\ufffd\t\u0012\ufffd\ufffd)\t\u000b\ufffdUr^%\u0005\ufffd\ufffd\ufffdIJ(%F &\ufffdn\ufffd\ufffd\ufffd\ufffd!\ufffdB\ufffd\u0007\u0463\ufffdr*]zJz\u02a5^R\ufffd\ufffdJ\u001b2\f\u01e3kvF\ufffd\ufffd\ufffd\ufffd\ufffd2\ufffd?\u0011BQde\ufffd\ufffdD\ufffd\ufffd\ufffde\ufffd-B\ufffd\ufffd\ufffd\ufffd^\u000f\ufffd1^\ufffd\ufffd\u0010x\ufffdB\f\t2\ufffd\ufffd\ufffd\n\ufffd0\ufffdP\ufffdZ\u0015\ufffd3\ufffd\ufffd\ufffd*[pi\u057cV\ufffd\ufffd\ufffd\ufffdCh}\ufffd\ufffd\u0006\ufffd\ufffdR\ufffd\u0456\u0014jb\ufffd4FwN\t\ufffd\ufffd\ufffd\ufffd}T\u0471\ufffdYY\ufffd\ufffdj\ufffd\u07cb\u0011nji\u0015\ufffd\u001b\u000b8:\ufffd\ufffd\ufffd\u000f\u0005\u0002\ufffd9\u0003c,\ufffdX\ufffd\ufffd\ufffd,\ufffd\ufffdN\u0441];\ufffdZ)N+\u0015\ufffdT\ufffd\ufffd3Z\r\ufffdE\ufffd\u0005\ufffdn\u0015\ufffdfX\u0015\ufffd\ufffdP\ufffd&\ufffd\ufffdM4\ufffd\ufffdLexRgR\u017b\u001bi0\ufffd\ufffd(\ufffdn\u0012Jd\ufffd\ufffd\ufffd#Q\u001f\ufffd\n\ufffd\u001e\ufffd\ufffd\n\fvku\ufffd6\ufffdW\ufffd+E\ufffdj\ufffd$n\u0012\u05e34\ufffd\ufffd=H\ufffd\ufffd\ufffd\ufffdjx\ufffdn\ufffd$\ufffd\ufffdJ\u01534\u075cH\ufffdb1 8\ufffd\ufffd\ufffd\ufffdQK\ufffdF\ufffd4\ufffd\ufffd\u052a8\ufffd:\u0010\ufffdQt\ufffd\ufffd\ufffd5k\ufffd\ufffd\ufffd\ufffd\u0015\ufffdA\ufffd\ufffd\u05d1\ufffd\t\rH\ufffd\u0014\ufffdtL~\ufffd\ufffd\u0011\u0208\ufffd@H\ufffd0\ufffd\ufffdD\ufffd\u0017\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdlL\ufffdx^\u0017\ufffd\ufffd7\nJ\ufffdZ=\ufffdW\ufffd\ufffdEP\ufffdx\ufffd\ufffd\u001f\ufffd\ufffd&*#\u0005^\u0017\u0012\ufffd$\u001aiW0,\ufffd \u000ed\ufffd\u001aq\ufffd\u0002SG\u0003S\ufffd\ufffdu\ufffdd\ufffd\ufffdJ\ufffd8\u00037\ufffd[\u01ed\ufffd\ufffd\ufffd5\\\ufffd\ufffd\ufffd\ufffd\ufffdn\ufffdPR\u0234j1\u0010\ufffd\ufffd(\u0015FL\ufffd\u000e4\ufffdL\u02a7\u0441H\ufffd\ufffd\u0015P$dtF\ufffddZ\ufffd\f\ufffdjJ`\ufffd\ufffd\ufffd\ufffdh\ufffdd\ru\ufffdJ\ufffd\ufffdrI\n<\ufffd\ufffd\u0011\ufffd\ufffdN\u007f\ufffd\ufffdK\u0004\ufffdJM\ufffdV\ufffd\ufffdtZ=\ufffdX\ufffdr\u0011J\ufffdw\ufffd\u0017\ufffd\ufffdxSt*^'y?\ufffd[\ufffd\u001a\ufffd\u0011F\ufffd0\ufffd8\ufffd\ufffd\ufffd]kY\ufffd6\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\r\ufffdn_\u007f\ufffd\ufffd\u001c\u0015\f^2?\u0018\ufffd\ufffd\u001f\ufffd\ufffd\ufffd\ufffd\ufffd}\u046d\ufffd\ufffd\ufffd-Y-Y$\ufffd\ufffdQ\ufffdQ7\ufffd\ufffd\r|\ufffdV\ufffd\u0016\ufffdfo\u0013J#\ufffdj/\u001d\ufffd\ufffdL\ufffd\ufffd9\u0015\ufffd\u0018NR\ufffd\ufffd\ufffdT\u0000\u007f\ufffd\ufffds#\u0015\ufffd\ufffd\t\ufffd\u0018\ufffd\u0004\ufffdN\ufffd\ufffdB\u0002:\ufffd.\ufffd=\ufffd\""\ufffdBz\u001f\ufffd\ufffd\u0006t\ufffd\ufffd\ufffdkX\u001c\ufffd\ufffd\ufffd\ufffd\u0013\ufffd\ufffd\ufffd\ufffd\f\u05f4L2\ufffd9\ufffd\u079b\ufffdN\""\u001c\ufffd\n\u0018%9\u0018\u213a:\u0018\ufffd+\ufffd,\ufffd\ufffd\ufffd2b@\ufffd\b\ufffdG\u001b\u001a\ufffdO\ufffd\ufffd\ufffdP\ufffd^\ufffd\ufffdWG>\ufffdk\ufffd\ufffd\ufffd_\ufffds\ufffd\u007f\ufffd^\u000f\ufffd\ufffd\b\ufffdv\ufffd\ufffd\u000b\u000f=\u88fc\u0014\ufffd^\ufffd\u1324DdD$HeJJ\u0017\ufffd$\ufffd\ufffd\ufffd6\ufffd\ufffdx\u01e2\ufffd\ufffd\u9c71x\f\ufffdqj=\ufffdbN\u029c\u0014\u007f\ufffd\ufffdBg\ufffdc\ufffdO\ufffd\ufffd]o\ufffd\ufffd\ufffd\ufffd\u0003OY\ufffd\n\ufffdH\u0015\ufffdW\ufffdd\ufffd\u0417\""_\ufffd\ufffd\ufffd'\ufffdz\u0012\ufffd\ufffd\ufffdGM\ufffd}\ufffd\ufffd\u000f}\u001a\ufffd\ufffd`\ufffd\ufffdU$\ufffd\ufffdZ^\ufffdg\ufffd\ufffd\ufffd\ufffd\""\ufffd\u000b\ufffd{$\ufffd\u04f8\u0019>\ufffdN\f\ufffd\ufffd\ufffdNc(h\ufffd\ufffd\ufffd\fm\ufffd7\ufffd\ufffd\ufffd$\ufffd`\u001b\u0019@&\ufffd\ufffd\ufffdx\ufffd\u000f\u001c8:=\ufffd\ufffd\u0007QO\ufffdY\n\ufffd\ufffdq\ufffdf9 \ufffd\ufffd\u0019IC\ufffd\u0018\ufffd?\ufffd\ufffd\u0004\ufffd!f\ufffdw!\u000fD\u0004\ufffd\u0000\u001f\ufffd\f\ufffd\u0001V\ufffd\u0007\ufffd:N\ufffd\ufffd\ufffd\""\ufffd\u000biI\ufffd&xK}\ufffdp\ufffd\ufffd\ufffdT\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdmmm\ufffd\ufffdz\r:FrNo)\ufffd\u000b)\ufffd\ufffd\u0019\ufffdQhg\ufffd6\ufffdk\ufffd\\\u0007\ufffdm\ufffd3\u001cu\ufffd3\ufffd\ufffdM{\ufffd\ufffde0l\ufffd<\u0012\u0011\ufffd\ufffd\ufffd\ufffd\ufffdInQ\ufffdL8\ufffd\ufffd\ufffd\ufffdQ\u001d1\u001d1\ufffd3^\ufffd;f;f;\ufffds\ufffd\ufffd\ufffd\ufffd\ufffd6\ufffd\ufffd\ufffd\ufffdt\ufffd\u000e_\ufffd\ufffdU\ufffd1\ufffd\ufffd(\ufffd(\ufffd\ufffd\ufffd|\u0007|z\u001d\ufffd\ufffd\u0018\ufffd-\ufffd\ufffd\ufffdR\ufffdr\u001f\ufffdfZR\u0005\ufffd$D\ufffdn\ufffd\ufffdk\ufffd\ufffd\ufffd#u\ufffd:\u094a\ufffd(\ufffd\ufffd:\ufffdc\""\ufffd\u02a3\ufffdz5\ufffd\ufffd\ufffd\u0004\u0005\ufffd\ufffd\ufffd\ufffd\ufffdq\u0019\ufffdWp\ufffd\ufffd}E\ufffdR\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b5\u001f\ufffd%C\ufffd?i#\ufffd'\ufffd\ufffd{\ufffdr:\ufffd|\u0006\u001d\u0017pM\ufffd\ufffd\ufffd\u0015\ufffd\ufffd[\bl\ufffd\ufffd\u000e\ufffde3\""\ufffd0\ufffd\ufffd\ufffd\u04aeR\ufffd\u0493\ufffdU0Y\ufffd\n\ufffdJ\u0731\ufffd\ufffd\u0016mm\u00112>B\ufffd\ufffdq\\@\ufffd(yO\ufffd\ufffd`\ufffd8C\ufffd\ua426\ufffd\\\u001a=\ufffd\ufffdw\ufffd\ufffdSC{\ufffdB\ufffd\ufffd\u0004Vg\ufffdq\ufffdi\ufffd|\ufffd>d\ufffd\ufffd-\ufffd\bh\u0003\ufffd\ufffd\u0003\ufffd\u000e\ufffd\u0016\ufffd]P\ufffdA\u0002W\ufffd\ufffd^\ufffdcY\u0019T.\ufffd\ufffd-\ufffd\u0003\u0014\ufffd\u001e\ufffdo\u0014&\ufffd\ufffd\ufffd(1(\ufffdH\ufffd!\u001ea\ufffd\ufffd\ufffdj\ufffd:y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdR\ufffd\ufffdgG\ufffd\u00188\ufffdm\ufffd>:\ufffd\u0000\ufffd\u8390\ufffd\""B\\\u0013\ufffd\u0014\u0002/S@\u0002\ufffd\ufffd$t\ufffd\ufffd\ufffd_\ufffdE\ufffd\ufffdJ\ufffd\u001e\ufffdD\u0013\\d\ufffd\ufffd\ufffdy\u0005\u001eXH\ufffd\ufffd\u000ev\ufffdj\ufffd\ufffd\ufffd&]d\\\ufffd\ufffd\""4\u044b{\ufffd{\u0016G+`J\ufffdQrE\ufffd\ufffd\ufffd\ufffd\ufffd\u001c\ufffd\ufffd\ufffd\ufffd\ufffd%\ufffdl\ufffdd\u0012W&\ufffd\f\u0016\ufffd\u0012`?c\ufffd6\ufffd\ufffd\ufffd\ufffd\ufffdzh\u01cav\ufffd\ufffd\ufffdP)\u0621\ufffd\ufffdDo\ufffd\n\ufffd\ufffd\ufffd\bn00\\\ufffdM2\ufffd\ufffd=^%G\n\ufffd\ufffd\ufffd\u0000_!\ufffd&\u001d#(\ufffd\ufffd\ufffd\ufffd=X])\ufffd\u001f\ufffd\ufffd\ufffd\n&\u0360u\ufffd\u0015D\ufffd.<\ufffdD*\ufffd\ufffd\ufffd\ufffdHD\ufffd\ufffd\u000e\ufffd\ufffd\ufffd\u9bc3\u000b\ufffd\u0012\ufffd\u0490\ufffd\u0014\ufffdYe,~df\ufffd\ufffdB\ufffd\u01fbY}>\ufffd\ufffd\ufffd\ufffdeqb\ufffd\ufffd\ufffd\u001e'\ufffd5\ufffdlq\ufffdl\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\uaca0N\ufffd\u0019\u0010'\ufffd\u0018=\ufffd_7\ufffd\ufffd\ufffdS9\ufffd3\ufffdn\ufffd\u001e\ufffdD\u001a\ufffd\ufffd\ufffd8\ufffdwJ\u0365k\ufffd\u059e\ufffd\ufffdU\ufffd\ufffd\ufffd\ufffdM\ufffd\""'R\ufffd\u03a0Q*\ufffdG\n\ufffda\n\ufffd`Tj\ufffd+\ufffd\u0014\ufffdI2^\ufffdZd\ufffdg\ufffd\u000b\ufffd\ufffd>\ufffd\u001b\u0003\ufffdO\ufffd\u000e\ufffd\ufffd\ufffd\ufffd2\ufffdw\ufffdf\ufffdb\ufffd(d1\ufffd\ufffd\u001d\ufffdu\u000f\ufffdY\ufffd\ufffd\ufffd?\ufffd|\ufffd\ufffd\ufffdo\ufffd7\u007f\ufffdu\ufffd\ufffd\ufffd%\ufffdFy\ufffd\ufffdQx\ufffdU\ufffd\ufffd2\u0640I\u0010\ufffd\ufffd\ufffd;\ufffd\ufffd\u0019fuQ\ufffd\ufffd\r\u0011\u0001iq2r\ufffd:*\ufffdP\""W\u000e\ufffd\ufffd\u0014%\f0\ufffd'\r\ufffd\u0000\ufffd\u0002\ufffd\ufffd\ufffdj\ufffd\ufffd8\ufffd\tQ\ufffdH\u04a9\u001a\ufffd*\ufffd\ufffd\ufffd\u001dvs\ufffd\bC\f\ufffd\ufffd\u000e\u0018t\u03af\ufffd%\\d\u0018I\u0185\u0001\ufffd\ufffd\ufffdbk\ufffdeB\ufffd\ufffdX\ufffd\u0014\u000b\ufffdR\r#\ufffdD$L5\\fHJH\ufffd\ufffd\u0653\ufffd\ufffd\ufffd\ufffd#e\u0002\ufffdhG#\ufffd\u0001\u0011\ufffda8\ufffd\u000e\ufffd\ufffd\u000f\ufffd\u000f|\ufffd\ufffd\u0012w7'\ufffd\ufffdd\ufffd\ufffd3\ufffdK\ufffd~\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdQ\ufffdh\ufffd`\ufffd\ufffdQ\ufffd\ufffd\ufffd\ufffd0\u04e9\ufffd\""\ufffd\ufffd\u001f\ufffd\ufffd\ufffd\ufffd6eo?C1\ufffd0R\ufffdk\ufffdk\ufffdn\ufffd\u075a\ufffd6M\ufffd~\ufffd\ufffde\ufffd\ufffd:g\ufffd\ufffd\ufffdN\ufffd\ufffd\ufffd\ufffd\u00180#\ufffd\""5\""\ufffd2\u001eS\f\u000b\ufffdj\u0004\ufffdB\ufffd\ufffdyy\ufffda\ufffd!\ufffd\ufffd6\ufffd\ufffd\u03906\ufffd\ufffd\ufffd;\ufffd\u0006\u0016\ufffdO\ufffd\ufffd1\f \ufffd\ufffd\rZ\ufffd\ufffd\ufffd\ufffdO@\n\ufffdK\ufffd.\ufffd\u007f\ufffd#k\ufffdG\u0005\ufffdUl\u001e\ufffds\u073c?\ufffd\ufffd\ufffd\ufffd]\u0017\ufffds\ufffd\ufffdD\ufffd\ufffd\ufffd\ufffdW\u000e\ufffdo5\ufffd\u05a3\u07fe\ufffdoc\ufffd\ufffdOS\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd7{\ufffd%\ufffd\ufffd\ufffd\ufffd\f\u7e1a\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd|\ufffd\ufffd/\ufffd>\ufffd\ufffd\u745a\ufffd\ufffd\u044a--\u01f2\ufffd\ufffd{\ufffd\u000f-\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd%\ufffd\ufffd]x\ufffd\u0001\ufffda\ufffd\ufffdo\ufffdm\ufffd\ufffdvj\u0394\ufffd\ufffd\ufffd;\u0012^8\ufffd\ufffd\ufffd\ufffdo\u001c\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd]Y1\ufffdk\u05a7\ufffdyl\\\ufffdv&\ufffd\u0006\ufffdu\ufffd\ufffd\ufffd\ufffd\ufffd\u0007n\ufffd\u07d1d\ufffd\ufffd\ufffdr\ufffd\u0754UK\ufffdG\u0015oV,~{\ufffd\ufffd\u0639\u0017\ufffd5\ufffdq\ufffd\ufffd\ufffd\u04a4\ufffd\ufffd\u0015\ufffd\ufffdht\ufffd\ufffd^\ufffd\u000f\ufffdM\ufffd\ufffda\u0294\ufffd\ufffdIZ\ufffdX\ufffd8rl\ufffd\ufffdy\ufffdi\u04d6\ufffdO>\ufffd\ufffd-{\ufffd\ufffd\ufffd+\ufffd\ufffd[\ufffd6y\ufffd\ufffd{\ufffd\ufffd\u0013\ufffd'\ufffd74*y\ufffd\ufffd\u007f\ufffd\ufffd\ufffd\ufffd\ufffdX\ufffdu\ufffd\ufffd\u007f\ufffd\ufffd4v0\ufffd\ufffd\u000eil\ufffdo\ufffd,b\r\ufffd\ufffd\ufffd\u001f\u0019:n\ufffd\ufffdE\ufffd\n\ufffd\ufffd4\u0018\ufffd|+9\ufffdf\ufffd$CrBB\ufffd\u0001e2\ufffdf\ufffd\ufffd\ufffd\ufffd\ufffd'\ufffd\u000b\ufffd\u0019\ufffd\ufffdl\u053c\ufffd\ufffd\ufffdm\ufffd\ufffd\ufffd\ufffd6\f\uafa4\ufffd\ufffd\ufffd\u001c\ufffd\ufffd7;\ufffd4\u07d6\ufffd\ufffd\ufffd#K\ufffdM\ufffd6)~\u0126\ufffd\ufffdW\ufffd\u001a\ufffd\ufffd\ufffd\ufffd\u0230g\ufffd\ufffd2?\u007f\ufffd\ufffdS?\u0207\u007f\ufffdF\ufffds\ufffd}\ufffdW\u0015\ufffd\ufffd06\ufffd\ufffd\u0611\ufffd\ufffd7\ufffd\ufffdN|\ufffd\u0520\ufffd_\f\ufffdc\ufffd\u07d2\ufffd\u014e\ufffd'\u001e\ufffd\ufffd\u0018\ufffd\u000f\ufffd\ufffdp\ufffd\ufffdH\ud2e7\u0737\u000e\ufffd\ufffd\u02c6\ufffd7\u001fR\ufffd\u0011\ufffd\u0018\ufffds\ufffd\ufffd\ufffd\ufffdwx\ufffd\ufffd\ufffd_;\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00e5\u0357?\ufffd\ufffd\ufffdG\u02b6<\ufffdB\u04de\ufffdG\ufffdzt\ufffd\ufffd\ufffd?Ly\ufffd\ufffd\ufffdo\ufffddD\u03c9\ufffdUGV\ufffdk=\u001dQ\ufffd\ufffd8\ufffd\u001d\ufffd\ufffd\u0661\ufffd\ufffd\ufffd\u001fW\ufffd\ufffd\ufffd'\ufffd?\\\ufffd\ufffd[w\ufffd\u001by\ufffd}\u001f5\r9\ufffd\ufffdKw\u000f\ufffd\u000f\ufffd\ufffdu\ufffd\ufffd[&m\ufffd(+\ufffd\ufffd\ufffd\ufffd\u06f9?\ufffd/z\ufffdz\ufffd\ufffd%\ufffd\ufffdL\ufffd{\ufffd~\ufffd\ufffd\u0000\ufffd\ufffd\ufffdl\ufffd\u0005\ufffd\u0015,\u074c!\ufffd&p2\ufffd\ufffd@\ufffd\n!\ufffd\ufffd\ufffd[eM\ufffd\ufffd^\ufffdYO\ufffd\ufffdW\ufffdv\ufffd\ufffd\u0007\u001fo\u001b\ufffd\ufffdPH\ufffd\ufffd\u02d1\ufffd\ufffdm\ufffd\ufffd{\ufffdL6$\ufffd\ufffdb\ufffd\ufffd\ufffdI\u0006CB\ufffdxS\ufffdar\ufffd\u0014\ufffdq\ufffd\ufffd\ufffd\ufffd&O\ufffd\ufffd8)yB\uda52\ude49\u0013\ufffd\ufffdS\u0012\u028d\ufffd\ufffdS&\ufffd\ufffdz\ufffd\ufffd,\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\u000f\fIJ\ufffdx_\ufffd\u0397jd\ufffd\ufffd?\u0005\ufffd3C9\ufffdn\ufffd\u0005\ufffd.\ufffdcx1\u001c\ufffd\ufffd\ufffdR\ufffd2\ufffd\ufffd4\ufffd\ufffdLS\ufffd1$\u0005\ufffd\u0018\ufffd\u0012\ufffd\u00023~v\u0003\u007f\u0016\ufffd\ufffd-<\u0006=\u0011|\u0000\ufffd\ufffd\ufffde\u0006\ufffdO8\u000b\ufffd2\ufffdS\u000e\u001e\ufffd\u0382\ufffd\u000b\u000e\ufffd\ufffd\ufffd>\ufffd\ufffd\ufffd_t\ufffd\ufffd\ufffdg\ufffd\ufffd\ufffd<}\ufffd\ufffd/\ufffd\u000e[g+\ufffd\ufffd\ufffd\ufffdW\ufffdI7\ufffdw\ufffdf/\ufffdv\ufffd\ufffd\rw\u07fc0\ufffd-/\ufffd\u044b_\ufffd\ufffd\ufffd\u01a8]S:\u001f\ufffd\ufffd\ufffd\u0363\ufffd[\ufffd\u1f711\u001f\ufffd\u000f_73\ufffdg\ufffd\ufffd{\ufffd~}k\ufffd\ufffd\u007f\ufffd;\ufffd`\ufffdU\ufffd=\ufffd6\u001e\u001enz\u072d\ufffd\ufffdk.\ufffdw\ufffdm\u0019\ufffd'^?\ufffd\u000b\ufffd\ufffdF\ufffd;\ufffd'\ufffd\ufffd\ufffd\ufffd\u0543\ufffd0~q\u0092\u02d6\u0776\ufffd\ufffd\ufffdb\u001d'\u000f>\ufffd\u0673\u0019C\ufffd\ufffd\ufffd\ufffdW\ufffd\ufffd\ufffd\ufffd\ufffd\u001d\ufffd\ufffde\ufffd\ufffd\u0017\ufffdg\ufffd?^q\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0535\ufffd\ufffd6\ufffd\ufffdk\u0016\u001e\ufffd`v\ufffdk\u0017}\ufffd=\ufffd`\ufffd\ufffd\ufffd\u0119\ufffd{\ufffd\u001c\ufffd\u0005W<\ufffd\u0792\u07ea\u06f0\u007f\ufffd\ufffd\ufffd\u000eU\ufffd`|\u7bad\u0007\u000fo<\ufffd\ufffd\ufffd/~\ufffd\u0017{\ufffd\ufffdm\ufffd>\ufffd,{\ufffd?n\ufffd=\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd>\ufffdNR\ufffdq\ufffd+C\ufffdx\ufffd\ufffd\ufffd/\ufffd\u0010\ufffdw\u0019\ufffd\ufffd\u0605\ufffd\ufffd{__r\ufffd\u0015\ufffd\u0016F\ufffd\ufffd\ufffd\u03ca\ufffd\ufffd\ufffdO<>f\ufffd\ufffdW\ufffdzbr\ufffd\ufffd\ufffd\ufffdl\ufffd\ufffd6\ufffd\ufffd\ufffd\ufffd\t\ufffd\u4c9b\ufffdN\u007f\ufffd\ufffd\ufffd\u0015a;\u000e\u0001\u0015\u000e\ufffd/\ufffd!\ufffd5\u000e\ufffd\ufffdLs\u007fL\ufffdG\u06254\ufffdj5\ufffd\\\ufffd\ufffdw_\u0159\ufffd\ufffd\ufffd\u0005xc\ufffdP\u00d0^\ufffd\ufffd\ufffd\ufffd\ufffd\r\u01f3\ufffd9:\ufffd7\u000b\u001d\u000e$O\ufffd\ufffd\ufffd\ufffdj2z,bj\ufffd\ufffd\ufffd\ufffdz\u001aHr7$\u0019&\u001b&%$N\ufffdd\ufffd\f\ufffd=1\ufffd6'\u0019H\ufffd\ufffd\ufffd3\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdN\ufffd-\ufffd\ufffd\ufffd\ufffd\u001f\ufffd\ufffd\ufffd\u001f|\ufffd\ufffd\ufffd\ufffdF\u0015<\ufffd\ufffd\ufffdy\ufffd\ufffd\ufffd\ufffd/\ufffd\ufffd%\ufffda\ufffdA\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd[\u0007eo\ufffdp\ufffd-\ufffdl\ufffd\ufffdp\ufffd\ufffd\\\ufffd\u07ef}\ufffd\ufffd:U\ufffdS\ufffd\ufffd\ub38e<2i\ufffd\rw~\ufffdMEL\\\ufffd\ufffd\ufffd6\u000f\ufffd\ufffd\u04fc\u001d\ufffd\u000e\ufffd*z\ufffd\ufffd\ufffd-\ufffd\ufffd\u00e1\\\ufffd\u0000n\u0006#\u0196A>\ufffd\ufffd\u00191\u0799\""\u0012\ufffdd\ufffd\ufffd]\ufffddW\ufffd\ufffd(\ufffd\u0019\""BrhH\ufffd\ufffd\ufffd\ufffd\u0006SQdM$\ufffd$\ufffd\ufffdl148\ufffd\ufffd\ufffd\u001b:G\ufffdS\ufffd\ufffdu\ufffd8\u05d9\u007f\ufffd\ufffdy\ufffd\ufffdy\ufffd\ufffd}\ufffd\ufffd\ufffd}?\ufffdu\u07df\u000e>e\ufffdr#wUh3\u0015~,\t\ufffd\ufffd\ufffdK\ufffd\ufffdz\ufffd\u0015\ufffd]\u0013p=\ufffdly\ufffd\ufffd\ufffd\u0015\ufffd8\ufffd\ufffd\ufffd\u007fZ\u001a\u0010\ufffd\ufffd\ufffd\b\ufffd~:\ufffdK\ufffdL\ufffd\u0013O-w\ufffd\u0016\ufffdU[\u0007Y\ufffd<\ufffd\ufffdo\ufffd`\ufffd\ufffd]\u0016\ufffds\ufffd8\ufffd\u001c\ufffd7*\ufffd\u0018W\ufffd]\ufffd\ufffd\ufffd\ufffd\u001fG\ufffd\ufffd|\u0001]\u0014\ufffd\ufffdv\ufffd\ufffd\u001b\u0423U\u000fI\ufffd\ufffd\ufffdW\ufffd\ufffd'\ufffd`\ufffdP\ufffd\ufffd9\ufffdj\ufffd\ufffd\ufffd<\ufffd\ufffd\ufffd9*?\u007f\u0229\u0002=\ufffd0\ufffdY\ufffd\ufffd\ufffd\ufffd,\u0006\ufffd\u00fe\ufffd\ufffdW\ufffd\u0014\ufffd\u06b48\ufffd\u0000#\ufffd\ufffd\u015e\ufffd\u043b\\7\ufffd\ufffd\\LLt\ufffd\ufffd\u0007\ufffd!\ufffd\ufffd3\ufffd\u000f\ufffd~\ufffd\u0001\ufffdg}\ufffd\ufffd\ufffd4\u0000\ufffd\ufffd\ufffd\ufffd,'\u001c:`'K\ufffd\ufffd\ufffd}\ufffd\u001ba\ufffd\ufffdt\u001c/\""y\u0016y\ufffd\ufffd\ufffdI\ufffd\ufffd^\ufffd'\u0019\u0015\u0014_79\ufffd\ufffd\u0002Cz\u0003\u0016_\ufffd`\b\ufffd9T\ufffdS\ufffd\u0015\ufffd\ufffd\ufffd~\ufffdf\ufffdz\ufffd\ufffduS\ufffd\u0001\u0004\ufffd-@0\u0000\ufffd\u0000\ufffd-@P\ufffd+>\ufffd\ufffdw\ufffd|\ufffd\ufffd'\ufffda\ufffdZs\u0013\ufffdZ\\\u0018u\ufffd\u0007\ufffd7\ufffdG\u000e<\ufffdZ\ufffd\ufffd*\ufffda\u01dc\ufffd\ufffdaeO\ufffdO\ufffd\ufffdA\ufffd\ufffd\u0014&\u0007\u001d\ufffd\ufffd\u0007?2\u0013\ufffdYd\u000fF\u001d\u0018\ufffd\ufffd%;\\\u0014\u001a\u0011\u0006\u0157\ufffdb\u0016\ufffdv\ufffdU\u0003\u034e\u059fccnO1\u0018\ufffd\ufffd\ufffd\u001b4/K\u001f\ufffdL\ufffd\u007f\ufffdkz\ufffd\ufffd\u0000Q<\ufffdH=/'%qt\ufffd\ufffd\ufffdqL6\ufffd\ufffd\u0003\ufffd\ufffd\ufffd:\u0001\ufffd\ufffd\ufffd\u0000\ufffd\ufffd\ufffd\u001a\ufffd\ufffd#\n\ufffd\ufffd\ufffd\u04c7]4\ufffd\ufffd\u038ai\ufffd\ufffd\b\ufffd?v\ufffd\ufffd\""P\ufffdB\ufffd\ufffd\ufffdG\ufffd\ufffdN\ufffd\ufffd\ufffd\ufffd\ufffdS\ufffd4\ufffdDF\ufffd@\ufffd\ufffdi\ufffdn\ufffdd(;\ufffdc_\ufffd=\ufffdl\u0018d\ufffdl\ufffdxC\u000e\ufffdI\ufffd\ufffdv\ufffd\ufffdz\"")\ufffd\ufffdf0\tV\ufffdpM\u007f\ufffd'd5\t\u001dX\ufffde\u0632=Y\ufffd\u03fd\\\ufffd\u0004\u001e/\ufffd\ufffd\u0002\ufffd\ufffd\\\u0378\ufffd\u012d\ufffd\u000e\u03db\u0018\u001b\ufffd\u001e-\ufffdEyFE1\ufffd\ufffdRp!\\\ufffdUz\u0002,\\B\u0011}e[p\ufffds\ufffdtC\ufffd\\\\\ufffdx\uf308\ufffd\u00cb\ufffd\ufffd\ufffd?\ufffd\ufffdC\u0012\ufffd\ufffd\ufffd~\ufffdo\ufffd\ufffdK\ufffdOP\ufffd5\ufffdVg\ufffd>\u04dd\ufffd\ufffdO\ufffdy\ufffdH[\ufffd\ufffd\ufffd\ufffd\u02eb\u0000\ufffd%\n 0\u001f\ufffd\u0003\u0005\ufffdi\ufffd\u001b(`\ufffds\u0018\ufffd?\ufffdb4\u0000|UH\ufffd\ufffd(\u4dc8\u0000E\u01c6\n\u001aPR\ufffd\n\r\ufffd&\nXo\ufffd\ufffd\u0011\u000b\u0001\ufffd=;\ufffd\ufffd\ufffd\u0000\ufffd\ufffdA\u05f9\ufffd\ufffdO\ufffd\ufffdB\ufffd\ufffd}\ufffd\ufffd\b\u0726{\ufffd.\ufffdv\u0010\ufffd\ufffd\ufffd)\u0017@u\ufffd\ufffdV\u0003Q\u0011d2\ufffd\u001b\ufffd\ufffd.2\ufffd7\ufffd\u0001O\u001ft^\ufffd9\u001bR\u046e\ufffd\u0002\u010b\ufffd~\ufffd\u0201\ufffdJ8\ufffdqH*\ufffd\ufffdgx\ufffd\ufffd\ufffd\ufffd=\ufffdc]\ufffd&\ufffdB~uu\u05cd(V\ufffd\ufffd\u000b\ufffd\u001d\ufffd\u0004\ufffd\ufffd>\u0011Sh+\u0019\u001e\ufffd\u0272m\u0016O)\ufffd\u056e}\ufffd\ufffd\ufffd\ufffde\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdV\ufffd*\u000f\ufffdR\u0094\u0014xr)\ufffd2\ufffd\u02c9[\ufffd\ufffd\u000e^\u0018\u0015\ufffd\ufffdg_\ufffd\ufffd[\u001f\ufffd\ufffds>\ufffd\u0549\ufffd\u0013\ufffd;_iT&\ufffdN%\ufffd\ufffd\t.\ufffd\u0014\u001d\ufffd\ufffd\ufffd\u0014n\ufffdvh\ufffd\ufffd\ufffd\ufffd~NaT\ufffd\ufffd\""\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u027f3\ufffd;/\ufffd$\u0762\u001a\ufffd\u0015c}\ufffd\u0012\ufffd\ufffd\u007fI\ufffd=Z\ufffd\ufffd\u0018\ufffd\ufffd\ufffd}\ufffd\u02ea!9#\ufffd\ufffdQo=D\ufffdG\ufffd\ufffd\ufffd\ufffdgF\ufffd]\ufffd\ufffd\u001bkX\u077fe\ufffd)\ufffd8\ufffd,\ufffdY\ufffd\ufffd\ufffdQW.K\ufffdH\ufffd2\ufffdH]9\ufffd\ufffd>\ufffd\ufffdG\ufffd\ufffd\ufffd\ufffd\ufffdxR\ufffd\ufffdE\ufffd4\ufffd\u0013\ufffd\ufffd=yp\ufffd\ufffd%4\ufffdu\ufffd\ufffdp\ufffd^v\ufffd\\\ufffd\ufffd\ufffd@l\ufffd[SC\ufffd\ufffd,u\ufffd\ufffds>\ufffd\ufffd`\ufffd\ufffdh\u0013\u0011\u007f\ufffd\ufffdK3\ufffd4D\ufffd\ufffd\ufffd%\ufffd\ufffdGpo\ufffd\u000ec\u072b\u0014\ufffd^\ufffd_ri\ufffd\ufffd\ufffd\u007f\ufffd\u0005\ufffd\ufffd\ufffd\u025f;\ufffd\u05fci\ufffdn\ufffd}V\ufffd\u059eb\u001d\u0170\ufffd\u000f\ufffd\ufffd\u00181\u0007y\ufffd\ufffd\u030b\u001a\ufffd\ufffd\ufffd+\ufffd\ufffd\u0018\ufffd3[\ufffdPQ\ufffdW\u0010\ufffd\ufffd\ufffd\ufffd\ufffdL\ufffd&;itvR\u007f\ufffd\ufffdo\ufffd\ufffda\\\ufffd\ufffd\u0001\ufffd`&v\u00116\u0006\ufffd\ufffd<\u001d\u0006\ufffd\ufffd\ufffd\ufffdwP\ufffd\u001a\ufffd*\ufffd\u0003\ufffd\ufffdt\ufffd\ufffd2\ufffd\ufffdL\ufffd\ufffd\ufffd\ufffdI&\ufffd\u0001\ufffd\ufffd\ufffdm}\u000b\u057c\ufffd\ufffd\ufffd8\ufffd\ufffd/m\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdte\ufffd\fJ\u0701\ufffd\ufffdh\ufffd\u0006\ufffd\u0736`\ufffd\n\ufffd\u0000\u0336`N\ufffd\ufffd0\ufffd?\ufffd\u000f\u0003\ufffd\ufffd\ufffd//\u0184'\u0002\ufffd\f\u0000\u007f~s\ufffd\ufffd\ufffd\u0000>\u0016\ufffd\ufffd\ufffdq`\u0010\ufffd\ufffd\ufffd\u0017f\ufffdW\ufffd\ufffd\u007f\ufffd_\ufffdG(\ufffd\ufffd\ufffdq\ufffdoX\u0010p`s\u00020\ufffdG\u0004-&\ufffd`\u00b0^\ufffd~=\u000f\ufffd}#\u000f\ufffdk\ufffd,\ufffd\ufffd:\ufffd{F\ufffd\ufffdf^3RL\ufffdG\ufffd\u0611\ufffd\ufffd\ufffd\ufffd6XA\ufffd\ufffd#\u00129\ufffd\u000b\ufffdG<\u04f3\ufffd/Dwc\ufffd\u04da\ufffd\u0751\ufffd\u001a\ufffd-\ufffd\u03c2b\ufffd\ufffdkN\ufffdu\ufffd5\ufffd_\ufffd\ufffd\ufffd7\ufffd\ufffd \ufffdTLt\ufffd\ufffdK\ufffd>\ufffdga\ufffd\u01de~\ufffd[\ufffdXhq\ufffd\ufffdY\ufffd\ufffd\ufffd\u05401\r\u0016$\""\ufffd\ufffd\ufffd\ufffd[\u0091\u0019\ufffd\ufffdT\ufffd\ufffd\ufffd\ufffd(\ufffdEXtIZXl\ufffd\ufffd#\u0019\ufffd\ufffd\\s\u0012wm\ufffdUf\ufffd\u001c\ufffd\ufffd'_df\ufffd\ufffd\ufffd\\\ufffd\ufffd\ufffd\ufffd(\ufffd_\ufffdS\u0585\ufffd\u0625\ufffds\ufffdz\ufffd\ufffd>\ufffdu\ufffdS\ufffd\u000b\ufffd\ufffd1A\ufffd\ufffdu\r.r\ufffd\ufffd\ufffd\ufffd,SNu\ufffd\u00b6\ufffd^\ufffd\u0016\ufffd\ufffd\ufffd|\ufffd\ufffd\u0013\u7f1b\ufffd\ufffdl\u000f\u061a\u001f\\\ufffd1Q\ufffdj\ufffd\ufffd\ufffdA\u0007\u0015\ufffd1Y\ufffd\ufffd\ufffd%\ufffd\ufffd!\ufffd}b~YU\ufffd\ufffd\ufffd\ufffd!\ufffd\ufffda-\u0007\ufffd!% 9\ufffd\u0006A\u0013f\ufffd\u0003m\ufffd\ufffd\ufffd\u001b9\u0017#\u0014\ufffd\u0017}\ufffd4b\u201c\ufffd\ufffd\u0016W\ufffd\ufffd\ufffd-\u009e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0005~\ufffdE\u0651\ufffd\ufffd\u012eYWO\ufffd1g\ufffdK\t\u001a\ufffdH\ufffd3He\ufffd(o\ufffd\ufffd\u01ed\ufffd_\u001f\ufffdd\ufffd\u001f\ufffdj\ufffd\ufffd\u000ey+\ufffd%\ufffd'\ufffd\\\ufffdc\ufffd%\ufffd\ufffds\\$\u0016\ufffd\u001a\u001bpg\ufffdD\ufffd\u0018\u0010\ufffd\ufffd9\u015a\u0007#E\ufffd\u001et\u0017\u0016\ufffdGEI|2\ufffd\u0014-[\u0457\u013d\ufffd[n\b\ufffd6&\ufffd\u0384c\u0004\ufffdN\ufffd\ufffd\ufffd\n\u0018\ufffd\ufffdR$}\ufffd\u07d0?}>;\u0003\ufffdM\ufffd\ufffd\ufffd?\u00034&\ufffd\ufffd\ufffd\ufffd\ufffd \ufffd\ufffd\ufffd\ufffdr\ufffd\ufffd\ufffd\u001bp\ufffd\u0012$\ufffdv\ufffdx\u051c\u0016[\ufffd\ufffd\u0295\ufffd\""\ufffd&\u0499\u001c\ufffdcvf\u0006\u0007\u001b\ufffd\u001f\ufffdD8\ufffd\ufffd\f\u0002V\ufffd\ufffdM\ufffd\ufffd\ufffd\ufffd\u001fZ\u001d\ufffdqDY\ufffd\u0657'E5\ufffd|\u0014\ufffd\ufffd\ufffdIM\ufffd\u001dQ[W\ufffdb\u001c5}(\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\ufffdj(\ufffd\u0007\\\ufffdt\ufffdzF-z1p\ufffd2\ufffd?\ufffd\u001e\rs\ufffd\u04d6\ufffd\t\ufffd}\ufffdP\ufffd\ufffd\ufffd\ufffdh\ufffde\ufffd\u001c\u0677X\ufffdhR\ufffd\u0014\u0001\ufffd#7#\u0016\u008b\ufffdP\ufffd\ufffd\ufffd\ufffd2\ufffd\u001b\ufffdL\ufffd\ufffd\r\nendstream\r\nendobj\r\n786 0 obj\r\n[ 0[ 507] 3[ 226 579] 17[ 544 533] 24[ 615] 28[ 488] 47[ 252] 58[ 319] 62[ 420] 69[ 646] 75[ 662] 87[ 517] 90[ 543] 94[ 459] 100[ 487] 104[ 642] 258[ 479] 271[ 525 423] 282[ 525] 286[ 498] 296[ 305] 336[ 471] 346[ 525] 349[ 230] 361[ 239] 367[ 230] 373[ 799 525] 381[ 527] 393[ 525] 395[ 525 349] 400[ 391] 410[ 335] 437[ 525] 448[ 452 715] 455[ 453] 460[ 395] 853[ 250] 856[ 252] 876[ 386] 882[ 306] 894[ 303 303] 910[ 498] 920[ 682] 1004[ 507 507 507 507 507 507 507 507 507 507] 1089[ 498] 3403[ 745] ] \r\nendobj\r\n787 0 obj\r\n[ 226 0 0 0 0 0 682 0 303 303 498 0 250 306 252 386 507 507 507 507 507 507 507 507 507 507 0 0 0 0 0 0 0 579 544 533 615 488 0 0 0 252 319 0 420 0 0 662 517 0 543 459 487 642 0 0 0 0 0 0 0 0 0 0 0 479 525 423 525 498 305 471 525 230 239 0 230 799 525 527 525 525 349 391 335 525 452 715 0 453 395] \r\nendobj\r\n788 0 obj\r\n[ 306 0 0 507 507 507 507 507 507 507 507 507 507] \r\nendobj\r\n789 0 obj\r\n<>\r\nstream\r\nx\ufffd\ufffd\t`SU\ufffd\u01ff{o\ufffd=m\ufffd.i\ufffd\u06e6I\ufffdt/]\ufffd\ufffdn\u0014\ufffdVh\ufffd-[\ufffdf\u0011\ufffd\ufffd\ufffd\u0002*\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\u0015\ufffdq\ufffdPI\u0003j\u0011DT\ufffdqA\ufffd\u0011\ufffd}\u07e8\ufffd`\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\""\u039b7\ufffdf|3/_\ufffd\ufffd\ufffd\ufffd,\ufffd\ufffd\ufffd{rbK\u0005\u000e\u0000L\ufffd\""\ufffd\u059a\ufffd\ufffd\ufffdM\ufffd+\ufffd\ufffd\ufffdq\u0000@\ufffdYS9\ufffd\ufffdw\ufffd\ufffd\u00017\ufffd\u0004\u0000a\ufffd\ufffdY9\ufffd\ufffd>\ufffdw\u0017\u0000w\u001e\ufffdj]\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd[<\u0000s\ufffd`\ufffdo\ufffdI+\u014a\ufffd\ufffd\ufffd\ueeb3\ufffd\ufffdyK:\ufffd[\ufffd\ufffdO*\ufffd\u0000\ufffd\u007f!\ufffd:\ufffd\ufffd\u0013\ufffd,\ufffd ~\ufffd7;G\ufffd\ufffd\ufffd/n[\ufffd\ufffd\ufffd5g`{\ufffd\ufffd\ufffdvt\ufffdwZ\ufffd\ufffd\ufffd\ufffdtJ\ufffd\ufffdw\u007f\ufffdZ\ufffd\ufffd\u0000Z\u0016\ufffd\u0431\ufffd\ufffd\ufffd\ufffd}\u001d\u0000\u001f\ufffdc\ufffdc\ufffd\ufffd\ufffd\ufffdL\ufffd.\ufffd1\ufffd\ufffd4\ufffd\ufffd\u0017\ufffdl\ufffd\ufffd\ufffd'\u0001wl\u001c\ufffd\ufffdZ\u0476|\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\u0007 \ufffd\ufffd\u038e\ufffd!\u001b\ufffd\ufffd\ufffd\ufffd\ufffdwv-\ufffd\ufffd\ufffd\ufffdD7@\ufffdf\u0000\ufffd\ufffd\ufffd\ufffdBQ\ufffd\ufffdi\ufffd\u001cX4\ufffd8\ufffd\u001b\ufffdW\u0001\ufffd\ufffd\ufffd\ufffd\ufffd\u0014\u32d3V\ufffd<\ufffd\ufffd`\ufffd&A5\u0003\u02ea\ufffd\u00072\ufffd\ufffd\ufffd!\ufffd\ufffdj6\u001f~\ufffd\ufffd9\ufffd\u0004\ufffd\ufffdQ\u0016\ufffdd\u001e[\u0006\ufffd\u000694\ufffd\ufffd5M\ufffd\u0003\ufffd\u0000\ufffd\ufffd\ufffdr \ufffd&\ufffd0W%\ufffdZ^\ufffdM:\ufffd\u00b3p\u001f\u000f*\ufffd\ufffdJ^\ufffd\ufffd\u0004^\ufffd\u001exC{ \ufffd\u0014lV\ufffd\u069e:K\u0014A\ufffd\ufffdO}P\ufffd\ufffd{D\ufffdB,O\ufffd#7\ufffd\ufffdB\ufffd\ufffd\u0000\u0011\u001be\ufffd!\ufffd\ufffd\ufffd\ufffd\u007f\ufffd\ufffd.\ufffdg\ufffd\ufffd\ufffd\u0014u\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd^\ufffd\ufffd\ufffd0Y=\ufffd\ufffd\ufffd}\ufffd\ufffd?n\ufffdKp\ufffdo\u0747\u007f\u0007\u3fc1\ufffd\ufffd\ufffd\u001e\u001eh\ufffd\ufffd\ufffd\u0012\ufffd\ufffdE,b\u0011\ufffd\ufffd\ufffd\ufffd\u0016>\ufffd\u057c\ufffd\ufffd\u033f\ufffd/G\ufffdC7\ufffd3\ufffd\ufffd\ufffd\u0018m\ufffd\u0019\ufffd\ufffd\ufffd\u00f0\ufffdn\ufffdi\ufffd\u001b\u0010/|\t\u04c5\ufffdP%k\u0005\ufffd\ufffd1L\ufffdU\ufffd\u0012a7\ufffd\ufffd|0\u0015\ufffd'\ufffd\ufffd\ufffdR\ufffd\ufffd&\ufffd\u001f\ufffd\ufffdjE5\ufffd\u001aP\ufffdP\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\t\ufffd\ufffdfh\u0010\u0386\ufffd\ufffds\ufffd\""\ufffd\ufffd|\ufffdih\u0012\ufffd[\ufffd\u000fe\ufffdkP+l\ufffd1\ufffd5\ufffd\u0019\ufffdY\ufffdl\ufffd\u0002T\rj\""\ufffd\ufffd\ufffd\u0017\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdr\ufffd\ufffd\t90\ufffd\ufffd\ufffd\ufffd\ufffd\u000e\ufffd\ufffd\u0000\ufffd\ufffd\u0003\ufffd\ufffdP\u017f\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdX\ufffd.>\ufffd\\\ufffd#u\ufffd\ufffd!\u0007\ufffd\ufffdN\ufffd\ufffdWb\ufffd\u001e0\ufffd\ufffdC\u001e\u007f2d\ufffdm\ufffd\ufffd\u0005\ufffd\ufffdW\ufffd\ufffdo-\ufffd\ufffd]\u0015\u0011\ufffdX\ufffd\ufffd/\ufffd\ufffd\u001aX\ufffd[\ufffd!b\u0011\ufffdX\ufffd\""\u0016\ufffd\ufffdE,b\u0011\ufffdX\ufffd\""\ufffd\ufffdc\ufffd\u03d9\u0011\ufffdX\ufffd\""\u0016\ufffd\ufffdE,b\u0011\ufffdX\ufffd\""\u0016\ufffd\ufffdE,b\u0011\ufffdX\ufffd\""\u0016\ufffd\ufffdE,b\u0011\ufffdX\ufffd\""\u0016\ufffd\ufffdE,b\u0011\ufffdX\ufffd\ufffd'\ufffdwB\u001e\ufffd\u0011\ufffdCU\ufffdRQ\ufffd\ufffdb\ufffd\ufffdp\ufffdQ\ufffd}\ufffd\ufffd|\ufffd%P\ufffdjFMDMF\ufffd\u001aP\ufffdP\u0568Rv}\ufffd\u06a1[\ufffd\ufffd{G,b\u0011\ufffdX\ufffd\""\u0016\ufffd\ufffdE,b\u0011\ufffdX\ufffd\""\u0016\ufffd\ufffdE\ufffd\ufffd\ufffd\ta%\ufffd\ufffd\u0002v?\ufffd\ufffd\ufffd\ufffd\tdp\u001d\ufffd\ufffdA\ufffd+\ufffdw\ufffd\ufffdx\ufffd\r\ufffd0\u0015\u0016A\u0017\ufffd\t\ufffd`\ufffd\ufffdT4\ufffd\ufffd\ufffd\u001a\ufffd\ufffd\ufffd\ufffd\u05eb\ufffdL\u0012\ufffd\ufffd\u001d)\u0013\u001c)\ufffdR\\\ufffde\ufffd\ufffd7x\ufffd\u001aaW\ufffd;\ufffd\ufffdK\ufffd\u001f\u0011j\ufffd\ufffd\ufffd\ufffdw\ufffd\ufffd\ufffd\ufffd\ufffd}p\ufffd\ufffd\u000eO\u0016\ufffd\u0002\u0005w@J|q\ufffd\ufffd\ufffd\ufffd4\u001f\ufffd+\ufffd<\ufffdu\ufffdF\ufffdw\ufffd\ufffdtI\ufffd\u0007\ufffd\u0001\ufffd3\ufffds\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u007f\ufffd\ufffdU\ufffd\ufffd\ufffd3\t\u007f%\ufffd\ufffd\ufffdIK\ufffdq\ufffd\u007fx\u001d\ufffdj\ufffd\u03db;gvKs\ufffd\ufffdq\ufffd\u0306\u0019\u04e7M\ufffdR?yR\ufffd\ufffd\u069a\ufffd\ufffd\t\ufffd\ufffd\ufffd\ufffd\u0196\ufffd\ufffd\ufffd\ufffd).\ufffd\ufffdfg\ufffdy\ufffd)\ufffddg\\\ufffd\ufffdd\ufffdk5j\ufffdR!\ufffd\t<\u0007Y5\ufffd\ufffdV1\ufffdi\r\ufffd<\ufffd\ufffd\ufffdl\ufffdv\ufffd\ufffd\ufffdm\ufffd\ufffd5 \ufffd\ufffd\ufffd\ufffde\u0002b\ufffdTL\ufffdyI\u001f\ufffd\\rDI\u001f\ufffd\ufffd\ufffdL\ufffdX\u0018\ufffd\ufffd%\u05b8\ufffd\ufffd\ufffdj\ufffd\ufffd\u03f544\ufffd\ufffdE\u056ef10 ]O\ufffd\ufffde\u001e)\ufffd\ufffdDR\u0012\ufffd\u0010k\ufffd\u06ab\ufffd\u0000\ufffd*\ufffd\u0004jOj\ufffdi\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd*W\ufffdbMv\u0016\ufffdi\ufffdx\ufffd\u016b@\ufffd\ufffd\ufffd\ufffdK\u001b\ufffdI\u0017|ZMY\u001f\u000f*=\ufffdm@p\u05f4-\n\ufffdhh\ufffd\ufffd\ufffd%%5K>\ufffd\ufffd\ufffd\n(\ufffd\u0002J\ufffd-q)\ufffd3\\ \ufffde\ufffd\u9f70\ufffd\u0004\u000bZ3u\ufffd\\\ufffd\ufffd\ufffd4\u0005\ufffd6\ufffd\ufffd+\ufffd\ufffd\ufffd\ufffd\u001b0g\u0006\ufffd]\u0541\ufffd\ufffd\u07cb\ufffd!/\u000ed\ufffd\ufffdk\u0002\ufffd.l\ufffd~\ufffd\ufffd\r\ufffd\ufffd\ufffdmr\ufffd\ufffd\ufffd\u0000v\ufffd5p\ufffd\u77b6\ufffdG\ufffd6}\u0003\ufffd\rqd\ufffd0\u007f\ufffd\u001a\ufffdo\ufffdC\u001c_R\u0012\ufffd\ufffd\u0005\ufffd>X\ufffd\ufffd\ufffd\ufffd\ufffd&J\ufffd\ufffd\ufffd\u0016\u0004_Nfs\ufffdoe9{\ufffds,~\ufffd\ufffd~8g\ufffdz\ufffd+\ufffd\ufffd\ufffd\ufffd5\ufffd}R{\\`\ufffd\u00021;\u000bg_\ufffdv\ufffd7\ufffd\u0001\ufffd\u04fa`a;c\ufffd\ufffd^Wu5\ufffd[cS\ufffdW\ufffd\u0017\ufffd\ufffd\ufffdXk\ufffdrs\ufffd|[+\u000eb)\ufffd\ufffd\ufffd\ufffd@\ufffd\ufffd3\u0010\u3aa4\u0002\ufffd\u0010Y\f\ufffd\ufffdj\ufffd\ufffd\ufffd\ufffd\u0005b\ufffd\u0002\u043a0\\+\ufffdSS\ufffd\ufffd%\ufffd\ufffd\ufffdVS\u0007Y[\ufffd\ufffd\ufffd\u001dP\u0010z\ufffd\ufffdP\ufffdm+\ufffdBhf\ufffd\bX\ufffd0(\ufffd\ufffd\u07a6EK\u0002\ufffdV\ufffd\""\\\ufffdK\ufffd&[R\ufffd\u05cc\ufffd\ufffd\ufffdjZ\ufffd\u0322\ufffd2\u0005\ufffd\ufffd\ufffd\ufffd%Iw\ufffdj\ufffd\u060e(=\\\ufffd\ufffd\\\ufffdV\ufffdM\ufffdMhf\ufffdB\ufffdX\ufffd/\ufffd\u02b1\ufffda\ufffdpII\u0016\ufffd\u02b1b\u0013g\ufffd\ufffdbx\ufffdp\tv\ufffd\ufffdv0!\ufffd\ufffd\ufffdX\ufffd\ufffd\ufffdV\ufffd\u0652\ufffd\ufffd\ufffd\ufffdJ\ufffdl\ufffd>\ufffd\ufffd\u0001\u0568\ufffdL\ufffd\u0018\ufffd\u0013\ufffd\ufffdW\ufffdF\ufffdY\ufffd\ufffd\u015a\ufffd\u0563:\ufffd\ufffdF\ufffd\ufffd\u000e\ufffd[;z?y6\u0017\ufffd\u001bc\r\u0015\u000bg\ufffdp\ufffd\ufffd\ufffd'\u0017}<6#\ufffdX\u0014\ufffd\ufffd\u0000\ufffd\u0010\ufffd\\\ufffd]\ufffd.\\C\ufffd\u0019Mlll\ufffd\ufffd\ufffd\ufffd\ufffdr\ufffd7\ufffd4I\ufffd\u000e\ufffd\ufffd\u019f\ufffd(\ufffd\ufffdR\u0001H\ufffd\ufffd\ufffd\u0004_\ufffdk\ufffd6\ufffd6\u001cV)=QJ\ufffd$\ufffd\u021e4\ufffd-\ufffd\ufffd\\\ufffd\ufffdzY\ufffdp\ufffd \ufffd\u0013\ufffd\ufffdVx&\ufffd]P\u0012U\ufffd\ufffdf-\ufffdn\ufffd\ufffd6\u0017\ufffd\u5d7dm\ufffd\ufffd\ufffd\u000bz\ufffd|\ufffd\ufffd\u039a\ufffd\ufffd2\u0586k\u04a2^\u05ec\ufffd\ufffd6\ufffd\ufffd3\ufffd\ufffd\ufffdNf\ufffd\ufffd\ufffdz\ufffd\ufffd\ufffd2;\u000b\ufffd\ufffd\ufffd>\u0017w^C\ufffd\ufffd;oVK\ufffd\u000e\u0013\ufffdx^cS\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0014\ufffdk\ufffd!\u0002\ufffd$/\u03fc\ufffd\ufffd\u0012\""K\ufffd\ufffdfbB%\ufffd\ufffd\ufffd\ufffd\u0001\ufffd\ufffdre\ufffdCJ/\ufffd\ufffd@\ufffd}\u001c,\ufffd\ufffd\ufffdg\u001a\ufffd\ufffd\u84d1\ufffd'\ufffd\ufffda\ufffd\ufffd\ufffdq\ufffdq\ufffd\ufffd\u0011\u0017\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001e.\ufffdb(\ufffd\u000bp\ufffd\ufffd\u0010\ufffd]\ufffd\ufffd8^\ufffd\u000bh\\\ufffd+\u0003ZW%\ufffdW0\u007f\u0005\ufffd\u0015\u032f\u0105\ufffdY9\ufffd\u001c\ufffd'\ufffd\ufffd\ufffdp\ufffd\ufffd\u0005\ufffd\u00046\ufffd\ufffd\ufffd\ufffd\ufffd\u0014\ufffdC\ufffd\u01a6\ufffd}\ufffd\ufffd\ufffd$\\jsP-M\u0001u&\ufffd\ufffdr\ufffdd,7\ufffd\ufffd\u0015\ufffd\u0013\u0003\ufffd\u0017\ufffd\ufffd~\ufffd\ufffd\ufffd\ufffdU\ufffd'-l\ufffde;\ufffd \u0016\ufffd\u0014Pc\u000b\ufffdp\u000bX\ufffdV\ufffd\u00d6#VZ\ufffd\ufffd\ufffd\u0000J\ufffd\ufffdc\""\ufffd\ufffd9\u041c\ufffdn\u06b4\ufffdYZ\u03a6\u0000\u0539\ufffd0\ufffd\u0526\ufffd\ufffdn\ufffd\ufffd\ufffd\u001b\ufffd\u0297\ufffdM|\u00144\ufffds\u0019\ufffd\ufffd7\ufffd\ufffdD\u001e\u001b&\ufffdf\ufffd4IJ\u001d\ufffd|\ufffd\u000b\ufffd\u0016\ufffd\ufffd8\ufffd2X8\u000b\ufffd:\ufffd\ufffd\u001a\u001by\u0016\ufffd(\ufffd,\ufffd\ufffd\ufffd\ufffd3\ufffd\rKpk\ufffd\ufffd\ufffd\u068b\r\ufffd7\ufffd\ufffdz\ufffd#)w+\ufffd\ufffd\ufffd\ufffdR\ufffd\ufffdp\u0001\ufffd\ufffd)\ufffd\ufffd\u001eyFMe\ufffd\u0002\ufffd\u000efMb}\ufffd\ufffds\ufffd\ufffd\ufffd\u80ec\ufffd\ufffd~\ufffd\ufffdZ\ufffd;\u000b\ufffd\u0512\u0012\ufffd\u0003z\ufffd\ufffd6\ufffd\ufffd\ufffd\ufffd\u0016=\ufffd\ufffd\ufffd\ufffd*\ufffdGh\ufffdm\ufffd%\ufffd\ufffd\ufffd\\\ufffd\ufffd.\ufffd\u001b\ufffdC\ufffd\ufffd\ufffd$\ufffd\ufffd\ufffd,\u0017{s`\u000b\u0013l;paCs\uf44e\ufffd\ufffd\ufffd\ufffd,\u0551^\ufffd\ufffd\ufffd\ufffdU\ufffd^\ufffd\ufffdK\ufffd\u001f!:!\ufffd\u0016>\ufffd`\u0017\ufffdp\u0257\u000b\u0013\ufffd\ufffd\u0002!\u0017\ufffdE\ufffd \u0013r`\u0011j%j?J&d\u000b\u0019P\u0002N!+\ufffdL!#X\ufffdLy\u0000\ufffd7\ufffd\ufffd\ufffd\ufffd\ufffd\u001et\ufffdRkwH\u0017\ufffdb\ud105\ufffdX(\u0011\ufffd\ufffd/\ufffd!K\ufffd%\ufffd1\ufffdbd\u0011\ufffd\u0010Y\ufffdt!\ufffd\ufffdIH\u0011\ufffd\ufffd)\ufffdGq\u0019{\u0015\ufffdQ\u001e\ufffd\ufffd\u0457\""\ufffdA#\ufffd\ufffd\ufffd\n\u00e9\ufffdQ2\ufffd\u0011R\ufffd\u001a\ufffd\u001eJ\ufffd^\ufffdb\u0019\ufffdD\ufffd\ufffd\ufffd\u001c\ufffd\u001f\ufffd5J\ufffd]O\ufffd\u0016\u000b\ufffd\u001c\ufffd\u0015\ufffd\ufffd\ufffd\ufffdElQ\ufffd\u001a\""\ufffd\u0010A\ufffd\ufffd\u0010t\u061d\ufffd\ufffd\ufffdAG&\u2ee0#\u000b\ufffd-\ufffd\u001b\ufffd\u05d4\ufffd\u0015\ufffd\ufffd$|A8H\ufffd\ufffd\ufffd\u0019\ufffd\u001c \u001c \u79c4O\b\u001f\u0013>\""|H\ufffd\ufffd\ufffd>\u1f60C\ufffdx\ufffdR\ufffd\u0010\ufffd\u000e\u06a3\u0010o\u0005\ufffd\ufffd7\ufffd\ufffd\u001c\ufffd\u001b\ufffd\ufffd\t\ufffd\u0011^\ufffd\""\ufffdP\ufffde\ufffdK\ufffd\u0017\t/\u0010\ufffd'\ufffd'#\f\u0010\u000e\u0010>%|B\ufffd\ufffd\ufffd\u0011\ufffdC\ufffd\ufffd\u0007A\ufffd\u000b\ufffd>\u1f60\u0015\u0017\u0018\ufffd.\u1760\ufffd\u0004\ufffd6\u1b60\ufffd\n\ufffdf\ufffdZ\ufffdx\ufffd\ufffd:\u1d60\ufffd\u0006\ufffdj\ufffdZ\ufffdx\ufffd\ufffd2\ufffd%j\ufffdE\ufffd\u000b\ufffd\ufffd\ufffd\ufffd\ufffd~\ufffds\ufffd\ufffdPc\u007f\ufffdz\ufffd\u0012\ufffd!9hfK~\rM\ufffdj\ufffd*\ufffdI\ufffd\u001eB\u0015\ufffd\ufffd\ufffda\u0002\ufffdG\ufffd \ufffd'\ufffd\ufffd![\b1\ufffdh\ufffd\u001d\ufffd \ufffdA\ufffd\ufffd\ufffd\u0002\ufffd\u001f\ufffdx\u060b\u0012\u0004\ufffd\ufffd\ufffdB\ufffdEQ\ufffdI=k \ufffd L'L#L%L!\ufffd\u0013&\u0013&\u0011\ufffd\b\u0013\t\ufffd\ufffd\u001aB5!\ufffd\ufffdD\ufffd\u0017\tN\ufffd\ufffd`'$\u0012l\ufffd\u0004B\u0089}\u0001\ufffd\ufffd\ufffd1;\ufffd\ufffd\u0017p\ufffdb\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0000\ufffd[f7\ufffdq\ufffd\ufffd\ufffd}\u001c_\ufffd\u0018\ufffda\ufffdm]J\ufffd}\ufffdE`\ufffd\ufffd\u000f\ufffdg5\u0005\ufffd\u035b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u74eeC\ufffd\u001a\ufffdHs\ufffd\ufffd\ufffd\ue559\u0759\ufffd\ufffd\ufffd\u05cd\ufffd\ufffd=\ufffd-\ufffd\ufffdWd\ufffdJ\ufffd\ufffd\ufffd\u001b\ufffdH\ufffd\u0018+\ufffd\ufffd\ufffd#\u0015\ufffd\ufffd\u07c3m`\u0006\ufffd\ufffd%7K\u0353\ufffd\ufffdZ\u001b\ufffdR\ufffd\u0551\ufffd+\ufffd\ufffd-o\ufffd\ufffd\ufffd\u0000\u00172[\ufffd\u0763\u0017\""[\f\ufffdN\ufffd\ufffd\ufffd\u03d3~\ufffd\ufffd\ufffd\u0001`\ufffdQ\ufffd\u000ep:~]\u0007[\ufffdn\ufffd\u000f\u001e\ufffd'\ufffd9\ufffd\ufffd\ufffd@+\ufffd\r\u000f\ufffd\ufffd\ufffd\t|\t\ufffd\ufffdUr\u0016.\ufffdK\ufffd\ufffd~!b\ufffd\r\ufffd)_\u000eza\u000f( \u0016 t(\ufffd\ufffd\ufffdm\ufffd\ufffdq{0\ufffd\ufffd\\\ufffd\ufffdX\ufffd\ufffd'O(*4p\ufffdo\u8ca1\ufffd\ufffd\ufffd\u0015Z0IuM\ufffd\ufffd\ufffd=\ufffd\r\ufffd\u000e\ufffd\u0015,\u001d*fi\ufffd\\v-\ufffd8\ufffd\ufffdah\ufffd\u0426\ufffdu\ufffd\u0013\ufffd\ufffd\u0007V\ufffd\u001a8\u0019N\ufffd\ufffdp\u001a\ufffd\ufffd3\ufffd\u001c8\u0017\u0383\ufffdq.\ufffd\ufffd\ufffd\u0005p!\\\u0004\u0017\ufffd\u0006\ufffd\b\ufffd\ufffd\ufffdp\u0019\\\u000eW\ufffd\ufffdp\u0015\ufffd\u000e\ufffd\ufffdk\ufffdZ\ufffd\ufffd\ufffd\ufffd\u0006\ufffd\u0014\ufffdc\ufffd\u001b\ufffd\ufffdJ)\ufffd\ufffd\ufffd\b7\ufffdmp\u0007\ufffd\u000fp\u0013\ufffd\u0011n\ufffd[1};\ufffd\ufffd\u001dp\u0017\ufffd\ufffdC\ufffd;\u0473\u0019~\ufffd\u079b\ufffd\ufffdJ1\ufffdV\ufffd\n@\u001f\u0004a\u001bl\u01d8Qz8\ufffd\u000f{\ufffd\u001e\ufffd\u0017\ufffd\u0003\ufffd\ufffd\u0013v\ufffd\ufffd\ufffd\u001b\ufffd\u0007#\ufffd\ufffd\ufffdc\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05c7a/<\u0002\ufffd\ufffdc\ufffd'x\u001cW\u0193\ufffd\u0014\uc0e7\u167f+\ufffd\u0011\u000fK=\u000b\u007f\ufffd\ufffd\ufffdZ\ufffd\u000f\ufffd\ufffd\u000b\ufffd\""\ufffd\f\ufffd\ufffd\u001b\ufffd&\ufffd\u0005\ufffd\ufffd;\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd+X\ufffd\ufffdp\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd1\ufffd\u001c\ufffd\ufffdT\ufffd\u02bc&\ufffd~$\ufffd\ufffd\u001f\ufffd\u0005\ufffdq*\ufffd\ufffd\ufffd\ufffd0\ufffd\ufffd\ufffdE\ufffdJ)BWKqd\ufffdc\u0479I\ufffdg\u0016\ufffd\ufffd\ufffdf\u0011\ufffde$6w\ufffd\u001c\u07c9\ufffdd)v}M8\u001awa\ufffd>\ufffd\ufffd\ufffd\ufffd;\ufffd\ufffd=\u001d\ufffd\u000e\ufffd\ufffd.,\ufffd\ufffd\ufffd\ufffd\u000b\ufffd\ufffdc\ufffdH\ufffdvv\ufffd\ufffd}R\ufffd\u000bJ\ufffd\u001e\u001ai\ufffd\ufffd\u0019\ufffd\u0011>?jv^\u001b5\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffdQ\ufffdO\ufffd\ufffdJ\ufffd\ufffde\ufffd,\ufffd6~>\ufffd\ufffd`]\ufffd}V\ufffd\ufffdG\ufffday\ufffd`\ufffdc\ufffd\u001d\u000e\ufffdL3~*E\ufffdS\ufffdp\ufffd\ufffd\ufffdp\ufffd\u0000|\u0006\ufffd\ufffd7\ufffd\ufffdA\ufffd\u0002\ufffd\ufffd\ufffd\ufffdkL\u007f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdH\ufffdw\ufffd\ufffd=\ufffd\u0000\ufffd0\ufffd?\ufffd\ufffd\ufffd\ufffd\u00119\ufffd0\ufffd1\ufffd\u0003\u0006\ufffds\u0002\f\ufffdt\ufffd\ufffdW\ufffd\ufffd\ufffds\n\ufffd\ufffdT\ufffd\ufffd\ufffdp:N\ufffd\u00198#\u001eW\ufffdG\ufffdhGr\u033f\ufffd\ufffd\u001d%O-y\ufffd\ufffdh.\u0006\ufffd\ufffdX.\ufffdK\ufffdl\ufffdo\ufffd9\u0007\ufffd\u44b8\ufffdQy\ufffd#9\""\u6e38\u0014\ufffd\u001d\u03b3J5\ufffdG\ufffd:\ufffdD\uca32\ufffd\\.\ufffd\n_39/\ufffd\ufffd\ufffdy\\!W\u010d\ufffdJ\u0453\ufffd\ufffd|L\ufffda^\ufffd\ufffdJ\ufffd\u0001\u000b\ufffd\u00048$\ufffd\ufffd\u007f\n\u06cf\ufffd]\ufffd\ufffd\ufffd\u0775\u5dc3\u00056\ufffd\ufffd\u000fU\u000e\ufffd8\ufffdK\ufffd\ufffdk\ufffd\ufffd\u00191@\b#\ufffd\ufffd\ufffd\ufffdf\ufffdj.\ufffd\u0019\ufffd?\ufffd\ufffd\u01d9\ufffd\u0312b\f\ufffdR\ufffdP\ufffd\ufffd\ufffd|Q\ufffd\ufffd\ufffd\ufffd \u007f<_T\ufffdq%\u001bx\ufffdWX\ufffd>776'G\u334bK\ufffd\ufffd\u0017mO\ufffd\ufffd\ufffd4xq/\ufffd\u00147\ufffd\ufffdq;\ufffdl\ufffd\ufffd7tp\ufffd\ufffd\ufffdO\ufffd\ufffd\u000f\u001d\ufffd\ufffd*\ufffd\ufffd^\ufffd\ufffd\u001a\ufffd\ufffd\ufffd\ufffdU8\ufffd\u001a\ufffd\ufffd(\ufffd\ufffd\u000fq\u0015hQ\ufffd\ufffd\ufffd \ufffd0\ufffd\ufffd\ufffd_\ufffd\ufffd\ufffd\u001f\ufffd7\u0017\ufffd\u060b\ufffdt\\NA\ufffd\ufffd 7\ufffdv\ufffd\ufffd\ufffdMr\ufffd\ufffd\ufffdA0\ufffd8\ufffd\ufffd\ufffdR9\ufffdy\ufffdY\ufffd\ufffd\ufffd\ufffdc\ufffd\u0002\u000e\ufffd\ufffd.-\ufffd\u0013\ufffd\ufffd\\wJn\ufffd\ufffd\u001f:_\u0016\ufffd\ufffdMN\ufffduF\tCW\ufffdZG\u000e\ufffd\ufffd\ufffd\ufffd\ufffd;\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdq\ufffdzgz\ufffd\ufffd\u03d6\u001a\ufffdO\u04584\n\u0005\ufffd\ufffd\ufffd\ufffd\u04db5\ufffd\\k\ufffd\ufffd\u0012\u000f\ufffd;\ufffd?\ufffd\ufffd\ufffd\ufffd*\ufffd\ufffdqP\ufffd2\ufffdR\ufffd\u0006\ufffd\ufffd~K\ufffd\u001c\u0000Y\u0019\ufffdD\ufffd\ufffd\t\ufffd\u000f@4\ufffd\u0007|B\u0012\ufffdu\ufffd\ufffd8.7hXd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdA\ufffd@\ufffd\u0000\u0017^\ufffdl\bI\ufffd\u001ei\bI\ufffdoy\ufffd\ufffdw\ufffd\ufffdl5\ufffd\ufffd\u001a\ufffdx~\ufffd\ufffd\u001b\ufffd\ufffdt\u0007Wv\ufffd'\u000f}\ufffdT\ufffd\ufffdu\u0672\ufffd\ufffd\ufffd\u001e>\ufffd\ufffdg\ufffd(O\ufffd\b\ufffdzR|\ufffd?t~\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdc\ufffd\ufffdz8'tH\ufffd0\ufffd\ufffd\u0004\ufffdgY\ufffdS\ufffd\ufffd\ufffdf\ufffd:Y\ufffd\ufffd\ufffd\ufffdN.\ufffdu\ufffd\ufffd3Cr\u0462l\ufffdV\ufffd{\u0016\ufffd\ufffdM\ufffd\ufffdv\b\ufffd;\ufffd4\n\ufffd\u0019UZ\u001a\ufffd\""[Z\ufffd\ufffd7:\u0000\ufffd\ufffd\u001c5\u0000\ufffd\u0005\ufffdR\u0000\ufffd\u0016\ufffd\ufffdZ[\ufffd\u06d3\ufffd\ufffd\u11de\ufffd\ufffdT\ufffd\u0649Fa\ufffdE\u001e\ufffd\u001eO\ufffdM\ufffd\ufffdl\ufffd\ufffdy\ufffd\ufffd\ufffdeo\ua759e\ufffdw\ufffdf95\u0006\ufffdL\ufffd6h\ufffd\ufffd\u001f\ufffd0\u001be*\ufffdJ(\ufffd\ufffd\u0011o0=\u02d4\\\ufffd6\ufffd\ufffd/\ufffd(s\u0019\ufffd\u04a5Y\u000f\u001d\u0012>\u0131\u0016\ufffdJ\ufffd\ufffd\u0001\u001a\ufffd\ufffd\ufffdy\ufffdLs!\ufffd\u0001\ufffd\ufffd\ufffd\ufffd~\ufffd\ufffd\ufffdi\ufffd\ufffd\ufffd\ufffd\ufffdcK\ufffd9\ufffd\ufffd\ufffd\ufffd\ufffdp\u0007p\ufffd\u0018(\ufffdP\ufffd\ufffd\ufffd\ufffd\ufffd\u0017\u0006~\u001agj\ufffdWp\ufffd|\ufffd,<\u0016\ufffdm8\ufffd\ufffdX\ufffd\ufffd\ufffd)R\u0087:\ufffd,;\ufffdP4\bS\rvw\ufffd{\ufffd\u0391\ufffd\ufffd\u0014\ufffdu\u0018\ufffd\ufffd\ufffd\u001b\ufffd\ufffd\u0012\ufffd\ufffd\u0015\ufffdg\ufffd\ufffdM~\ufffdj\ufffdA\ufffdgl\ufffdI+\n*2,\ufffdJ\ufffd\\\ufffdiL\ufffdw\ufffdJ=QC\ufffdF\ufffdz\ufffd'%\ufffd\ufffd\ufffd\ufffd\ufffdeb\ufffdI\ufffd\ufffd\u001e\ufffd\ufffdr\ufffd\ufffd\u007f21\ufffd\u00153\ufffdY\ufffd\ufffd\ufffd\ufffd\ufffd>\ufffd\ufffd\ufffd\u0014\ufffd\ufffd=\ufffd_^F\ufffd}Pk+\ufffd\u0273\ufffd}\u000e\ufffd\ufffd\ufffdD'\ufffdjKSm2CF\u007f\ufffd\ufffdZ#7%\ufffd\ufffd\ufffd\ufffdS\ufffdM.\ufffdc\ufffdBLm\ufffd\u0019\ufffd\u02a7\ufffd\ufffd.a \ufffdb \ufffdV\u0000.\ufffd|\ufffd\ufffd\u0367\ufffd;\ufffd\u0018\ufffd\ufffd\u0016\ufffd\ufffdYi\u0003\ufffd\u019a\ufffd\u001b\ufffdE\ufffdH\u06ed%\ufffd\ufffd\ufffdY\u001c#<\ufffd\ufffdKw\ufffdi\ufffd\u069a\ufffd\ufffd,\ufffd\ufffd9\ufffd`\ufffd\ufffd\ufffd\ufffdO\u001e\ufffd\u001ed7>\u0207\ufffd\u0017\u0016\ufffdM\u0334D\ufffdW\u0017&\ufffd\u0015\u0014\ufffd\ufffdZ\ufffdF&\ufffd\u0018\ufffd\u000b'\u03dc~\u03b6\ufffd\ufffdv\ufffdS7\ufffd\ufffd\ufffd'U\ufffdPhM\ufffd\ufffd\ufffd\uaebc\ufffd\ufffd\ufffdJ\ufffd\ufffd\ufffdoL\u001e\ufffd\ufffd~W\ufffd4\ufffd\u001c\ufffdSx\u0011\ufffd\ufffd\n\ufffd\ufffd>\ufffd\ufffd\ufffdo\ufffd\ufffd \ufffd\ufffdqjr4\ufffd^\ufffd\ufffdX\ufffdi\ufffd\ufffd\ufffd~n\ufffdO\ufffd\u02dc\ufffd1Z\ufffdI\u0016i\ufffd\ufffdN\ufffd0\ufffd\u03db\ufffd\ufffd\ufffd\u001d`s\ufffd\ufffd\ufffd-\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\rY9ja\ufffd'\ufffd\""\ufffd\ufffd(\ufffd\ufffd2\ufffd^\ufffd\ufffd\ufffdwDY2\ufffd\ufffd\u0012u\ufffd\ufffd\ufffd:MB\ufffdS\u0308\u0578\u0197\ufffd$\ufffd\u001db\ufffdV.\ufffd\ufffd\u0014o\ufffdF\ufffdR\ufffdS\ufffdf\r\ufffd\ufffd\u00185r9\ufffd\b\ufffd\u000e_u\ufffdO\ufffd\u0018\u0005\ufffdZ\ufffd\ufffdd\ufffd\ufffd)\ufffdw\ufffd\ufffd\ufffd'\ufffd\u0014(\ufffd\ufffd\ufffd:\ufffdh'\u0017\ufffd\ufffd\ufffd\ufffdm\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdj!\ufffd\u000e\ufffd\ufffdw\ufffdV\n\ufffd\ufffd|\f\ufffd\u0007d\ufffdj\ufffdb\u0014\u007f{<\ufffd\ufffd\ufffd\ufffd&\ufffd\ufffd9c\ufffd\ufffdmc\ufffd\ufffd&$\ufffdZ+\ufffdS\ufffdj\ufffd\ufffdf\ufffdX\ufffd\u000f9\ufffd\ufffd\ufffd\ufffd8\ufffd:65\ufffdV\ufffd\ufffd\ufffd5\ufffdd*\ufffd\ufffd8;7\ufffd\u1131u\ufffd33\ufffd\ufffd8\ufffdR\ufffd\u0010\u0004\ufffdF949\u0153\ufffdQls\ufffd\u0270%g\ufffd8\ufffd\ufffd\ufffdpo\ufffd\u001d\ufffd\r\ufffdm\ufffd\t`\ufffd\ufffd\u0002>]\ufffd\ufffd\ufffd\ufffd\u0013\ufffd\ufffd\u0016G\ufffd\ufffd\r\ufffd\ufffd\u001ew\ufffd\ufffd\ufffdQ\ufffd\ufffd\ufffd(\ufffd_\ufffdv+\ufffd}\u0019\ufffd\u0006/\ufffd(\ufffd\u001a\ufffdY\ufffd\ufffdKp\ufffdUV\ufffd=\ufffdc\u0578rr\ufffd\ufffd\ufffd\ufffd\ufffd(\ufffd=F\ufffd\ufffd\ufffd\u0007\u0012\ufffd\ufffd\ufffd\u001e\u001f\ufffd\u000e\u076f\u052ad\ufffd\ufffd\u0140V\ufffd\u0015\ufffd2\ufffd*J\ufffd\u0019\ufffd \ufffd\u0005\u000f\ufffd\ufffdX \u001d\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\b\u0016\ufffd\ufffd{\ufffdr\ufffdm\ufffd\ufffd\u0016;\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffd76ax>\ufffd\ufffd\ufffd^\ufffd\ufffd\ufffd\ufffd&\ufffd\ufffd\ufffd(\ufffd\ufffd\ufffd{\ufffd\ufffd\f\ufffd\ufffdR\ufffd\ufffd\ufffd\ufffd\ufffd~\ufffdb}\u0019\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0126\ufffdI\u0019\ufffd\ufffd\u0004ubQff\ufffd]\ufffds\u0014\ufffdz\n\ufffdz\ufffd\ufffd\ufffd\ufffdZ\ufffd\ufffdqK\ufffdz\ufffd0\ufffdj~\ufffd!\u001a\ufffd\ufffd\ufffd6\ufffdX\ufffd\ufffd\u0017\r\u0006\u0011\ufffd\ufffdB\ufffdB\ufffd\ufffdv\ufffd\u0006\ufffd\ufffd\ufffd\u000bF0\u0007A\ufffd\ufffd\ufffd%\ufffd\fr0\ufffd\ufffdh\u0011\ufffd7\ufffd\ufffd\ufffd\u0317X\ufffdZ\ufffd\ufffdxn\ufffd\u03ac\ufffds\u07d5ysJK\ufffd\ufffd\ufffd4\b\ufffd\ufffd\ufffdwbK\u0003\ufffdR\ufffdW0\u001bq\ufffdk\ufffdE\ufffd+\ufffdU\ufffd\u0011\ufffd\ufffd\n\ufffdB\u0012\ufffd\ufffd']n\ufffdL4M\u0108\ufffd\ufffd\ufffdA\ufffdp\ufffdA\u000f{R\u0005\ufffd\ufffd\ufffd-\ufffd\ufffdjKr\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\u0672D1\u02e6\u0019:A\u001d\ufffdJ\ufffd%[TxLg\ufffd\ty\ufffd\ufffd\u00c7\u0007\ufffd\u0001\ufffd\ufffd\u001c\ufffd\u0014\ufffd\ufffd\t?\ufffdY,\u063bi\ufffd\ufffde-\ufffdq\u0010\r\ufffd\ufffd\f\u0011\u00f3\ufffd\ufffd\ufffd\u000f\ufffd\u0006\ufffd\u02a0q\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0019bT \ufffd#\u0128}U\ufffdRu\ufffd#\ufffd\ufffd>tJI\ufffd\ufffd{%\u000e}a\u001f7\ufffdW>\ufffd\""\ufffdA\u0014\ufffd\ufffd\ufffd\ufffd\ufffdl\ufffdy\ufffd\u0013\ufffd\u0018\u001b.{\ufffdL\ufffdY-9\ufffd\u01ee\ufffd\ufffd?s\ufffd7\ufffdi\u001dF%\u001ew\ufffd2Y.$\ufffd\ufffd/V\ufffd\ufffd\u07f9\r\ufffd:m?\ufffd~[\ufffdl<\ufffdWT\f\ue4ce\u000e\ufffd\u000f\u000bx\ufffd\ufffdxX\ufffd\u01b8\ufffd4m\ufffd\ufffd\ufffd\ufffd\ufffd.p\u0018\ufffd\ufffd\ufffd\ufffdJAe\ufffdrV\ufffd1\ufffd\ufffdL\ufffd\ufffd+\ufffd\ufffdF\ufffdLP\u001bu\ufffd\ufffd[\ufffd0gz\u0012\\\ufffd&e\ufffdL!p\ufffdJ\ufffd\ufffd^L\u0007\u0010n\ufffd\u0019\u001a\u000fu;p\ufffd~wO\ufffd\u001b\ufffd\u0000\ufffd\ufffd~\ufffd@\ufffds\u3d89b)\ufffd\ufffdV\ufffd\ufffd%f\ufffd\ufffd\ufffd\ufffd1\ufffd\ufffd\ufffd>\ufffd\\\ufffd\ufffd|v\ufffd\u0019`\ufffd\u0005p\ufffd\ufffd\ufffd\ufffd\ufffd\u4606\ufffd\ufffd\ufffd38\u0006\ufffd\ufffdE\ufffd\u0019\f\u03ea\ufffd`\ufffd\ufffd_\u0256\ufffdp\ufffdBk\ufffd\f\ufffdX\ufffdh\ufffd\u0098\u0010\ufffdi\ufffd\ufffdLstjyZYKe\ufffd^\ufffd\ufffd-K\ufffd\ufffd.\ufffd{\u02a4\ufffd\u001b\u0017\ufffd%T\ufffd\ufffd\ufffdq\ufffd\ufffd\b\u001foOK\u042a\ufffd2S\\\ufffd)\ufffd\u0187\ufffdS|\ufffd6{\ufffd+\ufffd&\ufffd\ufffdq\u0019\ufffd1v\ufffd\ufffd,&Y\u04e6wO\ufffdm]\ufffdUu\ufffd.>\u001dG\\5\u0014\u0012\ufffd\ufffd\u0011\ufffd@\ufffd\u000e(\ufffd_\ufffd\ufffdg\ufffd\ufffdfT\ufffd\u0358\ufffdV)\u0018\ufffd\ufffd,\ufffd\ufffd\ufffd\u026d\ufffdU3\ufffd[u\u03f8h\ufffd\ufffd+a?\ufffd\ufffd{\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffds\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdml\ufffdH\ufffd\u001e\u0013\u03834\u0001\ufffd\u0001\u00166\ufffd\ufffd\ufffd\ufffd\u001csT\ufffd\ufffdS\ufffdbxI\u0447#v\ufffd\u0019^g#\ufffd\ufffdM\ufffd\ufffd!\b\u05cd?e\ufffd\ufffd\ufffd\ufffdc\ufffd\u0018\u0538S\ufffd\ufffd\u036d_<\ufffdxV\ufffd\ufffd=\ufffd\ufffdz\ufffd1Z#\ufffdk\ufffd\ufffd\u0013\ufffdZ\u018a\ufffd\ufffd*o\ufffd\ufffd\ufffdZ\ufffdV%\ufffd\u000f@\ufffdqsV\ufffd\ufffd\u06f8 \ufffd^~li\u0172iY\u001b\u001b.Y1\ufffdb\ufffd\u001bL\ufffd\ufffdx1J\ufffd(&\ufffd\ufffdk23'\ufffd\ufffdTV\ufffd\u04d1bQ&\ufffd\ufffdd$\ufffd\u034a\u0017\u0762\ufffd\ufffdq\ufffd&Y\ufffd1nW|\u05ac\ufffdS\u02d7L/5\ufffd\ufffd\ufffd\ufffd\ufffd\u063e\ufffd\b\ufffde\ufffd\ufffd,\ufffd\u0000/\ufffd\u0006\ufffdI\ufffd~\ufffdc{\ufffdL\u0006\ufffd\ufffd\ufffd\ufffd^k\ufffd)i\ufffd\u05d6\ufffd\ufffdu\ufffdi\ufffd\ufffdU6W:)\ufffd\u01d0\ufffdRi\ufffd\ufffd\u0014`\ufffdM\ufffd\ufffd\u5c8c\u001cqF\ufffd\u000f\u0017^\ufffdx0\ufffd\ufffd\ufffd\ufffd$Y\ufffd5j\ufffd\u0391\ufffdI\u0273k\u0007\u000f\ufffd\ufffdMJ\ufffd.\ufffd\ufffdmR$\ufffdV\ufffdNJ7n1\ufffd\r\ufffd\ufffdC\u001b\ufffd\ufffd\ufffd\ufffd\ufffd\u01c77\ufffd\u01d5qY)b\ufffd7\ufffd\ufffd?\ufffd>\ufffd(tQ\ufffd\u001f_\ufffd\ufffdo\u001b<\ufffd=\u0005!\u00106\ufffdw<\ufffd\ufffd1|\ufffd\ufffdi\ufffdi\ufffd:\u001b\ufffd\rV\u0409\ufffd\ufffd\u0014\ufffd\ufffd\u024b\ufffd\ufffd\u00f3Zpi\ufffd\u00013X\ufffd\ufffd\u001f\ufffd?@\u0007_)\ufffdl\t\ufffd\u0014p\ufffd/\u0002.\ufffd\ufffd3\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdX\ufffd`\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdJ\ufffd\u001a\ufffdZ\ufffd\ufffdz*\ufffdW\ufffd\ufffd\ufffd\u0012\ufffd-\ufffdd\ufffd\ufffd\u02b0\ufffd\ufffd\ufffd\ufffdL5\ufffd\ufffdb\ufffd&:&9\ufffdn^6f\ufffd\ufffd\ufffd\ufffd\u028d\ufffd8kQ\ufffd\ufffd\u0013\ufffd\ufffdM\ufffdM(j(\u025b\\\ufffd \ufffd\u000b\ufffd\ufffd|a\ufffdK\ufffd\ufffd\ufffd,/\u001a\ufffd\ufffd\u0017\ufffdZ/\u0108-\ufffd\ufffd\ufffday\n\ufffdC-\ufffd\ufffdK\u001f\ufffd{\ufffdv]B\ufffd\ufffd\ufffd\ufffd\ufffd)\ufffdp\ufffd\ufffd\ufffdVR\""Oa?\ufffd\ufffdn\ufffd\ufffd\ufffd&\fo\ufffd?\ufffd\u0013\u0017z\ufffd\ufffd^\ufffd\ufffd)co\ufffd\ufffd\u0447\u0002\ufffd\ufffd\ufffd\ufffd\ufffd\fo\ufffd\ufffd\ufffd5w\ufffdh9\u007fQe\ufffd\ufffd\ufffdqZ\ufffd\uad06\ufffd\ufffdh\r\u06f94\ufffd\ufffd\ufffd\ufffdftOJ\ufffdb\ufffdk\ufffdg-\ufffdt^\ufffd\ufffd\u000f1Y\u0579\ufffd\ufffd1y\ufffd\ufffd\ufffd\ufffd\ufffdy\ufffd\ufffd\ufffd[ZoZU\ufffd>uE\uf373\ufffd\u073c\ufffd\ufffd\ufffd>\ufffd!*\u0693\ufffdH\ufffd\ufffd\ufffd\ufffdqK\u03ddlH\ufffd\ufffd\u0017/\ufffd\ufffd\ufffddFa\ufffd&*\ufffdp\ufffdE\u01f8\\\ufffd\u001a0\ufffd9!\ufffd\u0014i'\ufffd\ufffd\u0000\u0013\ufffd\ufffd6\ufffd\""\u0016?\u057c\ufffd\rb\ufffd\ufffd\ufffd\ufffd\ufffdm\t-\ufffdVvX\ufffdg\ufffd\ufffd\ufffd\ufffd\ufffdF\ufffd\ufffd\ufffd\u0013\u001eO\ufffd\u0018\ufffd\ufffd&\u0005\u0010\ufffd\u008fUC\ufffd\u0014\ufffd\ufffdEiEc\ufffd*\ufffd\ufffd\ufffd\ufffd\ufffd\u0004-\ufffdF\ufffd?\ufffd\ufffdJ\ufffd\ufffd\u012c\ufffd\ufffd\ufffd\u001f]\ufffd\ufffdW\ufffd2\u015b\ufffd\ufffdt\ufffd\f\ufffd\ufffd1\u02b8L\ufffd/l\ufffdb,\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\bj`\ufffd.\ufffd\ufffd\u001d\u0010\u0003i|\ufffd\ufffdx9\u000f\ufffd8\ufffdk\ufffd\ufffd\u007ff\ufffd\ufffd\ufffd\ufffd\u0396\ufffd\ufffd{\ufffdE\ufffd\ufffd4\ufffd\u0352\ufffd\\d[.\ufffd,w\ufffd\u00007\ufffd\u0001\u06f4@\ufffd\u0010B\b\u0010H\b$t\u001b7\ufffdy\ufffd\ufffd\r\ufffd\ufffd@>\ufffd\ufffd\ufffdM\ufffd\u0012r\ufffd}7\t\\\ufffdHr\ufffd\u001c\ufffdz\ufffd\ufffd\ufffd,\u000bcSr\u001f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd9\ufffds\ufffdo\ufffd\ufffd1n\ufffd\u0016~\ufffd\ufffd\ufffd\ufffd\ufffd0q\ufffd\ufffdS\ufffd\ufffdt\ufffd8\ufffdd\u0013\ufffd\ufffd\ufffd)\ufffd;\ufffd0uB\ufffd\u0012\u001c\u0010\ufffd\ufffd\ufffd\u0405\ufffd,\u001f#j\ufffdX\ufffd\ufffd\u0000j\ufffdHPZ\ufffd\ufffdr\u001a\ufffdL~\ufffd\ufffdi9\u021a\ufffd\u001f\ufffdv\u001f\u077e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdP\ufffd\ufffd\ufffd\ufffd\ufffdM\u001b\u001e\ufffdH\u064bC\ufffd\ufffd\ufffd6O\ufffd\ufffd\ufffdC\u02f8hG\ufffdw\ufffd\ufffdR\u0018\ufffd\u017a\u0013\ufffd\rkWm\u0000K\ufffd\ufffd:\u0016\u000f\u000e_\ufffd \ufffdj\ufffd\ufffdi\ufffd\ufffd\ufffd\ufffd\ufffd]7\ufffd\ufffd\ufffd\\\u065e]6\ufffd\ufffd\ufffd\ufffd\u001a^\ufffd\ufffd\ufffd\ufffd\ufffdks\ufffd1ch\ufffd\ufffd\ufffd\r\u0654\u0658\ufffd5\ufffd\ufffd\ufffd\u0006\ufffd\u007fv\ufffd\ufffd\ufffd\u000b\u0018\ufffd\u0013X\u000bV\u007f\u051a\ufffdny\u001c\ufffdi\ufffd\ufffd4\ufffd44\u0014\u000f\ufffd\ufffd\ufffd\ufffd{FP\u001cn>*]5\ufffd=\ufffd{\ufffdw\ufffd\ufffd\ufffd\ufffd|\ufffd\n/\ufffd\ufffds\ufffd/4\ufffd\ufffd\ufffdN\ufffd\t/\ufffd\ufffd\ufffd\ufffdz\ufffd$\u0015\ufffd\u0017\ufffdGv\ufffd\ufffd\u0004\ufffd\fn\ufffd{,\u0638\ufffd\u8383ON\u0004\ufffd\u007f7\ufffdzS\u026e\ufffd\ufffd\ufffd\ufffd'J\u001b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd]W\ufffd\ufffd\ufffd=\ufffd\ufffdA\ufffdjT\r\ufffdn\ufffdMZ*7q\ufffd\ufffd\ufffd\ufffd\ufffd[\ufffd|\ufffd\ufffd+7\ufffd\u0001\ufffd\ufffdq8\ufffd\ufffd\ufffd2\ufffd\ufffd\ufffd\ufffdA\u001fxk6\ufffd<+P\u02b3\u0002\ufffd\\U\ufffd\ufffd\ufffd?!\ufffd\u0010oe\ufffd\u001d\ufffd\ufffd#k\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdc\ufffd\ufffdWM\ufffd\ufffd.\u04db\ufffd\u0531y\ufffd\ufffdpn\ufffd\u000f\uf054\ufffd\ufffd]\ufffd}\u0001\ufffd\ufffd\r\ufffd\u0007\u0016G\ufffd\u000b\ufffd[\b\ufffd\ufffd\ufffd\u0002D)_\ufffdNzD\ufffd\ufffd\ufffd=\ufffd<\u0016\u011f\ufffd\u0019\ufffd\ufffd*\ufffd\u0017f\u0428\ufffdK\ufffd,2\u007f\u0015\u0006\ufffd\u0017\u0004\ufffdW\ufffd\u0003\ufffd\u000e\ufffd\u001c\u000eH\ufffd/\u0002/\ufffd\u0010\ufffd\ufffdH\u0014\ufffd\ufffd\\\u000e\ufffd\u007f\ufffd\u0018~\ufffd\ufffd7\ufffdVV\ufffd\ufffdh\n\ufffd\ufffd\ufffdo\ufffd\ufffd\r\ufffd\ufffd\ufffd\u179a\ufffd\ufffdQ\ufffdNh\ufffd)\ufffd5;\u0014b6\ufffd3\ufffd9Fz\u001c\ufffd:\ufffd\ufffd;\ufffdS\n\ufffd\u001f\ufffd3\ufffd\ufffdu\ufffd\bmZ\u011a\u0011\ufffd\ufffd\ufffdd\ufffd\r\ufffd\ufffd\ufffdK\u0002\ufffd\ufffd`v\ufffdA\ufffd\ufffd:\ufffd\ufffd%\ufffde\ufffd\ufffdl\ufffd\ufffd\ufffd\ufffd1\ufffd2@3\ufffd\ufffd)D\ufffd\ufffd<\ufffd\u0018\ufffds\u0006\u03a1\ufffdKTF\ufffd\u001f\ufffdaR\ufffd\ufffd\ufffd[\u0691PB\ufffd\ufffd(M]\u0013{\ufffd\ufffd\ufffd+\u0013\ufffd\ufffd\ufffdc'\ufffd\ufffdI\ufffd\ufffd\ufffda\ufffdD_s\ufffd\ufffd\ufffdnqYP\ufffd\ufffd\u000b\ufffd<\u000e.\u0437\ufffd3\ufffdz\ufffd\ufffd\ufffd*\ufffd,\ufffd\u001cs\u0012\ufffd\ufffdbl\ufffdy,\ufffd\ufffd\ufffdW\ufffd\u000f\ufffd\ufffdy_\u007f\ufffd\ufffd'h3zf\u0004\ufffd\ufffd!\ufffd\u001e\ufffd\ufffd\ufffdr\b_\ufffd\ufffd#\b_\u001c\u000eq\ufffd2\u0001p.\ufffdb3\u0018\u0013\ufffd\u0014\ufffd\ufffd>%\ufffd\ufffd\ufffd98\ufffd\ufffd\ufffd\ufffd\ufffdz\u0016\u0002\ufffdJE&\ufffdM6\ufffdG\ufffd\ufffd\ufffd\ufffd\ufffd[\ufffdj\nB\u0012]\ufffdt\u001f:\ufffd\ufffd\ufffdia\ufffd\ufffd\ufffdq\u0004/d\ufffduekqE\ufffd\ufffd\ufffdOv\u0017W\ufffd\u0004tYSE\ufffd\ufffd\ufffd\u0777\ufffd\ufffd-\ufffd\u0017\ufffd?\ufffd\ufffd\ufffd\ufffd\r\ufffd\ufffd\ufffd3Y\ufffd\ufffd6Z\r\ufffd\ufffd\u0000\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdyt!\ufffd\ufffd\ufffd#\ufffd\u001c\ufffd\ufffd\ufffd\r\ufffd.\u0019\ufffd\u000b\ufffd\ufffdJ\ufffd\ufffdy\ufffdg\ufffd\ufffdS\f\u0787\ufffd\ufffdp\ufffd\u0014\ufffd\ufffdq\ufffdb\ufffd\ufffd/\ufffd\ufffdc\ufffd\ufffd\ufffd<\ufffd\ufffd\u0005Ic(\ufffd\u0010T\ufffd\ufffdw+\""\ufffdI$\u013e\ufffd\ufffd\ufffdQ\ufffd\ufffdW\ufffd\u0007\u001f\ufffd+\ufffd\\3\ufffd&4\ufffd\u0690\ufffd\ufffd\ufffd\ufffd\ufffdP\ufffd\u0185\ufffd\ufffd\ufffd \ufffdb\ufffd\u061bc\ufffd\u0019\u0012\u001a\u000b\ufffdO\ufffd\ufffdg\ufffd\u007f\ufffd\u001b\ufffd\b\u000f\ufffdat\u000e`I>\u000e`\ufffdQ\ufffd\ufffd-Kn\u001co\ufffd\ufffdL\ufffd\u007f\ufcfb|}-1\u0006V\u0002\u0004\ufffdg\ufffd\\wbpk\ufffd\u0003pu\ufffd\ufffd\ufffd\ufffd\ufffdFC\ufffd:\ufffd\u0012\ufffd\ufffd2\t\ufffd!\ufffd\u0019\ufffd\ufffd\ufffd\f\ufffd\ufffd\ufffd7v\ufffd\ufffdF,9\ufffdV\ufffd4\u0016\ufffd=\ufffd'\ufffd*\ufffd\ufffd\ufffd\ufffdy\u0002dM|~k\ufffd/kF\ufffd\ufffd\ufffd\u0011\ufffd\ufffdq\u0018\ufffdz\u0010\ufffd\ufffd\ufffd'\ufffd\u0015\ufffd\ufffd5\ufffd,\u001d\ufffd\ufffd\ufffd\ufffda:\ufffd\u001aQ\ufffd\ufffdR\ufffd\u0015\ufffd\u0011d\ufffd\ufffd$\ufffd+I!c-D\ufffd\ufffd\ufffd6Zq\u0019\ufffd\ufffd\ufffd\ufffdu:NK\u0000\ufffd\ufffd\ufffd\u0018b\ufffdK\ufffd,\u0002,\u0002k\u0010\ufffd\u0005\ufffdU\u001eVs\ufffd\ufffd\ufffdtO\ufffd|\u0012\ufffdE7H\ufffd\ufffd\bp\u0015^@\ufffd\u0005\ufffd\ufffd\ufffd8\u000fC`-S\ufffd\r\ufffd\ufffdl\ufffd8Z[\ufffd(\ufffd0^n\u001cm\u0017\u05b1\u001d)[g\ufffdc\u0015\ufffd\ufffd*\ufffd\ufffd`\u0019\ufffd\u0015\ufffd[\ufffd\n\ufffd-@\ufffd\fd< E@\ufffd\t$\u001d@\ufffd\u000e$m@\ufffd\u0007\ufffd\u001c\ufffdd\ufffd$\u0003$i \ufffd\u0001y\u0014\ufffd#@\u001e\u0006\ufffd\u0010\ufffd8\u0001\ufffd\u0000\nx\ufffd\f\ufffd\ufffd.\ufffd\ufffdS\ufffd\ufffd9\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\u0462\u0010\u0002.\ufffd\ufffdo4\ufffd<\ufffd\ufffd\u01f6\u0016\ufffd\u036b .\u0016m\ufffd\ufffd_\u07f4\ufffd\ufffd\u0000qqe\ufffd\ufffd\ufffdKm\ufffd)<2\ufffd\ufffdt$\ufffd\ufffd\u06cc\u0641l\ufffd#\ufffd_31\ufffd\n,]|\ufffddd\ufffd\ufffd\ufffd\n06\ufffd-\ufffd\ufffd\ufffd\u001fK\ufffdF\ufffd\ua30f\u000etZ\u0005`lp\u0017\ufffdZ\ufffd\ufffd\ufffd\ufffd)<~\ue937!\ufffd2\u0019Sy\ufffd\ufffd#(.\ufffd\ufffd(xF`\ufffd6\ufffdU`\u01a7*\ufffd8\ufffd_\u007f\u072b\ufffd\u0018r\ufffd\u0001\u000f\ufffd<\ufffdG\ufffd\u0000\ufffd\ufffd\ufffd\u0708\ufffdO\ufffd{\ufffdc\ufffd\u064dZ\ufffd\ufffdC\ufffduF\u0015\ufffd\ufffd\ufffd\u061e\ufffd\ufffd\ufffd\ufffd^\u0006C;\ufffd\ufffd\ufffd\ufffd+\ufffd\\x\uc191\ufffdw.\t\u0016\ufffd?\ufffdu\ufffdM\ufffd\ufffd\ufffdL\ufffd\u001f\ufffdDW\""\ufffd\u0016\ufffd4\ufffd\ufffd\ufffd=\ufffd\ufffd\ufffd\ufffd\ufffd?Q\ufffdG\ufffd>l\ufffd\ufffd\ufffd$\ufffd2\r\ufffd7u[\ufffd\ufffd\ufffd\ufffd\ufffdV=\ufffd\ufffd%\ufffd\u007f\ufffd-_In\ufffdc\ufffd\ufffdY\u001aJ\ufffd\u0006\ufffd&9k@w\ufffdx\ufffdw\""\ufffdl\ufffd|D \ufffdG\u0004\ufffd\ufffd=\ufffdLB\ufffd\ufffd\u001d\u0015\ufffd\ufffdD}.Ki\ufffd\u000b\ufffd\ufffdp|k\ufffda\ufffd\ufffd\ufffd\ufffd;\ufffd%]\ufffd\ufffd=?\ufffd\ufffd\r\u0014,\ufffd\ufffd\ufffdTv0o\ufffdM\u0007\u007f|\ufffd\ufffd\ufffds?\u05d6\ufffdiN\u0012\ufffdDM\ufffd\ufffdG%kkD\ufffd\u065a\\\u001c|k\ufffd\ufffd\ufffdm\ufffd\ufffd\ufffdR\ufffd\u02a4{9\ufffd\ufffdcXW\u059d\ufffd_\u001fT\ufffd\u00142\u0011.\ufffdk\u001b\u0017m\ufffd[z\ufffdh\ufffd\u063cc\ufffd\u0001\ufffd\r\ufffdn\ufffd\ufffdgPHuA\ufffd3\u0011\ufffdh^L\r\ufffd\u0015M\u01b0\ufffd5\u068c\ufffd\u0015]Z\ufffdN\ufffdq\u06b4\ufffd\ufffdu\r\ufffdU\ufffd\ufffd\u000f]\ufffd\ufffdw\ufffd7\ufffd\u000e\ufffd\u0001\ufffdt1v\u0015\ufffd\ufffdG?\u0105?E\\x\u001a\ufffd\ufffdzL\u000e\n<\ufffd\ufffdQ\ufffdP=^\ufffd\u05b3\b\u0013\u057c\nr\ufffd*\u0007\ufffd\ufffd\u0000\b\u0015'\ufffd)\ufffd\ufffd\ufffd\u000e\ufffd)c\ufffdfz]c\u0017mv\ufffd\u03cc\ufffd\u001dm\ufffd\ufffd\ufffd\ufffd8\u0793\ufffd4A\ufffdh\ufffd\u07f0\ufffd.\u07992\ufffd\ufffd\u00165N\ufffd \ufffdfT\ufffd\ufffd])\u0013\ufffd\ufffd\ufffd\u0012\ufffd|D.!\ufffd\t\ufffd$\ufffd\u001f\ufffd\ufffd\u000f\\\ufffd8jJuEQ#\u0016\ufffdG\ufffd\r\u0007i\ufffd\ufffdU\ufffd\u0002\ufffd\ufffd]g\ufffdi\ufffd\u0019\ufffd3\ufffd\ufffdH\ufffd\u001e\ufffd\u066d\ufffd\ufffdY;4\ufffd\ufffdh3\ufffd\fc\ufffd\ufffd8Ve\ufffdj]\ufffdk\u0692C\ufffdq\ufffd\ufffd\ufffd\ufffd\u0011\ufffd\ufffd\ufffd\ufffd? g\ufffd\ufffd\b\ufffd1\ufffd\ufffd\u0012Nf\n_\u007f\ufffd/\u0016c\ufffd)\ufffdo\ufffd8\ufffd91\u0005X\ufffd\u0014E\ufffd\ufffdn\ufffdk\ufffdu\ufffd\ufffd\u0004F}D\ufffd\ufffdy\u0011\\\ufffd\u0017m\ufffd\u0000\ufffdG\ufffd\ufffd\ufffd\nk\u008d\ufffdu\ufffdNFKK\ufffd\ufffdS\ufffd]a\ufffd\ufffd\ufffd3\ufffd!\ufffdz\ufffdR.)O\ufffd\ufffd_\u0002\u000fhL&^\""\ufffdh\ufffd$_\ufffd\u0018\ufffd>s\ufffd\ufffd\ufffd@Ymb\ufffdb\ufffdC\ufffd\ufffd'\ufffd{qe\ufffd\ufffd\ufffd\u00ca\ufffdw\ufffd\ufffd\ufffd`\ufffd=\ufffd\ufffdE\ufffd\tw\ufffd0\ufffd\ufffdB\ufffd\ufffdLG\ufffd\u0005\ufffd\ufffd\ufffd\ufffdA'\ufffdo\u0003\ufffd\u069b\ufffd\ufffd,\ufffd\u001bk\ufffd\ufffd\u0017\ufffdv\ufffd7\u0005\ufffd\ufffd\nzs\ufffd\ufffd\u000f\ufffd\ufffdhP\ufffd\u0002\u0006.\ufffdvi=\ufffde\ufffd5\u0012\ufffdA\u0000\b\u00059s\ufffd\ufffdrh:\ufffdc\u001d\ufffdF\ufffd\ufffd\ufffd2X\u0007\ufffd\u001b{\u0016\ufffd\ufffdqL\ufffd\u009a\ufffd7A\ufffd\ufffdT<\r\ufffd\ufffd\ufffdm\u0001\ufffd\t\ufffdG\u001a\ufffd4M\u0001\ufffdt\ufffde\ufffdF\ufffd\u045d1\ufffdt\u0006\u00078\ufffd\u001a\ufffd\ufffd@\ufffd\u00076\ufffd\u0016\ufffd\ufffdP-\ufffd\u069e\ufffd`\ufffd\ufffdd\ufffd\ufffdF\u0007\ufffddK-\ufffdE\ufffd/\f\ufffdo\ufffdol\ufffd\ufffd\ufffdM>\ufffd\u0003.\ufffd\ufffd\ufffdN\ufffd\ufffd\ufffd\ufffd\u0012\ufffd \ufffdT\ufffd\ufffd\ufffd\ufffdeyJ\ufffd\ufffd\ufffd\u001a\u0013k\ufffd\ufffdJF\u0019\ufffd(P\ufffd\ufffd\ufffd?t\ufffdx\ufffd\u0674d\u06cd\ufffd\ufffd\r\ufffd\ufffd\u0014m\ufffd\u031b'\ufffdXt\ufffdyx\ufffd\ufffd\ufffd\ufffd\ufffd)#\ufffd\u001b\u000e\u007f\u0010:\ufffd\u0003\ufffd\u000e\ufffd03H=\ufffdNz\ufffd@\ufffd\ufffd|#\ufffd\ufffd\u000e\u067a\ufffd\ufffdW\ufffd\ufffd\ufffd9\ufffd\ufffdc\ufffd\u0013\u000fn\ufffdq\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdW\ufffdG\ufffd]\ufffd\ufffd\ufffd\u000b\ufffd9i\ufffd\ufffd\ufffdGw\ufffds7\ufffd\ufffds\ufffd\u0201\u001f\ufffd1\ufffd\ufffd\ufffdWo\ufffdt\u06d03\ufffd\ufffd\ufffd\u2355#\ufffdM\ufffd!]\ufffd\u0018\\\ufffd(\ufffd\ufffd;ecY\u0320\ufffd\ufffdZ\ufffd\ufffdc\ufffd5\ufffdK\ufffd\ufffd\ufffd\u0004\u009dW\ufffddp\ufffd\u0016Y\ufffd\ufffd\u0016\u0019/&\ufffd\ufffds\ufffd\ufffdh\ufffd\ufffd\ufffd\ufffd)\ufffd\u00192\u0010\f\u0012\ufffd\ufffdi\ufffda\ufffd/b\ufffd~S\ufffd\ufffd\ufffdW\ufffd=z\ufffd\\\ufffd1\ufffd}\u001c\ufffd\ufffdXM\u0002.\ufffd\ufffd\u001c\u001c#\ufffdM\f\ufffd*\u0001\ufffd\ufffd\u0007O\ufffd\ufffd\u000f\ufffdr\u0007\ufffd5\ufffd@\ufffdJ\ufffd7\ufffd\ufffd\u07c7\ufffd\ufffd\ufffd\t\u007f\ufffd\ufffd\u0004\ufffd<\n#\ufffd\ufffdjo\ufffdT\ufffdl\ufffd\ufffdF\ufffd/P\ufffd\ufffdA\ufffd\ufffd|\u0017\ufffd'\ufffdJ\u007fd\ufffdV\ufffdRiIz<\t\ufffd\ufffd\u00021\u0000&14\ufffd)\ufffd\u01e2#\ufffd\ufffdN\ufffd\ufffd\ufffd\ufffd6\ufffdy\ufffd\ufffd\ufffdMwf\ufffd\ufffdtg)\u001dh\ufffd\ufffd\u0426@\u007fSTM\ufffd\u07ab\ufffdS\u8277-/Y\ufffd:^\ufffd\ufffd^z\ufffd'?\ufffd\ufffd\ufffd\ufffd\ufffd,\ufffdw+\ufffd\ufffd\u0005\ufffd}\ufffdz\ufffd\ni\ufffd2\ufffdp\ufffd\ufffd\ufffdC{\ufffd\ufffdH\ufffdZ\ufffd\ufffd9`\ufffd\ufffd\u0018*6ouV\ufffdU\ufffdCC\ufffd\ufffd\u0017\u073a\u001a\ufffd\ufffd\ufffd\u0003\ufffdA\ufffdY\ufffdx\ufffd\ufffdS\bh\u0005-\ufffd\ufffdC\u0011{\u0011\u05a0\ufffd\ufffd\u00ff\f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0004F\ufffdc\ufffd!a.8*^x\ufffd\ufffd\\w\u0011!\u02a1\ufffd\u001e\ufffd\ufffd\ufffd\u0745\ufffdC\ufffd=t\u02d9\u0745\ufffd\u001f\u001cMK\ufffd[\ufffd7X\ufffd\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd?=\ufffd\ufffd\ufffd\ufffd=\ufffd\ufffd\ufffdg\u01d6<\ufffd\u05ef(o:\ufffd9V\ufffd\ufffd\ufffd\ufffd\u0018-l\u007f\ufffd\ufffdD\u0011\u001b`\ufffdny\u001es\ufffdw\ufffdr=\ufffd\ufffd\u0014\ufffd!\ufffd\u0002$\ufffd\ufffd\ufffd\ufffd\ufffd{\ufffdE\ufffd\ufffdV0\ufffd\u0018\u0016m\u0014\ufffd\ufffdv$C\ufffd\ufffdzFv\ufffd\u0010\ufffd\u0000\ufffd\u0001XM\ufffd\u0002-\u0508\ufffd\ufffd\ufffd\ufffd?\ufffd\ufffd\ufffd\u0017\ufffd\ufffd'\ufffdB]\ufffdD_/\ufffd\ufffd\u00e8D\u001f=*\u0019\ufffd]\ufffd\ufffd\ufffdg\ufffd\ufffd\b\ufffd\u001bgM\ufffd\ufffd\ub5a10\ufffd\ufffd4\u0005s\ufffd[\ufffd\ufffd\ufffd\ufffd\ufffdq)\ufffdi\u001c\ufffd\u067e\ufffd\u0789\ufffd\ufffd\ufffd\ufffd\ufffd{\ufffd\u007f\ufffd\ufffd\ufffdFk\u0424\ufffd\ufffd#ng\ufffd\ufffd\u05bd\u07f1c\u0140\ufffdY\u001f1\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\u000f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffdu\u06df\ufffdv\ub24dacj\ufffd\u01355\ufffd\ufffdX\u000f#\u04b1\ufffdDJy\u0010\ufffd\u0003@\ufffd\u0007@\r\u0012\ufffd\u0015\ufffd\ufffdz|\u0002\u0010Xp\n\ufffd\ufffd\u0360`\ufffd\ufffd\u007fy\u0002\ufffddQ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\n(\ufffd*\ufffd\ufffd\u0016\fQ\ufffd!\ufffd\ufffdlF'\ufffd\ufffd\ufffd<\ufffd\ufffd\ufffd\ufffdy\u0015T\ufffde\u0007\ufffd\b\ufffd\ufffd\ufffd\u013fWI\ufffd\u000f\ufffd\u076d\ufffd\u01804\f$\u0016 U\u0001)\r$J\ufffd\u0010\u00a3\u0002\ufffdA\u0002Z^ \ufffd\ufffd\u0015\ufffd{\u0001\ufffdc\ufffd\ufffd\u001fy%\ufffdG\ufffd\u001c\ufffd\u000b\ufffd\ufffdC\ufffd\ufffd\ufffd\ufffdq^\u0000<\ufffd!*\ufffdx\ufffd\u00af@J\b\ufffd\ufffd<\ufffd\ufffd\ufffdI\ufffd\ufffd\ufffd\ufffd\u0019\ufffd\ufffd\u0001\u007f\u0018\ufffd,\ufffd\ufffd\u0002~\u001a\ufffd\ufffd\ufffd\""\ufffd$\\\ufffd\ufffd~\ufffd\ufffdZ^8o\u001f\ufffd\ufffd\ufffd\ufffd\u007fGr\ufffd\ufffd\u04b9\ufffd\ufffdH.$U\ufffd\ufffd.\ufffd!\ufffd\u0012Ow\ufffd\ufffd;Tz$\u0017z\u0012,\u0002W\ufffd\ufffd\ufffd\u051eRzGj\ufffd\ufffd\u001dq\ufffdK\ufffd\u007f\u001b\ufffd'\ufffd\u0003\ufffd\u001f\ufffd9\ufffd\u001f<\ufffdtE/\ufffd;\ufffd\ufffdhXi\ufffdGu\u007f\ufffds@\ufffd\ufffd \ufffd\ufffd uV&B/\ufffd\bJ\ba\u001d*\ufffd\ufffdXE\ufffd\ufffd.?\ufffd\\dP>\u0005\ufffdOi\f\ufffdm\f\ufffd\u001c\ufffd\\\u0018Qi\ufffd\ufffd\ufffdH7\u0013\ufffdA\ufffd\ufffd\u001e\u04c4r \ufffd\u0007\ufffd+\u0011\ufffd\ufffdgx\ufffd\u000b\ufffd\ufffdG\ufffd\ufffd\ufffd\u0005MyV\ufffd\t\u0004M\ufffd\ufffd\ufffd\u001f\ufffdVb\ufffdz\ufffd\ufffdhBrlCv\u0000\ufffdo\u0184\u0014M\ufffd\ufffd]\u0011\ufffd\ufffdPoU\ufffd\u0004\ufffd\ufffd\u0007XE;s\ufffd8-P\ufffd\u0003\ufffd\ufffdQ\u00031\u000b\u0014\ufffd\ufffd\ufffd8\u0001\ufffd\t\ufffd\n\u0013\ufffd\ufffd8\ufffd%]m}t\ufffdnh~S\ufffd\u0018+\ufffd\ufffd@\u0255\ufffd\tS\ufffdHW\ufffd\ufffd\ufffd\ufffd\ufffd;\ufffdWf\ufffdK\ufffd\ufffd\ufffd\ufffd4g\u0018\u0004\ufffd{)\ufffd\ufffdD\ufffd\ufffd\u0015\ufffd\ufffd\u0005\ufffd-e\u0010h\ufffdK\ufffd\ufffd\ufffd\ufffd\ufffd\r-R\ufffd\ufffd@\ufffd\ufffd\u0010\ufffdh;~G\ufffd\ufffdr\ufffd[5\u000em\ufffdj\ufffd\ufffd\u0000\u0012{\u001c>\ufffd\ufffd\u001eS\u0017(v\ufffd\ufffd\u0767\ufffd\ufffd\ufffd(\ufffd\u0014\b\u001cs8\ufffd\ufffd\ufffd)\ufffd\ufffdC\ufffd3~\u0004YH\ufffdp\ufffdZF\u0010y\ufffd\ufffd\n2\ufffdl\ufffdW\u001b|e\u001e=yM\u0098~\ufffd\ufffdy9zq\u055c\ufffd\f\ufffd\ufffd@\ufffdi\ufffd\ufffd\ufffd\u007f\ufffd\u0007\u0004u\ufffd\ufffdEL\u000b~\ufffd\ufffd1\ufffd7\ufffd\ufffd4>\ufffd\ufffdv?#\ufffdfv\ufffd\ufffd;\ufffdH\ufffd\ufffd\ufffd\ufffd\u007f\n/:8:v`\ufffd\u000b\ufffd\ufffd\ufffd\u001f\u0018\ufffd\ufffdX\ufffd\ufffd8\ufffd\ufffd\ufffd\ufffd\u0003\ufffd\u0000\ufffdy\u001b\ufffd\ufffd~l!\ufffdS\ufffd\u001fxeG\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0014\b\ufffd8\ufffd\u0017y\u000bF7<\ufffd\ufffd\u01ael\ufffd\ufffd\ufffdWm6q\ufffdn\ufffd\u0011\ufffd{\u001a9\ufffdy\u0019\ufffd9\ufffd\ufffd.\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd,\ufffd\ufffd\f\ufffdI\u0010\ufffd\ufffd\u06f2K\ufffdv\ufffdz\u000bN\ufffdT\ufffd+(\ufffd5Z\ufffd6\ufffd\ufffd\u0003\r\ufffd\u0006\u0005%#`\u0314\ufffd]\u001d\ufffd\ufffd\ufffd.b\ufffd)I\ufffd\u0010S\ufffd\ufffd\ufffdx\ufffdD\ufffd\ufffd\ufffd7\ufffd\u00167Y\ufffd\ufffd\u0006\ufffdB\ufffd\u0215\u001a\ufffd\ufffdn\ufffdY:\u0016\ufffdFJ\ufffdZ9\ufffd\ufffd\ufffd\ufffdc\ufffd\ufffd\ufffdS\ufffd\ufffd\ufffd\ufffd!)\ufffd\ufffd\ufffdfz\""\ufffd\ufffdj\ufffd\ufffd\ufffd\u001bP\u001cuO'\ufffd\u001f\ufffdm\ufffd\ufffd\ufffd\u0002\ufffdk\u0013\ufffd\ufffdx\ufffd\ufffd\u001bbOW\ufffdy\ufffd\u023d\u001f5\ufffd\ufffd(\ufffd\ufffd\ufffd\u0002~!\ufffd\ufffd\u000f\u0018j\u0015\ufffd\ufffd\tO\ufffd\ufffd\ufffd\u0003!D\ufffd\ufffde\u04bf\u0012jW\ufffd\u0013(8\ufffdU\nU\ufffd%\ufffd\ufffd\ufffd\u0019\ufffd\ufffd\ufffdk\ufffdz\ufffdX\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\u0012\ufffd&\ufffdI\ta\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd*\ufffdR/\ufffd\u0005o\ufffd\ufffd2\ufffd<\ufffd\u0007\ufffd\ufffdT+\ufffd?y\u0012\ufffd\ufffd\ufffd\ufffd\ufffdz\u0605\ufffd\ufffd\ufffd\u0016\ufffd\ufffd]\ufffd\u0233Z}\u0017\ufffd\ufffd3\u045d\ufffdg5\ufffd\ufffdj\ufffd\ufffd2`8\ufffd\ufffdS+\ufffdu\ufffd\u0014\ufffd\u0011|Kb\ufffd\ufffd^Ok\u07af\ufffd\ufffd\ufffd\ufffd\ufffd$RC\ufffd>\ufffd\ufffdz5\ufffd\ufffd\ufffd\ufffd\ufffd,ZFc\u0004\ufffd\ufffd\ufffd\u00101t\ufffd\u007fk\""\ufffd\ufffd\ufffd\u001d\ufffd\f\ufffd\ufffd\ufffd+S\ufffd(\ufffd5i\ufffdfVB1J\ufffd\u001c\ufffd\u0018\ufffd\u0006\ufffdT\ufffd\u0007\ufffd\u031cLc\ufffd\ufffd\ufffd\u001bps\ufffd\ufffd\u02a7\u0013x\ufffdg\ufffdo\ufffd0\u001e\ufffd\u001e\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffd\ufffd7<\ufffd\ufffd\ufffd\ufffdB!\ufffd\ufffd\ufffd\ufffd\ufffd7\ufffd\ufffdl\ufffd\ufffdnVX\ufffd\ufffd:Ew\ufffd\ufffd\u001d\ufffdLx`[\ufffd\ufffd]mF\ufffd%3\ufffds\u0418\u000e\ufffdi)R\ufffd\u024d\ufffd%\ufffd\u0012\u049aG2-+J\ufffd\ufffdz\ufffd\ufffdU0(\ufffd\u0001\ufffd\ufffdoTd\u001a':}ukn\ufffd\u001f^=>\ufffd\u0016\u0014\ufffd(\ufffd\ufffdl\ufffd\ufffd\ufffd0\ufffd\ufffd2\ufffd^\ufffd\ufffd\u45f5Y\ufffdf\ufffd\ufffd\ufffdu\ufffd\u056c5\u0000W7\u0006\ufffds+\\];\ufffd\u007f\u001eS\ufffd\ufffd\ufffdhR\ufffd_x9\ufffd#\ufffdgL;\u0015{/\ufffdH\ufffdB\b\ufffd\ufffd\u0010\ufffd\ufffd\ufffdY\u0011c\n\u0683I=!\u0001\ufffd\ufffd\u0019Z\ufffd\u01ad\ufffd,\u0152\u0012\ufffd{\ufffd\u0564\ufffd\u03fd&#%8,\ufffd\u0015x\ufffd/\ufffd\u067521\ufffd@\u04fa\u0012\ufffd\ufffds\ufffd\ufffdv,\ufffd\ufffd\ufffd\ufffd\u00171\u001f8\ufffd\ufffd0\u00078\u0293&\ufffd\u0564\ufffd_\ufffd\ufffdip\n&\ufffd<\ufffd\ufffd)Y8E\ufffd\u001f\ufffd\ufffd.>L\\s\ufffd\ufffd\ufffd\ufffd\ufffdA]n\u039c\ufffd\ufffdYs\ufffd\u000b\ufffdt\ufffds\u07fc\ufffds\ufffd`\ufffd\ufffd\u07d6p\ufffd\ufffd\ufffd[\ufffdz6w:[\ufffd:\ufffd~\ufffdL$\u0013\ufffd)h]\ufffd2\ufffd\ufffd\ufffd\ufffd3R\ufffdb}\ufffd\u0731]\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd/^p\ufffd\u0006\ufffd6s\ufffd;^\u001aszW\ufffd\ufffd\ufffd\ufffds\ufffd\ufffdF\u0003\u001d/\ufffd\ufffd\ufffd[\ufffd*\ufffd\ufffdbg\ufffd\u0001\u001f\ufffd\u001c\ufffd\ufffd\ufffd\ufffd}#\ufffdJ#%-8%hM\ufffd\ufffd\t\ufffd\ufffd\ufffdg\ufffd\u001e\ufffd\ufffd6|Cz\ufffd\u015e\ufffd\ufffd\ufffdhKr\u001f\ufffd\u0754\u0188Y \ufffd\ufffdGZ3#;\u0007\ufffd\ufffdI/\u00057\ufffd\ufffd\ufffdZ\ufffdEo\ufffd-\ufffd\ufffdiw fh[\ufffdh\ufffd\ufffd\ufffd9\ufffd\ufffd\ufffd\ufffd}@\ufffd\ufffdf\ufffd\ufffdH) a\ufffd\u000b?\ufffdL\ufffd\u001am\u000bH)FA\ufffdZ:\ufffdPP\ufffd=\ufffd\ue4e9(\ufffd\ufffdii]\ufffdN\u007fq\ufffd\u0361lWX\ufffd\ufffd\u0002zK\ufffdB\ufffd\ufffd]\u01a7\ufffd/~#\ufffd\ufffd\ufffdLp\\`\ufffd\ufffd\t\u001eb\ufffd\ufffd\u001f\u0016\ufffdp\ufffda\u0707\ufffd\ufffdFw\u03ce\ufffd\u0005\ufffd\ufffd,\ufffd\ufffd\u001d\ufffd\ufffd;ZL\u07e1\f\u0001\ufffd\u0011.\u0007\r\ufffd\ufffd\ufffd\u04d3\ufffd{\ufffd\ufffd%\ufffd\ufffd\ufffd5\ufffd\ufffd\ufffd\ufffd\ufffds\ufffd\ufffd\ufffd\ufffd\ufffd\u0012\ufffd.\u079bk\ufffd\u001fe\ufffd\ufffd\u078a*\u000b<\ufffd\ufffd\r\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffd\u04b3\ufffd)\u0000\u001a\ufffd\ufffd\u0017__\u001d\u018d}\ufffd4n\u0006\u000b\u001e\ufffd\ufffd\u0003v[\u0010b\ufffd\ufffd\ufffdD@\ufffd\ufffd\u001d\u0011)\ufffd\u000e\ufffd\u0363\u0011k\ufffdr\ufffd\ufffd!\u0010\ufffdG\u0005HVf#kP+\u012bq\u001c\u0007\ufffdX\""\ufffdW\ufffd\ufffd\u0006j\ufffd\ufffd\ufffd!5\ufffd\u0016\ufffd\ufffdDT\u0010EXP\ufffd\ufffd\ufffd\ufffd'\u0003\ufffd\ufffd\ufffd\ufffd\u0011X\u001c\ufffd\ufffd\ufffdi\ufffd'`\ufffdV%Un\ufffd\u0140\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd!\u0018\ufffd\ufffd\u0012~\ufffd\\,\ufffd\ufffd\ufffdL\ufffd\ufffd/\ufffd\u0004\ufffd*\u0515\u001f\u0004\u0012\ufffd\ufffd\ufffd9D\ufffd\u04ec6\ufffdt\ufffd+\ufffd\u0001\ufffdKc\ufffd\ufffdjF\ufffd\ufffd\ufffd\ufffdF\ufffdNC\ufffd\ufffd\u001d!{\ufffd\ufffd+\ufffd#\u0016p\ufffd\ufffd\ufffd\ufffd0\ufffd]\ufffdX\ufffd}^\ufffd\ufffd\ufffd\ufffd*z\ufffd\ufffd\ufffdo\ufffdo\u0017\ufffd\ufffdi\u000e3|\ufffd\ufffdr~\ufffd\ufffd\ufffd12\ufffdr\ufffd\ufffdT>\ufffdD\ufffdJ\ufffd\ufffdM:\ufffdA\ufffd\u0004\ufffd\""h\u000f\ufffd\u0014\ufffd\ufffd\ufffdm\ufffd\ufffd>q8\t\ufffd\ufffd\u0015\ufffd\t+ 2LBn\ufffdD<\u0011\ufffd<\u0005\ufffd\ufffd\u0015\u0018\ufffdF\u0006d\ufffdp\ufffd\u0006l\u00028$\ufffd\u0411\ufffd\ufffdM]\u0010\u000e\ufffd\u000f\u0007\ufffd\ufffd\ufffd^\ufffdp\ufffd\ufffd\u5bd1\ufffd\ufffd\ufffd\u001f\ufffd\ufffd]@\u000e\\\u0015\u001c\u0004\u007f\ufffd[C\u0003W\ufffdF:\ufffdvJ\ufffdK\ufffd\u0012\ufffd\ufffd_\bY#\u000e\ufffd\ufffd9\ufffdh\ufffd2Z=8\ufffd\ufffd\ufffdt\ufffd\ufffd\ua62a\ufffd\ufffd\ufffd\ufffdFz\ufffd\ufffd!S\u0414\ufffd\u000ew\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffd\ufffd\u0003RF\u0007\""\ufffd\ufffd\ufffd\u000f8\ufffd\u300b\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ufffd\fz?\ufffd\\}G\ufffd\ufffd)p\ufffd8\ufffdq$\\\ufffd\ufffd\u001b#\u007f\ufffd\u0000\ufffd\ufffdG\u0002/\u0007\ufffd\b\u0010\ufffd\ufffd\ufffd\ufffd\ufffde\u0007\ufffd8\ufffd\ufffd?Sx\ufffd\ufffd\u0017\ufffd\ufffd)\ufffd\ufffd\u068d~\ufffd\""\ufffd\ufffd\ufffd\b\ufffdl\ufffdX\u0016\ufffdl\ufffd\ufffd\ufffd\ufffd\ufffd\u007fh\ufffd>\u0019\ufffdS\""\ufffd\ufffd\ufffd2\ufffd\u001e\ufffd\ufffd\ufffd=*Sw\ufffdqA\ufffd\ufffd\u001dgH\u001f\ufffd+t\u000e\ufffd\u03ae%\u007f\ufffdZ\ufffd\ufffd\n\u033f\ufffd\ufffd\ufffd\ufffd\ufffdub\ufffdB\ufffd\ufffd&Z\f\re\f\ufffd\u04748\ufffd_\ufffd\ufffd\ufffdT\ufffd\ufffd\ufffd*\ufffd\ufffdJ=u\u0016/\ufffd5\ufffdV\ufffd\ufffd/UE\ufffd\u000f\u0443X\ufffdU\ufffd>\ufffd\ufffd\u0017\ufffd\u0007\ufffdJ\u000f\ufffd\u065f\ufffdR\ufffdE\ufffd\ufffd]\ufffd6\u0005m\u1511\u0010O\ufffd\ufffd\ufffdR\ufffdJ\ufffds\ufffd\ufffd\u0014\ufffd-\ufffd\ufffd\ufffd\ufffdrFJ\ufffd\ufffd\u0010M\ufffd\ufffd\ufffd\ufffd!\ufffd\ufffd6Cj\ufffdA\ufffdo\ufffd\ufffdG\u001a\ufffdVl\u054bX\b\u001c\ufffd\ufffd\ufffd\u0007Q\ufffd\ufffdqV\u052c\ufffd\ufffd\ufffd\u0004\ufffd\ufffd@ts\ufffd'\ufffd\u07ce\ufffd\ufffd(\u0011\u034b\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffda\ufffd\ufffdz3x\ufffd\u00194\u001f\ufffd\ufffdDe)\ufffd\ufffd.J\u0013\u001f!pE<\ufffd\ufffd\u0004\ufffdo$.P\ufffd\ufffd\ufffd\ufffd\ufffd\u07ad\ufffd]\ufffd\ufffd}jW\ufffdm\ufffd:\ufffd\ufffd\ufffd\r]]\ufffd[\u001d\ufffdy\ufffd\ufffd'\ufffdD\ufffd\u001fK3&\ufffd\ufffdBH\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdt\ufffdX\ufffd;e\u0585[\ufffd\ufffdx\u0427R\ufffd|q\ufffd\ufffd%i2D\u001a}\ufffd\u001e\ufffdu\ufffdoV\ufffd\ufffdl\ufffdje\ufffd\ufffd+\ufffd\ufffd\u00189\u001dE\ufffd\ufffd&Z\ufffdW+\\\ufffd3\ufffd\ufffd>}\ufffd>!\ufffd\ufffd\u001a\ufffd(\ufffd`\u0014\ufffde\ufffd\ufffd\ufffd^\ufffd\u001bEP<|\ufffd\ufffd\ufffdW\u0016\ufffdb\u0011\ufffd,\u0001\ufffd%\ufffd\ufffd\ufffd\u0013w\ufffd\ufffdA\ufffd\ufffd\u0019\u07dcq\ufffd\u066a\u05b9!\ufffd\ufffd\u001e\u029c\ufffd\ufffd\ufffd\ufffd\\\u0003\ufffdV\ufffds1\ufffd\u0012\t\ufffdM\ufffd\ufffd=T\ufffdU\u0001Sg\ufffdqa\ufffd\ufffd\ufffd\ufffd]\ufffd\ufffd\ufffd\u000e\u0005\ufffdPk\ufffd*d0x\ufffdR`\ufffd\ufffdM\ufffds\u0012R\ufffd\ufffd\ufffd?\ufffd\ufffd\u0004\ufffd\ufffd\ufffdZ{f\ufffdo\ufffdw\u02cb\ufffd\ufffdn\u01d2<\ufffd\ufffdx\ufffd\ufffd%\ufffd\u0016o\ufffd\u0013J,K\ufffd\ufffdD\ufffd\ufffd$\ufffdv0!\u0018HX\ufffd\u001e\u0012Z^\ufffd\u000e\ufffd\u0004H\u00cei\ufffd\ufffd\ufffdBC\t\ufffd\ufffd\u25ade)I\u000bM\ufffd\ufffd~\ufffd\u0799\ufffde\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\\\""\ufffd\ufffd|g\ufffd\ufffd\ufffd\ufffd\ufffd\""2+A*\ufffd\ufffdf\ufffd&\ufffd#\u22d63\u0005+\ufffdS\ufffd\ufffdF\ufffd\ufffdj@9\ufffdi1qi1\ufffd9\""\ufffd\ufffd@m\u0011%Q\u0012a$(a+\ufffd\ufffdS\u0017\ufffd\ufffd\ufffd\ufffd'\ufffd\ufffda\ufffd\ufffd\ufffd\u0011\u03c9\ufffdzRaU\u0013\ufffd\ufffdzB\ufffd\u000b\ufffd\u0011Q$\ufffdh\ufffd\ufffd<\ufffdc\u0014\ufffd\u001f\u000bc\ufffd\ufffd%\ufffds\u0016^\u0015\ufffd\ufffdhaU%\ufffd\u0013\ufffd\ufffd$\u009c\u0011<'\ufffd\ub247\ufffdV\u0723\ufffdz\u01a9\u0003\ufffd\u0014\ufffd\u0007\ufffdX\ufffd>\ufffd\ufffd\ufffdD\u000eQS#K!\ufffd\u0010irr\ufffd\ufffd\t\ufffd\u001d\u0018\r%\ufffd\ufffd\u001b\ufffd,Q\u000b\u0014\ufffdq\ufffdR\ufffd\u000fE\b\u0014\ufffdRsDuAAu\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0019\ufffd\ufffd\ufffd|\u0005aQ\ufffd\ufffd\ufffd\ufffd)\b\ufffd\ufffdI\ufffdg\ufffd\ufffd_\ufffd\u0013\ufffd\ufffd\ufffd\u0016e<+\ufffd,\ufffd_\""z,\ufffd\ufffd8=\ufffd>'1'1Zv\ufffd\u007f\u0222\ufffd\ufffdb}Y)\ufffdg\ufffd05\ufffd<\ufffd\ufffdp\ufffdZM\ufffdO\ufffd\u0003\ufffd\u001fNIUD\ufffdif;\ufffd\ufffdbSc\u0014\ufffd\ufffd\ufffd\ufffdH\u001dU-\ufffdS_*\ufffdy\ufffd\ufffd\u0015\u0018\t\ufffd\ufffd\ufffdH\ufffdw\ufffd\ufffd\u0002\u001f\ufffdNu\ufffd\u0013\ufffd>S\ufffdTkk\\f\ufffd\ufffdM\ufffd\ufffd5-\ufffdT\ufffd^\u0017\ufffd\ufffdO\ufffd.@\ufffdu\f\ufffd|?\ufffd\ufffd\u01fe\ufffd,\ufffd\u077a\uda33\udeb8K\ufffd\ufffdu\ufffd\ufffd_\u000eZ\ufffd&\ufffd\ufffd\u0004a'\ufffdHhv+c\ufffd\u0002p\u0005\u0011\u000f\ufffd\u0002\f\ufffd_]\ufffd\ufffd'\ufffd\ufffd3WT)))\u01bf\ufffd\ufffd2$\ufffd \u000f\ufffd\u0768R\ufffd\u0015S[#\ufffd\ufffd\u001b\u0015)iK\ufffd<\n\u00159N\ufffd\ufffd\u04a9\u001aJ\u06a9\ufffd\ufffdn\ufffd|P*V\ufffdOl\ufffdC\u05ab!k\ufffd\\\ufffd\u0650\u0153\u001eRQ\ufffd\ufffd\u0000$\r\ufffd2\""\u0007j\u0014\u0007\ufffd9k\u001c\u000e\u001d\ufffd\u0006~\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0019.7n\ufffd#4*4\ufffdBcaQ\ufffd\ufffd\u0248\ufffd\u0214p\ufffd\ufffdQ\ufffd4\ufffd\ufffd\ufffd\\\u001b\ufffd\ufffdR\ufffd#K\u0014jr\ufffd6.G_\u0012wu\ufffd-\ufffdP\u0016\u001e\u0015\ufffdMKHT\u0262\ufffd\u0014\ufffdE\ufffdr2\u001a;\ufffdV\ufffd\u04c8\ufffdz2\ufffd\u0481}\ua20c\ufffd5\ufffd\n\ufffd\u000f\ufffd\ufffd\ufffd\ufffd\ufffd\u0006\u0016\u02c0\ufffd(l\ufffd\""\ufffdMG\ufffd\ufffd\ufffdefd\u0004~(\ufffd\ufffd\ufffd\ufffd)0\ufffd$\""D\ufffdd\ufffd\ufffd)\ufffd\ufffd\ufffd^\ufffd\ufffd\ufffd\ufffd\ufffdR\ufffd\\&\ufffd\ufffd.Ljl\ufffd\ufffdI\ufffd\"",L^nj\u036fL*\ufffd\ufffdJ\ufffdr\ufffdZ\ufffd\ufffdW\ufffd=\ufffd^\ufffd\ufffd'\u0016*\ufffd\uab25\ufffd2,B,\ufffd$\ufffd&\ufffd\ufffd\u0575\ufffd\ufffd\ufffd\u001aZ\u001bc,\ufffdUF\ufffd\ufffd&'&*d\u0011a\ufffd\ufffd\ufffd\u02c7#\ufffdr\u001b\ufffdL\ufffd\ufffdj\u0016\ufffd\ufffd\ufffd>\ufffdH\ufffd\r\ufffdC`\ufffdebJ\\z\ufffd$\ufffdq\u0010M\ufffd,\ufffd\ufffd\ufffd\u0005\u001b!5\ufffd\ufffd\u0015\ufffd9\ufffd\ufffd=&\ufffd> @\ufffd\ufffd4\ufffd\ufffd%gdig\ufffd\u0017+e\""\ufffd\ufffdu\ufffd:n\t\ufffdtI\ufffdB\ufffd!\ufffd\ufffd\ufffd\ufffd\ufffd\u02ad\u0290\u0010\ufffdV\ufffdZ\ufffd\u0457E\ufffd[U\ufffdrad\ufffdlv<\ufffd\ufffd\ufffdj\ufffd\ufffd\ufffdd\u001a\ufffd.\ufffd'\n\ufffd\ufffd\u01d0\u0013\ufffd\ufffdV\ufffdA\ufffdN;\ufffd\ufffdO\ufffdk\ufffd\ufffd\ufffd3Nz\ufffd\ufffd\ufffd\ufffd\ufffd8\ufffdT&\ufffdIc\ufffdr\ufffd\ufffd;\ufffdWi\u0019MdH&\u066d\nU\ufffd\ufffd\u001e\ufffd\u024d)Y]\ufffdB1\ufffd\ufffd\ufffd\f\ufffdB%\u0012%\ufffd\ufffd\ufffd+T\ufffd\ufffd\u018azEt,\u066eOHMM\ufffdC\t\ufffde\ufffd\ufffd\ufffd\u0014\ufffdp9\ufffdH6Q\ufffd\ufffd\ufffd\u0003\u07d9\ufffd\ufffd$\ufffdw\u0018\ufffd]\u0014\ufffd\ufffd\u0017\ufffd\ufffd\u0783D\ufffdDc&\u0003\ufffd\ufffd\u001c\ufffd\ufffd\ufffdR\ufffdf\\[\ufffda+\ufffd\ufffdit\ufffd\ufffd\ufffd\ufffdR\ufffd\ufffdT*E\ufffd\t\ufffd\u06bcz]\u0014\ufffd\ufffd\ufffd`\ufffd\u068bK*\ufffd\ufffd\u0012B\ufffdr\ufffd\ufffd\ufffd!TM\ufffd`Sf\ufffd\ufffd\ufffd\u000e\ufffd\ufffd\ufffdg\ufffdR\t\ufffd\u0449\u00191\u0012\ufffd4\ufffd\ufffd\ufffd\u8309\ufffd\ufffdjb\""\ufffd}E\ufffd\ufffd\ufffd@\ufffd\ufffd\ufffd\ufffd*\u00146\u00111D\ufffdS\u0010\ufffd\ufffdD$\u068d\ufffd\u000b\ufffd'\u0013\u001c\u001d\ufffdo1\u0015a\ufffdR\ufffd\u0002\ufffdL\ufffd7Y\ufffd>\ufffdV\ufffdH\ufffd\ufffdsZ-\ufffdHd\ufffdP\u0014\ufffd\ufffd\u0128N<\u000eiZ\u0015&\ufffd\ufffd\r\ufffd88\ufffd\ufffd4\ufffd\u00144\u0015\u000b\ufffd\ufffd\u0005D\ufffd\ufffd\u0018YNNz\ufffd@\ufffd4\u0017\ufffd\ufffdp\ufffd\ud92f\ude00\ufffd\u0013a\ufffd\ufffd\ufffd\ufffd\ufffdf\ufffd\ufffd\u0013\ufffd\u0011\ufffd\u0019\ufffdb1\ufffd\ufffd\ufffd\u04ad\u0017\ufffd\ufffd\ufffdue\ufffd\ufffd\ufffd\u03ab^]\u0016oZ\u05b9bGQYq\ufffdRkH\ufffdgT\u054d\ufffd\ufffd\ufffd\ufffd\u0015UT\ufffdg\ufffd\ufffdQ=\ufffd\ufffd:\ufffd\ufffd<\u0012\ufffdg\u02a9X\ufffd\ufffd_K\ufffd\ufffd\u000b\ufffdtQ)tbXB\ufffd\ufffdMzS*]\ufffd\u0014\ufffd\ufffd\ufffd\ufffd,&3\ufffd\ufffds\ufffd\ufffd\u0019\ufffd\ufffdJPD\ufffdj%\ufffdH\ufffdL\ufffdI%\ufffd\ufffdE\u0011A\ufffd\ufffdJ\ufffd\ufffd~\ufffd\u0018\ufffd\ufffd\ufffd\""f\ufffd\\\u0016\ufffdo\u001an\u0437\u0091Z\ufffd\u0010\ufffd$\ufffd\u0013\n\u001a\ufffdQ$\u0757[\u0591\u001f\ufffdZ\ufffd\ufffdr\ufffd\ufffd,\ufffd2\ufffd\ufffd2Y\ufffdU\u0015Tg4P\u001f\ufffdm\ufffd\u0566\ufffdp\ufffdT\u001b\ufffd\u001a-S\u02964\ufffd\u024fNM,\ufffd-\ufffd\ufffd5d\ufffd\ufffd.1L\ufffd\ufffd\ufffd*LXjJD\ufffdw&\ufffdPz\ufffd}>\ufffd\u0018\ufffd\u0000\u0550w\f\ufffd5g\ufffdw\ufffd\u06a5fc\ufffd\ufffde\u001am\ufffd\ufffd\ufffdqmY\ufffd\u0015!\tK\ufffdU\fz\ufffd\ufffdSa\ufffd\u0017\ufffd\ufffdeV\ufffd\ufffd\u03bd\ufffd.\ufffd/\ufffd\u001e\ufffd\u060c^\ufffd\ufffd\ufffd\ufffd\ufffd(\ufffd\ufffd\u0002\ufffd\u3e07T\ufffd\ufffd\u0000=\ufffdP\u0000\ufffd\u0010\ufffdC\ufffdy\ufffd\ufffd\ufffd\ufffdg\ufffd\u0149G\ufffdP\ufffd^\ufffd\ufffd;\ufffds7\ufffd\u0255W\u02d3S\ufffd\""G\u0014\ufffd\u007fj\ufffd\ufffd\u0013\ufffdQ\ufffd\ufffd\u022aX\ufffdt\ufffdX,\ufffd\ufffdx;\u001aE\ufffdFb?\ufffd$\u0018!\ufffdH\ufffdp@\ufffd\u00017\u0007\ufffd)\ufffd\ufffd\ufffd\ufffd\ufffd&\ufffd\u0013\u0003\ufffdQ\\\u001c\ufffdn\ufffd\ufffd\ufffdY\ufffd:*Ts^rN\ufffd\""\ufffd8^\ufffd\u0016'\ufffd)\ufffd\ufffd(\ufffd\ufffd\ufffd\ufffd$>4\ufffd\ufffd\ufffdIf\ufffd\u0395F\ufffdg\u001a\ufffd\u03e5\ufffd\ufffd\u0019\ufffd\u0019y\ufffd\b\ufffd\ufffd\ufffd\ufffdS\ufffd&\ufffd\ufffd\ufffd\ufffd*\ufffd\ufffd!\ufffdl\u0019q?\u0015\u000f\u0016\ufffd!rvW\ufffd>*0<\u0012\u001f/2d?\u0003\ufffd\ufffd\u0000\ufffdQ\ufffd\u001e\n\ufffd\ufffd\ufffd3\f\ufffdY\ufffdC\ufffd\r\ufffd=.\ufffd\ufffd\ufffd,\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdR\ufffd\\*\ufffd\ufffd\ufffdK\ufffdoj\ufffd+T\ufffd\u0572\u04baeL\ufffd6\u000f\ufffdP\ufffd,$\u6b16\u0001G[C\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdx\ufffd:T$\ufffdL\ufffdLP\ufffdU%\ufffd\ufffd\u0151\ufffd\u0011eLzAhDh\ufffdV\u0013'S'\ufffdXQ\ufffd\u0017&\ufffd\ufffd\ufffdO\ufffd\ufffd\ufffd\ufffd\u0012\ufffdZ.\ufffd$\ufffd\ufffdl\ufffd\u0014\ufffd\ufffd)\u0014(\ufffdT\ufffdv\ufffd\ufffd\u0799\ufffd$\ufffd:)=#a\ufffd\bXV\ufffdP\ufffd\u0017\ufffd\ufffdf&UdU\u02d5\uf407\ufffd\""\ufffd\ufffd}r\ufffdB\ufffd\u0013*5Q\u0019L$\ufffd\\\ufffd\ufffd\t\ufffdBg]\u001a\ufffd\ufffd\ufffd\u001d\ufffd__\ufffdOE\nV\ufffd\ufffd\ufffde\u001a\u0003d\u001aV\ufffdX\ufffd\ufffd?\u04e4\ufffd&2\ufffd\ufffdV\ufffdQ\ufffd\ufffd\ufffdH\ufffd2\ufffdT\ufffd\ufffd\ufffd6\ufffd\ufffd\ufffd\ufffd\u001bb\ufffdC\ufffd\ufffdz\ufffdZ\u0015r\ufffd\u0001\ufffd\ufffd\ufffd\ufffdT\ufffd`5\ufffde\f\ufffde\ufffd!\ufffd\u051c,\ufffdD\ufffd\ufffdL\ufffd@,\u0015\ufffd/M\ufffd\ufffd'\ufffd\ufffd\ufffd\ufffd\u0007\u0013\u0012\ufffd]\ufffd\u0011\ufffd\ufffd0MT\ufffdr6,\\)V\ufffde\ufffd\ufffd\ufffd,\u001a}N^F\u070bc[\f\u0136\\\ufffd2\ufffd\ufffd\ufffd\ufffd\ufffddA\ufffd\ufffd\\\ufffd\u0003\ufffdA\ufffd\ufffd\ufffd\u001bv\ufffd,\u0013\ufffd0\ufffdD/\ufffd1\ufffd\u035bF/X\ufffdY\ufffd4\ufffda\ufffd^\ufffd\ufffd\ufffdvmAqAaA\r\ufffdWU\u0019K\n**K+\ufffd\r\ufffd\ufffdW\ufffd)Z\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0005+\ufffd3:\u0270\f\ufffd.#-_\ufffd)\ufffd\ufffdufyR|\ufffd\ufffd%\ufffd\ufffd\ufffd\ufffdn\ufffdu!\ufffd\u0014\ufffd>A\ufffdE\ufffd\ufffdN\ufffd\ufffdR\u0012`\ufffd\ufffd\u658c\ufffd\ufffd\ufffd,\ufffd&\ufffd4`\ufffdi\u000e\ufffd\ufffd\u000e\u0011E\ufffd9\ufffdqI\u0014\ufffd\u052d\u001fY\ufffd\\\ufffd\ufffd\ufffd\ufffd\\\u001cy\u0011YY\ufffd\ufffd\ufffdW2\ufffdiFJ\ufffd\ufffd\ufffd\ufffdZ\ufffd\ufffd\ufffdKbb\ufffd\ufffd\ufffd\ufffdi\ufffd\ufffdK\""\ufffd\u0016saOUr^\ufffd/s\ufffd/2Y\ufffd)*\u01e7zb\ufffdN\u0014\u0007zW\u0011!O@L\ufffd%T\ufffd4\u0002\ufffd6\ufffd\ufffd\ufffd!\ufffd\u0010A\ufffd\ufffd\ufffd\u0010\ufffd\""\ufffd,\ufffd\ufffd\ufffd\ufffd?E\ufffd\ufffd\u0252\ufffd\ufffd\ufffd(\ufffd\ufffd\ufffd[\ufffd\ufffd\ufffdPq\u0001\ufffd$\ufffd\ufffd\ufffd\""\u0002\ufffd\u001c,Z\ufffd\ufffd\u0000\ufffd\u0011uh\u04b7\ufffd\u0521\ufffdjq\ufffd6\ufffd>'6\u000e\ufffd/j\ufffd\ufffd_\ufffd\ufffd\ufffd\u007f\ufffdr\ufffdS\ufffd\ufffd\ufffdQv\ufffd\ufffd.\ufffd\ufffd\ufffd\u0005\ufffd\u007f\ufffd\""\u051c\ufffd\ufffd\u000f\ufffd`\ufffd\ufffd\ufffd<\u0016XD\ufffd\ufffd\ufffd#*\ufffd\u001f*\u0017\ufffd\ufffd\ufffd\u07c8#\ufffdWJ\ufffd$7JC\ufffdWH\u007f+;[vH\ufffd&\ufffd,?\ufffd\ufffdN\ufffd\u04a1\ufffdV]\u00142\u001erTmR_\ufffd>\u0011zOXh\ufffd5\ufffd\ufffd=\ufffd\u001fG\fE\ufffd\f\ufffd\ufffd\ufffdL\ufffd\ufffd8J\u00125\u0015\ufffdrt{\ufffd\ufffd\ufffd\ufffdU1oh&4\u007f\ufffd]\u001d;\u0010\ufffd\ufffd\u0607\ufffdR\ufffd\ufffd\ufffd\ufffd'Ti\ufffd\u0012U\ufffdo&\ufffd!\ufffd\ufffdAZG\u0017\ufffdK\ufffdF\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd>\ufffd\ufffd\u0012P~\ufffd\u001c\ufffd\ufffd1E\ufffd\ufffd>\ufffd/\ufffd\ufffdSoI\u04e6]\u001dP\ufffdIOL\u07dc\ufffd\ufffd\ufffd5c.s\""\ufffd\u026c\ufffd\ufffd\ufffdY\ufffdg\ufffd.\ufffd\ufffdY\ufffdf}\ufffdu\""[\ufffd\ufffd\ufffd\ufffdd'\u0007\ufffd\ufffd\ufffd\u0012\ufffd\ufffdW\ufffd\n^\ufffd+x\u0005\ufffd3\ufffd.\u000f\ufffd`\t\ufffd`\t\ufffd`\t\ufffd`\t\ufffd`\t\ufffd`\t\ufffd`\t\ufffd`\t\ufffd`9i9\ufffdD\ufffdd\u0352\u0017s\ufffdsFr^\ufffdQ:\ufffdn\ufffd\ufffd^\ufffd7\ufffd\u059f04\u001an\ufffd\u0015\ufffd\u0016\ufffd^\ufffd\ufffd\u000fT\ufffdp\\\f\ufffd\u0012,\ufffd\u0012,\ufffd\u0012,\ufffd\u0012,\ufffd\u0012,\ufffd\u0012,\ufffd\u0012,\ufffd\u0012,\ufffd\u0012,gR\u041f\ufffd\u0011z*\ufffd@\u007fQ\ufffd~\ufffd7\u0014\ufffd\b\ufffd/\ufffd\ufffd\ufffd\ufffd\u0000\ufffd\u0016\ufffdTx\ufffd\ufffd\u000b\b\ufffd\ufffdA\ufffd.$4\ufffd\u0017\ufffd\ufffd\b\ufffd\u007f\ufffd\ufffdb\ufffd\ufffd\ufffd\ufffdK\ufffd\r\ufffd\u0010\ufffd.%\ufffd\ufffd\ufffd\ufffd\ufffd2\ufffd\ufffdl\ufffd\ufffdrj\ufffd\u001fKA\ufffdJ~\ufffd\u0555\ufffd\u0012\ufffd\ufffd\ufffd\ufffdB\ufffd\ufffdb\ufffd\u001eB,\ufffd9$\ufffd \ufffd\u0455\\\ufffd$$1\ufffd\\\ufffd\""\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\\\ufffd\u0545\ufffdR\ufffd\ufffd\ufffd\ufffd\ufffd~/W\u0017C}/W\ufffd\u0010\u0015\ufffd}\\]JDE\u001b\ufffd\ufffd\ufffd\b\ufffd\ufffdru9\ufffd\ufffd\ufffdR\u00109\ufffd!\\]ID\u0156qu\ufffdD\u0010\ufffd\ufffd\ufffdC\ufffdt\ufffd# H\ufffd\u02fbT\ufffd\ufffd\""\ufffd\ufffd\ua66d\ufffdzf\ubb1e\ufffd:\ufffdg\ufffd\ufffd\ua66d\ufffdzf\ubb1e\ufffd:\ufffdg\ufffd\ufffd\ua66d\ufffdzf\ubb1e\ufffd:\ufffdg\ufffd\ufffd\n\ufffd\ufffd+\ufffd:\ufffd\ufffd{\b\ufffd\ufffd'\u0018\""\ufffd(\ufffdZ+a',\ufffd\ufffdp\u0011^\ufffd7H\ufffd\ufffd\ufffd\b5\u000f\ufffd\u01aff\ufffdC\ufffdI\u0018`\ufffd\ufffdp@\ufffd\ufffdN\ufffd\u001b\""\ufffda\u030b[6x\ufffd\ufffd\ufffd\r\ufffdj\ufffd\ufffd*\ufffd\tj\u0003\ufffdc#\ufffd`F;P\ufffd\u0001\ufffdnb\u0002\ufffdh\ufffd\u0005(O\u0000\ufffdQ\ufffd\ufffd\ufffd\u0010\u6106\u007f.\ufffd3\u0001ky\f\ufffd\ufffd3C\u0014@-\ufffd\ufffd*!t\u0018\ufffd\f\u0014\ufffd0\ufffd\u0006\\3\ufffd \u001a\u0016b=7w\u0019\ufffd\ufffd\ufffd\u0017\ufffd\ufffd\u0002\u007f^\ufffd<\ufffd\ufffdo\ufffd28N\ufffd\ufffd \ufffd\u0003M\ufffdA{\u0000FP\ufffd\u0019ka\ufffd\ufffd,\u001d\u0017')\ufffdQFa\u0502\ufffd\ufffd;\u0006k=\ufffdg\u0014fY\ufffd\ufffdh\ufffd\u001f\ufffd}\ufffdD3\ufffd\ufffd\ufffdc\ufffd\ufffdX\ufffd\u0015x\ufffd\r\u03f0\u0011#\ufffd\ufffd\ufffdl\u016f4\ufffd\u0011?\ufffd\ufffd\ufffd^lS;\ufffd\ufffd[o^\u000e4\ufffd\u0003.\ufffd\ufffd\u000bZ0bi\ufffdX\u0012\ufffd_\u000e3\ufffd\u001b\ufffd\u0015,\ufffd\ufffdj\u00f6F\ufffd\ufffd\ufffdK\ufffd\ufffd8\ufffd\ufffd\ufffdBk#G\ufffd\u0007R\ufffd\u0016\ufffd\u0dd2\u0019\ufffd\b\ufffd\u0001#\u000b\ufffd\ufffd#\ufffd\u000581c|\u000b\ufffdo8I\ufffd*\ufffd\ufffd\ufffdhw\ufffd\ufffdm%z9\ufffd\u1f7e\u0018(\ufffdC\ufffdX8_\ufffd\u007fj\ufffd\ufffda>\ufffd\ufffd;\u0011O\ufffd\ufffdv\ufffd\u07ed\u07cd\ufffdC\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd7\ufffd^\ufffd\ufffd\ufffd6\ufffdO\ufffdwb\ufffd<\u0018\ufffd\ufffdm\ufffdp\u000bpb!\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdi\ufffd\u0011{\ufffd\u000bs\u60c2bX9\ufffd\u000b\u014au\ufffdV\ufffd|\ufffd{\f\ufffd\ufffd\ufffdB}\u0002\ufffd\ufffd\u0010\ufffd\""d\ufffd\t\ufffd5\u0003\ufb0ey\ufffd,M\u0007\ufffd\u0001q0\ufffd\ufffdec\u001fK\ufffdd>\ufffd\ufffd~\ufffd\u01b2\ufffdZ\ufffd\ufffd!\ufffd\ufffda\f6\ufffdL`M\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdc\ufffd\ufffd\ufffd\ufffdh\ufffd\ufffd\u000e\ufffd<7\ufffd\u0015\ufffd\ufffd\u06cd\ufffd\ufffd\ufffdb\u0006K\ufffd\u01b5\ufffd\\\ufffd\ufffd\ufffd(c\ufffd\u0012\ufffd\ufffd\r`>x+/\ufffd\ufffd\ufffd[\ufffd\ufffd\ufffd\ufffd;=\ufffd~\u0019tg\u0014\t\ufffdLa\ufffd:\ufffdq\u0019\ufffd\u075f,\ufffd\u038f\ufffdX\u00026\ufffd\ufffda=Y\ufffd~:\ufffd\ufffd\ufffd8I\ufffdx\ufffd9\ufffdbw\ufffdwu\ufffd\u05b0\ufffd&\ufffd\ufffdc\ufffd\ufffd\ufffd\ufffd\ufffdSgy\ufffd\ufffd\ufffd\r\ufffd\u001fl\u01a7\ufffd\ufffd\ufffd\u00d6\ufffd,\u021d\ufffd%\ufffd\u03d4\ufffd\ufffd\ufffd\b\ufffd\u0001$\t+\u000b{\ufffd\ufffdc\ufffd\ufffd\u007f\u001a\ufffd\ufffd|\ufffd\ufffdq\ufffd|JIY\ufffd3/\ufffd*6\u001e\ufffd\ufffdWV*\ufffd>\ufffd\ufffd\u000b\u001b\ufffd\ufffd8\ufffd\u0679\ufffd\ufffd\ufffdA3\u001d8\ufffd\ufffd\ufffdG\ufffd(\ufffd\ufffd,3O\ufffd\ufffd!\ufffd\ufffd\ufffd\ufffd0\ufffdwvN\ufffd(\ufffd\ufffdp\ufffd\ufffdq2\ufffd\u000e^\ufffd\u000b\ufffdZ\ufffd-c\ufffdu+\ufffd\ufffd\ufffd\u0016\u01f9\ufffd;!kQ\\\ufffd\ufffd8=\ufffdO\u0019vl}dU3\ufffd!\r\r\ufffd\f~,\ufffd\ufffd\ufffdvQ\ufffd\ufffd\ufffdv\ufffd|\ufffd\ufffd?!\ufffd\ufffd|\ufffd\ufffdt\ufffd\u0640NXD\ufffd\ufffd\ufffdAk\ufffd\u07bc\u000e\ufffdX;\ufffd^\u00deX\u001c\\\u0016\ufffd\ufffd\ufffd\ufffde8\ufffd+O\ufffd\ufffd\ufffd:\ufffd;\ufffd\u001bpFa\ufffd\ufffdz\ufffd\ufffd\ufffdb#\ufffd\ufffd\ufffd\ufffd\u000e\ufffd\ufffd\ufffd\u000f\u007f\ufffd`\ufffdJC\ufffd\ufffdy?f\ufffd\ufffd\u035d\ufffdX\u0004\u0017>\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd,\ufffd8\ufffd\ufffd\b\ufffd\ufffdk\u020ceGz\ufffds\ufffd\ufffd\ufffd\ufffdU\u000bw\ufffdvb^\u0003s\ufffd\u001d\ufffd\u043d\ufffd79\u001eOm[\ufffdw-\ufffd\ufffd`\ufffd\ufffd\u0000\u001dY\u0003\ufffd\u001a\u0002\ufffd\ufffd\u0019\ufffd#\ufffd\ufffdt\ufffd\ufffd'\ufffdn\ufffdE\u044d\ufffd\ufffd\ufffd\ufffd\u000e|\ufffd`_$7\ufffd\ufffd\ufffd\u0019l~\ufffd\ufffdg\""\u0786:\ufffd\ufffdcCwf|\ufffd\u0016\ufffd!n|O\ufffd\ufffd\ufffd6\u001c\ufffdaY\ufffd\u00070/6.S\ufffd\ufffdm\u0019\u0018KX\u001b\ufffdr\u0016\ufffd\ufffd]\ufffd\ufffd\ufffd\ufffd\ufffd\ub17et\ufffdZ\r\ufffd\ud871\udd01\ufffdf\ufffdO\ufffdkb\f\ufffdq\ufffd\u0007\u0691\ufffd\u0006\ufffd\ufffd\ufffd\ufffd\u054c-\ufffd\u0003+~E\ufffd\ufffdzY\u00073,\u0001\ufffd\ufffdw\ufffdx\ufffdF~+\ufffd\ufffd\ufffdx\ufffd\u000b\ufffd8{\u001a\u06c0\ufffd';u;q\ufffd\ufffdL\ufffd=\u001b\ufffd'N\u0016S\u0016\ufffd\ufffd\ufffdX\ufffd\ufffdj\ufffd\ufffd\ufffd\ufffd9\ufffd|\n\ufffdz\ufffd\ufffd{\ufffd\ufffd:1uv\u0017}\ufffdn\ufffd\ufffdz\u0000\ufffd\u07da\b\u0013\u001em'\u001a\ufffd\ufffd\u0012\ufffde'\ufffdi\ufffd>\u001a\ufffdh'\ufffd\ufffdB\ufffd\u001ez\ufffd'\u0013ftq\ufffd\ufffdR+q\u001ej\ufffdy=8\u01f14:\ufffd\r\ufffd}8\ufffd5\u00104n\ufffd\ufffdr\ufffd\ufffd\u0006\ufffd\ufffdZ\u0013\ufffd\nc\ufffd\ufffdZ\u0017\ufffd\u0649i\ufffdBo\u000b\ufffd\ufffd\ufffdyh\ufffd\u0011zz\ufffd\ufffd\ufffd8\n\ufffdxm\ufffd\ufffd\ufffd\ufffdh\ufffdr\""\ufffdi7\ufffd\ufffd~\t\u0017r\u054c\u0011y\ufffdZ\ufffd\ufffd\t\ufffd\ufffd\ufffd\ufffdZ\ufffd\u074c\ufffd!\ufffd\u0011~\u0003\ufffd\ufffd\ufffd\ufffdl\ufffd8\ufffd\ufffd:B\ufffd\u0011M#p\u0502[\ufffd\ufffd\u0007\ufffd;`^\u0017\u01af\ufffd2\ufffd\u0736a\u0019\u001a`\ufffd\ufffd\u01449@\ufffd\u0006NVv\u001e\ufffdO/7\ufffdl\ufffd\ufffdk\ufffd2/U-\ufffdA\u0013\ufffdf^\u007fFx\ufffd\u0000\ufffd\u0011\ufffdF\u0018\ufffd\ufffd\u0019\ufffd\u001dV\ufffdcI\ufffd\ufffd\ufffdL\ufffd\u0390\ufffd-\ufffd5/\u0015k)#\ufffd\u0006i\u0015\ufffd\u001e\ufffd\ufffd\u046f\ufffdN\ufffd\ufffd\ufffd\ufffd\u0019@m\ufffd\ufffdV\ufffd\ufffd\ufffdY\ufffd|\ufffd\u072b\u0011k\ufffd\u001d\ufffdXk\u0018q\ufffd\u001b\ufffd\n\ufffd\ufffd8[vb9\u0016\ufffd\ufffd\u011eh\u00b3j\ufffd\ufffd]~\u000fi\ufffd\ufffd\ufffdr\ufffd{'\ufffd\ufffd\u001e\ufffd\t\ufffd\ufffdl\u001b\ufffd\u000b\ufffd\ufffd\ufffdi\ufffd\bK\ufffd\u001f\ufffd\ufffd,\ufffd]\ufffd \ufffd\ufffdb\ufffd \ufffd\ufffd\ufffd\u0227\ufffd\f{\ufffd\u001e:\ufffd\ufffd+\ufffd[\ufffd\u0016\ufffd\ufffd\ufffd\u001a\ufffd\ufffdF\ufffd\ufffd\ufffd\ufffd}v\ufffd\ufffd@\ufffd:\u001ct\ufffd}h\ufffd\ufffd;m^\ufffdg\ufffd\ufffdjP5\ufffd\u0006<\ufffd1\ufffd\ufffdmsvO\ufffdmt\ufffdy\ufffd5\ufffd\u001d\ufffd!\ufffd\ufffd\ufffd\ufffd\ufffd\u0013\u001e\ufffd\ufffdF\ufffd\ufffd\u0002:\u0003\ufffd\ufffd\ufffd\ufffdN\ufffd\ufffd=L7\ufffd\ufffd\u0016\ufffde=\ufffd.s\r;\ufffdQ\ufffd\u0017\ufffdt\u000f\u06fd\ufffd#\ufffd\u03a0\ufffdC\ufffd\ufffd\u0007\u001cv\ufffd\ufffdAs\ufffd0\ufffd\u0005\ufffd\ufffd\ufffd5\ufffd\ufffdh\ufffd\ufffd\ufffdc\ufffdG\ufffdV\ufffd\ufffd\ufffd\r\ufffd\ufffd\ufffd\ufffdn\ufffd\ufffdn\ufffd9\ufffd\ufffd\n\ufffdk\ufffd\u0476\ufffd\u0001\ufffd\ufffdj\ufffd\ufffd\u000e\ufffd\ufffd\ufffd\u06bc\u0016\ufffd\u074d\ufffd\ufffd\u0018V\ufffd\ufffdlwx\rF\ufffd\ufffd>\ufffd#\f3=\ufffd\u0002\ufffd\ufffdcvz\ufffd\ufffd\ufffd>H\u000f\ufffdG\ufffd\tz\ufffd\ufffd\u001b\ufffd\ufffd\ufffd\u0003>\ufffd\ufffd\ufffd\ufffd\u0000\ufffd\ufffd\u001c\u0002\ufffd`\ufffd\ufffd6\u0002+\ufffdVP\ufffd\ufffdi\ufffdx\rt\ufffd\ufffd\u001e\ufffd\ufffd}\ufffd\u001e\ufffd\ufffd\ufffd\ufffd@\n\ufffd\u000f0,^\u001d\ufffd\u001d1\ufffd^-f7\ufffd\u0452\ufffdQ\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffd\u0011\ufffd\u0007fzm>L\ufffdK\ufffd=.\ufffd\u0006\ufffd\u0016\ufffd;\u001c\ufffd1z\u0018\ufffdK\ufffdG\ufffdf\ufffd\ufffd\ufffd;i\u001f\ufffd5p\u0006K@F'`\ufffd\u0006\ufffd\u0001\ufffd\u0010&\ufffd\u0002\ufffdl\ufffd>Xl_o3\u041c\ufffd\ufffd^z\ufffd\uc720-\ufffd`R\ufffdo\ufffd>'(\ufffdc\u0006YY\ufffdA\u001e\n\ufffd\ufffd\u0001\ufffd\f\ufffd\ufffd\u0007\ufffdZ\ufffdh\u0004\ufffd\u000e\ufffd8\u001b0\u001c\ufffd\ufffd\u00110.\u0001\ufffdm\ufffdq;`<\u0004\u0018\u04c0\ufffdk\ufffdx\u00170>\u0002\ufffd\ufffd\ufffd\ufffd,\u0120^\u000f\ufffd\ufffd\u0005\ufffdl\ufffd(\u0002\f\u0013`\ufffd\u0000F\u000f`X\u0001\ufffd\u000b\u0018S\ufffdq\r`\ufffd\u0002\ufffd\u0007\u0000\ufffdi\ufffdx\u00150\ufffd\u0005\ufffdO\u0001\ufffd\ufffdk\u0012<\ufffdT/\ufffd\u0010\ufffd\u0017\ufffd\u0011\u000f\u0018:\ufffd(\u0003\ufffde\ufffd\ufffd\u00020V\u0003\ufffd:\ufffd\ufffd\b\u0018\ufffd\u0001\ufffdM\ufffd\ufffd\u000b\ufffdx\u001c0^\u0006\ufffd\ufffd\u0003\ufffd'\ufffd\ufffd\ufffd\u0018)\u0006\ufffdp\ufffd\ufffd\ufffd\u0010Cx\""\u0000C\u000b\u0018\ufffd\ufffdQ\u0005\u0018\ufffd\ufffd\u000b\u0018\ufffd\ufffdq\u000e`L\u0001\ufffdu\ufffdq;`\ufffd\u0001\ufffd\u0017\u0000\ufffd-\ufffd\ufffd\u000b`|-8J\ufffd\u0001#\u001a0R\ufffd\ufffd\u0001\ufffd?\ufffd\ufffd\ufffd\u029f\ufffd\ufffd>\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd/A\ufffd\ufffd\b\ufffdX\ufffd\u0019\u007f\u001b\ufffdq\ufffd\ufffd\u0010\u000bg\ufffd\ufffd%\ufffdH\ufffd\u0010\u05c8\ufffdi\u0405P8#\u0010\ufffdR\u046e]\ufffd\ufffd\u0012\ufffd\ufffd\ufffdrK\ufffd\ufffd`\ufffd\u000f2p\u001dgG\ufffdk4L\ufffd\ufffd1\ufffd\ufffd\ufffdh\ufffd\ufffd\ufffdJKW\ufffd\ufffd~\\\ufffd\ufffd#\u01e6\ufffd\u000fk4\ufffd\u00f81\u000e\rL\r\ufffdh\ufffdV\u007f\u007f?\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd8\ufffd\u0011Q\ufffd\u007f\ufffd6]SS#\u0012\u00102\ufffd4]\ufffdy\ufffd\ufffd\ufffd\ufffdR\u0019)U,\ufffdS&&d\u0012\ufffdR9y\u0000\ufffdI\ufffd\ufffd\u0010\ufffd\u000ec\ufffdd\u0014)c\u0005\r\ufffdTD\ufffd\u0100\ufffd\ufffd\ufffd\ufffd\u001f\ufffd\ufffd8n\ufffd%\ufffd#W(\ufffd \ufffd\ufffd1\ufffdT^\ufffdN\ufffdK\ufffd\u001a\u01e7\ufffd\ufffd\u034f\ufffdf\ufffd\u050e+AU *\ufffd3\ufffd\u001fA\ufffdI%H* \ufffd\ufffd\u0019\u0406HH\u02053\ufffd\ufffd\ufffd|\ufffd\ufffd\ufffd)H\ufffdj\u0006\ufffd#3\ufffd\ufffd\u007f\u0007\ufffd\ufffd\ufffd\ufffd\ufffd\""\u0017\ufffdr)/\ufffdI\ufffd\ufffd\ufffdp\ufffdN\ufffd)R.\ufffd\u000e\u0010\ufffd\u0014\ufffdf\ufffd\""R.A\ufffd\ufffdJ\ufffd\ufffd=0\ufffd[\ufffd\ufffd\ufffdqv\ufffd\ufffdxz\ufffd\ufffde\ufffd-\r/4n\ufffdB\ufffdc\ufffd\ufffd\u001cMVl\ufffd\u06cf7\ufffd\u001f\ufffd\ufffd\ufffd\n!/\ufffdB\ufffdK\ufffdk\u030c\\I\ufffdCf\u0707\ufffd\ufffd\u0743\ufffd\ufffd\u01bc\u01bc\u0000E!!\u001521\\\u001bf_x\ufffd\ufffd\r\u0012\u0011)\u0011\ufffd}\f\u000b\ufffd\ufffdH\u0005/<\ufffd\ufffd\u0012\ufffd\""\ufffd\f\u0012_\ufffd\u0157K\b\ufffdt\u0012\ufffdCK'\ufffd\u001a\ufffd\u00c7Y\ufffd\ufffds\ufffd[\ufffdH\u0003\ufffd\ufffd\ufffd\ufffd\ufffd&\ufffd\u0016\ufffd\ufffd\ufffd\t\ufffd\ufffd\u000e\u01c1\ufffdY\ufffd\u00127gg\ufffd\ufffd\ufffd\ufffd\ufffdG\ufffdn\ufffd\ufffd~w\u0016SfG\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdQ\u051c\ufffd \u000e9~L\"" \ufffd\ufffd\""\ufffd\ufffd%BB)\ufffd\u0007\ufffd\ufffd2p}\u0006\ufffd\f3\ufffdP\ufffd\n\ufffdL\ufffdL\ufffd\ufffd\ufffd\ufffdx+\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdm\u07ef\u066fQJH\ufffdB\ufffd\ufffdTDJA#\ufffd6WR\ufffdR<\ufffdP'bV'J\ufffd\u0013\ufffdO^'\ufffd\ufffdBL)d\ufffdR@+\ufffd\ufffd\u00161\ufffd\u0016\u007f{rR\ufffd$WH\ufffd\u001d\ufffdX\\<8\ufffd\ufffd\u071cX\ufffd\u01cf\u001f\u01ca\ufffd\ufffd]9\u064f5\ufffd\u0002\u05de\ufffd\u0015\ufffd\ufffd\ufffd#\ufffd\ufffd\u34ecm\ufffdv\ufffds*!\ufffd`k\u0015\ufffd8(\ufffdHD\ufffd\ufffd\ufffd>\ufffd\ufffd\ufffd\u0010R\u00196\ufffd0\ufffdp\ufffd\ufffdp\ufffd\u06ce\ufffd\u001d\ufffd\ufffd\ufffd_\ufffd\ufffd\ufffd}\ufffd}J\ufffd\ufffdT\ufffd\u0005pU\ufffd\ufffd\ufffd}\ufffd>>\ufffdB&\""e\u0012^A\ufffd*\ufffdR\ufffdk\b\ufffdHH\ufffd\u0147\u000f\ufffd\u0000M\ufffd\ufffd\ufffdRJ*\u555b\ufffdrDaS%\ufffd\u040c\u001f\ufffdH\ufffd\ufffd\ufffd9\ufffd\ufffdj\t\ufffd\t:$|\u0007\ufffd'<#$1\ufffd\u05d3\u0018w\ufffd\u001e$\u0011\b\ufffdr3\u00127!M}<\ufffd27'\ufffd\ufffd\t\ufffdR\ufffd\u074f;6\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u04a1}\ufffd\ufffd6\ufffd3\u0006b\t\u0133\ufffd-\""D4\ufffd\ufffd\ufffdym\ufffdu\ufffd-\""\u0b02\ufffdj\ufffd\ufffd\ufffd\u001c\ufffd\ufffd\u0006/[\ufffdE\ufffdZ\ufffdy@G\ufffdzF\ufffd:\ufffd8\ufffdq\ufffd\ufffdF\ufffdk=~\ufffd\ufffd\ufffd\ufffd\u0006u\ufffddPG\ufffd\ufffd}\ufffd\ufffd7\u001b\ufffd@b>\ufffd\ufffdv'\ufffdG\ufffd,iod\ufffd\ufffd\u05c9eK\ufffd4m9\ufffd\""%\u052e)\ufffdE\u0435\ufffd\""\ufffd<\u0005#\u0013\ufffdrB\u0004T\ufffd\ufffd`\ufffdby\ufffd\ufffd\u0014\ufffdS%\u0014)\ufffd\ufffd\u016c`t\u0001=\t\ufffd&nN *qi\ufffd\ufffd\ufffd.\ufffd\ufffd\u0012\ufffd\ufffdc)*Lr\u00001a\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\f=\ufffd\ufffdv\ufffd\ufffd\u0017\u001f<\ufffd\ufffd#\u007fS\ufffd?\ufffdkJ\ufffd\ufffdL\t\ufffd1S\ufffd{w\t(\ufffd\ufffd\""\n\ufffd\ufffdG5\ufffdw\ufffd%8\ufffd\ufffd)\ufffd\ufffd\ufffd\ufffd-\ufffd\u001b\ufffd\u0019\ufffdl\nz\ufffd\ufffd\b\ufffd\ufffd+/\ufffd\tC\ri\ufffd|\ufffd\ufffd;lw\u000e\ufffd\\\u03bcP&\u0004uJ\""$\ufffd6\ufffd\ufffdi\ufffdKd\u0012P\ufffd<\""\ufffd_\ufffd\ufffdKf\ufffd\u0438 B3?\ufffdm\u001f\ufffd\ufffd|\ufffd\u00117\ufffda\ufffde\u0012cTy\ufffdL\u0019S\ufffdWRTZX\ufffd\u001a\ufffd\ufffd\u0001M\u6087\u007f\u0014\ufffdT\ufffd\u0002\ufffd+\""\ufffd\ufffd\ufffd\u001d\ufffdy\ufffdL:\ufffdLt\u001a\ufffdn\ufffd\ufffd\ufffd\ufffd\ufffdD\ufffd\ufffd\ufffd\ufffdK\ufffd\ufffdM\ufffd\ufffd\ufffd\ufffd|}\u001d\ufffdP\ufffd\ufffd\u03a4\ufffd\u0012%\ufffdT\ufffd.\ufffd\ufffd\u000e\ufffd\u0014\ufffd\u0012\ufffdaRD\b\ufffd\ufffd\ufffd\u0006\ufffdrj\nN\ufffd7\ufffd\ufffd\ufffd\ufffd\ufffdo<\ufffd\ufffd\u0007o\u0013\ufffd\ufffdEz\u01de\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd/\ufffd]\ufffdwM\ufffd\u03ff\ufffdp\ufffd\ufffd\u045f\ufffd\ufffd=g\u001a\ufffd\ufffd\ufffd\ufffdGw\ufffd\ufffdm\ufffd\ufffd\u4fd1/9\ufffd\ufffdgo\ufffd\ufffdi\ufffd\u0013\ufffd\u001f\ufffd&>!\u007f\ufffd\ufffd\u01d7\u001f\ufffd{/\ufffd\ufffd\u0003\ufffd\ufffdW\u0538=q\ufffd\ufffd/\ufffd\ufffd\ufffdV\u0747yK\ufffd\ufffd\ufffd\u001e\ufffd\ufffd{q'\ufffde\ufffd\ufffd\ufffd>\ufffd\ufffdOQ\u0007\ufffdz\ufffd\\{\ufffd\ufffd]\ufffd\u0012\u007f_\ufffd\ufffd\ufffd\u000fL4IZ5}\u0005\ufffd\ufffd\ufffd~\u0016\u007fS\ufffd\rU\ufffd\ufffd_\ufffd\ufffd\ufffd#\ufffd\ufffd\u000f<\ufffd\ufffd\u039bo\ufffd!\ufffd2\ufffd\ufffdW\ufffd\ufffdeM\ufffd'\ufffd\u0007\ufffd\ufffdW\ufffd\ufffd\ufffd\u000b/\u06eb\ufffdfX\ufffd9\ufffd\ufffd\ufffdU\ufffd\""\ufffdz\u01feC\ufffd\ufffd\ufffd\ufffdZ}\ufffd\u020a\ufffd\ufffd\u01b3>\ufffd\ufffd\ufffd\ufffdM\ufffd\u001d\ufffd\ufffd\ufffd\ufffd{\u000f\ufffd\u009f,\ufffd5Up\ufffd)VUGN\ufffd\ufffd\ufffd/\u001e)|dxjj\ufffd\u001f{.\ufffd,\ufffd\ufffd\ufffd \ufffd\u0013\ufffdmS\ufffd\f4\""b\ufffd\ufffdRm\ufffd0Z\u0018y\ufffd3\u001b/\ufffdi\ufffd\ufffdW?\t\ufffd\u02bcRqY^\ufffd\u0014\ufffd!m\ufffdP\ufffdDo\ufffdL-<\ufffd\ufffd\ufffd\u0006\ufffd\ufffd\ufffdo7|\ufffdp\u0383\ufffd\ufffd\u001eV3\ufffdhB\ufffd\ufffd\ufffdY\ufffd4\ufffdj\ufffde\ufffdb\ufffd\u001fa\ufffd8\u0016}\ufffd\u01bd\u078ezs\ufffd\ufffd\ufffdxs\ufffdfDV\ufffdF\u0004\ufffd4\ufffd\u0014f\ufffdX\n\u001bS$\ufffd\ufffd\ufffd\ufffd\ufffdY\ufffd4\ufffdm\ufffd\ufffdR\ufffd\u0001\ufffd\ufffd\ufffd\ufffd\f\ufffd\ufffd9\re\u001f\u0013\ufffd\ufffdM\u0017*\u00199OR ]\ufffd!\u0005\ufffdKR-\ufffd\u0018nL\ufffd\ufffd%\ufffd\ufffd\u0019\u05ffwp\ufffd\ufffd\ufffdn\u07ea\ufffd\ufffd\u057f;x\ufffdL\ufffd#\ufffd;\ufffd\u007f\u007f%s\ufffdC1K\ufffd\ufffd\ufffd\ufffd{f\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdz\ufffd`V\u0181\ufffd\ufffd\ufffd\ufffd\ufffdI\ufffd]Go\ufffd\u007f\ufffd\ufffd_\ufffd\ufffd?9\ufffd;\ufffd+;\ufffd\ufffdC\ufffd\ufffd|\u05d7\ufffdc\ufffd\ufffd\ufffd4\ufffd\ufffdS\ufffd\ufffd\ufffd\u0002\ufffdE\ufffdL\ufffd\ufffd\u046c\ufffd)\ufffd\ufffd\ufffdg\ufffd\u0014\ufffd\ufffdl\ufffd\ufffd\ufffd~\u0014\ufffd\ufffdq\ufffd)\ufffd\ufffd\ufffdht\ufffde\ufffd\ufffd\ufffd\\u\ufffd\u6268\ufffd\u0019\ufffd\ufffd=\ufffd\ufffd\ufffd\ufffd\u001b/\ufffd\u05b0\ufffd\ufffdW\ufffd^\ufffd[^`H\ufffdf\ufffd\ufffd\ufffd{\ufffd\ufffd\ufffd=\u001b_\ufffd{R\ufffdr\u00e7\ufffd\ufffd8\ufffd\ufffdP\ufffd\ufffd\ufffd\ufffds)\ufffd[\ufffd>T\ufffd|\ufffd\ufffd\u00ec\ufffd\ufffd\ufffd\ufffd\ufffdZ>{\ufffd\ufffd+>\ufffd\ufffd\ufffd\u83e5\ufffdnW\ufffdg\ufffd\ufffddL\ufffdO_\ufffd\ufffdP\ufffd\ufffd\u1963\ufffd\u001b\ufffd\ufffd~s\ufffd\u0013\ufffd\ufffd^L\u007f\ufffdxw\u0451s~5\ufffd#\ufffd_v\ufffd\ufffdk>=4>{\ufffd7\ufffd\ufffd_R\ufffd\ufffdcI\ufffd\u000f\ufffd\ufffd\ufffd\ufffd\u0017\ufffd\ufffd\ufffd\ufffdC\u000f\ufffd\ufffd\ufffdm\ufffd\ufffd_=\ufffd\u068f\u0012\ufffd>;g\ufffd+\ufffdK7\ufffdfBW4\ufffd\ufffd\b\ufffdbS\ufffdm\ufffd\ufffd\u000f\ufffdT'&\u007f\ufffd\ufffdG\ufffd\u07ff\ufffd\ufffdC7\ufffd\ufffd~z\ufffd\u0007\u0017\ufffd<{\ufffd\ufffdZr\ufffd\ufffd\ufffd\ufffd\""\ufffd-\ufffd1\ufffd)\ufffd\u062f\ufffdn%\u001ez\ufffd\ufffd\ufffd\u000b\ufffd\ufffdk.\ufffd\ufffd\u0539\ufffd\u001fO|\u0016\ufffd\ufffd\ufffd\ufffdF\ufffdA#\ufffdl\ufffdIG\ufffd\u019f\ufffd[\ufffd\ufffd\u007f\ufffd\n\u0002\ufffd\ufffd+\ufffd\u0006.z\ufffd\ufffd\uc4f9\ufffd_\ufffdu\ufffd\ufffd'\ufffd\u077b/b;\u04c9\ufffd\u00c4\u0010\ufffdnodL\ufffd3M!\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffd\u03f1\ufffd2\ufffd\u0003E6\ufffd\ufffd\ufffdl\ufffdP_\ufffd_P\ufffd/-(\ufffd\ufffd[K\ufffd\ufffd\u0006\ufffd\ufffd\ufffdE\ufffd\ufffd\ufffd\u0005!\ufffd\ufffdi\ufffd\ufffdC\ufffd\ufffd\ufffd/bJJR\ufffd\ufffd\ufffd\ufffd\ufffd(u\u00e9C\ufffdI#\ufffd\ufffd\ufffd\ufffdQ\u0010\ufffd\u0005\ufffd\u0018\ufffd\u0018\u001c\u0018\ufffd\ufffdZ\ufffd\ufffdgJ\ufffdL)\u000e\ufffd\ufffd\u0010\ufffd\ufffd\ufffdi% \u0004\ufffd\ufffd[\u0000>\n\ufffd\u0006\ufffd\ufffd(\u0011\ufffd\u0011$9'\ufffd\u0018b\ufffdv\u0016LQ$!\ufffdNzg\ufffd:^Lm\ufffdu\ufffd\ufffd[\ufffd\u001f;\ufffd\ufffdSoN\u001f\ufffd:\ufffd\ufffd\ufffd\u0017\ud3627\ufffd{\ufffd?\u001f\u07f1\u61b5a\ufffdY\ufffd\""S\ufffd\ufffdM\u0013\ufffd<9x\ufffd;O|J\ufffd\ufffd\ufffdJ\u001d\ufffd\u001d\ufffd\ufffd\ufffd\u0011b\ufffd\ufffd;.K8 \ufffd\ufffd\ufffd\ufffd\u0012\ufffd{\ufffd\ufffd\ufffdx\u36afr\n/\ufffdy\u056a\ufffd}m\t\u000f\ufffd\ufffd\u001c\ufffd\ufffd\ufffdS\ufffd\ufffd\u0014\u001d\ufffd?\ufffd\u016b\ufffd\ufffd\ufffd\ufffd\ufffd2\u0013>\u0018\ufffd^\ufffd\ufffd0\ufffdR\ufffd\ufffd\ufffd\ufffd\ufffd]\ufffd\ufffd>\ufffdpnG\ufffdO\u013b\ufffd\ufffdxQk\ufffd\ufffdU\ufffd\u007fhc\ufffdz\ufffd6\ufffd]\ufffd\u0017.\u0776te\ufffdX\ua973\ufffdC\ufffd_\ufffd\ufffd4j\ufffd\ufffd9\ufffd\ufffd\u0594\ufffd\ufffdv\ufffd\ud5ec\u07d6\ufffd:\ufffd\ufffd\ufffd\ufffd\ufffdk\ufffdM\ufffd\ufffdy\ufffd\ufffd\ufffd\u000bo)~k\ufffd\ufffd\ufffd\ufffd\u0379}\ufffd\ufffdX,\ufffd\ufffd\ufffd|v{\ufffd=\ufffd[\u000e|1\ufffd\ufffd=iF\u035e\ufffd\ufffd\u01f7\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdc\u007f\u0017y\ufffd\ufffdW\ufffd\u001cN\ufffdd\ufffd\ufffd\ufffd\ufffd\ufffd2>\ufffd&\ufffdXN\ufffd\ufffd\ufffd\ufffd\u0582=\ufffd\ufffd\ufffdo-{\ufffd\ufffd\ufffds\ufffd?\ufffd^{\ufffdq\ufffdK\ufffd\ufffd~b\ufffdU\u0017:\ufffdz~\ufffd\ufffd\u001d\ufffd\ufffd\ufffdC\u0721\ufffd\ufffd\u0597F\ufffdJ?\ufffd\ufffdp\ufffd}O\ufffd\ufffd\ufffd\ufffd\ufffdm\ufffd}\ufffdW\ufffd\u001b\u0007\u000e&\u007fq\ufffd\ufffd<\ufffd\ufffd\u0725\ufffd;J\\\ufffd\u001d\ufffd{\ufffdn\u07e5\ufffd\ufffd\ufffdM\ufffd\ufffd\ufffd\u007fh\ufffd\ufffd\ufffd\ufffd*\ufffd,\u00e2\u07368\ufffd\f\u074dHH\ufffdP\ufffd;\u0003(\ufffdt\ufffdt#)]\u0002\nCK\r-\ufffd\ufffdH\f\ufffd\ufffd \ufffdR\""\ufffd\ufffdQ\u0004\ufffd` R\u0012R\ufffd\ufffdT\ufffd\u0000\ufffd\u0000G\ufffd\ufffdx>\ufffd\ufffd\ufffd2\ufffd\ufffd\ufffdys\ufffd\ufffd\ufffd\ufffd\ufffd{\ufffd\ufffd\ufffd\ufffd\ufffd\ufffduS\u001e{\bMY\ufffd\ufffdT\r\ufffd\ufffd;!Jf\u04fc\ufffd\ufffd\t:\ufffdH\ufffdWz\ufffd\ufffd\ufffd5xvr\ufffdq=\ufffd'\ufffdi%\ufffd\t\ufffdy\ufffd1\u0123n\u0404]\ufffd\ufffd\u0011\ufffdh\u0522}\u0007\ufffdX\ufffd-W\ufffd\ufffdy\ufffd\ufffd\ufffdB\u0012sS\u0012\ufffd\u0017Jj\ufffdcX\u0010\ufffd\u0003\ufffdW\ufffdZ\u001a\u0001?\ufffd\ufffd\ufffd@\u0000\u001f\u0003\ufffd\ufffd\u0003\b\u0010Y\ufffd9\ufffd\ufffdk?\u04f7!\ufffd\u017e\ufffd\u0012\u0011&sG__\u0011\ufffd\u0001\ufffd\ufffd\ufffd\ufffdX#\ufffd$p\ufffd/\ufffd\ufffd\ufffd\u018a1C\ufffd\u0003\ufffd\ufffd<\ufffdM\u001d77\ufffdxbL\ufffd\ufffd\ufffd\ufffd\ufffd\u0012i\ufffd*\ufffdtpswD\ufffd\ufffd;p\u0006\u0010\u0001\ufffdapQa@\u001c#\ufffdp\ufffd~S\u0018\ufffdk\ufffd\ufffd\u0018\ufffd\ufffd\ufffd=\u0017}\ufffdf\ufffdJ2\ufffdUg\ufffd\u0271\ufffd\ufffd\ufffdLm\u000e\ufffd\ufffd\ufffd#\ufffd\u001a\ufffd\ufffd\u03cb\ufffd\ufffdU \u0001V\u028f\ufffd/\ufffdRi\u0011)\ufffdr\u0255\u0019\ufffd\u0000\ufffdk,\ufffd\u0019\ufffd\ufffd\ufffdh|\ufffd\r2\ufffd\ufffd\ufffd\ufffd>\ufffd^a\ufffd\ufffd\ufffd5{&\ufffd]\ufffd\ufffd(\ufffdi\ufffd[\ufffd6\u000e\u075e\ufffdm\ufffdg\ufffd\ufffd\ufffdU\ufffd\ufffdr8\ufffd[E\ufffd\ufffd\ufffd\ufffd\u000ey\ufffd\ufffd[\u001d\ufffd?\u0005Q\ufffd\ufffdGh\ufffd\ufffdLb\u000b\ufffd8%&\u0002\ufffd\ufffd\ufffd\u0017\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdu3l\u905b\u0003\u052b\u0004\ufffdt]t\ufffd(&\ufffd`\ufffdW\ufffd\ufffd\ufffd\ufffd+I\ufffd\u001c\ufffd\u000b9\ufffd\ufffd\u0015VL\ufffdLC\ufffd\ufffd\r[\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\ufffdE\u0010\ufffdE\u0001(-\ufffd{\u01e1\ufffd\ufffd!\ufffd\ufffd[u\ufffdG\u0016\ufffd\u07575*\u0011z\u001dm\t\ufffdg&\ufffd\ufffd\ufffd\u022a\u0005=eW\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdO}/\u00fc\ufffdb\ufffd\ufffdPqp\u0001l\ufffd\ufffd1=\ufffdat\ufffd'\ufffd\ufffd\ufffd88\u0018\ufffd\ufffd\u0000(\ufffd\b\ufffd`\u0002-h\ufffd\u0007\u000b\b\ufffd8\ufffd\ufffdD $.\ufffd\ufffd\ufffd\u001cuQ\u0180'}\ufffd\ufffdz\ufffdo\ufffdH7\ufffd\ufffdd\u0001\u06ba\ufffd\ufffd_7O\u0014\ufffdo\u0005\u001d\ufffd|^a\ufffd\ufffd\ufffd\ufffd\u001a>5\ufffd\u0016\ufffd:\ufffd\u0002\u0002\ufffdp(O>O6B\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd*\ufffd=)\ufffd\u0007\ufffd\ufffd1 \ufffd\u0000J\ufffd\ufffd1 \ufffd\ufffd\ufffd\ufffdx\ufffd9\ufffd\u000f\ufffd\ufffd\ufffd\ufffd0\ufffd]S\ufffd_k7\ufffdV8=2{\ufffd\ufffd\ufffd\ufffdS_muP\r\u0014y\ufffd\u0105\ufffd\ufffd\ufffdi\ufffd\u007fB\u0003t\ufffd*?\ufffd\u016a\ufffd\u0010\u072b\ufffdJ\ufffd\ufffd9\ufffd'3n\ufffdXet\ufffdi\ufffd\u0019\u0014Q\ufffd\ufffd\u0012\ufffd?/\u0001Z\u001coI \ufffd\ufffdS\u0019_\u05a5\u001d\ufffd,K\ufffd\ufffd\ufffdsz\u0011\ufffd\ufffd!e\u0005O(\u001c{6\ufffd\ufffd\ufffd\ufffd\ufffd\u03a7\ufffdI\ufffdL(\ufffd\u0006\ufffd\ufffd\ufffd&z\ufffd\ufffdxg\""\ufffd\ufffd\u0006\ufffd\ufffdM{\ufffdNm\ufffd9+Si\ufffd\ufffd\u0018V\ufffdq|\u0006\ufffdV\u001f\ufffd\u0017L\ufffd\u07dd\ufffdk\ufffd\ufffd\ufffdp\""\ufffd\ufffdGD\ufffd\ufffd\u02ff7\ufffd\ufffd\ufffd\u0011\u0013\ufffd)\ufffdo~\ufffd\ufffdcS\u0000\ufffd\ufffd\ufffd\ufffd\ufffd;\ufffd\""\ufffd\ufffd\ufffdckj\u0002:ADC6\ufffd&c\ufffd\ufffd};\ufffd:A\ufffd\ufffd\ufffd\ufffd>m\ufffd\ufffd\ufffd\ufffd)\ufffd\ufffd\ufffd\u0546>\ufffd\ufffd\u07a6\ufffd\ufffd\ufffd]\ufffd\ufffd\ufffd\u0015\ufffd\ufffdf\ufffd\ufffd<\ufffd\u0082Z&~\""\ufffd\ufffdL\ufffdnjk>\ufffd~\ufffd\ufffd\u0004)\u06a0\ufffdy\ufffd\ufffd\ufffd\u06cb\ufffd\ufffdN\ufffd\u0015c%y\ufffd\ufffd\ufffd\ufffdju\ufffd\ufffd\\\ufffd\ufffd\ufffd\ufffdl\ufffd9\ufffd\ufffd\u074c\u001c\ufffd9CW\u000e;[\ufffd\ufffd,\ufffdl\ufffdJ\ufffd\ufffd\ufffd0X\ufffd-YS[\ufffd,\u00168\ufffd\u001d,\ufffd\ufffda\ufffd\ufffd&\ufffd\ufffd.\ufffdj\u0013\ufffd\ufffd\ufffd&y\ufffdI\ufffd\ufffd\u07b5\u0007\ufffd\u0011q\u001b\u0016\ufffd\ufffd:\ufffd\ufffd)\ufffdM\u000f\u0650\\\u0016\ufffd\ufffd\ufffd}<\u00101\ufffd\f\ufffd\ufffd]\ufffdI\ufffdd\ufffd(.\ufffd\ufffd\ufffddq\u001a\ufffd \ufffd-\ufffd\u01b9\ufffd\u0006\ufffdT\ufffdt:\ufffd\r\ufffd9\ufffd\ufffd\ufffd\ufffd\ufffd\b\ufffd\ufffd\ufffd\ufffdlF\ufffd\ufffd\ufffd]\ufffd\ufffd5\ufffdT\u000eFY\ufffdyH[\ufffd\ufffd8\ufffd\ufffd:-\ufffd&\ufffd\ufffd@4\ufffd7(\\U\ufffdlkw\ufffd{\ufffd>\ufffd9\u06aa\ufffd\u0679\ufffd\ufffd\ufffdMh\u073c:\u0002(.\ufffd\u001f\ufffd7\u026d\ufffd\u001d\ufffd\ufffd\u001boK\u000f\ufffd_x\ufffd\ufffd:\ufffd\ufffd-\ufffd\ufffd\u0014\u0015\u0007\ufffd\u0007\u007f\ufffdf\ufffdcQ+\u0014\ufffd\ufffd\ufffdM\ufffdVo\b\ufffd?\u000b.\ufffd\u0004\ufffd\u0004\ufffd3\ufffdmc\ufffd\n\ufffd\u001d\ufffdj\ufffdC\ufffd\ufffdB\ufffd\ufffd\r\ufffdM\u001fV#\u0001j\ufffd\ufffd\ufffd7\ufffd4\ufffd\ufffd^WG\ufffdx\ufffd\ufffd\ufffd\ufffdV\u0764\ufffdw)c\ufffd\ufffd\u02e8\ufffdCv.`\ufffd9\ufffd\u0003\ufffd\u001d\ufffd\ufffdy\ufffd\ufffd\ufffd\u0003h\ufffd8$\ufffd\ufffd\ufffdt\ufffd\ufffds\ufffdd\ufffd\ufffd\ufffd\ufffd|<\ufffdq\u0017<\u000b\ufffd%\ufffd\u07e7\ufffd\ufffd\u0018\ufffd+~\u0002{\ufffd\u0011-\u0002\u0018\u001f\ufffdmo\nU3O=O5\u0002\ufffd&}0~\ufffd\ufffdZ\ufffd\ufffd\u001e&%\u0016\ufffd\ufffd\u0005\u001c\ufffd\ufffd9\ufffdc\ufffd\ufffd\u0001\ufffd\u0000\ufffdc\ufffd\ufffd\ufffd9\ufffd\ufffd\ufffd\ufffd#\ufffd\ufffd\u073d\ufffdg\ufffd\tI\u0007BR\ufffd\ufffd\ufffd\u00d7\u0004\ufffd\u0006BB\u0001\ufffd?/\u0007\u0006\ufffd\t\ufffd]\ufffd\ufffd\ufffds\f\ufffdd\ufffd.\ufffd\ufffd\u0597=\ufffd\u000eH\u0017@\ufffd\ufffd\u0004`@\ufffd\u0014\ufffd\ufffd\u0019K\r\ufffd\u0016\ufffd~\ufffd\u000e\ufffdb\ufffd\u000e\ufffdn\ufffd\u0017\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0011\ufffd\ufffd\ufffd\ufffdD\ufffd~%\ufffd0\u3f5e/\u0003tp\u0018i\u03deE\ufffdF9f\ufffd\ufffd)\ufffd\u00160\ufffdK\ufffd\ufffdfk\u0001\u0015\ufffd\ufffdlw\u007f\ufffd\u0012\ufffd\ufffdEz\ufffd\ufffdG\ufffdU\ufffd\ufffd\u05aa\ufffd\u001b\ufffdVv\ufffd\ufffdt3\u06f0\u0100\u0018%-\ufffda\ufffd\ufffd\u0003\f\ufffdL\ufffd\ufffd\ufffdbt\ufffd\ufffd?;OH\ufffdCy\ufffd>H2\u0016\u000e\ufffd3{\ufffd\ufffd\ufffd\ufffd\ufffdt+H\ufffd\ufffdq\ufffdR\u0007\u0014%\""C\ufffd\ufffdz\ufffd\ufffdJ|\ufffd\ufffdQ4\u0016\ufffd\ufffdd-8l;@S\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0010\ufffd,\ufffd\ufffd\ufffd\ufffd\u0019i\ufffd\ufffdk\u000f\u0013V\ufffd\ufffd\ufffd\ufffdJ\ufffd7\ufffd.\ufffdrUNU\ufffd,\udbfe\udf12UeB\ufffd3\ufffd\ufffd$\ufffdW\b\ufffd_\ufffd\ufffd\ufffd\ufffd\u01d7;\u0005\ufffd\ufffd\ufffd\ufffdA\ufffd\u0013=&z\ufffd\ufffd\ufffdr\ufffd\ufffd\ufffd\u001b\ufffd(mE#1\ufffd\u0015\u001e\ufffd\ufffd\ufffd5\ufffd\ufffdw\u0002gY\u001d3j/D;\ufffd\ufffd\u0015\ufffdC\ufffd\ufffd\ufffd\ufffd\u0015\ufffd\ufffd R(iju;\ufffdu\ufffd\ufffdc\tALn\ufffd\u0001\ufffd\ufffd^S2|\ufffd\ufffd\ufffd\ufffdt\ufffd\""\u0699\ufffdO\ufffdG\ufffd\ufffd^\ufffd\\\ufffdC\ufffd\ufffd\u0019\ufffd\ufffd0\ufffd\u007f\ufffd\ufffdZv\ufffd\u0004\ufffdf\ufffd\u0014\ufffd7\ufffds\ufffd\u001aO\u0016\ufffd\u0016K\ufffd\ufffd\u5dcf\u0019qZFe\ufffd\ufffdA\u0016\ufffd\ufffd\n\u0367\u007fB\ufffd\ufffd\rc\ufffdD+5_XM/$TU\ufffd\ufffd\ff\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd*\ufffdV\ufffd>%\ufffdx ??\ufffd\u03cf}[%\ufffd\ufffdlG\ufffd#x=g\ufffd\ufffd\ufffd\ufffdj\ufffd\ufffdGO\u001f\ufffd\ufffd\ufffd3\ufffd\ufffd\ufffd\ufffd__\ufffdq8x~\ufffd\ufffd\u078d\ufffdH\u001c<\ufffd(Q\ufffd\u000b,\ufffd\u014f\ufffdz\ufffdX'I>\ufffd6\ufffd\ufffdl\r6dG\ufffdP\ufffd\ufffd\ufffd\ufffdd\ufffdj\ufffdwJ\ufffd\n\ufffd\ufffd\ufffdQY\ufffdW\f4T\u0014\u001f\ufffdugy\ufffd\u0010\u0005\ufffd8\u007f\ufffd\ufffdmkvqq\ufffd\ufffd\ufffd&\ufffd\ufffd\ufffd\r\ufffd\u00a9\u0006P8\ufffd`\u0010\b\bI\ufffd\ufffd\ufffd\ufffd\ufffdt\ufffd\ufffd\ufffdH^H\u01de\ufffd\ufffda\u0104\ufffd0\ufffd\ufffd+/\ufffd\ufffd8j\u0011\ufffd\u0200\u38f4\u0000\ufffd\u044180\ufffd\ufffde\ufffd\ufffd9f8+\ufffdlp\ufffd.VJ^SU\u0000wP\u00036\ufffd\u000e!\ufffd\u0019\u0000zy|\ufffd\ufffd\u001fn\ufffd\ufffd\ufffd\ufffd_\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u04f3\ufffd\u000ew~\ufffd~\ufffdf\u001c\u0014\b\ufffd\ufffd\ufffd&\u0017\t\n\ufffd\u035bx\ufffdm\ufffd\u001bPH\ufffd&\ufffdI#oWkA\ufffd\ufffdi\ufffd!\ufffd\ufffdF8\t_\ufffd\ufffd\ufffd\u001e\ufffd3L\u001c\ufffd\ufffd\ufffdS\ufffd?\u0014h0S)\u02e7T\ufffd\u0014S,\u0014r\ufffdaXm\ufffd=\ufffdt\ufffdV_\n\u00167T\n\ufffd\ufffd\u0010N\ufffd\ufffd\ufffd\ufffd\ufffd `-\r\u0013\ufffda\ufffd\ufffd\u001b6Dt\ufffd'XG&\u007f4\u0019y\u001d\ufffd\ufffdJ\ufffd\ufffd\ufffd\ufffd- |\u007fPK\u001a\ufffd}\u001d\ufffd\ufffd\ufffd\ufffd\ufffd\u0005\ufffdVs\ufffd\ufffdn\ufffd\ufffd\u0005\ufffd\ufffd\ufffd\ufffdy\ufffdb\ufffd\ufffd\u0012\ufffd95Y\u0016O\u001f\u000f\ufffdO\ufffd\ufffd\ufffd\ufffd\u001f\ufffd8+Z\ufffd\ufffd\ufffdi\ufffd\ufffd]\u00162`2\ufffd\u0017q\ufffd\ufffd\ufffd\ufffd\u0015\u020bL\ufffd6v\ufffdF\ufffd*\ufffd|\u0002G\ufffd\ufffd\ufffd\u000e?\ufffd\ufffd\ufffdi\u0019T^S\ufffd2m\ufffd\ufffd\ufffd~\ufffdf\ufffdM\ufffd\ufffdW}D\ufffdQ\u0000Z~\ufffd\ufffd\u0004/\ufffdd\ufffdr\ufffd\u014dR\ufffd\ufffdh\u0014\u0018\ufffd\tO8\ufffd~#<\u0018\nL\ufffd\ufffd\ufffd7\ufffd\ufffd_\ufffd\ufffd\ufffdx\ufffd\ufffdM\ufffd\u0001\ufffd\ufffdM\ufffd\ufffdh\ufffd\u0010\ufffd\ufffd\ufffd\ufffd\b.\ufffd|\u007f\ufffd\ufffd4L\u0014\u000e\ufffd\ufffd\u0018\u007fg\ufffd\ufffd\ufffd\ufffd\ufffd\u001a)\ufffd\u0019\ufffd\ufffd\ufffd\u000b2e\ufffd\ufffd\no\ufffdp\ufffdI\ufffd\ufffdl\ufffdv\ufffd\ufffdq\ufffd\ufffdF\ufffd\ufffd\ufffd\u0012\ufffd\u0001\ufffd\u001e\ufffd\ucf52w`\ufffd\u04c0\u01a6\ufffd%]\ufffd\u0000\u001c\ufffd\u0012\ufffd\ufffd\ufffd1\ufffd7)\ufffd\ufffd~\ufffd\ufffd*L\u01ba\ufffd]\ufffd/\ufffd\ufffd\ufffd\ufffdS\ufffd%\ufffd\ufffd\ufffd5I&\ufffd\ufffdMy\ufffd\ufffd\ufffd\u0006\u0744uD\ufffd\ufffd\ufffd\ufffd\ufffd[j5\u00027\ufffd\ufffd|\ufffdF\ufffdk\u000b\ufffd\ufbacuFs\ufffd\u0088]\r\ufffd\u0015\ufffd\u0690\u04db\ufffd\u0567ud&\ufffd\ufffd]\u0019\ufffd\u075f\u0019\u001a\ufffd\ufffd\ufffdu\ufffd\r\ufffd\u000bp\u0015\ufffd\u0382\u048d\ufffd\ufffdx\u0010\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u000e\ufffd\ufffd\ufffdkgL\u001b\ufffd\ufffd\ufffd\ufffdEAx'+\u007f\tG\ufffd\ufffd7\ufffd\ufffd\ufffdu#\u0244\u0007\u000f?\ufffd\ufffd\ufffd\ufffd\u027c6\ufffd\ufffdA\ufffd\ufffd[\ufffd\u000bz\u0018\ufffd\u0005dnh\ufffdO\ufffd\u014e \ufffdoi\ufffd/\ufffd\b\ufffd\ufffd5\u0001\ufffd\ufffd\u0010y\u0014\ufffd\""u\r\ufffd\u0007\ufffd'\ufffd\ufffd7.Ndc\ufffd\u0017}Z\ufffd\r\nendstream\r\nendobj\r\n790 0 obj\r\n[ 636] \r\nendobj\r\n791 0 obj\r\n<>\r\nstream\r\nx\ufffd\ufffd;}|T\u0555\ufffdw\ufffd|e>\ufffd!`\u0006\ufffd7\fAM\ufffd\fdH0\n\ufffd$\ufffd\u001d\u0010\f!\ufffd\u0004#\ufffdd\ufffdd0\u024c3\u0013 \ufffd\u82a6\ufffd\u000b\ufffdK]\ufffd\ufffd\ufffd?[[\ufffd\ufffd\u0247\ufffd V*\ufffdU\ufffd\ufffdR\ufffd\ufffdv\ufffd*[?\ufffd\ufffd\ufffdZ\ufffd\""\ufffd\ufffd\ufffd;oB(\ufffd\ufffd\ufffd\ufffd\ufffd\u001f\ufffd\ufffd^\ufffd\ufffd{\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0000\u0004\u0000\ufffd\ufffdQP\ufffdo\ufffd\ufffd\ufffd\ufffd\ufffd\""\u0000\ufffdDjk{w \ufffd\ufffd\ufffd\ufffd{\u0001\ufffd \ufffd\ufffd}{Bn\ufffdz\ufffd\u001d\ufffd\ufffd1\ufffd\ufffd\ufffd\u044e\ufffd\u0002\ufffd\ufffd\ufffd\u0002\ufffd{P\ufffdO;\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001c\u001d\ufffd\ufffd=\u0000\ufffd\ufffd\ufffdP \ufffdn\ufffd\ufffd\u000e\ufffd\ufffd\u0001\ufffd\ufffdN$X\u000e\u001b\ufffdAY\ufffd\u0011\ufffd\ufffd\u065d\ufffdY\ufffd\ufffdv\u0010\ufffd\ufffd\u0001\ufffd4]\ufffd\ufffd@\u02cb[\ufffd\u0006(\ufffd\u000e\ufffd\ufffd\ufffd\ufffd\u03a8~\ufffd\ufffd\u0002\ufffd\ufffd \ufffd\ufffd\u001dJ\u0004J\ufffdm\ufffdU\u0000\ufffdN\ufffd\ufffd{\u0002\u0761O\ufffd\ufffd\ufffd\ufffd\u0000eI\ufffd\ufffdj4\u0012O\ufffd\ufffd\u0003\ufffd)\ufffd\ufffd?\u001a\u000bE\ufffd_u\ufffd\ufffd\u0000\u000e\ufffd\ufffd~\u0000\ufffdW\ufffd\ufffd\ufffdK\ufffd\ufffd{\ufffde\ufffdo8\u0019\u02e3\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd?\ufffd\ufffd\ufffd\u0017\ufffd^\u001d\ufffd_\u000f\u0002d\n\ufffd\ufffd\ufffd\ufffd\u0000\ufffd\ufffdp\ufffdZ\ufffd\ufffdK\ufffdT\ufffd\ufffdQ\ufffd^p\ufffdk\u0004\ufffd\ufffd\u0017Z\u0000\u013b\ufffd\u0007\ufffd\""R\u001b\ufffd\u0003\u0012\ufffd\ufffd%\u001f\ufffd,\u030c\ufffd>\ufffd)<\ufffd\u0003!GCE\ufffdR\ufffd\ufffd\u0003MZ\u0001y3\ufffd\ufffd\ufffd\ufffd\ufffd6\ufffd2((9\ufffd\ufffd\ufffdj\ufffd\u0017u9\ufffd1\u0019\u0203\\o\ufffdt\ufffdy\n\ufffdN5Ix%c\ufffd\ufffd\ufffd\ufffd\ufffdo\ufffd\ufffd\ufffd3\ufffd\ufffd\u000f\ufffd|\ufffd\ufffd_\ufffdh\ufffd\u0005\ufffd\ufffd\u007f\u0266\ufffd\ufffd\ufffd\ufffdY'n\ufffd\ufffd-\ufffde\ufffdL\ufffd\ufffd2]\ufffd\ufffdt\ufffd.\ufffde\ufffdL\ufffd\ufffd2]\ufffd\u02dfS\ufffd\ufffd?\ufffd\ufffd*\ufffd}>\u000f}r\ufffd\ufffdv\ufffd\ufffdM\u0016A\ufffdQ\ufffd\u001dD\u0006\ufffd\u0002l\u001a\ufffd\ufffd\ufffd\u001d\u0011\u0004\ufffd\ufffd\ufffd^\ufffd\ufffdI*\ufffd\ufffd\ufffd\ufffdX45y\ufffd9\u0626?\ufffd\ufffdR\ufffd\ufffd`o\u0004\u001dzOa\u001e\u0014\ufffd:\bB,\ufffdF\ufffd\ufffd,\ufffd\ufffdE\ufffd\ufffd\ufffdO9\ufffd9Wmnnj\ufffdT\ufffdq\u075a\ufffd\ufffd\u0792\ufffd\ufffd\u0005\ufffdN{^\ufffd\ufffdd\ufffd\ufffd\ufffd\ufffd\ufffdba\ufffd\ufffd\ufffd\u001d\ufffd\u001c\ufffdk;\ufffdAwMk\ufffdB\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdr5-\ufffd\ufffdH\ufffd\ufffd\ufffd\ufffdU\ufffdM\ufffd\ufffd\ufffd9k\ufffd\ufffd1$s\ufffd\ufffdBa-k\u06d2\ufffdm\ufffd\b\ufffdk\\.\u0017\ufffd\u475d\u0019K\u001f\ufffd}\u0494\u001cN*\ufffd$\ufffd&\u000fy\u000e\r\ufffd>f\ufffd\ufffd\ufffdbc\ufffd\u001d\f\\\u0558\u0014\u0003\ufffdk\b\u0418\ufffd\ufffdFf\u0013k\ufffd\ufffdr\ufffd\ufffdj\ufffd9\ufffd\ufffd\ufffd\ufffd\ufffd:[\ufffdw\ufffd\ufffd)\ufffdH\u03afn\ufffd\ufffdu\u0211\ufffd\u01716i+N\ufffdF\ufffd\ufffd\u05fd\ufffd\u0010\u0007kg\ufffde\ufffd\u000e\u000e\ufffd*'\ufffd]\ufffd8y\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdY\ufffda\ufffd{U\ufffd\ufffd\ufffd*\ufffd\ufffdj\ufffdu00\ufffd\ufffdos\ufffdV\ufffd\ufffd\ufffd\ufffd?\u0018\ufffdm\ufffd\ufffd\ufffd\ufffd1I\ufffd~\ufffd6Gr\ufffd\ufffdMIkk'\ufffd\u0014]f~\ufffd\ufffdk\ufffdt\ufffdl(\ufffd\ufffdb\ufffd\ufffd6\ufffd@\u001b\""\ufffd\ufffd+\u001b3\ufffd\fm\ufffdaP\ufffd\ufffdMI\ufffd\ufffd\ufffd\u001c\ufffd\ufffd\ufffd\ufffd\ufffdf\ufffd\ufffd3\u0013\ufffd[\ufffd<\ufffd\u054d\ufffdC@\ufffd\ufffd\ufffdn\ufffd\ufffd\u034dr\ufffd`\ufffdj\ufffdJ\ufffdd*,)Tc\ufffd//F\ufffd\ufffd\ufffd\ufffd'\ufffd\ufffd\ufffd\ufffd\u0000\u0001V\u000e\ufffd\ufffd\ufffd\ufffdC\n\u0019\ufffd\ufffd\ufffd8n\u0005\ufffd\u0007\ufffd\u001b\ufffd\u0005\""T\ufffd\ufffdl\u001a\ufffd\ufffds\ufffd\ufffd2\ufffd+N\u0015\u0018\ufffd\u0011\u0019\""3\ufffdI\ufffdCD\ufffd\ufffd\u001d\ufffd}\ufffd\ufffd,\ufffd\u0004\ufffd\ufffd\ufffd\u0011\ufffd4]\ufffdF\ufffd}L\ufffd\u042c\u0019E\u000b\ufffd\""\u0005\ufffd}\ufffd\u0018\ufffd\ufffd(Yn\ufffd4]\ufffd\u059f\ufffdH\ufffd\ufffd\u1315\ufffd\u001c\u0000\u0001\u001f\u0004>\ufffd)C\ufffd|V\f\ufffd\ufffdS\ufffdQ0\t\ufffd!\ufffdH\ufffdH9\ufffd\ufffdz\u0002#Fb\""\ufffd!\ufffdY\ufffd\ufffdc\ufffd\u007fH\ufffd82\u001c\ufffd\u0221d\ufffd\u001f\ufffdt\u05b0M\u034d#F\ufffde\ufffdGE+YQC<9\ufffd,\ufffd,\u0635\ufffd:\ufffd\ufffd\ufffdk\ufffd`R\ufffd\ufffdxCS\ufffd`k\u0013\u06ef7\ufffd5I\ufffd\ufffd\u034d.\ufffd5)\u0017\ufffd\ufffd\u0018\ufffd\ufffd\ufffd2\ufffd\ufffd\ufffd\ufffd(\f\ufffd7&\ufffd\u0002&\ufffdp\ufffd\ufffd0I\ufffd\ufffdY\ufffdNnq\ufffdt1O\ufffd\r\ufffd>\u0017\u0012\ufffdIY\ufffd\ufffd\u0011\ufffd\ufffd`\ufffd\ufffd\ufffdA\u0019\ufffd\u001b#\ufffd\ufffd\u0418\ufffd\ufffd\u0014\ufffd\ufffdFIM\ufffd\ufffd\ufffd,\ufffdcv\ufffd{\u0012j\u0125|s\ufffd\ufffdf\ufffdnB\ufffd\ufffdYm1\ufffd\u0180\ufffd\ufffd\ufffdd\ufffd\ufffd\ufffd\ufffd\ufffd$\ufffd\ufffdz\ufffd\ufffd\ufffd?T\u000e\ufffd~\ufffd@U:x\ufffd`\ufffd\ufffd\ufffdv%\ufffd0\u016a\u001d\ufffd\ufffdg7q\th\ufffd}\u0312\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd|N\ufffd\ufffd\ufffd\u05e5'\u001aN\ufffd\ufffd\u001a~\ufffdz\ufffd\ufffd\ufffdki\ufffd\u0013\u001f\ufffd\u0010\ufffd'\ufffd\u0018\ufffdh\u0018\ufffdc\ufffd\ufffd\u0011\u001c,U3H\r8\ufffd\t\ufffd\ufffdT\ufffd[OV\ufffd\u0016l\u0002\ufffd\""\u001e\ufffd\ufffd\ufffdBXB\ufffdC\u0003\ufffd\ufffd\ufffdU\u0648B*\ufffd\u0018\ufffdd\u0005\\\ufffd\ufffd\n\ufffd\f\u000f^'Y\ufffd\ufffd\u001f\ufffde\u00d5k\ufffdc\ufffd9\ufffd!\u001b\ufffd\u000e\u001fc\u00dcar\u0014\ufffd\ufffd\u001e\ufffdi\ufffdp\u000b\ufffd\ufffdU\u000e|\ufffd\u0015\ufffd\u000b\ufffd\u0001\ufffd\ufffd2\ufffd\ufffd\t\ufffdrTZ\ufffdB.\ufffdq1\ufffd\u00158.\ufffd\ufffd\u0012\u0558\ufffd\u0123\ufffd/t\ufffd/\ufffd9\ufffd2~\ufffdv\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u001f\ufffd\ufffdU\ufffd\ufffd\ufffd,\ufffd\ufffd\ufffdU\ufffd\ufffdZ\ufffd\ufffd\ufffdc)\ufffd\ufffd[\ufffd|\ufffd\u8b46\ufffdDg^\u0017\ufffd\ufffd\ufffd\u01343\u0007\ufffdZ\ufffd\ufffd\ufffd\ufffd\""dd\u0002\ufffd\ufffd\ufffd\u0012u\ufffdB\ufffd\u0019\ufffdp\ufffdUeF\ufffdAl\ufffdc\u0013\ufffd\ufffd\ufffd3\ufffd^\ufffd\ufffd\u0006r\ufffd\ufffd]c\ufffdX\ufffd\ufffd\ufffdW\ufffdn\ufffd/\ufffd\ufffd\ufffdv\u001dm\ufffd\u001c\ufffd\u001e\ufffdu\ufffd\ufffd\ufffd\ufffd\u001c}\ufffd&\ufffd\ufffd\u0007\r\ufffdB\ufffd\ufffd\u0003\ufffdqH\u001fR\ufffd\u000e_\\Zn\u001d\ufffd\ufffd\ufffd\ufffd\r\ufffd\ufffd\ufffd\ufffd\ufffd}\ufffd\ufffd\ufffdW\ufffd\ufffd\u001c6\u001c\u001a>>,0\ufffd\ufffd\u00133g\ufffd;k\ufffd\ufffd\ufffd\ufffd \ufffd\u07f4e\ufffd\u0010\ufffd'\u000f\ufffd?^/\\\ufffdq&\ufffd\u06d8O7\ufffd\u0360\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd|)]}y)]\ufffd\ufffd\ufffd\n\ufffd\ufffd\ufffd\ufffd.\ufffd\\NWT\ufffdhu\ufffd\u001c\ufffd\ufffd\ufffd\ufffdVaS\ufffdU\ufffd\ufffd\ufffdR_\ufffd\ufffd\u0296\u0432%\ufffdtI\ufffd\\\ufffd\u02927\ufffd\u001c_\""\ufffd\ufffd?\u001c\u0019-\\S>\ufffd~sd\ufffd\ufffd\ufffd\ufffdC\ufffd4\ufffd\ufffd\ufffd\ufffd\u0016\ufffd\ufffd\ufffdGn\u0019A\ufffd\ufffd\ufffd\ufffdp\ufffdSJzD?\ufffd|\u013e\ufffd~a \ufffdF\ufffd\ufffd;\u0005\u02d7\ufffdx@P\ufffd%\ufffd\ufffdr\ufffd\ufffd\ufffd\ufffdr\ufffdK3\u0011\ufffd;\ufffdQ~\ufffd\ufffd<\ufffd\ufffdf\ufffdn\u02dd\ufffd\ufffd,{\ufffd7;\ufffdt\ufffd\u5f73\u007fw\ufffd\ufffd]w\ufffd\u067d\ufffd\ufffd=\u0003\u0016\ufffd&\ufffd\ufffd\ufffd\u0012s\ufffd\u0004\ufffdZ\ufffd\ufffd\ufffd\ufffdM\ufffd\ufffd\ufffd=R\ufffd\ufffdG\ufffd\t\ufffdw\ufffd\ufffd\n\ufffdF\ufffd\ufffd\ufffd&(\ufffd}\u0001\ufffd\ufffd\ufffd,\ufffd\u06e8\ufffd^H\ufffd\ufffd\u0015\ufffd\u021eG/\ufffd\u03e0N\ufffd\\\ua4ab\ufffdl_F_(\ufffd\ufffd\u0005\ufffd\ufffd\ufffdQ\ufffd\ufffd\u0016\ufffdK\ufffd\f\ufffd\ufffdCss\ufffd\u0005\u0506-j'\ufffd\ufffd\ufffd\ufffd\ufffdb.r\ufffd\ufffd\ufffd\u000e\ufffd\ufffd\ufffdg\ufffdN\ufffd!\ufffdS\ufffdM:\ufffdw\u04a7\ufffdNq\ufffd\ufffd\u0014\u000e\ufffd\ufffdd\ufffd\ufffd\tO\ufffd\ufffd\ufffd\ufffd-r\u001ez\ufffd\ufffd\ufffd\ufffd\ufffdp\ufffd\ufffd<0\ufffdr>\ufffd\ufffd\ufffd|\ufffd\ufffdwL\ufffd\u001c\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd2\ufffd\u001fx\u02b8\ufffd\ufffd1\ufffd\ufffd`\ufffdAA\u0019\ufffd\u001f\u0017,\ufffd+\ufffd\ufffd\u07ffk?\ufffd\ufffd\ufffd\""\u0018A\ufffd\ufffd/\ufffdO\ufffd\ufffd\u0019\ufffdK\ufffd\ufffd$\ufffd\u0005D\u0014\ufffd\u00166H\ufffd\ufffd\ufffdI2\ufffd\u000f\ufffd\u001eJ\ufffd\ufffdc\ufffd\u07f8r(\ufffd\ufffd\u061f\f\u05ad\ufffd}\ufffd\u001ds\ufffd{\ufffd\ufffd\u04c4G\ufffd\u001f\ufffd^$I\ufffdlJ\ufffd\ufffd\u001bU\u0010\ufffdY\ufffd'\ufffd\ufffd\ufffd)JR\ufffdMjj;\u0003I\ufffd\ufffd&\ufffd\u00103C\ufffd\ufffd\ufffd7\ufffd&-\f\ufffd\ufffdk\ufffdI\ufffd^\u06d9\ufffd#t\ufffd\ufffdx\ufffd\u0014\ufffd\ufffd\u024c\""\ufffdA\ufffdT:\ufffd-\t\ufffd\u0019|5\ufffd_\ufffdA\ufffd\ufffdq\ufffd\ufffd?q\ufffd\ufffdbuu\ufffdb\ufffd\\\ufffd]:.\u001d\ufffd7\ufffd\u0016\ufffdg\ufffd\ufffd\ufffdw\ufffdGS;S\ufffdT\ufffdx/8\ufffd\u0017\u001e\ufffd\ufffd\ufffd\ufffd\ufffd?&.\u007f\u0007\ufffdY>n\ufffda8\u0004\ufffd~\ufffd\ufffd\ufffdF\ufffd\u0017\ufffd\n\u07c7\ufffd\ufffdG\u0013\ufffd\ufffd\ufffd\u0001\ufffd\u0006$\ufffd\ufffd\ufffd\u00e9\u000f\ufffd\ufffd\ufffd1\u0018\ufffd\u0003p\u0018i\u0003p7R\ufffd\u0002\u07dc\ufffd\u0017\ufffd[\ufffd.\ufffdg\ufffd\u0007\ufffd\ufffd9*\ufffd\ufffd`'\u0019\u000b\ufffd\u0007\ufffdp\ufffd\ufffd\u025dP\u0000\u001e\ufffd\ufffd\ufffd \u000e\ufffd\ufffd[\u042e\ufffd\ufffdZ\ufffd-G\ufffd\u0006\ufffd\ufffd`'\u0703\ufffd\ufffd)\u007f\ufffd\ufffd\u001c\ufffd\ufffd\u0016\ufffd\u0006=0\ufffd\u001c\ufffd\ufffd\""\ufffd\ufffd\ufffd-x\u001b\ufffde\u02b5p\u001d|\u0001\ufffd\u0015\u001e\ufffd\ufffd\u042e\ufffd\u0432\ufffd\ufffd\ufffd)\ufffd\ufffd(\ufffd\u0004\u0017$\ufffd}k\ufffdH\ufffdQx\u000e=z\u0004vk\ufffd`\ufffd/\ufffd#,\ufffd\ufffd\ufffd\ufffd\u0016\ufffdG\u0001R\ufffd\ufffdo\u0000\ufffd6\ufffdc\ufffd!\ufffdnx\\\ufffd\u0006k'\ufffd\ufffd\ufffdb|\ufffd\u0001\ufffdt\ufffd\\e\\\ufffdxF\ufffd\ufffde0\ufffd\ufffdt(\ufffd\ufffd\ufffd\u01e9\u01d1snj \ufffd~\n\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\uf8e4\ufffd0\ufffd\u0692jJ\u000b\ufffd\ufffdp\u0003\ufffdz\ufffd)\ufffd~\ufffd3\u02a7\u0003\ufffd\ufffd\\\ufffd\ufffdC\ufffd\ufffd\u0011\ufffd\ufffd-p=\u008fb\ufffd\ufffd\ufffd<>\ufffd\ufffd\ufffd~\ufffd!;1\ufffd{\ufffdv\ufffd\t\ufffdo\ufffd\ufffdx\ufffd\ufffdA\u001f\ufffdav\ufffdp\u001bj\ufffd1b\ufffd\ufffd]\u000b\ufffd\ufffd\u001fl\""\u000e\ufffd'5\u0002\u0005\u05bc/\ufffd\ufffd%\ufffd-^\u4cb9l\ufffd\ufffd\u0011\ufffd:\ufffd/\ufffd\ufffdl\ufffd~\ufffd\ufffd&\u00107v\""F\ufffd\ufffd\u000e(\ufffdD<\u0014\ufffd\ufffd$\ufffd\u0005\ufffdd-\ufffdh4\n\ufffdh\ufffd\ufffd\""\ufffd\ufffd\u007f6j\ufffd\n\ufffd\u0010\ufffd`\ufffdb\ufffd\ufffd\ufffdQ\ufffd\ufffd\u0003?\u001a\ufffd\ufffd\ufffdL)\u0006\ufffd^\ufffdd\ufffd\ufffd\ufffd y[\ufffd\ufffd\ufffd\u0599\ufffdZ\ufffd\ufffd\ufffd[\ufffdx\u0011\u0011\ufffdb\ufffd\ufffd\ufffd'\ufffd\u0005\ufffd\ufffd~\ufffd\ufffd\u07d7\ufffd|\ufffd\u0002]z\ufffd\ufffd*^\n\ufffd&\u001e\u0011\ufffd\ufffd\ufffd-Y\ufffd\ufffd\u00104\u001aQK,zE/\ufffd\u001e`\ufffdT\ufffd\ufffdz\ufffd\ufffdZ\ufffd\ufffdP\ufffd2\ufffdwYF\u001c\ufffd\""-\ufffd\ufffd\ufffdk\ufffd4\ufffd3O\u000b\u056c\ufffdo\ufffdG\ufffd\ufffd\ufffdZ\ufffdh\ufffd=\ufffd~}\u001e\ufffd)z\ufffdR\u001d{\ufffd5\""\ufffdY\ufffd,\ufffd\ufffd\u051b\ufffd\u0011\ufffd\ufffd\ufffd9A\ufffd\ufffd\ufffd\ufffdR<'n6\u0012\ufffd\u0150c\ufffd\ufffd$Ac\u052c\ufffd\u001b\ufffd@\r\u0016#\ufffdFb\ufffds\ufffd\t`3)Vb\ufffdi\ufffd\ufffd\ufffdDo5\u000b\""\ufffdr4\ufffd\ufffd\ufffdQ#1z[|\ufffdfV\ufffdz[r+*x\ufffd\ufffd\ufffdZ|H\u039dY\ufffd\ufffdy}\ufffd\u0017\ufffd\ufffd\ufffd\ufffd\u0016\ufffd-\ufffds\ufffdI\u0017\u0016\u0016.\ufffdD\ufffdX8S\ufffd\ufffd*\ufffd\ufffd\ufffd\u001b\ufffd\u0517\ufffd\ufffd\u07e7\ufffd\ufffd\ufffdl\ufffd\u0728%\ufffd(\ufffd\ufffd\ufffd\u001d=\ufffd\ufffd\ufffd#\ufffd\ufffd\ufffd\ufffd\ufffdr\ufffdk\ufffd#\ufffdO?\ufffdy\ufffd\ufffd\ufffd\u03e9t\u0012sg$\ufffd)e\r\u0006r\ufffdp\ufffdTn\ufffd\b\ufffdbDj5\ufffd\u0012\ufffd\ufffd.)j\ufffd\u0664o04\ufffdA1!\ufffd\ufffdE\ufffd \ufffdz\ufffd\u0000\u0002U\ufffd\ufffd1\ufffd\ufffd6\ufffd6\ufffd\t\u0001\ufffd\ufffd\ufffd*,\ufffdTaI\ufffd\n\ufffd.P+\ufffd\ufffd\ufffd\u0014\ufffd6G/\u0012\ufffdNo\ufffd\u0011%\ufffd\u0294>\r\ufffd\u06ad@3\b\ufffdO \u0007rT\ufffd\ufffdbb\u001bD\ufffd\ufffd\\&\r\ufffd\ufffd\u001f+\ufffdl\ufffd\ufffd\ufffd\ufffd\ufffd\u02a4\ufffd\ufffdm-(\ufffd:f\ufffdL\u001a\ufffd5\u001a\ufffd\ufffdi\ufffd\ufffd\ufffd\ufffd\rfQ\u04a9\ufffdI\ufffd\ufffd\ufffd\ufffd.'\ufffd\ufffd9\ufffdY22\u0019\u0012\u07de\u0012e\ufffd<\ufffd\ufffdi\u04ce\ufffdO\ufffd\u0748\ufffdO\ufffd\u001c\ufffd\u0010M\ufffds\ufffd\ufffdQ\u018f\ufffd\ufffd\ufffd\ufffd\ufffd\u0002\u001a>\ufffd\ufffd\t\ufffdv\ufffd\ufffd'\ufffd\ufffdc\ufffd\ufffd\ufffd\\\ufffdmf\u0005n\ufffd\ufffde\ufffd\u0015\ufffd\ufffd\ufffdO\ufffd\ufffd%t\u001b\u0015Z\ufffd\ufffd\u0017M\ufffd\ufffd\ufffd&L5\ufffd\u0356\u0018\ufffd\ufffd\\n\u001bq\u0013\ufffd\u001b\ufffd>\ufffdN>\ufffdj\u06de\n\ufffd\u00133\ufffd\ufffd\ufffd\ufffd\u0003]\u98f4\u001awl\u001e\ufffdQ;\ufffd\ufffde\u0005\ufffdf_\""\ufffd/X9{\ufffd\u0728\ufffd\ufffdD\ufffd\ufffd\\\""\u0624YUfJtsWJ\u0006\ufffd]\ufffd\ufffd\ufffd\ufffd&Rq\u001c\ufffdb\ufffd\""-\u001f\ufffd\ufffd0\ufffd}\ufffdc\u001e\u0006\u0006(&\ufffdP0O\ufffd\u0019K\ufffdT\ufffd\ufffd6X$\ufffd\u000e#\ufffd\u03a8\u001a\ufffd\u328d\u0007\u0017\ufffd=j\u0017\ufffd\ufffdl\u001c\ufffd\ufffd0i\ufffd8\ufffdn\ufffd\ufffdphy \ufffd\u001a\ufffd^\ufffda\ufffd\u000b\ufffdc\ufffd\ufffds\u001a\ufffd73\ufffd_\u03d9\u0011?\ufffd\ufffdg\ufffd\ufffd\ufffd\ufffdY\u000e\ufffd\u0006\ufffd\u001e\ufffd\ufffd\ufffd2\u0011\b\ufffdv?\u000b\ufffd~ oR\ufffd\ufffd\ufffd\u0015\ufffd\ufffd\ufffd|^\ufffdtUV.;S\ufffd\ufffdV\ufffd\ufffd\ufffd\ufffdc\ufffd\ufffdM\ue6d1\t\ufffd\u00183\u0014\ufffd/\ufffd\ufffd\ufffd0T\ufffdo4-\ufffdx\ufffd=\u0006\ufffd\ufffd\ufffd\u07e5-_i\ufffdKZ\ufffd\ufffd\u0018\u001bz\u0018c\ufffd\ufffd\ufffd\ufffd\ufffd\t\ufffdl\ufffd5@\ufffd\u0001/$6\ufffd6Z\u000e\ufffd8\ufffd\ufffd#\ufffdG\u001b&\ufffd\u0018\ufffd\ufffdSj\ufffd`\u01e7\ufffd\ufffd\ufffdf\u0005\ufffdh\ufffd\ufffd/\ufffd\ufffd\ufffd\ufffd&\ufffd@\ufffd\ufffdnJ\ufffd\ufffd\ufffd\ufffd'\ufffd6e\ufffd-\ufffd7R\ufffdJ}\ufffdzK|\ufffd\ufffd\ufffd/\ufffdH\u061fh2\ufffd\ufffd\u00075\u001aa\ufffd\ufffd\ufffdA\rf\ufffdF\ufffd\u001d#k\ufffd\u001c\ufffd\u000eK:\u0003;\ufffdtO\ufffdb\u0002Z\ufffd\ufffdW\ufffd\ufffd\ufffd\ufffdg\ufffd\ufffd\ufffd\ufffd\ufffd\u0001h\ufffd\ufffd3\ufffd#\ufffd'y\ufffdRO\ufffd\ufffdF\u001e\ufffd\ufffd\ufffd\ufffd\u0015\u001f\ufffd\u0003g\ufffd\b\ufffd\ufffd;i\u02d9\ufffd\u000b7\ufffd~\u000eq\ufffdy\ufffdV\ufffd\nF\ufffd\ufffd\u001al6|k\ufffd0S*\ufffd\ufffda\ufffd\u044cy\u001d\u0011E\ufffd\ufffd4~\ufffdj\ufffd\u0005R\ufffd\u0002\u0724\ufffdc\u0015\ufffdz|}0{r+l\ufffd\n\ufffdf\ufffdJi\ufffd\f\ufffd\ufffd\ufffd|r\ufffd\u0012\u0017\u001d:\ufffd\ufffd\ufffdCd\ufffd\ufffdN\ufffdnx\ufffd\ufffd>!c\ufffd5\ufffd\ufffd\ufffd{\ufffd\u0551\ufffdR\ufffd7\u000ef\ufffd'N\ufffd\u0006\ufffd\u07ebg\ufffd\u0012\ufffd\ufffd\ufffd\u007f\ufffd\ufffdK\u007f\ufffd\ufffd\ufffd\ufffd\ufffdt\ufffd\ufffd\ufffdu\ufffdN\ufffd\ufffd\ufffd\u0017\ufffd\ufffd\ufffdW_\ufffdVz\ufffdt\ufffd\ufffd\u007fK\u0015\ufe8b\ufffdU\u0013\ufffd\ufffd/\ufffd\ufffd\u001f6\ufffd\u001d\u001f1\ufffd?\u0001!\ufffdK\ufffdE\ufffd\u0000\ufffdU\ufffdN\ufffd\ufffd\u0006\u007f\ufffd\nk&\u0475p\ufffd\u0004\ufffd\ufffd\u0019\ufffdg`=\ufffd\ufffd\u001e\u00156\ufffd\ufffd\ufffd>\u00156C\ufffd\u0010d\u007fiAE\ufffdk\u0014\ufffd\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\u0000\ufffd5\ufffd\ufffd\u0018\ufffd\ufffd\ufffd~\ufffd\ufffd:\u000e\ufffd\ufffda=J\n\n?Qa\u0002fq\ufffd\n\u000b\b\ufffdH\ufffdE(\u0015GU\ufffdN\ufffd`\ufffd\ufffd\ufffd\nk&\u0475\ufffd}\u0002\u05a1\ufffd\ufa70\u001ef\ufffd)\u00156\ufffd\u0003\ufffd@\ufffd\ufffdP\ufffd}\ufffd\u00c6I\ufffd\ufffd0;\ufffd'9l\ufffdD73X\ufffd\u1c15\u0669\ufffd\ufffdp\u001e\u00b9\ufffd\ufffd\u001c\ufffdO\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0017\ufffd\ufffd\u001cv0\u001eU\ufffdI<\ufffdI\ufffd|\ufffd_\ufffd\ufffd\u001c\ufffdc\ufffdn\ufffd\u037aI\ufffd\ufffdF\ufffd\ufffd\ufffd\u02e5\ufffd\u0016\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdH<\ufffd5!WGb\ufffdH,\ufffd\bGzJ\u4aae.\ufffd.\ufffd\u0459\ufffd\ufffdu\ufffdx(\ufffd=\u0014,i\b\u0142\ufffd\ufffd\ufffd\u001c\ufffd\ufffd\u00019\u0011\u000b\u0004C\u0741\ufffd5rd\ufffd\ufffd\ufffd\fM\u0012\ufffd\u0011\ufffd\ufffdF\u0019\ufffd=\ufffd\u001d\r\ufffdC\ufffd\ufffdK\ufffdB\ufffdB\u001d\ufffd]\ufffd\u0018\ufffdqT(\ufffd\ufffd\ufffd|\ufffd\u0002\t\u0014\ufffdC\ufffd\u000e\ufffd\u0012\ufffd\ufffdYy\ufffd\ufffdh\ufffd+\u001c\n\ufffd[#=\ufffd\u0012\ufffd)\ufffd+w\u0007\ufffd\ufffd\ufffdx\b\u0015\ufffd1\ufffd,'\""r{,\u0014H\ufffd/\ufffd\u001f\ufffd\ufffd\u0015\u0010\ufffd\u0018\ufffdR\u0001\ufffd\u001e\ufffdC\ufffd\r\ufffd\ufffd\tB\ufffd\ufffd3\ufffdc;;\ufffd\u0011\u00128\ufffd\ufffd\ufffd~\u0000iA\ufffd~qH|Z|\u0006\u06f8x@\ufffd&|\u001dd<\ufffd\u0016\ufffdb(Gh\u001d\ufffd\ufffd\u001d\ufffd\""\u0010\u01f6\u0015\ufffd\ufffdP\u0365Ey\u001f@J\u0018\ufffd\u001e(\ufffd\ufffd*\ufffd\u07c5c\u001d\ufffd:\ufffd\u0013\ufffd\ufffd\u001c\u000b\ufffd\u0018B\ufffd\ufffd\ufffd\u0007\ufffd\ufffd\ufffdcAnG\u00009\u009c\ufffdA\t.3\ufffd\ufffd\ufffd\u073ek\ufffd\ufffd\ufffd\ufffd\ufffdN\ufffdNmQ\u0007\ufffd{\u0466,w;\ufffd\u07483\ra\ufffd\ufffdd\ufffd\ufffd\ufffd\ufffdg\t\ufffd\ufffd\u0003%uq\ufffd\u0678\ufffd\fe(\u0147u\u001d\ufffd;c\ufffd\u000e\u001e\u0011\u019d\ufffd\ufffdS\ufffd\u0017\ufffdEQj\ufffdG@F:\ufffd\ufffd\ufffdQk\ufffd\ufffd\ufffd\ufffd>\u001c{y\ufffd2\u001eg\""\ufffd\ufffdf\ufffd\b\ufffd.\ufffd\u001c\u0001\ufffd\u0443x\ufffd\ufffdE\ufffd\ufffd}\ufffd\ufffd\u0270\ufffd\ufffd\u0018\ufffde\u05b6\ufffdRB*\u001e\u0ca3\ufffd\ufffdn\ufffdJ\ufffd9\ufffd\ufffd\ufffd\u06d1\ufffdx\u0017\ufffd\ufffd\ufffd\ufffd\u0695Y\u0011\ufffd\u044e\ufffdG\ufffd:\ufffd\ufffdO\ufffd^\ufffd\ufffdA\\\u04ce\ufffd\ufffd\ufffd+\ufffd[2z=\u0013z~\u07c30\ufffd\ufffd\u000e\u001e\ufffdv\uc9ce\ufffd\u000e\ufffdS\ufffd\u074e\ufffd\ufffd\ufffd\ufffd\u0015\ufffd2\ufffdlM\u0017\ufffd.B\ufffd\ufffdqd;\ufffdM\ufffd\ufffdT\ufffd36\ufffd\ufffd\ufffd=+=\ufffd%u -\ufffd\ufffdk\ufffdg\ufffd}\ufffd\ufffd\ufffd\u0283\ufffd\ufffd\ufffd\ufffd\ufffdl\ufffd\u001e`\ufffdd|Ip}\ufffd'\ufffd\ufffd\ufffd\ufffd\u001aD\ufffd\u000e\ufffdy\ufffd?}\ufffd\ufffd\ufffd\u0002\ufffd\ufffd\u0010\ufffdKD\ufffd3^e\ufffd^\u0122\ufffd\ufffd\ufffd\ufffd\ufffdlf\ufffd0\ufffd.\ufffd\ufffd\ufffd\ufffd=\ufffd9Sz\ufffd\u031c\ufffd\ufffd}B\ufffdj\ufffd\ufffd\ufffda\ufffd\ufffd\ufffdHgr\ufffd\ufffdc\u001e\ufffdg\u070bu\u0007\ufffd%<\u0017\ufffd\ufffd\u0012\ufffd\ufffd\ufffd\""\ufffd\ufffdc\ufffd\ufffd\ufffd\u0013E\t}H\ufffd\ufffd\u001f\ufffd\ufffd\ufffdl\ufffd?\u0015Y\ufffd(?wC\ufffd\u00e1sNZ~\ufffd\u04b9t1\ufffd\ufffd\ufffdt9\ufffd\u0015\ufffd\u001d\ufffd\ufffd\ufffdx\ufffd\ufffd\n9b\ufffdY\u000f_\ufffd\ue759\ufffd\u001b\ufffde\ufffd\u001f\u007f\u0292\ufffd\ufffd^\ufffdn\ufffd\ufffd\ufffd\ufffd\u000e\u0015\u038fg\ufffd\u0015\f\ufffd\ufffdu\ufffdx\ufffd\ufffdX\ufffdG^\u001d\u000b]\ufffd\ufffd\u0006\u0012=SS\u007f\u0007/\ufffd\ufffd\f\r\nendstream\r\nendobj\r\n792 0 obj\r\n<>\r\nstream\r\n\n\n\nMicrosoft\u00ae Excel\u00ae 2019\n\nHannah Dell\n\nMicrosoft\u00ae Excel\u00ae 20192021-01-14T14:12:10-08:002021-01-14T14:12:10-08:00\n\nuuid:6C003856-8FCF-47C2-9D05-3AA42CA9E316uuid:6C003856-8FCF-47C2-9D05-3AA42CA9E316\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\r\nendstream\r\nendobj\r\n793 0 obj\r\n<>\r\nendobj\r\n794 0 obj\r\n<<5638006CCF8FC2479D053AA42CA9E316>] /Filter/FlateDecode/Length 1498>>\r\nstream\r\nx\ufffd5\ufffdw\ufffdWs\u001c\ufffd\ufffd\ufffd\ufffd]F\b\u0015\ufffd)d\u03c6=*ed\ufffdl\u0019\ufffd\ufffd(\ufffd\u0011JfV\ufffd\ufffd&2\ufffd\ufffdMR\u064a\ufffd\ufffd\f\ufffd\ufffd\ufffd\ufffd\ufffdw\u001f?\ufffd\ufffd\ufffd8\ufffd{\ufffd\ufffd|\u03b9\u007f\ufffd\ufffdy\ufffdR\ufffd|\ufffdZ\ufffd\ufffdf\ufffdT\ufffdD,*\ufffd\u0302j\u0015\u0005\ufffd\ufffdbnA\ufffd\ufffd\u0005\r\ufffdaJA\ufffdn\u0005\ufffd:\u23c2\u018b\u000b\ufffd\ufffd\u0090\ufffd\ufffd\ufffd\u0427\ufffdY\ufffd\ufffd\ufffd\nZT\u01f4R\ufffd|rE\ufffd\ufffd\ufffd\ufffd\u0007\ufffdb\u0005\ufffd\u009feJ\ufffd\ufffd\u07f0\ufffd\ufffd\ufffd\ufffdbU~X\u0003\ufffd\u0011T\ufffd\u001aV\ufffd\ufffdX\u0003kb-\ufffd\ufffd\ufffd\ufffd\u00196\u017aX\u000f\ufffdc\u0003\ufffd\u0106\ufffd\b\u001bc\u0013\ufffdB\u00134Fm\ufffdA]l\ufffd-P\u000f\ufffd\ufffd\u0000\ufffd\ufffd\u041b\ufffd\ufffdj[4E34G\u000b\ufffd\u0116h\ufffd\ufffd\ufffd5Zc\u001b\ufffd\ufffdv\ufffd\u001e;`G\uc11d\ufffd\u000bv\ufffdn\ufffd\u0003\ufffd\ufffd\u0010\ufffdC[\ufffd\ufffd\ufffd\u001b{a_\ufffd\ufffd\ufffd\u001f\u000e\ufffd\u0001\u8003\ufffd\t\u001d\ufffd\u0019\u0007\ufffd\u000bN\ufffda8\u0014]q8\ufffd\ufffd\u00118\u001aG\ufffd\u0018t\ufffdq8\u0016\u01e3;N\ufffd\t8\u0019'\ufffd\u0014\ufffdE\u000f\ufffd\ufffd3p:\ufffd\u0099\u815e8\u0007g\ufffd7\ufffd\ufffd\ufffd8\u000f\u0017\ufffd\u0002\\\ufffd>\ufffd\u00187\ufffd\u0012\ufffd\u00e5\ufffd\u0001\ufffd\fW\ufffdr\\\ufffd+q5\u0006\ufffdZ\\\ufffd\ufffd\u0018\ufffd!\ufffd\u000e\ufffdc,n\u008d\ufffd\u00057\ufffdV\f\ufffd\ufffd\ufffd\rw\ufffd\u000e\f\ufffd0\ufffd\ufffd\b\ufffd\ufffd(\u07051\ufffd\u001b\ufffd\ufffd^\u0703\ufffdq\u001f\ufffdc\u001c&b\u0002&c\u0012\u001e\ufffd\u0003\ufffd\ufffd\ufffd\ufffd\b\u001e\ufffdcx\u0014S1\u0013O`\u001a\ufffd\u0093x\u0006Oc:\ufffd\ufffd\ufffdx\u000e/\ufffd\u0005\ufffd\ufffd\ufffd\ufffd*^\ufffd\f\ufffd\ufffd\ufffd\ufffd1f\ufffd\r\ufffd\ufffdl\ufffd\ufffd7\ufffd\u000e\ufffd\ufffd{x\u0017\u001f\ufffd}\ufffd\ufffd\\|\ufffd\u000f\ufffd\u0000\ufffd\u0010\ufffd\ufffdS|\ufffdE\ufffd\f_\ufffds|\ufffd/\ufffd\r\ufffd\u01b7X\ufffd\ufffd\ufffd\u001d~\ufffd\u0012\ufffd\ufffd\u001f\ufffdsA\ufffd\ufffd\ufffd\u0014\ufffd\ufffd7,C\ufffd\ufffd\ufffdwT5n9\ufffd\ufffd_\ufffd\u0017\ufffd`%V8\ufffd*\ufffd\ufffd\ufffd\ufffd/2\u0018\ufffd\ufffd\ufffdE\ufffd\""\ufffd\u0011\ufffd\ufffd`\ufffd/\ufffd\u0017M\ufffd\ufffdF\ufffd\""\ufffd\u0011\ufffd\ufffd`\ufffd/2\u0018\ufffd\fF\ufffd\ufffd\u007f\u0011\ufffdhN\ufffd/2\u0018\ufffd\fF\ufffd\""\ufffd\u0011\ufffd\ufffd`\ufffd/\r\ufffd\ufffd\ufffd\ufffd\b_d0\ufffd\u0017\u0019\ufffd\ufffdE\u0006\ufffd\u007f\ufffd\ufffd(^d0b\u001a5\ufffd\ufffdE\u0006#|\ufffd\ufffd\b_d0\ufffd\u0017\u0019\ufffd\ufffdE\u0006#\ufffdQ\ufffd\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffdE\ufffd\ufffd\u007f\u047f\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffd\ufffdE\ufffd\ufffd\u007f\u047f\ufffd_\ufffd/\""\u001c\u0019\ufffd\ufffdE\ufffd\""|\ufffd\ufffd\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffd\ufffdE\ufffd\ufffd\u007f\u047f\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffd\ufffdE\ufffd\""\u0091\ufffd\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffdE\ufffd\ufffd\u007f\u047f\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffd\ufffdE\ufffd\ufffd\u007f\u047f\ufffd_\ufffd/\""\u001c\u0019\ufffd\ufffdE\ufffd\""|\ufffd\ufffd\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffd\ufffdE\ufffd\ufffd\u007f\u047f\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffd\ufffdE\ufffd\""\u0091\ufffd\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffdE\ufffd\ufffd\u007f\u047f\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffd\ufffdE\ufffd\ufffd\u007f\u047f\ufffd_\ufffd/\""\u001c\u0019\ufffd\ufffdE\ufffd\""|\ufffd\ufffd\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffd\ufffdE\ufffd\ufffd\u007f\u047f\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffd\ufffdE\ufffd\""\u0091\ufffd\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffdE\ufffd\ufffd\u007f\u047f\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffd\ufffdE\ufffd\ufffd\u007f\u047f\ufffd_\ufffd/\""\u001c\u0019\ufffd\ufffdE\ufffd\""|\ufffd\ufffd\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffd\ufffdE\ufffd\ufffd\u007f\u047f\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffd\ufffdE\ufffd\""\u0091\ufffd\ufffd_\ufffd/\ufffd\ufffd+\ufffd\n2\u0011\ufffd\ufffd\ufffdE\ufffd\ufffd\u007f\u047f\ufffd_\ufffd/\ufffd\u0017\ufffd\ufffd\ufffdE\ufffd\ufffd\u007f\u047f\ufffd_D8U\u0019\u053f\ufffd_\ufffd\ufffd'\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd6F\u0005\ufffd\ufffdP\rk`u\ufffd\ufffd5\ufffd\u000e\ufffdF\rT\ufffdzX\u0017\u001b`}l\ufffd\ufffd\ufffd\b-\ufffd\tja3l\ufffd:\ufffd\ufffd\ufffdQ\u0017\ufffd\ufffd\u0005\u001a\ufffd>\u001a\ufffdjdk\ufffd\ufffdh\ufffd\ufffdh\ufffd6\ufffd\u0012-\ufffd\u0015Za\u001bl\ufffdm\ufffd\u001a\ufffdc;\ufffd\u001d\ufffd3v\u00ae\ufffd\u0005\ufffdc7\ufffdC\ufffd\u000em\ufffd'\ufffdco\ufffd}\ufffd\u000f\ufffd\ufffd~8\u0010\u0007\ufffd\u0003\u000eB'tDg\u001c\ufffdC\ufffd\u0005\ufffd\ufffdp\u001c\ufffd#\ufffd\u0015G\ufffdHt\ufffd\ufffd8\u0016\u01e0;\ufffd\ufffd\t8\u001e'\ufffdD\ufffd\ufffd\ufffdq*\ufffd\ufffdt\ufffd\ufffd\ufffd8\u0003=q\u0016\ufffdF/\ufffd\ufffdsp\u001ez\ufffd\u0002\ufffd\ufffd>\ufffd\u0010\u0017\ufffd\""\ufffd\u014d\ufffdKp\u0019.\ufffd\ufffd\u0018\ufffd+q\u0005\u0006\ufffd*\\\ufffd\ufffd1\b\ufffd\ufffd:\f\ufffd\ufffd\u0018\ufffd\u001bp\u000fn\ufffdM\u0018\ufffd[p\u001bn\ufffd\u001d\ufffd\u001d\ufffdp'F`8Fa$\ufffd`4\ufffd\ufffd]\u0018\ufffdi\ufffd\u000f\ufffdb\u001c\ufffd\ufffd\u0004\ufffd\ufffd$L\ufffd\u0003\ufffd\ufffd\ufffd\ufffd \u001e\ufffd\u0014<\ufffdG0\u0015\ufffd\ufffdq\ufffd\ufffd'\ufffd\u0004\ufffd\ufffdSx\u0016\ufffd\ufffd9L\ufffd\u000bx\u001e/\ufffdE\ufffd\ufffd\ufffd\ufffd\u001a^\ufffd\ub601\ufffd\ufffd\u0004\ufffd1\u000bob\u000e\ufffd\ufffd[x\u0017\ufffd\ufffd}\ufffd\ufffd\ufffd\ufffd\u0000\u001fb\u001e\ufffd\ufffd#,\ufffd\u0002|\ufffd\ufffdP\u056aO\ufffd\b\ufffd\ufffd\u000b|\ufffd\ufffd\ufffd5\ufffd\ufffdb|\ufffd\u07f1\u0004\ufffd\ufffd\u0007\ufffd\ufffd\ufffd\ufffd3~\ufffd\ufffdX\ufffde\ufffd\r\ufffd\ufffd\u0001\ufffd<\ufffd\ufffd\ufffd\ufffde^\ufffd\ufffd\t\u0005\ufffd\ufffdT\ufffdqu\n\ufffdO\ufffd\ufffdb\ufffd\u0402Qs\n\ufffd\ufffd@\ufffdJ\ufffd\ufffd^\ufffd\ufffd\u0005\ufffd\ufffd\u0017\ufffdiQ*\ufffd\u0007\ufffdE\ufffd\ufffd\r\nendstream\r\nendobj\r\nxref\r\n0 795\r\n0000000023 65535 f\r\n0000000017 00000 n\r\n0000000168 00000 n\r\n0000000224 00000 n\r\n0000000456 00000 n\r\n0000000770 00000 n\r\n0000007840 00000 n\r\n0000007893 00000 n\r\n0000008067 00000 n\r\n0000008313 00000 n\r\n0000008366 00000 n\r\n0000008537 00000 n\r\n0000008779 00000 n\r\n0000008950 00000 n\r\n0000009191 00000 n\r\n0000009324 00000 n\r\n0000009354 00000 n\r\n0000009515 00000 n\r\n0000009589 00000 n\r\n0000009830 00000 n\r\n0000010005 00000 n\r\n0000010251 00000 n\r\n0000010421 00000 n\r\n0000000024 65535 f\r\n0000000025 65535 f\r\n0000000026 65535 f\r\n0000000027 65535 f\r\n0000000028 65535 f\r\n0000000029 65535 f\r\n0000000030 65535 f\r\n0000000031 65535 f\r\n0000000032 65535 f\r\n0000000033 65535 f\r\n0000000034 65535 f\r\n0000000035 65535 f\r\n0000000036 65535 f\r\n0000000037 65535 f\r\n0000000038 65535 f\r\n0000000039 65535 f\r\n0000000040 65535 f\r\n0000000041 65535 f\r\n0000000042 65535 f\r\n0000000043 65535 f\r\n0000000044 65535 f\r\n0000000045 65535 f\r\n0000000046 65535 f\r\n0000000047 65535 f\r\n0000000048 65535 f\r\n0000000049 65535 f\r\n0000000050 65535 f\r\n0000000051 65535 f\r\n0000000052 65535 f\r\n0000000053 65535 f\r\n0000000054 65535 f\r\n0000000055 65535 f\r\n0000000056 65535 f\r\n0000000057 65535 f\r\n0000000058 65535 f\r\n0000000059 65535 f\r\n0000000060 65535 f\r\n0000000061 65535 f\r\n0000000062 65535 f\r\n0000000063 65535 f\r\n0000000064 65535 f\r\n0000000065 65535 f\r\n0000000066 65535 f\r\n0000000067 65535 f\r\n0000000068 65535 f\r\n0000000069 65535 f\r\n0000000070 65535 f\r\n0000000071 65535 f\r\n0000000072 65535 f\r\n0000000073 65535 f\r\n0000000074 65535 f\r\n0000000075 65535 f\r\n0000000076 65535 f\r\n0000000077 65535 f\r\n0000000078 65535 f\r\n0000000079 65535 f\r\n0000000080 65535 f\r\n0000000081 65535 f\r\n0000000082 65535 f\r\n0000000083 65535 f\r\n0000000084 65535 f\r\n0000000085 65535 f\r\n0000000086 65535 f\r\n0000000087 65535 f\r\n0000000088 65535 f\r\n0000000089 65535 f\r\n0000000090 65535 f\r\n0000000091 65535 f\r\n0000000092 65535 f\r\n0000000093 65535 f\r\n0000000094 65535 f\r\n0000000095 65535 f\r\n0000000096 65535 f\r\n0000000097 65535 f\r\n0000000098 65535 f\r\n0000000099 65535 f\r\n0000000100 65535 f\r\n0000000101 65535 f\r\n0000000102 65535 f\r\n0000000103 65535 f\r\n0000000104 65535 f\r\n0000000105 65535 f\r\n0000000106 65535 f\r\n0000000107 65535 f\r\n0000000108 65535 f\r\n0000000109 65535 f\r\n0000000110 65535 f\r\n0000000111 65535 f\r\n0000000112 65535 f\r\n0000000113 65535 f\r\n0000000114 65535 f\r\n0000000115 65535 f\r\n0000000116 65535 f\r\n0000000117 65535 f\r\n0000000118 65535 f\r\n0000000119 65535 f\r\n0000000120 65535 f\r\n0000000121 65535 f\r\n0000000122 65535 f\r\n0000000123 65535 f\r\n0000000124 65535 f\r\n0000000125 65535 f\r\n0000000126 65535 f\r\n0000000127 65535 f\r\n0000000128 65535 f\r\n0000000129 65535 f\r\n0000000130 65535 f\r\n0000000131 65535 f\r\n0000000132 65535 f\r\n0000000133 65535 f\r\n0000000134 65535 f\r\n0000000135 65535 f\r\n0000000136 65535 f\r\n0000000137 65535 f\r\n0000000138 65535 f\r\n0000000139 65535 f\r\n0000000140 65535 f\r\n0000000141 65535 f\r\n0000000142 65535 f\r\n0000000143 65535 f\r\n0000000144 65535 f\r\n0000000145 65535 f\r\n0000000146 65535 f\r\n0000000147 65535 f\r\n0000000148 65535 f\r\n0000000149 65535 f\r\n0000000150 65535 f\r\n0000000151 65535 f\r\n0000000152 65535 f\r\n0000000153 65535 f\r\n0000000154 65535 f\r\n0000000155 65535 f\r\n0000000156 65535 f\r\n0000000157 65535 f\r\n0000000158 65535 f\r\n0000000159 65535 f\r\n0000000160 65535 f\r\n0000000161 65535 f\r\n0000000162 65535 f\r\n0000000163 65535 f\r\n0000000164 65535 f\r\n0000000165 65535 f\r\n0000000166 65535 f\r\n0000000167 65535 f\r\n0000000168 65535 f\r\n0000000169 65535 f\r\n0000000170 65535 f\r\n0000000171 65535 f\r\n0000000172 65535 f\r\n0000000173 65535 f\r\n0000000174 65535 f\r\n0000000175 65535 f\r\n0000000176 65535 f\r\n0000000177 65535 f\r\n0000000178 65535 f\r\n0000000179 65535 f\r\n0000000180 65535 f\r\n0000000181 65535 f\r\n0000000182 65535 f\r\n0000000183 65535 f\r\n0000000184 65535 f\r\n0000000185 65535 f\r\n0000000186 65535 f\r\n0000000187 65535 f\r\n0000000188 65535 f\r\n0000000189 65535 f\r\n0000000190 65535 f\r\n0000000191 65535 f\r\n0000000192 65535 f\r\n0000000193 65535 f\r\n0000000194 65535 f\r\n0000000195 65535 f\r\n0000000196 65535 f\r\n0000000197 65535 f\r\n0000000198 65535 f\r\n0000000199 65535 f\r\n0000000200 65535 f\r\n0000000201 65535 f\r\n0000000202 65535 f\r\n0000000203 65535 f\r\n0000000204 65535 f\r\n0000000205 65535 f\r\n0000000206 65535 f\r\n0000000207 65535 f\r\n0000000208 65535 f\r\n0000000209 65535 f\r\n0000000210 65535 f\r\n0000000211 65535 f\r\n0000000212 65535 f\r\n0000000213 65535 f\r\n0000000214 65535 f\r\n0000000215 65535 f\r\n0000000216 65535 f\r\n0000000217 65535 f\r\n0000000218 65535 f\r\n0000000219 65535 f\r\n0000000220 65535 f\r\n0000000221 65535 f\r\n0000000222 65535 f\r\n0000000223 65535 f\r\n0000000224 65535 f\r\n0000000225 65535 f\r\n0000000226 65535 f\r\n0000000227 65535 f\r\n0000000228 65535 f\r\n0000000229 65535 f\r\n0000000230 65535 f\r\n0000000231 65535 f\r\n0000000232 65535 f\r\n0000000233 65535 f\r\n0000000234 65535 f\r\n0000000235 65535 f\r\n0000000236 65535 f\r\n0000000237 65535 f\r\n0000000238 65535 f\r\n0000000239 65535 f\r\n0000000240 65535 f\r\n0000000241 65535 f\r\n0000000242 65535 f\r\n0000000243 65535 f\r\n0000000244 65535 f\r\n0000000245 65535 f\r\n0000000246 65535 f\r\n0000000247 65535 f\r\n0000000248 65535 f\r\n0000000249 65535 f\r\n0000000250 65535 f\r\n0000000251 65535 f\r\n0000000252 65535 f\r\n0000000253 65535 f\r\n0000000254 65535 f\r\n0000000255 65535 f\r\n0000000256 65535 f\r\n0000000257 65535 f\r\n0000000258 65535 f\r\n0000000259 65535 f\r\n0000000260 65535 f\r\n0000000261 65535 f\r\n0000000262 65535 f\r\n0000000263 65535 f\r\n0000000264 65535 f\r\n0000000265 65535 f\r\n0000000266 65535 f\r\n0000000267 65535 f\r\n0000000268 65535 f\r\n0000000269 65535 f\r\n0000000270 65535 f\r\n0000000271 65535 f\r\n0000000272 65535 f\r\n0000000273 65535 f\r\n0000000274 65535 f\r\n0000000275 65535 f\r\n0000000276 65535 f\r\n0000000277 65535 f\r\n0000000278 65535 f\r\n0000000279 65535 f\r\n0000000280 65535 f\r\n0000000281 65535 f\r\n0000000282 65535 f\r\n0000000283 65535 f\r\n0000000284 65535 f\r\n0000000285 65535 f\r\n0000000286 65535 f\r\n0000000287 65535 f\r\n0000000288 65535 f\r\n0000000289 65535 f\r\n0000000290 65535 f\r\n0000000291 65535 f\r\n0000000292 65535 f\r\n0000000293 65535 f\r\n0000000294 65535 f\r\n0000000295 65535 f\r\n0000000296 65535 f\r\n0000000297 65535 f\r\n0000000298 65535 f\r\n0000000299 65535 f\r\n0000000300 65535 f\r\n0000000301 65535 f\r\n0000000302 65535 f\r\n0000000303 65535 f\r\n0000000304 65535 f\r\n0000000305 65535 f\r\n0000000306 65535 f\r\n0000000307 65535 f\r\n0000000308 65535 f\r\n0000000309 65535 f\r\n0000000310 65535 f\r\n0000000311 65535 f\r\n0000000312 65535 f\r\n0000000313 65535 f\r\n0000000314 65535 f\r\n0000000315 65535 f\r\n0000000316 65535 f\r\n0000000317 65535 f\r\n0000000318 65535 f\r\n0000000319 65535 f\r\n0000000320 65535 f\r\n0000000321 65535 f\r\n0000000322 65535 f\r\n0000000323 65535 f\r\n0000000324 65535 f\r\n0000000325 65535 f\r\n0000000326 65535 f\r\n0000000327 65535 f\r\n0000000328 65535 f\r\n0000000329 65535 f\r\n0000000330 65535 f\r\n0000000331 65535 f\r\n0000000332 65535 f\r\n0000000333 65535 f\r\n0000000334 65535 f\r\n0000000335 65535 f\r\n0000000336 65535 f\r\n0000000337 65535 f\r\n0000000338 65535 f\r\n0000000339 65535 f\r\n0000000340 65535 f\r\n0000000341 65535 f\r\n0000000342 65535 f\r\n0000000343 65535 f\r\n0000000344 65535 f\r\n0000000345 65535 f\r\n0000000346 65535 f\r\n0000000347 65535 f\r\n0000000348 65535 f\r\n0000000349 65535 f\r\n0000000350 65535 f\r\n0000000351 65535 f\r\n0000000352 65535 f\r\n0000000353 65535 f\r\n0000000354 65535 f\r\n0000000355 65535 f\r\n0000000356 65535 f\r\n0000000357 65535 f\r\n0000000358 65535 f\r\n0000000359 65535 f\r\n0000000360 65535 f\r\n0000000361 65535 f\r\n0000000362 65535 f\r\n0000000363 65535 f\r\n0000000364 65535 f\r\n0000000365 65535 f\r\n0000000366 65535 f\r\n0000000367 65535 f\r\n0000000368 65535 f\r\n0000000369 65535 f\r\n0000000370 65535 f\r\n0000000371 65535 f\r\n0000000372 65535 f\r\n0000000373 65535 f\r\n0000000374 65535 f\r\n0000000375 65535 f\r\n0000000376 65535 f\r\n0000000377 65535 f\r\n0000000378 65535 f\r\n0000000379 65535 f\r\n0000000380 65535 f\r\n0000000381 65535 f\r\n0000000382 65535 f\r\n0000000383 65535 f\r\n0000000384 65535 f\r\n0000000385 65535 f\r\n0000000386 65535 f\r\n0000000387 65535 f\r\n0000000388 65535 f\r\n0000000389 65535 f\r\n0000000390 65535 f\r\n0000000391 65535 f\r\n0000000392 65535 f\r\n0000000393 65535 f\r\n0000000394 65535 f\r\n0000000395 65535 f\r\n0000000396 65535 f\r\n0000000397 65535 f\r\n0000000398 65535 f\r\n0000000399 65535 f\r\n0000000400 65535 f\r\n0000000401 65535 f\r\n0000000402 65535 f\r\n0000000403 65535 f\r\n0000000404 65535 f\r\n0000000405 65535 f\r\n0000000406 65535 f\r\n0000000407 65535 f\r\n0000000408 65535 f\r\n0000000409 65535 f\r\n0000000410 65535 f\r\n0000000411 65535 f\r\n0000000412 65535 f\r\n0000000413 65535 f\r\n0000000414 65535 f\r\n0000000415 65535 f\r\n0000000416 65535 f\r\n0000000417 65535 f\r\n0000000418 65535 f\r\n0000000419 65535 f\r\n0000000420 65535 f\r\n0000000421 65535 f\r\n0000000422 65535 f\r\n0000000423 65535 f\r\n0000000424 65535 f\r\n0000000425 65535 f\r\n0000000426 65535 f\r\n0000000427 65535 f\r\n0000000428 65535 f\r\n0000000429 65535 f\r\n0000000430 65535 f\r\n0000000431 65535 f\r\n0000000432 65535 f\r\n0000000433 65535 f\r\n0000000434 65535 f\r\n0000000435 65535 f\r\n0000000436 65535 f\r\n0000000437 65535 f\r\n0000000438 65535 f\r\n0000000439 65535 f\r\n0000000440 65535 f\r\n0000000441 65535 f\r\n0000000442 65535 f\r\n0000000443 65535 f\r\n0000000444 65535 f\r\n0000000445 65535 f\r\n0000000446 65535 f\r\n0000000447 65535 f\r\n0000000448 65535 f\r\n0000000449 65535 f\r\n0000000450 65535 f\r\n0000000451 65535 f\r\n0000000452 65535 f\r\n0000000453 65535 f\r\n0000000454 65535 f\r\n0000000455 65535 f\r\n0000000456 65535 f\r\n0000000457 65535 f\r\n0000000458 65535 f\r\n0000000459 65535 f\r\n0000000460 65535 f\r\n0000000461 65535 f\r\n0000000462 65535 f\r\n0000000463 65535 f\r\n0000000464 65535 f\r\n0000000465 65535 f\r\n0000000466 65535 f\r\n0000000467 65535 f\r\n0000000468 65535 f\r\n0000000469 65535 f\r\n0000000470 65535 f\r\n0000000471 65535 f\r\n0000000472 65535 f\r\n0000000473 65535 f\r\n0000000474 65535 f\r\n0000000475 65535 f\r\n0000000476 65535 f\r\n0000000477 65535 f\r\n0000000478 65535 f\r\n0000000479 65535 f\r\n0000000480 65535 f\r\n0000000481 65535 f\r\n0000000482 65535 f\r\n0000000483 65535 f\r\n0000000484 65535 f\r\n0000000485 65535 f\r\n0000000486 65535 f\r\n0000000487 65535 f\r\n0000000488 65535 f\r\n0000000489 65535 f\r\n0000000490 65535 f\r\n0000000491 65535 f\r\n0000000492 65535 f\r\n0000000493 65535 f\r\n0000000494 65535 f\r\n0000000495 65535 f\r\n0000000496 65535 f\r\n0000000497 65535 f\r\n0000000498 65535 f\r\n0000000499 65535 f\r\n0000000500 65535 f\r\n0000000501 65535 f\r\n0000000502 65535 f\r\n0000000503 65535 f\r\n0000000504 65535 f\r\n0000000505 65535 f\r\n0000000506 65535 f\r\n0000000507 65535 f\r\n0000000508 65535 f\r\n0000000509 65535 f\r\n0000000510 65535 f\r\n0000000511 65535 f\r\n0000000512 65535 f\r\n0000000513 65535 f\r\n0000000514 65535 f\r\n0000000515 65535 f\r\n0000000516 65535 f\r\n0000000517 65535 f\r\n0000000518 65535 f\r\n0000000519 65535 f\r\n0000000520 65535 f\r\n0000000521 65535 f\r\n0000000522 65535 f\r\n0000000523 65535 f\r\n0000000524 65535 f\r\n0000000525 65535 f\r\n0000000526 65535 f\r\n0000000527 65535 f\r\n0000000528 65535 f\r\n0000000529 65535 f\r\n0000000530 65535 f\r\n0000000531 65535 f\r\n0000000532 65535 f\r\n0000000533 65535 f\r\n0000000534 65535 f\r\n0000000535 65535 f\r\n0000000536 65535 f\r\n0000000537 65535 f\r\n0000000538 65535 f\r\n0000000539 65535 f\r\n0000000540 65535 f\r\n0000000541 65535 f\r\n0000000542 65535 f\r\n0000000543 65535 f\r\n0000000544 65535 f\r\n0000000545 65535 f\r\n0000000546 65535 f\r\n0000000547 65535 f\r\n0000000548 65535 f\r\n0000000549 65535 f\r\n0000000550 65535 f\r\n0000000551 65535 f\r\n0000000552 65535 f\r\n0000000553 65535 f\r\n0000000554 65535 f\r\n0000000555 65535 f\r\n0000000556 65535 f\r\n0000000557 65535 f\r\n0000000558 65535 f\r\n0000000559 65535 f\r\n0000000560 65535 f\r\n0000000561 65535 f\r\n0000000562 65535 f\r\n0000000563 65535 f\r\n0000000564 65535 f\r\n0000000565 65535 f\r\n0000000566 65535 f\r\n0000000567 65535 f\r\n0000000568 65535 f\r\n0000000569 65535 f\r\n0000000570 65535 f\r\n0000000571 65535 f\r\n0000000572 65535 f\r\n0000000573 65535 f\r\n0000000574 65535 f\r\n0000000575 65535 f\r\n0000000576 65535 f\r\n0000000577 65535 f\r\n0000000578 65535 f\r\n0000000579 65535 f\r\n0000000580 65535 f\r\n0000000581 65535 f\r\n0000000582 65535 f\r\n0000000583 65535 f\r\n0000000584 65535 f\r\n0000000585 65535 f\r\n0000000586 65535 f\r\n0000000587 65535 f\r\n0000000588 65535 f\r\n0000000589 65535 f\r\n0000000590 65535 f\r\n0000000591 65535 f\r\n0000000592 65535 f\r\n0000000593 65535 f\r\n0000000594 65535 f\r\n0000000595 65535 f\r\n0000000596 65535 f\r\n0000000597 65535 f\r\n0000000598 65535 f\r\n0000000599 65535 f\r\n0000000600 65535 f\r\n0000000601 65535 f\r\n0000000602 65535 f\r\n0000000603 65535 f\r\n0000000604 65535 f\r\n0000000605 65535 f\r\n0000000606 65535 f\r\n0000000607 65535 f\r\n0000000608 65535 f\r\n0000000609 65535 f\r\n0000000610 65535 f\r\n0000000611 65535 f\r\n0000000612 65535 f\r\n0000000613 65535 f\r\n0000000614 65535 f\r\n0000000615 65535 f\r\n0000000616 65535 f\r\n0000000617 65535 f\r\n0000000618 65535 f\r\n0000000619 65535 f\r\n0000000620 65535 f\r\n0000000621 65535 f\r\n0000000622 65535 f\r\n0000000623 65535 f\r\n0000000624 65535 f\r\n0000000625 65535 f\r\n0000000626 65535 f\r\n0000000627 65535 f\r\n0000000628 65535 f\r\n0000000629 65535 f\r\n0000000630 65535 f\r\n0000000631 65535 f\r\n0000000632 65535 f\r\n0000000633 65535 f\r\n0000000634 65535 f\r\n0000000635 65535 f\r\n0000000636 65535 f\r\n0000000637 65535 f\r\n0000000638 65535 f\r\n0000000639 65535 f\r\n0000000640 65535 f\r\n0000000641 65535 f\r\n0000000642 65535 f\r\n0000000643 65535 f\r\n0000000644 65535 f\r\n0000000645 65535 f\r\n0000000646 65535 f\r\n0000000647 65535 f\r\n0000000648 65535 f\r\n0000000649 65535 f\r\n0000000650 65535 f\r\n0000000651 65535 f\r\n0000000652 65535 f\r\n0000000653 65535 f\r\n0000000654 65535 f\r\n0000000655 65535 f\r\n0000000656 65535 f\r\n0000000657 65535 f\r\n0000000658 65535 f\r\n0000000659 65535 f\r\n0000000660 65535 f\r\n0000000661 65535 f\r\n0000000662 65535 f\r\n0000000663 65535 f\r\n0000000664 65535 f\r\n0000000665 65535 f\r\n0000000666 65535 f\r\n0000000667 65535 f\r\n0000000668 65535 f\r\n0000000669 65535 f\r\n0000000670 65535 f\r\n0000000671 65535 f\r\n0000000672 65535 f\r\n0000000673 65535 f\r\n0000000674 65535 f\r\n0000000675 65535 f\r\n0000000676 65535 f\r\n0000000677 65535 f\r\n0000000678 65535 f\r\n0000000679 65535 f\r\n0000000680 65535 f\r\n0000000681 65535 f\r\n0000000682 65535 f\r\n0000000683 65535 f\r\n0000000684 65535 f\r\n0000000685 65535 f\r\n0000000686 65535 f\r\n0000000687 65535 f\r\n0000000688 65535 f\r\n0000000689 65535 f\r\n0000000690 65535 f\r\n0000000691 65535 f\r\n0000000692 65535 f\r\n0000000693 65535 f\r\n0000000694 65535 f\r\n0000000695 65535 f\r\n0000000696 65535 f\r\n0000000697 65535 f\r\n0000000698 65535 f\r\n0000000699 65535 f\r\n0000000700 65535 f\r\n0000000701 65535 f\r\n0000000702 65535 f\r\n0000000703 65535 f\r\n0000000704 65535 f\r\n0000000705 65535 f\r\n0000000706 65535 f\r\n0000000707 65535 f\r\n0000000708 65535 f\r\n0000000709 65535 f\r\n0000000710 65535 f\r\n0000000711 65535 f\r\n0000000712 65535 f\r\n0000000713 65535 f\r\n0000000714 65535 f\r\n0000000715 65535 f\r\n0000000716 65535 f\r\n0000000717 65535 f\r\n0000000718 65535 f\r\n0000000719 65535 f\r\n0000000720 65535 f\r\n0000000721 65535 f\r\n0000000722 65535 f\r\n0000000723 65535 f\r\n0000000724 65535 f\r\n0000000725 65535 f\r\n0000000726 65535 f\r\n0000000727 65535 f\r\n0000000728 65535 f\r\n0000000729 65535 f\r\n0000000730 65535 f\r\n0000000731 65535 f\r\n0000000732 65535 f\r\n0000000733 65535 f\r\n0000000734 65535 f\r\n0000000735 65535 f\r\n0000000736 65535 f\r\n0000000737 65535 f\r\n0000000738 65535 f\r\n0000000739 65535 f\r\n0000000740 65535 f\r\n0000000741 65535 f\r\n0000000742 65535 f\r\n0000000743 65535 f\r\n0000000744 65535 f\r\n0000000745 65535 f\r\n0000000746 65535 f\r\n0000000747 65535 f\r\n0000000748 65535 f\r\n0000000749 65535 f\r\n0000000750 65535 f\r\n0000000751 65535 f\r\n0000000752 65535 f\r\n0000000753 65535 f\r\n0000000754 65535 f\r\n0000000755 65535 f\r\n0000000756 65535 f\r\n0000000757 65535 f\r\n0000000758 65535 f\r\n0000000759 65535 f\r\n0000000760 65535 f\r\n0000000761 65535 f\r\n0000000762 65535 f\r\n0000000763 65535 f\r\n0000000764 65535 f\r\n0000000765 65535 f\r\n0000000766 65535 f\r\n0000000767 65535 f\r\n0000000768 65535 f\r\n0000000769 65535 f\r\n0000000770 65535 f\r\n0000000771 65535 f\r\n0000000772 65535 f\r\n0000000773 65535 f\r\n0000000774 65535 f\r\n0000000775 65535 f\r\n0000000776 65535 f\r\n0000000777 65535 f\r\n0000000778 65535 f\r\n0000000779 65535 f\r\n0000000000 65535 f\r\n0000020166 00000 n\r\n0000020438 00000 n\r\n0000051879 00000 n\r\n0000052203 00000 n\r\n0000107802 00000 n\r\n0000108211 00000 n\r\n0000170385 00000 n\r\n0000170956 00000 n\r\n0000171276 00000 n\r\n0000171348 00000 n\r\n0000203227 00000 n\r\n0000203255 00000 n\r\n0000208857 00000 n\r\n0000212008 00000 n\r\n0000212054 00000 n\r\ntrailer\r\n<<5638006CCF8FC2479D053AA42CA9E316>] >>\r\nstartxref\r\n213755\r\n%%EOF\r\nxref\r\n0 0\r\ntrailer\r\n<<5638006CCF8FC2479D053AA42CA9E316>] /Prev 213755/XRefStm 212054>>\r\nstartxref\r\n229814\r\n%%EOF""]",[] -2844,https://cityprotect.com/agency/540048e6ee664a6f88ae0ceb93717e50,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2845,https://cityprotect.com/agency/urbanapd,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2846,https://sheriffalerts.com/cap_office_disclaimer.php?office=55195,Sex Offender Registry,403,"","",,,,,, -2847,https://cityprotect.com/agency/bentonpolicearkansas,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2848,http://www.bakercountysheriffoffice.org/contact.php,List of Data Sources,200,"Contact Us - Baker County Sheriff's Office, Georgia",Submit your questions & concerns and get map directions,[],"[""Contact Us"", ""Locate Us""]",[],[],[],[] -2849,https://cityprotect.com/agency/fbb9411d-f7d5-4f8a-a7ce-b5c8bfb53d83,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2850,https://www2.auglaizecounty.org/elected-officials/clerk-courts/public-access-records,Records Request Info,200,Public Access Records | Auglaize County,"","["" AUGLAIZECOUNTY.ORG"", ""AUGLAIZE COUNTY?"", ""\nAUGLAIZECOUNTY.ORG\n""]","[""Main navigation"", ""User account menu""]","[""AUGLAIZECOUNTY.ORG"", ""Public Access Records\n"", ""Public Access Records\n""]","[""Common Pleas Disclaimer"", """", ""Municipal Disclaimer"", ""Common Pleas Disclaimer"", """", ""Municipal Disclaimer""]",[],[] -2851,https://cityprotect.com/agency/lafayetteinpd,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2852,https://www.baldwinsheriff.com/most-wanted/,Wanted Persons,522,"","",,,,,, -2853,https://data.louisvilleky.gov/,List of Data Sources,200,Louisville Kentucky Open Data,"Explore our open data and tools, and use it build insights of your own.",[],[],[],[],[],[] -2854,https://api.fbi.gov/wanted/v1/list,Wanted Persons,200,"","",[],[],[],[],[],[] -2855,https://cityprotect.com/agency/ee7c318c-d408-4b32-84fd-d7d0cfffd65f,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2856,https://cityprotect.com/agency/carmelpd,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2857,https://www.cityofcalhoun-ga.com/wp-content/uploads/2017/12/OPEN-RECORDS-REQUEST-FORM.pdf,List of Data Sources,200,"","",[],[],[],[],[],[] -2858,https://cityprotect.com/agency/wcso_or,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2859,https://cityprotect.com/agency/47fb67d5-a52f-4edb-a2b4-12568e29212b,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2860,https://www.sheriffoff.com/report-request/,Records Request Info,200,Putnam County Sheriff's Office - Report request,d,"[""Report request""]",[],[],"[""Quick links""]","["""", ""Accident Reports"", ""Pictures"", ""Video"", ""Audio"", ""Document""]",[] -2861,https://cityprotect.com/agency/81f890c9-6410-4773-8b83-88c0f5085fcd,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2862,https://cityprotect.com/agency/96a15ed8-74ec-49d7-ba08-1530d1aa2737,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2863,https://buycrash.lexisnexisrisk.com/,Accident Reports,200,LN BuyCrash,"",[],[],[],[],[],[] -2864,https://cityprotect.com/agency/cc0d9a3d-50b2-4424-ae25-5699ba6eaff9,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2865,https://www1.nyc.gov/site/nypd/stats/reports-analysis/use-of-force-data.page,Use of Force Reports,200,Use of Force Data Tables - NYPD,"","[""Use of Force Data Tables""]","[""New York's Finest"", ""2023"", ""2022"", ""2021"", ""2020"", ""2019"", ""2018"", ""2017"", ""2016"", """"]","[""Fourth Quarter"", ""Third Quarter"", ""Second Quarter"", ""First Quarter"", ""Fourth Quarter"", ""Third Quarter"", ""Second Quarter"", ""First Quarter"", ""Fourth Quarter"", ""Third Quarter"", ""Second Quarter"", ""First Quarter"", ""Fourth Quarter"", ""Third Quarter"", ""Second Quarter"", ""First Quarter"", ""Fourth Quarter""]",[],[],[] -2866,https://www.cityofringgoldga.gov/ContactUs.aspx,List of Data Sources,200," - Contact Us -","","[""Contact Us""]",[],[],[],[],[] -2867,https://cityprotect.com/agency/7993e600-6f3b-41a8-ad20-4b7d1f811f00,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2868,https://data.wprdc.org/dataset/pbp-fire-arm-seizures,Misc Police Activity,200,Pittsburgh Police Firearm Seizures - Dataset - CKAN,"","[""Pittsburgh Police Firearm Seizures"", ""City of Pittsburgh\n \n "", ""\n \n Pittsburgh Police Firearm Seizures\n \n \n \n "", ""Data Use Agreement""]","["" Organization"", "" Social"", "" License"", ""Data and Resources"", ""Terms of use"", ""\ud83d\udea7 Under Construction""]","[""Additional Info""]",[],[],[] -2869,https://sheriff.starkcountyohio.gov/government/offices/sheriff/resources/index.php,List of Data Sources,200,"Welcome to Stark County, Ohio","","[""\n\nPage Title\n""]","[""\n\n\n\r\n Sheriff Resources\r\n "", ""\r\n\r\nResources"", """", ""Security Camera Registration Portal"", ""Stark County, OH"", ""Share this page"", """"]","[""""]",[],[],[] -2870,https://www.norcrossga.net/DocumentCenter/,List of Data Sources,200,"Document Center • Norcross, GA • CivicEngage",The Document Center is for storage of documents of many different file types. Documents stored in the Document Center can be separated by folders and subfolders.,[],[],"[""Loading"", ""\r\n\t\t\t\t\t\tFilter Documents by:"", ""Contact Us"", ""Quick Links"", ""Using This Site""]",[],[],[] -2871,https://cityprotect.com/agency/8d3a038e-648b-4c1a-b262-7d3c56f7cb5f,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2872,https://cummingpd.net/,List of Data Sources,200,"","","[""\n\t\t\t\t\t\t\t\t\tCUMMING POLICE DEPARTMENT\n\t\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\t\tCUMMING POLICE DEPARTMENT\n\t\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\t\tCUMMING POLICE DEPARTMENT\n\t\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\tMission Statement of the Cumming Police Department\n\t\t\t\t\t\t""]","[""Welcome to The City of Cumming"", ""\n\t\t\t\t\t\t\t\tPolice Department Information\n\t\t\t\t\t\t\t""]",[],"[""\n\t\t\t\t\t\t\tOUR MISSION\n\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\tOffice Hours\n\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\tFollow Us\n\t\t\t\t\t\t""]",[],[] -2873,https://www.greeneso.org/contact-us,List of Data Sources,200,"Sheriff's Office Greene County, GA | Official Website","Welcome to the Official Website for the Sheriff's Office of Greene County, Georgia. For best mobile experience, get the MySheriff mobile-app on the app stores.",[],[],[],[],[],[] -2874,https://www.mcdonoughga.org/city-departments-services/police-department/faqs,List of Data Sources,404,"","",,,,,, -2875,https://csucpd.crimegraphics.com/2013/default.aspx,Crime Maps & Reports,200," - CrimeGraphics.com -","",[],[],[],[],[],[] -2876,https://www.auroragov.org/cms/One.aspx?portalId=16242704&pageId=16573554,Annual & Monthly Reports,200," - Annual & Public Reports - City of Aurora -","","[""Welcome to theCity of AuroraColorado""]","[""Annual & Public Reports""]","[""Contact Info"", ""Useful Links"", ""City of AuroraColorado"", ""Accreditations""]",[],[],[] -2877,https://cityprotect.com/agency/c5267f3b-34d9-4f57-9d97-286d6a09be79,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2878,https://data.wprdc.org/dataset/police-community-outreach,Misc Police Activity,200,Police Community Outreach - Dataset - CKAN,"","[""Police Community Outreach"", ""City of Pittsburgh\n \n "", ""\n \n Police Community Outreach\n \n \n \n "", ""Data Use Agreement""]","["" Organization"", "" Social"", "" License"", ""Data and Resources"", ""Terms of use"", ""\ud83d\udea7 Under Construction""]","[""Additional Info""]",[],[],[] -2879,https://gbi.georgia.gov/services/georgia-sex-offender-registry,Sex Offender Registry,200,Georgia Sex Offender Registry | Georgia Bureau of Investigation,In accordance with O.C.G.A.,"[""\n Georgia Sex Offender Registry\n \n ""]","[""Main navigation"", ""Search this site"", ""Breadcrumb"", ""\n\n Services\n \n\n\n\n"", ""How can we help?"", ""About Us""]","[""Popular searches"", ""Call Us"", ""Online Tip Form"", ""Visit""]",[],[],[] -2880,https://www.alamedaca.gov/Departments/Police-Department/Annual-Crime-Stats,Annual & Monthly Reports,200,Annual Crime Statistics ,"","[""Annual Crime Statistics""]",[],"[""Contact Us"", ""Connect With Us"", ""Read More""]",[],[],[] -2881,https://webmaster2166.wixsite.com/bartowso/sex-offender-search,Sex Offender Registry,200,Sex Offender Search | Bartow Co. S.O.,"","[""BARTOW COUNTY SHERIFF'S OFFICE"", ""104 ZENA DRIVE \u2666 P.O. BOX 476 \u2666 CARTERSVILLE, GEORGIA 30121"", ""CLARK MILLSAP"", ""SHERIFF ""]","[""Sex Offender Search""]",[],[],[],"[""Main/Jail: 770-382-5050"", ""Non -Emerg/Dispatch: 770-387-5195"", ""Fax: 678-721-3206"", ""Emergencies:\u00a0Dial 9-1-1""]" -2882,https://www.eastpointcity.org/east-point-police/#crime-statistics,Crime Statistics,500,"","",,,,,, -2883,http://daltonpd.com/statistics/,List of Data Sources,404,"","",,,,,, -2884,https://cityprotect.com/agency/c41083c5-8ec3-4ad1-9954-2f4ad9b8f79e,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2885,https://www.stonecrestga.gov/Assets/Files/Administration/OpenRecordsRequest_21_April.pdf,List of Data Sources,200,"","",[],[],[],[],[],[] -2886,https://data.seattle.gov,List of Data Sources,200,City of Seattle Open Data portal,"",[],"[""Menu""]",[],[],[],[] -2887,http://www.cityofdelano.org/108/Crime-Statistics,Crime Statistics,200,"Responding to and Preventing Crime | Delano, CA - Official Website","","[""\r\n\r\nResponding to and Preventing Crime\t\t"", ""Monthly Activity Report""]","[""Analysis""]","[""Loading"", ""Contact Us"", ""Helpful Links"", ""Site Links""]",[],[],[] -2888,https://www.valdosta.edu/administration/finance-admin/police/our-team.php,List of Data Sources,200," - University Police and EOS - Valdosta State University - ",University Police and Environmental and Occupational Safety ,"[""University Police and EOS ""]","[""\n\n About\n \n"", ""\n\n Academics\n \n"", ""\n\n Admissions\n \n"", ""\n\n Athletics\n \n"", ""\n\n Campus Life\n \n"", ""\n\n Alumni & Giving\n \n"", ""\n\n Strategic Priorities\n \n""]","[""View Profile"", ""View Profile"", ""View Profile"", ""View Profile"", ""View Profile"", ""View Profile"", ""View Profile"", ""View Profile"", ""View Profile""]","[""Resources for""]",[],"[""About Valdosta State\n"", ""Administration\n"", ""Employment Opportunities\n"", ""Colleges\n"", ""Majors and Degrees\n"", ""Academic Resources"", ""Admission to VSU"", ""Paying for College\n"", ""Costs"", ""Blazer Athletics\n"", ""Life at VSU\n"", ""Housing and Residence Life\n"", ""Student Services"", ""VSU Alumni Association\n"", ""Make a Gift\n"", "" Alumni & Friends\n"", ""A culture of excellence""]" -2889,https://www.colquittga.org/Police%20Department.htm,List of Data Sources,200,"","",[],[],[],[],[],[] -2890,https://cityprotect.com/agency/cd728bac-6099-4a34-9ae1-c1200fada461,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2891,http://state.sor.gbi.ga.gov/SORT_PUBLIC/sor.csv,Sex Offender Registry,200,"","",[],[],[],[],[],[] -2892,https://www.antiochca.gov/fc/police/crime-maps/this-weeks-aar.pdf,Arrest Records,200,"","",[],[],[],[],[],[] -2893,https://cityprotect.com/agency/74c31c97-98ad-4e8d-88ff-d1ab86e7ee57,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2894,https://www.burbankpd.org/crime-information/daily-arrest-logs/?F_All=y,Arrest Records,200,"","","[""Follow Us"", ""Daily Arrest Logs"", ""Sign Up for our Newsletter/E-Alerts"", ""Follow Us""]","[""Burbank Police"", ""Resources""]",[],[],[],[] -2895,http://www.dcor.state.ga.us/GDC/OffenderQuery/jsp/OffQryForm.jsp,Arrest Records,-1,"","",,,,,, -2896,https://cityprotect.com/agency/richardsonpd,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2897,https://data.sfgov.org,List of Data Sources,200,DataSF | San Francisco Open Data,"Our mission is to empower use of the City and County of San Francisco's data. Our core product is SF OpenData, the official open data portal.","[""Find the data you need"", ""Dataset Alerts""]","[""Publishing Departments""]",[],[],[],[] -2898,https://www.pooler-ga.gov/pooler-departments/pooler-police-department,Accident Reports,200,Police Department - City of Pooler Georgia,"The Pooler Police Department’s mission is to protect life and property through the maintenance of peace and order, and the provision of law enforcement s","[""Police Department""]",[],"[""Helpful Links"", ""Contact""]",[],[],[] -2899,https://cityprotect.com/agency/acso,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2900,https://data.cityofchicago.org,List of Data Sources,200,City of Chicago | Data Portal | City of Chicago | Data Portal,"",[],"[""Menu""]",[],[],[],[] -2901,https://www.alamedaca.gov/Departments/Police-Department/Annual-Arrest-Traffic-Statistics,List of Data Sources,200,Annual Arrest & Traffic Statistics ,"","[""Annual Arrest & Traffic Statistics""]",[],"[""Contact Us"", ""Connect With Us"", ""Read More""]",[],[],[] -2902,https://dps.georgia.gov/ask-us/how-do-i-submit-open-records-request,List of Data Sources,200,Submit an Open Records Request | Georgia Department of Public Safety,"","[""\n Submit an Open Records Request?\n ""]","[""Main navigation"", ""Search this site"", ""Breadcrumb"", ""\n\n Ask Us\n \n\n\n\n"", "" How do I obtain a traffic crash report?\n "", "" How do I obtain photographs or other records related to my crash or incident?\n "", ""\nOpen Records Unit\n"", ""Related Links"", ""How can we help?"", ""About Us"", ""Get in Touch""]","[""Popular searches"", ""Call Us"", ""Visit"", ""Mail"", ""Hours""]",[],[],[] -2903,https://www.antiochca.gov/fc/police/crime-maps/this-weeks-cfs.pdf,Crime Maps & Reports,200,"","",[],[],[],[],[],[] -2904,https://cityprotect.com/agency/gloucesterva,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2905,https://www.atlantapd.org/i-want-to/ops-reports/-folder-132,List of Data Sources,200," - - OPS Reports | Atlanta Police Department - -","","[""Atlanta Police Department"", ""OPS Reports""]","[""Jump to subpage...""]",[],[],[],[] -2906,https://cityprotect.com/agency/55a6d297-f3ec-49d7-9661-ce327d973e7c,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2907,https://cityprotect.com/agency/540048e6-ee66-4a6f-88ae-0ceb93717e50,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2908,https://cityprotect.com/agency/693cc3ad-63f5-46e1-913a-1388f6062946,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2909,https://cityprotect.com/agency/70d8655a-838f-466e-8451-9d21177cbd04,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2910,https://cityprotect.com/agency/236a27e6-a6a4-4653-b943-23f598718d2d,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2911,https://opendata.cityofnewyork.us/,List of Data Sources,200,NYC Open Data - ,NYC Open Data helps New Yorkers use and learn about City data,"[""Home"", ""Open Data for All New Yorkers"", ""See how creators are answering everyday questions with open data""]","[""How You Can Get Involved"", ""Discover NYC Data""]","[""New to Open Data"", ""Data Veterans"", ""Get\u00a0in Touch"", ""Dive into the Data"", ""Datasets by Agency"", ""Datasets by Category"", ""New Datasets"", ""Popular Datasets""]",[],"[""You are leaving the City of New York\u2019s website.""]",[] -2912,https://cityprotect.com/agency/dunwoodypolice,List of Data Sources,200,CityProtect,"",[],[],[],[],[],[] -2913,http://www.bakercountysheriffoffice.org/sex_offenders.php,Sex Offender Registry,200,"Sex Offenders - Baker County Sheriff's Office, Georgia","",[],"[""\r\n\t\t\tSex Offenders\t\t\t\t\t\t ()\r\n\t\t\t\t\t""]",[],[],[],[] -2914,https://cityprotect.com/agency/d1d4c189-c030-4e6b-b336-f9d3224d93bc,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2915,https://www.baldwinsheriff.com/clerical-personal/,List of Data Sources,522,"","",,,,,, -2916,https://alameda.crimegraphics.com/2013/default.aspx,List of Data Sources,200," - CrimeGraphics.com -","",[],[],[],[],[],[] -2917,https://cityprotect.com/agency/43ed6fb3-7e0d-4ab7-84ad-2f7e4b4b40b4,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2918,https://opendata.minneapolismn.gov/datasets/,List of Data Sources,200,Open Minneapolis,Open Minneapolis,[],[],[],[],[],[] -2919,https://dawsoncountysheriff.org/records/,Crime Maps & Reports,200,Records – Dawson County Sheriff's Office,"","[""Records""]","[""GENERAL INFORMATION"", "" "", "" ""]","[""MAILING ADDRESS FOR COMPLETED FORMS"", ""RECORDS STAFF"", ""PROCESSING OF REQUEST(S)""]",[],[],[] -2920,https://webmaster2166.wixsite.com/bartowso/inmate-search,Arrest Records,200,Jail Inmate Search | Bartow Co. S.O.,"","[""BARTOW COUNTY SHERIFF'S OFFICE"", ""104 ZENA DRIVE \u2666 P.O. BOX 476 \u2666 CARTERSVILLE, GEORGIA 30121"", ""CLARK MILLSAP"", ""SHERIFF ""]","[""Inmate Search""]",[],[],[],"[""Main/Jail: 770-382-5050"", ""Non -Emerg/Dispatch: 770-387-5195"", ""Fax: 678-721-3206"", ""Emergencies:\u00a0Dial 9-1-1""]" -2921,https://www.alamedaca.gov/Departments/Police-Department/Crime-Activity,Crime Statistics,200,Alameda Crime Activity ,To see Alameda's reported crimes over the last six months visit Crime Mapping and our daily Activity Log.,"[""Alameda Crime Activity""]","[""Alameda Crime Graphics"", ""Annual Crime Statistics"", ""Monthly Crime Statistics"", ""Annual Arrest and Traffic Statistics"", ""Policy and Hate Crimes Reports""]","[""Contact Us"", ""Connect With Us"", ""Read More""]","[""**On April 7, 2021, APD's Crime Mapping website and Daily Activity Logs were replaced with Alameda's Crime Graphics website. Daily Activity Logs will now be referred to as Media Bulletins and are accessible through the Crime Graphics website.**""]",[],[] -2922,https://acworthpolice.org/departments/annual-report,List of Data Sources,200,Annual Report - Acworth Police Department,"",[],[],"[""Acworth Police Department & Detention Facility Annual Report"", ""Records Division"", ""Police Department"", ""Other Divisons""]","[""2022 Annual Report"", ""2021 Annual Report"", ""2020 Annual Report"", ""2019 Annual Report"", ""2018 Annual Report"", ""2017 Annual Report"", ""2016 Annual Report"", ""2015 Annual Report""]",[],[] -2923,https://cityprotect.com/agency/d1b180b8-befb-4d87-bee8-ce6bd9b26eb3,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2924,https://dunwoodyga.mycusthelp.com/webapp/_rs/(S(4si2fkk1suuja4f33os0gqcf))/supporthome.aspx,List of Data Sources,200," - Support Home Page -","","[""Public Records Center"", ""Public Records Center""]","[""Public Records Menu"", ""FAQs""]","[""Submit an Open Records Request"", ""Search Information about Open Records"", ""View My Open Records Requests""]",[],[],[] -2925,https://cityprotect.com/agency/antiochcapolicedepartment/download,List of Data Sources,200,CityProtect,"",[],[],[],[],[],[] -2926,https://www.dunwoodyga.gov/police/services/police-reports-open-records,List of Data Sources,200," - - Police Reports & Open Records | City of Dunwoody - -","","[""City of Dunwoody"", ""Police Reports & Open Records""]","[""Police Popular Searches"", ""Jump to subpage..."", ""Obtaining a Police Report or Open Records Requests"", ""Filing/Opening a Police Report"", ""QUICK LINKS""]",[],[],[],[] -2927,https://www.dixonpolice.org/evo_cloud_widget/media_folder/?media_folder_id=28802¤t_folder=,Annual & Monthly Reports,200,"","",[],[],[],[],[],[] -2928,https://csucpd.crimegraphics.com/2013/default.aspx#BulletinMenu,Crime Maps & Reports,200," - CrimeGraphics.com -","",[],[],[],[],[],[] -2929,https://www.safehenry.com/missing-persons,List of Data Sources,200,"OPEN RECORDS -","","[""OPEN RECORDS""]","[""OUR PURPOSE""]",[],[],"[""ADDRESS""]",[] -2930,https://cityprotect.com/agency/dd6266ba-010f-4ce0-827a-cc17dd7370e5,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2931,https://cityprotect.com/agency/d007d329-ab78-4bbb-beb0-a15a70510f1d,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2932,https://cityprotect.com/agency/westminsterca,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2933,http://www.el-cerrito.org/1343/Administrative-Investigation-12-21,Complaints & Misconduct,200,"Administrative Investigation 12-21 | El Cerrito, CA - Official Website","","[""\n\n"", ""\r\n\r\nAdministrative Investigation 12-21\t\t""]",[],"[""Loading"", """", """", ""Contact Us"", ""Quick Links"", ""Helpful Links""]",[],[],[] -2934,https://www.dekalbschoolsga.org/student-support-intervention/public-safety/,List of Data Sources,200,Public Safety – DeKalb County School District,"","[""Public Safety""]","[""Profile"", ""Services"", ""Command Staff""]",[],"[""Profile"", ""Services"", ""Command Staff"", ""Profile"", ""Mission"", ""Goals & Motto"", ""Services"", ""Campus Security"", ""Criminal Investigation"", ""Crossing Guards"", ""Emergency response Team (E.R.T.)"", ""Fingerprinting & Background Checks"", ""Office of Professional Standards"", ""Safe Schools"", ""Functions/Responsibilities"", ""Command Staff""]",[],[] -2935,https://cityprotect.com/agency/a6e1d369-e503-4c21-bf7e-701e3d3ff4eb,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2936,https://www.antiochca.gov/police/crime-statistics/crime-statistics/,Crime Statistics,200,"Crime Statistics – City of Antioch, California","",[],"[""Contact Info""]","[""Crime Statistics""]","[""\nSend Message\n"", ""Select a Year""]","[""Joe Vigil"", ""Acting Chief of Police"", ""Captain Morefield"", ""Field Services"", ""Lt. Mellone"", ""Professional Standards""]",[] -2937,https://pap.georgia.gov/inmate-tpm-lookup,Incarceration Records,200,Inmate TPM Lookup | State Board of Pardons and Paroles,"A Tentative Parole Month is NOT a final parole decision. A Tentative Parole Month or TPM represents when the Board will complete a final review of the offender’s case and, if appropriate, set a parole release date.","[""\n Inmate TPM Lookup\n \n ""]","[""Main navigation"", ""Search this site"", ""Breadcrumb"", ""\n\n Pardon/Parole Consideration and Guidelines\n \n\n\n\n"", ""How can we help?"", ""About Us"", ""Get in Touch""]","[""Popular searches"", ""Call Us"", ""Email Us"", ""Visit""]",[],[],[] -2938,https://cityprotect.com/agency/79823daf-96fd-4141-962e-83d5f046dc78,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2939,https://cityprotect.com/agency/a252667a-e0f8-4a64-9f27-665b3a2d6259,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2940,https://gaports.com/departments/protective-services/police-records-reports/,List of Data Sources,200,Police Records and Reports - Georgia Ports Authority,The fastest growing port,"[""\n Georgia Ports Authority\n ""]","[""Police Records / Accident Reports"", ""Georgia Ports Authority Police Department\nPolice Report Dissemination""]","[""Preserving the past, pursuing the future, accelerating..."", ""Preserving the past, pursuing the future, accelerating..."", ""Preserving the past, pursuing the future, accelerating...""]","[""\u00a0"", ""Some tips to help you in receiving a report:"", ""\u00a0"", ""Accident Reports"", ""Contact Us"", """"]","[""OUR MISSION"", ""Facility Locations"", ""Departments"", ""Quick Links"", ""OUR MISSION""]",[] -2941,https://www.eastpointcity.org/east-point-police/#records-identification,List of Data Sources,500,"","",,,,,, -2942,https://www.gptc.edu/compliance-notices/open-records-requests/,List of Data Sources,200,Open Records Requests – Georgia Piedmont Technical College,"",[],[],"[""Compliance Notices""]","[""Programs of Study"", ""Registration""]",[],[] -2943,https://cityprotect.com/agency/carrolltonpd,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2944,https://cityprotect.com/agency/57eb32ec-c607-4908-b6a7-183a9623c634,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2945,https://data.austintexas.gov,List of Data Sources,200,Open Data | City of Austin Texas | Open Data | City of Austin Texas,"",[],"[""Menu""]",[],[],[],[] -2946,"",Arrest Records,-1,"","",,,,,, -2947,https://stewartcountysheriff.org/sexoffender.htm,Sex Offender Registry,200,Stewart County Georgia Sheriff's Office sex offenders,"stewart counth ga sex offenders: Stewart County Sheriff and Sheriff's Office located in Lumpkin Georgia. Serving Lumpkin, Richland, Louvale, Red Hill and other rural areas in Stewart County.",[],[],[],[],[],[] -2948,https://www.sanfranciscopolice.org/your-sfpd/published-reports/arrests-use-force-and-stop-data-admin-code-96a,List of Data Sources,200,"Arrests, Use of Force and Stop Data, Admin Code 96A | San Francisco Police Department","","[""Arrests, Use of Force and Stop Data, Admin Code 96A""]","[""Popular Search Terms:"", ""Law Enforcement Reporting Requirements, Admin Code Sec 96A"", ""Admin Code 96A Reports"", ""San Francisco Police Department""]","[""Non-Emergency"", ""City Services & Questions"", ""Anonymous Tip Line"", ""Text a Tip"", ""Contact Your Police Station"", ""SFPD Headquarters"", ""SFPD First Quarter 2020\u00a0Reports in Compliance with Administrative Code 96A:"", ""SFPD Fourth\u00a0Quarter 2019\u00a0Report in Compliance with Administrative Code 96A:"", ""SFPD Third Quarter 2019\u00a0Report in Compliance with Administrative Code 96A:"", ""SFPD Second Quarter 2019 Report in Compliance with Administrative Code 96A:"", ""SFPD First Quarter 2019 Report in Compliance with Administrative Code 96A:"", ""SFPD First Quarter 2018 Report in Compliance with Administrative Code 96A:"", ""SFPD Second Quarter 2018 Report in Compliance with Administrative Code 96A:"", ""SFPD Third Quarter 2018 Report in Compliance with Administrative Code 96A:"", ""SFPD Fourth Quarter 2018 Report in Compliance with Administrative Code 96A:"", ""SFPD First Quarter 2017 Report in Compliance with Administrative Code 96A:"", ""SFPD Second Quarter 2017 Report in Compliance with Administrative Code 96A:"", ""SFPD Third Quarter 2017 Report in Compliance with Administrative Code 96A:"", ""SFPD Fourth Quarter 2017 Report in Compliance with Administrative Code 96A:"", ""SFPD First Quarter 2016 Report in Compliance with Administrative Code 96A:"", ""SFPD Second Quarter 2016 Report in Compliance with Administrative Code 96A:"", ""SFPD Third Quarter 2016 Report in Compliance with Administrative Code 96A:"", ""SFPD Fourth Quarter 2016 Report in Compliance with Administrative Code 96A:""]",[],[],[] -2949,https://data.baltimorecity.gov/,List of Data Sources,200,Open Baltimore,Baltimore City's Open Data Hub,[],[],[],[],[],[] -2950,http://www.dcor.state.ga.us/Divisions/ExecutiveOperations/OPS/OpenRecords,Records Request Info,-1,"","",,,,,, -2951,http://www.madisoncountysheriffga.org/Open-Records-Request.html,Records Request Info,200,Open-Records-Request,"",[],[],[],[],[],[] -2952,https://cityprotect.com/agency/3faebc0a-4169-45f6-b5dc-4fe1545720d1,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -2953,https://woodstockga.justfoia.com/publicportal/home/newrequest,List of Data Sources,200,JustFOIA Public Portal,"",[],[],[],[],[],[] -2954,https://sheriff.chathamcountyga.gov/Enforcement/SORT,Sex Offender Registry,200,Chatham County Sheriff's Office - SORT,"","[""\nChatham County Sheriff's Office\n"", ""SORT""]",[],"[""ATTENTION REGISTERED SEX OFFENDERS"", ""Wanted Absconders""]",[],"[""Chatham Sheriff"", ""eServices"", ""PART OF CHATHAMCOUNTYGA.GOV""]",[] -2955,https://pittsburghpa.gov/police/police-reports,Annual & Monthly Reports,200,Police Reports | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Police Reports"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""Annual Reports""]","[""DEPARTMENT MENU""]","[""Police Data"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Zones"", ""Resources"", ""News"", ""Police Links""]",[],[] -2956,https://tableau.alleghenycounty.us/t/PublicSite/views/CJ_UCR_PGH_8-22-17_v3/Home_1?iframeSizedToWindow=true&%3Aembed=y&%3AshowAppBanner=false&%3Adisplay_count=no&%3AshowVizHome=no&%3Aorigin=viz_share_link,Crime Statistics,200," - Workbook: Crime in the City of Pittsburgh","",[],[],[],[],[],[] -2957,https://pittsburghpa.maps.arcgis.com/apps/dashboards/4750c482e06c4c348e6cc0d54e6475af,Other,200,ArcGIS Dashboards,ArcGIS Dashboards,[],[],[],[],[],[] -2958,https://pittsburghpa.gov/city-info/press-releases,Media Bulletins,200,"City Press Releases - Mayor, Public Safety, Citiparks, Specail Events, DPW | pittsburghpa.gov","","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""City Press Releases"", ""Offices"", ""Press Releases "", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""To view press release articles, please select an office.""]","[""DEPARTMENT MENU""]","[""City Information Center""]",[],[] -2959,https://pittsburghpa.gov/publicsafety/blotterview.html,Media Bulletins,200,Public Safety Blotter,City of Pittsburgh Public Safety Media Blotter.,"[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""BLOTTER VIEW"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""Public Safety Blotter Articles""]",[],[],[],[] -2960,https://pittsburghpa.gov/police/task-force-police-reform,Resources,200,Response to Community Task Force On Police Reform | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", """", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""PBP Response to Mayor's Community Task Force Recommendations"", ""Police Links""]",[],[] -2961,https://www.alleghenycounty.us/police/contact/index.aspx,Contact Info & Agency Meta,404,"","",,,,,, -2962,https://www.ottumwacourier.com/news/record/,Arrest Records,200,Public records | ottumwacourier.com,An assortment of public records compiled for southern Iowa by the staff of the Ottumwa Courier.,"[""\n\n \n Public records\n \n \n""]",[],"[""\n \n Police Records\n \n "", ""\n\n \n\n \n For the record"", ""\n\n \n\n \n For the record"", ""\n\n \n\n \n For the record"", ""\n\n \n\n \n For the record"", ""\n\n \n\n \n For the record"", ""\n \n Marriages & Land Transfers\n \n "", ""\n\n \n\n \n Marriages and land transfers for Jan. 25, 2024"", ""\n\n \n\n \n Marriages and land transfers for Jan. 18, 2024"", ""\n\n \n\n \n Marriages and land transfers for Jan. 11, 2024"", ""\n\n \n\n \n Marriages and land transfers for Jan. 4, 2024"", ""\n\n \n\n \n Marriages and land transfers for Dec. 21, 2023"", ""\n \n Other Public Records\n \n "", ""\n\n \n\n \n Keith termination letter"", ""\n\n \n\n \n Fye termination letter"", ""\n\n \n\n \n McPherson resignation"", ""\n\n \n\n \n Read the Council's lawsuit against Centerville's school board"", ""\n\n \n\n \n Honey Creek Resort condition report"", ""\n\n \n\n \n Ryan Hodges' Resignation Agreement"", ""\n\n \n\n \n Evidence decision in Willard Miller's case"", ""\n\n \n\n \n Albia roundabout presentation"", ""\n\n \n\n \n Appeals court decision in Courtney and Williams vs. City of Ottumwa"", ""\n\n \n\n \n Office of Civil Rights letter to Ottumwa Schools"", ""\n\n \n\n \n Office of Civil Rights resolution with Ottumwa Schools"", ""\n\n \n\n \n Mike Bogle's early retirement agreement with the City of Centerville"", ""\n\n \n\n \n Centerville Fire Rescue Review Report"", ""\n\n \n\n \n Records for termination of Centerville Police Officer Jacob Downs"", ""\n\n \n\n \n Appanoose County FY 2021 audit report"", ""Trending Recipes"", ""\n \n All records\n \n "", ""\n\n \n\n \n Marriages and land transfers for Jan. 25, 2024"", ""\n\n \n\n \n Marriages and land transfers for Jan. 18, 2024"", ""\n\n \n\n \n Marriages and land transfers for Jan. 11, 2024"", ""\n\n \n\n \n Marriages and land transfers for Jan. 4, 2024"", ""\n\n \n\n \n Marriages and land transfers for Dec. 21, 2023"", ""\n\n \n\n \n Marriages and land transfers for Dec. 14, 2023"", ""\n\n \n\n \n Marriages and land transfers for Dec. 7, 2023"", ""\n\n \n\n \n Marriages and land transfers for Nov. 30, 2023"", ""\n\n \n\n \n Marriages and land transfers for Nov. 23, 2023"", ""\n\n \n\n \n Marriages and land transfers for Nov. 16, 2023"", ""\n\n \n\n \n Marriages and land transfers for Nov. 9, 2023"", ""\n\n \n\n \n Marriages and land transfers for Nov. 2, 2023"", ""\n\n \n\n \n Marriages and land transfers for Oct. 26, 2023"", ""\n\n \n\n \n Marriages and land transfers for Oct. 19, 2023"", ""\n\n \n\n \n Marriages and land transfers for Oct. 12, 2023"", ""\n\n \n\n \n Marriages and land transfers for Oct. 5, 2023"", ""\n\n \n\n \n Marriages and land transfers for Sept. 28, 2023"", ""\n\n \n\n \n Marriages and land transfers for Sept. 21, 2023"", ""\n\n \n\n \n Marriages and land transfers for Sept. 14, 2023"", ""\n\n \n\n \n Marriages and land transfers for Sept. 7, 2023"", ""\n\n \n\n \n Marriages and land transfers for Aug. 31, 2023"", ""\n\n \n\n \n Marriages and land transfers for Aug. 24, 2023"", ""\n\n \n\n \n Marriages and land transfers for Aug. 17, 2023"", ""\n\n \n\n \n Marriages and land transfers for Aug. 10, 2023"", ""\n\n \n\n \n Marriages and land transfers for Aug. 3, 2023"", ""\n\n \n\n \n Marriages and land transfers for July 27, 2023"", ""\n\n \n\n \n Marriages and land transfers for July 20, 2023"", ""\n\n \n\n \n Marriages and land transfers for July 13, 2023"", ""\n\n \n\n \n Marriages and land transfers for July 6, 2023"", ""\n\n \n\n \n Marriages and land transfers for June 29, 2023"", ""\n\n \n\n \n Marriages and land transfers for June 22, 2023"", ""\n\n \n\n \n Marriages and land transfers for June 15, 2023"", ""\n\n \n\n \n Marriages and land transfers for June 8, 2023"", ""\n\n \n\n \n Marriages and land transfers for June 1, 2023"", ""\n\n \n\n \n Marriages and land transfers for May 25, 2023"", ""\n\n \n\n \n Marriages and land transfers for May 18, 2023"", ""\n\n \n\n \n Marriages and land transfers for May 11, 2023"", ""\n\n \n\n \n For the record"", ""\n\n \n\n \n For the record"", ""\n\n \n\n \n Marriages and land transfers for May 4, 2023"", ""\n\n \n\n \n For the record"", ""\n\n \n\n \n For the record"", ""\n\n \n\n \n Marriages and land transfers for April 27, 2023"", ""\n\n \n\n \n Marriages and land transfers for April 20, 2023"", ""\n\n \n\n \n For the record"", ""\n\n \n\n \n For the record"", ""\n\n \n\n \n Marriages and land transfers for April 13, 2023"", ""\n\n \n\n \n For the record"", ""\n\n \n\n \n For the record"", ""\n\n \n\n \n Marriages and land transfers for April 6, 2023"", ""\n\n \n Submit news tip\n \n \n"", ""\n\n \n Write a letter\n \n \n"", ""\n\n \n Obituaries\n \n \n"", ""\n \n Most Popular\n \n "", ""\n\n \n\n \n Iowa FB vs Minnesota"", ""\n\n \n\n \n Ottumwa FB vs Des Moines East"", ""\n\n \n\n \n Halloweenapalooza 2023 at Bridge View"", ""\n\n \n\n \n Iowa FB vs Purdue"", ""\n\n \n\n \n Oktoberfest Bike Show & Concert"", ""\n\n \n\n \n Ottumwa at 4A Boys Golf Tournament"", ""\n\n \n Videos\n \n \n"", ""\n\n \n\n \n Ottumwa Schools - Board Meeting - 1/22/2024"", ""\n\n \n\n \n Ottumwa City Council - January 16 2024 - Regular Meeting"", ""Featured Local Savings""]","[""\r\n \r\n Ottumwa, IA\r\n \r\n (52501)\n"", ""Weather Alert"", ""Dense Fog Advisory from TUE 8:00 PM CST until WED 9:00 AM CST"", ""Weather Alert"", ""\n\n \n\n \n Vitko, Michael"", ""\n\n \n\n \n PFAFF, Jack"", ""\n\n \n\n \n BACHMAN, Jane"", ""\n\n \n\n \n WRIGHT, Doris"", ""\n\n \n\n \n RHYNAS, Judy"", ""\n\n \n\n \n Dodds, Donna"", ""\n\n \n\n \n Timothy Fisher"", ""Articles"", ""Images"", ""Videos"", ""\n\n \n Photo Galleries & Reprints\n \n \n"", ""\n\n \n\n \n Board of Supervisors"", ""\n\n \n\n \n Ottumwa Schools - Board Meeting - 1/08/2024"", ""\n\n \n\n \n Ottumwa City Council - January 02 2024 - Regular Meeting"", ""\n \n Contact Information\n \n "", ""\n \n Services\n \n "", ""\n \n Sections\n \n "", ""Browser Compatibility""]","[""Today"", ""Tonight""]",[] -2963,https://www.alleghenycounty.us/police/news/press-releases.aspx,Media Bulletins,404,"","",,,,,, -2964,https://arcata.crimegraphics.com/2013/default.aspx,Crime Maps & Reports,200," - CrimeGraphics.com -","",[],[],[],[],[],[] -2965,https://louisville-police.org/Directory.aspx,Contact Info & Agency Meta,200,"Staff Directory • Louisville Metro PD, KY • CivicEngage","","[""\r\n\t\tStaff Directory\r\n\t""]",[],"[""Loading"", ""Live Edit"", ""Contact Us"", ""FAQs"", ""Popular Links"", ""Site Links""]",[],[],[] -2966,https://louisville-police.org/sitemap,List of Data Sources,200,"Site Map • Louisville Metro PD, KY • CivicEngage","",[],[],"[""Loading"", ""\nHome\n"", ""\nOur Department\n"", ""\nServices\n"", ""\nEducation & Events\n"", ""\nLMPD Transparency\n"", ""\nHow Do I...\n"", ""Contact Us"", ""FAQs"", ""Popular Links"", ""Site Links""]",[],[],[] -2967,https://kcoj.kycourts.net/dockets/,Court Cases,200,KCOJ Docket,"",[],[],[],[],[],[] -2968,https://louisville-police.org/800/Transparency-Reports,List of Data Sources,200,"Transparency Reports | Louisville Metro PD, KY","Reports generated by the LMPD that include crime incidents, demographic data, complaint data, annual reports and other miscellaneous reports.",[],"[""Crime Reports"", ""Violent Crime Information"", ""Professional Standards Unit Reports"", ""PIU Case Files"", ""PSU Case Files"", ""Vehicle Stops Reports"", ""Citizen Attitude Survey"", ""LMPD Info"", ""Grants""]","[""Loading"", ""Contact Us"", ""FAQs"", ""Popular Links"", ""Site Links""]",[],[],[] -2969,https://drive.google.com/file/d/1Na7Bsbd9BETB9ER-hyKOqiEhzWMNZk17/view,Policies & Contracts,404,"","",,,,,, -2970,https://drive.google.com/file/d/102zX-xpY84QLR6N2I5qmeNn6x_8uLOdy/view,Policies & Contracts,404,"","",,,,,, -2971,https://docs.google.com/spreadsheets/d/1k-SBpcA0Qc0znWFYKu4JtqNfnFFNPf7Rhl6mT_bPjvU/edit#gid=0,Contact Info & Agency Meta,401,"","",,,,,, -2972,https://cob.org/gov/dept/police/news-police/police-daily-activity,Calls for Service,200,Police Daily Activity - City of Bellingham,"","[""Police Daily Activity""]","[""Contacts"", ""About Us"", ""Contact Us"", ""Join the Conversation ""]",[],[],[],[] -2973,https://cob.org/gov/dept/police/news-police/crime-stats,Crime Statistics,200,Crime Statistics - City of Bellingham,"","[""Crime Statistics""]","[""Contacts"", ""About Us"", ""Contact Us"", ""Join the Conversation ""]",[],[],[],[] -2974,https://cob.org/gov/dept/police/news-police/use-of-force-statistics,Use of Force Reports,200,Use of Force Statistics - City of Bellingham,"","[""Use of Force Statistics""]","[""Contacts"", ""About Us"", ""Contact Us"", ""Join the Conversation ""]",[],[],[],[] -2975,https://portal.arxcommunity.com/dashboards/community/mi-ci-westland-pd,Misc Police Activity,200," - - Westland Police Transparency Dashboard - -","","[""\n\n \n \n Westland Police Transparency Dashboard\n \n\n ""]",[],[],[],[],[] -2976,https://www.crimemapping.com/map/agency/405,Crime Statistics,200,CrimeMapping.com - Helping You Build a Safer Community,"",[],[],[],[],[],[] -2977,https://data.boston.gov/dataset/crime-incident-reports-august-2015-to-date-source-new-system,Calls for Service,200,Crime Incident Reports (August 2015 - To Date) (Source: New System) - Dataset - Analyze Boston,"","[""Crime Incident Reports (August 2015 - To Date) (Source: New System)"", ""Boston Police Department\n \n "", ""\n \n Crime Incident Reports (August 2015 - To Date) (Source: New System)\n \n \n \n ""]","["" Organization"", "" Social"", "" License"", ""Data and Resources""]","[""Tags"", ""Additional Info""]",[],[],[] -2978,https://beaconny.gov/index.php/beacon-police-department-daily-blotter/,Calls for Service,200,Beacon Police Department Daily Blotter — City of Beacon,"","[""Beacon Police Department Daily Blotter""]",[],[],"[""CONTACT US"", ""STAY CONNECTED"", ""Latest News""]",[],[] -2979,https://www.dutchessny.gov/Departments/Sheriff/sheriff-news-releases.htm,Media Bulletins,200,Sheriff News Releases,View 2024 Dutchess County Sheriff News,"[""Sheriff News Releases""]","[""News Archive"", """"]","[""Municipal Information"", ""Related Information"", "" Elementary & Secondary Education"", ""Higher Education"", ""Adult Education"", ""Other Educational Resources & Information"", ""Business "", ""Community"", ""Tourism "", ""Arts & Leisure"", ""Contact""]",[],[],[] -2980,https://www.dutchessny.gov/Departments/Sheriff/Sheriffs-Office-Civil-Division-Evictions.htm,Resources,200,Evictions,"","[""Evictions""]",[],"[""Municipal Information"", ""Related Information"", "" Elementary & Secondary Education"", ""Higher Education"", ""Adult Education"", ""Other Educational Resources & Information"", ""Business "", ""Community"", ""Tourism "", ""Arts & Leisure"", ""Contact"", ""Eviction Fees""]",[],[],[] -2981,https://www.dutchessny.gov/Departments/Sheriff/docs/Dutchess-County-Sheriffs-Office-Use-of-Force-Policy.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -2982,https://villageofshorewood.org/984/Weekly-Calls-For-Service,Calls for Service,200,"Weekly Calls For Service | Shorewood, WI - Official Website",Weekly calls for service,"[""\r\n\r\nWeekly Calls For Service\t\t""]",[],"[""Loading"", ""Contact"", ""Quick Links"", ""Helpful Links""]",[],[],[] -2983,https://villageofshorewood.org/966/Police-Department-Monthly-Reports,Annual & Monthly Reports,200,"Monthly Reports | Shorewood, WI - Official Website","","[""\r\n\r\nMonthly Reports\t\t""]",[],"[""Loading"", ""Contact"", ""Quick Links"", ""Helpful Links""]",[],[],[] -2984,https://villageofshorewood.org/965/Police-Department-Documents,List of Data Sources,200,"Police Department Documents | Shorewood, WI - Official Website","","[""\r\n\r\nPolice Department Documents\t\t""]",[],"[""Loading"", ""Contact"", ""Quick Links"", ""Helpful Links""]",[],[],[] -2985,https://www.vofishkill.us/sites/g/files/vyhlif3136/f/uploads/police_dept._-_use_of_force_6.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -2986,https://www.phillypolice.com/assets/accountability/PPD-Disciplinary-Code-July-2014.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -2987,https://apps.missoulacounty.us/dailypublicreport/,Calls for Service,200," - Daily Public Report -","",[],[],[],[],[],[] -2988,https://www.arlingtontx.gov/city_hall/departments/police/about_us/contact_us,Contact Info & Agency Meta,200," - Contact Us - City of Arlington -","","[""YOUR COMMUNITY NEWS AND EVENTS"", ""City of Arlington""]","[""Contact Us""]",[],[],[],[] -2989,https://www.cabq.gov/police/contact,Contact Info & Agency Meta,200,Albuquerque Police Contact — City of Albuquerque,"","[""Albuquerque Police Contact""]","[""Get Directions"", ""\n Contact Information\n "", ""\n\nPhysical Address\n "", ""\n Mailing Address\n ""]","[""CONTACT"", ""ACCESS"", ""CONNECT""]","[""VISIT US ON SOCIAL MEDIA"", ""NEWSLETTER SIGNUP"", ""External Link Disclaimer""]",[],[] -2990,https://www.atlantaga.gov/government/mayor-s-office/executive-offices/office-of-innovation-delivery-and-performance/dataatlanta,List of Data Sources,200," - - DataAtlanta | Atlanta, GA - -","","[""DataAtlanta""]","[""Jump to subpage...""]",[],[],[],[] -2991,https://public.powerdms.com/ANCHOR/tree/documents/511669,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -2992,https://www.cabq.gov/cpoa/findings-letters/special-cases-sent-to-internal-a/officer-involved-shootings,Officer Involved Shootings,200,Officer Involved Shootings — City of Albuquerque,Officer Involved Shootings (OIS),"[""Officer Involved Shootings""]",[],"[""CONTACT"", ""ACCESS"", ""CONNECT""]","[""VISIT US ON SOCIAL MEDIA"", ""NEWSLETTER SIGNUP"", ""External Link Disclaimer""]",[],[] -2993,https://p1cdn4static.civiclive.com/UserFiles/Servers/Server_14481062/File/City%20Hall/Depts/HR/Personnel-Manual.pdf,Policies & Contracts,-1,"","",,,,,, -2994,https://www.cabq.gov/police/crime-statistics,Crime Statistics,200,Crime Statistics — City of Albuquerque,Information about Albuquerque crime statistics:,"[""Crime Statistics""]","[""Citywide Crime Statistics\u00a0"", ""Crime Mapping""]","[""Monthly Crime Stats"", ""Crime Trends"", ""Homicides"", ""Officer-Involved Shootings"", ""Traffic Division\u00a0"", ""CONTACT"", ""ACCESS"", ""CONNECT""]","[""VISIT US ON SOCIAL MEDIA"", ""NEWSLETTER SIGNUP"", ""External Link Disclaimer""]",[],[] -2995,https://www.atlantapd.org/about-apd/contact-us ,Contact Info & Agency Meta,404,"","",,,,,, -2996,https://data-arlingtontx.opendata.arcgis.com/,List of Data Sources,200,ArcGIS Hub,"Discover, analyze and download data from ArcGIS Hub. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",[],[],[],[],[],[] -2997,https://www.arlingtontx.gov/city_hall/departments/police/reporting/official_crime_reports,Crime Statistics,404,"","",,,,,, -2998,https://justicereform.atlantaga.gov/use-of-force  ,Use of Force Reports,404,"","",,,,,, -2999,https://www.crimemapping.com/map/agency/6,Crime Maps & Reports,200,CrimeMapping.com - Helping You Build a Safer Community,"",[],[],[],[],[],[] -3000,https://data.muni.org/browse?category=Public+Safety,Crime Statistics,200," - - Office of Information Technology (OIT) - - - opendata - - -","",[],"[""\u200b\u200b\u200b\u200b\u200bOpen Data Portal2024\u00a0CAMA Residential Data - CSV""]",[],[],[],[] -3001,https://www.atlantapd.org/home/showpublisheddocument/4026/637582398211730000  ,Complaints & Misconduct,404,"","",,,,,, -3002,https://arlingtonpd.org/webapps/policeincidents/,Calls for Service,200," - Arlington Police Department - Police Incidents -","",[],"[""Current Police Activity""]",[],"[""Count By Priority"", ""Count By Police District""]",[],[] -3003,https://public.powerdms.com/ANCHOR/tree,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -3004,http://opendata.atlantapd.org/,Crime Maps & Reports,200,Atlanta Police Open Data,This website provides crime data to the public.,[],[],[],[],[],[] -3005,https://www.cabq.gov/police/standard-operating-procedures/standard-operating-procedures-manual,Policies & Contracts,200,City of Albuquerque,"Official website for the City of Albuquerque, N.M.",[],[],"[""CONTACT"", ""ACCESS"", ""CONNECT""]","[""VISIT US ON SOCIAL MEDIA"", ""NEWSLETTER SIGNUP"", ""External Link Disclaimer""]",[],[] -3006,https://www.arlingtontx.gov/city_hall/departments/police/reporting/use_of_force_report,Use of Force Reports,404,"","",,,,,, -3007,https://opendata.cabq.gov/,List of Data Sources,404,"","",,,,,, -3008,https://www.cabq.gov/police/public-reports/annual-reports/calls-for-service,Calls for Service,200,Calls for Service — City of Albuquerque,Annual report information about Albuquerque Police calls for service.,"[""Calls for Service""]","[""Albuquerque Relies on APD"", ""Types of Calls""]","[""Chart: APD Emergency Communications Center - Telephone Calls Answered"", ""Table: APD Emergency Communications Center - Telephone Calls Answered Jan-June"", ""Table: APD Emergency Communications Center - Telephone Calls Answered July-Dec."", ""Calendar Year Averages & Totals"", ""Chart: Calls for Service"", ""Table: Calls for Service"", ""Calls for Service: Definitions"", ""CONTACT"", ""ACCESS"", ""CONNECT""]","[""VISIT US ON SOCIAL MEDIA"", ""NEWSLETTER SIGNUP"", ""External Link Disclaimer""]",[],[] -3009,https://www.cabq.gov/police/documents/6-1-training-division-opa-draft-for-website.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3010,https://gbi.georgia.gov/news/2021-11-07/2021-officer-involved-shootings ,Officer Involved Shootings,404,"","",,,,,, -3011,https://www.atlantapd.org/i-want-to/crime-data-downloads,Crime Statistics,200," - - Weekly Crime Reports | Atlanta Police Department - -","","[""Atlanta Police Department"", ""Weekly Crime Reports""]","[""Jump to subpage..."", ""Weekly Crime Reports (PDF)""]",[],[],[],[] -3012,https://data.muni.org/,List of Data Sources,200," - - Office of Information Technology (OIT) - - - opendata - - -","",[],"[""\u200b\u200b\u200b\u200b\u200bOpen Data Portal2024\u00a0CAMA Residential Data - CSV""]",[],[],[],[] -3013,https://documents.cabq.gov/police/standard-operating-procedures/2-52-use-of-force.pdf,Policies & Contracts,404,"","",,,,,, -3014,https://acrbgov.org/in-the-news/,Complaints & Misconduct,200,ACRB Reports - ACRB,ACRB Quarterly Reports Second Quarter Update FY 23 ACRB Annual Reports 2022 ACRB Annual Report 2021 ACRB Annual Report 2020 ACRB Annual Report 2019 ACRB Annual Report 2018 ACRB Annual Report 2017 ACRB Annual Report 2016 ACRB Annual Report 2015 ACRB Annual Report 2014 ACRB Annual Report 2013 ACRB Annual Report 2012 ACRB Annual Report,"[""ACRB Reports""]","[""Why File a Complaint for Officer Misconduct?"", ""ACRB Quarterly Reports"", ""ACRB Annual Reports"", ""ACRB Annual Surveys"", ""ACRB Q&A Reports"", ""FOLLOW US""]","[""\n\n\t\t\t\t\t\tCall Us:(404) 865-8622\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tMonday - Friday:8:30 a.m. - 5:00 p.m.\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\t55 Trinity Avenue, S.W., City Hall Tower\t\t\t\t\t\n"", ""\nACRB\n"", ""\nTo find out what the City of Atlanta is doing in response to the Coronavirus (COVID-19), please\n\nClick Here\n\n"", ""\nContact Us\n"", ""\nOur Services\n"", ""\nStay Updated\n""]",[],[],[] -3015,https://www.cabq.gov/police/internal-reports,Use of Force Reports,200,Public Reports — City of Albuquerque,"The Albuquerque Police Department publishes monthly reports to the City Council, Internal Affairs Report, Use of Force Annual reviews, and Mental Health Response Advisory Reports (MHRAC)","[""Public Reports""]","[""Mental Health Response Advisory Reports (MHRAC)"", ""Use of Force Annual Review"", ""Report Archives"", ""About these Documents""]","[""Internal Affairs"", ""CONTACT"", ""ACCESS"", ""CONNECT""]","[""VISIT US ON SOCIAL MEDIA"", ""NEWSLETTER SIGNUP"", ""External Link Disclaimer""]",[],[] -3016,https://www.cabq.gov/police/internal-affairs/internal-affairs-reports,Complaints & Misconduct,200,Internal Affairs Reports — City of Albuquerque,The latest summaries of Internal Affairs data are available online.,"[""Internal Affairs Reports""]","[""Internal Affairs Reports""]","[""Quarterly Reports:"", ""2023"", ""2022"", ""2021"", ""2020"", ""2019"", ""Archived Reports:"", ""CONTACT"", ""ACCESS"", ""CONNECT""]","[""VISIT US ON SOCIAL MEDIA"", ""NEWSLETTER SIGNUP"", ""External Link Disclaimer""]",[],[] -3017,https://www.anchoragepolice.com/locations-hours,Contact Info & Agency Meta,200,Locations & Hours — Anchorage Police Department,"","[""Locations & Hours""]","[""apd Headquarters716 W. 4th AveAnchorage, AK 99501"", ""Department Directory"", ""Things you can do from home"", ""Elmore building4501 Elmore RdAnchorage, AK 99507""]","[""Contact FAQ APD Swag""]",[],[],[] -3018,https://data.baltimorecity.gov/datasets/911-calls-for-service-2020/explore?showTable=true,Calls for Service,200,911 Calls For Service 2020,This dataset represents the Police Emergency and Non-Emergency calls to 911 for calendar year 2020.,[],[],[],[],[],[] -3019,https://www.austintexas.gov/department/police,Contact Info & Agency Meta,200,Police | AustinTexas.gov,"One Austin, Safer Together","[""Police""]","[""Action Navigation"", ""GTranslate"", ""Main menu"", ""Frequently Viewed Departments"", ""City Clerk"", ""One Austin, Safer Together"", ""Making a Difference "", ""Upcoming Events"", ""Contact Info"", ""Footer Menu"", ""Second Footer Menu""]","[""Resident"", ""Business"", ""Government"", ""Departments"", ""Connect"", ""Austin Police Department"", ""Interim Chief of Police Robin Henderson"", ""Other Links""]","["" Recent News""]",[],[] -3020,https://bpdgis.maps.arcgis.com/apps/dashboards/511ba81db3414df3bb474749b69bc258,Crime Maps & Reports,200,ArcGIS Dashboards,ArcGIS Dashboards,[],[],[],[],[],[] -3021,https://www.auroragov.org/residents/public_safety/police/annual___public_reports,Stops,200," - Annual & Public Reports - City of Aurora -","","[""Welcome to theCity of AuroraColorado""]","[""Annual & Public Reports""]","[""Contact Info"", ""Useful Links"", ""City of AuroraColorado"", ""Accreditations""]",[],[],[] -3022,https://data.austintexas.gov/,List of Data Sources,200,Open Data | City of Austin Texas | Open Data | City of Austin Texas,"",[],"[""Menu""]",[],[],[],[] -3023,https://app.powerbigov.us/view?r=eyJrIjoiYmJjZmUwMTEtODY2NS00MGEyLWI0YTctYTVlYzkzYWNlODc3IiwidCI6Ijk0NGZhOWJhLTg0NTQtNDEzZC1iOWU2LWJmNDBhZjFkNmE5YiJ9&pageName=ReportSection2544927b6a86287348d3,Complaints & Misconduct,200,Microsoft Power BI,"",[],[],[],[],[],[] -3024,https://www.auroragov.org/residents/public_safety/police/annual___public_reports,Arrest Records,200," - Annual & Public Reports - City of Aurora -","","[""Welcome to theCity of AuroraColorado""]","[""Annual & Public Reports""]","[""Contact Info"", ""Useful Links"", ""City of AuroraColorado"", ""Accreditations""]",[],[],[] -3025,https://www.auroragov.org/residents/public_safety/police/directives_manual,Policies & Contracts,200," - Directives Manual - City of Aurora -","","[""Welcome to theCity of AuroraColorado""]","[""Directives Manual""]","[""Contact Info"", ""Useful Links"", ""City of AuroraColorado"", ""Accreditations""]",[],[],[] -3026,https://www.atlantapd.org/about-apd/standard-operating-procedures  ,Policies & Contracts,404,"","",,,,,, -3027,https://www.auroragov.org/cms/One.aspx?portalId=16242704&pageId=16573671,Crime Maps & Reports,200," - Crime Data - City of Aurora -","","[""Welcome to theCity of AuroraColorado""]","[""Crime Data""]","[""Contact Info"", ""Useful Links"", ""City of AuroraColorado"", ""Accreditations""]",[],[],[] -3028,https://p1cdn4static.civiclive.com/UserFiles/Servers/Server_1881137/File/Residents/Public%20Safety/Police/Join%20the%20APD/2020%20NEW%20Police%20fitness%20Guide.pdf,Policies & Contracts,-1,"","",,,,,, -3029,https://p1cdn4static.civiclive.com/UserFiles/Servers/Server_1881137/File/Residents/Public%20Safety/Police/APD%20News/SOP%20FIU%2002.00.pdf,Policies & Contracts,-1,"","",,,,,, -3030,https://www.austintexas.gov/page/annual-crime-traffic-reports,Crime Statistics,200,Annual Crime & Traffic Reports | AustinTexas.gov,Reports Annual Crime and Traffic Report 2021 (PDF) Annual Crime and Traffic Report 2020 (PDF) Annual Crime and Traffic Report 2019 (PDF),"[""Annual Crime & Traffic Reports""]","[""Action Navigation"", ""GTranslate"", ""Main menu"", ""Frequently Viewed Departments"", ""Footer Menu"", ""Second Footer Menu""]","[""Resident"", ""Business"", ""Government"", ""Departments"", ""Connect"", ""Reports""]",[],[],[] -3031,https://data.baltimorecity.gov/datasets/part1-crime-data/explore?showTable=true,Crime Statistics,200,Open Baltimore,Baltimore City's Open Data Hub,[],[],[],[],[],[] -3032,https://www.bakersfieldcity.us/483/Statistics-Data,Use of Force Reports,200,"Statistics & Data | Bakersfield, CA - Official Website",View the annual Internal Affairs Annual Report.,"[""Statistics & Data""]",[],[],[],[],[] -3033,https://data.austintexas.gov/dataset/2019-Response-to-Resistance-Data/3bfz-mri4,Use of Force Reports,200,2019 Response to Resistance Data | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3034,https://cob.maps.arcgis.com/apps/webappviewer/index.html?id=07988399180e443e9ab43aa75ad59d1b,Contact Info & Agency Meta,200,ArcGIS Web Application,"","[""""]",[],[],[],[],[] -3035,https://data-auroraco.opendata.arcgis.com/,List of Data Sources,200,"City of Aurora, Colorado","City of Aurora, Colorado",[],[],[],[],[],[] -3036,https://www.atlantapd.org/home/showpublisheddocument/4560/637762918331970000,Policies & Contracts,404,"","",,,,,, -3037,https://www.auroragov.org/cms/One.aspx?portalId=16242704&pageId=16394210,Contact Info & Agency Meta,200," - Police - City of Aurora -","","[""Welcome to theCity of AuroraColorado""]","[""Police""]","[""Contact Us"", ""Contact Info"", ""Useful Links"", ""City of AuroraColorado"", ""Accreditations""]",[],[],[] -3038,https://www.auroragov.org/residents/public_safety/police/annual___public_reports,Calls for Service,200," - Annual & Public Reports - City of Aurora -","","[""Welcome to theCity of AuroraColorado""]","[""Annual & Public Reports""]","[""Contact Info"", ""Useful Links"", ""City of AuroraColorado"", ""Accreditations""]",[],[],[] -3039,https://data.baltimorecity.gov/datasets/arrests/explore?showTable=true,Arrest Records,200,Open Baltimore,Baltimore City's Open Data Hub,[],[],[],[],[],[] -3040,https://www.bakersfieldcity.us/890/Policies-and-Procedures,Policies & Contracts,200,"Policies and Procedures | Bakersfield, CA - Official Website","","[""Policies and Procedures""]",[],[],[],[],[] -3041,https://www.austintexas.gov/sites/default/files/files/Police/200.3%20Response%20to%20Resistance.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3042,http://www.austintexas.gov/GIS/CrimeViewer/,Crime Maps & Reports,404,"","",,,,,, -3043,https://www.auroragov.org/residents/public_safety/police/crime_data,Crime Statistics,200," - Crime Data - City of Aurora -","","[""Welcome to theCity of AuroraColorado""]","[""Crime Data""]","[""Contact Info"", ""Useful Links"", ""City of AuroraColorado"", ""Accreditations""]",[],[],[] -3044,https://www.austintexas.gov/sites/default/files/files/APD-Ferguson-Training-Curriculum-Review-061920.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3045,https://data.burlingtonvt.gov/explore/dataset/bpd-traffic-stops/table/?sort=call_time&dataChart=eyJxdWVyaWVzIjpbeyJjb25maWciOnsiZGF0YXNldCI6ImJwZC10cmFmZmljLXN0b3BzIiwib3B0aW9ucyI6eyJzb3J0IjoiY2FsbF90aW1lIn19LCJjaGFydHMiOlt7ImFsaWduTW9udGgiOnRydWUsInR5cGUiOiJsaW5lIiwiZnVuYyI6IkFWRyIsInlBeGlzIjoiY291bnRfdGlja2V0cyIsInNjaWVudGlmaWNEaXNwbGF5Ijp0cnVlLCJjb2xvciI6IiMwMDAwMDAifV0sInhBeGlzIjoiY2FsbF90aW1lIiwibWF4cG9pbnRzIjoiIiwidGltZXNjYWxlIjoieWVhciIsInNvcnQiOiIifV0sImRpc3BsYXlMZWdlbmQiOnRydWUsImFsaWduTW9udGgiOnRydWV9,Stops,200,BTVstat Data Hub,City of Burlington Vermont Open Data Portal,[],[],[],[],[],[] -3046,https://www.baltimorepolice.org/contact-baltimore-police-department,Contact Info & Agency Meta,200,Contact the Baltimore Police Department | Baltimore Police Department,Information on various ways to contact the Baltimore Police Department,"[""Baltimore Police Department"", ""Contact the Baltimore Police Department\n""]","[""Utilities"", ""Breadcrumb"", ""How Do I ..."", ""Baltimore Police Department"", ""How Do I"", ""Follow Us"", ""Footer menu""]","[""\n Contact Headquarters or Find Your District\n"", ""Newsletter""]",[],[],[] -3047,https://www.burlingtonvt.gov/Police/Key-Department-Directives,Policies & Contracts,200,"Key Department Directives | City of Burlington, Vermont","","[""Key Department Directives""]","[""Contact BPD""]",[],[],[],[] -3048,https://www.ci.billings.mt.us/DocumentCenter/View/44274/2020-Annual-Report,Use of Force Reports,200,"","",[],[],[],[],[],[] -3049,https://app.powerbigov.us/view?r=eyJrIjoiZGFjYzA2NTYtZGQ3My00ZjlmLThjYjEtMjJiYTU5Y2ZiYTk2IiwidCI6IjAyOTBkYjZlLWM0NzUtNGM0Zi1iNjJkLWNjNjEyZDE4OGZhYiJ9,Crime Statistics,200,Microsoft Power BI,"",[],[],[],[],[],[] -3050,https://data.boston.gov/,List of Data Sources,200,Welcome - Analyze Boston,"","[""Analyze Boston""]","[""\n\n Topics\n \n"", ""\n\n Showcases\n \n"", ""Popular Datasets"", ""New or Modified Datasets""]","[""Search data"", ""Popular tags"", ""Canopy Change Assessment: 2014-2019"", ""Our Progress Toward Carbon Neutrality"", ""Beantown Solar"", ""Climate Ready Boston Map Explorer"", ""Imagine Boston 2030 Metrics Dashboard"", ""RentSmart Boston"", ""Boston Garbage Atlas: 2014"", ""Trash City"", ""Fire-Proof Boston Housing"", ""BuildBPS Dashboard"", ""Vision Zero Boston"", ""Boston Tax Parcel Viewer"", ""\nEmployee Earnings Report\n"", ""\nCrime Incident Reports (August 2015 - To Date) (Source: New System)\n"", ""\nApproved Building Permits\n"", ""\nProperty Assessment\n"", ""\nShootings\n"", ""\nTrash Schedules by Address\n"", ""\nSection 12 Licenses (Alcohol)\n"", ""\nLicensing Board Licenses\n"", ""\nSpecial One-Day Alcohol Licenses\n"", ""\nCertified Business Directory\n""]",[],[],[] -3051,https://www.ci.billings.mt.us/1911/Hours,Contact Info & Agency Meta,200,"Police Department Contact Information & Hours | City of Billings, MT - Official Website",Hours,"[""\r\n\r\nPolice Department Contact Information & Hours\t\t""]",[],"[""Loading"", ""Contact Us"", ""Quick Links"", ""Site Links""]",[],[],[] -3052,https://www.bridgeportct.gov/content/341307/341425/341439/367559.aspx,Policies & Contracts,200,Police Department Policies | City of Bridgeport,"","[""\n BRIDGEPORT\n "", ""\nPolice Department Policies\n"", ""\n BRIDGEPORT\n ""]","[""Main navigation"", ""Utility"", ""Breadcrumb"", ""\n \n\n Bridgeport PD Policy and Procedure\n \n "", ""\n"", ""\n \n\n Let's Hear Your Feedback!\n \n "", ""Footer Menu""]",[],[],[],[] -3053,https://www.baltimorecountymd.gov/departments/police/contact.html,Contact Info & Agency Meta,200,Police Department - Baltimore County,View information on the major activities of the Department of Planning.,"[""Baltimore CountyPolice Department""]","[""Most Popular Services"", ""Police News"", ""Reporting Emergencies, Crimes and Tips"", ""Provide Feedback via the Accreditation Public Portal"", ""Claiming Lawfully-Seized Property"", ""Publications"", ""Request Training"", ""Contact Us"", ""Contact Us"", ""Follow Us""]","[""Helpful Information"", ""Department Units and Staff"", ""Policies and Programs"", ""Contact Us"", ""Police Headquarters"", ""Hours"", ""Email"", ""Phone"", ""Fax"", ""BALTCOGO311"", ""Chief of Police"", ""Facebook"", ""Twitter"", ""YouTube"", ""News"", ""Instagram"", ""Find Information"", ""Policies"", ""Connect With Us"", ""Translate""]",[],[],[] -3054,https://www.cityofboise.org/government/data-transparency/data-and-dashboards/police-data-and-dashboards/police-incidents-in-your-neighborhood/,Calls for Service,200,Police Incidents in Your Neighborhood | City of Boise,"",[],"[""Message Sent Successfully!"", ""Message Failed To Send.""]","[""Be 'In the Know,'"", ""Send a Message to City of Boise""]","[""City of Boise"", ""Phone"", ""TTY"", ""Hours"", ""Address""]",[],[] -3055,https://www.bridgeportct.gov/filestorage/341307/341425/341439/371966/Bridgeport_Crime_Map_Jan_Jul_2021.pdf,Crime Maps & Reports,404,"","",,,,,, -3056,https://resources.baltimorecountymd.gov/Documents/Police/policiespdnet/adminmanual2020-01.pdf,Policies & Contracts,404,"","",,,,,, -3057,https://www.bridgeportct.gov/content/341307/341425/341439/372723.aspx,Arrest Records,200,Bridgeport Police Blotter | City of Bridgeport,"","[""\n BRIDGEPORT\n "", ""\nBridgeport Police Blotter\n"", ""\n BRIDGEPORT\n ""]","[""Main navigation"", ""Utility"", ""Breadcrumb"", ""\n \n\n Bridgeport Police Blotter\n \n "", ""\n"", ""Footer Menu""]",[],[],[],[] -3058,https://birminghamcrb.org,Complaints & Misconduct,-1,"","",,,,,, -3059,https://www.boston.gov/departments/police,Contact Info & Agency Meta,200,Police | Boston.gov,"Through community policing, we want to be a reflection of the residents we serve. We aim to create a professional culture and inclusive environment that mirrors the best of all of us. Learn more about the history of our department, or visit police.boston.gov for the latest information.","[""Police""]","[""Join the Boston Police"", ""Civilian jobs"", ""Boston Police data dashboards"", ""Help staying safe"", ""Boston Police News"", ""Latest news"", ""Districts"", ""Bureaus"", ""Forms, permits, applications""]","[""Five-year Contract Ratified by Boston Police Patrolmen's Association"", ""Now Hiring: Boston Police Emergency Communications Specialists"", ""City of Boston Selected for Violence Reduction Center Cohort"", ""Boston Police Department Update on Police Reform""]","[""Tell us what you think""]","[""Contact"", ""Contact""]",[] -3060,https://www.cityofboise.org/media/6875/bpd-policy-and-procedure-manual-jan-2019.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3061,https://bpdnews.com/rules-and-procedures,Policies & Contracts,-1,"","",,,,,, -3062,https://www.ci.billings.mt.us/DocumentCenter/View/44274/2020-Annual-Report,Arrest Records,200,"","",[],[],[],[],[],[] -3063,https://www.burlingtonvt.gov/sites/default/files/DD05%20Statewide%20Policy%20on%20Police%20Use%20of%20Force.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3064,https://app.powerbigov.us/view?r=eyJrIjoiYmJjZmUwMTEtODY2NS00MGEyLWI0YTctYTVlYzkzYWNlODc3IiwidCI6Ijk0NGZhOWJhLTg0NTQtNDEzZC1iOWU2LWJmNDBhZjFkNmE5YiJ9,Use of Force Reports,200,Microsoft Power BI,"",[],[],[],[],[],[] -3065,https://gis.adacounty.id.gov/apps/crimemapper/,Crime Maps & Reports,200,CrimeMapper No Side Bar,"",[],[],[],[],[],[] -3066,https://www.ci.billings.mt.us/DocumentCenter/View/43658/BPD-Policy-Manual-,Policies & Contracts,200,"","",[],[],[],[],[],[] -3067,https://www.ci.billings.mt.us/DocumentCenter/View/44274/2020-Annual-Report,Stops,200,"","",[],[],[],[],[],[] -3068,https://www.arcgis.com/apps/dashboards/3703a48c34af408f8ed612e0583ec176,Crime Maps & Reports,200,ArcGIS Dashboards,ArcGIS Dashboards,[],[],[],[],[],[] -3069,https://data.burlingtonvt.gov/explore/dataset/arrests/table/,Arrest Records,200,BTVstat Data Hub,City of Burlington Vermont Open Data Portal,[],[],[],[],[],[] -3070,https://data.burlingtonvt.gov/explore/dataset/police-incidents-2021/table/?sort=call_time,Calls for Service,200,BTVstat Data Hub,City of Burlington Vermont Open Data Portal,[],[],[],[],[],[] -3071,https://data.birminghamal.gov/,List of Data Sources,200,Welcome - City of Birmingham,"","[""City of Birmingham""]","[""\n\n Groups (click to see all)\n \n"", ""\n\n Showcases (click to see all)\n \n"", ""Popular Datasets"", ""New and Recent Datasets""]","[""Search data"", ""Popular tags"", ""Birmingham Transparency"", ""\nGIS Mapping files\n"", ""\nBirmingham Zoning Boundaries\n"", ""\nTrash and Brush Pick Up Schedule\n"", ""\nAnnual Comprehensive Financial Reports\n"", ""\nBirmingham City Limits\n"", ""\nCapital Projects Monthly Fund Report\n"", ""\nExpense Budget by Organization Report\n"", ""\nBudget by Revenue Type Report\n"", ""\nBudget Performance Report\n"", ""\nDetail of Departmental Expense Budget by Organization Report\n""]",[],[],[] -3072,https://www.bridgeportct.gov/filestorage/341307/341425/341439/371966/Bridgeport_Crime_Report_Jan_Jul_2021.pdf,Crime Statistics,404,"","",,,,,, -3073,https://opendata.cityofboise.org/,List of Data Sources,200,City of Boise Maps and GIS Open Data Portal,City of Boise Open Data Portal for geospatial data and maps.,[],[],[],[],[],[] -3074,https://data.burlingtonvt.gov/explore/dataset/bpd-use-of-force/table/?sort=call_time&dataChart=eyJxdWVyaWVzIjpbeyJjaGFydHMiOlt7InR5cGUiOiJsaW5lIiwiZnVuYyI6IkFWRyIsInlBeGlzIjoib2ZmaWNlcnNfaW52b2x2ZWQiLCJzY2llbnRpZmljRGlzcGxheSI6dHJ1ZSwiY29sb3IiOiIjMDAwMDAwIn1dLCJ4QXhpcyI6ImNhbGxfdGltZSIsIm1heHBvaW50cyI6IiIsInRpbWVzY2FsZSI6InllYXIiLCJzb3J0IjoiIiwiY29uZmlnIjp7ImRhdGFzZXQiOiJicGQtdXNlLW9mLWZvcmNlIiwib3B0aW9ucyI6eyJzb3J0IjoiY2FsbF90aW1lIn19fV0sImRpc3BsYXlMZWdlbmQiOnRydWUsImFsaWduTW9udGgiOnRydWV9,Use of Force Reports,200,BTVstat Data Hub,City of Burlington Vermont Open Data Portal,[],[],[],[],[],[] -3075,https://resources.baltimorecountymd.gov/Documents/Police/policiespdnet/fieldmanual/fieldmanual2020-01_a12.pdf,Policies & Contracts,404,"","",,,,,, -3076,https://www.boston.gov/news/boston-police-department-police-reform-policy-update,Policies & Contracts,200,Boston Police Department Police Reform Policy update | Boston.gov,"On June 8, 2021 the Boston Police Department (BPD) issued a revised Gang Assessment Database rule.","[""Boston Police Department Police Reform Policy update""]",[],[],"[""Tell us what you think""]",[],[] -3077,https://dashboard.cityofboston.gov/t/Guest_Access_Enabled/views/OPATComplaintsDashboard/Complaints?:showAppBanner=false&:display_count=n&:showVizHome=n&:origin=viz_share_link&:isGuestRedirectFromVizportal=y&:embed=y,Complaints & Misconduct,503,"","",,,,,, -3078,https://app.powerbigov.us/view?r=eyJrIjoiMzM3YzVhMzktN2M4OS00NjBiLWFjMTctOTBjNzBhN2QwNGRmIiwidCI6Ijk0NGZhOWJhLTg0NTQtNDEzZC1iOWU2LWJmNDBhZjFkNmE5YiJ9,Stops,200,Microsoft Power BI,"",[],[],[],[],[],[] -3079,https://data.boston.gov/dataset/911-daily-dispatch-count-by-agency,Calls for Service,200,911 Daily Dispatch Count by Agency - Dataset - Analyze Boston,"","[""911 Daily Dispatch Count by Agency"", ""Department of Innovation and Technology\n \n "", ""\n \n 911 Daily Dispatch Count by Agency\n \n \n \n ""]","["" Organization"", "" Social"", "" License"", ""Data and Resources""]","[""Tags"", ""Additional Info""]",[],[],[] -3080,https://www.burlingtonvt.gov/Police/About,Contact Info & Agency Meta,200,"About the BPD | City of Burlington, Vermont","","[""About the BPD""]","[""Contact BPD""]",[],[],[],[] -3081,https://police.birminghamal.gov/contacts/,Contact Info & Agency Meta,200,Contacts | Birmingham Police Department,"","[""\n\n\n Birmingham Police Department\n\n\t\t\t\t\tCommitment | Excellence | Integrity\t\t\t\t\n\n""]","[""Putting People First"", ""Contacts""]","[""Division/Precinct"", ""Address"", ""Phone Number""]","[""Hours & Info"", ""Upcoming Events"", ""CRIMESTOPPERS"", ""Police Information"", ""Quick Links"", ""I Need...""]",[],[] -3082,https://app.powerbigov.us/view?r=eyJrIjoiZGFjYzA2NTYtZGQ3My00ZjlmLThjYjEtMjJiYTU5Y2ZiYTk2IiwidCI6IjAyOTBkYjZlLWM0NzUtNGM0Zi1iNjJkLWNjNjEyZDE4OGZhYiJ9,Crime Maps & Reports,200,Microsoft Power BI,"",[],[],[],[],[],[] -3083,https://app.powerbigov.us/view?r=eyJrIjoiZmEyNTg0ODEtYmM0Ni00YzMyLWI3N2QtMWI5NzNmMDE3MWE0IiwidCI6Ijk0NGZhOWJhLTg0NTQtNDEzZC1iOWU2LWJmNDBhZjFkNmE5YiJ9,Crime Statistics,200,Microsoft Power BI,"",[],[],[],[],[],[] -3084,https://www.ci.billings.mt.us/DocumentCenter/View/44274/2020-Annual-Report,Calls for Service,200,"","",[],[],[],[],[],[] -3085,https://www.cityofboise.org/CityWideContactForm?contactId=3087,Contact Info & Agency Meta,200,City of Boise,"",[],"[""Contact"", ""Message Sent Successfully!"", ""Message Failed To Send."", ""Message Sent Successfully!"", ""Message Failed To Send.""]","[""Send a Message to Police"", ""Phone"", ""Be 'In the Know,'"", ""Send a Message to Police"", ""Phone""]","[""Hours"", ""Boise Police Records/General questions"", ""Non-emergency dispatch/Request an officer"", ""TTY"", ""Address"", ""City of Boise"", ""Hours"", ""Boise Police Records/General questions"", ""Non-emergency dispatch/Request an officer"", ""TTY"", ""Address""]",[],[] -3086,https://www.baltimorepolice.org/transparency/bpd-policies/na-pib-internal-operations-training-manual,Policies & Contracts,200,PIB Internal Operations & Training Manual | Baltimore Police Department,Policy information about PIB Internal Operations & Training Manual,"[""Baltimore Police Department"", ""PIB Internal Operations & Training Manual \n""]","[""Utilities"", ""Breadcrumb"", ""Baltimore Police Department"", ""How Do I"", ""Follow Us"", ""Footer menu""]","[""Newsletter""]",[],[],[] -3087,https://www.cityofboise.org/media/11707/2020-annual-report.pdf,Complaints & Misconduct,200,"","",[],[],[],[],[],[] -3088,https://app.powerbigov.us/view?r=eyJrIjoiYmJjZmUwMTEtODY2NS00MGEyLWI0YTctYTVlYzkzYWNlODc3IiwidCI6Ijk0NGZhOWJhLTg0NTQtNDEzZC1iOWU2LWJmNDBhZjFkNmE5YiJ9,Complaints & Misconduct,200,Microsoft Power BI,"",[],[],[],[],[],[] -3089,https://public.powerdms.com/BRIDGEPORT/documents/647990,Policies & Contracts,200,"","",[],[],[],[],[],[] -3090,https://www.ci.billings.mt.us/DocumentCenter/View/44274/2020-Annual-Report,Crime Statistics,200,"","",[],[],[],[],[],[] -3091,https://www.baltimorepolice.org/transparency/bpd-policies/1115-use-force,Policies & Contracts,200,Use of Force | Baltimore Police Department,Policy information about Use of Force,"[""Baltimore Police Department"", ""Use of Force\n""]","[""Utilities"", ""Breadcrumb"", ""Baltimore Police Department"", ""How Do I"", ""Follow Us"", ""Footer menu""]","[""Newsletter""]",[],[],[] -3092,https://www.ci.billings.mt.us/DocumentCenter/View/44274/2020-Annual-Report,Complaints & Misconduct,200,"","",[],[],[],[],[],[] -3093,https://www.bridgeportct.gov/content/341307/341425/341439/341792.aspx,Contact Info & Agency Meta,200,Police Department Phone Numbers | City of Bridgeport,"","[""\n BRIDGEPORT\n "", ""\nPolice Department Phone Numbers\n"", ""\n BRIDGEPORT\n ""]","[""Main navigation"", ""Utility"", ""Breadcrumb"", ""Footer Menu""]","[""Department"", ""Address"", ""Phone Number""]",[],[],[] -3094,https://opendata-bc-gis.hub.arcgis.com/pages/data-catalog,List of Data Sources,200,ArcGIS Hub,"Discover, analyze and download data from ArcGIS Hub. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",[],[],[],[],[],[] -3095,https://data.burlingtonvt.gov/pages/home/,List of Data Sources,200,BTVstat Data Hub,City of Burlington Vermont Open Data Portal,[],[],[],[],[],[] -3096,https://public.powerdms.com/BRIDGEPORT/documents/914439,Policies & Contracts,200,"","",[],[],[],[],[],[] -3097,https://www.arcgis.com/apps/MapSeries/index.html?appid=fad2a3f085c644d0b014b507d23bcd9a,Arrest Records,200,"",This story map was created with the Story Map Series application in ArcGIS Online.,"[""""]",[],[],[],[],[] -3098,https://www.crimemapping.com/map/ga/dekalbcounty ,Crime Maps & Reports,200,"","",[],[],[],[],[],[] -3099,https://www.columbus.gov/police-divisiondirectives/,Policies & Contracts,200," -","","[""City of Columbus"", ""The page you're looking for has moved to our new website."", ""Please visit https://new.columbus.gov.""]","[""We're building you a new columbus.gov. Can't find what you're looking for?\u00a0"", ""We're building you a new columbus.gov. Can't find what you're looking for?\u00a0"", ""(614) 645-3111"", ""Council Members"", ""(614) 645-3111"", ""Go to the 311 Call Center"", ""(614) 645-3111"", ""311 is also available onthe CBUS 311 app""]","[""Navigate to new.columbus.gov."", ""City of Columbus""]",[],[],[] -3100,https://www.clevelandohio.gov/sites/default/files/forms_publications/Yearend2018CrimeStats.pdf?id=15004,Crime Statistics,404,"","",,,,,, -3101,https://www.clevelandohio.gov/CityofCleveland/Home/Government/CityAgencies/PublicSafety/Police/Contacts,Contact Info & Agency Meta,200,Cleveland Police Contact List | City of Cleveland Ohio,"","[""Cleveland Police Contact List\n""]","[""Utility Nav"", ""Main navigation"", ""Main navigation"", ""Breadcrumb"", ""Cleveland Police Contact List"", ""City of Cleveland"", ""Office Hours:"", ""I Want To""]","[""Menu"", ""Social"", ""Newsletter Sign Up"", ""Apply"", ""Pay"", ""Register"", ""Report"", ""Jump To""]",[],"[""Cookies Consent""]",[] -3102,https://insights.cincinnati-oh.gov/stories/s/quk6-rcaw,Use of Force Reports,200,Use of Force,"",[],"[""Menu""]",[],[],[],[] -3103,https://www.columbuspolice.org/Reports/Results?from=1/1/2012&to=1/20/2022&loc=all&types=9,Crime Statistics,200," - Search by Location - Columbus, OH Division of Police Web Report Portal -","",[],"[""Search by Location :\r\n Entire City""]",[],[],[],[] -3104,https://www.charleston-sc.gov/973/Contact-Us,Contact Info & Agency Meta,404,"","",,,,,, -3105,https://www.cheyennepd.org/About-Us/Contact/General-Information,Contact Info & Agency Meta,200,General Information – Cheyenne Police Department,"Physical Address:415 West 18th StreetCheyenne, WY 82001Phone:637-6500E-Mail: info@cheyennepd.org Call Monday-Friday from 8-5 for general department requests. If you're wanting to report a crime or suspicious activity, use the dispatch number at 307-637-6525.","[""General Information""]",[],"[""Contact"", ""Social Media""]",[],[],[] -3106,https://www.dekalbcountyga.gov/sites/default/files/2020-06/Employee.Manual.6.12.20_0.pdf ,Policies & Contracts,404,"","",,,,,, -3107,https://data.charlottenc.gov/datasets/officer-traffic-stops/explore,Stops,200,Officer Traffic Stops,"CMPD conducts an average of 120,000 traffic stops per year. Under North Carolina state law (G.S. 143B-902-903), the CMPD as well as other law enforcement agencies in the state are required to collect information on all traffic stops, the reason for the stop, and the type of enforcement action taken. Information on the driver’s sex, race, ethnicity, and age is collected, compiled, and reported to the NC Department of Justice. Information on whether the driver or passenger(s) were searched is also collected. For more information, please visit http://charlottenc.gov/CMPD/Pages/Resources/OpenData_Source.aspx CMPD is committed to deploying traffic officers to areas where we experience high crime and victimization. Our focus is also in the geographical areas where concerns are reported by community members. We as a police department have a responsibility to those communities, to address their concerns and take appropriate enforcement action in an effort to keep their neighborhoods safe. Additionally, we are not only reacting to crime but proactively engaging in strategies that are intended to prevent criminal activity from occurring by placing officers in areas with a greater statistical history of crime.",[],[],[],[],[],[] -3108,https://www.arcgis.com/apps/webappviewer/index.html?id=08e190dc29de42eea5322b7ff798319e,Crime Maps & Reports,200,ArcGIS Web Application,"","[""""]",[],[],[],[],[] -3109,https://home.chicagopolice.org/statistics-data/public-arrest-data/,Arrest Records,403,"","",,,,,, -3110,https://home.chicagopolice.org/inside-cpd/use-of-force-policy/,Policies & Contracts,403,"","",,,,,, -3111,https://policedata.coloradosprings.gov/Crime/Crime-Level-Data/bc88-hemr,Crime Statistics,200,Crime Level Data | Tyler Data & Insights,"","[""""]","[""Menu""]",[],[],[],[] -3112,https://www.columbus.gov/police-internalaffairsbureau/,Complaints & Misconduct,200,Columbus Division of Police Internal Affairs Bureau,"","[""City of Columbus""]","[""We're building you a new columbus.gov. Can't find what you're looking for?\u00a0"", ""We're building you a new columbus.gov. Can't find what you're looking for?\u00a0"", ""(614) 645-3111"", ""Council Members"", ""(614) 645-3111"", ""Go to the 311 Call Center"", ""(614) 645-3111"", ""311 is also available onthe CBUS 311 app""]","[""Navigate to new.columbus.gov."", ""Division of Police""]",[],[],[] -3113,https://www.clevelandohio.gov/CityofCleveland/Home/Government/CityAgencies/PublicSafety/Police/PolicyProcedures,Policies & Contracts,200,Policy & Procedures | City of Cleveland Ohio,"","[""Policy & Procedures\n""]","[""Utility Nav"", ""Main navigation"", ""Main navigation"", ""Breadcrumb"", ""Policy & Procedures"", ""City of Cleveland"", ""Office Hours:"", ""I Want To""]","[""Menu"", ""\n\n\n\n\n\n\n \n Table of Contents and GPO Index\n "", ""\n\n\n\n\n\n\n \n Investigations\n "", ""4.1 CRIMINAL INVESTIGATIONS"", ""4.2 DRUG/VICE INVESTIGATION"", ""\n\n\n\n\n\n\n \n Juvenile Procedures\n "", ""\n\n\n\n\n\n\n \n Legal\n "", ""2.1 USE OF FORCE"", ""2.2 SEARCH AND SEIZURE"", ""2.3 SUBPOENAS AND COURT"", ""\n\n\n\n\n\n\n \n New Revisions - General Police Order\n "", ""CHAPTER 1 ADMINISTRATIVE"", ""CHAPTER 2 LEGAL"", ""CHAPTER 3 ARRESTEES"", ""CHAPTER 4 FIELD OPERATIONS"", ""CHAPTER 5 FIELD INVESTIGATIONS"", ""CHAPTER 6 PROPERTY"", ""CHAPTER 7 COMMUNICATIONS"", ""\n\n\n\n\n\n\n \n ORGANIZATION AND MANAGEMENT\n "", ""1.1 ADMINISTRATION"", ""1.2 ORGANIZATION"", ""1.3 MANAGEMENT"", ""\n\n\n\n\n\n\n \n LEGAL\n "", ""2.1 USE OF FORCE"", ""2.2 SEARCH AND SEIZURE"", ""2.3 SUBPOENAS AND COURT"", ""\n\n\n\n\n\n\n \n PATROL\n "", ""3.1 ZONE CARS"", ""3.2 PATROL PROCEDURES"", ""3.3 DISTURBANCE AND DISASTERS"", ""3.4 ENFORCEMENT"", ""\n\n\n\n\n\n\n \n INVESTIGATIONS\n "", ""4.1 CRIMINAL INVESTIGATIONS"", ""4.2 DRUG/VICE INVESTIGATION"", ""\n\n\n\n\n\n\n \n REPORTING PROCEDURES\n "", ""6.1 NON-CRIMINAL REPORTS"", ""6.2 CRIME REPORTS"", ""\n\n\n\n\n\n\n \n TRAFFIC\n "", ""8.1 ACCIDENTS"", ""8.2 ENFORCEMENT"", ""\n\n\n\n\n\n\n \n COMMUNICATIONS\n "", ""9.1 POLICE RADIO"", ""9.2 LEADS"", ""\n\n\n\n\n\n\n \n PROPERTY\n "", ""x10.1 EVIDENCE"", ""x10.2 SEIZED/FORFEITED PROPERTY"", ""x10.3 DIVISION OF POLICE PROPERTY"", ""Social"", ""Newsletter Sign Up"", ""Apply"", ""Pay"", ""Register"", ""Report"", ""Jump To""]","[""1.01 Organization and Management"", ""1.02 Human Resources"", ""1.03 Training and Education"", ""1.04 Uniforms and Grooming"", ""1.07 Member Conduct"", ""2.01 USE OF FORCE"", ""2.02 SEARCH AND SEIZURE"", ""2.03 SUBPOENAS AND COURT"", ""3.01 RESTRAINT AND TRANSPORT"", ""3.02 MEDICAL-HOSPITAL PROCEDURES"", ""3.03 BOOKING-PROCESSING"", ""3.04 CHARGING-RELEASING"", ""4.01 EMERGENCY DRIVING"", ""4.02 SPECIALIZED UNITS AND PROGRAMS"", ""4.03 MUTUAL AID"", ""4.04 PATROL DUTIES"", ""4.05 SUPERVISOR DUTIES"", ""4.06 EQUIPMENT AND INSPECTIONS"", ""4.07 FIELD OPERATIONS"", ""4.08 MISCELLANEOUS"", ""5.03 TRAFFIC ENFORCEMENT"", ""5.05 DOMESTIC VIOLENCE AND PROTECTION ORDERS"", ""5.07 SEX CRIMES AND CHILD ABUSE"", ""5.08 WEAPONS/FIREARMS"", ""5.09 DRUG/VICE"", ""5.10 CRIME SCENE PRESERVATION/PROCESSING"", ""5.11 CRISIS INTERVENTION"", ""5.12 SPECIAL POPULATIONS"", ""5.15 OTHER INVESTIGATIONS"", ""6.01 GENERAL"", ""6.02 EVIDENCE"", ""6.03 VEHICLES"", ""6.04 DIVISION PROPERTY"", ""7.01 RADIO"", ""7.02 DATABASES"", ""7.03 COMPUTER USE - DISCLOSURE OF INFORMATION""]","[""Cookies Consent""]",[] -3114,https://www.dekalbcountyga.gov/police-services/contact-us ,Contact Info & Agency Meta,404,"","",,,,,, -3115,https://clevelandgis.maps.arcgis.com/apps/webappviewer/index.html?id=5cd6bf3491c1493084e1090cbd03e2c4,Calls for Service,200,ArcGIS Web Application,"","[""""]",[],[],[],[],[] -3116,https://opendata.columbus.gov/,List of Data Sources,200,"GIS Open Data Columbus, OH",City of Columbus Maps & Apps Open Data Site,[],[],[],[],[],[] -3117,https://policedata.coloradosprings.gov/stories/s/Arrests/kh4i-nmaz,Arrest Records,200,Arrests,"","[""Arrests""]","[""Menu"", ""More to come..."", ""Arrest Datasets"", ""Arrest Charts\u00a0""]",[],[],[],[] -3118,https://clevelandgis.maps.arcgis.com/apps/webappviewer/index.html?id=5cd6bf3491c1493084e1090cbd03e2c4,Crime Maps & Reports,200,ArcGIS Web Application,"","[""""]",[],[],[],[],[] -3119,https://app.powerbigov.us/view?r=eyJrIjoiZGFjYzhmYjktNTIxMC00YTI1LTkxZWQtODg5YjM2NzEyNmI3IiwidCI6ImRhMDFjYTNmLTZhMjctNGNmYS1hYmY4LTFjYTcwMzY1YmEyYSJ9&pageName=ReportSection380233b1758ed6af63f6,Complaints & Misconduct,200,Microsoft Power BI,"",[],[],[],[],[],[] -3120,https://www.clevelandohio.gov/CityofCleveland/Home/Government/CityAgencies/OPS/Publications,Complaints & Misconduct,404,"","",,,,,, -3121,https://www.charleston-sc.gov/DocumentCenter/View/29994/CPD-Annual-Report-2020,Stops,200,"","",[],[],[],[],[],[] -3122,https://insights.cincinnati-oh.gov/stories/s/c64e-ybfz,Officer Involved Shootings,200,Police Firearm Discharge,"",[],"[""Menu""]",[],[],[],[] -3123,https://www.cincinnati-oh.gov/sites/police/assets/File/Procedures/13100.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3124,https://public.powerdms.com/CPD5/tree,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -3125,http://www.charlestonwvpolice.org/contact.html,Contact Info & Agency Meta,200,Charleston Police Department - Contact,"The Charleston West Virginia Police Department. We are Located at 501 Virginia Street East, Charleston WV 25301. Our Goal is to make the City of Charleston a safer place to work and live in.","[""CPD Directory""]","[""Contacts""]",[],"[""Metro 911 Emergency"", ""Non Emergency"", ""Booking (Prisoner Processing)"", ""Chief's Office"", ""Community Policing and Bureau Chief"", ""Crash Investigations"", ""Criminal Investigations"", ""Domestic Violence"", ""Fleet Management"", ""Highway Safety"", ""Humane Officers"", ""Hybrid Unit"", ""I.T. Department"", ""K9 Unit"", ""MDENT (Drug Enforcement Unit)"", ""NAO Volunteers"", ""Patrol Division Bureau Chief"", ""Patrol Division - Shift Commander"", ""Professional Standards"", ""Property & Evidence"", ""Records "", ""Safety City"", ""Special Enforcement Unit (Vice)"", ""Special Events Coordinator"", ""Traffic Division"", ""Training Division"", ""Uniformed Services Bureau Chief"", ""Warrants Division"", ""Fax - Chief's Office"", ""Fax - CID"", ""Fax - Community Services"", ""Fax - Grants Office"", ""Fax - Highway Safety"", ""Fax - Warrants Division""]","[""Charleston Police Department"", ""Contact Info""]",[] -3126,http://directives.chicagopolice.org/#search,Policies & Contracts,200,Unified Front End,"","[""Chicago Police Department""]","[""Department Directives System""]","[""Loading application ...""]",[],[],[] -3127,https://informationportal.igchicago.org/complaint-and-administrative-notification-trends-and-statistics/,Complaints & Misconduct,404,"","",,,,,, -3128,https://www.crimemapping.com/map/agency/65,Crime Maps & Reports,200,CrimeMapping.com - Helping You Build a Safer Community,"",[],[],[],[],[],[] -3129,https://insights.cincinnati-oh.gov/stories/s/Closed-Citizen-Complaints/qurw-azge/,Complaints & Misconduct,200,Closed Citizen Complaints,"",[],"[""Menu""]",[],[],"[""How to use this dashboard"", ""About this data""]",[] -3130,https://data.cincinnati-oh.gov/Safety/Citizen-Complaint-Authority-CCA-Closed-Complaints/ii65-eyg6,Complaints & Misconduct,200,Citizen Complaint Authority (CCA) Closed Complaints | Tyler Data & Insights,"","[""""]","[""Menu""]",[],[],[],[] -3131,https://public.powerdms.com/CPD5/tree/documents/599908,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -3132,https://www.dallasopendata.com/browse?limitTo=datasets&q=police&tags=use+of+force,Use of Force Reports,200,"Results for ""police"", matching type of Datasets and topic of use of force | Page 1 of 1 | Dallas OpenData","Dallas OpenData is an invaluable resource for anyone to easily access data published by the City. We invite you to explore the continually growing datasets to help make Dallas a more accessible, transparent and collaborative community.","[""Categories"", ""Tags""]","[""Menu"", ""\n View Types > Datasets\n \n"", ""\n Tags > use of force\n \n"", ""\n Sort\n "", ""\n Sort by Most Relevant\n \n"", ""\n Filter\n "", ""\nAuthority\n\n"", ""\nCategories\n\n"", ""\nView Types\n\n"", ""\nTags\n\n"", ""\nPolice Response to Resistance 2015\n"", ""\nPolice Response to Resistance 2016\n"", ""\nPolice Response to Resistance 2014\n"", ""\nPolice Response to Resistance 2019\n"", ""\nPolice Response to Resistance 2013\n"", ""\nPolice Response to Resistance 2018\n"", ""\nPolice Response to Resistance 2017\n"", ""\nPolice Response to Resistance 2020\n"", ""A-Z"", ""A-Z""]",[],[],[],[] -3133,https://home.chicagopolice.org/statistics-data/data-dashboards/use-of-force-dashboard/,Use of Force Reports,403,"","",,,,,, -3134,https://www.dallaspolice.net/reports/Shared%20Documents/General-Order-906.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3135,https://data.charlottenc.gov/datasets/cmpd-officer-involved-shootings-incidents-1/explore?showTable=true,Officer Involved Shootings,200,City of Charlotte Open Data Portal,"Charlotte's Open Data Portal, The City of Charlotte's Open Data Portal allows users to search, explore and discover relevant datasets that are served out by the City of Charlotte, NC.",[],[],[],[],[],[] -3136,https://insights.cincinnati-oh.gov/stories/s/8eaa-xrvz,Crime Statistics,200,Reported Crime,"",[],"[""Menu""]",[],[],"[""How to use this dashboard"", ""About this data""]",[] -3137,https://www.wleacademy.com/,Policies & Contracts,200,Home | Wyoming Law Enforcement Academy,Welcome to the Wyoming Law Enforcement Academy website. Here you will find the needed information on Courses offered at the Academy. How to register and information realted to law enforcement in the State of Wyoming. ,"[""Wyoming Law"", ""Enforcement"", ""Academy"", ""UPCOMING\u00a0\nCOURSES"", ""FITNESS\u00a0\nSTANDARDS"", ""\u00a0COURSES"", ""MEDICAL\nCLEARANCE FORMS\u00a0"", ""ACADEMY\nREPOSITORY"", ""PRESERVICE"", ""BOARD\nMEMBERS"", ""FACILITY\nUSAGE"", ""OUTSIDE\nRESOURCES\nFOR POST CREDIT"", ""WYOMING PEACE OFFICER MEMORIAL"", ""Additional Resources"", ""Fitness Standards"", ""Board Members"", ""Resources"", ""PreService"", ""Careers"", ""Academy Repository"", ""POST Resources"", ""Newsletter"", ""\u00a9 2020 - 2024 State of Wyoming ""]","[""Welcome To The Wyoming Law Enforcement Academy"", ""Wyoming Law Enforcement Academy Adavacned Training Bulletin"", ""To receive updates on Advanced Training being offered at the Academy.\nClick below to Sign up for our Email Newsletter or Join our Facebook Group. \u00a0""]",[],[],[],[] -3138,https://www.columbus.gov/police-annualreports/,Arrest Records,200,Annual Reports,"","[""City of Columbus""]","[""We're building you a new columbus.gov. Can't find what you're looking for?\u00a0"", ""We're building you a new columbus.gov. Can't find what you're looking for?\u00a0"", ""(614) 645-3111"", ""Council Members"", ""(614) 645-3111"", ""Go to the 311 Call Center"", ""(614) 645-3111"", ""311 is also available onthe CBUS 311 app""]","[""Navigate to new.columbus.gov."", ""Division of Police""]",[],[],[] -3139,https://data.cityofchicago.org/,List of Data Sources,200,City of Chicago | Data Portal | City of Chicago | Data Portal,"",[],"[""Menu""]",[],[],[],[] -3140,https://charlottenc.gov/CMPD/Safety/Pages/CrimeStats.aspx,Crime Statistics,200,Crime Statistics Report - Charlotte-Mecklenburg Police Department,Find the quarterly crime statistics for crime trends around Charlotte.,"[""Crime Statistics Report"", ""CMPD Quarterly Statistical Report""]","[""3rd Quarter Statistics"", ""2nd Quarter Statistics"", ""1st Quarter Statistics"", ""\r\n\t\t\tEnd of the Year Reports\r\n\t\t""]","[""Contact Us"", ""Get Involved"", ""Share & Connect""]",[],[],[] -3141,https://data.cincinnati-oh.gov/,List of Data Sources,200,Cincinnati Open Data Portal | Tyler Data & Insights,"","[""""]","[""Menu""]",[],"[""""]",[],[] -3142,https://home.chicagopolice.org/about/contact-us/,Contact Info & Agency Meta,403,"","",,,,,, -3143,https://www.dallasopendata.com/Public-Safety/Dallas-Police-Officer-Involved-Shootings/4gmt-jyx2/explore/query/SELECT%0A%20%20%60case%60%2C%0A%20%20%60date%60%2C%0A%20%20%60suspect_deceased_injured_or_shoot_and_miss%60%2C%0A%20%20%60suspect_weapon%60%2C%0A%20%20%60officer_s%60%2C%0A%20%20%60grand_jury_disposition%60%2C%0A%20%20%60ag_forms%60%2C%0A%20%20%60summary_url%60%2C%0A%20%20%60geolocation%60%2C%0A%20%20%60%3A%40computed_region_sjyw_rtbm%60%2C%0A%20%20%60%3A%40computed_region_2f7u_b5gs%60%2C%0A%20%20%60%3A%40computed_region_at43_7y52%60%2C%0A%20%20%60%3A%40computed_region_3qur_xvie%60%2C%0A%20%20%60%3A%40computed_region_28rh_izyk%60%0AORDER%20BY%20%60date%60%20DESC%20NULL%20LAST/page/filter,Officer Involved Shootings,200,Dallas Police Officer-Involved Shootings | Dallas OpenData,"",[],"[""Menu""]",[],[],[],[] -3144,https://informationportal.igchicago.org/911-calls-for-cpd-service/,Calls for Service,200,911 Calls for CPD Service - Chicago Office of Inspector General,"","[""911 Calls for CPD Service""]","[""What will you find here?\u00a0"", ""Some questions that this dataset can answer are:\u00a0"", ""Data Sources\u00a0"", ""Our social media links""]","[""TALK-2-IG""]",[],[],[] -3145,https://www.columbus.gov/police-annualreports/,Calls for Service,200,Annual Reports,"","[""City of Columbus""]","[""We're building you a new columbus.gov. Can't find what you're looking for?\u00a0"", ""We're building you a new columbus.gov. Can't find what you're looking for?\u00a0"", ""(614) 645-3111"", ""Council Members"", ""(614) 645-3111"", ""Go to the 311 Call Center"", ""(614) 645-3111"", ""311 is also available onthe CBUS 311 app""]","[""Navigate to new.columbus.gov."", ""Division of Police""]",[],[],[] -3146,https://www.cincinnati-oh.gov/police/department-references/police-department-procedure-manual/12545/,Policies & Contracts,200,"","",[],[],[],[],[],[] -3147,https://www.dallasopendata.com/Public-Safety/Dallas-Police-Active-Calls/9fxf-t2tr,Calls for Service,200,Dallas Police Active Calls | Dallas OpenData,"","[""""]","[""Menu""]",[],[],[],[] -3148,https://home.chicagopolice.org/statistics-data/data-dashboards/use-of-force-dashboard/,Officer Involved Shootings,403,"","",,,,,, -3149,https://coloradosprings.gov/police-department/page/police-department-contact-us,Contact Info & Agency Meta,403,"","",,,,,, -3150,https://www.arcgis.com/apps/MapSeries/index.html?appid=fad2a3f085c644d0b014b507d23bcd9a,Calls for Service,200,"",This story map was created with the Story Map Series application in ArcGIS Online.,"[""""]",[],[],[],[],[] -3151,http://pdi-charleston-sc.opendata.arcgis.com/search?groupIds=a6e2de25969e42ea812b7bf530754fb6&q=response%20to%20resistance,Use of Force Reports,200,City of Charleston,City of Charleston PD Open Data Site,[],[],[],[],[],[] -3152,https://data.cincinnati-oh.gov/Safety/PDI-Police-Data-Initiative-Traffic-Stops-Drivers-/hibq-hbnj,Stops,200,PDI (Police Data Initiative) Traffic Stops (Drivers) | Tyler Data & Insights,"","[""""]","[""Menu""]",[],[],[],[] -3153,https://dallaspolice.net/division/internalaffairs/racialprofiling,Complaints & Misconduct,200," - - Internal Affairs Division - -","","[""Contact Form \r\n ""]","[""Internal Affairs Division""]","[""Dallas Police\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n Department "", ""Links"", ""Contact""]","[""Stay Connected\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n "", ""Quick Links \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n "", ""Resources \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ""]",[],[] -3154,https://policedata.coloradosprings.gov/Use-of-Force/Officer-Involved-Shootings/pzyt-rvyq,Officer Involved Shootings,200,Officer Involved Shootings | Tyler Data & Insights,"","[""""]","[""Menu""]",[],[],[],[] -3155,https://www.columbus.gov/police-annualreports/,Use of Force Reports,200,Annual Reports,"","[""City of Columbus""]","[""We're building you a new columbus.gov. Can't find what you're looking for?\u00a0"", ""We're building you a new columbus.gov. Can't find what you're looking for?\u00a0"", ""(614) 645-3111"", ""Council Members"", ""(614) 645-3111"", ""Go to the 311 Call Center"", ""(614) 645-3111"", ""311 is also available onthe CBUS 311 app""]","[""Navigate to new.columbus.gov."", ""Division of Police""]",[],[],[] -3156,https://data.charlottenc.gov/datasets/cmpd-calls-for-service/explore,Calls for Service,200,CMPD Calls for Service,"Charlotte's Open Data Portal, The City of Charlotte's Open Data Portal allows users to search, explore and discover relevant datasets that are served out by the City of Charlotte, NC.",[],[],[],[],[],[] -3157,http://directives.chicagopolice.org/,Policies & Contracts,200,Unified Front End,"","[""Chicago Police Department""]","[""Department Directives System""]","[""Loading application ...""]",[],[],[] -3158,https://insights.cincinnati-oh.gov/stories/s/Police-All-Response-Activity/a4d9-vw5s,Calls for Service,200,Police: Calls for Service,"",[],"[""Menu""]",[],[],"[""The CAD system upgraded resulting in new incident types. While we work with our systems to recognize the new incident type codes, \""Null\"" will be listed more frequently in the dashboard below.\u00a0"", ""About this data""]",[] -3159,https://data.charlottenc.gov/,List of Data Sources,200,City of Charlotte Open Data Portal,"Charlotte's Open Data Portal, The City of Charlotte's Open Data Portal allows users to search, explore and discover relevant datasets that are served out by the City of Charlotte, NC.",[],[],[],[],[],[] -3160,https://charlottenc.gov/CMPD/Safety/Pages/CrimeStats.aspx,Complaints & Misconduct,200,Crime Statistics Report - Charlotte-Mecklenburg Police Department,Find the quarterly crime statistics for crime trends around Charlotte.,"[""Crime Statistics Report"", ""CMPD Quarterly Statistical Report""]","[""3rd Quarter Statistics"", ""2nd Quarter Statistics"", ""1st Quarter Statistics"", ""\r\n\t\t\tEnd of the Year Reports\r\n\t\t""]","[""Contact Us"", ""Get Involved"", ""Share & Connect""]",[],[],[] -3161,https://www.clevelandohio.gov/sites/default/files/gpo/CHAPTER%202%20LEGAL/2.01%20USE%20OF%20FORCE/2.01.03%20Use%20of%20Force-General%20(r).pdf,Policies & Contracts,404,"","",,,,,, -3162,https://dallaspolice.net/phonenumbers,Contact Info & Agency Meta,200," - - About - Contact - -","","[""Contact Form \r\n ""]",[],"[""Dallas Police\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n Department "", ""Patrol Divisions"", ""Jack Evans Police Headquarters"", ""North Central Division"", ""Northeast Operations Division"", ""Northwest Operations Division"", ""Southwest Patrol Division"", ""Southeast Operations Division"", ""Central Operations Division"", ""South Central Division"", ""Department Phone Numbers""]","[""Administrative & Support Services Bureau"", ""Investigations Bureau"", ""Other Numbers"", ""Patrol Bureau"", ""Storefronts"", ""Strategic Deployment Bureau"", ""Stay Connected\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n "", ""Quick Links \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n "", ""Resources \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ""]",[],[] -3163,https://home.chicagopolice.org/statistics-data/crime-statistics/,Crime Statistics,403,"","",,,,,, -3164,https://insights.cincinnati-oh.gov/stories/s/8eaa-xrvz,Crime Maps & Reports,200,Reported Crime,"",[],"[""Menu""]",[],[],"[""How to use this dashboard"", ""About this data""]",[] -3165,https://policedata.coloradosprings.gov/Use-of-Force/Use-of-Force-Reports/ii9t-cvd6,Use of Force Reports,200,Use of Force Reports | Tyler Data & Insights,"","[""""]","[""Menu""]",[],[],[],[] -3166,https://www.columbus.gov/police-contactlist/,Contact Info & Agency Meta,200,404 File Not Found,"","[""File Not Found""]","[""The City of Columbus""]",[],[],[],[] -3167,https://www.clevelandohio.gov/CityofCleveland/Home/Government/CityAgencies/PublicSafety/Police/PublicationsInformation,Policies & Contracts,200,Links & Publications | City of Cleveland Ohio,"","[""Links & Publications\n""]","[""Utility Nav"", ""Main navigation"", ""Main navigation"", ""Breadcrumb"", ""Links & Publications"", ""City of Cleveland"", ""Office Hours:"", ""I Want To""]","[""Menu"", ""\n\n\n\n\n\n\n \n Budgets and Internal Audit(s)\n "", ""\n\n\n\n\n\n\n \n Cleveland Community Police Commission\n "", ""\n\n\n\n\n\n\n \n Cleveland Force Review Board\n "", ""\n\n\n\n\n\n\n \n Crisis Intervention and Mental Health Response Advisory Committee\n "", ""\n\n\n\n\n\n\n \n Division Recruiting\n "", ""\n\n\n\n\n\n\n \n Division Training\n "", ""2022 Training Curriculum:"", ""\n2021 Training Curriculum:"", ""\n\n\n\n\n\n\n \n Office of Professional Standards (OPS)\n "", ""\n\n\n\n\n\n\n \n Settlement Agreement\n "", ""2021 Monitor:"", ""\n2021 Semiannual Reports:"", ""2022 Reports:"", ""\n\n\n\n\n\n\n \n City and State Laws\n "", ""\n\n\n\n\n\n\n \n Cuyahoga County Links\n "", ""\n\n\n\n\n\n\n \n Cleveland Police History\n "", ""\n\n\n\n\n\n\n \n Wanted Criminals and Missing Persons\n "", ""\n\n\n\n\n\n\n \n Other Police Links\n "", ""Social"", ""Newsletter Sign Up"", ""Apply"", ""Pay"", ""Register"", ""Report"", ""Jump To""]",[],"[""Cookies Consent""]",[] -3168,http://gis.chicagopolice.org/,Crime Maps & Reports,200,CLEARMap,CLEARMap mapping applications consisting of web apps and dashboards to provide access to various data sets and maps maintained by the Office of Public Safety Administration.,[],[],[],[],[],[] -3169,https://dekalbcounty.org/wp-content/uploads/2020/06/so-policy-use-of-force300.pdf ,Policies & Contracts,200,"","",[],[],[],[],[],[] -3170,https://www.denvergov.org/content/denvergov/en/police-department/crime-information/crime-map.html,Crime Maps & Reports,200,Additional Crime Dashboards - City and County of Denver,"The following dashboard allows you to explore reported thefts in Denver pertaining to catalytic converter, bicycle theft, and package theft.","[""Additional Crime Dashboards""]","[""Various Theft Crime Dashboards"", ""Bias-Motivated Crime Dashboard""]","[""Contact 3-1-1"", ""Visit Other Denver Sites"", ""Share & Connect""]",[],[],[] -3171,https://www.cincinnati-oh.gov/police/department-references/police-department-procedure-manual/,Policies & Contracts,200,Police Department Procedure Manual - Police,Police Procedure Manual,"["""", """", ""Police""]","[""Police Department Procedure Manual"", ""Police Department Procedure Manual"", ""Businesses"", ""Residents"", ""Services"", ""Government""]","[""Why Cincy?"", ""Process"", ""Small Business"", ""Approval"", ""Public Agencies"", ""Services"", ""Getting Around"", ""Auctions"", ""Forms"", ""Pay Now"", ""Sanitation"", ""Leadership"", ""Taxes"", ""Transparency"", ""Customer Service"", ""Emergency"", ""CincyAlert"", ""Why Cincy?"", ""Process"", ""Small Business"", ""Become SBE\nCertified\nToday"", ""Approval"", ""Public Agencies"", ""Services"", ""Fix\nIt\nCincy!"", ""Getting Around"", ""Cincinnati\nParks"", ""Auctions"", ""Forms"", ""Pay Now"", ""Sanitation"", ""Leadership"", ""Taxes"", ""Transparency"", ""Jobs with\nthe City"", ""Customer Service"", ""Emergency"", ""CincyAlert"", ""Police Menu"", ""The Cincinnati Police Department Procedure Manual"", ""\n\u00a0"", ""Police Menu"", ""Frequently Asked Questions"", ""Why Cincy?"", ""Process"", ""Small Business"", ""Approval"", ""Public Agencies"", ""Services"", ""Auctions"", ""Forms"", ""Pay Now"", ""Sanitation"", ""Leadership"", ""Taxes"", ""Transparency"", ""Why Cincy?"", ""Process"", ""Small Business"", ""Approval"", ""Public Agencies"", ""Services"", ""Auctions"", ""Forms"", ""Pay Now"", ""Sanitation"", ""Leadership"", ""Taxes"", ""Transparency""]",[],[],[] -3172,https://www.charleston-sc.gov/DocumentCenter/View/29994/CPD-Annual-Report-2020,Crime Statistics,200,"","",[],[],[],[],[],[] -3173,https://www.dallasopendata.com/Public-Safety/Police-Arrests/sdr7-6v3j,Arrest Records,200,Police Arrests | Dallas OpenData,"","[""""]","[""Menu""]",[],[],[],[] -3174,https://www.dallasopendata.com/Public-Safety/Police-Incidents/qv6i-rri7,Calls for Service,200,Police Incidents | Dallas OpenData,"","[""""]","[""Menu""]",[],[],[],[] -3175,https://www.cincinnati-oh.gov/police/contact-us/,Contact Info & Agency Meta,200,Contact Us - Police,"","["""", """", ""Police""]","[""Contact Us"", ""Contact Us"", ""Businesses"", ""Residents"", ""Services"", ""Government""]","[""Why Cincy?"", ""Process"", ""Small Business"", ""Approval"", ""Public Agencies"", ""Services"", ""Getting Around"", ""Auctions"", ""Forms"", ""Pay Now"", ""Sanitation"", ""Leadership"", ""Taxes"", ""Transparency"", ""Customer Service"", ""Emergency"", ""CincyAlert"", ""Why Cincy?"", ""Process"", ""Small Business"", ""Become SBE\nCertified\nToday"", ""Approval"", ""Public Agencies"", ""Services"", ""Fix\nIt\nCincy!"", ""Getting Around"", ""Cincinnati\nParks"", ""Auctions"", ""Forms"", ""Pay Now"", ""Sanitation"", ""Leadership"", ""Taxes"", ""Transparency"", ""Jobs with\nthe City"", ""Customer Service"", ""Emergency"", ""CincyAlert"", ""Police Menu"", ""Cincinnati Police Department Contacts"", ""\u00a0"", ""Police Menu"", ""Quick Contacts"", ""Frequently Asked Questions"", ""Why Cincy?"", ""Process"", ""Small Business"", ""Approval"", ""Public Agencies"", ""Services"", ""Auctions"", ""Forms"", ""Pay Now"", ""Sanitation"", ""Leadership"", ""Taxes"", ""Transparency"", ""Why Cincy?"", ""Process"", ""Small Business"", ""Approval"", ""Public Agencies"", ""Services"", ""Auctions"", ""Forms"", ""Pay Now"", ""Sanitation"", ""Leadership"", ""Taxes"", ""Transparency""]",[],[],[] -3176,https://www.charleston-sc.gov/DocumentCenter/View/30118/2020-Internal-Affairs-Annual-Report,Officer Involved Shootings,200,"","",[],[],[],[],[],[] -3177,https://home.chicagopolice.org/statistics-data/data-dashboards/,Complaints & Misconduct,403,"","",,,,,, -3178,https://www.cheyennepd.org/files/sharedassets/police/2019-annual-report.pdf,Crime Statistics,200,"","",[],[],[],[],[],[] -3179,https://data.cityofchicago.org/Public-Safety/COPA-Cases-Summary/mft5-nfa8,Complaints & Misconduct,200,COPA Cases - Summary | City of Chicago | Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -3180,https://www.clevelandohio.gov/sites/default/files/forms_publications/Use%20of%20Force%20Report%20May_17_2021.pdf,Use of Force Reports,404,"","",,,,,, -3181,https://charlottenc.gov/CMPD/Organization/Pages/OfcoftheChief/Internal-Affairs.aspx,Complaints & Misconduct,404,"","",,,,,, -3182,https://charlottenc.gov/CMPD/Pages/default.aspx,Contact Info & Agency Meta,200,Home - Charlotte-Mecklenburg Police Department,"The goal of the Charlotte-Mecklenburg Police Department is to make Charlotte one of the safest large cities in America. To do that, we continually advance strategies that prevent crime. We find ways to engage the community in taking steps that help minimize opportunities for victimization. We explore appropriate policy direction with the Mayor and City Council. We seek solutions to the complex community problems that contribute to crime and disorder. And we enforce the laws and arrest the people who break them. The officers, staff and volunteers with the CMPD take very seriously their duty to provide citizens with professional, innovative and effective service. Community safety is a shared responsibility and we are committed to working in partnership with neighborhood residents and business owners as well as other local, state and federal agencies to reduce crime and increase safety.​","[""Home"", ""Featured"", ""Events"", ""News""]","[""Get Reports"", ""File A Report"", ""Join CMPD"", ""CMPD Newsroom"", ""Your Response Areas"", ""Share Feedback"", ""View Our Organization"", ""How to Become an Officer"", ""Animal Care & Control"", ""SouthPark Adoption Event"", ""Community Meeting -- Kingstree Annual HOA Meeting"", ""Free Rabies Clinic"", ""Community Meeting - Eastbrook Woods"", ""Public Notice: Exchange of CGMS"", ""\""No Cap, Those Pills are Sus\"" CMPD Launches Fentanyl Campaign"", ""2023 JAG Program Budget - Law Enforcement Improvements""]","[""Contact Us"", ""Get Involved"", ""Share & Connect""]",[],[],[] -3183,https://public.powerdms.com/CSPD2/tree?mlid=49916,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -3184,http://www.charlestonwvpolice.org/images/Policy_Procedure_Redacted2021.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3185,https://www.crimemapping.com/map/ga/dekalbcounty ,Crime Statistics,200,"","",[],[],[],[],[],[] -3186,https://charlottenc.gov/CMPD/Pages/Resources/DepartmentDirectives.aspx,Policies & Contracts,200,ePolicing Resources - Charlotte-Mecklenburg Police Department,Department reports and documents that highlight our successes and challenges throughout the years.,"[""ePolicing Resources""]","[""Police Officer-Involved Shootings"", ""Officer Traffic Stops"", ""Employee Demographics"", ""Juvenile Diversion"", ""CMPD Community Event Calendar"", ""Crime Mapping"", ""Department Directives and Reports"", ""Department Directives"", ""Annual Reports"", ""Internal Affairs Reports"", ""Patrol Area Divisions"", ""Non-Emergency Police Services"", ""Report a Crime Online"", ""Share Feedback"", ""Request Body Worn Footage / 911 Calls for Service"", ""Records"", ""Traffic Accidents (Live)"", ""Crime / Crash Reports"", ""Employ an Off-Duty Officer"", ""Authorization to Act As An Agent"", ""ABC Unit"", ""Regulated Metal Ban Listing""]","[""Charlotte-Mecklenburg Police Officer-Involved Shootings"", ""CMPD Directives & Information"", ""Annual Reports"", ""Internal Affairs Reports"", ""Miscellaneous Documents for the Public"", ""Contact Us"", ""Get Involved"", ""Share & Connect""]",[],[],[] -3187,https://ody.dekalbcountyga.gov/app/JailSearch/#/search,Arrest Records,-1,"","",,,,,, -3188,https://charlottenc.gov/CMPD/Documents/Resources/RulesofConduct.pdf,Policies & Contracts,404,"","",,,,,, -3189,https://coloradosprings-citywide.data.socrata.com/login,List of Data Sources,200,Tyler Data & Insights,"",[],"[""Menu""]",[],[],[],[] -3190,https://public.powerdms.com/CPD5/tree/documents/599935,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -3191,https://www.columbus.gov/copta-lawenforcementtraining/,Policies & Contracts,200,Law Enforcement Training,"","[""City of Columbus""]","[""We're building you a new columbus.gov. Can't find what you're looking for?\u00a0"", ""We're building you a new columbus.gov. Can't find what you're looking for?\u00a0"", ""(614) 645-3111"", ""Council Members"", ""(614) 645-3111"", ""Go to the 311 Call Center"", ""(614) 645-3111"", ""311 is also available onthe CBUS 311 app""]","[""Navigate to new.columbus.gov."", ""Police Academy""]",[],[],[] -3192,https://home.chicagopolice.org/statistics-data/isr-data/,Stops,403,"","",,,,,, -3193,https://web2.coloradosprings.gov/policeblotter/,Calls for Service,200,Colorado Springs Police Department Blotter,"","[""CSPD Police Blotter""]",[],[],[],[],[] -3194,https://communitycrimemap.com/?address=El%20Paso%2CTX,Crime Maps & Reports,200,LexisNexis® Community Crime Map,"",[],[],[],[],[],[] -3195,https://public.powerdms.com/DesMoines/tree,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -3196,https://data.detroitmi.gov/datasets/rms-crime-incidents/explore?location=42.353017%2C-83.099036%2C11.04&showTable=true,Crime Statistics,200,RMS Crime Incidents,Reported criminal offenses that have occurred in the City of Detroit. Offense data was extracted from the Detroit Police Department's records management system (RMS). (See Full Details to Download),[],[],[],[],[],[] -3197,https://www.fairfaxcounty.gov/police/chief/crimestatistics,Arrest Records,200,Crime Statistics | Police,"Fairfax County, Virginia - Police, Chief, Crime Statistics","[""Language Selection"", ""Fairfax County Police Department"", ""Crime Statistics""]","[""FFX Global Navigation"", ""Department Resources"", ""Related Resources"", ""Incident Based Reporting (IBR) "", ""FBI "", ""Virginia State Police Reports"", ""Historical Statistics"", ""Related Resources""]","[""IBR\u00a0Group A Offense Tables"", ""Statistical Reports"", ""Metro Washington Council of Governments Reports (Not Prepared by the Fairfax County Police Department)"", ""Fairfax Virtual Assistant""]","[""Fairfax County Police Department Alert:""]",[],"[""\n\n\t\t\t\t\t\tTranslate\n\t\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tAwards\n\t\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tSite Feedback\n\t\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tPRIVACY POLICY & COPYRIGHT\n\t\t\t\t\t\t\n"", ""Main Address"", ""Site Tools"", ""Support"", ""Additional Resources""]" -3198,https://fargond.gov/city-government/departments/police/police-records-data/dispatch-logs,Calls for Service,200,The City of Fargo - Dispatch Logs,"","[""Dispatch Logs""]","[""""]","[""Fargo City Hall"", ""Mayor's Office"", ""The City of Fargo"", ""Quick Links"", ""Contact"", ""Stay Updated""]",[],[],[] -3199,https://data.detroitmi.gov/datasets/911-calls-for-service?geometry=-85.274%2C42.028%2C-81.569%2C42.738,Calls for Service,200,911 Calls For Service,This table shows all 911 police emergency response and officer-initiated calls for service in the City of Detroit since 2016. (See Full Details to Download),[],[],[],[],[],[] -3200,https://data.fortworthtexas.gov/Public-Safety/Crime-Data/k6ic-7kp7,Crime Statistics,200,"Crime Data | City of Fort Worth, Texas","","[""""]","[""Menu""]",[],[],[],[] -3201,https://cityprotect.com/map ,Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -3202,https://download.fargond.gov/0/training.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3203,https://www.denvergov.org/opendata,List of Data Sources,200,Denver Open Data Catalog,The Denver Open Data Catalog provides open access to data managed by the City and County of Denver.,[],"[""Featured Datasets | View All Datasets"", ""Recently Updated | View All Datasets"", ""Popular Tags"", ""Open Data License""]","[""Open Data Catalog""]",[],"[""\n\r\n ONLINE SERVICES\r\n "", ""\n\r\n OPEN DATA\r\n "", ""\n\r\n A - Z SERVICES\r\n ""]",[] -3204,https://police.fortworthtexas.gov/Public/officer-involved-shootings,Officer Involved Shootings,200," - Officer Involved Shootings -","","[""Police Department""]","[""Officer Involved Shootings"", ""Did You Know?""]","[""Public Info"", ""Resources"", ""Helpful Links"", ""Connect With FWPD""]",[],[],[] -3205,https://www.fairfaxcounty.gov/police/fairfax-county-police-department ,Contact Info & Agency Meta,404,"","",,,,,, -3206,https://www.elpasotexas.gov/police-department/about-us/annual-report/,Crime Statistics,404,"","",,,,,, -3207,https://www.fairfaxcounty.gov/police/chief/crimestatistics ,Calls for Service,404,"","",,,,,, -3208,https://www.dsm.city/departments/police-division/index.php,Crime Statistics,200,Des Moines Police Department DMPD - Home,"As the largest and most urban law enforcement agency in Iowa, the Des Moines Police Department (DMPD) has a strong commitment to community policing.","[""Police""]","[""Police""]","[""Garbage, Recycling, Yard Waste"", ""Parks, Trails, Community Recreation Centers"", ""Projects Map"", ""Email List Sign-up"", ""Show Me My House"", ""Initiatives"", ""Map Center""]","[""Share this page""]",[],[] -3209,https://data.detroitmi.gov/datasets/dpd-citizen-complaints/explore,Complaints & Misconduct,200,DPD Citizen Complaints,"All citizen complaints received by the Detroit Police Department (DPD) and the Board of Police Commissioners from January 1, 2016 to December 31, 2018.",[],[],[],[],[],[] -3210,https://fargond.gov/city-government/departments/police/police-records-data/crime-statistics,Arrest Records,200,The City of Fargo - Crime Statistics,"",[],"["""", ""Crime Statistics"", ""Traffic Statistics""]","[""Fargo City Hall"", ""Mayor's Office"", ""The City of Fargo"", ""Quick Links"", ""Contact"", ""Stay Updated""]",[],[],[] -3211,https://www.denvergov.org/Government/Agencies-Departments-Offices/Agencies-Departments-Offices-Directory/Police-Department,Contact Info & Agency Meta,200,Police Department - City and County of Denver,"Preventing crime and increasing public trust while honoring the responsibilities granted to us by those we serve, with continued focus on partnerships, learning, and innovation.","[""Police Department""]","[""Mission Statement"", ""Welcome"", ""Recruitment"", ""Performance and Transparency"", ""Contact Us"", ""Quick Links"", ""Program & Services"", ""District Stations"", ""Crime Information"", ""Police Records"", ""Traffic Enforcement and Safety"", ""Safety and Crime Prevention"", ""News and Media"", ""Community Engagement"", ""Facebook"", ""Threads"", ""Twitter""]","[""Come join our team!"", ""Stay Connected"", ""Contact 3-1-1"", ""Visit Other Denver Sites"", ""Share & Connect""]","[""""]","[""Denver Police Foundation"", ""Active Bystandership for Law Enforcement (ABLE)""]",[] -3212,https://detroitmi.gov/departments/police-department/detroit-police-department-policies,Policies & Contracts,200,Detroit Police Department Policies | City of Detroit,"The Detroit Police Department Manual contains all department policy, rules and regulations, and procedures for implementing department activities. In the spirit of continued transparency, the Department has begun posting its policies publicly on the City of the Detroit website. The Department Manual has four chapters each of which are comprised of a varying number of Directives. The four chapters are Administration, Operations, Support Services, and Personnel. A selection of these Directives are posted below for the public to view. The Department is in the process of posting additional directives online; please continue checking back onto this webpage for more Directives to be posted. In addition, please note that the Department is always updating policy in concert with the Board of Police Commissioners. As policies are updated, the public website will be updated.","[""\nDetroit Police Department Policies\n""]","[""Top Links"", ""Site Menu"", ""News & Events"", ""Featured"", ""Updated"", ""Documents""]",[],[],"[""307.8 \u2013 Gunshot Detection System "", ""Critical Incident Response \u2013\u00a0205.1"", ""Mobilization \u2013 205.3"", ""Tactical Alert Procedures \u2013 205.2"", ""Strikes, Demonstrations, and Civil Disorders \u2013\u00a0205.4"", ""Armed and Barricaded Persons \u2013 205.6""]",[] -3213,https://www.crimemapping.com/map/agency/128,Crime Maps & Reports,200,CrimeMapping.com - Helping You Build a Safer Community,"",[],[],[],[],[],[] -3214,https://detroitmi.gov/departments/police-department,Contact Info & Agency Meta,200,Police Department | City of Detroit,"The Detroit Police Department and its 2,400 officers are responsible for policing Detroit’s 139 square miles. Through innovative crime fighting programs like Cease Fire, Project Green Light, and the Real Time Crime Center, Detroit has seen sustained reductions in nearly every category of crime.   DPD Media Request Form DPD TV/Film Pitch Request Form   Social Media Disclaimer The Detroit Police Department’s (DPD) mission is to encourage thoughtful decision-making and a strong sense of community responsibility through education, equity empathy, professionalism, transparency, and policing standards properly informed by community input and civic leadership. Our social media pages are intended to serve as a gateway for communication to maintain the relationship between Detroit’s diverse community and the Detroit Police Department. Courteous and respectful comments are encouraged. The Detroit Police Department does not discriminate against commentators nor their views. However, we reserve the right to delete the following: 1) Comments that are derogatory or discriminatory of a constitutionally protected class, e.g. racist comments; 2) Comments that are violent, vulgar, harassing, obscene, profane, or hateful; 3) Suggestion or encouragement of illegal activity; 4) Threats or defamation of any person or organization; 5) Posts containing the personal identifying information of a third party 6) Copyrighted or trademarked images or graphics without the owner’s approval Freedom of speech and expression is encouraged within our community guidelines. Please note that the opinions of followers/fans/writers on the DPD pages do not reflect the views of the department or the City of Detroit.","[""\nPolice Department\n""]","[""Top Links"", ""Site Menu"", ""News & Events"", ""Featured"", ""Updated"", ""Related Links"", ""Documents"", ""Web Apps""]","[""Citizens Radio Patrol"", ""Detroit Police Department Shield Program"", ""DPD Surveillance Technology Reports & Documents"", ""Detroit Police Department Careers"", ""Precinct Social Media Accounts"", ""Victim's Assistance"", ""Report Crime"", ""2016 Crime Statistics"", ""Abandoned Vehicle"", ""Auto Theft"", ""Community and Police Advocacy (C.A.P.P.A.)"", ""Committee on Race and Equality (CORE)"", ""Detroit Police Department Office of Civil Rights"", ""Detroit Police Department Records and Reports"", ""Precincts and Neighborhood Police Officers"", ""Gun Permits Information"", ""Detroit Police Department Policies"", ""Senior Citizens 911 Profile"", ""Project Green Light Detroit"", ""Detroit Rewards TV"", ""Secondary Employment""]","[""DPD Media Request Form"", ""DPD TV/Film Pitch Request Form"", ""CONTACTS"", ""Sections""]","[""Social Media Disclaimer"", ""Gun Violence Reduction 5-graphics"", ""Gun Violence Reduction 5-graphics"", ""BOPC Shotspotter Letter of Support"", ""Gunshot Detection System Policy"", ""Surveillance Technology Specification Reports"", ""DPD Operation Clean Sweep Final Report""]",[] -3215,https://fargond.gov/city-government/departments/police/contact-us,Contact Info & Agency Meta,200,The City of Fargo - Contact Us,"","[""Contact Us""]","["""", ""Contact Information""]","[""Fargo City Hall"", ""Mayor's Office"", ""The City of Fargo"", ""Quick Links"", ""Contact"", ""Stay Updated""]",[],[],[] -3216,https://www.fresno.gov/police/wp-content/uploads/sites/5/2021/05/122020.pdf,Crime Statistics,404,"","",,,,,, -3217,https://www.fairfaxcounty.gov/police/chief/generalorders/gos ,Policies & Contracts,404,"","",,,,,, -3218,https://www.elpasotexas.gov/police-department/contact/,Contact Info & Agency Meta,404,"","",,,,,, -3219,https://www.elpasotexas.gov/police-department/about-us/annual-report/,Complaints & Misconduct,404,"","",,,,,, -3220,https://www.fairfaxcounty.gov/maps/open-geospatial-data,List of Data Sources,200,Open Geospatial Data | GIS and Mapping Services,"Fairfax County, Virginia - Fairfax County's Open Geospatial Data site","[""Language Selection""]","[""FFX Global Navigation"", ""Department Resources""]","[""Fairfax Virtual Assistant""]","[""GIS and Mapping Services Alert:""]",[],"[""\n\n\t\t\t\t\t\tTranslate\n\t\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tAwards\n\t\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tSite Feedback\n\t\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tPRIVACY POLICY & COPYRIGHT\n\t\t\t\t\t\t\n"", ""Main Address"", ""Site Tools"", ""Support"", ""Additional Resources""]" -3221,https://www.dsm.city/departments/police-division/investigations/crime_mapping.php,Crime Maps & Reports,200,Page not found,"",[],"[""Page not found""]","[""Garbage, Recycling, Yard Waste"", ""Parks, Trails, Community Recreation Centers"", ""Projects Map"", ""Email List Sign-up"", ""Show Me My House"", ""Initiatives"", ""Map Center""]","[""Search"", ""Share this page""]",[],[] -3222,https://www.denvergov.org/content/dam/denvergov/Portals/720/documents/OperationsManual/OMSBook/OM_Book.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3223,https://www.fresno.gov/police/wp-content/uploads/sites/5/2016/09/Revised-Website-OIS-list-04.21.21.pdf,Officer Involved Shootings,404,"","",,,,,, -3224,https://www.fairfaxcounty.gov/police/chief/reports/iab,Complaints & Misconduct,200,IAB Administrative Investigation and Use of Force Data Report | Police,"Fairfax County, Virginia - Fairfax County Police Department Chief, Reports, IAB 2015 Administrative Investigation and use of Force Data Report","[""Language Selection"", ""Fairfax County Police Department"", ""IAB Administrative Investigation and Use of Force Data Report""]","[""FFX Global Navigation"", ""Department Resources"", ""Related Resources"", ""Related Resources""]","[""Fairfax Virtual Assistant""]","[""Fairfax County Police Department Alert:""]",[],"[""\n\n\t\t\t\t\t\tTranslate\n\t\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tAwards\n\t\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tSite Feedback\n\t\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tPRIVACY POLICY & COPYRIGHT\n\t\t\t\t\t\t\n"", ""Main Address"", ""Site Tools"", ""Support"", ""Additional Resources""]" -3225,https://public.powerdms.com/DesMoines/tree/documents/1127110,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -3226,https://detroitmi.gov/sites/detroitmi.localhost/files/2020-05/Officer-Involved%20Shooting%20HTF.pdf,Officer Involved Shootings,200,"","",[],[],[],[],[],[] -3227,https://police.fortworthtexas.gov/Public/use-of-force-report,Complaints & Misconduct,-1,"","",,,,,, -3228,https://www.denvergov.org/Government/Agencies-Departments-Offices/Agencies-Departments-Offices-Directory/Citizen-Oversight-Board/Reports,Complaints & Misconduct,200,Reports - City and County of Denver,Read the Citizen Oversight Board annual reports.,"[""Reports""]","[""\r\n\t\t\tRelated Links\r\n\t\t""]","[""Contact 3-1-1"", ""Visit Other Denver Sites"", ""Share & Connect""]",[],[],[] -3229,https://www.denvergov.org/content/dam/denvergov/Portals/374/documents/2019AnnualReport_OIM.pdf,Officer Involved Shootings,200,"","",[],[],[],[],[],[] -3230,https://www.fairfaxcounty.gov/police/sites/police/files/assets/images/chief/reports/use%20of%20force%20policies.pdf ,Policies & Contracts,404,"","",,,,,, -3231,https://www.elpasotexas.gov/police-department/about-us/annual-report/,Calls for Service,404,"","",,,,,, -3232,https://data.detroitmi.gov/datasets/rms-crime-incidents,Arrest Records,200,RMS Crime Incidents,Reported criminal offenses that have occurred in the City of Detroit. Offense data was extracted from the Detroit Police Department's records management system (RMS). (See Full Details to Download),[],[],[],[],[],[] -3233,https://cms2files.revize.com/desmoines/document_center/Police/Forms%20and%20Documents/2019%20Statistical%20Report.pdf?pdf=2019%20Des%20Moines%20Police%20Department%20Statistical%20Report&t=1652458646619&pdf=2019%20Des%20Moines%20Police%20Department%20Statistical%20Report&t=1652458646619,Calls for Service,200,"","",[],[],[],[],[],[] -3234,https://cityofdetroit.github.io/crime-viewer/,Crime Maps & Reports,200,React App,Web site created using create-react-app,[],[],[],[],[],[] -3235,https://fargond.gov/city-government/departments/police/police-records-data/crime-statistics,Complaints & Misconduct,200,The City of Fargo - Crime Statistics,"",[],"["""", ""Crime Statistics"", ""Traffic Statistics""]","[""Fargo City Hall"", ""Mayor's Office"", ""The City of Fargo"", ""Quick Links"", ""Contact"", ""Stay Updated""]",[],[],[] -3236,https://www.fairfaxcounty.gov/police/chief/reports/iab ,Use of Force Reports,404,"","",,,,,, -3237,https://data.detroitmi.gov/,List of Data Sources,200,Detroit's Open Data Portal,"Open data portal for the city of Detroit, Michigan, USA.",[],[],[],[],[],[] -3238,https://www.fresno.gov/police/wp-content/uploads/sites/5/2021/05/28947-2020AnnualReport-FINAL-2.pdf,Complaints & Misconduct,404,"","",,,,,, -3239,https://www.fresno.gov/police/wp-content/uploads/sites/5/2021/05/28947-2020AnnualReport-FINAL-2.pdf,Calls for Service,404,"","",,,,,, -3240,https://fargond.gov/city-government/departments/police/police-records-data/crime-statistics,Use of Force Reports,200,The City of Fargo - Crime Statistics,"",[],"["""", ""Crime Statistics"", ""Traffic Statistics""]","[""Fargo City Hall"", ""Mayor's Office"", ""The City of Fargo"", ""Quick Links"", ""Contact"", ""Stay Updated""]",[],[],[] -3241,https://www.dsm.city/departments/police-division/general/frequently_called_numbers.php,Contact Info & Agency Meta,200,Contact the Des Moines Police Department,Non-emergency contact information for the Des Moines Police Department (DMPD).,[],"[""Frequently Called Numbers""]","[""Garbage, Recycling, Yard Waste"", ""Parks, Trails, Community Recreation Centers"", ""Projects Map"", ""Email List Sign-up"", ""Show Me My House"", ""Initiatives"", ""Map Center""]","[""Share this page""]",[],[] -3242,https://www.fairfaxcounty.gov/police/chief/crimestatistics ,Crime Statistics,404,"","",,,,,, -3243,"https://cityprotect.com/map/list/incidents/5ee01956f47cb62ab23a4dfc?toDate=2020-06-10T23:59:59.999Z&fromDate=2020-06-07T00:00:00.000Z&pageSize=2000&parentIncidentTypeIds=149,150,148,8,97,104,165,98,100,179,178,180,101,99,103,163,168,166,12,161,14,16,15&zoomLevel=15&latitude=46.87787727149095&longitude=-96.78031942819655&days=1,2,3,4,5,6,7&startHour=0&endHour=24&timezone=%2B00:00",Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -3244,https://police.fortworthtexas.gov/Public/general-orders,Policies & Contracts,-1,"","",,,,,, -3245,https://www.fairfaxcounty.gov/police/reports/traffic-citations  ,Stops,404,"","",,,,,, -3246,https://www.elpasotexas.gov/police-department/about-us/annual-report/,Use of Force Reports,404,"","",,,,,, -3247,https://detroitmi.gov/sites/detroitmi.localhost/files/2020-10/304.2_Use%20of%20Force.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3248,https://openjustice.doj.ca.gov/data,Stops,200,State of California Department of Justice - OpenJustice,"",[],[],[],[],[],[] -3249,https://fargond.gov/city-government/departments/police/police-records-data/crime-statistics,Crime Statistics,200,The City of Fargo - Crime Statistics,"",[],"["""", ""Crime Statistics"", ""Traffic Statistics""]","[""Fargo City Hall"", ""Mayor's Office"", ""The City of Fargo"", ""Quick Links"", ""Contact"", ""Stay Updated""]",[],[],[] -3250,https://www.denvergov.org/content/dam/denvergov/Portals/374/documents/2019AnnualReport_OIM.pdf,Complaints & Misconduct,200,"","",[],[],[],[],[],[] -3251,https://police.fortworthtexas.gov,Contact Info & Agency Meta,-1,"","",,,,,, -3252,https://www.denvergov.org/files/assets/public/police-department/documents/crime-information/uof-report.pdf,Use of Force Reports,200,"","",[],[],[],[],[],[] -3253,https://data.fortworthtexas.gov/,List of Data Sources,200,"Fort Worth - Open Data Portal | City of Fort Worth, Texas","","[""Welcome to Open Data Portal for the City of Fort Worth"", ""One Address"", ""View Development Permits""]","[""Menu"", ""Maps & Apps"", ""Data Categories"", ""Business"", ""City Government"", ""Development & Infrastructure"", ""Environment & Health"", ""Financial"", ""Property Data"", ""Public Safety"", ""Services & Recreation"", ""Technology & Communications"", ""Transportation""]","[""Police Report Search\n"", ""Crime Data Map\n"", ""One Address\n"", ""Permit Locations Map\n"", ""City Document Search\n"", ""Health Inspections\n"", ""GIS Data Download\n"", ""Code Violations Map\n"", ""Developer Resources"", ""External Resources""]",[],[],[] -3254,https://www.fairfaxcounty.gov/police/chief/generalorders/policies/officerinvolvedshooting ,Officer Involved Shootings,404,"","",,,,,, -3255,https://police.fortworthtexas.gov/Public/annual-reports,Calls for Service,-1,"","",,,,,, -3256,https://www.denvergov.org/opendata/dataset/city-and-county-of-denver-police-pedestrian-stops-and-vehicle-stops,Stops,200,Denver Open Data Catalog: Police Pedestrian Stops and Vehicle Stops,This dataset includes person and vehicle stops by the Denver Police Department from the Computer Aided Dispatch system for the previous four calendar years and the current year to date. Data without a...,[],"[""Police Pedestrian Stops and Vehicle Stops"", ""Disclaimer"", ""Resources"", ""Details"", ""Tags"", ""Open Data License""]","[""Open Data Catalog""]",[],"[""\n\r\n ONLINE SERVICES\r\n "", ""\n\r\n OPEN DATA\r\n "", ""\n\r\n A - Z SERVICES\r\n ""]",[] -3257,https://police.fortworthtexas.gov/Public/,Use of Force Reports,-1,"","",,,,,, -3258,https://police.fortworthtexas.gov/UI/Resource.aspx?p=88a63b32-398a-493c-a125-03bcfb3f1002,Policies & Contracts,-1,"","",,,,,, -3259,https://www.denvergov.org/opendata/dataset/city-and-county-of-denver-crime,Crime Statistics,200,Denver Open Data Catalog: Crime,"Description -This dataset includes criminal offenses in the City and County of Denver for the previous five calendar years plus the current year to date. The data is based on the National Incident Based...",[],"[""Crime"", ""Description"", ""Disclaimer"", ""About Crime Data"", ""Withheld Data"", ""About Crime Locations"", ""About Annual Data Snapshots"", ""Resources"", ""Details"", ""Tags"", ""Open Data License""]","[""Open Data Catalog""]",[],"[""\n\r\n ONLINE SERVICES\r\n "", ""\n\r\n OPEN DATA\r\n "", ""\n\r\n A - Z SERVICES\r\n ""]",[] -3260,https://www.elpasotexas.gov/police-department/about-us/annual-report/,Arrest Records,404,"","",,,,,, -3261,https://fargond.gov/city-government/departments/police/faqs/fargo-police-policy-manual,Policies & Contracts,200,The City of Fargo - Fargo Police Policy Manual,"","[""Fargo Police Policy Manual""]","[""""]","[""Fargo City Hall"", ""Mayor's Office"", ""The City of Fargo"", ""Quick Links"", ""Contact"", ""Stay Updated""]",[],[],[] -3262,https://www.fairfaxcounty.gov/policecivilianreviewpanel/reports,Complaints & Misconduct,200,Reports and Documents | Police Civilian Review Panel,"Fairfax County, Virginia - Police Civilian Review Panel Reports","[""Language Selection"", ""Police Civilian Review Panel"", ""Reports and Documents""]","[""FFX Global Navigation"", ""Department Resources"", ""\n\nReview Reports\n\n"", ""\n\nAnnual Reports\n\n"", ""Panel Four-Year Review 2020"", ""Panel Recommendations Matrix"", ""Panel Procedures""]","[""\n\t\t\t\t\t\t\t\t\t\t\tFoundational Documents\n\t\t\t\t\t\t\t\t\t\t"", ""\n\t\t\t\t\t\t\t\t\t\t\tBoard of Supervisors Action Items\n\t\t\t\t\t\t\t\t\t\t"", ""Fairfax Virtual Assistant""]","[""Police Civilian Review Panel Alert:""]",[],"[""\n\n\t\t\t\t\t\tTranslate\n\t\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tAwards\n\t\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tSite Feedback\n\t\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tPRIVACY POLICY & COPYRIGHT\n\t\t\t\t\t\t\n"", ""Main Address"", ""Site Tools"", ""Support"", ""Additional Resources""]" -3263,https://www.kckpd.org/contact.html,Contact Info & Agency Meta,200,"Contacts Kansas City, Kansas Police Department",Contact information for KCK Police Dept.,"[""Contacts""]","[""Auto Release"", ""Alarm Permits"", ""Animal Services"", ""Career Opportunities"", ""Community Policing"", ""Chief's Office"", ""CSI Unit"", ""FOP Lodge #4"", ""Hit and Run Investigations"", ""Investigations"", ""Internal Affairs"", ""Media Relations"", ""Narcotics Hotline"", ""Patrol Bureau"", ""Property Room"", ""Report Desk"", ""Security Guard Permits"", ""Traffic Unit"", ""Services Bureau"", ""Police Academy"", ""Victim Services""]","[""NEW! Connect KCK"", ""Contact Us"", ""Quick Links"", ""Stay Informed""]",[],[],[] -3264,https://transparency.jaxsheriff.org/Content/Files/PedestrianCitations.pdf,Stops,200,"","",[],[],[],[],[],[] -3265,"https://www.indy.gov/activity/police-administration#:~:text=IMPD%20values&text=We%20will%20only%20use%20deadly,no%20other%20options%20are%20available.",Policies & Contracts,200,indy.gov,"",[],[],[],[],[],[] -3266,https://data.kcmo.org/browse?limitTo=datasets&q=%22KCPD+Crime+Data%22&sortBy=relevance&utf8=%E2%9C%93 ,Crime Statistics,200,"Results for """"KCPD Crime Data"""", matching type of Datasets | Page 1 of 2 | Open Data KC | data.kcmo.org","","[""Categories"", ""Tags""]","[""Menu"", ""\n View Types > Datasets\n \n"", ""\n Sort\n "", ""\n Sort by Most Relevant\n \n"", ""\n Filter\n "", ""\nAuthority\n\n"", ""\nCategories\n\n"", ""\nView Types\n\n"", ""\nTags\n\n"", ""\nKCPD Crime Data 2020\n"", ""\nKCPD Crime Data 2015\n"", ""\nKCPD Crime Data 2023\n"", ""\nKCPD Crime Data 2018\n"", ""\nKCPD Crime Data 2021\n"", ""\nKCPD Crime Data 2019\n"", ""\nKCPD Crime Data 2016\n"", ""\nKCPD Crime Data 2017\n"", ""\nKCPD Crime Data 2022\n"", ""\nKCPD Crime Data 2010 Final\n"", ""A-Z"", ""A-Z""]",[],[],[],[] -3267,https://www.fresno.gov/police/wp-content/uploads/sites/5/2020/08/PolicyManual-Redacted-December-2021_Redacted.pdf,Policies & Contracts,404,"","",,,,,, -3268,https://open.jacksonms.gov/,List of Data Sources,200,Welcome - City of Jackson Open Data ,"","[""City of Jackson Open Data ""]","[""\n\n Groups\n \n"", ""\n\n Showcases\n \n"", ""Popular Datasets"", ""New and Recent Datasets""]","[""Search data"", ""Popular tags"", ""Thriving Education System"", ""Flooding Map"", ""Jackson's Census Profile"", ""Healthy Citizens"", ""Infrastructure"", ""City of Jackson Official Site"", ""Our Population At A Glance"", ""Transparency Portal"", ""Data Charts Depository"", ""City of Jackson Strategic Plan"", ""City of Jackson 311 Portal"", ""\nPolice Precinct city of Jackson and Wards\n"", ""\nWard Boundaries\n"", ""\nPopulation by Gender\n"", ""\nHealthcare Status\n"", ""\nGAP Achievement Analysis\n"", ""\nChlamydia Characteristics\n"", ""\nPopulation Density\n"", ""\nMigration\n"", ""\nOwners VS Renters\n"", ""\nTraffic Deaths\n""]",[],[],[] -3269,https://www.huntsvilleal.gov/residents/public-safety/huntsville-police/police-operations/annual-reports/,Calls for Service,200,Annual Reports - City of Huntsville,Accreditation and annual reports for the Huntsville Police Department,"[""Annual Reports""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],"[""ANNUAL REPORT"", """", ""STRATEGIC PLAN"", """", ""CALEA REPORT"", ""Police CALEA Report 2016"", """"]","[""Contact "", ""In This Section "", ""Share & Print""]",[] -3270,https://www.jaxsheriff.org,Contact Info & Agency Meta,200," - www.jaxsheriff.org - JaxSheriff.org -",The official website of the Jacksonville Sheriff's Office (JSO),[],[],[],[],[],[] -3271,https://public.powerdms.com/HSVPS/tree/documents/123,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -3272,http://www.vccahouston.org/cop/Training_Manual.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3273,https://mycity.maps.arcgis.com/apps/dashboards/8e62e67b8855477b993cfdc48a94ca17,Stops,200,ArcGIS Dashboards,ArcGIS Dashboards,[],[],[],[],[],[] -3274,https://gis-cityoffresno.hub.arcgis.com/search?tags=safety,List of Data Sources,200,City of Fresno Data Hub,The City of Fresno Open Data Portal is available for you to download and access City of Fresno Data.,[],[],[],[],[],[] -3275,https://www.indy.gov/activity/police-department-annual-reports-statistics,Complaints & Misconduct,200,indy.gov,"",[],[],[],[],[],[] -3276,https://www.huntsvilleal.gov/residents/public-safety/huntsville-police/police-operations/annual-reports/,Crime Statistics,200,Annual Reports - City of Huntsville,Accreditation and annual reports for the Huntsville Police Department,"[""Annual Reports""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],"[""ANNUAL REPORT"", """", ""STRATEGIC PLAN"", """", ""CALEA REPORT"", ""Police CALEA Report 2016"", """"]","[""Contact "", ""In This Section "", ""Share & Print""]",[] -3277,https://www.jacksonms.gov/documents/mayoral-executive-order-amending-the-city-of-jackson-police-departments-use-of-force-policy/,Media Bulletins,200,"MAYORAL EXECUTIVE ORDER AMENDING THE CITY OF JACKSON POLICE DEPARTMENT'S USE OF FORCE POLICY - Jackson, MS","","[""\n\n MAYORAL EXECUTIVE ORDER AMENDING THE CITY OF JACKSON POLICE DEPARTMENT\u2019S USE OF FORCE POLICY""]","[""Primary menu links"", ""Action toolbar"", ""Documents and forms"", ""Contact"", ""Subscribe"", ""Connect""]",[],"[""Cold Weather Shelter - Open""]","["""", """", """"]",[] -3278,https://transparency.jaxsheriff.org/Content/Files/2020YearInReview.pdf,Arrest Records,200,"","",[],[],[],[],[],[] -3279,https://public.powerdms.com/HSVPS/tree/documents/40,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -3280,https://www.jacksonms.gov/ucr/,Crime Statistics,200,"Uniform Crime Reporting - Jackson, MS","","[""Uniform Crime Reporting""]","[""Primary menu links"", ""Action toolbar"", ""Front Desk"", ""Uniform Crime Reporting (UCR) "", ""Contact"", ""Subscribe"", ""Connect""]",[],"[""Cold Weather Shelter - Open""]","["""", """", """"]",[] -3281,https://www.huntsvilleal.gov/development/building-construction/gis/data-depot/open-data/,List of Data Sources,404,"","",,,,,, -3282,https://transparency.jaxsheriff.org/,Complaints & Misconduct,200," - Home Page - JSO Open Data -","","[""Open Data & Transparency""]","[""Available Data""]",[],[],[],[] -3283,https://www.kckpd.org/assets/Final2020KCKPDAnnualReport.pdf,Use of Force Reports,404,"","",,,,,, -3284,https://data.indy.gov/,List of Data Sources,200,Open Indy Data Portal,Open Indy Data Portal,[],[],[],[],[],[] -3285,"https://cityprotect.com/map/list/agencies?toDate=2020-06-08T23:59:59.999Z&fromDate=2020-06-05T00:00:00.000Z&pageSize=2000&parentIncidentTypeIds=149,150,148,8,97,104,165,98,100,179,178,180,101,99,103,163,168,166,12,161,14,16,15&zoomLevel=5&latitude=36.823106499999376&longitude=-95.84553739999838&days=1,2,3,4,5,6,7&startHour=0&endHour=24&timezone=%2B00:00",Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -3286,https://www.kcpd.org/media/3251/pi-21-01-response-to-resistance-2221.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3287,https://www.jacksonms.gov/jpd-contact-us/,Contact Info & Agency Meta,200,"JPD Contact Us - Jackson, MS","",[],"[""Primary menu links"", ""Action toolbar"", ""Major Investigations"", ""Patrol Operations Division"", ""Administrative Support Division"", ""Support Services Division"", ""Contact"", ""Subscribe"", ""Connect""]",[],"[""Cold Weather Shelter - Open""]","["""", """", """"]",[] -3288,https://www.kcpd.org/contact-us/,Contact Info & Agency Meta,200,Contact Us,"","[""Contact Us""]","[""Contact Us""]",[],[],[],[] -3289,https://www.kckpd.org/assets/Final2020KCKPDAnnualReport.pdf,Stops,404,"","",,,,,, -3290,https://yourdata.wycokck.org/ (the county),List of Data Sources,-1,"","",,,,,, -3291,https://www.indy.gov/activity/police-department-annual-reports-statistics,Calls for Service,200,indy.gov,"",[],[],[],[],[],[] -3292,https://transparency.jaxsheriff.org/Content/Files/JSO_Geographical_Operational_Assessment_Final.pdf,Crime Statistics,200,"","",[],[],[],[],[],[] -3293,https://www.huntsvilleal.gov/residents/public-safety/huntsville-police/police-operations/administration/,Contact Info & Agency Meta,200,Administration - City of Huntsville,Contact police,"[""Administration""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],"[""ADMINISTRATION"", ""OPERATIONS\u00a0"", ""CONTACT\u00a0"", ""ADDRESSES"", ""MAIL\u00a0""]","[""Contact "", ""Phone: "", ""Address: "", ""Email: "", ""Hours: "", ""In This Section "", ""Share & Print""]",[] -3294,https://www.houstontx.gov/police/general_orders/index.htm,Policies & Contracts,200,General Orders,"","["" ""]","[""Houston Police Department"", ""POLICE Department"", ""Police Department Links ""]","[""General Orders"", ""Series 100: Organization"", ""Series 200: Administration"", ""Series 300: Personnel Management"", ""Series 400: Equipment and Uniforms"", ""Series 500: Arrest and Detention "", ""Series 600: Operations"", ""Series 700: Evidence Control"", ""Series 800: Information and Records"", ""Series 900: Civilian Personnel ""]",[],[],[] -3295,https://www.houstontx.gov/police/general_orders/600/600-17_ResponseToResistance.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3296,"https://www.communitycrimemap.com/?address=Kansas%20City,KS",Crime Maps & Reports,200,LexisNexis® Community Crime Map,"",[],[],[],[],[],[] -3297,https://www.indy.gov/activity/police-department-annual-reports-statistics,Stops,200,indy.gov,"",[],[],[],[],[],[] -3298,https://www.fresno.gov/police/police-contacts/,Contact Info & Agency Meta,200,Police Contacts – City of Fresno,"","[""Fresno.gov / Quick Search""]","[""Police Contacts"", ""Fresno Policing Districts""]","[""Contact Police"", ""Additional Contacts"", ""Fresno has five policing districts. "", ""Southwest"", ""Southeast"", ""Northeast"", ""Northwest"", ""Central"", ""Helpful Links"", ""Social""]","[""Emergency\u00a0911\u00a0(TTY/TDD)"", ""Non-Emergency\u00a0(559)\u00a0621-7000\u00a0(TTY/TDD) "", ""Graffiti Hotline\u00a0311"", ""Narcotics Tip Line\u00a0(559) 621-5900"", ""Gang Tip Line\u00a0(559)\u00a0621-GANG\u00a0(4264)"", ""See Policing Districts Map""]",[],[] -3299,https://media.graphcms.com/75EP0fDdRtesFrtrWE6Z,Policies & Contracts,200,"","",[],[],[],[],[],[] -3300,https://www.huntsvilleal.gov/residents/public-safety/huntsville-police/police-operations/annual-reports/,Stops,200,Annual Reports - City of Huntsville,Accreditation and annual reports for the Huntsville Police Department,"[""Annual Reports""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],"[""ANNUAL REPORT"", """", ""STRATEGIC PLAN"", """", ""CALEA REPORT"", ""Police CALEA Report 2016"", """"]","[""Contact "", ""In This Section "", ""Share & Print""]",[] -3301,https://transparency.jaxsheriff.org/,List of Data Sources,200," - Home Page - JSO Open Data -","","[""Open Data & Transparency""]","[""Available Data""]",[],[],[],[] -3302,https://www.houstontx.gov/police/cs/Community_Crime_Map_hosted_by_LexisNexis.htm,Crime Maps & Reports,200,Community Crime Map hosted by LexisNexis.com,"","["" ""]","[""Houston Police Department"", ""POLICE Department"", ""Police Department Links ""]","[""Community Crime Map hosted by LexisNexis.com ""]",[],[],[] -3303,https://www.kcpd.org/transparency/office-of-community-complaints/annual-reports/,Complaints & Misconduct,200,Annual Reports,"",[],[],[],[],[],[] -3304,https://www.kckpd.org/assets/Final2020KCKPDAnnualReport.pdf,Crime Statistics,404,"","",,,,,, -3305,https://www.houstontx.gov/police/department_reports/department_reports_archives.htm,Complaints & Misconduct,200,Department Reports Archives,"","["" ""]","[""Houston Police Department"", ""Department Reports Archives:"", ""Annual Reports"", ""Accountability Document Prepared for the Greater Houston Partnership "", ""Command Overview"", ""Crime by Council District"", ""Department Performance Goals"", ""EEOP Utilization Report"", ""Hate Crime Report"", ""Mental Health Division Annual Report"", ""Monthly Operational Summary"", ""Operational Staffing"", ""Racial Profiling Reports"", ""Semi-Annual BWC Audit Report"", ""Surveys"", ""Police Department Links ""]",[],[],[],[] -3306,https://www.kcpd.org/media/3466/may-traffic-summary.pdf,Stops,200,"","",[],[],[],[],[],[] -3307,https://data.indy.gov/datasets/impd-use-of-force/explore,Use of Force Reports,200,IMPD Use Of Force,Indianapolis Metropolitan Police Department (IMPD) Use of Force.,[],[],[],[],[],[] -3308,https://www.huntsvilleal.gov/residents/public-safety/huntsville-police/police-operations/annual-reports/,Complaints & Misconduct,200,Annual Reports - City of Huntsville,Accreditation and annual reports for the Huntsville Police Department,"[""Annual Reports""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],"[""ANNUAL REPORT"", """", ""STRATEGIC PLAN"", """", ""CALEA REPORT"", ""Police CALEA Report 2016"", """"]","[""Contact "", ""In This Section "", ""Share & Print""]",[] -3309,https://www.indy.gov/activity/officer-involved-shootings,Officer Involved Shootings,200,indy.gov,"",[],[],[],[],[],[] -3310,https://www.kcpd.org/about/regional-police-academy/recruit-training/,Policies & Contracts,200,Recruit Training,"","[""Regional Police Academy""]","[""Recruit Training""]",[],[],[],[] -3311,https://callsforservice.jaxsheriff.org,Calls for Service,200," - Calls for Service - Jacksonville Sheriff's Office -","",[],"[""COMPLETED DISPATCHED CALLS FOR SERVICE""]",[],[],[],[] -3312,https://www.fresno.gov/police/wp-content/uploads/sites/5/2020/08/Redacted-FTO-Manual-042020.pdf,Policies & Contracts,404,"","",,,,,, -3313,https://www.kcpd.org/transparency/policies-and-procedures/,Policies & Contracts,200,Policies and Procedures,"","[""Transparency""]","[""POLICIES AND PROCEDURES"", ""Policies"", ""Procedures""]",[],[],[],[] -3314,http://www.houstontx.gov/police/ois/,Officer Involved Shootings,200,Officer Involved Shootings,"","["" ""]","[""Houston Police Department"", ""POLICE Department"", ""Police Department Links ""]","[""Officer Involved Shootings""]",[],[],[] -3315,https://mycity.maps.arcgis.com/apps/dashboards/21eac904178c4d12a7dd8e29c0ee238e,Use of Force Reports,200,ArcGIS Dashboards,ArcGIS Dashboards,[],[],[],[],[],[] -3316,https://www.kcpd.org/crime/crime-mapping/  ,Crime Maps & Reports,404,"","",,,,,, -3317,https://transparency.jaxsheriff.org/OIS,Officer Involved Shootings,200," - Officer-Involved Shootings - JSO Open Data -","","[""\r\n \r\n OFFICER-INVOLVED SHOOTINGS\r\n\r\n\t\t\t ""]",[],"[""Please Be Advised...""]",[],[],[] -3318,https://data.kcmo.org/,List of Data Sources,200,Open Data KC | data.kcmo.org,"",[],"[""Menu""]",[],[],[],[] -3319,https://mycity.maps.arcgis.com/apps/dashboards/0ccace0ba9a84c8db1e926bf1f9cbcac,Complaints & Misconduct,200,ArcGIS Dashboards,ArcGIS Dashboards,[],[],[],[],[],[] -3320,https://www.houstontx.gov/police/cs/Monthly_Crime_Data_by_Street_and_Police_Beat.htm,Crime Statistics,200,Monthly Crime Data by Street and Police Beat,"","["" ""]","[""Houston Police Department"", ""POLICE Department"", ""Crime Data"", ""Police Department Links ""]","[""Monthly Crime Data by Street and Police Beat""]",[],[],[] -3321,https://public.powerdms.com/HSVPS/tree/documents/37,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -3322,https://data.houstontx.gov/,List of Data Sources,200,Welcome - City of Houston Open Data,"","[""City of Houston Open Data""]","[""\n\n Groups\n \n"", ""\n\n Showcases\n \n"", ""Popular Datasets"", ""New and Recent Datasets""]","[""Search data"", ""Popular tags"", ""MyCity"", ""Open Finance"", ""Texas Public Information Act"", ""Police Transparency Hub"", ""\nArchived Solicitations\n"", ""\nHouston Police Department Crime Statistics\n"", ""\nPayroll\n"", ""\nAll City of Houston Procurement Contracts\n"", ""\nBARC Animal Service Requests\n"", ""\nCheckbook\n"", ""\nArchived Solicitations\n"", ""\nBudget\n"", ""\nPayroll\n"", ""\nProperty Tax\n""]",[],[],[] -3323,http://transparency.jaxsheriff.org/,Use of Force Reports,200," - Home Page - JSO Open Data -","","[""Open Data & Transparency""]","[""Available Data""]",[],[],[],[] -3324,https://www.huntsvilleal.gov/residents/public-safety/huntsville-police/police-operations/annual-reports/,Arrest Records,200,Annual Reports - City of Huntsville,Accreditation and annual reports for the Huntsville Police Department,"[""Annual Reports""]","[""Top Requests"", ""HSV TV"", ""City News"", ""Contact Us""]",[],"[""ANNUAL REPORT"", """", ""STRATEGIC PLAN"", """", ""CALEA REPORT"", ""Police CALEA Report 2016"", """"]","[""Contact "", ""In This Section "", ""Share & Print""]",[] -3325,https://www.jaxsheriff.org/Resources/crime-mapping.aspx,Crime Maps & Reports,200," - www.jaxsheriff.org - JaxSheriff.org -",The official website of the Jacksonville Sheriff's Office (JSO),[],[],"[""Disclaimer/Use of Information Release""]",[],[],[] -3326,https://www.indy.gov/agency/indianapolis-metropolitan-police-department,Contact Info & Agency Meta,200,indy.gov,"",[],[],[],[],[],[] -3327,https://www.arcgis.com/apps/dashboards/9083bde56982414598f34a55f69b5e2d  ,Calls for Service,200,ArcGIS Dashboards,ArcGIS Dashboards,[],[],[],[],[],[] -3328,https://www.kckpd.org/assets/Final2020KCKPDAnnualReport.pdf,Complaints & Misconduct,404,"","",,,,,, -3329,https://transparency.jaxsheriff.org/Content/Files/Order%20551.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3330,https://www.houstontx.gov/police/contact/index.htm,Contact Info & Agency Meta,200,How to Contact HPD,"","["" ""]","[""Houston Police Department"", ""POLICE Department"", ""Police Department Links "", ""CONTACT US Links""]","[""How to Contact HPD ""]",[],[],[] -3331,https://lasd.org/transparency/crimeandarrest/,Crime Statistics,200,Crime and Arrest Information | Los Angeles County Sheriff's Department,"",[],"[""Crime and Arrest Statistics""]","[""Crime and Arrest Statistics"", ""LASD Crime Data"", ""Additional Information Tools""]","[""Part I and Part II Crimes Data Files Download Disclaimer"", ""Official Part I Monthly Crime Statistics"", ""Official Two-Year Comparison of Part I Crime Statistics"", ""REPORTED HATE CRIME INFORMATION"", ""Crime Mapping Tool""]",[],[] -3332,https://www.crimemapping.com/map/ca/losangeles,Crime Maps & Reports,200,CrimeMapping.com - Helping You Build a Safer Community,"",[],[],[],[],[],[] -3333,https://www.lvmpd.com/en-us/InternalOversightConstitutionalPolicing/Documents/PO-035-20%20Use%20of%20Force.pdf,Policies & Contracts,404,"","",,,,,, -3334,https://www.lapdonline.org/policies-procedures-training-sb-978/,Policies & Contracts,200,Policies & Procedures/Training SB 978 - LAPD Online,"","[""Policies & Procedures/Training SB 978""]","[""SB 978, Bradford. Law enforcement agencies: public records."", ""Admin Orders, Directives and Special Orders"", ""Police Training and Education"", ""Department Manuals"", ""Use of Force""]",[],[],[],[] -3335,https://www.longbeach.gov/police/crime-info/crime-statistics/,Crime Statistics,200,Crime Statistics,"

CRIME STATISTICS -   - LBPD MONTHLY CRIME STATISTICS  - The following statistical reports contain the LBPD's monthly crime statistic data sorted by 5 year summary, previous year to current year, and reporting district. -   - - Reporting district number is a small, geographically designed area (usually several

","[""Police Department""]","[""CRIME STATISTICS""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""National Incident-Based Reporting System"", ""2023 NIBRS Monthly Crime Statistics"", ""CRIME INCIDENT MAPPING APPLICATION"", ""2016-2022 Uniform Crime Reporting (UCR) Crime Statistics\u00a0"", ""CRIME DATA TOTALS"", ""UNIFORM CRIME REPORTING"", ""PREVIOUS YEAR TO CURRENT YEAR\u00a0"", ""5 YEAR SUMMARY\u00a0"", ""MONTHLY REPORTING DISTRICT CRIME STATS"", ""ANNUAL REPORTING DISTRICT CRIME STATS"", ""HISTORICAL CRIME GRAPH"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk"", ""Some benefits of NIBRS include:"", ""Why is this important?""]","[""File a Report Online"", ""Submit a Tip"", ""Submit a Commendation"", ""File a Complaint"", ""Ride Along Program"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""\u00a0"", ""Crime Lab Survey"", ""\u00a0""]",[] -3336,https://www.longbeach.gov/police/about-the-lbpd/lbpd-sb-978/ ,Policies & Contracts,200,City of Long Beach,"",[],"[""Page Not Found""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[] -3337,https://data.littlerock.gov/,List of Data Sources,200,City of Little Rock Open Data and Performance,"",[],"[""Menu""]",[],[],[],[] -3338,https://lasd.org/wp-content/uploads/2021/05/Transparency_Crime_Maps_Jan-Apr_051821.pdf,Crime Maps & Reports,404,"","",,,,,, -3339,manchesternh.gov/Departments/Police/Administration/Crime-Data/Crime-Statistics,Crime Statistics,200," - Crime Statistics -","","[""Crime Statistics\n"", ""Police Related Links\n""]",[],"[""\u00a0"", ""Crime Data Links\n""]","[""2022"", ""2023"", ""City Hall"", ""City Government"", ""About Manchester"", ""City Services"", ""Mobile App""]","[""2021""]",[] -3340,https://www.longbeach.gov/police/about-the-lbpd/lbpd-1421748/ois/ ,Officer Involved Shootings,200,City of Long Beach,"",[],"[""Page Not Found""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[] -3341,https://www.lapdonline.org/office-of-the-chief-of-police/professional-standards-bureau/disciplinary-penalties/,Complaints & Misconduct,200,Disciplinary Penalties - LAPD Online,"","[""Disciplinary Penalties""]","[""2023"", ""2022"", ""2021"", ""2020""]",[],[],[],[] -3342,https://www.littlerock.gov/media/5716/lrpd-use-of-force-policy.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3343,https://www.crimemapping.com/map/nv/lasvegas,Crime Maps & Reports,200,CrimeMapping.com - Helping You Build a Safer Community,"",[],[],[],[],[],[] -3344,https://data.littlerock.gov/Safe-City/Little-Rock-Police-Department-Statistic-Insights/9iy3-rb7k,Crime Maps & Reports,200,City of Little Rock Open Data and Performance,"",[],"[""Menu""]",[],[],[],[] -3345,https://data.memphistn.gov/Public-Safety/Memphis-Police-Department-Aggregate-Crime/n7ue-iwew,Crime Statistics,200,Memphis Police Department Aggregate Crime | Memphis Data Hub,"","[""""]","[""Menu""]",[],[],[],[] -3346,https://data.lacity.org/browse?Data-Owner_Department=LAPD&limitTo=datasets&tags=cfs&page=1,Calls for Service,200,"Results matching type of Datasets, of LAPD, and topic of cfs | Page 1 of 2 | Los Angeles - Open Data Portal","","[""Categories"", ""Department"", ""Tags""]","[""Menu"", ""\n View Types > Datasets\n \n"", ""\n Department > LAPD\n \n"", ""\n Tags > cfs\n \n"", ""\n Sort\n "", ""\n Sort by Most Relevant\n \n"", ""\n Filter\n "", ""\nCategories\n\n"", ""\nView Types\n\n"", ""\nDepartment\n\n"", ""\nTags\n\n"", ""\nFederated Domains\n\n"", ""\nLAPD Calls for Service 2020\n"", ""\nLAPD Calls for Service 2019\n"", ""\nLAPD Calls for Service 2014\n"", ""\nLAPD Calls for Service 2017\n"", ""\nLAPD Calls for Service 2016\n"", ""\nLAPD Calls for Service 2018\n"", ""\nLAPD Calls for Service 2015\n"", ""\nLAPD Calls for Service 2010\n"", ""\nLAPD Calls for Service 2022\n"", ""\nLAPD Calls for Service 2021\n"", ""A-Z"", ""A-Z"", ""A-Z""]",[],[],[],[] -3347,https://www.doj.nh.gov/criminal/documents/law-enforcement-manual.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3348,https://www.lvmpd.com/en-us/Pages/Statistics.aspx,Arrest Records,404,"","",,,,,, -3349,https://longbeachca.maps.arcgis.com/apps/webappviewer/index.html?id=da05d12e09104e598b6ebcace59f2bba ,Crime Maps & Reports,200,ArcGIS Web Application,"","[""""]",[],[],[],[],[] -3350,https://citydocs.longbeach.gov/LBPDPublicDocs/Browse.aspx?dbid=0&id=131218&row=1&cr=1 ,Policies & Contracts,-1,"","",,,,,, -3351,https://www.lvmpd.com/en-us/Documents/2018_IAB_Complaint_Summary.pdf,Complaints & Misconduct,404,"","",,,,,, -3352,https://www.lvmpd.com/en-us/Documents/Statistics/Weekly%20Crime%20Report112621_media.pdf,Crime Statistics,404,"","",,,,,, -3353,https://www.lapdonline.org/office-of-the-chief-of-police/constitutional-policing/annual-complaint-report/,Complaints & Misconduct,200,Annual Complaint Report - LAPD Online,"","[""Annual Complaint Report""]","[""2015 - 2019 Annual Complaint Reports""]",[],[],[],[] -3354,https://clrweb.littlerock.state.ar.us/pub/public_menu.php,Calls for Service,200,CLR Dispatches,"",[],[],"[""Little Rock Dispatches delayed 30 minutes to 8 hours displayed""]",[],[],[] -3355,https://louisville-police.org/237/Important-Phone-Numbers,Contact Info & Agency Meta,200,"Important Phone Numbers | Louisville Metro PD, KY",Review all phone numbers concerned with the Police Department. ,"[""\r\n\r\nImportant Phone Numbers\t\t""]","[""Give an Anonymous Tip\u00a0"", ""Criminal Investigations"", ""Division Phone Numbers"", ""Other Numbers"", ""Other Agencies"", ""Parking Tickets"", ""Warrants/Emergency Protective Order (EPO)""]","[""Loading"", ""Hours"", ""Contact Us"", ""FAQs"", ""Popular Links"", ""Site Links""]",[],[],[] -3356,https://opendataportal-lasvegas.opendata.arcgis.com/,List of Data Sources,200,City of Las Vegas Open Data,City of Las Vegas Open Data Page,[],[],[],[],[],[] -3357,https://www.longbeach.gov/citymanager/cpcc/annual-report/,Complaints & Misconduct,200,Annual Report,"

- - 761 - false -

","[""City Manager""]","[""Annual Report"", ""The CPCC's Annual Reports""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""Government Affairs"", ""Contact Your..."", ""CPCC"", ""Tidelands CIP Division"", ""Projects"", ""More Projects"", ""Annual Report"", ""Contact Us"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[] -3358,http://www.lvpmsa.org/Forms/Dept.%20Man%207-14-07.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3359,https://www.manchesternh.gov/Portals/2/Departments/police_web/SOP-Authority-Law-Enforcement-Role_06-2020.pdf?ver=2020-06-24-084502-160,Policies & Contracts,200,"","",[],[],[],[],[],[] -3360,http://www.manchesternh.gov/Portals/2/Departments/police_blog/Police%20Log.pdf,Arrest Records,200,"","",[],[],[],[],[],[] -3361,https://www.longbeach.gov/police/about-the-lbpd/lbpd-stop-data ,Stops,200,City of Long Beach,"",[],"[""Page Not Found""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[] -3362,https://www.littlerock.gov/media/6483/administrative_personnel_policy_and_procedure_feb_20.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3363,https://lasd.org/lasd-phone-directory/,Contact Info & Agency Meta,200,LASD Phone Directory | Los Angeles County Sheriff's Department,"",[],"[""LASD Phone Directory""]","[""Station Phone Numbers"", ""Unit Phone Numbers"", ""Organization Phone Numbers""]",[],[],[] -3364,https://publicsafety.memphistn.gov/#!/dashboard?places=&restrictedPlaces=&categories=571:66%7C572:66-73%7C573:66-69%7C574:66-68%7C575:66-69%7C576:66%7C577:66-69%7C578:66%7C579:66-67%7C580:66-70%7C581:66-68%7C582:66-80%7C583:66-68%7C584:66-75%7C585:66-67%7C586:66%7C587:66-67&start_date=2020-05-25&end_date=2020-06-08&lat=35.1495&lng=-89.90719999999999&zoom=10&shapeIds=&shapeGroupId=me95-vbw4&showSideBar=false&mapType=Map&listViewTab=overview&overlayLayers=Zip%20Codes&search_field=&search_value=&autoUpdate=false&heatFilters=&statusFilter=&choroplethField=count&searchType=&include_restricted_places=false,Crime Maps & Reports,200,Memphis Public Safety,"",[],[],[],[],[],[] -3365,https://louisville-police.org/DocumentCenter/View/2386/PSU-INVESTIGATED-CASES-Monthly-Breakdown-2022,Complaints & Misconduct,200,"","",[],[],[],[],[],[] -3366,https://www.lvmpd.com/en-us/Documents/IAB%20Annual%20Accountability%20Report%202018-2019.pdf,Complaints & Misconduct,404,"","",,,,,, -3367,https://lasd.org/transparency/crimeandarrest/,Arrest Records,200,Crime and Arrest Information | Los Angeles County Sheriff's Department,"",[],"[""Crime and Arrest Statistics""]","[""Crime and Arrest Statistics"", ""LASD Crime Data"", ""Additional Information Tools""]","[""Part I and Part II Crimes Data Files Download Disclaimer"", ""Official Part I Monthly Crime Statistics"", ""Official Two-Year Comparison of Part I Crime Statistics"", ""REPORTED HATE CRIME INFORMATION"", ""Crime Mapping Tool""]",[],[] -3368,https://data.lacity.org/Public-Safety/Arrest-Data-from-2020-to-Present/amvf-fr72,Arrest Records,200,Arrest Data from 2020 to Present | Los Angeles - Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -3369,https://data.lacity.org/browse?q=crime%20data&sortBy=relevance,Crime Statistics,200,"Results for ""crime data"" | Page 1 of 4 | Los Angeles - Open Data Portal","","[""Categories"", ""Department"", ""Tags""]","[""Menu"", ""\n Sort\n "", ""\n Sort by Most Relevant\n \n"", ""\n Filter\n "", ""\nCategories\n\n"", ""\nView Types\n\n"", ""\nDepartment\n\n"", ""\nTags\n\n"", ""\nFederated Domains\n\n"", ""\nCrime Data from 2020 to Present\n"", ""\nCrime Data from 2010 to 2019\n"", ""\nDomestic Violence Calls from 2020 to Present\n"", ""\nTraffic Collision Data from 2010 to Present\n"", ""\nCrime in Los Angeles in 2020 Bar Chart\n"", ""\nNumber of crimes 2010 - today\n"", ""\nNumber of Most Serious Crimes (code 110) in LA neighborhoods\n"", ""\nArrest Data from 2010 to 2019\n"", ""\nLAPD - Annual High Level Metrics - GOVSTAT - Archived\n"", ""\nArrest Data from 2020 to Present\n"", ""A-Z"", ""A-Z"", ""A-Z""]",[],[],[],[] -3370,https://data.lacity.org/,List of Data Sources,200,"DataLA: Information, Insights, and Analysis from the City of Angels | Los Angeles - Open Data Portal","",[],"[""Menu""]",[],[],[],[] -3371,https://louisville-police.org/DocumentCenter/View/778/LMPD-Training-Curriculum-Outline-2018,Policies & Contracts,200,"","",[],[],[],[],[],[] -3372,https://www.lvmpd.com/en-us/InternalOversightConstitutionalPolicing/Documents/Statistical%20Data%20and%20Reports/2020/Use%20of%20Force%20and%20Vehicle%20Pursuit%20Statistical%20Report%202016-2020%20FINAL.pdf,Use of Force Reports,404,"","",,,,,, -3373,https://data.lacounty.gov/Criminal/All-Shooting-Incidents-for-Deputy-Involved-Shootin/xutq-azb6/data,Officer Involved Shootings,200,County of Los Angeles Open Data,"This site represents the County of Los Angeles' commitment to transparency, accountability, and community engagement - and further serve as a centralized data resource for data-driven projects. ",[],[],[],[],[],[] -3374,https://www.manchesternh.gov/Departments/Police/Contact-Police,Contact Info & Agency Meta,200," - Contact Police -","","[""Email Police\n"", ""Police Related Links\n""]",[],[],"[""City Hall"", ""City Government"", ""About Manchester"", ""City Services"", ""Mobile App""]",[],[] -3375,https://data.littlerock.gov/Safe-City/Little-Rock-Police-Department-Statistic-Insights/9iy3-rb7k,Crime Statistics,200,City of Little Rock Open Data and Performance,"",[],"[""Menu""]",[],[],[],[] -3376,https://www.lapdonline.org/contact-us/,Contact Info & Agency Meta,200,Contact Us - LAPD Online,"","[""Contact Us"", ""Helpful Links and Information""]","[""Phone Numbers"", ""Email the LAPD"", ""Addresses"", ""Non-Emergency Crime Reporting & Hotlines"", ""Get Service"", ""Other Services"", ""Actions & Information"", ""External Resources""]",[],[],[],[] -3377,https://data.louisvilleky.gov/dataset/crime-reports,Crime Statistics,200,Louisville Kentucky Open Data,"Explore our open data and tools, and use it build insights of your own.",[],[],[],[],[],[] -3378,https://www.crimemapping.com/map/nh/manchester,Crime Maps & Reports,200,CrimeMapping.com - Helping You Build a Safer Community,"",[],[],[],[],[],[] -3379,https://data.louisvilleky.gov/dataset/lmpd-stops-data,Stops,200,Louisville Kentucky Open Data,"Explore our open data and tools, and use it build insights of your own.",[],[],[],[],[],[] -3380,https://lasd.org/transparency/discipline/#discipline_2021,Complaints & Misconduct,200,Discipline | Los Angeles County Sheriff's Department,"These reports are based on the Department’s “Letters of Intent” and does not reflect modifications to recommended discipline due to Grievances, Skelly Hearings, Arbitration Hearings, Civil Service Commission Hearings, and/or Court Litigation.",[],"[""Accountability""]","[""Employee Discipline Reports"", ""Inquiries and miscellaneous documents""]","[""2023"", ""2022"", ""2021"", ""2020"", ""2019"", ""2018"", ""2020""]",[],[] -3381,https://citydocs.longbeach.gov/LBPDPublicDocs/DocView.aspx?id=162830&dbid=0&repo=LBPD-PUBDOCS ,Policies & Contracts,-1,"","",,,,,, -3382,https://data.memphistn.gov/Public-Safety/911-Call-Volume-Average-Answer-Time/mec3-hdce,Calls for Service,200,911 Call Volume & Average Answer Time | Memphis Data Hub,This dataset shows the amount of time it takes the City of Memphis to answer calls to 911.,[],"[""Menu""]",[],[],[],[] -3383,https://lasd.org/transparency/useofforce/#uof_2018-2021,Use of Force Reports,200,Use of Force | Los Angeles County Sheriff's Department,"",[],"[""Use of Force""]","[""Patrol Divisions"", ""Custody Division"", ""Court Services Division"", ""Countywide Services Division"", ""Special Operations Division"", ""Use of Force - Category 3""]","[""2019-2022 Comparison Reports"", ""2018-2021 Comparison Reports"", ""2017-2020 Comparison Reports"", ""2016-2019 Comparison Reports"", ""2015-2018 Comparison Reports"", ""2023"", ""2022"", ""2021"", ""2020"", ""2019"", ""2018"", ""2017"", ""2019-2021 Reports"", ""2017-2020 Reports"", ""2016-2019 Reports"", ""2015-2018 Reports"", ""2019-2022 Reports"", ""2018-2021 Reports"", ""2017-2020 Reports"", ""2016-2019 Reports"", ""2015-2018 Reports"", ""2017 (Click to expand)"", ""2023"", ""2022"", ""2021"", ""2020"", ""2019"", ""2018"", ""2017""]",[],[] -3384,https://www.littlerock.gov/residents/police-department/contact-us/,Contact Info & Agency Meta,200,Contact Us | City of Little Rock,"","[""Contact the LRPD""]","[""We'd Love to Hear from You!"", ""E-Mail Us"", ""Call Us"", ""Get Connected with Us""]",[],[],[],[] -3385,https://datalb.longbeach.gov/,List of Data Sources,-1,"","",,,,,, -3386,https://www.crimemapping.com/map/agency/211,Crime Maps & Reports,200,CrimeMapping.com - Helping You Build a Safer Community,"",[],[],[],[],[],[] -3387,https://louisville-police.org/DocumentCenter/View/2008/Hillard-Heintze-Report?bidId=,Policies & Contracts,200,"","",[],[],[],[],[],[] -3388,https://www.lvmpd.com/en-us/InternalOversightConstitutionalPolicing/Documents/Statistical%20Data%20and%20Reports/2020/Use%20of%20Force%20and%20Vehicle%20Pursuit%20Statistical%20Report%202016-2020%20FINAL.pdf,Officer Involved Shootings,404,"","",,,,,, -3389,https://data.lacounty.gov/,List of Data Sources,200,County of Los Angeles Open Data,"This site represents the County of Los Angeles' commitment to transparency, accountability, and community engagement - and further serve as a centralized data resource for data-driven projects. ",[],[],[],[],[],[] -3390,https://www.lapdonline.org/police-commission/categorical-use-of-force/,Use of Force Reports,200,Categorical Use of Force - LAPD Online,"","[""Categorical Use of Force""]","[""Abridged Summary Of Categorical Use Of Force Incident Findings By The Los Angeles Board Of Police Commissioners"", ""Categorical Use of Force - 2023"", ""Categorical Use of Force - 2022"", ""Categorical Use of Force - 2021"", ""Categorical Use of Force - 2020"", ""Categorical Use of Force - 2019"", ""Categorical Use of Force - 2018"", ""Categorical Use of Force - 2017"", ""Categorical Use of Force - 2016"", ""Categorical Use of Force - 2015"", ""Categorical Use of Force - 2014"", ""Categorical Use of Force - 2013"", ""Categorical Use of Force - 2012"", ""Categorical Use of Force - 2011"", ""Categorical Use of Force - 2010"", ""Categorical Use of Force - 2009"", ""Categorical Use of Force - 2008"", ""Categorical Use of Force - 2007"", ""Categorical Use of Force - 2006""]",[],[],[],[] -3391,https://www.lapdonline.org/police-commission/categorical-use-of-force/,Officer Involved Shootings,200,Categorical Use of Force - LAPD Online,"","[""Categorical Use of Force""]","[""Abridged Summary Of Categorical Use Of Force Incident Findings By The Los Angeles Board Of Police Commissioners"", ""Categorical Use of Force - 2023"", ""Categorical Use of Force - 2022"", ""Categorical Use of Force - 2021"", ""Categorical Use of Force - 2020"", ""Categorical Use of Force - 2019"", ""Categorical Use of Force - 2018"", ""Categorical Use of Force - 2017"", ""Categorical Use of Force - 2016"", ""Categorical Use of Force - 2015"", ""Categorical Use of Force - 2014"", ""Categorical Use of Force - 2013"", ""Categorical Use of Force - 2012"", ""Categorical Use of Force - 2011"", ""Categorical Use of Force - 2010"", ""Categorical Use of Force - 2009"", ""Categorical Use of Force - 2008"", ""Categorical Use of Force - 2007"", ""Categorical Use of Force - 2006""]",[],[],[],[] -3392,https://data.louisvilleky.gov/dataset/officer-involved-shooting-and-statistical-analysis,Officer Involved Shootings,200,Louisville Kentucky Open Data,"Explore our open data and tools, and use it build insights of your own.",[],[],[],[],[],[] -3393,https://oig.lacounty.gov/,Complaints & Misconduct,200,Office of Inspector General,Office of Inspector General,"[""Office of Inspector General""]","[""File A Complaint"", ""Latest Publications""]","[""\n To promote transparency, constitutional policing, and the fair and impartial administration of justice.\n ""]","[""Deputy Gangs"", ""Unlawful Conduct by the former Sheriff/LASD"", ""Probation Department Oversight"", ""Third Report Back on Meeting the Sheriff's Department's Obligations Under Senate Bill 1421"", ""Fifth Report Back on Addressing Emergent Illicit Substances and Contraband Entering the Los Angeles County Juvenile Halls"", ""Quarterly Report on Programming, Grievances and Room Confinement at Barry J. Nidorf and Central Juvenile Halls - April to June 2023"", ""Reform and Oversight Efforts: Los Angeles County Sheriff's Department - July to September 2023"", ""Ninth Report Back on Implementing Body-Worn Cameras in Los Angeles County"", """", ""Fourth Report Back on Addressing Emergent Illicit Substances and Contraband Entering the Los Angeles County Juvenile Halls"", ""JOIN OUR EMAILING LIST""]","[""Quick Links"", ""Contact Us"", ""County Information""]",[] -3394,https://louisville-police.org/ArchiveCenter/ViewFile/Item/91,Arrest Records,200,"","",[],[],[],[],[],[] -3395,https://www.lvmpd.com/en-us/ProtectTheCity/Pages/LVMPDPoliceAcademy.aspx,Policies & Contracts,404,"","",,,,,, -3396,https://www.kckpd.org/8cantwait.html,Policies & Contracts,404,"","",,,,,, -3397,https://www.lapdonline.org/newsroom/policy-on-the-use-of-force-revised/,Policies & Contracts,200,Policy on the Use of Force - Revised - LAPD Online,"","[""Policy on the Use of Force \u2013 Revised""]","[""View Newsroom Articles by Year"", ""Do you have any helpful information regarding this post?""]","[""Wish to remain anonymous?""]",[],[],[] -3398,https://www.longbeach.gov/police/about-the-lbpd/lbpd-1421748/use-of-force/,Use of Force Reports,-1,"","",,,,,, -3399,https://louisville-police.org/DocumentCenter/View/615/Standard-Operating-Procedures-PDF,Policies & Contracts,-1,"","",,,,,, -3400,https://www.lvmpd.com/en-us/Pages/ContactUs.aspx,Contact Info & Agency Meta,404,"","",,,,,, -3401,http://www.manchesternh.gov/Departments/Police/Police-Log,Calls for Service,200," - Police Log -","","[""Police Log\n"", ""Police Related Links\n""]",[],"[""Dates\n""]","[""City Hall"", ""City Government"", ""About Manchester"", ""City Services"", ""Mobile App""]",[],[] -3402,https://lasd.org/SACR_opendata.html,Stops,404,"","",,,,,, -3403,http://shq.lasdnews.net/content/uoa/PSD/force-policy.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3404,http://shq.lasdnews.net/pages/pagedetail.aspx?id=2411,Policies & Contracts,200,LASD.org - Information Detail,"",[],[],[],[],[],[] -3405,https://www.longbeach.gov/police/contact-us/ ,Contact Info & Agency Meta,200,City of Long Beach,"",[],"[""Page Not Found""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]",[],[] -3406,https://www.lvmpd.com/en-us/Pages/CurrentTraffic.aspx,Stops,404,"","",,,,,, -3407,https://www.nashville.gov/departments/police/data-dashboard/vehicle-stops-map,Stops,200,Police Data Dashboard: Vehicle Stops Map | Nashville.gov,Official website of the Metropolitan Government of Nashville and Davidson County.,"[""Police Data Dashboard: Vehicle Stops Map\n""]","[""Breadcrumb"", ""Related Tags"", ""\n Mobile Apps\n "", ""Nashville.gov"", ""Quick Links"", ""Contact"", ""Connect""]",[],[],[],[] -3408,https://www.nashville.gov/departments/police/data-dashboard/use-force,Use of Force Reports,200,Police Data Dashboard: Use of Force | Nashville.gov,Official website of the Metropolitan Government of Nashville and Davidson County.,"[""Police Data Dashboard: Use of Force\n""]","[""Breadcrumb"", ""Related Tags"", ""\n Mobile Apps\n "", ""Nashville.gov"", ""Quick Links"", ""Contact"", ""Connect""]",[],[],[],[] -3409,https://data.montgomerycountymd.gov/,List of Data Sources,200,Montgomery County Data | Open Data Portal,"",[],"[""Menu""]",[],[],[],[] -3410,https://data.mesaaz.gov/Police/Police-Incidents/39rt-2rfj`,Crime Statistics,404,"","",,,,,, -3411,https://www2.minneapolismn.gov/government/departments/civil-rights/opcr/case-summaries/,Complaints & Misconduct,200,Case Summaries - City of Minneapolis,You can view the open and closed case summaries from the Office of Police Conduct Review.,"[""Case summaries"", ""Need help? We're here for you.""]","[""Open case reports"", ""Closed case summaries"", ""2022"", ""OPCR Case summaries and synopses"", ""\u00a0"", ""2019 through 2021"", ""\u00a0"", ""2018"", ""\u00a0"", ""2017"", ""\u00a0"", ""2016"", ""\u00a0"", ""\u00a0 2015"", ""2014"", ""\u00a0"", ""2013"", ""Contact us""]","[""\n Request accessible format\r\n "", ""Office of Police Conduct Review""]",[],[],[] -3412,https://www.crimemapping.com/map/fl/miami-dadecounty  ,Crime Maps & Reports,200,"","",[],[],[],[],[],[] -3413,https://data.milwaukee.gov/dataset/wibr,Crime Statistics,200,WIBR Crime Data (Current) - Dataset - City of Milwaukee Open Data Portal ,"","[""\nMilwaukee Open Data\n"", ""WIBR Crime Data (Current)"", ""Milwaukee Police Department\n \n "", ""\n \n WIBR Crime Data (Current)\n \n \n \n ""]","["" Organization"", "" Social"", "" License"", ""Data and Resources""]","[""Additional Info""]",[],[],[] -3414,https://gis-mdc.opendata.arcgis.com/datasets/ufc/explore,Complaints & Misconduct,200,UFC,A feature layer of Miami-Dade Police Department Professional Compliance Bureau citizen complaint data.,[],[],[],[],[],[] -3415,https://www.montgomerycountymd.gov/pol/Resources/Files/PDF/Directives/100/FC%20131%20Response%20Resistance%20and%20Use%20of%20Force_052021.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3416,https://mpdtsu.org/tsustatistics/,Stops,200,TSU Statistics – Traffic Safety Unit,"","[""TSU Statistics""]",[],"[""Share this:""]",[],[],[] -3417,https://www.miamidade.gov/global/service.page?Mduid_service=ser1510669357918648,Crime Statistics,200,Crime Map,Check out our crime incident map to see if crimes have been committed in your area. Check out our crime incident map to see if crimes have been committed in your area. Check out our crime incident map to see if crimes have been committed in your area. Check out our crime incident map to see if crimes have been committed in your area. Check out our crime incident map to see if crimes have been committed in your area. Check out our crime incident map to see if crimes have been committed in your area. Check out our crime incident map to see if crimes have been committed in your area. Check out our crime incident map to see if crimes have been committed in your area.,"[""Crime Map""]","[""Online Options"", ""Miami-Dade Police Department"", ""Help and Support"", ""Self-Service"", ""Stay Connected"", ""Leaving Miami-Dade County""]","[""Interest Categories"", ""Online Services"", ""News & Social Media"", ""Create a new miamidade.gov account"", ""Elected Officials"", ""County Agencies"", ""Transparency & Open Data "", ""Employee Information"", ""My Employee Portal"", ""Interest Categories"", ""Online Services"", ""News & Social Media"", ""Create a new miamidade.gov account"", ""Elected Officials"", ""County Agencies"", ""Transparency & Open Data "", ""Employee Information"", ""My Employee Portal""]",[],[],[] -3418,https://www.miamidade.gov/global/police/contact-police.page,Contact Info & Agency Meta,200,Contact the Miami-Dade Police Department,Contact information for Miami-Dade Police Department.,"[""Contact the Miami-Dade Police Department""]","[""Office of the Director"", ""Compliance and Standards Division"", ""Police Services"", ""Fiscal and Departmental Services"", ""Investigative Services"", ""Support Services"", ""Public Safety and Emergency Response Services"", ""Crime Stoppers"", ""Public Records Requests "", ""Accommodations for Persons with Disabilities"", ""\nMiami-Dade Police Department\n"", ""Help and Support"", ""Self-Service"", ""Stay Connected"", ""Leaving Miami-Dade County""]","[""Interest Categories"", ""Online Services"", ""News & Social Media"", ""Create a new miamidade.gov account"", ""Elected Officials"", ""County Agencies"", ""Transparency & Open Data "", ""Employee Information"", ""My Employee Portal"", ""Interest Categories"", ""Online Services"", ""News & Social Media"", ""Create a new miamidade.gov account"", ""Elected Officials"", ""County Agencies"", ""Transparency & Open Data "", ""Employee Information"", ""My Employee Portal""]",[],[],[] -3419,https://public.powerdms.com/MESAPD/tree,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -3420,https://city.milwaukee.gov/fpc/Reports/ReportsonMPD/Use-of-Force-Reports.htm#.XtfXuTpKiUk,Use of Force Reports,200,Use of Force Reports,"","[""Use of Force Reports""]","[""Annual Reports"", ""Mid-Year Reports"", ""Other Use of Force Reports""]",[],"["""", ""Welcome to the City of Milwaukee"", ""\n"", ""Residents\r\n"", """", ""Open for Business"", """", ""News & Events"", """", ""Refine Search"", ""\u00a0"", ""Menu"", ""\u00a0CALL for Action: 414-286-CITY"", ""\u00a0CLICK for Action""]","[""Mayor's Office"", ""City of Milwaukee"", ""Common Council""]","[""Established in 1846, the City of Milwakee is home to nearly 600,000 residents and is a city built on water with over 10 miles of lakefront shoreline. With three rivers and a Great Lake, water plays a key role in the city\u2019s history, identity, and economy.\nAbout Us |\u00a0Choose Milwaukee\u00a0| Contact Us""]" -3421,https://data.miamigov.com/,List of Data Sources,-1,"","",,,,,, -3422,https://www.mesaaz.gov/home/showdocument?id=22664,Complaints & Misconduct,404,"","",,,,,, -3423,https://www.arcgis.com/apps/dashboards/714e29a27f694137a29f2ee048dfb8a3  ,Officer Involved Shootings,200,ArcGIS Dashboards,ArcGIS Dashboards,[],[],[],[],[],[] -3424,https://data.montgomerycountymd.gov/Public-Safety/Police-Dispatched-Incidents/98cc-bc7d,Calls for Service,200,Police Dispatched Incidents | Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -3425,https://www.mesaaz.gov/government/contact-us?locale=en,Contact Info & Agency Meta,200," - - Contact Us | City of Mesa - -",Contact the City of Mesa,"[""City of Mesa"", ""Contact Us""]","["""", """", ""Additional Links"", ""Additional Resources"", ""Get Social""]",[],[],[],[] -3426,https://data.milwaukee.gov/,List of Data Sources,200,Welcome - City of Milwaukee Open Data Portal ,"","[""\nMilwaukee Open Data\n"", ""City of Milwaukee Open Data Portal ""]","[""\n\n Groups\n \n"", ""\n\n Showcases\n \n"", ""Popular Datasets"", ""New and Recent Datasets""]","[""Search data"", ""Popular tags"", ""Address Search Application"", ""Map Milwaukee Portal"", ""My Milwaukee Home"", ""Property Assessment Data"", ""Current Milwaukee Fire Dispatched Calls for Service"", ""Current Milwaukee Police Dispatched Calls for Service"", ""Restaurant and Food Service Inspections"", ""Budget Office Visualizations"", ""Assessed V.S. Exempt Properties by Ald. District 2018"", ""Service Request Comparisons Between 2016 and 2017"", ""\nCity Employee Salary Data\n"", ""\nProperty Sales Data\n"", ""\nPersonal Property Assessments\n"", ""\nMaster Property File (MPROP)\n"", ""\nWIBR Crime Data (Current)\n"", ""\nCity of Milwaukee Open Data Dataset Catalog\n"", ""\nWIBR Crime Data (Historical)\n"", ""\nWIBR Crime Data (Current)\n"", ""\nTraffic Accident Data\n"", ""\nMaster Property File (MPROP)\n""]",[],[],[] -3427,https://www.minneapolismn.gov/government/departments/police/mpd-policy-procedure-manual/policy-manual/ ,Policies & Contracts,404,"","",,,,,, -3428,https://gis-mdc.opendata.arcgis.com/datasets/srrr/explore ,Use of Force Reports,200,SRRR,A feature layer of Miami-Dade Police Department Professional Compliance Bureau citizen complaint data.,[],[],[],[],[],[] -3429,https://www.minneapolismn.gov/media/-www-content-assets/documents/MPD-Policy-and-Procedure-Manual.pdf ,Policies & Contracts,300,300 Multiple Choices,"","[""Multiple Choices""]",[],[],[],[],[] -3430,https://opendata.minneapolismn.gov/datasets/cityoflakes::police-stop-data,Stops,200,Police Stop Data,Stop Data for the Minneapolis Police Department. Please note that the datetimes shown are in UTC time (not local time).,[],[],[],[],[],[] -3431,http://archive.miamigov.com/cip/docs/AnnualReport2017.pdf,Complaints & Misconduct,200,Civilian Investigative Panel (CIP) - Miami,The Civilian Investigative Panel (CIP) provides for independent and impartial citizens’ oversight of the Miami Police Department.,"[""Civilian Investigative Panel (CIP)"", ""Top Services"", ""Process""]","[""File a Complaint Against a Miami Police Officer"", ""Join the Community-Police Mediation Program"", ""Department Head"", ""What We Do"", ""Staff"", ""Panel Members"", ""Investigations"", ""Community-Police Mediation Program"", ""Reports and Data"", ""Contact Us"", ""\r\n\t\t\tMeetings & Agendas\r\n\t\t"", ""\r\n\t\t\tFiling a Complaint\r\n\t\t"", ""\r\n\t\t\tApply to be a Member\r\n\t\t""]","[""Message from City Manager Art Noriega V"", ""\nRodney Jacobs\n"", ""Filing a Complaint"", ""Phone"", ""Email"", ""Location"", ""Contact Us"", ""Share & Connect"", ""Visit Other Miami Sites"", ""Digital Cities""]",[],[],[] -3432,https://tableau.minneapolismn.gov/views/MPDMStatArrestData/ArrestDashboard-byDate?:iid=1&:isGuestRedirectFromVizportal=y&:embed=y,Arrest Records,403,"","",,,,,, -3433,https://www.miami-police.org/annual_reports.html,Crime Statistics,200,Annual Reports - Miami Police Department,Miami Police Department Annual Reports,[],[],[],[],[],[] -3434,https://reimagine.memphistn.gov/isb-dashboard/,Complaints & Misconduct,200,ISB Dashboard - Reimagine Policing in Memphis,"","[""ISB Dashboard""]","[""What is ISB?"", ""Alleged Violations Against Officers"", ""Response to Resistance"", ""Additional Resources""]","[""ISB Annual Reports"", ""Hearing Summary Reports""]","["""", """"]",[],[] -3435,https://www.miami-police.org/contact.html,Contact Info & Agency Meta,200,Contact the Miami Police Department - Miami Police Department,"Contact the Miami Police Department, Address: 400 NW 2nd Avenue, Miami, Florida 33128, Phone: (305) 603-6640",[],[],[],[],[],[] -3436,https://city.milwaukee.gov/ImageLibrary/Groups/mpdAuthors/SOP/460-USEOFFORCE.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3437,https://data.milwaukee.gov/dataset/fpc-citizen-complaints,Complaints & Misconduct,200,Citizen Complaints Against Police and Fire Departments - Dataset - City of Milwaukee Open Data Portal ,"","[""\nMilwaukee Open Data\n"", ""Citizen Complaints Against Police and Fire Departments"", ""Fire and Police Commission\n \n "", ""\n \n Citizen Complaints Against Police and Fire Departments\n \n \n \n ""]","["" Organization"", "" Social"", "" License"", ""Data and Resources""]","[""Additional Info""]",[],[],[] -3438,https://www.montgomerycountymd.gov/pol/contact.html,Contact Info & Agency Meta,200," - Contact Us page, Department of Police,Montgomery County, MD -","",[],"[""Contact us""]","[""How to Report a Crime or Incident"", ""Police Districts"", ""Frequently Used Numbers""]","[""POLICE CONTACTS"", ""FOR CRIME SOLVERS"", ""DISTRICTS"", ""RESOURCES"", ""FOLLOW US"", ""STAY INFORMED""]",[],[] -3439,https://opendata.minneapolismn.gov/datasets/police-incidents-2021/explore  ,Crime Maps & Reports,200,Police Incidents 2021,Police Incidents for 2021,[],[],[],[],[],[] -3440,https://www.montgomerycountymd.gov/pol/data/iad-reports.html,Complaints & Misconduct,200," - IAD reports page, MCPD, Montgomery County,MD -","",[],"[""Internal Affairs Division Reports""]",[],"[""POLICE CONTACTS"", ""FOR CRIME SOLVERS"", ""DISTRICTS"", ""RESOURCES"", ""FOLLOW US"", ""STAY INFORMED""]",[],[] -3441,https://gis-mdc.opendata.arcgis.com/search?collection=Dataset,List of Data Sources,200,Open Data Hub Site,"Open Data Hub Site from Miami-Dade County, Florida",[],[],[],[],[],[] -3442,https://opendata.minneapolismn.gov/datasets/police-officer-involved-shootings/explore ,Officer Involved Shootings,200,Police Officer Involved Shootings,Officer Involved Shooting Data for the Minneapolis Police Department,[],[],[],[],[],[] -3443,https://www.montgomerycountymd.gov/POL/resource/Directives/100.html,Policies & Contracts,200," - Directives -100 - Police Operations, Montgomery County Police, Montgomery County, MD -","Police Operations,Neck Restraint, Use of Force","[""100 - Police Operations""]",[],[],"[""POLICE CONTACTS"", ""FOR CRIME SOLVERS"", ""DISTRICTS"", ""RESOURCES"", ""FOLLOW US"", ""STAY INFORMED""]",[],[] -3444,https://data.mesaaz.gov/Police/Police-Computer-Aided-Dispatch-Events/ex94-c5ad,Calls for Service,200,Police Dispatch Events 2017-2020 | Mesa Data Hub,"","[""""]","[""Menu""]",[],[],[],[] -3445,https://opendata.minneapolismn.gov/datasets/police-incidents-2021/explore,Crime Statistics,200,Police Incidents 2021,Police Incidents for 2021,[],[],[],[],[],[] -3446,https://mesaaz.maps.arcgis.com/apps/dashboards/c38c8c61b10d40fdaaabab2b4f10c984,Use of Force Reports,200,ArcGIS Dashboards,ArcGIS Dashboards,[],[],[],[],[],[] -3447,https://data.mesaaz.gov/,List of Data Sources,200,Data Portal | Mesa Data Hub,"",[],"[""Menu""]",[],[],[],[] -3448,https://www.montgomerycountymd.gov/pol/crime-data.html,Crime Maps & Reports,200," - Public Safety Data Page, Montgomery County Police Department , Montgomery County, MD -","",[],"[""Public Safety Data""]","[""Annual Reports"", ""Monthly Hate/Bias Summaries"", ""Weekly Crime Summary Reports"", ""Sex Offender Registry\u00a0"", ""Extreme Risk Protection Order (ERPO) Information"", ""Other Reports"", ""Crime Incident Map""]","[""POLICE CONTACTS"", ""FOR CRIME SOLVERS"", ""DISTRICTS"", ""RESOURCES"", ""FOLLOW US"", ""STAY INFORMED""]",[],[] -3449,https://reimagine.memphistn.gov/isb-dashboard/response-to-resistance/,Use of Force Reports,200,Response to Resistance - Reimagine Policing in Memphis,"","[""Response to Resistance""]","[""Response to Resistance"", ""How Do We Compare to Other Agencies?\u00a0\u00a0""]","[""What Does This Report Show?\u00a0\u00a0"", ""Response to Resistance (all incidents)\u00a0\u00a0"", ""Response to Resistance (fatal shootings)\u00a0""]",[],[],[] -3450,https://www.miami-police.org/SOPs/MPD%20SOPs%20-%20BookMarks%20-%20Copy/2%20ADM/5%20TRAINING/Training%20and%20Personnel%20Development%20Section.pdf,Policies & Contracts,404,"","",,,,,, -3451,https://www.minneapolismn.gov/government/government-data/datasource/office-of-police-conduct-review-dashboard/,Complaints & Misconduct,200,Office of Police Conduct Review Data Portal - City of Minneapolis,You can use this dashboard to track police misconduct claims and cases.,"[""Office of Police Conduct Review data dashboard"", ""Need help? We're here for you.""]","[""Police conduct review dashboard"", ""How to use the dashboard"", ""Contact us""]","[""\n Request accessible format\r\n "", ""Search the data"", ""Read the Data"", ""Office of Police Conduct Review""]",[],[],[] -3452,https://www.mesaazpolice.gov/home/showpublisheddocument/44518/637805421431100000,Officer Involved Shootings,404,"","",,,,,, -3453,https://www.montgomerycountymd.gov/pol/data/weekly-crime-summaries.html,Crime Statistics,200," - Weekly Crime Summaries page, Montgomery County Police Department, Montgomery County, MD -","",[],"[""Weekly Crime Summaries""]","[""2023-2024 Weekly Crime Summaries"", ""\u00a0""]","[""January"", ""February"", ""March"", ""April"", ""May"", ""June"", ""July"", ""August"", ""September"", ""October"", ""November"", ""December"", ""POLICE CONTACTS"", ""FOR CRIME SOLVERS"", ""DISTRICTS"", ""RESOURCES"", ""FOLLOW US"", ""STAY INFORMED""]",[],[] -3454,https://city.milwaukee.gov/Directory/police/Crime-Maps-and-Statistics.htm#.Xt6WOzpKhPY,Crime Maps & Reports,200,Crime Maps & Statistics,"","[""Milwaukee Police Department\r\n""]","[""Crime Maps & Statistics\r\n"", ""Search Warrant Statistics""]",[],"["""", ""Welcome to the City of Milwaukee"", ""\n"", ""Residents\r\n"", """", ""Open for Business"", """", ""News & Events"", """", ""Refine Search"", ""\u00a0"", ""Menu"", ""\u00a0CALL for Action: 414-286-CITY"", ""\u00a0CLICK for Action""]","[""Mayor's Office"", ""City of Milwaukee"", ""Common Council""]","[""Established in 1846, the City of Milwakee is home to nearly 600,000 residents and is a city built on water with over 10 miles of lakefront shoreline. With three rivers and a Great Lake, water plays a key role in the city\u2019s history, identity, and economy.\nAbout Us |\u00a0Choose Milwaukee\u00a0| Contact Us""]" -3455,https://www.miamigov.com/My-Government/Departments/Civilian-Investigative-Panel-CIP,Complaints & Misconduct,200,Civilian Investigative Panel (CIP) - Miami,The Civilian Investigative Panel (CIP) provides for independent and impartial citizens’ oversight of the Miami Police Department.,"[""Civilian Investigative Panel (CIP)"", ""Top Services"", ""Process""]","[""File a Complaint Against a Miami Police Officer"", ""Join the Community-Police Mediation Program"", ""Department Head"", ""What We Do"", ""Staff"", ""Panel Members"", ""Investigations"", ""Community-Police Mediation Program"", ""Reports and Data"", ""Contact Us"", ""\r\n\t\t\tMeetings & Agendas\r\n\t\t"", ""\r\n\t\t\tFiling a Complaint\r\n\t\t"", ""\r\n\t\t\tApply to be a Member\r\n\t\t""]","[""Message from City Manager Art Noriega V"", ""\nRodney Jacobs\n"", ""Filing a Complaint"", ""Phone"", ""Email"", ""Location"", ""Contact Us"", ""Share & Connect"", ""Visit Other Miami Sites"", ""Digital Cities""]",[],[],[] -3456,https://opendata.minneapolismn.gov/,List of Data Sources,200,Open Minneapolis,Open Minneapolis,[],[],[],[],[],[] -3457,https://www.minneapolismn.gov/government/departments/police/#contacts-88640,Contact Info & Agency Meta,200,Police - City of Minneapolis,We in the Minneapolis Police Department gain our authority from the community. We recognize that public safety is not just the absence of crime but the presence of justice.,"[""Police Department"", ""Need help? We're here for you.""]","[""2023 Minneapolis Police year in review"", ""I want to"", ""Explore this section"", ""Staff and volunteers"", ""Bureaus"", ""Related programs and initiatives"", ""Stay Informed"", ""Related links"", ""Access to police services"", ""Report an issue"", ""Contact us""]","[""\r\n Read and give feedback on police policies\r\n "", ""\r\n File an online police report\r\n "", ""\r\n Apply for a police job\r\n "", ""\r\n Read about contract negotiations\r\n "", ""Minneapolis police precincts"", ""Police auctions"", ""Reclaim property"", ""Gun permits"", ""Policy and Procedure Manual"", ""Oath of Office"", ""Police chief and administration"", ""Crime prevention specialists"", ""Chaplains"", ""Police Reserve"", ""Investigations"", ""Patrol"", ""Professional Standards"", ""National Night Out"", ""Police Explorers"", ""U and T visa"", ""Women's Leadership Academy"", ""View data and reports"", ""File online"", ""View resources"", ""Minneapolis Police Department"", ""Connect with the Minneapolis Police Department""]",[],[],[] -3458,https://memphispolice.org/MPD-Policy-and-Procedures-Manual-Revised-1-2020.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3459,https://data.memphistn.gov/,List of Data Sources,200,Memphis Data Hub,"",[],"[""Menu""]",[],[],[],[] -3460,https://city.milwaukee.gov/police/About-MPD/Code-of-Conduct,Policies & Contracts,200,Code of Conduct & Standard Operating Procedures,"","[""Milwaukee Police Department""]","[""Code of Conduct""]",[],"["""", ""Welcome to the City of Milwaukee"", ""\n"", ""Residents\r\n"", """", ""Open for Business"", """", ""News & Events"", """", ""Refine Search"", ""Keywords"", ""\n BOARD-UP SERVICES - 540\n"", ""\n CIVIL LITIGATION - 890\n"", ""\n LICENSED PERSON / PREMISE INVESTIGATIONS - 390\n"", ""\n MISSING PERSONS - 180\n"", ""\n RECORDS MANAGEMENT - 263\n"", ""\nABSENCE - 010\n"", ""\nADMINISTRATION OF NALOXONE - 175\n"", ""\nALARMS - 280\n"", ""\nANIMALS - 060\n"", ""\nARREST AUTHORITY - 220\n"", ""\u00a0"", ""Menu"", ""\u00a0CALL for Action: 414-286-CITY"", ""\u00a0CLICK for Action""]","[""Mayor's Office"", ""City of Milwaukee"", ""Common Council""]","[""Established in 1846, the City of Milwakee is home to nearly 600,000 residents and is a city built on water with over 10 miles of lakefront shoreline. With three rivers and a Great Lake, water plays a key role in the city\u2019s history, identity, and economy.\nAbout Us |\u00a0Choose Milwaukee\u00a0| Contact Us""]" -3461,https://public.powerdms.com/MESAPD/tree/documents/2234408,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -3462,https://reimagine.memphistn.gov/isb-dashboard/response-to-resistance/,Officer Involved Shootings,200,Response to Resistance - Reimagine Policing in Memphis,"","[""Response to Resistance""]","[""Response to Resistance"", ""How Do We Compare to Other Agencies?\u00a0\u00a0""]","[""What Does This Report Show?\u00a0\u00a0"", ""Response to Resistance (all incidents)\u00a0\u00a0"", ""Response to Resistance (fatal shootings)\u00a0""]",[],[],[] -3463,https://www.memphistn.gov/government/police-department/,Contact Info & Agency Meta,404,"","",,,,,, -3464,https://www.miami-police.org/annual_reports.html,Arrest Records,200,Annual Reports - Miami Police Department,Miami Police Department Annual Reports,[],[],[],[],[],[] -3465,https://reimagine.memphistn.gov/wp-content/uploads/sites/70/2020/06/Memphis-Police-Department-Policy-and-Procedure-2020.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3466,https://www2.minneapolismn.gov/government/departments/civil-rights/opcr/case-information/  ,Complaints & Misconduct,404,"","",,,,,, -3467,https://joinmpd.com/the-police-academy/,Policies & Contracts,404,"","",,,,,, -3468,https://data.milwaukee.gov/dataset/callcenterdatacurrent/resource/bf2b508a-5bfa-49da-8846-d87ffeee020a,Calls for Service,200,Call Center Data (Current) - CSV - City of Milwaukee Open Data Portal ,"","[""\nMilwaukee Open Data\n"", ""CSV""]","["" Resources"", "" Social"", ""Data Dictionary"", ""Additional Information""]","[""Dataset description:"", ""Embed resource view""]",[],[],[] -3469,https://opendata.minneapolismn.gov/datasets/police-use-of-force/explore ,Use of Force Reports,200,Police Use of Force,Police Use of Force Stats,[],[],[],[],[],[] -3470,https://city.milwaukee.gov/police/Contact-MPD,Contact Info & Agency Meta,200,Contact MPD,"","[""Contact MPD""]","[""District 1 Station"", ""District 2 Station"", ""District 3 Station"", ""District 4 Station"", ""District 5 Station"", ""District 6 Station"", ""District 7 Station""]","[""Police Administration""]","["""", ""Welcome to the City of Milwaukee"", ""\n"", ""Residents\r\n"", """", ""Open for Business"", """", ""News & Events"", """", ""Refine Search"", ""\u00a0"", ""Menu"", ""\u00a0CALL for Action: 414-286-CITY"", ""\u00a0CLICK for Action""]","[""Mayor's Office"", ""City of Milwaukee"", ""Common Council""]","[""Established in 1846, the City of Milwakee is home to nearly 600,000 residents and is a city built on water with over 10 miles of lakefront shoreline. With three rivers and a Great Lake, water plays a key role in the city\u2019s history, identity, and economy.\nAbout Us |\u00a0Choose Milwaukee\u00a0| Contact Us""]" -3471,https://www.nashville.gov/departments/police/data-dashboard/ucr-incidents-map,Crime Maps & Reports,200,Police Data Dashboard: Uniform Crime Reporting Incidents Map | Nashville.gov,Official website of the Metropolitan Government of Nashville and Davidson County.,"[""Police Data Dashboard: Uniform Crime Reporting Incidents Map\n""]","[""Breadcrumb"", ""Related Tags"", ""\n Mobile Apps\n "", ""Nashville.gov"", ""Quick Links"", ""Contact"", ""Connect""]",[],[],[],[] -3472,https://data.nashville.gov/Police/Metro-Nashville-Police-Department-Incidents/2u6v-ujjs,Crime Statistics,200,Metro Nashville Police Department Incidents | Nashville Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -3473,https://city.milwaukee.gov/ImageLibrary/Groups/mpdAuthors/SOP/270-FIELDTRAININGANDEVALUATIONPROGRAM.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3474,https://data.montgomerycountymd.gov/Public-Safety/Daily-Arrests/xhwt-7h2h,Arrest Records,200,Daily Arrests | Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -3475,https://public.powerdms.com/MESAPD/tree/documents/266424,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -3476,https://www.montgomerycountymd.gov/pol/data/use-of-force-report.html,Use of Force Reports,200," - Use of force report page, MCPD, Montgomery County, MD -","",[],"[""Use of Force Reports""]",[],"[""POLICE CONTACTS"", ""FOR CRIME SOLVERS"", ""DISTRICTS"", ""RESOURCES"", ""FOLLOW US"", ""STAY INFORMED""]",[],[] -3477,https://www.nashville.gov/departments/police,Contact Info & Agency Meta,200,Metropolitan Nashville Police Department | Nashville.gov,Official website of the Metropolitan Government of Nashville and Davidson County.,"["" \n\n Metropolitan Nashville Police Department\n \n\n""]","[""Breadcrumb"", ""\n Services\n "", ""Contact"", ""\n Featured News\n "", ""\n Police Events\n "", ""\n Highlighted Information\n "", ""Police Precinct Lookup"", ""\n Quick Links\n "", ""\n I Want To...\n "", ""\n Report Information to Police\n "", ""\n Mobile Apps\n "", ""Nashville.gov"", ""Quick Links"", ""Contact"", ""Connect""]","[""\n We're Hiring!\n "", ""Helpful Information"", ""Domestic Violence Division"", ""In Memoriam"", ""Enter your address"", ""Results""]",[],[],[] -3478,https://www.miami-police.org/DeptOrders/MPD_Departmental_Orders.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3479,https://www1.nyc.gov/site/nypd/bureaus/administrative/training.page,Policies & Contracts,200,Training - NYPD,"","[""Training""]","[""New York's Finest"", ""NYPD Police Academy"", ""Other Training Sections"", """"]",[],[],[],[] -3480,https://nola.gov/getattachment/NOPD/Policies/Chapter-12-1-Department-Operations-Manual-EFFECTIVE-1-14-18.pdf/,Policies & Contracts,200,"","",[],[],[],[],[],[] -3481,https://www.oaklandca.gov/departments/police#page-contact ,Contact Info & Agency Meta,200,City of Oakland | Police,"The official website of the City of Oakland. Find out about meetings, request City services through OAK 311, or contact the Mayor and City Council.","[""Police""]","[""News"", ""Services"", ""Resources"", ""Topics"", ""Leadership"", ""Darren Allison"", ""Contact Us""]","[""Search oaklandca.gov"", ""Popular on oaklandca.gov"", ""\nArrest Made in the Kevin Nishita Case\n"", ""\nOPD Needs Help Locating Vehicle in Connection to Fatal Hit-and-Run\n"", ""\nIn Loving Memory of Officer Tuan Le\n"", ""Address"", ""Phone Numbers""]",[],"[""Your Government"", ""How can we help?"", ""Sign up for updates""]",[] -3482,https://www1.nyc.gov/site/nypd/stats/reports-analysis/firearms-discharge.page,Officer Involved Shootings,200,Use of Force/Firearms Discharge Data Tables - NYPD,Annual Use of Force/Firearms Discharge Report Data Tables,"[""Annual Use of Force/Firearms Discharge Report Data Tables""]","[""New York's Finest"", ""Annual Report Data Tables"", ""Excessive Use of Force Report"", """"]","[""2022"", ""2021"", ""2020"", ""2019"", ""2018"", ""2017"", ""2016"", ""2015"", ""2011-2014""]",[],[],[] -3483,https://www.newarkpdmonitor.com/wp-content/uploads/2019/04/Use-of-Force-Policy.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3484,https://npd.newarkpublicsafety.org/statistics/transparency,Use of Force Reports,404,"","",,,,,, -3485,https://data.nola.gov/Public-Safety-and-Preparedness/NOPD-Misconduct-Complaints/gz2m-ef5u,Complaints & Misconduct,200,NOPD Misconduct Complaints | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -3486,http://gisapps1.mapoakland.com/callsforservice/ ,Calls for Service,404,"","",,,,,, -3487,https://www.nola.gov/nopd/contact-us/,Contact Info & Agency Meta,200," - NOPD - Contact Us - City of New Orleans -","","[""The City of New Orleans"", ""Contact Us\r\n\r\n\r\n\r\n""]","[""Mayor LaToya Cantrell"", ""General Inquiries"", ""Contact NOPD Districts"", ""Contact NOPD Specialized Units"", ""Call NOLA 311 for Quality of Life concerns"", ""Monthly District Meetings"", ""Where Y'At""]","[""Services & Information"", ""Departments"", ""Government"", ""NOLA 311"", ""News"", ""Event Calendar"", ""Data, Maps & Apps"", ""Translate""]","[""Code Enforcement & Blight"", ""Doing Business with the City"", ""Jobs"", ""Ordinances & Regulations"", ""Parking"", ""Permits & Licenses"", ""Public Records"", ""Public Safety"", ""Report a Problem"", ""Requests to the Mayor and Office"", ""Streets, Catch Basins, Streetlights, & Sidewalks"", ""Taxes"", ""Tickets and Violations"", ""Traffic & Transportation"", ""Trash & Recycling"", ""City Offices"", ""Parish Offices"", ""Boards and Commissions"", ""Request service and information"", ""NOPD Makes Arrests in Four Burglaries Including A.P.E. Burglary"", ""NOPD Seeking to Identify Suspect in Simple Burglary"", ""NOPD Seeking Suspect in Aggravated Assault Investigation"", ""NOPD Investigating Homicide in Fifth District"", ""City of New Orleans to Activate Citywide Freeze Plan from Jan. 19 through Jan. 22"", ""NOPD Arrests Suspect in Homicide Investigation"", ""City of New Orleans Announces Lincoln Beach Redevelopment Master Planning Meeting on Tuesday, Jan. 23"", ""City of New Orleans Reminds Jackson Square Artists of Permit Deadline"", ""NOPD Arrests Suspect in Two Homicide Investigations"", ""Open Data"", ""Dashboards"", ""Maps & GIS"", ""Websites & Apps""]","[""! Due to scheduled maintenance, our websites may be unavailable Tuesday, Jan. 23, from 6 p.m. - 10 p.m.."", ""Search and Find Permits"", ""Brake & Bike Tags"", ""Contractor Info For Residents"", ""Permits & Licenses"", ""Permitting Help & Support""]",[] -3488,https://www.oaklandca.gov/topics/use-of-force-definitions-and-policies ,Policies & Contracts,404,"","",,,,,, -3489,https://data.nola.gov/Public-Safety-and-Preparedness/Stop-and-Search-Field-Interviews-/kitu-f4uy,Stops,200,Stop and Search (Field Interviews) | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -3490,https://www.oaklandca.gov/departments/community-police-review-agency,Complaints & Misconduct,200,City of Oakland | Community Police Review Agency,"The official website of the City of Oakland. Find out about meetings, request City services through OAK 311, or contact the Mayor and City Council.","[""Community Police Review Agency""]","[""File a Complaint"", ""CPRA Data"", ""News"", ""Documents"", ""Leadership"", ""Mac Muir"", ""Contact Us""]","[""Search oaklandca.gov"", ""Popular on oaklandca.gov"", ""\nNew App Allows Oakland Community to File Complaints Against Oakland Police\n"", ""\nOakland Residents Encouraged to Apply for Police Commission\n"", ""\nOakland Police Commission Announces First-in-the-Nation Policy on Armed Unresponsive Persons\n"", ""Address"", ""Phone Numbers"", ""Email Address"", ""Open Hours""]","[""Hours of Operation""]","[""Your Government"", ""How can we help?"", ""Sign up for updates""]",[] -3491,https://data.ci.newark.nj.us/,List of Data Sources,200,Welcome - Newark Open Data,"","[""Newark Open Data""]","[""\n\n Groups\n \n"", ""\n\n Showcases\n \n"", ""Popular Datasets"", ""New and Recent Datasets""]","[""Search data"", ""Popular tags"", ""City of Newark Annual Financial Report"", ""NJ/NY PATH Ridership Visualization"", ""Newark 4311 Dashboard"", ""Newark Building Footprints Visualization"", ""\nAbandoned Properties\n"", ""\nNewark Tax Maps\n"", ""\nWards\n"", ""\nZoning\n"", ""\nCode Enforcement\n"", ""\nSnow Plow Tracks\n"", ""\nAbandoned Properties\n"", ""\nNewark Data Dashboard\n"", ""\nNewark 4311\n"", ""\nParcels\n""]",[],[],[] -3492,https://www1.nyc.gov/site/nypd/bureaus/patrol/precincts-landing.page,Contact Info & Agency Meta,200,Precincts - NYPD,"","[""Precincts""]","[""New York's Finest"", """"]",[],[],[],[] -3493,https://npd.newarkpublicsafety.org/commandstaff,Contact Info & Agency Meta,404,"","",,,,,, -3494,https://app.powerbigov.us/view?r=eyJrIjoiMzZkODc3OWYtOWY2Yy00MWZkLTg4YjEtOGZkNTRjNjYzM2Q2IiwidCI6Ijk4OWEyMTgwLTZmYmMtNDdmMS04MDMyLTFhOWVlOTY5YzU4ZCJ9&pageName=ReportSection0c973751e9159c87efbb,Arrest Records,200,Microsoft Power BI,"",[],[],[],[],[],[] -3495,https://data.cityofnewyork.us/Public-Safety/NYPD-Arrest-Data-Year-to-Date-/uip8-fykc,Arrest Records,200,NYPD Arrest Data (Year to Date) | NYC Open Data,"","[""""]","[""Menu""]",[],[],[],[] -3496,https://d2f1dfnoetc03v.cloudfront.net/Files/2021/12/ThomasBreen/6.01-Use-of-Force-2021-Final-version.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3497,https://opendata.cityofnewyork.us/data/,List of Data Sources,200,NYC Open Data - Data,NYC Open Data helps New Yorkers use and learn about City data,"[""Data""]","[""New Datasets"", ""Popular Datasets"", ""Datasets by Category"", ""Datasets by Agency""]",[],[],"[""You are leaving the City of New York\u2019s website.""]",[] -3498,https://npd.newarkpublicsafety.org/assets/docs/crimestats/cw/20211114.pdf,Crime Statistics,404,"","",,,,,, -3499,https://filetransfer.nashville.gov/portals/0/sitecontent/Police/docs/Strategic%20Development/MNPDManual.pdf,Policies & Contracts,404,"","",,,,,, -3500,https://www.newhavenct.gov/gov/depts/nhpd/division/internal_affairs/general_orders.htm,Policies & Contracts,200," - - New Haven, CT | Home - -","New Haven, CT, Yale University, Things to do in New Haven, Restaurants in New Haven, New Haven attractions, Events in New Haven, New Haven nightlife, Wooster Square, Yale New Haven Hospital, East Rock Park, New Haven pizza, New Haven museums, Shopping in New Haven, New Haven history, New Haven parks, New Haven neighborhoods, Arts and Schools","[""New Haven, CT""]","[""City of New Haven"", ""Long Wharf Park Plan"", ""Solar for All"", ""New HVN & Avelo Airlines"", ""Together New Haven"", ""The American Rescue Plan"", ""City of New Haven - Municity"", ""Report a Problem: Build a Stronger Community"", ""Boathouse at Canal Dock"", ""Visit one of our Parks"", ""Union Station (NHV)"", ""News"", ""Calendar"", ""\nJanuary 2024\n"", ""\nJan 2024\n"", ""Stay Up To Date With The Latest News""]","[""I\u2019d Like To\u2026"", ""Pay..."", ""Parking Ticket""]",[],[],[] -3501,https://www.pdcn.org/,Contact Info & Agency Meta,200,"Nassau County Police, NY | Official Website","","[""\n\n""]",[],"[""Loading"", """", """"]","[""\nBurglary - Westbury "", ""\nTraffic Advisory - Elmont *UPDATE* "", ""\nHomicide - Hempstead *UPDATE* ""]",[],[] -3502,https://npd.newarkpublicsafety.org/assets/docs/rules/npd_rules_regulations_2010.pdf,Policies & Contracts,404,"","",,,,,, -3503,https://data.nola.gov/Public-Safety-and-Preparedness/Electronic-Police-Report-2021/6pqh-bfxa,Crime Statistics,200,Electronic Police Report 2021 | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -3504,https://data.cityofnewyork.us/Public-Safety/NYPD-Calls-for-Service-Year-to-Date-/n2zq-pubd,Calls for Service,200,NYPD Calls for Service (Year to Date) | NYC Open Data,"","[""""]","[""Menu""]",[],[],[],[] -3505,https://www1.nyc.gov/site/nypd/stats/crime-statistics/compstat.page,Crime Maps & Reports,200,Crime Stats - COMPStat - NYPD,CompStat 2.0 link,"[""CompStat 2.0""]","[""New York's Finest""]",[],[],[],[] -3506,https://www.newhavenct.gov/government/departments-divisions/new-haven-police-department/divisions/nhpd-internal-affairs,Complaints & Misconduct,404,"","",,,,,, -3507,https://data.oaklandca.gov/,List of Data Sources,200,"City of Oakland Open Data Portal | Open Data Portal -","","[""Welcome to the City of Oakland\u2019s Open Data Platform""]","[""Menu"", ""CrimeWatch Maps Past 90-Days"", ""Oakland Call Center Service Request Data"", ""\u201cShow me the money\u201d Campaign Finance app"", ""Reimagining Public Safety"", ""Finance"", ""Education"", ""Infrastructure"", ""Environment"", ""City Government"", ""Property"", ""Public Safety"", ""Social Services"", ""Economic Development"", ""Oakland Data""]",[],[],[],[] -3508,https://www1.nyc.gov/site/ccrb/policy/MOS-records.page,Complaints & Misconduct,200,mos-history,"","[""NYPD Member of Service Histories""]","[""Search CCRB NYPD Member of Service Histories"", """"]","[""""]",[],[],[] -3509,https://nolaipm.gov/annual-reports/,Complaints & Misconduct,200,Annual Reports – New Orleans Independent Police Monitor,"","[""Annual Reports""]","[""We are here to assist"", ""We Will Keep You Informed Every Step Of The Way""]",[],"[""we are good at what we do"", ""Navigation"", ""Join Our Movement""]",[],[] -3510,https://www.okc.gov/departments/police/crime-prevention-data/crime-stats,Crime Maps & Reports,200," - - Crime Map | City of OKC - -","","[""City of OKC"", ""Crime Map""]","[""Menu"", ""LexisNexis Crime Map \r\n(external site, set the date range to the month prior)""]","[""Chrome"", ""Internet Explorer"", ""Firefox"", ""Internet Explorer"", ""Safari""]",[],[],[] -3511,https://www.oaklandca.gov/resources/oakland-police-department-opd-policies-1 ,Policies & Contracts,404,"","",,,,,, -3512,https://www.newhavenct.gov/government/departments-divisions/new-haven-police-department/divisions/nhpd-internal-affairs,Use of Force Reports,404,"","",,,,,, -3513,https://www.oaklandca.gov/resources/stop-data  ,Stops,404,"","",,,,,, -3514,https://www.okc.gov/home/showpublisheddocument/25327/637703385883370000,Use of Force Reports,200,"","",[],[],[],[],[],[] -3515,https://www.newhavenct.gov/gov/depts/nhpd/,Contact Info & Agency Meta,404,"","",,,,,, -3516,https://www.justice.gov/sites/default/files/crt/legacy/2011/03/17/nopd_report.pdf,Complaints & Misconduct,200,"","",[],[],[],[],[],[] -3517,https://www.okc.gov/departments/police/crime-prevention-data/jail-blotter,Arrest Records,200," - - Jail Blotter | City of OKC - -","","[""City of OKC"", ""Jail Blotter""]","[""Menu""]","[""Chrome"", ""Internet Explorer"", ""Firefox"", ""Internet Explorer"", ""Safari""]",[],[],[] -3518,https://nola.gov/getattachment/NOPD/Policies/Chapter-33-1-Training-and-Career-Development-EFECTIVE-6-18-17.pdf/,Policies & Contracts,200,"","",[],[],[],[],[],[] -3519,https://www.okc.gov/home/showpublisheddocument/25327/637703385883370000,Officer Involved Shootings,200,"","",[],[],[],[],[],[] -3520,https://www.nysda.org/page/LawEnforcementDisciplinaryRecords,Complaints & Misconduct,403,"","",,,,,, -3521,https://www1.nyc.gov/assets/nypd/downloads/pdf/use-of-force/use-of-force-2019-2020-11-03.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3522,https://www.newhavenct.gov/government/departments-divisions/new-haven-police-department/compstat-reports,Crime Statistics,200," - - CompStat Reports | New Haven, CT - -","","[""New Haven, CT"", ""CompStat Reports""]","[""Explore this page..."", ""Stay Up To Date With The Latest News""]","[""I\u2019d Like To\u2026"", ""Pay..."", ""Parking Ticket""]",[],[],[] -3523,http://npd.newarkpublicsafety.org/statistics/arrestdata,Arrest Records,404,"","",,,,,, -3524,https://nola.gov/getattachment/NOPD/Policies/Chapter-1-3-Use-of-Force-EFFECTIVE-4-01-18.pdf/,Policies & Contracts,404,"","",,,,,, -3525,https://npd.newarkpublicsafety.org/statistics/transparency,Complaints & Misconduct,404,"","",,,,,, -3526,https://opennassau.nassaucountyny.gov/,List of Data Sources,200,Open Nassau,"",[],"[""Menu""]",[],[],[],[] -3527,https://www.okc.gov/home/showpublisheddocument/25327/637703385883370000,Complaints & Misconduct,200,"","",[],[],[],[],[],[] -3528,https://data.nashville.gov/,List of Data Sources,200,Nashville | Open Data | Nashville Open Data Portal,"","[""Nashville Open Data Portal""]","[""Menu"", ""Business, Development & Housing"", ""Culture"", ""Education"", ""Environment"", ""Health"", ""Metro Government"", ""Public Safety"", ""Transportation"", ""Traffic Accidents"", ""hubNashville Requests"", ""Election Results"", ""Building Permits""]",[],[],[],[] -3529,https://data.ok.gov/,List of Data Sources,200,Welcome - Oklahoma's Open Data,"","[""Oklahoma's Open Data""]","[""\n\n Groups\n \n"", ""\n\n Showcases\n \n"", ""Popular Datasets"", ""New and Recent Datasets""]","[""Search data"", ""Popular tags"", ""2018 Financial Summary"", ""State Revenue"", ""CARES Act"", ""Vendor Transactions"", ""It\u2019s Payday in Oklahoma"", ""State Travel Expenditures"", ""Capitol Restoration Project"", ""Comprehensive Annual Financial Report"", ""Purchase Card Transactions"", ""How to Use"", ""Medical Cannabis Revenue"", ""Oklahoma Real Property Asset Report"", ""Oklahoma Public Records Laws"", ""\nState of Oklahoma Payroll - Fiscal Year 2023\n"", ""\nState of Oklahoma Payroll - Fiscal Year 2024\n"", ""\nState of Oklahoma Payroll - Fiscal Year 2022\n"", ""\nUsed Motor Vehicle and Parts Commission Dealer License Search\n"", ""\nGeneral Ledger\n"", ""\nGeneral Ledger\n"", ""\nCurrent MET Tower List\n"", ""\nState of Oklahoma Vendor Payments - Fiscal Year 2024\n"", ""\nState of Oklahoma Payroll - Fiscal Year 2024\n"", ""\nPurchase Card (PCard) Fiscal Year 2024\n""]",[],[],"[""STATE AGENCIES"", ""ELECTED OFFICIALS""]" -3530,https://compstat.nypdonline.org/,Crime Statistics,200,NYPD CompStat 2.0,New York Police Department CompStat,[],[],[],[],[],[] -3531,https://drive.google.com/drive/folders/1ysYDc6FYZgpbrBVRyfh6wZgoRYGGU10H,Complaints & Misconduct,200,Cases - Google Drive,"",[],[],[],[],[],[] -3532,https://npd.newarkpublicsafety.org/assets/docs/transparency/202110.pdf,Stops,404,"","",,,,,, -3533,https://data.oaklandca.gov/Public-Safety/CrimeWatch-Maps-Past-90-Days/ym6k-rx7a,Crime Statistics,200,"CrimeWatch Maps Past 90-Days | Open Data Portal -","","[""""]","[""Menu""]",[],[],[],[] -3534,https://www1.nyc.gov/site/nypd/about/about-nypd/manual.page,Policies & Contracts,200,NYPD Department Manual,NYPD Department Manual,"[""Patrol Guide"", ""Administrative Guide""]","[""New York's Finest"", """"]",[],[],[],[] -3535,https://www.oaklandca.gov/topics/use-of-force-uof-levels,Use of Force Reports,200,City of Oakland | Use of Force (UOF) Levels,"The official website of the City of Oakland. Find out about meetings, request City services through OAK 311, or contact the Mayor and City Council.","[""Use of Force (UOF) Levels""]","[""Resources"", ""Topics"", ""About""]","[""Search oaklandca.gov"", ""Popular on oaklandca.gov""]",[],"[""Your Government"", ""How can we help?"", ""Sign up for updates""]",[] -3536,https://data.cityofnewyork.us/Public-Safety/The-Stop-Question-and-Frisk-Data/ftxv-d5ix,Stops,200,"The Stop, Question and Frisk Data | NYC Open Data","","[""""]","[""Menu""]",[],[],[],[] -3537,https://datadriven.nola.gov/open-data/,List of Data Sources,200," - Open Data - DataDriven - City of New Orleans -","","[""DataDriven"", ""Open Data\n""]","[""Fueling the laboratory of innovation and change in New Orleans"", ""Search for data\n\n\n\n Find data\n\nor browse the data.nola.gov catalog\n"", ""Featured datasets"", ""New datasets"", ""Open Data Skills"", ""Analysis and Visualization Skills"", ""Geographic Information Skills"", ""Share your data with us"", ""Have questions? Contact us""]","[""or browse the data.nola.gov catalog"", ""Calls for Service"", ""311 Calls (2012-Present)"", ""Electronic Police Report 2017"", ""Occupational Business Licenses"", ""NOPD Misconduct Complaints"", ""Housing and Urban Development (HUD) Grants"", ""Bike Lanes"", ""Socrata"", ""Power BI"", ""GIS and New Orleans""]",[],[],[] -3538,https://www.nashville.gov/sites/default/files/2021-12/Department-Manual-Use-of-Force-Policy.pdf?ct=1640874735,Policies & Contracts,200,"","",[],[],[],[],[],[] -3539,https://www.crimemapping.com/map/agency/265 ,Crime Maps & Reports,200,"","",[],[],[],[],[],[] -3540,"https://cityprotect.com/map/list/agencies/5ce2bd9e3934cc0011edac8d?toDate=2020-06-10T23:59:59.999Z&fromDate=2020-06-07T00:00:00.000Z&pageSize=2000&parentIncidentTypeIds=149,150,148,8,97,104,165,98,100,179,178,180,101,99,103,163,168,166,12,161,14,16,15&zoomLevel=13&latitude=40.722813032254074&longitude=-74.15492079233789&days=1,2,3,4,5,6,7&startHour=0&endHour=24&timezone=%2B00:00",Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -3541,https://www.okc.gov/departments/police/contact-us,Contact Info & Agency Meta,200," - - Contact Us | City of OKC - -","","[""City of OKC"", ""Contact Us""]","[""Menu"", ""To Commend an Officer"", ""To commend or recognize an officer for his/her actions, send an email by clicking here.\u00a0"", ""To Make a Formal Complaint Against a Police Employee"", ""Divisional/Unit Directory"", ""Emergency "", ""Police Dispatch (if calling from out of town)"", ""Crime Stoppers"", ""Social Media""]","[""Chrome"", ""Internet Explorer"", ""Firefox"", ""Internet Explorer"", ""Safari""]",[],[],[] -3542,https://filetransfer.nashville.gov/portals/0/sitecontent/Police/docs/Administrative%20Svcs/MNPD%20Basic%20Course%20Curriculum.pdf,Policies & Contracts,404,"","",,,,,, -3543,https://data.nola.gov/Public-Safety-and-Preparedness/Calls-for-Service-2021/3pha-hum9,Calls for Service,200,Calls for Service 2021 | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -3544,https://www.okc.gov/departments/police/crime-prevention-data/crime-stats,Crime Statistics,200," - - Crime Map | City of OKC - -","","[""City of OKC"", ""Crime Map""]","[""Menu"", ""LexisNexis Crime Map \r\n(external site, set the date range to the month prior)""]","[""Chrome"", ""Internet Explorer"", ""Firefox"", ""Internet Explorer"", ""Safari""]",[],[],[] -3545,https://www.nassaucountyny.gov/4913/Use-of-Force-Policy,Policies & Contracts,200,"Use of Force Policy | Nassau County, NY - Official Website",Use of Force Policy,"[""\r\n\r\nUse of Force Policy\t\t""]",[],"[""Loading""]",[],[],[] -3546,https://www1.cityoforlando.net/opd/activecalls/activecadpolice.xml,Calls for Service,200,"","",[],[],[],[],[],[] -3547,https://mayors-office.cityofomaha.org/2-uncategorised/235-citizen-complaint-review-board,Complaints & Misconduct,503,"","",,,,,, -3548,https://police.cityofomaha.org/contact-us,Contact Info & Agency Meta,200,Omaha Police Department,"This is the official web site of the Omaha Police Department located in Omaha, Nebraska. ","[""\n\t\t\t\t\t\t\t\tOMAHA POLICE DEPARTMENT\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tOmaha, Nebraska\n"", ""Contact Us""]",[],"[""Mobile Menu"", ""News and Information"", ""Precinct Map"", ""Precinct Locations""]","[""LGBTQ+ Community Liaison"", ""Omaha Police Department"", ""Hours""]",[],[] -3549,https://www.phillypolice.com/accountability/?_ID=110&_ClassName=CapPage#!#complaints,Complaints & Misconduct,200,Accountability | Philadelphia Police Department,"","[""Accountability""]","[""Open and Accountable"", ""Directives"", ""Public Presentations"", ""Complaints Against Police (CAP)""]","[""Accountability"", ""Police Reform Reports"", ""Officer Involved Shootings"", ""Navigation"", ""About""]","[""Overview"", ""Police Reform Reports"", ""Officer Involved Shootings"", ""Directives"", ""Presentations"", ""Complaints Against Police (CAP)"", ""Strategies, Initiatives, and Events"", ""News"", ""Districts"", ""Accountability"", ""Programs & Services"", ""Forms"", ""Crime Maps & Stats"", ""PPD Digital"", ""Careers"", ""Search""]","[""Crime Prevention & Violence Reduction Action Plan""]",[] -3550,https://data.cityoforlando.net/Orlando-Police/OPD-Response-to-Resistance-Data-Lens/46mp-aizb,Use of Force Reports,404,"","",,,,,, -3551,https://www.phillypolice.com/ois/,Officer Involved Shootings,200,Officer Involved Shootings | Philadelphia Police Department,"","[""COMMISSIONER\u2019S MESSAGE""]",[],"[""USE OF FORCE DIRECTIVES"", ""WHAT IS AN OFFICER INVOLVED SHOOTING"", ""INDIVIDUAL SHOOTING SUMMARIES"", ""About""]","[""\n\nWhen is Deadly Force is Used?\n"", ""\n\nWhy We Post Officer Involved Shooting (OIS) Information\n"", ""\n\nWhat You Will Find on this Page\n"", ""\n\nTraining Procedures\n"", ""Directives"", ""CITYWIDE VIOLENT CRIME"", ""Officer Involved Shootings by Year \n\n\n\n\n\n\n""]",[],[] -3552,https://www.phoenixopendata.com/dataset/calls-for-service,Calls for Service,200,Calls for Service - Dataset - City of Phoenix Open Data,"","[""Calls for Service"", ""Police\n \n "", ""\n \n Calls for Service\n \n \n \n ""]","["" Department"", "" Social"", "" License"", ""Data and Resources""]","[""Additional Info""]",[],[],[] -3553,https://www.opendataphilly.org/dataset?q=crime+map&sort=score+desc%2C+metadata_modified+desc,Crime Maps & Reports,404,"","",,,,,, -3554,https://data.cityoforlando.net/Orlando-Police/OPD-Officer-Involved-Shootings/6kz6-6c7n,Officer Involved Shootings,200,OPD Officer-Involved Shootings | City of Orlando Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -3555,https://www.phillypolice.com/assets/directives/D10.3-UseOfLessLethalForce.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3556,https://www.orlando.gov/Our-Government/Departments-Offices/Orlando-Police-Department/Policies-and-Procedures/Police-Operations,Policies & Contracts,200,Police Operations - City of Orlando,"","[""Police Operations""]",[],"[""City Hall Info"", ""Contact Us"", ""Be Social"", ""Footer bottom notices""]",[],[],[] -3557,https://www.phillypolice.com/assets/directives/D6.9-SelectionAndTraining.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3558,https://www.crimemapping.com/map/agency/271,Crime Maps & Reports,200,CrimeMapping.com - Helping You Build a Safer Community,"",[],[],[],[],[],[] -3559,https://www.phillypolice.com/about/contact/,Contact Info & Agency Meta,200,Contact | Philadelphia Police Department,"","[""Contact""]","[""Emergency"", ""Non-Emergency"", ""Commissioner's Office"", ""Police Districts"", ""Search""]","[""About the Department"", ""About""]","[""Mission"", ""Leadership"", ""Partners"", ""Fallen Officers"", ""Contact"", ""Press Inquiries""]",[],[] -3560,https://www.orlando.gov/files/sharedassets/public/documents/opd/policies-and-procedures/police-operations/1128.17-response-to-resistance-and-apprehension-techniques.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3561,https://data.cityoforlando.net/Orlando-Police/OPD-Crimes/4y9m-jbmz,Crime Statistics,200,Orlando PD Citizen Connect,"",[],[],[],[],[],[] -3562,https://data.cityoforlando.net/browse,List of Data Sources,200,Search & Browse | Page 1 of 9 | City of Orlando Open Data Portal,"","[""Tags""]","[""Menu"", ""\n Sort\n "", ""\n Sort by Most Relevant\n \n"", ""\n Filter\n "", ""\nAuthority\n\n"", ""\nCategories\n\n"", ""\nView Types\n\n"", ""\nTags\n\n"", ""\nOrlando City Limits\n"", ""\nPermit Applications\n"", ""\nOPD Officer-Involved Shootings\n"", ""\nBusiness Tax Receipts\n"", ""\nCity Owned Vacant Lots\n"", ""\nPermit Applications for the past 365 days\n"", ""\nNeighborhoods\n"", ""\nBEWES Building Data\n"", ""\nConstruction Value for Permits Issued in the past 30 days\n"", ""\nOrlando Streets\n"", ""A-Z""]",[],[],[],[] -3563,https://www.okc.gov/home/showpublisheddocument/26202/637756747537030000,Policies & Contracts,404,"","",,,,,, -3564,https://public.powerdms.com/OPDEP1/tree,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -3565,https://www.opendataphilly.org/dataset/arrests,Arrest Records,404,"","",,,,,, -3566,https://police.cityofomaha.org/crime-informatioNAnnual-reports,Complaints & Misconduct,404,"","",,,,,, -3567,https://www.orlando.gov/Our-Government/Departments-Offices/Orlando-Police-Department/Policies-and-Procedures/Training,Policies & Contracts,200,Training - City of Orlando,"","[""Training""]",[],"[""City Hall Info"", ""Contact Us"", ""Be Social"", ""Footer bottom notices""]",[],[],[] -3568,https://www.opendataphilly.org/dataset/crime-incidents,Crime Statistics,404,"","",,,,,, -3569,https://www.orlando.gov/Our-Government/Departments-Offices/Orlando-Police-Department,Contact Info & Agency Meta,200,Orlando Police Department - City of Orlando,"OPD is a nationally recognized law enforcement agency that is focused on the safety of our residents, visitors, and businesses. Our job is to protect the citizens of Orlando and we intend to accomplish that mission, even at risk to our own lives.","[""Orlando Police Department""]","[""OPD Services"", ""OPD Initiatives"", ""Department Head"", ""Administrative Services Bureau"", ""Chief\u2019s Staff"", ""Investigative Services Bureau"", ""Media Relations"", ""Patrol Services Bureau"", ""Special Services Bureau"", ""Contact Us"", ""\r\n\t\t\tCustodian of Records\r\n\t\t"", ""\r\n\t\t\tUpcoming Events\r\n\t\t"", ""Orlando Police Department Community Career Fair"", ""\r\n\t\t\tLeadership Contact\r\n\t\t"", ""\r\n\t\t\tCitizen Advisory Boards\r\n\t\t"", ""\r\n\t\t\tFollow OPD on Social Media\r\n\t\t"", ""Related Information""]","[""\r\n\t\t\t\t\tReport a Crime\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tOPD Records & Open Data\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tCompliment an OPD Officer\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tFile a Complaint About an OPD Officer\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tCommunity Engagement\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tOPD Community Newsletter\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tCareers at the Orlando Police Department\r\n\t\t\t\t"", ""\r\n\t\t\t\t\tDomestic Violence\r\n\t\t\t\t"", ""\nEric D. Smith, Orlando Police Chief\n"", ""Phone"", ""Emergency"", ""Location"", ""Hours"", ""City Hall Info"", ""Contact Us"", ""Be Social"", ""Footer bottom notices""]",[],[],[] -3570,https://police.cityofomaha.org/crime-information/incident-data-download,Crime Statistics,200,Omaha Police Department - Incident Data Download,"This is the official web site of the Omaha Police Department located in Omaha, Nebraska. ","[""\n\t\t\t\t\t\t\t\tOMAHA POLICE DEPARTMENT\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tOmaha, Nebraska\n""]","[""\n Incident Data Download ""]","[""Mobile Menu"", ""News and Information"", ""Precinct Locations""]","[""LGBTQ+ Community Liaison""]",[],[] -3571,https://www.phoenixopendata.com/dataset/crime-data,Crime Statistics,200,Crime Data - Dataset - City of Phoenix Open Data,"","[""Crime Data"", ""Police\n \n "", ""\n \n Crime Data\n \n \n \n ""]","["" Department"", "" Social"", "" License"", ""Data and Resources""]","[""Additional Info""]",[],[],[] -3572,https://www.phoenixopendata.com/dataset/officer-involved-shooting-incidents,Officer Involved Shootings,404,"","",,,,,, -3573,https://www.providenceri.gov/pera/,Complaints & Misconduct,200,City of Providence Providence External Review Authority (PERA) - City of Providence,"","[""Providence External Review Authority (PERA)""]","[""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""Reports"", ""SIGN UP FOR OUR WEEKLY E-NEWS | \nHaga clic aqu\u00ed para espa\u00f1ol"", ""Lists*""]",[],[],[] -3574,https://data.cityofsacramento.org/datasets/9efe7653009b448f8d177c1da0cc068f_0/explore?location=38.582000%2C-121.494000%2C11.85,Calls for Service,200,City of Sacramento Open Data,City of Sacramento Open Data Site,[],[],[],[],[],[] -3575,https://portlandor.govqa.us/WEBAPP/_rs/(S(mygsjcixtqgkcvvr2lmmws2j))/BusinessDisplay.aspx?sSessionID=&did=45&cat=0,Policies & Contracts,200,CITY OF PORTLAND REQUEST PUBLIC RECORDS,"",[],"[""2018 State Basic MRT/RRT Training""]","[""Public Records Menu"", ""FAQSee All FAQs""]","[""City of Portland"", ""Site Menu"", ""Access""]",[],[] -3576,https://www.portlandoregon.gov/police/76454,Calls for Service,200,Sign-In Form,"","[""The City of Portland, Oregon"", ""Sign-In""]",[],"[""New to PortlandOregon.gov?""]",[],[],[] -3577,https://tableau.alleghenycounty.us/t/PublicSite/views/CJ_UCR_PGH_8-22-17_v3/Home_1?iframeSizedToWindow=true&:embed=y&:showAppBanner=false&:display_count=no&:showVizHome=no&:origin=viz_share_link,Crime Statistics,200," - Workbook: Crime in the City of Pittsburgh","",[],[],[],[],[],[] -3578,https://www.cityofsacramento.org/Police/Crime,Crime Statistics,200,Police Department | City of Sacramento,Sacramento Police Department,"[""Sacramento Police Department""]","[""About"", ""Your SacPD"", ""Index"", ""Social Media""]","[""Search for content"", ""News and Information"", ""Reporting"", ""Popular Services"", ""More"", ""Call our Non-Emergency Number: 916-808-5471"", ""We're hiring!"", ""Meet the Chief"", ""Uncrewed Aircraft Systems (UAS)"", ""In the News""]",[],[],[] -3579,https://raleighnc.gov/services/safety/internal-affairs-unit,Complaints & Misconduct,200,Internal Affairs Unit | Raleighnc.gov,"","[""Internal Affairs Unit\n""]","[""Main navigation"", ""Secondary"", ""Main navigation"", ""Jump To:"", ""Filing a Complaint"", ""Disposition of Complaint"", ""Request Recordings - BWCs and MVRs"", ""Citizen Complaint Cases Investigated by RPD"", ""How to Compliment an Employee"", ""Share"", ""Contact"", ""Subscribe"", ""City of Raleigh/s social media accounts"", ""Select Language""]",[],[],[],[] -3580,https://data.providenceri.gov/,List of Data Sources,200,Open Data | City of Providence | Open Data | City of Providence,"",[],"[""Menu""]",[],[],[],[] -3581,phoenix.gov/police/contact-police,Contact Info & Agency Meta,200," - - Police - - - Contact Police - - -","","[""\r\n \r\n \r\n Contact Police\r\n \r\n ""]","["""", """", """", ""Email"", "" \r\n Phone"", "" \r\n Silent Witness"", "" \r\n Mailing Address\u00a0"", """"]",[],[],"[""\u200bShare this page\u200b""]",[] -3582,http://www.portlandmaine.gov/DocumentCenter/View/31084/Use-of-Force-Review-Report-2020,Use of Force Reports,404,"","",,,,,, -3583,"https://communitycrimemap.com/?address=Sacramento,CA&crimeTypes=%5B1,2,4,6,7,8,10,11,12,14,15,16,17,18%5D&startDate=7&endDate=0",Crime Maps & Reports,200,LexisNexis® Community Crime Map,"",[],[],[],[],[],[] -3584,https://www.providenceri.gov/police-department/,Contact Info & Agency Meta,200,City of Providence Police Department - City of Providence,"",[],"[""Contact Us"", ""Pay Tickets, Forms, Inspections, Etc"", ""Reports, Policies & Procedures, Etc."", ""More"", ""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""Providence PD \u2013 NPD LPR Study"", ""featured news"", ""other news"", ""SIGN UP FOR OUR WEEKLY E-NEWS | \r\nHaga clic aqu\u00ed para espa\u00f1ol"", ""Lists*""]",[],[],[] -3585,https://www.portlandoregon.gov/police/65520,Stops,200,Stops Data Collection Reports | Portland.gov,The Portland Police Bureau’s goal is to be a leader in the collection and analysis of traffic and pedestrian stops data and to continually improve the quality of the processes involved in both collecting and analyzing the data.,"[""Stops Data Collection Reports\n""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Quarterly Reports"", ""Annual Reports"", ""Presentations"", ""Archived Reports"", ""Topics"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]",[],[],[],[] -3586,https://www.portlandmaine.gov/Archive.aspx?AMID=73,Complaints & Misconduct,404,"","",,,,,, -3587,https://www.cityofsacramento.org/Police/Transparency/Officer-Involved-Shootings,Officer Involved Shootings,200,Police Department | City of Sacramento,Sacramento Police Department,"[""Sacramento Police Department""]","[""About"", ""Your SacPD"", ""Index"", ""Social Media""]","[""Search for content"", ""News and Information"", ""Reporting"", ""Popular Services"", ""More"", ""Call our Non-Emergency Number: 916-808-5471"", ""We're hiring!"", ""Meet the Chief"", ""Uncrewed Aircraft Systems (UAS)"", ""In the News""]",[],[],[] -3588,https://wake.nc.networkofcare.org/mh/services/agency.aspx?pid=raleighpolicedepartment_1458_2_0,Contact Info & Agency Meta,200," - Raleigh Police Department - Raleigh - Wake County, North Carolina -","The goal of the Raleigh Police Department is to make Raleigh one of the safest cities in America. To do that, we continually advance strategies that prevent crime. We find ways to engage the community Wake County, North Carolina ",[],"[""Wake County"", ""Important Links And Resources"", ""\nRaleigh Police Department\n"", ""Share: "", ""Contact: ""]","[""Wake Network of Care\n"", ""State Legislate"", ""Federal Legislate"", ""Languages"", ""Other Topics That May Be Useful"", ""User Reviews"", ""Wake Network of Care"", ""For Technical Assistance:""]","[""\r\n\t\t\t\t\t\tOne Site. All Services. \r\n\t\t\t\t\t"", ""Tell us about the person you're helping:"", ""Get Directions To: "", ""Improving Search Results""]",[],[] -3589,https://www.providenceri.gov/wp-content/uploads/2021/07/230.01-In-Service-Training.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3590,"https://www.phoenix.gov/police/outreach-initiatives#:~:text=Use%20of%20Force%20Policy&text=Officers%20are%20trained%20to%20utilize,the%20weapons%2C%20tactics%20or%20techniques.",Policies & Contracts,200," - Phoenix Police Department Outreach Initiatives -",Download and view reports on community outreach initiatives by the city of Phoenix Police Department.,"[""\r\n \r\n \r\n Outreach Initiatives\r\n \r\n ""]","["""", """", """", ""Critical Incident Transparency Protocol"", ""City Manager\u2019s City Council Report on Community & Police Trust Initiative"", ""2017 Presidential Visit"", ""Use of Force Policy"", ""Annual\u00a0Officer Involved Shoot\u200b\u200b\u200b\u200b\u200bings\u00a0\u200b\u200bReports"", ""\u200b\u200b\u200bAnnual Cultural Competency, Diversity & Community Engagement Training Reports"", ""\u200b\u200b\u200bAnnual National Initiative for Building Community Trust and Justice Training Reports"", ""Quarterly Police Department Employee Demographics Reports\u200b\u200b\u200b"", ""\u200b\""Listening Sessions\"" Schedule"", ""Bi-Annual Community Engagement Reports\u200b\u200b\u200b"", ""Employee Excellence Summaries"", ""The President\u2019s Task Force on 21st Century Policing\u00a0"", """"]",[],[],"[""\u200bShare this page\u200b""]",[] -3591,https://www.portlandoregon.gov/police/76875,Use of Force Reports,200,Sign-In Form,"","[""The City of Portland, Oregon"", ""Sign-In""]",[],"[""New to PortlandOregon.gov?""]",[],[],[] -3592,https://cprbpgh.org/148681,Complaints & Misconduct,200,"Current CPRB Case Review Agenda (for review on February 22nd, 2022) » Pittsburgh Citizen Police Review Board (CPRB)","","[""CITIZEN POLICE REVIEW BOARD \u2022\u00a0CITY OF PITTSBURGH \u2022 "", ""CITIZEN POLICE REVIEW BOARD \u2022\u00a0CITY OF PITTSBURGH \u2022"", ""Current CPRB Case Review Agenda (for review on February 22nd, 2022)"", ""Current CPRB Case Review Agenda (for review on February 22nd, 2022)""]","[""\n Contact CPRB\n""]",[],"[""About the CPRB"", ""Recently Added"", ""CPRB 2024 Meeting Dates"", ""Address"", ""Phone"", ""Fax""]",[],[] -3593,http://goccp.maryland.gov/data-dashboards/traffic-stop-data-dashboard/,Stops,200,"Race-Based Traffic Stop Data Dashboard - Governor’s Office of Crime Prevention, Youth, and Victim Services","","[""Race-Based Traffic Stop Data Dashboard""]","[""About the Race-Based Traffic Stop Data Dashboard"", ""View the dashboard full screen within your browser.""]","[""Data Sources"", ""Data Sources"", ""What is Microsoft Power BI?""]","[""Hover"", ""Click"", ""Double-click"", ""Filters""]",[],[] -3594,https://raleighnc.gov/services/safety/police-policies-and-procedures,Policies & Contracts,200,Police Policies and Procedures | Raleighnc.gov,"","[""Police Policies and Procedures\n""]","[""Main navigation"", ""Secondary"", ""Main navigation"", ""Share"", ""Contact"", ""Subscribe"", ""City of Raleigh/s social media accounts"", ""Select Language""]",[],[],[],[] -3595,https://www.princegeorgescountymd.gov/1961/Contact-Us,Contact Info & Agency Meta,200,Contact Us | Prince George's County,Contact the most important entities related to the Police Department of Prince George's County.,"["" Contact Us ""]","[""Contact Information"", ""Quick Links""]",[],"[""Non-emergency Phone List"", ""Staff Directory"", ""State & County Hotlines""]",[],[] -3596,https://www.princegeorgescountymd.gov/DocumentCenter/View/16570/General-Orders-Manuals-PDF,Policies & Contracts,200,"","",[],[],[],[],[],[] -3597,https://tableau.alleghenycounty.us/t/PublicSite/views/CJ_UCR_PGH_8-22-17_v3/Home_1?iframeSizedToWindow=true&:embed=y&:showAppBanner=false&:display_count=no&:showVizHome=no&:origin=viz_share_link,Crime Maps & Reports,200," - Workbook: Crime in the City of Pittsburgh","",[],[],[],[],[],[] -3598,https://www.portlandoregon.gov/police/article/492458,Contact Info & Agency Meta,200,Sign-In Form,"","[""The City of Portland, Oregon"", ""Sign-In""]",[],"[""New to PortlandOregon.gov?""]",[],[],[] -3599,https://pittsburghpa.gov/files/police/orders/ch1/12-06-Use-of-Force.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3600,http://www.portlandmaine.gov/directory.aspx,Contact Info & Agency Meta,404,"","",,,,,, -3601,https://www.princegeorgescountymd.gov/644/Citizen-Complaint-Oversight-Panel,Complaints & Misconduct,200,Citizen Complaint Oversight Panel | Prince George's County,"The mission of the Citizen Complaint Oversight Panel is to strengthen the partnership between citizens and the Prince George's County police by assuring the public that investigations of alleged excessive force, abusive language and/or harassment are complete, thorough, and impartial.","["" Citizen Complaint Oversight Panel (Legacy) ""]","[""NOTE"", ""Mission"", ""Services"", ""Quick Facts"", ""Complaint Process"", ""Reports"", ""Contact Information"", ""Quick Links""]",[],[],[],[] -3602,https://www.portlandoregon.gov/police/article/751998,Policies & Contracts,200,Sign-In Form,"","[""The City of Portland, Oregon"", ""Sign-In""]",[],"[""New to PortlandOregon.gov?""]",[],[],[] -3603,https://www.cityofsacramento.org/Police/Transparency/General-Orders,Policies & Contracts,-1,"","",,,,,, -3604,https://www.opendatapolicingnc.com/report?var=stateAbbreviation:NC&var=agencyTitle:Raleigh+Police+Department,Stops,200,Open Data Policing | Raleigh Police Department,"",[],"[""Raleigh Police Department"", ""ACS Census Data 2019"", ""Traffic Stops"", ""Departmental Search Rate""]","[""Local Population (percentage by race/ethnic composition)"", ""Tabular view of census data"", ""Traffic Stops (percentage by race/ethnic composition)"", ""Longitudinal view of annual traffic stops"", ""Departmental Stop Count"", ""Departmental Search Count"", ""Average Departmental Search Rate For Vehicle Stops"", ""Search Data by Race/Ethnic Composition"", ""Likelihood of Search by \""Stop Cause\"""", ""Contraband \""Hit-Rate\"""", ""\""Use-of-force\"" Data by Race/Ethnic Composition"", ""Longitudinal view of annual use-of-force by race/ethnic composition"", ""About Open Data Policing"", ""Donate"", ""Connect""]","[""Longitudinal view of annual percent of search by race/ethnic composition""]",[],[] -3605,https://www.portlandmaine.gov/999/Annual-Reports,Complaints & Misconduct,200,Home | Portland International Jetport,"","[""\n\n\n\n\nHome\n\n""]","[""Secondary Nav Bar"", ""Main navigation"", ""Main navigation"", ""\n\n\n\n\nMulberrywood Feature\n\n"", ""\n\n\n\n\nEndeavour Feature\n\n"", ""\n\n\n\n\n\nAmerican Airlines Announces Non-Stop New York City - LaGuardia Service\n\n\n"", ""Footer"", ""Sub Footer"", """"]","[""\n\n\n\n\nTouchless Parking\n\n"", ""\n\n\n\n\nFind Your Flight\n\n""]",[],[],[] -3606,https://www.portlandmaine.gov/DocumentCenter/View/28313/Response-to-Resistance,Policies & Contracts,404,"","",,,,,, -3607,https://data-ral.opendata.arcgis.com/,List of Data Sources,200,Open Data Raleigh,City of Raleigh Open Data Site,[],[],[],[],[],[] -3608,https://www.portlandoregon.gov/police/71978,Crime Statistics,200,Portland Crime Statistics | Portland.gov,Interactive report summarizing the type and number of report offenses by Neighborhood.,"[""Portland Crime Statistics\n""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Dashboard Walkthrough"", ""Metadata for Offense Open Data"", ""NIBRS Offense Definitions"", ""Related"", ""Topics"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]","[""1. Report Overview"", ""2. Technical Specifications"", ""3. Visualization Walkthrough""]","[""a. Date Filter"", ""b. Offense Count by Category"", ""c. Frequency Map"", ""d. \u00a0Total Offense Count by Month"", ""e. Toolbar"", ""f. Download Data""]",[],[] -3609,https://communitycrimemap.com/,Crime Maps & Reports,200,LexisNexis® Community Crime Map,"",[],[],[],[],[],[] -3610,https://www.portland.gov/ipr/charts/police-misconduct-complaints-0,Complaints & Misconduct,200,Police misconduct complaints | Portland.gov,"","[""\nPolice misconduct complaints""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]",[],[],[],[] -3611,https://www.cityofsacramento.org/Police/Transparency/Use-Of-Force-Statistics,Use of Force Reports,-1,"","",,,,,, -3612,https://www.alleghenycountyanalytics.us/index.php/2021/03/17/use-force-city-pittsburgh-initial-report-2010-2015/,Use of Force Reports,200,Use of Force by City of Pittsburgh Police - Allegheny Analytics,"","[""Use of Force by City of Pittsburgh Police""]","[""What are the takeaways?"", ""Previous reports:""]",[],[],[],[] -3613,https://www.portlandoregon.gov/police/71978,Crime Maps & Reports,200,Portland Crime Statistics | Portland.gov,Interactive report summarizing the type and number of report offenses by Neighborhood.,"[""Portland Crime Statistics\n""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Dashboard Walkthrough"", ""Metadata for Offense Open Data"", ""NIBRS Offense Definitions"", ""Related"", ""Topics"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]","[""1. Report Overview"", ""2. Technical Specifications"", ""3. Visualization Walkthrough""]","[""a. Date Filter"", ""b. Offense Count by Category"", ""c. Frequency Map"", ""d. \u00a0Total Offense Count by Month"", ""e. Toolbar"", ""f. Download Data""]",[],[] -3614,https://www.portlandoregon.gov/police/76940,Officer Involved Shootings,200,Officer Involved Shootings | Portland.gov,Dynamic data dashboard describing PPB officer involved shootings from 2010 to current.,"[""Officer Involved Shootings\n""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Dashboard Walkthrough"", ""Metadata"", ""Related"", ""Topics"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]","[""2. Technical Specifications"", ""3. Visualization Walkthrough"", ""4. Download Data""]","[""a. Cases by Year with Subject Injury Type"", ""b. Initial Call Type"", ""c.\u00a0Aggregate Statistics"", ""d. Additional Aggregate Statistics"", ""e.\u00a0Subject Weapon"", ""f.\u00a0Demographics"", ""g.\u00a0Subject Age Ranges"", ""h. Toolbar\u00a0\u00a0""]",[],[] -3615,https://www.cityofsacramento.org/Police/Transparency/Vehicle-Stop-Data-History-and-Information,Stops,-1,"","",,,,,, -3616,https://data.cityofsacramento.org/,List of Data Sources,200,City of Sacramento Open Data,City of Sacramento Open Data Site,[],[],[],[],[],[] -3617,https://www.phoenixopendata.com/,List of Data Sources,200,Welcome - City of Phoenix Open Data,"","[""City of Phoenix Open Data"", ""Phoenix Open Data Portal: Government Transparency in the Digital Age""]","[""\n\n Groups\n \n"", ""\n\n Showcases\n \n"", ""\nExternal Datasets\n"", ""Popular Datasets"", ""New and Recent Datasets"", ""BEFORE YOU DOWNLOAD""]","[""Search data"", ""Popular tags"", ""City Manager's Performance Dashboard"", ""Use of Force Dashboard"", ""Phoenix Homeless Solutions Dashboard"", ""American Rescue Plan Act Strategic Plan"", ""Officer Pointed Gun at Person Dashboard"", ""Traffic Citations Dashboard"", ""Adult Arrests Dashboard"", ""Officer-Involved Shootings Dashboard"", ""City of Phoenix ERA Program Dashboard"", ""Parks and Recreation"", ""Outdoor Public Wifi Sites"", ""Arts + Culture Plan"", ""Phoenix Fire Department Operational Statistics"", ""Planned Major Street Restrictions and Closures"", ""Points of Pride"", ""\nCalls for Service\n"", ""\nEmployee Compensation\n"", ""\nAdult Arrests\n"", ""\nCrime Data\n"", ""\nTraffic Restrictions\n"", ""\nTraffic Restrictions\n"", ""\nENVIRONMENTAL SOCIAL GOVERNANCE\n"", ""\nOfficer Involved Shooting (OIS)\n"", ""\nApproved Zoning\n"", ""\nNeighborhood Associations\n""]",[],[],[] -3618,https://data.providenceri.gov/Public-Safety/Providence-Police-Case-Log-Past-180-days/rz3y-pz8v,Crime Statistics,200,Providence Police Case Log - Past 180 days | Open Data | City of Providence,"","[""""]","[""Menu""]",[],[],[],[] -3619,https://www.providenceri.gov/wp-content/uploads/2021/07/300.01-Use-of-Force.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3620,https://www.portlandmaine.gov/739/Daily-Media-Logs,Calls for Service,404,"","",,,,,, -3621,https://pittsburghpa.gov/city-info/police-numbers,Contact Info & Agency Meta,200,Police Phone Directory | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""POLICE"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""Looking for general information concerning the City of Pittsburgh? You can contact the 311 Response Center for detailed information, non-emergency concerns and feedback.\r\nDial 3-1-1, outside of Pittsburgh? Call 412-255-2621.\nOnline Service Request Form""]","[""DEPARTMENT MENU""]","[""City Directory"", ""City Information Center""]",[],[] -3622,https://data-ral.opendata.arcgis.com/datasets/raleigh-police-incidents-nibrs/,Crime Maps & Reports,200,Raleigh Police Incidents (NIBRS),"Raleigh Police Department incidents since June 2014, reported using the National Incident Based Reporting System (NIBRS).",[],[],[],[],[],[] -3623,https://www.portland.gov/police/open-data,List of Data Sources,200,PPB Open Data | Portland.gov,Datasources from the Portland Police Bureau,"[""PPB Open Data""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Featured content"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]","[""Portland Crime Statistics"", ""Police Staffing Numbers"", ""Officer Involved Shootings"", ""Police Dispatched Calls Dashboard"", ""Portland Arrest Statistics"", ""Police Use of Force Dashboard"", ""Portland UAS Call Statistics"", ""Stops Data Collection Reports"", ""Shooting Incident Statistics"", ""Business Districts Crime Summary"", ""Police Overtime Dashboard"", ""Precinct Demographics"", ""Reported Bias Crime Statistics"", ""Stolen Vehicle Statistics""]",[],[],[] -3624,https://data.princegeorgescountymd.gov/Public-Safety/Crime-Incidents-February-2017-to-Present/wb4e-w4nf/data,Crime Statistics,200,Crime Incidents February 2017 to 5th July 2023 | Tyler Data & Insights,"The Prince George’s County Police Department (PGPD) provides the displayed data as a service to our community. The included data does not represent every call for service handled by PGPD. Information is provided regarding traffic accidents, assaults, burglaries, homicides, robberies, sex offenses, stolen vehicles, thefts and vandalisms where a report has been written. Included information for any of these events has been modified to remove specific address location. In order to provide victim confidentiality, address numbers have been rounded to closest hundred block and any mapped locations will show occurrence based on the street centerline. We hope you will find this information useful.","[""\n Crime Incidents February 2017 to 5th July 2023\n \n ""]","[""Menu"", ""Create a new Template"", ""Subscribe to the \""Crime Incidents February 2017 to 5th July 2023\"" Dataset"", ""Invite Collaborators"", ""Save view"", ""Do you want to save your view?"", ""Choose a Dataset to use""]",[],"[""This information is now on Primer""]",[],[] -3625,https://www.portlandoregon.gov/police/65886,Policies & Contracts,200,Police Directives | Portland.gov,"","[""Police Directives""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Bureau Organization (0100)"", ""Personnel / General Administration (0200)"", ""Conduct / Discipline (0300)"", ""Disability / Injury / Retirement (0400)"", ""Health and Wellness (0500)"", ""Field Operations (0600)"", ""Emergencies / Disturbances (0700)"", ""Arrest / Detentions / Court (0800)"", ""Report Writing (0900)"", ""Weapons / Ammunition / Equipment (1000)"", ""Uniforms / Grooming (1100)"", ""Maintenance / Vehicles / Property (1200)"", ""Training (1500)"", ""Menu for Directives OverviewDirectivesFirst Universal ReviewSecond Universal ReviewDirectives Pending EnactmentExecutive Summary Archive"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]",[],[],[],[] -3626,https://www.princegeorgescountymd.gov/3499/Arrest,Arrest Records,403,"","",,,,,, -3627,https://www.cityofsacramento.org/Police/Contact,Contact Info & Agency Meta,-1,"","",,,,,, -3628,https://data.providenceri.gov/Public-Safety/Providence-Police-Department-Arrest-Log-Past-60-Da/vank-fyx9,Arrest Records,200,Providence Police Department Arrests and Citations- Past 60 Days | Open Data | City of Providence,"","[""""]","[""Menu""]",[],[],[],[] -3629,https://www.portlandmaine.gov/DocumentCenter/View/5911/Arrest-Log?bidId=,Arrest Records,404,"","",,,,,, -3630,https://pittsburghpa.gov/files/police/orders/ch1/12-02-General-Provisions-Manual-of-Procedural-Orders.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3631,https://pittsburghpa.gov/files/police/orders/ch7/70-03-Training-General-Regulations.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3632,https://data-ral.opendata.arcgis.com/datasets/raleigh-police-incidents-nibrs/explore?showTable=true,Crime Statistics,200,Raleigh Police Incidents (NIBRS),"Raleigh Police Department incidents since June 2014, reported using the National Incident Based Reporting System (NIBRS).",[],[],[],[],[],[] -3633,https://data.princegeorgescountymd.gov/,List of Data Sources,200,OpenPGC | Open Data | Tyler Data & Insights,"","[""Welcome!"", ""Public Safety"", ""CountyClick 311"", ""Suggest a Dataset..""]","[""Menu""]",[],"[""311 Explorer"", ""CountyClick 311"", ""TNI (Transforming Neighborhoods Initiative)"", ""Crime Data""]",[],[] -3634,https://data.sanantonio.gov/,List of Data Sources,200,Welcome - Open Data SA,"","[""Open Data SA""]","[""\n\n Groups\n \n"", ""Popular Datasets"", ""New and Recent Datasets""]","[""Search data"", ""Popular tags"", ""\nBuilding Permits\n"", ""\n311 Service Calls\n"", ""\nVariance Requests\n"", ""\nTraffic Speed Humps\n"", ""\nPerformance Measures\n"", ""\nCOVID-19 Weekly Surveillance Data Public\n"", ""\nVariance Requests\n"", ""\nPreliminary Plan Reviews\n"", ""\nBuilding Permits\n"", ""\n311 Service Calls\n""]",[],[],[] -3635,https://datasf.org/opendata/,List of Data Sources,200,DataSF | San Francisco Open Data,"Our mission is to empower use of the City and County of San Francisco's data. Our core product is SF OpenData, the official open data portal.","[""Find the data you need"", ""Dataset Alerts""]","[""Publishing Departments""]",[],[],[],[] -3636,https://webapps.siouxfalls.org/policecalllog,Calls for Service,200,30 Day Police Call Log,"","[""Police Call Log""]",[],[],[],[],[] -3637,https://www.sanfranciscopolice.org/contact-and-directory,Contact Info & Agency Meta,200,Contact and Directory | San Francisco Police Department,"","[""Contact and Directory""]","[""Popular Search Terms:"", ""Contact Information"", ""San Francisco Police Headquarters""]","[""Non-Emergency"", ""City Services & Questions"", ""Anonymous Tip Line"", ""Text a Tip"", ""Contact Your Police Station"", ""SFPD Headquarters"", ""Non-Emergency"", ""City Services & Questions"", ""Anonymous Tip Line\u00a0"", ""Text a Tip"", ""Contact Your Police Station"", ""SFPD Headquarters"", ""General Phone""]","[""1-415-553-0123"", ""3-1-1"", ""1-415-575-4444"", ""1-415-837-7000""]",[],[] -3638,https://www.seattle.gov/police,Contact Info & Agency Meta,200,Seattle Police Department Home Page - Police | seattle.gov,This is the official home page for the Seattle Police Department.,"[""\nSeattle Police Department\n""]","[""Attention:"", ""Issues and Initiatives"", ""Police"", ""City-Wide Information"", ""Policies""]","[""\r\n Before The Badge\r\n "", ""\r\n Community Feedback\r\n "", ""\r\n Re-Envisioning Public Safety Together\r\n "", ""\r\n Public Disclosure Request Data Dashboard\r\n "", ""\r\n SPD Data Maps\r\n "", ""\r\n Apply to SPD\r\n "", ""Contact Us"", ""Follow Us"", ""\r\n Top Requests\r\n "", ""\r\n Parking Enforcement\r\n "", ""\r\n U-Visa Info\r\n "", ""\r\n When to call 911\r\n "", ""MCPP Plans"", ""Professional Standards Bureau"", ""Service Quality Survey"", ""SPD Safe Place"", ""\r\n SPD Information\r\n ""]",[],[],[] -3639,https://www.sanfranciscopolice.org/your-sfpd/published-reports/quarterly-activity-data-report-qadr,Use of Force Reports,200,Quarterly Activity & Data Report (QADR) | San Francisco Police Department,"","[""Quarterly Activity & Data Report (QADR)""]","[""Popular Search Terms:"", ""1st Quarter"", ""2nd Quarter"", ""3rd Quarter"", ""1st Quarter"", ""2nd Quarter"", ""3rd Quarter"", ""4th Quarter"", ""1st Quarter"", ""2nd Quarter"", ""3rd Quarter"", ""4th Quarter"", ""4th Quarter"", ""3rd Quarter""]","[""Non-Emergency"", ""City Services & Questions"", ""Anonymous Tip Line"", ""Text a Tip"", ""Contact Your Police Station"", ""SFPD Headquarters""]",[],[],[] -3640,https://www.sanantonio.gov/SAPD/Uniform-Crime-Reports#30263860-2020,Crime Statistics,200,National Incident-Based Reporting System (NIBRS) - City of San Antonio,SAPD reports crime data to this national system as required by law.,"[""National Incident-Based Reporting System (NIBRS)""]","[""NIBRS Year-to-Date Comparison: 2022 vs 2023"", ""Data Description"", ""Crime Comparison Reports"", ""Previous Reports""]","[""Crime Statistics January \u2013 October"", ""Contact Us"", ""Get Social"", ""Visit Other San Antonio Sites"", ""Share Your Feedback""]",[],[],[] -3641,https://sfgov.org/dpa/reports-statistics,Complaints & Misconduct,200,Reports on policing complaints | San Francisco,See reports on how many complaints were filed and what we found.,"[""Reports on policing complaints""]","[""Audit Reports"", ""SB 1421 Records"", ""SB 16 Records"", ""Footer menu"", ""Footer Bottom""]",[],"[""Departments""]",[],[] -3642,https://dotnet.slcgov.com/police/useofforce#/chartpresentation,Use of Force Reports,503,"","",,,,,, -3643,https://www.sjpd.org/home/showpublisheddocument/680/637598755101770000,Complaints & Misconduct,200,"","",[],[],[],[],[],[] -3644,https://data.sandiego.gov/,List of Data Sources,200,City of San Diego Open Data Portal," - Empowering San Diegans by making data usable. - ",[],"[""\n Find data\n "", ""See trends""]",[],[],"[""\n\n Parking meter revenue\n \n"", ""\n\n Street repair work\n \n"", ""\n\n Get water testing results\n \n"", ""\n\n Keep track of street sweeping\n \n"", ""\n\n Budget data since 2011\n \n""]",[] -3645,"https://www.cityprotect.com/map/list/agencies/5ce2bdae3934cc0011edaebb?pageSize=2000&parentIncidentTypeIds=149,150,148,8,97,104,165,98,100,179,178,180,101,99,103,163,168,166,12,161,14,16,15&zoomLevel=12&latitude=37.27713331564453&longitude=-121.86547120605476&days=1,2,3,4,5,6,7&startHour=0&endHour=24&timezone=-08:00&fromDate=06%2F08%2F2020&toDate=06%2F10%2F2020",Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -3646,https://www.sanantonio.gov/Portals/0/Files/SAPD/OpenData/RacialProfilingReport2020.pdf,Stops,200,"","",,,,,, -3647,https://data.seattle.gov/,List of Data Sources,200,City of Seattle Open Data portal,"",[],"[""Menu""]",[],[],[],[] -3648,https://www.sanantonio.gov/SAPD/Calls,Calls for Service,200,Transparency & Open Data - City of San Antonio,"The SAPD’s Open Data Initiative provides up-to-date access to SAPD data, reports, and documents.","[""Transparency & Open Data""]","[""Police Open Records Requests"", ""Open Data Library"", ""Recent Calls for Service"", ""Map of Calls for the Past Seven Days"", ""Explore Historical Call Data"", ""Community Crime Map"", ""Sex Offenders Search""]","[""Contact Us"", ""Get Social"", ""Visit Other San Antonio Sites"", ""Share Your Feedback""]",[],[],[] -3649,https://www.sanmarcostx.gov/556/Contact-the-Police-Department,Contact Info & Agency Meta,200,"Contact the Police Department | City of San Marcos, TX",Make contact with divisions and personnel within the Police Department.,"[""\r\n\r\nContact the Police Department\t\t""]",[],"[""Loading"", ""The physical address of the San Marcos Police Department is:"", ""Directions to the San Marcos Police Department:"", ""Contact Us"", ""Helpful Links"", ""Quick Links""]",[],[],[] -3650,https://www.crimemapping.com/map/location/san%20diego?id=,Crime Maps & Reports,200,CrimeMapping.com - Helping You Build a Safer Community,"",[],[],[],[],[],[] -3651,https://communitycrimemap.com/?address=78205,Crime Maps & Reports,200,LexisNexis® Community Crime Map,"",[],[],[],[],[],[] -3652,https://www.sandiego.gov/cpp/reports,Complaints & Misconduct,200,Reports & Newsletters | City of San Diego Official Website,"","[""City of San Diego Official Website"", ""Reports & Newsletters""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Footer""]","[""Newsletters "", ""Annual Reports "", ""CRB Response to Grand Jury Reports "", ""Quarterly Reports ""]","[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -3653,"https://www.cityprotect.com/map/list/agencies/5ce2bd9e3934cc0011edac7b?toDate=2020-03-03T23:59:59.999Z&fromDate=2020-02-29T00:00:00.000Z&pageSize=2000&parentIncidentTypeIds=149,150,148,8,97,104,165,98,100,179,178,180,101,99,103,163,168,166,12,161,14,16,15&zoomLevel=11&latitude=40.791794129811684&longitude=-111.89896604989659&days=1,2,3,4,5,6,7&startHour=0&endHour=24&timezone=%2B00:00",Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -3654,http://www.slcpd.com/open-data/crimestatistics/,Crime Statistics,200,Crime Statistics – SLCPD,"Provides command staff profiles, bureaus within the department, how to get involved and become informed, employment information, and news releases.",[],"[""Salt Lake City Crime Stats""]",[],"[""Click here to start searching Crime Stats"", ""Download a Monthly Offense Summary for all City Council Districts:"", ""Contact"", ""Quick Links"", ""Recent News"", ""Latest Tweets""]","[""Disclaimer"", ""About UCR:\n"", ""Accuracy:\n"", ""Liability:\n""]","[""Remember, crime statistics only tell part of the story in any neighborhood. ""]" -3655,https://www.sandiego.gov/police/data-transparency/crime-statistics/annual-crime-reports,Crime Maps & Reports,200,City of San Diego Annual Crime Reports | City of San Diego Official Website,"","[""City of San Diego Official Website"", ""City of San Diego Annual Crime Reports""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Actual Crimes"", ""Crime Rates per 1,000 Population"", ""Data & Transparency"", ""Footer""]","[""City of San Diego"", ""By Neighborhood"", ""City of San Diego"", ""By Neighborhood""]","[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -3656,https://www.sanantonio.gov/SAPD/SAPD-Open-Data-Initiative#182281929-open-data,Complaints & Misconduct,200,Transparency & Open Data - City of San Antonio,"The SAPD’s Open Data Initiative provides up-to-date access to SAPD data, reports, and documents.","[""Transparency & Open Data""]","[""Police Open Records Requests"", ""Open Data Library"", ""Recent Calls for Service"", ""Map of Calls for the Past Seven Days"", ""Explore Historical Call Data"", ""Community Crime Map"", ""Sex Offenders Search""]","[""Contact Us"", ""Get Social"", ""Visit Other San Antonio Sites"", ""Share Your Feedback""]",[],[],[] -3657,https://www.seattle.gov/police-manual/title-8---use-of-force/8000---use-of-force-core-principles,Policies & Contracts,404,"","",,,,,, -3658,https://www.sanantonio.gov/SAPD/Officer-Involved-Shooting,Officer Involved Shootings,200,Officer-Involved Shootings - City of San Antonio,Reports by year of shootings that involved SAPD officers.,"[""Officer-Involved Shootings""]","[""2024"", ""2023"", ""2022"", ""2021"", ""2020"", ""2019"", ""2018"", ""2017"", ""2016"", ""2015"", ""Search""]","[""Contact Us"", ""Get Social"", ""Visit Other San Antonio Sites"", ""Share Your Feedback""]",[],[],[] -3659,https://siouxfalls.org/police/complaints-commendations/complaints,Complaints & Misconduct,200,View Complaints - City of Sioux Falls,Learn more about citizen complaints against officers.,"[""View Complaints""]","[""Citizen Complaints Against Officers"", ""2023"", ""2022"", ""2021"", ""1st Qtr"", ""2nd Qtr"", ""3rd Qtr"", ""4th Qtr"", ""2020"", ""1st Qtr"", ""2nd Qtr"", ""3rd Qtr"", ""4th Qtr""]","[""There are four different categories of complaint findings:"", ""Contact Us"", ""Quick Links"", ""Share & Connect""]",[],"[""1st Qtr"", ""2nd Qtr"", ""3rd Qtr"", ""1st Qtr"", ""2nd Qtr"", ""3rd Qtr"", ""4th Qtr""]",[] -3660,https://www.seattle.gov/police/information-and-data/crime-dashboard,Crime Statistics,200,Crime Dashboard - Police | seattle.gov,An overview of crime data for the city of Seattle,"[""Crime Dashboard\r\n""]","[""Attention:"", ""Police"", ""City-Wide Information"", ""Policies""]","[""Year-End Crime Reports"", ""\r\n SPD Information\r\n ""]",[],[],[] -3661,https://www.arcgis.com/apps/MapSeries/index.html?appid=94c31b66facc438b95d95a6cb6a0ff2e,Crime Maps & Reports,200,"",This story map was created with the Story Map Series application in ArcGIS Online.,"[""""]",[],[],[],[],[] -3662,https://data.sfgov.org/Public-Safety/Law-Enforcement-Dispatched-Calls-for-Service-Close/2zdj-bwza,Calls for Service,200,Law Enforcement Dispatched Calls for Service: Closed | DataSF | City and County of San Francisco,"","[""""]",[],[],[],[],[] -3663,https://www.sandiego.gov/police/about/procedures,Policies & Contracts,200,Policies and Procedures | City of San Diego Official Website,"","[""City of San Diego Official Website"", ""Policies and Procedures""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Search for Documents"", ""Browse by Category"", ""Data & Transparency"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -3664,https://www.sanfranciscopolice.org/your-sfpd/policies/general-orders,Policies & Contracts,200,General Orders | San Francisco Police Department,"","[""General Orders""]","[""Popular Search Terms:"", ""San Francisco Police Department""]","[""Non-Emergency"", ""City Services & Questions"", ""Anonymous Tip Line"", ""Text a Tip"", ""Contact Your Police Station"", ""SFPD Headquarters""]",[],[],[] -3665,https://www.seattle.gov/police-manual,Policies & Contracts,404,"","",,,,,, -3666,https://data.sandiego.gov/datasets/police-ripa-stops/,Stops,200,RIPA police stop data - basic details - City of San Diego Open Data Portal," - All stops made by the San Diego Police Department. Data collected from these stops conforms to requirements set forth in Government Code section 12525.5 that... - ",[],"[""\nRIPA police stop data - basic details\n""]","["""", ""Additional Info""]","[""Stop details""]",[],[] -3667,https://dotnet.slcgov.com/Police/CADCallsForService/,Calls for Service,200,Police Calls For Service,"","[""Police Calls For Service""]",[],[],[],[],[] -3668,https://www.cityofsacramento.org/-/media/Corporate/Files/Police/Transparency/GO/Section-500/GO-58002-Use-of-Force-91821.pdf?la=en,Policies & Contracts,-1,"","",,,,,, -3669,http://www.slcpd.com/transparency/,Policies & Contracts,200,Transparency – SLCPD,"Provides command staff profiles, bureaus within the department, how to get involved and become informed, employment information, and news releases.",[],"[""Policies and Procedures""]",[],"[""Contact"", ""Quick Links"", ""Recent News"", ""Latest Tweets""]",[],[] -3670,http://www2.sjpd.org/records/pc-13650_library/Unit%20Guidelines/FTO%20MANUAL%20June%202019.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3671,https://www.sanmarcostx.gov/3155/SMPD-Policy,Policies & Contracts,200,"SMPD Policy | City of San Marcos, TX","SMPD Recognized Policies are current police policies. -SMPD Legacy Policies are policies from past administrations.","[""\r\n\r\nSMPD Policy\t\t""]",[],"[""Loading"", ""Contact Us"", ""Helpful Links"", ""Quick Links""]","[""Recognized Policies"", ""Legacy Policies""]",[],[] -3672,https://www.sanjoseca.gov/your-government/appointees/independent-police-auditor/publications/archived-reports,Complaints & Misconduct,404,"","",,,,,, -3673,https://www.sandiego.gov/police/contact,Contact Info & Agency Meta,200,Contact | City of San Diego Official Website,"","[""City of San Diego Official Website"", ""Contact""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Liaisons"", ""Directory"", ""Pages"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -3674,https://www.seattle.gov/police-manual/title-1---department-administration/1070---training,Policies & Contracts,404,"","",,,,,, -3675,https://www.sjpd.org/community/community-services/community-service-officers,Contact Info & Agency Meta,200," - - Community Service Officer Program (CSO) | San Jose Police Department, CA - -","","[""San Jose Police Department, CA"", ""Community Service Officer Program (CSO)""]","[""\nJanuary 2024\n"", ""\nJan 2024\n"", ""Jump to subpage..."", ""FAQs"", ""What type of training do CSOs receive?"", ""How many CSOs does the Police Department employ?"", ""How are the CSOs deployed?"", ""What days and hours do the CSOs work?"", ""What type of uniforms do the CSOs wear?"", ""What type of vehicles do the CSOs drive?"", ""Meet a Community Service Officer:""]",[],[],[],[] -3676,https://data.sandiego.gov/datasets/police-calls-for-service/,Calls for Service,200,Police Calls for Service - City of San Diego Open Data Portal," - Calls dispatched by the San Diego Police Department’s communicationsdispatch center. - ",[],"[""\nPolice Calls for Service\n""]","["""", ""Additional Info""]","[""Police Calls for Service 2024""]",[],[] -3677,https://www.cityofsacramento.org/Police/Transparency/Education-and-Training-Materials,Policies & Contracts,200,Police Department | City of Sacramento,Sacramento Police Department,"[""Sacramento Police Department""]","[""About"", ""Your SacPD"", ""Index"", ""Social Media""]","[""Search for content"", ""News and Information"", ""Reporting"", ""Popular Services"", ""More"", ""Call our Non-Emergency Number: 916-808-5471"", ""We're hiring!"", ""Meet the Chief"", ""Uncrewed Aircraft Systems (UAS)"", ""In the News""]",[],[],[] -3678,https://www.sanfranciscopolice.org/sites/default/files/2018-11/DGO%205.01.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3679,https://www.sanantonio.gov/Portals/0/Files/SAPD/GeneralManual/501.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3680,https://www.sanfranciscopolice.org/your-sfpd/published-reports/officer-involved-shootings-ois-data,Officer Involved Shootings,200,Officer Involved Shootings (OIS) Data | San Francisco Police Department,"","[""Officer Involved Shootings (OIS) Data""]","[""Popular Search Terms:"", ""Memorandum of Understanding (MOU) with the San Francisco District Attorney's Office"", ""Officer-Involved Shootings, Suspect-Involved, 2009 \u2013 2022*"", ""San Francisco Police Department""]","[""Non-Emergency"", ""City Services & Questions"", ""Anonymous Tip Line"", ""Text a Tip"", ""Contact Your Police Station"", ""SFPD Headquarters""]",[],[],[] -3681,https://www.sandiego.gov/sites/default/files/legacy/police/pdf/forattach.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3682,https://www.sanjoseinside.com/wp-content/uploads/2016/02/Use-of-Force-Policy.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3683,https://data.sanjoseca.gov/,List of Data Sources,200,Welcome - San Jose CA Open Data Portal,"","[""San Jose CA Open Data Portal""]","[""\n\n Groups\n \n"", ""\n\n Showcases\n \n"", ""Popular Datasets"", ""New and Recent Datasets""]","[""Search data"", ""Popular tags"", ""3-1-1 Outreach"", ""Unhoused Traffic Fatalities in San Jose"", ""3-1-1 Calls Transition from Police Call Center to Customer Contact Center"", ""Equitable Distribution of Citywide Scholarships"", ""BeautifySJ Encampment Trash Program"", ""Food Insecurity during COVID-19 Pandemic"", ""Violence Risk Factors Map"", ""Impact of Geo-aware Emergency Response for Life and Safety"", ""The Nature of Fatal Crashes"", ""\nPolice-Calls-for-Service\n"", ""\nEmployee Compensation Plans\n"", ""\nSan Jose Fire Incidents\n"", ""\nZoning Districts\n"", ""\nCrashes Data\n"", ""\nPublic Litter Can\n"", ""\nRoad Closures\n"", ""\n311 Service Request Data\n"", ""\nLast 60-180 days Planning Permits\n"", ""\nLast 30 days Planning Permits\n""]",[],[],[] -3684,https://www.sanantonio.gov/SAPD/Directory,Contact Info & Agency Meta,200,Contact & Connect - City of San Antonio,"Contact information for San Antonio Police Department offices, divisions and units, with contact options, emails, addresses, and phone numbers.","[""Contact & Connect""]","[""Phone"", ""Address"", ""Administration"", ""Community Policing Activities"", ""Ground Transportation Unit"", ""Investigations Division (CID)"", ""Mental Health Unit"", ""Property Room"", ""Recruiting & Training"", ""SAFFE Units & Crime Prevention Specialists"", ""Substations"", ""Other Useful Numbers"", ""\r\n\t\t\tSubstation & SAFFE Lookup\r\n\t\t"", ""\r\n\t\t\tCrime Stoppers Hotline\r\n\t\t"", ""\r\n\t\t\tGet Social\r\n\t\t""]","[""Parking"", ""Phone"", ""Contact Us"", ""Get Social"", ""Visit Other San Antonio Sites"", ""Share Your Feedback""]",[],[],[] -3685,http://www.slcpd.com/police-policy-manual/,Policies & Contracts,200,Police Policy Manual – SLCPD,"Provides command staff profiles, bureaus within the department, how to get involved and become informed, employment information, and news releases.",[],"[""Police Policy Manual"", ""To make the document easier to scroll through, follow these steps.""]",[],"[""Click the upper left button in the gray box. "", ""Click the bottom button that shows four lines."", ""The policy outline is now available to scroll through on the left hand side."", ""Contact"", ""Quick Links"", ""Recent News"", ""Latest Tweets""]",[],[] -3686,https://www.slc.gov/boards/quarterly-reports/,Complaints & Misconduct,200,Quarterly Reports | Boards and Commissions,Boards and Commissions,"[""\n\n\t\t\t\tSLC.gov\n\t\t\t\n"", ""\n\n\t\t\t\t\tSLC.gov\n\t\t\t\t\n"", ""Boards and Commissions""]","[""Quarterly Reports""]","[""Salt Lake City"", ""Salt Lake City"", ""Additional Resources"", ""SLC.gov on Social Media""]","[""""]",[],[] -3687,https://data-cosm.hub.arcgis.com/,List of Data Sources,200,SMTX Open Data,"Access data and interactive maps for the City of San Marcos, TX.",[],[],[],[],[],[] -3688,http://www.slcpd.com/contact-us/,Contact Info & Agency Meta,200,Contact Us – SLCPD,"Provides command staff profiles, bureaus within the department, how to get involved and become informed, employment information, and news releases.",[],"[""Contacting the Salt Lake City Police Department"", ""Contact Us""]","[""Online Police Reporting"", ""Employment Questions"", ""Hire an Officer/Police OfficerSecondary Employment"", ""Frequently askedQuestions""]","[""Online Police Report"", ""Stay Connected"", ""(801) 799-3000"", ""(801) 799-3100"", ""(801) 799-NEWS (6397)"", ""(801) 799-3367"", ""(801) 799-3041"", ""(801) 575-2401"", ""(801) 799-3533"", ""slcpd@slcgov.com"", ""slcpdpr@slcgov.com"", ""SLCPDOutreach@slcgov.com"", ""slcpdmotor@slcgov.com"", ""Event/Speaking Request Form"", ""Meeting Request Form"", ""askthechief@slcgov.com"", ""Evidence and Crime Lab"", ""Pioneer Precinct"", ""Public Safety Building"", ""(801) 799-3000"", ""(801) 799-3100"", ""(801) 799-NEWS (6397)"", ""(801) 799-3367 "", ""(801) 575-2470"", ""(801) 799-3533"", ""slcpd@slcgov.com"", ""slcpdpr@slcgov.com"", ""SLCPDOutreach@slcgov.com"", ""slcpdmotor@slcgov.com"", ""Evidence and Crime Lab"", ""Pioneer Precinct"", ""Public Safety Building"", ""Find the Appropriate Contact to Make a Request"", ""Contact"", ""Quick Links"", ""Recent News"", ""Latest Tweets""]","[""LGBTQ Contact, brent.weisberg@slcgov.com\n"", ""LGBTQ Contact, brent.weisberg@slcgov.com\n""]","[""Non-Emergency"", ""General Information"", ""Media Inquiries / Communications and Media Relations Unit"", ""Community Outreach Unit / LGBTQ Contact"", ""Evidence/Property"", ""Airport"", ""Community Connection Center"", ""General Email Address"", ""Media Inquiries / Public Relations Unit"", ""Community Outreach Unit"", ""Traffic Enforcement"", ""Non-Emergency"", ""General Information"", ""Media Inquiries / Communications and Media Relations Unit"", ""Community Outreach Unit / LGBTQ Contact"", ""Evidence/Property"", ""Airport"", ""Community Connection Center"", ""General Email Address"", ""Media Inquiries / Public Relations Unit"", ""Community Outreach Unit"", ""Traffic Enforcement"", ""(801) 799-3113"", ""www.slcpd.com/faq\n""]" -3689,https://sfgov.org/policecommission/police-commission-disciplinary-actions-veronese-reports,Complaints & Misconduct,200,"Police Commission Disciplinary Actions - ""Veronese"" Report | San Francisco",Quarterly report of disciplinary actions by the Police Commission,"[""Police Commission Disciplinary Actions - \""Veronese\"" Report""]","[""\n Documents\n "", ""\n Documents\n "", ""Footer menu"", ""Footer Bottom""]","[""\n 2023\n "", ""\n 2022\n "", ""\n 2021\n "", ""\n 2020\n ""]","[""Departments""]",[],[] -3690,https://www.sanmarcostx.gov/DocumentCenter/View/19676/31-Basic-Training-Requirements,Policies & Contracts,200,"","",[],[],[],[],[],[] -3691,"https://www.sjpd.org/records/crime-stats-maps/force-analysis-data#:~:text=The%20San%20Jose%20Police%20Department,on%20our%20public%20web%20site.&text=For%20additional%20information%2C%20please%20contact,at%20408%2D277%2D5200.",Use of Force Reports,200," - - Force Analysis Data | San Jose Police Department, CA - -","","[""San Jose Police Department, CA"", ""Force Analysis Data""]","[""\nJanuary 2024\n"", ""\nJan 2024\n"", ""\r\nWritten Use-of-Force Analysis Reports\r\n"", ""Interactive Dashboards""]",[],[],[],[] -3692,https://www.sanfranciscopolice.org/stay-safe/crime-data/crime-reports,Crime Statistics,200,Crime Reports | San Francisco Police Department,"","[""Crime Reports""]","[""Popular Search Terms:"", ""CompStat Policing in San Francisco"", ""CompStat Reports""]","[""Non-Emergency"", ""City Services & Questions"", ""Anonymous Tip Line"", ""Text a Tip"", ""Contact Your Police Station"", ""SFPD Headquarters""]",[],[],[] -3693,https://www.sanmarcostx.gov/DocumentCenter/View/19174/61-Response-to-Resistance-and-Aggression,Policies & Contracts,200,"","",[],[],[],[],[],[] -3694,San Marcos Police Department - Cite and Release (arcgis.com),Arrest Records,-1,"","",,,,,, -3695,https://www.sanantonio.gov/SAPD/SAPD-Open-Data-Initiative#182281928-use-of-force-incidents,Use of Force Reports,200,Transparency & Open Data - City of San Antonio,"The SAPD’s Open Data Initiative provides up-to-date access to SAPD data, reports, and documents.","[""Transparency & Open Data""]","[""Police Open Records Requests"", ""Open Data Library"", ""Recent Calls for Service"", ""Map of Calls for the Past Seven Days"", ""Explore Historical Call Data"", ""Community Crime Map"", ""Sex Offenders Search""]","[""Contact Us"", ""Get Social"", ""Visit Other San Antonio Sites"", ""Share Your Feedback""]",[],[],[] -3696,https://www.seattle.gov/police/information-and-data/arrest-dashboard,Arrest Records,200,Arrest Dashboard - Police | seattle.gov,An overview of Arrest data for the city of Seattle,"[""Arrest Dashboard\r\n""]","[""Attention:"", ""Police"", ""City-Wide Information"", ""Policies""]","[""Resources"", ""\r\n Revised Code of Washington (RCW)\r\n "", ""\r\n SMC Library\r\n "", ""\r\n Public Arrests Dataset\r\n "", ""\r\n SPD Information\r\n ""]",[],[],[] -3697,https://www.sanfranciscopolice.org/your-sfpd/published-reports,Stops,200,Published Reports | San Francisco Police Department,"","[""Published Reports""]","[""Popular Search Terms:"", ""Department Published Reports"", ""Other Agency Reports"", ""San Francisco Police Department""]","[""Non-Emergency"", ""City Services & Questions"", ""Anonymous Tip Line"", ""Text a Tip"", ""Contact Your Police Station"", ""SFPD Headquarters"", ""Racial Equity & Inclusion Plan (REAP)"", ""Quarterly Activity & Data Report (QADR)"", ""Domestic Violence Data Report"", ""Crime Victim Data Reporting"", ""Investigated Hate Crimes Data"", ""Use of Force, Stops & Arrests"", ""Early Intervention System"", ""Firearms Discharges"", ""Officer-Involved Shootings (OIS) Data"", ""Memorandum of Understanding (MOU) with the San Francisco District Attorney's Office"", ""Stops Data"", ""Historical Traffic Stops Reports"", ""San Francisco Police Department Sworn Demographics"", ""San Francisco Police Department Historical Annual Reports"", ""Audits of Electronic Communication Devices for Bias"", ""Department Staffing Study by Matrix Consulting Group"", ""Staffing Analysis of the San Francisco Police Department"", ""Internal Affairs Division Misconduct Reports"", ""Disciplinary Reports"", ""Collaborative Reform Initiative"", ""Academic Institution Reports"", ""Partner Agency Reports""]",[],[],[] -3698,https://stlouiscountypolice.com/who-we-are/policies-and-procedures/,Policies & Contracts,200,Policies and Procedures - St. Louis County Police,"","[""Policies and Procedures""]",[],[],[],"[""""]",[] -3699,https://data-stlcogis.opendata.arcgis.com/pages/open-data,List of Data Sources,200,Open Data,"Sharing St. Louis County's Data and the Tools to Visualize It What is Open Data? Open data is data that can be freely used, shared, and utilized by anyone. This data is provided by St. Louis County. You'll find maps, applications, reports, tables, and more. Click below to explore all of the available data or explore by category. All Data Community and Wellness Elections Imagery Property Information Public Safety Tax and Assessment Transportation Additional Resources Missouri Spatial Data Information Service Missouri Spatial Data Information Service- Making Missouri Available Digitally St. Louis Regional Data Alliance St. Louis Regional Data Alliance City of St. Louis Open Data Seal of the City of St. Louis Unlock the Data Explore Visualize & Analyze Build Share Anyone can use open data from St. Louis County Open Government at no cost. Download raw data and share your insights with your community or build new applications that serve specific users. Dig into the data. Highlight spatial patterns and discover trends. Develop new apps using open data. Embed analysis on your website. gis@stlouisco.com | 314.615.5000 | 41 S. Central Ave. | Clayton, MO 63105",[],[],[],[],[],[] -3700,https://tpdrecruiting.tucsonaz.gov/academy,Policies & Contracts,200,Academy | TPD Recruiting,"Welcome to the Southern Arizona Law Enforcement Training Center. Your journey begins here... The basic training program is a 24-week curriculum, designed to challenge students mentally, physically, and academically.","[""\n\n\n\n\nAcademy\n\n""]","[""Breadcrumb"", ""Welcome to the Southern Arizona Law Enforcement Training Center. Your journey begins here..."", ""Arriving at the Academy"", ""Vehicles & Parking"", ""Attire"", ""Grooming"", ""Meals"", ""Lockers"", ""Weapons"", ""Other Required Equipment and Supplies"", ""Lodging"", ""Standards of Conduct"", ""Training Standards"", ""Assignments & Examinations"", ""Physical Conditioning Standards"", ""General Exercise Pattern"", ""Cardiovascular Endurance"", ""Strength Training"", ""Flexibility"", ""Fitness tests"", ""Police Officer Physical Aptitude Test"", ""Applied Skills Proficiency"", ""Firearms Training & Qualifications"", ""Driver's Training"", ""Report Writing"", ""Defensive Tactics Training"", ""Menu"", ""Social Media Menu""]","[""The following links will take you directly to the listed topic on this page.""]",[],[],[] -3701,https://stlouiscountypolice.com/connect-with-us/,Contact Info & Agency Meta,200,Connect With Us - St. Louis County Police,"","[""Connect With US""]",[],[],[],"[""""]",[] -3702,https://policestandards.tucsonaz.gov/,Complaints & Misconduct,200,Tucson Police Professional Standards,Create your own initiative by combining existing applications with a custom site. Use this initiative to form teams around a problem and invite your community to participate.,[],[],[],[],[],[] -3703,https://siouxfalls.org/contactus/police/police-lec,Contact Info & Agency Meta,200,Police Law Enforcement Center - City of Sioux Falls,Contact information for the Police Law Enforcement Center in Sioux Falls.,"[""Police Law Enforcement Center""]","[""IN CASE OF AN EMERGENCY DIAL 911."", ""Police Patrol Contacts"", ""\r\n\t\t\tContact\r\n\t\t""]","[""Contact Us"", ""Quick Links"", ""Share & Connect""]",[],[],[] -3704,http://data-cotgis.opendata.arcgis.com/search?groupIds=b6a49faa168647d8b56e1a06bd53600f&q=arrests,Arrest Records,200,Tucson Open Data,"This is the City of Tucson's public platform for exploring and downloading open data, discovering and building apps, and engaging to solve important local issues.",[],[],[],[],[],[] -3705,https://www.honolulupd.org/informatioNArrest-logs/,Arrest Records,404,"","",,,,,, -3706,https://qlikapps.tucsonaz.gov/sense/app/7be19d7b-7681-437e-989c-3a2e853ba712/sheet/bf1dbba0-dda8-4b13-bc99-f76ef8c80a07/state/analysis,Stops,200,Qlik Sense,"",[],[],[],[],[],[] -3707,https://www.tucsonaz.gov/police/general-orders,Policies & Contracts,404,"","",,,,,, -3708,https://www.tampa.gov/police/citizen-review-board-minutes,Complaints & Misconduct,200,Citizen Review Board Minutes | City of Tampa,Minutes will be posted in the month following the meeting.,"[""Citizen Review Board Minutes\n""]","[""Police Department"", ""\n Citizens Review Board Minutes\n \u00b6"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]",[],[],[],[] -3709,https://www.tulsapolice.org/content/internalaffairs.aspx ,Use of Force Reports,404,"","",,,,,, -3710,https://www.honolulupd.org/wp-content/uploads/2022/01/2021-Legislative-Report.pdf,Complaints & Misconduct,200,"","",[],[],[],[],[],[] -3711,https://public.powerdms.com/TAMPA/tree/documents/431884,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -3712,http://www.slmpd.org/dept_contact.shtml,Contact Info & Agency Meta,200,Contact SLMPD,"",[],[],[],[],[],[] -3713,https://suffolkpd.org/Information-and-Policies/Historical-Traffic-Stop-Data,Stops,200," - Historical Traffic Stop Data -","","[""Contact Us""]",[],[],"[""Facebook"", ""Facebook en Espa\u00f1ol"", ""Twitter"", ""YouTube"", ""Instagram"", ""Nixle"", ""Phone Directory"", ""Helpful Numbers"", ""852-Cops (2677)""]","[""Suffolkcountyny.gov"", ""Text Only Version"", ""This website provides valuable forms and information in order to address the needs of our community. If you have any questions or need additional information, please contact the Department at 631-852-6000 or email us at SCPDINFO@suffolkcountyny.gov. Interpretation services are available for individuals with Limited English Proficiency.""]",[] -3714,https://www.crimemapping.com/map/agency/165,Crime Maps & Reports,200,CrimeMapping.com - Helping You Build a Safer Community,"",[],[],[],[],[],[] -3715,"https://www.cityprotect.com/map/list/agencies?toDate=2021-12-26T23:59:59.999Z&fromDate=2021-12-23T00:00:00.000Z&pageSize=2000&parentIncidentTypeIds=149,150,148,8,97,104,165,98,100,179,178,180,101,99,103,163,168,166,12,161,14,16,15&zoomLevel=11&latitude=32.235000308515644&longitude=-110.95136753972832&days=1,2,3,4,5,6,7&startHour=0&endHour=24&timezone=%2B00:00&relativeDate=custom",Crime Maps & Reports,200,CityProtect,"",[],[],[],[],[],[] -3716,https://www.suffolkcountyny.gov/Portals/0/formsdocs/Boardofethics/Suffolk%20County%20SOP%20Manual-1.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3717,https://data-stlcogis.opendata.arcgis.com/datasets/stlcogis::2018-ucr-part-1-crimes-july-dec/about,Crime Statistics,200,2018 UCR Part 1 Crimes July-Dec,2018 Part 1 Crimes July-Dec for multiple police departments in St. Louis County (see description for details).,[],[],[],[],[],[] -3718,https://gis2-cityoftulsa.opendata.arcgis.com/,List of Data Sources,200,City of Tulsa - Open Data,"Explore our open data and tools, and use it build insights of your own.",[],[],[],[],[],[] -3719,https://www.slmpd.org/images/2020_Annual_Report.pdf,Crime Statistics,200,"","",[],[],[],[],[],[] -3720,https://www.crimemapping.com/map/sd/siouxfalls#,Crime Maps & Reports,200,CrimeMapping.com - Helping You Build a Safer Community,"",[],[],[],[],[],[] -3721,https://www.stlouis-mo.gov/data/index.cfm,List of Data Sources,200,Open Data | City of St. Louis ,"","[""City of St. Louis Open Data""]","[""Alerts and Announcements"", ""Get Started"", ""Recently Added"", ""Dashboards"", ""Datasets By Topic"", ""Quick Stats"", ""Data by Format"", ""Data By Department"", ""Data by Tag"", ""All Datasets"", ""More Data and Reports"", ""Social Media and Feeds"", ""Site Navigation"", ""Assistance"", ""Contact Us"", ""\nYou are leaving the City of St. Louis website\n""]",[],"[""\nBusiness and Industry\n"", ""\nCommunity\n"", ""\nEducation and Training\n"", ""\nEmployment, Jobs, and Careers\n"", ""\nEnvironment\n"", ""\nGovernment\n"", ""\nHealth\n"", ""\nHousing\n"", ""\nLaw, Safety, and Justice\n"", ""\nLeisure and Culture\n"", ""\nTransportation, Infrastructure, and Utilities\n"", ""\nUrban Development and Planning\n""]",[],[] -3722,https://opendata.suffolkcountyny.gov/,List of Data Sources,200,"Suffolk County, New York Open Data",Suffolk County Open Data,[],[],[],[],[],[] -3723,https://www.tulsapolice.org/content/internalaffairs.aspx ,Officer Involved Shootings,404,"","",,,,,, -3724,https://www.tulsapolice.org/contact-tpd/contact-usphone.aspx,Contact Info & Agency Meta,404,"","",,,,,, -3725,https://dataworks.siouxfalls.org/,List of Data Sources,200,City of Sioux Falls GIS,City of Sioux Falls GIS,[],[],[],[],[],[] -3726,https://www.tucsonaz.gov/files/police/general-orders/2000USE_OF_FORCE.pdf,Policies & Contracts,404,"","",,,,,, -3727,https://suffolkpd.org/Contact-Us,Contact Info & Agency Meta,200," - Contact Us -","","[""Contact Us""]","[""Contact Us""]",[],"[""Facebook"", ""Facebook en Espa\u00f1ol"", ""Twitter"", ""YouTube"", ""Instagram"", ""Nixle"", ""Phone Directory"", ""Helpful Numbers"", ""852-Cops (2677)""]","[""Suffolkcountyny.gov"", ""Text Only Version"", ""This website provides valuable forms and information in order to address the needs of our community. If you have any questions or need additional information, please contact the Department at 631-852-6000 or email us at SCPDINFO@suffolkcountyny.gov. Interpretation services are available for individuals with Limited English Proficiency.""]",[] -3728,https://suffolkcountyny.gov/Police-Reform/Resources,Complaints & Misconduct,200," - Resources -","Suffolk County, New York has a vibrant history, illustrated in our important Native American and Revolutionary-era historical sites as well as the lab where DNA was discovered.","[""Resources"", "" Contact Us:""]",[],"["" \n"", ""public\u200b.input\u200b@suffolkcountyny\u200b.gov""]",[],"[""Text Only Version""]",[] -3729,https://www.slmpd.org/images/2020_Annual_Report.pdf,Calls for Service,200,"","",[],[],[],[],[],[] -3730,https://stlouiscountypolice.com/st-louis-county-municipal-crime-map/,Crime Maps & Reports,200,St. Louis County Crime Map - St. Louis County Police,"","[""St. Louis County and Municipal Crime Map""]",[],[],[],"[""""]",[] -3731,https://data-stlcogis.opendata.arcgis.com/apps/st-louis-county-police-department-uses-of-force/explore,Use of Force Reports,404,"","",,,,,, -3732,https://www.stlouis-mo.gov/government/city-laws/ordinances/ordinance.cfm?ord=71186,Policies & Contracts,200,Ordinance 71186 -- Police Use of Force Policies ,"","[""Ordinance 71186""]","[""Alerts and Announcements"", ""Summary"", ""Download"", ""Overview"", ""Legislative History"", ""Related"", ""Social Media and Feeds"", ""Site Navigation"", ""Assistance"", ""Contact Us"", ""\nYou are leaving the City of St. Louis website\n""]","[""\n\nLaws and Lawmaking\n\n\n\n\n"", ""\n\nFirst Reading\n\n"", ""\n\nSecond Reading\n\n"", ""\n\nPerfection\n\n"", ""\n\nThird Reading\n\n""]",[],[],[] -3733,https://www.siouxfalls.org/police/annual-report,Crime Statistics,-1,"","",,,,,, -3734,https://www.tulsapolice.org/media/Policy%20Manual10012021_Redacted.pdf,Policies & Contracts,404,"","",,,,,, -3735,https://www.suffolkcountysheriffsoffice.com/use-of-force-policy,Policies & Contracts,404,"","",,,,,, -3736,https://public.powerdms.com/TAMPA/documents/424130,Policies & Contracts,200,"","",[],[],[],[],[],[] -3737,https://qlikapps.tucsonaz.gov/sense/app/d9940d02-7edc-4a05-9d49-4c8fec425638/sheet/59109cf4-6bf8-4a25-a613-e3c6328825e6/state/analysis,Use of Force Reports,200,Qlik Sense,"",[],[],[],[],[],[] -3738,https://suffolkcountyny.gov/Portals/0/formsdocs/police%20reform/911%20Call%20Center%20Data.pdf,Calls for Service,200,"","",[],[],[],[],[],[] -3739,https://data.honolulu.gov/,List of Data Sources,200,Honolulu - Open Data Portal | Honolulu - Open Data Portal,"","[""Open Data Honolulu""]","[""Menu""]",[],"[""Honolulu 311"", ""Building Permits"", ""Crime Incidents"", ""Traffic Incidents""]",[],[] -3740,https://www.honolulupd.org/informatioNAnnual-report/,Crime Statistics,404,"","",,,,,, -3741,https://www.tampa.gov/police/contact-us,Contact Info & Agency Meta,200,Contact Us - Police | City of Tampa,"","[""Contact Us - Police \n""]","[""Police Department"", ""Key Services"", ""Report A Problem"", ""Contact"", ""Connect With Us""]","[""For Emergencies (Police - Fire - Medical) "", ""DIAL 9-1-1"", ""For Non-Emergencies "", ""\u00a0call: (813) 231-6130"", ""TPD Weekday (M-F) Phone Numbers"", ""Other Phone Numbers""]","[""You may also send a NON EMERGENCY message online"", ""Other Agencies""]",[],[] -3742,https://www.slmpd.org/images/2020_Annual_Report.pdf,Arrest Records,200,"","",[],[],[],[],[],[] -3743,https://www.tulsapolice.org/content/internalaffairs.aspx,Complaints & Misconduct,404,"","",,,,,, -3744,https://www.honolulupd.org/contact-us/,Contact Info & Agency Meta,200,Contact Us - Honolulu Police Department,Honolulu Police Department Contact Us,"[""\n\r\n\t\tHonolulu Police Department\r\n\t\tKa 'Oihana M\u0101ka'i o Honolulu\n\n"", ""Contact Us""]","[""Primary Sidebar"", ""Footer""]","[""The Honolulu Police Department (Official Site)"", ""Sitemap"", ""Additional Links""]",[],[],[] -3745,https://qlikapps.tucsonaz.gov/sense/app/f9c063fe-fb92-4b66-9b6a-75a484285ef8/sheet/599e566d-b974-446c-968f-efd06ec46a43/state/analysis,Crime Statistics,200,Qlik Sense,"",[],[],[],[],[],[] -3746,http://data-cotgis.opendata.arcgis.com/search?groupIds=b6a49faa168647d8b56e1a06bd53600f&q=calls%20for%20service,Calls for Service,200,Tucson Open Data,"This is the City of Tucson's public platform for exploring and downloading open data, discovering and building apps, and engaging to solve important local issues.",[],[],[],[],[],[] -3747,https://gisdata.tucsonaz.gov/,List of Data Sources,200,Tucson Open Data,"This is the City of Tucson's public platform for exploring and downloading open data, discovering and building apps, and engaging to solve important local issues.",[],[],[],[],[],[] -3748,https://public.powerdms.com/TAMPA/tree,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -3749,https://apps.tampagov.net/CallsForService_Webapp/Default.aspx?type=TPD,Calls for Service,200,Calls For Service,"","[""Police Calls For Service""]",[],[],[],[],[] -3750,http://www.slmpd.org/internal_affairs.shtml,Complaints & Misconduct,200,SLMPD Internal Affairs,"",[],[],[],[],[],[] -3751,https://www.siouxfalls.org/police/policy-manual,Policies & Contracts,-1,"","",,,,,, -3752,https://www.ojp.gov/pdffiles1/Digitization/151992NCJRS.pdf,Policies & Contracts,200,"","",,,,,, -3753,http://data-cotgis.opendata.arcgis.com/datasets/tucson-police-officer-involved-shooting-incidents,Officer Involved Shootings,200,Tucson Police Officer Involved Shooting Incidents,"Location of TPD Officer-Involved Shooting Incidents between January 1, 2010 and April 10, 2018.",[],[],[],[],[],[] -3754,https://www.tucsonaz.gov/police/contacts,Contact Info & Agency Meta,404,"","",,,,,, -3755,https://suffolkpd.org/Information-and-Policies/Crime-Statistics,Crime Statistics,200," - Crime Statistics -","","[""Contact Us""]","[""Crime Statistics""]",[],"[""Facebook"", ""Facebook en Espa\u00f1ol"", ""Twitter"", ""YouTube"", ""Instagram"", ""Nixle"", ""Phone Directory"", ""Helpful Numbers"", ""852-Cops (2677)""]","[""Suffolkcountyny.gov"", ""Text Only Version"", ""SCPD CRIME STATISTIC LINKS"", ""This website provides valuable forms and information in order to address the needs of our community. If you have any questions or need additional information, please contact the Department at 631-852-6000 or email us at SCPDINFO@suffolkcountyny.gov. Interpretation services are available for individuals with Limited English Proficiency.""]",[] -3756,https://city-tampa.opendata.arcgis.com/,List of Data Sources,200,City of Tampa GeoHub,City of Tampa GeoHub,[],[],[],[],[],[] -3757,https://www.wilmingtonde.gov/home/showpublisheddocument/9613/637341128548700000,Policies & Contracts,200,"","",[],[],[],[],[],[] -3758,https://www.projectcomport.org/department/WPD/useofforce/#uof-force-type,Use of Force Reports,503,"","",,,,,, -3759,https://www.honolulupd.org/information/policies/,Policies & Contracts,200,Policies - Honolulu Police Department,Honolulu Police Department Policies,"[""\n\r\n\t\tHonolulu Police Department\r\n\t\tKa 'Oihana M\u0101ka'i o Honolulu\n\n"", ""Policies""]","[""Primary Sidebar"", ""Footer""]","[""The Honolulu Police Department (Official Site)"", ""Sitemap"", ""Additional Links""]",[],[],[] -3760,https://www.vbgov.com/government/departments/police/Documents/PTO%20Field%20Guide.pdf ,Policies & Contracts,403,"","",,,,,, -3761,https://go.mpdconline.com/GO/GO_901_07.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3762,https://opendata.dc.gov/,List of Data Sources,200,Open Data DC,"On this site, the District of Columbia government shares hundreds of datasets. The District invites you to browse the data, download it as a file, analyze it with your tools, or build apps using our APIs.",[],[],[],[],[],[] -3763,https://policecomplaints.dc.gov/page/annual-reports-for-OPC,Complaints & Misconduct,200,Annual Reports | office of police complaints,"The Office of Police Complaints details its work each fiscal year and includes statistics about the complaints received by the agency, as well as information regarding the agency's accomplishments. 2023 Annual Report 2023 Annual Report 2022 Annual Report 2022 Annual Report 2021 Annual Report","[""office of police complaints"", """", ""Annual Reports""]","[""DC Agency Top Menu"", ""Search form"", ""About OPC"", ""Office of Police Complaints""]","[""The Office of Police Complaints details its work each fiscal year and includes statistics about the complaints received by the agency, as well as information regarding the agency's accomplishments."", ""2023 Annual Report"", ""2022 Annual Report"", ""2021\u00a0Annual Report"", ""2020 Annual Report"", ""2019\u00a0Annual Report"", ""2018\u00a0Annual Report"", ""2017 Annual Report"", ""2016 Annual Report"", ""2015 Annual Report"", ""2014 Annual Report"", ""2013 Annual Report"", ""2012 Annual Report"", ""2011 Annual Report"", ""2010 Annual Report"", ""2009 Annual Report"", ""2008 Annual Report"", ""2007 Annual Report"", ""2006 Annual Report"", ""2005 Annual Report"", ""2004 Annual Report"", ""2003 Annual Report"", ""2002 Annual Report"", ""2001 Annual Report""]",[],[],"[""Office of Police Complaints""]" -3764,https://www.wichita.gov/WPD/Pages/PublicRelations.aspx,Arrest Records,404,"","",,,,,, -3765,https://www.honolulupd.org/wp-content/uploads/2020/01/ManualsofOperations-07-27-2018-14-36-18.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3766,https://www.vbgov.com/government/departments/police/profstanddiv/Documents/2019%20Use%20of%20Force%20Report%20Redacted.pdf ,Use of Force Reports,403,"","",,,,,, -3767,https://mpdc.dc.gov/page/mpd-annual-reports,Complaints & Misconduct,200,MPD Annual Reports | mpdc,Strategic Plan Update 2023 The 2023 Strategic Plan Update outlines many of the strategies and approaches underway by the members of the Metropolitan Police Department.  Published September 2023  Strategic Plan Update 2023  ,"[""MPD Annual Reports""]","[""mpdc"", ""Public Transparency""]","[""Strategic Plan Update 2023"", ""Department Annual Reports"", ""Policing in DC""]",[],[],"[""MPDC""]" -3768,https://www.wichita.gov/WPD/SupportServices/Pages/CrimeStats.aspx,Crime Statistics,404,"","",,,,,, -3769,https://data.vbgov.com/dataset/police-incident-reports ,Crime Statistics,-1,"","",,,,,, -3770,https://www.wichita.gov/WPD/Pages/Directory.aspx,Contact Info & Agency Meta,404,"","",,,,,, -3771,https://wilsonnc.policetocitizen.com/DailyBulletin ,Crime Statistics,200,Police To Citizen,"",[],[],[],[],[],[] -3772,https://policecomplaints.dc.gov/page/use-force-reports,Use of Force Reports,200,Use of Force Reports | office of police complaints,"The Office of Police Complaints issues an annual report on the Metropolitan Police Department's (MPD) use of force in the District each fiscal year, which highlights the policies, procedures, and practices regarding MPD's officer use of force.  In addition, the report includes data on all types of force incidents involving MPD officers.   2022 Use of Force Report","[""office of police complaints"", """", ""Use of Force Reports""]","[""DC Agency Top Menu"", ""Search form"", ""About OPC"", ""Office of Police Complaints""]",[],[],[],"[""Office of Police Complaints""]" -3773,"https://www.crimemapping.com/map/location/wilmington,%20delaware?id=",Crime Maps & Reports,200,CrimeMapping.com - Helping You Build a Safer Community,"",[],[],[],[],[],[] -3774,https://www.vbgov.com/government/departments/police/Documents/2020%20AnnualReport.pdf ,Stops,403,"","",,,,,, -3775,https://wilsonnc.policetocitizen.com/DailyBulletin,Calls for Service,200,Police To Citizen,"",[],[],[],[],[],[] -3776,https://mpdc.dc.gov/,Contact Info & Agency Meta,200,| mpdc,"","[""mpdc""]","["" MPDC Homepage Search Section "", ""Seventh District Community Walk"", ""Pages"", ""Featured Services"", ""Featured News"", ""Upcoming Events"", "" Public Transparency "", ""Public Transparency"", "" Impactful Community Engagement "", ""Impactful Community Engagement"", "" Social Media "", ""Social Media""]","[""File a Police Report"", ""Contact Police"", ""Legal Firearms"", ""Strategic Plan Update 2023"", ""MPD Rewards "", ""Join MPD"", ""More Services""]",[],[],"[""MPDC""]" -3777,https://www.wichita.gov/WPD/WPDPolicyAndProcedureManual/Policy%20210%20-%20In-Service%20Training.pdf,Policies & Contracts,404,"","",,,,,, -3778,https://policecomplaints.dc.gov/page/use-force-reports,Officer Involved Shootings,200,Use of Force Reports | office of police complaints,"The Office of Police Complaints issues an annual report on the Metropolitan Police Department's (MPD) use of force in the District each fiscal year, which highlights the policies, procedures, and practices regarding MPD's officer use of force.  In addition, the report includes data on all types of force incidents involving MPD officers.   2022 Use of Force Report","[""office of police complaints"", """", ""Use of Force Reports""]","[""DC Agency Top Menu"", ""Search form"", ""About OPC"", ""Office of Police Complaints""]",[],[],[],"[""Office of Police Complaints""]" -3779,https://www.wilmingtonde.gov/Home/ShowDocument?id=9177,Policies & Contracts,200,"","",[],[],[],[],[],[] -3780,https://dcatlas.dcgis.dc.gov/crimecards/,Crime Maps & Reports,200,Page Not Found,"",[],"[""Page Not Found - DC GIS""]","[""\r\n\t\t\t\tThe page you requested cannot be found.""]","[""\r\n\t\t\t\tYou may want to try any of the following:""]",[],[] -3781,https://www.wilmingtonde.gov/government/city-departments/department-of-police,Contact Info & Agency Meta,200," - - Wilmington Police Department | Wilmington, DE - -","","[""Wilmington, DE"", ""Wilmington Police Department""]","[""Visit the City's COVID-19 Information Center."", ""Jump to subpage..."", ""\u00a0CONTACT DIRECTORY"", ""\u00a0OFFICE DIRECTORY""]","["""", ""\n"", ""Mission Statement"", ""Advisories and Alerts"", "" ""]","[""The application process for the 103rd Wilmington Police Academy is now open! Applications are due March 1."", ""Click here to learn more and apply today!\u00a0"", ""Wilfredo Campos"", ""Matthew Hall"", ""Anthony Bowers""]",[],[] -3782,https://opendata.dc.gov/search?collection=Dataset&q=crime%20incidents,Stops,200,Open Data DC,"On this site, the District of Columbia government shares hundreds of datasets. The District invites you to browse the data, download it as a file, analyze it with your tools, or build apps using our APIs.",[],[],[],[],[],[] -3783,https://wilsonnc.policetocitizen.com/EventMap ,Crime Maps & Reports,200,Police To Citizen,"",[],[],[],[],[],[] -3784,https://www.wilsonnc.org/residents/city-services/all-departments/police,Contact Info & Agency Meta,200," - - Police | Wilson, NC - -","","[""Wilson, NC"", ""Police""]","[""Popular Searches"", ""Jump to subpage..."", ""Contact Us"", ""\nEmpty heading"", ""Message from Chief Biddle"", """", ""Empty heading"", ""Empty heading"", ""Mission/Vision"", ""Core Values"", ""In case of an emergency please call 911.\u00a0An emergency is considered a situation that poses immediate risk to health, life, property or environment. "", ""If it is not an emergency, but you still need an officer to respond please call 252-237-8300."", ""\u00a0"", ""Links"", ""Come & Visit"", ""Connect With Us""]","[""If you want to recognize a Wilson Police officer or Wilson Police employee message us at\u00a0Wilson Police Department Facebook\u00a0or contact \u00a0Sergeant E.\u00a0McInerny and write us a comment.""]",[],[],[] -3785,https://opendata.dc.gov/datasets/adult-arrests,Arrest Records,200,Adult Arrests,"This data includes adult arrests made by the Metropolitan Police Department (MPD). The information within this report pertains to reports entered into MPD’s Record Management System (Cobalt) whereby an arrest occurred. Totals are based on the most serious arrest charge (i.e., each row denotes one arrest, not one charge), and one person may be booked on more than one arrest charge. - -Due to privacy considerations, exact CCNs and arrest numbers for these arrest datasets are not provided. In lieu, hash numbers are provided for CNN which allows individuals to determine whether there are multiple arrests associated with one event. Additionally, arrest numbers can be linked directly to an individual and therefore DC government does not provide this more generally, but again as hash numbers.",[],[],[],[],[],[] -3786,https://county-data-wilsoncounty.opendata.arcgis.com/,List of Data Sources,200,Wilson County GIS Open Data,"Discover, analyze and download data from Wilson County GIS Open Data. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",[],[],[],[],[],[] -3787,https://www.wichita.gov/WPD/Citizen%20Review%20Board/2021-09-23%20Tecnical%20Report%202019-2020%20Citation%20Analysis%20WPD%20Final.pdf,Stops,404,"","",,,,,, -3788,https://mpdc.dc.gov/page/mpd-annual-reports,Calls for Service,200,MPD Annual Reports | mpdc,Strategic Plan Update 2023 The 2023 Strategic Plan Update outlines many of the strategies and approaches underway by the members of the Metropolitan Police Department.  Published September 2023  Strategic Plan Update 2023  ,"[""MPD Annual Reports""]","[""mpdc"", ""Public Transparency""]","[""Strategic Plan Update 2023"", ""Department Annual Reports"", ""Policing in DC""]",[],[],"[""MPDC""]" -3789,https://www.vbgov.com/government/departments/police/profstanddiv/Pages/ia-stats.aspx ,Complaints & Misconduct,404,"","",,,,,, -3790,https://www.wilmingtonde.gov/government/public-safety/wilmington-police-department/office-of-professional-standards/law-enforcement-accreditation,Complaints & Misconduct,200," - - Annual OPS Statistical Summary | Wilmington, DE - -","","[""Wilmington, DE"", ""Annual OPS Statistical Summary""]","[""Visit the City's COVID-19 Information Center."", ""Jump to subpage..."", ""\u00a0CONTACT DIRECTORY"", ""\u00a0OFFICE DIRECTORY""]",[],"[""Wilfredo Campos"", ""Matthew Hall"", ""Anthony Bowers""]",[],[] -3791,https://data.vbgov.com/,List of Data Sources,-1,"","",,,,,, -3792,https://www.vbgov.com/government/departments/police/Documents/05.01%20Use%20of%20Force.pdf ,Policies & Contracts,403,"","",,,,,, -3793,https://www.wichita.gov/WPD/Pages/ProfessionalStandards.aspx,Complaints & Misconduct,404,"","",,,,,, -3794,https://www.wichita.gov/WPD/Pages/Policy.aspx,Policies & Contracts,404,"","",,,,,, -3795,https://www.vbgov.com/government/departments/police/Pages/PoliciesAndFieldGuides.aspx ,Policies & Contracts,404,"","",,,,,, -3796,https://www.wichita.gov/WPD/WPDPolicyAndProcedureManual/Policy%20906%20-%20Use%20of%20Force.pdf,Policies & Contracts,404,"","",,,,,, -3797,https://wilsonnc.policetocitizen.com/DailyBulletin,Arrest Records,200,Police To Citizen,"",[],[],[],[],[],[] -3798,https://opendata.dc.gov/search?collection=Dataset&q=crime%20incidents,Crime Statistics,200,Open Data DC,"On this site, the District of Columbia government shares hundreds of datasets. The District invites you to browse the data, download it as a file, analyze it with your tools, or build apps using our APIs.",[],[],[],[],[],[] -3799,https://www.wilmingtonde.gov/government/public-safety/wilmington-police-department/policies-and-procedures,Policies & Contracts,200," - - WPD Policies and Procedures | Wilmington, DE - -","","[""Wilmington, DE"", ""WPD Policies and Procedures""]","[""Visit the City's COVID-19 Information Center."", ""Jump to subpage..."", ""\u00a0CONTACT DIRECTORY"", ""\u00a0OFFICE DIRECTORY""]",[],"[""Wilfredo Campos"", ""Matthew Hall"", ""Anthony Bowers""]",[],[] -3800,https://mpdc.dc.gov/node/423092,Policies & Contracts,200,Written Directives: General Orders | mpdc,"In order to help promote transparency, the MPD has posted policy statements issued by the Chief of Police (e.g., general orders, executive orders, and other directives) that are currently in effect for the department. As new and updated policies are published, they will be posted here. For additional information, the Policy and Standards Branch can be contacted in writing at 441 4th Street, NW, Washington, DC, 20001 or at mpd.policy@dc.gov.","[""Written Directives: General Orders""]","[""mpdc"", ""Public Transparency""]",[],[],[],"[""MPDC""]" -3801,https://www.vbgov.com/government/departments/police/Pages/contact-us.aspx ,Contact Info & Agency Meta,404,"","",,,,,, -3802,https://data-cityofwichita.hub.arcgis.com/,List of Data Sources,200,City of Wichita Open Data Portal with Apps,"This is the community's public platform for exploring and downloading open data, discovering and building apps, and engaging to solve important local issues. You can analyze and combine Open Datasets using maps, as well as develop new web and mobile ",[],[],[],[],[],[] -3803,https://www.honolulupd.org/wp-content/uploads/2020/08/HPD-Policy-104-04-09-2021.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -3804,https://ago.mo.gov/home/vehicle-stops-report/,Stops,200,Vehicle Stops Report | Attorney General Office of Missouri,"","[""Vehicle Stops Report""]","[""2020 Vehicle Stops Report Changes""]","[""Past Reports""]",[],"[""Explore Section""]",[] -3805,https://gbi.georgia.gov/news/2022-10-09/2022-officer-involved-shootings,Officer Involved Shootings,200,2022 Officer Involved Shootings | Georgia Bureau of Investigation,Information regarding 2022 officer involved shooting investigations in Georgia,"[""\n 2022 Officer Involved Shootings\n \n ""]","[""Main navigation"", ""Search this site"", ""Breadcrumb"", ""\n\n News\n \n\n\n\n"", ""How can we help?"", ""About Us""]","[""Popular searches"", ""Call Us"", ""Online Tip Form"", ""Visit""]",[],[],[] -3806,https://pittsburghpa.gov/police/domestic-violence-resource-guide,Resources,200,Domestic Violence Resource Guide | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Domestic Violence Resource Guide"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""Download the Domestic Violence Resource Guide"", ""412-323-7250"", ""Are you concerned that you or someone you know is in an abusive relationship?"", ""Women's Center & Shelter of Greater Pittsburgh (WC&S)"", ""Bright Sky App (For IOS and Android)"", ""Protection From Abuse (PFA) Order"", ""Additional Resources"", ""SECURITY ALERT""]","[""DEPARTMENT MENU""]","[""Police Links"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Zones"", ""Police Data"", ""Resources"", ""News""]",[],[] -3807,https://pittsburghpa.gov/police/ssd,Contact Info & Agency Meta,200,"","","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", """", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],[],[],[],[] -3808,https://pittsburghpa.gov/police/police-zone2,Contact Info & Agency Meta,200,Police Zone 2 | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Police Zone 2"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[] -3809,https://pittsburghpa.gov/police/police-zone3,Contact Info & Agency Meta,200,Police Zone 3 | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Police Zone 3"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[] -3810,https://pittsburghpa.gov/police/police-zone1,Contact Info & Agency Meta,200,Police Zone 1 | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Police Zone 1"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[] -3811,https://pittsburghpa.gov/police/headquarters,Contact Info & Agency Meta,200,Police Headquarters Contact Info | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Police Headquarters"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[] -3812,https://pittsburghpa.gov/police/police-mission,Policies & Contracts,200,Police Mission Statement | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Our Mission"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Zones"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[] -3813,https://pittsburghpa.gov/police/police-zone5,Contact Info & Agency Meta,200,Police Zone 5 | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Police Zone 5"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""Follow the link below to receive the Zone 5 Community Crime Update."", ""Visit the brand new Police Data Portal and view interactive maps that provide information on Reported Activity and Violent Crimes.""]","[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[] -3814,https://pittsburghpa.gov/police/police-administration,Contact Info & Agency Meta,200,Administration Branch | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Administration Branch"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Branches"", ""About Police"", ""Community Engagement Office"", ""Police Zones"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[] -3815,https://pittsburghpa.gov/police/police-report,Contact Info & Agency Meta,200,police report | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""File a Police Report"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""Ways to File a Police Report:"", ""How to Obtain a Copy of a Police Report:""]","[""DEPARTMENT MENU""]","[""Police Links"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Zones"", ""Police Data"", ""Resources"", ""News""]",[],[] -3816,https://pittsburghpa.gov/police/police-zone4,Contact Info & Agency Meta,200,Police Zone 4 | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Police Zone 4"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[] -3817,https://pittsburghpa.gov/police/police-zone-maps,Contact Info & Agency Meta,200,Police Zones | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Police Zones Map"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[] -3818,https://pittsburghpa.gov/police/police-branches,Contact Info & Agency Meta,200,Police Branches | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Operations Department"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]","[""Tow Pound"", ""Abandoned Cars""]","[""DEPARTMENT MENU""]","[""Police Branches"", ""About Police"", ""Community Engagement Office"", ""Police Zones"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[] -3819,https://pittsburghpa.gov/police/police-investigations,Contact Info & Agency Meta,200,Investigations Branch | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Investigations Branch"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Branches"", ""About Police"", ""Community Engagement Office"", ""Police Zones"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[] -3820,https://pittsburghpa.gov/police/police-zone6,Contact Info & Agency Meta,200,Police Zone 6 | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", ""Police Zone 6"", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Zones"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Data"", ""Resources"", ""News"", ""Police Links""]",[],[] -3821,https://munstats.pa.gov/Reports/ReportInformation2.aspx?report=CountyMuniContact,Contact Info & Agency Meta,200," - Municipal Statistics -","",[],"[""\n\r\n Content\n\n"", ""\r\n\t\t\t\t\tReport Viewer Configuration Error\r\n\t\t\t\t""]",[],[],[],[] -3822,https://docs.google.com/spreadsheets/d/1vTyShwANIG3QSOQ6T7sJqazVB2DmokJNb2t5JKXYmsQ/edit?usp=sharing,Contact Info & Agency Meta,200,Louisiana Law Enforcement Contacts - Google Sheets,"",[],[],[],[],[],[] -3823,http://www.sthelena.lavns.org/roster.aspx,Incarceration Records,200," - St. Helena Parish Jail -","",[],[],[],[],[],[] -3824,http://www.plaquemines.lavns.org/roster.aspx,Incarceration Records,200," - Plaquemines Parish Jail -","",[],[],[],[],[],[] -3825,http://www.stjames.lavns.org/roster.aspx,Incarceration Records,200," - St. James Parish Jail -","",[],[],[],[],[],[] -3826,http://www.bienville.lavns.org/roster.aspx,Incarceration Records,200," - Bienville Parish Jail -","",[],[],[],[],[],[] -3827,http://www.catahoula.lavns.org/roster.aspx,Incarceration Records,200," - Catahoula Parish Jail -","",[],[],[],[],[],[] -3828,http://www.beauregard.lavns.org/roster.aspx,Incarceration Records,200," - Beauregard Parish Jail -","",[],[],[],[],[],[] -3829,http://www.natchitoches.lavns.org/roster.aspx,Incarceration Records,200," - Natchitoches Parish Jail -","",[],[],[],[],[],[] -3830,http://www.cameron.lavns.org/roster.aspx,Incarceration Records,200," - Cameron Parish Jail -","",[],[],[],[],[],[] -3831,http://www.avoyelles.lavns.org/roster.aspx,Incarceration Records,200," - Avoyelles Parish Jail -","",[],[],[],[],[],[] -3832,http://www.jeffersondavis.lavns.org/roster.aspx,Incarceration Records,200," - Jefferson Davis Parish Jail -","",[],[],[],[],[],[] -3833,http://www.bossier.lavns.org/roster.aspx,Incarceration Records,200," - Bossier Parish Jail -","",[],[],[],[],[],[] -3834,http://www.acadia.lavns.org/roster.aspx,Incarceration Records,200," - Acadia Parish Jail -","",[],[],[],[],[],[] -3835,http://www.assumption.lavns.org/roster.aspx,Incarceration Records,200," - Assumption Parish Jail -","",[],[],[],[],[],[] -3836,http://www.lafayette.lavns.org/roster.aspx,Incarceration Records,200," - Lafayette Parish Correctional Center -","",[],[],[],[],[],[] -3837,http://www.lasalle.lavns.org/roster.aspx,Incarceration Records,200," - La Salle Parish Sheriff's Office -","",[],[],[],[],[],[] -3838,http://www.franklin.lavns.org/roster.aspx,Incarceration Records,200," - Franklin Parish Jail -","",[],[],[],[],[],[] -3839,http://www.orleans.lavns.org/roster.aspx,Incarceration Records,200," - Orleans Parish Jail -","",[],[],[],[],[],[] -3840,http://www.leesville.lavns.org/roster.asp,Incarceration Records,404,"","",,,,,, -3841,http://www.eastbatonrouge.lavns.org/roster.aspx,Incarceration Records,200," - East Baton Rouge Parish Jail -","",[],[],[],[],[],[] -3842,http://www.claiborne.lavns.org/roster.aspx,Incarceration Records,200," - Claiborne Parish Jail -","",[],[],[],[],[],[] -3843,http://www.madison.lavns.org/roster.aspx,Incarceration Records,200," - Madison Parish Jail -","",[],[],[],[],[],[] -3844,http://www.ouachita.lavns.org/roster.aspx,Incarceration Records,200," - Ouachita Parish Correctional Center -","",[],[],[],[],[],[] -3845,http://www.shreveport.lavns.org/roster.aspx,Incarceration Records,200," - Shreveport City Jail -","",[],[],[],[],[],[] -3846,http://www.bogalusa.lavns.org/roster.aspx,Incarceration Records,200," - Bogalusa Police Department -","",[],[],[],[],[],[] -3847,http://www.bossierpd.lavns.org/roster.aspx,Incarceration Records,200," - Bossier City Police Department -","",[],[],[],[],[],[] -3848,http://www.jefferson.lavns.org/roster.aspx,Incarceration Records,200," - Jefferson Parish Jail -","",[],[],[],[],[],[] -3849,http://www.stlandry.lavns.org/roster.aspx,Incarceration Records,200," - St. Landry Parish Jail -","",[],[],[],[],[],[] -3850,http://www.redriver.lavns.org/roster.aspx,Incarceration Records,200," - Red River Parish Jail -","",[],[],[],[],[],[] -3851,http://www.sabine.lavns.org/roster.aspx,Incarceration Records,200," - Sabine Parish Jail -","",[],[],[],[],[],[] -3852,http://www.richland.lavns.org/roster.aspx,Incarceration Records,200," - Richland Parish Jail -","",[],[],[],[],[],[] -3853,http://www.hammond.lavns.org/roster.aspx,Incarceration Records,200," - Hammond Police Department -","",[],[],[],[],[],[] -3854,http://www.iberia.lavns.org/roster.aspx,Incarceration Records,200," - Iberia Parish Jail -","",[],[],[],[],[],[] -3855,http://www.allen.lavns.org/roster.aspx,Incarceration Records,200," - Allen Parish Jail -","",[],[],[],[],[],[] -3856,http://www.stcharles.lavns.org/roster.aspx,Incarceration Records,200," - St. Charles Parish Nelson Coleman Correctional Center -","",[],[],[],[],[],[] -3857,http://www.morehouse.lavns.org/roster.aspx,Incarceration Records,200," - Morehouse Parish Jail -","",[],[],[],[],[],[] -3858,http://www.eastfeliciana.lavns.org/roster.aspx,Incarceration Records,200," - East Feliciana Parish Jail -","",[],[],[],[],[],[] -3859,http://www.rapides.lavns.org/roster.aspx,Incarceration Records,200," - Rapides Parish Jail -","",[],[],[],[],[],[] -3860,http://www.ascension.lavns.org/roster.aspx,Incarceration Records,200," - Ascension Parish Jail -","",[],[],[],[],[],[] -3861,http://www.stjohn.lavns.org/roster.aspx,Incarceration Records,200," - St. John the Baptist Parish Sherman Walker Correctional Facility -","",[],[],[],[],[],[] -3862,http://www.stbernard.lavns.org/roster.aspx,Incarceration Records,200," - St. Bernard Parish Jail -","",[],[],[],[],[],[] -3863,http://www.pointecoupee.lavns.org/roster.aspx,Incarceration Records,200," - Pointe Coupee Parish Jail -","",[],[],[],[],[],[] -3864,http://www.concordia.lavns.org/roster.aspx,Incarceration Records,200," - Concordia Parish Jail -","",[],[],[],[],[],[] -3865,http://www.caldwell.lavns.org/roster.aspx,Incarceration Records,200," - Caldwell Parish Jail -","",[],[],[],[],[],[] -3866,http://www.desoto.lavns.org/roster.aspx,Incarceration Records,200," - De Soto Parish Jail -","",[],[],[],[],[],[] -3867,http://www.iberville.lavns.org/roster.aspx,Incarceration Records,200," - Iberville Parish Jail -","",[],[],[],[],[],[] -3868,http://www.calcasieu.lavns.org/roster.aspx,Incarceration Records,200," - Calcasieu Parish Jail -","",[],[],[],[],[],[] -3869,http://alleghenycountyda.us/model-police-policies/,Policies & Contracts,200,Model Police Policies • Allegheny County District Attorney's Office,"","[""Model Police Policies""]",[],[],"[""Contact"", ""Connect""]",[],[] -3870,http://www.oakdale.lavns.org/roster.aspx,Incarceration Records,200," - Oakdale Police Department -","",[],[],[],[],[],[] -3871,http://www.kinder.lavns.org/roster.aspx,Incarceration Records,200," - Kinder Police Department -","",[],[],[],[],[],[] -3872,http://www.caddo.lavns.org/roster.aspx,Incarceration Records,200," - Caddo Correctional Center -","",[],[],[],[],[],[] -3873,http://www.washington.lavns.org/roster.aspx,Incarceration Records,200," - Washington Parish Jail -","",[],[],[],[],[],[] -3874,https://www.alleghenycounty.us/police/minimum-requirements-and-application-procedures.aspx,Policies & Contracts,404,"","",,,,,, -3875,https://www.alleghenycounty.us/police-academy/index.aspx,Policies & Contracts,200,"Police Academy - Allegheny County, PA","The Allegheny County Police Academy provides updated, diversified, quality instruction for recruits and continuing education for certified police officers in Allegheny County.","[""Police Academy""]","[""\r\n\t\t\t\tBasic Training\r\n\t\t\t"", ""\r\n\t\t\t\tResources\r\n\t\t\t"", ""\r\n\t\t\t\tMIST, Ongoing Training, and Specialized Services\r\n\t\t\t"", ""About the Police Academy""]","["""", ""\u00a0"", ""Required Training"", ""Contact Us"", ""Quick Links"", ""Get Social""]",[],[],"[""Use of Force"", ""Implicit Bias"", ""De-escalation""]" -3876,http://www.tensas.lavns.org/roster.aspx,Incarceration Records,200," - Tensas Parish Jail -","",[],[],[],[],[],[] -3877,http://www.winnfield.lavns.org/roster.aspx,Incarceration Records,200," - Winnfield Police Department -","",[],[],[],[],[],[] -3878,http://www.sulphur.lavns.org/roster.aspx,Incarceration Records,200," - Sulphur Police Department -","",[],[],[],[],[],[] -3879,https://www.alleghenycounty.us/police-academy/leadership-and-staff.aspx,Contact Info & Agency Meta,404,"","",,,,,, -3880,https://www.alleghenycounty.us/emergency-services/police-departments.aspx,Contact Info & Agency Meta,404,"","",,,,,, -3881,http://www.tangipahoa.lavns.org/roster.aspx,Incarceration Records,200," - Tangipahoa Parish Jail -","",[],[],[],[],[],[] -3882,https://www.alleghenycounty.us/police/staff/superintendent.aspx,Contact Info & Agency Meta,404,"","",,,,,, -3883,http://www.villeplatte.lavns.org/roster.aspx,Incarceration Records,200," - Ville Platte Police Department -","",[],[],[],[],[],[] -3884,https://www.alleghenycounty.us/police/county-police-k9-unit.aspx,Contact Info & Agency Meta,404,"","",,,,,, -3885,http://www.stmartin.lavns.org/roster.aspx,Incarceration Records,200," - St. Martin Parish Jail -","",[],[],[],[],[],[] -3886,http://www.sttammany.lavns.org/roster.aspx,Incarceration Records,200," - St. Tammany Parish Jail -","",[],[],[],[],[],[] -3887,http://www.westfeliciana.lavns.org/roster.aspx,Incarceration Records,200," - West Feliciana Parish Detention Center -","",[],[],[],[],[],[] -3888,http://www.webster.lavns.org/roster.aspx,Incarceration Records,200," - Webster Parish Jail -","",[],[],[],[],[],[] -3889,http://www.stmary.lavns.org/roster.aspx,Incarceration Records,200," - St. Mary Parish Jail -","",[],[],[],[],[],[] -3890,http://www.terrebonne.lavns.org/roster.aspx,Incarceration Records,200," - Terrebonne Parish Jail -","",[],[],[],[],[],[] -3891,http://www.vernon.lavns.org/roster.aspx,Incarceration Records,200," - Vernon Parish Jail -","",[],[],[],[],[],[] -3892,http://www.westcarroll.lavns.org/roster.aspx,Incarceration Records,200," - West Carroll Parish Jail -","",[],[],[],[],[],[] -3893,http://www.winn.lavns.org/roster.aspx,Incarceration Records,200," - Winn Parish Jail -","",[],[],[],[],[],[] -3894,http://www.westbatonrouge.lavns.org/roster.aspx,Incarceration Records,200," - West Baton Rouge Parish Jail -","",[],[],[],[],[],[] -3895,https://www.alleghenycounty.us/police/community-programs.aspx,Misc Police Activity,404,"","",,,,,, -3896,https://www.broadcastify.com/listen/ctid/2242,Dispatch Recordings,200,Allegheny County Pennsylvania Live Audio Feeds,"","[""Allegheny County Pennsylvania Live Audio Feeds ""]","[""Live Feed Listing for Allegheny County""]",[],[],[],[] -3897,https://wp.sbcounty.gov/sheriff/policiesoperatingprocedures-department/,Policies & Contracts,200,Department – San Bernardino County Sheriff's Department,Policies/Operating Procedures Department The following table contains records regarding the Sheriff’s Department’s Policies and Procedures. Back to Policy Mandates Document DateDocument TitleStation/Division07/24/2023San Bernardino County Sheriff’s Department ManualSan Bernardino County Sheriff’s...,"[""Policies/Operating Procedures""]","[""Calendar"", ""\n\t\tCalendar of Events\t""]","[""\n\n\t\t\t\t\t\tM\t\t\t\t\t\n\n\t\t\t\t\t\tMon\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tT\t\t\t\t\t\n\n\t\t\t\t\t\tTue\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tW\t\t\t\t\t\n\n\t\t\t\t\t\tWed\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tT\t\t\t\t\t\n\n\t\t\t\t\t\tThu\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tF\t\t\t\t\t\n\n\t\t\t\t\t\tFri\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tS\t\t\t\t\t\n\n\t\t\t\t\t\tSat\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\tS\t\t\t\t\t\n\n\t\t\t\t\t\tSun\t\t\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t1\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t1\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t2\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t2\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t3\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t3\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t4\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t4\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t5\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t5\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t6\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t6\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t7\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t7\t\t\t\n"", ""\n\n\t\t\t1 event,\n\t\t\n\n\t\t\t8\t\t\n"", ""\n\n\t\t1 event,\n\t\n\n\n\t\t\t\t8\t\t\t\n\n"", ""\n\tCrisis Intervention Training"", ""\n\tCrisis Intervention Training"", ""\n\n\t\tCrisis Intervention Training\t\n"", ""\n\n\t\t\t3 events,\n\t\t\n\n\t\t\t9\t\t\n"", ""\n\n\t\t3 events,\n\t\n\n\n\t\t\t\t9\t\t\t\n\n"", ""\n\tCrisis Intervention Training"", ""\n\tDeputy Leadership Institute"", ""\n\tDeputy Leadership Institute"", ""\n\n\t\tDeputy Leadership Institute\t\n"", ""\n\tAdvanced Gang Awareness"", ""\n\tAdvanced Gang Awareness"", ""\n\n\t\tAdvanced Gang Awareness\t\n"", ""\n\n\t\t\t3 events,\n\t\t\n\n\t\t\t10\t\t\n"", ""\n\n\t\t3 events,\n\t\n\n\n\t\t\t\t10\t\t\t\n\n"", ""\n\tCrisis Intervention Training"", ""\n\tDeputy Leadership Institute"", ""\n\tAdvanced Gang Awareness"", ""\n\n\t\t\t2 events,\n\t\t\n\n\t\t\t11\t\t\n"", ""\n\n\t\t2 events,\n\t\n\n\n\t\t\t\t11\t\t\t\n\n"", ""\n\tCrisis Intervention Training"", ""\n\tAdvanced Gang Awareness"", ""\n\n\t\t\t1 event,\n\t\t\n\n\t\t\t12\t\t\n"", ""\n\n\t\t1 event,\n\t\n\n\n\t\t\t\t12\t\t\t\n\n"", ""\n\tCrisis Intervention Training"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t13\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t13\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t14\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t14\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t15\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t15\t\t\t\n"", ""\n\n\t\t\t2 events,\n\t\t\n\n\t\t\t16\t\t\n"", ""\n\n\t\t2 events,\n\t\n\n\n\t\t\t\t16\t\t\t\n\n"", ""\n\tCal-Gang Computer System"", ""\n\tCal-Gang Computer System"", ""\n\n\t\tCal-Gang Computer System\t\n"", ""\n\tWellness"", ""\n\tWellness"", ""\n\n\t\tWellness\t\n"", ""\n\n\t\t\t2 events,\n\t\t\n\n\t\t\t17\t\t\n"", ""\n\n\t\t2 events,\n\t\n\n\n\t\t\t\t17\t\t\t\n\n"", ""\n\tCal-Gang Computer System"", ""\n\tWellness"", ""\n\n\t\t\t1 event,\n\t\t\n\n\t\t\t18\t\t\n"", ""\n\n\t\t1 event,\n\t\n\n\n\t\t\t\t18\t\t\t\n\n"", ""\n\tWellness"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t19\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t19\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t20\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t20\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t21\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t21\t\t\t\n"", ""\n\n\t\t\t1 event,\n\t\t\n\n\t\t\t22\t\t\n"", ""\n\n\t\t1 event,\n\t\n\n\n\t\t\t\t22\t\t\t\n\n"", ""\n\tTraffic Collision Investigation, Basic"", ""\n\tTraffic Collision Investigation, Basic"", ""\n\n\t\tTraffic Collision Investigation, Basic\t\n"", ""\n\n\t\t\t1 event,\n\t\t\n\n\t\t\t23\t\t\n"", ""\n\n\t\t1 event,\n\t\n\n\n\t\t\t\t23\t\t\t\n\n"", ""\n\tTraffic Collision Investigation, Basic"", ""\n\n\t\t\t1 event,\n\t\t\n\n\t\t\t24\t\t\n"", ""\n\n\t\t1 event,\n\t\n\n\n\t\t\t\t24\t\t\t\n\n"", ""\n\tTraffic Collision Investigation, Basic"", ""\n\n\t\t\t1 event,\n\t\t\n\n\t\t\t25\t\t\n"", ""\n\n\t\t1 event,\n\t\n\n\n\t\t\t\t25\t\t\t\n\n"", ""\n\tTraffic Collision Investigation, Basic"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t26\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t26\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t27\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t27\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t28\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t28\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t29\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t29\t\t\t\n"", ""\n\n\t\t\t1 event,\n\t\t\n\n\t\t\t30\t\t\n"", ""\n\n\t\t1 event,\n\t\n\n\n\t\t\t\t30\t\t\t\n\n"", ""\n\n\t\tCourtroom Procedures\t\n"", ""\n\n\t\tCourtroom Procedures\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t31\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t31\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t1\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t1\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t2\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t2\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t3\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t3\t\t\t\n"", ""\n\n\t\t\t0 events,\n\t\t\n\n\t\t\t4\t\t\n"", ""\n\n\t\t0 events,\n\t\n\n\t\t\t\t\t4\t\t\t\n"", ""\n\n\t\tCrisis Intervention Training\t\n"", ""\n\n\t\tCrisis Intervention Training\t\n"", ""\n\n\t\tDeputy Leadership Institute\t\n"", ""\n\n\t\tAdvanced Gang Awareness\t\n"", ""\n\n\t\tCrisis Intervention Training\t\n"", ""\n\n\t\tDeputy Leadership Institute\t\n"", ""\n\n\t\tAdvanced Gang Awareness\t\n"", ""\n\n\t\tCrisis Intervention Training\t\n"", ""\n\n\t\tAdvanced Gang Awareness\t\n"", ""\n\n\t\tCrisis Intervention Training\t\n"", ""\n\n\t\tCal-Gang Computer System\t\n"", ""\n\n\t\tWellness\t\n"", ""\n\n\t\tCal-Gang Computer System\t\n"", ""\n\n\t\tWellness\t\n"", ""\n\n\t\tWellness\t\n"", ""\n\n\t\tTraffic Collision Investigation, Basic\t\n"", ""\n\n\t\tTraffic Collision Investigation, Basic\t\n"", ""\n\n\t\tCourtroom Procedures\t\n"", ""\n\n\t\tTraffic Collision Investigation, Basic\t\n"", ""\n\n\t\tTraffic Collision Investigation, Basic\t\n"", ""\n\n\t\tCourtroom Procedures\t\n"", ""Quick Links""]","[""NON-EMERGENCY DISPATCH""]",[],[] -3898,https://www.sanjoseca.gov/your-government/departments-offices/information-technology/digital-privacy/past-privacy-decisions,Policies & Contracts,200," - - Privacy in Practice | City of San José - -","","[""City of San Jos\u00e9"", ""Privacy in Practice""]","[""Popular Searches"", ""Jump to subpage..."", ""Privacy Manual"", ""Past Privacy Decisions"", ""Not Approved"", ""Smart Poles Pilot (2010's)"", ""Child-tracking bands"", ""Homeless-tracking cameras"", ""Share ALPR with companies"", ""Approved with Further Review"", ""Fire safety inspections"", ""Labor compliance inspections"", ""AI traffic cameras"", ""Youth intervention services"", ""X-ray bomb detection"", ""Energy price data"", ""ALPR"", ""Police evidence management"", ""Approved with a Brief Review"", ""City purchase of photo scanner"", ""Library purchase of laptops"", ""Airport software renewal"", ""Contact us"", ""Need More Info?"", ""Employees""]","[""Not approved"", ""Approved with further review"", ""Approved with a brief review""]",[],[],[] -3899,https://cde.ucr.cjis.gov/,Crime Maps & Reports,200,"","",[],[],[],[],[],[] -3900,https://www.openrecords.pa.gov/RTKL/AOROSearch.cfm,Records Request Info,200,OOR - Find Agency Open Records Officers,"","[""Find Agency Open Records Officers""]",[],"[""Open Records Officer Search"", ""Registering Agency Open Records Officers""]",[],[],[] -3901,https://publicrec.hillsclerk.com/,Court Cases,200,publicrec.hillsclerk.com - /,"","[""publicrec.hillsclerk.com - /""]",[],[],[],[],[] -3902,https://github.com/washingtonpost/data-police-shootings,Officer Involved Shootings,200,GitHub - washingtonpost/data-police-shootings: The Washington Post is compiling a database of every fatal shooting in the United States by a police officer in the line of duty since 2015.,The Washington Post is compiling a database of every fatal shooting in the United States by a police officer in the line of duty since 2015. - GitHub - washingtonpost/data-police-shootings: The Washington Post is compiling a database of every fatal shooting in the United States by a police officer in the line of duty since 2015.,"[""Search code, repositories, users, issues, pull requests..."", ""\n Provide feedback\n "", ""\n Saved searches\n "", ""washingtonpost/data-police-shootings""]","[""Use saved searches to filter your results more quickly"", ""About"", ""\n\n Releases\n 1\n"", ""\n\n Packages\n 0\n"", ""\n\n Contributors\n 2\n"", ""Footer""]","[""License"", ""Resources"", ""License"", ""Code of conduct"", ""Stars"", ""Watchers"", ""Forks"", ""Footer navigation""]",[],[],[] -3903,http://inmatelocator.cor.pa.gov/,Incarceration Records,200,Inmate/Parolee Locator,"",[],[],[],[],[],[] -3904,http://webapps.sftc.org/ci/CaseInfo.dll,Court Cases,200,Online Services | Superior Court of California - County of San Francisco,"",[],[],[],[],[],[] -3905,https://github.com/ayyubibrahimi/eos,Policies & Contracts,200,GitHub - ayyubibrahimi/eos,Contribute to ayyubibrahimi/eos development by creating an account on GitHub.,"[""Search code, repositories, users, issues, pull requests..."", ""\n Provide feedback\n "", ""\n Saved searches\n "", ""ayyubibrahimi/eos""]","[""Use saved searches to filter your results more quickly"", ""About"", ""\n\n Releases\n"", ""\n\n Packages\n 0\n"", ""\n\n Contributors\n 2\n"", ""Languages"", ""Footer""]","[""Resources"", ""Stars"", ""Watchers"", ""Forks"", ""Footer navigation""]",[],[],[] -3906,https://www.drewcountysheriff.com/roster-choose,Incarceration Records,200,Roster Choose - Drew County Sheriff AR,"","[""\r\n\t\tDrew County Detention Center Inmate Roster\r\n\t""]",[],[],[],[],[] -3907,https://arresttrends.vera.org/data-sources-and-methodology,List of Data Sources,200,Data Sources & Methodology | Arrests Trends,"","[""Data Sources & Methodology""]",[],"[""Contents"", ""Introduction"", ""Background"", ""Data Sources and Methodology"", ""Arrests"", ""Demographics"", ""Clearance Rates"", ""Victimizations"", ""Data Reported"", ""Comparisons"", ""Conclusion"", ""Appendix A: FBI-Recognized Offense Types and Definitions"", ""Appendix B: BJS-Recognized Offense Types and Definitions"", ""Appendix C: FBI and BJS Offense Type Comparisons"", ""Appendix D: Missing Arrest Data, Data Aggregation, and Data Discrepancies"", ""Appendix E: Missing/Incorrect Information for Some Agencies in the Crosswalk"", ""Endnotes""]",[],[],[] -3908,https://caseinfo.arcourts.gov/cconnect/PROD/public/ck_public_qry_main.cp_main_idx,Court Cases,200,AOC CourtConnect,"",[],[],[],[],[],[] -3909,https://gis.arkansas.gov/?s=police&post_type=product,Contact Info & Agency Meta,200, police | Search Results | Arkansas GIS Office,"","[""Arkansas GIS Office"", ""Search Results: \u201cpolice\u201d""]","[""Arkansas Spatial Data Infrastructure""]","[""\u00b2 Navigation"", ""Correctional Institution (point)"", ""HISTORICAL Fire District (polygon) ARCHIVED"", ""Law Enforcement (point)"", ""State Police Highway Patrol Troop Boundaries (polygon)""]",[],[],[] -3910,https://spotcrime.com/map?lat=38.1297971384506&lon=-121.2687494888574,Crime Maps & Reports,200,Map | SpotCrime,"Explore a map of recent crime by location. The map shows crime incident data down to neighborhood crime activity including arrest, arson, assault, burglary, robbery, shooting, theft, vandalism, and rape.",[],[],[],[],[],[] -3911,https://www.lodi.gov/directory.aspx?did=15,Contact Info & Agency Meta,200,Staff Directory • Lodi Police Department,"","[""Lodi Police Department""]",[],"[""Loading"", ""Business Phone: (209) 333-6727"", ""Emergency Phone: 911"", ""Non-Emergency Phone: (209) 333-6728"", ""Telephone Report Phone: (209) 333-5544"", ""Police Fax: (209) 333-6792"", """", ""Traffic Division Phone: (209) 333-5558"", ""Narcotics Phone: (209) 333-6734"", ""Dispatch Phone: (209) 333-6728"", ""Emergency Phone: 911"", ""Dispatch Fax: (209) 333-5539"", ""Property Lobby Phone: (209) 330-8786"", ""Live Edit"", ""Contact Us"", ""Quick Links"", ""Emergency Numbers"", ""Using This Site""]",[],[],[] -3912,https://www.lodi.gov/392/Statistics,Crime Statistics,200,"Statistics | Lodi, CA","Check out various statistics about the Lodi Police Department, including staffing and crime rates.","[""\r\n\r\nStatistics\t\t""]","[""Crime Reports"", ""Crime Statistics""]","[""Loading"", """", ""Two-Year Snapshot - General"", """", """", ""Contact Us"", ""Quick Links"", ""Emergency Numbers"", ""Using This Site""]",[],[],[] -3913,https://www.lodi.gov/DocumentCenter/View/4153/Lodi-Police-Policy-and-Procedure,Policies & Contracts,200,"","",[],[],[],[],[],[] -3914,https://www.lodi.gov/DocumentCenter/View/3145/City-of-Lodi-Administrative-Policies-and-Procedures,Policies & Contracts,200,"","",[],[],[],[],[],[] -3915,https://www.lodi.gov/DocumentCenter/View/3140/2022-Training-Plan-,Training & Hiring Info,200,"","",[],[],[],[],[],[] -3916,https://ujsportal.pacourts.us/CaseSearch,Court Cases,200,Case Search,"","[""Case Search""]",[],"[""Search By"", ""Docket number"", ""Citation No"", ""OTN"", ""Scheduled Events Only"", ""Calendar Attendees""]","[""Site Requirements"", ""Disclaimer""]",[],[] -3917,https://www.ashleycountyar.com/financial-reports/ashley-county-financial-statement-12312021-certified-copy/,Annual & Monthly Reports,200,Ashley County Financial Statement 12312021 Certified Copy | Ashley County,"","[""Ashley County Financial Statement 12312021 Certified Copy""]",[],[],[],[],[] -3918,https://giglio-bradylist.com/,Complaints & Misconduct,200,Brady List | Potential Impeachment Disclosure [PID] Database,"The Brady List is the definitive public-facing database of information about police misconduct, public complaints, use-of-force reports, and more... To ensure fair trials the Supreme Court of the United States created the Brady doctrine obligating the prosecutor of every case to gather and disclose all information about any individual upon whose testimony they will rely. Brady has prevailed as a super-precedent for 60 years. This platform is available as-a-service to all Peace Officer Standards & Training [POST] Departments, Prosecutors, and Law Enforcement Organizations [LEOrgs].",[],"[""Complaints"", ""Search"", ""Main navigation"", ""User account menu"", ""Citations"", ""Freedom of Information Act"", ""We the People"", ""Authorities"", ""Precedents"", ""Sources"", ""Records"", ""Open Letters"", ""Articles"", ""Resources"", ""Our Priorities"", ""Main navigation"", ""Resources"", ""Required Reading"", ""Main navigation"", ""Our Priorities"", ""Authorities"", ""Precedents"", ""Open Letters"", ""Articles"", ""Sources"", ""Records"", ""Resources""]",[],"[""Pagination"", ""\nThe Evolution of a \""Paper of Record\"" to a \""Platform of Record\""\n\n"", ""\nModern Standards for Execution of Service in the United States\n\n"", ""\nProsecutors and the Use of Potential Impeachment Disclosure [PID] Databases: Tracking Officer Misconduct\n\n"", ""\nUnearthing Truth and Restoring Justice: The Courts' Use of Mass Exonerations to Rectify Wrongful Convictions\n\n"", ""\nThe Role of Certification and Training Not-for-Profit Organizations\n\n""]",[],[] -3919,https://www.documentcloud.org/app?q=%2Bproject%3Aallegheny-county-jail-211877%20,List of Data Sources,200,DocumentCloud,"",[],[],[],[],[],[] -3920,https://www.documentcloud.org/documents/23577766-january-2023-warden-report,Annual & Monthly Reports,200,DocumentCloud,"",[],[],[],[],[],[] -3921,https://www.documentcloud.org/documents/23577768-incarcerated-individual-welfare-fund-fs,Annual & Monthly Reports,200,DocumentCloud,"",[],[],[],[],[],[] -3922,https://www.documentcloud.org/documents/23577767-draft-job-meeting-minutes-december-1-2022,Annual & Monthly Reports,200,DocumentCloud,"",[],[],[],[],[],[] -3923,https://www.documentcloud.org/documents/23577764-1423-jail-summary,Incarceration Records,200,DocumentCloud,"",[],[],[],[],[],[] -3924,https://www.alleghenycounty.us/jail/reports.aspx,Incarceration Records,404,"","",,,,,, -3925,https://eapps.alleghenycounty.us/restaurant/RestaurantDetail.aspx?ID=201408080003,Contact Info & Agency Meta,200," - ACHD Restaurant Finder -","",[],[],[],[],[],[] -3926,https://eapps.alleghenycounty.us/restaurant/RestaurantDetail.aspx?ID=201808060005,Contact Info & Agency Meta,200," - ACHD Restaurant Finder -","",[],[],[],[],[],[] -3927,https://eapps.alleghenycounty.us/restaurant/RestaurantDetail.aspx?ID=202102230002,Contact Info & Agency Meta,200," - ACHD Restaurant Finder -","",[],[],[],[],[],[] -3928,https://data.cityofchicago.org/Service-Requests/311-Service-Requests/v6vf-nfxy,Calls for Service,200,311 Service Requests | City of Chicago | Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -3929,https://analytics.alleghenycounty.us/2021/03/04/allegheny-county-jail-population-management-dashboards-2/,Incarceration Records,200,Population of the Allegheny County Jail: Interactive Dashboard - Allegheny Analytics,"","[""Population of the Allegheny County Jail: Interactive Dashboard""]",[],"[""Trouble viewing the dashboard? You can view it directly here.""]",[],[],[] -3930,https://portal-nc.tylertech.cloud/Portal/,Court Cases,200,eCourts Portal,"","[""eCourts Portal""]","[""JavaScript must be enabled in order for you to use this application."", ""Cookies must be allowed."", ""You are using a web browser which this application no longer supports."", ""Supported Browsers"", ""Are you still here?""]",[],[],[],[] -3931,https://pypi.org/project/openpolicedata/,Incident Reports,200,openpolicedata · PyPI,"The OpenPoliceData (OPD) Python library is the most comprehensive centralized public access point for incident-level police data in the United States. OPD provides easy access to 383+ incident-level datasets for over 3500 police agencies. Types of data include traffic stops, use of force, officer-involved shootings, and complaints.","[""\n openpolicedata 0.5.8\n "", ""OpenPoliceData""]","[""Project description"", ""Installation"", ""Latest Datasets Added to OPD"", ""Release Notes for Version 0.5.8 - 2023-09-28"", ""Contributing"", ""Project details"", ""\nRelease history\n\nRelease notifications |\n RSS feed \n\n"", ""Download files"", ""Help"", ""About PyPI"", ""Contributing to PyPI"", ""Using PyPI""]","[""Navigation"", ""Project links"", ""Statistics"", ""Meta"", ""Maintainers"", ""Classifiers"", ""Added"", ""Changed"", ""Fixed"", ""Project links"", ""Statistics"", ""Meta"", ""Maintainers"", ""Classifiers"", ""\nSource Distribution "", ""\nBuilt Distribution "", ""\nHashes for openpolicedata-0.5.8.tar.gz "", ""\nHashes for openpolicedata-0.5.8-py3-none-any.whl ""]",[],[],[] -3932,https://communitysafety.pittsburghpa.gov/blotter.aspx,Incident Reports,-1,"","",,,,,, -3933,data.austintexas.gov/resource/3bfz-mri4.json,Use of Force Reports,200,2019 Response to Resistance Data | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3934,data.austintexas.gov/resource/bx9w-y5sd.json,Use of Force Reports,200,R2R 2012 | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3935,data.austintexas.gov/resource/fk9e-2udt.json,Arrest Records,200,2014 Racial Profiling Arrests | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3936,data.austintexas.gov/resource/c65h-gw3m.json,Stops,200,2020 Racial Profiling (RP) dataset | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3937,data.austintexas.gov/resource/sc6h-qr9f.json,Citations,200,Racial Profiling Dataset 2015- Citations | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3938,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2015/FeatureServer/0,Calls for Service,200,Layer: APD CAD 911 Calls 2015 (ID:0),"",[],"[""Layer: APD CAD 911 Calls 2015 (ID:0)""]",[],[],[],[] -3939,data.austintexas.gov/resource/v6rq-ainw.json,Stops,200,2015 RP Warnings + Field Observations | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3940,data.austintexas.gov/resource/h8jq-pcz3.json,Use of Force Reports,200,R2R 2016 | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3941,data.austintexas.gov/resource/mw6q-k5gy.json,Citations,200,2014 Racial Profiling Dataset Citations | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3942,data.austintexas.gov/resource/djcn-eje6.json,Stops,200,2019 Racial Profiling (RP) Warning and Field Observations | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3943,data.austintexas.gov/resource/5w6q-adh8.json,Use of Force Reports,200,2017 R2R Subjects | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3944,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2020/FeatureServer/0,Calls for Service,200,Layer: coagiswarehouse.coagis.apd_cad_data (ID:0),"",[],"[""Layer: coagiswarehouse.coagis.apd_cad_data (ID:0)""]",[],[],[],[] -3945,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2018/FeatureServer/0,Calls for Service,200,Layer: APD CAD 911 Calls 2018 (ID:0),"",[],"[""Layer: APD CAD 911 Calls 2018 (ID:0)""]",[],[],[],[] -3946,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2019/FeatureServer/0,Calls for Service,200,Layer: APD CAD 911 Calls 2019 (ID:0),"",[],"[""Layer: APD CAD 911 Calls 2019 (ID:0)""]",[],[],[],[] -3947,data.austintexas.gov/resource/m4cc-q8pr.json,Arrest Records,200,2019 Racial Profiling (RP) Arrests | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3948,data.austintexas.gov/resource/dwrk-z7q9.json,Use of Force Reports,200,2019 Response to Resistance Subject Data | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3949,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2012/FeatureServer/0,Calls for Service,200,Layer: APD CAD 911 Calls 2012 (ID:0),"",[],"[""Layer: APD CAD 911 Calls 2012 (ID:0)""]",[],[],[],[] -3950,data.austintexas.gov/resource/nbjz-52e4.json,Arrest Records,200,2015 Racial Profiling Arrests | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3951,https://data-avl.opendata.arcgis.com/search?tags=publicsafety,List of Data Sources,200,City of Asheville Open Data,City of Asheville Open Data,[],[],[],[],[],[] -3952,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2009/FeatureServer/0,Calls for Service,200,Layer: APD CAD 911 Calls 2009 (ID:0),"",[],"[""Layer: APD CAD 911 Calls 2009 (ID:0)""]",[],[],[],[] -3953,data.austintexas.gov/resource/urfd-wng9.json,Citations,200,2016 RP Citations | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3954,data.austintexas.gov/resource/qhi8-a9bc.json,Stops,200,2016 RP Warnings + Field Observations | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3955,data.austintexas.gov/resource/vchc-c622.json,Stops,200,2018 RP Warnings + Field Observations | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3956,data.albanyny.gov/resource/s2gk-irhz.json,Complaints & Misconduct,200,APD Citizen Complaints | City of Albany,"","[""""]","[""Menu""]",[],[],[],[] -3957,data.austintexas.gov/resource/bmz9-cdnt.json,Arrest Records,200,2016 RP Arrests | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3958,data.austintexas.gov/resource/b9rk-dixy.json,Citations,200,2018 RP Citations | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3959,data.austintexas.gov/resource/iydp-s2cf.json,Use of Force Reports,200,R2R 2015 | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3960,data.austintexas.gov/resource/5evd-3tba.json,Use of Force Reports,200,2017 R2R Dataset | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3961,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2014/FeatureServer/0,Calls for Service,200,Layer: APD CAD 911 Calls 2014 (ID:0),"",[],"[""Layer: APD CAD 911 Calls 2014 (ID:0)""]",[],[],[],[] -3962,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2016/FeatureServer/0,Calls for Service,200,Layer: APD CAD 911 Calls 2016 (ID:0),"",[],"[""Layer: APD CAD 911 Calls 2016 (ID:0)""]",[],[],[],[] -3963,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2013/FeatureServer/0,Calls for Service,200,Layer: APD CAD 911 Calls 2013 (ID:0),"",[],"[""Layer: APD CAD 911 Calls 2013 (ID:0)""]",[],[],[],[] -3964,data.austintexas.gov/resource/7guv-wkre.json,Citations,200,2017 Racial Profiling Dataset Citations | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3965,data.austintexas.gov/resource/jipa-v8m5.json,Use of Force Reports,200,R2R 2011 | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3966,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2010/FeatureServer/0,Calls for Service,200,Layer: APD CAD 911 Calls 2010 (ID:0),"",[],"[""Layer: APD CAD 911 Calls 2010 (ID:0)""]",[],[],[],[] -3967,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2021/FeatureServer/0,Calls for Service,200,Layer: APD CAD 911 Calls (ID:0),"",[],"[""Layer: APD CAD 911 Calls (ID:0)""]",[],[],[],[] -3968,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2005/FeatureServer/0,Calls for Service,200,Layer: APD CAD 911 Calls 2005 (ID:0),"",[],"[""Layer: APD CAD 911 Calls 2005 (ID:0)""]",[],[],[],[] -3969,data.austintexas.gov/resource/c7is-tz8m.json,Use of Force Reports,200,2018 Response to Resistance Subjects Data | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3970,data.austintexas.gov/resource/tqet-vty2.json,Stops,200,2014 Racial Profiling Warnings + Field Observations | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3971,data.austintexas.gov/resource/8mvp-v9jz.json,Officer Involved Shootings,200,Officer Involved Shootings 2008-17 Officers | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3972,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2011/FeatureServer/0,Calls for Service,200,Layer: dbo.uvw_apd_cad_data2011.csv (ID:0),"",[],"[""Layer: dbo.uvw_apd_cad_data2011.csv (ID:0)""]",[],[],[],[] -3973,data.austintexas.gov/resource/uzqv-9uza.json,Officer Involved Shootings,200,Officer Involved Shootings 2008-17 Incidents | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3974,data.austintexas.gov/resource/xfke-9bsj.json,Arrest Records,200,2018 RP Arrests | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3975,data.austintexas.gov/resource/x4p3-hj3y.json,Arrest Records,200,2017 Racial Profiling Arrests | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3976,data.austintexas.gov/resource/5asp-dw2k.json,Stops,200,2017 Racial Profiling Warnings + Field Observations | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3977,data.austintexas.gov/resource/uzta-a386.json,Citations,200,2019 Racial Profiling (RP) Citations | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3978,data.austintexas.gov/resource/u2k2-n8ez.json,Officer Involved Shootings,200,2008-17 OIS Subjects | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3979,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2017/FeatureServer/0,Calls for Service,200,Layer: APD CAD 911 Calls 2017 (ID:0),"",[],"[""Layer: APD CAD 911 Calls 2017 (ID:0)""]",[],[],[],[] -3980,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2008/FeatureServer/0,Calls for Service,200,Layer: APD CAD 911 Calls 2008 (ID:0),"",[],"[""Layer: APD CAD 911 Calls 2008 (ID:0)""]",[],[],[],[] -3981,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2006/FeatureServer/0,Calls for Service,200,Layer: APD CAD 911 Calls 2006 (ID:0),"",[],"[""Layer: APD CAD 911 Calls 2006 (ID:0)""]",[],[],[],[] -3982,https://services.arcgis.com/aJ16ENn1AaqdFlqx/arcgis/rest/services/APD_CAD_911_Calls_2007/FeatureServer/0,Calls for Service,200,Layer: APD CAD 911 Calls 2007 (ID:0),"",[],"[""Layer: APD CAD 911 Calls 2007 (ID:0)""]",[],[],[],[] -3983,https://bloomington.data.socrata.com/Police/Citizen-Complaints/kit3-8bua,Complaints & Misconduct,200,Citizen Complaints | City of Bloomington Open Data,"","[""""]","[""Menu""]",[],[],[],[] -3984,http://gouda.beloitwi.gov/WebLink/0/edoc/66423/3Use%20of%20Force%202017%20-%20last%20updated%201-12-18.xls,Use of Force Reports,200,"","",[],[],[],[],[],[] -3985,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Civilian-Officer_2019.csv,Use of Force Reports,200,"","",[],[],[],[],[],[] -3986,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Civilian-Officer_2017.csv,Use of Force Reports,200,"","",[],[],[],[],[],[] -3987,https://bloomington.data.socrata.com/Police/Officer-Involved-Shootings/63j3-n7jh,Officer Involved Shootings,200,Officer Involved Shootings | City of Bloomington Open Data,"","[""""]","[""Menu""]",[],[],[],[] -3988,data.austintexas.gov/resource/rus9-w6q5.json,Use of Force Reports,200,2018 Response to Resistance Data | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -3989,https://data.bloomington.in.gov/dataset/c25e7854-dcb5-40d4-b94c-e6e518c2ddfa/resource/0dc23bb3-98d6-436b-b3d4-fb0f846869c9/download/2016-first-quarter-bpd-employee-demographics.csv,Personnel Records,404,"","",,,,,, -3990,https://opendata.baltimorecity.gov/egis/rest/services/Hosted/911_Calls_For_Service_2019_csv/FeatureServer/0,Calls for Service,200,Layer: 911_Calls_For_Service_2019.csv (ID: 0),"",[],"[""Layer: 911_Calls_For_Service_2019.csv (ID: 0)""]",[],[],[],[] -3991,https://bloomington.data.socrata.com/Police/Accidents/vf95-pwwj,Incident Reports,200,Accidents | City of Bloomington Open Data,"","[""""]","[""Menu""]",[],[],[],[] -3992,https://services1.arcgis.com/UWYHeuuJISiGmgXx/arcgis/rest/services/911_Calls_for_Service_2021_Historic/FeatureServer/0,Calls for Service,200,Layer: CallsForService_2021.csv (ID:0),"",[],"[""Layer: CallsForService_2021.csv (ID:0)""]",[],[],[],[] -3993,https://opendata.baltimorecity.gov/egis/rest/services/Hosted/911_Calls_For_Service_2020_csv/FeatureServer/0,Calls for Service,200,Layer: 911_Calls_For_Service_2020.csv (ID: 0),"",[],"[""Layer: 911_Calls_For_Service_2020.csv (ID: 0)""]",[],[],[],[] -3994,https://opendata.baltimorecity.gov/egis/rest/services/Hosted/911_Calls_For_Service_2017_csv/FeatureServer/0,Calls for Service,200,Layer: 911_Calls_For_Service_2017.csv (ID: 0),"",[],"[""Layer: 911_Calls_For_Service_2017.csv (ID: 0)""]",[],[],[],[] -3995,https://data.austintexas.gov/browse?category=Public+Safety,List of Data Sources,200,Results matching category of Public Safety | Page 1 of 60 | Open Data | City of Austin Texas,"","[""Categories"", ""Department"", ""Tags""]","[""Menu"", ""\n Categories > Public Safety\n \n"", ""\n Sort\n "", ""\n Sort by Most Relevant\n \n"", ""\n Filter\n "", ""\nCategories\n\n"", ""\nView Types\n\n"", ""\nDepartment\n\n"", ""\nTags\n\n"", ""\nFederated Domains\n\n"", ""\nAustin Fire Department and ATCEMS Stations\n"", ""\nShort Term Rental Locations\n"", ""\nCrime Reports\n"", ""\nEMS - County Incidents per Month\n"", ""\nMap of Austin Police Stations\n"", ""\nAustin Code Complaint Cases\n"", ""\nMeet our Executive Team\n"", ""\nFY2017 Safety Concerns by Category\n"", ""\nEMS - CPI_03 - STEMI Scene Interval 90th Percentile Chart\n"", ""\nEMS - CPI_04 - ASA for ACS Compliance Chart\n"", ""A-Z"", ""A-Z"", ""A-Z""]",[],[],[],[] -3996,https://opendata.cityofboise.org/search?q=police,List of Data Sources,200,City of Boise Maps and GIS Open Data Portal,City of Boise Open Data Portal for geospatial data and maps.,[],[],[],[],[],[] -3997,https://opendata.baltimorecity.gov/egis/rest/services/Hosted/911_Calls_For_Service_2018_csv/FeatureServer/0,Calls for Service,200,Layer: 911_Calls_For_Service_2018.csv (ID: 0),"",[],"[""Layer: 911_Calls_For_Service_2018.csv (ID: 0)""]",[],[],[],[] -3998,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Civilian-Officer_2018.csv,Use of Force Reports,200,"","",[],[],[],[],[],[] -3999,https://services1.arcgis.com/WHM6qC35aMtyAAlN/arcgis/rest/services/BPD_CallsForService/FeatureServer/0,Calls for Service,200,Layer: Police Calls for Service (ID:0),"",[],"[""Layer: Police Calls for Service (ID:0)""]",[],[],[],[] -4000,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Civilian-Officer_2020.csv,Use of Force Reports,200,"","",[],[],[],[],[],[] -4001,data.austintexas.gov/resource/qxx9-6iwk.json,Use of Force Reports,200,R2R 2013 | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -4002,http://gouda.beloitwi.gov/WebLink/0/edoc/72935/1Use%20of%20Force%202020%20-%20Updated%20on%206-12-2020.xls,Use of Force Reports,200,"","",[],[],[],[],[],[] -4003,https://data.baltimorecity.gov/datasets/bpd-arrests/explore,Arrest Records,200,BPD Arrests, This dataset represents arrests made by the Baltimore Police Department. Data are updated weekly.,[],[],[],[],[],[] -4004,https://gisweb.bozeman.net/hosted/rest/services/BPD_Calls_For_Service_Public/FeatureServer/0,Calls for Service,200,Layer: BPD Calls For Service - Public (ID: 0),"",[],"[""Layer: BPD Calls For Service - Public (ID: 0)""]",[],[],[],[] -4005,https://data.buffalony.gov/Public-Safety/Uniform-Traffic-Tickets/s37s-kh9q/explore,Citations,200,Uniform Traffic Tickets | OpenData Buffalo,"",[],"[""Menu""]",[],[],[],[] -4006,http://gouda.beloitwi.gov/WebLink/0/edoc/68367/3Use%20of%20Force%202018%20-%20Updated%20-18-18.xls,Use of Force Reports,200,"","",[],[],[],[],[],[] -4007,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Incident_2018.csv,Use of Force Reports,200,"","",[],[],[],[],[],[] -4008,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Incident_2020.csv,Use of Force Reports,200,"","",[],[],[],[],[],[] -4009,data.austintexas.gov/resource/sykw-k45z.json,Stops,200,2017-2019_Non-Motor Vehicle Stops_Warnings | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -4010,data.austintexas.gov/resource/vv43-e55n.json,Use of Force Reports,200,R2R 2014 | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -4011,http://gouda.beloitwi.gov/WebLink/Browse.aspx?startid=67660&dbid=0,List of Data Sources,200," - Bias/Hate Crimes - Laserfiche WebLink -","",[],[],[],[],[],[] -4012,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Incident_2019.csv,Use of Force Reports,200,"","",[],[],[],[],[],[] -4013,https://maps.burlingtonvt.gov/arcgis/rest/services/Hosted/traffic_stops/FeatureServer/0,Stops,404,"","",,,,,, -4014,https://data.bloomington.in.gov/dataset/c25e7854-dcb5-40d4-b94c-e6e518c2ddfa/resource/322f9b81-0462-482d-a4c5-e1053f57a70f/download/2017-first-quarter-bpd-employee-demographics.csv,Personnel Records,404,"","",,,,,, -4015,https://bloomington.data.socrata.com/Police/Vehicle-Pursuits/n6ty-q23h,Vehicle Pursuits,200,Vehicle Pursuits | City of Bloomington Open Data,"","[""""]","[""Menu""]",[],[],[],[] -4016,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Incident_2016.csv,Use of Force Reports,200,"","",[],[],[],[],[],[] -4017,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Civilian-Officer_2016.csv,Use of Force Reports,200,"","",[],[],[],[],[],[] -4018,bloomington.data.socrata.com/resource/t5xf-ggw6.json,Calls for Service,200,Calls for Service | City of Bloomington Open Data,"","[""""]","[""Menu""]",[],[],[],[] -4019,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/URSUS_Incident_2017.csv,Use of Force Reports,200,"","",[],[],[],[],[],[] -4020,https://data.buffalony.gov/Public-Safety/Uniform-Roadside-Appearance-Tickets/5kqt-m62h,Arrest Records,404,"","",,,,,, -4021,https://data.baltimorecity.gov/search?q=public%20safety,List of Data Sources,200,Open Baltimore,Baltimore City's Open Data Hub,[],[],[],[],[],[] -4022,data.austintexas.gov/resource/sc8s-w4ka.json,Use of Force Reports,200,R2 R 2009 | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -4023,data.austintexas.gov/resource/9uzk-fyxx.json,Citations,200,2017-2019_Non-Motor Vehicle Stops_Citations | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -4024,https://data.bloomington.in.gov/group/public-safety,List of Data Sources,404,"","",,,,,, -4025,data.austintexas.gov/resource/q5ym-htjz.json,Use of Force Reports,200,R2R 2010 | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -4026,https://public-bozeman.opendata.arcgis.com/search?q=police,List of Data Sources,200,Bozeman Open Data,"City of Bozeman, Montana",[],[],[],[],[],[] -4027,https://data.cityofberkeley.info/Public-Safety/Berkeley-PD-Stop-Data-October-1-2020-Present-/ysvs-bcge,Stops,200,"Berkeley PD - Stop Data (October 1, 2020 - Present) | Open Data | City of Berkeley","","[""""]","[""Menu""]",[],[],[],[] -4028,https://maps.burlingtonvt.gov/arcgis/rest/services/Hosted/arrests_(1)/FeatureServer/0,Arrest Records,404,"","",,,,,, -4029,data.austintexas.gov/resource/qpbg-wcus.json,Arrest Records,200,2017-2019_Non-Motor Vehicle Stops_Arrests | Open Data | City of Austin Texas,"","[""""]","[""Menu""]",[],[],[],[] -4030,https://data.buffalony.gov/Public-Safety/Traffic-Stop-Receipts/8mqs-6g9h,Stops,200,Traffic Stop Receipts | OpenData Buffalo,"","[""""]","[""Menu""]",[],[],[],[] -4031,http://gouda.beloitwi.gov/WebLink/0/edoc/71724/2Use%20of%20Force%202019%20-%20Updated%201-30-2020.xls,Use of Force Reports,200,"","",[],[],[],[],[],[] -4032,https://www.como.gov/wp-content/uploads/2020/10/CPD_vehicle_stop_data_2016.csv,Stops,200,"","",[],[],[],[],[],[] -4033,data.cincinnati-oh.gov/resource/8us8-wi2w.json,Use of Force Reports,200,PDI (Police Data Initiative) Use of Force | Tyler Data & Insights,"","[""""]","[""Menu""]",[],[],[],[] -4034,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/UseofForce_Civilian-Officer_2021f.csv,Use of Force Reports,200,"","",[],[],[],[],[],[] -4035,https://www.charleston-sc.gov/DocumentCenter/View/31097/2021_ECitations_Final_XLS,Citations,200,"","",[],[],[],[],[],[] -4036,https://services2.arcgis.com/3dDB2Kk6kuA2gIGw/arcgis/rest/services/UseOfForce_Type_OpenData_HOSTED/FeatureServer/0,Use of Force Reports,200,Layer: UOF_Type_OpenData (ID:0),"",[],"[""Layer: UOF_Type_OpenData (ID:0)""]",[],[],[],[] -4037,www.dallasopendata.com/resource/6gnu-avpf.json,Use of Force Reports,200,Police Response to Resistance 2013 | Dallas OpenData,"","[""""]","[""Menu""]",[],[],[],[] -4038,https://www.charleston-sc.gov/DocumentCenter/View/25732/2019eCitationsSCCATTS_YTD_XLS,Citations,200,"","",[],[],[],[],[],[] -4039,https://data.cincinnati-oh.gov/safety/PDI-Police-Data-Initiative-Police-Calls-for-Servic/gexm-h6bt,Calls for Service,200,PDI (Police Data Initiative) Police Calls for Service (CAD) | Tyler Data & Insights,"","[""""]","[""Menu""]",[],[],[],[] -4040,www.dallasopendata.com/resource/nufk-2iqn.json,Use of Force Reports,200,Police Response to Resistance 2020 | Dallas OpenData,"","[""""]","[""Menu""]",[],[],[],[] -4041,https://services1.arcgis.com/zdB7qR0BtYrg0Xpl/arcgis/rest/services/ODC_CRIME_STOPS_P/FeatureServer/32,Stops,200,Layer: CRIME_STOPS_P (ID:32),"",[],"[""Layer: CRIME_STOPS_P (ID:32)""]",[],[],[],[] -4042,https://www.como.gov/wp-content/uploads/2020/10/CPD-vehicle-stop-data-2015.csv,Stops,200,"","",[],[],[],[],[],[] -4043,data.cincinnati-oh.gov/resource/ktgf-4sjh.json,Stops,200,PDI (Police Data Initiative) Traffic Stops (All Subjects) | Tyler Data & Insights,"","[""""]","[""Menu""]",[],[],[],[] -4044,data.cincinnati-oh.gov/resource/svan-pass.json,Stops,200,CPD Contact Cards | Tyler Data & Insights,"","[""""]","[""Menu""]",[],[],[],[] -4045,https://www.como.gov/wp-content/uploads/2020/10/CPD_vehicle_stop_data_2019.csv,Stops,200,"","",[],[],[],[],[],[] -4046,https://gis.charlottenc.gov/arcgis/rest/services/CMPD/CMPD/MapServer/12,Officer Involved Shootings,200,Layer: CMPD Officer-Involved Shootings- Individuals (ID: 12),"",[],"[""Layer: CMPD Officer-Involved Shootings- Individuals (ID: 12)""]",[],[],[],[] -4047,https://data.cityofchicago.org/Public-Safety/Arrests/dpt3-jri9,Arrest Records,200,Arrests | City of Chicago | Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -4048,data.cincinnati-oh.gov/resource/r6q4-muts.json,Officer Involved Shootings,200,PDI (Police Data Initiative) Officer Involved Shootings | Tyler Data & Insights,"","[""""]","[""Menu""]",[],[],[],[] -4049,https://opendata-townofchapelhill.hub.arcgis.com/search?tags=community%20safety%2Cjustice,List of Data Sources,200,Chapel Hill Open Data,"Discover, analyze and download data from Chapel Hill Open Data. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",[],[],[],[],[],[] -4050,https://www.como.gov/wp-content/uploads/2021/06/CPD_vehicle_stop_data_2020-6.csv,Stops,200,"","",[],[],[],[],[],[] -4051,www.dallasopendata.com/resource/594v-2cnd.json,Use of Force Reports,200,Police Response to Resistance 2015 | Dallas OpenData,"","[""""]","[""Menu""]",[],[],[],[] -4052,https://www.como.gov/police/data-reporting-forms/,Stops,200,"CPD Data, Reporting & Forms - Web Page - City of Columbia Missouri","","[""CPD Data, Reporting & Forms""]","[""Police Data"", ""Reporting"", ""Forms"", ""Police"", ""About"", ""Directions"", ""Contact us"", ""Stay connected"", ""Trending services"", ""Main Menu""]","[""CPD District Meeting Presentations""]",[],[],[] -4053,https://www.charleston-sc.gov/DocumentCenter/View/29790/2020_Ecitations_XLS,Citations,200,"","",[],[],[],[],[],[] -4054,www.dallasopendata.com/resource/tsu5-ca6k.json,Use of Force Reports,200,Police Response to Resistance 2017 | Dallas OpenData,"","[""""]","[""Menu""]",[],[],[],[] -4055,data.ct.gov//resource/nahi-zqrt.json,Stops,200,Traffic Stops - Racial Profiling Prohibition Project | Connecticut Data,"","[""""]","[""Menu""]",[],[],[],[] -4056,https://services2.arcgis.com/3dDB2Kk6kuA2gIGw/arcgis/rest/services/OfficerInvolvedShooting_OpenData_HOSTED/FeatureServer/0,Officer Involved Shootings,200,Layer: OfficerInvolvedShooting_OpenData (ID:0),"",[],"[""Layer: OfficerInvolvedShooting_OpenData (ID:0)""]",[],[],[],[] -4057,https://www.dallasopendata.com/browse?category=Public+Safety,List of Data Sources,200," - Search & Browse Public Safety | Page 1 of 9 | Dallas OpenData - ","","[""Categories"", ""Tags""]","[""Menu"", ""\n Categories > Public Safety\n \n"", ""\n Sort\n "", ""\n Sort by Most Relevant\n \n"", ""\n Filter\n "", ""\nAuthority\n\n"", ""\nCategories\n\n"", ""\nView Types\n\n"", ""\nTags\n\n"", ""\nActive Calls for Northeast Division / Dallas Police Department\nCOMMUNITY CREATED\n"", ""\nDallas Police Active Calls\n"", ""\nActive Calls for Southeast Division / Dallas Police Department\nCOMMUNITY CREATED\n"", ""\nActive Calls in DPD North Central Division\nCOMMUNITY CREATED\n"", ""\nActive Calls in DPD Northeast Division\nCOMMUNITY CREATED\n"", ""\nActive Calls in DPD Southwest Division\nCOMMUNITY CREATED\n"", ""\nActive Calls for Central Division / Dallas Police Department\nCOMMUNITY CREATED\n"", ""\ntraffic\nCOMMUNITY CREATED\n"", ""\nActive Calls for Southwest Division / Dallas Police Department\nCOMMUNITY CREATED\n"", ""\nDallas Police Officer-Involved Shootings\n"", ""\ndxfg\nCOMMUNITY CREATED\n"", ""\nActive Calls in DPD Southeast Division\nCOMMUNITY CREATED\n"", ""\nPolice Incidents\n"", ""\nPolice Arrests\n"", ""\nActive Calls for North Central Division / Dallas Police Department\nCOMMUNITY CREATED\n"", ""\nPolice Unknown Suspects\n"", ""\nActive Calls for Northwest Division / Dallas Police Department\nCOMMUNITY CREATED\n"", ""\nActive Calls in DPD Northwest Division\nCOMMUNITY CREATED\n"", ""\nMy View - SC and SW\nCOMMUNITY CREATED\n"", ""\nOIS - Type of OIS Chart\n"", ""\nOIS - Incidents Per Year Chart\n"", ""\nDallas Police Public Data - Officer Involved Shootings City Of Dallas Map\n"", ""\nDallas Police Active Calls: Accidents\nCOMMUNITY CREATED\n"", ""\nOIS - Most Common Subject Weapon Type\n"", ""\nDPD NORTHEAST ACTIVE CALLS\nCOMMUNITY CREATED\n"", ""\nriDa437 View\nCOMMUNITY CREATED\n"", ""\nDallas Police Active Calls\nCOMMUNITY CREATED\n"", ""\nNorth Central\nCOMMUNITY CREATED\n"", ""\nDallas Police Department - Channel 2 - Active Calls for Service\nCOMMUNITY CREATED\n"", ""\nDallas Police Incidents by Division\n"", ""\nArrests 2020\nCOMMUNITY CREATED\n"", ""\nOfficers Injured: Response to Resistance - 2016\n"", ""\nActive Calls for South Central Division / Dallas Police Department\nCOMMUNITY CREATED\n"", ""\nActive Calls in DPD South Central Division\nCOMMUNITY CREATED\n"", ""\n2020 homicides\nCOMMUNITY CREATED\n"", ""\nSoutheast Division\nCOMMUNITY CREATED\n"", ""\nPolice Arrest Charges\n"", ""\nME R\nCOMMUNITY CREATED\n"", ""\nDallas PD Active Calls Central\nCOMMUNITY CREATED\n"", ""\nMost Police Incidents Recorded\n"", ""\nPolice Response to Resistance Map - 2016\n"", ""\nmale unknown suspects\nCOMMUNITY CREATED\n"", ""\nNortheast\nCOMMUNITY CREATED\n"", ""\nWhere\nCOMMUNITY CREATED\n"", ""\nPublic Safety - Police Incidents\n"", ""\nPolice Person\n"", ""\nCitizens Injured: Response to Resistance - 2016\n"", ""\nActive Police Call DeskView\nCOMMUNITY CREATED\n"", ""\na\nCOMMUNITY CREATED\n"", ""\nPolice Active Calls By Division\n"", ""A-Z"", ""A-Z""]",[],[],[],[] -4058,www.dallasopendata.com/resource/33un-ry4j.json,Use of Force Reports,200,Police Response to Resistance 2018 | Dallas OpenData,"","[""""]","[""Menu""]",[],[],[],[] -4059,https://gis.charlottenc.gov/arcgis/rest/services/CMPD/CMPD/MapServer/11,Officer Involved Shootings,200,Layer: CMPD Officer-Involved Shootings- Incidents (ID: 11),"",[],"[""Layer: CMPD Officer-Involved Shootings- Incidents (ID: 11)""]",[],[],[],[] -4060,https://gis.charlottenc.gov/arcgis/rest/services/CMPD/CMPD/MapServer/14,Stops,200,Layer: Officer Traffic Stops (ID: 14),"",[],"[""Layer: Officer Traffic Stops (ID: 14)""]",[],[],[],[] -4061,https://www.como.gov/wp-content/uploads/2020/10/CPD-vehicle-stop-data-2014.csv,Stops,200,"","",[],[],[],[],[],[] -4062,https://internal.chattadata.org/Public-Safety/Public-CPD-Arrest-Charges/v9y9-uavb,Arrest Records,200,Public CPD Arrest Charges | ChattaData,"","[""""]","[""Menu""]",[],[],[],[] -4063,www.dallasopendata.com/resource/46zb-7qgj.json,Use of Force Reports,200,Police Response to Resistance 2019 | Dallas OpenData,"","[""""]","[""Menu""]",[],[],[],[] -4064,https://services2.arcgis.com/7KRXAKALbBGlCW77/arcgis/rest/services/Police_Employee_Demographics/FeatureServer/0,Personnel Records,200,Layer: Police Employee Demographics (ID:0),"",[],"[""Layer: Police Employee Demographics (ID:0)""]",[],[],[],[] -4065,https://data.cincinnati-oh.gov/browse?category=Safety&tags=police,List of Data Sources,200,Results matching category of Safety and topic of police | Page 1 of 2 | Tyler Data & Insights,"","[""Categories"", ""Tags""]","[""Menu"", ""\n Categories > Safety\n \n"", ""\n Tags > police\n \n"", ""\n Sort\n "", ""\n Sort by Most Relevant\n \n"", ""\n Filter\n "", ""\nCategories\n\n"", ""\nView Types\n\n"", ""\nTags\n\n"", ""\nTraffic Crash Reports (CPD)\n"", ""\nPDI (Police Data Initiative) Police Calls for Service (CAD)\n"", ""\nCincinnati Police Districts\n"", ""\nPDI (Police Data Initiative) Use of Force\n"", ""\nDrug & Heroin: 24 Hour Daily Report\n"", ""\nCitizen Complaint Authority (CCA) Closed Complaints\n"", ""\nPDI (Police Data Initiative) Assaults on Officers\n"", ""\nPDI (Police Data Initiative) Officer Involved Shootings\n"", ""\nPDI (Police Data Initiative) Traffic Stops (All Subjects)\n"", ""\nCPD & CFD Calls For Service\n"", ""A-Z"", ""A-Z""]",[],[],[],[] -4066,https://dayton-transparency-portal-1-daytonohio.hub.arcgis.com/,List of Data Sources,200,Dayton Transparency Portal,"The Dayton Transparency Portal is designed to provide a “one-stop” web page to access public information related to the Dayton Police Department’s data, policies, and resources.",[],[],[],[],[],[] -4067,https://www.como.gov/wp-content/uploads/2022/03/CPD_vehicle_stop_data_2021.csv,Stops,200,"","",[],[],[],[],[],[] -4068,corstat.coronaca.gov/resource/86hv-vkp4.json,Calls for Service,200,CorStat - Police Response Statistics | Corona Open Performance,"","[""""]","[""Menu""]",[],[],[],[] -4069,https://www.charleston-sc.gov/1570/Open-Data,List of Data Sources,200,"Open Data | Charleston, SC - Official Website",The City of Charleston is committed to making data available to the public and providing tools for better understanding of the data.,"[""\r\n\r\nOpen Data\t\t""]","[""What data is available?"", ""Where can I get the data?"", ""How can I get assistance?"", ""CITIZEN SERVICES DESK""]","[""Loading"", ""FAQs"", ""Quick Links"", ""Site Links""]",[],[],[] -4070,https://gis.charlottenc.gov/arcgis/rest/services/CMPD/CMPD/MapServer/16,Personnel Records,200,Layer: CMPD Employee Demographics (ID: 16),"",[],"[""Layer: CMPD Employee Demographics (ID: 16)""]",[],[],[],[] -4071,https://services2.arcgis.com/3dDB2Kk6kuA2gIGw/arcgis/rest/services/Arrests_OpenData_HOSTED/FeatureServer/0,Arrest Records,200,Layer: PoliceArrests_OPENDATA (ID:0),"",[],"[""Layer: PoliceArrests_OPENDATA (ID:0)""]",[],[],[],[] -4072,https://gis.charlottenc.gov/arcgis/rest/services/CMPD/CMPD/MapServer/13,Officer Involved Shootings,200,Layer: CMPD Officer-Involved Shootings- Officers (ID: 13),"",[],"[""Layer: CMPD Officer-Involved Shootings- Officers (ID: 13)""]",[],[],[],[] -4073,https://data.cambridgema.gov/Public-Safety/Police-Citations/gmq6-8ver,Citations,200,Police Citations | Open Data Portal | City of Cambridge,"","[""""]","[""Menu""]",[],[],[],[] -4074,https://data-openjustice.doj.ca.gov/sites/default/files/dataset/2022-08/UseofForce_Incident_2021.csv,Use of Force Reports,200,"","",[],[],[],[],[],[] -4075,www.dallasopendata.com/resource/xiv3-e8g7.json,Use of Force Reports,200,Police Response to Resistance 2014 | Dallas OpenData,"","[""""]","[""Menu""]",[],[],[],[] -4076,https://www.como.gov/wp-content/uploads/2020/10/CPD_vehicle_stop_data_2017.csv,Stops,200,"","",[],[],[],[],[],[] -4077,www.dallasopendata.com/resource/99fn-pvaf.json,Use of Force Reports,200,Police Response to Resistance 2016 | Dallas OpenData,"","[""""]","[""Menu""]",[],[],[],[] -4078,https://openjustice.doj.ca.gov/data,List of Data Sources,200,State of California Department of Justice - OpenJustice,"",[],[],[],[],[],[] -4079,https://www.como.gov/wp-content/uploads/2020/10/CPD_vehicle_stop_data_2018-2.csv,Stops,200,"","",[],[],[],[],[],[] -4080,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_traffic_stops_2018/FeatureServer/0,Stops,200,Layer: LPD_traffic_stops_2018 (ID:0),"",[],"[""Layer: LPD_traffic_stops_2018 (ID:0)""]",[],[],[],[] -4081,https://gismaps.ci.fayetteville.nc.us/opendata/rest/services/Police/Accidents/MapServer/0,Incident Reports,-1,"","",,,,,, -4082,https://maps.gilbertaz.gov/arcgis/rest/services/OD/Community_Safety_Tables_1/MapServer/2,Calls for Service,200,Layer: PoliceCallsForService (ID: 2),"",[],"[""Layer: PoliceCallsForService (ID: 2)""]",[],[],[],[] -4083,https://services1.arcgis.com/79kfd2K6fskCAkyg/arcgis/rest/services/Louisville_Metro_KY_LMPD_Stops_Data_from_2009_now/FeatureServer/0,Stops,200,Home,"",[],"[""Home""]",[],[],[],[] -4084,https://services7.arcgis.com/uRrQ0O3z2aaiIWYU/arcgis/rest/services/Calls_for_Service_2021/FeatureServer/0,Calls for Service,200,Layer: Calls for Service 2021 (ID:0),"",[],"[""Layer: Calls for Service 2021 (ID:0)""]",[],[],[],[] -4085,https://gismaps.ci.fayetteville.nc.us/opendata/rest/services/Police/Citations/MapServer/0,Citations,200,Layer: CITATIONS (ID: 0),"",[],"[""Layer: CITATIONS (ID: 0)""]",[],[],[],[] -4086,https://gismaps.ci.fayetteville.nc.us/opendata/rest/services/Police/Arrests/MapServer/0,Arrest Records,200,Layer: police.DBO.Arrests (ID: 0),"",[],"[""Layer: police.DBO.Arrests (ID: 0)""]",[],[],[],[] -4087,https://www.arcgis.com/sharing/rest/content/items/7bbc4c544a254405b8e255c540e83ddd/data,Calls for Service,200,"","",[],[],[],[],[],[] -4088,https://services7.arcgis.com/uRrQ0O3z2aaiIWYU/arcgis/rest/services/Citations_2016_to_Present/FeatureServer/0,Citations,200,Layer: Citations (ID:0),"",[],"[""Layer: Citations (ID:0)""]",[],[],[],[] -4089,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_traffic_stops_2014/FeatureServer/0,Stops,200,Layer: LPD_traffic_stops_2014 (ID:0),"",[],"[""Layer: LPD_traffic_stops_2014 (ID:0)""]",[],[],[],[] -4090,https://www.arcgis.com/sharing/rest/content/items/623d73fa151b4206b4467cdc1f903ed4/data,Arrest Records,200,"","",[],[],[],[],[],[] -4091,https://xmaps.indy.gov/arcgis/rest/services/OpenData/OpenData_NonSpatial/MapServer/5,Complaints & Misconduct,200,Layer: IMPD Complaints (ID: 5),"",[],"[""Layer: IMPD Complaints (ID: 5)""]",[],[],[],[] -4092,https://services1.arcgis.com/79kfd2K6fskCAkyg/arcgis/rest/services/Louisville_Metro_KY_LMPD_Employee_Characteristics/FeatureServer/0,Personnel Records,200,Home,"",[],"[""Home""]",[],[],[],[] -4093,data.lacity.org/resource/tss8-455b.json,Calls for Service,200,LAPD Calls for Service 2015 | Los Angeles - Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -4094,https://www.arcgis.com/sharing/rest/content/items/f589622a5fe54687a7bfa79d3e66ee17/data,Calls for Service,200,"","",[],[],[],[],[],[] -4095,https://gis.greensboro-nc.gov/arcgis/rest/services/OpenGateCity/OpenData_ES_DS/MapServer/21,Use of Force Reports,200,Layer: POL_UOF_by_race_per_subject (ID: 21),"",[],"[""Layer: POL_UOF_by_race_per_subject (ID: 21)""]",[],[],[],[] -4096,https://gis.greensboro-nc.gov/arcgis/rest/services/OpenGateCity/OpenData_ES_DS/MapServer/20,Use of Force Reports,200,Layer: POL_UOF_by_force_type_per_officer (ID: 20),"",[],"[""Layer: POL_UOF_by_force_type_per_officer (ID: 20)""]",[],[],[],[] -4097,data.lacity.org/resource/ryvm-a59m.json,Calls for Service,200,LAPD Calls for Service 2017 | Los Angeles - Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -4098,https://data.lacity.org/browse?category=Public+Safety&limitTo=datasets,List of Data Sources,200,Results matching category of Public Safety and type of Datasets | Page 1 of 4 | Los Angeles - Open Data Portal,"","[""Categories"", ""Department"", ""Tags""]","[""Menu"", ""\n Categories > Public Safety\n \n"", ""\n View Types > Datasets\n \n"", ""\n Sort\n "", ""\n Sort by Most Relevant\n \n"", ""\n Filter\n "", ""\nCategories\n\n"", ""\nView Types\n\n"", ""\nDepartment\n\n"", ""\nTags\n\n"", ""\nFederated Domains\n\n"", ""\nCrime Data from 2010 to 2019\n"", ""\nCrime Data from 2020 to Present\n"", ""\nArrest Data from 2010 to 2019\n"", ""\nTraffic Collision Data from 2010 to Present\n"", ""\nArrest Data from 2020 to Present\n"", ""\nLAPD Calls for Service 2020\n"", ""\nLAPD Calls for Service 2019\n"", ""\nVehicle and Pedestrian Stop Data 2010 to June 30th, 2018\n"", ""\nLAPD Calls for Service 2018\n"", ""\nLAPD Calls for Service 2014\n"", ""A-Z"", ""A-Z"", ""A-Z""]",[],[],[],[] -4099,https://services6.arcgis.com/2TPYEzbyXSiAqSUs/arcgis/rest/services/Ferndale_DEPT_DEMOGRAPHICS_2017/FeatureServer/0,Personnel Records,200,Layer: Ferndale_DEPT_DEMOGRAPHICS_2017 (ID:0),"",[],"[""Layer: Ferndale_DEPT_DEMOGRAPHICS_2017 (ID:0)""]",[],[],[],[] -4100,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_Use_of_control_2018/FeatureServer/0,Use of Force Reports,200,Layer: LPD_Use_of_control_2018 (ID:0),"",[],"[""Layer: LPD_Use_of_control_2018 (ID:0)""]",[],[],[],[] -4101,https://services7.arcgis.com/uRrQ0O3z2aaiIWYU/arcgis/rest/services/Department_Demographics__2019_/FeatureServer/0,Personnel Records,200,Layer: Department_Demographics__2019_ (ID:0),"",[],"[""Layer: Department_Demographics__2019_ (ID:0)""]",[],[],[],[] -4102,policeview.johnscreekga.gov/resource/vpup-b7xy.json,Citations,200,"Citation | Johns Creek Police Department | Performance Management -","","[""""]","[""Menu""]",[],[],[],[] -4103,https://www.arcgis.com/sharing/rest/content/items/efae41a4a6314c049f10424527f8647d/data,Calls for Service,200,"","",[],[],[],[],[],[] -4104,https://policedata-fcpdgis.hub.arcgis.com/pages/crime-stats,Arrest Records,200,ArcGIS Hub,"Discover, analyze and download data from ArcGIS Hub. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",[],[],[],[],[],[] -4105,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/Pursuits_2018/FeatureServer/0,Vehicle Pursuits,200,Layer: Pursuits_2018 (ID:0),"",[],"[""Layer: Pursuits_2018 (ID:0)""]",[],[],[],[] -4106,https://services.arcgis.com/RmCCgQtiZLDCtblq/arcgis/rest/services/Sheriff_Deputy_Details_Hit_Shooting_Incidents_and_Non_Hit_Shooting_Incidents_2010_/FeatureServer/0,Officer Involved Shootings,200,Home,"",[],"[""Home""]",[],[],[],[] -4107,https://services7.arcgis.com/uRrQ0O3z2aaiIWYU/arcgis/rest/services/Calls_for_Service_2020/FeatureServer/0,Calls for Service,200,Layer: Calls_for_Service_2020 (ID:0),"",[],"[""Layer: Calls_for_Service_2020 (ID:0)""]",[],[],[],[] -4108,https://www.arcgis.com/sharing/rest/content/items/ddbe7df35a8e4624a74817990ac88441/data,Calls for Service,200,"","",[],[],[],[],[],[] -4109,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_Use_of_Control_2020_2021/FeatureServer/0,Use of Force Reports,200,Layer: LPD_Use_of_Control_2020_2021 (ID:0),"",[],"[""Layer: LPD_Use_of_Control_2020_2021 (ID:0)""]",[],[],[],[] -4110,https://transparency.jaxsheriff.org/,Officer Involved Shootings,200," - Home Page - JSO Open Data -","","[""Open Data & Transparency""]","[""Available Data""]",[],[],[],[] -4111,data.lacity.org/resource/r4ka-x5je.json,Calls for Service,200,LAPD Calls for Service 2019 | Los Angeles - Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -4112,data.lacity.org/resource/i7pm-cnmm.json,Calls for Service,200,LAPD Calls for Service 2012 | Los Angeles - Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -4113,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_traffic_stops_2016/FeatureServer/0,Stops,200,Layer: LPD_traffic_stops_2016 (ID:0),"",[],"[""Layer: LPD_traffic_stops_2016 (ID:0)""]",[],[],[],[] -4114,policeview.johnscreekga.gov/resource/aa9g-h5hg.json,Calls for Service,200,"IncidentCAD | Johns Creek Police Department | Performance Management -","","[""""]","[""Menu""]",[],[],[],[] -4115,https://fortlauderdale.data.socrata.com/stories/s/Datasets/u4dm-3u2d/,Citations,200,Datasets,"",[],"[""Menu"", ""FLPD Datasets""]","[""Police Data Disclaimer""]",[],[],[] -4116,https://services1.arcgis.com/pNPbgWy7hpfFGWoZ/arcgis/rest/services/Traffic_Stops/FeatureServer/0,Stops,200,Layer: Traffic_Stops (ID:0),"",[],"[""Layer: Traffic_Stops (ID:0)""]",[],[],[],[] -4117,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_traffic_stops_2013/FeatureServer/0,Stops,200,Layer: LPD_traffic_stops_2013 (ID:0),"",[],"[""Layer: LPD_traffic_stops_2013 (ID:0)""]",[],[],[],[] -4118,https://www.arcgis.com/sharing/rest/content/items/fa92d418a08343e3b5fb541d4e026eb3/data,Calls for Service,200,"","",[],[],[],[],[],[] -4119,https://xmaps.indy.gov/arcgis/rest/services/OpenData/OpenData_NonSpatial/MapServer/7,Use of Force Reports,200,Layer: IMPD Use Of Force (ID: 7),"",[],"[""Layer: IMPD Use Of Force (ID: 7)""]",[],[],[],[] -4120,data.lacity.org/resource/urhh-yf63.json,Calls for Service,200,LAPD Calls for Service 2013 | Los Angeles - Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -4121,https://services1.arcgis.com/79kfd2K6fskCAkyg/arcgis/rest/services/Louisville_Metro_KY_Uniform_Citation_Data_2021/FeatureServer/0,Citations,200,Layer: Louisville_Metro_KY_Uniform_Citation_Data_2021 (ID:0),"",[],"[""Layer: Louisville_Metro_KY_Uniform_Citation_Data_2021 (ID:0)""]",[],[],[],[] -4122,https://www.arcgis.com/sharing/rest/content/items/d19a6d4fef31437599664f435fa95a35/data,Calls for Service,200,"","",[],[],[],[],[],[] -4123,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_traffic_stops_2019/FeatureServer/0,Stops,200,Layer: Sheet1 (ID:0),"",[],"[""Layer: Sheet1 (ID:0)""]",[],[],[],[] -4124,https://services2.arcgis.com/qvkbeam7Wirps6zC/arcgis/rest/services/DPD_Citizen_Complaints/FeatureServer/0,Complaints & Misconduct,200,Layer: DPD_Citizen_Complaints (ID:0),"",[],"[""Layer: DPD_Citizen_Complaints (ID:0)""]",[],[],[],[] -4125,https://services1.arcgis.com/JLuzSHjNrLL4Okwb/arcgis/rest/services/Gilbert_Demographics/FeatureServer/0,Personnel Records,200,Layer: GilbertDemographics (ID:0),"",[],"[""Layer: GilbertDemographics (ID:0)""]",[],[],[],[] -4126,https://www.arcgis.com/sharing/rest/content/items/cb520426a7b94b13a2e4aae961037353/data,Calls for Service,200,"","",[],[],[],[],[],[] -4127,https://services1.arcgis.com/79kfd2K6fskCAkyg/arcgis/rest/services/Louisville_Metro_KY_Uniform_Citation_Data_2020/FeatureServer/0,Citations,200,Layer: Louisville_Metro_KY_Uniform_Citation_Data_2020 (ID:0),"",[],"[""Layer: Louisville_Metro_KY_Uniform_Citation_Data_2020 (ID:0)""]",[],[],[],[] -4128,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_Use_of_control_2017/FeatureServer/0,Use of Force Reports,200,Layer: LPD_Use_of_control_2017 (ID:0),"",[],"[""Layer: LPD_Use_of_control_2017 (ID:0)""]",[],[],[],[] -4129,https://services2.arcgis.com/qvkbeam7Wirps6zC/arcgis/rest/services/911_Calls_New/FeatureServer/0,Calls for Service,200,Layer: CallsForService (ID:0),"",[],"[""Layer: CallsForService (ID:0)""]",[],[],[],[] -4130,https://www.arcgis.com/sharing/rest/content/items/f157f98fbaf040cd8240f6764ef731b0/data,Calls for Service,200,"","",,,,,, -4131,https://www.denvergov.org/media/gis/DataCatalog/denver_police_officer_involved_shootings/csv/denver_police_officer_involved_shootings.csv,Officer Involved Shootings,200,"","",[],[],[],[],[],[] -4132,https://services1.arcgis.com/79kfd2K6fskCAkyg/arcgis/rest/services/Louisville_Metro_KY_Uniform_Citation_Data_2022/FeatureServer/0,Citations,200,Layer: Louisville_Metro_KY_Uniform_Citation_Data_2022 (ID:0),"",[],"[""Layer: Louisville_Metro_KY_Uniform_Citation_Data_2022 (ID:0)""]",[],[],[],[] -4133,https://services7.arcgis.com/uRrQ0O3z2aaiIWYU/arcgis/rest/services/2019_Calls_for_Service/FeatureServer/0,Calls for Service,200,Layer: 2019_Calls_for_Service (ID:0),"",[],"[""Layer: 2019_Calls_for_Service (ID:0)""]",[],[],[],[] -4134,data.lacity.org/resource/iy4q-t9vr.json,Calls for Service,200,LAPD Calls for Service 2010 | Los Angeles - Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -4135,https://gis.greensboro-nc.gov/arcgis/rest/services/OpenGateCity/OpenData_ES_DS/MapServer/16,Stops,200,Layer: POL_traffic_5years (ID: 16),"",[],"[""Layer: POL_traffic_5years (ID: 16)""]",[],[],[],[] -4136,https://data.littlerock.gov/Safe-City/Police-Calls-for-Service-December-2020-to-Year-to-/piyt-g5xb,Calls for Service,200,Police Calls for Service December 2020 to Year to Date | City of Little Rock Open Data and Performance,"","[""""]","[""Menu""]",[],[],[],[] -4137,https://data.virginia.gov/Public-Safety/Open-View-Henrico-County-Calls-for-Service/g7aq-7uu3,Calls for Service,404,"","",,,,,, -4138,policeview.johnscreekga.gov/resource/gezc-jm4k.json,Incident Reports,200,"Accident | Johns Creek Police Department | Performance Management -","","[""""]","[""Menu""]",[],[],[],[] -4139,https://www.arcgis.com/sharing/rest/content/items/dec527060160470c8a135dc26764ebac/data,Calls for Service,200,"","",[],[],[],[],[],[] -4140,https://www.arcgis.com/sharing/rest/content/items/0f07240fe4d941e89d23c8b4541453c1/data,Calls for Service,200,"","",[],[],[],[],[],[] -4141,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_traffic_stops_2015/FeatureServer/0,Stops,200,Layer: LPD_traffic_stops_2015 (ID:0),"",[],"[""Layer: LPD_traffic_stops_2015 (ID:0)""]",[],[],[],[] -4142,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/Pursuits_2020_2021/FeatureServer/0,Vehicle Pursuits,200,Layer: Pursuits_2020_2021 (ID:0),"",[],"[""Layer: Pursuits_2020_2021 (ID:0)""]",[],[],[],[] -4143,https://services7.arcgis.com/uRrQ0O3z2aaiIWYU/arcgis/rest/services/Police_Calls_for_Service_2018/FeatureServer/4,Calls for Service,200,Layer: Calls for Service 2018 (ID:4),"",[],"[""Layer: Calls for Service 2018 (ID:4)""]",[],[],[],[] -4144,https://fortlauderdale.data.socrata.com/stories/s/Datasets/u4dm-3u2d/,Calls for Service,200,Datasets,"",[],"[""Menu"", ""FLPD Datasets""]","[""Police Data Disclaimer""]",[],[],[] -4145,https://openpolicing.stanford.edu/data/,Stops,200,Data - The Stanford Open Policing Project,Download the data used in our analysis.,"[""Data""]","[""About the data"", ""Data downloads"", ""Partners""]",[],[],"["" View our code on Github""]",[] -4146,https://policedata-fcpdgis.hub.arcgis.com/pages/fairfax-county-warnings,Stops,200,ArcGIS Hub,"Discover, analyze and download data from ArcGIS Hub. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",[],[],[],[],[],[] -4147,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/Pursuits_2017/FeatureServer/0,Vehicle Pursuits,200,Layer: Pursuits_2017 (ID:0),"",[],"[""Layer: Pursuits_2017 (ID:0)""]",[],[],[],[] -4148,https://www.arcgis.com/sharing/rest/content/items/2817de0e44394cc7987c5414efe943d6/data,Calls for Service,200,"","",[],[],[],[],[],[] -4149,https://data.fayettevillenc.gov/search?tags=Police,List of Data Sources,200,City of Fayetteville Open Data Portal,City of Fayetteville Hub Site,[],[],[],[],[],[] -4150,https://services1.arcgis.com/pNPbgWy7hpfFGWoZ/arcgis/rest/services/OfficerInvolvedShooting/FeatureServer/0,Officer Involved Shootings,200,Home,"",[],"[""Home""]",[],[],[],[] -4151,https://fortlauderdale.data.socrata.com/stories/s/Datasets/u4dm-3u2d/,Personnel Records,200,Datasets,"",[],"[""Menu"", ""FLPD Datasets""]","[""Police Data Disclaimer""]",[],[],[] -4152,https://services1.arcgis.com/pNPbgWy7hpfFGWoZ/arcgis/rest/services/Lansing_MI_Police_Citizen_Complaints/FeatureServer/0,Complaints & Misconduct,200,Home,"",[],"[""Home""]",[],[],[],[] -4153,data.lacity.org/resource/4tmc-7r6g.json,Calls for Service,200,LAPD Calls for Service 2011 | Los Angeles - Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -4154,data.lacity.org/resource/nayp-w2tw.json,Calls for Service,200,LAPD Calls for Service 2018 | Los Angeles - Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -4155,https://www.arcgis.com/sharing/rest/content/items/b8d4004c38864f36807fee10b9a4890b/data,Calls for Service,200,"","",[],[],[],[],[],[] -4156,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/Pursuits_2019/FeatureServer/0,Vehicle Pursuits,200,Layer: Pursuits_2019 (ID:0),"",[],"[""Layer: Pursuits_2019 (ID:0)""]",[],[],[],[] -4157,https://live-durhamnc.opendata.arcgis.com/search?q=police,List of Data Sources,200,"Durham, NC Open Data Portal","City and County of Durham, NC | Open Data Portal",[],[],[],[],[],[] -4158,https://services.arcgis.com/jjSk6t82vIntwDbs/arcgis/rest/services/LVMPD_Calls_For_Service_All/FeatureServer/0,Calls for Service,200,Layer: LVMPD Calls For Service (ID:0),"",[],"[""Layer: LVMPD Calls For Service (ID:0)""]",[],[],[],[] -4159,https://www.arcgis.com/sharing/rest/content/items/d493c4ca6c974e89ac05a27698d4d6b4/data,Calls for Service,200,"","",[],[],[],[],[],[] -4160,data.lacity.org/resource/mgue-vbsx.json,Calls for Service,200,LAPD Calls for Service 2014 | Los Angeles - Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -4161,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_traffic_stops_2017/FeatureServer/0,Stops,200,Layer: LPD_traffic_stops_2017 (ID:0),"",[],"[""Layer: LPD_traffic_stops_2017 (ID:0)""]",[],[],[],[] -4162,data.lacity.org/resource/D5tf-ez2w.json,Incident Reports,404,"","",,,,,, -4163,https://www.arcgis.com/sharing/rest/content/items/9d91ddd193e245528dac6073daff4633/data,Calls for Service,200,"","",[],[],[],[],[],[] -4164,https://data.lacity.org/Public-Safety/Vehicle-and-Pedestrian-Stop-Data-2010-to-Present/ci25-wgt7,Stops,200,"Vehicle and Pedestrian Stop Data 2010 to June 30th, 2018 | Los Angeles - Open Data Portal","","[""""]","[""Menu""]",[],[],[],[] -4165,https://policedata-fcpdgis.hub.arcgis.com/pages/fairfax-county-citations,Citations,200,ArcGIS Hub,"Discover, analyze and download data from ArcGIS Hub. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",[],[],[],[],[],[] -4166,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_Traffic_Stops_2020_2021/FeatureServer/0,Stops,200,Layer: LPD_Traffic_Stops_2020_2021 (ID:0),"",[],"[""Layer: LPD_Traffic_Stops_2020_2021 (ID:0)""]",[],[],[],[] -4167,https://gismaps.ci.fayetteville.nc.us/opendata/rest/services/Police/TSR/MapServer/0,Stops,200,Layer: TSR (ID: 0),"",[],"[""Layer: TSR (ID: 0)""]",[],[],[],[] -4168,data.lacity.org/resource/cibt-wiru.json,Calls for Service,200,LAPD Calls for Service 2021 | Los Angeles - Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -4169,https://xmaps.indy.gov/arcgis/rest/services/OpenData/OpenData_NonSpatial/MapServer/6,Officer Involved Shootings,200,Layer: IMPD Officer Involved Shootings (ID: 6),"",[],"[""Layer: IMPD Officer Involved Shootings (ID: 6)""]",[],[],[],[] -4170,data.lacity.org/resource/84iq-i2r6.json,Calls for Service,200,LAPD Calls for Service 2020 | Los Angeles - Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -4171,https://opendata.lincoln.ne.gov/search?tags=safety,List of Data Sources,200,Lincoln Open Data and Performance Management,Lincoln Open Data and Performance Management.,[],[],[],[],[],[] -4172,data.lacity.org/resource/xwgr-xw5q.json,Calls for Service,200,LAPD Calls for Service 2016 | Los Angeles - Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -4173,https://www.arcgis.com/sharing/rest/content/items/583bc14946854b7eb2fc729049aa39cd/data,Calls for Service,200,"","",[],[],[],[],[],[] -4174,https://services1.arcgis.com/wpJGOi6N4Rq5cqFv/arcgis/rest/services/LPD_Use_of_control_2019/FeatureServer/0,Use of Force Reports,200,Layer: Sheet1 (ID:0),"",[],"[""Layer: Sheet1 (ID:0)""]",[],[],[],[] -4175,https://policedata-fcpdgis.hub.arcgis.com/pages/fairfax-county-arrests,Arrest Records,200,ArcGIS Hub,"Discover, analyze and download data from ArcGIS Hub. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",[],[],[],[],[],[] -4176,https://opengis.detroitmi.gov/arcgis/rest/services/PublicSafety/RMS_Crime_Incidents/FeatureServer/0,Incident Reports,404,"","",,,,,, -4177,https://www.arcgis.com/sharing/rest/content/items/ef454b4fd39a4f36bf0b0b44e2c9bb1f/data,Calls for Service,200,"","",[],[],[],[],[],[] -4178,data.cityofnewyork.us/resource/v5jd-6wqn.json,Use of Force Reports,200,NYPD Use of Force: Members of Service | NYC Open Data,"","[""""]","[""Menu""]",[],[],[],[] -4179,https://data.cityofnewyork.us/Public-Safety/Motor-Vehicle-Collisions-Crashes/h9gi-nx95,Incident Reports,200,Motor Vehicle Collisions - Crashes | NYC Open Data,"","[""""]","[""Menu""]",[],[],[],[] -4180,data.nola.gov/resource/bqmt-f3jk.json,Calls for Service,200,Calls for Service 2017 | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -4181,https://data.montgomerycountymd.gov/Public-Safety/Traffic-Violations/4mse-ku6q,Stops,200,Traffic Violations | Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -4182,https://services.arcgis.com/afSMGVsC7QlRK1kZ/arcgis/rest/services/Police_Stop_Data/FeatureServer/0,Stops,200,Layer: Police_Stop_Data (ID:0),"",[],"[""Layer: Police_Stop_Data (ID:0)""]",[],[],[],[] -4183,https://data.menlopark.org/search?tags=Police,List of Data Sources,200,ArcGIS Hub,"Discover, analyze and download data from ArcGIS Hub. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",[],[],[],[],[],[] -4184,https://data.cityofnewyork.us/Public-Safety/Motor-Vehicle-Collisions-Person/f55k-p6yu,Incident Reports,200,Motor Vehicle Collisions - Person | NYC Open Data,"","[""""]","[""Menu""]",[],[],[],[] -4185,data.nola.gov/resource/3pha-hum9.json,Calls for Service,200,Calls for Service 2021 | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -4186,https://data.nashville.gov/Police/Metro-Nashville-Police-Department-Calls-for-Servic/kwnd-qrrm,Calls for Service,200,Metro Nashville Police Department Calls for Service | Nashville Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -4187,data.nola.gov/resource/wgrp-d3ma.json,Calls for Service,200,Calls for Service 2016 | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -4188,https://data.cityofnewyork.us/browse?Dataset-Information_Agency=Police+Department+%28NYPD%29,List of Data Sources,200,Results matching of Police Department (NYPD) | Page 1 of 2 | NYC Open Data,"","[""Categories"", ""Agency"", ""Tags""]","[""Menu"", ""\n Agency > Police Department (NYPD)\n \n"", ""\n Sort\n "", ""\n Sort by Most Relevant\n \n"", ""\n Filter\n "", ""\nCategories\n\n"", ""\nView Types\n\n"", ""\nData Collection\n\n"", ""\nAgency\n\n"", ""\nTags\n\n"", ""\nMotor Vehicle Collisions - Crashes\n"", ""\nNYPD Complaint Data Historic\n"", ""\nNYPD Arrest Data (Year to Date)\n"", ""\nNYPD Arrests Data (Historic)\n"", ""\nNYPD Complaint Data Current (Year To Date)\n"", ""\nNYPD Shooting Incident Data (Historic)\n"", ""\nNYPD Shooting Incident Data (Year To Date)\n"", ""\nCitywide Crime Statistics\n"", ""\nNYPD Complaint Map (Year to Date)\n"", ""\nNYPD Hate Crimes\n"", ""\nNYPD Complaint Map (Historic)\n"", ""\nNYPD Calls for Service (Year to Date)\n"", ""\nMotor Vehicle Collisions - Vehicles\n"", ""\nMotor Vehicle Collisions - Person\n"", ""\nNYC Park Crime Data\n"", ""\nThe Stop, Question and Frisk Data\n"", ""\nNYPD Criminal Court Summons (Historic)\n"", ""\nNYPD Criminal Court Summons Incident Level Data (Year To Date)\n"", ""\nNYPD Sectors\n"", ""\nMotor Vehicle Collisions Summary Reports\n"", ""\nNYPD Calls for Service (Historic)\n"", ""\nCrime Enforcement Activity\n"", ""\nNYPD Personnel Demographics\n"", ""\nUntitled Visualization - Based on NYPD Motor Vehicle Collisions\n"", ""\nNYPD Use of Force Incidents\n"", ""A-Z"", ""A-Z"", ""A-Z""]",[],[],[],[] -4189,data.nola.gov/resource/5fn8-vtui.json,Calls for Service,200,Calls for Service 2013 | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -4190,https://www.nyc.gov/assets/nypd/downloads/excel/analysis_and_planning/stop-question-frisk/sqf-2018.xlsx,Stops,200,"","",[],[],[],[],[],[] -4191,https://services7.arcgis.com/uRrQ0O3z2aaiIWYU/arcgis/rest/services/Officer_Initiated_Traffic_Stops/FeatureServer/0,Stops,200,Layer: Officer Initiated Stops (ID:0),"",[],"[""Layer: Officer Initiated Stops (ID:0)""]",[],[],[],[] -4192,https://data.nola.gov/browse?category=Public+Safety+and+Preparedness&limitTo=datasets,List of Data Sources,200,Results matching category of Public Safety and Preparedness and type of Datasets | Page 1 of 5 | Data.NOLA.gov,"","[""Categories"", ""Departments"", ""Tags""]","[""Menu"", ""\n Categories > Public Safety and Preparedness\n \n"", ""\n View Types > Datasets\n \n"", ""\n Sort\n "", ""\n Sort by Recently Updated\n \n"", ""\n Filter\n "", ""\nCategories\n\n"", ""\nView Types\n\n"", ""\nDepartments\n\n"", ""\nTags\n\n"", ""\nCalls for Service 2024\n"", ""\nNOPD Misconduct Complaints\n"", ""\nNOPD Use of Force Incidents\n"", ""\nStop and Search (Field Interviews)\n"", ""\nGas Stations\n"", ""\nHardware Stores\n"", ""\nDrug Stores\n"", ""\nGrocery Stores\n"", ""\nNOPD Body Worn Camera Metadata\n"", ""\nCalls for Service 2023\n"", ""A-Z"", ""A-Z"", ""A-Z""]",[],[],[],[] -4193,https://www.nyc.gov/assets/nypd/downloads/excel/analysis_and_planning/stop-question-frisk/csi-2947-2019-sqf-cy2017-updated1-9-2020.xlsx,Stops,200,"","",[],[],[],[],[],[] -4194,data.nola.gov/resource/w68y-xmk6.json,Calls for Service,200,Calls for Service 2015 | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -4195,data.cityofnewyork.us/resource/6xgr-kwjq.json,Complaints & Misconduct,200,Civilian Complaint Review Board: Allegations Against Police Officers | NYC Open Data,"","[""""]","[""Menu""]",[],[],[],[] -4196,https://data.nola.gov/Public-Safety-and-Preparedness/NOPD-Use-of-Force-Incidents/9mnw-mbde,Use of Force Reports,200,NOPD Use of Force Incidents | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -4197,https://www1.nyc.gov/assets/nypd/downloads/excel/analysis_and_planning/stop-question-frisk/sqf-2015.csv,Stops,200,"","",[],[],[],[],[],[] -4198,https://www1.nyc.gov/assets/nypd/downloads/zip/analysis_and_planning/stop-question-frisk/sqf-2012-csv.zip,Stops,200,"","",[],[],[],[],[],[] -4199,https://data.cityofnewyork.us/Public-Safety/Civilian-Complaint-Review-Board-Complaints-Against/2mby-ccnw,Complaints & Misconduct,200,Civilian Complaint Review Board: Complaints Against Police Officers | NYC Open Data,"","[""""]","[""Menu""]",[],[],[],[] -4200,https://www.nyc.gov/assets/nypd/downloads/excel/analysis_and_planning/stop-question-frisk/sqf-2020.xlsx,Stops,200,"","",[],[],[],[],[],[] -4201,data.cityofnewyork.us/resource/2fir-qns4.json,Complaints & Misconduct,200,Civilian Complaint Review Board: Police Officers | NYC Open Data,"","[""""]","[""Menu""]",[],[],[],[] -4202,data.cityofnewyork.us/resource/f4tj-796d.json,Use of Force Reports,200,NYPD Use of Force Incidents | NYC Open Data,"","[""""]","[""Menu""]",[],[],[],[] -4203,data.nola.gov/resource/qf6q-pp4b.json,Calls for Service,200,Calls for Service 2019 | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -4204,https://www.nyc.gov/assets/nypd/downloads/excel/analysis_and_planning/stop-question-frisk/sqf-2021.xlsx,Stops,200,"","",[],[],[],[],[],[] -4205,data.cityofnewyork.us/resource/dufe-vxb7.json,Use of Force Reports,200,NYPD Use of Force: Subjects | NYC Open Data,"","[""""]","[""Menu""]",[],[],[],[] -4206,data.nola.gov/resource/28ec-c8d6.json,Calls for Service,200,Calls for Service 2011 | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -4207,https://opendata.minneapolismn.gov/datasets/cityoflakes::police-officer-involved-shootings/about,Officer Involved Shootings,200,Police Officer Involved Shootings,Officer Involved Shooting Data for the Minneapolis Police Department,[],[],[],[],[],[] -4208,https://www.njoag.gov/trafficstops/,Stops,200,New Jersey State Police - Traffic Stop Data Dashboard - New Jersey Office of Attorney General,"","[""New Jersey State Police \u2013 Traffic Stop Data Dashboard"", ""Juvenile Justice Commission"", ""JJC Careers""]","[""STATE OF NEW JERSEY | DEPARTMENT OF LAW & PUBLIC SAFETY"", ""OFFICE OF THE ATTORNEY GENERAL"", ""Overview of the Opioid Crisis"", ""Police & Community\nListening Sessions"", ""ALERT"", ""National Crime Victims Rights Week"", ""It\u2019s Your Turn to Design Your Destiny!Submit Your Painted Wheel Creation!"", ""Enter Now for a Chance to Have Your Steering WheelFeatured on The NJ Division of Highway Traffic Safety\u2019sSocial Channels. Contest Ends December 1st , 2021""]","[""New Jersey State Police \u2013 Traffic Stop Data Dashboard"", ""Request for Quote: Implicit Bias Awareness Training for Police"", ""6PM-8PM"", ""The Future of Juvenile Justice Reform"", ""The JJC is hiring!"", ""Police & CommunityListening Sessions"", ""Thank you for your interest in attending our 2023 Crime Victims\u2019 Rights Week Ceremony. Due to overwhelming interest, we have reached our attendance limit and registration is now closed. To learn more about the Division of Violence Intervention and Victim Assistance, please visit: www.njoag.gov/viva"", ""NJRC Feedback"", ""OAG Excellence Awards for Victims\u2019 Justice""]","[""About"", ""Media"", ""Contact"", ""Attorney General\u2019s Priorities"", ""Ongoing Programs"", ""Resources"", ""2023 Strategic Plan"", ""PPD NEXTGEN REPORT"", ""A citywide virtual meeting will be conducted for those who cannot attend in-person"", ""Residents will have an opportunity to ask questions and submit written feedback"", ""Thoughts, comments and suggestions, can also be submitted through the PPD Website"", ""Friday, April 29, 2022 \u2013 Virtual Event10:00AM \u2013 11:30AM""]","[""OCTOBER 3, 2023""]",[] -4209,https://data.cityofnewyork.us/Public-Safety/NYPD-Arrests-Data-Historic-/8h9b-rp9u,Arrest Records,200,NYPD Arrests Data (Historic) | NYC Open Data,"","[""""]","[""Menu""]",[],[],[],[] -4210,https://services.arcgis.com/afSMGVsC7QlRK1kZ/arcgis/rest/services/Police_Use_of_Force/FeatureServer/0,Use of Force Reports,200,Layer: Police_Use_of_Force (ID:0),"",[],"[""Layer: Police_Use_of_Force (ID:0)""]",[],[],[],[] -4211,https://opendata.minneapolismn.gov/search?q=police,List of Data Sources,200,Open Minneapolis,Open Minneapolis,[],[],[],[],[],[] -4212,https://data.montgomerycountymd.gov/Public-Safety/Internal-Affairs-Allegations/usip-62e2,Complaints & Misconduct,200,Internal Affairs Allegations | Open Data Portal,"","[""""]","[""Menu""]",[],[],[],[] -4213,data.nola.gov/resource/kitu-f4uy.json,Stops,200,Stop and Search (Field Interviews) | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -4214,https://www1.nyc.gov/assets/nypd/downloads/excel/analysis_and_planning/stop-question-frisk/sqf-2016.csv,Stops,200,"","",[],[],[],[],[],[] -4215,data.cityofnewyork.us/resource/5vr7-5fki.json,Personnel Records,200,NYPD Personnel Demographics | NYC Open Data,"","[""""]","[""Menu""]",[],[],[],[] -4216,data.nola.gov/resource/rv3g-ypg7.json,Calls for Service,200,Calls for Service 2012 | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -4217,data.nola.gov/resource/jsyu-nz5r.json,Calls for Service,200,Calls for Service 2014 | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -4218,https://data.cityofnewyork.us/Public-Safety/Motor-Vehicle-Collisions-Vehicles/bm4k-52h4,Incident Reports,200,Motor Vehicle Collisions - Vehicles | NYC Open Data,"","[""""]","[""Menu""]",[],[],[],[] -4219,https://www1.nyc.gov/assets/nypd/downloads/zip/analysis_and_planning/stop-question-frisk/sqf-2013-csv.zip,Stops,200,"","",[],[],[],[],[],[] -4220,https://www.nyc.gov/assets/nypd/downloads/excel/analysis_and_planning/stop-question-frisk/sqf-2019.xlsx,Stops,200,"","",[],[],[],[],[],[] -4221,https://www.njoag.gov/force/#policy,Policies & Contracts,200,Use of Force Policy - New Jersey Office of Attorney General,"","[""Use of Force Policy"", ""Juvenile Justice Commission"", ""JJC Careers""]","[""STATE OF NEW JERSEY | DEPARTMENT OF LAW & PUBLIC SAFETY"", ""OFFICE OF THE ATTORNEY GENERAL"", ""Overview of the Opioid Crisis"", ""Police & Community\nListening Sessions"", ""ALERT"", ""National Crime Victims Rights Week"", ""It\u2019s Your Turn to Design Your Destiny!Submit Your Painted Wheel Creation!"", ""Enter Now for a Chance to Have Your Steering WheelFeatured on The NJ Division of Highway Traffic Safety\u2019sSocial Channels. Contest Ends December 1st , 2021""]","[""Reducing Use of Force by Law Enforcement"", ""Request for Quote: Implicit Bias Awareness Training for Police"", ""6PM-8PM"", ""The Future of Juvenile Justice Reform"", ""The JJC is hiring!"", ""Police & CommunityListening Sessions"", ""Thank you for your interest in attending our 2023 Crime Victims\u2019 Rights Week Ceremony. Due to overwhelming interest, we have reached our attendance limit and registration is now closed. To learn more about the Division of Violence Intervention and Victim Assistance, please visit: www.njoag.gov/viva"", ""NJRC Feedback"", ""OAG Excellence Awards for Victims\u2019 Justice""]","[""About"", ""Media"", ""Contact"", ""Attorney General\u2019s Priorities"", ""Ongoing Programs"", ""Resources"", ""2023 Strategic Plan"", ""PPD NEXTGEN REPORT"", ""A citywide virtual meeting will be conducted for those who cannot attend in-person"", ""Residents will have an opportunity to ask questions and submit written feedback"", ""Thoughts, comments and suggestions, can also be submitted through the PPD Website"", ""Friday, April 29, 2022 \u2013 Virtual Event10:00AM \u2013 11:30AM""]","[""OCTOBER 3, 2023""]",[] -4222,data.nola.gov/resource/hp7u-i9hf.json,Calls for Service,200,Call for Service 2020 | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -4223,data.nola.gov/resource/gz2m-ef5u.json,Complaints & Misconduct,200,NOPD Misconduct Complaints | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -4224,data.nola.gov/resource/nci8-thrr.json,Calls for Service,200,Calls for Service 2022 | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -4225,data.cityofnewyork.us/resource/keep-pkmh.json,Complaints & Misconduct,200,Civilian Complaint Review Board: Penalties | NYC Open Data,"","[""""]","[""Menu""]",[],[],[],[] -4226,data.nola.gov/resource/9san-ivhk.json,Calls for Service,200,Calls for Service 2018 | Data.NOLA.gov,"","[""""]","[""Menu""]",[],[],[],[] -4227,https://www1.nyc.gov/assets/nypd/downloads/zip/analysis_and_planning/stop-question-frisk/sqf-2014-csv.zip,Stops,200,"","",[],[],[],[],[],[] -4228,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/47,Calls for Service,200,Layer: TPD_CFS_PUBLIC_2019 (ID: 47),"",[],"[""Layer: TPD_CFS_PUBLIC_2019 (ID: 47)""]",[],[],[],[] -4229,https://www.normanok.gov/public-safety/police-department/open-data-portal/contacts,Citations,200,"Contacts | City of Norman, OK",Norman Police Department Open Data Portal Data Set pertaining to Contacts.,"[""City of Norman, OK"", ""City of Norman, OK"", ""Contacts\n""]","[""What can we help you find?"", ""Breadcrumb"", ""\n Data Sets\n "", ""Footer menu"", ""Footer Second Column"", ""Connect with Us""]","[""Open Data Portal"", ""\n Traffic and Parking Contacts\n ""]","[""\nNOTICE\n"", ""\nNOTICE\n"", ""\nNOTICE\n""]","[""Winter Weather Information"", ""Business and Citizen Self-Service Portal"", ""Information on City Council and Committee Meetings""]",[] -4230,https://www.pittsfieldpd.org/open-data-portal/,Calls for Service,200,Open Data Portal – Pittsfield Police Department,"","[""Open Data Portal""]","[""Arrests"", ""Calls for Service"", ""Hate Crimes"", ""Motor Vehicle Accidents"", ""Equipment Purchases""]",[],[],[],[] -4231,https://phoenixopendata.com/group/public-safety,List of Data Sources,200,Public Safety - Group - City of Phoenix Open Data,"","[""\n Public Safety\n \n "", ""\n\n\n\n\n\n \n \n \n \n\n9 datasets found""]","[""\n\n\t\t\t \n\t\t\t Departments\n\t\t\t"", ""\n\n\t\t\t \n\t\t\t Groups\n\t\t\t"", ""\n\n\t\t\t \n\t\t\t Tags\n\t\t\t"", ""\n\n\t\t\t \n\t\t\t Formats\n\t\t\t"", ""\n\n\t\t\t \n\t\t\t Licenses\n\t\t\t"", ""\nOfficer Involved Shooting (OIS)\n"", ""\nCalls for Service\n"", ""\nCrime Data\n"", ""\nCalls for Service\n"", ""\nOfficer Pointed Gun at Person (PGP)\n"", ""\nTraffic Citations\n"", ""\nAdult Arrests\n"", ""\nPolice Officer Demographics\n"", ""\nFire Department Operational Statistics\n""]",[],[],[],[] -4232,https://www.opendataphilly.org/dataset/police-complaints,Complaints & Misconduct,404,"","",,,,,, -4233,https://information.stpaul.gov/datasets/stpaul::traffic-stops/explore,Stops,200,Traffic Stops,Traffic stops initiated by the City of Saint Paul's Police Department,[],[],[],[],[],[] -4234,https://data.seattle.gov/Public-Safety/Office-of-Police-Accountability-Complaints/99yi-dthu,Complaints & Misconduct,404,"","",,,,,, -4235,https://www.opendataphilly.org/dataset/vehicular-crash-data/resource/d28c1e89-4c56-4119-9d4c-122999a75b38,Incident Reports,404,"","",,,,,, -4236,https://www.norwichct.org/846/Police-Officer-Involved-Shooting,Officer Involved Shootings,200,"Police Officer Involved Shooting - 2005 to present | Norwich, CT - Official Website","","[""\r\n\r\nPolice Officer Involved Shooting - 2005 to present\t\t""]","[""Norwich City Hall, 100 Broadway, Norwich, CT 06360""]","[""Loading"", """", """"]",[],[],[] -4237,https://data.sanjoseca.gov/dataset/police-calls-for-service,Calls for Service,200,Police-Calls-for-Service - Dataset - San Jose CA Open Data Portal,"","[""Police-Calls-for-Service"", ""Police\n \n "", ""\n \n Police-Calls-for-Service\n \n \n \n ""]","["" Department"", "" Social"", "" License"", ""Data and Resources""]","[""Additional Info""]",[],[],[] -4238,https://phoenixopendata.com/dataset/citations,Citations,200,Traffic Citations - Dataset - City of Phoenix Open Data,"","[""Traffic Citations"", ""Police\n \n "", ""\n \n Traffic Citations\n \n \n \n ""]","["" Department"", "" Social"", "" License"", ""Data and Resources""]","[""Provide your feedback!"", ""Additional Info""]",[],[],[] -4239,https://data.seattle.gov/Public-Safety/SPD-Officer-Involved-Shooting-OIS-Data/mg5r-efcm,Officer Involved Shootings,200,SPD Officer Involved Shooting (OIS) Data | City of Seattle Open Data portal,"","[""""]","[""Menu""]",[],[],[],[] -4240,https://data.sandiego.gov/datasets/crb-cases/,Complaints & Misconduct,200,Complaints Evaluated by the Commission on Police Practices - City of San Diego Open Data Portal," - In 2020, voter-approved Measure B created a new independent Commission on Police Practices (CPP) that replaced the Community Review Board on Police Practices... - ",[],"[""\nComplaints Evaluated by the Commission on Police Practices\n""]","["""", ""Additional Info""]","[""Cases FY20-FY23""]",[],[] -4241,https://www.cityofsparks.us/police_home/about_us/reports_and_crime_stats/officer_involved_shootings.php,Officer Involved Shootings,200,"Sparks, NV Police","","[""\r\n\r\nOfficer Involved Shootings""]","[""\n\r\n\t\t\tRelated Pages\r\n\t\t"", ""Share this page"", """"]","[""""]",[],[],[] -4242,https://www.portland.gov/police/open-data/ppb-use-force-dashboard,Use of Force Reports,200,Police Use of Force Dashboard | Portland.gov,The Use of Force Report is an interactive data visualization summarizing most use of force Incidents by Portland Police Bureau members. This tool is built to provide custom analyses of use of force data to interested members of the community.,"[""Police Use of Force Dashboard\n""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Walkthrough - Use of Force Dashboard"", ""Metadata for Use of Force Dashboard"", ""Topics"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]","[""1. Report Overview"", ""2. Technical Specifications"", ""3. Using the Interactive Features"", ""\u00a04. Visualizations Walkthrough"", ""5. Data Download page""]",[],[],[] -4243,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/14,Calls for Service,200,Layer: TPD_CFS_PUBLIC_2014 (ID: 14),"",[],"[""Layer: TPD_CFS_PUBLIC_2014 (ID: 14)""]",[],[],[],[] -4244,https://stjohnin.gov/PD/PDI/Department/Agency.php,Personnel Records,200,Town of St. John - Police Department Agency Demographics,"This is the offical website for the Town of St. John, Indiana.","[""Agency Demographics""]",[],"[""Datasets""]","[""Block Party Permit "", ""Citations "", "" Crime Map"", ""Daily Bulletin "", ""Handgun License "", ""Fireworks Information"", ""Peddler/Solicitor"", ""Police Data Initiative"", ""SafeTrade"", ""Text and E-Mail Notification System"", ""Vacation Check Request""]","[""Arrest Demographics"", ""Bias Crimes"", ""Calls for Service / Daily Bulletin"", ""Department Demographics"", ""Peddler/Solicitor Licenses"", ""Response to Resistance"", ""Training"", ""Traffic Stops"", ""Traffic Accidents"", ""Traffic Citation Demographics"", ""Traffic Warning Demographics"", ""Year End Reports"", ""Accessibility\u00a0 Copyright \u00a9 2024 Town of St. John, Indiana Accessible Version\u00a0 Follow us on ""]",[] -4245,https://gisdata.tucsonaz.gov/search?groupIds=b6a49faa168647d8b56e1a06bd53600f,List of Data Sources,200,Tucson Open Data,"This is the City of Tucson's public platform for exploring and downloading open data, discovering and building apps, and engaging to solve important local issues.",[],[],[],[],[],[] -4246,https://data-santarosa.opendata.arcgis.com/search?q=calls,Calls for Service,200,City of Santa Rosa,City of Santa Rosa Open Data Portal: Access to public information to facilitate transparency and knowledge.,[],[],[],[],[],[] -4247,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/68,Calls for Service,200,Layer: TPD_CFS_PUBLIC_2021 (ID: 68),"",[],"[""Layer: TPD_CFS_PUBLIC_2021 (ID: 68)""]",[],[],[],[] -4248,https://stjohnin.gov/PD/PDI/CFS/,Calls for Service,200,Town of St. John - Police Department Calls for Service,"This is the offical website for the Town of St. John, Indiana.","[""Calls for Service / Daily Bulletin""]",[],"[""Datasets""]","[""Block Party Permit "", ""Citations "", "" Crime Map"", ""Daily Bulletin "", ""Handgun License "", ""Fireworks Information"", ""Peddler/Solicitor"", ""Police Data Initiative"", ""SafeTrade"", ""Text and E-Mail Notification System"", ""Vacation Check Request""]","[""The St. John Police Department takes great effort in making data as accurate as possible, but there is no avoiding the introduction of errors in this process, which relies on data that cannot always be verified. Information contained in this dataset may change over a period of time. The St. John Police Department is not responsible for any error or omission from this data, or for the use or interpretation of the results of any research conducted."", ""2024 Calls For Service"", ""2023 Calls For Service"", ""2022 Calls For Service"", ""2021 Calls For Service"", ""2020 Calls For Service"", ""2019 Calls For Service"", ""2018 Calls For Service"", ""2017 Calls For Service"", ""2016 Calls For Service"", ""2015 Calls For Service"", ""2014 Calls For Service"", ""2013 Calls For Service"", ""2012 Calls For Service"", ""2011 Calls For Service"", ""2010 Calls For Service"", ""2009 Calls For Service"", ""2008 Calls For Service"", ""2007 Calls For Service"", ""2006 Calls For Service"", ""Arrest Demographics"", ""Bias Crimes"", ""Calls for Service / Daily Bulletin"", ""Department Demographics"", ""Peddler/Solicitor Licenses"", ""Response to Resistance"", ""Training"", ""Traffic Stops"", ""Traffic Accidents"", ""Traffic Citation Demographics"", ""Traffic Warning Demographics"", ""Year End Reports"", ""Accessibility\u00a0 Copyright \u00a9 2024 Town of St. John, Indiana Accessible Version\u00a0 Follow us on ""]",[] -4249,www.transparentrichmond.org/resource/ni82-hdjg.json,Stops,200,Stop Data Demographics | Transparent Richmond,"","[""""]","[""Menu""]",[],[],[],[] -4250,https://data.stlouisco.com/documents/uses-of-force-2018-2021-ytd/about,Use of Force Reports,200,Uses of Force: 2018-2021 YTD,File contains data on uses of force by the St. Louis County Police Department between 2018 and the first quarter of 2021.,[],[],[],[],[],[] -4251,https://phoenixopendata.com/dataset/officer-demographics,Personnel Records,200,Police Officer Demographics - Dataset - City of Phoenix Open Data,"","[""Police Officer Demographics"", ""Police\n \n "", ""\n \n Police Officer Demographics\n \n \n \n ""]","["" Department"", "" Social"", "" License"", ""Data and Resources""]","[""Provide your feedback!"", ""Additional Info""]",[],[],[] -4252,https://www.norwichct.org/847/Police-Use-of-Force,Use of Force Reports,200,"Police Use of Force | Norwich, CT - Official Website","","[""\r\n\r\nPolice Use of Force\t\t""]","[""Norwich City Hall, 100 Broadway, Norwich, CT 06360""]","[""Loading"", """", """"]",[],[],[] -4253,"",Stops,-1,"","",,,,,, -4254,https://www.transparentrichmond.org/Police-Department/Richmond-Police-Department-Citations/8j44-b794,Citations,200,Richmond Police Department - Citations | Transparent Richmond,"","[""""]","[""Menu""]",[],[],[],[] -4255,https://data-southbend.opendata.arcgis.com/search?tags=use%20of%20force,Use of Force Reports,200,Open Data Portal City of South Bend,City of South Bend Open Data Site,[],[],[],[],[],[] -4256,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/39,Calls for Service,200,Layer: TPD_CFS_PUBLIC_2018 (ID: 39),"",[],"[""Layer: TPD_CFS_PUBLIC_2018 (ID: 39)""]",[],[],[],[] -4257,https://www.normanok.gov/public-safety/police-department/open-data-portal/complaints-inquiries,Complaints & Misconduct,404,"","",,,,,, -4258,https://www.pittsfieldpd.org/open-data-portal/,Incident Reports,200,Open Data Portal – Pittsfield Police Department,"","[""Open Data Portal""]","[""Arrests"", ""Calls for Service"", ""Hate Crimes"", ""Motor Vehicle Accidents"", ""Equipment Purchases""]",[],[],[],[] -4259,https://phoenixopendata.com/dataset/pgp,Incident Reports,200,Officer Pointed Gun at Person (PGP) - Dataset - City of Phoenix Open Data,"","[""Officer Pointed Gun at Person (PGP)"", ""Police\n \n "", ""\n \n Officer Pointed Gun at Person (PGP)\n \n \n \n ""]","["" Department"", "" Social"", "" License"", ""Data and Resources""]","[""Provide your feedback!"", ""Additional Info""]",[],[],[] -4260,https://stjohnin.gov/PD/PDI/,List of Data Sources,200,Town of St. John - Police Data Initiative,"This is the offical website for the Town of St. John, Indiana.","[""Police Data Initiative""]",[],"[""Datasets""]","[""Block Party Permit "", ""Citations "", "" Crime Map"", ""Daily Bulletin "", ""Handgun License "", ""Fireworks Information"", ""Peddler/Solicitor"", ""Police Data Initiative"", ""SafeTrade"", ""Text and E-Mail Notification System"", ""Vacation Check Request""]","[""The St. John Police Department is currently participating in the Police Data Initiative (PDI) as part of the President's Taskforce on 21st Century Policing. As a participant in this program, we will be publishing specific data to build transparency, increase community trust, and to use data to enhance internal accountability through effective analysis."", ""The St. John Police Department takes great effort in making data as accurate as possible, but there is no avoiding the introduction of errors in this process, which relies on data that cannot always be verified. Information contained in these datasets may change over a period of time. The St. John Police Department is not responsible for any error or omission from this data, or for the use or interpretation of the results of any research conducted."", ""The datasets provided are available for download in an open data format, a CSV (comma separated value) file, that can be used in other applications for data analysis."", ""Arrest Demographics"", ""Bias Crimes"", ""Calls for Service / Daily Bulletin"", ""Department Demographics"", ""Peddler/Solicitor Licenses"", ""Response to Resistance"", ""Training"", ""Traffic Stops"", ""Traffic Accidents"", ""Traffic Citation Demographics"", ""Traffic Warning Demographics"", ""Year End Reports"", ""Accessibility\u00a0 Copyright \u00a9 2024 Town of St. John, Indiana Accessible Version\u00a0 Follow us on ""]",[] -4261,https://data.vbgov.com/dataset/police-calls-for-service,Calls for Service,-1,"","",,,,,, -4262,https://coc-colacitygis.opendata.arcgis.com/datasets/ColaCityGIS::arrest-1-1-2016-to-3-31-2022/explore?location=34.148902%2C-81.198034%2C10.62,Arrest Records,200,City of Columbia GIS - South Carolina,City of Columbia GIS - South Carolina,[],[],[],[],[],[] -4263,https://phoenixopendata.com/dataset/calls-for-service,Calls for Service,200,Calls for Service - Dataset - City of Phoenix Open Data,"","[""Calls for Service"", ""Police\n \n "", ""\n \n Calls for Service\n \n \n \n ""]","["" Department"", "" Social"", "" License"", ""Data and Resources""]","[""Additional Info""]",[],[],[] -4264,https://www.pittsfieldpd.org/open-data-portal/,Arrest Records,200,Open Data Portal – Pittsfield Police Department,"","[""Open Data Portal""]","[""Arrests"", ""Calls for Service"", ""Hate Crimes"", ""Motor Vehicle Accidents"", ""Equipment Purchases""]",[],[],[],[] -4265,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/36,Officer Involved Shootings,200,Layer: TPD_OIS_Officers (ID: 36),"",[],"[""Layer: TPD_OIS_Officers (ID: 36)""]",[],[],[],[] -4266,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/16,Calls for Service,200,Layer: TPD_CFS_PUBLIC_2016 (ID: 16),"",[],"[""Layer: TPD_CFS_PUBLIC_2016 (ID: 16)""]",[],[],[],[] -4267,https://www.winooskivt.gov/DocumentCenter/Index/139,Stops,200,"Document Center • Winooski, VT • CivicEngage",The Document Center is for storage of documents of many different file types. Documents stored in the Document Center can be separated by folders and subfolders.,[],[],"[""Loading"", ""\r\n\t\t\t\t\t\tFilter Documents by:"", ""Contact Us"", ""Quick Links"", ""Site Links""]",[],[],[] -4268,https://data-santarosa.opendata.arcgis.com/datasets/santa-rosa-police-complaints/explore,Complaints & Misconduct,200,Santa Rosa Police Complaints,City of Santa Rosa Police Complaints,[],[],[],[],[],[] -4269,https://www.opendataphilly.org/dataset/shooting-victims,Officer Involved Shootings,404,"","",,,,,, -4270,data.vermont.gov/resource/du86-kfnp.json,Officer Involved Shootings,200,Vermont State Police Officer Involved Shootings (1977-Present) | Open Data | State of Vermont,"","[""""]","[""Menu""]",[],[],[],[] -4271,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/17,Calls for Service,200,Layer: TPD_CFS_PUBLIC_2017 (ID: 17),"",[],"[""Layer: TPD_CFS_PUBLIC_2017 (ID: 17)""]",[],[],[],[] -4272,https://data-santarosa.opendata.arcgis.com/datasets/santa-rosa-police-pursuits/explore,Vehicle Pursuits,200,Santa Rosa Police Pursuits,City of Santa Rosa Police Pursuits,[],[],[],[],[],[] -4273,https://www.normanok.gov/public-safety/police-department/open-data-portal/contacts,Field Contacts,200,"Contacts | City of Norman, OK",Norman Police Department Open Data Portal Data Set pertaining to Contacts.,"[""City of Norman, OK"", ""City of Norman, OK"", ""Contacts\n""]","[""What can we help you find?"", ""Breadcrumb"", ""\n Data Sets\n "", ""Footer menu"", ""Footer Second Column"", ""Connect with Us""]","[""Open Data Portal"", ""\n Traffic and Parking Contacts\n ""]","[""\nNOTICE\n"", ""\nNOTICE\n"", ""\nNOTICE\n""]","[""Winter Weather Information"", ""Business and Citizen Self-Service Portal"", ""Information on City Council and Committee Meetings""]",[] -4274,https://services7.arcgis.com/wMvCpnbQEKXZsPSQ/arcgis/rest/services/RPD_Police_Personnel/FeatureServer/0,Personnel Records,200,Layer: RPD.DBO.Police_Personnel (ID:0),"",[],"[""Layer: RPD.DBO.Police_Personnel (ID:0)""]",[],[],[],[] -4275,https://www.portland.gov/police/open-data/ois,Officer Involved Shootings,200,Officer Involved Shootings | Portland.gov,Dynamic data dashboard describing PPB officer involved shootings from 2010 to current.,"[""Officer Involved Shootings\n""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Dashboard Walkthrough"", ""Metadata"", ""Related"", ""Topics"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]","[""2. Technical Specifications"", ""3. Visualization Walkthrough"", ""4. Download Data""]","[""a. Cases by Year with Subject Injury Type"", ""b. Initial Call Type"", ""c.\u00a0Aggregate Statistics"", ""d. Additional Aggregate Statistics"", ""e.\u00a0Subject Weapon"", ""f.\u00a0Demographics"", ""g.\u00a0Subject Age Ranges"", ""h. Toolbar\u00a0\u00a0""]",[],[] -4276,https://stjohnin.gov/PD/PDI/Training/,Training & Hiring Info,200,Town of St. John - Police Department Training,"This is the offical website for the Town of St. John, Indiana.","[""Police Data Initative Dataset for Training""]",[],"[""Datasets""]","[""Block Party Permit "", ""Citations "", "" Crime Map"", ""Daily Bulletin "", ""Handgun License "", ""Fireworks Information"", ""Peddler/Solicitor"", ""Police Data Initiative"", ""SafeTrade"", ""Text and E-Mail Notification System"", ""Vacation Check Request""]","[""The St. John Police Department takes great effort in making data as accurate as possible, but there is no avoiding the introduction of errors in this process, which relies on data that cannot always be verified. Information contained in this dataset may change over a period of time. The St. John Police Department is not responsible for any error or omission from this data, or for the use or interpretation of the results of any research conducted."", ""2018 Training"", ""2019 Training"", ""Arrest Demographics"", ""Bias Crimes"", ""Calls for Service / Daily Bulletin"", ""Department Demographics"", ""Peddler/Solicitor Licenses"", ""Response to Resistance"", ""Training"", ""Traffic Stops"", ""Traffic Accidents"", ""Traffic Citation Demographics"", ""Traffic Warning Demographics"", ""Year End Reports"", ""Accessibility\u00a0 Copyright \u00a9 2024 Town of St. John, Indiana Accessible Version\u00a0 Follow us on ""]",[] -4277,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/13,Calls for Service,200,Layer: TPD_CFS_PUBLIC_2013 (ID: 13),"",[],"[""Layer: TPD_CFS_PUBLIC_2013 (ID: 13)""]",[],[],[],[] -4278,https://policeanalysis.tucsonaz.gov/,List of Data Sources,200,Tucson Police Data & Analysis,"As part of our commitment to transparency and accountability, the Tucson Police Department is empowering community members to explore and download policing data.",[],[],[],[],[],[] -4279,https://phoenixopendata.com/dataset/arrests,Arrest Records,200,Adult Arrests - Dataset - City of Phoenix Open Data,"","[""Adult Arrests"", ""Police\n \n "", ""\n \n Adult Arrests\n \n \n \n ""]","["" Department"", "" Social"", "" License"", ""Data and Resources""]","[""Provide your feedback!"", ""Additional Info""]",[],[],[] -4280,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/53,Calls for Service,200,Layer: TPD_CFS_PUBLIC_2020 (ID: 53),"",[],"[""Layer: TPD_CFS_PUBLIC_2020 (ID: 53)""]",[],[],[],[] -4281,https://data.stlouisco.com/apps/st-louis-county-police-department-uses-of-force/explore,Use of Force Reports,404,"","",,,,,, -4282,https://www.normanok.gov/public-safety/police-department/open-data-portal/use-force,Use of Force Reports,200,"Complaints, Inquiries, and Use of Force | City of Norman, OK","Norman Police Department Open Data Portal Datasets pertaining to complaints, inquiries, and uses of force.","[""City of Norman, OK"", ""City of Norman, OK"", ""Complaints, Inquiries, and Use of Force\n""]","[""What can we help you find?"", ""Breadcrumb"", ""\n Incidents by Type and Disposition \n "", ""\n Subjects by Incidents and Demographics\n "", ""\n Subjects by Allegation and Finding\n "", ""\n Subjects by Resistance and Force\n "", ""Footer menu"", ""Footer Second Column"", ""Connect with Us""]","[""Open Data Portal"", ""\n Terms Used\n "", ""\n Data Sets by Year\n "", ""\n Terms Used\n "", ""\n Data Sets by Year\n "", ""\n Terms Used\n "", ""\n Data Sets by Year\n "", ""\n Terms Used\n "", ""\n Data Sets by Year\n ""]","[""\nNOTICE\n"", ""\nNOTICE\n"", ""\nNOTICE\n""]","[""Winter Weather Information"", ""Business and Citizen Self-Service Portal"", ""Information on City Council and Committee Meetings""]",[] -4283,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/15,Calls for Service,200,Layer: TPD_CFS_PUBLIC_2015 (ID: 15),"",[],"[""Layer: TPD_CFS_PUBLIC_2015 (ID: 15)""]",[],[],[],[] -4284,https://data.cityofsacramento.org/search?collection=Dataset&tags=crime,Crime Maps & Reports,200,City of Sacramento Open Data,City of Sacramento Open Data Site,[],[],[],[],[],[] -4285,https://information.stpaul.gov/datasets/stpaul::saint-paul-police-department-citations-1/explore,Citations,200,Saint Paul Police Department Citations,"The following data shows the types of citations issued, total number of citations issued each year since 2015, demographic information about those who received citations and the location of where the citations were issued.",[],[],[],[],[],[] -4286,http://www.rutlandcitypolice.com/open-data/response-to-resistance/,Use of Force Reports,200,Rutland City Police Department - Response to Resistance,New page,"[""Response to Resistance""]",[],[],[],[],[] -4287,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/34,Officer Involved Shootings,200,Layer: TPD_OIS (ID: 34),"",[],"[""Layer: TPD_OIS (ID: 34)""]",[],[],[],[] -4288,https://www.norwichct.org/845/Police-Demographics,Personnel Records,200,"Police Demographics | Norwich, CT - Official Website","","[""\r\n\r\nPolice Demographics\t\t""]","[""Police Officer Gender Information"", ""Police Officer Race-Ethnicity Information"", ""Norwich City Hall, 100 Broadway, Norwich, CT 06360""]","[""Loading"", """", """"]",[],[],[] -4289,https://www.transparentrichmond.org/Police-Department/Richmond-Police-Department-Complaints-and-Investig/wbyy-d6gi,Complaints & Misconduct,200,Richmond Police Department - Complaints and Investigations | Transparent Richmond,"","[""""]","[""Menu""]",[],[],[],[] -4290,https://www.normanok.gov/public-safety/police-department/open-data-portal/contacts,List of Data Sources,200,"Contacts | City of Norman, OK",Norman Police Department Open Data Portal Data Set pertaining to Contacts.,"[""City of Norman, OK"", ""City of Norman, OK"", ""Contacts\n""]","[""What can we help you find?"", ""Breadcrumb"", ""\n Data Sets\n "", ""Footer menu"", ""Footer Second Column"", ""Connect with Us""]","[""Open Data Portal"", ""\n Traffic and Parking Contacts\n ""]","[""\nNOTICE\n"", ""\nNOTICE\n"", ""\nNOTICE\n""]","[""Winter Weather Information"", ""Business and Citizen Self-Service Portal"", ""Information on City Council and Committee Meetings""]",[] -4291,https://northamptonpd.com/open-data-portal.html,Use of Force Reports,200,Northampton Massachusetts Police Department - Open Data Portal,"The Northampton Massachusetts Police Department - While striving toward professional excellence, we are dedicated to work in partnership with our community to p",[],"[""Sidebar""]","[""""]",[],[],[] -4292,https://data.virginia.gov/Public-Safety/Community-Policing-Data-July-1-2020-to-December-31/2c96-texw,Stops,-1,"","",,,,,, -4293,https://data.cityofsacramento.org/search?collection=Dataset&tags=citations,Citations,200,City of Sacramento Open Data,City of Sacramento Open Data Site,[],[],[],[],[],[] -4294,http://www.rutlandcitypolice.com/open-data/motor-vehicle-stops/,Stops,200,Rutland City Police Department - Motor Vehicle Stops,New page,"[""Motor Vehicle Stops""]","[""Contact Us Today!""]",[],[],[],[] -4295,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/12,Calls for Service,200,Layer: TPD_CFS_PUBLIC_2012 (ID: 12),"",[],"[""Layer: TPD_CFS_PUBLIC_2012 (ID: 12)""]",[],[],[],[] -4296,https://www.opendataphilly.org/dataset/vehicle-pedestrian-investigations,Stops,404,"","",,,,,, -4297,https://www.transparentrichmond.org/Police-Department/Richmond-Police-Department-Police-Pursuits/jvek-qbi3,Vehicle Pursuits,200,Richmond Police Department - Police Pursuits | Transparent Richmond,"","[""""]","[""Menu""]",[],[],[],[] -4298,https://www.transparentrichmond.org/Police-Department/Richmond-Police-Department-Firearm-Discharge-Incid/asfd-zcvn,Officer Involved Shootings,200,Richmond Police Department - Firearm Discharge Incidents | Transparent Richmond,"","[""""]","[""Menu""]",[],[],[],[] -4299,https://data-southbend.opendata.arcgis.com/search?q=complaints,Complaints & Misconduct,200,Open Data Portal City of South Bend,City of South Bend Open Data Site,[],[],[],[],[],[] -4300,https://data-santarosa.opendata.arcgis.com/datasets/santa-rosa-police-use-of-force/explore,Use of Force Reports,200,Santa Rosa Police Use of Force,City of Santa Rosa Police Use of Force,[],[],[],[],[],[] -4301,https://publicgis.tucsonaz.gov/open/rest/services/OpenData/OpenData_PublicSafety/MapServer/37,Officer Involved Shootings,200,Layer: TPD_OIS_Suspects (ID: 37),"",[],"[""Layer: TPD_OIS_Suspects (ID: 37)""]",[],[],[],[] -4302,data.norfolk.gov/resource/fcqe-uvnb.json,Use of Force Reports,200,"Police Use of Force and Citizen Complaint Incidents | Open Data Portal - City of Norfolk, VA Open Data","","[""""]","[""Menu""]",[],[],[],[] -4303,https://phoenixopendata.com/dataset/rtr,Use of Force Reports,404,"","",,,,,, -4304,https://www.transparentrichmond.org/Police-Department/Richmond-Police-Department-CAD-Events/k4y4-5quj,Calls for Service,200,Richmond Police Department - CAD Events | Transparent Richmond,"","[""""]","[""Menu""]",[],[],[],[] -4305,https://stjohnin.gov/PD/PDI/RTR.php,Use of Force Reports,200,Town of St. John - Police Department - Response to Resistance,"This is the offical website for the Town of St. John, Indiana.","[""Response to Resistance""]",[],"[""Datasets""]","[""Block Party Permit "", ""Citations "", "" Crime Map"", ""Daily Bulletin "", ""Handgun License "", ""Fireworks Information"", ""Peddler/Solicitor"", ""Police Data Initiative"", ""SafeTrade"", ""Text and E-Mail Notification System"", ""Vacation Check Request"", "" 15SJ1071 - Resisting 91XX W 85TH AV 3/22/15 1:24 \r\n am"", "" 17SJ2196 - Resisting 86XX WICKER AV 5/11/17 2:38 \r\n pm"", "" 17SJ5968 - Pursuit 85XX WICKER AV 11/25/17 10:23 \r\n pm"", "" 18SJ1255 - K9 Usage 124XX W 85TH AV 3/10/18 12:48 \r\n am"", "" 18SJ2237 - DUI W 97TH LN & HEDWIG AV 5/4/18 11:33 \r\n pm"", "" 18SJ5078 - Resisting 92XX WICKER AV 9/3/18 1:55 \r\n pm"", "" 18SJ7042 - Disorderly 106XX BAILEY ST 12/13/18 7:27 \r\n am"", "" 19SJ2285 - DUI 108XX WICKER AV 4/30/19 12:05 am"", "" 19SJ2654 - Resisting 137XX LIMERICK DR 5/19/19 6:52 \r\n pm"", "" 19SJ3038 - Resisting W 101ST AV & CLINE AV 6/6/19 1:30 \r\n pm"", "" 19SJ3497 - DUI W 101ST AV & CALUMET AV 6/27/19 6:16 \r\n pm"", "" 19SJ3510 - K9 Usage 1XX W 81ST AV 6/28/19 2:11 am"", "" 19SJ4657 - Resisting 106XX GOLDEN GROVE AV 8/20/19 8:34 \r\n pm"", "" 19SJ4840 - Disorderly 106XX BAILEY ST 8/30/19 10:05 \r\n pm"", "" 19SJ5091 - DUI W 90TH AV & PATTERSON ST 9/12/19 12:03 \r\n am"", "" 19SJ6089 - Resisting 93XX OLCOTT AV 11/1/19 10:13 \r\n am"", "" 20SJ0389 - Trespassing 86XX LAKE HILLS DR 1/23/20 2:41 \r\n am"", "" 20SJ0465 - Resisting W 107TH AV & MANOR DR 1/27/20 5:58 \r\n am"", "" 20SJ1502 - Resisting 96XX INDUSTRIAL DR 3/29/20 5:18 \r\n am""]","[""Listed below is information from the St. John Police Department as it relates to use of force. The St. John Police Department has guidelines and policies in place for when force can be used in response to resistance. The St. John Police Department takes great effort in making sure this information is as accurate as possible; however, it relies on data provided that cannot always be verified. This information will be updated as needed. The St. John Police Department is not responsible for any error or omission from this data, or for the use or interpretation of the results of any research conducted."", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Response to Resistance Used"", ""Charges / Offense"", ""Charged / Arrested"", ""Arrest Demographics"", ""Bias Crimes"", ""Calls for Service / Daily Bulletin"", ""Department Demographics"", ""Peddler/Solicitor Licenses"", ""Response to Resistance"", ""Training"", ""Traffic Stops"", ""Traffic Accidents"", ""Traffic Citation Demographics"", ""Traffic Warning Demographics"", ""Year End Reports"", ""Accessibility\u00a0 Copyright \u00a9 2024 Town of St. John, Indiana Accessible Version\u00a0 Follow us on ""]",[] -4306,https://phoenixopendata.com/dataset/ois,Officer Involved Shootings,200,Officer Involved Shooting (OIS) - Dataset - City of Phoenix Open Data,"","[""Officer Involved Shooting (OIS)"", ""Police\n \n "", ""\n \n Officer Involved Shooting (OIS)\n \n \n \n ""]","["" Department"", "" Social"", "" License"", ""Data and Resources""]","[""Provide your feedback!"", ""Additional Info""]",[],[],[] -4307,https://data.cityofsacramento.org/search?collection=Dataset&tags=dispatch,Dispatch Logs,200,City of Sacramento Open Data,City of Sacramento Open Data Site,[],[],[],[],[],[] -4308,https://northamptonpd.com/open-data-portal.html,Vehicle Pursuits,200,Northampton Massachusetts Police Department - Open Data Portal,"The Northampton Massachusetts Police Department - While striving toward professional excellence, we are dedicated to work in partnership with our community to p",[],"[""Sidebar""]","[""""]",[],[],[] -4309,https://www.norwichct.org/844/Open-Data-Portal,List of Data Sources,200,"Open Data Portal | Norwich, CT - Official Website",This page is part of the Police Data Initiative that will aid in creating greater transparency. ,"[""\r\n\r\nOpen Data Portal\t\t""]","[""Norwich City Hall, 100 Broadway, Norwich, CT 06360""]","[""Loading"", ""Welcome to the Norwich Police Department\u2019s Open Data Portal!"", ""Contact Us"", ""FAQs"", """", """"]",[],[],[] -4310,https://data.seattle.gov/Public-Safety/Use-Of-Force/ppi5-g2bj,Use of Force Reports,200,Use Of Force | City of Seattle Open Data portal,"","[""""]","[""Menu""]",[],[],[],[] -4311,https://data.sandiego.gov/datasets/police-collisions/,Incident Reports,200,Traffic collisions - basic reports - City of San Diego Open Data Portal," - Traffic collision reports recorded by the San Diego Police Department. - ",[],"[""\nTraffic collisions - basic reports\n""]","["""", ""Additional Info""]","[""Traffic collisions (2015 through year-to-date)""]",[],[] -4312,https://stat.stpete.org/dataset/Police-Calls/2eks-pg5j,Calls for Service,200,Police Calls | StPeteStat,"","[""""]","[""Menu""]",[],[],[],[] -4313,https://data.seattle.gov/Public-Safety/Call-Data/33kz-ixgy,Calls for Service,200,Call Data | City of Seattle Open Data portal,"","[""""]","[""Menu""]",[],[],[],[] -4314,https://data.stocktonca.gov/Safer-Streets/Stockton-Police-Department-Calls-for-Service/6uz3-k7rf,Calls for Service,200,Stockton Police Department Calls for Service | Stockton Open Data,"","[""""]","[""Menu""]",[],[],[],[] -4315,https://stjohnin.gov/PD/PDI/Arrests/,Arrest Records,200,Town of St. John - Police Department Arrests,"This is the offical website for the Town of St. John, Indiana.","[""Police Data Initative Dataset for Arrests""]",[],"[""Datasets""]","[""Block Party Permit "", ""Citations "", "" Crime Map"", ""Daily Bulletin "", ""Handgun License "", ""Fireworks Information"", ""Peddler/Solicitor"", ""Police Data Initiative"", ""SafeTrade"", ""Text and E-Mail Notification System"", ""Vacation Check Request""]","[""The St. John Police Department takes great effort in making data as accurate as possible, but there is no avoiding the introduction of errors in this process, which relies on data that cannot always be verified. Information contained in this dataset may change over a period of time. The St. John Police Department is not responsible for any error or omission from this data, or for the use or interpretation of the results of any research conducted."", ""2024 Arrests"", ""2023 Arrests"", ""2022 Arrests"", ""2021 Arrests"", ""2020 Arrests"", ""2019 Arrests"", ""2018 Arrests"", ""2017 Arrests"", ""2016 Arrests"", ""2015 Arrests"", ""2014 Arrests"", ""2013 Arrests"", ""2012 Arrests"", ""2011 Arrests"", ""2010 Arrests"", ""2009 Arrests"", ""2008 Arrests"", ""2007 Arrests"", ""2006 Arrests"", ""Arrest Demographics"", ""Bias Crimes"", ""Calls for Service / Daily Bulletin"", ""Department Demographics"", ""Peddler/Solicitor Licenses"", ""Response to Resistance"", ""Training"", ""Traffic Stops"", ""Traffic Accidents"", ""Traffic Citation Demographics"", ""Traffic Warning Demographics"", ""Year End Reports"", ""Accessibility\u00a0 Copyright \u00a9 2024 Town of St. John, Indiana Accessible Version\u00a0 Follow us on ""]",[] -4316,https://www.norristown.org/240/Police-Data-Initiative,Use of Force Reports,200,"Police Data Initiative | Norristown, PA",Dig into some of the local data and figures gathered over the past few years.,"[""\r\n\r\nPolice Data Initiative\t\t""]",[],"[""Loading"", ""Contact Us"", ""Contact Us"", ""Quick Links"", ""Using This Site""]","[""\nCalls For Service\n"", ""\nCrime Data\n"", ""\nDemographics\n"", ""\nHeroin Data\n"", ""\nUse of Force Data\n"", ""\nViolent Crimes Data Comparison\n"", ""Police Department""]",[],[] -4317,https://www.opendataphilly.org/dataset/crime-incidents,Incident Reports,404,"","",,,,,, -4318,https://stjohnin.gov/PD/PDI/TS/,Stops,200,Town of St. John - Police Department Traffic Stops,"This is the offical website for the Town of St. John, Indiana.","[""Police Data Initative Dataset for Traffic Stops""]",[],"[""Datasets""]","[""Block Party Permit "", ""Citations "", "" Crime Map"", ""Daily Bulletin "", ""Handgun License "", ""Fireworks Information"", ""Peddler/Solicitor"", ""Police Data Initiative"", ""SafeTrade"", ""Text and E-Mail Notification System"", ""Vacation Check Request""]","[""The St. John Police Department takes great effort in making data as accurate as possible, but there is no avoiding the introduction of errors in this process, which relies on data that cannot always be verified. Information contained in this dataset may change over a period of time. The St. John Police Department is not responsible for any error or omission from this data, or for the use or interpretation of the results of any research conducted."", ""2024 Taffice Stops"", ""2023 Taffice Stops"", ""2022 Taffice Stops"", ""2021 Taffice Stops"", ""2020 Taffice Stops"", ""2019 Taffice Stops"", ""2018 Taffice Stops"", ""2017 Taffice Stops"", ""2016 Taffice Stops"", ""2015 Taffice Stops"", ""2014 Taffice Stops"", ""2013 Taffice Stops"", ""2012 Taffice Stops"", ""2011 Taffice Stops"", ""2010 Taffice Stops"", ""2009 Taffice Stops"", ""2008 Taffice Stops"", ""2007 Taffice Stops"", ""2006 Taffice Stops"", ""Arrest Demographics"", ""Bias Crimes"", ""Calls for Service / Daily Bulletin"", ""Department Demographics"", ""Peddler/Solicitor Licenses"", ""Response to Resistance"", ""Training"", ""Traffic Stops"", ""Traffic Accidents"", ""Traffic Citation Demographics"", ""Traffic Warning Demographics"", ""Year End Reports"", ""Accessibility\u00a0 Copyright \u00a9 2024 Town of St. John, Indiana Accessible Version\u00a0 Follow us on ""]",[] -4319,https://data.seattle.gov/Public-Safety/Terry-Stops/28ny-9ts8,Stops,200,Terry Stops | City of Seattle Open Data portal,"","[""""]","[""Menu""]",[],[],[],[] -4320,https://stjohnin.gov/PD/PDI/Citations/,Citations,200,Town of St. John - Police Department Citations Issued,"This is the offical website for the Town of St. John, Indiana.","[""Police Data Initiative Traffic Citations""]",[],"[""Datasets""]","[""Block Party Permit "", ""Citations "", "" Crime Map"", ""Daily Bulletin "", ""Handgun License "", ""Fireworks Information"", ""Peddler/Solicitor"", ""Police Data Initiative"", ""SafeTrade"", ""Text and E-Mail Notification System"", ""Vacation Check Request""]","[""The St. John Police Department takes great effort in making data as accurate as possible, but there is no avoiding the introduction of errors in this process, which relies on data that cannot always be verified. Information contained in this dataset may change over a period of time. The St. John Police Department is not responsible for any error or omission from this data, or for the use or interpretation of the results of any research conducted."", ""2024 Citations"", ""2023 Citations"", ""2022 Citations"", ""2021 Citations"", ""2020 Citations"", ""2019 Citations"", ""2018 Citations"", ""2017 Citations"", ""2016 Citations"", ""2015 Citations"", ""2014 Citations"", ""2013 Citations"", ""2012 Citations"", ""2011 Citations"", ""2010 Citations"", ""2009 Citations"", ""2008 Citations"", ""2007 Citations"", ""2006 Citations"", ""Arrest Demographics"", ""Bias Crimes"", ""Calls for Service / Daily Bulletin"", ""Department Demographics"", ""Peddler/Solicitor Licenses"", ""Response to Resistance"", ""Training"", ""Traffic Stops"", ""Traffic Accidents"", ""Traffic Citation Demographics"", ""Traffic Warning Demographics"", ""Year End Reports"", ""Accessibility\u00a0 Copyright \u00a9 2024 Town of St. John, Indiana Accessible Version\u00a0 Follow us on ""]",[] -4321,https://www.transparentrichmond.org/Police-Department/Richmond-Police-Department-Use-Of-Force-Incidents/d62r-nicg,Use of Force Reports,200,Richmond Police Department - Use Of Force Incidents | Transparent Richmond,"","[""""]","[""Menu""]",[],[],[],[] -4322,https://www.normanok.gov/public-safety/police-department/open-data-portal/contacts,Personnel Records,200,"Contacts | City of Norman, OK",Norman Police Department Open Data Portal Data Set pertaining to Contacts.,"[""City of Norman, OK"", ""City of Norman, OK"", ""Contacts\n""]","[""What can we help you find?"", ""Breadcrumb"", ""\n Data Sets\n "", ""Footer menu"", ""Footer Second Column"", ""Connect with Us""]","[""Open Data Portal"", ""\n Traffic and Parking Contacts\n ""]","[""\nNOTICE\n"", ""\nNOTICE\n"", ""\nNOTICE\n""]","[""Winter Weather Information"", ""Business and Citizen Self-Service Portal"", ""Information on City Council and Committee Meetings""]",[] -4323,https://www.portland.gov/police/open-data/police-dispatched-calls,Calls for Service,200,Police Dispatched Calls Dashboard | Portland.gov,Dispatched Police Calls for Service,"[""Police Dispatched Calls Dashboard\n""]","[""General Information"", ""Elected Officials"", ""Breadcrumb"", ""Introduction to Calls for Service"", ""Police Response Time"", ""Dashboard Walkthrough"", ""Metadata for Dispatched Calls Open Data"", ""Topics"", ""General information"", ""Follow on Social Media"", ""Terms, policies"", ""Portland.gov"", ""City of Portland, Oregon""]","[""Call Priority Level"", ""Call Groups"", ""1. Report Overview"", ""2. Technical Specifications"", ""3. Visualization Walkthrough""]","[""a. Dropdown Filters (single-select) - Priority Call Filter (example)"", ""b. Dropdown Filters (multi-select) - Neighborhood Filter (example)"", ""c. Tab 1 - Dispatched Calls for Service"", ""d. Maps"", ""e.\u00a0Tab 2 - Response Times"", ""\u00a0f. \u00a0Tab 3 - Fiscal Year Dispatches"", ""g. Toolbar"", ""h. Download Data""]",[],[] -4324,https://www.oakridgetn.gov/Policepolicies/police-policy.php,Policies & Contracts,404,"","",,,,,, -4325,https://www.oakridgetn.gov/departmentpg/ORPD/Contact-ORPD,Contact Info & Agency Meta,404,"","",,,,,, -4326,https://www.knoxvilletn.gov/cms/One.aspx?portalId=109562&pageId=263443,List of Data Sources,200," - KPD Open Records Page - City of Knoxville -",police*,"[""KPD Open Records Page"", ""Police Chief""]",[],[],[],[],[] -4327,https://www.el-cerrito.org/1342/Released-Records,Incident Reports,200,"Released Records | El Cerrito, CA - Official Website",Lists currently released and available records by case.,"[""\n\n"", ""\r\n\r\nReleased Records\t\t""]",[],"[""Loading"", """", """", ""Contact Us"", ""Quick Links"", ""Helpful Links""]",[],[],[] -4328,https://www.cityofgrassvalley.com/records-release,Incident Reports,200,Records Release - City of Grass Valley,"","[""Records Release"", ""Records Release""]","[""Check the Air Quality"", ""Install smoke & CO detectors"", ""Learn about Fire Safety"", ""Purchase Reflective Address Signs"", ""Fire Department Instagram"", ""Fire Department Facebook"", ""Police Department Facebook"", ""G2300034"", ""G2000004"", ""G1901078"", ""Log in"", ""Commands"", ""Fire Department Instagram"", ""Fire Department Facebook"", ""Police Department Facebook""]",[],[],[],[] -4329,https://www.longbeach.gov/police/about-the-lbpd/lbpd-1421748/,Incident Reports,200,LBPD SB1421/AB748/AB2761,"","[""Police Department""]","[""LBPD SB 1421/AB 748/AB 2761""]","[""Mayor"", ""City Council"", ""Rex Richardson"", ""Mary Zendejas"", ""Cindy Allen"", ""Kristina Duggan"", ""Daryl Supernaw"", ""Megan Kerr"", ""Suely Saro"", ""Roberto Uranga"", ""Al Austin"", ""Dr. Joni Ricks-Oddie"", ""Dawn McIntosh"", ""Laura L. Doud"", ""Doug Haubert"", ""Tom Modica"", ""Monique DeLaGarza"", ""City-Wide Elected Officials"", ""Appointed Officials"", ""Online Payments"", ""Online Services"", ""In-Person Services"", ""Opening a Business"", ""Doing Business With The City"", ""Resources"", ""Most Popular"", ""Online Resources"", ""Attractions"", ""Business Associations"", ""Travel Resources"", ""Departments"", ""Job Opportunities"", ""Information"", ""LBPD"", ""Employment"", ""Bureaus"", ""News & Events"", ""Crime Info"", ""How Do I"", ""How Do I"", ""Contact Us"", ""Senate Bill 1421 (SB 1421)"", ""Assembly Bill 748 (AB 748)"", ""Assembly Bill 2761 (AB 2761)"", ""Do."", ""Discover."", ""Connect."", ""Ask.""]","["""", ""1st District"", ""2nd District"", ""3rd District"", ""4th District"", ""5th District"", ""6th District"", ""7th District"", ""8th District"", ""9th District"", ""City Attorney"", ""City Auditor"", ""City Prosecutor"", ""City Manager"", ""City Clerk""]","[""LBPD SB 1421/AB 748"", ""Public Records Request""]",[] -4330,https://lasdsb1421.powerappsportals.us/,Incident Reports,200," - - Home -  · LA County Sheriff -","",[],"[""Los Angeles County Sheriff's Department SB-1421 Records"", """"]",[],"[""Search all SB-1421 / SB-16 Published Incidents""]",[],"[""Click here to return to LASD.ORG"", ""Website Privacy Policy"", ""Disclaimers""]" -4331,https://www.lapdonline.org/office-of-the-chief-of-police/constitutional-policing/risk-management-division/senate-bill-1421-senate-bill-16-sb-16/,Incident Reports,200,LAPD Senate Bill 1421 (SB 1421) / Senate Bill 16 (SB 16) - LAPD Online,"","[""LAPD Senate Bill 1421 (SB 1421) / Senate Bill 16 (SB 16)""]","[""Officer Involved Shooting (OIS)"", ""Use of Force (UoF) - Great Bodily Injury/Death"", ""Sustained Complaints of Unreasonable/ Excessive Force; Failure to Intervene in Excessive Force"", ""Sustained Complaints of Sexual Assault / Dishonesty"", ""Sustained Complaints of Prejudice or Discrimination "", ""Sustained Complaints of Unlawful Arrest/ Unlawful Search""]",[],[],[],[] -4332,https://www.co.monterey.ca.us/government/departments-a-h/district-attorney/press-releases/officer-involved-shootings,Officer Involved Shootings,200," - - Officer Involved Shootings | Monterey County, CA - -","","[""Officer Involved Shootings""]",[],[],[],[],[] -4333,https://www.novato.org/government/police-department/transparency,Policies & Contracts,200," - - Transparency | City of Novato, CA - -","","[""City of Novato, CA"", ""Transparency""]","[""Popular Searches"", ""FIND A SERVICE"", ""Jump to subpage..."", ""VISIT US"", ""CALL US"", ""CONNECT WITH US""]","[""I WANT TO"", """", """"]",[],[],[] -4334,https://oaklandca.nextrequest.com/requests?department_ids=2053,List of Data Sources,200,"","",[],[],[],[],[],[] -4335,https://www.ocsheriff.gov/about-ocsheriff/peace-officer-records-releases,Incident Reports,200,Peace Officer Records Releases | Orange County California - Sheriff's Department,"Amendments to Penal Code section 832.7 require the release of law enforcement records relating to officer-involved shootings, uses of force resulting in death or great bodily injury and sustained findings against peace officers of dishonesty or sexual assault, as defined by the law. Such records had previously been exempt from public disclosure.","[""\nPeace Officer Records Releases\n""]","[""Breadcrumb"", ""Released Records"", ""\n20-020724 Use of Force\n\n"", ""\n19-042554 Use of Force\n\n"", ""\n20-020164 OIS\n\n"", ""\n19-090 Sustained Dishonesty\n\n"", ""\n03-092321 OIS\n\n"", ""\n03-077834 OIS\n\n"", ""\n03-055771 OIS\n\n"", ""\n03-054572 OIS\n\n"", ""\n00-170538 OIS\n\n"", ""\n18-054 Sustained Dishonesty\n\n"", ""\n18-053 Sustained Dishonesty\n\n"", ""\n18-025 Sustained Dishonesty\n\n"", ""\n10-026804 OIS\n\n"", ""\n08-245804 OIS\n\n"", ""\n08-043784 OIS\n\n"", ""\nCCRS 2020-01467 Sustained Prejudice/Discrimination\n\n"", ""\n20-031866 OIS\n\n"", ""\n17-015 Sustained Prejudice/Discrimination\n\n"", ""\n18-034 Sustained Dishonesty\n\n"", ""\n08-006569 OIS\n\n"", ""\n04-117657 OIS\n\n"", ""\n20-015073 OIS\n\n"", ""\n11-081942 OIS\n\n"", ""\n09-091317 OIS\n\n"", ""\n15-161289 OIS\n\n"", ""\n07-252765 OIS\n\n"", ""\n21-030459 Use of Force\n\n"", ""\n19-032109 OIS\n\n"", ""\n18-002705 OIS\n\n"", ""\n16-287025 OIS\n\n"", ""\n15-165583 OIS\n\n"", ""\n13-155963 OIS\n\n"", ""\n13-034439 OIS\n\n"", ""\n12-108630 OIS\n\n"", ""\n11-222961 OIS\n\n"", ""\n21-010034 Use of Force\n\n"", ""\n21-003026 Use of Force\n\n"", ""\n12-164003 OIS\n\n"", ""\n12-041420 OIS\n\n"", ""\n10-187211 OIS\n\n"", ""\n10-109231 OIS\n\n"", ""\n06-109584 OIS\n\n"", ""\n05-254554 OIS\n\n"", ""\n03-087626 OIS\n\n"", ""\n14-151 Sustained Dishonesty\n\n"", ""\n19-135 Sustained Dishonesty\n\n"", ""\n18-176 Sustained Dishonesty\n\n"", ""\n11-211028 OIS\n\n"", ""\n06-013598 OIS\n\n"", ""\n02-058023 OIS\n\n"", ""\n01-072725 OIS\n\n"", ""\n20-014019 Use of Force\n\n"", ""\n20-015326 Use of Force\n\n"", ""\n20-009167 Use of Force\n\n"", ""\n18-033347 Use of Force\n\n"", ""\n17-020481 Use of Force\n\n"", ""\n16-060907 Use of Force\n\n"", ""\n17-003805 OIS\n\n"", ""\n15-093645 OIS\n\n"", ""\n13-188544 OIS\n\n"", ""\n20-031243 OIS\n\n"", ""\n19-059 Sustained Dishonesty\n\n"", ""\n18-067 Sustained Dishonesty\n\n"", ""\n18-065 Sustained Dishonesty\n\n"", ""\n18-063 Sustained Dishonesty\n\n"", ""\n18-062 Sustained Dishonesty\n\n"", ""\n18-061 Sustained Dishonesty\n\n"", ""\n18-060 Sustained Dishonesty\n\n"", ""\n20-009515 Use of Force\n\n"", ""\n20-008412 Use of Force\n\n"", ""\n18-033960 Use of Force\n\n"", ""\n17-068 Sustained Dishonesty\n\n"", ""\n18-027 Sustained Dishonety\n\n"", ""\n18-026 Sustained Dishonesty\n\n"", ""\n17-079 Sustained Dishonesty\n\n"", ""\n15-160 Sustained Dishonesty\n\n"", ""\n15-150 Sustained Dishonesty\n\n"", ""\n15-135 Sustained Dishonesty\n\n"", ""\n15-116 Sexual Assault\n\n"", ""\n14-118 Sustained Dishonesty\n\n"", ""\n13-148 Sustained Dishonesty\n\n"", ""\n15-037 Sustained Dishonesty\n\n"", ""\n13-145 Sustained Dishonesty\n\n"", ""\n13-141 Sustained Dishonesty\n\n"", ""\n13-136 Sustained Dishonesty\n\n"", ""\n13-124 Sustained Dishonesty\n\n"", ""\n13-115 Sustained Dishonesty\n\n"", ""\n19-026579 Use of Force\n\n"", ""\n20-007202 Use of Force\n\n"", ""\n20-006528 Use of Force\n\n"", ""\n19-046455 Use of Force\n\n"", ""\n19-002925 Use of Force\n\n"", ""\n19-049751 Use of Force\n\n"", ""\n19-046814 Use of Force\n\n"", ""\n19-030299 Use of Force\n\n"", ""\n19-015450 Use of Force\n\n"", ""\n13-004 Sustained Dishonesty\n\n"", ""\n19-035017 Use of Force\n\n"", ""\n19-027020 Use of Force\n\n"", ""\n19-012737 Use of Force \n\n"", ""\n19-005291 Use of Force\n\n"", ""\n19-002419 Use of Force\n\n"", ""\n14-121963 Officer Involved Shooting (OIS)\n\n"", ""\n19-002545 Use of Force\n\n"", ""\n19-012649 Use of Force\n\n"", ""\n18-002766/18-001203 Use of Force\n\n"", ""\n18-019895 Use of Force\n\n"", ""\n18-014708 Use of Force\n\n"", ""\n18-039171 Use of Force\n\n"", ""\n18-048751 Use of Force\n\n"", ""\n16-037674 OIS\n\n"", ""\n18-011596 Use of Force\n\n"", ""\n18-039754 Use of Force\n\n"", ""\n18-037420 Use of Force\n\n"", ""\n18-039946 Use of Force\n\n"", ""\n19-029383 Use of Force\n\n"", ""\n17-028673 Use of Force\n\n"", ""\n17-030601 Use of Force\n\n"", ""\n17-032444 Use of Force\n\n"", ""\n17-035948 Use of Force\n\n"", ""\n17-036781 Use of Force\n\n"", ""\n17-045452 Use of Force\n\n"", ""\n18-009248 Use of Force\n\n"", ""\n18-005421 OIS\n\n"", ""\n16-225472 Use of Force\n\n"", ""\n17-006092 Use of Force\n\n"", ""\n17-011538 Use of Force\n\n"", ""\n17-012816 Use of Force\n\n"", ""\n12-022073 OIS\n\n"", ""\n18-049633 Use of Force\n\n"", ""\n17-049808 Use of Force\n\n"", ""\n16-183459 Use of Force\n\n"", ""\n16-131221 Use of Force\n\n"", ""\n16-049243 Use of Force\n\n"", ""\n13-051335 Use of Force\n\n"", ""\nAB748: Officer-involved Shooting\n\n"", ""\n16-253663 Use of Force\n\n"", ""\n16-204638 Use of Force\n\n"", ""\n16-175330 Use of Force\n\n"", ""\n16-061838 Use of Force\n\n"", ""\n16-060140 Use of Force\n\n"", ""\n16-280983 Use of Force\n\n"", ""\n16-134794 Use of Force\n\n"", ""\n16-103791 Use of Force\n\n"", ""\n16-012403 Use of Force\n\n"", ""\n15-121772 Use of Force\n\n"", ""\n14-049495 Use of Force\n\n"", ""\n14-160051 Sexual Assault\n\n"", ""\n14-190439 Use of Force\n\n"", ""\n14-204617 Use of Force\n\n"", ""\n15-027200 Use of Force\n\n"", ""\n15-063223 Use of Force\n\n"", ""\n15-128868 Use of Force\n\n"", ""\n16-046794 Use of Force\n\n"", ""Share This"", ""Navigation"", ""Quick Links"", ""Resources"", ""Follow Us""]",[],[],"[""Th\u00f4ng B\u00e1o Kh\u00f4ng Ch\u1ecbu Tr\u00e1ch Nhi\u1ec7m"", ""Exenci\u00f3n de responsabilidad"", ""\uc54c\ub824\ub4dc\ub9bd\ub2c8\ub2e4"", ""\u514d\u8cac\u8072\u660e""]",[] -4336,https://orangecountyda.org/reports/officer-involved-shooting-reports/,Media Bulletins,200,Officer-Involved Shooting Reports Archives - Orange County District Attorney,"","[""Officer-Involved Shooting Reports""]",[],"[""\n\n OCDA ISSUES OFFICER-INVOLVED SHOOTING REPORT - Michael Bernard Emch Jr \n"", ""\n\n OCDA ISSUES OFFICER-INVOLVED SHOOTING REPORT - Rickey Howard Felix Rodrigues \n"", ""\n\n OCDA ISSUES OFFICER-INVOLVED SHOOTING - Michael Bernard Emch Jr \n"", ""\n\n OCDA REPORT: OFFICER-INVOLVED SHOOTING - Hunter Tice \n"", ""\n\n OCDA REPORT: OFFICER-INVOLVED SHOOTING - Tobiah Paul Steinmetz \n"", ""\n\n OCDA REPORT: OFFICER-INVOLVED SHOOTING - Alejandro Sanchez Montes \n"", ""\n\n OCDA REPORT: OFFICER-INVOLVED SHOOTING - Hugo Vargas \n"", ""\n\n OCDA REPORT: OFFICER-INVOLVED SHOOTING - Osman Brown \n"", ""\n\n OCDA REPORT: OFFICER-INVOLVED SHOOTING - Raul Sanchez \n"", ""\n\n OCDA REPORT: OFFICER-INVOLVED SHOOTING - Pablo Santos Alferez-Barahona \n"", ""\n\n OCDA REPORT: OFFICER-INVOLVED SHOOTING - Matthew Wong \n"", ""\n\n OCDA REPORT: OFFICER-INVOLVED SHOOTING - Matthew-Tuan Ahn Tran \n"", ""\n\n OCDA REPORT: OFFICER-INVOLVED SHOOTING - Jose David Valdez \n"", ""\n\n OCDA REPORT: OFFICER-INVOLVED SHOOTING - Eduardo Herrera, Jr. \n"", ""\n\n OCDA REPORT: OFFICER-INVOLVED SHOOTING - Cedric Baxter \n"", ""\n\n OCDA REPORT: OFFICER-INVOLVED SHOOTING - Gabriel Paniagua Tamayo \n"", ""Share"", ""Latest Posts"", ""Main Office""]","[""\n\n\t\t\t\t\t\t\t\t\tEforturile Procuraturii Jude\u021bului Orange, impreuna cu ajutorul fortelor de politie in a reprima opera\u021biunea de combatere a crimei organizate din Rom\u00e2nia care vizeaz\u0103 beneficiarii Fondului de Asisten\u021b\u0103 Public\u0103 au redus furtul cu aproape 55%\t\t\t\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\t\t\t\tEfforts by Orange County District Attorney\u2019s Office, OC Law Enforcement to Crack Down on Romanian Organized Crime Skimming Operation Targeting Public Assistance Fund Recipients has Reduced Theft by Nearly 55%\t\t\t\t\t\t\t\t\n"", ""\n\n\t\t\t\t\t\t\t\t\tOCDA ISSUES CUSTODIAL DEATH REPORT \u2013 Nelson Gam\t\t\t\t\t\t\t\t\n""]",[],[] -4337,http://sacsheriff.com/pages/sb1421_releases.php,Incident Reports,200,Sac Sheriff,"","[""RELEASED CASES"", ""Need To Report A Crime?""]",[],"[""Contact Us"", ""4500 Orange Grove Avenue, Sacramento, CA 95841""]","[""Emergency"", ""911"", ""Non-Emergency"", ""916-874-5115"", ""TDD Non-Emergency"", ""916-874-7128"", ""QUICK LINKS""]","[""\r\n Organization\n"", ""\r\n Services\n"", ""\r\n Careers \n"", ""\r\n Crime Reporting \n"", ""\r\n Resource Links \n"", ""\r\n Commendation/Complaint Form \r\n ""]",[] -4338,http://www.cityofsacramento.org/Police/Transparency/Senate-Bill-1421-Releases,Incident Reports,200,Police Department | City of Sacramento,Sacramento Police Department,"[""Sacramento Police Department""]","[""About"", ""Your SacPD"", ""Index"", ""Social Media""]","[""Search for content"", ""News and Information"", ""Reporting"", ""Popular Services"", ""More"", ""Call our Non-Emergency Number: 916-808-5471"", ""We're hiring!"", ""Meet the Chief"", ""Uncrewed Aircraft Systems (UAS)"", ""In the News""]",[],[],[] -4339,https://sbcountyda.org/ois/,Officer Involved Shootings,200,Officer Involved Shooting Response Team – San Bernardino County District Attorney,"Officer-Involved Shooting Response Team When peace officers use deadly force, society expects that such force will occur only when prescribed by law. The public also has a right to expect...",[],[],"[""Leave this site safely""]",[],[],[] -4340,https://www.sandiego.gov/police/data-transparency/mandated-disclosures,List of Data Sources,200,Mandated Disclosures | City of San Diego Official Website,"","[""City of San Diego Official Website"", ""Mandated Disclosures""]","[""Main navigation"", ""Leisure"", ""Resident Resources"", ""Doing Business"", ""Library"", ""Public Safety"", ""City Hall"", ""Accessibility Tools"", ""Data & Transparency"", ""Footer""]",[],"[""Parks"", ""Outdoors"", ""Neighborhoods"", ""Recreational Activities"", ""Street Maintenance"", ""Plan"", ""Fix"", ""Build"", ""Programs & Events"", ""Services"", ""Kids & Teens"", ""eCollection"", ""Police"", ""Fire-Rescue"", ""Lifeguards"", ""City Officials"", ""City Government""]",[],[] -4341,https://www.venturasheriff.org/sb-1421/,List of Data Sources,200,SB 1421 - Ventura County Sheriff's Office,"","[""SB 1421""]",[],"[""Contact Info"", ""Video Gallery"", ""Photo Gallery""]","[""Translate Disclaimer""]",[],[] -4342,https://www.walnut-creek.org/departments/public-safety/police/policies-and-transparency-information/senate-bill-1421-materials,Incident Reports,404,"","",,,,,, -4343,https://www.riversideca.gov/cityclerk/boards-commissions/community-police-review-commission/officer-involved-deaths-oid/officer-involved,Incident Reports,200,Officer-Involved Death Case Evaluations | City Clerk,"","[""Officer-Involved Death Case Evaluations""]",[],[],"[""Main Menu Links"", ""City Links"", ""\n\nJoseph Tracy \n MB220190001 January 18, 2022 \n\n"", ""\n\n Press\n"", ""\n\nFelix Jerry Marquez \n P21-0012809 May 8, 2021 \n\n"", ""\n\n Press\n"", ""\n\n Independent Investigation Reports\n"", ""\n\nJehlani Jay Black \n P21-0006980 March 9, 2021 \n\n"", ""\n\n Press\n"", ""\n\n Independent Investigation Reports\n"", ""\n\nAaron Nathaniel Luther \n P19-08054 August 12, 2019 \n\n"", ""\n\n Press\n"", ""\n\n Criminal Casebook\n"", ""\n\nDavid Eugene Russell \n P18-136590 July 22, 2018 \n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Russell OID Public Report\n"", ""\n\nArthur Cornejo Levario \n P18-135608 July 20, 2018 \n\n"", ""\n\n Criminal Casebook\n"", ""\n\n Press\n"", ""\n\n Report of Investigation\n"", ""\n\n RPD Briefing\n"", ""\n\nErnie David Saldivar \n P18-044194 March 8, 2018 \n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Criminal Casebook\n"", ""\n\n Independent Investigation Reports\n"", ""\n\nLuvelle Kennon \n P17-196932 October 31, 2017\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Kennon OID Public Report\n"", ""\n\nMarcelino Garcia \n 17-004 | P17-032034 February 20, 2017\n\n"", ""\n\n Press\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n RPD Policies\n"", ""\n\n Criminal Casebook\n"", ""\n\nEdward Thomas Hayes III \n 16-011 | P16-200713 October 31, 2016\n\n"", ""\n\n Press\n"", ""\n\n RPD Policies\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\nDominic William Smith \n 16-012 | P16-237-976 December 29, 2016\n\n"", ""\n\n Press\n"", ""\n\n RPD Policies\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Smith OID Public Report\n"", ""\n\nSteven Lewis \n 15-006 | P15-028755 February 23, 2015\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Fact Sheet\n"", ""\n\n Lewis OID Public Report\n"", ""\n\nVicente Robert Martinez \n 14-036 | P14-175586 November 18, 2014\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Fact Sheet\n"", ""\n\n Martinez OID Public Report\n"", ""\n\nAdolfo Ramirez \n 13-039 | P13-169168 November 22, 2013\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Ramirez OID Public Report\n"", ""\n\nHector Jimenez \n 13-034 | P13-133894 September 13, 2013\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Fact Sheet\n"", ""\n\n Jimenez OID Public Report\n"", ""\n\nDontae Daveon Lewis Hayes \n 13-040 | P13-186428 December 31, 2013\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Hayes OID Public Report\n"", ""\n\nRashad Jarrett Hopes \n 13-020 | P13-083040 June 11, 2013\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Hopes OID Public Report\n"", ""\n\nLorenzo J. Ciaramella \n 13-003 | P13-026517 February 25, 2013\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Ciaramella OID Public Report\n"", ""\n\nChaz Sherron \n 12-027 | P12-149530 October 14, 2012\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Sherron OID Public Report\n"", ""\n\nDanny James Bond \n 12-007 | P12-024811 February 18, 2012\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Bond OID Public Report\n"", ""\n\nChristopher Dorner \n 13-001 | PA1303007 February 12, 2013\n\n"", ""\n\nBrandon James Dunbar \n 12-008 | P12-030492 March 1, 2012\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Dunbar OID Public Report\n"", ""\n\nDavid Hernandez Ledezma \n 12-002 | P12-003517 January 7, 2012\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Ledezma OID Public Report\n"", ""\n\nIsabel Pablo \n 12-017 | P12-067271 May 13, 2012\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Accident Investigation Report\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Pablo OID Public Report\n"", ""\n\nAlfred Delatorre Romo \n 11-038 | P11-169228 November 16, 2011\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Romo OID Public Report\n"", ""\n\nVirgil Anthony Millon \n 11-020 | P11-068393 May 10, 2011\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Millon OID Public Report\n"", ""\n\nRussell F. Hyatt \n 09-002 | P09-008550 January 18, 2009\n\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Hyatt OID Public Report\n"", ""\n\nMarlon O. Acevedo \n 08-047 | P08-157587 October 31, 2008\n\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Acevedo OID Public Report\n"", ""\n\nJoseph Tracy \n MB220190001 January 18, 2022 \n\n"", ""\n\n Press\n"", ""\n\nFelix Jerry Marquez \n P21-0012809 May 8, 2021 \n\n"", ""\n\n Press\n"", ""\n\n Independent Investigation Reports\n"", ""\n\nJehlani Jay Black \n P21-0006980 March 9, 2021 \n\n"", ""\n\n Press\n"", ""\n\n Independent Investigation Reports\n"", ""\n\nAaron Nathaniel Luther \n P19-08054 August 12, 2019 \n\n"", ""\n\n Press\n"", ""\n\nDavid Eugene Russell \n P18-136590 July 22, 2018 \n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Russell OID Public Report\n"", ""\n\nArthur Cornejo Levario \n P18-135608 July 20, 2018 \n\n"", ""\n\n Criminal Casebook\n"", ""\n\n Press\n"", ""\n\n Report of Investigation\n"", ""\n\n RPD Briefing\n"", ""\n\nErnie David Saldivar \n P18-044194 March 8, 2018 \n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Criminal Casebook\n"", ""\n\n Independent Investigation Reports\n"", ""\n\nLuvelle Kennon \n P17-196932 October 31, 2017\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Kennon OID Public Report\n"", ""\n\nMarcelino Garcia \n 17-004 | P17-032034 February 20, 2017\n\n"", ""\n\n Press\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n RPD Policies\n"", ""\n\n Criminal Casebook\n"", ""\n\nEdward Thomas Hayes III \n 16-011 | P16-200713 October 31, 2016\n\n"", ""\n\n Press\n"", ""\n\n RPD Policies\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\nDominic William Smith \n 16-012 | P16-237-976 December 29, 2016\n\n"", ""\n\n Press\n"", ""\n\n RPD Policies\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Smith OID Public Report\n"", ""\n\nSteven Lewis \n 15-006 | P15-028755 February 23, 2015\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Fact Sheet\n"", ""\n\n Lewis OID Public Report\n"", ""\n\nVicente Robert Martinez \n 14-036 | P14-175586 November 18, 2014\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Fact Sheet\n"", ""\n\n Martinez OID Public Report\n"", ""\n\nAdolfo Ramirez \n 13-039 | P13-169168 November 22, 2013\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Ramirez OID Public Report\n"", ""\n\nHector Jimenez \n 13-034 | P13-133894 September 13, 2013\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Fact Sheet\n"", ""\n\n Jimenez OID Public Report\n"", ""\n\nDontae Daveon Lewis Hayes \n 13-040 | P13-186428 December 31, 2013\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Hayes OID Public Report\n"", ""\n\nRashad Jarrett Hopes \n 13-020 | P13-083040 June 11, 2013\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Hopes OID Public Report\n"", ""\n\nLorenzo J. Ciaramella \n 13-003 | P13-026517 February 25, 2013\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Ciaramella OID Public Report\n"", ""\n\nChaz Sherron \n 12-027 | P12-149530 October 14, 2012\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Sherron OID Public Report\n"", ""\n\nDanny James Bond \n 12-007 | P12-024811 February 18, 2012\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Bond OID Public Report\n"", ""\n\nChristopher Dorner \n 13-001 | PA1303007 February 12, 2013\n\n"", ""\n\nBrandon James Dunbar \n 12-008 | P12-030492 March 1, 2012\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Dunbar OID Public Report\n"", ""\n\nDavid Hernandez Ledezma \n 12-002 | P12-003517 January 7, 2012\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Ledezma OID Public Report\n"", ""\n\nIsabel Pablo \n 12-017 | P12-067271 May 13, 2012\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Accident Investigation Report\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Pablo OID Public Report\n"", ""\n\nAlfred Delatorre Romo \n 11-038 | P11-169228 November 16, 2011\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Romo OID Public Report\n"", ""\n\nVirgil Anthony Millon \n 11-020 | P11-068393 May 10, 2011\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Millon OID Public Report\n"", ""\n\nRussell F. Hyatt \n 09-002 | P09-008550 January 18, 2009\n\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Hyatt OID Public Report\n"", ""\n\nMarlon O. Acevedo \n 08-047 | P08-157587 October 31, 2008\n\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Acevedo OID Public Report\n"", ""\n\nJoseph Tracy \n MB220190001 January 18, 2022 \n\n"", ""\n\n Press\n"", ""\n\nFelix Jerry Marquez \n P21-0012809 May 8, 2021 \n\n"", ""\n\n Press\n"", ""\n\n Independent Investigation Reports\n"", ""\n\nJehlani Jay Black \n P21-0006980 March 9, 2021 \n\n"", ""\n\n Press\n"", ""\n\n Independent Investigation Reports\n"", ""\n\nAaron Nathaniel Luther \n P19-08054 August 12, 2019 \n\n"", ""\n\n Press\n"", ""\n\nDavid Eugene Russell \n P18-136590 July 22, 2018 \n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Russell OID Public Report\n"", ""\n\nArthur Cornejo Levario \n P18-135608 July 20, 2018 \n\n"", ""\n\n Criminal Casebook\n"", ""\n\n Press\n"", ""\n\n Report of Investigation\n"", ""\n\n RPD Briefing\n"", ""\n\nErnie David Saldivar \n P18-044194 March 8, 2018 \n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Criminal Casebook\n"", ""\n\n Independent Investigation Reports\n"", ""\n\nLuvelle Kennon \n P17-196932 October 31, 2017\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Kennon OID Public Report\n"", ""\n\nMarcelino Garcia \n 17-004 | P17-032034 February 20, 2017\n\n"", ""\n\n Press\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n RPD Policies\n"", ""\n\n Criminal Casebook\n"", ""\n\nEdward Thomas Hayes III \n 16-011 | P16-200713 October 31, 2016\n\n"", ""\n\n Press\n"", ""\n\n RPD Policies\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\nDominic William Smith \n 16-012 | P16-237-976 December 29, 2016\n\n"", ""\n\n Press\n"", ""\n\n RPD Policies\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Smith OID Public Report\n"", ""\n\nSteven Lewis \n 15-006 | P15-028755 February 23, 2015\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Fact Sheet\n"", ""\n\n Lewis OID Public Report\n"", ""\n\nVicente Robert Martinez \n 14-036 | P14-175586 November 18, 2014\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Fact Sheet\n"", ""\n\n Martinez OID Public Report\n"", ""\n\nAdolfo Ramirez \n 13-039 | P13-169168 November 22, 2013\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Ramirez OID Public Report\n"", ""\n\nHector Jimenez \n 13-034 | P13-133894 September 13, 2013\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n Criminal Casebook\n"", ""\n\n Fact Sheet\n"", ""\n\n Jimenez OID Public Report\n"", ""\n\nDontae Daveon Lewis Hayes \n 13-040 | P13-186428 December 31, 2013\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Hayes OID Public Report\n"", ""\n\nRashad Jarrett Hopes \n 13-020 | P13-083040 June 11, 2013\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Hopes OID Public Report\n"", ""\n\nLorenzo J. Ciaramella \n 13-003 | P13-026517 February 25, 2013\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Ciaramella OID Public Report\n"", ""\n\nChaz Sherron \n 12-027 | P12-149530 October 14, 2012\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Sherron OID Public Report\n"", ""\n\nDanny James Bond \n 12-007 | P12-024811 February 18, 2012\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Bond OID Public Report\n"", ""\n\nChristopher Dorner \n 13-001 | PA1303007 February 12, 2013\n\n"", ""\n\nBrandon James Dunbar \n 12-008 | P12-030492 March 1, 2012\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Dunbar OID Public Report\n"", ""\n\nDavid Hernandez Ledezma \n 12-002 | P12-003517 January 7, 2012\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Ledezma OID Public Report\n"", ""\n\nIsabel Pablo \n 12-017 | P12-067271 May 13, 2012\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Accident Investigation Report\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Pablo OID Public Report\n"", ""\n\nAlfred Delatorre Romo \n 11-038 | P11-169228 November 16, 2011\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Romo OID Public Report\n"", ""\n\nVirgil Anthony Millon \n 11-020 | P11-068393 May 10, 2011\n\n"", ""\n\n Press\n"", ""\n\n RPD Briefing\n"", ""\n\n Independent Investigation Reports\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Millon OID Public Report\n"", ""\n\nRussell F. Hyatt \n 09-002 | P09-008550 January 18, 2009\n\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Hyatt OID Public Report\n"", ""\n\nMarlon O. Acevedo \n 08-047 | P08-157587 October 31, 2008\n\n"", ""\n\n CPRC Work Documents\n"", ""\n\n Criminal Casebook\n"", ""\n\n Acevedo OID Public Report\n"", ""Home"", ""Popular"", ""Contact"", ""Resources""]",[],[] -4344,https://www.muckrock.com/foi/pittsburgh-130/traffic-stops-140596/,Stops,200,Traffic Stops • MuckRock,MuckRock is a collaborative news site that gives you the tools to hold the government accountable.,"[""Traffic Stops""]","[""Communications"", ""Files""]","[""""]",[],[],[] -4345,https://www.muckrock.com/foi/kingston-30521/roster-and-hire-dates-143168/#files,Personnel Records,200,Roster and hire dates • MuckRock,MuckRock is a collaborative news site that gives you the tools to hold the government accountable.,"[""Roster and hire dates""]","[""Communications"", ""Files""]","[""""]",[],[],[] -4346,https://data.tennessee.edu/salary-database/,Personnel Records,200,Employee Salaries - Data at UT,"","[""Employee Salaries Dashboard""]",[],[],[],[],[] -4347,https://bjs.ojp.gov/content/pub/pdf/nsleed.pdf,Personnel Records,200,"","",[],[],[],[],[],[] -4348,https://www.opendatanetwork.com/search?categories=public%20safety,List of Data Sources,200,Data on the Open Data Network,"","[""Open Data Network""]","[""Including the effects of a harsh radiation environment in the simulation and design of nanoelectronic devices and circuits Project"", ""High Torque, Direct Drive Electric Motor Project"", ""Planning for Planetary Science Mission Including Resource Prospecting Project"", ""Modular, Fault-Tolerant Electronics Supporting Space Exploration Project"", ""Electronics Modeling and Design for Cryogenic and Radiation Hard Applications Project"", ""OMI/Aura Level 1B VIS Zoom-in Geolocated Earthshine Radiances 1-orbit L2 Swath 13x12 km V003"", ""NLDAS Noah Land Surface Model L4 Monthly 0.125 x 0.125 degree V002"", ""Extreme Temperature, Rad-Hard Power Management ASIC Project"", ""NOAA - Severe weather warnings for tornadoes: Storm based accuracy (%)"", ""Wide Temperature Range DC-DC Boost Converters for Command/Control/Drive Electronics Project""]",[],[],[],[] -4349,https://github.com/invinst/chicago-police-data,Personnel Records,200,GitHub - invinst/chicago-police-data: a collection of public data re: CPD officers involved in police encounters,a collection of public data re: CPD officers involved in police encounters - GitHub - invinst/chicago-police-data: a collection of public data re: CPD officers involved in police encounters,"[""Search code, repositories, users, issues, pull requests..."", ""\n Provide feedback\n "", ""\n Saved searches\n "", ""invinst/chicago-police-data""]","[""Use saved searches to filter your results more quickly"", ""About"", ""\n\n Releases\n"", ""\n\n Packages\n 0\n"", ""\n\n Contributors\n 12\n"", ""Languages"", ""Footer""]","[""Resources"", ""Stars"", ""Watchers"", ""Forks"", ""Footer navigation""]",[],[],[] -4350,https://www.sentencingproject.org/research/us-criminal-justice-data/,Incarceration Records,200,U.S. Criminal Justice Data – The Sentencing Project,The Sentencing Project compiles state-level data to provide a snapshot of key indicators of mass incarceration's impact in the United States.,"[""U.S. Criminal Justice Data""]","[""Stay involved & informed""]","[""Issues"", ""Advocacy"", ""Research"", ""Issues"", ""Advocacy"", ""Research"", ""About"", ""Imprisonment Rate"", ""Black/White Disparity"", ""Latinx/White Disparity"", ""Youth Custody Rate"", ""Felony Disenfranchisement Rate"", ""Growth in Mass Incarceration"", ""Compare data by jurisdiction"", ""Thanks for subscribing!"", ""One more thing, !""]","[""\nRacial Justice\n"", ""\nSentencing Reform\n"", ""\nVoting Rights\n"", ""\nYouth Justice\n"", ""\nApril Wilkens - Advocate for Survivors of Domestic Violence\n"", ""\nOur Work\n"", ""\nGet Involved\n"", ""\nSecond Look Network\n"", ""\n50 Years and a Wake Up\n"", ""\nGrowth in Mass Incarceration\n"", ""\nU.S. Criminal Justice Data\n"", ""\nDetailed Data Tool\n"", ""\nResource Library\n"", ""\nOne in Five\n""]",[],[] -4351,https://github.com/rladiesPHL/2021_datathon/blob/main/data/data_links.md,Court Cases,200,2021_datathon/data/data_links.md at main · rladiesPHL/2021_datathon · GitHub,"Public repository for the R-Ladies Philly & JAT datathon on ""Exploring judicial patterns in Philadelphia courts"" - 2021_datathon/data/data_links.md at main · rladiesPHL/2021_datathon","[""Search code, repositories, users, issues, pull requests..."", ""\n Provide feedback\n "", ""\n Saved searches\n ""]","[""Use saved searches to filter your results more quickly"", ""Footer""]","[""Footer navigation""]",[],[],[] -4352,https://data.mendeley.com/datasets/r65b6hrdhm/2,Policies & Contracts,200,911 Good Samaritan Law Inventory - Mendeley Data,"911 Good Samaritan Laws (GSLs) extend limited legal immunity to persons reporting emergency overdoses who may themselves be in possession of controlled substances or engaging in related activities. The 911 Good Samaritan Law Inventory inductively catalogs each GSL feature across every state from ratification to June 2022. It catalogs the full breadth of protected offenses, all burdens placed on Good Samaritans, the strength of immunity, and exemptions to protection. The inventory complements existing agglomerative policy surveillance databases by mapping features inductively to reflect their heterogenous implementation across states. The materials are formatted by MonQcle, developed by Law Atlas at Temple University's Center Public Health Law Research.","[""911 Good Samaritan Law Inventory""]","[""Description"", ""Files"", ""Steps to reproduce"", ""Institutions"", ""Categories"", ""Related Links"", ""Licence"", ""Dataset metrics""]",[],[],[],[] -4353,https://alleghenycountyda.us/wp-content/uploads/2023/03/2-ACCPA-DA-MODEL-USE-OF-FORCE-PROCEDURES-March-2022.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -4354,https://biglocalnews.org/#/project/UHJvamVjdDo5NTI5MzAwYy1jNmZiLTQ3ZDItYWI2ZC03MDMxYjFlMTNjNDk=,Arrest Records,200,Big Local News,"",[],[],[],[],[],[] -4355,https://github.com/datadesk/los-angeles-police-killings-data/blob/master/los-angeles-police-killings.csv,Use of Force Reports,200,los-angeles-police-killings-data/los-angeles-police-killings.csv at master · datadesk/los-angeles-police-killings-data · GitHub,The Los Angeles Times' database of people killed by local police in Los Angeles County. - los-angeles-police-killings-data/los-angeles-police-killings.csv at master · datadesk/los-angeles-police-killings-data,"[""Search code, repositories, users, issues, pull requests..."", ""\n Provide feedback\n "", ""\n Saved searches\n ""]","[""Use saved searches to filter your results more quickly"", ""Footer""]","[""Footer navigation""]",[],[],[] -4356,https://alleghenycontroller.com/reports-audits/,Annual & Monthly Reports,200,"Reports, Audits, Minutes, & Wardens Archive -","","[""REPORTS & AUDITS""]","[""Reports & Audits"", ""December 2023 Warden\u2019s Report"", ""November 2023 Warden\u2019s Report"", ""October 2023 Warden\u2019s Report"", ""October 2023 Jail Oversight Board Minutes"", ""September 2023 Jail Oversight Board Minutes"", ""Allegheny County Police Confidential Fund Audit Report 2022"", ""Allegheny County Police Confidential Fund Internal Control & Compliance Report 2022"", ""Allegheny County Police DOJ Fund Audit Report 2022"", ""Allegheny County Police DOJ Fund Internal Control & Compliance Report 2022"", ""September 2023 Warden\u2019s Report"", ""County of Allegheny Single Audit Report for Year Ended December 31, 2022"", ""Historical Overview of Shuman Juvenile Detention Facility"", ""August 2023 Jail Oversight Board Minutes"", ""August 2023 Warden\u2019s Report"", ""Independent Auditor\u2019s Report on Internal Control Over Financial Reporting and on Compliance and Other Matters Based on an Audit of Financial Statements Performed in Accordance with Government Auditing Standards Allegheny County Health Department Title V Air Quality Fund for the Year Ended December 31, 2022"", ""Independent Auditor\u2019s Report Allegheny County Health Department Title V Air Quality Fund for the Year Ended December 31, 2022"", ""You are about to leave AlleghenyController.com."", ""10"", ""You are about to leave AlleghenyController.com."", ""10""]","[""Category"", ""Publish date"", ""Search by Vendor Name, Contract Number, or Keyword""]","[""THE CONTROLLER"", ""DOCUMENTS & DATA"", ""TOOLS & RESOURCES"", ""Register As Employer"", ""Register As Constable""]",[],[] -4357,https://americanequity.org/dashboard.html,Court Cases,200,American Equity and Justice Group | Dashboard,Share criminal justice statistics with everyone.,[],[],[],"[""DASHBOARDS""]",[],[] -4358,"https://communitycrimemap.com/?address=snohomishcounty,wa&zoom=11",Crime Maps & Reports,200,LexisNexis® Community Crime Map,"",[],[],[],[],[],[] -4359,https://www.cityofalliance.net/directory.aspx?did=6,Personnel Records,200,Staff Directory • Police Department,"","[""Police Department""]",[],"[""Loading"", ""Live Edit"", ""Online Payments"", ""Quick Links"", ""Site Links""]",[],[],[] -4360,https://app.powerbi.com/view?r=eyJrIjoiYTBiMTkwNDAtMjIwNy00MGE4LThmMDktNWJiMjdlOTAwNGRjIiwidCI6IjgxMGUyYjFkLWIxZGQtNDg1Ni04MzAzLWMwMTY1MDBhNWNmYSJ9,List of Data Sources,200,Microsoft Power BI,"",[],[],[],[],[],[] -4361,"",Records Request Info,-1,"","",,,,,, -4362,https://public.powerdms.com/a2gov/tree,Policies & Contracts,200,PowerDMS,"",[],[],[],[],[],[] -4363,https://www.a2gov.org/departments/police/Pages/Careers.aspx,Training & Hiring Info,200," - - Careers - -","","[""\r\n Careers\r\n ""]","[""\u200bStart a career with the Ann Arbor Police"", ""(NEW)\u00a0Stu\u200b\u200bdent Internship Program"", ""Hiring pr\u200b\u200b\u200b\u200bocess and ti\u200b\u200bm\u200beline"", ""\u200b\u200b\u200b\u200b\u200bRes\u200bou\u200brc\u200b\u200b\u200bes\u200b\u200b\u200b\u200b""]",[],"[""Connect with Us""]",[],[] -4364,https://www.a2gov.org/departments/police/units/Pages/Training.aspx,Training & Hiring Info,200," - - Training - -","","[""\r\n Training\r\n ""]","[""New Hire Polic\u200b\u200be Officer Training"", ""Beyond New\u200b Hire Training""]","[""Visit the\u00a0Careers Page\u200b\u200b""]","[""Connect with Us""]",[],[] -4365,https://www.crimemapping.com/map/mi/annarbor,Crime Maps & Reports,200,CrimeMapping.com - Helping You Build a Safer Community,"",[],[],[],[],[],[] -4366,https://beaconny.gov/wp-content/uploads/2019/09/Beacon_Police_Presentation.pptx,Annual & Monthly Reports,200,"","",[],[],[],[],[],[] -4367,https://beaconny.gov/wp-content/uploads/2019/09/Beacon-PD-Policy.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -4368,https://beaconny.gov/wp-content/uploads/2021/03/City-of-Beacon-Police-Reform-and-Modernization-Collaborative-Plan-Adopted.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -4369,https://www.dutchessny.gov/County-Government/Police-Reform-and-Modernization-Collaborative.htm,Policies & Contracts,200,Police Reform and Modernization Collaborative,"","[""Police Reform and Modernization Collaborative""]","[""Information, Updates and Events"", ""Plan for Reform Report"", ""Police Reform and Modernization Collaborative Workgroups"", ""Community Forums"", ""Meeting Summaries"", ""Executive Orders Regarding Police Reform"", ""News Releases"", ""Police Reform and Modernization Public Comment Form"", ""Frequently Asked Questions"", ""Additional Resources"", """"]","[""Municipal Information"", ""Related Information"", "" Elementary & Secondary Education"", ""Higher Education"", ""Adult Education"", ""Other Educational Resources & Information"", ""Business "", ""Community"", ""Tourism "", ""Arts & Leisure"", ""Contact""]",[],[],[] -4370,https://beaconny.gov/index.php/departments/police/how-it-works-police-calls-for-service/,Policies & Contracts,200,How it Works: Police Calls for Service — City of Beacon,"","[""How it Works: Police Calls for Service""]",[],[],"[""CONTACT US"", ""STAY CONNECTED"", ""Latest News""]",[],[] -4371,https://beaconny.gov/index.php/departments/police/how-it-works-complaints-about-police/,Policies & Contracts,200,How it Works: Complaints about Police — City of Beacon,"","[""How it Works: Complaints about Police""]",[],[],"[""CONTACT US"", ""STAY CONNECTED"", ""Latest News""]",[],[] -4372,https://beaconny.gov/wp-content/uploads/2022/10/Organization-Chart-PDF-101322.pdf,Personnel Records,200,"","",[],[],[],[],[],[] -4373,https://beaconny.gov/wp-content/uploads/2021/04/Resolution-Announcing-City-Councils-Action-Plan-for-Evaluation-and-Rethinking-of-Community-Public-Safety-Services-Executed-Copy.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -4374,https://data.birminghamal.gov/dataset/detail-of-departmental-expense-budget-by-organization-report,Annual & Monthly Reports,200,Detail of Departmental Expense Budget by Organization Report - Dataset - City of Birmingham,"","[""Detail of Departmental Expense Budget by Organization Report"", ""Birmingham Finance Department\n \n "", ""\n \n Detail of Departmental Expense Budget by Organization Report\n \n \n \n ""]","["" Organization"", "" Social"", "" License"", ""Data and Resources""]","[""Additional Info""]",[],[],[] -4375,https://data.birminghamal.gov/dataset/annual-operating-budgets,Annual & Monthly Reports,200,Annual Operating Budgets - Dataset - City of Birmingham,"","[""Annual Operating Budgets"", ""Birmingham Finance Department\n \n "", ""\n \n Annual Operating Budgets\n \n \n \n ""]","["" Organization"", "" Social"", "" License"", ""Data and Resources""]","[""Additional Info""]",[],[],[] -4376,https://data.birminghamal.gov/dataset/homicide-data-annual-birmingham,Crime Maps & Reports,200,Homicide Data - Annual Birmingham - Dataset - City of Birmingham,"","[""Homicide Data - Annual Birmingham"", ""Birmingham Police Department\n \n "", ""\n \n Homicide Data - Annual Birmingham\n \n \n \n ""]","["" Organization"", "" Social"", "" License"", ""Data and Resources""]","[""Additional Info""]",[],[],[] -4377,https://data.birminghamal.gov/dataset/law-department-public-records-request-form,Records Request Info,-1,"","",,,,,, -4378,https://data.birminghamal.gov/dataset/schedule-of-fines-and-fees-for-traffic-violations-equipment-offenses,Policies & Contracts,-1,"","",,,,,, -4379,https://data.birminghamal.gov/dataset/south-precinct-crime-data,Crime Maps & Reports,-1,"","",,,,,, -4380,https://data.birminghamal.gov/dataset/east-precinct-crime-data,Crime Maps & Reports,-1,"","",,,,,, -4381,https://data.birminghamal.gov/dataset/north-precinct-crime-data,Crime Maps & Reports,-1,"","",,,,,, -4382,https://data.birminghamal.gov/dataset/west-precinct-crime-data,Crime Maps & Reports,-1,"","",,,,,, -4383,https://data.birminghamal.gov/dataset/municipal-courts,Court Cases,-1,"","",,,,,, -4384,http://birminghamjailsearch.birminghamal.gov/newworld.inmateinquiry/AL0010200,Incarceration Records,-1,"","",,,,,, -4385,https://www.buffalony.gov/1315/Buffalo-Reform-Agenda,Policies & Contracts,-1,"","",,,,,, -4386,https://data.buffalony.gov/browse?Dataset-Information_Department=Buffalo+Police+Department,List of Data Sources,200,Results matching of Buffalo Police Department | Page 1 of 3 | OpenData Buffalo,"","[""Categories"", ""Department"", ""Division"", ""Tags""]","[""Menu"", ""\n Department > Buffalo Police Department\n \n"", ""\n Sort\n "", ""\n Sort by Most Relevant\n \n"", ""\n Filter\n "", ""\nAuthority\n\n"", ""\nCategories\n\n"", ""\nView Types\n\n"", ""\nDepartment\n\n"", ""\nDivision\n\n"", ""\nTags\n\n"", ""\nFederated Domains\n\n"", ""\nCrime Incidents\n"", ""\nCitiStat Buffalo: Buffalo Police Department\n"", ""\nMonthly Uniform Crime Reporting (UCR) Program Statistics\n"", ""\nReceived Traffic Incident Calls\n"", ""\nTraffic Stop Receipts\n"", ""\nHeat map\nCOMMUNITY CREATED\n"", ""\nLiquor and Crime\nCOMMUNITY CREATED\n"", ""\nUniform Traffic Tickets\n"", ""\nPolice Districts\n"", ""\nBPD Cameras\n"", ""A-Z"", ""A-Z"", ""A-Z"", ""A-Z""]",[],[],[],[] -4387,https://data.buffalony.gov/Public-Safety/Crime-Incidents/d6g9-xbgu/explore/query/SELECT%0A%20%20%60case_number%60%2C%0A%20%20%60incident_datetime%60%2C%0A%20%20%60incident_id%60%2C%0A%20%20%60incident_type_primary%60%2C%0A%20%20%60incident_description%60%2C%0A%20%20%60parent_incident_type%60%2C%0A%20%20%60hour_of_day%60%2C%0A%20%20%60day_of_week%60%2C%0A%20%20%60address_1%60%2C%0A%20%20%60city%60%2C%0A%20%20%60state%60%2C%0A%20%20%60location%60%2C%0A%20%20%60latitude%60%2C%0A%20%20%60longitude%60%2C%0A%20%20%60created_at%60%2C%0A%20%20%60updated_at%60%2C%0A%20%20%60census_tract_2010%60%2C%0A%20%20%60census_block_group_2010%60%2C%0A%20%20%60census_block_2010%60%2C%0A%20%20%60census_tract%60%2C%0A%20%20%60census_block%60%2C%0A%20%20%60census_block_group%60%2C%0A%20%20%60neighborhood_1%60%2C%0A%20%20%60police_district%60%2C%0A%20%20%60council_district%60%2C%0A%20%20%60tractce20%60%2C%0A%20%20%60geoid20_tract%60%2C%0A%20%20%60geoid20_blockgroup%60%2C%0A%20%20%60geoid20_block%60%2C%0A%20%20%60%3A%40computed_region_kwzn_pe6v%60%2C%0A%20%20%60%3A%40computed_region_eziv_p4ck%60%2C%0A%20%20%60%3A%40computed_region_uh5x_q5mi%60%2C%0A%20%20%60%3A%40computed_region_dwzh_dtk5%60%2C%0A%20%20%60%3A%40computed_region_xbxg_7ifr%60%2C%0A%20%20%60%3A%40computed_region_tmcg_v66k%60%2C%0A%20%20%60%3A%40computed_region_fk4y_hpmh%60%2C%0A%20%20%60%3A%40computed_region_ff6v_jbaa%60%2C%0A%20%20%60%3A%40computed_region_h7a8_iwt4%60%2C%0A%20%20%60%3A%40computed_region_vsen_jbmg%60%2C%0A%20%20%60%3A%40computed_region_em9m_yf6k%60%2C%0A%20%20%60%3A%40computed_region_esq4_fkew%60/page/filter,Crime Maps & Reports,200,Crime Incidents | OpenData Buffalo,"",[],"[""Menu""]",[],[],[],[] -4388,https://data.buffalony.gov/Public-Safety/Monthly-Uniform-Crime-Reporting-UCR-Program-Statis/xxu9-yrhd/explore,Crime Maps & Reports,-1,"","",,,,,, -4389,https://data.buffalony.gov/Public-Safety/Received-Traffic-Incident-Calls/6at3-hpb5/explore,Calls for Service,200,Received Traffic Incident Calls | OpenData Buffalo,"",[],"[""Menu""]",[],[],[],[] -4390,https://data.buffalony.gov/Public-Safety/BPD-Cameras/gpj7-v6rr/explore,Misc Police Activity,200,BPD Cameras | OpenData Buffalo,"",[],"[""Menu""]",[],[],[],[] -4391,https://www.dallasopendata.com/Public-Safety/Police-Person/chez-ydz4/explore,Field Contacts,-1,"","",,,,,, -4392,https://www.dallasopendata.com/Public-Safety/Police-Involved-Vehicles/hd9z-g72a/explore,Field Contacts,200,Police Involved Vehicles | Dallas OpenData,"",[],"[""Menu""]",[],[],[],[] -4393,https://www.denvergov.org/Government/Agencies-Departments-Offices/Agencies-Departments-Offices-Directory/Police-Department/Police-Records,Records Request Info,200,Police Records - City and County of Denver,Release of police records and reports is governed by the Colorado Criminal Justice Records Act. Some reports may not be releasable; others may have certain information redacted as required by law.,"[""Police Records""]","[""How to Order Police Records"", ""Identification"", ""Records"", ""Civil Liability"", ""View This Page in Other Languages"", ""\r\n\t\t\tQuestions about Police Records?\r\n\t\t"", ""\r\n\t\t\tFingerprinting Services\r\n\t\t"", ""Related Information""]","[""Step 1"", ""Step 2"", ""Contact 3-1-1"", ""Visit Other Denver Sites"", ""Share & Connect""]","[""General Information"", ""Request Police Records Online""]",[],[] -4394,https://www.denvergov.org/files/assets/public/police-department/documents/discipline-handbook/discipline-handbook.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -4395,https://www.denvergov.org/files/assets/public/police-department/documents/operations-manual/om_book.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -4396,https://denvergov.org/opendata/dataset/hate-crimes,Crime Maps & Reports,200,Denver Open Data Catalog: Hate Crimes,"Description -Hate crimes are criminal offenses that are motivated to some extent by the offender's bias. They are different from traditional criminal offenses because they victimize entire groups rather...",[],"[""Hate Crimes"", ""Description"", ""Disclaimer"", ""About Crime Data"", ""Resources"", ""Details"", ""Tags"", ""Open Data License""]","[""Open Data Catalog""]",[],"[""\n\r\n ONLINE SERVICES\r\n "", ""\n\r\n OPEN DATA\r\n "", ""\n\r\n A - Z SERVICES\r\n ""]",[] -4397,https://app.powerbigov.us/view?r=eyJrIjoiZjEwYTI3YWUtODhjZi00MTJiLWEzMGItMDM2NWIzZGRiNjgxIiwidCI6IjBkOWJjNzljLTU4MWItNDQ3Ny1hY2Y3LThkNzBkZDNlNTU1YSJ9,Stops,200,Microsoft Power BI,"",[],[],[],[],[],[] -4398,https://policetransparency-mycity.hub.arcgis.com/#datadashboards,List of Data Sources,200,Police Transparency Dashboard,"Discover, analyze and download data from Police Transparency Dashboard. Download in CSV, KML, Zip, GeoJSON, GeoTIFF or PNG. Find API links for GeoServices, WMS, and WFS. Analyze with charts and thematic maps. Take the next step and create StoryMaps and Web Maps.",[],[],[],[],[],[] -4399,https://www.cityofdavis.org/city-hall/police-department/officer-involved-shootings,Use of Force Reports,404,"","",,,,,, -4400,https://www.iowacolonytx.gov/police-department/public-information,Records Request Info,200,"Public Information | Iowa Colony, TX","","[""Public Information""]","[""\n How Do I "", ""You are here"", ""\n Contact Info "", ""\nNews ""]","[""Crash Reports"", ""City Hall & Court Hours""]","[""Iowa Colony""]",[],[] -4401,https://www.iowacolonytx.gov/divisions/patrol-division,Personnel Records,200,"Patrol Division | Iowa Colony, TX","","[""Patrol Division""]","[""\n How Do I "", ""You are here"", ""\n Staff Contacts "", ""\n Contact Info "", ""\nNews ""]","[""City Hall & Court Hours""]","[""Iowa Colony""]",[],[] -4402,https://www.cityofmadison.com/police/data/,List of Data Sources,200,"Data & Information - Police Department - City of Madison, Wisconsin","","[""Data & Information""]","[""Data / Reports"", ""Archived Documents"", ""21st Century Policing Quarterly Data"", ""Contact Madison Police"", ""Report / Contact"", ""Connect with Police""]","[""July - September 2023 \u00a0"", ""April - June 2023 \u00a0""]","[""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data""]",[],[] -4403,https://www.cityofmadison.com/police/data/archived-quarterly-data.cfm,Annual & Monthly Reports,200,"Archived 21st Century Policing Quarterly Data - News & Data - Madison Police Department - City of Madison, Wisconsin","","[""Archived 21st Century Policing Quarterly Data""]","[""List of Archived Data"", ""\u00bb News & Data"", ""Contact Madison Police"", ""Report / Contact"", ""Connect with Police""]","[""January - March 2023 \u00a0"", ""October - December 2022 \u00a0"", ""July - September 2022 \u00a0"", ""April - June 2022 \u00a0"", ""January - March 2022 \u00a0"", ""October - December 2021 \u00a0"", ""July - September 2021 \u00a0"", ""April - June 2021 \u00a0"", ""January - March 2021 \u00a0"", ""October - December 2020 \u00a0"", ""July - September 2020 \u00a0"", ""April - June 2020 \u00a0"", ""January - March 2020 \u00a0"", ""October - December 2019 \u00a0"", ""July - September 2019 \u00a0"", ""April - June 2019 \u00a0"", ""January - March 2019 \u00a0"", ""October - December 2018 \u00a0"", ""July - September 2018\u00a0"", ""April - June 2018 \u00a0"", ""January - March 2018 \u00a0"", ""October - December 2017 \u00a0"", ""July - September 2017 \u00a0"", ""April - June 2017 \u00a0"", ""January - March 2017 \u00a0"", ""October - December 2016 \u00a0"", ""July - September 2016 \u00a0"", ""April - June 2016 \u00a0"", ""January - March 2016 \u00a0""]","[""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data"", ""Incident Based Reporting (IBR) Offenses"", ""Incident Based Reporting (IBR) Arrests"", ""Personnel Demographics"", ""Traffic Stop Data"", ""Use of Force Data""]",[],[] -4404,https://www.cityofmadison.com/police/support/records/,Records Request Info,200,"Records - Police Department - City of Madison, Wisconsin","",[],"[""Records"", ""Simone Munson"", ""Contact Madison Police"", ""Report / Contact"", ""Connect with Police""]","[""Public Records Requests"", ""Fees for Reports""]",[],[],[] -4405,https://www.cityofmadison.com/police/newsroom/incidentreports/,Incident Reports,200,"Incident Reports - News & Data - Madison Police Department - City of Madison, Wisconsin","","[""Police Incident Reports A Selection of Noteworthy Incident Reports""]","[""& / or Location:"", ""& / or Date:"", ""Contact Madison Police"", ""Report / Contact"", ""Connect with Police""]","[""Subscribe to Email List""]",[],[],[] -4406,"https://communitycrimemap.com/?address=Madison,%20WI",Crime Maps & Reports,200,LexisNexis® Community Crime Map,"",[],[],[],[],[],[] -4407,https://www.montgomerycountymd.gov/OLO/Resources/Files/2022_reports/OLOReport2022-12.pdf,Citations,200,"","",[],[],[],[],[],[] -4408,https://app.powerbigov.us/view?r=eyJrIjoiZTBhNDYzMTMtZTRhMy00OWRkLTk3ZGItZmJlMGQ2OTRjMDQzIiwidCI6IjYwYWZlOWUyLTQ5Y2QtNDliMS04ODUxLTY0ZGYwMjc2YTJlOCJ9&pageName=ReportSection,Stops,200,Microsoft Power BI,"",[],[],[],[],[],[] -4409,https://www.montgomerycountymd.gov/pol/crime-data.html,List of Data Sources,200," - Public Safety Data Page, Montgomery County Police Department , Montgomery County, MD -","",[],"[""Public Safety Data""]","[""Annual Reports"", ""Monthly Hate/Bias Summaries"", ""Weekly Crime Summary Reports"", ""Sex Offender Registry\u00a0"", ""Extreme Risk Protection Order (ERPO) Information"", ""Other Reports"", ""Crime Incident Map""]","[""POLICE CONTACTS"", ""FOR CRIME SOLVERS"", ""DISTRICTS"", ""RESOURCES"", ""FOLLOW US"", ""STAY INFORMED""]",[],[] -4410,https://www.montgomerycountymd.gov/pol/data/community-pol-report.html,Annual & Monthly Reports,200," - Community Policing Report, MCPD, Montgomery County, MD -","",[],"[""Annual Community Policing Reports"", ""Statistical Data Reports for County Officials""]",[],"[""POLICE CONTACTS"", ""FOR CRIME SOLVERS"", ""DISTRICTS"", ""RESOURCES"", ""FOLLOW US"", ""STAY INFORMED""]",[],[] -4411,https://spdblotter.seattle.gov/2022/01/14/spd-updates-traffic-stop-guidelines/,Policies & Contracts,200,SPD Updates Traffic Stop Guidelines - SPD Blotter,"","[""SPD Updates Traffic Stop Guidelines""]","[""Find Posts By Topic"", ""You might also like..."", ""Police"", ""City-Wide Information"", ""Top Requests"", ""Policies""]","[""Animals"", ""Assistance"", ""For Businesses"", ""Civil Rights"", ""Elected Officials"", ""Explore the City"", ""Get Involved"", ""Immigrants and Refugees"", ""Issues and Initiatives"", ""Learning and Education"", ""Public Safety"", ""Transportation and Development"", ""Technology"", ""Utilities""]","[""Browse the Archive""]",[],[] -4412,https://shakeronline.com/714/Policies-Practices,Policies & Contracts,200,"Policies & Practices | Shaker Heights, OH",Learn more about the department's policies.,"[""\r\n\r\nPolicies & Practices\t\t""]",[],"[""Loading"", ""Bias Free Policing Policy"", ""Body Worn Cameras & Dashcam Video Systems"", ""Duty to Intervene Policy"", ""Officer Involved Critical Incidents Policy"", ""Response to Threats Policy"", ""Other"", ""Contact Us"", ""Quick Links"", ""Site Links""]",[],[],[] -4413,https://shakeronline.com/719/Training,Training & Hiring Info,200,"Training | Shaker Heights, OH",Learn more about the training received by Shaker Heights police officers.,"[""\r\n\r\nTraining\t\t""]","[""De-Escalation Training"", ""Bias-Free Policing Training\u00a0"", ""LeadDiversity""]","[""Loading"", ""Contact Us"", ""Quick Links"", ""Site Links""]",[],[],[] -4414,https://shakeronline.com/614/Police-Reports,Incident Reports,200,"Police Reports | Shaker Heights, OH",Access online police reports.,"[""\r\n\r\nPolice Reports\t\t""]",[],"[""Loading"", ""Contact Us"", ""Quick Links"", ""Contact Us"", ""Quick Links"", ""Site Links""]","[""Police Department""]",[],[] -4415,https://mg.search.org/wp-content/uploads/2022_AnnMtg-NewDirectionsNIBRSAndIncidentBasedResearch.pdf,Annual & Monthly Reports,200,"","",[],[],[],[],[],[] -4416,https://nixthe6.org/contracts/,Policies & Contracts,200,Contracts | Nix The Six | Campaign Zero,"","[""""]","["""", ""Contracts""]",[],[],[],[] -4417,https://www.muckrock.com/foi/knoxville-30436/roster-and-hire-dates-143162/?,Personnel Records,200,Roster and hire dates • MuckRock,MuckRock is a collaborative news site that gives you the tools to hold the government accountable.,"[""Roster and hire dates""]","[""Communications"", ""Files""]","[""""]",[],[],[] -4418,https://www.muckrock.com/foi/pittsburgh-130/calls-for-service-144982/,Calls for Service,200,Calls for service • MuckRock,MuckRock is a collaborative news site that gives you the tools to hold the government accountable.,"[""Calls for service""]","[""Communications"", ""Files""]","[""""]",[],[],[] -4419,https://www.tcole.texas.gov/content/racial-profiling-reports,Stops,200,Racial Profiling Reports | Texas Commission on Law Enforcement,"Law Enforcement Agency Requirements*PLEASE NOTE: Reporting for the 2022 racial profiling report opened January 1, 2023, and will be available until March 1, 2023, for traffic stops conducted in 2022.  (click here for a sample of the questions)","[""\n\n\n\n\nRacial Profiling Reports\n\n""]","[""Main navigation"", ""Law Enforcement Agency Requirements"", ""Resources"", ""Support"", ""Texas Law Enforcement Agency Racial Profiling Reports Submitted to TCOLE"", ""Footer""]",[],[],[],[] -4420,https://insights.cincinnati-oh.gov/stories/s/qurw-azge,Complaints & Misconduct,200,Closed Citizen Complaints,"",[],"[""Menu""]",[],[],"[""How to use this dashboard"", ""About this data""]",[] -4421,https://data.cincinnati-oh.gov/Safety/Citizen-Complaint-Authority-CCA-Closed-Complaints/ii65-eyg6/explore,Complaints & Misconduct,200,Citizen Complaint Authority (CCA) Closed Complaints | Tyler Data & Insights,"",[],"[""Menu""]",[],[],[],[] -4422,https://phillypolice.com/accountability/findings/#!#%2F_ga=2.88868763.1007266185.1596139754-12687582.1596139754,Complaints & Misconduct,200,Accountability | Philadelphia Police Department,"",[],"[""Begin typing to search"", ""Results""]","[""Complaints Against Police (CAP) Findings"", ""Navigation""]","[""News"", ""Districts"", ""Accountability"", ""Programs & Services"", ""Forms"", ""Crime Maps & Stats"", ""PPD Digital"", ""Careers"", ""Search""]",[],[] -4423,https://data.hartford.gov/Public-Safety/Police-911-Calls-for-Service-05122021-to-Current/uaxa-ans5/explore,Calls for Service,200,Police 911 Calls for Service 05122021 to Current | Data | City of Hartford,"",[],"[""Menu""]",[],[],[],[] -4424,https://data.cityofnewyork.us/Public-Safety/911-End-to-End-Data/t7p9-n9dy/explore,Calls for Service,200,911 End-to-End Data | NYC Open Data,"",[],"[""Menu""]",[],[],[],[] -4425,https://data.boston.gov/dataset/boston-police-department-fio,Field Contacts,200,BPD Field Interrogation and Observation (FIO) - Dataset - Analyze Boston,"","[""BPD Field Interrogation and Observation (FIO)"", ""Boston Police Department\n \n "", ""\n \n BPD Field Interrogation and Observation (FIO)\n \n \n \n ""]","["" Organization"", "" Social"", "" License"", ""Data and Resources""]","[""About the FIO Records (Mark43) Files (Sept 29 - Dec 31 2022)"", ""About the FIO Records 2015 (New RMS) and 2016, 2017, 2018, 2019, and 2020 (Jan 1 - Sept 29 2020) Files"", ""About the FIO Records 2011 - 2015 (Old RMS) File"", ""Additional Notes"", ""Tags"", ""Additional Info"", ""About the FIO Records (Mark43) Files (Sept 29 - Dec 31 2022)"", ""About the FIO Records 2015 (New RMS) and 2016, 2017, 2018, 2019, and 2020 (Jan 1 - Sept 29 2020) Files"", ""About the FIO Records 2011 - 2015 (Old RMS) File"", ""Additional Notes""]",[],[],[] -4426,https://www.wokewindows.org/exports,List of Data Sources,200,Data Exports — The Woke Windows Project,"Daily exports of records providing a view into the Boston Police Department including officers, salaries, and complaints.","[""Data Exports""]","[""Citations"", ""Complaints - Officers"", ""Contributions"", ""Details"", ""Field Contacts"", ""Field Contact Names"", ""Officers"", ""Court Overtime Shifts""]",[],[],[],[] -4427,https://qmr.news/public-records/,List of Data Sources,200,Public Records – The Mass Dump,"","[""Public Records""]",[],[],[],[],[] -4428,https://www.publicsource.org/pittsburgh-bureau-police-discipline-complaints-disciplinary-matrix-new-chief/,Complaints & Misconduct,200,First year under Mayor Gainey saw fewer complaints vs police,"Pittsburgh in 2022 saw some of the lowest numbers of complaints against police, and disciplinary actions within the bureau, in a decade.","[""\n\t\t\tComplaints against Pittsburgh police dropped in 2022, and this year could set a long-term tone\t\t""]","[""MOST READ PUBLICSOURCE STORIES"", ""About the data"", ""Know more than you did before? Support this work with a gift!"", ""\n\n\t\t\t\t\t\t\t\t\tRich Lord\t\t\t\t\t\t\t\t\n""]","[""Share this:"", ""Like what you're reading? Want even more? Subscribe to PublicSource\u2019s free newsletter:"", ""Pittsburgh school board considers adding student seats"", ""After pandemic disruption, enrollment at CCAC stabilizes"", ""Going beyond instruction, community schools serve as \u2018hubs in the community\u2019"", ""From poor white roots to intersectional anti-poverty solutions for all"", ""County\u2019s top health post, vacant for a year, \u2018vital\u2019 to Innamorato administration""]",[],[],[] -4429,https://www.50-a.org/,Complaints & Misconduct,200,50-a.org: search NYPD misconduct,"Search NYPD officer misconduct. A website of Civilian Complaint Review Board complaints, police misconduct records, lawsuits and related public NYPD data.",[],[],[],[],[],[] -4430,https://bpdwatch.com/browse,Personnel Records,200,Browse BPD Watch,Browse a department on BPD Watch.,[],"[""Baltimore Police Department\n \n "", ""Baltimore County Police Department\n \n ""]","[""Baltimore State's Attorney's Office's \n Do Not Call list"", ""Baltimore State's Attorney's Office's \n list of officers with credibility issues""]",[],"[""BPD Watch"", ""Contact"", ""Navigation""]",[] -4431,https://mdcaseexplorer.com/,Court Cases,200,MD Case Explorer,"",[],[],[],[],[],[] -4432,https://policefundingdatabase.org/explore-the-database/find-a-location/,Budgets & Finances,200,Find a location | Police Funding Database | LDF | TMI,"Explore the cities, counties, and states tracked by LDF’s National Police Funding Database. ","[""Find a location""]","[""JUMP TO A STATE:"", ""Follow the Thurgood Marshall Institute"", ""Sign up for updates"", ""Disclaimer""]",[],[],[],[] -4433,https://www.opendatapolicingnc.com/stop,Stops,200,Open Data Policing,"","[""Find a Traffic Stop""]","[""Stops (29,718,763 total)""]","[""Basic Search"", ""Advanced Search"", ""About Open Data Policing"", ""Donate"", ""Connect""]",[],[],[] -4434,https://docs.google.com/spreadsheets/d/151J17PmQualbo7ONsLtei6I0jE_6C5Ut/edit?usp=sharing&ouid=106943000769599966023&rtpof=true&sd=true,Citations,200,Non-Haz Citations 2021 and 2022 EDH.xlsx - Google Sheets,"",[],[],[],[],[],[] -4435,https://www.muckrock.com/foi/pittsburgh-130/q1-2023-traffic-stops-144011/,Stops,200,Q1 2023 Traffic Stops • MuckRock,MuckRock is a collaborative news site that gives you the tools to hold the government accountable.,"[""Q1 2023 Traffic Stops""]","[""Communications"", ""Files""]","[""""]",[],[],[] -4436,https://github.com/data-liberation-project/dea-theft-and-loss-counts,Incident Reports,200,"GitHub - data-liberation-project/dea-theft-and-loss-counts: Spreadsheets, obtained via FOIA, quantifying thefts/losses of controlled substances (and regulated chemicals) reported to the DEA.","Spreadsheets, obtained via FOIA, quantifying thefts/losses of controlled substances (and regulated chemicals) reported to the DEA. - GitHub - data-liberation-project/dea-theft-and-loss-counts: Spreadsheets, obtained via FOIA, quantifying thefts/losses of controlled substances (and regulated chemicals) reported to the DEA.","[""Search code, repositories, users, issues, pull requests..."", ""\n Provide feedback\n "", ""\n Saved searches\n "", ""data-liberation-project/dea-theft-and-loss-counts""]","[""Use saved searches to filter your results more quickly"", ""About"", ""\n\n Releases\n"", ""Languages"", ""Footer""]","[""Resources"", ""Stars"", ""Watchers"", ""Forks"", ""Footer navigation""]",[],[],[] -4437,https://www.dps.arkansas.gov/crime-info-support/arkansas-crime-information-center/,List of Data Sources,200,Crime Information Center - Arkansas Department of Public Safety,"","["" Flag Status""]","[""Arkansas Crime Information Center"", "" 2024 ACIC System Conference"", ""ACIC Director"", ""Jeff Long"", "" 2024 ACIC System Conference"", ""ACIC Director"", ""Jeff Long"", ""Online Services"", ""HELPFUL Links"", ""ACIC News"", ""ARKANSAS ICAC TASK FORCE MARKS 20 YEARS OF PROTECTING CHILDREN"", ""October 23, 2023"", ""ACIC CALENDAR"", ""Contact ACIC"", ""Helpful ACIC links"", ""Connect with ACIC"", ""Respect. Integrity. \nCUSTOMER SERVICE. TEAMWORK. \nSERVANT LEADERSHIP. \nCONTINUOUS IMPROVEMENT"", """", ""\u00a9 2024 All rights Reserved. Arkansas.gov ""]",[],[],"[""About DPS"", ""DPS Links"", ""DPS Address"", ""Your Arkansas.gov"", ""Top Online Services"", ""Helpful Information""]",[] -4438,https://atlasofsurveillance.org/,Misc Police Activity,200,Atlas of Surveillance,"","[""Atlas of Surveillance""]","[""Documenting Police Tech in Our Communitieswith Open Source Research"", ""What is the Atlas?""]",[],[],[],[] -4439,https://apps.pittsburghpa.gov/redtail/images/20764_2023_2025_CONTRACT_RATIFICATION_.pdf,Policies & Contracts,200,"","",[],[],[],[],[],[] -4440,https://www.mass.gov/info-details/officer-disciplinary-records-database,Complaints & Misconduct,200,Officer Disciplinary Records database | Mass.gov,View the database of active law enforcement officer disciplinary records here.,"[""\nOfficer Disciplinary Records database\n""]","[""Table of Contents"", ""Disciplinary records database\n "", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -4441,https://www.muckrock.com/foi/rockwood-30523/roster-and-hire-dates-143170/?,Personnel Records,200,Roster and hire dates • MuckRock,MuckRock is a collaborative news site that gives you the tools to hold the government accountable.,"[""Roster and hire dates""]","[""Communications"", ""Files""]",[],[],[],[] -4442,https://public.tableau.com/app/profile/abolitionist.law.center/viz/ALCBailDashboard/ALCBailDashboard,Court Cases,200,"","",[],[],[],[],[],[] -4443,https://documents.alleghenycounty.us/PAVClient/ContractSearch/index.html,Policies & Contracts,200,Contracts Portal | Allegheny County,"",[],[],[],"[""Search"", ""Results""]",[],[] -4444,https://alleghenycontroller.com/contact/right-to-know-request/,Records Request Info,200,Right To Know Request -,"","[""Right To Know Request""]","[""You are about to leave AlleghenyController.com."", ""10"", ""You are about to leave AlleghenyController.com."", ""10""]",[],"[""Right To Know Request"", ""THE CONTROLLER"", ""DOCUMENTS & DATA"", ""TOOLS & RESOURCES"", ""Register As Employer"", ""Register As Constable""]",[],[] -4445,https://alleghenycontroller.com/the-controller/jail-oversight-board/,List of Data Sources,200,Jail Oversight Board -,"","[""Jail Oversight Board"", ""Community Resources ""]","["""", ""Meetings"", """", ""Public Comments"", """", ""Records and Information"", """", ""Incarcerated Individuals Welfare Fund"", ""Warden's reports"", "" Meeting minutes"", ""Meeting Agendas"", ""Past Public Comments"", ""Other Jail Oversight Board Documents"", ""You are about to leave AlleghenyController.com."", ""10"", ""You are about to leave AlleghenyController.com."", ""10""]","["""", ""Members""]","[""THE CONTROLLER"", ""DOCUMENTS & DATA"", ""TOOLS & RESOURCES"", ""Register As Employer"", ""Register As Constable""]",[],[] -4446,https://www.anaheim.net/FormCenter/Police-Department-13/Public-Record-Request-97,Records Request Info,200,Form Center • Public Record Request,"","[""Form Center""]","[""Public Record Request""]","[""Loading"", ""Search Forms:"", ""Contact Us"", ""Helpful Links"", ""Quick Links""]",[],[],[] -4447,https://pittsburghpa.gov/police/data-portal,Crime Maps & Reports,200,Police Data Portal | pittsburghpa.gov,"","[""CAREERS"", ""CONTACT US"", ""FOLLOW US"", ""GU\u00cdA DE RESIDENTES"", """", ""City-County Building Lighting - What Do Tonight's Colors Represent?""]",[],"[""DEPARTMENT MENU""]","[""Police Links"", ""About Police"", ""Community Engagement Office"", ""Police Branches"", ""Police Zones"", ""Police Data"", ""Resources"", ""News""]",[],[] -4448,https://www.cityofdavis.org/city-hall/police-department/officer-involved-shootings,Officer Involved Shootings,404,"","",,,,,, -4449,https://data.cityofnewyork.us/Public-Safety/NYPD-Use-of-Force-Incidents/f4tj-796d,Use of Force Reports,200,NYPD Use of Force Incidents | NYC Open Data,"","[""""]","[""Menu""]",[],[],[],[] diff --git a/hugging_face/testing/hf_trainer.py b/hugging_face/testing/hf_trainer.py deleted file mode 100644 index 48471bf6..00000000 --- a/hugging_face/testing/hf_trainer.py +++ /dev/null @@ -1,85 +0,0 @@ -import evaluate -import numpy as np -from datasets import ClassLabel -from datasets import load_dataset -from transformers import AutoModelForSequenceClassification -from transformers import AutoTokenizer -from transformers import TrainingArguments, Trainer, get_linear_schedule_with_warmup, AdamW -from transformers import pipeline - -MODEL = "distilbert-base-uncased" - -#explicitly load dataset from local file (hugging face insists on a constant train/test split when loading from hub) -dataset = load_dataset('csv', data_files="data/labeled-source-text.csv") -dataset = dataset.shuffle() -dataset = dataset['train'].train_test_split(test_size=0.15) - -tokenizer = AutoTokenizer.from_pretrained(MODEL) -labels = ClassLabel(names_file="data/coarse-labels.txt") -features = ['url', 'http_response', 'html_title', 'meta_description', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div_text'] - -def tokenize_function(batch): - # Combine relevant features into a single string for tokenization - text_to_tokenize = " ".join([str(batch[feature]) for feature in features]) - tokens = tokenizer(text_to_tokenize, padding='max_length', truncation=True) - tokens["label"] = labels.str2int(batch["label"]) - return tokens - -# Tokenize the datasets -tokenized_train_dataset = filtered_dataset["train"].map(tokenize_function, batched=False) -tokenized_test_dataset = filtered_dataset["test"].map(tokenize_function, batched=False) - -# Optionally, you can cast the "label" column to ClassLabel -tokenized_train_dataset = tokenized_train_dataset.cast_column("label", labels) -tokenized_test_dataset = tokenized_test_dataset.cast_column("label", labels) - -classifier = pipeline("text-classification", model=MODEL, framework="pt", tokenizer=tokenizer) -model = AutoModelForSequenceClassification.from_pretrained(MODEL, num_labels=8) - -training_args = TrainingArguments( - output_dir="distilbert_1.1", - evaluation_strategy="epoch", - save_strategy='epoch', - num_train_epochs=2, - learning_rate=2e-5, # Initial learning rate - per_device_train_batch_size=8, - per_device_eval_batch_size=8, - warmup_steps=100, # Number of warmup steps - weight_decay=0.00 # Weight decay coefficient) -) -optimizer = AdamW(model.parameters(), lr=training_args.learning_rate) # Define the optimizer -metric = evaluate.load("accuracy") - -# Calculate the total number of training steps -total_steps = len(tokenized_train_dataset) // training_args.per_device_train_batch_size * training_args.num_train_epochs - -# Create the learning rate scheduler -scheduler = get_linear_schedule_with_warmup( - optimizer, - num_warmup_steps=training_args.warmup_steps, - num_training_steps=total_steps -) - -eval_predictions = [] -eval_labels = [] - -def compute_metrics(eval_pred): - logits, labels = eval_pred - predictions = np.argmax(logits, axis=-1) - - #store the predictions and labels - eval_predictions.extend(predictions.tolist()) - eval_labels.extend(labels.tolist()) - - return metric.compute(predictions=predictions, references=labels) - -trainer = Trainer( - model=model, - args=training_args, - train_dataset=tokenized_train_dataset, - eval_dataset=tokenized_test_dataset, - compute_metrics=compute_metrics, - optimizers = (optimizer, scheduler) -) - -trainer.train() diff --git a/hugging_face/url_record_type_labeling/__init__.py b/hugging_face/url_record_type_labeling/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/hugging_face/url_relevance/README.md b/hugging_face/url_relevance/README.md deleted file mode 100644 index bef0544b..00000000 --- a/hugging_face/url_relevance/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# Hugging Face URL Relevance Model - -This model is trained using website data from a list of potentially relevant URLs. - -A "relevant" URL is one that related to criminal justice. A "relevant" website does not necessarily mean it is a "good" data source. - -The latest version of the model can be found here: [https://huggingface.co/PDAP/url-relevance](https://huggingface.co/PDAP/url-relevance) - -## How to use - -The training script requires `Python 3.10` or lower to install the dependencies. - -1. `cd` into the root directory of the project -2. Create a virtual environment. In your terminal: -```commandline -python -m venv relevance-environment -source relevance-environment/bin/activate -``` -3. Now install the required python libraries: -```commandline -$pip install -r requirements.txt -``` -4. Run `python3 hugging_face/url_relevance/huggingface_relevance.py` - -## Scripts - -- `huggingface_relevance.py` - The training script for the model. -- `clean_data.py` - Cleans up raw website data from the tag collector so that it may be used for effective training. diff --git a/hugging_face/url_relevance/__init__.py b/hugging_face/url_relevance/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/hugging_face/url_relevance/clean-data-example.csv b/hugging_face/url_relevance/clean-data-example.csv deleted file mode 100644 index 0c63332b..00000000 --- a/hugging_face/url_relevance/clean-data-example.csv +++ /dev/null @@ -1,11 +0,0 @@ -url,url_path,label,html_title,meta_description,root_page_title,http_response,keywords,h1,h2,h3,h4,h5,h6 -https://coloradosprings.gov/police-department/article/news/i-25-traffic-safety-deployment-after-stop,police-department/article/news/i-25-traffic-safety-deployment-after-stop,Relevant,I-25 Traffic Safety Deployment- After the Stop | City of Colorado Springs,"",Home Page | City of Colorado Springs,200,"['traffic safety deployment', '25 traffic safety', 'colorado springs traffic', 'springs traffic transportation', 'traffic safety', 'safety traffic', 'transportation engineering traffic', 'keeping roadways safe', 'traffic safety traffic', 'colorado springs drivers']","[""I-25 Traffic Safety Deployment- After the Stop""]","[""Search"", ""Colorado Springs Weekly"", ""GoCOS!"", ""Connect with @CityofCOS""]",[],[],"[""REPORT ONLINE""]",[] -http://www.longbeach.gov/police/press-releases/pursuit-with-traffic-fatality---3rd-street-and-temple-avenue/,police/press-releases/pursuit-with-traffic-fatality---3rd-street-and-temple-avenue/,Relevant,PURSUIT WITH TRAFFIC FATALITY - 3RD STREET AND TEMPLE AVENUE,"",City of Long Beach,200,"['pursuit traffic fatality', 'pursuit stolen vehicle', 'long beach police', 'vehicle victim', 'involved pursuit stolen', 'stolen vehicle victim', 'officers involved pursuit', 'suspect vehicle collided', 'traffic fatality 3rd', 'police department collision']","[""Long Beach Police Department""]",[],[],[],[],[] -http://www.ryepolice.us/logs/police-logs-for-6-3-20-6-9-20,logs/police-logs-for-6-3-20-6-9-20,Relevant,Rye Police Department Police Logs for 6/3/20-6/9/20 - Rye Police Department,"",Rye Police Department Welcome to the Rye Police Department - Rye Police Department,200,"['rye police department', 'rye police', '20 rye police', 'ordinances victim services', 'police department emergency', 'police logs 20', '2020 police logs', 'report request town', 'location address rye', 'department emergency 911']","[""Police Logs for 6/3/20-6/9/20""]","[""Police Logs for 6/3/20-6/9/20""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -http://www.ryepolice.us/logs/police-logs-for-11216-11816,logs/police-logs-for-11216-11816,Relevant,Rye Police Department Police Logs for 11/2/16-11/8/16 - Rye Police Department,"",Rye Police Department Welcome to the Rye Police Department - Rye Police Department,200,"['rye police department', 'rye public safety', 'rye police', '16 rye police', 'ordinances victim services', 'police department emergency', 'report request town', 'department emergency 911', 'police department', 'department police']","[""Police Logs for 11/2/16-11/8/16""]","[""Police Logs for 11/2/16-11/8/16""]","[""Navigation"", ""Follow Us"", ""Facebook"", ""Email Updates"", ""Storm Preparedness Guide""]",[],[],[] -https://delcopa.gov/sheriff/pdf/atf_letter.pdf,sheriff/pdf/atf_letter.pdf,Relevant,"","","Delaware County, Pennsylvania",200,"","","","","","","" -https://www.mass.gov/event/jlmc-17-6105-watertown-police-association-3a-hearing-open-meeting-notice-05-09-2018-2018-05-09t100000-0400-2018-05-09t170000-0400,event/jlmc-17-6105-watertown-police-association-3a-hearing-open-meeting-notice-05-09-2018-2018-05-09t100000-0400-2018-05-09t170000-0400,Relevant,JLMC-17-6105 Watertown Police Association 3(A) Hearing Open Meeting Notice 05-09-2018 | Mass.gov,JLMC-17-6105 Watertown Police Association 3(A) Hearing Open Meeting Notice 05-09-2018,Mass.gov,200,"['government organization massachusetts', 'gov mass', 'mass gov', 'content mass gov', 'mass gov mass', 'massachusetts mass gov', 'commonwealth massachusetts', 'organization massachusetts', 'gov mass gov', 'massachusetts know official']","[""JLMC-17-6105 Watertown Police Association 3(A) Hearing Open Meeting Notice 05-09-2018""]","[""Address"", ""Overview of JLMC-17-6105 Watertown Police Association 3(A) Hearing Open Meeting Notice 05-09-2018"", ""Additional Resources for JLMC-17-6105 Watertown Police Association 3(A) Hearing Open Meeting Notice 05-09-2018"", ""Help Us Improve Mass.gov with your feedback""]",[],[],[],[] -https://ridgelandsc.gov/police-department/daily-arrest-reports-may,police-department/daily-arrest-reports-may,Relevant,Town of Ridgeland,Town of Ridgeland,Town of Ridgeland,200,"['maps community ridgeland', 'ridgeland home government', 'services town ridgeland', 'town ridgeland', 'town ridgeland website', 'town ridgeland farmers', 'community ridgeland', 'town ridgeland home', 'community ridgeland battle', 'ridgeland website']","[""Police Department""]","[""Daily Arrest Reports - May""]",[],[],[],[] -https://delcopa.gov/planning/pdf/demodata/minoritypopulation2020map.pdf,planning/pdf/demodata/minoritypopulation2020map.pdf,Irrelevant,"","","Delaware County, Pennsylvania",200,"","","","","","","" -https://www.mass.gov/doc/christine-kennedy-v-city-of-chicopee-school-dept/download,doc/christine-kennedy-v-city-of-chicopee-school-dept/download,Relevant,"","",Mass.gov,200,"","","","","","","" -https://www.providenceri.gov/hr/wellness/cop-manage-anxiety-9-11/,hr/wellness/cop-manage-anxiety-9-11/,Irrelevant,City of Providence CoP Manage Anxiety 9.11 - City of Providence,"",City of Providence Home - City of Providence,200,"['providence cop manage', 'city providence cop', 'providence cop', 'city providence', 'providence city hall', 'providence city', '11 city providence', 'providence providence', 'providence rhode', 'street providence']","[""CoP Manage Anxiety 9.11""]","[""Share this story"", ""Providence City Hall"", ""Follow Us on Social Media:""]","[""City Of Providence"", ""Mayor Brett Smiley"", ""SIGN UP FOR OUR WEEKLY E-NEWS | Haga clic aquí para español"", ""Lists *""]",[],[],[] diff --git a/hugging_face/url_relevance/clean_data.py b/hugging_face/url_relevance/clean_data.py deleted file mode 100644 index f130b8aa..00000000 --- a/hugging_face/url_relevance/clean_data.py +++ /dev/null @@ -1,59 +0,0 @@ -import ast -import csv -import os -import sys - -""" This script cleans up raw website data from the tag collector - so that it may be used for effective training. - It primarily merges list of strings into a single string, - removing brackets and quotes from the string. -""" - - -csv.field_size_limit(sys.maxsize) -FILE = "clean-data-example.csv" - -with open(FILE, newline="") as readFile, open("new.csv", "w", newline="") as writeFile: - reader = csv.DictReader(readFile) - fieldnames = [ - "url", - "url_path", - "label", - "html_title", - "meta_description", - "root_page_title", - "http_response", - "keywords", - "h1", - "h2", - "h3", - "h4", - "h5", - "h6", - "div_text", - ] - writer = csv.DictWriter(writeFile, fieldnames=fieldnames) - writer.writeheader() - - for row in reader: - write_row = row - - for key, value in write_row.items(): - try: - val_list = ast.literal_eval(value) - except (SyntaxError, ValueError): - continue - - # if key == "keywords": - # l = l[0:2] - - try: - value = " ".join(val_list) - except TypeError: - continue - - write_row.update({key: value}) - - writer.writerow(write_row) - - os.rename("new.csv", FILE) diff --git a/hugging_face/url_relevance/constants.py b/hugging_face/url_relevance/constants.py deleted file mode 100644 index e46ca8c7..00000000 --- a/hugging_face/url_relevance/constants.py +++ /dev/null @@ -1,18 +0,0 @@ - - -URL_RELEVANCE_DATASET = "PDAP/urls-relevance" -TRAINING_URLS_DATASET = "PDAP/training-urls" -DATASET_TEXT_COLS =[ - "url_path", - "html_title", - "keywords", - "meta_description", - "root_page_title", - "h1", - "h2", - "h3", - "h4", - "h5", - "h6", -] # Not included: "url", "http_response" -EMPTY_TEXT_VALUES = ['[""]', None, "[]", '""'] \ No newline at end of file diff --git a/hugging_face/url_relevance/dataclasses/TrainTestDataframes.py b/hugging_face/url_relevance/dataclasses/TrainTestDataframes.py deleted file mode 100644 index 928da97e..00000000 --- a/hugging_face/url_relevance/dataclasses/TrainTestDataframes.py +++ /dev/null @@ -1,12 +0,0 @@ -from dataclasses import dataclass - -import pandas as pd - - -@dataclass -class TrainTestDataframes: - train: pd.DataFrame - test: pd.DataFrame - - def get_as_list(self): - return [self.train, self.test] diff --git a/hugging_face/url_relevance/dataclasses/__init__.py b/hugging_face/url_relevance/dataclasses/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/hugging_face/url_relevance/huggingface_relevance.py b/hugging_face/url_relevance/huggingface_relevance.py deleted file mode 100644 index 1a29d156..00000000 --- a/hugging_face/url_relevance/huggingface_relevance.py +++ /dev/null @@ -1,111 +0,0 @@ -import evaluate -import numpy as np -import pandas as pd -from datasets import concatenate_datasets -from datasets import load_dataset -from multimodal_transformers.data import load_data -from multimodal_transformers.model import AutoModelWithTabular, TabularConfig -from transformers import AutoConfig -from transformers import AutoTokenizer -from transformers import TrainingArguments, Trainer - -from hugging_face.url_relevance.constants import EMPTY_TEXT_VALUES, DATASET_TEXT_COLS, URL_RELEVANCE_DATASET - -""" This model is trained using website data from - a list of potentially relevant URLs. - A "relevant" URL is one that related to criminal justice. - A "relevant" website does not necessarily mean it is a "good" data source. - The latest version of the model can be found here: - https://huggingface.co/PDAP/url-relevance -""" - -MODEL = "distilbert-base-uncased" -MAX_STEPS = 1000 - - -def str2int(label: str) -> int: - return labels.index(label) - -# Set up Dataset -dataset = load_dataset(URL_RELEVANCE_DATASET) -dataset = concatenate_datasets([dataset["train"], dataset["test"]]) -dataset = dataset.shuffle() -dataset = dataset.train_test_split(test_size=0.15) -train_df = pd.DataFrame(dataset["train"]) -test_df = pd.DataFrame(dataset["test"]) - -# Apply labels -labels = ["Relevant", "Irrelevant"] -num_labels = len(labels) -label_col = "label" -train_df["label"] = train_df["label"].apply(str2int) -test_df["label"] = test_df["label"].apply(str2int) - -tokenizer = AutoTokenizer.from_pretrained(MODEL) - -# Load data into train and test datasets -train_dataset = load_data( - data_df=train_df, - text_cols=DATASET_TEXT_COLS, - tokenizer=tokenizer, - label_col=label_col, - label_list=labels, - sep_text_token_str=tokenizer.sep_token, - empty_text_values=EMPTY_TEXT_VALUES, -) -test_dataset = load_data( - data_df=test_df, - text_cols=DATASET_TEXT_COLS, - tokenizer=tokenizer, - label_col=label_col, - label_list=labels, - sep_text_token_str=tokenizer.sep_token, - empty_text_values=EMPTY_TEXT_VALUES, -) - -# Set up config -config = AutoConfig.from_pretrained(MODEL) -tabular_config = TabularConfig( - num_labels=num_labels, - combine_feat_method="text_only", -) -config.tabular_config = tabular_config -config.max_position_embeddings = 2048 - -# Load model -model = AutoModelWithTabular.from_pretrained(MODEL, config=config, ignore_mismatched_sizes=True) - -metric = evaluate.load("accuracy") - - -def compute_metrics(eval_pred): - logits, labels = eval_pred - # logits_shape = logits[0].shape if isinstance(logits, tuple) else logits.shape - predictions = np.argmax(logits[0], axis=-1) if isinstance(logits, tuple) else np.argmax(logits, axis=-1) - labels = labels.flatten() - predictions = predictions.flatten() - - return metric.compute(predictions=predictions, references=labels) - - -# Set up trainer -training_args = TrainingArguments( - output_dir="./url_relevance", - logging_dir="./url_relevance/runs", - overwrite_output_dir=True, - do_train=True, - max_steps=MAX_STEPS, - evaluation_strategy="steps", - eval_steps=25, - logging_steps=25, - weight_decay=0.1, -) -trainer = Trainer( - model=model, - args=training_args, - train_dataset=train_dataset, - eval_dataset=test_dataset, - compute_metrics=compute_metrics, -) - -trainer.train() diff --git a/hugging_face/url_relevance/huggingface_relevance_2.py b/hugging_face/url_relevance/huggingface_relevance_2.py deleted file mode 100644 index 030bd7b8..00000000 --- a/hugging_face/url_relevance/huggingface_relevance_2.py +++ /dev/null @@ -1,30 +0,0 @@ -import pandas as pd -from datasets import load_dataset, concatenate_datasets - -from hugging_face.url_relevance.dataclasses.TrainTestDataframes import TrainTestDataframes - -MODEL = "distilbert-base-uncased" -DATASET = "PDAP/urls-relevance" -MAX_STEPS = 1000 -LABELS = ["Relevant", "Irrelevant"] -LABEL_COL = "label" - - -def str2int(label: str) -> int: - return LABELS.index(label) - - -def set_up_dataset() -> TrainTestDataframes: - dataset = load_dataset(DATASET) - dataset_concat = concatenate_datasets([dataset["train"], dataset["test"]]) - dataset_shuffle = dataset_concat.shuffle() - dataset_split = dataset_shuffle.train_test_split(test_size=0.15) - return TrainTestDataframes( - train=pd.DataFrame(dataset_split["train"]), - test=pd.DataFrame(dataset_split["test"]) - ) - -def apply_labels(ttd: TrainTestDataframes): - num_labels = len(LABELS) - for df in ttd.get_as_list(): - df[LABEL_COL] = df[LABEL_COL].apply(str2int) \ No newline at end of file diff --git a/hugging_face/url_relevance/models/__init__.py b/hugging_face/url_relevance/models/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/hugging_face/url_relevance/models/urls_only/__init__.py b/hugging_face/url_relevance/models/urls_only/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/hugging_face/url_relevance/models/urls_only/tf_idf_logistic_regression.py b/hugging_face/url_relevance/models/urls_only/tf_idf_logistic_regression.py deleted file mode 100644 index 5d0187d8..00000000 --- a/hugging_face/url_relevance/models/urls_only/tf_idf_logistic_regression.py +++ /dev/null @@ -1,41 +0,0 @@ -import pandas as pd -from datasets import load_dataset, Dataset -from sklearn.feature_extraction.text import TfidfVectorizer -from sklearn.linear_model import LogisticRegression -from sklearn.metrics import classification_report -from sklearn.model_selection import train_test_split - -from hugging_face.url_relevance.constants import TRAINING_URLS_DATASET - - -def main(): - dataset: Dataset = load_dataset(TRAINING_URLS_DATASET)['train'] - - df: pd.DataFrame = dataset.to_pandas() - - # Remove all URLS that are None - dataset_dict = df.dropna(subset=['url']).to_dict() - - urls = list(dataset_dict["url"].values()) - relevant_labels = list(dataset_dict["relevant"].values()) - - X_train, X_test, y_train, y_test = train_test_split(urls, relevant_labels, test_size=0.2, random_state=42) - - vectorizer = TfidfVectorizer( - analyzer='char', # Analyze at the character level for URLs - ngram_range=(3, 6), # Use character-level n-grams (e.g., trigrams, hexagrams) - ) - X_train_tfidf = vectorizer.fit_transform(X_train) - X_test_tfidf = vectorizer.transform(X_test) - - # Train Logistic Regression - model = LogisticRegression() - model.fit(X_train_tfidf, y_train) - - # Evaluate the model - y_pred = model.predict(X_test_tfidf) - print(classification_report(y_test, y_pred)) - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/hugging_face/url_relevance/models/urls_with_html_data/__init__.py b/hugging_face/url_relevance/models/urls_with_html_data/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/hugging_face/url_relevance/util.py b/hugging_face/url_relevance/util.py deleted file mode 100644 index 8fc2a5cb..00000000 --- a/hugging_face/url_relevance/util.py +++ /dev/null @@ -1,26 +0,0 @@ -import pandas as pd -from datasets import load_dataset, concatenate_datasets - -from hugging_face.url_relevance.constants import URL_RELEVANCE_DATASET -from hugging_face.url_relevance.dataclasses.TrainTestDataframes import TrainTestDataframes - - -def set_up_dataset( - dataset_name: str = URL_RELEVANCE_DATASET, - test_split_size: float = 0.15 -) -> TrainTestDataframes: - dataset = load_dataset(dataset_name) - dataset_concat = concatenate_datasets([dataset["train"], dataset["test"]]) - dataset_shuffle = dataset_concat.shuffle() - dataset_split = dataset_shuffle.train_test_split(test_size=test_split_size) - return TrainTestDataframes( - train=pd.DataFrame(dataset_split["train"]), - test=pd.DataFrame(dataset_split["test"]) - ) - -def apply_label(ttd: TrainTestDataframes, label_col: str, labels: list[str]): - def str2int(label: str) -> int: - return labels.index(label) - - for df in ttd.get_as_list(): - df[label_col] = df[label_col].apply(str2int) \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 8a2b1187..163c4501 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,13 +17,9 @@ dependencies = [ "from-root~=1.3.0", "google-api-python-client>=2.156.0", "httpx~=0.28.1", - "huggingface-hub~=0.28.1", - "keras~=2.15.0", "lxml~=5.1.0", "marshmallow~=3.23.2", - "numpy~=1.26.4", "openai~=1.60.1", - "pandas~=2.2.3", "pdap-access-manager==0.3.5", "playwright~=1.49.1", "psycopg2-binary~=2.9.6", @@ -34,10 +30,7 @@ dependencies = [ "requests~=2.32.3", "sqlalchemy~=2.0.36", "starlette~=0.45.3", - "tensorflow-cpu~=2.15.1", - "tensorflow-io-gcs-filesystem==0.31.0", "tqdm>=4.64.1", - "transformers~=4.40.2", "urllib3~=1.26.18", "uvicorn~=0.34.0", ] diff --git a/tests/manual/huggingface/__init__.py b/tests/manual/huggingface/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/manual/huggingface/test_hugging_face_interface.py b/tests/manual/huggingface/test_hugging_face_interface.py deleted file mode 100644 index 08ce8ccd..00000000 --- a/tests/manual/huggingface/test_hugging_face_interface.py +++ /dev/null @@ -1,19 +0,0 @@ -import pytest - -from collector_db.DTOs.URLWithHTML import URLWithHTML -from hugging_face.HuggingFaceInterface import HuggingFaceInterface - -@pytest.mark.asyncio -async def test_get_url_relevancy(): - hfi = HuggingFaceInterface() - def package_url(url: str) -> URLWithHTML: - return URLWithHTML(url=url, url_id=1, html_infos=[]) - - result = await hfi.get_url_relevancy_async([ - package_url("https://coloradosprings.gov/police-department/article/news/i-25-traffic-safety-deployment-after-stop"), - package_url("https://example.com"), - package_url("https://police.com") - ]) - print(result) - - diff --git a/tests/manual/huggingface/test_pipelines.py b/tests/manual/huggingface/test_pipelines.py deleted file mode 100644 index 84f68099..00000000 --- a/tests/manual/huggingface/test_pipelines.py +++ /dev/null @@ -1,8 +0,0 @@ -from transformers import pipeline - -def test_relevancy_pipeline(): - pipe = pipeline("text-classification", model="PDAP/url-relevance") - urls = ["example.com", "police.com", "https://coloradosprings.gov/police-department/article/news/i-25-traffic-safety-deployment-after-stop"] - results = pipe(urls) - for result, url in zip(results, urls): - print(f"{url}: {result}") diff --git a/tests/manual/unsorted/test_common_crawler_integration.py b/tests/manual/unsorted/test_common_crawler_integration.py index 8772de66..4b79893a 100644 --- a/tests/manual/unsorted/test_common_crawler_integration.py +++ b/tests/manual/unsorted/test_common_crawler_integration.py @@ -106,131 +106,6 @@ def validate_csv_reset_cache(local_file_path, repo_file_path): -@patch('util.huggingface_api_manager.HuggingFaceAPIManager.upload_file') -def test_main_with_valid_args(mock_upload_file, mocker, temp_dir): - """ - Test the main function with valid arguments - """ - - # Replace the huggingface_api_manager upload_file function with one that - # performs the validate_csvs function - mock_upload_file.side_effect = validate_csv_reset_cache - - # Main uses datetime.now(): patch this to provide a single datetime - mock_now = str(datetime.datetime(2022, 12, 12, 12, 0, 0)) - mocker.patch("common_crawler.main.get_current_time", return_value=mock_now) - - mock_parse_args = mocker.patch('common_crawler.main.parse_args') - mock_args = mock_parse_args.return_value - mock_args.common_crawl_id = 'CC-MAIN-9999-99' - mock_args.url = '*.com' - mock_args.keyword = 'keyword' - mock_args.pages = 2 - mock_args.output_filename = 'test_output' - mock_args.cache_filename = 'test_cache' - mock_args.data_dir = temp_dir - mock_args.reset_cache = True - - # Mock the CommonCrawler to avoid actual web requests - common_crawler_results = [ - # This result, containing the search keyword should be returned in the final output - [{ - 'url': 'http://keyword.com' - }], - # This result, because it does not contain the keyword, should not - [{ - 'url': 'http://not-in-results.com' - }] - ] - mock_search_cc_index = mocker.patch('common_crawler.crawler.CommonCrawlerManager.search_common_crawl_index') - mock_search_cc_index.side_effect = common_crawler_results - - # Common crawler sleeps for five seconds during execution -- this avoids that. - mock_sleep = mocker.patch('time.sleep') - mock_sleep.side_effect = lambda _: None - - # Call main with test arguments - main() - - - # Check that the cache file was created, and contains the expected data - with open(f'{temp_dir}/test_cache.json', 'r') as file: - cache = json.load(file) - assert 'CC-MAIN-9999-99' in cache - assert '*.com' in cache['CC-MAIN-9999-99'] - assert 'keyword' in cache['CC-MAIN-9999-99']['*.com'] - assert cache['CC-MAIN-9999-99']['*.com']['keyword'] == 2 - - # Check that batch file exists - batch_csv_data = CSVData( - f"{temp_dir}/batch_info.csv" - ) - # Check headers - assert batch_csv_data.headers == BATCH_HEADERS - # Check first row - row_dict = batch_csv_data.rows[0] - assert row_dict['Count'] == '1' - assert row_dict['Datetime'] == '2022-12-12 12:00:00' - assert row_dict['Keywords'] == '*.com - keyword' - assert batch_csv_data.rows[0]['Source'] == 'Common Crawl' - assert batch_csv_data.rows[0]['Notes'] == 'CC-MAIN-9999-99, 2 pages, starting at 1' - - # Run main again with different arguments and no reset_cache enabled, to test persistence of cache and output files - mock_upload_file.side_effect = validate_csvs - mock_args.reset_cache = False - mock_args.common_crawl_id = 'CC-MAIN-0000-00' - mock_args.url = '*.gov' - mock_args.keyword = 'police' - mock_args.pages = 3 - # output_filename, cache_filename, and data_dir are unchanged - common_crawler_results_2 = [ - # This result, containing the search keyword should be returned in the final output - [{ - 'url': 'http://police.com' - }], - # This result, because it does not contain the keyword, should not - [{ - 'url': 'http://military.com' - }], - # This result, because it does contain the keyword, should be returned in the final output - [{ - 'url': 'http://police.com/page2' - }] - ] - mock_search_cc_index.side_effect = common_crawler_results_2 - - - # Call main with test arguments - main() - - # Check that the cache file was created, and contains the expected data - with open(f'{temp_dir}/test_cache.json', 'r') as file: - cache = json.load(file) - # Check the original data persists - assert 'CC-MAIN-9999-99' in cache - assert '*.com' in cache['CC-MAIN-9999-99'] - assert 'keyword' in cache['CC-MAIN-9999-99']['*.com'] - assert cache['CC-MAIN-9999-99']['*.com']['keyword'] == 2 - # Check the new data exists as well - assert 'CC-MAIN-0000-00' in cache - assert '*.gov' in cache['CC-MAIN-0000-00'] - assert 'police' in cache['CC-MAIN-0000-00']['*.gov'] - assert cache['CC-MAIN-0000-00']['*.gov']['police'] == 3 - - # Check that batch file exists - batch_csv_data = CSVData( - f"{temp_dir}/batch_info.csv" - ) - # Check headers - assert batch_csv_data.headers == BATCH_HEADERS - # Check second row - row_dict = batch_csv_data.rows[1] - assert row_dict['Count'] == '2' - assert row_dict['Datetime'] == '2022-12-12 12:00:00' - assert row_dict['Keywords'] == '*.gov - police' - assert row_dict['Source'] == 'Common Crawl' - assert row_dict['Notes'] == 'CC-MAIN-0000-00, 3 pages, starting at 1' - @pytest.fixture def temp_dir(): dirpath = tempfile.mkdtemp() diff --git a/tests/manual/unsorted/test_util_unit.py b/tests/manual/unsorted/test_util_unit.py deleted file mode 100644 index feb7f83a..00000000 --- a/tests/manual/unsorted/test_util_unit.py +++ /dev/null @@ -1,25 +0,0 @@ -from unittest.mock import patch - -import huggingface_hub -import pytest - -from util.huggingface_api_manager import HuggingFaceAPIManager - - -def test_init_success(): - with patch.object(huggingface_hub, 'login') as login_mock, \ - patch.object(huggingface_hub, 'HfApi') as api_mock: - manager = HuggingFaceAPIManager('testing-access-token', 'repo') - login_mock.assert_called_once_with(token='testing-access-token') - api_mock.assert_called_once_with() - assert manager.repo_id == 'repo' - - -def test_init_empty_access_token(): - with pytest.raises(ValueError, match="Access token cannot be empty."): - HuggingFaceAPIManager('', 'repo') - - -def test_init_no_access_token(): - with pytest.raises(ValueError, match="Access token cannot be empty."): - HuggingFaceAPIManager(None, 'repo') \ No newline at end of file diff --git a/tests/test_automated/integration/api/conftest.py b/tests/test_automated/integration/api/conftest.py index 73f0c8ab..2e7d8632 100644 --- a/tests/test_automated/integration/api/conftest.py +++ b/tests/test_automated/integration/api/conftest.py @@ -24,7 +24,6 @@ class APITestHelper: core: SourceCollectorCore async_core: AsyncCore db_data_creator: DBDataCreator - mock_huggingface_interface: MagicMock def adb_client(self): return self.db_data_creator.adb_client @@ -72,7 +71,6 @@ def client() -> Generator[TestClient, None, None]: # Interfaces to the web should be mocked task_manager = async_core.task_manager - task_manager.huggingface_interface = AsyncMock() task_manager.url_request_interface = AsyncMock() task_manager.discord_poster = AsyncMock() # Disable Logger @@ -91,6 +89,5 @@ async def api_test_helper(client: TestClient, db_data_creator, monkeypatch) -> A core=client.app.state.core, async_core=client.app.state.async_core, db_data_creator=db_data_creator, - mock_huggingface_interface=MagicMock(), ) await client.app.state.async_core.collector_manager.logger.clear_log_queue() diff --git a/tests/test_automated/integration/core/test_async_core.py b/tests/test_automated/integration/core/test_async_core.py index f2125865..e43b519f 100644 --- a/tests/test_automated/integration/core/test_async_core.py +++ b/tests/test_automated/integration/core/test_async_core.py @@ -17,7 +17,6 @@ def setup_async_core(adb_client: AsyncDatabaseClient): adb_client=adb_client, task_manager=TaskManager( adb_client=adb_client, - huggingface_interface=AsyncMock(), url_request_interface=AsyncMock(), html_parser=AsyncMock(), discord_poster=AsyncMock(), diff --git a/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py b/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py deleted file mode 100644 index 95fb5fc7..00000000 --- a/tests/test_automated/integration/tasks/test_url_relevancy_huggingface_task.py +++ /dev/null @@ -1,61 +0,0 @@ -from unittest.mock import MagicMock - -import pytest - -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.URLWithHTML import URLWithHTML -from collector_db.models import AutoRelevantSuggestion -from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome -from core.classes.task_operators.URLRelevanceHuggingfaceTaskOperator import URLRelevanceHuggingfaceTaskOperator -from tests.helpers.assert_functions import assert_database_has_no_tasks -from hugging_face.HuggingFaceInterface import HuggingFaceInterface - - -@pytest.mark.asyncio -async def test_url_relevancy_huggingface_task(db_data_creator): - - - def num_to_bool(num: int) -> bool: - if num == 0: - return True - else: - return False - - async def mock_get_url_relevancy( - urls_with_html: list[URLWithHTML], - threshold: float = 0.8 - ) -> list[bool]: - results = [] - for url_with_html in urls_with_html: - num = url_with_html.url_id % 2 - results.append(num_to_bool(num)) - - return results - - mock_hf_interface = MagicMock(spec=HuggingFaceInterface) - mock_hf_interface.get_url_relevancy_async = mock_get_url_relevancy - - task_operator = URLRelevanceHuggingfaceTaskOperator( - adb_client=AsyncDatabaseClient(), - huggingface_interface=mock_hf_interface - ) - meets_task_prerequisites = await task_operator.meets_task_prerequisites() - assert not meets_task_prerequisites - - await assert_database_has_no_tasks(db_data_creator.adb_client) - - batch_id = db_data_creator.batch() - url_mappings = db_data_creator.urls(batch_id=batch_id, url_count=3).url_mappings - url_ids = [url_info.url_id for url_info in url_mappings] - await db_data_creator.html_data(url_ids) - - run_info: TaskOperatorRunInfo = await task_operator.run_task(1) - assert run_info.outcome == TaskOperatorOutcome.SUCCESS, run_info.message - - - results = await db_data_creator.adb_client.get_all(AutoRelevantSuggestion) - - assert len(results) == 3 - for result in results: - assert result.url_id in url_ids - assert result.relevant == num_to_bool(result.url_id % 2) diff --git a/util/huggingface_api_manager.py b/util/huggingface_api_manager.py deleted file mode 100644 index 7f36fe67..00000000 --- a/util/huggingface_api_manager.py +++ /dev/null @@ -1,45 +0,0 @@ -from pathlib import Path - -import huggingface_hub - - -class HuggingFaceAPIManager: - """ - A class to manage the HuggingFace API. - """ - def __init__( - self, - access_token: str, - repo_id: str - ): - """ - Initializes the HuggingFace API manager. - Args: - access_token: the HuggingFace access token - repo_id: the repository ID - """ - if access_token is None or len(access_token) == 0: - raise ValueError("Access token cannot be empty.") - - huggingface_hub.login( - token=access_token - ) - self.api = huggingface_hub.HfApi() - self.repo_id = repo_id - - def upload_file(self, local_file_path: Path, repo_file_path: str): - """ - Uploads a file to the HuggingFace dataset repository. - Args: - local_file_path: the local file path - repo_file_path: the file path in the repository - - Returns: None - - """ - self.api.upload_file( - path_or_fileobj=local_file_path, - path_in_repo=repo_file_path, - repo_id=self.repo_id, - repo_type="dataset" - ) diff --git a/uv.lock b/uv.lock index 773fee9e..9b2d48fd 100644 --- a/uv.lock +++ b/uv.lock @@ -7,15 +7,6 @@ resolution-markers = [ "python_full_version < '3.12'", ] -[[package]] -name = "absl-py" -version = "2.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/f0/e6342091061ed3a46aadc116b13edd7bb5249c3ab1b3ef07f24b0c248fc3/absl_py-2.2.2.tar.gz", hash = "sha256:bf25b2c2eed013ca456918c453d687eab4e8309fba81ee2f4c1a6aa2494175eb", size = 119982, upload_time = "2025-04-03T12:41:04.55Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/d4/349f7f4bd5ea92dab34f5bb0fe31775ef6c311427a14d5a5b31ecb442341/absl_py-2.2.2-py3-none-any.whl", hash = "sha256:e5797bc6abe45f64fd95dc06394ca3f2bedf3b5d895e9da691c9ee3397d70092", size = 135565, upload_time = "2025-04-03T12:41:03.172Z" }, -] - [[package]] name = "aiohappyeyeballs" version = "2.6.1" @@ -151,19 +142,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d0/ae/9a053dd9229c0fde6b1f1f33f609ccff1ee79ddda364c756a924c6d8563b/APScheduler-3.11.0-py3-none-any.whl", hash = "sha256:fc134ca32e50f5eadcc4938e3a4545ab19131435e851abb40b34d63d5141c6da", size = 64004, upload_time = "2024-11-24T19:39:24.442Z" }, ] -[[package]] -name = "astunparse" -version = "1.6.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, - { name = "wheel" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f3/af/4182184d3c338792894f34a62672919db7ca008c89abee9b564dd34d8029/astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872", size = 18290, upload_time = "2019-12-22T18:12:13.129Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/03/13dde6512ad7b4557eb792fbcf0c653af6076b81e5941d36ec61f7ce6028/astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8", size = 12732, upload_time = "2019-12-22T18:12:11.297Z" }, -] - [[package]] name = "asyncpg" version = "0.30.0" @@ -362,13 +340,9 @@ dependencies = [ { name = "from-root" }, { name = "google-api-python-client" }, { name = "httpx" }, - { name = "huggingface-hub" }, - { name = "keras" }, { name = "lxml" }, { name = "marshmallow" }, - { name = "numpy" }, { name = "openai" }, - { name = "pandas" }, { name = "pdap-access-manager" }, { name = "playwright" }, { name = "psycopg", extra = ["binary"] }, @@ -379,10 +353,7 @@ dependencies = [ { name = "requests" }, { name = "sqlalchemy" }, { name = "starlette" }, - { name = "tensorflow-cpu" }, - { name = "tensorflow-io-gcs-filesystem" }, { name = "tqdm" }, - { name = "transformers" }, { name = "urllib3" }, { name = "uvicorn" }, ] @@ -414,13 +385,9 @@ requires-dist = [ { name = "from-root", specifier = "~=1.3.0" }, { name = "google-api-python-client", specifier = ">=2.156.0" }, { name = "httpx", specifier = "~=0.28.1" }, - { name = "huggingface-hub", specifier = "~=0.28.1" }, - { name = "keras", specifier = "~=2.15.0" }, { name = "lxml", specifier = "~=5.1.0" }, { name = "marshmallow", specifier = "~=3.23.2" }, - { name = "numpy", specifier = "~=1.26.4" }, { name = "openai", specifier = "~=1.60.1" }, - { name = "pandas", specifier = "~=2.2.3" }, { name = "pdap-access-manager", specifier = "==0.3.5" }, { name = "playwright", specifier = "~=1.49.1" }, { name = "psycopg", extras = ["binary"], specifier = "~=3.1.20" }, @@ -431,10 +398,7 @@ requires-dist = [ { name = "requests", specifier = "~=2.32.3" }, { name = "sqlalchemy", specifier = "~=2.0.36" }, { name = "starlette", specifier = "~=0.45.3" }, - { name = "tensorflow-cpu", specifier = "~=2.15.1" }, - { name = "tensorflow-io-gcs-filesystem", specifier = "==0.31.0" }, { name = "tqdm", specifier = ">=4.64.1" }, - { name = "transformers", specifier = "~=4.40.2" }, { name = "urllib3", specifier = "~=1.26.18" }, { name = "uvicorn", specifier = "~=0.34.0" }, ] @@ -613,15 +577,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload_time = "2025-03-14T07:11:39.145Z" }, ] -[[package]] -name = "flatbuffers" -version = "25.2.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/30/eb5dce7994fc71a2f685d98ec33cc660c0a5887db5610137e60d8cbc4489/flatbuffers-25.2.10.tar.gz", hash = "sha256:97e451377a41262f8d9bd4295cc836133415cc03d8cb966410a4af92eb00d26e", size = 22170, upload_time = "2025-02-11T04:26:46.257Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/25/155f9f080d5e4bc0082edfda032ea2bc2b8fab3f4d25d46c1e9dd22a1a89/flatbuffers-25.2.10-py2.py3-none-any.whl", hash = "sha256:ebba5f4d5ea615af3f7fd70fc310636fbb2bbd1f566ac0a23d98dd412de50051", size = 30953, upload_time = "2025-02-11T04:26:44.484Z" }, -] - [[package]] name = "from-root" version = "1.3.0" @@ -722,15 +677,6 @@ http = [ { name = "aiohttp" }, ] -[[package]] -name = "gast" -version = "0.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3c/14/c566f5ca00c115db7725263408ff952b8ae6d6a4e792ef9c84e77d9af7a1/gast-0.6.0.tar.gz", hash = "sha256:88fc5300d32c7ac6ca7b515310862f71e6fdf2c029bbec7c66c0f5dd47b6b1fb", size = 27708, upload_time = "2024-06-27T20:31:49.527Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/61/8001b38461d751cd1a0c3a6ae84346796a5758123f3ed97a1b121dfbf4f3/gast-0.6.0-py3-none-any.whl", hash = "sha256:52b182313f7330389f72b069ba00f174cfe2a06411099547288839c6cbafbd54", size = 21173, upload_time = "2024-07-09T13:15:15.615Z" }, -] - [[package]] name = "google-api-core" version = "2.24.2" @@ -790,31 +736,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/8a/fe34d2f3f9470a27b01c9e76226965863f153d5fbe276f83608562e49c04/google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d", size = 9253, upload_time = "2023-12-12T17:40:13.055Z" }, ] -[[package]] -name = "google-auth-oauthlib" -version = "1.2.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "google-auth" }, - { name = "requests-oauthlib" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fb/87/e10bf24f7bcffc1421b84d6f9c3377c30ec305d082cd737ddaa6d8f77f7c/google_auth_oauthlib-1.2.2.tar.gz", hash = "sha256:11046fb8d3348b296302dd939ace8af0a724042e8029c1b872d87fabc9f41684", size = 20955, upload_time = "2025-04-22T16:40:29.172Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ac/84/40ee070be95771acd2f4418981edb834979424565c3eec3cd88b6aa09d24/google_auth_oauthlib-1.2.2-py3-none-any.whl", hash = "sha256:fd619506f4b3908b5df17b65f39ca8d66ea56986e5472eb5978fd8f3786f00a2", size = 19072, upload_time = "2025-04-22T16:40:28.174Z" }, -] - -[[package]] -name = "google-pasta" -version = "0.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/35/4a/0bd53b36ff0323d10d5f24ebd67af2de10a1117f5cf4d7add90df92756f1/google-pasta-0.2.0.tar.gz", hash = "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e", size = 40430, upload_time = "2020-03-13T18:57:50.34Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl", hash = "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed", size = 57471, upload_time = "2020-03-13T18:57:48.872Z" }, -] - [[package]] name = "googleapis-common-protos" version = "1.70.0" @@ -869,44 +790,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ac/38/08cc303ddddc4b3d7c628c3039a61a3aae36c241ed01393d00c2fd663473/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", size = 1142112, upload_time = "2024-09-20T17:09:28.753Z" }, ] -[[package]] -name = "grpcio" -version = "1.71.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/95/aa11fc09a85d91fbc7dd405dcb2a1e0256989d67bf89fa65ae24b3ba105a/grpcio-1.71.0.tar.gz", hash = "sha256:2b85f7820475ad3edec209d3d89a7909ada16caab05d3f2e08a7e8ae3200a55c", size = 12549828, upload_time = "2025-03-10T19:28:49.203Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/63/04/a085f3ad4133426f6da8c1becf0749872a49feb625a407a2e864ded3fb12/grpcio-1.71.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:d6aa986318c36508dc1d5001a3ff169a15b99b9f96ef5e98e13522c506b37eef", size = 5210453, upload_time = "2025-03-10T19:24:33.342Z" }, - { url = "https://files.pythonhosted.org/packages/b4/d5/0bc53ed33ba458de95020970e2c22aa8027b26cc84f98bea7fcad5d695d1/grpcio-1.71.0-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:d2c170247315f2d7e5798a22358e982ad6eeb68fa20cf7a820bb74c11f0736e7", size = 11347567, upload_time = "2025-03-10T19:24:35.215Z" }, - { url = "https://files.pythonhosted.org/packages/e3/6d/ce334f7e7a58572335ccd61154d808fe681a4c5e951f8a1ff68f5a6e47ce/grpcio-1.71.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:e6f83a583ed0a5b08c5bc7a3fe860bb3c2eac1f03f1f63e0bc2091325605d2b7", size = 5696067, upload_time = "2025-03-10T19:24:37.988Z" }, - { url = "https://files.pythonhosted.org/packages/05/4a/80befd0b8b1dc2b9ac5337e57473354d81be938f87132e147c4a24a581bd/grpcio-1.71.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4be74ddeeb92cc87190e0e376dbc8fc7736dbb6d3d454f2fa1f5be1dee26b9d7", size = 6348377, upload_time = "2025-03-10T19:24:40.361Z" }, - { url = "https://files.pythonhosted.org/packages/c7/67/cbd63c485051eb78663355d9efd1b896cfb50d4a220581ec2cb9a15cd750/grpcio-1.71.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd0dfbe4d5eb1fcfec9490ca13f82b089a309dc3678e2edabc144051270a66e", size = 5940407, upload_time = "2025-03-10T19:24:42.685Z" }, - { url = "https://files.pythonhosted.org/packages/98/4b/7a11aa4326d7faa499f764eaf8a9b5a0eb054ce0988ee7ca34897c2b02ae/grpcio-1.71.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a2242d6950dc892afdf9e951ed7ff89473aaf744b7d5727ad56bdaace363722b", size = 6030915, upload_time = "2025-03-10T19:24:44.463Z" }, - { url = "https://files.pythonhosted.org/packages/eb/a2/cdae2d0e458b475213a011078b0090f7a1d87f9a68c678b76f6af7c6ac8c/grpcio-1.71.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0fa05ee31a20456b13ae49ad2e5d585265f71dd19fbd9ef983c28f926d45d0a7", size = 6648324, upload_time = "2025-03-10T19:24:46.287Z" }, - { url = "https://files.pythonhosted.org/packages/27/df/f345c8daaa8d8574ce9869f9b36ca220c8845923eb3087e8f317eabfc2a8/grpcio-1.71.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3d081e859fb1ebe176de33fc3adb26c7d46b8812f906042705346b314bde32c3", size = 6197839, upload_time = "2025-03-10T19:24:48.565Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2c/cd488dc52a1d0ae1bad88b0d203bc302efbb88b82691039a6d85241c5781/grpcio-1.71.0-cp311-cp311-win32.whl", hash = "sha256:d6de81c9c00c8a23047136b11794b3584cdc1460ed7cbc10eada50614baa1444", size = 3619978, upload_time = "2025-03-10T19:24:50.518Z" }, - { url = "https://files.pythonhosted.org/packages/ee/3f/cf92e7e62ccb8dbdf977499547dfc27133124d6467d3a7d23775bcecb0f9/grpcio-1.71.0-cp311-cp311-win_amd64.whl", hash = "sha256:24e867651fc67717b6f896d5f0cac0ec863a8b5fb7d6441c2ab428f52c651c6b", size = 4282279, upload_time = "2025-03-10T19:24:52.313Z" }, - { url = "https://files.pythonhosted.org/packages/4c/83/bd4b6a9ba07825bd19c711d8b25874cd5de72c2a3fbf635c3c344ae65bd2/grpcio-1.71.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:0ff35c8d807c1c7531d3002be03221ff9ae15712b53ab46e2a0b4bb271f38537", size = 5184101, upload_time = "2025-03-10T19:24:54.11Z" }, - { url = "https://files.pythonhosted.org/packages/31/ea/2e0d90c0853568bf714693447f5c73272ea95ee8dad107807fde740e595d/grpcio-1.71.0-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:b78a99cd1ece4be92ab7c07765a0b038194ded2e0a26fd654591ee136088d8d7", size = 11310927, upload_time = "2025-03-10T19:24:56.1Z" }, - { url = "https://files.pythonhosted.org/packages/ac/bc/07a3fd8af80467390af491d7dc66882db43884128cdb3cc8524915e0023c/grpcio-1.71.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:dc1a1231ed23caac1de9f943d031f1bc38d0f69d2a3b243ea0d664fc1fbd7fec", size = 5654280, upload_time = "2025-03-10T19:24:58.55Z" }, - { url = "https://files.pythonhosted.org/packages/16/af/21f22ea3eed3d0538b6ef7889fce1878a8ba4164497f9e07385733391e2b/grpcio-1.71.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6beeea5566092c5e3c4896c6d1d307fb46b1d4bdf3e70c8340b190a69198594", size = 6312051, upload_time = "2025-03-10T19:25:00.682Z" }, - { url = "https://files.pythonhosted.org/packages/49/9d/e12ddc726dc8bd1aa6cba67c85ce42a12ba5b9dd75d5042214a59ccf28ce/grpcio-1.71.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5170929109450a2c031cfe87d6716f2fae39695ad5335d9106ae88cc32dc84c", size = 5910666, upload_time = "2025-03-10T19:25:03.01Z" }, - { url = "https://files.pythonhosted.org/packages/d9/e9/38713d6d67aedef738b815763c25f092e0454dc58e77b1d2a51c9d5b3325/grpcio-1.71.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5b08d03ace7aca7b2fadd4baf291139b4a5f058805a8327bfe9aece7253b6d67", size = 6012019, upload_time = "2025-03-10T19:25:05.174Z" }, - { url = "https://files.pythonhosted.org/packages/80/da/4813cd7adbae6467724fa46c952d7aeac5e82e550b1c62ed2aeb78d444ae/grpcio-1.71.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f903017db76bf9cc2b2d8bdd37bf04b505bbccad6be8a81e1542206875d0e9db", size = 6637043, upload_time = "2025-03-10T19:25:06.987Z" }, - { url = "https://files.pythonhosted.org/packages/52/ca/c0d767082e39dccb7985c73ab4cf1d23ce8613387149e9978c70c3bf3b07/grpcio-1.71.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:469f42a0b410883185eab4689060a20488a1a0a00f8bbb3cbc1061197b4c5a79", size = 6186143, upload_time = "2025-03-10T19:25:08.877Z" }, - { url = "https://files.pythonhosted.org/packages/00/61/7b2c8ec13303f8fe36832c13d91ad4d4ba57204b1c723ada709c346b2271/grpcio-1.71.0-cp312-cp312-win32.whl", hash = "sha256:ad9f30838550695b5eb302add33f21f7301b882937460dd24f24b3cc5a95067a", size = 3604083, upload_time = "2025-03-10T19:25:10.736Z" }, - { url = "https://files.pythonhosted.org/packages/fd/7c/1e429c5fb26122055d10ff9a1d754790fb067d83c633ff69eddcf8e3614b/grpcio-1.71.0-cp312-cp312-win_amd64.whl", hash = "sha256:652350609332de6dac4ece254e5d7e1ff834e203d6afb769601f286886f6f3a8", size = 4272191, upload_time = "2025-03-10T19:25:13.12Z" }, - { url = "https://files.pythonhosted.org/packages/04/dd/b00cbb45400d06b26126dcfdbdb34bb6c4f28c3ebbd7aea8228679103ef6/grpcio-1.71.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:cebc1b34ba40a312ab480ccdb396ff3c529377a2fce72c45a741f7215bfe8379", size = 5184138, upload_time = "2025-03-10T19:25:15.101Z" }, - { url = "https://files.pythonhosted.org/packages/ed/0a/4651215983d590ef53aac40ba0e29dda941a02b097892c44fa3357e706e5/grpcio-1.71.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:85da336e3649a3d2171e82f696b5cad2c6231fdd5bad52616476235681bee5b3", size = 11310747, upload_time = "2025-03-10T19:25:17.201Z" }, - { url = "https://files.pythonhosted.org/packages/57/a3/149615b247f321e13f60aa512d3509d4215173bdb982c9098d78484de216/grpcio-1.71.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f9a412f55bb6e8f3bb000e020dbc1e709627dcb3a56f6431fa7076b4c1aab0db", size = 5653991, upload_time = "2025-03-10T19:25:20.39Z" }, - { url = "https://files.pythonhosted.org/packages/ca/56/29432a3e8d951b5e4e520a40cd93bebaa824a14033ea8e65b0ece1da6167/grpcio-1.71.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47be9584729534660416f6d2a3108aaeac1122f6b5bdbf9fd823e11fe6fbaa29", size = 6312781, upload_time = "2025-03-10T19:25:22.823Z" }, - { url = "https://files.pythonhosted.org/packages/a3/f8/286e81a62964ceb6ac10b10925261d4871a762d2a763fbf354115f9afc98/grpcio-1.71.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9c80ac6091c916db81131d50926a93ab162a7e97e4428ffc186b6e80d6dda4", size = 5910479, upload_time = "2025-03-10T19:25:24.828Z" }, - { url = "https://files.pythonhosted.org/packages/35/67/d1febb49ec0f599b9e6d4d0d44c2d4afdbed9c3e80deb7587ec788fcf252/grpcio-1.71.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:789d5e2a3a15419374b7b45cd680b1e83bbc1e52b9086e49308e2c0b5bbae6e3", size = 6013262, upload_time = "2025-03-10T19:25:26.987Z" }, - { url = "https://files.pythonhosted.org/packages/a1/04/f9ceda11755f0104a075ad7163fc0d96e2e3a9fe25ef38adfc74c5790daf/grpcio-1.71.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:1be857615e26a86d7363e8a163fade914595c81fec962b3d514a4b1e8760467b", size = 6643356, upload_time = "2025-03-10T19:25:29.606Z" }, - { url = "https://files.pythonhosted.org/packages/fb/ce/236dbc3dc77cf9a9242adcf1f62538734ad64727fabf39e1346ad4bd5c75/grpcio-1.71.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:a76d39b5fafd79ed604c4be0a869ec3581a172a707e2a8d7a4858cb05a5a7637", size = 6186564, upload_time = "2025-03-10T19:25:31.537Z" }, - { url = "https://files.pythonhosted.org/packages/10/fd/b3348fce9dd4280e221f513dd54024e765b21c348bc475516672da4218e9/grpcio-1.71.0-cp313-cp313-win32.whl", hash = "sha256:74258dce215cb1995083daa17b379a1a5a87d275387b7ffe137f1d5131e2cfbb", size = 3601890, upload_time = "2025-03-10T19:25:33.421Z" }, - { url = "https://files.pythonhosted.org/packages/be/f8/db5d5f3fc7e296166286c2a397836b8b042f7ad1e11028d82b061701f0f7/grpcio-1.71.0-cp313-cp313-win_amd64.whl", hash = "sha256:22c3bc8d488c039a199f7a003a38cb7635db6656fa96437a8accde8322ce2366", size = 4273308, upload_time = "2025-03-10T19:25:35.79Z" }, -] - [[package]] name = "h11" version = "0.16.0" @@ -916,32 +799,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload_time = "2025-04-24T03:35:24.344Z" }, ] -[[package]] -name = "h5py" -version = "3.13.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/03/2e/a22d6a8bfa6f8be33e7febd985680fba531562795f0a9077ed1eb047bfb0/h5py-3.13.0.tar.gz", hash = "sha256:1870e46518720023da85d0895a1960ff2ce398c5671eac3b1a41ec696b7105c3", size = 414876, upload_time = "2025-02-18T16:04:01.824Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/86/2b/50b15fdefb577d073b49699e6ea6a0a77a3a1016c2b67e2149fc50124a10/h5py-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8a8e38ef4ceb969f832cc230c0cf808c613cc47e31e768fd7b1106c55afa1cb8", size = 3422922, upload_time = "2025-02-18T16:02:36.376Z" }, - { url = "https://files.pythonhosted.org/packages/94/59/36d87a559cab9c59b59088d52e86008d27a9602ce3afc9d3b51823014bf3/h5py-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f35640e81b03c02a88b8bf99fb6a9d3023cc52f7c627694db2f379e0028f2868", size = 2921619, upload_time = "2025-02-18T16:02:40.722Z" }, - { url = "https://files.pythonhosted.org/packages/37/ef/6f80b19682c0b0835bbee7b253bec9c16af9004f2fd6427b1dd858100273/h5py-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:337af114616f3656da0c83b68fcf53ecd9ce9989a700b0883a6e7c483c3235d4", size = 4259366, upload_time = "2025-02-18T16:02:44.544Z" }, - { url = "https://files.pythonhosted.org/packages/03/71/c99f662d4832c8835453cf3476f95daa28372023bda4aa1fca9e97c24f09/h5py-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:782ff0ac39f455f21fd1c8ebc007328f65f43d56718a89327eec76677ebf238a", size = 4509058, upload_time = "2025-02-18T16:02:49.035Z" }, - { url = "https://files.pythonhosted.org/packages/56/89/e3ff23e07131ff73a72a349be9639e4de84e163af89c1c218b939459a98a/h5py-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:22ffe2a25770a2d67213a1b94f58006c14dce06933a42d2aaa0318c5868d1508", size = 2966428, upload_time = "2025-02-18T16:02:52.061Z" }, - { url = "https://files.pythonhosted.org/packages/d8/20/438f6366ba4ded80eadb38f8927f5e2cd6d2e087179552f20ae3dbcd5d5b/h5py-3.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:477c58307b6b9a2509c59c57811afb9f598aedede24a67da808262dfa0ee37b4", size = 3384442, upload_time = "2025-02-18T16:02:56.545Z" }, - { url = "https://files.pythonhosted.org/packages/10/13/cc1cb7231399617d9951233eb12fddd396ff5d4f7f057ee5d2b1ca0ee7e7/h5py-3.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:57c4c74f627c616f02b7aec608a8c706fe08cb5b0ba7c08555a4eb1dde20805a", size = 2917567, upload_time = "2025-02-18T16:03:00.079Z" }, - { url = "https://files.pythonhosted.org/packages/9e/d9/aed99e1c858dc698489f916eeb7c07513bc864885d28ab3689d572ba0ea0/h5py-3.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:357e6dc20b101a805ccfd0024731fbaf6e8718c18c09baf3b5e4e9d198d13fca", size = 4669544, upload_time = "2025-02-18T16:03:05.675Z" }, - { url = "https://files.pythonhosted.org/packages/a7/da/3c137006ff5f0433f0fb076b1ebe4a7bf7b5ee1e8811b5486af98b500dd5/h5py-3.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6f13f9b5ce549448c01e4dfe08ea8d1772e6078799af2c1c8d09e941230a90d", size = 4932139, upload_time = "2025-02-18T16:03:10.129Z" }, - { url = "https://files.pythonhosted.org/packages/25/61/d897952629cae131c19d4c41b2521e7dd6382f2d7177c87615c2e6dced1a/h5py-3.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:21daf38171753899b5905f3d82c99b0b1ec2cbbe282a037cad431feb620e62ec", size = 2954179, upload_time = "2025-02-18T16:03:13.716Z" }, - { url = "https://files.pythonhosted.org/packages/60/43/f276f27921919a9144074320ce4ca40882fc67b3cfee81c3f5c7df083e97/h5py-3.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e520ec76de00943dd017c8ea3f354fa1d2f542eac994811943a8faedf2a7d5cb", size = 3358040, upload_time = "2025-02-18T16:03:20.579Z" }, - { url = "https://files.pythonhosted.org/packages/1b/86/ad4a4cf781b08d4572be8bbdd8f108bb97b266a14835c640dc43dafc0729/h5py-3.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e79d8368cd9295045956bfb436656bea3f915beaa11d342e9f79f129f5178763", size = 2892766, upload_time = "2025-02-18T16:03:26.831Z" }, - { url = "https://files.pythonhosted.org/packages/69/84/4c6367d6b58deaf0fa84999ec819e7578eee96cea6cbd613640d0625ed5e/h5py-3.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56dd172d862e850823c4af02dc4ddbc308f042b85472ffdaca67f1598dff4a57", size = 4664255, upload_time = "2025-02-18T16:03:31.903Z" }, - { url = "https://files.pythonhosted.org/packages/fd/41/bc2df86b72965775f6d621e0ee269a5f3ac23e8f870abf519de9c7d93b4d/h5py-3.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be949b46b7388074c5acae017fbbe3e5ba303fd9daaa52157fdfef30bbdacadd", size = 4927580, upload_time = "2025-02-18T16:03:36.429Z" }, - { url = "https://files.pythonhosted.org/packages/97/34/165b87ea55184770a0c1fcdb7e017199974ad2e271451fd045cfe35f3add/h5py-3.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:4f97ecde7ac6513b21cd95efdfc38dc6d19f96f6ca6f2a30550e94e551458e0a", size = 2940890, upload_time = "2025-02-18T16:03:41.037Z" }, -] - [[package]] name = "httpcore" version = "1.0.9" @@ -1106,32 +963,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ee/47/3729f00f35a696e68da15d64eb9283c330e776f3b5789bac7f2c0c4df209/jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf", size = 206867, upload_time = "2025-03-10T21:36:25.843Z" }, ] -[[package]] -name = "keras" -version = "2.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/03/80072f4ee46e3c77e95b06d684fadf90a67759e4e9f1d86a563e0965c71a/keras-2.15.0.tar.gz", hash = "sha256:81871d298c064dc4ac6b58440fdae67bfcf47c8d7ad28580fab401834c06a575", size = 1252015, upload_time = "2023-11-07T00:39:57.716Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/a7/0d4490de967a67f68a538cc9cdb259bff971c4b5787f7765dc7c8f118f71/keras-2.15.0-py3-none-any.whl", hash = "sha256:2dcc6d2e30cf9c951064b63c1f4c404b966c59caf09e01f3549138ec8ee0dd1f", size = 1710438, upload_time = "2023-11-07T00:39:55.57Z" }, -] - -[[package]] -name = "libclang" -version = "18.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6e/5c/ca35e19a4f142adffa27e3d652196b7362fa612243e2b916845d801454fc/libclang-18.1.1.tar.gz", hash = "sha256:a1214966d08d73d971287fc3ead8dfaf82eb07fb197680d8b3859dbbbbf78250", size = 39612, upload_time = "2024-03-17T16:04:37.434Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/49/f5e3e7e1419872b69f6f5e82ba56e33955a74bd537d8a1f5f1eff2f3668a/libclang-18.1.1-1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:0b2e143f0fac830156feb56f9231ff8338c20aecfe72b4ffe96f19e5a1dbb69a", size = 25836045, upload_time = "2024-06-30T17:40:31.646Z" }, - { url = "https://files.pythonhosted.org/packages/e2/e5/fc61bbded91a8830ccce94c5294ecd6e88e496cc85f6704bf350c0634b70/libclang-18.1.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:6f14c3f194704e5d09769108f03185fce7acaf1d1ae4bbb2f30a72c2400cb7c5", size = 26502641, upload_time = "2024-03-18T15:52:26.722Z" }, - { url = "https://files.pythonhosted.org/packages/db/ed/1df62b44db2583375f6a8a5e2ca5432bbdc3edb477942b9b7c848c720055/libclang-18.1.1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:83ce5045d101b669ac38e6da8e58765f12da2d3aafb3b9b98d88b286a60964d8", size = 26420207, upload_time = "2024-03-17T15:00:26.63Z" }, - { url = "https://files.pythonhosted.org/packages/1d/fc/716c1e62e512ef1c160e7984a73a5fc7df45166f2ff3f254e71c58076f7c/libclang-18.1.1-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:c533091d8a3bbf7460a00cb6c1a71da93bffe148f172c7d03b1c31fbf8aa2a0b", size = 24515943, upload_time = "2024-03-17T16:03:45.942Z" }, - { url = "https://files.pythonhosted.org/packages/3c/3d/f0ac1150280d8d20d059608cf2d5ff61b7c3b7f7bcf9c0f425ab92df769a/libclang-18.1.1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:54dda940a4a0491a9d1532bf071ea3ef26e6dbaf03b5000ed94dd7174e8f9592", size = 23784972, upload_time = "2024-03-17T16:12:47.677Z" }, - { url = "https://files.pythonhosted.org/packages/fe/2f/d920822c2b1ce9326a4c78c0c2b4aa3fde610c7ee9f631b600acb5376c26/libclang-18.1.1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:cf4a99b05376513717ab5d82a0db832c56ccea4fd61a69dbb7bccf2dfb207dbe", size = 20259606, upload_time = "2024-03-17T16:17:42.437Z" }, - { url = "https://files.pythonhosted.org/packages/2d/c2/de1db8c6d413597076a4259cea409b83459b2db997c003578affdd32bf66/libclang-18.1.1-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:69f8eb8f65c279e765ffd28aaa7e9e364c776c17618af8bff22a8df58677ff4f", size = 24921494, upload_time = "2024-03-17T16:14:20.132Z" }, - { url = "https://files.pythonhosted.org/packages/0b/2d/3f480b1e1d31eb3d6de5e3ef641954e5c67430d5ac93b7fa7e07589576c7/libclang-18.1.1-py2.py3-none-win_amd64.whl", hash = "sha256:4dd2d3b82fab35e2bf9ca717d7b63ac990a3519c7e312f19fa8e86dcc712f7fb", size = 26415083, upload_time = "2024-03-17T16:42:21.703Z" }, - { url = "https://files.pythonhosted.org/packages/71/cf/e01dc4cc79779cd82d77888a88ae2fa424d93b445ad4f6c02bfc18335b70/libclang-18.1.1-py2.py3-none-win_arm64.whl", hash = "sha256:3f0e1f49f04d3cd198985fea0511576b0aee16f9ff0e0f0cad7f9c57ec3c20e8", size = 22361112, upload_time = "2024-03-17T16:42:59.565Z" }, -] - [[package]] name = "lxml" version = "5.1.1" @@ -1170,15 +1001,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59", size = 78509, upload_time = "2025-04-10T12:50:53.297Z" }, ] -[[package]] -name = "markdown" -version = "3.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/15/222b423b0b88689c266d9eac4e61396fe2cc53464459d6a37618ac863b24/markdown-3.8.tar.gz", hash = "sha256:7df81e63f0df5c4b24b7d156eb81e4690595239b7d70937d0409f1b0de319c6f", size = 360906, upload_time = "2025-04-11T14:42:50.928Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/3f/afe76f8e2246ffbc867440cbcf90525264df0e658f8a5ca1f872b3f6192a/markdown-3.8-py3-none-any.whl", hash = "sha256:794a929b79c5af141ef5ab0f2f642d0f7b1872981250230e72682346f7cc90dc", size = 106210, upload_time = "2025-04-11T14:42:49.178Z" }, -] - [[package]] name = "markdown-it-py" version = "3.0.0" @@ -1260,25 +1082,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload_time = "2022-08-14T12:40:09.779Z" }, ] -[[package]] -name = "ml-dtypes" -version = "0.3.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/39/7d/8d85fcba868758b3a546e6914e727abd8f29ea6918079f816975c9eecd63/ml_dtypes-0.3.2.tar.gz", hash = "sha256:533059bc5f1764fac071ef54598db358c167c51a718f68f5bb55e3dee79d2967", size = 692014, upload_time = "2024-01-03T19:21:23.615Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/a4/6aabb78f1569550fd77c74d2c1d008b502c8ce72776bd88b14ea6c182c9e/ml_dtypes-0.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:763697ab8a88d47443997a7cdf3aac7340049aed45f7521f6b0ec8a0594821fe", size = 389791, upload_time = "2024-01-03T19:21:02.844Z" }, - { url = "https://files.pythonhosted.org/packages/d1/ed/211bf2e1c66e4ec9b712c3be848a876185c7f0d5e94bf647b60e64ef32eb/ml_dtypes-0.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b89b194e9501a92d289c1ffd411380baf5daafb9818109a4f49b0a1b6dce4462", size = 2185796, upload_time = "2024-01-03T19:21:04.291Z" }, - { url = "https://files.pythonhosted.org/packages/77/a0/d4ee9e3aca5b9101c590b58555820618e8201c2ccb7004eabb417ec046ac/ml_dtypes-0.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c34f2ba9660b21fe1034b608308a01be82bbef2a92fb8199f24dc6bad0d5226", size = 2164071, upload_time = "2024-01-03T19:21:05.78Z" }, - { url = "https://files.pythonhosted.org/packages/a4/db/1784b87285588788170f87e987bfb4bda218d62a70a81ebb66c94e7f9b95/ml_dtypes-0.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:6604877d567a29bfe7cc02969ae0f2425260e5335505cf5e7fefc3e5465f5655", size = 127681, upload_time = "2024-01-03T19:21:07.337Z" }, - { url = "https://files.pythonhosted.org/packages/ad/2d/57a8aa1ba7472a93a675bfba3f0c90d9396d01d040617a5345ce87884330/ml_dtypes-0.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:93b78f53431c93953f7850bb1b925a17f0ab5d97527e38a7e865b5b4bc5cfc18", size = 393571, upload_time = "2024-01-03T19:21:08.836Z" }, - { url = "https://files.pythonhosted.org/packages/6a/05/ec30199c791cf0d788a26f56d8efb8ee4133ede79a9680fd8cc05e706404/ml_dtypes-0.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a17ef2322e60858d93584e9c52a5be7dd6236b056b7fa1ec57f1bb6ba043e33", size = 2180925, upload_time = "2024-01-03T19:21:10.87Z" }, - { url = "https://files.pythonhosted.org/packages/e5/f1/93219c44bae4017e6e43391fa4433592de08e05def9d885227d3596f21a5/ml_dtypes-0.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8505946df1665db01332d885c2020b4cb9e84a8b1241eb4ba69d59591f65855", size = 2160573, upload_time = "2024-01-03T19:21:12.775Z" }, - { url = "https://files.pythonhosted.org/packages/47/f3/847da54c3d243ff2aa778078ecf09da199194d282744718ef325dd8afd41/ml_dtypes-0.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:f47619d978ab1ae7dfdc4052ea97c636c6263e1f19bd1be0e42c346b98d15ff4", size = 128649, upload_time = "2024-01-03T19:21:14.312Z" }, -] - [[package]] name = "multidict" version = "6.4.3" @@ -1396,15 +1199,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload_time = "2024-02-05T23:58:36.364Z" }, ] -[[package]] -name = "oauthlib" -version = "3.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6d/fa/fbf4001037904031639e6bfbfc02badfc7e12f137a8afa254df6c4c8a670/oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918", size = 177352, upload_time = "2022-10-17T20:04:27.471Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", size = 151688, upload_time = "2022-10-17T20:04:24.037Z" }, -] - [[package]] name = "openai" version = "1.60.2" @@ -1424,15 +1218,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e5/5a/d5474ca67a547dde9b87b5bc8a8f90eadf29f523d410f2ba23d63c9b82ec/openai-1.60.2-py3-none-any.whl", hash = "sha256:993bd11b96900b9098179c728026f016b4982ded7ee30dfcf4555eab1171fff9", size = 456107, upload_time = "2025-01-27T19:37:01.065Z" }, ] -[[package]] -name = "opt-einsum" -version = "3.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/b9/2ac072041e899a52f20cf9510850ff58295003aa75525e58343591b0cbfb/opt_einsum-3.4.0.tar.gz", hash = "sha256:96ca72f1b886d148241348783498194c577fa30a8faac108586b14f1ba4473ac", size = 63004, upload_time = "2024-09-26T14:33:24.483Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl", hash = "sha256:69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd", size = 71932, upload_time = "2024-09-26T14:33:23.039Z" }, -] - [[package]] name = "orderly-set" version = "5.4.1" @@ -2112,59 +1897,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload_time = "2024-08-06T20:33:04.33Z" }, ] -[[package]] -name = "regex" -version = "2024.11.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494, upload_time = "2024-11-06T20:12:31.635Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/58/58/7e4d9493a66c88a7da6d205768119f51af0f684fe7be7bac8328e217a52c/regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638", size = 482669, upload_time = "2024-11-06T20:09:31.064Z" }, - { url = "https://files.pythonhosted.org/packages/34/4c/8f8e631fcdc2ff978609eaeef1d6994bf2f028b59d9ac67640ed051f1218/regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7", size = 287684, upload_time = "2024-11-06T20:09:32.915Z" }, - { url = "https://files.pythonhosted.org/packages/c5/1b/f0e4d13e6adf866ce9b069e191f303a30ab1277e037037a365c3aad5cc9c/regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20", size = 284589, upload_time = "2024-11-06T20:09:35.504Z" }, - { url = "https://files.pythonhosted.org/packages/25/4d/ab21047f446693887f25510887e6820b93f791992994f6498b0318904d4a/regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114", size = 792121, upload_time = "2024-11-06T20:09:37.701Z" }, - { url = "https://files.pythonhosted.org/packages/45/ee/c867e15cd894985cb32b731d89576c41a4642a57850c162490ea34b78c3b/regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3", size = 831275, upload_time = "2024-11-06T20:09:40.371Z" }, - { url = "https://files.pythonhosted.org/packages/b3/12/b0f480726cf1c60f6536fa5e1c95275a77624f3ac8fdccf79e6727499e28/regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f", size = 818257, upload_time = "2024-11-06T20:09:43.059Z" }, - { url = "https://files.pythonhosted.org/packages/bf/ce/0d0e61429f603bac433910d99ef1a02ce45a8967ffbe3cbee48599e62d88/regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0", size = 792727, upload_time = "2024-11-06T20:09:48.19Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c1/243c83c53d4a419c1556f43777ccb552bccdf79d08fda3980e4e77dd9137/regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55", size = 780667, upload_time = "2024-11-06T20:09:49.828Z" }, - { url = "https://files.pythonhosted.org/packages/c5/f4/75eb0dd4ce4b37f04928987f1d22547ddaf6c4bae697623c1b05da67a8aa/regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89", size = 776963, upload_time = "2024-11-06T20:09:51.819Z" }, - { url = "https://files.pythonhosted.org/packages/16/5d/95c568574e630e141a69ff8a254c2f188b4398e813c40d49228c9bbd9875/regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d", size = 784700, upload_time = "2024-11-06T20:09:53.982Z" }, - { url = "https://files.pythonhosted.org/packages/8e/b5/f8495c7917f15cc6fee1e7f395e324ec3e00ab3c665a7dc9d27562fd5290/regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34", size = 848592, upload_time = "2024-11-06T20:09:56.222Z" }, - { url = "https://files.pythonhosted.org/packages/1c/80/6dd7118e8cb212c3c60b191b932dc57db93fb2e36fb9e0e92f72a5909af9/regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d", size = 852929, upload_time = "2024-11-06T20:09:58.642Z" }, - { url = "https://files.pythonhosted.org/packages/11/9b/5a05d2040297d2d254baf95eeeb6df83554e5e1df03bc1a6687fc4ba1f66/regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45", size = 781213, upload_time = "2024-11-06T20:10:00.867Z" }, - { url = "https://files.pythonhosted.org/packages/26/b7/b14e2440156ab39e0177506c08c18accaf2b8932e39fb092074de733d868/regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9", size = 261734, upload_time = "2024-11-06T20:10:03.361Z" }, - { url = "https://files.pythonhosted.org/packages/80/32/763a6cc01d21fb3819227a1cc3f60fd251c13c37c27a73b8ff4315433a8e/regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60", size = 274052, upload_time = "2024-11-06T20:10:05.179Z" }, - { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781, upload_time = "2024-11-06T20:10:07.07Z" }, - { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455, upload_time = "2024-11-06T20:10:09.117Z" }, - { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759, upload_time = "2024-11-06T20:10:11.155Z" }, - { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976, upload_time = "2024-11-06T20:10:13.24Z" }, - { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077, upload_time = "2024-11-06T20:10:15.37Z" }, - { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160, upload_time = "2024-11-06T20:10:19.027Z" }, - { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896, upload_time = "2024-11-06T20:10:21.85Z" }, - { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997, upload_time = "2024-11-06T20:10:24.329Z" }, - { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725, upload_time = "2024-11-06T20:10:28.067Z" }, - { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481, upload_time = "2024-11-06T20:10:31.612Z" }, - { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896, upload_time = "2024-11-06T20:10:34.054Z" }, - { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138, upload_time = "2024-11-06T20:10:36.142Z" }, - { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692, upload_time = "2024-11-06T20:10:38.394Z" }, - { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135, upload_time = "2024-11-06T20:10:40.367Z" }, - { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567, upload_time = "2024-11-06T20:10:43.467Z" }, - { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525, upload_time = "2024-11-06T20:10:45.19Z" }, - { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324, upload_time = "2024-11-06T20:10:47.177Z" }, - { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617, upload_time = "2024-11-06T20:10:49.312Z" }, - { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023, upload_time = "2024-11-06T20:10:51.102Z" }, - { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072, upload_time = "2024-11-06T20:10:52.926Z" }, - { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130, upload_time = "2024-11-06T20:10:54.828Z" }, - { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857, upload_time = "2024-11-06T20:10:56.634Z" }, - { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006, upload_time = "2024-11-06T20:10:59.369Z" }, - { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650, upload_time = "2024-11-06T20:11:02.042Z" }, - { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545, upload_time = "2024-11-06T20:11:03.933Z" }, - { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045, upload_time = "2024-11-06T20:11:06.497Z" }, - { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182, upload_time = "2024-11-06T20:11:09.06Z" }, - { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733, upload_time = "2024-11-06T20:11:11.256Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122, upload_time = "2024-11-06T20:11:13.161Z" }, - { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545, upload_time = "2024-11-06T20:11:15Z" }, -] - [[package]] name = "requests" version = "2.32.3" @@ -2180,19 +1912,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload_time = "2024-05-29T15:37:47.027Z" }, ] -[[package]] -name = "requests-oauthlib" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "oauthlib" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650, upload_time = "2024-03-22T20:32:29.939Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179, upload_time = "2024-03-22T20:32:28.055Z" }, -] - [[package]] name = "rich" version = "14.0.0" @@ -2232,28 +1951,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload_time = "2025-04-16T09:51:17.142Z" }, ] -[[package]] -name = "safetensors" -version = "0.5.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/71/7e/2d5d6ee7b40c0682315367ec7475693d110f512922d582fef1bd4a63adc3/safetensors-0.5.3.tar.gz", hash = "sha256:b6b0d6ecacec39a4fdd99cc19f4576f5219ce858e6fd8dbe7609df0b8dc56965", size = 67210, upload_time = "2025-02-26T09:15:13.155Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/ae/88f6c49dbd0cc4da0e08610019a3c78a7d390879a919411a410a1876d03a/safetensors-0.5.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd20eb133db8ed15b40110b7c00c6df51655a2998132193de2f75f72d99c7073", size = 436917, upload_time = "2025-02-26T09:15:03.702Z" }, - { url = "https://files.pythonhosted.org/packages/b8/3b/11f1b4a2f5d2ab7da34ecc062b0bc301f2be024d110a6466726bec8c055c/safetensors-0.5.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:21d01c14ff6c415c485616b8b0bf961c46b3b343ca59110d38d744e577f9cce7", size = 418419, upload_time = "2025-02-26T09:15:01.765Z" }, - { url = "https://files.pythonhosted.org/packages/5d/9a/add3e6fef267658075c5a41573c26d42d80c935cdc992384dfae435feaef/safetensors-0.5.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11bce6164887cd491ca75c2326a113ba934be596e22b28b1742ce27b1d076467", size = 459493, upload_time = "2025-02-26T09:14:51.812Z" }, - { url = "https://files.pythonhosted.org/packages/df/5c/bf2cae92222513cc23b3ff85c4a1bb2811a2c3583ac0f8e8d502751de934/safetensors-0.5.3-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4a243be3590bc3301c821da7a18d87224ef35cbd3e5f5727e4e0728b8172411e", size = 472400, upload_time = "2025-02-26T09:14:53.549Z" }, - { url = "https://files.pythonhosted.org/packages/58/11/7456afb740bd45782d0f4c8e8e1bb9e572f1bf82899fb6ace58af47b4282/safetensors-0.5.3-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8bd84b12b1670a6f8e50f01e28156422a2bc07fb16fc4e98bded13039d688a0d", size = 522891, upload_time = "2025-02-26T09:14:55.717Z" }, - { url = "https://files.pythonhosted.org/packages/57/3d/fe73a9d2ace487e7285f6e157afee2383bd1ddb911b7cb44a55cf812eae3/safetensors-0.5.3-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:391ac8cab7c829452175f871fcaf414aa1e292b5448bd02620f675a7f3e7abb9", size = 537694, upload_time = "2025-02-26T09:14:57.036Z" }, - { url = "https://files.pythonhosted.org/packages/a6/f8/dae3421624fcc87a89d42e1898a798bc7ff72c61f38973a65d60df8f124c/safetensors-0.5.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cead1fa41fc54b1e61089fa57452e8834f798cb1dc7a09ba3524f1eb08e0317a", size = 471642, upload_time = "2025-02-26T09:15:00.544Z" }, - { url = "https://files.pythonhosted.org/packages/ce/20/1fbe16f9b815f6c5a672f5b760951e20e17e43f67f231428f871909a37f6/safetensors-0.5.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1077f3e94182d72618357b04b5ced540ceb71c8a813d3319f1aba448e68a770d", size = 502241, upload_time = "2025-02-26T09:14:58.303Z" }, - { url = "https://files.pythonhosted.org/packages/5f/18/8e108846b506487aa4629fe4116b27db65c3dde922de2c8e0cc1133f3f29/safetensors-0.5.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:799021e78287bac619c7b3f3606730a22da4cda27759ddf55d37c8db7511c74b", size = 638001, upload_time = "2025-02-26T09:15:05.79Z" }, - { url = "https://files.pythonhosted.org/packages/82/5a/c116111d8291af6c8c8a8b40628fe833b9db97d8141c2a82359d14d9e078/safetensors-0.5.3-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df26da01aaac504334644e1b7642fa000bfec820e7cef83aeac4e355e03195ff", size = 734013, upload_time = "2025-02-26T09:15:07.892Z" }, - { url = "https://files.pythonhosted.org/packages/7d/ff/41fcc4d3b7de837963622e8610d998710705bbde9a8a17221d85e5d0baad/safetensors-0.5.3-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:32c3ef2d7af8b9f52ff685ed0bc43913cdcde135089ae322ee576de93eae5135", size = 670687, upload_time = "2025-02-26T09:15:09.979Z" }, - { url = "https://files.pythonhosted.org/packages/40/ad/2b113098e69c985a3d8fbda4b902778eae4a35b7d5188859b4a63d30c161/safetensors-0.5.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:37f1521be045e56fc2b54c606d4455573e717b2d887c579ee1dbba5f868ece04", size = 643147, upload_time = "2025-02-26T09:15:11.185Z" }, - { url = "https://files.pythonhosted.org/packages/0a/0c/95aeb51d4246bd9a3242d3d8349c1112b4ee7611a4b40f0c5c93b05f001d/safetensors-0.5.3-cp38-abi3-win32.whl", hash = "sha256:cfc0ec0846dcf6763b0ed3d1846ff36008c6e7290683b61616c4b040f6a54ace", size = 296677, upload_time = "2025-02-26T09:15:16.554Z" }, - { url = "https://files.pythonhosted.org/packages/69/e2/b011c38e5394c4c18fb5500778a55ec43ad6106126e74723ffaee246f56e/safetensors-0.5.3-cp38-abi3-win_amd64.whl", hash = "sha256:836cbbc320b47e80acd40e44c8682db0e8ad7123209f69b093def21ec7cafd11", size = 308878, upload_time = "2025-02-26T09:15:14.99Z" }, -] - [[package]] name = "setuptools" version = "80.4.0" @@ -2396,100 +2093,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl", hash = "sha256:dfb6d332576f136ec740296c7e8bb8c8a7125044e7c6da30744718880cdd059d", size = 71507, upload_time = "2025-01-24T11:17:34.182Z" }, ] -[[package]] -name = "tensorboard" -version = "2.15.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "absl-py" }, - { name = "google-auth" }, - { name = "google-auth-oauthlib" }, - { name = "grpcio" }, - { name = "markdown" }, - { name = "numpy" }, - { name = "protobuf" }, - { name = "requests" }, - { name = "setuptools" }, - { name = "six" }, - { name = "tensorboard-data-server" }, - { name = "werkzeug" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/37/12/f6e9b9dcc310263cbd3948274e286538bd6800fd0c268850788f14a0c6d0/tensorboard-2.15.2-py3-none-any.whl", hash = "sha256:a6f6443728064d962caea6d34653e220e34ef8df764cb06a8212c17e1a8f0622", size = 5539713, upload_time = "2024-02-09T10:39:25.636Z" }, -] - -[[package]] -name = "tensorboard-data-server" -version = "0.7.2" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl", hash = "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb", size = 2356, upload_time = "2023-10-23T21:23:32.16Z" }, - { url = "https://files.pythonhosted.org/packages/b7/85/dabeaf902892922777492e1d253bb7e1264cadce3cea932f7ff599e53fea/tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60", size = 4823598, upload_time = "2023-10-23T21:23:33.714Z" }, - { url = "https://files.pythonhosted.org/packages/73/c6/825dab04195756cf8ff2e12698f22513b3db2f64925bdd41671bfb33aaa5/tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530", size = 6590363, upload_time = "2023-10-23T21:23:35.583Z" }, -] - -[[package]] -name = "tensorflow-cpu" -version = "2.15.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "absl-py" }, - { name = "astunparse" }, - { name = "flatbuffers" }, - { name = "gast" }, - { name = "google-pasta" }, - { name = "grpcio" }, - { name = "h5py" }, - { name = "keras" }, - { name = "libclang" }, - { name = "ml-dtypes" }, - { name = "numpy" }, - { name = "opt-einsum" }, - { name = "packaging" }, - { name = "protobuf" }, - { name = "setuptools" }, - { name = "six" }, - { name = "tensorboard" }, - { name = "tensorflow-estimator" }, - { name = "tensorflow-io-gcs-filesystem" }, - { name = "termcolor" }, - { name = "typing-extensions" }, - { name = "wrapt" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/6c/dc0642ce2656637d8f31ba9c618a41bf14e38428ba77e4e0a9359be39436/tensorflow_cpu-2.15.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:ee3bb114c6031d471d891c761e7eda2c80bea19bb318abcd3d5bab92ccfaf9aa", size = 236482774, upload_time = "2024-03-08T23:52:40.963Z" }, - { url = "https://files.pythonhosted.org/packages/5b/00/af89cb211fc96ffdebb52a687dad7f83b0b1d82bc057f65309fa03a89911/tensorflow_cpu-2.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54660c074d7241a503e81edfd9f5ef5af88f64051b72e2945f26318c790f2d26", size = 207208420, upload_time = "2024-03-08T23:48:30.479Z" }, - { url = "https://files.pythonhosted.org/packages/51/8a/ff2fc9bad8edc68ef4cd63963c10b320de03d3496def83d2a9b1635c6831/tensorflow_cpu-2.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:dc75baf4c08a6e8ab7ceec97f002bb993508a5b58f13fac5283ee976a71a3c67", size = 2133, upload_time = "2024-03-08T23:53:47.249Z" }, -] - -[[package]] -name = "tensorflow-estimator" -version = "2.15.0" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/c8/2f823c8958d5342eafc6dd3e922f0cc4fcf8c2e0460284cc462dae3b60a0/tensorflow_estimator-2.15.0-py2.py3-none-any.whl", hash = "sha256:aedf21eec7fb2dc91150fc91a1ce12bc44dbb72278a08b58e79ff87c9e28f153", size = 441974, upload_time = "2023-11-07T01:10:10.812Z" }, -] - -[[package]] -name = "tensorflow-io-gcs-filesystem" -version = "0.31.0" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/00/900ca310ff2e46eb3127f8f54af0b0000a6cc786be6a54dc2cfe841f4683/tensorflow_io_gcs_filesystem-0.31.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:8909c4344b0e96aa356230ab460ffafe5900c33c1aaced65fafae71d177a1966", size = 1642401, upload_time = "2023-02-25T19:31:40.204Z" }, - { url = "https://files.pythonhosted.org/packages/e7/c4/0d44ef93add3432ce43f37fe0c205cc7b6fd685fca80054fb4a646a9dbe3/tensorflow_io_gcs_filesystem-0.31.0-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e417faf8755aafe52d8f8c6b5ae5bae6e4fae8326ee3acd5e9181b83bbfbae87", size = 2381673, upload_time = "2023-02-25T19:31:41.992Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2b/3064195efa016fff942009fe965ecbbbbd7d70bf34ee22d4ff31a0f3443a/tensorflow_io_gcs_filesystem-0.31.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37c40e3c4ee1f8dda3b545deea6b8839192c82037d8021db9f589908034ad975", size = 2572150, upload_time = "2023-02-25T19:31:43.874Z" }, - { url = "https://files.pythonhosted.org/packages/ac/4e/9566a313927be582ca99455a9523a097c7888fc819695bdc08415432b202/tensorflow_io_gcs_filesystem-0.31.0-cp311-cp311-win_amd64.whl", hash = "sha256:4bb37d23f21c434687b11059cb7ffd094d52a7813368915ba1b7057e3c16e414", size = 1486315, upload_time = "2023-02-25T19:31:45.641Z" }, -] - -[[package]] -name = "termcolor" -version = "3.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/6c/3d75c196ac07ac8749600b60b03f4f6094d54e132c4d94ebac6ee0e0add0/termcolor-3.1.0.tar.gz", hash = "sha256:6a6dd7fbee581909eeec6a756cff1d7f7c376063b14e4a298dc4980309e55970", size = 14324, upload_time = "2025-04-30T11:37:53.791Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/bd/de8d508070629b6d84a30d01d57e4a65c69aa7f5abe7560b8fad3b50ea59/termcolor-3.1.0-py3-none-any.whl", hash = "sha256:591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa", size = 7684, upload_time = "2025-04-30T11:37:52.382Z" }, -] - [[package]] name = "text-unidecode" version = "1.3" @@ -2499,41 +2102,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload_time = "2019-08-30T21:37:03.543Z" }, ] -[[package]] -name = "tokenizers" -version = "0.19.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "huggingface-hub" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/48/04/2071c150f374aab6d5e92aaec38d0f3c368d227dd9e0469a1f0966ac68d1/tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3", size = 321039, upload_time = "2024-04-17T21:40:41.849Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/d6/6e1d728d765eb4102767f071bf7f6439ab10d7f4a975c9217db65715207a/tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059", size = 2533448, upload_time = "2024-04-17T21:36:38.61Z" }, - { url = "https://files.pythonhosted.org/packages/90/79/d17a0f491d10817cd30f1121a07aa09c8e97a81114b116e473baf1577f09/tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14", size = 2440254, upload_time = "2024-04-17T21:36:40.398Z" }, - { url = "https://files.pythonhosted.org/packages/c7/28/2d11c3ff94f9d42eceb2ea549a06e3f166fe391c5a025e5d96fac898a3ac/tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594", size = 3684971, upload_time = "2024-04-17T21:36:43.115Z" }, - { url = "https://files.pythonhosted.org/packages/36/c6/537f22b57e6003904d35d07962dbde2f2e9bdd791d0241da976a4c7f8194/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc", size = 3568894, upload_time = "2024-04-17T21:36:45.011Z" }, - { url = "https://files.pythonhosted.org/packages/af/ef/3c1deed14ec59b2c8e7e2fa27b2a53f7d101181277a43b89ab17d891ef2e/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2", size = 3426873, upload_time = "2024-04-17T21:36:47.001Z" }, - { url = "https://files.pythonhosted.org/packages/06/db/c0320c4798ac6bd12d2ef895bec9d10d216a3b4d6fff10e9d68883ea7edc/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe", size = 3965050, upload_time = "2024-04-17T21:36:49.202Z" }, - { url = "https://files.pythonhosted.org/packages/4c/8a/a166888d6cb14db55f5eb7ce0b1d4777d145aa27cbf4f945712cf6c29935/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d", size = 4047855, upload_time = "2024-04-17T21:36:52.864Z" }, - { url = "https://files.pythonhosted.org/packages/a7/03/fb50fc03f86016b227a967c8d474f90230c885c0d18f78acdfda7a96ce56/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa", size = 3608228, upload_time = "2024-04-17T21:36:55.7Z" }, - { url = "https://files.pythonhosted.org/packages/5b/cd/0385e1026e1e03732fd398e964792a3a8433918b166748c82507e014d748/tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6", size = 9633115, upload_time = "2024-04-17T21:36:58.299Z" }, - { url = "https://files.pythonhosted.org/packages/25/50/8f8ad0bbdaf09d04b15e6502d1fa1c653754ed7e016e4ae009726aa1a4e4/tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b", size = 9949062, upload_time = "2024-04-17T21:37:01.947Z" }, - { url = "https://files.pythonhosted.org/packages/db/11/31be66710f1d14526f3588a441efadeb184e1e68458067007b20ead03c59/tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256", size = 2041039, upload_time = "2024-04-17T21:37:05.607Z" }, - { url = "https://files.pythonhosted.org/packages/65/8e/6d7d72b28f22c422cff8beae10ac3c2e4376b9be721ef8167b7eecd1da62/tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66", size = 2220386, upload_time = "2024-04-17T21:37:08.295Z" }, - { url = "https://files.pythonhosted.org/packages/63/90/2890cd096898dcdb596ee172cde40c0f54a9cf43b0736aa260a5501252af/tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153", size = 2530580, upload_time = "2024-04-17T21:37:10.688Z" }, - { url = "https://files.pythonhosted.org/packages/74/d1/f4e1e950adb36675dfd8f9d0f4be644f3f3aaf22a5677a4f5c81282b662e/tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a", size = 2436682, upload_time = "2024-04-17T21:37:12.966Z" }, - { url = "https://files.pythonhosted.org/packages/ed/30/89b321a16c58d233e301ec15072c0d3ed5014825e72da98604cd3ab2fba1/tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95", size = 3693494, upload_time = "2024-04-17T21:37:14.755Z" }, - { url = "https://files.pythonhosted.org/packages/05/40/fa899f32de483500fbc78befd378fd7afba4270f17db707d1a78c0a4ddc3/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266", size = 3566541, upload_time = "2024-04-17T21:37:17.067Z" }, - { url = "https://files.pythonhosted.org/packages/67/14/e7da32ae5fb4971830f1ef335932fae3fa57e76b537e852f146c850aefdf/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52", size = 3430792, upload_time = "2024-04-17T21:37:19.055Z" }, - { url = "https://files.pythonhosted.org/packages/f2/4b/aae61bdb6ab584d2612170801703982ee0e35f8b6adacbeefe5a3b277621/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f", size = 3962812, upload_time = "2024-04-17T21:37:21.008Z" }, - { url = "https://files.pythonhosted.org/packages/0a/b6/f7b7ef89c4da7b20256e6eab23d3835f05d1ca8f451d31c16cbfe3cd9eb6/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840", size = 4024688, upload_time = "2024-04-17T21:37:23.659Z" }, - { url = "https://files.pythonhosted.org/packages/80/54/12047a69f5b382d7ee72044dc89151a2dd0d13b2c9bdcc22654883704d31/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3", size = 3610961, upload_time = "2024-04-17T21:37:26.234Z" }, - { url = "https://files.pythonhosted.org/packages/52/b7/1e8a913d18ac28feeda42d4d2d51781874398fb59cd1c1e2653a4b5742ed/tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea", size = 9631367, upload_time = "2024-04-17T21:37:28.752Z" }, - { url = "https://files.pythonhosted.org/packages/ac/3d/2284f6d99f8f21d09352b88b8cfefa24ab88468d962aeb0aa15c20d76b32/tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c", size = 9950121, upload_time = "2024-04-17T21:37:31.741Z" }, - { url = "https://files.pythonhosted.org/packages/2a/94/ec3369dbc9b7200c14c8c7a1a04c78b7a7398d0c001e1b7d1ffe30eb93a0/tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57", size = 2044069, upload_time = "2024-04-17T21:37:35.672Z" }, - { url = "https://files.pythonhosted.org/packages/0c/97/80bff6937e0c67d30c0facacd4f0bcf4254e581aa4995c73cef8c8640e56/tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a", size = 2214527, upload_time = "2024-04-17T21:37:39.19Z" }, -] - [[package]] name = "tqdm" version = "4.67.1" @@ -2546,27 +2114,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload_time = "2024-11-24T20:12:19.698Z" }, ] -[[package]] -name = "transformers" -version = "4.40.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "filelock" }, - { name = "huggingface-hub" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "regex" }, - { name = "requests" }, - { name = "safetensors" }, - { name = "tokenizers" }, - { name = "tqdm" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/73/ef/d877998c9ab04ecb8eeda495e1c64f2f6bb6724b0634f7d0d6aca2cdc6af/transformers-4.40.2.tar.gz", hash = "sha256:657b6054a2097671398d976ad46e60836e7e15f9ea9551631a96e33cb9240649", size = 7797669, upload_time = "2024-05-06T16:08:02.166Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/23/ba02efa28518557e0cfe0ce5c1170000dd7501ed02ac865fc90cbe3daa93/transformers-4.40.2-py3-none-any.whl", hash = "sha256:71cb94301ec211a2e1d4b8c8d18dcfaa902dfa00a089dceca167a8aa265d6f2d", size = 8999918, upload_time = "2024-05-06T16:07:56.121Z" }, -] - [[package]] name = "typer" version = "0.15.3" @@ -2783,45 +2330,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload_time = "2025-03-05T20:03:39.41Z" }, ] -[[package]] -name = "werkzeug" -version = "3.1.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9f/69/83029f1f6300c5fb2471d621ab06f6ec6b3324685a2ce0f9777fd4a8b71e/werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746", size = 806925, upload_time = "2024-11-08T15:52:18.093Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", size = 224498, upload_time = "2024-11-08T15:52:16.132Z" }, -] - -[[package]] -name = "wheel" -version = "0.45.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload_time = "2024-11-23T00:18:23.513Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload_time = "2024-11-23T00:18:21.207Z" }, -] - -[[package]] -name = "wrapt" -version = "1.14.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/eb/e06e77394d6cf09977d92bff310cb0392930c08a338f99af6066a5a98f92/wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d", size = 50890, upload_time = "2022-05-02T05:28:31.026Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/f9/8c078b4973604cd968b23eb3dff52028b5c48f2a02c4f1f975f4d5e344d1/wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55", size = 35432, upload_time = "2023-10-07T08:29:58.387Z" }, - { url = "https://files.pythonhosted.org/packages/6e/79/aec8185eefe20e8f49e5adeb0c2e20e016d5916d10872c17705ddac41be2/wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9", size = 36219, upload_time = "2023-10-07T08:30:01.249Z" }, - { url = "https://files.pythonhosted.org/packages/d1/71/8d68004e5d5a676177342a56808af51e1df3b0e54b203e3295a8cd96b53b/wrapt-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335", size = 78509, upload_time = "2023-10-07T08:30:03.544Z" }, - { url = "https://files.pythonhosted.org/packages/5a/27/604d6ad71fe5935446df1b7512d491b47fe2aef8c95e9813d03d78024a28/wrapt-1.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9", size = 70972, upload_time = "2023-10-07T08:30:05.619Z" }, - { url = "https://files.pythonhosted.org/packages/7f/1b/e0439eec0db6520968c751bc7e12480bb80bb8d939190e0e55ed762f3c7a/wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8", size = 78402, upload_time = "2023-10-07T08:30:07.408Z" }, - { url = "https://files.pythonhosted.org/packages/b9/45/2cc612ff64061d4416baf8d0daf27bea7f79f0097638ddc2af51a3e647f3/wrapt-1.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf", size = 83373, upload_time = "2023-10-07T08:30:09.317Z" }, - { url = "https://files.pythonhosted.org/packages/ad/b7/332692b8d0387922da0f1323ad36a14e365911def3c78ea0d102f83ac592/wrapt-1.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a", size = 76299, upload_time = "2023-10-07T08:30:10.723Z" }, - { url = "https://files.pythonhosted.org/packages/f2/31/cbce966b6760e62d005c237961e839a755bf0c907199248394e2ee03ab05/wrapt-1.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be", size = 83361, upload_time = "2023-10-07T08:30:11.98Z" }, - { url = "https://files.pythonhosted.org/packages/9a/aa/ab46fb18072b86e87e0965a402f8723217e8c0312d1b3e2a91308df924ab/wrapt-1.14.1-cp311-cp311-win32.whl", hash = "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204", size = 33454, upload_time = "2023-10-07T08:30:13.513Z" }, - { url = "https://files.pythonhosted.org/packages/ba/7e/14113996bc6ee68eb987773b4139c87afd3ceff60e27e37648aa5eb2798a/wrapt-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224", size = 35616, upload_time = "2023-10-07T08:30:14.868Z" }, -] - [[package]] name = "xxhash" version = "3.5.0" From e085574df3eedb360fd5fd2d2c5232e04feae27f Mon Sep 17 00:00:00 2001 From: maxachis Date: Mon, 19 May 2025 10:47:01 -0400 Subject: [PATCH 191/244] Update README.md --- README.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 33c11cb8..701561db 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,16 @@ agency_identifier | Matches URLs with an agency from the PDAP database annotation_pipeline | Automated pipeline for generating training data in our ML data source identification models. Manages common crawl, HTML tag collection, and Label Studio import/export html_tag_collector | Collects HTML header, meta, and title tags and appends them to a JSON file. The idea is to make a richer dataset for algorithm training and data labeling. identification_pipeline.py | The core python script uniting this modular pipeline. More details below. -openai-playground | Scripts for accessing the openai API on PDAP's shared account +llm_api_logic | Scripts for accessing the openai API on PDAP's shared account source_collectors| Tools for extracting metadata from different sources, including CKAN data portals and Common Crawler collector_db | Database for storing data from source collectors collector_manager | A module which provides a unified interface for interacting with source collectors and relevant data core | A module which integrates other components, such as collector_manager and collector_db api | API for interacting with collector_manager, core, and collector_db local_database | Resources for setting up a test database for local development +security_manager| A module which provides a unified interface for interacting with authentication and authorization | +tests | Unit and integration tests | +util | various utility functions | ## Installation @@ -25,11 +28,12 @@ uv sync ## How to use -1. Create an .env file in this directory with these contents, or set the environment variable another way: `VUE_APP_PDAP_API_KEY=KeyGoesHere` -2. Create a file in this directory containing a list of urls to be identified, or modify the existing `urls.csv` file. This requires one URL per line with at least a `url` column. -3. Run `python3 identification_pipeline.py urls.csv` -4. Results will be written in the same directory as results.csv -5. If importing "identification_pipeline_main" function, it expects a dataframe as an argument and returns a resulting dataframe +1. Create an .env file in this directory following the instructions in `ENV.md` + 1. If necessary, start up the database using `docker compose up -d` while in the `local_database` directory +2. Run `fastapi dev main.py` to start up the fast API server +3. In a browser, navigate to `http://localhost:8000/docs` to see the full list of API endpoints + +Note that to access API endpoints, you will need to have a valid Bearer Token from the Data Sources API at `https://data-sources.pdap.io/api` # Contributing From 4c7a7dc796db0bdf60a1115a9b571aad41bfa5b6 Mon Sep 17 00:00:00 2001 From: maxachis Date: Mon, 19 May 2025 11:32:02 -0400 Subject: [PATCH 192/244] Replace in-app DiscordPoster with pypi DiscordPoster --- api/main.py | 2 +- core/TaskManager.py | 2 +- pyproject.toml | 1 + util/DiscordNotifier.py | 19 - uv.lock | 2496 ++++++++++++++++++++------------------- 5 files changed, 1258 insertions(+), 1262 deletions(-) delete mode 100644 util/DiscordNotifier.py diff --git a/api/main.py b/api/main.py index a7ee2c67..414f7223 100644 --- a/api/main.py +++ b/api/main.py @@ -28,7 +28,7 @@ from html_tag_collector.URLRequestInterface import URLRequestInterface from pdap_access_manager import AccessManager from pdap_api_client.PDAPClient import PDAPClient -from util.DiscordNotifier import DiscordPoster +from discord_poster import DiscordPoster diff --git a/core/TaskManager.py b/core/TaskManager.py index a2a4dc61..c5f066e7 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -20,7 +20,7 @@ from html_tag_collector.URLRequestInterface import URLRequestInterface from llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier from pdap_api_client.PDAPClient import PDAPClient -from util.DiscordNotifier import DiscordPoster +from discord_poster import DiscordPoster TASK_REPEAT_THRESHOLD = 20 diff --git a/pyproject.toml b/pyproject.toml index 163c4501..088965dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ dependencies = [ "bs4~=0.0.2", "ckanapi~=4.8", "datasets~=2.19.1", + "discord-poster>=0.1.0", "docker~=7.1.0", "environs>=14.1.1", "fastapi[standard]~=0.115.6", diff --git a/util/DiscordNotifier.py b/util/DiscordNotifier.py deleted file mode 100644 index 6df1aa90..00000000 --- a/util/DiscordNotifier.py +++ /dev/null @@ -1,19 +0,0 @@ -import logging - -import requests - - -class DiscordPoster: - def __init__(self, webhook_url: str): - if not webhook_url: - logging.error("WEBHOOK_URL environment variable not set") - raise ValueError("WEBHOOK_URL environment variable not set") - self.webhook_url = webhook_url - def post_to_discord(self, message): - try: - requests.post(self.webhook_url, json={"content": message}) - except Exception as e: - logging.error( - f"Error posting message to Discord: {e}." - f"\n\nMessage: {message}" - ) diff --git a/uv.lock b/uv.lock index 9b2d48fd..b039ce34 100644 --- a/uv.lock +++ b/uv.lock @@ -11,9 +11,9 @@ resolution-markers = [ name = "aiohappyeyeballs" version = "2.6.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload_time = "2025-03-12T01:42:48.764Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload_time = "2025-03-12T01:42:47.083Z" }, + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, ] [[package]] @@ -29,56 +29,56 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/e7/fa1a8c00e2c54b05dc8cb5d1439f627f7c267874e3f7bb047146116020f9/aiohttp-3.11.18.tar.gz", hash = "sha256:ae856e1138612b7e412db63b7708735cff4d38d0399f6a5435d3dac2669f558a", size = 7678653, upload_time = "2025-04-21T09:43:09.191Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/10/fd9ee4f9e042818c3c2390054c08ccd34556a3cb209d83285616434cf93e/aiohttp-3.11.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:427fdc56ccb6901ff8088544bde47084845ea81591deb16f957897f0f0ba1be9", size = 712088, upload_time = "2025-04-21T09:40:55.776Z" }, - { url = "https://files.pythonhosted.org/packages/22/eb/6a77f055ca56f7aae2cd2a5607a3c9e7b9554f1497a069dcfcb52bfc9540/aiohttp-3.11.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c828b6d23b984255b85b9b04a5b963a74278b7356a7de84fda5e3b76866597b", size = 471450, upload_time = "2025-04-21T09:40:57.301Z" }, - { url = "https://files.pythonhosted.org/packages/78/dc/5f3c0d27c91abf0bb5d103e9c9b0ff059f60cf6031a5f06f456c90731f42/aiohttp-3.11.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c2eaa145bb36b33af1ff2860820ba0589e165be4ab63a49aebfd0981c173b66", size = 457836, upload_time = "2025-04-21T09:40:59.322Z" }, - { url = "https://files.pythonhosted.org/packages/49/7b/55b65af9ef48b9b811c91ff8b5b9de9650c71147f10523e278d297750bc8/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d518ce32179f7e2096bf4e3e8438cf445f05fedd597f252de9f54c728574756", size = 1690978, upload_time = "2025-04-21T09:41:00.795Z" }, - { url = "https://files.pythonhosted.org/packages/a2/5a/3f8938c4f68ae400152b42742653477fc625d6bfe02e764f3521321c8442/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0700055a6e05c2f4711011a44364020d7a10fbbcd02fbf3e30e8f7e7fddc8717", size = 1745307, upload_time = "2025-04-21T09:41:02.89Z" }, - { url = "https://files.pythonhosted.org/packages/b4/42/89b694a293333ef6f771c62da022163bcf44fb03d4824372d88e3dc12530/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bd1cde83e4684324e6ee19adfc25fd649d04078179890be7b29f76b501de8e4", size = 1780692, upload_time = "2025-04-21T09:41:04.461Z" }, - { url = "https://files.pythonhosted.org/packages/e2/ce/1a75384e01dd1bf546898b6062b1b5f7a59b6692ef802e4dd6db64fed264/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73b8870fe1c9a201b8c0d12c94fe781b918664766728783241a79e0468427e4f", size = 1676934, upload_time = "2025-04-21T09:41:06.728Z" }, - { url = "https://files.pythonhosted.org/packages/a5/31/442483276e6c368ab5169797d9873b5875213cbcf7e74b95ad1c5003098a/aiohttp-3.11.18-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25557982dd36b9e32c0a3357f30804e80790ec2c4d20ac6bcc598533e04c6361", size = 1621190, upload_time = "2025-04-21T09:41:08.293Z" }, - { url = "https://files.pythonhosted.org/packages/7b/83/90274bf12c079457966008a58831a99675265b6a34b505243e004b408934/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e889c9df381a2433802991288a61e5a19ceb4f61bd14f5c9fa165655dcb1fd1", size = 1658947, upload_time = "2025-04-21T09:41:11.054Z" }, - { url = "https://files.pythonhosted.org/packages/91/c1/da9cee47a0350b78fdc93670ebe7ad74103011d7778ab4c382ca4883098d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9ea345fda05bae217b6cce2acf3682ce3b13d0d16dd47d0de7080e5e21362421", size = 1654443, upload_time = "2025-04-21T09:41:13.213Z" }, - { url = "https://files.pythonhosted.org/packages/c9/f2/73cbe18dc25d624f79a09448adfc4972f82ed6088759ddcf783cd201956c/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9f26545b9940c4b46f0a9388fd04ee3ad7064c4017b5a334dd450f616396590e", size = 1644169, upload_time = "2025-04-21T09:41:14.827Z" }, - { url = "https://files.pythonhosted.org/packages/5b/32/970b0a196c4dccb1b0cfa5b4dc3b20f63d76f1c608f41001a84b2fd23c3d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3a621d85e85dccabd700294494d7179ed1590b6d07a35709bb9bd608c7f5dd1d", size = 1728532, upload_time = "2025-04-21T09:41:17.168Z" }, - { url = "https://files.pythonhosted.org/packages/0b/50/b1dc810a41918d2ea9574e74125eb053063bc5e14aba2d98966f7d734da0/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9c23fd8d08eb9c2af3faeedc8c56e134acdaf36e2117ee059d7defa655130e5f", size = 1750310, upload_time = "2025-04-21T09:41:19.353Z" }, - { url = "https://files.pythonhosted.org/packages/95/24/39271f5990b35ff32179cc95537e92499d3791ae82af7dcf562be785cd15/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9e6b0e519067caa4fd7fb72e3e8002d16a68e84e62e7291092a5433763dc0dd", size = 1691580, upload_time = "2025-04-21T09:41:21.868Z" }, - { url = "https://files.pythonhosted.org/packages/6b/78/75d0353feb77f041460564f12fe58e456436bbc00cbbf5d676dbf0038cc2/aiohttp-3.11.18-cp311-cp311-win32.whl", hash = "sha256:122f3e739f6607e5e4c6a2f8562a6f476192a682a52bda8b4c6d4254e1138f4d", size = 417565, upload_time = "2025-04-21T09:41:24.78Z" }, - { url = "https://files.pythonhosted.org/packages/ed/97/b912dcb654634a813f8518de359364dfc45976f822116e725dc80a688eee/aiohttp-3.11.18-cp311-cp311-win_amd64.whl", hash = "sha256:e6f3c0a3a1e73e88af384b2e8a0b9f4fb73245afd47589df2afcab6b638fa0e6", size = 443652, upload_time = "2025-04-21T09:41:26.48Z" }, - { url = "https://files.pythonhosted.org/packages/b5/d2/5bc436f42bf4745c55f33e1e6a2d69e77075d3e768e3d1a34f96ee5298aa/aiohttp-3.11.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:63d71eceb9cad35d47d71f78edac41fcd01ff10cacaa64e473d1aec13fa02df2", size = 706671, upload_time = "2025-04-21T09:41:28.021Z" }, - { url = "https://files.pythonhosted.org/packages/fe/d0/2dbabecc4e078c0474abb40536bbde717fb2e39962f41c5fc7a216b18ea7/aiohttp-3.11.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d1929da615840969929e8878d7951b31afe0bac883d84418f92e5755d7b49508", size = 466169, upload_time = "2025-04-21T09:41:29.783Z" }, - { url = "https://files.pythonhosted.org/packages/70/84/19edcf0b22933932faa6e0be0d933a27bd173da02dc125b7354dff4d8da4/aiohttp-3.11.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d0aebeb2392f19b184e3fdd9e651b0e39cd0f195cdb93328bd124a1d455cd0e", size = 457554, upload_time = "2025-04-21T09:41:31.327Z" }, - { url = "https://files.pythonhosted.org/packages/32/d0/e8d1f034ae5624a0f21e4fb3feff79342ce631f3a4d26bd3e58b31ef033b/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3849ead845e8444f7331c284132ab314b4dac43bfae1e3cf350906d4fff4620f", size = 1690154, upload_time = "2025-04-21T09:41:33.541Z" }, - { url = "https://files.pythonhosted.org/packages/16/de/2f9dbe2ac6f38f8495562077131888e0d2897e3798a0ff3adda766b04a34/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e8452ad6b2863709f8b3d615955aa0807bc093c34b8e25b3b52097fe421cb7f", size = 1733402, upload_time = "2025-04-21T09:41:35.634Z" }, - { url = "https://files.pythonhosted.org/packages/e0/04/bd2870e1e9aef990d14b6df2a695f17807baf5c85a4c187a492bda569571/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b8d2b42073611c860a37f718b3d61ae8b4c2b124b2e776e2c10619d920350ec", size = 1783958, upload_time = "2025-04-21T09:41:37.456Z" }, - { url = "https://files.pythonhosted.org/packages/23/06/4203ffa2beb5bedb07f0da0f79b7d9039d1c33f522e0d1a2d5b6218e6f2e/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fbf91f6a0ac317c0a07eb328a1384941872f6761f2e6f7208b63c4cc0a7ff6", size = 1695288, upload_time = "2025-04-21T09:41:39.756Z" }, - { url = "https://files.pythonhosted.org/packages/30/b2/e2285dda065d9f29ab4b23d8bcc81eb881db512afb38a3f5247b191be36c/aiohttp-3.11.18-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ff5625413fec55216da5eaa011cf6b0a2ed67a565914a212a51aa3755b0009", size = 1618871, upload_time = "2025-04-21T09:41:41.972Z" }, - { url = "https://files.pythonhosted.org/packages/57/e0/88f2987885d4b646de2036f7296ebea9268fdbf27476da551c1a7c158bc0/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7f33a92a2fde08e8c6b0c61815521324fc1612f397abf96eed86b8e31618fdb4", size = 1646262, upload_time = "2025-04-21T09:41:44.192Z" }, - { url = "https://files.pythonhosted.org/packages/e0/19/4d2da508b4c587e7472a032290b2981f7caeca82b4354e19ab3df2f51d56/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:11d5391946605f445ddafda5eab11caf310f90cdda1fd99865564e3164f5cff9", size = 1677431, upload_time = "2025-04-21T09:41:46.049Z" }, - { url = "https://files.pythonhosted.org/packages/eb/ae/047473ea50150a41440f3265f53db1738870b5a1e5406ece561ca61a3bf4/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3cc314245deb311364884e44242e00c18b5896e4fe6d5f942e7ad7e4cb640adb", size = 1637430, upload_time = "2025-04-21T09:41:47.973Z" }, - { url = "https://files.pythonhosted.org/packages/11/32/c6d1e3748077ce7ee13745fae33e5cb1dac3e3b8f8787bf738a93c94a7d2/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f421843b0f70740772228b9e8093289924359d306530bcd3926f39acbe1adda", size = 1703342, upload_time = "2025-04-21T09:41:50.323Z" }, - { url = "https://files.pythonhosted.org/packages/c5/1d/a3b57bfdbe285f0d45572d6d8f534fd58761da3e9cbc3098372565005606/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e220e7562467dc8d589e31c1acd13438d82c03d7f385c9cd41a3f6d1d15807c1", size = 1740600, upload_time = "2025-04-21T09:41:52.111Z" }, - { url = "https://files.pythonhosted.org/packages/a5/71/f9cd2fed33fa2b7ce4d412fb7876547abb821d5b5520787d159d0748321d/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab2ef72f8605046115bc9aa8e9d14fd49086d405855f40b79ed9e5c1f9f4faea", size = 1695131, upload_time = "2025-04-21T09:41:53.94Z" }, - { url = "https://files.pythonhosted.org/packages/97/97/d1248cd6d02b9de6aa514793d0dcb20099f0ec47ae71a933290116c070c5/aiohttp-3.11.18-cp312-cp312-win32.whl", hash = "sha256:12a62691eb5aac58d65200c7ae94d73e8a65c331c3a86a2e9670927e94339ee8", size = 412442, upload_time = "2025-04-21T09:41:55.689Z" }, - { url = "https://files.pythonhosted.org/packages/33/9a/e34e65506e06427b111e19218a99abf627638a9703f4b8bcc3e3021277ed/aiohttp-3.11.18-cp312-cp312-win_amd64.whl", hash = "sha256:364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8", size = 439444, upload_time = "2025-04-21T09:41:57.977Z" }, - { url = "https://files.pythonhosted.org/packages/0a/18/be8b5dd6b9cf1b2172301dbed28e8e5e878ee687c21947a6c81d6ceaa15d/aiohttp-3.11.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:474215ec618974054cf5dc465497ae9708543cbfc312c65212325d4212525811", size = 699833, upload_time = "2025-04-21T09:42:00.298Z" }, - { url = "https://files.pythonhosted.org/packages/0d/84/ecdc68e293110e6f6f6d7b57786a77555a85f70edd2b180fb1fafaff361a/aiohttp-3.11.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ced70adf03920d4e67c373fd692123e34d3ac81dfa1c27e45904a628567d804", size = 462774, upload_time = "2025-04-21T09:42:02.015Z" }, - { url = "https://files.pythonhosted.org/packages/d7/85/f07718cca55884dad83cc2433746384d267ee970e91f0dcc75c6d5544079/aiohttp-3.11.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d9f6c0152f8d71361905aaf9ed979259537981f47ad099c8b3d81e0319814bd", size = 454429, upload_time = "2025-04-21T09:42:03.728Z" }, - { url = "https://files.pythonhosted.org/packages/82/02/7f669c3d4d39810db8842c4e572ce4fe3b3a9b82945fdd64affea4c6947e/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a35197013ed929c0aed5c9096de1fc5a9d336914d73ab3f9df14741668c0616c", size = 1670283, upload_time = "2025-04-21T09:42:06.053Z" }, - { url = "https://files.pythonhosted.org/packages/ec/79/b82a12f67009b377b6c07a26bdd1b81dab7409fc2902d669dbfa79e5ac02/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:540b8a1f3a424f1af63e0af2d2853a759242a1769f9f1ab053996a392bd70118", size = 1717231, upload_time = "2025-04-21T09:42:07.953Z" }, - { url = "https://files.pythonhosted.org/packages/a6/38/d5a1f28c3904a840642b9a12c286ff41fc66dfa28b87e204b1f242dbd5e6/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9e6710ebebfce2ba21cee6d91e7452d1125100f41b906fb5af3da8c78b764c1", size = 1769621, upload_time = "2025-04-21T09:42:09.855Z" }, - { url = "https://files.pythonhosted.org/packages/53/2d/deb3749ba293e716b5714dda06e257f123c5b8679072346b1eb28b766a0b/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8af2ef3b4b652ff109f98087242e2ab974b2b2b496304063585e3d78de0b000", size = 1678667, upload_time = "2025-04-21T09:42:11.741Z" }, - { url = "https://files.pythonhosted.org/packages/b8/a8/04b6e11683a54e104b984bd19a9790eb1ae5f50968b601bb202d0406f0ff/aiohttp-3.11.18-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28c3f975e5ae3dbcbe95b7e3dcd30e51da561a0a0f2cfbcdea30fc1308d72137", size = 1601592, upload_time = "2025-04-21T09:42:14.137Z" }, - { url = "https://files.pythonhosted.org/packages/5e/9d/c33305ae8370b789423623f0e073d09ac775cd9c831ac0f11338b81c16e0/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c28875e316c7b4c3e745172d882d8a5c835b11018e33432d281211af35794a93", size = 1621679, upload_time = "2025-04-21T09:42:16.056Z" }, - { url = "https://files.pythonhosted.org/packages/56/45/8e9a27fff0538173d47ba60362823358f7a5f1653c6c30c613469f94150e/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:13cd38515568ae230e1ef6919e2e33da5d0f46862943fcda74e7e915096815f3", size = 1656878, upload_time = "2025-04-21T09:42:18.368Z" }, - { url = "https://files.pythonhosted.org/packages/84/5b/8c5378f10d7a5a46b10cb9161a3aac3eeae6dba54ec0f627fc4ddc4f2e72/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0e2a92101efb9f4c2942252c69c63ddb26d20f46f540c239ccfa5af865197bb8", size = 1620509, upload_time = "2025-04-21T09:42:20.141Z" }, - { url = "https://files.pythonhosted.org/packages/9e/2f/99dee7bd91c62c5ff0aa3c55f4ae7e1bc99c6affef780d7777c60c5b3735/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e6d3e32b8753c8d45ac550b11a1090dd66d110d4ef805ffe60fa61495360b3b2", size = 1680263, upload_time = "2025-04-21T09:42:21.993Z" }, - { url = "https://files.pythonhosted.org/packages/03/0a/378745e4ff88acb83e2d5c884a4fe993a6e9f04600a4560ce0e9b19936e3/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ea4cf2488156e0f281f93cc2fd365025efcba3e2d217cbe3df2840f8c73db261", size = 1715014, upload_time = "2025-04-21T09:42:23.87Z" }, - { url = "https://files.pythonhosted.org/packages/f6/0b/b5524b3bb4b01e91bc4323aad0c2fcaebdf2f1b4d2eb22743948ba364958/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d4df95ad522c53f2b9ebc07f12ccd2cb15550941e11a5bbc5ddca2ca56316d7", size = 1666614, upload_time = "2025-04-21T09:42:25.764Z" }, - { url = "https://files.pythonhosted.org/packages/c7/b7/3d7b036d5a4ed5a4c704e0754afe2eef24a824dfab08e6efbffb0f6dd36a/aiohttp-3.11.18-cp313-cp313-win32.whl", hash = "sha256:cdd1bbaf1e61f0d94aced116d6e95fe25942f7a5f42382195fd9501089db5d78", size = 411358, upload_time = "2025-04-21T09:42:27.558Z" }, - { url = "https://files.pythonhosted.org/packages/1e/3c/143831b32cd23b5263a995b2a1794e10aa42f8a895aae5074c20fda36c07/aiohttp-3.11.18-cp313-cp313-win_amd64.whl", hash = "sha256:bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01", size = 437658, upload_time = "2025-04-21T09:42:29.209Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/63/e7/fa1a8c00e2c54b05dc8cb5d1439f627f7c267874e3f7bb047146116020f9/aiohttp-3.11.18.tar.gz", hash = "sha256:ae856e1138612b7e412db63b7708735cff4d38d0399f6a5435d3dac2669f558a", size = 7678653, upload-time = "2025-04-21T09:43:09.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/10/fd9ee4f9e042818c3c2390054c08ccd34556a3cb209d83285616434cf93e/aiohttp-3.11.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:427fdc56ccb6901ff8088544bde47084845ea81591deb16f957897f0f0ba1be9", size = 712088, upload-time = "2025-04-21T09:40:55.776Z" }, + { url = "https://files.pythonhosted.org/packages/22/eb/6a77f055ca56f7aae2cd2a5607a3c9e7b9554f1497a069dcfcb52bfc9540/aiohttp-3.11.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c828b6d23b984255b85b9b04a5b963a74278b7356a7de84fda5e3b76866597b", size = 471450, upload-time = "2025-04-21T09:40:57.301Z" }, + { url = "https://files.pythonhosted.org/packages/78/dc/5f3c0d27c91abf0bb5d103e9c9b0ff059f60cf6031a5f06f456c90731f42/aiohttp-3.11.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c2eaa145bb36b33af1ff2860820ba0589e165be4ab63a49aebfd0981c173b66", size = 457836, upload-time = "2025-04-21T09:40:59.322Z" }, + { url = "https://files.pythonhosted.org/packages/49/7b/55b65af9ef48b9b811c91ff8b5b9de9650c71147f10523e278d297750bc8/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d518ce32179f7e2096bf4e3e8438cf445f05fedd597f252de9f54c728574756", size = 1690978, upload-time = "2025-04-21T09:41:00.795Z" }, + { url = "https://files.pythonhosted.org/packages/a2/5a/3f8938c4f68ae400152b42742653477fc625d6bfe02e764f3521321c8442/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0700055a6e05c2f4711011a44364020d7a10fbbcd02fbf3e30e8f7e7fddc8717", size = 1745307, upload-time = "2025-04-21T09:41:02.89Z" }, + { url = "https://files.pythonhosted.org/packages/b4/42/89b694a293333ef6f771c62da022163bcf44fb03d4824372d88e3dc12530/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bd1cde83e4684324e6ee19adfc25fd649d04078179890be7b29f76b501de8e4", size = 1780692, upload-time = "2025-04-21T09:41:04.461Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ce/1a75384e01dd1bf546898b6062b1b5f7a59b6692ef802e4dd6db64fed264/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73b8870fe1c9a201b8c0d12c94fe781b918664766728783241a79e0468427e4f", size = 1676934, upload-time = "2025-04-21T09:41:06.728Z" }, + { url = "https://files.pythonhosted.org/packages/a5/31/442483276e6c368ab5169797d9873b5875213cbcf7e74b95ad1c5003098a/aiohttp-3.11.18-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25557982dd36b9e32c0a3357f30804e80790ec2c4d20ac6bcc598533e04c6361", size = 1621190, upload-time = "2025-04-21T09:41:08.293Z" }, + { url = "https://files.pythonhosted.org/packages/7b/83/90274bf12c079457966008a58831a99675265b6a34b505243e004b408934/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e889c9df381a2433802991288a61e5a19ceb4f61bd14f5c9fa165655dcb1fd1", size = 1658947, upload-time = "2025-04-21T09:41:11.054Z" }, + { url = "https://files.pythonhosted.org/packages/91/c1/da9cee47a0350b78fdc93670ebe7ad74103011d7778ab4c382ca4883098d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9ea345fda05bae217b6cce2acf3682ce3b13d0d16dd47d0de7080e5e21362421", size = 1654443, upload-time = "2025-04-21T09:41:13.213Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f2/73cbe18dc25d624f79a09448adfc4972f82ed6088759ddcf783cd201956c/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9f26545b9940c4b46f0a9388fd04ee3ad7064c4017b5a334dd450f616396590e", size = 1644169, upload-time = "2025-04-21T09:41:14.827Z" }, + { url = "https://files.pythonhosted.org/packages/5b/32/970b0a196c4dccb1b0cfa5b4dc3b20f63d76f1c608f41001a84b2fd23c3d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3a621d85e85dccabd700294494d7179ed1590b6d07a35709bb9bd608c7f5dd1d", size = 1728532, upload-time = "2025-04-21T09:41:17.168Z" }, + { url = "https://files.pythonhosted.org/packages/0b/50/b1dc810a41918d2ea9574e74125eb053063bc5e14aba2d98966f7d734da0/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9c23fd8d08eb9c2af3faeedc8c56e134acdaf36e2117ee059d7defa655130e5f", size = 1750310, upload-time = "2025-04-21T09:41:19.353Z" }, + { url = "https://files.pythonhosted.org/packages/95/24/39271f5990b35ff32179cc95537e92499d3791ae82af7dcf562be785cd15/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9e6b0e519067caa4fd7fb72e3e8002d16a68e84e62e7291092a5433763dc0dd", size = 1691580, upload-time = "2025-04-21T09:41:21.868Z" }, + { url = "https://files.pythonhosted.org/packages/6b/78/75d0353feb77f041460564f12fe58e456436bbc00cbbf5d676dbf0038cc2/aiohttp-3.11.18-cp311-cp311-win32.whl", hash = "sha256:122f3e739f6607e5e4c6a2f8562a6f476192a682a52bda8b4c6d4254e1138f4d", size = 417565, upload-time = "2025-04-21T09:41:24.78Z" }, + { url = "https://files.pythonhosted.org/packages/ed/97/b912dcb654634a813f8518de359364dfc45976f822116e725dc80a688eee/aiohttp-3.11.18-cp311-cp311-win_amd64.whl", hash = "sha256:e6f3c0a3a1e73e88af384b2e8a0b9f4fb73245afd47589df2afcab6b638fa0e6", size = 443652, upload-time = "2025-04-21T09:41:26.48Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d2/5bc436f42bf4745c55f33e1e6a2d69e77075d3e768e3d1a34f96ee5298aa/aiohttp-3.11.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:63d71eceb9cad35d47d71f78edac41fcd01ff10cacaa64e473d1aec13fa02df2", size = 706671, upload-time = "2025-04-21T09:41:28.021Z" }, + { url = "https://files.pythonhosted.org/packages/fe/d0/2dbabecc4e078c0474abb40536bbde717fb2e39962f41c5fc7a216b18ea7/aiohttp-3.11.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d1929da615840969929e8878d7951b31afe0bac883d84418f92e5755d7b49508", size = 466169, upload-time = "2025-04-21T09:41:29.783Z" }, + { url = "https://files.pythonhosted.org/packages/70/84/19edcf0b22933932faa6e0be0d933a27bd173da02dc125b7354dff4d8da4/aiohttp-3.11.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d0aebeb2392f19b184e3fdd9e651b0e39cd0f195cdb93328bd124a1d455cd0e", size = 457554, upload-time = "2025-04-21T09:41:31.327Z" }, + { url = "https://files.pythonhosted.org/packages/32/d0/e8d1f034ae5624a0f21e4fb3feff79342ce631f3a4d26bd3e58b31ef033b/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3849ead845e8444f7331c284132ab314b4dac43bfae1e3cf350906d4fff4620f", size = 1690154, upload-time = "2025-04-21T09:41:33.541Z" }, + { url = "https://files.pythonhosted.org/packages/16/de/2f9dbe2ac6f38f8495562077131888e0d2897e3798a0ff3adda766b04a34/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e8452ad6b2863709f8b3d615955aa0807bc093c34b8e25b3b52097fe421cb7f", size = 1733402, upload-time = "2025-04-21T09:41:35.634Z" }, + { url = "https://files.pythonhosted.org/packages/e0/04/bd2870e1e9aef990d14b6df2a695f17807baf5c85a4c187a492bda569571/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b8d2b42073611c860a37f718b3d61ae8b4c2b124b2e776e2c10619d920350ec", size = 1783958, upload-time = "2025-04-21T09:41:37.456Z" }, + { url = "https://files.pythonhosted.org/packages/23/06/4203ffa2beb5bedb07f0da0f79b7d9039d1c33f522e0d1a2d5b6218e6f2e/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fbf91f6a0ac317c0a07eb328a1384941872f6761f2e6f7208b63c4cc0a7ff6", size = 1695288, upload-time = "2025-04-21T09:41:39.756Z" }, + { url = "https://files.pythonhosted.org/packages/30/b2/e2285dda065d9f29ab4b23d8bcc81eb881db512afb38a3f5247b191be36c/aiohttp-3.11.18-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ff5625413fec55216da5eaa011cf6b0a2ed67a565914a212a51aa3755b0009", size = 1618871, upload-time = "2025-04-21T09:41:41.972Z" }, + { url = "https://files.pythonhosted.org/packages/57/e0/88f2987885d4b646de2036f7296ebea9268fdbf27476da551c1a7c158bc0/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7f33a92a2fde08e8c6b0c61815521324fc1612f397abf96eed86b8e31618fdb4", size = 1646262, upload-time = "2025-04-21T09:41:44.192Z" }, + { url = "https://files.pythonhosted.org/packages/e0/19/4d2da508b4c587e7472a032290b2981f7caeca82b4354e19ab3df2f51d56/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:11d5391946605f445ddafda5eab11caf310f90cdda1fd99865564e3164f5cff9", size = 1677431, upload-time = "2025-04-21T09:41:46.049Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ae/047473ea50150a41440f3265f53db1738870b5a1e5406ece561ca61a3bf4/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3cc314245deb311364884e44242e00c18b5896e4fe6d5f942e7ad7e4cb640adb", size = 1637430, upload-time = "2025-04-21T09:41:47.973Z" }, + { url = "https://files.pythonhosted.org/packages/11/32/c6d1e3748077ce7ee13745fae33e5cb1dac3e3b8f8787bf738a93c94a7d2/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f421843b0f70740772228b9e8093289924359d306530bcd3926f39acbe1adda", size = 1703342, upload-time = "2025-04-21T09:41:50.323Z" }, + { url = "https://files.pythonhosted.org/packages/c5/1d/a3b57bfdbe285f0d45572d6d8f534fd58761da3e9cbc3098372565005606/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e220e7562467dc8d589e31c1acd13438d82c03d7f385c9cd41a3f6d1d15807c1", size = 1740600, upload-time = "2025-04-21T09:41:52.111Z" }, + { url = "https://files.pythonhosted.org/packages/a5/71/f9cd2fed33fa2b7ce4d412fb7876547abb821d5b5520787d159d0748321d/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab2ef72f8605046115bc9aa8e9d14fd49086d405855f40b79ed9e5c1f9f4faea", size = 1695131, upload-time = "2025-04-21T09:41:53.94Z" }, + { url = "https://files.pythonhosted.org/packages/97/97/d1248cd6d02b9de6aa514793d0dcb20099f0ec47ae71a933290116c070c5/aiohttp-3.11.18-cp312-cp312-win32.whl", hash = "sha256:12a62691eb5aac58d65200c7ae94d73e8a65c331c3a86a2e9670927e94339ee8", size = 412442, upload-time = "2025-04-21T09:41:55.689Z" }, + { url = "https://files.pythonhosted.org/packages/33/9a/e34e65506e06427b111e19218a99abf627638a9703f4b8bcc3e3021277ed/aiohttp-3.11.18-cp312-cp312-win_amd64.whl", hash = "sha256:364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8", size = 439444, upload-time = "2025-04-21T09:41:57.977Z" }, + { url = "https://files.pythonhosted.org/packages/0a/18/be8b5dd6b9cf1b2172301dbed28e8e5e878ee687c21947a6c81d6ceaa15d/aiohttp-3.11.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:474215ec618974054cf5dc465497ae9708543cbfc312c65212325d4212525811", size = 699833, upload-time = "2025-04-21T09:42:00.298Z" }, + { url = "https://files.pythonhosted.org/packages/0d/84/ecdc68e293110e6f6f6d7b57786a77555a85f70edd2b180fb1fafaff361a/aiohttp-3.11.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ced70adf03920d4e67c373fd692123e34d3ac81dfa1c27e45904a628567d804", size = 462774, upload-time = "2025-04-21T09:42:02.015Z" }, + { url = "https://files.pythonhosted.org/packages/d7/85/f07718cca55884dad83cc2433746384d267ee970e91f0dcc75c6d5544079/aiohttp-3.11.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d9f6c0152f8d71361905aaf9ed979259537981f47ad099c8b3d81e0319814bd", size = 454429, upload-time = "2025-04-21T09:42:03.728Z" }, + { url = "https://files.pythonhosted.org/packages/82/02/7f669c3d4d39810db8842c4e572ce4fe3b3a9b82945fdd64affea4c6947e/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a35197013ed929c0aed5c9096de1fc5a9d336914d73ab3f9df14741668c0616c", size = 1670283, upload-time = "2025-04-21T09:42:06.053Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/b82a12f67009b377b6c07a26bdd1b81dab7409fc2902d669dbfa79e5ac02/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:540b8a1f3a424f1af63e0af2d2853a759242a1769f9f1ab053996a392bd70118", size = 1717231, upload-time = "2025-04-21T09:42:07.953Z" }, + { url = "https://files.pythonhosted.org/packages/a6/38/d5a1f28c3904a840642b9a12c286ff41fc66dfa28b87e204b1f242dbd5e6/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9e6710ebebfce2ba21cee6d91e7452d1125100f41b906fb5af3da8c78b764c1", size = 1769621, upload-time = "2025-04-21T09:42:09.855Z" }, + { url = "https://files.pythonhosted.org/packages/53/2d/deb3749ba293e716b5714dda06e257f123c5b8679072346b1eb28b766a0b/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8af2ef3b4b652ff109f98087242e2ab974b2b2b496304063585e3d78de0b000", size = 1678667, upload-time = "2025-04-21T09:42:11.741Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a8/04b6e11683a54e104b984bd19a9790eb1ae5f50968b601bb202d0406f0ff/aiohttp-3.11.18-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28c3f975e5ae3dbcbe95b7e3dcd30e51da561a0a0f2cfbcdea30fc1308d72137", size = 1601592, upload-time = "2025-04-21T09:42:14.137Z" }, + { url = "https://files.pythonhosted.org/packages/5e/9d/c33305ae8370b789423623f0e073d09ac775cd9c831ac0f11338b81c16e0/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c28875e316c7b4c3e745172d882d8a5c835b11018e33432d281211af35794a93", size = 1621679, upload-time = "2025-04-21T09:42:16.056Z" }, + { url = "https://files.pythonhosted.org/packages/56/45/8e9a27fff0538173d47ba60362823358f7a5f1653c6c30c613469f94150e/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:13cd38515568ae230e1ef6919e2e33da5d0f46862943fcda74e7e915096815f3", size = 1656878, upload-time = "2025-04-21T09:42:18.368Z" }, + { url = "https://files.pythonhosted.org/packages/84/5b/8c5378f10d7a5a46b10cb9161a3aac3eeae6dba54ec0f627fc4ddc4f2e72/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0e2a92101efb9f4c2942252c69c63ddb26d20f46f540c239ccfa5af865197bb8", size = 1620509, upload-time = "2025-04-21T09:42:20.141Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2f/99dee7bd91c62c5ff0aa3c55f4ae7e1bc99c6affef780d7777c60c5b3735/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e6d3e32b8753c8d45ac550b11a1090dd66d110d4ef805ffe60fa61495360b3b2", size = 1680263, upload-time = "2025-04-21T09:42:21.993Z" }, + { url = "https://files.pythonhosted.org/packages/03/0a/378745e4ff88acb83e2d5c884a4fe993a6e9f04600a4560ce0e9b19936e3/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ea4cf2488156e0f281f93cc2fd365025efcba3e2d217cbe3df2840f8c73db261", size = 1715014, upload-time = "2025-04-21T09:42:23.87Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0b/b5524b3bb4b01e91bc4323aad0c2fcaebdf2f1b4d2eb22743948ba364958/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d4df95ad522c53f2b9ebc07f12ccd2cb15550941e11a5bbc5ddca2ca56316d7", size = 1666614, upload-time = "2025-04-21T09:42:25.764Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b7/3d7b036d5a4ed5a4c704e0754afe2eef24a824dfab08e6efbffb0f6dd36a/aiohttp-3.11.18-cp313-cp313-win32.whl", hash = "sha256:cdd1bbaf1e61f0d94aced116d6e95fe25942f7a5f42382195fd9501089db5d78", size = 411358, upload-time = "2025-04-21T09:42:27.558Z" }, + { url = "https://files.pythonhosted.org/packages/1e/3c/143831b32cd23b5263a995b2a1794e10aa42f8a895aae5074c20fda36c07/aiohttp-3.11.18-cp313-cp313-win_amd64.whl", hash = "sha256:bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01", size = 437658, upload-time = "2025-04-21T09:42:29.209Z" }, ] [[package]] @@ -88,9 +88,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frozenlist" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424, upload_time = "2024-12-13T17:10:40.86Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424, upload-time = "2024-12-13T17:10:40.86Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597, upload_time = "2024-12-13T17:10:38.469Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597, upload-time = "2024-12-13T17:10:38.469Z" }, ] [[package]] @@ -102,18 +102,18 @@ dependencies = [ { name = "sqlalchemy" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/09/f844822e4e847a3f0bd41797f93c4674cd4d2462a3f6c459aa528cdf786e/alembic-1.14.1.tar.gz", hash = "sha256:496e888245a53adf1498fcab31713a469c65836f8de76e01399aa1c3e90dd213", size = 1918219, upload_time = "2025-01-19T23:15:30.12Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/09/f844822e4e847a3f0bd41797f93c4674cd4d2462a3f6c459aa528cdf786e/alembic-1.14.1.tar.gz", hash = "sha256:496e888245a53adf1498fcab31713a469c65836f8de76e01399aa1c3e90dd213", size = 1918219, upload-time = "2025-01-19T23:15:30.12Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/7e/ac0991d1745f7d755fc1cd381b3990a45b404b4d008fc75e2a983516fbfe/alembic-1.14.1-py3-none-any.whl", hash = "sha256:1acdd7a3a478e208b0503cd73614d5e4c6efafa4e73518bb60e4f2846a37b1c5", size = 233565, upload_time = "2025-01-19T23:15:32.523Z" }, + { url = "https://files.pythonhosted.org/packages/54/7e/ac0991d1745f7d755fc1cd381b3990a45b404b4d008fc75e2a983516fbfe/alembic-1.14.1-py3-none-any.whl", hash = "sha256:1acdd7a3a478e208b0503cd73614d5e4c6efafa4e73518bb60e4f2846a37b1c5", size = 233565, upload-time = "2025-01-19T23:15:32.523Z" }, ] [[package]] name = "annotated-types" version = "0.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload_time = "2024-05-20T21:33:25.928Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload_time = "2024-05-20T21:33:24.1Z" }, + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, ] [[package]] @@ -125,9 +125,9 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload_time = "2025-03-17T00:02:54.77Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload_time = "2025-03-17T00:02:52.713Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" }, ] [[package]] @@ -137,50 +137,50 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tzlocal" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4e/00/6d6814ddc19be2df62c8c898c4df6b5b1914f3bd024b780028caa392d186/apscheduler-3.11.0.tar.gz", hash = "sha256:4c622d250b0955a65d5d0eb91c33e6d43fd879834bf541e0a18661ae60460133", size = 107347, upload_time = "2024-11-24T19:39:26.463Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/00/6d6814ddc19be2df62c8c898c4df6b5b1914f3bd024b780028caa392d186/apscheduler-3.11.0.tar.gz", hash = "sha256:4c622d250b0955a65d5d0eb91c33e6d43fd879834bf541e0a18661ae60460133", size = 107347, upload-time = "2024-11-24T19:39:26.463Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/ae/9a053dd9229c0fde6b1f1f33f609ccff1ee79ddda364c756a924c6d8563b/APScheduler-3.11.0-py3-none-any.whl", hash = "sha256:fc134ca32e50f5eadcc4938e3a4545ab19131435e851abb40b34d63d5141c6da", size = 64004, upload_time = "2024-11-24T19:39:24.442Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ae/9a053dd9229c0fde6b1f1f33f609ccff1ee79ddda364c756a924c6d8563b/APScheduler-3.11.0-py3-none-any.whl", hash = "sha256:fc134ca32e50f5eadcc4938e3a4545ab19131435e851abb40b34d63d5141c6da", size = 64004, upload-time = "2024-11-24T19:39:24.442Z" }, ] [[package]] name = "asyncpg" version = "0.30.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/4c/7c991e080e106d854809030d8584e15b2e996e26f16aee6d757e387bc17d/asyncpg-0.30.0.tar.gz", hash = "sha256:c551e9928ab6707602f44811817f82ba3c446e018bfe1d3abecc8ba5f3eac851", size = 957746, upload_time = "2024-10-20T00:30:41.127Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/0e/f5d708add0d0b97446c402db7e8dd4c4183c13edaabe8a8500b411e7b495/asyncpg-0.30.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5e0511ad3dec5f6b4f7a9e063591d407eee66b88c14e2ea636f187da1dcfff6a", size = 674506, upload_time = "2024-10-20T00:29:27.988Z" }, - { url = "https://files.pythonhosted.org/packages/6a/a0/67ec9a75cb24a1d99f97b8437c8d56da40e6f6bd23b04e2f4ea5d5ad82ac/asyncpg-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:915aeb9f79316b43c3207363af12d0e6fd10776641a7de8a01212afd95bdf0ed", size = 645922, upload_time = "2024-10-20T00:29:29.391Z" }, - { url = "https://files.pythonhosted.org/packages/5c/d9/a7584f24174bd86ff1053b14bb841f9e714380c672f61c906eb01d8ec433/asyncpg-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c198a00cce9506fcd0bf219a799f38ac7a237745e1d27f0e1f66d3707c84a5a", size = 3079565, upload_time = "2024-10-20T00:29:30.832Z" }, - { url = "https://files.pythonhosted.org/packages/a0/d7/a4c0f9660e333114bdb04d1a9ac70db690dd4ae003f34f691139a5cbdae3/asyncpg-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3326e6d7381799e9735ca2ec9fd7be4d5fef5dcbc3cb555d8a463d8460607956", size = 3109962, upload_time = "2024-10-20T00:29:33.114Z" }, - { url = "https://files.pythonhosted.org/packages/3c/21/199fd16b5a981b1575923cbb5d9cf916fdc936b377e0423099f209e7e73d/asyncpg-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:51da377487e249e35bd0859661f6ee2b81db11ad1f4fc036194bc9cb2ead5056", size = 3064791, upload_time = "2024-10-20T00:29:34.677Z" }, - { url = "https://files.pythonhosted.org/packages/77/52/0004809b3427534a0c9139c08c87b515f1c77a8376a50ae29f001e53962f/asyncpg-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc6d84136f9c4d24d358f3b02be4b6ba358abd09f80737d1ac7c444f36108454", size = 3188696, upload_time = "2024-10-20T00:29:36.389Z" }, - { url = "https://files.pythonhosted.org/packages/52/cb/fbad941cd466117be58b774a3f1cc9ecc659af625f028b163b1e646a55fe/asyncpg-0.30.0-cp311-cp311-win32.whl", hash = "sha256:574156480df14f64c2d76450a3f3aaaf26105869cad3865041156b38459e935d", size = 567358, upload_time = "2024-10-20T00:29:37.915Z" }, - { url = "https://files.pythonhosted.org/packages/3c/0a/0a32307cf166d50e1ad120d9b81a33a948a1a5463ebfa5a96cc5606c0863/asyncpg-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:3356637f0bd830407b5597317b3cb3571387ae52ddc3bca6233682be88bbbc1f", size = 629375, upload_time = "2024-10-20T00:29:39.987Z" }, - { url = "https://files.pythonhosted.org/packages/4b/64/9d3e887bb7b01535fdbc45fbd5f0a8447539833b97ee69ecdbb7a79d0cb4/asyncpg-0.30.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c902a60b52e506d38d7e80e0dd5399f657220f24635fee368117b8b5fce1142e", size = 673162, upload_time = "2024-10-20T00:29:41.88Z" }, - { url = "https://files.pythonhosted.org/packages/6e/eb/8b236663f06984f212a087b3e849731f917ab80f84450e943900e8ca4052/asyncpg-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aca1548e43bbb9f0f627a04666fedaca23db0a31a84136ad1f868cb15deb6e3a", size = 637025, upload_time = "2024-10-20T00:29:43.352Z" }, - { url = "https://files.pythonhosted.org/packages/cc/57/2dc240bb263d58786cfaa60920779af6e8d32da63ab9ffc09f8312bd7a14/asyncpg-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c2a2ef565400234a633da0eafdce27e843836256d40705d83ab7ec42074efb3", size = 3496243, upload_time = "2024-10-20T00:29:44.922Z" }, - { url = "https://files.pythonhosted.org/packages/f4/40/0ae9d061d278b10713ea9021ef6b703ec44698fe32178715a501ac696c6b/asyncpg-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1292b84ee06ac8a2ad8e51c7475aa309245874b61333d97411aab835c4a2f737", size = 3575059, upload_time = "2024-10-20T00:29:46.891Z" }, - { url = "https://files.pythonhosted.org/packages/c3/75/d6b895a35a2c6506952247640178e5f768eeb28b2e20299b6a6f1d743ba0/asyncpg-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0f5712350388d0cd0615caec629ad53c81e506b1abaaf8d14c93f54b35e3595a", size = 3473596, upload_time = "2024-10-20T00:29:49.201Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e7/3693392d3e168ab0aebb2d361431375bd22ffc7b4a586a0fc060d519fae7/asyncpg-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:db9891e2d76e6f425746c5d2da01921e9a16b5a71a1c905b13f30e12a257c4af", size = 3641632, upload_time = "2024-10-20T00:29:50.768Z" }, - { url = "https://files.pythonhosted.org/packages/32/ea/15670cea95745bba3f0352341db55f506a820b21c619ee66b7d12ea7867d/asyncpg-0.30.0-cp312-cp312-win32.whl", hash = "sha256:68d71a1be3d83d0570049cd1654a9bdfe506e794ecc98ad0873304a9f35e411e", size = 560186, upload_time = "2024-10-20T00:29:52.394Z" }, - { url = "https://files.pythonhosted.org/packages/7e/6b/fe1fad5cee79ca5f5c27aed7bd95baee529c1bf8a387435c8ba4fe53d5c1/asyncpg-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:9a0292c6af5c500523949155ec17b7fe01a00ace33b68a476d6b5059f9630305", size = 621064, upload_time = "2024-10-20T00:29:53.757Z" }, - { url = "https://files.pythonhosted.org/packages/3a/22/e20602e1218dc07692acf70d5b902be820168d6282e69ef0d3cb920dc36f/asyncpg-0.30.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05b185ebb8083c8568ea8a40e896d5f7af4b8554b64d7719c0eaa1eb5a5c3a70", size = 670373, upload_time = "2024-10-20T00:29:55.165Z" }, - { url = "https://files.pythonhosted.org/packages/3d/b3/0cf269a9d647852a95c06eb00b815d0b95a4eb4b55aa2d6ba680971733b9/asyncpg-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c47806b1a8cbb0a0db896f4cd34d89942effe353a5035c62734ab13b9f938da3", size = 634745, upload_time = "2024-10-20T00:29:57.14Z" }, - { url = "https://files.pythonhosted.org/packages/8e/6d/a4f31bf358ce8491d2a31bfe0d7bcf25269e80481e49de4d8616c4295a34/asyncpg-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b6fde867a74e8c76c71e2f64f80c64c0f3163e687f1763cfaf21633ec24ec33", size = 3512103, upload_time = "2024-10-20T00:29:58.499Z" }, - { url = "https://files.pythonhosted.org/packages/96/19/139227a6e67f407b9c386cb594d9628c6c78c9024f26df87c912fabd4368/asyncpg-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46973045b567972128a27d40001124fbc821c87a6cade040cfcd4fa8a30bcdc4", size = 3592471, upload_time = "2024-10-20T00:30:00.354Z" }, - { url = "https://files.pythonhosted.org/packages/67/e4/ab3ca38f628f53f0fd28d3ff20edff1c975dd1cb22482e0061916b4b9a74/asyncpg-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9110df111cabc2ed81aad2f35394a00cadf4f2e0635603db6ebbd0fc896f46a4", size = 3496253, upload_time = "2024-10-20T00:30:02.794Z" }, - { url = "https://files.pythonhosted.org/packages/ef/5f/0bf65511d4eeac3a1f41c54034a492515a707c6edbc642174ae79034d3ba/asyncpg-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04ff0785ae7eed6cc138e73fc67b8e51d54ee7a3ce9b63666ce55a0bf095f7ba", size = 3662720, upload_time = "2024-10-20T00:30:04.501Z" }, - { url = "https://files.pythonhosted.org/packages/e7/31/1513d5a6412b98052c3ed9158d783b1e09d0910f51fbe0e05f56cc370bc4/asyncpg-0.30.0-cp313-cp313-win32.whl", hash = "sha256:ae374585f51c2b444510cdf3595b97ece4f233fde739aa14b50e0d64e8a7a590", size = 560404, upload_time = "2024-10-20T00:30:06.537Z" }, - { url = "https://files.pythonhosted.org/packages/c8/a4/cec76b3389c4c5ff66301cd100fe88c318563ec8a520e0b2e792b5b84972/asyncpg-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:f59b430b8e27557c3fb9869222559f7417ced18688375825f8f12302c34e915e", size = 621623, upload_time = "2024-10-20T00:30:09.024Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/2f/4c/7c991e080e106d854809030d8584e15b2e996e26f16aee6d757e387bc17d/asyncpg-0.30.0.tar.gz", hash = "sha256:c551e9928ab6707602f44811817f82ba3c446e018bfe1d3abecc8ba5f3eac851", size = 957746, upload-time = "2024-10-20T00:30:41.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/0e/f5d708add0d0b97446c402db7e8dd4c4183c13edaabe8a8500b411e7b495/asyncpg-0.30.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5e0511ad3dec5f6b4f7a9e063591d407eee66b88c14e2ea636f187da1dcfff6a", size = 674506, upload-time = "2024-10-20T00:29:27.988Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a0/67ec9a75cb24a1d99f97b8437c8d56da40e6f6bd23b04e2f4ea5d5ad82ac/asyncpg-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:915aeb9f79316b43c3207363af12d0e6fd10776641a7de8a01212afd95bdf0ed", size = 645922, upload-time = "2024-10-20T00:29:29.391Z" }, + { url = "https://files.pythonhosted.org/packages/5c/d9/a7584f24174bd86ff1053b14bb841f9e714380c672f61c906eb01d8ec433/asyncpg-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c198a00cce9506fcd0bf219a799f38ac7a237745e1d27f0e1f66d3707c84a5a", size = 3079565, upload-time = "2024-10-20T00:29:30.832Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d7/a4c0f9660e333114bdb04d1a9ac70db690dd4ae003f34f691139a5cbdae3/asyncpg-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3326e6d7381799e9735ca2ec9fd7be4d5fef5dcbc3cb555d8a463d8460607956", size = 3109962, upload-time = "2024-10-20T00:29:33.114Z" }, + { url = "https://files.pythonhosted.org/packages/3c/21/199fd16b5a981b1575923cbb5d9cf916fdc936b377e0423099f209e7e73d/asyncpg-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:51da377487e249e35bd0859661f6ee2b81db11ad1f4fc036194bc9cb2ead5056", size = 3064791, upload-time = "2024-10-20T00:29:34.677Z" }, + { url = "https://files.pythonhosted.org/packages/77/52/0004809b3427534a0c9139c08c87b515f1c77a8376a50ae29f001e53962f/asyncpg-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc6d84136f9c4d24d358f3b02be4b6ba358abd09f80737d1ac7c444f36108454", size = 3188696, upload-time = "2024-10-20T00:29:36.389Z" }, + { url = "https://files.pythonhosted.org/packages/52/cb/fbad941cd466117be58b774a3f1cc9ecc659af625f028b163b1e646a55fe/asyncpg-0.30.0-cp311-cp311-win32.whl", hash = "sha256:574156480df14f64c2d76450a3f3aaaf26105869cad3865041156b38459e935d", size = 567358, upload-time = "2024-10-20T00:29:37.915Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0a/0a32307cf166d50e1ad120d9b81a33a948a1a5463ebfa5a96cc5606c0863/asyncpg-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:3356637f0bd830407b5597317b3cb3571387ae52ddc3bca6233682be88bbbc1f", size = 629375, upload-time = "2024-10-20T00:29:39.987Z" }, + { url = "https://files.pythonhosted.org/packages/4b/64/9d3e887bb7b01535fdbc45fbd5f0a8447539833b97ee69ecdbb7a79d0cb4/asyncpg-0.30.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c902a60b52e506d38d7e80e0dd5399f657220f24635fee368117b8b5fce1142e", size = 673162, upload-time = "2024-10-20T00:29:41.88Z" }, + { url = "https://files.pythonhosted.org/packages/6e/eb/8b236663f06984f212a087b3e849731f917ab80f84450e943900e8ca4052/asyncpg-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aca1548e43bbb9f0f627a04666fedaca23db0a31a84136ad1f868cb15deb6e3a", size = 637025, upload-time = "2024-10-20T00:29:43.352Z" }, + { url = "https://files.pythonhosted.org/packages/cc/57/2dc240bb263d58786cfaa60920779af6e8d32da63ab9ffc09f8312bd7a14/asyncpg-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c2a2ef565400234a633da0eafdce27e843836256d40705d83ab7ec42074efb3", size = 3496243, upload-time = "2024-10-20T00:29:44.922Z" }, + { url = "https://files.pythonhosted.org/packages/f4/40/0ae9d061d278b10713ea9021ef6b703ec44698fe32178715a501ac696c6b/asyncpg-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1292b84ee06ac8a2ad8e51c7475aa309245874b61333d97411aab835c4a2f737", size = 3575059, upload-time = "2024-10-20T00:29:46.891Z" }, + { url = "https://files.pythonhosted.org/packages/c3/75/d6b895a35a2c6506952247640178e5f768eeb28b2e20299b6a6f1d743ba0/asyncpg-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0f5712350388d0cd0615caec629ad53c81e506b1abaaf8d14c93f54b35e3595a", size = 3473596, upload-time = "2024-10-20T00:29:49.201Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e7/3693392d3e168ab0aebb2d361431375bd22ffc7b4a586a0fc060d519fae7/asyncpg-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:db9891e2d76e6f425746c5d2da01921e9a16b5a71a1c905b13f30e12a257c4af", size = 3641632, upload-time = "2024-10-20T00:29:50.768Z" }, + { url = "https://files.pythonhosted.org/packages/32/ea/15670cea95745bba3f0352341db55f506a820b21c619ee66b7d12ea7867d/asyncpg-0.30.0-cp312-cp312-win32.whl", hash = "sha256:68d71a1be3d83d0570049cd1654a9bdfe506e794ecc98ad0873304a9f35e411e", size = 560186, upload-time = "2024-10-20T00:29:52.394Z" }, + { url = "https://files.pythonhosted.org/packages/7e/6b/fe1fad5cee79ca5f5c27aed7bd95baee529c1bf8a387435c8ba4fe53d5c1/asyncpg-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:9a0292c6af5c500523949155ec17b7fe01a00ace33b68a476d6b5059f9630305", size = 621064, upload-time = "2024-10-20T00:29:53.757Z" }, + { url = "https://files.pythonhosted.org/packages/3a/22/e20602e1218dc07692acf70d5b902be820168d6282e69ef0d3cb920dc36f/asyncpg-0.30.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05b185ebb8083c8568ea8a40e896d5f7af4b8554b64d7719c0eaa1eb5a5c3a70", size = 670373, upload-time = "2024-10-20T00:29:55.165Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b3/0cf269a9d647852a95c06eb00b815d0b95a4eb4b55aa2d6ba680971733b9/asyncpg-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c47806b1a8cbb0a0db896f4cd34d89942effe353a5035c62734ab13b9f938da3", size = 634745, upload-time = "2024-10-20T00:29:57.14Z" }, + { url = "https://files.pythonhosted.org/packages/8e/6d/a4f31bf358ce8491d2a31bfe0d7bcf25269e80481e49de4d8616c4295a34/asyncpg-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b6fde867a74e8c76c71e2f64f80c64c0f3163e687f1763cfaf21633ec24ec33", size = 3512103, upload-time = "2024-10-20T00:29:58.499Z" }, + { url = "https://files.pythonhosted.org/packages/96/19/139227a6e67f407b9c386cb594d9628c6c78c9024f26df87c912fabd4368/asyncpg-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46973045b567972128a27d40001124fbc821c87a6cade040cfcd4fa8a30bcdc4", size = 3592471, upload-time = "2024-10-20T00:30:00.354Z" }, + { url = "https://files.pythonhosted.org/packages/67/e4/ab3ca38f628f53f0fd28d3ff20edff1c975dd1cb22482e0061916b4b9a74/asyncpg-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9110df111cabc2ed81aad2f35394a00cadf4f2e0635603db6ebbd0fc896f46a4", size = 3496253, upload-time = "2024-10-20T00:30:02.794Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5f/0bf65511d4eeac3a1f41c54034a492515a707c6edbc642174ae79034d3ba/asyncpg-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04ff0785ae7eed6cc138e73fc67b8e51d54ee7a3ce9b63666ce55a0bf095f7ba", size = 3662720, upload-time = "2024-10-20T00:30:04.501Z" }, + { url = "https://files.pythonhosted.org/packages/e7/31/1513d5a6412b98052c3ed9158d783b1e09d0910f51fbe0e05f56cc370bc4/asyncpg-0.30.0-cp313-cp313-win32.whl", hash = "sha256:ae374585f51c2b444510cdf3595b97ece4f233fde739aa14b50e0d64e8a7a590", size = 560404, upload-time = "2024-10-20T00:30:06.537Z" }, + { url = "https://files.pythonhosted.org/packages/c8/a4/cec76b3389c4c5ff66301cd100fe88c318563ec8a520e0b2e792b5b84972/asyncpg-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:f59b430b8e27557c3fb9869222559f7417ced18688375825f8f12302c34e915e", size = 621623, upload-time = "2024-10-20T00:30:09.024Z" }, ] [[package]] name = "attrs" version = "25.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload_time = "2025-03-13T11:10:22.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload_time = "2025-03-13T11:10:21.14Z" }, + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, ] [[package]] @@ -191,18 +191,18 @@ dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload_time = "2025-04-15T17:05:13.836Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload-time = "2025-04-15T17:05:13.836Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload_time = "2025-04-15T17:05:12.221Z" }, + { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload-time = "2025-04-15T17:05:12.221Z" }, ] [[package]] name = "boltons" version = "25.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/63/54/71a94d8e02da9a865587fb3fff100cb0fc7aa9f4d5ed9ed3a591216ddcc7/boltons-25.0.0.tar.gz", hash = "sha256:e110fbdc30b7b9868cb604e3f71d4722dd8f4dcb4a5ddd06028ba8f1ab0b5ace", size = 246294, upload_time = "2025-02-03T05:57:59.129Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/54/71a94d8e02da9a865587fb3fff100cb0fc7aa9f4d5ed9ed3a591216ddcc7/boltons-25.0.0.tar.gz", hash = "sha256:e110fbdc30b7b9868cb604e3f71d4722dd8f4dcb4a5ddd06028ba8f1ab0b5ace", size = 246294, upload-time = "2025-02-03T05:57:59.129Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/7f/0e961cf3908bc4c1c3e027de2794f867c6c89fb4916fc7dba295a0e80a2d/boltons-25.0.0-py3-none-any.whl", hash = "sha256:dc9fb38bf28985715497d1b54d00b62ea866eca3938938ea9043e254a3a6ca62", size = 194210, upload_time = "2025-02-03T05:57:56.705Z" }, + { url = "https://files.pythonhosted.org/packages/45/7f/0e961cf3908bc4c1c3e027de2794f867c6c89fb4916fc7dba295a0e80a2d/boltons-25.0.0-py3-none-any.whl", hash = "sha256:dc9fb38bf28985715497d1b54d00b62ea866eca3938938ea9043e254a3a6ca62", size = 194210, upload-time = "2025-02-03T05:57:56.705Z" }, ] [[package]] @@ -212,75 +212,75 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beautifulsoup4" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/aa/4acaf814ff901145da37332e05bb510452ebed97bc9602695059dd46ef39/bs4-0.0.2.tar.gz", hash = "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925", size = 698, upload_time = "2024-01-17T18:15:47.371Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/aa/4acaf814ff901145da37332e05bb510452ebed97bc9602695059dd46ef39/bs4-0.0.2.tar.gz", hash = "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925", size = 698, upload-time = "2024-01-17T18:15:47.371Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/bb/bf7aab772a159614954d84aa832c129624ba6c32faa559dfb200a534e50b/bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc", size = 1189, upload_time = "2024-01-17T18:15:48.613Z" }, + { url = "https://files.pythonhosted.org/packages/51/bb/bf7aab772a159614954d84aa832c129624ba6c32faa559dfb200a534e50b/bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc", size = 1189, upload-time = "2024-01-17T18:15:48.613Z" }, ] [[package]] name = "cachetools" version = "5.5.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380, upload_time = "2025-02-20T21:01:19.524Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380, upload-time = "2025-02-20T21:01:19.524Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080, upload_time = "2025-02-20T21:01:16.647Z" }, + { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080, upload-time = "2025-02-20T21:01:16.647Z" }, ] [[package]] name = "certifi" version = "2025.4.26" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705, upload_time = "2025-04-26T02:12:29.51Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705, upload-time = "2025-04-26T02:12:29.51Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618, upload_time = "2025-04-26T02:12:27.662Z" }, + { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618, upload-time = "2025-04-26T02:12:27.662Z" }, ] [[package]] name = "charset-normalizer" version = "3.4.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload_time = "2025-05-02T08:34:42.01Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload_time = "2025-05-02T08:32:11.945Z" }, - { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload_time = "2025-05-02T08:32:13.946Z" }, - { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload_time = "2025-05-02T08:32:15.873Z" }, - { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload_time = "2025-05-02T08:32:17.283Z" }, - { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload_time = "2025-05-02T08:32:18.807Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload_time = "2025-05-02T08:32:20.333Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload_time = "2025-05-02T08:32:21.86Z" }, - { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload_time = "2025-05-02T08:32:23.434Z" }, - { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload_time = "2025-05-02T08:32:24.993Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload_time = "2025-05-02T08:32:26.435Z" }, - { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload_time = "2025-05-02T08:32:28.376Z" }, - { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload_time = "2025-05-02T08:32:30.281Z" }, - { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload_time = "2025-05-02T08:32:32.191Z" }, - { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload_time = "2025-05-02T08:32:33.712Z" }, - { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload_time = "2025-05-02T08:32:35.768Z" }, - { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload_time = "2025-05-02T08:32:37.284Z" }, - { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload_time = "2025-05-02T08:32:38.803Z" }, - { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload_time = "2025-05-02T08:32:40.251Z" }, - { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload_time = "2025-05-02T08:32:41.705Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload_time = "2025-05-02T08:32:43.709Z" }, - { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload_time = "2025-05-02T08:32:46.197Z" }, - { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload_time = "2025-05-02T08:32:48.105Z" }, - { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload_time = "2025-05-02T08:32:49.719Z" }, - { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload_time = "2025-05-02T08:32:51.404Z" }, - { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload_time = "2025-05-02T08:32:53.079Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload_time = "2025-05-02T08:32:54.573Z" }, - { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload_time = "2025-05-02T08:32:56.363Z" }, - { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload_time = "2025-05-02T08:32:58.551Z" }, - { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload_time = "2025-05-02T08:33:00.342Z" }, - { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload_time = "2025-05-02T08:33:02.081Z" }, - { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload_time = "2025-05-02T08:33:04.063Z" }, - { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload_time = "2025-05-02T08:33:06.418Z" }, - { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload_time = "2025-05-02T08:33:08.183Z" }, - { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload_time = "2025-05-02T08:33:09.986Z" }, - { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload_time = "2025-05-02T08:33:11.814Z" }, - { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload_time = "2025-05-02T08:33:13.707Z" }, - { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload_time = "2025-05-02T08:33:15.458Z" }, - { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload_time = "2025-05-02T08:33:17.06Z" }, - { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload_time = "2025-05-02T08:33:18.753Z" }, - { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload_time = "2025-05-02T08:34:40.053Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload-time = "2025-05-02T08:32:11.945Z" }, + { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload-time = "2025-05-02T08:32:13.946Z" }, + { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload-time = "2025-05-02T08:32:15.873Z" }, + { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload-time = "2025-05-02T08:32:17.283Z" }, + { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload-time = "2025-05-02T08:32:18.807Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload-time = "2025-05-02T08:32:20.333Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload-time = "2025-05-02T08:32:21.86Z" }, + { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload-time = "2025-05-02T08:32:23.434Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload-time = "2025-05-02T08:32:24.993Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload-time = "2025-05-02T08:32:26.435Z" }, + { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload-time = "2025-05-02T08:32:28.376Z" }, + { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload-time = "2025-05-02T08:32:30.281Z" }, + { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload-time = "2025-05-02T08:32:32.191Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload-time = "2025-05-02T08:32:33.712Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload-time = "2025-05-02T08:32:35.768Z" }, + { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload-time = "2025-05-02T08:32:37.284Z" }, + { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload-time = "2025-05-02T08:32:38.803Z" }, + { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload-time = "2025-05-02T08:32:40.251Z" }, + { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload-time = "2025-05-02T08:32:41.705Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload-time = "2025-05-02T08:32:43.709Z" }, + { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload-time = "2025-05-02T08:32:46.197Z" }, + { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload-time = "2025-05-02T08:32:48.105Z" }, + { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload-time = "2025-05-02T08:32:49.719Z" }, + { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload-time = "2025-05-02T08:32:51.404Z" }, + { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload-time = "2025-05-02T08:32:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload-time = "2025-05-02T08:32:54.573Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, ] [[package]] @@ -295,9 +295,9 @@ dependencies = [ { name = "simplejson" }, { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/31/c0131cfe3cdae242699c2889d20016fbe2444dcaf86070ee03863d1035ba/ckanapi-4.8.tar.gz", hash = "sha256:3a98d81e6cb7480883eb1d031740205d3e94176376e9d284d218829d81d0afed", size = 37633, upload_time = "2024-04-04T15:46:09.451Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/31/c0131cfe3cdae242699c2889d20016fbe2444dcaf86070ee03863d1035ba/ckanapi-4.8.tar.gz", hash = "sha256:3a98d81e6cb7480883eb1d031740205d3e94176376e9d284d218829d81d0afed", size = 37633, upload-time = "2024-04-04T15:46:09.451Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/ac/626837e55aeb17f8e3982128a25fbf5f7880a397039eb7a1b5cebaca7fa4/ckanapi-4.8-py3-none-any.whl", hash = "sha256:a6ac36b55321368cf39d70f701542276fe098484517e339adf18595f30c076b8", size = 46316, upload_time = "2024-04-04T15:46:07.725Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ac/626837e55aeb17f8e3982128a25fbf5f7880a397039eb7a1b5cebaca7fa4/ckanapi-4.8-py3-none-any.whl", hash = "sha256:a6ac36b55321368cf39d70f701542276fe098484517e339adf18595f30c076b8", size = 46316, upload-time = "2024-04-04T15:46:07.725Z" }, ] [[package]] @@ -307,18 +307,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cd/0f/62ca20172d4f87d93cf89665fbaedcd560ac48b465bd1d92bfc7ea6b0a41/click-8.2.0.tar.gz", hash = "sha256:f5452aeddd9988eefa20f90f05ab66f17fce1ee2a36907fd30b05bbb5953814d", size = 235857, upload_time = "2025-05-10T22:21:03.111Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/0f/62ca20172d4f87d93cf89665fbaedcd560ac48b465bd1d92bfc7ea6b0a41/click-8.2.0.tar.gz", hash = "sha256:f5452aeddd9988eefa20f90f05ab66f17fce1ee2a36907fd30b05bbb5953814d", size = 235857, upload-time = "2025-05-10T22:21:03.111Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/58/1f37bf81e3c689cc74ffa42102fa8915b59085f54a6e4a80bc6265c0f6bf/click-8.2.0-py3-none-any.whl", hash = "sha256:6b303f0b2aa85f1cb4e5303078fadcbcd4e476f114fab9b5007005711839325c", size = 102156, upload_time = "2025-05-10T22:21:01.352Z" }, + { url = "https://files.pythonhosted.org/packages/a2/58/1f37bf81e3c689cc74ffa42102fa8915b59085f54a6e4a80bc6265c0f6bf/click-8.2.0-py3-none-any.whl", hash = "sha256:6b303f0b2aa85f1cb4e5303078fadcbcd4e476f114fab9b5007005711839325c", size = 102156, upload-time = "2025-05-10T22:21:01.352Z" }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload_time = "2022-10-25T02:36:22.414Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload_time = "2022-10-25T02:36:20.889Z" }, + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] [[package]] @@ -334,6 +334,7 @@ dependencies = [ { name = "bs4" }, { name = "ckanapi" }, { name = "datasets" }, + { name = "discord-poster" }, { name = "docker" }, { name = "environs" }, { name = "fastapi", extra = ["standard"] }, @@ -379,6 +380,7 @@ requires-dist = [ { name = "bs4", specifier = "~=0.0.2" }, { name = "ckanapi", specifier = "~=4.8" }, { name = "datasets", specifier = "~=2.19.1" }, + { name = "discord-poster", specifier = ">=0.1.0" }, { name = "docker", specifier = "~=7.1.0" }, { name = "environs", specifier = ">=14.1.1" }, { name = "fastapi", extras = ["standard"], specifier = "~=0.115.6" }, @@ -435,9 +437,9 @@ dependencies = [ { name = "tqdm" }, { name = "xxhash" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/e7/6ee66732f74e4fb1c8915e58b3c253aded777ad0fa457f3f831dd0cd09b4/datasets-2.19.2.tar.gz", hash = "sha256:eccb82fb3bb5ee26ccc6d7a15b7f1f834e2cc4e59b7cff7733a003552bad51ef", size = 2215337, upload_time = "2024-06-03T05:11:44.756Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/e7/6ee66732f74e4fb1c8915e58b3c253aded777ad0fa457f3f831dd0cd09b4/datasets-2.19.2.tar.gz", hash = "sha256:eccb82fb3bb5ee26ccc6d7a15b7f1f834e2cc4e59b7cff7733a003552bad51ef", size = 2215337, upload-time = "2024-06-03T05:11:44.756Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/59/46818ebeb708234a60e42ccf409d20709e482519d2aa450b501ddbba4594/datasets-2.19.2-py3-none-any.whl", hash = "sha256:e07ff15d75b1af75c87dd96323ba2a361128d495136652f37fd62f918d17bb4e", size = 542113, upload_time = "2024-06-03T05:11:41.151Z" }, + { url = "https://files.pythonhosted.org/packages/3f/59/46818ebeb708234a60e42ccf409d20709e482519d2aa450b501ddbba4594/datasets-2.19.2-py3-none-any.whl", hash = "sha256:e07ff15d75b1af75c87dd96323ba2a361128d495136652f37fd62f918d17bb4e", size = 542113, upload-time = "2024-06-03T05:11:41.151Z" }, ] [[package]] @@ -447,36 +449,48 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "orderly-set" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0a/0f/9cd2624f7dcd755cbf1fa21fb7234541f19a1be96a56f387ec9053ebe220/deepdiff-8.5.0.tar.gz", hash = "sha256:a4dd3529fa8d4cd5b9cbb6e3ea9c95997eaa919ba37dac3966c1b8f872dc1cd1", size = 538517, upload_time = "2025-05-09T18:44:10.035Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/0f/9cd2624f7dcd755cbf1fa21fb7234541f19a1be96a56f387ec9053ebe220/deepdiff-8.5.0.tar.gz", hash = "sha256:a4dd3529fa8d4cd5b9cbb6e3ea9c95997eaa919ba37dac3966c1b8f872dc1cd1", size = 538517, upload-time = "2025-05-09T18:44:10.035Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/3b/2e0797200c51531a6d8c97a8e4c9fa6fb56de7e6e2a15c1c067b6b10a0b0/deepdiff-8.5.0-py3-none-any.whl", hash = "sha256:d4599db637f36a1c285f5fdfc2cd8d38bde8d8be8636b65ab5e425b67c54df26", size = 85112, upload_time = "2025-05-09T18:44:07.784Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3b/2e0797200c51531a6d8c97a8e4c9fa6fb56de7e6e2a15c1c067b6b10a0b0/deepdiff-8.5.0-py3-none-any.whl", hash = "sha256:d4599db637f36a1c285f5fdfc2cd8d38bde8d8be8636b65ab5e425b67c54df26", size = 85112, upload-time = "2025-05-09T18:44:07.784Z" }, ] [[package]] name = "dill" version = "0.3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/17/4d/ac7ffa80c69ea1df30a8aa11b3578692a5118e7cd1aa157e3ef73b092d15/dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", size = 184847, upload_time = "2024-01-27T23:42:16.145Z" } +sdist = { url = "https://files.pythonhosted.org/packages/17/4d/ac7ffa80c69ea1df30a8aa11b3578692a5118e7cd1aa157e3ef73b092d15/dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", size = 184847, upload-time = "2024-01-27T23:42:16.145Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252, upload_time = "2024-01-27T23:42:14.239Z" }, + { url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252, upload-time = "2024-01-27T23:42:14.239Z" }, +] + +[[package]] +name = "discord-poster" +version = "0.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/af2d2b24f9afddebbb258b3b82c58439f0b0a91f0649af34475fbacd39f9/discord_poster-0.1.0.tar.gz", hash = "sha256:3768689a91bb59250c8b1e580903562b041ddd8ed2856abfdaaa88476817be20", size = 2385, upload-time = "2025-04-28T19:19:28.036Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/fe/89f5acd8b0ad8f901792dcc5fd689e537ea373d45d55060d2a0d92648335/discord_poster-0.1.0-py3-none-any.whl", hash = "sha256:eef212ad2454669575a67c702c07a1fddc92334fd17f0ed7881ef25a7880237e", size = 3181, upload-time = "2025-04-28T19:19:26.584Z" }, ] [[package]] name = "distro" version = "1.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload_time = "2023-12-24T09:54:32.31Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload_time = "2023-12-24T09:54:30.421Z" }, + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, ] [[package]] name = "dnspython" version = "2.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197, upload_time = "2024-10-05T20:14:59.362Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197, upload-time = "2024-10-05T20:14:59.362Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632, upload_time = "2024-10-05T20:14:57.687Z" }, + { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632, upload-time = "2024-10-05T20:14:57.687Z" }, ] [[package]] @@ -488,16 +502,16 @@ dependencies = [ { name = "requests" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834, upload_time = "2024-05-23T11:13:57.216Z" } +sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834, upload-time = "2024-05-23T11:13:57.216Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774, upload_time = "2024-05-23T11:13:55.01Z" }, + { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774, upload-time = "2024-05-23T11:13:55.01Z" }, ] [[package]] name = "docopt" version = "0.6.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491", size = 25901, upload_time = "2014-06-16T11:18:57.406Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491", size = 25901, upload-time = "2014-06-16T11:18:57.406Z" } [[package]] name = "email-validator" @@ -507,9 +521,9 @@ dependencies = [ { name = "dnspython" }, { name = "idna" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967, upload_time = "2024-06-20T11:30:30.034Z" } +sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967, upload-time = "2024-06-20T11:30:30.034Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521, upload_time = "2024-06-20T11:30:28.248Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521, upload-time = "2024-06-20T11:30:28.248Z" }, ] [[package]] @@ -520,9 +534,9 @@ dependencies = [ { name = "marshmallow" }, { name = "python-dotenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/31/d3/e82bdbb8cc332e751f67a3f668c5d134d57f983497d9f3a59a375b6e8fd8/environs-14.1.1.tar.gz", hash = "sha256:03db7ee2d50ec697b68814cd175a3a05a7c7954804e4e419ca8b570dc5a835cf", size = 32050, upload_time = "2025-02-10T20:24:26.437Z" } +sdist = { url = "https://files.pythonhosted.org/packages/31/d3/e82bdbb8cc332e751f67a3f668c5d134d57f983497d9f3a59a375b6e8fd8/environs-14.1.1.tar.gz", hash = "sha256:03db7ee2d50ec697b68814cd175a3a05a7c7954804e4e419ca8b570dc5a835cf", size = 32050, upload-time = "2025-02-10T20:24:26.437Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/1c/ab9752f02d32d981d647c05822be9ff93809be8953dacea2da2bec9a9de9/environs-14.1.1-py3-none-any.whl", hash = "sha256:45bc56f1d53bbc59d8dd69bba97377dd88ec28b8229d81cedbd455b21789445b", size = 15566, upload_time = "2025-02-10T20:24:22.116Z" }, + { url = "https://files.pythonhosted.org/packages/f4/1c/ab9752f02d32d981d647c05822be9ff93809be8953dacea2da2bec9a9de9/environs-14.1.1-py3-none-any.whl", hash = "sha256:45bc56f1d53bbc59d8dd69bba97377dd88ec28b8229d81cedbd455b21789445b", size = 15566, upload-time = "2025-02-10T20:24:22.116Z" }, ] [[package]] @@ -534,9 +548,9 @@ dependencies = [ { name = "starlette" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236, upload_time = "2025-03-23T22:55:43.822Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236, upload-time = "2025-03-23T22:55:43.822Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164, upload_time = "2025-03-23T22:55:42.101Z" }, + { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164, upload-time = "2025-03-23T22:55:42.101Z" }, ] [package.optional-dependencies] @@ -558,9 +572,9 @@ dependencies = [ { name = "typer" }, { name = "uvicorn", extra = ["standard"] }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753, upload_time = "2024-12-15T14:28:10.028Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753, upload-time = "2024-12-15T14:28:10.028Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705, upload_time = "2024-12-15T14:28:06.18Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705, upload-time = "2024-12-15T14:28:06.18Z" }, ] [package.optional-dependencies] @@ -572,104 +586,104 @@ standard = [ name = "filelock" version = "3.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload_time = "2025-03-14T07:11:40.47Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload-time = "2025-03-14T07:11:40.47Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload_time = "2025-03-14T07:11:39.145Z" }, + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload-time = "2025-03-14T07:11:39.145Z" }, ] [[package]] name = "from-root" version = "1.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/30/5259cfafc8372df008a5605ca19aba9d560285471ee043f39cbc5a7b7fa2/from_root-1.3.0.tar.gz", hash = "sha256:da1359f5faabca367f685cac927cb2f307bb35c488fdd0361f963d6f1cd2674f", size = 4858, upload_time = "2022-12-27T12:41:25.78Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/30/5259cfafc8372df008a5605ca19aba9d560285471ee043f39cbc5a7b7fa2/from_root-1.3.0.tar.gz", hash = "sha256:da1359f5faabca367f685cac927cb2f307bb35c488fdd0361f963d6f1cd2674f", size = 4858, upload-time = "2022-12-27T12:41:25.78Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/a8/451d0294d5d9ead3d26c25837df0588d1bcdd9235abf91e0ded629369921/from_root-1.3.0-py3-none-any.whl", hash = "sha256:7446a9b6481e668329cc11ad0a234fe4c83c63468c652e037d02846a75c726f8", size = 5489, upload_time = "2022-12-27T12:41:23.989Z" }, + { url = "https://files.pythonhosted.org/packages/33/a8/451d0294d5d9ead3d26c25837df0588d1bcdd9235abf91e0ded629369921/from_root-1.3.0-py3-none-any.whl", hash = "sha256:7446a9b6481e668329cc11ad0a234fe4c83c63468c652e037d02846a75c726f8", size = 5489, upload-time = "2022-12-27T12:41:23.989Z" }, ] [[package]] name = "frozenlist" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/f4/d744cba2da59b5c1d88823cf9e8a6c74e4659e2b27604ed973be2a0bf5ab/frozenlist-1.6.0.tar.gz", hash = "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68", size = 42831, upload_time = "2025-04-17T22:38:53.099Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/53/b5/bc883b5296ec902115c00be161da93bf661199c465ec4c483feec6ea4c32/frozenlist-1.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae8337990e7a45683548ffb2fee1af2f1ed08169284cd829cdd9a7fa7470530d", size = 160912, upload_time = "2025-04-17T22:36:17.235Z" }, - { url = "https://files.pythonhosted.org/packages/6f/93/51b058b563d0704b39c56baa222828043aafcac17fd3734bec5dbeb619b1/frozenlist-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c952f69dd524558694818a461855f35d36cc7f5c0adddce37e962c85d06eac0", size = 124315, upload_time = "2025-04-17T22:36:18.735Z" }, - { url = "https://files.pythonhosted.org/packages/c9/e0/46cd35219428d350558b874d595e132d1c17a9471a1bd0d01d518a261e7c/frozenlist-1.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f5fef13136c4e2dee91bfb9a44e236fff78fc2cd9f838eddfc470c3d7d90afe", size = 122230, upload_time = "2025-04-17T22:36:20.6Z" }, - { url = "https://files.pythonhosted.org/packages/d1/0f/7ad2ce928ad06d6dd26a61812b959ded573d3e9d0ee6109d96c2be7172e9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:716bbba09611b4663ecbb7cd022f640759af8259e12a6ca939c0a6acd49eedba", size = 314842, upload_time = "2025-04-17T22:36:22.088Z" }, - { url = "https://files.pythonhosted.org/packages/34/76/98cbbd8a20a5c3359a2004ae5e5b216af84a150ccbad67c8f8f30fb2ea91/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7b8c4dc422c1a3ffc550b465090e53b0bf4839047f3e436a34172ac67c45d595", size = 304919, upload_time = "2025-04-17T22:36:24.247Z" }, - { url = "https://files.pythonhosted.org/packages/9a/fa/258e771ce3a44348c05e6b01dffc2bc67603fba95761458c238cd09a2c77/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b11534872256e1666116f6587a1592ef395a98b54476addb5e8d352925cb5d4a", size = 324074, upload_time = "2025-04-17T22:36:26.291Z" }, - { url = "https://files.pythonhosted.org/packages/d5/a4/047d861fd8c538210e12b208c0479912273f991356b6bdee7ea8356b07c9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c6eceb88aaf7221f75be6ab498dc622a151f5f88d536661af3ffc486245a626", size = 321292, upload_time = "2025-04-17T22:36:27.909Z" }, - { url = "https://files.pythonhosted.org/packages/c0/25/cfec8af758b4525676cabd36efcaf7102c1348a776c0d1ad046b8a7cdc65/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62c828a5b195570eb4b37369fcbbd58e96c905768d53a44d13044355647838ff", size = 301569, upload_time = "2025-04-17T22:36:29.448Z" }, - { url = "https://files.pythonhosted.org/packages/87/2f/0c819372fa9f0c07b153124bf58683b8d0ca7bb73ea5ccde9b9ef1745beb/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1c6bd2c6399920c9622362ce95a7d74e7f9af9bfec05fff91b8ce4b9647845a", size = 313625, upload_time = "2025-04-17T22:36:31.55Z" }, - { url = "https://files.pythonhosted.org/packages/50/5f/f0cf8b0fdedffdb76b3745aa13d5dbe404d63493cc211ce8250f2025307f/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49ba23817781e22fcbd45fd9ff2b9b8cdb7b16a42a4851ab8025cae7b22e96d0", size = 312523, upload_time = "2025-04-17T22:36:33.078Z" }, - { url = "https://files.pythonhosted.org/packages/e1/6c/38c49108491272d3e84125bbabf2c2d0b304899b52f49f0539deb26ad18d/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:431ef6937ae0f853143e2ca67d6da76c083e8b1fe3df0e96f3802fd37626e606", size = 322657, upload_time = "2025-04-17T22:36:34.688Z" }, - { url = "https://files.pythonhosted.org/packages/bd/4b/3bd3bad5be06a9d1b04b1c22be80b5fe65b502992d62fab4bdb25d9366ee/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9d124b38b3c299ca68433597ee26b7819209cb8a3a9ea761dfe9db3a04bba584", size = 303414, upload_time = "2025-04-17T22:36:36.363Z" }, - { url = "https://files.pythonhosted.org/packages/5b/89/7e225a30bef6e85dbfe22622c24afe932e9444de3b40d58b1ea589a14ef8/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:118e97556306402e2b010da1ef21ea70cb6d6122e580da64c056b96f524fbd6a", size = 320321, upload_time = "2025-04-17T22:36:38.16Z" }, - { url = "https://files.pythonhosted.org/packages/22/72/7e3acef4dd9e86366cb8f4d8f28e852c2b7e116927e9722b31a6f71ea4b0/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb3b309f1d4086b5533cf7bbcf3f956f0ae6469664522f1bde4feed26fba60f1", size = 323975, upload_time = "2025-04-17T22:36:40.289Z" }, - { url = "https://files.pythonhosted.org/packages/d8/85/e5da03d20507e13c66ce612c9792b76811b7a43e3320cce42d95b85ac755/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54dece0d21dce4fdb188a1ffc555926adf1d1c516e493c2914d7c370e454bc9e", size = 316553, upload_time = "2025-04-17T22:36:42.045Z" }, - { url = "https://files.pythonhosted.org/packages/ac/8e/6c609cbd0580ae8a0661c408149f196aade7d325b1ae7adc930501b81acb/frozenlist-1.6.0-cp311-cp311-win32.whl", hash = "sha256:654e4ba1d0b2154ca2f096bed27461cf6160bc7f504a7f9a9ef447c293caf860", size = 115511, upload_time = "2025-04-17T22:36:44.067Z" }, - { url = "https://files.pythonhosted.org/packages/f2/13/a84804cfde6de12d44ed48ecbf777ba62b12ff09e761f76cdd1ff9e14bb1/frozenlist-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e911391bffdb806001002c1f860787542f45916c3baf764264a52765d5a5603", size = 120863, upload_time = "2025-04-17T22:36:45.465Z" }, - { url = "https://files.pythonhosted.org/packages/9c/8a/289b7d0de2fbac832ea80944d809759976f661557a38bb8e77db5d9f79b7/frozenlist-1.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1", size = 160193, upload_time = "2025-04-17T22:36:47.382Z" }, - { url = "https://files.pythonhosted.org/packages/19/80/2fd17d322aec7f430549f0669f599997174f93ee17929ea5b92781ec902c/frozenlist-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29", size = 123831, upload_time = "2025-04-17T22:36:49.401Z" }, - { url = "https://files.pythonhosted.org/packages/99/06/f5812da431273f78c6543e0b2f7de67dfd65eb0a433978b2c9c63d2205e4/frozenlist-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25", size = 121862, upload_time = "2025-04-17T22:36:51.899Z" }, - { url = "https://files.pythonhosted.org/packages/d0/31/9e61c6b5fc493cf24d54881731204d27105234d09878be1a5983182cc4a5/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576", size = 316361, upload_time = "2025-04-17T22:36:53.402Z" }, - { url = "https://files.pythonhosted.org/packages/9d/55/22ca9362d4f0222324981470fd50192be200154d51509ee6eb9baa148e96/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8", size = 307115, upload_time = "2025-04-17T22:36:55.016Z" }, - { url = "https://files.pythonhosted.org/packages/ae/39/4fff42920a57794881e7bb3898dc7f5f539261711ea411b43bba3cde8b79/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9", size = 322505, upload_time = "2025-04-17T22:36:57.12Z" }, - { url = "https://files.pythonhosted.org/packages/55/f2/88c41f374c1e4cf0092a5459e5f3d6a1e17ed274c98087a76487783df90c/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e", size = 322666, upload_time = "2025-04-17T22:36:58.735Z" }, - { url = "https://files.pythonhosted.org/packages/75/51/034eeb75afdf3fd03997856195b500722c0b1a50716664cde64e28299c4b/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590", size = 302119, upload_time = "2025-04-17T22:37:00.512Z" }, - { url = "https://files.pythonhosted.org/packages/2b/a6/564ecde55ee633270a793999ef4fd1d2c2b32b5a7eec903b1012cb7c5143/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103", size = 316226, upload_time = "2025-04-17T22:37:02.102Z" }, - { url = "https://files.pythonhosted.org/packages/f1/c8/6c0682c32377f402b8a6174fb16378b683cf6379ab4d2827c580892ab3c7/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c", size = 312788, upload_time = "2025-04-17T22:37:03.578Z" }, - { url = "https://files.pythonhosted.org/packages/b6/b8/10fbec38f82c5d163ca1750bfff4ede69713badf236a016781cf1f10a0f0/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821", size = 325914, upload_time = "2025-04-17T22:37:05.213Z" }, - { url = "https://files.pythonhosted.org/packages/62/ca/2bf4f3a1bd40cdedd301e6ecfdbb291080d5afc5f9ce350c0739f773d6b9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70", size = 305283, upload_time = "2025-04-17T22:37:06.985Z" }, - { url = "https://files.pythonhosted.org/packages/09/64/20cc13ccf94abc2a1f482f74ad210703dc78a590d0b805af1c9aa67f76f9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f", size = 319264, upload_time = "2025-04-17T22:37:08.618Z" }, - { url = "https://files.pythonhosted.org/packages/20/ff/86c6a2bbe98cfc231519f5e6d712a0898488ceac804a917ce014f32e68f6/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046", size = 326482, upload_time = "2025-04-17T22:37:10.196Z" }, - { url = "https://files.pythonhosted.org/packages/2f/da/8e381f66367d79adca245d1d71527aac774e30e291d41ef161ce2d80c38e/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770", size = 318248, upload_time = "2025-04-17T22:37:12.284Z" }, - { url = "https://files.pythonhosted.org/packages/39/24/1a1976563fb476ab6f0fa9fefaac7616a4361dbe0461324f9fd7bf425dbe/frozenlist-1.6.0-cp312-cp312-win32.whl", hash = "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc", size = 115161, upload_time = "2025-04-17T22:37:13.902Z" }, - { url = "https://files.pythonhosted.org/packages/80/2e/fb4ed62a65f8cd66044706b1013f0010930d8cbb0729a2219561ea075434/frozenlist-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878", size = 120548, upload_time = "2025-04-17T22:37:15.326Z" }, - { url = "https://files.pythonhosted.org/packages/6f/e5/04c7090c514d96ca00887932417f04343ab94904a56ab7f57861bf63652d/frozenlist-1.6.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e", size = 158182, upload_time = "2025-04-17T22:37:16.837Z" }, - { url = "https://files.pythonhosted.org/packages/e9/8f/60d0555c61eec855783a6356268314d204137f5e0c53b59ae2fc28938c99/frozenlist-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117", size = 122838, upload_time = "2025-04-17T22:37:18.352Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a7/d0ec890e3665b4b3b7c05dc80e477ed8dc2e2e77719368e78e2cd9fec9c8/frozenlist-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4", size = 120980, upload_time = "2025-04-17T22:37:19.857Z" }, - { url = "https://files.pythonhosted.org/packages/cc/19/9b355a5e7a8eba903a008579964192c3e427444752f20b2144b10bb336df/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3", size = 305463, upload_time = "2025-04-17T22:37:21.328Z" }, - { url = "https://files.pythonhosted.org/packages/9c/8d/5b4c758c2550131d66935ef2fa700ada2461c08866aef4229ae1554b93ca/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1", size = 297985, upload_time = "2025-04-17T22:37:23.55Z" }, - { url = "https://files.pythonhosted.org/packages/48/2c/537ec09e032b5865715726b2d1d9813e6589b571d34d01550c7aeaad7e53/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c", size = 311188, upload_time = "2025-04-17T22:37:25.221Z" }, - { url = "https://files.pythonhosted.org/packages/31/2f/1aa74b33f74d54817055de9a4961eff798f066cdc6f67591905d4fc82a84/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45", size = 311874, upload_time = "2025-04-17T22:37:26.791Z" }, - { url = "https://files.pythonhosted.org/packages/bf/f0/cfec18838f13ebf4b37cfebc8649db5ea71a1b25dacd691444a10729776c/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f", size = 291897, upload_time = "2025-04-17T22:37:28.958Z" }, - { url = "https://files.pythonhosted.org/packages/ea/a5/deb39325cbbea6cd0a46db8ccd76150ae2fcbe60d63243d9df4a0b8c3205/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85", size = 305799, upload_time = "2025-04-17T22:37:30.889Z" }, - { url = "https://files.pythonhosted.org/packages/78/22/6ddec55c5243a59f605e4280f10cee8c95a449f81e40117163383829c241/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8", size = 302804, upload_time = "2025-04-17T22:37:32.489Z" }, - { url = "https://files.pythonhosted.org/packages/5d/b7/d9ca9bab87f28855063c4d202936800219e39db9e46f9fb004d521152623/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f", size = 316404, upload_time = "2025-04-17T22:37:34.59Z" }, - { url = "https://files.pythonhosted.org/packages/a6/3a/1255305db7874d0b9eddb4fe4a27469e1fb63720f1fc6d325a5118492d18/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f", size = 295572, upload_time = "2025-04-17T22:37:36.337Z" }, - { url = "https://files.pythonhosted.org/packages/2a/f2/8d38eeee39a0e3a91b75867cc102159ecccf441deb6ddf67be96d3410b84/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6", size = 307601, upload_time = "2025-04-17T22:37:37.923Z" }, - { url = "https://files.pythonhosted.org/packages/38/04/80ec8e6b92f61ef085422d7b196822820404f940950dde5b2e367bede8bc/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188", size = 314232, upload_time = "2025-04-17T22:37:39.669Z" }, - { url = "https://files.pythonhosted.org/packages/3a/58/93b41fb23e75f38f453ae92a2f987274c64637c450285577bd81c599b715/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e", size = 308187, upload_time = "2025-04-17T22:37:41.662Z" }, - { url = "https://files.pythonhosted.org/packages/6a/a2/e64df5c5aa36ab3dee5a40d254f3e471bb0603c225f81664267281c46a2d/frozenlist-1.6.0-cp313-cp313-win32.whl", hash = "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4", size = 114772, upload_time = "2025-04-17T22:37:43.132Z" }, - { url = "https://files.pythonhosted.org/packages/a0/77/fead27441e749b2d574bb73d693530d59d520d4b9e9679b8e3cb779d37f2/frozenlist-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd", size = 119847, upload_time = "2025-04-17T22:37:45.118Z" }, - { url = "https://files.pythonhosted.org/packages/df/bd/cc6d934991c1e5d9cafda83dfdc52f987c7b28343686aef2e58a9cf89f20/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64", size = 174937, upload_time = "2025-04-17T22:37:46.635Z" }, - { url = "https://files.pythonhosted.org/packages/f2/a2/daf945f335abdbfdd5993e9dc348ef4507436936ab3c26d7cfe72f4843bf/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91", size = 136029, upload_time = "2025-04-17T22:37:48.192Z" }, - { url = "https://files.pythonhosted.org/packages/51/65/4c3145f237a31247c3429e1c94c384d053f69b52110a0d04bfc8afc55fb2/frozenlist-1.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd", size = 134831, upload_time = "2025-04-17T22:37:50.485Z" }, - { url = "https://files.pythonhosted.org/packages/77/38/03d316507d8dea84dfb99bdd515ea245628af964b2bf57759e3c9205cc5e/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2", size = 392981, upload_time = "2025-04-17T22:37:52.558Z" }, - { url = "https://files.pythonhosted.org/packages/37/02/46285ef9828f318ba400a51d5bb616ded38db8466836a9cfa39f3903260b/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506", size = 371999, upload_time = "2025-04-17T22:37:54.092Z" }, - { url = "https://files.pythonhosted.org/packages/0d/64/1212fea37a112c3c5c05bfb5f0a81af4836ce349e69be75af93f99644da9/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0", size = 392200, upload_time = "2025-04-17T22:37:55.951Z" }, - { url = "https://files.pythonhosted.org/packages/81/ce/9a6ea1763e3366e44a5208f76bf37c76c5da570772375e4d0be85180e588/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0", size = 390134, upload_time = "2025-04-17T22:37:57.633Z" }, - { url = "https://files.pythonhosted.org/packages/bc/36/939738b0b495b2c6d0c39ba51563e453232813042a8d908b8f9544296c29/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e", size = 365208, upload_time = "2025-04-17T22:37:59.742Z" }, - { url = "https://files.pythonhosted.org/packages/b4/8b/939e62e93c63409949c25220d1ba8e88e3960f8ef6a8d9ede8f94b459d27/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c", size = 385548, upload_time = "2025-04-17T22:38:01.416Z" }, - { url = "https://files.pythonhosted.org/packages/62/38/22d2873c90102e06a7c5a3a5b82ca47e393c6079413e8a75c72bff067fa8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b", size = 391123, upload_time = "2025-04-17T22:38:03.049Z" }, - { url = "https://files.pythonhosted.org/packages/44/78/63aaaf533ee0701549500f6d819be092c6065cb5c577edb70c09df74d5d0/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad", size = 394199, upload_time = "2025-04-17T22:38:04.776Z" }, - { url = "https://files.pythonhosted.org/packages/54/45/71a6b48981d429e8fbcc08454dc99c4c2639865a646d549812883e9c9dd3/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215", size = 373854, upload_time = "2025-04-17T22:38:06.576Z" }, - { url = "https://files.pythonhosted.org/packages/3f/f3/dbf2a5e11736ea81a66e37288bf9f881143a7822b288a992579ba1b4204d/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2", size = 395412, upload_time = "2025-04-17T22:38:08.197Z" }, - { url = "https://files.pythonhosted.org/packages/b3/f1/c63166806b331f05104d8ea385c4acd511598568b1f3e4e8297ca54f2676/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911", size = 394936, upload_time = "2025-04-17T22:38:10.056Z" }, - { url = "https://files.pythonhosted.org/packages/ef/ea/4f3e69e179a430473eaa1a75ff986526571215fefc6b9281cdc1f09a4eb8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497", size = 391459, upload_time = "2025-04-17T22:38:11.826Z" }, - { url = "https://files.pythonhosted.org/packages/d3/c3/0fc2c97dea550df9afd072a37c1e95421652e3206bbeaa02378b24c2b480/frozenlist-1.6.0-cp313-cp313t-win32.whl", hash = "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f", size = 128797, upload_time = "2025-04-17T22:38:14.013Z" }, - { url = "https://files.pythonhosted.org/packages/ae/f5/79c9320c5656b1965634fe4be9c82b12a3305bdbc58ad9cb941131107b20/frozenlist-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348", size = 134709, upload_time = "2025-04-17T22:38:15.551Z" }, - { url = "https://files.pythonhosted.org/packages/71/3e/b04a0adda73bd52b390d730071c0d577073d3d26740ee1bad25c3ad0f37b/frozenlist-1.6.0-py3-none-any.whl", hash = "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191", size = 12404, upload_time = "2025-04-17T22:38:51.668Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ee/f4/d744cba2da59b5c1d88823cf9e8a6c74e4659e2b27604ed973be2a0bf5ab/frozenlist-1.6.0.tar.gz", hash = "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68", size = 42831, upload-time = "2025-04-17T22:38:53.099Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/b5/bc883b5296ec902115c00be161da93bf661199c465ec4c483feec6ea4c32/frozenlist-1.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae8337990e7a45683548ffb2fee1af2f1ed08169284cd829cdd9a7fa7470530d", size = 160912, upload-time = "2025-04-17T22:36:17.235Z" }, + { url = "https://files.pythonhosted.org/packages/6f/93/51b058b563d0704b39c56baa222828043aafcac17fd3734bec5dbeb619b1/frozenlist-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c952f69dd524558694818a461855f35d36cc7f5c0adddce37e962c85d06eac0", size = 124315, upload-time = "2025-04-17T22:36:18.735Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e0/46cd35219428d350558b874d595e132d1c17a9471a1bd0d01d518a261e7c/frozenlist-1.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f5fef13136c4e2dee91bfb9a44e236fff78fc2cd9f838eddfc470c3d7d90afe", size = 122230, upload-time = "2025-04-17T22:36:20.6Z" }, + { url = "https://files.pythonhosted.org/packages/d1/0f/7ad2ce928ad06d6dd26a61812b959ded573d3e9d0ee6109d96c2be7172e9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:716bbba09611b4663ecbb7cd022f640759af8259e12a6ca939c0a6acd49eedba", size = 314842, upload-time = "2025-04-17T22:36:22.088Z" }, + { url = "https://files.pythonhosted.org/packages/34/76/98cbbd8a20a5c3359a2004ae5e5b216af84a150ccbad67c8f8f30fb2ea91/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7b8c4dc422c1a3ffc550b465090e53b0bf4839047f3e436a34172ac67c45d595", size = 304919, upload-time = "2025-04-17T22:36:24.247Z" }, + { url = "https://files.pythonhosted.org/packages/9a/fa/258e771ce3a44348c05e6b01dffc2bc67603fba95761458c238cd09a2c77/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b11534872256e1666116f6587a1592ef395a98b54476addb5e8d352925cb5d4a", size = 324074, upload-time = "2025-04-17T22:36:26.291Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a4/047d861fd8c538210e12b208c0479912273f991356b6bdee7ea8356b07c9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c6eceb88aaf7221f75be6ab498dc622a151f5f88d536661af3ffc486245a626", size = 321292, upload-time = "2025-04-17T22:36:27.909Z" }, + { url = "https://files.pythonhosted.org/packages/c0/25/cfec8af758b4525676cabd36efcaf7102c1348a776c0d1ad046b8a7cdc65/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62c828a5b195570eb4b37369fcbbd58e96c905768d53a44d13044355647838ff", size = 301569, upload-time = "2025-04-17T22:36:29.448Z" }, + { url = "https://files.pythonhosted.org/packages/87/2f/0c819372fa9f0c07b153124bf58683b8d0ca7bb73ea5ccde9b9ef1745beb/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1c6bd2c6399920c9622362ce95a7d74e7f9af9bfec05fff91b8ce4b9647845a", size = 313625, upload-time = "2025-04-17T22:36:31.55Z" }, + { url = "https://files.pythonhosted.org/packages/50/5f/f0cf8b0fdedffdb76b3745aa13d5dbe404d63493cc211ce8250f2025307f/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49ba23817781e22fcbd45fd9ff2b9b8cdb7b16a42a4851ab8025cae7b22e96d0", size = 312523, upload-time = "2025-04-17T22:36:33.078Z" }, + { url = "https://files.pythonhosted.org/packages/e1/6c/38c49108491272d3e84125bbabf2c2d0b304899b52f49f0539deb26ad18d/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:431ef6937ae0f853143e2ca67d6da76c083e8b1fe3df0e96f3802fd37626e606", size = 322657, upload-time = "2025-04-17T22:36:34.688Z" }, + { url = "https://files.pythonhosted.org/packages/bd/4b/3bd3bad5be06a9d1b04b1c22be80b5fe65b502992d62fab4bdb25d9366ee/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9d124b38b3c299ca68433597ee26b7819209cb8a3a9ea761dfe9db3a04bba584", size = 303414, upload-time = "2025-04-17T22:36:36.363Z" }, + { url = "https://files.pythonhosted.org/packages/5b/89/7e225a30bef6e85dbfe22622c24afe932e9444de3b40d58b1ea589a14ef8/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:118e97556306402e2b010da1ef21ea70cb6d6122e580da64c056b96f524fbd6a", size = 320321, upload-time = "2025-04-17T22:36:38.16Z" }, + { url = "https://files.pythonhosted.org/packages/22/72/7e3acef4dd9e86366cb8f4d8f28e852c2b7e116927e9722b31a6f71ea4b0/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb3b309f1d4086b5533cf7bbcf3f956f0ae6469664522f1bde4feed26fba60f1", size = 323975, upload-time = "2025-04-17T22:36:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/d8/85/e5da03d20507e13c66ce612c9792b76811b7a43e3320cce42d95b85ac755/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54dece0d21dce4fdb188a1ffc555926adf1d1c516e493c2914d7c370e454bc9e", size = 316553, upload-time = "2025-04-17T22:36:42.045Z" }, + { url = "https://files.pythonhosted.org/packages/ac/8e/6c609cbd0580ae8a0661c408149f196aade7d325b1ae7adc930501b81acb/frozenlist-1.6.0-cp311-cp311-win32.whl", hash = "sha256:654e4ba1d0b2154ca2f096bed27461cf6160bc7f504a7f9a9ef447c293caf860", size = 115511, upload-time = "2025-04-17T22:36:44.067Z" }, + { url = "https://files.pythonhosted.org/packages/f2/13/a84804cfde6de12d44ed48ecbf777ba62b12ff09e761f76cdd1ff9e14bb1/frozenlist-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e911391bffdb806001002c1f860787542f45916c3baf764264a52765d5a5603", size = 120863, upload-time = "2025-04-17T22:36:45.465Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8a/289b7d0de2fbac832ea80944d809759976f661557a38bb8e77db5d9f79b7/frozenlist-1.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1", size = 160193, upload-time = "2025-04-17T22:36:47.382Z" }, + { url = "https://files.pythonhosted.org/packages/19/80/2fd17d322aec7f430549f0669f599997174f93ee17929ea5b92781ec902c/frozenlist-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29", size = 123831, upload-time = "2025-04-17T22:36:49.401Z" }, + { url = "https://files.pythonhosted.org/packages/99/06/f5812da431273f78c6543e0b2f7de67dfd65eb0a433978b2c9c63d2205e4/frozenlist-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25", size = 121862, upload-time = "2025-04-17T22:36:51.899Z" }, + { url = "https://files.pythonhosted.org/packages/d0/31/9e61c6b5fc493cf24d54881731204d27105234d09878be1a5983182cc4a5/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576", size = 316361, upload-time = "2025-04-17T22:36:53.402Z" }, + { url = "https://files.pythonhosted.org/packages/9d/55/22ca9362d4f0222324981470fd50192be200154d51509ee6eb9baa148e96/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8", size = 307115, upload-time = "2025-04-17T22:36:55.016Z" }, + { url = "https://files.pythonhosted.org/packages/ae/39/4fff42920a57794881e7bb3898dc7f5f539261711ea411b43bba3cde8b79/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9", size = 322505, upload-time = "2025-04-17T22:36:57.12Z" }, + { url = "https://files.pythonhosted.org/packages/55/f2/88c41f374c1e4cf0092a5459e5f3d6a1e17ed274c98087a76487783df90c/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e", size = 322666, upload-time = "2025-04-17T22:36:58.735Z" }, + { url = "https://files.pythonhosted.org/packages/75/51/034eeb75afdf3fd03997856195b500722c0b1a50716664cde64e28299c4b/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590", size = 302119, upload-time = "2025-04-17T22:37:00.512Z" }, + { url = "https://files.pythonhosted.org/packages/2b/a6/564ecde55ee633270a793999ef4fd1d2c2b32b5a7eec903b1012cb7c5143/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103", size = 316226, upload-time = "2025-04-17T22:37:02.102Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/6c0682c32377f402b8a6174fb16378b683cf6379ab4d2827c580892ab3c7/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c", size = 312788, upload-time = "2025-04-17T22:37:03.578Z" }, + { url = "https://files.pythonhosted.org/packages/b6/b8/10fbec38f82c5d163ca1750bfff4ede69713badf236a016781cf1f10a0f0/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821", size = 325914, upload-time = "2025-04-17T22:37:05.213Z" }, + { url = "https://files.pythonhosted.org/packages/62/ca/2bf4f3a1bd40cdedd301e6ecfdbb291080d5afc5f9ce350c0739f773d6b9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70", size = 305283, upload-time = "2025-04-17T22:37:06.985Z" }, + { url = "https://files.pythonhosted.org/packages/09/64/20cc13ccf94abc2a1f482f74ad210703dc78a590d0b805af1c9aa67f76f9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f", size = 319264, upload-time = "2025-04-17T22:37:08.618Z" }, + { url = "https://files.pythonhosted.org/packages/20/ff/86c6a2bbe98cfc231519f5e6d712a0898488ceac804a917ce014f32e68f6/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046", size = 326482, upload-time = "2025-04-17T22:37:10.196Z" }, + { url = "https://files.pythonhosted.org/packages/2f/da/8e381f66367d79adca245d1d71527aac774e30e291d41ef161ce2d80c38e/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770", size = 318248, upload-time = "2025-04-17T22:37:12.284Z" }, + { url = "https://files.pythonhosted.org/packages/39/24/1a1976563fb476ab6f0fa9fefaac7616a4361dbe0461324f9fd7bf425dbe/frozenlist-1.6.0-cp312-cp312-win32.whl", hash = "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc", size = 115161, upload-time = "2025-04-17T22:37:13.902Z" }, + { url = "https://files.pythonhosted.org/packages/80/2e/fb4ed62a65f8cd66044706b1013f0010930d8cbb0729a2219561ea075434/frozenlist-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878", size = 120548, upload-time = "2025-04-17T22:37:15.326Z" }, + { url = "https://files.pythonhosted.org/packages/6f/e5/04c7090c514d96ca00887932417f04343ab94904a56ab7f57861bf63652d/frozenlist-1.6.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e", size = 158182, upload-time = "2025-04-17T22:37:16.837Z" }, + { url = "https://files.pythonhosted.org/packages/e9/8f/60d0555c61eec855783a6356268314d204137f5e0c53b59ae2fc28938c99/frozenlist-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117", size = 122838, upload-time = "2025-04-17T22:37:18.352Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a7/d0ec890e3665b4b3b7c05dc80e477ed8dc2e2e77719368e78e2cd9fec9c8/frozenlist-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4", size = 120980, upload-time = "2025-04-17T22:37:19.857Z" }, + { url = "https://files.pythonhosted.org/packages/cc/19/9b355a5e7a8eba903a008579964192c3e427444752f20b2144b10bb336df/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3", size = 305463, upload-time = "2025-04-17T22:37:21.328Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8d/5b4c758c2550131d66935ef2fa700ada2461c08866aef4229ae1554b93ca/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1", size = 297985, upload-time = "2025-04-17T22:37:23.55Z" }, + { url = "https://files.pythonhosted.org/packages/48/2c/537ec09e032b5865715726b2d1d9813e6589b571d34d01550c7aeaad7e53/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c", size = 311188, upload-time = "2025-04-17T22:37:25.221Z" }, + { url = "https://files.pythonhosted.org/packages/31/2f/1aa74b33f74d54817055de9a4961eff798f066cdc6f67591905d4fc82a84/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45", size = 311874, upload-time = "2025-04-17T22:37:26.791Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f0/cfec18838f13ebf4b37cfebc8649db5ea71a1b25dacd691444a10729776c/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f", size = 291897, upload-time = "2025-04-17T22:37:28.958Z" }, + { url = "https://files.pythonhosted.org/packages/ea/a5/deb39325cbbea6cd0a46db8ccd76150ae2fcbe60d63243d9df4a0b8c3205/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85", size = 305799, upload-time = "2025-04-17T22:37:30.889Z" }, + { url = "https://files.pythonhosted.org/packages/78/22/6ddec55c5243a59f605e4280f10cee8c95a449f81e40117163383829c241/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8", size = 302804, upload-time = "2025-04-17T22:37:32.489Z" }, + { url = "https://files.pythonhosted.org/packages/5d/b7/d9ca9bab87f28855063c4d202936800219e39db9e46f9fb004d521152623/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f", size = 316404, upload-time = "2025-04-17T22:37:34.59Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3a/1255305db7874d0b9eddb4fe4a27469e1fb63720f1fc6d325a5118492d18/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f", size = 295572, upload-time = "2025-04-17T22:37:36.337Z" }, + { url = "https://files.pythonhosted.org/packages/2a/f2/8d38eeee39a0e3a91b75867cc102159ecccf441deb6ddf67be96d3410b84/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6", size = 307601, upload-time = "2025-04-17T22:37:37.923Z" }, + { url = "https://files.pythonhosted.org/packages/38/04/80ec8e6b92f61ef085422d7b196822820404f940950dde5b2e367bede8bc/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188", size = 314232, upload-time = "2025-04-17T22:37:39.669Z" }, + { url = "https://files.pythonhosted.org/packages/3a/58/93b41fb23e75f38f453ae92a2f987274c64637c450285577bd81c599b715/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e", size = 308187, upload-time = "2025-04-17T22:37:41.662Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a2/e64df5c5aa36ab3dee5a40d254f3e471bb0603c225f81664267281c46a2d/frozenlist-1.6.0-cp313-cp313-win32.whl", hash = "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4", size = 114772, upload-time = "2025-04-17T22:37:43.132Z" }, + { url = "https://files.pythonhosted.org/packages/a0/77/fead27441e749b2d574bb73d693530d59d520d4b9e9679b8e3cb779d37f2/frozenlist-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd", size = 119847, upload-time = "2025-04-17T22:37:45.118Z" }, + { url = "https://files.pythonhosted.org/packages/df/bd/cc6d934991c1e5d9cafda83dfdc52f987c7b28343686aef2e58a9cf89f20/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64", size = 174937, upload-time = "2025-04-17T22:37:46.635Z" }, + { url = "https://files.pythonhosted.org/packages/f2/a2/daf945f335abdbfdd5993e9dc348ef4507436936ab3c26d7cfe72f4843bf/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91", size = 136029, upload-time = "2025-04-17T22:37:48.192Z" }, + { url = "https://files.pythonhosted.org/packages/51/65/4c3145f237a31247c3429e1c94c384d053f69b52110a0d04bfc8afc55fb2/frozenlist-1.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd", size = 134831, upload-time = "2025-04-17T22:37:50.485Z" }, + { url = "https://files.pythonhosted.org/packages/77/38/03d316507d8dea84dfb99bdd515ea245628af964b2bf57759e3c9205cc5e/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2", size = 392981, upload-time = "2025-04-17T22:37:52.558Z" }, + { url = "https://files.pythonhosted.org/packages/37/02/46285ef9828f318ba400a51d5bb616ded38db8466836a9cfa39f3903260b/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506", size = 371999, upload-time = "2025-04-17T22:37:54.092Z" }, + { url = "https://files.pythonhosted.org/packages/0d/64/1212fea37a112c3c5c05bfb5f0a81af4836ce349e69be75af93f99644da9/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0", size = 392200, upload-time = "2025-04-17T22:37:55.951Z" }, + { url = "https://files.pythonhosted.org/packages/81/ce/9a6ea1763e3366e44a5208f76bf37c76c5da570772375e4d0be85180e588/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0", size = 390134, upload-time = "2025-04-17T22:37:57.633Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/939738b0b495b2c6d0c39ba51563e453232813042a8d908b8f9544296c29/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e", size = 365208, upload-time = "2025-04-17T22:37:59.742Z" }, + { url = "https://files.pythonhosted.org/packages/b4/8b/939e62e93c63409949c25220d1ba8e88e3960f8ef6a8d9ede8f94b459d27/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c", size = 385548, upload-time = "2025-04-17T22:38:01.416Z" }, + { url = "https://files.pythonhosted.org/packages/62/38/22d2873c90102e06a7c5a3a5b82ca47e393c6079413e8a75c72bff067fa8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b", size = 391123, upload-time = "2025-04-17T22:38:03.049Z" }, + { url = "https://files.pythonhosted.org/packages/44/78/63aaaf533ee0701549500f6d819be092c6065cb5c577edb70c09df74d5d0/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad", size = 394199, upload-time = "2025-04-17T22:38:04.776Z" }, + { url = "https://files.pythonhosted.org/packages/54/45/71a6b48981d429e8fbcc08454dc99c4c2639865a646d549812883e9c9dd3/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215", size = 373854, upload-time = "2025-04-17T22:38:06.576Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f3/dbf2a5e11736ea81a66e37288bf9f881143a7822b288a992579ba1b4204d/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2", size = 395412, upload-time = "2025-04-17T22:38:08.197Z" }, + { url = "https://files.pythonhosted.org/packages/b3/f1/c63166806b331f05104d8ea385c4acd511598568b1f3e4e8297ca54f2676/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911", size = 394936, upload-time = "2025-04-17T22:38:10.056Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ea/4f3e69e179a430473eaa1a75ff986526571215fefc6b9281cdc1f09a4eb8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497", size = 391459, upload-time = "2025-04-17T22:38:11.826Z" }, + { url = "https://files.pythonhosted.org/packages/d3/c3/0fc2c97dea550df9afd072a37c1e95421652e3206bbeaa02378b24c2b480/frozenlist-1.6.0-cp313-cp313t-win32.whl", hash = "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f", size = 128797, upload-time = "2025-04-17T22:38:14.013Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f5/79c9320c5656b1965634fe4be9c82b12a3305bdbc58ad9cb941131107b20/frozenlist-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348", size = 134709, upload-time = "2025-04-17T22:38:15.551Z" }, + { url = "https://files.pythonhosted.org/packages/71/3e/b04a0adda73bd52b390d730071c0d577073d3d26740ee1bad25c3ad0f37b/frozenlist-1.6.0-py3-none-any.whl", hash = "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191", size = 12404, upload-time = "2025-04-17T22:38:51.668Z" }, ] [[package]] name = "fsspec" version = "2024.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8b/b8/e3ba21f03c00c27adc9a8cd1cab8adfb37b6024757133924a9a4eab63a83/fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9", size = 170742, upload_time = "2024-03-18T19:35:13.995Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/b8/e3ba21f03c00c27adc9a8cd1cab8adfb37b6024757133924a9a4eab63a83/fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9", size = 170742, upload-time = "2024-03-18T19:35:13.995Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/6d/66d48b03460768f523da62a57a7e14e5e95fdf339d79e996ce3cecda2cdb/fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512", size = 171991, upload_time = "2024-03-18T19:35:11.259Z" }, + { url = "https://files.pythonhosted.org/packages/93/6d/66d48b03460768f523da62a57a7e14e5e95fdf339d79e996ce3cecda2cdb/fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512", size = 171991, upload-time = "2024-03-18T19:35:11.259Z" }, ] [package.optional-dependencies] @@ -688,9 +702,9 @@ dependencies = [ { name = "protobuf" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/09/5c/085bcb872556934bb119e5e09de54daa07873f6866b8f0303c49e72287f7/google_api_core-2.24.2.tar.gz", hash = "sha256:81718493daf06d96d6bc76a91c23874dbf2fac0adbbf542831b805ee6e974696", size = 163516, upload_time = "2025-03-10T15:55:26.201Z" } +sdist = { url = "https://files.pythonhosted.org/packages/09/5c/085bcb872556934bb119e5e09de54daa07873f6866b8f0303c49e72287f7/google_api_core-2.24.2.tar.gz", hash = "sha256:81718493daf06d96d6bc76a91c23874dbf2fac0adbbf542831b805ee6e974696", size = 163516, upload-time = "2025-03-10T15:55:26.201Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/95/f472d85adab6e538da2025dfca9e976a0d125cc0af2301f190e77b76e51c/google_api_core-2.24.2-py3-none-any.whl", hash = "sha256:810a63ac95f3c441b7c0e43d344e372887f62ce9071ba972eacf32672e072de9", size = 160061, upload_time = "2025-03-10T15:55:24.386Z" }, + { url = "https://files.pythonhosted.org/packages/46/95/f472d85adab6e538da2025dfca9e976a0d125cc0af2301f190e77b76e51c/google_api_core-2.24.2-py3-none-any.whl", hash = "sha256:810a63ac95f3c441b7c0e43d344e372887f62ce9071ba972eacf32672e072de9", size = 160061, upload-time = "2025-03-10T15:55:24.386Z" }, ] [[package]] @@ -704,9 +718,9 @@ dependencies = [ { name = "httplib2" }, { name = "uritemplate" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4f/e6/787c24738fc7c99de9289abe60bd64591800ae1cdf60db7b87e0e6ef9cdd/google_api_python_client-2.169.0.tar.gz", hash = "sha256:0585bb97bd5f5bf3ed8d4bf624593e4c5a14d06c811d1952b07a1f94b4d12c51", size = 12811341, upload_time = "2025-04-29T15:46:05.603Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/e6/787c24738fc7c99de9289abe60bd64591800ae1cdf60db7b87e0e6ef9cdd/google_api_python_client-2.169.0.tar.gz", hash = "sha256:0585bb97bd5f5bf3ed8d4bf624593e4c5a14d06c811d1952b07a1f94b4d12c51", size = 12811341, upload-time = "2025-04-29T15:46:05.603Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/bd/6aa93c38756cc9fc63262e0dc3d3f1ff7241ce6f413a25ad6e4a9c98b473/google_api_python_client-2.169.0-py3-none-any.whl", hash = "sha256:dae3e882dc0e6f28e60cf09c1f13fedfd881db84f824dd418aa9e44def2fe00d", size = 13323742, upload_time = "2025-04-29T15:46:02.521Z" }, + { url = "https://files.pythonhosted.org/packages/2d/bd/6aa93c38756cc9fc63262e0dc3d3f1ff7241ce6f413a25ad6e4a9c98b473/google_api_python_client-2.169.0-py3-none-any.whl", hash = "sha256:dae3e882dc0e6f28e60cf09c1f13fedfd881db84f824dd418aa9e44def2fe00d", size = 13323742, upload-time = "2025-04-29T15:46:02.521Z" }, ] [[package]] @@ -718,9 +732,9 @@ dependencies = [ { name = "pyasn1-modules" }, { name = "rsa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/a5/38c21d0e731bb716cffcf987bd9a3555cb95877ab4b616cfb96939933f20/google_auth-2.40.1.tar.gz", hash = "sha256:58f0e8416a9814c1d86c9b7f6acf6816b51aba167b2c76821965271bac275540", size = 280975, upload_time = "2025-05-07T01:04:55.3Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/a5/38c21d0e731bb716cffcf987bd9a3555cb95877ab4b616cfb96939933f20/google_auth-2.40.1.tar.gz", hash = "sha256:58f0e8416a9814c1d86c9b7f6acf6816b51aba167b2c76821965271bac275540", size = 280975, upload-time = "2025-05-07T01:04:55.3Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/b1/1272c6e80847ba5349f5ccb7574596393d1e222543f5003cb810865c3575/google_auth-2.40.1-py2.py3-none-any.whl", hash = "sha256:ed4cae4f5c46b41bae1d19c036e06f6c371926e97b19e816fc854eff811974ee", size = 216101, upload_time = "2025-05-07T01:04:53.612Z" }, + { url = "https://files.pythonhosted.org/packages/a1/b1/1272c6e80847ba5349f5ccb7574596393d1e222543f5003cb810865c3575/google_auth-2.40.1-py2.py3-none-any.whl", hash = "sha256:ed4cae4f5c46b41bae1d19c036e06f6c371926e97b19e816fc854eff811974ee", size = 216101, upload-time = "2025-05-07T01:04:53.612Z" }, ] [[package]] @@ -731,9 +745,9 @@ dependencies = [ { name = "google-auth" }, { name = "httplib2" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/56/be/217a598a818567b28e859ff087f347475c807a5649296fb5a817c58dacef/google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05", size = 10842, upload_time = "2023-12-12T17:40:30.722Z" } +sdist = { url = "https://files.pythonhosted.org/packages/56/be/217a598a818567b28e859ff087f347475c807a5649296fb5a817c58dacef/google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05", size = 10842, upload-time = "2023-12-12T17:40:30.722Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/8a/fe34d2f3f9470a27b01c9e76226965863f153d5fbe276f83608562e49c04/google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d", size = 9253, upload_time = "2023-12-12T17:40:13.055Z" }, + { url = "https://files.pythonhosted.org/packages/be/8a/fe34d2f3f9470a27b01c9e76226965863f153d5fbe276f83608562e49c04/google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d", size = 9253, upload-time = "2023-12-12T17:40:13.055Z" }, ] [[package]] @@ -743,60 +757,60 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/39/24/33db22342cf4a2ea27c9955e6713140fedd51e8b141b5ce5260897020f1a/googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257", size = 145903, upload_time = "2025-04-14T10:17:02.924Z" } +sdist = { url = "https://files.pythonhosted.org/packages/39/24/33db22342cf4a2ea27c9955e6713140fedd51e8b141b5ce5260897020f1a/googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257", size = 145903, upload-time = "2025-04-14T10:17:02.924Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/86/f1/62a193f0227cf15a920390abe675f386dec35f7ae3ffe6da582d3ade42c7/googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8", size = 294530, upload_time = "2025-04-14T10:17:01.271Z" }, + { url = "https://files.pythonhosted.org/packages/86/f1/62a193f0227cf15a920390abe675f386dec35f7ae3ffe6da582d3ade42c7/googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8", size = 294530, upload-time = "2025-04-14T10:17:01.271Z" }, ] [[package]] name = "greenlet" version = "3.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/ff/df5fede753cc10f6a5be0931204ea30c35fa2f2ea7a35b25bdaf4fe40e46/greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", size = 186022, upload_time = "2024-09-20T18:21:04.506Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/28/62/1c2665558618553c42922ed47a4e6d6527e2fa3516a8256c2f431c5d0441/greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70", size = 272479, upload_time = "2024-09-20T17:07:22.332Z" }, - { url = "https://files.pythonhosted.org/packages/76/9d/421e2d5f07285b6e4e3a676b016ca781f63cfe4a0cd8eaecf3fd6f7a71ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159", size = 640404, upload_time = "2024-09-20T17:36:45.588Z" }, - { url = "https://files.pythonhosted.org/packages/e5/de/6e05f5c59262a584e502dd3d261bbdd2c97ab5416cc9c0b91ea38932a901/greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e", size = 652813, upload_time = "2024-09-20T17:39:19.052Z" }, - { url = "https://files.pythonhosted.org/packages/49/93/d5f93c84241acdea15a8fd329362c2c71c79e1a507c3f142a5d67ea435ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1", size = 648517, upload_time = "2024-09-20T17:44:24.101Z" }, - { url = "https://files.pythonhosted.org/packages/15/85/72f77fc02d00470c86a5c982b8daafdf65d38aefbbe441cebff3bf7037fc/greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383", size = 647831, upload_time = "2024-09-20T17:08:40.577Z" }, - { url = "https://files.pythonhosted.org/packages/f7/4b/1c9695aa24f808e156c8f4813f685d975ca73c000c2a5056c514c64980f6/greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a", size = 602413, upload_time = "2024-09-20T17:08:31.728Z" }, - { url = "https://files.pythonhosted.org/packages/76/70/ad6e5b31ef330f03b12559d19fda2606a522d3849cde46b24f223d6d1619/greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511", size = 1129619, upload_time = "2024-09-20T17:44:14.222Z" }, - { url = "https://files.pythonhosted.org/packages/f4/fb/201e1b932e584066e0f0658b538e73c459b34d44b4bd4034f682423bc801/greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395", size = 1155198, upload_time = "2024-09-20T17:09:23.903Z" }, - { url = "https://files.pythonhosted.org/packages/12/da/b9ed5e310bb8b89661b80cbcd4db5a067903bbcd7fc854923f5ebb4144f0/greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39", size = 298930, upload_time = "2024-09-20T17:25:18.656Z" }, - { url = "https://files.pythonhosted.org/packages/7d/ec/bad1ac26764d26aa1353216fcbfa4670050f66d445448aafa227f8b16e80/greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", size = 274260, upload_time = "2024-09-20T17:08:07.301Z" }, - { url = "https://files.pythonhosted.org/packages/66/d4/c8c04958870f482459ab5956c2942c4ec35cac7fe245527f1039837c17a9/greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", size = 649064, upload_time = "2024-09-20T17:36:47.628Z" }, - { url = "https://files.pythonhosted.org/packages/51/41/467b12a8c7c1303d20abcca145db2be4e6cd50a951fa30af48b6ec607581/greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", size = 663420, upload_time = "2024-09-20T17:39:21.258Z" }, - { url = "https://files.pythonhosted.org/packages/27/8f/2a93cd9b1e7107d5c7b3b7816eeadcac2ebcaf6d6513df9abaf0334777f6/greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", size = 658035, upload_time = "2024-09-20T17:44:26.501Z" }, - { url = "https://files.pythonhosted.org/packages/57/5c/7c6f50cb12be092e1dccb2599be5a942c3416dbcfb76efcf54b3f8be4d8d/greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", size = 660105, upload_time = "2024-09-20T17:08:42.048Z" }, - { url = "https://files.pythonhosted.org/packages/f1/66/033e58a50fd9ec9df00a8671c74f1f3a320564c6415a4ed82a1c651654ba/greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", size = 613077, upload_time = "2024-09-20T17:08:33.707Z" }, - { url = "https://files.pythonhosted.org/packages/19/c5/36384a06f748044d06bdd8776e231fadf92fc896bd12cb1c9f5a1bda9578/greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", size = 1135975, upload_time = "2024-09-20T17:44:15.989Z" }, - { url = "https://files.pythonhosted.org/packages/38/f9/c0a0eb61bdf808d23266ecf1d63309f0e1471f284300ce6dac0ae1231881/greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", size = 1163955, upload_time = "2024-09-20T17:09:25.539Z" }, - { url = "https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", size = 299655, upload_time = "2024-09-20T17:21:22.427Z" }, - { url = "https://files.pythonhosted.org/packages/f3/57/0db4940cd7bb461365ca8d6fd53e68254c9dbbcc2b452e69d0d41f10a85e/greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", size = 272990, upload_time = "2024-09-20T17:08:26.312Z" }, - { url = "https://files.pythonhosted.org/packages/1c/ec/423d113c9f74e5e402e175b157203e9102feeb7088cee844d735b28ef963/greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", size = 649175, upload_time = "2024-09-20T17:36:48.983Z" }, - { url = "https://files.pythonhosted.org/packages/a9/46/ddbd2db9ff209186b7b7c621d1432e2f21714adc988703dbdd0e65155c77/greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", size = 663425, upload_time = "2024-09-20T17:39:22.705Z" }, - { url = "https://files.pythonhosted.org/packages/bc/f9/9c82d6b2b04aa37e38e74f0c429aece5eeb02bab6e3b98e7db89b23d94c6/greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", size = 657736, upload_time = "2024-09-20T17:44:28.544Z" }, - { url = "https://files.pythonhosted.org/packages/d9/42/b87bc2a81e3a62c3de2b0d550bf91a86939442b7ff85abb94eec3fc0e6aa/greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", size = 660347, upload_time = "2024-09-20T17:08:45.56Z" }, - { url = "https://files.pythonhosted.org/packages/37/fa/71599c3fd06336cdc3eac52e6871cfebab4d9d70674a9a9e7a482c318e99/greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", size = 615583, upload_time = "2024-09-20T17:08:36.85Z" }, - { url = "https://files.pythonhosted.org/packages/4e/96/e9ef85de031703ee7a4483489b40cf307f93c1824a02e903106f2ea315fe/greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", size = 1133039, upload_time = "2024-09-20T17:44:18.287Z" }, - { url = "https://files.pythonhosted.org/packages/87/76/b2b6362accd69f2d1889db61a18c94bc743e961e3cab344c2effaa4b4a25/greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", size = 1160716, upload_time = "2024-09-20T17:09:27.112Z" }, - { url = "https://files.pythonhosted.org/packages/1f/1b/54336d876186920e185066d8c3024ad55f21d7cc3683c856127ddb7b13ce/greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", size = 299490, upload_time = "2024-09-20T17:17:09.501Z" }, - { url = "https://files.pythonhosted.org/packages/5f/17/bea55bf36990e1638a2af5ba10c1640273ef20f627962cf97107f1e5d637/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", size = 643731, upload_time = "2024-09-20T17:36:50.376Z" }, - { url = "https://files.pythonhosted.org/packages/78/d2/aa3d2157f9ab742a08e0fd8f77d4699f37c22adfbfeb0c610a186b5f75e0/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", size = 649304, upload_time = "2024-09-20T17:39:24.55Z" }, - { url = "https://files.pythonhosted.org/packages/f1/8e/d0aeffe69e53ccff5a28fa86f07ad1d2d2d6537a9506229431a2a02e2f15/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", size = 646537, upload_time = "2024-09-20T17:44:31.102Z" }, - { url = "https://files.pythonhosted.org/packages/05/79/e15408220bbb989469c8871062c97c6c9136770657ba779711b90870d867/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", size = 642506, upload_time = "2024-09-20T17:08:47.852Z" }, - { url = "https://files.pythonhosted.org/packages/18/87/470e01a940307796f1d25f8167b551a968540fbe0551c0ebb853cb527dd6/greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", size = 602753, upload_time = "2024-09-20T17:08:38.079Z" }, - { url = "https://files.pythonhosted.org/packages/e2/72/576815ba674eddc3c25028238f74d7b8068902b3968cbe456771b166455e/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", size = 1122731, upload_time = "2024-09-20T17:44:20.556Z" }, - { url = "https://files.pythonhosted.org/packages/ac/38/08cc303ddddc4b3d7c628c3039a61a3aae36c241ed01393d00c2fd663473/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", size = 1142112, upload_time = "2024-09-20T17:09:28.753Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/2f/ff/df5fede753cc10f6a5be0931204ea30c35fa2f2ea7a35b25bdaf4fe40e46/greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", size = 186022, upload-time = "2024-09-20T18:21:04.506Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/62/1c2665558618553c42922ed47a4e6d6527e2fa3516a8256c2f431c5d0441/greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70", size = 272479, upload-time = "2024-09-20T17:07:22.332Z" }, + { url = "https://files.pythonhosted.org/packages/76/9d/421e2d5f07285b6e4e3a676b016ca781f63cfe4a0cd8eaecf3fd6f7a71ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159", size = 640404, upload-time = "2024-09-20T17:36:45.588Z" }, + { url = "https://files.pythonhosted.org/packages/e5/de/6e05f5c59262a584e502dd3d261bbdd2c97ab5416cc9c0b91ea38932a901/greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e", size = 652813, upload-time = "2024-09-20T17:39:19.052Z" }, + { url = "https://files.pythonhosted.org/packages/49/93/d5f93c84241acdea15a8fd329362c2c71c79e1a507c3f142a5d67ea435ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1", size = 648517, upload-time = "2024-09-20T17:44:24.101Z" }, + { url = "https://files.pythonhosted.org/packages/15/85/72f77fc02d00470c86a5c982b8daafdf65d38aefbbe441cebff3bf7037fc/greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383", size = 647831, upload-time = "2024-09-20T17:08:40.577Z" }, + { url = "https://files.pythonhosted.org/packages/f7/4b/1c9695aa24f808e156c8f4813f685d975ca73c000c2a5056c514c64980f6/greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a", size = 602413, upload-time = "2024-09-20T17:08:31.728Z" }, + { url = "https://files.pythonhosted.org/packages/76/70/ad6e5b31ef330f03b12559d19fda2606a522d3849cde46b24f223d6d1619/greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511", size = 1129619, upload-time = "2024-09-20T17:44:14.222Z" }, + { url = "https://files.pythonhosted.org/packages/f4/fb/201e1b932e584066e0f0658b538e73c459b34d44b4bd4034f682423bc801/greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395", size = 1155198, upload-time = "2024-09-20T17:09:23.903Z" }, + { url = "https://files.pythonhosted.org/packages/12/da/b9ed5e310bb8b89661b80cbcd4db5a067903bbcd7fc854923f5ebb4144f0/greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39", size = 298930, upload-time = "2024-09-20T17:25:18.656Z" }, + { url = "https://files.pythonhosted.org/packages/7d/ec/bad1ac26764d26aa1353216fcbfa4670050f66d445448aafa227f8b16e80/greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", size = 274260, upload-time = "2024-09-20T17:08:07.301Z" }, + { url = "https://files.pythonhosted.org/packages/66/d4/c8c04958870f482459ab5956c2942c4ec35cac7fe245527f1039837c17a9/greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", size = 649064, upload-time = "2024-09-20T17:36:47.628Z" }, + { url = "https://files.pythonhosted.org/packages/51/41/467b12a8c7c1303d20abcca145db2be4e6cd50a951fa30af48b6ec607581/greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", size = 663420, upload-time = "2024-09-20T17:39:21.258Z" }, + { url = "https://files.pythonhosted.org/packages/27/8f/2a93cd9b1e7107d5c7b3b7816eeadcac2ebcaf6d6513df9abaf0334777f6/greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", size = 658035, upload-time = "2024-09-20T17:44:26.501Z" }, + { url = "https://files.pythonhosted.org/packages/57/5c/7c6f50cb12be092e1dccb2599be5a942c3416dbcfb76efcf54b3f8be4d8d/greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", size = 660105, upload-time = "2024-09-20T17:08:42.048Z" }, + { url = "https://files.pythonhosted.org/packages/f1/66/033e58a50fd9ec9df00a8671c74f1f3a320564c6415a4ed82a1c651654ba/greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", size = 613077, upload-time = "2024-09-20T17:08:33.707Z" }, + { url = "https://files.pythonhosted.org/packages/19/c5/36384a06f748044d06bdd8776e231fadf92fc896bd12cb1c9f5a1bda9578/greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", size = 1135975, upload-time = "2024-09-20T17:44:15.989Z" }, + { url = "https://files.pythonhosted.org/packages/38/f9/c0a0eb61bdf808d23266ecf1d63309f0e1471f284300ce6dac0ae1231881/greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", size = 1163955, upload-time = "2024-09-20T17:09:25.539Z" }, + { url = "https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", size = 299655, upload-time = "2024-09-20T17:21:22.427Z" }, + { url = "https://files.pythonhosted.org/packages/f3/57/0db4940cd7bb461365ca8d6fd53e68254c9dbbcc2b452e69d0d41f10a85e/greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", size = 272990, upload-time = "2024-09-20T17:08:26.312Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ec/423d113c9f74e5e402e175b157203e9102feeb7088cee844d735b28ef963/greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", size = 649175, upload-time = "2024-09-20T17:36:48.983Z" }, + { url = "https://files.pythonhosted.org/packages/a9/46/ddbd2db9ff209186b7b7c621d1432e2f21714adc988703dbdd0e65155c77/greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", size = 663425, upload-time = "2024-09-20T17:39:22.705Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f9/9c82d6b2b04aa37e38e74f0c429aece5eeb02bab6e3b98e7db89b23d94c6/greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", size = 657736, upload-time = "2024-09-20T17:44:28.544Z" }, + { url = "https://files.pythonhosted.org/packages/d9/42/b87bc2a81e3a62c3de2b0d550bf91a86939442b7ff85abb94eec3fc0e6aa/greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", size = 660347, upload-time = "2024-09-20T17:08:45.56Z" }, + { url = "https://files.pythonhosted.org/packages/37/fa/71599c3fd06336cdc3eac52e6871cfebab4d9d70674a9a9e7a482c318e99/greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", size = 615583, upload-time = "2024-09-20T17:08:36.85Z" }, + { url = "https://files.pythonhosted.org/packages/4e/96/e9ef85de031703ee7a4483489b40cf307f93c1824a02e903106f2ea315fe/greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", size = 1133039, upload-time = "2024-09-20T17:44:18.287Z" }, + { url = "https://files.pythonhosted.org/packages/87/76/b2b6362accd69f2d1889db61a18c94bc743e961e3cab344c2effaa4b4a25/greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", size = 1160716, upload-time = "2024-09-20T17:09:27.112Z" }, + { url = "https://files.pythonhosted.org/packages/1f/1b/54336d876186920e185066d8c3024ad55f21d7cc3683c856127ddb7b13ce/greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", size = 299490, upload-time = "2024-09-20T17:17:09.501Z" }, + { url = "https://files.pythonhosted.org/packages/5f/17/bea55bf36990e1638a2af5ba10c1640273ef20f627962cf97107f1e5d637/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", size = 643731, upload-time = "2024-09-20T17:36:50.376Z" }, + { url = "https://files.pythonhosted.org/packages/78/d2/aa3d2157f9ab742a08e0fd8f77d4699f37c22adfbfeb0c610a186b5f75e0/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", size = 649304, upload-time = "2024-09-20T17:39:24.55Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8e/d0aeffe69e53ccff5a28fa86f07ad1d2d2d6537a9506229431a2a02e2f15/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", size = 646537, upload-time = "2024-09-20T17:44:31.102Z" }, + { url = "https://files.pythonhosted.org/packages/05/79/e15408220bbb989469c8871062c97c6c9136770657ba779711b90870d867/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", size = 642506, upload-time = "2024-09-20T17:08:47.852Z" }, + { url = "https://files.pythonhosted.org/packages/18/87/470e01a940307796f1d25f8167b551a968540fbe0551c0ebb853cb527dd6/greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", size = 602753, upload-time = "2024-09-20T17:08:38.079Z" }, + { url = "https://files.pythonhosted.org/packages/e2/72/576815ba674eddc3c25028238f74d7b8068902b3968cbe456771b166455e/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", size = 1122731, upload-time = "2024-09-20T17:44:20.556Z" }, + { url = "https://files.pythonhosted.org/packages/ac/38/08cc303ddddc4b3d7c628c3039a61a3aae36c241ed01393d00c2fd663473/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", size = 1142112, upload-time = "2024-09-20T17:09:28.753Z" }, ] [[package]] name = "h11" version = "0.16.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload_time = "2025-04-24T03:35:25.427Z" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload_time = "2025-04-24T03:35:24.344Z" }, + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, ] [[package]] @@ -807,9 +821,9 @@ dependencies = [ { name = "certifi" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload_time = "2025-04-24T22:06:22.219Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload_time = "2025-04-24T22:06:20.566Z" }, + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, ] [[package]] @@ -819,38 +833,38 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyparsing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3d/ad/2371116b22d616c194aa25ec410c9c6c37f23599dcd590502b74db197584/httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81", size = 351116, upload_time = "2023-03-21T22:29:37.214Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/ad/2371116b22d616c194aa25ec410c9c6c37f23599dcd590502b74db197584/httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81", size = 351116, upload-time = "2023-03-21T22:29:37.214Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/6c/d2fbdaaa5959339d53ba38e94c123e4e84b8fbc4b84beb0e70d7c1608486/httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc", size = 96854, upload_time = "2023-03-21T22:29:35.683Z" }, + { url = "https://files.pythonhosted.org/packages/a8/6c/d2fbdaaa5959339d53ba38e94c123e4e84b8fbc4b84beb0e70d7c1608486/httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc", size = 96854, upload-time = "2023-03-21T22:29:35.683Z" }, ] [[package]] name = "httptools" version = "0.6.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639, upload_time = "2024-10-16T19:45:08.902Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/26/bb526d4d14c2774fe07113ca1db7255737ffbb119315839af2065abfdac3/httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069", size = 199029, upload_time = "2024-10-16T19:44:18.427Z" }, - { url = "https://files.pythonhosted.org/packages/a6/17/3e0d3e9b901c732987a45f4f94d4e2c62b89a041d93db89eafb262afd8d5/httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a", size = 103492, upload_time = "2024-10-16T19:44:19.515Z" }, - { url = "https://files.pythonhosted.org/packages/b7/24/0fe235d7b69c42423c7698d086d4db96475f9b50b6ad26a718ef27a0bce6/httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975", size = 462891, upload_time = "2024-10-16T19:44:21.067Z" }, - { url = "https://files.pythonhosted.org/packages/b1/2f/205d1f2a190b72da6ffb5f41a3736c26d6fa7871101212b15e9b5cd8f61d/httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636", size = 459788, upload_time = "2024-10-16T19:44:22.958Z" }, - { url = "https://files.pythonhosted.org/packages/6e/4c/d09ce0eff09057a206a74575ae8f1e1e2f0364d20e2442224f9e6612c8b9/httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721", size = 433214, upload_time = "2024-10-16T19:44:24.513Z" }, - { url = "https://files.pythonhosted.org/packages/3e/d2/84c9e23edbccc4a4c6f96a1b8d99dfd2350289e94f00e9ccc7aadde26fb5/httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988", size = 434120, upload_time = "2024-10-16T19:44:26.295Z" }, - { url = "https://files.pythonhosted.org/packages/d0/46/4d8e7ba9581416de1c425b8264e2cadd201eb709ec1584c381f3e98f51c1/httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17", size = 88565, upload_time = "2024-10-16T19:44:29.188Z" }, - { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683, upload_time = "2024-10-16T19:44:30.175Z" }, - { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337, upload_time = "2024-10-16T19:44:31.786Z" }, - { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796, upload_time = "2024-10-16T19:44:32.825Z" }, - { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837, upload_time = "2024-10-16T19:44:33.974Z" }, - { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289, upload_time = "2024-10-16T19:44:35.111Z" }, - { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779, upload_time = "2024-10-16T19:44:36.253Z" }, - { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634, upload_time = "2024-10-16T19:44:37.357Z" }, - { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214, upload_time = "2024-10-16T19:44:38.738Z" }, - { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431, upload_time = "2024-10-16T19:44:39.818Z" }, - { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121, upload_time = "2024-10-16T19:44:41.189Z" }, - { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805, upload_time = "2024-10-16T19:44:42.384Z" }, - { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858, upload_time = "2024-10-16T19:44:43.959Z" }, - { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042, upload_time = "2024-10-16T19:44:45.071Z" }, - { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682, upload_time = "2024-10-16T19:44:46.46Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639, upload-time = "2024-10-16T19:45:08.902Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/26/bb526d4d14c2774fe07113ca1db7255737ffbb119315839af2065abfdac3/httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069", size = 199029, upload-time = "2024-10-16T19:44:18.427Z" }, + { url = "https://files.pythonhosted.org/packages/a6/17/3e0d3e9b901c732987a45f4f94d4e2c62b89a041d93db89eafb262afd8d5/httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a", size = 103492, upload-time = "2024-10-16T19:44:19.515Z" }, + { url = "https://files.pythonhosted.org/packages/b7/24/0fe235d7b69c42423c7698d086d4db96475f9b50b6ad26a718ef27a0bce6/httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975", size = 462891, upload-time = "2024-10-16T19:44:21.067Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2f/205d1f2a190b72da6ffb5f41a3736c26d6fa7871101212b15e9b5cd8f61d/httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636", size = 459788, upload-time = "2024-10-16T19:44:22.958Z" }, + { url = "https://files.pythonhosted.org/packages/6e/4c/d09ce0eff09057a206a74575ae8f1e1e2f0364d20e2442224f9e6612c8b9/httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721", size = 433214, upload-time = "2024-10-16T19:44:24.513Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/84c9e23edbccc4a4c6f96a1b8d99dfd2350289e94f00e9ccc7aadde26fb5/httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988", size = 434120, upload-time = "2024-10-16T19:44:26.295Z" }, + { url = "https://files.pythonhosted.org/packages/d0/46/4d8e7ba9581416de1c425b8264e2cadd201eb709ec1584c381f3e98f51c1/httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17", size = 88565, upload-time = "2024-10-16T19:44:29.188Z" }, + { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683, upload-time = "2024-10-16T19:44:30.175Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337, upload-time = "2024-10-16T19:44:31.786Z" }, + { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796, upload-time = "2024-10-16T19:44:32.825Z" }, + { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837, upload-time = "2024-10-16T19:44:33.974Z" }, + { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289, upload-time = "2024-10-16T19:44:35.111Z" }, + { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779, upload-time = "2024-10-16T19:44:36.253Z" }, + { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634, upload-time = "2024-10-16T19:44:37.357Z" }, + { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214, upload-time = "2024-10-16T19:44:38.738Z" }, + { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431, upload-time = "2024-10-16T19:44:39.818Z" }, + { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121, upload-time = "2024-10-16T19:44:41.189Z" }, + { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805, upload-time = "2024-10-16T19:44:42.384Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858, upload-time = "2024-10-16T19:44:43.959Z" }, + { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042, upload-time = "2024-10-16T19:44:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682, upload-time = "2024-10-16T19:44:46.46Z" }, ] [[package]] @@ -863,9 +877,9 @@ dependencies = [ { name = "httpcore" }, { name = "idna" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload_time = "2024-12-06T15:37:23.222Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload_time = "2024-12-06T15:37:21.509Z" }, + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, ] [[package]] @@ -881,27 +895,27 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e7/ce/a734204aaae6c35a22f9956ebcd8d8708ae5b842e15d6f42bd6f49e634a4/huggingface_hub-0.28.1.tar.gz", hash = "sha256:893471090c98e3b6efbdfdacafe4052b20b84d59866fb6f54c33d9af18c303ae", size = 387074, upload_time = "2025-01-30T13:45:41.519Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/ce/a734204aaae6c35a22f9956ebcd8d8708ae5b842e15d6f42bd6f49e634a4/huggingface_hub-0.28.1.tar.gz", hash = "sha256:893471090c98e3b6efbdfdacafe4052b20b84d59866fb6f54c33d9af18c303ae", size = 387074, upload-time = "2025-01-30T13:45:41.519Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/da/6c2bea5327b640920267d3bf2c9fc114cfbd0a5de234d81cda80cc9e33c8/huggingface_hub-0.28.1-py3-none-any.whl", hash = "sha256:aa6b9a3ffdae939b72c464dbb0d7f99f56e649b55c3d52406f49e0a5a620c0a7", size = 464068, upload_time = "2025-01-30T13:45:39.514Z" }, + { url = "https://files.pythonhosted.org/packages/ea/da/6c2bea5327b640920267d3bf2c9fc114cfbd0a5de234d81cda80cc9e33c8/huggingface_hub-0.28.1-py3-none-any.whl", hash = "sha256:aa6b9a3ffdae939b72c464dbb0d7f99f56e649b55c3d52406f49e0a5a620c0a7", size = 464068, upload-time = "2025-01-30T13:45:39.514Z" }, ] [[package]] name = "idna" version = "3.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload_time = "2024-09-15T18:07:39.745Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload_time = "2024-09-15T18:07:37.964Z" }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, ] [[package]] name = "iniconfig" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload_time = "2025-03-19T20:09:59.721Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload_time = "2025-03-19T20:10:01.071Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, ] [[package]] @@ -911,82 +925,82 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload_time = "2025-03-05T20:05:02.478Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload_time = "2025-03-05T20:05:00.369Z" }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] [[package]] name = "jiter" version = "0.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1e/c2/e4562507f52f0af7036da125bb699602ead37a2332af0788f8e0a3417f36/jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893", size = 162604, upload_time = "2025-03-10T21:37:03.278Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/23/44/e241a043f114299254e44d7e777ead311da400517f179665e59611ab0ee4/jiter-0.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6c4d99c71508912a7e556d631768dcdef43648a93660670986916b297f1c54af", size = 314654, upload_time = "2025-03-10T21:35:23.939Z" }, - { url = "https://files.pythonhosted.org/packages/fb/1b/a7e5e42db9fa262baaa9489d8d14ca93f8663e7f164ed5e9acc9f467fc00/jiter-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f60fb8ce7df529812bf6c625635a19d27f30806885139e367af93f6e734ef58", size = 320909, upload_time = "2025-03-10T21:35:26.127Z" }, - { url = "https://files.pythonhosted.org/packages/60/bf/8ebdfce77bc04b81abf2ea316e9c03b4a866a7d739cf355eae4d6fd9f6fe/jiter-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51c4e1a4f8ea84d98b7b98912aa4290ac3d1eabfde8e3c34541fae30e9d1f08b", size = 341733, upload_time = "2025-03-10T21:35:27.94Z" }, - { url = "https://files.pythonhosted.org/packages/a8/4e/754ebce77cff9ab34d1d0fa0fe98f5d42590fd33622509a3ba6ec37ff466/jiter-0.9.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f4c677c424dc76684fea3e7285a7a2a7493424bea89ac441045e6a1fb1d7b3b", size = 365097, upload_time = "2025-03-10T21:35:29.605Z" }, - { url = "https://files.pythonhosted.org/packages/32/2c/6019587e6f5844c612ae18ca892f4cd7b3d8bbf49461ed29e384a0f13d98/jiter-0.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2221176dfec87f3470b21e6abca056e6b04ce9bff72315cb0b243ca9e835a4b5", size = 406603, upload_time = "2025-03-10T21:35:31.696Z" }, - { url = "https://files.pythonhosted.org/packages/da/e9/c9e6546c817ab75a1a7dab6dcc698e62e375e1017113e8e983fccbd56115/jiter-0.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c7adb66f899ffa25e3c92bfcb593391ee1947dbdd6a9a970e0d7e713237d572", size = 396625, upload_time = "2025-03-10T21:35:33.182Z" }, - { url = "https://files.pythonhosted.org/packages/be/bd/976b458add04271ebb5a255e992bd008546ea04bb4dcadc042a16279b4b4/jiter-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c98d27330fdfb77913c1097a7aab07f38ff2259048949f499c9901700789ac15", size = 351832, upload_time = "2025-03-10T21:35:35.394Z" }, - { url = "https://files.pythonhosted.org/packages/07/51/fe59e307aaebec9265dbad44d9d4381d030947e47b0f23531579b9a7c2df/jiter-0.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eda3f8cc74df66892b1d06b5d41a71670c22d95a1ca2cbab73654745ce9d0419", size = 384590, upload_time = "2025-03-10T21:35:37.171Z" }, - { url = "https://files.pythonhosted.org/packages/db/55/5dcd2693794d8e6f4889389ff66ef3be557a77f8aeeca8973a97a7c00557/jiter-0.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd5ab5ddc11418dce28343123644a100f487eaccf1de27a459ab36d6cca31043", size = 520690, upload_time = "2025-03-10T21:35:38.717Z" }, - { url = "https://files.pythonhosted.org/packages/54/d5/9f51dc90985e9eb251fbbb747ab2b13b26601f16c595a7b8baba964043bd/jiter-0.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42f8a68a69f047b310319ef8e2f52fdb2e7976fb3313ef27df495cf77bcad965", size = 512649, upload_time = "2025-03-10T21:35:40.157Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e5/4e385945179bcf128fa10ad8dca9053d717cbe09e258110e39045c881fe5/jiter-0.9.0-cp311-cp311-win32.whl", hash = "sha256:a25519efb78a42254d59326ee417d6f5161b06f5da827d94cf521fed961b1ff2", size = 206920, upload_time = "2025-03-10T21:35:41.72Z" }, - { url = "https://files.pythonhosted.org/packages/4c/47/5e0b94c603d8e54dd1faab439b40b832c277d3b90743e7835879ab663757/jiter-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:923b54afdd697dfd00d368b7ccad008cccfeb1efb4e621f32860c75e9f25edbd", size = 210119, upload_time = "2025-03-10T21:35:43.46Z" }, - { url = "https://files.pythonhosted.org/packages/af/d7/c55086103d6f29b694ec79156242304adf521577530d9031317ce5338c59/jiter-0.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7b46249cfd6c48da28f89eb0be3f52d6fdb40ab88e2c66804f546674e539ec11", size = 309203, upload_time = "2025-03-10T21:35:44.852Z" }, - { url = "https://files.pythonhosted.org/packages/b0/01/f775dfee50beb420adfd6baf58d1c4d437de41c9b666ddf127c065e5a488/jiter-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:609cf3c78852f1189894383cf0b0b977665f54cb38788e3e6b941fa6d982c00e", size = 319678, upload_time = "2025-03-10T21:35:46.365Z" }, - { url = "https://files.pythonhosted.org/packages/ab/b8/09b73a793714726893e5d46d5c534a63709261af3d24444ad07885ce87cb/jiter-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d726a3890a54561e55a9c5faea1f7655eda7f105bd165067575ace6e65f80bb2", size = 341816, upload_time = "2025-03-10T21:35:47.856Z" }, - { url = "https://files.pythonhosted.org/packages/35/6f/b8f89ec5398b2b0d344257138182cc090302854ed63ed9c9051e9c673441/jiter-0.9.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2e89dc075c1fef8fa9be219e249f14040270dbc507df4215c324a1839522ea75", size = 364152, upload_time = "2025-03-10T21:35:49.397Z" }, - { url = "https://files.pythonhosted.org/packages/9b/ca/978cc3183113b8e4484cc7e210a9ad3c6614396e7abd5407ea8aa1458eef/jiter-0.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04e8ffa3c353b1bc4134f96f167a2082494351e42888dfcf06e944f2729cbe1d", size = 406991, upload_time = "2025-03-10T21:35:50.745Z" }, - { url = "https://files.pythonhosted.org/packages/13/3a/72861883e11a36d6aa314b4922125f6ae90bdccc225cd96d24cc78a66385/jiter-0.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:203f28a72a05ae0e129b3ed1f75f56bc419d5f91dfacd057519a8bd137b00c42", size = 395824, upload_time = "2025-03-10T21:35:52.162Z" }, - { url = "https://files.pythonhosted.org/packages/87/67/22728a86ef53589c3720225778f7c5fdb617080e3deaed58b04789418212/jiter-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fca1a02ad60ec30bb230f65bc01f611c8608b02d269f998bc29cca8619a919dc", size = 351318, upload_time = "2025-03-10T21:35:53.566Z" }, - { url = "https://files.pythonhosted.org/packages/69/b9/f39728e2e2007276806d7a6609cda7fac44ffa28ca0d02c49a4f397cc0d9/jiter-0.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:237e5cee4d5d2659aaf91bbf8ec45052cc217d9446070699441a91b386ae27dc", size = 384591, upload_time = "2025-03-10T21:35:54.95Z" }, - { url = "https://files.pythonhosted.org/packages/eb/8f/8a708bc7fd87b8a5d861f1c118a995eccbe6d672fe10c9753e67362d0dd0/jiter-0.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:528b6b71745e7326eed73c53d4aa57e2a522242320b6f7d65b9c5af83cf49b6e", size = 520746, upload_time = "2025-03-10T21:35:56.444Z" }, - { url = "https://files.pythonhosted.org/packages/95/1e/65680c7488bd2365dbd2980adaf63c562d3d41d3faac192ebc7ef5b4ae25/jiter-0.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9f48e86b57bc711eb5acdfd12b6cb580a59cc9a993f6e7dcb6d8b50522dcd50d", size = 512754, upload_time = "2025-03-10T21:35:58.789Z" }, - { url = "https://files.pythonhosted.org/packages/78/f3/fdc43547a9ee6e93c837685da704fb6da7dba311fc022e2766d5277dfde5/jiter-0.9.0-cp312-cp312-win32.whl", hash = "sha256:699edfde481e191d81f9cf6d2211debbfe4bd92f06410e7637dffb8dd5dfde06", size = 207075, upload_time = "2025-03-10T21:36:00.616Z" }, - { url = "https://files.pythonhosted.org/packages/cd/9d/742b289016d155f49028fe1bfbeb935c9bf0ffeefdf77daf4a63a42bb72b/jiter-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:099500d07b43f61d8bd780466d429c45a7b25411b334c60ca875fa775f68ccb0", size = 207999, upload_time = "2025-03-10T21:36:02.366Z" }, - { url = "https://files.pythonhosted.org/packages/e7/1b/4cd165c362e8f2f520fdb43245e2b414f42a255921248b4f8b9c8d871ff1/jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7", size = 308197, upload_time = "2025-03-10T21:36:03.828Z" }, - { url = "https://files.pythonhosted.org/packages/13/aa/7a890dfe29c84c9a82064a9fe36079c7c0309c91b70c380dc138f9bea44a/jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b", size = 318160, upload_time = "2025-03-10T21:36:05.281Z" }, - { url = "https://files.pythonhosted.org/packages/6a/38/5888b43fc01102f733f085673c4f0be5a298f69808ec63de55051754e390/jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69", size = 341259, upload_time = "2025-03-10T21:36:06.716Z" }, - { url = "https://files.pythonhosted.org/packages/3d/5e/bbdbb63305bcc01006de683b6228cd061458b9b7bb9b8d9bc348a58e5dc2/jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103", size = 363730, upload_time = "2025-03-10T21:36:08.138Z" }, - { url = "https://files.pythonhosted.org/packages/75/85/53a3edc616992fe4af6814c25f91ee3b1e22f7678e979b6ea82d3bc0667e/jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635", size = 405126, upload_time = "2025-03-10T21:36:10.934Z" }, - { url = "https://files.pythonhosted.org/packages/ae/b3/1ee26b12b2693bd3f0b71d3188e4e5d817b12e3c630a09e099e0a89e28fa/jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4", size = 393668, upload_time = "2025-03-10T21:36:12.468Z" }, - { url = "https://files.pythonhosted.org/packages/11/87/e084ce261950c1861773ab534d49127d1517b629478304d328493f980791/jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d", size = 352350, upload_time = "2025-03-10T21:36:14.148Z" }, - { url = "https://files.pythonhosted.org/packages/f0/06/7dca84b04987e9df563610aa0bc154ea176e50358af532ab40ffb87434df/jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3", size = 384204, upload_time = "2025-03-10T21:36:15.545Z" }, - { url = "https://files.pythonhosted.org/packages/16/2f/82e1c6020db72f397dd070eec0c85ebc4df7c88967bc86d3ce9864148f28/jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5", size = 520322, upload_time = "2025-03-10T21:36:17.016Z" }, - { url = "https://files.pythonhosted.org/packages/36/fd/4f0cd3abe83ce208991ca61e7e5df915aa35b67f1c0633eb7cf2f2e88ec7/jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d", size = 512184, upload_time = "2025-03-10T21:36:18.47Z" }, - { url = "https://files.pythonhosted.org/packages/a0/3c/8a56f6d547731a0b4410a2d9d16bf39c861046f91f57c98f7cab3d2aa9ce/jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53", size = 206504, upload_time = "2025-03-10T21:36:19.809Z" }, - { url = "https://files.pythonhosted.org/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7", size = 204943, upload_time = "2025-03-10T21:36:21.536Z" }, - { url = "https://files.pythonhosted.org/packages/78/0f/77a63ca7aa5fed9a1b9135af57e190d905bcd3702b36aca46a01090d39ad/jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001", size = 317281, upload_time = "2025-03-10T21:36:22.959Z" }, - { url = "https://files.pythonhosted.org/packages/f9/39/a3a1571712c2bf6ec4c657f0d66da114a63a2e32b7e4eb8e0b83295ee034/jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a", size = 350273, upload_time = "2025-03-10T21:36:24.414Z" }, - { url = "https://files.pythonhosted.org/packages/ee/47/3729f00f35a696e68da15d64eb9283c330e776f3b5789bac7f2c0c4df209/jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf", size = 206867, upload_time = "2025-03-10T21:36:25.843Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/1e/c2/e4562507f52f0af7036da125bb699602ead37a2332af0788f8e0a3417f36/jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893", size = 162604, upload-time = "2025-03-10T21:37:03.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/44/e241a043f114299254e44d7e777ead311da400517f179665e59611ab0ee4/jiter-0.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6c4d99c71508912a7e556d631768dcdef43648a93660670986916b297f1c54af", size = 314654, upload-time = "2025-03-10T21:35:23.939Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/a7e5e42db9fa262baaa9489d8d14ca93f8663e7f164ed5e9acc9f467fc00/jiter-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f60fb8ce7df529812bf6c625635a19d27f30806885139e367af93f6e734ef58", size = 320909, upload-time = "2025-03-10T21:35:26.127Z" }, + { url = "https://files.pythonhosted.org/packages/60/bf/8ebdfce77bc04b81abf2ea316e9c03b4a866a7d739cf355eae4d6fd9f6fe/jiter-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51c4e1a4f8ea84d98b7b98912aa4290ac3d1eabfde8e3c34541fae30e9d1f08b", size = 341733, upload-time = "2025-03-10T21:35:27.94Z" }, + { url = "https://files.pythonhosted.org/packages/a8/4e/754ebce77cff9ab34d1d0fa0fe98f5d42590fd33622509a3ba6ec37ff466/jiter-0.9.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f4c677c424dc76684fea3e7285a7a2a7493424bea89ac441045e6a1fb1d7b3b", size = 365097, upload-time = "2025-03-10T21:35:29.605Z" }, + { url = "https://files.pythonhosted.org/packages/32/2c/6019587e6f5844c612ae18ca892f4cd7b3d8bbf49461ed29e384a0f13d98/jiter-0.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2221176dfec87f3470b21e6abca056e6b04ce9bff72315cb0b243ca9e835a4b5", size = 406603, upload-time = "2025-03-10T21:35:31.696Z" }, + { url = "https://files.pythonhosted.org/packages/da/e9/c9e6546c817ab75a1a7dab6dcc698e62e375e1017113e8e983fccbd56115/jiter-0.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c7adb66f899ffa25e3c92bfcb593391ee1947dbdd6a9a970e0d7e713237d572", size = 396625, upload-time = "2025-03-10T21:35:33.182Z" }, + { url = "https://files.pythonhosted.org/packages/be/bd/976b458add04271ebb5a255e992bd008546ea04bb4dcadc042a16279b4b4/jiter-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c98d27330fdfb77913c1097a7aab07f38ff2259048949f499c9901700789ac15", size = 351832, upload-time = "2025-03-10T21:35:35.394Z" }, + { url = "https://files.pythonhosted.org/packages/07/51/fe59e307aaebec9265dbad44d9d4381d030947e47b0f23531579b9a7c2df/jiter-0.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eda3f8cc74df66892b1d06b5d41a71670c22d95a1ca2cbab73654745ce9d0419", size = 384590, upload-time = "2025-03-10T21:35:37.171Z" }, + { url = "https://files.pythonhosted.org/packages/db/55/5dcd2693794d8e6f4889389ff66ef3be557a77f8aeeca8973a97a7c00557/jiter-0.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd5ab5ddc11418dce28343123644a100f487eaccf1de27a459ab36d6cca31043", size = 520690, upload-time = "2025-03-10T21:35:38.717Z" }, + { url = "https://files.pythonhosted.org/packages/54/d5/9f51dc90985e9eb251fbbb747ab2b13b26601f16c595a7b8baba964043bd/jiter-0.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42f8a68a69f047b310319ef8e2f52fdb2e7976fb3313ef27df495cf77bcad965", size = 512649, upload-time = "2025-03-10T21:35:40.157Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e5/4e385945179bcf128fa10ad8dca9053d717cbe09e258110e39045c881fe5/jiter-0.9.0-cp311-cp311-win32.whl", hash = "sha256:a25519efb78a42254d59326ee417d6f5161b06f5da827d94cf521fed961b1ff2", size = 206920, upload-time = "2025-03-10T21:35:41.72Z" }, + { url = "https://files.pythonhosted.org/packages/4c/47/5e0b94c603d8e54dd1faab439b40b832c277d3b90743e7835879ab663757/jiter-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:923b54afdd697dfd00d368b7ccad008cccfeb1efb4e621f32860c75e9f25edbd", size = 210119, upload-time = "2025-03-10T21:35:43.46Z" }, + { url = "https://files.pythonhosted.org/packages/af/d7/c55086103d6f29b694ec79156242304adf521577530d9031317ce5338c59/jiter-0.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7b46249cfd6c48da28f89eb0be3f52d6fdb40ab88e2c66804f546674e539ec11", size = 309203, upload-time = "2025-03-10T21:35:44.852Z" }, + { url = "https://files.pythonhosted.org/packages/b0/01/f775dfee50beb420adfd6baf58d1c4d437de41c9b666ddf127c065e5a488/jiter-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:609cf3c78852f1189894383cf0b0b977665f54cb38788e3e6b941fa6d982c00e", size = 319678, upload-time = "2025-03-10T21:35:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/ab/b8/09b73a793714726893e5d46d5c534a63709261af3d24444ad07885ce87cb/jiter-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d726a3890a54561e55a9c5faea1f7655eda7f105bd165067575ace6e65f80bb2", size = 341816, upload-time = "2025-03-10T21:35:47.856Z" }, + { url = "https://files.pythonhosted.org/packages/35/6f/b8f89ec5398b2b0d344257138182cc090302854ed63ed9c9051e9c673441/jiter-0.9.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2e89dc075c1fef8fa9be219e249f14040270dbc507df4215c324a1839522ea75", size = 364152, upload-time = "2025-03-10T21:35:49.397Z" }, + { url = "https://files.pythonhosted.org/packages/9b/ca/978cc3183113b8e4484cc7e210a9ad3c6614396e7abd5407ea8aa1458eef/jiter-0.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04e8ffa3c353b1bc4134f96f167a2082494351e42888dfcf06e944f2729cbe1d", size = 406991, upload-time = "2025-03-10T21:35:50.745Z" }, + { url = "https://files.pythonhosted.org/packages/13/3a/72861883e11a36d6aa314b4922125f6ae90bdccc225cd96d24cc78a66385/jiter-0.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:203f28a72a05ae0e129b3ed1f75f56bc419d5f91dfacd057519a8bd137b00c42", size = 395824, upload-time = "2025-03-10T21:35:52.162Z" }, + { url = "https://files.pythonhosted.org/packages/87/67/22728a86ef53589c3720225778f7c5fdb617080e3deaed58b04789418212/jiter-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fca1a02ad60ec30bb230f65bc01f611c8608b02d269f998bc29cca8619a919dc", size = 351318, upload-time = "2025-03-10T21:35:53.566Z" }, + { url = "https://files.pythonhosted.org/packages/69/b9/f39728e2e2007276806d7a6609cda7fac44ffa28ca0d02c49a4f397cc0d9/jiter-0.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:237e5cee4d5d2659aaf91bbf8ec45052cc217d9446070699441a91b386ae27dc", size = 384591, upload-time = "2025-03-10T21:35:54.95Z" }, + { url = "https://files.pythonhosted.org/packages/eb/8f/8a708bc7fd87b8a5d861f1c118a995eccbe6d672fe10c9753e67362d0dd0/jiter-0.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:528b6b71745e7326eed73c53d4aa57e2a522242320b6f7d65b9c5af83cf49b6e", size = 520746, upload-time = "2025-03-10T21:35:56.444Z" }, + { url = "https://files.pythonhosted.org/packages/95/1e/65680c7488bd2365dbd2980adaf63c562d3d41d3faac192ebc7ef5b4ae25/jiter-0.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9f48e86b57bc711eb5acdfd12b6cb580a59cc9a993f6e7dcb6d8b50522dcd50d", size = 512754, upload-time = "2025-03-10T21:35:58.789Z" }, + { url = "https://files.pythonhosted.org/packages/78/f3/fdc43547a9ee6e93c837685da704fb6da7dba311fc022e2766d5277dfde5/jiter-0.9.0-cp312-cp312-win32.whl", hash = "sha256:699edfde481e191d81f9cf6d2211debbfe4bd92f06410e7637dffb8dd5dfde06", size = 207075, upload-time = "2025-03-10T21:36:00.616Z" }, + { url = "https://files.pythonhosted.org/packages/cd/9d/742b289016d155f49028fe1bfbeb935c9bf0ffeefdf77daf4a63a42bb72b/jiter-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:099500d07b43f61d8bd780466d429c45a7b25411b334c60ca875fa775f68ccb0", size = 207999, upload-time = "2025-03-10T21:36:02.366Z" }, + { url = "https://files.pythonhosted.org/packages/e7/1b/4cd165c362e8f2f520fdb43245e2b414f42a255921248b4f8b9c8d871ff1/jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7", size = 308197, upload-time = "2025-03-10T21:36:03.828Z" }, + { url = "https://files.pythonhosted.org/packages/13/aa/7a890dfe29c84c9a82064a9fe36079c7c0309c91b70c380dc138f9bea44a/jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b", size = 318160, upload-time = "2025-03-10T21:36:05.281Z" }, + { url = "https://files.pythonhosted.org/packages/6a/38/5888b43fc01102f733f085673c4f0be5a298f69808ec63de55051754e390/jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69", size = 341259, upload-time = "2025-03-10T21:36:06.716Z" }, + { url = "https://files.pythonhosted.org/packages/3d/5e/bbdbb63305bcc01006de683b6228cd061458b9b7bb9b8d9bc348a58e5dc2/jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103", size = 363730, upload-time = "2025-03-10T21:36:08.138Z" }, + { url = "https://files.pythonhosted.org/packages/75/85/53a3edc616992fe4af6814c25f91ee3b1e22f7678e979b6ea82d3bc0667e/jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635", size = 405126, upload-time = "2025-03-10T21:36:10.934Z" }, + { url = "https://files.pythonhosted.org/packages/ae/b3/1ee26b12b2693bd3f0b71d3188e4e5d817b12e3c630a09e099e0a89e28fa/jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4", size = 393668, upload-time = "2025-03-10T21:36:12.468Z" }, + { url = "https://files.pythonhosted.org/packages/11/87/e084ce261950c1861773ab534d49127d1517b629478304d328493f980791/jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d", size = 352350, upload-time = "2025-03-10T21:36:14.148Z" }, + { url = "https://files.pythonhosted.org/packages/f0/06/7dca84b04987e9df563610aa0bc154ea176e50358af532ab40ffb87434df/jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3", size = 384204, upload-time = "2025-03-10T21:36:15.545Z" }, + { url = "https://files.pythonhosted.org/packages/16/2f/82e1c6020db72f397dd070eec0c85ebc4df7c88967bc86d3ce9864148f28/jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5", size = 520322, upload-time = "2025-03-10T21:36:17.016Z" }, + { url = "https://files.pythonhosted.org/packages/36/fd/4f0cd3abe83ce208991ca61e7e5df915aa35b67f1c0633eb7cf2f2e88ec7/jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d", size = 512184, upload-time = "2025-03-10T21:36:18.47Z" }, + { url = "https://files.pythonhosted.org/packages/a0/3c/8a56f6d547731a0b4410a2d9d16bf39c861046f91f57c98f7cab3d2aa9ce/jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53", size = 206504, upload-time = "2025-03-10T21:36:19.809Z" }, + { url = "https://files.pythonhosted.org/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7", size = 204943, upload-time = "2025-03-10T21:36:21.536Z" }, + { url = "https://files.pythonhosted.org/packages/78/0f/77a63ca7aa5fed9a1b9135af57e190d905bcd3702b36aca46a01090d39ad/jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001", size = 317281, upload-time = "2025-03-10T21:36:22.959Z" }, + { url = "https://files.pythonhosted.org/packages/f9/39/a3a1571712c2bf6ec4c657f0d66da114a63a2e32b7e4eb8e0b83295ee034/jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a", size = 350273, upload-time = "2025-03-10T21:36:24.414Z" }, + { url = "https://files.pythonhosted.org/packages/ee/47/3729f00f35a696e68da15d64eb9283c330e776f3b5789bac7f2c0c4df209/jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf", size = 206867, upload-time = "2025-03-10T21:36:25.843Z" }, ] [[package]] name = "lxml" version = "5.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/73/a6/0730ff6cbb87e42e1329a486fe4ccbd3f8f728cb629c2671b0d093a85918/lxml-5.1.1.tar.gz", hash = "sha256:42a8aa957e98bd8b884a8142175ec24ce4ef0a57760e8879f193bfe64b757ca9", size = 3838907, upload_time = "2024-03-29T06:46:52.155Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/01/977ac832ec441dbde7b373faef715d8f58c4052cc88ae01070be7f3d7907/lxml-5.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:906966babd374fdfe46e130fc656488003f0d0d63b7cba612aa5a796c8804283", size = 8756105, upload_time = "2024-03-29T06:43:08.757Z" }, - { url = "https://files.pythonhosted.org/packages/7e/0a/8ef5c87c72ba4d9a8765c829d1abc28c8482ade37735c7c2725221243d3d/lxml-5.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9c03f3715c68fc707d9383d56e482d95d198ba07cb3dad4aee9e5a5ca06b2536", size = 4751802, upload_time = "2024-03-29T06:43:13.165Z" }, - { url = "https://files.pythonhosted.org/packages/b5/2a/9096d632371ce48dafcd0459520c9afd60d3b26b6c00a5d3f8e93fdb089d/lxml-5.1.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d26243d994d4077a50056e9008848e5b421be0c6f0fd4e932a9463e1d89fc42b", size = 5202069, upload_time = "2024-03-29T06:43:16.426Z" }, - { url = "https://files.pythonhosted.org/packages/7e/03/dea246cbe3d959062751ec1aa031972e61680ae4a60c67df08bb1305b465/lxml-5.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de00750318ae6869b9dfa6429a4f82b8ecad043049414547474d09db549c2ee", size = 4921442, upload_time = "2024-03-29T06:43:19.842Z" }, - { url = "https://files.pythonhosted.org/packages/84/71/0d510fe3f99a8ddb776d7b803ed1f41b9eb64b30c5f945f241edf238adfa/lxml-5.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29b2771b4eec4e85063f10294facdd9829d010e6cc9668040d0cf936dc56733a", size = 5084186, upload_time = "2024-03-29T06:43:23.7Z" }, - { url = "https://files.pythonhosted.org/packages/de/c3/9fb0276ad05f3dc454d2f8165181039da4cbfb605f53816d7f34d5e93cca/lxml-5.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d9358f7268c161dc0a1c3216018f26c04954b5dd47ba6dead79da6598f4725d4", size = 4962146, upload_time = "2024-03-29T06:43:27.312Z" }, - { url = "https://files.pythonhosted.org/packages/eb/4f/533dd6ece9f4aa2c8455244c074f61facb23944271cc82bcceccc1eca8a1/lxml-5.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8a943826e7a9254eed661a7134fcde3c832a9fecd989d0f47c6e08c7b769cb2c", size = 5094316, upload_time = "2024-03-29T06:43:30.877Z" }, - { url = "https://files.pythonhosted.org/packages/f9/bd/62cc8a995bd34b1f44fc3706bab0c21bde489dc56482a5f4c9a6bb11ff65/lxml-5.1.1-cp311-cp311-win32.whl", hash = "sha256:74d0967c6f91eec6fe91159f9e8ccb3720fa0fbf9f462109c7bef62550df397c", size = 3560964, upload_time = "2024-03-29T06:43:34.609Z" }, - { url = "https://files.pythonhosted.org/packages/02/7e/af62091cc2c3096573458cec140a914b54f4b36892f549449cc556ed34cb/lxml-5.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:26974096654241df08a30dc2eb0e139c1ad5653660aa4b2ced66000230e96c14", size = 3909680, upload_time = "2024-03-29T06:43:38.221Z" }, - { url = "https://files.pythonhosted.org/packages/e3/0a/3901402aef812c57c27d1bb5405a29abb345fbd7e1b595d060bb065e46c6/lxml-5.1.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:55e13a19829dcdbf0c5233062977aeb6daf72e65124909128045976f659164e8", size = 8786323, upload_time = "2024-03-29T06:43:42.886Z" }, - { url = "https://files.pythonhosted.org/packages/04/92/74df36e8ccecdc96260531f0cbbf849ed25d3ff77a5655a3c89d588e982d/lxml-5.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:adedfb61be862f48907218e3a24bf051fd2ecca53358f3958b0bdb17d7881c20", size = 4764866, upload_time = "2024-03-29T06:43:46.476Z" }, - { url = "https://files.pythonhosted.org/packages/7f/b2/5dfbbec91014ffac561d51d4e3467587a646572f111fd7ddd076568d34c7/lxml-5.1.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77425482e4311d1cff119a2b5ab26c52ec209d2a3d728a54db3223ab91995e20", size = 5153741, upload_time = "2024-03-29T06:43:50.444Z" }, - { url = "https://files.pythonhosted.org/packages/5b/cf/3da2e345dd19b509c9d269000f16888f4ef50f8ca742c268f8142a7e0b84/lxml-5.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d380f183bd03ab827899753ea96dabe27d2025eb0bfd4f2ac0eee4afa0f351d", size = 4853573, upload_time = "2024-03-29T06:43:53.449Z" }, - { url = "https://files.pythonhosted.org/packages/67/78/aad9c76bf995febcacd836e12ecc670c89737502ebe44f69c472918c8ffd/lxml-5.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8682af96b5ad5093aab9eee5e4ff24cb7a9796c78699d914dd456ebfe7484a6", size = 5035899, upload_time = "2024-03-29T06:43:57.342Z" }, - { url = "https://files.pythonhosted.org/packages/7e/88/d0cb086fb1b72fec96bb45aad1058ec31b9df3b146245747c0601490428b/lxml-5.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68eed33377a9925aed7ba56c8611d50aaa1e45638c07a92b4b4b0a0436cc2dd2", size = 4896851, upload_time = "2024-03-29T06:44:00.471Z" }, - { url = "https://files.pythonhosted.org/packages/5d/69/8cb0a076851dcc5fa185042d3f19e61edb596d677280085873fd49043529/lxml-5.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7c1d2f6e9c7a1c4478146ee38d16dbe0eb3be998424bc0f01346c671c38b86d", size = 5048250, upload_time = "2024-03-29T06:44:04.436Z" }, - { url = "https://files.pythonhosted.org/packages/3f/d7/a3d5f104c46231060d3e177ad946bf5c0bbc5652f960fbf2dedb66f0f9f7/lxml-5.1.1-cp312-cp312-win32.whl", hash = "sha256:81107c8de3e463052ae8fd05fd31b97c371c7a9ce4a189b8bb5f45b0b3545fb9", size = 3571032, upload_time = "2024-03-29T06:44:07.247Z" }, - { url = "https://files.pythonhosted.org/packages/d6/6b/a7c513c461b1448122d27faeb8f4b61150777816303a21fa6f9bb8be3266/lxml-5.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:0e46181d15fae102c53621bed9356b7a599a1e837b978c934a350dd00842b1d9", size = 3909299, upload_time = "2024-03-29T06:44:11.354Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/73/a6/0730ff6cbb87e42e1329a486fe4ccbd3f8f728cb629c2671b0d093a85918/lxml-5.1.1.tar.gz", hash = "sha256:42a8aa957e98bd8b884a8142175ec24ce4ef0a57760e8879f193bfe64b757ca9", size = 3838907, upload-time = "2024-03-29T06:46:52.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/01/977ac832ec441dbde7b373faef715d8f58c4052cc88ae01070be7f3d7907/lxml-5.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:906966babd374fdfe46e130fc656488003f0d0d63b7cba612aa5a796c8804283", size = 8756105, upload-time = "2024-03-29T06:43:08.757Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0a/8ef5c87c72ba4d9a8765c829d1abc28c8482ade37735c7c2725221243d3d/lxml-5.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9c03f3715c68fc707d9383d56e482d95d198ba07cb3dad4aee9e5a5ca06b2536", size = 4751802, upload-time = "2024-03-29T06:43:13.165Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2a/9096d632371ce48dafcd0459520c9afd60d3b26b6c00a5d3f8e93fdb089d/lxml-5.1.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d26243d994d4077a50056e9008848e5b421be0c6f0fd4e932a9463e1d89fc42b", size = 5202069, upload-time = "2024-03-29T06:43:16.426Z" }, + { url = "https://files.pythonhosted.org/packages/7e/03/dea246cbe3d959062751ec1aa031972e61680ae4a60c67df08bb1305b465/lxml-5.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de00750318ae6869b9dfa6429a4f82b8ecad043049414547474d09db549c2ee", size = 4921442, upload-time = "2024-03-29T06:43:19.842Z" }, + { url = "https://files.pythonhosted.org/packages/84/71/0d510fe3f99a8ddb776d7b803ed1f41b9eb64b30c5f945f241edf238adfa/lxml-5.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29b2771b4eec4e85063f10294facdd9829d010e6cc9668040d0cf936dc56733a", size = 5084186, upload-time = "2024-03-29T06:43:23.7Z" }, + { url = "https://files.pythonhosted.org/packages/de/c3/9fb0276ad05f3dc454d2f8165181039da4cbfb605f53816d7f34d5e93cca/lxml-5.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d9358f7268c161dc0a1c3216018f26c04954b5dd47ba6dead79da6598f4725d4", size = 4962146, upload-time = "2024-03-29T06:43:27.312Z" }, + { url = "https://files.pythonhosted.org/packages/eb/4f/533dd6ece9f4aa2c8455244c074f61facb23944271cc82bcceccc1eca8a1/lxml-5.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8a943826e7a9254eed661a7134fcde3c832a9fecd989d0f47c6e08c7b769cb2c", size = 5094316, upload-time = "2024-03-29T06:43:30.877Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bd/62cc8a995bd34b1f44fc3706bab0c21bde489dc56482a5f4c9a6bb11ff65/lxml-5.1.1-cp311-cp311-win32.whl", hash = "sha256:74d0967c6f91eec6fe91159f9e8ccb3720fa0fbf9f462109c7bef62550df397c", size = 3560964, upload-time = "2024-03-29T06:43:34.609Z" }, + { url = "https://files.pythonhosted.org/packages/02/7e/af62091cc2c3096573458cec140a914b54f4b36892f549449cc556ed34cb/lxml-5.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:26974096654241df08a30dc2eb0e139c1ad5653660aa4b2ced66000230e96c14", size = 3909680, upload-time = "2024-03-29T06:43:38.221Z" }, + { url = "https://files.pythonhosted.org/packages/e3/0a/3901402aef812c57c27d1bb5405a29abb345fbd7e1b595d060bb065e46c6/lxml-5.1.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:55e13a19829dcdbf0c5233062977aeb6daf72e65124909128045976f659164e8", size = 8786323, upload-time = "2024-03-29T06:43:42.886Z" }, + { url = "https://files.pythonhosted.org/packages/04/92/74df36e8ccecdc96260531f0cbbf849ed25d3ff77a5655a3c89d588e982d/lxml-5.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:adedfb61be862f48907218e3a24bf051fd2ecca53358f3958b0bdb17d7881c20", size = 4764866, upload-time = "2024-03-29T06:43:46.476Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b2/5dfbbec91014ffac561d51d4e3467587a646572f111fd7ddd076568d34c7/lxml-5.1.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77425482e4311d1cff119a2b5ab26c52ec209d2a3d728a54db3223ab91995e20", size = 5153741, upload-time = "2024-03-29T06:43:50.444Z" }, + { url = "https://files.pythonhosted.org/packages/5b/cf/3da2e345dd19b509c9d269000f16888f4ef50f8ca742c268f8142a7e0b84/lxml-5.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d380f183bd03ab827899753ea96dabe27d2025eb0bfd4f2ac0eee4afa0f351d", size = 4853573, upload-time = "2024-03-29T06:43:53.449Z" }, + { url = "https://files.pythonhosted.org/packages/67/78/aad9c76bf995febcacd836e12ecc670c89737502ebe44f69c472918c8ffd/lxml-5.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8682af96b5ad5093aab9eee5e4ff24cb7a9796c78699d914dd456ebfe7484a6", size = 5035899, upload-time = "2024-03-29T06:43:57.342Z" }, + { url = "https://files.pythonhosted.org/packages/7e/88/d0cb086fb1b72fec96bb45aad1058ec31b9df3b146245747c0601490428b/lxml-5.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68eed33377a9925aed7ba56c8611d50aaa1e45638c07a92b4b4b0a0436cc2dd2", size = 4896851, upload-time = "2024-03-29T06:44:00.471Z" }, + { url = "https://files.pythonhosted.org/packages/5d/69/8cb0a076851dcc5fa185042d3f19e61edb596d677280085873fd49043529/lxml-5.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7c1d2f6e9c7a1c4478146ee38d16dbe0eb3be998424bc0f01346c671c38b86d", size = 5048250, upload-time = "2024-03-29T06:44:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d7/a3d5f104c46231060d3e177ad946bf5c0bbc5652f960fbf2dedb66f0f9f7/lxml-5.1.1-cp312-cp312-win32.whl", hash = "sha256:81107c8de3e463052ae8fd05fd31b97c371c7a9ce4a189b8bb5f45b0b3545fb9", size = 3571032, upload-time = "2024-03-29T06:44:07.247Z" }, + { url = "https://files.pythonhosted.org/packages/d6/6b/a7c513c461b1448122d27faeb8f4b61150777816303a21fa6f9bb8be3266/lxml-5.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:0e46181d15fae102c53621bed9356b7a599a1e837b978c934a350dd00842b1d9", size = 3909299, upload-time = "2024-03-29T06:44:11.354Z" }, ] [[package]] @@ -996,9 +1010,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9e/38/bd5b78a920a64d708fe6bc8e0a2c075e1389d53bef8413725c63ba041535/mako-1.3.10.tar.gz", hash = "sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28", size = 392474, upload_time = "2025-04-10T12:44:31.16Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/38/bd5b78a920a64d708fe6bc8e0a2c075e1389d53bef8413725c63ba041535/mako-1.3.10.tar.gz", hash = "sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28", size = 392474, upload-time = "2025-04-10T12:44:31.16Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59", size = 78509, upload_time = "2025-04-10T12:50:53.297Z" }, + { url = "https://files.pythonhosted.org/packages/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59", size = 78509, upload-time = "2025-04-10T12:50:53.297Z" }, ] [[package]] @@ -1008,57 +1022,57 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload_time = "2023-06-03T06:41:14.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload_time = "2023-06-03T06:41:11.019Z" }, + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, ] [[package]] name = "markupsafe" version = "3.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload_time = "2024-10-18T15:21:54.129Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload_time = "2024-10-18T15:21:02.187Z" }, - { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload_time = "2024-10-18T15:21:02.941Z" }, - { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload_time = "2024-10-18T15:21:03.953Z" }, - { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload_time = "2024-10-18T15:21:06.495Z" }, - { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload_time = "2024-10-18T15:21:07.295Z" }, - { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload_time = "2024-10-18T15:21:08.073Z" }, - { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload_time = "2024-10-18T15:21:09.318Z" }, - { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload_time = "2024-10-18T15:21:10.185Z" }, - { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload_time = "2024-10-18T15:21:11.005Z" }, - { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload_time = "2024-10-18T15:21:12.911Z" }, - { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload_time = "2024-10-18T15:21:13.777Z" }, - { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload_time = "2024-10-18T15:21:14.822Z" }, - { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload_time = "2024-10-18T15:21:15.642Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload_time = "2024-10-18T15:21:17.133Z" }, - { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload_time = "2024-10-18T15:21:18.064Z" }, - { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload_time = "2024-10-18T15:21:18.859Z" }, - { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload_time = "2024-10-18T15:21:19.671Z" }, - { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload_time = "2024-10-18T15:21:20.971Z" }, - { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload_time = "2024-10-18T15:21:22.646Z" }, - { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload_time = "2024-10-18T15:21:23.499Z" }, - { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload_time = "2024-10-18T15:21:24.577Z" }, - { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload_time = "2024-10-18T15:21:25.382Z" }, - { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload_time = "2024-10-18T15:21:26.199Z" }, - { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload_time = "2024-10-18T15:21:27.029Z" }, - { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload_time = "2024-10-18T15:21:27.846Z" }, - { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload_time = "2024-10-18T15:21:28.744Z" }, - { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload_time = "2024-10-18T15:21:29.545Z" }, - { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload_time = "2024-10-18T15:21:30.366Z" }, - { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload_time = "2024-10-18T15:21:31.207Z" }, - { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload_time = "2024-10-18T15:21:32.032Z" }, - { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload_time = "2024-10-18T15:21:33.625Z" }, - { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload_time = "2024-10-18T15:21:34.611Z" }, - { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload_time = "2024-10-18T15:21:35.398Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload_time = "2024-10-18T15:21:36.231Z" }, - { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload_time = "2024-10-18T15:21:37.073Z" }, - { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload_time = "2024-10-18T15:21:37.932Z" }, - { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload_time = "2024-10-18T15:21:39.799Z" }, - { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload_time = "2024-10-18T15:21:40.813Z" }, - { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload_time = "2024-10-18T15:21:41.814Z" }, - { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload_time = "2024-10-18T15:21:42.784Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload-time = "2024-10-18T15:21:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload-time = "2024-10-18T15:21:02.941Z" }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload-time = "2024-10-18T15:21:03.953Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload-time = "2024-10-18T15:21:06.495Z" }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload-time = "2024-10-18T15:21:07.295Z" }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload-time = "2024-10-18T15:21:08.073Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload-time = "2024-10-18T15:21:09.318Z" }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload-time = "2024-10-18T15:21:10.185Z" }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload-time = "2024-10-18T15:21:11.005Z" }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload-time = "2024-10-18T15:21:12.911Z" }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload-time = "2024-10-18T15:21:13.777Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload-time = "2024-10-18T15:21:14.822Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload-time = "2024-10-18T15:21:15.642Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload-time = "2024-10-18T15:21:17.133Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload-time = "2024-10-18T15:21:18.064Z" }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload-time = "2024-10-18T15:21:18.859Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload-time = "2024-10-18T15:21:19.671Z" }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload-time = "2024-10-18T15:21:20.971Z" }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload-time = "2024-10-18T15:21:22.646Z" }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload-time = "2024-10-18T15:21:23.499Z" }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, ] [[package]] @@ -1068,95 +1082,95 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fd/c0/d674c9de69227beafa41e1601b0c48b8b51060212abc231d4332e4b1e794/marshmallow-3.23.3.tar.gz", hash = "sha256:d586c8685ebdb80bf754e1f96e3f305aaf30951f1fc69175b977453633467e76", size = 175606, upload_time = "2025-01-03T20:18:41.52Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/c0/d674c9de69227beafa41e1601b0c48b8b51060212abc231d4332e4b1e794/marshmallow-3.23.3.tar.gz", hash = "sha256:d586c8685ebdb80bf754e1f96e3f305aaf30951f1fc69175b977453633467e76", size = 175606, upload-time = "2025-01-03T20:18:41.52Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/82/d8c37cc92948ce11e5d8d71602bbac7ac4257f9e1f918fd91b1ddac4ec97/marshmallow-3.23.3-py3-none-any.whl", hash = "sha256:20c0f8c613f68bcb45b2a0d3282e2f172575560170bf220d67aafb42717910e4", size = 48911, upload_time = "2025-01-03T20:18:39.62Z" }, + { url = "https://files.pythonhosted.org/packages/af/82/d8c37cc92948ce11e5d8d71602bbac7ac4257f9e1f918fd91b1ddac4ec97/marshmallow-3.23.3-py3-none-any.whl", hash = "sha256:20c0f8c613f68bcb45b2a0d3282e2f172575560170bf220d67aafb42717910e4", size = 48911, upload-time = "2025-01-03T20:18:39.62Z" }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload_time = "2022-08-14T12:40:09.779Z" }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] [[package]] name = "multidict" version = "6.4.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/da/2c/e367dfb4c6538614a0c9453e510d75d66099edf1c4e69da1b5ce691a1931/multidict-6.4.3.tar.gz", hash = "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", size = 89372, upload_time = "2025-04-10T22:20:17.956Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/16/e0/53cf7f27eda48fffa53cfd4502329ed29e00efb9e4ce41362cbf8aa54310/multidict-6.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", size = 65259, upload_time = "2025-04-10T22:17:59.632Z" }, - { url = "https://files.pythonhosted.org/packages/44/79/1dcd93ce7070cf01c2ee29f781c42b33c64fce20033808f1cc9ec8413d6e/multidict-6.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", size = 38451, upload_time = "2025-04-10T22:18:01.202Z" }, - { url = "https://files.pythonhosted.org/packages/f4/35/2292cf29ab5f0d0b3613fad1b75692148959d3834d806be1885ceb49a8ff/multidict-6.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad", size = 37706, upload_time = "2025-04-10T22:18:02.276Z" }, - { url = "https://files.pythonhosted.org/packages/f6/d1/6b157110b2b187b5a608b37714acb15ee89ec773e3800315b0107ea648cd/multidict-6.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", size = 226669, upload_time = "2025-04-10T22:18:03.436Z" }, - { url = "https://files.pythonhosted.org/packages/40/7f/61a476450651f177c5570e04bd55947f693077ba7804fe9717ee9ae8de04/multidict-6.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", size = 223182, upload_time = "2025-04-10T22:18:04.922Z" }, - { url = "https://files.pythonhosted.org/packages/51/7b/eaf7502ac4824cdd8edcf5723e2e99f390c879866aec7b0c420267b53749/multidict-6.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", size = 235025, upload_time = "2025-04-10T22:18:06.274Z" }, - { url = "https://files.pythonhosted.org/packages/3b/f6/facdbbd73c96b67a93652774edd5778ab1167854fa08ea35ad004b1b70ad/multidict-6.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", size = 231481, upload_time = "2025-04-10T22:18:07.742Z" }, - { url = "https://files.pythonhosted.org/packages/70/57/c008e861b3052405eebf921fd56a748322d8c44dcfcab164fffbccbdcdc4/multidict-6.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", size = 223492, upload_time = "2025-04-10T22:18:09.095Z" }, - { url = "https://files.pythonhosted.org/packages/30/4d/7d8440d3a12a6ae5d6b202d6e7f2ac6ab026e04e99aaf1b73f18e6bc34bc/multidict-6.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", size = 217279, upload_time = "2025-04-10T22:18:10.474Z" }, - { url = "https://files.pythonhosted.org/packages/7f/e7/bca0df4dd057597b94138d2d8af04eb3c27396a425b1b0a52e082f9be621/multidict-6.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", size = 228733, upload_time = "2025-04-10T22:18:11.793Z" }, - { url = "https://files.pythonhosted.org/packages/88/f5/383827c3f1c38d7c92dbad00a8a041760228573b1c542fbf245c37bbca8a/multidict-6.4.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", size = 218089, upload_time = "2025-04-10T22:18:13.153Z" }, - { url = "https://files.pythonhosted.org/packages/36/8a/a5174e8a7d8b94b4c8f9c1e2cf5d07451f41368ffe94d05fc957215b8e72/multidict-6.4.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", size = 225257, upload_time = "2025-04-10T22:18:14.654Z" }, - { url = "https://files.pythonhosted.org/packages/8c/76/1d4b7218f0fd00b8e5c90b88df2e45f8af127f652f4e41add947fa54c1c4/multidict-6.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", size = 234728, upload_time = "2025-04-10T22:18:16.236Z" }, - { url = "https://files.pythonhosted.org/packages/64/44/18372a4f6273fc7ca25630d7bf9ae288cde64f29593a078bff450c7170b6/multidict-6.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", size = 230087, upload_time = "2025-04-10T22:18:17.979Z" }, - { url = "https://files.pythonhosted.org/packages/0f/ae/28728c314a698d8a6d9491fcacc897077348ec28dd85884d09e64df8a855/multidict-6.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", size = 223137, upload_time = "2025-04-10T22:18:19.362Z" }, - { url = "https://files.pythonhosted.org/packages/22/50/785bb2b3fe16051bc91c70a06a919f26312da45c34db97fc87441d61e343/multidict-6.4.3-cp311-cp311-win32.whl", hash = "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", size = 34959, upload_time = "2025-04-10T22:18:20.728Z" }, - { url = "https://files.pythonhosted.org/packages/2f/63/2a22e099ae2f4d92897618c00c73a09a08a2a9aa14b12736965bf8d59fd3/multidict-6.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", size = 38541, upload_time = "2025-04-10T22:18:22.001Z" }, - { url = "https://files.pythonhosted.org/packages/fc/bb/3abdaf8fe40e9226ce8a2ba5ecf332461f7beec478a455d6587159f1bf92/multidict-6.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", size = 64019, upload_time = "2025-04-10T22:18:23.174Z" }, - { url = "https://files.pythonhosted.org/packages/7e/b5/1b2e8de8217d2e89db156625aa0fe4a6faad98972bfe07a7b8c10ef5dd6b/multidict-6.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", size = 37925, upload_time = "2025-04-10T22:18:24.834Z" }, - { url = "https://files.pythonhosted.org/packages/b4/e2/3ca91c112644a395c8eae017144c907d173ea910c913ff8b62549dcf0bbf/multidict-6.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", size = 37008, upload_time = "2025-04-10T22:18:26.069Z" }, - { url = "https://files.pythonhosted.org/packages/60/23/79bc78146c7ac8d1ac766b2770ca2e07c2816058b8a3d5da6caed8148637/multidict-6.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", size = 224374, upload_time = "2025-04-10T22:18:27.714Z" }, - { url = "https://files.pythonhosted.org/packages/86/35/77950ed9ebd09136003a85c1926ba42001ca5be14feb49710e4334ee199b/multidict-6.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", size = 230869, upload_time = "2025-04-10T22:18:29.162Z" }, - { url = "https://files.pythonhosted.org/packages/49/97/2a33c6e7d90bc116c636c14b2abab93d6521c0c052d24bfcc231cbf7f0e7/multidict-6.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", size = 231949, upload_time = "2025-04-10T22:18:30.679Z" }, - { url = "https://files.pythonhosted.org/packages/56/ce/e9b5d9fcf854f61d6686ada7ff64893a7a5523b2a07da6f1265eaaea5151/multidict-6.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", size = 231032, upload_time = "2025-04-10T22:18:32.146Z" }, - { url = "https://files.pythonhosted.org/packages/f0/ac/7ced59dcdfeddd03e601edb05adff0c66d81ed4a5160c443e44f2379eef0/multidict-6.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", size = 223517, upload_time = "2025-04-10T22:18:33.538Z" }, - { url = "https://files.pythonhosted.org/packages/db/e6/325ed9055ae4e085315193a1b58bdb4d7fc38ffcc1f4975cfca97d015e17/multidict-6.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", size = 216291, upload_time = "2025-04-10T22:18:34.962Z" }, - { url = "https://files.pythonhosted.org/packages/fa/84/eeee6d477dd9dcb7691c3bb9d08df56017f5dd15c730bcc9383dcf201cf4/multidict-6.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", size = 228982, upload_time = "2025-04-10T22:18:36.443Z" }, - { url = "https://files.pythonhosted.org/packages/82/94/4d1f3e74e7acf8b0c85db350e012dcc61701cd6668bc2440bb1ecb423c90/multidict-6.4.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", size = 226823, upload_time = "2025-04-10T22:18:37.924Z" }, - { url = "https://files.pythonhosted.org/packages/09/f0/1e54b95bda7cd01080e5732f9abb7b76ab5cc795b66605877caeb2197476/multidict-6.4.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", size = 222714, upload_time = "2025-04-10T22:18:39.807Z" }, - { url = "https://files.pythonhosted.org/packages/e7/a2/f6cbca875195bd65a3e53b37ab46486f3cc125bdeab20eefe5042afa31fb/multidict-6.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", size = 233739, upload_time = "2025-04-10T22:18:41.341Z" }, - { url = "https://files.pythonhosted.org/packages/79/68/9891f4d2b8569554723ddd6154375295f789dc65809826c6fb96a06314fd/multidict-6.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", size = 230809, upload_time = "2025-04-10T22:18:42.817Z" }, - { url = "https://files.pythonhosted.org/packages/e6/72/a7be29ba1e87e4fc5ceb44dabc7940b8005fd2436a332a23547709315f70/multidict-6.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", size = 226934, upload_time = "2025-04-10T22:18:44.311Z" }, - { url = "https://files.pythonhosted.org/packages/12/c1/259386a9ad6840ff7afc686da96808b503d152ac4feb3a96c651dc4f5abf/multidict-6.4.3-cp312-cp312-win32.whl", hash = "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", size = 35242, upload_time = "2025-04-10T22:18:46.193Z" }, - { url = "https://files.pythonhosted.org/packages/06/24/c8fdff4f924d37225dc0c56a28b1dca10728fc2233065fafeb27b4b125be/multidict-6.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", size = 38635, upload_time = "2025-04-10T22:18:47.498Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4b/86fd786d03915c6f49998cf10cd5fe6b6ac9e9a071cb40885d2e080fb90d/multidict-6.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", size = 63831, upload_time = "2025-04-10T22:18:48.748Z" }, - { url = "https://files.pythonhosted.org/packages/45/05/9b51fdf7aef2563340a93be0a663acba2c428c4daeaf3960d92d53a4a930/multidict-6.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", size = 37888, upload_time = "2025-04-10T22:18:50.021Z" }, - { url = "https://files.pythonhosted.org/packages/0b/43/53fc25394386c911822419b522181227ca450cf57fea76e6188772a1bd91/multidict-6.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", size = 36852, upload_time = "2025-04-10T22:18:51.246Z" }, - { url = "https://files.pythonhosted.org/packages/8a/68/7b99c751e822467c94a235b810a2fd4047d4ecb91caef6b5c60116991c4b/multidict-6.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", size = 223644, upload_time = "2025-04-10T22:18:52.965Z" }, - { url = "https://files.pythonhosted.org/packages/80/1b/d458d791e4dd0f7e92596667784fbf99e5c8ba040affe1ca04f06b93ae92/multidict-6.4.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", size = 230446, upload_time = "2025-04-10T22:18:54.509Z" }, - { url = "https://files.pythonhosted.org/packages/e2/46/9793378d988905491a7806d8987862dc5a0bae8a622dd896c4008c7b226b/multidict-6.4.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", size = 231070, upload_time = "2025-04-10T22:18:56.019Z" }, - { url = "https://files.pythonhosted.org/packages/a7/b8/b127d3e1f8dd2a5bf286b47b24567ae6363017292dc6dec44656e6246498/multidict-6.4.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", size = 229956, upload_time = "2025-04-10T22:18:59.146Z" }, - { url = "https://files.pythonhosted.org/packages/0c/93/f70a4c35b103fcfe1443059a2bb7f66e5c35f2aea7804105ff214f566009/multidict-6.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", size = 222599, upload_time = "2025-04-10T22:19:00.657Z" }, - { url = "https://files.pythonhosted.org/packages/63/8c/e28e0eb2fe34921d6aa32bfc4ac75b09570b4d6818cc95d25499fe08dc1d/multidict-6.4.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", size = 216136, upload_time = "2025-04-10T22:19:02.244Z" }, - { url = "https://files.pythonhosted.org/packages/72/f5/fbc81f866585b05f89f99d108be5d6ad170e3b6c4d0723d1a2f6ba5fa918/multidict-6.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", size = 228139, upload_time = "2025-04-10T22:19:04.151Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ba/7d196bad6b85af2307d81f6979c36ed9665f49626f66d883d6c64d156f78/multidict-6.4.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", size = 226251, upload_time = "2025-04-10T22:19:06.117Z" }, - { url = "https://files.pythonhosted.org/packages/cc/e2/fae46a370dce79d08b672422a33df721ec8b80105e0ea8d87215ff6b090d/multidict-6.4.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", size = 221868, upload_time = "2025-04-10T22:19:07.981Z" }, - { url = "https://files.pythonhosted.org/packages/26/20/bbc9a3dec19d5492f54a167f08546656e7aef75d181d3d82541463450e88/multidict-6.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", size = 233106, upload_time = "2025-04-10T22:19:09.5Z" }, - { url = "https://files.pythonhosted.org/packages/ee/8d/f30ae8f5ff7a2461177f4d8eb0d8f69f27fb6cfe276b54ec4fd5a282d918/multidict-6.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", size = 230163, upload_time = "2025-04-10T22:19:11Z" }, - { url = "https://files.pythonhosted.org/packages/15/e9/2833f3c218d3c2179f3093f766940ded6b81a49d2e2f9c46ab240d23dfec/multidict-6.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", size = 225906, upload_time = "2025-04-10T22:19:12.875Z" }, - { url = "https://files.pythonhosted.org/packages/f1/31/6edab296ac369fd286b845fa5dd4c409e63bc4655ed8c9510fcb477e9ae9/multidict-6.4.3-cp313-cp313-win32.whl", hash = "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", size = 35238, upload_time = "2025-04-10T22:19:14.41Z" }, - { url = "https://files.pythonhosted.org/packages/23/57/2c0167a1bffa30d9a1383c3dab99d8caae985defc8636934b5668830d2ef/multidict-6.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", size = 38799, upload_time = "2025-04-10T22:19:15.869Z" }, - { url = "https://files.pythonhosted.org/packages/c9/13/2ead63b9ab0d2b3080819268acb297bd66e238070aa8d42af12b08cbee1c/multidict-6.4.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", size = 68642, upload_time = "2025-04-10T22:19:17.527Z" }, - { url = "https://files.pythonhosted.org/packages/85/45/f1a751e1eede30c23951e2ae274ce8fad738e8a3d5714be73e0a41b27b16/multidict-6.4.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", size = 40028, upload_time = "2025-04-10T22:19:19.465Z" }, - { url = "https://files.pythonhosted.org/packages/a7/29/fcc53e886a2cc5595cc4560df333cb9630257bda65003a7eb4e4e0d8f9c1/multidict-6.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", size = 39424, upload_time = "2025-04-10T22:19:20.762Z" }, - { url = "https://files.pythonhosted.org/packages/f6/f0/056c81119d8b88703971f937b371795cab1407cd3c751482de5bfe1a04a9/multidict-6.4.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", size = 226178, upload_time = "2025-04-10T22:19:22.17Z" }, - { url = "https://files.pythonhosted.org/packages/a3/79/3b7e5fea0aa80583d3a69c9d98b7913dfd4fbc341fb10bb2fb48d35a9c21/multidict-6.4.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", size = 222617, upload_time = "2025-04-10T22:19:23.773Z" }, - { url = "https://files.pythonhosted.org/packages/06/db/3ed012b163e376fc461e1d6a67de69b408339bc31dc83d39ae9ec3bf9578/multidict-6.4.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", size = 227919, upload_time = "2025-04-10T22:19:25.35Z" }, - { url = "https://files.pythonhosted.org/packages/b1/db/0433c104bca380989bc04d3b841fc83e95ce0c89f680e9ea4251118b52b6/multidict-6.4.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", size = 226097, upload_time = "2025-04-10T22:19:27.183Z" }, - { url = "https://files.pythonhosted.org/packages/c2/95/910db2618175724dd254b7ae635b6cd8d2947a8b76b0376de7b96d814dab/multidict-6.4.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", size = 220706, upload_time = "2025-04-10T22:19:28.882Z" }, - { url = "https://files.pythonhosted.org/packages/d1/af/aa176c6f5f1d901aac957d5258d5e22897fe13948d1e69063ae3d5d0ca01/multidict-6.4.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", size = 211728, upload_time = "2025-04-10T22:19:30.481Z" }, - { url = "https://files.pythonhosted.org/packages/e7/42/d51cc5fc1527c3717d7f85137d6c79bb7a93cd214c26f1fc57523774dbb5/multidict-6.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", size = 226276, upload_time = "2025-04-10T22:19:32.454Z" }, - { url = "https://files.pythonhosted.org/packages/28/6b/d836dea45e0b8432343ba4acf9a8ecaa245da4c0960fb7ab45088a5e568a/multidict-6.4.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", size = 212069, upload_time = "2025-04-10T22:19:34.17Z" }, - { url = "https://files.pythonhosted.org/packages/55/34/0ee1a7adb3560e18ee9289c6e5f7db54edc312b13e5c8263e88ea373d12c/multidict-6.4.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", size = 217858, upload_time = "2025-04-10T22:19:35.879Z" }, - { url = "https://files.pythonhosted.org/packages/04/08/586d652c2f5acefe0cf4e658eedb4d71d4ba6dfd4f189bd81b400fc1bc6b/multidict-6.4.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", size = 226988, upload_time = "2025-04-10T22:19:37.434Z" }, - { url = "https://files.pythonhosted.org/packages/82/e3/cc59c7e2bc49d7f906fb4ffb6d9c3a3cf21b9f2dd9c96d05bef89c2b1fd1/multidict-6.4.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", size = 220435, upload_time = "2025-04-10T22:19:39.005Z" }, - { url = "https://files.pythonhosted.org/packages/e0/32/5c3a556118aca9981d883f38c4b1bfae646f3627157f70f4068e5a648955/multidict-6.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", size = 221494, upload_time = "2025-04-10T22:19:41.447Z" }, - { url = "https://files.pythonhosted.org/packages/b9/3b/1599631f59024b75c4d6e3069f4502409970a336647502aaf6b62fb7ac98/multidict-6.4.3-cp313-cp313t-win32.whl", hash = "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", size = 41775, upload_time = "2025-04-10T22:19:43.707Z" }, - { url = "https://files.pythonhosted.org/packages/e8/4e/09301668d675d02ca8e8e1a3e6be046619e30403f5ada2ed5b080ae28d02/multidict-6.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", size = 45946, upload_time = "2025-04-10T22:19:45.071Z" }, - { url = "https://files.pythonhosted.org/packages/96/10/7d526c8974f017f1e7ca584c71ee62a638e9334d8d33f27d7cdfc9ae79e4/multidict-6.4.3-py3-none-any.whl", hash = "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", size = 10400, upload_time = "2025-04-10T22:20:16.445Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/da/2c/e367dfb4c6538614a0c9453e510d75d66099edf1c4e69da1b5ce691a1931/multidict-6.4.3.tar.gz", hash = "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", size = 89372, upload-time = "2025-04-10T22:20:17.956Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/e0/53cf7f27eda48fffa53cfd4502329ed29e00efb9e4ce41362cbf8aa54310/multidict-6.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", size = 65259, upload-time = "2025-04-10T22:17:59.632Z" }, + { url = "https://files.pythonhosted.org/packages/44/79/1dcd93ce7070cf01c2ee29f781c42b33c64fce20033808f1cc9ec8413d6e/multidict-6.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", size = 38451, upload-time = "2025-04-10T22:18:01.202Z" }, + { url = "https://files.pythonhosted.org/packages/f4/35/2292cf29ab5f0d0b3613fad1b75692148959d3834d806be1885ceb49a8ff/multidict-6.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad", size = 37706, upload-time = "2025-04-10T22:18:02.276Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d1/6b157110b2b187b5a608b37714acb15ee89ec773e3800315b0107ea648cd/multidict-6.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", size = 226669, upload-time = "2025-04-10T22:18:03.436Z" }, + { url = "https://files.pythonhosted.org/packages/40/7f/61a476450651f177c5570e04bd55947f693077ba7804fe9717ee9ae8de04/multidict-6.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", size = 223182, upload-time = "2025-04-10T22:18:04.922Z" }, + { url = "https://files.pythonhosted.org/packages/51/7b/eaf7502ac4824cdd8edcf5723e2e99f390c879866aec7b0c420267b53749/multidict-6.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", size = 235025, upload-time = "2025-04-10T22:18:06.274Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f6/facdbbd73c96b67a93652774edd5778ab1167854fa08ea35ad004b1b70ad/multidict-6.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", size = 231481, upload-time = "2025-04-10T22:18:07.742Z" }, + { url = "https://files.pythonhosted.org/packages/70/57/c008e861b3052405eebf921fd56a748322d8c44dcfcab164fffbccbdcdc4/multidict-6.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", size = 223492, upload-time = "2025-04-10T22:18:09.095Z" }, + { url = "https://files.pythonhosted.org/packages/30/4d/7d8440d3a12a6ae5d6b202d6e7f2ac6ab026e04e99aaf1b73f18e6bc34bc/multidict-6.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", size = 217279, upload-time = "2025-04-10T22:18:10.474Z" }, + { url = "https://files.pythonhosted.org/packages/7f/e7/bca0df4dd057597b94138d2d8af04eb3c27396a425b1b0a52e082f9be621/multidict-6.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", size = 228733, upload-time = "2025-04-10T22:18:11.793Z" }, + { url = "https://files.pythonhosted.org/packages/88/f5/383827c3f1c38d7c92dbad00a8a041760228573b1c542fbf245c37bbca8a/multidict-6.4.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", size = 218089, upload-time = "2025-04-10T22:18:13.153Z" }, + { url = "https://files.pythonhosted.org/packages/36/8a/a5174e8a7d8b94b4c8f9c1e2cf5d07451f41368ffe94d05fc957215b8e72/multidict-6.4.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", size = 225257, upload-time = "2025-04-10T22:18:14.654Z" }, + { url = "https://files.pythonhosted.org/packages/8c/76/1d4b7218f0fd00b8e5c90b88df2e45f8af127f652f4e41add947fa54c1c4/multidict-6.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", size = 234728, upload-time = "2025-04-10T22:18:16.236Z" }, + { url = "https://files.pythonhosted.org/packages/64/44/18372a4f6273fc7ca25630d7bf9ae288cde64f29593a078bff450c7170b6/multidict-6.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", size = 230087, upload-time = "2025-04-10T22:18:17.979Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/28728c314a698d8a6d9491fcacc897077348ec28dd85884d09e64df8a855/multidict-6.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", size = 223137, upload-time = "2025-04-10T22:18:19.362Z" }, + { url = "https://files.pythonhosted.org/packages/22/50/785bb2b3fe16051bc91c70a06a919f26312da45c34db97fc87441d61e343/multidict-6.4.3-cp311-cp311-win32.whl", hash = "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", size = 34959, upload-time = "2025-04-10T22:18:20.728Z" }, + { url = "https://files.pythonhosted.org/packages/2f/63/2a22e099ae2f4d92897618c00c73a09a08a2a9aa14b12736965bf8d59fd3/multidict-6.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", size = 38541, upload-time = "2025-04-10T22:18:22.001Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bb/3abdaf8fe40e9226ce8a2ba5ecf332461f7beec478a455d6587159f1bf92/multidict-6.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", size = 64019, upload-time = "2025-04-10T22:18:23.174Z" }, + { url = "https://files.pythonhosted.org/packages/7e/b5/1b2e8de8217d2e89db156625aa0fe4a6faad98972bfe07a7b8c10ef5dd6b/multidict-6.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", size = 37925, upload-time = "2025-04-10T22:18:24.834Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e2/3ca91c112644a395c8eae017144c907d173ea910c913ff8b62549dcf0bbf/multidict-6.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", size = 37008, upload-time = "2025-04-10T22:18:26.069Z" }, + { url = "https://files.pythonhosted.org/packages/60/23/79bc78146c7ac8d1ac766b2770ca2e07c2816058b8a3d5da6caed8148637/multidict-6.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", size = 224374, upload-time = "2025-04-10T22:18:27.714Z" }, + { url = "https://files.pythonhosted.org/packages/86/35/77950ed9ebd09136003a85c1926ba42001ca5be14feb49710e4334ee199b/multidict-6.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", size = 230869, upload-time = "2025-04-10T22:18:29.162Z" }, + { url = "https://files.pythonhosted.org/packages/49/97/2a33c6e7d90bc116c636c14b2abab93d6521c0c052d24bfcc231cbf7f0e7/multidict-6.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", size = 231949, upload-time = "2025-04-10T22:18:30.679Z" }, + { url = "https://files.pythonhosted.org/packages/56/ce/e9b5d9fcf854f61d6686ada7ff64893a7a5523b2a07da6f1265eaaea5151/multidict-6.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", size = 231032, upload-time = "2025-04-10T22:18:32.146Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ac/7ced59dcdfeddd03e601edb05adff0c66d81ed4a5160c443e44f2379eef0/multidict-6.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", size = 223517, upload-time = "2025-04-10T22:18:33.538Z" }, + { url = "https://files.pythonhosted.org/packages/db/e6/325ed9055ae4e085315193a1b58bdb4d7fc38ffcc1f4975cfca97d015e17/multidict-6.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", size = 216291, upload-time = "2025-04-10T22:18:34.962Z" }, + { url = "https://files.pythonhosted.org/packages/fa/84/eeee6d477dd9dcb7691c3bb9d08df56017f5dd15c730bcc9383dcf201cf4/multidict-6.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", size = 228982, upload-time = "2025-04-10T22:18:36.443Z" }, + { url = "https://files.pythonhosted.org/packages/82/94/4d1f3e74e7acf8b0c85db350e012dcc61701cd6668bc2440bb1ecb423c90/multidict-6.4.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", size = 226823, upload-time = "2025-04-10T22:18:37.924Z" }, + { url = "https://files.pythonhosted.org/packages/09/f0/1e54b95bda7cd01080e5732f9abb7b76ab5cc795b66605877caeb2197476/multidict-6.4.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", size = 222714, upload-time = "2025-04-10T22:18:39.807Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a2/f6cbca875195bd65a3e53b37ab46486f3cc125bdeab20eefe5042afa31fb/multidict-6.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", size = 233739, upload-time = "2025-04-10T22:18:41.341Z" }, + { url = "https://files.pythonhosted.org/packages/79/68/9891f4d2b8569554723ddd6154375295f789dc65809826c6fb96a06314fd/multidict-6.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", size = 230809, upload-time = "2025-04-10T22:18:42.817Z" }, + { url = "https://files.pythonhosted.org/packages/e6/72/a7be29ba1e87e4fc5ceb44dabc7940b8005fd2436a332a23547709315f70/multidict-6.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", size = 226934, upload-time = "2025-04-10T22:18:44.311Z" }, + { url = "https://files.pythonhosted.org/packages/12/c1/259386a9ad6840ff7afc686da96808b503d152ac4feb3a96c651dc4f5abf/multidict-6.4.3-cp312-cp312-win32.whl", hash = "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", size = 35242, upload-time = "2025-04-10T22:18:46.193Z" }, + { url = "https://files.pythonhosted.org/packages/06/24/c8fdff4f924d37225dc0c56a28b1dca10728fc2233065fafeb27b4b125be/multidict-6.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", size = 38635, upload-time = "2025-04-10T22:18:47.498Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4b/86fd786d03915c6f49998cf10cd5fe6b6ac9e9a071cb40885d2e080fb90d/multidict-6.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", size = 63831, upload-time = "2025-04-10T22:18:48.748Z" }, + { url = "https://files.pythonhosted.org/packages/45/05/9b51fdf7aef2563340a93be0a663acba2c428c4daeaf3960d92d53a4a930/multidict-6.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", size = 37888, upload-time = "2025-04-10T22:18:50.021Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/53fc25394386c911822419b522181227ca450cf57fea76e6188772a1bd91/multidict-6.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", size = 36852, upload-time = "2025-04-10T22:18:51.246Z" }, + { url = "https://files.pythonhosted.org/packages/8a/68/7b99c751e822467c94a235b810a2fd4047d4ecb91caef6b5c60116991c4b/multidict-6.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", size = 223644, upload-time = "2025-04-10T22:18:52.965Z" }, + { url = "https://files.pythonhosted.org/packages/80/1b/d458d791e4dd0f7e92596667784fbf99e5c8ba040affe1ca04f06b93ae92/multidict-6.4.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", size = 230446, upload-time = "2025-04-10T22:18:54.509Z" }, + { url = "https://files.pythonhosted.org/packages/e2/46/9793378d988905491a7806d8987862dc5a0bae8a622dd896c4008c7b226b/multidict-6.4.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", size = 231070, upload-time = "2025-04-10T22:18:56.019Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b8/b127d3e1f8dd2a5bf286b47b24567ae6363017292dc6dec44656e6246498/multidict-6.4.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", size = 229956, upload-time = "2025-04-10T22:18:59.146Z" }, + { url = "https://files.pythonhosted.org/packages/0c/93/f70a4c35b103fcfe1443059a2bb7f66e5c35f2aea7804105ff214f566009/multidict-6.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", size = 222599, upload-time = "2025-04-10T22:19:00.657Z" }, + { url = "https://files.pythonhosted.org/packages/63/8c/e28e0eb2fe34921d6aa32bfc4ac75b09570b4d6818cc95d25499fe08dc1d/multidict-6.4.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", size = 216136, upload-time = "2025-04-10T22:19:02.244Z" }, + { url = "https://files.pythonhosted.org/packages/72/f5/fbc81f866585b05f89f99d108be5d6ad170e3b6c4d0723d1a2f6ba5fa918/multidict-6.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", size = 228139, upload-time = "2025-04-10T22:19:04.151Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ba/7d196bad6b85af2307d81f6979c36ed9665f49626f66d883d6c64d156f78/multidict-6.4.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", size = 226251, upload-time = "2025-04-10T22:19:06.117Z" }, + { url = "https://files.pythonhosted.org/packages/cc/e2/fae46a370dce79d08b672422a33df721ec8b80105e0ea8d87215ff6b090d/multidict-6.4.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", size = 221868, upload-time = "2025-04-10T22:19:07.981Z" }, + { url = "https://files.pythonhosted.org/packages/26/20/bbc9a3dec19d5492f54a167f08546656e7aef75d181d3d82541463450e88/multidict-6.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", size = 233106, upload-time = "2025-04-10T22:19:09.5Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8d/f30ae8f5ff7a2461177f4d8eb0d8f69f27fb6cfe276b54ec4fd5a282d918/multidict-6.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", size = 230163, upload-time = "2025-04-10T22:19:11Z" }, + { url = "https://files.pythonhosted.org/packages/15/e9/2833f3c218d3c2179f3093f766940ded6b81a49d2e2f9c46ab240d23dfec/multidict-6.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", size = 225906, upload-time = "2025-04-10T22:19:12.875Z" }, + { url = "https://files.pythonhosted.org/packages/f1/31/6edab296ac369fd286b845fa5dd4c409e63bc4655ed8c9510fcb477e9ae9/multidict-6.4.3-cp313-cp313-win32.whl", hash = "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", size = 35238, upload-time = "2025-04-10T22:19:14.41Z" }, + { url = "https://files.pythonhosted.org/packages/23/57/2c0167a1bffa30d9a1383c3dab99d8caae985defc8636934b5668830d2ef/multidict-6.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", size = 38799, upload-time = "2025-04-10T22:19:15.869Z" }, + { url = "https://files.pythonhosted.org/packages/c9/13/2ead63b9ab0d2b3080819268acb297bd66e238070aa8d42af12b08cbee1c/multidict-6.4.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", size = 68642, upload-time = "2025-04-10T22:19:17.527Z" }, + { url = "https://files.pythonhosted.org/packages/85/45/f1a751e1eede30c23951e2ae274ce8fad738e8a3d5714be73e0a41b27b16/multidict-6.4.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", size = 40028, upload-time = "2025-04-10T22:19:19.465Z" }, + { url = "https://files.pythonhosted.org/packages/a7/29/fcc53e886a2cc5595cc4560df333cb9630257bda65003a7eb4e4e0d8f9c1/multidict-6.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", size = 39424, upload-time = "2025-04-10T22:19:20.762Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f0/056c81119d8b88703971f937b371795cab1407cd3c751482de5bfe1a04a9/multidict-6.4.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", size = 226178, upload-time = "2025-04-10T22:19:22.17Z" }, + { url = "https://files.pythonhosted.org/packages/a3/79/3b7e5fea0aa80583d3a69c9d98b7913dfd4fbc341fb10bb2fb48d35a9c21/multidict-6.4.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", size = 222617, upload-time = "2025-04-10T22:19:23.773Z" }, + { url = "https://files.pythonhosted.org/packages/06/db/3ed012b163e376fc461e1d6a67de69b408339bc31dc83d39ae9ec3bf9578/multidict-6.4.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", size = 227919, upload-time = "2025-04-10T22:19:25.35Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/0433c104bca380989bc04d3b841fc83e95ce0c89f680e9ea4251118b52b6/multidict-6.4.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", size = 226097, upload-time = "2025-04-10T22:19:27.183Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/910db2618175724dd254b7ae635b6cd8d2947a8b76b0376de7b96d814dab/multidict-6.4.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", size = 220706, upload-time = "2025-04-10T22:19:28.882Z" }, + { url = "https://files.pythonhosted.org/packages/d1/af/aa176c6f5f1d901aac957d5258d5e22897fe13948d1e69063ae3d5d0ca01/multidict-6.4.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", size = 211728, upload-time = "2025-04-10T22:19:30.481Z" }, + { url = "https://files.pythonhosted.org/packages/e7/42/d51cc5fc1527c3717d7f85137d6c79bb7a93cd214c26f1fc57523774dbb5/multidict-6.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", size = 226276, upload-time = "2025-04-10T22:19:32.454Z" }, + { url = "https://files.pythonhosted.org/packages/28/6b/d836dea45e0b8432343ba4acf9a8ecaa245da4c0960fb7ab45088a5e568a/multidict-6.4.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", size = 212069, upload-time = "2025-04-10T22:19:34.17Z" }, + { url = "https://files.pythonhosted.org/packages/55/34/0ee1a7adb3560e18ee9289c6e5f7db54edc312b13e5c8263e88ea373d12c/multidict-6.4.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", size = 217858, upload-time = "2025-04-10T22:19:35.879Z" }, + { url = "https://files.pythonhosted.org/packages/04/08/586d652c2f5acefe0cf4e658eedb4d71d4ba6dfd4f189bd81b400fc1bc6b/multidict-6.4.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", size = 226988, upload-time = "2025-04-10T22:19:37.434Z" }, + { url = "https://files.pythonhosted.org/packages/82/e3/cc59c7e2bc49d7f906fb4ffb6d9c3a3cf21b9f2dd9c96d05bef89c2b1fd1/multidict-6.4.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", size = 220435, upload-time = "2025-04-10T22:19:39.005Z" }, + { url = "https://files.pythonhosted.org/packages/e0/32/5c3a556118aca9981d883f38c4b1bfae646f3627157f70f4068e5a648955/multidict-6.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", size = 221494, upload-time = "2025-04-10T22:19:41.447Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3b/1599631f59024b75c4d6e3069f4502409970a336647502aaf6b62fb7ac98/multidict-6.4.3-cp313-cp313t-win32.whl", hash = "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", size = 41775, upload-time = "2025-04-10T22:19:43.707Z" }, + { url = "https://files.pythonhosted.org/packages/e8/4e/09301668d675d02ca8e8e1a3e6be046619e30403f5ada2ed5b080ae28d02/multidict-6.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", size = 45946, upload-time = "2025-04-10T22:19:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/96/10/7d526c8974f017f1e7ca584c71ee62a638e9334d8d33f27d7cdfc9ae79e4/multidict-6.4.3-py3-none-any.whl", hash = "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", size = 10400, upload-time = "2025-04-10T22:20:16.445Z" }, ] [[package]] @@ -1166,37 +1180,37 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "dill" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b5/ae/04f39c5d0d0def03247c2893d6f2b83c136bf3320a2154d7b8858f2ba72d/multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1", size = 1772603, upload_time = "2024-01-28T18:52:34.85Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/ae/04f39c5d0d0def03247c2893d6f2b83c136bf3320a2154d7b8858f2ba72d/multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1", size = 1772603, upload-time = "2024-01-28T18:52:34.85Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/f7/7ec7fddc92e50714ea3745631f79bd9c96424cb2702632521028e57d3a36/multiprocess-0.70.16-py310-none-any.whl", hash = "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02", size = 134824, upload_time = "2024-01-28T18:52:26.062Z" }, - { url = "https://files.pythonhosted.org/packages/50/15/b56e50e8debaf439f44befec5b2af11db85f6e0f344c3113ae0be0593a91/multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a", size = 143519, upload_time = "2024-01-28T18:52:28.115Z" }, - { url = "https://files.pythonhosted.org/packages/0a/7d/a988f258104dcd2ccf1ed40fdc97e26c4ac351eeaf81d76e266c52d84e2f/multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e", size = 146741, upload_time = "2024-01-28T18:52:29.395Z" }, - { url = "https://files.pythonhosted.org/packages/ea/89/38df130f2c799090c978b366cfdf5b96d08de5b29a4a293df7f7429fa50b/multiprocess-0.70.16-py38-none-any.whl", hash = "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435", size = 132628, upload_time = "2024-01-28T18:52:30.853Z" }, - { url = "https://files.pythonhosted.org/packages/da/d9/f7f9379981e39b8c2511c9e0326d212accacb82f12fbfdc1aa2ce2a7b2b6/multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3", size = 133351, upload_time = "2024-01-28T18:52:31.981Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f7/7ec7fddc92e50714ea3745631f79bd9c96424cb2702632521028e57d3a36/multiprocess-0.70.16-py310-none-any.whl", hash = "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02", size = 134824, upload-time = "2024-01-28T18:52:26.062Z" }, + { url = "https://files.pythonhosted.org/packages/50/15/b56e50e8debaf439f44befec5b2af11db85f6e0f344c3113ae0be0593a91/multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a", size = 143519, upload-time = "2024-01-28T18:52:28.115Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7d/a988f258104dcd2ccf1ed40fdc97e26c4ac351eeaf81d76e266c52d84e2f/multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e", size = 146741, upload-time = "2024-01-28T18:52:29.395Z" }, + { url = "https://files.pythonhosted.org/packages/ea/89/38df130f2c799090c978b366cfdf5b96d08de5b29a4a293df7f7429fa50b/multiprocess-0.70.16-py38-none-any.whl", hash = "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435", size = 132628, upload-time = "2024-01-28T18:52:30.853Z" }, + { url = "https://files.pythonhosted.org/packages/da/d9/f7f9379981e39b8c2511c9e0326d212accacb82f12fbfdc1aa2ce2a7b2b6/multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3", size = 133351, upload-time = "2024-01-28T18:52:31.981Z" }, ] [[package]] name = "numpy" version = "1.26.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129, upload_time = "2024-02-06T00:26:44.495Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129, upload-time = "2024-02-06T00:26:44.495Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554, upload_time = "2024-02-05T23:51:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127, upload_time = "2024-02-05T23:52:15.314Z" }, - { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994, upload_time = "2024-02-05T23:52:47.569Z" }, - { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005, upload_time = "2024-02-05T23:53:15.637Z" }, - { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297, upload_time = "2024-02-05T23:53:42.16Z" }, - { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567, upload_time = "2024-02-05T23:54:11.696Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812, upload_time = "2024-02-05T23:54:26.453Z" }, - { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913, upload_time = "2024-02-05T23:54:53.933Z" }, - { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901, upload_time = "2024-02-05T23:55:32.801Z" }, - { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868, upload_time = "2024-02-05T23:55:56.28Z" }, - { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109, upload_time = "2024-02-05T23:56:20.368Z" }, - { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613, upload_time = "2024-02-05T23:56:56.054Z" }, - { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172, upload_time = "2024-02-05T23:57:21.56Z" }, - { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643, upload_time = "2024-02-05T23:57:56.585Z" }, - { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803, upload_time = "2024-02-05T23:58:08.963Z" }, - { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload_time = "2024-02-05T23:58:36.364Z" }, + { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554, upload-time = "2024-02-05T23:51:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127, upload-time = "2024-02-05T23:52:15.314Z" }, + { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994, upload-time = "2024-02-05T23:52:47.569Z" }, + { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005, upload-time = "2024-02-05T23:53:15.637Z" }, + { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297, upload-time = "2024-02-05T23:53:42.16Z" }, + { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567, upload-time = "2024-02-05T23:54:11.696Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812, upload-time = "2024-02-05T23:54:26.453Z" }, + { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913, upload-time = "2024-02-05T23:54:53.933Z" }, + { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901, upload-time = "2024-02-05T23:55:32.801Z" }, + { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868, upload-time = "2024-02-05T23:55:56.28Z" }, + { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109, upload-time = "2024-02-05T23:56:20.368Z" }, + { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613, upload-time = "2024-02-05T23:56:56.054Z" }, + { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172, upload-time = "2024-02-05T23:57:21.56Z" }, + { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643, upload-time = "2024-02-05T23:57:56.585Z" }, + { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803, upload-time = "2024-02-05T23:58:08.963Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload-time = "2024-02-05T23:58:36.364Z" }, ] [[package]] @@ -1213,27 +1227,27 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/ae/8d9706b8ff2363287b4a8807de2dd29cdbdad5424e9d05d345df724320f5/openai-1.60.2.tar.gz", hash = "sha256:a8f843e10f2855713007f491d96afb2694b11b5e02cb97c7d01a0be60bc5bb51", size = 348185, upload_time = "2025-01-27T19:37:03.72Z" } +sdist = { url = "https://files.pythonhosted.org/packages/08/ae/8d9706b8ff2363287b4a8807de2dd29cdbdad5424e9d05d345df724320f5/openai-1.60.2.tar.gz", hash = "sha256:a8f843e10f2855713007f491d96afb2694b11b5e02cb97c7d01a0be60bc5bb51", size = 348185, upload-time = "2025-01-27T19:37:03.72Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/5a/d5474ca67a547dde9b87b5bc8a8f90eadf29f523d410f2ba23d63c9b82ec/openai-1.60.2-py3-none-any.whl", hash = "sha256:993bd11b96900b9098179c728026f016b4982ded7ee30dfcf4555eab1171fff9", size = 456107, upload_time = "2025-01-27T19:37:01.065Z" }, + { url = "https://files.pythonhosted.org/packages/e5/5a/d5474ca67a547dde9b87b5bc8a8f90eadf29f523d410f2ba23d63c9b82ec/openai-1.60.2-py3-none-any.whl", hash = "sha256:993bd11b96900b9098179c728026f016b4982ded7ee30dfcf4555eab1171fff9", size = 456107, upload-time = "2025-01-27T19:37:01.065Z" }, ] [[package]] name = "orderly-set" version = "5.4.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/03/4a/38030da31c13dcd5a531490006e63a0954083fb115113be9393179738e25/orderly_set-5.4.1.tar.gz", hash = "sha256:a1fb5a4fdc5e234e9e8d8e5c1bbdbc4540f4dfe50d12bf17c8bc5dbf1c9c878d", size = 20943, upload_time = "2025-05-06T22:34:13.512Z" } +sdist = { url = "https://files.pythonhosted.org/packages/03/4a/38030da31c13dcd5a531490006e63a0954083fb115113be9393179738e25/orderly_set-5.4.1.tar.gz", hash = "sha256:a1fb5a4fdc5e234e9e8d8e5c1bbdbc4540f4dfe50d12bf17c8bc5dbf1c9c878d", size = 20943, upload-time = "2025-05-06T22:34:13.512Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/bc/e0dfb4db9210d92b44e49d6e61ba5caefbd411958357fa9d7ff489eeb835/orderly_set-5.4.1-py3-none-any.whl", hash = "sha256:b5e21d21680bd9ef456885db800c5cb4f76a03879880c0175e1b077fb166fd83", size = 12339, upload_time = "2025-05-06T22:34:12.564Z" }, + { url = "https://files.pythonhosted.org/packages/12/bc/e0dfb4db9210d92b44e49d6e61ba5caefbd411958357fa9d7ff489eeb835/orderly_set-5.4.1-py3-none-any.whl", hash = "sha256:b5e21d21680bd9ef456885db800c5cb4f76a03879880c0175e1b077fb166fd83", size = 12339, upload-time = "2025-05-06T22:34:12.564Z" }, ] [[package]] name = "packaging" version = "25.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload_time = "2025-04-19T11:48:59.673Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload_time = "2025-04-19T11:48:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] [[package]] @@ -1246,35 +1260,35 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213, upload_time = "2024-09-20T13:10:04.827Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222, upload_time = "2024-09-20T13:08:56.254Z" }, - { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274, upload_time = "2024-09-20T13:08:58.645Z" }, - { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836, upload_time = "2024-09-20T19:01:57.571Z" }, - { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505, upload_time = "2024-09-20T13:09:01.501Z" }, - { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420, upload_time = "2024-09-20T19:02:00.678Z" }, - { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457, upload_time = "2024-09-20T13:09:04.105Z" }, - { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166, upload_time = "2024-09-20T13:09:06.917Z" }, - { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893, upload_time = "2024-09-20T13:09:09.655Z" }, - { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475, upload_time = "2024-09-20T13:09:14.718Z" }, - { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645, upload_time = "2024-09-20T19:02:03.88Z" }, - { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445, upload_time = "2024-09-20T13:09:17.621Z" }, - { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235, upload_time = "2024-09-20T19:02:07.094Z" }, - { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756, upload_time = "2024-09-20T13:09:20.474Z" }, - { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248, upload_time = "2024-09-20T13:09:23.137Z" }, - { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643, upload_time = "2024-09-20T13:09:25.522Z" }, - { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573, upload_time = "2024-09-20T13:09:28.012Z" }, - { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085, upload_time = "2024-09-20T19:02:10.451Z" }, - { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809, upload_time = "2024-09-20T13:09:30.814Z" }, - { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316, upload_time = "2024-09-20T19:02:13.825Z" }, - { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055, upload_time = "2024-09-20T13:09:33.462Z" }, - { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175, upload_time = "2024-09-20T13:09:35.871Z" }, - { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650, upload_time = "2024-09-20T13:09:38.685Z" }, - { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177, upload_time = "2024-09-20T13:09:41.141Z" }, - { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526, upload_time = "2024-09-20T19:02:16.905Z" }, - { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013, upload_time = "2024-09-20T13:09:44.39Z" }, - { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620, upload_time = "2024-09-20T19:02:20.639Z" }, - { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436, upload_time = "2024-09-20T13:09:48.112Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213, upload-time = "2024-09-20T13:10:04.827Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222, upload-time = "2024-09-20T13:08:56.254Z" }, + { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274, upload-time = "2024-09-20T13:08:58.645Z" }, + { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836, upload-time = "2024-09-20T19:01:57.571Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505, upload-time = "2024-09-20T13:09:01.501Z" }, + { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420, upload-time = "2024-09-20T19:02:00.678Z" }, + { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457, upload-time = "2024-09-20T13:09:04.105Z" }, + { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166, upload-time = "2024-09-20T13:09:06.917Z" }, + { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893, upload-time = "2024-09-20T13:09:09.655Z" }, + { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475, upload-time = "2024-09-20T13:09:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645, upload-time = "2024-09-20T19:02:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445, upload-time = "2024-09-20T13:09:17.621Z" }, + { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235, upload-time = "2024-09-20T19:02:07.094Z" }, + { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756, upload-time = "2024-09-20T13:09:20.474Z" }, + { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248, upload-time = "2024-09-20T13:09:23.137Z" }, + { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643, upload-time = "2024-09-20T13:09:25.522Z" }, + { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573, upload-time = "2024-09-20T13:09:28.012Z" }, + { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085, upload-time = "2024-09-20T19:02:10.451Z" }, + { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809, upload-time = "2024-09-20T13:09:30.814Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316, upload-time = "2024-09-20T19:02:13.825Z" }, + { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055, upload-time = "2024-09-20T13:09:33.462Z" }, + { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175, upload-time = "2024-09-20T13:09:35.871Z" }, + { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650, upload-time = "2024-09-20T13:09:38.685Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177, upload-time = "2024-09-20T13:09:41.141Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526, upload-time = "2024-09-20T19:02:16.905Z" }, + { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013, upload-time = "2024-09-20T13:09:44.39Z" }, + { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620, upload-time = "2024-09-20T19:02:20.639Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436, upload-time = "2024-09-20T13:09:48.112Z" }, ] [[package]] @@ -1287,9 +1301,9 @@ dependencies = [ { name = "pydantic" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a9/54/c0e76d1d54ff2f542f18b289db96c417d3bcd7e8e948de07921b492717e7/pdap_access_manager-0.3.5.tar.gz", hash = "sha256:5f8bbe0f25ef68810a0936ca22d40d3869d77391bae3c8ba1c885f8fe74154bd", size = 4120, upload_time = "2025-05-13T13:40:24.189Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/54/c0e76d1d54ff2f542f18b289db96c417d3bcd7e8e948de07921b492717e7/pdap_access_manager-0.3.5.tar.gz", hash = "sha256:5f8bbe0f25ef68810a0936ca22d40d3869d77391bae3c8ba1c885f8fe74154bd", size = 4120, upload-time = "2025-05-13T13:40:24.189Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/01/d4ba10d0d7be759e59011f4235c533b1bc31d5e99db86424cfd82284ce53/pdap_access_manager-0.3.5-py3-none-any.whl", hash = "sha256:b53a006e535d7733ca884560f41aa305068fec648c89524e397967a21e69a0d0", size = 4980, upload_time = "2025-05-13T13:40:23.223Z" }, + { url = "https://files.pythonhosted.org/packages/18/01/d4ba10d0d7be759e59011f4235c533b1bc31d5e99db86424cfd82284ce53/pdap_access_manager-0.3.5-py3-none-any.whl", hash = "sha256:b53a006e535d7733ca884560f41aa305068fec648c89524e397967a21e69a0d0", size = 4980, upload-time = "2025-05-13T13:40:23.223Z" }, ] [[package]] @@ -1300,39 +1314,39 @@ dependencies = [ { name = "python-dateutil" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/23/7c/009c12b86c7cc6c403aec80f8a4308598dfc5995e5c523a5491faaa3952e/pendulum-3.1.0.tar.gz", hash = "sha256:66f96303560f41d097bee7d2dc98ffca716fbb3a832c4b3062034c2d45865015", size = 85930, upload_time = "2025-04-19T14:30:01.675Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/6e/d28d3c22e6708b819a94c05bd05a3dfaed5c685379e8b6dc4b34b473b942/pendulum-3.1.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:61a03d14f8c64d13b2f7d5859e4b4053c4a7d3b02339f6c71f3e4606bfd67423", size = 338596, upload_time = "2025-04-19T14:01:11.306Z" }, - { url = "https://files.pythonhosted.org/packages/e1/e6/43324d58021d463c2eeb6146b169d2c935f2f840f9e45ac2d500453d954c/pendulum-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e674ed2d158afa5c361e60f1f67872dc55b492a10cacdaa7fcd7b7da5f158f24", size = 325854, upload_time = "2025-04-19T14:01:13.156Z" }, - { url = "https://files.pythonhosted.org/packages/b0/a7/d2ae79b960bfdea94dab67e2f118697b08bc9e98eb6bd8d32c4d99240da3/pendulum-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c75377eb16e58bbe7e03ea89eeea49be6fc5de0934a4aef0e263f8b4fa71bc2", size = 344334, upload_time = "2025-04-19T14:01:15.151Z" }, - { url = "https://files.pythonhosted.org/packages/96/94/941f071212e23c29aae7def891fb636930c648386e059ce09ea0dcd43933/pendulum-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:656b8b0ce070f0f2e5e2668247d3c783c55336534aa1f13bd0969535878955e1", size = 382259, upload_time = "2025-04-19T14:01:16.924Z" }, - { url = "https://files.pythonhosted.org/packages/51/ad/a78a701656aec00d16fee636704445c23ca11617a0bfe7c3848d1caa5157/pendulum-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48962903e6c1afe1f13548cb6252666056086c107d59e3d64795c58c9298bc2e", size = 436361, upload_time = "2025-04-19T14:01:18.796Z" }, - { url = "https://files.pythonhosted.org/packages/da/93/83f59ccbf4435c29dca8c63a6560fcbe4783079a468a5f91d9f886fd21f0/pendulum-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d364ec3f8e65010fefd4b0aaf7be5eb97e5df761b107a06f5e743b7c3f52c311", size = 353653, upload_time = "2025-04-19T14:01:20.159Z" }, - { url = "https://files.pythonhosted.org/packages/6f/0f/42d6644ec6339b41066f594e52d286162aecd2e9735aaf994d7e00c9e09d/pendulum-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd52caffc2afb86612ec43bbeb226f204ea12ebff9f3d12f900a7d3097210fcc", size = 524567, upload_time = "2025-04-19T14:01:21.457Z" }, - { url = "https://files.pythonhosted.org/packages/de/45/d84d909202755ab9d3379e5481fdf70f53344ebefbd68d6f5803ddde98a6/pendulum-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d439fccaa35c91f686bd59d30604dab01e8b5c1d0dd66e81648c432fd3f8a539", size = 525571, upload_time = "2025-04-19T14:01:23.329Z" }, - { url = "https://files.pythonhosted.org/packages/0d/e0/4de160773ce3c2f7843c310db19dd919a0cd02cc1c0384866f63b18a6251/pendulum-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:43288773a86d9c5c0ddb645f88f615ff6bd12fd1410b34323662beccb18f3b49", size = 260259, upload_time = "2025-04-19T14:01:24.689Z" }, - { url = "https://files.pythonhosted.org/packages/c1/7f/ffa278f78112c6c6e5130a702042f52aab5c649ae2edf814df07810bbba5/pendulum-3.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:569ea5072ae0f11d625e03b36d865f8037b76e838a3b621f6967314193896a11", size = 253899, upload_time = "2025-04-19T14:01:26.442Z" }, - { url = "https://files.pythonhosted.org/packages/7a/d7/b1bfe15a742f2c2713acb1fdc7dc3594ff46ef9418ac6a96fcb12a6ba60b/pendulum-3.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4dfd53e7583ccae138be86d6c0a0b324c7547df2afcec1876943c4d481cf9608", size = 336209, upload_time = "2025-04-19T14:01:27.815Z" }, - { url = "https://files.pythonhosted.org/packages/eb/87/0392da0c603c828b926d9f7097fbdddaafc01388cb8a00888635d04758c3/pendulum-3.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6a6e06a28f3a7d696546347805536f6f38be458cb79de4f80754430696bea9e6", size = 323130, upload_time = "2025-04-19T14:01:29.336Z" }, - { url = "https://files.pythonhosted.org/packages/c0/61/95f1eec25796be6dddf71440ee16ec1fd0c573fc61a73bd1ef6daacd529a/pendulum-3.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e68d6a51880708084afd8958af42dc8c5e819a70a6c6ae903b1c4bfc61e0f25", size = 341509, upload_time = "2025-04-19T14:01:31.1Z" }, - { url = "https://files.pythonhosted.org/packages/b5/7b/eb0f5e6aa87d5e1b467a1611009dbdc92f0f72425ebf07669bfadd8885a6/pendulum-3.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e3f1e5da39a7ea7119efda1dd96b529748c1566f8a983412d0908455d606942", size = 378674, upload_time = "2025-04-19T14:01:32.974Z" }, - { url = "https://files.pythonhosted.org/packages/29/68/5a4c1b5de3e54e16cab21d2ec88f9cd3f18599e96cc90a441c0b0ab6b03f/pendulum-3.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9af1e5eeddb4ebbe1b1c9afb9fd8077d73416ade42dd61264b3f3b87742e0bb", size = 436133, upload_time = "2025-04-19T14:01:34.349Z" }, - { url = "https://files.pythonhosted.org/packages/87/5d/f7a1d693e5c0f789185117d5c1d5bee104f5b0d9fbf061d715fb61c840a8/pendulum-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20f74aa8029a42e327bfc150472e0e4d2358fa5d795f70460160ba81b94b6945", size = 351232, upload_time = "2025-04-19T14:01:35.669Z" }, - { url = "https://files.pythonhosted.org/packages/30/77/c97617eb31f1d0554edb073201a294019b9e0a9bd2f73c68e6d8d048cd6b/pendulum-3.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cf6229e5ee70c2660148523f46c472e677654d0097bec010d6730f08312a4931", size = 521562, upload_time = "2025-04-19T14:01:37.05Z" }, - { url = "https://files.pythonhosted.org/packages/76/22/0d0ef3393303877e757b848ecef8a9a8c7627e17e7590af82d14633b2cd1/pendulum-3.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:350cabb23bf1aec7c7694b915d3030bff53a2ad4aeabc8c8c0d807c8194113d6", size = 523221, upload_time = "2025-04-19T14:01:38.444Z" }, - { url = "https://files.pythonhosted.org/packages/99/f3/aefb579aa3cebd6f2866b205fc7a60d33e9a696e9e629024752107dc3cf5/pendulum-3.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:42959341e843077c41d47420f28c3631de054abd64da83f9b956519b5c7a06a7", size = 260502, upload_time = "2025-04-19T14:01:39.814Z" }, - { url = "https://files.pythonhosted.org/packages/02/74/4332b5d6e34c63d4df8e8eab2249e74c05513b1477757463f7fdca99e9be/pendulum-3.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:006758e2125da2e624493324dfd5d7d1b02b0c44bc39358e18bf0f66d0767f5f", size = 253089, upload_time = "2025-04-19T14:01:41.171Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1f/af928ba4aa403dac9569f787adcf024005e7654433d71f7a84e608716837/pendulum-3.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:28658b0baf4b30eb31d096a375983cfed033e60c0a7bbe94fa23f06cd779b50b", size = 336209, upload_time = "2025-04-19T14:01:42.775Z" }, - { url = "https://files.pythonhosted.org/packages/b6/16/b010643007ba964c397da7fa622924423883c1bbff1a53f9d1022cd7f024/pendulum-3.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b114dcb99ce511cb8f5495c7b6f0056b2c3dba444ef1ea6e48030d7371bd531a", size = 323132, upload_time = "2025-04-19T14:01:44.577Z" }, - { url = "https://files.pythonhosted.org/packages/64/19/c3c47aeecb5d9bceb0e89faafd800d39809b696c5b7bba8ec8370ad5052c/pendulum-3.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2404a6a54c80252ea393291f0b7f35525a61abae3d795407f34e118a8f133a18", size = 341509, upload_time = "2025-04-19T14:01:46.084Z" }, - { url = "https://files.pythonhosted.org/packages/38/cf/c06921ff6b860ff7e62e70b8e5d4dc70e36f5abb66d168bd64d51760bc4e/pendulum-3.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d06999790d9ee9962a1627e469f98568bf7ad1085553fa3c30ed08b3944a14d7", size = 378674, upload_time = "2025-04-19T14:01:47.727Z" }, - { url = "https://files.pythonhosted.org/packages/62/0b/a43953b9eba11e82612b033ac5133f716f1b76b6108a65da6f408b3cc016/pendulum-3.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94751c52f6b7c306734d1044c2c6067a474237e1e5afa2f665d1fbcbbbcf24b3", size = 436133, upload_time = "2025-04-19T14:01:49.126Z" }, - { url = "https://files.pythonhosted.org/packages/eb/a0/ec3d70b3b96e23ae1d039f132af35e17704c22a8250d1887aaefea4d78a6/pendulum-3.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5553ac27be05e997ec26d7f004cf72788f4ce11fe60bb80dda604a64055b29d0", size = 351232, upload_time = "2025-04-19T14:01:50.575Z" }, - { url = "https://files.pythonhosted.org/packages/f4/97/aba23f1716b82f6951ba2b1c9178a2d107d1e66c102762a9bf19988547ea/pendulum-3.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f8dee234ca6142bf0514368d01a72945a44685aaa2fc4c14c98d09da9437b620", size = 521563, upload_time = "2025-04-19T14:01:51.9Z" }, - { url = "https://files.pythonhosted.org/packages/01/33/2c0d5216cc53d16db0c4b3d510f141ee0a540937f8675948541190fbd48b/pendulum-3.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7378084fe54faab4ee481897a00b710876f2e901ded6221671e827a253e643f2", size = 523221, upload_time = "2025-04-19T14:01:53.275Z" }, - { url = "https://files.pythonhosted.org/packages/51/89/8de955c339c31aeae77fd86d3225509b998c81875e9dba28cb88b8cbf4b3/pendulum-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:8539db7ae2c8da430ac2515079e288948c8ebf7eb1edd3e8281b5cdf433040d6", size = 260501, upload_time = "2025-04-19T14:01:54.749Z" }, - { url = "https://files.pythonhosted.org/packages/15/c3/226a3837363e94f8722461848feec18bfdd7d5172564d53aa3c3397ff01e/pendulum-3.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:1ce26a608e1f7387cd393fba2a129507c4900958d4f47b90757ec17656856571", size = 253087, upload_time = "2025-04-19T14:01:55.998Z" }, - { url = "https://files.pythonhosted.org/packages/6e/23/e98758924d1b3aac11a626268eabf7f3cf177e7837c28d47bf84c64532d0/pendulum-3.1.0-py3-none-any.whl", hash = "sha256:f9178c2a8e291758ade1e8dd6371b1d26d08371b4c7730a6e9a3ef8b16ebae0f", size = 111799, upload_time = "2025-04-19T14:02:34.739Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/23/7c/009c12b86c7cc6c403aec80f8a4308598dfc5995e5c523a5491faaa3952e/pendulum-3.1.0.tar.gz", hash = "sha256:66f96303560f41d097bee7d2dc98ffca716fbb3a832c4b3062034c2d45865015", size = 85930, upload-time = "2025-04-19T14:30:01.675Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/6e/d28d3c22e6708b819a94c05bd05a3dfaed5c685379e8b6dc4b34b473b942/pendulum-3.1.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:61a03d14f8c64d13b2f7d5859e4b4053c4a7d3b02339f6c71f3e4606bfd67423", size = 338596, upload-time = "2025-04-19T14:01:11.306Z" }, + { url = "https://files.pythonhosted.org/packages/e1/e6/43324d58021d463c2eeb6146b169d2c935f2f840f9e45ac2d500453d954c/pendulum-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e674ed2d158afa5c361e60f1f67872dc55b492a10cacdaa7fcd7b7da5f158f24", size = 325854, upload-time = "2025-04-19T14:01:13.156Z" }, + { url = "https://files.pythonhosted.org/packages/b0/a7/d2ae79b960bfdea94dab67e2f118697b08bc9e98eb6bd8d32c4d99240da3/pendulum-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c75377eb16e58bbe7e03ea89eeea49be6fc5de0934a4aef0e263f8b4fa71bc2", size = 344334, upload-time = "2025-04-19T14:01:15.151Z" }, + { url = "https://files.pythonhosted.org/packages/96/94/941f071212e23c29aae7def891fb636930c648386e059ce09ea0dcd43933/pendulum-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:656b8b0ce070f0f2e5e2668247d3c783c55336534aa1f13bd0969535878955e1", size = 382259, upload-time = "2025-04-19T14:01:16.924Z" }, + { url = "https://files.pythonhosted.org/packages/51/ad/a78a701656aec00d16fee636704445c23ca11617a0bfe7c3848d1caa5157/pendulum-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48962903e6c1afe1f13548cb6252666056086c107d59e3d64795c58c9298bc2e", size = 436361, upload-time = "2025-04-19T14:01:18.796Z" }, + { url = "https://files.pythonhosted.org/packages/da/93/83f59ccbf4435c29dca8c63a6560fcbe4783079a468a5f91d9f886fd21f0/pendulum-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d364ec3f8e65010fefd4b0aaf7be5eb97e5df761b107a06f5e743b7c3f52c311", size = 353653, upload-time = "2025-04-19T14:01:20.159Z" }, + { url = "https://files.pythonhosted.org/packages/6f/0f/42d6644ec6339b41066f594e52d286162aecd2e9735aaf994d7e00c9e09d/pendulum-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd52caffc2afb86612ec43bbeb226f204ea12ebff9f3d12f900a7d3097210fcc", size = 524567, upload-time = "2025-04-19T14:01:21.457Z" }, + { url = "https://files.pythonhosted.org/packages/de/45/d84d909202755ab9d3379e5481fdf70f53344ebefbd68d6f5803ddde98a6/pendulum-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d439fccaa35c91f686bd59d30604dab01e8b5c1d0dd66e81648c432fd3f8a539", size = 525571, upload-time = "2025-04-19T14:01:23.329Z" }, + { url = "https://files.pythonhosted.org/packages/0d/e0/4de160773ce3c2f7843c310db19dd919a0cd02cc1c0384866f63b18a6251/pendulum-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:43288773a86d9c5c0ddb645f88f615ff6bd12fd1410b34323662beccb18f3b49", size = 260259, upload-time = "2025-04-19T14:01:24.689Z" }, + { url = "https://files.pythonhosted.org/packages/c1/7f/ffa278f78112c6c6e5130a702042f52aab5c649ae2edf814df07810bbba5/pendulum-3.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:569ea5072ae0f11d625e03b36d865f8037b76e838a3b621f6967314193896a11", size = 253899, upload-time = "2025-04-19T14:01:26.442Z" }, + { url = "https://files.pythonhosted.org/packages/7a/d7/b1bfe15a742f2c2713acb1fdc7dc3594ff46ef9418ac6a96fcb12a6ba60b/pendulum-3.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4dfd53e7583ccae138be86d6c0a0b324c7547df2afcec1876943c4d481cf9608", size = 336209, upload-time = "2025-04-19T14:01:27.815Z" }, + { url = "https://files.pythonhosted.org/packages/eb/87/0392da0c603c828b926d9f7097fbdddaafc01388cb8a00888635d04758c3/pendulum-3.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6a6e06a28f3a7d696546347805536f6f38be458cb79de4f80754430696bea9e6", size = 323130, upload-time = "2025-04-19T14:01:29.336Z" }, + { url = "https://files.pythonhosted.org/packages/c0/61/95f1eec25796be6dddf71440ee16ec1fd0c573fc61a73bd1ef6daacd529a/pendulum-3.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e68d6a51880708084afd8958af42dc8c5e819a70a6c6ae903b1c4bfc61e0f25", size = 341509, upload-time = "2025-04-19T14:01:31.1Z" }, + { url = "https://files.pythonhosted.org/packages/b5/7b/eb0f5e6aa87d5e1b467a1611009dbdc92f0f72425ebf07669bfadd8885a6/pendulum-3.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e3f1e5da39a7ea7119efda1dd96b529748c1566f8a983412d0908455d606942", size = 378674, upload-time = "2025-04-19T14:01:32.974Z" }, + { url = "https://files.pythonhosted.org/packages/29/68/5a4c1b5de3e54e16cab21d2ec88f9cd3f18599e96cc90a441c0b0ab6b03f/pendulum-3.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9af1e5eeddb4ebbe1b1c9afb9fd8077d73416ade42dd61264b3f3b87742e0bb", size = 436133, upload-time = "2025-04-19T14:01:34.349Z" }, + { url = "https://files.pythonhosted.org/packages/87/5d/f7a1d693e5c0f789185117d5c1d5bee104f5b0d9fbf061d715fb61c840a8/pendulum-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20f74aa8029a42e327bfc150472e0e4d2358fa5d795f70460160ba81b94b6945", size = 351232, upload-time = "2025-04-19T14:01:35.669Z" }, + { url = "https://files.pythonhosted.org/packages/30/77/c97617eb31f1d0554edb073201a294019b9e0a9bd2f73c68e6d8d048cd6b/pendulum-3.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cf6229e5ee70c2660148523f46c472e677654d0097bec010d6730f08312a4931", size = 521562, upload-time = "2025-04-19T14:01:37.05Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/0d0ef3393303877e757b848ecef8a9a8c7627e17e7590af82d14633b2cd1/pendulum-3.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:350cabb23bf1aec7c7694b915d3030bff53a2ad4aeabc8c8c0d807c8194113d6", size = 523221, upload-time = "2025-04-19T14:01:38.444Z" }, + { url = "https://files.pythonhosted.org/packages/99/f3/aefb579aa3cebd6f2866b205fc7a60d33e9a696e9e629024752107dc3cf5/pendulum-3.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:42959341e843077c41d47420f28c3631de054abd64da83f9b956519b5c7a06a7", size = 260502, upload-time = "2025-04-19T14:01:39.814Z" }, + { url = "https://files.pythonhosted.org/packages/02/74/4332b5d6e34c63d4df8e8eab2249e74c05513b1477757463f7fdca99e9be/pendulum-3.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:006758e2125da2e624493324dfd5d7d1b02b0c44bc39358e18bf0f66d0767f5f", size = 253089, upload-time = "2025-04-19T14:01:41.171Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1f/af928ba4aa403dac9569f787adcf024005e7654433d71f7a84e608716837/pendulum-3.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:28658b0baf4b30eb31d096a375983cfed033e60c0a7bbe94fa23f06cd779b50b", size = 336209, upload-time = "2025-04-19T14:01:42.775Z" }, + { url = "https://files.pythonhosted.org/packages/b6/16/b010643007ba964c397da7fa622924423883c1bbff1a53f9d1022cd7f024/pendulum-3.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b114dcb99ce511cb8f5495c7b6f0056b2c3dba444ef1ea6e48030d7371bd531a", size = 323132, upload-time = "2025-04-19T14:01:44.577Z" }, + { url = "https://files.pythonhosted.org/packages/64/19/c3c47aeecb5d9bceb0e89faafd800d39809b696c5b7bba8ec8370ad5052c/pendulum-3.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2404a6a54c80252ea393291f0b7f35525a61abae3d795407f34e118a8f133a18", size = 341509, upload-time = "2025-04-19T14:01:46.084Z" }, + { url = "https://files.pythonhosted.org/packages/38/cf/c06921ff6b860ff7e62e70b8e5d4dc70e36f5abb66d168bd64d51760bc4e/pendulum-3.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d06999790d9ee9962a1627e469f98568bf7ad1085553fa3c30ed08b3944a14d7", size = 378674, upload-time = "2025-04-19T14:01:47.727Z" }, + { url = "https://files.pythonhosted.org/packages/62/0b/a43953b9eba11e82612b033ac5133f716f1b76b6108a65da6f408b3cc016/pendulum-3.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94751c52f6b7c306734d1044c2c6067a474237e1e5afa2f665d1fbcbbbcf24b3", size = 436133, upload-time = "2025-04-19T14:01:49.126Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a0/ec3d70b3b96e23ae1d039f132af35e17704c22a8250d1887aaefea4d78a6/pendulum-3.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5553ac27be05e997ec26d7f004cf72788f4ce11fe60bb80dda604a64055b29d0", size = 351232, upload-time = "2025-04-19T14:01:50.575Z" }, + { url = "https://files.pythonhosted.org/packages/f4/97/aba23f1716b82f6951ba2b1c9178a2d107d1e66c102762a9bf19988547ea/pendulum-3.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f8dee234ca6142bf0514368d01a72945a44685aaa2fc4c14c98d09da9437b620", size = 521563, upload-time = "2025-04-19T14:01:51.9Z" }, + { url = "https://files.pythonhosted.org/packages/01/33/2c0d5216cc53d16db0c4b3d510f141ee0a540937f8675948541190fbd48b/pendulum-3.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7378084fe54faab4ee481897a00b710876f2e901ded6221671e827a253e643f2", size = 523221, upload-time = "2025-04-19T14:01:53.275Z" }, + { url = "https://files.pythonhosted.org/packages/51/89/8de955c339c31aeae77fd86d3225509b998c81875e9dba28cb88b8cbf4b3/pendulum-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:8539db7ae2c8da430ac2515079e288948c8ebf7eb1edd3e8281b5cdf433040d6", size = 260501, upload-time = "2025-04-19T14:01:54.749Z" }, + { url = "https://files.pythonhosted.org/packages/15/c3/226a3837363e94f8722461848feec18bfdd7d5172564d53aa3c3397ff01e/pendulum-3.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:1ce26a608e1f7387cd393fba2a129507c4900958d4f47b90757ec17656856571", size = 253087, upload-time = "2025-04-19T14:01:55.998Z" }, + { url = "https://files.pythonhosted.org/packages/6e/23/e98758924d1b3aac11a626268eabf7f3cf177e7837c28d47bf84c64532d0/pendulum-3.1.0-py3-none-any.whl", hash = "sha256:f9178c2a8e291758ade1e8dd6371b1d26d08371b4c7730a6e9a3ef8b16ebae0f", size = 111799, upload-time = "2025-04-19T14:02:34.739Z" }, ] [[package]] @@ -1344,95 +1358,95 @@ dependencies = [ { name = "pyee" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/be/01025581052e43eb698092c4328d7497ca62bcb5c83f15a611d4a71b4b92/playwright-1.49.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:1041ffb45a0d0bc44d698d3a5aa3ac4b67c9bd03540da43a0b70616ad52592b8", size = 39559859, upload_time = "2024-12-10T17:32:14.907Z" }, - { url = "https://files.pythonhosted.org/packages/79/25/ef1010a42cc7d576282015d983c5451d73e369b198b6eb32a177fae281f8/playwright-1.49.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9f38ed3d0c1f4e0a6d1c92e73dd9a61f8855133249d6f0cec28648d38a7137be", size = 38808973, upload_time = "2024-12-10T17:32:22.516Z" }, - { url = "https://files.pythonhosted.org/packages/70/4b/3930cf10f303a10d493a382e4448aaff898b4065698b3b8d92f902e53e08/playwright-1.49.1-py3-none-macosx_11_0_universal2.whl", hash = "sha256:3be48c6d26dc819ca0a26567c1ae36a980a0303dcd4249feb6f59e115aaddfb8", size = 39559863, upload_time = "2024-12-10T17:32:29.12Z" }, - { url = "https://files.pythonhosted.org/packages/9a/c1/ea765e72a746dc7ec2ce155ffea29d454e7171db78f3c09185e888387246/playwright-1.49.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:753ca90ee31b4b03d165cfd36e477309ebf2b4381953f2a982ff612d85b147d2", size = 44163300, upload_time = "2024-12-10T17:32:35.647Z" }, - { url = "https://files.pythonhosted.org/packages/5a/52/95efac704bf36b770a2522d88a6dee298042845d10bfb35f7ca0fcc36d91/playwright-1.49.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd9bc8dab37aa25198a01f555f0a2e2c3813fe200fef018ac34dfe86b34994b9", size = 43744353, upload_time = "2024-12-10T17:32:43.189Z" }, - { url = "https://files.pythonhosted.org/packages/f9/97/a3fccc9aaa6da83890772e9980703b0ea6b1e1ad42042fb50df3aef6c641/playwright-1.49.1-py3-none-win32.whl", hash = "sha256:43b304be67f096058e587dac453ece550eff87b8fbed28de30f4f022cc1745bb", size = 34060663, upload_time = "2024-12-10T17:32:49.904Z" }, - { url = "https://files.pythonhosted.org/packages/71/a9/bd88ac0bd498c91aab3aba2e393d1fa59f72a7243e9265ccbf4861ca4f64/playwright-1.49.1-py3-none-win_amd64.whl", hash = "sha256:47b23cb346283278f5b4d1e1990bcb6d6302f80c0aa0ca93dd0601a1400191df", size = 34060667, upload_time = "2024-12-10T17:32:56.459Z" }, + { url = "https://files.pythonhosted.org/packages/ab/be/01025581052e43eb698092c4328d7497ca62bcb5c83f15a611d4a71b4b92/playwright-1.49.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:1041ffb45a0d0bc44d698d3a5aa3ac4b67c9bd03540da43a0b70616ad52592b8", size = 39559859, upload-time = "2024-12-10T17:32:14.907Z" }, + { url = "https://files.pythonhosted.org/packages/79/25/ef1010a42cc7d576282015d983c5451d73e369b198b6eb32a177fae281f8/playwright-1.49.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9f38ed3d0c1f4e0a6d1c92e73dd9a61f8855133249d6f0cec28648d38a7137be", size = 38808973, upload-time = "2024-12-10T17:32:22.516Z" }, + { url = "https://files.pythonhosted.org/packages/70/4b/3930cf10f303a10d493a382e4448aaff898b4065698b3b8d92f902e53e08/playwright-1.49.1-py3-none-macosx_11_0_universal2.whl", hash = "sha256:3be48c6d26dc819ca0a26567c1ae36a980a0303dcd4249feb6f59e115aaddfb8", size = 39559863, upload-time = "2024-12-10T17:32:29.12Z" }, + { url = "https://files.pythonhosted.org/packages/9a/c1/ea765e72a746dc7ec2ce155ffea29d454e7171db78f3c09185e888387246/playwright-1.49.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:753ca90ee31b4b03d165cfd36e477309ebf2b4381953f2a982ff612d85b147d2", size = 44163300, upload-time = "2024-12-10T17:32:35.647Z" }, + { url = "https://files.pythonhosted.org/packages/5a/52/95efac704bf36b770a2522d88a6dee298042845d10bfb35f7ca0fcc36d91/playwright-1.49.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd9bc8dab37aa25198a01f555f0a2e2c3813fe200fef018ac34dfe86b34994b9", size = 43744353, upload-time = "2024-12-10T17:32:43.189Z" }, + { url = "https://files.pythonhosted.org/packages/f9/97/a3fccc9aaa6da83890772e9980703b0ea6b1e1ad42042fb50df3aef6c641/playwright-1.49.1-py3-none-win32.whl", hash = "sha256:43b304be67f096058e587dac453ece550eff87b8fbed28de30f4f022cc1745bb", size = 34060663, upload-time = "2024-12-10T17:32:49.904Z" }, + { url = "https://files.pythonhosted.org/packages/71/a9/bd88ac0bd498c91aab3aba2e393d1fa59f72a7243e9265ccbf4861ca4f64/playwright-1.49.1-py3-none-win_amd64.whl", hash = "sha256:47b23cb346283278f5b4d1e1990bcb6d6302f80c0aa0ca93dd0601a1400191df", size = 34060667, upload-time = "2024-12-10T17:32:56.459Z" }, ] [[package]] name = "pluggy" version = "1.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload_time = "2024-04-20T21:34:42.531Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload-time = "2024-04-20T21:34:42.531Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload_time = "2024-04-20T21:34:40.434Z" }, + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, ] [[package]] name = "propcache" version = "0.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/07/c8/fdc6686a986feae3541ea23dcaa661bd93972d3940460646c6bb96e21c40/propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", size = 43651, upload_time = "2025-03-26T03:06:12.05Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/0f/5a5319ee83bd651f75311fcb0c492c21322a7fc8f788e4eef23f44243427/propcache-0.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", size = 80243, upload_time = "2025-03-26T03:04:01.912Z" }, - { url = "https://files.pythonhosted.org/packages/ce/84/3db5537e0879942783e2256616ff15d870a11d7ac26541336fe1b673c818/propcache-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", size = 46503, upload_time = "2025-03-26T03:04:03.704Z" }, - { url = "https://files.pythonhosted.org/packages/e2/c8/b649ed972433c3f0d827d7f0cf9ea47162f4ef8f4fe98c5f3641a0bc63ff/propcache-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", size = 45934, upload_time = "2025-03-26T03:04:05.257Z" }, - { url = "https://files.pythonhosted.org/packages/59/f9/4c0a5cf6974c2c43b1a6810c40d889769cc8f84cea676cbe1e62766a45f8/propcache-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", size = 233633, upload_time = "2025-03-26T03:04:07.044Z" }, - { url = "https://files.pythonhosted.org/packages/e7/64/66f2f4d1b4f0007c6e9078bd95b609b633d3957fe6dd23eac33ebde4b584/propcache-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", size = 241124, upload_time = "2025-03-26T03:04:08.676Z" }, - { url = "https://files.pythonhosted.org/packages/aa/bf/7b8c9fd097d511638fa9b6af3d986adbdf567598a567b46338c925144c1b/propcache-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", size = 240283, upload_time = "2025-03-26T03:04:10.172Z" }, - { url = "https://files.pythonhosted.org/packages/fa/c9/e85aeeeaae83358e2a1ef32d6ff50a483a5d5248bc38510d030a6f4e2816/propcache-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", size = 232498, upload_time = "2025-03-26T03:04:11.616Z" }, - { url = "https://files.pythonhosted.org/packages/8e/66/acb88e1f30ef5536d785c283af2e62931cb934a56a3ecf39105887aa8905/propcache-0.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", size = 221486, upload_time = "2025-03-26T03:04:13.102Z" }, - { url = "https://files.pythonhosted.org/packages/f5/f9/233ddb05ffdcaee4448508ee1d70aa7deff21bb41469ccdfcc339f871427/propcache-0.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", size = 222675, upload_time = "2025-03-26T03:04:14.658Z" }, - { url = "https://files.pythonhosted.org/packages/98/b8/eb977e28138f9e22a5a789daf608d36e05ed93093ef12a12441030da800a/propcache-0.3.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", size = 215727, upload_time = "2025-03-26T03:04:16.207Z" }, - { url = "https://files.pythonhosted.org/packages/89/2d/5f52d9c579f67b8ee1edd9ec073c91b23cc5b7ff7951a1e449e04ed8fdf3/propcache-0.3.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", size = 217878, upload_time = "2025-03-26T03:04:18.11Z" }, - { url = "https://files.pythonhosted.org/packages/7a/fd/5283e5ed8a82b00c7a989b99bb6ea173db1ad750bf0bf8dff08d3f4a4e28/propcache-0.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", size = 230558, upload_time = "2025-03-26T03:04:19.562Z" }, - { url = "https://files.pythonhosted.org/packages/90/38/ab17d75938ef7ac87332c588857422ae126b1c76253f0f5b1242032923ca/propcache-0.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", size = 233754, upload_time = "2025-03-26T03:04:21.065Z" }, - { url = "https://files.pythonhosted.org/packages/06/5d/3b921b9c60659ae464137508d3b4c2b3f52f592ceb1964aa2533b32fcf0b/propcache-0.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", size = 226088, upload_time = "2025-03-26T03:04:22.718Z" }, - { url = "https://files.pythonhosted.org/packages/54/6e/30a11f4417d9266b5a464ac5a8c5164ddc9dd153dfa77bf57918165eb4ae/propcache-0.3.1-cp311-cp311-win32.whl", hash = "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", size = 40859, upload_time = "2025-03-26T03:04:24.039Z" }, - { url = "https://files.pythonhosted.org/packages/1d/3a/8a68dd867da9ca2ee9dfd361093e9cb08cb0f37e5ddb2276f1b5177d7731/propcache-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", size = 45153, upload_time = "2025-03-26T03:04:25.211Z" }, - { url = "https://files.pythonhosted.org/packages/41/aa/ca78d9be314d1e15ff517b992bebbed3bdfef5b8919e85bf4940e57b6137/propcache-0.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", size = 80430, upload_time = "2025-03-26T03:04:26.436Z" }, - { url = "https://files.pythonhosted.org/packages/1a/d8/f0c17c44d1cda0ad1979af2e593ea290defdde9eaeb89b08abbe02a5e8e1/propcache-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", size = 46637, upload_time = "2025-03-26T03:04:27.932Z" }, - { url = "https://files.pythonhosted.org/packages/ae/bd/c1e37265910752e6e5e8a4c1605d0129e5b7933c3dc3cf1b9b48ed83b364/propcache-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", size = 46123, upload_time = "2025-03-26T03:04:30.659Z" }, - { url = "https://files.pythonhosted.org/packages/d4/b0/911eda0865f90c0c7e9f0415d40a5bf681204da5fd7ca089361a64c16b28/propcache-0.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", size = 243031, upload_time = "2025-03-26T03:04:31.977Z" }, - { url = "https://files.pythonhosted.org/packages/0a/06/0da53397c76a74271621807265b6eb61fb011451b1ddebf43213df763669/propcache-0.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", size = 249100, upload_time = "2025-03-26T03:04:33.45Z" }, - { url = "https://files.pythonhosted.org/packages/f1/eb/13090e05bf6b963fc1653cdc922133ced467cb4b8dab53158db5a37aa21e/propcache-0.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", size = 250170, upload_time = "2025-03-26T03:04:35.542Z" }, - { url = "https://files.pythonhosted.org/packages/3b/4c/f72c9e1022b3b043ec7dc475a0f405d4c3e10b9b1d378a7330fecf0652da/propcache-0.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", size = 245000, upload_time = "2025-03-26T03:04:37.501Z" }, - { url = "https://files.pythonhosted.org/packages/e8/fd/970ca0e22acc829f1adf5de3724085e778c1ad8a75bec010049502cb3a86/propcache-0.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", size = 230262, upload_time = "2025-03-26T03:04:39.532Z" }, - { url = "https://files.pythonhosted.org/packages/c4/42/817289120c6b9194a44f6c3e6b2c3277c5b70bbad39e7df648f177cc3634/propcache-0.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", size = 236772, upload_time = "2025-03-26T03:04:41.109Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9c/3b3942b302badd589ad6b672da3ca7b660a6c2f505cafd058133ddc73918/propcache-0.3.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", size = 231133, upload_time = "2025-03-26T03:04:42.544Z" }, - { url = "https://files.pythonhosted.org/packages/98/a1/75f6355f9ad039108ff000dfc2e19962c8dea0430da9a1428e7975cf24b2/propcache-0.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", size = 230741, upload_time = "2025-03-26T03:04:44.06Z" }, - { url = "https://files.pythonhosted.org/packages/67/0c/3e82563af77d1f8731132166da69fdfd95e71210e31f18edce08a1eb11ea/propcache-0.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", size = 244047, upload_time = "2025-03-26T03:04:45.983Z" }, - { url = "https://files.pythonhosted.org/packages/f7/50/9fb7cca01532a08c4d5186d7bb2da6c4c587825c0ae134b89b47c7d62628/propcache-0.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5", size = 246467, upload_time = "2025-03-26T03:04:47.699Z" }, - { url = "https://files.pythonhosted.org/packages/a9/02/ccbcf3e1c604c16cc525309161d57412c23cf2351523aedbb280eb7c9094/propcache-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", size = 241022, upload_time = "2025-03-26T03:04:49.195Z" }, - { url = "https://files.pythonhosted.org/packages/db/19/e777227545e09ca1e77a6e21274ae9ec45de0f589f0ce3eca2a41f366220/propcache-0.3.1-cp312-cp312-win32.whl", hash = "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", size = 40647, upload_time = "2025-03-26T03:04:50.595Z" }, - { url = "https://files.pythonhosted.org/packages/24/bb/3b1b01da5dd04c77a204c84e538ff11f624e31431cfde7201d9110b092b1/propcache-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", size = 44784, upload_time = "2025-03-26T03:04:51.791Z" }, - { url = "https://files.pythonhosted.org/packages/58/60/f645cc8b570f99be3cf46714170c2de4b4c9d6b827b912811eff1eb8a412/propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", size = 77865, upload_time = "2025-03-26T03:04:53.406Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d4/c1adbf3901537582e65cf90fd9c26fde1298fde5a2c593f987112c0d0798/propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", size = 45452, upload_time = "2025-03-26T03:04:54.624Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b5/fe752b2e63f49f727c6c1c224175d21b7d1727ce1d4873ef1c24c9216830/propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", size = 44800, upload_time = "2025-03-26T03:04:55.844Z" }, - { url = "https://files.pythonhosted.org/packages/62/37/fc357e345bc1971e21f76597028b059c3d795c5ca7690d7a8d9a03c9708a/propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", size = 225804, upload_time = "2025-03-26T03:04:57.158Z" }, - { url = "https://files.pythonhosted.org/packages/0d/f1/16e12c33e3dbe7f8b737809bad05719cff1dccb8df4dafbcff5575002c0e/propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", size = 230650, upload_time = "2025-03-26T03:04:58.61Z" }, - { url = "https://files.pythonhosted.org/packages/3e/a2/018b9f2ed876bf5091e60153f727e8f9073d97573f790ff7cdf6bc1d1fb8/propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", size = 234235, upload_time = "2025-03-26T03:05:00.599Z" }, - { url = "https://files.pythonhosted.org/packages/45/5f/3faee66fc930dfb5da509e34c6ac7128870631c0e3582987fad161fcb4b1/propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", size = 228249, upload_time = "2025-03-26T03:05:02.11Z" }, - { url = "https://files.pythonhosted.org/packages/62/1e/a0d5ebda5da7ff34d2f5259a3e171a94be83c41eb1e7cd21a2105a84a02e/propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", size = 214964, upload_time = "2025-03-26T03:05:03.599Z" }, - { url = "https://files.pythonhosted.org/packages/db/a0/d72da3f61ceab126e9be1f3bc7844b4e98c6e61c985097474668e7e52152/propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", size = 222501, upload_time = "2025-03-26T03:05:05.107Z" }, - { url = "https://files.pythonhosted.org/packages/18/6d/a008e07ad7b905011253adbbd97e5b5375c33f0b961355ca0a30377504ac/propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", size = 217917, upload_time = "2025-03-26T03:05:06.59Z" }, - { url = "https://files.pythonhosted.org/packages/98/37/02c9343ffe59e590e0e56dc5c97d0da2b8b19fa747ebacf158310f97a79a/propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", size = 217089, upload_time = "2025-03-26T03:05:08.1Z" }, - { url = "https://files.pythonhosted.org/packages/53/1b/d3406629a2c8a5666d4674c50f757a77be119b113eedd47b0375afdf1b42/propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", size = 228102, upload_time = "2025-03-26T03:05:09.982Z" }, - { url = "https://files.pythonhosted.org/packages/cd/a7/3664756cf50ce739e5f3abd48febc0be1a713b1f389a502ca819791a6b69/propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", size = 230122, upload_time = "2025-03-26T03:05:11.408Z" }, - { url = "https://files.pythonhosted.org/packages/35/36/0bbabaacdcc26dac4f8139625e930f4311864251276033a52fd52ff2a274/propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", size = 226818, upload_time = "2025-03-26T03:05:12.909Z" }, - { url = "https://files.pythonhosted.org/packages/cc/27/4e0ef21084b53bd35d4dae1634b6d0bad35e9c58ed4f032511acca9d4d26/propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", size = 40112, upload_time = "2025-03-26T03:05:14.289Z" }, - { url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", size = 44034, upload_time = "2025-03-26T03:05:15.616Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a8/0a4fd2f664fc6acc66438370905124ce62e84e2e860f2557015ee4a61c7e/propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", size = 82613, upload_time = "2025-03-26T03:05:16.913Z" }, - { url = "https://files.pythonhosted.org/packages/4d/e5/5ef30eb2cd81576256d7b6caaa0ce33cd1d2c2c92c8903cccb1af1a4ff2f/propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", size = 47763, upload_time = "2025-03-26T03:05:18.607Z" }, - { url = "https://files.pythonhosted.org/packages/87/9a/87091ceb048efeba4d28e903c0b15bcc84b7c0bf27dc0261e62335d9b7b8/propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", size = 47175, upload_time = "2025-03-26T03:05:19.85Z" }, - { url = "https://files.pythonhosted.org/packages/3e/2f/854e653c96ad1161f96194c6678a41bbb38c7947d17768e8811a77635a08/propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", size = 292265, upload_time = "2025-03-26T03:05:21.654Z" }, - { url = "https://files.pythonhosted.org/packages/40/8d/090955e13ed06bc3496ba4a9fb26c62e209ac41973cb0d6222de20c6868f/propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", size = 294412, upload_time = "2025-03-26T03:05:23.147Z" }, - { url = "https://files.pythonhosted.org/packages/39/e6/d51601342e53cc7582449e6a3c14a0479fab2f0750c1f4d22302e34219c6/propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", size = 294290, upload_time = "2025-03-26T03:05:24.577Z" }, - { url = "https://files.pythonhosted.org/packages/3b/4d/be5f1a90abc1881884aa5878989a1acdafd379a91d9c7e5e12cef37ec0d7/propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", size = 282926, upload_time = "2025-03-26T03:05:26.459Z" }, - { url = "https://files.pythonhosted.org/packages/57/2b/8f61b998c7ea93a2b7eca79e53f3e903db1787fca9373af9e2cf8dc22f9d/propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", size = 267808, upload_time = "2025-03-26T03:05:28.188Z" }, - { url = "https://files.pythonhosted.org/packages/11/1c/311326c3dfce59c58a6098388ba984b0e5fb0381ef2279ec458ef99bd547/propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", size = 290916, upload_time = "2025-03-26T03:05:29.757Z" }, - { url = "https://files.pythonhosted.org/packages/4b/74/91939924b0385e54dc48eb2e4edd1e4903ffd053cf1916ebc5347ac227f7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", size = 262661, upload_time = "2025-03-26T03:05:31.472Z" }, - { url = "https://files.pythonhosted.org/packages/c2/d7/e6079af45136ad325c5337f5dd9ef97ab5dc349e0ff362fe5c5db95e2454/propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", size = 264384, upload_time = "2025-03-26T03:05:32.984Z" }, - { url = "https://files.pythonhosted.org/packages/b7/d5/ba91702207ac61ae6f1c2da81c5d0d6bf6ce89e08a2b4d44e411c0bbe867/propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", size = 291420, upload_time = "2025-03-26T03:05:34.496Z" }, - { url = "https://files.pythonhosted.org/packages/58/70/2117780ed7edcd7ba6b8134cb7802aada90b894a9810ec56b7bb6018bee7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", size = 290880, upload_time = "2025-03-26T03:05:36.256Z" }, - { url = "https://files.pythonhosted.org/packages/4a/1f/ecd9ce27710021ae623631c0146719280a929d895a095f6d85efb6a0be2e/propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", size = 287407, upload_time = "2025-03-26T03:05:37.799Z" }, - { url = "https://files.pythonhosted.org/packages/3e/66/2e90547d6b60180fb29e23dc87bd8c116517d4255240ec6d3f7dc23d1926/propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", size = 42573, upload_time = "2025-03-26T03:05:39.193Z" }, - { url = "https://files.pythonhosted.org/packages/cb/8f/50ad8599399d1861b4d2b6b45271f0ef6af1b09b0a2386a46dbaf19c9535/propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", size = 46757, upload_time = "2025-03-26T03:05:40.811Z" }, - { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376, upload_time = "2025-03-26T03:06:10.5Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/07/c8/fdc6686a986feae3541ea23dcaa661bd93972d3940460646c6bb96e21c40/propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", size = 43651, upload-time = "2025-03-26T03:06:12.05Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/0f/5a5319ee83bd651f75311fcb0c492c21322a7fc8f788e4eef23f44243427/propcache-0.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", size = 80243, upload-time = "2025-03-26T03:04:01.912Z" }, + { url = "https://files.pythonhosted.org/packages/ce/84/3db5537e0879942783e2256616ff15d870a11d7ac26541336fe1b673c818/propcache-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", size = 46503, upload-time = "2025-03-26T03:04:03.704Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c8/b649ed972433c3f0d827d7f0cf9ea47162f4ef8f4fe98c5f3641a0bc63ff/propcache-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", size = 45934, upload-time = "2025-03-26T03:04:05.257Z" }, + { url = "https://files.pythonhosted.org/packages/59/f9/4c0a5cf6974c2c43b1a6810c40d889769cc8f84cea676cbe1e62766a45f8/propcache-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", size = 233633, upload-time = "2025-03-26T03:04:07.044Z" }, + { url = "https://files.pythonhosted.org/packages/e7/64/66f2f4d1b4f0007c6e9078bd95b609b633d3957fe6dd23eac33ebde4b584/propcache-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", size = 241124, upload-time = "2025-03-26T03:04:08.676Z" }, + { url = "https://files.pythonhosted.org/packages/aa/bf/7b8c9fd097d511638fa9b6af3d986adbdf567598a567b46338c925144c1b/propcache-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", size = 240283, upload-time = "2025-03-26T03:04:10.172Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c9/e85aeeeaae83358e2a1ef32d6ff50a483a5d5248bc38510d030a6f4e2816/propcache-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", size = 232498, upload-time = "2025-03-26T03:04:11.616Z" }, + { url = "https://files.pythonhosted.org/packages/8e/66/acb88e1f30ef5536d785c283af2e62931cb934a56a3ecf39105887aa8905/propcache-0.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", size = 221486, upload-time = "2025-03-26T03:04:13.102Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f9/233ddb05ffdcaee4448508ee1d70aa7deff21bb41469ccdfcc339f871427/propcache-0.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", size = 222675, upload-time = "2025-03-26T03:04:14.658Z" }, + { url = "https://files.pythonhosted.org/packages/98/b8/eb977e28138f9e22a5a789daf608d36e05ed93093ef12a12441030da800a/propcache-0.3.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", size = 215727, upload-time = "2025-03-26T03:04:16.207Z" }, + { url = "https://files.pythonhosted.org/packages/89/2d/5f52d9c579f67b8ee1edd9ec073c91b23cc5b7ff7951a1e449e04ed8fdf3/propcache-0.3.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", size = 217878, upload-time = "2025-03-26T03:04:18.11Z" }, + { url = "https://files.pythonhosted.org/packages/7a/fd/5283e5ed8a82b00c7a989b99bb6ea173db1ad750bf0bf8dff08d3f4a4e28/propcache-0.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", size = 230558, upload-time = "2025-03-26T03:04:19.562Z" }, + { url = "https://files.pythonhosted.org/packages/90/38/ab17d75938ef7ac87332c588857422ae126b1c76253f0f5b1242032923ca/propcache-0.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", size = 233754, upload-time = "2025-03-26T03:04:21.065Z" }, + { url = "https://files.pythonhosted.org/packages/06/5d/3b921b9c60659ae464137508d3b4c2b3f52f592ceb1964aa2533b32fcf0b/propcache-0.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", size = 226088, upload-time = "2025-03-26T03:04:22.718Z" }, + { url = "https://files.pythonhosted.org/packages/54/6e/30a11f4417d9266b5a464ac5a8c5164ddc9dd153dfa77bf57918165eb4ae/propcache-0.3.1-cp311-cp311-win32.whl", hash = "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", size = 40859, upload-time = "2025-03-26T03:04:24.039Z" }, + { url = "https://files.pythonhosted.org/packages/1d/3a/8a68dd867da9ca2ee9dfd361093e9cb08cb0f37e5ddb2276f1b5177d7731/propcache-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", size = 45153, upload-time = "2025-03-26T03:04:25.211Z" }, + { url = "https://files.pythonhosted.org/packages/41/aa/ca78d9be314d1e15ff517b992bebbed3bdfef5b8919e85bf4940e57b6137/propcache-0.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", size = 80430, upload-time = "2025-03-26T03:04:26.436Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d8/f0c17c44d1cda0ad1979af2e593ea290defdde9eaeb89b08abbe02a5e8e1/propcache-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", size = 46637, upload-time = "2025-03-26T03:04:27.932Z" }, + { url = "https://files.pythonhosted.org/packages/ae/bd/c1e37265910752e6e5e8a4c1605d0129e5b7933c3dc3cf1b9b48ed83b364/propcache-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", size = 46123, upload-time = "2025-03-26T03:04:30.659Z" }, + { url = "https://files.pythonhosted.org/packages/d4/b0/911eda0865f90c0c7e9f0415d40a5bf681204da5fd7ca089361a64c16b28/propcache-0.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", size = 243031, upload-time = "2025-03-26T03:04:31.977Z" }, + { url = "https://files.pythonhosted.org/packages/0a/06/0da53397c76a74271621807265b6eb61fb011451b1ddebf43213df763669/propcache-0.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", size = 249100, upload-time = "2025-03-26T03:04:33.45Z" }, + { url = "https://files.pythonhosted.org/packages/f1/eb/13090e05bf6b963fc1653cdc922133ced467cb4b8dab53158db5a37aa21e/propcache-0.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", size = 250170, upload-time = "2025-03-26T03:04:35.542Z" }, + { url = "https://files.pythonhosted.org/packages/3b/4c/f72c9e1022b3b043ec7dc475a0f405d4c3e10b9b1d378a7330fecf0652da/propcache-0.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", size = 245000, upload-time = "2025-03-26T03:04:37.501Z" }, + { url = "https://files.pythonhosted.org/packages/e8/fd/970ca0e22acc829f1adf5de3724085e778c1ad8a75bec010049502cb3a86/propcache-0.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", size = 230262, upload-time = "2025-03-26T03:04:39.532Z" }, + { url = "https://files.pythonhosted.org/packages/c4/42/817289120c6b9194a44f6c3e6b2c3277c5b70bbad39e7df648f177cc3634/propcache-0.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", size = 236772, upload-time = "2025-03-26T03:04:41.109Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9c/3b3942b302badd589ad6b672da3ca7b660a6c2f505cafd058133ddc73918/propcache-0.3.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", size = 231133, upload-time = "2025-03-26T03:04:42.544Z" }, + { url = "https://files.pythonhosted.org/packages/98/a1/75f6355f9ad039108ff000dfc2e19962c8dea0430da9a1428e7975cf24b2/propcache-0.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", size = 230741, upload-time = "2025-03-26T03:04:44.06Z" }, + { url = "https://files.pythonhosted.org/packages/67/0c/3e82563af77d1f8731132166da69fdfd95e71210e31f18edce08a1eb11ea/propcache-0.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", size = 244047, upload-time = "2025-03-26T03:04:45.983Z" }, + { url = "https://files.pythonhosted.org/packages/f7/50/9fb7cca01532a08c4d5186d7bb2da6c4c587825c0ae134b89b47c7d62628/propcache-0.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5", size = 246467, upload-time = "2025-03-26T03:04:47.699Z" }, + { url = "https://files.pythonhosted.org/packages/a9/02/ccbcf3e1c604c16cc525309161d57412c23cf2351523aedbb280eb7c9094/propcache-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", size = 241022, upload-time = "2025-03-26T03:04:49.195Z" }, + { url = "https://files.pythonhosted.org/packages/db/19/e777227545e09ca1e77a6e21274ae9ec45de0f589f0ce3eca2a41f366220/propcache-0.3.1-cp312-cp312-win32.whl", hash = "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", size = 40647, upload-time = "2025-03-26T03:04:50.595Z" }, + { url = "https://files.pythonhosted.org/packages/24/bb/3b1b01da5dd04c77a204c84e538ff11f624e31431cfde7201d9110b092b1/propcache-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", size = 44784, upload-time = "2025-03-26T03:04:51.791Z" }, + { url = "https://files.pythonhosted.org/packages/58/60/f645cc8b570f99be3cf46714170c2de4b4c9d6b827b912811eff1eb8a412/propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", size = 77865, upload-time = "2025-03-26T03:04:53.406Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d4/c1adbf3901537582e65cf90fd9c26fde1298fde5a2c593f987112c0d0798/propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", size = 45452, upload-time = "2025-03-26T03:04:54.624Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b5/fe752b2e63f49f727c6c1c224175d21b7d1727ce1d4873ef1c24c9216830/propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", size = 44800, upload-time = "2025-03-26T03:04:55.844Z" }, + { url = "https://files.pythonhosted.org/packages/62/37/fc357e345bc1971e21f76597028b059c3d795c5ca7690d7a8d9a03c9708a/propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", size = 225804, upload-time = "2025-03-26T03:04:57.158Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f1/16e12c33e3dbe7f8b737809bad05719cff1dccb8df4dafbcff5575002c0e/propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", size = 230650, upload-time = "2025-03-26T03:04:58.61Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a2/018b9f2ed876bf5091e60153f727e8f9073d97573f790ff7cdf6bc1d1fb8/propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", size = 234235, upload-time = "2025-03-26T03:05:00.599Z" }, + { url = "https://files.pythonhosted.org/packages/45/5f/3faee66fc930dfb5da509e34c6ac7128870631c0e3582987fad161fcb4b1/propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", size = 228249, upload-time = "2025-03-26T03:05:02.11Z" }, + { url = "https://files.pythonhosted.org/packages/62/1e/a0d5ebda5da7ff34d2f5259a3e171a94be83c41eb1e7cd21a2105a84a02e/propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", size = 214964, upload-time = "2025-03-26T03:05:03.599Z" }, + { url = "https://files.pythonhosted.org/packages/db/a0/d72da3f61ceab126e9be1f3bc7844b4e98c6e61c985097474668e7e52152/propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", size = 222501, upload-time = "2025-03-26T03:05:05.107Z" }, + { url = "https://files.pythonhosted.org/packages/18/6d/a008e07ad7b905011253adbbd97e5b5375c33f0b961355ca0a30377504ac/propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", size = 217917, upload-time = "2025-03-26T03:05:06.59Z" }, + { url = "https://files.pythonhosted.org/packages/98/37/02c9343ffe59e590e0e56dc5c97d0da2b8b19fa747ebacf158310f97a79a/propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", size = 217089, upload-time = "2025-03-26T03:05:08.1Z" }, + { url = "https://files.pythonhosted.org/packages/53/1b/d3406629a2c8a5666d4674c50f757a77be119b113eedd47b0375afdf1b42/propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", size = 228102, upload-time = "2025-03-26T03:05:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/cd/a7/3664756cf50ce739e5f3abd48febc0be1a713b1f389a502ca819791a6b69/propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", size = 230122, upload-time = "2025-03-26T03:05:11.408Z" }, + { url = "https://files.pythonhosted.org/packages/35/36/0bbabaacdcc26dac4f8139625e930f4311864251276033a52fd52ff2a274/propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", size = 226818, upload-time = "2025-03-26T03:05:12.909Z" }, + { url = "https://files.pythonhosted.org/packages/cc/27/4e0ef21084b53bd35d4dae1634b6d0bad35e9c58ed4f032511acca9d4d26/propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", size = 40112, upload-time = "2025-03-26T03:05:14.289Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", size = 44034, upload-time = "2025-03-26T03:05:15.616Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a8/0a4fd2f664fc6acc66438370905124ce62e84e2e860f2557015ee4a61c7e/propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", size = 82613, upload-time = "2025-03-26T03:05:16.913Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e5/5ef30eb2cd81576256d7b6caaa0ce33cd1d2c2c92c8903cccb1af1a4ff2f/propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", size = 47763, upload-time = "2025-03-26T03:05:18.607Z" }, + { url = "https://files.pythonhosted.org/packages/87/9a/87091ceb048efeba4d28e903c0b15bcc84b7c0bf27dc0261e62335d9b7b8/propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", size = 47175, upload-time = "2025-03-26T03:05:19.85Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2f/854e653c96ad1161f96194c6678a41bbb38c7947d17768e8811a77635a08/propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", size = 292265, upload-time = "2025-03-26T03:05:21.654Z" }, + { url = "https://files.pythonhosted.org/packages/40/8d/090955e13ed06bc3496ba4a9fb26c62e209ac41973cb0d6222de20c6868f/propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", size = 294412, upload-time = "2025-03-26T03:05:23.147Z" }, + { url = "https://files.pythonhosted.org/packages/39/e6/d51601342e53cc7582449e6a3c14a0479fab2f0750c1f4d22302e34219c6/propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", size = 294290, upload-time = "2025-03-26T03:05:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/3b/4d/be5f1a90abc1881884aa5878989a1acdafd379a91d9c7e5e12cef37ec0d7/propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", size = 282926, upload-time = "2025-03-26T03:05:26.459Z" }, + { url = "https://files.pythonhosted.org/packages/57/2b/8f61b998c7ea93a2b7eca79e53f3e903db1787fca9373af9e2cf8dc22f9d/propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", size = 267808, upload-time = "2025-03-26T03:05:28.188Z" }, + { url = "https://files.pythonhosted.org/packages/11/1c/311326c3dfce59c58a6098388ba984b0e5fb0381ef2279ec458ef99bd547/propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", size = 290916, upload-time = "2025-03-26T03:05:29.757Z" }, + { url = "https://files.pythonhosted.org/packages/4b/74/91939924b0385e54dc48eb2e4edd1e4903ffd053cf1916ebc5347ac227f7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", size = 262661, upload-time = "2025-03-26T03:05:31.472Z" }, + { url = "https://files.pythonhosted.org/packages/c2/d7/e6079af45136ad325c5337f5dd9ef97ab5dc349e0ff362fe5c5db95e2454/propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", size = 264384, upload-time = "2025-03-26T03:05:32.984Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d5/ba91702207ac61ae6f1c2da81c5d0d6bf6ce89e08a2b4d44e411c0bbe867/propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", size = 291420, upload-time = "2025-03-26T03:05:34.496Z" }, + { url = "https://files.pythonhosted.org/packages/58/70/2117780ed7edcd7ba6b8134cb7802aada90b894a9810ec56b7bb6018bee7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", size = 290880, upload-time = "2025-03-26T03:05:36.256Z" }, + { url = "https://files.pythonhosted.org/packages/4a/1f/ecd9ce27710021ae623631c0146719280a929d895a095f6d85efb6a0be2e/propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", size = 287407, upload-time = "2025-03-26T03:05:37.799Z" }, + { url = "https://files.pythonhosted.org/packages/3e/66/2e90547d6b60180fb29e23dc87bd8c116517d4255240ec6d3f7dc23d1926/propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", size = 42573, upload-time = "2025-03-26T03:05:39.193Z" }, + { url = "https://files.pythonhosted.org/packages/cb/8f/50ad8599399d1861b4d2b6b45271f0ef6af1b09b0a2386a46dbaf19c9535/propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", size = 46757, upload-time = "2025-03-26T03:05:40.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376, upload-time = "2025-03-26T03:06:10.5Z" }, ] [[package]] @@ -1442,23 +1456,23 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/ac/87285f15f7cce6d4a008f33f1757fb5a13611ea8914eb58c3d0d26243468/proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012", size = 56142, upload_time = "2025-03-10T15:54:38.843Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/ac/87285f15f7cce6d4a008f33f1757fb5a13611ea8914eb58c3d0d26243468/proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012", size = 56142, upload-time = "2025-03-10T15:54:38.843Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/6d/280c4c2ce28b1593a19ad5239c8b826871fc6ec275c21afc8e1820108039/proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", size = 50163, upload_time = "2025-03-10T15:54:37.335Z" }, + { url = "https://files.pythonhosted.org/packages/4e/6d/280c4c2ce28b1593a19ad5239c8b826871fc6ec275c21afc8e1820108039/proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", size = 50163, upload-time = "2025-03-10T15:54:37.335Z" }, ] [[package]] name = "protobuf" version = "4.25.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/74/63/84fdeac1f03864c2b8b9f0b7fe711c4af5f95759ee281d2026530086b2f5/protobuf-4.25.7.tar.gz", hash = "sha256:28f65ae8c14523cc2c76c1e91680958700d3eac69f45c96512c12c63d9a38807", size = 380612, upload_time = "2025-04-24T02:56:58.685Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/63/84fdeac1f03864c2b8b9f0b7fe711c4af5f95759ee281d2026530086b2f5/protobuf-4.25.7.tar.gz", hash = "sha256:28f65ae8c14523cc2c76c1e91680958700d3eac69f45c96512c12c63d9a38807", size = 380612, upload-time = "2025-04-24T02:56:58.685Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/ed/9a58076cfb8edc237c92617f1d3744660e9b4457d54f3c2fdf1a4bbae5c7/protobuf-4.25.7-cp310-abi3-win32.whl", hash = "sha256:dc582cf1a73a6b40aa8e7704389b8d8352da616bc8ed5c6cc614bdd0b5ce3f7a", size = 392457, upload_time = "2025-04-24T02:56:40.798Z" }, - { url = "https://files.pythonhosted.org/packages/28/b3/e00870528029fe252cf3bd6fa535821c276db3753b44a4691aee0d52ff9e/protobuf-4.25.7-cp310-abi3-win_amd64.whl", hash = "sha256:cd873dbddb28460d1706ff4da2e7fac175f62f2a0bebc7b33141f7523c5a2399", size = 413446, upload_time = "2025-04-24T02:56:44.199Z" }, - { url = "https://files.pythonhosted.org/packages/60/1d/f450a193f875a20099d4492d2c1cb23091d65d512956fb1e167ee61b4bf0/protobuf-4.25.7-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:4c899f09b0502eb39174c717ccf005b844ea93e31137c167ddcacf3e09e49610", size = 394248, upload_time = "2025-04-24T02:56:45.75Z" }, - { url = "https://files.pythonhosted.org/packages/c8/b8/ea88e9857484a0618c74121618b9e620fc50042de43cdabbebe1b93a83e0/protobuf-4.25.7-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:6d2f5dede3d112e573f0e5f9778c0c19d9f9e209727abecae1d39db789f522c6", size = 293717, upload_time = "2025-04-24T02:56:47.427Z" }, - { url = "https://files.pythonhosted.org/packages/a7/81/d0b68e9a9a76804113b6dedc6fffed868b97048bbe6f1bedc675bdb8523c/protobuf-4.25.7-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:d41fb7ae72a25fcb79b2d71e4247f0547a02e8185ed51587c22827a87e5736ed", size = 294636, upload_time = "2025-04-24T02:56:48.976Z" }, - { url = "https://files.pythonhosted.org/packages/17/d7/1e7c80cb2ea2880cfe38580dcfbb22b78b746640c9c13fc3337a6967dc4c/protobuf-4.25.7-py3-none-any.whl", hash = "sha256:e9d969f5154eaeab41404def5dcf04e62162178f4b9de98b2d3c1c70f5f84810", size = 156468, upload_time = "2025-04-24T02:56:56.957Z" }, + { url = "https://files.pythonhosted.org/packages/41/ed/9a58076cfb8edc237c92617f1d3744660e9b4457d54f3c2fdf1a4bbae5c7/protobuf-4.25.7-cp310-abi3-win32.whl", hash = "sha256:dc582cf1a73a6b40aa8e7704389b8d8352da616bc8ed5c6cc614bdd0b5ce3f7a", size = 392457, upload-time = "2025-04-24T02:56:40.798Z" }, + { url = "https://files.pythonhosted.org/packages/28/b3/e00870528029fe252cf3bd6fa535821c276db3753b44a4691aee0d52ff9e/protobuf-4.25.7-cp310-abi3-win_amd64.whl", hash = "sha256:cd873dbddb28460d1706ff4da2e7fac175f62f2a0bebc7b33141f7523c5a2399", size = 413446, upload-time = "2025-04-24T02:56:44.199Z" }, + { url = "https://files.pythonhosted.org/packages/60/1d/f450a193f875a20099d4492d2c1cb23091d65d512956fb1e167ee61b4bf0/protobuf-4.25.7-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:4c899f09b0502eb39174c717ccf005b844ea93e31137c167ddcacf3e09e49610", size = 394248, upload-time = "2025-04-24T02:56:45.75Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b8/ea88e9857484a0618c74121618b9e620fc50042de43cdabbebe1b93a83e0/protobuf-4.25.7-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:6d2f5dede3d112e573f0e5f9778c0c19d9f9e209727abecae1d39db789f522c6", size = 293717, upload-time = "2025-04-24T02:56:47.427Z" }, + { url = "https://files.pythonhosted.org/packages/a7/81/d0b68e9a9a76804113b6dedc6fffed868b97048bbe6f1bedc675bdb8523c/protobuf-4.25.7-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:d41fb7ae72a25fcb79b2d71e4247f0547a02e8185ed51587c22827a87e5736ed", size = 294636, upload-time = "2025-04-24T02:56:48.976Z" }, + { url = "https://files.pythonhosted.org/packages/17/d7/1e7c80cb2ea2880cfe38580dcfbb22b78b746640c9c13fc3337a6967dc4c/protobuf-4.25.7-py3-none-any.whl", hash = "sha256:e9d969f5154eaeab41404def5dcf04e62162178f4b9de98b2d3c1c70f5f84810", size = 156468, upload-time = "2025-04-24T02:56:56.957Z" }, ] [[package]] @@ -1469,9 +1483,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "tzdata", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5c/6d/0939210f3ba089b360cf0d3741494719152567bc81303cca2c0f1e67c78a/psycopg-3.1.20.tar.gz", hash = "sha256:32f5862ab79f238496236f97fe374a7ab55b4b4bb839a74802026544735f9a07", size = 147567, upload_time = "2024-06-30T17:03:55.421Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/6d/0939210f3ba089b360cf0d3741494719152567bc81303cca2c0f1e67c78a/psycopg-3.1.20.tar.gz", hash = "sha256:32f5862ab79f238496236f97fe374a7ab55b4b4bb839a74802026544735f9a07", size = 147567, upload-time = "2024-06-30T17:03:55.421Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/e9/126bbfd5dded758bb109526c5f5f2c2538fe293b15b6fa208db7078c72c4/psycopg-3.1.20-py3-none-any.whl", hash = "sha256:898a29f49ac9c903d554f5a6cdc44a8fc564325557c18f82e51f39c1f4fc2aeb", size = 179473, upload_time = "2024-06-30T16:57:04.093Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e9/126bbfd5dded758bb109526c5f5f2c2538fe293b15b6fa208db7078c72c4/psycopg-3.1.20-py3-none-any.whl", hash = "sha256:898a29f49ac9c903d554f5a6cdc44a8fc564325557c18f82e51f39c1f4fc2aeb", size = 179473, upload-time = "2024-06-30T16:57:04.093Z" }, ] [package.optional-dependencies] @@ -1484,133 +1498,133 @@ name = "psycopg-binary" version = "3.1.20" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/1c/45e5f240765e80076b08c3ed02c5dfeb5e97d549769b81f8382485d70a15/psycopg_binary-3.1.20-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:802989350fcbc783732bfef660afb34439a62727642a05e8bb9acf7d68993627", size = 3350503, upload_time = "2024-06-30T16:58:27.18Z" }, - { url = "https://files.pythonhosted.org/packages/52/b8/acf96d388692d0bbf2346286f8b175778bc24046aca9181f50d9df9f4714/psycopg_binary-3.1.20-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:01b0e39128715fc37fed6cdc50ab58278eacb75709af503eb607654030975f09", size = 3480091, upload_time = "2024-06-30T16:58:33.872Z" }, - { url = "https://files.pythonhosted.org/packages/41/d4/20604282ff08823d0e90cf092738ea21b339f56a172d8583565b272fc4be/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77af1086bedfa0729465565c636de3519079ba523d7b7ee6e8b9486beb1ee905", size = 4434555, upload_time = "2024-06-30T16:58:40.795Z" }, - { url = "https://files.pythonhosted.org/packages/73/e0/3917b766508bb749e08225492d45ba7463b559de1c8a41d3f8f3cf0927cb/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9b9562395d441e225f354e8c6303ee6993a93aaeb0dbb5b94368f3249ab2388", size = 4231402, upload_time = "2024-06-30T16:58:48.586Z" }, - { url = "https://files.pythonhosted.org/packages/b4/9b/251435896f7459beda355ef3e3919b6b20d067582cd6838ba248d3cff188/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e814d69e5447a93e7b98117ec95a8ce606d3742092fd120960551ed67c376fea", size = 4484218, upload_time = "2024-06-30T16:58:56.911Z" }, - { url = "https://files.pythonhosted.org/packages/a1/12/b2057f9bb8b5f408139266a5b48bfd7578340296d7314d964b9f09e5b18f/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf1c2061600235ae9b11d7ad357cab89ac583a76bdb0199f7a29ac947939c20", size = 4176668, upload_time = "2024-06-30T16:59:02.496Z" }, - { url = "https://files.pythonhosted.org/packages/80/9c/a62fe4167427a06e69882d274ba90903507afc89caf6bcc3671790a20875/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:50f1d807b4167f973a6f67bca39bf656b737f7426be158a1dc9cb0000d020744", size = 3102502, upload_time = "2024-06-30T16:59:07.216Z" }, - { url = "https://files.pythonhosted.org/packages/98/83/bceca23dd830d4069949e70dec9feb03c114cc551b104f0e2b48b1e598c6/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4cf6ec1490232a5b208dae94a8269dc739e6762684c8658a0f3570402db934ae", size = 3080005, upload_time = "2024-06-30T16:59:14.927Z" }, - { url = "https://files.pythonhosted.org/packages/fc/83/bab7c8495e0eb11bf710663afb2849c2d3c91a2bf61b2bd597941f57f80b/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:309c09ec50a9c5c8492c2922ee666df1e30a08b08a9b63083d0daa414eccd09c", size = 3182315, upload_time = "2024-06-30T16:59:21.18Z" }, - { url = "https://files.pythonhosted.org/packages/ca/9b/bd4970faed24ae4a850ee8c6ebd621e98fd86e2962e13038603a726e2504/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e2c33a01799f93ef8c11a023df66280e39ca3c3249a2581adb2a0e5e80801088", size = 3222552, upload_time = "2024-06-30T16:59:27.663Z" }, - { url = "https://files.pythonhosted.org/packages/5d/0b/7ab0744f282df53968f5066d5fd8bf3f994f90bf2a8003ab40278818d0f2/psycopg_binary-3.1.20-cp311-cp311-win_amd64.whl", hash = "sha256:2c67532057fda72579b02d9d61e9cc8975982844bd5c3c9dc7f84ce8bcac859c", size = 2899115, upload_time = "2024-06-30T16:59:35.512Z" }, - { url = "https://files.pythonhosted.org/packages/94/12/6e909d3a20f7bfa6915c1fdf64ab47bb9ca44b837adb468841aad51bab6c/psycopg_binary-3.1.20-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ef08de60f1b8503a6f6b6f5bee612de36373c09bc0e3f84409fab09e1ff72107", size = 3326944, upload_time = "2024-06-30T16:59:41.783Z" }, - { url = "https://files.pythonhosted.org/packages/e1/4e/dc425f5c8c102045486f2fa39c3cb379b073557d6bd2cf5d06de81036d7c/psycopg_binary-3.1.20-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a4847fa31c8d3a6dd3536cf1e130dfcc454ed26be471ef274e4358bf7f709cda", size = 3475444, upload_time = "2024-06-30T16:59:48.547Z" }, - { url = "https://files.pythonhosted.org/packages/cd/cd/6484cbdb82dc29bfe43ae8c401a0be309402c304d1aaabcccf1e21908663/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b72e9c8c79dcc30e34e996079cfe0374b7c7233d2b5f6f25a0bc8872fe2babef", size = 4412872, upload_time = "2024-06-30T16:59:54.853Z" }, - { url = "https://files.pythonhosted.org/packages/25/d3/d403dc61f9d8b56683a6a1db47ab156807d2e1c442b044fba5763e786893/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836246f3c486ef7edfce6cf6cc760173e244826ebecd54c1b63c91d4cc0341f7", size = 4216654, upload_time = "2024-06-30T16:59:58.935Z" }, - { url = "https://files.pythonhosted.org/packages/d3/ff/389198638ad10ec0e80fcc97b5c8092987214d9ac529b1224bf0f7e221da/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:015f70b17539ec0ecfb0f87bcaface0c7fa1289b6e7e2313dc7cdfdc513e3235", size = 4451310, upload_time = "2024-06-30T17:00:05.647Z" }, - { url = "https://files.pythonhosted.org/packages/84/94/9ae70af00caf9ce98f857a883ff64c5d236dfea5b7b4b8528d28e80515aa/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f52498dc7b41fee74e971823ede4519e3a9597d416f7a2044dbe4b98cc61ff35", size = 4153667, upload_time = "2024-06-30T17:00:12.309Z" }, - { url = "https://files.pythonhosted.org/packages/b8/57/b8a34174803683ef0f3f2fe18304f7048d31bab431f21cf511598b894ed7/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:92b61bae0ac881580faa1c89bf2167db7041cb01cc0bd686244f9c20a010036a", size = 3081906, upload_time = "2024-06-30T17:00:17.223Z" }, - { url = "https://files.pythonhosted.org/packages/bf/e7/5df8c4794f13004787cd7ddfe456eec90f49d1b99f1a10947f7ba2a67487/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3532b8677666aadb64a4e31f6e97fe4ab71b862ab100d337faf497198339fd4d", size = 3061376, upload_time = "2024-06-30T17:00:22.232Z" }, - { url = "https://files.pythonhosted.org/packages/8e/c6/ec4abb814f54af4b659896ce10386be0c538dad8111b3daeaf672b4daa03/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f7df27f50a7db84c28e58be3df41f39618161096c3379ad68bc665a454c53e93", size = 3150174, upload_time = "2024-06-30T17:00:26.982Z" }, - { url = "https://files.pythonhosted.org/packages/0c/50/7b4382e5f5d256ac720ee0bd6470c7aa7d28f78570bd44d5e0b1c29eeb96/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:12b33c511f0be79d5a68231a10972ef9c68d954d30d176679472057ecc22891a", size = 3198871, upload_time = "2024-06-30T17:00:32.17Z" }, - { url = "https://files.pythonhosted.org/packages/76/2f/eda1b86c01d2803ac05714b94283af1e5012437dcc63dfe0679cc4d445ad/psycopg_binary-3.1.20-cp312-cp312-win_amd64.whl", hash = "sha256:6f3c0b05fc3cbd4d99aaacf5c7afa13b086df5777b9fefb78d31bf81fc70bd04", size = 2884414, upload_time = "2024-06-30T17:00:40.26Z" }, + { url = "https://files.pythonhosted.org/packages/f8/1c/45e5f240765e80076b08c3ed02c5dfeb5e97d549769b81f8382485d70a15/psycopg_binary-3.1.20-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:802989350fcbc783732bfef660afb34439a62727642a05e8bb9acf7d68993627", size = 3350503, upload-time = "2024-06-30T16:58:27.18Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/acf96d388692d0bbf2346286f8b175778bc24046aca9181f50d9df9f4714/psycopg_binary-3.1.20-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:01b0e39128715fc37fed6cdc50ab58278eacb75709af503eb607654030975f09", size = 3480091, upload-time = "2024-06-30T16:58:33.872Z" }, + { url = "https://files.pythonhosted.org/packages/41/d4/20604282ff08823d0e90cf092738ea21b339f56a172d8583565b272fc4be/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77af1086bedfa0729465565c636de3519079ba523d7b7ee6e8b9486beb1ee905", size = 4434555, upload-time = "2024-06-30T16:58:40.795Z" }, + { url = "https://files.pythonhosted.org/packages/73/e0/3917b766508bb749e08225492d45ba7463b559de1c8a41d3f8f3cf0927cb/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9b9562395d441e225f354e8c6303ee6993a93aaeb0dbb5b94368f3249ab2388", size = 4231402, upload-time = "2024-06-30T16:58:48.586Z" }, + { url = "https://files.pythonhosted.org/packages/b4/9b/251435896f7459beda355ef3e3919b6b20d067582cd6838ba248d3cff188/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e814d69e5447a93e7b98117ec95a8ce606d3742092fd120960551ed67c376fea", size = 4484218, upload-time = "2024-06-30T16:58:56.911Z" }, + { url = "https://files.pythonhosted.org/packages/a1/12/b2057f9bb8b5f408139266a5b48bfd7578340296d7314d964b9f09e5b18f/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf1c2061600235ae9b11d7ad357cab89ac583a76bdb0199f7a29ac947939c20", size = 4176668, upload-time = "2024-06-30T16:59:02.496Z" }, + { url = "https://files.pythonhosted.org/packages/80/9c/a62fe4167427a06e69882d274ba90903507afc89caf6bcc3671790a20875/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:50f1d807b4167f973a6f67bca39bf656b737f7426be158a1dc9cb0000d020744", size = 3102502, upload-time = "2024-06-30T16:59:07.216Z" }, + { url = "https://files.pythonhosted.org/packages/98/83/bceca23dd830d4069949e70dec9feb03c114cc551b104f0e2b48b1e598c6/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4cf6ec1490232a5b208dae94a8269dc739e6762684c8658a0f3570402db934ae", size = 3080005, upload-time = "2024-06-30T16:59:14.927Z" }, + { url = "https://files.pythonhosted.org/packages/fc/83/bab7c8495e0eb11bf710663afb2849c2d3c91a2bf61b2bd597941f57f80b/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:309c09ec50a9c5c8492c2922ee666df1e30a08b08a9b63083d0daa414eccd09c", size = 3182315, upload-time = "2024-06-30T16:59:21.18Z" }, + { url = "https://files.pythonhosted.org/packages/ca/9b/bd4970faed24ae4a850ee8c6ebd621e98fd86e2962e13038603a726e2504/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e2c33a01799f93ef8c11a023df66280e39ca3c3249a2581adb2a0e5e80801088", size = 3222552, upload-time = "2024-06-30T16:59:27.663Z" }, + { url = "https://files.pythonhosted.org/packages/5d/0b/7ab0744f282df53968f5066d5fd8bf3f994f90bf2a8003ab40278818d0f2/psycopg_binary-3.1.20-cp311-cp311-win_amd64.whl", hash = "sha256:2c67532057fda72579b02d9d61e9cc8975982844bd5c3c9dc7f84ce8bcac859c", size = 2899115, upload-time = "2024-06-30T16:59:35.512Z" }, + { url = "https://files.pythonhosted.org/packages/94/12/6e909d3a20f7bfa6915c1fdf64ab47bb9ca44b837adb468841aad51bab6c/psycopg_binary-3.1.20-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ef08de60f1b8503a6f6b6f5bee612de36373c09bc0e3f84409fab09e1ff72107", size = 3326944, upload-time = "2024-06-30T16:59:41.783Z" }, + { url = "https://files.pythonhosted.org/packages/e1/4e/dc425f5c8c102045486f2fa39c3cb379b073557d6bd2cf5d06de81036d7c/psycopg_binary-3.1.20-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a4847fa31c8d3a6dd3536cf1e130dfcc454ed26be471ef274e4358bf7f709cda", size = 3475444, upload-time = "2024-06-30T16:59:48.547Z" }, + { url = "https://files.pythonhosted.org/packages/cd/cd/6484cbdb82dc29bfe43ae8c401a0be309402c304d1aaabcccf1e21908663/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b72e9c8c79dcc30e34e996079cfe0374b7c7233d2b5f6f25a0bc8872fe2babef", size = 4412872, upload-time = "2024-06-30T16:59:54.853Z" }, + { url = "https://files.pythonhosted.org/packages/25/d3/d403dc61f9d8b56683a6a1db47ab156807d2e1c442b044fba5763e786893/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836246f3c486ef7edfce6cf6cc760173e244826ebecd54c1b63c91d4cc0341f7", size = 4216654, upload-time = "2024-06-30T16:59:58.935Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ff/389198638ad10ec0e80fcc97b5c8092987214d9ac529b1224bf0f7e221da/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:015f70b17539ec0ecfb0f87bcaface0c7fa1289b6e7e2313dc7cdfdc513e3235", size = 4451310, upload-time = "2024-06-30T17:00:05.647Z" }, + { url = "https://files.pythonhosted.org/packages/84/94/9ae70af00caf9ce98f857a883ff64c5d236dfea5b7b4b8528d28e80515aa/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f52498dc7b41fee74e971823ede4519e3a9597d416f7a2044dbe4b98cc61ff35", size = 4153667, upload-time = "2024-06-30T17:00:12.309Z" }, + { url = "https://files.pythonhosted.org/packages/b8/57/b8a34174803683ef0f3f2fe18304f7048d31bab431f21cf511598b894ed7/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:92b61bae0ac881580faa1c89bf2167db7041cb01cc0bd686244f9c20a010036a", size = 3081906, upload-time = "2024-06-30T17:00:17.223Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e7/5df8c4794f13004787cd7ddfe456eec90f49d1b99f1a10947f7ba2a67487/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3532b8677666aadb64a4e31f6e97fe4ab71b862ab100d337faf497198339fd4d", size = 3061376, upload-time = "2024-06-30T17:00:22.232Z" }, + { url = "https://files.pythonhosted.org/packages/8e/c6/ec4abb814f54af4b659896ce10386be0c538dad8111b3daeaf672b4daa03/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f7df27f50a7db84c28e58be3df41f39618161096c3379ad68bc665a454c53e93", size = 3150174, upload-time = "2024-06-30T17:00:26.982Z" }, + { url = "https://files.pythonhosted.org/packages/0c/50/7b4382e5f5d256ac720ee0bd6470c7aa7d28f78570bd44d5e0b1c29eeb96/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:12b33c511f0be79d5a68231a10972ef9c68d954d30d176679472057ecc22891a", size = 3198871, upload-time = "2024-06-30T17:00:32.17Z" }, + { url = "https://files.pythonhosted.org/packages/76/2f/eda1b86c01d2803ac05714b94283af1e5012437dcc63dfe0679cc4d445ad/psycopg_binary-3.1.20-cp312-cp312-win_amd64.whl", hash = "sha256:6f3c0b05fc3cbd4d99aaacf5c7afa13b086df5777b9fefb78d31bf81fc70bd04", size = 2884414, upload-time = "2024-06-30T17:00:40.26Z" }, ] [[package]] name = "psycopg2-binary" version = "2.9.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cb/0e/bdc8274dc0585090b4e3432267d7be4dfbfd8971c0fa59167c711105a6bf/psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2", size = 385764, upload_time = "2024-10-16T11:24:58.126Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/8f/9feb01291d0d7a0a4c6a6bab24094135c2b59c6a81943752f632c75896d6/psycopg2_binary-2.9.10-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff", size = 3043397, upload_time = "2024-10-16T11:19:40.033Z" }, - { url = "https://files.pythonhosted.org/packages/15/30/346e4683532011561cd9c8dfeac6a8153dd96452fee0b12666058ab7893c/psycopg2_binary-2.9.10-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1a6784f0ce3fec4edc64e985865c17778514325074adf5ad8f80636cd029ef7c", size = 3274806, upload_time = "2024-10-16T11:19:43.5Z" }, - { url = "https://files.pythonhosted.org/packages/66/6e/4efebe76f76aee7ec99166b6c023ff8abdc4e183f7b70913d7c047701b79/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f86c56eeb91dc3135b3fd8a95dc7ae14c538a2f3ad77a19645cf55bab1799c", size = 2851370, upload_time = "2024-10-16T11:19:46.986Z" }, - { url = "https://files.pythonhosted.org/packages/7f/fd/ff83313f86b50f7ca089b161b8e0a22bb3c319974096093cd50680433fdb/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b3d2491d4d78b6b14f76881905c7a8a8abcf974aad4a8a0b065273a0ed7a2cb", size = 3080780, upload_time = "2024-10-16T11:19:50.242Z" }, - { url = "https://files.pythonhosted.org/packages/e6/c4/bfadd202dcda8333a7ccafdc51c541dbdfce7c2c7cda89fa2374455d795f/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2286791ececda3a723d1910441c793be44625d86d1a4e79942751197f4d30341", size = 3264583, upload_time = "2024-10-16T11:19:54.424Z" }, - { url = "https://files.pythonhosted.org/packages/5d/f1/09f45ac25e704ac954862581f9f9ae21303cc5ded3d0b775532b407f0e90/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:512d29bb12608891e349af6a0cccedce51677725a921c07dba6342beaf576f9a", size = 3019831, upload_time = "2024-10-16T11:19:57.762Z" }, - { url = "https://files.pythonhosted.org/packages/9e/2e/9beaea078095cc558f215e38f647c7114987d9febfc25cb2beed7c3582a5/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5a507320c58903967ef7384355a4da7ff3f28132d679aeb23572753cbf2ec10b", size = 2871822, upload_time = "2024-10-16T11:20:04.693Z" }, - { url = "https://files.pythonhosted.org/packages/01/9e/ef93c5d93f3dc9fc92786ffab39e323b9aed066ba59fdc34cf85e2722271/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d4fa1079cab9018f4d0bd2db307beaa612b0d13ba73b5c6304b9fe2fb441ff7", size = 2820975, upload_time = "2024-10-16T11:20:11.401Z" }, - { url = "https://files.pythonhosted.org/packages/a5/f0/049e9631e3268fe4c5a387f6fc27e267ebe199acf1bc1bc9cbde4bd6916c/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:851485a42dbb0bdc1edcdabdb8557c09c9655dfa2ca0460ff210522e073e319e", size = 2919320, upload_time = "2024-10-16T11:20:17.959Z" }, - { url = "https://files.pythonhosted.org/packages/dc/9a/bcb8773b88e45fb5a5ea8339e2104d82c863a3b8558fbb2aadfe66df86b3/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:35958ec9e46432d9076286dda67942ed6d968b9c3a6a2fd62b48939d1d78bf68", size = 2957617, upload_time = "2024-10-16T11:20:24.711Z" }, - { url = "https://files.pythonhosted.org/packages/e2/6b/144336a9bf08a67d217b3af3246abb1d027095dab726f0687f01f43e8c03/psycopg2_binary-2.9.10-cp311-cp311-win32.whl", hash = "sha256:ecced182e935529727401b24d76634a357c71c9275b356efafd8a2a91ec07392", size = 1024618, upload_time = "2024-10-16T11:20:27.718Z" }, - { url = "https://files.pythonhosted.org/packages/61/69/3b3d7bd583c6d3cbe5100802efa5beacaacc86e37b653fc708bf3d6853b8/psycopg2_binary-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:ee0e8c683a7ff25d23b55b11161c2663d4b099770f6085ff0a20d4505778d6b4", size = 1163816, upload_time = "2024-10-16T11:20:30.777Z" }, - { url = "https://files.pythonhosted.org/packages/49/7d/465cc9795cf76f6d329efdafca74693714556ea3891813701ac1fee87545/psycopg2_binary-2.9.10-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0", size = 3044771, upload_time = "2024-10-16T11:20:35.234Z" }, - { url = "https://files.pythonhosted.org/packages/8b/31/6d225b7b641a1a2148e3ed65e1aa74fc86ba3fee850545e27be9e1de893d/psycopg2_binary-2.9.10-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a", size = 3275336, upload_time = "2024-10-16T11:20:38.742Z" }, - { url = "https://files.pythonhosted.org/packages/30/b7/a68c2b4bff1cbb1728e3ec864b2d92327c77ad52edcd27922535a8366f68/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539", size = 2851637, upload_time = "2024-10-16T11:20:42.145Z" }, - { url = "https://files.pythonhosted.org/packages/0b/b1/cfedc0e0e6f9ad61f8657fd173b2f831ce261c02a08c0b09c652b127d813/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526", size = 3082097, upload_time = "2024-10-16T11:20:46.185Z" }, - { url = "https://files.pythonhosted.org/packages/18/ed/0a8e4153c9b769f59c02fb5e7914f20f0b2483a19dae7bf2db54b743d0d0/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1", size = 3264776, upload_time = "2024-10-16T11:20:50.879Z" }, - { url = "https://files.pythonhosted.org/packages/10/db/d09da68c6a0cdab41566b74e0a6068a425f077169bed0946559b7348ebe9/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e", size = 3020968, upload_time = "2024-10-16T11:20:56.819Z" }, - { url = "https://files.pythonhosted.org/packages/94/28/4d6f8c255f0dfffb410db2b3f9ac5218d959a66c715c34cac31081e19b95/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f", size = 2872334, upload_time = "2024-10-16T11:21:02.411Z" }, - { url = "https://files.pythonhosted.org/packages/05/f7/20d7bf796593c4fea95e12119d6cc384ff1f6141a24fbb7df5a668d29d29/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00", size = 2822722, upload_time = "2024-10-16T11:21:09.01Z" }, - { url = "https://files.pythonhosted.org/packages/4d/e4/0c407ae919ef626dbdb32835a03b6737013c3cc7240169843965cada2bdf/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5", size = 2920132, upload_time = "2024-10-16T11:21:16.339Z" }, - { url = "https://files.pythonhosted.org/packages/2d/70/aa69c9f69cf09a01da224909ff6ce8b68faeef476f00f7ec377e8f03be70/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47", size = 2959312, upload_time = "2024-10-16T11:21:25.584Z" }, - { url = "https://files.pythonhosted.org/packages/d3/bd/213e59854fafe87ba47814bf413ace0dcee33a89c8c8c814faca6bc7cf3c/psycopg2_binary-2.9.10-cp312-cp312-win32.whl", hash = "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64", size = 1025191, upload_time = "2024-10-16T11:21:29.912Z" }, - { url = "https://files.pythonhosted.org/packages/92/29/06261ea000e2dc1e22907dbbc483a1093665509ea586b29b8986a0e56733/psycopg2_binary-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0", size = 1164031, upload_time = "2024-10-16T11:21:34.211Z" }, - { url = "https://files.pythonhosted.org/packages/3e/30/d41d3ba765609c0763505d565c4d12d8f3c79793f0d0f044ff5a28bf395b/psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d", size = 3044699, upload_time = "2024-10-16T11:21:42.841Z" }, - { url = "https://files.pythonhosted.org/packages/35/44/257ddadec7ef04536ba71af6bc6a75ec05c5343004a7ec93006bee66c0bc/psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb", size = 3275245, upload_time = "2024-10-16T11:21:51.989Z" }, - { url = "https://files.pythonhosted.org/packages/1b/11/48ea1cd11de67f9efd7262085588790a95d9dfcd9b8a687d46caf7305c1a/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7", size = 2851631, upload_time = "2024-10-16T11:21:57.584Z" }, - { url = "https://files.pythonhosted.org/packages/62/e0/62ce5ee650e6c86719d621a761fe4bc846ab9eff8c1f12b1ed5741bf1c9b/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d", size = 3082140, upload_time = "2024-10-16T11:22:02.005Z" }, - { url = "https://files.pythonhosted.org/packages/27/ce/63f946c098611f7be234c0dd7cb1ad68b0b5744d34f68062bb3c5aa510c8/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73", size = 3264762, upload_time = "2024-10-16T11:22:06.412Z" }, - { url = "https://files.pythonhosted.org/packages/43/25/c603cd81402e69edf7daa59b1602bd41eb9859e2824b8c0855d748366ac9/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673", size = 3020967, upload_time = "2024-10-16T11:22:11.583Z" }, - { url = "https://files.pythonhosted.org/packages/5f/d6/8708d8c6fca531057fa170cdde8df870e8b6a9b136e82b361c65e42b841e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f", size = 2872326, upload_time = "2024-10-16T11:22:16.406Z" }, - { url = "https://files.pythonhosted.org/packages/ce/ac/5b1ea50fc08a9df82de7e1771537557f07c2632231bbab652c7e22597908/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909", size = 2822712, upload_time = "2024-10-16T11:22:21.366Z" }, - { url = "https://files.pythonhosted.org/packages/c4/fc/504d4503b2abc4570fac3ca56eb8fed5e437bf9c9ef13f36b6621db8ef00/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1", size = 2920155, upload_time = "2024-10-16T11:22:25.684Z" }, - { url = "https://files.pythonhosted.org/packages/b2/d1/323581e9273ad2c0dbd1902f3fb50c441da86e894b6e25a73c3fda32c57e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567", size = 2959356, upload_time = "2024-10-16T11:22:30.562Z" }, - { url = "https://files.pythonhosted.org/packages/08/50/d13ea0a054189ae1bc21af1d85b6f8bb9bbc5572991055d70ad9006fe2d6/psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142", size = 2569224, upload_time = "2025-01-04T20:09:19.234Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/cb/0e/bdc8274dc0585090b4e3432267d7be4dfbfd8971c0fa59167c711105a6bf/psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2", size = 385764, upload-time = "2024-10-16T11:24:58.126Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/8f/9feb01291d0d7a0a4c6a6bab24094135c2b59c6a81943752f632c75896d6/psycopg2_binary-2.9.10-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff", size = 3043397, upload-time = "2024-10-16T11:19:40.033Z" }, + { url = "https://files.pythonhosted.org/packages/15/30/346e4683532011561cd9c8dfeac6a8153dd96452fee0b12666058ab7893c/psycopg2_binary-2.9.10-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1a6784f0ce3fec4edc64e985865c17778514325074adf5ad8f80636cd029ef7c", size = 3274806, upload-time = "2024-10-16T11:19:43.5Z" }, + { url = "https://files.pythonhosted.org/packages/66/6e/4efebe76f76aee7ec99166b6c023ff8abdc4e183f7b70913d7c047701b79/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f86c56eeb91dc3135b3fd8a95dc7ae14c538a2f3ad77a19645cf55bab1799c", size = 2851370, upload-time = "2024-10-16T11:19:46.986Z" }, + { url = "https://files.pythonhosted.org/packages/7f/fd/ff83313f86b50f7ca089b161b8e0a22bb3c319974096093cd50680433fdb/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b3d2491d4d78b6b14f76881905c7a8a8abcf974aad4a8a0b065273a0ed7a2cb", size = 3080780, upload-time = "2024-10-16T11:19:50.242Z" }, + { url = "https://files.pythonhosted.org/packages/e6/c4/bfadd202dcda8333a7ccafdc51c541dbdfce7c2c7cda89fa2374455d795f/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2286791ececda3a723d1910441c793be44625d86d1a4e79942751197f4d30341", size = 3264583, upload-time = "2024-10-16T11:19:54.424Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f1/09f45ac25e704ac954862581f9f9ae21303cc5ded3d0b775532b407f0e90/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:512d29bb12608891e349af6a0cccedce51677725a921c07dba6342beaf576f9a", size = 3019831, upload-time = "2024-10-16T11:19:57.762Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2e/9beaea078095cc558f215e38f647c7114987d9febfc25cb2beed7c3582a5/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5a507320c58903967ef7384355a4da7ff3f28132d679aeb23572753cbf2ec10b", size = 2871822, upload-time = "2024-10-16T11:20:04.693Z" }, + { url = "https://files.pythonhosted.org/packages/01/9e/ef93c5d93f3dc9fc92786ffab39e323b9aed066ba59fdc34cf85e2722271/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d4fa1079cab9018f4d0bd2db307beaa612b0d13ba73b5c6304b9fe2fb441ff7", size = 2820975, upload-time = "2024-10-16T11:20:11.401Z" }, + { url = "https://files.pythonhosted.org/packages/a5/f0/049e9631e3268fe4c5a387f6fc27e267ebe199acf1bc1bc9cbde4bd6916c/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:851485a42dbb0bdc1edcdabdb8557c09c9655dfa2ca0460ff210522e073e319e", size = 2919320, upload-time = "2024-10-16T11:20:17.959Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9a/bcb8773b88e45fb5a5ea8339e2104d82c863a3b8558fbb2aadfe66df86b3/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:35958ec9e46432d9076286dda67942ed6d968b9c3a6a2fd62b48939d1d78bf68", size = 2957617, upload-time = "2024-10-16T11:20:24.711Z" }, + { url = "https://files.pythonhosted.org/packages/e2/6b/144336a9bf08a67d217b3af3246abb1d027095dab726f0687f01f43e8c03/psycopg2_binary-2.9.10-cp311-cp311-win32.whl", hash = "sha256:ecced182e935529727401b24d76634a357c71c9275b356efafd8a2a91ec07392", size = 1024618, upload-time = "2024-10-16T11:20:27.718Z" }, + { url = "https://files.pythonhosted.org/packages/61/69/3b3d7bd583c6d3cbe5100802efa5beacaacc86e37b653fc708bf3d6853b8/psycopg2_binary-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:ee0e8c683a7ff25d23b55b11161c2663d4b099770f6085ff0a20d4505778d6b4", size = 1163816, upload-time = "2024-10-16T11:20:30.777Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/465cc9795cf76f6d329efdafca74693714556ea3891813701ac1fee87545/psycopg2_binary-2.9.10-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0", size = 3044771, upload-time = "2024-10-16T11:20:35.234Z" }, + { url = "https://files.pythonhosted.org/packages/8b/31/6d225b7b641a1a2148e3ed65e1aa74fc86ba3fee850545e27be9e1de893d/psycopg2_binary-2.9.10-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a", size = 3275336, upload-time = "2024-10-16T11:20:38.742Z" }, + { url = "https://files.pythonhosted.org/packages/30/b7/a68c2b4bff1cbb1728e3ec864b2d92327c77ad52edcd27922535a8366f68/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539", size = 2851637, upload-time = "2024-10-16T11:20:42.145Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b1/cfedc0e0e6f9ad61f8657fd173b2f831ce261c02a08c0b09c652b127d813/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526", size = 3082097, upload-time = "2024-10-16T11:20:46.185Z" }, + { url = "https://files.pythonhosted.org/packages/18/ed/0a8e4153c9b769f59c02fb5e7914f20f0b2483a19dae7bf2db54b743d0d0/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1", size = 3264776, upload-time = "2024-10-16T11:20:50.879Z" }, + { url = "https://files.pythonhosted.org/packages/10/db/d09da68c6a0cdab41566b74e0a6068a425f077169bed0946559b7348ebe9/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e", size = 3020968, upload-time = "2024-10-16T11:20:56.819Z" }, + { url = "https://files.pythonhosted.org/packages/94/28/4d6f8c255f0dfffb410db2b3f9ac5218d959a66c715c34cac31081e19b95/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f", size = 2872334, upload-time = "2024-10-16T11:21:02.411Z" }, + { url = "https://files.pythonhosted.org/packages/05/f7/20d7bf796593c4fea95e12119d6cc384ff1f6141a24fbb7df5a668d29d29/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00", size = 2822722, upload-time = "2024-10-16T11:21:09.01Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e4/0c407ae919ef626dbdb32835a03b6737013c3cc7240169843965cada2bdf/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5", size = 2920132, upload-time = "2024-10-16T11:21:16.339Z" }, + { url = "https://files.pythonhosted.org/packages/2d/70/aa69c9f69cf09a01da224909ff6ce8b68faeef476f00f7ec377e8f03be70/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47", size = 2959312, upload-time = "2024-10-16T11:21:25.584Z" }, + { url = "https://files.pythonhosted.org/packages/d3/bd/213e59854fafe87ba47814bf413ace0dcee33a89c8c8c814faca6bc7cf3c/psycopg2_binary-2.9.10-cp312-cp312-win32.whl", hash = "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64", size = 1025191, upload-time = "2024-10-16T11:21:29.912Z" }, + { url = "https://files.pythonhosted.org/packages/92/29/06261ea000e2dc1e22907dbbc483a1093665509ea586b29b8986a0e56733/psycopg2_binary-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0", size = 1164031, upload-time = "2024-10-16T11:21:34.211Z" }, + { url = "https://files.pythonhosted.org/packages/3e/30/d41d3ba765609c0763505d565c4d12d8f3c79793f0d0f044ff5a28bf395b/psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d", size = 3044699, upload-time = "2024-10-16T11:21:42.841Z" }, + { url = "https://files.pythonhosted.org/packages/35/44/257ddadec7ef04536ba71af6bc6a75ec05c5343004a7ec93006bee66c0bc/psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb", size = 3275245, upload-time = "2024-10-16T11:21:51.989Z" }, + { url = "https://files.pythonhosted.org/packages/1b/11/48ea1cd11de67f9efd7262085588790a95d9dfcd9b8a687d46caf7305c1a/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7", size = 2851631, upload-time = "2024-10-16T11:21:57.584Z" }, + { url = "https://files.pythonhosted.org/packages/62/e0/62ce5ee650e6c86719d621a761fe4bc846ab9eff8c1f12b1ed5741bf1c9b/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d", size = 3082140, upload-time = "2024-10-16T11:22:02.005Z" }, + { url = "https://files.pythonhosted.org/packages/27/ce/63f946c098611f7be234c0dd7cb1ad68b0b5744d34f68062bb3c5aa510c8/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73", size = 3264762, upload-time = "2024-10-16T11:22:06.412Z" }, + { url = "https://files.pythonhosted.org/packages/43/25/c603cd81402e69edf7daa59b1602bd41eb9859e2824b8c0855d748366ac9/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673", size = 3020967, upload-time = "2024-10-16T11:22:11.583Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d6/8708d8c6fca531057fa170cdde8df870e8b6a9b136e82b361c65e42b841e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f", size = 2872326, upload-time = "2024-10-16T11:22:16.406Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ac/5b1ea50fc08a9df82de7e1771537557f07c2632231bbab652c7e22597908/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909", size = 2822712, upload-time = "2024-10-16T11:22:21.366Z" }, + { url = "https://files.pythonhosted.org/packages/c4/fc/504d4503b2abc4570fac3ca56eb8fed5e437bf9c9ef13f36b6621db8ef00/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1", size = 2920155, upload-time = "2024-10-16T11:22:25.684Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d1/323581e9273ad2c0dbd1902f3fb50c441da86e894b6e25a73c3fda32c57e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567", size = 2959356, upload-time = "2024-10-16T11:22:30.562Z" }, + { url = "https://files.pythonhosted.org/packages/08/50/d13ea0a054189ae1bc21af1d85b6f8bb9bbc5572991055d70ad9006fe2d6/psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142", size = 2569224, upload-time = "2025-01-04T20:09:19.234Z" }, ] [[package]] name = "pyarrow" version = "20.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187, upload_time = "2025-04-27T12:34:23.264Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/a2/b7930824181ceadd0c63c1042d01fa4ef63eee233934826a7a2a9af6e463/pyarrow-20.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:24ca380585444cb2a31324c546a9a56abbe87e26069189e14bdba19c86c049f0", size = 30856035, upload_time = "2025-04-27T12:28:40.78Z" }, - { url = "https://files.pythonhosted.org/packages/9b/18/c765770227d7f5bdfa8a69f64b49194352325c66a5c3bb5e332dfd5867d9/pyarrow-20.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:95b330059ddfdc591a3225f2d272123be26c8fa76e8c9ee1a77aad507361cfdb", size = 32309552, upload_time = "2025-04-27T12:28:47.051Z" }, - { url = "https://files.pythonhosted.org/packages/44/fb/dfb2dfdd3e488bb14f822d7335653092dde150cffc2da97de6e7500681f9/pyarrow-20.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f0fb1041267e9968c6d0d2ce3ff92e3928b243e2b6d11eeb84d9ac547308232", size = 41334704, upload_time = "2025-04-27T12:28:55.064Z" }, - { url = "https://files.pythonhosted.org/packages/58/0d/08a95878d38808051a953e887332d4a76bc06c6ee04351918ee1155407eb/pyarrow-20.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8ff87cc837601532cc8242d2f7e09b4e02404de1b797aee747dd4ba4bd6313f", size = 42399836, upload_time = "2025-04-27T12:29:02.13Z" }, - { url = "https://files.pythonhosted.org/packages/f3/cd/efa271234dfe38f0271561086eedcad7bc0f2ddd1efba423916ff0883684/pyarrow-20.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:7a3a5dcf54286e6141d5114522cf31dd67a9e7c9133d150799f30ee302a7a1ab", size = 40711789, upload_time = "2025-04-27T12:29:09.951Z" }, - { url = "https://files.pythonhosted.org/packages/46/1f/7f02009bc7fc8955c391defee5348f510e589a020e4b40ca05edcb847854/pyarrow-20.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a6ad3e7758ecf559900261a4df985662df54fb7fdb55e8e3b3aa99b23d526b62", size = 42301124, upload_time = "2025-04-27T12:29:17.187Z" }, - { url = "https://files.pythonhosted.org/packages/4f/92/692c562be4504c262089e86757a9048739fe1acb4024f92d39615e7bab3f/pyarrow-20.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6bb830757103a6cb300a04610e08d9636f0cd223d32f388418ea893a3e655f1c", size = 42916060, upload_time = "2025-04-27T12:29:24.253Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ec/9f5c7e7c828d8e0a3c7ef50ee62eca38a7de2fa6eb1b8fa43685c9414fef/pyarrow-20.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:96e37f0766ecb4514a899d9a3554fadda770fb57ddf42b63d80f14bc20aa7db3", size = 44547640, upload_time = "2025-04-27T12:29:32.782Z" }, - { url = "https://files.pythonhosted.org/packages/54/96/46613131b4727f10fd2ffa6d0d6f02efcc09a0e7374eff3b5771548aa95b/pyarrow-20.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3346babb516f4b6fd790da99b98bed9708e3f02e734c84971faccb20736848dc", size = 25781491, upload_time = "2025-04-27T12:29:38.464Z" }, - { url = "https://files.pythonhosted.org/packages/a1/d6/0c10e0d54f6c13eb464ee9b67a68b8c71bcf2f67760ef5b6fbcddd2ab05f/pyarrow-20.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:75a51a5b0eef32727a247707d4755322cb970be7e935172b6a3a9f9ae98404ba", size = 30815067, upload_time = "2025-04-27T12:29:44.384Z" }, - { url = "https://files.pythonhosted.org/packages/7e/e2/04e9874abe4094a06fd8b0cbb0f1312d8dd7d707f144c2ec1e5e8f452ffa/pyarrow-20.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:211d5e84cecc640c7a3ab900f930aaff5cd2702177e0d562d426fb7c4f737781", size = 32297128, upload_time = "2025-04-27T12:29:52.038Z" }, - { url = "https://files.pythonhosted.org/packages/31/fd/c565e5dcc906a3b471a83273039cb75cb79aad4a2d4a12f76cc5ae90a4b8/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba3cf4182828be7a896cbd232aa8dd6a31bd1f9e32776cc3796c012855e1199", size = 41334890, upload_time = "2025-04-27T12:29:59.452Z" }, - { url = "https://files.pythonhosted.org/packages/af/a9/3bdd799e2c9b20c1ea6dc6fa8e83f29480a97711cf806e823f808c2316ac/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c3a01f313ffe27ac4126f4c2e5ea0f36a5fc6ab51f8726cf41fee4b256680bd", size = 42421775, upload_time = "2025-04-27T12:30:06.875Z" }, - { url = "https://files.pythonhosted.org/packages/10/f7/da98ccd86354c332f593218101ae56568d5dcedb460e342000bd89c49cc1/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a2791f69ad72addd33510fec7bb14ee06c2a448e06b649e264c094c5b5f7ce28", size = 40687231, upload_time = "2025-04-27T12:30:13.954Z" }, - { url = "https://files.pythonhosted.org/packages/bb/1b/2168d6050e52ff1e6cefc61d600723870bf569cbf41d13db939c8cf97a16/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4250e28a22302ce8692d3a0e8ec9d9dde54ec00d237cff4dfa9c1fbf79e472a8", size = 42295639, upload_time = "2025-04-27T12:30:21.949Z" }, - { url = "https://files.pythonhosted.org/packages/b2/66/2d976c0c7158fd25591c8ca55aee026e6d5745a021915a1835578707feb3/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:89e030dc58fc760e4010148e6ff164d2f44441490280ef1e97a542375e41058e", size = 42908549, upload_time = "2025-04-27T12:30:29.551Z" }, - { url = "https://files.pythonhosted.org/packages/31/a9/dfb999c2fc6911201dcbf348247f9cc382a8990f9ab45c12eabfd7243a38/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6102b4864d77102dbbb72965618e204e550135a940c2534711d5ffa787df2a5a", size = 44557216, upload_time = "2025-04-27T12:30:36.977Z" }, - { url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b", size = 25660496, upload_time = "2025-04-27T12:30:42.809Z" }, - { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501, upload_time = "2025-04-27T12:30:48.351Z" }, - { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895, upload_time = "2025-04-27T12:30:55.238Z" }, - { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322, upload_time = "2025-04-27T12:31:05.587Z" }, - { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441, upload_time = "2025-04-27T12:31:15.675Z" }, - { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027, upload_time = "2025-04-27T12:31:24.631Z" }, - { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473, upload_time = "2025-04-27T12:31:31.311Z" }, - { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897, upload_time = "2025-04-27T12:31:39.406Z" }, - { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847, upload_time = "2025-04-27T12:31:45.997Z" }, - { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219, upload_time = "2025-04-27T12:31:54.11Z" }, - { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957, upload_time = "2025-04-27T12:31:59.215Z" }, - { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972, upload_time = "2025-04-27T12:32:05.369Z" }, - { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434, upload_time = "2025-04-27T12:32:11.814Z" }, - { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648, upload_time = "2025-04-27T12:32:20.766Z" }, - { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853, upload_time = "2025-04-27T12:32:28.1Z" }, - { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743, upload_time = "2025-04-27T12:32:35.792Z" }, - { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441, upload_time = "2025-04-27T12:32:46.64Z" }, - { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279, upload_time = "2025-04-27T12:32:56.503Z" }, - { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982, upload_time = "2025-04-27T12:33:04.72Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187, upload-time = "2025-04-27T12:34:23.264Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/a2/b7930824181ceadd0c63c1042d01fa4ef63eee233934826a7a2a9af6e463/pyarrow-20.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:24ca380585444cb2a31324c546a9a56abbe87e26069189e14bdba19c86c049f0", size = 30856035, upload-time = "2025-04-27T12:28:40.78Z" }, + { url = "https://files.pythonhosted.org/packages/9b/18/c765770227d7f5bdfa8a69f64b49194352325c66a5c3bb5e332dfd5867d9/pyarrow-20.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:95b330059ddfdc591a3225f2d272123be26c8fa76e8c9ee1a77aad507361cfdb", size = 32309552, upload-time = "2025-04-27T12:28:47.051Z" }, + { url = "https://files.pythonhosted.org/packages/44/fb/dfb2dfdd3e488bb14f822d7335653092dde150cffc2da97de6e7500681f9/pyarrow-20.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f0fb1041267e9968c6d0d2ce3ff92e3928b243e2b6d11eeb84d9ac547308232", size = 41334704, upload-time = "2025-04-27T12:28:55.064Z" }, + { url = "https://files.pythonhosted.org/packages/58/0d/08a95878d38808051a953e887332d4a76bc06c6ee04351918ee1155407eb/pyarrow-20.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8ff87cc837601532cc8242d2f7e09b4e02404de1b797aee747dd4ba4bd6313f", size = 42399836, upload-time = "2025-04-27T12:29:02.13Z" }, + { url = "https://files.pythonhosted.org/packages/f3/cd/efa271234dfe38f0271561086eedcad7bc0f2ddd1efba423916ff0883684/pyarrow-20.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:7a3a5dcf54286e6141d5114522cf31dd67a9e7c9133d150799f30ee302a7a1ab", size = 40711789, upload-time = "2025-04-27T12:29:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/46/1f/7f02009bc7fc8955c391defee5348f510e589a020e4b40ca05edcb847854/pyarrow-20.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a6ad3e7758ecf559900261a4df985662df54fb7fdb55e8e3b3aa99b23d526b62", size = 42301124, upload-time = "2025-04-27T12:29:17.187Z" }, + { url = "https://files.pythonhosted.org/packages/4f/92/692c562be4504c262089e86757a9048739fe1acb4024f92d39615e7bab3f/pyarrow-20.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6bb830757103a6cb300a04610e08d9636f0cd223d32f388418ea893a3e655f1c", size = 42916060, upload-time = "2025-04-27T12:29:24.253Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ec/9f5c7e7c828d8e0a3c7ef50ee62eca38a7de2fa6eb1b8fa43685c9414fef/pyarrow-20.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:96e37f0766ecb4514a899d9a3554fadda770fb57ddf42b63d80f14bc20aa7db3", size = 44547640, upload-time = "2025-04-27T12:29:32.782Z" }, + { url = "https://files.pythonhosted.org/packages/54/96/46613131b4727f10fd2ffa6d0d6f02efcc09a0e7374eff3b5771548aa95b/pyarrow-20.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3346babb516f4b6fd790da99b98bed9708e3f02e734c84971faccb20736848dc", size = 25781491, upload-time = "2025-04-27T12:29:38.464Z" }, + { url = "https://files.pythonhosted.org/packages/a1/d6/0c10e0d54f6c13eb464ee9b67a68b8c71bcf2f67760ef5b6fbcddd2ab05f/pyarrow-20.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:75a51a5b0eef32727a247707d4755322cb970be7e935172b6a3a9f9ae98404ba", size = 30815067, upload-time = "2025-04-27T12:29:44.384Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e2/04e9874abe4094a06fd8b0cbb0f1312d8dd7d707f144c2ec1e5e8f452ffa/pyarrow-20.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:211d5e84cecc640c7a3ab900f930aaff5cd2702177e0d562d426fb7c4f737781", size = 32297128, upload-time = "2025-04-27T12:29:52.038Z" }, + { url = "https://files.pythonhosted.org/packages/31/fd/c565e5dcc906a3b471a83273039cb75cb79aad4a2d4a12f76cc5ae90a4b8/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba3cf4182828be7a896cbd232aa8dd6a31bd1f9e32776cc3796c012855e1199", size = 41334890, upload-time = "2025-04-27T12:29:59.452Z" }, + { url = "https://files.pythonhosted.org/packages/af/a9/3bdd799e2c9b20c1ea6dc6fa8e83f29480a97711cf806e823f808c2316ac/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c3a01f313ffe27ac4126f4c2e5ea0f36a5fc6ab51f8726cf41fee4b256680bd", size = 42421775, upload-time = "2025-04-27T12:30:06.875Z" }, + { url = "https://files.pythonhosted.org/packages/10/f7/da98ccd86354c332f593218101ae56568d5dcedb460e342000bd89c49cc1/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a2791f69ad72addd33510fec7bb14ee06c2a448e06b649e264c094c5b5f7ce28", size = 40687231, upload-time = "2025-04-27T12:30:13.954Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1b/2168d6050e52ff1e6cefc61d600723870bf569cbf41d13db939c8cf97a16/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4250e28a22302ce8692d3a0e8ec9d9dde54ec00d237cff4dfa9c1fbf79e472a8", size = 42295639, upload-time = "2025-04-27T12:30:21.949Z" }, + { url = "https://files.pythonhosted.org/packages/b2/66/2d976c0c7158fd25591c8ca55aee026e6d5745a021915a1835578707feb3/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:89e030dc58fc760e4010148e6ff164d2f44441490280ef1e97a542375e41058e", size = 42908549, upload-time = "2025-04-27T12:30:29.551Z" }, + { url = "https://files.pythonhosted.org/packages/31/a9/dfb999c2fc6911201dcbf348247f9cc382a8990f9ab45c12eabfd7243a38/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6102b4864d77102dbbb72965618e204e550135a940c2534711d5ffa787df2a5a", size = 44557216, upload-time = "2025-04-27T12:30:36.977Z" }, + { url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b", size = 25660496, upload-time = "2025-04-27T12:30:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501, upload-time = "2025-04-27T12:30:48.351Z" }, + { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895, upload-time = "2025-04-27T12:30:55.238Z" }, + { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322, upload-time = "2025-04-27T12:31:05.587Z" }, + { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441, upload-time = "2025-04-27T12:31:15.675Z" }, + { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027, upload-time = "2025-04-27T12:31:24.631Z" }, + { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473, upload-time = "2025-04-27T12:31:31.311Z" }, + { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897, upload-time = "2025-04-27T12:31:39.406Z" }, + { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847, upload-time = "2025-04-27T12:31:45.997Z" }, + { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219, upload-time = "2025-04-27T12:31:54.11Z" }, + { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957, upload-time = "2025-04-27T12:31:59.215Z" }, + { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972, upload-time = "2025-04-27T12:32:05.369Z" }, + { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434, upload-time = "2025-04-27T12:32:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648, upload-time = "2025-04-27T12:32:20.766Z" }, + { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853, upload-time = "2025-04-27T12:32:28.1Z" }, + { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743, upload-time = "2025-04-27T12:32:35.792Z" }, + { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441, upload-time = "2025-04-27T12:32:46.64Z" }, + { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279, upload-time = "2025-04-27T12:32:56.503Z" }, + { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982, upload-time = "2025-04-27T12:33:04.72Z" }, ] [[package]] name = "pyarrow-hotfix" version = "0.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d2/ed/c3e8677f7abf3981838c2af7b5ac03e3589b3ef94fcb31d575426abae904/pyarrow_hotfix-0.7.tar.gz", hash = "sha256:59399cd58bdd978b2e42816a4183a55c6472d4e33d183351b6069f11ed42661d", size = 9910, upload_time = "2025-04-25T10:17:06.247Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/ed/c3e8677f7abf3981838c2af7b5ac03e3589b3ef94fcb31d575426abae904/pyarrow_hotfix-0.7.tar.gz", hash = "sha256:59399cd58bdd978b2e42816a4183a55c6472d4e33d183351b6069f11ed42661d", size = 9910, upload-time = "2025-04-25T10:17:06.247Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/c3/94ade4906a2f88bc935772f59c934013b4205e773bcb4239db114a6da136/pyarrow_hotfix-0.7-py3-none-any.whl", hash = "sha256:3236f3b5f1260f0e2ac070a55c1a7b339c4bb7267839bd2015e283234e758100", size = 7923, upload_time = "2025-04-25T10:17:05.224Z" }, + { url = "https://files.pythonhosted.org/packages/2e/c3/94ade4906a2f88bc935772f59c934013b4205e773bcb4239db114a6da136/pyarrow_hotfix-0.7-py3-none-any.whl", hash = "sha256:3236f3b5f1260f0e2ac070a55c1a7b339c4bb7267839bd2015e283234e758100", size = 7923, upload-time = "2025-04-25T10:17:05.224Z" }, ] [[package]] name = "pyasn1" version = "0.6.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload_time = "2024-09-10T22:41:42.55Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload-time = "2024-09-10T22:41:42.55Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload_time = "2024-09-11T16:00:36.122Z" }, + { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload-time = "2024-09-11T16:00:36.122Z" }, ] [[package]] @@ -1620,9 +1634,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload_time = "2025-03-28T02:41:22.17Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload_time = "2025-03-28T02:41:19.028Z" }, + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, ] [[package]] @@ -1635,9 +1649,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513, upload_time = "2025-04-08T13:27:06.399Z" } +sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513, upload-time = "2025-04-08T13:27:06.399Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591, upload_time = "2025-04-08T13:27:03.789Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591, upload-time = "2025-04-08T13:27:03.789Z" }, ] [[package]] @@ -1647,62 +1661,62 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395, upload_time = "2025-04-02T09:49:41.8Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/7f/c6298830cb780c46b4f46bb24298d01019ffa4d21769f39b908cd14bbd50/pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", size = 2044224, upload_time = "2025-04-02T09:47:04.199Z" }, - { url = "https://files.pythonhosted.org/packages/a8/65/6ab3a536776cad5343f625245bd38165d6663256ad43f3a200e5936afd6c/pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", size = 1858845, upload_time = "2025-04-02T09:47:05.686Z" }, - { url = "https://files.pythonhosted.org/packages/e9/15/9a22fd26ba5ee8c669d4b8c9c244238e940cd5d818649603ca81d1c69861/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", size = 1910029, upload_time = "2025-04-02T09:47:07.042Z" }, - { url = "https://files.pythonhosted.org/packages/d5/33/8cb1a62818974045086f55f604044bf35b9342900318f9a2a029a1bec460/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", size = 1997784, upload_time = "2025-04-02T09:47:08.63Z" }, - { url = "https://files.pythonhosted.org/packages/c0/ca/49958e4df7715c71773e1ea5be1c74544923d10319173264e6db122543f9/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", size = 2141075, upload_time = "2025-04-02T09:47:10.267Z" }, - { url = "https://files.pythonhosted.org/packages/7b/a6/0b3a167a9773c79ba834b959b4e18c3ae9216b8319bd8422792abc8a41b1/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", size = 2745849, upload_time = "2025-04-02T09:47:11.724Z" }, - { url = "https://files.pythonhosted.org/packages/0b/60/516484135173aa9e5861d7a0663dce82e4746d2e7f803627d8c25dfa5578/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", size = 2005794, upload_time = "2025-04-02T09:47:13.099Z" }, - { url = "https://files.pythonhosted.org/packages/86/70/05b1eb77459ad47de00cf78ee003016da0cedf8b9170260488d7c21e9181/pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", size = 2123237, upload_time = "2025-04-02T09:47:14.355Z" }, - { url = "https://files.pythonhosted.org/packages/c7/57/12667a1409c04ae7dc95d3b43158948eb0368e9c790be8b095cb60611459/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", size = 2086351, upload_time = "2025-04-02T09:47:15.676Z" }, - { url = "https://files.pythonhosted.org/packages/57/61/cc6d1d1c1664b58fdd6ecc64c84366c34ec9b606aeb66cafab6f4088974c/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", size = 2258914, upload_time = "2025-04-02T09:47:17Z" }, - { url = "https://files.pythonhosted.org/packages/d1/0a/edb137176a1f5419b2ddee8bde6a0a548cfa3c74f657f63e56232df8de88/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", size = 2257385, upload_time = "2025-04-02T09:47:18.631Z" }, - { url = "https://files.pythonhosted.org/packages/26/3c/48ca982d50e4b0e1d9954919c887bdc1c2b462801bf408613ccc641b3daa/pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", size = 1923765, upload_time = "2025-04-02T09:47:20.34Z" }, - { url = "https://files.pythonhosted.org/packages/33/cd/7ab70b99e5e21559f5de38a0928ea84e6f23fdef2b0d16a6feaf942b003c/pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", size = 1950688, upload_time = "2025-04-02T09:47:22.029Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ae/db1fc237b82e2cacd379f63e3335748ab88b5adde98bf7544a1b1bd10a84/pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", size = 1908185, upload_time = "2025-04-02T09:47:23.385Z" }, - { url = "https://files.pythonhosted.org/packages/c8/ce/3cb22b07c29938f97ff5f5bb27521f95e2ebec399b882392deb68d6c440e/pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", size = 2026640, upload_time = "2025-04-02T09:47:25.394Z" }, - { url = "https://files.pythonhosted.org/packages/19/78/f381d643b12378fee782a72126ec5d793081ef03791c28a0fd542a5bee64/pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", size = 1852649, upload_time = "2025-04-02T09:47:27.417Z" }, - { url = "https://files.pythonhosted.org/packages/9d/2b/98a37b80b15aac9eb2c6cfc6dbd35e5058a352891c5cce3a8472d77665a6/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", size = 1892472, upload_time = "2025-04-02T09:47:29.006Z" }, - { url = "https://files.pythonhosted.org/packages/4e/d4/3c59514e0f55a161004792b9ff3039da52448f43f5834f905abef9db6e4a/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", size = 1977509, upload_time = "2025-04-02T09:47:33.464Z" }, - { url = "https://files.pythonhosted.org/packages/a9/b6/c2c7946ef70576f79a25db59a576bce088bdc5952d1b93c9789b091df716/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", size = 2128702, upload_time = "2025-04-02T09:47:34.812Z" }, - { url = "https://files.pythonhosted.org/packages/88/fe/65a880f81e3f2a974312b61f82a03d85528f89a010ce21ad92f109d94deb/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", size = 2679428, upload_time = "2025-04-02T09:47:37.315Z" }, - { url = "https://files.pythonhosted.org/packages/6f/ff/4459e4146afd0462fb483bb98aa2436d69c484737feaceba1341615fb0ac/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", size = 2008753, upload_time = "2025-04-02T09:47:39.013Z" }, - { url = "https://files.pythonhosted.org/packages/7c/76/1c42e384e8d78452ededac8b583fe2550c84abfef83a0552e0e7478ccbc3/pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", size = 2114849, upload_time = "2025-04-02T09:47:40.427Z" }, - { url = "https://files.pythonhosted.org/packages/00/72/7d0cf05095c15f7ffe0eb78914b166d591c0eed72f294da68378da205101/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", size = 2069541, upload_time = "2025-04-02T09:47:42.01Z" }, - { url = "https://files.pythonhosted.org/packages/b3/69/94a514066bb7d8be499aa764926937409d2389c09be0b5107a970286ef81/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", size = 2239225, upload_time = "2025-04-02T09:47:43.425Z" }, - { url = "https://files.pythonhosted.org/packages/84/b0/e390071eadb44b41f4f54c3cef64d8bf5f9612c92686c9299eaa09e267e2/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", size = 2248373, upload_time = "2025-04-02T09:47:44.979Z" }, - { url = "https://files.pythonhosted.org/packages/d6/b2/288b3579ffc07e92af66e2f1a11be3b056fe1214aab314748461f21a31c3/pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", size = 1907034, upload_time = "2025-04-02T09:47:46.843Z" }, - { url = "https://files.pythonhosted.org/packages/02/28/58442ad1c22b5b6742b992ba9518420235adced665513868f99a1c2638a5/pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", size = 1956848, upload_time = "2025-04-02T09:47:48.404Z" }, - { url = "https://files.pythonhosted.org/packages/a1/eb/f54809b51c7e2a1d9f439f158b8dd94359321abcc98767e16fc48ae5a77e/pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", size = 1903986, upload_time = "2025-04-02T09:47:49.839Z" }, - { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551, upload_time = "2025-04-02T09:47:51.648Z" }, - { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785, upload_time = "2025-04-02T09:47:53.149Z" }, - { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758, upload_time = "2025-04-02T09:47:55.006Z" }, - { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109, upload_time = "2025-04-02T09:47:56.532Z" }, - { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159, upload_time = "2025-04-02T09:47:58.088Z" }, - { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222, upload_time = "2025-04-02T09:47:59.591Z" }, - { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980, upload_time = "2025-04-02T09:48:01.397Z" }, - { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840, upload_time = "2025-04-02T09:48:03.056Z" }, - { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518, upload_time = "2025-04-02T09:48:04.662Z" }, - { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025, upload_time = "2025-04-02T09:48:06.226Z" }, - { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991, upload_time = "2025-04-02T09:48:08.114Z" }, - { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262, upload_time = "2025-04-02T09:48:09.708Z" }, - { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626, upload_time = "2025-04-02T09:48:11.288Z" }, - { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590, upload_time = "2025-04-02T09:48:12.861Z" }, - { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963, upload_time = "2025-04-02T09:48:14.553Z" }, - { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896, upload_time = "2025-04-02T09:48:16.222Z" }, - { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810, upload_time = "2025-04-02T09:48:17.97Z" }, - { url = "https://files.pythonhosted.org/packages/0b/76/1794e440c1801ed35415238d2c728f26cd12695df9057154ad768b7b991c/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", size = 2042858, upload_time = "2025-04-02T09:49:03.419Z" }, - { url = "https://files.pythonhosted.org/packages/73/b4/9cd7b081fb0b1b4f8150507cd59d27b275c3e22ad60b35cb19ea0977d9b9/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", size = 1873745, upload_time = "2025-04-02T09:49:05.391Z" }, - { url = "https://files.pythonhosted.org/packages/e1/d7/9ddb7575d4321e40d0363903c2576c8c0c3280ebea137777e5ab58d723e3/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", size = 1904188, upload_time = "2025-04-02T09:49:07.352Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a8/3194ccfe461bb08da19377ebec8cb4f13c9bd82e13baebc53c5c7c39a029/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", size = 2083479, upload_time = "2025-04-02T09:49:09.304Z" }, - { url = "https://files.pythonhosted.org/packages/42/c7/84cb569555d7179ca0b3f838cef08f66f7089b54432f5b8599aac6e9533e/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", size = 2118415, upload_time = "2025-04-02T09:49:11.25Z" }, - { url = "https://files.pythonhosted.org/packages/3b/67/72abb8c73e0837716afbb58a59cc9e3ae43d1aa8677f3b4bc72c16142716/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", size = 2079623, upload_time = "2025-04-02T09:49:13.292Z" }, - { url = "https://files.pythonhosted.org/packages/0b/cd/c59707e35a47ba4cbbf153c3f7c56420c58653b5801b055dc52cccc8e2dc/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", size = 2250175, upload_time = "2025-04-02T09:49:15.597Z" }, - { url = "https://files.pythonhosted.org/packages/84/32/e4325a6676b0bed32d5b084566ec86ed7fd1e9bcbfc49c578b1755bde920/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", size = 2254674, upload_time = "2025-04-02T09:49:17.61Z" }, - { url = "https://files.pythonhosted.org/packages/12/6f/5596dc418f2e292ffc661d21931ab34591952e2843e7168ea5a52591f6ff/pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", size = 2080951, upload_time = "2025-04-02T09:49:19.559Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395, upload-time = "2025-04-02T09:49:41.8Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/7f/c6298830cb780c46b4f46bb24298d01019ffa4d21769f39b908cd14bbd50/pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", size = 2044224, upload-time = "2025-04-02T09:47:04.199Z" }, + { url = "https://files.pythonhosted.org/packages/a8/65/6ab3a536776cad5343f625245bd38165d6663256ad43f3a200e5936afd6c/pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", size = 1858845, upload-time = "2025-04-02T09:47:05.686Z" }, + { url = "https://files.pythonhosted.org/packages/e9/15/9a22fd26ba5ee8c669d4b8c9c244238e940cd5d818649603ca81d1c69861/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", size = 1910029, upload-time = "2025-04-02T09:47:07.042Z" }, + { url = "https://files.pythonhosted.org/packages/d5/33/8cb1a62818974045086f55f604044bf35b9342900318f9a2a029a1bec460/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", size = 1997784, upload-time = "2025-04-02T09:47:08.63Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ca/49958e4df7715c71773e1ea5be1c74544923d10319173264e6db122543f9/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", size = 2141075, upload-time = "2025-04-02T09:47:10.267Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a6/0b3a167a9773c79ba834b959b4e18c3ae9216b8319bd8422792abc8a41b1/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", size = 2745849, upload-time = "2025-04-02T09:47:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/0b/60/516484135173aa9e5861d7a0663dce82e4746d2e7f803627d8c25dfa5578/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", size = 2005794, upload-time = "2025-04-02T09:47:13.099Z" }, + { url = "https://files.pythonhosted.org/packages/86/70/05b1eb77459ad47de00cf78ee003016da0cedf8b9170260488d7c21e9181/pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", size = 2123237, upload-time = "2025-04-02T09:47:14.355Z" }, + { url = "https://files.pythonhosted.org/packages/c7/57/12667a1409c04ae7dc95d3b43158948eb0368e9c790be8b095cb60611459/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", size = 2086351, upload-time = "2025-04-02T09:47:15.676Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/cc6d1d1c1664b58fdd6ecc64c84366c34ec9b606aeb66cafab6f4088974c/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", size = 2258914, upload-time = "2025-04-02T09:47:17Z" }, + { url = "https://files.pythonhosted.org/packages/d1/0a/edb137176a1f5419b2ddee8bde6a0a548cfa3c74f657f63e56232df8de88/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", size = 2257385, upload-time = "2025-04-02T09:47:18.631Z" }, + { url = "https://files.pythonhosted.org/packages/26/3c/48ca982d50e4b0e1d9954919c887bdc1c2b462801bf408613ccc641b3daa/pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", size = 1923765, upload-time = "2025-04-02T09:47:20.34Z" }, + { url = "https://files.pythonhosted.org/packages/33/cd/7ab70b99e5e21559f5de38a0928ea84e6f23fdef2b0d16a6feaf942b003c/pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", size = 1950688, upload-time = "2025-04-02T09:47:22.029Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ae/db1fc237b82e2cacd379f63e3335748ab88b5adde98bf7544a1b1bd10a84/pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", size = 1908185, upload-time = "2025-04-02T09:47:23.385Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ce/3cb22b07c29938f97ff5f5bb27521f95e2ebec399b882392deb68d6c440e/pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", size = 2026640, upload-time = "2025-04-02T09:47:25.394Z" }, + { url = "https://files.pythonhosted.org/packages/19/78/f381d643b12378fee782a72126ec5d793081ef03791c28a0fd542a5bee64/pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", size = 1852649, upload-time = "2025-04-02T09:47:27.417Z" }, + { url = "https://files.pythonhosted.org/packages/9d/2b/98a37b80b15aac9eb2c6cfc6dbd35e5058a352891c5cce3a8472d77665a6/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", size = 1892472, upload-time = "2025-04-02T09:47:29.006Z" }, + { url = "https://files.pythonhosted.org/packages/4e/d4/3c59514e0f55a161004792b9ff3039da52448f43f5834f905abef9db6e4a/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", size = 1977509, upload-time = "2025-04-02T09:47:33.464Z" }, + { url = "https://files.pythonhosted.org/packages/a9/b6/c2c7946ef70576f79a25db59a576bce088bdc5952d1b93c9789b091df716/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", size = 2128702, upload-time = "2025-04-02T09:47:34.812Z" }, + { url = "https://files.pythonhosted.org/packages/88/fe/65a880f81e3f2a974312b61f82a03d85528f89a010ce21ad92f109d94deb/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", size = 2679428, upload-time = "2025-04-02T09:47:37.315Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ff/4459e4146afd0462fb483bb98aa2436d69c484737feaceba1341615fb0ac/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", size = 2008753, upload-time = "2025-04-02T09:47:39.013Z" }, + { url = "https://files.pythonhosted.org/packages/7c/76/1c42e384e8d78452ededac8b583fe2550c84abfef83a0552e0e7478ccbc3/pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", size = 2114849, upload-time = "2025-04-02T09:47:40.427Z" }, + { url = "https://files.pythonhosted.org/packages/00/72/7d0cf05095c15f7ffe0eb78914b166d591c0eed72f294da68378da205101/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", size = 2069541, upload-time = "2025-04-02T09:47:42.01Z" }, + { url = "https://files.pythonhosted.org/packages/b3/69/94a514066bb7d8be499aa764926937409d2389c09be0b5107a970286ef81/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", size = 2239225, upload-time = "2025-04-02T09:47:43.425Z" }, + { url = "https://files.pythonhosted.org/packages/84/b0/e390071eadb44b41f4f54c3cef64d8bf5f9612c92686c9299eaa09e267e2/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", size = 2248373, upload-time = "2025-04-02T09:47:44.979Z" }, + { url = "https://files.pythonhosted.org/packages/d6/b2/288b3579ffc07e92af66e2f1a11be3b056fe1214aab314748461f21a31c3/pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", size = 1907034, upload-time = "2025-04-02T09:47:46.843Z" }, + { url = "https://files.pythonhosted.org/packages/02/28/58442ad1c22b5b6742b992ba9518420235adced665513868f99a1c2638a5/pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", size = 1956848, upload-time = "2025-04-02T09:47:48.404Z" }, + { url = "https://files.pythonhosted.org/packages/a1/eb/f54809b51c7e2a1d9f439f158b8dd94359321abcc98767e16fc48ae5a77e/pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", size = 1903986, upload-time = "2025-04-02T09:47:49.839Z" }, + { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551, upload-time = "2025-04-02T09:47:51.648Z" }, + { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785, upload-time = "2025-04-02T09:47:53.149Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758, upload-time = "2025-04-02T09:47:55.006Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109, upload-time = "2025-04-02T09:47:56.532Z" }, + { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159, upload-time = "2025-04-02T09:47:58.088Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222, upload-time = "2025-04-02T09:47:59.591Z" }, + { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980, upload-time = "2025-04-02T09:48:01.397Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840, upload-time = "2025-04-02T09:48:03.056Z" }, + { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518, upload-time = "2025-04-02T09:48:04.662Z" }, + { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025, upload-time = "2025-04-02T09:48:06.226Z" }, + { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991, upload-time = "2025-04-02T09:48:08.114Z" }, + { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262, upload-time = "2025-04-02T09:48:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626, upload-time = "2025-04-02T09:48:11.288Z" }, + { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590, upload-time = "2025-04-02T09:48:12.861Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963, upload-time = "2025-04-02T09:48:14.553Z" }, + { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896, upload-time = "2025-04-02T09:48:16.222Z" }, + { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810, upload-time = "2025-04-02T09:48:17.97Z" }, + { url = "https://files.pythonhosted.org/packages/0b/76/1794e440c1801ed35415238d2c728f26cd12695df9057154ad768b7b991c/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", size = 2042858, upload-time = "2025-04-02T09:49:03.419Z" }, + { url = "https://files.pythonhosted.org/packages/73/b4/9cd7b081fb0b1b4f8150507cd59d27b275c3e22ad60b35cb19ea0977d9b9/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", size = 1873745, upload-time = "2025-04-02T09:49:05.391Z" }, + { url = "https://files.pythonhosted.org/packages/e1/d7/9ddb7575d4321e40d0363903c2576c8c0c3280ebea137777e5ab58d723e3/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", size = 1904188, upload-time = "2025-04-02T09:49:07.352Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/3194ccfe461bb08da19377ebec8cb4f13c9bd82e13baebc53c5c7c39a029/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", size = 2083479, upload-time = "2025-04-02T09:49:09.304Z" }, + { url = "https://files.pythonhosted.org/packages/42/c7/84cb569555d7179ca0b3f838cef08f66f7089b54432f5b8599aac6e9533e/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", size = 2118415, upload-time = "2025-04-02T09:49:11.25Z" }, + { url = "https://files.pythonhosted.org/packages/3b/67/72abb8c73e0837716afbb58a59cc9e3ae43d1aa8677f3b4bc72c16142716/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", size = 2079623, upload-time = "2025-04-02T09:49:13.292Z" }, + { url = "https://files.pythonhosted.org/packages/0b/cd/c59707e35a47ba4cbbf153c3f7c56420c58653b5801b055dc52cccc8e2dc/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", size = 2250175, upload-time = "2025-04-02T09:49:15.597Z" }, + { url = "https://files.pythonhosted.org/packages/84/32/e4325a6676b0bed32d5b084566ec86ed7fd1e9bcbfc49c578b1755bde920/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", size = 2254674, upload-time = "2025-04-02T09:49:17.61Z" }, + { url = "https://files.pythonhosted.org/packages/12/6f/5596dc418f2e292ffc661d21931ab34591952e2843e7168ea5a52591f6ff/pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", size = 2080951, upload-time = "2025-04-02T09:49:19.559Z" }, ] [[package]] @@ -1712,36 +1726,36 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d2/a7/8faaa62a488a2a1e0d56969757f087cbd2729e9bcfa508c230299f366b4c/pyee-12.0.0.tar.gz", hash = "sha256:c480603f4aa2927d4766eb41fa82793fe60a82cbfdb8d688e0d08c55a534e145", size = 29675, upload_time = "2024-08-30T19:40:43.555Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/a7/8faaa62a488a2a1e0d56969757f087cbd2729e9bcfa508c230299f366b4c/pyee-12.0.0.tar.gz", hash = "sha256:c480603f4aa2927d4766eb41fa82793fe60a82cbfdb8d688e0d08c55a534e145", size = 29675, upload-time = "2024-08-30T19:40:43.555Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/0d/95993c08c721ec68892547f2117e8f9dfbcef2ca71e098533541b4a54d5f/pyee-12.0.0-py3-none-any.whl", hash = "sha256:7b14b74320600049ccc7d0e0b1becd3b4bd0a03c745758225e31a59f4095c990", size = 14831, upload_time = "2024-08-30T19:40:42.132Z" }, + { url = "https://files.pythonhosted.org/packages/1d/0d/95993c08c721ec68892547f2117e8f9dfbcef2ca71e098533541b4a54d5f/pyee-12.0.0-py3-none-any.whl", hash = "sha256:7b14b74320600049ccc7d0e0b1becd3b4bd0a03c745758225e31a59f4095c990", size = 14831, upload-time = "2024-08-30T19:40:42.132Z" }, ] [[package]] name = "pygments" version = "2.19.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload_time = "2025-01-06T17:26:30.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload-time = "2025-01-06T17:26:30.443Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload_time = "2025-01-06T17:26:25.553Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload-time = "2025-01-06T17:26:25.553Z" }, ] [[package]] name = "pyjwt" version = "2.10.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload_time = "2024-11-28T03:43:29.933Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload_time = "2024-11-28T03:43:27.893Z" }, + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, ] [[package]] name = "pyparsing" version = "3.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608, upload_time = "2025-03-25T05:01:28.114Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608, upload-time = "2025-03-25T05:01:28.114Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload_time = "2025-03-25T05:01:24.908Z" }, + { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload-time = "2025-03-25T05:01:24.908Z" }, ] [[package]] @@ -1754,9 +1768,9 @@ dependencies = [ { name = "packaging" }, { name = "pluggy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload_time = "2025-03-02T12:54:54.503Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload_time = "2025-03-02T12:54:52.069Z" }, + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, ] [[package]] @@ -1766,9 +1780,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f2/a8/ecbc8ede70921dd2f544ab1cadd3ff3bf842af27f87bbdea774c7baa1d38/pytest_asyncio-0.25.3.tar.gz", hash = "sha256:fc1da2cf9f125ada7e710b4ddad05518d4cee187ae9412e9ac9271003497f07a", size = 54239, upload_time = "2025-01-28T18:37:58.729Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/a8/ecbc8ede70921dd2f544ab1cadd3ff3bf842af27f87bbdea774c7baa1d38/pytest_asyncio-0.25.3.tar.gz", hash = "sha256:fc1da2cf9f125ada7e710b4ddad05518d4cee187ae9412e9ac9271003497f07a", size = 54239, upload-time = "2025-01-28T18:37:58.729Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/17/3493c5624e48fd97156ebaec380dcaafee9506d7e2c46218ceebbb57d7de/pytest_asyncio-0.25.3-py3-none-any.whl", hash = "sha256:9e89518e0f9bd08928f97a3482fdc4e244df17529460bc038291ccaf8f85c7c3", size = 19467, upload_time = "2025-01-28T18:37:56.798Z" }, + { url = "https://files.pythonhosted.org/packages/67/17/3493c5624e48fd97156ebaec380dcaafee9506d7e2c46218ceebbb57d7de/pytest_asyncio-0.25.3-py3-none-any.whl", hash = "sha256:9e89518e0f9bd08928f97a3482fdc4e244df17529460bc038291ccaf8f85c7c3", size = 19467, upload-time = "2025-01-28T18:37:56.798Z" }, ] [[package]] @@ -1778,9 +1792,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b3/96/25588c55fbe330b751bd7c7d723c3544957566bc090f6d506551b514f488/pytest-mock-3.12.0.tar.gz", hash = "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9", size = 32139, upload_time = "2023-10-19T16:25:57.7Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/96/25588c55fbe330b751bd7c7d723c3544957566bc090f6d506551b514f488/pytest-mock-3.12.0.tar.gz", hash = "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9", size = 32139, upload-time = "2023-10-19T16:25:57.7Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/25/b29fd10dd062cf41e66787a7951b3842881a2a2d7e3a41fcbb58a8466046/pytest_mock-3.12.0-py3-none-any.whl", hash = "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f", size = 9771, upload_time = "2023-10-19T16:25:55.764Z" }, + { url = "https://files.pythonhosted.org/packages/b9/25/b29fd10dd062cf41e66787a7951b3842881a2a2d7e3a41fcbb58a8466046/pytest_mock-3.12.0-py3-none-any.whl", hash = "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f", size = 9771, upload-time = "2023-10-19T16:25:55.764Z" }, ] [[package]] @@ -1790,9 +1804,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/93/0d/04719abc7a4bdb3a7a1f968f24b0f5253d698c9cc94975330e9d3145befb/pytest-timeout-2.3.1.tar.gz", hash = "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9", size = 17697, upload_time = "2024-03-07T21:04:01.069Z" } +sdist = { url = "https://files.pythonhosted.org/packages/93/0d/04719abc7a4bdb3a7a1f968f24b0f5253d698c9cc94975330e9d3145befb/pytest-timeout-2.3.1.tar.gz", hash = "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9", size = 17697, upload-time = "2024-03-07T21:04:01.069Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/03/27/14af9ef8321f5edc7527e47def2a21d8118c6f329a9342cc61387a0c0599/pytest_timeout-2.3.1-py3-none-any.whl", hash = "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e", size = 14148, upload_time = "2024-03-07T21:03:58.764Z" }, + { url = "https://files.pythonhosted.org/packages/03/27/14af9ef8321f5edc7527e47def2a21d8118c6f329a9342cc61387a0c0599/pytest_timeout-2.3.1-py3-none-any.whl", hash = "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e", size = 14148, upload-time = "2024-03-07T21:03:58.764Z" }, ] [[package]] @@ -1802,27 +1816,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload_time = "2024-03-01T18:36:20.211Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload_time = "2024-03-01T18:36:18.57Z" }, + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] [[package]] name = "python-dotenv" version = "1.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115, upload_time = "2024-01-23T06:33:00.505Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115, upload-time = "2024-01-23T06:33:00.505Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863, upload_time = "2024-01-23T06:32:58.246Z" }, + { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863, upload-time = "2024-01-23T06:32:58.246Z" }, ] [[package]] name = "python-multipart" version = "0.0.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload_time = "2024-12-16T19:45:46.972Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload-time = "2024-12-16T19:45:46.972Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload_time = "2024-12-16T19:45:44.423Z" }, + { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" }, ] [[package]] @@ -1832,18 +1846,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "text-unidecode" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload_time = "2024-02-08T18:32:45.488Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload-time = "2024-02-08T18:32:45.488Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload_time = "2024-02-08T18:32:43.911Z" }, + { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload-time = "2024-02-08T18:32:43.911Z" }, ] [[package]] name = "pytz" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload_time = "2025-03-25T02:25:00.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload_time = "2025-03-25T02:24:58.468Z" }, + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, ] [[package]] @@ -1851,50 +1865,50 @@ name = "pywin32" version = "310" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284, upload_time = "2025-03-17T00:55:53.124Z" }, - { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748, upload_time = "2025-03-17T00:55:55.203Z" }, - { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941, upload_time = "2025-03-17T00:55:57.048Z" }, - { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239, upload_time = "2025-03-17T00:55:58.807Z" }, - { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839, upload_time = "2025-03-17T00:56:00.8Z" }, - { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470, upload_time = "2025-03-17T00:56:02.601Z" }, - { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384, upload_time = "2025-03-17T00:56:04.383Z" }, - { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039, upload_time = "2025-03-17T00:56:06.207Z" }, - { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload_time = "2025-03-17T00:56:07.819Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284, upload-time = "2025-03-17T00:55:53.124Z" }, + { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748, upload-time = "2025-03-17T00:55:55.203Z" }, + { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941, upload-time = "2025-03-17T00:55:57.048Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239, upload-time = "2025-03-17T00:55:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839, upload-time = "2025-03-17T00:56:00.8Z" }, + { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470, upload-time = "2025-03-17T00:56:02.601Z" }, + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384, upload-time = "2025-03-17T00:56:04.383Z" }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039, upload-time = "2025-03-17T00:56:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload-time = "2025-03-17T00:56:07.819Z" }, ] [[package]] name = "pyyaml" version = "6.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload_time = "2024-08-06T20:33:50.674Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload_time = "2024-08-06T20:32:03.408Z" }, - { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload_time = "2024-08-06T20:32:04.926Z" }, - { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload_time = "2024-08-06T20:32:06.459Z" }, - { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload_time = "2024-08-06T20:32:08.338Z" }, - { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload_time = "2024-08-06T20:32:14.124Z" }, - { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload_time = "2024-08-06T20:32:16.17Z" }, - { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload_time = "2024-08-06T20:32:18.555Z" }, - { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload_time = "2024-08-06T20:32:19.889Z" }, - { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload_time = "2024-08-06T20:32:21.273Z" }, - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload_time = "2024-08-06T20:32:25.131Z" }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload_time = "2024-08-06T20:32:26.511Z" }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload_time = "2024-08-06T20:32:28.363Z" }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload_time = "2024-08-06T20:32:30.058Z" }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload_time = "2024-08-06T20:32:31.881Z" }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload_time = "2024-08-06T20:32:37.083Z" }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload_time = "2024-08-06T20:32:38.898Z" }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload_time = "2024-08-06T20:32:40.241Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload_time = "2024-08-06T20:32:41.93Z" }, - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload_time = "2024-08-06T20:32:43.4Z" }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload_time = "2024-08-06T20:32:44.801Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload_time = "2024-08-06T20:32:46.432Z" }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload_time = "2024-08-06T20:32:51.188Z" }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload_time = "2024-08-06T20:32:53.019Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload_time = "2024-08-06T20:32:54.708Z" }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload_time = "2024-08-06T20:32:56.985Z" }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload_time = "2024-08-06T20:33:03.001Z" }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload_time = "2024-08-06T20:33:04.33Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload-time = "2024-08-06T20:32:03.408Z" }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload-time = "2024-08-06T20:32:04.926Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload-time = "2024-08-06T20:32:06.459Z" }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload-time = "2024-08-06T20:32:08.338Z" }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload-time = "2024-08-06T20:32:14.124Z" }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload-time = "2024-08-06T20:32:16.17Z" }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload-time = "2024-08-06T20:32:18.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload-time = "2024-08-06T20:32:19.889Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload-time = "2024-08-06T20:32:21.273Z" }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload-time = "2024-08-06T20:32:25.131Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload-time = "2024-08-06T20:32:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload-time = "2024-08-06T20:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload-time = "2024-08-06T20:32:30.058Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload-time = "2024-08-06T20:32:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload-time = "2024-08-06T20:32:37.083Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, ] [[package]] @@ -1907,9 +1921,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload_time = "2024-05-29T15:37:49.536Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload-time = "2024-05-29T15:37:49.536Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload_time = "2024-05-29T15:37:47.027Z" }, + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload-time = "2024-05-29T15:37:47.027Z" }, ] [[package]] @@ -1920,9 +1934,9 @@ dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload_time = "2025-03-30T14:15:14.23Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload-time = "2025-03-30T14:15:14.23Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload_time = "2025-03-30T14:15:12.283Z" }, + { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload-time = "2025-03-30T14:15:12.283Z" }, ] [[package]] @@ -1934,9 +1948,9 @@ dependencies = [ { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f6/31/b6d055f291a660a7bcaec4bcc9457b9fef8ecb6293e527b1eef1840aefd4/rich_toolkit-0.14.6.tar.gz", hash = "sha256:9dbd40e83414b84e828bf899115fff8877ce5951b73175f44db142902f07645d", size = 110805, upload_time = "2025-05-12T19:19:15.284Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/31/b6d055f291a660a7bcaec4bcc9457b9fef8ecb6293e527b1eef1840aefd4/rich_toolkit-0.14.6.tar.gz", hash = "sha256:9dbd40e83414b84e828bf899115fff8877ce5951b73175f44db142902f07645d", size = 110805, upload-time = "2025-05-12T19:19:15.284Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/3c/7a824c0514e87c61000583ac22c8321da6dc8e58a93d5f56e583482a2ee0/rich_toolkit-0.14.6-py3-none-any.whl", hash = "sha256:764f3a5f9e4b539ce805596863299e8982599514906dc5e3ccc2d390ef74c301", size = 24815, upload_time = "2025-05-12T19:19:13.713Z" }, + { url = "https://files.pythonhosted.org/packages/2e/3c/7a824c0514e87c61000583ac22c8321da6dc8e58a93d5f56e583482a2ee0/rich_toolkit-0.14.6-py3-none-any.whl", hash = "sha256:764f3a5f9e4b539ce805596863299e8982599514906dc5e3ccc2d390ef74c301", size = 24815, upload-time = "2025-05-12T19:19:13.713Z" }, ] [[package]] @@ -1946,102 +1960,102 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload_time = "2025-04-16T09:51:18.218Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload-time = "2025-04-16T09:51:18.218Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload_time = "2025-04-16T09:51:17.142Z" }, + { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" }, ] [[package]] name = "setuptools" version = "80.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/0cc40fe41fd2adb80a2f388987f4f8db3c866c69e33e0b4c8b093fdf700e/setuptools-80.4.0.tar.gz", hash = "sha256:5a78f61820bc088c8e4add52932ae6b8cf423da2aff268c23f813cfbb13b4006", size = 1315008, upload_time = "2025-05-09T20:42:27.972Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/0cc40fe41fd2adb80a2f388987f4f8db3c866c69e33e0b4c8b093fdf700e/setuptools-80.4.0.tar.gz", hash = "sha256:5a78f61820bc088c8e4add52932ae6b8cf423da2aff268c23f813cfbb13b4006", size = 1315008, upload-time = "2025-05-09T20:42:27.972Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/93/dba5ed08c2e31ec7cdc2ce75705a484ef0be1a2fecac8a58272489349de8/setuptools-80.4.0-py3-none-any.whl", hash = "sha256:6cdc8cb9a7d590b237dbe4493614a9b75d0559b888047c1f67d49ba50fc3edb2", size = 1200812, upload_time = "2025-05-09T20:42:25.325Z" }, + { url = "https://files.pythonhosted.org/packages/b1/93/dba5ed08c2e31ec7cdc2ce75705a484ef0be1a2fecac8a58272489349de8/setuptools-80.4.0-py3-none-any.whl", hash = "sha256:6cdc8cb9a7d590b237dbe4493614a9b75d0559b888047c1f67d49ba50fc3edb2", size = 1200812, upload-time = "2025-05-09T20:42:25.325Z" }, ] [[package]] name = "shellingham" version = "1.5.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload_time = "2023-10-24T04:13:40.426Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload_time = "2023-10-24T04:13:38.866Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, ] [[package]] name = "simplejson" version = "3.20.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/92/51b417685abd96b31308b61b9acce7ec50d8e1de8fbc39a7fd4962c60689/simplejson-3.20.1.tar.gz", hash = "sha256:e64139b4ec4f1f24c142ff7dcafe55a22b811a74d86d66560c8815687143037d", size = 85591, upload_time = "2025-02-15T05:18:53.15Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/59/74bc90d1c051bc2432c96b34bd4e8036875ab58b4fcbe4d6a5a76985f853/simplejson-3.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:325b8c107253d3217e89d7b50c71015b5b31e2433e6c5bf38967b2f80630a8ca", size = 92132, upload_time = "2025-02-15T05:16:15.743Z" }, - { url = "https://files.pythonhosted.org/packages/71/c7/1970916e0c51794fff89f76da2f632aaf0b259b87753c88a8c409623d3e1/simplejson-3.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88a7baa8211089b9e58d78fbc1b0b322103f3f3d459ff16f03a36cece0d0fcf0", size = 74956, upload_time = "2025-02-15T05:16:17.062Z" }, - { url = "https://files.pythonhosted.org/packages/c8/0d/98cc5909180463f1d75fac7180de62d4cdb4e82c4fef276b9e591979372c/simplejson-3.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:299b1007b8101d50d95bc0db1bf5c38dc372e85b504cf77f596462083ee77e3f", size = 74772, upload_time = "2025-02-15T05:16:19.204Z" }, - { url = "https://files.pythonhosted.org/packages/e1/94/a30a5211a90d67725a3e8fcc1c788189f2ae2ed2b96b63ed15d0b7f5d6bb/simplejson-3.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ec618ed65caab48e81e3ed29586236a8e57daef792f1f3bb59504a7e98cd10", size = 143575, upload_time = "2025-02-15T05:16:21.337Z" }, - { url = "https://files.pythonhosted.org/packages/ee/08/cdb6821f1058eb5db46d252de69ff7e6c53f05f1bae6368fe20d5b51d37e/simplejson-3.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2cdead1d3197f0ff43373cf4730213420523ba48697743e135e26f3d179f38", size = 153241, upload_time = "2025-02-15T05:16:22.859Z" }, - { url = "https://files.pythonhosted.org/packages/4c/2d/ca3caeea0bdc5efc5503d5f57a2dfb56804898fb196dfada121323ee0ccb/simplejson-3.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3466d2839fdc83e1af42e07b90bc8ff361c4e8796cd66722a40ba14e458faddd", size = 141500, upload_time = "2025-02-15T05:16:25.068Z" }, - { url = "https://files.pythonhosted.org/packages/e1/33/d3e0779d5c58245e7370c98eb969275af6b7a4a5aec3b97cbf85f09ad328/simplejson-3.20.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d492ed8e92f3a9f9be829205f44b1d0a89af6582f0cf43e0d129fa477b93fe0c", size = 144757, upload_time = "2025-02-15T05:16:28.301Z" }, - { url = "https://files.pythonhosted.org/packages/54/53/2d93128bb55861b2fa36c5944f38da51a0bc6d83e513afc6f7838440dd15/simplejson-3.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f924b485537b640dc69434565463fd6fc0c68c65a8c6e01a823dd26c9983cf79", size = 144409, upload_time = "2025-02-15T05:16:29.687Z" }, - { url = "https://files.pythonhosted.org/packages/99/4c/dac310a98f897ad3435b4bdc836d92e78f09e38c5dbf28211ed21dc59fa2/simplejson-3.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e8eacf6a3491bf76ea91a8d46726368a6be0eb94993f60b8583550baae9439e", size = 146082, upload_time = "2025-02-15T05:16:31.064Z" }, - { url = "https://files.pythonhosted.org/packages/ee/22/d7ba958cfed39827335b82656b1c46f89678faecda9a7677b47e87b48ee6/simplejson-3.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d04bf90b4cea7c22d8b19091633908f14a096caa301b24c2f3d85b5068fb8", size = 154339, upload_time = "2025-02-15T05:16:32.719Z" }, - { url = "https://files.pythonhosted.org/packages/b8/c8/b072b741129406a7086a0799c6f5d13096231bf35fdd87a0cffa789687fc/simplejson-3.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:69dd28d4ce38390ea4aaf212902712c0fd1093dc4c1ff67e09687c3c3e15a749", size = 147915, upload_time = "2025-02-15T05:16:34.291Z" }, - { url = "https://files.pythonhosted.org/packages/6c/46/8347e61e9cf3db5342a42f7fd30a81b4f5cf85977f916852d7674a540907/simplejson-3.20.1-cp311-cp311-win32.whl", hash = "sha256:dfe7a9da5fd2a3499436cd350f31539e0a6ded5da6b5b3d422df016444d65e43", size = 73972, upload_time = "2025-02-15T05:16:35.712Z" }, - { url = "https://files.pythonhosted.org/packages/01/85/b52f24859237b4e9d523d5655796d911ba3d46e242eb1959c45b6af5aedd/simplejson-3.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:896a6c04d7861d507d800da7642479c3547060bf97419d9ef73d98ced8258766", size = 75595, upload_time = "2025-02-15T05:16:36.957Z" }, - { url = "https://files.pythonhosted.org/packages/8d/eb/34c16a1ac9ba265d024dc977ad84e1659d931c0a700967c3e59a98ed7514/simplejson-3.20.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f31c4a3a7ab18467ee73a27f3e59158255d1520f3aad74315edde7a940f1be23", size = 93100, upload_time = "2025-02-15T05:16:38.801Z" }, - { url = "https://files.pythonhosted.org/packages/41/fc/2c2c007d135894971e6814e7c0806936e5bade28f8db4dd7e2a58b50debd/simplejson-3.20.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:884e6183d16b725e113b83a6fc0230152ab6627d4d36cb05c89c2c5bccfa7bc6", size = 75464, upload_time = "2025-02-15T05:16:40.905Z" }, - { url = "https://files.pythonhosted.org/packages/0f/05/2b5ecb33b776c34bb5cace5de5d7669f9b60e3ca13c113037b2ca86edfbd/simplejson-3.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03d7a426e416fe0d3337115f04164cd9427eb4256e843a6b8751cacf70abc832", size = 75112, upload_time = "2025-02-15T05:16:42.246Z" }, - { url = "https://files.pythonhosted.org/packages/fe/36/1f3609a2792f06cd4b71030485f78e91eb09cfd57bebf3116bf2980a8bac/simplejson-3.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:000602141d0bddfcff60ea6a6e97d5e10c9db6b17fd2d6c66199fa481b6214bb", size = 150182, upload_time = "2025-02-15T05:16:43.557Z" }, - { url = "https://files.pythonhosted.org/packages/2f/b0/053fbda38b8b602a77a4f7829def1b4f316cd8deb5440a6d3ee90790d2a4/simplejson-3.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af8377a8af78226e82e3a4349efdde59ffa421ae88be67e18cef915e4023a595", size = 158363, upload_time = "2025-02-15T05:16:45.748Z" }, - { url = "https://files.pythonhosted.org/packages/d1/4b/2eb84ae867539a80822e92f9be4a7200dffba609275faf99b24141839110/simplejson-3.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15c7de4c88ab2fbcb8781a3b982ef883696736134e20b1210bca43fb42ff1acf", size = 148415, upload_time = "2025-02-15T05:16:47.861Z" }, - { url = "https://files.pythonhosted.org/packages/e0/bd/400b0bd372a5666addf2540c7358bfc3841b9ce5cdbc5cc4ad2f61627ad8/simplejson-3.20.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:455a882ff3f97d810709f7b620007d4e0aca8da71d06fc5c18ba11daf1c4df49", size = 152213, upload_time = "2025-02-15T05:16:49.25Z" }, - { url = "https://files.pythonhosted.org/packages/50/12/143f447bf6a827ee9472693768dc1a5eb96154f8feb140a88ce6973a3cfa/simplejson-3.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc0f523ce923e7f38eb67804bc80e0a028c76d7868500aa3f59225574b5d0453", size = 150048, upload_time = "2025-02-15T05:16:51.5Z" }, - { url = "https://files.pythonhosted.org/packages/5e/ea/dd9b3e8e8ed710a66f24a22c16a907c9b539b6f5f45fd8586bd5c231444e/simplejson-3.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76461ec929282dde4a08061071a47281ad939d0202dc4e63cdd135844e162fbc", size = 151668, upload_time = "2025-02-15T05:16:53Z" }, - { url = "https://files.pythonhosted.org/packages/99/af/ee52a8045426a0c5b89d755a5a70cc821815ef3c333b56fbcad33c4435c0/simplejson-3.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19c2da8c043607bde4d4ef3a6b633e668a7d2e3d56f40a476a74c5ea71949f", size = 158840, upload_time = "2025-02-15T05:16:54.851Z" }, - { url = "https://files.pythonhosted.org/packages/68/db/ab32869acea6b5de7d75fa0dac07a112ded795d41eaa7e66c7813b17be95/simplejson-3.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b2578bedaedf6294415197b267d4ef678fea336dd78ee2a6d2f4b028e9d07be3", size = 154212, upload_time = "2025-02-15T05:16:56.318Z" }, - { url = "https://files.pythonhosted.org/packages/fa/7a/e3132d454977d75a3bf9a6d541d730f76462ebf42a96fea2621498166f41/simplejson-3.20.1-cp312-cp312-win32.whl", hash = "sha256:339f407373325a36b7fd744b688ba5bae0666b5d340ec6d98aebc3014bf3d8ea", size = 74101, upload_time = "2025-02-15T05:16:57.746Z" }, - { url = "https://files.pythonhosted.org/packages/bc/5d/4e243e937fa3560107c69f6f7c2eed8589163f5ed14324e864871daa2dd9/simplejson-3.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:627d4486a1ea7edf1f66bb044ace1ce6b4c1698acd1b05353c97ba4864ea2e17", size = 75736, upload_time = "2025-02-15T05:16:59.017Z" }, - { url = "https://files.pythonhosted.org/packages/c4/03/0f453a27877cb5a5fff16a975925f4119102cc8552f52536b9a98ef0431e/simplejson-3.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:71e849e7ceb2178344998cbe5ade101f1b329460243c79c27fbfc51c0447a7c3", size = 93109, upload_time = "2025-02-15T05:17:00.377Z" }, - { url = "https://files.pythonhosted.org/packages/74/1f/a729f4026850cabeaff23e134646c3f455e86925d2533463420635ae54de/simplejson-3.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b63fdbab29dc3868d6f009a59797cefaba315fd43cd32ddd998ee1da28e50e29", size = 75475, upload_time = "2025-02-15T05:17:02.544Z" }, - { url = "https://files.pythonhosted.org/packages/e2/14/50a2713fee8ff1f8d655b1a14f4a0f1c0c7246768a1b3b3d12964a4ed5aa/simplejson-3.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1190f9a3ce644fd50ec277ac4a98c0517f532cfebdcc4bd975c0979a9f05e1fb", size = 75112, upload_time = "2025-02-15T05:17:03.875Z" }, - { url = "https://files.pythonhosted.org/packages/45/86/ea9835abb646755140e2d482edc9bc1e91997ed19a59fd77ae4c6a0facea/simplejson-3.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1336ba7bcb722ad487cd265701ff0583c0bb6de638364ca947bb84ecc0015d1", size = 150245, upload_time = "2025-02-15T05:17:06.899Z" }, - { url = "https://files.pythonhosted.org/packages/12/b4/53084809faede45da829fe571c65fbda8479d2a5b9c633f46b74124d56f5/simplejson-3.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e975aac6a5acd8b510eba58d5591e10a03e3d16c1cf8a8624ca177491f7230f0", size = 158465, upload_time = "2025-02-15T05:17:08.707Z" }, - { url = "https://files.pythonhosted.org/packages/a9/7d/d56579468d1660b3841e1f21c14490d103e33cf911886b22652d6e9683ec/simplejson-3.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a6dd11ee282937ad749da6f3b8d87952ad585b26e5edfa10da3ae2536c73078", size = 148514, upload_time = "2025-02-15T05:17:11.323Z" }, - { url = "https://files.pythonhosted.org/packages/19/e3/874b1cca3d3897b486d3afdccc475eb3a09815bf1015b01cf7fcb52a55f0/simplejson-3.20.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab980fcc446ab87ea0879edad41a5c28f2d86020014eb035cf5161e8de4474c6", size = 152262, upload_time = "2025-02-15T05:17:13.543Z" }, - { url = "https://files.pythonhosted.org/packages/32/84/f0fdb3625292d945c2bd13a814584603aebdb38cfbe5fe9be6b46fe598c4/simplejson-3.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f5aee2a4cb6b146bd17333ac623610f069f34e8f31d2f4f0c1a2186e50c594f0", size = 150164, upload_time = "2025-02-15T05:17:15.021Z" }, - { url = "https://files.pythonhosted.org/packages/95/51/6d625247224f01eaaeabace9aec75ac5603a42f8ebcce02c486fbda8b428/simplejson-3.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:652d8eecbb9a3b6461b21ec7cf11fd0acbab144e45e600c817ecf18e4580b99e", size = 151795, upload_time = "2025-02-15T05:17:16.542Z" }, - { url = "https://files.pythonhosted.org/packages/7f/d9/bb921df6b35be8412f519e58e86d1060fddf3ad401b783e4862e0a74c4c1/simplejson-3.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8c09948f1a486a89251ee3a67c9f8c969b379f6ffff1a6064b41fea3bce0a112", size = 159027, upload_time = "2025-02-15T05:17:18.083Z" }, - { url = "https://files.pythonhosted.org/packages/03/c5/5950605e4ad023a6621cf4c931b29fd3d2a9c1f36be937230bfc83d7271d/simplejson-3.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cbbd7b215ad4fc6f058b5dd4c26ee5c59f72e031dfda3ac183d7968a99e4ca3a", size = 154380, upload_time = "2025-02-15T05:17:20.334Z" }, - { url = "https://files.pythonhosted.org/packages/66/ad/b74149557c5ec1e4e4d55758bda426f5d2ec0123cd01a53ae63b8de51fa3/simplejson-3.20.1-cp313-cp313-win32.whl", hash = "sha256:ae81e482476eaa088ef9d0120ae5345de924f23962c0c1e20abbdff597631f87", size = 74102, upload_time = "2025-02-15T05:17:22.475Z" }, - { url = "https://files.pythonhosted.org/packages/db/a9/25282fdd24493e1022f30b7f5cdf804255c007218b2bfaa655bd7ad34b2d/simplejson-3.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:1b9fd15853b90aec3b1739f4471efbf1ac05066a2c7041bf8db821bb73cd2ddc", size = 75736, upload_time = "2025-02-15T05:17:24.122Z" }, - { url = "https://files.pythonhosted.org/packages/4b/30/00f02a0a921556dd5a6db1ef2926a1bc7a8bbbfb1c49cfed68a275b8ab2b/simplejson-3.20.1-py3-none-any.whl", hash = "sha256:8a6c1bbac39fa4a79f83cbf1df6ccd8ff7069582a9fd8db1e52cea073bc2c697", size = 57121, upload_time = "2025-02-15T05:18:51.243Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/af/92/51b417685abd96b31308b61b9acce7ec50d8e1de8fbc39a7fd4962c60689/simplejson-3.20.1.tar.gz", hash = "sha256:e64139b4ec4f1f24c142ff7dcafe55a22b811a74d86d66560c8815687143037d", size = 85591, upload-time = "2025-02-15T05:18:53.15Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/59/74bc90d1c051bc2432c96b34bd4e8036875ab58b4fcbe4d6a5a76985f853/simplejson-3.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:325b8c107253d3217e89d7b50c71015b5b31e2433e6c5bf38967b2f80630a8ca", size = 92132, upload-time = "2025-02-15T05:16:15.743Z" }, + { url = "https://files.pythonhosted.org/packages/71/c7/1970916e0c51794fff89f76da2f632aaf0b259b87753c88a8c409623d3e1/simplejson-3.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88a7baa8211089b9e58d78fbc1b0b322103f3f3d459ff16f03a36cece0d0fcf0", size = 74956, upload-time = "2025-02-15T05:16:17.062Z" }, + { url = "https://files.pythonhosted.org/packages/c8/0d/98cc5909180463f1d75fac7180de62d4cdb4e82c4fef276b9e591979372c/simplejson-3.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:299b1007b8101d50d95bc0db1bf5c38dc372e85b504cf77f596462083ee77e3f", size = 74772, upload-time = "2025-02-15T05:16:19.204Z" }, + { url = "https://files.pythonhosted.org/packages/e1/94/a30a5211a90d67725a3e8fcc1c788189f2ae2ed2b96b63ed15d0b7f5d6bb/simplejson-3.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ec618ed65caab48e81e3ed29586236a8e57daef792f1f3bb59504a7e98cd10", size = 143575, upload-time = "2025-02-15T05:16:21.337Z" }, + { url = "https://files.pythonhosted.org/packages/ee/08/cdb6821f1058eb5db46d252de69ff7e6c53f05f1bae6368fe20d5b51d37e/simplejson-3.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2cdead1d3197f0ff43373cf4730213420523ba48697743e135e26f3d179f38", size = 153241, upload-time = "2025-02-15T05:16:22.859Z" }, + { url = "https://files.pythonhosted.org/packages/4c/2d/ca3caeea0bdc5efc5503d5f57a2dfb56804898fb196dfada121323ee0ccb/simplejson-3.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3466d2839fdc83e1af42e07b90bc8ff361c4e8796cd66722a40ba14e458faddd", size = 141500, upload-time = "2025-02-15T05:16:25.068Z" }, + { url = "https://files.pythonhosted.org/packages/e1/33/d3e0779d5c58245e7370c98eb969275af6b7a4a5aec3b97cbf85f09ad328/simplejson-3.20.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d492ed8e92f3a9f9be829205f44b1d0a89af6582f0cf43e0d129fa477b93fe0c", size = 144757, upload-time = "2025-02-15T05:16:28.301Z" }, + { url = "https://files.pythonhosted.org/packages/54/53/2d93128bb55861b2fa36c5944f38da51a0bc6d83e513afc6f7838440dd15/simplejson-3.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f924b485537b640dc69434565463fd6fc0c68c65a8c6e01a823dd26c9983cf79", size = 144409, upload-time = "2025-02-15T05:16:29.687Z" }, + { url = "https://files.pythonhosted.org/packages/99/4c/dac310a98f897ad3435b4bdc836d92e78f09e38c5dbf28211ed21dc59fa2/simplejson-3.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e8eacf6a3491bf76ea91a8d46726368a6be0eb94993f60b8583550baae9439e", size = 146082, upload-time = "2025-02-15T05:16:31.064Z" }, + { url = "https://files.pythonhosted.org/packages/ee/22/d7ba958cfed39827335b82656b1c46f89678faecda9a7677b47e87b48ee6/simplejson-3.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d04bf90b4cea7c22d8b19091633908f14a096caa301b24c2f3d85b5068fb8", size = 154339, upload-time = "2025-02-15T05:16:32.719Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c8/b072b741129406a7086a0799c6f5d13096231bf35fdd87a0cffa789687fc/simplejson-3.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:69dd28d4ce38390ea4aaf212902712c0fd1093dc4c1ff67e09687c3c3e15a749", size = 147915, upload-time = "2025-02-15T05:16:34.291Z" }, + { url = "https://files.pythonhosted.org/packages/6c/46/8347e61e9cf3db5342a42f7fd30a81b4f5cf85977f916852d7674a540907/simplejson-3.20.1-cp311-cp311-win32.whl", hash = "sha256:dfe7a9da5fd2a3499436cd350f31539e0a6ded5da6b5b3d422df016444d65e43", size = 73972, upload-time = "2025-02-15T05:16:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/01/85/b52f24859237b4e9d523d5655796d911ba3d46e242eb1959c45b6af5aedd/simplejson-3.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:896a6c04d7861d507d800da7642479c3547060bf97419d9ef73d98ced8258766", size = 75595, upload-time = "2025-02-15T05:16:36.957Z" }, + { url = "https://files.pythonhosted.org/packages/8d/eb/34c16a1ac9ba265d024dc977ad84e1659d931c0a700967c3e59a98ed7514/simplejson-3.20.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f31c4a3a7ab18467ee73a27f3e59158255d1520f3aad74315edde7a940f1be23", size = 93100, upload-time = "2025-02-15T05:16:38.801Z" }, + { url = "https://files.pythonhosted.org/packages/41/fc/2c2c007d135894971e6814e7c0806936e5bade28f8db4dd7e2a58b50debd/simplejson-3.20.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:884e6183d16b725e113b83a6fc0230152ab6627d4d36cb05c89c2c5bccfa7bc6", size = 75464, upload-time = "2025-02-15T05:16:40.905Z" }, + { url = "https://files.pythonhosted.org/packages/0f/05/2b5ecb33b776c34bb5cace5de5d7669f9b60e3ca13c113037b2ca86edfbd/simplejson-3.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03d7a426e416fe0d3337115f04164cd9427eb4256e843a6b8751cacf70abc832", size = 75112, upload-time = "2025-02-15T05:16:42.246Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/1f3609a2792f06cd4b71030485f78e91eb09cfd57bebf3116bf2980a8bac/simplejson-3.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:000602141d0bddfcff60ea6a6e97d5e10c9db6b17fd2d6c66199fa481b6214bb", size = 150182, upload-time = "2025-02-15T05:16:43.557Z" }, + { url = "https://files.pythonhosted.org/packages/2f/b0/053fbda38b8b602a77a4f7829def1b4f316cd8deb5440a6d3ee90790d2a4/simplejson-3.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af8377a8af78226e82e3a4349efdde59ffa421ae88be67e18cef915e4023a595", size = 158363, upload-time = "2025-02-15T05:16:45.748Z" }, + { url = "https://files.pythonhosted.org/packages/d1/4b/2eb84ae867539a80822e92f9be4a7200dffba609275faf99b24141839110/simplejson-3.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15c7de4c88ab2fbcb8781a3b982ef883696736134e20b1210bca43fb42ff1acf", size = 148415, upload-time = "2025-02-15T05:16:47.861Z" }, + { url = "https://files.pythonhosted.org/packages/e0/bd/400b0bd372a5666addf2540c7358bfc3841b9ce5cdbc5cc4ad2f61627ad8/simplejson-3.20.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:455a882ff3f97d810709f7b620007d4e0aca8da71d06fc5c18ba11daf1c4df49", size = 152213, upload-time = "2025-02-15T05:16:49.25Z" }, + { url = "https://files.pythonhosted.org/packages/50/12/143f447bf6a827ee9472693768dc1a5eb96154f8feb140a88ce6973a3cfa/simplejson-3.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc0f523ce923e7f38eb67804bc80e0a028c76d7868500aa3f59225574b5d0453", size = 150048, upload-time = "2025-02-15T05:16:51.5Z" }, + { url = "https://files.pythonhosted.org/packages/5e/ea/dd9b3e8e8ed710a66f24a22c16a907c9b539b6f5f45fd8586bd5c231444e/simplejson-3.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76461ec929282dde4a08061071a47281ad939d0202dc4e63cdd135844e162fbc", size = 151668, upload-time = "2025-02-15T05:16:53Z" }, + { url = "https://files.pythonhosted.org/packages/99/af/ee52a8045426a0c5b89d755a5a70cc821815ef3c333b56fbcad33c4435c0/simplejson-3.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19c2da8c043607bde4d4ef3a6b633e668a7d2e3d56f40a476a74c5ea71949f", size = 158840, upload-time = "2025-02-15T05:16:54.851Z" }, + { url = "https://files.pythonhosted.org/packages/68/db/ab32869acea6b5de7d75fa0dac07a112ded795d41eaa7e66c7813b17be95/simplejson-3.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b2578bedaedf6294415197b267d4ef678fea336dd78ee2a6d2f4b028e9d07be3", size = 154212, upload-time = "2025-02-15T05:16:56.318Z" }, + { url = "https://files.pythonhosted.org/packages/fa/7a/e3132d454977d75a3bf9a6d541d730f76462ebf42a96fea2621498166f41/simplejson-3.20.1-cp312-cp312-win32.whl", hash = "sha256:339f407373325a36b7fd744b688ba5bae0666b5d340ec6d98aebc3014bf3d8ea", size = 74101, upload-time = "2025-02-15T05:16:57.746Z" }, + { url = "https://files.pythonhosted.org/packages/bc/5d/4e243e937fa3560107c69f6f7c2eed8589163f5ed14324e864871daa2dd9/simplejson-3.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:627d4486a1ea7edf1f66bb044ace1ce6b4c1698acd1b05353c97ba4864ea2e17", size = 75736, upload-time = "2025-02-15T05:16:59.017Z" }, + { url = "https://files.pythonhosted.org/packages/c4/03/0f453a27877cb5a5fff16a975925f4119102cc8552f52536b9a98ef0431e/simplejson-3.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:71e849e7ceb2178344998cbe5ade101f1b329460243c79c27fbfc51c0447a7c3", size = 93109, upload-time = "2025-02-15T05:17:00.377Z" }, + { url = "https://files.pythonhosted.org/packages/74/1f/a729f4026850cabeaff23e134646c3f455e86925d2533463420635ae54de/simplejson-3.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b63fdbab29dc3868d6f009a59797cefaba315fd43cd32ddd998ee1da28e50e29", size = 75475, upload-time = "2025-02-15T05:17:02.544Z" }, + { url = "https://files.pythonhosted.org/packages/e2/14/50a2713fee8ff1f8d655b1a14f4a0f1c0c7246768a1b3b3d12964a4ed5aa/simplejson-3.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1190f9a3ce644fd50ec277ac4a98c0517f532cfebdcc4bd975c0979a9f05e1fb", size = 75112, upload-time = "2025-02-15T05:17:03.875Z" }, + { url = "https://files.pythonhosted.org/packages/45/86/ea9835abb646755140e2d482edc9bc1e91997ed19a59fd77ae4c6a0facea/simplejson-3.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1336ba7bcb722ad487cd265701ff0583c0bb6de638364ca947bb84ecc0015d1", size = 150245, upload-time = "2025-02-15T05:17:06.899Z" }, + { url = "https://files.pythonhosted.org/packages/12/b4/53084809faede45da829fe571c65fbda8479d2a5b9c633f46b74124d56f5/simplejson-3.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e975aac6a5acd8b510eba58d5591e10a03e3d16c1cf8a8624ca177491f7230f0", size = 158465, upload-time = "2025-02-15T05:17:08.707Z" }, + { url = "https://files.pythonhosted.org/packages/a9/7d/d56579468d1660b3841e1f21c14490d103e33cf911886b22652d6e9683ec/simplejson-3.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a6dd11ee282937ad749da6f3b8d87952ad585b26e5edfa10da3ae2536c73078", size = 148514, upload-time = "2025-02-15T05:17:11.323Z" }, + { url = "https://files.pythonhosted.org/packages/19/e3/874b1cca3d3897b486d3afdccc475eb3a09815bf1015b01cf7fcb52a55f0/simplejson-3.20.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab980fcc446ab87ea0879edad41a5c28f2d86020014eb035cf5161e8de4474c6", size = 152262, upload-time = "2025-02-15T05:17:13.543Z" }, + { url = "https://files.pythonhosted.org/packages/32/84/f0fdb3625292d945c2bd13a814584603aebdb38cfbe5fe9be6b46fe598c4/simplejson-3.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f5aee2a4cb6b146bd17333ac623610f069f34e8f31d2f4f0c1a2186e50c594f0", size = 150164, upload-time = "2025-02-15T05:17:15.021Z" }, + { url = "https://files.pythonhosted.org/packages/95/51/6d625247224f01eaaeabace9aec75ac5603a42f8ebcce02c486fbda8b428/simplejson-3.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:652d8eecbb9a3b6461b21ec7cf11fd0acbab144e45e600c817ecf18e4580b99e", size = 151795, upload-time = "2025-02-15T05:17:16.542Z" }, + { url = "https://files.pythonhosted.org/packages/7f/d9/bb921df6b35be8412f519e58e86d1060fddf3ad401b783e4862e0a74c4c1/simplejson-3.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8c09948f1a486a89251ee3a67c9f8c969b379f6ffff1a6064b41fea3bce0a112", size = 159027, upload-time = "2025-02-15T05:17:18.083Z" }, + { url = "https://files.pythonhosted.org/packages/03/c5/5950605e4ad023a6621cf4c931b29fd3d2a9c1f36be937230bfc83d7271d/simplejson-3.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cbbd7b215ad4fc6f058b5dd4c26ee5c59f72e031dfda3ac183d7968a99e4ca3a", size = 154380, upload-time = "2025-02-15T05:17:20.334Z" }, + { url = "https://files.pythonhosted.org/packages/66/ad/b74149557c5ec1e4e4d55758bda426f5d2ec0123cd01a53ae63b8de51fa3/simplejson-3.20.1-cp313-cp313-win32.whl", hash = "sha256:ae81e482476eaa088ef9d0120ae5345de924f23962c0c1e20abbdff597631f87", size = 74102, upload-time = "2025-02-15T05:17:22.475Z" }, + { url = "https://files.pythonhosted.org/packages/db/a9/25282fdd24493e1022f30b7f5cdf804255c007218b2bfaa655bd7ad34b2d/simplejson-3.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:1b9fd15853b90aec3b1739f4471efbf1ac05066a2c7041bf8db821bb73cd2ddc", size = 75736, upload-time = "2025-02-15T05:17:24.122Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/00f02a0a921556dd5a6db1ef2926a1bc7a8bbbfb1c49cfed68a275b8ab2b/simplejson-3.20.1-py3-none-any.whl", hash = "sha256:8a6c1bbac39fa4a79f83cbf1df6ccd8ff7069582a9fd8db1e52cea073bc2c697", size = 57121, upload-time = "2025-02-15T05:18:51.243Z" }, ] [[package]] name = "six" version = "1.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload_time = "2024-12-04T17:35:28.174Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload_time = "2024-12-04T17:35:26.475Z" }, + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] [[package]] name = "sniffio" version = "1.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload_time = "2024-02-25T23:20:04.057Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload_time = "2024-02-25T23:20:01.196Z" }, + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] [[package]] name = "soupsieve" version = "2.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload_time = "2025-04-20T18:50:08.518Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload-time = "2025-04-20T18:50:08.518Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload_time = "2025-04-20T18:50:07.196Z" }, + { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload-time = "2025-04-20T18:50:07.196Z" }, ] [[package]] @@ -2052,33 +2066,33 @@ dependencies = [ { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/c3/3f2bfa5e4dcd9938405fe2fab5b6ab94a9248a4f9536ea2fd497da20525f/sqlalchemy-2.0.40.tar.gz", hash = "sha256:d827099289c64589418ebbcaead0145cd19f4e3e8a93919a0100247af245fa00", size = 9664299, upload_time = "2025-03-27T17:52:31.876Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/77/7e/55044a9ec48c3249bb38d5faae93f09579c35e862bb318ebd1ed7a1994a5/sqlalchemy-2.0.40-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f6bacab7514de6146a1976bc56e1545bee247242fab030b89e5f70336fc0003e", size = 2114025, upload_time = "2025-03-27T18:49:29.456Z" }, - { url = "https://files.pythonhosted.org/packages/77/0f/dcf7bba95f847aec72f638750747b12d37914f71c8cc7c133cf326ab945c/sqlalchemy-2.0.40-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5654d1ac34e922b6c5711631f2da497d3a7bffd6f9f87ac23b35feea56098011", size = 2104419, upload_time = "2025-03-27T18:49:30.75Z" }, - { url = "https://files.pythonhosted.org/packages/75/70/c86a5c20715e4fe903dde4c2fd44fc7e7a0d5fb52c1b954d98526f65a3ea/sqlalchemy-2.0.40-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35904d63412db21088739510216e9349e335f142ce4a04b69e2528020ee19ed4", size = 3222720, upload_time = "2025-03-27T18:44:29.871Z" }, - { url = "https://files.pythonhosted.org/packages/12/cf/b891a8c1d0c27ce9163361664c2128c7a57de3f35000ea5202eb3a2917b7/sqlalchemy-2.0.40-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c7a80ed86d6aaacb8160a1caef6680d4ddd03c944d985aecee940d168c411d1", size = 3222682, upload_time = "2025-03-27T18:55:20.097Z" }, - { url = "https://files.pythonhosted.org/packages/15/3f/7709d8c8266953d945435a96b7f425ae4172a336963756b58e996fbef7f3/sqlalchemy-2.0.40-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:519624685a51525ddaa7d8ba8265a1540442a2ec71476f0e75241eb8263d6f51", size = 3159542, upload_time = "2025-03-27T18:44:31.333Z" }, - { url = "https://files.pythonhosted.org/packages/85/7e/717eaabaf0f80a0132dc2032ea8f745b7a0914451c984821a7c8737fb75a/sqlalchemy-2.0.40-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2ee5f9999a5b0e9689bed96e60ee53c3384f1a05c2dd8068cc2e8361b0df5b7a", size = 3179864, upload_time = "2025-03-27T18:55:21.784Z" }, - { url = "https://files.pythonhosted.org/packages/e4/cc/03eb5dfcdb575cbecd2bd82487b9848f250a4b6ecfb4707e834b4ce4ec07/sqlalchemy-2.0.40-cp311-cp311-win32.whl", hash = "sha256:c0cae71e20e3c02c52f6b9e9722bca70e4a90a466d59477822739dc31ac18b4b", size = 2084675, upload_time = "2025-03-27T18:48:55.915Z" }, - { url = "https://files.pythonhosted.org/packages/9a/48/440946bf9dc4dc231f4f31ef0d316f7135bf41d4b86aaba0c0655150d370/sqlalchemy-2.0.40-cp311-cp311-win_amd64.whl", hash = "sha256:574aea2c54d8f1dd1699449f332c7d9b71c339e04ae50163a3eb5ce4c4325ee4", size = 2110099, upload_time = "2025-03-27T18:48:57.45Z" }, - { url = "https://files.pythonhosted.org/packages/92/06/552c1f92e880b57d8b92ce6619bd569b25cead492389b1d84904b55989d8/sqlalchemy-2.0.40-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9d3b31d0a1c44b74d3ae27a3de422dfccd2b8f0b75e51ecb2faa2bf65ab1ba0d", size = 2112620, upload_time = "2025-03-27T18:40:00.071Z" }, - { url = "https://files.pythonhosted.org/packages/01/72/a5bc6e76c34cebc071f758161dbe1453de8815ae6e662393910d3be6d70d/sqlalchemy-2.0.40-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:37f7a0f506cf78c80450ed1e816978643d3969f99c4ac6b01104a6fe95c5490a", size = 2103004, upload_time = "2025-03-27T18:40:04.204Z" }, - { url = "https://files.pythonhosted.org/packages/bf/fd/0e96c8e6767618ed1a06e4d7a167fe13734c2f8113c4cb704443e6783038/sqlalchemy-2.0.40-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bb933a650323e476a2e4fbef8997a10d0003d4da996aad3fd7873e962fdde4d", size = 3252440, upload_time = "2025-03-27T18:51:25.624Z" }, - { url = "https://files.pythonhosted.org/packages/cd/6a/eb82e45b15a64266a2917a6833b51a334ea3c1991728fd905bfccbf5cf63/sqlalchemy-2.0.40-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6959738971b4745eea16f818a2cd086fb35081383b078272c35ece2b07012716", size = 3263277, upload_time = "2025-03-27T18:50:28.142Z" }, - { url = "https://files.pythonhosted.org/packages/45/97/ebe41ab4530f50af99e3995ebd4e0204bf1b0dc0930f32250dde19c389fe/sqlalchemy-2.0.40-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:110179728e442dae85dd39591beb74072ae4ad55a44eda2acc6ec98ead80d5f2", size = 3198591, upload_time = "2025-03-27T18:51:27.543Z" }, - { url = "https://files.pythonhosted.org/packages/e6/1c/a569c1b2b2f5ac20ba6846a1321a2bf52e9a4061001f282bf1c5528dcd69/sqlalchemy-2.0.40-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8040680eaacdce4d635f12c55c714f3d4c7f57da2bc47a01229d115bd319191", size = 3225199, upload_time = "2025-03-27T18:50:30.069Z" }, - { url = "https://files.pythonhosted.org/packages/8f/91/87cc71a6b10065ca0209d19a4bb575378abda6085e72fa0b61ffb2201b84/sqlalchemy-2.0.40-cp312-cp312-win32.whl", hash = "sha256:650490653b110905c10adac69408380688cefc1f536a137d0d69aca1069dc1d1", size = 2082959, upload_time = "2025-03-27T18:45:57.574Z" }, - { url = "https://files.pythonhosted.org/packages/2a/9f/14c511cda174aa1ad9b0e42b64ff5a71db35d08b0d80dc044dae958921e5/sqlalchemy-2.0.40-cp312-cp312-win_amd64.whl", hash = "sha256:2be94d75ee06548d2fc591a3513422b873490efb124048f50556369a834853b0", size = 2108526, upload_time = "2025-03-27T18:45:58.965Z" }, - { url = "https://files.pythonhosted.org/packages/8c/18/4e3a86cc0232377bc48c373a9ba6a1b3fb79ba32dbb4eda0b357f5a2c59d/sqlalchemy-2.0.40-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:915866fd50dd868fdcc18d61d8258db1bf9ed7fbd6dfec960ba43365952f3b01", size = 2107887, upload_time = "2025-03-27T18:40:05.461Z" }, - { url = "https://files.pythonhosted.org/packages/cb/60/9fa692b1d2ffc4cbd5f47753731fd332afed30137115d862d6e9a1e962c7/sqlalchemy-2.0.40-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a4c5a2905a9ccdc67a8963e24abd2f7afcd4348829412483695c59e0af9a705", size = 2098367, upload_time = "2025-03-27T18:40:07.182Z" }, - { url = "https://files.pythonhosted.org/packages/4c/9f/84b78357ca641714a439eb3fbbddb17297dacfa05d951dbf24f28d7b5c08/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55028d7a3ebdf7ace492fab9895cbc5270153f75442a0472d8516e03159ab364", size = 3184806, upload_time = "2025-03-27T18:51:29.356Z" }, - { url = "https://files.pythonhosted.org/packages/4b/7d/e06164161b6bfce04c01bfa01518a20cccbd4100d5c951e5a7422189191a/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cfedff6878b0e0d1d0a50666a817ecd85051d12d56b43d9d425455e608b5ba0", size = 3198131, upload_time = "2025-03-27T18:50:31.616Z" }, - { url = "https://files.pythonhosted.org/packages/6d/51/354af20da42d7ec7b5c9de99edafbb7663a1d75686d1999ceb2c15811302/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bb19e30fdae77d357ce92192a3504579abe48a66877f476880238a962e5b96db", size = 3131364, upload_time = "2025-03-27T18:51:31.336Z" }, - { url = "https://files.pythonhosted.org/packages/7a/2f/48a41ff4e6e10549d83fcc551ab85c268bde7c03cf77afb36303c6594d11/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:16d325ea898f74b26ffcd1cf8c593b0beed8714f0317df2bed0d8d1de05a8f26", size = 3159482, upload_time = "2025-03-27T18:50:33.201Z" }, - { url = "https://files.pythonhosted.org/packages/33/ac/e5e0a807163652a35be878c0ad5cfd8b1d29605edcadfb5df3c512cdf9f3/sqlalchemy-2.0.40-cp313-cp313-win32.whl", hash = "sha256:a669cbe5be3c63f75bcbee0b266779706f1a54bcb1000f302685b87d1b8c1500", size = 2080704, upload_time = "2025-03-27T18:46:00.193Z" }, - { url = "https://files.pythonhosted.org/packages/1c/cb/f38c61f7f2fd4d10494c1c135ff6a6ddb63508d0b47bccccd93670637309/sqlalchemy-2.0.40-cp313-cp313-win_amd64.whl", hash = "sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad", size = 2104564, upload_time = "2025-03-27T18:46:01.442Z" }, - { url = "https://files.pythonhosted.org/packages/d1/7c/5fc8e802e7506fe8b55a03a2e1dab156eae205c91bee46305755e086d2e2/sqlalchemy-2.0.40-py3-none-any.whl", hash = "sha256:32587e2e1e359276957e6fe5dad089758bc042a971a8a09ae8ecf7a8fe23d07a", size = 1903894, upload_time = "2025-03-27T18:40:43.796Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/68/c3/3f2bfa5e4dcd9938405fe2fab5b6ab94a9248a4f9536ea2fd497da20525f/sqlalchemy-2.0.40.tar.gz", hash = "sha256:d827099289c64589418ebbcaead0145cd19f4e3e8a93919a0100247af245fa00", size = 9664299, upload-time = "2025-03-27T17:52:31.876Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/7e/55044a9ec48c3249bb38d5faae93f09579c35e862bb318ebd1ed7a1994a5/sqlalchemy-2.0.40-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f6bacab7514de6146a1976bc56e1545bee247242fab030b89e5f70336fc0003e", size = 2114025, upload-time = "2025-03-27T18:49:29.456Z" }, + { url = "https://files.pythonhosted.org/packages/77/0f/dcf7bba95f847aec72f638750747b12d37914f71c8cc7c133cf326ab945c/sqlalchemy-2.0.40-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5654d1ac34e922b6c5711631f2da497d3a7bffd6f9f87ac23b35feea56098011", size = 2104419, upload-time = "2025-03-27T18:49:30.75Z" }, + { url = "https://files.pythonhosted.org/packages/75/70/c86a5c20715e4fe903dde4c2fd44fc7e7a0d5fb52c1b954d98526f65a3ea/sqlalchemy-2.0.40-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35904d63412db21088739510216e9349e335f142ce4a04b69e2528020ee19ed4", size = 3222720, upload-time = "2025-03-27T18:44:29.871Z" }, + { url = "https://files.pythonhosted.org/packages/12/cf/b891a8c1d0c27ce9163361664c2128c7a57de3f35000ea5202eb3a2917b7/sqlalchemy-2.0.40-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c7a80ed86d6aaacb8160a1caef6680d4ddd03c944d985aecee940d168c411d1", size = 3222682, upload-time = "2025-03-27T18:55:20.097Z" }, + { url = "https://files.pythonhosted.org/packages/15/3f/7709d8c8266953d945435a96b7f425ae4172a336963756b58e996fbef7f3/sqlalchemy-2.0.40-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:519624685a51525ddaa7d8ba8265a1540442a2ec71476f0e75241eb8263d6f51", size = 3159542, upload-time = "2025-03-27T18:44:31.333Z" }, + { url = "https://files.pythonhosted.org/packages/85/7e/717eaabaf0f80a0132dc2032ea8f745b7a0914451c984821a7c8737fb75a/sqlalchemy-2.0.40-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2ee5f9999a5b0e9689bed96e60ee53c3384f1a05c2dd8068cc2e8361b0df5b7a", size = 3179864, upload-time = "2025-03-27T18:55:21.784Z" }, + { url = "https://files.pythonhosted.org/packages/e4/cc/03eb5dfcdb575cbecd2bd82487b9848f250a4b6ecfb4707e834b4ce4ec07/sqlalchemy-2.0.40-cp311-cp311-win32.whl", hash = "sha256:c0cae71e20e3c02c52f6b9e9722bca70e4a90a466d59477822739dc31ac18b4b", size = 2084675, upload-time = "2025-03-27T18:48:55.915Z" }, + { url = "https://files.pythonhosted.org/packages/9a/48/440946bf9dc4dc231f4f31ef0d316f7135bf41d4b86aaba0c0655150d370/sqlalchemy-2.0.40-cp311-cp311-win_amd64.whl", hash = "sha256:574aea2c54d8f1dd1699449f332c7d9b71c339e04ae50163a3eb5ce4c4325ee4", size = 2110099, upload-time = "2025-03-27T18:48:57.45Z" }, + { url = "https://files.pythonhosted.org/packages/92/06/552c1f92e880b57d8b92ce6619bd569b25cead492389b1d84904b55989d8/sqlalchemy-2.0.40-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9d3b31d0a1c44b74d3ae27a3de422dfccd2b8f0b75e51ecb2faa2bf65ab1ba0d", size = 2112620, upload-time = "2025-03-27T18:40:00.071Z" }, + { url = "https://files.pythonhosted.org/packages/01/72/a5bc6e76c34cebc071f758161dbe1453de8815ae6e662393910d3be6d70d/sqlalchemy-2.0.40-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:37f7a0f506cf78c80450ed1e816978643d3969f99c4ac6b01104a6fe95c5490a", size = 2103004, upload-time = "2025-03-27T18:40:04.204Z" }, + { url = "https://files.pythonhosted.org/packages/bf/fd/0e96c8e6767618ed1a06e4d7a167fe13734c2f8113c4cb704443e6783038/sqlalchemy-2.0.40-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bb933a650323e476a2e4fbef8997a10d0003d4da996aad3fd7873e962fdde4d", size = 3252440, upload-time = "2025-03-27T18:51:25.624Z" }, + { url = "https://files.pythonhosted.org/packages/cd/6a/eb82e45b15a64266a2917a6833b51a334ea3c1991728fd905bfccbf5cf63/sqlalchemy-2.0.40-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6959738971b4745eea16f818a2cd086fb35081383b078272c35ece2b07012716", size = 3263277, upload-time = "2025-03-27T18:50:28.142Z" }, + { url = "https://files.pythonhosted.org/packages/45/97/ebe41ab4530f50af99e3995ebd4e0204bf1b0dc0930f32250dde19c389fe/sqlalchemy-2.0.40-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:110179728e442dae85dd39591beb74072ae4ad55a44eda2acc6ec98ead80d5f2", size = 3198591, upload-time = "2025-03-27T18:51:27.543Z" }, + { url = "https://files.pythonhosted.org/packages/e6/1c/a569c1b2b2f5ac20ba6846a1321a2bf52e9a4061001f282bf1c5528dcd69/sqlalchemy-2.0.40-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8040680eaacdce4d635f12c55c714f3d4c7f57da2bc47a01229d115bd319191", size = 3225199, upload-time = "2025-03-27T18:50:30.069Z" }, + { url = "https://files.pythonhosted.org/packages/8f/91/87cc71a6b10065ca0209d19a4bb575378abda6085e72fa0b61ffb2201b84/sqlalchemy-2.0.40-cp312-cp312-win32.whl", hash = "sha256:650490653b110905c10adac69408380688cefc1f536a137d0d69aca1069dc1d1", size = 2082959, upload-time = "2025-03-27T18:45:57.574Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/14c511cda174aa1ad9b0e42b64ff5a71db35d08b0d80dc044dae958921e5/sqlalchemy-2.0.40-cp312-cp312-win_amd64.whl", hash = "sha256:2be94d75ee06548d2fc591a3513422b873490efb124048f50556369a834853b0", size = 2108526, upload-time = "2025-03-27T18:45:58.965Z" }, + { url = "https://files.pythonhosted.org/packages/8c/18/4e3a86cc0232377bc48c373a9ba6a1b3fb79ba32dbb4eda0b357f5a2c59d/sqlalchemy-2.0.40-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:915866fd50dd868fdcc18d61d8258db1bf9ed7fbd6dfec960ba43365952f3b01", size = 2107887, upload-time = "2025-03-27T18:40:05.461Z" }, + { url = "https://files.pythonhosted.org/packages/cb/60/9fa692b1d2ffc4cbd5f47753731fd332afed30137115d862d6e9a1e962c7/sqlalchemy-2.0.40-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a4c5a2905a9ccdc67a8963e24abd2f7afcd4348829412483695c59e0af9a705", size = 2098367, upload-time = "2025-03-27T18:40:07.182Z" }, + { url = "https://files.pythonhosted.org/packages/4c/9f/84b78357ca641714a439eb3fbbddb17297dacfa05d951dbf24f28d7b5c08/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55028d7a3ebdf7ace492fab9895cbc5270153f75442a0472d8516e03159ab364", size = 3184806, upload-time = "2025-03-27T18:51:29.356Z" }, + { url = "https://files.pythonhosted.org/packages/4b/7d/e06164161b6bfce04c01bfa01518a20cccbd4100d5c951e5a7422189191a/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cfedff6878b0e0d1d0a50666a817ecd85051d12d56b43d9d425455e608b5ba0", size = 3198131, upload-time = "2025-03-27T18:50:31.616Z" }, + { url = "https://files.pythonhosted.org/packages/6d/51/354af20da42d7ec7b5c9de99edafbb7663a1d75686d1999ceb2c15811302/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bb19e30fdae77d357ce92192a3504579abe48a66877f476880238a962e5b96db", size = 3131364, upload-time = "2025-03-27T18:51:31.336Z" }, + { url = "https://files.pythonhosted.org/packages/7a/2f/48a41ff4e6e10549d83fcc551ab85c268bde7c03cf77afb36303c6594d11/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:16d325ea898f74b26ffcd1cf8c593b0beed8714f0317df2bed0d8d1de05a8f26", size = 3159482, upload-time = "2025-03-27T18:50:33.201Z" }, + { url = "https://files.pythonhosted.org/packages/33/ac/e5e0a807163652a35be878c0ad5cfd8b1d29605edcadfb5df3c512cdf9f3/sqlalchemy-2.0.40-cp313-cp313-win32.whl", hash = "sha256:a669cbe5be3c63f75bcbee0b266779706f1a54bcb1000f302685b87d1b8c1500", size = 2080704, upload-time = "2025-03-27T18:46:00.193Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cb/f38c61f7f2fd4d10494c1c135ff6a6ddb63508d0b47bccccd93670637309/sqlalchemy-2.0.40-cp313-cp313-win_amd64.whl", hash = "sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad", size = 2104564, upload-time = "2025-03-27T18:46:01.442Z" }, + { url = "https://files.pythonhosted.org/packages/d1/7c/5fc8e802e7506fe8b55a03a2e1dab156eae205c91bee46305755e086d2e2/sqlalchemy-2.0.40-py3-none-any.whl", hash = "sha256:32587e2e1e359276957e6fe5dad089758bc042a971a8a09ae8ecf7a8fe23d07a", size = 1903894, upload-time = "2025-03-27T18:40:43.796Z" }, ] [[package]] @@ -2088,18 +2102,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ff/fb/2984a686808b89a6781526129a4b51266f678b2d2b97ab2d325e56116df8/starlette-0.45.3.tar.gz", hash = "sha256:2cbcba2a75806f8a41c722141486f37c28e30a0921c5f6fe4346cb0dcee1302f", size = 2574076, upload_time = "2025-01-24T11:17:36.535Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/fb/2984a686808b89a6781526129a4b51266f678b2d2b97ab2d325e56116df8/starlette-0.45.3.tar.gz", hash = "sha256:2cbcba2a75806f8a41c722141486f37c28e30a0921c5f6fe4346cb0dcee1302f", size = 2574076, upload-time = "2025-01-24T11:17:36.535Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl", hash = "sha256:dfb6d332576f136ec740296c7e8bb8c8a7125044e7c6da30744718880cdd059d", size = 71507, upload_time = "2025-01-24T11:17:34.182Z" }, + { url = "https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl", hash = "sha256:dfb6d332576f136ec740296c7e8bb8c8a7125044e7c6da30744718880cdd059d", size = 71507, upload-time = "2025-01-24T11:17:34.182Z" }, ] [[package]] name = "text-unidecode" version = "1.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload_time = "2019-08-30T21:36:45.405Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload-time = "2019-08-30T21:36:45.405Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload_time = "2019-08-30T21:37:03.543Z" }, + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload-time = "2019-08-30T21:37:03.543Z" }, ] [[package]] @@ -2109,9 +2123,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload_time = "2024-11-24T20:12:22.481Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload_time = "2024-11-24T20:12:19.698Z" }, + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, ] [[package]] @@ -2124,18 +2138,18 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/1a/5f36851f439884bcfe8539f6a20ff7516e7b60f319bbaf69a90dc35cc2eb/typer-0.15.3.tar.gz", hash = "sha256:818873625d0569653438316567861899f7e9972f2e6e0c16dab608345ced713c", size = 101641, upload_time = "2025-04-28T21:40:59.204Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/1a/5f36851f439884bcfe8539f6a20ff7516e7b60f319bbaf69a90dc35cc2eb/typer-0.15.3.tar.gz", hash = "sha256:818873625d0569653438316567861899f7e9972f2e6e0c16dab608345ced713c", size = 101641, upload-time = "2025-04-28T21:40:59.204Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/20/9d953de6f4367163d23ec823200eb3ecb0050a2609691e512c8b95827a9b/typer-0.15.3-py3-none-any.whl", hash = "sha256:c86a65ad77ca531f03de08d1b9cb67cd09ad02ddddf4b34745b5008f43b239bd", size = 45253, upload_time = "2025-04-28T21:40:56.269Z" }, + { url = "https://files.pythonhosted.org/packages/48/20/9d953de6f4367163d23ec823200eb3ecb0050a2609691e512c8b95827a9b/typer-0.15.3-py3-none-any.whl", hash = "sha256:c86a65ad77ca531f03de08d1b9cb67cd09ad02ddddf4b34745b5008f43b239bd", size = 45253, upload-time = "2025-04-28T21:40:56.269Z" }, ] [[package]] name = "typing-extensions" version = "4.13.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload_time = "2025-04-10T14:19:05.416Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload_time = "2025-04-10T14:19:03.967Z" }, + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, ] [[package]] @@ -2145,18 +2159,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222, upload_time = "2025-02-25T17:27:59.638Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222, upload-time = "2025-02-25T17:27:59.638Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125, upload_time = "2025-02-25T17:27:57.754Z" }, + { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125, upload-time = "2025-02-25T17:27:57.754Z" }, ] [[package]] name = "tzdata" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload_time = "2025-03-23T13:54:43.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload_time = "2025-03-23T13:54:41.845Z" }, + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, ] [[package]] @@ -2166,27 +2180,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tzdata", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload_time = "2025-03-05T21:17:41.549Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload-time = "2025-03-05T21:17:41.549Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d", size = 18026, upload_time = "2025-03-05T21:17:39.857Z" }, + { url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d", size = 18026, upload-time = "2025-03-05T21:17:39.857Z" }, ] [[package]] name = "uritemplate" version = "4.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d2/5a/4742fdba39cd02a56226815abfa72fe0aa81c33bed16ed045647d6000eba/uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0", size = 273898, upload_time = "2021-10-13T11:15:14.84Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/5a/4742fdba39cd02a56226815abfa72fe0aa81c33bed16ed045647d6000eba/uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0", size = 273898, upload-time = "2021-10-13T11:15:14.84Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c0/7461b49cd25aeece13766f02ee576d1db528f1c37ce69aee300e075b485b/uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e", size = 10356, upload_time = "2021-10-13T11:15:12.316Z" }, + { url = "https://files.pythonhosted.org/packages/81/c0/7461b49cd25aeece13766f02ee576d1db528f1c37ce69aee300e075b485b/uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e", size = 10356, upload-time = "2021-10-13T11:15:12.316Z" }, ] [[package]] name = "urllib3" version = "1.26.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/e8/6ff5e6bc22095cfc59b6ea711b687e2b7ed4bdb373f7eeec370a97d7392f/urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32", size = 307380, upload_time = "2024-08-29T15:43:11.37Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/e8/6ff5e6bc22095cfc59b6ea711b687e2b7ed4bdb373f7eeec370a97d7392f/urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32", size = 307380, upload-time = "2024-08-29T15:43:11.37Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/cf/8435d5a7159e2a9c83a95896ed596f68cf798005fe107cc655b5c5c14704/urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e", size = 144225, upload_time = "2024-08-29T15:43:08.921Z" }, + { url = "https://files.pythonhosted.org/packages/33/cf/8435d5a7159e2a9c83a95896ed596f68cf798005fe107cc655b5c5c14704/urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e", size = 144225, upload-time = "2024-08-29T15:43:08.921Z" }, ] [[package]] @@ -2197,9 +2211,9 @@ dependencies = [ { name = "click" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815, upload_time = "2025-04-19T06:02:50.101Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815, upload-time = "2025-04-19T06:02:50.101Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483, upload_time = "2025-04-19T06:02:48.42Z" }, + { url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483, upload-time = "2025-04-19T06:02:48.42Z" }, ] [package.optional-dependencies] @@ -2217,26 +2231,26 @@ standard = [ name = "uvloop" version = "0.21.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741, upload_time = "2024-10-14T23:38:35.489Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/57/a7/4cf0334105c1160dd6819f3297f8700fda7fc30ab4f61fbf3e725acbc7cc/uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8", size = 1447410, upload_time = "2024-10-14T23:37:33.612Z" }, - { url = "https://files.pythonhosted.org/packages/8c/7c/1517b0bbc2dbe784b563d6ab54f2ef88c890fdad77232c98ed490aa07132/uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0", size = 805476, upload_time = "2024-10-14T23:37:36.11Z" }, - { url = "https://files.pythonhosted.org/packages/ee/ea/0bfae1aceb82a503f358d8d2fa126ca9dbdb2ba9c7866974faec1cb5875c/uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e", size = 3960855, upload_time = "2024-10-14T23:37:37.683Z" }, - { url = "https://files.pythonhosted.org/packages/8a/ca/0864176a649838b838f36d44bf31c451597ab363b60dc9e09c9630619d41/uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb", size = 3973185, upload_time = "2024-10-14T23:37:40.226Z" }, - { url = "https://files.pythonhosted.org/packages/30/bf/08ad29979a936d63787ba47a540de2132169f140d54aa25bc8c3df3e67f4/uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6", size = 3820256, upload_time = "2024-10-14T23:37:42.839Z" }, - { url = "https://files.pythonhosted.org/packages/da/e2/5cf6ef37e3daf2f06e651aae5ea108ad30df3cb269102678b61ebf1fdf42/uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d", size = 3937323, upload_time = "2024-10-14T23:37:45.337Z" }, - { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284, upload_time = "2024-10-14T23:37:47.833Z" }, - { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349, upload_time = "2024-10-14T23:37:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089, upload_time = "2024-10-14T23:37:51.703Z" }, - { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770, upload_time = "2024-10-14T23:37:54.122Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321, upload_time = "2024-10-14T23:37:55.766Z" }, - { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022, upload_time = "2024-10-14T23:37:58.195Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123, upload_time = "2024-10-14T23:38:00.688Z" }, - { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325, upload_time = "2024-10-14T23:38:02.309Z" }, - { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806, upload_time = "2024-10-14T23:38:04.711Z" }, - { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068, upload_time = "2024-10-14T23:38:06.385Z" }, - { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428, upload_time = "2024-10-14T23:38:08.416Z" }, - { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018, upload_time = "2024-10-14T23:38:10.888Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741, upload-time = "2024-10-14T23:38:35.489Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/a7/4cf0334105c1160dd6819f3297f8700fda7fc30ab4f61fbf3e725acbc7cc/uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8", size = 1447410, upload-time = "2024-10-14T23:37:33.612Z" }, + { url = "https://files.pythonhosted.org/packages/8c/7c/1517b0bbc2dbe784b563d6ab54f2ef88c890fdad77232c98ed490aa07132/uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0", size = 805476, upload-time = "2024-10-14T23:37:36.11Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ea/0bfae1aceb82a503f358d8d2fa126ca9dbdb2ba9c7866974faec1cb5875c/uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e", size = 3960855, upload-time = "2024-10-14T23:37:37.683Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ca/0864176a649838b838f36d44bf31c451597ab363b60dc9e09c9630619d41/uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb", size = 3973185, upload-time = "2024-10-14T23:37:40.226Z" }, + { url = "https://files.pythonhosted.org/packages/30/bf/08ad29979a936d63787ba47a540de2132169f140d54aa25bc8c3df3e67f4/uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6", size = 3820256, upload-time = "2024-10-14T23:37:42.839Z" }, + { url = "https://files.pythonhosted.org/packages/da/e2/5cf6ef37e3daf2f06e651aae5ea108ad30df3cb269102678b61ebf1fdf42/uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d", size = 3937323, upload-time = "2024-10-14T23:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284, upload-time = "2024-10-14T23:37:47.833Z" }, + { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349, upload-time = "2024-10-14T23:37:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089, upload-time = "2024-10-14T23:37:51.703Z" }, + { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770, upload-time = "2024-10-14T23:37:54.122Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321, upload-time = "2024-10-14T23:37:55.766Z" }, + { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022, upload-time = "2024-10-14T23:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123, upload-time = "2024-10-14T23:38:00.688Z" }, + { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325, upload-time = "2024-10-14T23:38:02.309Z" }, + { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806, upload-time = "2024-10-14T23:38:04.711Z" }, + { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068, upload-time = "2024-10-14T23:38:06.385Z" }, + { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428, upload-time = "2024-10-14T23:38:08.416Z" }, + { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018, upload-time = "2024-10-14T23:38:10.888Z" }, ] [[package]] @@ -2246,141 +2260,141 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/03/e2/8ed598c42057de7aa5d97c472254af4906ff0a59a66699d426fc9ef795d7/watchfiles-1.0.5.tar.gz", hash = "sha256:b7529b5dcc114679d43827d8c35a07c493ad6f083633d573d81c660abc5979e9", size = 94537, upload_time = "2025-04-08T10:36:26.722Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/39/f4/41b591f59021786ef517e1cdc3b510383551846703e03f204827854a96f8/watchfiles-1.0.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:237f9be419e977a0f8f6b2e7b0475ababe78ff1ab06822df95d914a945eac827", size = 405336, upload_time = "2025-04-08T10:34:59.359Z" }, - { url = "https://files.pythonhosted.org/packages/ae/06/93789c135be4d6d0e4f63e96eea56dc54050b243eacc28439a26482b5235/watchfiles-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0da39ff917af8b27a4bdc5a97ac577552a38aac0d260a859c1517ea3dc1a7c4", size = 395977, upload_time = "2025-04-08T10:35:00.522Z" }, - { url = "https://files.pythonhosted.org/packages/d2/db/1cd89bd83728ca37054512d4d35ab69b5f12b8aa2ac9be3b0276b3bf06cc/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfcb3952350e95603f232a7a15f6c5f86c5375e46f0bd4ae70d43e3e063c13d", size = 455232, upload_time = "2025-04-08T10:35:01.698Z" }, - { url = "https://files.pythonhosted.org/packages/40/90/d8a4d44ffe960517e487c9c04f77b06b8abf05eb680bed71c82b5f2cad62/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68b2dddba7a4e6151384e252a5632efcaa9bc5d1c4b567f3cb621306b2ca9f63", size = 459151, upload_time = "2025-04-08T10:35:03.358Z" }, - { url = "https://files.pythonhosted.org/packages/6c/da/267a1546f26465dead1719caaba3ce660657f83c9d9c052ba98fb8856e13/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95cf944fcfc394c5f9de794ce581914900f82ff1f855326f25ebcf24d5397418", size = 489054, upload_time = "2025-04-08T10:35:04.561Z" }, - { url = "https://files.pythonhosted.org/packages/b1/31/33850dfd5c6efb6f27d2465cc4c6b27c5a6f5ed53c6fa63b7263cf5f60f6/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf6cd9f83d7c023b1aba15d13f705ca7b7d38675c121f3cc4a6e25bd0857ee9", size = 523955, upload_time = "2025-04-08T10:35:05.786Z" }, - { url = "https://files.pythonhosted.org/packages/09/84/b7d7b67856efb183a421f1416b44ca975cb2ea6c4544827955dfb01f7dc2/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:852de68acd6212cd6d33edf21e6f9e56e5d98c6add46f48244bd479d97c967c6", size = 502234, upload_time = "2025-04-08T10:35:07.187Z" }, - { url = "https://files.pythonhosted.org/packages/71/87/6dc5ec6882a2254cfdd8b0718b684504e737273903b65d7338efaba08b52/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5730f3aa35e646103b53389d5bc77edfbf578ab6dab2e005142b5b80a35ef25", size = 454750, upload_time = "2025-04-08T10:35:08.859Z" }, - { url = "https://files.pythonhosted.org/packages/3d/6c/3786c50213451a0ad15170d091570d4a6554976cf0df19878002fc96075a/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:18b3bd29954bc4abeeb4e9d9cf0b30227f0f206c86657674f544cb032296acd5", size = 631591, upload_time = "2025-04-08T10:35:10.64Z" }, - { url = "https://files.pythonhosted.org/packages/1b/b3/1427425ade4e359a0deacce01a47a26024b2ccdb53098f9d64d497f6684c/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba5552a1b07c8edbf197055bc9d518b8f0d98a1c6a73a293bc0726dce068ed01", size = 625370, upload_time = "2025-04-08T10:35:12.412Z" }, - { url = "https://files.pythonhosted.org/packages/15/ba/f60e053b0b5b8145d682672024aa91370a29c5c921a88977eb565de34086/watchfiles-1.0.5-cp311-cp311-win32.whl", hash = "sha256:2f1fefb2e90e89959447bc0420fddd1e76f625784340d64a2f7d5983ef9ad246", size = 277791, upload_time = "2025-04-08T10:35:13.719Z" }, - { url = "https://files.pythonhosted.org/packages/50/ed/7603c4e164225c12c0d4e8700b64bb00e01a6c4eeea372292a3856be33a4/watchfiles-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:b6e76ceb1dd18c8e29c73f47d41866972e891fc4cc7ba014f487def72c1cf096", size = 291622, upload_time = "2025-04-08T10:35:15.071Z" }, - { url = "https://files.pythonhosted.org/packages/a2/c2/99bb7c96b4450e36877fde33690ded286ff555b5a5c1d925855d556968a1/watchfiles-1.0.5-cp311-cp311-win_arm64.whl", hash = "sha256:266710eb6fddc1f5e51843c70e3bebfb0f5e77cf4f27129278c70554104d19ed", size = 283699, upload_time = "2025-04-08T10:35:16.732Z" }, - { url = "https://files.pythonhosted.org/packages/2a/8c/4f0b9bdb75a1bfbd9c78fad7d8854369283f74fe7cf03eb16be77054536d/watchfiles-1.0.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5eb568c2aa6018e26da9e6c86f3ec3fd958cee7f0311b35c2630fa4217d17f2", size = 401511, upload_time = "2025-04-08T10:35:17.956Z" }, - { url = "https://files.pythonhosted.org/packages/dc/4e/7e15825def77f8bd359b6d3f379f0c9dac4eb09dd4ddd58fd7d14127179c/watchfiles-1.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a04059f4923ce4e856b4b4e5e783a70f49d9663d22a4c3b3298165996d1377f", size = 392715, upload_time = "2025-04-08T10:35:19.202Z" }, - { url = "https://files.pythonhosted.org/packages/58/65/b72fb817518728e08de5840d5d38571466c1b4a3f724d190cec909ee6f3f/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e380c89983ce6e6fe2dd1e1921b9952fb4e6da882931abd1824c092ed495dec", size = 454138, upload_time = "2025-04-08T10:35:20.586Z" }, - { url = "https://files.pythonhosted.org/packages/3e/a4/86833fd2ea2e50ae28989f5950b5c3f91022d67092bfec08f8300d8b347b/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fe43139b2c0fdc4a14d4f8d5b5d967f7a2777fd3d38ecf5b1ec669b0d7e43c21", size = 458592, upload_time = "2025-04-08T10:35:21.87Z" }, - { url = "https://files.pythonhosted.org/packages/38/7e/42cb8df8be9a37e50dd3a818816501cf7a20d635d76d6bd65aae3dbbff68/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee0822ce1b8a14fe5a066f93edd20aada932acfe348bede8aa2149f1a4489512", size = 487532, upload_time = "2025-04-08T10:35:23.143Z" }, - { url = "https://files.pythonhosted.org/packages/fc/fd/13d26721c85d7f3df6169d8b495fcac8ab0dc8f0945ebea8845de4681dab/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0dbcb1c2d8f2ab6e0a81c6699b236932bd264d4cef1ac475858d16c403de74d", size = 522865, upload_time = "2025-04-08T10:35:24.702Z" }, - { url = "https://files.pythonhosted.org/packages/a1/0d/7f9ae243c04e96c5455d111e21b09087d0eeaf9a1369e13a01c7d3d82478/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a2014a2b18ad3ca53b1f6c23f8cd94a18ce930c1837bd891262c182640eb40a6", size = 499887, upload_time = "2025-04-08T10:35:25.969Z" }, - { url = "https://files.pythonhosted.org/packages/8e/0f/a257766998e26aca4b3acf2ae97dff04b57071e991a510857d3799247c67/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f6ae86d5cb647bf58f9f655fcf577f713915a5d69057a0371bc257e2553234", size = 454498, upload_time = "2025-04-08T10:35:27.353Z" }, - { url = "https://files.pythonhosted.org/packages/81/79/8bf142575a03e0af9c3d5f8bcae911ee6683ae93a625d349d4ecf4c8f7df/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1a7bac2bde1d661fb31f4d4e8e539e178774b76db3c2c17c4bb3e960a5de07a2", size = 630663, upload_time = "2025-04-08T10:35:28.685Z" }, - { url = "https://files.pythonhosted.org/packages/f1/80/abe2e79f610e45c63a70d271caea90c49bbf93eb00fa947fa9b803a1d51f/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ab626da2fc1ac277bbf752446470b367f84b50295264d2d313e28dc4405d663", size = 625410, upload_time = "2025-04-08T10:35:30.42Z" }, - { url = "https://files.pythonhosted.org/packages/91/6f/bc7fbecb84a41a9069c2c6eb6319f7f7df113adf113e358c57fc1aff7ff5/watchfiles-1.0.5-cp312-cp312-win32.whl", hash = "sha256:9f4571a783914feda92018ef3901dab8caf5b029325b5fe4558c074582815249", size = 277965, upload_time = "2025-04-08T10:35:32.023Z" }, - { url = "https://files.pythonhosted.org/packages/99/a5/bf1c297ea6649ec59e935ab311f63d8af5faa8f0b86993e3282b984263e3/watchfiles-1.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:360a398c3a19672cf93527f7e8d8b60d8275119c5d900f2e184d32483117a705", size = 291693, upload_time = "2025-04-08T10:35:33.225Z" }, - { url = "https://files.pythonhosted.org/packages/7f/7b/fd01087cc21db5c47e5beae507b87965db341cce8a86f9eb12bf5219d4e0/watchfiles-1.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:1a2902ede862969077b97523987c38db28abbe09fb19866e711485d9fbf0d417", size = 283287, upload_time = "2025-04-08T10:35:34.568Z" }, - { url = "https://files.pythonhosted.org/packages/c7/62/435766874b704f39b2fecd8395a29042db2b5ec4005bd34523415e9bd2e0/watchfiles-1.0.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0b289572c33a0deae62daa57e44a25b99b783e5f7aed81b314232b3d3c81a11d", size = 401531, upload_time = "2025-04-08T10:35:35.792Z" }, - { url = "https://files.pythonhosted.org/packages/6e/a6/e52a02c05411b9cb02823e6797ef9bbba0bfaf1bb627da1634d44d8af833/watchfiles-1.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a056c2f692d65bf1e99c41045e3bdcaea3cb9e6b5a53dcaf60a5f3bd95fc9763", size = 392417, upload_time = "2025-04-08T10:35:37.048Z" }, - { url = "https://files.pythonhosted.org/packages/3f/53/c4af6819770455932144e0109d4854437769672d7ad897e76e8e1673435d/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9dca99744991fc9850d18015c4f0438865414e50069670f5f7eee08340d8b40", size = 453423, upload_time = "2025-04-08T10:35:38.357Z" }, - { url = "https://files.pythonhosted.org/packages/cb/d1/8e88df58bbbf819b8bc5cfbacd3c79e01b40261cad0fc84d1e1ebd778a07/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:894342d61d355446d02cd3988a7326af344143eb33a2fd5d38482a92072d9563", size = 458185, upload_time = "2025-04-08T10:35:39.708Z" }, - { url = "https://files.pythonhosted.org/packages/ff/70/fffaa11962dd5429e47e478a18736d4e42bec42404f5ee3b92ef1b87ad60/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab44e1580924d1ffd7b3938e02716d5ad190441965138b4aa1d1f31ea0877f04", size = 486696, upload_time = "2025-04-08T10:35:41.469Z" }, - { url = "https://files.pythonhosted.org/packages/39/db/723c0328e8b3692d53eb273797d9a08be6ffb1d16f1c0ba2bdbdc2a3852c/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6f9367b132078b2ceb8d066ff6c93a970a18c3029cea37bfd7b2d3dd2e5db8f", size = 522327, upload_time = "2025-04-08T10:35:43.289Z" }, - { url = "https://files.pythonhosted.org/packages/cd/05/9fccc43c50c39a76b68343484b9da7b12d42d0859c37c61aec018c967a32/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2e55a9b162e06e3f862fb61e399fe9f05d908d019d87bf5b496a04ef18a970a", size = 499741, upload_time = "2025-04-08T10:35:44.574Z" }, - { url = "https://files.pythonhosted.org/packages/23/14/499e90c37fa518976782b10a18b18db9f55ea73ca14641615056f8194bb3/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0125f91f70e0732a9f8ee01e49515c35d38ba48db507a50c5bdcad9503af5827", size = 453995, upload_time = "2025-04-08T10:35:46.336Z" }, - { url = "https://files.pythonhosted.org/packages/61/d9/f75d6840059320df5adecd2c687fbc18960a7f97b55c300d20f207d48aef/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:13bb21f8ba3248386337c9fa51c528868e6c34a707f729ab041c846d52a0c69a", size = 629693, upload_time = "2025-04-08T10:35:48.161Z" }, - { url = "https://files.pythonhosted.org/packages/fc/17/180ca383f5061b61406477218c55d66ec118e6c0c51f02d8142895fcf0a9/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:839ebd0df4a18c5b3c1b890145b5a3f5f64063c2a0d02b13c76d78fe5de34936", size = 624677, upload_time = "2025-04-08T10:35:49.65Z" }, - { url = "https://files.pythonhosted.org/packages/bf/15/714d6ef307f803f236d69ee9d421763707899d6298d9f3183e55e366d9af/watchfiles-1.0.5-cp313-cp313-win32.whl", hash = "sha256:4a8ec1e4e16e2d5bafc9ba82f7aaecfeec990ca7cd27e84fb6f191804ed2fcfc", size = 277804, upload_time = "2025-04-08T10:35:51.093Z" }, - { url = "https://files.pythonhosted.org/packages/a8/b4/c57b99518fadf431f3ef47a610839e46e5f8abf9814f969859d1c65c02c7/watchfiles-1.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:f436601594f15bf406518af922a89dcaab416568edb6f65c4e5bbbad1ea45c11", size = 291087, upload_time = "2025-04-08T10:35:52.458Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/03/e2/8ed598c42057de7aa5d97c472254af4906ff0a59a66699d426fc9ef795d7/watchfiles-1.0.5.tar.gz", hash = "sha256:b7529b5dcc114679d43827d8c35a07c493ad6f083633d573d81c660abc5979e9", size = 94537, upload-time = "2025-04-08T10:36:26.722Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/f4/41b591f59021786ef517e1cdc3b510383551846703e03f204827854a96f8/watchfiles-1.0.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:237f9be419e977a0f8f6b2e7b0475ababe78ff1ab06822df95d914a945eac827", size = 405336, upload-time = "2025-04-08T10:34:59.359Z" }, + { url = "https://files.pythonhosted.org/packages/ae/06/93789c135be4d6d0e4f63e96eea56dc54050b243eacc28439a26482b5235/watchfiles-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0da39ff917af8b27a4bdc5a97ac577552a38aac0d260a859c1517ea3dc1a7c4", size = 395977, upload-time = "2025-04-08T10:35:00.522Z" }, + { url = "https://files.pythonhosted.org/packages/d2/db/1cd89bd83728ca37054512d4d35ab69b5f12b8aa2ac9be3b0276b3bf06cc/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfcb3952350e95603f232a7a15f6c5f86c5375e46f0bd4ae70d43e3e063c13d", size = 455232, upload-time = "2025-04-08T10:35:01.698Z" }, + { url = "https://files.pythonhosted.org/packages/40/90/d8a4d44ffe960517e487c9c04f77b06b8abf05eb680bed71c82b5f2cad62/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68b2dddba7a4e6151384e252a5632efcaa9bc5d1c4b567f3cb621306b2ca9f63", size = 459151, upload-time = "2025-04-08T10:35:03.358Z" }, + { url = "https://files.pythonhosted.org/packages/6c/da/267a1546f26465dead1719caaba3ce660657f83c9d9c052ba98fb8856e13/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95cf944fcfc394c5f9de794ce581914900f82ff1f855326f25ebcf24d5397418", size = 489054, upload-time = "2025-04-08T10:35:04.561Z" }, + { url = "https://files.pythonhosted.org/packages/b1/31/33850dfd5c6efb6f27d2465cc4c6b27c5a6f5ed53c6fa63b7263cf5f60f6/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf6cd9f83d7c023b1aba15d13f705ca7b7d38675c121f3cc4a6e25bd0857ee9", size = 523955, upload-time = "2025-04-08T10:35:05.786Z" }, + { url = "https://files.pythonhosted.org/packages/09/84/b7d7b67856efb183a421f1416b44ca975cb2ea6c4544827955dfb01f7dc2/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:852de68acd6212cd6d33edf21e6f9e56e5d98c6add46f48244bd479d97c967c6", size = 502234, upload-time = "2025-04-08T10:35:07.187Z" }, + { url = "https://files.pythonhosted.org/packages/71/87/6dc5ec6882a2254cfdd8b0718b684504e737273903b65d7338efaba08b52/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5730f3aa35e646103b53389d5bc77edfbf578ab6dab2e005142b5b80a35ef25", size = 454750, upload-time = "2025-04-08T10:35:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6c/3786c50213451a0ad15170d091570d4a6554976cf0df19878002fc96075a/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:18b3bd29954bc4abeeb4e9d9cf0b30227f0f206c86657674f544cb032296acd5", size = 631591, upload-time = "2025-04-08T10:35:10.64Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b3/1427425ade4e359a0deacce01a47a26024b2ccdb53098f9d64d497f6684c/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba5552a1b07c8edbf197055bc9d518b8f0d98a1c6a73a293bc0726dce068ed01", size = 625370, upload-time = "2025-04-08T10:35:12.412Z" }, + { url = "https://files.pythonhosted.org/packages/15/ba/f60e053b0b5b8145d682672024aa91370a29c5c921a88977eb565de34086/watchfiles-1.0.5-cp311-cp311-win32.whl", hash = "sha256:2f1fefb2e90e89959447bc0420fddd1e76f625784340d64a2f7d5983ef9ad246", size = 277791, upload-time = "2025-04-08T10:35:13.719Z" }, + { url = "https://files.pythonhosted.org/packages/50/ed/7603c4e164225c12c0d4e8700b64bb00e01a6c4eeea372292a3856be33a4/watchfiles-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:b6e76ceb1dd18c8e29c73f47d41866972e891fc4cc7ba014f487def72c1cf096", size = 291622, upload-time = "2025-04-08T10:35:15.071Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c2/99bb7c96b4450e36877fde33690ded286ff555b5a5c1d925855d556968a1/watchfiles-1.0.5-cp311-cp311-win_arm64.whl", hash = "sha256:266710eb6fddc1f5e51843c70e3bebfb0f5e77cf4f27129278c70554104d19ed", size = 283699, upload-time = "2025-04-08T10:35:16.732Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8c/4f0b9bdb75a1bfbd9c78fad7d8854369283f74fe7cf03eb16be77054536d/watchfiles-1.0.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5eb568c2aa6018e26da9e6c86f3ec3fd958cee7f0311b35c2630fa4217d17f2", size = 401511, upload-time = "2025-04-08T10:35:17.956Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4e/7e15825def77f8bd359b6d3f379f0c9dac4eb09dd4ddd58fd7d14127179c/watchfiles-1.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a04059f4923ce4e856b4b4e5e783a70f49d9663d22a4c3b3298165996d1377f", size = 392715, upload-time = "2025-04-08T10:35:19.202Z" }, + { url = "https://files.pythonhosted.org/packages/58/65/b72fb817518728e08de5840d5d38571466c1b4a3f724d190cec909ee6f3f/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e380c89983ce6e6fe2dd1e1921b9952fb4e6da882931abd1824c092ed495dec", size = 454138, upload-time = "2025-04-08T10:35:20.586Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a4/86833fd2ea2e50ae28989f5950b5c3f91022d67092bfec08f8300d8b347b/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fe43139b2c0fdc4a14d4f8d5b5d967f7a2777fd3d38ecf5b1ec669b0d7e43c21", size = 458592, upload-time = "2025-04-08T10:35:21.87Z" }, + { url = "https://files.pythonhosted.org/packages/38/7e/42cb8df8be9a37e50dd3a818816501cf7a20d635d76d6bd65aae3dbbff68/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee0822ce1b8a14fe5a066f93edd20aada932acfe348bede8aa2149f1a4489512", size = 487532, upload-time = "2025-04-08T10:35:23.143Z" }, + { url = "https://files.pythonhosted.org/packages/fc/fd/13d26721c85d7f3df6169d8b495fcac8ab0dc8f0945ebea8845de4681dab/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0dbcb1c2d8f2ab6e0a81c6699b236932bd264d4cef1ac475858d16c403de74d", size = 522865, upload-time = "2025-04-08T10:35:24.702Z" }, + { url = "https://files.pythonhosted.org/packages/a1/0d/7f9ae243c04e96c5455d111e21b09087d0eeaf9a1369e13a01c7d3d82478/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a2014a2b18ad3ca53b1f6c23f8cd94a18ce930c1837bd891262c182640eb40a6", size = 499887, upload-time = "2025-04-08T10:35:25.969Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0f/a257766998e26aca4b3acf2ae97dff04b57071e991a510857d3799247c67/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f6ae86d5cb647bf58f9f655fcf577f713915a5d69057a0371bc257e2553234", size = 454498, upload-time = "2025-04-08T10:35:27.353Z" }, + { url = "https://files.pythonhosted.org/packages/81/79/8bf142575a03e0af9c3d5f8bcae911ee6683ae93a625d349d4ecf4c8f7df/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1a7bac2bde1d661fb31f4d4e8e539e178774b76db3c2c17c4bb3e960a5de07a2", size = 630663, upload-time = "2025-04-08T10:35:28.685Z" }, + { url = "https://files.pythonhosted.org/packages/f1/80/abe2e79f610e45c63a70d271caea90c49bbf93eb00fa947fa9b803a1d51f/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ab626da2fc1ac277bbf752446470b367f84b50295264d2d313e28dc4405d663", size = 625410, upload-time = "2025-04-08T10:35:30.42Z" }, + { url = "https://files.pythonhosted.org/packages/91/6f/bc7fbecb84a41a9069c2c6eb6319f7f7df113adf113e358c57fc1aff7ff5/watchfiles-1.0.5-cp312-cp312-win32.whl", hash = "sha256:9f4571a783914feda92018ef3901dab8caf5b029325b5fe4558c074582815249", size = 277965, upload-time = "2025-04-08T10:35:32.023Z" }, + { url = "https://files.pythonhosted.org/packages/99/a5/bf1c297ea6649ec59e935ab311f63d8af5faa8f0b86993e3282b984263e3/watchfiles-1.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:360a398c3a19672cf93527f7e8d8b60d8275119c5d900f2e184d32483117a705", size = 291693, upload-time = "2025-04-08T10:35:33.225Z" }, + { url = "https://files.pythonhosted.org/packages/7f/7b/fd01087cc21db5c47e5beae507b87965db341cce8a86f9eb12bf5219d4e0/watchfiles-1.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:1a2902ede862969077b97523987c38db28abbe09fb19866e711485d9fbf0d417", size = 283287, upload-time = "2025-04-08T10:35:34.568Z" }, + { url = "https://files.pythonhosted.org/packages/c7/62/435766874b704f39b2fecd8395a29042db2b5ec4005bd34523415e9bd2e0/watchfiles-1.0.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0b289572c33a0deae62daa57e44a25b99b783e5f7aed81b314232b3d3c81a11d", size = 401531, upload-time = "2025-04-08T10:35:35.792Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a6/e52a02c05411b9cb02823e6797ef9bbba0bfaf1bb627da1634d44d8af833/watchfiles-1.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a056c2f692d65bf1e99c41045e3bdcaea3cb9e6b5a53dcaf60a5f3bd95fc9763", size = 392417, upload-time = "2025-04-08T10:35:37.048Z" }, + { url = "https://files.pythonhosted.org/packages/3f/53/c4af6819770455932144e0109d4854437769672d7ad897e76e8e1673435d/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9dca99744991fc9850d18015c4f0438865414e50069670f5f7eee08340d8b40", size = 453423, upload-time = "2025-04-08T10:35:38.357Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d1/8e88df58bbbf819b8bc5cfbacd3c79e01b40261cad0fc84d1e1ebd778a07/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:894342d61d355446d02cd3988a7326af344143eb33a2fd5d38482a92072d9563", size = 458185, upload-time = "2025-04-08T10:35:39.708Z" }, + { url = "https://files.pythonhosted.org/packages/ff/70/fffaa11962dd5429e47e478a18736d4e42bec42404f5ee3b92ef1b87ad60/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab44e1580924d1ffd7b3938e02716d5ad190441965138b4aa1d1f31ea0877f04", size = 486696, upload-time = "2025-04-08T10:35:41.469Z" }, + { url = "https://files.pythonhosted.org/packages/39/db/723c0328e8b3692d53eb273797d9a08be6ffb1d16f1c0ba2bdbdc2a3852c/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6f9367b132078b2ceb8d066ff6c93a970a18c3029cea37bfd7b2d3dd2e5db8f", size = 522327, upload-time = "2025-04-08T10:35:43.289Z" }, + { url = "https://files.pythonhosted.org/packages/cd/05/9fccc43c50c39a76b68343484b9da7b12d42d0859c37c61aec018c967a32/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2e55a9b162e06e3f862fb61e399fe9f05d908d019d87bf5b496a04ef18a970a", size = 499741, upload-time = "2025-04-08T10:35:44.574Z" }, + { url = "https://files.pythonhosted.org/packages/23/14/499e90c37fa518976782b10a18b18db9f55ea73ca14641615056f8194bb3/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0125f91f70e0732a9f8ee01e49515c35d38ba48db507a50c5bdcad9503af5827", size = 453995, upload-time = "2025-04-08T10:35:46.336Z" }, + { url = "https://files.pythonhosted.org/packages/61/d9/f75d6840059320df5adecd2c687fbc18960a7f97b55c300d20f207d48aef/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:13bb21f8ba3248386337c9fa51c528868e6c34a707f729ab041c846d52a0c69a", size = 629693, upload-time = "2025-04-08T10:35:48.161Z" }, + { url = "https://files.pythonhosted.org/packages/fc/17/180ca383f5061b61406477218c55d66ec118e6c0c51f02d8142895fcf0a9/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:839ebd0df4a18c5b3c1b890145b5a3f5f64063c2a0d02b13c76d78fe5de34936", size = 624677, upload-time = "2025-04-08T10:35:49.65Z" }, + { url = "https://files.pythonhosted.org/packages/bf/15/714d6ef307f803f236d69ee9d421763707899d6298d9f3183e55e366d9af/watchfiles-1.0.5-cp313-cp313-win32.whl", hash = "sha256:4a8ec1e4e16e2d5bafc9ba82f7aaecfeec990ca7cd27e84fb6f191804ed2fcfc", size = 277804, upload-time = "2025-04-08T10:35:51.093Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b4/c57b99518fadf431f3ef47a610839e46e5f8abf9814f969859d1c65c02c7/watchfiles-1.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:f436601594f15bf406518af922a89dcaab416568edb6f65c4e5bbbad1ea45c11", size = 291087, upload-time = "2025-04-08T10:35:52.458Z" }, ] [[package]] name = "websockets" version = "15.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload_time = "2025-03-05T20:03:41.606Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload_time = "2025-03-05T20:01:56.276Z" }, - { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload_time = "2025-03-05T20:01:57.563Z" }, - { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload_time = "2025-03-05T20:01:59.063Z" }, - { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload_time = "2025-03-05T20:02:00.305Z" }, - { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883, upload_time = "2025-03-05T20:02:03.148Z" }, - { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload_time = "2025-03-05T20:02:05.29Z" }, - { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload_time = "2025-03-05T20:02:07.458Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958, upload_time = "2025-03-05T20:02:09.842Z" }, - { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload_time = "2025-03-05T20:02:11.968Z" }, - { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388, upload_time = "2025-03-05T20:02:13.32Z" }, - { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828, upload_time = "2025-03-05T20:02:14.585Z" }, - { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload_time = "2025-03-05T20:02:16.706Z" }, - { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload_time = "2025-03-05T20:02:18.832Z" }, - { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload_time = "2025-03-05T20:02:20.187Z" }, - { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload_time = "2025-03-05T20:02:22.286Z" }, - { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096, upload_time = "2025-03-05T20:02:24.368Z" }, - { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload_time = "2025-03-05T20:02:25.669Z" }, - { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload_time = "2025-03-05T20:02:26.99Z" }, - { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165, upload_time = "2025-03-05T20:02:30.291Z" }, - { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload_time = "2025-03-05T20:02:31.634Z" }, - { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395, upload_time = "2025-03-05T20:02:33.017Z" }, - { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841, upload_time = "2025-03-05T20:02:34.498Z" }, - { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload_time = "2025-03-05T20:02:36.695Z" }, - { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload_time = "2025-03-05T20:02:37.985Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload_time = "2025-03-05T20:02:39.298Z" }, - { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload_time = "2025-03-05T20:02:40.595Z" }, - { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload_time = "2025-03-05T20:02:41.926Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload_time = "2025-03-05T20:02:43.304Z" }, - { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload_time = "2025-03-05T20:02:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload_time = "2025-03-05T20:02:50.14Z" }, - { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload_time = "2025-03-05T20:02:51.561Z" }, - { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload_time = "2025-03-05T20:02:53.814Z" }, - { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload_time = "2025-03-05T20:02:55.237Z" }, - { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload_time = "2025-03-05T20:03:39.41Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload-time = "2025-03-05T20:01:56.276Z" }, + { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload-time = "2025-03-05T20:01:57.563Z" }, + { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload-time = "2025-03-05T20:01:59.063Z" }, + { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload-time = "2025-03-05T20:02:00.305Z" }, + { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883, upload-time = "2025-03-05T20:02:03.148Z" }, + { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload-time = "2025-03-05T20:02:05.29Z" }, + { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload-time = "2025-03-05T20:02:07.458Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958, upload-time = "2025-03-05T20:02:09.842Z" }, + { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload-time = "2025-03-05T20:02:11.968Z" }, + { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388, upload-time = "2025-03-05T20:02:13.32Z" }, + { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828, upload-time = "2025-03-05T20:02:14.585Z" }, + { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload-time = "2025-03-05T20:02:16.706Z" }, + { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload-time = "2025-03-05T20:02:18.832Z" }, + { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload-time = "2025-03-05T20:02:20.187Z" }, + { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload-time = "2025-03-05T20:02:22.286Z" }, + { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096, upload-time = "2025-03-05T20:02:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload-time = "2025-03-05T20:02:25.669Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload-time = "2025-03-05T20:02:26.99Z" }, + { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165, upload-time = "2025-03-05T20:02:30.291Z" }, + { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload-time = "2025-03-05T20:02:31.634Z" }, + { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395, upload-time = "2025-03-05T20:02:33.017Z" }, + { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841, upload-time = "2025-03-05T20:02:34.498Z" }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, ] [[package]] name = "xxhash" version = "3.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/00/5e/d6e5258d69df8b4ed8c83b6664f2b47d30d2dec551a29ad72a6c69eafd31/xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f", size = 84241, upload_time = "2024-08-17T09:20:38.972Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/c7/afed0f131fbda960ff15eee7f304fa0eeb2d58770fade99897984852ef23/xxhash-3.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02c2e816896dc6f85922ced60097bcf6f008dedfc5073dcba32f9c8dd786f3c1", size = 31969, upload_time = "2024-08-17T09:18:00.852Z" }, - { url = "https://files.pythonhosted.org/packages/8c/0c/7c3bc6d87e5235672fcc2fb42fd5ad79fe1033925f71bf549ee068c7d1ca/xxhash-3.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6027dcd885e21581e46d3c7f682cfb2b870942feeed58a21c29583512c3f09f8", size = 30800, upload_time = "2024-08-17T09:18:01.863Z" }, - { url = "https://files.pythonhosted.org/packages/04/9e/01067981d98069eec1c20201f8c145367698e9056f8bc295346e4ea32dd1/xxhash-3.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1308fa542bbdbf2fa85e9e66b1077eea3a88bef38ee8a06270b4298a7a62a166", size = 221566, upload_time = "2024-08-17T09:18:03.461Z" }, - { url = "https://files.pythonhosted.org/packages/d4/09/d4996de4059c3ce5342b6e1e6a77c9d6c91acce31f6ed979891872dd162b/xxhash-3.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c28b2fdcee797e1c1961cd3bcd3d545cab22ad202c846235197935e1df2f8ef7", size = 201214, upload_time = "2024-08-17T09:18:05.616Z" }, - { url = "https://files.pythonhosted.org/packages/62/f5/6d2dc9f8d55a7ce0f5e7bfef916e67536f01b85d32a9fbf137d4cadbee38/xxhash-3.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:924361811732ddad75ff23e90efd9ccfda4f664132feecb90895bade6a1b4623", size = 429433, upload_time = "2024-08-17T09:18:06.957Z" }, - { url = "https://files.pythonhosted.org/packages/d9/72/9256303f10e41ab004799a4aa74b80b3c5977d6383ae4550548b24bd1971/xxhash-3.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89997aa1c4b6a5b1e5b588979d1da048a3c6f15e55c11d117a56b75c84531f5a", size = 194822, upload_time = "2024-08-17T09:18:08.331Z" }, - { url = "https://files.pythonhosted.org/packages/34/92/1a3a29acd08248a34b0e6a94f4e0ed9b8379a4ff471f1668e4dce7bdbaa8/xxhash-3.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:685c4f4e8c59837de103344eb1c8a3851f670309eb5c361f746805c5471b8c88", size = 208538, upload_time = "2024-08-17T09:18:10.332Z" }, - { url = "https://files.pythonhosted.org/packages/53/ad/7fa1a109663366de42f724a1cdb8e796a260dbac45047bce153bc1e18abf/xxhash-3.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbd2ecfbfee70bc1a4acb7461fa6af7748ec2ab08ac0fa298f281c51518f982c", size = 216953, upload_time = "2024-08-17T09:18:11.707Z" }, - { url = "https://files.pythonhosted.org/packages/35/02/137300e24203bf2b2a49b48ce898ecce6fd01789c0fcd9c686c0a002d129/xxhash-3.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25b5a51dc3dfb20a10833c8eee25903fd2e14059e9afcd329c9da20609a307b2", size = 203594, upload_time = "2024-08-17T09:18:13.799Z" }, - { url = "https://files.pythonhosted.org/packages/23/03/aeceb273933d7eee248c4322b98b8e971f06cc3880e5f7602c94e5578af5/xxhash-3.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a8fb786fb754ef6ff8c120cb96629fb518f8eb5a61a16aac3a979a9dbd40a084", size = 210971, upload_time = "2024-08-17T09:18:15.824Z" }, - { url = "https://files.pythonhosted.org/packages/e3/64/ed82ec09489474cbb35c716b189ddc1521d8b3de12b1b5ab41ce7f70253c/xxhash-3.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a905ad00ad1e1c34fe4e9d7c1d949ab09c6fa90c919860c1534ff479f40fd12d", size = 415050, upload_time = "2024-08-17T09:18:17.142Z" }, - { url = "https://files.pythonhosted.org/packages/71/43/6db4c02dcb488ad4e03bc86d70506c3d40a384ee73c9b5c93338eb1f3c23/xxhash-3.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:963be41bcd49f53af6d795f65c0da9b4cc518c0dd9c47145c98f61cb464f4839", size = 192216, upload_time = "2024-08-17T09:18:18.779Z" }, - { url = "https://files.pythonhosted.org/packages/22/6d/db4abec29e7a567455344433d095fdb39c97db6955bb4a2c432e486b4d28/xxhash-3.5.0-cp311-cp311-win32.whl", hash = "sha256:109b436096d0a2dd039c355fa3414160ec4d843dfecc64a14077332a00aeb7da", size = 30120, upload_time = "2024-08-17T09:18:20.009Z" }, - { url = "https://files.pythonhosted.org/packages/52/1c/fa3b61c0cf03e1da4767213672efe186b1dfa4fc901a4a694fb184a513d1/xxhash-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:b702f806693201ad6c0a05ddbbe4c8f359626d0b3305f766077d51388a6bac58", size = 30003, upload_time = "2024-08-17T09:18:21.052Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8e/9e6fc572acf6e1cc7ccb01973c213f895cb8668a9d4c2b58a99350da14b7/xxhash-3.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:c4dcb4120d0cc3cc448624147dba64e9021b278c63e34a38789b688fd0da9bf3", size = 26777, upload_time = "2024-08-17T09:18:22.809Z" }, - { url = "https://files.pythonhosted.org/packages/07/0e/1bfce2502c57d7e2e787600b31c83535af83746885aa1a5f153d8c8059d6/xxhash-3.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:14470ace8bd3b5d51318782cd94e6f94431974f16cb3b8dc15d52f3b69df8e00", size = 31969, upload_time = "2024-08-17T09:18:24.025Z" }, - { url = "https://files.pythonhosted.org/packages/3f/d6/8ca450d6fe5b71ce521b4e5db69622383d039e2b253e9b2f24f93265b52c/xxhash-3.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59aa1203de1cb96dbeab595ded0ad0c0056bb2245ae11fac11c0ceea861382b9", size = 30787, upload_time = "2024-08-17T09:18:25.318Z" }, - { url = "https://files.pythonhosted.org/packages/5b/84/de7c89bc6ef63d750159086a6ada6416cc4349eab23f76ab870407178b93/xxhash-3.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08424f6648526076e28fae6ea2806c0a7d504b9ef05ae61d196d571e5c879c84", size = 220959, upload_time = "2024-08-17T09:18:26.518Z" }, - { url = "https://files.pythonhosted.org/packages/fe/86/51258d3e8a8545ff26468c977101964c14d56a8a37f5835bc0082426c672/xxhash-3.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61a1ff00674879725b194695e17f23d3248998b843eb5e933007ca743310f793", size = 200006, upload_time = "2024-08-17T09:18:27.905Z" }, - { url = "https://files.pythonhosted.org/packages/02/0a/96973bd325412feccf23cf3680fd2246aebf4b789122f938d5557c54a6b2/xxhash-3.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f2c61bee5844d41c3eb015ac652a0229e901074951ae48581d58bfb2ba01be", size = 428326, upload_time = "2024-08-17T09:18:29.335Z" }, - { url = "https://files.pythonhosted.org/packages/11/a7/81dba5010f7e733de88af9555725146fc133be97ce36533867f4c7e75066/xxhash-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d32a592cac88d18cc09a89172e1c32d7f2a6e516c3dfde1b9adb90ab5df54a6", size = 194380, upload_time = "2024-08-17T09:18:30.706Z" }, - { url = "https://files.pythonhosted.org/packages/fb/7d/f29006ab398a173f4501c0e4977ba288f1c621d878ec217b4ff516810c04/xxhash-3.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70dabf941dede727cca579e8c205e61121afc9b28516752fd65724be1355cc90", size = 207934, upload_time = "2024-08-17T09:18:32.133Z" }, - { url = "https://files.pythonhosted.org/packages/8a/6e/6e88b8f24612510e73d4d70d9b0c7dff62a2e78451b9f0d042a5462c8d03/xxhash-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e5d0ddaca65ecca9c10dcf01730165fd858533d0be84c75c327487c37a906a27", size = 216301, upload_time = "2024-08-17T09:18:33.474Z" }, - { url = "https://files.pythonhosted.org/packages/af/51/7862f4fa4b75a25c3b4163c8a873f070532fe5f2d3f9b3fc869c8337a398/xxhash-3.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e5b5e16c5a480fe5f59f56c30abdeba09ffd75da8d13f6b9b6fd224d0b4d0a2", size = 203351, upload_time = "2024-08-17T09:18:34.889Z" }, - { url = "https://files.pythonhosted.org/packages/22/61/8d6a40f288f791cf79ed5bb113159abf0c81d6efb86e734334f698eb4c59/xxhash-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149b7914451eb154b3dfaa721315117ea1dac2cc55a01bfbd4df7c68c5dd683d", size = 210294, upload_time = "2024-08-17T09:18:36.355Z" }, - { url = "https://files.pythonhosted.org/packages/17/02/215c4698955762d45a8158117190261b2dbefe9ae7e5b906768c09d8bc74/xxhash-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:eade977f5c96c677035ff39c56ac74d851b1cca7d607ab3d8f23c6b859379cab", size = 414674, upload_time = "2024-08-17T09:18:38.536Z" }, - { url = "https://files.pythonhosted.org/packages/31/5c/b7a8db8a3237cff3d535261325d95de509f6a8ae439a5a7a4ffcff478189/xxhash-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa9f547bd98f5553d03160967866a71056a60960be00356a15ecc44efb40ba8e", size = 192022, upload_time = "2024-08-17T09:18:40.138Z" }, - { url = "https://files.pythonhosted.org/packages/78/e3/dd76659b2811b3fd06892a8beb850e1996b63e9235af5a86ea348f053e9e/xxhash-3.5.0-cp312-cp312-win32.whl", hash = "sha256:f7b58d1fd3551b8c80a971199543379be1cee3d0d409e1f6d8b01c1a2eebf1f8", size = 30170, upload_time = "2024-08-17T09:18:42.163Z" }, - { url = "https://files.pythonhosted.org/packages/d9/6b/1c443fe6cfeb4ad1dcf231cdec96eb94fb43d6498b4469ed8b51f8b59a37/xxhash-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:fa0cafd3a2af231b4e113fba24a65d7922af91aeb23774a8b78228e6cd785e3e", size = 30040, upload_time = "2024-08-17T09:18:43.699Z" }, - { url = "https://files.pythonhosted.org/packages/0f/eb/04405305f290173acc0350eba6d2f1a794b57925df0398861a20fbafa415/xxhash-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:586886c7e89cb9828bcd8a5686b12e161368e0064d040e225e72607b43858ba2", size = 26796, upload_time = "2024-08-17T09:18:45.29Z" }, - { url = "https://files.pythonhosted.org/packages/c9/b8/e4b3ad92d249be5c83fa72916c9091b0965cb0faeff05d9a0a3870ae6bff/xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6", size = 31795, upload_time = "2024-08-17T09:18:46.813Z" }, - { url = "https://files.pythonhosted.org/packages/fc/d8/b3627a0aebfbfa4c12a41e22af3742cf08c8ea84f5cc3367b5de2d039cce/xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5", size = 30792, upload_time = "2024-08-17T09:18:47.862Z" }, - { url = "https://files.pythonhosted.org/packages/c3/cc/762312960691da989c7cd0545cb120ba2a4148741c6ba458aa723c00a3f8/xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc", size = 220950, upload_time = "2024-08-17T09:18:49.06Z" }, - { url = "https://files.pythonhosted.org/packages/fe/e9/cc266f1042c3c13750e86a535496b58beb12bf8c50a915c336136f6168dc/xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3", size = 199980, upload_time = "2024-08-17T09:18:50.445Z" }, - { url = "https://files.pythonhosted.org/packages/bf/85/a836cd0dc5cc20376de26b346858d0ac9656f8f730998ca4324921a010b9/xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c", size = 428324, upload_time = "2024-08-17T09:18:51.988Z" }, - { url = "https://files.pythonhosted.org/packages/b4/0e/15c243775342ce840b9ba34aceace06a1148fa1630cd8ca269e3223987f5/xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb", size = 194370, upload_time = "2024-08-17T09:18:54.164Z" }, - { url = "https://files.pythonhosted.org/packages/87/a1/b028bb02636dfdc190da01951d0703b3d904301ed0ef6094d948983bef0e/xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f", size = 207911, upload_time = "2024-08-17T09:18:55.509Z" }, - { url = "https://files.pythonhosted.org/packages/80/d5/73c73b03fc0ac73dacf069fdf6036c9abad82de0a47549e9912c955ab449/xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7", size = 216352, upload_time = "2024-08-17T09:18:57.073Z" }, - { url = "https://files.pythonhosted.org/packages/b6/2a/5043dba5ddbe35b4fe6ea0a111280ad9c3d4ba477dd0f2d1fe1129bda9d0/xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326", size = 203410, upload_time = "2024-08-17T09:18:58.54Z" }, - { url = "https://files.pythonhosted.org/packages/a2/b2/9a8ded888b7b190aed75b484eb5c853ddd48aa2896e7b59bbfbce442f0a1/xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf", size = 210322, upload_time = "2024-08-17T09:18:59.943Z" }, - { url = "https://files.pythonhosted.org/packages/98/62/440083fafbc917bf3e4b67c2ade621920dd905517e85631c10aac955c1d2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7", size = 414725, upload_time = "2024-08-17T09:19:01.332Z" }, - { url = "https://files.pythonhosted.org/packages/75/db/009206f7076ad60a517e016bb0058381d96a007ce3f79fa91d3010f49cc2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c", size = 192070, upload_time = "2024-08-17T09:19:03.007Z" }, - { url = "https://files.pythonhosted.org/packages/1f/6d/c61e0668943a034abc3a569cdc5aeae37d686d9da7e39cf2ed621d533e36/xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637", size = 30172, upload_time = "2024-08-17T09:19:04.355Z" }, - { url = "https://files.pythonhosted.org/packages/96/14/8416dce965f35e3d24722cdf79361ae154fa23e2ab730e5323aa98d7919e/xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43", size = 30041, upload_time = "2024-08-17T09:19:05.435Z" }, - { url = "https://files.pythonhosted.org/packages/27/ee/518b72faa2073f5aa8e3262408d284892cb79cf2754ba0c3a5870645ef73/xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b", size = 26801, upload_time = "2024-08-17T09:19:06.547Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/00/5e/d6e5258d69df8b4ed8c83b6664f2b47d30d2dec551a29ad72a6c69eafd31/xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f", size = 84241, upload-time = "2024-08-17T09:20:38.972Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/c7/afed0f131fbda960ff15eee7f304fa0eeb2d58770fade99897984852ef23/xxhash-3.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02c2e816896dc6f85922ced60097bcf6f008dedfc5073dcba32f9c8dd786f3c1", size = 31969, upload-time = "2024-08-17T09:18:00.852Z" }, + { url = "https://files.pythonhosted.org/packages/8c/0c/7c3bc6d87e5235672fcc2fb42fd5ad79fe1033925f71bf549ee068c7d1ca/xxhash-3.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6027dcd885e21581e46d3c7f682cfb2b870942feeed58a21c29583512c3f09f8", size = 30800, upload-time = "2024-08-17T09:18:01.863Z" }, + { url = "https://files.pythonhosted.org/packages/04/9e/01067981d98069eec1c20201f8c145367698e9056f8bc295346e4ea32dd1/xxhash-3.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1308fa542bbdbf2fa85e9e66b1077eea3a88bef38ee8a06270b4298a7a62a166", size = 221566, upload-time = "2024-08-17T09:18:03.461Z" }, + { url = "https://files.pythonhosted.org/packages/d4/09/d4996de4059c3ce5342b6e1e6a77c9d6c91acce31f6ed979891872dd162b/xxhash-3.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c28b2fdcee797e1c1961cd3bcd3d545cab22ad202c846235197935e1df2f8ef7", size = 201214, upload-time = "2024-08-17T09:18:05.616Z" }, + { url = "https://files.pythonhosted.org/packages/62/f5/6d2dc9f8d55a7ce0f5e7bfef916e67536f01b85d32a9fbf137d4cadbee38/xxhash-3.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:924361811732ddad75ff23e90efd9ccfda4f664132feecb90895bade6a1b4623", size = 429433, upload-time = "2024-08-17T09:18:06.957Z" }, + { url = "https://files.pythonhosted.org/packages/d9/72/9256303f10e41ab004799a4aa74b80b3c5977d6383ae4550548b24bd1971/xxhash-3.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89997aa1c4b6a5b1e5b588979d1da048a3c6f15e55c11d117a56b75c84531f5a", size = 194822, upload-time = "2024-08-17T09:18:08.331Z" }, + { url = "https://files.pythonhosted.org/packages/34/92/1a3a29acd08248a34b0e6a94f4e0ed9b8379a4ff471f1668e4dce7bdbaa8/xxhash-3.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:685c4f4e8c59837de103344eb1c8a3851f670309eb5c361f746805c5471b8c88", size = 208538, upload-time = "2024-08-17T09:18:10.332Z" }, + { url = "https://files.pythonhosted.org/packages/53/ad/7fa1a109663366de42f724a1cdb8e796a260dbac45047bce153bc1e18abf/xxhash-3.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbd2ecfbfee70bc1a4acb7461fa6af7748ec2ab08ac0fa298f281c51518f982c", size = 216953, upload-time = "2024-08-17T09:18:11.707Z" }, + { url = "https://files.pythonhosted.org/packages/35/02/137300e24203bf2b2a49b48ce898ecce6fd01789c0fcd9c686c0a002d129/xxhash-3.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25b5a51dc3dfb20a10833c8eee25903fd2e14059e9afcd329c9da20609a307b2", size = 203594, upload-time = "2024-08-17T09:18:13.799Z" }, + { url = "https://files.pythonhosted.org/packages/23/03/aeceb273933d7eee248c4322b98b8e971f06cc3880e5f7602c94e5578af5/xxhash-3.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a8fb786fb754ef6ff8c120cb96629fb518f8eb5a61a16aac3a979a9dbd40a084", size = 210971, upload-time = "2024-08-17T09:18:15.824Z" }, + { url = "https://files.pythonhosted.org/packages/e3/64/ed82ec09489474cbb35c716b189ddc1521d8b3de12b1b5ab41ce7f70253c/xxhash-3.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a905ad00ad1e1c34fe4e9d7c1d949ab09c6fa90c919860c1534ff479f40fd12d", size = 415050, upload-time = "2024-08-17T09:18:17.142Z" }, + { url = "https://files.pythonhosted.org/packages/71/43/6db4c02dcb488ad4e03bc86d70506c3d40a384ee73c9b5c93338eb1f3c23/xxhash-3.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:963be41bcd49f53af6d795f65c0da9b4cc518c0dd9c47145c98f61cb464f4839", size = 192216, upload-time = "2024-08-17T09:18:18.779Z" }, + { url = "https://files.pythonhosted.org/packages/22/6d/db4abec29e7a567455344433d095fdb39c97db6955bb4a2c432e486b4d28/xxhash-3.5.0-cp311-cp311-win32.whl", hash = "sha256:109b436096d0a2dd039c355fa3414160ec4d843dfecc64a14077332a00aeb7da", size = 30120, upload-time = "2024-08-17T09:18:20.009Z" }, + { url = "https://files.pythonhosted.org/packages/52/1c/fa3b61c0cf03e1da4767213672efe186b1dfa4fc901a4a694fb184a513d1/xxhash-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:b702f806693201ad6c0a05ddbbe4c8f359626d0b3305f766077d51388a6bac58", size = 30003, upload-time = "2024-08-17T09:18:21.052Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8e/9e6fc572acf6e1cc7ccb01973c213f895cb8668a9d4c2b58a99350da14b7/xxhash-3.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:c4dcb4120d0cc3cc448624147dba64e9021b278c63e34a38789b688fd0da9bf3", size = 26777, upload-time = "2024-08-17T09:18:22.809Z" }, + { url = "https://files.pythonhosted.org/packages/07/0e/1bfce2502c57d7e2e787600b31c83535af83746885aa1a5f153d8c8059d6/xxhash-3.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:14470ace8bd3b5d51318782cd94e6f94431974f16cb3b8dc15d52f3b69df8e00", size = 31969, upload-time = "2024-08-17T09:18:24.025Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d6/8ca450d6fe5b71ce521b4e5db69622383d039e2b253e9b2f24f93265b52c/xxhash-3.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59aa1203de1cb96dbeab595ded0ad0c0056bb2245ae11fac11c0ceea861382b9", size = 30787, upload-time = "2024-08-17T09:18:25.318Z" }, + { url = "https://files.pythonhosted.org/packages/5b/84/de7c89bc6ef63d750159086a6ada6416cc4349eab23f76ab870407178b93/xxhash-3.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08424f6648526076e28fae6ea2806c0a7d504b9ef05ae61d196d571e5c879c84", size = 220959, upload-time = "2024-08-17T09:18:26.518Z" }, + { url = "https://files.pythonhosted.org/packages/fe/86/51258d3e8a8545ff26468c977101964c14d56a8a37f5835bc0082426c672/xxhash-3.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61a1ff00674879725b194695e17f23d3248998b843eb5e933007ca743310f793", size = 200006, upload-time = "2024-08-17T09:18:27.905Z" }, + { url = "https://files.pythonhosted.org/packages/02/0a/96973bd325412feccf23cf3680fd2246aebf4b789122f938d5557c54a6b2/xxhash-3.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f2c61bee5844d41c3eb015ac652a0229e901074951ae48581d58bfb2ba01be", size = 428326, upload-time = "2024-08-17T09:18:29.335Z" }, + { url = "https://files.pythonhosted.org/packages/11/a7/81dba5010f7e733de88af9555725146fc133be97ce36533867f4c7e75066/xxhash-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d32a592cac88d18cc09a89172e1c32d7f2a6e516c3dfde1b9adb90ab5df54a6", size = 194380, upload-time = "2024-08-17T09:18:30.706Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7d/f29006ab398a173f4501c0e4977ba288f1c621d878ec217b4ff516810c04/xxhash-3.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70dabf941dede727cca579e8c205e61121afc9b28516752fd65724be1355cc90", size = 207934, upload-time = "2024-08-17T09:18:32.133Z" }, + { url = "https://files.pythonhosted.org/packages/8a/6e/6e88b8f24612510e73d4d70d9b0c7dff62a2e78451b9f0d042a5462c8d03/xxhash-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e5d0ddaca65ecca9c10dcf01730165fd858533d0be84c75c327487c37a906a27", size = 216301, upload-time = "2024-08-17T09:18:33.474Z" }, + { url = "https://files.pythonhosted.org/packages/af/51/7862f4fa4b75a25c3b4163c8a873f070532fe5f2d3f9b3fc869c8337a398/xxhash-3.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e5b5e16c5a480fe5f59f56c30abdeba09ffd75da8d13f6b9b6fd224d0b4d0a2", size = 203351, upload-time = "2024-08-17T09:18:34.889Z" }, + { url = "https://files.pythonhosted.org/packages/22/61/8d6a40f288f791cf79ed5bb113159abf0c81d6efb86e734334f698eb4c59/xxhash-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149b7914451eb154b3dfaa721315117ea1dac2cc55a01bfbd4df7c68c5dd683d", size = 210294, upload-time = "2024-08-17T09:18:36.355Z" }, + { url = "https://files.pythonhosted.org/packages/17/02/215c4698955762d45a8158117190261b2dbefe9ae7e5b906768c09d8bc74/xxhash-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:eade977f5c96c677035ff39c56ac74d851b1cca7d607ab3d8f23c6b859379cab", size = 414674, upload-time = "2024-08-17T09:18:38.536Z" }, + { url = "https://files.pythonhosted.org/packages/31/5c/b7a8db8a3237cff3d535261325d95de509f6a8ae439a5a7a4ffcff478189/xxhash-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa9f547bd98f5553d03160967866a71056a60960be00356a15ecc44efb40ba8e", size = 192022, upload-time = "2024-08-17T09:18:40.138Z" }, + { url = "https://files.pythonhosted.org/packages/78/e3/dd76659b2811b3fd06892a8beb850e1996b63e9235af5a86ea348f053e9e/xxhash-3.5.0-cp312-cp312-win32.whl", hash = "sha256:f7b58d1fd3551b8c80a971199543379be1cee3d0d409e1f6d8b01c1a2eebf1f8", size = 30170, upload-time = "2024-08-17T09:18:42.163Z" }, + { url = "https://files.pythonhosted.org/packages/d9/6b/1c443fe6cfeb4ad1dcf231cdec96eb94fb43d6498b4469ed8b51f8b59a37/xxhash-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:fa0cafd3a2af231b4e113fba24a65d7922af91aeb23774a8b78228e6cd785e3e", size = 30040, upload-time = "2024-08-17T09:18:43.699Z" }, + { url = "https://files.pythonhosted.org/packages/0f/eb/04405305f290173acc0350eba6d2f1a794b57925df0398861a20fbafa415/xxhash-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:586886c7e89cb9828bcd8a5686b12e161368e0064d040e225e72607b43858ba2", size = 26796, upload-time = "2024-08-17T09:18:45.29Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b8/e4b3ad92d249be5c83fa72916c9091b0965cb0faeff05d9a0a3870ae6bff/xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6", size = 31795, upload-time = "2024-08-17T09:18:46.813Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d8/b3627a0aebfbfa4c12a41e22af3742cf08c8ea84f5cc3367b5de2d039cce/xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5", size = 30792, upload-time = "2024-08-17T09:18:47.862Z" }, + { url = "https://files.pythonhosted.org/packages/c3/cc/762312960691da989c7cd0545cb120ba2a4148741c6ba458aa723c00a3f8/xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc", size = 220950, upload-time = "2024-08-17T09:18:49.06Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e9/cc266f1042c3c13750e86a535496b58beb12bf8c50a915c336136f6168dc/xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3", size = 199980, upload-time = "2024-08-17T09:18:50.445Z" }, + { url = "https://files.pythonhosted.org/packages/bf/85/a836cd0dc5cc20376de26b346858d0ac9656f8f730998ca4324921a010b9/xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c", size = 428324, upload-time = "2024-08-17T09:18:51.988Z" }, + { url = "https://files.pythonhosted.org/packages/b4/0e/15c243775342ce840b9ba34aceace06a1148fa1630cd8ca269e3223987f5/xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb", size = 194370, upload-time = "2024-08-17T09:18:54.164Z" }, + { url = "https://files.pythonhosted.org/packages/87/a1/b028bb02636dfdc190da01951d0703b3d904301ed0ef6094d948983bef0e/xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f", size = 207911, upload-time = "2024-08-17T09:18:55.509Z" }, + { url = "https://files.pythonhosted.org/packages/80/d5/73c73b03fc0ac73dacf069fdf6036c9abad82de0a47549e9912c955ab449/xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7", size = 216352, upload-time = "2024-08-17T09:18:57.073Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2a/5043dba5ddbe35b4fe6ea0a111280ad9c3d4ba477dd0f2d1fe1129bda9d0/xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326", size = 203410, upload-time = "2024-08-17T09:18:58.54Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b2/9a8ded888b7b190aed75b484eb5c853ddd48aa2896e7b59bbfbce442f0a1/xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf", size = 210322, upload-time = "2024-08-17T09:18:59.943Z" }, + { url = "https://files.pythonhosted.org/packages/98/62/440083fafbc917bf3e4b67c2ade621920dd905517e85631c10aac955c1d2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7", size = 414725, upload-time = "2024-08-17T09:19:01.332Z" }, + { url = "https://files.pythonhosted.org/packages/75/db/009206f7076ad60a517e016bb0058381d96a007ce3f79fa91d3010f49cc2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c", size = 192070, upload-time = "2024-08-17T09:19:03.007Z" }, + { url = "https://files.pythonhosted.org/packages/1f/6d/c61e0668943a034abc3a569cdc5aeae37d686d9da7e39cf2ed621d533e36/xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637", size = 30172, upload-time = "2024-08-17T09:19:04.355Z" }, + { url = "https://files.pythonhosted.org/packages/96/14/8416dce965f35e3d24722cdf79361ae154fa23e2ab730e5323aa98d7919e/xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43", size = 30041, upload-time = "2024-08-17T09:19:05.435Z" }, + { url = "https://files.pythonhosted.org/packages/27/ee/518b72faa2073f5aa8e3262408d284892cb79cf2754ba0c3a5870645ef73/xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b", size = 26801, upload-time = "2024-08-17T09:19:06.547Z" }, ] [[package]] @@ -2392,75 +2406,75 @@ dependencies = [ { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/62/51/c0edba5219027f6eab262e139f73e2417b0f4efffa23bf562f6e18f76ca5/yarl-1.20.0.tar.gz", hash = "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307", size = 185258, upload_time = "2025-04-17T00:45:14.661Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/60/82/a59d8e21b20ffc836775fa7daedac51d16bb8f3010c4fcb495c4496aa922/yarl-1.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fdb5204d17cb32b2de2d1e21c7461cabfacf17f3645e4b9039f210c5d3378bf3", size = 145178, upload_time = "2025-04-17T00:42:04.511Z" }, - { url = "https://files.pythonhosted.org/packages/ba/81/315a3f6f95947cfbf37c92d6fbce42a1a6207b6c38e8c2b452499ec7d449/yarl-1.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eaddd7804d8e77d67c28d154ae5fab203163bd0998769569861258e525039d2a", size = 96859, upload_time = "2025-04-17T00:42:06.43Z" }, - { url = "https://files.pythonhosted.org/packages/ad/17/9b64e575583158551b72272a1023cdbd65af54fe13421d856b2850a6ddb7/yarl-1.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:634b7ba6b4a85cf67e9df7c13a7fb2e44fa37b5d34501038d174a63eaac25ee2", size = 94647, upload_time = "2025-04-17T00:42:07.976Z" }, - { url = "https://files.pythonhosted.org/packages/2c/29/8f291e7922a58a21349683f6120a85701aeefaa02e9f7c8a2dc24fe3f431/yarl-1.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d409e321e4addf7d97ee84162538c7258e53792eb7c6defd0c33647d754172e", size = 355788, upload_time = "2025-04-17T00:42:09.902Z" }, - { url = "https://files.pythonhosted.org/packages/26/6d/b4892c80b805c42c228c6d11e03cafabf81662d371b0853e7f0f513837d5/yarl-1.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ea52f7328a36960ba3231c6677380fa67811b414798a6e071c7085c57b6d20a9", size = 344613, upload_time = "2025-04-17T00:42:11.768Z" }, - { url = "https://files.pythonhosted.org/packages/d7/0e/517aa28d3f848589bae9593717b063a544b86ba0a807d943c70f48fcf3bb/yarl-1.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8703517b924463994c344dcdf99a2d5ce9eca2b6882bb640aa555fb5efc706a", size = 370953, upload_time = "2025-04-17T00:42:13.983Z" }, - { url = "https://files.pythonhosted.org/packages/5f/9b/5bd09d2f1ad6e6f7c2beae9e50db78edd2cca4d194d227b958955573e240/yarl-1.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:077989b09ffd2f48fb2d8f6a86c5fef02f63ffe6b1dd4824c76de7bb01e4f2e2", size = 369204, upload_time = "2025-04-17T00:42:16.386Z" }, - { url = "https://files.pythonhosted.org/packages/9c/85/d793a703cf4bd0d4cd04e4b13cc3d44149470f790230430331a0c1f52df5/yarl-1.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0acfaf1da020253f3533526e8b7dd212838fdc4109959a2c53cafc6db611bff2", size = 358108, upload_time = "2025-04-17T00:42:18.622Z" }, - { url = "https://files.pythonhosted.org/packages/6f/54/b6c71e13549c1f6048fbc14ce8d930ac5fb8bafe4f1a252e621a24f3f1f9/yarl-1.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4230ac0b97ec5eeb91d96b324d66060a43fd0d2a9b603e3327ed65f084e41f8", size = 346610, upload_time = "2025-04-17T00:42:20.9Z" }, - { url = "https://files.pythonhosted.org/packages/a0/1a/d6087d58bdd0d8a2a37bbcdffac9d9721af6ebe50d85304d9f9b57dfd862/yarl-1.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a6a1e6ae21cdd84011c24c78d7a126425148b24d437b5702328e4ba640a8902", size = 365378, upload_time = "2025-04-17T00:42:22.926Z" }, - { url = "https://files.pythonhosted.org/packages/02/84/e25ddff4cbc001dbc4af76f8d41a3e23818212dd1f0a52044cbc60568872/yarl-1.20.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:86de313371ec04dd2531f30bc41a5a1a96f25a02823558ee0f2af0beaa7ca791", size = 356919, upload_time = "2025-04-17T00:42:25.145Z" }, - { url = "https://files.pythonhosted.org/packages/04/76/898ae362353bf8f64636495d222c8014c8e5267df39b1a9fe1e1572fb7d0/yarl-1.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dd59c9dd58ae16eaa0f48c3d0cbe6be8ab4dc7247c3ff7db678edecbaf59327f", size = 364248, upload_time = "2025-04-17T00:42:27.475Z" }, - { url = "https://files.pythonhosted.org/packages/1b/b0/9d9198d83a622f1c40fdbf7bd13b224a6979f2e1fc2cf50bfb1d8773c495/yarl-1.20.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a0bc5e05f457b7c1994cc29e83b58f540b76234ba6b9648a4971ddc7f6aa52da", size = 378418, upload_time = "2025-04-17T00:42:29.333Z" }, - { url = "https://files.pythonhosted.org/packages/c7/ce/1f50c1cc594cf5d3f5bf4a9b616fca68680deaec8ad349d928445ac52eb8/yarl-1.20.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c9471ca18e6aeb0e03276b5e9b27b14a54c052d370a9c0c04a68cefbd1455eb4", size = 383850, upload_time = "2025-04-17T00:42:31.668Z" }, - { url = "https://files.pythonhosted.org/packages/89/1e/a59253a87b35bfec1a25bb5801fb69943330b67cfd266278eb07e0609012/yarl-1.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40ed574b4df723583a26c04b298b283ff171bcc387bc34c2683235e2487a65a5", size = 381218, upload_time = "2025-04-17T00:42:33.523Z" }, - { url = "https://files.pythonhosted.org/packages/85/b0/26f87df2b3044b0ef1a7cf66d321102bdca091db64c5ae853fcb2171c031/yarl-1.20.0-cp311-cp311-win32.whl", hash = "sha256:db243357c6c2bf3cd7e17080034ade668d54ce304d820c2a58514a4e51d0cfd6", size = 86606, upload_time = "2025-04-17T00:42:35.873Z" }, - { url = "https://files.pythonhosted.org/packages/33/46/ca335c2e1f90446a77640a45eeb1cd8f6934f2c6e4df7db0f0f36ef9f025/yarl-1.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c12cd754d9dbd14204c328915e23b0c361b88f3cffd124129955e60a4fbfcfb", size = 93374, upload_time = "2025-04-17T00:42:37.586Z" }, - { url = "https://files.pythonhosted.org/packages/c3/e8/3efdcb83073df978bb5b1a9cc0360ce596680e6c3fac01f2a994ccbb8939/yarl-1.20.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f", size = 147089, upload_time = "2025-04-17T00:42:39.602Z" }, - { url = "https://files.pythonhosted.org/packages/60/c3/9e776e98ea350f76f94dd80b408eaa54e5092643dbf65fd9babcffb60509/yarl-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e", size = 97706, upload_time = "2025-04-17T00:42:41.469Z" }, - { url = "https://files.pythonhosted.org/packages/0c/5b/45cdfb64a3b855ce074ae607b9fc40bc82e7613b94e7612b030255c93a09/yarl-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e", size = 95719, upload_time = "2025-04-17T00:42:43.666Z" }, - { url = "https://files.pythonhosted.org/packages/2d/4e/929633b249611eeed04e2f861a14ed001acca3ef9ec2a984a757b1515889/yarl-1.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33", size = 343972, upload_time = "2025-04-17T00:42:45.391Z" }, - { url = "https://files.pythonhosted.org/packages/49/fd/047535d326c913f1a90407a3baf7ff535b10098611eaef2c527e32e81ca1/yarl-1.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58", size = 339639, upload_time = "2025-04-17T00:42:47.552Z" }, - { url = "https://files.pythonhosted.org/packages/48/2f/11566f1176a78f4bafb0937c0072410b1b0d3640b297944a6a7a556e1d0b/yarl-1.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f", size = 353745, upload_time = "2025-04-17T00:42:49.406Z" }, - { url = "https://files.pythonhosted.org/packages/26/17/07dfcf034d6ae8837b33988be66045dd52f878dfb1c4e8f80a7343f677be/yarl-1.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae", size = 354178, upload_time = "2025-04-17T00:42:51.588Z" }, - { url = "https://files.pythonhosted.org/packages/15/45/212604d3142d84b4065d5f8cab6582ed3d78e4cc250568ef2a36fe1cf0a5/yarl-1.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018", size = 349219, upload_time = "2025-04-17T00:42:53.674Z" }, - { url = "https://files.pythonhosted.org/packages/e6/e0/a10b30f294111c5f1c682461e9459935c17d467a760c21e1f7db400ff499/yarl-1.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672", size = 337266, upload_time = "2025-04-17T00:42:55.49Z" }, - { url = "https://files.pythonhosted.org/packages/33/a6/6efa1d85a675d25a46a167f9f3e80104cde317dfdf7f53f112ae6b16a60a/yarl-1.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8", size = 360873, upload_time = "2025-04-17T00:42:57.895Z" }, - { url = "https://files.pythonhosted.org/packages/77/67/c8ab718cb98dfa2ae9ba0f97bf3cbb7d45d37f13fe1fbad25ac92940954e/yarl-1.20.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7", size = 360524, upload_time = "2025-04-17T00:43:00.094Z" }, - { url = "https://files.pythonhosted.org/packages/bd/e8/c3f18660cea1bc73d9f8a2b3ef423def8dadbbae6c4afabdb920b73e0ead/yarl-1.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594", size = 365370, upload_time = "2025-04-17T00:43:02.242Z" }, - { url = "https://files.pythonhosted.org/packages/c9/99/33f3b97b065e62ff2d52817155a89cfa030a1a9b43fee7843ef560ad9603/yarl-1.20.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6", size = 373297, upload_time = "2025-04-17T00:43:04.189Z" }, - { url = "https://files.pythonhosted.org/packages/3d/89/7519e79e264a5f08653d2446b26d4724b01198a93a74d2e259291d538ab1/yarl-1.20.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1", size = 378771, upload_time = "2025-04-17T00:43:06.609Z" }, - { url = "https://files.pythonhosted.org/packages/3a/58/6c460bbb884abd2917c3eef6f663a4a873f8dc6f498561fc0ad92231c113/yarl-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b", size = 375000, upload_time = "2025-04-17T00:43:09.01Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2a/dd7ed1aa23fea996834278d7ff178f215b24324ee527df53d45e34d21d28/yarl-1.20.0-cp312-cp312-win32.whl", hash = "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64", size = 86355, upload_time = "2025-04-17T00:43:11.311Z" }, - { url = "https://files.pythonhosted.org/packages/ca/c6/333fe0338305c0ac1c16d5aa7cc4841208d3252bbe62172e0051006b5445/yarl-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c", size = 92904, upload_time = "2025-04-17T00:43:13.087Z" }, - { url = "https://files.pythonhosted.org/packages/0f/6f/514c9bff2900c22a4f10e06297714dbaf98707143b37ff0bcba65a956221/yarl-1.20.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f", size = 145030, upload_time = "2025-04-17T00:43:15.083Z" }, - { url = "https://files.pythonhosted.org/packages/4e/9d/f88da3fa319b8c9c813389bfb3463e8d777c62654c7168e580a13fadff05/yarl-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3", size = 96894, upload_time = "2025-04-17T00:43:17.372Z" }, - { url = "https://files.pythonhosted.org/packages/cd/57/92e83538580a6968b2451d6c89c5579938a7309d4785748e8ad42ddafdce/yarl-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d", size = 94457, upload_time = "2025-04-17T00:43:19.431Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ee/7ee43bd4cf82dddd5da97fcaddb6fa541ab81f3ed564c42f146c83ae17ce/yarl-1.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0", size = 343070, upload_time = "2025-04-17T00:43:21.426Z" }, - { url = "https://files.pythonhosted.org/packages/4a/12/b5eccd1109e2097bcc494ba7dc5de156e41cf8309fab437ebb7c2b296ce3/yarl-1.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501", size = 337739, upload_time = "2025-04-17T00:43:23.634Z" }, - { url = "https://files.pythonhosted.org/packages/7d/6b/0eade8e49af9fc2585552f63c76fa59ef469c724cc05b29519b19aa3a6d5/yarl-1.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc", size = 351338, upload_time = "2025-04-17T00:43:25.695Z" }, - { url = "https://files.pythonhosted.org/packages/45/cb/aaaa75d30087b5183c7b8a07b4fb16ae0682dd149a1719b3a28f54061754/yarl-1.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d", size = 353636, upload_time = "2025-04-17T00:43:27.876Z" }, - { url = "https://files.pythonhosted.org/packages/98/9d/d9cb39ec68a91ba6e66fa86d97003f58570327d6713833edf7ad6ce9dde5/yarl-1.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0", size = 348061, upload_time = "2025-04-17T00:43:29.788Z" }, - { url = "https://files.pythonhosted.org/packages/72/6b/103940aae893d0cc770b4c36ce80e2ed86fcb863d48ea80a752b8bda9303/yarl-1.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a", size = 334150, upload_time = "2025-04-17T00:43:31.742Z" }, - { url = "https://files.pythonhosted.org/packages/ef/b2/986bd82aa222c3e6b211a69c9081ba46484cffa9fab2a5235e8d18ca7a27/yarl-1.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2", size = 362207, upload_time = "2025-04-17T00:43:34.099Z" }, - { url = "https://files.pythonhosted.org/packages/14/7c/63f5922437b873795d9422cbe7eb2509d4b540c37ae5548a4bb68fd2c546/yarl-1.20.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9", size = 361277, upload_time = "2025-04-17T00:43:36.202Z" }, - { url = "https://files.pythonhosted.org/packages/81/83/450938cccf732466953406570bdb42c62b5ffb0ac7ac75a1f267773ab5c8/yarl-1.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5", size = 364990, upload_time = "2025-04-17T00:43:38.551Z" }, - { url = "https://files.pythonhosted.org/packages/b4/de/af47d3a47e4a833693b9ec8e87debb20f09d9fdc9139b207b09a3e6cbd5a/yarl-1.20.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877", size = 374684, upload_time = "2025-04-17T00:43:40.481Z" }, - { url = "https://files.pythonhosted.org/packages/62/0b/078bcc2d539f1faffdc7d32cb29a2d7caa65f1a6f7e40795d8485db21851/yarl-1.20.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e", size = 382599, upload_time = "2025-04-17T00:43:42.463Z" }, - { url = "https://files.pythonhosted.org/packages/74/a9/4fdb1a7899f1fb47fd1371e7ba9e94bff73439ce87099d5dd26d285fffe0/yarl-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384", size = 378573, upload_time = "2025-04-17T00:43:44.797Z" }, - { url = "https://files.pythonhosted.org/packages/fd/be/29f5156b7a319e4d2e5b51ce622b4dfb3aa8d8204cd2a8a339340fbfad40/yarl-1.20.0-cp313-cp313-win32.whl", hash = "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62", size = 86051, upload_time = "2025-04-17T00:43:47.076Z" }, - { url = "https://files.pythonhosted.org/packages/52/56/05fa52c32c301da77ec0b5f63d2d9605946fe29defacb2a7ebd473c23b81/yarl-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c", size = 92742, upload_time = "2025-04-17T00:43:49.193Z" }, - { url = "https://files.pythonhosted.org/packages/d4/2f/422546794196519152fc2e2f475f0e1d4d094a11995c81a465faf5673ffd/yarl-1.20.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051", size = 163575, upload_time = "2025-04-17T00:43:51.533Z" }, - { url = "https://files.pythonhosted.org/packages/90/fc/67c64ddab6c0b4a169d03c637fb2d2a212b536e1989dec8e7e2c92211b7f/yarl-1.20.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d", size = 106121, upload_time = "2025-04-17T00:43:53.506Z" }, - { url = "https://files.pythonhosted.org/packages/6d/00/29366b9eba7b6f6baed7d749f12add209b987c4cfbfa418404dbadc0f97c/yarl-1.20.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229", size = 103815, upload_time = "2025-04-17T00:43:55.41Z" }, - { url = "https://files.pythonhosted.org/packages/28/f4/a2a4c967c8323c03689383dff73396281ced3b35d0ed140580825c826af7/yarl-1.20.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1", size = 408231, upload_time = "2025-04-17T00:43:57.825Z" }, - { url = "https://files.pythonhosted.org/packages/0f/a1/66f7ffc0915877d726b70cc7a896ac30b6ac5d1d2760613603b022173635/yarl-1.20.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb", size = 390221, upload_time = "2025-04-17T00:44:00.526Z" }, - { url = "https://files.pythonhosted.org/packages/41/15/cc248f0504610283271615e85bf38bc014224122498c2016d13a3a1b8426/yarl-1.20.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00", size = 411400, upload_time = "2025-04-17T00:44:02.853Z" }, - { url = "https://files.pythonhosted.org/packages/5c/af/f0823d7e092bfb97d24fce6c7269d67fcd1aefade97d0a8189c4452e4d5e/yarl-1.20.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de", size = 411714, upload_time = "2025-04-17T00:44:04.904Z" }, - { url = "https://files.pythonhosted.org/packages/83/70/be418329eae64b9f1b20ecdaac75d53aef098797d4c2299d82ae6f8e4663/yarl-1.20.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5", size = 404279, upload_time = "2025-04-17T00:44:07.721Z" }, - { url = "https://files.pythonhosted.org/packages/19/f5/52e02f0075f65b4914eb890eea1ba97e6fd91dd821cc33a623aa707b2f67/yarl-1.20.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a", size = 384044, upload_time = "2025-04-17T00:44:09.708Z" }, - { url = "https://files.pythonhosted.org/packages/6a/36/b0fa25226b03d3f769c68d46170b3e92b00ab3853d73127273ba22474697/yarl-1.20.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9", size = 416236, upload_time = "2025-04-17T00:44:11.734Z" }, - { url = "https://files.pythonhosted.org/packages/cb/3a/54c828dd35f6831dfdd5a79e6c6b4302ae2c5feca24232a83cb75132b205/yarl-1.20.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145", size = 402034, upload_time = "2025-04-17T00:44:13.975Z" }, - { url = "https://files.pythonhosted.org/packages/10/97/c7bf5fba488f7e049f9ad69c1b8fdfe3daa2e8916b3d321aa049e361a55a/yarl-1.20.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda", size = 407943, upload_time = "2025-04-17T00:44:16.052Z" }, - { url = "https://files.pythonhosted.org/packages/fd/a4/022d2555c1e8fcff08ad7f0f43e4df3aba34f135bff04dd35d5526ce54ab/yarl-1.20.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f", size = 423058, upload_time = "2025-04-17T00:44:18.547Z" }, - { url = "https://files.pythonhosted.org/packages/4c/f6/0873a05563e5df29ccf35345a6ae0ac9e66588b41fdb7043a65848f03139/yarl-1.20.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd", size = 423792, upload_time = "2025-04-17T00:44:20.639Z" }, - { url = "https://files.pythonhosted.org/packages/9e/35/43fbbd082708fa42e923f314c24f8277a28483d219e049552e5007a9aaca/yarl-1.20.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f", size = 422242, upload_time = "2025-04-17T00:44:22.851Z" }, - { url = "https://files.pythonhosted.org/packages/ed/f7/f0f2500cf0c469beb2050b522c7815c575811627e6d3eb9ec7550ddd0bfe/yarl-1.20.0-cp313-cp313t-win32.whl", hash = "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac", size = 93816, upload_time = "2025-04-17T00:44:25.491Z" }, - { url = "https://files.pythonhosted.org/packages/3f/93/f73b61353b2a699d489e782c3f5998b59f974ec3156a2050a52dfd7e8946/yarl-1.20.0-cp313-cp313t-win_amd64.whl", hash = "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe", size = 101093, upload_time = "2025-04-17T00:44:27.418Z" }, - { url = "https://files.pythonhosted.org/packages/ea/1f/70c57b3d7278e94ed22d85e09685d3f0a38ebdd8c5c73b65ba4c0d0fe002/yarl-1.20.0-py3-none-any.whl", hash = "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124", size = 46124, upload_time = "2025-04-17T00:45:12.199Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/62/51/c0edba5219027f6eab262e139f73e2417b0f4efffa23bf562f6e18f76ca5/yarl-1.20.0.tar.gz", hash = "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307", size = 185258, upload-time = "2025-04-17T00:45:14.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/82/a59d8e21b20ffc836775fa7daedac51d16bb8f3010c4fcb495c4496aa922/yarl-1.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fdb5204d17cb32b2de2d1e21c7461cabfacf17f3645e4b9039f210c5d3378bf3", size = 145178, upload-time = "2025-04-17T00:42:04.511Z" }, + { url = "https://files.pythonhosted.org/packages/ba/81/315a3f6f95947cfbf37c92d6fbce42a1a6207b6c38e8c2b452499ec7d449/yarl-1.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eaddd7804d8e77d67c28d154ae5fab203163bd0998769569861258e525039d2a", size = 96859, upload-time = "2025-04-17T00:42:06.43Z" }, + { url = "https://files.pythonhosted.org/packages/ad/17/9b64e575583158551b72272a1023cdbd65af54fe13421d856b2850a6ddb7/yarl-1.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:634b7ba6b4a85cf67e9df7c13a7fb2e44fa37b5d34501038d174a63eaac25ee2", size = 94647, upload-time = "2025-04-17T00:42:07.976Z" }, + { url = "https://files.pythonhosted.org/packages/2c/29/8f291e7922a58a21349683f6120a85701aeefaa02e9f7c8a2dc24fe3f431/yarl-1.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d409e321e4addf7d97ee84162538c7258e53792eb7c6defd0c33647d754172e", size = 355788, upload-time = "2025-04-17T00:42:09.902Z" }, + { url = "https://files.pythonhosted.org/packages/26/6d/b4892c80b805c42c228c6d11e03cafabf81662d371b0853e7f0f513837d5/yarl-1.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ea52f7328a36960ba3231c6677380fa67811b414798a6e071c7085c57b6d20a9", size = 344613, upload-time = "2025-04-17T00:42:11.768Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0e/517aa28d3f848589bae9593717b063a544b86ba0a807d943c70f48fcf3bb/yarl-1.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8703517b924463994c344dcdf99a2d5ce9eca2b6882bb640aa555fb5efc706a", size = 370953, upload-time = "2025-04-17T00:42:13.983Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9b/5bd09d2f1ad6e6f7c2beae9e50db78edd2cca4d194d227b958955573e240/yarl-1.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:077989b09ffd2f48fb2d8f6a86c5fef02f63ffe6b1dd4824c76de7bb01e4f2e2", size = 369204, upload-time = "2025-04-17T00:42:16.386Z" }, + { url = "https://files.pythonhosted.org/packages/9c/85/d793a703cf4bd0d4cd04e4b13cc3d44149470f790230430331a0c1f52df5/yarl-1.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0acfaf1da020253f3533526e8b7dd212838fdc4109959a2c53cafc6db611bff2", size = 358108, upload-time = "2025-04-17T00:42:18.622Z" }, + { url = "https://files.pythonhosted.org/packages/6f/54/b6c71e13549c1f6048fbc14ce8d930ac5fb8bafe4f1a252e621a24f3f1f9/yarl-1.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4230ac0b97ec5eeb91d96b324d66060a43fd0d2a9b603e3327ed65f084e41f8", size = 346610, upload-time = "2025-04-17T00:42:20.9Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1a/d6087d58bdd0d8a2a37bbcdffac9d9721af6ebe50d85304d9f9b57dfd862/yarl-1.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a6a1e6ae21cdd84011c24c78d7a126425148b24d437b5702328e4ba640a8902", size = 365378, upload-time = "2025-04-17T00:42:22.926Z" }, + { url = "https://files.pythonhosted.org/packages/02/84/e25ddff4cbc001dbc4af76f8d41a3e23818212dd1f0a52044cbc60568872/yarl-1.20.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:86de313371ec04dd2531f30bc41a5a1a96f25a02823558ee0f2af0beaa7ca791", size = 356919, upload-time = "2025-04-17T00:42:25.145Z" }, + { url = "https://files.pythonhosted.org/packages/04/76/898ae362353bf8f64636495d222c8014c8e5267df39b1a9fe1e1572fb7d0/yarl-1.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dd59c9dd58ae16eaa0f48c3d0cbe6be8ab4dc7247c3ff7db678edecbaf59327f", size = 364248, upload-time = "2025-04-17T00:42:27.475Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b0/9d9198d83a622f1c40fdbf7bd13b224a6979f2e1fc2cf50bfb1d8773c495/yarl-1.20.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a0bc5e05f457b7c1994cc29e83b58f540b76234ba6b9648a4971ddc7f6aa52da", size = 378418, upload-time = "2025-04-17T00:42:29.333Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ce/1f50c1cc594cf5d3f5bf4a9b616fca68680deaec8ad349d928445ac52eb8/yarl-1.20.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c9471ca18e6aeb0e03276b5e9b27b14a54c052d370a9c0c04a68cefbd1455eb4", size = 383850, upload-time = "2025-04-17T00:42:31.668Z" }, + { url = "https://files.pythonhosted.org/packages/89/1e/a59253a87b35bfec1a25bb5801fb69943330b67cfd266278eb07e0609012/yarl-1.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40ed574b4df723583a26c04b298b283ff171bcc387bc34c2683235e2487a65a5", size = 381218, upload-time = "2025-04-17T00:42:33.523Z" }, + { url = "https://files.pythonhosted.org/packages/85/b0/26f87df2b3044b0ef1a7cf66d321102bdca091db64c5ae853fcb2171c031/yarl-1.20.0-cp311-cp311-win32.whl", hash = "sha256:db243357c6c2bf3cd7e17080034ade668d54ce304d820c2a58514a4e51d0cfd6", size = 86606, upload-time = "2025-04-17T00:42:35.873Z" }, + { url = "https://files.pythonhosted.org/packages/33/46/ca335c2e1f90446a77640a45eeb1cd8f6934f2c6e4df7db0f0f36ef9f025/yarl-1.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c12cd754d9dbd14204c328915e23b0c361b88f3cffd124129955e60a4fbfcfb", size = 93374, upload-time = "2025-04-17T00:42:37.586Z" }, + { url = "https://files.pythonhosted.org/packages/c3/e8/3efdcb83073df978bb5b1a9cc0360ce596680e6c3fac01f2a994ccbb8939/yarl-1.20.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f", size = 147089, upload-time = "2025-04-17T00:42:39.602Z" }, + { url = "https://files.pythonhosted.org/packages/60/c3/9e776e98ea350f76f94dd80b408eaa54e5092643dbf65fd9babcffb60509/yarl-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e", size = 97706, upload-time = "2025-04-17T00:42:41.469Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/45cdfb64a3b855ce074ae607b9fc40bc82e7613b94e7612b030255c93a09/yarl-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e", size = 95719, upload-time = "2025-04-17T00:42:43.666Z" }, + { url = "https://files.pythonhosted.org/packages/2d/4e/929633b249611eeed04e2f861a14ed001acca3ef9ec2a984a757b1515889/yarl-1.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33", size = 343972, upload-time = "2025-04-17T00:42:45.391Z" }, + { url = "https://files.pythonhosted.org/packages/49/fd/047535d326c913f1a90407a3baf7ff535b10098611eaef2c527e32e81ca1/yarl-1.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58", size = 339639, upload-time = "2025-04-17T00:42:47.552Z" }, + { url = "https://files.pythonhosted.org/packages/48/2f/11566f1176a78f4bafb0937c0072410b1b0d3640b297944a6a7a556e1d0b/yarl-1.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f", size = 353745, upload-time = "2025-04-17T00:42:49.406Z" }, + { url = "https://files.pythonhosted.org/packages/26/17/07dfcf034d6ae8837b33988be66045dd52f878dfb1c4e8f80a7343f677be/yarl-1.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae", size = 354178, upload-time = "2025-04-17T00:42:51.588Z" }, + { url = "https://files.pythonhosted.org/packages/15/45/212604d3142d84b4065d5f8cab6582ed3d78e4cc250568ef2a36fe1cf0a5/yarl-1.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018", size = 349219, upload-time = "2025-04-17T00:42:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e0/a10b30f294111c5f1c682461e9459935c17d467a760c21e1f7db400ff499/yarl-1.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672", size = 337266, upload-time = "2025-04-17T00:42:55.49Z" }, + { url = "https://files.pythonhosted.org/packages/33/a6/6efa1d85a675d25a46a167f9f3e80104cde317dfdf7f53f112ae6b16a60a/yarl-1.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8", size = 360873, upload-time = "2025-04-17T00:42:57.895Z" }, + { url = "https://files.pythonhosted.org/packages/77/67/c8ab718cb98dfa2ae9ba0f97bf3cbb7d45d37f13fe1fbad25ac92940954e/yarl-1.20.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7", size = 360524, upload-time = "2025-04-17T00:43:00.094Z" }, + { url = "https://files.pythonhosted.org/packages/bd/e8/c3f18660cea1bc73d9f8a2b3ef423def8dadbbae6c4afabdb920b73e0ead/yarl-1.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594", size = 365370, upload-time = "2025-04-17T00:43:02.242Z" }, + { url = "https://files.pythonhosted.org/packages/c9/99/33f3b97b065e62ff2d52817155a89cfa030a1a9b43fee7843ef560ad9603/yarl-1.20.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6", size = 373297, upload-time = "2025-04-17T00:43:04.189Z" }, + { url = "https://files.pythonhosted.org/packages/3d/89/7519e79e264a5f08653d2446b26d4724b01198a93a74d2e259291d538ab1/yarl-1.20.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1", size = 378771, upload-time = "2025-04-17T00:43:06.609Z" }, + { url = "https://files.pythonhosted.org/packages/3a/58/6c460bbb884abd2917c3eef6f663a4a873f8dc6f498561fc0ad92231c113/yarl-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b", size = 375000, upload-time = "2025-04-17T00:43:09.01Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/dd7ed1aa23fea996834278d7ff178f215b24324ee527df53d45e34d21d28/yarl-1.20.0-cp312-cp312-win32.whl", hash = "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64", size = 86355, upload-time = "2025-04-17T00:43:11.311Z" }, + { url = "https://files.pythonhosted.org/packages/ca/c6/333fe0338305c0ac1c16d5aa7cc4841208d3252bbe62172e0051006b5445/yarl-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c", size = 92904, upload-time = "2025-04-17T00:43:13.087Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6f/514c9bff2900c22a4f10e06297714dbaf98707143b37ff0bcba65a956221/yarl-1.20.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f", size = 145030, upload-time = "2025-04-17T00:43:15.083Z" }, + { url = "https://files.pythonhosted.org/packages/4e/9d/f88da3fa319b8c9c813389bfb3463e8d777c62654c7168e580a13fadff05/yarl-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3", size = 96894, upload-time = "2025-04-17T00:43:17.372Z" }, + { url = "https://files.pythonhosted.org/packages/cd/57/92e83538580a6968b2451d6c89c5579938a7309d4785748e8ad42ddafdce/yarl-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d", size = 94457, upload-time = "2025-04-17T00:43:19.431Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ee/7ee43bd4cf82dddd5da97fcaddb6fa541ab81f3ed564c42f146c83ae17ce/yarl-1.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0", size = 343070, upload-time = "2025-04-17T00:43:21.426Z" }, + { url = "https://files.pythonhosted.org/packages/4a/12/b5eccd1109e2097bcc494ba7dc5de156e41cf8309fab437ebb7c2b296ce3/yarl-1.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501", size = 337739, upload-time = "2025-04-17T00:43:23.634Z" }, + { url = "https://files.pythonhosted.org/packages/7d/6b/0eade8e49af9fc2585552f63c76fa59ef469c724cc05b29519b19aa3a6d5/yarl-1.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc", size = 351338, upload-time = "2025-04-17T00:43:25.695Z" }, + { url = "https://files.pythonhosted.org/packages/45/cb/aaaa75d30087b5183c7b8a07b4fb16ae0682dd149a1719b3a28f54061754/yarl-1.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d", size = 353636, upload-time = "2025-04-17T00:43:27.876Z" }, + { url = "https://files.pythonhosted.org/packages/98/9d/d9cb39ec68a91ba6e66fa86d97003f58570327d6713833edf7ad6ce9dde5/yarl-1.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0", size = 348061, upload-time = "2025-04-17T00:43:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/72/6b/103940aae893d0cc770b4c36ce80e2ed86fcb863d48ea80a752b8bda9303/yarl-1.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a", size = 334150, upload-time = "2025-04-17T00:43:31.742Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b2/986bd82aa222c3e6b211a69c9081ba46484cffa9fab2a5235e8d18ca7a27/yarl-1.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2", size = 362207, upload-time = "2025-04-17T00:43:34.099Z" }, + { url = "https://files.pythonhosted.org/packages/14/7c/63f5922437b873795d9422cbe7eb2509d4b540c37ae5548a4bb68fd2c546/yarl-1.20.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9", size = 361277, upload-time = "2025-04-17T00:43:36.202Z" }, + { url = "https://files.pythonhosted.org/packages/81/83/450938cccf732466953406570bdb42c62b5ffb0ac7ac75a1f267773ab5c8/yarl-1.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5", size = 364990, upload-time = "2025-04-17T00:43:38.551Z" }, + { url = "https://files.pythonhosted.org/packages/b4/de/af47d3a47e4a833693b9ec8e87debb20f09d9fdc9139b207b09a3e6cbd5a/yarl-1.20.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877", size = 374684, upload-time = "2025-04-17T00:43:40.481Z" }, + { url = "https://files.pythonhosted.org/packages/62/0b/078bcc2d539f1faffdc7d32cb29a2d7caa65f1a6f7e40795d8485db21851/yarl-1.20.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e", size = 382599, upload-time = "2025-04-17T00:43:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/74/a9/4fdb1a7899f1fb47fd1371e7ba9e94bff73439ce87099d5dd26d285fffe0/yarl-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384", size = 378573, upload-time = "2025-04-17T00:43:44.797Z" }, + { url = "https://files.pythonhosted.org/packages/fd/be/29f5156b7a319e4d2e5b51ce622b4dfb3aa8d8204cd2a8a339340fbfad40/yarl-1.20.0-cp313-cp313-win32.whl", hash = "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62", size = 86051, upload-time = "2025-04-17T00:43:47.076Z" }, + { url = "https://files.pythonhosted.org/packages/52/56/05fa52c32c301da77ec0b5f63d2d9605946fe29defacb2a7ebd473c23b81/yarl-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c", size = 92742, upload-time = "2025-04-17T00:43:49.193Z" }, + { url = "https://files.pythonhosted.org/packages/d4/2f/422546794196519152fc2e2f475f0e1d4d094a11995c81a465faf5673ffd/yarl-1.20.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051", size = 163575, upload-time = "2025-04-17T00:43:51.533Z" }, + { url = "https://files.pythonhosted.org/packages/90/fc/67c64ddab6c0b4a169d03c637fb2d2a212b536e1989dec8e7e2c92211b7f/yarl-1.20.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d", size = 106121, upload-time = "2025-04-17T00:43:53.506Z" }, + { url = "https://files.pythonhosted.org/packages/6d/00/29366b9eba7b6f6baed7d749f12add209b987c4cfbfa418404dbadc0f97c/yarl-1.20.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229", size = 103815, upload-time = "2025-04-17T00:43:55.41Z" }, + { url = "https://files.pythonhosted.org/packages/28/f4/a2a4c967c8323c03689383dff73396281ced3b35d0ed140580825c826af7/yarl-1.20.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1", size = 408231, upload-time = "2025-04-17T00:43:57.825Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a1/66f7ffc0915877d726b70cc7a896ac30b6ac5d1d2760613603b022173635/yarl-1.20.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb", size = 390221, upload-time = "2025-04-17T00:44:00.526Z" }, + { url = "https://files.pythonhosted.org/packages/41/15/cc248f0504610283271615e85bf38bc014224122498c2016d13a3a1b8426/yarl-1.20.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00", size = 411400, upload-time = "2025-04-17T00:44:02.853Z" }, + { url = "https://files.pythonhosted.org/packages/5c/af/f0823d7e092bfb97d24fce6c7269d67fcd1aefade97d0a8189c4452e4d5e/yarl-1.20.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de", size = 411714, upload-time = "2025-04-17T00:44:04.904Z" }, + { url = "https://files.pythonhosted.org/packages/83/70/be418329eae64b9f1b20ecdaac75d53aef098797d4c2299d82ae6f8e4663/yarl-1.20.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5", size = 404279, upload-time = "2025-04-17T00:44:07.721Z" }, + { url = "https://files.pythonhosted.org/packages/19/f5/52e02f0075f65b4914eb890eea1ba97e6fd91dd821cc33a623aa707b2f67/yarl-1.20.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a", size = 384044, upload-time = "2025-04-17T00:44:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/6a/36/b0fa25226b03d3f769c68d46170b3e92b00ab3853d73127273ba22474697/yarl-1.20.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9", size = 416236, upload-time = "2025-04-17T00:44:11.734Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3a/54c828dd35f6831dfdd5a79e6c6b4302ae2c5feca24232a83cb75132b205/yarl-1.20.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145", size = 402034, upload-time = "2025-04-17T00:44:13.975Z" }, + { url = "https://files.pythonhosted.org/packages/10/97/c7bf5fba488f7e049f9ad69c1b8fdfe3daa2e8916b3d321aa049e361a55a/yarl-1.20.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda", size = 407943, upload-time = "2025-04-17T00:44:16.052Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a4/022d2555c1e8fcff08ad7f0f43e4df3aba34f135bff04dd35d5526ce54ab/yarl-1.20.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f", size = 423058, upload-time = "2025-04-17T00:44:18.547Z" }, + { url = "https://files.pythonhosted.org/packages/4c/f6/0873a05563e5df29ccf35345a6ae0ac9e66588b41fdb7043a65848f03139/yarl-1.20.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd", size = 423792, upload-time = "2025-04-17T00:44:20.639Z" }, + { url = "https://files.pythonhosted.org/packages/9e/35/43fbbd082708fa42e923f314c24f8277a28483d219e049552e5007a9aaca/yarl-1.20.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f", size = 422242, upload-time = "2025-04-17T00:44:22.851Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f7/f0f2500cf0c469beb2050b522c7815c575811627e6d3eb9ec7550ddd0bfe/yarl-1.20.0-cp313-cp313t-win32.whl", hash = "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac", size = 93816, upload-time = "2025-04-17T00:44:25.491Z" }, + { url = "https://files.pythonhosted.org/packages/3f/93/f73b61353b2a699d489e782c3f5998b59f974ec3156a2050a52dfd7e8946/yarl-1.20.0-cp313-cp313t-win_amd64.whl", hash = "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe", size = 101093, upload-time = "2025-04-17T00:44:27.418Z" }, + { url = "https://files.pythonhosted.org/packages/ea/1f/70c57b3d7278e94ed22d85e09685d3f0a38ebdd8c5c73b65ba4c0d0fe002/yarl-1.20.0-py3-none-any.whl", hash = "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124", size = 46124, upload-time = "2025-04-17T00:45:12.199Z" }, ] From 6a2e2a0049d0296eddd20a5f8b1e846d33271d2a Mon Sep 17 00:00:00 2001 From: maxachis Date: Tue, 27 May 2025 15:08:38 -0400 Subject: [PATCH 193/244] Adjust final review to not return URLs in the absence of user annotations --- collector_db/AsyncDatabaseClient.py | 75 ++++++++++--------- core/TaskManager.py | 2 - .../collector_db/test_db_client.py | 19 +---- 3 files changed, 42 insertions(+), 54 deletions(-) diff --git a/collector_db/AsyncDatabaseClient.py b/collector_db/AsyncDatabaseClient.py index b47f9ae4..81ab8de2 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/collector_db/AsyncDatabaseClient.py @@ -1018,27 +1018,44 @@ def annotations_exist_subquery(model: Type[Base]): ).subquery() ) - def count_subquery(model: Type[Base]): - return ( - select( - model.url_id, - func.count(model.url_id).label("count") - ).group_by(model.url_id).subquery() - ) + user_models = [ + UserRelevantSuggestion, + UserRecordTypeSuggestion, + UserUrlAgencySuggestion + ] models = [ AutoRelevantSuggestion, - UserRelevantSuggestion, AutoRecordTypeSuggestion, - UserRecordTypeSuggestion, AutomatedUrlAgencySuggestion, - UserUrlAgencySuggestion + *user_models + ] + + # The below relationships are joined directly to the URL + single_join_relationships = [ + URL.html_content, + URL.auto_record_type_suggestion, + URL.auto_relevant_suggestion, + URL.user_relevant_suggestion, + URL.user_record_type_suggestion, + URL.optional_data_source_metadata, + ] + + # The below relationships are joined to entities that are joined to the URL + double_join_relationships = [ + (URL.automated_agency_suggestions, AutomatedUrlAgencySuggestion.agency), + (URL.user_agency_suggestion, UserUrlAgencySuggestion.agency), + (URL.confirmed_agencies, ConfirmedURLAgency.agency) ] exist_subqueries = [ annotations_exist_subquery(model=model) for model in models ] + user_exist_subqueries = [ + annotations_exist_subquery(model=model) + for model in user_models + ] sum_of_exist_subqueries = ( sum( @@ -1064,39 +1081,27 @@ def count_subquery(model: Type[Base]): subquery, URL.id == subquery.c.url_id ) + where_subqueries = [ + subquery.c.exists == 1 + for subquery in user_exist_subqueries + ] + url_query = url_query.where( - URL.outcome == URLStatus.PENDING.value + and_( + URL.outcome == URLStatus.PENDING.value, + *where_subqueries ) + ) if batch_id is not None: url_query = url_query.where( URL.batch_id == batch_id ) - # The below relationships are joined directly to the URL - single_join_relationships = [ - URL.html_content, - URL.auto_record_type_suggestion, - URL.auto_relevant_suggestion, - URL.user_relevant_suggestion, - URL.user_record_type_suggestion, - URL.optional_data_source_metadata, - ] - - options = [ - joinedload(relationship) for relationship in single_join_relationships - ] - - # The below relationships are joined to entities that are joined to the URL - double_join_relationships = [ - (URL.automated_agency_suggestions, AutomatedUrlAgencySuggestion.agency), - (URL.user_agency_suggestion, UserUrlAgencySuggestion.agency), - (URL.confirmed_agencies, ConfirmedURLAgency.agency) - ] - for primary, secondary in double_join_relationships: - options.append(joinedload(primary).joinedload(secondary)) - # Apply options - url_query = url_query.options(*options) + url_query = url_query.options( + *[joinedload(relationship) for relationship in single_join_relationships], + *[joinedload(primary).joinedload(secondary) for primary, secondary in double_join_relationships] + ) # Apply order clause url_query = url_query.order_by( diff --git a/core/TaskManager.py b/core/TaskManager.py index c5f066e7..4dd92450 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -47,8 +47,6 @@ def __init__( self.task_trigger = FunctionTrigger(self.run_tasks) self.task_status: TaskType = TaskType.IDLE - - #region Task Operators async def get_url_html_task_operator(self): operator = URLHTMLTaskOperator( diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/test_automated/integration/collector_db/test_db_client.py index e5454343..b0c5e91d 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/test_automated/integration/collector_db/test_db_client.py @@ -273,7 +273,7 @@ async def test_get_next_url_for_final_review_favor_more_components(db_data_creat async def test_get_next_url_for_final_review_no_annotations(db_data_creator: DBDataCreator): """ Test in the case of one URL with no annotations. - Should be returned if it is the only one available. + No annotations should be returned """ batch_id = db_data_creator.batch() url_mapping = db_data_creator.urls(batch_id=batch_id, url_count=1).url_mappings[0] @@ -282,22 +282,7 @@ async def test_get_next_url_for_final_review_no_annotations(db_data_creator: DBD batch_id=None ) - assert result.id == url_mapping.url_id - - annotations = result.annotations - - agency = annotations.agency - assert agency.confirmed == [] - assert agency.auto.unknown is True - assert agency.auto.suggestions == [] - - record_type = annotations.record_type - assert record_type.auto is None - assert record_type.user is None - - relevant = annotations.relevant - assert relevant.auto is None - assert relevant.user is None + assert result is None @pytest.mark.asyncio async def test_get_next_url_for_final_review_only_confirmed_urls(db_data_creator: DBDataCreator): From b1878d50f400d9f2f24daa5927837163dff53815 Mon Sep 17 00:00:00 2001 From: maxachis Date: Tue, 27 May 2025 15:16:09 -0400 Subject: [PATCH 194/244] Remove test_example_collector_lifecycle_multiple_batches --- .../core/test_example_collector_lifecycle.py | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/tests/test_automated/integration/core/test_example_collector_lifecycle.py b/tests/test_automated/integration/core/test_example_collector_lifecycle.py index 65ffc001..18411457 100644 --- a/tests/test_automated/integration/core/test_example_collector_lifecycle.py +++ b/tests/test_automated/integration/core/test_example_collector_lifecycle.py @@ -65,45 +65,3 @@ async def test_example_collector_lifecycle( assert url_infos[0].url == "https://example.com" assert url_infos[1].url == "https://example.com/2" - -@pytest.mark.asyncio -async def test_example_collector_lifecycle_multiple_batches( - test_core: SourceCollectorCore, - test_async_core: AsyncCore, - monkeypatch -): - """ - Test the flow of an example collector, which generates fake urls - and saves them to the database - """ - barrier = await block_sleep(monkeypatch) - acore = test_async_core - core = test_core - csis: list[CollectorStartInfo] = [] - - - for i in range(3): - dto = ExampleInputDTO( - example_field="example_value", - sleep_time=1 - ) - csi: CollectorStartInfo = await acore.initiate_collector( - collector_type=CollectorType.EXAMPLE, - dto=dto, - user_id=1 - ) - csis.append(csi) - - await asyncio.sleep(0) - - for csi in csis: - print("Batch ID:", csi.batch_id) - assert core.get_status(csi.batch_id) == BatchStatus.IN_PROCESS - - barrier.release() - - await asyncio.sleep(0.15) - - for csi in csis: - assert core.get_status(csi.batch_id) == BatchStatus.READY_TO_LABEL - From 86d15e4fca69c1a37e7e2f73bc83882d993ed6fc Mon Sep 17 00:00:00 2001 From: maxachis Date: Tue, 27 May 2025 15:36:05 -0400 Subject: [PATCH 195/244] Rename `collector_db` -> `db` --- .github/workflows/test_app.yml | 4 +-- Dockerfile | 8 +---- README.md | 2 +- alembic/env.py | 4 +-- ...45b1c_add_task_tables_and_linking_logic.py | 2 +- ...19bf57df581a_add_url_agency_suggestions.py | 2 +- ...9_create_htmlcontent_and_rooturl_tables.py | 2 +- ...daf0_revise_agency_identification_logic.py | 2 +- api/main.py | 4 +-- api/routes/batch.py | 2 +- api/routes/task.py | 6 ++-- apply_migrations.py | 2 +- collector_manager/AsyncCollectorBase.py | 6 ++-- collector_manager/AsyncCollectorManager.py | 2 +- core/AsyncCore.py | 8 ++--- core/AsyncCoreLogger.py | 4 +-- core/DTOs/CollectionLifecycleInfo.py | 4 +-- core/DTOs/GetBatchLogsResponse.py | 2 +- core/DTOs/GetBatchStatusResponse.py | 2 +- core/DTOs/GetDuplicatesByBatchResponse.py | 2 +- ...GetNextRecordTypeAnnotationResponseInfo.py | 2 +- .../GetNextRelevanceAnnotationResponseInfo.py | 2 +- core/DTOs/GetTasksResponse.py | 2 +- core/DTOs/GetURLsByBatchResponse.py | 2 +- core/DTOs/GetURLsResponseInfo.py | 2 +- .../task_data_objects/URLRecordTypeTDO.py | 2 +- core/DTOs/task_data_objects/UrlHtmlTDO.py | 2 +- core/SourceCollectorCore.py | 2 +- core/TaskManager.py | 6 ++-- core/classes/HTMLContentInfoGetter.py | 2 +- .../AgencyIdentificationTaskOperator.py | 6 ++-- .../SubmitApprovedURLTaskOperator.py | 6 ++-- .../task_operators/TaskOperatorBase.py | 4 +-- .../task_operators/URL404ProbeTaskOperator.py | 4 +-- .../URLDuplicateTaskOperator.py | 4 +-- .../task_operators/URLHTMLTaskOperator.py | 8 ++--- .../URLMiscellaneousMetadataTaskOperator.py | 6 ++-- .../URLRecordTypeTaskOperator.py | 6 ++-- core/preprocessors/AutoGooglerPreprocessor.py | 2 +- core/preprocessors/CKANPreprocessor.py | 2 +- .../CommonCrawlerPreprocessor.py | 2 +- core/preprocessors/ExamplePreprocessor.py | 2 +- core/preprocessors/MuckrockPreprocessor.py | 2 +- core/preprocessors/PreprocessorBase.py | 2 +- {collector_db => db}/AsyncDatabaseClient.py | 30 +++++++++---------- {collector_db => db}/ConfigManager.py | 0 {collector_db => db}/DTOConverter.py | 8 ++--- {collector_db => db}/DTOs/BatchInfo.py | 0 {collector_db => db}/DTOs/DuplicateInfo.py | 0 .../DTOs/GetTaskStatusResponseInfo.py | 2 +- {collector_db => db}/DTOs/InsertURLsInfo.py | 2 +- {collector_db => db}/DTOs/LogInfo.py | 0 .../DTOs/MetadataAnnotationInfo.py | 0 {collector_db => db}/DTOs/README.md | 0 {collector_db => db}/DTOs/TaskInfo.py | 6 ++-- .../DTOs/URLAnnotationInfo.py | 2 +- {collector_db => db}/DTOs/URLErrorInfos.py | 0 .../DTOs/URLHTMLContentInfo.py | 0 {collector_db => db}/DTOs/URLInfo.py | 0 {collector_db => db}/DTOs/URLMapping.py | 0 {collector_db => db}/DTOs/URLMetadataInfo.py | 2 +- {collector_db => db}/DTOs/URLRelevancyInfo.py | 0 {collector_db => db}/DTOs/URLWithHTML.py | 2 +- {collector_db => db}/DTOs/__init__.py | 0 {collector_db => db}/DatabaseClient.py | 16 +++++----- {collector_db => db}/README.md | 0 {collector_db => db}/StatementComposer.py | 4 +-- {collector_db => db}/__init__.py | 0 {collector_db => db}/constants.py | 0 {collector_db => db}/enums.py | 0 {collector_db => db}/helper_functions.py | 0 {collector_db => db}/models.py | 2 +- docker-compose.yml | 2 +- html_tag_collector/DataClassTags.py | 2 +- html_tag_collector/RootURLCache.py | 2 +- llm_api_logic/DeepSeekRecordClassifier.py | 2 +- llm_api_logic/LLMRecordClassifierBase.py | 2 +- llm_api_logic/helpers.py | 2 +- tests/{test_alembic => alembic}/__init__.py | 0 tests/{test_alembic => alembic}/conftest.py | 2 +- tests/{test_alembic => alembic}/helpers.py | 0 .../test_revisions.py | 4 +-- tests/{test_automated => automated}/README.md | 0 .../{test_automated => automated}/__init__.py | 0 .../integration/__init__.py | 0 .../integration/api/__init__.py | 0 .../integration/api/conftest.py | 2 +- .../api/helpers/RequestValidator.py | 8 ++--- .../integration/api/helpers/__init__.py | 0 .../integration/api/test_annotate.py | 8 ++--- .../integration/api/test_batch.py | 4 +-- .../integration/api/test_duplicates.py | 4 +-- .../integration/api/test_example_collector.py | 6 ++-- .../integration/api/test_manual_batch.py | 2 +- .../integration/api/test_metrics.py | 0 .../integration/api/test_review.py | 4 +-- .../integration/api/test_root.py | 0 .../integration/api/test_search.py | 0 .../integration/api/test_task.py | 4 +-- .../integration/api/test_url.py | 2 +- .../integration/collector_db/README.md | 0 .../integration/collector_db/__init__.py | 0 .../collector_db/test_database_structure.py | 8 ++--- .../collector_db/test_db_client.py | 16 +++++----- .../integration/conftest.py | 2 +- .../integration/core/README.md | 0 .../integration/core/__init__.py | 0 .../integration/core/helpers/README.md | 0 .../integration/core/helpers/__init__.py | 0 .../integration/core/helpers/constants.py | 0 .../integration/core/test_async_core.py | 6 ++-- .../core/test_example_collector_lifecycle.py | 2 +- .../html_tag_collector/__init__.py | 0 .../html_tag_collector/test_root_url_cache.py | 0 .../integration/security_manager/__init__.py | 0 .../security_manager/test_security_manager.py | 0 .../integration/tasks/__init__.py | 0 .../integration/tasks/conftest.py | 0 .../tasks/test_agency_preannotation_task.py | 2 +- .../integration/tasks/test_example_task.py | 2 +- .../tasks/test_submit_approved_url_task.py | 4 +-- .../integration/tasks/test_url_404_probe.py | 2 +- .../tasks/test_url_duplicate_task.py | 4 +-- .../integration/tasks/test_url_html_task.py | 4 +-- .../test_url_miscellaneous_metadata_task.py | 2 +- .../tasks/test_url_record_type_task.py | 4 +-- .../unit/__init__.py | 0 .../unit/core/__init__.py | 0 .../unit/core/test_core_logger.py | 2 +- .../unit/dto/__init__.py | 0 .../unit/dto/test_all_annotation_post_info.py | 0 .../unit/security_manager/__init__.py | 0 .../security_manager/test_security_manager.py | 0 .../unit/source_collectors/__init__.py | 0 .../test_autogoogler_collector.py | 4 +-- .../source_collectors/test_ckan_collector.py | 2 +- .../test_common_crawl_collector.py | 4 +-- .../test_example_collector.py | 2 +- .../test_muckrock_collectors.py | 4 +-- .../unit/test_function_trigger.py | 0 tests/conftest.py | 8 ++--- tests/helpers/DBDataCreator.py | 20 ++++++------- tests/helpers/assert_functions.py | 4 +-- tests/helpers/complex_test_data_functions.py | 4 +-- .../lifecycle/test_auto_googler_lifecycle.py | 2 +- .../core/lifecycle/test_ckan_lifecycle.py | 2 +- .../lifecycle/test_muckrock_lifecycles.py | 2 +- .../test_html_tag_collector_integration.py | 4 +-- .../test_deepseek_record_classifier.py | 4 +-- .../test_openai_record_classifier.py | 4 +-- .../test_autogoogler_collector.py | 2 +- .../source_collectors/test_ckan_collector.py | 2 +- .../test_common_crawler_collector.py | 2 +- .../test_muckrock_collectors.py | 4 +-- 154 files changed, 211 insertions(+), 217 deletions(-) rename {collector_db => db}/AsyncDatabaseClient.py (98%) rename {collector_db => db}/ConfigManager.py (100%) rename {collector_db => db}/DTOConverter.py (95%) rename {collector_db => db}/DTOs/BatchInfo.py (100%) rename {collector_db => db}/DTOs/DuplicateInfo.py (100%) rename {collector_db => db}/DTOs/GetTaskStatusResponseInfo.py (71%) rename {collector_db => db}/DTOs/InsertURLsInfo.py (79%) rename {collector_db => db}/DTOs/LogInfo.py (100%) rename {collector_db => db}/DTOs/MetadataAnnotationInfo.py (100%) rename {collector_db => db}/DTOs/README.md (100%) rename {collector_db => db}/DTOs/TaskInfo.py (68%) rename {collector_db => db}/DTOs/URLAnnotationInfo.py (71%) rename {collector_db => db}/DTOs/URLErrorInfos.py (100%) rename {collector_db => db}/DTOs/URLHTMLContentInfo.py (100%) rename {collector_db => db}/DTOs/URLInfo.py (100%) rename {collector_db => db}/DTOs/URLMapping.py (100%) rename {collector_db => db}/DTOs/URLMetadataInfo.py (86%) rename {collector_db => db}/DTOs/URLRelevancyInfo.py (100%) rename {collector_db => db}/DTOs/URLWithHTML.py (66%) rename {collector_db => db}/DTOs/__init__.py (100%) rename {collector_db => db}/DatabaseClient.py (94%) rename {collector_db => db}/README.md (100%) rename {collector_db => db}/StatementComposer.py (94%) rename {collector_db => db}/__init__.py (100%) rename {collector_db => db}/constants.py (100%) rename {collector_db => db}/enums.py (100%) rename {collector_db => db}/helper_functions.py (100%) rename {collector_db => db}/models.py (99%) rename tests/{test_alembic => alembic}/__init__.py (100%) rename tests/{test_alembic => alembic}/conftest.py (95%) rename tests/{test_alembic => alembic}/helpers.py (100%) rename tests/{test_alembic => alembic}/test_revisions.py (98%) rename tests/{test_automated => automated}/README.md (100%) rename tests/{test_automated => automated}/__init__.py (100%) rename tests/{test_automated => automated}/integration/__init__.py (100%) rename tests/{test_automated => automated}/integration/api/__init__.py (100%) rename tests/{test_automated => automated}/integration/api/conftest.py (97%) rename tests/{test_automated => automated}/integration/api/helpers/RequestValidator.py (98%) rename tests/{test_automated => automated}/integration/api/helpers/__init__.py (100%) rename tests/{test_automated => automated}/integration/api/test_annotate.py (98%) rename tests/{test_automated => automated}/integration/api/test_batch.py (97%) rename tests/{test_automated => automated}/integration/api/test_duplicates.py (92%) rename tests/{test_automated => automated}/integration/api/test_example_collector.py (95%) rename tests/{test_automated => automated}/integration/api/test_manual_batch.py (98%) rename tests/{test_automated => automated}/integration/api/test_metrics.py (100%) rename tests/{test_automated => automated}/integration/api/test_review.py (97%) rename tests/{test_automated => automated}/integration/api/test_root.py (100%) rename tests/{test_automated => automated}/integration/api/test_search.py (100%) rename tests/{test_automated => automated}/integration/api/test_task.py (93%) rename tests/{test_automated => automated}/integration/api/test_url.py (95%) rename tests/{test_automated => automated}/integration/collector_db/README.md (100%) rename tests/{test_automated => automated}/integration/collector_db/__init__.py (100%) rename tests/{test_automated => automated}/integration/collector_db/test_database_structure.py (97%) rename tests/{test_automated => automated}/integration/collector_db/test_db_client.py (98%) rename tests/{test_automated => automated}/integration/conftest.py (93%) rename tests/{test_automated => automated}/integration/core/README.md (100%) rename tests/{test_automated => automated}/integration/core/__init__.py (100%) rename tests/{test_automated => automated}/integration/core/helpers/README.md (100%) rename tests/{test_automated => automated}/integration/core/helpers/__init__.py (100%) rename tests/{test_automated => automated}/integration/core/helpers/constants.py (100%) rename tests/{test_automated => automated}/integration/core/test_async_core.py (97%) rename tests/{test_automated => automated}/integration/core/test_example_collector_lifecycle.py (97%) rename tests/{test_automated => automated}/integration/html_tag_collector/__init__.py (100%) rename tests/{test_automated => automated}/integration/html_tag_collector/test_root_url_cache.py (100%) rename tests/{test_automated => automated}/integration/security_manager/__init__.py (100%) rename tests/{test_automated => automated}/integration/security_manager/test_security_manager.py (100%) rename tests/{test_automated => automated}/integration/tasks/__init__.py (100%) rename tests/{test_automated => automated}/integration/tasks/conftest.py (100%) rename tests/{test_automated => automated}/integration/tasks/test_agency_preannotation_task.py (99%) rename tests/{test_automated => automated}/integration/tasks/test_example_task.py (97%) rename tests/{test_automated => automated}/integration/tasks/test_submit_approved_url_task.py (98%) rename tests/{test_automated => automated}/integration/tasks/test_url_404_probe.py (99%) rename tests/{test_automated => automated}/integration/tasks/test_url_duplicate_task.py (96%) rename tests/{test_automated => automated}/integration/tasks/test_url_html_task.py (97%) rename tests/{test_automated => automated}/integration/tasks/test_url_miscellaneous_metadata_task.py (98%) rename tests/{test_automated => automated}/integration/tasks/test_url_record_type_task.py (95%) rename tests/{test_automated => automated}/unit/__init__.py (100%) rename tests/{test_automated => automated}/unit/core/__init__.py (100%) rename tests/{test_automated => automated}/unit/core/test_core_logger.py (94%) rename tests/{test_automated => automated}/unit/dto/__init__.py (100%) rename tests/{test_automated => automated}/unit/dto/test_all_annotation_post_info.py (100%) rename tests/{test_automated => automated}/unit/security_manager/__init__.py (100%) rename tests/{test_automated => automated}/unit/security_manager/test_security_manager.py (100%) rename tests/{test_automated => automated}/unit/source_collectors/__init__.py (100%) rename tests/{test_automated => automated}/unit/source_collectors/test_autogoogler_collector.py (92%) rename tests/{test_automated => automated}/unit/source_collectors/test_ckan_collector.py (97%) rename tests/{test_automated => automated}/unit/source_collectors/test_common_crawl_collector.py (93%) rename tests/{test_automated => automated}/unit/source_collectors/test_example_collector.py (90%) rename tests/{test_automated => automated}/unit/source_collectors/test_muckrock_collectors.py (98%) rename tests/{test_automated => automated}/unit/test_function_trigger.py (100%) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index 64bf664e..64164dc3 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -42,5 +42,5 @@ jobs: - name: Run tests run: | - uv run pytest tests/test_automated - uv run pytest tests/test_alembic + uv run pytest tests/automated + uv run pytest tests/alembic diff --git a/Dockerfile b/Dockerfile index 258a3a31..5ba90408 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,7 +18,7 @@ RUN playwright install chromium # Copy project files COPY api ./api -COPY collector_db ./collector_db +COPY db ./collector_db COPY collector_manager ./collector_manager COPY core ./core COPY html_tag_collector ./html_tag_collector @@ -32,12 +32,6 @@ COPY pdap_api_client ./pdap_api_client COPY execute.sh ./execute.sh COPY .project-root ./.project-root -COPY tests/conftest.py ./tests/conftest.py -COPY tests/__init__.py ./tests/__init__.py -COPY tests/test_automated ./tests/test_automated -COPY tests/test_alembic ./tests/test_alembic -COPY tests/helpers ./tests/helpers - COPY llm_api_logic ./llm_api_logic # Expose the application port diff --git a/README.md b/README.md index 701561db..794b968e 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ To access the API documentation, visit `http://{host}:8000/docs`. To run tests on the container, run: ```bash -docker exec data-source-identification-app-1 pytest /app/tests/test_automated +docker exec data-source-identification-app-1 pytest /app/tests/automated ``` Be sure to inspect the `docker-compose.yml` file in the root directory -- some environment variables are dependant upon the Operating System you are using. diff --git a/alembic/env.py b/alembic/env.py index 7eaa1a8b..3ba2f117 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -5,8 +5,8 @@ from sqlalchemy import engine_from_config from sqlalchemy import pool -from collector_db.helper_functions import get_postgres_connection_string -from collector_db.models import Base +from db.helper_functions import get_postgres_connection_string +from db.models import Base # this is the Alembic Config object, which provides # access to the values within the .ini file in use. diff --git a/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py b/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py index f408396f..8661f524 100644 --- a/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py +++ b/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py @@ -10,7 +10,7 @@ from alembic import op import sqlalchemy as sa -from collector_db.enums import PGEnum +from db.enums import PGEnum # revision identifiers, used by Alembic. revision: str = '072b32a45b1c' diff --git a/alembic/versions/19bf57df581a_add_url_agency_suggestions.py b/alembic/versions/19bf57df581a_add_url_agency_suggestions.py index 608fcd1b..f735e271 100644 --- a/alembic/versions/19bf57df581a_add_url_agency_suggestions.py +++ b/alembic/versions/19bf57df581a_add_url_agency_suggestions.py @@ -9,7 +9,7 @@ from alembic import op import sqlalchemy as sa -from collector_db.enums import PGEnum +from db.enums import PGEnum # revision identifiers, used by Alembic. revision: str = '19bf57df581a' down_revision: Union[str, None] = '072b32a45b1c' diff --git a/alembic/versions/9afd8a5633c9_create_htmlcontent_and_rooturl_tables.py b/alembic/versions/9afd8a5633c9_create_htmlcontent_and_rooturl_tables.py index 81401c06..bc26bf30 100644 --- a/alembic/versions/9afd8a5633c9_create_htmlcontent_and_rooturl_tables.py +++ b/alembic/versions/9afd8a5633c9_create_htmlcontent_and_rooturl_tables.py @@ -10,7 +10,7 @@ import sqlalchemy as sa from alembic import op -from collector_db.enums import PGEnum +from db.enums import PGEnum # revision identifiers, used by Alembic. revision: str = '9afd8a5633c9' diff --git a/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py b/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py index 2bb7c157..16611eee 100644 --- a/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py +++ b/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py @@ -10,7 +10,7 @@ from alembic import op import sqlalchemy as sa -from collector_db.enums import PGEnum +from db.enums import PGEnum # revision identifiers, used by Alembic. revision: str = 'd7eb670edaf0' diff --git a/api/main.py b/api/main.py index 414f7223..fd82df85 100644 --- a/api/main.py +++ b/api/main.py @@ -14,8 +14,8 @@ from api.routes.search import search_router from api.routes.task import task_router from api.routes.url import url_router -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DatabaseClient import DatabaseClient +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DatabaseClient import DatabaseClient from collector_manager.AsyncCollectorManager import AsyncCollectorManager from core.AsyncCore import AsyncCore from core.AsyncCoreLogger import AsyncCoreLogger diff --git a/api/routes/batch.py b/api/routes/batch.py index 7ba0a2a4..4ca38c55 100644 --- a/api/routes/batch.py +++ b/api/routes/batch.py @@ -4,7 +4,7 @@ from fastapi.params import Query, Depends from api.dependencies import get_core, get_async_core -from collector_db.DTOs.BatchInfo import BatchInfo +from db.DTOs.BatchInfo import BatchInfo from collector_manager.enums import CollectorType from core.AsyncCore import AsyncCore from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse diff --git a/api/routes/task.py b/api/routes/task.py index 44971959..a99598f7 100644 --- a/api/routes/task.py +++ b/api/routes/task.py @@ -3,9 +3,9 @@ from fastapi import APIRouter, Depends, Query, Path from api.dependencies import get_async_core -from collector_db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo -from collector_db.DTOs.TaskInfo import TaskInfo -from collector_db.enums import TaskType +from db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo +from db.DTOs.TaskInfo import TaskInfo +from db.enums import TaskType from core.AsyncCore import AsyncCore from core.enums import BatchStatus from security_manager.SecurityManager import AccessInfo, get_access_info diff --git a/apply_migrations.py b/apply_migrations.py index 183e7d11..2dc207ce 100644 --- a/apply_migrations.py +++ b/apply_migrations.py @@ -1,7 +1,7 @@ from alembic import command from alembic.config import Config -from collector_db.helper_functions import get_postgres_connection_string +from db.helper_functions import get_postgres_connection_string def apply_migrations(): print("Applying migrations...") diff --git a/collector_manager/AsyncCollectorBase.py b/collector_manager/AsyncCollectorBase.py index a842a9c0..94361ed4 100644 --- a/collector_manager/AsyncCollectorBase.py +++ b/collector_manager/AsyncCollectorBase.py @@ -6,9 +6,9 @@ from pydantic import BaseModel -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo -from collector_db.DTOs.LogInfo import LogInfo +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DTOs.InsertURLsInfo import InsertURLsInfo +from db.DTOs.LogInfo import LogInfo from collector_manager.enums import CollectorType from core.AsyncCoreLogger import AsyncCoreLogger from core.FunctionTrigger import FunctionTrigger diff --git a/collector_manager/AsyncCollectorManager.py b/collector_manager/AsyncCollectorManager.py index 1851bfc9..bfb7beef 100644 --- a/collector_manager/AsyncCollectorManager.py +++ b/collector_manager/AsyncCollectorManager.py @@ -5,7 +5,7 @@ from fastapi import HTTPException from pydantic import BaseModel -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from db.AsyncDatabaseClient import AsyncDatabaseClient from collector_manager.AsyncCollectorBase import AsyncCollectorBase from collector_manager.CollectorManager import InvalidCollectorError from collector_manager.collector_mapping import COLLECTOR_MAPPING diff --git a/core/AsyncCore.py b/core/AsyncCore.py index 651cd3ba..1d61557e 100644 --- a/core/AsyncCore.py +++ b/core/AsyncCore.py @@ -3,10 +3,10 @@ from pydantic import BaseModel from sqlalchemy.exc import IntegrityError -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.BatchInfo import BatchInfo -from collector_db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo -from collector_db.enums import TaskType +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DTOs.BatchInfo import BatchInfo +from db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo +from db.enums import TaskType from collector_manager.AsyncCollectorManager import AsyncCollectorManager from collector_manager.enums import CollectorType from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo diff --git a/core/AsyncCoreLogger.py b/core/AsyncCoreLogger.py index 70ca06aa..67bb5dc9 100644 --- a/core/AsyncCoreLogger.py +++ b/core/AsyncCoreLogger.py @@ -1,7 +1,7 @@ import asyncio -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.LogInfo import LogInfo +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DTOs.LogInfo import LogInfo class AsyncCoreLogger: diff --git a/core/DTOs/CollectionLifecycleInfo.py b/core/DTOs/CollectionLifecycleInfo.py index dc1b538f..925dee93 100644 --- a/core/DTOs/CollectionLifecycleInfo.py +++ b/core/DTOs/CollectionLifecycleInfo.py @@ -1,7 +1,7 @@ from pydantic import BaseModel -from collector_db.DTOs.DuplicateInfo import DuplicateInfo -from collector_db.DTOs.URLMapping import URLMapping +from db.DTOs.DuplicateInfo import DuplicateInfo +from db.DTOs.URLMapping import URLMapping class CollectionLifecycleInfo(BaseModel): diff --git a/core/DTOs/GetBatchLogsResponse.py b/core/DTOs/GetBatchLogsResponse.py index 9db96d91..adcc3be9 100644 --- a/core/DTOs/GetBatchLogsResponse.py +++ b/core/DTOs/GetBatchLogsResponse.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from collector_db.DTOs.LogInfo import LogOutputInfo +from db.DTOs.LogInfo import LogOutputInfo class GetBatchLogsResponse(BaseModel): diff --git a/core/DTOs/GetBatchStatusResponse.py b/core/DTOs/GetBatchStatusResponse.py index 2624f0c3..d1a02dc7 100644 --- a/core/DTOs/GetBatchStatusResponse.py +++ b/core/DTOs/GetBatchStatusResponse.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from collector_db.DTOs.BatchInfo import BatchInfo +from db.DTOs.BatchInfo import BatchInfo class GetBatchStatusResponse(BaseModel): diff --git a/core/DTOs/GetDuplicatesByBatchResponse.py b/core/DTOs/GetDuplicatesByBatchResponse.py index b2915d61..68a6dd4b 100644 --- a/core/DTOs/GetDuplicatesByBatchResponse.py +++ b/core/DTOs/GetDuplicatesByBatchResponse.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from collector_db.DTOs.DuplicateInfo import DuplicateInfo +from db.DTOs.DuplicateInfo import DuplicateInfo class GetDuplicatesByBatchResponse(BaseModel): diff --git a/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py b/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py index 4280e00d..e1784409 100644 --- a/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py +++ b/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py @@ -2,7 +2,7 @@ from pydantic import Field, BaseModel -from collector_db.DTOs.URLMapping import URLMapping +from db.DTOs.URLMapping import URLMapping from core.enums import RecordType from html_tag_collector.DataClassTags import ResponseHTMLInfo diff --git a/core/DTOs/GetNextRelevanceAnnotationResponseInfo.py b/core/DTOs/GetNextRelevanceAnnotationResponseInfo.py index 61cb35a5..af586395 100644 --- a/core/DTOs/GetNextRelevanceAnnotationResponseInfo.py +++ b/core/DTOs/GetNextRelevanceAnnotationResponseInfo.py @@ -2,7 +2,7 @@ from pydantic import BaseModel, Field -from collector_db.DTOs.URLMapping import URLMapping +from db.DTOs.URLMapping import URLMapping from core.DTOs.ResponseURLInfo import ResponseURLInfo from html_tag_collector.DataClassTags import ResponseHTMLInfo diff --git a/core/DTOs/GetTasksResponse.py b/core/DTOs/GetTasksResponse.py index 42b3d954..670ce8d3 100644 --- a/core/DTOs/GetTasksResponse.py +++ b/core/DTOs/GetTasksResponse.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from collector_db.enums import TaskType +from db.enums import TaskType from core.enums import BatchStatus diff --git a/core/DTOs/GetURLsByBatchResponse.py b/core/DTOs/GetURLsByBatchResponse.py index ce4ed5f8..c737d720 100644 --- a/core/DTOs/GetURLsByBatchResponse.py +++ b/core/DTOs/GetURLsByBatchResponse.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from collector_db.DTOs.URLInfo import URLInfo +from db.DTOs.URLInfo import URLInfo class GetURLsByBatchResponse(BaseModel): diff --git a/core/DTOs/GetURLsResponseInfo.py b/core/DTOs/GetURLsResponseInfo.py index 162e92b5..a924d5aa 100644 --- a/core/DTOs/GetURLsResponseInfo.py +++ b/core/DTOs/GetURLsResponseInfo.py @@ -3,7 +3,7 @@ from pydantic import BaseModel -from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource +from db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource from collector_manager.enums import URLStatus class GetURLsResponseErrorInfo(BaseModel): diff --git a/core/DTOs/task_data_objects/URLRecordTypeTDO.py b/core/DTOs/task_data_objects/URLRecordTypeTDO.py index 34bbc233..03215f71 100644 --- a/core/DTOs/task_data_objects/URLRecordTypeTDO.py +++ b/core/DTOs/task_data_objects/URLRecordTypeTDO.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from collector_db.DTOs.URLWithHTML import URLWithHTML +from db.DTOs.URLWithHTML import URLWithHTML from core.enums import RecordType diff --git a/core/DTOs/task_data_objects/UrlHtmlTDO.py b/core/DTOs/task_data_objects/UrlHtmlTDO.py index ca5b8a50..96c44778 100644 --- a/core/DTOs/task_data_objects/UrlHtmlTDO.py +++ b/core/DTOs/task_data_objects/UrlHtmlTDO.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from collector_db.DTOs.URLInfo import URLInfo +from db.DTOs.URLInfo import URLInfo from html_tag_collector.DataClassTags import ResponseHTMLInfo from html_tag_collector.URLRequestInterface import URLResponseInfo diff --git a/core/SourceCollectorCore.py b/core/SourceCollectorCore.py index a4699bf6..6b9822ae 100644 --- a/core/SourceCollectorCore.py +++ b/core/SourceCollectorCore.py @@ -1,7 +1,7 @@ from typing import Optional, Any -from collector_db.DatabaseClient import DatabaseClient +from db.DatabaseClient import DatabaseClient from core.enums import BatchStatus diff --git a/core/TaskManager.py b/core/TaskManager.py index 4dd92450..4424ec1c 100644 --- a/core/TaskManager.py +++ b/core/TaskManager.py @@ -3,9 +3,9 @@ from core.classes.task_operators.URL404ProbeTaskOperator import URL404ProbeTaskOperator from core.classes.task_operators.URLDuplicateTaskOperator import URLDuplicateTaskOperator from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.TaskInfo import TaskInfo -from collector_db.enums import TaskType +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DTOs.TaskInfo import TaskInfo +from db.enums import TaskType from core.DTOs.GetTasksResponse import GetTasksResponse from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome from core.FunctionTrigger import FunctionTrigger diff --git a/core/classes/HTMLContentInfoGetter.py b/core/classes/HTMLContentInfoGetter.py index c9d7af61..b9e0b7e1 100644 --- a/core/classes/HTMLContentInfoGetter.py +++ b/core/classes/HTMLContentInfoGetter.py @@ -1,4 +1,4 @@ -from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType +from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType from html_tag_collector.DataClassTags import ResponseHTMLInfo diff --git a/core/classes/task_operators/AgencyIdentificationTaskOperator.py b/core/classes/task_operators/AgencyIdentificationTaskOperator.py index b6e53955..259ddff9 100644 --- a/core/classes/task_operators/AgencyIdentificationTaskOperator.py +++ b/core/classes/task_operators/AgencyIdentificationTaskOperator.py @@ -1,9 +1,9 @@ from aiohttp import ClientSession from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from collector_db.enums import TaskType +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from db.enums import TaskType from collector_manager.enums import CollectorType from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO diff --git a/core/classes/task_operators/SubmitApprovedURLTaskOperator.py b/core/classes/task_operators/SubmitApprovedURLTaskOperator.py index 86e0229e..e3a4eab2 100644 --- a/core/classes/task_operators/SubmitApprovedURLTaskOperator.py +++ b/core/classes/task_operators/SubmitApprovedURLTaskOperator.py @@ -1,6 +1,6 @@ -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from collector_db.enums import TaskType +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from db.enums import TaskType from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase from pdap_api_client.PDAPClient import PDAPClient diff --git a/core/classes/task_operators/TaskOperatorBase.py b/core/classes/task_operators/TaskOperatorBase.py index e7c87dac..df12f362 100644 --- a/core/classes/task_operators/TaskOperatorBase.py +++ b/core/classes/task_operators/TaskOperatorBase.py @@ -1,7 +1,7 @@ import traceback from abc import ABC, abstractmethod -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.enums import TaskType +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.enums import TaskType from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome, TaskOperatorRunInfo from core.enums import BatchStatus diff --git a/core/classes/task_operators/URL404ProbeTaskOperator.py b/core/classes/task_operators/URL404ProbeTaskOperator.py index 08f513f8..536fea23 100644 --- a/core/classes/task_operators/URL404ProbeTaskOperator.py +++ b/core/classes/task_operators/URL404ProbeTaskOperator.py @@ -2,8 +2,8 @@ from pydantic import BaseModel -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.enums import TaskType +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.enums import TaskType from core.DTOs.task_data_objects.URL404ProbeTDO import URL404ProbeTDO from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase from html_tag_collector.URLRequestInterface import URLRequestInterface diff --git a/core/classes/task_operators/URLDuplicateTaskOperator.py b/core/classes/task_operators/URLDuplicateTaskOperator.py index 060c07c7..09ab35ce 100644 --- a/core/classes/task_operators/URLDuplicateTaskOperator.py +++ b/core/classes/task_operators/URLDuplicateTaskOperator.py @@ -2,8 +2,8 @@ from aiohttp import ClientResponseError -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.enums import TaskType +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.enums import TaskType from core.DTOs.task_data_objects.URLDuplicateTDO import URLDuplicateTDO from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase from pdap_api_client.PDAPClient import PDAPClient diff --git a/core/classes/task_operators/URLHTMLTaskOperator.py b/core/classes/task_operators/URLHTMLTaskOperator.py index 17f383c7..340c386b 100644 --- a/core/classes/task_operators/URLHTMLTaskOperator.py +++ b/core/classes/task_operators/URLHTMLTaskOperator.py @@ -1,9 +1,9 @@ from http import HTTPStatus -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from collector_db.DTOs.URLInfo import URLInfo -from collector_db.enums import TaskType +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from db.DTOs.URLInfo import URLInfo +from db.enums import TaskType from core.DTOs.task_data_objects.UrlHtmlTDO import UrlHtmlTDO from core.classes.HTMLContentInfoGetter import HTMLContentInfoGetter from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase diff --git a/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py b/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py index 68a3a243..bf9eef04 100644 --- a/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py +++ b/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py @@ -1,8 +1,8 @@ from typing import Optional -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from collector_db.enums import TaskType +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from db.enums import TaskType from collector_manager.enums import CollectorType from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase diff --git a/core/classes/task_operators/URLRecordTypeTaskOperator.py b/core/classes/task_operators/URLRecordTypeTaskOperator.py index ab1f1f08..0f080a03 100644 --- a/core/classes/task_operators/URLRecordTypeTaskOperator.py +++ b/core/classes/task_operators/URLRecordTypeTaskOperator.py @@ -1,6 +1,6 @@ -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from collector_db.enums import TaskType +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from db.enums import TaskType from core.DTOs.task_data_objects.URLRecordTypeTDO import URLRecordTypeTDO from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase from core.enums import RecordType diff --git a/core/preprocessors/AutoGooglerPreprocessor.py b/core/preprocessors/AutoGooglerPreprocessor.py index 4124e04b..ebbf4474 100644 --- a/core/preprocessors/AutoGooglerPreprocessor.py +++ b/core/preprocessors/AutoGooglerPreprocessor.py @@ -1,6 +1,6 @@ from typing import List -from collector_db.DTOs.URLInfo import URLInfo +from db.DTOs.URLInfo import URLInfo from core.preprocessors.PreprocessorBase import PreprocessorBase diff --git a/core/preprocessors/CKANPreprocessor.py b/core/preprocessors/CKANPreprocessor.py index 65017300..62a550a1 100644 --- a/core/preprocessors/CKANPreprocessor.py +++ b/core/preprocessors/CKANPreprocessor.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import List -from collector_db.DTOs.URLInfo import URLInfo +from db.DTOs.URLInfo import URLInfo class CKANPreprocessor: diff --git a/core/preprocessors/CommonCrawlerPreprocessor.py b/core/preprocessors/CommonCrawlerPreprocessor.py index dbf1b885..018d9bfb 100644 --- a/core/preprocessors/CommonCrawlerPreprocessor.py +++ b/core/preprocessors/CommonCrawlerPreprocessor.py @@ -1,6 +1,6 @@ from typing import List -from collector_db.DTOs.URLInfo import URLInfo +from db.DTOs.URLInfo import URLInfo from core.preprocessors.PreprocessorBase import PreprocessorBase diff --git a/core/preprocessors/ExamplePreprocessor.py b/core/preprocessors/ExamplePreprocessor.py index 46979039..41f3b57e 100644 --- a/core/preprocessors/ExamplePreprocessor.py +++ b/core/preprocessors/ExamplePreprocessor.py @@ -1,6 +1,6 @@ from typing import List -from collector_db.DTOs.URLInfo import URLInfo +from db.DTOs.URLInfo import URLInfo from collector_manager.DTOs.ExampleOutputDTO import ExampleOutputDTO from core.preprocessors.PreprocessorBase import PreprocessorBase diff --git a/core/preprocessors/MuckrockPreprocessor.py b/core/preprocessors/MuckrockPreprocessor.py index b0be0e36..04ba221b 100644 --- a/core/preprocessors/MuckrockPreprocessor.py +++ b/core/preprocessors/MuckrockPreprocessor.py @@ -1,6 +1,6 @@ from typing import List -from collector_db.DTOs.URLInfo import URLInfo +from db.DTOs.URLInfo import URLInfo from core.preprocessors.PreprocessorBase import PreprocessorBase diff --git a/core/preprocessors/PreprocessorBase.py b/core/preprocessors/PreprocessorBase.py index b39264b0..6f44f8ae 100644 --- a/core/preprocessors/PreprocessorBase.py +++ b/core/preprocessors/PreprocessorBase.py @@ -2,7 +2,7 @@ from abc import ABC from typing import List -from collector_db.DTOs.URLInfo import URLInfo +from db.DTOs.URLInfo import URLInfo class PreprocessorBase(ABC): diff --git a/collector_db/AsyncDatabaseClient.py b/db/AsyncDatabaseClient.py similarity index 98% rename from collector_db/AsyncDatabaseClient.py rename to db/AsyncDatabaseClient.py index 81ab8de2..a539d3b2 100644 --- a/collector_db/AsyncDatabaseClient.py +++ b/db/AsyncDatabaseClient.py @@ -12,21 +12,21 @@ from sqlalchemy.sql.functions import coalesce from starlette import status -from collector_db.ConfigManager import ConfigManager -from collector_db.DTOConverter import DTOConverter -from collector_db.DTOs.BatchInfo import BatchInfo -from collector_db.DTOs.DuplicateInfo import DuplicateInsertInfo, DuplicateInfo -from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo -from collector_db.DTOs.LogInfo import LogInfo, LogOutputInfo -from collector_db.DTOs.TaskInfo import TaskInfo -from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType -from collector_db.DTOs.URLInfo import URLInfo -from collector_db.DTOs.URLMapping import URLMapping -from collector_db.StatementComposer import StatementComposer -from collector_db.constants import PLACEHOLDER_AGENCY_NAME -from collector_db.enums import TaskType -from collector_db.models import URL, URLErrorInfo, URLHTMLContent, Base, \ +from db.ConfigManager import ConfigManager +from db.DTOConverter import DTOConverter +from db.DTOs.BatchInfo import BatchInfo +from db.DTOs.DuplicateInfo import DuplicateInsertInfo, DuplicateInfo +from db.DTOs.InsertURLsInfo import InsertURLsInfo +from db.DTOs.LogInfo import LogInfo, LogOutputInfo +from db.DTOs.TaskInfo import TaskInfo +from db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType +from db.DTOs.URLInfo import URLInfo +from db.DTOs.URLMapping import URLMapping +from db.StatementComposer import StatementComposer +from db.constants import PLACEHOLDER_AGENCY_NAME +from db.enums import TaskType +from db.models import URL, URLErrorInfo, URLHTMLContent, Base, \ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Duplicate, Log, \ diff --git a/collector_db/ConfigManager.py b/db/ConfigManager.py similarity index 100% rename from collector_db/ConfigManager.py rename to db/ConfigManager.py diff --git a/collector_db/DTOConverter.py b/db/DTOConverter.py similarity index 95% rename from collector_db/DTOConverter.py rename to db/DTOConverter.py index d06ac6de..d95935d4 100644 --- a/collector_db/DTOConverter.py +++ b/db/DTOConverter.py @@ -1,9 +1,9 @@ from typing import Optional -from collector_db.DTOs.URLHTMLContentInfo import HTMLContentType, URLHTMLContentInfo -from collector_db.DTOs.URLInfo import URLInfo -from collector_db.DTOs.URLWithHTML import URLWithHTML -from collector_db.models import AutomatedUrlAgencySuggestion, UserUrlAgencySuggestion, URLHTMLContent, URL, Agency, \ +from db.DTOs.URLHTMLContentInfo import HTMLContentType, URLHTMLContentInfo +from db.DTOs.URLInfo import URLInfo +from db.DTOs.URLWithHTML import URLWithHTML +from db.models import AutomatedUrlAgencySuggestion, UserUrlAgencySuggestion, URLHTMLContent, URL, Agency, \ AutoRecordTypeSuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion, AutoRelevantSuggestion, \ ConfirmedURLAgency from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo diff --git a/collector_db/DTOs/BatchInfo.py b/db/DTOs/BatchInfo.py similarity index 100% rename from collector_db/DTOs/BatchInfo.py rename to db/DTOs/BatchInfo.py diff --git a/collector_db/DTOs/DuplicateInfo.py b/db/DTOs/DuplicateInfo.py similarity index 100% rename from collector_db/DTOs/DuplicateInfo.py rename to db/DTOs/DuplicateInfo.py diff --git a/collector_db/DTOs/GetTaskStatusResponseInfo.py b/db/DTOs/GetTaskStatusResponseInfo.py similarity index 71% rename from collector_db/DTOs/GetTaskStatusResponseInfo.py rename to db/DTOs/GetTaskStatusResponseInfo.py index f6a8d5fc..df44fd73 100644 --- a/collector_db/DTOs/GetTaskStatusResponseInfo.py +++ b/db/DTOs/GetTaskStatusResponseInfo.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from collector_db.enums import TaskType +from db.enums import TaskType class GetTaskStatusResponseInfo(BaseModel): diff --git a/collector_db/DTOs/InsertURLsInfo.py b/db/DTOs/InsertURLsInfo.py similarity index 79% rename from collector_db/DTOs/InsertURLsInfo.py rename to db/DTOs/InsertURLsInfo.py index da2ee39a..b7cbc924 100644 --- a/collector_db/DTOs/InsertURLsInfo.py +++ b/db/DTOs/InsertURLsInfo.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from collector_db.DTOs.URLMapping import URLMapping +from db.DTOs.URLMapping import URLMapping class InsertURLsInfo(BaseModel): diff --git a/collector_db/DTOs/LogInfo.py b/db/DTOs/LogInfo.py similarity index 100% rename from collector_db/DTOs/LogInfo.py rename to db/DTOs/LogInfo.py diff --git a/collector_db/DTOs/MetadataAnnotationInfo.py b/db/DTOs/MetadataAnnotationInfo.py similarity index 100% rename from collector_db/DTOs/MetadataAnnotationInfo.py rename to db/DTOs/MetadataAnnotationInfo.py diff --git a/collector_db/DTOs/README.md b/db/DTOs/README.md similarity index 100% rename from collector_db/DTOs/README.md rename to db/DTOs/README.md diff --git a/collector_db/DTOs/TaskInfo.py b/db/DTOs/TaskInfo.py similarity index 68% rename from collector_db/DTOs/TaskInfo.py rename to db/DTOs/TaskInfo.py index e8d8090d..feae2666 100644 --- a/collector_db/DTOs/TaskInfo.py +++ b/db/DTOs/TaskInfo.py @@ -3,9 +3,9 @@ from pydantic import BaseModel -from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from collector_db.DTOs.URLInfo import URLInfo -from collector_db.enums import TaskType +from db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from db.DTOs.URLInfo import URLInfo +from db.enums import TaskType from core.enums import BatchStatus diff --git a/collector_db/DTOs/URLAnnotationInfo.py b/db/DTOs/URLAnnotationInfo.py similarity index 71% rename from collector_db/DTOs/URLAnnotationInfo.py rename to db/DTOs/URLAnnotationInfo.py index 844b226d..e83e4752 100644 --- a/collector_db/DTOs/URLAnnotationInfo.py +++ b/db/DTOs/URLAnnotationInfo.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo class URLAnnotationInfo(BaseModel): diff --git a/collector_db/DTOs/URLErrorInfos.py b/db/DTOs/URLErrorInfos.py similarity index 100% rename from collector_db/DTOs/URLErrorInfos.py rename to db/DTOs/URLErrorInfos.py diff --git a/collector_db/DTOs/URLHTMLContentInfo.py b/db/DTOs/URLHTMLContentInfo.py similarity index 100% rename from collector_db/DTOs/URLHTMLContentInfo.py rename to db/DTOs/URLHTMLContentInfo.py diff --git a/collector_db/DTOs/URLInfo.py b/db/DTOs/URLInfo.py similarity index 100% rename from collector_db/DTOs/URLInfo.py rename to db/DTOs/URLInfo.py diff --git a/collector_db/DTOs/URLMapping.py b/db/DTOs/URLMapping.py similarity index 100% rename from collector_db/DTOs/URLMapping.py rename to db/DTOs/URLMapping.py diff --git a/collector_db/DTOs/URLMetadataInfo.py b/db/DTOs/URLMetadataInfo.py similarity index 86% rename from collector_db/DTOs/URLMetadataInfo.py rename to db/DTOs/URLMetadataInfo.py index 461d16e9..27431a99 100644 --- a/collector_db/DTOs/URLMetadataInfo.py +++ b/db/DTOs/URLMetadataInfo.py @@ -3,7 +3,7 @@ from pydantic import BaseModel -from collector_db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource +from db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource class URLMetadataInfo(BaseModel): diff --git a/collector_db/DTOs/URLRelevancyInfo.py b/db/DTOs/URLRelevancyInfo.py similarity index 100% rename from collector_db/DTOs/URLRelevancyInfo.py rename to db/DTOs/URLRelevancyInfo.py diff --git a/collector_db/DTOs/URLWithHTML.py b/db/DTOs/URLWithHTML.py similarity index 66% rename from collector_db/DTOs/URLWithHTML.py rename to db/DTOs/URLWithHTML.py index 59ba63ee..53c77b82 100644 --- a/collector_db/DTOs/URLWithHTML.py +++ b/db/DTOs/URLWithHTML.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo class URLWithHTML(BaseModel): diff --git a/collector_db/DTOs/__init__.py b/db/DTOs/__init__.py similarity index 100% rename from collector_db/DTOs/__init__.py rename to db/DTOs/__init__.py diff --git a/collector_db/DatabaseClient.py b/db/DatabaseClient.py similarity index 94% rename from collector_db/DatabaseClient.py rename to db/DatabaseClient.py index 8bd8105f..030e2db6 100644 --- a/collector_db/DatabaseClient.py +++ b/db/DatabaseClient.py @@ -6,14 +6,14 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import sessionmaker, scoped_session, Session -from collector_db.ConfigManager import ConfigManager -from collector_db.DTOs.BatchInfo import BatchInfo -from collector_db.DTOs.DuplicateInfo import DuplicateInsertInfo -from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo -from collector_db.DTOs.LogInfo import LogInfo -from collector_db.DTOs.URLInfo import URLInfo -from collector_db.DTOs.URLMapping import URLMapping -from collector_db.models import Base, Batch, URL, Log, Duplicate, URLDataSource +from db.ConfigManager import ConfigManager +from db.DTOs.BatchInfo import BatchInfo +from db.DTOs.DuplicateInfo import DuplicateInsertInfo +from db.DTOs.InsertURLsInfo import InsertURLsInfo +from db.DTOs.LogInfo import LogInfo +from db.DTOs.URLInfo import URLInfo +from db.DTOs.URLMapping import URLMapping +from db.models import Base, Batch, URL, Log, Duplicate, URLDataSource from collector_manager.enums import CollectorType, URLStatus from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO from core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO diff --git a/collector_db/README.md b/db/README.md similarity index 100% rename from collector_db/README.md rename to db/README.md diff --git a/collector_db/StatementComposer.py b/db/StatementComposer.py similarity index 94% rename from collector_db/StatementComposer.py rename to db/StatementComposer.py index 2ea33c5f..73121e51 100644 --- a/collector_db/StatementComposer.py +++ b/db/StatementComposer.py @@ -3,8 +3,8 @@ from sqlalchemy import Select, select, exists, Table, func, Subquery, and_, not_, ColumnElement, case, literal, CTE from sqlalchemy.orm import aliased -from collector_db.enums import URLMetadataAttributeType, ValidationStatus, TaskType -from collector_db.models import URL, URLHTMLContent, AutomatedUrlAgencySuggestion, URLOptionalDataSourceMetadata, Batch, \ +from db.enums import URLMetadataAttributeType, ValidationStatus, TaskType +from db.models import URL, URLHTMLContent, AutomatedUrlAgencySuggestion, URLOptionalDataSourceMetadata, Batch, \ ConfirmedURLAgency, LinkTaskURL, Task, UserUrlAgencySuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion, \ AutoRecordTypeSuggestion, AutoRelevantSuggestion, ReviewingUserURL from collector_manager.enums import URLStatus, CollectorType diff --git a/collector_db/__init__.py b/db/__init__.py similarity index 100% rename from collector_db/__init__.py rename to db/__init__.py diff --git a/collector_db/constants.py b/db/constants.py similarity index 100% rename from collector_db/constants.py rename to db/constants.py diff --git a/collector_db/enums.py b/db/enums.py similarity index 100% rename from collector_db/enums.py rename to db/enums.py diff --git a/collector_db/helper_functions.py b/db/helper_functions.py similarity index 100% rename from collector_db/helper_functions.py rename to db/helper_functions.py diff --git a/collector_db/models.py b/db/models.py similarity index 99% rename from collector_db/models.py rename to db/models.py index 9134a0ad..83ca97b4 100644 --- a/collector_db/models.py +++ b/db/models.py @@ -6,7 +6,7 @@ from sqlalchemy.dialects import postgresql from sqlalchemy.orm import declarative_base, relationship -from collector_db.enums import PGEnum, TaskType +from db.enums import PGEnum, TaskType from core.enums import BatchStatus, RecordType from util.helper_functions import get_enum_values diff --git a/docker-compose.yml b/docker-compose.yml index d813a97f..58cb29e1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,7 @@ services: build: context: . dockerfile: Dockerfile - command: pytest /app/tests/test_automated + command: pytest /app/tests/automated ports: - "8000:80" environment: diff --git a/html_tag_collector/DataClassTags.py b/html_tag_collector/DataClassTags.py index d39a0767..12a0ecc3 100644 --- a/html_tag_collector/DataClassTags.py +++ b/html_tag_collector/DataClassTags.py @@ -1,6 +1,6 @@ from dataclasses import dataclass -from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType +from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType @dataclass diff --git a/html_tag_collector/RootURLCache.py b/html_tag_collector/RootURLCache.py index 165be89d..b5f3f413 100644 --- a/html_tag_collector/RootURLCache.py +++ b/html_tag_collector/RootURLCache.py @@ -5,7 +5,7 @@ from aiohttp import ClientSession from bs4 import BeautifulSoup -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from db.AsyncDatabaseClient import AsyncDatabaseClient from html_tag_collector.constants import REQUEST_HEADERS DEBUG = False diff --git a/llm_api_logic/DeepSeekRecordClassifier.py b/llm_api_logic/DeepSeekRecordClassifier.py index 67f6fa09..e770f3c0 100644 --- a/llm_api_logic/DeepSeekRecordClassifier.py +++ b/llm_api_logic/DeepSeekRecordClassifier.py @@ -3,7 +3,7 @@ from openai import AsyncOpenAI -from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo from core.enums import RecordType from llm_api_logic.LLMRecordClassifierBase import RecordClassifierBase diff --git a/llm_api_logic/LLMRecordClassifierBase.py b/llm_api_logic/LLMRecordClassifierBase.py index 85142aea..5648a90f 100644 --- a/llm_api_logic/LLMRecordClassifierBase.py +++ b/llm_api_logic/LLMRecordClassifierBase.py @@ -4,7 +4,7 @@ from openai import AsyncOpenAI -from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo from llm_api_logic.RecordTypeStructuredOutput import RecordTypeStructuredOutput from llm_api_logic.constants import RECORD_CLASSIFICATION_QUERY_CONTENT from llm_api_logic.helpers import dictify_html_info diff --git a/llm_api_logic/helpers.py b/llm_api_logic/helpers.py index 3d5bde11..b8a81b13 100644 --- a/llm_api_logic/helpers.py +++ b/llm_api_logic/helpers.py @@ -1,4 +1,4 @@ -from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo def dictify_html_info(html_infos: list[URLHTMLContentInfo]) -> dict[str, str]: diff --git a/tests/test_alembic/__init__.py b/tests/alembic/__init__.py similarity index 100% rename from tests/test_alembic/__init__.py rename to tests/alembic/__init__.py diff --git a/tests/test_alembic/conftest.py b/tests/alembic/conftest.py similarity index 95% rename from tests/test_alembic/conftest.py rename to tests/alembic/conftest.py index 8cd1d0ab..42a04a6b 100644 --- a/tests/test_alembic/conftest.py +++ b/tests/alembic/conftest.py @@ -3,7 +3,7 @@ from sqlalchemy import create_engine, inspect, MetaData from sqlalchemy.orm import scoped_session, sessionmaker -from collector_db.helper_functions import get_postgres_connection_string +from db.helper_functions import get_postgres_connection_string from tests.helpers.AlembicRunner import AlembicRunner diff --git a/tests/test_alembic/helpers.py b/tests/alembic/helpers.py similarity index 100% rename from tests/test_alembic/helpers.py rename to tests/alembic/helpers.py diff --git a/tests/test_alembic/test_revisions.py b/tests/alembic/test_revisions.py similarity index 98% rename from tests/test_alembic/test_revisions.py rename to tests/alembic/test_revisions.py index 9bc287d1..5ddd77e5 100644 --- a/tests/test_alembic/test_revisions.py +++ b/tests/alembic/test_revisions.py @@ -15,8 +15,8 @@ from sqlalchemy import text -from tests.test_alembic.helpers import columns_in_table -from tests.test_alembic.helpers import get_enum_values, table_creation_check +from tests.alembic.helpers import columns_in_table +from tests.alembic.helpers import get_enum_values, table_creation_check def test_base(alembic_runner): diff --git a/tests/test_automated/README.md b/tests/automated/README.md similarity index 100% rename from tests/test_automated/README.md rename to tests/automated/README.md diff --git a/tests/test_automated/__init__.py b/tests/automated/__init__.py similarity index 100% rename from tests/test_automated/__init__.py rename to tests/automated/__init__.py diff --git a/tests/test_automated/integration/__init__.py b/tests/automated/integration/__init__.py similarity index 100% rename from tests/test_automated/integration/__init__.py rename to tests/automated/integration/__init__.py diff --git a/tests/test_automated/integration/api/__init__.py b/tests/automated/integration/api/__init__.py similarity index 100% rename from tests/test_automated/integration/api/__init__.py rename to tests/automated/integration/api/__init__.py diff --git a/tests/test_automated/integration/api/conftest.py b/tests/automated/integration/api/conftest.py similarity index 97% rename from tests/test_automated/integration/api/conftest.py rename to tests/automated/integration/api/conftest.py index 2e7d8632..c709d202 100644 --- a/tests/test_automated/integration/api/conftest.py +++ b/tests/automated/integration/api/conftest.py @@ -15,7 +15,7 @@ from core.enums import BatchStatus from security_manager.SecurityManager import get_access_info, AccessInfo, Permissions, require_permission from tests.helpers.DBDataCreator import DBDataCreator -from tests.test_automated.integration.api.helpers.RequestValidator import RequestValidator +from tests.automated.integration.api.helpers.RequestValidator import RequestValidator @dataclass diff --git a/tests/test_automated/integration/api/helpers/RequestValidator.py b/tests/automated/integration/api/helpers/RequestValidator.py similarity index 98% rename from tests/test_automated/integration/api/helpers/RequestValidator.py rename to tests/automated/integration/api/helpers/RequestValidator.py index 3717da50..5fabd69b 100644 --- a/tests/test_automated/integration/api/helpers/RequestValidator.py +++ b/tests/automated/integration/api/helpers/RequestValidator.py @@ -5,10 +5,10 @@ from pydantic import BaseModel from starlette.testclient import TestClient -from collector_db.DTOs.BatchInfo import BatchInfo -from collector_db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo -from collector_db.DTOs.TaskInfo import TaskInfo -from collector_db.enums import TaskType +from db.DTOs.BatchInfo import BatchInfo +from db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo +from db.DTOs.TaskInfo import TaskInfo +from db.enums import TaskType from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.enums import CollectorType from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo diff --git a/tests/test_automated/integration/api/helpers/__init__.py b/tests/automated/integration/api/helpers/__init__.py similarity index 100% rename from tests/test_automated/integration/api/helpers/__init__.py rename to tests/automated/integration/api/helpers/__init__.py diff --git a/tests/test_automated/integration/api/test_annotate.py b/tests/automated/integration/api/test_annotate.py similarity index 98% rename from tests/test_automated/integration/api/test_annotate.py rename to tests/automated/integration/api/test_annotate.py index 90181951..a3344b68 100644 --- a/tests/test_automated/integration/api/test_annotate.py +++ b/tests/automated/integration/api/test_annotate.py @@ -3,9 +3,9 @@ import pytest from fastapi import HTTPException -from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo -from collector_db.DTOs.URLMapping import URLMapping -from collector_db.models import UserUrlAgencySuggestion, UserRelevantSuggestion, UserRecordTypeSuggestion +from db.DTOs.InsertURLsInfo import InsertURLsInfo +from db.DTOs.URLMapping import URLMapping +from db.models import UserUrlAgencySuggestion, UserRelevantSuggestion, UserRecordTypeSuggestion from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo @@ -19,7 +19,7 @@ setup_for_get_next_url_for_final_review from html_tag_collector.DataClassTags import ResponseHTMLInfo from tests.helpers.DBDataCreator import BatchURLCreationInfo -from tests.test_automated.integration.api.conftest import MOCK_USER_ID +from tests.automated.integration.api.conftest import MOCK_USER_ID def check_url_mappings_match( map_1: URLMapping, diff --git a/tests/test_automated/integration/api/test_batch.py b/tests/automated/integration/api/test_batch.py similarity index 97% rename from tests/test_automated/integration/api/test_batch.py rename to tests/automated/integration/api/test_batch.py index 961b1a30..2f7e2ebb 100644 --- a/tests/test_automated/integration/api/test_batch.py +++ b/tests/automated/integration/api/test_batch.py @@ -3,8 +3,8 @@ import pytest -from collector_db.DTOs.BatchInfo import BatchInfo -from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo +from db.DTOs.BatchInfo import BatchInfo +from db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.enums import CollectorType, URLStatus from core.enums import BatchStatus diff --git a/tests/test_automated/integration/api/test_duplicates.py b/tests/automated/integration/api/test_duplicates.py similarity index 92% rename from tests/test_automated/integration/api/test_duplicates.py rename to tests/automated/integration/api/test_duplicates.py index 6c6c42ce..654a9c65 100644 --- a/tests/test_automated/integration/api/test_duplicates.py +++ b/tests/automated/integration/api/test_duplicates.py @@ -3,9 +3,9 @@ import pytest -from collector_db.DTOs.BatchInfo import BatchInfo +from db.DTOs.BatchInfo import BatchInfo from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from tests.test_automated.integration.api.conftest import disable_task_trigger +from tests.automated.integration.api.conftest import disable_task_trigger @pytest.mark.asyncio diff --git a/tests/test_automated/integration/api/test_example_collector.py b/tests/automated/integration/api/test_example_collector.py similarity index 95% rename from tests/test_automated/integration/api/test_example_collector.py rename to tests/automated/integration/api/test_example_collector.py index 0b3cf30f..83d1ad6d 100644 --- a/tests/test_automated/integration/api/test_example_collector.py +++ b/tests/automated/integration/api/test_example_collector.py @@ -3,8 +3,8 @@ import pytest -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.BatchInfo import BatchInfo +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DTOs.BatchInfo import BatchInfo from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.ExampleCollector import ExampleCollector from collector_manager.enums import CollectorType @@ -14,7 +14,7 @@ from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from core.enums import BatchStatus from tests.helpers.patch_functions import block_sleep -from tests.test_automated.integration.api.conftest import disable_task_trigger +from tests.automated.integration.api.conftest import disable_task_trigger @pytest.mark.asyncio diff --git a/tests/test_automated/integration/api/test_manual_batch.py b/tests/automated/integration/api/test_manual_batch.py similarity index 98% rename from tests/test_automated/integration/api/test_manual_batch.py rename to tests/automated/integration/api/test_manual_batch.py index e9a101eb..1c0a2ecc 100644 --- a/tests/test_automated/integration/api/test_manual_batch.py +++ b/tests/automated/integration/api/test_manual_batch.py @@ -1,7 +1,7 @@ import pytest -from collector_db.models import Batch, URL, URLOptionalDataSourceMetadata +from db.models import Batch, URL, URLOptionalDataSourceMetadata from collector_manager.enums import CollectorType from core.DTOs.ManualBatchInputDTO import ManualBatchInnerInputDTO, ManualBatchInputDTO from core.enums import RecordType diff --git a/tests/test_automated/integration/api/test_metrics.py b/tests/automated/integration/api/test_metrics.py similarity index 100% rename from tests/test_automated/integration/api/test_metrics.py rename to tests/automated/integration/api/test_metrics.py diff --git a/tests/test_automated/integration/api/test_review.py b/tests/automated/integration/api/test_review.py similarity index 97% rename from tests/test_automated/integration/api/test_review.py rename to tests/automated/integration/api/test_review.py index facd6926..a034b740 100644 --- a/tests/test_automated/integration/api/test_review.py +++ b/tests/automated/integration/api/test_review.py @@ -1,7 +1,7 @@ import pytest -from collector_db.constants import PLACEHOLDER_AGENCY_NAME -from collector_db.models import URL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency +from db.constants import PLACEHOLDER_AGENCY_NAME +from db.models import URL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewBaseInfo, RejectionReason, \ FinalReviewRejectionInfo diff --git a/tests/test_automated/integration/api/test_root.py b/tests/automated/integration/api/test_root.py similarity index 100% rename from tests/test_automated/integration/api/test_root.py rename to tests/automated/integration/api/test_root.py diff --git a/tests/test_automated/integration/api/test_search.py b/tests/automated/integration/api/test_search.py similarity index 100% rename from tests/test_automated/integration/api/test_search.py rename to tests/automated/integration/api/test_search.py diff --git a/tests/test_automated/integration/api/test_task.py b/tests/automated/integration/api/test_task.py similarity index 93% rename from tests/test_automated/integration/api/test_task.py rename to tests/automated/integration/api/test_task.py index 547b0eb8..c13f97f9 100644 --- a/tests/test_automated/integration/api/test_task.py +++ b/tests/automated/integration/api/test_task.py @@ -1,7 +1,7 @@ import pytest -from collector_db.enums import TaskType -from tests.test_automated.integration.api.conftest import APITestHelper +from db.enums import TaskType +from tests.automated.integration.api.conftest import APITestHelper async def task_setup(ath: APITestHelper) -> int: diff --git a/tests/test_automated/integration/api/test_url.py b/tests/automated/integration/api/test_url.py similarity index 95% rename from tests/test_automated/integration/api/test_url.py rename to tests/automated/integration/api/test_url.py index fccd8e4e..9068af5e 100644 --- a/tests/test_automated/integration/api/test_url.py +++ b/tests/automated/integration/api/test_url.py @@ -1,6 +1,6 @@ import pytest -from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo +from db.DTOs.InsertURLsInfo import InsertURLsInfo from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo diff --git a/tests/test_automated/integration/collector_db/README.md b/tests/automated/integration/collector_db/README.md similarity index 100% rename from tests/test_automated/integration/collector_db/README.md rename to tests/automated/integration/collector_db/README.md diff --git a/tests/test_automated/integration/collector_db/__init__.py b/tests/automated/integration/collector_db/__init__.py similarity index 100% rename from tests/test_automated/integration/collector_db/__init__.py rename to tests/automated/integration/collector_db/__init__.py diff --git a/tests/test_automated/integration/collector_db/test_database_structure.py b/tests/automated/integration/collector_db/test_database_structure.py similarity index 97% rename from tests/test_automated/integration/collector_db/test_database_structure.py rename to tests/automated/integration/collector_db/test_database_structure.py index 6d82631c..88b186ad 100644 --- a/tests/test_automated/integration/collector_db/test_database_structure.py +++ b/tests/automated/integration/collector_db/test_database_structure.py @@ -16,10 +16,10 @@ from sqlalchemy.dialects import postgresql from sqlalchemy.exc import DataError, DBAPIError -from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo -from collector_db.enums import URLHTMLContentType -from collector_db.helper_functions import get_postgres_connection_string -from collector_db.models import Base, Agency +from db.DTOs.InsertURLsInfo import InsertURLsInfo +from db.enums import URLHTMLContentType +from db.helper_functions import get_postgres_connection_string +from db.models import Base, Agency from collector_manager.enums import CollectorType, URLStatus from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from core.enums import BatchStatus, SuggestionType diff --git a/tests/test_automated/integration/collector_db/test_db_client.py b/tests/automated/integration/collector_db/test_db_client.py similarity index 98% rename from tests/test_automated/integration/collector_db/test_db_client.py rename to tests/automated/integration/collector_db/test_db_client.py index b0c5e91d..644bd500 100644 --- a/tests/test_automated/integration/collector_db/test_db_client.py +++ b/tests/automated/integration/collector_db/test_db_client.py @@ -3,14 +3,14 @@ import pytest from fastapi import HTTPException -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.BatchInfo import BatchInfo -from collector_db.DTOs.LogInfo import LogInfo -from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from collector_db.DTOs.URLInfo import URLInfo -from collector_db.DTOs.URLMapping import URLMapping -from collector_db.constants import PLACEHOLDER_AGENCY_NAME -from collector_db.models import URL, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DTOs.BatchInfo import BatchInfo +from db.DTOs.LogInfo import LogInfo +from db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from db.DTOs.URLInfo import URLInfo +from db.DTOs.URLMapping import URLMapping +from db.constants import PLACEHOLDER_AGENCY_NAME +from db.models import URL, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.enums import BatchStatus, RecordType, SuggestionType, SuggestedStatus diff --git a/tests/test_automated/integration/conftest.py b/tests/automated/integration/conftest.py similarity index 93% rename from tests/test_automated/integration/conftest.py rename to tests/automated/integration/conftest.py index 70c79c22..3912f3e8 100644 --- a/tests/test_automated/integration/conftest.py +++ b/tests/automated/integration/conftest.py @@ -2,7 +2,7 @@ import pytest -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from db.AsyncDatabaseClient import AsyncDatabaseClient from collector_manager.AsyncCollectorManager import AsyncCollectorManager from core.AsyncCore import AsyncCore from core.AsyncCoreLogger import AsyncCoreLogger diff --git a/tests/test_automated/integration/core/README.md b/tests/automated/integration/core/README.md similarity index 100% rename from tests/test_automated/integration/core/README.md rename to tests/automated/integration/core/README.md diff --git a/tests/test_automated/integration/core/__init__.py b/tests/automated/integration/core/__init__.py similarity index 100% rename from tests/test_automated/integration/core/__init__.py rename to tests/automated/integration/core/__init__.py diff --git a/tests/test_automated/integration/core/helpers/README.md b/tests/automated/integration/core/helpers/README.md similarity index 100% rename from tests/test_automated/integration/core/helpers/README.md rename to tests/automated/integration/core/helpers/README.md diff --git a/tests/test_automated/integration/core/helpers/__init__.py b/tests/automated/integration/core/helpers/__init__.py similarity index 100% rename from tests/test_automated/integration/core/helpers/__init__.py rename to tests/automated/integration/core/helpers/__init__.py diff --git a/tests/test_automated/integration/core/helpers/constants.py b/tests/automated/integration/core/helpers/constants.py similarity index 100% rename from tests/test_automated/integration/core/helpers/constants.py rename to tests/automated/integration/core/helpers/constants.py diff --git a/tests/test_automated/integration/core/test_async_core.py b/tests/automated/integration/core/test_async_core.py similarity index 97% rename from tests/test_automated/integration/core/test_async_core.py rename to tests/automated/integration/core/test_async_core.py index e43b519f..7fa3d757 100644 --- a/tests/test_automated/integration/core/test_async_core.py +++ b/tests/automated/integration/core/test_async_core.py @@ -3,9 +3,9 @@ import pytest -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.enums import TaskType -from collector_db.models import Task +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.enums import TaskType +from db.models import Task from core.AsyncCore import AsyncCore from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome from core.TaskManager import TaskManager diff --git a/tests/test_automated/integration/core/test_example_collector_lifecycle.py b/tests/automated/integration/core/test_example_collector_lifecycle.py similarity index 97% rename from tests/test_automated/integration/core/test_example_collector_lifecycle.py rename to tests/automated/integration/core/test_example_collector_lifecycle.py index 18411457..f094e5b7 100644 --- a/tests/test_automated/integration/core/test_example_collector_lifecycle.py +++ b/tests/automated/integration/core/test_example_collector_lifecycle.py @@ -2,7 +2,7 @@ import pytest -from collector_db.DTOs.BatchInfo import BatchInfo +from db.DTOs.BatchInfo import BatchInfo from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.enums import CollectorType, URLStatus from core.AsyncCore import AsyncCore diff --git a/tests/test_automated/integration/html_tag_collector/__init__.py b/tests/automated/integration/html_tag_collector/__init__.py similarity index 100% rename from tests/test_automated/integration/html_tag_collector/__init__.py rename to tests/automated/integration/html_tag_collector/__init__.py diff --git a/tests/test_automated/integration/html_tag_collector/test_root_url_cache.py b/tests/automated/integration/html_tag_collector/test_root_url_cache.py similarity index 100% rename from tests/test_automated/integration/html_tag_collector/test_root_url_cache.py rename to tests/automated/integration/html_tag_collector/test_root_url_cache.py diff --git a/tests/test_automated/integration/security_manager/__init__.py b/tests/automated/integration/security_manager/__init__.py similarity index 100% rename from tests/test_automated/integration/security_manager/__init__.py rename to tests/automated/integration/security_manager/__init__.py diff --git a/tests/test_automated/integration/security_manager/test_security_manager.py b/tests/automated/integration/security_manager/test_security_manager.py similarity index 100% rename from tests/test_automated/integration/security_manager/test_security_manager.py rename to tests/automated/integration/security_manager/test_security_manager.py diff --git a/tests/test_automated/integration/tasks/__init__.py b/tests/automated/integration/tasks/__init__.py similarity index 100% rename from tests/test_automated/integration/tasks/__init__.py rename to tests/automated/integration/tasks/__init__.py diff --git a/tests/test_automated/integration/tasks/conftest.py b/tests/automated/integration/tasks/conftest.py similarity index 100% rename from tests/test_automated/integration/tasks/conftest.py rename to tests/automated/integration/tasks/conftest.py diff --git a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py b/tests/automated/integration/tasks/test_agency_preannotation_task.py similarity index 99% rename from tests/test_automated/integration/tasks/test_agency_preannotation_task.py rename to tests/automated/integration/tasks/test_agency_preannotation_task.py index e6278292..c0de5c52 100644 --- a/tests/test_automated/integration/tasks/test_agency_preannotation_task.py +++ b/tests/automated/integration/tasks/test_agency_preannotation_task.py @@ -7,7 +7,7 @@ from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponseType, AgencyLookupResponse -from collector_db.models import Agency, AutomatedUrlAgencySuggestion +from db.models import Agency, AutomatedUrlAgencySuggestion from collector_manager.enums import CollectorType, URLStatus from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo diff --git a/tests/test_automated/integration/tasks/test_example_task.py b/tests/automated/integration/tasks/test_example_task.py similarity index 97% rename from tests/test_automated/integration/tasks/test_example_task.py rename to tests/automated/integration/tasks/test_example_task.py index 2211458c..c0515103 100644 --- a/tests/test_automated/integration/tasks/test_example_task.py +++ b/tests/automated/integration/tasks/test_example_task.py @@ -2,7 +2,7 @@ import pytest -from collector_db.enums import TaskType +from db.enums import TaskType from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase from tests.helpers.DBDataCreator import DBDataCreator diff --git a/tests/test_automated/integration/tasks/test_submit_approved_url_task.py b/tests/automated/integration/tasks/test_submit_approved_url_task.py similarity index 98% rename from tests/test_automated/integration/tasks/test_submit_approved_url_task.py rename to tests/automated/integration/tasks/test_submit_approved_url_task.py index 1477915f..d5453005 100644 --- a/tests/test_automated/integration/tasks/test_submit_approved_url_task.py +++ b/tests/automated/integration/tasks/test_submit_approved_url_task.py @@ -4,8 +4,8 @@ import pytest from deepdiff import DeepDiff -from collector_db.enums import TaskType -from collector_db.models import URL, URLErrorInfo, URLDataSource +from db.enums import TaskType +from db.models import URL, URLErrorInfo, URLDataSource from collector_manager.enums import URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome diff --git a/tests/test_automated/integration/tasks/test_url_404_probe.py b/tests/automated/integration/tasks/test_url_404_probe.py similarity index 99% rename from tests/test_automated/integration/tasks/test_url_404_probe.py rename to tests/automated/integration/tasks/test_url_404_probe.py index e248363a..a897a59e 100644 --- a/tests/test_automated/integration/tasks/test_url_404_probe.py +++ b/tests/automated/integration/tasks/test_url_404_probe.py @@ -5,7 +5,7 @@ import pytest from aiohttp import ClientResponseError, RequestInfo -from collector_db.models import URLProbedFor404, URL +from db.models import URLProbedFor404, URL from collector_manager.enums import URLStatus from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.task_operators.URL404ProbeTaskOperator import URL404ProbeTaskOperator diff --git a/tests/test_automated/integration/tasks/test_url_duplicate_task.py b/tests/automated/integration/tasks/test_url_duplicate_task.py similarity index 96% rename from tests/test_automated/integration/tasks/test_url_duplicate_task.py rename to tests/automated/integration/tasks/test_url_duplicate_task.py index d66cfe27..0987a2f4 100644 --- a/tests/test_automated/integration/tasks/test_url_duplicate_task.py +++ b/tests/automated/integration/tasks/test_url_duplicate_task.py @@ -3,8 +3,8 @@ import pytest -from collector_db.DTOs.URLMapping import URLMapping -from collector_db.models import URL, URLCheckedForDuplicate +from db.DTOs.URLMapping import URLMapping +from db.models import URL, URLCheckedForDuplicate from collector_manager.enums import URLStatus from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.task_operators.URLDuplicateTaskOperator import URLDuplicateTaskOperator diff --git a/tests/test_automated/integration/tasks/test_url_html_task.py b/tests/automated/integration/tasks/test_url_html_task.py similarity index 97% rename from tests/test_automated/integration/tasks/test_url_html_task.py rename to tests/automated/integration/tasks/test_url_html_task.py index aeb0db7f..7926b26b 100644 --- a/tests/test_automated/integration/tasks/test_url_html_task.py +++ b/tests/automated/integration/tasks/test_url_html_task.py @@ -5,8 +5,8 @@ import pytest from aiohttp import ClientError, ClientResponseError, RequestInfo -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.enums import TaskType +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.enums import TaskType from collector_manager.enums import URLStatus from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator diff --git a/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py b/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py similarity index 98% rename from tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py rename to tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py index 526efa70..2b63c33c 100644 --- a/tests/test_automated/integration/tasks/test_url_miscellaneous_metadata_task.py +++ b/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py @@ -2,7 +2,7 @@ import pytest -from collector_db.models import URL, URLOptionalDataSourceMetadata +from db.models import URL, URLOptionalDataSourceMetadata from collector_manager.enums import CollectorType from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.task_operators.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator diff --git a/tests/test_automated/integration/tasks/test_url_record_type_task.py b/tests/automated/integration/tasks/test_url_record_type_task.py similarity index 95% rename from tests/test_automated/integration/tasks/test_url_record_type_task.py rename to tests/automated/integration/tasks/test_url_record_type_task.py index c941bcf7..1f26812a 100644 --- a/tests/test_automated/integration/tasks/test_url_record_type_task.py +++ b/tests/automated/integration/tasks/test_url_record_type_task.py @@ -2,8 +2,8 @@ import pytest -from collector_db.enums import TaskType -from collector_db.models import AutoRecordTypeSuggestion +from db.enums import TaskType +from db.models import AutoRecordTypeSuggestion from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from core.classes.task_operators.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator from core.enums import RecordType diff --git a/tests/test_automated/unit/__init__.py b/tests/automated/unit/__init__.py similarity index 100% rename from tests/test_automated/unit/__init__.py rename to tests/automated/unit/__init__.py diff --git a/tests/test_automated/unit/core/__init__.py b/tests/automated/unit/core/__init__.py similarity index 100% rename from tests/test_automated/unit/core/__init__.py rename to tests/automated/unit/core/__init__.py diff --git a/tests/test_automated/unit/core/test_core_logger.py b/tests/automated/unit/core/test_core_logger.py similarity index 94% rename from tests/test_automated/unit/core/test_core_logger.py rename to tests/automated/unit/core/test_core_logger.py index b0d52055..f60f989c 100644 --- a/tests/test_automated/unit/core/test_core_logger.py +++ b/tests/automated/unit/core/test_core_logger.py @@ -3,7 +3,7 @@ import pytest -from collector_db.DTOs.LogInfo import LogInfo +from db.DTOs.LogInfo import LogInfo from core.AsyncCoreLogger import AsyncCoreLogger diff --git a/tests/test_automated/unit/dto/__init__.py b/tests/automated/unit/dto/__init__.py similarity index 100% rename from tests/test_automated/unit/dto/__init__.py rename to tests/automated/unit/dto/__init__.py diff --git a/tests/test_automated/unit/dto/test_all_annotation_post_info.py b/tests/automated/unit/dto/test_all_annotation_post_info.py similarity index 100% rename from tests/test_automated/unit/dto/test_all_annotation_post_info.py rename to tests/automated/unit/dto/test_all_annotation_post_info.py diff --git a/tests/test_automated/unit/security_manager/__init__.py b/tests/automated/unit/security_manager/__init__.py similarity index 100% rename from tests/test_automated/unit/security_manager/__init__.py rename to tests/automated/unit/security_manager/__init__.py diff --git a/tests/test_automated/unit/security_manager/test_security_manager.py b/tests/automated/unit/security_manager/test_security_manager.py similarity index 100% rename from tests/test_automated/unit/security_manager/test_security_manager.py rename to tests/automated/unit/security_manager/test_security_manager.py diff --git a/tests/test_automated/unit/source_collectors/__init__.py b/tests/automated/unit/source_collectors/__init__.py similarity index 100% rename from tests/test_automated/unit/source_collectors/__init__.py rename to tests/automated/unit/source_collectors/__init__.py diff --git a/tests/test_automated/unit/source_collectors/test_autogoogler_collector.py b/tests/automated/unit/source_collectors/test_autogoogler_collector.py similarity index 92% rename from tests/test_automated/unit/source_collectors/test_autogoogler_collector.py rename to tests/automated/unit/source_collectors/test_autogoogler_collector.py index c3fafa61..dc5de285 100644 --- a/tests/test_automated/unit/source_collectors/test_autogoogler_collector.py +++ b/tests/automated/unit/source_collectors/test_autogoogler_collector.py @@ -2,8 +2,8 @@ import pytest -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.URLInfo import URLInfo +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DTOs.URLInfo import URLInfo from core.AsyncCoreLogger import AsyncCoreLogger from source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector from source_collectors.auto_googler.DTOs import GoogleSearchQueryResultsInnerDTO, AutoGooglerInputDTO diff --git a/tests/test_automated/unit/source_collectors/test_ckan_collector.py b/tests/automated/unit/source_collectors/test_ckan_collector.py similarity index 97% rename from tests/test_automated/unit/source_collectors/test_ckan_collector.py rename to tests/automated/unit/source_collectors/test_ckan_collector.py index e0e9ee47..747b0852 100644 --- a/tests/test_automated/unit/source_collectors/test_ckan_collector.py +++ b/tests/automated/unit/source_collectors/test_ckan_collector.py @@ -4,7 +4,7 @@ import pytest -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from db.AsyncDatabaseClient import AsyncDatabaseClient from core.AsyncCoreLogger import AsyncCoreLogger from source_collectors.ckan.CKANCollector import CKANCollector from source_collectors.ckan.DTOs import CKANInputDTO diff --git a/tests/test_automated/unit/source_collectors/test_common_crawl_collector.py b/tests/automated/unit/source_collectors/test_common_crawl_collector.py similarity index 93% rename from tests/test_automated/unit/source_collectors/test_common_crawl_collector.py rename to tests/automated/unit/source_collectors/test_common_crawl_collector.py index 1c5aa6ee..6023b8cf 100644 --- a/tests/test_automated/unit/source_collectors/test_common_crawl_collector.py +++ b/tests/automated/unit/source_collectors/test_common_crawl_collector.py @@ -2,8 +2,8 @@ import pytest -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.URLInfo import URLInfo +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DTOs.URLInfo import URLInfo from core.AsyncCoreLogger import AsyncCoreLogger from source_collectors.common_crawler.CommonCrawlerCollector import CommonCrawlerCollector from source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO diff --git a/tests/test_automated/unit/source_collectors/test_example_collector.py b/tests/automated/unit/source_collectors/test_example_collector.py similarity index 90% rename from tests/test_automated/unit/source_collectors/test_example_collector.py rename to tests/automated/unit/source_collectors/test_example_collector.py index b770d952..e5d113cc 100644 --- a/tests/test_automated/unit/source_collectors/test_example_collector.py +++ b/tests/automated/unit/source_collectors/test_example_collector.py @@ -1,6 +1,6 @@ from unittest.mock import AsyncMock -from collector_db.DatabaseClient import DatabaseClient +from db.DatabaseClient import DatabaseClient from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.ExampleCollector import ExampleCollector from core.AsyncCoreLogger import AsyncCoreLogger diff --git a/tests/test_automated/unit/source_collectors/test_muckrock_collectors.py b/tests/automated/unit/source_collectors/test_muckrock_collectors.py similarity index 98% rename from tests/test_automated/unit/source_collectors/test_muckrock_collectors.py rename to tests/automated/unit/source_collectors/test_muckrock_collectors.py index 100fbb6e..cd49ffb6 100644 --- a/tests/test_automated/unit/source_collectors/test_muckrock_collectors.py +++ b/tests/automated/unit/source_collectors/test_muckrock_collectors.py @@ -3,8 +3,8 @@ import pytest -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.URLInfo import URLInfo +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DTOs.URLInfo import URLInfo from core.AsyncCoreLogger import AsyncCoreLogger from source_collectors.muckrock.DTOs import MuckrockSimpleSearchCollectorInputDTO, \ MuckrockCountySearchCollectorInputDTO, MuckrockAllFOIARequestsCollectorInputDTO diff --git a/tests/test_automated/unit/test_function_trigger.py b/tests/automated/unit/test_function_trigger.py similarity index 100% rename from tests/test_automated/unit/test_function_trigger.py rename to tests/automated/unit/test_function_trigger.py diff --git a/tests/conftest.py b/tests/conftest.py index c8f4bd64..99281103 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,10 +3,10 @@ from sqlalchemy import create_engine, inspect, MetaData from sqlalchemy.orm import scoped_session, sessionmaker -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DatabaseClient import DatabaseClient -from collector_db.helper_functions import get_postgres_connection_string -from collector_db.models import Base +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DatabaseClient import DatabaseClient +from db.helper_functions import get_postgres_connection_string +from db.models import Base from core.EnvVarManager import EnvVarManager from tests.helpers.AlembicRunner import AlembicRunner from tests.helpers.DBDataCreator import DBDataCreator diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 2ccf47fa..a0036e2a 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -5,16 +5,16 @@ from pydantic import BaseModel, model_validator -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.BatchInfo import BatchInfo -from collector_db.DTOs.DuplicateInfo import DuplicateInsertInfo -from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo -from collector_db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType -from collector_db.DTOs.URLInfo import URLInfo -from collector_db.DTOs.URLMapping import URLMapping -from collector_db.DatabaseClient import DatabaseClient -from collector_db.enums import TaskType +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DTOs.BatchInfo import BatchInfo +from db.DTOs.DuplicateInfo import DuplicateInsertInfo +from db.DTOs.InsertURLsInfo import InsertURLsInfo +from db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType +from db.DTOs.URLInfo import URLInfo +from db.DTOs.URLMapping import URLMapping +from db.DatabaseClient import DatabaseClient +from db.enums import TaskType from collector_manager.enums import CollectorType, URLStatus from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo diff --git a/tests/helpers/assert_functions.py b/tests/helpers/assert_functions.py index ef379d3e..7deaacc3 100644 --- a/tests/helpers/assert_functions.py +++ b/tests/helpers/assert_functions.py @@ -1,5 +1,5 @@ -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.models import Task +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.models import Task async def assert_database_has_no_tasks(adb_client: AsyncDatabaseClient): diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index bc03020f..32dfca02 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -2,8 +2,8 @@ from pydantic import BaseModel -from collector_db.DTOs.InsertURLsInfo import InsertURLsInfo -from collector_db.DTOs.URLMapping import URLMapping +from db.DTOs.InsertURLsInfo import InsertURLsInfo +from db.DTOs.URLMapping import URLMapping from collector_manager.enums import URLStatus from core.enums import RecordType, SuggestionType from tests.helpers.DBDataCreator import BatchURLCreationInfo diff --git a/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py b/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py index 9e5c0e49..d832c2a8 100644 --- a/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py +++ b/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py @@ -3,7 +3,7 @@ import dotenv import api.dependencies -from collector_db.DTOs.BatchInfo import BatchInfo +from db.DTOs.BatchInfo import BatchInfo from collector_manager.enums import CollectorType from core.enums import BatchStatus from test_automated.integration.core.helpers.common_test_procedures import run_collector_and_wait_for_completion diff --git a/tests/manual/core/lifecycle/test_ckan_lifecycle.py b/tests/manual/core/lifecycle/test_ckan_lifecycle.py index 4e87bbbd..2d4a4f7a 100644 --- a/tests/manual/core/lifecycle/test_ckan_lifecycle.py +++ b/tests/manual/core/lifecycle/test_ckan_lifecycle.py @@ -1,6 +1,6 @@ import api.dependencies -from collector_db.DTOs.BatchInfo import BatchInfo +from db.DTOs.BatchInfo import BatchInfo from collector_manager.enums import CollectorType from core.enums import BatchStatus from source_collectors.ckan.search_terms import group_search, package_search, organization_search diff --git a/tests/manual/core/lifecycle/test_muckrock_lifecycles.py b/tests/manual/core/lifecycle/test_muckrock_lifecycles.py index 72d2d9fc..26e4aa36 100644 --- a/tests/manual/core/lifecycle/test_muckrock_lifecycles.py +++ b/tests/manual/core/lifecycle/test_muckrock_lifecycles.py @@ -1,6 +1,6 @@ import api.dependencies -from collector_db.DTOs.BatchInfo import BatchInfo +from db.DTOs.BatchInfo import BatchInfo from collector_manager.enums import CollectorType from core.enums import BatchStatus from test_automated.integration.core.helpers.common_test_procedures import run_collector_and_wait_for_completion diff --git a/tests/manual/html_collector/test_html_tag_collector_integration.py b/tests/manual/html_collector/test_html_tag_collector_integration.py index 228f4b68..5777f907 100644 --- a/tests/manual/html_collector/test_html_tag_collector_integration.py +++ b/tests/manual/html_collector/test_html_tag_collector_integration.py @@ -1,7 +1,7 @@ import pytest -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_db.DTOs.URLInfo import URLInfo +from db.AsyncDatabaseClient import AsyncDatabaseClient +from db.DTOs.URLInfo import URLInfo from core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator from tests.helpers.DBDataCreator import DBDataCreator from html_tag_collector.ResponseParser import HTMLResponseParser diff --git a/tests/manual/llm_api_logic/test_deepseek_record_classifier.py b/tests/manual/llm_api_logic/test_deepseek_record_classifier.py index b0a6c1fb..18363a71 100644 --- a/tests/manual/llm_api_logic/test_deepseek_record_classifier.py +++ b/tests/manual/llm_api_logic/test_deepseek_record_classifier.py @@ -1,12 +1,12 @@ import pytest -from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo from llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier @pytest.mark.asyncio async def test_deepseek_record_classifier(): - from collector_db.DTOs.URLHTMLContentInfo import HTMLContentType as hct + from db.DTOs.URLHTMLContentInfo import HTMLContentType as hct d = { hct.TITLE: "Oath of Office for Newly Promoted Corporal Lumpkin with Acworth Police – City of Acworth, GA", diff --git a/tests/manual/llm_api_logic/test_openai_record_classifier.py b/tests/manual/llm_api_logic/test_openai_record_classifier.py index 72d474d2..57b56a54 100644 --- a/tests/manual/llm_api_logic/test_openai_record_classifier.py +++ b/tests/manual/llm_api_logic/test_openai_record_classifier.py @@ -1,12 +1,12 @@ import pytest -from collector_db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo from llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier @pytest.mark.asyncio async def test_openai_record_classifier(): - from collector_db.DTOs.URLHTMLContentInfo import HTMLContentType as hct + from db.DTOs.URLHTMLContentInfo import HTMLContentType as hct d = { hct.TITLE: "Oath of Office for Newly Promoted Corporal Lumpkin with Acworth Police – City of Acworth, GA", diff --git a/tests/manual/source_collectors/test_autogoogler_collector.py b/tests/manual/source_collectors/test_autogoogler_collector.py index c9942106..cabdcc1e 100644 --- a/tests/manual/source_collectors/test_autogoogler_collector.py +++ b/tests/manual/source_collectors/test_autogoogler_collector.py @@ -2,7 +2,7 @@ import pytest -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from db.AsyncDatabaseClient import AsyncDatabaseClient from core.AsyncCoreLogger import AsyncCoreLogger from source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector from source_collectors.auto_googler.DTOs import AutoGooglerInputDTO diff --git a/tests/manual/source_collectors/test_ckan_collector.py b/tests/manual/source_collectors/test_ckan_collector.py index f9deaf02..e6a6c1f8 100644 --- a/tests/manual/source_collectors/test_ckan_collector.py +++ b/tests/manual/source_collectors/test_ckan_collector.py @@ -3,7 +3,7 @@ import pytest from marshmallow import Schema, fields -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from db.AsyncDatabaseClient import AsyncDatabaseClient from core.AsyncCoreLogger import AsyncCoreLogger from source_collectors.ckan.CKANCollector import CKANCollector from source_collectors.ckan.DTOs import CKANInputDTO diff --git a/tests/manual/source_collectors/test_common_crawler_collector.py b/tests/manual/source_collectors/test_common_crawler_collector.py index cb1c4f78..12be9ec7 100644 --- a/tests/manual/source_collectors/test_common_crawler_collector.py +++ b/tests/manual/source_collectors/test_common_crawler_collector.py @@ -3,7 +3,7 @@ import pytest from marshmallow import Schema, fields -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from db.AsyncDatabaseClient import AsyncDatabaseClient from core.AsyncCoreLogger import AsyncCoreLogger from source_collectors.common_crawler.CommonCrawlerCollector import CommonCrawlerCollector from source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO diff --git a/tests/manual/source_collectors/test_muckrock_collectors.py b/tests/manual/source_collectors/test_muckrock_collectors.py index 49bfa5fb..c30473df 100644 --- a/tests/manual/source_collectors/test_muckrock_collectors.py +++ b/tests/manual/source_collectors/test_muckrock_collectors.py @@ -2,14 +2,14 @@ import pytest -from collector_db.AsyncDatabaseClient import AsyncDatabaseClient +from db.AsyncDatabaseClient import AsyncDatabaseClient from core.AsyncCoreLogger import AsyncCoreLogger from source_collectors.muckrock.DTOs import MuckrockSimpleSearchCollectorInputDTO, \ MuckrockCountySearchCollectorInputDTO, MuckrockAllFOIARequestsCollectorInputDTO from source_collectors.muckrock.classes.MuckrockCollector import MuckrockSimpleSearchCollector, \ MuckrockCountyLevelSearchCollector, MuckrockAllFOIARequestsCollector from source_collectors.muckrock.schemas import MuckrockURLInfoSchema -from tests.test_automated.integration.core.helpers.constants import ALLEGHENY_COUNTY_MUCKROCK_ID, \ +from tests.automated.integration.core.helpers.constants import ALLEGHENY_COUNTY_MUCKROCK_ID, \ ALLEGHENY_COUNTY_TOWN_NAMES From 0bdb82d81f5b5b5e384c8f74edfbe5e524aa8304 Mon Sep 17 00:00:00 2001 From: maxachis Date: Tue, 27 May 2025 15:50:46 -0400 Subject: [PATCH 196/244] Begin moving files to `src` --- Dockerfile | 14 +-- alembic/env.py | 4 +- ...45b1c_add_task_tables_and_linking_logic.py | 2 +- ...19bf57df581a_add_url_agency_suggestions.py | 2 +- ...9_create_htmlcontent_and_rooturl_tables.py | 2 +- ...daf0_revise_agency_identification_logic.py | 2 +- api/dependencies.py | 4 +- api/main.py | 24 +++--- api/routes/annotate.py | 18 ++-- api/routes/batch.py | 21 +++-- api/routes/collector.py | 18 ++-- api/routes/metrics.py | 16 ++-- api/routes/review.py | 9 +- api/routes/root.py | 2 +- api/routes/search.py | 6 +- api/routes/task.py | 12 +-- api/routes/url.py | 6 +- apply_migrations.py | 2 +- collector_manager/AsyncCollectorBase.py | 14 +-- collector_manager/AsyncCollectorManager.py | 6 +- collector_manager/ExampleCollector.py | 2 +- collector_manager/collector_mapping.py | 8 +- .../fetch_requests/FOIALoopFetchRequest.py | 5 -- {core/DTOs => src}/__init__.py | 0 {core => src/core}/AsyncCore.py | 64 +++++++------- {core => src/core}/AsyncCoreLogger.py | 4 +- .../core}/DTOs/AllAnnotationPostInfo.py | 8 +- .../core}/DTOs/AnnotationRequestInfo.py | 2 +- {core => src/core}/DTOs/BatchStatusInfo.py | 2 +- .../core}/DTOs/CollectionLifecycleInfo.py | 4 +- {core => src/core}/DTOs/CollectorStartInfo.py | 0 .../core}/DTOs/CollectorStartParams.py | 0 .../core}/DTOs/FinalReviewApprovalInfo.py | 2 +- .../core}/DTOs/GetBatchLogsResponse.py | 2 +- .../core}/DTOs/GetBatchStatusResponse.py | 2 +- .../DTOs/GetDuplicatesByBatchResponse.py | 2 +- .../core}/DTOs/GetMetricsBacklogResponse.py | 0 .../GetMetricsBatchesAggregatedResponseDTO.py | 0 .../GetMetricsBatchesBreakdownResponseDTO.py | 2 +- .../GetMetricsURLsAggregatedResponseDTO.py | 0 ...tMetricsURLsBreakdownPendingResponseDTO.py | 0 ...etricsURLsBreakdownSubmittedResponseDTO.py | 0 ...GetNextRecordTypeAnnotationResponseInfo.py | 6 +- .../GetNextRelevanceAnnotationResponseInfo.py | 5 +- .../GetNextURLForAgencyAnnotationResponse.py | 6 +- .../GetNextURLForAllAnnotationResponse.py | 6 +- .../DTOs/GetNextURLForFinalReviewResponse.py | 6 +- {core => src/core}/DTOs/GetTasksResponse.py | 4 +- .../core}/DTOs/GetURLsByBatchResponse.py | 2 +- .../core}/DTOs/GetURLsResponseInfo.py | 2 +- .../core}/DTOs/ManualBatchInputDTO.py | 2 +- .../core}/DTOs/ManualBatchResponseDTO.py | 0 .../core}/DTOs/MessageCountResponse.py | 2 +- {core => src/core}/DTOs/MessageResponse.py | 0 {core => src/core}/DTOs/README.md | 0 .../DTOs/RecordTypeAnnotationPostInfo.py | 2 +- .../core}/DTOs/RelevanceAnnotationPostInfo.py | 2 +- {core => src/core}/DTOs/ResponseURLInfo.py | 0 {core => src/core}/DTOs/SearchURLResponse.py | 0 .../core}/DTOs/TaskOperatorRunInfo.py | 0 .../core}/DTOs/URLAgencySuggestionInfo.py | 2 +- .../core/DTOs}/__init__.py | 0 .../AgencyIdentificationTDO.py | 0 .../core}/DTOs/task_data_objects/README.md | 0 .../task_data_objects/SubmitApprovedURLTDO.py | 2 +- .../DTOs/task_data_objects/URL404ProbeTDO.py | 0 .../DTOs/task_data_objects/URLDuplicateTDO.py | 0 .../URLMiscellaneousMetadataTDO.py | 0 .../task_data_objects/URLRecordTypeTDO.py | 4 +- .../DTOs/task_data_objects/UrlHtmlTDO.py | 6 +- .../core/DTOs/task_data_objects}/__init__.py | 0 {core => src/core}/EnvVarManager.py | 0 {core => src/core}/FunctionTrigger.py | 0 {core => src/core}/README.md | 0 {core => src/core}/ScheduledTaskManager.py | 2 +- {core => src/core}/SourceCollectorCore.py | 7 +- {core => src/core}/TaskManager.py | 40 ++++----- {core/classes => src/core}/__init__.py | 0 {core => src/core}/classes/ErrorManager.py | 2 +- .../core}/classes/HTMLContentInfoGetter.py | 4 +- .../core/classes}/__init__.py | 0 .../AgencyIdentificationSubtaskBase.py | 2 +- .../AutoGooglerAgencyIdentificationSubtask.py | 6 +- .../CKANAgencyIdentificationSubtask.py | 8 +- ...ommonCrawlerAgencyIdentificationSubtask.py | 4 +- .../AutoGooglerMiscMetadataSubtask.py | 4 +- .../CKANMiscMetadataSubtask.py | 4 +- .../MiscellaneousMetadataSubtaskBase.py | 2 +- .../MuckrockMiscMetadataSubtask.py | 4 +- .../MiscellaneousMetadata}/__init__.py | 0 .../MuckrockAgencyIdentificationSubtask.py | 12 +-- .../core/classes/subtasks}/__init__.py | 0 .../AgencyIdentificationTaskOperator.py | 26 +++--- .../SubmitApprovedURLTaskOperator.py | 12 +-- .../task_operators/TaskOperatorBase.py | 8 +- .../task_operators/URL404ProbeTaskOperator.py | 10 +-- .../URLDuplicateTaskOperator.py | 10 +-- .../task_operators/URLHTMLTaskOperator.py | 18 ++-- .../URLMiscellaneousMetadataTaskOperator.py | 18 ++-- .../URLRecordTypeTaskOperator.py | 14 +-- .../core/classes/task_operators}/__init__.py | 0 {core => src/core}/enums.py | 0 {core => src/core}/exceptions.py | 0 {core => src/core}/helpers.py | 14 ++- .../preprocessors/AutoGooglerPreprocessor.py | 4 +- .../core}/preprocessors/CKANPreprocessor.py | 2 +- .../CommonCrawlerPreprocessor.py | 4 +- .../preprocessors/ExamplePreprocessor.py | 4 +- .../preprocessors/MuckrockPreprocessor.py | 4 +- .../core}/preprocessors/PreprocessorBase.py | 2 +- {core => src/core}/preprocessors/README.md | 0 .../core/preprocessors}/__init__.py | 0 {db => src/db}/AsyncDatabaseClient.py | 86 +++++++++---------- {db => src/db}/ConfigManager.py | 0 {db => src/db}/DTOConverter.py | 16 ++-- {db => src/db}/DTOs/BatchInfo.py | 2 +- {db => src/db}/DTOs/DuplicateInfo.py | 0 .../db}/DTOs/GetTaskStatusResponseInfo.py | 2 +- {db => src/db}/DTOs/InsertURLsInfo.py | 2 +- {db => src/db}/DTOs/LogInfo.py | 0 {db => src/db}/DTOs/MetadataAnnotationInfo.py | 0 {db => src/db}/DTOs/README.md | 0 {db => src/db}/DTOs/TaskInfo.py | 8 +- {db => src/db}/DTOs/URLAnnotationInfo.py | 2 +- {db => src/db}/DTOs/URLErrorInfos.py | 0 {db => src/db}/DTOs/URLHTMLContentInfo.py | 0 {db => src/db}/DTOs/URLInfo.py | 0 {db => src/db}/DTOs/URLMapping.py | 0 {db => src/db}/DTOs/URLMetadataInfo.py | 2 +- {db => src/db}/DTOs/URLRelevancyInfo.py | 0 {db => src/db}/DTOs/URLWithHTML.py | 2 +- {db => src/db/DTOs}/__init__.py | 0 {db => src/db}/DatabaseClient.py | 27 +++--- {db => src/db}/README.md | 0 {db => src/db}/StatementComposer.py | 15 ++-- {html_tag_collector => src/db}/__init__.py | 0 {db => src/db}/constants.py | 0 {db => src/db}/enums.py | 0 {db => src/db}/helper_functions.py | 6 +- {db => src/db}/models.py | 6 +- .../html_tag_collector}/DataClassTags.py | 2 +- .../html_tag_collector}/README.md | 0 .../html_tag_collector}/ResponseParser.py | 14 ++- .../html_tag_collector}/RootURLCache.py | 4 +- .../URLRequestInterface.py | 0 .../html_tag_collector}/__init__.py | 0 .../html_tag_collector}/constants.py | 0 .../url_adjustment_functions.py | 0 .../html_tag_collector}/util.py | 0 .../DeepSeekRecordClassifier.py | 5 +- .../llm_api_logic}/LLMRecordClassifierBase.py | 8 +- .../llm_api_logic}/OpenAIRecordClassifier.py | 6 +- .../RecordTypeStructuredOutput.py | 2 +- .../llm_api_logic}/__init__.py | 0 .../llm_api_logic}/constants.py | 0 .../llm_api_logic}/helpers.py | 2 +- .../pdap_api_client}/DTOs.py | 2 +- .../pdap_api_client}/PDAPClient.py | 6 +- .../pdap_api_client}/__init__.py | 0 .../pdap_api_client}/enums.py | 0 .../security_manager}/SecurityManager.py | 0 .../security_manager}/__init__.py | 0 .../source_collectors}/README.md | 0 .../source_collectors}/__init__.py | 0 .../auto_googler/AutoGoogler.py | 8 +- .../auto_googler/AutoGooglerCollector.py | 12 +-- .../source_collectors}/auto_googler/DTOs.py | 0 .../auto_googler/GoogleSearcher.py | 4 +- .../source_collectors}/auto_googler/README.md | 0 .../auto_googler/SearchConfig.py | 0 .../auto_googler}/__init__.py | 0 .../ckan/CKANAPIInterface.py | 0 .../source_collectors}/ckan/CKANCollector.py | 8 +- .../source_collectors}/ckan/DTOs.py | 0 .../source_collectors}/ckan/README.md | 0 .../source_collectors/ckan}/__init__.py | 0 .../ckan/ckan_scraper_toolkit.py | 2 +- .../source_collectors}/ckan/constants.py | 0 .../ckan/scrape_ckan_data_portals.py | 4 +- .../source_collectors}/ckan/search_terms.py | 0 .../common_crawler/CommonCrawler.py | 3 +- .../common_crawler/CommonCrawlerCollector.py | 6 +- .../source_collectors}/common_crawler/DTOs.py | 0 .../common_crawler}/__init__.py | 0 .../common_crawler/crawler.py | 0 .../common_crawler/utils.py | 0 .../helpers/RequestManager.py | 0 .../source_collectors/helpers}/__init__.py | 0 .../source_collectors}/muckrock/.gitignore | 0 .../source_collectors}/muckrock/DTOs.py | 0 .../muckrock/MuckrockAPIInterface.py | 0 .../source_collectors}/muckrock/README.md | 0 .../source_collectors/muckrock}/__init__.py | 0 .../muckrock/allegheny-county-towns.txt | 0 .../muckrock/classes/FOIASearcher.py | 2 +- .../muckrock/classes/MuckrockCollector.py | 18 ++-- .../muckrock/classes}/__init__.py | 0 .../exceptions/RequestFailureException.py | 0 .../muckrock/classes/exceptions}/__init__.py | 0 .../fetch_requests/FOIALoopFetchRequest.py | 5 ++ .../fetch_requests/FetchRequestBase.py | 0 .../JurisdictionLoopFetchRequest.py | 2 +- .../classes/fetch_requests}/__init__.py | 0 .../muckrock_fetchers/AgencyFetcher.py | 6 +- .../muckrock_fetchers/FOIAFetchManager.py | 4 +- .../classes/muckrock_fetchers/FOIAFetcher.py | 6 +- .../muckrock_fetchers/FOIAGeneratorFetcher.py | 6 +- .../muckrock_fetchers/FOIALoopFetcher.py | 6 +- .../JurisdictionByIDFetcher.py | 6 +- .../JurisdictionFetchManager.py | 4 +- .../JurisdictionGeneratorFetcher.py | 6 +- .../JurisdictionLoopFetcher.py | 6 +- .../muckrock_fetchers/MuckrockFetcher.py | 3 +- .../MuckrockIterFetcherBase.py | 5 +- .../muckrock_fetchers/MuckrockLoopFetcher.py | 4 +- .../muckrock_fetchers/MuckrockNextFetcher.py | 4 +- .../classes/muckrock_fetchers/__init__.py | 0 .../source_collectors}/muckrock/constants.py | 0 .../generate_detailed_muckrock_csv.py | 4 +- .../source_collectors}/muckrock/schemas.py | 0 .../source_collectors}/muckrock/utils.py | 0 tests/alembic/conftest.py | 2 +- tests/automated/integration/api/conftest.py | 12 +-- .../api/helpers/RequestValidator.py | 60 ++++++------- .../integration/api/test_annotate.py | 26 +++--- tests/automated/integration/api/test_batch.py | 9 +- .../integration/api/test_duplicates.py | 5 +- .../integration/api/test_example_collector.py | 14 +-- .../integration/api/test_manual_batch.py | 6 +- .../automated/integration/api/test_metrics.py | 2 +- .../automated/integration/api/test_review.py | 10 +-- .../automated/integration/api/test_search.py | 2 +- tests/automated/integration/api/test_task.py | 2 +- tests/automated/integration/api/test_url.py | 4 +- .../collector_db/test_database_structure.py | 16 ++-- .../collector_db/test_db_client.py | 20 ++--- tests/automated/integration/conftest.py | 8 +- .../integration/core/test_async_core.py | 16 ++-- .../core/test_example_collector_lifecycle.py | 10 +-- .../html_tag_collector/test_root_url_cache.py | 2 +- .../security_manager/test_security_manager.py | 2 +- tests/automated/integration/tasks/conftest.py | 2 +- .../tasks/test_agency_preannotation_task.py | 28 +++--- .../integration/tasks/test_example_task.py | 6 +- .../tasks/test_submit_approved_url_task.py | 16 ++-- .../integration/tasks/test_url_404_probe.py | 8 +- .../tasks/test_url_duplicate_task.py | 10 +-- .../integration/tasks/test_url_html_task.py | 18 ++-- .../test_url_miscellaneous_metadata_task.py | 6 +- .../tasks/test_url_record_type_task.py | 12 +-- tests/automated/unit/core/test_core_logger.py | 4 +- .../unit/dto/test_all_annotation_post_info.py | 6 +- .../security_manager/test_security_manager.py | 2 +- .../test_autogoogler_collector.py | 10 +-- .../source_collectors/test_ckan_collector.py | 10 +-- .../test_common_crawl_collector.py | 10 +-- .../test_example_collector.py | 4 +- .../test_muckrock_collectors.py | 12 +-- tests/automated/unit/test_function_trigger.py | 2 +- tests/conftest.py | 10 +-- tests/helpers/DBDataCreator.py | 35 ++++---- tests/helpers/assert_functions.py | 4 +- tests/helpers/complex_test_data_functions.py | 6 +- .../helpers/test_batch_creation_parameters.py | 2 +- .../test_muckrock_api_interface.py | 2 +- .../lifecycle/test_auto_googler_lifecycle.py | 4 +- .../core/lifecycle/test_ckan_lifecycle.py | 6 +- .../test_common_crawler_lifecycle.py | 4 +- .../lifecycle/test_muckrock_lifecycles.py | 4 +- .../test_html_tag_collector_integration.py | 12 +-- .../test_deepseek_record_classifier.py | 6 +- .../test_openai_record_classifier.py | 6 +- tests/manual/pdap_client/test_pdap_client.py | 2 +- .../test_autogoogler_collector.py | 10 +-- .../source_collectors/test_ckan_collector.py | 12 +-- .../test_common_crawler_collector.py | 10 +-- .../test_muckrock_collectors.py | 12 +-- .../unsorted/test_root_url_cache_unit.py | 2 +- 278 files changed, 739 insertions(+), 778 deletions(-) delete mode 100644 source_collectors/muckrock/classes/fetch_requests/FOIALoopFetchRequest.py rename {core/DTOs => src}/__init__.py (100%) rename {core => src/core}/AsyncCore.py (80%) rename {core => src/core}/AsyncCoreLogger.py (95%) rename {core => src/core}/DTOs/AllAnnotationPostInfo.py (82%) rename {core => src/core}/DTOs/AnnotationRequestInfo.py (72%) rename {core => src/core}/DTOs/BatchStatusInfo.py (86%) rename {core => src/core}/DTOs/CollectionLifecycleInfo.py (65%) rename {core => src/core}/DTOs/CollectorStartInfo.py (100%) rename {core => src/core}/DTOs/CollectorStartParams.py (100%) rename {core => src/core}/DTOs/FinalReviewApprovalInfo.py (98%) rename {core => src/core}/DTOs/GetBatchLogsResponse.py (68%) rename {core => src/core}/DTOs/GetBatchStatusResponse.py (70%) rename {core => src/core}/DTOs/GetDuplicatesByBatchResponse.py (73%) rename {core => src/core}/DTOs/GetMetricsBacklogResponse.py (100%) rename {core => src/core}/DTOs/GetMetricsBatchesAggregatedResponseDTO.py (100%) rename {core => src/core}/DTOs/GetMetricsBatchesBreakdownResponseDTO.py (93%) rename {core => src/core}/DTOs/GetMetricsURLsAggregatedResponseDTO.py (100%) rename {core => src/core}/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py (100%) rename {core => src/core}/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py (100%) rename {core => src/core}/DTOs/GetNextRecordTypeAnnotationResponseInfo.py (79%) rename {core => src/core}/DTOs/GetNextRelevanceAnnotationResponseInfo.py (78%) rename {core => src/core}/DTOs/GetNextURLForAgencyAnnotationResponse.py (84%) rename {core => src/core}/DTOs/GetNextURLForAllAnnotationResponse.py (76%) rename {core => src/core}/DTOs/GetNextURLForFinalReviewResponse.py (93%) rename {core => src/core}/DTOs/GetTasksResponse.py (80%) rename {core => src/core}/DTOs/GetURLsByBatchResponse.py (71%) rename {core => src/core}/DTOs/GetURLsResponseInfo.py (90%) rename {core => src/core}/DTOs/ManualBatchInputDTO.py (93%) rename {core => src/core}/DTOs/ManualBatchResponseDTO.py (100%) rename {core => src/core}/DTOs/MessageCountResponse.py (69%) rename {core => src/core}/DTOs/MessageResponse.py (100%) rename {core => src/core}/DTOs/README.md (100%) rename {core => src/core}/DTOs/RecordTypeAnnotationPostInfo.py (73%) rename {core => src/core}/DTOs/RelevanceAnnotationPostInfo.py (73%) rename {core => src/core}/DTOs/ResponseURLInfo.py (100%) rename {core => src/core}/DTOs/SearchURLResponse.py (100%) rename {core => src/core}/DTOs/TaskOperatorRunInfo.py (100%) rename {core => src/core}/DTOs/URLAgencySuggestionInfo.py (89%) rename {core/DTOs/task_data_objects => src/core/DTOs}/__init__.py (100%) rename {core => src/core}/DTOs/task_data_objects/AgencyIdentificationTDO.py (100%) rename {core => src/core}/DTOs/task_data_objects/README.md (100%) rename {core => src/core}/DTOs/task_data_objects/SubmitApprovedURLTDO.py (94%) rename {core => src/core}/DTOs/task_data_objects/URL404ProbeTDO.py (100%) rename {core => src/core}/DTOs/task_data_objects/URLDuplicateTDO.py (100%) rename {core => src/core}/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py (100%) rename {core => src/core}/DTOs/task_data_objects/URLRecordTypeTDO.py (75%) rename {core => src/core}/DTOs/task_data_objects/UrlHtmlTDO.py (55%) rename {core => src/core/DTOs/task_data_objects}/__init__.py (100%) rename {core => src/core}/EnvVarManager.py (100%) rename {core => src/core}/FunctionTrigger.py (100%) rename {core => src/core}/README.md (100%) rename {core => src/core}/ScheduledTaskManager.py (97%) rename {core => src/core}/SourceCollectorCore.py (74%) rename {core => src/core}/TaskManager.py (80%) rename {core/classes => src/core}/__init__.py (100%) rename {core => src/core}/classes/ErrorManager.py (96%) rename {core => src/core}/classes/HTMLContentInfoGetter.py (85%) rename {core/classes/subtasks/MiscellaneousMetadata => src/core/classes}/__init__.py (100%) rename {core => src/core}/classes/subtasks/AgencyIdentificationSubtaskBase.py (81%) rename {core => src/core}/classes/subtasks/AutoGooglerAgencyIdentificationSubtask.py (73%) rename {core => src/core}/classes/subtasks/CKANAgencyIdentificationSubtask.py (72%) rename {core => src/core}/classes/subtasks/CommonCrawlerAgencyIdentificationSubtask.py (82%) rename {core => src/core}/classes/subtasks/MiscellaneousMetadata/AutoGooglerMiscMetadataSubtask.py (58%) rename {core => src/core}/classes/subtasks/MiscellaneousMetadata/CKANMiscMetadataSubtask.py (72%) rename {core => src/core}/classes/subtasks/MiscellaneousMetadata/MiscellaneousMetadataSubtaskBase.py (66%) rename {core => src/core}/classes/subtasks/MiscellaneousMetadata/MuckrockMiscMetadataSubtask.py (58%) rename {core/classes/subtasks => src/core/classes/subtasks/MiscellaneousMetadata}/__init__.py (100%) rename {core => src/core}/classes/subtasks/MuckrockAgencyIdentificationSubtask.py (74%) rename {core/classes/task_operators => src/core/classes/subtasks}/__init__.py (100%) rename {core => src/core}/classes/task_operators/AgencyIdentificationTaskOperator.py (80%) rename {core => src/core}/classes/task_operators/SubmitApprovedURLTaskOperator.py (85%) rename {core => src/core}/classes/task_operators/TaskOperatorBase.py (90%) rename {core => src/core}/classes/task_operators/URL404ProbeTaskOperator.py (85%) rename {core => src/core}/classes/task_operators/URLDuplicateTaskOperator.py (83%) rename {core => src/core}/classes/task_operators/URLHTMLTaskOperator.py (89%) rename {core => src/core}/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py (75%) rename {core => src/core}/classes/task_operators/URLRecordTypeTaskOperator.py (86%) rename {core/preprocessors => src/core/classes/task_operators}/__init__.py (100%) rename {core => src/core}/enums.py (100%) rename {core => src/core}/exceptions.py (100%) rename {core => src/core}/helpers.py (81%) rename {core => src/core}/preprocessors/AutoGooglerPreprocessor.py (87%) rename {core => src/core}/preprocessors/CKANPreprocessor.py (94%) rename {core => src/core}/preprocessors/CommonCrawlerPreprocessor.py (74%) rename {core => src/core}/preprocessors/ExamplePreprocessor.py (78%) rename {core => src/core}/preprocessors/MuckrockPreprocessor.py (77%) rename {core => src/core}/preprocessors/PreprocessorBase.py (92%) rename {core => src/core}/preprocessors/README.md (100%) rename {db/DTOs => src/core/preprocessors}/__init__.py (100%) rename {db => src/db}/AsyncDatabaseClient.py (96%) rename {db => src/db}/ConfigManager.py (100%) rename {db => src/db}/DTOConverter.py (91%) rename {db => src/db}/DTOs/BatchInfo.py (94%) rename {db => src/db}/DTOs/DuplicateInfo.py (100%) rename {db => src/db}/DTOs/GetTaskStatusResponseInfo.py (74%) rename {db => src/db}/DTOs/InsertURLsInfo.py (81%) rename {db => src/db}/DTOs/LogInfo.py (100%) rename {db => src/db}/DTOs/MetadataAnnotationInfo.py (100%) rename {db => src/db}/DTOs/README.md (100%) rename {db => src/db}/DTOs/TaskInfo.py (63%) rename {db => src/db}/DTOs/URLAnnotationInfo.py (73%) rename {db => src/db}/DTOs/URLErrorInfos.py (100%) rename {db => src/db}/DTOs/URLHTMLContentInfo.py (100%) rename {db => src/db}/DTOs/URLInfo.py (100%) rename {db => src/db}/DTOs/URLMapping.py (100%) rename {db => src/db}/DTOs/URLMetadataInfo.py (87%) rename {db => src/db}/DTOs/URLRelevancyInfo.py (100%) rename {db => src/db}/DTOs/URLWithHTML.py (68%) rename {db => src/db/DTOs}/__init__.py (100%) rename {db => src/db}/DatabaseClient.py (89%) rename {db => src/db}/README.md (100%) rename {db => src/db}/StatementComposer.py (86%) rename {html_tag_collector => src/db}/__init__.py (100%) rename {db => src/db}/constants.py (100%) rename {db => src/db}/enums.py (100%) rename {db => src/db}/helper_functions.py (64%) rename {db => src/db}/models.py (99%) rename {html_tag_collector => src/html_tag_collector}/DataClassTags.py (92%) rename {html_tag_collector => src/html_tag_collector}/README.md (100%) rename {html_tag_collector => src/html_tag_collector}/ResponseParser.py (90%) rename {html_tag_collector => src/html_tag_collector}/RootURLCache.py (95%) rename {html_tag_collector => src/html_tag_collector}/URLRequestInterface.py (100%) rename {llm_api_logic => src/html_tag_collector}/__init__.py (100%) rename {html_tag_collector => src/html_tag_collector}/constants.py (100%) rename {html_tag_collector => src/html_tag_collector}/url_adjustment_functions.py (100%) rename {html_tag_collector => src/html_tag_collector}/util.py (100%) rename {llm_api_logic => src/llm_api_logic}/DeepSeekRecordClassifier.py (75%) rename {llm_api_logic => src/llm_api_logic}/LLMRecordClassifierBase.py (86%) rename {llm_api_logic => src/llm_api_logic}/OpenAIRecordClassifier.py (77%) rename {llm_api_logic => src/llm_api_logic}/RecordTypeStructuredOutput.py (86%) rename {pdap_api_client => src/llm_api_logic}/__init__.py (100%) rename {llm_api_logic => src/llm_api_logic}/constants.py (100%) rename {llm_api_logic => src/llm_api_logic}/helpers.py (76%) rename {pdap_api_client => src/pdap_api_client}/DTOs.py (91%) rename {pdap_api_client => src/pdap_api_client}/PDAPClient.py (94%) rename {security_manager => src/pdap_api_client}/__init__.py (100%) rename {pdap_api_client => src/pdap_api_client}/enums.py (100%) rename {security_manager => src/security_manager}/SecurityManager.py (100%) rename {source_collectors => src/security_manager}/__init__.py (100%) rename {source_collectors => src/source_collectors}/README.md (100%) rename {source_collectors/auto_googler => src/source_collectors}/__init__.py (100%) rename {source_collectors => src/source_collectors}/auto_googler/AutoGoogler.py (79%) rename {source_collectors => src/source_collectors}/auto_googler/AutoGooglerCollector.py (75%) rename {source_collectors => src/source_collectors}/auto_googler/DTOs.py (100%) rename {source_collectors => src/source_collectors}/auto_googler/GoogleSearcher.py (95%) rename {source_collectors => src/source_collectors}/auto_googler/README.md (100%) rename {source_collectors => src/source_collectors}/auto_googler/SearchConfig.py (100%) rename {source_collectors/ckan => src/source_collectors/auto_googler}/__init__.py (100%) rename {source_collectors => src/source_collectors}/ckan/CKANAPIInterface.py (100%) rename {source_collectors => src/source_collectors}/ckan/CKANCollector.py (87%) rename {source_collectors => src/source_collectors}/ckan/DTOs.py (100%) rename {source_collectors => src/source_collectors}/ckan/README.md (100%) rename {source_collectors/common_crawler => src/source_collectors/ckan}/__init__.py (100%) rename {source_collectors => src/source_collectors}/ckan/ckan_scraper_toolkit.py (99%) rename {source_collectors => src/source_collectors}/ckan/constants.py (100%) rename {source_collectors => src/source_collectors}/ckan/scrape_ckan_data_portals.py (97%) rename {source_collectors => src/source_collectors}/ckan/search_terms.py (100%) rename {source_collectors => src/source_collectors}/common_crawler/CommonCrawler.py (98%) rename {source_collectors => src/source_collectors}/common_crawler/CommonCrawlerCollector.py (76%) rename {source_collectors => src/source_collectors}/common_crawler/DTOs.py (100%) rename {source_collectors/helpers => src/source_collectors/common_crawler}/__init__.py (100%) rename {source_collectors => src/source_collectors}/common_crawler/crawler.py (100%) rename {source_collectors => src/source_collectors}/common_crawler/utils.py (100%) rename {source_collectors => src/source_collectors}/helpers/RequestManager.py (100%) rename {source_collectors/muckrock => src/source_collectors/helpers}/__init__.py (100%) rename {source_collectors => src/source_collectors}/muckrock/.gitignore (100%) rename {source_collectors => src/source_collectors}/muckrock/DTOs.py (100%) rename {source_collectors => src/source_collectors}/muckrock/MuckrockAPIInterface.py (100%) rename {source_collectors => src/source_collectors}/muckrock/README.md (100%) rename {source_collectors/muckrock/classes => src/source_collectors/muckrock}/__init__.py (100%) rename {source_collectors => src/source_collectors}/muckrock/allegheny-county-towns.txt (100%) rename {source_collectors => src/source_collectors}/muckrock/classes/FOIASearcher.py (96%) rename {source_collectors => src/source_collectors}/muckrock/classes/MuckrockCollector.py (85%) rename {source_collectors/muckrock/classes/exceptions => src/source_collectors/muckrock/classes}/__init__.py (100%) rename {source_collectors => src/source_collectors}/muckrock/classes/exceptions/RequestFailureException.py (100%) rename {source_collectors/muckrock/classes/fetch_requests => src/source_collectors/muckrock/classes/exceptions}/__init__.py (100%) create mode 100644 src/source_collectors/muckrock/classes/fetch_requests/FOIALoopFetchRequest.py rename {source_collectors => src/source_collectors}/muckrock/classes/fetch_requests/FetchRequestBase.py (100%) rename {source_collectors => src/source_collectors}/muckrock/classes/fetch_requests/JurisdictionLoopFetchRequest.py (52%) rename {source_collectors/muckrock/classes/muckrock_fetchers => src/source_collectors/muckrock/classes/fetch_requests}/__init__.py (100%) rename {source_collectors => src/source_collectors}/muckrock/classes/muckrock_fetchers/AgencyFetcher.py (56%) rename {source_collectors => src/source_collectors}/muckrock/classes/muckrock_fetchers/FOIAFetchManager.py (74%) rename {source_collectors => src/source_collectors}/muckrock/classes/muckrock_fetchers/FOIAFetcher.py (81%) rename {source_collectors => src/source_collectors}/muckrock/classes/muckrock_fetchers/FOIAGeneratorFetcher.py (59%) rename {source_collectors => src/source_collectors}/muckrock/classes/muckrock_fetchers/FOIALoopFetcher.py (65%) rename {source_collectors => src/source_collectors}/muckrock/classes/muckrock_fetchers/JurisdictionByIDFetcher.py (62%) rename {source_collectors => src/source_collectors}/muckrock/classes/muckrock_fetchers/JurisdictionFetchManager.py (80%) rename {source_collectors => src/source_collectors}/muckrock/classes/muckrock_fetchers/JurisdictionGeneratorFetcher.py (57%) rename {source_collectors => src/source_collectors}/muckrock/classes/muckrock_fetchers/JurisdictionLoopFetcher.py (77%) rename {source_collectors => src/source_collectors}/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py (91%) rename {source_collectors => src/source_collectors}/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py (81%) rename {source_collectors => src/source_collectors}/muckrock/classes/muckrock_fetchers/MuckrockLoopFetcher.py (76%) rename {source_collectors => src/source_collectors}/muckrock/classes/muckrock_fetchers/MuckrockNextFetcher.py (77%) create mode 100644 src/source_collectors/muckrock/classes/muckrock_fetchers/__init__.py rename {source_collectors => src/source_collectors}/muckrock/constants.py (100%) rename {source_collectors => src/source_collectors}/muckrock/generate_detailed_muckrock_csv.py (96%) rename {source_collectors => src/source_collectors}/muckrock/schemas.py (100%) rename {source_collectors => src/source_collectors}/muckrock/utils.py (100%) diff --git a/Dockerfile b/Dockerfile index 5ba90408..6eee3a51 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,21 +18,21 @@ RUN playwright install chromium # Copy project files COPY api ./api -COPY db ./collector_db +COPY src/db ./collector_db COPY collector_manager ./collector_manager -COPY core ./core -COPY html_tag_collector ./html_tag_collector -COPY source_collectors ./source_collectors +COPY src/core ./core +COPY src/html_tag_collector ./html_tag_collector +COPY src/source_collectors ./source_collectors COPY util ./util COPY alembic.ini ./alembic.ini COPY alembic ./alembic COPY apply_migrations.py ./apply_migrations.py -COPY security_manager ./security_manager -COPY pdap_api_client ./pdap_api_client +COPY src/security_manager ./security_manager +COPY src/pdap_api_client ./pdap_api_client COPY execute.sh ./execute.sh COPY .project-root ./.project-root -COPY llm_api_logic ./llm_api_logic +COPY src/llm_api_logic ./llm_api_logic # Expose the application port EXPOSE 80 diff --git a/alembic/env.py b/alembic/env.py index 3ba2f117..a70a4d5d 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -5,8 +5,8 @@ from sqlalchemy import engine_from_config from sqlalchemy import pool -from db.helper_functions import get_postgres_connection_string -from db.models import Base +from src.db.helper_functions import get_postgres_connection_string +from src.db.models import Base # this is the Alembic Config object, which provides # access to the values within the .ini file in use. diff --git a/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py b/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py index 8661f524..a67d128f 100644 --- a/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py +++ b/alembic/versions/072b32a45b1c_add_task_tables_and_linking_logic.py @@ -10,7 +10,7 @@ from alembic import op import sqlalchemy as sa -from db.enums import PGEnum +from src.db.enums import PGEnum # revision identifiers, used by Alembic. revision: str = '072b32a45b1c' diff --git a/alembic/versions/19bf57df581a_add_url_agency_suggestions.py b/alembic/versions/19bf57df581a_add_url_agency_suggestions.py index f735e271..c113b8fc 100644 --- a/alembic/versions/19bf57df581a_add_url_agency_suggestions.py +++ b/alembic/versions/19bf57df581a_add_url_agency_suggestions.py @@ -9,7 +9,7 @@ from alembic import op import sqlalchemy as sa -from db.enums import PGEnum +from src.db.enums import PGEnum # revision identifiers, used by Alembic. revision: str = '19bf57df581a' down_revision: Union[str, None] = '072b32a45b1c' diff --git a/alembic/versions/9afd8a5633c9_create_htmlcontent_and_rooturl_tables.py b/alembic/versions/9afd8a5633c9_create_htmlcontent_and_rooturl_tables.py index bc26bf30..ed4bea29 100644 --- a/alembic/versions/9afd8a5633c9_create_htmlcontent_and_rooturl_tables.py +++ b/alembic/versions/9afd8a5633c9_create_htmlcontent_and_rooturl_tables.py @@ -10,7 +10,7 @@ import sqlalchemy as sa from alembic import op -from db.enums import PGEnum +from src.db.enums import PGEnum # revision identifiers, used by Alembic. revision: str = '9afd8a5633c9' diff --git a/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py b/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py index 16611eee..cd68a4b5 100644 --- a/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py +++ b/alembic/versions/d7eb670edaf0_revise_agency_identification_logic.py @@ -10,7 +10,7 @@ from alembic import op import sqlalchemy as sa -from db.enums import PGEnum +from src.db.enums import PGEnum # revision identifiers, used by Alembic. revision: str = 'd7eb670edaf0' diff --git a/api/dependencies.py b/api/dependencies.py index 0d14a00c..6584bf13 100644 --- a/api/dependencies.py +++ b/api/dependencies.py @@ -1,5 +1,5 @@ -from core.AsyncCore import AsyncCore -from core.SourceCollectorCore import SourceCollectorCore +from src.core.AsyncCore import AsyncCore +from src.core.SourceCollectorCore import SourceCollectorCore def get_core() -> SourceCollectorCore: diff --git a/api/main.py b/api/main.py index fd82df85..a5b956ee 100644 --- a/api/main.py +++ b/api/main.py @@ -14,20 +14,20 @@ from api.routes.search import search_router from api.routes.task import task_router from api.routes.url import url_router -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DatabaseClient import DatabaseClient +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.DatabaseClient import DatabaseClient from collector_manager.AsyncCollectorManager import AsyncCollectorManager -from core.AsyncCore import AsyncCore -from core.AsyncCoreLogger import AsyncCoreLogger -from core.EnvVarManager import EnvVarManager -from core.ScheduledTaskManager import AsyncScheduledTaskManager -from core.SourceCollectorCore import SourceCollectorCore -from core.TaskManager import TaskManager -from html_tag_collector.ResponseParser import HTMLResponseParser -from html_tag_collector.RootURLCache import RootURLCache -from html_tag_collector.URLRequestInterface import URLRequestInterface +from src.core.AsyncCore import AsyncCore +from src.core.AsyncCoreLogger import AsyncCoreLogger +from src.core.EnvVarManager import EnvVarManager +from src.core.ScheduledTaskManager import AsyncScheduledTaskManager +from src.core.SourceCollectorCore import SourceCollectorCore +from src.core.TaskManager import TaskManager +from src.html_tag_collector.ResponseParser import HTMLResponseParser +from src.html_tag_collector.RootURLCache import RootURLCache +from src.html_tag_collector.URLRequestInterface import URLRequestInterface from pdap_access_manager import AccessManager -from pdap_api_client.PDAPClient import PDAPClient +from src.pdap_api_client.PDAPClient import PDAPClient from discord_poster import DiscordPoster diff --git a/api/routes/annotate.py b/api/routes/annotate.py index 7cb5fa65..a88204f3 100644 --- a/api/routes/annotate.py +++ b/api/routes/annotate.py @@ -3,16 +3,16 @@ from fastapi import APIRouter, Depends, Path, Query from api.dependencies import get_async_core -from core.AsyncCore import AsyncCore -from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo -from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo -from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo -from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ +from src.core.AsyncCore import AsyncCore +from src.core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo +from src.core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo +from src.core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo +from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo -from core.DTOs.GetNextURLForAllAnnotationResponse import GetNextURLForAllAnnotationResponse -from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo -from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo -from security_manager.SecurityManager import get_access_info, AccessInfo +from src.core.DTOs.GetNextURLForAllAnnotationResponse import GetNextURLForAllAnnotationResponse +from src.core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo +from src.core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo +from src.security_manager.SecurityManager import get_access_info, AccessInfo annotate_router = APIRouter( prefix="/annotate", diff --git a/api/routes/batch.py b/api/routes/batch.py index 4ca38c55..9e4cd861 100644 --- a/api/routes/batch.py +++ b/api/routes/batch.py @@ -3,18 +3,17 @@ from fastapi import Path, APIRouter from fastapi.params import Query, Depends -from api.dependencies import get_core, get_async_core -from db.DTOs.BatchInfo import BatchInfo +from api.dependencies import get_async_core +from src.db.DTOs.BatchInfo import BatchInfo from collector_manager.enums import CollectorType -from core.AsyncCore import AsyncCore -from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse -from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse -from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse -from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse -from core.DTOs.MessageResponse import MessageResponse -from core.SourceCollectorCore import SourceCollectorCore -from core.enums import BatchStatus -from security_manager.SecurityManager import AccessInfo, get_access_info +from src.core.AsyncCore import AsyncCore +from src.core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse +from src.core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse +from src.core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse +from src.core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse +from src.core.DTOs.MessageResponse import MessageResponse +from src.core.enums import BatchStatus +from src.security_manager.SecurityManager import AccessInfo, get_access_info batch_router = APIRouter( prefix="/batch", diff --git a/api/routes/collector.py b/api/routes/collector.py index 16f5a900..1eba70d8 100644 --- a/api/routes/collector.py +++ b/api/routes/collector.py @@ -4,15 +4,15 @@ from api.dependencies import get_async_core from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.enums import CollectorType -from core.AsyncCore import AsyncCore -from core.DTOs.CollectorStartInfo import CollectorStartInfo -from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO -from core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO -from security_manager.SecurityManager import AccessInfo, get_access_info -from source_collectors.auto_googler.DTOs import AutoGooglerInputDTO -from source_collectors.ckan.DTOs import CKANInputDTO -from source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO -from source_collectors.muckrock.DTOs import MuckrockCountySearchCollectorInputDTO, \ +from src.core.AsyncCore import AsyncCore +from src.core.DTOs.CollectorStartInfo import CollectorStartInfo +from src.core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO +from src.core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO +from src.security_manager.SecurityManager import AccessInfo, get_access_info +from src.source_collectors.auto_googler.DTOs import AutoGooglerInputDTO +from src.source_collectors.ckan.DTOs import CKANInputDTO +from src.source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO +from src.source_collectors.muckrock.DTOs import MuckrockCountySearchCollectorInputDTO, \ MuckrockAllFOIARequestsCollectorInputDTO, MuckrockSimpleSearchCollectorInputDTO collector_router = APIRouter( diff --git a/api/routes/metrics.py b/api/routes/metrics.py index d81aa2e6..49da88d1 100644 --- a/api/routes/metrics.py +++ b/api/routes/metrics.py @@ -2,14 +2,14 @@ from fastapi.params import Query, Depends from api.dependencies import get_async_core -from core.AsyncCore import AsyncCore -from core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO -from core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO -from core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO -from core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO -from core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO -from core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO -from security_manager.SecurityManager import AccessInfo, get_access_info +from src.core.AsyncCore import AsyncCore +from src.core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO +from src.core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO +from src.core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO +from src.core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO +from src.core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO +from src.core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO +from src.security_manager.SecurityManager import AccessInfo, get_access_info metrics_router = APIRouter( prefix="/metrics", diff --git a/api/routes/review.py b/api/routes/review.py index ac937701..518786d1 100644 --- a/api/routes/review.py +++ b/api/routes/review.py @@ -3,11 +3,10 @@ from fastapi import APIRouter, Depends, Query from api.dependencies import get_async_core -from core.AsyncCore import AsyncCore -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewBaseInfo, FinalReviewRejectionInfo -from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, \ - GetNextURLForFinalReviewOuterResponse -from security_manager.SecurityManager import AccessInfo, get_access_info, require_permission, Permissions +from src.core.AsyncCore import AsyncCore +from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewRejectionInfo +from src.core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse +from src.security_manager.SecurityManager import AccessInfo, require_permission, Permissions review_router = APIRouter( prefix="/review", diff --git a/api/routes/root.py b/api/routes/root.py index 065e95fd..4298716e 100644 --- a/api/routes/root.py +++ b/api/routes/root.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, Query, Depends -from security_manager.SecurityManager import AccessInfo, get_access_info +from src.security_manager.SecurityManager import AccessInfo, get_access_info root_router = APIRouter(prefix="", tags=["root"]) diff --git a/api/routes/search.py b/api/routes/search.py index 4513bb2f..b6432ba3 100644 --- a/api/routes/search.py +++ b/api/routes/search.py @@ -1,9 +1,9 @@ from fastapi import APIRouter, Query, Depends from api.dependencies import get_async_core -from core.AsyncCore import AsyncCore -from core.DTOs.SearchURLResponse import SearchURLResponse -from security_manager.SecurityManager import get_access_info, AccessInfo +from src.core.AsyncCore import AsyncCore +from src.core.DTOs.SearchURLResponse import SearchURLResponse +from src.security_manager.SecurityManager import get_access_info, AccessInfo search_router = APIRouter(prefix="/search", tags=["search"]) diff --git a/api/routes/task.py b/api/routes/task.py index a99598f7..3b4d13b3 100644 --- a/api/routes/task.py +++ b/api/routes/task.py @@ -3,12 +3,12 @@ from fastapi import APIRouter, Depends, Query, Path from api.dependencies import get_async_core -from db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo -from db.DTOs.TaskInfo import TaskInfo -from db.enums import TaskType -from core.AsyncCore import AsyncCore -from core.enums import BatchStatus -from security_manager.SecurityManager import AccessInfo, get_access_info +from src.db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo +from src.db.DTOs.TaskInfo import TaskInfo +from src.db.enums import TaskType +from src.core.AsyncCore import AsyncCore +from src.core.enums import BatchStatus +from src.security_manager.SecurityManager import AccessInfo, get_access_info task_router = APIRouter( prefix="/task", diff --git a/api/routes/url.py b/api/routes/url.py index 9c3a1261..2228da1e 100644 --- a/api/routes/url.py +++ b/api/routes/url.py @@ -1,9 +1,9 @@ from fastapi import APIRouter, Query, Depends from api.dependencies import get_async_core -from core.AsyncCore import AsyncCore -from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo -from security_manager.SecurityManager import AccessInfo, get_access_info +from src.core.AsyncCore import AsyncCore +from src.core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo +from src.security_manager.SecurityManager import AccessInfo, get_access_info url_router = APIRouter( prefix="/url", diff --git a/apply_migrations.py b/apply_migrations.py index 2dc207ce..ed3b2f44 100644 --- a/apply_migrations.py +++ b/apply_migrations.py @@ -1,7 +1,7 @@ from alembic import command from alembic.config import Config -from db.helper_functions import get_postgres_connection_string +from src.db.helper_functions import get_postgres_connection_string def apply_migrations(): print("Applying migrations...") diff --git a/collector_manager/AsyncCollectorBase.py b/collector_manager/AsyncCollectorBase.py index 94361ed4..d089ae59 100644 --- a/collector_manager/AsyncCollectorBase.py +++ b/collector_manager/AsyncCollectorBase.py @@ -6,14 +6,14 @@ from pydantic import BaseModel -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DTOs.InsertURLsInfo import InsertURLsInfo -from db.DTOs.LogInfo import LogInfo +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.DTOs.InsertURLsInfo import InsertURLsInfo +from src.db.DTOs.LogInfo import LogInfo from collector_manager.enums import CollectorType -from core.AsyncCoreLogger import AsyncCoreLogger -from core.FunctionTrigger import FunctionTrigger -from core.enums import BatchStatus -from core.preprocessors.PreprocessorBase import PreprocessorBase +from src.core.AsyncCoreLogger import AsyncCoreLogger +from src.core.FunctionTrigger import FunctionTrigger +from src.core.enums import BatchStatus +from src.core.preprocessors.PreprocessorBase import PreprocessorBase class AsyncCollectorBase(ABC): diff --git a/collector_manager/AsyncCollectorManager.py b/collector_manager/AsyncCollectorManager.py index bfb7beef..62a30661 100644 --- a/collector_manager/AsyncCollectorManager.py +++ b/collector_manager/AsyncCollectorManager.py @@ -5,13 +5,13 @@ from fastapi import HTTPException from pydantic import BaseModel -from db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.AsyncDatabaseClient import AsyncDatabaseClient from collector_manager.AsyncCollectorBase import AsyncCollectorBase from collector_manager.CollectorManager import InvalidCollectorError from collector_manager.collector_mapping import COLLECTOR_MAPPING from collector_manager.enums import CollectorType -from core.AsyncCoreLogger import AsyncCoreLogger -from core.FunctionTrigger import FunctionTrigger +from src.core.AsyncCoreLogger import AsyncCoreLogger +from src.core.FunctionTrigger import FunctionTrigger class AsyncCollectorManager: diff --git a/collector_manager/ExampleCollector.py b/collector_manager/ExampleCollector.py index 7bc8a583..eb9370a4 100644 --- a/collector_manager/ExampleCollector.py +++ b/collector_manager/ExampleCollector.py @@ -9,7 +9,7 @@ from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.DTOs.ExampleOutputDTO import ExampleOutputDTO from collector_manager.enums import CollectorType -from core.preprocessors.ExamplePreprocessor import ExamplePreprocessor +from src.core.preprocessors.ExamplePreprocessor import ExamplePreprocessor class ExampleCollector(AsyncCollectorBase): diff --git a/collector_manager/collector_mapping.py b/collector_manager/collector_mapping.py index 9ec49f4e..1b94d91a 100644 --- a/collector_manager/collector_mapping.py +++ b/collector_manager/collector_mapping.py @@ -1,9 +1,9 @@ from collector_manager.ExampleCollector import ExampleCollector from collector_manager.enums import CollectorType -from source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector -from source_collectors.ckan.CKANCollector import CKANCollector -from source_collectors.common_crawler.CommonCrawlerCollector import CommonCrawlerCollector -from source_collectors.muckrock.classes.MuckrockCollector import MuckrockSimpleSearchCollector, \ +from src.source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector +from src.source_collectors.ckan import CKANCollector +from src.source_collectors.common_crawler import CommonCrawlerCollector +from src.source_collectors.muckrock.classes import MuckrockSimpleSearchCollector, \ MuckrockCountyLevelSearchCollector, MuckrockAllFOIARequestsCollector COLLECTOR_MAPPING = { diff --git a/source_collectors/muckrock/classes/fetch_requests/FOIALoopFetchRequest.py b/source_collectors/muckrock/classes/fetch_requests/FOIALoopFetchRequest.py deleted file mode 100644 index d498fdc2..00000000 --- a/source_collectors/muckrock/classes/fetch_requests/FOIALoopFetchRequest.py +++ /dev/null @@ -1,5 +0,0 @@ -from source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest - - -class FOIALoopFetchRequest(FetchRequest): - jurisdiction: int diff --git a/core/DTOs/__init__.py b/src/__init__.py similarity index 100% rename from core/DTOs/__init__.py rename to src/__init__.py diff --git a/core/AsyncCore.py b/src/core/AsyncCore.py similarity index 80% rename from core/AsyncCore.py rename to src/core/AsyncCore.py index 1d61557e..c5af2977 100644 --- a/core/AsyncCore.py +++ b/src/core/AsyncCore.py @@ -3,41 +3,41 @@ from pydantic import BaseModel from sqlalchemy.exc import IntegrityError -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DTOs.BatchInfo import BatchInfo -from db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo -from db.enums import TaskType +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.DTOs.BatchInfo import BatchInfo +from src.db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo +from src.db.enums import TaskType from collector_manager.AsyncCollectorManager import AsyncCollectorManager from collector_manager.enums import CollectorType -from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo -from core.DTOs.CollectorStartInfo import CollectorStartInfo -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason -from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse -from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse -from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse -from core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO -from core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO -from core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO -from core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO -from core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO -from core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO -from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo -from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo -from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ +from src.core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo +from src.core.DTOs.CollectorStartInfo import CollectorStartInfo +from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason +from src.core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse +from src.core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse +from src.core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse +from src.core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO +from src.core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO +from src.core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO +from src.core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO +from src.core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO +from src.core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO +from src.core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo +from src.core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo +from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo -from core.DTOs.GetNextURLForAllAnnotationResponse import GetNextURLForAllAnnotationResponse -from core.DTOs.GetTasksResponse import GetTasksResponse -from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse -from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo -from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO -from core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO -from core.DTOs.MessageResponse import MessageResponse -from core.DTOs.SearchURLResponse import SearchURLResponse -from core.TaskManager import TaskManager -from core.classes.ErrorManager import ErrorManager -from core.enums import BatchStatus, RecordType, AnnotationType, SuggestedStatus - -from security_manager.SecurityManager import AccessInfo +from src.core.DTOs.GetNextURLForAllAnnotationResponse import GetNextURLForAllAnnotationResponse +from src.core.DTOs.GetTasksResponse import GetTasksResponse +from src.core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse +from src.core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo +from src.core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO +from src.core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO +from src.core.DTOs.MessageResponse import MessageResponse +from src.core.DTOs.SearchURLResponse import SearchURLResponse +from src.core.TaskManager import TaskManager +from src.core.classes.ErrorManager import ErrorManager +from src.core.enums import BatchStatus, RecordType, AnnotationType, SuggestedStatus + +from src.security_manager.SecurityManager import AccessInfo class AsyncCore: diff --git a/core/AsyncCoreLogger.py b/src/core/AsyncCoreLogger.py similarity index 95% rename from core/AsyncCoreLogger.py rename to src/core/AsyncCoreLogger.py index 67bb5dc9..e3cdc4b2 100644 --- a/core/AsyncCoreLogger.py +++ b/src/core/AsyncCoreLogger.py @@ -1,7 +1,7 @@ import asyncio -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DTOs.LogInfo import LogInfo +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.DTOs.LogInfo import LogInfo class AsyncCoreLogger: diff --git a/core/DTOs/AllAnnotationPostInfo.py b/src/core/DTOs/AllAnnotationPostInfo.py similarity index 82% rename from core/DTOs/AllAnnotationPostInfo.py rename to src/core/DTOs/AllAnnotationPostInfo.py index 2a81be78..6287f074 100644 --- a/core/DTOs/AllAnnotationPostInfo.py +++ b/src/core/DTOs/AllAnnotationPostInfo.py @@ -1,12 +1,10 @@ -from http import HTTPStatus from typing import Optional -from fastapi import HTTPException from pydantic import BaseModel, model_validator -from core.DTOs.GetNextURLForAgencyAnnotationResponse import URLAgencyAnnotationPostInfo -from core.enums import RecordType, SuggestedStatus -from core.exceptions import FailedValidationException +from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import URLAgencyAnnotationPostInfo +from src.core.enums import RecordType, SuggestedStatus +from src.core.exceptions import FailedValidationException class AllAnnotationPostInfo(BaseModel): diff --git a/core/DTOs/AnnotationRequestInfo.py b/src/core/DTOs/AnnotationRequestInfo.py similarity index 72% rename from core/DTOs/AnnotationRequestInfo.py rename to src/core/DTOs/AnnotationRequestInfo.py index 1e886ae8..0b63ed71 100644 --- a/core/DTOs/AnnotationRequestInfo.py +++ b/src/core/DTOs/AnnotationRequestInfo.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from html_tag_collector.DataClassTags import ResponseHTMLInfo +from src.html_tag_collector import ResponseHTMLInfo class AnnotationRequestInfo(BaseModel): diff --git a/core/DTOs/BatchStatusInfo.py b/src/core/DTOs/BatchStatusInfo.py similarity index 86% rename from core/DTOs/BatchStatusInfo.py rename to src/core/DTOs/BatchStatusInfo.py index f0362a71..fbe2dc50 100644 --- a/core/DTOs/BatchStatusInfo.py +++ b/src/core/DTOs/BatchStatusInfo.py @@ -3,7 +3,7 @@ from pydantic import BaseModel from collector_manager.enums import CollectorType -from core.enums import BatchStatus +from src.core.enums import BatchStatus class BatchStatusInfo(BaseModel): diff --git a/core/DTOs/CollectionLifecycleInfo.py b/src/core/DTOs/CollectionLifecycleInfo.py similarity index 65% rename from core/DTOs/CollectionLifecycleInfo.py rename to src/core/DTOs/CollectionLifecycleInfo.py index 925dee93..b1d2673f 100644 --- a/core/DTOs/CollectionLifecycleInfo.py +++ b/src/core/DTOs/CollectionLifecycleInfo.py @@ -1,7 +1,7 @@ from pydantic import BaseModel -from db.DTOs.DuplicateInfo import DuplicateInfo -from db.DTOs.URLMapping import URLMapping +from src.db.DTOs.DuplicateInfo import DuplicateInfo +from src.db.DTOs.URLMapping import URLMapping class CollectionLifecycleInfo(BaseModel): diff --git a/core/DTOs/CollectorStartInfo.py b/src/core/DTOs/CollectorStartInfo.py similarity index 100% rename from core/DTOs/CollectorStartInfo.py rename to src/core/DTOs/CollectorStartInfo.py diff --git a/core/DTOs/CollectorStartParams.py b/src/core/DTOs/CollectorStartParams.py similarity index 100% rename from core/DTOs/CollectorStartParams.py rename to src/core/DTOs/CollectorStartParams.py diff --git a/core/DTOs/FinalReviewApprovalInfo.py b/src/core/DTOs/FinalReviewApprovalInfo.py similarity index 98% rename from core/DTOs/FinalReviewApprovalInfo.py rename to src/core/DTOs/FinalReviewApprovalInfo.py index 5e4a19d6..f65c7e91 100644 --- a/core/DTOs/FinalReviewApprovalInfo.py +++ b/src/core/DTOs/FinalReviewApprovalInfo.py @@ -3,7 +3,7 @@ from pydantic import BaseModel, Field -from core.enums import RecordType +from src.core.enums import RecordType class FinalReviewBaseInfo(BaseModel): url_id: int = Field( diff --git a/core/DTOs/GetBatchLogsResponse.py b/src/core/DTOs/GetBatchLogsResponse.py similarity index 68% rename from core/DTOs/GetBatchLogsResponse.py rename to src/core/DTOs/GetBatchLogsResponse.py index adcc3be9..05db2370 100644 --- a/core/DTOs/GetBatchLogsResponse.py +++ b/src/core/DTOs/GetBatchLogsResponse.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from db.DTOs.LogInfo import LogOutputInfo +from src.db.DTOs.LogInfo import LogOutputInfo class GetBatchLogsResponse(BaseModel): diff --git a/core/DTOs/GetBatchStatusResponse.py b/src/core/DTOs/GetBatchStatusResponse.py similarity index 70% rename from core/DTOs/GetBatchStatusResponse.py rename to src/core/DTOs/GetBatchStatusResponse.py index d1a02dc7..8ee0da43 100644 --- a/core/DTOs/GetBatchStatusResponse.py +++ b/src/core/DTOs/GetBatchStatusResponse.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from db.DTOs.BatchInfo import BatchInfo +from src.db.DTOs.BatchInfo import BatchInfo class GetBatchStatusResponse(BaseModel): diff --git a/core/DTOs/GetDuplicatesByBatchResponse.py b/src/core/DTOs/GetDuplicatesByBatchResponse.py similarity index 73% rename from core/DTOs/GetDuplicatesByBatchResponse.py rename to src/core/DTOs/GetDuplicatesByBatchResponse.py index 68a6dd4b..e9c3a864 100644 --- a/core/DTOs/GetDuplicatesByBatchResponse.py +++ b/src/core/DTOs/GetDuplicatesByBatchResponse.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from db.DTOs.DuplicateInfo import DuplicateInfo +from src.db.DTOs.DuplicateInfo import DuplicateInfo class GetDuplicatesByBatchResponse(BaseModel): diff --git a/core/DTOs/GetMetricsBacklogResponse.py b/src/core/DTOs/GetMetricsBacklogResponse.py similarity index 100% rename from core/DTOs/GetMetricsBacklogResponse.py rename to src/core/DTOs/GetMetricsBacklogResponse.py diff --git a/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py b/src/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py similarity index 100% rename from core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py rename to src/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py diff --git a/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py b/src/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py similarity index 93% rename from core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py rename to src/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py index 6572f49f..a6a28aa2 100644 --- a/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py +++ b/src/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py @@ -3,7 +3,7 @@ from pydantic import BaseModel from collector_manager.enums import CollectorType -from core.enums import BatchStatus +from src.core.enums import BatchStatus class GetMetricsBatchesBreakdownInnerResponseDTO(BaseModel): diff --git a/core/DTOs/GetMetricsURLsAggregatedResponseDTO.py b/src/core/DTOs/GetMetricsURLsAggregatedResponseDTO.py similarity index 100% rename from core/DTOs/GetMetricsURLsAggregatedResponseDTO.py rename to src/core/DTOs/GetMetricsURLsAggregatedResponseDTO.py diff --git a/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py b/src/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py similarity index 100% rename from core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py rename to src/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py diff --git a/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py b/src/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py similarity index 100% rename from core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py rename to src/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py diff --git a/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py b/src/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py similarity index 79% rename from core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py rename to src/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py index e1784409..af8fbae7 100644 --- a/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py +++ b/src/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py @@ -2,9 +2,9 @@ from pydantic import Field, BaseModel -from db.DTOs.URLMapping import URLMapping -from core.enums import RecordType -from html_tag_collector.DataClassTags import ResponseHTMLInfo +from src.db.DTOs.URLMapping import URLMapping +from src.core.enums import RecordType +from src.html_tag_collector.DataClassTags import ResponseHTMLInfo class GetNextRecordTypeAnnotationResponseInfo(BaseModel): diff --git a/core/DTOs/GetNextRelevanceAnnotationResponseInfo.py b/src/core/DTOs/GetNextRelevanceAnnotationResponseInfo.py similarity index 78% rename from core/DTOs/GetNextRelevanceAnnotationResponseInfo.py rename to src/core/DTOs/GetNextRelevanceAnnotationResponseInfo.py index af586395..5a76c692 100644 --- a/core/DTOs/GetNextRelevanceAnnotationResponseInfo.py +++ b/src/core/DTOs/GetNextRelevanceAnnotationResponseInfo.py @@ -2,9 +2,8 @@ from pydantic import BaseModel, Field -from db.DTOs.URLMapping import URLMapping -from core.DTOs.ResponseURLInfo import ResponseURLInfo -from html_tag_collector.DataClassTags import ResponseHTMLInfo +from src.db.DTOs.URLMapping import URLMapping +from src.html_tag_collector.DataClassTags import ResponseHTMLInfo class GetNextRelevanceAnnotationResponseInfo(BaseModel): diff --git a/core/DTOs/GetNextURLForAgencyAnnotationResponse.py b/src/core/DTOs/GetNextURLForAgencyAnnotationResponse.py similarity index 84% rename from core/DTOs/GetNextURLForAgencyAnnotationResponse.py rename to src/core/DTOs/GetNextURLForAgencyAnnotationResponse.py index 8b3d06f4..40bac8c4 100644 --- a/core/DTOs/GetNextURLForAgencyAnnotationResponse.py +++ b/src/core/DTOs/GetNextURLForAgencyAnnotationResponse.py @@ -1,9 +1,9 @@ -from typing import Optional, Literal +from typing import Optional from pydantic import BaseModel -from core.enums import SuggestionType -from html_tag_collector.DataClassTags import ResponseHTMLInfo +from src.core.enums import SuggestionType +from src.html_tag_collector.DataClassTags import ResponseHTMLInfo class GetNextURLForAgencyAgencyInfo(BaseModel): suggestion_type: SuggestionType diff --git a/core/DTOs/GetNextURLForAllAnnotationResponse.py b/src/core/DTOs/GetNextURLForAllAnnotationResponse.py similarity index 76% rename from core/DTOs/GetNextURLForAllAnnotationResponse.py rename to src/core/DTOs/GetNextURLForAllAnnotationResponse.py index f4fa4bb8..495342ec 100644 --- a/core/DTOs/GetNextURLForAllAnnotationResponse.py +++ b/src/core/DTOs/GetNextURLForAllAnnotationResponse.py @@ -2,9 +2,9 @@ from pydantic import Field, BaseModel -from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo -from core.enums import RecordType -from html_tag_collector.DataClassTags import ResponseHTMLInfo +from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo +from src.core.enums import RecordType +from src.html_tag_collector.DataClassTags import ResponseHTMLInfo class GetNextURLForAllAnnotationInnerResponse(BaseModel): diff --git a/core/DTOs/GetNextURLForFinalReviewResponse.py b/src/core/DTOs/GetNextURLForFinalReviewResponse.py similarity index 93% rename from core/DTOs/GetNextURLForFinalReviewResponse.py rename to src/core/DTOs/GetNextURLForFinalReviewResponse.py index f7e84d1f..81addf54 100644 --- a/core/DTOs/GetNextURLForFinalReviewResponse.py +++ b/src/core/DTOs/GetNextURLForFinalReviewResponse.py @@ -2,9 +2,9 @@ from pydantic import BaseModel, Field -from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo -from core.enums import RecordType, SuggestedStatus -from html_tag_collector.DataClassTags import ResponseHTMLInfo +from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo +from src.core.enums import RecordType, SuggestedStatus +from src.html_tag_collector.DataClassTags import ResponseHTMLInfo class FinalReviewAnnotationRelevantInfo(BaseModel): auto: Optional[bool] = Field(title="Whether the auto-labeler has marked the URL as relevant") diff --git a/core/DTOs/GetTasksResponse.py b/src/core/DTOs/GetTasksResponse.py similarity index 80% rename from core/DTOs/GetTasksResponse.py rename to src/core/DTOs/GetTasksResponse.py index 670ce8d3..da3c0334 100644 --- a/core/DTOs/GetTasksResponse.py +++ b/src/core/DTOs/GetTasksResponse.py @@ -2,8 +2,8 @@ from pydantic import BaseModel -from db.enums import TaskType -from core.enums import BatchStatus +from src.db.enums import TaskType +from src.core.enums import BatchStatus class GetTasksResponseTaskInfo(BaseModel): diff --git a/core/DTOs/GetURLsByBatchResponse.py b/src/core/DTOs/GetURLsByBatchResponse.py similarity index 71% rename from core/DTOs/GetURLsByBatchResponse.py rename to src/core/DTOs/GetURLsByBatchResponse.py index c737d720..ddffa1e9 100644 --- a/core/DTOs/GetURLsByBatchResponse.py +++ b/src/core/DTOs/GetURLsByBatchResponse.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from db.DTOs.URLInfo import URLInfo +from src.db.DTOs.URLInfo import URLInfo class GetURLsByBatchResponse(BaseModel): diff --git a/core/DTOs/GetURLsResponseInfo.py b/src/core/DTOs/GetURLsResponseInfo.py similarity index 90% rename from core/DTOs/GetURLsResponseInfo.py rename to src/core/DTOs/GetURLsResponseInfo.py index a924d5aa..3603ad94 100644 --- a/core/DTOs/GetURLsResponseInfo.py +++ b/src/core/DTOs/GetURLsResponseInfo.py @@ -3,7 +3,7 @@ from pydantic import BaseModel -from db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource +from src.db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource from collector_manager.enums import URLStatus class GetURLsResponseErrorInfo(BaseModel): diff --git a/core/DTOs/ManualBatchInputDTO.py b/src/core/DTOs/ManualBatchInputDTO.py similarity index 93% rename from core/DTOs/ManualBatchInputDTO.py rename to src/core/DTOs/ManualBatchInputDTO.py index 9bb98755..f7de1ecf 100644 --- a/core/DTOs/ManualBatchInputDTO.py +++ b/src/core/DTOs/ManualBatchInputDTO.py @@ -2,7 +2,7 @@ from pydantic import BaseModel, Field -from core.enums import RecordType +from src.core.enums import RecordType class ManualBatchInnerInputDTO(BaseModel): diff --git a/core/DTOs/ManualBatchResponseDTO.py b/src/core/DTOs/ManualBatchResponseDTO.py similarity index 100% rename from core/DTOs/ManualBatchResponseDTO.py rename to src/core/DTOs/ManualBatchResponseDTO.py diff --git a/core/DTOs/MessageCountResponse.py b/src/core/DTOs/MessageCountResponse.py similarity index 69% rename from core/DTOs/MessageCountResponse.py rename to src/core/DTOs/MessageCountResponse.py index acf5faf0..54da2cdf 100644 --- a/core/DTOs/MessageCountResponse.py +++ b/src/core/DTOs/MessageCountResponse.py @@ -1,6 +1,6 @@ from pydantic import Field -from core.DTOs.MessageResponse import MessageResponse +from src.core.DTOs.MessageResponse import MessageResponse class MessageCountResponse(MessageResponse): diff --git a/core/DTOs/MessageResponse.py b/src/core/DTOs/MessageResponse.py similarity index 100% rename from core/DTOs/MessageResponse.py rename to src/core/DTOs/MessageResponse.py diff --git a/core/DTOs/README.md b/src/core/DTOs/README.md similarity index 100% rename from core/DTOs/README.md rename to src/core/DTOs/README.md diff --git a/core/DTOs/RecordTypeAnnotationPostInfo.py b/src/core/DTOs/RecordTypeAnnotationPostInfo.py similarity index 73% rename from core/DTOs/RecordTypeAnnotationPostInfo.py rename to src/core/DTOs/RecordTypeAnnotationPostInfo.py index 87e8b674..a3c7a653 100644 --- a/core/DTOs/RecordTypeAnnotationPostInfo.py +++ b/src/core/DTOs/RecordTypeAnnotationPostInfo.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from core.enums import RecordType +from src.core.enums import RecordType class RecordTypeAnnotationPostInfo(BaseModel): diff --git a/core/DTOs/RelevanceAnnotationPostInfo.py b/src/core/DTOs/RelevanceAnnotationPostInfo.py similarity index 73% rename from core/DTOs/RelevanceAnnotationPostInfo.py rename to src/core/DTOs/RelevanceAnnotationPostInfo.py index 29d0e764..a29a5327 100644 --- a/core/DTOs/RelevanceAnnotationPostInfo.py +++ b/src/core/DTOs/RelevanceAnnotationPostInfo.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from core.enums import SuggestedStatus +from src.core.enums import SuggestedStatus class RelevanceAnnotationPostInfo(BaseModel): diff --git a/core/DTOs/ResponseURLInfo.py b/src/core/DTOs/ResponseURLInfo.py similarity index 100% rename from core/DTOs/ResponseURLInfo.py rename to src/core/DTOs/ResponseURLInfo.py diff --git a/core/DTOs/SearchURLResponse.py b/src/core/DTOs/SearchURLResponse.py similarity index 100% rename from core/DTOs/SearchURLResponse.py rename to src/core/DTOs/SearchURLResponse.py diff --git a/core/DTOs/TaskOperatorRunInfo.py b/src/core/DTOs/TaskOperatorRunInfo.py similarity index 100% rename from core/DTOs/TaskOperatorRunInfo.py rename to src/core/DTOs/TaskOperatorRunInfo.py diff --git a/core/DTOs/URLAgencySuggestionInfo.py b/src/core/DTOs/URLAgencySuggestionInfo.py similarity index 89% rename from core/DTOs/URLAgencySuggestionInfo.py rename to src/core/DTOs/URLAgencySuggestionInfo.py index 2eae0496..c0ea08f4 100644 --- a/core/DTOs/URLAgencySuggestionInfo.py +++ b/src/core/DTOs/URLAgencySuggestionInfo.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from core.enums import SuggestionType +from src.core.enums import SuggestionType class URLAgencySuggestionInfo(BaseModel): diff --git a/core/DTOs/task_data_objects/__init__.py b/src/core/DTOs/__init__.py similarity index 100% rename from core/DTOs/task_data_objects/__init__.py rename to src/core/DTOs/__init__.py diff --git a/core/DTOs/task_data_objects/AgencyIdentificationTDO.py b/src/core/DTOs/task_data_objects/AgencyIdentificationTDO.py similarity index 100% rename from core/DTOs/task_data_objects/AgencyIdentificationTDO.py rename to src/core/DTOs/task_data_objects/AgencyIdentificationTDO.py diff --git a/core/DTOs/task_data_objects/README.md b/src/core/DTOs/task_data_objects/README.md similarity index 100% rename from core/DTOs/task_data_objects/README.md rename to src/core/DTOs/task_data_objects/README.md diff --git a/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py b/src/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py similarity index 94% rename from core/DTOs/task_data_objects/SubmitApprovedURLTDO.py rename to src/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py index be26d3a8..d5193640 100644 --- a/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py +++ b/src/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from core.enums import RecordType +from src.core.enums import RecordType from datetime import datetime class SubmitApprovedURLTDO(BaseModel): diff --git a/core/DTOs/task_data_objects/URL404ProbeTDO.py b/src/core/DTOs/task_data_objects/URL404ProbeTDO.py similarity index 100% rename from core/DTOs/task_data_objects/URL404ProbeTDO.py rename to src/core/DTOs/task_data_objects/URL404ProbeTDO.py diff --git a/core/DTOs/task_data_objects/URLDuplicateTDO.py b/src/core/DTOs/task_data_objects/URLDuplicateTDO.py similarity index 100% rename from core/DTOs/task_data_objects/URLDuplicateTDO.py rename to src/core/DTOs/task_data_objects/URLDuplicateTDO.py diff --git a/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py b/src/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py similarity index 100% rename from core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py rename to src/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py diff --git a/core/DTOs/task_data_objects/URLRecordTypeTDO.py b/src/core/DTOs/task_data_objects/URLRecordTypeTDO.py similarity index 75% rename from core/DTOs/task_data_objects/URLRecordTypeTDO.py rename to src/core/DTOs/task_data_objects/URLRecordTypeTDO.py index 03215f71..ae0bdfb8 100644 --- a/core/DTOs/task_data_objects/URLRecordTypeTDO.py +++ b/src/core/DTOs/task_data_objects/URLRecordTypeTDO.py @@ -2,8 +2,8 @@ from pydantic import BaseModel -from db.DTOs.URLWithHTML import URLWithHTML -from core.enums import RecordType +from src.db.DTOs.URLWithHTML import URLWithHTML +from src.core.enums import RecordType class URLRecordTypeTDO(BaseModel): diff --git a/core/DTOs/task_data_objects/UrlHtmlTDO.py b/src/core/DTOs/task_data_objects/UrlHtmlTDO.py similarity index 55% rename from core/DTOs/task_data_objects/UrlHtmlTDO.py rename to src/core/DTOs/task_data_objects/UrlHtmlTDO.py index 96c44778..7c222b2a 100644 --- a/core/DTOs/task_data_objects/UrlHtmlTDO.py +++ b/src/core/DTOs/task_data_objects/UrlHtmlTDO.py @@ -2,9 +2,9 @@ from pydantic import BaseModel -from db.DTOs.URLInfo import URLInfo -from html_tag_collector.DataClassTags import ResponseHTMLInfo -from html_tag_collector.URLRequestInterface import URLResponseInfo +from src.db.DTOs.URLInfo import URLInfo +from src.html_tag_collector.DataClassTags import ResponseHTMLInfo +from src.html_tag_collector.URLRequestInterface import URLResponseInfo class UrlHtmlTDO(BaseModel): diff --git a/core/__init__.py b/src/core/DTOs/task_data_objects/__init__.py similarity index 100% rename from core/__init__.py rename to src/core/DTOs/task_data_objects/__init__.py diff --git a/core/EnvVarManager.py b/src/core/EnvVarManager.py similarity index 100% rename from core/EnvVarManager.py rename to src/core/EnvVarManager.py diff --git a/core/FunctionTrigger.py b/src/core/FunctionTrigger.py similarity index 100% rename from core/FunctionTrigger.py rename to src/core/FunctionTrigger.py diff --git a/core/README.md b/src/core/README.md similarity index 100% rename from core/README.md rename to src/core/README.md diff --git a/core/ScheduledTaskManager.py b/src/core/ScheduledTaskManager.py similarity index 97% rename from core/ScheduledTaskManager.py rename to src/core/ScheduledTaskManager.py index e0b87247..22502e2d 100644 --- a/core/ScheduledTaskManager.py +++ b/src/core/ScheduledTaskManager.py @@ -2,7 +2,7 @@ from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.interval import IntervalTrigger -from core.AsyncCore import AsyncCore +from src.core.AsyncCore import AsyncCore class AsyncScheduledTaskManager: diff --git a/core/SourceCollectorCore.py b/src/core/SourceCollectorCore.py similarity index 74% rename from core/SourceCollectorCore.py rename to src/core/SourceCollectorCore.py index 6b9822ae..b31d8037 100644 --- a/core/SourceCollectorCore.py +++ b/src/core/SourceCollectorCore.py @@ -1,8 +1,7 @@ -from typing import Optional, Any +from typing import Optional - -from db.DatabaseClient import DatabaseClient -from core.enums import BatchStatus +from src.db.DatabaseClient import DatabaseClient +from src.core.enums import BatchStatus class SourceCollectorCore: diff --git a/core/TaskManager.py b/src/core/TaskManager.py similarity index 80% rename from core/TaskManager.py rename to src/core/TaskManager.py index 4424ec1c..17008d44 100644 --- a/core/TaskManager.py +++ b/src/core/TaskManager.py @@ -1,25 +1,25 @@ import logging -from core.classes.task_operators.URL404ProbeTaskOperator import URL404ProbeTaskOperator -from core.classes.task_operators.URLDuplicateTaskOperator import URLDuplicateTaskOperator -from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DTOs.TaskInfo import TaskInfo -from db.enums import TaskType -from core.DTOs.GetTasksResponse import GetTasksResponse -from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome -from core.FunctionTrigger import FunctionTrigger -from core.classes.task_operators.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator -from core.classes.task_operators.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator -from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator -from core.classes.task_operators.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator -from core.classes.task_operators.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator -from core.enums import BatchStatus -from html_tag_collector.ResponseParser import HTMLResponseParser -from html_tag_collector.URLRequestInterface import URLRequestInterface -from llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier -from pdap_api_client.PDAPClient import PDAPClient +from src.core.classes.task_operators.URL404ProbeTaskOperator import URL404ProbeTaskOperator +from src.core.classes.task_operators.URLDuplicateTaskOperator import URLDuplicateTaskOperator +from src.source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.DTOs.TaskInfo import TaskInfo +from src.db.enums import TaskType +from src.core.DTOs.GetTasksResponse import GetTasksResponse +from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome +from src.core.FunctionTrigger import FunctionTrigger +from src.core.classes.task_operators.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator +from src.core.classes.task_operators.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator +from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase +from src.core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator +from src.core.classes.task_operators.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator +from src.core.classes.task_operators.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator +from src.core.enums import BatchStatus +from src.html_tag_collector.ResponseParser import HTMLResponseParser +from src.html_tag_collector.URLRequestInterface import URLRequestInterface +from src.llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier +from src.pdap_api_client.PDAPClient import PDAPClient from discord_poster import DiscordPoster TASK_REPEAT_THRESHOLD = 20 diff --git a/core/classes/__init__.py b/src/core/__init__.py similarity index 100% rename from core/classes/__init__.py rename to src/core/__init__.py diff --git a/core/classes/ErrorManager.py b/src/core/classes/ErrorManager.py similarity index 96% rename from core/classes/ErrorManager.py rename to src/core/classes/ErrorManager.py index ba763054..5a779a80 100644 --- a/core/classes/ErrorManager.py +++ b/src/core/classes/ErrorManager.py @@ -4,7 +4,7 @@ from fastapi import HTTPException from pydantic import BaseModel -from core.enums import AnnotationType +from src.core.enums import AnnotationType class ErrorTypes(Enum): diff --git a/core/classes/HTMLContentInfoGetter.py b/src/core/classes/HTMLContentInfoGetter.py similarity index 85% rename from core/classes/HTMLContentInfoGetter.py rename to src/core/classes/HTMLContentInfoGetter.py index b9e0b7e1..8e16fad1 100644 --- a/core/classes/HTMLContentInfoGetter.py +++ b/src/core/classes/HTMLContentInfoGetter.py @@ -1,5 +1,5 @@ -from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType -from html_tag_collector.DataClassTags import ResponseHTMLInfo +from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType +from src.html_tag_collector.DataClassTags import ResponseHTMLInfo class HTMLContentInfoGetter: diff --git a/core/classes/subtasks/MiscellaneousMetadata/__init__.py b/src/core/classes/__init__.py similarity index 100% rename from core/classes/subtasks/MiscellaneousMetadata/__init__.py rename to src/core/classes/__init__.py diff --git a/core/classes/subtasks/AgencyIdentificationSubtaskBase.py b/src/core/classes/subtasks/AgencyIdentificationSubtaskBase.py similarity index 81% rename from core/classes/subtasks/AgencyIdentificationSubtaskBase.py rename to src/core/classes/subtasks/AgencyIdentificationSubtaskBase.py index 755cade5..9e7dd865 100644 --- a/core/classes/subtasks/AgencyIdentificationSubtaskBase.py +++ b/src/core/classes/subtasks/AgencyIdentificationSubtaskBase.py @@ -2,7 +2,7 @@ from abc import ABC from typing import Optional -from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo class AgencyIdentificationSubtaskBase(ABC): diff --git a/core/classes/subtasks/AutoGooglerAgencyIdentificationSubtask.py b/src/core/classes/subtasks/AutoGooglerAgencyIdentificationSubtask.py similarity index 73% rename from core/classes/subtasks/AutoGooglerAgencyIdentificationSubtask.py rename to src/core/classes/subtasks/AutoGooglerAgencyIdentificationSubtask.py index 1e5d945b..b4734c71 100644 --- a/core/classes/subtasks/AutoGooglerAgencyIdentificationSubtask.py +++ b/src/core/classes/subtasks/AutoGooglerAgencyIdentificationSubtask.py @@ -1,8 +1,8 @@ from typing import Optional -from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from core.classes.subtasks.AgencyIdentificationSubtaskBase import AgencyIdentificationSubtaskBase -from core.enums import SuggestionType +from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.core.classes.subtasks.AgencyIdentificationSubtaskBase import AgencyIdentificationSubtaskBase +from src.core.enums import SuggestionType class AutoGooglerAgencyIdentificationSubtask(AgencyIdentificationSubtaskBase): diff --git a/core/classes/subtasks/CKANAgencyIdentificationSubtask.py b/src/core/classes/subtasks/CKANAgencyIdentificationSubtask.py similarity index 72% rename from core/classes/subtasks/CKANAgencyIdentificationSubtask.py rename to src/core/classes/subtasks/CKANAgencyIdentificationSubtask.py index 5eb88406..4ac8f0fd 100644 --- a/core/classes/subtasks/CKANAgencyIdentificationSubtask.py +++ b/src/core/classes/subtasks/CKANAgencyIdentificationSubtask.py @@ -1,9 +1,9 @@ from typing import Optional -from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from core.helpers import process_match_agency_response_to_suggestions -from pdap_api_client.PDAPClient import PDAPClient -from pdap_api_client.DTOs import MatchAgencyResponse +from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.core.helpers import process_match_agency_response_to_suggestions +from src.pdap_api_client.PDAPClient import PDAPClient +from src.pdap_api_client.DTOs import MatchAgencyResponse class CKANAgencyIdentificationSubtask: diff --git a/core/classes/subtasks/CommonCrawlerAgencyIdentificationSubtask.py b/src/core/classes/subtasks/CommonCrawlerAgencyIdentificationSubtask.py similarity index 82% rename from core/classes/subtasks/CommonCrawlerAgencyIdentificationSubtask.py rename to src/core/classes/subtasks/CommonCrawlerAgencyIdentificationSubtask.py index 5d0fa409..00441a0a 100644 --- a/core/classes/subtasks/CommonCrawlerAgencyIdentificationSubtask.py +++ b/src/core/classes/subtasks/CommonCrawlerAgencyIdentificationSubtask.py @@ -1,7 +1,7 @@ from typing import Optional -from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from core.enums import SuggestionType +from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.core.enums import SuggestionType class CommonCrawlerAgencyIdentificationSubtask: diff --git a/core/classes/subtasks/MiscellaneousMetadata/AutoGooglerMiscMetadataSubtask.py b/src/core/classes/subtasks/MiscellaneousMetadata/AutoGooglerMiscMetadataSubtask.py similarity index 58% rename from core/classes/subtasks/MiscellaneousMetadata/AutoGooglerMiscMetadataSubtask.py rename to src/core/classes/subtasks/MiscellaneousMetadata/AutoGooglerMiscMetadataSubtask.py index 43659a9e..8cf644ad 100644 --- a/core/classes/subtasks/MiscellaneousMetadata/AutoGooglerMiscMetadataSubtask.py +++ b/src/core/classes/subtasks/MiscellaneousMetadata/AutoGooglerMiscMetadataSubtask.py @@ -1,5 +1,5 @@ -from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO -from core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ +from src.core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO +from src.core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ MiscellaneousMetadataSubtaskBase diff --git a/core/classes/subtasks/MiscellaneousMetadata/CKANMiscMetadataSubtask.py b/src/core/classes/subtasks/MiscellaneousMetadata/CKANMiscMetadataSubtask.py similarity index 72% rename from core/classes/subtasks/MiscellaneousMetadata/CKANMiscMetadataSubtask.py rename to src/core/classes/subtasks/MiscellaneousMetadata/CKANMiscMetadataSubtask.py index 04ef7a0f..60c3a410 100644 --- a/core/classes/subtasks/MiscellaneousMetadata/CKANMiscMetadataSubtask.py +++ b/src/core/classes/subtasks/MiscellaneousMetadata/CKANMiscMetadataSubtask.py @@ -1,5 +1,5 @@ -from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO -from core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ +from src.core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO +from src.core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ MiscellaneousMetadataSubtaskBase diff --git a/core/classes/subtasks/MiscellaneousMetadata/MiscellaneousMetadataSubtaskBase.py b/src/core/classes/subtasks/MiscellaneousMetadata/MiscellaneousMetadataSubtaskBase.py similarity index 66% rename from core/classes/subtasks/MiscellaneousMetadata/MiscellaneousMetadataSubtaskBase.py rename to src/core/classes/subtasks/MiscellaneousMetadata/MiscellaneousMetadataSubtaskBase.py index 7a0e7d1f..0f1224ad 100644 --- a/core/classes/subtasks/MiscellaneousMetadata/MiscellaneousMetadataSubtaskBase.py +++ b/src/core/classes/subtasks/MiscellaneousMetadata/MiscellaneousMetadataSubtaskBase.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod -from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO +from src.core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO class MiscellaneousMetadataSubtaskBase(ABC): diff --git a/core/classes/subtasks/MiscellaneousMetadata/MuckrockMiscMetadataSubtask.py b/src/core/classes/subtasks/MiscellaneousMetadata/MuckrockMiscMetadataSubtask.py similarity index 58% rename from core/classes/subtasks/MiscellaneousMetadata/MuckrockMiscMetadataSubtask.py rename to src/core/classes/subtasks/MiscellaneousMetadata/MuckrockMiscMetadataSubtask.py index 1d599162..4bd18481 100644 --- a/core/classes/subtasks/MiscellaneousMetadata/MuckrockMiscMetadataSubtask.py +++ b/src/core/classes/subtasks/MiscellaneousMetadata/MuckrockMiscMetadataSubtask.py @@ -1,5 +1,5 @@ -from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO -from core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ +from src.core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO +from src.core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ MiscellaneousMetadataSubtaskBase diff --git a/core/classes/subtasks/__init__.py b/src/core/classes/subtasks/MiscellaneousMetadata/__init__.py similarity index 100% rename from core/classes/subtasks/__init__.py rename to src/core/classes/subtasks/MiscellaneousMetadata/__init__.py diff --git a/core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py b/src/core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py similarity index 74% rename from core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py rename to src/core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py index a6222cf8..4e0d874d 100644 --- a/core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py +++ b/src/core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py @@ -1,11 +1,11 @@ from typing import Optional -from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponse, AgencyLookupResponseType -from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from core.exceptions import MuckrockAPIError -from core.helpers import process_match_agency_response_to_suggestions -from pdap_api_client.PDAPClient import PDAPClient -from pdap_api_client.DTOs import MatchAgencyResponse +from src.source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponse, AgencyLookupResponseType +from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.core.exceptions import MuckrockAPIError +from src.core.helpers import process_match_agency_response_to_suggestions +from src.pdap_api_client.PDAPClient import PDAPClient +from src.pdap_api_client.DTOs import MatchAgencyResponse class MuckrockAgencyIdentificationSubtask: diff --git a/core/classes/task_operators/__init__.py b/src/core/classes/subtasks/__init__.py similarity index 100% rename from core/classes/task_operators/__init__.py rename to src/core/classes/subtasks/__init__.py diff --git a/core/classes/task_operators/AgencyIdentificationTaskOperator.py b/src/core/classes/task_operators/AgencyIdentificationTaskOperator.py similarity index 80% rename from core/classes/task_operators/AgencyIdentificationTaskOperator.py rename to src/core/classes/task_operators/AgencyIdentificationTaskOperator.py index 259ddff9..2fede90e 100644 --- a/core/classes/task_operators/AgencyIdentificationTaskOperator.py +++ b/src/core/classes/task_operators/AgencyIdentificationTaskOperator.py @@ -1,19 +1,19 @@ from aiohttp import ClientSession -from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from db.enums import TaskType +from src.source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from src.db.enums import TaskType from collector_manager.enums import CollectorType -from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO -from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from core.classes.subtasks.AutoGooglerAgencyIdentificationSubtask import AutoGooglerAgencyIdentificationSubtask -from core.classes.subtasks.CKANAgencyIdentificationSubtask import CKANAgencyIdentificationSubtask -from core.classes.subtasks.CommonCrawlerAgencyIdentificationSubtask import CommonCrawlerAgencyIdentificationSubtask -from core.classes.subtasks.MuckrockAgencyIdentificationSubtask import MuckrockAgencyIdentificationSubtask -from core.enums import SuggestionType -from pdap_api_client.PDAPClient import PDAPClient +from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO +from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase +from src.core.classes.subtasks.AutoGooglerAgencyIdentificationSubtask import AutoGooglerAgencyIdentificationSubtask +from src.core.classes.subtasks.CKANAgencyIdentificationSubtask import CKANAgencyIdentificationSubtask +from src.core.classes.subtasks.CommonCrawlerAgencyIdentificationSubtask import CommonCrawlerAgencyIdentificationSubtask +from src.core.classes.subtasks.MuckrockAgencyIdentificationSubtask import MuckrockAgencyIdentificationSubtask +from src.core.enums import SuggestionType +from src.pdap_api_client.PDAPClient import PDAPClient # TODO: Validate with Manual Tests diff --git a/core/classes/task_operators/SubmitApprovedURLTaskOperator.py b/src/core/classes/task_operators/SubmitApprovedURLTaskOperator.py similarity index 85% rename from core/classes/task_operators/SubmitApprovedURLTaskOperator.py rename to src/core/classes/task_operators/SubmitApprovedURLTaskOperator.py index e3a4eab2..49b6b7c1 100644 --- a/core/classes/task_operators/SubmitApprovedURLTaskOperator.py +++ b/src/core/classes/task_operators/SubmitApprovedURLTaskOperator.py @@ -1,9 +1,9 @@ -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from db.enums import TaskType -from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO -from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from pdap_api_client.PDAPClient import PDAPClient +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from src.db.enums import TaskType +from src.core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO +from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase +from src.pdap_api_client.PDAPClient import PDAPClient class SubmitApprovedURLTaskOperator(TaskOperatorBase): diff --git a/core/classes/task_operators/TaskOperatorBase.py b/src/core/classes/task_operators/TaskOperatorBase.py similarity index 90% rename from core/classes/task_operators/TaskOperatorBase.py rename to src/core/classes/task_operators/TaskOperatorBase.py index df12f362..7e6df091 100644 --- a/core/classes/task_operators/TaskOperatorBase.py +++ b/src/core/classes/task_operators/TaskOperatorBase.py @@ -1,9 +1,9 @@ import traceback from abc import ABC, abstractmethod -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.enums import TaskType -from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome, TaskOperatorRunInfo -from core.enums import BatchStatus +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.enums import TaskType +from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome, TaskOperatorRunInfo +from src.core.enums import BatchStatus class TaskOperatorBase(ABC): diff --git a/core/classes/task_operators/URL404ProbeTaskOperator.py b/src/core/classes/task_operators/URL404ProbeTaskOperator.py similarity index 85% rename from core/classes/task_operators/URL404ProbeTaskOperator.py rename to src/core/classes/task_operators/URL404ProbeTaskOperator.py index 536fea23..648834d9 100644 --- a/core/classes/task_operators/URL404ProbeTaskOperator.py +++ b/src/core/classes/task_operators/URL404ProbeTaskOperator.py @@ -2,11 +2,11 @@ from pydantic import BaseModel -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.enums import TaskType -from core.DTOs.task_data_objects.URL404ProbeTDO import URL404ProbeTDO -from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from html_tag_collector.URLRequestInterface import URLRequestInterface +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.enums import TaskType +from src.core.DTOs.task_data_objects.URL404ProbeTDO import URL404ProbeTDO +from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase +from src.html_tag_collector.URLRequestInterface import URLRequestInterface class URL404ProbeTDOSubsets(BaseModel): diff --git a/core/classes/task_operators/URLDuplicateTaskOperator.py b/src/core/classes/task_operators/URLDuplicateTaskOperator.py similarity index 83% rename from core/classes/task_operators/URLDuplicateTaskOperator.py rename to src/core/classes/task_operators/URLDuplicateTaskOperator.py index 09ab35ce..c332a461 100644 --- a/core/classes/task_operators/URLDuplicateTaskOperator.py +++ b/src/core/classes/task_operators/URLDuplicateTaskOperator.py @@ -2,11 +2,11 @@ from aiohttp import ClientResponseError -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.enums import TaskType -from core.DTOs.task_data_objects.URLDuplicateTDO import URLDuplicateTDO -from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from pdap_api_client.PDAPClient import PDAPClient +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.enums import TaskType +from src.core.DTOs.task_data_objects.URLDuplicateTDO import URLDuplicateTDO +from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase +from src.pdap_api_client.PDAPClient import PDAPClient class URLDuplicateTaskOperator(TaskOperatorBase): diff --git a/core/classes/task_operators/URLHTMLTaskOperator.py b/src/core/classes/task_operators/URLHTMLTaskOperator.py similarity index 89% rename from core/classes/task_operators/URLHTMLTaskOperator.py rename to src/core/classes/task_operators/URLHTMLTaskOperator.py index 340c386b..26961d72 100644 --- a/core/classes/task_operators/URLHTMLTaskOperator.py +++ b/src/core/classes/task_operators/URLHTMLTaskOperator.py @@ -1,14 +1,14 @@ from http import HTTPStatus -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from db.DTOs.URLInfo import URLInfo -from db.enums import TaskType -from core.DTOs.task_data_objects.UrlHtmlTDO import UrlHtmlTDO -from core.classes.HTMLContentInfoGetter import HTMLContentInfoGetter -from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from html_tag_collector.ResponseParser import HTMLResponseParser -from html_tag_collector.URLRequestInterface import URLRequestInterface +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from src.db.DTOs.URLInfo import URLInfo +from src.db.enums import TaskType +from src.core.DTOs.task_data_objects.UrlHtmlTDO import UrlHtmlTDO +from src.core.classes.HTMLContentInfoGetter import HTMLContentInfoGetter +from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase +from src.html_tag_collector.ResponseParser import HTMLResponseParser +from src.html_tag_collector.URLRequestInterface import URLRequestInterface class URLHTMLTaskOperator(TaskOperatorBase): diff --git a/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py b/src/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py similarity index 75% rename from core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py rename to src/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py index bf9eef04..e078d793 100644 --- a/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py +++ b/src/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py @@ -1,16 +1,16 @@ from typing import Optional -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from db.enums import TaskType +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from src.db.enums import TaskType from collector_manager.enums import CollectorType -from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO -from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from core.classes.subtasks.MiscellaneousMetadata.AutoGooglerMiscMetadataSubtask import AutoGooglerMiscMetadataSubtask -from core.classes.subtasks.MiscellaneousMetadata.CKANMiscMetadataSubtask import CKANMiscMetadataSubtask -from core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ +from src.core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO +from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase +from src.core.classes.subtasks.MiscellaneousMetadata.AutoGooglerMiscMetadataSubtask import AutoGooglerMiscMetadataSubtask +from src.core.classes.subtasks.MiscellaneousMetadata.CKANMiscMetadataSubtask import CKANMiscMetadataSubtask +from src.core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ MiscellaneousMetadataSubtaskBase -from core.classes.subtasks.MiscellaneousMetadata.MuckrockMiscMetadataSubtask import MuckrockMiscMetadataSubtask +from src.core.classes.subtasks.MiscellaneousMetadata.MuckrockMiscMetadataSubtask import MuckrockMiscMetadataSubtask class URLMiscellaneousMetadataTaskOperator(TaskOperatorBase): diff --git a/core/classes/task_operators/URLRecordTypeTaskOperator.py b/src/core/classes/task_operators/URLRecordTypeTaskOperator.py similarity index 86% rename from core/classes/task_operators/URLRecordTypeTaskOperator.py rename to src/core/classes/task_operators/URLRecordTypeTaskOperator.py index 0f080a03..99a960a1 100644 --- a/core/classes/task_operators/URLRecordTypeTaskOperator.py +++ b/src/core/classes/task_operators/URLRecordTypeTaskOperator.py @@ -1,10 +1,10 @@ -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from db.enums import TaskType -from core.DTOs.task_data_objects.URLRecordTypeTDO import URLRecordTypeTDO -from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from core.enums import RecordType -from llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from src.db.enums import TaskType +from src.core.DTOs.task_data_objects.URLRecordTypeTDO import URLRecordTypeTDO +from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase +from src.core.enums import RecordType +from src.llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier class URLRecordTypeTaskOperator(TaskOperatorBase): diff --git a/core/preprocessors/__init__.py b/src/core/classes/task_operators/__init__.py similarity index 100% rename from core/preprocessors/__init__.py rename to src/core/classes/task_operators/__init__.py diff --git a/core/enums.py b/src/core/enums.py similarity index 100% rename from core/enums.py rename to src/core/enums.py diff --git a/core/exceptions.py b/src/core/exceptions.py similarity index 100% rename from core/exceptions.py rename to src/core/exceptions.py diff --git a/core/helpers.py b/src/core/helpers.py similarity index 81% rename from core/helpers.py rename to src/core/helpers.py index 1fc51cde..ebc1aa8b 100644 --- a/core/helpers.py +++ b/src/core/helpers.py @@ -1,12 +1,8 @@ -from http import HTTPStatus - -from fastapi import HTTPException - -from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from core.enums import SuggestionType -from core.exceptions import MatchAgencyError -from pdap_api_client.DTOs import MatchAgencyResponse -from pdap_api_client.enums import MatchAgencyResponseStatus +from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.core.enums import SuggestionType +from src.core.exceptions import MatchAgencyError +from src.pdap_api_client.DTOs import MatchAgencyResponse +from src.pdap_api_client import MatchAgencyResponseStatus def process_match_agency_response_to_suggestions( diff --git a/core/preprocessors/AutoGooglerPreprocessor.py b/src/core/preprocessors/AutoGooglerPreprocessor.py similarity index 87% rename from core/preprocessors/AutoGooglerPreprocessor.py rename to src/core/preprocessors/AutoGooglerPreprocessor.py index ebbf4474..d2d5b1e5 100644 --- a/core/preprocessors/AutoGooglerPreprocessor.py +++ b/src/core/preprocessors/AutoGooglerPreprocessor.py @@ -1,7 +1,7 @@ from typing import List -from db.DTOs.URLInfo import URLInfo -from core.preprocessors.PreprocessorBase import PreprocessorBase +from src.db.DTOs.URLInfo import URLInfo +from src.core.preprocessors.PreprocessorBase import PreprocessorBase class AutoGooglerPreprocessor(PreprocessorBase): diff --git a/core/preprocessors/CKANPreprocessor.py b/src/core/preprocessors/CKANPreprocessor.py similarity index 94% rename from core/preprocessors/CKANPreprocessor.py rename to src/core/preprocessors/CKANPreprocessor.py index 62a550a1..271f6b3f 100644 --- a/core/preprocessors/CKANPreprocessor.py +++ b/src/core/preprocessors/CKANPreprocessor.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import List -from db.DTOs.URLInfo import URLInfo +from src.db.DTOs.URLInfo import URLInfo class CKANPreprocessor: diff --git a/core/preprocessors/CommonCrawlerPreprocessor.py b/src/core/preprocessors/CommonCrawlerPreprocessor.py similarity index 74% rename from core/preprocessors/CommonCrawlerPreprocessor.py rename to src/core/preprocessors/CommonCrawlerPreprocessor.py index 018d9bfb..131d8db3 100644 --- a/core/preprocessors/CommonCrawlerPreprocessor.py +++ b/src/core/preprocessors/CommonCrawlerPreprocessor.py @@ -1,7 +1,7 @@ from typing import List -from db.DTOs.URLInfo import URLInfo -from core.preprocessors.PreprocessorBase import PreprocessorBase +from src.db.DTOs.URLInfo import URLInfo +from src.core.preprocessors.PreprocessorBase import PreprocessorBase class CommonCrawlerPreprocessor(PreprocessorBase): diff --git a/core/preprocessors/ExamplePreprocessor.py b/src/core/preprocessors/ExamplePreprocessor.py similarity index 78% rename from core/preprocessors/ExamplePreprocessor.py rename to src/core/preprocessors/ExamplePreprocessor.py index 41f3b57e..e6537297 100644 --- a/core/preprocessors/ExamplePreprocessor.py +++ b/src/core/preprocessors/ExamplePreprocessor.py @@ -1,8 +1,8 @@ from typing import List -from db.DTOs.URLInfo import URLInfo +from src.db.DTOs.URLInfo import URLInfo from collector_manager.DTOs.ExampleOutputDTO import ExampleOutputDTO -from core.preprocessors.PreprocessorBase import PreprocessorBase +from src.core.preprocessors.PreprocessorBase import PreprocessorBase class ExamplePreprocessor(PreprocessorBase): diff --git a/core/preprocessors/MuckrockPreprocessor.py b/src/core/preprocessors/MuckrockPreprocessor.py similarity index 77% rename from core/preprocessors/MuckrockPreprocessor.py rename to src/core/preprocessors/MuckrockPreprocessor.py index 04ba221b..503004e9 100644 --- a/core/preprocessors/MuckrockPreprocessor.py +++ b/src/core/preprocessors/MuckrockPreprocessor.py @@ -1,7 +1,7 @@ from typing import List -from db.DTOs.URLInfo import URLInfo -from core.preprocessors.PreprocessorBase import PreprocessorBase +from src.db.DTOs.URLInfo import URLInfo +from src.core.preprocessors.PreprocessorBase import PreprocessorBase class MuckrockPreprocessor(PreprocessorBase): diff --git a/core/preprocessors/PreprocessorBase.py b/src/core/preprocessors/PreprocessorBase.py similarity index 92% rename from core/preprocessors/PreprocessorBase.py rename to src/core/preprocessors/PreprocessorBase.py index 6f44f8ae..30f73eed 100644 --- a/core/preprocessors/PreprocessorBase.py +++ b/src/core/preprocessors/PreprocessorBase.py @@ -2,7 +2,7 @@ from abc import ABC from typing import List -from db.DTOs.URLInfo import URLInfo +from src.db.DTOs.URLInfo import URLInfo class PreprocessorBase(ABC): diff --git a/core/preprocessors/README.md b/src/core/preprocessors/README.md similarity index 100% rename from core/preprocessors/README.md rename to src/core/preprocessors/README.md diff --git a/db/DTOs/__init__.py b/src/core/preprocessors/__init__.py similarity index 100% rename from db/DTOs/__init__.py rename to src/core/preprocessors/__init__.py diff --git a/db/AsyncDatabaseClient.py b/src/db/AsyncDatabaseClient.py similarity index 96% rename from db/AsyncDatabaseClient.py rename to src/db/AsyncDatabaseClient.py index a539d3b2..72a18644 100644 --- a/db/AsyncDatabaseClient.py +++ b/src/db/AsyncDatabaseClient.py @@ -4,7 +4,7 @@ from typing import Optional, Type, Any, List from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, update, asc, delete, insert, CTE, literal +from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, update, asc, delete, literal from sqlalchemy.dialects import postgresql from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker @@ -12,61 +12,61 @@ from sqlalchemy.sql.functions import coalesce from starlette import status -from db.ConfigManager import ConfigManager -from db.DTOConverter import DTOConverter -from db.DTOs.BatchInfo import BatchInfo -from db.DTOs.DuplicateInfo import DuplicateInsertInfo, DuplicateInfo -from db.DTOs.InsertURLsInfo import InsertURLsInfo -from db.DTOs.LogInfo import LogInfo, LogOutputInfo -from db.DTOs.TaskInfo import TaskInfo -from db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType -from db.DTOs.URLInfo import URLInfo -from db.DTOs.URLMapping import URLMapping -from db.StatementComposer import StatementComposer -from db.constants import PLACEHOLDER_AGENCY_NAME -from db.enums import TaskType -from db.models import URL, URLErrorInfo, URLHTMLContent, Base, \ +from src.db.ConfigManager import ConfigManager +from src.db.DTOConverter import DTOConverter +from src.db.DTOs.BatchInfo import BatchInfo +from src.db.DTOs.DuplicateInfo import DuplicateInsertInfo, DuplicateInfo +from src.db.DTOs.InsertURLsInfo import InsertURLsInfo +from src.db.DTOs.LogInfo import LogInfo, LogOutputInfo +from src.db.DTOs.TaskInfo import TaskInfo +from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType +from src.db.DTOs.URLInfo import URLInfo +from src.db.DTOs.URLMapping import URLMapping +from src.db.StatementComposer import StatementComposer +from src.db.constants import PLACEHOLDER_AGENCY_NAME +from src.db.enums import TaskType +from src.db.models import URL, URLErrorInfo, URLHTMLContent, Base, \ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Duplicate, Log, \ BacklogSnapshot, URLDataSource, URLCheckedForDuplicate, URLProbedFor404 from collector_manager.enums import URLStatus, CollectorType -from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason -from core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO, GetMetricsBacklogResponseInnerDTO -from core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO, \ +from src.core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo +from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason +from src.core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO, GetMetricsBacklogResponseInnerDTO +from src.core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO, \ GetMetricsBatchesAggregatedInnerResponseDTO -from core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO, \ +from src.core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO, \ GetMetricsBatchesBreakdownInnerResponseDTO -from core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO -from core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO, \ +from src.core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO +from src.core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO, \ GetMetricsURLsBreakdownPendingResponseInnerDTO -from core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO, \ +from src.core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO, \ GetMetricsURLsBreakdownSubmittedInnerDTO -from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseInfo -from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo -from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ +from src.core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseInfo +from src.core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo +from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ GetNextURLForAgencyAgencyInfo, GetNextURLForAgencyAnnotationInnerResponse -from core.DTOs.GetNextURLForAllAnnotationResponse import GetNextURLForAllAnnotationResponse, \ +from src.core.DTOs.GetNextURLForAllAnnotationResponse import GetNextURLForAllAnnotationResponse, \ GetNextURLForAllAnnotationInnerResponse -from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, FinalReviewAnnotationInfo, \ +from src.core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, FinalReviewAnnotationInfo, \ FinalReviewOptionalMetadata -from core.DTOs.GetTasksResponse import GetTasksResponse, GetTasksResponseTaskInfo -from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseErrorInfo, \ +from src.core.DTOs.GetTasksResponse import GetTasksResponse, GetTasksResponseTaskInfo +from src.core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseErrorInfo, \ GetURLsResponseInnerInfo -from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO -from core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO -from core.DTOs.SearchURLResponse import SearchURLResponse -from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO -from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO, SubmittedURLInfo -from core.DTOs.task_data_objects.URL404ProbeTDO import URL404ProbeTDO -from core.DTOs.task_data_objects.URLDuplicateTDO import URLDuplicateTDO -from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo -from core.EnvVarManager import EnvVarManager -from core.enums import BatchStatus, SuggestionType, RecordType, SuggestedStatus -from html_tag_collector.DataClassTags import convert_to_response_html_info +from src.core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO +from src.core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO +from src.core.DTOs.SearchURLResponse import SearchURLResponse +from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO +from src.core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO, SubmittedURLInfo +from src.core.DTOs.task_data_objects.URL404ProbeTDO import URL404ProbeTDO +from src.core.DTOs.task_data_objects.URLDuplicateTDO import URLDuplicateTDO +from src.core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo +from src.core.EnvVarManager import EnvVarManager +from src.core.enums import BatchStatus, SuggestionType, RecordType, SuggestedStatus +from src.html_tag_collector.DataClassTags import convert_to_response_html_info # Type Hints diff --git a/db/ConfigManager.py b/src/db/ConfigManager.py similarity index 100% rename from db/ConfigManager.py rename to src/db/ConfigManager.py diff --git a/db/DTOConverter.py b/src/db/DTOConverter.py similarity index 91% rename from db/DTOConverter.py rename to src/db/DTOConverter.py index d95935d4..811aefa3 100644 --- a/db/DTOConverter.py +++ b/src/db/DTOConverter.py @@ -1,17 +1,17 @@ from typing import Optional -from db.DTOs.URLHTMLContentInfo import HTMLContentType, URLHTMLContentInfo -from db.DTOs.URLInfo import URLInfo -from db.DTOs.URLWithHTML import URLWithHTML -from db.models import AutomatedUrlAgencySuggestion, UserUrlAgencySuggestion, URLHTMLContent, URL, Agency, \ +from src.db.DTOs.URLHTMLContentInfo import HTMLContentType, URLHTMLContentInfo +from src.db.DTOs.URLInfo import URLInfo +from src.db.DTOs.URLWithHTML import URLWithHTML +from src.db.models import AutomatedUrlAgencySuggestion, UserUrlAgencySuggestion, URLHTMLContent, URL, \ AutoRecordTypeSuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion, AutoRelevantSuggestion, \ ConfirmedURLAgency -from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo -from core.DTOs.GetNextURLForFinalReviewResponse import FinalReviewAnnotationRelevantInfo, \ +from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo +from src.core.DTOs.GetNextURLForFinalReviewResponse import FinalReviewAnnotationRelevantInfo, \ FinalReviewAnnotationRecordTypeInfo, FinalReviewAnnotationAgencyAutoInfo, \ FinalReviewAnnotationAgencyInfo -from core.enums import RecordType, SuggestionType -from html_tag_collector.DataClassTags import ResponseHTMLInfo, ENUM_TO_ATTRIBUTE_MAPPING +from src.core.enums import RecordType, SuggestionType +from src.html_tag_collector.DataClassTags import ResponseHTMLInfo, ENUM_TO_ATTRIBUTE_MAPPING class DTOConverter: diff --git a/db/DTOs/BatchInfo.py b/src/db/DTOs/BatchInfo.py similarity index 94% rename from db/DTOs/BatchInfo.py rename to src/db/DTOs/BatchInfo.py index ba16539a..db5505bc 100644 --- a/db/DTOs/BatchInfo.py +++ b/src/db/DTOs/BatchInfo.py @@ -3,7 +3,7 @@ from pydantic import BaseModel -from core.enums import BatchStatus +from src.core.enums import BatchStatus class BatchInfo(BaseModel): diff --git a/db/DTOs/DuplicateInfo.py b/src/db/DTOs/DuplicateInfo.py similarity index 100% rename from db/DTOs/DuplicateInfo.py rename to src/db/DTOs/DuplicateInfo.py diff --git a/db/DTOs/GetTaskStatusResponseInfo.py b/src/db/DTOs/GetTaskStatusResponseInfo.py similarity index 74% rename from db/DTOs/GetTaskStatusResponseInfo.py rename to src/db/DTOs/GetTaskStatusResponseInfo.py index df44fd73..cb903ed2 100644 --- a/db/DTOs/GetTaskStatusResponseInfo.py +++ b/src/db/DTOs/GetTaskStatusResponseInfo.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from db.enums import TaskType +from src.db.enums import TaskType class GetTaskStatusResponseInfo(BaseModel): diff --git a/db/DTOs/InsertURLsInfo.py b/src/db/DTOs/InsertURLsInfo.py similarity index 81% rename from db/DTOs/InsertURLsInfo.py rename to src/db/DTOs/InsertURLsInfo.py index b7cbc924..21b89219 100644 --- a/db/DTOs/InsertURLsInfo.py +++ b/src/db/DTOs/InsertURLsInfo.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from db.DTOs.URLMapping import URLMapping +from src.db.DTOs.URLMapping import URLMapping class InsertURLsInfo(BaseModel): diff --git a/db/DTOs/LogInfo.py b/src/db/DTOs/LogInfo.py similarity index 100% rename from db/DTOs/LogInfo.py rename to src/db/DTOs/LogInfo.py diff --git a/db/DTOs/MetadataAnnotationInfo.py b/src/db/DTOs/MetadataAnnotationInfo.py similarity index 100% rename from db/DTOs/MetadataAnnotationInfo.py rename to src/db/DTOs/MetadataAnnotationInfo.py diff --git a/db/DTOs/README.md b/src/db/DTOs/README.md similarity index 100% rename from db/DTOs/README.md rename to src/db/DTOs/README.md diff --git a/db/DTOs/TaskInfo.py b/src/db/DTOs/TaskInfo.py similarity index 63% rename from db/DTOs/TaskInfo.py rename to src/db/DTOs/TaskInfo.py index feae2666..e8adadb1 100644 --- a/db/DTOs/TaskInfo.py +++ b/src/db/DTOs/TaskInfo.py @@ -3,10 +3,10 @@ from pydantic import BaseModel -from db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from db.DTOs.URLInfo import URLInfo -from db.enums import TaskType -from core.enums import BatchStatus +from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from src.db.DTOs.URLInfo import URLInfo +from src.db.enums import TaskType +from src.core.enums import BatchStatus class TaskInfo(BaseModel): diff --git a/db/DTOs/URLAnnotationInfo.py b/src/db/DTOs/URLAnnotationInfo.py similarity index 73% rename from db/DTOs/URLAnnotationInfo.py rename to src/db/DTOs/URLAnnotationInfo.py index e83e4752..64920e9c 100644 --- a/db/DTOs/URLAnnotationInfo.py +++ b/src/db/DTOs/URLAnnotationInfo.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo class URLAnnotationInfo(BaseModel): diff --git a/db/DTOs/URLErrorInfos.py b/src/db/DTOs/URLErrorInfos.py similarity index 100% rename from db/DTOs/URLErrorInfos.py rename to src/db/DTOs/URLErrorInfos.py diff --git a/db/DTOs/URLHTMLContentInfo.py b/src/db/DTOs/URLHTMLContentInfo.py similarity index 100% rename from db/DTOs/URLHTMLContentInfo.py rename to src/db/DTOs/URLHTMLContentInfo.py diff --git a/db/DTOs/URLInfo.py b/src/db/DTOs/URLInfo.py similarity index 100% rename from db/DTOs/URLInfo.py rename to src/db/DTOs/URLInfo.py diff --git a/db/DTOs/URLMapping.py b/src/db/DTOs/URLMapping.py similarity index 100% rename from db/DTOs/URLMapping.py rename to src/db/DTOs/URLMapping.py diff --git a/db/DTOs/URLMetadataInfo.py b/src/db/DTOs/URLMetadataInfo.py similarity index 87% rename from db/DTOs/URLMetadataInfo.py rename to src/db/DTOs/URLMetadataInfo.py index 27431a99..acac01b8 100644 --- a/db/DTOs/URLMetadataInfo.py +++ b/src/db/DTOs/URLMetadataInfo.py @@ -3,7 +3,7 @@ from pydantic import BaseModel -from db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource +from src.db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource class URLMetadataInfo(BaseModel): diff --git a/db/DTOs/URLRelevancyInfo.py b/src/db/DTOs/URLRelevancyInfo.py similarity index 100% rename from db/DTOs/URLRelevancyInfo.py rename to src/db/DTOs/URLRelevancyInfo.py diff --git a/db/DTOs/URLWithHTML.py b/src/db/DTOs/URLWithHTML.py similarity index 68% rename from db/DTOs/URLWithHTML.py rename to src/db/DTOs/URLWithHTML.py index 53c77b82..0c767da8 100644 --- a/db/DTOs/URLWithHTML.py +++ b/src/db/DTOs/URLWithHTML.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo class URLWithHTML(BaseModel): diff --git a/db/__init__.py b/src/db/DTOs/__init__.py similarity index 100% rename from db/__init__.py rename to src/db/DTOs/__init__.py diff --git a/db/DatabaseClient.py b/src/db/DatabaseClient.py similarity index 89% rename from db/DatabaseClient.py rename to src/db/DatabaseClient.py index 030e2db6..4a2a8bf7 100644 --- a/db/DatabaseClient.py +++ b/src/db/DatabaseClient.py @@ -3,23 +3,20 @@ from sqlalchemy import create_engine, update from sqlalchemy.exc import IntegrityError -from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import sessionmaker, scoped_session, Session -from db.ConfigManager import ConfigManager -from db.DTOs.BatchInfo import BatchInfo -from db.DTOs.DuplicateInfo import DuplicateInsertInfo -from db.DTOs.InsertURLsInfo import InsertURLsInfo -from db.DTOs.LogInfo import LogInfo -from db.DTOs.URLInfo import URLInfo -from db.DTOs.URLMapping import URLMapping -from db.models import Base, Batch, URL, Log, Duplicate, URLDataSource -from collector_manager.enums import CollectorType, URLStatus -from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO -from core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO -from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmittedURLInfo -from core.EnvVarManager import EnvVarManager -from core.enums import BatchStatus +from src.db.ConfigManager import ConfigManager +from src.db.DTOs.BatchInfo import BatchInfo +from src.db.DTOs.DuplicateInfo import DuplicateInsertInfo +from src.db.DTOs.InsertURLsInfo import InsertURLsInfo +from src.db.DTOs.LogInfo import LogInfo +from src.db.DTOs.URLInfo import URLInfo +from src.db.DTOs.URLMapping import URLMapping +from src.db.models import Base, Batch, URL, Log, Duplicate, URLDataSource +from collector_manager.enums import URLStatus +from src.core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmittedURLInfo +from src.core.EnvVarManager import EnvVarManager +from src.core.enums import BatchStatus # Database Client diff --git a/db/README.md b/src/db/README.md similarity index 100% rename from db/README.md rename to src/db/README.md diff --git a/db/StatementComposer.py b/src/db/StatementComposer.py similarity index 86% rename from db/StatementComposer.py rename to src/db/StatementComposer.py index 73121e51..b17a41f6 100644 --- a/db/StatementComposer.py +++ b/src/db/StatementComposer.py @@ -1,14 +1,13 @@ -from typing import Any, Optional +from typing import Any -from sqlalchemy import Select, select, exists, Table, func, Subquery, and_, not_, ColumnElement, case, literal, CTE +from sqlalchemy import Select, select, exists, func, Subquery, and_, not_, ColumnElement from sqlalchemy.orm import aliased -from db.enums import URLMetadataAttributeType, ValidationStatus, TaskType -from db.models import URL, URLHTMLContent, AutomatedUrlAgencySuggestion, URLOptionalDataSourceMetadata, Batch, \ - ConfirmedURLAgency, LinkTaskURL, Task, UserUrlAgencySuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion, \ - AutoRecordTypeSuggestion, AutoRelevantSuggestion, ReviewingUserURL -from collector_manager.enums import URLStatus, CollectorType -from core.enums import BatchStatus +from src.db.enums import TaskType +from src.db.models import URL, URLHTMLContent, AutomatedUrlAgencySuggestion, URLOptionalDataSourceMetadata, Batch, \ + ConfirmedURLAgency, LinkTaskURL, Task, UserUrlAgencySuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion +from collector_manager.enums import URLStatus +from src.core.enums import BatchStatus class StatementComposer: diff --git a/html_tag_collector/__init__.py b/src/db/__init__.py similarity index 100% rename from html_tag_collector/__init__.py rename to src/db/__init__.py diff --git a/db/constants.py b/src/db/constants.py similarity index 100% rename from db/constants.py rename to src/db/constants.py diff --git a/db/enums.py b/src/db/enums.py similarity index 100% rename from db/enums.py rename to src/db/enums.py diff --git a/db/helper_functions.py b/src/db/helper_functions.py similarity index 64% rename from db/helper_functions.py rename to src/db/helper_functions.py index 4f99556a..cf0efcc3 100644 --- a/db/helper_functions.py +++ b/src/db/helper_functions.py @@ -1,8 +1,4 @@ -import os - -import dotenv - -from core.EnvVarManager import EnvVarManager +from src.core.EnvVarManager import EnvVarManager def get_postgres_connection_string(is_async = False): diff --git a/db/models.py b/src/db/models.py similarity index 99% rename from db/models.py rename to src/db/models.py index 83ca97b4..c0a947b9 100644 --- a/db/models.py +++ b/src/db/models.py @@ -2,12 +2,12 @@ SQLAlchemy ORM models """ from sqlalchemy import func, Column, Integer, String, TIMESTAMP, Float, JSON, ForeignKey, Text, UniqueConstraint, \ - Boolean, DateTime, ARRAY + Boolean, ARRAY from sqlalchemy.dialects import postgresql from sqlalchemy.orm import declarative_base, relationship -from db.enums import PGEnum, TaskType -from core.enums import BatchStatus, RecordType +from src.db.enums import PGEnum, TaskType +from src.core.enums import BatchStatus, RecordType from util.helper_functions import get_enum_values # Base class for SQLAlchemy ORM models diff --git a/html_tag_collector/DataClassTags.py b/src/html_tag_collector/DataClassTags.py similarity index 92% rename from html_tag_collector/DataClassTags.py rename to src/html_tag_collector/DataClassTags.py index 12a0ecc3..c920a563 100644 --- a/html_tag_collector/DataClassTags.py +++ b/src/html_tag_collector/DataClassTags.py @@ -1,6 +1,6 @@ from dataclasses import dataclass -from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType +from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType @dataclass diff --git a/html_tag_collector/README.md b/src/html_tag_collector/README.md similarity index 100% rename from html_tag_collector/README.md rename to src/html_tag_collector/README.md diff --git a/html_tag_collector/ResponseParser.py b/src/html_tag_collector/ResponseParser.py similarity index 90% rename from html_tag_collector/ResponseParser.py rename to src/html_tag_collector/ResponseParser.py index 0a489eaf..4f6c5f74 100644 --- a/html_tag_collector/ResponseParser.py +++ b/src/html_tag_collector/ResponseParser.py @@ -1,18 +1,14 @@ import json -from collections import namedtuple -from dataclasses import asdict from enum import Enum from typing import Optional -import bs4 from bs4 import BeautifulSoup -from requests import Response -from html_tag_collector.DataClassTags import ResponseHTMLInfo -from html_tag_collector.RootURLCache import RootURLCache -from html_tag_collector.constants import HEADER_TAGS -from html_tag_collector.url_adjustment_functions import drop_hostname, remove_trailing_backslash, add_https -from html_tag_collector.util import remove_excess_whitespace +from src.html_tag_collector.DataClassTags import ResponseHTMLInfo +from src.html_tag_collector.RootURLCache import RootURLCache +from src.html_tag_collector.constants import HEADER_TAGS +from src.html_tag_collector.url_adjustment_functions import drop_hostname, remove_trailing_backslash, add_https +from src.html_tag_collector.util import remove_excess_whitespace class ParserTypeEnum(Enum): LXML = "lxml" diff --git a/html_tag_collector/RootURLCache.py b/src/html_tag_collector/RootURLCache.py similarity index 95% rename from html_tag_collector/RootURLCache.py rename to src/html_tag_collector/RootURLCache.py index b5f3f413..1231752f 100644 --- a/html_tag_collector/RootURLCache.py +++ b/src/html_tag_collector/RootURLCache.py @@ -5,8 +5,8 @@ from aiohttp import ClientSession from bs4 import BeautifulSoup -from db.AsyncDatabaseClient import AsyncDatabaseClient -from html_tag_collector.constants import REQUEST_HEADERS +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.html_tag_collector.constants import REQUEST_HEADERS DEBUG = False diff --git a/html_tag_collector/URLRequestInterface.py b/src/html_tag_collector/URLRequestInterface.py similarity index 100% rename from html_tag_collector/URLRequestInterface.py rename to src/html_tag_collector/URLRequestInterface.py diff --git a/llm_api_logic/__init__.py b/src/html_tag_collector/__init__.py similarity index 100% rename from llm_api_logic/__init__.py rename to src/html_tag_collector/__init__.py diff --git a/html_tag_collector/constants.py b/src/html_tag_collector/constants.py similarity index 100% rename from html_tag_collector/constants.py rename to src/html_tag_collector/constants.py diff --git a/html_tag_collector/url_adjustment_functions.py b/src/html_tag_collector/url_adjustment_functions.py similarity index 100% rename from html_tag_collector/url_adjustment_functions.py rename to src/html_tag_collector/url_adjustment_functions.py diff --git a/html_tag_collector/util.py b/src/html_tag_collector/util.py similarity index 100% rename from html_tag_collector/util.py rename to src/html_tag_collector/util.py diff --git a/llm_api_logic/DeepSeekRecordClassifier.py b/src/llm_api_logic/DeepSeekRecordClassifier.py similarity index 75% rename from llm_api_logic/DeepSeekRecordClassifier.py rename to src/llm_api_logic/DeepSeekRecordClassifier.py index e770f3c0..d9c71441 100644 --- a/llm_api_logic/DeepSeekRecordClassifier.py +++ b/src/llm_api_logic/DeepSeekRecordClassifier.py @@ -1,11 +1,8 @@ -import json import os from openai import AsyncOpenAI -from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo -from core.enums import RecordType -from llm_api_logic.LLMRecordClassifierBase import RecordClassifierBase +from src.llm_api_logic.LLMRecordClassifierBase import RecordClassifierBase class DeepSeekRecordClassifier(RecordClassifierBase): diff --git a/llm_api_logic/LLMRecordClassifierBase.py b/src/llm_api_logic/LLMRecordClassifierBase.py similarity index 86% rename from llm_api_logic/LLMRecordClassifierBase.py rename to src/llm_api_logic/LLMRecordClassifierBase.py index 5648a90f..a29b8d65 100644 --- a/llm_api_logic/LLMRecordClassifierBase.py +++ b/src/llm_api_logic/LLMRecordClassifierBase.py @@ -4,10 +4,10 @@ from openai import AsyncOpenAI -from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo -from llm_api_logic.RecordTypeStructuredOutput import RecordTypeStructuredOutput -from llm_api_logic.constants import RECORD_CLASSIFICATION_QUERY_CONTENT -from llm_api_logic.helpers import dictify_html_info +from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from src.llm_api_logic.RecordTypeStructuredOutput import RecordTypeStructuredOutput +from src.llm_api_logic.constants import RECORD_CLASSIFICATION_QUERY_CONTENT +from src.llm_api_logic.helpers import dictify_html_info class RecordClassifierBase(ABC): diff --git a/llm_api_logic/OpenAIRecordClassifier.py b/src/llm_api_logic/OpenAIRecordClassifier.py similarity index 77% rename from llm_api_logic/OpenAIRecordClassifier.py rename to src/llm_api_logic/OpenAIRecordClassifier.py index cc0829b5..3511b193 100644 --- a/llm_api_logic/OpenAIRecordClassifier.py +++ b/src/llm_api_logic/OpenAIRecordClassifier.py @@ -1,9 +1,9 @@ from openai.types.chat import ParsedChatCompletion -from core.EnvVarManager import EnvVarManager -from llm_api_logic.LLMRecordClassifierBase import RecordClassifierBase -from llm_api_logic.RecordTypeStructuredOutput import RecordTypeStructuredOutput +from src.core.EnvVarManager import EnvVarManager +from src.llm_api_logic.LLMRecordClassifierBase import RecordClassifierBase +from src.llm_api_logic.RecordTypeStructuredOutput import RecordTypeStructuredOutput class OpenAIRecordClassifier(RecordClassifierBase): diff --git a/llm_api_logic/RecordTypeStructuredOutput.py b/src/llm_api_logic/RecordTypeStructuredOutput.py similarity index 86% rename from llm_api_logic/RecordTypeStructuredOutput.py rename to src/llm_api_logic/RecordTypeStructuredOutput.py index a5993ae9..735254a1 100644 --- a/llm_api_logic/RecordTypeStructuredOutput.py +++ b/src/llm_api_logic/RecordTypeStructuredOutput.py @@ -5,7 +5,7 @@ from pydantic import BaseModel -from core.enums import RecordType +from src.core.enums import RecordType diff --git a/pdap_api_client/__init__.py b/src/llm_api_logic/__init__.py similarity index 100% rename from pdap_api_client/__init__.py rename to src/llm_api_logic/__init__.py diff --git a/llm_api_logic/constants.py b/src/llm_api_logic/constants.py similarity index 100% rename from llm_api_logic/constants.py rename to src/llm_api_logic/constants.py diff --git a/llm_api_logic/helpers.py b/src/llm_api_logic/helpers.py similarity index 76% rename from llm_api_logic/helpers.py rename to src/llm_api_logic/helpers.py index b8a81b13..e1e0ffea 100644 --- a/llm_api_logic/helpers.py +++ b/src/llm_api_logic/helpers.py @@ -1,4 +1,4 @@ -from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo def dictify_html_info(html_infos: list[URLHTMLContentInfo]) -> dict[str, str]: diff --git a/pdap_api_client/DTOs.py b/src/pdap_api_client/DTOs.py similarity index 91% rename from pdap_api_client/DTOs.py rename to src/pdap_api_client/DTOs.py index 23d240d7..960e1995 100644 --- a/pdap_api_client/DTOs.py +++ b/src/pdap_api_client/DTOs.py @@ -3,7 +3,7 @@ from pydantic import BaseModel -from pdap_api_client.enums import MatchAgencyResponseStatus +from src.pdap_api_client.enums import MatchAgencyResponseStatus class MatchAgencyInfo(BaseModel): diff --git a/pdap_api_client/PDAPClient.py b/src/pdap_api_client/PDAPClient.py similarity index 94% rename from pdap_api_client/PDAPClient.py rename to src/pdap_api_client/PDAPClient.py index 491b7c3b..653d9c5d 100644 --- a/pdap_api_client/PDAPClient.py +++ b/src/pdap_api_client/PDAPClient.py @@ -1,9 +1,9 @@ from typing import Optional -from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO, SubmittedURLInfo -from pdap_api_client.DTOs import MatchAgencyInfo, UniqueURLDuplicateInfo, \ +from src.core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO, SubmittedURLInfo +from src.pdap_api_client.DTOs import MatchAgencyInfo, UniqueURLDuplicateInfo, \ MatchAgencyResponse -from pdap_api_client.enums import MatchAgencyResponseStatus +from src.pdap_api_client.enums import MatchAgencyResponseStatus from pdap_access_manager import AccessManager, DataSourcesNamespaces, RequestInfo, RequestType diff --git a/security_manager/__init__.py b/src/pdap_api_client/__init__.py similarity index 100% rename from security_manager/__init__.py rename to src/pdap_api_client/__init__.py diff --git a/pdap_api_client/enums.py b/src/pdap_api_client/enums.py similarity index 100% rename from pdap_api_client/enums.py rename to src/pdap_api_client/enums.py diff --git a/security_manager/SecurityManager.py b/src/security_manager/SecurityManager.py similarity index 100% rename from security_manager/SecurityManager.py rename to src/security_manager/SecurityManager.py diff --git a/source_collectors/__init__.py b/src/security_manager/__init__.py similarity index 100% rename from source_collectors/__init__.py rename to src/security_manager/__init__.py diff --git a/source_collectors/README.md b/src/source_collectors/README.md similarity index 100% rename from source_collectors/README.md rename to src/source_collectors/README.md diff --git a/source_collectors/auto_googler/__init__.py b/src/source_collectors/__init__.py similarity index 100% rename from source_collectors/auto_googler/__init__.py rename to src/source_collectors/__init__.py diff --git a/source_collectors/auto_googler/AutoGoogler.py b/src/source_collectors/auto_googler/AutoGoogler.py similarity index 79% rename from source_collectors/auto_googler/AutoGoogler.py rename to src/source_collectors/auto_googler/AutoGoogler.py index 368f75fb..b6e5b96d 100644 --- a/source_collectors/auto_googler/AutoGoogler.py +++ b/src/source_collectors/auto_googler/AutoGoogler.py @@ -1,8 +1,6 @@ -import asyncio - -from source_collectors.auto_googler.DTOs import GoogleSearchQueryResultsInnerDTO -from source_collectors.auto_googler.GoogleSearcher import GoogleSearcher -from source_collectors.auto_googler.SearchConfig import SearchConfig +from src.source_collectors.auto_googler.DTOs import GoogleSearchQueryResultsInnerDTO +from src.source_collectors.auto_googler.GoogleSearcher import GoogleSearcher +from src.source_collectors.auto_googler.SearchConfig import SearchConfig class AutoGoogler: diff --git a/source_collectors/auto_googler/AutoGooglerCollector.py b/src/source_collectors/auto_googler/AutoGooglerCollector.py similarity index 75% rename from source_collectors/auto_googler/AutoGooglerCollector.py rename to src/source_collectors/auto_googler/AutoGooglerCollector.py index 01387d0b..7fd875b3 100644 --- a/source_collectors/auto_googler/AutoGooglerCollector.py +++ b/src/source_collectors/auto_googler/AutoGooglerCollector.py @@ -1,12 +1,12 @@ from collector_manager.AsyncCollectorBase import AsyncCollectorBase from collector_manager.enums import CollectorType -from core.EnvVarManager import EnvVarManager -from core.preprocessors.AutoGooglerPreprocessor import AutoGooglerPreprocessor -from source_collectors.auto_googler.AutoGoogler import AutoGoogler -from source_collectors.auto_googler.DTOs import AutoGooglerInputDTO, AutoGooglerInnerOutputDTO -from source_collectors.auto_googler.GoogleSearcher import GoogleSearcher -from source_collectors.auto_googler.SearchConfig import SearchConfig +from src.core.EnvVarManager import EnvVarManager +from src.core.preprocessors.AutoGooglerPreprocessor import AutoGooglerPreprocessor +from src.source_collectors.auto_googler.AutoGoogler import AutoGoogler +from src.source_collectors.auto_googler.DTOs import AutoGooglerInputDTO, AutoGooglerInnerOutputDTO +from src.source_collectors.auto_googler.GoogleSearcher import GoogleSearcher +from src.source_collectors.auto_googler.SearchConfig import SearchConfig from util.helper_functions import base_model_list_dump diff --git a/source_collectors/auto_googler/DTOs.py b/src/source_collectors/auto_googler/DTOs.py similarity index 100% rename from source_collectors/auto_googler/DTOs.py rename to src/source_collectors/auto_googler/DTOs.py diff --git a/source_collectors/auto_googler/GoogleSearcher.py b/src/source_collectors/auto_googler/GoogleSearcher.py similarity index 95% rename from source_collectors/auto_googler/GoogleSearcher.py rename to src/source_collectors/auto_googler/GoogleSearcher.py index fe52ea45..c7cf73b8 100644 --- a/source_collectors/auto_googler/GoogleSearcher.py +++ b/src/source_collectors/auto_googler/GoogleSearcher.py @@ -1,11 +1,9 @@ -import asyncio from typing import Union import aiohttp -from googleapiclient.discovery import build from googleapiclient.errors import HttpError -from source_collectors.auto_googler.DTOs import GoogleSearchQueryResultsInnerDTO +from src.source_collectors.auto_googler.DTOs import GoogleSearchQueryResultsInnerDTO class QuotaExceededError(Exception): diff --git a/source_collectors/auto_googler/README.md b/src/source_collectors/auto_googler/README.md similarity index 100% rename from source_collectors/auto_googler/README.md rename to src/source_collectors/auto_googler/README.md diff --git a/source_collectors/auto_googler/SearchConfig.py b/src/source_collectors/auto_googler/SearchConfig.py similarity index 100% rename from source_collectors/auto_googler/SearchConfig.py rename to src/source_collectors/auto_googler/SearchConfig.py diff --git a/source_collectors/ckan/__init__.py b/src/source_collectors/auto_googler/__init__.py similarity index 100% rename from source_collectors/ckan/__init__.py rename to src/source_collectors/auto_googler/__init__.py diff --git a/source_collectors/ckan/CKANAPIInterface.py b/src/source_collectors/ckan/CKANAPIInterface.py similarity index 100% rename from source_collectors/ckan/CKANAPIInterface.py rename to src/source_collectors/ckan/CKANAPIInterface.py diff --git a/source_collectors/ckan/CKANCollector.py b/src/source_collectors/ckan/CKANCollector.py similarity index 87% rename from source_collectors/ckan/CKANCollector.py rename to src/source_collectors/ckan/CKANCollector.py index 873a8593..8302634d 100644 --- a/source_collectors/ckan/CKANCollector.py +++ b/src/source_collectors/ckan/CKANCollector.py @@ -2,11 +2,11 @@ from collector_manager.AsyncCollectorBase import AsyncCollectorBase from collector_manager.enums import CollectorType -from core.preprocessors.CKANPreprocessor import CKANPreprocessor -from source_collectors.ckan.DTOs import CKANInputDTO -from source_collectors.ckan.ckan_scraper_toolkit import ckan_package_search, ckan_group_package_show, \ +from src.core.preprocessors.CKANPreprocessor import CKANPreprocessor +from src.source_collectors.ckan.DTOs import CKANInputDTO +from src.source_collectors.ckan.ckan_scraper_toolkit import ckan_package_search, ckan_group_package_show, \ ckan_package_search_from_organization -from source_collectors.ckan.scrape_ckan_data_portals import perform_search, get_flat_list, deduplicate_entries, \ +from src.source_collectors.ckan.scrape_ckan_data_portals import perform_search, get_flat_list, deduplicate_entries, \ get_collections, filter_result, parse_result from util.helper_functions import base_model_list_dump diff --git a/source_collectors/ckan/DTOs.py b/src/source_collectors/ckan/DTOs.py similarity index 100% rename from source_collectors/ckan/DTOs.py rename to src/source_collectors/ckan/DTOs.py diff --git a/source_collectors/ckan/README.md b/src/source_collectors/ckan/README.md similarity index 100% rename from source_collectors/ckan/README.md rename to src/source_collectors/ckan/README.md diff --git a/source_collectors/common_crawler/__init__.py b/src/source_collectors/ckan/__init__.py similarity index 100% rename from source_collectors/common_crawler/__init__.py rename to src/source_collectors/ckan/__init__.py diff --git a/source_collectors/ckan/ckan_scraper_toolkit.py b/src/source_collectors/ckan/ckan_scraper_toolkit.py similarity index 99% rename from source_collectors/ckan/ckan_scraper_toolkit.py rename to src/source_collectors/ckan/ckan_scraper_toolkit.py index 641dec2a..2dca5e51 100644 --- a/source_collectors/ckan/ckan_scraper_toolkit.py +++ b/src/source_collectors/ckan/ckan_scraper_toolkit.py @@ -10,7 +10,7 @@ import aiohttp from bs4 import BeautifulSoup, ResultSet, Tag -from source_collectors.ckan.CKANAPIInterface import CKANAPIInterface +from src.source_collectors.ckan.CKANAPIInterface import CKANAPIInterface @dataclass diff --git a/source_collectors/ckan/constants.py b/src/source_collectors/ckan/constants.py similarity index 100% rename from source_collectors/ckan/constants.py rename to src/source_collectors/ckan/constants.py diff --git a/source_collectors/ckan/scrape_ckan_data_portals.py b/src/source_collectors/ckan/scrape_ckan_data_portals.py similarity index 97% rename from source_collectors/ckan/scrape_ckan_data_portals.py rename to src/source_collectors/ckan/scrape_ckan_data_portals.py index 3a292b02..48c810f8 100644 --- a/source_collectors/ckan/scrape_ckan_data_portals.py +++ b/src/source_collectors/ckan/scrape_ckan_data_portals.py @@ -7,8 +7,8 @@ from from_root import from_root from tqdm import tqdm -from source_collectors.ckan.ckan_scraper_toolkit import Package, ckan_collection_search -from source_collectors.ckan.constants import CKAN_DATA_TYPES, CKAN_TYPE_CONVERSION_MAPPING +from src.source_collectors.ckan.ckan_scraper_toolkit import Package, ckan_collection_search +from src.source_collectors.ckan.constants import CKAN_DATA_TYPES, CKAN_TYPE_CONVERSION_MAPPING p = from_root(".pydocstyle").parent sys.path.insert(1, str(p)) diff --git a/source_collectors/ckan/search_terms.py b/src/source_collectors/ckan/search_terms.py similarity index 100% rename from source_collectors/ckan/search_terms.py rename to src/source_collectors/ckan/search_terms.py diff --git a/source_collectors/common_crawler/CommonCrawler.py b/src/source_collectors/common_crawler/CommonCrawler.py similarity index 98% rename from source_collectors/common_crawler/CommonCrawler.py rename to src/source_collectors/common_crawler/CommonCrawler.py index db683611..64649b77 100644 --- a/source_collectors/common_crawler/CommonCrawler.py +++ b/src/source_collectors/common_crawler/CommonCrawler.py @@ -1,4 +1,3 @@ -import asyncio import json import time from http import HTTPStatus @@ -7,7 +6,7 @@ import aiohttp -from source_collectors.common_crawler.utils import URLWithParameters +from src.source_collectors.common_crawler.utils import URLWithParameters async def async_make_request( search_url: 'URLWithParameters' diff --git a/source_collectors/common_crawler/CommonCrawlerCollector.py b/src/source_collectors/common_crawler/CommonCrawlerCollector.py similarity index 76% rename from source_collectors/common_crawler/CommonCrawlerCollector.py rename to src/source_collectors/common_crawler/CommonCrawlerCollector.py index eb28d545..e471db2c 100644 --- a/source_collectors/common_crawler/CommonCrawlerCollector.py +++ b/src/source_collectors/common_crawler/CommonCrawlerCollector.py @@ -1,8 +1,8 @@ from collector_manager.AsyncCollectorBase import AsyncCollectorBase from collector_manager.enums import CollectorType -from core.preprocessors.CommonCrawlerPreprocessor import CommonCrawlerPreprocessor -from source_collectors.common_crawler.CommonCrawler import CommonCrawler -from source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO +from src.core.preprocessors.CommonCrawlerPreprocessor import CommonCrawlerPreprocessor +from src.source_collectors.common_crawler.CommonCrawler import CommonCrawler +from src.source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO class CommonCrawlerCollector(AsyncCollectorBase): diff --git a/source_collectors/common_crawler/DTOs.py b/src/source_collectors/common_crawler/DTOs.py similarity index 100% rename from source_collectors/common_crawler/DTOs.py rename to src/source_collectors/common_crawler/DTOs.py diff --git a/source_collectors/helpers/__init__.py b/src/source_collectors/common_crawler/__init__.py similarity index 100% rename from source_collectors/helpers/__init__.py rename to src/source_collectors/common_crawler/__init__.py diff --git a/source_collectors/common_crawler/crawler.py b/src/source_collectors/common_crawler/crawler.py similarity index 100% rename from source_collectors/common_crawler/crawler.py rename to src/source_collectors/common_crawler/crawler.py diff --git a/source_collectors/common_crawler/utils.py b/src/source_collectors/common_crawler/utils.py similarity index 100% rename from source_collectors/common_crawler/utils.py rename to src/source_collectors/common_crawler/utils.py diff --git a/source_collectors/helpers/RequestManager.py b/src/source_collectors/helpers/RequestManager.py similarity index 100% rename from source_collectors/helpers/RequestManager.py rename to src/source_collectors/helpers/RequestManager.py diff --git a/source_collectors/muckrock/__init__.py b/src/source_collectors/helpers/__init__.py similarity index 100% rename from source_collectors/muckrock/__init__.py rename to src/source_collectors/helpers/__init__.py diff --git a/source_collectors/muckrock/.gitignore b/src/source_collectors/muckrock/.gitignore similarity index 100% rename from source_collectors/muckrock/.gitignore rename to src/source_collectors/muckrock/.gitignore diff --git a/source_collectors/muckrock/DTOs.py b/src/source_collectors/muckrock/DTOs.py similarity index 100% rename from source_collectors/muckrock/DTOs.py rename to src/source_collectors/muckrock/DTOs.py diff --git a/source_collectors/muckrock/MuckrockAPIInterface.py b/src/source_collectors/muckrock/MuckrockAPIInterface.py similarity index 100% rename from source_collectors/muckrock/MuckrockAPIInterface.py rename to src/source_collectors/muckrock/MuckrockAPIInterface.py diff --git a/source_collectors/muckrock/README.md b/src/source_collectors/muckrock/README.md similarity index 100% rename from source_collectors/muckrock/README.md rename to src/source_collectors/muckrock/README.md diff --git a/source_collectors/muckrock/classes/__init__.py b/src/source_collectors/muckrock/__init__.py similarity index 100% rename from source_collectors/muckrock/classes/__init__.py rename to src/source_collectors/muckrock/__init__.py diff --git a/source_collectors/muckrock/allegheny-county-towns.txt b/src/source_collectors/muckrock/allegheny-county-towns.txt similarity index 100% rename from source_collectors/muckrock/allegheny-county-towns.txt rename to src/source_collectors/muckrock/allegheny-county-towns.txt diff --git a/source_collectors/muckrock/classes/FOIASearcher.py b/src/source_collectors/muckrock/classes/FOIASearcher.py similarity index 96% rename from source_collectors/muckrock/classes/FOIASearcher.py rename to src/source_collectors/muckrock/classes/FOIASearcher.py index cb3af7e8..a6cde337 100644 --- a/source_collectors/muckrock/classes/FOIASearcher.py +++ b/src/source_collectors/muckrock/classes/FOIASearcher.py @@ -2,7 +2,7 @@ from tqdm import tqdm -from source_collectors.muckrock.classes.muckrock_fetchers import FOIAFetcher +from src.source_collectors.muckrock.classes.muckrock_fetchers import FOIAFetcher class SearchCompleteException(Exception): diff --git a/source_collectors/muckrock/classes/MuckrockCollector.py b/src/source_collectors/muckrock/classes/MuckrockCollector.py similarity index 85% rename from source_collectors/muckrock/classes/MuckrockCollector.py rename to src/source_collectors/muckrock/classes/MuckrockCollector.py index 0511a21d..38f6a424 100644 --- a/source_collectors/muckrock/classes/MuckrockCollector.py +++ b/src/source_collectors/muckrock/classes/MuckrockCollector.py @@ -2,17 +2,17 @@ from collector_manager.AsyncCollectorBase import AsyncCollectorBase from collector_manager.enums import CollectorType -from core.preprocessors.MuckrockPreprocessor import MuckrockPreprocessor -from source_collectors.muckrock.DTOs import MuckrockAllFOIARequestsCollectorInputDTO, \ +from src.core.preprocessors.MuckrockPreprocessor import MuckrockPreprocessor +from src.source_collectors.muckrock.DTOs import MuckrockAllFOIARequestsCollectorInputDTO, \ MuckrockCountySearchCollectorInputDTO, MuckrockSimpleSearchCollectorInputDTO -from source_collectors.muckrock.classes.FOIASearcher import FOIASearcher, SearchCompleteException -from source_collectors.muckrock.classes.fetch_requests.FOIALoopFetchRequest import FOIALoopFetchRequest -from source_collectors.muckrock.classes.fetch_requests.JurisdictionLoopFetchRequest import JurisdictionLoopFetchRequest -from source_collectors.muckrock.classes.muckrock_fetchers.FOIAFetcher import FOIAFetcher -from source_collectors.muckrock.classes.muckrock_fetchers.FOIALoopFetcher import FOIALoopFetcher -from source_collectors.muckrock.classes.muckrock_fetchers.JurisdictionGeneratorFetcher import \ +from src.source_collectors.muckrock.classes.FOIASearcher import FOIASearcher, SearchCompleteException +from src.source_collectors.muckrock.classes.fetch_requests.FOIALoopFetchRequest import FOIALoopFetchRequest +from src.source_collectors.muckrock.classes.fetch_requests.JurisdictionLoopFetchRequest import JurisdictionLoopFetchRequest +from src.source_collectors.muckrock.classes.muckrock_fetchers.FOIAFetcher import FOIAFetcher +from src.source_collectors.muckrock.classes.muckrock_fetchers.FOIALoopFetcher import FOIALoopFetcher +from src.source_collectors.muckrock.classes.muckrock_fetchers.JurisdictionGeneratorFetcher import \ JurisdictionGeneratorFetcher -from source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher import MuckrockNoMoreDataError +from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher import MuckrockNoMoreDataError class MuckrockSimpleSearchCollector(AsyncCollectorBase): diff --git a/source_collectors/muckrock/classes/exceptions/__init__.py b/src/source_collectors/muckrock/classes/__init__.py similarity index 100% rename from source_collectors/muckrock/classes/exceptions/__init__.py rename to src/source_collectors/muckrock/classes/__init__.py diff --git a/source_collectors/muckrock/classes/exceptions/RequestFailureException.py b/src/source_collectors/muckrock/classes/exceptions/RequestFailureException.py similarity index 100% rename from source_collectors/muckrock/classes/exceptions/RequestFailureException.py rename to src/source_collectors/muckrock/classes/exceptions/RequestFailureException.py diff --git a/source_collectors/muckrock/classes/fetch_requests/__init__.py b/src/source_collectors/muckrock/classes/exceptions/__init__.py similarity index 100% rename from source_collectors/muckrock/classes/fetch_requests/__init__.py rename to src/source_collectors/muckrock/classes/exceptions/__init__.py diff --git a/src/source_collectors/muckrock/classes/fetch_requests/FOIALoopFetchRequest.py b/src/source_collectors/muckrock/classes/fetch_requests/FOIALoopFetchRequest.py new file mode 100644 index 00000000..be008edf --- /dev/null +++ b/src/source_collectors/muckrock/classes/fetch_requests/FOIALoopFetchRequest.py @@ -0,0 +1,5 @@ +from src.source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest + + +class FOIALoopFetchRequest(FetchRequest): + jurisdiction: int diff --git a/source_collectors/muckrock/classes/fetch_requests/FetchRequestBase.py b/src/source_collectors/muckrock/classes/fetch_requests/FetchRequestBase.py similarity index 100% rename from source_collectors/muckrock/classes/fetch_requests/FetchRequestBase.py rename to src/source_collectors/muckrock/classes/fetch_requests/FetchRequestBase.py diff --git a/source_collectors/muckrock/classes/fetch_requests/JurisdictionLoopFetchRequest.py b/src/source_collectors/muckrock/classes/fetch_requests/JurisdictionLoopFetchRequest.py similarity index 52% rename from source_collectors/muckrock/classes/fetch_requests/JurisdictionLoopFetchRequest.py rename to src/source_collectors/muckrock/classes/fetch_requests/JurisdictionLoopFetchRequest.py index 5941fa4a..7adfbdd4 100644 --- a/source_collectors/muckrock/classes/fetch_requests/JurisdictionLoopFetchRequest.py +++ b/src/source_collectors/muckrock/classes/fetch_requests/JurisdictionLoopFetchRequest.py @@ -1,4 +1,4 @@ -from source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest +from src.source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest class JurisdictionLoopFetchRequest(FetchRequest): diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/__init__.py b/src/source_collectors/muckrock/classes/fetch_requests/__init__.py similarity index 100% rename from source_collectors/muckrock/classes/muckrock_fetchers/__init__.py rename to src/source_collectors/muckrock/classes/fetch_requests/__init__.py diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/AgencyFetcher.py b/src/source_collectors/muckrock/classes/muckrock_fetchers/AgencyFetcher.py similarity index 56% rename from source_collectors/muckrock/classes/muckrock_fetchers/AgencyFetcher.py rename to src/source_collectors/muckrock/classes/muckrock_fetchers/AgencyFetcher.py index e73180df..abb59c6d 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/AgencyFetcher.py +++ b/src/source_collectors/muckrock/classes/muckrock_fetchers/AgencyFetcher.py @@ -1,6 +1,6 @@ -from source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest -from source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher import MuckrockFetcher -from source_collectors.muckrock.constants import BASE_MUCKROCK_URL +from src.source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest +from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher import MuckrockFetcher +from src.source_collectors.muckrock.constants import BASE_MUCKROCK_URL class AgencyFetchRequest(FetchRequest): diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetchManager.py b/src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetchManager.py similarity index 74% rename from source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetchManager.py rename to src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetchManager.py index 0a405596..1b843efd 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetchManager.py +++ b/src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetchManager.py @@ -1,5 +1,5 @@ -from source_collectors.muckrock.classes.fetch_requests.FOIALoopFetchRequest import FOIALoopFetchRequest -from source_collectors.muckrock.constants import BASE_MUCKROCK_URL +from src.source_collectors.muckrock.classes.fetch_requests.FOIALoopFetchRequest import FOIALoopFetchRequest +from src.source_collectors.muckrock.constants import BASE_MUCKROCK_URL class FOIAFetchManager: diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetcher.py b/src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetcher.py similarity index 81% rename from source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetcher.py rename to src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetcher.py index 3a057864..5113665c 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetcher.py +++ b/src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetcher.py @@ -1,6 +1,6 @@ -from source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest -from source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher import MuckrockFetcher -from source_collectors.muckrock.constants import BASE_MUCKROCK_URL +from src.source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest +from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher import MuckrockFetcher +from src.source_collectors.muckrock.constants import BASE_MUCKROCK_URL FOIA_BASE_URL = f"{BASE_MUCKROCK_URL}/foia" diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/FOIAGeneratorFetcher.py b/src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAGeneratorFetcher.py similarity index 59% rename from source_collectors/muckrock/classes/muckrock_fetchers/FOIAGeneratorFetcher.py rename to src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAGeneratorFetcher.py index 8fc971c6..952ab03e 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/FOIAGeneratorFetcher.py +++ b/src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAGeneratorFetcher.py @@ -1,6 +1,6 @@ -from source_collectors.muckrock.classes.fetch_requests.FOIALoopFetchRequest import FOIALoopFetchRequest -from source_collectors.muckrock.classes.muckrock_fetchers.FOIAFetchManager import FOIAFetchManager -from source_collectors.muckrock.classes.muckrock_fetchers.MuckrockNextFetcher import MuckrockGeneratorFetcher +from src.source_collectors.muckrock.classes.fetch_requests.FOIALoopFetchRequest import FOIALoopFetchRequest +from src.source_collectors.muckrock.classes.muckrock_fetchers.FOIAFetchManager import FOIAFetchManager +from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockNextFetcher import MuckrockGeneratorFetcher class FOIAGeneratorFetcher(MuckrockGeneratorFetcher): diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/FOIALoopFetcher.py b/src/source_collectors/muckrock/classes/muckrock_fetchers/FOIALoopFetcher.py similarity index 65% rename from source_collectors/muckrock/classes/muckrock_fetchers/FOIALoopFetcher.py rename to src/source_collectors/muckrock/classes/muckrock_fetchers/FOIALoopFetcher.py index d1bed9e9..31ce7e1e 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/FOIALoopFetcher.py +++ b/src/source_collectors/muckrock/classes/muckrock_fetchers/FOIALoopFetcher.py @@ -1,8 +1,8 @@ from datasets import tqdm -from source_collectors.muckrock.classes.fetch_requests.FOIALoopFetchRequest import FOIALoopFetchRequest -from source_collectors.muckrock.classes.muckrock_fetchers.FOIAFetchManager import FOIAFetchManager -from source_collectors.muckrock.classes.muckrock_fetchers.MuckrockLoopFetcher import MuckrockLoopFetcher +from src.source_collectors.muckrock.classes.fetch_requests.FOIALoopFetchRequest import FOIALoopFetchRequest +from src.source_collectors.muckrock.classes.muckrock_fetchers.FOIAFetchManager import FOIAFetchManager +from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockLoopFetcher import MuckrockLoopFetcher class FOIALoopFetcher(MuckrockLoopFetcher): diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionByIDFetcher.py b/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionByIDFetcher.py similarity index 62% rename from source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionByIDFetcher.py rename to src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionByIDFetcher.py index 08db97dd..0f29b9d8 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionByIDFetcher.py +++ b/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionByIDFetcher.py @@ -1,6 +1,6 @@ -from source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest -from source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher import MuckrockFetcher -from source_collectors.muckrock.constants import BASE_MUCKROCK_URL +from src.source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest +from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher import MuckrockFetcher +from src.source_collectors.muckrock.constants import BASE_MUCKROCK_URL class JurisdictionByIDFetchRequest(FetchRequest): diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionFetchManager.py b/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionFetchManager.py similarity index 80% rename from source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionFetchManager.py rename to src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionFetchManager.py index f1145921..2b789461 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionFetchManager.py +++ b/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionFetchManager.py @@ -1,5 +1,5 @@ -from source_collectors.muckrock.classes.fetch_requests.JurisdictionLoopFetchRequest import JurisdictionLoopFetchRequest -from source_collectors.muckrock.constants import BASE_MUCKROCK_URL +from src.source_collectors.muckrock.classes.fetch_requests.JurisdictionLoopFetchRequest import JurisdictionLoopFetchRequest +from src.source_collectors.muckrock.constants import BASE_MUCKROCK_URL class JurisdictionFetchManager: diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionGeneratorFetcher.py b/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionGeneratorFetcher.py similarity index 57% rename from source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionGeneratorFetcher.py rename to src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionGeneratorFetcher.py index 4cc2343d..8463e90b 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionGeneratorFetcher.py +++ b/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionGeneratorFetcher.py @@ -1,6 +1,6 @@ -from source_collectors.muckrock.classes.fetch_requests.JurisdictionLoopFetchRequest import JurisdictionLoopFetchRequest -from source_collectors.muckrock.classes.muckrock_fetchers.JurisdictionFetchManager import JurisdictionFetchManager -from source_collectors.muckrock.classes.muckrock_fetchers.MuckrockNextFetcher import MuckrockGeneratorFetcher +from src.source_collectors.muckrock.classes.fetch_requests.JurisdictionLoopFetchRequest import JurisdictionLoopFetchRequest +from src.source_collectors.muckrock.classes.muckrock_fetchers.JurisdictionFetchManager import JurisdictionFetchManager +from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockNextFetcher import MuckrockGeneratorFetcher class JurisdictionGeneratorFetcher(MuckrockGeneratorFetcher): diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionLoopFetcher.py b/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionLoopFetcher.py similarity index 77% rename from source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionLoopFetcher.py rename to src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionLoopFetcher.py index 3cf05359..9cd94d85 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionLoopFetcher.py +++ b/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionLoopFetcher.py @@ -1,8 +1,8 @@ from tqdm import tqdm -from source_collectors.muckrock.classes.fetch_requests.JurisdictionLoopFetchRequest import JurisdictionLoopFetchRequest -from source_collectors.muckrock.classes.muckrock_fetchers.JurisdictionFetchManager import JurisdictionFetchManager -from source_collectors.muckrock.classes.muckrock_fetchers.MuckrockLoopFetcher import MuckrockLoopFetcher +from src.source_collectors.muckrock.classes.fetch_requests.JurisdictionLoopFetchRequest import JurisdictionLoopFetchRequest +from src.source_collectors.muckrock.classes.muckrock_fetchers.JurisdictionFetchManager import JurisdictionFetchManager +from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockLoopFetcher import MuckrockLoopFetcher class JurisdictionLoopFetcher(MuckrockLoopFetcher): diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py b/src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py similarity index 91% rename from source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py rename to src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py index c1a6eecb..57ef54bc 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py +++ b/src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py @@ -1,11 +1,10 @@ import abc -import asyncio from abc import ABC import requests import aiohttp -from source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest +from src.source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest class MuckrockNoMoreDataError(Exception): diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py b/src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py similarity index 81% rename from source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py rename to src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py index 67253034..e8416a92 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py +++ b/src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py @@ -1,11 +1,10 @@ -import asyncio from abc import ABC, abstractmethod import aiohttp import requests -from source_collectors.muckrock.classes.exceptions.RequestFailureException import RequestFailureException -from source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest +from src.source_collectors.muckrock.classes.exceptions.RequestFailureException import RequestFailureException +from src.source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest class MuckrockIterFetcherBase(ABC): diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockLoopFetcher.py b/src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockLoopFetcher.py similarity index 76% rename from source_collectors/muckrock/classes/muckrock_fetchers/MuckrockLoopFetcher.py rename to src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockLoopFetcher.py index 2e4814a5..1573572d 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockLoopFetcher.py +++ b/src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockLoopFetcher.py @@ -1,8 +1,8 @@ from abc import abstractmethod from time import sleep -from source_collectors.muckrock.classes.exceptions.RequestFailureException import RequestFailureException -from source_collectors.muckrock.classes.muckrock_fetchers.MuckrockIterFetcherBase import MuckrockIterFetcherBase +from src.source_collectors.muckrock.classes.exceptions.RequestFailureException import RequestFailureException +from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockIterFetcherBase import MuckrockIterFetcherBase class MuckrockLoopFetcher(MuckrockIterFetcherBase): diff --git a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockNextFetcher.py b/src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockNextFetcher.py similarity index 77% rename from source_collectors/muckrock/classes/muckrock_fetchers/MuckrockNextFetcher.py rename to src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockNextFetcher.py index 889e8446..da4c3a8b 100644 --- a/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockNextFetcher.py +++ b/src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockNextFetcher.py @@ -1,5 +1,5 @@ -from source_collectors.muckrock.classes.exceptions.RequestFailureException import RequestFailureException -from source_collectors.muckrock.classes.muckrock_fetchers.MuckrockIterFetcherBase import MuckrockIterFetcherBase +from src.source_collectors.muckrock.classes.exceptions.RequestFailureException import RequestFailureException +from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockIterFetcherBase import MuckrockIterFetcherBase class MuckrockGeneratorFetcher(MuckrockIterFetcherBase): diff --git a/src/source_collectors/muckrock/classes/muckrock_fetchers/__init__.py b/src/source_collectors/muckrock/classes/muckrock_fetchers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/source_collectors/muckrock/constants.py b/src/source_collectors/muckrock/constants.py similarity index 100% rename from source_collectors/muckrock/constants.py rename to src/source_collectors/muckrock/constants.py diff --git a/source_collectors/muckrock/generate_detailed_muckrock_csv.py b/src/source_collectors/muckrock/generate_detailed_muckrock_csv.py similarity index 96% rename from source_collectors/muckrock/generate_detailed_muckrock_csv.py rename to src/source_collectors/muckrock/generate_detailed_muckrock_csv.py index 94e0034f..d654d1df 100644 --- a/source_collectors/muckrock/generate_detailed_muckrock_csv.py +++ b/src/source_collectors/muckrock/generate_detailed_muckrock_csv.py @@ -12,8 +12,8 @@ from pydantic import BaseModel -from source_collectors.muckrock.classes.muckrock_fetchers import AgencyFetcher -from source_collectors.muckrock.classes.muckrock_fetchers.JurisdictionByIDFetcher import JurisdictionByIDFetcher +from src.source_collectors.muckrock.classes.muckrock_fetchers import AgencyFetcher +from src.source_collectors.muckrock.classes.muckrock_fetchers.JurisdictionByIDFetcher import JurisdictionByIDFetcher from utils import format_filename_json_to_csv, load_json_file diff --git a/source_collectors/muckrock/schemas.py b/src/source_collectors/muckrock/schemas.py similarity index 100% rename from source_collectors/muckrock/schemas.py rename to src/source_collectors/muckrock/schemas.py diff --git a/source_collectors/muckrock/utils.py b/src/source_collectors/muckrock/utils.py similarity index 100% rename from source_collectors/muckrock/utils.py rename to src/source_collectors/muckrock/utils.py diff --git a/tests/alembic/conftest.py b/tests/alembic/conftest.py index 42a04a6b..83e55c97 100644 --- a/tests/alembic/conftest.py +++ b/tests/alembic/conftest.py @@ -3,7 +3,7 @@ from sqlalchemy import create_engine, inspect, MetaData from sqlalchemy.orm import scoped_session, sessionmaker -from db.helper_functions import get_postgres_connection_string +from src.db.helper_functions import get_postgres_connection_string from tests.helpers.AlembicRunner import AlembicRunner diff --git a/tests/automated/integration/api/conftest.py b/tests/automated/integration/api/conftest.py index c709d202..de1574ab 100644 --- a/tests/automated/integration/api/conftest.py +++ b/tests/automated/integration/api/conftest.py @@ -1,19 +1,19 @@ import asyncio from dataclasses import dataclass from typing import Generator -from unittest.mock import MagicMock, AsyncMock +from unittest.mock import AsyncMock import pytest import pytest_asyncio from starlette.testclient import TestClient from api.main import app -from core.AsyncCore import AsyncCore +from src.core.AsyncCore import AsyncCore from api.routes.review import requires_final_review_permission -from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse -from core.SourceCollectorCore import SourceCollectorCore -from core.enums import BatchStatus -from security_manager.SecurityManager import get_access_info, AccessInfo, Permissions, require_permission +from src.core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse +from src.core.SourceCollectorCore import SourceCollectorCore +from src.core.enums import BatchStatus +from src.security_manager.SecurityManager import get_access_info, AccessInfo, Permissions from tests.helpers.DBDataCreator import DBDataCreator from tests.automated.integration.api.helpers.RequestValidator import RequestValidator diff --git a/tests/automated/integration/api/helpers/RequestValidator.py b/tests/automated/integration/api/helpers/RequestValidator.py index 5fabd69b..a3ff5898 100644 --- a/tests/automated/integration/api/helpers/RequestValidator.py +++ b/tests/automated/integration/api/helpers/RequestValidator.py @@ -5,39 +5,39 @@ from pydantic import BaseModel from starlette.testclient import TestClient -from db.DTOs.BatchInfo import BatchInfo -from db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo -from db.DTOs.TaskInfo import TaskInfo -from db.enums import TaskType +from src.db.DTOs.BatchInfo import BatchInfo +from src.db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo +from src.db.DTOs.TaskInfo import TaskInfo +from src.db.enums import TaskType from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.enums import CollectorType -from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewBaseInfo, FinalReviewRejectionInfo -from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse -from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse -from core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse -from core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO -from core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO -from core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO -from core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO -from core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO -from core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO -from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo -from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo -from core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ +from src.core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo +from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewRejectionInfo +from src.core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse +from src.core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse +from src.core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse +from src.core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO +from src.core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO +from src.core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO +from src.core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO +from src.core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO +from src.core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO +from src.core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo +from src.core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo +from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ URLAgencyAnnotationPostInfo -from core.DTOs.GetNextURLForAllAnnotationResponse import GetNextURLForAllAnnotationResponse -from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse -from core.DTOs.GetTasksResponse import GetTasksResponse -from core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse -from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo -from core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO -from core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO -from core.DTOs.MessageResponse import MessageResponse -from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo -from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo -from core.DTOs.SearchURLResponse import SearchURLResponse -from core.enums import BatchStatus +from src.core.DTOs.GetNextURLForAllAnnotationResponse import GetNextURLForAllAnnotationResponse +from src.core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse +from src.core.DTOs.GetTasksResponse import GetTasksResponse +from src.core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse +from src.core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo +from src.core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO +from src.core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO +from src.core.DTOs.MessageResponse import MessageResponse +from src.core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo +from src.core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo +from src.core.DTOs.SearchURLResponse import SearchURLResponse +from src.core.enums import BatchStatus from util.helper_functions import update_if_not_none diff --git a/tests/automated/integration/api/test_annotate.py b/tests/automated/integration/api/test_annotate.py index a3344b68..f4e43e13 100644 --- a/tests/automated/integration/api/test_annotate.py +++ b/tests/automated/integration/api/test_annotate.py @@ -3,21 +3,21 @@ import pytest from fastapi import HTTPException -from db.DTOs.InsertURLsInfo import InsertURLsInfo -from db.DTOs.URLMapping import URLMapping -from db.models import UserUrlAgencySuggestion, UserRelevantSuggestion, UserRecordTypeSuggestion -from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo -from core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo -from core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo -from core.DTOs.GetNextURLForAgencyAnnotationResponse import URLAgencyAnnotationPostInfo -from core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo -from core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo -from core.classes.ErrorManager import ErrorTypes -from core.enums import RecordType, SuggestionType, SuggestedStatus -from core.exceptions import FailedValidationException +from src.db.DTOs.InsertURLsInfo import InsertURLsInfo +from src.db.DTOs.URLMapping import URLMapping +from src.db.models import UserUrlAgencySuggestion, UserRelevantSuggestion, UserRecordTypeSuggestion +from src.core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo +from src.core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo +from src.core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo +from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import URLAgencyAnnotationPostInfo +from src.core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo +from src.core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo +from src.core.classes.ErrorManager import ErrorTypes +from src.core.enums import RecordType, SuggestionType, SuggestedStatus +from src.core.exceptions import FailedValidationException from tests.helpers.complex_test_data_functions import AnnotateAgencySetupInfo, setup_for_annotate_agency, \ setup_for_get_next_url_for_final_review -from html_tag_collector.DataClassTags import ResponseHTMLInfo +from src.html_tag_collector import ResponseHTMLInfo from tests.helpers.DBDataCreator import BatchURLCreationInfo from tests.automated.integration.api.conftest import MOCK_USER_ID diff --git a/tests/automated/integration/api/test_batch.py b/tests/automated/integration/api/test_batch.py index 2f7e2ebb..3a3c3178 100644 --- a/tests/automated/integration/api/test_batch.py +++ b/tests/automated/integration/api/test_batch.py @@ -1,13 +1,10 @@ -import asyncio -import time - import pytest -from db.DTOs.BatchInfo import BatchInfo -from db.DTOs.InsertURLsInfo import InsertURLsInfo +from src.db.DTOs.BatchInfo import BatchInfo +from src.db.DTOs.InsertURLsInfo import InsertURLsInfo from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.enums import CollectorType, URLStatus -from core.enums import BatchStatus +from src.core.enums import BatchStatus @pytest.mark.asyncio async def test_get_batch_status_pending_url_filter(api_test_helper): diff --git a/tests/automated/integration/api/test_duplicates.py b/tests/automated/integration/api/test_duplicates.py index 654a9c65..4d500a48 100644 --- a/tests/automated/integration/api/test_duplicates.py +++ b/tests/automated/integration/api/test_duplicates.py @@ -1,9 +1,6 @@ -import asyncio -import time - import pytest -from db.DTOs.BatchInfo import BatchInfo +from src.db.DTOs.BatchInfo import BatchInfo from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from tests.automated.integration.api.conftest import disable_task_trigger diff --git a/tests/automated/integration/api/test_example_collector.py b/tests/automated/integration/api/test_example_collector.py index 83d1ad6d..c72c04cc 100644 --- a/tests/automated/integration/api/test_example_collector.py +++ b/tests/automated/integration/api/test_example_collector.py @@ -3,16 +3,16 @@ import pytest -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DTOs.BatchInfo import BatchInfo +from src.db import AsyncDatabaseClient +from src.db.DTOs.BatchInfo import BatchInfo from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.ExampleCollector import ExampleCollector from collector_manager.enums import CollectorType -from core.AsyncCoreLogger import AsyncCoreLogger -from core.DTOs.BatchStatusInfo import BatchStatusInfo -from core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse -from core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse -from core.enums import BatchStatus +from src.core.AsyncCoreLogger import AsyncCoreLogger +from src.core.DTOs.BatchStatusInfo import BatchStatusInfo +from src.core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse +from src.core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse +from src.core.enums import BatchStatus from tests.helpers.patch_functions import block_sleep from tests.automated.integration.api.conftest import disable_task_trigger diff --git a/tests/automated/integration/api/test_manual_batch.py b/tests/automated/integration/api/test_manual_batch.py index 1c0a2ecc..d958fa1c 100644 --- a/tests/automated/integration/api/test_manual_batch.py +++ b/tests/automated/integration/api/test_manual_batch.py @@ -1,10 +1,10 @@ import pytest -from db.models import Batch, URL, URLOptionalDataSourceMetadata +from src.db.models import Batch, URL, URLOptionalDataSourceMetadata from collector_manager.enums import CollectorType -from core.DTOs.ManualBatchInputDTO import ManualBatchInnerInputDTO, ManualBatchInputDTO -from core.enums import RecordType +from src.core.DTOs.ManualBatchInputDTO import ManualBatchInnerInputDTO, ManualBatchInputDTO +from src.core.enums import RecordType @pytest.mark.asyncio diff --git a/tests/automated/integration/api/test_metrics.py b/tests/automated/integration/api/test_metrics.py index 7d0fadfc..cb37e2e9 100644 --- a/tests/automated/integration/api/test_metrics.py +++ b/tests/automated/integration/api/test_metrics.py @@ -2,7 +2,7 @@ import pytest from collector_manager.enums import URLStatus, CollectorType -from core.enums import BatchStatus, RecordType, SuggestedStatus +from src.core.enums import BatchStatus, RecordType, SuggestedStatus from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters, \ AnnotationInfo diff --git a/tests/automated/integration/api/test_review.py b/tests/automated/integration/api/test_review.py index a034b740..16905ca6 100644 --- a/tests/automated/integration/api/test_review.py +++ b/tests/automated/integration/api/test_review.py @@ -1,12 +1,12 @@ import pytest -from db.constants import PLACEHOLDER_AGENCY_NAME -from db.models import URL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency +from src.db.constants import PLACEHOLDER_AGENCY_NAME +from src.db.models import URL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency from collector_manager.enums import URLStatus -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewBaseInfo, RejectionReason, \ +from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason, \ FinalReviewRejectionInfo -from core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse -from core.enums import RecordType, SuggestedStatus +from src.core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse +from src.core.enums import RecordType, SuggestedStatus from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review diff --git a/tests/automated/integration/api/test_search.py b/tests/automated/integration/api/test_search.py index 917690fc..3252f144 100644 --- a/tests/automated/integration/api/test_search.py +++ b/tests/automated/integration/api/test_search.py @@ -1,6 +1,6 @@ import pytest -from core.DTOs.SearchURLResponse import SearchURLResponse +from src.core.DTOs.SearchURLResponse import SearchURLResponse @pytest.mark.asyncio diff --git a/tests/automated/integration/api/test_task.py b/tests/automated/integration/api/test_task.py index c13f97f9..21e662f1 100644 --- a/tests/automated/integration/api/test_task.py +++ b/tests/automated/integration/api/test_task.py @@ -1,6 +1,6 @@ import pytest -from db.enums import TaskType +from src.db.enums import TaskType from tests.automated.integration.api.conftest import APITestHelper diff --git a/tests/automated/integration/api/test_url.py b/tests/automated/integration/api/test_url.py index 9068af5e..0ec2e836 100644 --- a/tests/automated/integration/api/test_url.py +++ b/tests/automated/integration/api/test_url.py @@ -1,7 +1,7 @@ import pytest -from db.DTOs.InsertURLsInfo import InsertURLsInfo -from core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo +from src.db.DTOs.InsertURLsInfo import InsertURLsInfo +from src.core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo @pytest.mark.asyncio diff --git a/tests/automated/integration/collector_db/test_database_structure.py b/tests/automated/integration/collector_db/test_database_structure.py index 88b186ad..441835fb 100644 --- a/tests/automated/integration/collector_db/test_database_structure.py +++ b/tests/automated/integration/collector_db/test_database_structure.py @@ -14,16 +14,16 @@ import sqlalchemy as sa from sqlalchemy import create_engine from sqlalchemy.dialects import postgresql -from sqlalchemy.exc import DataError, DBAPIError +from sqlalchemy.exc import DataError -from db.DTOs.InsertURLsInfo import InsertURLsInfo -from db.enums import URLHTMLContentType -from db.helper_functions import get_postgres_connection_string -from db.models import Base, Agency +from src.db.DTOs.InsertURLsInfo import InsertURLsInfo +from src.db.enums import URLHTMLContentType +from src.db.helper_functions import get_postgres_connection_string +from src.db.models import Base, Agency from collector_manager.enums import CollectorType, URLStatus -from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from core.enums import BatchStatus, SuggestionType -from tests.helpers.DBDataCreator import DBDataCreator, BatchURLCreationInfo +from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.core.enums import BatchStatus, SuggestionType +from tests.helpers.DBDataCreator import DBDataCreator from util.helper_functions import get_enum_values SATypes: TypeAlias = sa.Integer or sa.String or postgresql.ENUM or sa.TIMESTAMP or sa.Text diff --git a/tests/automated/integration/collector_db/test_db_client.py b/tests/automated/integration/collector_db/test_db_client.py index 644bd500..2b521914 100644 --- a/tests/automated/integration/collector_db/test_db_client.py +++ b/tests/automated/integration/collector_db/test_db_client.py @@ -3,17 +3,17 @@ import pytest from fastapi import HTTPException -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DTOs.BatchInfo import BatchInfo -from db.DTOs.LogInfo import LogInfo -from db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from db.DTOs.URLInfo import URLInfo -from db.DTOs.URLMapping import URLMapping -from db.constants import PLACEHOLDER_AGENCY_NAME -from db.models import URL, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency +from src.db import AsyncDatabaseClient +from src.db.DTOs.BatchInfo import BatchInfo +from src.db.DTOs.LogInfo import LogInfo +from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from src.db.DTOs import URLInfo +from src.db.DTOs.URLMapping import URLMapping +from src.db.constants import PLACEHOLDER_AGENCY_NAME +from src.db.models import URL, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency from collector_manager.enums import URLStatus -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo -from core.enums import BatchStatus, RecordType, SuggestionType, SuggestedStatus +from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo +from src.core.enums import BatchStatus, RecordType, SuggestionType, SuggestedStatus from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation, setup_for_annotate_agency from tests.helpers.DBDataCreator import DBDataCreator from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review diff --git a/tests/automated/integration/conftest.py b/tests/automated/integration/conftest.py index 3912f3e8..6c224de2 100644 --- a/tests/automated/integration/conftest.py +++ b/tests/automated/integration/conftest.py @@ -2,11 +2,11 @@ import pytest -from db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db import AsyncDatabaseClient from collector_manager.AsyncCollectorManager import AsyncCollectorManager -from core.AsyncCore import AsyncCore -from core.AsyncCoreLogger import AsyncCoreLogger -from core.SourceCollectorCore import SourceCollectorCore +from src.core.AsyncCore import AsyncCore +from src.core.AsyncCoreLogger import AsyncCoreLogger +from src.core.SourceCollectorCore import SourceCollectorCore @pytest.fixture diff --git a/tests/automated/integration/core/test_async_core.py b/tests/automated/integration/core/test_async_core.py index 7fa3d757..fc0e1b7f 100644 --- a/tests/automated/integration/core/test_async_core.py +++ b/tests/automated/integration/core/test_async_core.py @@ -1,15 +1,15 @@ import types -from unittest.mock import MagicMock, AsyncMock, call +from unittest.mock import AsyncMock, call import pytest -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.enums import TaskType -from db.models import Task -from core.AsyncCore import AsyncCore -from core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome -from core.TaskManager import TaskManager -from core.enums import BatchStatus +from src.db import AsyncDatabaseClient +from src.db.enums import TaskType +from src.db.models import Task +from src.core.AsyncCore import AsyncCore +from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome +from src.core.TaskManager import TaskManager +from src.core.enums import BatchStatus from tests.helpers.DBDataCreator import DBDataCreator def setup_async_core(adb_client: AsyncDatabaseClient): diff --git a/tests/automated/integration/core/test_example_collector_lifecycle.py b/tests/automated/integration/core/test_example_collector_lifecycle.py index f094e5b7..4efb2f21 100644 --- a/tests/automated/integration/core/test_example_collector_lifecycle.py +++ b/tests/automated/integration/core/test_example_collector_lifecycle.py @@ -2,13 +2,13 @@ import pytest -from db.DTOs.BatchInfo import BatchInfo +from src.db.DTOs.BatchInfo import BatchInfo from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.enums import CollectorType, URLStatus -from core.AsyncCore import AsyncCore -from core.DTOs.CollectorStartInfo import CollectorStartInfo -from core.SourceCollectorCore import SourceCollectorCore -from core.enums import BatchStatus +from src.core.AsyncCore import AsyncCore +from src.core.DTOs.CollectorStartInfo import CollectorStartInfo +from src.core.SourceCollectorCore import SourceCollectorCore +from src.core.enums import BatchStatus from tests.helpers.patch_functions import block_sleep diff --git a/tests/automated/integration/html_tag_collector/test_root_url_cache.py b/tests/automated/integration/html_tag_collector/test_root_url_cache.py index 206347e3..c552c7f7 100644 --- a/tests/automated/integration/html_tag_collector/test_root_url_cache.py +++ b/tests/automated/integration/html_tag_collector/test_root_url_cache.py @@ -1,6 +1,6 @@ import pytest -from html_tag_collector.RootURLCache import RootURLCacheResponseInfo, RootURLCache +from src.html_tag_collector import RootURLCacheResponseInfo, RootURLCache async def mock_get_request(url: str) -> RootURLCacheResponseInfo: diff --git a/tests/automated/integration/security_manager/test_security_manager.py b/tests/automated/integration/security_manager/test_security_manager.py index eb7e8506..1d046162 100644 --- a/tests/automated/integration/security_manager/test_security_manager.py +++ b/tests/automated/integration/security_manager/test_security_manager.py @@ -3,7 +3,7 @@ from starlette.testclient import TestClient from api.main import app -from security_manager.SecurityManager import Permissions, ALGORITHM +from src.security_manager.SecurityManager import Permissions, ALGORITHM PATCH_ROOT = "security_manager.SecurityManager" diff --git a/tests/automated/integration/tasks/conftest.py b/tests/automated/integration/tasks/conftest.py index a4136b20..42d5b29c 100644 --- a/tests/automated/integration/tasks/conftest.py +++ b/tests/automated/integration/tasks/conftest.py @@ -3,7 +3,7 @@ import pytest from pdap_access_manager import AccessManager -from pdap_api_client.PDAPClient import PDAPClient +from src.pdap_api_client.PDAPClient import PDAPClient @pytest.fixture diff --git a/tests/automated/integration/tasks/test_agency_preannotation_task.py b/tests/automated/integration/tasks/test_agency_preannotation_task.py index c0de5c52..0656141b 100644 --- a/tests/automated/integration/tasks/test_agency_preannotation_task.py +++ b/tests/automated/integration/tasks/test_agency_preannotation_task.py @@ -6,22 +6,22 @@ from aiohttp import ClientSession from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters -from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponseType, AgencyLookupResponse -from db.models import Agency, AutomatedUrlAgencySuggestion +from src.source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponseType, AgencyLookupResponse +from src.db.models import Agency, AutomatedUrlAgencySuggestion from collector_manager.enums import CollectorType, URLStatus -from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from core.classes.task_operators.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator -from core.classes.subtasks.AutoGooglerAgencyIdentificationSubtask import AutoGooglerAgencyIdentificationSubtask -from core.classes.subtasks.CKANAgencyIdentificationSubtask import CKANAgencyIdentificationSubtask -from core.classes.subtasks.CommonCrawlerAgencyIdentificationSubtask import CommonCrawlerAgencyIdentificationSubtask -from core.classes.subtasks.MuckrockAgencyIdentificationSubtask import MuckrockAgencyIdentificationSubtask -from core.enums import SuggestionType +from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome +from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.core.classes.task_operators.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator +from src.core.classes.subtasks.AutoGooglerAgencyIdentificationSubtask import AutoGooglerAgencyIdentificationSubtask +from src.core.classes.subtasks.CKANAgencyIdentificationSubtask import CKANAgencyIdentificationSubtask +from src.core.classes.subtasks.CommonCrawlerAgencyIdentificationSubtask import CommonCrawlerAgencyIdentificationSubtask +from src.core.classes.subtasks.MuckrockAgencyIdentificationSubtask import MuckrockAgencyIdentificationSubtask +from src.core.enums import SuggestionType from pdap_access_manager import AccessManager -from pdap_api_client.DTOs import MatchAgencyResponse, MatchAgencyInfo -from pdap_api_client.PDAPClient import PDAPClient -from pdap_api_client.enums import MatchAgencyResponseStatus -from tests.helpers.DBDataCreator import DBDataCreator, BatchURLCreationInfo, BatchURLCreationInfoV2 +from src.pdap_api_client.DTOs import MatchAgencyResponse, MatchAgencyInfo +from src.pdap_api_client.PDAPClient import PDAPClient +from src.pdap_api_client import MatchAgencyResponseStatus +from tests.helpers.DBDataCreator import DBDataCreator, BatchURLCreationInfoV2 sample_agency_suggestions = [ URLAgencySuggestionInfo( diff --git a/tests/automated/integration/tasks/test_example_task.py b/tests/automated/integration/tasks/test_example_task.py index c0515103..7f5d5e73 100644 --- a/tests/automated/integration/tasks/test_example_task.py +++ b/tests/automated/integration/tasks/test_example_task.py @@ -2,9 +2,9 @@ import pytest -from db.enums import TaskType -from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from core.classes.task_operators.TaskOperatorBase import TaskOperatorBase +from src.db.enums import TaskType +from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome +from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase from tests.helpers.DBDataCreator import DBDataCreator class ExampleTaskOperator(TaskOperatorBase): diff --git a/tests/automated/integration/tasks/test_submit_approved_url_task.py b/tests/automated/integration/tasks/test_submit_approved_url_task.py index d5453005..99642768 100644 --- a/tests/automated/integration/tasks/test_submit_approved_url_task.py +++ b/tests/automated/integration/tasks/test_submit_approved_url_task.py @@ -1,19 +1,19 @@ from http import HTTPStatus -from unittest.mock import MagicMock, AsyncMock +from unittest.mock import AsyncMock import pytest from deepdiff import DeepDiff -from db.enums import TaskType -from db.models import URL, URLErrorInfo, URLDataSource +from src.db.enums import TaskType +from src.db.models import URL, URLErrorInfo, URLDataSource from collector_manager.enums import URLStatus -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo -from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from core.classes.task_operators.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator -from core.enums import RecordType, SubmitResponseStatus +from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo +from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome +from src.core.classes.task_operators.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator +from src.core.enums import RecordType, SubmitResponseStatus from tests.helpers.DBDataCreator import BatchURLCreationInfo, DBDataCreator from pdap_access_manager import RequestInfo, RequestType, ResponseInfo, DataSourcesNamespaces -from pdap_api_client.PDAPClient import PDAPClient +from src.pdap_api_client.PDAPClient import PDAPClient def mock_make_request(pdap_client: PDAPClient, urls: list[str]): diff --git a/tests/automated/integration/tasks/test_url_404_probe.py b/tests/automated/integration/tasks/test_url_404_probe.py index a897a59e..a141ec97 100644 --- a/tests/automated/integration/tasks/test_url_404_probe.py +++ b/tests/automated/integration/tasks/test_url_404_probe.py @@ -5,11 +5,11 @@ import pytest from aiohttp import ClientResponseError, RequestInfo -from db.models import URLProbedFor404, URL +from src.db.models import URLProbedFor404, URL from collector_manager.enums import URLStatus -from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from core.classes.task_operators.URL404ProbeTaskOperator import URL404ProbeTaskOperator -from html_tag_collector.URLRequestInterface import URLResponseInfo, URLRequestInterface +from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome +from src.core.classes.task_operators.URL404ProbeTaskOperator import URL404ProbeTaskOperator +from src.html_tag_collector.URLRequestInterface import URLResponseInfo, URLRequestInterface from tests.helpers.DBDataCreator import DBDataCreator from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters diff --git a/tests/automated/integration/tasks/test_url_duplicate_task.py b/tests/automated/integration/tasks/test_url_duplicate_task.py index 0987a2f4..2c8a80a5 100644 --- a/tests/automated/integration/tasks/test_url_duplicate_task.py +++ b/tests/automated/integration/tasks/test_url_duplicate_task.py @@ -3,15 +3,15 @@ import pytest -from db.DTOs.URLMapping import URLMapping -from db.models import URL, URLCheckedForDuplicate +from src.db.DTOs.URLMapping import URLMapping +from src.db.models import URL, URLCheckedForDuplicate from collector_manager.enums import URLStatus -from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from core.classes.task_operators.URLDuplicateTaskOperator import URLDuplicateTaskOperator +from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome +from src.core.classes.task_operators.URLDuplicateTaskOperator import URLDuplicateTaskOperator from tests.helpers.DBDataCreator import DBDataCreator from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters from pdap_access_manager import ResponseInfo -from pdap_api_client.PDAPClient import PDAPClient +from src.pdap_api_client.PDAPClient import PDAPClient @pytest.mark.asyncio diff --git a/tests/automated/integration/tasks/test_url_html_task.py b/tests/automated/integration/tasks/test_url_html_task.py index 7926b26b..6e521a4b 100644 --- a/tests/automated/integration/tasks/test_url_html_task.py +++ b/tests/automated/integration/tasks/test_url_html_task.py @@ -3,18 +3,18 @@ from typing import Optional import pytest -from aiohttp import ClientError, ClientResponseError, RequestInfo +from aiohttp import ClientResponseError, RequestInfo -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.enums import TaskType +from src.db import AsyncDatabaseClient +from src.db.enums import TaskType from collector_manager.enums import URLStatus -from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator +from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome +from src.core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator from tests.helpers.DBDataCreator import DBDataCreator -from html_tag_collector.DataClassTags import ResponseHTMLInfo -from html_tag_collector.ResponseParser import HTMLResponseParser -from html_tag_collector.RootURLCache import RootURLCache -from html_tag_collector.URLRequestInterface import URLRequestInterface, URLResponseInfo +from src.html_tag_collector import ResponseHTMLInfo +from src.html_tag_collector.ResponseParser import HTMLResponseParser +from src.html_tag_collector import RootURLCache +from src.html_tag_collector.URLRequestInterface import URLRequestInterface, URLResponseInfo @pytest.mark.asyncio diff --git a/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py b/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py index 2b63c33c..b6094d5f 100644 --- a/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py +++ b/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py @@ -2,10 +2,10 @@ import pytest -from db.models import URL, URLOptionalDataSourceMetadata +from src.db.models import URL, URLOptionalDataSourceMetadata from collector_manager.enums import CollectorType -from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from core.classes.task_operators.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator +from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome +from src.core.classes.task_operators.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator from tests.helpers.DBDataCreator import DBDataCreator diff --git a/tests/automated/integration/tasks/test_url_record_type_task.py b/tests/automated/integration/tasks/test_url_record_type_task.py index 1f26812a..ab50ae6f 100644 --- a/tests/automated/integration/tasks/test_url_record_type_task.py +++ b/tests/automated/integration/tasks/test_url_record_type_task.py @@ -2,13 +2,13 @@ import pytest -from db.enums import TaskType -from db.models import AutoRecordTypeSuggestion -from core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from core.classes.task_operators.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator -from core.enums import RecordType +from src.db.enums import TaskType +from src.db.models import AutoRecordTypeSuggestion +from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome +from src.core.classes.task_operators.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator +from src.core.enums import RecordType from tests.helpers.DBDataCreator import DBDataCreator -from llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier +from src.llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier @pytest.mark.asyncio async def test_url_record_type_task(db_data_creator: DBDataCreator): diff --git a/tests/automated/unit/core/test_core_logger.py b/tests/automated/unit/core/test_core_logger.py index f60f989c..b092bd0e 100644 --- a/tests/automated/unit/core/test_core_logger.py +++ b/tests/automated/unit/core/test_core_logger.py @@ -3,8 +3,8 @@ import pytest -from db.DTOs.LogInfo import LogInfo -from core.AsyncCoreLogger import AsyncCoreLogger +from src.db.DTOs.LogInfo import LogInfo +from src.core.AsyncCoreLogger import AsyncCoreLogger @pytest.mark.asyncio diff --git a/tests/automated/unit/dto/test_all_annotation_post_info.py b/tests/automated/unit/dto/test_all_annotation_post_info.py index 1b35234a..3bc20c02 100644 --- a/tests/automated/unit/dto/test_all_annotation_post_info.py +++ b/tests/automated/unit/dto/test_all_annotation_post_info.py @@ -1,8 +1,8 @@ import pytest -from core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo -from core.enums import RecordType, SuggestedStatus -from core.exceptions import FailedValidationException +from src.core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo +from src.core.enums import RecordType, SuggestedStatus +from src.core.exceptions import FailedValidationException # Mock values to pass mock_record_type = RecordType.ARREST_RECORDS.value # replace with valid RecordType if Enum diff --git a/tests/automated/unit/security_manager/test_security_manager.py b/tests/automated/unit/security_manager/test_security_manager.py index fd03fee5..4b557bba 100644 --- a/tests/automated/unit/security_manager/test_security_manager.py +++ b/tests/automated/unit/security_manager/test_security_manager.py @@ -4,7 +4,7 @@ from fastapi import HTTPException from jwt import InvalidTokenError -from security_manager.SecurityManager import SecurityManager, Permissions, AccessInfo, get_access_info +from src.security_manager.SecurityManager import SecurityManager, Permissions, AccessInfo, get_access_info SECRET_KEY = "test_secret_key" VALID_TOKEN = "valid_token" diff --git a/tests/automated/unit/source_collectors/test_autogoogler_collector.py b/tests/automated/unit/source_collectors/test_autogoogler_collector.py index dc5de285..2b495533 100644 --- a/tests/automated/unit/source_collectors/test_autogoogler_collector.py +++ b/tests/automated/unit/source_collectors/test_autogoogler_collector.py @@ -2,11 +2,11 @@ import pytest -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DTOs.URLInfo import URLInfo -from core.AsyncCoreLogger import AsyncCoreLogger -from source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector -from source_collectors.auto_googler.DTOs import GoogleSearchQueryResultsInnerDTO, AutoGooglerInputDTO +from src.db import AsyncDatabaseClient +from src.db.DTOs import URLInfo +from src.core.AsyncCoreLogger import AsyncCoreLogger +from src.source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector +from src.source_collectors.auto_googler.DTOs import GoogleSearchQueryResultsInnerDTO, AutoGooglerInputDTO @pytest.fixture diff --git a/tests/automated/unit/source_collectors/test_ckan_collector.py b/tests/automated/unit/source_collectors/test_ckan_collector.py index 747b0852..7dc7761a 100644 --- a/tests/automated/unit/source_collectors/test_ckan_collector.py +++ b/tests/automated/unit/source_collectors/test_ckan_collector.py @@ -1,13 +1,13 @@ import json import pickle -from unittest.mock import MagicMock, AsyncMock +from unittest.mock import AsyncMock import pytest -from db.AsyncDatabaseClient import AsyncDatabaseClient -from core.AsyncCoreLogger import AsyncCoreLogger -from source_collectors.ckan.CKANCollector import CKANCollector -from source_collectors.ckan.DTOs import CKANInputDTO +from src.db import AsyncDatabaseClient +from src.core.AsyncCoreLogger import AsyncCoreLogger +from src.source_collectors.ckan import CKANCollector +from src.source_collectors.ckan.DTOs import CKANInputDTO @pytest.fixture diff --git a/tests/automated/unit/source_collectors/test_common_crawl_collector.py b/tests/automated/unit/source_collectors/test_common_crawl_collector.py index 6023b8cf..daf5d711 100644 --- a/tests/automated/unit/source_collectors/test_common_crawl_collector.py +++ b/tests/automated/unit/source_collectors/test_common_crawl_collector.py @@ -2,11 +2,11 @@ import pytest -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DTOs.URLInfo import URLInfo -from core.AsyncCoreLogger import AsyncCoreLogger -from source_collectors.common_crawler.CommonCrawlerCollector import CommonCrawlerCollector -from source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO +from src.db import AsyncDatabaseClient +from src.db.DTOs import URLInfo +from src.core.AsyncCoreLogger import AsyncCoreLogger +from src.source_collectors.common_crawler import CommonCrawlerCollector +from src.source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO @pytest.fixture diff --git a/tests/automated/unit/source_collectors/test_example_collector.py b/tests/automated/unit/source_collectors/test_example_collector.py index e5d113cc..bba3f8d1 100644 --- a/tests/automated/unit/source_collectors/test_example_collector.py +++ b/tests/automated/unit/source_collectors/test_example_collector.py @@ -1,9 +1,9 @@ from unittest.mock import AsyncMock -from db.DatabaseClient import DatabaseClient +from src.db.DatabaseClient import DatabaseClient from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from collector_manager.ExampleCollector import ExampleCollector -from core.AsyncCoreLogger import AsyncCoreLogger +from src.core.AsyncCoreLogger import AsyncCoreLogger def test_example_collector(): diff --git a/tests/automated/unit/source_collectors/test_muckrock_collectors.py b/tests/automated/unit/source_collectors/test_muckrock_collectors.py index cd49ffb6..0d839d57 100644 --- a/tests/automated/unit/source_collectors/test_muckrock_collectors.py +++ b/tests/automated/unit/source_collectors/test_muckrock_collectors.py @@ -3,14 +3,14 @@ import pytest -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DTOs.URLInfo import URLInfo -from core.AsyncCoreLogger import AsyncCoreLogger -from source_collectors.muckrock.DTOs import MuckrockSimpleSearchCollectorInputDTO, \ +from src.db import AsyncDatabaseClient +from src.db.DTOs import URLInfo +from src.core.AsyncCoreLogger import AsyncCoreLogger +from src.source_collectors.muckrock.DTOs import MuckrockSimpleSearchCollectorInputDTO, \ MuckrockCountySearchCollectorInputDTO, MuckrockAllFOIARequestsCollectorInputDTO -from source_collectors.muckrock.classes.MuckrockCollector import MuckrockSimpleSearchCollector, \ +from src.source_collectors.muckrock.classes import MuckrockSimpleSearchCollector, \ MuckrockCountyLevelSearchCollector, MuckrockAllFOIARequestsCollector -from source_collectors.muckrock.classes.muckrock_fetchers.FOIAFetcher import FOIAFetchRequest +from src.source_collectors.muckrock.classes import FOIAFetchRequest @pytest.fixture diff --git a/tests/automated/unit/test_function_trigger.py b/tests/automated/unit/test_function_trigger.py index 37b3c948..cc3a77b2 100644 --- a/tests/automated/unit/test_function_trigger.py +++ b/tests/automated/unit/test_function_trigger.py @@ -3,7 +3,7 @@ import pytest -from core.FunctionTrigger import FunctionTrigger +from src.core.FunctionTrigger import FunctionTrigger @pytest.mark.asyncio diff --git a/tests/conftest.py b/tests/conftest.py index 99281103..ae002d5a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,11 +3,11 @@ from sqlalchemy import create_engine, inspect, MetaData from sqlalchemy.orm import scoped_session, sessionmaker -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DatabaseClient import DatabaseClient -from db.helper_functions import get_postgres_connection_string -from db.models import Base -from core.EnvVarManager import EnvVarManager +from src.db import AsyncDatabaseClient +from src.db.DatabaseClient import DatabaseClient +from src.db.helper_functions import get_postgres_connection_string +from src.db.models import Base +from src.core.EnvVarManager import EnvVarManager from tests.helpers.AlembicRunner import AlembicRunner from tests.helpers.DBDataCreator import DBDataCreator from util.helper_functions import load_from_environment diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index a0036e2a..7734e7c0 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -1,26 +1,25 @@ -import asyncio from datetime import datetime from random import randint from typing import List, Optional -from pydantic import BaseModel, model_validator - -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DTOs.BatchInfo import BatchInfo -from db.DTOs.DuplicateInfo import DuplicateInsertInfo -from db.DTOs.InsertURLsInfo import InsertURLsInfo -from db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType -from db.DTOs.URLInfo import URLInfo -from db.DTOs.URLMapping import URLMapping -from db.DatabaseClient import DatabaseClient -from db.enums import TaskType +from pydantic import BaseModel + +from src.db import AsyncDatabaseClient +from src.db.DTOs.BatchInfo import BatchInfo +from src.db.DTOs.DuplicateInfo import DuplicateInsertInfo +from src.db.DTOs.InsertURLsInfo import InsertURLsInfo +from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType +from src.db.DTOs import URLInfo +from src.db.DTOs.URLMapping import URLMapping +from src.db.DatabaseClient import DatabaseClient +from src.db.enums import TaskType from collector_manager.enums import CollectorType, URLStatus -from core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason -from core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmittedURLInfo -from core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO -from core.enums import BatchStatus, SuggestionType, RecordType, SuggestedStatus +from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason +from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmittedURLInfo +from src.core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO +from src.core.enums import BatchStatus, SuggestionType, RecordType, SuggestedStatus from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, AnnotationInfo from tests.helpers.simple_test_data_functions import generate_test_urls diff --git a/tests/helpers/assert_functions.py b/tests/helpers/assert_functions.py index 7deaacc3..32fe608c 100644 --- a/tests/helpers/assert_functions.py +++ b/tests/helpers/assert_functions.py @@ -1,5 +1,5 @@ -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.models import Task +from src.db import AsyncDatabaseClient +from src.db.models import Task async def assert_database_has_no_tasks(adb_client: AsyncDatabaseClient): diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index 32dfca02..e9935546 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -2,10 +2,10 @@ from pydantic import BaseModel -from db.DTOs.InsertURLsInfo import InsertURLsInfo -from db.DTOs.URLMapping import URLMapping +from src.db.DTOs.InsertURLsInfo import InsertURLsInfo +from src.db.DTOs.URLMapping import URLMapping from collector_manager.enums import URLStatus -from core.enums import RecordType, SuggestionType +from src.core.enums import RecordType, SuggestionType from tests.helpers.DBDataCreator import BatchURLCreationInfo from tests.helpers.DBDataCreator import DBDataCreator diff --git a/tests/helpers/test_batch_creation_parameters.py b/tests/helpers/test_batch_creation_parameters.py index 5d679569..6f02f240 100644 --- a/tests/helpers/test_batch_creation_parameters.py +++ b/tests/helpers/test_batch_creation_parameters.py @@ -4,7 +4,7 @@ from pydantic import BaseModel, model_validator from collector_manager.enums import URLStatus, CollectorType -from core.enums import BatchStatus, AnnotationType, RecordType, SuggestedStatus +from src.core.enums import BatchStatus, RecordType, SuggestedStatus class AnnotationInfo(BaseModel): diff --git a/tests/manual/agency_identifier/test_muckrock_api_interface.py b/tests/manual/agency_identifier/test_muckrock_api_interface.py index e3a86ed9..8f76385e 100644 --- a/tests/manual/agency_identifier/test_muckrock_api_interface.py +++ b/tests/manual/agency_identifier/test_muckrock_api_interface.py @@ -1,7 +1,7 @@ import pytest from aiohttp import ClientSession -from source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface +from src.source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface @pytest.mark.asyncio diff --git a/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py b/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py index d832c2a8..9d40eeda 100644 --- a/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py +++ b/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py @@ -3,9 +3,9 @@ import dotenv import api.dependencies -from db.DTOs.BatchInfo import BatchInfo +from src.db.DTOs.BatchInfo import BatchInfo from collector_manager.enums import CollectorType -from core.enums import BatchStatus +from src.core.enums import BatchStatus from test_automated.integration.core.helpers.common_test_procedures import run_collector_and_wait_for_completion diff --git a/tests/manual/core/lifecycle/test_ckan_lifecycle.py b/tests/manual/core/lifecycle/test_ckan_lifecycle.py index 2d4a4f7a..b4ad5bdd 100644 --- a/tests/manual/core/lifecycle/test_ckan_lifecycle.py +++ b/tests/manual/core/lifecycle/test_ckan_lifecycle.py @@ -1,9 +1,9 @@ import api.dependencies -from db.DTOs.BatchInfo import BatchInfo +from src.db.DTOs.BatchInfo import BatchInfo from collector_manager.enums import CollectorType -from core.enums import BatchStatus -from source_collectors.ckan.search_terms import group_search, package_search, organization_search +from src.core.enums import BatchStatus +from src.source_collectors.ckan.search_terms import group_search, package_search, organization_search from test_automated.integration.core.helpers.common_test_procedures import run_collector_and_wait_for_completion diff --git a/tests/manual/core/lifecycle/test_common_crawler_lifecycle.py b/tests/manual/core/lifecycle/test_common_crawler_lifecycle.py index 03fe5855..fa3ad99d 100644 --- a/tests/manual/core/lifecycle/test_common_crawler_lifecycle.py +++ b/tests/manual/core/lifecycle/test_common_crawler_lifecycle.py @@ -2,8 +2,8 @@ import api.dependencies from collector_manager.enums import CollectorType -from core.SourceCollectorCore import SourceCollectorCore -from core.enums import BatchStatus +from src.core.SourceCollectorCore import SourceCollectorCore +from src.core.enums import BatchStatus def test_common_crawler_lifecycle(test_core: SourceCollectorCore): diff --git a/tests/manual/core/lifecycle/test_muckrock_lifecycles.py b/tests/manual/core/lifecycle/test_muckrock_lifecycles.py index 26e4aa36..c777be3d 100644 --- a/tests/manual/core/lifecycle/test_muckrock_lifecycles.py +++ b/tests/manual/core/lifecycle/test_muckrock_lifecycles.py @@ -1,8 +1,8 @@ import api.dependencies -from db.DTOs.BatchInfo import BatchInfo +from src.db.DTOs.BatchInfo import BatchInfo from collector_manager.enums import CollectorType -from core.enums import BatchStatus +from src.core.enums import BatchStatus from test_automated.integration.core.helpers.common_test_procedures import run_collector_and_wait_for_completion from test_automated.integration.core.helpers.constants import ALLEGHENY_COUNTY_MUCKROCK_ID, ALLEGHENY_COUNTY_TOWN_NAMES diff --git a/tests/manual/html_collector/test_html_tag_collector_integration.py b/tests/manual/html_collector/test_html_tag_collector_integration.py index 5777f907..674360a4 100644 --- a/tests/manual/html_collector/test_html_tag_collector_integration.py +++ b/tests/manual/html_collector/test_html_tag_collector_integration.py @@ -1,12 +1,12 @@ import pytest -from db.AsyncDatabaseClient import AsyncDatabaseClient -from db.DTOs.URLInfo import URLInfo -from core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator +from src.db import AsyncDatabaseClient +from src.db.DTOs import URLInfo +from src.core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator from tests.helpers.DBDataCreator import DBDataCreator -from html_tag_collector.ResponseParser import HTMLResponseParser -from html_tag_collector.RootURLCache import RootURLCache -from html_tag_collector.URLRequestInterface import URLRequestInterface +from src.html_tag_collector.ResponseParser import HTMLResponseParser +from src.html_tag_collector import RootURLCache +from src.html_tag_collector.URLRequestInterface import URLRequestInterface URLS = [ "https://pdap.io", diff --git a/tests/manual/llm_api_logic/test_deepseek_record_classifier.py b/tests/manual/llm_api_logic/test_deepseek_record_classifier.py index 18363a71..cf239aa4 100644 --- a/tests/manual/llm_api_logic/test_deepseek_record_classifier.py +++ b/tests/manual/llm_api_logic/test_deepseek_record_classifier.py @@ -1,12 +1,12 @@ import pytest -from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo -from llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier +from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from src.llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier @pytest.mark.asyncio async def test_deepseek_record_classifier(): - from db.DTOs.URLHTMLContentInfo import HTMLContentType as hct + from src.db.DTOs.URLHTMLContentInfo import HTMLContentType as hct d = { hct.TITLE: "Oath of Office for Newly Promoted Corporal Lumpkin with Acworth Police – City of Acworth, GA", diff --git a/tests/manual/llm_api_logic/test_openai_record_classifier.py b/tests/manual/llm_api_logic/test_openai_record_classifier.py index 57b56a54..b1812a27 100644 --- a/tests/manual/llm_api_logic/test_openai_record_classifier.py +++ b/tests/manual/llm_api_logic/test_openai_record_classifier.py @@ -1,12 +1,12 @@ import pytest -from db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo -from llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier +from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from src.llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier @pytest.mark.asyncio async def test_openai_record_classifier(): - from db.DTOs.URLHTMLContentInfo import HTMLContentType as hct + from src.db.DTOs.URLHTMLContentInfo import HTMLContentType as hct d = { hct.TITLE: "Oath of Office for Newly Promoted Corporal Lumpkin with Acworth Police – City of Acworth, GA", diff --git a/tests/manual/pdap_client/test_pdap_client.py b/tests/manual/pdap_client/test_pdap_client.py index 5d10037c..1b79f686 100644 --- a/tests/manual/pdap_client/test_pdap_client.py +++ b/tests/manual/pdap_client/test_pdap_client.py @@ -2,7 +2,7 @@ from aiohttp import ClientSession from pdap_access_manager import AccessManager -from pdap_api_client.PDAPClient import PDAPClient +from src.pdap_api_client.PDAPClient import PDAPClient from util.helper_functions import get_from_env diff --git a/tests/manual/source_collectors/test_autogoogler_collector.py b/tests/manual/source_collectors/test_autogoogler_collector.py index cabdcc1e..926875f9 100644 --- a/tests/manual/source_collectors/test_autogoogler_collector.py +++ b/tests/manual/source_collectors/test_autogoogler_collector.py @@ -1,11 +1,11 @@ -from unittest.mock import MagicMock, AsyncMock +from unittest.mock import AsyncMock import pytest -from db.AsyncDatabaseClient import AsyncDatabaseClient -from core.AsyncCoreLogger import AsyncCoreLogger -from source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector -from source_collectors.auto_googler.DTOs import AutoGooglerInputDTO +from src.db import AsyncDatabaseClient +from src.core.AsyncCoreLogger import AsyncCoreLogger +from src.source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector +from src.source_collectors.auto_googler.DTOs import AutoGooglerInputDTO @pytest.mark.asyncio async def test_autogoogler_collector(): diff --git a/tests/manual/source_collectors/test_ckan_collector.py b/tests/manual/source_collectors/test_ckan_collector.py index e6a6c1f8..0fadec3a 100644 --- a/tests/manual/source_collectors/test_ckan_collector.py +++ b/tests/manual/source_collectors/test_ckan_collector.py @@ -1,13 +1,13 @@ -from unittest.mock import MagicMock, AsyncMock +from unittest.mock import AsyncMock import pytest from marshmallow import Schema, fields -from db.AsyncDatabaseClient import AsyncDatabaseClient -from core.AsyncCoreLogger import AsyncCoreLogger -from source_collectors.ckan.CKANCollector import CKANCollector -from source_collectors.ckan.DTOs import CKANInputDTO -from source_collectors.ckan.search_terms import package_search, group_search, organization_search +from src.db import AsyncDatabaseClient +from src.core.AsyncCoreLogger import AsyncCoreLogger +from src.source_collectors.ckan import CKANCollector +from src.source_collectors.ckan.DTOs import CKANInputDTO +from src.source_collectors.ckan.search_terms import package_search, group_search, organization_search class CKANSchema(Schema): diff --git a/tests/manual/source_collectors/test_common_crawler_collector.py b/tests/manual/source_collectors/test_common_crawler_collector.py index 12be9ec7..c91da5e7 100644 --- a/tests/manual/source_collectors/test_common_crawler_collector.py +++ b/tests/manual/source_collectors/test_common_crawler_collector.py @@ -1,12 +1,12 @@ -from unittest.mock import MagicMock, AsyncMock +from unittest.mock import AsyncMock import pytest from marshmallow import Schema, fields -from db.AsyncDatabaseClient import AsyncDatabaseClient -from core.AsyncCoreLogger import AsyncCoreLogger -from source_collectors.common_crawler.CommonCrawlerCollector import CommonCrawlerCollector -from source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO +from src.db import AsyncDatabaseClient +from src.core.AsyncCoreLogger import AsyncCoreLogger +from src.source_collectors.common_crawler import CommonCrawlerCollector +from src.source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO class CommonCrawlerSchema(Schema): diff --git a/tests/manual/source_collectors/test_muckrock_collectors.py b/tests/manual/source_collectors/test_muckrock_collectors.py index c30473df..5d0fd1ca 100644 --- a/tests/manual/source_collectors/test_muckrock_collectors.py +++ b/tests/manual/source_collectors/test_muckrock_collectors.py @@ -1,14 +1,14 @@ -from unittest.mock import MagicMock, AsyncMock +from unittest.mock import AsyncMock import pytest -from db.AsyncDatabaseClient import AsyncDatabaseClient -from core.AsyncCoreLogger import AsyncCoreLogger -from source_collectors.muckrock.DTOs import MuckrockSimpleSearchCollectorInputDTO, \ +from src.db import AsyncDatabaseClient +from src.core.AsyncCoreLogger import AsyncCoreLogger +from src.source_collectors.muckrock.DTOs import MuckrockSimpleSearchCollectorInputDTO, \ MuckrockCountySearchCollectorInputDTO, MuckrockAllFOIARequestsCollectorInputDTO -from source_collectors.muckrock.classes.MuckrockCollector import MuckrockSimpleSearchCollector, \ +from src.source_collectors.muckrock.classes import MuckrockSimpleSearchCollector, \ MuckrockCountyLevelSearchCollector, MuckrockAllFOIARequestsCollector -from source_collectors.muckrock.schemas import MuckrockURLInfoSchema +from src.source_collectors.muckrock.schemas import MuckrockURLInfoSchema from tests.automated.integration.core.helpers.constants import ALLEGHENY_COUNTY_MUCKROCK_ID, \ ALLEGHENY_COUNTY_TOWN_NAMES diff --git a/tests/manual/unsorted/test_root_url_cache_unit.py b/tests/manual/unsorted/test_root_url_cache_unit.py index 56967c14..f319d813 100644 --- a/tests/manual/unsorted/test_root_url_cache_unit.py +++ b/tests/manual/unsorted/test_root_url_cache_unit.py @@ -5,7 +5,7 @@ import pytest -from html_tag_collector.RootURLCache import RootURLCache # Adjust import according to your package structure +from src.html_tag_collector import RootURLCache # Adjust import according to your package structure @pytest.fixture From 943d29af1362b1c467647a54ba8841ca632011f1 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 27 May 2025 17:00:36 -0400 Subject: [PATCH 197/244] Move directories into `src` directory --- Dockerfile | 13 +--- ...0590bb_overhaul_annotation_organization.py | 2 +- ..._add_name_description_and_url_optional_.py | 2 +- ...-4c70177eba78_add_rejected_batch_status.py | 2 +- ...3794fa4e9_add_submit_url_task_type_enum.py | 2 +- ...hange_batch_completed_to_ready_to_label.py | 5 +- ..._add_manual_strategy_to_batch_strategy_.py | 3 +- ..._create_url_checked_for_duplicate_table.py | 2 +- ...cb_create_url_probed_for_404_table_and_.py | 2 +- ...031-00cc949e0347_update_relevancy_logic.py | 2 +- local_database/DockerInfos.py | 2 +- {api => src/api}/README.md | 0 {api => src/api}/__init__.py | 0 {api => src/api}/dependencies.py | 4 +- {api => src/api}/main.py | 20 +++--- {api => src/api}/routes/__init__.py | 0 {api => src/api}/routes/annotate.py | 2 +- {api => src/api}/routes/batch.py | 4 +- {api => src/api}/routes/collector.py | 6 +- {api => src/api}/routes/metrics.py | 2 +- {api => src/api}/routes/review.py | 2 +- {api => src/api}/routes/root.py | 0 {api => src/api}/routes/search.py | 2 +- {api => src/api}/routes/task.py | 2 +- {api => src/api}/routes/url.py | 2 +- .../collector_manager}/AsyncCollectorBase.py | 2 +- .../AsyncCollectorManager.py | 8 +-- .../collector_manager}/CollectorManager.py | 0 .../DTOs/ExampleInputDTO.py | 0 .../DTOs/ExampleOutputDTO.py | 0 .../collector_manager}/DTOs/__init__.py | 0 .../collector_manager}/ExampleCollector.py | 8 +-- .../collector_manager}/README.md | 0 .../collector_manager}/__init__.py | 0 .../collector_manager}/collector_mapping.py | 6 +- .../configs/sample_autogoogler_config.json | 0 .../collector_manager}/enums.py | 0 src/core/AsyncCore.py | 4 +- src/core/DTOs/BatchStatusInfo.py | 2 +- src/core/DTOs/CollectorStartParams.py | 2 +- .../GetMetricsBatchesAggregatedResponseDTO.py | 2 +- .../GetMetricsBatchesBreakdownResponseDTO.py | 2 +- src/core/DTOs/GetURLsResponseInfo.py | 2 +- .../AgencyIdentificationTDO.py | 2 +- .../URLMiscellaneousMetadataTDO.py | 3 +- .../AgencyIdentificationTaskOperator.py | 2 +- .../URLMiscellaneousMetadataTaskOperator.py | 2 +- src/core/helpers.py | 2 +- src/core/preprocessors/ExamplePreprocessor.py | 2 +- src/db/AsyncDatabaseClient.py | 2 +- src/db/DTOs/URLInfo.py | 2 +- src/db/DatabaseClient.py | 2 +- src/db/StatementComposer.py | 2 +- src/db/models.py | 2 +- .../auto_googler/AutoGooglerCollector.py | 6 +- src/source_collectors/ckan/CKANCollector.py | 6 +- .../common_crawler/CommonCrawlerCollector.py | 4 +- .../muckrock/classes/MuckrockCollector.py | 4 +- {util => src/util}/__init__.py | 0 {util => src/util}/alembic_helpers.py | 0 {util => src/util}/db_manager.py | 0 {util => src/util}/helper_functions.py | 0 {util => src/util}/miscellaneous_functions.py | 0 tests/automated/integration/api/conftest.py | 4 +- .../api/helpers/RequestValidator.py | 6 +- .../integration/api/test_annotate.py | 2 +- tests/automated/integration/api/test_batch.py | 4 +- .../integration/api/test_duplicates.py | 2 +- .../integration/api/test_example_collector.py | 8 +-- .../integration/api/test_manual_batch.py | 2 +- .../automated/integration/api/test_metrics.py | 2 +- .../automated/integration/api/test_review.py | 2 +- .../collector_db/test_database_structure.py | 4 +- .../collector_db/test_db_client.py | 6 +- tests/automated/integration/conftest.py | 4 +- .../core/test_example_collector_lifecycle.py | 4 +- .../html_tag_collector/test_root_url_cache.py | 2 +- .../security_manager/test_security_manager.py | 4 +- .../tasks/test_agency_preannotation_task.py | 4 +- .../tasks/test_submit_approved_url_task.py | 2 +- .../integration/tasks/test_url_404_probe.py | 2 +- .../tasks/test_url_duplicate_task.py | 2 +- .../integration/tasks/test_url_html_task.py | 8 +-- .../test_url_miscellaneous_metadata_task.py | 2 +- .../security_manager/test_security_manager.py | 2 +- .../test_autogoogler_collector.py | 6 +- .../source_collectors/test_ckan_collector.py | 63 ------------------ .../test_common_crawl_collector.py | 8 +-- .../test_example_collector.py | 4 +- .../test_muckrock_collectors.py | 16 ++--- tests/conftest.py | 4 +- tests/helpers/DBDataCreator.py | 6 +- tests/helpers/complex_test_data_functions.py | 2 +- tests/helpers/patch_functions.py | 2 +- .../helpers/test_batch_creation_parameters.py | 2 +- tests/manual/api/test_authorization.py | 2 +- .../lifecycle/test_auto_googler_lifecycle.py | 7 +- .../core/lifecycle/test_ckan_lifecycle.py | 6 +- .../test_common_crawler_lifecycle.py | 5 +- .../lifecycle/test_muckrock_lifecycles.py | 10 ++- .../manual/pdap_client/test_access_manager.py | 2 +- tests/manual/pdap_client/test_pdap_client.py | 2 +- .../ckan_add_collection_child_packages.pkl | Bin 15581974 -> 0 bytes 103 files changed, 153 insertions(+), 236 deletions(-) rename {api => src/api}/README.md (100%) rename {api => src/api}/__init__.py (100%) rename {api => src/api}/dependencies.py (78%) rename {api => src/api}/main.py (88%) rename {api => src/api}/routes/__init__.py (100%) rename {api => src/api}/routes/annotate.py (99%) rename {api => src/api}/routes/batch.py (97%) rename {api => src/api}/routes/collector.py (96%) rename {api => src/api}/routes/metrics.py (98%) rename {api => src/api}/routes/review.py (98%) rename {api => src/api}/routes/root.py (100%) rename {api => src/api}/routes/search.py (92%) rename {api => src/api}/routes/task.py (97%) rename {api => src/api}/routes/url.py (94%) rename {collector_manager => src/collector_manager}/AsyncCollectorBase.py (98%) rename {collector_manager => src/collector_manager}/AsyncCollectorManager.py (91%) rename {collector_manager => src/collector_manager}/CollectorManager.py (100%) rename {collector_manager => src/collector_manager}/DTOs/ExampleInputDTO.py (100%) rename {collector_manager => src/collector_manager}/DTOs/ExampleOutputDTO.py (100%) rename {collector_manager => src/collector_manager}/DTOs/__init__.py (100%) rename {collector_manager => src/collector_manager}/ExampleCollector.py (76%) rename {collector_manager => src/collector_manager}/README.md (100%) rename {collector_manager => src/collector_manager}/__init__.py (100%) rename {collector_manager => src/collector_manager}/collector_mapping.py (76%) rename {collector_manager => src/collector_manager}/configs/sample_autogoogler_config.json (100%) rename {collector_manager => src/collector_manager}/enums.py (100%) rename {util => src/util}/__init__.py (100%) rename {util => src/util}/alembic_helpers.py (100%) rename {util => src/util}/db_manager.py (100%) rename {util => src/util}/helper_functions.py (100%) rename {util => src/util}/miscellaneous_functions.py (100%) delete mode 100644 tests/automated/unit/source_collectors/test_ckan_collector.py delete mode 100644 tests/test_data/ckan_add_collection_child_packages.pkl diff --git a/Dockerfile b/Dockerfile index 6eee3a51..85931528 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,25 +15,14 @@ RUN uv sync --locked --no-dev RUN playwright install-deps chromium RUN playwright install chromium - # Copy project files -COPY api ./api -COPY src/db ./collector_db -COPY collector_manager ./collector_manager -COPY src/core ./core -COPY src/html_tag_collector ./html_tag_collector -COPY src/source_collectors ./source_collectors -COPY util ./util +COPY src ./src COPY alembic.ini ./alembic.ini COPY alembic ./alembic COPY apply_migrations.py ./apply_migrations.py -COPY src/security_manager ./security_manager -COPY src/pdap_api_client ./pdap_api_client COPY execute.sh ./execute.sh COPY .project-root ./.project-root -COPY src/llm_api_logic ./llm_api_logic - # Expose the application port EXPOSE 80 diff --git a/alembic/versions/2025_02_23_1023-33421c0590bb_overhaul_annotation_organization.py b/alembic/versions/2025_02_23_1023-33421c0590bb_overhaul_annotation_organization.py index 55442f50..97889bd9 100644 --- a/alembic/versions/2025_02_23_1023-33421c0590bb_overhaul_annotation_organization.py +++ b/alembic/versions/2025_02_23_1023-33421c0590bb_overhaul_annotation_organization.py @@ -32,7 +32,7 @@ import sqlalchemy as sa from sqlalchemy import UniqueConstraint -from util.alembic_helpers import switch_enum_type +from src.util.alembic_helpers import switch_enum_type # revision identifiers, used by Alembic. revision: str = '33421c0590bb' diff --git a/alembic/versions/2025_03_15_1745-6eb8084e2f48_add_name_description_and_url_optional_.py b/alembic/versions/2025_03_15_1745-6eb8084e2f48_add_name_description_and_url_optional_.py index e8b542f9..36bfbf4e 100644 --- a/alembic/versions/2025_03_15_1745-6eb8084e2f48_add_name_description_and_url_optional_.py +++ b/alembic/versions/2025_03_15_1745-6eb8084e2f48_add_name_description_and_url_optional_.py @@ -10,7 +10,7 @@ from alembic import op import sqlalchemy as sa -from util.alembic_helpers import switch_enum_type +from src.util.alembic_helpers import switch_enum_type # revision identifiers, used by Alembic. revision: str = '6eb8084e2f48' diff --git a/alembic/versions/2025_04_02_2040-4c70177eba78_add_rejected_batch_status.py b/alembic/versions/2025_04_02_2040-4c70177eba78_add_rejected_batch_status.py index fcb9821b..c61f310d 100644 --- a/alembic/versions/2025_04_02_2040-4c70177eba78_add_rejected_batch_status.py +++ b/alembic/versions/2025_04_02_2040-4c70177eba78_add_rejected_batch_status.py @@ -8,7 +8,7 @@ from typing import Sequence, Union -from util.alembic_helpers import switch_enum_type +from src.util.alembic_helpers import switch_enum_type # revision identifiers, used by Alembic. revision: str = '4c70177eba78' diff --git a/alembic/versions/2025_04_15_1338-b363794fa4e9_add_submit_url_task_type_enum.py b/alembic/versions/2025_04_15_1338-b363794fa4e9_add_submit_url_task_type_enum.py index e1d5b725..f19dfd90 100644 --- a/alembic/versions/2025_04_15_1338-b363794fa4e9_add_submit_url_task_type_enum.py +++ b/alembic/versions/2025_04_15_1338-b363794fa4e9_add_submit_url_task_type_enum.py @@ -8,7 +8,7 @@ from typing import Sequence, Union -from util.alembic_helpers import switch_enum_type +from src.util.alembic_helpers import switch_enum_type # revision identifiers, used by Alembic. revision: str = 'b363794fa4e9' diff --git a/alembic/versions/2025_04_17_0909-e285e6e7cf71_change_batch_completed_to_ready_to_label.py b/alembic/versions/2025_04_17_0909-e285e6e7cf71_change_batch_completed_to_ready_to_label.py index 882c2c5f..bc60015b 100644 --- a/alembic/versions/2025_04_17_0909-e285e6e7cf71_change_batch_completed_to_ready_to_label.py +++ b/alembic/versions/2025_04_17_0909-e285e6e7cf71_change_batch_completed_to_ready_to_label.py @@ -7,10 +7,7 @@ """ from typing import Sequence, Union -from alembic import op -import sqlalchemy as sa - -from util.alembic_helpers import switch_enum_type, alter_enum_value +from src.util.alembic_helpers import alter_enum_value # revision identifiers, used by Alembic. revision: str = 'e285e6e7cf71' diff --git a/alembic/versions/2025_05_03_0956-028565b77b9e_add_manual_strategy_to_batch_strategy_.py b/alembic/versions/2025_05_03_0956-028565b77b9e_add_manual_strategy_to_batch_strategy_.py index 9ec86fee..cb7fd988 100644 --- a/alembic/versions/2025_05_03_0956-028565b77b9e_add_manual_strategy_to_batch_strategy_.py +++ b/alembic/versions/2025_05_03_0956-028565b77b9e_add_manual_strategy_to_batch_strategy_.py @@ -8,9 +8,8 @@ from typing import Sequence, Union from alembic import op -import sqlalchemy as sa -from util.alembic_helpers import switch_enum_type +from src.util.alembic_helpers import switch_enum_type # revision identifiers, used by Alembic. revision: str = '028565b77b9e' diff --git a/alembic/versions/2025_05_13_0704-864107b703ae_create_url_checked_for_duplicate_table.py b/alembic/versions/2025_05_13_0704-864107b703ae_create_url_checked_for_duplicate_table.py index e2e5947f..39ab8125 100644 --- a/alembic/versions/2025_05_13_0704-864107b703ae_create_url_checked_for_duplicate_table.py +++ b/alembic/versions/2025_05_13_0704-864107b703ae_create_url_checked_for_duplicate_table.py @@ -10,7 +10,7 @@ from alembic import op import sqlalchemy as sa -from util.alembic_helpers import switch_enum_type +from src.util.alembic_helpers import switch_enum_type # revision identifiers, used by Alembic. revision: str = '864107b703ae' diff --git a/alembic/versions/2025_05_13_1234-b5f079b6b8cb_create_url_probed_for_404_table_and_.py b/alembic/versions/2025_05_13_1234-b5f079b6b8cb_create_url_probed_for_404_table_and_.py index f8868b02..1fc0c8e6 100644 --- a/alembic/versions/2025_05_13_1234-b5f079b6b8cb_create_url_probed_for_404_table_and_.py +++ b/alembic/versions/2025_05_13_1234-b5f079b6b8cb_create_url_probed_for_404_table_and_.py @@ -10,7 +10,7 @@ from alembic import op import sqlalchemy as sa -from util.alembic_helpers import switch_enum_type +from src.util.alembic_helpers import switch_enum_type # revision identifiers, used by Alembic. revision: str = 'b5f079b6b8cb' diff --git a/alembic/versions/2025_05_16_1031-00cc949e0347_update_relevancy_logic.py b/alembic/versions/2025_05_16_1031-00cc949e0347_update_relevancy_logic.py index 5ba1240f..78307640 100644 --- a/alembic/versions/2025_05_16_1031-00cc949e0347_update_relevancy_logic.py +++ b/alembic/versions/2025_05_16_1031-00cc949e0347_update_relevancy_logic.py @@ -16,7 +16,7 @@ from alembic import op import sqlalchemy as sa -from util.alembic_helpers import switch_enum_type +from src.util.alembic_helpers import switch_enum_type # revision identifiers, used by Alembic. revision: str = '00cc949e0347' diff --git a/local_database/DockerInfos.py b/local_database/DockerInfos.py index 17180bab..ad7228fb 100644 --- a/local_database/DockerInfos.py +++ b/local_database/DockerInfos.py @@ -1,5 +1,5 @@ from local_database.DTOs import DockerInfo, DockerfileInfo, HealthCheckInfo, VolumeInfo -from util.helper_functions import get_from_env, project_path +from src.util import get_from_env, project_path def get_database_docker_info() -> DockerInfo: diff --git a/api/README.md b/src/api/README.md similarity index 100% rename from api/README.md rename to src/api/README.md diff --git a/api/__init__.py b/src/api/__init__.py similarity index 100% rename from api/__init__.py rename to src/api/__init__.py diff --git a/api/dependencies.py b/src/api/dependencies.py similarity index 78% rename from api/dependencies.py rename to src/api/dependencies.py index 6584bf13..3411340a 100644 --- a/api/dependencies.py +++ b/src/api/dependencies.py @@ -3,10 +3,10 @@ def get_core() -> SourceCollectorCore: - from api.main import app + from src.api.main import app return app.state.core def get_async_core() -> AsyncCore: - from api.main import app + from src.api.main import app return app.state.async_core \ No newline at end of file diff --git a/api/main.py b/src/api/main.py similarity index 88% rename from api/main.py rename to src/api/main.py index a5b956ee..227de24c 100644 --- a/api/main.py +++ b/src/api/main.py @@ -5,18 +5,18 @@ from fastapi import FastAPI from starlette.responses import RedirectResponse -from api.routes.annotate import annotate_router -from api.routes.batch import batch_router -from api.routes.collector import collector_router -from api.routes.metrics import metrics_router -from api.routes.review import review_router -from api.routes.root import root_router -from api.routes.search import search_router -from api.routes.task import task_router -from api.routes.url import url_router +from src.api.routes.annotate import annotate_router +from src.api.routes.batch import batch_router +from src.api.routes.collector import collector_router +from src.api.routes.metrics import metrics_router +from src.api.routes.review import review_router +from src.api.routes.root import root_router +from src.api.routes.search import search_router +from src.api.routes.task import task_router +from src.api.routes.url import url_router from src.db.AsyncDatabaseClient import AsyncDatabaseClient from src.db.DatabaseClient import DatabaseClient -from collector_manager.AsyncCollectorManager import AsyncCollectorManager +from src.collector_manager.AsyncCollectorManager import AsyncCollectorManager from src.core.AsyncCore import AsyncCore from src.core.AsyncCoreLogger import AsyncCoreLogger from src.core.EnvVarManager import EnvVarManager diff --git a/api/routes/__init__.py b/src/api/routes/__init__.py similarity index 100% rename from api/routes/__init__.py rename to src/api/routes/__init__.py diff --git a/api/routes/annotate.py b/src/api/routes/annotate.py similarity index 99% rename from api/routes/annotate.py rename to src/api/routes/annotate.py index a88204f3..ceb170bb 100644 --- a/api/routes/annotate.py +++ b/src/api/routes/annotate.py @@ -2,7 +2,7 @@ from fastapi import APIRouter, Depends, Path, Query -from api.dependencies import get_async_core +from src.api.dependencies import get_async_core from src.core.AsyncCore import AsyncCore from src.core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo from src.core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo diff --git a/api/routes/batch.py b/src/api/routes/batch.py similarity index 97% rename from api/routes/batch.py rename to src/api/routes/batch.py index 9e4cd861..ee895c82 100644 --- a/api/routes/batch.py +++ b/src/api/routes/batch.py @@ -3,9 +3,9 @@ from fastapi import Path, APIRouter from fastapi.params import Query, Depends -from api.dependencies import get_async_core +from src.api.dependencies import get_async_core from src.db.DTOs.BatchInfo import BatchInfo -from collector_manager.enums import CollectorType +from src.collector_manager.enums import CollectorType from src.core.AsyncCore import AsyncCore from src.core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse from src.core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse diff --git a/api/routes/collector.py b/src/api/routes/collector.py similarity index 96% rename from api/routes/collector.py rename to src/api/routes/collector.py index 1eba70d8..2d60ec51 100644 --- a/api/routes/collector.py +++ b/src/api/routes/collector.py @@ -1,9 +1,9 @@ from fastapi import APIRouter from fastapi.params import Depends -from api.dependencies import get_async_core -from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from collector_manager.enums import CollectorType +from src.api.dependencies import get_async_core +from src.collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO +from src.collector_manager.enums import CollectorType from src.core.AsyncCore import AsyncCore from src.core.DTOs.CollectorStartInfo import CollectorStartInfo from src.core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO diff --git a/api/routes/metrics.py b/src/api/routes/metrics.py similarity index 98% rename from api/routes/metrics.py rename to src/api/routes/metrics.py index 49da88d1..b90334e8 100644 --- a/api/routes/metrics.py +++ b/src/api/routes/metrics.py @@ -1,7 +1,7 @@ from fastapi import APIRouter from fastapi.params import Query, Depends -from api.dependencies import get_async_core +from src.api.dependencies import get_async_core from src.core.AsyncCore import AsyncCore from src.core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO from src.core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO diff --git a/api/routes/review.py b/src/api/routes/review.py similarity index 98% rename from api/routes/review.py rename to src/api/routes/review.py index 518786d1..51946461 100644 --- a/api/routes/review.py +++ b/src/api/routes/review.py @@ -2,7 +2,7 @@ from fastapi import APIRouter, Depends, Query -from api.dependencies import get_async_core +from src.api.dependencies import get_async_core from src.core.AsyncCore import AsyncCore from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewRejectionInfo from src.core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse diff --git a/api/routes/root.py b/src/api/routes/root.py similarity index 100% rename from api/routes/root.py rename to src/api/routes/root.py diff --git a/api/routes/search.py b/src/api/routes/search.py similarity index 92% rename from api/routes/search.py rename to src/api/routes/search.py index b6432ba3..7955c0db 100644 --- a/api/routes/search.py +++ b/src/api/routes/search.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, Query, Depends -from api.dependencies import get_async_core +from src.api.dependencies import get_async_core from src.core.AsyncCore import AsyncCore from src.core.DTOs.SearchURLResponse import SearchURLResponse from src.security_manager.SecurityManager import get_access_info, AccessInfo diff --git a/api/routes/task.py b/src/api/routes/task.py similarity index 97% rename from api/routes/task.py rename to src/api/routes/task.py index 3b4d13b3..2b0ac6d4 100644 --- a/api/routes/task.py +++ b/src/api/routes/task.py @@ -2,7 +2,7 @@ from fastapi import APIRouter, Depends, Query, Path -from api.dependencies import get_async_core +from src.api.dependencies import get_async_core from src.db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo from src.db.DTOs.TaskInfo import TaskInfo from src.db.enums import TaskType diff --git a/api/routes/url.py b/src/api/routes/url.py similarity index 94% rename from api/routes/url.py rename to src/api/routes/url.py index 2228da1e..46b7950e 100644 --- a/api/routes/url.py +++ b/src/api/routes/url.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, Query, Depends -from api.dependencies import get_async_core +from src.api.dependencies import get_async_core from src.core.AsyncCore import AsyncCore from src.core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo from src.security_manager.SecurityManager import AccessInfo, get_access_info diff --git a/collector_manager/AsyncCollectorBase.py b/src/collector_manager/AsyncCollectorBase.py similarity index 98% rename from collector_manager/AsyncCollectorBase.py rename to src/collector_manager/AsyncCollectorBase.py index d089ae59..3f890c28 100644 --- a/collector_manager/AsyncCollectorBase.py +++ b/src/collector_manager/AsyncCollectorBase.py @@ -9,7 +9,7 @@ from src.db.AsyncDatabaseClient import AsyncDatabaseClient from src.db.DTOs.InsertURLsInfo import InsertURLsInfo from src.db.DTOs.LogInfo import LogInfo -from collector_manager.enums import CollectorType +from src.collector_manager.enums import CollectorType from src.core.AsyncCoreLogger import AsyncCoreLogger from src.core.FunctionTrigger import FunctionTrigger from src.core.enums import BatchStatus diff --git a/collector_manager/AsyncCollectorManager.py b/src/collector_manager/AsyncCollectorManager.py similarity index 91% rename from collector_manager/AsyncCollectorManager.py rename to src/collector_manager/AsyncCollectorManager.py index 62a30661..66819902 100644 --- a/collector_manager/AsyncCollectorManager.py +++ b/src/collector_manager/AsyncCollectorManager.py @@ -6,10 +6,10 @@ from pydantic import BaseModel from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from collector_manager.AsyncCollectorBase import AsyncCollectorBase -from collector_manager.CollectorManager import InvalidCollectorError -from collector_manager.collector_mapping import COLLECTOR_MAPPING -from collector_manager.enums import CollectorType +from src.collector_manager.AsyncCollectorBase import AsyncCollectorBase +from src.collector_manager.CollectorManager import InvalidCollectorError +from src.collector_manager.collector_mapping import COLLECTOR_MAPPING +from src.collector_manager.enums import CollectorType from src.core.AsyncCoreLogger import AsyncCoreLogger from src.core.FunctionTrigger import FunctionTrigger diff --git a/collector_manager/CollectorManager.py b/src/collector_manager/CollectorManager.py similarity index 100% rename from collector_manager/CollectorManager.py rename to src/collector_manager/CollectorManager.py diff --git a/collector_manager/DTOs/ExampleInputDTO.py b/src/collector_manager/DTOs/ExampleInputDTO.py similarity index 100% rename from collector_manager/DTOs/ExampleInputDTO.py rename to src/collector_manager/DTOs/ExampleInputDTO.py diff --git a/collector_manager/DTOs/ExampleOutputDTO.py b/src/collector_manager/DTOs/ExampleOutputDTO.py similarity index 100% rename from collector_manager/DTOs/ExampleOutputDTO.py rename to src/collector_manager/DTOs/ExampleOutputDTO.py diff --git a/collector_manager/DTOs/__init__.py b/src/collector_manager/DTOs/__init__.py similarity index 100% rename from collector_manager/DTOs/__init__.py rename to src/collector_manager/DTOs/__init__.py diff --git a/collector_manager/ExampleCollector.py b/src/collector_manager/ExampleCollector.py similarity index 76% rename from collector_manager/ExampleCollector.py rename to src/collector_manager/ExampleCollector.py index eb9370a4..819bb7a3 100644 --- a/collector_manager/ExampleCollector.py +++ b/src/collector_manager/ExampleCollector.py @@ -5,10 +5,10 @@ """ import asyncio -from collector_manager.AsyncCollectorBase import AsyncCollectorBase -from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from collector_manager.DTOs.ExampleOutputDTO import ExampleOutputDTO -from collector_manager.enums import CollectorType +from src.collector_manager.AsyncCollectorBase import AsyncCollectorBase +from src.collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO +from src.collector_manager.DTOs.ExampleOutputDTO import ExampleOutputDTO +from src.collector_manager.enums import CollectorType from src.core.preprocessors.ExamplePreprocessor import ExamplePreprocessor diff --git a/collector_manager/README.md b/src/collector_manager/README.md similarity index 100% rename from collector_manager/README.md rename to src/collector_manager/README.md diff --git a/collector_manager/__init__.py b/src/collector_manager/__init__.py similarity index 100% rename from collector_manager/__init__.py rename to src/collector_manager/__init__.py diff --git a/collector_manager/collector_mapping.py b/src/collector_manager/collector_mapping.py similarity index 76% rename from collector_manager/collector_mapping.py rename to src/collector_manager/collector_mapping.py index 1b94d91a..0aee33b2 100644 --- a/collector_manager/collector_mapping.py +++ b/src/collector_manager/collector_mapping.py @@ -1,9 +1,9 @@ -from collector_manager.ExampleCollector import ExampleCollector -from collector_manager.enums import CollectorType +from src.collector_manager.ExampleCollector import ExampleCollector +from src.collector_manager.enums import CollectorType from src.source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector from src.source_collectors.ckan import CKANCollector from src.source_collectors.common_crawler import CommonCrawlerCollector -from src.source_collectors.muckrock.classes import MuckrockSimpleSearchCollector, \ +from src.source_collectors.muckrock.classes.MuckrockCollector import MuckrockSimpleSearchCollector, \ MuckrockCountyLevelSearchCollector, MuckrockAllFOIARequestsCollector COLLECTOR_MAPPING = { diff --git a/collector_manager/configs/sample_autogoogler_config.json b/src/collector_manager/configs/sample_autogoogler_config.json similarity index 100% rename from collector_manager/configs/sample_autogoogler_config.json rename to src/collector_manager/configs/sample_autogoogler_config.json diff --git a/collector_manager/enums.py b/src/collector_manager/enums.py similarity index 100% rename from collector_manager/enums.py rename to src/collector_manager/enums.py diff --git a/src/core/AsyncCore.py b/src/core/AsyncCore.py index c5af2977..180c652d 100644 --- a/src/core/AsyncCore.py +++ b/src/core/AsyncCore.py @@ -7,8 +7,8 @@ from src.db.DTOs.BatchInfo import BatchInfo from src.db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo from src.db.enums import TaskType -from collector_manager.AsyncCollectorManager import AsyncCollectorManager -from collector_manager.enums import CollectorType +from src.collector_manager.AsyncCollectorManager import AsyncCollectorManager +from src.collector_manager.enums import CollectorType from src.core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo from src.core.DTOs.CollectorStartInfo import CollectorStartInfo from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason diff --git a/src/core/DTOs/BatchStatusInfo.py b/src/core/DTOs/BatchStatusInfo.py index fbe2dc50..ad54686e 100644 --- a/src/core/DTOs/BatchStatusInfo.py +++ b/src/core/DTOs/BatchStatusInfo.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from collector_manager.enums import CollectorType +from src.collector_manager.enums import CollectorType from src.core.enums import BatchStatus diff --git a/src/core/DTOs/CollectorStartParams.py b/src/core/DTOs/CollectorStartParams.py index 5038afc6..6c7d4a61 100644 --- a/src/core/DTOs/CollectorStartParams.py +++ b/src/core/DTOs/CollectorStartParams.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from collector_manager.enums import CollectorType +from src.collector_manager import CollectorType class CollectorStartParams(BaseModel): diff --git a/src/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py b/src/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py index 37535f2d..fad69be5 100644 --- a/src/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py +++ b/src/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from collector_manager.enums import CollectorType +from src.collector_manager.enums import CollectorType class GetMetricsBatchesAggregatedInnerResponseDTO(BaseModel): diff --git a/src/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py b/src/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py index a6a28aa2..d5bdd0f6 100644 --- a/src/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py +++ b/src/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from collector_manager.enums import CollectorType +from src.collector_manager.enums import CollectorType from src.core.enums import BatchStatus diff --git a/src/core/DTOs/GetURLsResponseInfo.py b/src/core/DTOs/GetURLsResponseInfo.py index 3603ad94..a4f91f4f 100644 --- a/src/core/DTOs/GetURLsResponseInfo.py +++ b/src/core/DTOs/GetURLsResponseInfo.py @@ -3,8 +3,8 @@ from pydantic import BaseModel +from src.collector_manager.enums import URLStatus from src.db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource -from collector_manager.enums import URLStatus class GetURLsResponseErrorInfo(BaseModel): id: int diff --git a/src/core/DTOs/task_data_objects/AgencyIdentificationTDO.py b/src/core/DTOs/task_data_objects/AgencyIdentificationTDO.py index 10c3ce99..cc62430f 100644 --- a/src/core/DTOs/task_data_objects/AgencyIdentificationTDO.py +++ b/src/core/DTOs/task_data_objects/AgencyIdentificationTDO.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from collector_manager.enums import CollectorType +from src.collector_manager.enums import CollectorType class AgencyIdentificationTDO(BaseModel): diff --git a/src/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py b/src/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py index ff173a8e..1daa40b1 100644 --- a/src/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py +++ b/src/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py @@ -2,7 +2,8 @@ from pydantic import BaseModel -from collector_manager.enums import CollectorType +from src.collector_manager.enums import CollectorType + class URLHTMLMetadataInfo(BaseModel): title: Optional[str] = None diff --git a/src/core/classes/task_operators/AgencyIdentificationTaskOperator.py b/src/core/classes/task_operators/AgencyIdentificationTaskOperator.py index 2fede90e..80b09d56 100644 --- a/src/core/classes/task_operators/AgencyIdentificationTaskOperator.py +++ b/src/core/classes/task_operators/AgencyIdentificationTaskOperator.py @@ -4,7 +4,7 @@ from src.db.AsyncDatabaseClient import AsyncDatabaseClient from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo from src.db.enums import TaskType -from collector_manager.enums import CollectorType +from src.collector_manager.enums import CollectorType from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from src.core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase diff --git a/src/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py b/src/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py index e078d793..086631ca 100644 --- a/src/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py +++ b/src/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py @@ -3,7 +3,7 @@ from src.db.AsyncDatabaseClient import AsyncDatabaseClient from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo from src.db.enums import TaskType -from collector_manager.enums import CollectorType +from src.collector_manager.enums import CollectorType from src.core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase from src.core.classes.subtasks.MiscellaneousMetadata.AutoGooglerMiscMetadataSubtask import AutoGooglerMiscMetadataSubtask diff --git a/src/core/helpers.py b/src/core/helpers.py index ebc1aa8b..038e14b9 100644 --- a/src/core/helpers.py +++ b/src/core/helpers.py @@ -2,7 +2,7 @@ from src.core.enums import SuggestionType from src.core.exceptions import MatchAgencyError from src.pdap_api_client.DTOs import MatchAgencyResponse -from src.pdap_api_client import MatchAgencyResponseStatus +from src.pdap_api_client.enums import MatchAgencyResponseStatus def process_match_agency_response_to_suggestions( diff --git a/src/core/preprocessors/ExamplePreprocessor.py b/src/core/preprocessors/ExamplePreprocessor.py index e6537297..3bf93455 100644 --- a/src/core/preprocessors/ExamplePreprocessor.py +++ b/src/core/preprocessors/ExamplePreprocessor.py @@ -1,7 +1,7 @@ from typing import List from src.db.DTOs.URLInfo import URLInfo -from collector_manager.DTOs.ExampleOutputDTO import ExampleOutputDTO +from src.collector_manager.DTOs.ExampleOutputDTO import ExampleOutputDTO from src.core.preprocessors.PreprocessorBase import PreprocessorBase diff --git a/src/db/AsyncDatabaseClient.py b/src/db/AsyncDatabaseClient.py index 72a18644..e9b78952 100644 --- a/src/db/AsyncDatabaseClient.py +++ b/src/db/AsyncDatabaseClient.py @@ -12,6 +12,7 @@ from sqlalchemy.sql.functions import coalesce from starlette import status +from src.collector_manager.enums import URLStatus, CollectorType from src.db.ConfigManager import ConfigManager from src.db.DTOConverter import DTOConverter from src.db.DTOs.BatchInfo import BatchInfo @@ -31,7 +32,6 @@ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Duplicate, Log, \ BacklogSnapshot, URLDataSource, URLCheckedForDuplicate, URLProbedFor404 -from collector_manager.enums import URLStatus, CollectorType from src.core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason from src.core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO, GetMetricsBacklogResponseInnerDTO diff --git a/src/db/DTOs/URLInfo.py b/src/db/DTOs/URLInfo.py index 5a1d2221..3b6fc6b1 100644 --- a/src/db/DTOs/URLInfo.py +++ b/src/db/DTOs/URLInfo.py @@ -3,7 +3,7 @@ from pydantic import BaseModel -from collector_manager.enums import URLStatus +from src.collector_manager.enums import URLStatus class URLInfo(BaseModel): diff --git a/src/db/DatabaseClient.py b/src/db/DatabaseClient.py index 4a2a8bf7..0a6c2f02 100644 --- a/src/db/DatabaseClient.py +++ b/src/db/DatabaseClient.py @@ -5,6 +5,7 @@ from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import sessionmaker, scoped_session, Session +from src.collector_manager.enums import URLStatus from src.db.ConfigManager import ConfigManager from src.db.DTOs.BatchInfo import BatchInfo from src.db.DTOs.DuplicateInfo import DuplicateInsertInfo @@ -13,7 +14,6 @@ from src.db.DTOs.URLInfo import URLInfo from src.db.DTOs.URLMapping import URLMapping from src.db.models import Base, Batch, URL, Log, Duplicate, URLDataSource -from collector_manager.enums import URLStatus from src.core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmittedURLInfo from src.core.EnvVarManager import EnvVarManager from src.core.enums import BatchStatus diff --git a/src/db/StatementComposer.py b/src/db/StatementComposer.py index b17a41f6..77df0dac 100644 --- a/src/db/StatementComposer.py +++ b/src/db/StatementComposer.py @@ -3,10 +3,10 @@ from sqlalchemy import Select, select, exists, func, Subquery, and_, not_, ColumnElement from sqlalchemy.orm import aliased +from src.collector_manager.enums import URLStatus from src.db.enums import TaskType from src.db.models import URL, URLHTMLContent, AutomatedUrlAgencySuggestion, URLOptionalDataSourceMetadata, Batch, \ ConfirmedURLAgency, LinkTaskURL, Task, UserUrlAgencySuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion -from collector_manager.enums import URLStatus from src.core.enums import BatchStatus diff --git a/src/db/models.py b/src/db/models.py index c0a947b9..3c4b615f 100644 --- a/src/db/models.py +++ b/src/db/models.py @@ -8,7 +8,7 @@ from src.db.enums import PGEnum, TaskType from src.core.enums import BatchStatus, RecordType -from util.helper_functions import get_enum_values +from src.util.helper_functions import get_enum_values # Base class for SQLAlchemy ORM models Base = declarative_base() diff --git a/src/source_collectors/auto_googler/AutoGooglerCollector.py b/src/source_collectors/auto_googler/AutoGooglerCollector.py index 7fd875b3..f9d06265 100644 --- a/src/source_collectors/auto_googler/AutoGooglerCollector.py +++ b/src/source_collectors/auto_googler/AutoGooglerCollector.py @@ -1,13 +1,13 @@ -from collector_manager.AsyncCollectorBase import AsyncCollectorBase -from collector_manager.enums import CollectorType +from src.collector_manager.AsyncCollectorBase import AsyncCollectorBase +from src.collector_manager.enums import CollectorType from src.core.EnvVarManager import EnvVarManager from src.core.preprocessors.AutoGooglerPreprocessor import AutoGooglerPreprocessor from src.source_collectors.auto_googler.AutoGoogler import AutoGoogler from src.source_collectors.auto_googler.DTOs import AutoGooglerInputDTO, AutoGooglerInnerOutputDTO from src.source_collectors.auto_googler.GoogleSearcher import GoogleSearcher from src.source_collectors.auto_googler.SearchConfig import SearchConfig -from util.helper_functions import base_model_list_dump +from src.util.helper_functions import base_model_list_dump class AutoGooglerCollector(AsyncCollectorBase): diff --git a/src/source_collectors/ckan/CKANCollector.py b/src/source_collectors/ckan/CKANCollector.py index 8302634d..2dee4258 100644 --- a/src/source_collectors/ckan/CKANCollector.py +++ b/src/source_collectors/ckan/CKANCollector.py @@ -1,14 +1,14 @@ from pydantic import BaseModel -from collector_manager.AsyncCollectorBase import AsyncCollectorBase -from collector_manager.enums import CollectorType +from src.collector_manager.AsyncCollectorBase import AsyncCollectorBase +from src.collector_manager.enums import CollectorType from src.core.preprocessors.CKANPreprocessor import CKANPreprocessor from src.source_collectors.ckan.DTOs import CKANInputDTO from src.source_collectors.ckan.ckan_scraper_toolkit import ckan_package_search, ckan_group_package_show, \ ckan_package_search_from_organization from src.source_collectors.ckan.scrape_ckan_data_portals import perform_search, get_flat_list, deduplicate_entries, \ get_collections, filter_result, parse_result -from util.helper_functions import base_model_list_dump +from src.util.helper_functions import base_model_list_dump SEARCH_FUNCTION_MAPPINGS = { "package_search": ckan_package_search, diff --git a/src/source_collectors/common_crawler/CommonCrawlerCollector.py b/src/source_collectors/common_crawler/CommonCrawlerCollector.py index e471db2c..571a847e 100644 --- a/src/source_collectors/common_crawler/CommonCrawlerCollector.py +++ b/src/source_collectors/common_crawler/CommonCrawlerCollector.py @@ -1,5 +1,5 @@ -from collector_manager.AsyncCollectorBase import AsyncCollectorBase -from collector_manager.enums import CollectorType +from src.collector_manager.AsyncCollectorBase import AsyncCollectorBase +from src.collector_manager.enums import CollectorType from src.core.preprocessors.CommonCrawlerPreprocessor import CommonCrawlerPreprocessor from src.source_collectors.common_crawler.CommonCrawler import CommonCrawler from src.source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO diff --git a/src/source_collectors/muckrock/classes/MuckrockCollector.py b/src/source_collectors/muckrock/classes/MuckrockCollector.py index 38f6a424..38a52af8 100644 --- a/src/source_collectors/muckrock/classes/MuckrockCollector.py +++ b/src/source_collectors/muckrock/classes/MuckrockCollector.py @@ -1,7 +1,7 @@ import itertools -from collector_manager.AsyncCollectorBase import AsyncCollectorBase -from collector_manager.enums import CollectorType +from src.collector_manager.AsyncCollectorBase import AsyncCollectorBase +from src.collector_manager.enums import CollectorType from src.core.preprocessors.MuckrockPreprocessor import MuckrockPreprocessor from src.source_collectors.muckrock.DTOs import MuckrockAllFOIARequestsCollectorInputDTO, \ MuckrockCountySearchCollectorInputDTO, MuckrockSimpleSearchCollectorInputDTO diff --git a/util/__init__.py b/src/util/__init__.py similarity index 100% rename from util/__init__.py rename to src/util/__init__.py diff --git a/util/alembic_helpers.py b/src/util/alembic_helpers.py similarity index 100% rename from util/alembic_helpers.py rename to src/util/alembic_helpers.py diff --git a/util/db_manager.py b/src/util/db_manager.py similarity index 100% rename from util/db_manager.py rename to src/util/db_manager.py diff --git a/util/helper_functions.py b/src/util/helper_functions.py similarity index 100% rename from util/helper_functions.py rename to src/util/helper_functions.py diff --git a/util/miscellaneous_functions.py b/src/util/miscellaneous_functions.py similarity index 100% rename from util/miscellaneous_functions.py rename to src/util/miscellaneous_functions.py diff --git a/tests/automated/integration/api/conftest.py b/tests/automated/integration/api/conftest.py index de1574ab..dab293db 100644 --- a/tests/automated/integration/api/conftest.py +++ b/tests/automated/integration/api/conftest.py @@ -7,9 +7,9 @@ import pytest_asyncio from starlette.testclient import TestClient -from api.main import app +from src.api.main import app +from src.api.routes.review import requires_final_review_permission from src.core.AsyncCore import AsyncCore -from api.routes.review import requires_final_review_permission from src.core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse from src.core.SourceCollectorCore import SourceCollectorCore from src.core.enums import BatchStatus diff --git a/tests/automated/integration/api/helpers/RequestValidator.py b/tests/automated/integration/api/helpers/RequestValidator.py index a3ff5898..145235b4 100644 --- a/tests/automated/integration/api/helpers/RequestValidator.py +++ b/tests/automated/integration/api/helpers/RequestValidator.py @@ -9,8 +9,8 @@ from src.db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo from src.db.DTOs.TaskInfo import TaskInfo from src.db.enums import TaskType -from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from collector_manager.enums import CollectorType +from src.collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO +from src.collector_manager.enums import CollectorType from src.core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewRejectionInfo from src.core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse @@ -38,7 +38,7 @@ from src.core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo from src.core.DTOs.SearchURLResponse import SearchURLResponse from src.core.enums import BatchStatus -from util.helper_functions import update_if_not_none +from src.util.helper_functions import update_if_not_none class ExpectedResponseInfo(BaseModel): diff --git a/tests/automated/integration/api/test_annotate.py b/tests/automated/integration/api/test_annotate.py index f4e43e13..89c695f1 100644 --- a/tests/automated/integration/api/test_annotate.py +++ b/tests/automated/integration/api/test_annotate.py @@ -15,9 +15,9 @@ from src.core.classes.ErrorManager import ErrorTypes from src.core.enums import RecordType, SuggestionType, SuggestedStatus from src.core.exceptions import FailedValidationException +from src.html_tag_collector.DataClassTags import ResponseHTMLInfo from tests.helpers.complex_test_data_functions import AnnotateAgencySetupInfo, setup_for_annotate_agency, \ setup_for_get_next_url_for_final_review -from src.html_tag_collector import ResponseHTMLInfo from tests.helpers.DBDataCreator import BatchURLCreationInfo from tests.automated.integration.api.conftest import MOCK_USER_ID diff --git a/tests/automated/integration/api/test_batch.py b/tests/automated/integration/api/test_batch.py index 3a3c3178..082f932b 100644 --- a/tests/automated/integration/api/test_batch.py +++ b/tests/automated/integration/api/test_batch.py @@ -2,8 +2,8 @@ from src.db.DTOs.BatchInfo import BatchInfo from src.db.DTOs.InsertURLsInfo import InsertURLsInfo -from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from collector_manager.enums import CollectorType, URLStatus +from src.collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO +from src.collector_manager.enums import CollectorType, URLStatus from src.core.enums import BatchStatus @pytest.mark.asyncio diff --git a/tests/automated/integration/api/test_duplicates.py b/tests/automated/integration/api/test_duplicates.py index 4d500a48..e96588d4 100644 --- a/tests/automated/integration/api/test_duplicates.py +++ b/tests/automated/integration/api/test_duplicates.py @@ -1,7 +1,7 @@ import pytest from src.db.DTOs.BatchInfo import BatchInfo -from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO +from src.collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO from tests.automated.integration.api.conftest import disable_task_trigger diff --git a/tests/automated/integration/api/test_example_collector.py b/tests/automated/integration/api/test_example_collector.py index c72c04cc..fbc77005 100644 --- a/tests/automated/integration/api/test_example_collector.py +++ b/tests/automated/integration/api/test_example_collector.py @@ -3,11 +3,11 @@ import pytest -from src.db import AsyncDatabaseClient +from src.db.AsyncDatabaseClient import AsyncDatabaseClient from src.db.DTOs.BatchInfo import BatchInfo -from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from collector_manager.ExampleCollector import ExampleCollector -from collector_manager.enums import CollectorType +from src.collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO +from src.collector_manager.ExampleCollector import ExampleCollector +from src.collector_manager.enums import CollectorType from src.core.AsyncCoreLogger import AsyncCoreLogger from src.core.DTOs.BatchStatusInfo import BatchStatusInfo from src.core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse diff --git a/tests/automated/integration/api/test_manual_batch.py b/tests/automated/integration/api/test_manual_batch.py index d958fa1c..85a8cdec 100644 --- a/tests/automated/integration/api/test_manual_batch.py +++ b/tests/automated/integration/api/test_manual_batch.py @@ -2,7 +2,7 @@ import pytest from src.db.models import Batch, URL, URLOptionalDataSourceMetadata -from collector_manager.enums import CollectorType +from src.collector_manager.enums import CollectorType from src.core.DTOs.ManualBatchInputDTO import ManualBatchInnerInputDTO, ManualBatchInputDTO from src.core.enums import RecordType diff --git a/tests/automated/integration/api/test_metrics.py b/tests/automated/integration/api/test_metrics.py index cb37e2e9..16611b0e 100644 --- a/tests/automated/integration/api/test_metrics.py +++ b/tests/automated/integration/api/test_metrics.py @@ -1,7 +1,7 @@ import pendulum import pytest -from collector_manager.enums import URLStatus, CollectorType +from src.collector_manager.enums import URLStatus, CollectorType from src.core.enums import BatchStatus, RecordType, SuggestedStatus from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters, \ AnnotationInfo diff --git a/tests/automated/integration/api/test_review.py b/tests/automated/integration/api/test_review.py index 16905ca6..0e347a77 100644 --- a/tests/automated/integration/api/test_review.py +++ b/tests/automated/integration/api/test_review.py @@ -2,7 +2,7 @@ from src.db.constants import PLACEHOLDER_AGENCY_NAME from src.db.models import URL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency -from collector_manager.enums import URLStatus +from src.collector_manager.enums import URLStatus from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason, \ FinalReviewRejectionInfo from src.core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse diff --git a/tests/automated/integration/collector_db/test_database_structure.py b/tests/automated/integration/collector_db/test_database_structure.py index 441835fb..022b5502 100644 --- a/tests/automated/integration/collector_db/test_database_structure.py +++ b/tests/automated/integration/collector_db/test_database_structure.py @@ -20,11 +20,11 @@ from src.db.enums import URLHTMLContentType from src.db.helper_functions import get_postgres_connection_string from src.db.models import Base, Agency -from collector_manager.enums import CollectorType, URLStatus +from src.collector_manager.enums import CollectorType, URLStatus from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from src.core.enums import BatchStatus, SuggestionType +from src.util.helper_functions import get_enum_values from tests.helpers.DBDataCreator import DBDataCreator -from util.helper_functions import get_enum_values SATypes: TypeAlias = sa.Integer or sa.String or postgresql.ENUM or sa.TIMESTAMP or sa.Text diff --git a/tests/automated/integration/collector_db/test_db_client.py b/tests/automated/integration/collector_db/test_db_client.py index 2b521914..5f8faa05 100644 --- a/tests/automated/integration/collector_db/test_db_client.py +++ b/tests/automated/integration/collector_db/test_db_client.py @@ -3,15 +3,15 @@ import pytest from fastapi import HTTPException -from src.db import AsyncDatabaseClient +from src.db.AsyncDatabaseClient import AsyncDatabaseClient from src.db.DTOs.BatchInfo import BatchInfo from src.db.DTOs.LogInfo import LogInfo from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from src.db.DTOs import URLInfo +from src.db.DTOs.URLInfo import URLInfo from src.db.DTOs.URLMapping import URLMapping from src.db.constants import PLACEHOLDER_AGENCY_NAME from src.db.models import URL, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency -from collector_manager.enums import URLStatus +from src.collector_manager.enums import URLStatus from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from src.core.enums import BatchStatus, RecordType, SuggestionType, SuggestedStatus from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation, setup_for_annotate_agency diff --git a/tests/automated/integration/conftest.py b/tests/automated/integration/conftest.py index 6c224de2..8aa79e36 100644 --- a/tests/automated/integration/conftest.py +++ b/tests/automated/integration/conftest.py @@ -2,8 +2,8 @@ import pytest -from src.db import AsyncDatabaseClient -from collector_manager.AsyncCollectorManager import AsyncCollectorManager +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.collector_manager.AsyncCollectorManager import AsyncCollectorManager from src.core.AsyncCore import AsyncCore from src.core.AsyncCoreLogger import AsyncCoreLogger from src.core.SourceCollectorCore import SourceCollectorCore diff --git a/tests/automated/integration/core/test_example_collector_lifecycle.py b/tests/automated/integration/core/test_example_collector_lifecycle.py index 4efb2f21..936be0d8 100644 --- a/tests/automated/integration/core/test_example_collector_lifecycle.py +++ b/tests/automated/integration/core/test_example_collector_lifecycle.py @@ -3,8 +3,8 @@ import pytest from src.db.DTOs.BatchInfo import BatchInfo -from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from collector_manager.enums import CollectorType, URLStatus +from src.collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO +from src.collector_manager.enums import CollectorType, URLStatus from src.core.AsyncCore import AsyncCore from src.core.DTOs.CollectorStartInfo import CollectorStartInfo from src.core.SourceCollectorCore import SourceCollectorCore diff --git a/tests/automated/integration/html_tag_collector/test_root_url_cache.py b/tests/automated/integration/html_tag_collector/test_root_url_cache.py index c552c7f7..f24fdca9 100644 --- a/tests/automated/integration/html_tag_collector/test_root_url_cache.py +++ b/tests/automated/integration/html_tag_collector/test_root_url_cache.py @@ -1,6 +1,6 @@ import pytest -from src.html_tag_collector import RootURLCacheResponseInfo, RootURLCache +from src.html_tag_collector.RootURLCache import RootURLCacheResponseInfo, RootURLCache async def mock_get_request(url: str) -> RootURLCacheResponseInfo: diff --git a/tests/automated/integration/security_manager/test_security_manager.py b/tests/automated/integration/security_manager/test_security_manager.py index 1d046162..295b67b0 100644 --- a/tests/automated/integration/security_manager/test_security_manager.py +++ b/tests/automated/integration/security_manager/test_security_manager.py @@ -2,10 +2,10 @@ import pytest from starlette.testclient import TestClient -from api.main import app +from src.api.main import app from src.security_manager.SecurityManager import Permissions, ALGORITHM -PATCH_ROOT = "security_manager.SecurityManager" +PATCH_ROOT = "src.security_manager.SecurityManager" def get_patch_path(patch_name): return f"{PATCH_ROOT}.{patch_name}" diff --git a/tests/automated/integration/tasks/test_agency_preannotation_task.py b/tests/automated/integration/tasks/test_agency_preannotation_task.py index 0656141b..afd55c85 100644 --- a/tests/automated/integration/tasks/test_agency_preannotation_task.py +++ b/tests/automated/integration/tasks/test_agency_preannotation_task.py @@ -5,10 +5,11 @@ import pytest from aiohttp import ClientSession +from src.pdap_api_client.enums import MatchAgencyResponseStatus from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters from src.source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponseType, AgencyLookupResponse from src.db.models import Agency, AutomatedUrlAgencySuggestion -from collector_manager.enums import CollectorType, URLStatus +from src.collector_manager.enums import CollectorType, URLStatus from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from src.core.classes.task_operators.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator @@ -20,7 +21,6 @@ from pdap_access_manager import AccessManager from src.pdap_api_client.DTOs import MatchAgencyResponse, MatchAgencyInfo from src.pdap_api_client.PDAPClient import PDAPClient -from src.pdap_api_client import MatchAgencyResponseStatus from tests.helpers.DBDataCreator import DBDataCreator, BatchURLCreationInfoV2 sample_agency_suggestions = [ diff --git a/tests/automated/integration/tasks/test_submit_approved_url_task.py b/tests/automated/integration/tasks/test_submit_approved_url_task.py index 99642768..f561af17 100644 --- a/tests/automated/integration/tasks/test_submit_approved_url_task.py +++ b/tests/automated/integration/tasks/test_submit_approved_url_task.py @@ -6,7 +6,7 @@ from src.db.enums import TaskType from src.db.models import URL, URLErrorInfo, URLDataSource -from collector_manager.enums import URLStatus +from src.collector_manager.enums import URLStatus from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from src.core.classes.task_operators.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator diff --git a/tests/automated/integration/tasks/test_url_404_probe.py b/tests/automated/integration/tasks/test_url_404_probe.py index a141ec97..63283751 100644 --- a/tests/automated/integration/tasks/test_url_404_probe.py +++ b/tests/automated/integration/tasks/test_url_404_probe.py @@ -6,7 +6,7 @@ from aiohttp import ClientResponseError, RequestInfo from src.db.models import URLProbedFor404, URL -from collector_manager.enums import URLStatus +from src.collector_manager.enums import URLStatus from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from src.core.classes.task_operators.URL404ProbeTaskOperator import URL404ProbeTaskOperator from src.html_tag_collector.URLRequestInterface import URLResponseInfo, URLRequestInterface diff --git a/tests/automated/integration/tasks/test_url_duplicate_task.py b/tests/automated/integration/tasks/test_url_duplicate_task.py index 2c8a80a5..32bb435f 100644 --- a/tests/automated/integration/tasks/test_url_duplicate_task.py +++ b/tests/automated/integration/tasks/test_url_duplicate_task.py @@ -5,7 +5,7 @@ from src.db.DTOs.URLMapping import URLMapping from src.db.models import URL, URLCheckedForDuplicate -from collector_manager.enums import URLStatus +from src.collector_manager.enums import URLStatus from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from src.core.classes.task_operators.URLDuplicateTaskOperator import URLDuplicateTaskOperator from tests.helpers.DBDataCreator import DBDataCreator diff --git a/tests/automated/integration/tasks/test_url_html_task.py b/tests/automated/integration/tasks/test_url_html_task.py index 6e521a4b..273a4c97 100644 --- a/tests/automated/integration/tasks/test_url_html_task.py +++ b/tests/automated/integration/tasks/test_url_html_task.py @@ -5,15 +5,15 @@ import pytest from aiohttp import ClientResponseError, RequestInfo -from src.db import AsyncDatabaseClient +from src.db.AsyncDatabaseClient import AsyncDatabaseClient from src.db.enums import TaskType -from collector_manager.enums import URLStatus +from src.collector_manager.enums import URLStatus from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from src.core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator +from src.html_tag_collector.DataClassTags import ResponseHTMLInfo from tests.helpers.DBDataCreator import DBDataCreator -from src.html_tag_collector import ResponseHTMLInfo from src.html_tag_collector.ResponseParser import HTMLResponseParser -from src.html_tag_collector import RootURLCache +from src.html_tag_collector.RootURLCache import RootURLCache from src.html_tag_collector.URLRequestInterface import URLRequestInterface, URLResponseInfo diff --git a/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py b/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py index b6094d5f..e6a5a72f 100644 --- a/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py +++ b/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py @@ -3,7 +3,7 @@ import pytest from src.db.models import URL, URLOptionalDataSourceMetadata -from collector_manager.enums import CollectorType +from src.collector_manager.enums import CollectorType from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome from src.core.classes.task_operators.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator from tests.helpers.DBDataCreator import DBDataCreator diff --git a/tests/automated/unit/security_manager/test_security_manager.py b/tests/automated/unit/security_manager/test_security_manager.py index 4b557bba..8f650e25 100644 --- a/tests/automated/unit/security_manager/test_security_manager.py +++ b/tests/automated/unit/security_manager/test_security_manager.py @@ -11,7 +11,7 @@ INVALID_TOKEN = "invalid_token" FAKE_PAYLOAD = {"sub": 1, "permissions": [Permissions.SOURCE_COLLECTOR.value]} -PATCH_ROOT = "security_manager.SecurityManager" +PATCH_ROOT = "src.security_manager.SecurityManager" def get_patch_path(patch_name): return f"{PATCH_ROOT}.{patch_name}" diff --git a/tests/automated/unit/source_collectors/test_autogoogler_collector.py b/tests/automated/unit/source_collectors/test_autogoogler_collector.py index 2b495533..a8b74d9e 100644 --- a/tests/automated/unit/source_collectors/test_autogoogler_collector.py +++ b/tests/automated/unit/source_collectors/test_autogoogler_collector.py @@ -2,8 +2,8 @@ import pytest -from src.db import AsyncDatabaseClient -from src.db.DTOs import URLInfo +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.DTOs.URLInfo import URLInfo from src.core.AsyncCoreLogger import AsyncCoreLogger from src.source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector from src.source_collectors.auto_googler.DTOs import GoogleSearchQueryResultsInnerDTO, AutoGooglerInputDTO @@ -11,7 +11,7 @@ @pytest.fixture def patch_get_query_results(monkeypatch): - patch_path = "source_collectors.auto_googler.GoogleSearcher.GoogleSearcher.get_query_results" + patch_path = "src.source_collectors.auto_googler.GoogleSearcher.GoogleSearcher.get_query_results" mock = AsyncMock() mock.side_effect = [ [GoogleSearchQueryResultsInnerDTO(url="https://include.com/1", title="keyword", snippet="snippet 1"),], diff --git a/tests/automated/unit/source_collectors/test_ckan_collector.py b/tests/automated/unit/source_collectors/test_ckan_collector.py deleted file mode 100644 index 7dc7761a..00000000 --- a/tests/automated/unit/source_collectors/test_ckan_collector.py +++ /dev/null @@ -1,63 +0,0 @@ -import json -import pickle -from unittest.mock import AsyncMock - -import pytest - -from src.db import AsyncDatabaseClient -from src.core.AsyncCoreLogger import AsyncCoreLogger -from src.source_collectors.ckan import CKANCollector -from src.source_collectors.ckan.DTOs import CKANInputDTO - - -@pytest.fixture -def mock_ckan_collector_methods(monkeypatch): - mock = AsyncMock() - - mock_path = "source_collectors.ckan.CKANCollector.CKANCollector.get_results" - with open("tests/test_data/ckan_get_result_test_data.json", "r", encoding="utf-8") as f: - data = json.load(f) - - mock.get_results = AsyncMock() - mock.get_results.return_value = data - monkeypatch.setattr(mock_path, mock.get_results) - - mock_path = "source_collectors.ckan.CKANCollector.CKANCollector.add_collection_child_packages" - with open("tests/test_data/ckan_add_collection_child_packages.pkl", "rb") as f: - data = pickle.load(f) - - mock.add_collection_child_packages = AsyncMock() - mock.add_collection_child_packages.return_value = data - monkeypatch.setattr(mock_path, mock.add_collection_child_packages) - - - - yield mock - -@pytest.mark.asyncio -async def test_ckan_collector(mock_ckan_collector_methods): - mock = mock_ckan_collector_methods - - collector = CKANCollector( - batch_id=1, - dto=CKANInputDTO(), - logger=AsyncMock(spec=AsyncCoreLogger), - adb_client=AsyncMock(spec=AsyncDatabaseClient), - raise_error=True - ) - await collector.run() - - mock.get_results.assert_called_once() - mock.add_collection_child_packages.assert_called_once() - - collector.adb_client.insert_urls.assert_called_once() - url_infos = collector.adb_client.insert_urls.call_args[1]['url_infos'] - assert len(url_infos) == 2560 - first_url_info = url_infos[0] - assert first_url_info.url == 'https://catalog.data.gov/dataset/crash-reporting-drivers-data' - assert first_url_info.collector_metadata['submitted_name'] == 'Crash Reporting - Drivers Data' - - last_url_info = url_infos[-1] - assert last_url_info.url == 'https://data.houstontx.gov/dataset/houston-police-department-crime-statistics' - assert last_url_info.collector_metadata["description"] == 'Multiple datasets related to Houston Police Department Crime Stats' - diff --git a/tests/automated/unit/source_collectors/test_common_crawl_collector.py b/tests/automated/unit/source_collectors/test_common_crawl_collector.py index daf5d711..0f7ccab3 100644 --- a/tests/automated/unit/source_collectors/test_common_crawl_collector.py +++ b/tests/automated/unit/source_collectors/test_common_crawl_collector.py @@ -2,16 +2,16 @@ import pytest -from src.db import AsyncDatabaseClient -from src.db.DTOs import URLInfo +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.DTOs.URLInfo import URLInfo from src.core.AsyncCoreLogger import AsyncCoreLogger -from src.source_collectors.common_crawler import CommonCrawlerCollector +from src.source_collectors.common_crawler.CommonCrawlerCollector import CommonCrawlerCollector from src.source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO @pytest.fixture def mock_get_common_crawl_search_results(): - mock_path = "source_collectors.common_crawler.CommonCrawler.get_common_crawl_search_results" + mock_path = "src.source_collectors.common_crawler.CommonCrawler.get_common_crawl_search_results" # Results contain other keys, but those are not relevant and thus # can be ignored mock_results = [ diff --git a/tests/automated/unit/source_collectors/test_example_collector.py b/tests/automated/unit/source_collectors/test_example_collector.py index bba3f8d1..b0aa69cb 100644 --- a/tests/automated/unit/source_collectors/test_example_collector.py +++ b/tests/automated/unit/source_collectors/test_example_collector.py @@ -1,8 +1,8 @@ from unittest.mock import AsyncMock from src.db.DatabaseClient import DatabaseClient -from collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from collector_manager.ExampleCollector import ExampleCollector +from src.collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO +from src.collector_manager.ExampleCollector import ExampleCollector from src.core.AsyncCoreLogger import AsyncCoreLogger diff --git a/tests/automated/unit/source_collectors/test_muckrock_collectors.py b/tests/automated/unit/source_collectors/test_muckrock_collectors.py index 0d839d57..a73e156a 100644 --- a/tests/automated/unit/source_collectors/test_muckrock_collectors.py +++ b/tests/automated/unit/source_collectors/test_muckrock_collectors.py @@ -3,19 +3,19 @@ import pytest -from src.db import AsyncDatabaseClient -from src.db.DTOs import URLInfo +from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.DTOs.URLInfo import URLInfo from src.core.AsyncCoreLogger import AsyncCoreLogger from src.source_collectors.muckrock.DTOs import MuckrockSimpleSearchCollectorInputDTO, \ MuckrockCountySearchCollectorInputDTO, MuckrockAllFOIARequestsCollectorInputDTO -from src.source_collectors.muckrock.classes import MuckrockSimpleSearchCollector, \ +from src.source_collectors.muckrock.classes.MuckrockCollector import MuckrockSimpleSearchCollector, \ MuckrockCountyLevelSearchCollector, MuckrockAllFOIARequestsCollector -from src.source_collectors.muckrock.classes import FOIAFetchRequest +from src.source_collectors.muckrock.classes.muckrock_fetchers.FOIAFetcher import FOIAFetchRequest @pytest.fixture def patch_muckrock_fetcher(monkeypatch): - patch_path = "source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher.MuckrockFetcher.fetch" + patch_path = "src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher.MuckrockFetcher.fetch" inner_test_data = [ {"absolute_url": "https://include.com/1", "title": "keyword"}, {"absolute_url": "https://include.com/2", "title": "keyword"}, @@ -66,7 +66,7 @@ async def test_muckrock_simple_collector(patch_muckrock_fetcher): @pytest.fixture def patch_muckrock_county_level_search_collector_methods(monkeypatch): - patch_root = ("source_collectors.muckrock.classes.MuckrockCollector." + patch_root = ("src.source_collectors.muckrock.classes.MuckrockCollector." "MuckrockCountyLevelSearchCollector.") patch_path_get_jurisdiction_ids = patch_root + "get_jurisdiction_ids" patch_path_get_foia_records = patch_root + "get_foia_records" @@ -125,7 +125,7 @@ async def test_muckrock_county_search_collector(patch_muckrock_county_level_sear @pytest.fixture def patch_muckrock_full_search_collector(monkeypatch): - patch_path = ("source_collectors.muckrock.classes.MuckrockCollector." + patch_path = ("src.source_collectors.muckrock.classes.MuckrockCollector." "MuckrockAllFOIARequestsCollector.get_page_data") test_data = [{ "results": [ @@ -148,7 +148,7 @@ def patch_muckrock_full_search_collector(monkeypatch): mock.get_page_data = AsyncMock(return_value=test_data) monkeypatch.setattr(patch_path, mock.get_page_data) - patch_path = ("source_collectors.muckrock.classes.MuckrockCollector." + patch_path = ("src.source_collectors.muckrock.classes.MuckrockCollector." "FOIAFetcher") mock.foia_fetcher = MagicMock() monkeypatch.setattr(patch_path, mock.foia_fetcher) diff --git a/tests/conftest.py b/tests/conftest.py index ae002d5a..cab4a2ad 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,14 +3,14 @@ from sqlalchemy import create_engine, inspect, MetaData from sqlalchemy.orm import scoped_session, sessionmaker -from src.db import AsyncDatabaseClient +from src.db.AsyncDatabaseClient import AsyncDatabaseClient from src.db.DatabaseClient import DatabaseClient from src.db.helper_functions import get_postgres_connection_string from src.db.models import Base from src.core.EnvVarManager import EnvVarManager +from src.util.helper_functions import load_from_environment from tests.helpers.AlembicRunner import AlembicRunner from tests.helpers.DBDataCreator import DBDataCreator -from util.helper_functions import load_from_environment @pytest.fixture(autouse=True, scope="session") diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/DBDataCreator.py index 7734e7c0..8e03eeed 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/DBDataCreator.py @@ -4,17 +4,17 @@ from pydantic import BaseModel -from src.db import AsyncDatabaseClient +from src.db.AsyncDatabaseClient import AsyncDatabaseClient from src.db.DTOs.BatchInfo import BatchInfo from src.db.DTOs.DuplicateInfo import DuplicateInsertInfo from src.db.DTOs.InsertURLsInfo import InsertURLsInfo from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType -from src.db.DTOs import URLInfo +from src.db.DTOs.URLInfo import URLInfo from src.db.DTOs.URLMapping import URLMapping from src.db.DatabaseClient import DatabaseClient from src.db.enums import TaskType -from collector_manager.enums import CollectorType, URLStatus +from src.collector_manager.enums import CollectorType, URLStatus from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo from src.core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmittedURLInfo diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index e9935546..5d1e237c 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -4,7 +4,7 @@ from src.db.DTOs.InsertURLsInfo import InsertURLsInfo from src.db.DTOs.URLMapping import URLMapping -from collector_manager.enums import URLStatus +from src.collector_manager.enums import URLStatus from src.core.enums import RecordType, SuggestionType from tests.helpers.DBDataCreator import BatchURLCreationInfo from tests.helpers.DBDataCreator import DBDataCreator diff --git a/tests/helpers/patch_functions.py b/tests/helpers/patch_functions.py index bb805d29..a5798014 100644 --- a/tests/helpers/patch_functions.py +++ b/tests/helpers/patch_functions.py @@ -4,7 +4,7 @@ async def block_sleep(monkeypatch) -> AwaitableBarrier: barrier = AwaitableBarrier() monkeypatch.setattr( - "collector_manager.ExampleCollector.ExampleCollector.sleep", + "src.collector_manager.ExampleCollector.ExampleCollector.sleep", barrier ) return barrier diff --git a/tests/helpers/test_batch_creation_parameters.py b/tests/helpers/test_batch_creation_parameters.py index 6f02f240..7952b762 100644 --- a/tests/helpers/test_batch_creation_parameters.py +++ b/tests/helpers/test_batch_creation_parameters.py @@ -3,7 +3,7 @@ from pydantic import BaseModel, model_validator -from collector_manager.enums import URLStatus, CollectorType +from src.collector_manager.enums import URLStatus, CollectorType from src.core.enums import BatchStatus, RecordType, SuggestedStatus diff --git a/tests/manual/api/test_authorization.py b/tests/manual/api/test_authorization.py index d17fbe1c..062b8d66 100644 --- a/tests/manual/api/test_authorization.py +++ b/tests/manual/api/test_authorization.py @@ -3,7 +3,7 @@ def test_root_endpoint_without_mocked_dependency(): # Here, we use the app without a dependency override - from api.main import app + from src.api.main import app with TestClient(app) as c: response = c.get( url="/", diff --git a/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py b/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py index 9d40eeda..3e545b2e 100644 --- a/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py +++ b/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py @@ -2,9 +2,8 @@ import dotenv -import api.dependencies from src.db.DTOs.BatchInfo import BatchInfo -from collector_manager.enums import CollectorType +from src.collector_manager import CollectorType from src.core.enums import BatchStatus from test_automated.integration.core.helpers.common_test_procedures import run_collector_and_wait_for_completion @@ -12,7 +11,7 @@ def test_auto_googler_collector_lifecycle(test_core): # TODO: Rework for Async ci = test_core - db_client = api.dependencies.db_client + db_client = src.api.dependencies.db_client dotenv.load_dotenv() config = { @@ -30,7 +29,7 @@ def test_auto_googler_collector_lifecycle(test_core): config=config ) - batch_info: BatchInfo = api.dependencies.db_client.get_batch_by_id(1) + batch_info: BatchInfo = src.api.dependencies.db_client.get_batch_by_id(1) assert batch_info.strategy == "auto_googler" assert batch_info.status == BatchStatus.READY_TO_LABEL assert batch_info.total_url_count == 20 diff --git a/tests/manual/core/lifecycle/test_ckan_lifecycle.py b/tests/manual/core/lifecycle/test_ckan_lifecycle.py index b4ad5bdd..567d8f9b 100644 --- a/tests/manual/core/lifecycle/test_ckan_lifecycle.py +++ b/tests/manual/core/lifecycle/test_ckan_lifecycle.py @@ -1,7 +1,5 @@ - -import api.dependencies from src.db.DTOs.BatchInfo import BatchInfo -from collector_manager.enums import CollectorType +from src.collector_manager import CollectorType from src.core.enums import BatchStatus from src.source_collectors.ckan.search_terms import group_search, package_search, organization_search from test_automated.integration.core.helpers.common_test_procedures import run_collector_and_wait_for_completion @@ -9,7 +7,7 @@ def test_ckan_lifecycle(test_core): ci = test_core - db_client = api.dependencies.db_client + db_client = src.api.dependencies.db_client config = { "package_search": package_search, diff --git a/tests/manual/core/lifecycle/test_common_crawler_lifecycle.py b/tests/manual/core/lifecycle/test_common_crawler_lifecycle.py index fa3ad99d..3883c864 100644 --- a/tests/manual/core/lifecycle/test_common_crawler_lifecycle.py +++ b/tests/manual/core/lifecycle/test_common_crawler_lifecycle.py @@ -1,14 +1,13 @@ import time -import api.dependencies -from collector_manager.enums import CollectorType +from src.collector_manager import CollectorType from src.core.SourceCollectorCore import SourceCollectorCore from src.core.enums import BatchStatus def test_common_crawler_lifecycle(test_core: SourceCollectorCore): core = test_core - db_client = api.dependencies.db_client + db_client = src.api.dependencies.db_client config = { "common_crawl_id": "CC-MAIN-2023-50", diff --git a/tests/manual/core/lifecycle/test_muckrock_lifecycles.py b/tests/manual/core/lifecycle/test_muckrock_lifecycles.py index c777be3d..a5dfce38 100644 --- a/tests/manual/core/lifecycle/test_muckrock_lifecycles.py +++ b/tests/manual/core/lifecycle/test_muckrock_lifecycles.py @@ -1,7 +1,5 @@ - -import api.dependencies from src.db.DTOs.BatchInfo import BatchInfo -from collector_manager.enums import CollectorType +from src.collector_manager import CollectorType from src.core.enums import BatchStatus from test_automated.integration.core.helpers.common_test_procedures import run_collector_and_wait_for_completion from test_automated.integration.core.helpers.constants import ALLEGHENY_COUNTY_MUCKROCK_ID, ALLEGHENY_COUNTY_TOWN_NAMES @@ -9,7 +7,7 @@ def test_muckrock_simple_search_collector_lifecycle(test_core): ci = test_core - db_client = api.dependencies.db_client + db_client = src.api.dependencies.db_client config = { "search_string": "police", @@ -31,7 +29,7 @@ def test_muckrock_simple_search_collector_lifecycle(test_core): def test_muckrock_county_level_search_collector_lifecycle(test_core): ci = test_core - db_client = api.dependencies.db_client + db_client = src.api.dependencies.db_client config = { "parent_jurisdiction_id": ALLEGHENY_COUNTY_MUCKROCK_ID, @@ -53,7 +51,7 @@ def test_muckrock_county_level_search_collector_lifecycle(test_core): def test_muckrock_full_search_collector_lifecycle(test_core): ci = test_core - db_client = api.dependencies.db_client + db_client = src.api.dependencies.db_client config = { "start_page": 1, diff --git a/tests/manual/pdap_client/test_access_manager.py b/tests/manual/pdap_client/test_access_manager.py index b1245eca..2844464a 100644 --- a/tests/manual/pdap_client/test_access_manager.py +++ b/tests/manual/pdap_client/test_access_manager.py @@ -2,7 +2,7 @@ from aiohttp import ClientSession from pdap_access_manager import AccessManager -from util.helper_functions import get_from_env +from src.util import get_from_env @pytest.mark.asyncio diff --git a/tests/manual/pdap_client/test_pdap_client.py b/tests/manual/pdap_client/test_pdap_client.py index 1b79f686..a8a8da29 100644 --- a/tests/manual/pdap_client/test_pdap_client.py +++ b/tests/manual/pdap_client/test_pdap_client.py @@ -3,7 +3,7 @@ from pdap_access_manager import AccessManager from src.pdap_api_client.PDAPClient import PDAPClient -from util.helper_functions import get_from_env +from src.util import get_from_env @pytest.mark.asyncio diff --git a/tests/test_data/ckan_add_collection_child_packages.pkl b/tests/test_data/ckan_add_collection_child_packages.pkl deleted file mode 100644 index 7ad2897d05b16b8fa413702ca4cace0980cd261a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15581974 zcmeFa+ixWImFKCpq>@y!Ecv2w+a6CxTk3X6UBQfq%*e=~Wwlu(tBO_?$tGDUc>$vk zS7xfnOm<$1qNf|vjTvL?LCydJa0XcHF3@kg`?e4JFu*>{!t=0C`>=2OvM)0j%mDka z5Bm@7=lp&Vkr8cr>c_npvdxxV9=erngvhHr;v zP>&qb2^v-qg>lP@ob&Nl)OS;_+$uYPLy;9iF(slyS?GyB#Am{C*j3!<(~~Z!=vPU{O&#dU4yR~rSDy5=-naz zB>nU88-pj25g#Xm@O=EvK9Vh*>s5j~k&yM4j z!`>5lG8qQ)jYn!ZWHjG(EXOi!+qA6%ySeJNRvl}lWxGwkc|QJn@%`gooDE+da81iL zt@?puue#0EdUM6M>aNXdz0wVinbO~n`oW+rBkJ{so$jF-_d8FL{=k%XpO0TCr$=Nrl*z3agVJto+Rx~bd(sZabNaw zVBE;)e!v4ydPh%^m>-N`KSGi)=w`^DxM>uPsy8o@vfHi?GJ;7KPi zhKyrvH0-ei{AFEM)7Z;b)7U>743lHy#@hPc{s%HH`TG5!e|98u+8^?evD*_igEW89 zGl5WeroTEpg5ukE0>;Qjg`@sq@yESh^!Q2Vh?UQYvKi%9n%iopSjqL^q%-8dyFveP z_U#peRW0rDpxrwi7)cPdCmW>JoMA@2e#|gs%tAlg-C}cB-n#zQ_1&WcUXjC+@TFiV z-{kjVv$NR_jG&(wAzzJU&rkZvQRleRWsxe(H5i?o9C0j-VNbnM&(PRNPJ;gMIOz`a zH7j`8kWV^^W|n>epR&p_+Q|rnosHlLToZ)Cudt-7z-bcl@L^&c2WN~jJz~FC-@0zR zb=}-5@wMjbgBK|1R5ioUEwG8lFa)p}1orxrsHhC{88>WIabbnbE5b z6e_!=#hH8<9R-5{BZ$cAU+U2bvt4Gi<$)e2LX;OB z8E{s6bR2Yzq~GuLWxp%T6Y&XS_`HWyjMafsOW#wA7(B1 z2l=k*v!YLyu{}BtlRixL;S3?u*y=_|rtWZHY^dEG8tvimWUyMR$x9YU+}iFayC~e^^-ww)Q=G8pS&`DUH&o*4*BKv@mG8O zL-zF-ih<6#pxf8DcI#;n$F6I}i65DbM#5DZB>^|9(@NbWic-fpZ@)YK{^SxfwZt}i zsd=19IWCdx`uzTkJQazUOGB=t;n@jSQgtljH@Rh^e&723yvNQki(Q#J|iH(@RYr?QXXe7JZ z8o#Mo;8B~4>b$)={)yX+T$G}y(M*C?nl}6-^`qEz!YHz$xMf>T6TK-&0>^ctr0F*j zyXAVRAIDAG3gLi^@OLx9GVsp_y)FtBhfw5VpZEMK`_{YJw+2xgh3`>5DF*Vgy<+FI z-V7qRbZ{?ulCa6E<7+4CbmkvluaF*l%bahnyV{dZayqCTAOGTs`9-r{j2vZfFk;hr z(REa&hG{iTRHS^tAYsYh}C@;3|0sNE1XbD|dvTnk{KlT-OdPKDu#9yvJZRfsJ$ z!kpMQb7ERzgh_nsOsK8qLtBbkWxhG-ueXD~+~<#ap{$q~3lM&vlM%&MVw?52;g}8E zx6QzbL$i@Ko37(HjWqOUNMt7F&?Ds||gY%y&vHsrp&+aKr`c99t*HwDcLGJ_|+%(t# zr8mnCA~8^dP%#Z92ybfr`zETBSSeiolj{P(`PH~HI5`T=9%-ZEo#|Jc%XQ+#O~*}| zP18?Ur$*TD%#iy4oD>*boZZVDB`;6&q3pP@Mhk_BStl>G<{I4yK&C2w#^2TZ;ym zgI~-4`l!1wNw5Aw5ikrw0D*2;#caj9YowST$bmH$+j;&tArIiUUPU$y_)`2D5ukoNeK-)sN# z?e@QTuDi)%%-zlQzuaDO6PxGl^YO;BZk&>Y?SDOfr@T}8k9wP4`RV@7cCk-R)NI-@ z2$ECxeS~`Knyprtm~}t0W6$Tbr;SVZiIM+u-V4;=s$KfZyj^!P*0Q9U*5 zjwNVlJ><@HQxoCirCvQs>ItiW*qA&u5$EH#o}em(qa!Rixi<8v9gJU&0(4X)S`s;} z(6$j_QJs^Lg0+IkrY4YN%Su|Y8#hCtt{<2XZvWey)T;`9RK!}o8?*wHC#x9&^2X3< zVSk#D7y9)mj?%Esp+XVJ9+^k(n#Q3ty_Q!G!Z1bM2++vf)H7R2l$xFw1dX`K+hSkn z70=8gc>N?n;1BzqpsR?+X`_+4fo(dCMxeE|mYw=$*tB9h2AGBwg=poud4#VG6wsiE zHWMy{q?wp@9JvB-N2c#az8U#VyB-CO9|ekN@ytAeuVq-OqR26@9WU`kgmK@vC|!Y_ zaz^US)OCX-anqIzbMnwUlGmRoO!gN^AElh_uG>-FOPF`7$;oTD47TMpZPO1u7Bgrx zJQO&YeEGR5;bi>#AXplvYIjZskAlIY!AR-Uu<-cXGaqVwTRwYT5JF}3kH3=(yiDO= zQObtcEn3L);W}Uk^wDC36QRySE<@?PRc5xHtd;Qn# zH$<^2`3Tx?F7gVr-x|O5(_S|K?CTm>vX~-okN=>G{zskRSuc$M%Y(z-ia-nPug|E5 zjn%rdVq2~)m%r8?8`!6&<7KG6RbTO3&%zDB;(t5i15+K7WRU;&y#4LZUcUa)OB#BR z1v50hTL$ohus0fN#J7Ov6{0OzJY&Te=qI^lAox9C>bm?L9A{n6!VvHl+aXX$W(?*i zU;2Cm78ZBFQlM1&@+^pZV|{nygOv=r0~eM-b_I3^mQDM;V?{0zK(^llh&0qRGbCBO z27?T7-!#=sKM?d2k~fXy3&C3DD?#_nz%jwShnD~lHp3|t0$f^+6>xlkxivnGr82>u z)$)nQ1RV6VoiM)2IMi4{u#ZrX!L<9?cQCf_3kfhOfcJ3#@C%kL2}dn z+3>T4P!rGoq#m9?)?%~`a3C2c%8g)PI3cbgUIG=zvfZ0T$ezmXoibC6-^=?2yq=K3 zs_PtyErGiNXjPu{R*W^p5AEP6l}!_$N_n{lH*xn2hAbg)J;P9+CHz&$50axab1Sh1 z8vLIgV~*`=seNNmat;am2;*qHSdBoaP8<))n_vv^-2rH8XGyjKJ#i^91uQ}!Znfi? z%Rmiq1;h~sU_L@$&qpjMtS)%sW`@ZtR#ME4$qNz1xU%gxaSm{%phn!Dsw`b!i z(_oMEdg3ksUemnDffTRWWIFguw%BZ_cau}$-pqPtWwbG@&hUiiIhaf_0VR#Kdu4Wl zGCCGG+tV@+m7NnZH+XL1w^O1g^Tnyn5>b=M7vcL;L{3{yw;VX(XZccT+cSp1>IDpE zY-ivc>d0rDD*hfEw`{v|#I-wzZE-H%M9?G&KN)bviSRQ6=c^MJBq#W&$9a|aDf!1a z>Bgu@ddIb>fekW&#pr}}z*JVQUth~l5vF>Tr3WIF6ivO(6Bo0bWqH>@<}Y0@xfyR7 z`+M9D*3F!yxA3KQd%Uyc8iU(;w#$J)W(hBA2ddr)EzJaB1$|UARrAW^x&Bnky6m{8 zxNF5VC|^?_BabyRF-|=i0h5lim*CG8_gsec=EKas*Xbg!M(Sb^$5nSEB2{oF?aXC7 zQ*5XFkyCGFB?}+kM}g7CW%uJB;pq2ud3~JT& zF}3HmhOA&j1M|)Z;W;q>*t`ofguUM5K`nC?70W$ub65>SHV3CvF-?&_GD}3Pzj6|% zKlm7Fl6+JPJ{IoKOi&P2u8AQ>9_;ljm#}()0&&8_F`S7w5SNIdAb(lk_wAdmWy#q+ z#_1{l)n0dzY9a9fa_e=ulaZTp0p-`BNMJ2^k=JdkWo|b3o);v(zLWX#6=i9Z_|OWdKG zojN?@8RJh52iyWt<;_-}`C@l2I$=sAi%`m)ymEcYV6q7^5_Mt7=CkqZ%2{jJcFp1c z0T9J^$0j@xiN=!3WO;aRBnCdsTJeDKPAh#{VQgkow%MoOT`~@Z(M(if>JR!`SKswFp>~Vb+GYm&2N0^ZnYr z-eK=iFMX6v`;VOUNBJJC44xd;Y~Qg?zA!KO+R91y@O&CHbXRR>)pl1}mghCFg>U?- z{XxkQSVA{PZFAX`s!cikzEhD62!2!ht?|T`eSPivcDu3Nb~9tXHNjl9QxBy7Qg>e5 z!0=97$Mac~dfm0$ux?paD+)tkcQ++o$`2jFrtBcJT28>X{YK;lO{*S*7DU>DYK^}< zcb=2;i3oW-Qd1^UZGs-R+$b=I^-h`(ddiarKYN%-`KNDAdGbEI*q^w;N7@vHDoumQ%R&oYy5)y?yMwi)v_JF?^NObtNQLd*SC^70Hovi34ll)Xe4p#Cf=-8;#gMFa4z@VeKnWm z3WOdd?cQ(EQwKme>poLAz%tIc_7glAm$~BFXPNj~Vjedgv`ZuE2Mupo;c9j3e>&OW0v_#mP3NZpS&~= z=iRyF49yW;7dyT#bCnbmZs0mPAAkH5?=QQzaFQ(T&Wb}jZPWwH48fAo8PW(hNh>mO zw|O?OvloYp+$5DzU(KDh?DoucXFc`yJgp~dGEuO(^YNcP!}eU!iRH$zt@b1WK*q(` za!rtW*K|@RcA~Ilw}SMtL)2i?mdac_3Cc7jC<8Nb_ zKQ@OwQ-XB~8aD|59$?2QmqXx&HqkL$sj-iciE+b*o=4BSd(~0v+hQCOqzjb`VI078ll(ptrRzxuPmVHN9U1$JF`kB&^snp zh_|wZ&W%bcPM(-h{xEiZvz~Adh9Q0#f%o4X&ptfw6<^~OB{WB^l^-X~y63jcs3k5r z+ee}CamhI@20#)u8g*BNYtB47?*(saAC6f#e*&lOgh_}$&cff-u)Np|Mg30G#IgOL zNfd)xpz4EF(nWG*0F_d)=CJFiehnXHOO$_S5~y{wnEQtSZ>4@uj;8WHU$R6PzFlfD#4r^D80r( z5*&;3<}Fd@f70z81u91)bJY+oh&!-(VAogc?y5!L9D$NP?ltYIDH1TO)rPlfwN?lY z@?36f;$|mq3{yju8DMTo6rwn6{`c2jdP(rY%*@|Yum^q+04oJVZ0~@5W+<`%{<(*P zpOjZaAvG#+Ug2|qP8uGNBnFkRB0!D63LVK((3pV^^%9KmrXb3B2+&Pq&^g4VK?oR8 zXomvx^I{-fLD~b!UnqVBZso6~KY&f$Bv}HG@7O5+oPSX;r|e@PwK6^5ES5aSp_Ru4 zui-$2ISas|@lwI11!@%_ACCk}gxe@!%7f7n(3D`>e76*q56}(3MIr;JYfsR$A#NqL z9yw&fLwaC>0>?3=0M504L;I!l*F&J;$3S3&tKzZg3<$^v+UTzu2dwQjDEdwx^oZ=1 zS-d9hK~P|#!x2shxG*tpB;cQnDfvP~p-PJYz&lpi4o%Bo;< z7>(FHc{xdFBmVm5K*QqZP|swre>xiS5v~z-LDT9CTV2})# z0$NqC`GTlQUL#`*hMe^i=EFPTd|9L{l`WcPapgz^E9PXhJ0UV6UWQrNJYkh-K9RK( zslzVlvnbxH)Fi+V-{oWjwM!&rf!J#$TZIgZ^3x6`|b7^oO znYi{v&taiaSEqd{4|$31sdBjg;KCKX`2*tza(ekMbCz|)hVAvW|DNCjeaN(=L-c5p zYIT^*g7;qdLOg$mJ()a>c&MBw*t&f)Wg z5d3CtWaUasO@62;6u!2-`Po4&bB&c=VyYLX@sTO3Fc(87)5cqMtrf4?@Ex?kOEC21 zraXX-R9L?4< z!P=CjPUg@QeEx^?>BqGhx-+P`R*DO3w2GQ5HMmYJsLJJ0zIrWlHfp)eM@O;+7tmCW%EtmtIV@3P8a+_vd z5cGzHZ5jm4z_ds{h?{PUSOiSd0$rLVZ4+~DiQF;ho88gWpkk_92OspE%S|8@*AbjhYTIHQ34=A-lTGe4Hy zjJZ(xRX5`*2>JZYa0P^IUVSsJ2#hyUTy(hjOv`C;K-{_{HFM7;jl^xmlo@H+W%zY= ztaekpdRGF*m)(iE!1$fzm*nbr`0VuLT;P{GA3w#pxC#vJBvx8?{id0E9%sVxh$AOD z!K{1a-f<$DxcV+R6K(@hwmb~J>@LiO!LNEAmPNmRe-Q?#;qNf0lTQlR8F+x5F#+lU z!5e1K^vF1^f>-!e!%_NGS+C27wW39T*YTc(c4>z<*_4q?Ex+GrPJPFSF zgj=fgY%>K~435mRL=tem{n?+t_0mf+Br#37o5Vg6$Rvq^%%aZX_Ee0kgcf6+0$VBr zUd+aS|5yJtWj02D8GIxKHv|R%3=)K7EdE&Wm-i7J1tbfj?E$eK$Fh7)UT52^uYG>HuFl;!1JwG}F4k_~>T#=G0!M-vWHe44d(Mb+O8MCZBE2EN!js-`_mMmkb zY4(kiC&2jXbvf5+Fpua*0s7U`FncWLW&)T7rvf}Gv<&A75tneL+MVnas6Vm~lUR2{ z$g877PJCbQo?uZD0;|s{wSm~3Dt4|)2?>rWSgw8@XE!(zfR{aCU;?@22P#{fBUK$q ztpdsX>}!5Bwf8~d>a#^Dy_jlFcsEqItcrPMO(K~9xD=3gg1>@;bA-D^9YR^*l1l}w zm4J4Irf21kh#Mv-TLuTDbtuU#85NlLG+{FQS3d10rY@(EeT>M-XQQOYP`D03K`o_^ z!v4qd?~k{44mJ&Y)%d6uetgiI6eT(ac;>VSS#d{(9fgb+LPh(lWa`Bmb`IbZISo0J zhY4ftiZoC`(=+tv$2AE5vDq2h~9GLyuV1e-_U})Qb}&ta|uVoDkY)$Qu}}jHg&hwNDam zEq@o0CLgQFYYr)ggGchqK%N^QIwgIf)6=}jWx*sLN+7>{oV)Hy3!M3JxV8fJOQ(4; zLix5_wfZJe-T}4j;yUPbwKs=dQR5c0TvlAOCfWGv#O5oc(_|FAf-AHi>y!;s2a%&N zV6l`G)jm8qM~s~;pUI9hVR0a`LV=E_FK!&ROZZa>(hJy-l~A6*Ijf-A3@;Gnl2lke z8<_bZ3qG3W1Ce~iMk&7(H!-&|FfMss)PKX_*T-$i$m9YNZabL22L+R>%y=HpuItGL zNEVT>lU(|@mG)u$Or)ARK_WB|@tI?=M1%S8{p?xpxh|p&Ud?^6dh0I`$U;#uEgZ@+ zAR^R>5cyzmWQ2G&($Y!B3mC`=n;bx;{-~T5T!*T>;mjPewV5{-aV3_yt~wy3gfOle zQV=PrEK1Sjm8I2E9=c*pS7t};}gciee-9d1Qi0^glsJ$ z`{9LKZIDsszZz9#qw09hs&{Kbb~zggOB=2mW!q5 zmDl52Vt$qJCm-DCbUO1VAxcS>y^@coJd0B`3l%QXNfpPZ`WH4O*T!I*Y$=ovck+cY zA>M&JgacW8$%j=%9FJJBQpAPc^O>PPnLqN<^6OE;^OUr~z1%hPBQftiB9kdp*zHgT zkF$p)l5-QoA;`jgNtV_7g3_iLjH^+q9dTF?Vj|uUR-b+LnTUMZJ}IFi29_!VlV{Jo zRJibLA}teQuL!Qhq1~WDnhCb;ntp(G<;V4~9s*^&JAOxO56PYp@0ys3s+y6K=8Q)m z?VqVXF36ub&VisS<^_7<2#7w=^ z$+z61Ogs7Bn=8GH8zo`-!E<-@`EeRifeI9sXhUl8fUu;VRHdR^giV0IN9<YM#N(j?!KaY_%!LK%#~RRZC&8*+rIetOx%8jOu4$-Z|;1X%I){# ztG_@@F_VS8)&4W6B+cPRop25xyi> z0!Ern(~RAe9uRn7*{RF+MFzaQdvMuZd3j#q-_xF#OWlNvGbWbyi8)S0ri}Q+A}ZuH znhvQgbko2$=LhJwUcy~*b)VSVcM>92``F`aePYX?@b>rzhuPm&0`<3_fQTfA6j;cb zTTHvg>ehkftTy~rx3S_8P&dh%zy;}=cH@9D2#yLZZ2FF;>%ZMBh~~w{eRNh##gkwN zu01f5Y+Q#Ap`^EOwp~^YFAoxHTG|)ar zZP(}ZgUTMfgs^r6R1bs4NmqI>fS!HGx>D$f5PxQ`->f`Ef^Y*qNIw@4bq(n1>c_x* zQ;*5;1r$qa%CX5~MBYZ=k`%>D9sqCOeGswrUuxMZL6%#%o>)KizFQJfboDhZ9qb@WmZNU2%A9PF`h(< zt_-7W&g66SDc# zJClLx?VWgD)kC?nL#<3PFI6Z;(Yff^9Ep_OeCztAK4r3`9o4L+at1T_y$UI@Qp!&u zcA=CX(yJeEkV&Ib1(Mcg=Z!O#}t3c3KdysGQBLTNe+8QFGb;z)Ww-q ztB7pFb*9u1XVh)sk}oLeb;R-DLD@0!1Lqe<;r!4wh-_bJQi4Aagzx2S`{-Ud_ONAm=QW$BMucb@Bc{@e%Wt?`E|`)h(b3DrqKD?3@K7 zqzc~WG|Fo3 z17<2im|T)7{fC{Tnp6<4eE6Xp&<{U6m?A04jPn)v#NO z2cxu=B}ent_1s#&U^tX>X%OYyqPQ_tDH=dcW&ol@BsBfuk^mK066?Q1*{kn z(N%$@-K5(coE_nM>I4%vo&r#ja;2B5`ziBa3X^e6m8coERZx@S zyJA=+qH_nRPu|jB=jfhDJjTGFosC>qa?0^@cU0(==#(4*Dvbt@<-lYPwelrHaWh)Y z$WbDmNQVp&x}it0Ap%pc8x#m2Q7ZJzPKdrCXKQw8loz%qVF_wMR2fCW!Q_GLazid= z3DhDO3IQf3TV9^~g)U7~yjBvpg zssRIv2y!~6EUt(H$vzd&mL8`#%@}J+LTjaa$LuJO0>^}EiME=REPc>r{b@hMepEO{ zElakp;#=OAc$FhH&IkPv&1{cY5gfb3!^zkotR396uozJOITNAAggg;;)5l}+rjSkd zN8=~CWVn)7%&U2E;T0>N5A7MFc2mhUHvRcr_n1d>#Z{-VLboKEe_ZMwTTbjuyT?{$ zR!78oNr;*iWAJ%<%5DIMrFgs|JH#GOk|eaLdyc~_w8#Y_a66(clx2lQlb|opBlbR} z-vhr%RCz!HE3@GcKkY{?a0RO#*bSQs@Dn#z#YrVyGjsUC@>UxF6!jIKnpD)+&U_P9 zr`0>to05O+MJbT>+iMb4_<^czliVf^16(!-hQ~dx3R87ZI-3?yO}@+ zJ4?rc0~;vKU$yO(W=nci;ZYj@UsXL(3?eR`n<~|Nq7Ob#ZSa<=l|g*+=tPWrEUXTf zC>iKndZNP11uTE(E?0leFA4rOh3ec?mX&-TyN;ka%zFjFs6x$h^Kn7YgQr|uj&3f% zh!p*!xfa=nO7!FuItuGuzzp7_EV0j zXxMV*lv=AzUojrAr$Y(@qtJ)-Tk~484p9|7-q7UT$-QA+tqf6veRL6#FV!L5} z5k*CYFbO*tZN4L&u_|d`3kNsl=lMnF8&}d~f{0TCBSspwE|}DcMRDfGf6uM3YN7 z=_w%_)3?yK0%n2XO^Gf`YI$LZ<5#t)p%6Ktg}bN_vUB%T1~Ge_z9Hz>uEhV!>(}M= zSK7k4zPo?EXJyoEnii>gl03xSQH=V6V#ru9z6EtXIr_xH4mK|8x)K3pM-x;*7{WCcg zEW(&aBkB2(+oj4$#v$Xv)~v8w>UozW4G$kX;$}Dio-e5H$ZVoQmUl*s&7(1Po-i;lu;mMoaR@w>xB!6J0bNj zGOd_k)VS_9T6KkL<&RV|F|#aD?k+{l@jXfk&~d0i0YeEg!guU7Ei^E$Gd$a|Y6h^>&Qr6!@X5>6>%Uub1d%p*oOF~kS7 zcr^uRDOew-R6V4jBC#8x6_~DVF(%)23I0~&QV+}{^?J_Oie9}%+4O|7N}wlWb6w_1 z7i2SRu;i457DYhlm7bbM^o_!Us;F8qRTrrFXC}a+tRC$Ismkb@9uW*)0&U+Swg265 z`LTIqzfq7i^HZznJM<*8q9&Q#4Kb$dIDo0BClopq76=+nD`|3hzdN4${Ja;vj3iK$ zoAh6+H>f2EbSkkiyu&B>f>vU!7Is$Mi6ohpeOC|6BlU_18bvEY4)`fCgKnLIr;SwV zQnXUCzw4AnNU4O{YN=Joo|s4MH7QesGeFS`Z8wZ<>Sv;k3xo4hiz>Is86WGCS|V(j zjBWBzmE`kCHuk81OfWQ^AuVax+XVWiC2WWSW3d-;=<`DsSn+KI+nES3w2{Qjk}iZj z-yARgj1FS=)~N6(sUsUG6cS_c`_R*wb0XRGgGjzU9_omb4DD8mo@G z;*+)QD-QX7K)JxdFiSNifB;cLur8%p#T_D{6#vifNhn38)#$;PoNxOnX^_E zHw1l_@2U6V+2g%D9Lq_TQ# z5>N0mXORmGO8j{W(#}C^(Y>Bf_;G5*7(wpnl+hIGd1+qan5D3$YGNXGvs4=7oq`W* zrz-BMK0jxV2msHWK4}(mt?-xxfk*R1_?${Wh=pcsO9^nwwWHu9cG93%DtFVn+^nts?tw0ji} zep^YA$r9vL%GnEV?dpa~`??8ekO7syJs|c?;&NzNcKGNg^l_z)Otp5~WUw_g_}`(d z1%Cr_|1Ov0qT&q=#-|`=;l{ zE)_-a_E<&Hvu`b|SXL5tzx#l5DSkNDK`1LGxB>!w3N2_h!UiZ19(#OCVq#z-2B_X~ z5;<`*z{0RGatjl2A?aDPV3~Fw%js|n;Mu#2WYQ#gp^#0_l)NxmL;;`A$KF+5oJYoA zHEkjCnythKjG})u9<&7KnIF*ICUGTI$D$|hU=(KJR7R+x+8_zXp=uvp<^%F-e1Ns{sU%hTI!sZd4zfNBT8QT7w%D zI3pbbKq9f|c8K#&>X61@KN$10LIg5P6%aLfXdcN|j)D^uD!?eurJf*Yr)kwy0}Jjl z-$7pxC4nv`VVz3BGR*9WdBlpkXpnoxT55VN-;gQJY2V+HxyyT zd+vCWyjgFCsm9*Qk5$Kc0cx^z0}m?!O`^ym8kwLbRssSjRpMw_A5lV?L{Jy7;;JRu zo&qQ-)jp&%N5frd(80dNrcX8QuvaP2Mr04I?pwM#+xKMGsmVtSy$QsS<8gW0j`9Ci zz!?>cL_MHuaAfsaa*uUkcF%)LGK*YA#EbFqceej;)%O3Mg4`tBQ)m6`XL}_}|J*Hq zq5~W{cE(Nuj1tuY`WYdAq_2@3lOEl$$qsFWv>!?-JP;q9q*n*}6Okf=t5{hg^!!9*M+e=w)Z=O~!lnRE6QbnAE` z=bGwu!VrQmz>V0F9$-lwhmcFPfqJv)hEaea;^6QoERb2!)QRUT&T;H7W2!HwI6S?n zUI>$`o9eSOl|@92S;`cdy!dHN^|Tqf=v0*2btP_u2Hv3YbZBc*&&Elq2~WE8B^%?k zlxcVsQ+?SDd0JC_vM$Ovyo#wle?t^@vV^HVd2zlWS2WdqA16C^G@3T{Pa~wrIE6ac z9zXJMPvZ7=FWZlXjk$0YQ+?Upcv@3^vM5(K)#q-9RJ4D}^KlhZ-APi*r6IcML@xGY z7^bw4Y*+*v(^rz{vJemSC1-<{!&foYm)(h{HPxqfVp&sNhi710K6^aJtICv7MkP*o zdSj*ylVAbv1geq~eh^_%C#b2ouo8+mh~1k%QZ*>ENRuelMtNO&Apm8WP#{(UOAw=6 zT5&cTb#51;h9X^$Ts<(4)ZcD{{F)f#L-Z(ip_vd0mo&*Vi=`nb-L1JyiI0kK=#f_E z_|$xtg)5$^PWJ*+eCf&%^Z>@@=brGSAp$88A#JB5l7edRbe^I$g#_v;Q+#od!o>j$ zZ`{7WzQ1OyZ|q3$!q?N|Xh4Coxc8H|H!OG2)UdvDU=y-HBTf9f4acFGOcAvp&cUXX zN|z>^jg>|nTOC#6-SKyhd*nc2jrYm9?3*M$shZ*V_=s2-|G(=+!36Q;5+cwi$#OuP zxTHws-;@}0veyp@7U++n$9U7pRtibdA{tI7jZ4xQg?f+hA&SSGxS>dr?emU!DvLTx zk0P8v?0J9zTD$RWNoLEV9;ibq?e0{~eB<*GP1y)((IkllP-{i16qOTH#a$Jwa62Ie z0BiJ&yhGLhjR1l2&?Wvs<&72D?ULm9dn7r&QMl|Qw?VgIP9d)l?mKG=^ma>d;S}%v{;q?s&0z_r%OHm%guS(^Z%Xu!cE4y<|bon!XwY! z_D@2W1_ccY+$hD_@tXV`Ht>KYgq;V{2E$J2bDVmupydQ<-Qyyo*cY)*O{(A&*+~Bd zZU1i&Wzr|Qdsh{Drux6gveoe$9l|A473JJ|ydF|fBp6AAE?@Zh`S_Yez!5I<+|~W2 zIGX=V0>u@HUuCxc^{j>lCs_zzgDr@b%c)jz1FF6dJ82i6PU8mEn1pJ>WM%cnHSf>q zfaaYJ{QM2C)8mXrtcTgCU&T;^}!ezm>qZYUjlHS~N9-qGZ< zuV=JX=X%!R^z?LUA@pqzJWRJ<_`Jp*5mHr?8*$f^CJvFg#d=ad=1Ec`X*v0#^0u$4 zehIXCAU}2}v-pF`cHJ~KqR!%B^K1{)GR27zuL^W-e3r3!QeJ@ML&A<39 z>>KGC!skqxyH8k6zWIO13aSvd>>Cp1rfXp2_vcNCMa!y|=LzEK0+TFbUG8ITe|K}6 zBEsoVbywg%CBK@I6 zbp}vlpmDH`r|^5s`p zoC1CNFBhj%Ex0;QhB3Yhxb~tXoxVxUFydelG5YL(Z(B(lX|kfXS5z>a*RqoDU4i;l zfkTJ595UK32ypz z%%}IpzrRp45l{2V-GlpxxxYpO!?2)x7S;qU%_4FgQTE8DqAP1+Qbd%@0kSSA+fg!j z=V;#grN11%F-*P~*4o2kq_gr$zoW#$eQpQT;R7mzs0@qc%!mcR+_Oq%NtFpoNf0li zwk!JzuS$zhFTzwq5|A1#T(eY54a{bfR;?ipeDV-P=hY8XjVo=I{s}$$MD;eS7Dgu3 zgX%3QD_a-^Yhe~1*5SPh#*Q_m;&CyoHw-W^|!@VueDs%~60&wA7%20kIB z)x|a5h&<*Qk)2_=Eu!klaJ2*V()^KmVAlzS2q^3*bH9L(YZ+Y zwEZHC+N;x8*a||mdkZMcd)ceXhEJSk7mk`ZCQ1F#K{%;JPL`IBd%?#ci zzh6y@AjEfgh}qrGDo-BAvtWaDVAHs|g;lvyZ&5A?IXmO|cd2^st=KKw)+rKS3*z31 zN_sU7LZbVU&U_NDmjr1o_XdG_V$E3~zA+!$n3s#-z(MsD z$MwO=E=44ko4_<8@inz8s=58HV!7ws=$r(m$cl&zBA$(+5S|-YRuqLzOfiawQynWw zTXu?!4XBYo%9az=<$Ci{j~KUz#PBaY1fd!YJK24$J?f)hN<>K9#>o8hFA(3^$fsb1 zmeiiLijaY6SOI-#cp?sPF%1@-gt#{ImYL85-2}Zzc&J+F-@AZ%KJKzX{H13Um`g3o zi)yVDX2X=_ff|W+frBD#algiNQbmbzuskS)N7iV7&X@02L85ATP^*T@(~e^jIVn*O zF}VpX35@e7QG&DGBc(7WvC#7P_AJvII*H?Vv!G3p1dw0g4GK_+!*ou50ig;>l9F^v z&laK{En+@%qyaBKMtNHSZv4Py?zVS@KbXd)^}Sm$YtDd)>I%pb-yxD=Oc`8>VXpTqT%c z*^QbT%|WQ26D#E3^-3+J zg(JU8ki)XOG&jiM!P73#)dL>pPZl%uIh?1f1V7+JPH`X+MAwwuHEH!t3v4=(M8x~p zPMkXUPcA!4414)Jg=KeWZt%mioug#~A>L4?h-lQ>NTv#jO)is3>;kAwD0YQS+&m7_ zmS=}`zz>CWlpm`a${H?uEi-=FqraEW?g9;sKf=?g7~ln=a-s-F$nl_9kJh#N>*~|C6KQ!^dZ3%!1N5q#f4}@PRwj@RLHL1ZWfi5_3P6 zkiK`v?u4X?OQYX2AD@wrFGxg=cmYdEe+AVx11wAe76jUOx%bjb9|2p_$9Q;ll>GRI zDTsub2FG-&UH#)fAN7VmTB8s?WrDW>ij9Yst^at_nD?Qz@WcEAO)P)KX^aW5G5X6WE{IO_FR z`-kBT&%0^pe?EXbem`++>AV0zXb3vdRe1&Tq1mcnJ((21g{A5+Og7t4yDg{+^%W;k zB^)MjBB=`^pgITzRpzN`k)b*(`3&ODlNV(dE?MnGt4lj@qxNw=-x?GC_@m#MS^x0k zkAzz_YyJ3#?@6_gmi5DVTiWSTx}-CN-!_yZNe2i4POW}a6B;k@5}oAp1&yOGJEdh# zR;jf7BdW8g-zh*o>>aP#AZp3+kLZ{2g&c3r#cHTZp_u&TM+=UpmIj${QsD3Urpm4q4Ww@3CfUHV~2Z;+{Ja|1~mlhZbM`-G=u z;vIrCaUX-~5eib;kPDNyfURM=%NP zlpB2J%HHY6l#C)$M=B+KLWm48qG!e)4cH~3MZy*6;x)+buS|ff-CEn;*xBCPD2-!H zyKkyv2$Lv4hA7pcIu6;JHLB>xy{?YJ%!g5Z)2%I;arWBZ{LS2#WD^bPZi12_ais*o zRLQL0UEA8;+P-rcDXH^Mzos@dbA(nA6gx$2=fU2Av9ovS^rdu_bU7hPOfLbbJ>7Ja zxSt}q_h9qh!OxZ(Uok8pDhs(z{LYc|FUS{B_EN%e*}Cd`HrBT9Z0;EwJC`oS#ap+b z+QM@`7#qFA+HP;sD6I0yWJJ|rY<{}6ez3K(ec60zYpxYXI-zM*p-SiO&i?M!!P>pc z=^zGmXmM^NowW?Uu&C)P@e;X(H=j)D}R>vN`ui%#@|?cL42`^cJ0kMyPQ(haeM zYqLUKIGCySp7f7tfWt0jM%&+VWlHXxjjjFNoqai67v4Cb>YqdWq&{DHH~=M%xQVrb zMF0SCldJ)yb)_mPUHqol_4d~0z3SR8+D}nm2BN*tJ1u`je*d*8do5ioRSJX%#%wSv zRn}H#t<2WaunSh9Q)E#jP}&1k$yaFzTUNyN>UAe)y0mV^ZKOiFl@1uObzB6x#Z|tdoL^*P5&8@xAsB=f9|YVaQmUNG zi)X8R^oeoz!Tq)EO=DlaU6K~WRblZjfLeENXCG~PsikCsq6hU3jjTHK-z}%Y zu5(;fv}A3#?LU|~^$YLzOji)@(U-U&k;1W(bSq57n)f@0ZFpHrhN)HGd~k5r*xUTG z5+|=sz?Z>@d__<$skNe{Yt?CefqG|!RxM1v`9-PP$YP-|YG zeasBWCAU$~484b{fj6C(6H5HU(HWGbs`1MuRaM=WKll>`vO;kreXp?Ivty*i%@ov9 zWuJuyeDVf?;l*c9^8|6&PeT8TwQ^N0g4@-B9PJrgI2~DJifDY z!6Z^iY`N(1-OZiddu8Be>iv^vQ3^;{renuR(mOetp2)p>n|pU=kSBfhi)#lVkl@XZ zM70>o&7l@%YBdfHHn$hw9Fi78=N!>adbGR8^%?+-k|z!yRW5h&{giFn(vFJG^uE?%JI)JX+d25qz0GX^;^)?OR+|=1Juo z>CMA;2G%IM7o=Q+@DKYJiA@GCK2DO8g$%hq<6J8Zr|PiGbaM)UXonh&yXa|DWrq#% zNjz9Lw#tThi6WXOaa59ZD76o`nF~0&jc;;3t)22>FQ%pS?M%O(qO`TYb88C+(t=UR zJOL$p6uazj+NK}=bZ4*PE|M|mb!R$(bO6cccIyteY$vRr5jB+5j1ULaOJr0un?6JThk737fxy0>P`16{-^S+S;DKn zC+jH25djaGm9FZAI~AwPGrcfVOR0P?wFP3W?i}0|SgdlYwV+f?u*}pZaHxv!&{ACT zH>Y%4HLsuTJg7MPpU2GPx;g{;Ijqj__S*W^y{(Gte(G%+@YCkF;Cvbr&d^;VpF2_~ zXo@I85O**(-qfO1Fhn6)FxE5y05hf5OcB5dC*d*0itB@&U*s9K#o3ftO*x;k&hnBu zhwIMP?djoZi9r+11j(mIrvg4D4&tzrPD!1+I}i4Ouy?k~XFan8faD~VI5EONd0;H7 zFCM2{4m9|i+J2rw+c~JliO8zu6Qm{*ugka*98T^lZZO>8LuwPrk{wqU3yKF@3&s&+ z$jI!N2DeOC)zKSvjuXYz3zuu>_8wZn#=YqUn;a3LnNm@TjXt~ZK2>tuKs}t#VugOq zS;JHy^i)&JWw*$J@-c4D+!k}gU?%ICDeBqCXQN*9g#&b&r6>EW1{icDGAJucL2WKEdYJa? z04~&ngwzb9$^iDk45nATG+lXa0IoF^S0+zhqMyih5XBVec^#Eqcsk z^YtFK6XveqZWVwu5N_k<(B9-_bP(S5>1KI)J1R&fV<-`aIVV9@$=i9H^kDmwZBAwB zFl@^pbc`-MafqTYH(IyQP^RzB2M>+4d&^l0_y|s6UD460 zLn)b1Twrwhl`<7y%er%zvyj>;>N{njQsVMVNgg(r3_msvUb6aSnNtDk~C!I3*9`0-d6WqJE^RTqL zLQ)SeV-%$$tRDmO=)We5+JKJ}R{msv&$d`_oh&G-_cH;EnIvpfa z&`m~Tck_aHml+~d&ZW8{Z~YQox*93Q(wBTS9rm98G9CB+(F@>oo;Z`Lj*c}Atg72V z3#%&AuC0~t(X|uwCNV75vJ5hVzYu1ra#^Ym-dfxHWdEQld1hb6A)W*ni-bf!yA|{w z4**H0(a5#EZQ}1syh!+fGLdpAn+X;qai6-#)7;Fn#`@arfA{No6owS#m4DKI_dn`5 zgbW?YNLQz}4&Z%f|K66k@e2{CRs=CH2()IN9TJp?b@1=Q!4V1vcLPdxApBHBoTxV- z8mF!3Pl0gDt#Rd)OSyQL97 z3q6UCJ=ohSTa1ghJc9|lx;Z!TWuyXKVJ#H+P#SmsA~~fRfS5uJ%G)=?O4|BZKu*=& z6=#5Q?P(iCxKm5LDwkF{f|&5lJqo1GAw0_wbSCd8Zd;cBu`&1WZQ{r%;|lpYOwq@p zA+5vcCZ~g=M0pUFUu&$5^)j@-oQT>@xE89*ffagxNkU?LQn+x&-?F>+siEX_c}Zu_ zz1pb^MmlW^7C}~TpZpB6K{y)uF;*zoOuz=H$K3~eRmnB`iaAo5Desd=Ii(^%4(+JA zNzX>^A>jVS^Iv*!dutn8Vx^SzmvtTTJzok>w0Chsv~d~AIYZ23v1a`s?qE`o*CTl) zqG<{7iqA~Ha~f`a_P5S^%fpSI{+6buD9@SKLmY9X&3W$A+Qhips~GHfF`x{31BUwVJ2V=B#^jl3rI0!o6v5o~JJ0gS%UM8@p?J6<|3Z zjgCN^u#3nWF?f`5qYj{O4JME1#uaT`JvsfVPiOG?{6%w>g~@v}Z`mMGaT=OY4?eB( z%E70`{mp~DvTS+=>WY*x=N-?$@@(g2GkAK&ns+fs#o3j9&8sOV_R3+Oqo zxEu6I=4ZrTqUFe|^GXEek|wiN0d$U+_%7z!WV7fh77WQrrTxgX75OGAu_Rw%#Q=yT zQ`hw7_MTkR7e0wXjeA*wqAGc0RbjHVZQP#GPW6Rf8UzZNR#Rsl{$z7|yMk%Woq@1r zmZ332fk0mpXv;^nOd`__z^;H~&R!@!n4jyHO-`=AA{|Z}Ka*s7b@_m5PiOcMR#RQR zTR$@tKtIa|LVtoj6>s8(?F?ympsuhgt&Pn!{F{4wTV>Dua~__7^6jPaZ1}-zBv=*%RzLWg*`tl1U%qlCH9GfUIRWB7XAo8awI(S5cJ zc5dx2I3^d2sTWGgcx{?1i8v(g3XKvGe;i1Qv7z!TDRooo%~e;Gf)xjAcSvY2E9@m+ zoPBZOo0YKQ;84s-30RUO;wtIeoA<6T8#yl|9CNMXGtGToDV?~$1CEl>-1oD1QNWZ6#i5O5NMq)@g?G1$Jo*^BMr~gd8<=4V`5O{b|sj zu2|FIv$Ouz`Aa0bmwRuu3u$W4NQ!xY{ay*jm``dZ2S*iaAE*i<3|cwZVR|xg0)6-< zldbNA`08u>yTFr|E>iYRaW`bVF1~w_uWSdWYN6U89>c1K^1?~!tzPK0JeZ1&T9TIb zN4_|>L9Qpx)oq1IbB|~iQZ*a=cbV**B2Z$fLau|0$+sp#RC806g>LNuKF{Z#saMDW z(7P*DZs^4*kpr-eLy*EQ!!CJ!Y z#D8>D+EvBun-y*)7M&rc42CZ7yevjpxK$VVLK!okXg+(8eu?3d@;dWlz;^dG?`-3$ zU1|@rrPbRAe;iVLY06weA2A-T-MLcq!(Gl{CiL3jT;Y98#>+U zVoZ{^mm2bd7XV}>{jV}|j^Y^bL zPxDjLCPP@zR3&q(Bfe0`&VNBg(8{EMW|_z(lKcYsd)aH03|{I*)VG)pWLV5Vj9dlW zp$7$s4gr^y&QMxF_~b=_G;VXhZ5W%M&D3vL%Tvc-GRfdB!tw+@O+hc@PdbYn9#IOS ziYI(x>r#; zB1({I?UnUM1yO%jMz};5WN^A@R@@P(uHgzcJh_;GVHv;#@=&f>gYL^my|Y9DG9@EV z>is4!(1|#>bQ4gV=WGD8m6ge7|F?ceD#jlvvYQ8MpHxCR6ziP|*JV+=lN^PtxU6bE zO)5z@Ia_&=c3A3+setb4Su3gPsx}zFqQpocx~7U~vDJBQMUWZX$x$jtK{xZRO0l(V zLvVn-opO-d1@GdF3%0NX{b=Rzm)i;1L{rYNN@fjCirJ)=vSi*r3C^Zb ziwC9QKIlG{;xmaN!*%o}iae@rLD|Ruv*`r8$_n>h zkfk{x(^8rTl~zZwB7ds#Vkw~s^9NH>2Qnc#2s|r6rlS`fGLKFUUrQ z0+<)`(X&y1dm(3|+rt*ENv7sibS$Ac3*~7k6eCIJS#^(6#JS|lQNK>S9hu3l`SiD- z`j;cg|x$CFmg<&a^>#ZtZ9Oi_K&$4vvkx(noD5mBHk_ldev`)#(IAn;7jM z|L~X&@5A1z3}huA$V~6KqCM55WtVl+upOI!`SlNeWDIHhMmu&=3zbMT#UZdtR(6v0 zRLiov!9ZyJu<;9vC?-Pc6${`iO8UfNTo6-I~AQ}xuk zc*ezE1ndVJp}LTr|Ep^+{oYIRzxH=Nd8Pf`Prlmzp0s?tHhw>(@o*B;@j0?>`ZCh; z)b#z-GwYG#M^P&ZT`Q6veBYbt!FMQ?OjTbO=}7;*nVvIuN}td6qyMb&m6u++;2Ame zEag!^sI9)Ol#q}doI6|l#tES_QqBL~&QG`2jT;j}=1&vKIjQm|>+A=CdRtvQ>c^S} z2XKJJ(it6pV4RFX^5xoS6K(bl(_7(IsOP|}pkR~!cHtJnVDUhdKfTn(;hCBf^N{1ATsh zr%i%4Q}t4z%%^k$%+d+k$kH)t*|`b0_a*`G@1zGS)nA*SFh^?Y8^#^BZ!ATjRIbOLiejOfj?0+pFW( zs5~ibocCRSGi%vSYJ6Khzu{O`-A}E$oBFmj9dg3&r%&G?i_j;~p^wc2W)>mRJfd6K>FdSw*jqWP|H44i-187N+msGph~ z-<9_8_~=hN@sGWF-EO#1-3nsALDyWG-8U&c>7}ui#-Zi^F-GHEhr0f!Rw<4xH+?np4i+ z^!jlx7Pcra6m4HwC}*|qt~$<&XFHRH;&cJ)9+x)zHOqE6hxYk6`^hP``;A;=3(t+6 z$yur`DfILGd5t)SVJA@B_lN)RAEE;wHddwXA+|NE%R%e32tsfWf;mxL1=dE0jO^`Uw`7+(Pov^|gK^SJ>TAn1B8nHDSnmJd=An9E|#d0)Gh@Ru%fB$PNbFnnr~8^&K(Ls&obw6_tvd^NO&>5=RCy?ILHue-Y&zPdUz$D>{|r21u}?7xwI-T zX112^;2)y4(BY$>D53rZO{7=HALYjguKAow5T-D!DWq1SPEUFb*Pb9}YFhl%G7>8y zua4sU_20-TLs+(Ca6td!)v#pD_F(v^ z7s^}_xH8Q5LpKRpei)iIvdU~kR?`fuBsKk3tC=`%%WEZtBrQl}VmTubr><9zX`LO% zfnzr6er$#bZSNyDs3(4CMKr+9NAazE6d8$OXDCg_SI6I)oIYcRZ7??2hVxO%?^@%qQF}JEwFlrP{&i!{jC*9z2C!q?NaF&gI~|Js7_; zO;xo7_u?iESDQ`KPkcIGhYimRgP0ECjU;NOb~9``G`)V(ejiQtRrLnZS!ZdDg7z6V zj!fV$w%dQXohb>ky{WxMgA1ws9u)u4_?5c{_wSvz|C(Q}jo)vjVHmbpS+5m@X2VbE zbnd#+m)-U(v}vo=pdbA|-fn+WDIl}7?RwKv9qZo^>!c=k)_MD%ZZq_6OhkuTZ@J;y z|BP2I)$@D&$xH2jzTN&8+hv`k{v}>c?SHwgj{Buc?bq|A{$92McamNq@^B(hqGori z*a6E5lOT4RW;22%8qFv&TR{R}G=eA&LJQ5tx_AfNx zSi7A_qpCz!D(Tml^U@0r|GhW<$+M^)E79P|Ifvur_5Dwaoryg}P8vs;mx(l|ulr`` z)IHPpT9F+EmgPsR`$cENZ8qo$|I6{~>TIZYsH34@bA_|;m3e#cSNR@XQ8&sZ*)u6? zdc~I9BG+O&wfK3B!|>Dno$X?ky;kbE81`lwTF5{j+1|4FDTte{?S-Ldi8Q=$m3>c1 zpx-a^|C4UKg4**ZrE@TO^%YkB<#{XrPrlTZXIgqztbWq|H`x_17{3)L^~%%*{?%1u z`GM`lwqu5k)HfT6lbB&#N7|>6Z?)>S+@b=QOg}oYAKU*{i@m}4HBFw2jeEm#;y7+N zY*XCwYV+>tUKUTec9MJT#BwwbD>AWW~=3T{Mv|Y zx9--xKv687nMd%Q&vQTpXiESUHQ3N?rfH)Un0{)fh}foWhF+7?Y`ab?^_z{TsYuUx zdfrQ3C)G{$Bv!m7-quw-AGxA+8Y%wd#R!dxZY97&7jT$@a#keX`5bDo~} z611uu{>Ti^jIr~ZL%+0vY)r8u0`p$=T4n*MX@!k|RpU&BDUz_^ zgsf#fZJAbLxlU-OQIc}$aIlJp=8^nbwp3+V;CgoGSRQ9I3}FI~fAJ0rT%chGPV75g z5(wp)XR9wr+W+C_=k5QnK_a(xF;klJ-bIUE)M&6-Zo zu!1OzTUO+#NphjqlQ^xL2zT}_t#csV&}BRv8jF7Djf4y1^j z-Bq`~Qg1m;7nDuwz^-Z8;3)@=1(L!yR$5lmZ>mlCUblA=E3g5~0mA{13uIO!m*?$o zfA+t=`O-@Y5zVe(L1qQ`6ks!p8&gjSo}1yF7`9@>ZYQV4PM@e++QIIUqXfdbkqEA= zT9s>n7vB^}t+BncyJ0-gEzWPt7|7VseiJ}FcE2oa7HO*olg(BT z>nFV<$uv&ELIiL5|JZxC=18t9-%lalL2-1UXw4kWr9?_%)9OT3UMe#SqBI227h=@x zZZ*Km%vkP|*9O=C3PJ(hgk~nrIKuLoImWRa;kF`wk37{%>?!ESHUHJeT{6abLZsK0G@+^>u6}u8wIYzcepSbPx%2uhTW)Rj zUO|s^q}1r6W*onmk-i@IoxkmP(d$e|U8U{y4ZFfldCrUExsZSO?(24pBBTl>EuF2p zWo2w;Ll=i&4{cC(Bus;Fp%w?1J0k;lCxjt1ge>gQ7C006=HyTa#^4|}i`aab+lI-Byr`Wc z+GcPool5j~NZajRJ=~&>G9ix3_1{hR#=j%#@h``OT?`1?c;zlno*nA=p8DG+j{B)U zT_ujC#YKz^svfNys(BsbobfL>#%h^VW2t^`47d7|4zK#<3Jyx)s5bdywqKWFO*H4) zyAtCX|N5Rpgbv5Q+y0OL@E(rTZJd2lyKwy1Rlu-P_+k1loi%nQj%Xv4>Yc>+m^)5* zLTeC1LbG5N!PrsB!6Ii6q9LSJo!2#yaD8d$ejGm~x!XdAC`Y~kKy^EFf9Qo^_sYy6 zE%CU0Uct`aldmuw9(h2%uPMM~2mlCjAl#Nj8`u1Jg}Jj!UQ3^w$QHL{JVhCS3{2iIq4?0$>3UGr zs2wPi2K}sXCsP}g3xlX{CTK$PD(eo*xK3|$jzB~Lc>&}i5uOxQh8AXGLM}^bS~N9@ zsp*2Dxrz>uIbYGsdiQn~l zV}TZ?7!otax?p|?$}`j&rX+7cAglD(tYU4iu{L#)vkTeoK%A%qQDw$3^7*UiXfL6P z>+nEM!e+y8gaA%>{ZyG=ew{C%rt)v*R3yo@4Rk_k0c-;`F!%>X%g9j&O_SA5ob%pO zUx*P%3OeIC+S^GUmPb3fLioK}G4K>1aTY#GljMXVzl2GxhlqY*)XU{Z7M1el8kK^V z!X-)(I8pB7xrniA;w-~zF9Yx@aW4vu=i*hll_eUvS3GovMwu7S{;Mr({n6Ge3I&h- z_fD=>uBXas>B1fB}w9)%w# zK~W@rUIzUn@ZBQKvApA68H9s6F7?|46HFom-m0crG=SxLzLWj!u9#h;?qGNCp|hI; zJ+OhuM%aIeu)piz8S&!k)9FC}ciP*}XWMN?c+Vrd4sqB;8e}|-1zQm z&BOo7Sja_dfYhLMIYzLWPdbU%dB>uXr5er7VzA-I~+$yczM zL}$m&%1pCv?3TceJf{yxhD$FXLW2TH1S1PLdWzh2H5f4UW)-liL^c zg*rQJ3VzLW(M<9cO^2Nk4Wa>m3Ck!(IrWk#4vN7b4#E-$ zdG02m2evRM<17y=rSr41|K6OqsmyNcj@7rHCr6=E=7Zy^r<2wnN)aJ=uzA+hn6~~V zO%&UD-koW6##qyx?AG#`G}c~jo(%TQO;ha;CimZGV4D3&n^d*ezfXo)2nxfCBR~o+ zCrA%`0&rg!42cJ*t%%AnsdEM97-nwf`=B?ld`h4)fxty#zmJIq5@*mWeJr4QZOt{z zUifIWqw3=CDc07gQO!%w^Mi;R_l=L^XC&5NG>%|R*aq?byXjJT@|CSQHAdXJhrN}?AjzGgUzcT;@L;y}i4VzSAy z&LzpS(idvTfrtjt8$8jVCLYL@irbJDHM{E&CpT0!d^pvVIvy|MSH%@%xaLh-EL`Bk zSPzd()|U8gL7X!T`}kYhck}MX0}}bL-Ow+HE1b+Z%?&`5A{%nrYQ+HG69Q3Rxa?rV zlO?0X!)``uu@cplzE&l#b?zwGp>yf>=GvXN7`}-?sd{mPf^}Er>dx>m5$?EUBHI$- zQ0PMi9njlXbpj*p8lE7rY3-$T;+r0iNFkEix%_c-l;Y)cSgOo;TN(UOh+ioTGL zA$Ke;b{!=&8^s>vsRb>W#5~d4Y9jH`*a0^2waTGy!6ZhGYvU!hDlZ{=u-sWE+CWYP z!3W7DGl3_934V_u9$QgMhY@$3wvQQaG6L&pnN9{_Z=^>AM!w&eG*!NEz;Bvn5_QYl z5ah$6xUVYFG)_GTajTaYH9*pV7KOR!+vvHzcmljE1HpuLUYnVENAZ&;?sBTsu($Vt6Q9e9ew%6@@Y-QpM#&6lJ z7iU-Yeb@A&YkZqz61HG%r-q5M)%Cm>$nhH=f0v9^k?>dp6xFv~ujSO)+*o^yFyx+% z_s0#Cr!E$NkA*v-(UZdCMOiyacM1$)OtW-IK&P1Uw}+Kza-FRS@3 zC?tYS`aON^HF=u^0nOqhR%5oTtoscXYq8t8bZzy{##^0Bm6#=yZg1;wq;`pb%{8M` zO^U8|Ug9shp(u7OmJD5{IcKEJIj~fX-ZJY_M?ZJK^rbdODmYXP%m5|?>Au;MIVV** zObCcAckoE>5Zl@#b837z%hn)5u9fN}WfmL>DYgR1u#r^Dqex8ZePtvj$r8W-XSuOl zbfZCa&pF89Cq=mh8l}&h#BGt5yo83UBXQz2SRd0{t)J&9DBcoarP#OX&jrEfByQoC zX;~2L0^oS+Rs+E*o`jjL_H9{bU>;;0RmV>yp>u7wRv%lf(LOvJWz`lNPeJ<@YQ4c@ zy}|!4ve2itkg-~fsVR5$?YA`HSwkO~@d3CoQjXMFSM=P;H( z6OUwe#{EO9 zecAzFA$i~C-aQx+surAs+16ZBT&lPW4(zt!LK+|Yx(X%UY`RQ|0?5g?M>+TdwVFSW zI5($@3>er|4$f+42#X>Gk_i@DT}B%b&SQnJz^QnEJS8|RR};Chzxih;Fq5wZ~Z_sz#peIP*w1<}^a2+n6 zo)?p(69uphOm2h;4@W=17dK}kY~1e5na*=ki0gE4_rUF%a_RbCW(V<4}7} zRRL`?9`utq!9mvxGui|z@5E&SD@BwJ{4CGP)K@5V^+;QDFN!+M9cp^%ks2P8EZ`Ia zx(X1Se1{+;GGDkZf#1NxA1%FXJk{3da|bL>(;`tRH}9i(B&qmS^AZPJ8gn=%jJS-v zelJ1sAW_dgGTGcIU}?9=#C3H}5e&&Z*UOm4A zUGI~umqZacm7K+4*)P&EWsyA*So*6sYQ()3zY}NQA5{s~?~IY~h6tg;NjH)KeQ(7J zmRS!`h{tFqSFrIhnL4kXc;hB5!ha?|d?cU+)drlf*NbTNTOa@X|NKi|dV3$$aJakD+ur*jM@;iilI8C1AN~;H60)E7s^^q;MwqBpTyMF@=bX@chur?~ z!yK=C|K~@;!ym35pzxR8@5v<97e@I>Jib-V!MC)O}t4vbc z(uPfO{>`r|R;TlJ;Rd*(st1!VzY_4@)|cNlPEvD%>UCsH2sx~|m$)i0i)HL6ju#P$rxCk`TwZthtt@^LBdvg?dUa-;ia(LV5GY zsFypsm2572-O;D@LLoW3c_c1}B@k4=K@Khc4&4UjSZ-h~*_Vj6qCEo!y8U1qFGs13?Q{2L<=Eu`t6JRtWDXJwGal>eMHiyuIA5TS*)#ZcGm8E zpw%bM!hL${fm(#3Y%Z-;;6COb?*>FJ%P!6Z(bCd_#C%C*xL5H(F0mt|lUJ^EZ(pGv zQTpTG{Mt4o_)xQ?O+y2y6#6|`Hu{rydW*IYNn3m7=&^6U8o6`cYWP(u9bNr3s_07< zBvCXKDyzl2^pKTWUcfTNoup1UI@zObB^fsF`f&Y5=l0c`=5=ej7jB!q(D>G!_4naR zexEub()BgSoz&(dLIr0BhUfUJA4YB$(Lwz$-!!GzM1|Kxg&OQgH+j-xMU&2l>$h%n zB3IA&WQoUBPU4>#4_C=&9G+Za&V-J8SC*WC?*h_S=!w;}4#F zvHt#&i2AYKFC}S3?jP1i*iEY2BQq;U5gjFIg-=WJQ97`(fjZ}Qm8wy;f}AW1YTI_D zC+8c;)lD;lItX1aOOG>!W-**T5H_EnW%-|$HK@07&5VmVE;wkG&vhorR|LNW}SA@R)F;;|jLrx&M+MZ-VXa~-HDpw~}wI*pm z&*sNk1Dp~wQ?S_e&XZLSW~40Y%!2p3cHl84p?>`n-thYV$C`t>2TO9ZKK2yIjz0es zRObM9K6krJ#8TUGUwk4=H_kT^RVQ>WJlQ-rFGPG=mTCc~H93_`-L?%{om@Vd@ z_$=%%F^HN5;stsr#Ppda>T>Z-qLCX%Md$_x-AMfdTpQy7cp;o<*md57l*eR}| zO`{iCgpzp5S4rGG?yNEQtN8<%9uJ94%8HQeYpxp!PaY1Ji1+T(K7J7~>nV}eP*ztr zHr6++Ge8n>$K8<7V?|9MYZAksg;s%ltUYZzxMY{)Ov9bkHA)nUwK&~)ZIVxq(O#va zrN;a1TTN2(vyboY3kkAloZ@Jyd*AO4^v+w+ts{+NMRL|Q1Q>c;@0MS zm1RHmj;d@EMmp|7soaG5N=iQ|@nUX4=4093$Gqm%z)$H>BT6!-N4KdezScf$i!?j! zH7q@Klbkv54aU8GjY2!^Q;Vm9XjECLMKeNHcgC6TqVU>>SEXo{zQim|P3mMFT8Bw> z6pHRP+(V{T!>TXVC0qyM*8)y3_T`IyC%-lQ`LZ?UISXw^YP0V#dbCvcNSql@+@p0Q zv$45;eYKK~W~f^yt2stk#AxZldAohjIHJe9Sg#97C>Qads9N@8WWo`0PcR|L4nekD zNo3Hl8Y_SN=FS_P+qXWrv3ZA5K=m@H9KE&=vYF&aVbv>QNiir(MzA*q=aD z@=kiisURQ`CfFhYfnVT37W~854b|wv>btAfBVF%5nMk=LReuMa^uPoK?Vi>nFj)dx zvON^WB&djl8A=XQFW{~{621dLic}a%vq~#3psXAjleRtr2DW61WFj^~m^e$dpr-|2 z>5Dnl6%L{W3FI|`FlcGMVX?*qh@eHx@77l zu!Er*GAK(8rB>r+@)_+X#Skrlc?FV{(4uq*3X~xr6Wt>)210cWT*l>pucF_= z;XgW(x)UNnJ(Mk}1ic~UM^dI4R?hh>d?ficwi{qtN%vMbtnn6_Y@GI0b9243y1Bac zlg7f8>(?$FC`<^O3-Wb*6AKoKc9DraBirZh-PJokxp8%~_V>!FOp^l{vWuZuFlIP;%Ha`zHh)7XBBp&xd$iBi)thTnN&jF%ovNp6 zHz5v^ADJt*UM(W*wBWU(L;?I{7DokyN<#di>l;X6M*VsIvOGRS^a)O3!PxOFb)0Y> ze{!_DFC$2n^e^q5ymoc%>PBaBGU`s!37~=I$PvGSWDV$ofI?k1=MoDzDJ>Qpc%aoy zjEqG%c1@X$D%!+ib9e35jT^T<>U?1RU%J0k#XfzLRr<6n+nG%^b*;Bc11(TwF>w&7 z_eu{S`p@>^j5DwqQ<~bG+$qzIuisezeYm$u z(j)DCXpx*tRV-9k`*it=nk;32>LWsb(PM-1T~zC7J!+@zg?fG3%{(==dTOcNg~E)H zS5W{xw#IfFm+tya3|kwH)Z3%(#Du=EQA@NYqTqLFOE2m+ zBL>S@V!>=?uJVIItztb@=2*rzKUm*by}5R^BX@e^fFFyC!>+#E<&J5b7WPYID=j^g zlqDIW;Z2i@bqGb&Gzm=7geu0OxQs_vzgzB?$!qeo`(^xA$f0vzqfkL zgqk&e^*QFF@#=;^>=|zDr0N`3)e+810O|q`D|IDTTCrR(_M#!Zn*1fHXGUIBqIw~V zoy056Ym=)%OeEdwdOzu9J!_YZmkJ~(RX~1H7c?f2tTf#XZ3l?vV$fG+XUWX0wf{ib zHwQ1T=&WA9j@&oaKdfvMRNLgm=n#HAsRgZmX}t?UrP%{v@LqPu@?x> zvwR?!!%PrUBX{MK#aFAL&qAG22SjZ`*>Mv3@%cQcn^ea5RBWZE6 z3uV4le;O5#;*P|I%VkgUp`LYomops&O!D;jLJ{`3g*m#S}uT#qpV~yR& zQb7b$0!J$Hp{|G4%^?fylwD!vG%j*47tw@*SNFo$Q|5?BSw6_k!tmZ4ElD{wQLhk& zOhP|Z1Ip}+%S$+XEN)zGZ|D?j14UGa+Bi^I zB3WxSLZ^Wjy>YUbZmi$@3(O)5h?+cqanfY>yXv^m`+j^1)9TK4i3URHRVKw0Vbn;nTsIyFw)_PQcn*#|e)s%5+#gY}KjK^hn6IlufH!8aq)Y zNVFX}wx=~JIr^Fk&`f9V+*-BRMVY+QyNR-|mEMi>uep#^4jpBqk+)&iGUMVvG$v&P z*jF5j;-wO-flVAUr?{N${84^c63D#`{>}7sW4%6#t5eGyDE~iQW@F`lYTJn>&a^Wp z+-!6AI=LlwOY3SMt0QU`>v^O*9OB}K?napj~@&bly^v0>y#RNFLb=*s5wk|T& z?RxIkZ>)B0J_N}RK(V2># zEe)&Xh^1*l143?WP(8I~H?>Blba~^V#znySnv+8<{zy?{xiIV)(qd;Qf3ZO*@jgwf zU3LFEt2fu*U%er7G8R_VO?yIVL*w2}JK>l3x-Q|`9j6b_LvE0kk3_^j!2&^7JEo8( zXoI4&K{a_y8ICzYDAm5taW}85Z`8K@N0TUPZd9AgWy015QLWBL5gn)bKD*BlZODAX z=1y%P5f2-;4#I9FJ0*&toShR9sBstGySjR%vw5p?WA$CLgg1mr8&g`_f=`(iWo%wukZ@5inj$WE`Tky@nn44Zoc zw>QHXHP5rLWap~gb^%V$u)L72aNsSGWeCx{tn??^Nd(p=cak}P&b5;^ZmwI$>-0{N z>*3M}qJOhM`&smQ?Uc{(i73h8ho1CbXisNgX=ykzRi zw03yXx}DIpC|8k-8DsY4lxv!UK+QMt11O-Nanx09PFtR;+vwReb{Ewzxg`1*da~T3 zEM&Y+>QS&8xblgR0i%`yzF-Lq;(*q$B`#OJ2kH}Wg5hfE8qrreoQnppLwakxAL`D| zGdRVD6oWnyfRBJs0h@3&aQazG27_}PUssc}O&0SF$;#~d{D@+XDI)itRE{#MVsgSn zIMsy7DfC1W2FdFJ6UJp$9sZLB(-TeD$28m7xO%7Zf?hGV6!YEOf#bs+TVFMETwx}b z+?f1vTb&wkXcP@u#j3*?a9S(Qk41*fU*M)>i&bt5bgaF$Z;uyrqUJy5Ac2OTY>`~c)YzARb!4%fr%&&9(tT`%( z=q(js77beU2r-_i0B*8JYmdHakk*@bBs^v9!mLwq>+|ZYE7$58Bis*CKL%-_m zmDC=yM65=0*2w6B=(tQ6dT<42U<4YSX}v)jHVRWKX@+XdY!!sX;Zf7NC%PPt%sXH`)Wbq>=$dxLWLKDLUbXl4)X}uUp0^=oYU}!mTisNT( zG{>eGYqokJ$(tsyzxBXBZ_|LHhpG**tR+9266dyrzo%|`ytVg+=F79h5u?jE7OKANfK+1{ z5j3~`K`}6FswZ41S(b}pa&M?kATcI59odo+ieaPaZUME5 zW2nk|`Mik^?NIcZ-;Uhm253lbNe?NG`HD6|I4uQ{Dr}0-O^KGQKqR|Gs$DR9>yF(G zpNXVzoI&69=8r2e3l^td3oOsi9Z%5e?b}zyWB%0Bv~E>N!Mb?`wSq3&JlT%NhSs~F zX5Z_Oe{A%1^QeY9v5fXmZUMDOF;adrP<#$ljE-#y2O1}mxXHzWGPiT>f)~=48|zij zdEBnK<|=Dr);Tn_0u|d|tFnpD{E^}icQH6De4vC~4 zO_XU4yWv6;d0Ap43mTrtx-q8GtShczc1SjkGRM@0(2Sv|I+qxd*lAdjY{l9xL!czR zw37l!%Oo6iDmo8rtce_<#xR;jpv=)klS}f#8RuMM2ogJ4-`J?;a4h7hITG`_c{{3) zk6s7_UP^v6d8n>@bj$iX#?7f5>hIQhE!gXyK%F;{RCD#?+aKJ#KHDR00v8rwEb6n4 z*U9w{)^BXuAca|j)X0T0l^%O8VqfjTm#j=aWP8pQegtLqxR{LQa# zKzV?IC<}tL7OL8cf>Ce9x%(fFz{JKIuR47Eo!ON)UT|`B&RullW^S*pTg;A~`h;Uw z*!c;3%5I)|f7>=3H+JXh<_C9fjx$|9tU0x;OHjJkB$X1)x$>?V8BCr?n~#hMa|5y@=S z6oT4DwH>SMs?*3QK_;+DZE}Ws9{`MeZY6HrBX$3tmRV!e^I~a+CH7Vw=S28*x3bGsm;jxl<$Ct*bU4?^FF|Am4Pxr*sw9H7?5^!Z*4N zQ!mM%;{CJ*&!?J*OcU$E&~HnW8-=LJzdrA2w`ZQ-;Dv`u;;&YTQ0`Zpx-3F@fBOJD z`}~z5s6v7YhQOb0aCTLRLXAWY8MEixG0TFlo2|dhQ7>G)2Ot`!AMDG6GIt-^m^G%; z2%_WdPfcE{*z>^TC*>2^9vbFW85UQuhCFQS&3f)NeX(*ePc{+RCf0Y!I^N4QU$m~F zo&T^yEFDJ%6>Ab{{s@qI0-&SJtME59#K-2I0M&B zJvUQr4{S$o3uCe*56d?jsfv>g4=fF6bD45dNO1;`^k_@l0FKxP!hN0`{BT@zUQE{M zH)|(lZdOw!aJV;_o5H-iz4|MtB64f0997?;jtK90P;6~yJH~)QAjRaP{c3GCl^j8ivcBepY$k{0_Uk_1X>y&)bw3odj{0;GisHnc(4<6afWqdz zWZX@!A1}l1UJda!6h_6kGLQ7s4zM~GtO_vRj&fVGTjM>`N7`A3I^UvG+85T)b*OArmZ&T#{mVLPI<<_1-Nd~p(&bVG#UI!o$Kox3Jw&8y&Jdw zf>h;84>+|6y^iy z1GGM$3XG>1ffk#g)xClBZF`0gvhFMiq^|x6Z7E+fYIa(u9{%C9E zXOAwOJl}JBD{=V9{6Mvs!WLXzvTTjp#Q|SE*{oKBEEE>}J*p|m5|GrmuHcE6w+<<< zy`BFkPSTziQXHEjE(p?ckPZg@zUzhk&~>wX@O{cH?SP6s_)%Rwv{7{S54|2Ga(bcT zQV^3W!qkKbr3TAiRnnR+K|8EEHeP(T986Vv#xd)f_1ors zhXd%|L9*MJ;}?2Jk}@`rPV7%!J=`MK0SDk!;+fYn95yyA_=5HV=;*eMo zmn0_qhWQLTNfAYV_jlD(&8ohTuMVq561xarAj#v9B`d8ySL`97>d6P!ZRcEVSBooQ1%QXCjP>qzF5UcY z?on8(Pw}jx7oquN{n(*a7aKh5#qwF0xPzG{M%;E;Q8!WcBR|gvPM%Y>D)0wVhB!!^ zte^PBAnj!o^Q@ZqCNT%ee7b^1F zmMU*lKCMf)STV9W^-zE7=Y3nv)LAKrgegmAB>ZhV@ax5}RyW8+Cr)sC{n6Hcz$`p} z^4%y4!z2qcN@P-IJs6a(6Q?mdr9YtRcACd=N`rM}z}Z*2Tm>rluc170XQ)@Ms|Con z{^d=~iLcLe<6Pozt&jOHs-wax%pn5rxNEy|`ZuLZW zych2(h0NWb{N-Jvo!za(b+-y{bgz*`%?%(QpkY$Nt)+zRtZZaDDAM=FN%R<3{BkyW zAe9`SS=;!qo-T_2_M)_(IprXsqN!|=Gz~Jx?dPSJQ@@Y{?TqPir6lMtPhLFacI@gq zbeha-{?(#I`c8h*TCee8H8C^F%;|biWs5zIE@T9?=!Ce`b2aECkMI%wQ0Dv(n~QjT$2*2E~juWhcwLpZY=2cOoiZJ3&E7 z%d{vH#~&1VlxArLa$MXFvkx~0`aj)N9cOg%f_a5$y65G29(cKv_#XFq6nM^{?@QBh z;`(V>hB34KTH~R%CSR=lm8Ozs;zh}T+NfF9A8;V{Bf9H{4sH2Gn&xg&B+_Q%skTPH z_DLbUlxR^-rp^g%Jne^N8N`XhIa^XGGjyFa3I|S#(>X3F?45<$;g+Y{Uh*Qi70t!f z#H+8SFLp99)tk`54LpH2l*Dzxx9ze<;Sp>9;l9iOE>=NGkC zo6og1{I&5HjG?8?mqkDH28|JU09&nG3D%lx zUEqPo8Xtsmh4#>0`utRIqYe^|5Nb~QgQ%1-Eznw9CtjWD#C_Cdu5P^LJ&f7H$ul37 zG)J{f2QFn-`3L2Glh_Zrm|r_-Z(#COr&M?K(kSi^I2Bp5l(ro(TL~^hheFyYXJ`n$ zj8l>RWMwa*6MZL-eAb`u1=PT$&TF1g9(Le!7kcP$PgLFYl^d(Kuc+#*nlrUs|8Q?8 zb)0vO-;pb1c_$J7lz5M-(yooF*nMxsCG_IE_yDTXu6+)B%F%9m?ut8*GOBS%L0~QI z`UCRvrBXB-cn3cl@h>%-9Leo4lyV-K} zbwlEERL_Pu9|Z&;ejv@gzA+r(Bf3XfNNq=*l0x=D{6t=9eS-1^#W>@Qv^JCpjSYcV zYazYrl@-gbMz3MB6UHN=ltc+NPf7iQ3PQlFQ}#9fDdnxn$r9!vx<}X*r>EBO9v8;e zF)ow)&sQpX0UVme4z5*&{s`zyIGo6gyB>$DOi=G{rTF_o+PLd3Hzj9 zQVKZ;b540F;*4S);)x4l?myj_vR1|A0uKx>7oBu*u)o@}7}^}`Xz<_T|KC6PXXxPd zI`6Oe;fn7s_Xa^QU?HF3-CV4*)85S=Y}zHgR_zV7t;`~ng(`D$yV@JyIe9@Otd^I5 zb1S&H)yL~6MYQ9SSNM`z+D_%!c;Sluu61j?Y|UsOv0GwAzZ1J&zX-8TdO_|L{lfEu zf!~+Yw&#^0UcMwQsY31di-apL2=c)o4bhOPg3d+8on;&TZMr-s{g^+fv^Eh-anWglkf)|7>JGT-$R^wmK>t(}6kvu)B-7KBk;ly2YY2iU1W=A+#eD5Oz8 z@Au2t^TS@hn&i2jve%~W!Ai)**6?SKj8)HYbVd?8{{0HZR;r6I<_a@-`?E%yPMNzceGOJC{YxmsTxCd(gP6r zaglkrX-b))9`;E*h!J!V_kGm9sF&hntBut9T9|Hn)&ubEHTHVa*(ji6K~y=2D*y*0 zlIX>I`H%mwg{``njyK0?_TIc*)N<-|A^Rk@GkWmn+}o%Ko2V^6x&m9=ja#c%THP|h_;i=>f}NN3_LDOxg`@K^M09H=ZZctX|Br+I68TLe<(p(ZO-RnB|w!rVN!^fEhq_b zg}#&bGTc`f>b<@;S3lF%;7d{u#u2MT+r;PD3zGpY^-~-h88NRo7Rx_!Gq?1^v=s05 zYbVXe+M0dA8l&21iksSt*p{9@pwT`%GNCbi3Sr5}ivk@%8XZ5>*5uc1lVjW5^f++K zB1!QzrhU1m@!Jts8aPFflwQWc?76I>*G}3VZ+p#Gs@I4rp>N2uem@$Nx#Q)b*mh-) z>o*OZFz}PebrXCb>dl;basT8-N#A? zgOO|jgnlQ_B)EL{${I28M|f(!3RnXQ@1uSDN#&pk7@OmUo8o?P2^B8)qo607{Z+MV z`FMc;Zqw_n^y8JFzdVQoq98Jhe=HcQL#Nn#uzg^_$Bspz4i84+k@;U<`qG!)&bJ@@ zSkrQ44&lBA^HKR1a0;LZ?&8BCOIOLsg~StR@3&plYPs$#Q2MYIjXFgvSS!D{vt_OrVP6XRD&p z1w0(X&Y*K&vOn>1;9XwnTvb{hX76(6s)EqODFN+)G={eO9;`H2g_k?n>kyLzh*MSf zGMV;NwYoYU#$`ZC0^r?&mgj&6Zyg=xL-gp0uV7;8!ZD=2#u{7he28yMX|sOw>l#;C zU1hr@7{QH$$Jv6nmbZu9oaHz(b0A^xrww=B1kMkq-r;_U0u^(6L%N`3H2265XnaW~1*UY9u~K!Wy@{Re^gzLi^~bBKYRe!Vf=$E)DMdvO zSvF*4RKpp6Clx|=0shOvWK=>x(Kco>m-N(OUw|m$o3^p8NUtG!k#xO;=ZTti{Giy; z5~tcvc$UmtTUxuO1>t}Lu^n*ak;Ws=ym>88Od`WlVpNET8V|OO&XmU??^#H;k;L@( zTl!@;<-CsAk4ZTbC+E+P0C^rB*P`73T%suvf_WQ(Smg+WO+(lr+<_#m*iM>r#+>Y$ ztx&QJa%BJ)o>V$pe|2KyI8O!P%9g>|1L&NUD&H^WPuk?sGH+B9FEKS+KytSC!F((R zI}_Ial{IWez)qcax8XHak%-xCC)kRhu~hjMM?b9jb!!`VxI7VQ8 z9ZSDuDyNUpg+|ZDrp6Sd>qvlU^ymg8gxa3%H}jl~`#T}OGC81JsN~9Wv^F$#ff zqg-%IynST+ZM}&1B?(G!&F0ybzO`Iz^SZc+HUkuUZ@53+eiL26QF4DyFHs!1gc>7| zFcEu{N!i{0RQ@FnTS0R-zNE|`QX<8ER6l-ANc}s%7}g88WniMwH819Qqna3j-R(Qg z6MloLcg3M@ezYUh482I(&OT#*aN{BfQ&Dkt6HdHNA@6oyH^$w(KHuZe;k<^s>$r2X zI8-9Nwc)|Rc8*dvJ*yIXd7dPPZ`83DP%u4$%$^e#5$1)9k(u^U*Zm&;{~qxe-vnd7 z3E6?_VG@5)mk)ZFIPJdKrl7S&Urye=sylb9nN2rP0m?5DHSA~2PTv)cpt@dU@alp@+41M&xHPQB6mF{`g(JaT_R<@L)H_p7BN<;3nn$_<^4DX!VzTyT+AL;cycym-I!9YLe_}^MyEp7uT(mEh0Izu z7F)M+n|IZ8TUnXa)yL*hCEsQU>EE?>V_OKRHX768Zm?WK?HD`NNUtZWY{Ipz?V{{#7TMOGYWG!UW!2MWT&WH0{RPtcR7`j!#+QdX zxl;kiFQhOSb06zKazy9l56dfyz zpIz=u{!!#%{%B<+-)#M(h;rs}{o~JmMgl|88c&+?nUJ~yD9R=JVEyFpZ8m(fU`D}; z1-?@TIAQ`n2j!J#+?_$-1t1m%N#2ZGOtp8qqhEF-mlOn=F&0%r6 zlm{}gvq8`r2EC{}TSGa2UCDF$Zk0%94vWAJt`qWZG-qwpJ?rKdnD(Em=W;~4+QLg$ zWMG6h#v5DMzweUs8^vIo`@l$oBHLcmvH{<QZO#Cy>v0DYVkY%{9(<($O*=TE*1$}lF;mt~g=0=GwWC?&@k^bW9X(6?or zbG5v7qTinkNtuY^9IKe7!vc^AwwE&qiT4Ci5;%j1ED0>FUK#stFY0OBYfcMoFMG+9 zB#_9HbRGlG&q($HUJi~wAcE&4gR~%)*~_ASSPV>eC` z359ahMZ^U0k+Yt1Klh`ePYh21{S(i%HT-fh4wq=lSfgQ@7d?lwkoNi!OEV?3jRzHq zg`VqW0>ydlWb(nbrk^+7EZZs?aE}BDL2=W|Ok@sXen5b6kcT8TW7g7Y{Y+bf&knOg zQZ!{vfDrd{l7+m4>_s5)E@F*olk>Y54ggICI&t=iw#Mq1G0j~_ocTG491x+SJ!0T4 zrY>`W;m&AF^d*sDO29TLBd>4csnsK`{gbe@jai398DvFRAib0HW8=KJ{k^(Xy>ROOiArap!VS9N9F!Xbb@*ddulH-ejb^TCVlP?P4 zwfLLOs7c013W*(qP~rMzW@7Ap2dJ=@B&2Ud1D)f>Q*Dhtj|&S|oit* zL7BJ-j;~%uP#A<-3I0j6rxY*(%fM;$!REntbPWxu`G~q5~B4eeBtGZ2iuzd@`GP!i`f7aS0P79 zCTb^Fkb{>gA_VUZdTtm5Nu+y8zu(r-D=_^@oCsDN+R!%Rh=c@>^Qg?l?(J~^lB>hY zDA^G~-%sOMkG<(fC!1GXqkj43)-yM^o;~^Q!l;4(Y(_W$ zycy(uai1ctfk1Z11mzS4Qk^6$%yXd%KKTct@aG2;yrSNxN`F2bKtL*n=Sd2O7q0XN z%l#ng^*MPf071*gA!_t%CqEDeKGWgURFxyg@KpgMAd77uMv1gIAlbvCxo>^^KR$2p z1jIj-4N~k~hw$9Jy_Fk9c?fZj2_kFsc)$7$9-&PJZ;s9q!0tXCP3zQrvN3BwQlcG{J?`N85r1Q&G}xv0Z(n)qEMX*sdl=}U z;1-CekN`yZR&!;S{*@>$(-`#k6Q@X!wP0;bn2%Ua-#Q4+J- zoVXsCflF7e+}a!u-EXv6s@~a+jU`b=L(HK-47johqS6)|QUugVQ_=jWLm_`+ z%y~lP>xV^gUw%2pVz_MosU5)UcW+3jiqGm-Et^~zVRfzYv7}0rHT!A3t`1qv?DW>n zcOP8L!aa31-&Y344-Et3>~^YlbUmG>v0`)m{SDwr068cYPMIr{gGDV^R<&r|ozXEo zOuG#!NMXAJK@uo}NtVn%{r$fgbvAx_Lm96ML^>{qQ^~|Kn@x*G6x)lD&0=wb&ZS#x zo43YGe9lpaGeL4-Sd!I2u5dG!v+Q7_r!m-jDj=oQYRHGL?6G`C0`(ARkis+C9u)k{ z0SwA4*4pPh=2Eu1Z@)s-7;KIHQv#*W5h(rI7lG2>R-p6;)e-bzMe{xCtdF$F7PlT* z7Dl-sty7eX3yzz{I6iU=JTLNlSxM^6z$aBMMt$qM5*T#}r}%z}Mwfa8*~=N}CUNP) za3HP%LIt0BirnIHQ?D%jq9En3hmQb{QJkk(fqs?}OvMxDj^n0v462b!XQGX$h;F>; z`YXLiAgHHNeQi|wRi&F&r_prW)M_;gDVJ8+kNgro4$pkP| zMLAB9v-0;oXHnGfvW=ql8(~oMM*^mUMijND-)#LO0n^#X^^d1UQKt>ZP&i>KSM{?K zQB+a_y;BQH9bW=zYe!tI-I-@H_= zueS$P7Zq`9Q1xfkMIj`Q9=C+BRaO`q`DKcbN*x||udHsacE>8iU8_ah6*ZyzezI>V zsPMwHFdmU?1!VUNRrx2~^sK6-znj#zml$;BY!oL(wS1sQ%=eC4sjMap?m^s^#k zrcM=XD7hHFJo)x?gk^XyTYk7Zx~nN+8d!OuemlXHMJ3xBUi}Zxlx!8pHW;Qwg^Fm5 zc>i1qA7Fd_=z4Jo(%7JYvDd$E+x?LWap4IVhYOoQY#(r2(Sy7z#S4#Tp3@?UNc9N@ z60tyU3q4$)rwU)`#ZC!gFDm8Mc!9R&N~}oC#tJo`RqYo_U~hM0SY8 zKqi?In1cQxbdvQb1qNtvWcT+Sj%!d^ndc{=#+=LpZA}q#B;O-bhm7f+(AU9X0GSt@Oe6`y&P0e3 z0h0@zlzph8F+(+2*?6$6>1Xh(YLgk6mTnrAPFQ9Vu_?&nEWtWKFRkGfFArcvcH0 zToAbcnoV%8?eVtPTzL3(CQ`?FaIsOoiHI7le-VnSLvah!sr7y0fMj(OV)VcPBp^Cc zAyeURgyh)7uqRqNwXZ;~WoxSxY|WQXUb{hrLTZllK~;4{K6!;)?FU(hYDOcT{p!hg zC)v|r`Z>HuTG_#|p-0(;xN^wh_Vr1IDS~WD_zk_3YVsz|)?iX24WS<_g9-^f-LbFa zB*Pp#lrcr8BJTgKkKcRdOJAy!awX~3Chiz&E<-eAf+OZ3Jja|$WRpthsdk^gU-y@^ zRILE9CJs`vgUC7&)(}a_`+%I~&ZV{6AG~E9(^^=;@_$+SHgQeEw?=832mGk*6NA95 zpHj1(Mt-QZAcR;A<`}K?DbD|i3P$Ab;t}WRD&d1SnlPO@f@z-c+rE}IqYcYlYL}%h7d#UPwK)fjhryEWOfkRCokGwJl&RuN z(Bd!}Nn(~Ti>9!OP)^}-g9eT=6P1)m=;iq>o?)gv$vq?!kuqDXj3KX7Mm+{c>B8I; zm^JKd)Z!vowA^`R$!S&rQQAA9C(nrI#0L-@fOU zNT-j^RDh>|q)6Db0c)i`7_fc;98uKX*G~Rqyx}cNsboVDuRfLxG|7hgli5W^r0f0q z8{awkN|Qp#SoN)>bP}5Pm%Tn@q?`$7q$Vvkfa%nvSFXr0(=oG%ST5S94(1gFl+>JH zkVi=wMa(1lJ6#eb%1W25y*%e_d3WY56UjirA7^it>OGTw z>u;aZdi6xpTm6}H$<;*@PU*PjVEsPv%28)ZSbidmx;u4`1Evt5 zD$WDyk@PS-&zdml`uP~=7M-Y8pZJqa)MK&FH782co<}Ej2HAO6OEppFWTNxoy)659 zGSZ$DZEyk4;&&_@u-HYxkw!@efT*W$EaRt~7rvNfqFZ#9TK(&FC8_fY=m}WqCZ>sV z<^uN9c^K;85C$YGF8H1RU-Le8w--od0k8$0+wb|52s&$y==S0ab&JkWt8f0v_R*qj zbInRIOY18Hdoe*)`kKljaR7W#wiqy z12R5@6;M#%F^tXNpW&JH21!hAnwTk#r`j5QPQ44JlYI(2l~CflFwW!T1h7vQR?dmo zBOu^m4fVCeW%Wo~bFW}3QZNSE3vo7Rvmqpf{g6vBCnE*bLvY_@7*b9u189#<0(MilRPgoP<0K_#6yD(G=mmGx6b^+;QD7w#N<9=jjw zRy)Z35~ajZh^UZ-LOL)%c>wA`+aOKiAQak=ao5kZ^^h89>fF#4-H^)(er_DaQlP;j zGb4r#kQ$^p*#Ca!!!#%@jvtzA@*c=2*Ca(#&b)EIYmqC(*N!HOGFUpl57pRUR5fSdy=M1yFTl!I@5 z{6AY(ya^QeTok*7@~)Xy#3>`bCrRLWC}jd5e7Qe@pWhI*;2Zd;&TzQgA(g)3<;Smq z+e;p;@SW4Z&WnXHFN9{AhA&sRW%&5^YX6e>ooZSe9akAcMnpVyM#U36%0Q;JIU|z<;rRKd7 zhB0sBS*a%)hac#3m9jQEvEDmK7HGbiHJSLNvj>kOPCGhREfw)q;t%GHUwp*%0#aE-sk6Tq@{)fnc$db6DNj4*k^fM^mn zwzF+=TM$jl6G+4qcHS4_PF&CjqcK!mfY_Ecs~+TfDe)MnHd!{3AW(JZRLR^V>ww|$ zWnoVg4?j;^O!;223(aK%`aS(dISFhu4@%34C;N1ftm$7%fuBloOB`m)1#T3Bq4yZ#X;cLHNoeq6LsgBVn3i}i7ab#!r!V&vC7FsZmJeP zVmjpVsG6x{U9Alk1~=G2ol{qV!Sn3NME;I+MwalEwd&O}0y%0M=^W-~3H-c3QpZ>7 zz|UfoZm*rp$Bn#-n`V&f3u3!-7dx-SI430|7)S<2+>8AxB_l8? z89|*?RL89*Q!-!}iKsgXe}X4)yMiLuNzs!EORzl@F$I|O->sAkL?I~|B8zcKhW+DU z5HyMH0-KW2^2gT4^^d2fWHgHbc;E@(T@YRi6V94U$)NNU)kSgum~e$b5+?Zr)ON(Z zmWM8fDiG^QaQk%IJSX*I&ykX`m}_ZH5bH4ysP;U78F!H%4e$q@Bk6)exi={BkQFHo zI#7!gFeFL~u`aZ1@aXo52{t_904b+DQ~`t-2>9Ggc8dzJHNf=Gt5g2`Nf)Nb++9=F z;O<97`hIZ$rTFlmk#-@enys+^>9xbU6yKt#}yqH!WQcGaOOkqqr8K4K(1|R_aj}}bE~K?D(BYd&c9d5d0JIz zrw=?!lWJyO%wND$yH}*g3bPCN`c$cO60uw$&Xg-6uNVwD`4_Pyz5#HCO%&J}nD@yA zJk>l^0wpi$oT(R!N_95%f{cs$Xt*G$PGwx2OR_`??Ye9d2!^C*QhPjdaA$BV5?IYBW|nX*W|>PhF=!a`3<^PN!7+u(l-PKx zO|CCiPJ5jx!uV-6fM1qCJh5{rOgHd^b2j(#L~u$JiEff+(~m;6z%Lig(aoXHMjL zC9ns^UywIJc)EV5t;tD3ISKS%7!%zz3mlFARtV%4&RX%Iy-oZmbV$kO3X91#i^(H~ zEf80gn+v5gYv{#)q%7UHG&8}mB>^ClFS2b4!D|A`{LfxFp(YugSAi)M#A(NAA>uWK z_&?c|%ob8k4wH8%0g%k5uz2Dy>Qf-WgRx$?;;Jxuox;*v2?(_Jm+?x0!;l&OQ>ws_ z$2H849Y~M%pfDs&CUKxa!orl=fZzJ~zk6;fr=<>hnyi-UyF>n(NqbAKEi zBpF;;RkV^~H6sYjc&o%qisM8FdDvYgbQN_n6 zb#U8A=3$ZQb2izChrv(m(KLY>NeWt%+IYOEx$bDH`RmN8hI7p{YR1V#P-09~$U_8>7iB_%8DwrO3phfxASB`A?Gf8fVnw=I$kma0_aZ$i zFKRlENwAXsvBU**VOBazh8Q?0qEgCAXIo{e%WZq4Y;t;0Ql0ByxT~v@)d`!N>hN(wu>15I@)q)?=x)6*i{`r21o%ij}G>Sl8nW`=Pn^21V>au6bOb^ zq>`DEZgMW=qt5H6O7!yUeBsvZEBu=Y6*&Tug-=qpqLf558GEKd_MB<5+Jtl7d+G}T zSlk;L-~)M7<>Ny{}4%TuGJMD;_#Sb1X}?)T=G)ysdN;b>hEwa<#Ibs!OUX zKXl0@+fKSSuYSDQUFD!X9CaHn(b~Mg1$P{gLbC`|6OB*yWp9~sDgzJA>WoaQ#fCf` z2K!T)^3J<*d3_|8*P6M!2vpeH@PbpXD3>w-Cy0L9BV8LpBUC)7lLdI0fEf&XKnne` z2hVSw$3-4NWF}x$)Y;OF!Xl}h`=4E0?5%3H<(6Kqr+l0a@bly#b?)C!KdJiKh;>P_ z)xZH63vZ5%M@>h!zSG`*-koW;$uXuBR+RW{E7fF@aPy%c_`1R$+jW9Fd^ zoNTQ+6=yPAOVzS^_*EOt(AA$BcVQLIms|2SiWFB-E=t6s#0ubRxMl%q-MjmaUSyvh zKB5ZI+m#f!B|kyUaKzOEY8R1b+rv`}8|~CVn3wC8x6wscPX4TFbaLwSH&mLV8QUC4Dt-rgu_5DUtdQ+o^CPI8* zEpFcuYWRKxrFBjoET$+(X6gc9j361AA!v4|A5?~xZ6XdZ zreb^X!YBl#}O{& zgn|jaPkkV872>gJdAiM6cYz5s7gdCz%w6)S2(>2>se5N0P|J!@~xuqZW)Fnp5i;ej{4o{XfXzAnWcrlZ^@iwT^-~3v%Yw=K=yCy+Pw`TKqTDrDST27;`fOHZ< z9|ib|o-bto>Q%zo@zNU zh>Kh8ylC%5CEMy;`#iJkkFnn4)n1<%riQzP+H*Mc0>~I~^-D#Rl4*$HY;;O6Zb3iE z02tMlxfEc<8aTurR^+|@fZLZ1vJmX}?<(@<}Sks=tq zwW2O3uE3KM*utSEF9&7Wi$KqF&NNr=RP$7g?yCUL#j?MsP+Oti=OouZQ>ar=ZzI?y zeDwm$Czco7ff)oGAIq|HO|4M=PAYb&d=EX^1H*dbNzs% znvCM%Up@JQhx-S4_Rc>11ItBzRI#&DL0iDkn{K?~x-0$u@*wI(0ZNHsh~i_P?3_)H z5_eRB3zmHkl}nL@1yHSt*z_g{lc@w0z-j=D6OZ#~sMs_`Izc-F(rvlJi^^?2 z+djnmyDJbaWeX{f1j7aW4}d(#M;^f9BP`&>9?au#c^ATjV!(9Fi~#_f+Aal`CPRb_X&s2;&Iksg1SA4q8YA%_5d!unKsXR<2gd@*GyF?{R|^;> z_#O5oi!7Bs$r}>O$ixWtx2UZu!2pp2P26AZybE@7xPP>h8~`^43j8t$6Nf$!rOtpHz z0B*UAQaR8FfN%pN4{d-<{u)rq;vV%!k1Gc73fm?NY?K}y+}m;{rSZ~~wNX(c39xaS8IY(=#ndm4)!k||+S);b zMqT*pzzz4M`0c23zYuKX?(Pxw2!xM*8@ha1(UcrM1~M#V223Y2J{0_rfljh8wn4tK znsk5I)oglkMMh!dRuip_giU{PCghoR(J0aXcvVS9rNn_e09r|~=xnYAxmA_kDcw;K zDo6~%DWWm9X9u>tLbGqW$+l#p>r>*ZtGAl$8(wF&ufd!F4yVZPxJou1$~gXZA$i%} zgM#YtNQ*q1enOV!(AN?+tR@qEOD~AZ8J4mdRZnRMsyu*tR&ero#i&@UTxF+im;+1t z`N2U7u=x&LW^hD8!Xrqm8z<_bdGDxcSTHnG|;O_f8&E&d#I#9k}+Eg>*;{ z%w-F|Ob>@BE3MZu; zYPjMBWE{ixh!%eaoOH2cXBtlWs$L{l%nj68w>QwmVn{DRA5M9uG^4JPOCC=I!)6Y- zYep(spHHFy7Y97Ap98GucPY<6_8p}gNU8u6Rl;GQe4`1l04aksNPD$+aRPt&&tS{v zruQ5V*h;wK_GIdO22PHP^>t6;G2dGFAgi8ldZeGb#j$cwLo$C?0FX})I$Gl*Cn-Qk zGKwLJ#b)*kd=L@oZ%Ib7T2g?L@F;IplB{Our*2{rTIr>OzMqg4?8OKXysQwx_t+VD>=DqQ04Gvj|5Zs#>r2G32>)#of;$uds?P^bGXlu z>loHSYLv)xdUmUhCxn2I>GSJL1A-^M zw_T9JRUA6})wzdWdAR(^{=G+A|KjA?zqoz%dJR$(@V_6G0J8D{(#MHRx+x{S;K!hx z8Wne=qzTBHeLqaOqWk~yWJ$HT?kD>NuhFuYf3~VU0z+?m)OnwN=*4nfdh|%~SqqsK zb9~VMb#<5M#H;zBw}_q3?jpyH)G9?Q&5AC(DSqOE6Hfg=P_*cnY2iVulHe#Rdx@N* z-F*0PPwuVmLgH@mvCfK+DWt#yQ}|~yZOVFdT&ILEuyy(Z3L4~nP;{}@k4*;Tph6{x zN#vzzl%zQf3Jn+5?7Kapvr6tgJAHpVGkv-{-f%nDlD%`yU8{Thzr4`7BTse^P$HTd z8gdX(AAowVLW$Fde2YYiqBwQ#rscfwyy@0^eP-VHg9C9eTX4_u+o#T>gmvk$-+BS3 z9fd-q>Ib|N1kNL=KbH3Gr*B3x{0$9KcG(-6;L& zXB=7y&KLNgJg5ruL6*SfG7yyfsXKu>q3v_<(!1ODI{NN&O+hP#%fGzPDTsrpWQCy) zL^=DPv?20jT+`6X^m1~c)8KLuh{!3( zD+~;{ft@%YmLCEy^LrExh{Lim4YQJ5crNr-e@$J4Bd0hnoCn)z)^lzLL=Kxmjzbc@ zLu??JVA9x29Y0D7Y@0msML|DpJ}AF8XHWdeyW*zA?RxdN=zK^gCY;abnxGfjsCfRf z3!R`aLxCx{$>9_syTgOPCh>s-K(XSLIeB)Zt~Mq}hBhnSg(nH0%^Q-Mc#u0I+;gy^+3`stbb|lk^2LSWr8Mf>I~sOnX_ZWy1|d89XQv7yx2A& z|N25FBqC>#?6cTmhp=P9jJqR*SvL0jQ4Z}*+0V1_gtUor;n`4C>W?_SAEx+r5(lD$ z9OA3{bB{6dnNiarU<`3h5mQ3-m3otomqQBN^KoUR+{LF(3gv>^C*{?(svm?QY(LI5 zH!ro#&7+H*n>2t(MvCGDWRnup05*eWLkcI;LZT%Zk z?s1mOH6Bw0sjvJ)te!LjmKFzYDO8&=T$yLgOCb3#ZFb4GuJG~>FSq4Eh;%!&9p=poe+hloQx-Aj-i+X z1N3`AN@t)J3kvEOCTN6EITR&|M>KH#v+kFEJm>WKc0D2N)q}#3LM)FpDK9_$Nx_Yl zdEl>c6bg!u63ys6ZcYLfzL^MPrJtuQlVYX1@T907rnOgfmo$UD^GtcX?LEjDJSV~$ zWVxW72&ExJ$mI77Ac=CtzjNwQh8M4W%Y3h%A&HVnC~ZUpNr+dPJv-M1`byhe{pvzD zP?<**6T?J?aul3p2C8k~CWV7Ln7x$-C<2Yct=>S*AyvX&c;dJV-mtrg`qJ~X=aStV z0JO!7l}uo%J0D|NI$%NyNUQO8N@=!J=PC|40Nai?$~1GlU7>oE)DS+`oV?ODCl`CD zWl_%d2{6_erD#EnJj9v=e-Mz0SyK9JFtvXga$I;Cklq_7-}^v<{z6kDq8LaFQNzG8 z(+ZeSbi}MX8s}Z;lR|=Z3rC;yieP{o!7&-5L6E0ua)yl`_WE;X=es&P>wCh@uzgSX zkUF;$1wcq7^tS2YxhCxo+9vJ4z0i&1v5yMe&v@ly=pf+^aMBb8ztGEp&A{SKRAFk; zD7;gT5MYCh&|!r9sB?h6(fhOyL!3I47oAo?mb1G+I6NpEfz`BY+7ST*KVwnhj-|V0 z!M=x4)A0aGvhRfVfNgr(?g~A3j`Hx{)laixUjpPHJC2PWq}7}#XqAIJc~I;S@CTHF z&zz_Yj^F~k4e%B|-4$v#DPlzJC&ClwaI}53ZH_N?W4csHm1^ovFUc?$WmE#~#;Jqi2c1ZeMgWcb zL_-M46>!h~f9$>6b0lYa=0`0LO*W^8GsEd2XQF~KL7)%dpaBR# z^PmkyM;-yN0ThS=x{1*$Ru1n(NRG1XwR$JCVLL+hg)i+JU+kSDbmI&E7jkUa5&jG8 zEC1f_%goBG$^r^#^c-5dA!*qF^2;y3p zWNu{Fh6sE~b;G^mxOuzTs8>+MGQ(-WeFFS}<`^k4TQhPXfQPY-;dkP8^Q2~W(;U4n zb0qf0oRmZ4C|~}9vM^`ZIp2Qz)5Bbdc4?R6ro;4f@S#GB%MDT;nptQJgx!jNJ8@X2 zo*s3#y|%^q(|ZI}uP{+YgQ`ISvBAdN!P>!M$DPA{5Z&v@jAM_$4w0!-rUi|&=4oN; zcrRi1&=yBW(8C;|oW1PGf@zwq^jTW4%c zr=1hQo8K8+*-Cfz4M<%RaBEV0yhP5_EJXOpO@!)?lrr}cF{i{cqfEl`CvKELysV~; za`mogLLO?`nDm3Ys1Kp_3|r;(rs??W3q8pwsYF4gluO3Pr~(R-YQz{4l;s6)=-@_% zm6L2_IH#Trp)wVW(Bi{f5X6jNl1Y-yh5DD3gF*A)$!>bOfVrFa26oLDStM>_GRX}+)z#1>a~1Z6+Jl9>|AY{oxi=% z*)eSlgD^yx+Z9(OB7PrQBGitWc$hexC_!a*8i#Z0DN$yDBW*~nW9o(W!=nS{rhj;} zn{w>!2-{OEhN=VIJY`S;O@!)k`w*Vw9KbjaV9XmnlmkD(XOC(HTAKEnGbxHnIhj4N z6p9{Vg{vNNAQnA5KWg#4rYZfOFLX*#$_tq{*PvJh@r!QEITUh(*3g zO~=$zu1t;Z*~fWOjt4jTe2k{0vVi$nJeXxB%hml5MUo95$UnG3$SNWv)eZR%|xCBRwfV0i(HG9hLX1)X$we~l03)U%;Y zz}>JP_YV7$j0~$2qTNYHs7wdb(Ti9e$e2*G!GnHh`w>CPQ>Friy5_04bXULoOf&HP zrWv?cqYrt*z;dD0Lh^*iW5eFTBjS*-62NqPTM8OfXP`EKQxCr~`rgcQmJG?C0+@$v zI|*5!-b9FaDp5&F)d`SKU^WG4pf|opCYcwzrw|xADq+9LYWS{DOvP(eX)epd7DV7veH-`SAhJl@WhLlOyG(!_8 z4G89@31BNBC!dov;vx(@4D@P*1 zFi$;iiWKqMK3TCwctEO0(rm~BB-;&PVF#WaWTzmlUFzL6 zPty-qc{?RZPDSbkg8XJx|K|dz+^E1m?gZR2WXOtPJi4B90*{13YrXeYM(N1Ol(2~b8!B&j$>yXrl;ky#?AXk87Bq4nOQhMNEq;%E_rZxad>`dml=>q%q zs_q3D;(0I5G*3Tnnx~5m5MrrQM<*gL6@7WAKO&b0jKtySadQ!$!qczJ)1*P2dUBMV z_&w6XnQ|)iBw>Fm>cK#5-eCk_kmr!%>;TDPT!=(e%7zPt7)m-K5&Dx)M6}u`;Iltk z%{u|%CGW)f!M(SeX6oNw=+Ow?0^}g9-!#MNa&b5*BLsBKZILBXaVM)DjT1(A>WNbJ z;CIW3>K{=PGCj%n29QaGG=% zbeM`V3Ogb@(mPu=*gH+r^j}@*G*SFgN{Cazn$nycCxkyjKjcn#(Kd5@(lDy&F3saR z^&~0d?+xtXN5)~gv!iVcIcu7?Q)(0UkFa{Us)XOp$xJdkK}8Y|u{+$4!EkLUrn$>A-upX?`yDz@ykH6+}@<1H56arf|2}P%#)E^aBW*j^$S3 zh!cl)+9|S?8TbZ_t@r`Q9WkzlJw^4Oa2q86UcO-VZ~<68@?WeN5@NkTx<-J*=LkJ< zD^0Z1f3U84K@jn#iF!Mm~|qm1ffKswJjuT2n)(j z3H?&!!zBlJXxdF4-KnQZ*>-OcF-^pK+B|~A3Dr`0Dw8ssOdHF=RF$kjCov%iEn$uV zCsPt0iwCYJciag(iBQ%grqR`n13V^in5t3bGtJVqrdhgJrn!w^NSZ+WLROQtYLj?J zI&cRW49Ybp3HVW5F~Cn8+^Hu@*>>Lm3dL#&cboT+X<}TP2y3WFlN;d?QGpwG9Cd80 zZwelr!Z>nF+vZqp+CwjIfWpeF&omj=nSmZ=Zm)T6JAwksF`+%#cy+&ui;bHE2uqnq3pOzI3XB_`wto}Y2bb~ETkr)&&W zY_Dnf-`e2aoL#7!6%p~U^%cc@l*-!~0vUhYG$R)q0Yt*qGpS8Za;oUN;N*xxGYlPc z2B<9xBh0L@R7M7M+9?r{XCQ;aN9hhxKL|U-aub1oCICP1gz))c&0x}#`qyE*b}hII zuvk$OioKW(e9Gi_BBS0kIj?W1UMNAjq8De{CO>PMl#8{YiAMM^)K?Ls6MZ;z!NmM3@ z?gm{4`3E>9B+MY4?wmGBzAj%lE-mvN(nAhfsxO7s<(cN_M$;Vq{e}9WUF4`z38|SK z%GJ3fr5eZpVX@f(PL3I8fC6m~d+0qiJ<W@} zVnkt`bF?EOHJvyOOafQF2LOYnSN=$ohVZ3aV^%8^#{eB*+|=2S^+ic*PD8OXQFISI zD%GDF|<7)H-y9}!N+sPlbC zScMKkJVZl-TFWO{PEU*>4wUZCMLmfU_K8&ZH( zkza_-C7iQl2l#f1fG_=|2dH8I(4s$Na^bL@Ns!`R6lq?hh;T$hODyP@|7Poz!8i6G ze(k3*OD(1QuMVy*K|0?rP`>kuMimZNJ z#HfF`*MoeqzjOSNJfTBrCENTC{$;QGe~){C))GMy+^zfW<< zg}IHn^_v^5g`4a1Ym2KJiz~~smp8W1Xq7LK&)D8WKS`8rg{6_VjRdo9yCrRlBCiM| zQ+XUsQjv!ZV+qiK3Lm4woT(>CZF!)w=H%_=Px*@(k%v_sZEet4pSCk`P}Ng?TzGmw zreUt{D^(3Er6bdpjC^2Ossmb9dp$jP$V90eQB??2q0@ZI%;n2-_trNSms_hVON;Y2 z`RLWTwT-(sm-&9ip|!BMKEE`#c=zVoWlKv2%QWGsDs5k-Tq{|fmHwar$&n9Xaz`s? z?~>J&Y?CF3Ahk$-E76^8{%TH5bxW^>)`C=MKa{Pj`Zm+L{K{opzj4wZDv@33j=&o_ z04Za!y?4|*>ht!aeSVpulFba0d4T*Fe-%UKj7V4{*P)dhDK+r0^)MvUTWk0ZvpPj9 zJR?cJ$K2={7au($b6*zw&h{?S+K9dNb=qhq=fkzN2XOP zIUk59IUlNqMLt>9jED=P@O{urj+m<9?^swzJECxo0!rEf={?#(f0&*FGLdqD^0pY^ zjGlBa++-sRjZQk>Y=?N zy;EZ25h+h5aE$O-wyW}wIg~_B=j(Fd z&FLe)esan&yuh-RrF};o@fRxz{gHz(nF~%!wKfD4@da$?z7eqx695Bt$MIu{d^!jaw``c~N{XM zUPd%p%m-8`irQO|ZTx&hdIPgp1>8B^?{3>@rNac$AA8lhX%?{o>c_3sGzJyRy^!@im5xW$fuIpAq z_lKkc8Gr;Xyd^|Q#8s3mD4fV7fk+m{#iy1{)OD+!$cO2MC}`Y`Fp!19q#}(_hdmpO z6C};cH91kY`puDJa$z{ms&>mWCt%%RF#C=zkS>zg|9Vg>aF)RVv#HdBHH_ownhriU zLaZduK*CPR4Mhg90&$Et-La5X5QyVt4EIARAeJjrzcnuyWoun*J2AytpN2bxTUxia zci4}A^Vh;gpU(Z5AWVJt#NE_zdbJOFkNPw8@J~=rL#$%sct8DMVdb;srIopbNwxY$ zT@O$nK#0eK_s{%x%&w!|z5dKWLKf_=2d{_w`oXmRIC`=bD#BQR(F~kBr(fG6GLHF?{8d>>0H;evOQDWzSUi z%jb8O%2|PUf$}0Me}3$6?;uOSX+~6#N`eU`v?-VEpSEA}T+Q*<>Ak|+&NU~`H{rAA z+$((j#3`xbtIvZ5D5wXR$4X-1DFS{9hm?z%GA4jc4jECD6-`r&^s58?Kpkq5E3!X$ zg{Fx4?(Fn+g9x&^ro@7&iYu2h3LKJ{4v*GP5U3>f#no}O_E=N1Z)&fnP%%hKFhIS< ziOm$SE+XHZ^jkNTx(Q|knT4z=f>;)%O%&#OLMu%#eM#f(`W56HvNj@$5PEM~k|75xN9`tbL=fTX zVC>oY3r+y~?1&8402?cyqA`dxbTOzcFl9rRen*s1mn5>62Jfb#JSK8v$cn43a8!|u zi2$Y5%^*UfR?IM-73h1V|1fS5h3o?ozBYKb4(Cx>=x`I}_rb9)@3EUyQ9aWT;H6mlm&5ace000ht(0%$-6wZ~i6sEkBV<^W7V!y@rq>HYFI+x`KXM z*XHKe)~^>}}bz{Z<-M|F4`E4gY8ui*CwSNc;6k zFJ^Y;%H=DUS5-MZL7l+awzPH@c+jxLV)g`*6Znz(V|&8i5m=C{DG_oSE-uu16k65&#av=l0t)&D-?|SQ5x~^rXZZh z1#Uch<#OxFWn;0@CBf5<*$|>*3=4ale-A&Hl_ zSMMmTtX2kR_{%zCsv%IYO^wzvRp5rL9TuE|@QR^UDBm=_t#))bl}0hPcLWfm*cm`@ zdT`J?kom4Hp&TOqvbVj*z?A8j8d9~#wo87t5Z36Ugm-UkiF$lU<7JL*3?L%&Vp+GU%@0xPB+ zZGCw}ajyqia}O2{R6)B7e1G1ee*5n3FCQ9T4_S4ZhyeB7F)iema; z=eU4TUoK%(+sR;=5gbcW0TQqQ;2EVt<*>VCUlHaM64%wi4~Jt^l%wor2qfvlOHkDx zjvr6NV~Vq;31r1%{t5s4-av|@m3NjmYjbTmGd5Z-qA+|4v^m`ej6$35j-Jg%Ynhww zZgJD8d6GU~%2(mzEoXVlUEcEk{P8uh*t&x&7$rcTIE#n)x&lF6l7+x+SO71t=70+& zOSk0rA5oCXf!)o}#;%b2FzcvC>i}7b;F_?yOr!Nnc5PW% z?ze|(cBa`kLwI1XlRYrdQYvfQjf0ycBa|@HD7e|4=50xP>@8y$XKwKn6H~`Hl~(f1 zaDCS-svH&loq{^+(Uazmw`JWvONb}b?M@P+2>?fijDU;`*@$2?`PKnQ7bUUnxJ3OY zAfD*O`9X?7pJm9VJb8l+X1WJ1^`1|m8gGJ7d65^_+Mn9and&j)x;=Y~xHJU6B}Y8no< zv*Vu4UyV2acrbt7PGI+)3;uLM%A!jy7#SPD3`l50J%ZSjQHB-eE%?tisNX3QM%T{< ze@;75jqvA_P1IRX(B_E(>VG^~c+!bFBN!Tj4y6(3r_UM4$ptSQZ4Gu8_3XPY1+@H( zSvX~$6ydl5eVqV?PCHADVCcQ`4$#>#(Z*@&V63(2oY*;BZD3F&il840+}vnBk(I=W+j-B0Y{| zt~f9Hfu^QjRCt$a3=tHJZ;(nve}Vfb-;1dsdYELOQ?LxRU8%AS|1f`~skxUD<>u-3 z5XuW9!hJy+5?b=84XHSj5Yef`3i~-s*pVQg#WPI}ULGQ5s!{5?a6Ti0M$ue32ryx~ z=<}iFf+#c4C-r(2tFiW6Q^POyb)a7GOK3Av_6ig~k*t@1a|RYRR9UcR#PA`EOF9ER zEuLv=@KO%2scypLw(JgUU___@mhofI7KPi3Kw3r#8f1JkO};H3YHITGLxukRGCj}~ zVZ@=FPRe(8eb}<_fuVGYNMaCm7|ak1SO}GnZ>!JM8$JQN{){r-K?e6Wn8;a5STAJ+k zKHBc0U2{f?$_X`IqrHv4b}`^&DFer`mEIWqAM;B$=hmR1 zQIbwG3M4Gt>Gu>(O|i^&!bh!C0I(P?2&^&nM`Z;E*n0gNIi@8LXfE`z z(^7{*ozX{q7`SG_VASvCK^;io-->RR6Aljmkzph9cN!GaVcr%Q8N$Wv&j`rz99*$K zC_xScrabCzAO<4R7OoWS3S2T*(5mC-b_$n*gIBof)N@np*dGmkR3T1+W8493*D!4g z60J%;{dn+=YEf-%5&vWm6j$Ft_-JMmT=pmus=hEN>Glki!uIX;xi-|5UK`0rAh@Fd3<8dg&@n=m~UW7a)k^B@WWV+8Bg+g9bQ-9G|$F&6X2xlOqdWM_X2$Z8G?;~I- z1TAVEqUjp@9(fLhPyRG9jmv^a>vdhc?lS6hX?QeG9*8C|U4m*gOL(oME?q8`Xvz+m z9lW@{uwaxp#-)5q%WvK-Cj8N(M>9wLP$DsH{x>hyt`*dZ_tv0^?}K}hpo4>CZCLiK z+nFU@*`yn0@#n7+SlK)XcSrllUxbZ>tsiY{^>zs<6Lt{U>ps9AtW||%_P5x9MZ-^z zn02Ads?w9M)1SR8I8OyuKJHc_WPaZpD@Qn@-a zB6pmaPz#W&LvoM{m8#+tdMTTj2nM{qaA#cwLByU%ib>$W$2tW^n<_7`@>pP8vY{lM ziLzB!$+x1oMm`20hJ|7%;WwCAkqU(7Pt>oiaO;>jTUR&xNZTD5|>27)`xA$v<@1yv$C!o|vJLNAQ99N^3vh)qh z*|3~h$L4=#IHMi0x%55O_-j|$i~g`lQUiIRfz}2wiQRC=D6R#>6m_jWgOk@t(Aj`C z_{Qh|@1H*R+?@JL*i`xg`Nw~FzrU|!qmOse4}OYo-8+~)*o>}qIyYMSf3N?XyN?|A zEZp7RIi6jj7*qa}{`N1^S8o zZPoHv^HU7R`|>vuXzLw(@Y8op{$JPp>4$=uw-(Sdle$O;$FuLZ<-hfI_adKi63S?-T6q?QMP-6BcOgsR$M0sDJj4|8Q?_oA^xr^VVic4v&f( ztJH&#j0(cm*jqw}Ctk(^ncpHuWe2&pnbsn6z9TVjQ8$-V1Qkwu@2jKU;m_yv|ECrQ z%T6yWGALmBKkAW+fKj5t;<6-ZkP-I63iFql*o37*Oz&A}It z6syD5T=KAoX$`AXNx%|g-%MFCPzVUNAB6j~&oaXBZ*45E&E$tfzP9Jq*B93}s=Xl> zMU8*nAF_Ewm7mNK7WiI@MW5t~*OF!;C*o*N8{g2Hn_oHMEtA^9p%67$K26e!@{VZ1 zZQ}Rxjc4h@t;MyQlRJ^|p2_c%EqIo9t!&)6xi;N%BEOnB#ThBV`JqwT zN_Qz7a7^+P5{{)NfJbxwW2 zJcSGE5q}Ymi)@vV9gz2^HNUtqC%Kf>f%q+VZIQ7e`SJE#ZM@_NkdGmej=cQhT&j^` zDyM-W#FR;H86}T+OpO`Cz1f2a6z(wei7M@egFP}j!!ESmAqVr`(#F~s)e&mwj4VJo zqnJI81UdNRCp}56RlvwD*D#0#IfJ~M?s2-PN@gWL3tL1%7$@{)?&G=IL>0%P9HTU- zUj``iP#br}*`R(c;K_DR83O6o!m*e0+ICwi%k_pb0Hpl!a33KbrW>U3@>BX`cS?b; z?ae*4ZoyI^$|0+jbNJMYF+3EbuP^wGyk?JUlcVxbs8jW$zB15rAKzQAorFjXAEm72 zb|?@?doSHo*|xNEq?f&31=6>zltsVA_a-fkGRj+Ji1lT_cEbMoGVPJ@z?4S_?9!tA zP5SkI4`oQTp-7TA;OK*^71HLx4LS4ld7i&occjQZooU_tI%GjI(*^6Qpr6q&DsZxQ zZ?v|y5A}aMK*LY{1nfZRN|pV)p$c;eMG=UH4B7sX|B484JlwgD4UTl#@JpYT)H7zz{zL>(pLyS}*u$BE3=2US< z=#iZ~n;*}u{bK3n#>Uuv6XmsVM>n%fW4?bLiQFywr^m^=%YK)a?j7%vK77La7B^~( zr?xd(5lO+L7J@nsG@>|hpgyM6>K&m7X{;tz4-_;pj)#LY^vbkt#Ghr*JA030A`uOd zk<=Zj9a@t=Y5vaK;_~A1?a@gpPeEDZYUvy*(@Ly-&Yw*tkzDl+#xvQ*ojZ)hB-tfP zRwJIrL+)HY-s-TF@t68=bX(RCqt4T;t9-c$wp-c8tWl_({Ol3O09%C#+YvfodKjPZ zL2E0Yu_i{phoGGd(FHGvg_Ya47H{7fdz&or{QAi8WZ7AI9jIf1Lb(t%)j^4L$CkQ* z85j;SImjjZym!QpWw1)W8=d#V$=`i*d46eS{oc5pSI%TD?_Cy^vSDQ&qEwH~9{4t$ z>I;6Haz?0K0dyYksPn6G80jZOy;^mTBzO+r8?7&ocK4+zbXDailY4vX=KRg|R>M4% zy=A3i{OdDJj1WKzWtfPtxT=}TY7aA64lJte(i|Qh*H5s|Z>=mXt$fzHS9Mm@u9P-q z@t${UO6j(uay0kW+=rN!$0`Mtg)Gg#93-J4%ooKRpq*c3vmR!dwq!VSi+JYm#7)Tsm1 z)58rcgkTt&46DUbQNG1sf?P0d=_Ni%i+3Wjqq@$+z- zs|%rKk5Hk#DKpj&jzyr(o7T4#NQAH6Oqxuo`F;LfS zZfwZKRylt1aSz3l;QuI7L+I^5hv2-7ml#-^qBIg}V_rDDl4MlWP6jJyNG z^YeoHFgir}eUUqY#hszOq>AQ@tpCEcmz%S4yB&s`T&V=)Lv`P=MJW8iLSk^$L%I8@ z&V6Mw$Zo1Tp7rHKs`Jf-(X~udg*C3Xac&pntut9-A!z3o^HMo9V#eu7&tEw1bE$W= z=5F6+O4b)Y9W|T7%}ufTWcBa#dbml|w=!6&D>JRR;h#k*--w`6;Rp3a+wjp2VNy*>P-o2aoW@wgSX8( z(_g17yngyfLbVK7B0E_vLe4Z^#r=Va$l%Ho`*pR(frPKhDEfcAY$chZO^1Lt$+HfzoY&F z$Ch+cHhr3bXQ_Wh9M}k}5g~+yh1Dfb3T@*ChM-DE6ypwRi9)56QN~)pdl$x=Jn%>& zl5AW4J5{5AS)Q?UcaEzqNW=q?vHAfZ-yyvzK84GC_h?VV#OPb&k_J~@UvD*CeEG?Z zNvghD-$H6o1cl%XC~--^JKb~jlcG;mCr~!CY;_FT5)KxdPtc`N3r}sriW%5AqiZX3 zcdN&}>s2fW~8cKHt zP#ZLv$lav3NYuBwjwio~0pJwMtuwv#&hQ#=xanRa!+rkOEG-Hm(^{JUtMX6>gBghK1B@{sDw;pDuJbUbu5p_#F)uBvYbcjuNGr>p33vFxNxkxx*z@pvSJ zKUYh?#4=SU=q$HW!>?ok{{jaJ>+!gCN0PwP)_N}%_0N-gj1X!a$@uJKP@ZTN(HCVb z%W!g2u%#*lhK21utXdf|cD{*Q+M!DT6L+hkLsf z^$5Nxs7oJRdL-a6v2=;*so#~WKpV@19QdyO=vg@&ij$p%-@6^SzPwmPwuc9p-hXl# zT|@6AUqtfPt$7@6984K64*g9;T~y?~E_nIP*K)^9J|5<}g0m-br#FjA1L? zha7M#BH=7@#V8p$FpI_;J!)mPtJxg-pyk`HiG_%5FPArqKIdSm`-2To07D`?Ep816 zyM%V}Fbe!yZIkjGttX<~BDBuFO~mU^-*&yecgkL$=tzqREEq;8os&cd7)h)o@U+4o ztMV$8#XM+NDx=bDnrEKd1fH`pvZ(lDwcTQq}|@ ziDInD(KEa>K&tq+9OyZ9U}S*|8*P;&)rz$vYhUdMO~Gs=p0Xmjd{UrZc4&d!VESR| zuyICcs`YJ9dHejzy_$)y->i9$xrtk__IMl7E5SP18|Z)>=-W?>xlHkQ2m!NUuyb2% zaoNCZAxVeB`#<$)Pq2f;cq&MLSpCW-5WFBhQ2JKFdd(Sf%EHa@&!Yz3RpkR$7aHNI z({B0P<=|pQjY}oe363pl{-93?+vCmchg{l1|CM>*TlKY~t{f#t#RTSyVtC=GFA(Lc zQs8NF`#Jekf^(w?Q|0?UU0hjet!y-4^rw9yeGy|^8!!dKg@3Bcla)Pwy;eLejz)AF zksTASR#*@uT8ymmFXq-3TJv{qHls6>mRKIFkkdA=(ySLxwOj(gA0|CuaL&@vi&14e z=*kPq0M~m^`%fzE;THcv z=9c~&zg$QE_zwnBpSm7V&GZ??1G&D$jOR8|xmG#PJ;i3hzJ`{=YNHkIc+7-HIS$KJ zyRF16#e#ZJQ)2T@EMC{jGbI(YU3!)&hM9u>qfYHXiBE!P{iBK4!{Jy==2Sw)zY zs>tG=%7h*n;1#l)>`Gr(Ky+I+?tqk4+ZkE;tJUtVhLXxGOH)P*3Se08!|I)tWWxHxKp&I>-}8Y zsHPIGsW3zFQF)|J`w`k`sF7ATYR<_4depQCrN_KV~s0L!kcI_m&rLReOT*geSXOdZ{_kIPy^Kd+(Lh1pIW83e-Ai*l71Q zs>kKSMJT< zsqB_ddu&+NbkpB{Hn&#YgP(<(cQ4e1k##D6+4QIR&6YR*Y*?!(4;?(HjNk^7zejev z-21W+%KX$vTOdGUU*&sIjt!oB7A*E0bvj`bN?b~zEYG^1%K?r+$f#Q@KT`gzs{bi# zLzaMwffUL7>et005gbnbio|PCJdmQHfO(~K!ZWgV_R>ew4VL&H5--Y&c50Mgp6+XL z@N&l$f0!pUKO^H*CeRJxfq(o5Ic&z4l?(uDr#dd$eUsr+$8`Z4qT@N`0(9vGcTk{jac_SQl;$|!thFuT%Y9ICyXW6_Z@D2cS-ntB%g zS&Uu2xu%AHRRltS@aF6B89B%L>DQG#xSoDp7)tqYP5Anectw?2eT&TOoe^8O>ImE& z`)$=WUCt>VbyL0So31NvNd5O!cmLj=BGo=4^CS7`{c?tk)`FC07BeKDpFD?1rLmWJ zq+A#hyQ#U7RaVv)G+Fy)Z3cSJ$j~YMta9l7@gL?zA#B>^{cLyw@ce-zhIhrs^6%f; z5KN=xCJq?!D6PjfofcZ7{M)<+&cn3_ zPWj25DTghbO26==zG*Q&rNgIB(aK?=WDFnwyFYmD51y0%mzS4+rIZYgP}NTps{O@E zUp#S83r3}!!m!9;$K5!haF0j^zcn1pTzYaSvL#iK-Wn5hyj?28Hq}J>-2E5NJ$J%0 znwYXfZL%I>fubj+XckaaTDKS1Re3YfD_UCl1d)Sl!-k9@O?VzS9I9@$Y8kr_)q=zA zquuLT{~4>3v^HRKU>5-3Oxz_YZB!%-N=!96N>GGT40xz4!e9|Kv0SMcr0p;~I*>e_ zT-ryvyC+GvCA8BI$O}f$%WHxD2r*lekaB#R7^7?-_#G6-PGJYlGH^;JY)RbPQ zf&)~_B}QOXu9|Vn$;TqB#vOWC$3BMA#;ho->+wlxC)a}PxKN);nv^u@?bglg+4Qe!rO$3Q& zf{yKX5p6$3gL=AsGpa#t4;N}KRq%^1T1G)=FZ2ppbGd|TYpJ(+;eyqjAn-FQ@VXYY z8&bA?SFP$t_eQod(O4YMn|FQlL(|w%gy&6%i zE~`AqVqwv5Zd0Ti1#-z)ZAQGdI@GNdj^HqKPyISw6s^hSgOMXn4h18PB1#X zvbK>=uXcQw+?cjH-DYRU9z8|%x9Ce%yt^z^GS=A1{g6_S{Wh@lZr`8~9tRDA!%3m^ zU%aWN_AO(iMT~7x`*u1MXPrR|dN@WLL^ZMRYlBNDzq9+S$HjlyP4KJ-CR5U@@CpA8YyJS zFOhvurjGo@*1P%Qd>Qe-Ly0cQt1izS#BycbIV$URUFsiE*8bpFer@KPU9xEa+9cf{ zlUR~?buexOd_(p>f5{aTps5CN7~U5MLA|Ncz5I`UPvp;EC!iLhSAD;rk0c+f!I>>~ z4=Y9}5{4{RRh@Sx-tH*@`iJCIwENt0yJ0(TrB)8Eltr&AtNXF-Wg$hZO}9fusHl?| zkwu9XI|>n8H!0mgaf^Hq%O>i|>L~wH@j0Osa}rV!+X-kws&>R4HJO8m((R^GH1S=e zBSf6we%{34HfjShXWy;d2r6v7z(|O+IwI&It^Us7PnSqu+i4BWsn$l1lo_rK#l+RY z1Z}e@6DcRpsfxjp7Osq-Y5@o8O7{of8f{gHw|5dB^=PV?1Zg0n;&v!plTb>+O=B(% zKl1J9@zz6%SyEI(y+Lfh@wSeXkh>}%`LC9@{&G1l_%JSQ?wgdzDQc{}aA%`Zf}Psm zk>yf4C-Z}dqBjvmyE}fz@IA+iZQt&u4DYZO)Og#7+f(O`Izz7$LBZ>eRu^?!bZBikwZ;y53 zOjFQUGwnYwj*Hx6?pxI>wG%wZ68jf^)_*WR_uzQ59V$DaEhc=sc%nVrkN1_B)cs$4 zaeq!7#rKQhx?k95_p#5~w~#L2{Fh%+;)KOK^^`C^?+ku^&P#qK?mv9I^{)rd&#!-4 zP8)TiLW(<43a3kDbjtKlkEk0(hLd(YY99r0$E()nYMM4|BH1%9t39LMp|*^E%^CJc zW4W}yC?@EPR)}14;+37(BGQ93^~7NQ>#C2J*d(8jy;=^i+cCRw<}<(vC9~WtptPp% zQ=rcAJ7yeFcr!cgQ1SxS$gc)(;#MKLr+nM?Lu4wrynm+4<*5N5zWNM<{`}T|xxDqa z%UhMI8qVNf|F#C5FVY{xz^7aP;m>tN;r`$oikOAVC?zV?y%S^+MS>~C<+?WOHn0MN zBBm5O>4a8Hy|1j}W`aVDJX!h7|4pBReTvGd&05yOQ0-@l7dey-GCHnLLAKQKxT>?z zaDp`HL^wPoKuG)J4>!Hyl70pEC?}<9CrP5p;W;)XS~@QEPCQ4N?uHg6vNB&zN@^~Z z4>dLU!VbyYs=WkHq)WGqZpb}MHPMa{nq6)|yVDIi5m#E56?S!yKhf0K^Tn`+p>1_d z+cT(bhJ_OO6cS6Q{o=X-3pui!L<*czH%>j!)YRqSMpeC|q@B`vtwADD52Jk8`+Nf z_=cyOUP5AGQJ*Dux*8XUYqLH$Dx)q1#xNTAuhf^T&$Vqkh@7CK7T*-DHFe_ku}(a| zww0AbF>s%HmlTe6m>rx_BMK}jw`L_2&LTjBnW;m`H#SLT_CA0gz8X1fB0N;s+S&lDPPjE0U8vjCf$-Zi%<&)ohWih zOGqs9!-yZNf8iPAz06Az>~8mS4^v)2j+KtwDV{jPMGindT&*=VT&<5~xLVid=hr^I z4p|xPMH#L7_oBI_hOo5^*X9f6u(jF~G1*onofml}@rLnhbpa0b-MPgz{90iz@g{V} zP=MI(C%RTn(;y%MFDVH5UzZ;({1wfH5}XySS|$7>zgD9p_5KvgK>kcnOEshYS%E3v z&jSf>7k8yRHMTa}N!#WH##eiNxBd2qrwrU|F%mfwn6PR1;aOg_8yy>Qy!U9DSCw_Py13kQTDz^%IejoxI>VkP5eKnE{z!{$v1ae0bjE>#`h@;335v|Y z;osd?Kb%XTRErQg^ME4eyq4R(!LFv*Bzgz}D_xW0OZ5DP1Hl*mWCH-obbNAzz7Tk-$sdugttzRN2dx^E)|yDa_ghk*R7%{* z*|-fkow1C!MIT4z9VzuAt^*lfDRm*&gUZj66I5Lqf)gr@<-ikDbS6j=`vC&KQPoA_IDxeIK}^=`=huF#@+2^P_V z;yaqcgP;&U8SEB^@ewtA!er*r_5)&XYyuSsl7FGNvJLEqf*-wZQ-X9iYRABU?RCcL zelNSvJMPP+G}C{$*|s{~{?|s+uO?I_wf$M!ndt_;>Ekw^5)qniP(~v{^QWxr+3Jd( zaI{`@i0C8Nq*}Efdv=lqspWe~CrmnBewMhIA4MHMz%NU?oC0o3q9`3l>*#F{htFehI`6aWi>s=S&iKiC;cr{1c?|-z7p+7tL z=_x}Y29<&Xa#a07>!<$a0|?!)Yf+FpHXJ8O#kY2hC;}_(xa^H6rfhlO7V|VAfMEH7 z?*%X}Vqehqj1u1=KQcTjlLjepUF60^6B7dnFN=SrFsf%XXfWakO1Ras1q0C#T@C-t zV6xb8=o_XKWp{lLB@h_fpboP|*gLV!koZLjTaPr2kBQH1Q3HM)|9lI>VmEB9r#M^c zO8qq45fS=ZB&$B&`kTL&@WFHr^n~!i^2yt$;lyeqT~3s{|L{)`BO`%wgD~I+3&_+i zt;{Vn!q6k%n-3)*!{fmRXMa7km80Fg{>(wbW&i8J>s3ILpZ)A>iMQmFw6<`o#85jH zbCD4uwqv3@t`nMoJOD{q(s4tI6`Mf>0DIyjbvktVR})^T;M13R)l$Ab^gKRFtJ{q>+B45O#!g&Mxy4P4(3yC6}%En&Ydp+GAGHWY*`@%$k4z*tV4 zo4{6c)9^wyF|Ww`&NVZQ5rvhr4~^P3GA>UxH3H*5(Y{gpcP+>0MrL57iH}v5S+Qes37<4CuG!(t{8hv2^nT%O=bDx0n?erf-7kFp z#7U_}5MHhL${IBfQ{N@%WjI7AIrtOH2ogIr2zz;;xZuW-LgDKV)-hCF$^0^zR5(sZ zRdTL_(n5^_@a|GU+=^&93K{t>@VxDIP1hkD>S=Vi_FPlLFYF!fGe^>-lUbJI6VLWx z54ceh8j+j1-21@6Ol4r1Ygb_#q3#P2J206U>o>fK&>V zAvQf`{_3E7rm4Y~RfB*gs!7+$Ac28Ohmpifu=tIx&wq6#nqYUVPSE8Zy*j8oRd4hJ zJlc*rT`#Z+lVq%7Vm*-&!ZtPR5VwO6TGxzi)rqu|CQ;VOK;s3EhL&d#c_1PXyID7O zT%s;qJZHtDU+F)LTM5`JAMo1X-8vYJ8+o`1JaTZXc@w*Y<$4bbNZJ%%K!{&HjHX%J zo9Q?n;fVs0R<43=Z`jr>j-zAFxPjS~c{eZ2dGygrvA6<*1J;mY0Sq3%`gU}XGiw1$ zFw3N1251L$!YLduth5O(AT0j8?!7!m{czE%1ka{sR}2^o@CUbz$8>peKCJv}1x0}{ z3KpN0V=IrL;G*lfQ_7|C3%xfP8jXnNq~75_A7VI>=}m7H+jsbjO>9f(b~gmkSE|%I zgjs|&jOK+dTd1d0e%*Snbs*zc1{Y?kbH=wQ{AgI$F{45$(BIJkrs6DRZxH37#Cm*q zuq_}B1Yuz@Frh3@-VY5t5(of{jSQ7SNTR(H<6bedSNW9v7~?VSi*3{TJn3~^3pkKJoK8%Ipb3QdtYP+wK#d}W(YKxe+hcJ z>J#M)nPpMe<`30G7Yn6zO%?LcOW+0-IU))-7yklwlT%1aLDUw{(H@0;wGK_vy2+W% zEacO0{xwq!RBfW3;=(Bg2g3bjSupeAj+9wanF#QLwtC5Ib-&3*(FbjHpQ%D|0ICp! z1cg-TkzZJ}#>_zpL+yr;;etdXz zJqLJEppoCxj4JWEO;zFIlHf3fV$nmYOZsJ*rlI18n>)RT#wcf{#2!nzO0JmCR+UsY zC%XE|R87>dxk)|WMZJ-;-%w)$&$KucY~j#YBzH3sshv1 z3-SZ|H;X%$lk>I=xt`25L~`U%Y%Ovm!%CKkS^%q3A&hJ3?X|^) z>mmSKeJdb<;-2b>YnS6>=*vSE2@z-AuEE&l?JDA`v}^E#?WEQ#SxjoiBtjz#Zjn_( zA#lkXne=+j54hQ!)j}HPo$U-T0!WikxM4c&q!%A4#nG~ZM!qcW6VSdde|F!T*-x^| z_x6Dqx${NH6N%*G)~q_9F-9Ke2}3WH*uU*$FhV_80%-t6Luep4CRnhJ-Oao-jx!tc z?dsr%tnl2HBH%8Di39>9k}l`D1Ok3o+sm4!nw2O1q^JOqf%goYPxXnJ&edn@G=Nxeu_2R!On%40n&)g?Aa-t9VnS;=7SVk zRuWl}-Gz?nr-ARp0YsSsG5qa;@10_=DDZl?4)ik6Hg$UlX!Q?w_W*zPO007Pf;SBl zjNB`}YZQWq*n7C&pKZ5KdK>j5M&B|9#4G#VDxv;55dYQ*trtCek>j{X6?paL-ox#K z-kxm0$G>?n-k54oo-s&14%4jT+mO?2kE4mx$cSuMM2YWaVTN<*4|m4|NFI8eAEY>^ zS>_1uIf38V?cf4;(#+;gz;!Lt0wzN8Z;UVbmX3Tpo3#G&Brg48uM-G4zX72q;Vd%E z1n?IK1hQQOLLXYtG2xX1E<(r@@4p1HCN_OOgnl|mVFE&5=9ryu6f_-cXUFLqzuICz z9}niI+1L$dD?#$}q4iE^xnU=DND1*l>tWf!Qgma(hbfqKQ#Y~X&OLd;r0Zux>!+Ql zMzsFPCh9Dhee*t$_h8j`)C)-EUV)<9VF(MKlw|ifMXDQ^DyP)HRZe+wE^a$6B zAY*5M`*!GLsmWTleLRS(gV9Ip7_`RoFU33XcMo;Ljul5HDSkxhL&*9`OnA$K70>8{ zD93CO38O&PFCS`Z@|Duz)4dJI8T5$@BsST9;M9c6qOM7AlQ4iy4u3{9T79g!S;}un zSNZFg2Jb?*iLh8qg4Y@BfDlAKw28+heq!3T6?$$QN?%_geW`e?soCd2^i+dBq3|q* zUjTlNc|@v^BnQE6v9cIXgY@sN&IV8qG&Oa32xIFmT7I0RNoJUl>oQMv*9an_E~HQ< zWD<64%Tr%od#>K_34sC&I+2ypK?^!QF&*-lqQHb7-w933yfm@M2bYl|PGCkr?c{Po zreIrT21x_1(Iu%J>UwH*6Jq*j4HR7ejDbxL_FAw@_xi^>56K+}Ar)@oX@jCHU_7_x zvF?R%^xELHePC3PQTRw>14Yb$6f4%PyJ2-_%?`QHGmzLxHZNiZjlb?F2l_1);{xD; z1g!n%_#o_WDG))z1~vj3a62_6yF`H%;#0*|5YT{oh+G2{cGZBOvaxKJA3XV_aky8(tbwh^P>T zk-woBj#>|tw(cEm>d`N|b=t8Y`3LFnD^B}!mgBw>m1#Yox}%@S(=T#Rnw}jfF&h#^h9{{mG6e^pz@|K+T&y1Ra5wl?aa>DjMc+AwCKG z+~1E7*h28vFWn8Glyq!trN|4>PH;k>98}W_N>+9a`1}Evx#ZaymcL;Ivz|L^ zTQjgckh3UY%{mbJt zce> zVP2i9IT8EWgd@jn>aL5L1w5R0KL2CPgAFbuN?S-q31=@SvRpJbR1jSK6Xw^0*)rUB zD13#PNBakfmLHQxu?f>~w{6F4I@`*`nPkt|AY)`jcn0SK8!+w$-L6$;MX8gYOFfdR z!Q4r5@`t44$mt(GgodKBOSOTn?n{XSj&8NqwZd2&wZ|>)yFAs3D64*}WRHolO7ah> znGyk}bd%VS{T)deDntGdLU8&x8mj~am0iQFdt)dICqq#keQgu8 z8MzTtv~-QGT$YhjA?8H!dvprk7l_+Q3ZSZDS`;D6oc)SOMG6f+w4@vEvNClsKG~cB=Tz*h1_826P(bHGVvQMEanz@>;_it#wUY zE`uZ5x~|kwrt@?s;MboNhC@Jc>^q-tpguWAZ7>2O zIzf>&@X68su`sq|ZA85um1HF6QA#+YIjBhhYLCj&!y4P(m+{eys@?H@*aG&6S&e-z+cz*V423Oq1a3ix(bts zC0KzN$L5SB8gzhx8dQ_6kIk6uH0VR8IO~5n!$`< zxa1?+ZWy?k?fv6Dc%RKeFm;?pEnbG|ox$V$P!mT7rUgy`_2QM)DRU@T0fbS#ddn2g z>iN^sh=)qJWb#;1vRsEPKvk5I*f|U!Cw2kM=mo1b!&Z9yQ+|V_id4i*^x3pp$*PFG z0DUe5EMO!Pr-?G)LJ0dvsBq-479dA+@|4(e!^C%Nhs`>IEkh5>-U zFmSPxapr>@x{?+~AUceM_nd^W7k5Jw{>LdZ>ALEc852JHL9vwcxh(9UyW#$sCbKbI z5EYZTFHi@9cj*jxSHCL3MXE!;{V0w2|0Vqry(~E~zb?f&Ni&Hu)AduwPhE?Ma1>=p zkaSQai95tHrk@)jAu%@#8oU$z4jKRA^95Rg;u%`~*E9un`osP!{!Lj+YZRnJ*e9Se!waxJD-pJ24ThPLOtn+p9XnYJ^YH;2J-AZL!w}e==eIa->?pK4+T1 zu0uq@3p2xk%)u!s*Q1Jtpz7tN#8?o*J!Jx!>!t~OeO069a{@&PZqA}Q(+s}&^k>lY zItly>*9bed%wT{g8k(_T+8LfqMAXWv%%C1*J;vvmL5As_!T+K(A-MLqGlzU(g{5gH zNbbVi%C)+!31;vq>-YqBV0b(Di5HTs(FNz`VsI@W5{}i-@Potz&|yb+I@k4<|Fgx_ zVYVV(o(;JX1{%6lS{(|JOcIU4F8l}bj?z=MJcFuE<65E@MXU3B)t~Uq<)B<|{mb#8 z`|~rct(ThC*598ps%N`=)7S%r;9#)1y~t2Q4VAbk0q)EsWsOWv%dK3#%$Si|Jh(T? z$FaI{Ld>XvnbttFOQpVA8nBsq%qPKElH(+}OGK6~FoiaL8bXLcD0}#%W4ep{Rnsni zO?IaXfhxoVf(1 zF^eOT*nE)}?8dH-&{|hS&88kVu_|C7kKh7kW@8u7suKe4k+>hi07znqgNGPxX>7)) zSZo2N-h}mL1?L^NSDs+p;7NpTg6<%&7N11sJnn?Wx!GX@B_QG5gd2M5abs=1Gx(pD zarL#Mq}=DiaL3=#QEb9&z(yiygt?}}%h%=>KDocP@Yxsl*KhtQ!IAm-o9pZM=Qq}t zv~#qyGC#L;e~pay>&n8DIvFH5NaS-@B)v&k5gSk8Uh2S6j(1B7Mz?Yp&GHp8fFvX+ z$hg&qs7Xl9Bc#y8gA{6ZSUxVtN#ur!nZkX5_I~oV2oNBcG`(DUl@JCp0@H##mz$>d zZ!h#vce@w{R2~Ma=8Sf+kr4X9y^PF+oJ}R6?+s19;rMc<>*M?kOGFub|KFq~A|;Ry zAN5K|5{xciA)qSw;3^wZjChT6>Zz2#d8c)4V`bz1;_@f==U476>)`+T{GFARrTZV> zTfa|T;0+xUE>|J1nY;$oN~tWvr?>3l4!C00g<$#JjzajIuuw)KiC!$OQGu__6nzI>QhB5 z%<Si?N1F5WwABfVjLCc9Jg;g!MIV1 zCk-9sy;2kHVa^*evlBuM{8!*~x)~$M`7-sm32reyZYG!!7Jy~oeY4&Ih>4NYLC+q4 zyh9KXWv8kxM+1TsK$V}g-n{dU+m$C6wQvxVyq#B27)7%0jRgqF}kVc`EJ+la+{pE0)4b$ zIS-q6u6y2*{ASZg4leY<2rY4@U>3r;W0;WyGeTsL$;b!-(!>BG!(@12G>qibb0L

kK;P&Q%1fPk|E=vEwo0Hht*f?~0ra2ogm98Q`G=e%?A+S8wl6m-L} zotV%*R9crxI@}*zCw3BH+7Wq1wXHT6qa!)>TyR+Gxv)>33vzQXq*BZ1vP?K(l!?q) z2B+8QSRNOH1H^aYToB2fG#B=H=i*yWe=blMw^I|&aRL*=pqd7lp%{}6r4*cyI4eTm zwYeA_$*Jc;nNe~^Strj$C+m_D5HlCxKB6-Y5|(sRVHijtAO#RR*{J2lHdVer(=B;! zANku)e=f|xGqZr&7O;asDqL_(?p6|7eKX~v^SA`#+FXo|l&$z-AJ?G&uI*l3->#8EisKS9#1?y&@-QKdYI?- zvR{9KaRbMRk+?Aph_)OHzQYj>R)Fd=N@!?11xVjaKWVzJG9?z8p(^bPY@>~$A(-DCzOnZ48bJW zR|wtvI9q8K6ep+c-x_pD;dyKpr14rQ$k%*C5o=N#7^65`r z!xon1q&0kQpYCeY$WOWVE&NojHUUNi{OY7c$Aos^hkisf4>pm_MKblci7hccZi%Ck zY^eU^3%?PWOl%qWjiJ?XV$`a%<9O2E*LGf`MQxtjr~BR$j2oxFZ%S4Z7^Lid`I-o! zD@)3;VsdsJNuiy3+=_eO^iJOU@eysz!tgP=vO<0E|6029P}%y_x{*OPCXZL?~89@ zp5iA`Wz(WYlPqJ=(GDF+@xn(9=}!cS5JtzzxUp~f-HE5cx&6d9pZ;7}9YkD-To@g6 z4LLNxwjvW3-2+pFrv#wtiGWE?)o2(==AtSH_`?145Vg^l2JaFcp>j%B3K~FUGKdXs7@r7js9dNM8%H{{lJDNE*JD8e=Cni5G! zd}63Hr5O}>%sK&a1M~O4sc!pjMFxsI~9X3-Z3Y<8hhO1;BP@gb=q^Y@=iyS!B zVg##!tWp;>O~{UkhAs0T=c!-txh{HD@Lle8$snpQ0b38e=* z9)Wx!>$1c7e83&U_8gOf#;)s#@pW}D_H5G&UR0uLs$Gf$fhxw^NOK1{#KU7@ z!WN0JWez^&fT`IO%-HOG0dsUcC$fB5&%p*2l^ti+GG`o*&Z>EQYbV@idqWxM8wBWz z%5Fl7=J7WM|GT1?2*pW=oV9PuSLZY$}_7E5rwVS8$R$Xx>_W3InIn3P%n-H<&=c3={h@>(4|(AN>Dw$RHbo=Ep!0NlJ8fF$h=XMmcF#0w^xy5RLdcg zDi$J)TWR5Hp1-8y?DuoNmrTI()N3wUnNFhYMK)O>t2Lp@#b_;xA5R)=wMw)Wlh}IQ z!G&h6jY^ZfGqD@(vAKRVA29;mTQW}9U@(Po*EP*fgx)lHhJF%($vTuD?V6@Aogte* z=qm=ZOdYFdpP{1x#>vy`8!}bgh29nrt z80#q|Iy)XZfEgKVl3jIL_Sx0yAzPV-XEO(F?6z|Va7a+O0oy=C$);Gi1jR9GpePY{ zg^XyB+n4xIlmrl{U_uj{9>+GODOxd|fiNMZ=+2}CK2)G87y1*(U==2V45EY0{CH58 z7(DqjJ-75#*G{mP@EtvVyb!?eU;{mX%Owk)2WE3W7OA5$qpJ8R!=Jqj+vmaS5tNK7ff`%WZ0$4^6Y1 zzBt9Sv(cE|vUrw3IeS@(<`2aAJ?H*7iq$?TeLM@M6p*;Q@6?kAZj5O+t$1Aji)Q{@kwzz-2EJn>e-0U?v-6(S+lT5`5xJP1!Xs4TCgOK7kOkav9o9;~42Rc>o z=nr)EhtbcA7#JjU?Wam$T72&RIImw;l(?m6iV{jHiXK$U5|D5&$zJ07N?tkEJpWg< zBsCPYhP-6N_j}nP)Lr~)NjBf7d?h5$+l%YvFObPUB0(3o`{w%EVoT@UAuiR&=|^mw zl9f2?!|eVW6i6V?-O%Z@;;FyAkR!@(tJGad%%oDPyiV#8(5tuCLw+D>y}V`SZSlze z0FV6nQY@)MN&^rhQ4uP8$nrwf0i`o2Ha3#YFyv5bkmdhc;gRQ)BHs9Gg*Tp$-6T(Z z@NbH1<4lS!K|2WAOTEpW)V<7K@e_Og{vrxcd%f+x7Iq125q3G{&l>ezyje&_<*&BiqU> zCaP?rjvG!XexBhZ@ zw5&mSWfOamfP0P{RC5z!3Was}A8IjBsMa+J-(XvS50en);3N?ZYIIOXn;yyeALb^$ z{AXyCRZCn>XWL9b3+7JSHbuO*JW4pfsKh2Jhg7#HG6Tb{|B!>g{lR5qA@gEa$~;9? zEXB}+YMqF+Y~i3#nKd;W5`Tl#p~PxeiKf<`tDAt@7Jq(oTN}@&XPJ&5?_LJ8#SJld zyDofMvYyE)BxM+t1!X*|2b!9?Ts56AQ3)#A3FTc$Cn9L4l$tRnBDA_lpakEKJY?#z zA!^Un8@>oLHS#-z=Mvu_@Q0boJ|@0P7!Bq&l;;4IcHxtq)l9we3F@dQx$L!o+>f8Y zR_)HXoo+Xv3))uA%Or2u7$N?wYt6uI2ELSm`d%J)EHg^?)84)W#ozecc?rR%GJYd! zp&`P6M1lw;)$~a9Bm6=ukxC{}q4FX2;WlDOsG%y6Q>n;;bOEKyj2(5}hF#JH%@;Q6Q2>waVsB-abJ- z=9l1y)VQNc-jOPhQw%DOLLruQv@dhvm;?cjd8llT0oUI_(>hNC?TG_wj_PQkC{ab) z(O{~|6`?1qVI@=~jsEGc{=50Lx%E5u*KW?QtS#JMT==KI`tNlv+)Qh(m=~pWr6v(s zsYA+H(wls>&`p*aIz!YvQhyO5HN?mEm`0ZPL5j?h#41IeGD;60$s#BgraW2s4z)(_ z^d5=kFX@<-c^9WFY|&TIFqIB6L)(Yck&}JI+r`Z)-z%?ge637O!>b9g?xZu9FK_Vc z!Xn81h6Sn5d?@kMawgUAvvL^w#iiDUrYPk5VofO^%X*RXptZhcnVyRHR`q!*3TLz- zeJWlm+lrMYQmCxl{vj(x%R^NH!vvL8cvm*5ZeP7ijtpLM#Gaq%f+Voi98(S=r7qiZ z)N?!Rx3%Zl&nrqXXnUMIISIp9KjwtlZQoTr>KnI@;5GG)_l!GCttff*+qwvSyKp@l zN1f52G?{0zx699@`jh%f(iZ~J;(7Z+j*0aBcK9LFJZNpm zvKac&YI4{U%PXyG#T-pq7`axhPTw5rJ%{Ykei@2?@jp5K8`f{c@qe?nG1;yL2aUeP zFWBi%9K`M;WUVs{LX@FAQlYv&u>(>F2qHjbCLM`Vy6_XJflUl93&{yVsnhXb>UYXW z=kJ5lf8@iQ`6>*`AaUL4C#fImKlpV)mdI5YR}p=Y81(5*|JVygoqm*3$S8%$oWJ7S zPX9OShtO}Krq(| z>H<+2DaQca=tqNZEy;hiZgV>w=vr_`;ns2PzMkOrPe({n~L0g2J596{?( zyAUi%%10$4hTIVo1F%R5A#?h)O+@a7kUOR)6HGfdjbwt=bBxUsa0;rEBg&yqws+1# zE$GHE1b^~$kV_Cg6#qrKtU#Nw)rEH;QX!`tZu}+FmQTELx-$VLef3V*76L8(Bt6`;5M=nLFiJTv%Cn19e61jl8 zu*hMJ`_!HT*Zu3QS748zkbC@i>(#*@&Le3rHD(a5l-lI*;SY6TCBE_Tmw)}rbI%QK z$N@y1U8%b*m0&1BtWdMwo>IJ)+EIHHvv22(UKzZyfs9hRz)deW@Hgek{|MkKqRXWa*;3p46sr?OE5Ip|WVlVRv60{1FKQo}qz0BkCp8 z$qG?o4*Mk6!i*Q1!ivIW_i<;2Rcfl(FX)NF404d*V;Z6IxM~D2>p+1kf|KQS&J`{o zgn$=HT)-udha~sJz?&qg5Yc~0x+1fh^cN>3Pyl~lZHs~spawup!z%?HK#kHwGQe?h z?4LpgNcY+(W$#99D!W)E4?wjoEP%O#?O%e-=ha=hRT4nc-!w7+C}9@Nn$C<*UZUjl zpTYo`ZfHgs0B>3p@-Ap4)d{)i@-80*+~3sGChxmLq`{B7o}Cae^Wazq)HaPNibaqU z&NWfh}9+1W|kwrKZKev$|RQD#lV`T0a7MUJQXi4z^S-I+21U4tO_3PPi>8!T5s zM~*vd+O@B!0}>;fG9Q&H`QS1V?0r!d#K9}-dS59@z}+wMC8~dwH}dr82^X5f@D$kv zul9BlqZm6T_s4(n7wOlB;NP>%>OM96*7dlq9&o)J93KDWUlvQEgcs_$4JNc-S5p7} zfA-$4NscQ&^BWD{Ku{QRW=M0i)U0wy4gpAAU71;#_0k-2*z5*LaPTIeIV8oUTlv~u zM0ZuIUH~@73TZFokR7$Ljxgj1MR+6DpTKvHy>rA~_*?i!8ymY3_DArAfB$n%W@T1o zbyopRa!5g%!2ng2Cr_Sp^1M9%=l?u-)sYHni;x3?PLgfd!IPyO+l?Ig%8MxT5^%Z; zoF*HlHi}?eh}9-~jx381EYV47IV4PEwOHt^^G0bZR}%S({$YI(46tn*S$C8`eOAsh z(>B;M5~ZR?0?->H7g$n>HciBfO}j)AWh;1_ zJ=h;sU=YeQ6WW@ekd+CF!@@<*D7sjp*+nE6Qbuz%JVWYVgfk$>K`w0X*o_V54!^Tb zzGlOLvZ~L?Wx;zpW>3<9?8>Ub)-n`sNC3P6DT{Mh8*)j^f?pJOm?;}(RtHLDg=fW2 zj5z-X<4|=AZKouAm)j&Q05KkUq7zkzB8%Y#wR^eWAN0%?Mr|m4M6!Yw3DY(hG#fc| z>(GECn=}o=1{^gyPvvu0TwUH(>OK7v;eDN%iwSHKrEki0P|qQuowSA)EMxp@NGnVb z{)^Q{TVGIB)GJk+uA{@6% zawMq{Xd(@i=ovb0#wd~Cu)1{#p-_EbbQ7NmOb{nGm*B%RA3eQRUC{+I172`G7q=?FyB@$#~yvm zvqddmcnXTG^kUDDbxh9GMm>R?3hfYf(8O~ke?Mk*UFd&fabBaPd@ zaB)WxpDR>>$tCR^PBHK%Ujr}?WQhkVvXz| zN%4n;7mD6W8~JtCVw8#+`9U);qP&HDOs$>WHa}P@$R-P)Z*yMAcBLf`i59>!lGLb{ zkRmM|gHoo)J`ANnAT>E!oPa_Xihj5t+j6^w1^d(G5$SwldDI}Ad0-LbSS3&}z5l}o z*)Xy3+JG9hCL%oq*+iQk7#T7x)Km}>w?=3pg7jaqGOO+#D!odOZP~tg z#30+WZ5}nqmURv%*hhPJRtd79gik&s>~E4e>6ws74(jblJcQ(gb`WR6W#H8JMxD8r z&EH+NU!JJS-+kyQZP_4ODItJZ(eGCx!3hV@72-m!-5~oEtuRE$w4PfBlm>M>KM3Hu z1vYQmHxU=Qu)RfErwSpN*wFJJ*L#Eh_~;#MmJ7ilj-ps1}k;R8!{! z@HHxJtsR%-RU28U^;Q#4AC+Z&86NOmh`qIY-M%3-*Sf>u7}@1+uhx%7{V*AbgcPg) z%b)xoqzU{A^Iy_ej}MZ!E{?z@Yq$gM^){|0>FCXiZ_BslkE85YhrwX4+uN`$_5boC zfW4mi^OnB9Mcha6sizsS!UPr;@phIo3*UXKe?aV}8)#bauj;xW^FM~Qdohay3ECe= zI{ql(N5TAQpGN&+Rx?%qSPY%jy*I`L>js38lQ%C4)B3H8y}t3W9q&b1y??6$n$}-X zVqSqjKaEu{J)0r1>uicF*8s-%L2wM6Ua(uzB7{+HI)VJ(tP>!HOD6~)d{G-*99sGP zbvw*9z~K?YM30n5eCF%P2(TIFz7dRkb0#iu$S+;LwS76S%!0-MjFJZ(^>}vWmZuU# zx)^QC69(haet#fhXx4jxxXG8nA#D6L^<7?a^<&1u&eo542HmR%XFli(Ps#WzlPl?g zOWW9ZPaoZkN7DjtOMZrAR)9J8Xh1PFRe2WR(mX1`Rx|hu{Vt249ADOm));~4UUa6={O1( zA6g>I7Asd}{CXwFgp`dn5_uA=mQ!ULv}XR44khO-+3RB)%6IuwtSb!Jx=#i=UCO(! zl0!0?Qc72TQqt>L&(4nA`0(D@4BQiY^STI8W|2I&d};Dx2GojhpxWQF z{s=MQ#e9yS1+#^zik~of_eyV1xD|NP~SJb0TG-(`tk+Hqb%Tkt4ovo7wAnD5GIB ziqgy*!*QrK9B<_;^aAdxxKY%Y@5UFAfnUF*h%S=*M_ zSQ-es$Y)SkFC3~zp)(NtBy8mDu;o?%DLqyh`Tb@7LY}nTXXxi+n#0CqBO3-sgZ>w6 zI!?xo>ueJO=B1L@!yL^4k@Iy257jkJ`e?fQYqeH$y<>N5`JmJB^YNPlyk(4-_d3Ek z3A1L`MuVXZ+C}s?#$7D7BQN3&vGaIIUPKuq4sAb$$smrnocV!W@E?N6L2|7SbG^+1^rYDXxVKw8M&p!JsZwkw_ z#pi2Q`9odOZ`6E;*6k~IcC5`?SMwYe-)+St+{IV~!P-Gd(WhxqkwwM59iV=1!&EId z?Fu%nd3Tut>I=#(w7J`&-t>*YD&F+wRy= z!$F({6CY^Q30}nF^~0JGxVX%a`6w5kIA%NA@9vdiqRYKryx!l7*6$wD}?I zg=)S8z%=&Q!BOz}YLyQgxPGB-rL{;ZsB;tJ?Vkq-LBORMs zp_MCP)X%cJIsvp9pV1OyG48n z6&*$jnmpJiiK~*RAF(M~e9W!7*%P2Ms^US&QKN&4DW(Y$w&EDkj%4$MP$pIH;CH1` zIrIh9MIGH&MR^{~#}39=4Td$ngH9?EkR)e7S@qn=ZIE0p)qEnB3#y8Gu7Hi{+NFrm zLEVHTnToz75IHpj(r@^Q6QqQ0Le)d%3#*EL0w7ft83m#5gb)FRJx8Y}_;jRrctx1y zNal(gd(2zZQe9A0)HCK-q#ru6DG$A{00Ji*Jj_He(m+QUmK$4H&TtLI!JA%GRpd{z zlh$kl;Jia3nE3FdLiWXEgQz0nO!$v+{AD-GV368Y7f^MpA7{79p+5B-E{y^mlEo8= zVaAvZIfLdv($#ZtDe_{D+;XF;%d2j4=E|qv%`7J~;oSR5kG&2&u_Op;an$4u5vgqw zF(GUs)(UqDiyQ5}^F#T4RjXbAkKHHKGa?(yOk#+fHgNAjQ!6H6-LqX01hdg$g*uDL z3kE1{g@MgpS}tBOv-khg=MVP(GynZB`~OuP=zn-)|A`y>Pa^mmw%R_)N;N2M3`2Z( zFt;JJ=1QJL6vk~kVy$ATvYi;sJUoC%1rtOL9e#3z;5YkTM~o|(WO*Hw($-VsVNKr2 z=O)?TE=<;L3R<=;sN)pb{1ELawwM-N`Mp7K2w?xwo$Z?+UY1O&pJc21JL6&8|DqUB z6PE|!WfL(I6|Dv;T7Fw}zH&iWsGn^C(p=C5Qhmg#TD?qv2_^|*9~=-rQ#LA06vNRt zW(y?%;vsPz3AY7djA9M@`oXvt+z*ZwRaa2{`}&{Je)k|o^QPA84#DY1=s~uz2*QI> z;&8{$7`ZO+NO5tI5P_iWDt4cyaDFJ#PY4{uUB$lVW!fT(28o<77091%)W2{ZO{8Ri zJThqXK2?xd9BNkiL#5pj1(Z5a4Jr`)aZGIP-C)>_q?AK>pN>#BW~Ai|WeFPrbfYL7 zMEohuHB7!#gC=he{c&#fLksILuj$-jcQn?4V5J=w4Da#;bcgbU>!w})l~-2Er?T`b z>k>^!->X}8Lt?mlwC!frR21;Vn4nr0fv>3)V%CCgTUFKVTvk;L4u&)o-D`#@<9*s{ z`~CY`04%S?eh^!XL`z=dJhCN2XL=*iRa5$l$ClEjmWXyh?8yk^fuS89$vCAUxmDh@ z@@AFVR(d8I^rG*4KOxtJ|CQ@1eya7NVE@yA7tR+izL*aR(Tt-~aaSf0`lirggJd)w zAlsMUl2iheBG^GkpE-jy5A(?fTb@QV7rkj=MI}u%ZOc{sd#L};b;$_1yE15VP zUPS#d-6{QU9@k2axt+LuE1Y2y5sd(1j$#i?ldbUdt2r!_U278}aK0$1Mw6O=^t2E)Hq>vGKDVls{-;D<23?f>XgZk|bsOt}tX}M6Er2Kkif)pT ztnaJ@$dq)q1czrHapS`ItWCHLBPQaF5OqD&#q=Pfw+k-^!xIm!d%SNlHV+6It2fv* z*oE^4fe0O{2qWb&2hs#0j(E3+*to7w7uCV+p4r#Zw1-4MrM9&<^LMfoC~veOw14KS}ig?iqF&HAUO` zlgUfvNQ2p@RD};Y@&9u2R(5z^KKA#8-ue^+fH`pxtulus&vkNbY$5iZ5&&H80cQh% z!40z&Vu~?aA?uFb3dx&ob{=cirr8UuS-16ONVoe=z8jjp#g}eey>or@_6} zXB;>TeXjvp9oZb4TR1)iK6$`6Kcr2LOg^f!7$aa_LEaX^uLOuWSmSQ$5Iw}{6MP|q z{J+V-VaNm@jJKE^$prrV!Q^SS$>bpCS+_G%=ueWhohz9YB7r|em;#XjG7`N!WR^Y7 zIRwx4#;ol64o@V+l(VGXs<53fug1ebr4MMGi@1LX*QtIGgvmjj{OEdKG*YH&S(h|s zsRJn>?5(F^yX=S0u}aDoe)^!#$b%BA%&Srk>iNY}fLZ&qm;B^&0H2>VMy>CXHF|qV@KC)HV=6Iyh$=)8{Y71lM7e3 zZr!>-$h_WZD+7(xqZ*mIi zv^3uv%^xr+L=D0=_$x3IQuuAWy4n#r**4x%jokV7WhKX5GrAi{G~m4>CsM(o7JqkP z^3!WT4O?=gInHfn1b}*xu;@Dne5WM|x(7uFN(=rtqAAj_L7~=dr1_`W$CY1ejQkgD z-PLhffl7L3%n%g{;t-L_cAHt`<;nBE`yJceXwW^94K*4PFyww%((EA$m%@w!fMXVA z@)X-LFC+@>I}Rq9Eew*CX4Z@H2vFnX`D&R;vM}UclIMmRCts{tnac6PJ#OxeC$UXD zYRm0X=g5Zmg{HUZn+=oTplW+70wyi-PG*Wmuj170?Q#z~yS;s7(=@X>AR1D%R?6lL zJ==}xCEgJh8npP_7;^^nH_)|gAO#k2&fq;o_RC2LZ{;!`-{b}~hh_${$S*IpVymh&JU77V5oRU1a8_2L8DVU-%J-asUo%m%>+#bC3R&ZhE98c{AvwM~DnuWrrHtw!k+8O+e{33;~ye)thd^Z`hbXMp7@?` zM9X_wq^VL@JcaNhVM~FD8r(E|h9F)s851#V5Uep=%Djm3UN&(tG33Bs<2trI5qn}J zypSJ(3XNU}#xFP=nj#kNWnWiu7CD?~w6idt3X{AkxY3I4i)rW@r_C3%Px-@&3nBN*OSZtQTDp4U{ge5SmWdAD$rMBd6Ck+5BHm@Rz z7&cf`re}!xvRzy4N>JoACUha_{KJz!_=6wF|1H(HQ^lsGNPX}l8m>(W zcI?TUj1;vHRS9{*P-lPL#4?G)L4IzlXmiIwV1IQ|-?A-VN$OL1bw<~+xH_uYP$ssz z-ux(nQ;~=Be7<_>O{h6$#6br~GzfPjT_`tirb3Rgu-2j8dDyY51JeA((R*Yso-i1elYO z5pAm3@T0iy<;iPiZ*N3^B(#1#uY)<>$m!`xPES*5CKvU{7|0BfK16t5CC)fE_*#R0^qF5>YJij9>9LbHa+XDyomA%0!`m0 zI_fSQEx|R}J%W~r?MaIuXMhl>u%u2qLA*Ra=q*J#{(gvj&TYu&7ah?I21Tu)#xrw4 z`~)BM8b}`!Ztx&&q9jk~(e1ET2@%pR><#CO<{a1&On-7t)D47s{y>BKuWTU!8CZA3 z`VHz9Hj2RkO#hN^>2eGCf~|R;vv|T}P&KiwE~+&D)Y71YgC9(`mU*#-#xLZk;dI`s zLr@wYqL_?&&`S0t9u}%j!p;?eSipD>;xJWxEuZcx&EGe2K-8*L`lVbzW) zDll^n!<2{WsLGxEqjl6O@=EhhD;pA}ezpCm9krsyQp2`maiWF)FR6VvDMNGhNm9ev z+;x!r2Uk6%pIS}!gNrk%o|ORKL-kT+s?SFc+d!)eEme0D&2a|r(<*99i5O<3aL5Ct zQr6_$L?!@;m&Ly#+-1}DH0Y7 zNHhLEv@M|>e6a}pg^2F9+es4#37^=v98;zjEq#1kn)r=n32{H*CztawAxF{Jj>&={ zeWXJiFAUJTUj6v^8fWH$9p}2NO7Fn#9f?xPm%&h<8lRv1ynMWz`^Aq7rzre42*>%b zPSzcw=aLYcNi4}OoS+1@%i_?1karW~Ds{jsIG|`J7jueNGMhr@{_sgd=awpxLqDad znPb29#?9GnLifz{JDYft0D>5r2nL3`vz#g0LS9An;9XQ$@jK!^&nY z{nSc#NjIrR&DHhdQi=h|zPcxjPH3AFDa=^XA~vIF=6L_2UU1kQDFP!L9Ytu?^e_md zMlD3MU!wz5L*Npt$K}b)9reoOz@oTQm9Il6$)I!h4HCF_0 zXd6hE*`=zzb$ub+!ZQ?dp^)KeIbC0v*~sod#e_eu7@rW(<(9CqhhitKOUM|C`9llw zNU=6)R;Zjr;*&twyj(eb3b>VtSjiAPQqnxa(C!Y1Rq-lgypnNJ%{_$OBwdcr%vi2C z2=14ZgK+N_0{@<(=au_HhD4~{x^phGwIiJ+g?^D!J$Yv~uEO0#Mc%_`%LEMrAQaf`!2@zSZ-{Un5x&QO`-S;GoF z8V?vV(g6&Xb?al217Oz6P)09_?#zZy)qq>G;6ux3nGTd>Fc4O_3=YP=F|eAenfaVI zU4AHe4*XasuR^azDrOdn64$Aq8Ir8lK~xe^dDtAyBt_ML{Ct=$4fO70ruq>HlgE;! zqF-3So_>^BHt2S&irr6MF8_wHAmin-C7LyVl}!iB+VTYTz^>mRu)o_+clAxhmuKe_ zZOH@Par9+v(f3tk0GW=lRzM{IK90>s`xMw~xyG7>z1Gb*)6<#;!gVfE&Ab!WMDxhH zEn;)=@XTQ`(oK=tZR45P4#PICW^EEDLAVp!5#^ht<+#vOZ9J`#Buyc#HgWXM212JCF4$ji8{M_|5A7mkg`?)~H1Xm60)jm+U;q;4T*Ye0xuJgn?aJA0eB zK3Dt#AS}Oq83=o^s`go3iU`;%GZU!H+1L9j+y3}lz{B1+vGvtMX@o}NE$zv7g^8M@ zSY;p#?itEZ5cWCq5juhAR6_JW7?hhhg<(nVFMLwZCIPzR zBN2;TDgIb#h&`s86|pds{np|g(P-X=ZhN(*wBY!Np#H?C4 zj*)E5VKBhh4tgu`rGV{s4y-IJ`r(kU<<2Avkg)3~zD-l~DW7ashrlWy*XMNnVDhV# z@BXmZ7q1B-6q2@1nhRj1FBUn-z$39hT(t!$MUFrxcahY2HC6FtyQUKRddRL>1@x-y znkGAs2h%j3s%4^Tk;`Gp711szw!&+5=?~JVJ@jnY{6(-lkZR&MonkNq%z1LpNR?MX zyO!;jO0?_7%7b=wn5(*D7@?2y&a8rOq2<&kQ8RHEL@SvM}bW0Z1_N3e2u%Br%s6fQgxZZ zuYeXZkpqb3GNTEY_1sf4V3s)o53Rif>1WQ&#Y1)>A67ENHPR$|VKT0R?tua}#LzDX z!m=OnjbJ!Jrxip*2hY_>`Jf+hlR-a-Nyyd-y`U*`912jRJjtGu^t~=(wO}Tj;}NN9 z5*{la<>W3Ig0Z=E8w5i@Gk$*EurNq$oRH(O)1h+PZMQRs@v<`ZxwJMO;Bk15kr>Jm40BpcO!_nd=lNCq-+V zD47-@LvPHLro3`RDTPGAym6*qMu4kBYJlv823Y8eK3WgtQk%4POQo<_?%e1$ zmm!b>bY*>X`afeL>zV37UkTtPK!dq6TiDAu;>+fj}P%PrRD zL;ngF)_jnf=7ZGLt5?(al3B)-Sd$X#hlgL?t9^;hdiC9JAaA3Dy%AYB%Q}?G)ivq0 z(z{6MB>si-A06>@iS?dR&y$SO4eMhdzytCgH5zv=7oJ{@SM|LkhE)s{lNN5e>C7=P z*oP@z_8w`Ht{b~Zz!HqNBSc*h&r^E?jI3>?ySsl`zT+4`aQjx8{gh zw>gMc0A$$rhUgC3m{B=o^Q54du+Jgn!E^`01c^+MUz|DP7kB-p=!XNymOIrf0LWHk zPUKV0!{TH!Pu+PKYRj||Z2TUID#od=lLqA4IFQ5WFt`>$;D^vLpLuB&UI_t7=OK@_tE#;`l(uXSRYGZx_8u*ZsGZ9) zk`$8l4)hthA`PTDb+3A`4l->M6$ipt~C1aZqjXSqh>~6RSzoT%$l0nqN~@ z;4=mgQzeEja^I~4{v63xRI@1r$`rasqnRRqlVDRxqzn#UeoyIfDP_~z7G*B)S`VoS&ih?)nr=$CVDGHjV zR8pt~3Ip)q^cQOoyI_3*z+Sm?`>JIeC@vw7aFod1fma9C`~5z;tJW1T#C_}1Z?0dH z4}Ww0FVKF2iX}ix7qa7e2Cz)!_*!AWtHt=Y+oa#|f)PTFn@Aru2~al3n|DJs6+AB; ztz5ly+sa1$`79!D+PjMIqy+hLBZgCmO|%P;*RVbUs|)L$dZ$yrhC!FGo6IeQ-jr#h zXp$2Gf{>g}`B^2`30*%3sQ!A}ZnXr^KZWbGTuaSzoqnv5-**|L+j=mcIdo$O_?p04 zqTiT;yol62AHAby1UHzKqk%(5Nay;J)fbZBN%}PU(4t1)iJdUbr9-|w=*BI@Gv}t1 zLaevf>5gjq!_ochv|mPTICLx7uI$@c)J9ol38J9j)%hF6^|>3&0XBMKYh<@512+Fn zb-~$>p8{>qi|WrO0jFeJcJB8l-M zu$`RRw}8mh@+C>Tjl;Do`AfW8Y@GZC76%Rn7l?>?Xi1)y(f5aDF3UCUzK^;Z70W*c zH|(q`u$hqNN4W=24_{OR+a9|ybO37YHY#H@E5>|m4DzG?T+xVhb($)Zr2gam~%tbjyzPOW@0r&X4&qkL}VVidsYEss=G(A%YOX`-LoPN(+qvy7EE=p#DQZ8 zMN_2tP%pyX6Hc=mI3hrI(o5tvMCf1@64SDMQ;EaedWg1J9fGOu97f@zy*sO*FA>tn z=#{mw5n_Mhq2dNY#=3)7T_8@R7?YgVGyZCcddv1pCHnHv@658m%lYYHO`V<5xa8Qu z$W3Fklsp7s(EY$z#UWc5F*h$jn?eBx#p}vvXH9B)0*OdfqU}3&qZvCjH1c>C0>L*t zFRbC^Bw4KizP74FeL-bWcMlI#QK*FC_W~8k^@JOU`XQhRlODcdjW9$~#);7#0mo4n zR26mRDT(Lvqo00SoQqr{w-N0J+=6Qr#A*a|;A`V*i;hm{w>0)pysli+v%nq_CvH0A za3iZLVx@R-!Pg6!h3v3_Etfd&lEuF&bL)95)zWl;wEyM+uWj1;`N^x|u+2yrtwb*FU$dIMZBOnC->tmDAO%AXo$Y?p;-WOx;q4EMbtFPf&0ic0Zh3NFp*GQ;E_Yw~Cf?vS@ z=^xw^Pl}9q)U}z!j%SGLL0n8Awz8rLwjR8-g^WOw45t^3D-IT|`9tMn!tBOxKq+m&L zRKy&`@cPp~%{e~;ijXnL^JsPu`Dkkv-V~rT_jLsfV5A%tgflm-pQgHPV?J~MZ4Oe~ z5%upMSO}zxX@yEgOvqi*DG)rQu86{3o<;TO2RXTgs3VXZc@PATC6yOj%`i&9I#YmD zjKLhv8Zs2OAoc0-orxaFVNJjosB9y}gxjy(r=_q$uN?(24)=I+T$Q9zYLa}J080PK z68D5*I};wOVVt^-P zr{=#yYp$i_n(C(cr@#G20LCK{UsZ!hMS}zVO6F|Q!0IWIne=4lX)4vxSLjw1mYJ#9 zz*s32>!z}B@q(fiTOj&_|5hoaf&}`((j zt|xX>HR>vUNk#Fkidyhq!qTJAoC*3-PZ8wihN)^6)2@=#e5W6EK~ANf9}Pm_Uf#e& z)bw=~D41CVcobSK&TdB;Cv{pp-Wu6!mc1T}JB7FTmy>(h4t6D2vsG`!dD3R_{m^(O zC_*7=bN2g6Ad{rc=7#I7yR5%L{XPZATyEN#1v3A5eoZnnA*1E2G0jVnkF`h&jEM@X zK$_r~NCgr`A!O;IqS;DZG_|7~h5Pof%h%h)y&AY1h)6rf;ttA*Xsxkfi~?Ku>vn`) zx50!;V4~>FAy=vQCrv^mY*A3*X7idS!MAkRruifWTq^ z@2f^?MjS!yVjrH1jW5h^eE#EGx3{;{Dor9lJJ>JcI)|~UH@t`KjY{P2YDJyDP>W#UkT)H>dTUCTF;L0aaN8&-4oq>x3IfV|j@Znz|76lQ= z2Y)%~MQ9_$y68n{JZ#fff_opH^dfK^PU`Xa@Td+ACUihb0QebFP?%WIKyffPfsYaS zkjDZ*lBL^?hts3jJ!KTffPF-Qny?WXG^MbxxUU$UBg*1JGj#kSR9ZEPvGHEilvyH= z9D7!pwx6sLG&|c-ocLhD9?%{0s6x-Mo`A4b%?6349;BwI-3XycH3*uXGO$S|S=1ZO!w&4HzW&}w(cxxK zf*y5@te)3Flo~9W$Z^{z%+(~=Yx||%m}|-G5KGr8bWm-EN{e%vwp=^5n>Cm%>`2+i!bfYNV$|?ktq}ih7txNB=cGGwaGl}QfbSpD-jO2&! zp0ccWI4D=WffEfVUhs2)?j5)QA*u%u3}w z6i#5+sOm`F-nzLTqAxiEyf%4|y@LQ(cv}NV!6KaM@BvVxs;|LtgTMn_v4G~u*c$l1 zuMEc3Yb)^Hv;^((tNzVf&89yO2WY@b{E4~Z_#)rzC4G4e;qS2tzqS2de&!+K+i75Q zL%c;6YBoE(=de;Zc{;HR&qWTeC%)&H5ik?XFuRXpr~&Ha^J8=3Vade!Q=WOHxBXnz zAo-upbdba$=OUkTNDvcLq~p&0ZxJ43%Q772*3cFnmM6ggFQj2BvuoI ze03b`#{P3R_AlJnfBr_!nT30fn1JnXh%=SH-f2Pg;PuTov!d38+iPn>>>4_FQrdo# zuV0$9Ot9w|8@u4(c-S2lbO(mV!1;$91qMUJ??I|E=KGLM+{>Sgo)8fN@^R^7wa{#u zB7jf@Z7$~Xzqcv*{89+vCw|6Hv@BmuUrypayGZM|I~yV)bFP@vTi^DQm-ciTzx< z@xjiWO&xcTNEGmIj{C0PAw+eeO5;a&IPqVuzpE^R<+?Jmrc?~LS2rRL{M{XzC9mDg z4>w1oysH3;=mt=$olVpfEftO8)gB%ZW1uO`VN_yMGF4=qL`(r@uWBm!SbCtU17uUH zBM#+`kMy%wvh??I`N}mb8Aa>dOqsGP8n%`M zpfynX9BK3TvIwbcl^{~z>-NV(@qAaqRmPQ!1Qko4|#2mPKn-cdM3=q6z9CV)xvjhGy>(WOdJy}|5F%? z@})c=2vdY557})1MK&%CI3q#G);kE?ut5$*2hBox+wn#pW!~t2e9|CZ$jHu(2bT<8 zwCioB{?VOX-iX~DTIDXv4*gzbG{W0J_7@=(Hqag6`=1hxSnio;qY)b`PFA()RCIEz z;>o>n7m~roEb%c5eK=`SNGxOXlemj1ytnnx3cm&Hn4=M~Y5N zD6a4$MzQz}PHLb1?$y!pQS$1B^=gEvxx9|Au34|%6Qct8kTarJ!|}*=Uj6IOvq-^@ zvsgLyj=4+uB!>Y9mp)}%rBdES2K*u3pgJ&q_FlV?FvmFjDb#b3y3o?XbBMR7EE zb{lO}8L1}tzdw6bP1!Pi7bj~nKKg^Z*{e@LQK$(@0R$PJKEw|-XGj7^Ou~i;j4*>b zE$btepsjW5UyW^a7Ua*MWszp5LYVwmXMHe#h;R$fF@i_HwXB3e?^s>TBy@B*eI1ZE#t@B1i==i4hP@M2eRvQAT*J%2Z zb6z{%)9-lHM;Djv*GRX-XP@c2uUS${W#QOtt=n_|lp3mURbAJt*?+66mDi)@`xpHv zztxK5VYhPR4mw{F+DItk=>~rWCS@%kZd~gGK?j;;GfproGYy*;QI6at38MWr*AVyP z5EVdd4jKuOyQBqOowFwJS60Nr$XzoZ&C6{3tm}rZ^nfD=_VyJHIJ4XQw%wKlrPn6j zW>05p`fouthyXDJ5 zL9)Gze*~uGg##mB%pN(g65~kucQ?%WP#K(V%hqa(KiJW!^Wk!bAOd2OKg#CdT}3_X z4|daWPf@oXOwMJ;wg(kIlPQs7@xg=1lX9MXP<7Ir$|?1`D&XVTc-(R1tpl96G({zd zJ^#?s0feevo7^(#cQU8Y;IL|L`EU&#@w zu+uMahf19jv_*)b6{C}ci9Em$r+ETK(g&Mludp}CBMI~MBoBi1Iq#eot17lq z|NOxh|Lwp0!4C=@@x@=tzaPHE8C=;}TMhi-yp-x~8+>ZA!bOjA> z`i&5uAZ$O?Vb@$yrm$)X@Uz*eiAC$_$?Gk`L6Vn%7%tAeUH}LPCsn{)@Ib)8q$zQX zmnOx_s)}X%p-Zk3->q%t(aj7rNn6@B+_H{V~ZRu z!)tm~RiSTWUyB}O!P|xNs=yJ`ey7QzByB~=R@M@%R~gZyVRbM;s6i+v54hPzvRggU z(q&dv=&2qXRa#!UNU~LFDw6rp0{0wPGl*&uo**?98&I%&Z3mNGQdQiOZ2OoEDGkzW z;5C^xai;?14_d^jI9Ar6j3L$;xDeCTST|Qx750?cOq$Xd%6KdB@XQn<;6z(EqPFTM zh>*g}?KGtMvrDRqdp3tURFN$Pc@UyG&}i62e(Si&>4}(BOhHSG0bVMw|K|;49X&O#L8xg-WdBaS=h3pFe2Yh6@H1%-} zctN3Q0%ZT%0NI=fdqTR8AoOpkkd4}(-p;SWS!ZW!`}Spl=CodeV(=3I>+Z?<9Key? zrE)>ir(yYI2rNpjg1Q?gc(!-O3W+_ae523i%2P)j;bl9E=S?5$Rz(HpUNYw@lu}n7 zNHM@aX((iINv!BwKpz7#5!7zuD^0p4O3@qDlP?8{S2&|8L^hXfoE5=Y-K|g|xvO#7 z(SWdeSb0_fKmhNkDcG)l5M7$!@M6w1G=7(ePYBa#_$DBAG6R#}D!S2Hm$q+#dldO{$wHPifR~Q`& zf$5DbHmHj0r~9}YjrP|gHJjA09s;Ti>vHDYrU!1RT!^dD0wlV*;dvXjw~mUuI%1rL zL@)KEvq<#MvshQvN@+nD_#2%P9oer0lL`=KXVpx@NyvhIIe+k=dW) zRTs2n_Z=Os_<7}XOACLG6g)V(kr|8{7;gZyERtPn?EvTJ)b5b^5=ZQ_^VEq2fM25- zwcS)4y;DvI~)SrE;*knCBtMOLI06$p@1 zSr0GLx+(O+MESqwoeV+82J+|{l?~pD+BsUWkkZ6gbX~A=7ZMaY!T1<&R z(>YCx!)$8@*+U#-{LVT77u#3p$r{J6d+gB(SaU9c)LV-Phz=xWJCu)AxH>qjA?70P zn=gOze{rP!RouOYSL^XX^43L3OsWx4*z0XvOVZJs7vGj|%^yc^|BBFI?`@fqZ|NHm zjnFqDIwLoNuO&C)YvSU89Ds;g2>+1Nr24`fEY+z2c2I~0lWOZ`aV71j_3 zK5_RTIeaYVh-t>JIy`fDWXGz{TJohNZ)K0nF-FxygHOVZkz+0S-V_cw2BNbroW?iI zq{FEr2eC7L#hDr_-wIQeOV`DxRvkr6Q)UPG!Xq*jk0oc{dYxQb&BswSLSLXu5_&)e z@|WGi@nO~^)8BKBP`~Hot&dg0GKypV2?Z=!--EuiFYd)CRxrG1Cg!2IPa}2@#9!C6 zTObi}p%D%B!TEJUjd_Zj&aqZ43p9|GZfs$)8gZ0QzEmF0*raO4I8DgiaBHTv>hJ22 zE^!OZPL&9h@CL{rW9SR)fQ|H*>(-x-31jot&_2kkXoSHG1&Lqvk)DLGWEwL!;pMp` z<}TEytXtQ0w+_v_BIitY)wt2O2+xw7tWLLzAX|Vc)+9nkR`{>#YT*7Vu=b(Dyp?O_WTn|j?>-i_Vh;{W^7XFlz^;4Xz|1dvUrzp+^ zq%+r=$jAU=225`VX>kbg34f$v*l49PslONtqmcvweYi$WJ?t_+akAbvUr48KiO#zE zVqTnK^6r)19w+DNdsKBL=7k`O?LaX<{eoeFWG1<=q5 zJ19c1rG`!=AfYGTxRux-2-hp7lIdm5f_)P9dFygNROIe#JZ&T(W$|xqao%jJ*6|CH@Ge;x8<97gy7RyThc&-{NwQgm;|6gVs6%kT! zSt3M8L2o13k?;>m<{xESKeJ}+Zg1{v)^&JmSDWkYew>8Y+291k8tW*1NjtHrVJTbC z-ZO)W0jmTR)PQ~F=KEXL$Jg)VZJV?@xGprv`Ayo;{e_+b2P0<6i6NYInrR>-@}x0K zb{EIazni>bw)L_VuHWm$>;1iG{r=%_SLsx$M6T)GR~WjL>HGivsg28?P$+OKw=0dK zTlm+C1wI_T^?owKurmm|TFCAVQ}SD?87q=AtA{+TSdq6Mv|T?!3X)8*mP!uwv6>Yf z7-(Icl&RL2{dckX=Z1F6VI<58Sm;#T725fUD)QpL%G!B$t0TdZj2T(K=co_!8iM1~ z`edxBE4V5)F<9i4C#{v#OX#(u5$S5U9Cpt8Vba7?lOkQN%-$H5VfnQf-lAprT<5bq4ex z+N4p#mx)!O>i1OzEjYSTbTjF+QRpBuyU8jIhZ5R0d~P&ykt%7kV53@c!r`~-X3szz z7MMj>9n}ramYDE05LF<9pSd+o0Iy@;ZTMjjz}S@Xrx#Tf`7|JzN`RoofsfQ{n>iZH zn8DtFCdJ+Ysu?F92)d{|$xwzNm0eR+;8O~EP&I5f(7%FZ zbgl~36ET%^PgZc6IATbUehQD!gJ2hXsLD)<~^r(u2QjGlhoM@L`NG4WPN?!I<;NU1Ji!2T67SFHL4Itt$R$eLhnUfDL$R z`^bOTk)*=~q6X4x+O;O;ZzR65cxuXNeoa+@=Q4mw6&WzJFms|4eX<3-HiMak7RgP| zbC76;kSDk++{)=yRfS%diUvR{)!o^GT;(Rn?h=ROT>I4Y=7$ z%f+7+?+XP{n@A3v_A`Lnwr)m;s`e?ZagQ1KPbRON(4J=wrLjZCOv|xt zWV;FX!$D%dEMQtYX8DLCawJ?QVag4){$3EQ<#q`R5UdqlI`b)Kb^n{nrfkcG?}(ey5M!af@d7k^^`n89e z@G9}RM|+Q!b;o&v_^>)qx*c}0XzOxHC71y_iwq(;{l+8^LH`})zxEp73bimLkR*0HSU=mm8;(seM3+b|mQ%03psJ{+$YnVgs(PV0$ALcea=aRdMI1hdEWI?Gq(WsFvM9u-R*o%@#I!Tfwr(x#JD) zxC%iiT~}4`v(Pj&cS)7&iy<*y%QX~mN!1i1ASC0^afG#llzfsZwNUbZ3zt>%2h&eDoeJj2t|~wFSy20u z22dxdlo0D#C6zF5M<}LjLOsZR0vtmx{3fV<&+a6LN6EIK_5Da@*moc?96{NdvigwX z?~tCi{ zzk^yYL8B$?5BB?g02wkl!hSH|Z?TsG3BCNukI$7!ekm9RYHf$04jXU$)wn-;bMs!( zgCTbV_Mi2!?dT8Jtg0{VgXoFmnMbmQs1{D0brgRA`k``bmPQw5mfDL#zEf#Ulp%Ro0o*EF ze1akR39zU#Mq|eH`h9PYUxfp!o>9IEWX<3AdJ9jqq6Z57DfyB2K))1UFc|&Ee?Q02 zlcA30Afh!wG(~mWXIVqJV!ojw_jNpYkd)#;331uVC&y9&LI` z`37bU2G4iz&7LKs3XdRPIqEuLSW(Y_r3~WGrvjpe05QXQ&)F`m)swGKu$8nkq59lJme%%Y<(gxb6O88B(hG!jDc{*#KI_QFr4A`Q$npUGA%)_GDeN=C z?afXjwjoR*xIze@6y795XurJ(My?flDj67?od)(74YW=0TO}+*Y}|I5aVJPP*!y`j zrV!H*vMeKj|9C={^*WMIa}ojgvuu#c;493<498(zjd%v*#>PW!$+NaDvVs3ByWgYG zfeB&D@j}^jxvbX>FkW9AaG(VA=;l>qp9)a}aw5DL}0Qy&spJ`Cz6t-6#ood-wC@fGASQTjrd zsToT89Mdn{jTWLw61hf5DTVZ#^+aAoIlclDA#mUu*V?W)Z1|%4MZ8mR57;|F%K@9o zide|?eWNtHPxFzj547wo)`%kJA##I=$_O;{+T_o#DRq+fr}Csb{UcVXTAqj`ub1%Y zbl@h_aJJ+4NC3D-zb`%Wm3eBnjd;m+QKSCA=I8vLMFtwN7@z04%1)u2-JO z<`Ime!rBbNkKHMK)JxuEi`&jJZU84d>@hF!ZQ=3D{3TqFlM zOdOEB+Q>XAmj=bgd08a@)=YXTQm{$XO}hfmJ~vtX-G#~X*ZSk`@Lm@wB9$X4`Ky1F zQ5@en$iKXMT*SOsmpu4jJ1BO$os9JF>OsQ&q%_L*)NK>g#q@{G;s`?Rd^ud_ZW#-ULqw&ji>jqNL=DXZ!T3sOi zAttq(+1ZEq zYB(LCeT$L3h8fQZLAgm6$^q(=EZDJRi((v*SxW%TTq9Xmx%g%k*AH3DqCCn*3xY>9 zbPesLQU7p5?Vp?@mHrH=tC#(%fKYB5rju8nx%03a_e2#wgzy1ezb(_w6fWAx zI_hzgmL`bm(OBK28Ekdx*mTsO|BkO+i^k={%&`~WzPimRLnI0yE*RVTB}U}qhMd_D zv8DL*)|K6x@9o~%xp|8w<>V^be^WUKSxz6f?CRTqi*IjT-Pzo^dh^Ea*3BC`w{KqC zz46iYcdy*GYLA=qVVZMuYv<~3ukL(mkzM-HwVgW**8BSjQ@}vfSA#)MHlpZ-V6ca- zi{vo!DXKEV;h5c}DALGu@pw3II1e}D-hA)9t6NuY@4kQK#*KTg9?VuUW5~9$X6m~Gv)$;L>HYCA^TQ>97 z-e#|Oht0QXZ9xewNOkDM$-eM$lYb2Z{M{>?JH_V4KY8@Hsm~5r27|kO^|y<6;4umK z?8jvTE(agkd>ke5v;ysaxaHFz zR5#zVZf)MVbA`hYHsLjcugXdPC_u%R6Awl+#`Yr%yJ^D|*{17h=#tWwmFT0|yQ>c` zKc0*pW-|JC^Um&XuY9m|_1cx)J6ASuZ+&n@(C<%aTTrbVO!o!{la|i=LzV#L?8EW& zpZnSLgdo*FuaJPw%<1;n0Cz`un$Gu`GI9ILCSqf|@7=s@-W}eYu7)hDUKMdl0{elR ztQE!0JEV40n3UnVg!wm=Ha-`rY?J>&}(iw?DO16zt}0mcJcq`{u`T ze6-!HZ&$tj>W}`-J?_;TTUWQGm3MAho41u7)GHZ^U2hADBH{r1<38w--OY^*@MBu9IkWaiH{@@2ETq8S5VVz+ipmRbs zX;>2Ou+(7dIT%Tv-nE+_Ufr@TO$(}hn4~1`$%MV7DaBU{zKUD85@7Jw9UorCA23AD zYo9rL9|qtc5hJ@)5$Y62SreWlj2Mn%(grQjC>Q^Q0qIw)31XheKSlI4zz>id9PKMd zs9?lZd_^|!LI0SQVHg}>t|#UVnQepQNFFNJizpbV=Tuk}zeu~_e}i$4ze-L|!*PVf zsNBC*zPvE{NTDnk9*7HLmLv29?E@W7NO`JiddoN9AHvUru3og-(1sIJTR&*ImhwE{ ziMaLseKv}ey-ykhslsCR5Dog+Qi$`$L4r+$YA_-5N|051Y!vg7l@nt|l^06k`g9Cw z&S?F@`Rw}>zLFe~gZ>xYNXey(X~4VLRm+-RAF- z2+@i;cH3{d=;Wnh7Lbzd)o?`|BZ}Ns;-P%@t=Rd6wSfWOrV^G)hn4U>w7Io>mn$a-Cf9zME9B(+>qKg7HV%g(JHW)EQn9m=&7DfxZjx_RXdB;?Y$T`YP7N2Bc-YPz z7W(%YERgXqa2`y|-`u>1%ehPL^o^-6IkjimEniQ9(=*ZdV8n2hMt+L4AMCWUMmb{N zD%u0`)%mHyd-nY^+GQ2Hsf|zmUt@DOeY%D0=u0v?T;^awW{gGWWfBRja32P}G1s8v#bS;;4cUq}6>o=_L!3{6amw|Ul|?R`-b3I-C%EB#~uFZvK5|f-t1F(!eM@rrN3{w-Sm+9q+dwP zYavS>L{78T^x`(@x+F8oaUvJMpDWvKdF?itb}MAVEtd(kARF!*U8bw_@#k7VwJ!Tl z-MUK|YLMxPba>jtA<#pMEA-J+_nIi5kuQqz0Mg8&6Ma&nquQk!{e_}tenBgLfuY8- zO<$=Y_(iru%4DXTqM%Ewb2p9M-!#+V-L1{L$9wf)P+_tmOQRwyE2E8F**EWAaxd54 zBihUweMft1kT6!^>rmP9l3e!Mq_N@#Y#kp2aX~HVaJEsR!}Kz&H4@Tzy|hi{ASN6& zKkyKu!^|h_kQH}gudp$dSK*vkG>X^4gMH<@k$XWb+y0g6fWxf)5AsaDrFN+1OtSJW zRX5Vo9YI#*0*eS2XJ&Gt;jO<Lx#({TaEq>OMA8Y}0XQ3XDa-3rU3z$%ICU0xOHu!3;s> ztd}O$1ytSY)wx?8DRuo?oSz!Z6S^Y!C-w&-?HOP~5csGhxJ^VsTsLuAkxC<8s=TU- z{Gm=d)^}I8Y&YV>kJxIu0b{|l(-gZ4yGH2%lW2=S4#EZIlB(j)tM61wv?{aNVjpZH9O1V_2BCxTC(BHy zmf#{BFflqjg_K#ku3Ye0WTmHW%L!wW^&LMEj|dsx;)T%?8BY|2SQ0TH`F69?9S1Q+ zjQ3g{7r}wKtn}&EqSgD-MPGnv0N;JnpSEaH!A)?HHvQF9bBn*31m-Hr!8hI6 z%hg>@vgOR)>GLd3P5pg*7IX^e!?&~8rb)P?NA&0a@!#u2f*uyfAXreD`cYQ_V`|tY zSP}EFKvhJ76zDAc8Wm^(1ykyfiD-;6gk(ddN!uz$BqL0MB8dP^@{>Wof2c8}2na7s zbSZl5^_Vx*UCg#x%9ERF)9!4qO)C7Usq4STeeluN?OpipSKhyQ`_s7&;7hXXMdWTD z@C_7=xguK0kpcH@4y}+k) zsM}t%JbTS*cTfzGgBbgg%px33m0q$zXe}uVLu9kTf*HC(dGzAj*#TjuMoNkCJ2s1$ zH!MpgHcLvW<8_DAThgcR=@r8o9UnodN%n|a|F1`KOhFfFklgE|COr73zx{Xe{_zch zz@xo!5AMzQ@Q9eCEW7fpS*MZ%WK6UI3OR|ONZDf(r}{d7W9r4Aslh!aZ1C1kZ3U8GzFI{xsC72 zYBkpqH@B}`E42Z;GK69zL{bcxt4W-B)`SvuB;)%s9JV&ET_v%+)C@8dIPiC?7P`U< z$c{~|O;(z)nIz1AtfCkPXhr3hE0)`L^_{tWW$Pw66Q8O?!nqb=v7N5sD%NENh&(^9 z&?o?OU?9oDje~kWKK{(8_Opsa#Sdx5Hc!jcIB*R7q()|0R&VxGmYl;vm6K~&PK-21%vru*_ z(rs!7A)`|`PI@bCellAtxqoW58dSmTGQVGa1g-g#xjq^uUlzyg<1Ts>%w&ZvTJ>v0 zg40|NiNwI{a4ih<$1l+;sMZQS^eI@^TxT2u?de%1JNRn~WD>8*$vqt(XaN~zZYqb2+ zX}u_N`!%PtW4AXN4g4Zbr1kzo2Gh+&g-)i`o<{36`_hLED1G|`U|Lc5M`B0NXm9uu zvT`01fXP((U>s(z-eUr=ajKC`Q(=02OaKOV6}ydWpuAu#BX-}BkSj3YFf5!1x?cy|Q9P0uAdpf$d`lqXHQH{&@gP%Gb0_oeX$U)M zv4`~ns_?R%R7n;7H`&zpC{*EmJHM;4Np^qp>8{z#@5%vwx5Q`JCBbvh7s5&sugWGa zbPg@`+T`;S*u;;v@2lh;r-AK}xyx=0mKt4*QEup9_uT3<8qKH`+DS^as_3zK7yAv> z#S3}I%XVfZ@A%(kow?!`I^#l|lpS{#&3Q6IxzM@TM=xS1H=2PBb+*=MH5!mHBdCfV zthltwp1-*279}qA)05Y~3mohzOS(X!rtXia*RMaOUjM#QuTP*flRMbB>UTi$y%NtXx&WHt`_e85c+`p^_I?y9$J?^y0d-rLmWY$pZp{PlHM5) zsm{+z_@it`pc*X+2C%2W8uLz0%ek}j|> zUaR+lgE0qABq2!gHf(#z^yXir_p)o~k4F%O@Y_b%L2S2Gny~x@IJyS!mP>;JKr{Se zYhgQTvJ}4j$^ZAGAN*j4ll{?nfN55)P(FlH3-3q*zJ!DGJlVv;*j>Tf_xFXK^Tk*s zGOT`t=ePV)S4;gsD)AMJKr7}qu!gCskhoM;VOc^)FkVvteoaG{bS6t#G09R&BSL16gg9 zMEgBFclP)_Bu7}z2Z~m$D~@-f2m~ME_DrQ9ntnKjrNeQoDQ(vA?S(be_YL?NmbvoS zzSCa#V~fqNuvg_4)cH`go{%dK3N_X3Z%B63f|iq?0Pb`LR-pyt^SlM7?KJHkq3P`% zbBV~D@G@*&*&be&hdZK^y5!pj(7`vSHFrC%bq_@qv5<#XOMA>3nBB;_`y)M6-jfcq zv|qML)}0Q3sm_b0xF9$)Ceu9$j$rc_9s_9>RY>+E5aUfBX5VN{7&^5MX|bE!&pyxi z!zPW~yjr?HPHBX7>$VxvBC@FLphXl1&M;j=(6|>J*Cf$gQM5|0g^Eckdi}y7O9S8T zM*FbkW22R`Ccd7q=C??ghuRvvXd7npO9Okb+R~t72LzZ6lwLj%4iXHCC zxKc)VmghM#ljM^gudvee(MbuJv;wb|&ya>kxwk)k+14#Jf4DNo;JnU2aax5TIUQ3) zF-G%nLVp>KML0kUDyZj|*m4^+g@D(bF-@~%zgDAe&1#gs%&wQnpm3cdIzm8ILuTi4 z=9QkDUd^CWOAqZWZraS3q5+xULMV-)LW^crDivXF!n`d?K>Ah;JE{*=Az(p~e`Ezy z&2ovF#xos1`4BV1sMsrw%hHhYDDvd3rd#fqtdgcCYKai)YM6}fCs6VVedVgbb{)Eq z%!#I(8ij81r`;r}ATktW8um)fJJa^kvWI;t2mH|Ok7csYn%zuzCDjenZm=l}N}O4d zi#osf+pKpL+YZ_;oFyf25f8?Dj1AiVAnNZ6J6dXHO2!%f05MkHUYgM0Bs`!cYz7lY z9(1?j z#Z{=Pj*>O;8JoOc3p%d+USzFoUYe>#rTMa7srHqPhrE4NzdgMJs;**Ep*-%xw81RN z>ZU9~_?Vr*{_#+9Z_Q#7?8)SzS!#cR%_M(xUH?vxT9e43gOaFkKvFGr}R;Coa`;oDoY5$l3 zTm9-Rdd*}m@k^7f)OyPkD$_4QH!L~5(f-h?;Xq_{bjR|@-99Onk~S%) zui}_twNs}BX$N__@`Eg@Un?Kds7U#prs?PDl3S>kP@Ju%Z7L?!^5?6?=yhkRrS?iq z)otppEwyLQnngAdELa@lrlZ=5`_WjAPcq45b8KMkkS3aX0Ou&eEQ%ryi^xd?TyqpWK1$bvY)LBWA6_T*L*4$*X#fgv~9!# zTx1jg83?(w?RH9Le&G3W7u0vkTVLBECumk4RTw4JBDOT!qbph`j$cl%#X-pXLx z<)sk6(CEW@l?tN20Rr9d)&WkHX2K~dh|4|TtP0{l&9ybcFrX3El^l(b=e?zJ|I0J* zO><=0u(lK&v8MNu%;>snveVw0dM8M+wp-R`rE~k|XHL6H2$!X836~+P(Dvh&lO(Nn z3mG2bpOH^2IzVW!m1_xpi?l1zP;@qkCj^EjG^3&TWTWXeGwMM>^YEvH)PbBlf`iJ< z-QDnVamaJboO@%IOPC3tKbSnh&NDCmnM^DY(!!t0@Z6}^MV@gy3{;+_5?+l!S=flw z5qM1w>dv}d&uUQ87CfmA&jC`DWCcY_5a6q6=T#|d3I04ADArXrT^vZs_bI$$rggqP z^2KvGt)mM{xH0)f_U=mSWN#(YKwWkw>q>sf)akoI+xTfFsyo<4jBg;DPLVsDY}{Oo zeZFli)h#)lqaS|3(Ro)l;p=`Yae^4>Vke12RwYHh7%@|nV3J1QIE^NqD|;LW48q0o6P>NO)gyBx^?Ha>$lp@`aR&LWnR@@nWl{769F1RQ z?@8S6Dh*)tMH}sQvp&;sL~euq|A2g~j^sV9H*X5X7jgr-e_^f3ip((aAP&V%WRC18 zOd25mwy)%I@@uN%b}#4xYsp`YyGQ>&dvE(2M|!6Fd3Rnddp!2q6Ys8f&#ARN9t~E_ zu9vRvE_!BcilijYP$ZY6q!}+9pZ1F0Og~-sk~h{3FM~_En9U zdba$6cz?jL{(te`|C|5*Kl}f$+AIHXWB;X%{g+RF%6<@8NdRL!5WOW1YT9BVRMhcV z6*fc|RE1@YnMge)A?rQy9Qh%Z8V-6IZJ9_)C1w-2lli86EZZWY7%dl-i&a-QGJI=jwj zuKn5DY>z)v=vN`s6%>o)b(OF?%I)`MC}#^Swu7eQgFFZ_+=Wed92$|42Svk zy-~Vqaaaa+;(4uvGu;Yt@3w8%i!DZQjz9poi0y{$Nqh^JC(Q54nVn)UlV^)s%VCbQbcfMaf`J#kkw(`R!UL zapNbp7mz#8x%g$1_&fPxk-ODNR-;!~<%g+le+~Lg#!t>}5HDnm)gV8%7Odt7VD->% zrnY^_Z2#8aAZlcNCkB6`(_TOX(7xe#3;3Vh8}fnM>bUX&=VBhElbfn#YuEQVw_35= zh!WvH`7` z`SlH>{GoJ9_Mz%3`DN{g(xcfgRWIjd{`%K{`*oFPo;DG@jwhy#<|dZe*&Ua=QP;8= za$qQoRz!lsmeoMGkrUSIXkE+vJ~3T(hvW&6Jubk`p3l6RVfkOlE?dW?p0>N-K9g_a zB3x>aJ*#a(3XBkK6gyTrGeFi8TLrQ^1kji}MX@t0rk-VY=!TFa&OvxBRa zOMUObCwJoG;}6$%dbbbvKK`s;c3GP(4^y*cE`D@d7gnH0?)rV@J}$7-^Y-zp&{4yp~r7$(2!+vMsDIY+Gc`cYMZUz2Nr3x zlNL8t7_v@@>_1&Rs-(`vX~^^T?MwUru(AJdHuekGI_EU`V){0v5MQQ$>40>OA`J6+ zhRk$L+j2=2#ML$87-edrn;Zh|1De|G1pp50lV{FRekODD&7$Ty8Z)WL_cwP?9f(E$ z^7DNFlzBV#<+@JY|6)3Il-2Mu-OAROcI!uX*Yj>Q6W?;VtT)0KSzIg~@(08n==0p) zp&5d@M@7J^Zpu2YI-q`9?AFKq2!m~a*SCQue7wK#=9y1?1dm5c7y#9=%xi~)9rF1B~jQ?vdpA*le@Eips?g}No}$7 zQ&xzE%30d;lH0JRL?P_GHSwu`H$ z(}*2{Yj}-KUpsyyHaoUWN6B?sUNil0-7DVE{*cDVPh!D_1X64}b~}Nb?6`n@tu~k+ z0St_UXs4S=H^BERFQ`6RF8&Pm^W5NAM3jTwh4}1*0ZoPSOlJafI$=9>!j2vIZ8ovj z|9=0Qr>}sz2h{&tr+>CAycbD?v#f8g#?ly=C^#0N>hn+k{+r+U#_0{&l2XTzVm!0e z!L;QE<*RO5=o_bRtSpoGFC#|_Q~J%l-be`?{xS;XI`;VlQ){W~FDc!){#pxIS#}GH zLDQt!GYEg{2&U$Gi;lZM#y3}t+P6;MIU@TgF6YMM-azOzT)Z2-(dami2nJ~&${g;4 z#@Q70!;k-$R}pYN18DE;QPGuLG!6CtA{VSB7uBCQ$K~yknMu980KDP07T|3q z!`pzlmInt&*YEPyL4!X0nsil-H6 z(?yjDQ1nfIUMp9s>wRA*Zu%7^<`wW$!JB5OZJLdd(k0I%!hOc zjL8rnts_H_(N6060M{=;(2u3?iC2Am@{DpCs*#MPV z=w(ctJxQ>o_~n`=Rife3pE9?kT*+El)MZgrDz&ciq6-U4*yB1cn_}5RH-Cg4x{7xo znX{55mUl|dPud*$kZa(aK9YY3)#^t2rwk|v5b2E(0pz>=pXwsAj(6M7I&FDDsHgB9J(hEo?7@2=h5fz1WN zZ#)?c=@yZpCp@9gtXAO|o$oB~5es(a`x?gUt_V<_@I_^dKy6#DutJgTEdYWTcG9UKUAp+0p?bB{{ zu+2|pBAc1a=KR2D04pE-@nlK5+TK z^ME(fnUZ^W%1$EN_6cH@^hlkMJ6j8c8Yi~ZaN7|%>Duj()i6~=*+~?bz=kdlw%tge z?Jjp{*CqIr432RCyd68ab9knc=(Uw)wP9!Px|DY)?Fu993+>)1d?@{q`FvC#$uDa^ zl&+k5Tz!~&hhS|@Y2Q>Xi|qxoWtv{@Cn$SY02x{~#4J!&l{F09IzWUE_?6poY`0Nb z0q!qif|ZLXcsYdtN$&h`co|FbzAz$@}Iq9&Q8IxbWq%jU#P zc$iualH0P?yz3wB=$w|IF7+OQ;*?U;)tX2(y|#IK*?4ewCx=@dP%JFH7CB8~48Mfz zYUFVv86b{Uzb$M^(abn&###W=GGl*Kg%2W%>wx*s&h6RE zxuwtGc{`P^(cSxtAsj#MoA2L_$IJeaAN08H!#Dp~TJHO*6YB?{GWFWbcBWp9n=9_J zCs;TR+{mZ%C7)hkI!PlYo28AAr|X!YQpL`%6iuF8t;ICc%{6Z?*SccZ99z0$iyng4Gc-{l%U$2@_+ZJ6FeFPbwm)tw&T^EA zx=tLBD$zxNX-bU9OImNuQ`IY{vDJdbVXvSx~6G zHh?mFTMIdl7{+&uYqSgFv}59Cn|Z;ld)Z6iGOFT!0P)w86sKs6AqlSKfx^5@Ik1PUXCLU!9 zYBfT5nj9Lw9kmqUSwB!$)NARLNH-e2Ue`h$3*R&~459IRUC)D`)JDim4sP*56C{;C zR9EEpvs+fR1I!qq3y0#nO6Vnk`5o9Kr!*rca&2r`CW91TUqIcfzL&i!2l-Sx5WEe@ z3EDz}#l>bO7d`w`j1{85ltMVE_w#kl{3y+(c2@9PSB10*)p ztDp>3W*0U(8Knd9l~SgO?M}{M$usK*cFP4Bk@V?!+bWNii@z#5dO~7b{H*ZSyIpKu z%i~akgU*OpNn(-#*NrhJo;iCp3 z;g-g16+JBQoPwo*F51W7A6+)~lJFTmf{j(r!aKXA+lT#c(oh|!A?=@HRp`&^5W4_!MZZM(m4NCF9%lOWyG5sv(lgO~`|m9c zL&&_w?RX&m7F1tVjKjRW`{jGvz$)sUJ(U?Hvo&}2O#EG`ng@zX#3dnj(1}RT(CPw3 z;+PL`xwRx3$8L8m5W-@|R*E+z!P#ZJZS(f*^XF|VPd%CKk~pEp+vfQW*dgJ0m|0+v z1d}vK9LFSYdtDbWxYa=@rquc6qM6k#9r`%a+cs}6Uxl~rJmahAZJRlJ%Pmx$2Lo<~ zw++PA@o>90qLxiOh#8Sz!6mOqkoY!!dGazP=XIdlrYaZow$0nASK)0tw^J+LHr=r= zylq7?=nHS#3vb&CZ`)|vW5&XG;cYwp>9gf+i>$ZM~A(>gsJ_@{-A+q^1;b3 z1*m`)IzAaBA#oP|-aumACShy1<;~8niS|r;(L`DVF(ey%g0Aupk7zxac1d}H}|sC1h3PZ4fTK|rz{^doX9D0O5Bd{EUw5?Sjb6V%d2 zXPtnA_z3|GI=w^oGacHpB_Tiun$YhP91|G9aPS18)Piwm@I)lXiCh|}5=0bRgnWhf zFOki}#2k+$x3z@Kl%6H7W^hcI2M0z!=EW2s4-&N|>eC~M0~!sI@e>K(0VdMjPc7tD zk$r)@^fA18An?_l?KLC4b6n4(mP!6GG;XV?U}IIHf{p9M0n3LU-Tf6J+(f4d4NTP6 zmA324#7w-L$4sESXGI}mZzh*Wh!s|hs0Oks7Lr56;1X0A(D?*`%7CkQ3Ej66F7f6v zpGlk3{;rFZKo;Tc)12sbOg<4mT6ofXL?lu~&>s`0DgQc>e>LeBQ3+~}_X){pdQH!3 zt`GJG4+qJ^^c8R0%MaHMi02zXLL5EbYhoyyN1rv$`B^b!qO6T&xeHwrIwsckIUy7C z^;9)v;;k*^>B|`Dh{DUHzVZMG7`r56i=wdAC1#jJ+F=6sh`@8gZ&6~49oG*)83Nz+ z0uu&K02j#(N$=)4K0kN{09!l5#Ok+~rm*#7`Hq@)>o?=Zr$@|9qxh(RL z*|${yR%yA8h}oU-qG%)NzIEW zqnxN=!WH9~wQU0PA=Uty#;(YbSda*z8@0H)r>OkQpn`9w`&q8FiU_1|5`S{~SL+Dlf8%AMJM(e6(gbT{YzB(72ntqJ#wW>f1k8roY}XOCdt44dyyrX&wiQ# zi01JJ_3OTF=W2>+A!$#4;gd{wG}=XC?ERI^2OH~~ODi)#x@v=^FM)kOKmFjGHC(fE za?%p@h#ucCf)n6pCE8!t6HwTSAahlhT6%Hg4*pP&BXDTYUb&Hq@3K&P$* zrCXP&`E;DvG$G$YCJgc6Sp30e=QNPhgJ90sMFCYRAhXk>({|2;yuT^$yVTg!VzOJ8 z=o__kq+_0Pa4>71ZtbX$kbf)-AF0pMb@OpS5GckOVT0W^x)^F;<^)Oj9fXiAze~yn+vowiHd7ZaiYFuhj+)J++Dl~IgiU8xa$%RdwL}cvd>H+1Ry#*&2 zn?wWh0j7FOvJAtAjcob{m7d~rW#+1;^uI)Ok}Ax2hmvaB1sCGv|+DH z)I4Vr_Y|TYBA+mdXO5(sMc25_qH8V4Jx9V{3iyJ^;*jRSfyOJcq#mgh7#{Q-MkqX> zm>$XHThNRF`TUT&Kqv=XU??EN{|?9?sKH(JTVqN8mi&d;Z;k7Bm$u(E?yD!{a*bJ` z^1T&R08pL~gG>p1q_I}yhDwvcDA9=D|L(mh83L#<*Fdn}1LE03NVIWw4Wm!Zp7L2tq-SP-? zNY|Gy(-#V=G1Li{NIQydh;Z=y5&1DCoerCFADuZx zB*{s>g!azCXyNz26J>}$1m(Dvqa5?e9n1`zd7%tZ715}|9A~T-y;80m@d(ffX8R@X z)9kXPv!jx*hNy6qH92g-LIU!^nC#AEzUYt#1Mvh%UPx~GiD#L9es}-sC~9k&@gu5M zXlF=VEeKe1pOnQ)Y;$3M%yHU_-fx>YE0F<@qXbxo@T3HZa0jy?BrM9AWCke!A)*68 zvJQA@&Mr8t+d?1YOkUbbR-5TC$)j8Y;@lmyhK=@@S;6ONfuE)R0H#9*0ejc#vgO0F zD>bD8zhtQ7gFHm$2HRbBB`?A+FEqigOzz>@Z+{zqMv}7)F(*Iq+*S%5=BQMdxxukRZ!<=}i@8-i-x=AgYX5-v9|~H}=Z_(Nu4COiv*X z7o>B|+o!eQL(Ur|D|mb$Mh)5t;y+7mJj58a?WuNsh5Qt+Nw1~Gn7W4etprZ8%%XrS zFc8`z?)e1l!v8__KD66tdWfAnd8mA2&=;gv0xZ2psz5iy1;FK_L0qXsA#z{@#QBOA zKSWUS{g{rrg=CM^75AkED}TGFh^Lx>dT|T)mD?cghuo`C_w=ExBLsm6M3guo&MoPa z%9C|1c|Eh(^_`C#K5jq+EP^qF^O|I?g}B{DQl=&(&2f;ZMXlud1h{oN$vI93XQg{`WNd zBDYsO&)g$(f!2EqJLnmfvY3{&LKh6VJ@XdX)|F?0>#$s6^HwZl4{-|@$BjxdfbwUk z^ZqU&ph*gC)J8X!cb0JBC*>#a^!E0jkp7)FDz#DVAOwzpjUk)|4J}+(qfL5jMRbsU zF=)9o=`jtKH;D)<87ftNS?(6F4$x&BiKcNjpp*DY=}^@@q8F+!)@eUUUTe8rE98RK zP@r@j{~-&tQgv0#2X6oRdaj@qrH)C;uKls`YbFeR@L0=omftAXe?54GL6M;grM_SY z`@9t~RJ&zBTg>vkgWE{jRD51isjXp;efDHBRU~UFeY>@DPm+gA@4&i{>8MinK8dAP zJO>>k&jYSpYbm-Q$dIajx!!6534{@b&`?q!MF#xd&XN%wt54*gDtUFU|9EilSblWG zj3==u6CqSN>~)`vhsWU~JsBROXTb2&NR{S!4BaH6JP0NODt!nHlqcn#WEo>W_wb9w z4G0?SF%A*}K8k_F4%mTXk;?-qZ)FXz2V_Zk|Lm;kJd?eV-&5ygZ*-eot9ftdA)2TU zcgYz2C_Z4e)KW0W?8H_CM+m(T2jlD<3dVeGu3{5mz8=rmRT^h+D6+O1YFB9(+20LP z!IKY9M*H0>hc{xxEjxC{=8z4^02reigOEjx#FFQLYZqh2q>4^V;F>Y#gJ z0g3n!JhB_qmk4kC5leQ6-s_gi?%fl@kOVuuvfbRWKFR8HEjUJ1{dgH+S-vFa?yKMw zh$-Z`ZoehV^shuVRz3dr>1DE#?DrJ}RVHGQ1>EBrec<6W<{ZmjStWqvfP}nhfxWb# zCZePcqvmJBy`=Fs?I@?1R1yWhf;!^8oxILLAV=ke*SKPJ2x{%|uWp zV~ms`kcE84&vlMu@42SH;<%4TT93_Lfo`JuU7t7 zXToT~A02)6wsUJOdjH^OJNtttH&5PQ8HD2C&MQmg!66&0k9TG9^t;<|xDaMUZ^*QY zGo=XBe1~(eFiLqz-)C>^hbJoxBoR2U|L$#*gk$may$o}bQP8!<3~CBluaSvXkA89V zzWORpax-em(#|tDe^(d2rPDK~CI70vUq>R_MIRZtXH~ZlaCdaL$kshi%_3D?>33r#)NCB*I zoL7$a2Yp$sr{4xte3-xR)-zh*-^1G(#f+eIWR zA*&79O(pLpTv3mNAskDjjc>SEtt`IYpC8t1zk+)8z;Cwgil%`EG_Y zki0)n)V9r^l`UKEZvxR3GfZF8cRJJ|_5Hhr;9JKd|4tjcQk0~?EZf}>PB4yeAkC0i zDKRZe&(+<(Us1cAzSDb%1^~?v)+*GL$b@*8$W$WY3J*qzfPg{_vPbHQd$Y26s)9RR zeDDNxA^MI$w5n{k&5R=3k4V*$p;_`C3xTgxMyum9=s5F?12z7NiZcDdPT+b!@PdJuIk5Inf?5nzoI z#)$&&@@MJ_d|hrHq%h!AkRly7VfvBc87Dpy6Y#)mD}gd{$9mX}a80C!g{R7eUX|8Y z#KK2%tG|(mymi|i7ya+>PdKMhG~Gb;W)xxf)8NZ z3qYliK&4;4N7AW=k8>P1HEff>162Cq>EX}%!RYAcvl2_}Of|=Tjef@RF9{sJGTPs90sA0JB zYZMHiz$GW95Z=l94g}kYV2T0^Cv0&Jz@?4oC9rAWc~Kjhd>FfCV!;qL{Vw9+*;(`@ zUZW~Eo%vHow=Iuz*$k~#z!fp+bX&ell6V-st&oE@nh2TXM{MEZlsb$ZR;>u&*pWhYhn1M;sH7Yi#c>)E=y(|Mlav$95WPP5>xUCUi;(TsBX>+&_Jkp5SE z##xPu7mpVn;w$qI|5V6)3vI8{C0%rP0hdbahD9C+?h_uLaGghOCmVxV7AP1;9FwLN zaZhpr#4VEf$$cb9Ah1WF1zN9UblWWA!){fi&#u91)P{^G~= zpX!dCDkA;(pG^X3+aVtw!D};I^HG2wwT+|2O$eGK2PEnhHYQmTM(A95ahKHM1)E-_ zPe2%yTzj^=C}op5QRGN2;F_P$NSa~LKkZ&S!zrI9a@K|u*#+DAC1@_EJlgsgu}(zJ zNF=ybhD|T>h_2zrI z+!TAHnQ=FpBJpwrn4+^;J>2zSKaQH(YPoRY=t*zq)AOa}o%{KX6H(zPiLEXUPm!pI zfX2KqVV5HrSIdcPU-^pj8z-}Ks#m*RZWGh7F#0tT@G_UlehQ7UCb{wDGQ^%|o)o1% zsC>OpO{JmC*v=%LsF>K8{3S5Q@r1h`D(NWXi)WR{2;1*kNG!FGZpO2ERv)5u&Go55 zxSyHWc-{`JrQ2UFvGKVbnv>4UiFd1L$n^Y?jev-4&CYp^xnGJh;r?VNWHf**B5L`h z*Mia{kdE7lv7=$iw<`)Nl~F^cUb0GGP(fwh9xYm3zRzXBdO!h5PY=*@W(N6*{GSC}~Z z+&(@tarA5HeOv(|t_dGXC_u4E7(4m@uoF8G+DN1>p#xiy$AylI|Ky=E9-;|S*P`6# zuS!+8q=}M$D?$#hMN$NIW6}l)yU%t>SdILplv;YOuHY+I!ms8{1`~RAQZ5HD{4B7T z23lXj%p!|a7mOG+HuOPbIzaksGci;mT4SPp0%&-;-_#KT0 zM-5^04T#H7{D_8RL2bafM(v%Jj|UBrd4L2W9GBnz;Wxgqv%9%v;2-4?s3k(F5dKI) zV8{q$h!5q`oTU*K?f?t`VHEU`5QWl#S5&@~rxjg*XEn`$hl%MR$W_W;>xZyE$Tq8T zvUZwQQ)(kcZRy%5Mg-5MH+0xAeMwuaKS0qUK8QvDTz$T$U_h>=n+6TOp;#u{^eNTg zTVqY$g3&~|16*rT-=%PDT;E>Xg3=0il>>ioA@r3YNitH``N`scyePo``%5?9 zCjP*6_%rR?5r3tJ_){YugFb&9B>AVhuW!(kd^A)Y&tLRE)ezJ9e83EY55oje|LRF0 z2mTZOEF=-hr9WQJgJOKY11JwS%_TJ|!jr_x5qd@v_y7RiA`m`^6WQ3lpCOG0gHgkW z$b#uB@*m$9&_o7ceK0bXvd{nG^xMVgb8SVujSR@oPX845p>~e|F}aIQd(i>O@zA3? zpZYOhWvkSW57Z7J^U=7j$MapiM#^h&)w_YLXz!iq40*NIaP8IJXAR>AuH5@hnk@f!G!Deo08Y13AWihi1+*h zNpYN2WlHBmp9gtW%kbfwl?rC16!F8aT;Ss`X7;A^?(^s?p8*X*M~(L6U`v#85{o-yOE}-56A(U6F0c*-xCvZXGVo?a%yv!} zc0+aYrJbytZDL`5tt39C>?z6pDF#y-17CzS9FU=;i{t=`Qwbi`hzJgtYh-CeIlkMD z@K|zz%CF>8MRz*DpWJ??VU2ktKIXGWXW(ylX04)$wnn};U0mB^s-@D2B2N7IY3Cv@ z#-zHGs0T+d@e<^V3OXI`O>jv8)EOAzpGO2sy1wL1KXYKn>m~zp5mAqM2c#ClyZC@y zM9rgqK$z8^PcpVwHvhWwFIQQ)po~XL3;~}ThK+w8u9ZW`4~fhg1brqh64q>P#e|Sk zwPm4nbw9`lYyEg+aPgy-p$i|cnxHBhY&uJV^$9~TksXm=w*%Lx1d*MeRm zX%PwR0F{+Q(w2>xToUe>s%ocW+ag_2!4c08?wEHZYLUc?uZwvVJ6_edUImG?ViW^K zIoZUSF1QH6OyD@oS0v~Nv%{m#KK<5d{!ASl^0Hj0RdIx`b;)Ij_7kDoTttxS@N7d+HN37)dr3CpcpCq zCw-!>cHbNkvE7hslq!)GEKy%TNLcrh{VyWvf`kWkEGR-wJ4kfUP4Th1VqX>nLY2q} zxLn;hOCu;oEt8-u&vPu1x?qR`-!wxN2A4ijSJ*cdoFNNXl^Bw59f=YTNs@qhPew=- zMaksX3E;cI)$2HI@bkA$i;vY6`-&9Hb@5e##$xoM@NG1hBeJa#rsr8y(m{U^!V>gB z*|gp|%^oQicZS}{+~HP);6~z?B0+IW4!SmRgArm@s0aAms{ycuICN2&)HgmHz_Z;a z*k(O`%m~k~l?v7b@wp?Zd|lus3!i1TX*AF>samy^MeQyMI?HW+$r#bj;CyFhIrQpZ@N@HLhpYi%1$QgjzXN*L*>gKSjF^ z{y0HVDppJ>GV-^ygc0tytabT^P2zb};|6^ICkg6Fe=S$5t7yGhX==!@W_BZk9KYR*$o5eioeFuv35tKwI;qR zHqta^<^JSlhcPrq>7X7#YiJ=#&=?T_v>LvDsfPx`NBj;6-3UxkBF20I7_>H`bO+$3 zOe1=ZNgXffp-Xy0hFA4yYBW>tNW3L_(vJyOkp3(pS%99$5b`M~&E=EP|AsM355!c) z;t6wnUr7S>!s7!UonRhWFm{fEk)&d$9@+awGS^~;7Z6jT=#p5#v|&2))N0m>kGwGN zUqi9LDNikSHIX9X9v(B23d3SbOBf?DYV_Rbc=(w4t1`fYo-#HH|5S4&`yt?`8Y<(l zh$1pQ2tuQy5gyV70@s-f#?}FIO$kJ&KUqCE4w>?5kw~-C>gzp7Rcm8&S7Eh7w57)q z!3M0W8%4LaT{XUG&>QP($S(+Q(3O|E%gE&w7a+L3;EKw!42sl9=1bCJ$1=uG*sk=& z$54GLkIJ4XNO^CdmWLh{`9jV&9c9Ne5(0`Sa<-ZkUCofqQg43>`W_r3f`q~oYDzZ@ z-Ryib!EUriI+fb6;`At}0m(Ma$;OjE)!XZd`m`UhWOw4& z$dlI3*g2mZH3YS%Z<{(Q4_REm)uv@PSF#=P;jN{=dT3b>ZTF#VE*wS4ugf5JA&gVH zhGq6C9iqB}4v!OdQ61jOHVft}r;K#JpKqYkX9xjAM2AXIqH1}=Am}C@_O%niuPj9} zI>zC#@-W0>NU?gC+f=xIwwEo9i5u-RiEoRX6&=L;rLGc9s}^Xc1#Mj4T)M4&4)T45 zOs74*VBBJ5<>-E;;pH7dwyfC54laowO3y8Y=*uSEjQdR$f7;Z?0nx6~YOULo7KTGe zZ8xIelSA(><SH?itEpzyIp<36dn&%1&cVRFPHK77rNWwxFLcY%9tiY!$56Wj|s1Cj*#U$ z^s}M)0`n5)(0W<)$w!ZbcxJABrd)Xe>$&1{r);BmX?a9fxhNf-9Xj?xcYD2}4E{M$ zTy^OOr>~XWwo+ZL0p&f581o3SLYt6spd2z`d2KLy;_>lPk}C|Mn*#Pbv*^o#^7CED zXMpk-5UI^JmWyNawG9?P??T$a`TJ8#^}@Q_2r?nc)I!(@^=*jnsLuw(rvP7=l+G;bRpgCso}XOV2=$zlGHZAeZtyvI_z%U z7*2&pOlxRD6&I16b4Evbw&n-y=N+3`!2SZd+j-wy9Jj9>97GGAa_w9MzGu|{(zbx_ zU6LfWNQwk|i{M>!2GPVyh-4K?;MpT1HJ%^7pLbkp;rmOknR!wC@09N+3YSGl4oN*A zW9WMLWf4q9n;g%%2|fzs8w6>j>(sMlfL607uN;W~DoBoV1ImGEiJC0&(Jt;f#JyUm zy5TwXZD`S+iK?!~XQGI|liNGgd zB}$>02e>z@9Jqo2rnqW~TxPfNA~PcWN=YTj8&XtP;WL6Y@*h!Il50MH&!L<2G5ML` zk7a0T0vJ&nCOZ5;NR8q!Y$`xwUdsO9^Ah;eJvf= z&-a~;{np05`)i%mx_kNtXcZtBLQ?{YiVDbUD|!xO_WHL{7R^4ulYD>OOWF=PiMB@^ zDr$C~i}@J@VJk_TAR$PIL=+BU^UpxisX5qe$L(Q{)4ca2Yi{M%i^rE0HS^Yc2AgfF z1*>ud(&Rp)iIy z=$Vr@XY1o4_g6dN_J!sF`6g{B$qrIP9vr}ir1Z6{m<(Tba^9xZQOLrZ#dttf1)XcH znm20Rby0hNz4*GA_u~4JXK@XG_4KE<*Ab-$V3saeCFCiUNy}{DOhJ{dgDg+Xb%kV1 z>Vdi|>MQEXq6&lC7g(IrqD3VEejo$jo=}70pi2a%OU4j74@y${NL_I+g~>=2=2+x` zA`L6KC1Vu0V-XJ*VRcR!ClvLkK$Eca19e3`+myIhwU=MDwH+rd(lszIAyk2@5Tfe2 zq1Pbx*K#1sd7-Z~mhxxH&AkdT7c@DPPepVbQ4qqAVe5m2a=gcgl6U1emrbbV?tSK! z``a6zESEwG|3x{ZP#nO6q#r*yfp@ZS%*cPQ9M{y5i?!83BEms;XhP+hq}n6$2{{f6 zCm{9)X{iSOc)u|o5>*EciYP8g3*890-4bEwkL49V{CNEp;dI5u=F;vRM4{!k#!C8I zMQV^cIagjC$5&)P`D9ER zk+4m!FRgz#!hx?ySH=dUs8590qo9KcC!q3t+7a^hJFu7_T~L=w@4#o+5k^C=bt<1FQu z;y;klTGfXTP+`sqBjkzDTuNWcdl9eZy(+*leboUu!PP*Ne)|zWgiT4rV*0ZuaEE9J zETh2_=n*4fE<6I686P9`$Ovb8+oQPm8wMeZvm{VdscngT_TiC_N~ogJ2y03PUyo%! zp)-jb%Bh>gea;%AGk`VFZFIjYh}3mvt3~YQ-)XH&0X#QKH1DDq&h< zczgi!P2ekCezcaU^eHN^S$48yyEi6%wMBZblkks}>Fn#bG|7 z=?Qs38Xc@Vh2(fkx_4N#5w(I-M8#yRbU3tZHoDVNR7&QPR{PY=(YwhyHmuNFMTz zhq5^?j2`bbt&V&2S)=Z&TETVHi`pV!ghZm*=J+{BaDBc`sj_eCPpM^=s3LC3iFUP! z<1bsJ_Hp2kM|Obox{H*b1F-EzA>n)Y-%#vK%qT)!)=dz8Av`8<><(h4K__gJG$kjL ze06cPRyHqW%ER3#TN#Duq7!HTN#i%|;4njzDtIKvno^`59XRsIwz zsndGrk&tCn@~ztXXLT)x#=fc6%x%RG6l6XZ_5Sh%rQbQb(^XTxMj^5m3!xp7S{LPF zQR^Zmr7QV+LQ=1hn}{q>NiLe7^LWZ3vZN$yyPiWZ3;BA%YS0Jv`G`=RFz`rdix6)P z>(304eO+v9B`HLjwXb91`&{H8zYHKcMNWn~SdtX#b{w{m6hW^JSQ5wuc`Blf{I=bV z>Ccv1^ia<%`f{-3e3z&hu;j+s%V!cBo9`(X2PbRWE5W9ppT2+b*Jlt6XxxR;-bYB+ z*o-09U5Noh?wp*3+<8f!6a_@hnwHDx=GgJfN?#13oOf_)A!wd9*R zlE*n+b8*nJerT}xo@(7(1iEZ@T#ko;2tsn%pvFbetcMGjd_{zhdNx?UQ-qOcR(O8u z&Ag*h3te7zz03<>{&5*+X>c!Y0FdmZlKZ&K=@1g?5lxEwu!|Ot<04fRJ1CU8CSmvr zPdlTOGQy_WI4}7JpDMf#yx5~8P&yI~!ts%yN3JvoCEKKclYFW%UNcZr^+0V=L66~j z73s(>2?5LyTodLCRs?8t5CvrCBgG&Qo<6XtE=oO6SJa;e$0MB~PN0RopFVrOtFvd1Z6-9}PbDca?SL91ksKaJmSk9;tCylrZgNmFIXk2iCgf{PcB)M|Y z=U0Ka`hohQVja_)5SdDvfHtyeT{&}FP(E#A(kEKEZI9+7A!@$ch`KKCYkMg4b=Vk49%++2fUE_f8ryTrs;j`y$`y$Fk9)&GU+x#=E}Xzp zsv^uH&&Ma+;QXKq!j=i`nRKYGiE?er_DLkb>U`^T?lS8t^iH`#WN0}6?gc4nq?Ot~ z+3OMAq-w+k74;N&@owbHp4o94%%d)%c>!yVtfQe0te?Nox+?v=T%`h9+yJ%P?+*?J zdnc-jW8%JKWfH}xLpSvZCMw?p^}5k()sbzBej`16gY2htq>rwEPZD^%JH8}H^N>7KXwF>a)m7w=%M}^< z#Cc9$@32YXxC>#`%S{V+DDDwFRROHvjun`sb5oiDXOvR+(zh!wJp|2bAztcm+ zT4t|Al{K+&Z?)QlUXWx&gbO1F%p+>E!OGm8x5&Ec{8_m=>om1qp+^W+0x}4MyP;!6QH`%6{Q9!vathUn0(%9SIi!nQCx34 zR>e69mpeqIuz@6#jvO&0t!7$;HUcl?qu}I`_EVgCq^>yXtqThhQdn5rI>@U6fdywU zF*MYYp7>Z5f)ml1aA1|ge)%L&I!qeg*4-W<$?b`ttAR)?Bt=@WH@eJ5sSPFxA9SiF0T z9>GGS;$U;`pdacX6M+a0+`%r^lHXzc-#VRow(bQ#DxU)iS0Au+M5sW$Eo_k>gv&w$ z%Z9hL$!Zn2xa>Nl)I_sU`c|DuXBSlW>X(x!?I_<3p}BC$CtndAg-yqH1mh*NEOcc3 zBnmv$>FE=7g}q7OIvMQB0=2%67)y+yz-(%RTr+!p+xHt04N5q|z&@2hHvMqjEB@ku z?UZb)?5j$=bof|pYgGfSONwJhV5E+Sy5h~m3XB>5Ac!3DI3Qwdsh7@ETwOI@Iylni zW;aqeu8B^DSSONs%aiE^TtyYks2ll85ko&vSJcb>lT>IXp;i_F0l4Jp{8j)-k3h{9 zr)}F}VL2GIY6YcF)D|Y*S~X?ZTpTY!2*wlIH@Vj_pc3pUAHiGnY=~=Xt0U%R{X|`1 z-%A6CD+5a6=Lp&?I303n5DB_M`miBHc_u=UBJQNKYu7zq_nJ5VMyJyhBk-UnJ1)yM zAv+949{KzbD55XmEd;26qD13cvE#$0Fx9p>{cznYUK$1Z+<{BylLablbUe}W!MwtL zwb@GJj_H!O)MGuVokcxRSJbQMfjo-!mY1~18HP$Giq3$Q*yPy2i2O15zOO8zNUPA~ z&(sz8hAyyys|v9M)%cF%C+K8j6vz$(&57-b40a8+_-?n|>a@E$8(HS?Si&bLE21;9OWSDP|MSWh+nuOdKx(1+(PP9wkFkWSMN?OqzB8 zV=|`SLh`mT9$e4@nK?)dIT8CC6O-BXRHDv*l%Sx1#PGrqp3R4M1s@Jx0KI$MkB)PJq^s81$EVwCg3#-kG! z%7|!M7EJ2YA2mchgKZE;B-W;qm1#hxKvcA$H6HX2po+|Kc0pcn{?g6j;V5 z2l4yw074Fii^IL(dZ%;4(Eok+=V&va;*iaKN;b>U$ojspZ)xu4^#w( zL`UG`#s`eQF|VEcVOc3(ts za#n%Lh@A|M`#6eA1x*S$LgoWc@4!IlTC}chOJY8BXQ;;~Kjq~j<{_P>hb|LI;e)Ia zl8{_=w2)pzdZa%X=gHf|^FLMu0LGIEshrUZS)anO`QVDWG##IGu$rpm?2l|B6=%%P z{^ocv{`u15xDUx<1G#DAfobUvZy0r7nlr!5zR-nbPv40T9>?sYKBXVW*>AY_j3iR1 zm()zx_l~lfVo&V#`Us*QEtu@ArZa*6(iJd0=e7P{HhY z954RK9s+26Z3im(IVdm@YN^mx9#P^5*@um4@Xl7{C9WZjew$QW68C5!gBGW;vy$ zH2GK%St9rWqCqSjm8V`NVE~aLU)Zv4)MiAr{^l67P(?RMu#}i>kct8xOz9We$vPPR z)8GBuk)hdC3%~yzvpf~Vi3YS*-T)nG%&x%(yU*Jusw|lvQbACh_$)`iwEIHpm1weDEgm*(9$RGqtx|*hHW>2Y}qVJQj z(&)n>$GJ!*;l)-qs?zRBi8-o5d?){_32+?$5=#b82*QvQyJQIQ?eO?e>PCj+$+jbf zs@(1nmqEe%Q(%P3%Ve_P?ZWNzoKGB0Hi}gmbT~f0lnn^wz8=b1;k5IYq z#|Nc{(!J2oIFx}bMEEG>XK7kcVed^xusnOD(?`aA8$&H4h^)|JuN-iLd6OJbMR7@k~@Pl@V47ujk^@Zv=Q7sd` z9QMXR=`dQJJRy@QEh$y}8pWcX1(8w3=n0K1m0x4$Ot-ydHme(m^k-(%xw|3T1RYdt z230y>2KV8z-GUAk3+47S8b*)LizZI7YE zbkRCx*~{S84P-N8$B`|*xL2|Pz!FVu5|-eI6|K&ZTmVkG6~=8>F_1JSHk?m#9W=2{-W!SZc@nIm`Rgoyv2P~~sLnVuZ-PbQnV>!@dE>c;h zSnmTDr3Kd{iKI-p9;@({Y!q_(8kT3=&IXNbT*zlatsYM;1a&CV^Dt4j(@c7Q^5Wq; znb|bCDVR45#D@99bGRxy-y-rF(y<5cztbOR>%lnQ3*X5z z3Qp>Csk*+`^s&y=mE!lmqw~|zQ5(4KR18NURx^D_4da^jyPn9)xL)^iGiU0qVc9HL zO*9vit+cf-X&XhXFG84DvC3HS_n2DTpX4CG+Cz#Hdq>W$bb)5ace=`${L2Fv)8Y7r z@X=FKLkT@*zZ4cM2Q>RI%Mj}la=h$|vUHc#)Z5gy4q0a|xiwCk#>VPr(6Uf#zI5vr*$(Qa6f=*m+iwFnD2V&@ou@xK7(nc|V(^)TRSWBf`D zoS3lXJu%-rvyg}E=Ec4ks?9CE$g#OyYOusI2iP-q2w__N4C7b_!(84TmsUwKEMr$> zd^H@UwQ!{^A{aXo4~krw1mhVgkl_*lgEBN8wjS;j0IrAZ^!Crd?Cv`2q$d~K)Apt**8}i3jQ3W(%zNtr<0M*KiU+PrePd?d6lX78os<2mrj)xFxH0rL7tEd?#wzR ztI}oGntw&vHy8?kGeOjO?7S@-*&CoN8tOgdlR`!Q!5( z!@{Gq4pT1E{G^*4B~Jw~%oy=^>Trik4EcG@$@^HK2<$k$TJkkhcO2Jw#J+NOS)tya z@Bhh1FYo{9M{nlwsX>dJH4z*w=t5AoBACUV2Ybi~5nBkmVc?pIS^T33pp!bYC*YHW zs{Uxb3IuC>U+|B*sMU{KiItavEt7x&q=2>I+0Lkkz zs$g&aEle!JyCtoLz_5sahFDCO&r`=Y?+Hd zzFr6AW9VAvgfP#yZmJ>7e?6I~Dg6A=Cq~0qXTYQ{MTuKZeVw2uMVzVRYG+S~CcLF=H9kb<|NxPdx;eMG> z&HF*t+L^>jc6UunvX-^l3s5U3oypd= zH}nq+6XG?3Ct1(d=cno4?0ia;L(A>SnrzN_cx07)4Xb$!JTLO3fAQPj;yz*fSrji5 z8ZJBfJKVr*_T!Vk{oCxRVzm0Ty?Brn;%A*qiYK&IWM-efLfQp{4bpF32gMp=03OO$ z*OrE%9EEp|gY5g)h>C#&1A%(+^na`4qfi+UP|+L|`s|Q@3iE-?G>W~#p*3;Pssl)6 z4AX8rHYoY!Q9Ka-g4(V!-|vl-g(9bfE-B-($rmy*`jzPsIndd7CM+|$EcM$-sj8i~W^$$`=>c|3~b`IA8Z3a()HXy&wB{ZZOWx8uQ% zmaZNd+p9af#?sbWK1wjmQ7?pyPp}R_qixcA2ErRppeVOnzGblv&KV`l__HFxzc*El z3yoE6p#J}y?NUPagC#PuidI9%dz3`>N9|lW9w(3J+raaW3e`>2f)V8YjV4OS@TlL|_;NgVI*1Sbf9Y>sWI>tGZeD1L$ z*8C@@(HCv-EQF)SpYQ)Cr!N&V%_pvH!R&`9--g-WLbkNgh1%cX=Ipnu7Skg*Zz7QU zKqkWLYPqU+sMV@pbAjbqs{rudXG1<^2cB(0W_R8%+>F${I`>e+qSwpxHP)vRcF8tQ ztJ9K{#)STp+*dZvKmy`O%^2y5)>ey#K$ZTK%Kb*A*cc;;{5{^ouI#Dj6>ruxDoi4#|Zxx>^M~r9`UObP!%l$3Z|6AK_Dv{IpTrRVAj{#L=Is=I-G3teTXQynsp zx5!CPm}TOjEa1A9)%9&V<|6XeY5BprqQCoThP>fQ6y!~nAD~Sj;Z}s2N#tvrcvWH_ z2{^LI&YqxQ8@5&8Qq9wKFL@nSxMJ_B!oxO~ynt>|`M;63kPQJ%hmf>9h_9Ooouj7W zOC@z2|y&UlVvFp%!G(~ zsBWA5L7=WrFq(=}sxP4KRo~WOOxeuEf^`V@^(9b|JXJE=15zTP?#JvzpTcQ}o^PoD zvdWWng=ZOg3Z(-3Vn}s~`U_b`p#(5u7zbfjkZU$^)~L=Vo^K*`#s6vPHwto) zyRC$2sNS+I(~k+6CDVfFVsvQ)x&sk97OvAV5lJ98Sl)GJIdw07m8}PwuAW(Km%Xz~ zfMAG>GqNDWb(+WvVM>x}jhWolvLN|0j5t9lL06*96*4zSdiGZJ?dT7={ffVgo{qq6SeO z(3|^vDvhON`B8H~4UXiB=L~`&M5_AUsKHt^Nl+vk^$$Nj{nJXI-IT*oyC5eKb((H6 z6^i%H2RcS(h)Y7(i3kN|P3+_y3`jz$)IF!OM zQ?iLP;w~#2dWXos_~)`& zD_PD0-4^2iRwOfla;nQlH3?zQTMgL<`3j-~m9Te#YW9q7={G^l(#>2oFOYwKJ(`9& z#Qj{Nqw#%fcC{YIEZPiHrtpL7nL#6wsS(|<|EzDV1&wlsP)yEa#hs8HMD+5F>jKb8 zb98j_v)-PaV-+z;JU!c>9;&|lH9PduuX78OX+}q;1jdC69s%f=`W@ug7?j9U^TW41}-QTwNXSqopXpDS80o z{NHn~N#pvR#vPK+AUGJ_Fg6<4xJLHx=Vksri2WlD5ZwdW*?|;-e5j1^bRMhg&GWS< zWyryd9e3)^|9rM?#*TYl>!x?y8^%&&X+-SNvp#jRah0H~rHh)jeIomY43^wi33YtQ&JU+1_b zNdJ@O2JJ?ZhQmfF2=zHci-s@vwG@+;1YcZSjO(8?K9Ov1a^OM+2X*T8NdVRm$|qR$ zv%Y<8WP)0>TbfjgTT%paiPFvk>r-(V-6e%9-PI3o5xLERg3d>FFA+pSL_s-jNZz93 zMXmiP9dF0EN(U?k*5djf{gM~n<@l^#F%@@}OIzFX-a)}9aR(tbt zC`KSj49_1B!}IMIF+49~cwWTt5NA=y@$%Kh@MM+{V5WAv=DuAVEB={YU8CS{zS<0i z*M&-Dp`_l1G9)|(-wWIza9RPBt!@h`TZfbdFkCVo_;V4%lP6|BH-?Aw00b$K<^}pr zt7Auj+d|)pGyz2R5ayNVl&cNgad%C7(IVWWeP-a!e|K44U#e_)X7o;KEI%cSAtm{L zh0#0ku&sve?%LL(_(P^dIUVcF{SbdzT5xRWnH`5@jg<{6kJX~p@GDbh_!N*)Y{b_7_B&+Dc;cLevV(60D ztLs2;v)KRRki?|WhqIF|FG6c1W<|V+cv76>e|h>{3Gg^D3Q_#W{{G3YKNt4)j0l^I zmq)S}sMDIdUk-SRW0InIk)&~OQ5*0`qU1S}f6We@I0_O{7{NBK3wTP)c1RDRc>8k) zJk7^u)9tayCLBjwxp

yHrdx{^?mnzB4nlY~(u|X%hba{spPaOQnWslsU0u zq^8)i;WHpI=*0N=LIt=wQTj*v|BAyi2z5&DkRCx!bvX#(-M-gd9A z_{}&6At#B>=@%$L7V?`Z_4i7<4xvP?vnm36!@=S94*x|a_SQ$DKPO-1JM?C7gm@>H zkY5%7UQJpMXA#}ZN7YS0NiJ@J3Q_T4Q3Pp48$eyJ2>(hj1ytb5UEj=9f1uF4z=`PO~JDm6~y?8j?A&%NB9n405G0#Ya+1A(uwhj|@a2K5({=row&#R-zWs&0XJol| zSOQ+tuqwPmXn$5kl$wQA7ix#jwOiL+cpTcH$JXRL)eb!{!~)PzwMj{DAa#kIdsvxv zMhP}ol^xP+7zRY>1K&xrQ8MhsS$Y+=ezT-!bh_34lTi&z43gGjnk}hHYqI5Jy!6 z#i}4Kka%#`#?{a1W@ZW!ROPX!wF7HSpN_ACxZ?jZ^Vl~r;qhTXq21x;Nf)+ZV3QZ~K^>i#0*E?< zzp$gr6KZV4oGJpd4uKVn0+oPvePimZ=T0K3rdQ#Zs*9XJxs9(6jX(-{%@mJRBiR024!?nci zSx)rM$vj5|DF>y+QUA-J%x(zZ#({JiMUb!j zZj8lE61b*#1}%VVYfYaHu3av2J}q2ZE%Qf(Ym567%Fhy3Pm{}@7OqWDlI;dSBwn5{ zDY+K|C_veE60oV%On~1P!?m@}t_IgGI~k{gYbT?!GM{uBdMob_h++x2c5>NrGFF6Z zQ-n6n2yG|VizH)%UmNypFnvJ}?Jfp7Nq*u23F+%9aP6`)aXPqmG9-@**A`Qu#eGkN zYbVz&r(zYjHbJK@kB~4&;FJ`GMHN3fF<5RzS)6rkOaW3x`S^`WI=VbuyX-8S4z8Vy zhMI+C;o7HGPhyb$aOeNJd3a`4Px9=<_&M6SC`D6qLH!`&t*mdWYog{BdOTUHR!DyR z=3i~LJ|+u&4V*;ObN|h>dan4>4ssl8j|RiL?L$JMZz%CrTUpPtr7|| z#MKc5PjSJ{T1QC5;(u$J_?Zvr?oKomXKHOKg=cY{(OKi7UPo;w;@JEtWYyLst~KchTE2I6H>3-b@slwXwIwyi+6BE0hqfgu zO#0^KS~vgd)-~bSl0g}90SLIt$ezC)LbaWm6zrOJc~)`umV3UazFE4r+)~qabg{f= z!Rz1{qZ_q$o2wLm6;&uaW3{=t`eDqcWagw(+S*pLd7;csD8Pkglp34O;<2mof<>Pl5;TaxdG95xh?=yzjm(iE_u(!)dRqSOo zN@BN*`j#5%d~gWARTj@^V{Pr7sI>$5_wL0h;l9}w-bp()%^Sb$kKE41%O?!mMmY|} ze2(7fM3+~%(q4Q-w!eRWnJe+I6|D5um0~uEJizHL?myTb8h7u1{>x=94!;+lc$uov z*8@?1^f4*RIIpvMrlJIV38%Q!v+Cdxz|w`}~^4QFa=~be1)) z@GP6!k9ppYcqEhE!<3a%ey?P&5A+7ADd*L1%ZrNKIbL~%RC2l2vIn}c@>3+9(_NTGgdr@4P*JiMq5QHbIE{PbdwCJI45pW2ixnTN)LALPgqCRsooGopj24Y_t^yB<=mrj3sUqF)hOLrw|ieR;66 zRX!oItF-6d(i66D^&%-Zs8H==NvLha&@N@DKsCv0q+ff@Q~Y=qP^iY^)~->3`EFQByF&VtlIsQq}cLCfz# zymufG`QksE`xcB%Fb^+H;%c}F}sYH&jnjo~2mZ4dE21F<1) zw$PGarsGpMG*yM8dn489H4S zP>7c#)KGlh(H%};bnOL@H}>2Ag->0j4wMY&+YtoH+TN~o3%sl zjx#>(dRZ1B|5_~|R@7rELVOo%=sRwLyiHs)z8KW2Ds( zyg{6o9tI?0z{t6C6FJwwLi_-q8f*h5-wu7$cifGA3` z8pl}@6;^q=F8~Dq4uVUKjz)k?8ZpWqAm{+XKkLmm%=SQm)P+D(<@Q>A02sg`4M7xu z#$jK8i7Z8`0fYfl@`DC!&alnewv6a+zN znMC&LgM$`N3UV8w2O+SN;Op&oI`QRq;$f?E`8;4CuY(qugG`RZI3Wn0f^db5PcbVp z3aT}FsxDAWjf@&|vqx$``ngpM;3vfZ%9(noQZD&$u-CFWj@hxz3N%@J3YwffX!5r@ z?70Et70L`Mfb5_D@qezPfBg8mUT&>h#l-TXpB2kZP)D`g1cAJ&mYX!Bo;V(^GlyE7 ztc%fo5c?@|VisCRSbk!B>Okf5(-bnF<+>D+nK2NH!wI?T2PDBM*^b-*ipcLkLH5#6 zOLG6nHufLz<|ty?8K}iHOxLha54Fs-|G1!*SJW<0^8}BI8+x^bG~NT#ILICx2oLU^ z@`Sn+4{oZ^c(<~J{94trcDMgm2DTuZ=pZ8>VUg}|5=*IVjnljfWzXyeIg)P(^OaB4 z0*>BOuw@w=`?*sNwrKVOK}*X_K=ivYCHN+`PWa+cP-t^Jj;K9@z~-BAoi(+v>C@2) zmpdIkD%eu(DXW7mjrZ%4E?5CLxjkhV@jE}T#RsmZqhtRScq#~UF*upd! zgq(m0QNpg4*%?kKHLzu2hnJ@zE;}oa2DZ%1%Cca~b3``^6~GE64lo)65=7ku(MCWP zQCm%8GlIS*qU_3>L4RQy5GYWFm{?e1DcxQkby4Z`q1wZKb{+5<_~@zOAx;#8QHbih zBE7vd`Bqb-YiTCzCUJaF&1N1QGVwfg(;V<3M5hE6KZL(7o@pM&?OD#2M;Utkdrb|W zgUO>oARLu*MCl{L6ZZ~m6anHwO2Bgm;5z4M4lp837T;)U>}xd?Ky|Zgkv;BmyJ*8e z0OzmxQ3&43wj3dQAL0t4Agie_HZ^@t0#wyz?qSDc0hyTO;Q>lu(Z)8l46$h^{J4u_ z9H=Gz)Zb`o>_z!iIYVw@#-0@*)@tJ^;U?(ok`tC9c;9pr+qDDn5xp>;e5t9)7j%@Y zdKf!tp8E)tp#2G)#>tKI0)Ex>5Ox1J%w1n0OVxLp8hi;RQv&Ubq!e%(j(Ld-I>%`c zl*G+58c(oRVYyj4S7L#=Q!sW!n^Z2OIih0QweZ z0#EIuPs(RO8gzf)gx=3$fU&IIYP~NcT+ILyOsdq3MGUrK41{^G-iilG19n|=eEP|O z>Qe%dbp#qU%!Cx#APobMKK``8a+VtmyS;kOu8M%Mhu?(#AM^Vl`KZK;I zlwReRQ%&pf%Ayg2JYaAlC`mM5Gzu&yaHV{!xEKsz0Kh>j<#LF^>Rz+^t4WJ?j|4vy z2h=~<`PNULl9?U@nd#C;vI&$R8>_C|1X^2q6M&OfYyxLoL2Gv-Bxo=kB(?0grsV|C zH7I_wauia?=0x(6h+@lkpfK5lx=8lhJ|(v)8*rAoC93dyKxG;R!=Yi{`{hpA=V^Qm zl^+p4w9DVFOl6vDe-2;cHDDSTKNfJ<%W6A;PCXPH>?xJ$c!|Ms)Si3=Y=-%nMG357 zr8f3qwu?1)hC91>4+o&m2|`(A@1CM-4|nciNqu4bygHXF;;KG2)BxebXy@n`4<+XL zuWs)A{moedX?2LgK~uajzd!yqRVQ*#P;!=&LsEM`+9m?|hw-@&Z+~>-;m*J1%A9z~ z3Lqrsk{Pu)_PRDF>288YNtC*A7RRui%zA)2e|Rgd`>XNGf>L*O4)%5*?r0x{pJy?7 z5xMHW|Mkv)7{9UHIdlQec0;glG&b+wzi+ksM~M>Yl=DqTlHnbZWQUzwyY;ER%#FkU zc$0zskH2_$Nk^0DlNIj~6$c~|h*7)=DFT-kH?iP-rIAk+XO^dNU?S(>Loc*g_|L0*3In*78Z!D7g!;QZRvi~*PHtMVljg{z@tpl4zjLcqj$>K z5Z*^vkQ$NW=bjfqBo+!DA!GHW=_ZefovbWLEojDuC8c`=ir8m%&6KP>3Zy=40CHzV zM3}|&0R>hYw8G6SB4CgZu?2rc7l;<8Ni=# z9PLrtMp@YQFxnfnE`7Rn?c<-kEoFayL|(iv1lRWtN9o{mdCJRDKVG`9hn(BCwc$by zz&OI{x*;Q=11Da{mSKmtEpx*PH$1OxTc#&?`-Sn}7L!+$kr=xa)b)uP3;{YYh~Q70 zr;TBhV54Bfy=Y|g`bN2!MhAm^LaZZx&0)CW*+V|SAj}AW0tmBT|Lp%O1Fj-DrK2Tk z_=bIs?TQ+DNU0$8Qd~gN9Ln~_XvlYp3&73QRv@|} zsh?5fLDaW17^F zH^Us>&)^61U%o~6i`ixVTiL-*9}@8%ejtbYj2=Z7dS+>vKdFMdsk>m3OugsxJ2lo%!uzor}-n!C3k9yGAi-`V*9f@;UFAFM7ENjDY+rA~C%ZZgH%iZ8? zrAcy2FW8Uuifi2{HX11=D|Q4N_?9g2_1eUhbx7-KwaJzPQgz00 zT{r4_aULXjlDV+YUCYeb;%%TnY_M%7h(kP;aSqPHFz+T7EDIR<5nM@N$4D&tiWuc_ z#&zFd7daThw_+>R$Vz$DwHOLkbhtT4IcIJB;^FuOaHb9Hw@W6$8kJW4gI?a#vC}z_ zR;&DSEv$PDf(w=8yb+z-(tty?c=@rHc7bjV)k#jS@LUG!UN&FXLi*w4j7Euiq>gC1 zx9LFYc{{55xMQ`=PSy0@AeFxH-rN|^_Cf5C$`5{xy-(hjlN)_eZq!6|x9rMvkoeu3 z3d&Y-JagsYD1n_K;>Mal_x zHEJlk2*O2rz@y#b-9$V41GanW$z>lZYdU4iYL|ESVtejlr9 zUaPQyJ3Bn&@~(wkg)G0`g=&*NIdNTXE%kI%A?l1Qe?-w*&<&_Fz#bKo@fl25>nAN@q`2G)sgJnnvJr-sySuWI@$$W{%Q%DVFVu|#- z6eC%6GDgF>Gwg!g?EH!*RUr6e-UaZW z{Z@HtYE#iXpbQq_3bhmIE7LfXCdpZXRB}iO5a+hww8Ih1ZIgT%*=ISV9NSLQh5x9y z@FW=27c>JWa_|p^-z*Qc4;wwCuoE+fG_p;Xx2n$SHh#b9LKpOb%@86zXKV4XV_em+ zS`k`g8B}+KuTUQMA)2j|YCr((=IVV|BK6!znvm3A$Kf#RdNwxDq`I>(Moo!Wa#f1_OYhtq z#DnzcGO_K=Lb8Tk$p=5aZ6jIZ@&a$OcTy2l#<2?dwYs-+Af1|5s`$! za3l&aWZ}pr5v$VtfwAA)<=^aObn*4i{v$Hu@9d*#Kql_piyw^!H>DJQ_agD*(QfuG ztqie5MCIn-V6e9lw7vaV56@;e)*jdv10M1w{oH=V}y0$M$5AK0`U$% z$fG@o-W#opTiNy?YkhkCBH>9S8A)Qd{6}wHzOE8~0RjmU7>-B>MlIKTvpPmdAe(a% z*j=OGdzhjIpu?c3WjWsT$3&w>eY915lw8>~Eqz@j&u)|GTvHL|!C-J#Lf~G%Ke)%@ zK_x*Imy-}AwFlJ!y%>oLB|QJ_Z{F!$zN!Yabp=}f5wQe17ro2tYn*+MQrK@HydnAw z)PD|oqTEBYhb{z5QU_p!$?`F2P&8VYBz5A^RR3%Z!IXpSKJgtT0ud4-^0^c>1{nM@ z43?>XoFS^AVnF)T>#xbc{qsNmuf&9tuM1kIGlxapfFuoxua%YsDbyaQ1}8L?OeMWa zzxFt@DaQXAy(Ua$t?I-hXSU*Y_A(S&h+pK|bZ10Yx5=JzD%5v3qL4t{>vqPdNgc&n z)MwDB0O(zgwzr2O@sY`ZNmamae?!ajU8Ywudprfmk?tT1vnEkKAvd3P*U>nVbEf5~ zKlQ*#s7xS}sgMJStyR9U{3%&giJAol$V5*;FcgW&`-6k(&@ZvMJd%0F0e+}(ms{_2 zDx z>r)Nt6?MV_(yOet?B2S3>-zP#<TY)+f!hb^e z*T489*52-5xbb~9>JO~<-?}`47ND@9R>YcMwY5I_=zS@KA%TCuhRTjfx_1Z+g+j?k z)X?-K0&Kni%fsHih!?=YNLCN4^GJOOgVwGljri@h4uzk|rq0hEj$bLTX2H}x5O(eO)uL`v5afZRvL0qnyqao)A~ft5 zzqb%u1!7I(U}hpbZEU&3FOUQ+`!kTZZRDwAbyG8rouD$$teTj{!Ca`d8F-mtMN}`i zmJ}{Pure&r15_et!mXNEh=aX7v$bz3tv6+`+4?XViqkw##NjXjl~eJu;3r=xWt+K} zx@)oBk}J{5Hs_S8PYLk(iTL)qIfzsU=L2dQ1ZOE0iQ*jX>Mr{*FQrNWVy^8_FiIlr z3gCNLnr9L2R#cDW(1Zm@+}|CyK`QkcyR2<2_sP*&ZIlmp!1v_wsIzV6MnFc_hL_Pa zx>guafosCPC({CV#0RAa0ghk>+OCyBD$ny1MmLZuiB(E*mL2ZKBB@`0iNoFDeaAs; z)Y0`$OOJi^WIwmL^|Ol1|37>0+9TI>=KE-TjpqN zN25BnY>^)B?tQ) z()IVF*|g{&bn>D8?UOJF`RKNq|78mq^@_gzC{JkY1UX4C(eO#&YU0m@ zwNu3?VFzg*Lo)|BM(>?EXr7sLRn}f>C^$or;z%1-+BR*bbHrU>8~z9^^PzLfQ`D8#GhE^h!g_ zBVEP4hKm>|%RX>7oWvpgl^hzq6_Gs$=19h>M}vxu6}1tOKCwMQocM9aPjwag3huRG zUwgQ5E(0W%6p@h)2rZ1jQi8~XeB=;62)&s2wCZj1Ojm&?#cC!tVT~J4`XBtMl1vtb z8#}J|sf{D)yf1vyY!Tn0~aY_*b>>O!sP8C4MH^QNaYEtwJOn7jh=aY$!PN z3rqn8M;bpgS>(gOYgNEcg9MS%qCzp07833tF+DdF=sUJu5tCqVJ+2%3^{)tkpY46! zA7m*RY2G||w^3)$ha;UhoEz%y?q=CWY)R8CClpV&#M7gtB#M1eBx|THvtNU%rtj_1 zc3~xg=mK+vm%7}sMmQ`-c%?>?~BDnku#9{Xi!S*2@1(D6x z&>*D(ufZcJ-{D+VE>r*Tav*A8mMJGLfT7t}lF7ZlF8DOwCe}RcmZp(7om(I*?Urv3 zf^Mqx56*t^VhcPAe=Vie9GJNsuG=Ax;<-iaSpmOPNi&_ITqon&nO7AhI522TA5ukP z5ctP{QB+9k;ui(4R_@-B9u*xN01LaL4|}zZOAJC>-{rc}*AZBh%&1&Bn8mUJA~$y4 zn3w5WKkuU)F}Lb=_Ta}A852%=uSS(&dzqIq=-W!cUAGp;KOnfxehCmm;r(i#eJzsH zu#!4@Wet9fQgUZ9i%d_wB-e306kIQ4ry>`hlwS<~wZ$0sjzyq-?GXr{<` zE^0ye%L>BB>%*mg{>T6I#0g`O0&GIdyFfIE)wV{6a+6#Iyg>@3NlI$k%sT~QYHBYa zx1m}XOc=E;R6}G@wU!T&&u!^AJw;8&GgZkhkTTXfSW7!K&8-7QNMk`5rC z#Y_M<%KBu|qn|w-tm_ArFcus6AQf+P+dbMYQW_$dRRU-=g0{71_Xpbue#>%HZ^a?L z)H^>GwL*9mcAXw;oVCn&g+e80A;RqD{q5}+c`H53@Z++*s19isNWF&4bGqJYB~>!Y zdO{(tMPOBefB1rH@$mtBM6yQKK?U&5FF!q}G| z*%gR1$kv-K}$hv!5AL zY60LZX*fp98?ZjbfuJz7^&9V`ot}I2_`(%0SPG#e$5izw&;3H}o%Y=SY7O=-8Ce5=qp5NW40{6aHy2gdP7P~w+KYes z(AN~pGsRE1*X0FBD@3RcnjV|EXsqzgPDa=3EmRI ziz40OqT)-s36~TUu(MmfzuBTA$WkB%@6Y$QnA>5Fzx(o`E2v|~I=+I~Y;)4k+Jc zP(bv$VTp(7(2*hC!SP}ii;hdDySz~aU$|$EuO8MtFl-SIvSyAW9+nalB`G_qh(#dC zmjZWkgl2mriQ3cB1}%Y4`Or~`B&pEi;$e%9NvC+&eXf-wwZk_4{omf(_z(Q^A2W(*PRMMcL%8V+@?jPZv;8r#c$LJP6AOzM zrY`ViQ40}u?@1P~ovZ|jfTIaUs3aDr4&Ddui7OwMB_snd&>#`lhg>|ufPWo$`$hsTkzxw63~$t6Ev5gfbleu=1^pB zYQNE{eshN#*$^-#Vdscqnz}9ZKEYNMI}<-C4&9oHE5)7_>Ezv>b5;Yx1i#w2Q8n+C zf*M}KMt@tXp-ZXVj*@^BHv*JVUeJDvAY&DhU)q9Si-L?x4%-*64|?0mps&3|D0S~h zCQ$7&65Vda0>D7V1&awT|C^5x>prYvmR6Bi!rs5*`PcUW=d%9*~}!OB`W>^>KsP5c-1Af ztMY!f%9iA*W5<+q{@%9Cp$h+Dt1svXaf#M05LqQS#?6$|CF^PcVwVQ!9;ASFe+fR4 zlya<5nPCNq^)%^SPwC!(EOPXEGnMg7vO*|By!qf))ku*k7w2X32B{WqJZ6lbym;PnJquYPPQPZHF2<#EX~&ZW#&(|przwOHM=l2KPp9P5%e zD3vdQI*U+O9Ri_W@s2eUO-Pe!&eLS`R$Rs66_pWJT*_v<*_FJ3I53&hVA=7?QW1nQ z_T=}hTo$qT`U@79cpIhFGc$tTZz!9(Is8=GqkZ2^723@RW)%h98faK*y$<328tQ;@bxC%ytK8|DsljwA+u8L=F<;JIn(>Ip6X2#bREVAN=qq#r`x@$ zow@Dyv&FZz2sP}6ug1Q9UhHkWZAW@TcC+DtslsMJicxu0 zch$_k&DVMhM(to?m%vjjF)TIDbW~^N5qzgQ=wQ?XWrx<=zuJst*OqfYb-(n7+Bams z)fyHZU4D^ZC>&!sLpj#i1l!%H4@#Z3RnpGlsHdeW{j>7D&nyT^5#-@n7E?1V#(RMj z-!NKCoy>Ua*+T&`btk7nJ+Y)@QNxpkTJOQ#eN7>{rKaKZh-&0g@6*z#O-#;Xz{(ry z&CPx+Z993QEi)l0=4$$*bTF;djrb);)CZa~XLau$ctJMnXvkR_7i7N)pcI2F4+siyht%PHx%T$g}Q!>QVf8Oa8TRfOdXy} zG3*|$zh}^?%JDrv^Tu;21`)q{Fe!%0hW`z}9(bV8z+)17WKhH5g4=n8e*}+wvn$N; z$3GS+hFP;eMmr2=l96JtLoZ2|ZsV?LNihUyA0r{^AZ9MP`b052jnN^4UXzqa$^*m3 zbI^Ezz$q(*Feh2@ly))@LPuPQ4O08)9UU2k#k?hRoY`XnM3;=hxRp~f3O}s*{hJm% zUeP40$@d6)hbRg}76C>a$2md& zs>A(=*%_nW7!W51qMMM=0R1S7U{nHB6NMLFiBOCm>MT+l3%aggXF=nVB$6dgbP&fp z=-dEd7|`o>f$mK1D!SvV%|nw#K0G~$DynRPHBRcWv3lt2XBjLXz{5D7fw3ZYd>=sC zE8j?3v_TDCK<`lgb{-qzqpjU^;}1fs9P1s@lWuau308b`B3$$iV_&lM8uTnO5~6p= zcWA{2OOi-H_swr8OL8Ly{0nJQ=B;=nQ7#0EWNDbEqU_Z&CLox~U3{vy0d&JT78mM& zsl*HgFH;x7pR8{v1bsolGo4ddQ7NPcWC<7yehlD_afV}qclm?;YLv|jyY{H;s_RS)%84gbsb z`kPSxrD5aOC>OSrK+eh9{%;kHC$ZH)L4g@j7meks@xSAiwJ~YR`y-xB;8W{;^chrZ z%AeI|o8dCiWZbD>=R~n&9?ccE=)jM1wVHS)c+>Vq&rVHVW+1_^0;_ zXhGIHg3PM)VtJ<2F4z_^8(H+6Pki1l>uz+3dC_X}!D zy_5uR6#{NCSU|{r$dkn6TJpHBlR^vZjHtu4O!V0SiIiI6!Q0^YRltyqZ5ag7Un;DK zmeRj|{*x(w^Smv$vIOtlaLFi(+FE$FD5T*-@cF6IOOWnhO<#ZqG;W&UL(tV^p z3|iFjeZ=xnO@w@DS5_4jI18MD^r7r(hm8SuC+?Sv1C|!ukU9ZN$6E(S;*{!C60g@c zc}q+)eQg!8Srg;x{Qc!!fA6 zD2!ZMgqupaH_Rhl#l0f7xTHnE*W)^5(!hwYoZO>4c1Uv2LDP)`j;%aIHvs|x6>XmB zD)59V5Y;BsJQVYqlj@Nhwe?F^CMuX%%X|sx(YruE_gc41&X*N zfW%i<1xWV#$f~l*;~R-kI4MKYN4s*SA~rgwh_2VYHSLa2tsxU~4h7w3%|!5*$=oVS zsIV#ViC%AsA3@fZ)qSzf}?k!rsZLq(er*qQIZ1$kgvB ze}W~Wf^e!;>wk%?_xBIxe|PfW%}c|*{^&L=^%5rKjv`n87W7iP* z-9@MzR&@xsdWk*WjTiz0qU-otJmsej{(4*_*)MpZbxVjwIzfa1T3HCwfzl!^hL|H6 z?hKV5L+onhC?-jU!K#Rssj`#A^8^L^CrFRZh{)CQd6&}NVOuEB5gA3o*P@BHv!0!f z;9}{2&LAClwbszb#MS8t*6K?2PG7yac1C&7q-x4>A(!O3YFfKf^3bWD2qc|g708%Tweo!mCl1*U6mOh?Te07$P`QQ4G z9EW#B(UoytA@Kz+EhJ&*4v2nTdn9?`ypiq?aIW=t8O3WCzxcTkTGUFAPh1r**3g&U z&wG|~j@4c;d}I?iq!Qm8E<JIpJ z4UcVFO^jG4>NQD-p74?T7_e=-d8De5c*V2OH1YTotVe2FhVX`7by*+DtVhrr|t_WJb zzF=tJyxKj;7pA^$ZlFxl_GbBnuQb!T>q2JGt*dzr3$?Cy`YY?J4JA?ivGp-*l3P#9 zaITei>-GX376wT@MW2!JJck&$9!^Lr&sf_osN8!(AJ8p?H$^VKF`WQF`{8S{cl!6% z??sr1$57I?xa0QB-=CKG`<3Qr=^ij=hsM-QtXyT@JY9Q|@f^(AacghK*yevaTQ_IN zJ*suHJ1*%QtaGD&I(X8jt{K;PTkla#f5MMa)4a~D_Zey1zv!*k46xwnlvTM_>n7?= zcp7{qw?H%O8#tJhMx?^1L36^Mk?(6}?$dN*yu@(}O7NTID;&Ruw9IW@2vqHh?|6TP zUxod)(L4PO5JYI6a^MQ>iBu+oy|S>xTaFX+N#DM%q&pBeg|KP~LAjKaZaR4sSI0X- zi4@wN$q0>ytP!7^FzFutF4j(3qkQxWd3JUBB;~#T%?Cdx^^6_c9~cL8yU4LKcvWkp zl1)XvC*O%&p;X$Fhvd3$zxL6#MDnKeJ|2=!?Xfl{?E!tQeuIM_%;s=~lpMp&rA(^v z(KxW9V@1tai~}raH-g&}0-JZ{LsHY+MHX3@;>wpm>}pVw`)yE8=5{l~H!oZu0;pPX z*BZac4FYr`1D}6+G0_~nHG;2e6KfD$Bd*i&>2YV=QzmI7aoj*q>3z}&?G!Yo+q#sN8qR9{;UIKB#8y}E0|}& zlm7Hl6PxR)$X)N#*7vj7biVe1R3Gw;xTokpyyNwFXe_Wq4L-fNW^&c_E?xcX;%e{o zxFG8@^z@Yoac>piGe*tD7RjF#Hv%l!-`hH)RgCejqj?F&7XG+8gCxSIBr9!W{F&|&ysjj6a|z{y&$1+$-qQs=+F%$XNj=b*?swC2^n{|Ukbq&6<8Q7XM2Jz zRzjulh*6u6;y@rvJC(bUze8!Jbh4Oh1hR+fpTS`_lBGlq+L&mG=tleRqVx;&oA9PNJ3}#TI$oH28V7>x8O$p(w#;vvx(|-cqL7T+YMa?`7uuS4qMOz+s=Szy5#O;%;CUjaygmHZ^OaC5?Pq0$*pa zszmx1+1AKeBoB_?(QD#-)LK8V z1Vd@!C;H+tTbi7L?0~vH=pK|6eUc-7y}3W=eF_n3V0{T>iQ8w1>UI-B6e`zDT@myi z_EchF`Vhd;W)p1G(l@&6c`|L$j}(3iE3swyU^hu4M|<0H6XD?IWM49K;3Qb4RIV~N z#g(ZhN^6eQ>-f=W!u}AMqjYn)ev_FX139_@kZa|@GMfbp^;=>X%i8N zwvT0QAFLd!vy{P*rzh3*6g)1iu*eaSqktX*k>^(OKF`^mL*o-eYwrB&t`05zIpJ zFp=OM@F(h^SqLq@2ou}!$g*Qc%21qmZW4p4G0Sg#Yb-PjWH}a8@mUa7q~uA-AVr2Q zKNNOR6p}R!#e=vaT@a{d0c>_W-Sv{!Zq)~hDm>@v7G%^ta)k(wh75S!5MDfNy(}*5 ziWW%Wt*5#QeQ9&6MlN#!4pUMHSyd@X-Qd1kF(5*V9EBkn56Oa9soK_0bQN}DvoV-e z9aEXLAfK(=FGI2=!LrUOhfa2)D#~pvah)-0;<>JZ-x?RJZ;+~ZM5IHqE>%ESB_S08 zI@tLlIF5|FlZSwLJ=FyrPj|iK?dg|*n^o_z;faP0x&=iplK$L~tt>&J!scH^<)m<7 zR8Fw&0=i!Hvzb?IE424CD4U@G>nf*4I?^)WN4S zs{%VuoJXmcR9rICTc!1_zPMWssn|)&V>7ndj$Gv}*Bun{5g7S*zAklCdZE@|~qB>njBV{@etP=JfG+%X8ziJ)fXboE#cX>Wu!(dHJuGC43`W z<5XO5PGz3JUHaGcV!QFpwF@_|esc4Zi`OrlyMB3M%=K6^P%@mK=u@m#aVgg&mEJZX z4H38|g`Qkxc1R~BkXOFpwz0duH$dleZ)=+ng=}K-tx9uO^-Dy9IT`Rm)T*YNgj~pX zh@{vbm50kXvFf)z_1k&f+jTFm-MoD6$`_xUTfOnc^$QbSE4Fjf;c|1odYV@ph+Vu;oSHHY) z{hOQTImad@lJpAa_L%ZEC8#fZSL;TqQXCfh&s@KJeCg`y=Qq!tzkXqDZKi)FNkfVj zD31SnmC2;}m(fXoeev2VJJC%4{E^%ivRv9rj$KHmmdLTGl#b*)C*7{;$!BH$T)S|6 z?dp}A_42xK{^lpwuU_t5KesyDNs3%Cy(ba88gZA9v#d3nq~j#4E7M9Q+U)vM2s3RB z)x8PfkFa+{b7dG|6q_v!2^6VA)@bbdZ!9Wo7%c*MTJaGF_8jfkZ& zgKNZ=r0wDAD)N_N{RlLgO^;2;c)CDF-71TT4M;G86DkH{w%mekY*A&o4D0$2RD&Ht$CuW#vxPzX#$(I;Z>P&TkqC)-JfA&Ln7uE4DL zDY2z)xZzg1eJIkfzTh4!0`=X)3Kddw+;!m+$xp{f&F8Sf(;M-@b66n||L3s6=di-t z%eS2+XL*zZ;7yMMD|GD03CUw+d7;Q13bZ5jfl4KndLtT1%J^4&&- z{?x(C;^_j8_TIr;m*h`vjuGIs{lC4ZL^uEb%Emujsc%>y#tp8}KqwNBP~Et~5}`;k zJb;QSCAmqGFhW3NfMiugoH-Q`wMp^b>9V~5Eld$CT^v`q5Hw{DuJB1Z#RWfj2&l8w z`Cv{osPm^a){=aGHT8GY!&Q8vckbH72J2ZNaqW@;#d63xE(uUV07U4TCQ;!*Mkzwj zpWRr``juV~Xc5_YLcTwksfI>;E;ursn##A${i-H!jhr@VBT8;nh5LC}jc%=;yS2Z* zoGSXsvXIG^%@fPx+xkrfOuza0H#f~){ieRFFMk3Pm^htuU%9gkl4{{m07dlkgX@Qo zM(*P(x0H`=ld$UG#nrVhn*k&(6=}Fa*Wx}40xTi#P8@(itjfH|5UTZZNmJcY0iIn{ zk*$=NUsGUR^$vyA)vpn7?t(+rDZKnYnV~x7RoLJ%4kO;&cONb~j1e$Xy_jBQ6)9Ex zjeo;l`O3lj=;=Bc62KzQD>A@2*jnrgEAe6{cB?ALT|k6~_B-0}vYGvPTLJs_pjd)S z@Ruzm?D4CQF&3Q?%>VR+jRg(W?PNU47C8DfGq4Kdi0ZGGI|y65DXGZ(Aj`?f=J@F1 zx}c-cMfNHM*K9pCiE-4x=r>KFHGEH%?N+6omSmF(G;X&*$2=qN8}@NUYOl1&ME4jm z=b4AQUNHgAW{x}ubsszjb^o9G;2s@xW3rhh&q3YC1$7^ST6VK24q(d)(*ZDY0>(du zZO`UG616-lVms%0O0O3#i2013O+b{2pl&Jdm z56quV9-M6`Lp7~fkWQcNNoK>c2O&|YlB3?~FV@aq{p`%W4RWs;*Uv|Lqhk22;NOhE zb~|0APxhxJK+1u~y~_w}JJ2%8y+&pz{vR!2>X0l+_N6a`>>*UIO6cc#NnUj1vcJ{U zV537Ce5lx;qfrXuQ9jw~Z{A7wNPuSD>5qg<$Y)Lxb1P3^EmWBc`wG`n{WOq39qH5K>QTmZkuD$MT*;wDPi1AQ{)TSEcJqyDA6v za8o3ZTOec=t&!Aequsp%NS0*e7Ks2FQ@>22IF~P8`s&;lpI^8@A?L4N=Gu%9!j~7X zUb=8)^+NB$*F^U&UIz0j@)mX9^-f=0y|#9}mn30G8g$)qLgADkxF?dkN%=d&t=_rq zo&KhJP`c>c-a6wYe~sa13P_L2m3QecVoC$amA1JlWdN#Fk^tl$C#z;jQaLm>VN=VL z1J1b%-B%E1(jIyjJ`TCg@|4k+m+0Q4nDVX;x~q00tUw8LA|2abA4ngPIFDge)Kk*l zshal%^fy}Rop#PJ+@zu#tW%H*ER*A0mwdK&+C5YMS$~!GGE^BVB{73`4u}D1(Xi;9 zPPt4=%#)XR6tscF!Kls~f7+WaWD|rjz$g)_nOlnEG{r3SzC;W{+CI)=-pWC$Tufv5 zdmD%*yjy8jiT(okg+?(4Cg|;^NSZK}puQP_+kHLNPM$E4LX}lc^g!NfB681DpI4H7 zV_L7_uP&%@taC)rYsv@CRezsmyfu_BQdfKJq_1H{tW|;DFhHzzC~cOR&g7pSdeNSZZ>c z)YKk{ZLr5H?tMAgZW75;lXy9{c;VufY_deoasNK{)a3fE=XvD!5qHr^b$=imo$oE( z<`ULQP3}~I>^3BWiAlC2naJUnCU|)Qxv3_eL+aH@Z-Yrq9zc8xmtv3LCogGIlRt_b zSKJc|U8?8!TMtiWKJFL11#K$z%W1|XN8Rbk@9Wt~7%=Ks@_rQCR)T_%m4|teIOOvo z36fl!%_Ch#{2Tg0V+jfrI*Tfo?4&TI@mG_N2VNt=Vjkgs7wD1$JINW+lr*!jdSTczV+t32OSqWHso2T z&Vd*eClB0xvqlWGB+m44K1g+sx<6$zs#$gEa8#>+wols8Ha+bT3(uk1Pwe< z6o8;U`*hb!e$f2PT+7s3NcF^RozW{%i-SI0(b0)0QMlNJ2taYJ6JH>yZ^z?ZuX$5v zsIewqV!I^aj7!Q-eLP7HGbT;&y28$d4qlSY$x%(2eYootulKjG769C8DL4#Qzr?h~ z!)T=`$Fia?@HFYU+k~!QC}i+@D$g5_TkA_lpDjpy|?l2`R70I&wt$bPwLM6r&l&! zyt47q!TSy&4X4T+lFf;R1HuD{ACRrhCU-Qa8xkeRk;xp3q4UeGfzt$S1mBHNEl8ux z%CkJmoZJtSjH#|%JFf#PSMon_*;M+pQ&ZN{p>5`rb}oWIh8)w^Ezr?{Q;<#$I54Q)JRgdcapFes8DkJ2bc zKQJI_M?S%vEYiRtNSz*YN^`mz1MhJfq7CU_M~r~UEWxc|u2;?SI8E`+M$otLq&4zv zEwfaoO=sndtCpEPRwl%Ss(7DjZl$W5m zT;#{9H1l1y>vkM{s%X*K;UvAk6zhxK6z15g*N$3M9sAh*q+6f99MG8&cjS8qzq_9b z5bN068jP06G=6X6pXTI2*Pw?NNrc`2O;WE)t0KbAh{f!PxL9IPa}UdMg78_uU~&68 zbfA2RY5mu8UfG>`ebE8xgbCgM039z4d&dC9fQ9ZIeDoj#bj+0O2_|xuAcBa7F8h^B zP&278aGjvc+&FO1(xOg>jt_EwGCuQ=T(c?J7ag5WWYAyTPv_iEdiJj2VaIsD^>dt5 z?O^PJ*uxR!r(|g-AdrJibwkTT<~YWz$&_V!=-5OudW)xOUvy+TaYFaMZjMab{t&FY zD)618z@bH2bG$0}5zwTI0*ec85PC@}k(ckvx

  • Bg66BkTA=vb=Ue@`3sdsn5A_w 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 z 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

    9gk)wzLq%o*F^pIm;f0Xcg&*Y%kr-)IG-)PZG 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%0AI)V@&4r2 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

    Mk(j^l)O-9ny@0s6ZLo*PZ<}Ee&Z-4k_ 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
    TZo_4=RfnAH?!fB z!DRaE#JqKHYJN0z)XDJh?BKg5pZ?0d`}SYUFX#8)L=kj$zoa5p5kJ4VU%bMbYH&0* z`CIp@YPvN%&GgJb!1@PRY2pDzsr`FP?<_NVG%l9OgNw7wj8BkI|H{3=*qpp|?`)Kh zPEJNo2N#E$w_P0Pdxayx;P-jO>d5=5{I{DHVpj)je$>8TnIe{6--L;V9YMLvIVHk}MoFH>9pZ>!sb`A3p}e zr86;yg%QGud16lX2J_M9h-U*9pbJ(%d!=1WhG&Px`)K^4Mmaqm4LQofBNY+2Ufg$BELD`(KR4hw5zjK`Pz|#duzXba|&k-KM zzmG(C;Jf^P3)ufV)w{e7>|cKDTD-#>WBq(k!RqnIbq|XFZ+_5A!P?)PPyOY)&ZFgI zq{UnRJd0%y>hCP5mqMiE2c!;rBa2EB3ig)U^R1kv!$l3-r((}l;Z2|OD;kxTyR|4{ zL${1oR)KmvL=rDzbnuczR4FkkCs7GutW?-!3vLTG?fNoPsSsp&G~adSOt`yLyxpF< z9jL#7rL+YCt`JkTnZ}N#aq>HG`Y=#*-KDuBR79*Dh9@?H&Z;l*T8p?r2>~#>JSL4d zAzflht|=GqFfv;?{m0c!ZZ}Tlp11$LI)7N~Aogtrd3#X5m?9C+SWD#b!*|~q{Ok80 zHd20RoQOjYtMW|PEJbB-7u5JGm<+e&m?vkP4OflGrCCD6!gclH9fsr!wV84-g?(e-%;l(9by-U1>Cpn#*ZD?Tg9o~K5&gIJBfp46VeJ$PqHEoC1jU- zMlxtgM1G@W&=dycJlH12wU!PorV#>-a?rMe`VOPB71YnI{hLpP>U_9g`LgXl5&J__ zACvuU53qGm-)_FFIPJ~(^6tu1Y+t%`&PtvR1&*IV6k5ZJ$e`EHHU1;1&ZCWj@p2ip zEfUoVb~RGpVK}yu`ah`FuN@6XgVZmE`tZfVtO3~twPu!1W8EZIAJa1 zKT4l2}WrD=U&fLAN|(Bd{SdQ&-x^-^6<4!e$gHYeSGe67+R*r_9W}eo+j@Ax+ND!qAXdAcd4a`Zsb^=JaAF|xbE-Q$k$g+Xm;QM_#^0U>4&@Hlt?a| z1q-@KjO9|O=rPvfT=$O0^}O9QcazjZ>=W65nIIDsCb>i-fQ>KI8*{;>r zfc?FY-Mlpyy_V^5hk@BjvF1hj8=zR6?CmV1&Xl-hnILhqD8B|`xq=24sR`H>l!g?| z8;M|4JVCuA)@kf%+`cdKkj4Qca7g6}es#5JtI|_3RbEPnHJe=_=dr%Bt$@DnSG(l(`EU9ocYkN)~~BE ztPZ2Gm0@*^+1)xC4Td!zkse|72&+d}TDnE_B%LE^NgHP5YZdCTjoL;0Y>%+oBP<$r zGoCLMe)J^L1U%+Dk{&5XWhU|Q3h*MVfbNnhXb>KF-X4`IVOx_{A}o0jh&{j}v8v@o z^&Mn3KcEuh%!MtJS`H;zrpgr5+IqAKUr`Pu6=#UC3)TUSwJ4fdDbc%j{}B7!YBndM1FyD>Vc zKG-ZAZgWuPmJhcq(^~s^uA;$ee9)^2vaCX8%SW)CBg^8PwI5@4#jIgA%YEP^NWN~> zLJI*-DSfFB&UCD-j;F{t9gj|s^H^2Sn1E3-MUB;-*-23!FZ4&}WAr%WlQQ6kbf$5A z&b24?#L+^>#Wi7HS53Ks39+1zA!e`VB@xc~mdQ~~i}_V^o0_xvxS_D0K*=_pcL zBePs+)eu%*?P6#Eyyi7%uLXO3&sABo_kUYdZ_Vef$<(%g@J=eUb)SFDd3X`PUO8R2 zE7g9sSE}tJ)IC2te181rwvFc(J=dd_88}|}NVo@Kd>{k@Y;um+a{dKB@u$cC#s1tE z)j8RQPYlmEOOKQn$A4-6`L%YEzqNetJJsU#y~QnWk%#)Ae6GNj);?FdpHvVzptzx z`M5Sfz1;0HpWNYO)I194K8OQH;|)#kWr9j1m)JQ9W5uLdu62F+={ey}IAO6J7PPTO zEqrN{l-3BXB~hq!vj-ugBf~UuWJ>U(rxjY}jmfBDw)ysB>cLm$gzbtJ?Kt60EXOS% zR8{1z$`w4DG+0IlQkcb|%rq{}kqOZt20rDSfW~PG@2NIX<|hfNsr8li@=Zi2*ekWj zRefnY49!+j`0pyc$hAme`3UydK4jGeZ=CK9tZ*?&8Zdp0Gc7su#O;7Qc%}k=;N8rS z6nH(zeNUyKviio$Lo#QD)jW}NlhZ4+!VY7yl@Zxd>!Sj3~`BpkyAouOC zu*2|dg@tpt-cDk*?K!v(3q`95vtnIq_-(JDg(hb0^3d!?zM$5ZKn+B?Y~8^22Fr*L@n|*J%fG(yNH?c9d!^jwR_{O1ZW@Z1Cm0W7aO?mhCy`0w zgd$?A?(taTvk(<$Xz{BX-}^VJjr5AM<(iO=HI628t4mLV+(|tmn%#_sXD_AiO;u-W z^~-EL^4F>(&uiD!r}RRR2809A0vXau6eBQ8RfIeqNoo*_Aj|9%Tk$DZy~xI+e&Kv{ zLK(k0luu$oZ2S2lMN~mx_=qawo|d^9#jC5dYuhl2L(PA40zzpJ8bprI>gdt^$o0kgc!x47c_O4LSoE4P%hup% zA9K(+3_^Cq#Yk^72VF&@|L5nr(C8B0mI}B^8DGO{LyPp<;N~0V%=g=p<(US%4l0LT zz;g3r+#pfDe>H~u;2mIY?fx~;>eP%CFm`k}R;RXSz)S{{b7SyYoxCwf=^ZH8tsTd7 z^rJV5y6cF)jR)n)0`{7-iJ9!}Ey$RqoXc0o{LWRoJZ{|SbBVf^?`LlRI2sS>p-?9$ z&jyu+2PTmDcywA^wAJr6$8-TyOY_gQP<2fix`9)x5$MYrNEP!Jkln?u7$X@TuC~UL!vp;NDJb!eI3i# z=NX+{vzMlcpCwU1ZYM$7`AcEi>0_voM?P_Y>=g6RM{xrDWe>^zlt<6_DkPK|zi14r8SYgLT z3_6=7zMW0Qh+G+ib{LYa81z407lY1N=xd@TxEop#Fkb@;r7g0jyDbx6W6 zO&qLXf_uJ{p>ojWBv|X?l@KuTF3*=sr#`YtL)W079fo7q6m;uwbfBO;t^7%(m0y^Z zI4i~i><)85&aD?l%q#@|PD;BJDc*@xeu@KtwP>FauX;h#RLi55j*Tpw-&kdBTWh4xB=QOpxRW{Nt+#dIdp3#%!@#wnWwN>6Ar*%id8zrc}oXVaCsOqw|3M=cg1cyICjQ3; zcX}H8)@@aM-h{w%QZoG4;*cGNWh;lAi_5O1$DBQNS@KoSALMg(Qe#%rgA2AkNNd!X z84-g??Aweln`DQU4|ik4Wm%A+F;l=upL$4(84}pmfa_t%4kL1#7_vSXH;Eyu*~R&; z58Mh28T&d6Nkw&XFF?3LXs4rc#iC_`FpE5i9$*`WoXw)evbJ4}*lm`tbg4nX>Z~`X%eyPn2aU-6IF=D2|InHOO4cvrnY15en59GlVG6lcm#53}0a?F% zTSUADh3qgITPb8$=hkhb(V&p?5xFeI>>=b&B7}U|AmK7mnz6h-7;sH6pbT81Pt~U8wQ1 zIy&lAY)=|?o4tyySFw#v{?@&!HrcD#&hGytsMx;PGou%h8Ep*g`>ok6?RKe=iQ_CX z)+xXxQye)#79_M)sikM3+u=sl=M4M< zFWB?Kpyx*Wi0O}UD0eIXbS(AT)5Fo;;poZ!6VY>{#C^k;dkGKtwK+7$J)_i~y2nF| zl>fGHP9{gr#WUFMesXHyL6lh@fum1On!A^T#Fy0twDT95j4sC7)Lsb9PM(DHz*ADk zD#w#pf`r)2h!C429C|3P*TVyU?nsTF;7k9we4*)ZdQzopzVhImB7wX10bapldpcAn z<=g(x|NhnKvvc$6!Qj=8Mkmh>M`y3TF?dyvMq`3H6&?%x%lE(k{mYE!jluFa?RomR z_-3@1xSYE|dGaoOlNgF{_D!}=B8iHhEWY{i$A9?z!W{nt=kw#|uiJQ&f8;+uIR2;N z>z~`xT>4zsNDiAY&tuV}@K&#{uHr@^zRp5sc3>jBJY)VV5nzfGpD^tv(qLe?s?66o znk&M%vRv!VjYyeou~lxzjds5nw}2A0qGz#14t#6jRX_I~$Wa6q$)xLJcNH*ojK&8m zRX8@qI-_mc%}{`@8j|HVflw#*Dg(l+I(c>&m`{})QAp`Tj;aaLEQPPm{L^uo;|PX( zC%g(vVx&1TM_1_jNt`D5borWc$K_J^r8!a%rt6WT4kPk1lA~&NH3n`4IU>GU;ug)M z@U5vcwEYZRDF_4ha^w4vW_yM;%6E*W_sHXf(*td_;P3 zgy$}1m5wB4)!|`LlU>}=Y;)PuvZNF@Vu|^(@tvPuxRiPZ#ExsM6S~;&(on<$h##j8 zP6w=@JYFizx;Qf>w7<1cUUcK!$Q=JN7PTKgKmO+Ik9)-*M}K$p_r+FvR6H%87hiv9 zpP641D9=SsXO5sqz&$-B>w298D3rv;rXl;5SabhRJeIZ~cO8?fFrdz0M0V%$@%(5H znX!o08xn>j=tbNrS(>&R66Piy_b3Nry>o*ls`XABRUUhD_dFu}dPBnAkg!KNqo;$5 zLtO=5_9(}etD!~J zZ14H;pV?QE6^tCKr+bII+(mjp=z|Ra<>&YG=ydcsHw`xH7;3ZVeYzI zHVbxeXIT!oM#>Z$LYd@26nQDFyMfd`hK$mF<^{{CqpOW9Cx~v*k8t^EXfYr+DFT|q zocO?v_Na99FsFw(1%~;hIjI0YSg7!Z6PG}u3(SehLZDwBlMZbWjt*=}c;Y%qPDNS= ziO%!7f~to(^V4pz&(&cL`!L@p@}dD0R>7Qrn1@7*(D9W^8N~-0q%qa%RJoui`@eLX z2*~dGY*q+ID=Kf@VNScCIh6l@U!cPQAtmT+omF9F9nNOAGa6UTGoN|UpDiw9)wnhhJ z$p2+Fq9(~LnGReAB$M>;8mR&q`O>&6%hNTQGn*vfx#xc|`0P)8#{Tb`f}jpV^D<(c zYMO1wI!3U@xe7DMAfqgqV&+8!PC16+9YS#rhrD*viRbFpSf|72>>BHAdlar?omTT^ zd0h!y+acAMH>(9fT9WLUO3y*;OEU+ffS@rUm^DL|F9B-M&^8Mh&+nD7>J`J;T9spq z8_ce;&eqXrV4eAh^jPQmSm$NPPc(cK0+X)MA>V{$8%O`0No4RvWiW-clBdG2LI zeo|_?GZGzqP9nSc_d@&{SkzZZbbRjs9VpIjbZnIs#*N-?>U=yrL7-!sCH{!Y-~aJH zK1`Mi(d9Amy*aFHG#DZX* zU}6r7n*51*Vovr359m=I*pJP*JR|*Va=~Q$F|Tnku|hI?h8w@AsnCx{Lyod&Y2B-z z-+iX{{pZJj%yj?l&maGZ{o`NtT9g+OU~Kd+d)uzv&q6lY9W362bHBgyE z%E$C14?@?(uF8cX)g*KicHL|u@bZci;_7|MhsM<+Q}u4}J4-K26l8uF3!TLzxeA$T zqE<6HnWUTZaq|Ve@N2N<61@-+3FMBKJo3B)FFvrD3$9x)>VM?~=T7GMN8Fss*7cp3 z=G1Qaw}UP`N4QpR=6k5GZ&>)HP zQmVMOc~W@7r+~VSTg=~t2tALoV8N2E$}Kt!%WZQD;qSk%&L0}&X5)Pxv)Xfu+Vp5t zz1MIHYaB;MJHQnw8L}V`E3A|R3)mi^>mG4Es|Tdw7S#+9Jbsk}a^)DM4kL1lxMFEA zZpgoEeqrNrk}%-)*|kE2BK$}xNxeK(EN zS+re+(qVLVjVrc2`_^$qtLd_0P2=jVpY?SqN+!qk(hHHz1*lMHjbh@EGvZ1xUxI%e z3i(#+S76C|aptdvD>{tEu5rcI(P-d``G{P`6+fNf_Ev_sB)K#w6dfd@_RNw_NxDwt zXl}l#>&aYZ4AD#(V1H|)GT)|8y7t$&mIr zwHS=WuWmg5Kfmy7AR6ZQ;>_4WIjhC&fY?tUtxh8+5A4;3lF5-NVQ!hn_fr#O>3p87 zeWi`Z?<20f%tl8RWA@q8b3{0s&(|nJy+5tS$Hg$&V|(Fnov;RQGj^~^LDtJMVVAhv zwfE-Y#lKMf=Em251zKSB4b=ex?GgtYBj2{-VJ?8kNeT(7KuxJVdb(_{!t9Eh|LVpg ze53p^$DHLOED~%XxH=k%j9_?Z&MkGKyaT8A$|u!lH^#x#~qW9<>i8JDZ%3P!w6lvgPXj z@_b|_)zC;DKJ9ZV;sOG3G0EUggj$^dE0-|bET%vS-z9;qI$&DjlYjW{9yMp(j zWa|`(n7Kz$%#MOaO?xk6VAI6i-8#T*t*x<{ps<4vHHF*s&kys zo|xt%^~LdD+JAnHVm*X6K@0-dWhcE_!1!1E?0;%JlNZ9p*UHwQ?+r&M#k0+1DR%4G z?Lupjk}Kuq)YxL_D(wnax#UmTY^^v)b{3gCQt z>&%M-T#hJ;r8-c2@{9)x&m-LwyXxH63uqnGNZDp+Ef4&-1+@Ndr6s*y=vH~Vzhz_{ zAB3{`8GB^iBkSuTYqWMzAZ&nBA?1n#+{Xez`8o5iUInU6+pXB*RoQ38@us2G+cZ zP)cGnuLrC<49cepthwwu0qb&dG`kAc0PC3H$WtnTSh*pzgI(L~rpQ6e%5%0zuovCd z(oxJ0x_77v6!YWCz`DbTyp+ItHoL6kt-h+Q0M>D&v6`@9b&=%3UPjz^j5Wv7RF!$m zPeaL`pv5dAYONf!?ZCRj=kgx_Yhb-~G#bEqJ|aD^?tyhhJpwv5WCG^!Geaw3 z;uE|S`qaurPQ0o1e1bVk>M@fPZpIxeP@B3DGsy*Y?t!&be(KBEw%!z_{yFO2I94y4 zx^j-4%L}3h)=QId^R>_e>l|TzIe$KPem(*9ZaiZ@GaaiX+&sJL5{$+ufl5bHC8gAx z(D;=EJf?(rgBl$W@LBcETzZ9#$6G?qvt#wZdOCbUOW2pd-yal}%mRde6@A|kjV03& zg|&Gf9#&{LZJX4|Gg^!2Wud=_Tn+j^RO$txpGsMo2sU3})wtZKg>DL>7K;22-=u{}{nMvU_cDzDl~$D>oAJn+ zKpwC<>{svLd&NHuexHAvztr2acQ@EC-{nljYZb(p=z=7RH#M9LPSmqybKUYxE}(8} zciq+Rp6)Tt+b@!SsyEz5ncVy&_vfdncGl794S2&HmE?9b<}bhcU1!;7TE6S0Q#~8< z`A{w^ogXbN^YtyiocfN~$-HK)2sC64O-bHg^8R_Y0^{4Enu5TQs`moiXjSu}IXz^!* zZp|JFNq+t7vONFmy*&Sgl;_{8mZdd~4&3mqyD&HWThizI0U`$;NGQHbA0d)ZggL}Q zShc!K9;BD1^g6@|32P{32{{OIr9A#WgLNfIJ!I|9wmRs{n9QVXjzSZtILBx>Qnru7 zBYKT!?nSGEx2e^^a~+qa=g=zGc^V9ZW*fi?eg22l!_u}^hw`TC%x`CF9u#k(+X1nf zM^F4Cfw6FK;PnFi>G|YfzxNj2rMGYx>YO~8$T2aBy&%OYRbl!~w>laO)*=k?Wo<6@ z-3~kHb|^Neu?r~&)z!J+s%{67aGOYc@U22)5=7``R4f=GUwVo3@oCRD)7;s1IH0Sg zO7-gA?a;1_(5~BI=WB5bmOg`ni|PSBI3TS0sqfJ6K$9L7ayUoiQH~2@sw-(KjpK65 zmLYdIDs$_BVf7|_Ndrp7*RQP5Z<Y#${{6!^hP<@>HEqJRbZHhm-2@zxd1km<{E= z-A1qto$Nn&=iT=nK7R1_qqp}LPg#%42d~HW>8d8t=MwGE@vxX6T(b31TGR31$}DCX z^PL%+8Y3dLdkf=kt!BYL3K$H+sE}hYnL^YsbSMZ5@)Ujm8aW z^s7r7{TcqY%Okg<<$*LaV@M5mu<0h=D-DUjrS*>BGvf!D5vgxz2)aCK%afUTM9_Ha zmWK|*v+I_JZO^~;mWNjJW%)!DXPwJ@X}-K`M!)s&!w;Sx|1&M&N3WF%*#x&{n&*5c z_HD+TB2zUn^wJ@i4T&X2tEPY!EzUeT|7*28bQq0Yw>)eejYiAEd_*p{JoH-nS(&}p z(i3SY+1bX5H_n|X*R;K| zNYd6vqcZk(3A$ffD(Ile?lseQO*4H7^4>5e{?fb#QZ@LvY2b;7JBAHAv9=o6Hluij zO>?Q^6&BH?SYG4xU*33y_b__4C={CO&1Y%>qpJalLyYx8%wWiuVL)^qIjN5%EN64* z=NT!Zwi&cobiQ2w?TyE2GV8KK;0{4=Ou5+YYS&?(%u1Ql04=q(fx@Oidy$`OYd3Re zRNAx0YHu$|aQoqnZ-Cxm7|IHIx3U+XGw=WJb6uGC^^L|WDAa^b*P+?>TT|?rfc*u8 z*jFRgH|c%8+5)`Pkx(uuFAsrx)0Q2UE~ zL^znYW(g7VG_d2MM3|q8Wnr!|{BV7R-%?ToB6pU>^0;nntSb)jH0P%XjNIJBA<6X8 z`0O+nEViz8y(BxgES3g;|B=8#JUIy3$j*0a(930W>nPUmQEZQ5hw7yC{@+o|t8!D5 zfGeELrPDhI6)~>?Hp5ZiB~hMInvHv}^m(G|8-wrf5XE{lbT@d#N)(F`2^ON-Awo2# z{y{AcW62!76N4vQjW-E3zRP9v24;!^-@Q7DZMV5?hhlfV6t`e}b!K6=w0Ndnoy5i( zPvM+9kS~F-xCcOxq9Aml4AmxoQ`%=(FAqrLO<;azrPT%ZyDEw8Ff3b1?7!WL{o0V& z*%qw{VyOpp2C+;J5B#wNmOgynY>ADK_6EGqqX23fswI{kod;yu)bhn!|1#jRuFEk4Vp9dr$MrZp=3$ z5ueMTXD|fY{V*3{juw*~Y}`{rqRe?#r#R3HsI7x=?;pJ+=-tTMdIH)L(2t)V-(%i< z{QT(ej{d$VXpQLC`r!Dy`1(V>e)5_yB);c7rtxe|??PnFf!6s{M{(@>#1WGXf>&tZ z(w&;J8**|(5=R#LWZ>W?bhikoo9y919mlj7Y#^Y%pdqki-kW8=Rovnnf%dZBUiMq1 z9nTbiO}y62ek+M~rLX(+0dOz-C4+iyCEf)dm)CmpBCj#zxrM+?kKBnOHzo9y+_(C3 z4$Eh+{URXdUiP~`R!{d1hts2r^n!|(bqK&rz&c9ozx(j*{gct*X#Z4AFbjAgN%Lme z@7rZ8_bsC4Jl8siO%TCaY0c8gCq;wEZAsT&=;d_jsZaoZFcrr5JWNuoRAWqJuxv>L zfsr-1d3RBBl%z^~amZ&4pd<iK8TmXO zDW_%l`Nz*c`7*2bA<=0T^|Tzc2F1AJw4k~!6BJ>I44*G;Kj zWsu99rHT5L4Cx?_(aTYdHX}9hH0xz#jP*slh+N1e;CHXOc!gW^_v^(_Qx4u8h!*HSb3DTU(1;aLgK*DXIqvaU;v8 zzJu&ng(z%j7sDqQ`88@g-yy3obTWcE0HpYOm~Emt`z8oG2`kauRbg|7aoGx+Z&da> zhc#Bw^p8a`>z|6Re{Sz0zlcbfoWw?Z1QW#P_gc_q*GqX)B11BY3v;`~;(y!={5Xpc z0!N9LwVNaOJ(qLj%Cxz|kZh&RcTx6R&96o?#|qq>g&~QRq^Q%;geF7rC2=F;gn`V$ zEYzXMx5?*c^C+?1HU;$D?sVQ^cy^APw>8H}{K|cvH=MtnXE|vQ^68{dVQw z4eCBuNaG^;lo0Xd_w&GB57;0KHhVv>AJ~ORxZQQxPCZ;7+8cI!UjNbR(6`k^+ld9& zKjNnfdKVYPezB<4zAhU(|Epe0{6Z4m*ULN4_f`d1e>l6l*$`{)Znxy@EK$IaIaTRFuFXO zROIqI_E0zw>#+fKJ~4DfoZ7gA(fDw`{K?6F`fMLV>KZ)z;^`{XmvKl3$ZKz6X(ok}1s3u`bxGhQ7M9kf5Osc#XX!RX!kcizgnM8) zBv*yJ9R_AAXMT4vOLqqqA$oyY2b6j(A&5m*o>dBdEC460sWb zMxHf7=WgQpEMh^1Hv%q@IV>tCb-xlPMGJM+?p=Uqcl++j3!jd-_?Mg#HAN2FI2 z_ln}%QWU>(tj?%YaP7_Dg=-Qw&n4Yu5sjFEAE53F0^u0n4_qHRfH0~;MHj!iQCHe) zmb*D(_o2@vLHb4&f>jHQ+!A5@wdz;q#s2EL=20LGaLvOcF1%}w+hut3Y=WjL&66O< zbUjS*8j9(jmNB^%kqjyJndAizeXbjFmn%;1=56D0w_MqUFZb+(=_J5zTPdQTBXXa0 zf?JDDV<%Kz;)*Dsm61|m;kMnodGAikE;1!ib!*2r0+Sp(Ivo||iWmemMVU!dW<90u zmX@8;HXR9(&3{^>WiJXlVG!`qiYw|{msZ$%GU4&X8ISyn1nY0~3D$Qm!Fry>Jrl$h z5zP#GA70&uS6|WOe2u`n*2YlD`Dd40yMBdr!tREk`-WQ?n(v}lu`gR!^x@TaR>l6U zkJR`F!?VM|$|i^3;#PmV+0{u#U^TIDR4A11CmE4enjmNRp%P&j^X#j19-2Inan3W1 zPXrB)Xt7YfME#q+6xr38mqQw2DYa(XL_=xpM={k=$w&-wZZPMHF3GvqZ8!ms!zQ3XGZ@6xM1A%vOmPyZ1T2YS)Ja*$${v9G40vV_X zQrK(QZ@@3zZcH(_wZWft$>FO02JR106y<^xd&$n-XgE~vdX6E`I;I^z&QpZGmoZ?2 z-THnQUcJAeUHPD0f5Wbq;uhe%MgohXK@dtx0`)WBp}Rpv0zpJzaC#;pnGh8FUz*b` zP^Ak*1hK1E4M^in;I=-`eZ6XTLx*A6+TC!Y5_Ych&g~7%k7f_bn)U{2S3F5Xi4!M^ zB;F(vL<)rb)mFDsnQAXzX)17Oir_0y^4cr6H*^@1t?dnWQNmu$FB*L6^J_(a18N)c zSLsKITzt~G*|_8`8e$lA9=oX)JQ{A3u-k+AJSJDU1KTC+9foJu{SDime(U`Wt>#N( zK_Rojx|Gz<`WnadFjn|RaZAx6;LImU>L{CG9p(gB%PdPo+Um?Fu7AD$h7O~#>;8tV zqtWPZn2$)`-_Z9r+*W@>FJbQ`?0Eis&bq<(682ugendfYIy$S`LV5}NN(pL4Lm|UE4g$;kq8J!OG56lz?fs3>0WRR)}-y5Cr?Nc-0>}KlO z8-u6D{J{R@nNj06%CGiJ;0+ zWsP4%B|06Ch79{?G|q-+4E|(ku=gLl_r3dX*1j&Q&HLo)7t>FCV{-NT_C|EOBsN7Y zh`c(+K0G98(Up){Kk(8ljq?OGp_@e7!(2Rzy_{RF%5_YpY#3yDOamPv!3F!fvs&{= zo79)7G+sb*H$rnFx&s}Pm4_dsNwWost$*B=B(~C;hwecrcS&MfKEEtRqgR^uZsOdR ztO5Gna}#HWB7?w4M|y!x;muuAEK}0(h<+6jp$1Xhlh~Uev22?{QJ}bb<$NWH6`2Qf z4V=s~D9sJBW+}k2KHQu*27)N^tt6JCiIBdYD=W?0ZEkl=Vp}f7Ef`;oSrl7ZXesKg z`kC)QViTg_~9r|CEVFXoz8q|Fm6<5ZVN^}`sL->wTiRf5F~T|SPK zoc<`|h7S~XlYqss#hE7-sXX&nvl8zx8oTDOTSue8Vdo>#bJ(84-WG@LRp1>};O8Uj zJsJ9u?MW-v zlJ9KPa%4uE)6&M9r>w%pyI1_)z3}Q@@jEyl!`wiV#4;Y5$#iJ>>e0AY{Pv1p;)kCY znEKNr1D3bYbxzM`P`}yAP`5B&)-`wXDsLXf9;}+E_RogQnLVB!Wx(Ni7Q*cV=0%f3 zjWEw>^Yg#>m!J8m&)EMR|1r5vzy0~+Ke2y&y|*`iA??k-vr+o{puF!}gLCftw`6dh zi&*CPo2xvhJS1g6+@%|1>Ihx7b<)@so&ZeekccSe2Ze8_>bQbm5U!}}VP7!l{Ckym zxQ!lx<{u6xMb!Dx=+x{Fr{;9;XnK0`tHbOqH^?KJ@q8pwSzrkIMCGAUSLO7r`Ch0O z(3$G*0_(1%&cgA6N1l5?h&3V**L8ot_8VUz(S!z)!;jQqWjp@6)w|s0aNgmWaq$*! zg*^KQLDc-Dy#~0~0AE)Fj2K@=E)h>6wR*;c9P3mF?P#JbNw*B_Kh`E!?{U5pkMm-? zns|X5HI#Cz$g@vma%d6(YW6%UIVE#6BAzQ$j8PIwzc9hN3<~C4ZMHd%aI>$tT6d50 zc14ADLJ(Qbct!dwRHz9kF^<+qfCE2bP<(X27V1bpjJ;sBFuU<4 zutc}9V+HKIGJS4U?-+TD@!P}4C-d|X)JT4!>9@~ek8h*B?y90loPZD}xmWFAK5ID(H5@*(Ko<}HK z_rfweL=v1({c=6>l6@-`Z81-Z>*AXHx&4@I<n4e1Z$ws6#$y9OOujB z=y2ApC8TZWNCb-=kB3<#Vjhw=+ilMd#$@&oKNO?Z0zkJPo~;0S-muYpxK!uE{cQB~ z>|~^}{U@S$9G>iNdk(Gx=ynsPv82SDispn_O`wz1m^=#-q#!6AX&A@I4N82q@>Mos@i{!7SuO7zyY~|0 zpKJ;8SIK=XCCJ!!SC_Q3RMs=8lV_U8Hx~~vnYk`5RVwv@&`O4_~PDg?$@0v6?O!lyGp{lwGjN8s!+r(Rd@o!&VpPb>u z3Sgb#nM0<=g&IGrtAl$k-g9xF-D+f*Wuqx&0$U(h63=e5Lw+8;H1f!Y=wcUMw!Ygu{FN z^^2*${&rc5UE_p3yW8Kc1l!NNkgA>#gm+uiO`f-phh`e%d@VySr&23O!A=y0*h0gm zWG1Nv24Le1^;|u2_XVTjkE+_!b{g&`biCxL%Ka!v+)yFL4uupcu*cO|%?!I9guN1m zdyXd_iQpiN55h|^*ehW8?^JKHSs=5k%fw8}qW-}_`{%@4XW^mfS@`*cAocU{=-B9~ zW5?351GuM$qk`5v5qn~PqL0j}+Q&-83ZwUqC!@2ItcG*HUjEBtng{dI_;m7!FsCA8 z-KnmUR!6A4@QuFQJzs6?KPp_c#?`ZX15ziV^V76s%POlS7FcSbl?UN zGPXL6UB$w)n6Q8dD{R+~sGwmI>m&)>NSHWEl`t;yl2yo}!NT3por`|Ev+#Cxgmx_a z23F%1jCD?MyaQW62wg8~kh%^+>{R-B%DoxicXnt)9fssKN%*Zvv8(yjSlm{SaJqrwNT!LCMT-7~P-$*IIDz0# zz+mQ~c2h=U1CE_dW-pL*jJ74=9foHs3IBfe%+P$YTtmXQJOkHBc&qu+SWxV$)@ZL< zV~H)K$4(=rnJ2L#c+b;xScMvA2@!aq3@K}GGxfK_?9r%2Q}H!Gc!$y03c?@ncr+Ry zd_E#Q2k$v}&%tRp-x7nnIup7K5;ko9{aAs`Xu=6nG}5U@;%M#~j-|ooY=T|z-hw99+@aqeJ+Yp{ za|`L-t@?wS1b1*-XtfEBYg*%_#(_>s<9Wxxyj9>u5EFCpT~-nIwDjTI`#^}%{;8Tw z%?nCP%f(`$Wf{Czv_{zupif6T92ua5(d6W2A_=oV$VmFi%|kC!CRbjV8D9x1gWys{ z2`R^7RQo82BPHA*jcaJ;1*4_ywZlr}9+ep4l4GKSLzUu?8yfA3C{GextgoUS7V^Mt z<5=CgK;Ql`=GJj(FCCsvdt9ncO1Aq;a}BF6_u@o^ZxEKbhxNVt2H(K#ekJ7`rIs{5 z9%kjMyk?9iwa=zS;=@bPBD4{XnQ&quNM*FopI$mVKkajd`tiqq`24~g{{yYe zA3uNH7Hs~p=xzR|;_IK=4(DGaD40S}17Ic+wbn8VT7^rKP^;Jk3I=5Of&&8zFM6MS zSB55*v`ixW6DQtggQ+ii1qj7!_E#w|eHGFV7lPc$u&JK)kR)C`K2AnY`> zxD@+ie{)QdFX^=+n+w3Voqy5SC^vz3;1)D3TY2Cmc6 zg-CVNEoH^3)=oF9g&(1@56Gx+HMf?8LCAm?v5q2Nq-;qf0J_Brme@qQYv9rj!?6{Y zcGL}T9gYSrT?|RjOM6~=TfDTluI{a?GlMB^C><@WzlKPx8!%5eUg*27MNG8Ymn7yA zQQb(DzcjC?S6Wb);*5yUGy4g#A3@C4kZ1#L&Ln@>vQ?DQyg!3J^k4^pk3)ML+T+ls{NbBP3B5vnIPTPjWeN$)Cwg(P~#CV z7!7T&9pz~v4`kqxTO0-+jwiT?W=WQNzOO>8+!i#ny>>J_aKomga)oyEqjf#yP3>sw zXP8@Op}lmpXQ9*Ku30GDlNN3^*i=S~t#5`6QQ$fG|Igmr{YY}8=e?BngS(;@*j=s# z!B?dbcgdwDyCd>DTO=heXGQON`611CkEA{HI5IP`yL!93T2<9E9O?)#a0J@|2pNJ$ z2e6?FTY#Wz|4Y7+Ai%!RjiGaKaDI`MS(TNQRh8LY-7`H*uGI6@T_5>YL`KB#eV)f7 zHk|n?@U*VXJv|HE5eqe&Cl}Qe+p8)sXkwu%(}CnRU@70Q&?0J!QA3F zv@I1xwD`CZm%OdID_(>-!zy)Gmqno+3bPf3&dJV|OqAy+bV;f>mtAclJC$aEVt_<- zvh&gV?+q{jetP_mG#MPdc04;RitGRsnj+;@@HFh(T=1GkJ<8fCKntJc(P67(r}l(W zICj}DaA^|Sp&~a(LYInheGbZy&|-AeX0`?r%9=M78VHv}0qR9UMQA9Hq2dJdzdF3x>pxmJvTR~_?-RRb8)IjLGB0UG~IcU#8b&#>@ z%n$y*wX$j6LVT{z75cipg!>5Jvgk{Eb0Z0T<0r|)Gi$Eyxrz3=i@aoW(tdHY>!~_;umILwje7uBxm)+29B9zX7^!KFc5Mar( zCR*1H_N0Skv-~Li#ztqji9RRyt(L9(%2!`{>8*P|`sv{QgFpDm58u8s)t^o+buv6W zJNSvtrpB9;e=WXzTz=O^1JlyjaGn}@GQxU{5i*(C_3FW#0gbZ3d!v(!(|D-%1`oF9 zU>f_rG?|SzGu%w1-I7S{r}Q2w`;VrUyO0U-s^mIHjdF)elHuyNt zWk<)vGfz)VX6zdue0*yvv zJAJY@_?^*spg&co=O_AZo4C>5JGd-U`B|Q~)I2khYOA4l&wRqMgCF$X!F{IgXh?GJ zXf!5sQ%zA}m(x?};=NrB+ehg>pK93OD5s@HIqd!NK7X@Wy4oit1&v0K#U#iEp7K0D z^;5^svXoXw`m&V{S*@m?X?-IikrU=13IU{kkb+?<6z0|v;24@@+Tl25%G^W*%2t>x zW*&-{SkThBAi!1Nz2Y7$Ikpv+Z5#Js=^e@P!BS)FN2q(hz zwy4TwIdF&CY~{eab`V}tVbTfT$w9anBwy1O4`iIAi@pT4lnO=Ti^0WGdP5h%r#zZ?nfP>o%a;H}lDk>GhndJ^1| z;F}`B*T+m>E_S>nn`2`hdlFf^BHa~qmiQ)#K4Np=3pcT`VKH4MIXYYX=teHrZ2da} zb>and5N^!CoxR;YNw=DyxTQ~^Dz+^?Exl5AhS4{Ux1NKqOVSNJw!pRut-v8J$xY}x zjBL6DY?qBg8aWx>gSU=@3pjWbxGb~RaBvPtBP2H_6D6Ov-`se{c{X~qg2DSJ-5!Vc zQMzw!Yw#$!)0`djID9-zrq#|3T3Y%jU1MZDi={4egUerQ`N7YF40`rL_j?>ZJ-Uc5 zCVEWfMuCEeDixjzIyPVAd)&;uImk1@8(l+;fl=lKZLS$iQ%0qcI4PTnOcQo}k$+T6K}X*OG_Hwp*&k@_}oXJU7qf?b#Rr2o8#H-?IX1-Vdk}3kJTC+ zuCm0{{12TN3r#i~+A?x68cEoRV73vYcB9uu?FpSo%CddrayYz0Ikw{PjtHu`KMK@%>&G{?g}PRf#zy zE3cP6{&mLCCr^*RJNxDJ{FkG@JNo;4fQ|CRrStsjADP^x*Cab*nc?OpX`N){631A& zah$>7q6n~_Oo`VkdwuLANwphjE6qZTU?N2r33lfe0a+0UR`oTvlCIq*|y82ta zb@g*;UH$!;ePXk9^|N8MPV93uEXeFNZYz!hAMr&flO&2TymU07Wr_BjB#ikRR2+`T zT!(nuFyY)#;m@)FgSVE|#sNwRt)dj6q#Hr5Nxq1Zzzw`ORGtVg#cBn(wgs!*Ns{mK zGG`8Tw_>4E3*-EZ%vj+^ezjAi7cTDz)tU`d zWV^ZVv)w;Cm$$HyW^ewPNd9ZIql)ZV%zUxdVFcu8DVmWNk^YS~v2L>9WP>Vw8BX3i!3B{DG;2t=O@A6Nr#iEkt|pv(i{ux%`Ga$FQuoC%JX!^R+(p0 zme~kfF7csOn0U(a;{?kuKf*|-G$Wn;*hU@Sm(ugc`+ z&s=&GaSZe6EXm)*?8i1f@+c(;o_r9oi%`S)KZOZl4n2{46Ly&JkIk9)5qg4r<2c1ybVaV+yjc*$r zb)?Y(`ytzeHFT8k;J)R#ti(C@wsWu`A(BD z{?p?>H~;p_h~d=P@UuJ#V0QHI`44`0c8GEP!n3~V=P|4wk1h_627Kc5_$;@_H+|Ow zW9Ps3^!P8#qlcx4VXPkS9b$ohJC&>(bA3OW-HL8j$BKG2^&N$FQ^g9;)GVSyJR{uJ z^#XEyUDk$p*F_%S)SN0gsfck~qamH$oD6OM`DLT+bA4UMaYN$v(oB-80v?u;9i0Bzg136=i||_ zHYYDkUToT#yprK)k6CU1k=&E}lY|$f_KQc^JD!ZrPSVQf>D%Sw^YGbdd^&kR+K_qm zpIe=tq4JQgmJgZgNirVBI{m?u;xP|8J?7G@t~|jjqm$GsFYD~Z{@NVTF#rN0Tkk^7 z_9799yZl8I5sA3CrgNYv|eAyc9#> zrU#mgF2;$jK9KOT$TLS+UdrZ{Z4YF^3pqwnp2o+X?QV4v`_7RXKhl%w!{ULa!|6%+ zxp?{Bd-+YN^1LrEzxn_8$9K%<=+4354w)}c4o7Eq?hfu$LK^s&pZ%;sa9UTPn(OpQ z{+GqIGkVp=zciP4_MK2hiFSCdZ2jbuKY4ngkN+Vb0B^L!K4$a8QJvp{j5;C!fKr&u z!OfXKDl$tG$F>~fe`+h+)y-$v6*8J{)dJV}@#V~?I~i@a#cfAMcRv|-1EcxYHpnet zt5muJ81=x@L5lK=BSRBQmT-J)dy(a%E9OS#!?7DNT!rYE7h#hzR>JDb`Z;$f%vLZu z*W+DD!rBZ*d7s<$c(sqL86Y)!y~fTN3lNoX)&gCNnZ_~~XZkpjR$?=9H2!Ul-Dpo+ zdqNQeq8uZa=As=c@*;B4VswSuxu_R0nS~UMI1}`%w$HuCC+3epJ`>XHJN&l=&gG-X z5q7CM{+h{MGko#s@&9H%{;&WY@7@3D)8l_K_xRU3RA(y}?U?JkZT(y2qOFEYZ8|aJ zr*=PCgGCeacu7>|=QB@m*T+mdRwR@w&Y(4a$zQ<*;anYHY=# z9dmuRR-=YR=N0MIt34HcQK)E7C`)=VPXyjb5nrTS-`+L3PY*ucsY=urj?B`8_FYXE z4OVrD>2HZGEgi)kHqw!O>o};5Ab|r|(|Na!g9dvcC$}Cep`3%hS?@I25DeGLMDsY~ z=OGpNox$aDfbYFWWO1cUYLKW?JyrvbDG$f$bU=JFal(^xJeKr$a(56D6G3Dvs!T(*av`Nn}}UdjHMYd?2zob^=Vk z{)+GYv*YEZYmSoNoSnus%S4}1!Yy`+q4HfU9Q`MF^Y3VVF89iCt+EYNm1FaD7i8Q4>kJV4+oE zS|bacC*0cYWTLG-Bs;8Q7O1J$iS{(K0Jyi0hI)?9Y~(mrOh+d^n5Hc|QPK)xLqk)C zky*{xo@3RXhF+0|vV{s{=yQx;C2~!czJe5VFA$NH;el?sZbpd=7nP2bj&Kw=63)O^ zkFKkvhi7vzIyPptcG-Fk4)kyDSQ)>ecVSLut{Eaa#5)$7j#) z#)7yc8B-K539)@}RHW!QSS?ERMFe|M7+`Z>@Py0q&<>?}raW{W4%xP0pco?jT(wB+ zc&JYZLYyJhB?ZA01hykE?Gm2trBGEDJ$zF^Rz}GJP+yvdcBsgU$V1D~Rh!!ybfVe~ zy(kNjz?%SX7b|QaHfSzPJ=;b3>m^%FWl<9|idbJ4qi8!1?NFUv^U!T;;3^MoHC(FG zNinB!D7Q3R-q)ia-~Z^tr^o-uj_K&No&l(5=;|@z8lidLH_M^3cEh>Px@ylKHRbqR3UI%V!LAtIoo51J`x-@4WNYEPyiqIv2p*(|qWr zGqGDXcrdP}io3-#^(aV?RxrW*;W| zE;*ilRpQM<=b-Mw+~>&l65Oli z$lA7#xRkD0TP5f_6B$~{XmgayBoqfaz$2+tu6({SbS6gD$N6~)5i~((&G`>a zSRv5a&Wv8lwPL(h;R6C}AhU?bza~CV!)b1WyI{cwx9+j4K6g15n?{GOAxKun^;Sl2m;$<9z*=^W(l?NGP?g`#)|NW zk5asV)rzbP5?2D-@`_xVId>?@R_6St<&nc$RrExUA8{@)*}wPR`#-w>@ZP%*-rfJ{ zaCDM;^h_SEsmA~D!TtOEpdSC$SpU%lCk1c6ucz;+a}^IyhSQ;*e6M)ixB1RCm8;;- z+4v%obh&a3&>4S+RA?NflQ_Xf@yuIwt|#(Aa-UiQQ-ponuE+13c`b%oZw(+s$C%T>gAH z5pIWS>>4_6tws$x&nwbH=NA+@&xp-)Wlj90({sAlX4ENB91g@mX8BpdvcqJGz_48_ z2}MLtyTXH?m0*6nH2bk8)?`|~^1#!Vi@k37=x!o-c#K2|l!lcj34L@dk}P8ihQB{K z-^RivfAqzVZhVGU%iVP4=(&70p*DEU{4g7z z`CH{P&riq8=e4&XOQ4bB*k&}@S!;yyr+rM2AvW~as z1x{$Q@?FEgU2o6!X`(GH5Oz2%}`oV-Qk@0BAvy4XLba$IoR#@Ap1d6r5Ytj0>@izKxw!wiXTuv`@u-Bb_w>v&)N56MH z6}O{}q>A~-p-SOd~|6%lfcQGr9p0yPR4 z!%z$DvH|hEb~BjomgD7e?7KrXcFn%GR-?wg=N0MMchA0W%7D6O-=E(a_C2?-o&ip{ z6xKUwZ23ylkEglMDMA&jR3x!>P(TQeC1~DEF#pMoZ2hJqbgNS8*<0#$*agDgSf^Z3 zJ-c8@4HRh`k5@?3llS8zn0waU(DuO7_hyU?BY zMkg1i@lfpz9>88|9H*`def;<_s?b@thiUfMOGc+l^5CE5jUa`#2IvK>A z{ig$?5g(pvLo-wLOFlQT~A;b{EC{M-Dg7R<1PT6{JH=df}# z9v(s-Pk>SB=<(UfNEz&zjYp?Bv7C>QHTCaB*hyZr7YaewCs|`c&@<@x0y&1cDM0Pb zZDs%c`|s}4YB1VARTI1$o=XP(-Ev-PWY8a|8%EGcVkaS|)0xmxJCU{%&z3qS22&*| z`fPwg%4wR5*3OMXH&vd`QMOGUnXv>88LP@IM^ z`2~V@E5yACL9=?bBO}3<;sC*q5aJIjKhc1oKiCO^o-Yt@oDo&7}0G2J4San%#(T@h%urD2F|_cAePCeYj(A_%8)A#1Kn zR5e-=JiwzkGN)T;OThperKK*nHN$*QQP z1AxwKf^{_+)QF&P@=P+4kewLWk`wvD4>2)Tc<-&&WBElm0qNTuTjaR&vf}FwRe81m znm5`FKo`TKR;4wD-w9R(cEX`nlAB1x9vKGct}QZET&g8WWp4y(RREojkjR7JT@65Y zD9H;6po{U?`A;tGd6>E&5%9e`FL*B03$i*Bww;!0wb=%aD5az%29q-SgPG-YN6 z!vV7xFP8(*9jdWw0KK&uH2^)YNDrWU0Nn#NYFkpyJjNQYVv{2b1xgl%PTac5F`&EEx(s28Bwa z1tF~h;U+>Vg;khTiv!!M!@~wb`cYd#+I9tV^Nh4t=}yll2mAZy0fC}gw0k?xomAss~U zSEQsJ>avxR{-5Rix7H7NjG6I%VP3q>6nVDr+J!^486S1kVY5SZYNvtBLfazz0`pGa z)&%T2j2M;Ko*QVE8C>Yqf>a>sY={J+EXbuDsykFT-0|XkCLy zm)$Y6I*3zk`>~Y|y z`5onQjI={FcFjn)R-?v9=N0K0Y0pS+ijnqV$lYwWubWeT`TTsMN}u6a#Th+V#`o6r zE(RIMC!lN24?S%=_>sww-kqF_6hF6-7WN|CNTgnt25As+jq~faL{K+gy;pi8=w}{= z%x)%=B91Ifb6C(N0sU^S^x3VNa6Y2xLVe3bxbA`D?Ab1T;w-Eh8K`$)i#<V0Ys)N1 zLbG#Qu;!`;u!%Jb-xAIP=^S|ef!D?m`uECH+bbDDFRv7D9yg0RRqrLaJ#N0LB$u|A z3~gv+VJ{qG%n5VGwBFDfAwq`+7$rmntoM@Ko#5u#Ce;igsu?VREhf2 z)#M__nd@1Zj595XwM?76Q|BzL*b;}*WFuV?H@7=VXos7xV><3aXNp4v4n=B;&knj= z-v=vm??RW$furkXWNc|qS%mpTLF{D?of{ij+3ZC~Co?@R^)v9LXqd=tKQMkz?@}DtQ!I?yfRZdHzZN-_zfsa`&uiTZW^UqjU)Wk+v{>W zlxNq>dD|+u%A8w`mpKAnT=g31U&EXOKS{id9CuIJCJI?3R%o0a@Pqap$K%{M-P|)% z%wVoR0C9#m}8g%*b)CP6vCf96a&_8l_s=r6<@oroicEp2RK zidE=wKuS(|;?QJxo5G3R123R=ScVb%i#1Hzb@s^5zy-W0!<{B3eP$i2vyw%#i2GAC z5WoNWt#O4$3DTt7t?{FZEp#1)&83Dj=Uk&CxrunD$HVDSF7Q+r(<5wy zr%(0_V&HDcBWV|6w$+SA+~{PoG;4I@7NehI;g zXPLkH=~$Ui*t|UB(FrEW{7H{_?YvxV-cp{&IVZzpwT=eoWAaQ2`{mL2P@N4w%jb~Uq21>{_~F?hGuvWPYx?>5Jb-9WkI!;# zykT{DKEU47LJv8o z6Oy6jg^{vlT=|&xJbFhwnhk0oBRj0Iwk95}oh%I<-!$QnyXrpHWEuuW=wp& z8)bqOvS+r#9<^n|d`TYN?iisRkKW}p+=6gch)sTQ;P7!@CY&8OH26%U87=-KIKZLt z-L@i63o8kugdVFim9gp|nrWMJEnjjE$() ztFgu(Iv}4|Wg*$NO2E}3+5=cHrIyyI@{=^d>b{X^)`v$R=bZtU=FlBVa-$r&T8-<| zJ{JdbjIWvsw}C^`IiTGTu^5(t*lq}<>$rMnmK`V(9J3@z12j;p-2*G*DD?Q4;1;nwtF7VCet@%y;3k5JgE2e_wHYspvur0-F8ycH z1P`~k@}w4Ai9>g&#;!T^)@sx^^t>WHhweG_;^?&GL9}$*%F{mnCmF3!k#H?W7`=m- z)<}hS8Lk`!hEg7Vwxi~S=6w=QundvMMVQfpm zx+bSiiyz&n8U2+7{}7RNd~v2No{+oc>o5pGR zw$?t<#^=92(*D&^I_1c_d?&&O($Sb^aYac-bxdHeVwZ#S8ZzaOC>(nJXP0jNlN(?8 z%f*R%`2@JsAs=8CRkk+GaD?pOwI9*z;|m=4T|01?EN8Wu|LDeN=pD9icf|9Oa(gzO zLSHE_-@bVPdu{EoQcY9j^F3p~-HaV)F+7%3#GZp~x*ICVrci~JV{>rp(g;f?^KE17 z*g;`};~D>{HH_Vk_7F~metFY*y_ndnIscnjGlOSqcxI6in;eIDUzH2-en@D@x_~rHv*~Jxn?kuwB0n)Rpog-sj z>uxc+xy%)gzI1ix5Uaxd;bGe-`rI12=jXG$ zGY6@N2~p!%@r8isQn0SngiLY@z$rr-`-#Upj0u}|`Ad5N(d`PoTZQQ8Q0L4_HwRvr^nAy4!AE6ATbc8^?&cH3xOVx05J}0!{?0z7q2XD%yk=4}@z2 z+Df#ouw8bOb{Mjo^f>nOIAe^HfP(|S@`}E5qzEdROdl2xG#yS)%3hS0@4c6|bXC6n z<;gj1Df2h~AOHA{X=A!`Ft|f!?UTdN*`2$CJIRRXl;N4;42^&J+0PnGzw1um<~n_n z|7CIQjAwY`Uz$ri`_5obl6`!4?k@hxCx7zvLLdLbqT}j+<}FzNEC2eRO!w74r!U5} zIIWby16v+Ah)AP7AKwlGBdV&^CXyaXh1EN4@Q!T^3pvHKl6Ri)m<&;h4ADhZq@)s`UV)eM@{ieeK} zE_~?`66?s6&+=+TYA=Gj*4*0tvN*j%U2YzyM-`mTc}pjpUJejGvef~y2B&*j7p`gIO)m3?4@yfhmzbVPOnzuI&peAzG}7! z4LDu6u_H}1HW@qSo#5I3gXmHBRqPo?YYgZR_7EPH#0{ zY8Qf8&FI^g#>@M9^yB*D?>ja}pPt<|XE^m#>koZjQ~o5JbW2b+5s%q@quNRtNRS}A@aB=VR8 z8tz*;^8VJ!QNWhghwHX6?`7RRa=zWjIZPt0P!Cy&AJN4ZLYr0Ucyt6|#vh{_!pZV> zA!qME_7P4H9*##|nw_=y0q~2M~XR+>>*f zz7a3q9mFT2Bv(Y6+}?Qf>D?Sze^IlR4Ol;YR2SE;Vd}M*<<$z_lvQ>$W|?=;git#r zEU&&3wk63ZCH;BcFp>{1r1R!ugCtk$DLK%Gxjyy;G5tv;I+|}eV|-06)XDHO9^+zy zPe{`bA`V1bKjc{!r>c8%q5t-TXI(EcmF_s^CeV5ZFe{w(Nk(8xtU zEN(sqjdHiTA$@TyT$?_A0(hjB2`y=)$z&ep&smz0&FF@q_H2Bi@i7f0y~I)w*h69< zkQAyAs|qK0&h*9qs+8`UMl6`~;c&8tvUdMybgK86{7?6erl%*rHB8^mBquUys1=r! zFySzAINOhH&kpGJO*40aMrBoiyUIrA0%HkdIB@M2Z1i`_SGi4K+ zuQTp-##hxDW33-&VTxM8Raj=xt$!!mQ zboDU1iH;_jouCG14;dnjaD{J#VKxWb0U#Q;Ga0*$lDrD}$@gdMN;%-o$+zYunM$YnY8&kheKWm~Cir zdo@1D)r;SOj|wE-uGXOyVrB+iKp`0-WC4K(R(~Ywbly;rXRZ^0IuiLuGD= zkIvR#CTQ8K;8E`CEvmHqp*2IqB)L|rw1$snu~30cbB7-)Dk9)L*#2othsr^~8lwwu zwDDbjLe?bsD_oV2b|}eKKDxuC)YfKNoZ8v;or1o=ghFv#s%Hhw5y_qw{3)`odD35BJm2 z;?Z{Fr8c23tGSG`rSa0tM+1gP5X7kNNN488?_}InjGQnH*s!^okwmq+^ugS{;&M^T z9m=tlkN%r=>-0U)W+psi?v6l`N zkH3Dw{w6=I`7*!zyoq_w#+B`{lZv!!VZMCZ!1;@m|J^IJXCLlgeDqoEfV}=$uA7+8 zKF7Do1zknjS3(&(MU%{}NMJz{q%F^PkqoiJ&K!1ax5)+FJCM#EHe!gH*5Y!{+mpCb zgq%O*xcv1^$Ij~F@M1FUVY#ur9?W#>gZN1f^yZ|rV!;cKE*V}GR2mU;laqNj5Az*u(Po9(+{s(=R`Z zFEA|s%a>pJg_q2KvuU!o;uKrrJ&7FijJJSkWBCeh?B#=m`$4 zQv9y?eMo+aP-&Fe8Lpp>Es@&NXs6K?tMvJ0<`2qKs;$hNR9a0(XyD>(O5-k03@GV~I}~r~J`)H2;@0_Jc)8M$C` z?M29m32?9?RCtz@X=b{OIOu8gg07&ze20cg8l}V~fqA=~Z98DT^SQVMh^>I7d_x;y zu)TcgJK%D9zEU_3Au3_SHs6;T&gT;q?Tf@A?u=U*55AG}nHS;Wy2&c7(MQmehs!*rc5qkDQVsA z&E26oTWR^v%7t$`TE1=dTczc#hD*boR=b_7@#a=KR#+c+R?NnOJBs9YF>NM-1{Ffp zMSu#wX}Hv$kTXFek;&(;%fa#v)z}KlAMUssHCR5cNYBc9R^GGnU3qi&th{ICXVcQ( zTxd@k{}*~4*@(I^2I{d5!WM)^c=+xGf#MFAL#CdUzj2&*0Q9V!cJcfpu|(Q8c1^s3 zpbh|MeWu5w^0TLG?7B40P>IOs8#LKIv6m27l40N#83QlHW+Z>2FLMKKDjh(tomQ+C8okmX^(dN+T9F9ItUUg*lilQ=**B!>GWCeUWi(8u-6 z$wE7EO=9LPW93*rvj2B^;cKMj<|M`r1M}AMO24`3ym_L}k(~9~@{>Gyw#Vh9iuc-b zvV`Xz2J?=IWxw`bTmGDB%l}!gEq^YxO_W-3?Swz@G~C+ zZi0?{mS&{MkrxF-C&?OZ6wTvy8gm}6vkXsa+$3KFP%gAURPIMQLx1PmSeKeN?C{?C zB?&6w)nVoBZUg1Sl5Y3i{=Id_XvVXG=<(v%|KOm*!lh^BvrPA|VCHdJbR>N8^z&ch zh_SRuR*P%&jZ-~U=4wBzB)?a`ck!*?O!&5w(c#12PDW=&1Y2}Fyj2zvV+!LRZJ85l zvSg=fFBy*Z%q{eh+>`s0gcqdti$~czo{Y{;s+}g^E+3zV&qm|Z$pf}ad2qPZ=@}{? z(pSreO!Xug4`ZGF;7ReA2b~^s=~Y*r;FZxyYL%CD_F{Kry^YBONyq|?nXTEeNbI3Q z{towAodvd%1SIz%)^i>7~$12e4fXjUin-zhy zIKM;79EN~CUnq*Ay;!D>;|Gme=Gu#J@OvzA(`9jahtfP#T+WBDD=yE6NIjePqxat% zppCAX3A>1tMS|DA&*2uMBvn@AlPia%kCQp%o)GxiYLs}!{V(T#m&WBCD)K_&@?vz= zTmc$zxt5$8rU4%IwvUH>fERS^M6nfO&_Jj-@#9++&XOl{q!)6InHOz4F7HsCUE}g? zYv3v_Z#7(M(}|hWfV$N=Z4EB>g-)=fC(7Ei$GI^+8Ojxjm8Lr6u9lLCy-n6XyYfL) zdNEuMmv^Yfu5tO+YSeJ~ydpg=?{WEygUfqd-Q(&WSNo2YiX_&KP;^;xPs>r(+)aHW z5bbewkE=`Mew(D-0#+Tx^nBZ~U=ip?F5RlqwlZAnT$Or(%oqr_2v-Yv;6{6x?r~tU z23H3M4&mFVv`m|NKE~fziCCzHZ_l;eHs7Bcp}+doFG~9MJi9ti!fWH5UR=s&Zk}GM zllKb=?);rRs}%0p^R8jL+p@T4Iql_pd1uf^a(7a;5AHwsgP;8H?K`JxjH3NO4D$c| z=AA= znm7GCsOV=ebbq_^{I~n=fakJ1;Ej*fI8V1&sJjM>Nbb3a-rVeO$ap@GLgFePn54mo zC@7VnnUzB;Yns^bP|XLSk66YQpYwW<1|sM9=cm%Sa@5 zq#wHE_l6!+%MTN*cT+M=gO(zC{E4LCEct=-4!rQd_FMD@d|U$By5Ona8_;@{xIo!2 zpP(r`o0NL}H_cPwk&=ux&3}(HCj6&3=Io8ehx^5MPWIy``-tKz?DuP@qjZ=Jb(xm@ zs~E9Li&eS^A4vbe^Bc0qdlh}(8E|D4z3*c(i(7N7BRT_8+5+- z&w8(---(Jo-=6y5FSn)=Zt4v1ql`wXz#(*A2Ys76ZivrCqYg+v0w zN-gNq$ZX&B8!>e4MHme+s-V0im+lK_b-I%mW@}%-C*@u8N;3Ll?S<{UEh@J2a~bNN zJbmMMYi#{|gm_$_CDPg47@$Su*hKnRVHzUIHrDeLD6_IqYd6qQO#fi3K@x`LAh~>F zK>LzxZ4CI+ttHuFYOtmn*Je9k8DBL<-Ow3e3+*@pA-(N{Bx<0Mv!X1KC~15@3zJmJ zi1vcjscmH(`Ex$qqBEd+7MLrK zaZZAUDJ2cvmoRf7H(D4JWp6Cf9XB zvt3AI%g2GyVqMDIo?eA~_i5mL8u;x_1GniN)oJQkEGX$4#=przyKWYm+IQ$1PO~_^ zZ4BIV_X69M9xLQV$#!ty$vyg<2@Ef0me!JOo37BDg8!3=15byK$ohS9qThbqD0M9I zd=JkKexkGKZ@&JH`Pbsh`8#i+UO9WGkmk)ZgNd3hWzc79?ZWp44~P_gYd?R4x76Th zth2XYFLyu2pfycq-Ur6|z(kuKxURGR`e3Y2-hTaTl#NbKMvn&^ki8(Wreo9t}q`ar|KM@lazz zr7un)xOrgobeQ~{eCcF#aWg&1J8VNVo zbisnReIVEL1=Qg1N@1@b12@013jf{q&N>0%l{ffIk?-OIv7gUmm9I~a{~eK=|MDxx z|K9xat)BHhm#nw765QO>Zix0ev75p-Gg~AaWRZr6;xf)6TZb|b0^3{30kW%oWEEP) z7>Fk_2#6|4HGk)E0=XbAx0d#*IF91jbwuXau4es3z<3mRynAfqqtIE<-i=CdLqUaQ z=M>Zx2Qq9ydv`89NAs!U zNu7CXJZ|Tf(8b0t6izAH>&|=IZJ68f-s_l-yAj`ftLz5>*Q3f3I}l&noS?ZOdVD8@ zm$)ji$SCCA6ozOlGgGo`3#sBo_#w9IS0%n3O0$*t?$|ipmKEST7gDwazQqtR26NRS ztv60jVxNd=CrwZ_s2Fs}0?Sg;iOH%N7r^GI7X6bB0^2k=$7Ez+qc5V#YbHs%JNL=pxo%E0Cmhq5zw){61+oocFlXY zt%0k&x7Bc|@ZR#O^K(nX<$XQ+@%@iJtQjZZ3nCp1MJyUjXW)lEs~o&9H>;9 z1RIs$^DB?{eKA}v$9p?eW7oWQYc*=TcV3ZI-uorYR!g+wijZa?*f|R*Jn1!gC!sF_ znt{SBN+Tf>n~{;Do!O6VWI4Z>&L0@fR;cZiN~MnRb(N772e!{GNQAMl!z@g>m*fwe z|J26E{c@U)rsYe@|6CGaBWy z*<*X_VANsS*YX|@7N1-mAIE-2ia?a+v1=Y@<8yzB^SAPC5ltp}HatNhIvU+jaKN8< z%JSnR;f=BH6igdMCCra)dF1oQ79oF#7f>b3()kNsmZ;fggg-R1t zof{O-lztV4I!|*h{>oajzuqmBb(1AK=ca$AibCF~oeF^4n8&M$YW1 zKAR3EPbL`l?+xZOTz`5#8c!ka!!sd7i zx{KQp(Lz$|j1^;?IB6hJf2HiL5gT#lX$NSB@!i&`nV-q zr8G)VNPC$Uu7kI_Qj*lajJJu=VHz%&auuPka~F3EX?3FpWo<(Y_rEAx(JrGPURo(G z=-M@s6!Di%fN|HHU&sH?qW<5!E!oA!+ zd{>_0!2w%S-wUFU2jZDng?ksd-4clTa!NP9~qe-Qd8+X>%kG~Gx`7qx@=GW`ySn|u6j%|8G%i;?X%tGpK z$sncp96`{08REQ=YB(BD9CNKWtM>p2~SB}-$g&IGBsL%<0d~v1=wlb@}iBDs9 z;afDW@PsgZi@io*rMrsszCNw>S4ZhoPv-p>!gqzOX;0van*Ix;(8YcMvoE1d(?=!( zR)hJaoB!m-EBA7NRm$49iHJQ(9JNAUY%UelE{r0^sV|ts*_)Z*hgogrKf3W5UM;@O zYUo|)!>_x$iQlxQdMRRhHl9LXDUSsJ>)rqij1`L&u`9GxuXeuOYUjk!giJE}ZOOoQ zIe?%eDr2XE`bfk4(H=3q+$P6w`#=PH=!k-l+fSp~IYcwF=Mar!)3%pSY`;;?SaYdq z)$zNUP(7DB|6c~*x0XAXqG-ARs*b~@{&=QB{DKLM?t;9>GgV}@Kl!koG`>r+sZ16pp zz1FTh0gdl}&2@ODJpoHE)L0@^wC1zlFDuS_ck%Ia*%R;^<>b}qE?x~Ezd^});zVGf zH~@${xsgD!VU`he=rB&x0N^+A;154GozNUf2_(G#otz1LXfCG@S z;m#I;JKTT-<46S#xFu5oDy+znPUGyhGLEE)3~kvo(4joLZW`FO4z4y0v>GqV7sA0l z)2=t!yx%B0PdRILToGGJC|nvKhTLIrd3S|I@^7msSDLMkm*pp92DANgyj-qnphGow z-88VZ8nvc@c|}&6271|f6@B-u0?(`L{Q5w854sJ|L#rDr-?h?+o|{0rDLRmXdVTAB z2Ar(<$@&&Ef)~v^ya(Mg{P~NIKHF0HC1LrjC197b^m$9yHx}}DYvFEknw&wZS|J^u;-}})|%UIsJb2vI@{ z*ivX+k+|3Mq~B?sh<$0F@a7j?h2Q1tY@=geeFK+++xOmkeKM#tdJPhFs>f<@J{}#8 z)#-p{20a-}&QTlc@#O9x#=|?$TQy?fc=YMrfqC8$e?nwDdNe#c#G^YiA(@lCy@iaI zvezm=QtW94*?4riq=vYV>BF{$ z@YkU3Y8kJe-!^{`E8uqNeRN{9t8eF-V%SBo_wyO3@^zWN_Kx4rCx88JahqtwuRrEK zgfROCqn$-+BZYJ$Tcl{P6O-~ImGWgKwQ@)}4ih_bVhj&irQ2R8up)y>vU0$YFTf7F zB9gqdH9!~SKTs=Z`5+B+OQ+J7YXeD!I@~*+jLuHd%7^LO#lJjEM#f$5bn;;I^!RTL*|a)6L**e~Egv$~lVm)karOsK zipM$T3AOT1wdh-Y~i8__GwtJIzsf!btlYqra^U3 zxV2DcLuTnxK@yy)%#_IZe5WBX&v;G8HZE*hZgVis)!DGX%d4~7?QGjI*B#HqU1)2u zo#iO3CT8qFTW!Y!w;~9RBOkTAjmIYz-zjQ&S1Ciby`Zrkb5@bRh#(?-j~#PPi7riB zTb(!LRoO~gcWv=q&2$C=byjGb(NTv-&6&$BCBrx&QW@|R?-?W?hC*1EMCHP$+>$SP~SPQ&bq z7`l++^+IYE>N79zjWX0PrM)Tl;TEp*&H7HaR0SsvR!tcu^{FzM89_pqUnX&?_vrtl zKiqVi6&SJMF*eraTlMFhluyc%O5ulZTbW}VJ8&+tLT$9pn!Zn8J37cpPw1ux+4!v2 z$C+_U{+h=dizOe=8&Th2O*URv40a;nD#~j)=#}Czs=PNsFc23qvOlW@;p%vnEmLuof#S{rXCiMHPjXuHbW7 z@vFDS75u8i)JP9=zS5eU7FY7pe&BWRwkvcxe<#KJxg1DsVUAo^375Qg_PlF=;aW*> z0k?`@-Yu)~3^lCU~hR^$+ZV6xY15*Ob1- ziWf9}_AKUWE&wiTKYOt^1&|BJ>-w9laOB#%>_n2+z1cNy`gy?2MeS)VsBq@l@0V%w zKkFU9pG&px>*ci6h?`3z@EcV63PpM}lAa`%8j~ji58c3avzUBQ(_o({yj}!4E|RG@ zZ}XBcaD&wLv8jw=oJQjcf4a5287DB5%|Yg)Bg9OVMJKu09M-2^$ZkMH3*KB6Hm~w# zX(0%)g9p;XobbSLTJYwNO7eFZBk;M>x3WgO5#o$cNkk89c_8pRm-V;V`+@hw`Ko^4 zsjWCrqCHk6=5UF8LW>QP=~j2+(9ME04n<|^>521Bi1Tc38WCs3F-KJf*QoL(rBG+2 zedCOP2FpR<8!KYKQ2Ek|M8i^;H4=h3P@6rQZF{2B!F5;pwmU&+N1S&)7q`Hfb3S7q z-5%J+O(s=xIBktG4!1?5~YFJqc1=~Q&W-r2|Qz8Jl5_9fQ zm#xfs*S6qGno{6Y2k1N>AW@y7HA80+N!t$X%wj-Lk(l2p+x4u>$9oiV?Wbm`w_1^v zF%rxxa%t$?p(I>QM&`)LA=m>}rpjkK+RwOz%dNWGwAqpGlPZ z8N!yPs?`RwOGJFxyRqFCyhC|*O`W%`f2-8F)p)60h|nj7a`}d`#unTOV$zR^_eB8D zfv~NS#%PawiWjpEr~OlzQ`6P)QhP$29gVePK7(D3I(MkXuBr3ZYSgInydtaAxmWmB z6}~+u|00K1UmxA=Rm8hi5r2D?h?R)eQz<)($hRCXqazGocqba8o9?gA;YWG-MC{raWeNIF6Oy6>#}AMHTmJR0`TEJzH;ix2-Vik^Q zrSAuh&{$grG!3vPL$Y2K*52ACfhZM@trA+?eb4ojq+b9VNGX(uq>ujHMU%j0Q94Zm zIX#!ofkdzE*6DeJ9r%YkX%bj07Z=68#?0_)kASoCF8dyVzDMAyJp!1pX4=PGI!QRt za82x(@|9=V#91pHW76qWXP&-CU`IUy>{25KVR8-WH1!B5CGa=%Y3mQ7j2;0MTLioM zM2QjkN?IZEUH9ojL(q;#H5ozuwBJE1O0v*co zYh&=2K%DkLu^mT97|{ z#t~BYqH5cF1v->x*S!MUmci9tfmY+CVOFDQqI%WW^a^mlH<8e`#n>=M#33Xo4HL_E z@xxa^sA%DBHG?5*FRuLMdIdUEW7oX`TdPs)6_{6~?-e-S$h3Ml@ZJr)kG<~Qz%MvZ z%a2RG%a@C0i7mOTAT8`E(fFX!ps?RmNyo`Io;XE3PYWN@OM zV8MN^$5Z}(0MaVj6D}>cU!(8c6;FR>uJD}^vHWWAfC5(&M{>$9U`O95mM;a=q21 zm)>uc-uF=b`80ap2G!5BaeC+Ge?w3`@}11r<^-MeY~|QK;dW?WWMahi`1NYkmA)Oh z_>+oA#VYmVEQ|16P6FeN^g=kjD+NAxT;&p==(@sFj)TG~K&+UiiS{Z`z4~?=mG^U~ zZXaM|EQI*OYE#1rH#d4|K30ci>%*=9PPt~hd8oefE_MO|3+{OFMoHWD7wa{S(aW-#T{9?IYtOLCs@An9d!3$Bm#0uQj3l_ zq%=CBAi{j%HcnDKvKmdG+h&%|iy%zF12|rZrFSUHvt{X6!*+S$4;B7Rz=A9IP(0mCuKWJ?@*pyv-EAN-zrOQ zHC}2L!pv&5CapCr-OaS)Ns_fg#tO&79zOe7mRWY1I-Z+h2xHDrTg+g7#59`EV3%X* z9jdWwmcF$bHI_cFNYB!HmX2jkL@JV#YHXb&3_}=so+Tx=d3Iv=EWKyxJxlLd`t$52 z-?Q|#ES>z#MA>-NYdd1GgdYVK6znxT-%gywO=4}3^etlPk{(ol&m4XSEEiW5LInBbM8ExdJ;VF; zcg(*QU(VloYjUp6-uYmb_e?~zG90o35_2f62XkNRQ8svQbaHVT57pk_0b0wpqVU=K z=*+O&BxvWs)j;y;8Qh$s=d)x;()Huv^eAU->SB6CBJ}jh-r#pe3~CWEulR3FSfGLIEcyE&(O{-L|4O?7iEFR!$2rhXNh z^aYXa=4t*+UCI~NcRwG>m9NY8xB1;7(Fi@tpNo1B5{Wb!*B_$)eyy0YfMuN&`lQio@JX?OU-5r*;+cCC- zrPneaw_tH4TPQb+u4A@>Rie{{n0mG^laN}ZhR@N2P8f57F5JaXUPFQMyx#S^VfG@} zu7;vS*q2Sm?ogW>BBrx7*h90*+W$bE-_LtA_f33zTVh&%Z1X|VPJOJiz^4(-C<0uZ z$_3u>%F`iYMpA1-Y>Vd@GTW}Lv|7>YQCjYj43VFV>FCb#Xtv_o~a0@Hb%e0_1L&WHQy z=<(UfNTvIaWWF4p>~C8KSAl7}@zOA>!S$-M+8Sc&r1<|xM_U11o0yMi;^dVGETxH; zCw@Wt;YO$O^3uD)Wg5K#G3`)}t;F=-tXu0}vK%#Hx+uviGVKGhXUD2*gvT4@b+e@F znIKWczSL2utSE|ElH%%%i-h+@HvazVY-3tFAjg4CYPCmi1LyTzpa3OYO2&|OxoS@A zgh9XzkRNf+e{$p1Z_1gT)#8?hRgY5K1gGWo5!Fp(#o$7j#O+Y%2v@jF z1Z9xzSIeK=c)fbN^j+JfU$<>}A1~g=ia_{7BOYdfPxPXSP1Bn`X{k18T{gj0C3@Y>e}}*qen) z*P7$KYP@(#ELfe?{>7KOklK>x)^eD^xj7Ch#h}-TaEo{NMPay0AanEO&%>Jy>D~No z@03-Ve?}^#T_FvfT%1zh+?04aOn#1saWc9vfHuZHHXRs6@$gg|T$`#V=t;Hyx%tD) z0ehPd_KhLn>$q?|K;EH&b!&k9%^n~>mjLI+u?SPel7CJjzwXm z13L@sFv@Hrrj?%bT-$dfHj6&rfo*IWaolP2s8TwPA5{p>ttH5jLvSw5{F#b4aB{K9 zRUskQ+INUkaf7TvkgIfdBSDtYfwO{D8|2mZA=$#lZK05RrWEAUx&N8&Dj5k+2g)|hkOQEV>V!yziB+;~(EK83K0>26sLl zojf@lo!z-RxKoLu;9q|Bv!Bf`(V)0SpWGcR|E0N3v%f5^o%znjzciP4<;U~C{N$5A zd3vFb|AF0M5qI!E^X=mQ%D?_6vuXV2w6?k=)>|@oVCQVi?2*VRFvg$Nv;HQ4>=HI7 zU6EM%p`lARk_jip%sNqVreVw4VCaot%sd-683P0^36R_EWZMDc>zIyPkjV;Z$@j1% z&ehy?JMd#WP$5zqMU0&`@$e?0Hx!wbk;s7Ku9x_#(JOiRMc^IgJEdOjvi!J1X}0p? ze_c*jr|NuS@1=Q5SeoRsYyO9QLOiDX6NvDTw$<5v^WnXBAH2K2SZ_TnmS8IYnGbs> zfLsm|Ok=BqWQ~1wkR-}Q2W=^VG~J9EOQqViWR!V{2o)`S+W_)xoCL;L{%QcZLrt~< zpOPmlkRyV22W$1^%aSSjC|238gj z%Hz69TTE)edoB;DGQMPzYjx=(6NPvMg504TyC%q6%TXuD^OE!gnP5z1Nj@uC=tvO= z)^GWFZ%>f5k0DCNi9dT?oH*zMb{$VkW$ZcP@>u*8ZT24=exoyax>>;7M@N7DYPmOW zf7QNK{>c1HxnxMTCu5T&W=RJNS~n1>6)SE(X~fY)Al)=IGg|&(ZhDX=j${%!a*O8c zW}!D7;oOHS&prsbh4jYC*Ky-k+M+1^Oa&gRzf zO0nm;WCXI!TEi=eKXC*qAJ&;Icx98awC9yG3E~?ce0=Zw&!Oh@I|J-Dw&hITf zuf&+P4e0H8WzQ=Y67;!}8CYM+=TThG%)vR-*WG5BfGu5y>sv4`u zdxt36FX9W%r3&G8u48=v{=54yfYJV`nqVb<3whsh>?-Ijzsl> z#6S@OZrM%-#nf(Uqmo<{r{|Tc4D?dG((IAUX>m=<*TgI7Tk!$`O~x&NBd~x#QOJwK z*|Hr8d^AIBW}A+cD|FO68|p)^JXY>5cx|_ny-8lVJRP?HVbybevxnu1)No1%UP(e| zjC;1A|2X2TKMo-*F^R}DAK4hvYSV7iRFv9_kemx#l~;Bs%`@heT?MbjAc<;aTEi<- z6x}K_7QtFl5|$d4O6Z-i$s*vN+?0^4rjo3T6W6{nuk28h7n4^O1FQzl8hB-bfImUN zZ^a0cP24UA{BcYXi8TXUhU7A(-+^o7X^Re3XId)0OXp)g6ClHYgYC{e+Q|^;NlBRJYWDq3^O5h|)2Cj#1 zgb`!LgX0apHQ`6BBMYMsQDORJPcL3(Xv&njm^&WE>8TdC48j)F9#13bj}HP9Jd;eoUQ z+mHM-R;0>Rg{eKO+!d=tDeYpe#?fb01=GYT6NgP>fLWcyVbpkwnaoU*OtSzHjbld= zdby3kup5gI>LXISq_(o%F18)3yoTAhBdRppS42p)BmEAj(gXn}wvWM+N>PNNlC?rq zCPV?+w(Z$MhauN`vm%Ta;Yt<-MNKX%t?W>lt*G*o@;-ST(n_v&CuOBw43T!qN|H<+ zLJt%(mt-Q#NS0M146MX+G2;p}3giu8rn%nP&PNIAilQQy4m0ggk{6Ry&c>I?>8(y~ z4Wu$iZS=25Daq63u$t2_OL5q5VYN#tpfCMcZmv-dy=uIToSj3QUj&ArZ2iQ?{GI zg1KV}UN!oY?bA{yW1DHfE&GJgI_V6)jO`^bx zk~pwDMGvU-@frw9wfGl7SIK2X3QiAfCOj^O!|y_c%MvRqjay8_=M`Up+r=q8VS02q zM_tP)jg^u_{9d+1ys?o}s*A&m$+Vi+*<;EcQ}&p$$CN#$%tM8Xz{_7AjStn?@Ux;9 z%4|nJ|G^K>4oUazF=dG<-`I#L-_36|H%lqKG}8zzq#JSWPkuL?&i7n%J_C%zoR8b2 z9lHuYk}Q=16Q?M#F_d!@DWe4WRk7WzrIb4JRS=}9h+(#Fn5a;NNlX-qq?cZLdO<0J z3Y1-?l(4_6D$5O%M%r zlrRCM7CAZ)umBZOgdv|LGz}9r^N+#`Y4KU_A?1!BrP&$w^|y!Nx8N%FGN# ze@1cTFUKf5RAbkSa%(kejB;L)o>BIUvS*Y%qdfjPX@MW+yQALwRis{)25AuWS(T;F z@NM#bb(M_RxNx>c*AmXvc*Vq;FTPBYOyI7>X7$!FN@vgaLZT=)F-nujB}?zu?`>q1 z#}_A0dO}I$4&fhzdzx$26Uv@Y_Jp!0ls%zTxDl}cvK-;10e-1;0At_vSK!${tF=w# zLdx%LB$PkqMsu@#(vL!|oxl%Bfbno~b?q#S==&F;hwoAx5KmS053J{Z z{oqRU9%w&~Vfd;{QzE%%vO6*}B0pNQlqinGLurSk%+Vg(YkCwJ8980O-Bqos>KV=& zx{@Ht0AWMW$QOn$WCMc#F&)@2U|;CQ@VPp_$f~T$s>-g)>aK21&*m;L!b%vXIKlLX2O-LIo;|t(9RTCU+Q;SCdW7=GS&MiK;cn969tT zesS+far{dOKmzpJI3qGlMa^v&E0Z~tK}>b2C7aw~c=pXEx9xuGY_ipSS-B8yRpaZs z#PXZjWRw-e35J1Z*^sktrQA|7{ja);5_H=Eo# z8Y^saJ|Z2P?AT<-CObCSu}K>`-F=Q(McT1RCd338XU^7tD$%@4Y!ayKR1uLEXVd~D z1{PjoQsem|H4&M*Md6&^@0Na&ta)cq;|_Y4`Mi>XLW8Jct2*_0JsUn{7`=JqVBO|5 zwv0qF)ecFFAIQo$-CcpOfd-nD6-D4tkIHm(o7cWgqGOU}^(6Iqr{pr~0`a z_0BD>&F(3Nz3IDO1Say-Q{%ww`K7P$_PF=ZPDaCXkmE!TdUpps_Ledym#^}C0AERV z*!amm?NT3a&PMgc$)AFme)k(Ef98Js{>h*7oAa}uF7yS4GdfEHFS4=lq~8px$`$64 zuw!ZUw_4jy7=x_a_ zcIdA|f7eBSNaK)3N1+!B93Z6zDQRElUM7<~QVJ776V#dxI`p?E^yfnCq7)I%a;dfn z{TV+B@+@$&x2WJ)=DQ)1WDF9^p^KQlQ5UqeUZ<^bjWX#`0dr?{+TD{L+no*Dp}!kh zk6VzXTBW=^7A9zKmoNVg{4XQQ5e%Dq+|4!BbD|z~93bz}+~&EjC#VjaMrHX;&>T@!bOwAhx+_8J0fBHkUM*eQCj)hGD##Ca*1br^5F-)|L5Un zFHZiBE%@VNaz*4JunR*i zV?VUpAQW?%X@t|oY|ysbr|vL1Tk+q&tVU;bbJ=X4x@{j^$A9hSOT%U7YrZsJn)zRx zYo%>Q*AEkf`9gDvb{!^3tm7zg{MB_Ptk0L_7v$2@zc{<}SL1&>498af_Xm3(jurm5 z7?KVEb^!3U0N^*L2h)lvWO0C*4^9=h?^CBwVj5kXCf~|5(P0)QaZI^;YRXwXa-*f> zccwp8D|uHh71>B9kqEpZ3|+Va(QoA~7JGPUBTL(EQR&c{o@C>ze(mg>*tnUKC3gWo zi!t9Q4Bb@1f|Cj*J(Ex>phY-9KRx?M(}!(*=5G%32{*Lr$q`kFz*06~v16eN$&=KY zeS$~?jdKZ>EY5m+dcCSgZhZdNXY!@$1*8$YeF7_W;Ii0_;r^A-PN94(`VE#-vDe?>Kr3uMOapZ>w!Vgo|R#wi!A8eG1)|o8p_@8i*|5;~h z+et=WN$k7CyQ_|aGd+6J9~_BZ`G41N;JOWZhn-}!lZ@U4$>?AG(rdr)n)~0$U%ETw zKMF*EHKOEv^T-!RDn9c4gESy~nmWT@@e_Z3^6%ZxeM_I8kA_bzcfh3$+QrF#aR2;P zJ0yRpcJv1uwWD>E%w6Z-x>tOC1{7bM{5604_~bv8zy4=_{rtr{u2tY~+)sUbWXHpc z5$BxA^K%-i{)_v|*B=nTH@1@+Yk6b(Q;(1J_;~hHzmY^#W(48eMUh1mHZwZ4RF;Xt zAcl=Is+`8y!uYToP;20e*b1sVJ}^0#Mw!~v-&vF#WYpIq3;H0rEbwhs1VoLdh03%E z;+C;{QXGj%PO6AI$ zMs4rfJR!37x+HmrG1*Fz|77c!Tx~dR4ka%p*osoS0VShsPf{ajjKMI44qU?x2vI0W zoGBC|igjvPBezZ@h0>m%YpEpNVR-h9lDF-HuYr;mmz|@{(u8S7$wdT{%7Vx%6nR@% z-6n{51t^(tvMBNM9LC@3()$5FcMU1&4#Tl;l)QB~I+Q%EX-782*oZx1iv2OGt0oH} zwk{kz5=9bnW)+-@%fjy^o$^bk{Z$3t*YdNcRry?Jktm?vsZFDU-{`-P$%xa`2?O@T`pVQ@zT zCq_~ci@dY!OY_9CqqaH^!&H%rez&xwSjTH`Tiyk3`BLG^cW1S--lFrr_t8}Pk2An0(|e5*zH+a* zC0a>YRD_w(fuAG^9$)lGCLyM`p`Rx7sbaJi1{u9ig;pu8nASH5=dyqjXq4xL7ByV( zlF`aXRV8h!@HL24=3ATOCe<=mF4j@NK)?q^^3m)stifjh7}7>=mN*cpa8CrDDA~z zk%dT7lEhH#+DKS<6A6VOOfBsFM2fcIo8Gm)1=YzO?mGy2SG~ zj|^A~?Lx?Jj0hQznliU%gies~8HQ)0Ep%10ND^1oD8b8>HLp7i$ty`JtNFE}DQ_T^ z0gkuq1S9wuS|k}n0s#urq&W9u!JmS_DF9l`Bk8bOOH#SR@N6ZOKdENS>dvxR^tx>i zTql*S=1Z*sV|vw7u_85oy%|(u&J;uiUJ5E8-&xW{=w%58hD@K##D-{&lzGtN%B!TB zFIUsN?l2l#LFMB;kH!k9oR3H+dF?o5$0<9{+g0M;amp@_^R9Z{S`DVOYzTaExSR<- zEwN5%Ob!)c-7z6!t|j&^dESOcp*--@Fi`9vFA-RZ=s+k8R_IzSTN5^O$`d`f(4#Jr z^A7pq-h@n0kABL%Z{aN5amtQUcAT=~l+8}Zm&z(PbIRYD-fM2xpjQ?O@Mu$_H_=i0 zxwEA;A|eSYv_%?O5&INo@+2~GOkQ&|?r(D{l+&ZW1G?kOd`S|GY5JmQhH51QO2I=;j z=mXOq9y}R7J$&jP_=jV2Y|r!|u?PBe_~hVZJRF?X4X(dC`fK4^qfoYy7mHZ3{P_p$Aw8>pU$56AJ2gqsf#h9 zyL(<79bjrG?(r9Cs_JXT94`(tcj+GY5ww@0@V7*k#nL!~7~hxJza*55i3H}kq!WDS z8McSDH!^>snR0ybMEJ!NsdAm~%6Vf32?7m;O2b!LSt_5>Ldh1B=KIGQ$IkKO@$88v z{mJP>7Q3uebb{?mA8Xa(3<9Pd5IgyToe`FaPrM&;RJfg+2N23laYR;6Fb;`Jd&l zf9bUMGrxfvgyDST`^2BEpt2@TDJ;D!1&yxwlsXMx9(%O9WM1m${>C@;U7 zh~mIW5z1Qr?wqpSDfTuw<FeYx5{}5w0yc(+hg`n-v zbzd&cmu60B(n1D-vK}3RSbP@NqLz!%A}8*m8=1#?8>e)`90~4=vnzi!PPxNq?446? z8;uoCIUkXZQ+AxP^NnY&3W>5>{!42_A@-xm=Je2n=?$Yu~0r^_2R2)IarH=t!rgBudnB zu{synj#74%vZIt8rQDHHzP(XR`M$f;+%BVxZEnLf$M2N59ZVHMVg0C}B!eL=v6?yU zK8mD_7$BLEbAcBPJ~V~EZUH-3UDV}Fca~9VV|AR-!|l@`pU0$q!Dh9@SV9ruZPEp! ztbg1~7^O28mPaBv^4l1{eo~R5)sFX_w3M|S$^y3BN`7eP`g*?_!B+fmiS>1avf_bj zgfhT1G)CI&8H|o75&MCck?iY=#j%M3B}n(Jk;0Bpu2at|5lVM5iV%{oK(Z!6nHK@g zpeFa?Kr=8ArF_zl1jf8LCJG%PeSth~WH0X3!hnMRl?i3L^J_aox%aiW1^KE~^2=ju zETR?iwF93N1|DVv0;Dq4B}e6&xF9}D9&C}sp%N0>zCI!=Z-U&udFbI)`Q#4c^40Q5 zT9tR=lhp*F7O=!ynjK$tAPRb)!1jtXHJKW8VJU*}0*4As8&ocft&Xp5j)cOmDE^go zlsgQ`E6FFT`L(jNHSo#6l9wbU4K30#YDCG?9uv`kAqjf3#32-EwL1+d|9~=l2r{{xHMmy`6M~v5uz9T+yVuaWf@?2)_0C#elm7$jIK;s|kxjxtmS3E3$rt#nfz_ptYy90UCN=31KP)fo{X;JC%2j^aAD+ItW~_~${L|6U*zveG7*6cb^eaQxL~l6ilP#%F zPoMYl;j_W%Q0IJwiqY_F`72Sw&3ykJ4kyD=@5lDIZ%!>=5&P()hoAM%?1V4ev*GBc zJZ;W@p6P*pV$bYg(i=Y?Pwd%2?}7WSx)-)zoDWA6UhCPh9oh25J}HX6vF`irzV9C# z_ifR8WXY{_(Xh{}Ec6Wr^>5Z8)BC*_Cx434;CH`q@@MY1 ze{k~W{N@4yr_S!}f(pwO=8{B&FP)Cz`%Npr%*~Jj?0hM^mzVZG`x6n+(W`+M}zWWIR;XGLk?b?{Dphvq^hlt^s|E}Jl#chL6nSJ za=1JPW_Wh^;b-q3GD^e4GtEGc4s&yGK6vut<+4znt+9;`s$WguV-RUYKva|^2vPzc zyHukU7Diw%j^CWZLuFCyq2?DN1P~g(NTiLF)>1H2b*=XPl3~B!uf8+eEmZx&Ag7_p z3Efj9qKx2>JWVYjB54szy}*8cJz=hq`=LO9`>CTaJ_>_XYtidy6WibUZ=L)RxZUMF zcG|=}YZC)u30+N@P<{c)h(pXEeT_F{B#E0<8O6jph40AUp2(j&b3}+BSMXC4`3q%{ z#~FIjoTf-;X`_hb^o^&oh;GtADnH}ovR<^Sa`Mt7Vnmolo;rS>Mrj5#4>v1&rf)(jIPR=+epU9j z!^qqc`+7?Q2*?~khu)}^+#ThbnzN8{$CiHqsA0-+kvpA7^2IZWmeCgcRAuDwswa@>$ujdVUnbxW@?PDWVsNVU?Cv3g@z~jLr(HeeEtr`TVuVZhVbPiXPL; z)x}A^SOrP97bp4pnSNgX?xxOLA;7Rdx01ENnuypp>71=Y8*5(%{^Gkkf9S@s|K@Zn zSADz4nZ;;c@$F?3=H$@I%W@NXoJA5%rc6S1!|dBNf8@sJ|IXT0v3jY9)L`760fYsUD9*Nwqr99=Gw^&_#%L5u!I0A?n*g#U`W}q39}?+DKZk0{ zC(jRhzYU7CU+A;*Q+u!X-~)#v7wuO)qtEO}_fUmA8R;_z3+=c!KDX$tM&o3uDW8opFS=40a#8Xy$P=+3%5|U4%|KZli8es_)5{7?t~q6F zC*#8hAAI=HXGce^@B1B3KKUD0p8W>*E|!L{3S|ol`pAYT%&K(grwcIe(XF- zXGW{_pI!XuFIUE~zfm@_e8Hi*v}Ns-q&MMpn-=tnqUiBBQd2q#B}!6s>|Q{ROF?-j zq~WF3&C>DY{qbaciDRc*s|$accyfxfZ6S3=<)5mq)L40@X%>1QGM~DFAZ&13+Mq*o zL7K=)^>YQD-0E1^jwkPbG2RWll*hq16f35XJ4i|M#MLCF&p>D-a0*drMy@pMKyaBg zazvN+xe>;=HxVd)`nou|{lIL+$#Xh(DZ3m|}&b?vkLK`##Tw16Kb2Yn`ZtPq*$Tye80dF$^;=@1heAu z^kEwbPsfto*|KBFv_Ew$*{gwr7bhF%&3D$UN~`&aV?rh=uz7x{I+k3PTS}AOjwN?2 z`KDMh9)YRJ=@=^L_@rHwezz=B#KO>f&A|*iMVEzom+X^imJJR9RuFgMxP&DK(Sc&M znRj%&yQ!vJ*le^K^IFQ2^ZrxRlFv`=58qyuC%^sP{qy(kQ)L}=^5jw(xnG!EUfBDG zT;i3h{K~`R^-tc(llLi4UR>WpruT|G`TLzb`R>V+e|xrk->xgM&5B$U0wr!7B$5cb zBtw*pEn#9ZKM8{%GQP>NCQdQ!4Woj5b;IAKp-2LhyY=wGI}4KwiiD{SRe`jQcKR^Q z$cv3dsxw9Xum~40xz5fv!{qcxidE6>O{tTYZ~P1Vc}u>;Qm%f`Up&9aPWxjztY*OV zcwzkTQJD%lwdQb*ST*~Hj|PL`)AC>F@~XU0mTf5>jr3sbY$awt256rePCP7)C`L8D z*wN(IzP!W9sVp+aCivYJc|q`FW{ZwYP(e7ySo@lZ=a$rmxtT2}* znhYfaPbQ2BA%hH&Pq=L&wU--}I6)>}?~OXL8Yy$H77|mheTp@OVix zti5>y>tu4}1;bFfCWCT7u8fm+7?In=$@RgwQE{@Xw=la_2Ce}oqk*$ok_KLAi14Hb zfL10Ir=E&2Dvn95NG;74>w~s3mFd%T683V?w&Ua-MrYqRdD{-Sj+0wWmz4|Qt~wW@ z1x`kj;x=k6jjK^d&(|wMiFX){edFYZ)& z-e>x-Ezf-SVecHM&SZ(5tamd`>}0*O`SHDqt9B^1ll4xQ%wL-0knt8M{|1hpSmt^^ zv!mgBZDtEiVp{GI$U+C2h>><XDi`6548 zu10J*zuqkr>xT#Qv{T2p6vc+=0h@WUeP$!QQPz8+2OWtWAh5-qc3}GGapxAbUy-bL z!OJ=l+mYCg#8!BvW;OrwWE8zo)%!cs)%$iqY#cl5qr5=JKuePdk_atUY87P=I_tw+ zWqugqkQC+`X^Bw*u1PTx;5;n+C@F#(3%Ro()@Z|J$TJ~v#*Py|#e|mXkIcC778o`y zK&+^J+|3|1ISP|iKG^_b_aY=)y6xXShwWUVC+D3@^qyU!GXzw0f8Y{bp00u%pu}?H z!I?s5*M{|=txd*`!|sX0a^66I7zjjB^|E;rhb2CofruiEl^kNi2+aB4Vo)5bAmMO~ zQ5?^*PAh7N$(?S}NT^DJwL6DxcPebhVfVin?}lN^(_jp2SibfR*Vpwp^ZmQnt1aa4=K0z+Q zu!4q>9ESqWVERaga!3s)gD~Y0uEX?vDPd^CULTOPITE-;((7T^9Y*9;#IV)uS}`kb zz_2P7)Y&X%q$Y>D(B&F4CH00kS;i8D!nYJr zeOm7B7KRn_!1sLy;c^VC4&2E)1=N0h&i*HsJ z*!yY(_I^BDz8#3=R`ze5kI(Bfm)#d9f6X61KKW1Oum71}KY#I#3uG>xWWSBM;P7H( ztXK1hef`1IptnXV-kAQ><6}KOo=Fvd!`gsgznlu8@1u()j+fT|AS?`AQfQ-XVl0eS zqmcUn>PV(7 zNbFujSj%_*4#jo`%hl3whb6JZfh%MwfoJ2K$V8`xr3h|4d`UxJI9LdqSbWzz6uU1J z>nx8W6o1R5^ClFFXK$csj`b3mm6BL|eev)`A?x51=CQeHlwZ~{6DORQ0p)~KVy4|u zY`c?TI~02Zt8oj=SK}7tkuV}HclqM)z+#oo=}Lx-gNu-q#hjMW?j#;L3Sgwz*u0>C zxQ_mo-vk^tnvcm$EcZO&^eK$CZJ)WY0%cDQLI=< zTWVr=7@e&!c5X@DF0gmo9=Hx;+s&8dE8#A?O8{S*FU>R-i{)6xc*K+70te3>M9NaI zIFaM*(X+U4-tR3|Frd@y(qE0n?l2r%Y3z=Hy<3N4g~l$1WF5yYQg^2ms0-{}4WPY5 zFFU@Lbp5;?V(qQ4;uJ`Gh;$h^#dx?617j}D?l(C~99TgJ%Hr7bx>=8`SHwaIPy zOh5OgT;fkS+WxcuZ+mL*gO7gv-u?2IPv5&=(yCdsB#E_CKSYvh%l{bn`hzk9ckY5% zlj$Aw9uZ{gFi6j(+Ufql=F^|=k9(*3IjY-pi$S7$ieZ&-yAas-`s48hkI0^1`U>Rh zKD3k3@O*g6I~(*q<#%IyH7CY*9)9}Z-7-fPGlvc^J0D9%&ORBAp7$84`PDw?{oVyJ zS2z}odpa9lOv-Csh7k@XWA~#jl(-zr@$vBDlwskI{gE{jhKS*F|J-IQnv;t=z>}L;d`AIdhUF zp-n_8k}R@#D#Hy>ye3qm3mNMojxi1lV9TKBG`GH=#Y%=LB_Csz#X_(~dhV>?S93qk zFwn|`4rFdJE`~9AtP=!N0m9#f;J0oxy;1NRv=sdQs4AbYRs&}Z2CZUz=bL~9b-OLo z<+Z5d&UAU;xv@Ji{o%or;nTyX{(*luHe?Fx!&wmU!O3_yIL&KQ=et!zFgN95I650Y z!dIva3HGWl$oXh^!VTGTUzAHq`k}%&o4rn6GrXch^4pEjS1ue=p!ypq62*TkK6KWCUnKPzcX8|>K z=3Wi-=~tS#-3fEM^IUG zz{+AQ;Ut++bYNtxXe#$zc%nqs*EAq&^Meh@Y(TEemUkGDSCK7OvumYqra|bNgdv8# zgk6St3R@N$lkC6<>{TO?MWkMa`8L4mUJS*j2MyZG@(2j5@?9Ib>Yx*=*5v@C`k6jaJgx^th}J~0nyh&%R7w5 zRl7U?9!wdnqfu;g=h1zafO2>g z`UfiZl}~5-CGow23S@*#i~~^lo&7;&eLn|;V{eLMz5c*k363hU@?U)Ywb$-%&hK^c zpYBJFU}a>{?8mB?wg<532guujwWY%%-;>c{{1uS z*mAC)-|IcI_NVR-&#fNaoBjF{@amhmaHFBI<8f~=oYhG)wS5ViIOF4x21WH{>m*dF)Isih&pKKkh4XT38!p}peSaKt4Y<^1Pa z89P}fM~|P6C-&@M8b|3~*nZ)HDtWDE1Yz3p#TGG`4(xw$+_yzN0CW1!qux88eDLU# zcY7Q=&CtEs`GhSy1!iplgu$0D@#z5wg%sI>d2dY{CPh#_^5dgG9*H*6>VH}x z&27wkb{F^N_n^!7DYs6(RY$%%o9n*bv&}V5$+;vs6>m}UgQUXwNjo=X6B2?B;|q$U z-h$GR?>&)kjz}&6)urdvX+;zHj!?SMBjvIn!Fy6!;bm43Lj*c4qzMUyZiGZNvgZzD zDmlaXF)=(OVvY-|vjP7{*7t_#3-7?Q03{7gvE!Ad|vM zsf?dfMOq)VwRw~zjBZPH^$x?cZvwt;7hEUct>(+hg^1Cqv=dhsp-J;d`(9SK#PlM? z?h$Ra7jv7zra%OdGaGDi<{fPQbgw;c2b+5(V`} zKH4P?BcJ&4o7znJPqE4QMa)w_F3*>x&h~4iyYp0nZgi&Th%daTz~qf367y4{vphpX zy-WPu%@q3e*?G4D)6xi@KGvQNELPpd&_kA_#J~HblhZ;L#33`FEa@*Ex^ZNi0p|3x z2nkXK6z=TDR2sgVUV2C#aGoILOU)m-@%jIc$w&{zuD)6dIjYw|D1mPu-aaPr+4~@;@RC#_V^kpqc7{GO zbQ9CpS$l?!ueU@Sr=JNE8?915C2Tf!{=1=*N9KGFQ`a=ru}V^UbGH7oi*<*Ll?&>R zuJ_GTD&(9Q!YVV0j~*m135oz0#F)=@msn+Rq!PrhDss}+CRQ1yM>04dyf<-2<8mJU zV3YWDY|mjGnH@O^EQ>_RD*x6=U^lbMmF(3y*H{p)PWXCmEo5nYua|LEN?z+&Q8xVI zUMaX8@+Y{{@TnuYLo%)hV>@>8&jqkqxyth*?kfor8$Wp`e7!*wxQze4*WtgH6aQ@z zyM9)!-?y7_n-vjxP>BeXl^MxvkssPTOM`^)LiX%I5^~$kb)ZRK$P-ugNCRAl{V?^} z3j5|&z<(mdZZb@yQ85OTm`e*)u#XI*43Ft72^RP-seRlg$*b>sLOt@Mqfi{FxP`NF z>w5DJxBgqkf8mj@RzGPce7#(j+6iA99g&BbQ}jOWlNMEKec#doh7qCLW0Q;whS`aO zFQ>-<-90jV5>)fL;J(9u`@nzh)Inx-pweVTBG!cek_@|jnG~K1QiuPr@y*D&@q$nX zF;Zo27@S1b>$DaAo1JkYpHt4PPP;q)Yj-x>GydCQIc@=#=7sXvsW4X2in4MC`73pz zLWu%5a%HK*L18I^ka+9sw4gK>Wr{!O>Tt0?y7;NN0)t+X~Yz&|0|_AffPXuT#=ha-*3npjfAbOP;9r+>+vVIMnXfcy-&xzKZ4tzFNb}1MX?D`i z4wpWe+*w>IwN2BKekVT75|++s+6wRt(~`72{ugBI8151-4G~lvP!OVNp&6G-apYPg zBPt11XU4CtwOQ096DJp^rCTr^oSm$*CbWB5eT0{2>Sn!WC+nP)`onT44{qYZb+XQy zs1*7?KwLe((5IyY_+sq(09=Q_iXPP10T$kU#G^x`st8~wv0(Wgs~vb`wk8pk^;=}d^?4E(r=2+5WB4C4Jr(pH{FLMiIvX2Eo$ zEld|VQxG~yr-JE5tEBUdQI}fy_TeNu|K(eo-0;AWyfboUo&s@n0~D3=H}Mc^4LMdW8WpF_LQGf#XU`OoF`Z;m=Lrb~l5qP? z6l(e=l#tHws2q^1vfLepWh=|wyOdMaq?|yX_AqxoKa^PMcen)RCb5i4i9xQCGA9=) zC$d@(6OBL{zhE=fD6Xww?yOD`qpz;G;FV$S4nwjP=I&F%lfLeYS4ZO z%_TM^2(k##51J}CIz*l3hr}xiIv-L5Vp+U7>ASk}Nl;z+t4TR`7>#|?+^wUrLUZRM zvQBfqRp~S4Djtq(8g&?r2`Z(zM6s)~L=oV?fJ!FIeQhfgR(tG5VO1v=oyu)Gxu^@Z z)&&HCqcam2+XB>j)@RlhVOEvd->`Myyz!fLb8NK>e4S~;I(9o_w`*e3sp_$lqxQ#S zA9_EtBT|(%&ep&8^k>yw#-!46Bhko5If6(-H(Y8+B677u;YSi%6RKaONU?m>#^?Pu zPK?Kt%+2+=u+)J3#TIWz(T#GxtS{uqGfVZy;*YVY_g0FVAxuZMD zR|ocXHM7Dfh4&0zv5Dd=6otxHQfZOn^5#++F{O|NdRbie@|+H=zy>4)=2?cBnDwQo zQI5OIR|RfffE+C%gF`OZfKm>QoEQw6G!SCJS5@ufZr033M{F^K5dWg~h#Taq)&Au6 z`D&+^?d)=Iz%JLv91mAX-{jP|gA`0uxD-s>oFc8ltXNX(cYJjpd=)XEI~GMz5Ux;& zCcc{ElAGG{@EkZLV5yglGf!J9lAJST;+%WdMP(H{n!Q>OgmY)s-T7*}!|Uzx)oLkj zLGEfKqCB!nyeh8DSK&X3KB>aXec%uhbE0BphQ%k%QZ~@qX8txh!J9}D`1p1C>JGzl z`+T)7mgV^0p06(EhooLyH(b4huiBheG^GTk1Bvc3Ax1fgt?wZT46-yrmcCU|?j|J0 zCC*l^B;Hr%t2+$It@73SXxt=Uoz1Us#k93SEgMq|#HLlUq&j~#tYo0#k@6yyMR`ca zUF>}4))%(r$;><|T^!3%+a4CX!|?2#uWs4>*7<6y`LcW=QeTz{RZH{bLp%JP&p!G1 z#mV2{$a(zM%*78yM4ktJ;fYu|r%HiIaiJ{ph13ob#aYH!nOa==B&t@htMSzxMq}@M zb=zpH@YVT^#zuPI|>a21*tK4Oq=FTej=Z8%qc8DV@Q#yc( zf`+S5ku_0pxRHKXq;xM@g~iq#W0S!_0-Q`~jJnJ!H+8|Ealj$GWRq{N$^L7pp8Dd+ z#duPOlbuiQaVc2S7n5Vc87I#VdcRH9qWwajouAr!y$2t-yv0SIPtWKxJJP-L(eTMg zpSd(dJMN7;pWNPLSYF777NwsvT%YJc@6*zFy|*f|ZFUImd~!RV+&;q5zL~g;*bj!M z7iU>t^Q{^UFPVXYU`L4xbDU&otSnFDLJNduj~UET??GT)b}=_{HR8%fe7nPlA{jOc@qo zZa8MAf_O}u$k*7*YdTwczLeW$RQ79xDDzZh5XWd!gXM;=;#6v@m2_+>tI={j~ zVHT|MMn@uRlGyvz2(n>t zHm{x=NzXm!f$0wqSkn%l;@)vMHoPI-IpnreRE8NopK;;JtS+F84Ke|lVd5!cWEAPl zC{dq_9r4=}@ssI6pu(AQDa>{q-tMfkz%62ErElX9kPC4P6#9ydG^v)Q%M%FqP- z2qP1WmFFv0WeOQIO>-M6G~(H4f2T8!^=dPA;>DCo6?CyB@Y`W@_6_{D?SAXPuhn!} zSx!=};OcZ~27a^{<`Lop5ASuZyz+@$HhJQuB49y_14AoGn=2pDvoO2zR|9@KjK;o! z-`3Gs0e40BnkGrU1R_dmk0e;_{o<^$|$>Km2td;~HMr_vc!=^5eH$SENM2E!B z#BPUI7O&@z+$f`Ja<-iUz{o~AiEvseSSv`8bdihJWFEx|X(JnU_PFccfiCfL_r%Yy zpP!ErmruWRna*ecBCc60avEjKwty;8;E{1i3yQ@}-=$!e-|yMuHh#N1`KHDr0Z*hd zJ6Bg+>kWJcJNf3xkm}XPC+Fp_f9NV%Z~2_2ecW<9KcjO)Mj0Jwq`uM?r9~VCHunV$ zh|{lXkoiSnIEoA7(tYW=b?y{~#%WG~IR-J|b#0NHoMVp8 zUAk)}EE9ZUc zio3n>@$lj_?`8b4Kceny^A3!&PJWLeK3-VfaC9338-k>x({)Y49H#y#L*IC^q8`^oWP z_WTf|{u=Q9*4Z%c7kyjhI{w2zpnbwhNF>fwS9I~A9UPr8=c#@2Kb}*%YuU|eEr|&& zkfdZG#%O+EIS@Do7tjQ0W6VwSy3ut9N9UKlH@ohifByL&y|}O^|D6NY=P%y*qZjX- z{Eza)^*_sB|I(ei{t>fTdWcT^_)#E^rgE>u7imHQ4?pN3`)Hj0!czpe+q`>=i;rGSR-zeWq!;th``IL6BNu zdF8K$Mt2yEeWTH>qp^ZU=Ofag(GHESW3dj6dQbbay61R{U*^rZ+ja_1XSEN_$#lex z6uaw}UE$fG(aLpvNqf2x`7X1~DXP;!7-W_si4g^-coFj*P^Lqp9LP_81(7emyY`G2giL| z^d4DrJQyMy>d@%-A2guN8OZzlfEGRI|Ez@Y(*yCBzxi8(CnOIp8Wfry&xQZF(T;9G zqql7pi%F`ap-6~4NOVGFC?k?GD`EjPY(^hUKm!Q!!Nm4~P6$0Iy>0;u5TRt(7 z)K;AVwx9d5vDIez1zEqOQy5$WjqWfS`$nT%M`Hzz&PSv}qa7OU&}gR`UH=Yrs?kn0 zIu%9H955x8Nu+fd5T7B(!wNs-q>!^u)u<6wk;i$Qc4%~dvEqQROq+QwE{k1!5PL~3 z1i>{r3nbt%Nyud{<%+ARp-m{+p8S(36TJyEs@WtNfzy6uBF*L%ZF81!I8XhE!X^!} zCZ=obZlTd2JqT4$RwSCxs1!#6TQ&+2s#1-0^i6iAFmz`UHQ) z!K62Sj@jzZ2^szV$)BSPacYt24UtZDsxv805SF7p*b44E6%u>rkG8*A6ri8@{F7y33PqH|#@rgSNMw3{RYE@v?;|DVH zZ3+#>l`By>GFp?=z^JT!+$Kw15n(Iz$d^YlIuh|JGi(5(KiY?8bbh;Eu%cVxqUd6S z)z8>*(TX772>;|y`)#>tKV|u2c<1&sVE}XeWs|%d= zGKrf(hLa6R&54TQZCG@=e(|7dVbL8%W8YYG>u9WCQTgJp{@rW8@S6MIY$faXXvas_ z*;pqXeHo;q-yG&dvrQ`CLKcMxtnfXHQ5D-XqR+K<*1#BGl5S)R;ra!qF2vO%n@Ec* z?|mKC@?|GY?WCz?`KSCgbgsRfH1(#Wsj6_sL$4?g;F@3Tk$ z{71j_!#5}Pi;1UC`%eZ(KeEN-*WP^Z{-^KV|LoKEKYnip2l=|2@?108TU=(1NOF8}cBV)DpK(nlee+X0>6zih zU^4Dydd%Mqxs3fY>jad!etxg_%-Wy2KRma3bZ_>nyAX_=eKH(9|LWwa>z}-fHr=Ol z@8bF%GQHn>aq_2-zu*1F$)CC3{y_&}4|8*HK6vutq;6CwOHL+^RD9(72S_jRW_@w; zS6s3`Kl%6k`sKIuIT?jdon7hDzW3tfKe&H>>zWYu-Axeo) z#sFF6hlo#s@<|xdn3X3cE5)d3;1gd$>$kCffMPWbvIIxE2+Ms_H_?2_NbK)dkn`EI zX9s#@p7h6M2JZ3j%pQ_heRgm>IXnIJe*QzeLLG_5v^dn#rhyhonn4<}oLE;YYVN&$ z-P?8@#l{|ID%G_e$zFIYXO83mfmRZ5Dyfr;CLS9T^%n>vMYz6W zxhNQ&1ZaVyZ)!tLgO>>#b&+%4G&|v>%0;eRk;k?>8MfoGH?SJF;C*v|F*_2*!pW@a z7k>w>YK+Fqc{O>ka-gi$@QlETBy(De3gXD)gePBTfGcl8aJpu1RF272q3jMLvlYsI zUfn0p^!YeA$jjR~dps8&UH;*4M4|JLy!)rv){hS#eDL8%pFMu?{-gH~e>}JFdpzBL zJ$5^+!-x9(Gk)5R4!Nth7^V7`b~;5|1Z;hjE{Qlbag+#6+$@0zj+JBauYIk(2sw9@ z5l$4@%~ZCUC3pv4m&)!iB)3Ur>!X1Y@^oB&ePsX8Ma}&1Lp%9EpX;oD+Mm!`{j0M< z{$XjEyd9^ne6z8q_E*-n1}Yn;iXgq5ZXiV4Zt_rX5Ytk9j{ zza^F3VRW`q*?A=J>c&!^_Yd>ov%%?5=j5)JTjBBHwmop2%C?&?>z6%PY4N#4ty<)M z9)$s}f3#!Kh$TqP76c}y|#hd9NXd8+rqK07l6cavodY=w~0xTFeAcSTUuE%g9SG!&mN82*r8Kap!I)N$zD8k zsnBxri(ti%7f9*#6FsQEf>An?>^5oCU@?~TgL`x~xw;OmGGWBtMppW|#X~o~!aQzu z`VqRI)|JxN>WFkmdG-zd9<<@7{lOE@)~DOX@7i~&hs?|W6`7|8G9$oSdOm?so!jxe z!JtFR9a6q2q@0qET_|oNc|gyl)SAGXh$%=!c1C(cXtj$mx?@OLf;Bk0Q%<=IDTj!D zCHKn;DX*HFObvxxk@&qt3Gr`169D?;n;|_Wt4dd-u0o z{@&qxZGLP%O7q*+D@m)_77OQ&BAcs> zCRom|VPX7;9Y8Ka>>ZOt>D-U-ZKh2&BgHG0ajw$Bst|YHnl$$%` z?KR==ED3$f4|~4MiOa#`i|%A{s!;4jzQ*N*7~3XLQ74I<#%MwdDp2u@?lg7i8k1g} z{4ZM0KA!gde)s*6foJyq?~APWfcZ1FXgdCP*^<`o6uW2q-F`K00aojvh~sNWA_AAA ze(`s}->IJ$0XHsBS<<3pkVOdi6C%eozQBG08;^j0o8b{}LPW{jI{T{ldxw#^CHy_x zemVXf*ZB9&_ z{GAAhw@>1;%VY4QjAG{=>3ga$M*B8H(Z5-hOy_}H!D3&4$*+OGcNmSW`1|pmM`Hzl z&qt)A-yQv~yf^|9f zVc;wS>5z{c%)48hQmBIVai%=?c~@FXcib>pp$n(?29p7UL}|v zPev9=_Silt@v6bxc{J=Jw;qCC0lIjt9Mr$pH9$Fql^v%1@U!<1ss0ZS&orjkqn8p> zzB8-L^cpec`{k|Xc2&A@65!YqCccr8MVw2Dtfp$53Ho8Bk^DCbUX`09jM7XglUtkN zt0;xSemj+E4HVp2N=ea)@C?ekso*N8f;`ES%lrpY;+)F5B;6L(1rvsO3 z8LJI`$)8?Uy>O6=TKr6Ibad2uk8=Bva*f7z8r=?3URR?_w?tu*NO@QTATbQkx22(l zyGYidB#218uD1+ykaACu(jATx6^1KaXdm}CqX;z>D#KN2 z8>DovhUz-3%E`M!%63QCc93%ai}7xZvOKz`p-XbDSMzsZlnPNyP>{bU3e5Lprck!4 zz%oMk^g{b>COGwOWR$!KA9>q6j`6CDa)*JreMVVVg;L?zuJo*d^=gLjovn}3B@*2* zPLd1*L^nT3DG4>{PA0P$@q%7#YDHS`2G&PpNxJgD? z%`aeYedHP#W#K~BGJGK-`tlexr4gRRbj*Z)rot2_8%K=SN3DkDrt@ea6#Z7&e__T? zm)b9;uRZOz*kO3~%_z6+fa{F1)qGjL5V#?S4%XJM`X!8#;2!+l@q3rX3H=N>KPw0* zPbGEAEO&apRx4NprMwoS++j5K%_z5y#tNgHk4VQTJ4V?tN@{9bl%~yaaY}T%=+)h$ zS35@8G0K}_lrips=q4xxU<-&{N>{q9pjo7d9=Jk^!8Ln#fu7mwr-}Y}G`$emtv%`KJ_PZ|j z(@}1$CdHfJ4J19jL>%G^PzL6Rh~9)Sfv&AR9roK3_H)*}NYaB9^wfm?Xba)&QWy|M zh>C=aZ7(SzI!7fj+9`=C(pd(s*T!o^qYNJ*PV(y5uidF|&)Bc^V%!2K)e7Y9G?;QD zUMZ08fc@|ka8CQiGukpFLg${gxZ{a1!s)t*;@HQ#Zhc5r-UK<1^Yq%QV!s^*W-Ioa z8;xG7gS)yjFH+5&s9!ZfIFK(r~e;&datYLk4E(65?ZE4a1+`uS;+36*olQN%w> zQ=p5NAu-*dOR*?yP^8jtLd_`oVYb@b-H}m7?+Ai zA%@jy?pYl8x$=3AFK-dk`;&6upm#y(Mj`LY3n~{baxLh$!)WXq`fVMJ73en~kq-KG z(C@aO-@^HJ3d=gv+|y~2-4@_@bAry!G`BO&T{gD<`uX{o-TusUT4zNnVP;xo(6hKG z$WgH*-z3V?+MgEOcxM-I_PC8U!yV}DK<`a~-aHIVE>oJmeDJQcG23qi_oeESWH{#8 zJiK$Jxj}Fsac~Pb4_qQfb?3^+7qSAqZ*M9xtZPyK_G?(?b}6hqeK9%4`*iaBp!eHY znc6S(+4-rx*L(1Rvol?6kH{}Qvm@QZ?(NA)pE-A6JMN9oEnNho@x5M#OR%$EFGYFT z@QZt;zIBLj5Bt;MQ}-{!qOgN8dc5BK!v&4&QdmFjq@H_}dM>_M4JoW0=Y2Wloo`Re zTQ85glbT9~fGQ#AI|y|oOs-UDM3(xJxYY<7s06Wxjp3hZSOA5QDujh|;DY;FL_iCy zcxN%MjL|6td7(o~EH4)%4ilpzZKEWTzOH4kZdP|<#)t=P`Y7;^L~x|qs5?KY%B8DL zVXNxSwm1F7aJ+s>7#+8vnKkGS+$&*}YDSg==~HWlXJ^B~_+U7Caya|R@nQD-kat}h z({G&(^M28Hp~U~iSw8+l2f*FO6s6TJAJbPI|15v~OLw>X zN8IhChici69|Zzec^6RZ=106De!fK7$+pP`Y@NImSsK(mCZpIS#KuvuAe2=WT9{T- zBnl{OTo3Z@Fe0xa%mLFOO1{_KVx4=G^q81ZSJ$v zS)}Hk!P}LcJB-f0A@8=`ZyoZsnl24%8jq`A^-GkU5r!)C2C} zrPrP1aBGC?Hy0#(WZZE)7*F7*9CWp=*5>7hZ~V^vy{A8`Ucg{np{>?lZm`?O&mv~O znZ=&ca7{mwm?%~EnetH^pZD8D{2jxfCVYyVJMQ!|Br$Dofz7-kH@t)hID+Ju%_N1+ z0;$3*Nvdq@)hB3rHGA?;xLTjTIQf<7Z*P~s9sk$k|5jFHhUEe3y!`bK-7)Gd-)uVf}U-jTC zmkZYoZTFQY+d=3(LTKXW22-Es&TlxoK-xfl-~?;t1Mu46UGN+J)s23`zr&5@c4fyw zo?&~Jpi2s(B8z<-hhxp@SVRRk&`?GprXJ2#7%5qj8LISX8aPz_M#X@$hY7DGVb{u$9x8X273gT5z+aNpsxGj%vxj$JT zy4%9ho!9WB!_oT=M72dOB&BID&m#^n1krg3=CuSp;@yb?N#}*EO~npJ?+Hh{V-dcl z?%-7C2TeFShzJVAE!B%uM7cJ|sB~(2g-NbU@oqQRJ+|-~_Bjr_*q4&E?T(|lb+tIW zw!_i;UW#|4(Sjpu6vR$|UBB`>(C9o#WNtb17Z`|8*N7vI^!y@2+$*Kdm_^&flI~5A zDxf&z9M zrhSholBnEE5^6z=v-AtP1oDW9w$9gT{M)@CX_B&%uU^?{c!wd`ilg_LhI(sG!?XFd zva&Vs=-f{uUjd+*GEQ_%Bx(i^_2L{Ef51irpwD!iRX?=U?3=F!`B zzjYqnYQC&o2)C-Spe)UoX3??D1CmTodWV7L%3GJQohd;THNoKs8zhWKT3vZ6d$Sen zAL{dSs#c{W@bKv%KLF?cUoMS)$@6)^$EUu}JB-G@dGyxNSmDw05xHF+T_e7;l6Oao zsl5N3(BhjD&%Qo8=T>w=(s`EsMAPJR&z`SHb#vdKauxEtmvEzgBB?a2*k zs5A%RI_5iljAW~J*Vts3;vg+FG4c;)m9l2V?1S0O z#xY86HviUj8@)c0PQEz#>#_yuKb61!XMX+s#XD}>{WtEXzD<>Gcrl`wGI@SpX(V5N zFwNAgmGa-1{?y}R`l@CUx8KMq4A@vH-*>lsotnrm0zoV~jlu|`!qjR?&Q`?+DXmU? zl|?+l*pMEmSjBnm>0dHN`TJFI^Vzd!2YO_l^v5O1J|3RgLyQp44vr^hr@!9Mf0zjo z38fPoS|#~#I#xynD$^4AS7h~qQPP#Ypn&U;k|a7rv%#YvJd(jtu%;$$fRz8VdY9Wo zvpZ~57H{#kK;@b|xN}GD+>x*Ajx2yS3BCPZ9HdT^X?)BnZQ(_<_@-r@Kd)=pJ5ad~ zP&qv#1(7Hd80&@QCQvC%kme~8mN3Z~qFf|iBB(D%F)o%c8Ivk*WtUT!*{g{#6~Kcl zg35L$*><4vCYIwC7_3&-FVCPm)V$ zWn73X3h)l66$~|VMnb9tznA|F@tPjUc zS|nE!Y=xUO(8>shca|o|GV2qq{xMPm2&JbY_KVCh9XXG-_0?@{A_Y!kU5?szTDimU zY^9ZROYzmsr9ST;=EG-$)1l4}pZeu?7{`eg>KX~tY(X7Zvaf-q&zj_gTdx=O1@08=C=L-=75vVotK-m3?0B#Jjj zLpzn}Y#f@Q?Z#1gHC3ja-EXG^y(uLqtD+E66`mz5h5byb<$rv2(} zDM7>NKn1+_4YXCD1dUT?163+PH`CU^@M%X|`x8Crb!t$YhoAO`)3||-wsy3&qpdSP zpArlHeT+`^p#QTHK~K-qU;gHA4W8&Hw)d<*IWB4RgPG@$lR|$m^8?}^M#GCI$Gs=4 zwWGlq>du}!jFuSt;Kj*bIGmVN$JCL2cJPF!ySS5T(9N{<8bkno7!h<3 zr8+0?3N;7uygDglEr^y{(E?>|rmg;w3R*})_fy_q-l#0zVncuts_L-e%*VXX2)~ite*~O3kGSUKlI(+i@H%cM;7n51f!u@J}BG%xiK#4VmLY*Kcb9LIzxLqy+Z9v z`n~EYb2~PpJ{8N~d_H^5qn(~}>0Q@e;EmyF?p2p{`ey&}9Qz??VzaI8d2w`*id5X= zFH)yCTU^sQBpqh%(mn21X4r4#(vL|Yk)GBr50L5TrIPkg?F*bkQ$b2};}gw#N)}Iq ztzD5S=lG^_6mmg==cH1J$COt#GqJQ`RC`C?Kh_YK@#OLBi6;HY>7s|_gYwQ)`|;P8 zKm5P@*KfM-(VIuTH`z2le=;1rd9U}T84gEzf1pXb;9q|7lb_5lQEzsQKEKyn{!4eA zrhhrRcJ3z||I%IJwTG8~`T6I6^n#|{|GsF?+2+FPxQ;k*KIHxij%cE-#u9Cs=LMo2 z*Rsov!$ZLH5^ZfYVV19iTh}C4Y-z$Y)7But3qr7b<#<4NvXCLNT;%P(uW|DW10uV&g6`;m zHB4U9thim7w7j|Oo3?Hpj#b(^ACiu?cC@vlt(~VYO4_9G33JROd%(bwwvdOp!o4NN zaJ!?erKWMN74B$jM_X@-wj$*ybZmrYG3)iD_OT(3X(qG2^$7@;GIbKsJ4Rd8L4Zz2 zT|!&Qb5TzHDrrotXzQk&wXr=%0yERLavCbNtzEwA6rFVWs>8uS@Aob!%S}yqv*E?0 zgi13@(6NI`#KcbJkK^Ov#cAHl_+x)WRS{3#nIiI`os5R(cpGn^+Re$bUB2o*rK4TG z>K(MR{lTVu)z7N+`*tmDW1QU!SrC{S(*qw!B2=>=pcP(lgEc8UlQb4mUQ`s?6pt@b zZlVI0dmq#MoYHlzlK+wc%tsZU*(w*cNsw4{ut{7LR0wV2X9%BiEOWvT=bU^Y7p=!S zuJg;-BO6D^M}BnV%OgR4pb-C}c7d*=7Tw|2zkoxx#V^-%v7K79Adk@K0!e4Q!E$kqYM^-_NYXl92UB4y$V&|Jaaw$&kV&meP$ zb-4v0s~7y;@eoy1uzdA*kd6A}+a;LKdkNxQKqkLr1Q&Z2_XqO31dTcj?fRgsya{A- zb1m>2$noF~FEEywfFk z8cCZ5D_!A7jh3BjvjiE=bunhUib^?Iwqndbu6A0NjtHCer^Mlm4>q#6A+MI5$Uzf$MrUGn3rNk(@Vjja&#@t#Lx1!B%eq+^&J!@Mnq`TB_- z;BiHndg}a1IxP8k>;^OG(|L$u2*G_WU1qhVS1?Xu$$hRA5G@|MQJ>f)u6Bv51KNc< z=V4(o*G^@Gsx)}tbme$Mhwa80^!4-eF_Uh30i9?el||@jMRus9?8OR96IaPt)xsx^weZ2eG7JLlD%N@h0jxUEp$YF^;%cdEaR!Z-x*GdVXG_#N zY`DBlzPr&ZaA+pO&eXV**^YinxN;}6{k6B>yN{@3&^zp8ww=tjli6y508{}u5h{-b z;+8PRvgbb{YWg=Td&V!FTKL_KrpBL4?=`opvL&o7jWUsoqDcKD$f=at!dEuR^MH-8 zN&HwMw=L4bC~FFm%F{ecgn&;MB-95r276~AbsXa~l7QfSj?ytfv>7(efO=Js^pIJ9 z0jcY%zI8}lw>0*T{5FvK_b#hhIf>@jPG)7@qoek_l-p<2;VO;q7}ugj>h7e^Bt zXwMo$pE$x=k04ge(y}NF69k2)m={cBj~OX!-_L;}+1fMsdpH zYplddU%(DzI+W4|89uDSM35cBz-SuHJRQXuy;o6yTmKd^t$cc;MKX`Wy(*dBVPv+F z>Ak0~)*W;y7VLzkt0@8zsuRvj&~!n|MnJ;=%KnHl3kj06-6$&fDoJHRCZ$RmDd*}e ziCFTki>7xNlC5ZZpXsah(YQ%AUCpnR&W{E*%{Dm5A_-Y>#tt$FsN)vYaWfNZ`q@Dg9hoj@SW)*at8L+>AP3Jld zxbiq`uo<`fv5@~idvDhx$&sJ;Qr;J8mzE)E_Xvj0O^M>}a97Ok$oI_N;Yi#WndWMT zq&y?q63sJ?h>Yy6W_ML@RrL&KjRg!?kR=?#hMMX< ztMiMj%BrmFddcjr>6soSchThZbk|EpMP$VP_kW&;$Pt}mjN0hRyB;w73T(Q?XzZFz zZyk*qo1TwI$EG_reO+w2G$o#q>CVk~mh8F+fSq2ME;}}eU2I%a_DcnFS!Id5k+9A= z?DT^A3Eg3SrkqGx8ySOySZ0y$WS1qloxZly*FGtap@kca&Ac!VPP3tyPpY^|c}rlTM@DCM(L=byz|J zhZGzoJlrIrXeEhQ=10O0Frm0KWo>qfy-v!yv>G?ycNHE{9AD!&rfOd0cP%Jun3A)M zSkCc`fwIyr?WB>89c^?%GgTVP6xgv*|7%}_AEar?C@xD`Ta3*0Q&ztc8_S2UEoHS+ zB&xBxHIx+}W1%xJ5&pLUwyaS?Gkb)OajxP>_1m)-KicwJ*Oe^`!q89p*QdeR024c14?uqajS_ zCVuBLJmoKQg1V8jb{w?hpwEkg(hlt9+D#nKQ#cpo2@c@ISU8b~4UFgd0;8)N$3f#g zjG+9Ojll*E>U+L*A}%=S+vSQiPwX5!{qgvmWTO7Sk>`i!gaZ8(i;$;#Sk^4|?wvx0>tKnqq-00(d6@Rj$PU*i~fl zC1Hdmazb988}awXr2rHLaTvI`!bxAeK$|%iq3d<%Bu~l4r);kEgO9&cA)^4j>v0ep1RbqVNLJ`qvm!MoN z1u>P@c)_~9CJ8~68Aq&(z^#sV611(ChM>)ku+1Ro?ib?*bgf#v=ja*>JU^GOeG3Na zYlb8x1ldKfMPsw=!j~{m;@2|~YCIHhhgdNrwHFb1Y0A$P1mUs_w8g+&KLf358@bx; z87TW73Jld5vW|hqXe?r395+gsB;-;vNzg22ZXWrH&|}wcpvM-pqlKlb>!lfJiy^sI z23j4B=gL55^Q+clu!4bR%$yLvUB{I|J9GrFw57;RMa=ETqbbnM8I6leTYVn+?%Yd! zI|FSoJiBI~+jhWJ2HI%8)Gh?8T2h}ct6h*~F7O^eUz&s|T^u3)1v2nSbw~N>6V2{Q zgPTu-EALr@)+;d37NfCi2D)`LY7BHfA{_(m80banCUJ<8xJNmO%v_8>t4kGo`O zT$$7Dt0-+3rSLbFpxs6;)hSI^^UqFc$~Gs)!IUm}8Y0P{@06y?g#4Qe&Qv-SCy|t4 zij$HGi7gL|?>lLhVOX46pEsO*;TaLO>W7-^AX zp&_uMQK9Y#>+>S4i405!= z`YV%M-2;JxRJs=>C{0Vk`n^rDLAg<*nbOoN5$mn5zV_NQC8ejy-n1#672-yz+-7&) z>yIa+zMj}D&%48u!ufKq_wdO4*T1|idq*Razk91Jui8+&Oiw3-oez6@czQra(EhF7 z$eg@;YcR}*Cnv)vz4JqT>&_>|#OeJ3KX`jz-ubV8X`TOiHak@I2c&}*FQ7l}oyezV z)H^dH`+b`kI(?rDPug*B3X*&3>DrfkYrNw1o}Oiz7rb{ke7yQ4Hc2L(zIHjtdRDqR z;HAn#GthlA?mg*GUSL%0Y-s1}U}bFO$n?hNr>An%|EbMk?d#9YgiC)un2dW0`^Bus zXJOJmHFnrD`ShLM6JtKNe|T!-=$+YD`=+&=n8V@dsr|e8Q|!1z&M?n!K62SIws|~@|w*TXTy;VsO=B1k=$_y;Pa&fpWmBJ`IX%BAISH~zsO{#SsRq4ZxC7+>$=OSEkBTj{Z@_6H}N<)|n1;t*ZkMOIX37=;Cw+PH zOfKHhFL0Z{yK^ERO`e|3etPL=7eD%o-1sC*^`qY^($2q_OdtEp+vR4cQ)})}ttmnx z4wFPv8}_NLL@9C^vZNh1j_{a?R3>#$8SM^KUL91HXAIk-8q^FwSAj};R{}ynZ7682 ztgeQTT~>CgV7`uJlDX8!R@IcJpt5|nCyFfCtM%U<-|GlA~s3J%Qi@w z%O_-#V4N|VB$o!2Ek(XF6Cr-IEyC|PjXV(f&sgTf`AWa+-(YsG51m!%# zEb?OC4apEEH-ZiII$Ab=vN(!ko~&5ewsXoBqqA#Hxoy8%<&=%4OKmwxS<|3t)vLZn ztBKd4K@}T1egxd74MyXLo4XF~akzSWxzE<4!~RCJ57X5Rv;vsSFNWR>Uj6yRjbr)hrvb7oPf6(%;H$ zCd=8(XZTh69>h5($32sANVg2#pdKHD0*cLkZ{uTsJDU|Fonh|iSuwJFuE?Z`c4KP# zk!Fh+%fRV4<#ln&U%IddS_}(2^oa8ui>Qr-WEo8iH$Y*Mz(mG3abAAJRz1kZ&%^Um zh+ZGnsfQs>Cl10e-}SHp&odg!$N(YjHWPx`Bb7(*IGukqXcQBt{s614m^uD+=-6k^ zj=wYg*RA4TNB{lkuZsiikdxYn$7jXYpV(8|TdvXcPAOJe1=0>8g=;^QjN_LSbg`Sv z72NV>F25=5+%}3==8~V)*y$)Y$F|(}2~&(BVwPBZZx(&=)4kXYg~zVz*ODdEf8_lJ*dRO(9jvhd!#M)u;t8^QohHI_o5m&R-1LZq~W5HjKi$ z%xSt#Q{T&+OvNa{V?QLRa7*Qq7lAjnwV|C>E-y=7S`5q!B`@1F z>9TwwVmEfZW-gg|n^lD3XU}FCf*pBjPF@5(vtcS&mBS1pf(W)o%azTH7cQX9b}c}O zZW4J34%}cb3OsJuYsm{H+cClzyDu(2R2y|KgW+Rys>}#$K@SR5SPROpz4qGetpAvn z`KKr5-CGm$#l(>({lme*k4--L!L2*?Z)ac5?%d{BJ-9Qg?v(_+BBt0TlVx{6l|5_U{6&4wRo;C|AyEAyum^onqM&kJ+h>j3 zFILRT*A80U1ZcHUG4$c=-f0y>+&iyHF_f`uLB^ZWT@gq!f4mS)P@LoBlcYK}R5w+u z0#}AOElH2>_@36n^K|07eo80if|9&s)av)jO25^~%8@?okF7#>|7dt>_WM?Xcr-aZ z`OSXzt``~+ByrAL^~iEzW0%KKmYOIxJ`F%wMKQD$ThYT4J#>SEP#lC8lGIk1CGMo{ zeR5P!dL+M*0w-}0V_?k&uS2vC(-+~{#J4MQtQI4)m1BKY-ilA< z+1Nv@Z|}u3Cy3$?`y(@+>|3=zD*f^Py}R#!@ZizC_a45tzv%CIG_46dvfHCd+?!>n ztw7dniiG@Lb(GeCETj;$;wFKUhe0tS0qwR}xe4v+kQtJN$u^zcbe0s}B3A=hEr#Se zK~{A%{^|V(4+_tQ-yE5roHMBJzHcUX<(X9dll}ykj_=L}`CWdp$-u3cUNua-0%Qe< zSg`&^2;tkb(GUqyn&7&ZWzc!@-lQ>%{zdv&doqvRAWL8|Xxk-3Ek@jYtQ(KA?#=F<*Nd_U0x^<0nHykMr98GaA{W9!ofIP&KOmO^^B1(#3afCs zb-X~cVc=jICo$>@U8zUkSd@kBUxa^DmTL;L7~V+X6TF_rSW9S+^qLCFs>(=Ky5G%F zmVe;JbyK+Kg|e2nUDt!MyjBvd4rLwe@BbZAWU+AQIB<;1()&AwW<0_P;GEWB~t(c*XFvC-kanPPfiu8%+Yec!&daNos)=-w4 z1QwiK5@j_zQ(q&>T3$*UK$1$)w>V65BdJ~d7APxAM5a831It;UBI(&3Ek@?WqAWOSYm{ZDNDVlyLs_1i;LHVy_dp{7eqIh4 z4dkl1IUUWJM=MdqG+$P%YIP0cYLsQ@=g*ZjA~YT=n2D*6 z=A?H$F5P<*5Rn5toe|1D62zR9m?uZ*7HVL zX&RVZrg;2Xhw>n^X+&t1kk|^NvkcBGi|N9E6ta~4P(tGgm_kaA`@4i`AWxaXF{_X6`$9HZ&`1rjKucFF& z&Pu2zI;GxAC`-D%UtHMR`&{DMRi1}KRK#!3KS}6!ZPON#@o`V8;rXP?F%8^-BT4E*oTn*0+W`uxxWZT}Z}$RXq3Ir%71w*{k-Os_ z`0jNfmgVihVnCjoS_qKjIU;%J#`cYdQT>fx2pBqAs5Cz)JmHGwgW~>O32pmefbOaI z8`6i$+{ER3z_PsPogQuF)2zJvMIPO#GCrN)=tc{UBArsMNh3_zFr}xCpAhw74e(R) z>Xi}JU%E2d9i`a`rQsmr?_p7%1oX*QyTeye8srk3X|kAj3C5}L%}cS)aCDxaK=QKG z)!fJ~cID40&GgxX@BnU?r8Lcsi`PhLmRI8j_5W#kadA#0?ynZA(t^_XVHVR9nK&WF zwTwv$+?0OqpaJ$Vq^Fr+Q;l=}BEXL)HtlGrOJ$)zDpixIg-NV7B; z&q;4I|6s?=t{Poi0cnKDu{*XpJ$nZVG&QIsWeh#*=E~f_F?568X#QkA8|IQfZ`T{O z7@e(<=F@WX+f3lHZ3nyrX_`!z6>C~e<+U)XTap{4c_uSq6TUz)P9RB|C)6}?;>4rN zE2ED+$CK&eJ*D=9+>zXJx?GOYv>1)8jONjfN2AVY$`QGUXr5=B(9f4~LS>RkB217d z5jvr37&|vGNX2~Y4?`^#v&ohAU|WCZ5=HZR1bzJ{G^a@xA=YBK8Gb zetbSKxRAMAjOi1G%FzFyBAm4Cr%e;|lc+p)GLP>o6J#o5?Jb^g?IUe`{;yAs<;&-z z?KI5Y5DjV=VWyhIp`$Wdlx(z}^c99`R^V7X-~2Z>KK`n_rs-RY%uNh^`uZ>v$TmJFBBFePKnoSRv`(O? z$64Lpq*IDhtUlCjv=`WX!SWL~|J9Ap@U7X8IV)z7z_B&)c{TzbIFBmcj$;4jhzx0! zM+*muX|rcr{V*G!`IpLPo7y&|0ck*w65V1p$qX-%BxX+)C86@+ibmNYXFs4a1H z;*$L3+Pt*X>f*3O6h;RDQ695rx$p=ZpYNOVkr|ioh)SUhQ>@A9Mz>Z1=%dpNYkx`9 zSD4e^6Q^Z1+tP1ue4gtw@ces^e_Fm14RbC0iJ`4rHJ!!|DXXy)N=#qe2G0pANH#hdg%mn<5*?CQip+p4MEdL~gpjq-JzP?GnDLo0_?3>|>8X>Uws*ebLDle!cZ$mS zaB{@6PB$s=%iIjcq+PA#urv47`4ZL<=u!WWc(9X`r@hjB1KypFhNs0fUPB-54<`)c zC+4WHPmCSHhacR3&^t9`YW1EBN1yiy9kWAHu!vK#$a>?a1a6&HRF>uoYmUZqbp)DQ zB$jj3D@Cr9AD4lgYmR(hT08r1&j*Iig}d_v+k%z;{o&|P4*EZx8qXD_xi5eC+k-=< zK$U(I2sh=X3Hi;zXIuTe`=pODUa|Y`DE{q34X55alV;#QWQRf zH$mmsFlFr;0kofTFvRaB&RpW$L;BW9Thj^I$*D?Gil!!EFE5O%ayr_BD8jNb#KSQP zy^M(Es#5310_a>~a6~Jz;r*}?lgJrEpY#YrbUHiOWC5V7$ZIoz76-T^2qFHU0?Afr z{B|4_#0Tg4`Eyu*pB;Z5kP(i_lVv=5P~3=K034< z*6HW82vD7IQu~#ND*A^xrd?zORkX&LCrl#i&wNRhV6(GgGyc5$#kd82o}CeW-@5{S zPW>DytqvWy8Im+q`4nX%1}EW$jY`mSZMo^k+;2=kWziQK1bab(*9p7gl^oi$dZHi+ z*mlpBv0GEb>CEZn*y)eQ=O%Od14o`8o{uNCF^mW7gwP#^&VcC?b2uD5wVK}fXJ)V0 z386a-oqL&(Dy8Yn#Demq!~v+o&?&JfwgUd=?AQPJ_}|-I`_B_LKLUqmwSMFC_Bo9NpT9oJWmulkUXSAl6J*RCyCOLM&`Dlo;Q|4+W>4C+h$MXAi~e2 z?@K@6AVwQw7RhKqp{uIz%@jIpMxj3{yDRE)6-zP4W-?2VIyh*$6<7?%b%~%a80vNq zx`WVZ^p2nGvDppZapGt%6{)b_NO91ttQd24JXFURuRQ9r>i$)+%tFD^Fejm&+$$io zv>n-AiWzF?MI?S`zELIk^9LFa&qvx+9tc%Vo`%q$D9mV8_7YHONSCx5%FxifPV;iL zljhq;a`c#9{ztP1n)D|plyHg{_4>WLMQ2py4ZKdO@}w_MW5il4j@Cy0=F?9BBZ_ch=Z+7u6eA8ay={Ms& z*X6R?pDe!l*=Ij{M)u0za6LbJ_O>lQ{SW^0!{h&1eElRFc7ILojkS;=ZUm-RdL`j)|u;B6zwsb7m4TcvjzNkihSgf5W3kxu^EKk z`C8lp(_ocVoDb8`?nkPariBDLA=}KyAsAE!hz@W`cM?CznSf~=aWALRxKeRjvZC3G z2oUHp{>6w~mO-}|mlw*QfrHyw+VUsX&X0&AdUcT2NTBiK&u~;Bj?^W%FVL=V(txeE z(GfA!F1FiYqbcIjEjk;J%S)gel~jtE^2(v-%IxAgRtIhsdd~gK4FnaZka9dewRTA} z%E1~a^mFj2Yp3YNb?w3|DyDKViyBCvn~%<}(et+5ZxuZ^nl7~qk+7!md)2GHMgpC= z$fRO~b8&>9P@n{zXLQKg%b(DzA*09&8yj4CPB2$O&n;H3U8Co%qftZ8^AYLLbBCTg z^xUCmyRYxib0>iw)C!pOHiS+BJs4X>+DtXIQP{gAVxFmbI|=lv=9Zf;fo7xW;un@W zen$2;b_#R~=X7&x6QOaJI4@Ywwwr~XL$PPK)D|pnK+mb`+jDIpcK`0Cdh@9q>7$N3 zXFa?tIsvrxBJap^CxHIi@xNj3`8%Bj_vodx;QsC=@_gT}=+_ILNwx4|BLZNnN_37v zC!uxpC6IX+1q#QZG#9=KeLV0oO+tjsHHJAN$6Pgx+}x{Bm>Ub8jl?S_P$o{W?27S@ z!*yGSxEzI;YGo!}famJl-3*?+gFw_}!7Jp?AMOG?S2hCI&z(E-?aA4=X@F@bes0E{ z>3hN33~)x|4(ccANe4Zr#@Py|d?nM|WGf%2x55kp=asN?i(z@8*qIMrYwT>N zN3AVm4R+?L|cYO16;Tg&6SU0TzmtU-kHKV6Tys$+!*gby$$$J*DufBzKZqh za?aZ=Mq}65dFyD@u=9LGI_%tG=MFn}*tx^bo%41Rl-gnE4m;bm;;qhk+hndi@J{;) zVin-ItzGQxQ!CKJswxRmi4nQU-PH3VVi|85b`DaM2tgWRJhTBjM{dy{x*a>qvr+$~ z!_FOcHgYsI0`IVMhn+j@JlsE(n62MH?EIcx(XSUfQvr<$%)x0%ASduV17RlGImsmV zA>n4on@LMSVHl{C@3^#nA>j#Pc&sA%D1Q~ObBs`s;1&X^6lQ;}Omqr7AydjrWG+Po zJNuQlyBRzC2VQVp*txP1=&6EoKmNa&#UD<4Z-4o{k+$*f|M*-L5%1VQJUjl|;?Uge zlz5HUxv~^DAet3KQ=ARSYpxN^7TDP!?9XjBZ4l##ML-o%wb%^s$0)^(JJBZJ=(ue~ zp&U>n+R(0wom&jc3&qahsn*!pPLH~L^P~6g_Q)%KcD$5eOJFCY%p;f5;1|q*kO~(l z?P%;&1YK=uVr7}zuro6xv`JhAN4vDzxy6XQir9HJyZqX^wgNk6smRG%A@(jHM-=-x z8|4><7;U>+xq;5`eO@(awW-XqHjho;j-6YK&aScZw!Lo^J2#pxwF{BPuFrB(y_>AT z&I->ZEfa3?LCQT}Cd8_;77=%8w2xXtcxt23_I&*c1&invuyc#i*fnT|4Tv$zsFPxG8S;5+-~0y}?aliKnsV6OA`|*g?TSTop9?g%Fs0Fhzz7O zUTB@GZ+A0v4i5YaD&Q4b=li?RIxn^X9dquOGj7TScmGxy9i5r69`%*Ue)x1|27OR| z>c|tY?$(aAcyE?YU77E13{Ns=*=73I=J4}M7Tc08kOXm{qkKxwxCJXG^)PY9-V~sz zh0>X-ypWDL&oBE`q|VdB2g1s*7J|BpIZIA!+QWO6#$b+U*fTi^iZr5YV-9C3#ujyD z3hJCW&yG4#Jcl#wnRBxvVl(Ev|7X#AgW#X7RWh_ygW^m>v%3_xz|*=k*B^iv-GfHRRl4L|!@MT$x?9hK?1;+0a}WU~%Ip zA|7aVN(iox?JP1`h+DdsCY$xP(*sm}9FK*yUq-uw#iW>zGvq|pRv+A!28Gj`t}ItZVv z-F+BEaTn=4N6Ym@=*vbr&xo4Ky1%SSTg976T?pZ6@P)uSp@t%cH^;^iA>U8)(9?z! z&P6^@$7#sbIl>hqkaC00pD?E&V1<;1! zus-xaW`}49P>q|UN<$|u4oB@p1UQQEB8uU-Y@TzAL3yFL8T{TJH#0f7j@3b0hnv|O zWswy0VDv{~Eka_`a*PM<0EXP#L*FdCs)Ix)HcJ;1szQH+y1_###cLW(w!;Z^F%Eb2c%j z%8Y={wo>qi+;jff-+tw_*KXhY;FI2ihrj>h-+uQ^>s9B-lm6l0;KwGP{NT+y_HSoj zKE8AN!N>1?cxMJdbblJF-a8qhkLeEw<6eKzn;eg!2wnD_1uPtH$OU+(oD z@;8~B$etb!CbB;;+4Sf8?Lr}YYh+%K~MtYC?!;|u%$K!K;Lp@#l47bL; z`(`p4o()fUWrNw0^iD_pzC^D9uf z%5r3SezPmLXbOg??5_r#db?H`^Nw0Ziq zi*z22xG1BHkKU;q$U{?nNXAdGSw7t>Oc{Gm8T+}B=hAVGB;2-6={b+GP z?Vs)*^-bP;X!Oxw2*G?h`|DBf?T_w0{OEf<4u5)>@c{D~Q%nOs=JvOlDu&@3o5SMi zPt0R;Qh9cMWWYQapEE1%XrGV!gTqz7sQHAChJBu8$b0G!ezc4b>JX2@# z^b8Npzbbz9-t1QwIP#5I>gkajAI*O1w}8q@;jZmRXq$8CYZXU9LUv(>NXlfmZi_s| zE!70M@j{GK(=3A)0Hp(okf$21dSl76h9LN&FjU=jxOAPkQfuvF?v5 zFTC^EzR@1r_zfsfbL50X%G-m0bYw=-v*%@AEL|^-qE7Gp9Qd<6ilicH#GeDHQEui= zln3}a2gIL}z@0d$kG_)@V?RwG4;N8Qg+JS8b1{G}QB8aP-0Z;Ej6Xk*<+uUhtPq>x zs2C-FjsCZw&{}XrM%wIfQ=?xyh+HQLY4w&Kp`mne08ckM1kcW^G@p6EjVn>;7DIF0 z6k4SF_vP6GGkQ!A3$&^gg)XN^GYakD$sAklIku0eFlh2406oHqK4x>}!!vcb%@v@S zB~}f3Rnc>c5xGVRy)+mYl~0G|H%I0t=Vm;4_kA9g^3SHcu6|FU?>r00rQz_Oz1{l3+X{$XMeK}Ft%dwq8w-}vW zQ|N7b;3|b~G+k;JB4$l%Mxj%olFYK_0Cy#P4kJa&8Ml`(4ygfp9$SLE(Ur$7Wj0+d zN17ogXUQ?HLZ(jswxhT)INVXR zARg7{#oakQ#L3`Y=xLr#pN(9;4 z#?PF@&!l4v^F|6kQo%}_=j9jS$6jQu#jb>)Ta3(B1pQgL0-nmVvA35MxARQz9S$Gw z7k}8N5pS|T!;|Cvdw1zhdUWr-hwtrwGH-u=G~ItavR!@^1kGK&!6+?%Xp1RA9w6f z`zbDcI>u@*OejL-*zZZUhz=#FFeHiC&)NH~Xs@|2jS@l4repqtH?=F1u>GqX+a?-!j}tq}TO?07h85PC5r9fj^FbVs2( z3f)oYP77VM^FQ0HhW)w~`e|;cWBZAD%TGK%_A_q2(m>#lp3wOn`A#NC;PZu~!nPC{#}x4mF5^+YHr#}sq?782jjkxDvq1?|}B7aC%xKXA~_>LcsE&AGG? zLjUPk5khDE$H+0Co|t!U)rHWv?%2PbeK{+CiibJu4-Q1H_}>rsAwv8HcRrpz^+NCY z92C;CxA%8PB3)eB+xusCZg08#z5P2)er!HU^AE@?DY3r2zxxX}8fr5h_Xfj>IhacN ztxkG4>N6SS$;s1Rc}hpGoR5a5gd*#2lpTJPXF$( z@x}1$7b{HV>#{)m7mxp#jgHmtPPZhvmkB)9*n^mumUowIJQe1dLt0)Ii(Dx`rscg@ z48NVt92uNp?&z5#!?WWr?Z)Zb^MOGqS-LgMl*E4@k*6H=e>&Ta*%HW?Km6^%AzJy~ zlm6srd0;EQ&tHs&=Z8lvWpJekUky9BvB*63uCsg>Q8xkOAC)h%Uca2l@@FOfgM+3!l*Mpd zmo!^+So~~^=DiWL-k-tmz2ot4&|&c-i8^vTc{Efu5BpKSbO3nEgeuOY1hT5k#s>v7 z#^#u{Cj6Jo(+KOPs#8LT#dn3pIT>LR<<(4dS6PD_qfscPsl$L!Lvb0bBDE<9@+iu} z2!;1b{bCjP*>f1TpOPK5$KuV-ug$Rd&e!4wxV3_hieszq#Wmd8LYJK>ADBczON2jThPdoUp>Pzg)eff7LTepC zZdc0bFU%uQ!G8M=f(N zP%2TZV744dcMi_%nlC}%)0|*zm2%a5S$;xRuyEdwa5*U6Vl=iw@kcuzjT#i6k4VSF zJ0^ZzO#CaSXYAFdwI!NZLRZDsqlea^0IN6l>MWc(5vhz=N3(z?qN27m{k4s>>-E`5 zw|w+K3m!hEF$qTuCt&$?(u7@S=tiPrpDzRZ?D(W~a=Z)O;?pkKUlgD9H!$MF=+^nE z8PVXr@iX7?$qRh)&;Os-e(p85rN}{4_$E(#zE1LtGB8$ji6Mb)L7`qUDA-&s%YKgDdXnHYZxE9`C3As4 z9A)l2iQOPuKtZ?qepgaK4>RM3*0Y)aM|E8G#tG*7G#`BoD4z)-cOuYQ-VQ8AL-(V%F`n=C^-UTkG!%U#?qaui`%=Rmy z`%40(nMP!&`&}hb!z@1Q^9P#w(k}p`5@DXAaYFfI0i&1TDIC&F>xMEkicD4GN0kTq zc1bE{4>ajdPRiN(`n|hFt4ig^U#C%L(x1QifA=rnw7&Uo9`xQMXyobPaPa0ky*De_ z3;fNepME;OL~A{l?REOB2m+p6JNuI>zgeUM?=CXf%4K~VHfz{p6&F;VausbxG*c(m z9XO@8T1L~1M@eijAd36zMG94A9`@Li5*0aP9__iH-{`p5j0--8)wlt3s+6>gb7Blo zU9O?GAcI0>A}}DR5Pu6;Eittz&e@I(azam;0)frbyf`MyFCt8FizppWFG~hnjLbEW z!8LMOh($XxIGrN(QCbrmO#FrQ_|i_!^{1?fW;XGeFZ3MY(-Fr858zcJa$%PEmepU4 z47M1Otz__Dm$2iqWN`IpJWnuKPA^uQDxz8e1_LQ&oCIV%=P@|f8qs5=;yF5w>6VMK zgk9pQLAx-G{CWKLb}-mtbhd)QmU7u`d*CVhI)QNXN3(ND3HnGSCh=K;9QQL7U6`>@%g}5bq-t8=@W*EiIT8X==}kYb9-Oj;aLl9o|Wx9 z$IRk&Z;fs&&3h|+!dAS6Qfu5K^0<78%A0!mLXh`*^OtEgzRMq)7oyQ!^?Hib$OdZH z@^|YW*zEN2Y)}vAf8F0Ouya}FM!jtLJe8rnih{O3AeH#uy^kLLw}15?#=Qr>`(tv6 zZP*zJ((~}+@+s?YZKx;1hVN~W>)9YbxqQCLTjWsu;u4h`3wFQJ(fOB>&VP4yCt9i3 zeb3(OK=bxqcU^j25A7SJFzWcAl{7adM6H^li_3kfveeg_@1XVeg$SW7=zoYY4Wanf zbq4*<0*<|8Xui2#H%FbUD3WK|Gl7>|wTASxA5o8GA0xa4ny<=}FOYeUfZ>?9y@zhZ z7RNS!@XLQtxj-w({DvbD$krt!z+^{_FvZ%TWaZvof{w_Ng>(0eGjVy(~ zJeDV}l8D`mLYwgcBT0f5G~$mL{WG4YgIt+vlT3%@FQWd>KKt3Tb94MRl;}Qt_O^BI z_#gb|hsXc3_*!jPD-obQnURZ5Om)otr^--PVR^x#DFd4k%TR%UG5<&dKXhCLaI{IJ zG(@aoSG8v&PBtvXq3yA}@SB{Un_>A~FU4)>)$G(9kkz_;<=ZfMX-q0}*YTx~emWxw zmOn*~&x}cw(kd65VdC^f_#XPi8PU2dlW#FBTbcYEF|Gx`tt_lPuOilk+%-q?i|LWn z25AkF&*IFBd?ZYM9wR=aFP|m}ywF^&@W(-yn6Gx^y)Z)p>zQ^nB;R60t`W&E4aW0B z@{8G3Th~?~`H-HZ(5gXnYIPxyAI$mDj;4uZUoIm4S-GsuL3BBbSVd=pwjIg07@e(1 zzNJ=o+upZ|veF&bNmd`qqF*3qaD`T2-kFOXkj={3cr5g|z0jeRGLGy=<522KaduM3v{ z(uH$kNwFgn$s`h1FX7Y=J?lXIQZ<@@pq>Gx>fw^=)WKRb#ZVX7JKuv;_FZN`sG`$Ay6S# zF57BjeT$TG)H;|H#lFlH8w?$qB8EP+AwaG};U>^g?rS!NHx4ExNE%%?rkivfOybDm z;;X@1D?Yq$U6=t&)~mM3V~&#k@9RZLbI4GyUaulavl4yP5*7u>NH_W$at?sVPmplELe4@zhn`eMhi5%h?yFFMaEN(XG*2NwDtAr`OA` zKv#%KbrO-SO2d3kL>RVcFe>HcskFw9C`^s^Gm*(IB!XrDG@{&mbydYW&>M zs~ys-(5G^^%urU*D_0IlN}RyS4#TuMG^;3bNqk7W)xONNCv@4ubK5D_ugj@PTa3o8+11w3sIja0h;-}< zm(zp*_(WU(5DbcA-0ropn(m^c{S_LwYhF=x3FB9?vnM692m(_4(#&`K4A+c+7ETA> zB|3B5JP17P`O*^E*(2LuTSY2t!%!iPe8Y6?>T=Gr9lL7Iu1tb^g>|loQX;Ga)=ah< z{86MyZeVb^c5j#+XK)~bJ%W%5o0T=}%BRFaKE2OUSWL(7Y+_e4UGf}W{YeL}{?5Rw z8NTR*Q}4_Omc0^0ADP49=&9vebB)$s$F6#FRA;_88;&Lg-QA_M>P4`t*$n8!SEIh3 z*iU?ymdG|?b?oF?Yt-*-LRUY+_v4z`mDbV-MTJYyDXcsLze)WFgH&um@g@?eki0;q zf%Nm-Qz?lB%ExF>xVd#1d?nZw?n_jqR2FmG38?hRhypBDuwF{mxenBVU4<1?w~}4q z2t!t)f8YfNVG~!>`z8FiiuP);E4vQkL40qHd$9N^geVl4phU@?u<-~-9n$$#Inr%Z*_C_$t;@GNspv)llg|#EsC`bf7^(jrV}K=x_LSv zmqt%5M&wmQPvz`lz^endLN*n#m=R7%4LgS71~zg}B{}Ijp^xr>D5KPB*e(uQZ7PRW zUo{)F?dYk+=kX_WK*^^Zk@|# zUG;SHWK$%jp(aZSgx5IO2dN7#O;KFYOOXb&)rRzi-6+|V7ae%XUVuS^&qB8bJ$cby zL>Q0VlQlt4Cri4i4n6(d(M@&esgq5;Jg$BndfLzWkMG>Bd|giE>wN!4FQxC_7W8y- z&9W&ZQn;K1beV-vCXdpv!E=kkiwyXN$~{!l$|wBFkAuX^bs|aD%IHhWlU%9nm9YJD zJ)b08s(-ju1s>haexy(Xm?XpoG0M^fdaAzN4d@B(Bo4eLvZ)=_Ov_!_0=GO*-BjF4 zH`Sr1gZ=$RvZ@M@`Bq8GGBehrzB1VlpU!~UK}jncJ?8%Gf%cBa!$IW<-WZ-_PD%8R z|7wS#r;w0OnYp18$s)@rq5??jo#T_~iKHfVecf61tqtNU;`J_N*=G-O)=a%74_Jks zB0)fshH?->%1PIwL0wUxbwsXwh*TU0YNbA)f}ZTNfkdo9U{NY;kDi(xx33jFmCI-Y zs!^6{%QJQuyO&2#p(4wMj9a|Mkk$kUlpXH8fs>_@u2+GPl0BZUFPcwZgr6XtDpBBN zRZlHO<%Oar;6N+%G@Bi^v|S|_YtWMp$(dA%cGwGGF@TYnH6V2z>537+qPEGQ={p!Voj^{F|0vPNtOhDE<-1b4IDuPgtD3xH!fdGYusxB!|*j& zztHSn2|cwKja{Rst)o#xPxBG!&{Kz=I`o9UYAPdgP+58l4zVnn+Neys`RFP2XnVza z5oZYGe}RwJc|y~kqh%=bERb0qv2nRU@lS4O!=3OCFJ#{r(UUj`(gQc%OKqdlJArzA7=2M3~8{O<>4h|$N>XTMA~ zRAUpp**jdwRK~sjczljBLp{ZJ&-CVfx|PoUTjO36kGtN>rwUrq;B3D9y?u(=Hgjq7 zkKHLpX)g5XoeZgQ^oN6SPmWA)e16LKJ|{oC-tV59@$9+O@O)AXS<%mI9rqYAJA}3$ zx;H)=o}VzP{INeW+G=l5-q^oxGL*~WrOj8Q@r4@=wHc2I8=IJe>5FU-AvOOzZVZ6B zlAqop)Tx!9UGHW{fPS&dUwSDy%=gQMWTk!GhqIdvIv{(qxuy)JjKW-w)+g{q9D*W@ zn^9K+x1>HU=y-YHe@I|#*RA68b(}ELd5z`u<2Y#T#1&nd43Wf_b z#wCHtb3BAVSOQs-#0DmI|D=4C+k`-~+qg5o35_e>!pj?#Yd|uXLX*XmJS3Pxcn6-S zztb*=sS9GdY7i3!;&F~|9d%F-OQ8t9llq=?luNu%5auc+EN1ap?*v6x7Zgp;ND1B% zVKYHd>}M(pLnk8@3#vmY4)-qM*oOQ#(g;d@%6S*7aMPmo;zX7PbBfTO>NGpaHlsSv zV>xa>4azcTd4>%lo8VHV1}#)Yu0Yw9$;6?dKqACrc%+{Oj)&D?_uSS zGgoz zY(9|!w?uN=g+(ofXDi*A=a@BE8$w(Mv)YItWcB-hJ#em?7uC)OIIG=WQmvAu1uIoBXFM*YnU zvblgH<*3|9SGufXMg6t%yBq86UFy@z>YVrd@|Rwp9eK--6=!l4x-lz(X9)MwShS@H z!G@t5fqy-Eiv03pwfNPIpQ>+_hw2qRgMwUY4j_`aC6|UJg&!?0DS;z0KMOsjW5UH| zAL7*yv+HP+BEhv9X9z;P9goFX7#$GZN^48;JQp5eIaPxU3^~WqxIN9g)MzJGcADzURakMA3%n0JhZ8Yl5;+06{ zQksT5wlZsYrSSIzboc{b{wSXjvecCfO7kKVrj@xAYLu(E@dC+6K- z>sWjTEB6-mjbP&eEd%3oc~XGw^D$i#1x#kIZ-{&wo5NExAo`6jqhTLQ%;9j9^#>SZ zj+a<+MJ_g#jxCGEI#~H~ipFkzJnKzaRBL)4O#4O%XME4zX)LMaPIFD9(k8`no>#Qn z(wY>TELD;{dXz{^3*A&CF{uN-k&zeiUx^T2nq>I+q*-Ka6Lkd@ykw;EVOba0N-BM$ z!X)HmK%6RBGgJ@#0E>W-oqFQyTr5bXUwON$KqaLW5m|iay9ZtqQ29~$BJ0Hq+j}xL zlUarD;GpRaWkGJ9n{aHIQu-aGoScoDD#MmkTqjxOe35d^kECKOD|0^*GOi#>N^wo)X9ZZFO^~D+p=9?&Mb#s=UE8pCdM{vI zByVLYcpo~Sp>$d`A{XWeZhTiIlr4tjS_x%!G@d7+Eaw-CO_eRLAe1g7G7Jp@&QL%o zCEj~UPRWq$$J|RikE$opB@N~g4x+PB+fFE349`|V`Dr<0>buI-gmT;dw@N4*&6nDO z0$8*SE7hyMMt>IKQXxDF%c8jLlm1K2ra(SHg;`UlkF?roeFz)2!|eK~udf6sTa3n5 zK>29LqfrBt^AYLzWEvakxF!;L;=3XiWhH+N=iFG^pGI`esDz4Ou8Fh}mYv4UYTPLlJ6+Cp$dZd(xjA6%=+ZlC6lg`HRu;{P3uEh?H(AJU=9?O}mN( zaWhllMfd^Kc{U)IWs@z2<;AkexwG8Qp1pniKiFn|c>F($uYYE@oWF{pH^PY;Dzx*X z2JhFXCtU(1eUBj!eujF|&;&0n>M{h=;$j;4sigjJaYSlQ=mm*QyT6)xvc-_Rnrw15 zzqYfkYQCZ2S)M|Bc;v33P&RpkbbR9L%lhcO6<5}nGeRJd5dl9*dhF<<_nJUc@= zR8(yC9}luU(B5wp{@%y`yO`*O4rReg|JKg?w_1$GuG!?)(WtS>`G|CEvSX9Btx=Oj zJ(!f$eVM184C#zvXTVkfpCB5Ru)smOW?Y$vxvyBvib?Rsl9+HKP3hQV$0pe@ebsX6 zj!jA@&#&Ui+Of%XY%)i3p9wbL%1iB5%=RdgG~>i>oFu7d&zao+ZkTpb;Po0M5l4s( zY*HWzVbfGB%-`9_CQqe}8SKzxhbHHu@(xXQXmT=z)P=$B%uTl@fIKme%}IwQJ2XjE z@JoB_{mw=-d0$>LnM_iHjVT8dRD!vr`meGu3ey-jg_NQURcDU~Cts(Di@hthC+s3J zfes@T5+l^Ace!q%2Sl5(*oC>4jme zD>JbJlRE^HK|*zSJDBtZ4u>(GP#EmM!4gb}QXN}UH~f?owmaN7R@Luo)CCAS4aDVVf#pRbA9VGnu$TV9OP8YEMHb7)F#S9=kRrE+kY@W!`o! z$%_bm=H3;#WQ$RGv0Rd?-A*$JNw?FZMz_{+NoyzO(NjV17ZN<*swZP<9Dr361NBYf zQJuI*xGv0)BFOP-T(ZTGyqa8cHovH2Rp-|V%_I?`ZiZh5X5xfi5<`uVn6Erk`zllP z#H2K@ts1o|jCIk{y?%>vxMn zZME2OD)j3-T{}~M(qk~k|K7Wm7(o6i*g!J^qxBwF$qH%x`p677%Bsw_`yvTYi z-z+Za2YXgB8PR~chD(w`nWWg?@YV`0x!Kbdw@Q7~k;#t>=ju*0dD4j{&*Y#Bpw#`B zi%kCcYp?y>YxbYxKjJpFO!k7rQJD*-R64}`El-J_sVqGmrrZ&x@68WQHwu;Tc%u~N7E0;^Qm?fKOWXsulaDJ?)H zo~($EVge^UpGo5?GL*w8%U7MIc| zNhH(6+e7kUlGHFGbYHO$jy9neNR?<@PFBsAs1^!7=Wu#Mu^o^rb zQkt-rl-MdQ(*&!&K>8p&(sW!uiy#GQn1`;17i>(+^D7~xjN+I`&0Ob!_Jf!-`WU~w z7-1#pPE1~x_bJy7D!UZQNtZ&|mlVkhA zBMT~ghagFCR4U%#8)+I=b8F{(aj1@so;>PP|1BQnt(cAoFUHa(G&$lh1TGGb6ySnmy2@KRGEqnP0zmw{RY>{P^o^h$f3S|L^|go0F$!=FNlNo9vmN9u5a@zSDcN z5+u#veER99^Gnp5U8B$5=`DZLUZ?3dXV=dDG|Rf_Dz5jGA3I%%s{zXhvg%A_v(B}bZwL5Z0>GIm1@ zl0B_`5kr=@n!Pe8flqJ1Y)~%CDq9TAi)EFR1KP35*&L~h#O7ddiM^y)GUPf{P8y~3 zgp>5m0%SD6(xWNL3j&ijn~L+_!U-~^7)jjsZ9{BCk~`5Aj*=X8aE8}9r}yk;vC1&si#>XIdEskVr5Ep! zGZ5RKC|KohY-E*Vb2c%j%8abAlHKhea_IkOfBMzeUb~(3ANR(Srzhs!TNCre#E~cc z!@gn32xHazGH$5&R?a7EXZiYXSrxzh`@_+p9Q1!$=#Hm#wl9D9+k->0_d3hh z((?5;%H{r(e%aO4`(U~hvs6DQ?>3fJa+7>*!e_^S$z}fV_&*h2|1)1_)#t+I z@)t&CT3L5&p?p^DfBhc5k7F~b6xQFE)!&cg_-OW1za^p+0i{+!5QW5wg>mefI7<}{ zR}=?gO%ROsaxXK=&4WY*u28N|;WLhX!mCV`7u;A)WrQi4=jV#pE*<%6Bj%Gyq4fpD%Vm(uNYl^w2J z5W5}WN);wT2Y8Eeio!XOHVH@N7>v?iLG3aim(uNYm1}9|<#8paB+o-NR`a)9g)31R zg$lzyC(RQdvp$<276uVYST{Bv5_SH+1y|ZLSrp-0dTCtQ>@3?1S3Z~ZxB&^PRQ8Kw zET?cT$R&BDNep#*G+{EK{TR+dBeDzNS}yZ6R144**bc)sbvN0 z7xN_ctt9YjCa^7r0ZMS7lKs`xgXl2l9XD;f8H#gZ22B#~m9 zwsLyq{VSTlwiu0_^U7_bQR9{K5$Skk$16Kt+40JbS9ZK|8XH>2jZ<-L5_`Vu;qZ~a z{Jb*5B|(aehCdV(Y@peSDdMUeA{4Yw>lmd=`gLv+uZ#|ayB9|^PjiG=!z+D%&xUW> z*42Vnes3eM9O}uiqm>=49DUBcZ^3)JfXXhQ^5wFD?WC1AKw9~|jkNNk>AmK9S!L+@ zQAC$g)DPgs3mJvdZ7x39DS%rF5jS3#ue*qv&Gz z7OihLG^jF4QjrG;ThQupIst}Ju7tXv`i_$z%E)@Fx-oac%8O#nO9?AEA9;Qn)@?{v zkxDNQL;}%rlt(ccnCu}IOH=zLi(+mdXk%9~u?m5)r!gGJ{Bu+2SDFd2y={i!5&|v+5;y%NX1df|QUSjlMw!dhF<7n+gp!Z9m0R>;V zET?QSGB1`>0-UzfuH_G{ogxXL zdp;U+$`-@3Yfias4_xJxjpj>jL5Wz^nsLfJ4@d=7#_>p_0#*`GrLa+U(E8)OD|76| zk$hbAOs+j4?UY{0^)IKZY%vRgt(P~6Q-%kjzZZH4Sh;bp;gs|y3ieE1$tmAH9X@7V za~6_dXR0}L`UB@!4(blD|L<22Ro?sHliq`ezyIUke)r9~sPfG_w?Dpf`@zTWeR$`7 z@yH9e$mgJ#oWA%4Kzp?XlfB#f#f81S&n2#1<@xx%k_>U>JO6kz)Mh;H4TckQFcsN8 zk>lQQ)JMQ8Pfnipvf-1#$&k#ste205r^_1Jdj>>5IW>bxZ?-O&>*Cz%| zt$Fyt{Rh2MGeM&JWH|bqht2rUQ#n8=SNziW=@`xNUeAiRdiIIU7iYuKgy(v4WJacV zvXAnd&R6^R6Li3LkNPI>Jv91gFgzI^KJ88adenRSqq`43`d*LSw;tLT`yw=pi%-@* z)BDb|CGz)w9RD#wHtV4_?MDIT2nn)rA`=s+;Y#f&Oa=)04YOF}O8IfApZ|8&A5TVo zJ#mJ)qlYKwr>c(;!IwPVm*2iO`#XDu?#}>H{^WQ$&bhdNZ_n1)l`_R2 zO;_*hwNwq0Jab(gg86a^>Y2#nObMk_B4y%|A?<}(Dm4bHZm4oM@hB^XVW2|X*}NdG zs)TMV_!BPambt6YB>F)vJsC@?rwXUDC`|*U7vQh@cGrMEH+kqL2O>PUsN7p2QvA3n z_-lOI@3>#b{ayj?N2siuOW$)6MRjxQ)aV)_zj-ZK^bZ^!+1#Qm%m3Tspr z_9dvXiuE$mduZpO_va~)4}P!8}($5_=wP9_p%(j>}h^<6b2 z%P%5GxDRsRyb|_nF)&-P-#;(!lBe=)?CoXxus`PO-r?}^e({HWY#Ju}GvV5J|K8pA zKX~xy-g^(<+h6Ro9!>XNkMMwqE9yi(=&h(JWMT$|MBe5Ho19EBV*J4DrQonz_bwn;T7|&IlXlpIZuG+w@5GO|D3%RUb zjsJ_+SN?L)uf=HW8v1P=jT-cu zk4OjoI_P&@(C>9pJnW71*{r~15-RY%BK1HT{HGPPo|Ng(iIgicllVU6rkT=a@vF-P zl6qX>^u${}fr{xjcEjB9!pJ7T#VD51Cn57s6X`2IiT{80-mXWI>pt_OB#L?)?dZij z7v8;yp(%A!+ffxK-lIg)qS+RwWj0BvTk_gkf^#C`L{%2EGE13R-7M~UU|V1L&g|3)om-=3;IP1G~WfPP}ABM!rQ>WmR`IgOsY9Rh1E$apIgf z=luT9^JqhbT*~uO^~$x!|K`Gqx;mAQ6@5q=fSEZuKbv?NGt@OZmI`@ZD@T#GQl4tr zLDru23n!ATWSU7XhQk5s&D?U7#^rV}PX z)xj;FNjbILChZhbK7rSZ#EZ(LQV$2FP-Rv?;}zGddga>Vf2kBmRVQ#0s+mLpf3b0g zcN0eGD5UDo6C@;1Ky3#Ov;X`AvzM+t!?!C5mRh`vDa{t4!`Z@2P=^!qablZ0%}O1f z802CEvLYnQ53}~n->l9&-IcFCrA-UD5hoIk$NVi|EgI7{X39F$WnxGE4&w0qQ!YEm z+OuADAm@vxr(U(Ubk~V6t+74FvJ{R(jxO=c&$4iYwdb3&z%9-d`cit4 zh}g*vXqpc6J};oxwi#L&8%yUSH(>f5C7$U;%JJebh;5rn$r}cG#h!zElgr(|2J~WA z6IR36s|(Mk8t6?`vS6Rvk=~=6+R3xY5lnG%zGwUpM5sQNC#QXN$GH2J#)Pv+i;>6^ zHIl~ZXm~i1CmQ0Zu`xbX3UD~SW5n?9T<)n+U_AWzjv)uBG339%iUlekW|oc+kdPX(%vnH@9Wig3fC2x$6Cx|#*V%b$!8*@WyLCUA_O5;D%pPt zl~2YQK-jSr)~#S(M};`GvhgxQi_aM9{b{uu`S|hUJvqv^hxLteG(1uJ4C^O*N0XEO zZ}-yIp}Q=$5?A1$i07`7Nu;nE6DmU8>Id!&^^&?h`@AbyZ(&Fa?sc7Aiagst`DgF& zn(S!p1vTqePS4_gZ_HD%^gTYB717+&Pur7xg^)iyYo#>z27}?F{3kq_tE!Uu5}${2 zON=`Pd-_H3&i%ZoXH;vSFEW~*l=jRYJo)siY>`z-hjMm}zD{|N)V9wb*36vizdQTY zZ&ZrOALtwaf(XhF_gZzQF>BBfkmm4I4NQH^y`(qHfy5)RC-%n)Z%FQ!N7*|b4+s6U z_J+Sz9iPMNYczg1EYDzWb%xp@Z?MRd-sn@4svC)!dY`UU}GQ-f;8zOph)(>6!&oa2! zcoTL&0_P=Z?-nhyk@kL2jet9%y><6feYLm7y}FAuA{bYQJW;Hnuyxt1NVG;>J8Vly zFNspm&wPt*482Re8TW>M#2d}|`-O4u7EN-UxVPRKSBiVf?$t;JUWR*pkvio6BE@xq zj)MJBJWtrz4jrMBr5w4O(Jyo(s%gtc+w4WVMeA(Dz0>jtJsHX8B4uraJnijQHP!o% zL_QTB?{As|*Ku#V{?fP-dQ@vr_7%K0@trJ{_%^2*K!@5(os}gikI1ZqpOAs=Ee)G( zoX`#k;Vdux#dz-)&9Ra9{_AS|+EH^fc<-!9I^f#@-`Rdq~F@LSL9r~nEuin71GiqDVmk#*$^VRF7M8*#IzVPWwGMV%qu{>|w zQ_D$haesBdR}uii_(e#cQwG*B&(A85Q!tRQbhi0#nOi)RId~C5v0A zd|%sVQ+4phYtlFxsqFPz)jU`4x~ECek#s-Okmi6|kNsO!NNcV-23ikC`9t&IYye~J zldk&xTgFKBU%xdNX2X7e_}Dl*OsWXipXEK%_(P6Zoq1oDpQ3d}YjIJxRvcF+Y<^VA zx00&z{BobJO$coDE@mHFBWNvy9RQ&bwhj^kTV^qkPX&FKH`LR?+;=N6?*% zmW2PNjSSdijcI!ig>~Qs`niT(g|DAdzvMUm?D#MB?|oUGg3KN%s$b`3GiS$tt$+MV zJB9j6VfFXQQD`Y{ujjw&w{=bVuc2ipkrpblBKLH(Qsk$?mvKNe0dzeGQQ&(C0&55B zzks=bjlep=Com18EK8q@{8!7)sANu<;d%~#T0|ITu?^MJTk5v2X1slE{;Tbn!h$tD z6b|F`foOx$V*u!O-%wRTyx3HU|Jzf!Xbq z(d|~%?O^#;jHN9&Y=L>E>uH z5uF#+!Vx))q=-D?rrbn;{H)j}xs|TsODYs8mPdF4s90=}#tEI!({2TqgXLSa$Th<9 zxyHC6SU%Ug=m7PGTLQ~N#A%uD2n6j8LM*9!k>0w*syB!c1g5rDFf2COLNDS#tzr2V zt+Nr9|9sW7a5*gBG=Z(d@>boYaUt}W){d3O0gn~^pbuO&NRbB$W&m9NFwX2O_7fZh zmIi`1PKZ&z4tUMG%f(pv7Ok<7m4CS7)@ZQuX^SkP@-J6Apw*^)DD6NZ>ob!CTXvW1 z12a|*f$M(gs5mCtTUB_W_S(6{Y!h(3n5IK2M+>SDq>>d+ih?ytwIb7ImpdchJ(WCA zJek?CT`4ll*R4JF3ZJ&(Ts~$W6oxrw@xOC=v92S*66EjgbTB;6}0c^BCzJg zxEK)AgknQG>qqzQ;7HMQ)0=Lc&;^z1Z4Go@ZM?x5DnWa%eQJ>jYQ10|Ggj?dI|2kE zdsUhb&c~FF4H(hsNIlZtxxDBQp9pFm=m(?W+2PTgC{|z3>bP=ZfR{KhLKl7?nQPUr zZaVC{B$-~@nho67ywCKgqHp49a~21?E(W-wQ`b=7C9ln;FkrKHKMPQ>H5>d!#|EEC zHu&9Y)LIG$f5dDA9qu)9!N@0E)lIQ4vB(yM`r$L|+XRm~M64!KNPZXzVu$!wqQwAd&J&Pnd8Cc|Exxi62cCph5LrI{P^c*qcf`0Ae zF351xMwLHEG(4qWU+H)gHATfNCmT(EqOE(e3NN$mA7K@!MB#{_5Bx)ab&KJ2mI z_qTcVghySf#ZDsObRob=YiA>+r0HamaKXqy-&B|HcT8|cOi(X;qrkEnz+)K`R3SpA z)S@5bxX<=tNX@V1kY*D&X{trE!E&injdtj>xwaFstC?@#ZqEeUZBMjgg1a6^Tk}BN z^@~jjfzq-eUEV@H3vco;s#B(A2keoG5OX;n`@J~DT`)wFF4bD?S@9;o7+95-4RTQ) zxJ9#Ue&#agghx?OWbA@i$zQcxTMe_ z4X`M2QhXklw#Y&k38sYO!s^*Anq(so{F7?Nu@cd4FiT$18dpRF=lU00di9oDLIjzv z`I1?x>Ew2q#0uVQav(iU?LGqaS%L{39ROHp^$XXr5gY!A(=wIuUHu zUkX51T?nq1>w!?~SAB(g)=ERYiXc*0q{v7JM>km@q^6L#u2NShNvUmh<#VgfOAx^= zT4UElaARvUh~TtEo(>WGe2RZ{flzXD6B`s5rVM#5p5hbx`wi*|@LgBi9R@eMxOzV7q8g zb(n8TT#nbHNF9n=y^Vk^$y-F1- zyCEHMt`#42#JNtK6U>0!%u7sLYf#*bjKq-8MAIkc1U(9yk@FVq@^q0i0J1%Do^=qvQ5diSIV(3|{9@;ysypP2AtP8wLzp5E+KV3Ph6^!j z(MO`Gt@(wK^A=6={2}LB|AGS7`_~fWEF6qgT-QP>9O;LT?opwZa{I{L81e!dZdt1> z^dsT4N6uR`&#sa4rpap^Ik)OBjSHbiHPBi8s;@xKuEl!5N3LyI+ABLCxH9%g8TVrx z5?v3o?1(G6*k2kav_jjfs+cY&LfxV@c8#1jwnhUvPg|rz&bnB!6Sr!=s}4Cg#nK&e zzG(ro9ddpKy?TH7;tQX9LI3manL7Thv(LTo!IR_f6o1^x|2X>lqkqVEkcPRH%W3}g z7kL@EP)Ul~gz0aLe>@H>F%e8F*t2$X^OL|e72(*dWr%KwZ~`G!*ugN_v2iwLN^ygf z&dfkPd(RDR5wHkb%AWlLE8HW8nh?E`J+Dn^B_n-wCP#B(=gzYi(dq`0+}&zF}OKUbk5eQ4{L!z_IvJV%;~4XMvY?p1qT!v-k`JftKx~@P9rc za(`GpJFl0N;$p^bcVO8n^aK2!VpyS{#woKIqH$B6`(Z*xJ9vY$)CRYMXZ0sdH!7x?`nvRvO|OYY}8i-9U)*8^qLPw2&rRH=mrN#OG(Vk)va! zJ7J~yV$Bu+X$VezYkL_hwNuB+D0(4+MjMhkWD(04YHEjR81fKsvgJf!%1X(o2M}j$#=K4&9 z(C5Y;4Z;qPOk*;eGU;b(eL+FhNysED8|1>Ubc+_*2uuHMRiJfIeQvRwZi=O^OrBfq zRJpcjQ0^tH6x-2AE2qssdbliWTT|&qJ{oH)lmd~i3fGE6r@aWe*IJ&tMeFREm2R58 z)>&z*?y@+hH6y!Muu>i%t`JUWvYOz^rb63yLZYEJuu?sU`j)4qE|-w! zZqXXMW~Ccjqrpn2E%J0&X(yxoEXrs*!(K^9&qXpVZ@yu#R4LO#1?UQF<}|j(Sgs$M zig+eWEu0`vOTJ+k%iRki;c7Mf8jKZTT*PpjODJ!z%RoAogN|ZN?K)fA?{*ZcqgXYY z;U>uGk|)U#JRCmiC>DvjUGik_rc$iiB}-qb_WM!s=)7Kt6(&i7$zYN~LM*%=eTA2- zL*$|i6PdB;9H*Ye1~fvrj51!S_;p)ix8_G7&RtP$EBeMlESwcXq>i?ayQ~}8BKB0^ z`;o_05tbj<{AI1$$6YG-n?fvhudEhwzxS)%q)l?a)^n~ISGh{P9|mrn-mi8ubPTJ` zuu@myP_0n;MTr)Z1(?o|`C(eVvQrpwiqTN*;&lvbhYZX0Bhi9kDdB~&fRdoDfMJC$ zu`^Lf60~9qn3nLmIOM z!m@EG60Srp?O$<4pvJH&KyX3Sn*0Fi#a>K{U2T zSacBW-(QEkD-c#31*A&GGzeAzSZ2oT$-8c7`nH>3!XLPfT&loq_7M`!t3CM(Bdjf2 z@YYFO+m6MP<8`xBM z+$@CUI(r1Pa(|!lAI)Jr21-6r64KPg|?@fhqoeb-y0<7<@16WVNt&+)NXh|nc ztSE?L*JAmZd6cbEpO0r*pra9kh;$4uWxvx#r-fR}4y=GQEopnAz6*V0@l}jTSb!eE zbK?kUy@=8PDHeHEf#-@;)-+hH-71CC&aJX_tXIqV*7d-v&a86KPiy?8gI9HUC9=@6 z$XqoOJH^)`4;D-Ds)!U(FUt2q*Q;w8J9xD#c*PoxAv$O{x-Ao6shE0&OzRRbSkya> z9zK;aG~+l6(#(;L?}1?!cN*&(^PEjfBG`btpa84gO1d4q+Vwcvf{N6(dGqyi-~^ZO zs+1H;U;&M(UJUTH1Pzh_e2E<6sid-u1m9&1(s&cDi>-c%xG#TVbx{I~9}P9FDj}>+Bj`ZJM~& z(N(MN(il!i%hk40bKPY*x(XZ*nPKLbNkk$NlW4?>L15EeT((PvfV zxxr=BS6j5kuF=)T)@Y!sX^V8|szX;Dy6Vu?RhtOf5nDTvAK@A(FhmbB)?{%^M!I7; zLT8pZx)kjOp)1=uupHv)c=M~(SGK)p`Fyxaef7Py0e16#HU+-=&o903!fR>okujc} z_topSCW??S+3y_=4&G7OorCvi{i84qiSV1M~$`Qyir_tK;wx*F(ehpHXOK7N)X zV&e}v;&dB&MX*zsVRtH#ndHr5$U&;Z`X&SN`{bb-B&|T$WOF;G>2N|r??~0NHubE_ zuv2n$$2iZw>IUsH>^?Gvqm*0vL=L#CPjJFB#^>XSI;kc3sgF;Gqe-4(Nn+*QyYD^x zyFdP`vGL%??-&^9JyKlK$46?UawI$*RF;owH3WFce7{S%Fm@Ss!^}*|$I+AHPqmTp zZ!CLMJvsgl`e*-aI69Pr-Y5C9tyoEZ`a8cnIOLw0RRb)0J@>?Dcy@SXAX-$TL4Jd2 ziBB#F-g|QV=lbYjCH@)7$9so2R@C;rYBsP`)%KLU8B;H?(I#NXC^KxfVm7@*>}W6; zCQgzimTje(ub1}_!_bapD6A}H*Gz@s68=NA&VSKETIvZqLJ+>Vg znCzgFq3*i235rT^nagY&IGFl=XU=Fip|%w9KDcB2d`E1MMX+8ZyNx~cWo$51QEVYO zWLrSN23;KJ!pu(0z>Za#rj}<(#5jvvxivPJFS*e-Lr5;l23u`av}1!;F_yMKPu13T zwMpSPE?W@wz4R@lZ5E|CnG~U!+BWWHA{D0eq8PgFxe39sUhJ;rgXNpBgXq%IwsyNn zdDCp7v>(v6e)8qZSZ@qo*!H0L>eE8=6Y_9ZSIelt60&=yt0)%BB z@!A1Gg}PlJ@HeGJA{V}K)PW~4_H(fnx^dvx2&dX~lK>f9*-b7E2;29Tjezh^Ha5w{ zTI0(68EgHkA+uUS2npg;G45L!GE%dTGh@p02e073cihB^<4}oK{fNmfJC6C_)`AeW zZ=PKf!c9}yIw5S;UzUt&jjD$g{){Oc9noimGbYb_*R$D%RyxbZ^)Yr&vm{tAE38H^ zvg`n7`IWzzxNVE^YuAKuV{0@B;j~4b4k7$}id=fE7uv57-yLE-pks#}k_bse)fR5P znK)J$TQ&uvI!iT|hUBkWD>v$VA3uw}kA)7cxSbM$??oJBrk{~%i6fwcx3NdX;DzLC zU6vgakbvZ{m}+hl+XLYS>|CS~^Ypw+esf`$;K}jY9{SShu+N06>ite=W6el(vadZ! z@CMJ2g!>NFgGsC$i)=D29m`KOedXHYcUgANV3yq#N7#8%*j^M`rWJ7~agXYoNMZUP z*+~#P#N6td(;G&gbwHgfv>nC@?@zrH4usG}fO-FTb)hSc&E9x?rc$#vFqfErcJLXN z+QH|1JT~qsZl6gGLvG)H|L&_(XtsjHcksDy46}?!*$DM1f>Whg{71dPq4B6U?3Wc6 zz{%5*dZZa9sa}WdIOvLu3P7n@X;u#Nb@10{*f->aQjG}*W`|Q3ZtNNFHxFH_>X2a0 z@!1JQA-zu^qLW_ok?a;Ajy=jf+#0AAhAQoI!AeFij$jXX$^*BsWePe){|82+jbmb z#_>F`=Y)d!%=4m5a1D^>@)^^_jnLL9+egPR%LQz0sp^IYo@l|ITZdVdk5Y5?C|xy` zy&m-3d8&5kc{O^L4t2s1Og8+%G_C>y#A)i7%JrN$5Dwu?Np0kq9%wu~8zt()9$esW zi@i|G%OVezk?(1JD+#4|0ePV*Jn12_AS&?-|Q|6`LybAQ}Q7JSJKbN9sY$21(4h%NDr=sCc8`r_!h-9AM-^n3+FX$z)VXEb_)!e{?s{^D;zo*kaCxOn4pOEwF{ z40&p-*tGT2D2VM0kBAV(>0+BS-h?kOk0`m#MRNhSXql%=o~NdSdb;~x7&P8J{;&Dh zzt987Z`u~(c&?}j9@^A{`3E_9ri(PScJICYmH{_y*hJ#fp$qX61ob|(04b`}D9r$C z%C_CeaR4&(wZ#^hKcN+%hrBd--l9pKPx4&$uSUx)A`@OJcp2 zX|33$D1fK0qA(HMd67?_cLVIOJI(8CW3>W}GK*{`(ezEJT^A^_rk4tvh-gpgVk^>A zsxpJG)%ImK(9DiJfBNlet=|5sErZ6z&5YnOb|dAQ7=m}?xv{DCl{2P$`ReaQ{`TqD zuFYEa^N&8Mx>15|L+S-?ny{F169T=dO$8#PJTVZtWBxlnRSL!E_>K`HcF!5CRyoJR zkMHDMb;y6ACmlZ0bQWl<24gHwjnXf3y2pG&nd%M{_*0o=tqK4LiuOvsF(EB zt#Pv?;0;4Pym$Y>HNewm=4MT@yMs@EDcSC`!Ad*V-ka*$`)WA~EoG#4%V(#~o#fe> z>z==)Jut><^5pne`NrS>nScEozJBoJw%!%|PyF@MucL0s>4K^E_@_*ueCZ4!e62(W zM{;~r{?-o&iwP5iwpk<<`htL{rC4FY1wIdBs39mcOT#202qF>^B;k4<(%dYH132j% zp?Jmwx<9QHDB8(Hj*`RPSbLc49}Q2`K97=q&^7$>l0Y<&ivTMLyd+ zsqdzEjtbuoW{_0Wq40Wzu6rPYT~gBa)2>;AUztD`M>e}lp6twfD<-)h&?{(aMgJ?nt1kS8JgVVFM&AqohgXCB97XT9jyWT?L7b zNCzb*EE25lJ>iE-T`p_7L-&{ zc0{30WM+~KP&Y%^Msyos&a*Q&b`wgOm>MiHxe98OZvw2R4L9>PxiBSd-!j)kNsGyo zmgn00_vPt>-1}#rM{Y=qwv4>A$UJM=K@M8}zx$TjR>)xwY=aXj5;vC6Ls^gxrZ_ zYN9G)Xp4Z{;5xooVHh)mwQ03h-H1w&_K>uFhuH{8|Cg$Dn!YXaw6~uQ9}oINneIOl z`8;;Kzi9$nhotTLOJhLs7}eV8bA_)1Jt!kcG7@xM2OHmrAW)OI>C{gGnZ!E$Yx4-k zo@7;3a4~)E7M*1yCH>bsZjJ^eoi)kR!K9s#_OmFY{pP|nsNz1p@@42-wwY101!a!V zYb%mBEJcxtuN)O*R667|VA(;|;_a)0sMm+czW$gE6t%C1Ry)tU!bcE!~3Zvp;3cyj!m;*VSTA4h+G^bh&^ewgnBo#tPE zp*MkE5h_VV77J6vkZ;$IV>6CW^ICzln5HPI?-)@F^co_T#9>{Uj;;NZ;)v9FOEOCP zuq}l+-*=eR+#nI9>mLYr&t+;BP#(AxWkm-eO4h&(P z=9a_yxJD)u42jQFU&2v0AD; z4Rns_&=?OJp__2Gl^3LDGJHiBWZFXWRBNT>@OGDGG9vk-muOvQF4~-lL63&N{?!gt zpOs8>cs7~4;r5JorjFj+dyDs}7KHXvG^f3+hxjua4NnZ2ivhG6RI}4Z{5UOdg3VY-n#P*G>09>#_hZJe})`+o7N%Da{kw6ChE`VxcXW=(gwiKPEVK&j7|(@p++)NM7pL1f0fz|TNhd| zPRPTO`C-2 z_V#juIh_-~m3O$pvOzmMP-N8TVMp{x{OnJ0ilCO}h$^N*eg%JVrhOyyh2l}2=nGvw zx4D2-uhSQmN&90iAgz!aNYL@-vds&td);14xH!*o9)PYp;7JQ*M!JGFdi2+jgi0BNh83 zt2$qP|JC;{nxpk=y{CFh-YXYoMJCgD9g)6pUj5+JS z@mjy}Vf8U~zGGyZjE5YQr{I`_FP`Bc)tHkVPo{>EOw z2l<2ffjZ2uU-4fC|C!JD@7=w_zQu?d!PDU&9qWg>zHmB6r+T6%Ow!ayKjApQ|1mw< zy}JbM80;(b)9MmcJ^C|uiGQM~ALJsjo_UwD^!kM!@ZZa>&ketw9E4 zD;H}_jRr4v5ue%nWgUcgI9zq{6pOvqmu}erv#+1}Z>uks-vD(!aY}4sNCqfTYNO5W*nFAJ(V9>XG*Fw_9FGIlJAV^nQsB|YAdY`Yldmp zyRr9Ed9_MqA3bThQ9sTv*P}x6XCxH!;|U2vV7o6_a?zIEL(2xD=XROZ*kE0_k`!we zJFmC(EvQDXUhJAa+jrWMP5NhRwvpeG^=ZazrT-oa-;rsY^u~$mQ=p=TXX9FTSayRK zbF5;J*suq)aN>pCsAaw7jeD@P^2{TuIVQ%tLv+puzy6i+6UDln6?@4MhG%T^4Tckd z8oX~jOnN!sV^jnE6pn#k=m-p6&>&zTzY83qB_)jT*`@Jt6|2zFh zXAV5tr|jr-aQNi7?h)rA>Uk)v1251uaFOl$I%?pTT(Unq{!3jv_~m@{_DEq)IaiCg zBXi)Fi>b9y)4e{(dHH$%1S$&cu1WAJ1N^fBY=9|$6p3#ofgMGG!An^9C6@SE%dHGs@`N%*`VnoO6M}1@8F=Im$kXwVr}NN z2wlrhNcE_L{Xp{*e&zHm?)Sz#R!Twjzj&)RIoF%hzdx-Jz5_b1UB)jmTB|0P19Zf-Px~x1H2&n!^01Mpv%+L$Ed|~SJ>C8OU=fN z&QCSxFw~(|Z0`q;`=5b$+5tF1IlGZpNpaHwmfM{UH%aA3k7KD{=!U;sco4Ayu zb&Dq1C~5uuYH(etpKK91TTX&%YF4BPTZGNddIh;q^JH*G*_G4TWNC*x{Z^o$w7X_a_(W37#fo-j0-J)SO>R5kXHB581 zw_L}%X*_7?g+ILae$%R)JkLnRj!D2DaiWk*PUb(pcN$>Q@@jo&hdACqCe&xZDJf)sW2Q2)P zULU`*MKgTy`2Wq1^#A2w=a$pCi_@oa$IURV-t2GpJ9N|kg_fr9`=<<@z3OF@1v9c z|Mc+*DHgTXDc;xC?efy5cG>k{#d}|9kwt;`Rf?~_ke)oMB%d-S?7HPmpD1$bOrNt&*}GJ^)5d<-0FmxAwhXch>P&r`!4C z>Jx=*i((E%X1f=lFlPZrVhGVk5}7%fdqEmRl`p{DtJi+6>yzzw&ep5!09aJSSUvD; z$Q+&xG0r)WEdrCRVWqGH@UxHw=FPGLU^m(g9M>m;Vuc-m?d^Gt!S*y$d2!2m7O7l! zw&swzv-SV=BCY^;@BPep@bC}b`Q6uFuGOvUYPs*f{D%H%`Q`mLUVHHVoA16+q7clC z3)KuJ#`#~6))nfUN};Pak>48jsf+GOExuFKDd$Ic?M>roq_WpvuI7=;wD`GIE^i=z z#hik^IL7{)<-uwV9b?Xfs)m6Gp?@d4TKF!`}`RTZNofg#9ty6zLcOe0}h!h3cA@aOFQohPt zs)mQBpQU-*F}W<2;&V6K^!{BV^w$2;&1SrMf9c|k&5zOam#%KcEuEs9ABV-UHsnaP zZF$ktHF>G3?@L}^LHa(i(fvJR+9DvL0X=PeCi{8L^Vzs4s)f|gY48jU{71tcXPHI$ z!Pd(+!=1OEk3hArB{BbELCn9|#pyni#JsgrG|!@I0_T2clN9I2QQ!rR&wL?fVPsh@ z;5hajf*JAEvmHBNT1$YOE1(9x!}J}l9;+<2Yf$VN1Ly6XqOF+dV2v{({5ZqN4P!#V zV%BfUx4bxL?-VUemNg>MIs zcncqN0iYkv#@%~0aj|~LKUB%l0DGjvbK~A%Fnp8`tI%}{7Imz5-2jKV)4cV|9pmkL z4~hZyz8r8>N45L0L-H?t`t7QUAXVdJ)QeU6JLhE~!9g|A+`f>Yc9Fj}?5Ac`=}=TC z{L889F}PXh#a2k((u`iG%GO>#CFu)Do;V_@GEgs8xn#imIv-8yNZu?~5kAItV#mu4 zbc2w5A3-n-@azETDXPjOHjgJ>zJvc2z1-T@9{zK?!{2&yl<2Phug>DUyXWZ% z#b$B4Wo|npe+8p)3-VjzS^4_bbE1n!@&;}YQtuU-S?8tM5 zgp+SQ_*sLA`5{5du@jS{>`@Sg&!@>y2c#!g#ilhW7-N839NHRv*|RK%Auu1>zMKzj z$ryN3=U(}_w;swiLi#PurZ>%j>yW-(e`#EafCv_@#9V)QTMd8o;JtSnmmZfHp8YB? z9hW3jaz2UVjd<_}neQb5854n^qPfMT7hZMgFGlIN=qwv4{g!6a8=Ip+>1R!Hy)5#} z+D1rE)2B4Sg0;n#XL@i+rUXqJ1O@+dF_MqYC?3U zV6%i|9TJ^aTr}IfLzV-4OMnpC*{GpTX~&-O#dVkNN}jQW9Xc@)3rkKfztb`+20;7pFrb>c6N>yC@! zo!W6xV|fa1$3+*nspkx^J1#npH=i08{Z_|CpGhuyyV#ejD~azFRVWmx{HS;o=>T0G zMc0HyL*xJ=w0+iMKtV^(Dk-3f>@;>$cD4gQ$dGBcsqd%kdZ&S~gDi|Fy-iZf%`C45 zCY~`Y+FnmAGO}d?7Va7QFwBa`kt9h{q*)NAUYORfs8##83wmN3D(WC9ekl9{bTYPR zK}FxMc6*x&6J2ewUQawL?wXs!Tr(844@B7foE;SHbjlFFOF>ajDIt_r%Ag>l*xd7| z=_KA&Wqy)`zD>VeN>@85s5;G61N=`-Th#^9TU|{+klME2DI5it;{1liyWat zku_29Ed>sxRL2Rl6hYb+)zHhDq=qo`n;cSLG|F|MkNCPr<_&UT zB)Ub5TqhE(H^x;W(Xw|%jfPvITaH~q57X2#(VQU@Of94@gpHdXzB7K1lECKz#1{v) zguf}#TS@^p&424iv{iR$TnNTAov}XGU6vD3Nz7y53WUmzB7WDW9!d%X zn#guU;*eoYJwdB0kFd7vE*B%BTeQYTBD$q+d1Grdi0HIM7J=yJXYrn~R-D->!w(BR z9@bh071+MXRfS^OVHT#`)A@dB{;IVM;VMO+HCS41xObox33s7|UE3-hU!~%B17myc zB&Rw=6UU}fwAo2Q=_)T_1G|jp)e&hiv~+yc{6vk08~RKqJY6L`^@N8JVd9#R&}EL) zvQW7#l%6eONf2U4^{&+U}(VCmM%c1^65iD#KvBC=%s+lG6{N+$vT@H28_7_TL?sBNR9O|bWz}@9g zGf#eV)RX-x?s#@fKHV_EE{D3yq1H1BQ{Rx~B;%slxa+b`A9Oj?SAB`Q9O^EII$zP{ zD};Pk=Ji{@W##|e>T;;N9O}u6_{}bdy4nlbxVC=n>CV;)iA(ivyBun=TY6bJfg>;Q z>ZdVX4)rbP)*D?8_4mJDE##KR$#yx^kBy%UiP>(oy6SSM&3y36n|LEa|1vcpyRBKOOY6BXe=x?-YNG`GI-u511~8`Z>*^ zE?u>|9O|2zLrtOGHR;AJ#}jets?5Vh8)qU{pf7Own2J)d>PMjsKeUFUC@meIn)+z z+AfBh2V%iwdWoC%?jlv|lJ;w{(YCuB>f9K7{E))yJn7o3OaNLLRM&2$8*F;*Wxiu6 ziJ)7igo!!WU&r{Fp(VyPRyxvl@Nb%V8BE=?JAL=1_1(S|*xK^AuE$%Z@795C_V#@9 zl7!%HET(PW3sR3%x#Xs)pB*3fE9_8M9BM(8n5%x|Udu5*``r=woK^Omk8 zO`W$i+SSfmdhc-fsLR})#@tS$teO7bfXv31urbQx#q+Wck4Vy=S{ zTHb-z`ASbt#|QiSt*GFBnSZ-?JRT1EX$_ryt4hYjG$R|1PCnb*(G4P>UYKX#@FlY% zESq9svaJ}X)MHJPB(;mzamQ)K@#VN9%O=|jgRq6KbYeMDU@t`&oI@URn51SDrda4E zp2b504wfx7F|Lu7e32GJPPJ9Meb{ch#cez8xa*;~1=gzV)8|WC9E%%QehXJ=QsQxu z*5o(U*2Q*ao1tynrWZt>5<#GZy~z)kH$fp#6jrXR7j>21qFJt+J=%36W9ZOU?6K$` zp^l84gDLO5{gwebYXpbJz85F#otlc766`S)CJC-EddE{y5X&&r+Y^fztJy)w>#Ge;IpprKKVZ4fZ%~kwy0Sh16tUx1e9H6=Gr^v&n7=47-)D zv91-ELWNnBMwZ0_up&A6%hvC;cYf7Nookp*crQ&J^~M}Ud&BP~!;^i^ouBS!`L~Tf*h&3E6rH8zyqSxwZ5!k;*iCu$@Oc5M$w^2DHRIL!D| zsT7~$J4Q?!eZ(k|A2c3*d?zn&kH@_vYQZ z?>+pxKmMz+@!-er80cyrsnH$d@sUFBse99kJ~K=v!{$eLFU!c~FnHJcg>N18RAxL> z$)NUB`WZW8wtx>?UKV%`^8~8HW7o~tbg2WG8;gQfKzvz{xFL%gHwI!j z5&6o@7GlQ^W80mHMc1NW5t^27+MX7Ry6%DSo8h}l#G*Up58O7_j)Lu=`6;`I;VxqM zvJt~}XtVdux-Fzqh0S0)G-V<)Gw@?OaszUG*pQ#y>m3T-Aqw_9Tkq`DS=TZND&r*q zg<9+AgzVRozG+4(2@wrD4x0lYdzYu!;?Dg%=t8FCPs!uuX{RH1k8EX_n zuVDk*)vv2x`7KZ|!p1nwBzql>LoB!JN;C33-*h6|lhjs3ak4bew(%w$%ZWh7IZC-G z3f`hwt{Vl5uof`PZN9mY8aJ%&9!<8j90dbe1Y0W%T|}Ph9aQ$B{4_w7>Z7bzK^C~c znif5T;=9YD;4NC@8d30EV_YQ)u6kFa;g+Ca3LrDzqm``8)f>}FnW#{KXnsonv3$q2 z&_69U+Cne#wg?#BqIGtSf;Y{5FN1>1t8O!E_gqJ|UTeQZmQSiprXpe%gQij?E0ZY@5lO!NYGEust=cMX05(NC^ zUr*zDC?Dn`VyF7zg+pw?BW+`NSxRY^P38uFAs^GAKSAm6O!L#Eez__eD+w#M# zJ@YrKGf%lkbzU1Ov>S0E;V_ZTZ|oQmG_cGStU}#1)kY%uWn6ZUwP&3|^P&%R@z868 z{a>B7%(!YA_8=u21QD~dKu@k&@=&NpJpqzfFH3_oh$uG5n`Z9SYujX=WETyC-IX0H ziWCy;!Qcjt4(&ZOEcyj!mv(M>2ZsmU*{r%BDcdSDBSLn4>S5zm(q$*J{g^5ciZ2=9T@^Fb3(qor;n>p2q#wmM4p2Mpp6lR6#2a4$ zsO@Oa4yjD22F+KB=bt&d@y*_Ne5O*fH!x4+c_&=%gv-kK%rk1O!J0wpPPklA@F}b| zZU(LHgv-ySt??^m71PgVqwT%?F{EpV?#uJ*l`V?^PR)$pbKKOjQa{xEfwciU+$;(3 z`t=b*#n_v;KEE1?Byn*3jU6X+RT>MsMvQJOt9G?unYEV_ur5)SO(AWRI?SzD2n*@f zShZXGxJzZrJ}SP4A~>+@cCzJnb|G7y&Ru5o?pj34{()n6q`DI=%YNzX{4b}-6oFq5 z3GWVcc`vde>ki+DA|TJ~7M%j-VSKET$%j4s(sF<3S7IE~QCYeyJY$wCeiq=D#wK={ z2%mupf2*wC5vK?0%#trBT4urI_<_}A3(H7#rWhdY$YRUT!QaxSNGDWm8Ys4p0z0w8 zz*?%2t${ziJVPO?_q1}busx}6x2$bPs&_jOw?LpZxRozuLp!`Ur;eyM(|al)HEQx* z+(t~6`*7+obt9_E9AB}QyO#6lH(}vQ0>8Z!r{1DbuA5WOsbsl5x8l@Q=U~5~UQDpU zE;$gHw7mq6M@7wmo5qY@l43T;!u`=s?L_L$^~DBR=pRu43CSDee~_oA{a#VD z?hOx`m1kMK21b9@m@glDBA`U32P9^WHkAZq;2D$FzvieXhGK z=hR7@MxbhGQt||+b`!k^jZTg^1VuKK#HLCu>n@EGl1E}ykCTf@mbYk)U32P8o(}uSxd+Dk{E33JCV{zysw@$Zw z$2eCKrLMjb><6gB;pkjTZ>NO~d(*3ia=sGJPc^{Ex(|B;+3%kl>G1KOKcsLzHL}t0 zWToo2W5V+a=IQmV+yHI}6aHqWV7_?@=KK0VbiGvA3!Fp+nD!|$`0P+?os{RN6eT0% zpp+~M+#truh|)bPMMQvCT#%u9j{Gc6Z0ot8!oIH!nSwA@l&40@mXQ<*^>T5XWy12J znS#0gahFnIatnip0*`0wz;c?z^r{rhwfV~ox?MdN4so(R=oHM@%XDVeJLbX)2QwU& zz*?3rS;w9dOHmeBK2FO4##AA78_NK5$AvG)g|%BRs8+ik*Z1<5abeFR-hc;$iTfN< zKSeQl7!Y>sU=$_1gq)-hfVP%4q-bgbH``^H@N3WE^E*O=c;JQz#Ovug)^=6@tTKxYhie|G#x4|`u^#vY$PIsRDx$N%`&NKqf~2&dEG z$;ogqHr|}zI~<>BGvX)5fAg5%xl?l(&NJy$)*JNnFYFCRhx@wk55{V|Umo`pecZ3# zee3Oe52^&aC&&Mr{^mbF?2Qjc!?V*L6t=NXj{lAR_HVMyidw&#SmBRIg=*l1Zb$|1 zq9WGHlk_OUw|$%hN(}wIb&A-rI>kFSRwEdwV2YgEHvivW*l62a@upJdbP==WRNK{F zowsru?wG?hObnhOd*mrw-LFx-@+wc!U(FL+V&gkLJ7M#o_X&V+(n~&4_%#pD29vQ7 z%Q4>@Vo}{Y$$fiMd5-t5Qn(0bC12b`8I2#G;g6B~Z_9XiHp%g!ZZ>?O$CVdw-j?H| z;aNX5Vr8Vg5n>Phc82+{w`q&LrJwx$(J)ctu`w7<)Pa$oMmrpDpqo={T?5U0;HKB| zWvrEF2FlyHB0o#A(kI7%${_Q5Up)SI`j3CnVZ&z<8-8z{l=MM0euED6_6tNN7tUvf7*^u`?eZo5XWMG!Q8Xhak4Z_3TVihTvv(mUd$Wr5>Jy zSrBCw8+|x>hOsYFKk}tT^p;B;=L{Xz-Gvv>p*BC}5s&$?ci^}O)nv$9;*s9Or$3;z$w`iK{Mu;M)nILnkw?&B4n>KV|9rKN} z0wH=r$iO0Yl6=p6_zF$>mozOQk`Pl}M}+NqN#IsYrf z;yTuQ*Aj&2sKAlvw9Sk%7HzJlOiEUyiNgxhLh9#Sk4buqUgSj;_uY&Tw`iSRBg9Q} z;5tHV)m;|HG!4M(SA7LSqzEOU7?91voRp+4&o+e|T`c4TVBR>FZ=T=^iloVaw0 z*4Q;d+}Iiogg9-HMTGbzc{-{))$%}aJ%wVI3Q*X%@-cH15u;I(NZ;cgS5f6uJA3Kc z?fwo@c92qL?8$2ji%=5$?nW$xLrY7Q$b1(v^XSSvEOWnuug$sJuD!FqgjG`g-i@L# z^eJ67*?QnC1Qg+T>QcRyGF(eRiQ(+toxXJK89EHQB?hgmk_(2^nJmwHHLtzbmiZ$W zm$5ThPL?K%Uw5YQoK12`NjsBe!0D4_I{M8=%B+cbcEDswrqSWv9+Fxeq9<>U&a>{@${W#_h0`NR0tbx1i=@#svBw9|4&l%IjX-KAW$Bg!37 z)*ziA-vN^1@foSyx_;nnT*Ww(v8|{i7^}lPWSBx0blg3($U_2%Q5KV$F{eP@*Gb+T zQGWZuoBO085BE9qlMs|?w_;1q zfU>B4+_gYiL`zhfOMvo^cL9{=AN<$PlSNZ>`!oY}fBCr=KKFwDM^~2rCtb_;MaJ3_ z=EU0m_Jb#%ewEF*@hJs{5KuY0SYIdUUFtfg4=3lR@<}1vX;)Tct>DauRS8mBer-B11tl}M5a-6#C9SB zDT_1GZwNx9u`EB!oXqujhEO)U$N*|!S)UE7{3!$2-mkdb3b7qnzJg)71+uI$n0#sI zx$ecKspOpr+RrtEBm^7?oQp$|xh4iw0V`%7>*7sZS-%N~AhC*wU6duMIX*ALbt{kuvZd<6eGdCwWAZ0YEXzg4_5gnQ(O4pXR=p?>hsT?oNmA7b-=aDN{ zy=${HH6%4J2}7zgEQx7x1Xqs9MK%Rx8KLx2m2IrfD0-3WbF!Aw)Gb9#89Pq4 z7qQy9SyE*uVBPM!I_`coSGIj@V%XcsA1$}mabTq~u91b6;(I6-3n#SZx_Pr;^f3A-dR^($OAMYJSHh_ zJP#ja-*H13${=GC6a%;*a%x!V#xiBLbXjDD37^+t8()PUYHZK3y-Y^J7uk#{*Hw{g znX=;?h&CeS_o~~vvO1}f0W^smtI2pjH$pi$X#3Egk2?+_$YGOue=>w2 zzlA(G7HPy29JzSp=uRUr>Ix8{CG?sklRVCrN3GW11R>QS4U3}aQu5?2+U2QYWbX5= zF*5z5X#l^e^BhrUPJy~L(n&~b256lN0JRD1eLxEle!laF8i zG9n(n_PoT(2%#aC}DJU;< z?Zl=)ocTt+ul$8nzichsnb#K={HT*BFBe!YBfwRCf=}=S5tAfOXyO*(!oWrg)iOBi z`>b+;j0a4Iku4~AfWr>%v`l8TAU(w7#S^~e;!uV7q2iKX!kzRZBsm-I-fx$`Hm@r# z+631t5jvbL%yghm?6TgpsU5RYC-v+&Ayuam*)KoL+J4i?lRJ!DjLly|MuttS`H32# z6DUVe3gcr1d{3+_ub#s;#7jDid{r13t2?~a5|^~BOxv`eOeWBd>rH)_AWB0h?LTz0 zFtY9LQT-~y)fgF1Y;3Yw(v**uwTZtN+w}S!MeZo_(oEfsB6k#-5^omhY%qGH+c}n( z1{fH36#37N|5DTHFUwPOg^v^^opTezv*W+kKYk^%Q;Ud3s_fL73;7@U-G4uSfa4s) ze|IfK)?@eeLSzh{L#2yW*=Y{^3?IxS4wQu zzDZd%l5=ArvK322aW0_~Xij+0$~cW3mU9v2*HIJ%Gl*Pg=4&CcEe`OYCD-#0YZqvV zFnK4*jI~F8$B;WQawW*V!D3`0svSn5jL21&r;9c7_OPHG*iW5_#V z$gDJk>sw7v(q#-eLeKzCOHI$sw_T7s#1@&X%5~8r`(c{OO*%`xu5sMx5)8TBdaxZs z-t|!2f=^`qX#4g$=U;)4k%r6628U4sL(O}Xz{DKlay^fs%<{6xi(B;& z&($%bd4pUSA#c$l&m%&vde>%z94XyAB!1g2Tgp6nh|47loMFvI3LA!ji0Pth5pvOs zaJgxXkhf@^T_fa8bKg2bZq;2D$27OuUEWs1A3b>Q-6zL$nbKhZsuyu$`bdc}APIQf zYqla4t&l{lH9YM9TU`0jhc4vZa6F;gp{I@^++5;+$?jVrPnb`ICir^7WRRak1WmlR0+hFra1#)uP+ z9AV2DMOMu2(oI9ij=L99jK9X=+VQl*wFsDs=haEyStm+5J{zcxAa?}0Bgmsvjf@jH z;9khJt>be{k2`|A27KnDOQ%D=LW2CAbp-iG4BgiZkcAg&DvU*+<4Di;sK5^iOh)%2 zk}PrXkBcpVP#H}|l7?yQ+98R5XwJw(vK_aEac(R?b}~LypqN$I9=Ke=$uVm6?bIPY zngpg9K=x`McP&76tONEDHv{DRyHFv|9{3$U?)dR@z>f(*w!$C|Od>{+BZXQ!At)AQ zBuXtoNIOo~wVv4V;~nv1z03$jq)pB0fNU8*c9cp~B#?-q%mcLWMe-dJ@iE!~Cr$`m zT(;d`Gqcub!xB>Sg?zhzdku2C#b7&ryyKC$1(~d&mV5;m+D;?FbsGgTA)=^?xV)a$ zPO=y_wM~eLq{WX?O2EPdo0+xvMZXD`GOEf5_M%4CTeQkk#mC&ATjArXcQh#E3ViH& zQIhGTcg8Ckgjx$a2=x{|38g~CxVXeid04Z9;0VAQy&OK?qD7uZd|dV}w-MF5M1dT{ z8MTpFYzoR>@VN^Da%5qe(n&LdUor+e;AD$lL=jGFe7r^L>>3|$n)%l8ajWjKIHtL9 z^!meOg#y{}Bb-No#$GA`_qYn0k(XpN@NtKaJAB+3S+6ojUoIW)6v!Pue&N$DAi02wpMUg8Lp0SaySe!R$*vRG z(y}vCM>R6dv>lRaT!k8pSVud_(~A2m{# zq2)^hsqnYf8~L+)y(7pwBFK3_F_xihP1iU5ml5P3q?CyNkq#JO29-qE%w;ftmmpDU zkJ!ggF!5MqEj2)@BwB*^X7gY5|NP87(sp|}N|tmBqw&%+BjK zZ<_no5pt{UGJhfTn5Jb9^{c)DA;)2a<-2X0GSyk`StQLkCW00Lc_x%}bgkwJ zglvcWhM)gN8wGOzyd%gRLGB20N02*$tm9GsLYq(jrp;!Ci89Cb9t!Kg3l0S1uC1$( zo*e&@-?$zR>kSIz{`vI+{cM{*s{58pgS?068N3*i%vJWf)i!+ZKkYw0tylQfBNXCNl+cotLi#$c{L$ z+W_Pp>E5ab{*0+z7eBU}l>95FXK}wbK2oD6$A7E)-O+nl)=QK@a{9eNHXNPgUO|Q& zq{c&)91Vv3;o&(y8Vn!hKe=N}!_x06qKhU)FnVS@9Ld30C)bz1_V&F8MW+4z++$)? zyA{7UIl^f=t#>OTGfs5uo#^Wea>9kf-OOc!jqhLw0q2H34#g=|!$onUKV}E^UwbHxW`6 z;8x)4!uYs-t2|YF%;($+AD6vD8|2RMu=n16%lQ5K4;qfV2?Z3yPO&pVC#BY1XCM;} zPOCVv<%ay-rM1`M53vd-b6RO|A8S)V%tlOjec~k|6@lK@YjNd+ zY5MfV46L_kja}p8jjhqZ$I}++@NtKaJABMo+8J1vdXYq@l9Bp@;R&`tuB9APW}a&% zA;~koD?0=0&cM3E#~nU)T^TU1%Aw+CL4i#Cnd2wSD~S)%#qI$MW^L3JCKf_u-wkca zeDx+}AbSVG-m_V^*f@u+z{j50BLGwqjAN7X)d^dG$_QvBgm72YQDbEhi z#*;ch{__`Kc;U6Q_sAGe&im^1TY5=j%6{)~aPW@GCf~pHhW=^!<+S=Ois=t~g9FRR z|JA?59_-+a_lwYaBk2_zxki7;<|^UfW1}}P*tnhT|FUKL*06te68Geu@sOYB&00h6 zz{=i0rN!^}#ztSBV>NuL*c#S{7#ij0GiIO9C_bMNpRYW{t+8=mO-94hVV}1)Fy7}+ z_N{B1(6{fufA`gV=UVSe4>;$uL789M&#&xj`=@Wbw&C&{`){=QwP`C&uVAg2LX16&XpY9DZgq0K+CJc z;pkldYDoJvxKz!}rqR<3WEYQ!Z0B8lKGG zkF~pvOLBiW8IFvfsiR)fSKOcK;l2A046p^a-s9njOZuE6?%934pN}xLuTPHul z`{MDx(|>&9_|N#G!`;ss?!H|O_dlCHYK(jNqehS3Z|0Ah>m}Z<%s|&7unBGveik54 z6!@mHZSDy>KsQW6wWSl&_`anA&&Db;Vs{ENY8+SNpoST5Eb(T#lSDzB1YwGkcqT#_ z@VP^XZ?cOIP353)4DM-GX~ZsT*26vfy-@*d>&L%M{;d z98f$jjKUC0khR>XcoUeVxZD7jl1*>XFdMn|2h{+0B2UNmUYZ>C#(d4k*8D&AM`}FT zAFI(L)~MtCyKhkq_2Jz&AHKOin`nJl&b>Y)O(fXAFHaxv>uR)*jCL#VUGR>JHkn?e3cBhB4h5HsByXXUgwqh<3xn@1nq(vR{*#SOa+e*){pzGy|@a?^gY#aUsa)5sf^76~gHt zi&%LiF7;CpW+`$0P)X?xagy57iJ70byYiuqu)BnCdW+WBHTmAy8V&M2ZIMOt{bHI9 zCshz-kV@b7)6BG^6xp1^BO=W7&?E!T_XwDewQuA9&)(bhNRr&=y({r$DN!;^kuVN) zRaz~%OKP$^B3~n0%eBc}X+c{1BJCW(NA#XOk&%(z)#~nQS9Q;DXb3Q1!Ipu=F$j$e z*zkpI!0i>%73?5ymn%0xq-ncbPLw~UI&i2v{ZJWp8@ zT|91M@a@;~@$6zcHp}Oy$t_fwh`dNzx~?Q%mRaiTJ0buaQAYG#aaSpyzxLRTuW?QM z*IWijTedO;e0XVW3~MX;dZw+$#0Bp!MB@5OX z;|JRH!7ZNIJ#6DMf8DyXgDE5Cs#nkjKBEyX5K5C(NmN$o@&4IV2a%O|z% z-Ey^rjijq?Ff}-Rgc;gWgaAk-@*t=BVQA>Au2%cgY<%T!RIj`|$5)?{P!1M1UPuP? zS>ZF0dl_t+re7vfBEvjS*>RMk)b=DBU-ho#vw!E}N;7)(k=WtH0pD&oyX31aQ{}0Y z{#YOP9$~qa1};aT{77rhu<`Q@64&`v`$b@szDTVkki&CzNLDYOt(ZpfYKj=)H|H5? z^@C%S!5;H~J<;`yGTpxe@@;19}R?ZE|VDuWeJi8Lg_I5 zbpU=KlzVgGm;$$p;hQ^7ia*$Cx#K3O!RtO{o}LV5q0z(qoD zl89`WE0eHo%vBa@O&umrh4sT6f3!^cY@7uxJ-I=)il;MY1Pn2XoczZcBY3cUGLLkG ztA{VB7KUyc9f>GPe0O?7cbw!aK3V^`8~J1q9Ym@FpX}@-+HrrfA~pk^Jf%3{G{J); z*UrpzoZ0+`&lbe6YHh;bog~*#5{~mcM;YZRUBcBX-N{5q{N)8l`2ZV* z)pvcMle?mmDXp6n6F3&t30WJR^b-?id2Bop6@V8%b0M@r?ioyyWL8kpaZVST!3&2l z>}p*SZdpj~Pba$_Uc1rBT`$EQs8_v;?~bgr#N3=sDx2e%LG=_RC}q4DEU5*x$PlB6 zLdUtK@ZUBdjW!olSO{FO3V~R<$O}Z&&3O zHpzXX6E8s~;#fX1vRLPyPnkQ&RGvpp-rM2I`^)Z%|3jaj(^p@1{O>W|Lb-qroPZBQmhbflUrW{WV=nd?k=K>Eo*9YiF!V#ebdfZOzwQE(vCo^oMH zRj<&uPbW`U*V?5C$Cq_-+0&k?c$eD z-hJoOPk!*xyC0S>aHkr{`Da+E?vP*3bvdu3L~``betBWv+2;~BuJW=o<(1Spwtn(Y z1_ro82DtiW?Uz%z_Uly!`1b~t;!DW@JDKvbp#Q(Xi!WYxN~f8n3G_ekpC29n$MVakY=r~2mYF0ZHq*4r&f^l%-MS(fYNPf8qu|bDes_9 zOyfrj$Jj^s8SbSb748pU5cTz93GODDlXiYSCN8hEaeh;vOC)@TK5bgfslsZ!5k-`H z0T!ca;j%9yTU&URPqbLyR!>B~e33@3m7I`jIF(YE$kH<_f&P|u+io;S}fFF_jN1-N~7ob+y2-8^bNQEzHu;m13!;vhm*569*y3p zweavaKlw?Efo{`P*IlQ%)$ZcjIse_(Kis7$@BHwA;jwgLsCu2ejQ~Prlfb82oC7OT zl1R{gT+l=6D|su-g%_8v)$$O56c0Ri*OkT$m`Q zXR2TL9^yos#8Kcv5c9x|hfj{EHlgsa{?LTIy3#t5o%Qi(ya}h6WAw}MxG4baF)CXD z;6JW<6>cR?oF8$WHqozX6S>&k`Cn~z0CwtwbPfN@Qoi>&%Lyjmidxr|>C%q> z;(!)JE3x8Lkn%9f@OKYf_Er%PMisM&g{}9K#tViCZG4L>e>42oV>EV+|F(`s1OF{Y zWWav|{<|;y_j+M7Zlrwo7T7GXfkK+<$pj@at$TDH;dSK6!WOhlWWIF$D{3r%upAr8N`3?Dp1)v}SzjugyNl4Z2O<$AmXGaDj&@vT^fF_cv3S92pK0Uk ze|282u3j&r8Mu%U!rmz6My`^GaCQ@T^zbM&(*fFb-rF3SRgc{G{NI@WRIQ|6y%e5E zTE!F*ihyQ1Viwp`Q=jpKRX9fCXpj^vg5^uKJ;}yby*o+iS0_38gp2A!&`2$Oi-wo) zi4#J*{7~&a1PbP~P___B1vi$D-1yE{y3_d=V34fdNV57@-+1kpUUUEZsH_Nn`I7qL zlJd^4>=6Cxu8B4m<0tIRe}yYlyH)^1ca>s}Op=7?LgJLr_~ zS%0OEbML~T_rsgR=SmN!M@LgzeE+TLT>A9sQ|yb7+0lXF8Zh?E>IIhi~iT^^dsOZbn=Cmj6=&se?kzFvHa z&St^$3)&lmS1;K7sJKL!%BtyhpRS7=arG`%AKTgLqD^{BL`)B`lHv04r{{Ts= z^8v$^nUqFbYF(>WY<~EOxtQ$k)31^soz3@qM`K&mGa%=GJsrLM@q3Ry{%-Y_Ru_Sj zwwXBF{_iYSp;npihwjFS z53##(-V@~arRM19#|3!=sn8tBtPvu?t}0G)6Iz>D#fdZXgCf>xjyF;vw2?@`I9byS zP-9*X7V_tGHwYDGDoHgmUz-(~p(rnDXwWfL-xcJqWArth?<&_hK9I57R5kc_3*_%C zE}L%;YK4LJ{no0Zcvj$~DUW?Q3o~SCe#WU!);7_q8t`u!V3S z0FEiqc@gFSbm!s`r)3a(nXn=;iBLgSUp59rzYCFWRG!hIz*kN-Tc;{*h(3vO-a3qjNT7x zjGih>4@SS79${mUu3_|<#pNTU&nS{8b3>z$=PD&UYyE;rrXiB81Jax!ggNnZ<$&Cn z(f1gUdt~%i2IGzx{gv4T8mO;pEsQ?E4-~@|32?G>y4XZ|T4i|IYtma26JU(ax8}M| zm*tBEe(7{j4%&8!ZjaH~HKX6Qaji4@PSd5aoS>_9TIKpxUrA#BmR94VH!IYqQ=JNG zp$7t-D(Qh4%2BTk&$U39{T2))9$Qj<{ z1iyrms&fR{Oryj@iVo(I)%=B?a&hJSfc1vO$cTc;BG}kwSYdlbK^s6BJgZrZN>+aL;Tz}6 zuT#A}qJVsXdNVi6iHRG5WVh@UIo$@}ZCVa;jy&FvhV^CYi^Ic;f(5!N6$oHb>z?6BOVO8Qm+0G#(R+zk)r8j9bL%- zQR)z6qNwI9hM|jW()q6p7z2xbHaa3M~e$OVZAz=VedJRt0ii^rj$64tI6TB z(Lk=MWDIXocxI8=`~3I|cc=W;@~czJ^Ic$;UzSGTfhH6SLW|x$X;*w#c zr6!$ggh^@Q0wrp^;lYBdj22TNsSie38v4jlQz{@zupK1-NTprXsbwsdCkfCDT!5zE z#h`YVnkc?C_rR^l{z?XJHAG)lLe4d5X;@IVG8&Ie{4t$9W&j@1zK7LZhV;$mpsU&! zb>LRF=T_AL&6hF_sE5@njcwe@s5~PG3K5p#pc`iR8YuitJsK0WDl(3>Id`D-0`I&k zU%i_1C-AWzEDOB-&1JhCqq}jd9WSFDh)AW1s?N^7A2bT5m+9{-_QnEfCSKkEX%+eJ2R@kb?sN6fY3ToJDsmyX79si@O)5K(bh&yVB0BJ0qk8>jat*f9 zXiE`L5nY&s4y*Wt&bhQ}T;_>Qlz9?nt@o3wFUa~8#|(41e%(x3+G8|!jjgthMgvnYptj=SfV>bk4kX~0&SuvH*UL7c6mqo82ZPtvVNhZ-9j z)VC%Tv>2oywg-l-qP>7KWxL|4+V@HNC}ZwFB|YqvM7ZQu|MjbV6jzn{>6)mvcS_Yk z6;M^RCe-9Js0FI@KVy<6k>O1aVmo?g7=(FaZt+PsN5x2Aw5q0z{-Esk5 ztXiviF>a>aav*EV$8@3CyVLQ^hi+Mxf8RR2*}Mdgpyx_5E^O{?r#)K9c@{#NrA&_` z-J%$ql6OugCnMn7*g)z=Pp6POCuJ*X-O{9$$i4}14|&hog?rE;GIvykOCV53f$n;` zYQKA4eKA4_#S>#|=0YO(M%BDpK6Pzk-F<@O`#aO6-BLukaWorzulYT5gXzA+OOe+6 z$?i+8w%@+0)l_S@yf$;N$9J+^W_v2unzQ?5(623K-#J5;kDpxm^{Q3v-yLLZFQ<&H zTD4krY>T+cd!&Jd#EB&jXf1R)Hto|8q-7-X7)_gv!#GhO!Nhe3jd7JL8WSW3@6S|WBr%Pj8b737p4fD(RHh3?cg-)JZVe&+0Q=vv*(xg_-`N^ zpFJ;4$-4p%bZOKX>lNHK9H?>?=0@Vhk_9xhrr4XJ-Ni_gbWkOu7@L+>XVWI_kgM`- ze;nAYJkbpYc9yYqTt|EIKv$HAxE)@-@;!K94yz!-kWx(~;eiM~v6|)Ik~D)t6|P^0 zI{7+&s@Kzb6UfV#B;%%5vpt4oD-ZmvTK;ZjHM`g{;Wg{m8PqbVtq%}XX~H+VK0mI} zv85?Ag!U&SxXM}LS%`T?EsaKa19D0gy;E%?(wri`aLF_!;kYpn>@g%;f#9ES9g;0x zv)7Eqof5&t{Awr=TZmwkL^e$V zwQ!USIZzOF@BHPvtYE3Le!K+{>@gaqd^3hBl2R1;4iP#IGJ;i^mDv1@zUo0 zgK01xoiX9l*p1Q=QK+Q>X!)p(jAjtX#pr1TH|!EXdy6Ax zYrdOz?NNH)8J71)g@qL?!O#@MciAP2|M;M=k_S6I!Re&H>nGW#CVoUXaXtPWY zIFBpACt(NQDw6aMq}cPp=}tyjF3E3gJYeec>G;GMd;+ISndE?*vE|!f1KMOTrDLE& zf*Nbl93lwV8P7&1`Wf=Sb31i^UINB-?AR$Da|?$ZaPvuF8MLQP*3j`n z{(FA*Uo{SbeDnVu#^Ze2eU=uJdP4_EMz3{OG*+B zHnCJij5j>?8!;KFL6nOWGY;}Vl(9jU*AUr*<;@YFCW?YIcENBEm^4I_OB9Lr2_%V< znr&(wudmytLSiFNgpXzDyy$(=fj56#Rezn>+HIyPt8@47gyPQj-+%9eAANdo&~+QT zf}nQ^oXe`@;G60|$A5Oq!T_A>(Wbc{1tLTS6yz?EG@&Boz z-HHCRJo^S=7&Q|%+ki8PrUiM}2pr*N=ua_E)d~4eVMJkBbHb*F3lLZ3;K`KjcVLa3C^XzF#L zf7cV|`I|^$vVW@)xhZk(F)lBbII~Ua>YR!cVL3sZk?9qJ)-FL6xUS_HO&LD)3490}!8Q+H$H++#>yJ>p!OUyOKtfMNQTyS&O2!Gi{ z<1`Gv^wN-C4Lm(LU*cXv6K97jpWyt=2;G7>_ZW>`6X&g?(IC#t5gCZH+ea@*^+tkv zO?_f6Jsd1qU!W!HK%Bq$W_3=l$)>h+1bm}<$g;XzbsqSU%tEZdJnAz8ac-2;8p)Ld zasJ|k+w!L5mt&$66Of|VdbvZTQkssxH0SqnV@Au_10&ASo?`#*4t5)eb3`K}OnRN>rv{ED0xemd@FtKyQ7yuk-J@rJ0wa@Urs6Rhx1(9 zmj#U`=x`M|Z*fe=d?H1X@Fy5EvX!yi?j@!3urN9|DZ<>8@;PA*k}OGT;x;qID}hEs zq0@{{oTR=E$!DPP+}D1QgcfO2CX1C6w=){`{evj!fJQq@$U5$~1~O_V*cDui^+^rB z{oP6``wv_fpZ)2@LMZ!A1*SU*W%n1)vUfb2oDI&r*E;k1+8C;%C_1vj#T62=l95g2 zA;P6}YNISS^?5Xq(cO_zAOC=+nPM9m%~{-3LE=}Q#c()sgV7mEA3RETNJK9+2Fh(! z><0D0tv#+dTz@j!?IhiejP80J?SS0s2*I77(?~XuTMsabc_p40f$~J*64_E2qQ5D? zaLCxCF-e{mRM9sBooEmHh{Po(mRRAYV6?}uYz3qLxLROuCB>a@nVL%6B~|F8#9g3# zrbk1mevJ~>QrVHskAbP-Ht_jjLxpH=(dgPt+43gs&gUgF!~y6-qhmO!;JBW_n<23e!=rS@!|k| zj?cXYUft!&BYdfDC^xg_?J*j=#-dwC4mXV(ESx1g@1AUZ(LvD*Yr7c>?fAUpewzFm&gCk{q=2CeOnSG&+Pqb`ba&}_z8k) z(Ar?|D72qQB@JEc!sa=$y`n(Gmu51sL7rhR2(ZGYDG750^RhKO@L)B4A`T5&#w3bU z5+x&Akc%kFqcAP#<;mlC1+F@J$OZ>NeBj3&z}1eT(5l_m{cx+nLU!O*OWd@UC@FKH z3Kk6{dVx zdUHJ=){6-@;MgNek|_gLq%BtC;1~HawlecokhP6RRdAob3F^j5GWxf|Ry{`Lg<`9v z{bDCQ41#tp!_Q>>K0qOD?OycQK6lC6n5Eg~A0mf@o!?)%AC67NyIa-0j$^ z$LQ=DTW#C6*0EKm>2mc#q%3Ixvc~#VzXn@HmVgPeZymOxRV8C3OOrx*kqneBERpqY zaa^A+S6@&$UuNiJxqjUYTlE-?U1O`QqtU=t%Mp1oYQ6zm4cN*>aaH=U*v48p-dqF$ ztxQRZ4+j(16C}mrY!ld|VDT&~|84B+N~Pqup|`p_t>67AxtfBhxrCH7MtUJ=`zq*U zK|sziM-ji^DRQU%FbXoIDyyvK6SQ41d;Hs%E;Zu#+wSFsCZMNq*W=Rc3KH(T4PTWBEC)|oW7-IkybhlVrT31kg%1D zjNJ26npD`;wPGv(K*W2%x>T`UE5E#NZt4I&)z1cMRaW3TXG6{}=gRG{XEbC}pYvi( zI^P}LECurY_sCkTsdz_5pW3M=Dsgf+)u$uULxEqjb8B-#5Fd@QlZh#l6qJ z@^vTt*L1YFphPj+vza9-ao#Dmy21}MDRBqf=9<*YhH+)(qPfgP9NkwWV)M&f%R=12 zryr=*K&@UFwR&^03bpF3KGe_d7g`mm2@@OnIH;s>8%*L%68YL%>dvHE#fA1I6&gfW zu?W(FzbkZ}%3K9`Y&C9WtMc=Mg;psg4TNKnjp=d^RFM{ORH(?BG!mKd^$J>rwU66s zL>ZF`_*eq1P+Nr^pw%B#&ClD6DChUG_T0neUTZZLcj-cj(~ulu4_DWEaG|WbP^vi0 zvw~8uANmxq=)u0YWwI!g2~Duvho~mxgidiAcIK^F9zz#nVHwm7CExj*ND!9X7FqQeloyJuP;T^c zpj=Fjkn3}$2H%dX{3y~iC2KDUQbao#bbAW@IhltMMwIwZ5_HlwAkFy^u$#Covg$D+ zuO6~m&8`MKX+c(40I(xXb592n8$|1Cs;&Z!oMZz_AWv%aW^hu?qQoU*mf&PNvg$E9 zyGB;qHm!AJ)oHpc3DWASH|{0ZAS)fQ^w9a>=^STcE;P3jw5MQRi{c8S`(z8Us;+$M zj4E$|ta^;bu94N&(P$v6<%kT(Dore**cRNWP<$i;nRi)UzQ%B}t=R7x7rsn^|BHFX z;2bFEESAJLYi_F<+fUjDJib;<0pIr8`!N$ zoE{#siVbj!5N1#NA$?Kw=z6*!PLn)3-^6(mXVJq_T7~jJhI>gsHwv4qR%8_(2ojSq zL2y4&t|`B>X8Jkv=7DJ5_{^Kx^9y^L*(v18b$^x7bU**{Yp=bNkDrWY7tc=Y_uq16 zEuKCZAD$ijfh{h6_pNu`-!6VRuYT%OPl=~G5To)R_d_KM`ec#E2F1V;W^z^o5M_p& z9W4v<83X8-2p>L^!=~xnLKk_UvNx_J^Om z|J|1m>MR)r4rE&{ze~~E-~MCoR-?3ZhOG^gp4!pu@|5u%|BS$~i?R7rdoePT%d?Bw zC?h*2A2F;Ko?nPx4X5e~zctT)4M0DgV05Q10Eug_}-{oy|sPlM8z=f0Iu&Z+df9+wv=4 z`?m2p8!YNp=; zkhG$nPpi8Pz{lNf?kRapL_tiLeMF`P$2FP_m5pUYws~ZUXfR}M7*#}C(5n=L6hIPd zgjP1=AL|!N*J`&97Wi1{$C79@4jW-uh%~h#%4D3VIL>9JvlZ}BwU4_7e2}cuc zesB<`2fp6{_!BWdmNOX9O8 zcLFbGMi9QF3X)?&tw_g`mVcw!P6uJ8=nQOoqCxI-8@bc`ltc=nD{9xP<8A0D@Li>k zf=v-RVSvnxr^$`+WMpCzWN2EC>Be4X70c52;!LKnmRr>N`lF+6XW4G(=uXz-4sfEX zwpPbjvM_HhdP;-LXQrSM@Lgn9hGAc3g3ya1L!=y`fOyHajY{K9NEwT&0((=hz8+(< zl^}gq-79b9)wkG$Vb&*u{SWo|r*`_pPWQPWJrL4zlEi#%>yzXfv%VmatXV!w8NQWX z803aUEvDw83BpRDOQL9{5o_~=ecEjiQja0oije+%>yT_Q>$_$&?#!*PHovyZo^lJg zAfVCHZuW#Cw=N7&a2Epk`95hA5&MPp)opDa5$W5RA@vxZT{EO@``|i5>NH;(7b0L) zgLGV(FCW;+k3aqRqvywe%O>sU&Bc)wv8;k45x%IDr28J^n&~|7(tt2zn$D$kZRZ`X zymGa^TQH;^qp@p-v~@HZ3~4zc>kR2GB}re)$Fqy+*j!Y47sV+`Wt5g9cnf<17CdL` zMX0I4{=sUgWfjs=d+bJza}E2cU`48oO!#udhCN84LnLwoLz+wtho7_MuxQLiG(C;< zE)-lQY$&mc1*_I8UGSUq&(D}1x6 z2wWMg`IHbgVu9qKI2N426wr;K| zv>fU0RV&u&n_r`?IR?!YY^7!}z}8yXbAYXL06M@{Iu5SuB^Y4q-W&ut#!Th^3}NT& zlGY3d<}YW!lalyySg|1bnLRA~7z|tF>13S4>?hNFe5TnJUSZ+;Wjjah*XPIof}`p` z{L1mabiaLLfUPfOjM?`Vm8DTDY<+)mvvI7Io6SA3R=W7L6?vZfkW@rv89KU508()b zC?cUrG0XC#Fj1CZT9vuf8_Kn5oYRuUj_@UBt^a3L2YmYU>7JgN!|`m-OiuTYCZ~2E ziT3H<(Z%V>-yi4S$M7;vYzlUk>;eOk#!3{%SSp|ipIEL~D^-FOdAkm_22ObvMF(LQ zOUOT}-sLuRU5|~*>Mh z+mtFds#jOE!?I9C*wqwaBy!yDD|PEZ)Xi{g|jNXDEq?!m(DWM@nUdXQe45GHhY=X4X1Ckwr1Z^Bc3)ZYSAp zto1II;|>sS2_+V1*dRzKhSjfr53ybmV)w?E}qf|WU1=u9ASKG3RmMz z2tlmfVo+|1T6+x5R@C}`S9i)?q1LE|T3z|S2WwqUlCVLt%jmkQ#@; zRpD+sB4Bm%(I=!|~;IwkG9vc(%W7A6#dx-6l+9NeNijSm*2O+BJebKO;(6aIJ|>h6fcs69!)o%COMf$u$sWV86}J9A)e5$w;b_3t)sPIdb)c=Tq4hp!>%c>=*W|T> z%z=jrlhN|04HcIKhxw{gbs2!uM(VakGv}8w&21de8|oS5nsTLcGsP!z;Gta4hDvnc zp>S&tX(`^*zC~XVKL4xVe(jfDbN^fPd1*h;BDMUKrDG?gE=a=&R;!W4SuB&dow%@| zhXh73FCg%b$N`sf-U>$P9Tj^4{R8eiQ-aa&Zmc&R>$6Keb@r*QR6TIffr~b^!h;Ca zDX|AG>ZHI8ym?}u*pq>auHrG5>f)N99xgncTpk{cfCqMZR&rr?Y%C?qd(V%5PD%F* zRUIg&`sv=`_~Pg?yQH~&A;m6f*9V{eU>_OVWdBspF3=R@X7Bv$@cHpyy2tE)PlKHS6(&h&Y(U>42}+ryNR(M&Y!R4P z(jOPsFyVuhpvFZI8??5WDKr*Igwo3*atVqQG9#0k6&4k>kGqkIhU!2B9VDoKSbedZ zl@iC)X7*yX|NeW3EDsL4?^5m`ipu5(9iZp{Mbp^nO>Zthm6$?hbS8LNAyIAFfQD-L zC`ty4u#Q4?mIt-jxKy$Z0@T|;(fRoZU)Z!!zHWn}X@)5?J<|vp=x?Xd7;nZz=ajNz zp?u^<^cuI-uIs`&PGdockabbJ?k_;?c8cu=MekrW?f~1C>|k+xr9Y{GY?p%Iahj5evdLYqi ziUfj+z!k#N?qG_15sUVyplBCEcw*{x%Gv-zN@H0bq+}$v!nL(of)MYvNVLb0yn;w{ zHNP5*TMH7!eT5>CQ#~T9LVlXTD*iQ3^0q%@MdkoK3B>I!=`6)akY zRNjn;_85(=MD+6=k4A%tE=Oblq5}{efat{*ytYz#&bitk5GCJ zTw=}n1!b8Ik|58#7~g3QZ%)#i$AOm*Koo1_kIE8FX_7n$M89Y%OxwO^cbXunvP9-Y z$9pCrR+*M-V#;x)MhJ{j+(Z%l^kF4PI-eD_Csd@IJo-8giXAUGQ%mLh+Z!v4`ttB{ zb}@MI4qm({`IZvm!Hc(}iSZy0eGwRR@ZxcKkX;iRY!VJ z(E1+b{vqh#!h3N(JJ{bR9Qqgoe9r;xK^b~W2pVNJ%IWj<;+z6B5_as|oH_^Dx(PBB z=s2$n(+3E;6J=;=FpAM})Fr^tL^Ab>ru72+M6q4-bIiqx#0z2t$8+Q4w*t31-r*>Q z-MONQTWY8JL(pzV*lrMX_lt1{x>lnF<yw9vL1xNeT z7=hnDP0rkTHfXBm=jRC9hui8xdkoC|GtjyPFAjVC7-+QTW{A`KU12)y3{<4rK%rd@ zgcBI15s7p~C_F*|L)m%2~ zKxv9YJ%AA`Vnmz_bqEcWk@e^Uj3YslNTN*Js5K@t`4(xlv~8D#_86XBGtg~2;5q~C zG+!DQ0z2Kc)YEnbiZhLLo|vA%Hr(C!=^4O<#v|xGBh=ZCmCm|c`B>bNf%X`UT{FKv=Jk&nqUn^XW5K z@V=sfr^JD$Q65W9#zcXK1>KLDJtgHK;cF!n?!;^mADGfq?4^D{48=8sbzx*9qovaH zt<8k>d^$cEbfyDf9RTY{R3W{cQ(_0e`XT`9;J^EF0@k-S16FsZxnGs3jYvQt{o531 zN2$SD5>EZJh_K_eXf8FvlmH=-%J|PXB1VR|j>P8lUm-b-$wpc6ya&ry$>R%>f;d;3 z`lw6`ywVWb=7}bffovXs#aHXPw(I!n+qf@-t~vVwHbeRA*V>$0|SUakmc-leT{)=;4)t_rP02t1XfggBLiOD z30|F_jMDXDc$>yl(TJ00MdYzcQV9>GW{5x%d1SFIz-lx~Hj|^pIV^$3-WacTJHK|r zt2nZmTkXzZG{h`U$=3whhlW&cl4jYzL~&#SnfPHqJJ-YFpHl8AS^yP0pbZLBO!RzyqGtpt zn~lM0cd*(Wtai`!*?>UJc%JE9I>L@FCT&TgFU)Fp(3rlQ2()_yDL0#YiXatX68c42 zs2FccQrL+fkJ1R^SzSm;lALe-+%Hs=6jo=*QB4w1W7RPt)HDr>I*NG7C}{TxQY5z2 zTB1ONp^sx^hEYtaBIBna`!*fND+<~vg0z&GM#N8bG27jJ=3SlC-WLfS+;#_{=~$mE z5bJL(k=(7^cGC<6Vo1IvZ3!+51ig=To|WW~qF_Yhh=^w(p^HoW*{&i;OQ9)t<5&z` z#c^#UG*4xLB@shJG>aDoIir)uNQ8tea21uYPKj&TKzZh`7Wt`<%~x5q?k_a$c9QKz zLhoWZ?ts~9*q}Va#@v>#Ui}_0RB-$9jR?I+O7OHMxlh^9_p~3XEC|vl$yx`c@g|6c zb#Ah^f}uTzW-AQcc?4-)+_;MG>y*>Gnj{U^)@x{}$#L!Q0Xs2iS@`W@gG`R40ka8< z6$RSgVyi1Pg6t@uytEjS8`IDpV{)%Fv_2enNkgj%Ml@x;+n|MpQcIE%DIK11zl4fr z4_ZHH%E>~srreo|VjGilFBX$l+TCxr$M9^Wp*1a>5U8BC-&h(i7)#c>Tj9_i!?6{I_KYCiIvfogx*C#! zhYmdSzIf=MHZ`pZxj}6@s7*Hqst#(?IfE->QQI7L-B!GGByPgeheul@;TKYg!V_`G zrY0_E85VSVMR9K8G&jB~9+=vc`lj3?jv`1nxwO*OvV+r46Y8o9+WPH{YSU9aWSWi! zt?8gO9kiw+jy7hJ+kEs=gVsT7`f`HSZ*SC^eyE?_uhKM?n3Lt9h<#^es}fqD=#Q8q*|tCGt#*Ai#Yx05z*TG=_e-#5eAGWYXqA zR?9Q33u`wkO$k-%qBQ-mQvBU2&vdyv8FZ${|Jmgie}#1EL1#)NE(y<{=MPS2s$^;r zF?+Y zO9w6lCh)^t=XB`?t^8r>P&$7#5yUF=Z9^Z>cF#51VX7ZU71L5yQPcB5N~**7w_T)gD7~ zuUz$hRHm!>MepJkt|~JvO&(xMPFEptk1mBQF{zj5QnJ(;ayURETidTYx zQYE$;vYToAJ#CR{KPb{LGpZm-Q6+MvGp*~|HZ#!RKz3oEpH^S(TQShaPGumW0}17j zTGHTeng>flZLX}Jkzks}5^;|%At?Vw$g(koFAJOG0}0(d3FVYT7MyTwvR=AwBcU{l z;EJ5Y9*SVhilmJ^mE@`COO{Y=Vi_gWqc?IMcP2yMFDpr7f1PQ!vurmKdME2~2hz4I zLv+UJbCJ}Qkj5&6+Fi}9vB zw8z-ISRTsPv=QH)xO(AOqXh&hK?8!(JLRrl;+SV~JpC`D2+?I#- z7?M|zhpy(=cGulJ&r;$gjAxX9Vk0j_t4$u2$jQ2A*s@X$-eDdkNu>_n&O>_)&#rms zwtaA&hjyATjRnQ6YK``qYj|jCh`CVQ`c0gWCM#2zG_mH$v~jr+sq{^{)$f>P6#s%- z%1nEV#;$qj*3oG2(B+5>Japip0}s7;zFFlr=s*V@=;m+8pacEI(Sa%@a_t+AOo_tR z!eo)hrabhlk_2%%$0XO%_OM)ceRQBQ3}ZSiTXmq}fmC~G9ILS6q2JxeLnr29vY?@Z z>8`P(!E|>p-5pGKUv@3%V7mKq($Md2q@f?r?=_Bv-k;}gqQfYOsFC_H&bv_}l!$F& z!_1FzsY5?ceS*m|-{r`qK^S7l3mUaPEmVGyP}*35x0lRw_i=?8pFVxMr>Ev{JS(yJ z(d5+bkLhySJGwYM`TOJi`>G%h!N!qIikweaXf&WX38a3A1QzzBe^|ZATd~k9yOh;{+?V67XnxRNIls(K#HIFrTL3){F_IkW#dF`$HAi?PxaaC zd@`Looa=#X2TkZ}Up!zE>Ze*sEu@!_{Y&;}g5hDre`e(O zDT0wvhnU)E580zjqvKJ9M?d@Q&z@h}7JkyMxjC5MnWy(!O(`v z%ls7P=Euag&)eD6oKha=T8Aq`xj7oE`bK96)eG{SL2G7sk%5b;G$lN~% ztvkGOwR><-zO?fxvZizU_=ERGxWzs{{#$0;(VL4PCa!*xTlBe>fyJ+tB;|}y1CJ7f z%nQO5$uwvik+oTp1mKQxL~iW2+ha)Xm4ntt<1YPn7xT*raqEj)i{EZkB%z_<&vR~Q zn52d11afkzLf@*ui4!BajmGg}%p>KxK|1O}dkoL6Iq0@MaGis8nlD!ult?C!$*WiW z8V;JVMBykjb9*VjU3ccyclz)&a2&h;quIY(qk2XR`I%w3mL>VND~4DRl(=9qDa^__*s;`5?WKMV>UZj;Q2BjF-fJVMo=5Z zM7D;3R>6v|Mm3_dnXe`X(HeGa;j16*gs-mlC-)9l18U7zDe?eUISPP$_sn>*hlGCr ziQJR>GlK)L-d`v`_l{?ivy-|~@;53?C<=N9pl6RK3pVXlUy<|aOhT^dPIb7FpqRrCFii5`hIta8u)(fpdhllG_^R;q?J&yb1D9ognO1WVOezyjZdd z*6&SLnI9d=DlzcBZwdRwFBH~Y|D@=O~$ty`# z7xPQ8Ce`Ox3t2Tq5vVdh)7S7+LYo;ijI4b>QDo5O%%|3cZEYT5CEl5=_86XBlhtjz z-#S_CG+!DQf>q6#yVbAyHDopQvshd1Aw*#_U#!Y$LdaRrbm99^7)60;oiB|S4AStH zWVOd=?3%1@9gPNAU5>~=RtK^=kkv-X9vo_GjW-X_|-{%VP~jN=b?z?3ku(I zYqpt>QwnE)PivET^qAYUP__^WJE4*fEFZZsdvVaO4rF!nH*nCe{^ICY6K&YOxP*<| zazdtdL945uQPW7XAlFGQ!UsoI{a`Omh&y5*wn4udg{8YnxpIDQBUvqMHoer-GR$sf=<2)g%m%vpveVTe%=G0HuzqhNUH$#V&E|dyt2Tlrd;GF8O5HTv2N*F@03^pW zk8_>sKp|Wu;Yp@wJaYo*a%;0fM&zE$#Oivm;Dc4L+9;GcIx5U3$#(UT%mvoC3y@?9 z&GW^Iu*w?N*-TiY18RB=_SiyL|ER)ew^FcP-KX3;WewLp=|EYpXP^URt?R&-aCDM6 zeEj*C)UyBLT2bC4QrSmIE-0`f!@~hHL?5YPM{%K$u>>4m>iYTR6U`=TF zX(U0#ms0`omGbycg_Wj`Y=%t92K7dfZyo9B6Y4OZFP`XPd~s3<&R>83z0zmCwhX+^ zhUj9fPZn?cU;ooLE}os+Hx5Q`5P|XRaB}v>qtP2?GMS=X*VK3To1gsTC+kG?(dgCTsKTJ{?&3`i4lQNCVpDh3I#u8Sne4TA*y(->DS!pIxac&AP z;kEz>_XT1j5qUv^GkTWBk!-h(Z6Kr=VqVE5`%~6#2ib0v^)8m<4h*k`2+AXDfWPt8 ztKWmP+9)fSDArRsebXV0(_Uti&`X3Cg;G9ULy(_!uGe@IAwODa?{4bl+hb^6ENSK2 z*PFC5M-&pd`W(3?+td;fkQtkJKL3J-H4MFsZ#)L&$b{KO5tRujSs#(LX%a^;^4n=x zdko1dNm{G<)nI-tq!q!cCK(tYo(tv?v6}F{EbwHiV~ky-$X$Q_`lzkVBSJDdlhz)? zvvbnAWfxp0t)1pe<3c2?Y5Gue`a92< zD}-*udC_SFOQpP>hPB6N?3}c28;u5OU5>~@AgzD(*=xV_n)~0p-2SzEk@K@f$o8%3 z=e$YbnPr~P9GAs5RYuZ}hsxP-+jHAR4yc~AF}J-yibSxBD~rC@JkLgW_NDyvNk!&# z7E4}DdufWYI#e(^W!(NUGoQiUf|n&D$oSd$gblj$MJO@o6d-BVH~u34lNipB>)w1+Wa+3s21TDr+ixe@(2 zg_?i#^Dn>l+B^C9$!K=*?8JWmtqc3p3s0Yn56=$%z!n$3`_{YeZx_FuS3h;Cr-$RS z12HQ9aX;k1(z{iK+>GZQb)%CB(u48jY&II7U7HEGH+p>S)!E8Qjy5Q1UT9nWo4{_SQVO( zART2IHA;j59racp)4;gysQF-FXn>|vX6UC#s|w@H*T7&&4TkP^8^zYFU}zV)Y4BKx zgGe5%Bf=IKx?7D?{q5bomv4+?@j;k0k?#OP2M`L8TX@Po0+h{R-h$=T)}tlATmzvp zK{BEfuo_JYfKZcqTBWgv`K3;c@m;!U+Y=2S^fq3;<*_IRO}c|qy=dJALW@w_TuKT4 zbbgoU^Svxid@9zlL6VigLV1>TR?5oT6UA
    >C^T_85|Tg`oA(xH}`?<@^evX!ZHk0zpM69MrHLuI8YQlxWkm@C{5f z)wB!JIuo?U(5}s+M0JOtJ%(r35Omw_w+=x&&6leeLSZi6Z0)#4ZW@7+eBa=A$EC)K z9C>!?3?lPPD>6rvOruug>#Hxw3YJD->auCzW=6g}Mq}3ybn9p|An0;L)*6}3(IjsTEY0po2 zdirc=!a+xm9ST@5LMNR0Yy-+?UOaB&bJw`&{P|J-g}lYc!vl$T?xtjxx+b5<=nOqS z%_Q8_%IB{=cH?VY!$Jq9s@v^pUj?Q*2tfxS=;qFWK?u57|DXJ9OOM5`Kc#+1D%Hj0 zp)yYu6WEoh%*&I4jRre9PiH=sftm8d+&4BVxOF}-<{9kK;Y|eVX6C6vRoySU3qjdr z4BWGpEB5w>pS=IwkqaXOtX`bKT8R=nGh;g&Jsn>hl|)rvUK~xPK+Ufq{9N*}1j3oz5POGH~#pGTX{0%_cv6RKD)y zf~>UB>Ewy~n@LgFvzeXky|Z5u<#+ba-+gBbb{_4&+vUfWbb3jSYj|2u?Pzv+3fCV0 z4ElUAHh*d_z|ogy7qd|Ye8@)=@bmbz%yG;0vqz(+*8Zsrb$e#@^wHv1cO4<#_HZ(N z=KgN^QhTF6yhN2yqHvu}E-%V!;BdEfufUIT73K_lb~L#>$wwLgIi4b_aBpW){&g3G zeJ2-gIx%)O8=Xxq?7{p^vTly}O3(zLPfnhV^2yV)lZnoGuf=q7TE5$BQtUpQT<{(G zV|z3&-xjLiSvzbdQoM+v+7q&ljDR{ir zQ@%O2e6dx=p1Y3k9gS@fBfAC!aav1(}yku=WjPpMDUK zVp@d86i9oB@Qh-3CyAyBu}uXX@45S-LXcqUWT7;?reu6Z6nE;Ht_RCLwa#3%!$^+T zq?Z<1;HS9k7HFAJG?|*!ZWkeF$v%lPl|hpVwy@9LD~|^LNk?kg5-?<$KIkk{=Ugr` zj4Hu4boS$M=z=mcj4GXLjnF>gkb!?zv87EN=}m>8bG}0ok@JbHQ-U`BX_Uy66uyU8 z!71GEM%EIqvKUvyAjpx{Z&A1{_$SDZ0%=*S?k@!Gc98AHKks5W?m*Y-#e0sh(C4UO zcHD!3a#xO`4CiA`^3;fhU!aHqyJa!T>KHi;5U!25HQq!JxV!u9EO&bh&5LEAlmmJ* zP&Y>!qjU`ejbno?wS<8ZX-cWZ_Zf^hbMhV=hoL6Cpmjvn7-$?-)8xhsw8xOVnhbP4 zzv703w}pX{%#5inZ3JK}=*Cg*) z;`8JGRdz9!%x3=D|C>Mf;>{kzvug&rZ5Lc;pq=JRV?kk6bLq(Sd&)Ho)K|!9R2;jA zYTag_vkxaGu|I0g24&p_h^14gNmvfqq>_85&_GtjN0(O{s<5g8chz(6Z7 zJ?Ki02eVza90Dh=2v?m1dGw-D;F}9MlvgXmZ(&|-38eFefg#59Z00J*oW>*#)7~htfim*U(@}L;2A03Ej&*xb0!VKDUr4mJi+Vdl! z5`LoG-+ph7=)5J^Y1kvr~F>eNI6oW7S{jqb*%%NI#r|z?(=&D`u!iM^jsT z|EhJ>SMorAbGU-LM^ZGy;5JNTpM+OrPY;ejwik)i{aeC7q%Obt=`IN zP;Y~1$7jIn_uv2c@qhbg|8_R|^bh}FG%Nen;pa=S!ZBi2CaGnxTrmniF9f5GLfYJ+Gz&;Y!r zlQFNd@*KQ^^!H0Oe(l%i$Nz$o!$17W@xOGx{p#^w@Y|okPUc&>!p{Z#%lD{)T%Raf zuJ70Ml9tJ$-&%fk=u~)b>D^Pp&0m{L5B1sjXNz5vD-3+`!{0kQq>p6PLelnl!2NV` zd3ZD;$k0yD$_wX=RLiw<@A>i1-7~3b5ufU(dxvzSTxOSigBG0=ZYAIU;L{)MpG*!X z`=^>lftQpSFIJ&HUbzxY` z*3!f}klM$zi$6@XU!WzRV;MnIfw56aW3;MKn+MB`Q(M?DO|eB5Xn+NLJfP3p=6-4b z$dO#>W$Pbz%{-V=FlHknd@Q2_-#-ZaT{7eO7NOI=YbB7rGtI2;iIhNMrwlIt-~6O& zn%QqJ=YFm2jAi8URM(GNtG7M?-vXe0!{=9Z+ILDys7|u%m$zdjQ{R!-y-mRn2z`e^6S;xI!tLh9D1ytI{F(j0pF%jSFG@=)Xd$m{KYGktv&qIrtdoCYc zJ$9pf^e*ME*OU_mY3d7?rha2>6I6Z0VjF7}(+F75_D9DC$U|Y9=?RNhKx_kx#%%Ew zYkQK7-?h6l8UFgbvhTUle)UPTiyyIB?ioQyVknZ_V{fHB;pZs1riiy(5~SWEDFO+m4tEL=x81IIdh z_kn012afe}a;&%Jg_zN*G&5RptRIwj&ijQ}2Jf*jp)tNjC5UlHLWK~xdSDy+SLbNJr6B1q0}1fAr08m}N$J#udY z#0n0AxSQ$g$5kz9TLNa+9oGs2-6g?NULXg8wYt{7foXw;p??lnFDBE|*<(&pWssv+ z4KSt-F5=O11C1rth2AscN!e%gMDEG`nK`njy2f?BSv_TLXJ$Hvss8ZU;yDj`J?E9g z&DslmeR7g}Y*K6SjlZ=FX1tYUYmD*=uVms7eT0f3`FohRr2>nwJkJv%LTr-P-pD|( zmY4lD1gkuz`PAE8Fk8LK+e)y49Puc1F!~g*g9<59C@mn3Fvr|zZT*xY;(D=hS(~39 z3RQpw_>Boxx5IQdg0=I7v;!Hbm3qrFG;V_pWls-$W&Ozc@*(Wa1Ug@>T*bxaEEQU& zMQmc+*xN>=@g`6;%BuW(Q_t2Oz}#R?4E5Pbp)j zg;dHA<6gA-?5@os!VNm(s~)4XYkcK0R5xv1>-ehEbZK0Om^G~t7J3c7ih>;6USQEG za@4({V!Buu7VVR95ph?FRJZjjTHaA^hOc^z#;);Zz`rZ(ZoWB#b&$JnZS( zPj)+j)Wgt6ePhr^?IRC8KRbMW{FiR8@SC*M($b2UIeIJ!drJ>?Sn(_x$X?y7~mirNHd%OduNBUZ$9A(E0bV{00R@YO5~)s)=z(5PI~{a$F3Ns5Rl#1;7ve$GF>pn*QD6^I|K zI;toVUuf;LgCXEdX=7|6Q$wO6NG+(P3Dyln*TItXr0@B%R7a_UFluUsS{yY$sTjd+ zz|xhy(29248Cl|Uie6;tXtn14s01&ih_bZBuDKWg=t)g^y=5XADv3EyLJ(ev^Nv+s6FR^4bml8kYYlva<&%hys+^m zd=kJor04Eq6Rwjl*|Lv zZUJg@&J1mckm%OXxu9SZi6^ZpV6Q?LAMjTeUgrkST;^Q-pDTT=pm zb(IoWjeQbX6Mp^TO=*pDgrM4#k;om!G^u8($k|G3jGTP3>;>n` z`IpqlG(a538j*y2eF}qVJq1jJkSW>S{2;rB2SrR}>bxrxDZ}=BKx){&t6>vp5iaw3 z->PhKm%yrSUP>I)X?f2hemJs)MAV%dszgxMWelmmu zz6hho0c5_U0=ZB0w9GhdRmgql?lf>rcc-~0j!D>`71TFL`wNta1FQ{|B!460)Qg=% zF5;X}jIQqvGgDN@*pDfD(S#6JL@{S?ojRrW8(6t9!n$#zT0gHA^xOxVb&}j z2aLH?z+F+Roz!JwgU0US^D*rsrL6Ex!_igh&}GiKW38`3FQq!k83u_RMGY+V>yE2~ z#_skSyXDCUfr+aE*Ngpa8as}dRF?(ETS4v|l?PYpAU;d^B8ZH&O5{i@)|uHH(JWt0 z#=h%qEvxua2!D0`04pz6Zq&G4nPw9#Na70RUlYPA!N) zP1NtXi35>Ivys2d-vpL!O0faC6~*i^E?X()XH~Dytt=uJ8!tQ}MOwp{6vw(^%;i^> z3F3k=>J#J|j2UMt6V63R7RE(q@{7(w<<>InvoP%}ByXU@9Kpe8F(Nk>+4UHbtr+vq zw+_h`kH~9A1o zXV~6GGIQ1Y_4#u31-bGxT`sQt%{XR{(bzS|+&UT!j=3C>b&h$L29CA-y?H5FkvYq1 z7kLo@>+Azd$uQ?v&7>h{5_3;Z1f1FoVRh8F5--w(FG!bDop6UOdGU7g`S2B^N@l4| zB8jD~F0<_w+4hinnZeH^OBup#&>xWDDH~nvB;p|8|80uV>JXE1>UKxXa-=u&PklZe zpA7u-ld^ZDF02^%=fFSDtBlBjf0AOy#dtY_?gsw(5c%g1+@0or`KKxZj;DE&XU50B zk8WvU*Z`1gCyPKi*HA+sRV?YFvt)w=S&X#=F*6A|Po3zv#=Raa{|pj?R23hiTnkd} zLY*P&Opv|At`Ra-EB+bOKJI4zsbGUmFxaBw+)d5BwnG{C=kb4bU4Vm(^FhlvQBaE% zS1}KDfomSt^kphUP*72yB}!Ts&As}r5Bzg?{FD9`5j9NV+W2QeYrQWdj+UXK+n$>U zL5AcT(JG@7qoYu^M@e1fpJ^aU+ImC&+3oy#pZv477Iz?PwZeUQY{iut&{Zb|J@_Yd zhU{6KcwJyCb!Yko&^`kbz-@w79y*z}@lW1Fl&U1Iatm*&;_NXlFP48&BV=2{XSv^)FYWx(ro`l#4Bu+$e5>g*z_%JD2j>q=V{C-*nc>@hy122ba4&Jh_$5YWTA?wC90pXr{$0Y6}mRPxVnZ&6n~ z8|ddiKhF+V7Qv&F3He0>{T%4$JOTA$G8*XTp*|b`teh3|v+fr^{Jpb7eP~Bd#}`NC z^;x=8PKwcclatHSY^?c<>E!b8Xmp5u?DXu^o?VQbsb_g%_nsgB+|dkG^_x%i)4fBU z?lQZi!`zvB^YeRVa=QP)r$5*yqHMB%s%IDW<)okAUbMZp=OccopWQF}Oyk6lGpu~6 zHaOU4EoS*P4~0;E>=$94k~f13MCLr#Qpu0eE2U_|MkX2h`KzJ*1bhZGzmZ^0_#^*O zLhkDfY3Nql*$EegE$ANh{2Ls!F@y;Y;bYGTCY;qsSYQwFrnXg z!3X*)Kf9e=yOGZwuf!dQT8$8t$JGe2!PN`jgM0dPDytlK)F909-Ar}v;Vg_;Izy7< zo6tmd8#QomLWaJin0_nWXOB^NvD}lZ-H&^wd*$?Ka-5GpcyEMivEj$5W3r|*Mns3! z5ww)`OOx2g66RZrMXJR)qst6Ig?L-;*<(mvN$y$AuSQEpi|(_)n=KSY;*sPKaqE#0 zB+${$|{>$7t-Ddu|<#2KQW!$iO`Z z?m2MJi!H9aEAi%B2sh|H*?)(5p0cAUA;>q@$_!hs=+YB+enEHcraN%YfqUMS?`=-u zljvtcoC_EDLD~ccy&Pfv%w|cEXF(hm4~~1vJzSVb8oQo*;(IGZ>5WlN`R}Yv`MU4z z@#UEvz~=xy2kEOzz~JiHd#7r3QP+IPxQd9v4pu)0slJQ_w zpT5>bPK5>&-z3a1{ma5!(z2ftQa}Viyds}bjkjzdpLoHF10g$*&yOl{b}RC^+MnD% z`ds6?gX!&==k5r5W<1%Wm1F;j987Oh@d!|dUaG!eT#r7ZOce!64^IMeT>TmMI~_}p zG~JlokOTopy$NCYM6=1|)YuwB#f6PhH3A-%He@8e!f`SpBSuC#vYBzxtGaOgTSt2O z1kbI{7f*CCzBr-lvxMBQzyDs@iBnqwUZ0)Q<)cp)Kk={s=^Gc%&g~lqqc_+qKRcY9 zz42)DhM7#J`S?uZ<;CCpJQWxxn_|w`JS94EE3=V%K^lvt z3-L`gpFM`<#j;N>NI&*DpC3s#&8LhK3^YOj8Ya-tX!N*rlp|eFgwLn|*lY*QCsQO; zl?wO9p0_=Qkr`ntg8D{npuMr}=XALX@i-gsy%+ zxrTj;-1qUF3GjAEm@kQPDa0o6tS|FW7S{ONUAxN_%;%;)zop!aefAiQU9-=vqtRfW z(euChd$0Y{YwmxGrEGwp0|Xr)=m0^_4!vcFUuE%2R#6tFbeG5=;y9F$g_!9$#1{mY z>H&h1A6XVqO3Upb_VX9V{Fb0lr3i|JdImsHYv^|qI`fRMacWJfBiHZtfW)7nI0*c` zIK`c>6@tnG5gY_!Pg3@EjvVEN^m`j2XkoMIrJgzksAPLJ`WQoq-cv)2BG}uOYB8mmSE7!woLN~r}C-!f( zDL5Bdl>-P}UC3)e==U~)(BEI&Y=EKeW^+#wpoy@Bt2B_(lk1dlBP&6lQvIHGg6hui#CJ)+B@-k{@;K9OB83|J)ek9lmA!u@$PeSOhkU26?j4)O( zRMtLjD-2CMUp|)6fk+ObE->_ub^=4M?o;j=h{}U7ZDQX6hz>wBjUE4VwC<6YETCQ= zAZqd)EeH;t)*aVF-*sswP*JVY3}b4H@}eOH)KSvi0nz0VDG5sLS-pVW21JQY3dl+! zq7CsU$Oo^_EI>k~Vk;n}5yq>no~v^px_mXPK+}pF^w)xRJIHneqIasP-A6qUyMq}s6C3(5CkP!bOIKJ!Lm-hjBuH)*yB<}BU>?oaV;gFt%>&AmfW z8P|e9x!PT!=<-|39BHEKYm9Jd$M6N|0bU?u!toSjEsc%#pw2FOo%XY$Rie8#O-NwB ztsu0=klZH}y)qhi76e+GUud1{^Q#4l8chidp%C33ZXP8ueKgMJn}CF4f=W@x`Srh=^ku=yGLR z@3U#VV2o|??VxCn(bzQ<-8vc#D7qYxfrSn%^x?D6L9jWn%Hxf(mIJH&#bK2sbdg-j z-kEd1GpdE=Yu^I$(})n=ASn2OhsG*>+MDV3Qmsa{%R@$hdknYsvNqqvsCK}VV`GPy z&XWOCp6jzguW7~urYwzS2TZxfd#}ZmU5sk)kx&L0Kp7M^K@egFrBsp$oGj8JVv$Kanhl*>ARe`ujSDLLMp_jY1;yjq z8yVD^%geqbmY;q0XU{L~@!!x|^x5;bUANNz;9oyF{-5Qqf9X1oe$y9d$3%mJBuN}L zoCW`X_TDu{vh>XJ>T%zzU2b1`#@?Ov_)JgRT|JX0;@mGe?zXF|`cigvRZUm9ZI7{P z&owi$BO}rgky)L+3mORo9x0_2q84cpLIN}bA+#(At$+^*EeHfFJ^&K%dHAp^B>1pj zfc?bpdEawRoVa9UWL8$WyEiQ>J1a8I`@ZLW-s|)KKmTVbIO*A8T;euPvjAs`A0=kw z08ZKt%IC4?mwvD`sA;Y?&k5`r2Rl7Dx!%onJ#g}zSK>7gua-kyuB&8z^v@ow89_Yr zf+96@&jC+KMcWxoXVil+Md6WVTjYmVdiA9dHpHYF1v_)F=34#)WtHD7E=h-+9+wOe zub4%*j=?2K`x8azHIre`72!<>QD>!yl@XPjq)1|fAXkePS(qW5#~u}zJjF!$LgJG3 z{F<}e5?nG!)1=G<9V0&jxTH_Kb67?uy4#r@X1NpkOVQ-H$!y1N1PgvmT=Ep=Id5F@ zq_b}umt1SU%yopUYU|;W35+AQ4)_$r`xD%3!AP>$o!IPQSd@8IT zmZV9im%$}-OET4@CAl}k6t16bS(4b}a~4DCb>h&*tGY}`w!tL>$d7dln)s0&c7I_iQX$KcA zLnnz%@etq%Oi&l(eqpPa5&4x-|FiAV_t+s~uIh`vmmlxt??OFlh1x!(PCJ#_Ni z*Wxvhua;xom20c(T61w-r-++OBolN>lvgfVNT?)Z4A%ps%#er=iTLuEG)pWp*9b54 z>>3R_D?WJ&yZmPHNqYOV_#_j=6ZoS&L5{&EQ#w5kN>rA8vdl8CVp1}eDS@qdnq|Zc zv#>3*$if`)npCrA7Lz@NNxqQyWIey;mbNAMWN8^2wlGCY1qfI(78k$zrmnFwc48lP8^j+xX;K^JQ*9kyUMu?sANnY*7YYW@nO%*(q^H z7A1~J2rwJ~{G1fQAsHT)&6l|fy)bMN&z=pRJcTvR8=pMU8guw$W04Dd@&cc{z$Y*8 z$(}zNe!QFITqp^-JZ`EK51{dekUR-(&r%hXUjOk-lpSr z+#rIUU5(i_@kves7Xq&r0Ddip;Ik_f2Nt>RKx~mfx zZdQT>kV(dKBR>klGz`EVgMtW2f@|zFb;x#IMn&%BWt#iM1LQWyT~Ocw4O<|==N6wN zUNi_{$cJ%J;*BEpcbY}WyXJOWkSDAaJ9#2L=@2}0&v7@sK#n1>yZ*G*K}%vM&)Fy5 zZr>BaC*2Ea*U8>^v)es=9AZCj4UVtZp^n*5oD93;dyqC&jzzP^u-B@gRpjS5dNL>G z%Zf_dWL}D6--*mL^_X3Fh)G3eyHVIyTE4(1&jp`UHzPWmDDqkOWf?x{$9a?`wq=G1 za+O|0l0_1fBF2j%wncJ9uW*(|88z68zK4YYn&M~1CzG}AufGv|vhf?Q3S4a*>(#ZD z+@W*G*D3Hxw~XY9ADI!`7rL%CabGstyO4DY-ziepl{nQ!#CWa|mgh?JtcpH5D?WJ& zyF7V((rxLwu4Sd!Ar-O-R1u?b-!za_Oi-vwySO8cB1ua@+ zwn8@yov@xGXT~Q_VUj0`PqwY`_;g*T^9zf&k>w@$q?>29mpGQ`r?|qrAaOv+m`u4x z3^E5_n@P6JY76to3u>#Kj8C4zJm-y1o^<{_J3cw>^*L1d7<`g!Q+@)dZa$Zm_^DRfRjl{Y&8T1!jFm=r$lMVOjpQL^W==4$pCq%%>M4r?f@^c# zFwr~U&}*UP66F?Y-b;k>N!Ws<2$-UpvX>tu<82rP6T(!bfMqlHvErX4`CU`eS((6} z2sQ*ceg-dzO=2&?BF|IQfuMALp5il!81OoHaAS7`{uy;5JBDAp7XG=LjIwQs&*bQJ zfq!1$pBMP&1^#(~f0o9zi}=jrGKHQI|NKC98i~(jr+Gs7r<)_p0DCR8Ge66{s35Od zY}qCMN^>GLkWR%Lb5 zwDFl!;GZ!WDWg2~P4bt6NSC&4CgM7DY}8}n^N_z8aCH%Fn`?veLfcKOZX zpTLi&h|dJF*Av8>$8&DKcg+C3d${vYaL#YPR?*8nI2#2n9}^-Ob0jMYytm*vVTytj zDy3E~*#DwM=I4k*OlW11GvlA9Fv%AZ|E%X1r1$pxT7rM(xWEcOMC&&WLE+-SHzWBi zD||cmW1ODOQq+2W9^qT7SGJS!&r_J^yz$SI&cAK^bFKL@*AW4$8d7NOUOxu^^s*o+ zEuTEF&@0Jk4W|aSWnkKV9Jn?BC`lfc&6l|f(Z7Zs^(gwWr?AF({p*=(7*wF?4d4Yef9w8U_rv@jLs_n|TG!I`^VDaY&|3vA@b}UI; zp4pN}JLP~bdcav=C4rAfRGNMM;y-l`keIXQaq*uK2x$~Fc{9JaQlEBbzkhfEe_qJb zUdYp4$kTpK4}XJn+%(a-57T0$&JqS}TI=UzEP(B#9U2VdSQSo&|p3ho0p- z-W2_8=cZhZeny*4Fb@kZiT=D*NA^9EI_>m)^5ntKi{Q_T;Ll#tuOd~?Nu1UX3&748 z6&fG{z)#7d<)sqQ79pW+hZZR41^8KIC;jDy@r!c=KcR*Ca|ppQ@G~pQlyG_133RPVvCmUjIYY1Do^k3u`OyOg%!cK)37vyGJ_7mzG)_; zJ}{BDP`L`7+#@C;r+LJ4sm4qWjhn?m(KkLW4vpPHzC5Ok+!z&m!_kCj<<9h( zEEyO4byOIG;e+ZMR5TnIiShleYT5S_V|!GTZ@zwvvzK^Xx0@#uN}7y8EvEhTpeQ~D zdRBFGlXSR0d3~l&2ud1`RM&0p5AtHv?+uDSew|kI-+X;AEQkF*ZQ9?;=rGk1U7nF9 zC&+(`o>^VjP_`@G=f1?U@znD{^+3S_4^6K%eYP}mQ?lD z_5G1NlNfpR6oyPkMe^~6>acA+O7ns(cCuRxCdLCwG&0OrWRnd8)xWG5(|AJI5zK>hT%-6ic-^#)mgKQDN(!Gvn1 z_>6wpV2qE{Z+rhuxm^#YQ^v-Ax`RQa=N3lm0XGOe zR?E?Fm*yVI*Z2?fo(h?@(zmojO<`SEJm&7! zC&N8u%Q3y4uzIup$=YJaGfPKT?K-WW4|o1$f*pSR%+9|e|M|)V=Kh()+&4H0G<*C> z+u0L~J1*VS=9mJxKaG4Va|u8WVBa||8JZ$LKw;VE-?m2xM(QWF8x))wz1T(#E%0Nj zY~f#@G2P{#)aRTB4<2*~=-%p$J8T=>?cr|GWoGYowkNy&AN2A!QFSHEI(95k)l2g< z1;TKNuMSJth_>rYk$2l~z3&3_j#QlGn@)JoChFMP^sP0Z_j`3KPlDdt2eK0nuulMh zcTBDmmUGXtHr4;<-*qAS_-F6kxU0@4oZQ%7dmNyKqYdMF=US(Ax|40_+IFufjeAA5 zJs9?fTZh%3N5+P+tc;dPp5^gfZg-+r{L6<&mvB>Z;+zOFoJ{-VGNzy+W}m@l%yK8|d#Ss8Lab#fp>9PV7yQEalT43}P%XHHP&rE{US zY@9RTUfq@{41zR2NfL_$H=9E&c$6o~yJ8dH8pXB)N_ae)Sk>k@Bo?o5 zsnY}Q>-jX+1Kc0a0=x#G+u%i&KLdfmx!}B0!0znbap5G0V7mnCdkM*uQ_J^JjcjfzG2MGX0!*dxtzBg};;uw9xgD%QRF$ z_h*yrJ%u?=1kwNcIh$h+ww;<}5x0E_CkWT`gWhN#hp2|CfWVN6@X3Zy=3s0Y`*WIE zgwZq7;{<{TLH3oyb@uUZz6GKA&f}c_!O+(~Ag2 z6x8ocB$`-<$((LRUQ(K+2g5mXpemPj;nPP~*6<1rE#)W{e>KiH+?qXd9BP9+X6@k@ zIZWf<8)S!dg~*I@061mhXpDNvBf^4Ow)dN|&H)}*@mIJ0_^JHyuU)-!y~cfTC|?^62IAShIu^+4;m+Tb?|geOH1SmT z4}T~({7$kjun;%*WGn~Ahdcj*eCe+O&3Ps}mtL9*8XhZE2--58TCmL=01)3D*FLK1)STTeZOU*oE3i?JBNxQ#=+pMVW+ z3lJq9kOl&*-|<0_f?^dL#x|%F-vSCzUlhkWe&VWVIr(ZI%N@ZB`r<~%9leK}TwobP z&dRvu#s6;5%|IXh-lqap?57G`YU3o-AntK||2!ry(*QKby@$exz*q%kY5*Ew6#?R? z5lBJf8Xz6w!dH+%|4=ZveouVm8c%sp^!sK$%=QI?s?i1-qZV!jU`bk9z=LAksXX6L zY0vjF^PX=eV-lnykDZcKwnTy{4xlF6kRl_J$+@m%aZtwmN=8S@4y(t@!<{1;CSSQW z)4i2b_RAPJ8T39?aDYCW9({B6o5q!UGUDDa9`5|BQqZsJbKL%(9H2W7dLILqg7+-}_l-e6ZE!Y~k&FVjlPRxpae; zi2#*t-Q()*x|@E`iQU+h#4)EyH@H?;9xJ!`-Q^S4G~QFQ#kgC|mM0{(nYa$Rc79r9 zJ_$C$l%O*w^gS;m3O!3mIfxKt1_iyy5c|&@C-&JU@q8pf5P50x8BR86)dOwW;@6c+ zoPe6+?g4_L=0Q?CXgN=3{n?l5C6Xk~Q-A1^;IS(!tK_n{q^cKohq+>2RPNNOGR`CI z%z+Co;2~SUki(jgJprIuyDCKB#}~*gs$n5+tSTlE6>;S?Yb$V_-wuC%s9(_W6HnZq*j2QDuc%?O*h2#QSjc zCpU*e4tP(%?t!95+#3R)8>ZSg1$dUhDF=}XjGiR2UH9dw4YorF671Bior43562kfF ze8KgFgbbjLUj%^}7cm~C)Z?}dIBt3#_u|qH(!har`sM?rbEkH(XH{+0=CxSvezNmh zDrx(bMuq2T4l#9oINs9;S0Uc2OzI2B*ItlF&m$6{ko!VW)+tW(V=K?IUu#YP_0g!V zCke77a8VNrlNd%?$yFTvO8EB3Rg#V@FICbc^+L-ESy}6I`uJ5><)Do0W!xY`GR~8m zC-coDB#oBKc9ucqx46JoCxGV3mE}J>=%u5^AL8V8L}EzfP?cS*lF*tQ{Y^%vWw~xn zMnbOY+BDUJ%StbH{!d2OFCXrFS6OH0b@iX^f3*FN)xtaEkGFRA)X!hZP<+iUvfM6H zcJ)+(Ljt0CQZj&;mZaSaoC4-6V{ z|L4Y=w%;Kj+LBy!t;0GgAZ`DiW0O&N(}w>S#gSkUs{60(LjD_UnQ&Pu%7_V}Xdmid zZ(!~u11MoiTZL1RN-gnEpN9K){l-Ve-FrX3`OcfK&U61>eM|mY{kZei_wU}hdh4wZ zR2>FKNzEyd*{BGG!q$<~`t{0{qnI6)D@Ts#aGqE@ghez-gqEhi&%wQ)973(xD>%zb z5ko`2hB18&7&G!3MhbJ~m>OOm8y~bhAWQBaS3bCN{S9?M7w#9dGb0hN4=3#Epiarj z{$zVN;ym0j-i5-$@m6Ry;J4Q(zeV7NWQ5Zw5gydmDA|?Xpcrm)1^g&jIVrvJu^i*2 zx#{o|edr(ZuTlMWcroM(IPO4QR2}>ME?qp=%S{)kC02K{@E^zfyAl^5x0*>W`?!Gh zq{(T}4f#y&O~OAM>Fu`YFupUAw%98HkBTXM8%A% zJ@nM32u(9XqLnd(m-=AHmCpF6*zRThLQHt?#s_zWXNnyZ5fY4EOv06I3pXItGfgIg z86{&?DlR?|RvL9Zz<7!&wJwl<<@U9Ex8L~9ikM7CR##2s*3ar%`K-QH{?7ch(#fqP zB^HlRS3E$7{33^4=B8`0o?2y!WPKfJa*XpLsV!r*(U<*@BXXLWy8DXR0 z{?@jEucJPv2$Z8n3)f|J8;$Ct=qP#6+2SU?pYG!ssK&7($-H;>Y8UFou)CY!ZWw(g z2~}6B_4cD?O*d}n#gMh~M|w>c857p@Cv>kYvk2VDadO`#Pb4t81?*~BX^M~lqar4! zBc)w=7<-aWsC)dI*xDv3S(qIlC=$ZoLYCVHnH*Yn_IeKPM}zXpM5b93#( z!1Ut#gtFK#CaYMu1aD8dgEywsVzqm>C{s5GHaJkH54Py~*fF~U+!J24;uXt|*5X!u zpw|3R%RF-z>kD4hsFxP`+kgVb{*ffMsmJ}1dx@ZFK;>EK6J=bwo|Cn#-CW|UEA#Xc z52vJzeLpd|I*5xu;_Bv;N80uifzCoQ61K&OR^7dyhYl+})T;OS*_Z!Yf8$l*=e@dV zyo$^GaBDbtb;EcytI31Kn7{nu7fVD(=9Ng|*pIb53BFIV>TC#wYUzhzZ2RXXWa4Z( zVTa^)kqaQyW-u({RRu(*MJc)eTo=q3XdMz|h1zZjo_v{T;^0qeK{w)_4RoGP@-5i&tD1IQ9AA8rqx82m3GxgA`% zZeftElwi<}AmWaI83(8N6xHdate!_NV@tL>+R!Mi!>a!(-`BiC9!YKE?8>q*|mfcM<$en3lrH-Eb;aM z65~}QadK!!wgV33IU;|%XtbJ_)yyJSau+D0oh)Q>3hSK6!TLpQo%vJca!TAu=ifFZ zZmsDu+Y!FQnnp*od;K^@9PYpf9Luyza%gxUUK07sp&Hj8hj9zf=t@Rh)AL?TLsie8 zjS+VWYn-=`$%)pOW5hKUStP_gljp-p?Nud9FUvaoBqzpw?YXeiqO$Ng^C4U2C#91* zwXeK-Zkgk^al^lmS4Z@^e6;2`4iHV^+Xc3>!8f=%QWK)sT&xm15jLuFZML3WS;sNH zh$liMdph5RdZDXIQpDL}q;=vL=mupY+a&ykBW0SQ4Hm@cQq=?+{n*O4dOF{GP?rpV z3jv*U*lrHagIc-3k8v6Usi)N*RpH6&&1aMBITC@DFm#TI^a zc0dMzU)V^3aO-7fQD&Kad}U3~mn4Z1($VD_H(S;IL)_0NELvIoPEXdE`0S^+(_Dm2Gc1)Yw8|!glx-lN` z48p9NKw@~(@bk++9``{e4~ONrB$BA&j=s_#54Zb2L}+6FlM+B}EcCnu$|y0f;ilt@ zw6;wwv_S1`6q*CJd(W{pZKP#`PDBz<@j<9F!CR_iQx(loalD-llTmI~k`aPW_j?d7 zDvCP9k^b0(w+We4g*a(!`siox!`9prD2Rg~@(lu}-jyaB@5&S4b5+4`Q-BObjY7V1 zlcMDl#ee6QYwF7s5Bp9PU$ZHHOT%8z&cR;57;!)}G*m)P3SLIEb8JP#Bv=st^Tdkb zj@PTUbgi%{Tkl)3QoeDmqExn8d_3qy0!M{dU90b4C-W!WuA6mL;rCT{+`kEobvz@| z_coDN2yxR%vhPzcBG>DVV;PaxTkn5ni#;)5E3`0ih7>j@Pd_f;Tm=pcT8`NffglB! zdWY~f#PA9k4W4JYNZC6Q6htHanv^_QTA^FO%>{)KRRmcUw*x{2a07ifOm zQS(Z#P!bI(i@~_tTF*8&)i=(((wObHnS;LmsBTV%NQvkw3DFBigrYJ_Y>iMiy6Iup z>$DNRdCDgkpQhm3p{$mkyJ;EC zy5o$h=M)0f{!n_a{!sO(d~@lC((&~-l`)z!fBDOQ{^9-?l+~)~lVXPdOR*&XZ}szE zll62O=`(X|3nLE~O52IL43vvVAduQcN=RTP?jDCR!~is%!gbKH51cSq>bvHS)UGWG z2`jBUsHX?z);mG32g?0swvq}HT4W!yvkVAn9n?2Y0x!HGC5MBJnkz?4E}Jn_Z+vWy zReD6$;bg0hnA1mBUNv7tByCV^C)>^4*|k%y9Ap7^@XiO{to%d-L;VNiIg zI@%AftmRANhD2RvDM=`BvIP{zeTN@0(!tbGmiRie(#r8MtJ{EjYGt`EwRZ8kk0LSy z;g5^WoRk-M^#hLKLZKG!k;|m zC6wSzh;HZ_kT`&whm(hHRG;|go?lj1@mT21ev%U_juD;6W{TznvBGM=L2D-|(c^ZW zySCP)cH-BFX^I)IyNEVN-QTNQ%<+b zx}v_aR?>G*&s|wzPy|_)xGW&tTgf5HP>un_h~Ld^uLMJJYn0~Y=E|xqSzT9OZnpmV zV?`xg5&~FXRew~!)f(hViuQ!gp zvHrpGQE)|#7gNM;?Khs-g)|^pT9gzKa7+gJhFi%_E#hKa=r(cAjWn}!H?+}jBgn)f zgg-}^z#_sV;ntD6ZMM^A>_XZ^@GVy zX2{|h#$<-_P;6M>=FC@yOHe|wR&aBER|E|b4pG2)1lHunN66!H0(rM5v6$}@!uac* z|4)uGudR2UTkp2>LA@0(ov_nj=w^NEj)o5q2^}B&04f<;*Y}{GzIpxjPjB74ef9bp z)VBGK5i4+(yT$t*HHwjIH%5v5;8z>vTuAOn8Q)0u_VBPNT6dR^|LBulQXbA2`NQk) zKHT{ybS38z4el3ltSA?pB1y)EunUJ{hZ8dQsVuP5gq#@|?_?w6`{yLBjJ&)Z{|~j^ z(g)WUXvU)%_e2`w8I4P?ouhH-5M|sqPd(CVtAolT*#xm)rApanAnigPU`6HYb>!JrV^fVzRk;M>s-|)-uC9cOlATK3t}? z?CM7K!o1jqmRVn*36Eyg6KRxZoUioODx)sa^u9CIz^ZUm)^dpeP12so(AUll)T@bS zk4bZpg>*5=P$1k3v#ZQw*UlZ+3EBJfHT=XPm-#yya^KV3XX{!$gjeF!&LO{Lgk*b) zqDDw|nFem`xCDbGwf9CpwzA~kUipS$P$XsQ!TJ=TEf{d3%oOJcBwA&T04vBfZY%YM z#}%}!_Q&JLar4qn2%tp9A;ugL;!)_pxrhS92x=k>9E)(?qxf-N`3N~fiNG0{2vC#s z;)9+<^3RDzEn9PD7y#2f-cfmI0+)_lU;t>J&-5ELo$aqw7yKII-^)j1Arp!^s|q|f zzyq)1yctg<@>qN~T7^u9`;LlVNdWSguv{`&Q~|~H5x7G3TR~nzDwJ1O;mM>_o=`X~*F$`Eq&p>rRfz^TYZ=i{#EJ*w>fRiUGANUwShaL=maHE%+(?z#sqev z9SFI9#T`*sh6J9?UGiLEy1+;r~OVJNuNzM_bPN7|z1zPOzQivRnR(ok{+uA`rfzRgTIfZ4<&B-(E z%=2^dG^Uj(iAS8bkKp8qLkD(60G|Rv2a1S@?xB$kSRF%Y@R6d2`?Ai$jD$n&ygQ4N z=M+{wHz&`WRZs2Yd7683?NUh!XniRJ6)puZKmw1g4H-iiH%?)fE;{vY9WAFHTjtbg zoHdVIRQxNIsJKot$z4i2>B}rENkBjZ9vRl4J<|S|I}b7)(3BD%!GVIYpnNq8B`kZN zW1KWc&uJOAhqsQttbeIm;8^I5XJd6eknI4rU_|fJ1Yg)GR==g75;yrNkL1P&`Ji2^S1cz@^mC!UF z9({HC$LfWTzBQ{8-X{qt+IAA}!ME%DV5(0*H5HAprK3!CH_Po1t!hI6Jo;Mm{YKWd z;vI5TA{`u(gz&x{rxQ9(z&-8g8S%S3Jo*mY++9);&_q+@+BC6eG9(~`oRfpe!=qTUe+Xa5JOi2v{p|M2bvc|M8dfKQ`S%!ZR~m1o$~Ib3fJ$HvvcRzd#DI?$u#4!R<} z@&*E8c$JcTxHmxsTrv-Ts1lx{5;)a*yQ>q2N_0q*ZrD)Gt%STsl6wb*K1Dr}LaJ1w zh!&=WG?A30eWe?xy+n}2(PW>Bm%aP;4MgWqm*ee~CyTvO^2{2yZoK{BT@ymmp>}y) zQ6Ct8`DYIeo*{0fhFXL*RHi+pu0sM%vgd+u4b1JLzh@o}_q)5pQGs8zS4YoiI#J6V z)!olVT_wx;M(0wM9GAqRRl-@7opi&H*&r&2bQviFp(3FzNYloJkebBTg-oKjyT(;N z@wS!Nqon9nu{pJF-uuG`+YGD?)X zEG{=F_L8+VA>-*#D<_I%p}eqBNCt==4Qkn~ZU7_b(j|WIzn|=>ez&`J)Ws?2(XVxj zN|g>*>q=Jok7Q6*t&xUblQFAIgO=kyNrGvIi2o(3^}SssYmQ0f#f0`H4#M%UFX@+g znouYBV7ny3E!w$(v$)db?I9!r@b* zpAh(H%HE`Z$ji~6324A@3+Js?Bp#^2IUF1m1I7crs>ZfT+l$COUl%?8J(e1>>e4i( z4DTrEyH&bodQDuwxSF@rAK8XA5tQ}@}f*Uv2@w{q-|wY#TE*jX_C?B z!Ni8zf1YkIovQUs|xS4v47qvFkQ?DlN zwUaLAIZEU7IB0ZLtA#>dtYh4juhfdM^kmV`tJ$YgU(zRFE5TNpXlsZ;5uvZKIJ%@C&)3#vzC*2)sv zVdDk_xG!T}<@0{{<7bXukWVJb*7)I%pF5i6U8=Z?|KUrpMiNp3k)1Xr$`mbRkF>SO zWgvADrNo-rBBfElq4-bbyWgmZp72Q_n5w;!jkY>pG~tP@p~HTy@`TRSe)N)#uGy3K zdbs`C(TlxZ;;`=TkNWbj=a-)y{7o1BrrSY%#fv!+z1$n$Z>xeo{PmF>;#vL3{lH9| zkbUdu1^tN}M4pw;I6FM2H;#wh642a%A%=&r3~Gkn#}!uTu6)l{=BdD5Tc<-{qqpA|)w_h>1fd z`W**W!hsa}J^}BshY+jCYvy2a$Uq@y2hFqOT8!wt1I8QWj#Y6WRq-n+pHkber%n0o zswrB#?|%J`x=~M~>ep^I69Y)=CW|Ay9M$aS^m)JarAswD#z9qor-`VO9_>s|qTMM) z$r*qX?oJM(RzVFApem}^o)Vth`pzs6puYGA^#N+Ww!FKnmTB~#dRj>xZg#uNg8%fZ z=0jOPx}O%KVb|_h-F~r^^s`}Jw3^id7MjL;M17zw(E3)JJ*vL;@?4W!->oqP`5u{n zml8*n?U$r}P-Qp#Eau)RH5~gD?NJZiI`-~|BAcj+{{3TnTWr`IC^di z@#MWR%a&{{|3H?V$B_2n=*y@*k&@}~zP<)7CTiIE3#t0GwGu!aeNAsWb(wnm(R*E; z4?->Li`DEWM=#cEvb?lfs~LZAB<}aoeZH@cXE_V{i~3Ww(C_>=(mDyOTf7lRu#|9A zNY}9kKBrH+><|J=96h6!bBKxh^-v5YhB4%lmPEJ=d@zY5KvBse`8<$?gFhi=Caab- z7wcO)|H(nP4uhgI3myod0!&|zKR#HfGbEj-DBFVy7{)8}a`nFZq5w;pdjUW&6TvRO9FcELYX2 zX4|*_;g{fQ{+{}|+MH}B^+`ud-X4XgX;$q57kuOB#O|Q3>@+?k&J{mo}8dPIql&ZC!rzP3&FaO%*q@OO_A5s%dH+Qyxh+Bq?YB3)+?$A zb!==gTK|wwf4%cZ^4M!@xxIEwzWd|f+Ucm`y6We-nEP0q!;v~pYiQ=J&vQqOJp4Mt zuC}j+I6`@T3AoTUXvJflv1k^>X%<0BPE@cqGM~hMBU*@y+_#(rp&@emtY=Z)LRoZ4 zD_Z7k^H|Sl&o7;1&qi8eoqjw4-8hp$5tLH~J=26$z=pEtBB;baF=H$adsT^b&`;B)~|hm2{D zRFQe$vIS*n0muYmSC`&Axw8BhC9SL}&WO5uoR|RggnYcTmTfJAs*8N9AP9B_kQJn* z2xF@5X+ONImg4AJxJ^}@$auTAH@=^Y?~nIYN;XE^(Ki?Vs1NS^t;ss|Z*u~2tYY{{#8# zxLmORp?cuf&#z4po}IrdpZ(q}rX!s@EODV9;`8lD8uPy=-SaV_$7yyp@n-NbI^;7>i2yu^Rb!}>co6$X=z@eapxgWW>>``RCa zKW_FbD=U=ENY^*6E5r}ixTUqnNAZreP?+|5;%`)MY*cT|qs=Se#lsdlkCi5*SJ;Db z<%5sNL}p&S^@jLYg}_TLB;|=DFH#AnBJNW#1Zr;=sM86Jafk{nm?wLK9dSY9qBK5M zPi@GrP1Ye?o#L0A7~*i87_T88V~L-i6tj4S^F-WoMib;JxY1yHGENk7BuRD0UHxzL zebr~QjL+&6wEXq(zGTyp8{6&y{uM77a49&jeB{q9ud|nz_+O11WJqd~K8e$l7Zp!& z?G%+ZVzGV?NeY%^a?9L^l=yepOmULnVEk~Crd|kt6rrw zhyCJB51cqh6ZjfBfoOw|)+Ud+fZCN59`q-ZHLKm(&W9c|%6VOiOWADU%;& z2cI5vWT|4NiYE-?BFQlRm^{u8)UQPJ>C|nlhXmQc0%JqIp#eTh z65tHP)woR+VqwbK9`1tnajVjxqOu^frG_L`mgNUz_}bRllWT;l9vo`H0dv*anEAAd zHITuk%c`u{nw>P@UITJ4^{?Vf?i(aMk8~Sacyk*9zNd$S^a@ClY7!unh7X!I=ayf9 zvkoheZukIoL}vdkFE82q1ffwQRcB zT9T;^hM;df)$ZBX)aZ(o3hKocBZCS|QUGAS-ENK=WGpcmBS5hEsiCxK76U|@hN;D> zsM}^-&GZmjLJ7EX@9GD4S`K@Ui@(L6542Hr=828@`Y} zd=cse&86hlE+ONwei>m3?5p4sHbKGK(7uFo0MS8(p){7Ra5IKb-44MiWyNHHlRWSv z$z?9RSa-5sJH;B+il_%CUD)53#a8CCj!Y4&>|uML>z$~#1I*}6@t&&IOqvW6&FUyn4N&>7UJm6$f2Uyw-* zNX>SmcVNLjAJE38Fg;mlF17HI2jpyQFLS)P%HfBJR`W9n|b;91WWxt-xj-^DdNthdcinhw2|cv-6+Je_q`AFZhpm z>h%@Pw!OGOvf3p3oP;h&PG}Mrn~0FYpv}>hPiqkPt2GFW)gcRwK7Od7&#%htk$GP4 z02S6bi#u2D?VbOc>W_Bo)6fahv=~)XGP`73+)cX~Nx-_qR`u@>%llMzU$&dh_+YDR zhyLCt=CVI&NuWh&KdYbr3qLCdh{BQP5MqsYSh z&oZ|A`UxHNg-3Xao_E6>B$gaCFqi#|Ro8;bPU1SyJm@#5E4FNTJi==SF>YfQpI9L2 z?uj46I~WJ}@3It)l8h*{Dxy;jqgS?*(E+>l{R%491RlL)ydb`zS`p~0_#_`MpsT&N zi}-4_FRcaR?tGJGf^aGK-if&F&R3iF6qnQ*WQX zH_r`IZ5fwP*+-qbkASRZV5dT;Lgk5APtRqcj;sVu73mmC%Xh2-b@a97t>o%BGqQRL zyPk-wo^{Tigs<-We7Z#{F!F`8w`D@41)8ZKJrs?-97%W-zQNlfu);V@GLoRBP)xZj zMs|H)Y(2XSZj(Exs^fX;Xjf69;pAClHcM1AJ*hFkaNW=hNq|?P-;4wgn3LM`r;o0z z;Zk#*Zr&paQWC4fb`D5!C$VEpe90B)W;Xe0$h77pHEuZb^vZf(!mlr(TCz3O9Y)%E z(kGL#P3~FfHj>YiymgN0TLr!4WM!N&`qbOZKEAT1X9P5;t3dk^QQm+|yMd&>lZ43f zavTB)oU)O3RpQ91it4$QWq-MHG|WKVIr|%OLb>T6kOqCI1XzzrX@j&u656EkBcn<6 z8gtLDtn0Z0<>jc~1k!ot5TDe1O>@ zuEV8A7*lWpklvKDH=&P6(qo?x9YvH-LZ>#!%+o9Dd8S=MYSUZ{<8vOwu>ycOZcKtLy;&9VDqPfjNVW-yiM2cuy4m6Gq<6z@eQ5s+uHOaoi2s6?!+*w`S49m z>S)j(vp0}{Lb~hk<7WBU&1au_>ic=`pn}_8pFq(!!TYubn>UMc^2e{gC4a4c?7j7U zaM7Ig>+iQ~J0Hyt1wHkgrLY{uD*2U z0WZvJ62}YUUf^a03<0TVV7$@SQrIzhZiR!dz;|)C*WE`D<_Cc0c=qc6q7M;V2NfSy z5H;anjFIVsDij6GPvgj=Lc+Twgs5Y@ts;r0BSO$A0r4w4?h!Xe)Rx9Az{kbWTeV#~ z#&PymRpH6r@2hYv28^{~sZRN1=oLbQP6HM8Zq+RXu!gWtq zAa-N!-DE@(baB(1o3%f<`l0cj?(b1uZDZh0^9hrzo@ciQ#=Av2+817ctyJ1HVyB@p z3F}i{X^aS*ytfT`Ky{Uhnvw}H43F4`M~2tm)z0V+2ix8wOLYfxMGa z6<#aVsYxjBDK=IE5f%vHH`SD>SQX%$)WISpkyW2Sn4d_`O+i~X8cGBUiry5T5G;`t zh$N)s&x>;>Az(!=;8srPTIPFU!~roxyv~9XmwSF$a9cpB$x2Jq>rmfD`=RAJ{fxm9 z_v%ee*fq&0<7CqT#9Mp$n`HM!%7g?sS>kh~OE{awsM~TmiHp#4 z^6zn;fLv9K-fRcy%_0|)E{-I6gtx`_>_`Psw$sHOhhzMpZe)E9t5$g>*UuSd+*PNv z%}uq~ab&9C{pRqbNc5`oxj?u-td4}s0^zE&<7^f@RmeOCet^&%r?VyVUp+w5$!{7e|P%T#~nTQd5nI0 zY1q%vEYaOsMf{mz*a2L%Hr%Ka*{-)?hCzqRb1Waka;%^BX#c)cxNPI+CgtkK?~7ysfDaRG-$4I2*D{jF8?IY7R=}(%|fz9wWr=H zY~}gu*VIPQdVy)$I~8B|xBkYf5`6XQrtvCA@WZX);MENSdS7#N<1fGX#V?vJGO9jO zdF$$alMkhz^oLd79s8kl@xtTk!z%6FNqEWP)yfZj4_T$QBfUxyHv^bBqJjV{~&j{P3N-_l&D|ZamzXu|P@| z*0}W1(J3TNxka1=rz<4!g*>0exu+7kEm~mivTfPy!fScEzqZh}GuYuoEaQ5;bL}R3 zV{RyFf7MqMPFifXU2aK}F7h-7cq+!-ci(yE`rR%U-0la-p7dEU>heA(091=3k#R3+ z-P_~-`P=VZGk*HP-MNl0QeyBj2sTVU{4XKnAJH;#Mw9Q*BHf+p(8Z3Q^I?$42{wXu zM*l7cbT&_QsP7&O^3HH8>pa*U-&a2K)?}DANyp)xVg{UuG<d)4D_sxCd*Kyw3?*&^9i+6L08U1ny57XbxCF;2%MMD>$&XQ+4~ z1CM_Y&tnmmv1AZfG|pUQmTgOAD}Y>G_o=OLA};WY+6wb0H^I$vG%xzYB<~*B>ZnP2 zxD(EpUCHXA4w++4nQKgoxsH%tpPv>iPC6&YOwUVzI$0W!azBOv+MLc84atR|JMAp;2ify8Y67aiKacLw#G9j0q6J6*&4inwEs~p!d-G^9{lNz zJ9CQ^u~TIl6Mp2Uq!jQ9g3M#w*d_uYavKB9keIVI<^j+{WsR9w#7}#B58J$k7w>K( z1|$(AXV?^;J;@BoIhz4bqHgS?8iEl$V~8J1N|Tvs;c(|;juxg>$~FxMLt0TXuofZC z5bP3pOF-$xvjRybt=bT;Eli8yaI0UKP?#s%osW0>IzLitiaf2_b?WKy+(~vh@5PF? zFIc2lKs2An3z*<2tpO3ZuMBFikitiP(L?u=ylMdn+FVYlB{w|wgc@yZ9$kjlGHcU-0!ZsB!rZsm-jR8f%LsS(gy|Fn+-~5E*la7d$Ui7NqV?>`I-bt*2X*mKb#u=u zGN3YHE@VVMra2*nYK@H44~zc4Zw; z?@mEqqLh97VkLQ5VGm+|@bc342z(|TPT-MgSo9oJ`}JchOMae6sg$6Py77VMpda9t z;QA#eA!y*hy(CmZ=$;c169k@ORr>VNl{Gx4Y3oe|Md@V)vaPl(YU0|1X_Lif7LziK zyC8wh^`LE@Tv@(&ZOUd=`*Z?c0L~Mshjp_!;!MXRx1ep6c@ic;R!_P5!Ih<7CfZ1J z`zFJInIjyn2W%8Nu1#pZS;7s&2Ef&Dh9u-XArFu5rcqQotmg|@R$H;7X_t=$`1PZ> zK33iz>8(%TVaagkkX)O1s5Ny8mpn;P53bf#1(--oeJROvee zvQ7x((EmI{>5d2kfDFVOAL>ZtSL##i53_u4yOXJ4(^;_B1q`@ndEy%PliCun%rQxUopcint_k4nf4CqR`&|=xK>N1}mJ8EEWi{ z3M-a}1Xrkvs_>pGszd^pfCTLgiKN{d?g=6T*!hM6;;w-j0~8H<2|-Xw_;icE5rU}F zY^m^3Na}TD)P$otV4e2EOQg!QIORuD=%kXF69nho0s%?@;kOBIOZKI8HxRHSRCP-= zfJ%N+1H}gh;7(;qMX{#ys7U}pFAKyhn^t0l0ZlRFSw5dnUr{>s^=x>m*a@M z3Aj0Gq%}64%QbgMgjj`%*JDZ82sBFdpSXEcl{W^>*Y9X~GAU5r^O&&-`~{%X0=ERv z;}$a6Ruv-lNd(f=kjMdZj-dax0D2MG@;ns?#s>uVD6s$y09U65)uwur=wKp=7_&Co z1s>NqQ!aqL!SZhG?vF%rbi;@?pfZ5;?MX1JbhCg{M(nF0m~4T29$*Ot(8-yHUcOqA zm>u-@>Mq^NFY3+O??l^e+n6vx1QO+6{ocod`+*kbJvH=~y${_=p+DW0!0-+M$UN7A z;$?^tu`XRN9`nk|(%wXWfT3in2((&3(lL4v=k zFCV9hbh5fu*+e=`o1kKy5cg@tI?euZ4ohsL#=K1%{eHBxV+S$FQ(=kg_2IEt;@3aY zYi_lc$%->Ch56W`o7m_)QX`|sp7@SurD4DkCdf0KJSoR+j}t-RFg$|7B}F6>>|qMB z2u&|QU?oZ0+KZnt81Xgk6E64!0wHCFzl0`3U$herIT4&L-UA_&7T7Qg3!>%0Z4%vl zTV>pH@hKz8X@|I4TF=Zucc)`>O@W$u@J@t8xS>XzyJaJ{&~|k?5ER+VTa_=sci)>1 z^mYg+GxQEPXfLad6|ExXV7$Ll9YbW*d4HeC=!QSlM)f|AP}<{$7aN3Z0cw-8V-ln9 zlXxk?qi{F4-M|g@nNF5tqqaoyl<81t3R-~LTvAaa5&%Wq632CM!J_L^5@~^YOim_* zC|x&$lCZt}2F;=3ccrDvQvHkc$gLtG4g#MT7QL3Smu7rL?t$YL8Vi6bHUkdv*R zukNOAb-1Cyie2ViQz`4SRiet(R6E!zg%Xomiq zq^ikaHHBbqazZIme0vr@3XAbhNOr-}{ymA{pS%f}uu3HGXaDcT#pR#ri;LE2s;Jhj zyK@)fo=EA8yLY&xjJwr!slF{8PH#w^WW4u@Xfs^gfaLb}xw-*q#n+$RygRqgkoL9o zBwmqF7dBNv`$;NZB{TN>wXH_;~jXs=Wr#g`;@E^~v-H*Ier5Tx= z9O*pE60L1EsU#r-RPGc}oLT58hT$5o5I z2Y_9&SwRwc^v#L{<4y=bYi69taLpq?ojUx;10ZqG!aQ)w^){=c?^Lccb()e>!SwRq z(XV;jfVK$N3k!IE36u#=i3HcAq&emeWGCb=@Le*suQi~(utvkqc|d<>c0ikob41uc z?cF%TKt7Rq@o%2$dFef zpgW13AY=>?%DC15B0zB2$$K8x{@PU>i1nFIdAiOp08S)*ocBtW33NhkJuXD_tcSWZ zS?LHY4E(4-1}Z~yy0wy>%|d!qETXetOKP8`iJKAevIfz~B*x80d_-195n=Q#}s)U^O~vRIS*HcOD0A;=lz(6jEhfLN#+-nfFNB!PXeDiwo>bt< z*1S>)WY$}#!v1Po##WFe$kh^CUozba21ycdzSu=JB zdbbFLh9*e<8Js^Qq>DVyOu)gA5TBCl%=P$hJ-f1wugq*f1ApIKQI~`eQk)*^-BnJE2a9rZD$^>%|Ilul$1?m#R#KI)oYUvWYJeJWds6 zTxnwUichjaC6kjsR=8*t%PS=s#V3S3lYf$+NF}fc?;C9M4Z$nHmnFJWqJk?p`I;cw z0{ZEWs1vza;GvR-QMG%+pce_i6fjeXMH8thK=xRq#yR61f`49@ngOv@LN}$g+F`h_Oz8C>#Ks9td%R{8!@Jt*B6)5>YCxatvqf2zDNnxa1~38;YuT zwW2q8xekAw<}s{sU|yoK_lD%qM5tE6lnIrunyfnT-Tl7Eooku^wKwm7y{ALj?sFO5IJyY(%=!s1_h?g?2ND!5tPn}BtFli@*nE!ux6%%t3Xr!^ z?eV@4@A+00NxNXvI_zE#WzjDcT7$3|)bLZW!8)iLbA#Ng_+tseRU*EP=(!&Aw3hf~ zNHv<&QMXeE>w=`ir7&QeV1K%nu-<9=F*8F7c)ia+ZxKV(K%xT$tY--HA24|Jh*9Z8 zdnf{^>9AW!B~*-t^N1Xn0-hD4(Qu@is#ACB(CgzZkq>!mdDkrhsM!%o1$?FGN#)EE znOaJneWWrV)1@*&r_tBKEYTX(NX;^Cg`FVk0rER7LRNrDC{vJ;2AhO_u0}@NS~7s8 z(DrAQ_IwpskASO|VwKuRSq#@2aqkh4{j^;%E2Ls=pX1+Dr9G}nX`V@b`bmY{_E zva08#*~pM%(BVM6gDgw`7pMH^FF+^PY~CnKG% z2q|p$QV1ZmrgF82F3t*CEd4XzIr3Jr2vm{f(pUHsO-VMuyup9X%gQKcxGIT#$p_)sd~=PV(@&0)eX^YA*OLYGv-%&idkXRsxWPRtb|O1&bZFB;O)t9 zhMq6E8Jc#=>l|O+F?}E}opTn$n~IhM!=NmQ_gDJUj27|>Amp&6Mu((yAV;M1m?&BE z&FVd+ZOjYi$H#hlFhq#auU8&D4d^X3yn2Z0^Q4mHKAa9NMq{DH4KNa;0F#h}g4b;J zU8$wwZ0!$Fq}V3!@28kUk6%?dYSjqQzj|yRY`i-EM?S#_(g#q=&2*=*AwQL+K;W4&1(yVhcPTR_*Uh9t$NT5mwKrZwQ|)M)2!M40-wa?3V ztkWsvWFV2$zho=WxeZv7Ie$pgk8h7@+(7JkFr-P#czUv&UAgg-YagQRf*1)lrTI)t zar*)J$W-qLEpJ$6)AL(bvm(s9L%!==yI=Q!7Ltw~VOO2-wc}`3zR;{}zXO>i z6xQh}BpcT2$75+$-%@59laXGI*)lxtFmsuUv$W_0y{LNaA%#o=+Q<;LB zBt^^LLa&f2@NY^*`aJTy8v4`%4=Y5(o?EDIhU9X?jiU)Np6R$widZ9{Z@3;0EA(Rm zN$^KG1V2eI6aY!#yTq8-QNhYmcuqTY_bV&pq`zD(u@{okP{Z!ojq?PZZlA4TCh%`j zQrd-v3gC+O8?ibpO0M4oB-zZA$PIx$kUSTVs)p`6U)hRCM-yA7OIw`^ zls4d!CH0&%rDwXPhQ^nP4xiK1cY7L!tz6#pS&5c{Lneef;u?D8-CUSC7 zeuW0hf#%Fx7n-=l2GY>!XK(Ng6%nnT5}Lw6 zFUOmzzMG0bD$ZxVBwDQEl`2U~SjYBhfJQqVtEMDdA_7cm%VJ2d0GUD&+$}~`_@uza zIB6&buUrF3iKlH2mU>&d)A&%jQ?-Nk;$5!vY4L-KN3Z>z1&e>9GfJlIineCyj z(Sy&-xwewr@*LsMqOQR54t`2*Y{2RW*_@C)JqrDr=h@xa`m=KLdAJ7M!K1E4bIp18g0@_khEFO*YuPH-N5Vql*xp^@5kaN zQ&rtp-FckTD?oO8lld5k>=9G{6i%=8diYqU*Q@Q0s0RD&Ac79?gd|JTG-a$54*Cc| z0LO;m0=FbazB7Z^6Qq#Wim*T)PeeVP*hiQni#$Y4(;yFunOpT|%>6Z+)vTF)(TH^Kk{pB+~?=Gw3jLxph>JCu9N2@)bWgpjfj_DY2{(qre zTR60=)DhYzi3wSRQ3qq1rDhHVJ+vJ%Hh67sYvUtp;;bHOanaW#Yhi$#F0?F3(v^DX zrGyBappiqM6&VkS3~mjERj#dXFIl72;i@u4%@q=Usfr%_lbf(_`mN;|glLbLRkJy= z$e0vmT@A2R`U#>6k9>kwRR9?y5q6E{KKu-(Pg^)HqSWk!Y>_AUy28>e(E4GEE#cI{ zt;I5u!@?_(xO5TTOG`kgxj2<$D?1lo*Lo-N^?Y6LE}yzf*3U$jqI zeBg?y;trR4lxEDjm@WdUwl7!h~N)xrJ zkjzM7M)3Yx^HROQnY~u0u;YndtJBWO&zQ67rIsL4&0kK+*g<9-#Wg~4zy*K=B2qNN z$Urg>{HJtNyeG=dGW+;4@^TaC@-&Q>x&|_YCAh^THh`qx9=V;U zsC3R6&)V%q@$5$=a}n{gJ5~6#apfm>uiyUB8y6IY{x~1*%z53&0*uCdbkDIj zEpj$k9p5DhEso@dZ%s-E{BqGfE8g_+%ORf<*p8$KQN!WG#t%h!jalbvHwpVw-GNG#Cow4HmSb3Cgj#5eS2re1B(*}330YW3Y_;=}s3T#xwmVIg&jq6o zk+Qgai5^#MW>Gc4#R*|_hbHNG7Ko$0l3r;ko7E!?#kb1WN>-ckYPm6fi!;^R-1TXtAEhu%a>THYAXE$83RdwJTy?WlL3Ly z8H8y)d@I_cyfvjLnxh&33?eCp@$w*^9MzMG+5LGQ7a?zLZnH z5Y=721Os?t;ufQq$aiGixWQ|{h{YdT2e@c^(7(Kq;?gFJB<&hj{f&736qY3#f6#%2@+i`Ml5I&UNbpl)WOWCmXQh*5AgjoOniS1@@=iQKf2+4?EIu7) zx`DbhY0N(Fss_RpoQqi1R{ih3VW_^=l;4VNybA-lhufNQu#artcmo3~*LyvyPS77D zvSAsov3i@kLZVk%fTI5PKBQ>zB3JPZGAy_g7tBEZt6l01f4AJ6py z)b;(wKrK6r1?}s;e2Eo|F=NMQRqA;rOisS8x=FvWOfPyJhZjRocOo{@VJA}j`mvoZ4EX zn;NKFvMJ{@Q;gPPu?x50GZ2|WTv&EZuA>fqg%!*Au8L09;AIk z$kVLf(1lqFS>jOVWCKvYy?XhQEOE`!R8Nk2@zG>*q1n<5Y*|GW=)u}CWOy6)>QMbn3U z2FSE0HVEG+GL`>R(b8Fea}s>&Zg-g@b^c4ej@8{%EkPP8t4;=VSG}Z9muIz`)i#sS zb(1klNXAf_aTD}QwwNEYEsBulAjy$eeVbVAo=8`27&nJx#~f@Gn4Q#n?2jB)^vm8& z*c;v@5+wuw8rDeAZ|THzFU}!B$O059Wi;B0=={PF<}et~YN(TC3CU>dl|_NMD~0un3j0V^BGe}&H9Y(wpq-16n<$r`+Plt;hHh5r7FnEcbud z<4URw)!=5*clAO5nd1w?eg1|T2q;L6?r$?b<*s>Hz5C{hd-q$$x<+e&qXlwxP@?F8 ze3R*uI2=#{&lw8-v6+&jl*A5&jRJgYJT?U_AW*=*WVE!%XJ8{1;yL(rqJSKy1u7zr zUEt9{_hvebRv}O?;7w?V)jCa^_;|iertn)kzo&jS2}KwD34w){6Y<*$n!0@B+MT-} zB4OeLodX<_BAvq~G$U9EeH=O}dJ;&lh$shahzRj8)5;69EQ*9gN$5$;0W?H85C!Dk zv(aIXHXWxH2vfHzfsyuTsQ&BxH|*T)~u9;#)W`oLZ=0Nf|4Ba+j5M zxtyeh9#vPEIZ(>b_+i=3(I7#2fSfYuamHbm5L7y=K}yum zf}5IT9AU@d;N{bvmYZ7d064N8)aN6Tai9tff~n^E5A2VE-{ z+k(hy$!;$9>p}?-C~svx+TW5(xV|M$#HXqRD7c!dW;ITv*7H4L)+HUgxHOsoY56wV zKYgP*j#V-p;-4dPvz98r1=m!q3a)E!IiAFaGJPWnHlF&suHL(G`_|Q)#{0K_a`&D0 zZ{NIb-2KUiAHDN)aFX>`|n)6dGCGW%B{QCfAT(_ZcODFzffD3 zfdsSrOQjxC>qOL!OZ6@Fh;l(_&w}n*F8nA9(2e+p)U92+R+Kw=(Ss=M2Vj87OMl4T z0M(^-N8$444lWL;sW!zBAMqeTVAfH-&h*>D>dgSPfCh1rhxco)#Z*e!NRl%&QD zUd}asmfc zp+n6Aka^B`zWMu}_j#TdI7Lv8W;Dq#dkmf=AbLA$rS2LXt@#BKq+kO~BTxFMg>Txo1=qMOwf&(V(4i9lT9mr&kCatI*?^O( zz30Z16e1rlJ!0i$2MD!>R9=j zr8UCarepe`CIsWB{ZtDrwtZtqBK;*R3qKGD5a$a00~p<6*3cQ!h5}}g!nR|(F_Wf1 zJwO@io0I*?HnF_L`NF?!apt5|B^&|RsFytXm<%F2P@&8lyIAEFrZkYZ=K!%cp8;aP zj$a%+{CAQJ;0Naf#D4gWf`P9MK2Up~*gt458|jK0a!+7Ds3|eC!suoDt3to7FbN~H zzcB(up9`K??^a%r#f2M^*NimXBr;As(!jM>*1xwX7p`+{Ef!ENATBw{pyCZyeQ?yS zbpPu^x%$598Ortf-$#Z2*NJio^J^s8$ZMQ+M+r$u(6?kxID#nS=4g^Jwt zq^{VCn(JTp;bj-=hO&0SoW*S!QG`h*#+bN2M_l6ZY9;3o#`LjI*3HljgF;dwt1D*v zXm1IZObOV^a~`tg;EPJuQ{>tsk}U(1A^ge({;aBsEzqr@N?O=z{sq0Iy=6<|Y&|`| zV~ty*Ez@&LFG=8~v9SV#U{C8v3Q?y9IxTV%zLG%L)NT1|dP{zdOhtrv6|<*70|{$k zKu||cgxdg^NI_H+gKu#Xf!K@Fbs#D4Rddcg-(MD72fW}8RA|>$kMjaK1H^51RKa8< z@h1377C1mmiA%bttV%8Z^4je4y=7exZ&Q#hTTD(XVsT6fq>*JQgW#It4i37MxIyVv zWZrE?Nb_iK32(?fXio?{a0KOsXp2fyvdM)c?a9d(OkkL7=~)H939L!dhbW5bkPwY( zy(RDHE%Q5p8&hEBBn*m#9AJ)scx06D zT(D=;u?uhLE$?MjUT4WJWAYZ{)VLb+CcWqRu|83yaL%Y$gEKpY!)5f z^r?NSU%d(2=!WJ48n*QB&H5A=#0&&wZ#>7G)+QnTeaUsI{0gEdB&gAWq#LJdcQr^? z-O&(Jx=~{L>`MD?XBSa5dDVpn<*-CJy9lpgWfLsGB-dci&%f~8bN5tm4ctxv)Cx?I zOvD<|R8%W5k5!QE+O2nPuPcB?%nAUVfC&}0JUxWFwr!#7yBeVsh)7cyLABPPLBV6i zA60l+k|Nh2b8rt0In$QKZ{K5&1vFO11p0}c0|71NpG5XA9trl>wF0q2n^h0+lKWs_ zsxyoVNJ8B=Z(r2G+d(b$K^g#ZBSzBY4R| zc^llWm6^3*^wKi&g@WGGEXp~ed9^rROLNMb1Zot1ASBrzW`j*EY=3mwhML>q$WY%A zGjTCEp6(BUxmPZeMHy1*{*Nv{$YI(%x-3B7k1p>_L|i~$??8ZK80=Mhmw&9>KlDhQ zGN@oWZ~bs3`>~9N?d*||TJ4($x+7@%`#6kNTf6)M;3WTFeQAbG#vz8R$`)Et%t4rq zow#bHhX=TzgJWA(D|`IF`l-@Ins{j(`-Pt<4P%EQm_H^QNBmI8loBWq&kluPqCwb$ zY%UXsMCnWmQ6xx{w_yZkrGbmt^#Q!)cWGw@;Zp9;M4^PW3ClSicV2R)&kQcD96+a`?r+_*bw0#&h!jW}H%=pTkUj;+}v6%qO^F>&m` zlV2~$y1)_ijvri)#}LR@_C5;^o!!rp$DO*&LapLf>N+Uh{4Nh_iA}_;CB?#kE|->d zM!SgbE}b-;I=sjdzTJ`>zfsnx|G2+%RMmd9?IXfE0k;DSsO6RnH5Yh;vwP`BAUYB8 zi>wR%9}R0liz1~XhMZi$xtR~WVfc1VYYYrCv2^8*rnu7oa_*x4n zEogtq(SSKUN_?EOmRJ-VSr^s2XERMbMc*E4Hqm&ooqV#K&vasWgD@@5J9p1vK9TrU zm1VfVlq85?KX!?A;6ebSKEoH=^*QgJaCwfXi0aw1Sf-w$Uyn7PIP0AKhM7=&Nd^v0 z9Pg#6N=0JP&Zw$K1=&6wvWI{`ryfvy2>Z9-ZUpGJ;{0Le#nQ@V`?3{jU{i=QPaQu*fm?B|a67N;DtjsUT9tWf*+CK>3wm?8n!2 zfKKZPv1kzSGa>XS;-gUt4Z4)X24`q;njIsip0kqp%^UY_e{gI4{@VTZ+jrjn@TYaY z928X!^nS4F21D{8!v5@lqQtO6IK}r}emq+B;~|K|Xk?M{KLE`XMxrAeF_GnpQXZVe zIVkqX<)_3{8V~*aKRxE#uMKWCIE>(Qwn3c1EwC*?4aW`$E-E{phu707WEO`(Lg|tH z8@tYUnXq#SAoCr2En!g@nl)%fr1`aJL3=A=maipRP=;B5- z!AwDXr@P&EX&YjObm0S`=$f(6{oS@R-)fyi9@wYM1263F9dxyb&y=WnRbIDKYt;@? zx?S9P9Ep?=&r|u+CK5|rdF&0nm1zN>m#r9;?YzBe4@WOvzPQ$5bJ3_>sLGN4kqOVA@Drds~AiKzg z*_!^Ve|A|$|K-)o1U?TpCOem}T`neQ7dbv5{J*^V@y8#7>x_nwlKe2ZCVulHs5apz z*Jl2GlqzYa=gGfE(J&2>=X=+V_~)bE(*FA=pZta3a9U@3MZSKi(01V*HS)-n&NW2| zZU5!Z$snn=Oo_rCooay6>~l|Imtq;RmZ~)R2~1ZMA9{@e`$wsLP1Vc z;(xO>VGEF+>_1$oA%OoF@+RGNpFjUkZ{Pi5RN0^?k z*wsj|T_;GnM#Q{&qNO_r;s+!H(%5>*_~a?1W*Br?k(pXGbok)^ zNH$>~5YT8Q_1f-uZc?-G=4kX2=%!GsncgWrLalcv*Xv~B=*dto;6~4 zbFrRh=*43Zv&QfC#B;b%ZE>c4v=V^-xML~Q-zVC0MlJo!YREj60;ANKGSAJ9< znKqraxDvC5lvvV4SZRjB3{G)eCA<%oR25$45@F-_Ov4 zFFYKArrmkCqW(JzyZw7PxcyT*55;fB-uE^qPn;)0ncH!MIpjcdS`iyAhhK2a+|UB= z&gQzp8ottPaXVcXGe*6xUC3ZaiWObUn#ZuhBVQshK9b3jA|NCT2b<*biyQsT3!)q|CqpQAKRUCV5rd%m}S5;T-nxAib|en2s7}W&8j=_$uS^H$5!^JU z1}6!JLqrBGv}&luZj7ZpphXv(#IhCV@J4A@R)oC77%4~~ zhz0?v0n4UF=E2^#zhPL%)i!sw!>VcvLej!iCjfyB?pHY}CW)V!bzsRm zmX&E~C0~kh2_cY+Au z@>_6~ zUA((F$m;iV6t(Xo%%T<-$&jaZ2t{$%*JJ&91!4%(7xFr{8~#@vl+~R^{jD)y>pyVa z)lsD302^*0MU%QuZbVpLSZ**CsIi8S>8>1IwDqq3Dqs(lD2Jc&WLE59qdZt6Lmf7? z)Jq&RxGJl=l=4l`FX1WuxY$hV@RHpAX;;u0`Gayqv2CH<%&!gj0!&yR@G3gs_lf_oLp+IkNgVVhbJ z4->ifW*hi1KBmRx+ttSP$LimuFpyf#deF_=(o8l-9>(My7c29YZ45B*kFBUH01D66 z(89HTqV1*a><}{`-Z)kc9Bo@u4!8?kaCLPP&-kqaOsKi9D+Qz6%*0w|3-_$HhjgbI z7h&Foo!ymf=^s%OsA($B<6>G}M|C1MV40N874u%&%Ku%Fe#gOGNd2q6X#8}=a z11BPBJc&Wf;`ePeDTI@b;}1vsy+}agH zr{asBtQtr1#XUV=ZpdjI5y2sjv$C$MW?fV3`s(1iUD!nj!ovR5#5I2!qCF-VM+|fq z1Y{KsypXLP;y6xO50YNqA?mgk=2 zc5M$f5w^v^SVVrFfOBoleH>5+p)xk8u$jo&6J%ao`ZHvM?;utZR`&z*BJ6{=Y?SvB zM_Ijw3JCaXPxx+6=ZIg$FIG@kb_|J8eg6C+;oD8(APn#fT)}mVJX| z|DH2*pkGuq7Pu%ZNT>opdAmYUc#?tvHpT8KvP@mQnTKw4u?+@Mvo%rJ6AF=BHwV?-`q7RP^L7i?co|>xt zY6mK^V4=&2JkCJyi%OJ91;8^oMFOV+4g;Ny;zF)H3Tc{sd>MS#(5f%#*oia8u8sm9 z3lEYyhG-{nzKD^>c;fF9b1}e;gIkO#YyJhjr9Dry#@45Hy+mnlFn(ZENdCaY#a5h= z!FXYbb^|tERUiG>vNu;>3jUZxBNDDh7-;wbNOOk2bXu1wZBV%+y-ZknP#JXS+o#4K zUlw1U5(v*=kH0^QJqn?7QbVsPvW#@8w zFl6IW;jhXsdBZr0gC@3g3E8~B{>noVgjivW|L2A0p1WC1fgO~g)au|anWYXSp_u{Z z)L1(^d?OhuRRB7fCHG*wW#^*|;gF9Ek#fo&X8>c#TX6?*S}jI#&L+2GFp|Nc+ww zn~){|JH?)0ENR~qsJ6ko_~aI6oT=PBuIf|hLd!RAJZljIyslZeguwD-Uzg!f+jWM zC=ZHvK%<~8HGrfr8~LFaJV3IhmW{*njrVV@-GjLWw)q)oAH6ZSCB&pc8;7ic`5Z!M zQXP8FGV`xm=&%GL+yX#rY!KSM8D3o5+Q%njV{^bS0V`o=4Ztj{hHco=($133i+15( zRNpmNm{bo~Y!9qU4*(hL;%6b1BjF2n9C*yD7S+$#Cgn{X40G5FM=A0UI|q0#+n|uZ zfP!afH)Otp*N$tQy37s>gX^``5!AC8BOo~7wBWarJx`JV3V%iq2ZPa3h8l2uk>YJ& z<197TNysP?M-W^f=orbx1?s0vS0s~_87V#A!O+@!l5aBre_H5?p#gbW1XO}7CWYbx z$(WrPs$k?aD5M;Bus-+zOW(2Nps3P11?V=n+diriaS!h;Is>6#SoNMm4X- zHtdm<1+PFYg22vvw@lCe*mJe3Y6C zq#VVan_Q(rLsbnY{GPc|3`Ab4k1?y6eV=rRnK86#DRwn`Sky>_!G5L9a7JyHeUVxO znP;&`?;qlIdk5JR%K5Lt-%w5ZTmO+*} z!IIU4S4)x^Jc`Ul+6buxji~%$^zzsa2^ElPM~lo~J)8vd7h4y#4UzhjMN^F)X}qRK z+l6*GxOj1G=a2-31T7{y6x5x*#`K6rGA%r_@ZSW!l94Z;DM1bhwq$Fxfi{`DnWSH2 zAHv3lDv%;p@kpd*5OP(*R(aGuL8DAfYCGneaA`k$g0s%5osNq;-jIxPLTM!wxT+$P z^6GZp!|mObt@pPM*0Za} zp!jjl0Y}&hQ_<5o=L7&Qxw3`5W8L7!th-HceOdH*ug^NmtTz1sj&hgGv3sEC+w+-*{jL z=y3XYW5pxA-tMQ)F~8Q6=8jWSI80oK$EOP;oU9#>3?p3X4o1#pUr~sl%nH&_r3neG zQvi~%sB5>(p#MWOLup$SQ2}QlNU`qbC#0{-vXZ}%*$%T*M2#J|^BWc-@a-6rSLnWsZmzaK~!#-6hcim4t4}1U#b9a%EXz%K``H6yGUsA#m`U z%M0l|@=cB*sHLi}sea|d30Olzh079{hhYC?vVwbsKd?i-$N;~5SCY(kI`imo0)!a1 z3P_KISC-hia%)ZS-gmHtO33)*R%Ddyyr?gn@R~hlJ&PvHT(SuhSWb6OG=YSCSOsH9 z09*oKS&g8MrR=5bqgfS4F1RI3xut+*_eO6Ddn(a{lYtp0izdu^P@HHY7|z_m z=L07DEnd1?s=-FfA5oeyarw&bgxlZrj18I2V>`xq(Uu>(wAw;p_Y|sD)RCF)U zE(p#uElDDTK#~6A;sOlrc@?&8CTMW{1DlSYZFU=eV!Gjbtd=^4rPVr0UvK130I>wr0-mod81oyNQu(cCwlYsKGuo@h75pY6G^p<(Pe2r<&dcLYJ&Dl&_EFdqx+qX(~8tIvX%2(>3k`kg81$Afh zx~s(@)4`8>ceYNSH89J9FG>;TQI7walX&Php(CNBjz|@fN3f@pnBxek&)XT&yl9dB z>4Vp#Zsw4+2AII-;s|n3I8_vqVyvpsOm;1-`|z5VZ+`fml7F`rBYjGBwd0CDX|y^@ zhMq5b?kq?0g?I0N@cx`|Jd6rdZ$hT?B$*Xo=Ri_TCCgJ(C7hR&d=b{L`+HLw_a>Ew zMxB^nQLea~``cSHJ`l4jxc2op*(v8_2u5?G6y-5z7iImR*fztW-u}t{;g2{~V7Ks( zrU!dlKU&ed{B))H4J$9s9{vJq(I;OhI~OJPeX|v!SOuj$wbHA(*k(8$d7jYuNs=rm z_gpyQJQn;tjV#q=>05datgo7b5{v~1PbM8Z-IbCh%c*Lg!(mBYKGK508mh=C<>ruW za+`=~_VM15tSZ@*@s#Dv-^p=9kfayRWDkid0aN~LD}-zz#4tuEWMcPNF#R%@JWpg- zA`_7xMx)xc;1TcXt=S8brpK1$lfAwyv6dvk7}8}@A3Io~5c8^{8s1t?@^@R7d9L@} zmxyyJ@scCrC0hu|*Q=4sj4H`T2gL~0XI9czbX9_81JSlvhp3bA{0n+Z`)x`iJgilP zN?TOz)fN1Ywk=^%!n-0{Q-X4qqQjg8%wtgtgFL}k6Oo7|lJ&l=_d6~bb(Q2`ulH@O z1IY7O8u^I)k=KrVj3cu=h@CivS_ME_a+$NWo_j%WX+O{!G9{%%N7l&5oUV+_egsL4jkOMFBf-TFU>E z(6?1YcOUL8k&i)C#Q*#kA$QbBR3@RB&m@CD&+knl9AU7u?dQYyjAgI;Jyh5lQXma)ydu%L3kse z)^bpzG8M|7*xkXLf{Vk}0^Ebr7Us15Ao&%)zD zzpJTt^0foy6vry4I9w2cFumZpz)^)U@kfhqMv}4>uTj>1Ul<%wjS~ zTuB2g64x$nvxKzr2S=4wt}H9%f?49tw<=#$7%v6qcM|xK&`=Blri#g>xuE4l2!ku1 zL0eq$hVBZ4QpsXmcD-hoQDC%owo8Fn0AgO3**sC?lEen4)2_FJjz+Y%V$1CMOQdkhD!c$v?W| zz7ItCZg-PbBT9FHJzxoj731^3*k0rOFt98(OwA{!B#@IQc5{;Enkg+kXHl;0oQM$`<1_`_q}+l=cyJ=* z&m+l+{yo45wg`1!d{LEVHk-xw9%RQl(Q54#u^W4&^0}u-_Sj>zv^X!|#Du?CCZ|PA zLxHuhHUln;L&8*P9xw41JhCta6P;H}d$LpP$*`k$kD9ctmbF)uU%)xSXOtk7c;rKF!p4O4OEaQ^e<*qvznXRM^ycHQdqM6TVU$F+Z~u3p?yA zi;^7Gzz-*zpYnUEH($pG*-8vn)TbSB&BS{Da0j70C!*{`QYz`BZn@aWQfbTeY<(C_uXF- z-KJ@qS47zC$YtC%kDrd*C`+-b3I&6PrwIs$39=u1g;#^`*RF*ayALm`#mPxMURB`0 z2#L_kRjUCXt6^V(aGr>paGaRl4n~bGp`0=+g?82f z-g-zqjmM#=C69`XUioO9AmUXcMSc^s8nARfTT1J(K|Qdvk++JHFvK1+>Z*^i|MJMd zd*8#6DqI+qJ7j2~^# zwLjT)s!x?n3;k#zNx@MgA`(<|C*sKU82^7TCM0`!qAEfV+Brdbl?-d0NB4|%An4nz zPkDu;lfNMXGEg(Hxhw0pZd_FcYpQ~RUCBK_05t*ZL?dS2psKE^M)IVnBl%LJTc!e; zSjb6mTVJd7k9P#jQ{PvPOVP^V{dONnOutM%-#+*Ru&hBE1Sv#Ch=5lc1#%lHfHlQh zUP|DbyC2#$EyPSt6s--KX}ac`F$!#ChDzUVq}1X`PhATX(NL#UrY=!M^G`aB>C;)?D`WatTvy1(dhsE3X0ZkswLsZZ{=jK!;!t5RyDC)8VCy(pX|X*ftoK zHz^G?7UY87o>JphSdFr=jCyd!p4D4dm` zc6zYAongwz4;Z(sB{&(Y$$`QdRG0fV<(S`PNg&22T2(E3FK87}YctiV=~ae9yM{=k zBZ)pJSgW}7ca@|}Yc)63|2(3DjuUA6Y1H|vz)3jOIOk-T(*E3q0x2q@Ua#yw0 z+#tLh*2F!3-$#5?bw3=7A`^r668QCA0{({SF(RV1d)Z>&IjA$H>&#o9wW<+?20- zC!?uk5?muHqU{ItH{PrE>B7e}^p#sT-&wnNRduEa&UwtC_w-|C=F+&6E$J=3gAvXL z*}7{{F0aY6;?ag~=lOMA4cNJsRZ~VfRkhgl3BIqlK5ZusT+W_GlyzP;plT?+ZK)o~ z$CBZ2caye6hD7`UszS6k^>2lZ8{pkpYRH%DG~2 zL!T>HBh9&D{zPz1@@Yuyij@^+@3nTl{i^7qKaGe-;K$+>flH;LGE7RuwD8xTtHd-@?VF+>Ls|yd-LP;aE1hcO&Xz^_c*H@`;l{Sh!sDfhJ zMz{fSa)LzJ@d`-_=tmwPLZ|ne7k$$xuATcS`9^FOu1mLX++DvHAmvSlk0H4&OI*jj zJgp>mGk0zNQzWRvBA=*>?-66F$dr^q|C>X)7caetKm$q;B#ppK2RVBRJC&xzo(v~A zS!m-A8{Bj<{C_=P+BCvzMdbz5aHD4;55$0YOxFg?z9~+2EY~(A;Q(< z5XnhAK@*P>$X4WEG|0f>E0#en4Y2cOVfT2@5zL=3>1hhZ@fw5*)>s8a6apszie&PD zd|2aH9+aefG=(mGOK-Wax8*AE%oZxb4-~-(kdFAsN{S!0^V)Ga)r=|+{#TRmX7Lrh zCB9LkBH;qEK$aufedMP~!k95qA*YK&o%{)LBM4F*238EW?vdN8P9_)Sl_qs7wnr?oGl*K3-#l$_B%y1pyjyMUvicU&jk@b)rqAT-Otg~KPXZ9x1k4e^S=2;K*huCe*C{KKVhSyrx%j-S|r@l+^il9XjZ z=D~`bJB+xH9JFPbJ1(q&WK`gGIRaDcprEJrU_46>m=Uly803A=SI1F*m|!w3?xhQ4 zLs30|fVxA7++L$_wf63@W9EERH$X+S2)+k z>Ji=44$G#Sx=A;_QdS~9FC?!D>q4>t;Fc9a>#yW^K(a7CgrkXrT^iW} zaqwhGH@Q*^`Yh|lQ)UV-o`<+vi#PZ&OhLGtMB$0Ldt^T4iYA$e#c-QsM1@;tSdU8(e(sXJ zSQvMMfMctotDKi9Sf1#>d9v&DG4}AyGIlJVhTK%LqK(Ts$=!@E_#+7NjXXRH!xkQ|9~NL-^lf1P9Vaa6hin z!Y|P08jwakwG19%W;6^p2yM(mW7_V zh)`7%{k5HLp6h-0cefxQIbz8Vi$glz*~3HI)+Xgp?1oe%$T%a9LiAs#w?VCv7!qOv zR4blf3Me@0MZKlJx(!id;_PrI+O%aR2$+HBGLon%_OYm`fpdYQaWkQ(h+f+Y&OY8- z(sw!~sd{#+8MtXQ5(QBx1&yGjGLg_HfWilL9mXj!c2mtG-qTz5^V>U3_u=P?=?kSW zN+=3(3)n5G?Xw`vVIvZ~Z-N;5vEDadFd&_6JDK=pG!iEUoDfK^j^sTCRD+x!xD^n8 zB|xX@ulCX265bM!G2a`P8`ad=Kfn%QtC>-xr?24a=6DQ8tPLYvNK#BK9DHd>rsa=< z+HWMROJCDl@&)xsyV?asjg2NIxTHBmWj_*o1CPAzM1)E)L_t|@ttQ$>drNpjO4wu> z{w0}0SooTXr7^L|qQq)96+b-Eys>By`KgH>R0)cPNWyj+R$qKaZ<#Nt-~XlUFdQPY zI*~91AsvYw0Oben$RT48AyR4!fy0#4JbC>4TZXj{54j+x4>8w(joYVAS%sHNBC6ve zig6ybU8LSGPxik5yYl@yjfm4`^0w8%aHOosyyT#y6+I8WimAluVvIQ|(&#Z-tW^G} z7xk9@BBhf_*6d9&7V>x>KKmL_~L(P;s6492ip;EYo=Q!QQuj7dEF#C#*Q$ z4jFJr0n%*aEZ;fWU&^T11abP5(wdVzhOHvFtxf&o{$VXVIggBQl{YVTTXI=a5V@Kvob7{w_ z8mI^79r97Ib)_Bwxv)qbyimMAj5>XyG8VYj zkg*zPE0z$@2fI0Tp6xB;`RTaXDM*ioi3$rGt%>?0fhXLaI6op%yh+3FX}D*C32c{iu1D& zZ9Ngo$`utLoHdqm>W49icuisI(;UT`Cwt%jW)uEt!eF+SVq9Fk1e>5Tz+!C_<7A(g z%wi&@q^HhDUH}P2kFuq2Syt|sqt#$iyNEY1hl+*Y;EJBdXO+ouu_1Jg%aUB;&l9Em z-uk3KA(0K%t37e+u_S7v*0>}Qr=RYiMws(o`ZmZ2rzt>DiwzO|1KVHh@vzJDlJzo%=RXHXBcS` zx%+Srx->e6#e`gN%qcDyHfeAm){j*v9IOVtTRXF+Zq=Um6->QY3g|cv?b#SQA^0y2c!Wy$kEABK?(cm zL}KD^qIDILFREG{SbmM_sU1nxCW(Hg`$KMU!;2ShYwHsEV)NX!!JQ8=#1Z=zUc5yz zE6HL;?9~WNBCJfuWg6Gh_RFd&%JRzwWf-1=1ZPlk1WKxJpk?&6qs8_a=kwH<73R~ed$t3vx@ZNBJ zIDj+i4F?}&yYMbmq*%DfgDZb_?H5;d9y>E(bV*D>Rht@G$K;8GmD_rusn~#D{#a>| z?qLE1tA6$$uqOCmjTCUouVu|d>EQ{I%l3DkR(nW&)H@mXvuWsr$7+YF9$GjT ziEPDqGh+t6HI_7LlBTYcmQOMB$NZLAS{9cRhz!y@dJU2$L{>$ejc`i!F3KrXI4o3H zJCMM#GU*k&Wh%ngz)VJ)d`nGHzEjUjls=L+OvGV(!UmZ6eughiFp)VsD_}7LRuoQ5 z+byRNmMpI2gqllz z+jNUp@Can35;JUwztZBeHqf;+#8vezjCN!&1p`7v5?f@n6TTnCu`b}+uKvt3tbwdo zDnq6uGLyE3XCjs9_L!Za-G3u1<^d^1bw5b*HY6|Vg`$BQPa!Jr9zg3C5tG<&sDd@K zqrbLK#;gM7t(w$Kn=&%xP@<+O`Q!RY4j4KHH1u0eW-BY1tUa`Z_*+q(`>n%g5&0mQ28p(~48!Gy>Ovde9 z3TBAI1{5t>lK^jSRaCnl(llPM$>4!8bCOo#tEG+R8%XLbY4d~zPCrU}v3WY&u^62g zo0}P=iRU$29jl?@4bh(J0HE}J@~^sOBwwaHXT(GN3hSs)&{3zN{#>>LOV=FJ!{(*B zo^-@s(>Uw^2t5l)&5045)H?KIv)Rbf^nJvCTG)NnJ|D#tqy(aW}jjnP?cOk{G= zVT=m8hy1owRr$5alTr#}kI!ue=Ij(SbIZ6vwsVV$>jTu1A#|{l9gy~QPrM_$@8u}Z z!RK;si(b3TFL0#cf2p&yBS8+tzcLkB)HT6ET8Xb`&goaG))CYH<>mGki0ck%g{jWL z4#c|pU`vJve{F`KT?R!?s6L2wm)*+N5W!cmDYdl1EyK)uVUC$a>O34nAyh*A6+DPc zilog09;^X~MkEr9G7EAwu5de`788B=op*)n)ah7PxX+uYmc0S2$RAczD#evMxBl$@ z${LIL{&b~NphimSatm)dvP~PJyEMiYF1e%8VgW$@Z~VqzKm51ydoQcS ziA=k5xYNPIeD54-k>nZv9ky;@Q;wJTf*R)bvSFvDp!`3v5do|ucuvN&jN=_U4EN- zbiR4c`tA43S$rKY2u@P6!rtX5$fi}wx#eqSbWzugXW?b#hL`{4J+j|PD%ovWgwO+74H0<7kvkp z2a%6IFrp>2c3UVNl$!3lo#j_y55|noa@{4U`)lL`w**Csec|yO!|!tQv;cT^G5G`B z$75UUmGgj*Oq`bi(KP4?%g6_FkX4K)Ao$r+;dh-3syi9K>+KUSq~~UM&9w*^zJvo6 zEhs$sS6DvDIbGlasLO(pW0oTTeN31rsU;Ft1rfp^3GJM$TLY2TsBS$g$Lkc`c`V24 zwB30Qme*o;N;F<|XLS1RJRi@CGiwBgg5UvJA?QuWwXCD8odrAyR%2-C^wJ^;bFL1I zNS4?0@VrjZm&fwF-Z^Mo%k?_#oIEw#>jizOFv(2PfRr1!Pvo9tXdwXrkw;q5 z6|HcF8v~hZY+O@6w=BlgFuuMm2<=SpqzP>W^owxu@I&OCauhgj8Ayzh1WP0>f?v)RElNphAIe5`p19mu)PtC( zg^rirccWE80B$rKjmU<=%v`1(^pn-lIu5h7dV)SQbxt#?S$JYp~eKArWmN zM43R7>L=o3Hk~S~o@YA386Dx-w0UP25H3-sDV1Qafbd*m$1fiKYhai^d8Q-mu?sp% zN7%|UzkVH|*ayHTBLxq3kRdWbuZ9F6%b5IOgia=`($w{9#M^nAbIHZ_JjLMv0fiqB zs&B8(-!L5NAJ3lA4pkDi4hr?@=E&LhfBC3WgQX}Gq}Cbh9U;VmiQgr@V6O9X*orO* z3~EUU%P=UNfZ&;q@PYUP;VC!0KQRsK*e)c>Bo>>FxQ41EI>TZ-Q62i2L^~@}OcuAh zg3!01X=DJ;56a4eEWbLZ2+nND`}JQ>b(jNqkN#?FT_Ew+a=K8Mbe=m^_y zcuE*kR$vSiLuAD5j=O9Q&oqx93q=NbX|E?glTzK zT2SH`9pPeEo)2HjOFW*U7+2Vc+$>O^$@JnuwuRSQ#;{WZQ~@XINfbEe!k13bkH_Lm zO~h5l(2hL2=qV`;_!I4idLNeFk8XbW^E>ZQ}{ho_$gEOFCPB6tljFit#Wy_GCd70KU4S_^`giUMI6|RVn0*( zJyZB~XVX!_JUzFbDg5Nt`^{DOy#g$R|0V=X8v!da?f}Bh;Y3H&8Q)3xKT(O^)Xi(M z$W@74+0}~CeYkhcXw-ma!F{G9oS8w-bcA1rj?gEh8>YSwB1L*r)T}v<0g`BnxMWr! zXmksxA9}=+vpDm}(S~LeB{t5}?34)EorwIXWClp1EJm1jo_OUe)5pc2B*zKLNtIju z2eY}=#g$-#94LE-I!ozxIVUJ=@^nV4VY2GQ!+_}Jh^t={yle!8B!&w4zaj4avE+tQ zli5b6m45KAEq-}OPnn|1FRmX>k%$bg+_`=I-uhKTq*uBx1XEjs z_sAI}^3mHJ-ISqMBR#wE-ff<-qC82GA#lG@jkRT5`RE2IdG78>PLplbD&?dgZ;+}U z8Y@c-r#B@>v^1qMvo(#Rj9^<2R?!iuR6RWTcYpbx-!h;0cYpa`z`|Eb6grK@VDp$u z1EhqO4)P}=Jxa7^w3d+dmH0#i5bd}ygJ_8mN|?aB1x*W2>@5_;+o=H7tYrC>v8A+$ zMvTai20OURGDdAyoF)rRM+!vNACaJ`{6=VU8eI_M0+kHIWRtIF_-7=m zSLPN>3kD@WW)Scjl1WGD6tvV#Wv`bZOwJ~g=>hj$tqN({zmq0uIJk82(nT4Qou+}O zG9ew7G?*rkOIavW5u2Q_5lx03nLRS-YDsKFJ=B=i)1cb~q9xM8DbdBEyU??ZrsGRy zAMOOfwUYI{0~*9bS&N-(q(+|%Je?j*LQm*K_R-3HCbOY`1n(Un|7?`K=$>TBKyo9W zzBgcy57ciAwk748&bg*ddX?CZQ7$RF@JSZUj#Qf5Y!s?AWxDpw)V4D~s~{^xru@Eo zmwJ^_9yXb*&zpN^ zZS{#f3%kD&it5j{YpWKC8`YY;@np))GkxTda!tN)4V5G#x!YAA-(eiCs(Fy9pHe%$ zjOf0WjfAz9ePm~c9A*geB#Ypd+Vt2NHx9-ka26>O$|@RF1}01A@Du3P2K~dn-X?FMTZ#R23{`0bD zldgajdhbwz@rmeh@-^yA$`;pPEIjI z5hx=lm&p3-qKb%oQgd_3>I!MTVRVq$eCF*y(&I=UL_3MF$Hh+MJWfCB(lQq5Ap}sO zW9cC)mc<~e+VF^y%avs%E~AT>18|47vLIRdot~09&&>&#F3kv-zGl5rL;dKf%CCWX z$*)j5kekl&%M9~2kE}14SiwJtF(s_>I3_tur$>)wlZYc#T5(UTYtfJ5ItV#97T+6W zP*~b=i|kI`KK0V~7KiXaOUQmr^-Ik*(Og<_r%t#^AHyrbQM|x2vmlqTEBYl!2w8}> zEG`11E1n129uKxTLj942Jr(`Z$smH0@k;KWWZi2CdCmHFKAy?a_DSgs71O?P)^B=B zyb}%(t{03j>k==?5hO~83jB$z(<3*9kdkM7>Pfm>s&p=G(-{4LN;-Q>9R`l0(Qog^=n@4*~u!ysU*h}m<{DirVH6n0)k|Gzc zabix~aD-)FNxCsuW;0NA@7rH4jnSN~K;l;7CmNCffpiuSC`mh*;uS1@&v{*CUgmK> zRRwgO?JeUK3m-K$w_zP-;_iv7J7&703?g&NbsYGsEaQZHLSd6@tov|pDKEFzblp^L zgfz5b1LQhMNCG7stwhgf1R_eTESW(zv0&%f-ZI|WE*q~i9IzB9V;ioBW4fk}oGO9I zJMu}fmWPrNFY)pu_q?3c$fn_zzoxh3i|zhm3k(T8Vx}A6L(BjmG85qQF0Rf|o@aPC zB3`!z&OF^)&MSM9oTO{O#kLs8j|^a>wPhwE_&Q?+@`bC+jXW=?8dr2vukORWrO3sw z-nS)$E^gn<5~s#~n>i`mJY29H7ylA=xS0J6TC*P0=D}reKe-0)G%>BH7*&4CvdiR> z1p{~MjGK-VB$y;KRB;z(pEyrU>(YC8seujd4BoFEgJr3>*6+{8wJ@DKoYci8n=@uN zU`t;-{9AFU5wja)my)mZzDGPOSPf$wFk`a6E(>Y-s~Bm9qoEfEWWO|R>NWZM0HN`C zVqoKCDqe*kX4@w5dx0VkOFq1yfGdrC=HI;j+;cN2@eC{u&}V;D2cCdebr}K`mer^H zON&-O)0gL^KWD=BrzF8IOU$N9wrf0tEdNw>I*rXtmSG+V;|7ia~ zT&CW|SWV(UQ=U}exD24bAZnq&V+`FSD564v#2z*dY?X^j%ps-HYPHZHsOK6KTud)< zsv?@AVnoK^@9pci2Um&-Wer#zuPPHE<&#DPOqbc_#2(`kCU%wwQ!#;2Kr%rX4UY== zE#W#~A%uFgy@UiMzOzFJ0tYO5rKqqUSNsqEz{(*#(*`Of zlD4O+HrT+_ZO2C9=*+2hhb$R!5_jNRHmj{&(0Aq>BY&@QRJE{<)Yky1t8P#tO>Z*| zs!ucVO~h?Xd7RmA(H~$NT8(ZMu%(~GhSSP=?T6WkO!;aai%qUe2NOLrrO6``%=F|d zjUAjGueRM6%}kAnVLRf7gLjp?B&{mWe2=6_W=6-fV^rF#StWyukQgO1{M(5}&9S@1 zCGv1E-Ifn+)057=b10FDr#$)?`YZ~&vKi(^FOS$UWUoF0u#IExFU8$|R?a#LA6b&`t z7ehz^bjbWCH$%Sb@o5%oSrjO#9n%u7=X)t%YVybO72=o3cq9fm`w$C|bpaH9ib?mH zAMEQ1b@`(^Y7ku3MPS8ghLibzGmbUWLG2&i2*2XHTpP&Ss!z?nA}z8F1BRAWkv(g% zO5w`0SgnTx7JqHSOdU8*NYqpw%q5c8_EsmRXm$#*XjQ-2>}Q?tVKXqE%mvG#ahImq zr7)-pdt&m8+vGr-L#uhKNH?daP=Q=f1(Pcf})F}YIMs_&agG}(D z_U3Lf@ZPgWD>_v4YTNYn#f~j1otju-S<=)W9v+%=MhyWsS6> zQkrnQgE22tMMsilk}5}1z31p(XqXiIuw)D19L7J%{H1Yq6Y@qigLG518=dS>b8RA_ zXVcc)hQy$}V+}0a8?}XTIv7i8;K99WRPcbr}YepLuD-8QWOJI z3PZ+HNbrJ`rNB7#^3mN9BTMkR?3v0Ob7uN9Cgi#*)1TxFF%HEh(cFi__{>&UNHt2Bp+F$YxpA#zro|Bm+MDrL1CuZ}5VN#h<Vr|T^4u@~OT-_EXj-2LYv^32sZ(Z_%GlPbC`Gn=SVno>u z$4e;IHKRyrq^v@O~2?O?6x9Z z$EV5gguh2inIl`(R2WOwg+VDNoelBfRm;R|Wpyk6Onc_rVss13F%)(PbyP=8+oXCE zRy|B-X?N`A!}Wqm%*!2IsmFWMeeSkgXPNc~drT;phI<17C;XITD|j8x{aBwivL!vn zp_TLEd~v*%-ApnYNWO#4$IhOI8E=*6=lC*l4mKyisGC5V z0apS6EF+TKM&v~ek~H>n3o*VfxP(w-3^HLDGOx=rE~DLC0grb8{ws_7AK(L&mBT0F zM~vWdoC(&kB7fVJzpdz|nXc?(8=tSFD`~p&KK8#4CiMeT)*t#e9^Br-mU=Rt4yTVd zR=m`AcRzKG`L&}Agu_)2&?FpUfGq5j(-3n`){aLKbHXKO2Zvr11!l-mV6U?R z&3r}v!bO-Q0a?+4tR$fd>6Ee&F(`7Og;nlj=~6|mACHPWcFCw4cxmmDdWYW*iXcQo zU3W+Y-!LMNZ^xo6n8O9+t;6Bjco=6+Jo0xtm09HQkeY@6i#xxw#Ax`Bjw!TUSytE? z={vu8Y+e?1=hxAs9rA~{6-c(@6P=Q16@jFRJXKNcVK?j&3Ysy<{!WkO z@M{+ClPK{Q2fwCFodql&bJ8RvK5`6Gr;Z8YMbI`dEX8D^5EE$#Q-nb9&my;>k0aIs zZR5zoo(favWPy*9F?BvXX3DlCoo1CgA4z9v(}=@^Vs8BS44-338|U>Nj>(lP3CW?? z5znt`NkGTktIC{|rqHyAN}jBvr8ei{=bWO0kLBl_xr5J2%~{^T*6rsf=jh<`v2w_R zT)8oX0xu(sIjZSo^6e6NCOK&ylxdp9NZ020S4URn9ITvE^zN~&oV#ae&hrs+mbVBZ zymQarb8vBrk?WDzm5k(AIKjo?c9e4`!j3g2T?*X}>FR`iOHIzq#W_XK9?Qi!^SnJh z4M*MOCwjeD|8Zv91gH@yu4)l&TGuS5;vg0(o33DpUd8|tlTe$&MU96--q8II+@XsaV)N>L?z<+3-?JOnFNU zKKf07ttp~p7$Ank@ZY`k+;eLmt>3?WXK?q!_ix|0HMn`}?%KWkAKbcge{gf{{@UQ? z?e!b)uigIO*1d~&mFf`)nsAn2DoSZ57z~kA0GKwnVHb4`HOG?hIdQ99ASw_c;BYDXiHJG{N>cS34hH5sl_YQi3~Arqs`aMCdnHYx zk@4{{bK%x8fiVg0%pl+jTmw7?gpdyf-5YP9>DzB88(I@ceGHXA2W$BvH5LE~E$1ST zZ#T#!Kfd3MaPez4KJcWf9&H`+3m=K5QMI&$HD()I@H&-|kgQk|2-9Jv!^we^vBBt* zUsuT5gbJyTGxA*%Oscu&>-P1d-D%py!)Q%u@>)U4v%s{9@^v+&x}%Rv z^eCfoe{-pZm)vwf-a<)HL!oD`+w5*KKaoxHjfdpi%S<*+8@Vp4Lgk^={V4Fb8k~e{ z9?_rtUAkHS#ZZh0^^JEWU8-QkqBB(qU=LVVR1ux^OCDDhw%sV}3yFCTG9G3WfS1ce z7=)oeL{tKCsgdo!BN;Atl(hW@@ehqsTWr`YZ$e3dY#=#+1>-KNJy{$(IdUmN!pV{= z(xm9sS=CI8u=}MdMneS^ooa7Fj!_z9OvXHk7&H%0SyN;YF)y%jV|Xx)>i(#u7jFi= z17Ked&qtzstyp_@QIf=ns~7FTIomBAv%P&Pd)qIw;lXs}=eMq}-Mzc=U~jr|W&Mhq z9ULC)dK1F?pY445=*f5+uI=O9hgYwzi2j+Ki%3T`%%;1a&I(@VQ~A}vuKbY99C7Sd#Be+g#Fdz;GX@fJNWe%( zbsLZJdK8ngEODdABeO(Tr}quR=3P6WWJMa98D$TQ9b~>PAC8=j-TI(|X)hx4$f8J& z5_NuO2{JzmH_sPYt}H8R87{9+s9m}5f~@vC%WBp6x^FTn|BrfmMpf)r8j~N9_{MjO ziex(i4)|o@$wsIRxNt?7d6zEmPp2!7#^eKp0)$yT6dpMWJ{;Xe@l%mhkR7(H(eI^Q zMQ$G^|66mb^G%sFx)**;@p-L`>Ru$#D2ut%G59>fl%PzovWn$DsA7PAJfNSb;Fg(t z7(xe&`23NDJr#WZWHf6`5b!AR<;*o%^FRckcOc zc}_QFkdu}*%_X_2n82W(%t7d?G_3s+aSw3P94>!kRnCFSpQ2}v#pUmux-rj($}eq? z)as$nK5x%~$%mc~RVgK84J3#jGAfW~g$beXymrGVO$u?{KS{qzJbq|q>|w2$Ce@14O0H)N>;my zP#sP9GUTLxuM!19!iwFj9yusoQ5_eYJBd1a_*|9Zy;-@VEbF5BcOL#XT+i=3{2TRO z5gguW^@LnhnCPSXZoDdz!gNRo#g(iFjYX#Z4Z!x%YA{;$yx|D-vDj9r0m2mt{ftxX zJRXC=2>OF{F512=;R-6fnN$68>}2CT=Lwk49=5tF3n0c{D(j!fen5*Ff}4Y?Nbqt; z7^FyfJSMcV-`siix##YK0e-YTxYaF8tQ{4z9aL&f%nyZ9eg#zj>Yy>8d>4!Xa84k< z*=KLT-xhTH9#TMswW`#2+5QA*@yeZdZ{520{#C)u1nrr9(zqL$H#aVn6#VW@9s!*d z5y{Rzuw=EfftF2aI|L9_0MUsZcK?Z@W89`__bi=3`DwKEbbL2%zPPU~! z0V$V2m#Fjr)1i`PM&wj|ih*lIIG};&C3qzttpYX*;S+#({28rdhU3nZ=8>*bl0E40 zbhJn-86tvQTK2U(yEca6`*Rud*9PzNN!JF~#qLhmW_@nh4{qvVZvz$!)v{kXp+v!V zXUoz+cKc1X|8M>2ZG~qK?(b1+^XYOumzs*+O1Y2n>4j)LHG|zeW8i=JMgAx+?1Hbm z2Yb?Z2HMxfiDK``CJo(S#rlPG=!OE?k8H!?`dBGuX{#~LwWwSP5o{eWl9-#)n~8^Z z?=xgHGWOYL<6c7<`KL^o8I6S4RdpkGBobvDz%(w72&XDe{-f5u!8nFZD2 z<1(4)C{UZ~%WxER6_FVw&Z8Tu?eTP~{vyo|Z;#aGt{Wb?4#>)(76&uqTQZ!PU2RVR8|M>0Mdt`7(AR3aHtpSga3ruT4gt6imQJ=+H# zDW$buf8`u<$>V9hKhl&P$Co3mS_jpU~Qjx<}T8?aRC>+X<9Zu>m&*VX@XRTKlN!6NCuzv*E$cmVI7Yubnc@ zC*6=$Qg;%9d%f2Y%3IQ)s)lwdO^HBM#ip{_8}F;Iuf2Br2E$#M4E!-G6w8Yq#ca~I;b1U~q$wHQ{Arhc zk_p2vt3wF|-xEy|CoB2;mHW5fxpnXA9}nJU?x^#}+731iTl|vLUw*}w`t};8-hZq< z{asx__2-ZFaz6Q{KKH0_;gxqk;>;x5lHKL_W6xgP?sG@&z4NC^S*Y05dv;f~1a>-F zy+Oo5qPtVytym?p9vk|>5xq6Dv<_|{7LqN?%%ZnpBnc7YI?HEvAfI!4ryG=BW&zD2 zIJ-%FRfFHe9e?BD|Hzf$PkuZn97_Bgu5%n>d4sjjh)ajYSb$8)V(ycFKC&#R3vxps z4r&69KTzw@?2^22i0=tQ{_sQev1SvLvkAu+qSeaiT%GPPIcSdiGW$A{ZfIkbO_JTJ z+-Np>E)60alIY_XOKp2ScXi}LHcAq?A)O+!c(TSiGP3w@KU(M8=5{fAbYb%2H*$qz z+f@+|X((L{qxbAVG)LzlmMw^m>MPxk|Jh~n zc)7efxU5%pwG3arHn{va+d5GHj*egDN%XzTfAL8-L?8uE`L?WG^v{6YJ> zFEgPLY)NVkzjs0MI&g|M@A|(!zRYmPsK@Z; zIC$c1VXg>h4mVu1S;TeHg;rDBxf8W7M0LdZnPU_8dm*OD$zE;n z>Lk^16ks>mRnp0v_iEma6k@v=U3DQA9`vEf8DZ#bvKTy>90-MlI|Kd!@OxwjA71YE z?3+4wh$O=1aKQGrZ=2Kk__76)=hnXmH)*~H?@NPCtKsJU_SVcRzbh8@6Lv6%OEnh+ za6_(kreWVwO9K28*Sqh!tLpzc-SF1@vxw3=PllM7I>FK>zfDKORZ=2fNAedOn&~X@^K&Q<$ycN-sMkb zrv10_eDbLS?6dD|O_=C^0(axn`gflItaQKPlH&!*&?o#kO2TdwnhCX2H7iti-Zrb#gLYnj zesQDX`l8n3PF-G|Y?Y4vXI+v1zFj`=PPPs=COguIjR&7@%8x&u`K)V$sHxE>*9QEs zZMkE9*0h>_u2WYY?EPU|;wPW{MW;@|g9nC8c=%vH+jv0MFb}wz#IsPcI3w|=)bjmSNR!}R>%1GDXQUVhHPBx_N52e!{6ptKl$RwG|fv8|1@@qb$3`1lyq4aXui>fSV)>X zCoCkvdFaMMtB)N&h={r6_=b)k8O{aX76S)f;wAi^1m5mE?3fL|_VX&21sUTT*`~XG z!zT-NXyU`?|InTY9$?)jDE&61#yfmi(IBA0`kBzM$em^>r)izq5g_ ze=jY~rntX51#ao?oO0+`(IJ7A5AWSv(V>GC&g3?0cJ}ZWyz!GSt~7D83z(p-x zZ9GB@>ZdV=?c(c6LU}kvRe~#PG|ESbSENDBr9%yX_R-l7oJ;EZJTRVpyIc4y;aOH3;1>53n!b@Pb}*l#K|gxj3zQWt1SuMV?y_iPEj#Jlb2r%h}!|ZdBRS z7E$0!hmkKD(4?dbMx?;Z3-J_iy)tvXq^@H=M-|a|wzrIn99AXm+0MABNDy%)axrhk z5SQqnpVd+kQa+HsvMNR+FRW~EcjoEda=yhOd76Jea8#_>ycdrH#3w2nzRfDRIU zs~0<15*H9HQ?F)SE9%7N#awtpZ+X8pTb>4{1>&_OS7DUYB_~E4V<|bo-Wi7q-zoec ztwTS<64iEB&%1iR;bqnXj=JT#O=l$o9$#TL zFWYFHXM4-IP}BY6vYA*Z9~@VVHi-7J2ht^+iiG%C`vF4V5ho|RLNt%|m%zbzZ=;>M zamZo`jm4>5C>i)6lV;XKXBZ}49eZ&RB(YtiFEo$#mhjRheLf!BR*K5l$GfHAkf@jg zNkRS>yqCR@3jv2xuWYK&JlXsH7ipi(W`e|STEr2{XHMrbL41_ZtOAZ(R;=2%RC|@( z1?+>pZ+{tmm$LS;-=F(FZr9>^?cuTl^8pQJP)_0!mE#m?~2IMeJ zFPB9e;)Fym*QNM~W6+T2MeTrQ%EB5aj56EH&7-{~z+h1}pOa=UhI4??16Ixji?!_Z zrIWJ#vXGQ)LTsK8e@z+PhkHwTVLW-#R07m0_G?JVxlf9pQB1OuPdNgG98%alxHg3~ zYabgW>5*y-jI3F_d9L@}uWU^YP-JyRQQ(qlj>EB2u~%@NVx!6;>J#F%;sq4o%gJ3W zuHA=wOL%Tf}zu%;Mj?66#C?0ZNg`-lOq^xpoybFu**@#ah}AJmMl6hO>{VgSC4Iyv zsdZ)k1-+$Rl+qrexvrWu7~`5!a%nmlTP_2c?kDb5BZ4U05vvPSYCDi;o<6>u?FxoW zb7-jIwD5De3zd=&B4>mpKG$BZyG6koFe+Vpa#Q8lr+dqx7oPyV?>({&myS4ugejR? z(7!Q`*-;o-V9pG;JgiBuR@;W_Jlk8ww-gSG3LBIcwn|e{l!xT{O`KBFk5DXKRInb9 zgp>s>3JVgfm@Zm)LvMMn>GI0#QD?cyk|3%^WFKLgGP2Xs=WN8nM*0qy^dubdiHqq0 zG536LSuadB$4w8pZUH_7Hpo$0UGCW}Ibm?ib3;;6`4vOblwqFhefP_gM_U{kTks&y z`AC@C9H&Fp<&brgEGisQ6He_c4ZbfZaiH%YkOVX(@z&lJ>s zxVMxSm2-+Mf#kU;(*R;3wmBA^5rGC={+zlXIS|MXNpQt&_}aPHJ;6=q>F9n4X)qDxAnYA`zrFiWuPJK;vLr zuq1FJ2m&q}DWZ1MSmwFjcVB=}DF+VwdSuWpV_J^>EC5KR+2Bgn9!^kTn1FzJWG89+ zXm1HP3UP_=tOIGqWvdVyFi!at!G8eBNOMGztqjkgn%tbG2AyYn%eV*+a}#dWe!Hf{ zr2fObk)g!+kwL`{Dp&iO{9OUiSQNx|pP6~Ox139DIfIhE)Z^DnBzrS?hX9FasT$pD z5(KrwJti*-j)I_Hrb6>C=q>F<#jtEjL8cxeU2wSlaSlYEN5@kh5_V2#qsXf>yUo}K zd*6OZ;+dF+&vs4{dnE&xd{bCwGQ8*}l^l*}1{X9Rr>Mft#rYTXmiEe%@l*os5)Id_ zHj3i99HGnb)B%d~IM;EK`ISZKCa8oeKCimsXTkx8WwKGe1mflEC-Q2=CNZQ z=0Vdh6VWg8(tm(sBJ79x59Vcl-`abhbMk^j0);B-0$++%nR)i!XYaLdYklkc*rMHP zSa!=PC$zRs0+!Y?TC%hjAj4{?3GM_cc~UWO4Lh|2j(niFMXH7llI4U9N-r#VIfk4c zC(ok+S^`qTgRnhpB+sdEfJU^0HUXZ4i&RmbVcnB?hZiy#CV^7)nof@iK;k;EI$YeI z7D=E;moq^*I;^;~6=Q$e3t$R+JsJWmNN~|Y=aurhNSR^IQi^*?)mwaNVb2_eyCAlb zt~1(nU@%7qn=mJVrD3@@lnrIzp)#>04+_pk!!_U914|q=0wLsma-tygw0H?7^9tf% z*VLRFK5?Mf7{HKVHp*4-enEzK zP|7;W)d9|TFB$z=>1zENVq_0_ZIV~~I8u;T$Ot4(dN&(WS(^s*aLQn2_8ldukF)Lr zO$qJ1@tK>akmZI8ST2WO(YE0zX?}9j2II zb6D%TMkY)7(L_~B-stcsfxb+cI&{*I(m*(SBoXU{Td>p~X<39Xj`^*ZV#-T2%pn>g zVGmK?qUEU7TH`KbRY%hbZAtp4Q>U|4+SOxFRqG;t#=evnt`|-4M#ai%q?jBAX-mD7 zPh<3Ox;HN~lOOo02jT=u*A%ME4a-v-)^hy&^@qEdxBWO}f1AvX*L%%>*l*v4-3&|LYNH zgDOgvVZT&{hjeUsS--RuKeqRGZ;eSn6B&SHD&ypVmTnsuP`%w*HdZxC&*UcScO5BI zhQ65S>ael9lp9**<}L4YJ&ayni0cxw05>c)B$@H#mZKh$Nd)65oKZrBo=4KBQWSvI zeqw00_@$Af5fU>qX9l^cMy}{>!F96l^_x0+sZVH)uhq`Ru`!~F6G^plf0z*`x2T*ee~5ItPpWamF3XDU6=!IIeEGSj^B&f1L%X-mTj zQ6yIJ%6)hEKZyqpEteVz>&tEMJc<^cAzNdy*FP~^>SOe*r{;pm4-3 zyN8dG=mI=)U|9&{ClLtMS{HrhHfXK^Oc8bBq)<~u)n*ZE{OR(>aY7@RN}QAK)qeKq zlV{-zUO~+w%2NuKg4Aiq1^MI|93@3`^*CkROOm=2IYPZL3(bCIJWYc-Em5OTp-Vd$ z`9^(WnlHcxm05f=a+$?$EpxeP6%cjlPNlY7trW1ZliYH`*mI}k?h0kYG{*jU%bSRH z$2#LVbw;&aE%wF~8{M}u)cY;61-1{Bv|pIOc|X3$#$@6uZ`kDg7|)v7Q$`3w6Yg_F zDC_b~9D<}i7#=K<`ax~ERv9VL7i}k3iV>9U6rsh>XXR(;UTY;AK!hV_>?oOSEU9B;?#d8)!GgO&lmrx4_Ey$xib)hx$@DlQtKEC`H| zNd&y0*GwBxeGK@W733F`Y>ZxR)KQn|RY6QD3{4oH=tmoWB#P-R!UhAF?z#oTo`)d6 zf)A$@lx0pqGf#VQy4`k_c#+V|pS*Bu_5HPbfD5|4rOu+6|TstJNR3NhdZ z7AzowEUH1E8^Bes(?|%WOkkVI;Ub#USg-XUC|{{Vo6-T(;Yo$4p#W}v-0k2`Y4ay9 zFXl>Hi~#PB!hA}G+sl$%LnOCBw^b&3t1b*QfbvP?@@F~o1rKBkP$D8<4aT{y@U1AB z8aUM(orLHk{IfV){ZYX^Hp}~%W1{`xCodfraF_UVTDABiVd7o~@MQ#C4b{3P*n|+* z0MIMv5izp4HCzez`A|hCX;s@G*U))T^s!DXt=A;H(ZO!hTG}Bh5d7$cXXn=Oyq$w_ z3>IT2;6l2+7U5YS-^5N793*RxjJ+0s9bD>Zj@KA_d~QwOEHdZdO5sS((a3R4hZkf% z5*xy$Zd6&#MCZ6vD1P7qaVJd&aWw=B=NC7(CC@s)T&Of6{>@z`@9WUH_jh1 zn0iH#m{<@L69=oMoX7^s67Um?vi02DvY+$*(olT6SqJq(5CfS7mOW!2d<+N z)yPi@VYd9ySv7<-m;1l4{D%8~W&hdw=dFLSGsEAp4Bxr`_x9&MXi0v#mc~hK&{teU zvC4KITw)L9oN6bklFXZe;w8@GI-%aiIO`-V5T_%^)g;^%0Y1d4TKyy;mIGLNEP(Je zOVBJ^#^)$=%cmivaPrp{WOy+TGF*M{o%hy5AmNK?vO9cZ>*veK)}&a4#RzKk^*TBf zUD7$0tI%f&+?PcWlu}Tx*Vc6+?ee2#%(K-AWA}UUF>Y)ZHW&dFkdF*psE-bO0R_+X zAReGBD!EYm5;k}!m*;8&zmD-Y88gM+sE@z|4sb0X#<+ugyza9IZ_Ayn1D!eH_AG;W zhxN((*ByJkxueq3yKA=~Y&kf@Ke#=#XLfhDMG+xN3Efj;ZeBy8EnaY3R8Grk3yot5 z4w;&Eq4tOFV_m21iYtetu|(K=JBNXMf)5-cl=<%+QMn)jMQEDTaUhZLJkj_lgHH7Zkcdnt)qO%{oI@hUcbG5r?8H0Af-zE`%fSXDe}DXCg@;bKV(Pv4 zUE%&ab;bNFuT?1MNna$NfC^}K`hI+=0Tzn{-mHQA!(Y0mT6*rS}mJHc;t^Otlts%`c@B&(As|gq+m-FS;|rlQ=3M zgc_4k4bUD?A`mDJ*gaB!z^ugGb`lL*oa)_C;cxE$2Q9dti^+arWjCzBAFPT1PqHJc zrpFC|n~#IquG9T5JaApp%X@GPS)eeBv7Ff@%AYw#6<@BMC|pgPB)`kS-d!KSr6yd43}o;} z$XOO}h+NOfz1!Kt?e>a^bAEKnA#iA?BLhm$=Jn{qaT5SU@pP{04^}Y9@m{PlQe~R4n=-8%% z(mI@Ed*Z}8_Fo^AuHIc;zYFh}`ES815Lny$$hd~|82;#81<;P+>eyw!q*V|fx`^yH zQAV1^Vd@}#u$?}1XR8to2!*>>zO^n2yurYQN|1XY{G?Lu4+-9(Hs(kdRonO0U>iGF z;|0NM9IWl)U{4P;AW-cjFxU}Qa-urEMtDPrBnoWeZi3Jw5y<0YX{{>urNUhzV1w91 zT2d$j>D)*Fh0<>suaFxvx$!9610F13gCnx1z}oJ1vS&lZ;qq{pM92U1*Zqg)IR z+7#+gm~I;yle{v$7p1z;m5+?r&}Owd6c}QD` z_jzl^fE5bjXu5)oIy@Zc7r8f=5daucco4QC85RUv#a}4&Vu95XC}jiQ!U_Y$QlyXs zqeTu2^np(ADdHtGDB`7jm_|}mx_aa0kBMul8h_`?%eUUde6dlYb_2z&IBYpiSoMxW zlK6tC4RX@)rsi!6evIo-w2IH~K?-jhmOzOE&;j-z7h3b*gwL+p70I_SI$&>D{(eP^ zgRKzX?;n&ZuNOYB9&$5Jh#zhr{w5HxC)D)Izx{qx+JZ>wwO7IsWOtvn%`I=QU^zRl zy|OoSfP>P}X8a2JRJsVf_R2<|gZ4+SyuQf%{eC5S-QHqGeM1;%&r;u+mH}6>Ms$IR z&%JDRmmCtmW8zvcOMw^|LMpRo_Ch_TRe|EBmIXETmw$WW+AuZ1#Si@b>R-A0)fXr3 zS1{*SBN7+OZKc7Ivcm@2BDH~RHyEi0eG=${C+RE9OK?OA1K-t1oCEF6<@jO zzti1vHT%x47hk{~38vm{8s3Tf=37Rf>?RytTblJeeQpGorTn~G(za`R(Xv;l>IUmP z!zC@AxTDz)E$zuFh(OU{_W)cf;qeRs#>G1F#5>yWvO2r9%;x1&yP0v@YLh{ck`!A_ zy3OXGM>agkC+JFnsP0FkwW4N&XbML~?r$6#!G#k)Xw+NE_WsqmnN5WPZw159&57^} z2Q)WLaRgL|&h8o&)}L)BuaT72YRE;#86AvrjVv!b$Q;edt!^?e3TN~2c;eS#e(Rza zMB2=Ht+Uc>uC%(#T$z4acw&YiRXwyUoFV-phy2z4sA8wfm6eG@--#E*5QDVi6Ng=` zW*o%EkFWjXN^`k*@k-GFNmf>>-2>$xVhYqtK9( zZ@>gd20a{k5SWOV0>?ec*@%3|xt~IqLQt|u$vE!@{2U9Vj;@7zC&;D#`vob-LKl^M z9~os>{-Nt9_o45*lJC5U4_y~eJnlavEYMjCo^AX)&lRPem>2iIfPF7b;r2qR2HI;Uz=OjIE;lTRUE z>EpwScmf|4W1e5WaS(IwExmix*ZJMhDEECJbD?|sVu8%_EROeGR8#JcGxRPu@M7D6`%0tS(mb}fUtOBx6n;)DP>1tbw}%?PLT>7Cxe z-|0L3#li)s;*^pK@#Zg0we8W_yZ%(2soxLFkzHxb+2D7kz<3oLO*!M$=j^r-Tuf0l zZZtaN$Xfml2~2p)#5;$(gJ@ma;gAs`$Kk&X}E?+ zyimG7QkdjSc9o%LUX%RMxiu8xzb-uW>r=|HYXg>-J7*j#FUgs+#}zcd}*j?pe6&{!J%%@g~^~(4V`yFIdkj2 z5^mPv6@gDc98DCyofwn8^z#p-twlA1&4rts|CI=&5!YUUCuJD6n|WdaXR z3^g~!5X8R1SLC&Vc_TL%rb63ReUtRu+E|I53EP z0B+uDCJUHbTOJPfrgBk{UvdAvE$8sJ|EeMNYQtZCBI0DBO~CodQ_jb^h92@OtgxD^^%whCW%q+}fUXE~%`V1n7E?6{sWi5m+baF0{m8yGexaXr(aB z`j^R`oK^mru>+8-bzy~p9Au!dL=SV08uUq*W0=- z;%WfP+^UPK$oK3Y>>Z;sF3;)?ZqGx5T9&~I;0)ZxAk6Xq>=b?=q>RYLPNoNGXan@8 z_Q<1yz6CT<8bLGRyq6Dfin=g>?ePlkdk3(GuHS)V<3p)Q+1(DxUIEz)k@Tx~K9tuz zxQp9z;>v$RW}93;5In+ND<@#U% zcoE77L@{ zphl`NbxUREI(bW!IVd<7Hn(gGE@*x|M@1zy6skbyYMdKo-3&f;O}YT?ORCNJSc?qhQ~so{&U~*z`zG8;FTC$!opQK?=P7uUp0t~22B1BQ zlFWRG-xyeX=Hr=i7PWCj^r1r1Qp=&c1Kt*NY7LY_V=w?a4jpOHlbRJY1(yH<)Nb`) zAdDfsW0P;!@H+L{&>_LIlyc1KH{*g)%ySl9(QY14=MJc#6RF|I|NJ(5(mSPhGAxZm zl!%;{4dkZ1R3iyM&j))g(f>N)hCGFWgp))mhBi0|7#aABlLd#<3-IYW%w*u5VO`DccsZ6A94EDqe@8>*KSlYadLw zIN*M1)EcnQwEDR1Ko~*W5jA?G7j)sj;?OeT;yAG~^DA93zfwGUFy>bJCi}&1 zR9e#|&VuY8NLFQ3dYjntIBoc1hrh+VOyk1KlP9`aOX)=jrh@?~4nvJ$n4zh?P-`sy zhMOOe???ALI1@j4spvuC<3BY~=CNVEck}IuVTS#yCS`Q#q;u-;7!8a_^;$hn(;`u8 zaKT+ykFI7t;5}9q0!}CY;@=QDL=2Z_VLE{RL%6e zXYb965KW<p@TLckVuhYPtxA5NUw0uc=FOm0hGq zd^O{b&#mbhIV3_AgNB%np||d}$&W!jMr`S5mJ`#1yBiv}nj}Ze-{qg1RrZsirHTj( z)H$1!NfFX{MHCqw!iI4q!;ftMx8}ZSJD~=XZU&i6bNt z($Y|!hv+_-!u7B(N)7xh@C!ilq=XRukCLG~n8?bKhld7~Tm!bY_hE^kJwzrBEE{BB zxoS9!aPI)D;(6y{9N|54i78=j7!!irMq_#MrE)o=KH&U~|BBKn1*fh-?+oM?%G9TZ zeH^7b104Ov!vGTp?}7^|NP^>)0(!I??TnTw=%##2#`r+?3@AMca7-3aPSu2BBFWq3 z1bu7#Z|Dt{4%3}@9}C?$9u;RpgeBbJ|2V`YBd=>X{kR<8PxZX zWU9M@e{ck?OI_pyy|!!h2>#(6y^1WsK}=}}UOdUp$sOo$r5FOhY4>Bjj^u39E%dz@ zTWOUK2i6oYhT92{U_KoUdD_Ds0naA5A@#$oxlVRom|N_Ny3`BiN2DNQP06aDp+iAk zrCE=SWF=4sn&Lkf0(oHemXUf{|5FYG(J7+rxU!+|-E`2oqJcWWs8pfO)i$$e2U}jmJe4XwkvOZ`7MykN%?~mpb~KGJVSObIy9qCJ%X3lTnV(&ua)(DG=&-^`)|q#UHH*myLdvPbOKlyQ}rkzgRa z5Fqp6j_SZoF88UX*Wid1QR#WGEVIT^laR@L!BYXhOey|jpui8eQhL>K0_E=~8YJMs zT3&4#=UG{$>Wui@0O}M&qbzU0eWymN%`#st_S>3d#q#xq))NGv4@w`U`-c=ET`v7j z|I`pcmW}aUck8yeY(h%_shiR-I}b!<2iXtwHn_pv8y0ITyv-Jx+>uH`%U*VETan+q zXcTiJ4?W}tFc^~V$Pi)VV>^;dQnU`y>(Btd2Jl;EIC$tGnU?^v8FsedY}(3t^G01) zp*u&GV!=0*lJf&6#XZq4OxjvlIC(iy5kYX?#3IW9Sz4&;wzT`bsHgjPa=W_J!K=Hlt_IE(&X#(V?To`l4oQo%U$_yt%ZH zr;BTMHmVGeTfFrajHe4!W~YY*LW zkpBFLwN`q%BHG*$wIx%-4y^~8p8F&Vg#@KBo2G=&hvPXZzAiT_#vb8FXOl$j^-L7k zDJBfz_||N{w6UM)ayO$xFW5sW#3h!v4k>iJbw<|EvH4!C&o57*Kj+z%EuyxVYX_d zw5jcwaI{Dlumz~*C@0@3`6&QxKli=qC|K%Jv#!cH$~h1!v4g(t76(W=?_8s`>Qw6A znlvX))ylcCQ^e#+z|M<>GYDm5r%m>(-F+SBt-$H|R$tD~ATlkj5IpZtzWXvs+vl+s z>}bNo)xUhPhpfH28jspW+nMiY4jQ-652QS(0KJ&@5E}PUxo+|!S&tCKnhI!Zg z4`G2AyTZGh=2OdFX%mx*Nlxh^RtrQujq0@y-2AmR@%?_M5d%B#Km`RG7AkD$Ld8+D z11DA&r43kKAO_FVDn8v<|M~guYTY7oemu(W)Y}m%o6RiuDe~R5l{G_7^d;Y&g3OnE zcU(xhch4m$%m4#Z$b(v=7lEWt%7czHHanOWf=q}P_Tg;mw?$f2%u~w>nnE6Y`h0iZ zJq*d3M70g4;Q8*rvQ|&zyF*c>i=Ivg4IgEJkhe*UAwg=i4eJUN79HdkrviQ8e*)i~ zsa7w;5!jJfsKPhLiVRH+-3c962sk<;Bg7z3{qPgaSfH>I%3l# z6G)y4X4!I=l&3bZ>JGS-5SYoIofXo^0y8ggF7obqyyKxF0BDHP01O^LTc#WxDWOS` zx{ao-G56VxJkUaQ5i@8vHFd z)PM#v@{1r*AR-h46u|cgRxzSm z2RdakkqxU9390fCDo3~yd8}qIiCKlrt@R7Vvut>|0eV8H0H-7kfX8blNGA4^4)Yko zq-HNhkuT?D8Gn9mT`vgd%e~m~hJ?!MF``%j%WW*4cXp(=ZiFr*bmv2l^nOYH zV(rLpY#)x6_l_r+TpYfszFuvtw0gqWwqU&%csq;ZH3{pM>xLD87_KF%YV0ONMQ?CZ zB26I-4t`H85#%v0+_GO`9K)oTz#YO2OGJoDJ}gvcq&I0nz4GT2)Kk{HC|eY&|uMp^d%n@Z> z?pwv>+rW2@!!B|pHaB*8{a9hLO^V@7?TT-{0e9i&Dfdzcv-_^q>(RFs(K>{e|Hb?%1v{3S_kiVZ?rhU1hw`MN zWq1UQkX%UWv29W1h%7VrDZ7x!CJw0whA8w&gs2reHADhy$I0^ z9u`s>T(pN*#$St5jV{2WB{!4Hiy*YFo>on{w|L?OUGKr=s6Y>XIY0dgqz(7ce=(1y z79uM>3s^BYc;YO-!h5or8Aw_HQ?+QukJd_%%8ekdDGaO1v^0*)tab?yrysNSY-49( zo~p@IM0XO$VktNjd64sa!?%T(P3+`+1(utPniJP!^5E#y4ga1@X^3yoyE)hEv*MN1h{NhNmFtAhsFVr;=8oQ2T_ zU0AY&`_LG3;`x>F{Y>R~jHeQ~Q%C`l+-QRKYj4)?7v5mp@1uMRNYr8TD0;YNWOw}G z7?#r4lvHNbFgvG%(@w2e$5c+ojA@bk+#-!h(MlP*z zZa{Ui<|Gq?lt>R+gF!>0+W81(1x@=>+5=RDk;NVKM4?&dQWZ555`JO)fGQka$<%K&Rx|7mnDhJn#!tJ9$(muD3F^vCoDhD|;sC`2?jy$Ro zh{4fxTS)x&Ve)6i=0=@NvsFxAb$n%p6@J`Qj>T?wi}{6a&YGw>raoKCE+Trg&kibieFs8<{4h*whttd-nGDh?@P?Fj8}jxJ3O zISY=Y_uPJRz7&l!jN_>(8gDJyhZm8UF*%U98_zcx7i&u_&{Opjyp)rAj=SI zzNM1Ei;%i$!4(qWOO7+w`1s?qJfOMX|EaRIeD)|l2=6n1fe`<@a!O#iX{PK6;+rWq z+6g(DX)~$9tmeGq?y*_#@nljmx^-xoy3+VSMTv6<1PndG@MR(pP~|ileUe7TT)1B| zNXmJIK3=$eLv+kIaBp%-_YU2!k5hMmumnFOZp7K79j&^uGrBGEkBiwEEy;aU8zw7` zSGTte=Ni&TzF$2y%#n477y}0|++fgWdsm2e+P?bCXFl^MfAS~z2@v_kU4h&7J$y}D zrOx5j^^#KL9aQZ05TEb^6jOq={SfD~1TcMkHeeyS#J%h#i_oa@GXKgT&~E6%4^4Bd#o z#ax`;t5~{o>&<&>W%B@;E9RSKdl@ z_95aps>m-5z0Nj~nu7<*EHPhs!MRmoE>!lm`v)VqMwV^{G&yfTObl4K9BGC*7N58J z3?C|tC!i;BRgNGZu}0#Fv|D(A55>Ed4p25R=aTE1WeIo73+IPQCP!TkEklU{Ec>y= zUy19}Mp|9#dO*ElDdjjw<*37T7?no5LkGsvpqM8f8EQzXIUXoyA#cIhf| zt@G|e`9TG9G*9F{9$5g=ybumL+UMd6g2Ku9NUq5UlphUsu0?Zpdj(xN^wa=&+VztR z8;Kj5>=S2v@Y+av*ZKKWFJ46ICD3rSD%#TOFaNjerSLZl0~9zNBjB)=p(kwIGsh}j zpnCT}@v8%gBk}+kero@SR^s?nf)2kD9l7O8;c|Qs#m5spMhh}$DSr>|q9VfI<*dae zy8~#?wY!j+VE$EHveL8mkI1i%A&e$mn9oiC+@h${<5I`!3THEsWtQE3Z%{9H``tE@ zXHCFSA#(YW)*Gn@Dw|r*_k5ELYi_w3eQMNqMnXInj+-y5Vf| zCN>m!iky+Z?>y5_%|ltMB~^I-AZ;UZjD8VXWn|{n;A%tMrXIugkfKuuodRr68XGti$rncE2XX`!Qh-x1?MZ^B-fJ|#QlYz81YDl%00r99 zO$YcsTTOVAn`G+~%STcWwy74nk%$Q*X_}kPJO}7ki~F_>i8&q6{rPR@wDAXaLOhdX z$ul@@zyu>5*T=as5R#||Cq}mh;zkloXdk8BZUaoo$#fXwm0gGJUBqkUpMMbaF@uF4&M}A{&$Y!7S4XL;84*(HNqMUYBu98$Bi~ z!6Y4M3DGwqbb}ETMNn|T5#=pxM9=3KJ;QjO>KM&5DHiF+i*Sxk4rp+Wo@HWPstwa420hwC zum+|YL?~K_8V&kHRUA`|dv0#)pLLmPp^G4n20EVf3DTsDL)s)foK996^nYbRRsSSv|ssWKye0WwZi#vDE zqT*a_c4|$8;=z=|@ZPL|0O9d>ixa(O#1?1H)hz@iVS2er&76>`UOi)^wc$~kj zEcmdWO@`C`@#norqv^1%<6*J}&T#AEP9k%(1n?C)8~J_&ffawo_TCYWC>(;r13tk6 zgnb+U2}#N{6sECR!%pZch0vZFWF&HZ5pq$TJ8avq2=C%XRtffZq1ylAvf=3 z68II&X=P5Ykot^Tn6Cy@CC)SR*cBUt=L|oawOH;ri6@ef?j`?9_~npA+y;T1iR$4? zmjA7YCG~*AyasTRs+hjbP?E|#HrFHs8GHCyl~F96#7*-RLnIHw3?4uEUk!)}q0IIu z>MIdioJ5wtY|s0@I`;^1g@VLhQGqQR{5RDD>q=@ayjSLf^aCl270MDVL1GEkgZA8e zuG56}Ud?-j0u97Wr}*dJPH|Q80&n76j*jH@y;W2UFI}bAu9Y$j^{rsLZ_-Ig>0Sn+ z_R$09y1ypmE!}b*O~M01oGZq$T$2Zur<#>ot0K^u4Tt&ooxj^X#p^n8M2TCHNIpaB zuNVjzfFT#*`q0!!kIlu8o1eMJ^|@9yZ@+R-4$4+M>RSypWThbXcQs79PBkF*IIGGn`zX@i55iJ7@R?)*}q*K0%vNiB+`In`=flc9>fqWDL)xZEcB;H^UP!O4NdtM}epyH;4^Rz>d= zA6mH&%9<;`~#@n*Vqos93K7i;K zeuZ1#xPxV1NRDm|ll)E3`u#p*;(AVP|aw8>bP z%;(H5W}CT|BAbT65+vGcwC1C&(%WJ?0il1a_kPdic@*DU?C1Qf@Xmss+oY!H#;&4~ zo?X4=Xyny1w+co$sr)MK#KUlisyNm-^993@7nB+*)<1t#ufEHcz<*YCG#XXTy(HV< z-^_~Fbn#8JhI;XbXC2?ea}(jPCITVck4UTPNqY!}0A)bN@Tbeke3szbVjXv4@a+#Z_&y&ioGj4YmX&KfuRXQc8}O1| zD@kIKD642c;K9cRdU3r0LZ(@3D(jY%01(aHw27mT4B%RoTmeCoB{^Tz%KR0Jy{!jR z(^&=l$jQ2t)77Y3b?STOGBvYBNV4=ql@KUC}^bbVJ=wBMh2k17|VYZHOJEC@L(vZsWn zJx=|Vg``ijH>|DH5Kn2Mnb|FhxK73OCf0{Mj586{yHq@VN{Xl7D}yG3!Jvb}X=9oE z;NErn1TUj~(riMgkPlN9wwp?TfEAq$f~@E&`9=7@aPAPs>p-CnZV)%LgxzKpG?f4W z=>*zf9q@SdjrK!1 zK~i8zat^b^UI$=9aIM8<_9#(_qh^P0cLbIdN#7W`Y7~tg{k#9~3JPKT&!jtjy4nsb z6aoK#cGcI#T!4$kE-!GuSU?OGmwD0g=ceLV8qFERU>S>sMAFM02;T98LRSC*M!k&O zW(P&}D5eV&xhC-QieI<#pk`9`qsnP#y$ZTJe`bfh5vRTL zb^1iA*>fl*o3_%pA~lL@#BO2YZw-(@|V*83CsJ_KpNxl~hp zrxMIm0%jD0NrDrK)PQ;oc>Z*H(X3g}=miCsF`bZKh~=m-2A^Ns0{ANjZV;$G!<2aD z{<5i}SM1O6Sl0hdBdHXYT&zIrK+c-U?GCiuGi>1i{6brJ#J}# zDeJRyxv9B5S+$rY7eExbMtBPpR+2uR3uTcIS*=z3m4^NKdbXzryIA?{#Ut})(MV?dZFdoK zXB;C`shg0$_0w*vT&KUAjTp>Aou&NKSHh`PR|wj5TTRp9&Z6!GC7f1wrPf;JnvA>3 z8{+GG7O9GM%1((zX$)jRkt&6|=kR1r90=)<1Y(`Gu>AkJGFu&#T(5A5`jq#fJH>n{MVlw9y0-%nVg(%(9fviF=sblEgLiOqlgh96V&DJD$bc1xatkphq zs*fT2ZgX9ox1V1qKMT+a0295MX(Lh2Dvds(_sTcu3`oe5(t40Y0$bp_Rj`e#t2frc z796JW*4}VuxJh=@+aAL}F>c11UAb|aYJi&(B6HGfsPUo%*+#5sc%Z3gj$W!)INN$p z2TjGdQ2{_b++kh9R{=Z`>e8(Cq~LB zfjZXcgL~GLmkX`lflrS5B=%{1_DisyaAd6(iR)n zBQhBk4Ra=7rp1Y6X4WQP8eMJ~aVll%5`K&+4uo!!mY0K9sC(&#!viM1mOI`L^X1I} zJQe$thX=Mk8boTWt2YVhyF6G>QbDDJUC9k2g_vp*Z&(<{VA9sl-r9&sxsA@q57pwa zEs}!B>SwIAB;8{Jno8~L0TY)k^ixH7|b7nEWpoXdkMB+V(YB2dz<6B7lou`8`5lq0tSJ{3(E_On2BF_9SjF0LtE`= zw=Z1|2Eeqy@;#Hsv-RI?{16->O2hKvCK^elwoQ6Na|=OOs%#n2DiL1dz?61unHZxc zq-bFc6R>vd1zX!YiA0r{_4)dyz7q)1HX4>`69hA8934qNdNV^kPP**gq%k@xjg6ey zLJ6VKw{%oVe4=*N%q%H3Tg;r{;`rj(vBOdEP-S(Gy|d>0kq$h$-jr(>#jv?cYB~V5 z3Qf%W(iYXx(LT!tWhA-KiJmVgg)y9A40p*c*P#wOK0Km7@-YoPz(SI(pf48`dJ-UA)XrY&Z zA#UEn_}1USc03Qp((!ozB7mZZd|D0ER34dd)q zJnZcf-neZZObi_e?;|)Q{IlOpA zz3&G{Dowc0(KiRKFUQ+MLux#zE!Qfn(dlkf@ugVId8e3`{(M&cHZd+E>&sGy1y8xp zO&K6Y2K~4cx_B(13simU^&X`35Iqq8RRU{2LiIZV+cT&_u?WLrVUA=Vhbe5rr!REj zyg#Nmfp16N^G|}%1&iE?LKiJq?`kY_M^ge+lRF(0OQrtvTuOM{M zAl0L_47*QD`JjsGjSF2o&Q{x;SH7K@6XCV3Hh>LkgF=L_e};PnObR!a~~AQI8S zN#1JXKpV86>FmH$A9W&j4OS!P^&NYBu0M9kPBv14&ivRN{Ef&j;qe_vlLY5Hen@C1 zJJn{7IAEK+&fs1idwOm?FXi_fN^{Px@Me;DLf%Q#rCrjpkh&=MAW<&IZF29S--!Fd zSlFA*E@p1c-z*&c$`iWSp#`-XiRgXgXQFybEr2(*m*UAsM`92oL_PqE=vy$qxVbI) zqPr=183ABF_nmjTT8C;CI3uJ5O=?FKr;H>#|E#4@8KiL>i|oiN$*7ikr2bt>00qiU2zc4Af(38N33$b65S8cb! z5_BUdTe9@Q=^{?4FTj>udd-T$9e+1FM{gfj0Qj!eAsqtfc?PwngOf8pz8orU0s(RoF& zt6UR8JaLr_NSYP;zo^g`?%{AucR=9bqTTasb6+8|j1QM_DDdGM(AR@-Eilco5p~7j zTW_qe5jAVeb*Sa5Op`+NW5zEOqPJ;#-P>!3ee8MMEEn#wyVMditTG2X{iN?>9Y6W( zXG|(&&76-xpPSq2s;PkJuD)jXbWzZu{c&||?e6Ltp_ytGjY&%*a)ATm<>%jWGy6Mz z>C{5W{_&^WSHoYN=T-$jARENo3~+hjM78R1q-BRwJ{&E(PONz6ab+|b#v@BT*q~rJ zs!9DB?Y|CNSk`W&v>DP7V|sE4D2CDkJj$dUNd`!6FJ0N4d^zqH+zllcY|=X@)gsOu zxLFhgmnW@2DH(?%CtX}kE^gw+$>msD_Mmq=+TYCqg@ekS{+;vJ(uDB@``56>B}4_} zZdVG5DspYWJC1(=*Xizdf&vM8o;b0b&jm+8AKxZ9TyCs0M|yDi2B8FAPm6ikIVSQ4 zBrHJ_)_L_j8a5FRpwog^Z!ba!!+CqMc)$RW8F>7Th=ftgR73EqjCZ9uu2GqXXE4iP z^l}b7ZziF4&q5pK@6y;<0}E|sl(LA4!s+IN>s00Sk;e`pi5mq+%ttuY<#wTew_}=$ z56XmVgTG3O_av^lv_)rVw9gzxW@l!^!6|cPw&o~Q%*0(Gyd>?6T{xA#7;8MMHvdx{ zpu!c0{rFipxoxTVKWxD&&^^)#Zv|J|>1imd!SD~Fhs&FUh|tN!`)-#%`Tzr|yt8(r z!i{hUR&Ow>u+Ju=%C33cD@?WhJ(w}4L@B`DaVu@MmmAeiy#n1nO9C- zV%)m*v^+6a`)%?GdvLkI+!iN2poH+tw2@L?WOq~Yt)a{ims4}6p(tb_gN_*Zo!-+cPos`B&XXqK-{oJ zcgi)A{+lZe01CYdfM z)~*$rx@4)!QtROWuF?6~qpP17v)%k{j-2QU9RIzIYIVc5&dnrMqV%J4J)9)05Imgb zrtw9W>UekH(?-30WGw2Os_J16hon;!t`$NsdzBg|A(5z!=YGU zh$tA*3uCC0!l-19vZ-t!gi{HJk*+}+DSLQ7PJkQrVrW%+Xq&>(Nq}KiK~o;Lden;9 z6}sh=yDS$xISKj#+YJWYc+l@w2XWE8Jue&Rck})-_;o&OCbEA1$B^~&U1+3_H-~%Q zz5d;JXcQYdsD5|lFaF{$xQ?*Kp_AKcT<32s6knRHpIsmOyxCiBbkQQH>GO6QL{<~t zyz3`?d{Qa-=RWu68+J*&DmJ2T@z*=|zioeJr;q8|61VYcV6e*OlmUdRHnFvwWS=I zBybP4@dR}mUGhqsts1-LEEna(&9K$0XWATNEuDm1e`9QY-vB|u?Jqi9w%<9Qr9(4*57h$Zr)D7C zIPZ8DT6L}grz4*1fd5`L;5Y9U7W>J;{%~z#u!*}@2VmLDNmJy&4ZP9aq)Ut!fkA>% zF)ZKEN=%2Jrq*_Hf)^R=$+>+zI_FrQn&9*pb2~KZTtf{M{mBmX*KDYT>or&7NfZ11 zyZ0u>8Xtc@CNHPV^-m$3E&_G~l5Klp*sr3lj;nm3vF>GgY;)J~@rhmEpvmVP>{Iio z&ONaUtvc6eKk>uc7uVKrtlv0s`M$Y+V``N9{g?z4LOmU2OTbRb!7Cw!7pEN>qL7nL zXYWog-)$n%=b6z7*Rb;))K1OHI{%E$8g;HQCKC5#XY?Puz5Ox%QeF9p7Tj1{y>)A9 zz`r#18;5)uJEiFs*CWlUtn)b0Y1|Pozmvp`6R$;{RlN}rbvbnOL&fc)vO@nT z!*lbRJ?1kQ-#aPN8@)lhOqv@ZaWdM%s@6dsRH1rCNgLD-s=xI*DAG=k z>#BvHXO=Rz-Y>WS;CPyDovwt04b45U8(0i52Ug-fkS-)~;A!kf+H$SNiRb6mbtRKH_=|wjVcET8sFvPL znl&jgF^}j*sJcN`K%fmm4ITM9A`=1kG{3l6EjcsL;w+h?s3bsj1h}RJlQ>K!qRc=F zrHraOZ-Ao`7vNat=oj$lD|Kp{$PhzjXp67jcFbFnZC;9x5p*= z#Kt!qpqO@yl-lyqr~sdE0=7nJU#*J@q+4wOfh)i#GNC@cZmzTlSSlzLnEt*4EAa53 z{2+yukwkfA=4~rkWE4K4GRqJBZ+(6!l)FS|K5)M$4KDm15?m{SEI`YW5D(@yxRL}P z_cjS$gp(};G5jp#{3usLvFrFC8f`6?-U2OBg5_U~sKl;?t|AO=jm&B&J}S6^J*WV^ zU1Y30fDEo3n?pS3{RqV}LgqJ!{_hY#ueFt~w&xyIP27Z(<1!+c4OqpX1%$Z?;Kzpt zL+Fsb2p|cB->>Yy{sKyKDddwUbcD6SYIkhabi-Iygyp_Kdr3NufHb~-Y8`*ed??gK z7>Nt)k3Cen`rZe~U6*g%G3|PTkG`I5HnM^g`CyiD-{q%TO2q!xZh(=)0UIH}ZPqy$@8=jXUa`UEWT(4FWj{ z-H_8_rw_K3Cu2qyY&kQ7n^3z_FqwkHXAIn-aygmpuYscoXqM{?9+HTC6tpa9mLw#y zmLBR!(N#Di)xtx{as&D?D(M$4UD5AP;803;H5|+s$|9$bggwG?E=P2Le@^+KLFdqr z8IEn$8x7b{8cY*+Nd&_ljH)(E^$BPib%ZO6oGyi|3YJ3y)@2TKnW0YHjN&lgb!{jF zzlu7U>#iX6N+5s*gCXYgLU-+g`QOnyOE8lEK8&Q@NijkbF*`$R9IA_!5W&&>8CqBk zElZ#r^c(Rr4QM{RX8f9OVd=>yf_t6(r-pwLVeE%$f|~0KGdtT-f;Z)0@@jatvJF_F zLgTWsDf&&{O=^`Qgn9|z6T;b8kI{|FU)&p#LAq`24kfwQbcU@`v0~O`8C9Gn63OJ( z#paliVg4}|0068oP;O{^Z=EngdLiGo(v8@e&bU7;9D9x z-_Wc(!ipSaueWP##AHPZW#$aPk|RqhnYA#iV6-QD890PRv`&Q%BY+!P!mPGFGdc5# z?4&FU?O;)X>^mY6mSzGk@Tj(|eQsWBG(5_{%@?|G=ST~Ix+PClgN)x$A56HA>S~LO z%@(rtgjKuYUdmu&ZUwNMG!b_bCnJ{0sW6y~i6)Eq%y0Y0ynKClhGB)F&WUI)58GKP9pwOadQ6Z0wl zY;eR<&$0smfl09ai_kOSE%a=`MwuYi?$C%}1(}(Q&2T+jtV|3PVU^H64t0Poxd0FI z*DCgSz9Kn8FIsqz6Sh5{jUHJ>-*z*%kmYDXzi)#RWLdnsXUWiWD8JvnE7EVe$o_&& z>cr!Q-7mD+l4Ok!rwCcFba%B5M5RJA<8)_de@k1jZPSiffP6>;#1vMX%+RevgK#To zRV9Jbg42HLM>((gpZ@yaV@n2lwIW$^Q%k7j<<^)4%Ae2HyV;R{O3wMKi=@gD@wkDyh zD~CpO9Rr1_tO4g2(KVHAXuEL)*PRyp*0a7k8HR{dOC5o3_=DQG-Od0*T&&AZgdu+K z#1n8i+z+@sJf&n%95pTOlH`~4TK!J7+V7!94#zd#ta{u_Vf-1SIA}UCuI(0yCrOh; zi5`5E%?`N#sE9N9bfJk;u){}qtpC%=vmy_3OUAUE3NTcXj@=;0u(N}j9HY?lcW!tK{< zFxiT*->jf1Fj%dPiwzkPQqu&U9pGLhsR$QQ68D+E1SXns!6?20jfseGHhe)K=LAeJ zsN)rRR2&Q}_=eQ`mQeZUw})_|6k&Vo!nK#m*>PItXma#+IMC6MGm{k8Ih1hh+S3+s zz*Wu@Sh2(zC*F&b1qa_(2QWk{ZR0{r^NH0w1ykf1l>77p(^yn(=& zr(y#qRyHR#@J;T!yHRP)sg!Ug_#oO5?Zn##FZmNX<8MMRXdwsOVmPfk^JnXfrS!ry zVZC#XVGvKR#fDxxduupN9qsOomQgf)l_x`SwJBcaSEHdZSL< zzS9#OZ5`iz3^1=wK4G<0L+mgnsxcAhn>oyS85`!=?I;j!UZEL}H@v4}vCccZ7oZPY z7~X*1$n>*j?r*d9?MfKl$5V-I3q6afV>u#UlhMV|k4PmRcLW;AJ0>-B21sM}=<+T$ zy601gUCeiGQ}SBH^|rk3Bsr2$h9ppEH+|Qc_$cjdll2J7L7SSn!(! zz{*|~K* zvv-_p(<0zY_>+vl9(moIk&*~q5I8+r3E{O`Oz>P8!B)P1Zf@Dn14ZX-cmVTdp_e+y z-KvUSEbe<^t;`}|iaq4eNl)YN+@7t9@yF-Z^qlu)gpTT?rB&}hVqI@QXAP4?8(xwD zRW;fJWOliv4#JD%kIt>(SppD+*n8S!w86mxo$dgwMP!!DX0pa0JmQW^M);r|lH#)` z=a#?Z%6GZp-el?VPTGVsx=oNBeHLP#9nRyuey0_Y-O=pm#A;nN_VnC(o+;MQuhD4a zg3Ij|_@d?j)n=m7*i)xPK)>3;hZ9WJKR2uF#kqpdlvj4?#Y@?FaxuZ>L5(Y zYLzp53!a&=i0{`dMpITSf)sc1YsQ1WCx30>-!I-C9&L{vDCmZ0of7o_qi%`6Z)x{j zMc&xSzW?ZWI(NQF#+dYa#gJ43kl*M^nxU9GKm7|-f86MOFE6`{U;bcN{^;1J&+E`4 zwrz&N!oUAr7uDW<+1(f$ZN0g@S3Vr>uT;19Ud2Ce|2`0R;MgZns~!$_MOj?k zKg@o&17o85nIf~B2NL{T!SjBYzWNIKjjw?ot1oe zuyU~3zlyR^$^HMeSGmCL9hMyr$jWWF5Gm`<@K6$u->>NL@j{BfUM0m7{#)1%Sun_a zKiD4du#fIVKKM&=Im}dw!N|>wV_IEA@C*lOOjOh&flhc-vF`VjDpsmBv#O7>&O5#4 z!z~^=+COW9mGz4!&~nw|BSc*3LBd6fe=2h1eCha!e;Yg_xO7k`(%5o7-huV^&c)4G5$UMEs!tB!@l6`!<-j$ey#T4|0K z5fFS$*i6ATCt=B zB?ALY11+L~^0`g7+lA%x+E|WMj&HcEHeh{Zf^baifEZGE)W_49u2A+6Dpz$B=|9FQ z&0X#xG>W7z9Y!Ce6z&&q#TLyFv;rFChxyh@I}r&@;(1}9h%733OPw*?F{FV-#70Yn z7&X0U3qK9eEAyxWX5cbMi?(!h2xOn+SL?c21jS%AL|s4D&vIIdUmf~hI>6&+oB^9ON-&x$&!7h~rwvi_+W2w0JuJ1CfNUIY=~#UF74q~;Ms2m;ZS^Kkg0l~hue@%@c^aox zN*q<0(PUSX%cJ&_JZhWm+!ReD9C!!ED_Q^Vzkb>ACwIKy@|zcO*SU3P_14X|?yPUz z`O$lCzI89_f84qkRmCs=wrsQA13bCW4mm$(N8S{!ICdMY=h;Pr^Pf(POCZxS_9-D0 z4gThS3QLn6dXb-oQBe02Vf=@~-BI=qmo{`T=bn6V0}K((TO0S@B9DFjt(#fzKLHEU zF<{(K1nPFq7)})!$nE#u&s%Ug{!elI@2;-?=-$&Fei9}fV14K>37Pdht+AKK>EdS6 zn>TL0^VY_#+=R2TFRBg>VEFQ!{7`V$z4CggoORrV*Z9io`LV7NO2_AWxxYV+{ryLG z?`_;c-^ok#P-Fr6SM7D%%Hd5ycPD^C39NkJMB3q&8IjIvL3xO?FEC{7j^u9<@Fou>ud|}y`PQ2 z1zYtRu}##+Lu`P9UA`aa-9u_x;Qg<|K3~g-CBF{*T=)-eG4cHLgWyYGYulx z!O~SkK9@NTfe}H>eedvEW~P_>#nag@-n@Nx^@kfbZr;52*4kRu`%hrM$V_5vhX|IC z)qFYbPiNd$Z>>ME+mS|CS@^J1Wbr}*JYxgj#~wbiq+zWSm&3mh;N#*pgrDAe|A~8; zU?_H;*vQ#Yv5=iT5CZOQzQwkOv*tk)rIP zHB`+=hNluAQ5y9+Zk~7Ln^WmhxzyXqykI|R{;SV?X3mrHArPiP;@9UJx$FvI#ooEK zW}2>~U6gL${lTr(($&16@()ttMF-??Krd<>G-Gp*ObSuh9_?OpB%TP?jY?bKqalMe zP_lL;Beem^2D72U;QgayQyD|TtC1vPBybL~#6O8v`Acib$&Qzl9<{g0SGYxYhQ}$% zBGC?MB}z@{A8qegnFz}gKv!|_2^@z$r(WO@6$i*t7N9|d;oFN8`sHA+Y@>Bz$#VAd~3V1@dlzhyEQY#??p$e1c@EF)z8p4eHO{Tm2Ufy`%AT1)E=FdrCkpu zC4(dTVRL(AqQ|fYrxnfq<*mcroj==7Uh58`6gfd?=u_zN(CA`E&0u$Fb#oX7Gf-KUvdUL%7F=2b9(O8Bp`lp2_o}VV18-zyY*6cIVLmqtD z%@x#}i!T8}epIp5a%E-e(HY6?1zkv=ukSg-essH*MEN$eR?~V`ub5*pbtJT`0PyFBNMFW`P*Q@6*E~J9-onna%K9k%K(xao`L#_?yTRT?daaV@eVUI`SXNfNOZ!nq zBb?N13V?pKd4TS)%{o6_=m3y6>U!yi^yN{^z9DvV#UAyhJk72rkJ4^>u*rGAmp?Up zK1(Slbakmn<1cum^Qj9BdRru?O&#hCEdm-E%z#)?ZxCi}Gz@y=pQk5B77asPC6 zu!%l`7PU(s6&V`8>HFlJbhzd&MWYe{tM$^2_is%MR3{mv#@rb9;3aCt9mqs$btv9i zwO%uZ-niYHW`LVEi&ndp2{6v*_WROQ+s-jur!qG_2&XT9DIC>`hrCYjqd`*tVS6z8 zX!XWN$D5VNPO*Yi9#+B=m3$@GFnW`XAAY!D*NhFV2?&YQ>y@_&<8#zdFQ*3;xGT>! zd{Ceom+bQ52hZhr^uQ~r&X8nF`@I`nIr;g;aFgSU8&OAV;(kvc4#R1~w+`FBms^=heWetAd&Fc*Mt#$*F(oTfhXp=L6 z_|~FwwbPPNd#B#(23otZr)SZ^WmJsMno}!d0F=yFx6Z&;@qthW+g;Rdw3&2CzXnZW zgs`nAM$4X@TmFmpgHz6*^TXTlE-(sqnZ<(|S_Eyl^ZK23kEOa*?+$wHX50??TQka- zTjv!RFYLk)>WbT32RW9NJ5V%ZuHB^E>$V5wxYz3RyGeDxh2Fna;n}%$JhQW#Q#1A< z!-K-GiTz6pZxBHX2%mL1siS`gw|*-ggm>}J%`JN=Um?O9M19mK#ZntLQ}(p90U6)` ztvCi{(BYIB_jUMibc4mG=hpLL{!6zKh1v!wr<5KY#Mx7PoLwxfSM8K*9Y}KHcC(L# z_}XTaF}Kc_ChLSwFH~Et)~j$?(r=J~;+)pT-GlqE${z@#N2p4&JlRXmE@p1c-<_)2 zk?}xm74EsAAq-=)-$lZ*JCLAagwkNtf(p8hwj~_lX{{sfXKTnprOs{F7aXggYfNZC zS57xn;LCNqagdC|#z1?z3`m?x#G}u~|ZjdLP;7ovGo|6Y(S0; z31p|-ZMK_m#I~V^Wj*>wT(;tlwCZ)zSBz?+f~)j(S=hXFt|^dk1s(9}CJ?I`8xbxaoE{KR;$FdZ!mhP%@IvqPac>emAl7Hnia8&bA}pTVQ7#d= zpYWwwWjR^a@ZjnQ#jZgqh&W9IStLaTD~+NW>-Kt%BPTFN(uH(BCvAE{#A~C`w)7p- zk8#U6R#SMN!GJ^Z_HuFfEGs$jxHRGnuz4D=H9Uk)c#qk-mO|F0Z%Fhb@KL(Dwsz~98#-gb+r}#yY+DcS5BVdr zAlmhF^7*$1u4LppZ0spl6m*dJ@i%Z_tXQHFEG14C@CrpG5>8s!u5LrHi~Qgg$u6k*9hR;#!zkY@6|cRG z#7MM|_^w?|*0B-<1-1B4Qoi~t^GlOIfB7iJ8I0&8u~PW^w!{Uxw}~l^4pGZ9sa6G6 zjYILq&3A8V9d#su1$!U4myx}PHD_oVofufKdKzf7wQ7M4Gi~5C(_Jk+kW^|r;oca; z)C&8V`_6U-yo-D=v$K=jo+G77r;5w^Up?$5e)`(Y28f!Kk zR&85U=}nBAaSC%*>#BRjY{8NJ_^GPi7<&l<5{$X+Nnv%=Z|1y;3@a=^b2`mw;c2xB zqnl)d`>IWlhP?@A0S2F`=4n<&@iyiL@-8lYg!&vRw@iRdqgUgFA@|$d;=e>MWS9&* zL|)|mhg5&jeChDTLT_|%h9s~ThW&@V%PMwO6P9~lp#cz>5)TpV)1kx_EEZ_-(nSC( zjO|B@8)q6ciP#`?9MC}PEgh*Q%D-lkw%*dn!ZywbNO)4wr?j;8{@R*5AzZzQ#WTno zcW(V)$dT`v*F z&CTeVwMOOt81hrdt(gHI`)W|+MX#WPY8Uav4foYDAAWo-sPFxbQ{Q|3{{POYS2t}( z8Q<$Dbj;nb-r_FRL>!>pMJ%1GRn$bmsg(}u9e?_KjstC(fSAYGe6g!Dcu^4kXdpI%^GKS z))&-X6{PfA%ylL6>X+6eerd;g8QW8n@*~PLXd*<^MXUzLXSb0V3-85q3nMSQs6eJu+SiHnw z^zdOZ)z-m*aKEc|3a@;HWBKM$Cgu0DN1uF_J-S%obK}T|Kap#2rBV?*Ws|!n8MF*7M1l_-v%n(2m9&BW!0RG)q z<~TE6FEU-v9keV+?2dpNS=YW?PdnXqt5Gd$5kL~AgQj4D#||;TKDvPIMjfrAeDt$| zri29>^hn*vtLg^pghwfg?rJ=<%SAK*VN@i05vcin&7o=W@yKx~tE0$=RFx!~olkW<5#z?5Wd%h`LFF^j2!!l~$YG3`G!rr>GD$6ygoPCcBOc zhAifgTP!&IM`79~!)*g!)~d@5;bm=>CUv9k{zJu5cyX3xh|q*68;djXq}D zs4`NV22j>(VPY-9@A#F|cFMq;@2&9cEN^C3$4l8I{g6?2u7glr(qe<`pwif`E0B>i z!C+upC}+lq9Jl&$zZqQEvx}Kq^A|X5XIHdPWskC1sT<{Pgd8MZ<2tbuz#COI-nbe^ zoIryB)Wq|1>-uuIBRD!7fpkNS)o#QR(8kf(YYWZYK{u<}@0Hp6JA<^^>)@^TeLAz0 zx%Gk(vXhhZWriw|o$B?FKtw`XVb~gu`d*(fJ4(TQu%VqK8ibdeEMRVJ&v}PMsE2}5 zF4FYgfMrR?9flalMYq?l#cA9HOcTr{e{^mQU-s8B^Bb1UVH7H>_4))eQKX7le=yK4 zQ7=TIh-vm(U|#!@jtl)btCYF*F4@g{1Yj?VeKAwq;`36~%>t~FW8nV3hp6*UEuLm(>-^`27R+_qc^F1b)| ztD06($ZD1wEdpgtViRSYP^>TsQRzl?kTz;z6bsMJsv|(7?*GD8wflc%|JnNIt$(r2 z^zYce?%e--`|}^Pm%V%@?JV$M-CCVkP8>_?w#{x8G59P`aSf%oPTC+$Q3#uyERJP? zl#{={Xzi@_GMCnx)NKnvlrc1w|3z2<7SPVZ&M&pIj)@%X7Dc2kwX^Wa?jLOLlrFWi zEAPJ7OOYJQ6$E9`_v9(L>tk4CPo~dA| z;TpWc*rj&Xue5}q0!f$JS%>9cH`2Vv=g25ZUR`QuEviQh*aBIC-#%-xb>dPxtEg^$ zW-aUAYTLQg&XN-Gr$dN&sh#!sLiE3$llS7t(=N5MejPXd3m*SV?W_y%E?#P9trU+@ zNaJoDj(zf5aYR1gw$T1X^t zZ0@Z9SvWX+by6Ma2|DdAZr)#NXI*M%y^3V{0pjuq=pG&pcUNky-)vXb#m$}{U212& zLe9&R(vX`?*?K7p_cUbTF154#qPRoiqq|%5$tfp=^zxW^v&sLW`*^9Hb!iSO-;*)q z=5VQ4eH~m#6VtR5ST5uXc zxDrEC6-CWPr`d-)djR`ctDnLhU+bMiM61zTsS@QqRYYqm@S5b-?6|MXfll}$M6?>^ zT7fQSf=udDm(i-N)OyR%XI;u@UCL;|Vs|N{W#VC%GFn^dF1k>nSNgAFHF+tJxjDXV z*rVTss^3W6R>CUkIcRP1G@A6~czY-+_R53Wa;*YyE@f7HL6dB686Vjcv00inx}7L$ zm)QHO#veZ4h z=!>_9kQJBS$<=+2qWg}y&G@`#QnyWrxrq3sW$gJy^_ZD5T7w7)g}7g4yGJ#k)vTf# z(1)E1o~5J-Z&0HSOV2c8TT#b{+90{CAqH_?8Lfplcot(ydwM5|Gb%CpF@cPyI3{Ni z(n1ZUl}P-f)=3c^L7fG0yDCgYa20jywRW1Es(5BY)fU&94b{1Yv=$$*UlAd##^VZU z+3+=xFm-H*)!Wj$UPQr_!{>Y{t@fbRjT_aZJcv82t{oU7qdMGp(1P{awLVO44QgFr z3L=E-$8`ZIt;I+1R4J|fu>G9z5HHHnvq@=XeR(!9EkAY>8g{vO)fk6m(u=CiDtw4g z>%j(Bts;+$1{42mHfnu@m*8DoXgFAb{cxO9Ol$EWI#o>T@Tm^brJUBKoYp7LicS6j zYPNsLN#~B8W52@RKDm_Bx|GxUHIUP44qDBq*-6Un<^WB_K1VJDgT<1Iydt`L5WB*> zcyYXtH={ii8YKS>`R)!1wEt0;zOU`Le=aBP>o*Wbn~>H*Nwrq4)z@o{l_vk!TJAPl z-3}*#j1_X`FS`7~E+2QC;J4S-ijQ`WoN`V%-FvWoFx>n9*?ZR~Nv`wEkGmi)91x@^ zlA@NB$Pz>X197rD@0Sq(axgO>0OB&59+IZC^eC^>J?QRgRdvr`xZbsFuWdybzAo0` zUGIKahwWW|(}ukc$41y+_M`p95sv)>^q2Veo|7jl>(Z53*);=Dl7a#THC34>&w0r)o>DpUT?t73voC+{bGODg326_Gj2As_ zPwKnk*`dEX(tb(GA}h`C&SJ^nYsw0x(NMpxf7D2+U%8}o{zvuaw{fO#ZV#O0~B$k2$65}m!YV9;@frK?zxi~r74iB4klbnWoa!V`?&*PS)Rj0DRbt|RUp z$C#|+5#GA1_HvqDqIgWC-wIJZlc!a;q<8`=q*Juvq;Xij>?@-YNuM0yuW*c9{%HCk zznI-k#KLM%k7CxGOUU!1-ztjn+`@djV<4wu<%fv_MmEyh6ugOx3!V=ZFa&?zxpZBb z&Fk3XZ}6^X0NZzBMCZF>;g)jUM_8gv#gQxgi$DDbSPj?qGrw3A* zbwFqoV&;Z;v@9A>oV*<`$rrImK^som;S zw5pNDnoA5r^h_C#uq>L&&BPf;+lk$fxhM<3rT1`9gUN{Z*O;ztMI~J+on0KH_l}iC z5Z$gVoAmSHTc%sB?t&E_gLSVYfG1@siy8Jx=d{r@i;l%+MvVW&@@e!YE|-8&s0%MwFO%>_FqVSG?e zgiG`5q#9pY;F_R)$Qb&8w-b#{u=2s-{t5{f`STQyx1CErqbaxrswK5OIrtUB!vjpu zvS}$UEi&OpgcZ(A+V}6~AG|H5ZDVD)rJh$0E_akLWkESJer`+w$;@&MS#+AIXsfA6 z4roL((!=Q(uOl^!YPTc_R{4SMGBJgtS6IV{Hsz>QuQ2j8y=+`QJUhO3MTSm|vhGbq z0OkqPLv0aMuPdYa%bA#gVYwxd+WP9w=#p}clc$tERHA@tKFl6kTtE-7Rg(3J-ce>! zv_%&C<_$^Mw%(AJOo#Ck-5F}29@UFm(@)BViYI5B4#tHt5|nOdgy^hmjP4PV-c0nC zt>PtaE1e}Hp?tGci)GCCP@Y28lzQT-^}pUkj7lQ(aAzbPfEgf*Ki**Kx6-dXRr%3u zIPrZ_*J9j&7GD$kU?npyg55(YKk_T$0A^|5qlCP;atG_GF z(2*s7bHvcHq>AIAULo|xps_%ExL+PKDQGplR0pB7TCU6*c8V1iu8?Y4NvG5=vFXf5 zO4e%~tTG5?ibbRD*-LXH$%-Q`GR%B=;PhZpe=xfuuacR^+1y2O?1C3{fORM_x1atp zofKl|CKtg{_V5h1J+X6?3qPc}D=uxHcWD8HW&W$*U8?tER~myZeK|VjG*z}^^vo6M zP3C}jdhue_-)MeVOb(8D_1|0g{8D<#K%DT#BmQfLQgy9DnUv}2gp-~&)svB!-B3Rm z`wC{c>cd%=x#6XAx{QTc*-7#aWPZ#0O}2-;rkYFBWmm9M%*7~?6y2{v@~BAT5Y z9G+fUyd&?zbM819rv+Ex^|JpkeY7k8Ihv+bdCD4J@6p(c9z2qmdQcqvlDWY4N*RH+;z{+%rRkVV3`T@vDRjb%vVE0VCpqqUO;*1z>5(yBhO#KJ zq6sNauFg_kuMD!P%WFwLg!l*M;s~qkPwThh)zQsctTODi_?~$`>vx8{;gSW4}vhXx20GNn$5Gw_{9+~ah1#tiDh=tj3g5*_pUo1#>u#nU*f9}VkNPl4Y z$$}zwm$Xdpukgg2HD15x^8;9tYz)k7X;z9@8) ziPfL9PpQf3{fJqwue5L1+5yS3t#%RY2FK{Dvmi(#dGBiP-Z~cbAnuHAGdGwjve(le z@oId;5<4QM)DDo}rg*=OCn^^8piX5OR~-o)!{Es{$j;^w!zg?CozdH;5)N`5eN`?$ zGbCik%d(|yO^-_E#MRMTs_V56iC(9h=V+E{6M#GF^`v$X@}=2!DLuV9GMFS*h&%PU zR@qSP-cnwJyC2-XvHSj8H*em4cbD~?eVB@YtJ-c(E;q$GSvmth!s!F$2S@*6vL7r!}FzZa27A|NFk4@ zFob6rzLr7acYh-1sGIHGk=TZxGDBsCT*Ff`CwHy5Utb(g*yJDlQVl?zTzT~a&Mik6 zXv()4OPLe;=OaDu>)RDXKrAp*srtBwNv~+9Xd_8oVUfCMb1>-2QuWVV+QNX4TyE;=j&}!!AY4` zR$2ytV0IWouJ~vl#BO8%5!wm2e+? z#+L8RdHiwEt$3f%rfKuF7fpn`(K{ZlK}q{g&+FAyIcC<4enzi7t#&s< zvBbeh>3q8gn1k3ylBmZ%D7C%P;&qqXo}I*n*B*-J>(0UoeZRijW$f1q&-bzbo60P* zgDmn=r>LBQCBpUsHwWn~Q`c*?XUW^p(Nmi-nwjbGUQ(vCYC*f9&joVO9$jVyf2DP` z1?F93IuJkT)ADT6yaZ~uNBAl#4EE15iW)fjgP4 zjxuJVsh7t5&sP~gHP&)pQ9JxLB5m#$hGj%hyH*}WxV$+z$@3Jz9-Fx=umgMuZG67e z{Z?IM?Ong#datC1i%%Nc_-RGHXL(`9gbZmzQYEQXWp7bcmNMNpG`TCsR|<>>%)}gH3}jKb90%a zFLDN`QR5N@kFpW_`n!6;Q|E)$Un&!^uST)&joz3X;31Bsayt2NbiGa({r2(L0+2X- z^uv5S)f7M$=hM@}av^O*^Kjh^@3`(&&%5fnJK*MF*iIY4@52$)lW*Ae)gaixNX`*6 zG}YU`Gd;mDPmZAKE*5Z4Y}M$BmD?E0)tR7oKmWPU-C@VQr<*alHI}s;i)cB8=-0&F ztsAchHggD24t~Wk>^4W;31HQG=`nz)`qrMd<+^)lWUP(Fm1jiKRrHuh5h`k8*(B(pbhLh<&@AQq1a`s zqoef(09--y1oxNYlxdaHxl`v?1pprxa#q%xS_K-a0=oQ=?Y`s&)Ml5%rkt#Fo?+%k zG7_9ep=9dB11cux*wz7e6m;BQ{OLcM zj$TbiAmG(&YG+jYGq<8|7X*xZ?zSGrk~L0_hr1?}ru*5LzI*ZY>+0$^*uSU`UfoS! z-yvNgM&h8FAPRD3F6AJr+fgT2Bypou6ZOtGK?_0&^(~HlpjnKru0zK z5J0vHftSJOacg*Rgd|fr!P2~rFX;mjW}F=-iB`hsWDF!iP=KjV9!Xc;5F{aGj!dqO zJ~);%n4}Wa>HIR=ff2O#L6q+H}c%iYI0zLW|{mpRT;0$Y5@U&=fOewzau z%yX#$J~)0LXdsCLcqB61f@N{E`9H{v|M>Iz(E9Acp*4+c=*TG>4jV62A7fe0tGF?T zm0LJ|l{$`xv#?shzMQit;NnV-PA!l%|Mtt*Wvu|Bsu!&DD5{~Ma}@jGT8Hc21u z+~W*?23A;3WaXjLb{L-BAMIVEVC&v^m+3Lx<@j1mcaLP(JK3%8{xChSh%312hF85{ zCk#Sp*c+Wn`}M}Tr_$e&717MY(-a7ywP0>^#O!-ATybpqp)0{(U;3dgtr>3h09}mh&y@9t);H-LA@1`dQ zyAKY^htu8D^p{i1n-oE75C07C$eC;xR0ROX46*M9-)W!To|i2o%f&6;q2>^{_LjxU zTdg?Lxb^0s)u5%L;@4I^RqF>&vkD!}PTenP)Niz>fcW;w`Pa+|h&>Hc>Z8;8Sza~I z!qOn<@A~u4T-n26(Q3%^&Gj2E_m|A2S3QFQDHp3J9>X#1)2#ULoixeu>vny%uiygE z%mZxb}Nt94f+3LXtwy05urXRmsaa<`QY_~%$$9XVKC>`OvRN%7AX1?;OvK`gy zkfATu3vy#;ulMkBNEAl>$A7R`IKjs7giMRoWX@%yq4K8+Xsz?es`f&XO}rXe_giQr zP>*6PE>~pS*LL^pDj>eY=+g?8@6!1y5by`{^h5 z=V;9tn2%rjm4ypAg&q}k1n`?P3uE#;^2>-oh6ez0*8%qxSb^;0|%F0+v4ETA!=}6+c?t9;NFLqQ;+V7!khN|{ro$7 zAH2UXwv^pfal~R{vus+v3-kjx?*n`}ftN>VR3*%>g))(aI8_rkmNR^h@}DnABQ7?w zouwo1Z`_$`+DcDuacJ38UvS>4$*Jb;m)rApdCvYj@4dS)u3?tgew_JM6vH+q;Sy1S z2gp`}?uVWo@cJb5dW>u0oARIKHnis}O}N;oc2=7VoUioOx zG6Ua@vLa?bQ(xTtaP8Hfm#v5e1Lr}>l2Gp^fCeLWMHcy0_FOI%VM#*ukzM#?-q2{s z*(&KZcmC&V@AUbj{N%*kA`P=DsK8JIx1`j}lMRbadN1&@Fv=jg=OmHzE$ZK`z4p@z zGcp(FfQ^g|#t*4O_#rCgkK`Ds;bT>l z@a+a;HX}bB@`mzD4J`+&SEdSGx|vbkd5M9$KT~q zebBzToi$1cc4m#5&rI7nXdJ`h$%E<#)`sDo6nd$pq7eNBD^(VYtxbSw`m~IqTG02 zTCO=Pp{K4VpTN-P*Ze_oy#e(O4hwSN^c`@V>O3H1=$wkMdjPN~ymUn_ItGPo9+;j^ zi?c%^XUze`QxIZJEY@A?u{`_2q3iS?%rE(-%|hho@>7g!;*i=NXfs- z)AZnQ%6D~;@X=4}FxfdNsu#)Uz6;M$x=MaQ-a&nTBzW>Xl(@)$$;fbp6M_&0_f#b(Rz?(M*IIO#F(3m4cDY0CvNPrP&h=f)nM%Vj6K*AV>ZI zkM=HwtS2AcJsyk6z#616y6V8BaC{Pp8zGJTI_q4daU=sgn=EDoCBY*TU5=a^5LzyR zHWoa28AWkg*pcshoQ(a-&MGHzBA&h&ha}Yu2!zvEx0j{%X`-S5c30hN72c@d z6Mm~jOL*hgS3Xzk7Yl&n-+D`}GHR{WoW{L6DfTIYk1uz08Z-PaH~L7D27Z%I)&`|E zwnTAeaYhQP96d6&sE!llc57VEM<2`534;GSh@PFT2(KGJg)4Si1*_>IMu&32A#Sf^vLnp38Nxq zZn+FIM{Z6fo&y`pPp}TlI<+dF^ETs>Kmw#8z!JOz2+?sqDFQI{J6om zcEXQC=j_J#qk;M~IJ0ex@Hul_H|S3ak_nnwT3!^f!~zalX#{5Mm6==G=tiYEORUDf zX1`s9PBkd!Q%42#@ETl7ih!(dWyO9jQgG;tWhJ~theI#Ck1&cHc#G=t`e$pe{EQ}h znTvbirje8mgfM{F1(1kLix5>MJI_iFpv!KsyXKc`um5?0hRoG-$7P=v1Xi5WJ;H7W z*R%mq9m*79@T6Gih^p!J@77*hmvCDeg|H5e6iG{f2nddfgkvHKSEIn9)=_A!r)x`~)55i1aSVewn zZm`6~eR(>%{_f3dw?~(0i{Ol-chiSdash(onudE#$e&YiR)HuR9_%YMsg`OBP2 z1aM=vNX?gOErX!yLFp^a*Q~KaP{#sP5qwgUAE*1{hv1F+M;YXd4{ObcvG6D5rc)!Z zAga3}YmDION1N8>Zy*^n|J6RK}#=uXfm9-i45m1#W6+Rl`xU^?wUSKA5g$PupQZJyx959`3!OQeMV&I@x~ z(L4Lxx{hO0$Z*N6*i9;OgUg@i4X*;!CZ zKWcDSOx7SnYXrT0&zf+%z-F$CQ8o7yE-EbD(IMz3HSU6ew%R{Oz->65JeUkGT`GiU z2K5kjs19{1Vku&l@^8h=JSycT3gQ=VUe%+PlgW6Zn#weWGA&v+YXTiCoTrv&y?2I2 z4Yaaybh)nVMaV$~Bm`LMFp*=R6J*+|0$KRMIklgLb1TR?w}Rp;^kDfjzfo*pf=H`t zz$X&sYKXls(Fr#uwE2b*f}3?)EpNm#7K|n=M+9P zbAvhZp`Idy$xLFWp7-^lPn>@!zdSg;f5rmW1ena~dt;eQ3=)yRe(ZpS@X?HgFL$9@ z`i_L{ajOzu$FK_LhpMdP#dG`M%8R3gzvPp8qHvU^&N?Hx#^NjKLLyktYZhyLVKZsY zx%;`d9Z9A}QSXlr(}&d=qAe<)*@TN(u0%>eMImb=uTE3#&(cp7I?pLD64`tZ&W6Qb zkRN+Ay2I;_{Q;ezWIRTD)HI|NDM)A4Z$TC4%<8GGIZ?4021-ztb{rV^PVGt0$#>?HkAHKajv>mZZOfrh*fGZ%QcRHeV4IRE zcZ14{lgP~s;iRc!$n~~yv5ujBobJTq-#2*3*@=wG&clNbd9R_fB|DT|`7h*t4k*=u z;K@q8d&-+P+f82?Uv^u_aeqPdXuR16j+EFAV zrw!`z`}O0wdC3=5^~01z{s$EQ$Z3Mt3a1IZyH$l_Pb@PTAU>Q_RaKz*g}`GN#n3%D zsF5lu@;G#X0fH<{9fT`=mTM;{P@0d)VaHyc#8o@d@fpiZx+d^sSy?_Cwm|fc++z;; z4}(8xWo=fbCKJjVTi;nx3GsU!H!XHo-E38EvPUh%Z>)Z@Rtp!Blb@+-h|67FCBvqZ zV}dOGTcQ8_<*J8(;0FelQtO&YS(!&h5?&UPuzF;rS#plP{7yrQ>t30r+4eZ3S<(6MXzdpzG&W4iY)wBJ}udxMPPw0 zM9Ge{WJx+QMal*NTkI~#UfHnZNex4wcZ8+pB{`7OdARrD&9;-4?1jqpOG`Gnjnxa! zswH(xdC7Lyh;f0+Z8V9i4Vq&zR~Jl77G+{55QX7adZ6Yo3xKtK7zJ)#g=JD?qIlA4 zpyg>UmYD26z@3T7!2^8Z%;ekv0~4zO{z1npVwRe0-l|(lO~Uc;Q5Q)qJM|OGPeUKY zk%F{EWk=Ay%dmi?)Ng!wn2V$)`;TsCYVy{A?%Yyta&CCR)Gs`LFOZy!aGA=XL0biu zgv{Lv^Bd%3P|Lx-!I>j7plq!n(zdLh^o&(8zV`(u(qrl2n&d6>Q&93Z*mTY(z#Y;yhIr zo=Y5EB;WN#1xnlySmce{bJ7Qm=(gNxbV~r~ebOwFCa6dpeIOVn7`evq=fAtC`GTA( z!t}?-g8aObBKr=|=UjpA>pGG`$`8+gPiTZzfe|cPly6lVMYmc5J4mlV11`Llq*WKxfM(qk zk&8r$7^ToLk}FD{T5FQXP#8>X-%UwT7u0vbEK8}2a(M~Fd4Rr!&AR{+r=AaAmAtah z@LN-&hQq#UkoDHHo)3wA{N{?U@75vDY*`w|>i}YO9NSwk(3$95Ek@Za`aO}ga5waK z1-FFB|DoV&s?m2@d8-Qf}diY$B%wFn^x})?GLx-pslzFXV z@QFcYS)3+r=y+)ngmy?SHiHRLBuPr8m>p6c?fFg-R8C$%Ke6#lgp5iB9)K`@$Z`G| zCi6GMdUc>`)`QtLJNzXzWCusZS`t6CjJ$yCHZ-^bDf^w(^S#(zb&r7n*$Z>e@hgIh zH5#*XjsGhk58_5n>bV%gmPlPlc7j@TrWe)AcIHwRMOjQ+cISLJ4D)p_^hl@{6x4`< zh6kn1tDu>B)Ys-9*kN0#WgQ&$+bdRV#eu1j$-kns{S{lxgj(WGd@QBpH4{0_*aa1X zNEcC!Tv3+JS{m3@n8(>NZGZV@Y{Fy1=f0?3NWWctKYZ-X)oa>{_48t|*m94!iQ2!b zV|CEK63X8YW<@7ed1}7|u>KY}4T! z3WBX3PI^KOXSn%rUW}HH@GZ=IPQL6_BrO43H*+IK6IrD=vt2hWm$9$qXK?I`YJzMq zmYvwwkNWrG#UQWcj*z)&Ag=*)^CC!>UD?POFeOFP#m}4=8aDHiy4u7k{5*;?Q~(x` zuH^@C>?F7d4S$1i>_oaYos*w2fb02k#(JIMNC|I4;HH?4V&7wfHQVUul2wqpV3--g zn^w@w{LfcWyJsYPC_m;7e&vhXaLhJHc2-imn52|rh;RpS;IKmTI@Kh6^|Q5CeoP=; z)ADDh8vQY?uK;HY$nS_|uygRstR(9q5M3T%dYWf$*zoXYKV9_%{b9gOBmTR$E9eqqlSi3By}%xaBjhX-%wzW5udke#-XS#Dv{>%|60j3e^-p-IP(gv zPe7RI9Fh8c)QEBFsIkH?y?Oik4^f9j<$gh^xhWa~{=?tX-$`Q6m4f&NBcu%5rJVAP zom{mY)SP#aX+|2n4igKmPWcFtQ!V&w8Ia35nr0wl${rH_tEiyDh^hg?|4#{Ol%x0d z-hkw7z9W*Td4Es$ z2$vKC9AS&~84Y}h4vw$ie7{z5?s$C2Y`S2e#dn4F4}V;!>dI$OycC-j%zAqV8EkRi z5fY<tsuc+Y`spJQGFyZjc+}T=TP#)hC>MOqqApVQOg;0Liepm4U z38vZA`E~fp=oktav{fLr3>G%7Vsh2!6-^nJQ8Rs}*p`ZMCw6aB)R)EYMqt*!WVMup>LyHGLwTLtZm>0xRMGip@vmqtt8QMiw>LwK$m}HTgB9kwkink#A)Ryhd zH(Q$KJdm{hPW`R(kwzmTd}ww(Jt4w;H_vvNkB0&ea;v-A-S(~$9GTvoHO2hBY06sj z8|2h+0zoHmGyJeuznzO8?w+$asHLGDuJ!u!#Nb1Z7eiU5oR^^r_+Duz$U>oQAC(C1 zB~i#$Ef<+jbg4YQf|BP`HHQ=*@0d8QK0C_8zYfK90`>kDX^$~hmVo3nhv*9j=$6Zh z+J*^Nd*a}ZL_#f{nV2jqjC{$a08THU7H+&P6mOoR_f=$FLJMUVkC&EM?TFjX?7|B+ zG2fS&0ex1Lw2KuoixbX&!buf5c~J=4Ww-Imax&g+U1bFjX>Qv3);UH&^04y`KudBX z{od}gr}`9Bj1_QO>+qZPN~!-Vyz(yrVQ-E7&pWdfuqNp@i!qW=I!N^&y0>VvL2QuB zC4VNYS5nW%|An0|G!%|)7H$^k>mo^r3r#?(woOQFF0`bWOs!y%+gRpMDN6-w2GuYN zVF>1E*?Vr4CrH1w0(c!H`hr>W8_DEvqTBk5Ph|i8+e*Rp+v=aoPH4?u6RBq(qPdXi zKK?p8M*X%|41LP2lpE9i5f}OR^Kac*lD0%2xe8L&1ea`z$gd<;>~OrLjv3kZB*sRD z<)QDGzYVVk1r-dA4RzAw$6 zNK89oc4P&`<5mfsop#`-l@{b4QjugVZMSf9Qwp(kg;n=6iGatV(CFp`MpS6?MlM1( zsE~rlCD<3aNEzYX6uWK&j?+3~K7BT|PRxPQ{D(R|Ub#jc)En>YaaaGZ?w{`7}u(_(yo;UI}W0LWl`2Xi~0lVZFhxfcQF z+XqS1G-EkP%9mp3C~+7Y(b4bWiHcv#J<$cU8cqaPL>yiU$59dWWPhv_8UOfcDX!-D zHB(xodh?XpDaaW56bX|=?^)I3aD*_|eBqL^y06J6)a8ti?^zt>j+7xQ)xY8gB3ui~ z11D13WDMWg2Dfg=Wsb*E(?qqh7;)&LCC$tF;u?;y`4|k?Im3 zuA}qUy2wYmoC+VTRbZU#3y+2RJ@GQB4kj=`RPmE46yZeVAQ-4>jHqln4{XSQcOgtq8J#!v_KD%Q(-#SRtmAGCB>hXV#9}HF2f>mdS)KO^cq*;AeEEBfP*BA z899H*R!;)w-SKpEO%I(a`Qjq?#^4fimg2yz@5^nm3n~rFk+*GYVN@suNg+7ZT`0|x z#;7uD3c#p7qk4BN2Vf50s9C1>X@xSXJQN|%iaw%VPdy-CGws%eT3m>xV2Q#>^62OQ zM_XA&uZ+$n8QqHy(Zkbyx;&+>tL>s(8_lSLptPm-ouTUi#}J$(1f}p8VNc~OlQLj6 zz93s5+D^eD;Y2j(p5Pj~vQ_n-HV;y@#{{mFk1K^s`V;$P_S5q0#xz)ZTMW!qkJJ|K zZCHR?wAe=G;c4OxX^3(<*LAJBq?XGZQD}PrtB5WXPfZTS8Xb`EY>lThg3`E}D@9Kr zLV$29|K=KXI}MwwK9$0%0*;aDUo=5gb>J~JBPS^VM1vr2oQ|B)TlN<6E zZsZSzJ|^K)RZ0m!{zD>8yu0tomo+{hBV%sIg~Tbhen^*Uy~f14c}z7TtDa0QMA#^b z8yC_`M%|@a|3Md>gN@Lt@*}8bEGoJY&6l%-2`0b#S1(*rrL>}!AVZ;_n`>Z2Am4ac zrc&)M^GaVt2ZH>SMDGHa@!SHKkwhr1*lCJ9vgoc+fCpBMay&REw8tD-JV|vZB>7oh z7A+j(>+@UZ`lZtiVKmD4J%meZ^P~Ivg?1jN2~H${roR&+sv<1z4LD8x9{*fSVlIrE z34oijdD}fP5CSJ76!L8Thf-7SI0fqPc8HfpTKH)iQwoR(5G*J7tke{RRpm&AH^Kpe z^dA*2t+T=tEc^QkZ#iRDzT|Ry4!|Jvwe9jo5>+ zLc-|xDS*uO4Htk1RUud(pUySuBO1$8B0@7=>RD-U;_9eW+_AYcdZd`!icLg#~TDLE3-Qk(Z!M**{X^r?yc_mV=E(?e<^=pk&ai;9&Wtn3! z7vz!`x~aw&Ip?P2olR9`Shn>JgX@U>o$Rv|_w_7OI~u)E%?{9?778L_({gY#3(mdq zgTFL9tu-h}Qj@ZIWtg+Wt;v|(6{6j*uRU0_0;s_%mOu{-gmMgcGfYS%p@tL|r?M)w za_Tb5m}Fp*_X9mVeCesvN}0ML7Xs$6;xNrQ@*%$Ml;l;zHc4?E=@{uSB z1Du*Q-tofQ*Kh6J#(p-ocOGzR6PyFMe$H0O#d$kVfHEt;6apL8R&nmbP==c9=g`}- zVrAZ*N`6m7?|u8Km+T~1KZyRBKpfnm1#I+q4{0-{eh1HfP{;R7E~4cIO_gi7yU-!$ z0U6KdigPYIEtVZ!f>EMd0NV(|0;ska`7*dMbbp9PL0pCv@gnt>I(0tx^HoRq2GaO7 z{Z&C(^m*9a4l^9U6J!koD8I-W!gz{tb`YMSod%Td7OnwLR$OE4J-=++0PuvC<;~m@ zCOT^6QD_wr^}T+DhfCr`qFT&u%XeWHdj_XizQo!)K4-SC=2kd!Q@RRu7fVE8UB+VZ zghT{o{#BGk1%`-3o$AciZ`a=A8NGuwcL3=@l&`EPk45PluMJ@&kU6h>+r>5n|I9K|)b0jT;1|v%q-Yjm4IxjTa65c}+VJ_K* zrOu}|^kF`{@a{F7L!~6@hMFMCHsm+w%b@^V*g7m||7pJ}Jf|_7W~1ceInCC;jZv-s z2Kh?W#osziv87hFG?am8`xrGz(f6y7sc(Z!-Q=$niiC@_5E>#?dgSZlTl;Lite|#T z9t{I(IpT{PoI-0jK9jB2#Y)ST)o5PbQWDgrHCj-u}medCA62ZPjW$y?P_3R#bh! z9Q_>eJQRK)AEXo1y2Ob(RpNQd?pi=J*(~a(L8?g5BW0R0D_3fJPNVE+JuF#Kj*-?p zJh71G+m&nLDtR#Dr_dzo)g;re9%SZCji0isp5k z@PNz9IM(ZzNKgW9Hlz;$!RRr4M+;+|eYp{xOL#mQ-P2tsl2%IePM|QtXtw{?;czJW zhg?LT5CrYaCP)Nnz!5A`;T7^#@wYZ44+N^Pxd9uM4}i-+YUxQ~#31fhN0WF%*N_Ta z5D8Lw5T+B2(6?rU0JuPjj*iYq{Yp8VdLWJUfwRyUqMn}!L<#JpEqnBjHSndNpqi{B z7?SB<#afZ!zh1|Fd+M{N&=&8i1afYjpb0<2=2;IavrAyb=Hbo7Rrl66ond*i(c{1* z0H11(?hFbOfkX7sOht31#IouERO*xp-&7IH05d72!)9I8*c%ZL%n^ehntLjMxM^O> zpy}>WVOT)=DbyetT&Z^0UbMwYDa9kHhb>M8@z|%lo(u;YEokIn>6BR6m3UaH)wn6g zJDg<>7R&KkUEYZ>u{B;!RU#3~o5I_%d6i50VFQe)-=mz15q(R&<@C({pnlmX@KC*M zo{(P+CN*K{;@%eHcb$@6a{SbB@c?z)DnQF5h`qqJBixH9*l~&s_A0#0Fn7y5k9>Bd zv$OdVgomD4#)LGUfZ*t)Mk*BVL(c6ALzrzBTG}O#;zyoU{YiD!dWv~WNQ|-B^-yKq z#*J1Kx&3Z)<`HPMb+=-7)m;{#qN_DWMI};LQf0Lw@uWy9bC8i@sR&}E_S^7=*tTo)cWpcSygJjtgzkVG6H`I*eU1ZCJw?R4!8yml}K9n*x9gr za#XBb7hOL;#%`(&cQhATB8&K_z=_lwt{akW&T%WtN)BvMK$TVnkvz2f+G~HkwG!*? zpB@5pE|D|0qJjKX^4Xp{i9i_VoYA2x#i@_H3)&LM+LLyP03NbLxw{5g;;Ja<7pZXvE!ECpevZ-` z#ID?i72~H!i6m4!fcLl{FkxZi4%%yI-2imvLbY=n3~6WW+~z|%w0ds!kkS`wNaGN3nEKWQjUe9GZ54QL2dad&|46@L^Yx-oV{Cc?s=Zt z8;oaX{oLD|^y9@U=$5-e<|sJs@Hu*c8oGp1i-063z;aH>a*=}b1yJXxol5O0!bUEk zX+1_0tMz&`2U*$l!rIhw+gU@m`P}@BRnc8i=kPh4oC@Orv4EH=ET$UJJfdDX#$k|T zoeI%57vI(T06F*TRiJ5;2zW-_r$J>Cm&Ca1kqr(hqC^jui5krU(n}pu zn_sTI{^tc)G^jH22C-XWo-G#b9DyrpWtu1n;hqYO^3U%73*ja|TUP*>%Dn5sq!Vll4H`L#jjmt+Lka{wxgY;O zd>i7jDk%_jvPW6LC-)y;J)gIOmb15}p3ldR7Y1-_5<0unv*`&n93Y%9%vG({BkK4> zuFIO`!K`UIQUA%5P=w6MGoSn1Uh~V*wfdJeI6At#cMa9@+3#x*Q{Zh?J_mw$Iv&I0 z8y||~zQMHwJd@KWB&-ZgeEB*6V$H69Q}odt{Den8fpGw!r?`#+J}RiQ{uVceu?AlC zV0;J>OaR*gawE8yTpUUoB`fk{jle09FvsQZMDJ|B{?yYSdkP2Ds5edp@;Dm8qfOVK ziymr?FXV&IbRxGPccupet4Em`JQ0E z^OuFZN981)s7f+l8ohZY5bcz<6ab6@NZ0j^t??E(P;)%#Ea`xy0?fCC+<_yEHr*M$ z-&F1?{8RG}l@~*esY`!NA3?o6(mc$b7bMbB>>Cd7>oL`VutHV6pJJB^*s3mVA`Yt` zll}#JR?$d|$#=LCPi1@%2(dQW&V4|mNs0)|Mf#AKrjz#hFLe$1`?_9ALDxsX-J|pY zbV+3aA-7QREYpH`GXE*G86mFHh1|RL#3>G@AVV;C5rh-p`O}ADJuki7i~voq4(_R8 znv@JzG%Ac5^g9&9$!`PRC-7qH-+S8majn9`-8Rv9wSW>L&uVOF^p|F|fVELUK?% zKwUY^K#N5Q5dUP9!O!|oBM)NBAiYDahdg8JZu)w%I_R(SJ97y&YBJ!bX-0latwm?2 zq6XNkJ!%P)k<%i6#!IKyXtf$~&Lc|@o$h1K)9MqmPU#ySm5{ib#pfvfkdYCN`eAx- zL>7m5#88FLXklYZL=e}0RfL~Pm#`M`1<8ILmh=x1tRHZ7G}S4W#;M1w4=p~ zB2={k7mT!aT9S@Z=0G&fcmv5FF?5=X=X$<39W)DNlS-)TZ5Ju3X|K9bwU7GidfNve z#rOYj+3S3_U%#E3w{X_%1NO{PN|}SKvhv?ks!N_wHp8>suq?wA@XPgrs!9_NB1%;t z@mjJ$%^@yFZtSPIPhB0P*f>b@#D*e(+hT4PZPBq$HJfpM#qHC#cW*iGwIKR)$grDM z+s<)HSxKdeMHj>=vw+6JVWE0WZycw)v+d$6(Xf!?aOzES{~Sl_DOaR6q#74#kTyPj z9vOD~)wq{<+sg}-ccV@>K?m;NN3AO8Pm9p{*JZutrPma>K8~_pFHLPX3n^8Hg9?y9 zJw+PjkyYBcEt+XD46;_3pP#9DGG)CVe?hxh{p9w$o5XXkYG663V&cA#0$Ek}o0NWu zfd;5Zjy*AEL?ApKbV%HUy%afCBn3ImE&y>0b-%N_4XFF=2Ospyc=TTt?w`kpZOU^s z6?W@|yybz-w`=bBvcR;bm4)BARQ@^96~s5DuL%@Ayzl0W_bA$8{E->qpj~)dGLuV zbVCcOo1ns`QXPzSbx@SRaRBpSql7enN4dn>J3hrb(cHx=5fG;4Ms6S_{%9vALE;FW zSOqTiRAEz0rGK{e%3m^X+j-8in?pV?LedY=HIS$Baw{!?vpuo#DiS|+BOpk%9bUS^ z+WUR;e8|W=U{sbaL4g=>1WVd4@FmI$P{Rl(F*vM%>5`6A_g;Iowe5J}w6G{Z6PSd| zsJS%+`v6QfLG%^#c~)5D3`0t$5pNDf-!RBaqwl?VfmL@i`Rd-~-J9@esi&gI%BEjJ z5`QAgM>iqQhAUeM1k47Ne0v+0d>ULb19w%d+22}1C9jK<12Y`(;$S6g%;UMZQo84k5<3JX`7yAld@Z#Ws_ON!(O|*OVDmEACtk z{2j!Qe9y3Kzo9{WLnWKS*Q5emTnQA^`1fGgz6zg=bNi#i^0k*mvcXa$*sJfB)#>lQ z{Q9dWufHk<&9C3#kT2(U7*hrk5cmf)Q9c3nYk53#Ud07gb(b8G6-iN%hUN^r6>e~C z@7gUXV8yDMB6-fEjqunt&5M){$D~op6lxNjYK8z{MlS3IlM}Y2c7z0)Jjwt~-YZWh zW3g>Mg>1Tl9Q+>K;GNM=@rOPgy}GL&@zr#+&t~(rmrYtu-8Bcno9^h5LDbFLeHqwd za<4pn?d7`)*?4)b_X;5wD?aR1d^^D&p*jBk%QXG)wU>{_6=lrhhoiH5IcS1}0lds( zh_&o+C*_3hRt-7#{-&Y3Y5h$F&nk*-3otW0QbBvc5T-bjfki!_Q|O8my9B9?E)1q7 zEL5PFd28N#cNV5j+n$!g~72Y~x!hL#jaq9b-4w&u+1N^Sgc?uc{{zcSi;@5YtU8*lTE_e+4$Y&_W?lT!dcmzcXU`srBFaBl%&(+CVdbP)ZB48w^+ zhOa|0hfjV-#+HirL#%We@^oKL8acC=oDO7rbMMKo?<}q=%_ZmHsS*Bs0_z76ucyH zElT&u{yA(5vjAytc2Y%T!|L@S!{GfINS|5-#Z*JlXjlbn3h&p<^p!SUuUE+PIlLdg zaZ||#&g`03{hq$li5&_w%gM1k-$+(8jSJUy8VysVf1x=m?aA@IPiFjK^$v8g-l5VY zl6PR@`go{r#2@b0k>}!Y-?*;cKW`gb3<2r&YxD`BZMn-?tYAmO_SLhCpe!RwvWg-K zDZ2FNkT{Q=j51EPzIG5*)Mci5m9zCpBkGB=*1`8vMcbB@=(0HnkO0m zCZh&Pm;8AwR!-D(+WrpuaevtApcRzk#xu|C-0Ia|5uVxqOn243?&?*wYO=|y?NgfV z*11rfsa#(L)is)V*`r-r*=phP49{L77pcP;&5?wdiYWEODQ`ab3MAT3>&5{^9@2zw@HR z(Ti6{FS31qbZ>n8;+4^htt}mY^GAR5M@<)v>OT6#mC^i%(og!sy6@zhD?gMjUi!KE z@E5=MyPx3Ot3~-P3%IgUm2c@V7T7+x&O8-)6%H3yMG}WWgmxf^i0@#6nmLqUR|O>@ zE=9d=!6|$Jhg-UvA0dj*;cy)e_v_atIY-dZTW8s<0!A06_d7E8!{RQyV%8Adx~^V4 z8GDL|-DZ7%tA1Fv&ds^<_RYOJqieU`{$ySrAoZilhHZwJKWs!aghAj+1_TzdyiWr_ zt7Qd5wKZuU&yoA1R=yX(^eank`{e${ci}=`j1^sPp7*G zg;A77X9hw@+{d*#1GQjEckjOr`!mg0P*GIeS=-;x!zG6*XLXH)zW2tX&`HbvBQpw%J2$C2B8^b2pzp_<`DF zPT6Jlm=^OL5!%TlW z`J^o-^M$>AH2#FNIN+u5bk{JXTOI}wM%~zp4g?Y1o*Ga6cuA<(Lv;vil7v#NLK2p^ zi6@1aDHU?e^@5B{S+9ZcB&(zrr0*_Gi}Cp0VTpel`hPng9vyyv@wK7bwej?LrfXcb zy;#xqr4cEY#EhQ>NKL6gH(8#N`eQtDGONU8jFLy}{!%Bz*_(7>S#iQcX}?Y|&3-yR z+5cD;0Cf=f8h`rux!V8tk+}sLCa4lq>x@1GeGVOcRyEYW;TY zJ)X*ohvxE0isGJKl9VI)L+%H@d{$5dfXPdm!_%IDz2 zX*-vHV9Q29XqEF?v{4R1LrPpr>uZ}IuD$v>xSdX!h9#O+4uZKB45G$@;muRAP`h4RSXpKOFP6HwrxFhik9i z(lgRe^BA;{o0OV>W|#kksu`doKkP)RD2ysL`MQ`P!#> z>S$I~lBZeVWVnxr8kR+*A*NOZJ|STzWI|K7@J;Sq|7`7*pVccOe2P;kOi z%4b!xVh)GYeUwQRF%^TFCyt zH)|p8hAm&4hM{1Mu$G*e1;|i6&tT}-*gGRB_kdi#lov^dKN=}Mf=+3+dy+)G@=!AZ zNYY=1*&yW{GU#(T!Sni0(i!=5T#M1JAOI{T`{#c!%M_C8-zBN5vW4w`&Swsv|Le>l zc-ChxbNKbS8CW~BvFJUayrDQzmK2JXfsGbq9Oe`-`fTLNJn;%%^q@Nxh-C&_-zmZj zYCeqq3jZuhvMI>^%&_#A^M*e$i%MtS(6LLfNRTWK%`0%Mw1gSx@bLJwKtBy;c|(xf zS@vQnafo&c$9^}t<3zmu5Pe?Eu&qcOHbU!*@Ke2KZ4!s9K`Y*kv(_vy{I{1jL>NH5 zv&n{f$yG8V$mF)Op-XAQ@2fYMe$REi20uCbhu-J@#^>b!1Uvq>f&u+?GVyaCe-&&x zg@SVzfjv%_Sy{ZnnxM)*ls=VcY4Ls&U2aPvM^)wTP)V#j!5&a&ygS8#@hIJ`FSIDa zbZ#<{DtnzwOgx=T#8Fx$6RB-(1^@ZUL>Qnb{KFW>K~Jc!WK6OIL1ienoJ;sCrr4?r zEeRrhW|N81MLL<7cuh9Ye2AHo(cv^!O`5Qq}?bXa>dW{JBwjrS0O0|fZW zLc2?d>mfqb4!EKlIt9dagfBC)Ha#Lg2>9N`a)}#s{jX>)v58cfE(-&+BA19ctL(xA zSB8M)W08ocH8voS7Lo$VcLomBY+Lpq>dEW)n9Uht6zbw&ihH$|epTiG^4AigaRG;n+#Z7L{AT`98@3D{&|p3ta{R z{ttzB%&;C4BW|+n7fUB@Ffg6z#BHxvt#smSNS5=7k1rDkF&K<*UVz?!l-6{H@mUH~ zarwhy^3jxe`H`%ctcvnUEUxX9aHC4@GU|@9CcOR(qOpl}sz!WYO9`UVE1p+E`YT zT_)vE>53hYA4AxkcuMCxzKgfBN0Psl9effBdM{kx$4`#@R(gU;TkTo=wOl^jp#n-i{9#!vRI5^g z02$mfSSC~J!?Gl4 z!@nNQ#PaZQ616u#uQA^sADoRJiPLdmF`w$fr}4y!y&|E@RATXc5{vIW8oi+}Oa0=H z)pe0`d*jEL!{AdvZKB8z^0d@~>B2yrA}Vn!C8Z=4Z&+?n=Fg6QU!T

    ~`$JEf3?RFqUUs@ll9WKw?0qZzZ~@rft`D#wfwM#Fqx zN!yXulBZL@#D9f66wfGtE5%)0@G?av=yj=lUPbjQZNG-po&14p;9Cb$NJ?I_^_et5 zjBI$0=F?hTj=mV(!H`r)LART?(*jiq_NpnX+hk*?wc*%l4+3Qs>txLM;C` zl2N#B4j?^>3@Npq?(XBrI^C^}ZF#Esdc#KEM0wi!;f{yWtx%sf@GI%p3+L7w{%F;T z^lmU9ftQGI+Rf00l@#Kl+86%JKpQLmU_3(MY+teqzqUqrzMOYOu zHj5}n`pZVC!YeaSA9muQQ@IIJ3?&wFt&G8^Tb~G1u}sgdi`$3F#~?QK4BA0gk+W|} zNj)!9^$+miQA)j%xB0VKs%|+~`Q0c@5ma#z*Fl8@N>>73kh(=Hg#jd0oOVXB#Ow;o z{5ure|@Ar zIcG7)%62|;jQTCorXo^s`2(m{uQw{Ziel9Y3G`S+0uCQ|;(_lCkDwK~(HC%)lNX&V zugJ{JX5#sIP`J@SlvH4NZY6SKoNPF>K{@ttafg@)W4c|2++1iW59+1?qCJ4I@L0va z6M#0&a?Fw{tY@kWuc*9lQRSCr{iP~OX3w!uTltSoZRM=Aa=x-s3M(B~OdWX~?+Skk zpgsG+FRsje?k79qHtUcQ{Ua-+yfW}($GLLO$LC#T_Ic0D=<+#(Oj`&OQBp)7|HoT; zd1{>sUai>yg#cU~8M3#X0qp4L&v*rp+-h4wn zlyy25bI0R*fJHo%r5@@oMSqGJw}THThrP+^&gsLk#cp(J$?n>cjrMfsqr>S(raGnH z8Ma@x_m^f_g4yGmWoZK6LAJHKv%M|y>XauwVk4J*xVx>#=}1m4cfCYjUEuriqbDAD zRP42*ZAI42i3=>N3kv7m?|Ngdi}fLQil-)`+jO> zAmvIRV)>CK)R-hfG^ExsLeryHAW}oO(Ng!FYt5rr`cY;J+`u)gGhx4HLU5Bcth1d% zA|wJjRuM9OLJ`uvB*8+J>?fdeOeF;TRFnn*x~)PqN7Fn@sT;%asDh z*@~31nuk=#TScL&=EH!E1BrvIg8M~T7(0jfycMZ$KMV@DI{W?cKizh?RT{5DUXyZ5y7_C4Nd}l*AIK)6|0j?aodFGCM#A~GY3Twb6PD}|Mh1kf_f}z zY=CVSF036gZ_&X)Vuun`t4h5fVVPt1#3r#vq$IA16s?o6xXb$e`6UfdJkR%;0>@}v zXOB)M)8qVPf`s4xluxH>Wy50_ADv-)txodCzcyjBW@TepqgtC~3N;(D?i93Inai1{ zVoMd4HnoCwI9u8L%mz!uql;Go>tMp6IL=d+MHkgCJBaadJa@0PVRsA)PqW$o&$k_( zs}?ZQJ*_jRGKaayaT6v)h0Zd^P4Ef!vA(={c?YN1pjEkNm%M8FgsEdEhJx2`LHpjj zYIU~StMhD4o0fNno+djD{QzmhsND?J$+Z8-Mcnfgu9OCIRlrlXS-Av@@+@R%61Qm z6%IO&XYZ~g4KBJpA}bc4c)-#e3eO!J(@GLFQef1jK|!Vmx^=H8K~!at1{8%1LY=jVa895bv;&wnu@@<7AT+nTrZ4atpnp%5S9b zR&S+V?cL+;2~G9>z=h}wU14+bSi@%JLkx-&1GN9$t;b1ynv;d;L{dtp!lk$nz@BI5 ze+cc&lO+IIT$F==AFR?xanZ~C1ow$v(G)rcYv{M*`KF34NPp@v?%vX(&_lO5m%3u- z{lT$wP7?=31~gjrzWS3V78%{^3A{sxb9`c9FCs!}vggfkgD6PKdu2{}R>fYn`)KCi zCA@Yob9v>6x2GLSV*}TY=ex$g;d*bf&F$adLD67NO26E8G{`GoupVe(*jz!;jOFxNao}@VwIYU>9FLp)B zAZWU?or40z9EFabOn`K+6=)k%wZ+K0h13t`DDRW?Ve6Qb1!C${Ke@ejv}`eXNv=8f zTsgNx>-7TNoV!jqc)fU`D+-$8sZG|4%^E!6@LlO8X;ir~%=I3D~i)c8p$qO6S~6?lH(;(%HB6wU{|GOaFDfQ^nrzY7c-rFS8t zw%E}-Q%K9OaPjPrrDQ;!^-Enb^s^y*j$UmY6gnpJ@TZ?v=yb0yt`kxkPU!<;Bvj_3 zL}+Cpdy#}_Ng|Y8BPp!ve$lvYN9OD0Ro&d)iVQ!-e7P$u8Wqb;mX_Y_9TXbo#IkkF z)<4}JAt8ow_50Uu-eM(56(fI&=L~*FI6=W!yWj~1?g6Ax%DEykfSh1>F`>YmqX8L3 zVUm}yX#2&C;;C$qg!&zMBp;zR^-R_&d9`V?KN-3``L(X-Y3us*X8-hP>7ckV=b5cz zwY}q}drisHAaikf!4D8)2cH@)#04Rf;d+4ei^xAqxqOc`1xEJTJ<9^Y=Qu4-RGjND zA6Gony_4ybq|;O=KKRlMJnVd>D@OVde5zdX87UcYAgE*Pzct#3LpQoZNJr;5ER8hSbbs@ z--ydUzU9oOoAKopZC;@P!G)Jjrfe+A(lX51X|JfbUP1nFLs|AVSkA2ZMWX$*E7rCF z`=wv+3fo3@dy^OAhOHhHVMiiw!ZP| z9XH*pj}3F*DGO@u7#*1g#&c^HO zT`|&Y;}xK%QK9WmEeKiRl4=G()I_|#ZO5rn-|?K;#*3xeXNQIgRE`5VMpvkG#EC~$ zO^6+O6;)M`_1<`$*Aat4(9qDfzVT{8@Ck3csObwTp;S3oA^0IG3~}a&&k|JNkZmt`}vP zIR9@K?fT8Gi2CW!i0W$UpwKbr!2j^m3!Uz@$15_5V!?E%$pYAkVY6lqJ|xi16evX_nR7u5g}ey#({feAv#u>u+_1$-gpTvW8`i1~J769EQCdej8JVBsL@$ z%auyMfoxZwPDS8NQTNp05XL6KsZbN|z}UtUe5oWDhS zY->(XRA_^S7S4*2rxh)f3|GYpc8pWSc0n0npQ!R3+kguF&VIkw8nDj2hIW13K=0(+ zT`~6W4t=TB%VcMh2Su1U3;v_eT!eM6PhsH{RF#sx&!ldP?w@SV;N{T2!y-@Iw;K)ZNIJgQI<@&D42mps zlKXGAz0Y1u*FCOdTN1_r9_%S@<_X~?LSC7NxL1y7l}+w}Y(y^-9yYWlAJcC`^c@K| zU}AZ&6%5Xg22eP^+Z9uTisw4pIV5m|*{HTe|H-EtINj?Hb^B>SeI=qZf)?dzMgapl zfaovA;EZ+}_A9|AUuObj_4=b2zN-UbZfoQYrDcAvD?A1hO*UxtpkQI)R>AT=KfYjj z@>?W0b{@t#luuPSeX>u{3y>H1rV$g_b$t{ioXwEfKiIWhhIhR0ZeC93~g%ld~z} zpcgIOi>f$*OyT3~L=ib?0B=4tlaSF$BWxdv60PB03zR2@%^NIGSG2N&JV}EN%*4Fs zD}#sZlP-5f)u6n|W{n;cM}{1?b#+o@Hgs$}px#I+OF2x%OXRe~vfzzZM5}^A(W6m$ zJQ*JzA{~Ev(dc4La;p-p*fI|gO7f7d$f#L>cbyc4E1KU`FN8oe`!|ZN7vFwk_7wHb z`^^KqukMON!_dmmSGr=;IdTf|xM5NU_ac7=7caTZ+>zEk>ke=?N-7Du)SR>A09r)kt3Yb4P+oUzD zIXZ$ee1wyk1n}SxfC0`&EkDfN$`7dFa8rB6n)9JHd$D-)l~QYqIt;R;R5=t?mSzPB z0XuTeW6kyIgdw5mo0H%_*!IiuTJa!dN*AMBhp1<%HS6-VTd!c!b~c$}f48-ztjs9? z1dkF96aPS=OWW|Gp&R2MB`UG~UX-{`ZMKwMyES`?tu1BW?~2SpOIe?$4vHUhINbW? zYQy;HUch2xnZgPUH!6(Sq=y0gRZ-=(F;HdWje~p$M9^aagEhQ%lkUzhVAInAP382& zan!aw5 zNR5kqg_>y)yIkfROyAUUa$IOi*A1Ymp0|Sa>xDrfX!vq}w(TWMybl{KK|Ex}V~i}f zwr-(IT>*GT^gaJjE+XV*kQl6zILzF{kE>op1K7X@TJMK_ezVpUT!DKIfIY3QI2@!d zxUPwVg2WsG|GiHmNV*p%4=XJ80hBUE5b05tgvo@vgymwW%*Ki`yM8aRkaytv#p#w7 zm0TQrQ9sAa>9nDnh=kZ+OC@Ql!Z9>K!()2;WVorMheA~e?Jw0RfKV2o7A&wM} zcfmnYAn|Q{Q!C18$>o(S-xYOuC=`NI1;|3h{T3XMu8lTIzFs?-)9dnLJ0=9(p{Kyz zuBh7|5_Q8GKPc`DZ|=YU48~pe8YaakWeoP|q{92Apo+R}7BV=PDMv+8$#JjxJDhn8 z?|bzL@!DoXQZH%fd0a#l(e4Vav&SD?E1zUYq)FwhLLg4J9ckE_pB+wdGrzEQnagX> zMLyMX#VHdn4}8-k^%ob=#F2<{aYpI0U&m_G?AQD4kG_4gd4|Qe^_k>$FY zIVdp9d2au42S)dLg7XYZ3U4V~Bfu!r%4bhRp*Vm^5Eb>PeJ+rx8anMI21H1#hF$blwg0mNrWQbrPHiLwli>M4VLEnpJ zs8bl&NSH(5!Fhu`XGOtROg$%bX0)_2{I$cZJnzibyCVignmM-pN866H@!6?0t}OkM z7){TnC*|>0R;0j7oq+Q(Jt!5JHoGWHh#(`N+=7R13YOmQ1;@#HqYcz|_GS;Ur6tMh z3dKQemCkk!iWEbjd-#MSrF)6;%EZe9pzyE)PVy7D+-dByL}6o6RApHN1tZ;!DTPT# zIb}4DDJ{>;@pvkcethvo%I}Jd|J`hK)8#k}5*Z>WHt)s3e8kA=1)6_wcW9V^P*EH-MIo)dvCAK9- zn>qIIIHF_x$7&-2^?8aOQxKM7f7@p>6!}u;w1x%u0~%d}467pIE=|qH*tbt)*WX%n zoZ%iiaaXuZ&8BD*K>NbaF({TyD&${0!PnFTQmyt_er%_+*bQPQMwKWgkqf^fr|5|j zt`%1v7) z^2SmHP2v4_OM31?p~Zy`TJb~G^mufZ*zwPO=P%i+fQn&37YPe#fvZ}2!Rc8 zbBAQ(VC#f?BqSR@uY8JgagFE~9EodS!_|4Q*Ox&eCq5m!{-g2!z3J)U15OC}>G2_P ze|&VhFK!#+XA6;XsN2S?T|x4Hnr+bF{_r(YzbXl@8MIrMZn)U*=*JFyfUoB>D*1AoT4g(=4=X>f~b0uc`%Q?FkXjn zZ_pisBGGK#x31oMGM=7JOOE43I(f83_GFS22+tO1SRzJCheoJ~7t{%-7zJb$aXPR~ zdM#EA;zo#H zqxtNIam9-)A#Ix=5GT}IvLo2C1|-6hs^5E!3Xiq8)B^Eal5}RbL9iSmj{GQ}?YZ26 zC%YeZ1xO#_cUcuN6)Hq=2|_1sZ|LRGCuy0YN(H|FM~B(!1?(F$!(uD2U1S>E5=V}b z6gV4$9P)e?23fRj_3G}0K@n&2Ex#g%#MDcwz$Uj@Ah`?K9aL}H^QYgZq1t?BrPl~}J{3o2j|t3v-BO1-?+6_mMorEaq2+PK|A!bl1j9}^eu zLdQmzl?s`9#NqbLs}J5qMv(}(hQc(g(D;cl;QbOpuF zhXh5>)(#2PSD#&oU*hfNFy#7CB&~X8 za_$`G;)=bv`MKzNa=j~b2C1cN*y=$cWU?!tH4qBXcimw;rUEsx4hIVoQ?Ne4 zlu(ee(N4y!JLWN$4qX>rcW!pY)kW5wzO5bbvOyq-zk_RLf;b?X9@e1>Y4@z^l|M-^G~Z~oc~PF?yq(S9 zDzzVVh0Gx4QJe|{z+B-m1dN|VZpeN;#| z&2=B4QOD)E*6dpuiCe{gF?WhDYjmzahPW8QmXMJFGnZo z1Sgt<6P295=mw>*5r?6A$jS>0069C8k53S=C3un`a+AO<`Yjpcyf#`gzVYsxw{G86 zc<@X-i>k2!S**9a0_Dd;PS5AIZ%|~Iw87RZGdd!pd!=y5PEjZ3QRw8dMP<-2bO8QM zWBeQVyCAg*>mDlwIpwu0#rNiWv^pq@_SVAlhB}JA(>4Bs(37669TW}bRP#S>`&9vx zW^_6pxxV$NOedr9VKE&Ymj~EaP3n{q)Mtt&>XNTx7L|wN$%hBW_b$4Sq(u>kAvfDq zvUQLOi6BaTq$V|m=oR=yT=fbgG7uXrB$wYGpVlcR60kgxRX@=ds69XKimbmqWM%2! z;6cG`~p=Dm-6+f9ftc17$+2@Z$*lE=l{XMM-FY|J4MbA1vq5 zP3q<0{`k0L!jOlOx>f>8;_2eqsCTHjjZv?iC17FrM`RcS>f-tT0`aR*CWsw)8q zQdVp~s#+zj37k68>9!TZM&LXEXEP2^O(DJKWRxO!SrqiiM)mBH0ntj9r#@Kyt8GW? zkx+h)N9pnL8O$G6!(&!Cz@Cbgu7F`(@Nq3KatLQ)ByxFLSEODXw}%21gl?X)4|j7U zqp);?*M>{H6%}x;^URIX3Ov2@6$_msW^!-97joZIonYOppZ@N&*e0N_Ag z#{>D-?{!7?prieerVolhlgjvCKJyXSy?~09n?uDILW`mTk6jWzZwQuQn3E)d9Yv1a zr|=pUn`01w)eGo58xD_w8=Ipcj)I{*luh}5SH%52vzBg>MBU~i4T?l_eEjoIF%rke zhmRi9GFai!1Y=TUZ}2=tLoWrM;-rDic#f7E3IC)|wXJJ=V#~0>GI)7$WZ!BLz%RJ? zeb5z(gSLqM8$2k`%xQG%=Z~ZQFWt^S>t5}GjAUF10UEUva=A9zvT^QHR>!($BYT48 zK%Z0{>`jsRSp#zYu-AC3UgM&H@Yk)bz&hQ=8n<#LtbLF{0cUb9|MJsb*@W3ceos+* zwwUM3iW~|7P`k~c7keHAPavMaNb#kL!9jw_=@*GX%ywjhrR|l)$lT)rt@;5k3atG> zR|x)M8zH!+#Y19EHZCevvvr@kO&7PdvDUr1A^|@OXz@NGMNy(`*|NN4T9Sv-RQ0*l zxr``U&7KiC(r`GQZt7x3J3iO$>gld(R#i{4X?s_j-8eG9AbCLpSzr_F1wo7?SOm#t zv)LCxup1;ucJpErV3C)Bks$dO@*+S!&+m7Br%qkEZe25`EDOT0yQ|Lm-Jaj=`+T48 zb8nGtt)&vTftIXgbLJNNPyf8vH@Wc|su6zZjT0KOBo0C{YBYV|Vd$_pq+^eRTqbvo zC{803$d+g)UlYsqD-TJ5#W&s<^u;m?NoEnfSe zn8^ldy!>$IE0$m*S|2xR3mysWz-Biocsq*0R?JXn4l)=;Rk;AvUt za1k!!rtva_P|kL8XIW8IKds;b?2`(-niRA*ZBOnON_xV zKPSUE**Wnv*b(Bu#2Ux(nrqAV7a7EVX$)eHuOSU=^v{H`NWi`jVMWo%CnU%sK?^Bu zNp$OuB45y}BU*!l0kMwgX5oxzq7#95RuEW{qm)!l*+ssFW&2?*dox$hji-K%L5?JS z+1q)1G(0$O+=P&UAN5u@%RfLH!)oJY?e#AoZJaw1(xZfwW-hu31n^1E`Y7I$dBXRz zki0F+sF6E1zWtS!s#e)D+y~OK=BQR_tk)5t}zI{eZkZdGuzUN~ z_u1UYgDCvtOH%?B?Z_-`%LP6}H@5e- z@6(w3&3E4XUh_sgjGOoJ_fPY|u-R@xYqhqTD&VJtlN1)>|H7#J#am=b(V3?NjA>Q1Wre|+^!fn#&l-m57)#v zl&MTwN}V6Heh9>m7Fowyfx@d*dM$%6{-BMgjADI>tK=F-y|YHr=?@Ria@-=M+_Or#)J4*5eue&Lgp-)hfM~9hrOC?{9ixS;CGMuQSM}5L*>ToE)(d50O>2C^U_; zSn`jNY9(}+iIH*a$T#*fd!6~_{I2#Z`=~EF5RukAg#Yd$bLp+KDP5`!Ygv!Eux4gWSjFL5znX_R zWaqm7F74?I&+qp0hw)KPO2_-#`?=q=1Nkq^OvgJt$%d7cts6o9Z!EH_qjl_R{RXUM zREDIuaTMSpqgrAea!4f?0SO_cj`4_o4~a-q5{<=P1dT3FoTZM+WJsKU-kEPKlKW6> zWiyM=j~~CW%x%Cr#^M_9%IT)}uLE^;Z>U`4mpt`k2!LgHftvwJh9wt)2tBOFMui{; zPg-*6LE~tpTl#D74PY{&NpMPVh@|t-jY3Sgo|b&gd^~@3k@>9U0bZfTYuSsrNOc~$ zy)0f;Pz{VA>$aPSzkrKb0r?$73@Zua9Jr87^>S)i?8!jn!k{;^Pd76(4WTb*{jNoJ z((^96?CF49s{CzuAhvONM)Une#<7g1VUQ8pnt*PRC!78$9FkWBC=!PezC z%9y4pnbgUonvvkj6VYtkAHDQW zC++tJy<*t7`9Yc=eSG*Te?Iui;eYf$^XXUOFpX@KFgPTMG!w~;o5TpRrll#d8Nk%( zQX$5~q`Rw8*<1JWhxfNtWA3M?{XSFRK4}Vr`y}-Zah8l5%{pGRc#+kt1xBx0?X|4O zT+y;kZ+LaWp4h zHee|+aNk{53_Mw618ap6E?L{PhTdGH{&3SnKRE8GxWI6D(Ae+C8A&4MtRhP-9zM}7 zeo9VxU_e4m(*R`9hei}w1u^NipTPuQ%08mV@O77SMmYEK{nMkk-%LCE9DRn!FqO?~ z?T7d8+`6${Z8-uIt{DfDE;63A;$YUP`Z|{6nOoNTkIj-6uP7*f6Ff>zw01`D8cB2E zdb@g1`L zhE}?iC)9N-ve*T8_!T;OY#DObjWQ_~*-QTs+sn*mtYtdp3iasLA!l>zkPmCew^?{d z>A=Q@4mY=MJ8B}MLXdC}RGL#)an8+6UViJ6hMLx@)g{MLSqzL>phRmTAUXrep4I z8(*=qey6+X%Uf;-psX2(Ceb(dEL1w;439$)WiDA!{VW!J=*2*`8w3W(UheYtmD;+r z$?IBYksOiMCb&H%v3G=I3*_HCNqxbQ ziD6p`J{ED^xtPzdPxP$Ddjj`TDRK`N*}!`nuz^`MUCRK>P3y03`fywsz(%iHN$z{G zP3DA@f5@whjpT_qNE19@UIfj3sZ%pc&1y%SuZ~&D1}|3+7Fo+$=-`sIUCUw&^K0-J zEoSkWk)~GcW+AyT0u?PSdCamr#4_48GC5A3`O8^`T_qr$eV=-DvTtWi#g#LyA1yM2 zwRB0Bsp?ubVD3eaaMhSPp-woF8b#-bSmk9LOi@8>pToJLupv{xUWW~sSgaoi+GI%{ z`DlSHbIkA@->`6&J7!F*8WV@UOTfa%i_B#MtHy=3UCUz3mF5wy8dDatc-3eFw0MEv zZWeyZO~wvAw9kl4ib=Xh@-;#|m*W+CZiofV@h(lQ8cum{x#Ur!yT}YSuxiY%>N+;y zoA{QGHobFnG^)@LRG|T?(1?$F5I{HRW$8DJDy?soGX0hP>P{X4Wcm;RR#m+w)+N8EtBnxvS(3REJ+@V5%90kZ zGHrx0b302QH^4AgxswxI)@)7%d0aWhw1uL(c$ML6d~d~7X7=4&8b!l{JR_-f4nT^<_zT5EoM75um(~`vcE2T;A9w-CdYtH8EV? za5?209M7~{8Od_X$~SHv_lEbA{2+dKKkF35{q{!byQhl`=l(j|(@J$-%XrKUY2#j< zi;ZXTO5$3CEs3sM5Xao3+k(*A1Zmi|Ut~oPJMCbpJ5k%Kq*aw+{@;q~qld)XKTI$Bz_AA=t?DfE#(U143U)t*u z6f{5*XESK*2aAm0V4VeGy~?j;A?9YY@q|)?Q%GM~-q?uDUQTEkfgeQawO#fRugHL6 zNv4|zK=vdc@rkQm>O>l>nE%u(n{hurCb>mQveyo=ka_oh(cwI`xuBu*M`B0oRemiy zG907_n_g*V*wNy325x^CyCF(^p2y*|4So+Zo3w?N<5@_%qs2#sm$<=@ICbs~W@mmE zi#}C=xZ6O5;>!nuAPY0Em+BaAO~ZrQk}@Su0BmZ3{ucdW?q zVk;(ZZb7&a`H}D%N-Rm@yMY6!f;`Al7Ue@_TIss;^_?3#&9}>DXrWJ01+@4F%(fok z`oS89nBQMyNNb@et5kU{doig0{-#%(342+*(zH>h1g0l)HI|izD0D*dNm@th!&Foi zBhoJ~v(orvkC?mC_~V+N2ghkP;A)1P*@N@$zSg}dbw9;C#5&eoT>fB@P5f78ahap~ znK@yoi0P4p=XnBGBlYGt(e)JQgoTHYXdh!l8O$ zxsp5+f^{6C6q2TaACjpL`OT%S)qWreZ{`5E6N^#3uF3{_g)Bwqy~~S({Ix~Ku*_l< zCxH{-IcuhEwHS%|a3X7r8x+Xd+5%jT79+@nxI|F$wmd>a3DtsNm<1?Vw85^pqqb2Y zzDR<2`JPzI+Kl&L<7%$RSVME8RY-^A|qT223)GH>zGMo90`B4>Elti zhvKJb#ysqxD}3DfP$v)H$Q>UcVH;Lv-n3lFG8!U!6}MfdnWc7;IJuK2)>2+4l9U>+ z({h;L*YA|AYL2yPL%Z2e7TL~PC+tW~bXU4JNA_vPVi5o{=_?~ns?Y%9F% zy#XaltTe>-LSqhg*j~Vz2Fq3fnEUAu-{nNq2qwX;6A3sco#~%*6sF)8AE`ON( zw-y=Ie{GCv4ulJSlzQMsK-(#YNlQ{O6|8*`Q_{=YL7wE!Xle8lKhKMHjP52$g-BhC zi#Cu`j%TyCc)5?_3Y!||HuIjU~G zqioPPJLol_mgS9Zk2S7GzPMaSF9+nbAQ96+uXof)&J_m+Z4=OvG~ddH2VGG(IltC0 zo*DPDOQBnYQH(4Y-ASx78Jd8sA~x+Xh9~2qlIe?f-4ch!plzVM<(9&)zP;Owhr^f? zW7hATV2@4GigjyC-4^}{^jh9=a70V;-Y>~o03z)=w2PNp(Cu%Do z>qC&o0#aVMVlCYf+VJwjAEAEx>&e2@2C5>fX)RCE0?)FOlLrT22w#Z94de*wt8~z`(IQ{qUK2t z5B~7n6hn-l7v|hX*ju?@v^o2d^N4w!tC6US=okW@K~1!NlNk zWCFJ%i(F1PZASi{I4M|jRf#j-GPm3pvQ9p1zE2VZc4E^;i+e9hXsifG3(4sY#zq45 zuw8gg>Jn|2#%!ayjpNVHE$h|%C>N`Y`{zpHY>-1N%;dK`J53cRZfd{^YXxm?lqtH! ztVxLe0lJY;CP~PmmnSY^IAsl%dh6VJJ+q&aHnMNZj)S;BTNKiDh=!NP>IUe9{o2&R z#!u+Cg>I=@Up+bZ{m&VGgek!Va*Z+~qn%774U-Uq^^s|b!lDRJZ^p}JMzr?q+%jIM z`_N1|ULMgBoJleFK#_A0_yT!a(_`I1wv_62N+I*1bY%^6I0z7DvS{NA|mR`aD zQTl^aPYi}kQJ)$x)|UwFL?anZRI6;j;zy3T=Yl+}vuSy~$991Zj(uxGHSsTjrMgTv=|_wA|*_ z7`d$68T>HL>;*g^L?#l?$q1K$_3jpBX|-qPmhrL%SQI9qF$gnEMb7%|@^(rP6>Re3 zk!9F!7Ga8~Itjg40*X}AX1!!qsrlh&)iLGpL;asWQ2#mjzYqQ&bvXEY92)K%{(bfD zKTwAaCkYrY&LqrEiAUu;5KEOD$WU>bWGI?4{Y%MzFLm>f<5q@p8$-eQB?`#Ojwjv; zZ7V^00|wN8%zOX%@K5FKFL1ns;*@rZPR`{1Pvmc3xZUCYhT4PN&T1e2XY%25uixn< zz3lvrj}QMLzu!6h&*iVb;y{LC$s@VPp6y<@+t+QU6_Tn#gu?y{^NltkwRj%)9P7Gg zU$?@RO;X%yv%Qk`xC88qb2gIsQl>RakXPlcfA)7@-#U3iy**biZ%{}= z5m}?xRbRiO-invvR#!;YpmA@ikMHFtIPxWZ@b39wm>)N;-nsSWz1`P%(rFoX&L?wlEq#lGYGd{l{Z!{xyL=?tRO#^e;GF7E^%a_f7cqo zxFlSYH^5-R)Vg;9T8(YmQ4W|?jf8UyX=#4^PJTMZPgVSk@OF6?yC2H&U5%2M z60PXwXZ&4TC|$rHs~5>f`3IeWvKv*`vksED_4%?NtG8zqLcAi-i|!EmcZl@9+*(ZQ z&B)%71>v+WoI2irgyqx*Ai-*msoJ=O%GtZLV@5?Ps~+KdVncm3muR$}0y0Lm39aA9 zNF2$Tx{;kCl_`^;sv+~pR821udd@Yv@$i&)F`l*h9p@k{v{43yX&~mr;67w(gFK0O z40~C8-cWtb2T7b9oi`--kp`%xW$LN8ahB%~^oQNvS*vlo^B_O#3^2N>@2W+`jOxrX z2K3&U)J_+skbj1IC}Wsnh(wfXQ_GJAd{JtQ(aD(Y_0E*>%A~p0$nm-IXEUO-p&y^= zm&%t1L|Kd$i8ZF|?OwS`P0rgLH5rf0#|&<9q!tKDjZf&(4?3*WEYH<97$B*V8l+ZZ zhg%v;du1TUjE0&!Cnqf9GUtxt6ILblkeG_BP=nKgWwRrrndLlwBf8(x8ZuVm`yh|fd9%w#av(pl&~@4M{##!A(XWmV=Nf6?Q3!W{4ad>kH=r2JLHNstQ)lF<3rW_XQgel8GQre4+d<$NBs?7QTRl(Up~Y(r($c_kNmF06Wud<~y06RO6mei$q%c z(v``=KKgum!aZ3XwW@8S_Q0o)Sc+L@?_wLKGv--T{=vx+N0O~_M7CzUeXI8R=Xm}8 zY4z?OfBey>^6tm+s0W_Y2O+T~)udnMWNFTgws+m)=;(ffe{naA9(vv^j%AO2^c3^u zy!M4>3@W4E`SQ+=)v#MuKy=^pi)$CS(leg5~@j3GjswhY0!CtSdWz)QBsan=v`FZoo3>Ij=ljPZ( zU_q+o*H?PySj%e#ybLu)_W1ifb;4xAl&}8^DXT1qK5>&|gWShrw?GR4OxXvVfbT>bK```fac9yQ*QW0HCoAmxvy(42SHvI#N+Hyf_C|sxd8EqVC<)q; zr+#7MVsvn8{1UfPb`*89eOi@P?oQM1J&g~4McrW)@cw0fymR<#>feb?q<%Gwd?HS& zjZ2A*KK0$*ckfK3uoDo?f|3OS!%#EcKwlp8)dV$J$B%O_4dG-=c<81tqGf49wx>~7 zRpnIEo|iJ2*D{!2=g&Vq)ba)KQupX4Pkir*MNXBs%$%4tW#g01)iS4a;H|;&F{xYr`*OaH3vSm zXfSp+GzY4|P|aFnEZPzQSf3BizLoc8EIe(Z;@Xjq69ea;_yBFvX678*13a2p5=Mo) z+>}rSs_~dVC0_VJo;2>22iCP0qbC;)L={A_sadg~_w@8$YcTK&)d%Cr-M8;fOpGXi zk(T4mB6$-o+>~uUatf!JW?AM21TWYzaPJapQ`<6hwU_E^(}$gtvH7u?ad>LcIBa}E z3=U|A9)oE|`14#9)J32|(F0r#G0B_pI<)b26Tv1Thd5udA`Ak&OMd0Et3Nz;y_E1EuFln>5*`?KmxdDQ~fC(ReB z-I}-_@pHD(#)`7cLarhsOgt?hPr2p$M~}`e;rY>hsJz%i8YgV6jRUCgIV;7I`6-cb z84gSVlmayHjbE|;@Z3_KIZ>#l=_Z#riom6tIL&Yn%{?4JvgBmsDa#2NNRj_4n^8SE z_x&&GJ79AFX?EnJ^hv0{)cHMmeWxGdoyY~ zPB}W@JT)bV}h%=0V@P3|LBMYpAMiu01X3g;w=C?25C?l*3fHR4;hOr2g+V0TY!n3{LGOdNF(t18W##s9)HrAvn+n`&lbTbfzD zv~hK3`^IaHf$~DN8hZ!1D6|8NYS0=;RKK`HiA@C>d!S*s$MU00oKT4D@XjR1N!4mx z8FdNXgY*cO@1U$s37ww_?u=7|bmK=n7Z-FtPb*+vh4qMUL;52-)fWI>P{OYY5}s&ixpo(4;o zOqN>km@*c@wEH;KK$F0y^>)A?1}C^PaNAwE^485eH}7rVZoGT%#?5=Xje9q5Z|~i@ z^HyW;-NxSAw{{z1%GVjGG1nOAC2uQV(@7+*3hzKqd>o=FhYzLDZYll%<$(_c($ZfL zCkS*~ZMOVLx|}!ZBZCZ|?f`78*CjS~k#-GQU#oWz}#!&^doHUFZHw@^#hl`D=e^`bBT z*-!qq_M(cnRlBnU2Gs6VYEb&~Z~)WK+Cz%hnr^|7r;Iz({@J+kFz!RE0>>%p&Mn+; z#PJNZJ5r{i%rS9hiv1iB7%a|0dXrWuZ#}C9j_*O`MONj~lzc!}yDcsk>K@zZpE5Fd zOO$6z{3haM#%)Ju(YN?QYYT`B8@}fO&Ka4L1H4K{vRE{Rcwf7E>dGQa1E^fQFP`~f zLr*E~+oNOXrK&9HT3{>I4()P1hS%N0)hvB9`j%eO)WV_HLRCA(7>8=wl~K-Ul-H6u zaMAcQvL4M+4y3{06sMQCXOB8@IW?3wp1)*}9|UCAV}e0xA9vY8ewR1s=9UX7RqC85 zj}z;&ID}<2WVm^U6j3usSqM~%jnPu+9hsNal&Wp3dpYQ=eDWSP+-!{9nB(z%6vuiG zlNoFcwxEq4N+{3!rHkq*?V@^W!bK$~yx14Xl1P$m6c91+$rMc+VpHgl4T0pO<<9yU zVcCm|N*7w>!`9&8{+5l}*vSXYi$1^Do8@w* z@LQ1^xfZ966}(x?b>)TLtgp&p>Y^Rp?9qeA=I8?3OHpl0qR=APB+8J3h$9D3J>}q- zLXl0lW+T3ZtgIipPCG$bf;bZkKD?C@XjlWuKVgn8YwiqEz-uQz8*Fj1hbPznaKF}+ zXF4nyl@IC)J}7k>MSg7LT$tf0yE?bXY-UlD4zJmTO?kLpQJd7nx=^d#gd6L{yFwpG z8@u{eSaZ1jIXJPtHou$1PxcqvixtGouPAA@+X*~I3%O0)S5Y%3NDgSkYo~VIhkLOX z%T1s^Dhb9A^xm@wa){azz=R4kyx9Z@)2Z3SJTKN4Csyqnqfz)dby`i|Q1SeS5IM#W z%V{Xz<91G>aI}nULMWia6IDhWQ8Nz%q9*{|G6_1FKrE*U^GIPPg>3}NUk)Nz&Yktn z+{rs*S>5XQ&ITfr_gk8r}Rv6rcPO~)!mtNc8-~tP)!Tr|C zmSzT5dnDB8&hWa_hjy0JIR^BN!N-Z?2tX7;GQs;qUW>e^Xuc(p?JhTg8QyXN&!|Oh zU@!7QuQ0L;J#cqc?o2gpr6)HywDj90=dGHYYGlXUIMZ|Xhwt2;n6sq0wo*$3@iUNU zFNCp<2oK&5R^`Ga+vtN$^jD zH#<>aqZdZMsbH%#B1|uUEr7rY!JYxIUCxC{fwcOuSx~sF_ll?TJa2{p39?$fpMj8^ zkRaaTbYWncNk(89Vyk{eKw@aw#&J}Ccy1|Q)CXlk0fkYH7s4>gO`&c|#z_=f@b^ll z6|!MBBa0(h1oy9Ohj`dRf{$$uhQ16-4r_k-vb;E@?vtjq(a|qjxMU-x~@v zRnVb;Kerhdi8;A?_r{IecoV{Z$=19ji`Mn6Eu@QD!l6@WwQ@8mut3I=X9ioNvQ>=A zr}yAC5IxWbn=btlzepHi+!6pR?|=K?{TA5JghN7;DImJ~*PZrt$7ylVbz}jr!dGT~ zBjg*()_)o3i$EHHnI@=k-j9!(XL)j>sE*1B@qa!2#1ro-)L%fJTjtx1xAeCg$J{v; zkgCEP4)UWDg~Qg+Nd?#n;-z)+LCxb2PU3R`;LoqWc;&?_&E_qQ!Ji8p*E^B+o{ED3 zAWZPCv!eI_XX!@TSjJXWyi1uh-K%&+k#1FXs?Rm9Jo)AUFv=es#^HiFk}XOzq;v&`gmWBisrm`%OY?X3hvL)hzf=zeJSAP z4*P_pNC<=JK3?2cj{}JTA*UQ|MIw?ep=IBs2b#_AXq_?TOJXdAvn22^ZYpS>V?i`! zs|bw&t*jZ0@^oqJ6{tXpCI;oy*vG@uBQa|QpJF1q(Cuzld&6SzY16~nnev<19K(g% zi;61VqI3?CG-BG)6I71rE3H&P8RKK4(OdO_j=X{9jNw$KpPUkc0{vM#9kSkag16un z1H^V{chc)UC~NpOu_G#egyEl_5%}+P@Q*TiVPPKRvBXIYcnhPPcOP~LW>Rs;M?l0~ zGse<8EJte18ch#11*`ZJN|dijd-*X@7&(nT6fl>Hf_$^!Raz)m0GPh?q4Gj7LrOS( zykm$&5+W!dv|#rtJWnPs3K21;AW;(OIe}c&OC*xaxVLmq5)x3K{bHqrp2$3ul8)6H z(L2GtLoJmx4NgUhp>#s3ZjmpZ_4-HIXhpcC5HqGVt-=K$QDoZRP`5A~BxxV5mx+;> zWv15|1cI|b<7?gi&Bhs%L;NRZAih~2BAki}-zvL3K2nU?{EQ`PaL_sVrYt$kYw8Z~{VFtrLj->wiO@~Gj@$48c*;<%GUBg;G@g=6$e#nRw-CD5p$ z$wR3l0RTj)8alXaxXe5h@zdHU8;Vgmg34D3Yk33#3s(|0nfP?4mzA7-;yRwO>_~!0 zYDoA}0W}pEI~AKi0(;xD+flRaaU1edRBn(92%EkaB#;l$aKXhk>XR8!M^_`_$&s0f zfEgW+1;KBVJ=O{W!s&gvbosFJ0}I8F(QBq017EoD?#=1bW$lS)%VV<%UnrLcb-o7l zm2F5)RT3^%9kAtKKR=A;X(C+S+pTve(v`>T00h_QIEm+xp>($R$E#IlhWEo3?F<}~ zwQsHBS^Bgt%MVAqh2WP>uHBaB$ zx@+I4)$v*39&ywuKYx;8sD1kB@{BNMgU@Ok95ce{fUVE*CN95G)Af*sKuyXg3M?;U zE-u7Pr!OnO&rT^|Sp@^Uy*G`Lcor$*;L{Px2AvGXEp)O3)~yA=={jD70ZySL7nU|1 za`DWqw_xD_j_OE@Gw z&R-!Ez(^s&t|)`$F$jNvG*ZmGY@$=t4nl@0lzcSmR(Ro?=0XKe6}=9eJq;8D;<$%O z+XP=h)4_8=B_fi1=7mcTl#gdNGNicjxw-HD%y|5?DTN#+D4e0p>ZFomM>JTXG)8sR zjRF*X5YQ31Z`G!$H_R>XMGl>V;ZdGIFdHeYum!?vDeJh7)3in2Z{nxbHE za#6Umz4P50+!nthvK?^j(g$#rxPNmwlC!oDk6?D9`~dk$u2jNASzApNTw*|{!TVIvTEq)4q7A)FsVaMK68nQH-kB%!wa z0^=}0Aw-`)${nbmANL+|{h}2abUyAXrjy{twi+;bpvac2Da99+ORqf0z9O`#u7VFZ zoMc?Uq?YQ??^_5TeQ?%GTLHT5Dodm9dsam)ayTJh}W6owuQ|pL}4h1`56zX!5yA) zHAC)8sXtWckGVc8EcaYwK>C0RCrX<{x=Q`3yWsd(&@Z9tp2*D)#P1+k3Zm2Cu2!f)hI;waLX5h;z`e8@qRR zcQpk}jqcU&2!Pe(c*2`>ZJIZj4{)ZDQz;R^76@JAYWG{N<$bf^*rDPF%4iQ>lfrIb zbD(it(9_W;be>}CHozVcCxdjjk15k9{0qg-NT*iHX^kTZ8z+JkaPUJw3~t8?qdBE3 zjZO|^Kau&k#;y1mAq2pn4|yBo$oMiVgaN0pA<6ruX`nh`P%sO7QtS<8Q`{A;by+f2UcAT965(*?~>2cIoF-~m|S$5;+sf>)~@tZ zx8pBY7(eilI`$~w)2tk$d-b?t#9(jy=u#V~lEp1s9BZ&RIG7v2@(*PB6J>infB1#v zrO?L%C7&suj}}d}of=6kIm5JSL-wdasu@BPzi#eQ;(IfTpD0(Ty8Q*9=Y3vTCE8v6 z`v*v|2r6vu_Sff}&EFV#i56JU#YmCO`V%_vu+e0dm{x$fI72kZ$^s-9iYT(xM4Wxi$|zJL9jWSF(jnGAqS?H$%!rJS`3@KNCWZ| zq?Qrlod3F67y61H@?6$G-EVR_Ge8BPbzCGqL5@*d;1F~!iNPf9*CO#`NMtL~4CQID z_Uzm;DqY@E&TG?(zR#8?Y10HU?veG<#_{73wd|!#;82vI{RI5TO+);O=6XJQbZ!f- zbnqQ=DZsyK3K5omi1Jo5h(u8$=O<7jcu(Yq3}N`gbK#t-PSs;i&n@TkN8IlO73foz z_I6hVI&C{~VmOcmLcXA4#H>acu$2`c9ZX6EBuvdQe)enTmi#;@p1Rspp3_iR+IX~S|jsdmXV3)=aFF`7qEL~-nzA*m$+_GMh@76#w(=;Io7Zy~q1h)-K6#?8x z&ZC2XyfeET%T-}8)#+EvE%EdE7T#3qYYIpZl{me8f#L?9o6v(Sh;%4lWe$CvHzc3RFG-YS(-0cF*@JKY+$-O}CF0}CoWA}WQs-!9dyP78#y=YeH zj}+eZErbHtw3@jq>xhf+IO`Zq5DhQ{M)I~uy<8@K{>9z2Hyk#055SWuM%u4ck@5!L zZ5<<8C-Qp}5O3vN3AhDaZ`&;{vSC1-Y7nnn;0TrXuY2w5R@Aakofl%c>glhEt|Ln} zclrE?n0e6*)61JmzuHXBn_3`I0ku#3!V^!ttwBDCX;#Z1KoW!jv~Bwh+p?}9!dB|s zUTc7cw~1CP@ijuTyN&Ojc5}J&2cURm;Hzd{>4;dMTBRsVxHUH*gLNo=G@+q|y zfC-=!9J#9i$ts#!h$=c}Ak;-bfoFdf=iA{7}Kg6hkP z_awoTW^BuF%9nRV$W1!nopR6@qgJ`Ok}ZK+0X7e|gvvB90G71URN}rMTl@pcdLMV+ z$p`nl=-s9dE=ISU0HR0Bwms$AS^?c!uCp#gx4s6!48o(fT@!gP$Wz|9Cms0axso$@ ze85tK@&{RxBYfFp+DI*AbQ~07l7vl?)T5{p5l>0nB!OHZ@gW|&DG9zDt~)u0v3gk7 zV+59#(FL`QbbTR4c*)o1mzizNDr**H zAkaRpT8*ZVpD)a8SM7-jZonrhV)8c^bd=yle*rL=3h9_4*TgQtI1UG>3}U(<9UO-7 z6yOAxgRwGPZ^Cau3w4uv`N#NOX?5Iar%@8{*&`c&f5ywJY=nN*8Hc~rTO+qEZ zA|soJPh9yV`ZIkBDhu04gyeFEz~#V~D%5J`iZg2^y09Cjgeeoco)VJD9LwM@6F4FNzNQxe*<&(5^<7of)m1GcXV?} zXW#|^2tH}~@)VUA5CoU>=F5$&G(^qYb>bvf7}teylIzadl>;STsNb~>DndfR2p30! zHYHRn5-1?k;KZ&FItwH*IgmIN>@@!TEHI>k#?jm49%Kq38y3Vvw9s)aF(1k4jozkY zPb7DlLvpn+tFSHe;M})=2C$9`zkv!&G4PYQ=7uEuQ_-0qpMYrqcQ#Dru&{uBE7W!B z4Rgzzl%3RI)}zv`d~q!2xM>`u!!#4E-@+H9JmLyNzEEK$CXg)C6tbm(lqX*>t8I@a zG}Cv(f;3*h&{58|nuTNrb0Gn8C(Tit2-$HliW*+^OG=NcS(3S%Dr87h`bvW0#UCrm z;?r*uume0S*}gvdl?t>HIH3h-Jp@Xb4Ok)f?ul}v1uG`iTs=wuCCZZ}wQj1h3P<~H z430*~oUJluw*^p>Ua~{^-9b`sSF5>^4qa0tN%Mt+58hxSRvEhL(A>3#d`&ds6uC{( zegUd!AZ8m%+quM^-M~4dLRe{-d_1S~LF+=_Y6WdcDC1a)WT|4aN!gkg-!@MQ5=tU7 zyc9<g0zS5Hgjp@FA0 z{UD?gVh0F`gH%kyR7dN38}-G100l+$9$Zi&P+1nl$P_`96mzMh z_)?Lnz^Z(avKR(Q{wP0FB?2fE?NujnmBY!nCC?aqz<7 zRWDR(g2+yg@rvLKkyfm7i0MJOcsOTbZx};*Y4rmI<18MVY&5B%sJN5`9gX z#putN+*k`6NP*J4$+k&#Wn$t!l>QePLVRCMl|oKJ(1kKBW{SNj8nQ5U)xx4$&L`Dh zb)yK-XvlM=lp_y|$;vy4fx(!kRvg|lZ&=FL>E_XU1ZwM~lcM}UIC%Pi{AozCRyCCd z&3WMk-5~A8c@EAEM;X)A{y!+cB>(CR;CG9LrW#)qO!IwlZ)oqQbedMJl*(b+5(KF& zoIxhQUAXEJ7q2au4pRnFvb;LoLkViH%maJMbvV$E_wtviT#UOXvIUL>JoRXQal>Vzn~Tu z7f%YBeJIr$m#W=GsM9Ko zpt3t06w2eoIwMt9Sc#06Jfg;yZ3GWy6Bc4H=)Z)H0@KyI40VonW%7eyM^LhJ*zk z2sc4b06~(}d+s7gmGx4@RlCCpr`fX;PBT2fa0$qe9gxl$UpP6?L3Bm5JSh;rb22nW z%H!W>Qx0$9Gdm~`ZzlE77Pp=> ziMjNXT_GVR!3#q41xX2BgULT(zN{*>+0-qihQ5YjG;DTRx@zs1_G1MSU**>6m^1uX zBf8z>t!OLTnpMsOXA++ zwiMvBoNw&A7th&|tD;&lH{lnX=oJsnr1FbJtJTCfO)l#b3m_j^=&F%i7K9O@P@;;N zyAEOmhbt&I%-pB5PuV(n^7#GhyOkTU1zt5w^^zN;}l3uIUR~eoPno!oIiK1lfciY;sVI zlXK0vdI=vG2VGQiL~6k!uEFz=CP>nh44HP$-G!S&A!zkdBWk>xYx%&IAJ2t8uyy9> z%Kk6oTGHN|P5Y!iHR7p5S0n%>fTvDOCsU5iGITRUGLS8C0xP!y%dq3sQ?vXtl_%}F z(M?lVT(l|djJOQWQo^AoU2Ygt7Dd|dT_|ITIyU$KKgG|Q}1w=+pvhn4% z#7Ds0mq;YSktFP;-Ok8bVQ9EB-Z87^9*w`wO&vRS5p3b?Cf;AnHOh0?@uZ0I$%E&5 zHmZu(g`O@ z34{_q=dst(2?U4x)~jZdkucK~cU3o4A;aLKl0yw06_vL_VV5Y@Dg5MBbWh2=HT>4A z_Y>&y4_7b~+Uo*P_dpDB zT_NiLU`t&JaR;KRiq0d*v*?oa_xV-*9PbnC^$=&1$e|e5VZR3fSw2_j;sGuWsSGkC zyIQird{cv_!W}Rw9ReO6o+57{Vt^wj3au0sRIn+fMoVi{CNb$JUMvb0QW#CpF(Krc zs(N{{v&A~-9Gy^3ylP6w)x_rrfI8Xx%4Z{g#6yL%{uDJ0OEQNM1V)|CshG%2@Mrms zk*ttEj{s#E;mS8CU#kUw>v3vmor4jCx~r1uHLl*d_2#|Z*MNvSh(%Tv$5~<8D$Rx- zA$}_5B-EWQUnqYStY728#wf-smYsKz)krIk?-6u-t#hRdbX2QSxl+Pd=k7E99W2hJPY z%73lPyg@@>-{Ox~%z}mAdggk807_rU!%(Kk%9NgaRcR3{HoeKu+D$8-0!he5RkS0w z3zGk^*QuNdDB7ruYDzVR?o;kZnRKdESSM3TgoTU|NHQ^*QMe^!fkLDQ(cuHVIw5&V zg0{SeO0b&1%Ar@fK4R@a77qvufN(n)R(XS3b0|kS0>%3`*7LYyFf|OOi$`MA`Lb-Q z@5x8`2NLzm52{AWfmOFAlK)BL#hKmjo$enu)p7GE4M60J_98~!O?bN~Lh{v|_ z(2J*Adr+%yk9D8eWSLD+!jR6yp{iVdy23)y&;imouF18e#w|Y@@I|R9Qp?)GsB)d5 zRXt>8Gw@ixtbL~MD1zvok<&>MU$Ux7=d0N|vhg3VzOXEl4s^o6Z{dtWU8fl7Era?D&?!u10q>g^~~T@j&Cyb@)pxY)J9jE!LDdTvb-N1O;4PivA)#v zLrrdxeyaAu+APG5%N3PFfs&Z6eARl_klO2|i%D=y%1#k};>AnPW9ifzCep<^hKRMx-1pda=6~kNhh3pz5!x0ta2uUGjCb93Qv1fz`zcj>GEPhEj zr#8D#y$<9@&ZJ!~gG!?LSL^3TbdcmbvfGs3QR+uCawg)Z{O3Zi+cBqMneQzrt_Ov) zf374PIKHuBY%wUu`F*9-yfykpBD~T5Me%#0mT}z?s+DJh=C9)NT&{mEba{TZJV96X z@z}hZxu2t~5a88ta&$WLj68oXxAy`TGs+Pp*Wzj&qTOgYB()%bAB|0$6c?mGL>DS3 zYCexon0NEVl+@SEA+>Z5YW1AqnH+~hNA{vDN=1+NbLB0=wzkIJJ0{P>H4F0CKD<&9 z)I~n|Q~8)q?xgGSmvLm9o23<8_Z-5OzhPM-xID)b`4ltdy!M504W^fOcB}@vQ9^&< zm@`0Xcl53aKjllM*~t?B9k@4jO{hNyF{N?;@Wd#nxvqU>0!aO9SqL712=?O>BA@bA z`baw@7JAqo+;mg{a7ibUHYg#2){Tk)+3R|s=*7NDT$Mo{6|l`?2dxMju~EWm`PK88 z-iWyov0pQadA`cm_E=rzxG6TrO1-1bQOaj2L8(hjkVk-n9Sg1*pV~}_ zI4%5UJB}>^u?WnNc#?~p6Jz~LX_s&}tX^ zxUOOLr5%*`W57GOr|L}m{rCum{)~)rD-6Rzuitn^xrwbxc~BSGeKicKL2Hcy42SwC zJo{GOQyC>DMC6DlMWl#KZOjKeCms-c=CaHb8RA!QL_88ADNBt61uiiSUibk#=6kuO z(0qLObrz8XZbKkuo@@F$-VSr`6yxYl^!4ycdEle=%U(=%IiTe3jr|X%j$AkCYS<& zNWfX)xXT@Dq;p$BX%&X0kZwFLb;0*(w;B$YAKkt2nvT;EA4(Z>)OeqeC6FOWQHBh; zgy{eqO6?n05t)fzYoSq1utNpn;xPecJOW(+>`^szZXFvJdJfl9HV6;!lKp}>NA6Id=WXXfv-VB`_Mth9vdX%||n;7A`iqXzU zH)W_N8SSQf7BbpDIyRfb>4}6bw9YyY@cv|-Sl#I5H!>S^VuJit8Xw>yoHtu3XVtCU zJU+VLEACU+eG%Vp4Ib`q*+Ki{gXXM{E&`KCj!BA4w-rW2XtQyy!k=HN%Ps_yzAi?h zA~lHyB+^OdRbxj&A^GL%kHjkWdh*wt+!>EaX&eQp7^!h`H4(uIMvtCg;%7cvp-ry$ z1WK;kb{xX7BQ*KQ3-2KuhFGp2pjd-yO`W6r34@s`K`2={T9YePjY!`d(~@VM@=*hOblK{aiyv^+OBE!o7*>+>A?gn~(*D&}sUG2e8Lc zry1H=)@+l386jcE3Vk?IGp}+p3fst~db#uAa$wRpwz14ox(Vj{M9;{{a9j~;_S!L` zNmq+)B^h){_Irr;$#OD)D|SPGtBf1F9}&Y6lAGUX`9iIX>>LF>k_0=w%#$2n0#8@;Wuj_} z(6S+xOIk-C4l|ndE+YM?2FuhdER6@L2Y(Sk|O8PBt62y?ql z783NcGf;5=afGKhR5fib!?qv$o*jTOC`_XE?A#W7x_h1)xk6J+9)ajah%u?06P^{} zMC72~q--wQPFh5%;mMCbKDVT&1SK&=6mB8O908PlB6z$6GlwtWaTN5)9F@9+NE6JV zT2ekY>)o>etJ!dsEz_zDZCs1qu}ulo2f z{Fgj%O^^kGkcEk@IzKNuWY6OZ3R)8qQQO#3`s<=riJ%T2e`%kQhE-oGtL=})>dbJD|hLf|241rQ5X%*D4{ zcU%Zi{o?n@_a$J|j%L?GB@|TZv4K%B**kJFOSq(yg2xoL$)Q0PL^fU-WCqEKVufB} zx6>S{P77)m8l5SEopz8q}SqU{6_{h>2jGQE3{9a>%zjWEyWB43Cd~tCM{z zC4E#ViPFMsLa0Z69kkY?xXJ3%4$uRFJ5lF-&4bpyJj?2C2rxatoO^b>Oa9&8 ze^spO)$5H{p#+}q_qrmImG+>=!`daO37`D#@BVJpagDO)etfMl{zvIO^GDUA^39ol zl#VywRD)5y^T$8_!=GC+8H%3~3Bl#K*NzBAY_a#W1+%CV3!Zv=@15Hd%mRsAV0br8Xc`!Z5oIqB&6!Dm;@tCTFII|@U)e7epBc8!PYzRiF721qvaOA zfOLbk@_$>MG{|k~wW2nj)d?ct4Ak6r9FhfwS<^?B8=fU_YC?Q3sWjt=du1At7jbGR zrVAq=SiYx*Vm1{`m#x!Ot}qoAf@@VqBRK}lJTD0tZ6x}(9@^@t2hVcB8Be%$zoia& z13Bd_?tf&t9j>C$b+Zx%(9hn_X_RS!) zGTgzgJ52@TOgT|lKwfIY!<ChNmD!dWMMEWB-gN7uD&ugF1_CVQQqYCG(2cMI6nHuB($vSwet8py@)CJ z$d)o1F+Dbqok5tH-Ok{Vq+v=jQn)m&Sket71a`38L4%H+I4Auti8~E&^nC5%S%9g4 zqYAj@mfJ;;2|%(G|A*Y01Cnz^ZR46Jj~b?fk3U2)ya2}_i>Fax89h3;gy+#6=;jCU z0nh0&TtZOd#7kKJ6V`CNljz8B*|9>X^nQYh9+w>rfYl$KTgo$94WcT7gbaZzUe8!k zs^(rnMjUnx&PquR43k>2*C>pwdUEdjKQ$OZ)@fqnMTnYkvGAkX{1e%Uq%FWD6Oxq0 z%Glb~yVX;3-}`BG?lH)o?w>G2_%i_xM-r6FVBrH07FpOVB+Ufq60vm#ksW`0Zb>h2 zS0s8eQ%I%hCkqK!#7B~5*e0gO1 zT80GjbjVpl<}V_NB9|luHdw!C#HlVDJvys|<$?ZHc&P}&fLuXD>^q9&Hy;;7t)IcJ45Wx*Ykq>U7m(uC>I)mn^RyQ^oN{za4vvZpE;j^M> zQZiQm&nHR!P(F3BCi1P3D6)#NE(q#^|GD20v1wig`;$0pG^~;722fAowF2N0>qvkl zpGx369M&=g0GirHyTrJ`By3zl_~QqH+Di~Pk}s0Lw2TW^svo>W7baoaF`f}Ec+ZPP z$ps~H!o~%sP--eFJY9kNm8Jl%Givy)2KvDb({3%$VSa1qtfFP`Bi9w23J4K2qz`lj zD#40T3(=4e0nf#;Kl{nwxkY6A2Y>dH|3HzA`Tb6>+pPX(9#cKT_lWA#X`j`23%R%Y zgBoiY1GX7a_@)R@AY5F{Gs-jhBEFLoM^Bf(iQ+(v!VFP@w?>i{y)GQ#!Ayfwf*vUI z983F*Fm~y)8NyOU(Y?xL(6}n+Y^+4_l+oSJk2_7GxG|lh^Vc-38XFVEoW}8KpBf=h zVT^BF^8oD^CH*7%>Qll%jjy4BL(IQKIhGPa{6w!5!XZH3A#{!nHLXXi9;bD93yp-$0y=}lx11;{_v$5sEtY1z*mL!_ z%wc?i=W3jU9c@L?mN>42gk6^PRcGhEnZ25i9XaIVZ7%rQMXs;*bsLPQ-9ojF?1(FI zvzP0~3teBgE?yIw)oL|!(ujFn)vNT5UfmxPbvut^52ZaX@UfaS&w~`GkwisaNOtF( zl)hH(0B5oJI>h^Nq%BfN85vwr&OBUXY95bI7q z#K&D>!lsrT9aciE!84p+UtdsYwl%A;NuSiHxH>g{$_w?2vs+fH;e-?F6UE-Xx~QvU z*d`nsKZ`!9$~83QW8!9&5;cKnC+ArVun3w6t>jIla#Po~;yeNW961217ftz?2-$)F z6#CrXBG^Z5L|nog6-d7zBONKja&IgOV4jcZ1+#?xC579@QDctyu4T8~Npy$IC=+04 z0e8X=Stnq9F`{j*0ZEbKM2BgRH~>7XvQwzr)P2GfHV2GeJ}!E>tJHE{n^`>21xxCN zINbGd5GuXmaL*$7E~<{vy1pcdJAs*I2lyJ8c|u%7)HJr+Mbj=aFY(%T%$~X2Kuc@X zK(9;UUSWV2I)K(5;7hZ(#|D@=q6YZ47HknCmVULXRxJI?(YOg;OM@r?0?Y97;mZIK zlOsT4x#F`=I4*&YOu)1=C$daG^vJBDWPd z$eQD_O*~d=4<8|D9%9ot5Q7MzEIfwO&fA$|D=krDJLa*PMB6VQa<4G53*A<0&)b!m z+>e%5T|vJkF1;bpczKX=6*e-ie$Qr0Z{|+G9uPt52~%8bDJV2C9~sU8e3X~bwEm54 zLVe$rL}NDuCfOG8yT-d`h};btS2e&zkgsAIe|a3g1hGM|6pBYY5XxPRa*XSnOdIVz zTjJ@FyKXsTMixV^QI3%TkZ<4yMzc(Lf<2pWC^-0)n236vwGCxzSbCbcro!i6dFF{H zZfx)E-rQ^4xVgJ?@7CSDTkqbveq}7Az6?%R0q63pAWQmv08-uTQ~^?mHO7^MZg$#N zWZ+48=zc7z7@;@!P5^AcAaf8I{wrt~C=qZ^C)OCFma`NH3_b0>f)&fMmbPJIF#S*-iz9Dfw$r_dTy;iAt1Iiq?tf0LxH?EJWp3=~A9{!QD_+R+MPd-wOI0 z$DPSIGG61Adq_>qp%m6F3esecRf)a$6s`HpA zdt!7MvGUSCs;1=-sb=a5AT>FFfh~Qu{oXEp)VTZZ?OQuH8T-52_x9eoc?UC~vl=&U z?e5&(zV*({d)Kd!a(9n5E7-4+n57j`$C{=tz@vc9y)GcC6j{@qRlTD|Qj&09*e-Q9 zZd`f(ila-s=!*)+lrM|4tQJnC7fKaqfpE2$rbYy{lJfuw?yij1G0AEgnU;=@f%niI z*BO^5j1;yX&= zsnI`Wk_<~ZUcu`{0$V5MrDvH))U5*wtds#tiBm+V1^FGNUW6>Q^4%KA8HsI35J@k$mHi2;n%@+*A=H>UN>c{qBxOY?GY^jHwVGRx}a!073Y@fZbz zRlYuVB^e==)xujLm6wE~Z6|A6u4t}7Oyl^(91MM^f^FZ;8S$7v5n{p@4|3bKE(=Ak zFt`h$=rsp-T_Aeq;0kknhFZ+zZaQypF9$>WWFjV@gn0iD?F15(L#`*FteN3eB4I=B z**K(^8CxfyDVKnuR~XraF!Z?U#4??EIS_jG(6V}}pN|G64M~_@iO5y2vPnFhZFRB43(F zY$azF_^cVa8%eug2(mC&%TZiWi(r3zq3Bai=LP@0Hl*UO7w*{?gwo{*r66{z+70WVf&(11i zc@TURrY@oMF1IoyIczo_4tpLeR2((&cSA|zVvh#hA-Nz04SGi)T+?WGObyeX-R0GC6G*BX)0vX_tt$wEF{ zD%kA8j#40-Djk?r_tO{-r{G_qUh4RQ5yCZ|J90Eo(vfHqY7}_vp~lsBzK^<0bNddx zB3Rk`r=&?y^%p3<13Q-FSU|M`FxFnElbK2WvtE}(P6F&60?6~-e&d09s?3h1va^}I zctWrS(H}OxVk4r^Akq&H0tjIiA49ZmR2Oy;cjz7r2eHlp3O+p8(!XcDq57KyzYT~8 zOo2kNgRSoQePPrR>v#Y7AtEMT+`Uh}NUMDx?vK|x$qFQb8@I@rN{Tg=JW!BOX{fNi zhX#(PA()mx(kk1SLi$gWLq<`#1`bGnlb1YivGngtN!xd%bHD}#RVGavELpHd1y=$J zOVUa~E|rlPW3SAh%(*x?O(p%GbcIv}ZJrZha0^N)EMn4pPHN zLWY;_+tV+SUNK1$6|sD*}1>Iv?^C(7Fj#%Q3{ zXRK>9kvn8kL(nI&AD$^B9jysDp`*D@Mq(#Nq>v9i9@^QMxJQMohlK&S;% zB1>eEQL{y*(Ipe5Zj>m$lyL--;xIFVO_<0T^_MUVJ%A(4b7SAC&xkEiHm5ScYD?n@ z#^dN*oP4QS2ARa#;jDKD0iIM0gn3zMMM?sUMm{9h>G!pZ>38xzK_cW}mI=xbNmHfP zvOju^NBwK0Fy-TZBR@W25+Hb0_KazTJX^C-EK=3mRKi$6WhP@YTpq3$w%?17%qqcz zWHieqU7~Bs6{+6ilZIZm@NVNB@dfBTpM%E{kqNr)%G|1@4@GyB3UM{VPUwoy8DEto z-yHD#)ExNEyCjd64N3igP0Eo-4|}=LR!fqqyg5a%b`Z01s**Cs^@*6`_CGn0typc- z$0w(lDoI7Pv9ofOQ@k>C)uAMa6>C?!93CsN#RXq2M|spi%5^N^D5XD}B{ye>m3+cT zl6CRFE_$VG7Gz)*3WJ; zgC_z=u1o}w{H2cnNeD>Y zk1@mZwotx*R#~%LZ{@|bR--A`+h5A}_jESSkD3O4=Y%I$mZqq8s(df4w9`}9riXUR z-WqU2J+8Zo{~S|7S}78z_}`j^*9P4sP2wi;b11HOZISQCBa=m_MFlQ;0oJtQN<}M1d2p;Sh3Q__*|r=wx16(W9JLo7 zPCaK+jl@tbZz$N(-GWrDDo#%6~1at=2# zjVGY{Zc{>GiR+O}=r(cHX%P}5z=9lE(?WX}w&fBIw-v^Ap~G!fbijh%yqw2vR)>TZ z`Ytn^sVmLhOSs%ZlAA+zVT)zgMOX#gH;(eS=|p6@K^500aBHb~s~WPl%WZ{mUFdRK zch0Wtb9*l7>^HefB05qAW*|)CWduCfs3{}*hCode5Xg!kQ6#Z7kPwVuQ0>`SUa89a z_AF)8izw9HBZU=;&Jo;|9QBvN4VvV>4$)u@JlHFxk7o4f+!C$`#-g1!rXA2u(YEK@ z<)$;Ty0l#5Sx6BivoJ1z)XE(c}e`MEvz%tJ{jYi)?sp1fM-rxlN{qv8U&j^HjYAe5-+t zq!w{&w$P@b-6e@6jtbfcNLg*CC^#*tLvi`stam>euW&>Mr$T7(V^ZOGF{)ybPwPF) z4ao)w#ZXRimkEt}@w=rD?|G;Gr-7m8{J~GnuS8W_qkN+KkDx&{8HdX(7!@Jqu|wHtX3) zTP?NIch2?e?(xjXOaLUi&@;vYkm>hczc0V{KmYlETta)|bAV8jjc`cjhlWP=SpsI8 z$46tTqQFgUsl@`-%L34s#yEi6|Rh)5{fR0JGltP1nw{wB-N zG>MXIw@Q`wfkic{PRVKlD#Ue(_3#@T$y-gZuqufpmVN9m z-bmkCT;v-Y>01OvOf?S(E!z-}PMnN52H7F>i#ozi2o+o8|73iusWz&O&)XkO=WNWq z+QwwKvwwWh)9{_V2H|hT$0hL!R2gk7Gj>{273!=BZ4H|gfAzgvH#c9`Nn_`-$v4s-V&1n> z$F${kHA$oZ&l*Nc@P9hE>UKj~kX|(ZK%Sw5PTjtStu*{DGz40Yrar+ceJ9;s_(x*2 zx`~)DnKq<xGfJDrQ(s#HaZD;25HS?qjlbAlWuKhLU2(&v0V4=JLJu;;PgUAojnURdaRsbs;jrF2NjJKWI-5<|d7CQ&$IHBChX zwl#7h0d%%l-u1Ba5fN300#q-0OY(-*hRbr(S1tIxYVw;3a zZno9BPuY3+LfG^^UW2Wg95D&~fx9Mj5icm=ES8HN?l4edj*~bkS)Cg4A4;9o&`E6- zt%-`NKwA~>v>X*P1BC@p#Rpje6ZyVLU)X}GS!;f`+G={8cSwF4V+lh1aKRihmBW&d zEzYLT!p=H6Bo|qzUNTH|?3Nxs#BOLpw6o@{R8zr_W3<`Q%vPJ4&%D|FWHz^_h;k!1 z3N+ztnJM&Bg=$F2bP;qd?J)fxHX&L=3yvfE` ze0ItSAAl7VGdLxfDaWbca9}@acBB5CYTX#h7axb_=>^}X=7$?>g10%dAtNYR zzqUrZpdEtCQ|`H% zb^FH3X6XoNpS0RwLcpT1DIeojx64X79FN)!kplwLft?U?93SL~ z(W+8H31OaA&udrc=HIH$erU~RY`3)flVU$oGxUO|XXpj%=_=~Q>WMxj(JC13Q6bU<~zx_4;vXe(&>U(Q#>gOw0mub0d_iL51QHSGF8VfrD|XlZF{Wr3q27B8dB8 zo)+MF$fY~cl(y59x%mr8mXBgd6SqAH?OE%s4kZ1-| z!%I~7!t3_}JcA%iOFt!$JRrxHU>szF0qMTo5CTFU`$d;L`!&awH#s-Y;0z;sD$n5D z>-NkJ3rLGv59K={}Fuos3d_s}YE`wDn+VSIHad|yRHMYSvc%V(Z?YO@Y33iK+8 z9fE`rRgk<|(5)Jp24)32Qiw%F_aqN@I2I&YA`pP5X(2dLqXNj2fc8>zRjh*HsBM9L zjt_vb3~nvJDFC_rCJK2->M1<)-a9w>HAVA@zw(=kpErfgX#NwXBT`A={OO zn8=RAHY8|FZIzTBNE@&biC@6W0PeJ{hH(kCAS6e`fS+thB=V$l13dZ=E=Onc2nct- zIFVTHn%afkK9WdgiihATWfZygaG0?B0&f+D)M(15AEV{NRtX&wbwbWiC&5}|pteIt| z%W3)ICXJaied*nYzlf&w6Q7v@SJxB$Q*iZ(exmGI%kkCqx^gML`u(5iUT8iX+}+~p z1M`^B)*$q-ob=EHDUyEa3YD!N#z7c|n2d7>Ex2P0%D(49VlEwYHVepUKFAQC!6*va z;N#Z}ZCzJD@n|sE?}o#){VMZVD;YMVakZ^=7GSNl9)rfSj5JK6*_dxEs%jC^s;3c@ zwHjb|E{p4lfa1M>C*h56Vh$H83k!JsDWiT#I>?~lhT;UsAf}<8J7tu+etYbfqpVK^ z6oVqeuqa9+Va7gO#8p@P)TJRpGmop|DTphsKT+=EspRFN(-nfDbM-{=KSXmDbKlYt z-_IE!ZoaZ04*K>of6<(-^=@tJA+GCccGY{`#qieoj$sr6kW9sE))iuF8e_q@3!<$9 zv`Jl5jk+G+xv^J1-w2bZA6 zf}Ee(uW2KoI6t@-Lt4``^#?evcQe9YZHd^? zm-qVrh9CEYPG1q)MPi|WQj|>(VX)W-!Q7||{U4;zm$qSGikJ{kXO*k-9ki2@-k$!` zk8uH+b}14kV{uUT0C3&wUeF_7iZ_@-d7(9W(YD*a?)9(xQ7?$%fxMam9j|61>~_fY zJnB~XUALcj5FQNJ`#(QzFMj;n9ef>RA> z^=a=;uT3+g2i`>*%TV$maf?irNF)mF)exeEgDY?cY*-;nSB6J`%qk>joK$M8*z~Y; zP>XB`OLMa-(o*d!r7iGssJ+G}2f8~yI!urmq~e0S9eR%D z^2dF+xWaBk@nbw5(Jry@))~ta2|hd&S!EvZY{lw^_PpP;Uu7I^;)i4qDe2cJrwI_x zV3_n2HX?lkb+ymNMn%vd?>k z5DGmCky{_!L_Ka(oBrwkknE;gDl%morUY#x;%5}o+5>9Ln&>!$x|mC!n0W-zRp04G zMc>!)W>`i-s3zOxu-G{skxx-gyZSvOGlFi`?rz4GsVeqH+VM2zKoUyobO-fvqFCVe z+0ry_qO9{0QA^1+(Cm^4V@>iw#p$oBv0T%CWb9;KoPk3b|3DA+NS*ukGo-+)oBd(El#m+m_8SI!qq)b|9l4r@Y0X zbP&_C$AsE=|IX&d2;1`wlFcR?yG4>uHug{hEe{0{bazP$IZrKmp!i>uS;aWcn) zE$R{N^g;qvXK;d9uNRggncuE^n;D|{T91u0>N_O{j0G+*p@&Ojj?@&18InxvMDRtE zJ^^5~r*M~WF{kicL>ZC+imGYkr(T-3Ic;Apikb2yNscAG$Y>P(=F2ahbNF20_?k3m z;7fup{`E0VYe%H93J&(S%?~ftJJeyNbM%AEjp8&5;PLr=0H-YRCG9ur@?p=TGDVX$ zYcoxsufE9D<27wn69ZXa%uV^o>&M%q^^uUqCb}UkhWv zkWj0*1x6giNu+IF;-zZ2PxZv}(i4nYyDR2^(LcYXhJErmwsFimN90bifp79Hy!zgq z&DUEMeG}cmU*Qv*urb{IvF;Y1A5{ZY->T@m)Ag)2s#4S@Wz?okzf_k$gi@q1>p!-; zl_J~b=(VAL*1L8yaNpGlF(LKn?(UES4N{QR6#e4A((^(itkij{v+@M-R;L+C`RsA5 zIwZN5Q`gm7eA8xsY_cBOzx3(MZ>=*QULupRJ2~K+CW=t{?w94e$@fK0ZAIH=sRm}} zT-w3^*nnW)Wkn$06Yfa(eg+~56QsG9CwW%1CShHWiNoHlyZr}V5@rFmpk16B1|sE- zwnd7-MOl{ptW5h(nMJLFzDKGT2}MVDtAaRTjjEmGi$846X2z#oWE=jid_SI_e&7H4 zpInhFuq)TEaDF}68Sh`Yb|o8=%)udm4!Cmt*T4QX=j@;dhtv!GYy2rh5FrSEb8YJ1 zgF(;lm?cLzI1H``uq` z&-k#1d4v`hKwdx;4%{|D8zDxsA8RAXbuL_&XkLqJzP8W{Lv9ob4_qSnbF_g3>JS}? zt3oO=XNW~#${+FLFMhDzO>8}+_OI-kotXWPtAJ|S$+Bf)O8%8d+i}p{$YyUoU*7YS z1C`wSCI9;yBYmc1s2_wN(?uB!x@iJN7C1TZSSf#sQ>0JgD8difUab?X2J#|JnZ5$0 z`9+3l6sRc*ksdB=Q5lMrxt^=mEO+Il`&Dy~G1vQUbC0pj$r6!c=%d3$fRhFf@HPUd zMS>=a$Sa8na9WX&bjDUmjaeXe-jiV7-U^U#W8^4s!Jn0baCvJxBc+STAr^ip|*~JpY_W@ z&imvze{rJVtQ1u1sOHYjbvTotVGUfUh z7iEaacmp>Z#7O7`F4ugWMvIGCS@Ww0XtOh5Tv++IFjcE7tgW5ABewDYtsmsu_)ni% zKF-$(7|_B5~cI27HSRkIo|DAkqesC7E5D=W07J

    7qCFnXOQ?P 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 CJ#m0rqb?^@(X5p$oEqK<2jJ~i zbW4U9Q6x=LKk`uf)SmkXcx*6T4Lf?+RHX5NCT|G)_Q&zh@B)IA3)xV+au}(9IY)fcM9ZEAM z-E+`7li}S|2X~y6Rq`KGALtFDnIxS{?64xnzk6$fnOn;Kt%&h|JdXyC5Rg^G_{l^C zn}xbKC+o}%lON`!{@Dja&7S!*F3e8(v?9ho#@WhdiZ)ousS zG2C$`e#x!!oNm4J6yOjDF-&|0ys|-bK-mBjzef2%P|8pIDrz>m`4<wAsdeKP+3&oq7iWC05|$7h|sf7;ws^!<5>k7?8N>7wud%pF?ra!Pw_ z7GT&seyEqH^QZhw@=w1!o&Qi(ftR84M=gN)==?u(8Z|cs>kL*fIFtlm#sVq*CvS4H zkkJ^Y|71$vO4{cEOy`mImGJtXE%y;(f9#V~BaniDxh+oNA-R8!-e;?8j=;grBk@I( z`=2drI%jg^xCBXED!acjiQT_apUd1Z7Rc~FU30K05E#8+8K{nji&ZzAXR}x^&Hr?X zmwEnkZi!0j3zPbSx&EgM`)soRO7x5OfiIBoe+IFSG5%K~U%bdATjt_e|EEiSi1t6@ zPM(SOzq02p!Jd=SUm*4Wbn%aK|DP@VIl2Fp%jEu7=Hvdal=BjmbJ6_&(=~Lo0KmC> z)Wr$_R2p-M8nd_}0Mm74tO~%{n_1=9nj^V5SOq)TuEVov(;e= zqx5A|2AIk^eM2e(5Y|vzR&+zhAHI3#GD`$hOXL!k$fC;xoV_}DcxMvnuyR>-0?s5M z9wqXBsX75uRD86b{5mjHFrd=oOVH!R77aLCi>K}JmsvGHZuYPh;;JUd!y^#yg|-%DY&72;W1}fpelrr!?>-tOMt?6S0?x?KzY1b_6zu*b z=YA2ab3d~_|JrL)o+LLKSZbO9$m#|CFb7Bxnf-g4yPTl74bEUrNvPZ|8dBe9;5g^i zt%AuWY4q_I;!g&PO;uk&a>@dGpsTt@wChXH5?B_VtTI`~+1mEjP3r<^@I=fl1g713QS^sLU1p zWs&uqP3yNILqpX()$sRpf5q}vG-rlt0s}d+X1?pr#P5-5$%Uv!p=$->^-U-yASj@X zJwscuZCb9QRTw^d#ROh_i?#Pr4fa5}4gL+H=I7C<^iD~1Z*);QaLytFFW&ssuhMn{ zC1(1+{&lIXw?Oj~kWxJ>Z73B1{Us34Yhao;K!FVEbP%bVt`FnPc2w8WJR(Lap9lAR;JSWHq@G|>_I*qB zO`WNMWkrEz1yLA+#BvIaIqyyLOhX5qB&WHapMQQfCe7LS=dbB3%2>>U!;gzf0pFxa zfBR6{{#i*9Npl+7PLfzC>fk4OqFRoltD)=oYN*?Wm!Jqhgf*4XoQ}6KWbGaP3#vxI zk3-&PiIiAet|AA_>tPV8t^xj53+$Y#?>UJYRfNWkw8TdyWs@-5F?>u=3^ry|W$iGdqeC)d;|oZD|RW zJb_^v2NBaPpM`ELDV0YEk*BVVFII%c;KliFXxeBTEF4IGug{GQV47&t2 zC)IN!h``o8EzlxUW7v`Y1Fmj=c=#Xb0{1PB)mK5A&)O+d(=Lk|NrNt(GN!It!O40+q#R(F=(MD5gM0%AqkDY zU$mXwR6uAPk*`-)EYqM~#9#d4YrpzcDP{nBQv3*UK;5JxUqgv>@;OJ)*6rPkiUtF%wfG>k?%_LEGN`7CosvncA{8|bVq~ z%m*`G3G;A)zN^s#r5O56a#+F9r(5`EY_dLk4y%KA3K3O~DKf;kIaG@polz%JX&rt8 zRg;2dXaAY7lR_5XKgk@*D{^%~mkwFfSEsgF&l;-nx=V#9a(_}Mq(+`KU}63P*=Fy+ z?cg&*cTge3r$SJ0Ou^ZW!X#lFhejMnVQiH~nm1HcM!b5*lrX~$ROc~9s(ejyOof_- z8psf8pa-~uX^!mejA6XtiLwDV`{b=(QJ;Xt2}7V^hPZe zM^b+4OW=tzbq_^bLImC|6TXfp4sb)X^#nmA!$)yZ;p-TBdg?v<%e5&K# zs6$B~E7sM(F|lg(IMiJqg@s({PsyL0+Wt~ij;!+Djo#sSAUpU@1 zDn9vf#&}MNWam}+8VBcQWwILW0~B-W1Fa)&@W^C`<4F|mLNzQ(h(Q)ntRSjfuEs7B zSY+Y$#&IJBwLDduZ=PUS+!sJ@M- z`5kbxp30a-2SIxu4J3WccK~H+b(?6m)Ei_*?PLQ-#ux^jg3wOc~_LPyS=q}e`ohjDWzGY*3nQfQ-daEs>y<0 z8xLpGjPh?u(g5Xqb9kPY`TS!FPz5(t(u2;R8D|QBJpciYO^~M9c~0{}gDaF3qTs?yAUag|!zlLw3>HbCq^r<5+6lO-3iYJ2 zfZ5s^o`M0*KkYH3rE-?|8&4D^ekcT=4qDhjPf9cPs%<9gw2@#1hP@6}jM5qO73=_< zHMh}*gj0t3Ad2O1vVw(=ISvA@*FG!6Y6`F~} zW-ckka@mNu==QjR)D7Qe-^)La}JFO_y&TFrGuRd@Jsd_ua7+lW(q%I@O76Kbc?U* z!$B%^4X1uzag-LSQXbGLgTkY{iYc#GdiU1%Q3Kbr{aeynD%SxmER}POnKSIA%*MgU zXt_|nXKr|8Wim^(E9DT%vuKI~z~7clI{c$EJ|BB)$pdmKvF8!a~5Z#r{S-ov*0=@K@hn zTYI`Q)0+oTe*n7{W>a?Jy`r!EbbIGn2Bj+2i!_$D0g*u#Np{$iZNRa5WMD~yfZJ@C z46?XdjXo^QS9BuQb~YbxJR|<|F})WTQ4UGXtkaWM^dvai5N$dPW6=ng?Y2r*Jb+Q%m1HPzJZg|Uz1p*PzN1gIM`=qbNEXtr^ z$ck#S6(F40a0zp15}bA3V~cCvz18lB3k+5Iyme0o(aMO=xyJr(eFjd4n`J4;Q-a`* z4>vbG@^rHJ6al%%57G|=C=bkZZPNt?f#ut)X=z( z+7KT+TU}q@+1TA3+C*r9sdO6PgS*qTd`GE385MnBh^7(j0 z-yF<|lWoeJ+VImp1DnH_W!#^BF~Er!!}&+q_dV{tf}4)@$i-fTZXYrMQqsSY>16S4zkeZnb<}ULz~Jp!aWB${Ld+g^(LS-I4z5Sw%7n{ zxHZRde!n!vH!HNpyfh*|`$t#`d*nmOX=^fgSQa*4r#yy!3l<#Myx@hogSas`!xVrR z1pgO>gO&G#_JHy^oMnQMnMk)mCKaBOQS_+Cc=AsEcLGW_8x-JzXA0FCGGYLwU@?P# zt2C%(UDs7g%He zppQ9(j|Uf+JX4QGEvBB56_hN7dKgy9S`2No%F$Qc=Y$2$7R8 zBMA&0ss0|I;@i2#sXmdJNkdl9irzQ;PdBBwP~;PBj2R-bI19)1rDFp!<#5plu*5ND)|Lw7{ogV&( z*l*sMLtLLbtnn7>{Lf+d577v|h@|0{<@Ba{4e>uogXj83No;)JBe0!5U3^E8 z-F{s@QRkk7XOxEY42QL&*B{_;9`qPZDeKjdF>g@!9D6wX>hbU#$?8RobAPU^jG3n6 z3HP-qJw6r0OkY5r+|Oct1X2!HWdT`C9kB~>>M_t+QA?!i;=!TqVPPHx|qoe$qnjVUSqFg zalOC0y)_~XLt{1&>5dALNuW%DC{#Vma8=KD!Az^+yfZ;8a{k8W=^n1HeB=9ec|9Gs zo}$jKz3r2QFhZhLgn6aFP?D6-^8L|vdRM20Bvj%C31SW}DtFzw=x=8l`mpXy51`^T%OdZ@q8N)i# z>3Ci(aEx$d0R~aRpEOdWywwGsKt=~A7ztfCuOe0heSRHg{{fCC5i+cQh%CtmK=;%) zk&IRM>{~$8q38bHThHJNZXZo3WCb`GnS*$NHuCSlk>6vzTlXF{+DAN~M`Mu*?HpHe ziP9ZT2fO!fogfH{Rj3iz0O9)9R*}uK_4M)mjU8xP`-tZ+LIKDOhE@Ws*Y98o0UR6( zg?F0w-fcGSjU_0KEvV_nw!jhnAtNY`Au%C**{=fi*dOx_Z6!}$)kXiwk zW!O{dm}MIEWsW>smc`h!4={SUgIxFxo{FtVS5kM?hO}Meiy)CG0A7~G#Y^NL;RUhx zVjt|K7k-yj*}eko18-{dZR)hn7rZGUm27oyb9)O}Ra<*I+mCL*ZuF^I(`mocEiD87 zS7^^mZLNG2>{7!MwJ_k|esl z@Pa3?6{jMOcaDRkU>}tb+N16${Pr{z`}37sKho4H<3}59PfWTu;*s(S%MyAcCmZJ>{5xp*GMFD4Q?{g5mC<+ zhI>A>S1SH1f*A8KdUjXjj2GB%LBG+)-o^EcHqngOgEX<=-4J9K+1IHua`#yg8L@ip z()R4DyvrLs8T1m;mAYLr&>m%DY*{t;O@Fp*iv}CV? zwQEKGW}+8GIq3`pqgd%6RXh!qCXifW+eGyPCs=yG(mNT54I_*2S9neZuhi&}JTT3B zYWDch_$=;DBX8QU)2}jvraM(wgO4{>cdo?{; zl6r}nqy5p?4y2rnwpFI@B)7t1w?eVp&568XYK{$yhZ3DUdIb~k=@ExS9& zr77Pj!@2>82XbmGdI|zY47o_cbs-fYA7XVKxRmRFl>W}@+Vz-oAT8!>$Yk1`Cw%4h zN9soh;Pzcs?yL7HZnLaBR3A3T_1cJ*l~r{$Z3ON5lYq*WM#^SN<>6RwS=m%qfvE)C zr47FI7{6Ioo~lpr9ZCRzUl~8RuZl0~{9pC^1K=@Jbo5w#+=yc^TyKCi7z`}RI!jR< z6{&iwTk0yPgpbfB(Hb6CmyP{P&Q6fZxv}?fYcpd=y85FD$$HQ(z*<0t2C@A7q`1ns2MN7l=I1e{1sH!c$9t$z>o;w2TC#k;7Nj?I0d?(#9o=eiH!IkYDU~8LCIoHEj)v%~7KX z7I-8$bI9QwjPRT&Esc^v8gNA1qEvjepGuDx7R4g-@98xdfYbJPq{$;(jh&WY5W#%= zcYYp>Z1%7-MZOo+#N!nYCT;KFsYq*029}j3CrYV-g$zVxb(BFwy1RgxE^K3;sq<N27J&LxWmKAv%8|Z|(IPgVr6T3yR|gWvD9$xH%v$$kCfQ;;EqY2nR7Z927(%TgW`*7h{C0 ziI^0Br8GoQe}!07oBacYxMkb>_zESBnw=8{plg7*BdU&r_G8d!a+(nM1yKTznhU4` zaT6oKDT%)m%17x9=s$@8)zo!jH{ms~BPxzfw64gTEgOGCM?zizI1mnjL`B&M@Sfm# zGC9Gb2l5I01*ObXaE2zlQ)(IC@}d(&QGua1yF8~KGl8G?=?BjNsv)YA1DJ70uO!P= zl*J}Gl_oo8sI-MRK9B%-1G+1c;ZTRfPH{~k2b zV^G<$n@FGTKFWuuh+6j_e5|NN)w42*g>oBQI)YH=&Xp0W`yTV+MDy*Cfd@7)ndv5G z;xLa{uET6CaziU{1G7XA``IB>*KFq5uIoi!7+N50^pn_59LIJNQ#WldnS)T>Q8i;v zH&<+T#kOmjrVa6gQ;q}H;uFLkPY?frR>HAd359-N3ZZ&N<8UUE6DQgHA2foSL9niC zs^RYG-il$b=yuJtD}wbxL~nF)|0jPzrZh|7ej+;Bhl8-RUSH3O+lwDn1nZ?OxguD9 z?Zpy^K;iBu?ue4oybW660O#zppYp@^lYXXR@5+5?eyZ|jxhlukW&3EJG&tSsWId>J z^-vn}H)NB-<_}qX|0HX3Wv({sSwl6>k6J9ZoEN=W!;;V*{c!uxmjxkh{ByT8%nH8~8Lot{H%{cbeI1UWZdHZOHS%DhaIGX)X zi_lBymA?sx3o;M-&$5R4jeb*}Am1$M`8I4l&PsDSV25vmO!?=hM10NZk^lLl4s1~6 zy$-mR+q|yAUZ;yVmdgD&WESSu^K)2ahzcPdF8J@7uyo;|r?jdbYA`f@$vySy>ESog z#f!H`87F+cZG1?mCg`c@VPWu`sYfs&7W; z@eEUM20D|x-CyCP&je5!TNPs7W0vKO9_oo;Lkz0 z?nSPNMT0eI_!ibA(^U_`RDDe|Jmx!r#z6c$l^|LO&L$>tP7r-j!u2`CcP`<2S8ipJ zKK%lO>zQwEExUcJW2*=Ay6(^){!6m2OTl4o`Sx;e3j6vw#^`i5b{z#0u<3$OKeUOz zH31(~V0&t4+P)J<-~mr&TbQmX3Bb>1W1mBk=d!W?D=Eo2O?*I#yK=VE7J?~UICeBsjU5yRG4;sS+(epW5deGMPm71p;Q> z4)JELp@aNC@M6{X98iY)wi|k}mf-!eH!D3mwU3OgT=3k7p6vvBVyUQ{gJK;?5I~V_ zrpAWhXcfzOR*QpMdEXe@y^dgYi)qA3i*g=1<}HG4Y{jk%ifuhsHT)5SP}?&dY`vUz zdU7*UCHB3so<*jUS}?E4fk2E_h!P#Dmw2$x1KUzzy9KHN)^E=+n2wqe*+6D$b?Ugj zD%cFgVB`oqGiG)aC#n%Ztt<_@BF5t(2P5MFnexl+i#B^&$1uibsbQOyQ&uX9%j>Gs;5Pk%6t|X zp5-x(8QE-3Xk${J?C_WTQgZk&`M(bS=fVHt*RFpHN7UBgzvF-YdvZ#>qq8X1lTcUn z^I6*iA2tFIXkcx(12Ww)=P37~hLNu`X0zDzu>TQj`yU+sM{4~`QKW{@-an?l{BLW# zMjVQkt#vq4fwJ1~_Zs1VBHyQn-hah!mgz)Tsn^Mw%~_pU!U+{SZJu~UoZRgctd&{2 ze?skkWe*_)MmE>!;h)k6zeNZ7PZ5XcqV{{|`1J74=+o~Q8cLd=vR}6i{@@lS&y&b>ci|P(}@QEywH%?UTs9l4Xfnf1Dm^zOc3f)-< zM`R4{|MjtS?$3O0Z15Y9=EG4F-?meW% zKiJ-Ryt=ivp*-GLg=jW*Z=@(l#WB5z%<%a}!ZfBKpE*_kBZr#&snxzo`A9~=?#T32v8)-rnYdUS-c24$wfyQm+0b|Hm z-lq^Dy${xf5G!9JFWtVQeAvK9TM9w%#2Ti~1U)abL!?c=bT@9+(1K>kmv4bd;zNJg z0qdIbQKyG$rmJCR&{ys=nv@{x<)s_fbD?q#g*^G%dH?`!Gt*6|-&6IzRbC!!@gC-DjqnE>6km!M zt)gPGE+QfHgM|Zg5eX>^?M8RR`q^Q!Of^}-k{4|au%kf_uPG}0ly=aIy_D{j_Osk> zz#O7y-V~>57Fi z!5p<}nq6MOax3Z~5vzwg73_0iCfxX0u#x(S834ivin806+pCy{4-pli-FEWkg!&p= zI0q(OO}HhD)H+0u*?tG+S_Tin%?A0)bYzroI{adp-#vHvUHsiTmG9uD7N0|KXx)1k zAMMd4bmX_3GLQIyiyJKlfGfU@TOx0UKP{UO4CZ6s@UO#rt8vWhL|{6G&X(|=e6DCL zs~MGlu*+lEpf1h_2tSFqNXxg%e+zR7^&|Sq?O@P9==AQaC?B1~0Tl6JrwOi>ck5%n z+)%O5nxzMx^9PEtq3b3_avPj{sprisHuK9J|?HXMH9>Upz=CE*| zr7ff^)Vl5c)5E`_L6RR0B-C&iYLrH%`74@PL$Py5L&d|t#xMTh@NejMZ=k;(av(-4 zmJSa8mcD*xw#oWC{PqtIhh3a}uD(AsSF}!X$mc6YER-ut`g9N*H3HwUS%9MC8qz&u zgiJjR67O)gAa=JvW%NesY)D!Sri;Uz_qDPIo&l%ulPwL zzN`7J=^-9uxQPcD!r>n>AAv7Nvm(n6l2SI!mj!`s*2TBE;%E+ZXHWN6Z2SWY@Z7}B zEjcpM+Zsk9yt?(c69FI&lLRG<@EJ6EWo2klO?J+Br1h_OI- zTpJ-%7hxz=&Q(LpMr0*4yf_S8-M8&hL(_8DemJ~quG5mDq&(%J$a_=7$@?kKYNHeT zcM%xdI{ZEUXMV0th!4345#^_@f}g+m;={eik4_JV(lfNkLp0Vm)dZ43dWMTIy%yRC z-8**VxK5bZ8agxG9C z*Hb-&W7Q;bH5Mj`>AFbZxM>Bo4H%DJ&DU*@0_o)-tflHE!8=O7km3A)HkPJk;;*0DJ8OyWOyCz|L-={(U$Zp!_4*?oy|Jc(SFq{z~OE=m_RghW;N+YLBBIn z6r4iIu8S}-|39(MAaKNpF(Ip%T}Kafy2PH}*R6Z&a3JvzWO@Rc(3a9_z&S-1H!2j4 zdp#K)aLOVfI>H5o|5g+XN9Y#rAYk$kgnl<2bno>KFaZ2}8Fsz_wG%5{V8kN9g& z`a~Ha**Acd22D}~sYfZfDM7-7%PL~1)CL*la31jr%@8+Wnk|N&Nbs!5-PcfrK_B5) z^uQ6F{JRJDH(?D?W`lSVgCL)(k^<_==$@&SaL#3bDRhV0rsruR${?_W0ysv^c;p^% zCFdL@Qhm;tQN3o5&S@!sqm-`!VkzN08m(kcx40y1a3eOLAScSZ)*EetHZ=AzxO&t8 z#Ir}9*tAZgeJ0*^MrNP+1aBZY#R999=a>1cE;>XxclGJS0-w6om$?Zi&I=m-e z1U6hY2sz&8e4v!zDbhcv#e6=`KG`b0?5&LJC7<{0wKe3c7L&Lrr5u+f!j1@z!PxFZ z{3;e#g4Aa@P{#$iwzCO(cB(y?PvN4($gO;Z)62=IdfsQX{&FJNna=S0o2$Fe9&hh$ zekeGT-`m-KT5xDDLV{T`?>^iUT^t0s(b9$rX9tLvid!nv$+W2u9d{b zBj11%z;QayMfv#s0nBT1C*}@js(}Ts10{iF7W;h|&v8j1cDZZ3dxB3kMjv#gn}O+D~N(Gz>krMF{I>Abt-368Ua`iNy zsY>0MGZ+Ygm8}(DdAj|Dm!UDI|(%tug2ey7fCDy1!tCNhFSW&z$|@b1hWJl zZi~erHHvf{iKDT}RNqfr)r<^3io7TUWqFoe``xj`OMosij?)am^xa3J^z84Ie)3-k z_%i{|^fT-8ue~GZAH^+zH2yuYRm&}n{8E{32ysgp~K}W2mGe= zkfQ3`)dF5%zM@{IWJykL`}bI2TZjLR|M}nX=g&`hqCKade@nUu)e_F>x-FGBnU_-_{tC?ZF*s7)H#JAaPxM~t_# zgY#3o0w&_cmyx=;;yI_{KQ!x<6)(NS)&F9EI1>{Q1*QSE#>CR%B+z}3LOOZ`>T1um z%Ou_7fH+eHf24s_cPe8r0V($8cqM})iBoIld+kh>3^FZAr_r2_rqP%5VgxPs^n#=4 zq9g-B_P|h1@K>a-sK`T6GiJ9^f0J-^`D_7q>QMQDQTSk%tUE0D*MZ^2I@V8LWdCK9 zML&kcGm6DmpYZ@G4SVr`z1Jg7SRtW$Ut(>{Vrc|b5rdvgCm$1^AiPr62}3S;fG7!y zd!h2hq^u)1n(7QuE8+o4G>4$&F(F&brTtialL6e<)1j6;C#z#E?pOr&m6Bp7D_{*vYS(Rg_p zJOWNdu6F~3i}aG|pi7BY$aF_>qgqK{DgY>U4T6xUgfHMloNG~|^YQ>tUvna6Tc``| zg(ghvAXYsy@>C~sL6sT$mOgZ1o(%x4iWnri6FLU)T;BqG5Y+`Z8|Rnk0t<3x&Id4F z9AOX~ey0E%PQ-iSJQ)F+S>Qj;nAWEiF)*|cRSZCQ8yg^NwR|ul0O=2iVjKic>^NTN zf{pZSE_?xN^L!0;k1mY&oDK6g8{YFujfy!c7i9Q95{sV^;Ll^fOlQ0Y2s_lUTdM&G zFu=Qu|MF}Nuv{GlM-nXvH4CWz8KmeE_XS7op3itcht$rkUC_Cp5q1$%P)wzuxMyQ9 z-Y@ew9Bw3n3B@-&(=$x0FI*akIayZ&$8=Or2Syb)g#hUH%&U+;ISDMA!-T&`ASKy4 z3k=uS0db9t1U&3<6sknC0XsS-V;r?%e4wrQ9+5pawe2^l?F=_6yMS7RcBJ8B-3R%) z9Rg2FxZlJJQF$ab%t)7Rk>SUu_Ed4A3#q(4dUZJ+p?DdAXHOTscTg{{ru(jKjj)AF`=R)S4ZaAz z_gJG^t^%kI^P6%5$La-wn_Nc`9k`h|Wc^DI2(m7L)Zk z)M!{IxpXeE!&QZ9_0sj0s;6Zuh^p!G^h$7;_d2c7OZ*u(bfO-B`*in1ln@3@9`5Uc zA|M8?ywN;a#>F{m4tVk52#(S0X1z?P^Q=ajATW?uaTF^Cqwq4uhI~sD1y*9#BD{F_ zpb^2jj-WTOmMTB^8sG3zKJZUx@X_YFamdPJ%bF}M-x))Q2Cf{zj%Q*pksiN^;qxL zy+@7q(Ypk+UZgq==V@i2+{Jb|0_mglv9(nsP;5PYe1BsH+SWeeDZNktGL=zV8sw_| z4qz5YNGlM;Q2S2CEI&m|;MeMPxNm{lQbmns6k@I+$#TCT`1(W%>Yx1LE;pk&Zzf3k zQt{Ux7#cl!VJY%p0Vhf1vdmzhL~cv}zpRmG%d!}I_5nsOSL%h|;Axgn5B4g)XGA&+Z=;I5&2KQZ3QyEXj zB3}ei?*Kk;78fs(e}osr-ix|0z4XHGvMSpr#0GC_^lj?2&KG>jAu~h($=0^F_I9=( z-GJTbQ?;f6itd({0skws=cTq*z6y4!;fY(4R2!lXp8W`&WPwxu11d8}6O7X`<)+_! z&ChS}{pOE8Iso$y`y>FckZNV*^i9i33!50#?%}v|>}))mGL!i-%ego`T6p0FPhu-h zMI7%Lf0Tg9?@@4)tj(vX*q>(?-TZSq(fX0Mql~Hy`n7^%=hdeulO*V~Pv{J5VfDR@ zt+kJzt#9nEw~Oq6T~1V9jsVnwAqtPy}`1OYC;b4Vj7A0yqH&Jy%6M;-W} zdaPB6KPyr;ycL!V_k3!vRQ#M{rJQYf?Q|V<#TBqEURsJSE&LwCuQ4NcpNz*tuU*=n zeU*2a**B8;*SBzU7z>z~GjA6cKG3pD1>vXiTgBq%#$3SM^kq9Xx3>2-Q0SxNdV)ieYLHNffH00CHz_3xgP1D(II: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%0ANoI>n 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�hEI=EWj*)&lIuO|IKUWFuk% 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%0A1T$buHmAVC&EJKh^6|DdN;JbaaH#BnN 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

    +6`_4g0r&CaboD_spU2EcRK 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�{4Tvf@7{w3jkcbOiB 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

    *^0_W{-uKJ8l4v(j0m^hJ?c9A?6k&0kBcc%B;-G zsvv>v834oZK2CQ=s9DDAh`E4aX=LK0Tt+4>F_++vI0^_1#?Y}bG{w6mwjJ)xALK*J zziS<7_8{vnjthP$)GRNcDh<1JcDTrolsbRs(7|K%7z;2DkNsC39=k!whnNoE*;(Z>ecXksE;;x{q02)(UF2nePKz(_=`N>AK7 zfYs`N3Qx&(D25pxSZqvt_DF2Rf|qs}GuT}j2>Kvc2AToi5fic}xqp1%P!VHSg*yff z5NuIGUtRvmWCl7Rp_c=J)C)0upuZmN9pAGc{8l?`S8Ukc56oH$I)CoXcET0EdwUP& zpj!wE?KLh&;Jd-SigUY|O&Da%Y3}TvKj%;|ctG*`W_WuQ(cEla;f;ANaW_lQfIqs? zn^RU-gNx8S5c*C~`rqGUa_K&BHpI%Fbx4p7xfPPm zB4uF*@T+^F?#Kz|Xb=xBT!jT|$`=~{_uDtFxxqt1bx^OvJHd{4cmcgSXXW5bv}BMG zN^IdSJzE}X68TzdDKyn^PXKsuN!r>UJF#8e&@np>z@r%P(Zi|W6rpmNX4q{tOrUi( zIe+fLThQg_4~8GyU+rJ7S1m*KirXfDEpL$%amZdJlMnd8f%|Lgpoa!_4msUs)lFe* zuGDjHYzvnr0KH44_8)TFCP z`dLF7N0p7s>9md^3ZMZEu!iC$_7Pc?_uz$Je+UgzzrOszDul*8c*a%uvj?FeULUP% z)pH2#IfMoelsDr;0*Afl`mwtf zUQ648oLQByN*$AO!lTiV$GJ(2MlRg{4gPYAzJA{=mgVGhDcMQ#C zGuaX;v^3d?vSgxaS0S_~^fq(I+S#J)M}n-igSrV>d&!4ul0tI8MKT+eu?TW?Y+eHs zFq4v@PEqS%-nhe-h>Tq!_P@Lit7z$!oKeNURy+`@nZ{W~PC9hHd!2Ct)*{ot>-1X_D3VXed=wU4>pkWlfxAQNrGqii$SM zr|@eL*Beey+f1_xJD!{;)|T7aQnuE+gjBla{aA3$mk(h_nn9_>zoBolra+@$gx^{! zg#oswO>CZybb5-m4#AcU^JT|*pZatMWe6-H6M7I)9b8E z6Ru�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

    BN4hW9s#FdSt@!lUXy}P&W>gz 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

    UjNT%Q+ai}Cq0?jrli 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%0D<(FTcQ@D zPun7XP)?j{lzrka`secPjhSTD+`FZG+deldtShMhU{mFM)(4#dEKxUm->d$+9G4Dp zH$x#I;%_{8Yu)+ixJD$!d2hUn(B==WEqwE)%R&>*iGARaKJf95J}`q$mOOez(n)F@ z%db<>+(S>UOfR{{1kM)GlVpv&@y?(z_W%e)IgSGYmsklJTsM+g^Qk!4tm^S(_?$_Q z>%22*4BZ51L;;H>-?8Q1E(Fo&zM!U@_vioS34eZ6=0#AVXWHiIRgw!jbBjWll>z)! z*qtRb!46KkT(Kg0IO*{NP3w1AcK~)q1x7lz^EZY8*2al~zvSNuuC*tS*%Zud8m<+4 z#V?R(do*1G7r9nW58QFZVNuZb+U2r;=mHPaAPCBg7lu6arCL_h^cs^qz2@cDwA$-} zD!m8TLUAnIkEeU^Bi0Ut8QU|f$@l_l=xzCu9BbVR*OJ^v5BTwe|3I_;{K0>e#(iB0 zLgYqyJfFePra*i;W1X4;@yeX7Sf^e#STSb#>%@3&-upVLTENjXZQ>Ajf(J{O*kv-4 z7jfJ+O^GUO44lo6bzGBHiEL6$6{RiNALAy3mp%(Od9mL6Sq_A2Hk4*XI`8 z3jB6Z;nzCQxvT6S*viZ)@*(*(B`9w?k58A!*LblHO8GjfppucthC_5+C3+~8lt~_$ z#uvK!s?Fa$>FPeQHO!{US9tI3b>{fl|81y^nq&#)h4u zV9UT4N$xY8D{X^!Ef-pT6qZGZ3Jj^@XM@uhwBYO~e4xO|h+BpfDR`|~$+j5dgDDY= zDvQ*|c{3B-v+x)}# z$C85n-Cl*z*%}{=D#z6ej4<$IcFK}9*L055hr-2`r>x-Gocbs+1>dEL&%SlCVC%6; z>x6w3IpUmji@22|+^%Tq;3RFTr1g_B3Gf~Mj^P~`=cv}!y^9yiJu03QaJ1-SO4-#q z<^wNn;W~Ww<@dI3zyEli@PG$AiE$R=e!|-r73k}iGAY^&k&>KrIAMjS>IC6ou{P)q z5+ovohtFOW1-@&tFF$^8g%9o+H`W^jDHCq(ymwUU+YyUDe$bH=;-_)(JsnBmJoe=W zr!gA-j_kvF?02op$u-_2I~Q0QDW1xN^qV1(Y(9GWWkqO09z(0E;MoPf^&_t;Y?;@! z=NWu!){6Pc(Jl`N6(e&&77^J)teaa%BpE3)sh%j3ul3%Z z;!eD9@j6fGZI^fLg^TyX#rsqQ5cN-AxOjyrGe?XOyIi<N|=8c zeSE&*3k_ZT&)3J7Mt<1(B+Cq{oHTbH$a+NjTQq`-Hq0vWla_&>Bw<5#hrErOIH@Bf zb=ssRiJ=$2JQ2Fj;Ny#eB(Gb)4smTpskj$Bblg31B9l`oYV(0#V1q@APf~o}Aj8(bsA-DHyC|NXn#bBJi0}H6w9dCb( z+62N2XP*e-{Cs@1m&5^i!^!4blED-?a}@AN`%rix68Pv}#a=n+>4lHarmB3&eSFr* zkf0FQ6LU`W@!|I=GJKJ48@lajtr}+3HbnXZhMql(aA76Nik1r3>2-m%4d$7)3zB(ttIgs zVGxBRKqHxOnO4Kdzb|YUXF?wXTvLsY^0c2+IU%d$ARr8+s)$A!Mx?E9@uurxwoZ1X za}DG4Pr+{o4z=gw;!W1$i!e^v5?mW5OX&H7za=i-CPO@yd^#l2E=41=@yMy2MXp~J zVU<=*kyOL@?h6<17stgbKBml%5&|$Kl66%WXA~oKjb^_~(o7=gi2WxTH;mkr)K&?a z#?XO?y*@pR6Bn=423sKd{9&9==i)nm7w>8N@`a1{d|kXj;gg~+50N-vCc-m7PCLTk z9^&Us8#3@|;<_)0i#J{O(zS@#=#+5FQ(U}pf{s`UGw)OvFVXdVgs_RtHDR0y2{deC zvj6Xym3o(uqK7)YD`k2=uS)NQNbgBR>;;a(%i!33f!()Q+S&PZPwR|2MW0QWcV*Et zsY=nm`y8^oD@#ACh|QIiJgX${%ECW~An&U3o-tN)WzlCK#=ENgXO-eTt!#+_N89~8 z-x+qfo|*ghw7#h8^9(e2SC;?G3cM>zKNJ1kl{GxG`tGXI&qaH8RfXrJyn9-m&vCgt zi|FoY%@<$Y*-7rMtmUi(cUM(%)_&TRbv>il?#i;yMrwCu70=+IT~+Q`#bBOR$8%h8 zFV;2t5*XmZD?9MY+6*~RNLRXNd*R#R14gmeI(TP)=@fT=^~>uPCXoC@%O!VbPc3Ng z{_2;fi0>{wW4)?Yh4)v#e4;Y$Vj**Syq}};p-cDIYJgsJhZ?=V`sJKR@2sgy)OvsQ zOMQH`T<@TS1>N3X{qm%6@8Y*R1>ax&a!$gRk)M5aPKfzJ-1p@c_l3zcTbnOJ+_$Jn z)JFVX=BHkk7KFf(q%tEZC9cw>&Py*OPhA>Te(Glk=9NW4BF3onYd?!yqPqs}$Sl=}mnB0tInB*zC$7My7^PrC_yu!(P7?XnSoV~)QK)!<}J{PZWkgtaq zfxmxSy~3oiZL1~;+#ss)3b#4Yc5o?3X6rRs7^0_1T-t@WuVfn{7te&GrlVh|vj58- z_}jUqvM5iV>=iEH3S~_lxNX=n3&@h{BF9V?)rwaMAJs*QH24ayu&FK1LXi^woPobj z=M_AEukdO6@`YFUe7(ZRm3V%JL%2>oM2HinW0sTNHjk0aRg4ahi)@f)8a?wg+C6)wvX7T-nSuVcluF9Lrr0)Njcov`&fot=~T^aROg z;3j@T;m_iq z+^*p>^BkYvp|kQGKcR+a_8vc>{4?<%KcS9i_8_k=|6F{?tE)UOFY@WNKHv58EUx6! z`*60-qf7Y-rJs#c`3aRggIjrZ$!FzQKE0Oby9QsZcll+p z!i9@@;9`D)XZd8h);T|-_?A0w^1xwrsx$fR1t0Q7{#K`*jQ5=L%HR4=zWmB>ydwYa z!N0~U@sr~L(oG4eM!$o1YhhS?A)|P7PL`Z zM5OBT!=P#Fvd#$VBGGH$rEOcMRfI<;9JqA8u)bb^Q(W8#*W$sBiYhK@;-9^$sERU- z>)Smdj zxoPaB73l&CFRBMK@*)EGi{k4w&Zd;WNt{AYi~z=ymIh_*mR^R`choefeCL%*7Wg<# z>pIPRTvjW5y{0yNy`otAIeooP=j%IvU+-!A@`bPW*Z1`zErQ%g5V$!<6GF@34{$Dl zSyDt^QE?9O5EyvyPlajo{jAMHB7G4Vk7KqXa?HDBjqA4w!yv2bAWPtCsjv4h9{e+T z;wwi}_W%yUKOg?`FXWf2cai7U)0cC%ZAVq(5E1v|qv@giNUH1YNwGI|u6(e0yD$}?|>q<@WC{|}F*_4t8k`agc~ujDVkN0N8nWmELCt-xRRz4ahkBmZrfK%?lR zdqdav-5}fY^7S|q`c&xUac=#%KW`ouyGP0ramTGo_H%c%cYr93{5IO(A3x-84;%Mj zO!9V;#k;6bXe-_EzB?UPqhi;sN7M17ZYF%+oi3dV+2^UN)F9>}>Gp`$l*iII2KkV@ z=2Hri5)O*}9sawkU)S{Xl~Yef`=3zaRp%jpDt1THJ$`H^C8@r5ib*k@?vWwgSme=| zpQUOs%~Y$WTGNb&qw#LDUy<-zYLfZmY!`dwt~6FYsV7I$pQCA`sbn=*xcpXQ3Cf#| zQZs3s!{QU3*IT5F-3SxX`}(LlY-$QAo5M#~%aI}1!hPsiQjX392P5#rn)A+hVoD|w zZ-eaT};rmV|H}*p`6h^Gwk80c_be(cvVv$ zO&SJP%tz;n-8}}>VX{w-or*;3#(V{j{^?OM9l6b?OzDvf7h}hhO);rgDWcqM_PUu_H+!->AMA`Or;;6mMasnB^axs_CnK69yGj3`*!^%)n7+~`S&yuCrctxc$W@It%g(d4`5a@fKKP$`JxV5d^8(M) zqRG6Xa04z6yzB$iguJYUHwyMpS8>w@yfBs4^flhFuD)Uat-N7>>qf&QKh(-*Z|cVn z{ulY}H$HJlSOR_#p3*&eC6#;}36$#}EEDT6yQe|E~Z3AN>2X$5&*W|C%2^ zyUZ*bA2B!F!{Y;lf&NeV@M{tsBahB_!LONbeY{glce-!=5ZyURLzdP_?t73s{nq!r zFpV-2aaH6TgVWcfVc4WmlQNg;wrGPa3yQEUxSC|c%t|j7qbhk#6-U>3Pnxd%?D1z` zYU32`=?-)=6i9FNYk02S%EYIQR~O5xHKB2+o%0t?T~=U;g?o+w&2dL0{*W z8m94}!V`$me=X}{{o1uhj~=ZZO$*IaWzInLSi-2T?G|OTdkv)P+OV3vF|S2lkzJd= z6L>U<)2$aRYt?Jr_AqCRuZb~;G8r~*0aW_^JG#lS@7&t&j%_m8yMy|mMc=Ynw0@{d z`%`A9&blAi^-mL?tl4(0D`o8g+yCwm)_AQie`GuT_iWK(JG*JHV_lOqq9qL4_lA9* z=E)0hx;5@v`0}dCeMcw4lrzl7J0lJQoSTljMz629G`;OS?V$Bo(YTbc`M5Xj_v_LJ zR|0B^(wKjuqI8MK3Eiafi!^DIBrlVJb^C(44P{nP7!Z;G)Xn5fxHkrEMTVfFa+@TM z1HWlQvR4fX`Yx~Pha7xA?h4|juxmH4uX7c2e!O}2&SP>I{T{iDe)d>)yx*6sMi2h3 z{`>D`qg!$ri~)*c0;9fnXuHW0d?h=gF0{9Ja=od za3Q=GklLuuQa7)QB52tINyxYWxP-13xPG|h6P**U$MG75%Ka{@7ByVaR_gop#lB4b z0S$TD`~1`4IscVijrDl6#(ChH&;2^fl4~by9f%2ziU&XCzui0QyV97~tI@;J>;_Gs zh8c$_L-SA$Dya`D5!C=+Wmba#W(anMa-Q7y8Kr%XSBxuVsJ)uPn;2L z?aW$VV(`G(;*8qmtkl#MAve4U)23-FukC7IUEIo+T$W?9zzljawsj{}o3vR}xLF!B zZj>c8hqaKUQUf_|jKJOt(rV>fOX?kLDSw=7DM+0{fqqK=zXk*)V+ z0V`|!j=7tF$#A;l#3h%8zONO*lwn=6tbxExAXP*hO_HWXh&)`})~sH&@$zC;*8F-` zGsiJ*8&gKh%xRo|1U4p(OXfay*CL7CGOC#3F><&iJECH4TI*sFD{FkCd(#haBU`B# z=A7TM#H~U`6gkPzCD<}>lOP2Li!z*!b~-IBWo5mW=k9&B$}BCTh9s_T8P_?ki=uT) zB3s?YBdW6|ezg$UN;88`6tJwe=E1jg(|GCxcE1j`nZ{wBge8G1M%}Qj-8`;p!dgn- zuanTP%a;P%^ish#(S@eL%dyQUU-yuGkt?3P%>7hwE|(jHpmeg)JUC(@jCLEh24o!V zH_eoEQEqn@K6ZDwXuDjOKXH$_ut1)lh2y(D*P%F8$3RF_bJ$+)}p>1yC`_2)NC7=&B?hpxuj*96g z0!{%EaJ5(HVFv6OG~|F=uV4t$M=tx<2K~HzNjth`AaVd^-~)iwny<@Ykn&6&yVJ2? zGX{xt60VJbF^->IzSN;ZiZVR{-VvN=uPKnLY#c^{PRvZGXwJL^$CJyK5p9_?0!GRu9PX#R1 zrnb!2u>zc9utqj&fXu^YThN&4I*^uN$Uv)h(}Dzz+6IThcOcVXIxXn`TTC+cX+SP;HCw841*}e>VD7Ek;INbf@CBr| z)3hLNe8QAFzSjLZJ(M;Lika0{7kh;wgnbqEZ*N^S=ABh(;P1iTZD03BQ%*-su`fe< zh1ogi&_2lA>ORdsy|n3q_!$G(+A+$Ln?7H%P8Rz-y;C62dJrtoGXKcQzuKp-0$_+-o@k-+z^vd0lql3lNG;3zZ(J3*#)c{)8$K`kFrgeCG8wck8zlQap~sO z9_=gYPeo>xvJ9Ar{mj37>Ba!OoK?)OLoLiR#V9S{=zzyFTV+oI@&=Bdf_BRtT((4l*Ey^!Suc|GUe;4VbJ<^~Cosgz7Z@V@d!Lr#88O7I8?wP|nK!Xm{m1s* za>KrfWrMyY(DbN1cHWbh)P3H>&QIk{EN`W5-&1hVyo#S2I7oP}&wWTTRWwMKhiE{j zL5N^U5@!u!=3!d}b)5LnyUH-<BJzk~~0Cf%4_QL@6vjKRC!~d4N|ef`cU11_f9O z!@WRokX9wGmtKH_7vSKtgM%4sfaEnXlo1aoB#D4W3Sh#tsNrztk?<}CYvg4H2hD8? zHcJ*kpAr(51qbsaOHKs`^RV=al50EK_dqj#P@ufQy(ld6DyixshYhm|91J4yU}3o= zp;}>M&4YvI^p-HF-_zZ6&jj`Bjd&XB_r~lb>2{}M3myQzlvUl3>ZAk-f+8%?Tj;rA zn3ic#d37$fQ}AGEDa#Oq9{c;YoVMKE;t`i&b5OU{g8q1US^`toLbNMm@VAP*_64m; zOW-(3xMHeZR>;a)zoE6tO^CCftuPFNq)0N~O+x{L!kE<*roen{T8H#MBVAHg;fd#0 z*7drc@{bq#mxo@^dQ{g2AWjj9rQAFbJhf=UD);NiFRWP?i&$CXx9l|;bb%gLJ=~S% zK~=Z##DctLwN!DAGa+r@YelTPG^^_xC__hbNf|5ae50>Z$B|1}4<~wA5j1H6CoE5} zD-20ANl2W6^CE45l+)TLMT40?%Su^U@2mESzPc>*Iq=ACP|CdVE4Xn@9lBv1lvP;g z_)jg?HGFtwEw9^4k^zSMx>C+lVO14w7*{}fO%Q|7GLT^6Ilv{maAR3*i$$!g@ptF0 zDoapAj=xAwg_&Db5#Vs;BRWNJf=gJ`*@ka$%UPJVZ3W(*=<9#K%RaS$wnhpi1!P0Y)zVhM}3&FeoQew}YvKawC6-3Ma8?X5#g~~=z(t!~` zqy?j;H>Sa86HP{?poxNyz_cAt*dGq%;(Y+QV_zx|+>k=Rbn#m7McX6VB-BG-qzVA@ zM?zh*1_y$H$2h8h|Bj`sdIXevxT}o;p&fypO35RD^KC(mszZSeP45iKtHA0A76x%3 zYCd5J)*wnedUBj>SJ#{kEyD0x6)Xm(6;foaoiI42jKYD8g#|FhKnn=p95RXd1fAR) z!w%HZZx7d;50pnLv!@+RKzpSaQ@xBf_*6~rokvjeKVrhM*ByCvVyKXG^8r+F@+d_x2X*TralT@t&}26 zXIu&Z`!l-WNC_exq^5*LO6ZRl+QQ~jOTt_HayMvjA0^zhGl004x0xy6;5(Bsh%qJ- zbP!%Pi&A-vCt$Y=>YlLe&kAgdje*wi^Kyl9w z#UZy@`!&3ZqLK8lLKFg{h+N|QO8B}6iPyut(JwO;=bJ-xhLP0_zA$@qWeu0)pelE!7EZF|cH*zf;68Z;_+kWr z;btwUO;%+-0kzOtgjua1#@y2@>-oBM+}m2xnyCqx=z`DCm4K^u4&dviAe+37(-yK@ zSIgkpm36?fmJ3*aSL_j?%*){r=8*Iv1bCwYj(T3Q8Tg3@hKfNeVWAp`ZLy4%b-rOQ zP_Tla9SA4F_OOW3Boy$lA&wF-h?!6(0-6*VHjT0@%x$epOIca(SIy<5uZ!>kZVTL# z3!l0OIskHKCbp4BCSpSDg<2#>y!~FDdLlD6(zrS7)4Z-Mr%r$Z%MDNeO|5WU_&wf+C8$$(2JKRs%?h|$>r z6$Tb(8tp`IhrxL$ z?9tInd-TeUpMLu5G!oyGroB>JDinrvnvQ^#B5f0eO#wQWp1e}PR1qubA$S(%iCY;i zVpkz*dAma81}~4aa2^0@x^=0L9P2X!2Gh-p$OL@OR#Gjbg*lp%2!gD+May!ons_2eKz+Gd1K5 zy?XK`PDYLJ5ovK;hT$^YL?ia%%o!aWUvETtTfMiO@AZB(6onZW-vGb^8U>O1Jy7WM z_H{<%4Lya8Y`SD;*fN_Du?}60e5;!IMw(XY;vjxx7g{qf$13L!SA@QGBXmsdlAnl>@6Z z(rSl|7~(=Ed0$#64ck@Cw47qId1?9`f8U&`x4iGs;f5MYP7__*pEH1bh7GlMg8xRe zq|If@nKjI&oCq0vV6;(Ok!Ej7MvbqJMQ_Ot3o8cOgA$LXbT(=TH=+JYHJ{m`hO7BL zR%r(#>4t7mY=-?Y7kb5jvX6$UNg)7x@5udUhWNzXf9wzP=%^ho6b^E=K8<|<%i7x}m zFJ+_rH(OzkMl{iK*5$UPuawQmr*fDwdgb9Nh0j&(%L;YdP#RkI4&)+ZQ*36yBS$2q z6*V>8mfC54SYF$ZREX$A*I9QqqlMc+ueW6QYAX2-`>pn94L1xJJHnn$$=ULVYTmS( zW5c>K+;o>t9$vY*ycDdK$IAX_aT2InVk=Q-dA%$?Pwfq{g_;qCkv4+dQnA_MMjsCH zJ=#pUC5{oIQ>i8!sT7Y4U8?%b1!)A!oKQt804K#%o!=H!bF~5%4!a>C-*`N$a=G5Br^2z*(|>yO2J`$GPdC#8I)3^`zjAa{elk(_`N!)s?YgoQ|GU4sLOalE z(zdVu3qIR)2Oqsuz04Oh2p?TBEvPeN9(^6l3+|46xf7l~c=PC0guwUpX9uI5r{`@M zK6>TY8{U?-NJt>y<*~luqi+nxpB?L4{>9NZ%Kl-s^O?DL#!p)v#YZp6&v?VXZ1`oE z$)i_?kMX#Wjj)

    Es=~!lf=+;HQ7O{abP#>y2%{F8_L1HyHE0y)Lhi_vFp+{&ewR z9x~>Kx2KB-(=%*1$rBGR9)ITHRlk*uW-wtjkr4RutK~$pCX%k;qp!)yzjgEqPo=TU z%B`c9d9q=(@${#rwfN|35A`9}R()NSy~Rf_Nl!GV<#>DX@5;81w-Qaf_5@6z%6l6#JUgFLsWTNw}FE*c2#3SEnIeV7~3;s%i-}n_o&>%4okZ zZNBESzftuQVqC(C__O*Lx6Mv{&FNPSzvXVLjQ7m=eG!g7EkE&cDH|?1Q}dzM+6qG1 z%8B;k@?-7xVl&tk&xxbfh8o(^{8k!yO9kPqR?lp%r68=vY_%7gPfXj3&Gt^+UR(~- zta;1BU))}7K7PEtxZ1Iq_G0tFc6+hey;a(a%{S+?7n==q&|X{~0%bIXK>M>l1n!gv zy=r^0`TpGYVzY;5X)iXL{C2%d<)acY$qx>zUE8XAEm=sNvZ=at<;`y|HamUp_F{7c z4cpjiFE*QhGjwPT#ZAnLT`BB40gYk4=UcfXSD`CTlnz>Z+H9!RUR-Wy_4Z=3M+@4E z&9>U@#YeB!Pq{HqKi-f>OfZj*&vt0m`RrhyH6#e~*3qlwPtB8a``hw>n`u5SL1kc5 zs-gM#oAQaO`4~?>PxOUHFH1YRn#f!5iZNn{sAGZ}LDk`_$aAx3<4h??;Q}q#>EEv5+S#mKjG^cQIfw?_~!4)%qWwVREJ64z|r3 zes_)UqF(Rm(Q6dVAIciw6nw+gx_0{Xk6NY|pP3`Ob#!G6{@`$qzi4}McAn9!+|12Y zX13bgfnq5m3#jUC__~yCchuo$CGP*`6uXp4ji>dZ$_>yGX_sDBVNPN~veLYO1=Oi; zWQ>u6lE|F$Iomk4??-Pu8e)@r!1D4?PSY*(e)|(SpsO`ZsfR7{40BoJM0C}n(=x-N z&1EGN`bA2wVgfdN4VbbPC&FGmh?(ppbHd7&{PBQ#f3KW`%`l_Lhe|_mlzt)U|PhDveR}W~b7-kl#HpvhQ z;+%uVEcfaDb-YyC=;OpjFl3Hx?pBtL`|_UQeCn}W0tFTBzSyK_u01rSRvdU9qBak< z*zr8$XJf`{zPWV!vcRaRvU(6I+6n#sMIi#`f%Zf;YNFasU?_R?|Q5FSS7mcbOwRUXS) zH=vLg5%|j_+1P!;Z;Q%2;pd6%;<`~D)9eP8k5(~&rHr&bF!aA!9%+=o(9cvs5IQ2< zcdfunS%7C*7>UNw92o80hC-}2FmE({^zwbAE&K9>Jo>F#SY^6=KU3q+5L(JoMSl64 zCw^Hj5cu7LfAiqqny1>o2a(>|{u}e>-x_qf5?x(AF6`VzIY^H(-bILJlcLo4k8Jl(xBruDy*8@+f7<`}&+?B`8dd(k@}0RxmH(goW@dSSED#fGK{pYq z%hrp#G^#{6h*zZ(^%IXoP_LSdpF!6dhFJ5260MV_zj`bZK{Q231h--Q&F{Hu(vovV z9w-iD*^8-*DK)I zgjlOplchwGt;n}ou9fzF<%KL>Z0)HK%8M_LA$psgg9OCO&M>Q`(HsP+G-8f-=aGIb zcBJloHpebouBaoS0@$7D2<0gg)=cQ29aai*h}FJSq#-mI=Y9H&gBBb6D@~mvoKO=)o;dh0w85c#uny`8PI~(|xOZ z%nywyk+EgdH9^4F`|SNZFFtYb-+Eub7rVr#~eP@osU>RbGEUV?E7^cHc8+rPmuzu5jS zWU!Ve;jy>o!S-*8<24POX-n#7>j<9y+^0I6Hs|E2l!JN#MVqHTk-XGp@5 zP+5^7q{19xJFVddQp7-HQ&af&H60)L#URrNaH~luKqm>SuP6!%nkI1E)hK;XJo%Nd z(d@<-l_A9Lzr}vcFock|0DIj2ycr3hIphsP_=h~_CNS3(SGHjYzmN=}tMa12Ie^Bp z2#n_lKo-*>*9UUtu^0Hb`5B~OF8j4JgxmMcBTrsq+vXAY(EK@%11uN$_$cD1c$@=7 zH13)n<2}C2+i6(-RZ<=S zf}hZG1lnfUak=S<`MAM!+v|FB!0v57V%(!QSA%6w`0O8jW&6gVRqV{cCL=6M!{ z*PPn_PBwtw;6LK;>J?=ev$=w_^31O$YcnTt?pBWP?F@_dl7S%&23IOU+DIoSax=&U zteF!@RPa-%64YTa68;MI)n8n?^%-8O;*p;Zul3DYNLe40N2>vBK8HfrCj3tT`H5iE zf_ZeL*%{h~E7F|5IonuzeBY{Jq@*v1x~bt#l2H3Dbwh-|&|1XgaHsg3&Mb!M^olr7 zB!R&UI&ULOM}4&(wHYl>3+TrHD?4dVL~|((;^^UAW>6bux0$#0mzR&y0MPnG!aNmu zfJ8O26)d4BV&Q{mdZo#iDv8|LH6i(G>&r_=`Slk5Z6Yk{0X^H!JnUMnP{TmbGcD3y zpGOenBv)xcR!Dt0F4)e}v5)a%<+a%*yQa7Q!rbKB|GfO`FU?;aQA)JSvMhzN%M@2O z)O~?m7@Gj)CrUw1W1|RT`{F4j9I5@NAJL8-ux4+)7)nYBKFN)?JQVNfbA3Kx?ubUU zShk{qD=q1Qge)RQ1G3{jNYOHB1>;Fm0k9@x^@z?>krA0>6mbbea?*U&=nS}Qa}TwF zp_Kj)Ln$?>8nDKaxB|2mBzxD4i1m3rV(+@-Bft@TY}m(4NTs*#-nstq_j)&*QA=zq zKdod>g$50?=j8#AE;5=(5(#dD;-Y4(7ub$be2ET1cmV!R0JyCbmP$+ql|Y?9Kd2n{ zrzZml#YU|yV^Segw| znkP%3cn5{z6LYc+`tN-pUSWHDh0U^+_uyx8eoaut2x$2O`4?Qrhm(nVtPIj*=>2`o zKW@@~in!9iNqRbQ04y0bIWsb!P-rxVejrGad2BW{@B6pd-3PrJ>LD^Uq2J&Q9%<33 zGIV+9622l~5kjcIAIbpcESYm+rk-_w<$%aw^84|@?k*G_N5F;(k+rcknd|bJDM@GO z(}rRzN38^%qHa7ubt%L1eaNY12k1K`!ay7K5_@BMM9Uqjd<07sso4if?LZM)UJY!g zWYX*Ffru27uECD&3<_wi@tE8fIinR@R9;zS{Dy3=6dSS~F59Y;mY)jSw^N>|>HTQZ zMBtBj;Fq3^(*0cy@V3#IvOP9r0wqfMBJH^)w^>;wHYdhR0dE+|JL0>jJcnYNkcl6j z(M7_tie{!bAfQ6Rg@oU0_($_?qna}JNXbUL<$sSmE+b%sXAVl?itCkt8Fshwk>ory zP1kZEHro~=%52sg`3@Y~hr)w#fWl65R7T(_W_ZjZ$0-fZ)m1aSGvv}SZP2afKx{7Y z@}qCOHt%L=e=Dk=9y1)*D;tihY~JmJymYyD+;n#vF5zPe}X zalCwZ9l@H(6(O%Lipp!Ez39(P0xHeuU$jJU1b(cuFf0O8aITleK^C!^jtf6df`Ce7 zR=D(EC2m~sO($iE43)= zdd+K!?NrH0=1EzVbxVWM)|71odzVVECtjZ#>J8Zv>@)TOBG}7PQgAd81x^Yr-=?fD zG96a|q|ldV%rQwG#)bAmI?mH6?(hJ<2#Yi!HGqDBms@rkAlVh;KL<3mh>nXTandD* z#B=Q!4aZ43?!~_3N`7uNjQa#weQtiPIoFH$xv#fSRZUL>8FEn)8!$5^vVm^*jBa<@ zcsY!hg(T4t>)oo_>XU# z*u>Hiuht;0KDfZ9KAGaX;E@=D-Uyl=;Dv{y=9me zVHR>l(;QCUJ90B3+!E>J#UF-??8S3f;+7WoQ4#v0>O8?=i7YDI3PSYE$XRPv_h(Y~ z8`0beHiV->7*)qmiaT1FSUbj5v(ijSRxf%eK3$5bs&BUmFTMtU41K`^2IIeq!}`x( zpD&9lJ5WoVPz5?kMU~YPosLL04BBoh-x}kq>7JM+mB5i|Z^{K(>rj9zZ@g9=OZi~} zEoj(;)&l32qNL^!MHVJocyO?*_DuGrMCgtW=$Flg5Ewif#DJgav1D@9FgzS{7L%r(7Qn zNDSm|gv`bw?ZXEHS)__sjD%s9sH|Cq%`-AKjq+RLyE5)hHMII0|KxIqAv})-gwP%D;9ykgTq}&9JW+4MC=RS z_@Pcm2XflLiGE2bRU52N-&?oY-JV0-t6UaBtPOYB2M%LQO`>jfIORz$Xl)fB zz@;j}AJY_U(pd~SX?Ei+I?tKsM@UMfHL=v%&6o*RDYMme(JM~@4b8`{4k9$nsewo; z&uEooB6RBxPJRtpGiIL3DdPmnWmKIKZUS?KmdD*(b@c(&>M+xI+sn{7Lfnf?$|$2u z4s`j?H(qNxzfBK32PHgV^TTPZw3&(WmMbs$V|&hZ+Zu#TNfM0`$)Rve2*zYW>PB>P z3)MDwG{z3uJ#!$&9Zu_J_&tS7V0CKR>~u+K38br`Sj)doZpD-IWO*z-RIRL=o}@WL6gYDpLdol`78+KPPIP}vrZBs5+1D46oJTn1D(9JY zXT#J^iQ40@7}=NRzUDP{>~SZ1&wC7ArwnoprQyMj8BR(^r2w{Sb(g&s)v)Y{v=A82 z3ldsKIh){@61POL#~2%!$6qDZoSusELNCoht2r5~g7&FtkWimeNTbxOsg-KBNwQ)u zsQ?%zraap0=Lg)_r3EL?;~`5BR?T>Bj4U$P;cAF`78i+9%V{3-(-)uIOXYqb`OL_t zBB9y@0kPIF_t}t>Q8GBko(fZ8F83hXY)Uf1(zjK*oK*NvNxYs-z~(k4I;oWTR+9{= zq)di4gTC=v>tZWqvz)fl`%^Yq1#in0Pzq={99gcIE02Jo`q@yaP2ZO5gr8wgQa(rc zmb@71R(Wc5Rk{x^%1t=|Yq0+5_YChZlU%x;m}4m4%bD?dEg#RV zH>@c!8C5kCXQuJ^^;(u-%D_K%rAf=?CPj(KO9e5djMu98$Ug^^sHmcGF4~!hG8mVq zxr-Q%$C6|*nZ=yyeTSr~oO-6-$-gsw;kBwkvidRkU?VnCogTKLc(jhi)Ib)Ddw2mE zCzkr*a%^}pMWA3)C#G-l1eSY9Zl>1$OMtsvan+MUE(ngXmgtj&Bnng>1TvknAd>W#C892KVj8)!*oUk`uYu(u9HODHJV=L`Zi1{*n zw45v1*?m2f%Vr0oPL8G7RZcDYYM$3rjO4LOSxwGN!zN5m!l-rbUag^;vnillssf5lXmje~$Ozvl z455?{I6w=d=EMs_GOpvcx5-5=pp@)fg78rkX2(1Yf;d`OK%pbpql%qbo{lhZ)VLX- z3MIgfAeI~(Tl_HLoEH^P61?_IpgKdi412PGvgWr(Sut6SQGL=y#e@Lz^5ib6n7ktE z6$sFplvZivI(X;Mca2Xgx&g`2z)d1{71S!PBQL8->FHPJand4kH=5~hn$>uVPOXRH zwU+T_gHz4|3Nr~!x3pkWPl%$3Igb(XGiQcspRA?1ekSgr3a9b+~=y{sRsmcMQeYIXxlN2?7A%2AT8oehLjt?BOi zoUzQ%ej$w%bWc%y;W>nF19|dcV&f%3cX3Ytu{o62kAHvZk^D{@G*~mBp&lC>2%c}e z;K^NL2NE286FfsLJR@*t=D%>Tuf~4H_LlC;w`vS&)iA%_fv}*1f?^(z8*{-Fc;iNH zF8%cm`WeSlO&xFEMwX6Bj&DtP*TWS>n8pZmtiqV$h7{Nm4`*B_|63uY^&Ldv1yOhZzV>*n>zJ-LacBmP=NE5S(A1Xq28 ztXJ`~#hk$Av~mY#bf)B(n~2>nrLKT=Eb&w3YMQ&1rQ=?$#%*eq67++`DrL%?qa%S- zj2<#t3VhxfVW#lWscV(3?=Bysu3FSbgs}&C>Uc9NH|8|5R<{)I8LMC>DexB=TL0>Z zu1>$ZbPOyLS^%aVD2`HJqw%8lne!41Sqr3zG7m4ztz$YI!^SOTW&=w{d!-^c>Tx2U z=1I0^g+;=0BXbmyYpgl6OUhGDt3>A3Q#AeRyb+#jJyPQ*9>@c{2x(iwwVJ);J!K(j zOSr)JO-4<)Rge5lL&H&5Hs->Xu^BA}STSuIQV8_lJ+3Zntb3L_v?_jMAeqW#H*yW56`6Phxn2;{qq-&Grs zx);lmN|z0f^)a-J9+4U}5y_?T;e+K9u7ng`_lh^A?!7y7C_rlw;tsKS6BcPCVhI!b-P-wzX;{*b{`<9`+ekg` z-=}nRATi=2S8ryHQ#1+X^chM?dV*8ao_PA zB4VDNrX78?6SA-!{U6E&P+fH6AJi9lT~|4FO+u+Hy(q16Lf%+HQEbXFYsO2ikNy$Elsy z$b*F15&PBFXTDB~niMK-!`W7YeW$+uk3W2`<#Pv_vAB%n%j~FeedUQFx-p7-eQa5; zRWFM1HJ-B6di=h94T~(blMQnWTm{#ZBva#_R~|e&PD7tO%-bsDxunl`bq zvCF?*xBT04s=vMV**;-|`K!l|yR~P>HNF4po;*CwlagluA^;wHlB*{22=kaUWoPr; zgD|gKpL*ETR^=yL)hpv3d00=kR)z(L9enj@txjCMiLp@hJccO)R$DJ$r4;&j8OW1c zj-al3zw?gugP+jPVqVfx%Bd<-wIPty1=*5(P2MSVXZ2f${1QLMN#D!_W>MdGZ#c|* z?}=HqSpMktiF^SZS#Qy$D$9m#(*IgV@=KS3bJ89RiADdtwBa9p?VURxKRw=xPcJi;q?m|FAF=di1D|68 zNOa)(tYHB|F&mkou6TgJAp3W*-t@8gviq3sd8nifb#(-ccrv+`jagx~dh-9lJ3PD; zi_@|`nzLNOTzO0daR-a#*Y}3FdgD%QEGK_aHPx@Sh<>sX1@+#7t9#B<|JrEyc--dz zzF*oU-=*&N2RAXSN_kDzn!dWiZkJdGCmE9;OeEaYJT5N<$rtuWh{43A$PB`^6bG|y9 zW{gK)`j?yv^X6V{jd87>UGs?Denr0i&Gw9zKW|Ux74uX$ej_`DjwA7MbRlkG;h_yv zC#InR?pf!^%Mo_3G@sn~)qKv`i`HbmDm!t$+5GCWX7fj6C10Go5F- zSdWPoBQ+Rz4_?}@6X(up~^5c&0-86Lf%5I#E@lJKSTxHbFRiCC1Z|OxHmDo ztmg9MKD4ItD!XvLnf%(bX7becCFg0`MCuc+C&)oYqk}Sbp=xu$q!){=h{iQS#CXPG zvIFA<34`B$4wm8dRyzeB`}RDxsHqgZWGV$U8wGL4Mlepzp*2z7OUYQHRtu@R=xaB!p7^6piWCu`MjrPCc*1|2x-HQ6I=f+K;=VLHK zO`e^PTjM=5+)W3DUE}c~t`$fB_g#?6G4A3S)WtGB?VW0XIgFZLF=|sft>)AGTIY32 zKJ6XoqtOtHh^%C#$h$@(Gp5fU+e;;an0j|=o~$xy-0)<)jsUJgEg!peYummd*>iFy2(e?!6$F@$#V1|LrV$-;z7*sS|2WM1ntr=rN_4YHxgxV<(MnSdk^Zy9W3stN0` z#r*P8WFpv1aP7cCp9BnXyTbx6&{h-^!kh62j{B|K{KZjZ3wfE73$Zu|h>R&^USE=h zkYR(a{OIlp$Qjcin@gMpp|9u>vMk4~F-4T%;Ykb&m@A+4!VKhGcuEZ&^s3sR`0)Xqv^s>|?=X^j^S z&Hl&)Qc0_@vp7kWU5E!xt;v{v_t;`>Ho@i?el6u!UqJMG0$Wz??q4KyN<0TzeNtW}>qeVM=Dolry)5%pfzvOt z3p*_eB#vnU4V)@O8Ds`Td?t?z4IJgs9%~0U>NrIkU0qtV`2=aCA3iQxOU&-k=A1z` zXmf)$OCik$ZFZj0+JM9pf(+QTNZi+uDofcTrT~IjH=b+-Iy7n$^hhMFM?tfpwF@#< zN1H)}nt~dNX)5{xFKregNGHb7E20x8!n|Fi^XT;v@RM4Y6Z&FnQXK%>&q9#(X9 zAyM>asT1Nn58+@cj?FihBH+t_9TS=t60b4>Iu7ckAF2i5x@K&C|Q%Qz>oTJ!fp*GBaMiDS8^T^NZ;?7UYct zsRq1iG}@}AvUNixE@OM9hqBMhT^c^GJ#zZaHM*@?DqX8;=d*ns4U#?q$wN<*-d1QU z$OFn64vq*hwJPGY3iA6PDd{tAJqnr)tsRoD)+1pStPvXch~;QoTRo>o!clRUMgWw+ z%}KJ$0^9{$mvUV|pqP^M>V8#uyJwuPgG0FUDKw&j(`fO=# z^BC@~Gom^FF$(1sHP+MJpeWijM3jp8Gxb2w=K!VLc@s42*ug{PX-=DKPQ^WE=VmCVdGnc^vj^f7v)Mrp#Pl?F*8?$~P9AM%zCX{=0|9`y zU9mPvc){SQSt&SLMiSbMvIvr&lg5Tkokel8!N~lQH#Xk zyhu-ROn<8G2cjnRg5hnLKTvRGR$Ytmg3w?a`FvfgO=N*r$SEeY1D?VX}N;O1&yIFPmY86Ng%79RO3^FV3&&z|K_;qW1D_=9xL};{X$$U zjZkagie!sRwudM+^{@@bkeCNv>_x7;TrUVqHq(*i_aVs=kJsj0mJIi`L@JB)oK^hi zz0Op1+iF+gDkd#ixa1fq-FG^6;Qetq#7T0@j+c;Q{POhVnCSk5Aj4!*EN$P{*ou#c zn%Xzoyr~Iet-x#4W{q*=C*&`on9Ge>@4ZiMey=oz6jxr6vo*H7Z$I6BS(-{Wej{s< zoqgJ&?5w&TO#>L${F>BeDp$%53CV^rD~bZ`YL4BLhf=o4G3NEK1H$1PM|z4;I(1c^ zI#KB4V$&BUQPDPXy{u|8&wZ3z4&exc)1gJR^ zJH-Gy^AmLZ1)&*r=+5-3^Dt|Ji`Rt1pDRW#vLqzF$+z4PuM&I+kXxnbA?d<%lgOuD zD-`m@#K=yco81mUz;iJ&6dey;Til*H$H)gHxRpW@8#>p>NB%+{6J5zi?v>l01CY;_ zQS;8A7?EWB-f-`8+PgmQeWdQI-hb7*J}%qBbkj4n0k2;;@LF9f2E1}Ht_i$)j+c6* zAfnSkhZn>tM%Ap!T(7`Nh*ogyc?nQR6%uJ`h{QFLer@xtbrZ)yx)!#;+GPc=!IRIm z_4(ubZG*hd!Rx$1HsEywUN_*i1zy*KS!otZ-8`d9s=!du*Tl&r*p^tDq*6?SMG@ET z5WV=Al?9d``x5tO+)KXjE1ZR3lJt5_m~cwor;E-!rQMAfRb>TEh^JrTBt^z5csZDy zo~(6&$zw1688Erpy8gUiGS7oY*62|_zU*LfO;E3amakL*qXDl)7>5!)hl40Et(R6tQLYj?ov-OfxlCR@s2C zHrR={1X~UahtkkSAweKHwwQ^;KfB5yue9)xD#j!wMI`V5HtmFR0hF+tlGmOTZ3*sW zg`J_h8(GPtsC}#pVCUI859STBft?%Jxq+Q)hn-PE%2^t+HuR-bDq#)S2|FZ{iEUUy zc(V>#Y}*$Bb_PzsVz+{wU$WKEVvy?Cc}lGYH9p;|bjf29s0iiA!ptV8O?wd?CeH+^ z^{HJ3Qh)k<76~&Dbv3kbUWiHr@5I{QSBRk(Bg}=VUA4*^jM~Dd`EXB*dUpd!9s8~mY&lr9#QDl7(x9-kSD?U6z+bVe zXkNyKQx#s2g>GZy*81|Lhoo>IE_I3&Na~_ux1nd9lR_sDh_ zWe<9eN4i5D_27*NgE&LdgZYl_moiTCXIz39vtk@HXgw%?{@}869BV3wHwE~YOUzpnDnzSlH`Ea( zqZu6w%BR;PgM}lE%qB?O_6l9Y?&h2G*p%m5aM$n`A%aX)2ME^vi1z##>l#un-PF~w z8&C|ppau89>w8HYOG?n(f_t!K`+eWVp#rkgup2+=tl+M9tg+g8r1IgYO>z9MUFTW8 zyVJWruQ3hOk=MJ@W&KGL=!+W=GT)%hgy$|~x(G)KvrgFnntc9ugZ#$G3 zwCTS;%E$A87b zS=bIeLa|McDqVfk$KJ)KE4)5jg(;gEx?;2Ln?`^inqt@&e%-f_b;z?g&H|4pg#=F~ zKjtz{H6~Rdt!;|19p3jRlPPCh&8C;nGS(q`p39*b>R~k;cwXuu9FJ0KtS6kH%Pp_? zdJ7=dd_bINHzULpL;nJ(O{21vq8PU{a(`T8aqKSA3aB3c`aDvgAsyC4ay(ZOLS9APn=D45 zAlSU|IQu(!Xmq9efA2s|h@{?8b5#Fs6_AH0;$%jidyK6Z?&SyBWErC^%8at#JRAJ- z&-Z#JDDM%j-h=x@<;hPDd+&}X2l;@kygS2efJNH4_ty10H{ZR}WaMp7`dUzWm(2jp z1!gch*YKJo1zt|qIo_mU<^)7@5;fpBig3ILhqR2OJUhnBBlUUk1c3A?qfx-6SHN~N zmtT>AG+nG-UW{Hm<}p0>TgSQpqo2J;-8(!v$OfZtF!~0guN|YK|D_#WfonWWf&7fb z7&4?x?{aKMekvYYtw+HZ0;7k%6R|Qg)@WbOh0#J7E1jyjpWr2oiVm-3YJSkwblTFj zUSw{nDFZ&Mc+T3lI>XCgY?nO(GwX#J5W5-dv`5Y!SiHk9+T%*Lwg&|sgtKU>FzWN_(jHTWv77^g;9#fF4p(@!p2y6eVgU4 zy9mGrTdoU$wIhe?z2mm^Hh^tRy8p*D0a$ykO?OqL=9i0dtTw&qm!}u~*y}{Dz%{{7 zKMW&VXHiU|uGUWKdD_k*p{F8sGsM5x=*XW-`-aapqvJVqD>C>>*6l}AWhbJ~Pe=4va?Gv#@KQzX(+x?FiZ zJwGo5JhH;GdNmPOn6aYB(=_0RKG~xeruykvj$^sWU7P5pXv+gUhHyaG zCCrsz$6LPBr(2UJVFez4HtEXqEFbO;#D`#Sr1uZfok0e56(lGNOtblwj^mJT)T8x2 zs)jpR5+(e&G(tO85*0WrIn4_JWxKa}Z}5odQ)p?N=oC_{#QG{u1p#$>#)7jynKZYZ+cwJjWvkU6!vcjG1x83JN-G zYqPpn55{VcTla^Lo^HR+MvlIF?@sUfeZ7|*n$+f-lHa_iCWGOg+UecUkMz!Pf0tC} z3RJz0tGL=5d~QBbz7rq3x&1BK((gZ*O!miH*RGA!h_JJa9ayZ?0i+p>w@c5RdcT$(Qyn+{~MPj=y-$-29l)B1vw z5-FEa{nlC&R7Ja-dw4SH1goIL^>GMs?aa4V}Re)iGDJ< zmW^3gOc?4`S!DPJ?+kZ$Rqu}8$Jkb+V;`%X10-KR9P9uR{{FA8eB~DvZd+~nyc%wM zuU?7d0K@h_}Xarc-&{VzprTQ8ISKC?(09e@!==8-v99W zjk+>;y7Mo&H81^3Rx{x#b|V|^9PI9m`y&Z~eMP?gZMDD8a@Z`iuJPmFd$PMTGqE4t z_~FdNB5ET0ED+-_a=ckcV@8dd*-A7VbmT@DFS8PyLG*JbHb5#+P3-*rXwC6ecH?{# z`YYRq=92l`{CONH_W0S+sV9{4)!~GK^38-sXPD6K@o=x2(QmeAwETJdKE3keJ0ISf znNK^Q7@lVykEbN(Mh&=8Jsn$Fl+bqOr{v(le5^2^j?BBcQRnPMYcgMzojBiYe)UuMss`0x$1B_d1RgW{xmnCxj(L-J2NJ{~WHdzK)zMCsnCZ@aKp9#UyRd>M$W~4bh+8LD@ zi;1+GcdviYf4coL7daf*h6P$Es(f7} zp4N75`*A@#Q;YApto)bSJ$z_+lY>=4)Z6FdRQ%VxK{ou?hX2~|Uu);TbdmW5epc97 z*|cjWu40K5;uP*6Src8G9k&xiUR&jn)7|KZ z|FTi7BpT6?Pe>mV3%eUr+P3V(^IT2*kII*0?0RC6be@y{I>m%`z<*88q+v|D;lHX0 zm8Rqs`LF42)DwC>{tIlJt5_9enGk5=XO4oXE>ck_#VMUkAVY4zCHz-2pGnP`oQ?lF z#cX!Ke@#zgm;6^foiKqb@?X>asHgKB{1;^fBxZyH21@EJ1)+c`Ih$5S=aQS-A^zZ0 zE>@V!L;@Ah%zvF?COhE2rf1O1BHdbwmHYR-!sar6c`beE6qiXSMK$V?5n!wsIL zPNW`+YUD-<#_BXUFo6(*qyNfOnpNiK+c#&MpD zzzoMnKgNrH9?#{6TXxWo6S@=YB-HNoV~xbnxMx6h(d>?Rbz`HkA;{KZqp^;**fnuv zByVt!subyk1@;P{{8qHllXP%xtpDq+kb)%k*BRj=xcEFKMPh*!HSv8&U>Ke}Je$>-> z4vtKbbVuHZZ+V2sz+d~6W5E3u#&vj%7EuzbrTle$Z@P|T=A4-$JH!VQ;Fp;r z+t~C37?oK`;c(#tG9_fw5>grN!w*c5mUM`(!wr+ z!gpgGdcF=J&^!XWTx1y7kr9d;1%CP^keY>~)VKDO+HD`dUHH*7#bX z!qoMBYPVj;+@t?{cP#ns zYOkm6kF=I9^Pb7Xym#mN%^Pp`RFAH)$sV5{KHeMmWG8!rNsndrj?N}y63wPtQwNg= z!;y5{vqjlFty6k$tm{pTd-q3*?N5fiYU}2&-u`er8JjPd&70v>@11w7AN*vx3G}st ze6V-FrzVrpAU%-oc-fMSQ|)5EbtS*V&v$8WtIqj1-Wv|{-g{_tX{={9+GppR^mi#b z;y?RC(|HTrzU~gItyuL|R@%YV$@zA@$$af( zo-5QHPg)Fd>AmqYALo)RBfcSzQ^di6OXaz>rx%~hlhq_eRUhu*8G<*G8FH4)+M=Sv zU0aY}8M~C3-2%4~+YRh^PR1&-Dc^Ew_;j`$Z_5t*4tDBx%@Lfp;d8ZBd{<;%^D^j? z%&X3Su)5%Fx*IiFa85E0m;1OVQV%m1M_gyTnD#OZH2gHN3n$hErabe=pV^6xki%Dm z!CA??Q%qcKikOUSLa%R6wMx zeB!xgS=&7QO{?esd>4??RjX$!jdxDJ=Um^k+KKxt#%VY2-T3gfb?=?)jRD#w8)_}Y z+;dEDmJ4%DdbUVA2`%D2W*MP!9WTq2o!KyRk(=k9>!o3&Bi^ln?ZsK-MYhtK4j`Kq z7zGIZWk`oo`N3l=ed4V^#GT!qd)^>lCL-?T4F$HLz*@x83#7n2^6H%cQ5S*&cpy~1 zmMU;SAKN&go{ud)60n5 znsx`VZp-LeO*LI36qK;`^gJgrT<5Z1? zyP6W5l^$C1iyeFh_v&BoS(O#{a362(A^)tZP&;aWxNkj>AmEW2i@8t@Gyj(^Vdjsj z0oH*rPv$_?X4@OAxfZPX6S;CaGTW{%oYG@^Z9p@~w78JDwo(btj?lLWd?FrR7Y=bx z#{aZx#37#-r%6Ux?G_6I6KgsH^>HP za(ivG7GQ&o)Ni~`R z7-1-xg{@kOZI18f`eK-CuLv|*Zw0pNd#ra1(7ashorP#KXH6_Ea8_E-A%v&^fi~h~ z%SKp`gjh}I!AW_+iIr-7=9Zz&pFOu_K%@UG5$9@){_`TvLH;xS&-{o_*3w<}SjTXv5;Z7y*dUt(n++0x3Je zn%inu0a(S{gR91LD*W$sDqJ_Z%UbIxzno?^mDsgcVb`jQVB8z*?(Z0lDJcXb`MiJq z_J_CMHWJPsmt!33H&CO|fDaB2CcRWo9&5eV`=L%p2WoWKbA!nPRI7RK12xJX(5t{d zQJu+s=?%tcR|{mS!^ak}PL(3HNmVK%iH-JE?0HMDVzlbE*{n1_upxOMnj>2j zVa!QJ0oz1PG0Z1=Jn7xs%Lf{DZ1eq-;A*5Z&G+&i!B3j7t1-vEzdsyJdIh{dZ&&Rd z_Qu155z^t_U@zM_FzVM@ID6{`C+_C;8$WovZPnX^=U~?3&b{AE_OF z(wB2_Yd9HcGW&Kl65rh+vf3d>G8)&;z8l=V7To=*TpuSdjWdN@RdH1K^6us&VMdXQeU2|xgR-5d~M)&C>CQh@H;`u8ZN`!(akg4Yb|6iE$q(n z`&RJq$zkhQyNBI#2HC*w4eZ|dm8`wRA=iutk1;ShWQrs>JvoS4dC<~zFr_Vj{ec=iV)5}=wV}yi zA^}gP;pDZl)5fIR9O&))tn`2SbamKm2T?3}paQ!;-K_m2M5}s7Hw!G&^z=nv`z_=k zkZ%QXK*F%?`3c%l9GjISjO!raH}svM4t++&+aQ?oGFrw#eD=JSL^Bk`YFO~R6vX{U zAt6z3Ej)LT{)BW2sXQvI+)sR;PN6u+0r(eERvp;=goV7Avdk@ZM_X>vN8m}>t(w=n zAj)nCh$ctJL9%TW)&EhR5?v{(7lr3I_LR`5_yQ<_8q?dyxC*J3XVrV5jmW3efRGgu zo>R8h76ZML_Z|;N4}1A=Ps{7%#`U|`dml=*|CfKh*Sr18e=14bs(0A?fB#aE zp#^7s&Iq4$_$Hdh?#Ly)CTyNl5qDGDwhIt<;QC1(yH1qoP)h_Qe@0ZkqlkC1Uy#D% zQmMAAe5-T347fg@ls?v=xGG^#^0dzAUI{{+7q{*ahic{9DTXDN zyL8@UTa-HOO)3V`0F~j!VrSsE@}#IF2eb32%mSXAzT-+#7lwZxz9(1!rm#UsaxNxn zb^3k?XSE>x)sMF9((BI#S{OFsqs~z4z8)QzK#U5r{-0f9*4u3Sq%<4DK8m{(lfjxN z5$kE){EQJ3r-N$t7&7?)x20V7-W^XUMGwb4*#)&X#8%3L!EQ>%YbhDu>kyU744Qf| zxB8keDc(<>LnYXE>FXe0+jnw}J#tDIY!YJ3=NCBg>4JvfObq!5ZgzE;P&AJ0$Vv5= z!k8~2F>mkw!=kkiT~IGR2PT~}$Oe;MMoju=|NU1GYw_e6+dU~UsREKRv2njbwT3AQ7!U4v4y22)GPZe`07#U zTqR`LiLEH6x4_q!x2Lqk;fxk}VU!jaqj6~(OjLbu-nRAjUl=XP_CGKG`b+cIgMahj z-Fvoq%+`oERM0RnEqXt=<~e;HNo?CN6mqtofl27 zV~RXbnW>6`KX2}d$Z2rD`pMxGklvBc;g8&V>-wFW@80>|M$Ej{dg&i`h)kOctd!)h z4W4GPM}S4*g)zxueil*-)tJH~WpP8t4YM#+#hA zS_%Dfc7R}n(m-oZFMP?=mz7xn2U(%gFXzH&A!7AXh*yVuNaSys&i;s=}IVZ$G%~uyvD?wkm*4RZPzZ0cnnx zWR~x0Fuf0)$Fqs#7C$eF_~HOq_R=B3;I18R1(BE}Curn@1pqd{XgTh?ArkKz!2ZL| z0PF)bm<*(JYMXbXm9f+&P0lEP|6P|j_D3?%TnxLUjCxw(Z&OBXX?{~JQ8rn-!}+jx z(gtf2g|<$??@v2?A(<L;%SJZmbkQZ7h}5Z}2#ktEDQC$)9xV}j-8n!uTuce+EZ zRVBzdGF+H*L~$(S96!Wz*)Q5<$IFUg>7bif`}??bPRl8sW7v6vY%uHw!)|21YnT0! zt!}3{{#lt5Q%LZLTTfGvO-}ydeI+wO-! zLUd*oW_0e;Sp($rlZ{SHELP;_O&wc(LOVzuo0(8f-`U}->5mrL)n~JV)UoMl>@sz%x<5sieCGS}JgH+;>O)s& zSS<=?8sgR`WT}-=u?_<#aYMx%tuU97%LQrX@=U2?tIuQysbe!U`6W#qd&!U&wa5aE zh2kyiA^4FTEt}*yI*)wI$s8xbxKR~hEj+KkI8S9E53xVtt$uVu?@_+wyH<=mS5-&k z`F57z`0hJ4j_-;_EKWmeWhp`2w4~xR!bN`}+X;M+{8f>4%x{7Zye-e`M_80fSfG*4 zbk_u*j@0La9m9%MRM`L4B^CAqv-!DPSlLeiBX+W-;Iv$rG{M)FDL98|X((Xi@nC15 zHgb)%$~C%dZ!a&NHET7J3^yhGXQCi<^Dv{!op-EFGNGNNS&q#Hzjgwga)}?yKhLE?TS4SoMGWNd zGuN?Vbmms!XzZYs$`H1-9t9U)tKnfOw_PC&@xuJ5c?>$A5^htXx@dV3)-Bf?m1*}od=w>V`i%T;LYeSQd~ zwWxRC<5bi>d#-X%0XK@}Y?dM63i=tV~H{V=}(O%1jqtU_s zgwUpXj5yaeEsVfGlH(+WJi^4WNUXxfr#&I7*mr>xW{hLsUOLW8*=VrKu9XmwMGhNr zJu8zx{5Y|#xWKeKrnKi0b{;cOHAMZzrCYxgNE5j(a4kZ9;X{nlVT#=v?rR!G&5e>g zOH%Hk3xYJ;1b-}U?h&mXi~Qa}n)DAuVaUU=n$^!blV6ngM@xSZ>(mFE82!cNdjy;A z^())2z_0w#mF=tiC3H)9R|WKLVTa}Oa0qxf zj;gHlE!ooV*VToQdfdN1m^?U055}0n4cX-0q@N9Uuf2EY`n8?m{o%D;HD;V^W@q~Q zd-tDie_J;3+pg_4Z--#Zu|>Y);3KOktnloxT$K;=cY z7;4D`V~kh@WRdw~@OYjbMF}PpXuq@prK#!Bq>I!?V-e-pp2xXoc{X;Fu5z-Fe$we( z`r@$XY8s1j2}W()0ZKeWW1$t#dlfiVsB)@2_~e2f=$IhLmPK6QVsyfzY)QF~q*&?( zG$n|=uEA>O)mTI;Eqzx*ThG>5G|&3(G#1nIzj_UKx*K&#{+t>M&r7idjC0GwiH3;< zStU3zND^D_NGcnx5i3n>;MEiRZMDBIzP_@`yT9Yhy+;WhPLHJcsa(r&KzMbE(rJ4FcaaHM`MxSr`et` z!-Xmf@y>|gQfuzzXPt3h`EVBl{!HzSbeUmjam)EUAcXw-^b?%4x)fd9s7LF4R1J4h zfMM6Mic|H4>;kEU{=x);cXxX4zzmIsjo4zMMuQpq#^DalPZ>szhrOwD#yj`ky?y6< zbzI`@;bc$@aMftGgJ`4oj+*dYq6t1w`AADZfx?kvgc%6x4rZbryKNTPj6lwT-W}c_ zDYnblZ@u&Gog43du<`0xFAtZ>CDc*yU~>`I*Rbe7ZgF6P=f6CeQKzg1msaCT7niH<$Dbcs2dO_^tWG(m|0q%V7f?O& zYYmRFY9Lh$Rls!-=@O7`Q3^0kJwoE#BCs$6N0(t2L<`hfn7LcI^r{syvuU@aQv~f1 zsuepR@l}&x!tEFN)SDC3EEgBK#~2StquRWXz)H13(qRk-Y~)U#f)~392?R|}lr;jE zwnG>GFL{!56%_c64AJ{YpsyPD_SI-2KzT4319*sDnA0aAqnqEA;Jx>l?;+cGR#u>~ z3~AYg)DeLT9YQwY3u_5q_-{IVFHJ8d(>K8lu_nBnrYU;BQ0zZEgpOf>mI)yl#md67 zJy><(d_^sk(NiouI-#V-%e_C>(U2*8mCSA7$ge-*S4 zw4%B%LZZjTQ31G-Ly9N@g{&Z_lNSTNl=}a(L2G?Bmx0zUIrZ7a!3C@cp9zgKsRt+I5h0xiPMlzUaZ%B!+fSgc1bZ$(r=r4h zLD_Zp{>Po6Q^2Akm*KG8zyBY)#HP2a0p=i6ds!&pSvvTu+Oi2_ptWI_D2Cx4b>NS5 zb}$-K)s>^|=^aYFV>KG?>

    %-u&psrpmkCD(_D^gsb)SweBW=9l1f2>V#)Hn#(+c zBP5uH4vUP4(k%7J1QZ!qT40e>1Ywccq}Ue@y%)ywvIXESD_G6rk+wXM%S_ePorBeR zgKWU+2CQzt>e|6-7Wt{4MXptN8ODDE(^zSi+Jaqk&m*M9&fAZIiw{<1Sw_<`%QDmC z|D{|OEyS-HB@;!m*wUF#3j)S*Sjc0UMNUJI-~o^-{j30ce|mzK;n$x%x7ET7dR+}d zoEN=%?qOg(Iz->K&OvRF5K~GU? zC|obDlLTAeorlAptM8o7gP07PjAkAW^SMOKG;}VlY7xC@0p*R0n!gwLh=*{N$_x(!@LrvQ6&+zf!s@j zl%K;8^QOjJ&f`wS4IrWAA|h4c%h2l2jrGLZ-hce?*$DI;Hgj_Z*&xsj0^K0cwIk3d z&~{kp+{$bgQGO6mQ*!{MnUlv3ae%t`!XZ%l{3B^NGYIqxzP?$AC5z05C&gkOYdIF` zZWv3p9|;0BOLQDkvp720GCL#S#dWGWRm-sCXV2@kKLaIKThpHxN@hO{N1n4l zx6Y+spEPA|FntLqozqr9Hv(NTySsS)a?eqq%LTh8fi7wD4!sbV^Mygm?TTLl^!Yp+oE2EQ^F71@|QQSAN0>I+V)=uP!*Zc)Rr^ijt zov0s1u@ewTIv1V#TQ=5EfoF$2H%c1A8*i{?pt$L`F zHBW$O*+n`vd#Y-l&mW?0EYR1|L#jHYMw=_CROL1=p)~=#=5f({NkW4GxIB0l5wDy+)sOAsiN7i992wJPt?!~!t2H61B z4N%kpp4A2Y6cgHk3;Og-cIbj$O{f^cujqn4-Hm!e&*y?3hLNX2+`DoXXY@tK%%_cV z*Y%{wirMr;Mmpo;HE%wn#?}68F6gJ2%?@19r>C(?7xa2MS5GOJ?ngbH=Ws!fkpJht zjgP%fB8X8JKlA|hj0bO`QFtgJMpv23*k;ZRdv+EV^i#}a2QKK-Gk7)^^vfaEc(tJ{ z8o5SFkRic>mi7v6?1UiD*j1UR@s%pP0GT_f5{5Wwe|a87b*Tg!E{0=So+K85T-+pC z8gaX%cw%N+tGLjl&ZB#}fRtFWMTV#EcsSu+uL&DKJ0lC)s$FwIe@$R2_D@> z_-`Tc#a9hWc|s&j55Pa^k`epBjC7I?>$nBr=H2Tb)cXGo+qD+9tINQ@@+v9i|Ldl@ zpwS%(wVb#17wwNqV=n@3sf2bS_kwkFyXaj@f(`lkyb zn2@NEv(S1JTy(0dTx&(-&QSDwM&KWP_7WeB6E?kHG>~Snd=ytPG9~~pNHfn?OQ|kD z*>XLpWTIi|DDZE!HEvf_SMwO|j_PX8zpP|e3>2I0Mh&IUNp*S9w}fJ4h*6vvv5`+| zQlN6B`MIV&L>ysjgE@Xa`i+^h|a}bxkL<<}RNd_&42+dP2`f zb=hu|`56LzO-H75ya4*hjh$mavIUao!m_D5_*sxAUcNMpv$;1DudXkgh3Y!ROm;wZ z&CKMf1OF}u)%9{oMbtc(%M&^&awskYOqpf9C)us}kpV{U)$;zwV9|u?&Bh39G6BS--l757 zvF|#;mSb=EF;|HbeQ`||>ubfxxwsnFq~r2^oGj=8<`xUH&{jner;$yI5%9+Gf)JDf z)>BFa#OMW)gGSRy(P?I`8@q{{v{2q`NuQz#G%|F{L{J`I~iw37~GBtY!T~T^c4HfAcrhtw*Fz zAHBKS(tb5=Z*e%?qwT%e8YB+^(U;rh;%dF-ukj=RDbHCpTG-h@=VrLuelMUVk+`rws)4$&Dzx{OkWu9$+v`}-jQ^tnGJqI##2rJknB&Jh%v%WV zvZB?|<1DpyA00kw9qR(LdUiv`d4p`w>ISWD(CXUJDw#z|N=?La3meRX3z>ziHKYX` zEe6j>o$IXiD7f%wRhDlFd^`mUQDS_$Sv1v)riHNAwhOxc$%0Uk5Ef_?EtTPJZpV4y z;!%fr3WV}ZQ^(0gb9L62!QST|&K}R;-_?M~dGT+wKMt+QXmaUY9_PlYmx*_qaCW32 z4qV@&_&fSI<5+5|p_d~IO6Y~djSUM`0t9@=4scGqIPMxVw|CqR65mdE49u;vMq7T^ zw<8SZYD|0=oYze_`?QsSvtw}Z>mB3Zg)Ibgv2PtDa2D_@T?D;F29P(d-@V@ZaDT8j z_~oDP^=|+2pQbw!7k}9MK#wwV6vovz5BBoG-hDyJ_wHQ3d1Hfz*ITsxL@NB(clC(L z8UKKc!d*SlBbg4NHjWv+FpCE=iRG-4b9j3++}7Eo_tyK@Z-03EdseG0VSOOjPjS~M zxT0JPIP3!NEaXuUn%lxgdg}*?4d$gW&`F|LX%tT`iW!{-F>UEyoVV>LE-MJ0JU&oX zsQfnI?;Hfr8)O55Hz0Teg4Yg$eK*58te}d6!4TyNx;zyD1s2WjvFGP$hKA(}1%l&# zXnTQ=6So1un-$aSifJJjR<`!MoG@@N36OoGX0lR^ayW|6hQ>h>>69jqy9p^>B5ATm3S`P-Fe}363z>O-nM7i6KmQaxOr+0R*EP;-Fqtf4hsz+g7^@P+?poE2#VRj-l?4 z%OU0niaSqw7c?Yk?_eX*A-_-FnI4TF4E9Z=-h0DGdbFqZGA#-7^4WWP1Aa6fkhxd= z0PG7MAdyFzP+lzu(p_M9M1 zVo~QLfomt!cmwWdz^%^*5dafgr@ogol!wCs~$W*s^ZW$6q({*}r*U*Ks5?fv6cQ z;;MQ5V~|=mW!)1}=L+$DwPVEFNKP9W@f`5$E*3e{X#lf>CoWX;1-JJ|ASg|gWv1yCTaow=b_Zs>)%?F3poWGy=x zom~O8;|@=B&sRLJT5G?{3VEOGZ=-MAP1+$6okQMvgKQx02J&to@7f`6kZGrg2(!ZD zgcVwV$B7D+ZQ)fwZk$UfD#E)j669ss=0&mi`kU(RX2~QH=cj*m^((9$`QP?J$g9F! zCrUY%9VwK~p#%nE@N8lKM4xZ2w8oKQ7V;v5_AS@H%W~N9w(OvfUNaFz^fJi1bC*Y5 zH!3j!xx-y#ftlKC7O|zx#|-{m4T_u>|Ar%s3-^?|^!RrpcD}X!H-B~IE4Q})mOqc) zbkhg{gv113X#5PZbC!j46ZnZ0`7SaFTI{S?dP@Qr#w?D!nEJ|vX#hSRCFq5H52rS7 zuGl%;3PSNs_oK*M&4lL4Mtu&Ms~8y%hJRL z3V9^(*;FwAN>nlYP`W{!D9qZ8A1|&fylVKMtl}b{)oKZnAG}$j!mqt^=i{f_L#Snb zQZ+8x=zG%;*C#*Y(6#STyFvS#<`}~gI_sfdoCgX+aN%7i+45ZezwbJrn)s+#E_eR{f z=X}ri90QA13?H0dMm3@9IkMv%MRWoMXS&ho(jYbmQz@D@+#J6)EqwwdP74-l;e)gJ zbbap1g1xz%Bl`trvjIo;`7k!;$UdLWV2$T<4M%oY$EXS1$kt9O;1UpvCz9S9g*khM zXIc^%iTDZe$)dRgs!!+gGLGyQn8^kl*-y;mE9%JJ(rTBd)dUg80Mpn8m*UpKYDjR5 zX;umoT&)s>%qC>yn#2(v@2v2WPT*3v;QCIBO=h$jSvW?@SNQ7vtT9?`XClXXU-nFI zh4Eu--m3lM>I|pVB@HJL-q8dq4n|cNVe5jo5f2$Epl5)tad-cx>U!__5YP$^<3uYLH&_b|j6R-cZK z@1q-$U8$28U6ilwjKu07jU?59Ya0NTbOdJY^y)5yl`e8QK&APOVrHAOrb~zNdADaU zB?W>4Q~sSAP9R4Eoj;^#PVnK}>?Dq{qD!*aaakDSV+j;50~ke7 z=fxCT3o!ahZ;qA%SwR|RKpoP~eT5+d{la$a2^SZB)1;6SqU4>fgq{Mj)j*#GWScac ztM3_3pxD*G#JVVUf8Xoc2U(xA=4Fv%Z=}Trx&nU`%2cWdcFO`u%CW1!eIbGFGK&>P zx4ueD2zUVzW}iG0`Q40w?0;uqET;#3yOeTQqm}7EQ))zFL5ma}{|N(?XPzB~+6Qg{ zn~mD37_C!BSTt&S?>~o-`sItg|DycYe_8x%_kY>_UyIJG|GnrlxNNrpvzjY19}xLq zGv{lbCTbhRy{kBvAy!Y6Mz3#K6yx->x(z(9Lna~NMAPB^96Z)c5B`B3P7Hdb;98*9 z|GP=_`jCS!z^)Cp6U@=+z5Zz29Z$vs171HIjVG#$UAnmf+2=o~%~%+2|Kh>Sh`TaX z*MrtReY2)=UzmHWnZ`KVOmG2Pxq&wXTScxBE8z^DP#cvZ1+@kQKB>u`fUU3Uu4pM@MK$CrnYjq*BYeP8 zpK6hg=AwW((8hBV2uZGY3u^k-6ljV4|#giAn zlSUBnS4QISxp?iY<= zRo$~kvUf-h*02s)|LZ0p>xVt-(exavBG)Pn?1G)}1th)q#oY%F?Jw@&UD766Z?JaS zS6o0{aFP~@wn(%^qMJvenGUh=q9YWGA*^^~o_>QwgG9NmtBATr z-uDt2y_x-1Ad(PeQGrBn%4TONvLt9N$Ac6lb{Nr$9~iGG5-M#cz@jfpbgDGU<};CH zZOqO>mRWD04*zs-VA{Gy&4p#a9^BgQc6W`#{^H2 zY7ht;ub$A>LPT-uk%5+DqE+C&;~!rH|7OtgRAI9;jCiR^qp0L_9E@^XMT$o%HmTFG z#Ep$^d6h*Ph|I`b%Z^bV?N{y*Q(Yp_HqEGZCsNs& z>(R&}QQlC>1Gk z<21-^?d2>6G$E1_L-r7B_RFJngpaDmd9TJN1df`)T!E4 zFA$DZb&R$}&rLRrHW}tTy;BOf$*s5{>8%$^KR0>_={hQ*kV(#!AmBL(wP&JBqaclQ z6=Kn?(NpNm@ku01UDHBitc_j;>23Zr?A!Uy;R@2*HQ?rgleBQNg_|wh+&J8%t$@mA z7};)&{?;Vh<8X|Phw?nu$iT_Hmn+!{xapx+A%VIqc)sNOo278lcbpvgUxv{*9_xOJ z4{qv`G9?oygB%r7o2J?G>YUY3odqYGj9xzW+CKp%SKHIC3nmZTG_()9hsX|lGopM^)HmlJz41Vjl+)N%9>WmP%!@2N zple#AOK17ZB8Lp~oYLKO1(Jb}ZxN6AlG>&pbfP5k{AymCvn|@!&$`*5uA==Bz9M`PE{(*s$nR4gf4ic9+rmgI^%#dj!S2hz1AEIEJ7M3#zBN}m#T0U>9fyzvN9 zd09jln6?=k)UioS+q!TZ+shO-9;AVKMq7F<5u`^5aU5cSy#zrLsp6Bk5@Xafoz~_M z7Mz z5=oXfOo1df=U^K;k=Ty&BaNw!F`MUtCGl5voO7x6L`rc9w+5?38ZQQV^S zlEkSz)^+3VYmX$^V;KWm5A(>P0rO_;a+V^>JPKk8%E}HsW1}e@GF1SQwo<}~ZZdQ< z=e1wfMr>1vvi|Zvfhbqo-mi-&cfUIF?cKl|-FQSGqtT9c4+u^X*$&H$ABWoe0Qttf6SdM(Fn zywH8PWNXj2 zg`*9|CD$Uw1jWX&UFck-G?Sdy$qB}-2LCLK`8r)bH z;qE`l_w4kmqrIDsa5v=mGjkYv+01Lb+>Z!|_e@GM*3ZhP58ACqURtGaq*z4yh>?!8~> za9`j1F0Raf{`%gV{L9?urDs-v=?esrPxw;6Yga|Wjx!QwW4J{Jfl*K-xE7?sTa%IO zDtl*e_+sz-#^L$LUp%sI@92JZWaWb)XC3QdUyjKvl0ECLKGeOzfk{xE0<7<2Z6y2M z=f!W7#O>~n_I}G8=^yWo#|NYBt*xPa+S%!jcPHs&q=(snL-xm=Y_Pxe@uS;Yy}{04 zYhR8y&sK3UorC_)i@kTvA%5S*N!8p~!g(x$ZQ*SDaR-OhXtUMRCi^<3w@m3CG<&~n z2&~f7fKWf8P2R|D@of~4&5o1h^urL$WfE1Sl33Of^PNU23c?Jj6G@=>IcfyEwO!jy z)#Dx{2Z{aU>Cr*$yDq7sULLG2I!OywTd>-K)s2HysZnidl$^XV@yGB;-Q!(}u+wqU zJc6RbW2m+id~;y+J@bCwyPt(PgI@-{Bu*|+aJ`ss_kLHUz% zn~?ZXh%buACdsFy?XiLV`@entwZEAntkt%> zt0An9tNn-B19r--1^b*WdC=WD?CPhZt=TfXH5@!0b-3(5m06}oqsK=F`cLjY_}TqW zAKboM!LW;sf5_JNJO73~On8CI$OgU1et*;%s{F;?cg?5Yl?MkscC%&!w#ASC=-Ga6 zw#_Oh_Vc?RotRkSVv?998aodan$y^)w5%k4trW<7lu?OiTH#KJl^0DczdfDU#n(}r z<2SjC^(ORNdq>4B^St=y@!F-u&%VC!gfd>uO=v_-p_tI<5)-;N8uX_#`h)t6mOrmQ zr>}qV=)wIH^T~56Gj{H_&Qh|96XYKFn`t`_qCDgOnN8eE^O?B(Uh$wVxQg0jzGW_A zz1jSY^JeoW7Z}Fk@ib%A;B>C@d=?L3@qGSfeKt=&n?L{T(-U)veHlVxUNvr}jd?Pn zaN24GDi8n7iO)ar5w80;Zd>87R8pKlad@Q{gj6Tt09_jucxNN?a&QGm(U_j z$Bgw75#O)zE`bAj1on$A0hW(~>H61(O!}0aL%$-%t%sA8&BQF2_u+7`r?av3-lqii zK78Nm?jQ8DA$QoKjd#1FN|M159u|i`O>{Z_(iQ=~`uK{94ig-F=fh9ifTqooTTQkG zly^zd8o*t+AyUipQ%4KwhV&7^Rw1f#$e(kxBHzuJ!eW>mBp7<&^@0+E#LR$9VHFB8 z*WTc0Dmeh*z*7v^JsUz7Xq}Jt|%nufvq$RalQmZAkHco1V61$BMZF!oz5CFnt zwZxd=Li49#%&JFW{#uY)OF5NU)hFEc#I|QPRsjje)7F5OcxzK|Hn0EW@hM>F<%-aH zWX#Z!0K+JyZmAtq-l34O=U}^Ow9F@f;nHC$K>k|=8@D?)lu->5HrZibf8)=pS*2QH zwT=90T;4xgLKdj4ZaU6w7XVe!bn=Fx#|>dS^F$U{@{JNvRA4m<1b)#vvS~M9NimEu zo(I}?qtt!NdrVF>48ys0CEoI$b|Es>GOpm}J5{mAQEPrxjeK;CVRCh449+^a@p3zm@esu4{ zNAE9b3Aokv1Z=V=pvl0d*?qU+j&)CIfu&Cxuqe6UP!zBk_8)l&hZTt+Rw9c~!;+XM z$y)SWm8MA`5njkVlin*48GMjE#|I?5TJN((Cuw163rkyAx^Y;__9ewB%dw+Sqf5-N z(@HZh#8KAsg51^As9&ncU|^}|1W=A8EN!<;^)5=bOv|yZj#EF>wCw5}FyZN#4v{>? zO)ZmArgGet5r&+Hb*r&I3+pzS@N{A)aRTnHhCSAWyH6%hp4o2t?8djhzcm9T6$14# z0qhhQw`0J~okO2@;>FxKI*KwcNtH|BcnOW_A6^7PXCQY&p!!NduOIo^7|PjN=QP>4 zM0m&i8J$*~x|!$4T2e;7wxBl-X%tveF!i>D5tw-tb*3}>)5h8ab_abm8Ol-Jn)|

    m~FoadBK>EAODH%}8E8{7KE?Z%c-yH9=lX*yB0+DY?e z)CDJL@oI}#TfDk)yc!{ar$vz>hccO>PVU%A9>jL;vLXsM7W72bmV$4tH(>QLD&n*_ zp~g@+tlg;X&Qh?MCJ}z264oIV5#5l+m>|KEAWaB1RAC&DY`6;8EC=o^u=%Si+XbA! znyYR3*TtH0JYkfMZhj;Bn-vzQpr%SarD!s>9Rc2?8wL$3=6rUTV)YZ!OW`|J6|VN# z8;>-LFOGS)EhVYzzC^n&g&+Yh^XWlwVE5ANT3&S%Y$Qm4Vn2P_ZjJJ4ul+%A4^cKuav`?uQO_TM#KPjAv;G8`Ogo~&aF%w+HP z&0qg$wPyc6;CKJo@dK3o{!NxzXLGn==xQRswU5t1ZW8*UD3@89I~ny!Opi(6xoGEp**DbcOX# zC`?9nNHQ@BU^f8o5L>LNmavm0zev~Z7_U8aW&g%1FHAs;fv)ZLX*lX)5VUanv=j+b zSq&o(|21e0B*v18D_*35oof}~$(Q(Pdb;8NxWu?N4`(6aCd;lTb`>X}@M@T3T_`;6 z67=nVwMQB1X6IPF)n|)7loVepEGz(Z0>>a*dxiu{{E&uadI{oGOH&@mLbPhrvTN`5AWUpdC!c##6lJnPxp4(0+Sl8HMs^0O6gY+19!<=#K!-vOh+KeD~pJcV_-> zEe77(1O{%h1-88V3;;Ga_=ak?#OmRy>!s4uz9u|Gvo@2c?4T#c>LpPjCELJNNeI0q z=%d$Znt_46AfG7M!F7z%2l70r18Fu<(>A z(h56aSH`wArD_p4!gk154w1Lu5Ad=9U=bt~o~Hn~-8C)RH7$j{(7d_y=m#XHBPWKJ z*fbJnQIKZ7a9pgFeLp>?2yAxE(-}Am`Zn2JTi;Ba#JwxQk9BeH-dC}bgMcc4H1=A}cp<=wX7 zZrU8%QW2#Do2Fr6{NQw;0*TEDq@>2Y+)2oSCK=k-*qPHu>&K2mgDnQW>_7{(C-@9uSX2uh}x5LkV`C>(xvH@DabeHl; zQR{8DOP#ZtX(Jb#2@i)<7e_+K6uo+SYdwC!p?7ipZaTExP><`Zr}kwujtV3hIDyH2a0wj3m7B=I#E(gVAecSRr6V-N z+x0BwMjcowDmzP{ZL;ko9VhgY80}199QCWldT7;PziVp#{h>Z6tc59o3thq7fA|}( zy>{Co^I=>Gfhmere!)P}@*~#ZfMX2$6+%7cLJW2+yoqn&N35;8)#hV*p`&3zn*{&tTcz0TKHGgyi{>b^w)pRWD-q=FFEQ!17^#)Jv$w76sv)HRCb}m2T z__u)aq4`J5KL`ml&w}Ybmpf%-G(~UneL(> zw#fC;FapNd`QTu{yyU~dzO^s=N7iUC84`VQ%j)*C9^P0KvWr*vE$fT>cOTxe?%lro z!7YM2=C$z7Ex7yM}!T=wgKiSP8G?D3ejw05~xa#9{Y8GuTgDik8h~p53pBQdWhG{6W8b-dUe88cWdv^Bx>GRrmZJZBS zbdr`2;Bg|(aDQYLKiRkB&QO<9pF%Y>T~}rCYGgsS22cAV%cK-p-LXXmP!CgntHZKRAfF-9KJX`?Cl-< zgI~-KL3c^FSn%a|JnW_ulQm?HWIkrz-dtj*b`O1rpYJ32GdS;;FTVcGj|T%~eN2Z6 zIgz{#UdSSk;tvf9`~ks5l7PoA|Ex%Td^RpW_4OZDcCK``m;?fQaG?7|R%eGUqK-*v zIusqTHOe@Z+?pPxV-jF`_2&EU&5qxtJ*EJjR&{9eg=?u##UG2fo%!Ycu=+SxN7&{5 z=<#5B6uUagN*7ogoOi23s*UpjGE&M#1!QNr5hUhuz;29UC-#F$hTu0&@|P-h+cg{8 zBnSbo1r5+{C#@BeG*;Fo-ni}L()z!kkQuwA;d+sA*Y-th<0XYK1llZ3MDFqL^GK5U z{dg8h(tXUbd9}N&6MV^P;B{TT#2r6>YVSN5@;KgXDZmeBsMfAvZB+qJLNB8HByAO$ zY@*a7G11KfTLp?DlmkzYSM}qCN4fc;cp-2jixM2!O{Aowh%9%Lh~hVU@>EAWXV+FD z5Mi%PBqkHMP$H0Q3wn^q)il3x^*joWO7P!>T;SUc%LQiGZN?)kkPa-gC^Ji&AwQ1M zF2?38Gm%jM$vQvKhjJ*olmPuOBxW~Rqc@6IS)H*tvZimN)0cP4demuSp*9-}b>(D% zvpH+CBo=wB(j<=DEDJ-I&4455U-Ep%@kA)G9u-2XScehWj3NuLBZBd~oPtu|EjmzHCa4|AkyHQ?j7lGfnqQ%MmeE zL+ycsLk}lq$Z<-ZQW(xC76Hn+*h$&wo-G@g5BfKXh}n?Zl$XY+)XV58G9OofA?qUI zopju{<+I_iMZ_&4_SioGdQXYwsXOIvo@6##N)WM!ydcI_(oO;&_aW+6Sj}AGr zl@;@MlyxvqyL0DZRnM8#&Wj4q{F15?`RlD4+9o=|n?$|yNi4MT{_GvKp%S^NdxxG# z^2`;v3>5x{naUi=-Y#_s!_!)LLi%}>hq)8@Qjk)GnMWd{G&XT8wO!kdMZI6`JhPvv z_@MS(m!V##_B-F}!Du0od5DF>bo07Aq4IFSNm|s~qTW_Azwr_|6d(~(PHs~SL@J$U zv7Ms$v^7eiEb!C9U~H}rn8D|bqu%$HO65;&(Of~c=@jGom_HnpoUWrxUyQI%)~hZ*m#yP3X7wj`&*l_nsI3 zJYE;I_}SMNo>0cC!3m}IR!nGgi3u%KM&*qDpgyDJ&+F6qdeI+q{6Y0alKKH5c{<53 z*^VR;;2GT=o^*V6X`We14 zjQ{N*0Y2rvig5~=QXR)WeSG~oVRrbPY}hq=$?`p{a^H7j7nPp*haV^KK?MHVn05JN zsjFBi)}De*sXln-(KpoHbEOG(L~ytXkd$Pk!IJ1BRk=T z8g*QDM8-B^iE702J8tMB8=B5)a|w24gN0G&Q7u;B>;JJyX6)hg1Pgev%gIB^Ab>KF z-3V^UV}}qsLWhz~h9lzG%~!H?57Wev9GZR{k_7I3ez!G5+^qPc$vC^}CMrm<&1pX9 z^q_Gs@RKl&^3;t;C&BZJ5@(eANtAdr_4zJ)DlN!zaRRngeu|?+<`PMpc_f7h z%#-9?TSIoR(@{K2#L;B7-SI8KtS&ZX1y=$CtFeM-6lHQZvN5mgSA?JZ#&Bo_^ImFv zICFn^(`?}lDyaZ(PSZr7>6GvVxXuq^Tmw_>+7WHKX_V%!7X$7Jz+3z5BFuZG7*v`E zhRvZJI>_Ms+)r_Uz%tsQ)dSsd5(Magucrfq7hy~qU;(iRgNEBdv`s5rOax5aJO+it z9_*)GqtXyiBSpW$=S}-Q+?k%_SldCpci@=YgBy>=Q@4jB>#|l4BV%k}i6jx1cXg<` z9x81Ij)?~P_Q1Kf>FmXGV%iq*ARX!9p&ZlUTZHQM@O9ApgKP*so|-BeQAw?PVqwz2 zOn5S|?ia`!0g6$Xlt#H6T!N~sky=T2g4oN?>;ZeG_&%|Z5g|N>4d2*nxFgQPBz%z`uNf9 zEjpqHTl;dvdA24a*;So`{?3cNcg-Pw-*u3PA;Y>kf%etoyJ3q69s9KEA-KyT;+um+ z<_LuSICeu7`4Rj;XbdB~S9rQ0NG5}`h8;WR_ z3fS&E%UHl_W7+OJjW5~yE@eykmqdG{&KghelDP0`}rs zI&ks?N2Fo6NOVqX0BZaT<{?+90hsYGUeo+b#n+z4zkDM56FEGxL_GD|{79$6;wR<@ zmv`I@i`sEq;K%0eHkU^?t}Iu0uh1(T6D%~uv7BkgS$Er5{+=_PQmq;1O(s~X=X1jZ zi-U89@Y6U|GQun)!|f-{{9H!?e+;}V%5)|nol#&I4n5G38wEj}1+I_yk!;yH(zv+< zOT23z9YtyFyEZPd*xfsQl9pg;36_>%**L+HCo0gXAd@3Bcu?kSV1*=@BZ1b}7!G>W z;O5KTwU=0!t*uFspueT?;B2>+XIq_>323uoUAwhpC<>qVr3{J;BHEBWTGAp|&XmkVM$y`Y(4T0LIK`k;H|eGrl;b9)znld<(R!B3YJL5Y^yP0BHWmFPpW)7_S_ibksSGol#Ux*L#Gk=k$5}s zI)T${sk&T}JBI zf9AAVC`#^p`030nv$YM`NW5l~na{Ogtc_cS;Dnh`2c#du$(1HSU4i1=5L387=OB9> zAR6{!k>;VmI@3=xk6(9#P{>#d*!TI?_NF5GZaU8KBJ%3&#WF-+uccn7X=2eyT14L> z`WDe|9MLP~hb|^<)O7{;B=e1R8@dStP9l-UN(S|1@0&yPD_Dli_F7=AfLc`DieQ0d z2)a3?q^2V`O2B8BL)o#4Lz@~X1L6nRCZ8^DSC%0HcQ|vt4&EYuW0oPS?QvIwR_AxJ z&z9kaEJNz!AFggmFux3{+D%x7gkGA28D22C7Act9kGQA99Lx=cPy4&_O;r5}%)Mx0 z!R~8XhFoAm8?X$Sk7Qvov9@K%u?c0!Rsf}-&FV=J(o=z;mHv4e7-A9^ zkagklmia>F!DQ39kjwB}b?IuU!>Q;zx|qJWbNl_W)N(Ay zwg^_N9CN?bI_7S|G50UbO*FMR9(_;|u_g>eugUTlyz|X|IjbUODaLN$!)9neq=mrXe+!i6kz@3#Fh=5QgZm@RnHTo&k3Q$ zd=SqPTF9&05}Z(4tcC_wqXU7l5;6QIW5I_)LApO>nFXw5EexC3YZdRcI~#u1PrhL2;%9STweVg9*MHbfe5OT`IXne5}Le++fo}ZcziO+SqMy=25qI zrf-KD^tC}qcQk^N!KicV#oiluKm2*C)_CdE8s&Xf_9x9=P8)))fiS+r2_-p^(^ugq zah~H`>E#Y#)XMW*G*vO+6)!Ms;B%5+a(+EQgq#brdexxZO;u~`?|WVQAnVt^>oVAS zX|=|pleDn4g{>`Y-8gIwLxp*7gkw7?rsU6y$R;)}w(*(E9XFv#Hx;#I@0)|ItEn}T zZP)8K0gL;z0b`Z}aysC}GlV5&U!a}JXg$GkFUdU5c6|@aBi;kKN3s3{zN-}u{ea9r z>JI_*=ClaBZotcGyX4j2+4*XX*)rUmT4Of;2}8GHHF$m*RW*3cfEO7P66v_gmPvwX zivt>qQF_~{`@1!l7WwZ?oHn^SAdrxV@E zrJv6=)EXp)L8?)XPFY_~h_azcGy45Jfs0(6#L59hpTFpaI89EU&C94YE-;e~s5MT^ zKwbi#H_lWIk0LE=kIIMOvTbvZ?oIqasKg)K=XP3CskEKv%c5}?1N;9d0` zt=W>KhZAF{Yg)NzNJ6R^@VY9zb-(wm*IsLqCws`LPP1gfG5lCbl$~P9_{;KV)>ApM z@HSPe_Qc-nkH+2cWL%isemELWR2MH?a|yD~e;C)Y+YcZ7;(_(xpxZB#VLrn>RVqCw z)gC#_9kHv1J3FTJXo<6p5NChcU}4A1`qa?Jw(fG9Z%plxvLGdqBV3HzJYRy8lrM6X z$uv;8ASOo9s?VDz3CQ6K1tupRs{brW!cYqVuYdEKoc5pOdv^NO(O&JlE}_lX-^|D3 zLQPJKPSVn5Ep67)W*eu?{M2z+12dZ@Ph?&(vH*z!+*UCQqZ`wi9Y?jt{3W2x+>Y=t z`(|%;PLmU+w;6U+7~zHqLYIV1SL_9;ty0hR0-^Z&ppP>UoWJcy9S0AK85&=gHd}4i z+!$?Et@Vx4X2tji&gxARv$w%k#j>nPn?)pjXD+&>BqGq0NjAnJBD3j>FjMRKz5}Vc z!o<2!1%}x#_$)c1VjR9sBuuNtGw)L^G^R6xU}8>S9TQyL=-hhAmU zlOmWj<>bESAV~{kq-h|iVaJ=QG#e||x7}#6f-lhJDYHcS&e~Q z-dB}`M_<|F?$Ohm-dFX*89K2mcrrtzgu;ZxRNAzYgL_j{o6^k#TLr`r;j=}oQRN1) z@FCE8c6jCnzY@5c~SBi%{5}tUhQd>(8JWLKV3M)zzaiSs!18{o)1$0gD@JvDi z+I0ZDn5VnGAubknT9M0);1*!-G>?a8oqVR*Dnv(OXJl|t$tdvf?>3BwXT}YuVXzaP z)o>MF0te4id2aV*uRH3FtVe^aJIE%z@nlHm@q2e}Kf3e2QLsQS&}7vg4+nGekg8v6 zd^GhD;rC|OUzvxrf|8A3DBnssTqLVbt(Zc1ZKj(YJ8w-)UJ}dZFdv!WsiK;|gx*2P{;3O?XZXt3D zkv9&Jr6#;XIjN0x5>-A-vyoQ#!ZzAFLLPOT`So0^Zw?}_(2O+Ad96^eN;au{Ebqf33@I zHnAe2X{$i}msOQqU_u*EmCQ%7nP#l|gqnuK6;&nk%cv%FJynV4C8P?|p}Xc7a}g8!LISXBIuuT@IE&`f4XXLPoT}skv)O>EWIl`yHDeu{&UK#8HB==cjZA%t z_YIMgHgOda({@CSfggGvwtilaueRuVYpF^uFp~|aN>0q=g`2T%Mzd7ie5fS3TIV8{ zm=fQSS*l_uV{t0SC4yG;(hRF2ZA|?W!KN&r4>dw{MTmXmB!;iLCVbinx;*Uo1ii() zEf(=}USB95wDje!3(-WL#&=89( z5Rw#@MKw7{J{T5s*GX~7M_t`hRvAQiWPLCg?r7`Cx;=t1lM3&lsr67R3fTzZ^@|2e zIn^DrVJ%4LKw8Cq>N^R$qaYXb?~((RX$0`Xi4~zxN;oRX@v8Uyj0Q;FxPVAIC1}MC z9UqSZHQd zS?&KT7)5)aQW3PSBLqE2SsGx^MD}i&1}Q2kx>#mK{n}@5yjmmA(FD_!V|$Ki&GH=D zIARkSrHdmQRxF1h!{78fC{e9-F+p4v1TOcfS=(v}BEF{T$dD$nPHoDWA2WA-~W zdMN)WT#GQ8VOL|qI~mWCLd>;vrbfJ+zW!y;w-_-;u7n-vFOM1V)((0)r(~!z-96+| zc646@v&|?U91MnID<@Oh+L!$!Yc!Y)Gd;Rxb^BQl&k_ts3ipv))))8hKD=e!yM6bA zTUI@gxpT{UIOMnWc+j`L;7`@HjsFzF;86DXNyiM+{lR#svA@{Y4A%aDBM+FE;S83y zI+TsT@+R|}=Z?VK#T&LZQ7MUzF+P7XlUTIl3Y=#;4n3JVL6`-8k98Xjkvp!Qs)cwjp1F%`Y!PS#**Xo444!#pavG<{@|vg3=_S zg3T4!F3z) z8xWz)N3uZ?N;RRCYTX@}Vm>b?LbSk9D$>VWFTWxLo#hn zl%$(r47}1@CLshsF_)LIHo3q|HXuSdF_RY-q0D@JON~P72t0<9c(M1_kni`4zJR|n zH2h6y=fdz822H}U(;UI8iy){p3*pkW>&N_sU|VusufR{VFYZxt)+X`T|FXD7`Bm?u6v)~eSa2|)v8rCLW?!2R;g|8k$&*PF${XnM@|THdWgj zpZ~lefI0IgdDCq4cP8?vQq|CMMNtwD6kpJnKtwrFXQ`$+A*O^0=jnPzh*e;#+GiK3 zYOd6igi?YGoxnJVI+(Ty>`0Q>frQOukS3AI%qB|xn)Fc2R4&+W#@nvwh{PpsY7vMv z2AzeQc_Km+eABSX*{&Q*F=}yp{@C6Zm46IKk1l`bJF-@(Rw_sGs&rAC-TEWLgkZqHKkB7x=J(W0Z zSnv_19;(w^c%jZh%0hV_;=?KOD9LiXjDx$# z`=c(W^O#Qkx!KaS7JO7&HrFQtdJ1dLh=3L{<(s2$f%N373&Ju|44F-4a1e%ZitYo| z!U=>|=>h~HA2`w_9oSL2fEyBgthQBN4WXSc_?Ruj4GBK#@@!2M{pKNK!&km)s2*s1=!}VHkWawvb&7n z;{r3;fZ$_3g2hZ;SnzQ(Tt_y|m%ULkC>2{4QM+_Qlbz(zhKHYIVi+h*3PI{5vFCWX z=8h^zoY^Ng&XvhL@{-I@dST8^Bqo84msx0Y?G6zVd6Zwrj<8~33F3|y3U9ICqg;BB z$3g@~yh$47%5={j$=)Fr9m7KNVdrizGU z;k9wX%k}*@@UYoUg9z4#fJ0ki@n#3a-75UWV<*mQOTqOgyv)9f78bLsI>%;LL~$At z=4%T#!fwDJekCSf&}K*oB8=DslRb6@j`k9A8qn;Dz$K};z|re=IIXtdZHn-kEyGO` zUeoc9p^8=n)bq=z0QI_rm!iN@DpPH0l4ai8DeG{1~$Lf0d_LhU4ZE)CZlkg_hA%2=8xm)JM<$>bw=%Ucm) zre_aon5;*5U0^mFAiU5Em5&hl-1mfLIjCSIkgFaEXue|*jkvk zvxlTBhs!SLk>eju2d!#S0zqmOhtEPfKt4V5~UbqQ0X1%^l*$WVI4_qw?85hHKi>!UauPsRfa^P>+( zV{D3Oq%z-B_Hp^0AAT(hq%$3mRx>~{Eo&DrKx#X^HbM@5VQ#@wz=sFH5?D{hPu46*vV;*0RkizoY*+!^ZP#Z;<;r&e;Zc*EgAXAPeAN0xB`w7O#p_|@a#Vg<)TPVu+q zd6bj!?qJv@!Eoxp$K$B`BV8S0WbF)Pe{AtKsEq0!-M)9%Iv9*-=`}|v4*#^vs|@M# z9s7e{ShGV62Z!Cl<4%sp!)`h;-hSpt=40k1%q4be_t1Cv`Tn$f=a(_gE17&?Y zIMl$KhjX2&Vte_{cdvlS#s>r17Nrwa~mjtRj&y|boQLO#? zviHrgf-5$66+6;6iJ)@~DfshtS6FOo>zl4VrV+!DSr$xZf_YwV;I43Kds{3bFOyOb zXQH7DJ=2flX<_G>9tN3AeNUff;#|AO&T4OKvXVOAES+d=TMay}#v?CpZR4cQ|O}S!GED&6U=XOY7jE%K(!Bt#MEKtQ){Krl66;;s7d7MRQ0B!gQv;Kc3 zkE~=Zt^&hoxC(5XFT+?An@jT!s$~?V+IT0QFn|73TR$C)b;tT>(l7R%8E(j>`?C2s z&dG+sc{G+|J+f|N)0`b)K|SQ%#-@5^J$+Xn>fYeM@IAzOo89jFZL|>ug5O~^|C^0a z2u+&BRCoM_X#}W&&^QTt2CN*T!jtMJH)#1Qx@VMxax?r4h9H0Lz4e;Ml$pHF1nP zsXf6n^gl=qmHXw4Klu>}IJp;5!@?*YRE1>Q$hRr+WeySzl$9)fiw-okcBvf*5vD@T zK?#hQ6nyA$ogo(v(UK=3Y)Aql)tQqqSLG4onayJ4dPpG(8ll~+ncda3*sLu@_Ni8W z47|5RL~bc-Pa4aXjT;e_LW|4#mx~?cc zFk$TUxt@XYeLpZfMS=2v4t#7T{5PX+BJE)pUv8lA6z6~aZy&QGJ60M!r!sm>k}%$# zCpvZe)*W*S>vK-Apb5u6Wxr}pZ7$^)B~Xt^GSIp3StXWfTGyp;J2;s1im;~Q@2Dmr z7PxcgVO2(&r4$u~rTHbbNP444`k$EDZKxPOpTvU3;ojX)Nj?^m=n3IOz6upxe`&@p zQfbfQm7Sv()KTW8rmsDZQ<>tB?s^G&b>EBgG1*wY!FMc0xAJfXa|UuOt%UUSO<}Rs*mt17OS(R}2}h?JffqYs5;azf^>9nfg(<-Uqt z#rCRz9>+etsFpj^xql}cc8z>$3R`pbK{(ahv@dgtIB`r^8ND(De&On%Vx=%bLVsWg2X3I3(h(0e&;9AT*WYC(cfvMQCHI>Ms!U1?=H49TmMBrQuU zb4b+zuHsRh+M!nL7nLVG6DM#@Fzd{06^%RrYJLYvcNB7c3o&cB?Rgyx9El#E&T4a! z!u$GJHyaooy<3{CI*#-!==#5zm7^)>`dM+N)3BAC-<4*D2c-EdX~wT6n^b4MVnR1py(#~t)Z+h>rGHM`T1tFx1i&Dl+uO3ADawVxxe{R57vd%7X*52Q`f|TU_2B z6}|Sgc$7Ckzx$E(QP*VN{Qch=d0tr)zQBYwU^Fow$!3fuj!h_lry%dKK0yzMRew6tp8acOfM>^W%bHrym<<1^daPV|KFBheIf!S=pXktE$4H-?; zr_<*Nxb*Y6hS3E5o1uV3FCj6OVfw8IthAv8NtyJ|_%K+0~FbO z7@MTXs_8_)u_8q_zm94;*PzJ4L?S7pGcSsHBAH8=YZoFwD-i&%Jwgypw?-{^HWSCJ z@WrBg8H(%zGuZ$|HXp%aCSOsCY(o^*j54bQZkJ@)OA^+tXxLAj96e@as+O)2I|o)W3$+yQ@XJWXAUjXjh#;5zV%|S;K5qU(T(t6e_`&WhPs?)w^B)jZLG;j z#~w}aBG=M*iBe+>UCADbT5uL*bjPbCLp4UxF@zlxiO#U#Gd4?MEIf}rR}Bi@RFT-B ztB>gPKYCjGuFDv(OZ$#4I!VibwG3FxfNh)s6RdgQ4rzx`M2mS6$99s^4WmTtx?YG8 zBMPWF8UD?Q#LUKakGj|Wy(h&#-{qfQ|Gw*xH$!f?a2^Zf`GQProbVHmq_nch>85Xi zmi9G?EJOdtoQ7_~K01<=n`0x%NHi$a6Nob8DcWG^SQb$8En@<_wL9MLz1XYiqvX}? z3}z*=QgXE#Hdu`yTyC=Inf9-}gFc=;H`|8etr=*jgc~AFQ6dDnt-T!eMndpw>>{I# zQ?^XG$0o^zpC~H)^$*{8?S@oz75Jp~y0C4GOKOZa@!X6&nskD|gLA*G+Kr;?6Ii;; zh$Gn!qE14)nh``ctlij?`x4YRlWs^G;{XcDWl+dJ!g#Yufci;!wuSH%HYZ4h&>eI^(dnWihW!XdV%MrktAbW^Ww)cGbMLX2YHy~ z8HGUQr*ub&%!%+B;x7dHs`;Mprb6APiGN`4sqU2q?=Ct?3w2wl+d|!qL){QlV4V@X zi#MU!#QC(*N0i~<`@F+eaB^`TbC{Ww=SP$8`Kd#(%|P z^87NYV)B||4{Bn@feYjREH|QZ<}``$dv$Z-3N_NrP{M?)FtMmT*A#nPU_u)Zd(20& zL9xelLZeE(bH3PPei_w-t|#^ovEmss&!|>LyhHU<#`HruZsf$;CHUHia#onn;(;z6 z)XVilU0^mF5PQsru}QHXB^wK_?KQ zZM(@aOyuI!Gx#wmz>N0GSu)^9YNxcd`xhGT|53nF)C3A3Wli#K+5^glq;)vloI2aImoDT>4 z*1qf?S*4M}=+>DryjI;msdLMEIP8+cI3~pL3;r~-`2F?2Y=d}J=b*pyV()b2FW45& zwjXx{*#w*A3xC=mUsybKg?kbY_J(YeJZ#yp#E7FfcYG3e6IwVO+93FO&Yn{e7|u^+ z7)llAIB$R)5zPcbYA=AxujA#LN)sM_b@1HoKUcdoO0;=J%z~4&G+|2F0O+!A0ur$6CQOZ96ZLUcg3q|@;CGnz&aXjb)%DaXo{CT@uw5YDucU|)!-dAw9 zxKu!tm>$4bWp=7U=yK1P+lC~L3MUAnoKV!ZRv?XHbjfAGP zDZOzuoh&no<9C{-IA$#fE7KfqFiYw+G>7XF+IvZ!LnKL3$U@eN>|OCK_H;0OVl9mF zJ>65&5aV$s;Zc9{F6TRp-}RyF!GLtkDBmB9huXR;_w_AH?hlA19>Av!XKvAL6VS`u z1Y{oc4N)GUj2&NM2py8;jwc-)ts?@J;ZHBAmm=;ABM;j_6D+KQ(0KU^i9dp`vn))! zSD^{$X?JJOR#CEdm6XS#leCmaOL?@E$HplSk2ass&l9|K32S8qBx)qZS{J8+T)R-g zI()e(54Nv97H88Ypr5z9$3uN&J(VLXtA|e3cVf#pkej}HTuOh4Oy_~}UE9-eAUGo# zYbXL(X%9AS#3DyCcS^l+g8rD_hG)?qSJpozPR1CohDg_?K;%)fV;>#)l zgla{o(J-A8tK3(0wYWV`)9e^KPaMZ2Dv}8k_%oI2`N@ z<-W0?cy#x{C-1-5`+v=6emLMW#+B2;U+n#V=5LJQlCT~64dchIFnytc z+XZLp$!u-on7uF>P)(&n=IqodxT?DL0xJsu7Y27FTX?ZRZl;iV))hM~a8 z@wW?qk&(8{SFt1oWWr>|MLGHQoloxmcw~LVRalRQGJ9fuu6tVYy9T40Usc`Fc-T!R zV>JE{r(DXB`3HY9ll~V<12kI7kVW+5~=LE)$tX+AiDZVoU&$|Z)9Ezg- zeRJ}{H)L3z^OnVFto~qZWxG0i!f)XzaxffZdNkq>`dOwAipw_V8tVN4g>myORF_K` zTU~_{Nf%5_Io$eU#J{Z3?qJeW{BDjz$#_tJZkc6+{R7jNFvPB8-=Odw|KL>8N{3y| z@ru30feFH^uyy$@sKhe~DZf4y$aM{q-0N|6es@%i8O-u%(i<12>h=$@H|g$3M&rHF z`&Ku%^2yMQ9?AgDxL<_rSsbOWDZ8r9J8wVU=*c<$kx%;LYw0tGF?&o<7vQ z>DhK=e}`Wg9CA!)_4$44NK3vf@$9r<6heVwe&8vb!hpuKVH8)FcXN~+Jvrn6W5&6= zFNY?7dVV)qkH%b~c|;iK+YFcW-e-?)^F7J~(3D~B3iC^v?hZ364{LX+RlhMA>>b9a zW8E>q@yEVG@q=voMa(VN>-Np$Ghd2H=E3Bi&n(<3$CIJ?uDP{08FojiTMqjz%iR1K zPZ2ll(2U1EH$pWV42;~VPFPYe+|XK&i`hDunA~k^%*VKAnTBye^jGIPL7jYe@6G@I z_1BC8TlrQXF-FG@seLYyGSrLkU_;FWrC>m3$w->l^j7&@)BxkH{uXPt z?rn*VvsFLM{y>?x1+Pi-)xJJ?RpGWRa$@M=U@DdVRvVDJeq!N^mtd--`TZ^QWIUh&1jNiip=Yg74eBV z?qPS(E8i>pfrTM2XQ$X%n7`*Z2XNG8i*^ukbJK3G4jK5xDvuhP-u!So94>M$!^VeOLMtqxgk08*_!VAEUN9NQN< z=CN;GKf&zQ_;QzRibOv-JHZ*7(*M9(^$wbm4ufJ+znl&2kMcN5p(wQN;%bFK2E;|| zdI`d0H*uqc<%v{``RL9LbSea!Yz7i(9m&=;0?Eo(qpoDVV{B$AP!*RkE-eW;{NVqMG z95~^7mKGtLp=STNsn=O)0lFG8S`C!{VRdt>LAS%+V@o(4FOI{l6QjDUiv7D4Ug@)S z?AhgROtX%a10OQJ8R0B8Nw^Gr6p+78o|NsTShTQ7BCr~PN}-8gdZb0ja~AP%@>5eV zSDoM2iK|m~X?X?}gM87oskRC`i`^`eDs_sY=EC#Oj&$bv-zmTUJ^|WnLaWopnWi&T zDLXSX5JlhIPSZ@;EGwQvv>>kywp+z%PafdRvwg2T+t6&ft8-~gn_`@d?9>T7o^E4R z3PQE%IY7#kb0t}IuHzp+^GrX`fSbY2kv+&uNLrmP@TmjkF4+_!GwI`A#+Dbu0xt-V z_zPdfSv8{zj&bHWzh4Ip)%iFJp7dnIO5FPjvnHGFG~8Jg%KJ2?NiD93t_fNT;()uXVoYah8gY4UXShJ{yylj%ic6&Lue?I zsWzcIG@^#WE0#6woww`b3%&Aa0Ej=7!>(aNMy1z-!T$rcuwBMuN?|;m@1n0rR{ z-g&#+M34CDhNb9^iVHV{7q`JsA9l@#e9jCR2Ml)h=6Cm5Shz9y0)_zKd-n=DjbCQ? zpN%IBotc3yj<|F-`W<-|-(_=RC#i$R!!NVi&ZBXV8G}Mv#<&lIu-sT2@SuEhJ>|0y}Bgh0#$*R-0dZ+Lmo{sYDUVi88@}`8w zD^?M{c)_1_&Eru-6_(^*H3(2yh3Rp5aT7MXN98>>yQ^x`4mjho_NUa&EyHPiCn z%R4z^9a@5`$9g*TTnUf1VbRR_Azgu=T=Xt$fT8`44oXsPex00Q-;g)vw|K}HIP=MO z-UdHIy^p(msQ9l8BHH|IpTpFszT!5ouFn|Cu)=Zsa9taMRzo%|j_tahP zVQ$6H<}2vjgzxRHJY4 z0I(=`N4o{N$WmlT+H%g1jq!9?ImQl;+DJc}-WO(+xdL-B^T(+g5AT-s!Sr_I>6tze z@4Q`%2VcBcDMpsw=k;@B&Og7dTgPtP@?6t<-Mlc&nml8~7ky=Oo0;pXzUM6-y#7w< zu~a)B%h6W4BjU%pSdlgsZ=j)A!b)}m}&)PmTMu(7seZ*-j5pFM%x zhSO)gxE=L)*A&IZ<{eSoq_ugrw3<{?YQ~H!U^zO$*T2>B_3T|hu?!2T~P%Qcog2o4F z%AGr|7m20Zxm2!7=?fHQwwQ1Ni5!?H%#2`+Luee;#M}EHlDq^Xv1GU&gP$HN%7zA*!4JPCcP~ zLn#Iy`xw4Ahh+{^pBl4+En$R_KtV~?KYaY!{@Pq`QS$jKbCtDyUUixvO0eO^>&Owz zxbMIyOVF+@J+%L@=1xS3v^>qRPoH_7-<~6JyA&5?rsi4J3Q$kx_aju@6vB&Nw&9gq*8Vx?dJ zi<4C!JoD)9m<{zQvYe_D1hP@CMJ}s{2|SM-7;{7d*i6QmaGWYj?BoH?Jlh}Cci{F3 z-lh7A85ypj5U!2M12dRly_{r@XGaj}^lA{FK69=)=Xhsc%kLe(7Kl+$J`75A8Bs#E zjz=eTkeOPDD`27VHMTKwS4u~b8@d&RzWh*UUco!{E0~>^K(atMUSJ0rZ4Q%7^C}xO zW93Ep1?!8`qZOG>Q1R#X@%5peT{l8R3v9a~fT!8eph-EcP3Cl0Xa zY*$(ra5NPh_N;cmW)>%IpTLAT2<%Kck;%m{Ti#=Jf!`}QR2#Jvw2HPz2RfUoCkn0Q z^1m+Bm+yY@==Qz4rTp@d;n9G^Q<3HG^#@S!fapIf%KQj8y6TkD( Y$4+GSm~PTx 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

    jR9V#K>c6Y4-%@;*FjMbof-lW5;Ym*6>-<(Ro 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≥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%0D5lq=2-mPfv9uy3kJ1+9d> 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 z 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%0D@7vy7Ymt*lm{q> zBSBsIVN_Ra35rRzTtsiLWUik)UJ#R01ow`U5zAEDVUtX2`WjWf*wCT2?3K~ zhH>#yggny|`{JthTNmk>C`4rqVvB@860jFC+7(VGRME*^fkcCsk({<^=EczeKv`yv zpOmg?mN!d4lD8AQ|C@e85b1{sTtPXKvOzX(WqOtK2QFQO`a z+)aO*gAFyg52+0aoHd#3$Y&}Ga*Mn&@FSjxs&%pvSxeR0nqNXUXA2sm zRUt8IrC#~))0;Qn9ysS_hc+BIBqA!~)Jw?w5TO5165uT^`jUK2aqW5>gM@- zgZe9%*Iu*r0_uEQ>$Rta^pz^IY1g)0LHhc~bIw_XXSQF7N(5hRe;!m1ocqaxZkD)Z z!}kIipX>4l?R z5N`9>t7IH;By)X)9%HBIX8SYQ`N_l23~u0jZ6h`~k9yl4sho;PNGk z#tUW9ruj+{L9e{fb66-a3SpdK3Lr3(p$ROh1=BjRCbNERm5I_CKnMp)GHt zx7-b3J)naGMI$BIAGZUvhATgXMFSW@HMh&OD3cg|P9j73Iuzg>nPK4v4Gy%E|&U6Zo5>LS?O|{VGERCCWepB!SKL_@?orVFhw>R zWcF%r4X<=A__mfNEy{ym(5|U`5`iImVtOfGV&4&t%#&@PFfLy)udS%a}TXhWVWL; z_j+$lFYZnpZuA-_AcC`wNqa{Mwg#%L5=BD4#A!SdaQaa}&>(1`T2|)0-m+i8-a5i0 z6x+>Kffok-G;;T)NsWcXeoJ=chA$w-K>IrbCyIX!Mu}Tgn71l%#%5L)zL3^6oc)4dx5> z9!Q1-_Lml7>9WDXYknvYi!0H5YT^HF{Q!cv##Eqy5oK46M@L$a8^A$0VUA4-=0L96 z7v7luk`);&KSUjjODsRyAM!9{A!l?T>?D>-Oz@xqX7+x#mJLRlStuCdKksk?OhYbT zvLTcL->Ac5fCHD)O280}L?Wt#nh?AqWjoJ!8S``&4V|EoCJNjNn~_|Q$B(vvb;h+M zi-j1_rjrvw38nyCDIggXk>T1%BduDCkVCK#RMIZC14Xc*SsmsAq>&EU=JF-sr!=tU zh8*yQk8?x`SWMUem>uYz8^W2i0u~6cjwY0VdhIJAAli*W3{*HZMOrB5kvu)!7xokg zk1a-sK8I>>*s7G1ys2TEUA_dvL~bBTtVVb!GU$iXg94U`@Kkgh*~8HkjTu{(lq=lL z38u8#`sj;jkhkqnG@xp9ByA8zkZF-BQ0O0RZZn1iSAei8SSN#=sYRkkidW}?{6!P( z^sE|=9kS|{vqX?0?@bTei;`i72-{^=3-77+@8&!&lZOToB0S`|n{a~4>NTw(pmL;i zbf)~0p{Z5kK2d{a71xi{uMb(-$7+V8t%^UOhOB-lBP;{G%xYy#feIc^kpmpG zv!`e14z#u#^1YCzuKi%HYC0h*u3^hySn#*J&?`9LRXCs0~E8y{JiaD@alr0J6>5D!qACK1{NfFM1q`SK<6eYGu7^hr1nJ_-=Mo**5i{A{TD=9R203>htob zN|)8}+8)bVWByc^1=OCU7*O;;z7#|7Jch!n;0Qi;wp1a2+HdOerG`xp7M^@GY7bv( zuG#MS^{x;hb=zr!Qi^9^0HoJKV+%W^9%2||^4ah$%qr^YddZ%o*Ms_W_DKrBM!}v? zaS-s)z|Eur6>KeO7xWp#m)p_rY9H6^Si9dSVR=5lLY=Z#2Yc9gS7j>`>g`0GM|uTy z$`U1a`%A@bl;%+Yqb7~0##1P${3wTajLugp7KanUq$#|7sZANME?22IWA9m~f{aYp z)oABk52@J+WRIEkQZ(4q471h9c##odrjyo=C+P;v?;+Z;=y%m_p*{~OZZ?v`<3s$i zOuxL^-LyDiS@UhZOonVT>P%F-w0c&Fug}egP*mlhV#OVg)NaRvc2lE};h{vgYg+CE zuNa&_Q}M$(Ka!LM(mp#W;(iboqavmsLw;tVs=$1DZO7bZX_$LaTGzH+FVlydM4T0q zM1&|MlajRAaEkOq$Wa*o?ftKYqnRVxd~L8^vpYLXMFXu zoGC|&+{%hk{WB9cp%gnt(p9rkgpSXlMb-lxX-6Zh3n78Grxstho@~;wsIx=zAIMFj z9cFW^>35_TdQue0SG|-UGIyPtJ1ayE=SJ2NRq`0aB6Fv1FANRZfNI6G7n6aaZL0Qm zR)}qx?UA&O9mL#0^;Xi|FxhHZL8^dux@D=FTgUurk_On{*ja;ZDtVa4B& z>~A@$NuDt+!1H-U`P^aGL&w$R-n@YJJhzpwBGeau`I6z2cYeF_3yp0H)@%T)KK{9( zpAC`RnbqjFL!egy7gv>SO=hGsXPpm&`#??L0B>^>*6Ct{Xd9v2{+0x0- zPL-LQF+26Db}(c}L*ggkyBUuTR6}*=^z7)RXnTXhk~^5(ybe)WluNpLLDj+hD3ZL) z1jKTd#{7~J&-1Zh1riEj$FF)Y62xDAr|y~zin(lZC`>D%CQFayvZl`pmOai4p~K&8 zzbsi&i}sG*qqTBoTh#2zr#mMNTxAkGWMXQz#fpmx9Ca!n znBbVNP+F~)A$8ad7BBm_Pzs~`)^flJ%vo`0tR!wT(|Wwk=-I7JlehU7CZO(^%?dPQ zbT7EIH@Qz_9X_7!{d-}0y!Dg>?EmK7&Pmk_J{mbUSO_}%iNq1fS9?S3bMih7(TC0l-t>e30@SzX!CNgeM{bs1eHeDFA*V?Wev@5{(+-u-zW1EoXn5> z6}0bmKGxB`Us1Qzd5;@Tof)}v-Yx&_ps(Jm?SxZ>mr+N2%xudnjBw4UQP zZ1|{2Nx~Jtx_2Oq#YihAPMzWB6NVY`pm;;;9LZ^svV=`$+z=~E>8*E$2ekE3qQ{AZ z+cLpzjiZLJ{TjKWA|a`>??xFs2~*$P+r9PtsAJ%N_PySGO# zX&Bws5k%YqiSmO!9`s&X`8T6)rw1?1Plq~9>f^|bT-+%P8ax~!p zhB62Getf)NFHrHd_Gx_A=Zsh6XP66a(p3#v{e;~xeN*fzXRwF`s=B2qLZgHw?nUf< zq66~fe|<+cXz(HVS*?Ca^1>QP1(cMa>ETUIP`F>yo!bQ=Ez0;MM#jkT=zt9AvffCbb_xFJ5k+j{Ms zoB0m^ry-wu6-X)!wnvXctSrMc<93qq*D!Z8&H+sOS}wSJ-dRi-L`+shKAox?k@;-R z_a)iVR`Y$;p3qS*ogBuy&h*~BE`5LAhBxY^*zjFDe+7~Kie0-atE{$HRkey#4nv%i zv757F$<2lPQ20fD8xiRr{ zKw*$1Gb{oxLQTFvdyfzCM8Lb$)NN4TW)`0~XSr1A=$Cu^XFgC?e+7rRcD2PoeH z)#gzgBk;x%xPVD44MLhFp5*`NBb7hl;ijR2lU){11{M5gc2Chh!mVTBkmu7a93*t zyx(iBysEE^j&d~Hx`^&hQ!?AIJCMjCM12<=B1GCSA{54p{D1)Swl38z`+jd-7t|=) zN={oa@%LK~D!Ddh_ghY8AxW3C-V&loxTfMz`nIJkv7_y~% z1mC#i1qPdP0WD$ia>19Yeq3i>mAipk+Y5f@-Bop*T!QjR%t>@HlZ>PrG$^B05m{La zzajZbP=~--A3OQxpyB-LwTlbN#S4Zuqq1F%Q4>nRPu zKeSgYm6$^2V8@&u=jE$y_*_W#QYScJNm5fpd6X7WLSA0%I^=+fKud{pNQ)Ff_nfnb z02Gw=GcKngj+yRV@;Np3vM;8Y(?I|3T#L`h*jrWA3S&?5Vj#)fHKaGj9#pi^z0ZWd zCMp)sbsCEdeP?jJ>_T!_Yw-LjjH# zR1#(bGrs--oU;AF&n19GB>;Xr&G&pI?R^qs&mPSoV6ZXvesh+GE?J1z+H84{5D-S9 zk`goycOeN-NGp^$C{RR^3-T7ETnyIRY`QNlv16zX_S$Sc=aEtHI??UxWcFEcdiI$; zKF#U5ZD(qI#PG}Z)?@Fz$SsoOfbTITxDLY@7^c7ng*%U!FfWfus%~QRzd4dpII#`j9FwYPMsDg|H&Sg$MQfn8lETy;JSH;&#(m3M)(dJx3RJ2<*l|$UH z1V#JUSv8cTt)pc;x@wj?5JP(L-1YYOZ{gMNxsL3{n z7da&p4jHQ@$A;SHmP+WYPg8(Of)bBMpBuKf9aKV9YjPS2^8m9yBqKH%7ZFLQBb=`; zQfyUQ>FQ#7YkuAIlpr~);bBG=mpL2&N%~VUmzm@fQ7ILgI7qxQDr!k1p!&L^jNUpg z5-5XEOZ#0Q|B(7|<>Bs)@zSFd>u}-q9AtXZI>1tP3%hJ)udb@$Y^+&SYg4a;iV=bS z%GQo^G$-UYAWe?2q}(zFt#}%1_Q&rK)OOE#Cnt7~7^}fA@-HN(=+}0V`q4Gd-^xgI z>4P$?v})TYT36uTSgV%gOZRnh1!(O;o5tbj+#61ugZ#+Z&mYxehuph(47G%wGac`9 zH$t}RSSZtu0+t*CEbxTZWYcAMOc?D2ur_N<5v^ndx^K6Y46fha`T5N|18IQ7n~L~8 z;Xy|zgi$Fm6ori;Ac%us5lJPCeW=!LsoGug$uU@;NRIu~7AcL@RCLtX=L-7d_6I@+ zmxv9C|0F4agc89YA00yY7N@i@$q$7NFPv_zq~F%Jq8F3FJMCZ?XYt2+FjQ$I;Is_y z@99jFuWhXNv$Nhm?VGBBthNtXU>~Rj_A3_H9kZ$jvM!vpQ+aNV-Yj&50fxDcg9(mC zRN~q|cpwcTvX7Fj5+yq~s2co6@MPkK0}6*f@@C|0L*1+^!SkHj{#7$Zvmh8&9dm2h z_JA$f^GTRY!q)-L6XRfA*K6G8xs*}X2!t{3gCxRe`X!3Cob@*_SZC#w>q z!%+Q6(2pgA#acLXZ?C#Go|7^7GC|l!Bd++i4_OTZl@yHd0MPjfbKx|*CCX=Y8K7ZV zxy0v~D|YAI-X2^u*CtyJM1+qd^^peN5T*#op3i;3CP)a*=xL1 zoX;{aIZS3W#xU?*AIdMnT4`a4>E^xOvM)&4?TnU9gMs6h4njQG(_yHDz&tc`k+Wnb zO6X&D)Xj^%r6Z(aO$gimy3A`&79!UZssJ)zHO8L9&vUOK#Vk;nsbcQ!-g+)hG=tDq zQr3P2*3v*@jUg0!Sk7o)qs&(45dwWEka?E3JbSgbhL^3qW2?x>aF7YI;xq1iS`7m5 zE@ojFGd)>TLTI)_)p@tKju$YcZ1HRYN!lQdhVmNI>cb^k{QdBZmqBJ4fw27pkC{fEUzjt4g+#iYL|weTkSPD^Pq zMl-Az`4J9fq56u95@&&kjW~c_`-XSx02XExrTEGBJK@JlC4zW*GW=;t8w^)do}vy* zc}Va`d429?QCX01YrEbDI@fW{b>@G7>HEv?YpeCejn#T~R_k9{t96lfzSGX=ZL>lK zJ9&Dk=J1O zUgM{6*p0G$PL0#OYIp2JLnIEK*OI@*$_s{X5?(7MX6z+xy;J)?XfI`pmppqv$7zY!GDbSFJAB~*YOOhu=r9Y2 z5$1y@JG?dU`U+chYdF{j18PsUpOA-Au_2lQ|vx*ms24?h+i1w6VP@ zuPdmxZ$H$v+xx4nwya5uo?{Y{rVH{w1aF}52nZ(LIYFyFLO8%8MoT5Es_$%^jhUMy zM7WVo&qqu@L|hzQe0UB7qoZA1mr(oW^?IM3>62XZye$lQsN8EzpV<@EqVF+%Bo0%o z7f0J04t5CnwuiVxClg0!adx2Br*vPLKEri)WGO_nQOo*BGis&&2SNsM}9uYOfP2Fwru8@0s;6xTCUspPN_C z_jBUn1Ibwcs~>TOB0~WVU;?ouQsYIKIYCgfbCU^^rAJ;sVTZxo^>V-AQ|`E_o>Rl; z-tPTF=Zm21hE|@D;j^l$jo~vNEdQ;^WZQbtmfUfb=lR@#0x}>3ijfN-3O4G9GEC@( z`HC|lAKH%<|F>=j`kHia7cFOSCJGW!H&+PHZLfoWbMM6(R zgCInbumepCjA#g4z*7~TlU}n&cMPvn#C70nnms2v!L-?PvTNYU%%1!d%pQH_a&NLH zu0C+L_0QK^J1=qib)|S<5K2A@+$D0m^~jn7Y=Ohj!}4TkQxHVsdT8HVb@x6eJ4SS@ z&8^g05nhU%P)07vG;eV3RS^nCW!5-lMyxJO)S{}b@iO;zZ!cccseZWo>U*xOEX5%M z)gWh&3-E*BpMfw;v^a@?d?buKPm#ryCvmxm-Wp%F*I!!|{Gym_Fyg>P_a$s_j^;iI znsV5Wc@q&@RN0Ivop)E&aW-~Q1giu!HKd%Y$_AQwP@kBDsn`av3#tIXK#Znezwlk9VBQkq#fE@+ z{`xt0?fHLe1y}ZK5HQt5o|~c9kTf^U{`CfObsS@7HAj?KDk=$#7va#dBU480Bg^1*k&-V5M* z!ncIsN9eQ2?MRMD5BN3@e3EXGaMas4y5344#zi$raUm1pEGWpN3BT#-?7a>Baznp- ze(0CaFFEqU92;1&$fC*5e%C-$BzTf<8d)%?BZ%?Cj1*!`OTE-I;#KBXYZ}jyC#~%1 zhI%QoE98^dyG5A!M@o3_m!iY9p1`oosEd=e*LHu?5OQ*==3S*)pyFy{t0(f@?CeB@?P|ot(JXX{V$6$*q{Vq2`E?Q3BvWqC4gka#I2oik3&;RKhIfy< zE`kH!20h!O-yVg|-h)XOGFWG4cOwtKMwsKOsy24^_9|)K?|_{R6Ut4K4A%k<7zs4V zoFe7y2WThh1R4_s$p1{Cc;i<+GdufiwP-pag!-zt2|t{(0BjVY9-NK+D^}6j1_y5J zU*qk2yw_{VcftqFm-{@09$uQ6OV-(pP!b`+gwn${2iisKhs-sI#HOCx_(kC6zK?~j z{MvJG_l}Z|RWw%YH$TKN30==8>r%vj83M$RvnoZ|OoDr>3e7l4tn)N>_Gx8YA;i%O zx029zB~8*Q`+D|-o8o5eUmrl60FF-QFS2I z{1{D$E=TvJ4M+FvIJ(Zd39^cQgB_U}qqlx;CS;C>mavJks0rc+LoVsd_Oj?f68&i0b?%c^~Ju z;^fBbcJSUKwvS(%;F&KWb#jG6?^CUYl${s#WRe|tg=Crp8t)A<%hV24|+1U;Ct| zj|n3@(RJ%&eA@C9__T6DngepX^Y^+uRtn^Xt6 zrmnTKkzzr=RrG1*KA!2`zn8?6Z#`xDkDvBUmu%gGchwx9o1H_3TwgRn@r$7g-MC>I z<#B?9cnU|pXc}K~xK?>UWQ(X@M|p(=7Tz;dSrB6(v*`@We@^Y3y@v<6^WgKN-*&ok zMt07ssy24ccP{p@K+rEHzW^Dm&?OJkShU_mYrY{EF+pk9i@IV)8$0J&*g5)qCL>ty!M=ci!reE5qUIV;sssdFXUw2dFCTadm4?MS#?`y98Nbw<$H8YVx| zVSlnf%mvPx4{lU9MEb*tD+v5UV3HVQuCY$-*Rh*Nd4R}>LBLlPGIu{&WFTIiyF}U= zi;7i5)QN*6jD!G^(b+P93yB>18bP zs9A}&Zd%u6SbJ66Mrp1tW>w8+6BdZNf}fN7#fc;N0;3o$OFs&oh7^)y9E`KPVKexK z7#Lo#1t{iv1X8Yaqh#0Y6JQ|9jq+#Kz<5ya4$J+T1R-tWK!+r;K4}z{Q4uaAY#*2x z2Avm_LGkFQR=OsSNJu|#MQpOjpP?1;$Mz)pR8QpK=4>L*&2p%tCdSQL=Wdlr=8_x| z9ob77;;?asL{UR(PMAPVMFv~GAJ;<+mJl3Hv8XJY^xI%Ld|r;7@ow|QIam%Ws@hl% z-#N>{BM*lcg=DWJB?ocq61|`1spGk1^vu%&bZo<}JCi83C-9KygE#atQS4ThL-cjd z(>_xHU49>-2=Yn#0e32JXjI!lpPP*AWu&b`9QUhC1-TsfVH|vggQWkc(dNO)u1zO1 z5B~F0Fc0p0xML2+*|~UkSdvoe?wG6z6W?_+#K669d+D)fW+hw{iH1&cIPS{mdx;0s zuZiC(OX9cEEF)uR>>@hDhaOmV%*BE*0(xlBexFSwK$1TXNE(5+jg$y} zgCquO_9PMvlQgjx$JwjBHT>{+O#0wqDT(gtF&;Wy5!d_}Rp-K~>xxZ_EDr>gg5o!1 zfXh*GChffCXDyY`TiS6wCYf+tsz{MOC8gADT4!RNJ}Zrtmy~a#H7We84C9Oi;FlG_e}090 zjA+d>?`04n9LK^iH>dW^Rd>?XX4yoU&9hJzy*!&Jvt{j#O_Uj_r5D&si|b~VrB0jZ zn*?_Y`Yq2q!JS_uX~cEaL7A1zDjCu}_=9~1`~tYGs8ScPbPKSMC6k*h&Pr~wsI5xw zz!?87GPpij|HR7*8rX4LUYKHQ0u}sDC~fv1|62ZW^<%Q$4kQQ3;A4SuYGDe#Kb?TE z)Pq~&(Y0Qsg=DXKiA6zm@U3#aGjO~NrL`1iT&fXMi+z_{= zcBrFdIvQ6K7_nrpWWdUl+dqw#@C zNH1C6>%80@*g6K6FA)p|9j_Wrjz$ym!jr~9<*_>^L`(+dL({B5McWSV@$|lo!gwIQ z(8-`})s_@>S2Ex&y;;=v^24@mlp&cUsBlsr3=e4+KWW>e`Yc7M{?HhRz|kO|s78?* zWx9VXt=g|isJgHFWEh_}h7X1l$u`fg|C;2YyHd&>o0$CJ@OamB?M4lXaV(yEdGyYx z9OnD&gIj|e_2g(s-+6u_MRcn=91V)$VI?iz&mT@m5cu2aaLlO5km);uB)gwXi-V!o zO_hJjFDYobfwpy9I5uS@-K)IH?Br7V;32&}${D5Vsva?!Vaj<}k0qjSJUO;ws;7+t zeDxrI3AXfHJenNW2dboedOTtg=tn6SPYbqv^d}H6Zr)Ouhctbnevl8#=QN~TMt|7^@&Y2c1mM`J#5lWJ2tgLdEA`*-r*Us^}UIDfcxkFRiAu#m>(h>V(t$6Mre z+Wz^S>)ZRId!y}xoaH*+HY;N5=NS5PTR`bca|G!eyf3}xUj-n{fio7XYMB~Gd2+p)B0!HeaLToOk<2s-2 zj4F<{|C<^3&Eqd$BA?JT-+P?T+IWerhR>!M)(~;zu`gf5^6EN+=Q+)9lAnr|}To={ruRp z_&>IvF-_a!is8s*$dQv^s~nEhFg)iEa+k<^wGeK1=WF5i`B!sS)2}m`Eu(rVEsUF_Zsg)! zYdlHAo#qvBRz8V7O1x`+K&tWTWFe@54{0}Zb2jG~Dj{j+oixr%r-sq%do>vt;v41` z9>V3DJGbuKcC#={w;td=PI;O0DAWJZreINcJU~jvq$p{4Nm>&Lt#V*Q`hJ=eY@pBt z7h*31$MqdAxGVSf;9BHy262OjN-DWcsNt_vE7g7eiOvemFQ`vs-<*tJ@Q>_ARgH#Q zoX*>xD{7DN_QKGt;|jl`E*0~^d6F}z3cZwM?LL*IU`h=*(m7fzg!*Q&7KmU3! z_SGU}dR|T)Tl<4Hq|xjxj=pAEt1=@wp68M{l9&Y0+z?AHPs-3C=Y3te&=8WAAF#ft z-X8v_b1`+~=GdmI5A!^cC|_(|j}fgKUS8Z-m3(cg(v_vGs<+u=>Pne>OZ^x+wR}1>%xD_ z<=~^ef2IEX@8qKJ){|fjWZaPu*MPO2gEf#sksxj6$m1g|lPJjR5Z1`au!ifC`-6Ah zzcYA8-EhR{G`Hu$9j^XE+4dK)hS&4S{bFy@k2JW~LRZMozAHDrIi#W8rb6} zNZdN}|F)@_8Uiod@1bplV=f*fQI!eIB?@zR=-3z9FG(N+^&3|9@p#B}KyMe^&+CE> zS3wibO9D+8%TjI=T#vAT6q+G}FsnmA2V1s+BPOC)qfOOM4l%|nHB#7eH%xuz-i@~ZSXy zjZ4-=39Sj>L#L2bA2_H%$#tE{qFK`;vCbPAAM?w}pyaf_$3W)CGjm>sOtnJb4bze< zvP=#}02)|^!_m~fsa~wd8YRL~mT}=8jYU42n>DZ5j?!Xm?J0212phW22L(-HAqs>; ztF_TA3qsnpH?8ie)wDMqKiYbm5dwy=aTMDr5QQcdozp=iQ$j?=tb2Ya<{QAhAh(tUf(8T4Fc|M8z87wb@$=f*RK# zDD;Oplb)L$a$K|S<;N^$DPw1JpuTBFgF$;wZ)z*H)~kcN8VCxvxaw|!CSnLh{5{%= zyEu^<9a$O1$b6*!-odr5)LZwqfOX*gU7aC^CCDiGaW&ZUw#MgZtROaKP72J-`=B^d zv+n+*fpkW`VQIX8OAL9vU&(;;{qe2ScOaGH;TO8c3J6lGc+7Z~deP~2s%1baosGhd zt@@7TgBHkBYRc6o#=^MmB~T`C>f$NvID=dIaJ{My-Sfh}u9Q`rhe^>8OB^Ou)-;(P z;~Q~Hv=I3XuA`ztPN|DOoFmuiM_}ISa>R<)5K+evzVx->F5gYFPC*NBm(ab5q;8pX&4Yu*V6iUd%|2=q=M#x-7D z!t_O)6{RPh6m=h3Dq$6z(vs2Uu{&Ma*+74L3M3I${e2MkK0%e)9A z3@96!pd|NQbo>+R44r$sx1QJLA(6JSNR)(PVi@6RBYokfrIX`-brMnpvvmYO(Se2C zmWt@D@rNxuBSH|f3ggVLYM3>397<@4WQ}$MVs_HB$-w%-=WW*Lr4oAU1E8yhLYe?2 zDi!6Tt&^Z2kn@0O%?wrMkX#7j4S=Cj#s#V`Zb+!i4CY%drMKS83OY6DZCfP?%Bu?J zr;}EaddaI}(a|iOD2b9Z_Q@@s*wmyJ$g(|t>pgTb`8M9vvT=UAesUz3#@7Wtr$#?EI3fs0A(G7QQ7Gg z0LNqq%%iM#1HtU(AZkSoTkVVC(Gl-}7pb}x>IPCGRbCxX3(OrDLAx~ppnyiub_BB% z`p}^MysVFo)eCa79oGk=2jDndSu5B}Tu}|)fpZef=o3J=$zZZOn(lM=75+AG8I7+@-X08_LBsy05z!gdh(ZoQChKYo?u}x?G4+7E(5M7qq{K?2xq=!! z1O(h=yy)dE`L9Av6`Um~OAb5e5H~)+%Yndrv|jN^K-|D*_8$%WtN7nFAgH^f&@)*z zbW>BCB<7ZX0DMuiLcHw)rGo;S30!LVO*^w?r~&T5duBBc?vz7W%!3c|Lcm_2KhUH7 z5!jR(JV0P$Z3sklG!l}689~Nq)Yoh!w}r4(!qyq{5(7q9Fz^?HJ{vKBtD=@3cHRr#28ZWsQ%t$GY&-t4 za_p_5rIu-j-#<|U6uxa1JKv&esw}1XYTH8PBUVUmEha<`(E(`s9>bvlNU2BcM7vJa z8r17bR+=nkb^!Sp74A00^9|N(E_0xK3g8qZSOGP9iVU_Xjv+O!-6b-{bvRb!LwY$B zPXHgI@kt0za553Vt;JZ`^Q>jsj;QUL#Rn&!X z0D&yI$5xs1WH{(r4qJ0m9i1|H?Pl|?{X%gyTvtb@nz386qjPZO=6mm6zr`+m2=3k< zo>%9+UjqMeg32CvUKrrd$}Ebx*SJ~Ga11~o$Io07;~1AE;n)$fJeikzFyDd-qDK^S z`%TCclDbJvT7$BSjy?a_U=U~h*dPIlz=PRck6TxE4d%)>0vlAVg4*e3*Mi_$IG3o8 zTa1wLS5V>Nek$Cbex!V)+;e754Hms|y>~jk0SBQpP7J5fZ~_#ePcEg3!PgnAH!OdT z?OdIlcSiw>lFE>EmGec&lMcJ)(Z}vbOo(P2N6C*)zZsR+7mOejwEOlJ@W_~ zye=!*i@E|~Z9#?}*K#D^de-P5Q7zg~LsrCvYtlsr(YlD%qJuDwVGa--TW1Pn;d}rR z$eg+;g8~L#5f>a5Yj}3-Q6cDHx`ie0rI^;s=-|1XXGR0)L}vA=0E6wYt^)=ya_P(A zBv|CEjsu^ZJP6Q4$mqZc@}1m^a|gx4tZooaL5b3!6SG%W0TV40_%dFqd;7U0iZVDL zLITKUGkqv8N#tt|IEOTS0^PGF6>Z~5$ddvcJMZ?^@ml9%*u?=0^j%B1Y7jJQuokuj z;=bUiCIKi5MAIa0*@nwS^wxN`DHL9|S7AG5;4dD7j}QHVtZJO7tUR<&(}G-arm|Iq^w#?F z?&tvEPhe#OK_?zKl88)^vW6)l5T2wZ;I&|V388ug*@tbsD=(`|1VYuqTP~uv#+S79Y%3zPFi5y7Ix&$lR1`KO z=K(ycTykWQWUoYm&Q#RC*<1dL>Jq4K_;w-wg_SZ=SfQ8?1@73N zPd%{eQ<0wV-?$qoj#oJI!?J7a+DGU+~75lPtk)9UgH%a?F;;G4AivDJp!aVm*sP`QD0gnt;}#@ zbLn^OrGI4_@cd}F{a{!>oNR~b9#rZoy5H%_Jagp|NaU#`*;`fBDy^PPlD%(1XjN-4 zEk!utrpxn6atjp186YJ|mNh;!80vnWMlOUgB;aT0M_bU6<<-PE((wm7F@ctn{EBD| z4}wR91C6T(j=#DqrqvhW^s3#JY?PA@V36y!vZwy(2P0vx|6DNfLph%YcY#F9fukKP z5OKvMS3Ft;=X0t^Q1ZUKr2>`@p`ms|ak&=$lBkF;UtcWP9`;EU`%%pWp0wt2g9{}J zs=|*NB4*imaS{6{+58=45Z$D1R~J-mkM|U-aJk%RzISp7S#vy-2Le8r9)g>8h@SSa z?UR*_U9K`U;g?X!nNq+(r|@bQyD5*$I*16r;WD{klP+H?{5X_M6=IWq`Ge#7^W*K^ z;{#%QI#FOJJcqPxd9s_=$!yC#yD{rceCt>!(D_uwTLYuu6cn4?lBpO|dxN#Tbi?Aj5w!FV(}cvcA~7Be^K>+82B^+Rif{{z_xR^~}l zx60P^3mU%)eRd||q4|OfAzuX8e{~jxdEg`X*;+1NUF2%B<18Yr!T_76kPQ{lT0X`A zi?xBbP>>vzWW#k)dGJ&^_J$R5QHF;7hgNktM=hO)tQOV4vuRZc7@&Hx=@Z3_uvPwD(*oq zLy_hu8y^#jq*Y?@KPuXRa!2d-;k?&@ zdz7Nur_L6|Unp?~O$K46A~M9Ak4sOSfo((<_3n)Jrw7H5$PU|trSin3Dxpd|jmx&i zzgi#fj_~_h2d;L?s$tQUsPl$62#`sh#D#a2oy~G+Jr!95fmJ4dMNA*#Y)1V$DA`DVOj<$*lZ#vHJ%h*bYhqcB#0wnVdSD}4U_xz9PkC>|yVxPncLY8nL@9#T`cS5L%qoiAAO@6pLf?hxX$V3KyzEa&5nI%~qHPnmI zBMOGRVc02X0oePH`7Ogu+wGFc4ZWVgoYA2=+z55)2$H}IS?CSII{PwRhXaU2#Nn`H z2ICQw4@O-U^?Xd<8a@H5{Dwrk=ra@a* zXIVq?;aW!&7>Bal1Xa9~{$Tkb{c{RR1-epvPAJku^<#fDx48PwB$YR@M_lj`)-9BF-f zxQ@M>YlaTA(*q`hr;a0-MFfSwUllqF{o6-LgXn>^bi+XGm>5PMq7SaLI% zo$_i~Eg#9Mk=QGO=nqeCy_#}IN4XqI;WO^22?gh<Y_xDO`I{c` z#o&)zb9T*BKf@na21;ay%s4@ePrt^EnAEUG5Oc{ALS4hgErJ5Env7rwT)*UnsUpHW zGJ>;`4$S#%-3MPc=Joedzte|#zX4KefCc!}k!3>?idb1j7+2&3enF&Kir{<-SwM1FktvUK9*7NhzL53KjAu+E1MnAd%+}%M; zke4S(pOhKSO*}^+b6c)M0%5ar-m8F8BH7_OBJ44PKvaUbjnCmpcH8Oy{4Srx__Y2 zl*78!jw?%8eI@iHpWs}mcx2ViVZb}SS3vuM3mB$^U8{lazT8{O8=4CROf4vafTZpC zx=D}+K@4Xo6`@B-&z2TM>6R|Iy&D#O8MO*-t4isu_Yc$?%%%<5LpeuG0z0_1k0f7& z@?ZvwiLW1mPu}3$MeBphQ5_XoX5%i`7uDN>*R`qA0`zUwJ~yqhgqnb49(*toEs?4) zXL9{C_3==69!i;dm{*jss?IZIZzXlfKoxNC;FJ)Tn$=ETus+a!Bw1!!2Y86)yeUu2 z-a7S!bSTuNTWsiFhTmiriwh!`e!_3brFV_*(qWz6*Q*B04meQ7d7=&P91!UV#*3?k z90!gCAe`xV-$8g9T+c|>>0ERf@}<svi4!ZB}{aXx|U%s|r zYo3glrM8{dN@TIb`DG@{kOp2`$P#Pps2&aR_pLMg1RCN5tWLHe;Z+kWCvIwgn6DQU z_n%P?x?6pdG>~=nAxrB6wX}Z4(z;`vO|l}K6_a>wHYpt0LR2OSH-Lu=nF0;bEEXcE z$N!*I_@38r+LN*uO{SPo2QLT$V)1KOa7EY+dU&=r>DQ*TrIX)=&KGet?OeR)O;e$? z>GX4R5lv{p2~KsZRUQBGie29;S#;I*s;X8|+BWIuzCEJhtqr%tY~zRz;I@@q{1R@O zRTwysUR);%;4oEb6%+l~S(9x+8)n=2G28T&C3cCfhj=dJKKOGYL;mH9zqtG12ao5q z$ip;7j>Au#Cg4UL62eN97-}?7fpg+jqqq^NmIdRs!$&h0BqC$nui&G-ET@RxdH$Z( z{EIzpy`JpWcrxqtpUGxMG$EHT5)2%TKYz4kPGA*Oh%y7e+2(S83;|7ZC$?|gy8YR^ zzrMSzZd~tvjz|GsHJXYV1~jz%NX|VHgM?tN>x|wDxN63Lu-e{DTuvrnP{Ktp#7HX+ z!w;yGu|*)JOkr80%4Ga6jtLQ{!iRGUpci_Qbtfg9+pHlm=4Un z-CNJMBSGIw+M={0#pXi-9>VXU8q+gGA<8L22;?M*BMguP2OuV9q}n%oN9hHuR$Dmw zXXLt*L=}Eh%YNn&O{m280NAQ943f->mg(2}OUBN$B^QZXg;B!UgH{z(uR!jm{JH1Ns|tVty@nEVV>SYcN ze({+@_rYp2?9vO&TCef>Ex|cHZ3n|(9Utq#P^bxBTkBc>-UjXX>hx(R!+zFE&wSdu z;Jy;=ST~jDhItejhpQV@E*>Yptns}Q*B#V;(V#M&gbAV0#KyX!t|)B#kf^_uK;<$h zi-hB#>!Ev2F^?!d$esJy!*jqqR#mmZJhoROL?FQ52BDS~s#wB2V!y(n5fDR~D>X~> zMAF73VoM@u(;OXP&df)hRi5_IS!FHudF2Q3+lDrlAl*Q`=Ysn+EEE%2n5jB7zPRYientQbsZp6 zf^2V;@R57=Eaw)Ubq*&=agXA57N8BVixRPvpA6`&0kHy65y;7WWtD7Z9!ff|hO zvll4PX726Y)ufGQJ<(sw=3X2dn=SK9EbgjcOg7)rsfzyBSvw&z#{8%z7z zv*H!pemYBg)ij=)m5rclke4BHf%vny?z^Pztm`u3j*tPEb9|>{3-zEDNJ{g%_W96@ zf(^R#5Pl^(dq$>zPOa>{DR-iDcevZ>${8^WR#mmJvcIcVc18}KG~#d%QcP_GB)K+A z-jK9GgsQB$^%Pwu%f`w+HO-ujl}&1#*5Wg~%8iwcBe86~d9X~sVnk-9vbHWZR`!gc zu(7fw4Dn@4x%rBf)cU3MLi#Rww9nPLE)zd)8svI$uM@;U#$a?-!3jyYS5>K>kj<1` z@oB8<(-K<^{A&?9+$1}c6j!Tg`m-kjQot)vB(+v`t1)I+_xI~Z4iPOxK@%`drzP?k zC6v*40$EGRxhg9DLm0GC%bfp^R82}$!MJie1!xjHVibhBtKe*&M?iqKiLKFWX$_t*)Sp< z%lfr6U+;Xl^Vu(N-Q4E?-#~(-7@@tho^(&@o(Xv^kU!%FXRcY+cScZd73M^urbv*G zE0x4kg@`BDNbgo9$7xhsgMW1~bGMBpa`lj${pN z*@D!nMHY~?xFM7y_Q(hxShj3$X}!H9)h<_4XZ~ucO|l^7ZUQ3ilyOe|wNIXkg#03D z?A8bx6Q|tR`d60HTkor;UX>ltPAFF%V%Q12Ms`MM%>_9j$Sp$93Q_(M(S1#7V=5Nj z@2%^F`$t1tMNEzgg63lfeP#*UAiH(O<%_cbUT+fCa3*Z0^lQB(zajU1=Xm7I?)$c) zv@VIOK}3Qa7mQv`%HlMG@a&?1-Q;x>6&1ciWy7p2WmUar!+1`UuxMg<_VivXL=Sym z{FaUz)Px3kgujcI@o6l?QxE7)ulY#j#`tHtQn}rDrP&kK|4PzX)W6tARM3Qy0hom# zI1pn_8qhs)bVN6D4-%NKq;!R%Zp{o8V)Pvd>YfZ%Ms;s^&Vquew7zF%(*D!lwf2=f z=dSnF%;LFOylx(2*9Ija+@!%yOPoPLLtsS_5?mS~fkA@z91)3#Y)ENDuBW0bd@^;p zF)x&1*Gzm)E#BeY7r4GAMSrG}Qwi%{Rn;nscN5nAoe1mB^8)P_>=VRn1O?^h%y)+1 zRUQ{PF~OzR{k%4Y@2MHSi_X`V)a}1z@Di{W#u?#eJ_(E@=OH;#$T{Xz1)&{LRt2eR zFQx69tL}#_g>e&1JdY$V*>*}x$6nQa-$yzG0yROhnDHd6aY$m9kmRi?1MpT@3Re5c zvZH%P{{`ho)kc(`a-q%x62Xu|P;S^5ac)yO5oSnJV-P%%`}O&yAlsN=Jt~`E;+Mn? zM9%famDzEh>Y>VllH|8wOg_YN_J$^Kau++YjNzYWO-bypjq2{a+q*tDuGeACYHq-jn*`#*=z>p48OL)edPtNGh;D*wHgScu!`$XRgl8y7bDJM8TEs@qd+H zB1K3>J`d>%Zc%=QRv~*QqG4rPevV2hqbL?vc~5)0H#w zr>?4Mm36uCr+&Nrsbt}}NNp`mUXVXbF+7pev$9w-qe)C5@f>X$KJ6?L%_pW)-wNSz$QAxt@-V!)%21{~h zc;U4u*kT^Nz#6UpsdDg>q=pQK6GTgK^E;%iaSrQ;&ZE)zzR)=(lUPNjn=xsfuq#ZK zLX+XL^Q4FYbKWq6lCc9XLmM7>^P)<1Nt!pMWh}bMxB*Gx*9<+p$R( zr*g`DF(hY_%G{{xR>|KWmP(aZ2h^gn&y~A%d7r1?jheyXAOAml@A6#Pm0tOkDoJK0 zC=`pVDwWgB-TN*g+nO@1^q4t&` zYpN*eiM{Fzx&dl0_dnhp9%6KNe2ST;+{3skPPp?S{ajYXP&p~>XAk6ZX(=VkpX5h; zMxhU5f~6lP+{9|Uqi}1IKknn^hUZ~+z}Tr37i&Gr7DKD%#)Wk(2HSkpOk){FRTm|E z!Li!9nW_L|R_x+wW!&V9^&N9^ByLv9G*S$pq$^aF1h@~71Xj+Z#-~u-+H@m@W`k&E zbt)3!O#bSNjKdx`+6;i)zIZM&6@^-@CXFqF4#alssNz{w9Y*4^8eQpvJR3?MQoNiV z4SMb>?cb`k@y;88zuY^y9fl9&Zih=;=S* z#r9HsJC8@DOcgWE;=3n^(;#AyV~A} zHQ!{lQwrzt zF+1w^lRmlfHRYVnarXa_XKuW$9GaW0duyP|6P0fzj|l#pY-MFjg>&u$Dfi)Ur1y04 zi}=Fo?Qyne7JkY(9AOU3@~gHQC%M{iNZ&7wiz6{LfJk|eo<@a6?I2wt$&-Q>jW`H@KfDp+s%*2dkfPyHZDu)5>b zCCLjo1El&t8c;y3I}9Ty>xUSnpcG!9>1Gcr8%&E30VMIZ4aw>ybx;yfpq&%X>SG>O z)ff_hs96HhTnU}^y+wU9u#2s;NUOk)9Kfr*QV1{1mRK13=w(LWbxsmk+p>kFbk-}c z7<mTBO5~nG>LmWJ43dV z3Io-%13x`GKL7`ILH#&g0|6Y26iBHjQ4gRIbVZOm%Gd+_06GRNJlIh?-fT}f&!WPHItAtACXS}DXLh&>9+u6n#6<*GYv$;n zw`tK!HHi(l2lhES6x8+W>7NTUK|7TeRAW+M}58ZA1J zwMTV-b|NTE3!d7R1%?rnpoPM3>G=)I!ZAR}itceY;HU$PjPc{3_opXv*r9kJ(rG+Y zT5dxi3c(*ApOj~y2pV7>?TvN-t{G05ksPh|PUJC|x@fvc!9!tdsj?(3PQmyrm#SWT z5a?)1TU^pq0AX!;X?f|+t&e0WMJOx?gM0Vx(r#D%tMoYpQXOXxdpD$;)wXM;m-ZfJ zfXiC$hRn_BGlh}*lu(fYs zbAl62K5v@8*5k=q>ESTUkgrG(f#2i|s$&R@{0z#r{1Rnj4nMMzAWw+0{rnU2rf(L- z{%!T9Uu!-f6v(Syjmc(f8C~hAM{z|0H2P)#+)y>ByL$_wnMc(KN^{t9wgGZ6uba~D zzlJ~N&PijA`T3(SuT%#+ZQ$za9>KzcG3Nq>Km8M9ICpw_Iyf0;%4JR?gym>I8y>9k z`l$9+-GQ^(x~Ewx99W-3%lW@x8;^R4mbbMIU!rQdv;Wwl`Mekfj_V8kpsz5wVmMNL z|Ii({t7GDT``Icxq>Oi!GN;&Ur!T#3{&Mf9L-YmIIR3sZS_aaF0Ej=Vs?xs!B)#u7 zfa|^8VRa<2(lgWcXN{`)7)vH4*$Gu94wE51^?6>9yPw9nFl{|JEv<*6f#>G@Grk6> znm#e9%zG5w237a zz)N+41Vw={l83-bDxzWP@IH0*B3z`w(5?~6*&$%hlc7JJ|}++AUp=RJOE0WH-n?D)b6A)!=4XT*n?*j;U}#8J%^$pP`q0NPq!rTkhsDL+&=2-c>``64=N{Grq+N6o%jy8D{MVjG)= z2~H?j^|?OP!y$wM7Bge2EUZX3j}Wr3jXl4p&O7)mdk5^#rMHobYooAm^vKT&TyB7o z4RS^nfuN#a`EHKVV#Nqs6!zSbI_rO9<|J-gUION0!YQiC1&Kz;4~dBcEoYOOVtRu6 zr`1iFFQT)?H|^<_=8hEm%hpLIQ{b@;@7GAw2`Lem$bhInswZeW*GZXXb}la}q_fuR zw$`z&twf>37tO9JA~G42=vlJ)B`L1X5NJnICChCK+ZT7%a!u9Jg6!R*PF)n>`{?e_ zq?($*fiX}GsVm51a;I&RTGw{gah1b;UQL#oDDZp~59)p$)JzdShkTj}@XH$#(Hl1k zGn;BUxwNx}*Wvda?hR|$Ogpx>QeMFUDKC8_gfLRY2M2MpL=w-kB+Pjyr2=`Yb!PhV zMKwKBJUObOjAga}F)ev!OW^OUtg=2V0ahrtM)iod?Tg2gooLPR2CkQq<1j^S)iE&% z#U*Q@J4i!l#5P3mmj*?H3)a_sH`cD94SYjiZ5A>EQURgJrvyHTN=rJO2$#ZCLS6_= z?C4BMn+hx4+5^2>xo=pfYm==@slkb9Yh6<$kgU)$V9dz{d%UxzZcuBIT^0NyEhyywKopP$A*& z^>%_?3*f@kw~7^> zsi(4A0cl6@(x-1(Ee5JH0=XX?8;{v!9aQyjuE(ctWimrDsrFzjEJ%gJOUK%kNq-`R zQiTu#L1%Al-`aqTXea1^j8B2@XQ;%HAfl6!KhWr}$M!M?3WG!9zOt?n4+hyjM*zVrUp#s+S~_ty25_dbB?e$Q`R zPvEiz(n@FeE3qUcOGJOA_x3G|?yJ-Zw{@kv;)fThySFYZZJl``)whZW-MFiAxf?#k0bdNVhY(A5Mn!ae?PwUDV)cK8T zWA?nj=^G%^Ze4N=!GS)6-^r;xk2qguBDTxv6OslRsaYGK`v!o}ZhU^4wNN|J)#7v? zY&(iG<+O>dFAjvBx+@5$FG1+h&b^-sR8xHc@}!XBmmu^dq4yTF`vO7e&VZEc{SX{Fz`2rSd7Ho9T-jOvcl9wF z0;D-_+6Lj68KaIZV%BjXzQaqpNUXG7ndNAm3*U)ktOKBlzvr2RgtE(Z=b35#htDBo$*O7X^Db<<}49?7>k+Wz1hZg@_xZYbFy{oX!yI6iG;hp{AuN4GlYsPCJsOZ6d9unYXS(2JFwM^An znS^x~S!{i_fJL=k8eMnMRdErq@4IMJQa?HndFqr5EBzmNRjF9x`ejiT(6VDh-O<(O zUPE;5QwLp9=DXu%UY+DAz0^Y2e<(TBM}5P7=?j`StcMa~{TtzLpZ{mY=)V5(Cm-F~ z*o2T_lp}tpQI6OfoeakhhvZ^EIGYiWAg_cwBK^%@14b7N9shG@24$cBM)NNHgZq`r z7zR66yvMWtgEJ)P#s$l=e$D1Y1}RTr#fxf`m_Re;g*al=I z>p=t`gw{GNb^+js_eq+uO~Bk3?Mu!&kAe{RHn{Lub4Wp13?Wm_?gD$=t%M;8{ZwUA zG<@HW?0uUeS9(AHtj#(F%!D5Zi$gfBHTnvpQ$b6mM2nG{3OH#xy$uLUAhHUB6R1b> zm}^1lhQH=|uqVFd8^BaBL%}{(W-x!1P^P{+sev%Ek~x4fd~!6Yvi%i{NN2r+lYIhQ z(o{N#G=0#C9QtVqZYrIp;|L|0xd#K%TIatZq)=&6E!XI`DH<5Vy;3SxRANOl7OsshYcVd-ZeGOG$=Tm^&A zr1MspPkY1s9^mi(VE1_c9qH|N-#HlRA?Tg#6z}woMd|SP-FNQgaLFFL^OIkqmjF+i znIuAZwx~Z|&3KLg?_9i#7RlN_dwA0fw>d~f#Er%9Dd~iJP=+$Z^nGrEj zfgRZY_vs&b`Zyt|TeHd)D=?}LbU0o9A|-R7e; z!J@Sb0AC$QM`Q&FQmj=x7JH(Ep*oDKXo1ki<)Q-#4l!iAqmgK;EHBw-LHcztnM`^` zUY-2C<4;1In>(;9DJ{R2sD)g;k-X`)zUpto&1n`EvL#=x0nz*@Yz zJKC>S<-wOldGAk#<-56q`&KG4x;gocrJJR&1hw`TT z@T6@Fcy)ZTzprS73NpSscem{oW1{cU+8yy;oxO-nAg}Y2fRF2wyk%+CY@DTw#@i#)OMN>hnFfzXk6W$7oK11K?`g%cr!O|}I^+fpGkP8v zDtJE$IcY@ciXRWK!-!Yp19U3m6(1#R=z6UiY;fW^ErBA&g~|tO&K05r2O5cQPJ?9- z6%HxArO%@<8Jwn|Io5Mohp~^aVZSWJrrGCc3x5(iU6}c}tvN*j2X#`=_YqzeRkeGj zAha|D7g7`P`;#ZA_lcGJYh8PFx+nho|LSd-RBsbZzN?Qw5j>)GI873sf^r?`u&Q5k<4)dTFKSvPZ%kRz>Y)|>m zPObHZv?`?XJNF~?Z?o~4KL{sosh@N^MvwO>j8l%29uTJAj{t`Sx&cpxPuRzG zBq4Qx!=G$(FECCpy3II!mjeN4jXIUBssxt%KT)$vq4ICe-P>0ft>3u6p-S9T|4w6A ze=D2zW-lT;waMW?ZFS^GwrUPdY<%PZzGaNj$E&h9ZL;*U?C5j->h0`MIuU^`AlI)l zIzHF6N9W4M)-Pv90h$8nE9CG9ELmcNfMQ{d$EeCFz+c02!LKeb3V~k~3 z{P0n`_jTQuemcJWxc>g1?R)l;dr!MYUVQ&KphzyolfbW#w;>IIv*CH@zHc+=z<@wZupuWxWh)HGy@5SI zq?k}Ofn!(_BweN=f)y31lQ1_d?clyZjdej7 zldR;_N`h5wXj|8I*75BJO>$?AN*zuJalejgB~ykaMF>MINC+VVz$HMcru)=Yo#no& zwzu}itBQrq_vxM-yOW>_GtTU=72L$jQ;`uYCG4nf++NsO`qE@WXRF9CS&s-R_X|M8Hz;xmfBpyXxstZk} zBx~6|>*l)7vabvNsj~HL1$Z}9=!5|t`Z&mw6)6x2+!%7v%Cu%PUOP4+w0&`RElnuU z))IT<>*1#+aWsU%va=24=6dVmMYUA-|6A6r&mZ0Y@6>;G|L@(u zRcqKk=dg3<{=ZQF{!2Od{OB^uX<1Oz1+Tn*Nt1C|mn>$D@gkbSt_Pt@m4JD zZ=@>w%X3gpLzx13g$R}nIa@Q&n&LGGLAS4pND%oW&kgg{mF{_n1s=)KON zGBVxDk%8orV->Hn5?hkHAz?P-E77P}5j0atLmAcp<6|S5q?F1fu0{ZEqBt*6?U_5% zF-IHv)3;%Sv-E8gCuIF`9w!G%@cn|^D@tK~-EHoGKsMPdg#Pq>Sef))0`|%ug4gj$ zRg!?EHNk`oQ~lKm?Q2Rm!QE7@5{aUnHMB9PYY$C|fhXTl*{gg0-O|?NniHtN&{}I@pG&Ym7rBcged_>}Yk;j0JrM5@!$!J?b0B_N5C&&KU50V_SQL|nIy2R((SuFx(aGuV3; zZDD)~$aJGr=_t)i&=D~u>a|zxt2nH_t{sgX8zHz;f?qU{FhCCRMiTMzq0%On@U05# z$_>H0$jXOAwTa!>UYA`P;`So)rDU~a{*uha5DMADOq@KE)GbOtkYD%;Ev`mO#a`Xx zc!ai!q?wHN!BvNZyO;(ek>O{QO~zt2qyy>y>Od!=OybirfmF{ijOND9_(>7!n?KCX z!q%h7wdXu$)8>vZrRHT_d0HY^hc?SdmOV!K>!l)= z4(Pp1MtXcWc}fSYHHThcGLq{dO#+UA&ODZ6frC^vr|bmMd{lT9Y@XDuTX%YXZ1`)S zh@}q&5RgRNLg4u?jm~@=IOiuLIdGLhNK$Cooaf=U`=SZP5h%)X4`rMb;g&_%pVFE4 zAb+9JoD2d|k>uqupN#YZ-e4L-yx3vxV!_VGh|f12{J2ykjyvP#H2h4&=fV2e0L-W^ z6(C)emy*eVcYq)ioNFsc@r7T8CEDpRV3h$uX0Bg!_Lf+z!V2dVn&i}8G_a0e)VYuK zVc&~=j?*FvmPej~;Lz76A`V_+sy)A`OWwirmYcd}HpR`b(qg}G@sdZ|ljkWEr(GFag0={IMgkIG~@mOTyG)c_u1yD?Y3YhU;Z~!=?;y|hP_(I z$8xm@mNyK3q16;ZdZa;e!sIxrwv%dWFK2~ybw@TA;*P1f7pWt4()*dpTiENpZ*I|& z;9t=scz;G#0uC#wsXW3N$*cV!M&BsMuD$Q$_z+ZamLM@^`r>jQZoz|1R2l+(cDRXYR0usrvW-DrxWVUN@0QRQTo?^eTRL@)GW&X~>h{fwZRL3Uv7`r> z>gEaCGrZy-+19kBjwfj*eK8)GV#*RqFd1U1J&T9pGKcFK2JbaP4jQ-ly9=a!f6v}{ zt1q6HtnWOBy-7Q2-%WNnTvZMM3nxdj{h#BQR!&4>IT0FihuLA3o(jYwE9pXcS6bkZ z1Sj*kDag#WM*a9lybAqNQcb-Ym0FDVNILaHB3Gdwrw+1>Wzl|sx;Um+f3@CItek(S zWKBs?nSQ6ETHtTJPWrT!OdcVX6gLk=zPd&Q-w}iI-+R$Atwt>3XVP-YJ91?qo8HUTbO;AI+ z_&!?9&THJplMUr#X`PoFN;>N)4kgc#8p`0ZL#gR{YAhE}W7`Ay$^ufMWSYe!Ol$Rt zz~k7HBijvEDa_b}hIN38!o^0C7O0V2a2Ks%ye>EKWaIc)y6F2C?L+lQDpKIndnSQx zzS=XX7+h)`r^tKi%)IQxTwm}H2_~! zj2Uy?W6S3Ix@@-13F8jOFa%-*{((m1XK3)dK~;HF3U{qlHrI8Rjnzt1wx4Hi%)9{) zaRm?Ir?h~+Uu2aV7rqywSz^o9*L9YCB@K8Z=-W=Qb@7WV?uP{%JF>x3>5{k)ibW=) zkGEpYEL2^hFY7FMnMg58sYnGs933}|uGB{W!AHKO0Kb8QiF`{=1Po~%`aDZXKbM3( zRmW@rowdEDfeG7`45@jjL)hYo3Jr2oyb|3c6mA@L5M`KRacHV(uIw!TTBg_nqa#~G zfpj%#5>UkgAuC}vC`$c7zbHcw9TEpb-Ht=++Ri$zW@MHV>b6zXmCvak=1@rzDRT*f z%RGS5mnN{7@G*}Z&thzoOFL^=njk5*5|~OU+j`N{5e=B2W@cq<9zet)1_5Zfk*#Fv z>dtzu7ex6VU_;O0)jV!~$s0|C#%m!()t>k^0^=olT)I%y_+LBj?Tb5Wd9~Q9jvm+= zf(&ga!mWL@MCdJmHzqD844}xWhP+o6fdvZfg`K4@34cJ-QEe4)Xs{K*L4aK|NH2=^ z_{ozVhpav62To3=6E9^od8e-KtY?O{s=MnM(O!QGCd3Y4gun_wtyV_Ew$IC%y1bZh z29kV~s=!AT+g89Y%tj-U0G-4R(zzvdwpA3w4vx=keM~JDF$jwuC@$Gzj27}r^kqE&GSTUUg<3u#q=(&rSzeg|_c5vw4Q0G&jX?G?XExxe#?T=WGp9z3jErA1nyqU)>v(flq7lRgPypIj z#+J4*Y`#2)H>T`>Nv7dhU=RiT0qh~DieXb`r_Q26I%{1T3IR<~9c^{2TX1gJG4kBO z=SLrq*8#-%n0=GOOf3Flg`B+wd*BeS4pv}{9df(BZe811$3(19PqC-3bNI##qt`YDMspP= ztnrmsFqtbC>!h@XOzz~IvNG00mz}Qat@$E4+w?kt$>Df!YI@a}G?BRp!`|`PhI`^I zgpWFrzo1|P7_c1L^>_O6&YG_7YgULuw%u$TGk_lNT?EB=AD=81`D?HEo%?ytAg)RFu4# z%;*>pGUl`rWlUk_8h+-)6c`?427Mo*|= z&uYm#G0g&4AB2%}`^dL1?yTh+G+~yO$wn6cq`auvFSC(lU2zEzk~|IA1k1Er$`frmn)8Jc7d6?y0e}iYTj|5p%DV{+$OWck||3$Yt-!5 zsT8-S)b~j7;eT?NIP|U^rSpsGyo2vF3VBnHEaH$TY8EgF3JG4wTuf3(e^HEq4aqGS zH`�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

    (%dBKqPn^ zNv}km-_s8pkF8GpiN^mPax=`UEe1E+{MAX``}#G^6S1~g5LKbV9zhp={Skf&Qpg6x z5(4IB&Vz8YRn72^dNNM7=62|G)qc8CCXfe~OpS&`%!2bahdh662e2t}lvHyWOM8?- zxZoRsdm4nuPj|_cZ*>~Bibl((gIYGse7vZ_=XX&qi?1gmygrq(AD8C3DS4 z-80(KT>*?Nn%k07zR;XHSnS7Vcp~1q8&=eNUd;#ofFl(N4+Vt#yQH(ivNB?gZ^8JO z`Z|Z9B(sR;uWiwclaLY*t%(*%ooLdoyJRb!;&VXl;cr7_1;&G}GIiVyNm$ChdJUzv z&Hw2=;VVi+*ixO~WX!;}#97 z&*qEZxmcFBWV@18?A{cUH8i{R{@tJa@Ll*9ER=V&2fyXVl>}NgOShgMz#&`X_To_3 zQy%Z}-`D;qsM zk8Y=&mi#BPTlMR1Fc~iU-h}98HRXbp77(ig{t3hzpj(}^>4guXXx46!x>uhr&T=YI%zBKW`6zruzEZS&2da}Kjv8Q zkvr$yb*JdtGdo7di)it@+%9jmMOQ`{`PmJ|N^w&+=w?K9(kgQ=CTS%i5JDz#N~C&* zIQut5=7q$ow~W)Fn}FZ1)JCkmi-?*t$ou){zj_&w5BM6NS7UzBD+BM6R0i|W`yD`o zcv8?7qdk_wxXDDd zkXrp)BAk6k|E1v`(00JpN$+My;EIXVQI41Rv+dopd+jRtVA9_kn%dteni^gJ=*l&i zR^kExNvnmEQldANaqq_kVP26Ae zxlBkI#LRHcnOa7DIl0p$yLCB;&KCYZn0#(mdl~F|4g#1=H|JJmy3}2bGe9Jc;!Gq`&Wh)~biQ_;j zn0KVM=6p*`NjY#V7qQeA}Q8^>&VuBVer~{VAG32GCZ@HY97xHI^c-YOb{h2pQu!q^2oDm@x-X$v^j898{l}d#H4| z)gMl#1m^;V^=lA_pr}1f_4D|;3Zp?_D)F9SH8twhBQ8NGS*p$Ix%uunZD)Zkq#5d` z3>|F{{4)dX=XSydX%N_P%H-W=T!1iRAeoHxreNAkppXWgVrag%`jpC&lE*+k)OnBp zsqD$L(xh-R!1sljHfPBHP!K~96n-4uK75W65H>m@h0e%)4p`H};#P_Sq_j+W3IqIP z1&eeTusxuTu3anTrGoX%%IjlCTz%Bz^m-XmX4|(Y9E^6@78!ndW3oD4hzwp$`lMWkQ&BNpBLa2UN zFkln8Eu!8=N}~3sVzX}%QrN~Yos}T;CEC_)m>YmZ)z_i)y{sQJx{;- zFziFx1hg7{%u~a|b5As0o{3>ce`a(?R1=mh=>;jy6T1AyGNs2doa23y#Mq_b>yj)W zH%4jI@s4RYie?S=T$dLckr7I4L@fBau`RrB3ON zISOxAX5}SBcYT5sT9+utW+7$UG^*zbO3+YlI?nE7mu$fuaIIWcUU?_U?<8n;piiy< z@iN?T{VxayW;|JtbRA#@xQ`#dtH6wJxFgmM4cHnlr990VwozhFM5KT-3NqYUQbCu< zHIUpEcw@T?*%f*YfW~V&&$>FvqB*%ALiw^mnH9A^l&7(8N|#G$Y7uK125;5Z*nUP; zFs`~>#NHaeW(O@7u!Y(>E-Kod9u_^xttoC4Xow~f+)8li>!X?<`Ot6k>w9Z@)z#$B zaiK0aY*B_(3tU|JF7-Gt;c*seG*R(gEVwxd!bjT$?5*uZa^wmJ+tB9*mo)?ex;g2w zq(@fB3)Qe4=SvV0yg_oIC4PK^BiC5O-dXka_|#B!~cMgQEVNeDhHs5fcDVHYvK}y z@Ls5i;VJO;JqB?lkYbj^9P=156um5q@Rwf}kg~;2+rU)>h8S$yzcVdl&N;Sw~UlHP6)25sahlwROw91oUHYq@sa zie8`nQ~@^SZ}sg@XEI0sDN0K1icsh1j2}SV`6cx zI$5g$LO_VoDx{5AsQY@t&`=C!^p4ylRAw9|Bd~aDcN(0QktcQ;`os5302@EDgV{&J z-KlRPhV?|dw98+CJ2bNU47|yP+_8liD*+*<^W+&rj-DwMBOVo0zeLgn?b4S(zC7M0 zMhq>|P(KpCS0o{!L)2$TRqv|n#Yq$%_$kCRAty!xvn_16HbTvY zF)_Vrw^Qognj3g^6y#;10#G?wxI<&Mo>EW2nu(Gao*Nq;0}u5K95DdmBx@8WADTH? z@!_!t*|1r3j}1C#Yaw7xJe zW|kd_`w~qNMc68J_}Z8;{>!j0j0jzLs3->rHtevre%zFX6|RPcCbBM7(xsLRBdHFI z)moyu>la=3Ut1s5o>Lu~z%Xi99KTa9pbK_bNtsC;-89y%`3}1co`Fm{igXWc$U;Gs zLic;UBn0Kcnw~sb4hqyL*#l!x^zfW{0+?-Ll+t!WDYdZNlNNTHfS+n3Vpb~KptK5t zeV`j0dyi3!d&tCE^{>?l#V$-U@1`2Ysr6$d+JzqR{!ya+=CZ9QluUTSGiq8x@X^FkWL3(S8a1b%^l+R2mt z;?lGNZi%z$Qi1s>TaUobW}&s==j^kuj|6pZvCAT?8}Ay)v50P0H+xoHFY|Z%6nc^s`wTX+t6F zXqs6YQV~PQj5pX?;#$C2=x0^6)VF-Bt-#DJJaR=?c(cjE8)ClMtslPqCKKHnMv#3`@=#Zumjc-`cv*v~{@?(YBgvcH_7`k^xn$z2)Lm#`OWXIyN z9OiHTVC=@-X*XONq|;CTc;ynmXFrJ#K0982_H98kpMpUN{4p#@Mr1aIgUY&>SXX;w zMkba<$PB%8@^_Oc`jZ&~QHIx%3)`(E+Z9V4-+sNeUu)!m ze+*d}W=}2J3WR^>CJ?^HK=?m;-?l|2Ul~$wYolyzd-Y-Qu)WSc?wZ3B+g@i*nx7}* z*84wv`|ihgUk9@uc3Au3WKCZBo&s!J%E!jByLI=2w-MF<*#=Jib0uQ2xaRtU>*W8j z{nAUn`m$C7W`CbQ_!s>1{RjVt{rCUmzd!%{mTp7;FMaA&-r~UG7!6DQ&gaH_`7Qs| zNq&y|)GrRJ^`ZaNtr%%uB+k0LSaujjXLc795!S1|3T zc}rViG~iv<1{vv1+t zb^*JB<$>7rB7hNJ_aVYuhmX+V7z_9YGqHK!LYPaN23iRo_j72(RaLf}5K0nrtixO1 z-`n3;#t=5tRF?@kQL^YNFfU9S^3kdYk?oG`*nP;76y;!-n=3 z?dkb_pPy8%=M`kTPVywHQ^&UPv_JmYS4YR>z|YTCbH_{(-^MZ<^_P?G@%#col6gaJ zwGx-eCPnuI-j-ny|7l2E(psB_fl6VTUYJA8;09JkU<%))2d!&PJ5F=BR$~=My%GL0 zJLB@5*wh#`vwF1>2f?+uBLd`->;3NWtFQbeEt}m{*0)Fzgk#>w+d{-4iR19-(cm~W zRG=@|)^PCZD+*!Nf!qFyb<3?v1Qy+EAAPo=lftJvs3zR9Iq$JoU$OY})73FNjgGGv zDd5wi?lITA&>UtD>G0SIm$~DJ7j%hHU|^0;UwuW)1(JOpkp}~kNEjZd1ZuG|PPtMZ zY{HzLO2`kTn=o=v+IG1l&WhXyd5BMkj|R1>^#!Rz4_&Z7DOg%0lwt`uT}R~P2@#f< za+|(|v?bT1$9%HF@?1<4_a*-7mliY`O^wl>Ts`hP5JG~BIK-2;&`Jx&=epyz2;J9X za09fEiSoGVI026l2Zp2^*fM-i94HYF&aEwLu~twq*8<`Dzyhla;j;&`cj>kGJjaBS zVk#*a%rwe1%#QpqtV>&7S~`+uhq0wHS#!+32PLG)gyg-?j3b_dYy-DOnP8gE>X_^$ zfD4`h&$xj=z_UOT8?v*Q@7uEv?|$e8N5l=Zl}^0T*#uiLo`6VHe1k!CppXf+NG`_e6a3-av5x}wAK|rSrLrxWJwTW>ml7*;bDnRS}DR09d=8VS++;p zX{~y?ir2)aOXhnI@bmeD|Blf6&wuN|f3H8jc7xDdBSQ06Z)rQXWGeA_D%mNzcaPT8 zM}B{haN;}e-J@0U=CCU6+8*b&cs=@s%U!+A0d!bn3#=OMYXW3(bmf-wal6F3ccD|ro1(2mZ`Zh!=WKsaKB)hVi zo*&4vfDeqZ$j;2KX8^L?#u&XuLJe*1 zB9Y-YnL?~IHnYW|FLNe=)GHs_T`FN$hsu_HT#~(oBzPW^m=kqU z6oG{jr*)OLvD8cg`my=-y)}I^gcfsW2E@f=sE`{8az$Daxk|ZsH*~DdCDDRx4NQQ7 zK8H-8ou%xp_xTvxzoKwpGoLIX;i=5)WDakj81q=_^UCiE^ziu@vW|;tI zB$(&e9Y(klD5onCb0a}#s_U0+(n8(n1)4Y-vg)76c%y807EC_{(95k+IHL zO38+KzLNp3ntXR}9lz`1=F$4!Roe&7A?9> z$cDKdT`FO3eSg3se$L7*CPREr!M98Uv&MQC*uOT67VZ$?tKZ#aIr zYOgA2Z|w#nxVSS^*>ybEJmVnKh!cWvcX-mZcosHM6ZfP%f?@kAH@>~Ao~Me;)i^lf z<$@HCJU3JPFK{c!W6bUwUb_`is!Bb5{>Ys2meT`80V#`qLJt~{IgCFS`9U1x9vX)B zM>v-g0zH&0J}E_j6UGYy{F#%7c8Hn#iSy69nEOu}j|eKrDe^gNCQHN(@J*ky(2lbVAp z%o>oV1rH)W&64f}ZUFb(mrl?=DUF@iXMUxdF$34Vh>ejRlAsYnF8$i9Miv z;mh=vZ<;!~gIT2Ptg+ZaM!s@`j9eo!@}7UXq~`0MeS^5PHpU0g&9eWbo=LAC z$|+If3yOrOKa(hLi*CZ52ui>DzZVP%xlx-zJ?@6#aXk!=WmYE~lw-73QfTZb&7hhg z5ets0Eyu@d*?wWn_57&~;C4%Gra%eiN+bjeD%f@GzI9qatXR~j^xL~)uL0ZnZFt^81(Lue+*|%vLVOo$$QIo~-o#Rb zW)DSS2;txs?4<2bIwIXQi9*Of`R=Ydo@(?RbGQTEUP9nea*hxz&|8_<*KOKKdr&-- z=O2A9knbY(h74g1+pg$4h5NfaD06(~0$B8sa}ipL1rtIZ{&6xN@5&8iQ*6c)>ev*4 z2=jmpolYzmcLrbb0jP~W1plAEq!65#dz%W=eTKjcg0dF;`sx+vjmunNFe&;LR!V^6 zyQD3QH}}EcDYS+__hSWBiEnek`^DMfLtLXLpf zLg_$Z0RF&G&ZXZdIqCHLkuoZ{wmps=KCAT&>zd?^MmVos0%Q z@`wQSpRND&+a^i#XGrcCm*UCVV>ir>aiLLlq#Gao4+$Z(<%(uH)f?5hKDvK$gmVti zhDGse^klkBo@821m=EG-fQ&~bfgqG&=;)UC#BF93F%&*bDHA5kNJ^PG;2ez?23d%x zI8mniGc-O_sxl^vglfm-M3<23QI~M&+UmvlsUTWJL5^h=+RcqU?t`b6=t8+QhKu)c zX_M>N(2Sv>;#$}j*XRIIl!st;3vcX76cQ){y1{aqM%9n zv2mLF@x{rUs0^nCvf+^E8|w%%8XSj=fR`9;Bs^>*cB^uxO%v0mYNcvDRwt+n+{Y=_ zs9|PYMd4wKu^cFs6xciN@g4f;j|)I&J)4ETJuDFDOk*!^tBgk*LqLhnt&R1y68tsM z$r0Xjf@Pn68aPoDuxrI>F(G^;32CS3J+h(Pt};J=G|oST_zNs*^~jMMz*We3P+EVL-&;N1#(r>+_ z|7{S5Zs4)&w8;9=+a?2U+_8IpRT)NnZ+soz4NvIz{mWTzGsvK`_w407B4iw=pAlE6 z&GWcO60X*9Kd2TE1R6lIs!X7jV|>6JXWArOy(C=+Rz$!Yak~ZKx~}U2n(>rn^F>9- zVv;3B9>isYjMQ#I;TMW46c|jqRibaWLN~f5znQKHh9@LGk@=J%wCxe>(i(-RE28; zG^`RkAV|be>ky*m&J5B+)-I|7RK38e!Bc5AzrVMxZ-h8b`r0~14~wYGyEHDB)x2M% zqE%2=kyaIylRhbuzG%w|WZE#uU4`tel@oLzyM+ENo4zgUHV237Al58OWR9vuH(x9< zvr=7YR|Lp&`tAMoi~;OW&ozRBPZd~e%9blp(##;0V~&+U+$w8C>ys|SuZ+`S)PrKa z0Ki&|H2y&hWlh`vE?_N*wNp!+T06C^m=8w_cgr?gA+Ygq4$VR5_||)5o!lpbs_l*i zs8uK-iR(aG*-={^u7K6_ER`O{drEnjW57}9f{bkH9W$`F7 z1hcr0v3MmR&rLyJeFwpmUy@Z7jIH>NjGc)0rvBEr84YI3l=5a2@=rf!mu&L#ZfB4$5|kNGf|komP!$oTDBA5!TI6c8Q|#Q=(cbkQ&dsyo5a z-h0%K#fS8#9RtjsBI7}d@k5Qp7rMR*!UU$!FrQ#`#RRcAaVv`iwD~4IB^xIO#iWc3&z>Aulu#@+<~J{Quj&q3-K4#7A> z|L9IwLZeQz@qN@Ozh=VN8gq%^1CQvtPJU<#ST#RY-!bhB#kgQb&~I$GK~ZzfLrw%4TelgIo#As?=ZHbcFh$d*8H33xet+Ybk4%o zD?ViZ@uV}1_3HFc-(@9hi(>T0u~Jw4&lxo|s?T{w=v8mVcAqj__}{IeQ4Mxv(9$Ze z$=xA##KVA4^@;5VmK|!#%nucrrn3(;MuV<$(El}w?QyI$4deQ?VVBNs&92gIPHq^m zu&wzKIzIZuf$sW-o^!xyasYi+qm7A8j-CVtK+7PMWOeIX>q8rCDZC@F4Z1l6K?j{+ zig^HhI~6w$osu#;*AT2X_Q0Ski~un#Gwr3?1eBE;=9gI-CxTY+$;r~?fFM{fJjs6vX7g$d_04aNKuK z2wyq5Pj|Hu@YJ|Bh@M^3#2)uF_tx=R=Kh7_-Z3#bo0t@m+3IA%Z83#6Cfx};$ZaQ@ zHC$2+FWc?Cc33y#CPy*;)$137dx2}@+)I%sh1EL9X|p*8uLf4W3_J`kRhFasH2a`TsmR;K{k-^AF4^To$TjqVa zh-2>k+ceE%^ur)_;51gmBz}QpEf-Cl=Gg?x`hud?afv(49@HA^9Y`QidBf|RjM7bp z>))shSCZIq=*q}JLBJM}26OSMNJ%~{)0iwWgm24kGW#zyYHhGZiVV&IBIXpe#vAo& z<*vN1%3h4J9>GMItss6i#_{unT(&YP%eWC=^J>&uG^Fxi0l9BUwU;wouleoZKg4kfP@{AO}2+ibYg)1F|{&@?PNYn_~bO z!og5o*OyV8!&S@59A<9ZK+4TvS@PP-i!RULX@DjfO0~0;z4g9k(Gp36-n=YS8nsQI zEdWysEbU29gn0=YjDL0uKs_vZWmw@Vy_hr==S(w=!W$f+u*G4>M0LZyakz64oTh$=eHPs;j(x92v=On>Ia5RHf`{vj8 z*7QfVUOOph33>$kB=&U}&QNnra&(Js$UF!3=Y9usfI4pJauO|z3K)oc0>7H}7q_=1 z-|{VStTrNN;XYxk^SWA+{LR+CB;6msPqITJ@|ZKUWFw^9%D4+nxT2iBb-(89pIz^X z$V0V>GzDt#aFpn{H00`oTyzGaiK-G+b<%*vu(XHwauIuLeAUNEC<`XT(C=V68H6O7qF|gr+Q&PMpaB^caL^n!jvpqy_~uK%TNZ8e?VG9 zFUEzz;!c_#ka-@X%e(W!AYR^yVd5^!xCo1=@IF^S5!&n?SHjK7BkvIsU+aPZF|Uhb zpec7JfPFSx?7m+HzU{wxh1DbRKKmy`OCNN5fZCS+#Y61dz@04opJsy|IqdUHxtIbk z41@(vwAS!%Pjz*Tl)O4NW!kRfjp%>(Bi~$5l>0|(04PND6zs8{QiFhWwc)S{=O+i` zBfyZ-4VKro0CIy**vDW+)0zy==uX%&_$)96*B2_=Oz0}tRNw>r!K|F~lgCHL0($^oz)JL};RN1=4$bJ)5u*20@at8_Rt0~-d?z$){(1i3l{u`z-e zAR;inFIU|~1f1Cul1VOefT1YHz9|OlBm178T3T<3$alb3=BG#NPgJiT^;;(^_|jUC z?d!r@-H!#SxtZk`!_S1B3dVyO&d>N$9(984bQM66;vrH*0I2DG4G&US64|%xz~VWo zjOloI1XcM7C-=`;N;dD5;*{>~%O_x;>oseRHKvOu!}K&Kkay1kPCKUE(O1uLgoVD}s(X7?WQmprfI z97^Il(BEk_ry*43mxw*)%F7mgwPIMP>apa{m{j^{j94ujzkuyI;+n)(F$83}SK0-V zJ~QIRK)+m>tBl}{YANh3^Fs+%rw5U3J_Si@BcNj{*zOqJoyAb(6#bT!;`Bao#i`0x zA^_wsWiaVS^ROdj;Lr&ON@0-ai&Ht5P{Yd+3T zIih1hfzy6%UZA$^v5^nsHr}ksUoz~w41f(r*o8i(cpFYuw&X3j1s-}$Bj_7fY1%-k zR884lOyg40lhHa_wm#gB+Ln}~W;>eq#TJqCwbRio@S|B?;kaSYae+G!E(gzw@SJBLCQY;i21dB4 z#pk=uF?A#4&0+a07d>>xW!aE&$QgCnW+|+fB|cZ^f_LcaKSmKZ_Fre%qZB_-aD5qbEi8qyI7z7z1iUI^X>`1J3Hqk zK7MfWoDE3ys+M8*FOFJoiSr#OjwD?m9oE6ABY%|~=!*uWB4 z7f~6p$812_>0-IOQmUZLsw4;Km{&1u?6k@%IG8Eq;g}2*vQki`%ddvCi#r+7dT~$| zfZsbI?d8A3%W1~{K7ZiQ>nFoCt_8gw#_1~b`elnF2NVo%;xsRNUfT`IXo%aeco4pr zx8&d@83fK^5hV47Z*IQ6KZFwhzTGPRIe+`r*B?M|TTA|!b65bOss-1m8ENKdYodo( zU_t<5oy~Da&Y~JE0FsG32(|V7y>)#vL_Yv3$|xi#4K*%`3j7Y9aa86UM_Tm5%Cs)$ zJ^9>NMwLrMJbaBiOW9km)cm)4SfnUS=6#RtC6`NRC!^%o!F7!@?q^y?v{~}N8mzbR z?Y;Hr#RTmH>f<<+i;ky*^~@-ed%-QWv@A*6k1&{wYTz?H?XIHDukWhqH%9ZKuEE=; z=9XAQ-ZV!KL`FDpoUydcV+=PJP-q>S9=Fd-Hj&6Crx3~!zd$_&;h?@O`xs4;vZ(;G zC-mPxw1mm|F*_uv%iL#|c8uG9r6c0izy7cF>)-z&Sl3-+t^VR&0YZ?{K7a7v=vUtY z#`xYbzcwP)1@x`^t4}|F@Zaipe}^qHo-at)iaw4L`CH;kvy70LOeWCY&QD}PU?MX$ z$5FU`Uavmu)<{Tv0t)UazsIQCX@$ykV%}tJ>}@T7^&kEaMSNp#Y2$xOS7l5qmxgJ zz`+-+(ho;+*2j>EX79*nF2p>4%jw2{c`N3D^3ElqWLw*m-J?Y7p+bohu6M+}SGFvX z$?%KuTbrX1=En~Ie=up{*fD>+|GMv-jgfmPkcjg?Y3_Y zj9Q5sPf>_{o@^MdjD6zWlRlr$9K-TMv=fe;_=9)vO)B~l zP}M^}#y|i3SFemFvY%HY`{`9|M=CY(7ZVf8>1W4}K5YunH`)JjQ@Q^O23U~t`s0=F z?mSEj+mBBDbFB;WxjFz9Gp)Bzql4%T^Jkq7_V0%x10>#l|H7Af=Qk?z4PVf~gEeQ6 zaZJ9pI&OJGvnf}{zTiJ5;y6IdcX2z#t({l@ZSL+5mK^rSGB! z(>FC|FN+6$Z@b`dJY2RIjUcZ?5@4x(Lk@~H7&6onFta|&>s&{qf9?`)?cn?+tL^g# zc4oL-?s@ef=F>lSPP3W9k_Wl{cX-)fKE}a%T5^oj7;vgkmhZ2A=g&U=(GNf0O!bZH zxGUPan@D^MbJO*iyH9kWezGv~*}r=pxQJ9M?l+hl;`Zs>{E;6W+>7sZ zr%2gwIR5DEdmqo<{P5kaDZ>=F1rR|MG*`??YyvD2^+dK9y@1hn@sh`Ti|4j$%1DRx zQ}%njf_ZP+N%Rfd5T`TujZ19{@&A)WLN;-~_290pg}3a#8>db4RQ^>Tw(sdl;J^;R z+h>Khkg~HdeEo)5Wx0b6eRz_yj-RgX!Jp9*|4i8f{hA#*bZ^EkF$qjT3)t(?lWXgg zz;uateL)sH(O=EQK#BfG7gDw_7qQvVElA;IcPkS%j--y$21Py|J_sTyUXDsx=B5FK z{<6*CGDRWJcKGJr@~;R@Tok)lMlD_u)f|sZ8G^u;Dyd>li~u$QMT&FJ{t#zx-QU$T zjzOXei%5N9Lg)O!WNmi7Ym0V?2r(`Mm5>yUP$jnyAPzlX3L$j@f7ONmPhRxi7QP1i zW8Udt;%vvmGyrIH8F9dz_bd?~Ir(gfeK~IzHIG=;v~cWwOD-3&x5jVq=2;!JaAIJP z@vw2r|&*DpJ&ZE`f8nUa9y|uo&G3ueloFdx_9~>BK zq9j31BF7t~5szEEZaJt7N!{B8?5eGM@Ne7W^x)sIKMw!*!+&9?hX0KB&-)MlbNlaq zp^)=CF|!JE#Ps$YVbT)HR)yB|JVqF@YU;LFXx(|Fh35hL1eimBFdUg!twjr;jg)5i zrxgwYIo!+%((ZE!l=6pu8?V^ z-tFs1=!Lc8CxdH%k47{m%;4BpE<>EZg0T>0^njKraatcy_m4Z%m02}dFNk(PttVJ-`hQY} zq2a23a)?T|N&tZ+jvb|^)7hrCK#mB0c)e!)-~5ln0)I*z4Q$0H*+d)CTE zQT{Qurcz8`>R39xvQFL9+GDz@0eJR!MF+TM07*u$)$<>%C4LUqL*kDt|ALGFFnLX$;RkYg;72xrK!I-(Um9rDNM8a9zdFYI>m87SU_&x4BvBswzTR zaB4yLe8J|L$EiBMOP;I4z0Q*GXF#HP+Bodj0%-cZ0Yv=c5N!(=_ouWQi;e5C*eDAUZ7>lgaA&!v_(VVo0171F zTF4d?e10jo=a4PJ8=P8gv2>brM8y!X+9oSv&KHc+w4mrLB<5Nroqkkd%T%_)kC zkSS50S7Q1lh>B11406#_vdu`AYJsp>#^!xF74vz&PCRV+MA7M!!IuAOcplr;(E+FU zH!xdGiXwkwYqYOozdU~tzAyJKC=9W?C>t@nQm(-&APv%w=VjY5$!&(QR9#g?6Y?s@ zukL~tv`!76d)Y-(p#oM^+u|27Un083A}jD*T~-N?2$@#(qK%g^lnuk4hi~pJ{}1ih z3sc@AZ_c+3xuQfBp~4PxoCYmT(&-SxgbDyy#XT|T&;k-ym&r8LS9o<%dt2}o#W0|q zhoQ=3fe@*jK>Hqp&a}sEq$ucZ8^>8r_#i)CU*+VxyXpuRBTogVfm8xq3Gh%`z9o0d zCP+)P-m=ws`)^`92VMN{G>D zON7F>N+5uaMvmeNWx0{s2?OPLL}bjVcdn2SoJLV73kw!8NY?_ISd%3ctHltS|Kzt{ zdWkq#DHuXElqEx)Y?0*qZ{B_HErjCUQMSy-1Y@7fK5`Q0#)#2JX$HAJH3UmbI3X~U z#uUGBp+7$z+!L&Lw0l-4Cap+tqEeTolXY^-jJ2feEL?HRQI z7@$CP*fpQYU;6kRgHu?u7ZDd@?w4B+=Op1_qOj8u70ssHv5Ml+V%emE{`~5(p8C=NoJ^M)_D2qTFV( z`YvBGa}XDgx7IN-w7fTn%WNUo3|TE}))5*En->BAY$`E`K6>#Jh{jUCboCro@pFwr z__a+u`re>S5tgqVYpdV+Gump5E1dXlthDLsFltrBMxRz*1jGOYmlEL z4_u&bQM+e}Y2XZ~v3s!MLE#aNx1cA{PE{E-@m!DtnQJ_^arzf_9m&y|M4VC2b|!IH>_R0pZU4)>@TaTVVq}23+7-a?P{k8a508(Pteb0y=m& zAO*O>A|r+;E28H7mp%Hlu2E)4XGL1(_?ooE_!)efK?=94pQH1hu%jM<6fCh@KnfP( zY9Vv_iVO!S#7owkVQ6E5n6jFIPZJ&la&Mj_uKa zCy#i1yASzn#~!+z7bM2;#s{WDe=Q?H22C~uo@S)9%ySr8c@nga&XlmV$1nMKsPiQxi;hLg%g+!)9 z8~)|58`>~==lTt>gism?Lnw_*9ABCRKJQp*D7yqvFAmsFTjWaQ=w(Tr)FusQ$Gq2$ zJw$l!G+ALb%Bp+&lk5DDQ&?VPB7IM;&;ZY z?QyumA>L!I3)U%XHA55{D~_%p7J`nO1k`WC#X%8;Y^*+UY1Bqo?+k;Acvry9+t5Hb zr>433$j&Ey!$av;ZvOO!XG8Ee1@)o_fR9KZg{m03egG`ew=u5~{#qb@JyzUSu)m;3 zt;0ZUc%+pt+J^3teT+mo9S59gu**X{!$t>DX_M3!WW}U%(7;K@o`c-oUHoi@9|F;! zielsyFN!kE%hggG$}l1jQE6!QS^#~0EeQ*^5vAe)wHC?iCBLfVEI$*5UO_P{@!O$8`{0fFnaw9tZc6$ zgX94A&hqNXZD#J(=xVgMdXto_PmdO#4o%ou-rK#3ip1T|r<=b#CxeUBJ(djUW2kPC z4f&NaxGpw^=Voxtf9XZyv4z>d@c6&iMVyo^;dBLy6h1qLY;iKrK?kaobM_{hk<&Rx zuA^@8@+vBD^F>#}t{h7~JjO8lA_-pK2RoJC@Jbk&*kr7OcM-@ZPN z3Rz8Oy7G(f!ev76YJXVFzxc%qw!DAQ4GsP}<`g~Z^ZhF;QBZLQY4v#aA z;@A+)7o3qrE!OXI(mTfb-+e)6kD_Zl=%a=sT$Wzw*@&FavxtJ&f072?ptpF@oTH7) z?U$cQpWQv>2t;s!$NxE`Hjvkv$Llc){Y7 z5dPOJh)pMLjuiD!Jl=El7qPuKs$$*GI^U?pLS8aiN}$ zgsfSzz429k_P5ioX>K_+;%rsFW*|zm8OsMrX1D#P}eEz66!L6-Td!S zpoCcwgZChlqYD7VLo>cY*<0Iqsey_wCDucxvIB|cjBcx`Q=xm~ zGMGqo5K4~Z-1IzC!q)n})uToNF zE~_-@>AtG*#anB6v8^6VQBe(bqzwvuIpzbzK|F13L%w3eVp1fKp-2h?BnWj3mu{`$ zIbM&Ubf{!ii*oo>jyMcfjFCpdOoL>VlADJbOb^<+%eI#MO^3jR!WR&}lbRH8beni3 zL^Gwli5|rxvp{P*(_$Hb@;nz#}s=i_qucZB_73vL>UriRM+%=UKacYhAxFu1jn$!IYt68P5}A$ONon z>YUY34T+3-x1gGd|1as3A+_(Ea<VB4bm-b zk)s_Sp5T?Mx7PDqd;d6e3IAXsH~c+N!(q9LFbybYfaa_fXvGlZrD-@oaF=Z@`SJ?N z7wRY%%!88cO53vNWt{qOmyj9ga*&&{iIOS}!?s?)*4i!&@OP*R37@Wr**}(T!v-Tp zVZSa|%u)4;ab#W;9pVK^-mC&( zhqfK@*KIBPMKI(8-WZ{HQpGDs-Q_gTNPf>ad}R6;geG_`v;;LZc&smexO8g`ukJ#1 z9WB+BQODFQ$-`%L;WZy_Fi5qoIPf92*bEz zuni8QwqC&2+FtbfPN5zGm=2vgc-<}5JP2jUSRM0?i2Y2J#dNF<>-%u&)*8-c(YyQe z=o0Z?+9xw|95Qe|$c~+5J#Fwf%4Vo-&danQw1iPkVpde5lI5PA(Y0H9b!q>>;peNj zXjaV@HTe%%v6S2x9!MrO%RA0h#H(Fh&wGi(m8-Yb^G)nEICu}YC*tTC8!&R@7qp+p zl(!UH*eQq7u+*zIS@dcZ{gqqGfBv9b_NC(?g~|vPNm#A0lR*NS{V^hq>{}Nw+K_AQ z^)CH&Tg$$DfWrkb&FafNjS|Qwl%E1RN(r)HCewu~PX&569b|idGu8{(UYq0PvMZHw zPZ+Q=frr2fFs-p((oI2nLHi{#Z{j4%d499LwzUGb*7g$TiPQ1ek@HtJfEp0pv`Cw5 zB->7&*N)%`517Rw>;gyEZmr`rMK7e2Lpm3?6(@pWABGYm8A2QZAU?#D#sLk>B?J^u z{Qw6}a}b2Ex@|6IYt1hbm`Y|bj3Vm|il-d9R|yM324cel#Kt0z3-%aErm!u%9r{bR z*6`9ge1LSWUaja{N#cM=keSW4U%?>WcLX8 za+cQ$V>o{VbU_d$&M>bETb2IGt>s^`W9_@Fp#7dMPGand5I1d<$C1JMWcg&y@%+r{ zHc=L6FxFYQdV4*?>1*f>VLFG20qwUjBw$8ehG&o_zS_ zS70B6CPifn1jK%9LD~+B2Vm2@MqU%y#R!Z56lE43fM2$vt*w7`)Oy{M&@N&kP$^E> zI2mLsTyfZp&NM!Pc?ZBl&RRJ*SDh(hYmG0DND-m74y22B3$L0^69DLfeGZj_3(mv} zE(%FRJJe|9@~t&Je+zrg>y|@noWnQ}V7W@CghnOMmIs8eUlL?TWnPy;d~V< zS8uK7)uA4f*bJ4;@nXbnMx;T6s14)dF56!6$$nolHOiI?h+fWlvcILz z*=1WxewqDWp4$9+F*Cc6HKVURz$Mztw2^p zLV25WpfL-$Nw{!p>6h-2&n2Cj0qd@-j9J261;l09L;sDV9=5|X>B6;D0kj&ruyXa* zdS19MI#?K`n2mhS@rdRT{3`NKh<|xuB;=vsQ&?!5;72K3xV7|e-Pa}**r1Q(Gq5-m z(VHn$9G+WkKTGb$6#r8Ir#L}dJ>2c_#hYq*r1`5nO^c=$n9Kwx1^~&1*3D8KXLBYC z8qs3@(c6n99Q8O@Zj`}TkSVfE zS&{8|t2PW<0_R;Ke}#YOsUaaQB`wxXKqAH5sGZeksGe(o6?fti}scnpezCH zxI1RADN(d=pDgLqZbPq$i}>3v<*avdGV+!@K#vYLw0lR#)-No}u+Kx)&Zl+4AJy8U z#<0#U0dFm})92_imJgOlmTPR)6LMo+)^cbD_Z!DJ-Ec}6Mp-1}`(5>!BMJY+X6xjp zn}1hsaCS;Y=$jKxg5L-^z&4=c%w9&GsRwD6WLW+}HM+HK<{rs{5t%*o)(}yq$#h9l zV)CD)9r_`?yxZ||;1Pm`%XyVXojWhdEGKftn48oaAGi^gu^@j_nxbUKD2PkOP1GwsZTXNw-n}}@0TUp%6f#(OJUFH z6WS;VYmlK21zNpBt>aruIsMH&w?4~2rjy<+*3Z~5`ZlNgUhTjvJWvMIU3@`@^xV)V z%McH0Y9tH7b~d-YW%s$PKV|!EV}M*9GIB=`w3;|_G8ZA4&jPUO^*0)Px1y<-Gd)oc z{4H_@wJ^P%U7-ll;#l**yCuY}Y+OJ&rugjcl4dZo&eg%ASrejb9#KDkGS?TQl5Dwh zYKb;I;XZt*nnH4dms~=MCIs-v~+DXL;`JW-6_Ds1cq8qs`%(pl-Wr5MJ z-O4u%x>F_pI1D50@WY>k;6z&*jE6=^M}VBOf|Vp-|7Z+a2Q*HKczZ?5K@_@vD9 z(+Yx@%O3>V+i`V&XLpYbftsiLm<^6RC(NaJ@2-aRL+dwN@{vtw_V^*+*b1S$tSj# z)Uy2^dr7xSNS4B$qm{IMv%~~({a>`phScFjeJiR5oM`8C;O$c=fT0juPV|gxSt_ovc$FOwx*jnI;2z zia6XyfFEWswCV^t5{w;I*0VJApxzf3*Wz*qmL3DSDKY*Dy+yob<%OW0i!s{2M6|CT zAm<}jMfavO!GrL?6bp@3u!)+3^f(QZuDPWBbj2UGQ^K2_@6QK4KCDMP- z@AIZz@0A?}psHk%-KDO-Df*+l~$-3nEb7MLwE zpjJ*}m3zudkBrj=gta)AfNxpO!zu830T-%miD=-!IPN02gE5&P9k9KiN0^Kv8G`ZF zSxp~{DnRa`wot&<+Ftd23s^(ny9OmeW)oVRI;ba066hMx6Tdq-FJz=lh8cCXh^;lg z=wqu;Q#O;72n>A2jb(&xLaqfVN0$I!)&|yta#`J0yT5c(4UZK1g)K#oQ7J8;WpGvs zg`t+^2RJ(iOmjAba{G7+px=^Y%pD{(8P(0uZ;r?CY$t=LkcT_?vq8Er1gO1H1RG^3 zYs0@gIWi>pcDH|by6ig9I;P-7L?VZf^A>#eIV#;?!6^3wZb-zioWdjFIrPx)Uz^3m z!xS*AKtu?DJCLxiuYMstczoi87gjDj*!!F@bsh?U^`_;pB3~G$N+0nPwhJM1_{Dgd zAbU8Vyn-@prc40Bs?+@wgS7SlgguNbKgb^nD;j~+oL@?MX-h$Gb2uDq+>l_faY*7msF|<{7aFQCS2Fm+ z8Tj{j)H%a5R$yQQPuH$-NQHe9#`6uQsbN@?zOc?;d<-2tLW;W}D3Wn@Z?8g8ro

    E@;&9L+8|<&|3vgC>7#pK@Lo=pQl?oSKsXISPs& zBmDKK^eSP_jykl4ggIqM+`mk(GET2SL>jQgCx?VdMbov4CZ&%Z345kj`An~pWiKq0 z4;7ZH(Yk>lO>|7Qy@+Gvrz6w|kBkg5DU%S?j-J7%8kVzA4*3)qzbmjD?9epcxd+uq z3KAS3&E0<-9TIfxQ5B(mgzuC9dp<0eU{Z*d&n%Jx&<4HA zr|O;Oz`BbC=MMv{8;1TouXh7T_49_O&2$WZI&n3cs_hF?+)52@lmk9__E( z1a9;&+zSf3z*Rjfc_9-iQXEJZhnrVIV=R^4k6<9V6u4xzJ;yU#xV3Z>*X&4M^r2Fy zhivn>&fsHm_(eDJl59BA#-Ql8N#4jCdLH1XvqfyJ@s)9u6{?%VO@?Jp<_4KaJjJ+{ zSEMPEY(wv&riw5`_n6Sy^;_%uj@8Akd+Ou7P#=jdm~N3If_M>hKB+>oioozj#Rxet zlp@+d9^X*L);gbuh|=G#lH3=Vv)DS+&>ORbNXtkfP4Ud?N=(^FRtcDlziw;Uuc~Zg z**UsV=neq_=*cVSxiPL_lw!Qj4?2m zF)-K|+;OA|5a5ILUqCn}xiJkXpKI4|t?S#NE(a5Y&Ox<|NF#%)Te8Sy`CLXTE$Ns% z0s!4Dxu>CXXG+*w-)p`;g3A4)HJUBNf8=!FIYV0KwbEwHjSlWJ7%Y~^X}pNa0QPP! zW^2vg^)-t;wp@y^5IS2_HTfSrXymc8m@gnF*O{_nPy;}CAR?(L)VryWO|?E!n3Uu- zSk0_-RiuP_CFa)Xn@GnOX#_qacj+mCNppk}$xNKlo=ptd97(&`4(olAgh%owH%A;R za8Ki9O^s+cZNRYb@qidBvZCm2q$(alXBmjF0V&)pDU}^tX&SC52RRw zvlJX2+=Z1$=m;$f+MrRy_I~bJhZ6F@LWNC~H3YJZHD%(PB2$na(#7}%HW&<4Q7k=u z!XKn~EbQcdM=A=1c=D<{q8>h`pA_TTYa*rB&{jP<{M>7>;t`C9>z~6wpIisg!Id`r`%TD$C&xVfBJq8= zhc)VM1$*(sJ+xWgoV>S>u}WLHN^k6)oGhVG?B0HJa-%yuTt3)`z=hBFSjR>p~4rZcm7@s zukT+B6g`*zcEjQIdcGXZ@&n62xbEH)*Cr5AhBw9JBfTkfbByM8J-~?9?M-3sv}|=B z6Sh~gg@Oc9FUo>5*pB?92=ho(Qj((OU_BxwEt?_afh<&7k(`#MWbYL^UT=|%%Es0$ zj}hD3Ad>sbQ`^vY7~unJfF8!QXs?s>pKc0-}H(20Oql=>8@lPa5_;5VCLYa8c*#&ljmTWjypK?nRjbX@Vfqy4E1 zY(vjT{hbv|c+#R{VIQ@W59nw)ONyxBxoCR`b5kMPd*wpAP*s6y5L_yx*yiK_lU57N z$clqDJ+mWCXLVkMMBs0RE4P+^*@fsX@uopP~QyfripPT_EoK1y{Vo@irgTL znF40XgB)94)ECj{$!b(|Vu93r2i5nfKyGH&;$jD}1hcr`>3s+!T=0k0E7ZoUza z8|9r4Zb9mBDXX3<<$}nNzU!S`PKn$O2-a+q-}|&G2>AUUfAs#Xci)-Zy!FbU_#ewcsi<#W{s^L=c9(BV|8Qy+gx3;QkF`C_)jcfD;eUo{%qP zF}*n@dm6)#E2Z708UyLMi#EFM zGK~rz*BVY6GdD;BMC97ob;~s{<%MTp%0mQG{`6hTWwxpH`zz$9$vu!fJ^Z#f-Z+ve z7hEc>-neGj;^>hU%c1X=@5hFwAn^hvszgj4y8^t2AW4;3gP?8AiCNrbIR}0%0$glK z;cFvKJ?Gm+gPRXZgGm03aEPxfnvxXbB&aiJ3dhwPhCYpng7Gv?o}npM_4eMm10{Mi z7oVXifx0vrlpX{*PQC`bE8r z`OI8y;U5MG?emM;+JfI%4N_Oy6Iy{nbcCG`FRENQpAGL)sxQDw7D>@@B7@ki4}Z58 zx2Yvx8EW9LsErrs7|IBUXS}XOIRZ1DA>LLbT^mQhUv9P(bpw=x{(g+p6?YC3Cw!YY zzrbUl<})}_U?QVjy02`%`_KPaC(Lj#{{BDvua-_)#?D~hIX>N$Bn3zO`xDzSKJeze z|K8z|Sa16eeqgV>y`%dZY9fgg=h%0!ffMM?l2%5}@#l4=l6ept`Ft$GN*I!V=M=Kj~E{6N;Kx zr{19`b#!u5MF~lGUtRd(&cCM2Kl!yg|3?3Lel0RV`5D^*h+(8^!`4B}5=0E#AFNI6 zeWYf~!0NkfS}MX%G&En_vGj+_lJc;DRb_r({mRiXoQb`kTWdY${_T|?PQJJ!*HnnB z|GPTuyd*ililbXGj>fF^06cSCTwslT1<{g=_2%4DTVjRngZkLwhLp@(qJTM4@6o)4 zxeVl5@NA?w7e(z1#vl~JdDGSyr7TFmh%)jm&{*%#X+&dxEY0y`;|5_4CkT&AOVYGc z-UuQ$D-YS#>h9iEOSQV1wI|2ZB(7ng6G)`X`xLR(IEHEj2ufGWtpf6l=C zifr}I--)9DjV%Z=Fqr*H>m18HG<-PKE4wm5C%S^VIJ$>@L0$uBk23+A#ox!@2kB@0 z%OVa!c!6PWf^9;@@gUA4xJK3nyeV{YE*GO3$FUh=T z{)BviUwmi1;P85$A?uNMQc=d*fRh07DDVbgqmw}h!RidZHVC%=hs!xIc>M*d&A$}R zmU~*=N%-|&eW6a}{OzMVh5gwt|2%5z@7BUd!x{qK6Xulp{10z^_`#Z0X3pk}WOr1o zV*&~sZ2;#v{6pnbBo?5SnZyImh8AnJ<)}B1WAO*H>KETS={`TXdi&%61?xYwW?CO# z`e|2_wWsCfANcgYxZ@&(i|u7D79spqcrf*f-C+l?+yTr&@Xge}z#^Ad?{_u-)mn-E z*B-KqpYN!pf3(;BL7rkr!z&!Cm;`}g!b`FO8{Q5Tmz3g<-@FNJ+bm;oJGG6-k$ zc*NRTM|kX1;8N2Xe*(Qa-x#-`k)6gSJ)QPp}Qj zaT(=_hHEI`}nQ`dU%U<{s8*p`olYk+U!4U}T4YKY7m6x3!3m z4*?fP4T%zf*E*1MRji#OaoV*)cjkD*JBe}FCT+)E_R<`Cynop4N%NK-P@X@b;?zQC zN|!IK0OLEdMt7ne?&NJ%A!D9~QtsbAB2wUxkX<}#qd~BkL%uNqdx@rlUN#3hNIIt% zcDiHddijikTq9SCr=3pU^Z`d^?d0%?^SGa2NhB5Eo|mrSNlOhtLj= z_jD*E6nUno$3|m(_Bj&ubmvH+9p`qX`yAOtoH!YgaX}M>l&&-lgpoleSKN$p$7&o^ z`CA90ygEEY4dwEsT2yHm>l{nE*T0=)NPv{HCx3!!WxY8WI_U~`Wa`6i9};=5OzMdK zddr_G&@(EvPD$M*T)t$A-2TLP7<@a}MUesOJ|~6D8=V4jVAzwdokYPA$AsY`TI9|w#m%M}O>=Z? z#CSDB6GsQqKJ;zZ0@!b^1+W(*>ONC1*sNag>!MB4w`^UUd}Qk)K(}AC zLbC2n)8DoS_7-zyW!*6yPL{;SL{?6*|0)XjNH}BR>x=7Gfo>G!JW?$?EML*cLIVuV z0lAMZOM7KP|D+Mz$$F!`4!E6=m-$7@LKMbk9ibddF=$jZDsx3p>tSsA^~ zQQUkc6wd*_bO6k3J~L^xq`lMa?;Vm$g3hy$9;UU>w9y=R0+DzRQQW_Of5&H#?Cc)h z`*-2k?UV8Sl30GnZRzzn$6v0kKo`21ee8bbI1Y~`%t4h?4NQxYe}OUyP9;H7sy{?X(|H$VPJ z@&A{E%E06#@|L%f7#^H$hT%46gkvkmakE)+?r|J`E(jFQ(ei_g%U++f=Q*MMbVeWW zm(1sR$0B|9dE%sCIEcwXTA zstY0xeH78heWb%mx$ zC4$~qMso5aBdQi54OBkoINFd40AqdD#z7fiV<}tf{f>`55p+E!2pdiqap1#K6zKzZ zwwGgVTy+qXTm0cjHDBc9T!p@#En`!i0att^=mAQYNRBLU4#ayE6$;tC=5uZmatGLZ zW-+#cPXl@oA&Fn?lrXUikdG015V^IDC3SW!$#x*2=aTcZz~N_}7wqVM!)dUf0Yu{V zL|#M(^Y}z*-@W*y#hRPZ10=if0Rw^niqV1R7k~TQH-7CK`acIIyzf*pCwEVeNf@;q zjlwfWvo#ltY6MMHQ6KWMmcNrb(^K~})vdVwj- zzM&e1ml$qfoZZR3IGz(tX<4H5(DpS8P!*Hd$L}9DcC<8on^e{ow8N{FOk8wAdiVQp ze{%DUKE75m?}TAbO*e4zL3Mxf?jgZBl(sGKa_QU4@M!Ows-Tn z^1-_wzO_~^+I!qj8xB`PxEU*<5!+8q5vzk8>JMR+DqN}6&6BP=;N-(dy>1p+!hUGDn#4RsO#w!)zy(@pcb&j^Cl$F?Db!_be)M=OWq8Cy3kB%O@Wg$qVBqcdzr?x% z#KH`+n2ma3{4fsBfGEn2j=FO2A{5Y%Kp;zNfNXO0ZGcW}>FI5ESGGz_&p;vf(;0MR zSPFdAp1sUH>K1#-eTUe5i0Yu-Nx&(_i-~kl@yFU{i*Dsp&B#{IyDwM>l@d=-|!utK=jhp7Mrb*3L)HvmwI+bPum0Y75+v-F&FyGSf_%WK2k_KR9?lQkYv z8rpxYrVk>W{^K?L=+$TV(L0px}$krNbH-23KBdqF2 z!R;!u;x(8RM3?zADQ=-vna9^~03MhMPYN*F-l{EtQL!B``rXlXf|sMG*DHg+33&EAorSNHH9y}E2}^J=-ul3wi}?XGjk zpI~-7o~Ui4)MLyW@NM8gnDbb&bvq=!nt73RFbPI?|7iw*6wl0d;s~5#O(8N)At;{5 z$F9>nfl-D>NCgUn695Dcl2Lf>(|L(wRna8iN#_7S@m#o5lBS2okshvHsF8 zsbRG{SeqpnU)1=VG;p8t6#O(67aBYiIw`46eM0k#{YY%BffRfvtv+IEpeYF>A%z!I zv^=CUm!e#fM_9_#sW8L zB=$0l$h$?YgMJ&dGbL=T@4F%J>T!WEDUu{p?n6245|Y88kaLUX*oi5V}O8tPs_N4MJ{z9?Q{wAwPP=x}z|<+X~y-itnzsqMxIS zBCcChg{Th4A|N$@yg9%*Ql@Q{G7O7eDPdC~TWfvAYDJ^X4tG552fl2L=qk|sOx`&$ zQ?^c!jl?@WZz424ktp}~ckTMEbv=Gc({B^0PrCuRm;zf66b}Ta7^ZLu2@$nfBuul6 z@h#J`owgVRbyW;7*944oOIcfc{Y@9y_EQPn*;&dnT2vi3lb5J0?$aqWawRCRzU86D z{>rW8f6tW<&K3ZZe&R&%pWz{qR8Z=~rNHi~tT94j4Xu(0v4SS=vDi(eY_0cXZ;ur7MG*wc z`xr7UazNs?!7iJzjarb^Rh13@A3YtIZz3rkrK~|1A7j3bF&53QrHRtZlKC74rC$bq zdgeg`t_?x};a~z%7$*f&Cz?3b6|9?bJwo&)B8(C^H3&_Rlaq4qj4t+jAiVD%PGV|& zQ|TxMmrc4uU={!o&lUdwl#&7g%}@kb3TG4QpLaa;@V#lbd%z6gbqUZQzY4 za3V+m)8iP_$BPdD_Q@<5mu5j+&hHulg^&T`D05*X1Q59&UcTgv#C(#9zoJ4fV%PKR z7!i%y))3JQjn!YtYPfMYITD)>8Bnm>0h{-ow%@7eYRDdZZ3iww8k66Qs=Lcrd!P*w z4#vr`%MeKDfvas=ctLy6F1*4U-A=v_0+&mjS&p(_-i7!cb_-=r_OnvXJi+M6Mi0mB_Or*nfS(8 zK%WAs@|5*`mGTAC*qi$}J<$LNI~p5vn6OnHOY>|zH2S*@8Kbj4iTgVMT~GZE>jfQh z{Dz*-w{!W@Eznt06Sf=w*Fdha7NYS^sRoqpP-+z$o|TP7d%9|%>77|Z82Z&2;W?Jv zQ0fM&6AsN`hs_V#DZ?U7Tfcg6t@xzARXmH1J7_ASZ>j{fo{#A@5=hJ*$-mH@Gf%qv zjT;CC__M>K`zXD*Ikej7HRSf0LaFZ0!%`@{rDtt?1g1N8JxGrRuHTP0tjdPbx)HYOY#?!w*{8NwgYz53=^4Rf#_)uAgx}$34iEO>a&(Wu1Al~Rp=~_(EuS1v0Tk0 zMnWFM8Vi+QfHD-#r*$DQk8X}cY*~{%5b)RYi`v@f?>R3HWt*Mobdm5lRIa3cQ1aOn z=u@%_Ad~Yti-5I2Vo_C%s~&#cSjyIVA3rMjJyMePmLLOcP^T`Y?R&~TtX|-GHE+;I zfiT=n5#~*%Y~8ShL7^9udJnm5EM;p?e`VN{=*3__)#0dxF<6ELl?0-on4+-1!0ac+ z9DRj7`IY5RUip|a+Q~bL{onp%v*1a6yuU7Zg56dIq;-q80G{DVzJq9Uk$~ooh?CgD zC&{fi!&2OQ$5Dlzg|m|XAfBJx1}r1L5Q^2*`H*m6Y0E>Hjt#PqDVD+MWA*pK%aILg@}{s;l}Jq`^H->p6*|psU5zBD?xi z^77#GefH_m;!|t%r#5~&cMo^J*r41}fTCVY;+;YQKFpG@pxkn?5k6PB#U|R9&V|Po zp5lMD$ZI61NISy-7s>OkUBEde{hQb{t`MFl9_=EWb5WD;q8U3w@~op0q$I?UvB;UzvQdJ{UR^RdIS*b6!$U(aGcNZ-K5q z$&Uzq;BSiN8dBve&eDBBXQC>UR-q4|xkZW&XWz&hNCbvtC{)fD4Wdd#F&19kmbUe~ z8`fxh%X+p`IDgYV*n+2DB`udL>eWUumoxhYqTeWFs0A^X=dR!U$(oi+)*!^+)Errp zTEkA9n}U{0H^u)j>Y6G=FqhZLTG)7QWv1owl4-d#%X=$QF28e~*IdOWffHtXU;d=p z$7Iad_N(eH^@X-(7Yhd83-4fI>^uFVJ7{0^3)|J>qx)#SEbsjh$?=>5+(P2|58nCs zryqUr@muc%8JDj%{5kn9{|}jZzsN7%3XTX)4-S_*$1S-=|DP^?ZKUUYm5=|U&n1$h zsome!Pu_WN?Y1@vUc#Ben;M-Sgiv^fJLq?CF%V3Qcq5{8e4*Q_PS|bT+>TKS;!8B+ zA9p){?ap<2{L!6v?9bIWOpq!}SnvC;U9SoyAwbou=mN?&o*L_tSkozM0Qk zO6sb+bi%VagR%x&M+sgj7SqVdv@m!8c9Nz-x*86~MIO?eKG@yd(2CKm{FWN=kGq$@ z{$=;_k1sxo_GoIT9^%a;y8C6HO?v?C*?e_;FV8-ge|APXE2?IB8<7J&i5EW-N)y?>^^?gXOdysb{o4pKji8Et1s+T zXPRj*SnL|m4HTS!$=J@~6=iIlipQV?(ZS8RXv(S^aGY@A>Oyiui;L~{t@M{dh#V>? zqb>uB%BOjZh!l1>G8{JPIvzBR+xz#8Q^$dX8gn z5iO=g8r3m$QdFb@W0X3=wOi|WzN?S#hVtvOfmS;}(?F(^<#pG#!rNEo+SNHr-`gOMWRJ6`}YN z*gl3gG;QWmLF+PLx{~;YY}}Gee`wQnpqq`Z-CD3zgYz(({{o83322h(d%?PZXVe&W z6Xt;oXZA>a)NfAB^|_itc!ATa)KzJT8MtfL!#5!h7E+0*Uo4wO^ZIXJlq#5|#|nC@ zpvC>J|fGUzW}Xdj?EQWR+DlFR^O0 zqa^ju>}8LR9RWzbCQBS^A$8Op=-#?6sy~k2}xp9mH5QKp;G!UoiGC&cqpWI zXz$4-&}?Kj9mJ|o#y+~|$T966Z6Rs6mwAO~^J8d4(130qogxZl`JsVCBBiH;yVapV zc%-?uk`+^et0fsuYV!U_RUNeSgmbBPt|xviBrWy%_Y1H5|Eg|09MSF)*+{C?^ z8+c{;#$*qU63C#qZQk}qOeaZA9b)9xwL7<{Xx=j<`fdje+Om z(a2%qDCIL~3W)rK<&crXtPl1wf%7B10lV$+V(x-{8VO6iU!00m)u&zVNZ?sXq5Rxt z!f=nkIXiM>>754cK7Kdi&OytObX;Je_XW`s#sYh1Zob(ze-fte;Djym-hEA+kI5;A ze5TyI!dgk5pV86u$sCrRM5Lyu>+J3!<)#c&nh2#xlh4S2D0=y}U5Ve&O%nNzdUeaZ zVH*E}X(Z)5D0`M+Oz!s{DMXeI?q(y9s_q#7xRSi#ZI`&t!Nf4l+B zVYfgR9PE+Gu#XMYhPGP%^w40tDXvv|WI?b=8j$fejbzlx^*ESZ>2`K^nfKEWEpqda8*dy-w>RiE^YhdRP)tgv=I zK`Y3Cw<*Hx)P;M8nlgN^SHP9MosO9W_yY>@Vgddz4{5a|dKad|q26hQg#1n49GJ`L)MCdiI!x!u@)r zht6@B$$)p0*0`;2?Q`D`?SRmU9&(&u6MXVh4tow!IC%S~l1%heR!7d|iN1%3F>+m& zksfg?DtyiAau`A!RYr|(kEoc!R^aRZyF^==?G{nL* z`#CGtAt4%KqtlirNJAXAij?y3bvhd(c5HElhN|JR;a-cZuYLod4nlzGW zqi68^1G6WsbBN#|;eEC<$1XVr&sm`%rser*?#*mgvF@6QJ12c}GCs=&Pj{@yP=MqF zaXvo_Rrm6W>(vV2T%{pC9WOPuJ#Z`8{$&d%G2!3foH0fhz^zZ-cvV5!{_jI@xr4oWTi$_1TBxY}e&vIz_t=<;~HP=^EA z3_^6W{(fA2JgNZ~7UF__>z~6fwgHVney)cS5Upl^0JceF51z%~og7`82ulmvYQ)Hf z8*od67FhTMxaL*iNL4h%Y$SmFCBIH7Is{Zf=x%wH(!si<(gs9vZdF3{u4LTJkWIGj z=Q|Upbtn89q|9STeLAgyoJbsy@~dtemO#=eX68OUmV4mFRz?}e=5{bCq6ASmH@|@h zlp?AD$v`jrkCp05fuIz+jm*ArX031|QAC*?9`|7`BL50PemK={hX<)Ik&e9M-0E#! z2s8rS2Yx)XG)k;!1hbo59*g&>Wnk->X^-VjPuGBM1QiO${hZYu#Kv$7hGGO)s}>EF zf6OHH8BPR_PnB%$hKRzDRkUt75XQjqQ&idjnDlr5gU}y0g!WU1@!5I8dL^{Vqy_z; zq3{R5beCs;47IBR8UgjiKf&X|gvF|I_Y~X{Aa+pQ;fTd0iv~BVehm2earf7!95VnH z^HW)BjPC#43dG!<51cU*VdPXZ##nZm;#C7Fhh@^G#4oTJaXIfqCcW-p&BCDD&M*bx zMIImq7sGm+fWt#~)xo;jQBU6q zH5i($6N90u{z*G?(T3kNxA!=gaSiY5bUFWhIsNDASw9Hj@mroko*Fb>^>{A>gWCH{ zerJtA{miBVUT=lK7IK0FB8iT`OW1951ZY|)z{Db7+&P!t{NKFazt|^l1^C*)=nw71 zKKamI?ANs{+iR5;gcx|Os^K0ae46S;W zNK^>80W$!DW84deJi(1%nC(w5yapC;(dImjvHe_u*ODmB%X3vE+dQdCGFPB$r($0r zX$XNHfH94b(@hAjJA&yo{vc`pCbf@>WRhRY<~y@=p3FV3cNJdyy1e!r0CzEH;b8!9 z!(BNKfV*7nH%GUR$UGJOAaKnZ+$~YTgX7mh!N&X&NkuZ)rX886O%x$B))W2K3)lqI z^nlpQwxwLHtEl-Yr5=e!cp<$sC^Ln z#SE(F9p;vGgYF!bUntNun3zK@Z{V-t)tf=cGOTaCfQ!`TclMz+Y-QsdXP;?YpsSZH zQhJ70_q4@VC}J3!ybPp3Ut3?mMQTIcX#x2w)Yi;f))DwJ#Y~!o>f49xWS2k%85t<6BXkmD7D-((h?RW-bcRTjiqd@_sPJ* zm)hgg-PK1gZkX{!olXl@Z_+Ig6|GS)1;>;0P2O2lbPq-b4)bn*>lY_0QEU#E~Ej^+A3rcuF)0$;gCB3X)zkbu)UY91tX z#w6>fc`vAYwulSW7$W>IO?h?B5uMd5H3OtZ*NB}3nb=v}#RzNAf;fz7sBtJ_YmJu$ zJHc7KZSEtXJ~CC2NYaA2kRG;6u=oH1M@aOoaV@(#G#dFHpRQDr2Jb;{yX|jxeX(Lhmf~1!gRg(or z2(u)`KtN|oPr=~<$@t|?%G*J5mZQUiUhp!DuBFjV1oa%7diVCoj4#FW4M=Dp6Vn93 z7f-^m9TGsG+XJ{e+(V*xu2lFcE!o`}&G|okNe2QwXzTH7n3-T$;^PfP0tvbz`R*8d z+Ff7@*$$J838MVPJa#@EP{&QOE0jJ3uJJztbe6*vpr$_w^X~p;qop z-lLcsqFl%5Y)Z8dWpAyJ8VA?Y$+TvEy0VOIm(xHL5SxP6Xum305bNc zAuy&nn7Ml!2Od#cMUewvhE?i#cB0_|8&ZN0%c0d+3r()v6!+8l>!gz_?;px;%D8e! zFy0d-T!gr>U9&VO2iSMdF5o9i8*f?)6Y=OS>V7&9l9Co~AOm^I0X9ytPI6eYK1oJjdAR_}JI*fuar4i6-5V3B#rb3t_moE+cN;g&P zYrCBZ#7OmiJXZPS%6rx}H(15w%7?W14caoky%Hv>tJHt_ z((S57BNmlWh{AS;#J`=&rZjxDLRmY*&w_%e2HGoniVJ)Bl78j-%efZA#jxtpcaN%8 z7+sN$7}Ud^Q1i6lCIHyRWz6nx~m z<)61VCl9J)V`}S7#G}j_K?)ToZ5$Xa>1Y4lxp&DPoMFY2x~**MOh$LT@%>YNn?XUB zbb=`y_GGdQM$^>ynpPZe5+;RIei2&j6pT6ByW#LW$1NS_KS`&(CTmL7Q4z9aL3Mm0SldB zLgD16=hj}xyc}F^4rv*;-NBmPgJ+)|-;HqbTB%GdYBZr|-Bcy2-*q_;JQyp*;l!nh z%Qk-Pl<4_qr$i4?(iOQLZJ4f)@8ri}yTv^jc22Ts7u553&TD>9!`eekuBoGqVM1-Gcm%yh|D^A<}L}EFkapIr(a76%nh}sCpzL6!kHl<7|+_`Q>fek@gw& zV(suoQKY15;^b+vX(zUa8x3PF+SIDYaCq|s#C4w0k&Uzwj*8jBE6;5?`NQox_@k-a zA9I}1?@8Mf&N2Aq0xuFY4{^PzWFVB(xR-YsU}iebALt7@qu=wS>B!1mP=KAmypz=3 zh>lElahdJh1Dz=yS$OXL1=Y{`syzLcXDwtT;pM!TnyuL-pR#pjdu>P6vNITz(&ms^KBFb03lj|n=mPO zLm(!A$5oSb5w=O75{8GLU(_b#s6Wj(tM=)*f1w5QyhL>X?M~AF<*>uaMm1})X;LcWr4;il3bDGHZ2xUQqC z0lbZ-a@KO3NMZmI%T3wAb54OSHeQbXvX~|Tfg^wA#Oxm z6C8_B+o$M*X!Y$@!0ZXN7BHv`^2HCP$X4F7Pdv3rBwHWNY7oF3DTZJMbS`)!`%6W_ zwVXh($G#qCq#6+w-Ko@E7M*oK<3#XAA5{O81*Gl z?7)p>Sd=47TMVb61uQ*F8IXvm*(19OHtDuUOf{ZkXpDH6Vr{q11HrDhFCf7 zx`(|Tiuu;;KXB+m2s3p(bZ6itG+I5lYhc@X6ZU{aC&51hh^d)IrZh9Qs}2DS)(FTu zjzeoxz$3Jp@Jx{V^oUGp$juro*u;V)#kLh6m^+4)2826rH2&V+@lwE+i6{uY4Rq7X zm#zpH66E~02X?JSvaQ|ti2!T@2#(LZ>Nf9*%-kMET6a~C2D7W0aDS&XOq0$_0fbb0 zeGMK2op*u#`=Lhk7_#oJi6I#71yPVEh4>tEZ?looFvm$q_J+$V@YT^`wF0-0vS3R-%9lq()&-cBxkQ)zrVw_T0kgF4RbJm-p zrOJ0jPD;QmP>F{QF(U5dfH}=Q>S5W-mjZ{JiH_+~kImWuwk)(-Y=@ByZO}wS&!XGM zQK%n5Jr@&gcjv8sJjledH>UmfxHh1nV3)Y2a|XCMSsffts80 zg;o!SnE#9fBKTKO&CpYPawL4$;kueAj?6s>4DfS3)ayUHuR7@z%fNDZDyfNKlxU>p zgPTlt_2_Z3iD?=7h9bT*0;I>_sDs@Mj$U@3yEbs}p#a0L=In9S0HJ3dKMynK{@r(b zq*n7nPy9KLvKGvhmz@wIznge$Fi{jMJj9q3I&YN4FnX{^Mc!*h!hE*Clr`y!4wK1Q zl4Yo4wV+D!L#S{YOgKv(=aYX;VWMPKj%mAVFcE+Z5}LROBgk&KsnOWU{Rwh>pTR_& zO_=YwUUy#lSMlV(l?dARIJ=So`lq}Nbh5I%b>#Evr(Y?regv|-7K(IQS-(=|>=<{& z(A=WwB7#qvwdAo@5nLbWwlnBU?JTRuQ0h|+6Zr^mP9pLuOoZTKd@ijv?qlXx?qN2@Kb<>j?3*-2*Dih%K-&02q0uLTDlT`U}bDBw{) zYUhDR-|EAd0B9t0G^GppV$egOPm(7BH53A1x+oy~6`WZmfiE_`coV4614OTCb2=pg z^_iBTE_~OE1k>_qgDaitf)F0p5XJJmTEJ_>)dd-4gQm_Fv9-okgL4liJ`#WQM@pZ8Nt#yCP;0o#Vg$mo6JoqNZV!i;g%-Tfo zcg{mj+I-j5*$mHjU*Y)Tt+l+mhB$<}7Fm^}wVh1Ugg;QYM++b)IlshZf`c^#^rHad zoh@QhjgJ)2>ktaa=PmlM?B$@<$tR-0zePAuH1=PnhTcmO@Llj zUQ0#1E21(GCO?wsnJ6?<$5#@dMf&@`)I$jk3A445*eT1D-NDqmmWQKz@Vt_g5`>ti zsc>%(>b?5>Hyq(El3!G^Th!VV}2rSbX9ojRR7cQG;-m+#u$AP4T{DNjRS6;jT}fxkhkn_8vO_+!?X$P z$)?hS5x=OvnPGPHlg4W*jt0w38wwg`j$k`CQ3CBv(*X*WUfdE?B(a=Pkx1y#1BW!; zy?bz*fa&n|XXau3qApfYjA<_=TEeMmdgC77b zW*IsQh73a*(yWDOBb)|Y>YV$%2BbU_FMOCl%KN<-*G)&cWg5MwMO?zoZkfFij>q=Dgph_-m53+s@Lmf&BCoKm=HzraLTAMMkK;5h5t$ zl8XuuAdJ6`Zk|#f6c`8+;3P=6!2Z#4S{?3+u%YZ+ zB=9K4=jvgOShnPnTbADL3*Y$0bri3HhLoKM!p6{{g)tK>gW;t5jF5x4(zqr@+dx}$ z|LCp{WsI8UVi$D$d|pl;{sMR36~!9=N)0^NL%d&v0dhtFbIvCx$RGg{ zqxF^+F#tZU?Gw9|61D1;(YN!?DVnZwhjH!a`V~$?cu0CS(OnbG)2#w_eH}Ifw`FN} z%Z1()FixIZ!(yBu-EfPT82;W7agWIy6f@8qoWy`24$L6@+_ibrCs;DFLWey2N{lMQ zr1;3%I4ooO1`Xoy!QrcwV;g~zCcI0Ds4fLH*>6m3#YsG7dJzN#>v@+V@Gl9fKQ z4|d6Bdw-N`w>n=(MOiPbn3WkC;I;8X<;Wsoy6BOkoIYKO3Ai?10Ck>e-YT5(Hrqfy0ry zwmfR~jzoXLU*b$o?;05Mt!HUY%;zso@BF>a!@qwqEx>cd@c!l|uR5L(9=hx9b#i^> zU2-G5OKuGB5<_6z`|{cZ+xO+P{*GFoe#77W#oU?Ue<3Q)Ss3T(c&Ru5=wiX{Lji!wFy`k0K;L#-e5AC<%W8Yr00^i? z=Md$r5^SxO-#P7fm7#z5loUAGN>&OFhpb^Rk+NEl zRaVa7so+E_jYJ#Kjiqeu;qQ#%p6OcL6B-c5MNIx7oTUU-O4dr9xFcH=<}JrTUAJfu z)O8KmUfkA}{Fa50N^Y~$&mKVtt(eW?b}rkFu4_OSG1x`BY^J0)w9H8CYMLUn;{2kv zw&1&c3kaGlvt7KMcF7X;UsRJb{~xw3#1)O@(Z&RYx}g*a-DS z?Cj!h!Gd14$QG82I9c%=NoBb7)Jd7AX^{3?y?kp;Xx$Jc%BJ}sR5WWAq|~=yW>rVd zB#zDiXCSx{Ig{3_tOKpGxwUfjrg|PN%*Xj-!6^j>Jt)a#NvEtnc6S)2mF#a>=If_I zU@OLZW42SE`6c>)ESWzfpop9qbzXFIc zF2iAe2GtPSTmNb9=OlQ!B2}^d(;&rg&jOZXzcC`sFpk1z=273W-WxbH&QkI2f#{eG zMIH_A!QmIyTPhs@lr?1G@-t-NAtDP0*DV3|r{M|3f6`{cJN@0(z4spmjRdB0z#qUP zK;1qL4+Y<7I^lOCUyhsN(gBs)1Ir&QWRC|!xKgqygAbaf`1t631M|7cT67E%w8YgN z6Qpv66e<8spR@3F#R@o!8}(uhD`3#U3fMvBw=jce4bR6veu7xRmR3EZd_1Fkd_~Gf zG$V@+U0j`ub5t6m{u=|5Ey{*7^bY3tijPFk9eD~VA8wlkbq&Rh6|5j36gc1Yv2D6I z$7pwoIt%-FtnkoBMxDQ@3YI$*rxsd#&!>E3>9u&iL#7R4$(yi($Nie{sKABx#t#D( z7)JLzRN!p-ipxoPq!}q%$e8JEey2~7fL|qWCbtoj4op@Af zo1@Q;oc^3sc8j3auHO_x^=QX$_S;66PSlA$-}et9O;zQBR*F>75UeHk`RO!CXYmYc zKxTQM5S&-g*4iI+uFtDs8@nbNo~PJFz{`TcV`wH~J{6WoWcala%KB-xz$V5G=Gh{) z_UPL_3RthOm?v#VCQJt{g9QOY&0_yABSjyIVU-aQ&2=KG4K#jab3z&P7(9&)m@_mL&x7P6TKJn18=qF8YMS%P{@JJ2wDMoOKe_*qa!^vqGOH3Zx zEb66~RxjUL)AIz2eHEbD9k?!|hO{~l8;}SVE8P?*gfp;3mSX1MN6lZiwd`-J?6Woi zWR5Rth)*P#G3~Sm#sL5ahaye8j#D-WP@$GHC2Xzll8=meio>m$#Ypieal1e+9x#pf z5S9ZO?x=wFQQq)E3Mf zN9RUg-1(pN`9H-$VC2Z0<&r>4(o{SBG4j$&o5vCE@;edQY)Jr2|JdnzEA`4Unha<$ z?V0I1?=bM_$Pz_W=778=Sa&h^tN>*80L%YM^3{9Ch8=y&963IuuHVTQ(@CP{!Km_)O1|LA1nc z$$K+bF_xTE`v-fFkQ`e`%fk|rRAmk_re0AB$b`G+6sh@3;grhsd`+%@@b0a*_-T*| zvi=*@P0B~>nTkV$jgh$ah^;@1VHzPJ9UglI5Z+XO-O(Xd#elIs2Tpe@=p_e|q13mG zf5n}0iHasK1{L$?B0PmeAyb{|J~wro7WI0MTlU`%Ew^9V1R8$+7GmbGKN<3=M8^B8 zxceO_l_81!Oc1k<6gS%C`BuzdS3It_p*@yVcH(AD*RJ7HYJ^h3fau~BOemtPz59YJBP1)2nX^D+bS66IinLA2i z&s&o7%e=r-9%M0%yCkmbwB;;0opUhTBqbM)V7RX-n3#YujCyefOk~#>qqmscisNeu zn~tXgOx)J0ZD3;jMK!>`-@1Eh>U-U>SE~7E+jerJL3$?H{8+Vk<{#UhaJ<335%N&~ zaO>`SbkBMO@J#j?DF!L3vczC;6BLaBq#=GFsz)1vfpk?hp7eb|PaTwq4v)nRX^QUs zs$w(pVg-uLXnkx_Y$mB`o@6HEq8u5L#y}2GZ0_osFqNnqcEDN@^jG)0R$YmJ~zqbxS~f>0>}sbpg* zTl*fe&3q`@gI$k4MK0`VLpKY&@W4jt;i3kWm5*F0L?B7@d4%bO7Whei)YT&Ry> zgB)sn=t+5x6wT@8Wbjoi-FQ7JOB2(=3dgo-gl&4>rtypn;3tIUKyWg?c3ddAmXj8; zM!}pmp*aYdS^6!K_iTRs^ZFN_JIA)!;2Z}hO^J$#ERk-3Oe1p4fb;}Vcx=vQlGdcM zkwPcSX64bL`r!edzx{QuuCopwEKl#=-B-j~9Ue+K#J=~rC`-aTUc{uCC?0lALG$D; z3>Srkw%6A;{&)5(Pn#M4%#j8tWra4-qahB_K~Eyd71OEV7O@lS3%#L7L~>*_pz2Dv z>Lgf67V?eglkH65hN=WvX!oFoK|rxFbMY*nP{cc)iKE|;I(T|e?^U23y_&9F7^pX{ z&mOlBPM{1bGS*PcRa<>54NitCvss4uii4Zgcx29upY@W07JIuuAZh>=^x?U~0Velo zBJ>~<^<4IlkPm(%)QZO7g0x3>)n^K_zB+v2oL(}P8kZ2E4_n|HHqSJ~t{TGb<>>)N zYnVh0_$H&I)j14r{|)nI%sV>56zWWG&jI(oxbv^UME~U1?))45=b3xb!_;`W{X^zD zdA5qiZw_~nC)eF>mKDt*edS=?FfYc-%A1ov_fKKJu3Ve^<;tV{SC1`(Z*rUm;v%bN zk)ranXs~%*EEbLYO4|}GUF?|f2u?d(+wrc5Yh>?=jw6;?1zBKh#`5(H;h&3(v3Jy3 z1n*LZa*`;XG6fjkM@sG3)T(C@{I8gr?jw%ilbEQBBgUyjBZvl~mXoX|mqAF`z^3OU zwAcg%JZ%wtJV$zw&EU=~FZEEbB@V^Oxe~~nQG5Q@Q?Ae;o|&@?d%^$oR5g5AK3Ha{1?Pc?+@=eInVGYf@q~bvJ!zU zUM$3)5p=B?`Ymuy{T@DCxHS?x-#y8*jUKrX(~I7EGsJ*Rgt=2u##06cMh<8=Q5ES( zhzoZKK1m$shp2P7bZZ|k6Lr82cF{^7PlM%jbzbLFG=#~(iFj=5MHWH4NauV$M-Q7U zHlrJ@7qF?eM;d9ivw4-5uz5OC5O~0p6h?4P@=$}w@*K;@oKuUZK$-;vaE52woHlKW zHRtF&Nxe13b6_5LRX;m8-9Oozx)WV)(rNoZECLU|`18H#{jNfYLnyh2TYS=r?-n*DqLT_Q5%VwHH4~ZdCt3`0c zZ}MqTd#!Uc*;_)%M~BpUc|lLmbUh);8$u@?wCe-aj_#)aPVMr|VrSl02%bk7Bd&$3 zne;2pnO)UB^6W>OAko~cjFEs|%^{jEaQP`leXR}@QmZw+N3$O|nI4T=fkr4HpNZdE zQ@hV4*P~*3FB)mqQlzgC*^d(}czvsU?O{O1QKDt1s2p5|Y}&yEAr9xhS-Y$aLmk(w z*>b+3%|m-lI!gzc|HLhym3z&Oi<`(-n9najn9*ibaNp8Q{YyuuMKN zMI_9GJV@d@$6aDo@vNp~mQHYvKJw1x3%V?(ka=JYh!88?fhLJ-DCL;=lf}*se{pj) z$WQBu4pYsa0yW*C;Bv_3#`&V!elVB-$`OV2SeM}^VB!R6EqkmhLGbqM2@lG1IQHIh#I+7)6 zzQrQNb6Q{sbm~P^r*mk#aRmI4V=^=fjlP};$n(<69Q9%i0)b+MjVUCCr%gR&ORKg) zAkkJ5!|(Pg&hN8U@15{w)~xo_)X^wCV=+8d7Q?lzEQX8Tw4Qx%hQ@&D#jM6+nS29j zheBvZQy`ONaNTC$p(RZA(cSM0dfGsc1mkHJ#9){ra`Q+%B|#qHd`F>rq1e1jrbOVP z)g#vmAk1@5UQ3MfXBRbF9EHGM@@r`hry4_{jp`|n{C(k|kBfzx4+HubhVwk=<29fU z%sDw}luDqZe)cc{HbbyO$i6E?rLSSpmvKq<4#MgMJ}`4M*nRlExtL8sd{23J8VCr# zJ>GoUIjoP+!VnZin|HWUlaZ1$1hX7KK*X5^xi2~9egFob0)}90DQoLE{DzOhJ8~0D zFj3lyef>3@r8XgV3M)ZS3Dhpo!3Ox$>%K$|Bk4j$%sJ(3tvgUB2ze|NLJT3)+>s%M zSP?e&xbVPp=}`43=G8QbJ2oCLrb-DPSreX-BSS5A@iQ@#DMeCI~qx= z^a(zgEG4+6=Vep|u=OUmOIMvRU7X{!(t6GT-}JaHr_3z}*I5pWi1Slfr6MNUdmxf}*<7{P8#%EvN4Oo9~1pjYa3p|*sAVJQd}yF)_G(z|ODCOa!`F(VLA zagdx78Wll+Eve&ZxDHX9xA2zdZpeJt3~8*%I;o+G!88)Wb11;8WRCQ5j}|PM-~|E? z*X*0BJ#>eckU3VCR{#P9>`rOddEtag956EOtO>UUm}EIC5;B!RlJNI9M~&uzhe96R{3mSB{bqW5(AFs4E+9p!(eY9%OScjaCGWsnU=j)3!-kRr!N8iabxGMk)_MRl-;E0Q$C-TVvp4B=)=O}Z=4 z$jVh72~ejEsmvH8tg&Dhs#XK`{ewbLyCqQ$Wl>|vndi?`E(VGw!lx+nv z^34922g0pGH-=NFU!pjJAr0RI1vUJ3I1*$toU#X=Evgh3Q5JenD$0M@G-^SlS!HfUXj>sH@ zpP)1i*3OVMHyTbq17iMv_TKJSuIo(mbGN>zW7D#wcHC)C&(t{XHkD?bvup3#yQ8STtk%u~`>iE<-qGmRwS7{6ebD3Nu zNHA#hTr?7-gCH{ls~>3^GK_2E9HS4ud#F0Rv6~(!jtEP<^E85RHmKfLz)S zuQS6ML-dR1pSN zOIeI-4z`A6B zP@k`J@$ro{E$D{0ihgBON6@Q@Dn%Fe0PL8B9%valGaQWrJ}C0EKLkiQ8!Yh{RY!}sqh#En|Ht%RAyxPJa8W1#O2wxHKS;6Yi&Cx?{A-?9>| zTx=D7A8&VdAuZ|CV4=<%e6e%w=hv>hd+Yk!H+DPMZ**?`Ito$N`(PJmC<_`Z}*sPH>BrT{6Zt5GH=%k zLpdY@1?Cf2i)N|)OKUmixx!k4po#)*_|02J2&SlWSo{*IU?r z6>8723Yk^63YDX(+lBSyVt}qHpBnSlD(p%F-odq6*jhhax3!*>fqp@bQE1?#!9-hv zt9V)sIdt)sQLamfgpCvh^U7wP_H^C^|if%pgYwa*PB45|9Kaq~!={+^p!1i(Xoh zM5~Uf4c51v3%%hsiMP@o)vj9KPtWVane1n~Tt5nvJ#NPRG?SgUtwYil?spHl1kdh> zCmXDyUZ3<1y|~{+vw^uuQ#^3xXxL2%T^i)&m=s^ZnYy-=jmA-kG;wy(moG$RtGR?W zR^}MrD5-m)01Q(&DC`nKo-l8bh9KA}@5P8CcpGKm>5b#~N-OGKxB4)7QA}Fohztl_PPIyQ;{lGgk4Q{=NaRkH-atzbHvOBFM0B0*#`k3Ad2SQy>HoI;kGpM@sjAcXxX!ARY=>hi<=dQzMm-R@kt!9d>W zkaQFt{3L%p@ZqmEDm)h@l0o=Wg+%Etq7I08cP@mF*8ct~;+0tW7jCikX5km-x7tPS z9&dMUk`Vf6=34P1YS^pRSHDZ=ukO{issF;2kOX}FPc_!f&wZ9t8asc8E-*`b<1s-> z^Y-|81Oy3r#EY6Z6eSsM7Gmd^sL)_Rvl#6a%M3qfy8XE2A^Gi0aHKtLef` zDR($LiG9M)4=iShEeD*#=mPGN506@%CT}ZaG272YKdjmD+O@7%&?+FHTkMXy&;NHo*K7Pa7$l9ifmtg7j?1&wn2FlY6kZZ|A6&ugF_@mw47j7+`J>f=GTu$RM#h zZrG4xrmGs&i@h{s+*P@W4vX))SKs4Xv74N@@m-W@Ii%1TrQw=={o&E9Vmeh(V^++R z$zsDw;B+}SPRxSBOHCU!8QVKomr zFE)%#e3)Mk?qH(@igR<5-ozg&wvr>(LdZ(MQ^KEw+WOOWexf&TAzxUSbiq%DckUx; z%s#SFp)ZRc5T}XssE9(pA)iyl8)!Xh|lTcC64N~+V znZknJEv+k{TQU0022tdy7)`vdSKbB9m@##HA6lz7hydd$qjWF7?*si@xT>$14pB1^ zah&jbs(`^}9LxHUt*o?V<(=vA^uVxTHyU;by0Et}8-8T%IML#vM6ENOEOu_WP)zM3 zKgU}4Oh(gCTRP{ruw?19TA>*XrMt;*ouMGre!tN_*OHtau7G9MuBJ$TlIohZVe!7r zIj21F9FMN27n|1jLphW-e^I-&nZv0=e_9|v@sQllj@@|@c7sRgT`aC2*9WatjnT{> zQJfk}ebttwnc6fOHGeDe3*D|1p!W(=wr%8NwP^;y(p5z(wJ9{%rr)d+b)Ty60N4Uz zX!(})N|0wW!CE3=A21tybcxd|OII(# zb?xoLz}pH|iaJ{%icw`9TPGIYv@0t=+;pt-&1qv#>bT)<6DFh+IE&#dA$=I`4%n1? z;;l9>K3m^oHlo&`TA({v`$7q?G@t1BC)!uLt9Cw@JNFsyJ2kg3dU1UJkS>H{NPTIx zsMdaak4h|y6~s;6;Qv2Ag`|-&>5w6Ihp>TiUVA}q8>D?gushY)))j&VV z?%-}bW3&+Vl%0>0Zl4h1&H`d((wYp7#D?_4|E!2+@z1 zFp5*UeIytCo0#py%(+9r1l!sJYztfqL$6TxpyedESMMqOS#vVKKihk7T9zkl;yL#; zM=(Io`y*?+^BxnW!`@Mm)tDIrt@g*^WNAg=s|xohJt0T0RHr3@2wSAGL$qfo> zB7U~HM|HsJ&7|vv_A*QIqDI&s$M#a7B7gjLF4Wt%w`t9Xlf5xN6bx@?fsQDWD^ye3 zUr5Z)OIXlrdT{&1RuDef&PO$_)cyMPC4cCP&jjl^jXyoP`?pG-@;#K?>R|-tAE!k6 zl4J?YAF?f4xOpGQJFUmamf!t9`0YQvy9ixZVPZ0?eZ#kVmH)*nYu7RstuBsKAo3w-Sa6 zJMZKQ)~$0_{n@9VyhwT)a^bXNqPI+pL7@jn-mCR|lJwgm-m8vLlxnhWJZdqNpAuqn z(oNRJt#5LSKB5Tm7mxH30dfC#+9or1iksCUbEY*>)d^Qe2Xb%&W{LzL5D)aB&PYJ5 zeLI2m4^HH$MdbTrE9XxxL2ox#pl3^$(TBJU=|Ntfw}Ge^YVv(bbI^4Y`?2 z^b@4)6d&E|a!qdHqc5YCe^qd;XRd}IWkY9t*sAEXplqZwRFF0QkQsnP7;(U*@He~t z_y%zgY8oW_UfS)>oyzn6_G(}k&(ko6P71=q>@=@2`ur*$GsPD#&9>_#2QUbSnB;n2 z(1-V8%&^UbSdsE1(JPI!jGLLExBjsGtW-kFGRW?Y6^^}PO#bqSIl!j)SRGjNL zC4_-9thf{MM>1dsK%3?f1yu{lYpn<`L2m~L(4wYGEwO=|m)5Ks2KP{YW!G7L<|Qa? zD#6{rmym1}H~_jeJpy3!3C-LCN4Ru_138#=$%a4w%!Yr2HvI1Ouv8jT<4V~5xP9lF zjV1ZE?f$tJ+fCM$`Tp52(i;77LR?Nn`t~&E^dZt|fR=NHc+(hy zlk&X~Ko{%cSdkZotjE3HC~D_#dxDnwi;vPgN5a2l>n)k*%m!-lF>w)3pLtH)aJ;Tn zPry8XW)Xj>EaE5~WIe7lT+DJV>xc$)EiGLHR}V3*q({oF)*gA9En;_p8}){mvWph+ zu#Y_TX?f^k#H;#9fOm&^LGrX-pN!OsBaACB$r%1}UwUv$D)z0o;XdltqixDS!fl;J zeCsj1Bs!no^@i`6F4vF5@NEY1G{g6+%F&EpR(GIa3l=fRZjOR^R-@Dg8-4)rKw|g| znJJQqjd{%kJ@CcHHyVLo4R`0#BX>Di^;zR~*DRi->q4Ghr2ty}h)yl#TU%@sZ*$m;!v$*?vxdF-b3q5tEFw zgZu$ym2?NA62A11AsC13hvC7E{d)y}=v0xZqJCkrg?bVa0&^=v{Hz)R7LCZqhdYHp z>KGi0?48>ZMRp}Hs`C{CiGC3i~RIbe`LMH~vKV3QvJ3Be)=3al+$o>c`o!aPlZ3+vqB{WSNDvjM6rAsZfStlG*3*mH*n*e5aU8lkjxF6YnJp6Hk^7v7 z#9)*$>My;xL~gW>`ypmv{^-UU&IOAvRFNgz)CUq@9U{cYSRz`0@&{4(giV(uCM+6B z#@4gz>UgZg`hJ9RWKIM_mgErY35G;BHt8dRqpTb??$nA?>TFQZWt-J$`NCC|d0gQv>QqOmTFdV4Qgzas_Cj)*O!Ln{HYRdl1 zg`_+F1EYd~f+y1dbMjZ5-?|Q`0F(rJ_w?w(?Db2Xcei&H_1!3?$?)7W&cOLC%LCA& z5mUL;?!kJf3sN*FQCsNF<4JV~&aU|KN9D<$DDBXe3>)z+6qY13V!_Akz?X%O+O2}` z-Ly*($szH)ux&&yQc+j-Yw!zS?iE$2e;5(Rs@K0l?fN|=7}(+aqXty4-=;+zC@cVWDW4Sk@e4*NTWW71L5&QctSHm=B{%88EB; z;L;bs7Ces{x9Jf~5wNDxE9+gz_m3f&+`a<{Rw^i-+V6KP903lP(s9gQr`1HZi^w72 zKBo;wSyRIQ2``wCbP@iSUn?xF4l@i|w%z%m`l=E6uH@vtYvW-5Yy|lD4CKpjG@~zB zP(o`>&}N~OZh{$82(FZCTu@)8rVDo}kQ^WxK@^pUn1P-xQ9}_~Sb%Dm4J;0F>8KG8 z;nFkC;{Y`DjM-#{qW~AHusvJ#+mvTjHcvu`_x$g9_3GGs47x$$z>NjPidrORt{MVS zQ7&PiL*A>xRmHt-N_VT3cXZ<96Ql{@IL;8#>84R-SykfUxNXV2GQid-r}YN7r}mt_ z{lw&9*KR3RO~o_rMR`s0@vW9+))8mp*?&|Dg-vRrdn-kVzcHi0PW zqZ3fzN$p318!Z|tJWBetMX(Z4%Z6Qc2C@T!LNLKqgJoAfFhd{xfRzb}IRZ25B53Me2 zLRl9mVK0ZUR+VZMu>WzOh|3bkY{-8 z6UAd6vycQNNKOZ!vKY=J;^!myqytnHY7T`8iqc?+`1xFF<>`fE&0CHcHApdYG3rE6 zy7RreL%1sZ&&d6c7gUQekb5ZKRe2($1GfvwlmVlAq)}E%&U}nTz68LAG@|H(IeRTs zv`R^O)Nc-lyq?XLJsa}66XZ|s-MhEFS02uewol+}-`U2~yK}EDc1(tA#~Ft^9H)0r z!(hMZuB~gxM*}6t7$aJcWn$%!DgrzLO+JV^f`5u)R0f1_T_NkRf=12p8>-dpO6*)& zjRBYFB^3gM*`QlT(l|^ih)5B+H-US|j+?_0?gy}JO&J^Oe5Gws6OI$AL~lh37sKv= zyrD3jfU!mZ`CSAWs4X53NK55y_SGUb)(C7&-w=XqDH?#6jbLpJyL1IKsi%w-q<=xg z5sc@ZV>lEyJ_6mofV3mp92xCYsleIRm;XXver?XbyYc>~cmJh6d#zC`0ZiJS+?N2@r+5FAzWSY* zOyDq!jjYhW6h)VM{p}=+$PL)SRe^sIy-jcRGW@8hFmK~MgC*%re9L=YEZR6w-$Z=lbA|LhAPH=B?aPI3K@zo2NZH5{^)*sbq}E4fT>f2{2w zv$mu6&}?TiMBDBcgQGS#W)a!g;_$;r0oiCX<-WSlHUg)<$@cID{XbY&Q?<5+a|cs| zV90IbA5|Uh`0Tfg!WGnE&GMg{kT0-159Wbw=Wm{HCY8w7jEN_2$G3d}K*R5@9U4u@ zlJX>Z?AFu|Q8yI9?o@==)1y||*zPO290337azLntb_;IOD&yTJ*Kv)- z#DQGp91EyY_VD2Hi#&t8U2>T&xUbmO0H6GXjN&MOi=eLk%l9%xVUl4g* z_roeZf8%}sx_o2z?Hiw-1V6FvY8HI-CvOsmzTf$=UJDbWLEpklS9ZE4u%Q=)cG9fI zH{|kk=}5k4(d(!UVOl}&#+5hEyUjh_B3r((TyVGr4yr6p>ntOLYs4)OjXG|&6%?+1 zU1np%C$kvb;BOq%U>3>?rl{jz3ajOw;9kzJGa2IY z&8tKB#wX8R*?sTRMT~=)Bl>|WYORC?fGS53e@OD=0o0)gGinLrSaWxBl?mhc zD|BMhkxm*V`sZAo(;gb z8g|(OPRpI6>Al%DZT?4Gs0dHEg*?R{U48p!H{N{v^3{N9Jlx<9KrQ~Q#v?gv8^Bgi z4kokhql)YBzt^L$@$%--vy0jeAOFF}2XJFrkku#8y>sz`x1%+?=V->~o66s~d&L&ZRr~M4RpsvA=_2!RQ^{aG zx~Uw31=&>gA9gD3b>QYwI8rm0?(_CUK5xg@;^q|phlHY-$hi{B5~0?G#g}(MA<*aQ zMfF&;l(TG3^}uFwO)FZ{__7-D`R4IAA2g5G&N_y+B{fiwa3VkRp0tf;d-9d`Jg)A? zpTG6y(td<(NJg|m69^vHAM^&@p<;W7gYjTg!RR$&*O_K9?8ntMv?lQ!P569s_}qi$ z@Zt6%gS2T1>$^W;&-<5~y;;u(tJV&_@LDDJ49F>PEjdkv!YN9X!Q(9pX_pw)Q7KxK zy=;~XSUgUaB2=GzJG)%}cO0fS?*8}o-~T}e>-XYfz-xhuN8_IGM(WHH zVZ}MVgc6!3Ox-XEpf`ZW5EMru^)l=QJW#;py6ENQAR0vdiu*zf%X#5s);$a$PWXp` zHW%lh&D$pBBO5(zz|SE;n{7u4{5=M3l`A*8gamEU-$uzeZlKLS50p^l4(e8j z&0!IB5o&@4OO)XBW4($&d8&JR-HF5?_|3^}=UPx8C90kf>tJEb%+Nomd0=WXCrHqy zV5uGk`aie6@|9b{9!`#6+jt!~txe!S4rPPGEh?OuNm}$soI^`$fQ6!eR4JdVJtS0Ytk))OSHTlq{kKr=T zMQBkdmCDS%3o3=0uXXabPmQ^sM~Xy;N4t+sWl;vHs3F& zXeaHJ6k<|>U26mBgQ0?Tjmk&FrDQK@-GzlG*a7|v2zVD_O;S_ZX=O2)^T#@H`+V*5 z4_{Zjt48ob@;a(ZNAOijH-N4+7wDjLi(l_7mF0iS)AM$@A#k19w15@PdPqRA)T9^- zjVOii$I%SU-)1V0r}uI+Rh2P@(YWCU{bPl^tfn^rm48U_aQQ3T3w+; z<514P7>#G^<#g4lo6?dA z$FXGR4`^24x9V`xlGa&sk7bX(7z>S1aK~)jn;@!3=r)aXA0M4?llt zR4i3;Zi7!q1y|w~%w9gZPjI^bm_v^TApP2?;@CJ+$hkeiQO2>$1Ms{hF>4<}XBGX} zv21nBQ?DPA&i;L>qa41TAwerCIUAt2e;OV>ChSAB*c{De(SZ-3c_PWkwv@b~og_>O zbT!kKQ$ZqQ7D^VDbI!BKO<>lw3^p|Dy*|)RRwk_0%9?Kgn&Zz=TNPlC7d3pGki7cx zpi+0BY}TwXq3IBsSv4YLYh;_bTHabvT)jBi+g>ejWpnZT*|t{`t*@Q!)jL^#V)QPb za3~1l%E=3q{H#M-g!2uqqf6_Fg^N@z?{&$~yC3fzhqKxWCZ3AfW$*B!1c%~h8Z(}g zA7l9p)qe8F6_n34f{raE$ED-%`+f*TD7KfP+f?qzrD_f-?V-k_Vm+{Zr=H>TVt=Ve zKEMP?PPe^TsE*D{d)&jCHR%#6TmUtKaC{)`cZ4V}+ajF(B;?WZKgjRWW4gs=InYj= zX_*;Nr>d(aK3NXY&CwM7vP=gJ&hj4_;-=5+%N@HWQ(}q zfPo0mnm=tJ_gX+wRQ;xe)e}+^(42qP8h`e=%EOs4U#;p-Q6pY~dxmzgl8$O7*yOnL z59z0$ro$ZBcCKG%SR7AVHAiv#~F9V)-XT}uD(ih(}Pmy7>}8tcpuexq5J z^aC?aQY$5(Kl)ux6tZw@#8x0l3O6kMeP) z1V9+1Wu`ynOx*n-Nl9r9u@7tszuAz>9~8nORz9$PO`hE~1+BUl zW0V9(kO3tY1ME7M#usVV>kOtIRLBImxmH1&+>7U~zWqigcov-#?o>BWL;ZCbkg{zg z8xWLr4x3NT8&?*YzF~H%LemeXzc97i-t2VlC%@RMQrTXT7d-D!N)4I@M>d1t|%<@A$Xw`R&-e|64^zJ zATP#9O5}(Q!K{Wk&Z%jgU0ce!{sy|qV{x{SlCbRc@EqnwA4&T-@uR5dR^=e)tyZMH z3cv2zoGp)0mSAuxO_c3#v_PMQ2}uG)u7=1G49Km#4XeBt;{ve(zUlx>)1@RA1x_MR zgtgS!uA;$lx)_IYCOHx;P((6HX}4HLzyA?A%JW-mqzG1m+K2!KJ91HN`n>{*6`R}k zS(p`X2`zMgp;hfQjXq!{3;Xx+x1|%yYoDGsvW0}p>8|@{sgvzZyvE05G!R! zku0Y~g$-yqRALC>l-71ervAmr-l0H!L9h%Kg}Gn0^d1-&@|FSf_{2ko>j<_nx;Hn= z0LE{3lu#=4OvqF_earbR26=^o`c^&xRy4PQio9Impkh+gKoFAovgllR^V(aNHA%iU zb2LZ-fm~+r^q91emPl8ApPo>uQJ6V_la^UU({Bsb^G_UX#n2=wI6pSs=U2!*phgRQ2+=83@|DcN%g;m1NK2jw{9vXc>3HHuMm8WKP< zhCrC2$ullcbjzwLPAgQ2`U%Rs{HjI@X>J_-iozfO~QjtQO>^$eM|8X#^kib$C-D$1Tx4B5qfrG#}>QGp*#A^zNA&3e{q-N$u5h@TQ5E=B!ddyCQqH47+JiW1=wsNBb2p)&* zT571n&eCJYvZON0kgEc?8G7_9AUBe=GdjrG1HXE1#X(?vKAi=-^I zDtJLqHyX<1bpZw$4r^|c6&lK}viYOyYIv+D$EePcD@-y@8$e5B1Yo&W-0~1EC^Pcd zRehypIUCCHm?@>GHAjRF%QL!`QW{-K(`|H~qa>VSe~z)-g@%Uh2ou4U1a>8Yh!zfN zY%chtAu)%eGr&1D!?eCFq~mxBkOf0va@JZZb7 z5;r|^Y(S~i1*(DQ8Nb{^cEggmTHQt$Kpan1qALg|MlsxwSxZYdZuAZX-S7x>C?whf zn*ln+!4xmItZ5f49kPLt%MN_wUBDOs4!B;>ouE#L2j=pwi7-R@>WR2ce8XFh+_B=p ziYJl7WrE=$J`a${p$vD`K(FmL;1VCfOR>z?2Cu9r6f$b!m_XFBhmb>rpVdfUii$FZ zG9&n=g>E2`2=s!!M1{S7OYj9a4YG?t0<(=Kc+7@I^@kC-!O?Bh0C58UL1)Gm_sM|i z`|A#5uzB2!F*rI$mNdzo1yvkqSsM9GF>YE6N)Y47y_{f^lJ!RqVV%rV;8vEwj#bEK zT7^VoJ2)mRJtG3m!4j5JScv3Gb+L|`C9ok;UBok!oMTNsb%_Rw0mo7>oQCc8;ykmp=QD)TEb<`v+99z2lW$9aFEpV6dH9d>@(|?q%uXRBCDv|RSW(36C@=q zQ3)-wiCO3n9r1h1mPY86c9K?hpaeU}j%oL6-{zfv`m(g_8YM&}q9N)YWe&?k%~o*h zfi-)n^Ia|7tb6178zgw+Sdnhi>=}GE(GK_)v^s7ZF zz;n+iIV`$Il{)oE+xkj4>}^Bcbcempmv=1*@0D=aJ7S{N?XFNrJM6VFZo0$1^PXRp z*TOctxF~RYvBO&6w)KQ4I?9%cyZ{gkfgjvq@@NzxT9hX7C?|DRe~=?Hj)ZiPBH>i` zGUb^amxS0u;TaO^+d_4oAU5^b@~6h__~a#+ig_7Yfc-$)AyCASxSu0)Uz~K{LaRs_ zmbF^738s3MKUHV(cDXl|hRn`Kz3tx4OxdgR9egtoRc~*L__JTN$J2lF!4LL=D8fGs zEQVi0B0Th+8MT5;?1wk9+Z$Gi%sZ#CUq4FryC1%urS<4~2Q^ z5IJD8=v3+uU_eCm{; zU&y=7L1||*5YGmsZKe{wLMn;fKl!Ugtydq@uEiU?Y?q;y_EfDBN{0>Om}$T7;n&?T0tk^1|M1KX1BI zkr4-^j#$(JaH*dGLKX!eZ`vQEc`^q5Eik^VhVbCV(w{tZ_pJj0fc6e%i@b#}g2Qn? zMU4>v)Cf0mP5d&1AB*b;pULQKK%7o1Xk&lB}M`r$!6 zB-e?b;ngD6)%aM!DHJ;)(2WzNHWD(fge+rnghb;6b~=ec5S4lwz^NV%l;L)q_6A~z zu7Fb{iH(y>@o*bLDmkhB`0nIKALf%8QOkEv0GKc`eJr!fbTCs80Q7ECFf5UD@_d{B z2EL6^OWKyPtl2ro1iHvCPKZ(tHZ+S6?g)^``7KgMoPfq)5QR#eWhxL#(a?q)Ir^WX zS7aa&rnfh%T$U1(cRRn;JnIuybS}tpo)8Z?DWRT-dto7BgwqOik_`-KrI0edcNM;l zJ$`+XpWHr?`4yz@6361X>_=vqC^Dx&(-{}9Nfb|kz$FBkCjEvt-jz*+4M-@DH2|ET za9kdm0)QZp140d<(-y`i`+PnKBHt=6X-Uu;<9Q0;W5Mt-@kOV`c zt3s`#LR~z(Cd38I=e~mp4r}H|^CnQtwP9fp!+;&{OzPX>zF4TFkHln#g=VRyh7zS7 zoZkxbs0_STq16HIK|3V#=NMC_s{|QHojyiw=c2|;%R;GC6qKl-_nd3BM-Kt_2&N49 zo?9OwMhW_o#i+S+ZVBRe{u#va2qBLDxY-zQ_#?vyEx$u}`;nq@n=|9dK@*6NrBGuK zT^xc$khlp+2T0IaT@BK>#(!C52(9!7pb=7(CcubXd@=W8B{V<`X>Oc9L18PYCFDU|7t^!> zkBBzo5$XJhZkA|J713+p>ij(sur|)X)*AQ%^aOvMp@DbW^JTG??Wm&mm+p!ZqCM@E z`oPI-Ed7;eBiyiYj?cUckD7aEiW?o#&{3C&LLkj@T#`<@wJMr|o;vnS?^3w@k*@_n zSnQb)Z3KaTcq(Mj7ncT-KNJi_!HmeWnD?bRRP_qPhXGz?AzDpHIf;r39`YQ2el$aK{1e!D5;Jyg;|3=ct^x!%4m?(T}6aOu-paKA^jV%^7zg`(yNaftNeU|nU1L2$O+pA?v^Z3R)?>>J>O_3Z+00!YwO2{1VDl;akSq)< zRtG*B1v3(Q$nDR^RyTKltJ~fOGMCT-=kbNd<_}pA1*L?JU|YI(jtf1oLS)HG@S%w$ zvQHb}Pj-yS5@A0sm^dbBwU~qv?>>r06IpVu542ik(|npLDUW<&tr06@xg$&i5gUX` zSZAHkkd=bzCkb15lA$!2Doii|32Hdrb4I2lzlf12u!SXV&Xd*;7)jF0u#gSueaQGz zlV}D%Q8r3T?r0u(qd#b<_}snstSMAB)knHcA@YMR%l&ypltU+N$t()LEN~%0Mnl>s z^#TmP)UrHb5p%7R zn#!VV%*B>O2Wi3gDF7tPr9|3~|>Hf|Yek%Ky15Y^1!^7i%eq!t`s*1e>k zCP`J5D0P#?1x;X*kdWhkILI-ZQGfoTT=S38{!NC29?q@!Rr^;-tx4yx&eHti{PBup z0ZCq~>9N87%{JS=zk608hG%x}6HUeuafi>12RDSyGVz+oGQcEFiO+9 zjdVTL_N=?V4&qTtGLyDFJ0hXS_D47(*5&IXojl2-$bS)$*n@Z&{GkP>AJNlX+7o!| z*%;$xDK@0#0#Eyw`tdd_f+)phx@ynfc_OckPN(y!SHeG=z41t_;bve@vxd(vT=au2 zj5GqXlu4$fj{`A{NFUG}GWgXvDu%rha3CK&!S z6#aAT#KgiM$Y_!e%06)yh?^yx)yY{6GU3wWuATB~A+9g}0vShxU+$6e&R zaZ?wl2-i`qR1e-*U3`3FP2Z{J>WHF>w~e1rGeS1K5!uoRWl3?_Rs=weY6MIAV=VJQ zU5_mq-pu69#cgcKmh1p$?KKsb1fOO_LOR9-CB6MD{f5lTbPb8fo@OT^J|)Be;jx7qhYEuUXBwq@@NK z`q(e?cmUdkG0(VyfYHYs3PpdA0IU}USsDZ9VCngdb$#8}Z9QBPhpN$^=K30Hss;$E6}%Dh5j2WENEHGmq%$R67`+Q# z6|vw#TQsd_*VXY@Q5Bpv18%L55Fm~UhRiub$XAgSbsqQ12+8*|t6V(J_zzNSrSW!e z5NFZ_T8pa0m*Q+2vG%Ar2O3FngrR{`a*}dPSbqDcGgc%IlxQr_3NaoP7PU?~ALIdt ztGI8vG{^>btG)X6R8So}{VsXgKtomjxP?4&n0V0TJQm?}W zWSs{|1vLW`IaKbs@Ini~5zI?0;Rnjt#lL-3t&qD<(E_``7sx_>UmBKI8+W$+vq5ZI zs>pM3UeeSx)vG`Wq`FEJy~IvgG#Ipor@h962IQ3CaKr%S4ClKku>-$Mu~ACll*lHj)#OydGN_#sKMh*iO}PCJEnAscN04=Q0#vZ9S5@`sb@ zz5SZ#Nv}h?I!C6vs=>%BCPUIiD$g~=t(AMY3fJ_8kvg6Nzimrn+&7S56!LdzWjFx~ z1^mz)O7lK?8Nce92g)og#7zp12`V>eXr+~ufw5iD6Y0CFxRsx{bwJbSD~H!0;Zide z1J4@-4w7`l)sQ!isoV8k|4*8 zgs0XEdu}caE@}A1&>>Ju+fVbdzmE*@;u=yDY}L$hNwvlwJ@Q-)4MfJR!hr{sd)-EOT(M2maD*ALTlbnzjLm?nz;I3aH9g z)KjKj(3zEPJE~-@(~#vxS~YBWxFuxVT<$3wldL@MaNPH2j4;Dc3Tw=%tA!}Dq6SZ7 zQ_&=PL%@&vrSl5$7wLIBW$|MzJFo1^?+BnGc_kDkD#|Ae25q-orj2fPGZYSb4AoNw z1%+(AS}Wm@Q*RJVK4cj&GLF#Wk81cgoS;U!af?w!Na_Xxl|+J|1`_ObO!OXt;foOM zJZLE3$#zoRw^LrEBU_?#C{xRNNg=5fD(2U3+_`XtwRy{+N-Y9IYd-GafdUAB#C7$ZnUc9z}yS!C>bof53b-$4PKRMqi2b$TwRcna_LnCwLhHfjqxNL-nl;`xyru0 z5t4gni12I_<^(WTg0;s6*01u=k>x?t5UaVqG0dQiFcd>Ql3IAu+ee=+|H>&Z=t0X(W=xR8~P2Z;v@i2?Z}T)jvKxZGOAZ?*zy$i;x^@ZSEtT=gDZ5-)d$3(o?ksFOhIOS3oiiH2 zW4M9xM%}4NlW?T7nifsCM<2QCt()VO3Fc7=s_Fg0YHhYf@CH$guEqA1bBRd_UHjJW zABOi{opW2C|9hp06w=HEljA&m%_qimblgZ|U52VvF|T8r8;&dO0CkEr+&rpPI~SJU zm{!A|xd}yFc+aI`Xx|#N|Ic#fx|L$bzRSa4J4YvRI3`zL6%yA!IDvF(DQ?sO_wt}A zyr(#*!byS&WVXSiGuyF4K~|8~z2A2_f7+uHZp(gH{3;I2cI_9G+!sn;_q6|kT4N2c z9c6nON-X<^-9$v!K5NUp+rt~io#w2D=4IM`L(IF`93N{7u;_H`KB{j&F6XPR>NvI8 zQ+PTd64Upvx^2|mItnD)aEh@050Tinh2lrVXBJ^dTUE^8h+$57p~{Y;Kj*j9d>@J3 z%7E=B?wJpAQ{wE;Dc}E>LB5|OMMqEP${ZNzyyJlZ?TD-4&gue!Io7=$b-GF3Hpo{W ze-|6XXu5J!Dy7^LiXaB#NrnWMWaB6rj&M=tkbja;y^AERl725ESz=rw4AdW$ zMK2{QFd`H&L_Jf09q0ejo7{HNMY=>TE5Ryjr6Zc37QoKCw<@)22m z@%-n6EKB6S2lAZ}x?H4rG(^A;!21Di%4oEW0vGAI*SRU5qBn~p^_~sje+l1-9?;>fnvxb=E^CZHWI2y{|sL>h2J6uI^Yuu4P;gaZr12%q!*+ zYZtN3DbqMhzZoo%#&;0vj0xr*4zeNoW+WVzQx;zkE@uME?g#}`VO66!Sd!AE9~RI2(RDRE zw7arbmlfj*MGP7@H5W)4j-m=83GUe}Mv@r`7oVm%N^!r_d5ASozY(=Zc@f!C6#UX? z82509XB^8dxw>zg0oPR$RQdYM8-aTuaAYqbE@BS-&`#S{cLTXXm?k!?|Q+$%~HmXsmO1He0ylx^<&y>In)wu`Cs4`K#v`)V@qHMa!-D<`si=}^Z$AV8`uU? z7CRU?s1M1RXR{M<0Q@r;OxL%sZf|Y9r(%4$GI%kwT2`^d*rtV=&SQk*K4{}%hSSlLZ7kCKS^QSBU7oc(o_pdLD?M{&d1IPaDPzJBe?Pw!g3!t=I{RGXHV zx46GXCZl|^_e)!x{{Hy&g&#r$``6mi*MoA<8PXO4GznG9t69ikXbt+{`sLG77?PYL zxs+rCa&eL6jQAU>{L8!lMirmS4+Vwa~+$!${08s^} zsW3%f+u<<#G@sY_1+b?7!TKq+K70u>4mKwKN{BA;{BRqgIU)+frMCh#7?PC=lc`{H z_TwZTxAXWl1+9eWayv%%yBKvNBzCyA6Sp~v$q$%GF(5`8i)^B;Rq$K5Oy!^Zz!!u} z#(r4y=k1bkzzsp;|LIA%Yswlk2;fiNBtT@p^J86gCgxbPV69HqBCX_F)q`A~{AJ0G zXOMqAW%rx$FP_I%Rym2?P|NgZ$+4>u1Jc^UVy~Ysj7eD)x=dSF& z_vzh{tJvAw(tSsMfv^XXyb|x3K=dSLr5hJjSr%CmDUHb*j`q@ZmiKN9CsQ2lPtF~q zQ?-No>8I^fhu^uvfs%K2bu47f5(G==~>oiyU?Evp7_!Ft-9v) z-8q`xGtJh2gjO+^vI$7X0 zo!P@rr@a>3e14-npYC&=Q(=!jZ^=y;H)&pv$bkviFi2r1LsRY(LjmEmDo{2rdR08` ztrZ4XnN1>3{A{jiMQbWwRwF*&T>j>R=JLm9A4S`m8mdP(nSGY^XWg5&0c~%-(w@uJ zefjgZ-dx(3B>o%^#N4mZ>LnzGY=b>-KOB>^RxN`#uA6v#S3(vo};XoVmXQfGun+|9bQVKZM?^e z3V8jl!Yl`Z!lLw2JlKw-gp{#<%D&}cUR}aO7E~V8oLh`I^`GR|cHg<)Ih+D?!wqpM zA5c6*uk)!p}z)qBjQ`LZ z60gyVV&0!QSoSdKjjNoHxnZfxZ=F^|Z&zgxQOQxRq<+M9p|s8?=`g8DS=%yDzF7Xl z3g*xY%f(F6`4V*7wS_&5?*HOG(Dlb{TwxV^7yvxrQEBye4fe2zbF9=^?X0V7JzSsz zqRq=#feXI1wqLFGEx`uoetdnmb5-Wy;|C7@tN;Dw-}s9DpKOKySI5>@Ib9@5-jW{w z{^kj??tQ6|1Vpew`-pjoXi8 z(&!b9`ydpgON)7R;KOQf)J;gjH`|N0u#i)ZM*S4dFTD}2l-)h!yZ)?@+T7QiXzkb z!QqwA6GzU7$GAlL)^#*%uhaI(%?(_`B{2?U0sjI zR^SGMqeSN+%8DGUWe;K(B#9bXaiWlMm6eNr@fS$?ei*#q;U8ucTzss_>XXqnk_E^I zwA|q#S-ttfFQubxd53f_wVC^e`D8*uD1_0DNWj*0!JHuz{ji5hp7)Rc-{v2$JD2VE zs0-=$K5VavBqCgMA@{f@+WDYe`HM-{A!v)Ri+9vqgJeC^#bO@XfxFol{pM9ap7Q2z zg$m>qIm+;K!?c$p+vwyla8ZOOnYwEn-@TF3J3Meb`~E8K--80LT+)+OV=~fmK@(p> zTjpU1zHEHP1Oj6Q$q`$BOlSjt`?3kHli@a#(bFnNzf@U@Z&(s~^M#%e4iMsa=0(t& zr4e!(*ls?&8XAFD`<*m$9ac~b6@@Ol(A7C3{wgj<7ZoQrFhFRrmm}(S8FjenY<4f- zHwUpwU;@xD_d{(`;Z1)uNczdTIVWUI#{Rs<5H(@`Y?srl`G|~j^}d26iIXtaL!n%H z7?OLp#ZvHbPcEZgH7yZQ4-wrOP^}_!D&Qn<^4HNBsN_tZi&s7%P|yOHh+;JM7Cw%7 z$#~$%n5VgNt!{eM$d>y^l3nZ61B}Qljo0*PTFSH7vM{8C=0)aNw^+!I(l*`57F<% z4Lz2i_7JkM#0a~Ctb#C!3|UsRvjCoMW0O)4d<^$Isz>PY#A8UdN=Z%*CB&8MF|?hw z+kcadeeUYpZ*B<#rC`rZoVe-_-?Y0VKhAUzD4*<8$( zlYT^Y#BQ%&R8WDlD1s}rY=NFy(W>Ow=J$Z3*Prd;eKzwm3hz*DkG=A6cC>wRuvgyM zCgy+VUR~^5zjAZ;ogH^U*hz%`pJr~JuDj(NE015o>ztQaXiULgNs6vfj3!>0#b{^6 zBZtyv=7a=l<=F~Nm|dYGoc#e_C)DNc*piF@xBxfz&=2x_=6%`A83Jw^Df&U;DqIf`Zz5j#L*?YQek?q_uAYEtJr)lY zI&c*^>9g(-Z8Cf$5)O+Hf*TYA;w& z#MjuJ(dbg2jGUuwn22$c0sg1(LvN#|-3T&ESsOk2x!yLh?~*~0Fps|5pDOG8ZBlJ3 zchit_Xf#YYj|mp?7V1}DmQEBwzb8jZw&aW#Oa?PT=WlM4TY!!`Pi<}LN$0nCXtpPz z6Ko-qX_8%{X6mQY{g1$y@Ro_@%ja!D>+h=F-#xz-K5MmHax*~=VT#0vnJ5biR&6m4 z^c+li+-k+NT2r92w|om_kD92GX_vTU&xEmC4sO#ysSgfi1<~8N{*Vkh^4FrSVo!z6 zRx4dSzt!reQ&~Z=TSk=ZHOqSC?Ze>p(~u)8Ly_i3F$r@QFbYLBa{Hz>p>TJj#giaiLHUR~G_n$O4o38Z-l?G>Q?_Q&OwzTJ z)VVL^D#po_w@hlz3-}Qzue9`%?T`cjL#F~xFMi#Oby&tUhvFT)reO_B0^+}h#8Ozz zJA?gtly}=aIWP^8ND)DD?o}ZYF2bD=(x{v7nP1gXcmd?lN=1k1&SZ+W#LV=2vc1_% zm5n{A*0r&eRBPWkY%R06X$D|9qxZ8%pgy`*_3=HK>J#kjsY%w;1{RLYat*2t$1zZl z2{iesw5qhsmQfHZ-me+$8M-jvZecm<%wnCZoyk@zeZUmEmCmB^FBEmmhIh?0yY+-v4c!g1I$%~$8@@Bo zs5^n$Gm7@h47sZy;jz^3g+=Ih&5(xtWXjE#Gy1_ZXd`^b|9o{AN1Zig?K**?o%ftb z%Y5=q8^iD>up_`n&V?<%w(hs`y9|GT7lB6`xb>HMCu&~wr4kFe^Gbps(}KJGM|Rq2 z4N5C!t|!F4Sbo(LVuLfu)Q0%hgs#x!X@7=lP;*`_{@TC5*!V##$4TtWmP(kvUwH8& zKB-=#ri0K7nH7bQHZ4^764`QVOXcVcUREfxLvv5MN=q2#xg`S5*+9H!80J_0>0)@0 z3wrv=k995NYS&x~IYYnuj;?{A?d}-8)q1t@?VHmXsI%Q)Es=t|z&LEZLe;##hzXq6NiLD z9g;W|5x=caGD=3LE0pvG@C~X_-Azbfk3_k22FN7Sg=#Yx^zaCc5@69KUQH{JLfp6f zW5mL*PYn17-wX}{JsS#iHVE|h0t8x3_beK*7i}kG#dFYS)C}BdxaUhAkO)v35O@z< z4iqg1c_iWq>3&c^l>Fg#<2U0y0z&035zV9PaI^+KEo0= zc19LR0xY;C^hguXu*$=O8^`d;)1qE=*h&{YMeH%b9}O}d4U!yZ2Z|SDxDb;r$9FU6 zcgv{Cday1 z%V=gCciz4?0ltyx4U)BY2w-JV$glh0h~Hfdj>wfC1^E8se6}hA!b>Z?6~~t%4&-PX zZ+2gSTTSW$v8>H|-Mf^gm(pY#=A?9!Hg(&=tpzSy}u+sh|gKfKuaAv(w(ZvBvt>@OLxm&Y)Pz;!P} zveX}2SFT>{TtS^4d$pQ^pDFr9dhAoY~>*GF4#UhMp25Bea>M!$NK2Pf05x2_S6 zvR9$N-?^4cZeg zyx#mnHEvxtrG0ulkuvp1z|^xmH)26T|go`QRY^!sRPhUhn+q{f7I~q zNw3UD{Q*g+cwdgI6mirtA;wd2dPPY-@9_wEGJJ@vAU1PGUc{d_u(m+$3VZ6e)>YB!!BPa#d9Ts5i^v=K#~yzek&KJeqKAHe^Dt?;zSO}( z`52ThMVGFZ50D`lK{Ob}T#i%JfRLmc3}9ijrg8%yP=G5Y!(O)>3SNi`@`tC2_~mXH zS7R6)qjo`?h)ut}bf(LH;AbJ+i8ZCaUWz2k*WHxpj0O7EIzh;w=CicvCJ|;1YsT6u~ZqthzTT%N1{k_HpAm=a7Gi#yY2v5cdUMHVUneR$(V&8 zO!A*>JW1v%Db2yV^N93GdW3cJzRZ|p)DQYK=XE|Ta^4U{)`#oFTN8k6713JiOFtv# z{d4M*JjCQaP@m*8PVVQBDOnm2O)eItDO)uB`!lb!FuC^j`0Q#WSu}>DPDEEKRv%6r z?$o1E7d@KsxK~zbk`f$shPmzcg2u&XQ!9ChnSG#I$&H8JDW6-kWOZt##bZQ}CeoSIl0+wp)k%^~+?REih>gJz6GFNKi#F%H zgmvg!gGj%!1Pz4>M+8L<2IC5$wF;mQBBFG4QS zs4oyU+HtsSBH7c*3u18ZaseA_dl53%hjpW!gMdX|MaX~GV7j=|(B4Dop0_S~(%h~h za)E@f)#k~K<-gqEfnj2zf?)m(cSUHyN6+{_aE+m3UO zka*pe%_4>82L4T@5*@|2dLwB-NAWhAMo5hNiT|GIZG!zCqr(YQ))gIcOny_Jio2^s zl3pq2FK#+SSIn{o6H(Zym4TiwSstb748`N#9l{9=Lwnm2IEu{kV-i9sBo&++a-rp6 zG*S^9N`Y;=(~^Mb4#LbxC!w{|#_7oQ`sv;O2`=|fzp`FLXTT9er^ekPB{sXCjL>h& z@WG91Qim7lBVyh89>2sOw&D=~{^oj52i$^+&M3UY&mNGdX*^Xihe<-FmyGrV$UGE4 zcD6A%6(IZlHZx=PIt`g3Jxti+}#K5*Dq=0s(ajOAa z>tho${55UVXKMv6`}(`P-5({u6ci6JR)w$@)=-;DhK4 z5E~HIAUAq9f;ty-#`dGCXmxoLnsts<+=S^pSv|hz-D}Kq7a|fsm`<>gPxJ|L>W;YI zk?Miu5S$^T=Lx}8{<(D*iRN1TAG*Yz(q%(;MXxx^;m#{ATwjz7ZBz_PlHI3VzetMK zWmt)POnX%?9u7o6^lzt4g>7ubbJN@S?p+6KvUQaG;Q*V8%Pg}8vj>;BZsmgkHz@Ki zg$}yMHkN!YTnR$)ISz>;g)SswBx?&LVge&0r4Au`$#_6WS)dWLo?TZ*h}OLOUzj@M zV~HI@(I4LCh`Rv!Jh=N3#yLdxlsi6=V_YS9f$*MvyjQb6fnOxwK%;ZS-G23IhN$7- zQm@Z1a0`Z|@P{Ty-TnBZy)F)v{fY&KBbcN#hlhCOW;%uB!_;YLhf!DT_Zp4mLa~9S zZTO$+onDfVUDDQ_pTBp#;~!Q!)pnxy?T$;^+sdeq%Dwh*1L+-+F8O>R!;!w=QV7A?EM? zXZN#b_p?u$Yt_pAEC#`@xD*hij(?C-A4Rb-R%?l`zfN*wh|9JG(-icD-OmJ;+iNGh zIl^tA80GnxxcY9{M}fKzibcjdq~$Vnjr$2#0rRZcLBFPqb+>}%X7zaCzZV5tlw8Qe ztuPs;goWU&RaS+PqgTe3T+8fbf~Wq%}`&Z2fb@P=~^kG%m=988h8d=q|xY zISflkb;+n6NEmh;u1xN+%_SfA@K3pBBNKv zt&h_22>$`VC#wjp(Qp|mC2s<2Ls<{!i6zY0|OZ{v+?%~-8>+V0p zis`oEn*ELNXy$=mQ~?0+>izu*sV2I4*CIc=7D~?L@T9umRR|y;pXtQSSbe>Lc%4YN zpy+}Qp)QR-|7XvA#l!>LnI%>t;GL!7vND2bfLZ3KWXqa10X+TcC_fP?v_vBg4FRNt zfCF3iRO8JpMRUW%qqQgkxOjf*105XSu8LO{0zx~;g--|dbtgWFRu zta}hU3H0|izqODscxsXUoo0t<>uJY0sX`#VaN0$TE@ypWDBxD@u>)Pen z>%M^!mcD;LP$Eskut&Geg|q923Phw@w=}2&0+)K%Iog|j*deVJksO*L!+zZtov0ShGu_}gp9Kfh#bJquy20e*Ad zfy!h;(x>iFH>weiJHlbeff3^oITiW-)6+I%XLr8zf98+XOP$M(O5J^vpmzKfI#)%K z*1>A5bDeq3$@;{sF%p@=iNNs`je0#2*!H-CA<~C4F(ZL1;<)9AAxYvo?hoUFd=>~= z#Umxb!zY|A$XP!@YwVkxjwa5@*qs$MNA7Mx!)_Hdf1adaZFF;yIEtblSA!@cd+{xt zEj`jAwxeOcKt;cHt9bjjBaKgk;EDdrHbd~gtIz@+yfB$LP>)YI+;~+7!OgkFx`@Ef zc$*SN;V^j1-P%l4bz(0W9bJeAm_AVD-f)!L_-<8+pmg^x%J+T#3?}?=N+1L837wy_ z6MK7EJ#94pS+wn!D%v)V1{^sRsA~Zo1p)$)F?>8y{^8{#?VnwP=S%T)bN35U4P3ps z<0e>&woS+}(A)k9YfEYImNf)>$P3g4LnpQ9#qy(Yw}+K89uRIj#6ZCiSmCcpw+@L< zjwxpjkl{UW6RDxaYkIsdF&BV)Hsk7SjMdEnxbv|*Edck)2Uh+zM#zHoMT%524}z)O zs}zt+*l1iz7O*c;TLPd^rCdRBqRq21@uv8OvesG74I;8OEYkr2k2SdSybmgMwm|4` zKCHP~z>*^HoHZ?`83_fTn~@EW)#Z;}C{bvPa? zLBN1m&papAlNc-_CQ0u#NVy}nfPse&^ZeS4_pex(=T$7s^*OE-;x!#l>U;O$R^X;@ zC3A0xJOgF0>Sf4L$BFd*8*G3aS0oVQ&N5IItbPJEkdc+Z5AgRU_YbRXV6^$z&Dn{i z+wD4Kq&*-ev+%oE_)5gAS2UMcjN{wWfxQt|?po@|I#QJ)wTo0I<_SmRqFXyz# z(aMVuNPA2IQoETQ5&h?M^Bc)RJ$}r`HZOA+M8b{21rYt8PQ>n_M*?~1M$iUiQF!4h z5P<{Pw}%kG+HEwq*3>K?H4?#Z( z*0&Gxd}+!0?%`!8A!^c%$5LXj?0#`A+9<(!BQ(_$BJ$iZ_zj%^VhV5ubae>$Fwbv< zK%X1+z0UjgxzViFWRDNLvxC4&c|bs?NV`B7KB}{XO43AiQrQQp%tdq#(pErc`>WHr zYGikdlkMRsi=?3ZH=u`SOeuf1Av@J#|9v|OuCRvT)*7P_4a8l4bX_1k8k}vfd~#g1 zvRCww5U9o_F_@!1Dwq9Yl;zQ&ETY=XapbJ)gd{X%YKE&8_4?x!o^%amwix%@1ezyk ze80GAaeLr!9xWWeG*V?bgmny(VisuDM|vk%1b8eVAHAs^BDrxJC9|GL+ywMWSlO zL_W2$M-roXHml)m7Vl!P*UE04$3-^B+vf|?Tsty--qUO1_|DXt5XeVh;pfRB&zlc! z5V8AEg1~}uG^>Wt@VZ!Gd6}ia*ke4(OGwD6ov~^DtXbqAVtOAKrTJN>_p^p+t{)M0 znN9B>hufjO1RiR7KVO_?N!EB-|Ac6!>}0|+yG2FFHC%)-MEznM^|7=pfa{ z6+rpY(liaqQBsTmj_p0zPcnssas^G`o>fq1Q?jx6^)P>QV}IIFkRBd>+CwM@MJCyX zx;st@xg|(~yZiuvmK>u1=;ZTB2h4s8pbcqV{^|+mcm$=X9IJK952ZT zr|fp0;EOnL`QO?*IM@Rgn;dr!r-zb#6Ro71&$?dY9YMVY6YA=9ZCox;wEet7JMYdO z(IN;Hc2k0>IXw-={rCk()LPE+vOv@F8CF2JKr=mFcYe#^yUMe1gwEcC5M?J7?{jDf zbqi-o$EQ#1xV)Nz>YC0_P|&D1@UX=^x|iQK64u@UgcmquYm0Qw;2Ehzgx592!h)LA zHR(B2D36ng=0K#Ud(#d>V>vtmPS&}?Sm}2ZakDjA7abQ04KJ5)M0lTufN%yHGpFbX z#grnx@5kOR9k2=3IB$&spq2^Lf!w&oLo<*mtSK%`F6D$6d9lI7r=lkWwiVN(JJV_9 z8dcswEN@~EWRrYC>%r=wW0WFP4wb_@Cg_U05RRMLXN1_S8j>G$^P z<4F$T45auk13<|b4P!3h54#G()qVN6&P$lz8+vMj*xNNCvOgnGABq$S)jvOO)$M~0~OY@ zOJPUAKU9(w+YtOfuWjM+aK`kJTWBnwM(tinklf-{P|Uhb5_+=T(U6jhK|D1r4xiC? z5s{zsBbX86RkDhhMjL{VOlX0a=825;B44i+*x(Uy1ciw3@8_mM997JeEQckO``)+}|&nX{`P5x`)LJMuuWLWlJfLiSe zCFIdkJ*=lnsX~wK8K{SQ)=s`VcwhlyeclmE-6qeC+TM|gI9d;JU5K8->OR=}CGE~{ zGtVsZ#r9862()qIU`-065F83_$bv_}^YNBtAD{8@J`W%7C)dMy+POJ@SxT+-J)1o{ zSXW*E3#W(jO2~QogkshEgArOM{hD~vf~0z6(o2gvLsq>{5ESVml{Xh(Kt|@=9qy9vgX>!fMQbGoF5&u((VWT242(|&{CNrd3*0&h)Wnzi z={85?K*~gdh!#n1kMPal7;R@WI?smhZ)UVb&A^?;XnWBa6#?NuT>)JvV!DPUI);5- z9sGrtD12dOg1h_C%Q4|Ju;pvS% z{f1e_AP3CiOvIzm#a={gVNB)<_@qRXj!@GhtyR?>N4QxCEgch&8CWQ*Wo)eTe7H56 zaU3cf4vKzVp~FaYH{HvK5hNBgLI$iHBdUNnPZo6MmJ8Te+e@ytW*CvP$`Bz@dSwls zG&_nuauZ~79ue)s4NJ;@wh`u!uB+j(@(ar0G){|72H8uSSsZE!26_LCT^5Mp7v zoeW5f6yWC@jv_)b5zr%%Z5(a|feDkWJGnozbP;5r1u^LIe|G^F6lcZ9lj;PioT9$H zXG}QYE6I|XEXDtFd4J!Bdo&Sbu4IwCLK&Tdy_qitgG{*(Fxncr+pYu^$f`t8jOUMA4`5pB+e7t6)+TKmLWY~(c2=|5^w1W`>u|KDfo7>%2Er?F zt6UR;LFg%B&n;2Js;W-LCDhoOI8@GAgoq)@f*JPne8d}aFl>hWn--k8h9maP-D3r& zF+#!i@%GK>Br)Eee=T(McZ_<&Rks)2is6#;b{}oyv59)D$%mkAovjQ?Gjkt!ul0wV)=BbCP>Wdy-sCK&{SWDo=if*{TyNMJZY zf&`dMJ`9jdCNm$5Ama@3ngQ}T`K`70KKI-wZ%KTp+iWx_vg(}u-uvwJU;p)AsgDLG z24IDMtaa;qvi98+ziXUAWX_Kkt7~I#zu&E+{kF2jxNRq_E-sD|N8IY=3|7}KjQLP) zP1WkG8fJ63xCMpnkf$gnw=2PyL!Zhx}5ThOzKUiO%pr#lSU9anNhvx&=Bl;HRTsMKx zLl|n1;g+4U{HAUvt}-PDyg*)%!_{(l@3bA~^mFpf&5;RZ2lF|sK-71@{yUO<{B-+I zFd2WiZEU;cZe+{Zb~k2i)DdH=Im8|YW2<#r)A8UgrmT-}*)}{Ro>q!XQlXcK9Hw%wyFGl?5v5YOxQ;{mC;$J z^7C=B(mdm|MLNzeD$$6+8qH8T6xVu&-Jj)E50hY-nUo%U4o=n?=JA1?thbjP!-v7d znw&@s&d;_dKL`H`)F3ZvLPle+;A0mGj?zOoJVEU?48wk0iOl*^vqNs8Y z#aS4|h|}fFU}s9ZZuF~Okb|$n=>lFLkQilGut4hd$?aLhp`SYt?bYcrX4Uy%2uASbii1qtjs$n^<&W z2sRs6VtN%Pbg@00sl(I&-RPmGgjqz3XYTkOv>tz>=@FJ58qz9d+qLcJ=$DlV$hUXVSr#r zFf=q@sTm^ets5v_7w!V24oENhpw8R=4%`9~Z}ts`sUjqiU|3S|@{l}B3-=`dE5o@f z-Pd6n9P*1Q-zBb`wvY+*fICxQU2rR@AGv|=0WWlOtl^aCcZL9C4OfIv``mARm z^0tWh_r1S$Jd%S&0UG4l}Of~8wj9U3dJT_F*D+0-WS7)SaAxAf&qiM}8lFKAa z+#n$r4FRoise`g6V|Q7G9x|2*p25oRqo7^2kd?=XYCa;#sK6gf?>G)}3V{W^D56*W zSyYiHCmAIfNfp)i$?Pp6F|9dSL|_>c(3%2L|LmfBR;z~BN8jr8-TIIO10sB(2^^j~ zJUD98nx0Z!9xK%)8%b2SL+Fmv9sK6PYjkUR8{BnDy%;V-MsO|3_$o0)$(+i?woIVz z!yqX0unMDg9*m}-DfQwf&2(`FfFDMjY-16s_|7szKrsOnF<@NJk255i*>a>9!m^35 z#>0NUDoBDM{+=oGd&<&q6-{$nKIb>XV4lkvUCUvfs}5k1lrmf8{_tSsXqU83D|L0W zif+m3&Fgp8K3Fw|&1w(xX&$rX6}iiFM^{s4%4TJXW_(z7$=?Hmpx48c^@|=U9^)Kc zgg6+PveQM(vSb_U`DJ6FnfsTkE(m<0i;1%eV_c!gARtA{WooetBUnLF$`fHaa9KjAJE96*h6E^y9~7|PTE`RbFYMK8#%5G$8H9>SK;^~|$9Rt< zHiQ?3KJWq3TKo+X2-(jQ4_Rlw^2iIR=J>2a7S_u5`u^}}OR^1_fh+>QMl>3<23M}| z)_kca?^bBj#iWYqAqj3PYrVU$j+gcJZFHELdVI3uu_T0UMJCgz7jkY=5x6XiB*BFo zH+oJJ@6W31k@8vk5PFML()g7zLn35_jK6{zhhCa;K}-uK{PXZxe&NGw9Y+X&>9M1F z(Jhk3Y>LbM$qaZLu^BAhyFytc%}TZsORnEGnByoe$ZiLbBv%8NieeCNT|J$ByoPO2 zZ9S}vZjkV+m^_WPDxQ^StC1*>LLylCLu^D$)jKz?kLeOgDV=Ii9%&iIY(w|O6SP7s zdlSSWHzsU$039#@i3${j>b5njNXB4KVo+2X3dE%;b%h*xMwJQNp#73lFv6mhR@gY0 zz65$HS|O$`zgRyy5Wr{eW3-b-x=fO8%jk50N`WfU-UfM*PGVYel1m^BCMMBNfIJxR z@)q`uX(bk~N@GI<-YVyWt_H%|wx^FK+F6I@po4T|f`m;VM|F zM*~!xK9M;}LHgAW^=jvM=xFD#^TG8GJ5jLW_pYh+{Nc6h9g{wV54DC`O%*|NuHU|O zG<&j zXjBCP0#FM{>s_GfPmCxEAytrdLzFe6x|b7!;XwA+&G`!`3(jT7+lp?pWn1&QB`fDytcB62OVZ6Y6THv&m@d9;G5sRuS(d&TPJGz0~hbhd0gbf==mYWkj7}D$mG> zS}=^tr1`9jsM+Iy6*hwrwV(}dDnB11D(WRQzKo>Hym8V7=yexKlp{5VU{#z{wJ(PF z5}Om{)6d0-I>S7kkrB0E3_l+uYW76VW+^Ucgqz6E!H7agt_TQdA(3v(e)K%TZQxgs zptzSOY2tw(PBWtBHvcm-qRudfXJkYz7(SiDGc%$dziQJ9JAgPsY);x zBy#~r3wB*7;o&6d;rbJjzlM*iLNl#*XW?HB+WVS_GH`7r?g)TD*d9$~Ntsk>pM9Q% zz?K;RRu02lg5p5%3C+rVN0ypZ$gEl)4O^-R@w8?!fu225)}d;O8W^A_dhh%%LC90q7q8B#j*wJTXHE_uxSgt_WeJ*$-sjUTxFrhuXx)lIq1z%= zUg=Pafw(s7QZ!TmbgX-Xf7G8yXqvttl^vj{&iF|$sx8_AJSXXMwnz$n0Os>O95BfG zY+B)xw)S}`@LawpyN^=x3Mm_DrIsu@{983eju1JiK`Jyo$?xTePa##~*i=ADBY&@s znqXgoy~#@>NhM{miPnnauC$>^3X$Mbq=JOV#=lgoO6WJp6K!k)p&6za{WSzPtw{4< zTj?TI|0o8i?vPQA^#kn21dgf)dV*GEWv`$g(KcOg0w>Dzw&e!f9IZ3gd8>eBmmDag zaA;)kWRx$zcjp7i%?FqX+s8=30E(G3Ahbbi8zXgSH)+9$)F#bP*x2u^-C0{RYe}c& z@(nCpPOu#`&;|#RoiXg*e7Af3Hznq~w=&G{buRCH1DENqcCx5*&nXGL`6iWIVj z{pNQx$xz$qv}xxtdtmQqw*W?Fw)3OIP4GKW!|5Lpld0lcEa8xi|2Qs1*wZdv& zeP`|3>ds(eu)51euMbu&M{~Y}JqMZqcz(oap9#QQuKRNVyubK%b0+Glxvol6*IR4! zx}1q`nKQBTHk$IynJ9zyo;edG(*z6jgVC9&i}cOT-MZY|Lnv%RiD`FqtLV}n(M`=x z8C$NJxsK28W5Ny-{9R-^?&WA@q*aWUEl;yL=mW8*{fyZ1%nz%~^D94%kqk&nLQ&$H z)UIBNC?NTGM;OLq#10=311ZFD)#}hVlt|J#0yg*zdx2zwiXv#st%si=1F6-j7#Cc- z3yT;?Pm|WkC1R!A8c4|g>OFtOUmcREWH%>62Snh(hD!JEv{`m9+25>xYYTU@@~nQ* z9f?BHaEF}~sHLlsJlZ2aj^h8Xt0QiR4{?2y3yy@KSI(?xAc6%o`=hP zUedb2hh_mzLT-1Dpq9KJ!iz|XZdl^Jk%$OSXg?D$NlVX%EY~sC0*T=T7@OuieX&1+ zHtF3`mf3Qk>0*hX(Ok?UQk^Fl0V9l$ujM~POzQC1mAVymMu&E><19=Lp;*ozrZ0HD-MWlPm)X#|^%(L2&W5(WI zSkKQ&J-dTKF1usqUDLND!DHxwuA*s!>0S{(l&8o%*CC|CI!+Rj*xJ4=Dr{jZoVvCd z%|{~3Exb2q|JZATJvXA9Bo$s!=x1dKx27O!jDZZhWYHrJUB4F~6=u7p(%$1`EbP(a z2Y42wGBm^b7}6rX=8VQJ>a|A)NCLZ|4iVyrYoFB63CCDe^)e)t?(a!-4M-Pt{U&@O3N5{#VQO3f)zGCaNN#~nWph7<- zi1-GlC~o6L!=0IhumS;naqiD!5@-?BO^ysuJdt9r?}In)bxVZAEA(L$nydy0U;{4m>j5b(iT6aR zoe$(hd?yhitV-NQV9yFhUVhQ?1uc$+&EBd^V;hxvb(nt)S_r4gAaMnuoldZ7U!u{l z^9{mfK)>V8C5l0HN9`#13qW`{utAxEiy>7l&$@mffo%F=fH3K*Q>Ydg z5^PIgR|&_wc}U!zpmI_mPY;RmQ>>y7nl&JTabqOAeYJDhf3x$U!~zPIs;Jv0O5pXL z1~a15X4>0~w#Y^!^K3_2Un1wDa>!&X?4UP|{q@e};LVE{zB9P5kM5BsQAoTXa~qH; zXZKGia$AQ2=UQaW5G^$pl<~1uUjc}{-;q#O1*qj&Lg#jAdkZL2GMPkc8W={RE8W=B zve5Qih?ea+hQ~->Hqq}VcPb4L65xG$Mh!rgjL{ZxfUX_C-nollcFs>>cwzzCG@$_0 zhl716IVMC=sG?#62^tCRB^qlKN`R&N0(K6;nD;k@GCFhNt#p24B$clE-4-KMN+_|7 z1dnd)$*F%uqCB^T2)Y?MpG)xSrVu32oYq7K18VOOe2khl{XZN4cPhwS4oGLJs&T9p zc}RwE__0iv;iyi{vn~q>Zgerx@~jRKZwNL!s}whcGhd#r!WF?BY%=w-R%PQbn)I4> zvn>hY1)A@UUscs>D<;yZvb5;mN?OoFuBE< z0m$*7)Q~Nie)Sp%4|LxM(P<~(bjH1L5UnWZ9O*$wN_6$F`Jhi!jG=aOD zEUAW`O5AoW8hjhLDa^j%6p){3SOD|KuxYsOCVwMz*3nw^nbGQZHE|di1%KVH)^njA z3El3J*mc%^7Y|Hp+@&-EnuSShD%a8oirvwo7>9a~_UIuaXuqZfMF~FNk;rm0C2qVK zSSe=FY2zAiLujE6ZwlZ3@N%U`78-(n4Y;I zkX2+(4s%#=0JaqNB@nuKl4iG$Ne)xVNuc{qN#tfh@LiSw>P{c`6su1@b(A3MUWn$+ zGd56K&kT85!loClILqEX8=2Jnm{Y0tlHpqgumFei4Ky;Q{ zdyU8r*5n4_BWy-`S68L+qPc06Tni#=V1*BKgry_4jm^ihS&eRxxJKy$Y+R;XeoZos z0U_&CE6^t0m~b?`_|(ya^ZQ}NqW{)f6McSXblLqCN$$e^i9LS3xr4FNZn%rr_uVaV zmRD2LD`0m$CO1*u5BwrYBW!s{T1k|K@U(y>=Mrf?@9E zRhji_1bAB@?PGKk&7hcn_Vfw?h|mbgpYjb6Tu5T&Ap2rPr^Cm3nqC1Fou}@YZ+1Sv zJI3<@5L#r-%YIE9Y7cF5A`)Rt1rYyG*g}=?$0ogkq86lwiv_)Exnn$-RSVK9kOkRC zp92ZT1n8(w;_D&-5(gH~1BpRL1#Xc$CLq0nw}N7799q`uczT5&JhD$kr*mpmIhO;L z9)>$*G?w$+DPMM%psrr(9731%Nk)LDtm`L=Ir?Q6?R;^vl#*^7qKHVjt5;>Jgjqmc z<6L=3?^iGoF=Sn3bx|U-5>rJV&D1DIOgZbL>POC8$Pq+t@FQE<`0ER6dcob~Ts7r~AuWMTha=_8xAb39e27oawriYqLS7*9VWMm;0Qi|iSG zkIWV&`8pgVJypcQ8o#ENzR1L3S{uED3Y)V5!|NdLl`%Y!%m)!i#}le^pN3?a=aKXw zE>NklHP0_# zIPU>Rj{x*r+kc4i)UEA5(m($z{qw&TEh^FOkMthZyX&Fy6J7Pg6;xXhlxPufXFt)b zhH~qmMDW1K5p)qX~PRdk8e)IG=+(0>cHzHMC4D$$BT`lR5hC`3Z|PM@xcWp%4zIgqQdn>ZmD0o~Q{F z3Nczp1z}g~%Wjlf{K!$J2iL**+{lxE?rwW--WiPmGt-Q~ZSg<}glF+s22&yJ`x3_A z8Z`x;1>qw_Dbs>B0jMEUEkCm4BZDPLY7Rik;}t&ae_NKRs>Lwz!b6HZgO@8Kv%iyX ztZs>@;p*NI0sUOo;BInH`8#fPyJY7c*OTmOkgj+syBzn@8N#WT8}Yep%&*N}e4Kn| zFma#TIBIxV|74HolN3P@CLV>>s7J<+0@8e!3}Kv}D58g9x^9?4EyM0L5);VYT1Sac z5b*lIaGicQvi-hpAAtuCj-w7KqxET?+qRh~Gl%H_*Q0kcXgMa#xAUv0@ z;!@JY9J*UBUFlpBYO4NR6f0EsEW7kOAGO=*xNy%6qs=YY>2ZHS zzg~FJY|~z(X)2S^Ci7i%U2GL{a$ZVj##$AhS9*+uv`9C9^FPO}_=8Kb=jBn=)*y>1 z2b&PR1!Q)i1**iL0O{lg$CJbrlXR4nBo9YLZU ze#zhE+z@9h2x-%!QMAOUOU4;y-vpD_y5ti<86t~;FMvLx*lChO(`NN*>evG`UGxiHJq_by(fEW&@L7gTz;&@zqfBdICAdH2Z05g9} zcD)*~P()yc*^odR83(geWGG}BntrjGwua3;#oi`z+M@G}m&wehtUPJ?~IIn9-x?&hLHEW;}6T85F8XigS-pn*&kD{KeIzZL&f@M&sY7R^x&W8m5j z@gx$)V`PKG7l2x^ma{7#dEwww7tj9Y@lXN*JGM=-Zp29hyFz<08UPX1VH5BbwJGA;6F5A=wWw** zzsEivc6O2amZwE<*=bsf4|UWMX(5b6*{|YC9^1k)0-D}*j4|Pn!4AG)aW+ak7?EJ+qjyDKQGF!2ve~2NitD{Ko^EOl9g zP7RFHN9r4g@#(ei>9z0a zweRV*PfV+)*FIEU4}^1W49rJ)?E_T3rkB0(3*9Yv+HxiQ{VzR(4~GAVulWBIU|fRC zjU7pZoB&qG7EJtIVB0b*SMe70^_1~Q4e|U2bcB-TrO|- zxlA5HQ@!-j?_BAOO3~-#MOWMd-fdrDzg!f9Pr8Vj9CmjGdx-of7JH$aW@sv8_-0#3 zrg;{$>u?j;n5ZIs_C*AlNm_>X&D5jV@Dq;)D_N37ew)!{O1%#vG2VhqR2@HAZoKopShf(%!VD&+z%&k%X%*i9-RmP< z_~Zia6^k9W9(`%BQ(+olNQmUQ4#dAbg5&QDc8)g&dom9#myOKi4}O4(pzYX|PUyzt zqbr>sjK+M?FWg}38||Xz{-UYlqmO>4)r0dt)~#=XwWp%KmvP**hM_6Q08ZDK2!&HM(pT^v(D0-2UKh=j{(Zxc$LZfvT&m4Un|{U{w}3Mk!k~ zrQDMj-yR-pbv___+Ua;sjI4;0+9OIVBvTMhu7s#ypU}C2B5I+pZ3%w{JNdLZ_Js$&p67K4`@eu{?;R~xgU{* zr|Us{gkKU9L+(rR3Z#AEqeL0mC6*fR&_lReAkgOE-BdYZJmfKT zWT)1<;|IVUITX|%uXS9sO9e;~ii@i#EF!Ol-UN-RBGfivItvfA;4txmI*j}ZA!th$ znJi#oZO@O@^02etp3~C7D-GQ#Ko%m&`o!5I%mgKuJkv#(Mct~%%P`I=2pujoym@nR z>ur);Q~bluuKR+^jO*H;ri?TnVQs$l0EJ0u+k)2f#!L3BX*1HRPa8W{i zxJimnyT#$le8jCnsYnv(R1kUdFc;Ei((m=6ewzEPqR9eg)plkMTR;wXbW;N=L|!h+ zkOqe(8FYg@LZYC6Hd#WXGov2&^CU)it4lg2;^BQJHLYWqqeagnV_+S{9$R3~XtBWKS@7tk;oa1av2xS#K|Ltw=L%7@R!VOQ421=o&fneNTG5xoVeH%y&;^c#JwmUW-)ZO|E)_06CZ-Q(lSW;3h>gZb#zfr1@nV38{lTA zMf^k(H|PRzH3g3h!^I1sN5W){EoJ=PZ!ZIzURZ@Mi&G*He9WWq)!v1gu~-MW({yV^E?aIE@O??7zvf|Xatm$28rUbc5C4=b3_2${ZCP&I zNViDrEOU+XdY3>=6Z>Be;6PzTS2;c5aSEtvO(?_bSQ}-1fMXE4C$a+t-rbFnECIil z2O&YUux(x9oehuzQKVi_}I8oMl2=wh}l9XeL$Q^89yTpn^x+#h^k z&fE9oyzP9)oILFeHnOk?UF9&DDOTk5*&9uQ5bc3`CYt7K;@yoY;@wNuI@~0G zkcDWz6$Ukid_O@IhUFGkUfrvbf=G%y>i3byDT*qD`}sZ4}Y zFeLhOJpzxqaV+;@;%*40;z|#(yHBRXx{S)Qwe06ZgikvCEy9p`bxwN-26AC-M!+-I4f36-6zp@S_68j z9W#1$mVGD~pJESV(u~%;dlbTsugSIeQ_;>kl-!MoTDd;uYzzWbt8N@6AcQ5@6(L+j zHx4m^eRN0x3T&Td6|%5*7xjKfc#}%JyBf>f3nQ|alDi-RBTF(cvL0A`(Dz6+(ThqI zG1F0;EMQ@6FPYlZmT+|ufY?tZfkT1JA9j6CL?@A3XvY!;lAvhKb;0&-{Pl%3{j}Uq zahBb0Tc)ncpjTA|0=3xVk}fPKFs?{QhFXG6Rau;*e&`UYIpr*@`?aQSXQ{Y~BW5cD z5Fzjw9nh!%5=cvG&tniWTpLI*xL~|lg)FS~b*&WwFos%X%Sef1`@aiolPA4CX9da%2|`*f@H1VGUmdS0n;gB#lO?L$b#6(dZ#w+m8sgmSo6&?4Yma&4qn@P7G#OIstdAJ;IeroKlod zTJgM}B2MZ1b(-g>s)lZ+?0XB#K5xx%SA2p7VodHDTH6QU43VQv1?nL!Hb)7EbDXvudwnQpuP2}bz z5>28~PyUSi`HKDdw~mIScaR{@)9of=wUsi)%dUpmN|bu3-;P*yGSQNiIl)dKbuT)b zZVYb{Fd^!PUCC4G8*wg3&`!&{Hz!pYz_vMB69g50ciwiscD!5Xd_z~ z?%U^|c}Cs+Lq1B!kY5Py1}acc25f^$K%RgNL<4Gw2u|ndpvXbL#%dVFQIP7F2lYFk z;FwUr_knvYumPg*iDbeRiZWtyL;lW=mw&?|(8CR+LI60LZ%ZMtAcqlt7m&!ZQY@?j zfGjQEGKyg%oChlK7NCcQ04k^<0TKedR6r$AmPf#hL05=$5#)*?r6B}Pn5d@9){SqI z%7`|VxI=dc4p6vopn*Q+0AP(05y`TiQHijyztV56N$1;yUrbD2=Q7h$3E5s{wp0!c zERuL{@#BuM~B=v6+8U@EYQf3831~w?OEm6XUbO1J}&FUy-P%gN?1+45S&k z@rR8X9b#(0MTY00?q30eT=|{6+UB4ltZL#_qSus^4oG{rbBv&sodD$76t7S$*-j!q zk=2_kP25x`18Aw?L$d$qBOQ>-Jw!uG6JVz;wDATaW`|6t`n@FzP4iYWE`Yd%D%~HLaKDw#9Vkd0 z|B4%E$vd*w`8J_|OsHJD1Zw7`h8810E=UiIB-&7d_$VaD8nDT8K=C@mtxsl5rT#{i zyqQB6_9LZhGMmoeJ|RowblwL>Wa;RFXqH!}8L^3VL>Sxn!jcw^A{!N3RQXHrL;9~F zu<}R^wtS{ONV6G84RJ>;P!@d?c&=!)##;_~gc06l(@Q**D0nt$dFFLNnqx-OERKSe z`>}5QX3QqW(?Z7Pm_wnFpeEKi5&Il)0)oqXL~IS~P54NF;SdDOu!9Mk&?*V?gEu?@ zXIpj@$ec3H?C#S=u_raWMW6B`@)GH?2}a9i&4`id!jWUitQ%x;Rav;wASatqojA_IHTV0gD0{2^K&vGDtWp;?ylVKC_Nl_9kkq?*v$zPd}K3Fa-lCfN$W`!D| z?Aw1!E>}0MPoGiWkvoFS^n2VmuIqQ^R{Po`Q`&s~5G56zZKuf-jRI@r#9eKh@tu_2jAk-mvp9^!Lib zmz0Dc6CT+~Ba&SMh4e{c;#UZ8g0qpq^~VJDHYRBj1VIes*ham3S?te6y|bjQ>q59Y z2o8cjNm7J9;6EvM`e{F|;m%;c&PTn&P|_jA(9$Kv?Q}Y%hjjWIczZc0;Gw|V&7jSL zx6c`_gu_z&pvXYZU=tyg27Z`U{H?}uNFsIkVgVW6ojg+W<}4_s0k@H&Gs?=?tgaF? z{LtB9xq1mXSt3c{RY(@2&`T>17%}u4v9j^k7uNJ>GX{+#!v>{)G{ExL0O&N zuIogEOs!cAo`!e33-e8~G^1dJ_8eUH96lJSSkRkuVEz1}7LMfW6~ZQaKrefe`PW>h z-P~0;&Z8bU8wd^(d!$1m>Y)d;my}`A2W2jrtUa@fSy=N$xtELTkKW5&oe6&WKG-#o zasYIeCM-%15Rq(Cq!?$VdY*H+Oct=Pwy!p}2=0l-KzFtFd!)0>(;m8Z1zVvHik`(N z3gQb%5~$N;q;Z(&yn+_ie%@LIu0Alps9*a~^dnG0JRkzygXAaV>r$k;a*lqZDJL5zDKf!j}+;-e(V~!i-!= zT|f4tzT{J71KXa?Dr8};F42-PkVjIcCC;d#OzLiua<=2ph*@Q5MD|G88W#w7dyQLY zx`>4}ei?*I5`XWgN!$!;6{E%&_p@%@hjv1M4Y+rSC}a|b$W#fl>U*Tn zd`OH8u@OGrsvHLbjAquJ_$N@V%mc(DgPNW9gvhi`g3nLL;CeL{kziu?xTH*xX}LND zqC&aC;TQ&P)7~^-aCZp74xmEh+c;y(P06NoA61zRv`fT0tI!6(w8Hp=;vIC+SAqj+ z@OrM741s1(`b*C}^NeH&7doc_%>c>3zEl_FX)^aOUNZNK7upHkoqt7yBu$1Lci$kj zj5u@ve^rwP6)7+=P&&Iv1QT?NL}D-vhAps`Nn3?YX>Q(;~HpJ*}e>!Qk7dmSp9rQ`Zn0>3%gtVE;0@>Pk6>k zqo~Etgzt@R9{;WCU8fyO9qQUL@9=F^xh9&{v>Raibo;*tu=}p13SW4Ng0e6kR?3oh z*Nkg%&3sLSimqQ1@hN@i4vOo|b~etCTe802*Ue*@!RB*v1_9U4!wk-P5sW~>Wy%;d zAohwrL@n4`gxmD}qyQtqbgC)>f{7sy`V}|7EY49a=b}%p`*uY8V`K)4%798iv+0cn zYzx7;@R`$kv?i)Lk}wKAGC4nmHo)wuXeplr`AnLx9{-T@&zy|L+0TzC$9lE&M0A4O za>rU}&B9a0@=p|FIZY)~0xZEKl^D}90?vVs+4cHa4-+)O4DYvQ|BK65)}VqoSqZWz zMKPp}-G)&d1aq-lggdamu)fKkfI}%r4@f;7)dZ#HIe<#9fPD{$<>d`FI9~Z1KreMgV0WUdEmua-oQm;Z!fIpwb2#5yUX?Z;Mi4{ z`#!0{;kS~#4JvpItuoiR@g6cI{W2l9w*ziw6|%6_^ROjIT-(%@RY6$cwgGU22pL5s zX`><#7}jUq1LcVDJlGXFdUat9au?8~(byHPM?~-w*xd))OiBB|a3c4g!RPfO(zF!h zpbtZbpHt4Px*sXh)~f>MR$xJx36Nmn z8K=Y;bi<4s^?B;ct^0`~ZOtdeCnEi-*IV(ufb3nX1k$c!6MpOS2Wj+(JcN|4X3B^LB~ZRzjL$o!Bxh=U>WYHoDYP?WSx}l~cCRossr7<6>6MuQWB8Nn>7I+a;n~HHNfq z+C_6sMuI^{Dt*9cQEQ~NT8u_H(M|Vc+3La}^4q|5hO%c_$j-5QjKf6C9LT--o~6bO zDLFR%F>G#fUy!z%fO*;n4!E~r5S&IrP38oE0Jb*^0^m?0(-qVLW5yY&Y*qT*beAP9 z{X++xDWx_U`pb#d=;Y)_i@=PLKGPJo3y*FG8GX}qO%5+u6=Po6%8FaP&jdYUto@ z%xJtK#cV0)%R*sQh9^A$qNIWr4HUe1f3QzpkA?!R+ADHiF|e#2!HAox05+RF$r~s@ zjFrx5YMLfwP-HfCI7l`K0N92YYgncLEy!ht(uL*zzT*P1F0$ktaBv9={xCp_Hb zt$SN!+F*sPf*_l;aa0C?d|;a~Iqh=h8Z`+@rRVeK{-{8oWHjq$Qx2PK zR$93kAB$DXHk5S-ZCQIIInw(iYtXfSz$rT#w5i?D?4v_=#Qr8e0`r#0WGLvYld2no z&QB~5bNIsO&p)wTY5h{kD6PPShfT4g(iRe{Aoh}OVOgUVUEdSEH`>X$;?9p5BeK%b zAP{9v`<=^obo6ejH{ea<3sY)2=8+*!`*GSDn7|8LICZP2pegER=QmpT{``Vdzf~^( z7{T8i6AloL7wP;1w!~2bgRnKo6a3-H)M-!o!_de`HX6hpK6JRXuuw22vMi6{s*Is$ z;J2Tf$Lx1+>DkAnWUcu)$X3z4`76WDb$dOOC3weN59Pn^`gPk}zvR33pexc_dN#3` zKa{)D6>%|1x;sg?`Ir#*Ao6_Z1%&-2N!rVLqyjHs2KCA?%JYyY+_;C98d>-X!pfpP zwvwNceXp#D3amt*X@oid_#^HRXxeb~G~y1sF6#!#UBs}$^eS|dQSYB1;@)ai9A6FE zU3iMP8(Cl#p&XJ~kxzvfTV0f|_PUDKmsM z%nR7k-qko>36g|ds%U9~>*O^6UOzfmI6w19AV z4VH*hg)9!h(bOqa%r9zT3mP#|86(^piJ;RIKr0Wc3va-=v(iu*$`SWaNo6z zxix_mRSltY`Fm?OZom7cm1KA|AAVeH55KighyfR7Pk5Vrg-{lrg*T^H!`@X=3d9NC z3Wqm;cS3vy&C@-U6b0>35~qvH73}UF+0L3aBCLu$s$|N=0!9azBfvt-f8$HS?Y!9% zth_vY^XkG5U%YS~GPkjwO~OJ+@(6+hm<9$x)MM`oSl#>A))Y(RngpXu=yR%Yso}ig z6%Q7i!)ctvf&qvGQ80iAy@gK*bWv&-J5DsRm5;V#GOY?n(9jQoqz1Ihnow# z|Na0iOXVVpuBjBi9PTvSrEs{4u3Ae1928>eE5czy;Pv+t>0%jX)CCwFW&)&2!iFVJ zCXv|ue0xxIoV>l_9HxoVGKHQ6*zlH4?F7!8^vh~vf{)Imh;Aw))F1vFJl-NhM8xxnDCzrZBPDVteG5=bPtQ7OMosU7AR!U ze?SIEeGnvt2i>Sx%*C@8SyRz87w_SHGmLq^-1UAr^M19BxowsE!-JJ0gqb#1xC^b` zuZvYhR#wfmc{PKYG|$lga{KB%Vj_`FBrPKmsuQuoC_#uaL$0>l%e)jMoSaORi({QC zVeA9GJ(0cSyz#C#G_?d{5SK*Vg;0Y{+Rt+AdY?2Vs58bXC_HG7BUUx9F0A2|30uS2 zgk`U);}lc04obR&Fe+FY{2t=C3C@K%miZVohGaNZ#KIcC2r7veMi!OpupcHxCD~LY zYF0YTdEg;oT98%CM?sPFGtNF6dwXGDU&J&36yB>zIA``@$)-cBxZe$W1jZAViUCXD zBp788!30VWPj%d`_R9-v`HD%F(5-5T*3&Dzs}8l*JPhHkc^Jh)!KHr%`O!+Rf@6rx zW!dOI&MakNy{|TwCo%0}`ng)uG}VkJ2ser(VhW&;W`%T;*o(T~D@K`JW|Xn8&ad3Z z4l}Wg&QNl-(o;x=8L_ZX9GSt2W4$g3Xh#^?%L~$|WN^N8$<8cgVZG-uFF$57U1eZH zRoWw<6#f=StD<{ITM%I3BTpGod*w)hqgQ9u@JK-tA8u*D{1bf58X&wMZA!^2lca^8 zggEj@XZ7Skk|^f(C*iMwY_VD4uYPbfidT@4h?|)8xADy=Bb3}5ZGfa@tXh2qA>%=T z&=pG1E32PB;%-IYKkGr6cYhgp1Tqltf+83#dWmocjPe@7YE6x}bz3&k%@)~i&4gH9 zzVpHD_iwIA)L&yv8#)ykJ4V)2tFbOPQz#t9Fc9j7{F6ZY>lIDP$K#!AW z#Qv1_o0znV7e27$$19x=NelsKa46A*H?AA9kWQIpK8&a^4Rb>EGX=sCutCKOrD!gb zfDWppC;d=a3Yn}SdTYYA?5jSbydlHU3?w74PvTV`5M4Gi8BiWcYDD+U4_&}1ik3z` z&rs|bAuEU{^J7{ri_xq&v^XHv>4<<@ZXc#X^MV){k@yF&pwR zBzf4#a{jT!I{1!{dNGZ4d;x{wNYavYxl#uHEClA!V;xTcjGrU`1J_qT7$H)FiG&W- z_zB4Y9AW^}KB-ZPs3_Z*<`)^juy?;G$UKzF$7JD>D4a`l$b+izYU~QU*lMhZd){;wWG8>_r_i3R`Y?DTA2b)>X*lEId=dzB7SRd}5#CB+9qtpn40~iIJtv)XA1ByFn zTQ4GVzX!@yR|MV6RxKi^M5OC+b*r9@iM%i|RnoWt@e~>iVRZLb3D?;pHU&W-EXyWW zp)9P9U09m$65D&Ubi_t&Jt4{_NHLg|Wiz(oLKg=<11C13k)$C@g8s-DdoKAajly~z zD;|sUSnOF@=eB`Zn8wm``6R@`l*9m)JllxU(=h2|LnMC>^)5-|B;gG$R{3us>a&T- zk@Y&4Z@stnTUqZ-9Zze86U>GYDtSW~0~cq;M2oB5*xpjfjOwMY@+*-bH!+2~`?6r< zXL1}6%0jTk9b>SMtu=Y07z{q{w* z(Wa?*5lch|i5`vn_AfrQbswUw`x_syI(2p5kj-+d@} zqrD`SZ*vYmrr-mD$+@l-HCMij^x%YF69ArlLEDrf~FX?9` zq3&=o!?sZJkEiAPY@94Ge2v5pS;e!vWEc!3=AdOIwt|PEVuDD>86#rGExKj;hENjbo4#1RSp@eL&o3@!2+9R6y$Fd2q|k8YmpPKB zb5(Vws+~4{AH^5K7{be$HxI)Q9*y8UL-=KLP3!{BkCZ+T`aqN!_d3CCIQ3Xf;+z%t zUgif?9+70$apx!ApXJ$WDEqIdcL9M`VbgLcay~@ALOlmA3iF4YNF?geMU6{8tv$YN zS&bjl`GTj5SXkq};Eqi?qSp50O zmP_UYFC*P!;FDOf4-}(h0{7y=(l6i(6cqz#&dqA9xvG-7o&ceM?Vs}pl2DKqV5rs+ zIc&*vZL1i2dtp6B<@*>2CEqzlHN;g$1_6mjq5}zI2NNJ6UuEcbdw%5CJ_&StL37ra zv!YeR!Wzl!DGD}bz1Ln%ifZ)kV9~+BAo~O9Iz;>(;p#Byqr6!F+~}~`_hyy-NI|xK zSXFq+5aRPw)@oJI#GFI`z0@Z;GdiNV$nm!VM_%3=99oo07}tL&6zi|PXD-VferHJf zqK0s~{YUc4uZ^&`7FBuxKUK4N{$qOsz6JX`$KP^z+lt8jAiGe>ExVP`vw_@tA^;vF zE2Pv21yE}^5=a|?hJ|R<##PpNJB8(KMFpDIZ5p- zp!WYE1FqThu*mby`!_mU?_axv4No38AQ3CMvXdXz2P(i&nedC2ueyWGi!~mk^0Ced z8bY}iRS^8d2r3BFAkiQeGeAEDBE$Q()ygohJ9i{vpzge7o7=f;ge3&6d4KIr=Q}`M zh$tV35(P@mSgWc%WYs4`enxQ-Bs@$qHqEkT`>y>GvE=u}x&OU=+9&Y`1emO5tC%ox z=i7BIVI9J37hN76WB>@+-~0Hg>n!R*(yx_WoyJw^`>J4^LM&7*pVd1@1zlJ}DeLff z_5B;`rbnx`Y$>`vSoJ#BZrr$e_vYd2gz+_0B(tdZd9F149M2-lEQu9OP%{NynBWj z0f^W^j;ZR@B=n=ZKy!3Rb1O<(L*9n0A#3Rfeuzc7Ky-+uLGcIiX&rO;3Z-6zASf-McRmdCsxMK4GGfJ4t zL|D$T!cb652(h7D9S{k4(N5TNT zDNGg1+d?{YPBpxhs|0Fj#!7;S6k9VBFO$UtEpMzoJq3p^K~TU3w@W=X3Mmoi z8wS#x9(p@SuHFf<&1(|?q+SgAVbP6AD}e(t;1(JB7^87U(jEykZ%Asd$>yjm54x&#MO#jGt2{i63tNJ$dd0kYA3HxuHnQ4c6RHB+q_-u8uaP{S0(xe-+Ne z!+F%$(Cd8AL>Xe;xLY1R5Hla%fC-SGToa2%E79jZ*5RBW)xXKG@wYoMfCt zbHSi?+$`Ey%Cb`JKTWoVdwloSZM+1;z8!}up5LuHB9qao`m6RaBc`#=Cs3G(7C(Fz zCw=SLm*kSf2mcO-s(s>3w<~5|rdF%fgZ+4~`*FJ8hEAJtn~Dud5^lm?(C2p8=Te>! z6`dn@)2*t0RYC*odtm{kSfZuX+Y43_ zajS_J^IcIh$9y&4-&$3vvi3@H7K&gziroFid)!`kI`2r_^PW)f(R|#;L)q1 z02WW0ajfcx!RCFJcw3b9AfvXG7EiaoO90QwtCIygQ>#}cL0n^@62M5nLJ>)BNXb5h z$ao_84^SBAs5U`B#!%IGYx@P7F83(k4tV;bQ|VO9-)?Ou`sefqVPubh<5=E~4Lmw| z?mKtifA4fW`X~wGAY}1#5D7>SL@1P`tV7sJN!=qeR#G9=JE2R`e10Zt6U_4D#Y4nJ ziR{^B`F~TJseOFm!@58zO^$~@;io^`Hqhg8M&EMK<4svFct&JGSEei+{jtpRY7i0Z zK}yIlFS!!{vL$5^N0k?)B($um-Z}v^^We#^$XESfumg8puc3io zfa4030)#k?<t6Ko>y5?B{`yKnOhRAcNg~RtF8{!vOqmqEqzxZ8JGBg_LwYCc-9DtP8@lp zimX$=MAxWC)Q?^8^9ov6`d}=LoX+i zD6~y)-dtGzMdM2D4iyV=Ba|ehw*y}7hOq>xCR|#x$QPu(mt^GoEg&7(Y9EmpUj@CqK>nuD-M8;8Ec@I&Kmoz_%nBmbF7DN=(~u;a zG@KN>95kdHB=z~w6Qc;)%7XHR< z_V4L`Hvj(SpD0cL54fG)+Wt@V&%Z7=)i=m}LMRs#o%Mat=!`keLpBBKZ7imuGHEN# zh{~D5a=_1j)pY>nZy&mRrD`)uhyl&ai66qvp8=!AYE;ajYD zIH!fj+~Bh$sOPp#j{5X!jK)E@((_0%>-I{t4aZAT=XDJlg3_Q|D!M|clJtyWSEN(; z`s!^_xQ{{2>QUa~vnFH>U=rwqo9DZ>sLpjRpWrWgfk0aYOoWUEo1N>TD#H!*;sv15 zgMBOfEl3VGXwh3y)Z}negmk45mJg`V2ndYB52_?m;WlNX!wobQt%)ZE8TCjs;>ZP1D|XTb}F=Khy}}~AQ@<*Wy0_4 zeCKdeRfy1A<&utaG&rU>jLpj!qE|YNo(`9J(NmY!h?LP4`3zv z9$@FnFbrT_=8)~A^~fm0z7$cOswQmB;>L8Q0>=_fAj3h-Hx9N+7?|ME6HwJpPe4`6 z3Bl;a`Fu6l?yCDi0jjUwXo86aytH~)4+g2e;f$#zKq`w&ITg&g;FIrPg>Ibqh|jWf z&Hz3w*ZsNRQ`qdOCd{!}%bM>l#6|Ffu~114zsJOei;1y@Do!FPt`+30?$s%NEtqlW z3x@dciTqBG!pRflEC?>==-}YVFh{(qAJqM*WfGqS05}s`vkXS@*)!hJvH1|z>l{VI z$M8u(T}D$$d2NB5Cr5|l_9})ipM>dFEuzCc9L<|Yjd;$0ef~5n-acX>n+o0#NJ2m? zd(C|r2p=Jvxa#7Cha3i53GQoapEs!I7f{H?-k(rR5zWFD8O}>#U(JsLBhOTkVvKUE ziDAOMwMbEaNUI3o6`n>Y>gW@|QY#J&;VHkj5_?Hco|`7aeYQ`4!JL-6xGsk|Js|F@ z8KZf4(o3y7gELj)su%M?K%zVi01*2r5-)vj;u$f-ew8C`iL3&9@ z#N5E;n&)aFM;!JeVk)q=v0KD)MAkI!mSqKDs3O%_?l6$?*B93Gf?fh!gc@)bBAm&V z6=rznqSQmZB}7Qo_t2s*;xOw&i8dW-y}PiEpU^0_X10E=r778!G}~e^kk^#NFO6;J z`-x9pHF8x2F?+0%)Cd}SiJW%XtLr|-nH|=}#Vs7^7n_T;TQv!Meh}1N7YkJIk^-g| zyhwJrhtZb+LHVxU_R9-v`P%4G-fgROx;iCqotN{CCS?J2#u-p2QMKKYn1i&+>oUY` zW|q+Wq87H`oG~k0g<%0q49Bbs3$V>jBp66t>Q9A1_fJT^X9_xFO19@S4WO| z5!5(31yvf@fQnE9@<F!uJsdd^EdSU|3lnBa_lElh0TvC=1atR*QU zA=JjbutcI!XjR74XkJ}d!#RvO3@=wf5X1Zn*vZ z-dtGz3)Ze`Sg|N2L8KOx7DgO%Avkxy3P9Pbiv1j~%1H5f^zOnsa9Cm!cGV(u9YN>` ziS8mpD~RUv55TmT?{~#@9-yuQhH;qp`0ER6`k9es$*goo?K3EfFPTh`!R%H&@dqRL z2H7yf8Hg}YUXeVJgmM#gmjr)`w*D%)pjNl~VPbV%dx`7S{Q^TI8-1EUfKSg*sZI(XPT8Kn)KS#{vt3ZjoD-3N`1emk?Ox2hB%%Mj5l}bWYNx zVL`txF;MZ%_(e^+%LLq%jv`*x7DqnVnSW2Nf@b<>Ng zWaW*)f@h|2zWj~^Y2JiJ1~y~4n?K)hH_L&!cv?vqV)AmQcurRgl1w-e6%xtKXgrfMU!8` zak5Re4(3-B`~y3(4R|ni^zIq3qiKSZt^Iz!fW?$t4dWG-d6?4pGXP1;jmBIc>F3=X zjArWQXfhugWQ2x51c4>wLzClCN&86+244^}*+*BB00;mg?$EGS(hO>7R#j<$3oIcW zF(1VGiz6L0Md9$=%9*t*TMUli{?@16V&l_|mQ_4Weaaxovwd67%-|heURY(dI;*M~ zd>qU#7~EdlOrIhH{q(F}wOY3{Dd!2GKfkHMi6nMbKeKEs^l_^hf^-YT(96t zVArC`$sNWgo5>VXHQh*p_7WV7izrYJ`q~(DYPtK4$m@U+P}5hNAIv99ofqJOXWiAX zf(lV2=wTHpyc~3hzOr`JF2}l9ptD{=D7Z;ZP;;y^Exf+n=?fYIIEG{w}1=PAVj~9+_BDqow5NAxc zU!GOV@=p1)+`dsCi{j8vxv3+7NSe$FCIU8WjOV^6lZbpm<4*Y}cl%DS5=`wUh`qKQ z^X;8Adcs|4uh`YvZI-J^_TB}&IS}*uo@kxckUU^D+H3f4-$MOV0w0BBBN!2X1sN@JRPF%Pgznpm2uvrkIn2s{Y$tqM2quMT z>k}ypNv~*oKA)_!_cPzz!{na|x<|W7+i(4dZtk5e5#B2vL|X9tq~Km;L1F&HV{PAw924xgaG+o z9QRAC9Xjm%HnWRaSo7DLtM&K|zNx-OD?N^hUr4wtiJTICghC=v;QCjAL>CCrwmtyzzRxWgZZ!uXBqKDn2}dMZC1vAZ!N~g1e>CzKJ|G#-1zMYLxYcVOt=!)8{_kE=k!^>sPnBMAJ!fr z#ND(n3_fBIFri7%#)?R|+YzrYBkX&+kzt5R;$mxP@wdj9K+D~nmNS7KqQ}FIdh6r3 zYJarA<58H)kGs2vuw6npa9y8xOfInypmIKIY(Ru2up1&`SDnYBd3DyEwXqYPE4Dsv zj1g4PDhPIjssetXRL2w+Nl&1Vn&=b6GQ+~%-|Tw}%l@*I-MzOp*ipSN*NK1_^8|t= zxeB2GMQ{>evun5nA;0|)eagh8)SD_{VSSI*I=lczk8)5KJw(@&+Jjz!P9O#pv?LgQ z3DK0${MZgeXr{338Y1D?+p~J{Xsifak)X*qY>EiQK^6~V9pG24kU1q`DHcVKi}n}9 ziinZ5LqJe$ggI7(d&2o|E;}m%;-1I=U|R1IB{^nHc!=royi%w>ylb9AMN6KWV^e6v zqeL{eTs#CUI^8<;goHy##bHs|o;|KEW3_{mYP}x(@K`_ws&P2N)r(%h8Xk(Q$7p?rwdI zrs%vxZK5&tP>5FHjH;d*9e?VKj;tVcvM`3D8YfM}7KCWkOHeTI5!D4cEvmMX*i)n9 zafwEa-{Lk)JMr!C(GT)ma|Sic?b>~`#H7KV?L(ecUSh|>e$a=dK=~5`4-Eg zy@S7swtjbKiv-8^rsr0qyxEM~O8tYKF-0xD4c5h(|e$DtAs@lz072D!N4K0st*6*&^ug0dF2 z;T&;#AJ>Pj#y+WWAb0!JhzEn41@0p;qqyFqa9t6fB5qQ}*_$^PmjC6$vHP>Dr$%9} zlo(4o&4C*e*i+<$_z+|n5=;_pT zz>jRdn)+M`v+A2;Q=Od4Nw9^M&#jY}&EM8*WNvr(_w$8hjy^^5@XO^6D!7ud&KR$a z?BdBqkz64_V|{;sG%inG6AgBWr0m?S^WD>v*T){PWuJUqrP}4OL!SCpfzb9~Poqgr z$oc?la&WLNIw!vL9yMI1j4s64u#8zs+^ zZ`^Kj3tk`W?h=pEu{w}9G&K-8q>#1I;Zd9DJ*$;|`Ob|S@4b0?@{%j>=z!AE@M{tc zsRCn-S_(q>41y%Mw9gJ#N9}pRSzIz7q*FIS#OOKRI(c>UuV(IEb-KRmI-E$=s=6(q zLPY4K5}^|&qHYTl7geIulh>N(8~IFqK|f?ByHZTX`eY^HVvi!p$>_FuA_|+NA4cuX zKRtO4DZTpiK>LSuLr{6ty@`C&XPdxuPfAXBJ z8uy=Z-C{W;fA`)wl%D!2K_tYEbXln!6(L**&M1j^M4gPFvLf~%ivGSl`;uAuL_F=w z5ZT4{lIbh@zw*=PbQ_+G*LLz!E1lu#$sfE^4@e8BBIz=K&@S0UMqJ1ghEmZxH`maN zCVAkYighY+dAP|#C?E}vHa5wOR?0KC_jb1SYE85EYsJCpH!oiJwY-B!QvVy5?7B6r z)|D&K4CbFJ&A;=5a${?#ROm~cL*XeOe&f=5K}^}lm%jP_?GN7W+`RSe+rPG&fAjR@ zMbsoW>UG@~zsyQP-5*G=M;uw4M935%?vQz=0vV*0JGb6BJvrZA)datD7<=(ugbhS< z3g#>Eo`i~>ys|Z1Z|jS)-(NA>&H2u{$Q~UrydyQ|ljr4Utlo1Ha(1siJvw=Da35iB zDTH%qsd+s)zmF=n6!W8#R#eN$_?*5#gk8-tXJ3j@2>! zhxM)qSnVKNE!&7CZ$n^s^smaJuii1a0-SCSU3*p6)A&x={)@989&Z0T@{99!`;jY6 zr{p)>waU)1&OvK_mB)@=*Y1kQlK%Qu^$iGPl8qf*xvGj{R5=g=&7&S?M2tdDzhw5D z-tn!Ia~rHY7P%2%{cE&f^No|2Q3l&5+rqjzOD>Go_Nm=rM1>HaiH`+N8rKXy0ARm4 zUw(`s-zRPoWPwA?EG<`>_UDG{51WOk|GlAGyadTh`U0WfZ|tB9zO%Z;r)#(>5%b7U zA?VMK=>5v@9`WD0c`uOtz-~G_2koXF5WqJpe&|$Rc?~=4hSIjeIbO*OX7ft2%FdH|uq~ zcz<-FdK7$F`I&x&$x*qEDlg|-IXI};8hs~MEzt_6KianA|1+(lWqk3RoHG(*%psGa zp)@DYsSY$sxaRQVYLZt$9d{)qAyWfYzNlkj;zi!Hk7Jr_BWya(0#Y3ySxeh5>ToRl z@C4|Uz-NaP^A|?LBT7e__)k7f;fe&slJSsF6PjguX5Kpavitk`mMHWyygGBE*1sZa zY@(AF_R)oxL+K1RiWl|=L;ZlCe)pM^Mm2ohHsiS=N^ev?wx_rM8|liaTaYq=?Zs#} z;_5Ot8no}t!Lho`@UK>!YCD6xS~VYEmXb)V@$p?@MXMb3$qOt-)B2NhNBi=yLACxz z+I(yKf6_k}uT&wx{Lehc`Sic=pC4}jUH#LnvF*RdKYj;EMgDX0?De(ppKkxL{IvrT z-|vx~C(dD6ra4K?VV#m8y5K|+B@A~0c!7k3BYlIqB%xus3b_b5s7AURJ;$ggvXK8P zWm5nDCPkYqHMVAa){Gze*a!1g73&VA7zsT2-znqP_CL@+bq$$T{~!E-e*9lj!yC&? z)#>*C!?WN0sgsx7oS9{|T!;Rl*8h+6&l!v9UwycXX_+=HSWM;c-s$%LDFpiuRcNM8|>KH{E9f>Lh@|4R}Kk1IgIVf@vd^(EINo1^e)kKri`g2v$&O?bt!#m`vI$B z&8-S9W!xc9eQcjI=3_1=$h@pQw=sQga5@o}wlAYgW(}|+nb=!La_gOWCd`~rAp$>e zLgj+8`Nq(k4OUrQ4u@t2QMJf|JgCvR1Mwue1G=^`_AwzLWM4=0C6E;Dtr@)4-rvwW z{hoeQv#UY2l7y&}&f4E!u}kVZM}^9HVw0S1+d0xZ)T{@FXFmy^ebDsXcGEY0>qaqE zt>#&`Zn>qcn%`f&I%SIK)cyW*&-~Og^1lUhIP(S)FTE+B{jP}Ok4;?=f>@`dWQ%jr zK8L+`@>$>I>FJ<2>|Q#b3_j#g6Ae)_mZ=N;S03POpf5zp9zrcs}DuRZsm$$H2q z@G|4I-~|47_tT|MU`{yIXapPZd=9x4goe=>USh+VkNDbm?o3QJcYY5o<-CgqnS^hP z_;;UN2r&v;F~Cjc3pCf-r?V!Td!2^@Ig4)IWJfEA-o;#urw`m0*EaKguocP0@>!?+ z`Nurv%Z%EBDgSh9e{#xeAOrz0j198=H}s2aP6v0L3i^3~vV06=0hEgLiPsf5!ERVX zy-x~s<#GpEoO5rE-9Jt)-Xj@EafIUXv0P}(siIX~FfYiNz zNcI6Jv0jfQVeWDI+QO2b!yF(xk14vBdISnERDmcJMTqC4m_=IIn8dbu=yCU~`J8Cc z_PvE=zt~*9T?M4ms;ZLMZ9M0kk-o@Qq0!%keS{OISK-}rgVTO_VJ!x@vONIDCYv;L zdQ=sV970dCo5m2SaM^oaz>z~dx9fp?T_&)I$#HMg@6Gs-l^&rcWVQmXP3-!J^ciS) zcahA4c!O{y%w$`7^X9C!*C$^W86wsG+1%R4bRDh_j|xeABSz!brhaLn+2nWUNRx7q zy9Iyp?8o&nXn;%6G>UpVdH!C$a|Gb?MxSE};ZPQQhRcGlP>*CSpvb7iFxx0tAQ)o| zpnVqIs4Qc3$%5ZLkYBuk%T;_V_#Y%n0aYx-xI)a7fW*eVJ`v=wp;`sak*v_Ne(o*( zz$*&axy)^Z>zl>q-bBG-^Y5R0-Q5f(ZAVkXJ-MN6-`77s;ZH1~Pj&Ab$%51Ee@6Z_ z3E6M|v+~pV2>tdyFTY<7l(!2m&GR(ru^Y*c3m{rZ5W& zKQE<^fcWj-lYf6s^nLqBQplM>_w9d?*BG>aiT~W%{+IR7e?>|XQ<7jElmNWD0YcrP zYP0F9Z!6H@niu0*E*xNZi-Tv3* z#oxOlt`>yXB^f8IEW1i9j&9#-2wKCHKl-=G{aEfC0qS(#x^rVJXQ;X=u8C0m`0K;2 z=?7FGvY=L-9u@e?-k_-E$7;D;>VKQzBn4E-1F zX1Zgb^fkK$JC|kS;1)T4^K|>aG_UEZU*h>mT-~64XNT3fDR~IrbG^vRs1EX?D0>++ zAN2l(HjM7ye@nw|ZU1-L9Wl%Q8h^uPHg_<9kp`+Z-|3|=^zHwFLQWnhXukcov;%^c z&juD+Mkz@W0to#mlK33F4+Iv}PHCXu3Bxo9W9Z7@)bPgnZj-+oA9D$tIVuS~P)HCJvEb%>1b6}!-&m}fDR5}iurW(zxo@XpiqAaAQu(X%?h6iUUZ%1U z*34D$fnzqZRLs{6qJVg})%zx2xAk>CZ|m}TTW`SUWii9qD`DJXT@rRif-}ts%4J{G zeu|n;(8Jk1L?x)*aDHk+m-ZVrLai2UP_3ZlNIu9q8bB9shbYB4(=xJ-IT^8j~X z`_5k`$ahDQcWY{y%z&MjnKcJHZ$GEk)aCl|57~;hw*Qg-IevDk>*B9G+~u@Po6fSF zJ}dmJX@5!h7K%98a)-)dVE2z1zy`b|a})Cw%aUQ;M99q&DTMzL9t+9LkhDP@etZQ@ zz|V5fEWTzY;4bWfsim{Hm7n$0c@pq58{>iS^W^oMM0)WuUkUlJFNB}5SIEAHaaa(U z4R}$JgcKS(4g``$78#P@ed=j_D#qbwfP+BcXC!i!-++ZbW3pzU%MQcRyT_~t9Q=HS z6XAjI^Y`2?HwU4&1;iZ%>yTJ_Ti3CZ@C>g1AETm5}^R_CNi;cc0)-dLWz6{ z;5GqtKHsZDZc(jyn}j1}=VdD}rpRnM_w4pPo(R2k)|}43p3g8-55%4y@_D?>c%9`u z{!CyrDdwW9p}!JFSrD@Amz@1+Fq&+;OfUgynA?_GoJ%C7sqA?FPeeA#@2qLdqQ zdtxBSDNv=3{zU8;}KIfiu?yFBX8$%3rS*!uj zeIEPlz1P}n{nuLm<#-OYwn6Mt*Z@sEWvUAEZrS*Ja~ielR+K+ z5p>z^9w~y7u{M-0o8yBc49{5{`0#1yY9&^46e&oUixd|8ktY68^+P<;sPM;bkmU?6 zSith1-brhj1T)FrI~$Y<$N)5AOs5nQ*d-a3o(5!w5fcbp0uY%UNCycc2!O^9pOLgX zoeuhPX?dI~S5G^d-Ml~4DSLX8Ia$m?l9XlzEUXjLQ#_IeG>Jin4vrWHU;ojCq7NS@ ze~&erhe!+ZMsl|)$=!x-zhH#a8#c}=c-OhYbX17f>p6G|A;+GQ+>bRawMq@h9BT0S zHTQ#$J$8pCs4rfBReGr2-Ho<7nY66gp+EqDIim4uDh)%o?`8r{gH%&ntQ$CV;%vO1 zW!tKY>Y|ONptg$&moD;Xc}Cj5-%r`tqh9AT2XqXT)LE!v)q{#;MtK?8;-jqb%1a9I z-oR!ZN!M30Ql-)8Hb~emqdt(INs4*)AWQZHY%iWN`7}DV(x#NoP@9|bvoW!!^1W(w zJVL*>K1lu!Rqp*P?RA(cMpO=wmv**?`yH(=ioUKz_t}1)XN+lFTr53P$v{+j+M@%i zB)0f~J}o!W%bg3azH+Vexf{1Hb}rm};fwlj(neW8%s4 zp^d71g@nafF$SgcJ?T@%m7BwTmHGXNPkf?tB_8gL)eOmce@>^3@}6k-9`EVAs2*_P zcD6I_SYfA24Mfth&5lGzE}lPk{@m>6%TD30$+r_sxOMHDU;W0Yvz_fv-f*M(_}l8^ zI~UaVvOuz2+(I^cZ434~`qMl6GJ~6>Zg*r*nc^n4!b^FMgh=PfX zlw#HT7&)6PwE)(#DbT?3(k+sJ8OTJC&Yzol=K4)OVcvtQo48-^YyMKmno28{yiqy; zpFej+O|4{#bzaU6Ix?@w>`+f`S&$%uB3D*w6PRLnBz9Eo2ODy)KiW|1D`+IF1mo=P zP#OStK6zpC%yREt{G^(gSIDE@Jh&w9)jN4o3Zn?oBE1*nc`?cMYC`HOuMRRj5H*Rl zZ{3RErQXnLjD)u_DaD0c$>7ihXe933Kxhe-4flkyI+Ilx@pIWhk?yOUAkaI=92-;b zwnAU1^&~JiQI9gXHCF1?SeiZQYsVYWxHC+WyI=T2Zw!P@FQejar%C69QRPBk0=Ah0=sN64nB~RA*`&TaV z8wlUGFLl<}`)D!QW#bN+^&7)+S%HU;(MWUg zVe6G5Dy3vyoulk1G`IAmFXX!%e{tiy(RV0CVgd^rq}(#1Gi=RD+wwT#VdKt@?7AvfWNM#CNt&(wM z0>AR5uXOr(XFb|JST85Ewl1tjbr5k<=u?ryA6;BLUe6udR__W_Gu`M#k;+bE#<5oE zWx$9~u&O4ezV3}Db<#a)OQ0_;UZpn1XfN5g#K&P!;%eyKT&zNVwZ~}ldeygeKjoi_9FH?1}melYJFow~i@QMm)t3k~!mpYl5eySSdac&#V&<#~2vOjw>f> zp+KX$kGF(5OXTF!$L6b;0P5Hjvv~f=*D(CG6+7I-T#)-FM;5b)CD<=c{OZsWA!Zu2 zH_*9&Yl7LQs=F{Y@J~uF1C7J>@$u|>3>BI3NF!xkkawc1>*?I0;o)XOVsUmY^qI1@Fdn;~#?DC+{pYd2vN z@`A1A)G%H(vosuxMuzIk{8d4TbnyUIMo_v!5jPyx;hY`q0R9S3H z;j{yQ>7-0Hed=?Ed|NTk>V4HB@Ljr87FS2P7s{Z(Lek4oC|ITfNnzF|*4?PMU}DV0 z88e#IY?9&vrNqhsML7@Pl}x92t?K)#6OpY`jI!5R7lDwe+szQvkyaE`;)_p?P&7t@ z=gP&!GV+_9*$cAq)wJLcFo~j_i%FN) zi7SY;#K%!j%|WYm$|X(|78KWV4^#j3J$e6bcE7J5SS-ulHfmw>Kz4rl>E#GT0e-S` zMU7oNz67D>J2-{ackr)a&4u90I9M~3g`B|qea3^lrl=RWwLCfbF_-DXztA)K;M86l zzthtrBFe7C-O$%|H__mmg&x*It}g`q5CN23S-75+0x7Idk-}RVLb}x9j1mV;W?_7p z4?KVFN1F)IRY(^&T$pqu;>z~+a8FDSAP8v|bX^3EM`^D~7Pjt1UEoa@JGaMs=>Z6X zpdX_zt4@ZO*VafrVYlm2b@|I0yVO}TjkTaCpDE*($kycj-Kcy&$QbX3Vz2goeoMY) zwFH8m(R!A*cQy7h`k~#|e}Er;uVtiH?p#qw$&WU^?}htFJN=U=I^N#nD__W&Jxpmf z$MtPl5~k`-9mkSSzLL;K2`@A5Zx(!gDvM3F&=tg+7P#U|7yIkhUQ8O!(rNJ4%r$?l z@!gq>3r_iBT-{8Mt2-Vt1$tcFI=-f+0<)_&t}Z=O6*9}Xh`p8Ll1Ct$U7c<^Z-ScJ zp+crvQnhzRoma%jAJ5$q_3dyCRkHNM{WW*ZvZvO+hK6eVF&n{tDKDJ62kPrD0!-du zEn9X4qbh4nl<^8iWy1;%yMj?yFe+yzXWt4&Rp!hJMqR@}uVB;_jJkqR6+E?qQ8lm%gs_59K|^#}4YRR=Q33W>FzO0M6*kTl zj0$$Rf>FCG7?qd@V7SI@PX?nF<^3Pg<^As*NO?aQ#?8w9AWuCraI!9Z=deupbS0w3 zB8K?Nakp)1+3yT!w zZy_~^b`SOx%4KvaHaSB@D)xUR^#_n>n0`TV3W&M1C^8)cz^ELL3-H1jEpz`{~2vB83B8s88dKyAcXOD~+bnd#jIur- z%0|fiAdPkc>MwPf295mSAES4o0Ra=;7U*#k7%7a8@F-bmcR!()_wZdLGm=HIt{8~l zoKw6f1|J9*X0a~U{*QtT`eb93*_>S zWE&xQ91;Dyq@Zo;CH?w>C0#4D#af#(m5PX=&1_XwdW4?W$QJUZ(+j_;_yu12^uf)?n*1z>??!RnYxXZ-pUaAN zCMyc%rw8Y=CRKShemD%0k!dw zZNULeE-7u!)E{SQGOCcVmcYNKL=_y59b$N*D zbk0-a3ricCZ)wGo>A*`jTbEQ?mefdjAL8Avd*_fMJkl8vqXDQz9iIi(HSe9^FkcByoyg-)HE`oMI}n9d4O zKz)08O2eWJQ#H7Mn z1WzB))^SI)7T#YuTj6apK@H)>D^|T3Ffg%PaTqAH(+Nh(zE8$o61+&9Jl$#i&O)f$ z3~P>1|H8lhV+)14Sf-A27GiJPJtLq&M=8{At7%;>?4|E21dydPTY>P9K@#c*^K5R- zSbqYW`z)my-$|R)F_hRT*atmR=#mYCO$IY5^rQi{w@~Al6uy@P7}E#s%(udi71B4V zqQRKCqMVK8Vmf`$E)>(|L3?65wa#+$(l>tPebf6`@mc-a*$RJ~2|tFEdw^Gq-%#PajTZyTj=}Ioti2x0t8K{uE~s_M}rD zK2H>fPn*})51+{*DZ}#rb^U4CofwwIYILf74ASeekCk*kQnPpFf@^aGxv(VB8DriN z^fk>!`>8g9Duym9FHpg7W_IPz)D2}>rjVuZAHgoG=a2rumKH1afI z<)D=Z1dEW&M7WRLz{48#0Pn+uYfmP;dTuP=v}p=AS9qJVw_JFqkF15l+dQ(AZ}?MZ zE5U6ht0}<~-|)16&y%HJ*lL|Lfu#6_O)366zjeNi6zgR{(R%_>D=B{DX7Fqzndkuk zu6M^WE<2Vq-w14wE$qNW;Lc~KC3!-4f%s~!iw2BqRCQyLmZ2#;q=2s}=4bcVIXWOr zjW{D?ftyo`fYAK;!4Oj&6NX+A9?=p;xpIm_ceejeG-7H5_P z+f)l3Ff*%=^M*m)yPUbAocHBAVEO=u20_p0Man@{pkxXF*52h`J6rK@Gf$QHYiDv@ zRV)?GH+O`xc^?M$DI zj*v#ls;R7V*@9SATB*^jhog6qjyR!30MFK>;`n3@v{-vYUwnUC z?Lo(T1jIr>l>6~^nb@;e7On)WEC);OsYB@dQ8x~9CyH__<1r@{eoM`g8F(;> z){us}@Hgghx$sXJ6pMv_jzRIuXKPTjnXF?pz^p-GhNsj5&lXys&8QY@fq(mBPqfzp z!anY@rb-LEohJ9pHG!j&Pn^)UgC&~ax=t6Yb&{``;K-v3n_jXcUe?`ay`fd8bJSE3 zXZYMgcRcahE4N=O+mF+`A-ByqwM{dl7orhnPUdBKYNolHMbar;D-YK<=%8pjvX$2z_g^EIQSoq=76Xxf z1w#Jx*{X&%Q&Fh~lF#VISOm7o6z)CP96c!er?;_6io~;Xg$ii%_Ju0o#%IE2&RLbD zLM)+)F_5TePBP6N#VI^vL3c0P990IEtP?sUOf5R{d(#*~J(F|-N`gr$rmU$0|D-q1 zIqvD*;ajAe_^^wU9`Cx)82f&l$5HCjZE})rX49WF0{tVsOxVZmR8IQXq9r9=-#rY2 zTmmO2k=SyEOz9?D#}6hFTV7Gl;c|)nR5R&Jj(f!?w+vA{w%tP;k*W;+Hj`Az^6nM@ zq7Wd>hZ9eIyuYi22wE-Kq8P(}`-$&wf4l=889{lxza1v^?4{iUOzpWL!oDOU?W6+R zFz-)#^Bie6Qu+s{Za~6{orH0egAzjhmPe8A6H}OY_Q<%E+Q5TBEM2x7Tbz0$>>5Tw zUp0FA*)hh;38h`nkZn3rp)z|uBkhejTrTZKD`}r&+5ghn9^Y+dYMIENp;`a#LhjoP zY2lgv(vSWA;?&cbQ{6KOKCzn0tbg0g?3oEa&vsij> zQ)fb(8agz#75b@}F zaFk5PwomEEpD!f7&CnK0eDo(?YJ1YF)|-~emQfP_wwvLzmwdc=uV;I{XJGy;GV)I% zz-KA>9?9Oco}$z)u(8_-6H*-F+95~3l=7muwd6;U0%t z4tP(Y1KNylu@3m&$3N0u2T%Y?f*gvvIH_O>T)4D?>Vh?lh_U1 zjDej*5tK6%ctI#xXtRo-yrP`D<%(e11n}QV6QIrXEYkr^6Tq*T0G4w~6X3mt__rC_ zV)6fl@B4IH@%MUEra00|^kJ9)Z9d~$o8hyUd~&F)UKjwRorwu>wvrD%XSkG!(lam) zs6L~r%%NAGV|h-Ngo0IQ6CgK($eL>9pIccs{g)12ecXAVjZyYzK^!o0kYjg z)Vb0DXKVtr`HVA|<}*J?E(Z&(2o1+sx5?*_K28EadwGg?zUe$+s-ue$S%T&njyG z9`(sQa~XF+f$>7B9ew6Nd+$qS{LW0+e$pLth6Bp8`-JkK00>{s3iT%29SVZgP4|fMGXfim~FnYB-wY#=9H{oaUhG{j~D7aT7?~z zwzs?Y;^FWf-P7vm!NY%DVPw=&gC{gPne7_X8fINHF%t3!U9TJAr*us?4Z;w#fl|~3 zgd$o6Sm7OES%K~rdR#j+{V5eNf9jX3fDcs3zBh{oo8TrVX36=WW@uE5jME~ZfU=)F zV<)A>T-LRPqz+S5M&4nOHoSa8x8%POQdbx-6)&3sp3AcMqzJV0m2c13(V9qAWxHzT z-g(VXrFUyfGy0*tVU86Im~KXJ<2sQb>p*E{MvZ1>C%NmTUdk@jpjslCF4XH1VzXQX z!1hUfhg_HFd}2ko@MPY$IuK{3-Bpy4wF7bHigIC=OT)*fbk3X}&1Ek9&!6pvZZkL4 zhK`4{Z{99Dj8?4M(lPXuw)2OI)341yzGd6l>-n4vPMJ*eh|lG6T~R;$giZMlgxz9d!{idNQ4gQoIq&(|pszk*a8LcQ@wK23Gk9=+v>E4{%_u&;iMKMt4lTKJRl`;TqWP=Uq@^xl;Q+@Ib_YkciT z1E06@sISVU&*hYa7$&Y;K=2qMI6jc$$?IlzK)fh7$SY;0LK*0-@*LQS#`JRD9@U<@ z266x03=;UwVH|C)^{I9ktz{4BfZeB$MV}w#w9}4ux8y*lGx$MobRQD2 z*CW3P_tA8_u?3BhRe{HxGVI*JE9VVoIyBO53^b;DuXPpbTu3dWt!}(2l$eMg!(dc2w^U^Hu z(`SNvdbGJ%qZPE=Gg_JRfiDW;FhwA3G1AgU1H#!n4iM<+7K@{o$tc z>E;Qez1>||jH0K<-M#Hjymvs*;~woIhIe-(4BbZK=AOnVTrKq7|4-}))4l7%tsG{cQ3i|Z+>J^9!fFSorwv=irYr% zGCx|g*3Lt=sC|N(F%Ygw3LXub4dG5oYE4a2>K<|>Dbhh`2Xqvt`K144w*VYgpt)HJCDK~Gk44=^$bP!socx*#(Cc5 z#Cv_FwA{-V1mpyft3zHt9V*bAancO}hHuASkU-s)+fnHp*X~{Vjwi6b@h9{~v`FvE zD1_)*kPZvTPvT%e(9a^=M}vygiEOmE`heoTrO%%D(E90T<$X`)=c%&Cn0`LQMuFwQ zeID}-U_V4BB+A+KEPz{&`e!TSI8dXX+&ORj$9VUM?W|va;qaO4fq2l-X3fXX9t9u& zb}3<}^6@o*(ydV1QQgfa_sB>|Rqtk$qp%@il%l1L-L>GUq)LTAb42{??e69q0HSWs zrz%epgeQu%Zcjj73}u>U16mbZ?E95!=;90GA*;Ths`FSkQjRr7Hjv18*u_rBx+D5l zf>aXY>5dLYbSu;j{%hZO{ISQbN+(RBg8DJ|@ai#5_j{Q;e*wGtB2IfJ9VUBQj70U$ zR4_=iNuSO!Xu(Li|Os<VQmEatWVi05FfIbx?(T!*?d~u-{vpikJ7)dnzQTMyaC8)XG2)M)%waz z*QPSn+e5uE-qYLvg$LtZAmg<=^avg0+3wma!zdN-Dal6c6h^Z>98Z?3c!E5a+qOp< zL2MvYD^XpEs#cUMQGEnOwSZXPr6JZQRuC(yYz48tl@MzkP|X{FYH`Zx@QfHCoXvBs zB#vleGuqIpStui7Dui5Ad-aBqg2%oTalNWd%j>0S`MJWhyfBIVm@ai$cZOn(WEVRZ zZYwkOa_1)I(QRd?5@@R=(xVy|=9V^uk4^^NwsCGN z=(f$ARLB$1ZPvecH`v^GP={{YymAVyCwP+kC>A%~}(m6JY2!RrKRz5<~z5N>Igw)AbLpdm1HLL1tzA2h1%+q|+6 zn6kBVoA=HN%uAp7o_8!PvoBVpGg%Qx7d)wxei$OtX8cR$?QBFwHITAMaiIVYbWAAn zrLWy-L?)vLRvMFdYeQva!gu9BQNZ6)pEk2B*@f@U z&kYLT+>{M_yvWc!$)iP(?+C5+{M`U(C^fg{w4Ev_9A0((DZ!QQgmD=KV{(LjxCrVQ_F-K zlFpKT8l*Ih%B<8e!ixMk&J2qGL$VzC9bqV%?M3j)&|i{3GrdGYuWSjs{FJe!8pbAF zQn+O1icI5!P9`!ajfW^QZKj~H^!L*Beb2eKeoC|K@gftw&3osF%>VLxf3KCus1<>b z*R~(hDbr^BOXls&MaGiap&reJ0%>J(a*@e|Vj-os8m1OUhYgFG8`}={8djJa(egyQ zHjt`7t>zKON{|~TggHIRLdu?E)f_N~XrU;UUM@1&kuG&kwBV{6X0=nM`9UWV8R;MM z5JjfV6f~CJ+xNyJYS2$9GG&M4Ht(GyGI#!_*Ggp6iuiQKnzT$j<5Q;1_?OJvnTZU& zs;xUzFuLYt$LYC_6`1pi7Xg<)od5<~SJo33@uQ)d1LolIo#rXHfm zw3&j&(&y`YZ`^x*=iVtrrff&t=Dl-7<~RQO``)q0{jd2ldPOMJgi_++_%dzAzhvId zUSw4LIr&q8xZfu~Wpa{yJXf-3*v2-=kHA`V)yrb~dg^|IT4X3@Ne#ob5ft%d+%P85 z#bnVmyZL=~&_E=vAf0OEh5Ia(uIMfZZiO4iQ=wu>;fImc$X)^_lrMIJ<2PFJ# zpHgJ1{=99b{tpz4BptjpUiQ*I?|-P3$gm=iPDzXRhlH4Yi}Us{M242Twm}CCl*GwJ z#?QSp!!x0V)`|1fz@?|r1-vpLe0-iYp}37_CY5T8P@zEicFg+Xo}1**%*w|5XU z0ulJhq#KMMT5#XRc{dJYT0O$#(&Z9(AT!EVk()FZ3XkJY8Tc`65Hn$Im@hKT4?3C1 z;LSZmk!dppjirBM*WPsF2m7ZKnX*x9oA=HUncw>Hqc*+_3?-t(sI!pfT@M3fZZrNR z^EM+ghvy*7ikG>>K zaK$M@VejYA8RePL#i5V7E~URAB_|+TY{cK;)TjFMo!K_UpZ|h?sDe*;VVc9T>C9jv zIpygg1Sica%7IUdLNmqwIWpGPRRCta48pIgs`_hPNK$K=1*yu$N$e}Xcy86W#P`iT92jWvE$tYvA8fujJy|#*t-q$%uz`pPpKFiWDBdchs<;RUk`v!QN>MeEHsa zzwDh?^IQs;*RKxAmOafzId|Mf`BP=~r(}!Ht8Y5lMrkvZjg3Oev3y}7A2@ekywx=s z&z8G(RKg#j6GnEDB;6GAm7)odc6>crq*`H^_yF%=TIPh;Z=P3qP*pZO9NvQJ`HxQJ z#3Dw7=dWdwPOLK4$%wkXy*<3I6r#%Uy^|#y+r!P_-GifnB1rg%)c2E={OP1WJ{ab@ zqF%C;Pfw2UQn~j}RXEY#l1$}jdt9%V$T)pckM0~9?EaJq*{BlWl`e={MzTtf*wTyO z?Orb-MSl>;z;Y#poRd?MI$%h?$Xg(*#FwrsWEla-7xfZX)R{0_FEQBLJdkP$YN=|K z6Gg=Y8R=1S&@7txnRk506iq}O{ekoI0T)$GZ0&81`&0rz{Gh5OsuBq)fsi5#>K`sC zG1{OwLDJewr8X&v;Meua393N&cYhlWhx<}5Au0T2dBTsh03?b8>B!Ae`Z;vr z8^dL!e`7bcz#N=N7~2!arCnR;GB$t)2w1>Bzz1QLGJBHNIo+3G{)nfY#ly4PHYGeK z7|R(xw&ZDTXA=KDFMs*5jEd8=(+R>2x^i&d<=)o}`7 z7)uQ>7L;uMkf%3q6D8|R=~ac0b><;tZB}=Z46Gx3|B8Jz7a=>gMQ)py)wWWLIi1={ zrAt6zToiN^p7_}}1o-bVmm;cSG(oOESd>Z}Zbn5XhCJn1P1 zLy**wgj|6=0R-}O8N-J+hFg8H4ZF!Ew3!hsi``uc>k6)i!8;#&Ox)^4yo}%c>NiH6 z&lZos%DkUJw0Kt|VxNc9QoQrxN5Y%{=Rx^CDhd_Rfz${J6#yIp&6feP?x-qA!3JRgVFF0QG~$V>;jb z>d$~x+-3ZmQryp*<(cvZ^_TKt6X>IuBPK$Y174sJdK&8Ys%dBTfElEzAwCLIqLF{unfMesnF|T?UwAF4VwhS zz#?OU*ds{QOw?Ovd%w2Q^eavO7HayED^{?h)!xHuYZ!wo3-@7KxFz4})!Sdte5;3@ zjI7DT@w_a_;9E75!1ePK%FfWBH71q!C8FSmj-41TVR|FA$rdxuh(ZN{MS27|3CVs!H385*o!*M`P1@Cl7KdHijEKA$flyWmb@Tr16uP z9GKFpKBS{o4mJc22E~LlrHzF!x}Kgqm6_QP9zA&138hx4%sH8JMe%vd#p~h%n-4l9 zxR9o3k(I#x<+ByIHgj{VzzMl%)GdG=D4b6zfF*H8n=#b|uwa^bzLn&uMP3 z@9i_AO-U>>5(od2vhCZn3VQpXv6h!}gh7N3=L}eT%o!OICZa7YiQ2%S8JV%CMPplo zut2ORYg_1VC~x&V$swytd;n9s6u>&cWyk8l#NtVLoC0Cr-{0=S9XlST2XGokw-rmde;pV-LYGiQ$pZaLL3)0%TG9C|ix3dEU z%8|zlv93I%2I1=AX|z!RxWWZXR#ya1X&+1yxDPN=v$kpgzEgaef-d>pR&*fvqHyU> zqaknNPdIQ#{aCX2 zhMSwieF5)5mCK;uCFpV)n_%eD84R}qYTSsSG4_H}nHQ0wm(doDguTvn1$*;Nf|hR& zCl4x+_X!-nWNZrdC&Q1A)wzER;Eil|Sb*c1@C{dhHScVu{H-KxC1EQGqeEI5CY_c3 zlS|kNO4llVm9M!s_;0W`51$L*Ab3=v^!H!i?p!Sn>T8AdRR_`M{Qlv?=Y=(it>{Cg zV24tLyukT=ZFPpN&al-PcE)E|BS^54u$6?ZBoDE6#`C`cS- zwwuF8oclQy$~w8y4WiT~sNBtILkChD+TF+tr1;r_g);X|a)jH5LKZ8Am(37voB)Wg0AU}+DQv>6Qqx>dohYk2H1w}GoC7^6P$8Y)on~%Cn|_Ux z_~9fa)k$qSo05o1h>++76sz>8rW&5>BxH8a*6;eVWimA@#?yNwj%gC1-7>cZrR; zNE6QuF5QxqkU7XYwORcP{pq4T0pJ@CP!*oVyVY1_vWev~5}8rz z)?N9_K8fPQKcr<|)bY9GptB1CFZg?!ZSpUyQG`Q&ZhTldLzM%2p-eerthEj9Hnt+#xb0+gF|EM0w@FF3PFYdTcZ zUigX955*mp&y{>0>UAAS#9a`9X_J0vTF{+>Z%H0w>N;^0kcgNCZX84;{gSw=C56IZ zHnx^x4B0Bb!Jz%qY!>3YubdW`X65^LP1M(1S6)fd zH;%)&PPQr9OiCq5rIR(9?{jOcq0Im$RrycsOANEkDC%<6#JV0#gA|k2b}H3ZuY z%n+XG66<=Dr?M$+-_h^|f*SjgV)l06PLXyJk#KI>iAR2@o9DEpe2d@<%fD>cJzCCC zslEWdfXmM8xls1o3`)Tl?-EaZ)Xn?g14VM-`ybcIg~&6#%U_h=)Exa2Kp3j@IPFVU z`7u7!2of=YAfoMq0@b)Mx=22mII9}k_bs?mK3R|rR<_{W9AeQLM@*SYTPOTHnU z+65B8NfsYHtvDRZru0!KG)<|4A(=4h$c)_H8ID!)vKW>Mz|q-ll5i(^kyMLscctli zGX<`vZpL|6(^)3QX-tAC<;P^kNkZRtC+2M=UJ7_YhFYrd1ja5|Y$PCN`1`o>1(XxT zBlUZxXU=Vs!N(l}8Zf~_Mg&r@t?J69s9g`2^7-9iJfs>P90LSkg^K{Q9D|FjL}bj? z+8yrQ72IhhA}Y6e2Sg1S{=*9$uHcpx-17E;Ti#W(Z<>Hh<2P>^JmjJcO4@izuk%T6L>+R`S9pYt@m!`o$iv1|pA2+qV|iEjL7UI6Ttz^a z*IysH$$hWUz^TnEr$CoB@2xwBCjniUT1!})RA1J1pi7%CII~G>x`Af_x{&o@^?c8! ze{%~NY4q8s*L<3}o7#pSWgsZ@2EA4#d%AD6nSGH+m4V((i;qk|9LS64{k)eO(x;k!LpHt8?YwHyyT{;Mk4 zhmKH`K!&tR3xyw%PSF6JLu$nl1sKP?`tQK~@YUo@3H0_#roCo2r-*&OVjhqS)g`*{4k=FE zKInB`ftL=hyrC2(#zUYg{a<;?oKNQ~L=rkYw^-Fm7~&ySy=qN+>$*IZ7fD9ONRoQw z`vHDn$D^{6wjzRlEq}?SGVey?M6e&0_lQ#p4nzl|OP$SOQXp2c0mlbBnOvo&Q@&MF zMC#wMO9qK}wB@X72v2}5LGdQ{^*UEb9xAqjO0r?KcPReF7uHi;OLyUY3!9_pz6|oA zlA%NmGjg=E2iVrVqGp3~WF$S==v)ACxL7olQ2PK}Oc7|7FD!M@OtuXZssYDn?w6KR zLC=Vxtim{>_*n)-5%Ya|cgS@0x6?kW1F59!Gu>mN*l?pN8wvKweGtW=!aj@jRLCc- zfhfz}5s{v(Q3(eMuvgafmW8sYsZ3>mO*Vy0J`id_49ccw)AVE$tzRjK8p%cia?M7U z)!yoMUWk~q$xGO2Wfl~BU6RHmV`-LjvLe5n_sP7m3sjg*HkHgxt>%{p=9^3(jX4ws zxubQVZso%-DcwessV_^5b!EehhnLih$(&aM9!mn5dg12)L1lBxq_BUbl$Z}Fv$mub z8S&g6Z}3BKm_Dl@h;p1I(H<|8r|PYuTfwT@DRuGm5gM7GG!lQq{g`8ti-H;}TfE7{t6WoZ_7~qS1)G%36&X>FqJO7g^ zR9DicXa*Lw6xVDk+m#eRt`LTVF+ehs&N|DN5dcx({b)~7>oy*zr9>8^cp^jG;U@Y- z@%Wt7LJm@O5(qEXF59eGu)aEgXG~F6dvyRSrMEhOl|i*SfRoPZ0A3xyx(s06p}#tS zPjUbk0k3xq{ye_>%jf1(LpyF5X1SBo;US{qrUTv)1&Pzm$s5W7$4PvlQuyIJDm}4*AjG zzmU)TKB^(WIP9+F0TWrSY4m)MCI8vC%rSDuK0n(K0@2L@9IDEJE{?_-0yZ1&%hwqticj?`l z>COGI`gVO$Dw@RlE_|tGh;I3%ZDMw(3`aD;G+#9~_kAG37U77QkX>$&=}9G7LYr^H zC2;3kISqNu)VBiP$S1jcLL^r164~NUA{$w${HlS-2j%qUxRosCX-gqmG-`KzRdOdNv%`2y3cx~QW zk24fhk{|!vl;BM=JB!KgOyE}XrYU4@n>pR)6V7bbnh}L)aFv|bFKZ6?e<&L1*(fQn zkup`;GT4)b6?fe@C&EnM;BIKxDfn`nCte&TUIK!z4!ru!O(pdbuerG=LaN^KWZb_; z)9@l08azI??a=JfL`+JWQ;V{JFzs4CmCmt4I;KgmS-qjWap}{az@eTzJPBQ%KrgW% zkU&5hI}AVLT``JU;ciz8ypC z90aKqmgYcp>(V!zt8kz4B@#Qac}>@{V*2>GK0S<*#OT^|C-O6&NT*4VUwuR4?xpW} z*AA%xph$gq7t0sfX%4{x4JY%^Lm^o`-&cU_o<>BR2x`*K05TbI7!UD{SuoQCCFBA-oa6T|YX7`d>*yc-d!?o#FN z2T>f+c&yyI&D-a_DQiUuONqmM)WFTbzWVP2b>N>>mvmLHDv7Y;EZUlhAM$D)GUUi~ z=;KTxOG*KelUVe$cUeA(=9_kI1VO^&hC+b;rEe)@NZ5f8cApmCC1l-As9|n2O=ll5 z?^ybIo+ICxv=2*tr%NqI?8LceCsKR#wu~cUU0Yq#yhC-EMWE2_85F_?wKyVa@R%iL zpqi!|QXu2mqJ|0$@bN|S*NqRlk)WmrMKtlfG&)n|*^{2)MQp4J5rO0Ohm>gNotxO> zs!f-9N$R2v2^L-Hjg!T0Q#(qwq>7R6XEB8Z5)hK;ZTWr` zY1qU((%bLV+m~r0*}+eh?0=#_vN2V_ov4PyJoJVVdH@Mr5Y?8r_~wWJ`}PPf0)3P0 z43d5)EOre$N`PY z?cN>JlOBu?xP|T77PjjNAcuB4`c#mE1{kKimjy@RcU#+^I8r zwz*+B#-Q2s#o!bm4ogLOG3RgTAo%Sl&&Iq{mv%;G3Lia+C@~By=hUSLnzY1j8e5i6 z+L7-ixcC1v&pEtN?rNFf`nKNN*&IgcXzeaF89Qs7g6u5zCaF~hJBsd~zF`E85+JmR z=@ry}2h0ve}=x)%*}^DjOL5NtQu5an_7+B1(o_SnDwe1Eha?+))}+v^;= z+hYk;KYzLN{53+UGAtC&t1mx)sq=ghr0t8t2JoK~(8fFzTQH&EJWX+U;yhS8-tZ8JK;FC= zjmGPvy+qOijvwc!|Au_&-t(^Ed5+vanF@aVB5IYao9A=39*S#S*&Y1c;Ah!5x~uN| zxJg41C#3d0?AcydJ?P`|B>I?+_tY4!=;=;7#kg{~e-7l5z1_`q3c@fbgqUW1JmiTt zNnheu@Ym~kqiG4=IIMVKmihE&cj#Jy!)a!zj|-i;aYAR<+)AofuJ_Yokh-0y8m9bO z&CS*@RjD@Wr?>aEFLgw?vP4WTuTz+YVdsZ$+>u+#w61kYK;nzGcDS!vd~Hj@cNX?= z;3-^`d$zb#a+A~>#@U1MTCp~ISMbs5HxFU)6F!)UYz$HFPlX4=eMZ`x43Tm@wn?$B zTrQLTCywSayNM*$t!BRm^cLEHJu^A}y7&3v4?~I1ym3CtX)65p+qe+0G$; z2$UH!nhj{am3maCDm}ZW&d@WW-LxWWBZ>={=4NLJjYxWRg;363QO@HuLfOoamRzy< z%KtN^^6y-LHSZ#DwJrf~=fV9x`uOF?27kaGHwXVp{kQ2wt8C%_e38N~PRO-3FPmt+ zcFHa-)NV_ycQp9da8Zjjsf?$XPQ*?|oXKF=_U93wVuAwej-$=bb3-!a`q zUGLS0)rP$|Op7pk`B`>gn`xBOEy{qx!7(h#Z>Z3r=q5J^0z%_0=x_Zro;+aQw`FbG z^qeS@`y-3o)*_Glp*Br7ESqQ?Io@^v52h2wa)h(|z8(0Pm$*>3vj5%^3P6j_PG-+` zEZ?kC0M157eBYadZ9k#?i*A|wb&A5=i(JcljL=|*% zXwWcaONA+`JWGBi9v2VWP!HqwBDt3g%95o|K@H@-l0q#_%B#1L*Qs1Y^3gbi^egL~ zc1WC#Hutm#I7wfY_A`KYyi%v^b@y;dmA_bfN@GxxMaWC>_ax=6_DPcccmCXGn3In7 z32}l+O3hS;{Pq~bKHnW~snb$!lb1-!y^y!5Gn9Nwl%nKF=TcCw5-<5a{-%6?u4K%TQz)8TC2E&R+bVUCFnh7CbjQ1S46*#pwhNw0Ug&1x%sxuY$PN!$BL;;Rgej!xtet5v9Pj>%TU&Y#(gdd1~c zY)CR^#d;y75o|+Ney!RXQw)n!Z<&I>R${~suM6W!j8fl|=dzRyOXVvK*Dn;U8X3ugxmF73&^XpFc zxX}L;CkzN-CP~OnBxLUxPHe@tkSG#br%cg+NiojNgj@mb(By#?g(-}1R;oh&aZZHU zBlW`1JrWvhLi5pylZ0TmJ0?lUb?td|{hv5y;Xb2G;@{KX+>T_ijh9e)%5A2jkt?+R z#=ZOD>+4xPSE$V^r*ehbymvNNXfes+Y^o4RW5RE#;DuvJ7TbKmnN3;~M-cFPd8-3> z?Z}{m!hrvYTVE57)3rJXLD5Y&kGr;)5qr<+{1JyKu|9%&Nt)67)h7|)ci45LO};bR zCN=V32=?(&B02Q}d`4yVLf#7~mW=1P95=VD_jem1%oT4uM+DYotKYVR?{f;ihRskfTJ(o0+0?hcx z^1PD6_gtVb{bENd(;Z)$@#-`a%T2r}_ft}-P_7Q8* zT!qtBrW2wWQRkS|>(gPYaNK}AH0tAlko-I%$pv^UL$ha25X8Pg;QDQuSK_N6DzvKM zW$+h=77R2=u4BKJ&Qx}!J{@*q;-nx(hJ+p!WcF-QPMAhn4*$U|?Tb^DS@^pIz9s4m z*3prR3lOB@>XJY=MU7N`N69X|Y*nLP+Ph1^Bv^!4i7Iw2xP&g<7Ek*{YV=e!c->Qv zRAsnaeOuNLIAk*eUyyoOTz1@O)m0a8<=$mg7d|S={WXZBg4DI|`G!6sh05eR=(7qh z&Gm-6DTE+(} zeelORS1N6=C<){6ckUDmz7Jef-Jy+6pq<(Mpb|77X8^(4)R0gU_94kaDv&i;g!5jd z1=Qg>smzd_bJ~oC>f;4?Y?sDBh`64{;5cqCgq8(AcegU9Ws{IAuy}_hv=&MMf zIXe7=x?`ePI$s!)@1=W9fJ(RQ>WWIviu04fb8Z9mKI z(Ub)CQ^oF4<_(pJKg_*CZ&hLd1D~LUOtMZE0MF2*0;(^(wCt8LUxk!r4`kW+S|wC! za75TQ0mf8nP&HDRBtW5)y<#0S2D^nCmr@m3BL0}L3PhXx(Seq5bqUDqo-8%YsMkTk z3xX81sP?!OMDW6O-=<2(FN6r6AO>6rYC%PK8B*EUB4!lveZfI9Hbo1xM7m z3rb3jp6pJY<|so(?Wh5cV+2x>=ITxflmEJt6nhb1rf?um{Gm|IEg~dkEL(}_$ zJt5`sQoAotlWhXojpUQ@O;YR5pWM02@m-+Cyqla$$p?eOLC>>HR^HDx;e#k5_eF)0 zsAu8`3g)jyvKj4dD;|u_OTzNN?v#{;s!ZvS4E0@}N$MT>!bR@Tvy=OqC`0Y%%aMcy znLzT`P6=j|KDQ1vB7Y}j-yjCSxmj2hDp-YqZ-11 z?TAWDa>WgJ^kWJ!T*#jc3bFhwD=6LG94wKj0fR%!*AlVft1BI6|n%_vhUD||_rPNdq3yQt?PrOb0EZgv50mX#ki1;P$` zL12p2@OUmKX z*|sFArkwQuM4d3zIdk}e(#F+J(=Y-CHuesVkmMDJ*+M)U8ZgoYRJOP_UKMboOdVp@ z1*osQ_cMCtO#0m+_Eqe=l9Xlnu9qfx5~sOs#jcsr@|Z4~r67~*nFSe`5y_zBZUqzs zM&wj=gB*)Fpa|JXk;&ufOp9~dlBsnJX;uqou~`Rf$O>C9`7`p|<_J{t_wQB9F@08c zUU}h%uU!2S8GI^~@Ux3-Be9h*$k$G`o7+rVwVQW$#_I{j)4JLSq!KF~bxLjU&Vkkj zZH7?S1`Vdum;Uu9!p9b!pupauok`*)Oa&g_L-AAmTAZMd>`b1yif|kvbv-I&saI>I zB0i!E3P|4Bl|r4#=A4rH#h1+yWRl=uIHhDaF=I+}0pI=DPifK2UrdhZQjoJWv7D5& zVqpLv36ql2$fJDK3w#P#=@dn=X(7l@+}Yh*6!WOdv5OoNrlc2?i7`>q64&LpIYTpY zyyRR~;`@=w40VcgdrE4Lja-~eYTL}wLa8OYYyJKyW%ltxX4?#4q0HV~BCj4I+c5|$ zla%fgrt&Re&utg|`S#4=a%r7ZLvd(O&_gv85I-fR@YH&cR5UZ?>w&?;u`V`(O;+-s z1gNhzS>Z}un-J)NQ%Ri~_zb{;swXQ^Tn%SQRYegm&FWzp>4KkVJts!T>AabpRFa(W^yZ?l3)cWBS2e^6_xX- zYxZ_h(&U?RQAR}-oTBT+Wc!sBo1;?ur+FNC88q}^8bSx-(QPaWova&6^9Bi0;=z^4 zt`HoMaB6w99gR9-V^es>8 z*_eC{`Tnt&O9Ud9xTbJ<#BmUI(=4Ju$@GIv8XJCH;$PLROW)9d@e0_7xDkEi)1Zrg zD`LU12|)%FCBha($BZ26gyJpD+n2uSElKvDtWQCrq#)SI^Z{iVu}vvK==wg8VPJP@ z=|PJE8)^<%Qj#nw3nr%SU;1TFsf{~%OA1#-7Lr#)%LJy6_!|`&zDp4`_ z#&Gv&%XpNQp_wrc&`GGhr8

    2@iAJ34$0qBiU?*^cylKmwAON^#&qkCMvB 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 =?&?-ckUHo_ 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%0A; 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 From 3911e9062eab36a98586fd474ed1b5de807088d7 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 27 May 2025 17:06:37 -0400 Subject: [PATCH 198/244] Update `execute.sh` uvicorn destination. --- execute.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/execute.sh b/execute.sh index 6bfd03b1..98332709 100644 --- a/execute.sh +++ b/execute.sh @@ -1,4 +1,4 @@ #!/bin/sh python apply_migrations.py -uvicorn api.main:app --host 0.0.0.0 --port 80 +uvicorn src.api.main:app --host 0.0.0.0 --port 80 From 04864ee7613257744259a11ca3e76eeddb9f801f Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 2 Jun 2025 08:25:32 -0400 Subject: [PATCH 199/244] Reorganize directories --- alembic/env.py | 4 +- apply_migrations.py | 2 +- src/api/dependencies.py | 8 +- src/api/{routes => endpoints}/__init__.py | 0 .../endpoints/annotate}/__init__.py | 0 .../endpoints/annotate/dtos}/__init__.py | 0 .../annotate/dtos/agency}/__init__.py | 0 .../endpoints/annotate/dtos/agency/post.py | 8 + .../annotate/dtos/agency/response.py} | 5 +- .../endpoints/annotate/dtos/all}/__init__.py | 0 .../endpoints/annotate/dtos/all/post.py} | 2 +- .../endpoints/annotate/dtos/all/response.py} | 4 +- .../annotate/dtos/record_type}/__init__.py | 0 .../annotate/dtos/record_type/post.py} | 0 .../annotate/dtos/record_type/response.py} | 4 +- .../annotate/dtos/relevance}/__init__.py | 0 .../annotate/dtos/relevance/post.py} | 0 .../annotate/dtos/relevance/response.py} | 4 +- .../annotate/routes.py} | 21 +- .../endpoints/batch}/__init__.py | 0 .../endpoints/batch/dtos}/__init__.py | 0 .../endpoints/batch/dtos/get}/__init__.py | 0 .../endpoints/batch/dtos/get/duplicates.py} | 2 +- .../endpoints/batch/dtos/get/logs.py} | 2 +- .../endpoints/batch/dtos/get/status.py} | 2 +- .../endpoints/batch/dtos/get/urls.py} | 2 +- .../endpoints/batch/dtos/post}/__init__.py | 0 .../endpoints/batch/dtos/post/abort.py} | 0 .../batch.py => endpoints/batch/routes.py} | 19 +- .../endpoints/collector}/__init__.py | 0 .../endpoints/collector/dtos}/__init__.py | 0 .../collector/dtos/collector_start.py} | 3 +- .../collector/dtos/manual_batch}/__init__.py | 0 .../collector/dtos/manual_batch/post.py} | 0 .../collector/dtos/manual_batch/response.py} | 0 .../collector/routes.py} | 26 +- .../endpoints/metrics}/__init__.py | 0 .../endpoints/metrics/dtos}/__init__.py | 0 .../endpoints/metrics/dtos/get}/__init__.py | 0 .../endpoints/metrics/dtos/get/backlog.py} | 0 .../metrics/dtos/get/batches}/__init__.py | 0 .../metrics/dtos/get/batches/aggregated.py} | 2 +- .../metrics/dtos/get/batches/breakdown.py} | 2 +- .../metrics/dtos/get/urls}/__init__.py | 0 .../metrics/dtos/get/urls/aggregated.py} | 0 .../dtos/get/urls/breakdown}/__init__.py | 0 .../dtos/get/urls/breakdown/pending.py} | 0 .../dtos/get/urls/breakdown/submitted.py} | 0 .../metrics/routes.py} | 17 +- .../endpoints/review}/__init__.py | 0 .../endpoints/review/dtos}/__init__.py | 0 .../endpoints/review/dtos/approve.py} | 17 +- src/api/endpoints/review/dtos/base.py | 7 + .../endpoints/review/dtos/get.py} | 4 +- src/api/endpoints/review/dtos/reject.py | 6 + src/api/endpoints/review/enums.py | 7 + .../review.py => endpoints/review/routes.py} | 11 +- src/api/{routes => endpoints}/root.py | 3 +- .../endpoints/search}/__init__.py | 0 .../endpoints/search/dtos}/__init__.py | 0 .../endpoints/search/dtos/response.py} | 0 .../search.py => endpoints/search/routes.py} | 7 +- src/api/endpoints/task/__init__.py | 0 src/api/endpoints/task/dtos/__init__.py | 0 src/api/endpoints/task/dtos/get/__init__.py | 0 .../endpoints/task/dtos/get/task.py} | 4 +- .../endpoints/task/dtos/get/task_status.py} | 0 .../endpoints/task/dtos/get/tasks.py} | 0 .../task.py => endpoints/task/routes.py} | 12 +- src/api/endpoints/url/__init__.py | 0 src/api/endpoints/url/dtos/__init__.py | 0 .../endpoints/url/dtos/response.py} | 2 +- .../url.py => endpoints/url/routes.py} | 7 +- src/api/main.py | 52 ++-- src/collector_manager/CollectorManager.py | 8 - src/collector_manager/collector_mapping.py | 17 -- .../configs/sample_autogoogler_config.json | 9 - .../README.md | 0 src/collectors/__init__.py | 0 .../enums.py | 0 src/collectors/exceptions.py | 2 + .../manager.py} | 14 +- src/collectors/mapping.py | 18 ++ .../source_collectors/README.md | 0 src/collectors/source_collectors/__init__.py | 0 .../source_collectors/auto_googler/README.md | 0 .../auto_googler/__init__.py | 0 .../auto_googler/auto_googler.py} | 6 +- .../auto_googler/collector.py} | 17 +- .../auto_googler/dtos/__init__.py | 0 .../auto_googler/dtos/config.py} | 0 .../auto_googler/dtos/input.py | 15 ++ .../auto_googler/dtos/output.py | 16 ++ .../auto_googler/dtos/query_results.py | 7 + .../auto_googler/exceptions.py | 2 + .../auto_googler/searcher.py} | 6 +- .../source_collectors/base.py} | 14 +- .../source_collectors/ckan/README.md | 0 .../source_collectors/ckan/__init__.py | 0 .../source_collectors/ckan/collector.py} | 17 +- .../source_collectors/ckan/constants.py | 0 .../source_collectors/ckan/dtos/__init__.py | 0 .../source_collectors/ckan/dtos/input.py} | 19 +- .../source_collectors/ckan/dtos/package.py | 32 +++ .../ckan/dtos/search/__init__.py | 0 .../ckan/dtos/search/_helpers.py | 3 + .../dtos/search/group_and_organization.py | 12 + .../ckan/dtos/search/package.py | 14 + .../source_collectors/ckan/exceptions.py | 2 + .../ckan/scraper_toolkit/README.md | 1 + .../ckan/scraper_toolkit/__init__.py | 0 .../ckan/scraper_toolkit/_api_interface.py} | 23 +- .../ckan/scraper_toolkit/search.py} | 7 +- .../scraper_toolkit/search_funcs/__init__.py | 0 .../search_funcs/collection.py | 131 +++++++++ .../scraper_toolkit/search_funcs/group.py | 21 ++ .../search_funcs/organization.py | 29 ++ .../scraper_toolkit/search_funcs/package.py | 52 ++++ .../common_crawler/__init__.py | 0 .../common_crawler/collector.py} | 10 +- .../common_crawler/crawler.py} | 2 +- .../common_crawler/input.py} | 0 .../source_collectors/common_crawler/utils.py | 0 .../source_collectors/example/__init__.py | 0 .../source_collectors/example/core.py} | 10 +- .../example/dtos/__init__.py | 0 .../source_collectors/example/dtos/input.py} | 0 .../source_collectors/example/dtos/output.py} | 0 .../source_collectors/muckrock/README.md | 0 .../source_collectors/muckrock/__init__.py | 0 .../muckrock/api_interface/__init__.py | 0 .../muckrock/api_interface/core.py} | 15 +- .../muckrock/api_interface/lookup_response.py | 11 + .../muckrock/collectors/__init__.py | 0 .../muckrock/collectors/all_foia/__init__.py | 0 .../muckrock/collectors/all_foia/core.py | 50 ++++ .../muckrock/collectors/all_foia/dto.py | 6 + .../muckrock/collectors/county/__init__.py | 0 .../muckrock/collectors/county/core.py | 60 +++++ .../muckrock/collectors/county/dto.py | 7 + .../muckrock/collectors/simple/__init__.py | 0 .../muckrock/collectors/simple/core.py | 58 ++++ .../muckrock/collectors/simple/dto.py | 11 + .../muckrock/collectors/simple/searcher.py} | 33 +-- .../source_collectors/muckrock/constants.py | 0 .../source_collectors/muckrock/enums.py | 7 + .../source_collectors/muckrock/exceptions.py | 11 + .../muckrock/fetch_requests/__init__.py | 0 .../muckrock/fetch_requests/base.py} | 0 .../muckrock/fetch_requests/foia.py | 6 + .../muckrock/fetch_requests/foia_loop.py | 5 + .../fetch_requests/jurisdiction_by_id.py | 5 + .../fetch_requests/jurisdiction_loop.py} | 2 +- .../muckrock/fetchers/__init__.py | 0 .../muckrock/fetchers/foia/__init__.py | 0 .../muckrock/fetchers/foia/core.py} | 13 +- .../muckrock/fetchers/foia/generator.py} | 6 +- .../muckrock/fetchers/foia/loop.py} | 6 +- .../muckrock/fetchers/foia/manager.py} | 4 +- .../fetchers/jurisdiction/__init__.py | 0 .../muckrock/fetchers/jurisdiction/core.py | 13 + .../fetchers/jurisdiction/generator.py} | 6 +- .../muckrock/fetchers/jurisdiction/loop.py} | 6 +- .../fetchers/jurisdiction/manager.py} | 4 +- .../muckrock/fetchers/templates/__init__.py | 0 .../muckrock/fetchers/templates/fetcher.py} | 11 +- .../muckrock/fetchers/templates/generator.py} | 4 +- .../fetchers/templates/iter_fetcher.py} | 4 +- .../muckrock/fetchers/templates/loop.py} | 4 +- src/core/DTOs/AnnotationRequestInfo.py | 10 - src/core/DTOs/BatchStatusInfo.py | 13 - src/core/DTOs/CollectionLifecycleInfo.py | 11 - src/core/DTOs/CollectorStartParams.py | 9 - src/core/DTOs/MessageCountResponse.py | 7 - src/core/DTOs/README.md | 1 - src/core/DTOs/ResponseURLInfo.py | 6 - src/core/DTOs/task_data_objects/UrlHtmlTDO.py | 14 - src/core/SourceCollectorCore.py | 17 -- src/core/{AsyncCore.py => core.py} | 74 ++--- .../{EnvVarManager.py => env_var_manager.py} | 0 src/core/error_manager/__init__.py | 0 .../ErrorManager.py => error_manager/core.py} | 12 +- src/core/error_manager/dtos/__init__.py | 0 src/core/error_manager/dtos/error_format.py | 8 + src/core/error_manager/enums.py | 5 + ...FunctionTrigger.py => function_trigger.py} | 0 src/core/helpers.py | 6 +- src/core/{AsyncCoreLogger.py => logger.py} | 4 +- ...oGooglerPreprocessor.py => autogoogler.py} | 4 +- .../{PreprocessorBase.py => base.py} | 2 +- .../{CKANPreprocessor.py => ckan.py} | 2 +- ...awlerPreprocessor.py => common_crawler.py} | 4 +- .../{ExamplePreprocessor.py => example.py} | 6 +- .../{MuckrockPreprocessor.py => muckrock.py} | 4 +- ...skManager.py => scheduled_task_manager.py} | 2 +- .../task_data_objects => tasks}/README.md | 3 + src/core/tasks/__init__.py | 0 src/core/tasks/dtos/__init__.py | 0 .../dtos/run_info.py} | 6 +- src/core/tasks/enums.py | 6 + src/core/{TaskManager.py => tasks/manager.py} | 39 +-- src/core/tasks/operators/__init__.py | 0 .../agency_identification/__init__.py | 0 .../operators/agency_identification/core.py} | 25 +- .../agency_identification/dtos/__init__.py | 0 .../agency_identification/dtos/suggestion.py} | 0 .../agency_identification/dtos/tdo.py} | 2 +- .../operators/base.py} | 5 +- .../tasks/operators/record_type/__init__.py | 0 .../operators/record_type/core.py} | 10 +- .../operators/record_type/llm_api/__init__.py | 0 .../record_type/llm_api}/constants.py | 0 .../record_type/llm_api/dtos/__init__.py | 0 .../dtos/record_type_structured_output.py} | 3 +- .../operators/record_type/llm_api}/helpers.py | 2 +- .../llm_api/record_classifier/__init__.py | 0 .../llm_api/record_classifier/base.py} | 8 +- .../llm_api/record_classifier/deepseek.py} | 2 +- .../llm_api/record_classifier/openai.py} | 6 +- .../operators/record_type/tdo.py} | 2 +- .../operators/submit_approved_url/__init__.py | 0 .../operators/submit_approved_url/core.py} | 10 +- .../operators/submit_approved_url/tdo.py} | 0 .../tasks/operators/url_404_probe/__init__.py | 0 .../operators/url_404_probe/core.py} | 8 +- .../operators/url_404_probe/tdo.py} | 0 .../tasks/operators/url_duplicate/__init__.py | 0 .../operators/url_duplicate/core.py} | 8 +- .../operators/url_duplicate/tdo.py} | 0 src/core/tasks/operators/url_html/__init__.py | 0 .../url_html/content_info_getter.py} | 4 +- .../operators/url_html/core.py} | 16 +- .../operators/url_html/scraper/README.md | 3 + .../operators/url_html/scraper/__init__.py | 0 .../url_html/scraper/parser/__init__.py | 0 .../url_html/scraper/parser/constants.py | 8 + .../url_html/scraper/parser/core.py} | 15 +- .../url_html/scraper/parser/dtos/__init__.py | 0 .../scraper/parser/dtos/response_html.py | 20 ++ .../url_html/scraper/parser/enums.py | 6 + .../url_html/scraper/parser/mapping.py | 13 + .../operators/url_html/scraper/parser/util.py | 43 +++ .../scraper/request_interface/__init__.py | 0 .../scraper/request_interface/constants.py | 2 + .../scraper/request_interface/core.py} | 27 +- .../request_interface/dtos/__init__.py | 0 .../dtos/request_resources.py | 14 + .../request_interface/dtos/url_response.py | 12 + .../scraper/root_url_cache/__init__.py | 0 .../scraper/root_url_cache}/constants.py | 3 - .../url_html/scraper/root_url_cache/core.py} | 10 +- .../scraper/root_url_cache/dtos/__init__.py | 0 .../scraper/root_url_cache/dtos/response.py | 11 + src/core/tasks/operators/url_html/tdo.py | 14 + .../url_miscellaneous_metadata/__init__.py | 0 .../url_miscellaneous_metadata/core.py} | 18 +- .../url_miscellaneous_metadata/tdo.py} | 2 +- src/core/tasks/subtasks/__init__.py | 0 .../agency_identification/__init__.py | 0 .../agency_identification/auto_googler.py} | 4 +- .../subtasks/agency_identification/base.py} | 2 +- .../subtasks/agency_identification/ckan.py} | 6 +- .../agency_identification/common_crawler.py} | 2 +- .../agency_identification/muckrock.py} | 10 +- .../miscellaneous_metadata/__init__.py | 0 .../miscellaneous_metadata/auto_googler.py} | 4 +- .../subtasks/miscellaneous_metadata/base.py} | 2 +- .../subtasks/miscellaneous_metadata/ckan.py} | 4 +- .../miscellaneous_metadata/muckrock.py} | 4 +- src/db/client/__init__.py | 0 .../async_.py} | 107 ++++---- src/db/{DatabaseClient.py => client/sync.py} | 23 +- .../{ConfigManager.py => config_manager.py} | 0 src/db/{DTOConverter.py => dto_converter.py} | 24 +- src/db/{DTOs => dtos}/README.md | 0 src/db/dtos/__init__.py | 0 .../{DTOs/BatchInfo.py => dtos/batch_info.py} | 0 .../duplicate_info.py} | 0 .../insert_urls_info.py} | 2 +- src/db/{DTOs/LogInfo.py => dtos/log_info.py} | 0 .../metadata_annotation_info.py} | 0 .../url_annotation_info.py} | 2 +- .../url_error_info.py} | 0 .../url_html_content_info.py} | 0 src/db/{DTOs/URLInfo.py => dtos/url_info.py} | 2 +- .../URLMapping.py => dtos/url_mapping.py} | 0 .../url_metadata_info.py} | 0 .../url_relevancy_info.py} | 0 .../URLWithHTML.py => dtos/url_with_html.py} | 2 +- src/db/{helper_functions.py => helpers.py} | 2 +- src/db/models/__init__.py | 0 src/db/{models.py => models/core.py} | 157 ++++------- src/db/models/helpers.py | 18 ++ src/db/models/mixins.py | 60 +++++ src/db/models/templates.py | 11 + ...ementComposer.py => statement_composer.py} | 4 +- src/html_tag_collector/DataClassTags.py | 41 --- src/html_tag_collector/README.md | 30 --- .../url_adjustment_functions.py | 42 --- src/html_tag_collector/util.py | 10 - src/pdap_api/__init__.py | 0 .../PDAPClient.py => pdap_api/client.py} | 9 +- src/pdap_api/dtos/__init__.py | 0 src/pdap_api/dtos/match_agency/__init__.py | 0 src/pdap_api/dtos/match_agency/post.py | 11 + src/pdap_api/dtos/match_agency/response.py | 11 + src/pdap_api/dtos/unique_url_duplicate.py | 11 + src/{pdap_api_client => pdap_api}/enums.py | 7 + src/pdap_api_client/DTOs.py | 29 -- src/security/__init__.py | 0 src/security/constants.py | 1 + src/security/dtos/__init__.py | 0 src/security/dtos/access_info.py | 11 + src/security/enums.py | 6 + .../manager.py} | 25 +- src/source_collectors/auto_googler/DTOs.py | 32 --- .../ckan/ckan_scraper_toolkit.py | 254 ------------------ src/source_collectors/ckan/search_terms.py | 36 --- .../common_crawler/crawler.py | 160 ----------- .../helpers/RequestManager.py | 2 - src/source_collectors/muckrock/.gitignore | 228 ---------------- src/source_collectors/muckrock/DTOs.py | 20 -- .../muckrock/allegheny-county-towns.txt | 61 ----- .../muckrock/classes/MuckrockCollector.py | 158 ----------- .../exceptions/RequestFailureException.py | 5 - .../fetch_requests/FOIALoopFetchRequest.py | 5 - .../muckrock_fetchers/AgencyFetcher.py | 15 -- .../JurisdictionByIDFetcher.py | 15 -- .../generate_detailed_muckrock_csv.py | 169 ------------ src/source_collectors/muckrock/schemas.py | 5 - src/source_collectors/muckrock/utils.py | 36 --- tests/alembic/conftest.py | 4 +- tests/alembic/helpers.py | 2 +- tests/automated/integration/api/conftest.py | 23 +- .../api/helpers/RequestValidator.py | 63 ++--- .../integration/api/test_annotate.py | 24 +- tests/automated/integration/api/test_batch.py | 8 +- .../integration/api/test_duplicates.py | 4 +- .../integration/api/test_example_collector.py | 21 +- .../integration/api/test_manual_batch.py | 6 +- .../automated/integration/api/test_metrics.py | 2 +- .../automated/integration/api/test_review.py | 11 +- .../automated/integration/api/test_search.py | 2 +- tests/automated/integration/api/test_url.py | 4 +- .../collector_db/test_database_structure.py | 13 +- .../collector_db/test_db_client.py | 20 +- tests/automated/integration/conftest.py | 17 +- .../integration/core/test_async_core.py | 13 +- .../core/test_example_collector_lifecycle.py | 67 ----- .../html_tag_collector/test_root_url_cache.py | 3 +- .../security_manager/test_security_manager.py | 13 +- tests/automated/integration/tasks/conftest.py | 2 +- .../tasks/test_agency_preannotation_task.py | 31 ++- .../integration/tasks/test_example_task.py | 6 +- .../tasks/test_submit_approved_url_task.py | 14 +- .../integration/tasks/test_url_404_probe.py | 13 +- .../tasks/test_url_duplicate_task.py | 14 +- .../integration/tasks/test_url_html_task.py | 19 +- .../test_url_miscellaneous_metadata_task.py | 10 +- .../tasks/test_url_record_type_task.py | 10 +- tests/automated/unit/core/test_core_logger.py | 4 +- .../unit/dto/test_all_annotation_post_info.py | 2 +- .../security_manager/test_security_manager.py | 4 +- .../test_autogoogler_collector.py | 13 +- .../test_common_crawl_collector.py | 12 +- .../test_example_collector.py | 8 +- .../test_muckrock_collectors.py | 103 +++---- tests/automated/unit/test_function_trigger.py | 2 +- tests/conftest.py | 14 +- .../{AlembicRunner.py => alembic_runner.py} | 0 tests/helpers/assert_functions.py | 2 +- ...aitableBarrier.py => awaitable_barrier.py} | 0 tests/helpers/complex_test_data_functions.py | 10 +- .../{DBDataCreator.py => db_data_creator.py} | 29 +- tests/helpers/patch_functions.py | 4 +- .../helpers/test_batch_creation_parameters.py | 2 +- .../test_muckrock_api_interface.py | 2 +- .../lifecycle/test_auto_googler_lifecycle.py | 4 +- .../core/lifecycle/test_ckan_lifecycle.py | 6 +- .../test_common_crawler_lifecycle.py | 15 +- .../lifecycle/test_muckrock_lifecycles.py | 4 +- .../test_html_tag_collector_integration.py | 11 +- .../test_deepseek_record_classifier.py | 6 +- .../test_openai_record_classifier.py | 6 +- tests/manual/pdap_client/test_pdap_client.py | 2 +- .../test_autogoogler_collector.py | 7 +- .../source_collectors/test_ckan_collector.py | 9 +- .../test_common_crawler_collector.py | 7 +- .../test_muckrock_collectors.py | 17 +- .../unsorted/test_common_crawler_unit.py | 63 ----- .../unsorted/test_root_url_cache_unit.py | 2 - 391 files changed, 1838 insertions(+), 2657 deletions(-) rename src/api/{routes => endpoints}/__init__.py (100%) rename src/{collector_manager/DTOs => api/endpoints/annotate}/__init__.py (100%) rename src/{collector_manager => api/endpoints/annotate/dtos}/__init__.py (100%) rename src/{core/DTOs => api/endpoints/annotate/dtos/agency}/__init__.py (100%) create mode 100644 src/api/endpoints/annotate/dtos/agency/post.py rename src/{core/DTOs/GetNextURLForAgencyAnnotationResponse.py => api/endpoints/annotate/dtos/agency/response.py} (79%) rename src/{core/DTOs/task_data_objects => api/endpoints/annotate/dtos/all}/__init__.py (100%) rename src/{core/DTOs/AllAnnotationPostInfo.py => api/endpoints/annotate/dtos/all/post.py} (93%) rename src/{core/DTOs/GetNextURLForAllAnnotationResponse.py => api/endpoints/annotate/dtos/all/response.py} (78%) rename src/{core/classes => api/endpoints/annotate/dtos/record_type}/__init__.py (100%) rename src/{core/DTOs/RecordTypeAnnotationPostInfo.py => api/endpoints/annotate/dtos/record_type/post.py} (100%) rename src/{core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py => api/endpoints/annotate/dtos/record_type/response.py} (81%) rename src/{core/classes/subtasks/MiscellaneousMetadata => api/endpoints/annotate/dtos/relevance}/__init__.py (100%) rename src/{core/DTOs/RelevanceAnnotationPostInfo.py => api/endpoints/annotate/dtos/relevance/post.py} (100%) rename src/{core/DTOs/GetNextRelevanceAnnotationResponseInfo.py => api/endpoints/annotate/dtos/relevance/response.py} (79%) rename src/api/{routes/annotate.py => endpoints/annotate/routes.py} (86%) rename src/{core/classes/subtasks => api/endpoints/batch}/__init__.py (100%) rename src/{core/classes/task_operators => api/endpoints/batch/dtos}/__init__.py (100%) rename src/{db/DTOs => api/endpoints/batch/dtos/get}/__init__.py (100%) rename src/{core/DTOs/GetDuplicatesByBatchResponse.py => api/endpoints/batch/dtos/get/duplicates.py} (72%) rename src/{core/DTOs/GetBatchLogsResponse.py => api/endpoints/batch/dtos/get/logs.py} (68%) rename src/{core/DTOs/GetBatchStatusResponse.py => api/endpoints/batch/dtos/get/status.py} (69%) rename src/{core/DTOs/GetURLsByBatchResponse.py => api/endpoints/batch/dtos/get/urls.py} (70%) rename src/{html_tag_collector => api/endpoints/batch/dtos/post}/__init__.py (100%) rename src/{core/DTOs/MessageResponse.py => api/endpoints/batch/dtos/post/abort.py} (100%) rename src/api/{routes/batch.py => endpoints/batch/routes.py} (84%) rename src/{llm_api_logic => api/endpoints/collector}/__init__.py (100%) rename src/{pdap_api_client => api/endpoints/collector/dtos}/__init__.py (100%) rename src/{core/DTOs/CollectorStartInfo.py => api/endpoints/collector/dtos/collector_start.py} (97%) rename src/{security_manager => api/endpoints/collector/dtos/manual_batch}/__init__.py (100%) rename src/{core/DTOs/ManualBatchInputDTO.py => api/endpoints/collector/dtos/manual_batch/post.py} (100%) rename src/{core/DTOs/ManualBatchResponseDTO.py => api/endpoints/collector/dtos/manual_batch/response.py} (100%) rename src/api/{routes/collector.py => endpoints/collector/routes.py} (77%) rename src/{source_collectors => api/endpoints/metrics}/__init__.py (100%) rename src/{source_collectors/auto_googler => api/endpoints/metrics/dtos}/__init__.py (100%) rename src/{source_collectors/ckan => api/endpoints/metrics/dtos/get}/__init__.py (100%) rename src/{core/DTOs/GetMetricsBacklogResponse.py => api/endpoints/metrics/dtos/get/backlog.py} (100%) rename src/{source_collectors/common_crawler => api/endpoints/metrics/dtos/get/batches}/__init__.py (100%) rename src/{core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py => api/endpoints/metrics/dtos/get/batches/aggregated.py} (90%) rename src/{core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py => api/endpoints/metrics/dtos/get/batches/breakdown.py} (90%) rename src/{source_collectors/helpers => api/endpoints/metrics/dtos/get/urls}/__init__.py (100%) rename src/{core/DTOs/GetMetricsURLsAggregatedResponseDTO.py => api/endpoints/metrics/dtos/get/urls/aggregated.py} (100%) rename src/{source_collectors/muckrock => api/endpoints/metrics/dtos/get/urls/breakdown}/__init__.py (100%) rename src/{core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py => api/endpoints/metrics/dtos/get/urls/breakdown/pending.py} (100%) rename src/{core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py => api/endpoints/metrics/dtos/get/urls/breakdown/submitted.py} (100%) rename src/api/{routes/metrics.py => endpoints/metrics/routes.py} (73%) rename src/{source_collectors/muckrock/classes => api/endpoints/review}/__init__.py (100%) rename src/{source_collectors/muckrock/classes/exceptions => api/endpoints/review/dtos}/__init__.py (100%) rename src/{core/DTOs/FinalReviewApprovalInfo.py => api/endpoints/review/dtos/approve.py} (78%) create mode 100644 src/api/endpoints/review/dtos/base.py rename src/{core/DTOs/GetNextURLForFinalReviewResponse.py => api/endpoints/review/dtos/get.py} (94%) create mode 100644 src/api/endpoints/review/dtos/reject.py create mode 100644 src/api/endpoints/review/enums.py rename src/api/{routes/review.py => endpoints/review/routes.py} (85%) rename src/api/{routes => endpoints}/root.py (78%) rename src/{source_collectors/muckrock/classes/fetch_requests => api/endpoints/search}/__init__.py (100%) rename src/{source_collectors/muckrock/classes/muckrock_fetchers => api/endpoints/search/dtos}/__init__.py (100%) rename src/{core/DTOs/SearchURLResponse.py => api/endpoints/search/dtos/response.py} (100%) rename src/api/{routes/search.py => endpoints/search/routes.py} (70%) create mode 100644 src/api/endpoints/task/__init__.py create mode 100644 src/api/endpoints/task/dtos/__init__.py create mode 100644 src/api/endpoints/task/dtos/get/__init__.py rename src/{db/DTOs/TaskInfo.py => api/endpoints/task/dtos/get/task.py} (78%) rename src/{db/DTOs/GetTaskStatusResponseInfo.py => api/endpoints/task/dtos/get/task_status.py} (100%) rename src/{core/DTOs/GetTasksResponse.py => api/endpoints/task/dtos/get/tasks.py} (100%) rename src/api/{routes/task.py => endpoints/task/routes.py} (80%) create mode 100644 src/api/endpoints/url/__init__.py create mode 100644 src/api/endpoints/url/dtos/__init__.py rename src/{core/DTOs/GetURLsResponseInfo.py => api/endpoints/url/dtos/response.py} (94%) rename src/api/{routes/url.py => endpoints/url/routes.py} (77%) delete mode 100644 src/collector_manager/CollectorManager.py delete mode 100644 src/collector_manager/collector_mapping.py delete mode 100644 src/collector_manager/configs/sample_autogoogler_config.json rename src/{collector_manager => collectors}/README.md (100%) create mode 100644 src/collectors/__init__.py rename src/{collector_manager => collectors}/enums.py (100%) create mode 100644 src/collectors/exceptions.py rename src/{collector_manager/AsyncCollectorManager.py => collectors/manager.py} (86%) create mode 100644 src/collectors/mapping.py rename src/{ => collectors}/source_collectors/README.md (100%) create mode 100644 src/collectors/source_collectors/__init__.py rename src/{ => collectors}/source_collectors/auto_googler/README.md (100%) create mode 100644 src/collectors/source_collectors/auto_googler/__init__.py rename src/{source_collectors/auto_googler/AutoGoogler.py => collectors/source_collectors/auto_googler/auto_googler.py} (77%) rename src/{source_collectors/auto_googler/AutoGooglerCollector.py => collectors/source_collectors/auto_googler/collector.py} (65%) create mode 100644 src/collectors/source_collectors/auto_googler/dtos/__init__.py rename src/{source_collectors/auto_googler/SearchConfig.py => collectors/source_collectors/auto_googler/dtos/config.py} (100%) create mode 100644 src/collectors/source_collectors/auto_googler/dtos/input.py create mode 100644 src/collectors/source_collectors/auto_googler/dtos/output.py create mode 100644 src/collectors/source_collectors/auto_googler/dtos/query_results.py create mode 100644 src/collectors/source_collectors/auto_googler/exceptions.py rename src/{source_collectors/auto_googler/GoogleSearcher.py => collectors/source_collectors/auto_googler/searcher.py} (93%) rename src/{collector_manager/AsyncCollectorBase.py => collectors/source_collectors/base.py} (91%) rename src/{ => collectors}/source_collectors/ckan/README.md (100%) create mode 100644 src/collectors/source_collectors/ckan/__init__.py rename src/{source_collectors/ckan/CKANCollector.py => collectors/source_collectors/ckan/collector.py} (74%) rename src/{ => collectors}/source_collectors/ckan/constants.py (100%) create mode 100644 src/collectors/source_collectors/ckan/dtos/__init__.py rename src/{source_collectors/ckan/DTOs.py => collectors/source_collectors/ckan/dtos/input.py} (50%) create mode 100644 src/collectors/source_collectors/ckan/dtos/package.py create mode 100644 src/collectors/source_collectors/ckan/dtos/search/__init__.py create mode 100644 src/collectors/source_collectors/ckan/dtos/search/_helpers.py create mode 100644 src/collectors/source_collectors/ckan/dtos/search/group_and_organization.py create mode 100644 src/collectors/source_collectors/ckan/dtos/search/package.py create mode 100644 src/collectors/source_collectors/ckan/exceptions.py create mode 100644 src/collectors/source_collectors/ckan/scraper_toolkit/README.md create mode 100644 src/collectors/source_collectors/ckan/scraper_toolkit/__init__.py rename src/{source_collectors/ckan/CKANAPIInterface.py => collectors/source_collectors/ckan/scraper_toolkit/_api_interface.py} (82%) rename src/{source_collectors/ckan/scrape_ckan_data_portals.py => collectors/source_collectors/ckan/scraper_toolkit/search.py} (95%) create mode 100644 src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/__init__.py create mode 100644 src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/collection.py create mode 100644 src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/group.py create mode 100644 src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/organization.py create mode 100644 src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/package.py create mode 100644 src/collectors/source_collectors/common_crawler/__init__.py rename src/{source_collectors/common_crawler/CommonCrawlerCollector.py => collectors/source_collectors/common_crawler/collector.py} (64%) rename src/{source_collectors/common_crawler/CommonCrawler.py => collectors/source_collectors/common_crawler/crawler.py} (98%) rename src/{source_collectors/common_crawler/DTOs.py => collectors/source_collectors/common_crawler/input.py} (100%) rename src/{ => collectors}/source_collectors/common_crawler/utils.py (100%) create mode 100644 src/collectors/source_collectors/example/__init__.py rename src/{collector_manager/ExampleCollector.py => collectors/source_collectors/example/core.py} (70%) create mode 100644 src/collectors/source_collectors/example/dtos/__init__.py rename src/{collector_manager/DTOs/ExampleInputDTO.py => collectors/source_collectors/example/dtos/input.py} (100%) rename src/{collector_manager/DTOs/ExampleOutputDTO.py => collectors/source_collectors/example/dtos/output.py} (100%) rename src/{ => collectors}/source_collectors/muckrock/README.md (100%) create mode 100644 src/collectors/source_collectors/muckrock/__init__.py create mode 100644 src/collectors/source_collectors/muckrock/api_interface/__init__.py rename src/{source_collectors/muckrock/MuckrockAPIInterface.py => collectors/source_collectors/muckrock/api_interface/core.py} (80%) create mode 100644 src/collectors/source_collectors/muckrock/api_interface/lookup_response.py create mode 100644 src/collectors/source_collectors/muckrock/collectors/__init__.py create mode 100644 src/collectors/source_collectors/muckrock/collectors/all_foia/__init__.py create mode 100644 src/collectors/source_collectors/muckrock/collectors/all_foia/core.py create mode 100644 src/collectors/source_collectors/muckrock/collectors/all_foia/dto.py create mode 100644 src/collectors/source_collectors/muckrock/collectors/county/__init__.py create mode 100644 src/collectors/source_collectors/muckrock/collectors/county/core.py create mode 100644 src/collectors/source_collectors/muckrock/collectors/county/dto.py create mode 100644 src/collectors/source_collectors/muckrock/collectors/simple/__init__.py create mode 100644 src/collectors/source_collectors/muckrock/collectors/simple/core.py create mode 100644 src/collectors/source_collectors/muckrock/collectors/simple/dto.py rename src/{source_collectors/muckrock/classes/FOIASearcher.py => collectors/source_collectors/muckrock/collectors/simple/searcher.py} (54%) rename src/{ => collectors}/source_collectors/muckrock/constants.py (100%) create mode 100644 src/collectors/source_collectors/muckrock/enums.py create mode 100644 src/collectors/source_collectors/muckrock/exceptions.py create mode 100644 src/collectors/source_collectors/muckrock/fetch_requests/__init__.py rename src/{source_collectors/muckrock/classes/fetch_requests/FetchRequestBase.py => collectors/source_collectors/muckrock/fetch_requests/base.py} (100%) create mode 100644 src/collectors/source_collectors/muckrock/fetch_requests/foia.py create mode 100644 src/collectors/source_collectors/muckrock/fetch_requests/foia_loop.py create mode 100644 src/collectors/source_collectors/muckrock/fetch_requests/jurisdiction_by_id.py rename src/{source_collectors/muckrock/classes/fetch_requests/JurisdictionLoopFetchRequest.py => collectors/source_collectors/muckrock/fetch_requests/jurisdiction_loop.py} (52%) create mode 100644 src/collectors/source_collectors/muckrock/fetchers/__init__.py create mode 100644 src/collectors/source_collectors/muckrock/fetchers/foia/__init__.py rename src/{source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetcher.py => collectors/source_collectors/muckrock/fetchers/foia/core.py} (73%) rename src/{source_collectors/muckrock/classes/muckrock_fetchers/FOIAGeneratorFetcher.py => collectors/source_collectors/muckrock/fetchers/foia/generator.py} (59%) rename src/{source_collectors/muckrock/classes/muckrock_fetchers/FOIALoopFetcher.py => collectors/source_collectors/muckrock/fetchers/foia/loop.py} (65%) rename src/{source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetchManager.py => collectors/source_collectors/muckrock/fetchers/foia/manager.py} (74%) create mode 100644 src/collectors/source_collectors/muckrock/fetchers/jurisdiction/__init__.py create mode 100644 src/collectors/source_collectors/muckrock/fetchers/jurisdiction/core.py rename src/{source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionGeneratorFetcher.py => collectors/source_collectors/muckrock/fetchers/jurisdiction/generator.py} (57%) rename src/{source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionLoopFetcher.py => collectors/source_collectors/muckrock/fetchers/jurisdiction/loop.py} (77%) rename src/{source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionFetchManager.py => collectors/source_collectors/muckrock/fetchers/jurisdiction/manager.py} (80%) create mode 100644 src/collectors/source_collectors/muckrock/fetchers/templates/__init__.py rename src/{source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py => collectors/source_collectors/muckrock/fetchers/templates/fetcher.py} (80%) rename src/{source_collectors/muckrock/classes/muckrock_fetchers/MuckrockNextFetcher.py => collectors/source_collectors/muckrock/fetchers/templates/generator.py} (77%) rename src/{source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py => collectors/source_collectors/muckrock/fetchers/templates/iter_fetcher.py} (81%) rename src/{source_collectors/muckrock/classes/muckrock_fetchers/MuckrockLoopFetcher.py => collectors/source_collectors/muckrock/fetchers/templates/loop.py} (76%) delete mode 100644 src/core/DTOs/AnnotationRequestInfo.py delete mode 100644 src/core/DTOs/BatchStatusInfo.py delete mode 100644 src/core/DTOs/CollectionLifecycleInfo.py delete mode 100644 src/core/DTOs/CollectorStartParams.py delete mode 100644 src/core/DTOs/MessageCountResponse.py delete mode 100644 src/core/DTOs/README.md delete mode 100644 src/core/DTOs/ResponseURLInfo.py delete mode 100644 src/core/DTOs/task_data_objects/UrlHtmlTDO.py delete mode 100644 src/core/SourceCollectorCore.py rename src/core/{AsyncCore.py => core.py} (77%) rename src/core/{EnvVarManager.py => env_var_manager.py} (100%) create mode 100644 src/core/error_manager/__init__.py rename src/core/{classes/ErrorManager.py => error_manager/core.py} (82%) create mode 100644 src/core/error_manager/dtos/__init__.py create mode 100644 src/core/error_manager/dtos/error_format.py create mode 100644 src/core/error_manager/enums.py rename src/core/{FunctionTrigger.py => function_trigger.py} (100%) rename src/core/{AsyncCoreLogger.py => logger.py} (95%) rename src/core/preprocessors/{AutoGooglerPreprocessor.py => autogoogler.py} (87%) rename src/core/preprocessors/{PreprocessorBase.py => base.py} (91%) rename src/core/preprocessors/{CKANPreprocessor.py => ckan.py} (93%) rename src/core/preprocessors/{CommonCrawlerPreprocessor.py => common_crawler.py} (74%) rename src/core/preprocessors/{ExamplePreprocessor.py => example.py} (64%) rename src/core/preprocessors/{MuckrockPreprocessor.py => muckrock.py} (77%) rename src/core/{ScheduledTaskManager.py => scheduled_task_manager.py} (97%) rename src/core/{DTOs/task_data_objects => tasks}/README.md (88%) create mode 100644 src/core/tasks/__init__.py create mode 100644 src/core/tasks/dtos/__init__.py rename src/core/{DTOs/TaskOperatorRunInfo.py => tasks/dtos/run_info.py} (68%) create mode 100644 src/core/tasks/enums.py rename src/core/{TaskManager.py => tasks/manager.py} (81%) create mode 100644 src/core/tasks/operators/__init__.py create mode 100644 src/core/tasks/operators/agency_identification/__init__.py rename src/core/{classes/task_operators/AgencyIdentificationTaskOperator.py => tasks/operators/agency_identification/core.py} (81%) create mode 100644 src/core/tasks/operators/agency_identification/dtos/__init__.py rename src/core/{DTOs/URLAgencySuggestionInfo.py => tasks/operators/agency_identification/dtos/suggestion.py} (100%) rename src/core/{DTOs/task_data_objects/AgencyIdentificationTDO.py => tasks/operators/agency_identification/dtos/tdo.py} (78%) rename src/core/{classes/task_operators/TaskOperatorBase.py => tasks/operators/base.py} (93%) create mode 100644 src/core/tasks/operators/record_type/__init__.py rename src/core/{classes/task_operators/URLRecordTypeTaskOperator.py => tasks/operators/record_type/core.py} (88%) create mode 100644 src/core/tasks/operators/record_type/llm_api/__init__.py rename src/{llm_api_logic => core/tasks/operators/record_type/llm_api}/constants.py (100%) create mode 100644 src/core/tasks/operators/record_type/llm_api/dtos/__init__.py rename src/{llm_api_logic/RecordTypeStructuredOutput.py => core/tasks/operators/record_type/llm_api/dtos/record_type_structured_output.py} (90%) rename src/{llm_api_logic => core/tasks/operators/record_type/llm_api}/helpers.py (75%) create mode 100644 src/core/tasks/operators/record_type/llm_api/record_classifier/__init__.py rename src/{llm_api_logic/LLMRecordClassifierBase.py => core/tasks/operators/record_type/llm_api/record_classifier/base.py} (83%) rename src/{llm_api_logic/DeepSeekRecordClassifier.py => core/tasks/operators/record_type/llm_api/record_classifier/deepseek.py} (84%) rename src/{llm_api_logic/OpenAIRecordClassifier.py => core/tasks/operators/record_type/llm_api/record_classifier/openai.py} (73%) rename src/core/{DTOs/task_data_objects/URLRecordTypeTDO.py => tasks/operators/record_type/tdo.py} (86%) create mode 100644 src/core/tasks/operators/submit_approved_url/__init__.py rename src/core/{classes/task_operators/SubmitApprovedURLTaskOperator.py => tasks/operators/submit_approved_url/core.py} (86%) rename src/core/{DTOs/task_data_objects/SubmitApprovedURLTDO.py => tasks/operators/submit_approved_url/tdo.py} (100%) create mode 100644 src/core/tasks/operators/url_404_probe/__init__.py rename src/core/{classes/task_operators/URL404ProbeTaskOperator.py => tasks/operators/url_404_probe/core.py} (87%) rename src/core/{DTOs/task_data_objects/URL404ProbeTDO.py => tasks/operators/url_404_probe/tdo.py} (100%) create mode 100644 src/core/tasks/operators/url_duplicate/__init__.py rename src/core/{classes/task_operators/URLDuplicateTaskOperator.py => tasks/operators/url_duplicate/core.py} (84%) rename src/core/{DTOs/task_data_objects/URLDuplicateTDO.py => tasks/operators/url_duplicate/tdo.py} (100%) create mode 100644 src/core/tasks/operators/url_html/__init__.py rename src/core/{classes/HTMLContentInfoGetter.py => tasks/operators/url_html/content_info_getter.py} (82%) rename src/core/{classes/task_operators/URLHTMLTaskOperator.py => tasks/operators/url_html/core.py} (89%) create mode 100644 src/core/tasks/operators/url_html/scraper/README.md create mode 100644 src/core/tasks/operators/url_html/scraper/__init__.py create mode 100644 src/core/tasks/operators/url_html/scraper/parser/__init__.py create mode 100644 src/core/tasks/operators/url_html/scraper/parser/constants.py rename src/{html_tag_collector/ResponseParser.py => core/tasks/operators/url_html/scraper/parser/core.py} (89%) create mode 100644 src/core/tasks/operators/url_html/scraper/parser/dtos/__init__.py create mode 100644 src/core/tasks/operators/url_html/scraper/parser/dtos/response_html.py create mode 100644 src/core/tasks/operators/url_html/scraper/parser/enums.py create mode 100644 src/core/tasks/operators/url_html/scraper/parser/mapping.py create mode 100644 src/core/tasks/operators/url_html/scraper/parser/util.py create mode 100644 src/core/tasks/operators/url_html/scraper/request_interface/__init__.py create mode 100644 src/core/tasks/operators/url_html/scraper/request_interface/constants.py rename src/{html_tag_collector/URLRequestInterface.py => core/tasks/operators/url_html/scraper/request_interface/core.py} (86%) create mode 100644 src/core/tasks/operators/url_html/scraper/request_interface/dtos/__init__.py create mode 100644 src/core/tasks/operators/url_html/scraper/request_interface/dtos/request_resources.py create mode 100644 src/core/tasks/operators/url_html/scraper/request_interface/dtos/url_response.py create mode 100644 src/core/tasks/operators/url_html/scraper/root_url_cache/__init__.py rename src/{html_tag_collector => core/tasks/operators/url_html/scraper/root_url_cache}/constants.py (91%) rename src/{html_tag_collector/RootURLCache.py => core/tasks/operators/url_html/scraper/root_url_cache/core.py} (90%) create mode 100644 src/core/tasks/operators/url_html/scraper/root_url_cache/dtos/__init__.py create mode 100644 src/core/tasks/operators/url_html/scraper/root_url_cache/dtos/response.py create mode 100644 src/core/tasks/operators/url_html/tdo.py create mode 100644 src/core/tasks/operators/url_miscellaneous_metadata/__init__.py rename src/core/{classes/task_operators/URLMiscellaneousMetadataTaskOperator.py => tasks/operators/url_miscellaneous_metadata/core.py} (75%) rename src/core/{DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py => tasks/operators/url_miscellaneous_metadata/tdo.py} (91%) create mode 100644 src/core/tasks/subtasks/__init__.py create mode 100644 src/core/tasks/subtasks/agency_identification/__init__.py rename src/core/{classes/subtasks/AutoGooglerAgencyIdentificationSubtask.py => tasks/subtasks/agency_identification/auto_googler.py} (76%) rename src/core/{classes/subtasks/AgencyIdentificationSubtaskBase.py => tasks/subtasks/agency_identification/base.py} (76%) rename src/core/{classes/subtasks/CKANAgencyIdentificationSubtask.py => tasks/subtasks/agency_identification/ckan.py} (77%) rename src/core/{classes/subtasks/CommonCrawlerAgencyIdentificationSubtask.py => tasks/subtasks/agency_identification/common_crawler.py} (85%) rename src/core/{classes/subtasks/MuckrockAgencyIdentificationSubtask.py => tasks/subtasks/agency_identification/muckrock.py} (73%) create mode 100644 src/core/tasks/subtasks/miscellaneous_metadata/__init__.py rename src/core/{classes/subtasks/MiscellaneousMetadata/AutoGooglerMiscMetadataSubtask.py => tasks/subtasks/miscellaneous_metadata/auto_googler.py} (58%) rename src/core/{classes/subtasks/MiscellaneousMetadata/MiscellaneousMetadataSubtaskBase.py => tasks/subtasks/miscellaneous_metadata/base.py} (66%) rename src/core/{classes/subtasks/MiscellaneousMetadata/CKANMiscMetadataSubtask.py => tasks/subtasks/miscellaneous_metadata/ckan.py} (72%) rename src/core/{classes/subtasks/MiscellaneousMetadata/MuckrockMiscMetadataSubtask.py => tasks/subtasks/miscellaneous_metadata/muckrock.py} (58%) create mode 100644 src/db/client/__init__.py rename src/db/{AsyncDatabaseClient.py => client/async_.py} (95%) rename src/db/{DatabaseClient.py => client/sync.py} (91%) rename src/db/{ConfigManager.py => config_manager.py} (100%) rename src/db/{DTOConverter.py => dto_converter.py} (90%) rename src/db/{DTOs => dtos}/README.md (100%) create mode 100644 src/db/dtos/__init__.py rename src/db/{DTOs/BatchInfo.py => dtos/batch_info.py} (100%) rename src/db/{DTOs/DuplicateInfo.py => dtos/duplicate_info.py} (100%) rename src/db/{DTOs/InsertURLsInfo.py => dtos/insert_urls_info.py} (81%) rename src/db/{DTOs/LogInfo.py => dtos/log_info.py} (100%) rename src/db/{DTOs/MetadataAnnotationInfo.py => dtos/metadata_annotation_info.py} (100%) rename src/db/{DTOs/URLAnnotationInfo.py => dtos/url_annotation_info.py} (72%) rename src/db/{DTOs/URLErrorInfos.py => dtos/url_error_info.py} (100%) rename src/db/{DTOs/URLHTMLContentInfo.py => dtos/url_html_content_info.py} (100%) rename src/db/{DTOs/URLInfo.py => dtos/url_info.py} (88%) rename src/db/{DTOs/URLMapping.py => dtos/url_mapping.py} (100%) rename src/db/{DTOs/URLMetadataInfo.py => dtos/url_metadata_info.py} (100%) rename src/db/{DTOs/URLRelevancyInfo.py => dtos/url_relevancy_info.py} (100%) rename src/db/{DTOs/URLWithHTML.py => dtos/url_with_html.py} (67%) rename src/db/{helper_functions.py => helpers.py} (71%) create mode 100644 src/db/models/__init__.py rename src/db/{models.py => models/core.py} (71%) create mode 100644 src/db/models/helpers.py create mode 100644 src/db/models/mixins.py create mode 100644 src/db/models/templates.py rename src/db/{StatementComposer.py => statement_composer.py} (95%) delete mode 100644 src/html_tag_collector/DataClassTags.py delete mode 100644 src/html_tag_collector/README.md delete mode 100644 src/html_tag_collector/url_adjustment_functions.py delete mode 100644 src/html_tag_collector/util.py create mode 100644 src/pdap_api/__init__.py rename src/{pdap_api_client/PDAPClient.py => pdap_api/client.py} (92%) create mode 100644 src/pdap_api/dtos/__init__.py create mode 100644 src/pdap_api/dtos/match_agency/__init__.py create mode 100644 src/pdap_api/dtos/match_agency/post.py create mode 100644 src/pdap_api/dtos/match_agency/response.py create mode 100644 src/pdap_api/dtos/unique_url_duplicate.py rename src/{pdap_api_client => pdap_api}/enums.py (50%) delete mode 100644 src/pdap_api_client/DTOs.py create mode 100644 src/security/__init__.py create mode 100644 src/security/constants.py create mode 100644 src/security/dtos/__init__.py create mode 100644 src/security/dtos/access_info.py create mode 100644 src/security/enums.py rename src/{security_manager/SecurityManager.py => security/manager.py} (80%) delete mode 100644 src/source_collectors/auto_googler/DTOs.py delete mode 100644 src/source_collectors/ckan/ckan_scraper_toolkit.py delete mode 100644 src/source_collectors/ckan/search_terms.py delete mode 100644 src/source_collectors/common_crawler/crawler.py delete mode 100644 src/source_collectors/helpers/RequestManager.py delete mode 100644 src/source_collectors/muckrock/.gitignore delete mode 100644 src/source_collectors/muckrock/DTOs.py delete mode 100644 src/source_collectors/muckrock/allegheny-county-towns.txt delete mode 100644 src/source_collectors/muckrock/classes/MuckrockCollector.py delete mode 100644 src/source_collectors/muckrock/classes/exceptions/RequestFailureException.py delete mode 100644 src/source_collectors/muckrock/classes/fetch_requests/FOIALoopFetchRequest.py delete mode 100644 src/source_collectors/muckrock/classes/muckrock_fetchers/AgencyFetcher.py delete mode 100644 src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionByIDFetcher.py delete mode 100644 src/source_collectors/muckrock/generate_detailed_muckrock_csv.py delete mode 100644 src/source_collectors/muckrock/schemas.py delete mode 100644 src/source_collectors/muckrock/utils.py delete mode 100644 tests/automated/integration/core/test_example_collector_lifecycle.py rename tests/helpers/{AlembicRunner.py => alembic_runner.py} (100%) rename tests/helpers/{AwaitableBarrier.py => awaitable_barrier.py} (100%) rename tests/helpers/{DBDataCreator.py => db_data_creator.py} (94%) delete mode 100644 tests/manual/unsorted/test_common_crawler_unit.py diff --git a/alembic/env.py b/alembic/env.py index a70a4d5d..7c6f0293 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -5,8 +5,8 @@ from sqlalchemy import engine_from_config from sqlalchemy import pool -from src.db.helper_functions import get_postgres_connection_string -from src.db.models import Base +from src.db.helpers import get_postgres_connection_string +from src.db.models.templates import Base # this is the Alembic Config object, which provides # access to the values within the .ini file in use. diff --git a/apply_migrations.py b/apply_migrations.py index ed3b2f44..6b3188f3 100644 --- a/apply_migrations.py +++ b/apply_migrations.py @@ -1,7 +1,7 @@ from alembic import command from alembic.config import Config -from src.db.helper_functions import get_postgres_connection_string +from src.db.helpers import get_postgres_connection_string def apply_migrations(): print("Applying migrations...") diff --git a/src/api/dependencies.py b/src/api/dependencies.py index 3411340a..53da49fb 100644 --- a/src/api/dependencies.py +++ b/src/api/dependencies.py @@ -1,10 +1,4 @@ -from src.core.AsyncCore import AsyncCore -from src.core.SourceCollectorCore import SourceCollectorCore - - -def get_core() -> SourceCollectorCore: - from src.api.main import app - return app.state.core +from src.core.core import AsyncCore def get_async_core() -> AsyncCore: diff --git a/src/api/routes/__init__.py b/src/api/endpoints/__init__.py similarity index 100% rename from src/api/routes/__init__.py rename to src/api/endpoints/__init__.py diff --git a/src/collector_manager/DTOs/__init__.py b/src/api/endpoints/annotate/__init__.py similarity index 100% rename from src/collector_manager/DTOs/__init__.py rename to src/api/endpoints/annotate/__init__.py diff --git a/src/collector_manager/__init__.py b/src/api/endpoints/annotate/dtos/__init__.py similarity index 100% rename from src/collector_manager/__init__.py rename to src/api/endpoints/annotate/dtos/__init__.py diff --git a/src/core/DTOs/__init__.py b/src/api/endpoints/annotate/dtos/agency/__init__.py similarity index 100% rename from src/core/DTOs/__init__.py rename to src/api/endpoints/annotate/dtos/agency/__init__.py diff --git a/src/api/endpoints/annotate/dtos/agency/post.py b/src/api/endpoints/annotate/dtos/agency/post.py new file mode 100644 index 00000000..1d0ade02 --- /dev/null +++ b/src/api/endpoints/annotate/dtos/agency/post.py @@ -0,0 +1,8 @@ +from typing import Optional + +from pydantic import BaseModel + + +class URLAgencyAnnotationPostInfo(BaseModel): + is_new: bool = False + suggested_agency: Optional[int] = None diff --git a/src/core/DTOs/GetNextURLForAgencyAnnotationResponse.py b/src/api/endpoints/annotate/dtos/agency/response.py similarity index 79% rename from src/core/DTOs/GetNextURLForAgencyAnnotationResponse.py rename to src/api/endpoints/annotate/dtos/agency/response.py index 40bac8c4..abd12877 100644 --- a/src/core/DTOs/GetNextURLForAgencyAnnotationResponse.py +++ b/src/api/endpoints/annotate/dtos/agency/response.py @@ -3,7 +3,7 @@ from pydantic import BaseModel from src.core.enums import SuggestionType -from src.html_tag_collector.DataClassTags import ResponseHTMLInfo +from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo class GetNextURLForAgencyAgencyInfo(BaseModel): suggestion_type: SuggestionType @@ -24,6 +24,3 @@ class GetNextURLForAgencyAnnotationInnerResponse(BaseModel): class GetNextURLForAgencyAnnotationResponse(BaseModel): next_annotation: Optional[GetNextURLForAgencyAnnotationInnerResponse] -class URLAgencyAnnotationPostInfo(BaseModel): - is_new: bool = False - suggested_agency: Optional[int] = None \ No newline at end of file diff --git a/src/core/DTOs/task_data_objects/__init__.py b/src/api/endpoints/annotate/dtos/all/__init__.py similarity index 100% rename from src/core/DTOs/task_data_objects/__init__.py rename to src/api/endpoints/annotate/dtos/all/__init__.py diff --git a/src/core/DTOs/AllAnnotationPostInfo.py b/src/api/endpoints/annotate/dtos/all/post.py similarity index 93% rename from src/core/DTOs/AllAnnotationPostInfo.py rename to src/api/endpoints/annotate/dtos/all/post.py index 6287f074..67b683c9 100644 --- a/src/core/DTOs/AllAnnotationPostInfo.py +++ b/src/api/endpoints/annotate/dtos/all/post.py @@ -2,7 +2,7 @@ from pydantic import BaseModel, model_validator -from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo from src.core.enums import RecordType, SuggestedStatus from src.core.exceptions import FailedValidationException diff --git a/src/core/DTOs/GetNextURLForAllAnnotationResponse.py b/src/api/endpoints/annotate/dtos/all/response.py similarity index 78% rename from src/core/DTOs/GetNextURLForAllAnnotationResponse.py rename to src/api/endpoints/annotate/dtos/all/response.py index 495342ec..0f938337 100644 --- a/src/core/DTOs/GetNextURLForAllAnnotationResponse.py +++ b/src/api/endpoints/annotate/dtos/all/response.py @@ -2,9 +2,9 @@ from pydantic import Field, BaseModel -from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo +from src.api.endpoints.annotate.dtos.agency.response import GetNextURLForAgencyAgencyInfo from src.core.enums import RecordType -from src.html_tag_collector.DataClassTags import ResponseHTMLInfo +from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo class GetNextURLForAllAnnotationInnerResponse(BaseModel): diff --git a/src/core/classes/__init__.py b/src/api/endpoints/annotate/dtos/record_type/__init__.py similarity index 100% rename from src/core/classes/__init__.py rename to src/api/endpoints/annotate/dtos/record_type/__init__.py diff --git a/src/core/DTOs/RecordTypeAnnotationPostInfo.py b/src/api/endpoints/annotate/dtos/record_type/post.py similarity index 100% rename from src/core/DTOs/RecordTypeAnnotationPostInfo.py rename to src/api/endpoints/annotate/dtos/record_type/post.py diff --git a/src/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py b/src/api/endpoints/annotate/dtos/record_type/response.py similarity index 81% rename from src/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py rename to src/api/endpoints/annotate/dtos/record_type/response.py index af8fbae7..0b21eea2 100644 --- a/src/core/DTOs/GetNextRecordTypeAnnotationResponseInfo.py +++ b/src/api/endpoints/annotate/dtos/record_type/response.py @@ -2,9 +2,9 @@ from pydantic import Field, BaseModel -from src.db.DTOs.URLMapping import URLMapping +from src.db.dtos.url_mapping import URLMapping from src.core.enums import RecordType -from src.html_tag_collector.DataClassTags import ResponseHTMLInfo +from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo class GetNextRecordTypeAnnotationResponseInfo(BaseModel): diff --git a/src/core/classes/subtasks/MiscellaneousMetadata/__init__.py b/src/api/endpoints/annotate/dtos/relevance/__init__.py similarity index 100% rename from src/core/classes/subtasks/MiscellaneousMetadata/__init__.py rename to src/api/endpoints/annotate/dtos/relevance/__init__.py diff --git a/src/core/DTOs/RelevanceAnnotationPostInfo.py b/src/api/endpoints/annotate/dtos/relevance/post.py similarity index 100% rename from src/core/DTOs/RelevanceAnnotationPostInfo.py rename to src/api/endpoints/annotate/dtos/relevance/post.py diff --git a/src/core/DTOs/GetNextRelevanceAnnotationResponseInfo.py b/src/api/endpoints/annotate/dtos/relevance/response.py similarity index 79% rename from src/core/DTOs/GetNextRelevanceAnnotationResponseInfo.py rename to src/api/endpoints/annotate/dtos/relevance/response.py index 5a76c692..188fcac7 100644 --- a/src/core/DTOs/GetNextRelevanceAnnotationResponseInfo.py +++ b/src/api/endpoints/annotate/dtos/relevance/response.py @@ -2,8 +2,8 @@ from pydantic import BaseModel, Field -from src.db.DTOs.URLMapping import URLMapping -from src.html_tag_collector.DataClassTags import ResponseHTMLInfo +from src.db.dtos.url_mapping import URLMapping +from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo class GetNextRelevanceAnnotationResponseInfo(BaseModel): diff --git a/src/api/routes/annotate.py b/src/api/endpoints/annotate/routes.py similarity index 86% rename from src/api/routes/annotate.py rename to src/api/endpoints/annotate/routes.py index ceb170bb..f1e2c895 100644 --- a/src/api/routes/annotate.py +++ b/src/api/endpoints/annotate/routes.py @@ -3,16 +3,17 @@ from fastapi import APIRouter, Depends, Path, Query from src.api.dependencies import get_async_core -from src.core.AsyncCore import AsyncCore -from src.core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo -from src.core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo -from src.core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo -from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ - URLAgencyAnnotationPostInfo -from src.core.DTOs.GetNextURLForAllAnnotationResponse import GetNextURLForAllAnnotationResponse -from src.core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo -from src.core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo -from src.security_manager.SecurityManager import get_access_info, AccessInfo +from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.dtos.agency.response import GetNextURLForAgencyAnnotationResponse +from src.api.endpoints.annotate.dtos.all.post import AllAnnotationPostInfo +from src.api.endpoints.annotate.dtos.all.response import GetNextURLForAllAnnotationResponse +from src.api.endpoints.annotate.dtos.record_type.post import RecordTypeAnnotationPostInfo +from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseOuterInfo +from src.api.endpoints.annotate.dtos.relevance.post import RelevanceAnnotationPostInfo +from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseOuterInfo +from src.core.core import AsyncCore +from src.security.manager import get_access_info +from src.security.dtos.access_info import AccessInfo annotate_router = APIRouter( prefix="/annotate", diff --git a/src/core/classes/subtasks/__init__.py b/src/api/endpoints/batch/__init__.py similarity index 100% rename from src/core/classes/subtasks/__init__.py rename to src/api/endpoints/batch/__init__.py diff --git a/src/core/classes/task_operators/__init__.py b/src/api/endpoints/batch/dtos/__init__.py similarity index 100% rename from src/core/classes/task_operators/__init__.py rename to src/api/endpoints/batch/dtos/__init__.py diff --git a/src/db/DTOs/__init__.py b/src/api/endpoints/batch/dtos/get/__init__.py similarity index 100% rename from src/db/DTOs/__init__.py rename to src/api/endpoints/batch/dtos/get/__init__.py diff --git a/src/core/DTOs/GetDuplicatesByBatchResponse.py b/src/api/endpoints/batch/dtos/get/duplicates.py similarity index 72% rename from src/core/DTOs/GetDuplicatesByBatchResponse.py rename to src/api/endpoints/batch/dtos/get/duplicates.py index e9c3a864..bf4838a8 100644 --- a/src/core/DTOs/GetDuplicatesByBatchResponse.py +++ b/src/api/endpoints/batch/dtos/get/duplicates.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from src.db.DTOs.DuplicateInfo import DuplicateInfo +from src.db.dtos.duplicate_info import DuplicateInfo class GetDuplicatesByBatchResponse(BaseModel): diff --git a/src/core/DTOs/GetBatchLogsResponse.py b/src/api/endpoints/batch/dtos/get/logs.py similarity index 68% rename from src/core/DTOs/GetBatchLogsResponse.py rename to src/api/endpoints/batch/dtos/get/logs.py index 05db2370..33c6d19a 100644 --- a/src/core/DTOs/GetBatchLogsResponse.py +++ b/src/api/endpoints/batch/dtos/get/logs.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from src.db.DTOs.LogInfo import LogOutputInfo +from src.db.dtos.log_info import LogOutputInfo class GetBatchLogsResponse(BaseModel): diff --git a/src/core/DTOs/GetBatchStatusResponse.py b/src/api/endpoints/batch/dtos/get/status.py similarity index 69% rename from src/core/DTOs/GetBatchStatusResponse.py rename to src/api/endpoints/batch/dtos/get/status.py index 8ee0da43..a591b88e 100644 --- a/src/core/DTOs/GetBatchStatusResponse.py +++ b/src/api/endpoints/batch/dtos/get/status.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from src.db.DTOs.BatchInfo import BatchInfo +from src.db.dtos.batch_info import BatchInfo class GetBatchStatusResponse(BaseModel): diff --git a/src/core/DTOs/GetURLsByBatchResponse.py b/src/api/endpoints/batch/dtos/get/urls.py similarity index 70% rename from src/core/DTOs/GetURLsByBatchResponse.py rename to src/api/endpoints/batch/dtos/get/urls.py index ddffa1e9..12473130 100644 --- a/src/core/DTOs/GetURLsByBatchResponse.py +++ b/src/api/endpoints/batch/dtos/get/urls.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from src.db.DTOs.URLInfo import URLInfo +from src.db.dtos.url_info import URLInfo class GetURLsByBatchResponse(BaseModel): diff --git a/src/html_tag_collector/__init__.py b/src/api/endpoints/batch/dtos/post/__init__.py similarity index 100% rename from src/html_tag_collector/__init__.py rename to src/api/endpoints/batch/dtos/post/__init__.py diff --git a/src/core/DTOs/MessageResponse.py b/src/api/endpoints/batch/dtos/post/abort.py similarity index 100% rename from src/core/DTOs/MessageResponse.py rename to src/api/endpoints/batch/dtos/post/abort.py diff --git a/src/api/routes/batch.py b/src/api/endpoints/batch/routes.py similarity index 84% rename from src/api/routes/batch.py rename to src/api/endpoints/batch/routes.py index ee895c82..e79f7f14 100644 --- a/src/api/routes/batch.py +++ b/src/api/endpoints/batch/routes.py @@ -4,16 +4,17 @@ from fastapi.params import Query, Depends from src.api.dependencies import get_async_core -from src.db.DTOs.BatchInfo import BatchInfo -from src.collector_manager.enums import CollectorType -from src.core.AsyncCore import AsyncCore -from src.core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse -from src.core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse -from src.core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse -from src.core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse -from src.core.DTOs.MessageResponse import MessageResponse +from src.api.endpoints.batch.dtos.get.duplicates import GetDuplicatesByBatchResponse +from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse +from src.api.endpoints.batch.dtos.get.status import GetBatchStatusResponse +from src.api.endpoints.batch.dtos.get.urls import GetURLsByBatchResponse +from src.api.endpoints.batch.dtos.post.abort import MessageResponse +from src.db.dtos.batch_info import BatchInfo +from src.collectors.enums import CollectorType +from src.core.core import AsyncCore from src.core.enums import BatchStatus -from src.security_manager.SecurityManager import AccessInfo, get_access_info +from src.security.manager import get_access_info +from src.security.dtos.access_info import AccessInfo batch_router = APIRouter( prefix="/batch", diff --git a/src/llm_api_logic/__init__.py b/src/api/endpoints/collector/__init__.py similarity index 100% rename from src/llm_api_logic/__init__.py rename to src/api/endpoints/collector/__init__.py diff --git a/src/pdap_api_client/__init__.py b/src/api/endpoints/collector/dtos/__init__.py similarity index 100% rename from src/pdap_api_client/__init__.py rename to src/api/endpoints/collector/dtos/__init__.py diff --git a/src/core/DTOs/CollectorStartInfo.py b/src/api/endpoints/collector/dtos/collector_start.py similarity index 97% rename from src/core/DTOs/CollectorStartInfo.py rename to src/api/endpoints/collector/dtos/collector_start.py index 1ce3a779..02684968 100644 --- a/src/core/DTOs/CollectorStartInfo.py +++ b/src/api/endpoints/collector/dtos/collector_start.py @@ -1,9 +1,10 @@ from pydantic import BaseModel, Field + class CollectorStartInfo(BaseModel): batch_id: int = Field( description="The batch id of the collector" ) message: str = Field( description="The status message" - ) \ No newline at end of file + ) diff --git a/src/security_manager/__init__.py b/src/api/endpoints/collector/dtos/manual_batch/__init__.py similarity index 100% rename from src/security_manager/__init__.py rename to src/api/endpoints/collector/dtos/manual_batch/__init__.py diff --git a/src/core/DTOs/ManualBatchInputDTO.py b/src/api/endpoints/collector/dtos/manual_batch/post.py similarity index 100% rename from src/core/DTOs/ManualBatchInputDTO.py rename to src/api/endpoints/collector/dtos/manual_batch/post.py diff --git a/src/core/DTOs/ManualBatchResponseDTO.py b/src/api/endpoints/collector/dtos/manual_batch/response.py similarity index 100% rename from src/core/DTOs/ManualBatchResponseDTO.py rename to src/api/endpoints/collector/dtos/manual_batch/response.py diff --git a/src/api/routes/collector.py b/src/api/endpoints/collector/routes.py similarity index 77% rename from src/api/routes/collector.py rename to src/api/endpoints/collector/routes.py index 2d60ec51..6f39d27f 100644 --- a/src/api/routes/collector.py +++ b/src/api/endpoints/collector/routes.py @@ -2,18 +2,20 @@ from fastapi.params import Depends from src.api.dependencies import get_async_core -from src.collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from src.collector_manager.enums import CollectorType -from src.core.AsyncCore import AsyncCore -from src.core.DTOs.CollectorStartInfo import CollectorStartInfo -from src.core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO -from src.core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO -from src.security_manager.SecurityManager import AccessInfo, get_access_info -from src.source_collectors.auto_googler.DTOs import AutoGooglerInputDTO -from src.source_collectors.ckan.DTOs import CKANInputDTO -from src.source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO -from src.source_collectors.muckrock.DTOs import MuckrockCountySearchCollectorInputDTO, \ - MuckrockAllFOIARequestsCollectorInputDTO, MuckrockSimpleSearchCollectorInputDTO +from src.api.endpoints.collector.dtos.collector_start import CollectorStartInfo +from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO +from src.api.endpoints.collector.dtos.manual_batch.response import ManualBatchResponseDTO +from src.collectors.source_collectors.auto_googler.dtos.input import AutoGooglerInputDTO +from src.collectors.source_collectors.common_crawler.input import CommonCrawlerInputDTO +from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO +from src.collectors.enums import CollectorType +from src.core.core import AsyncCore +from src.security.manager import get_access_info +from src.security.dtos.access_info import AccessInfo +from src.collectors.source_collectors.ckan.dtos.input import CKANInputDTO +from src.collectors.source_collectors.muckrock.collectors.all_foia.dto import MuckrockAllFOIARequestsCollectorInputDTO +from src.collectors.source_collectors.muckrock.collectors.county.dto import MuckrockCountySearchCollectorInputDTO +from src.collectors.source_collectors.muckrock.collectors.simple.dto import MuckrockSimpleSearchCollectorInputDTO collector_router = APIRouter( prefix="/collector", diff --git a/src/source_collectors/__init__.py b/src/api/endpoints/metrics/__init__.py similarity index 100% rename from src/source_collectors/__init__.py rename to src/api/endpoints/metrics/__init__.py diff --git a/src/source_collectors/auto_googler/__init__.py b/src/api/endpoints/metrics/dtos/__init__.py similarity index 100% rename from src/source_collectors/auto_googler/__init__.py rename to src/api/endpoints/metrics/dtos/__init__.py diff --git a/src/source_collectors/ckan/__init__.py b/src/api/endpoints/metrics/dtos/get/__init__.py similarity index 100% rename from src/source_collectors/ckan/__init__.py rename to src/api/endpoints/metrics/dtos/get/__init__.py diff --git a/src/core/DTOs/GetMetricsBacklogResponse.py b/src/api/endpoints/metrics/dtos/get/backlog.py similarity index 100% rename from src/core/DTOs/GetMetricsBacklogResponse.py rename to src/api/endpoints/metrics/dtos/get/backlog.py diff --git a/src/source_collectors/common_crawler/__init__.py b/src/api/endpoints/metrics/dtos/get/batches/__init__.py similarity index 100% rename from src/source_collectors/common_crawler/__init__.py rename to src/api/endpoints/metrics/dtos/get/batches/__init__.py diff --git a/src/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py b/src/api/endpoints/metrics/dtos/get/batches/aggregated.py similarity index 90% rename from src/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py rename to src/api/endpoints/metrics/dtos/get/batches/aggregated.py index fad69be5..bc6fa5e0 100644 --- a/src/core/DTOs/GetMetricsBatchesAggregatedResponseDTO.py +++ b/src/api/endpoints/metrics/dtos/get/batches/aggregated.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from src.collector_manager.enums import CollectorType +from src.collectors.enums import CollectorType class GetMetricsBatchesAggregatedInnerResponseDTO(BaseModel): diff --git a/src/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py b/src/api/endpoints/metrics/dtos/get/batches/breakdown.py similarity index 90% rename from src/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py rename to src/api/endpoints/metrics/dtos/get/batches/breakdown.py index d5bdd0f6..3760d6fe 100644 --- a/src/core/DTOs/GetMetricsBatchesBreakdownResponseDTO.py +++ b/src/api/endpoints/metrics/dtos/get/batches/breakdown.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from src.collector_manager.enums import CollectorType +from src.collectors.enums import CollectorType from src.core.enums import BatchStatus diff --git a/src/source_collectors/helpers/__init__.py b/src/api/endpoints/metrics/dtos/get/urls/__init__.py similarity index 100% rename from src/source_collectors/helpers/__init__.py rename to src/api/endpoints/metrics/dtos/get/urls/__init__.py diff --git a/src/core/DTOs/GetMetricsURLsAggregatedResponseDTO.py b/src/api/endpoints/metrics/dtos/get/urls/aggregated.py similarity index 100% rename from src/core/DTOs/GetMetricsURLsAggregatedResponseDTO.py rename to src/api/endpoints/metrics/dtos/get/urls/aggregated.py diff --git a/src/source_collectors/muckrock/__init__.py b/src/api/endpoints/metrics/dtos/get/urls/breakdown/__init__.py similarity index 100% rename from src/source_collectors/muckrock/__init__.py rename to src/api/endpoints/metrics/dtos/get/urls/breakdown/__init__.py diff --git a/src/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py b/src/api/endpoints/metrics/dtos/get/urls/breakdown/pending.py similarity index 100% rename from src/core/DTOs/GetMetricsURLsBreakdownPendingResponseDTO.py rename to src/api/endpoints/metrics/dtos/get/urls/breakdown/pending.py diff --git a/src/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py b/src/api/endpoints/metrics/dtos/get/urls/breakdown/submitted.py similarity index 100% rename from src/core/DTOs/GetMetricsURLsBreakdownSubmittedResponseDTO.py rename to src/api/endpoints/metrics/dtos/get/urls/breakdown/submitted.py diff --git a/src/api/routes/metrics.py b/src/api/endpoints/metrics/routes.py similarity index 73% rename from src/api/routes/metrics.py rename to src/api/endpoints/metrics/routes.py index b90334e8..ac6a3b60 100644 --- a/src/api/routes/metrics.py +++ b/src/api/endpoints/metrics/routes.py @@ -2,14 +2,15 @@ from fastapi.params import Query, Depends from src.api.dependencies import get_async_core -from src.core.AsyncCore import AsyncCore -from src.core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO -from src.core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO -from src.core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO -from src.core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO -from src.core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO -from src.core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO -from src.security_manager.SecurityManager import AccessInfo, get_access_info +from src.api.endpoints.metrics.dtos.get.backlog import GetMetricsBacklogResponseDTO +from src.api.endpoints.metrics.dtos.get.batches.aggregated import GetMetricsBatchesAggregatedResponseDTO +from src.api.endpoints.metrics.dtos.get.batches.breakdown import GetMetricsBatchesBreakdownResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.aggregated import GetMetricsURLsAggregatedResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.breakdown.pending import GetMetricsURLsBreakdownPendingResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.breakdown.submitted import GetMetricsURLsBreakdownSubmittedResponseDTO +from src.core.core import AsyncCore +from src.security.manager import get_access_info +from src.security.dtos.access_info import AccessInfo metrics_router = APIRouter( prefix="/metrics", diff --git a/src/source_collectors/muckrock/classes/__init__.py b/src/api/endpoints/review/__init__.py similarity index 100% rename from src/source_collectors/muckrock/classes/__init__.py rename to src/api/endpoints/review/__init__.py diff --git a/src/source_collectors/muckrock/classes/exceptions/__init__.py b/src/api/endpoints/review/dtos/__init__.py similarity index 100% rename from src/source_collectors/muckrock/classes/exceptions/__init__.py rename to src/api/endpoints/review/dtos/__init__.py diff --git a/src/core/DTOs/FinalReviewApprovalInfo.py b/src/api/endpoints/review/dtos/approve.py similarity index 78% rename from src/core/DTOs/FinalReviewApprovalInfo.py rename to src/api/endpoints/review/dtos/approve.py index f65c7e91..0288c954 100644 --- a/src/core/DTOs/FinalReviewApprovalInfo.py +++ b/src/api/endpoints/review/dtos/approve.py @@ -1,22 +1,10 @@ -from enum import Enum from typing import Optional -from pydantic import BaseModel, Field +from pydantic import Field +from src.api.endpoints.review.dtos.base import FinalReviewBaseInfo from src.core.enums import RecordType -class FinalReviewBaseInfo(BaseModel): - url_id: int = Field( - title="The id of the URL." - ) - -class RejectionReason(Enum): - NOT_RELEVANT = "NOT_RELEVANT" - BROKEN_PAGE_404 = "BROKEN_PAGE" - INDIVIDUAL_RECORD = "INDIVIDUAL_RECORD" - -class FinalReviewRejectionInfo(FinalReviewBaseInfo): - rejection_reason: RejectionReason = RejectionReason.NOT_RELEVANT class FinalReviewApprovalInfo(FinalReviewBaseInfo): record_type: Optional[RecordType] = Field( @@ -54,4 +42,3 @@ class FinalReviewApprovalInfo(FinalReviewBaseInfo): "If none, defers to an existing supplying entity only if that exists.", default=None ) - diff --git a/src/api/endpoints/review/dtos/base.py b/src/api/endpoints/review/dtos/base.py new file mode 100644 index 00000000..555b74a4 --- /dev/null +++ b/src/api/endpoints/review/dtos/base.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel, Field + + +class FinalReviewBaseInfo(BaseModel): + url_id: int = Field( + title="The id of the URL." + ) diff --git a/src/core/DTOs/GetNextURLForFinalReviewResponse.py b/src/api/endpoints/review/dtos/get.py similarity index 94% rename from src/core/DTOs/GetNextURLForFinalReviewResponse.py rename to src/api/endpoints/review/dtos/get.py index 81addf54..4767f824 100644 --- a/src/core/DTOs/GetNextURLForFinalReviewResponse.py +++ b/src/api/endpoints/review/dtos/get.py @@ -2,9 +2,9 @@ from pydantic import BaseModel, Field -from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo +from src.api.endpoints.annotate.dtos.agency.response import GetNextURLForAgencyAgencyInfo from src.core.enums import RecordType, SuggestedStatus -from src.html_tag_collector.DataClassTags import ResponseHTMLInfo +from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo class FinalReviewAnnotationRelevantInfo(BaseModel): auto: Optional[bool] = Field(title="Whether the auto-labeler has marked the URL as relevant") diff --git a/src/api/endpoints/review/dtos/reject.py b/src/api/endpoints/review/dtos/reject.py new file mode 100644 index 00000000..bc9f92c4 --- /dev/null +++ b/src/api/endpoints/review/dtos/reject.py @@ -0,0 +1,6 @@ +from src.api.endpoints.review.dtos.base import FinalReviewBaseInfo +from src.api.endpoints.review.enums import RejectionReason + + +class FinalReviewRejectionInfo(FinalReviewBaseInfo): + rejection_reason: RejectionReason = RejectionReason.NOT_RELEVANT diff --git a/src/api/endpoints/review/enums.py b/src/api/endpoints/review/enums.py new file mode 100644 index 00000000..c5d34f74 --- /dev/null +++ b/src/api/endpoints/review/enums.py @@ -0,0 +1,7 @@ +from enum import Enum + + +class RejectionReason(Enum): + NOT_RELEVANT = "NOT_RELEVANT" + BROKEN_PAGE_404 = "BROKEN_PAGE" + INDIVIDUAL_RECORD = "INDIVIDUAL_RECORD" diff --git a/src/api/routes/review.py b/src/api/endpoints/review/routes.py similarity index 85% rename from src/api/routes/review.py rename to src/api/endpoints/review/routes.py index 51946461..2a037e65 100644 --- a/src/api/routes/review.py +++ b/src/api/endpoints/review/routes.py @@ -3,10 +3,13 @@ from fastapi import APIRouter, Depends, Query from src.api.dependencies import get_async_core -from src.core.AsyncCore import AsyncCore -from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewRejectionInfo -from src.core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse -from src.security_manager.SecurityManager import AccessInfo, require_permission, Permissions +from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo +from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewOuterResponse +from src.api.endpoints.review.dtos.reject import FinalReviewRejectionInfo +from src.core.core import AsyncCore +from src.security.manager import require_permission +from src.security.dtos.access_info import AccessInfo +from src.security.enums import Permissions review_router = APIRouter( prefix="/review", diff --git a/src/api/routes/root.py b/src/api/endpoints/root.py similarity index 78% rename from src/api/routes/root.py rename to src/api/endpoints/root.py index 4298716e..b42a84d3 100644 --- a/src/api/routes/root.py +++ b/src/api/endpoints/root.py @@ -1,6 +1,7 @@ from fastapi import APIRouter, Query, Depends -from src.security_manager.SecurityManager import AccessInfo, get_access_info +from src.security.manager import get_access_info +from src.security.dtos.access_info import AccessInfo root_router = APIRouter(prefix="", tags=["root"]) diff --git a/src/source_collectors/muckrock/classes/fetch_requests/__init__.py b/src/api/endpoints/search/__init__.py similarity index 100% rename from src/source_collectors/muckrock/classes/fetch_requests/__init__.py rename to src/api/endpoints/search/__init__.py diff --git a/src/source_collectors/muckrock/classes/muckrock_fetchers/__init__.py b/src/api/endpoints/search/dtos/__init__.py similarity index 100% rename from src/source_collectors/muckrock/classes/muckrock_fetchers/__init__.py rename to src/api/endpoints/search/dtos/__init__.py diff --git a/src/core/DTOs/SearchURLResponse.py b/src/api/endpoints/search/dtos/response.py similarity index 100% rename from src/core/DTOs/SearchURLResponse.py rename to src/api/endpoints/search/dtos/response.py diff --git a/src/api/routes/search.py b/src/api/endpoints/search/routes.py similarity index 70% rename from src/api/routes/search.py rename to src/api/endpoints/search/routes.py index 7955c0db..a1b576f2 100644 --- a/src/api/routes/search.py +++ b/src/api/endpoints/search/routes.py @@ -1,9 +1,10 @@ from fastapi import APIRouter, Query, Depends from src.api.dependencies import get_async_core -from src.core.AsyncCore import AsyncCore -from src.core.DTOs.SearchURLResponse import SearchURLResponse -from src.security_manager.SecurityManager import get_access_info, AccessInfo +from src.api.endpoints.search.dtos.response import SearchURLResponse +from src.core.core import AsyncCore +from src.security.manager import get_access_info +from src.security.dtos.access_info import AccessInfo search_router = APIRouter(prefix="/search", tags=["search"]) diff --git a/src/api/endpoints/task/__init__.py b/src/api/endpoints/task/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/task/dtos/__init__.py b/src/api/endpoints/task/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/task/dtos/get/__init__.py b/src/api/endpoints/task/dtos/get/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/DTOs/TaskInfo.py b/src/api/endpoints/task/dtos/get/task.py similarity index 78% rename from src/db/DTOs/TaskInfo.py rename to src/api/endpoints/task/dtos/get/task.py index e8adadb1..509ae727 100644 --- a/src/db/DTOs/TaskInfo.py +++ b/src/api/endpoints/task/dtos/get/task.py @@ -3,8 +3,8 @@ from pydantic import BaseModel -from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from src.db.DTOs.URLInfo import URLInfo +from src.db.dtos.url_error_info import URLErrorPydanticInfo +from src.db.dtos.url_info import URLInfo from src.db.enums import TaskType from src.core.enums import BatchStatus diff --git a/src/db/DTOs/GetTaskStatusResponseInfo.py b/src/api/endpoints/task/dtos/get/task_status.py similarity index 100% rename from src/db/DTOs/GetTaskStatusResponseInfo.py rename to src/api/endpoints/task/dtos/get/task_status.py diff --git a/src/core/DTOs/GetTasksResponse.py b/src/api/endpoints/task/dtos/get/tasks.py similarity index 100% rename from src/core/DTOs/GetTasksResponse.py rename to src/api/endpoints/task/dtos/get/tasks.py diff --git a/src/api/routes/task.py b/src/api/endpoints/task/routes.py similarity index 80% rename from src/api/routes/task.py rename to src/api/endpoints/task/routes.py index 2b0ac6d4..e24d6e76 100644 --- a/src/api/routes/task.py +++ b/src/api/endpoints/task/routes.py @@ -3,12 +3,14 @@ from fastapi import APIRouter, Depends, Query, Path from src.api.dependencies import get_async_core -from src.db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo -from src.db.DTOs.TaskInfo import TaskInfo +from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse +from src.api.endpoints.task.dtos.get.task_status import GetTaskStatusResponseInfo +from src.api.endpoints.task.dtos.get.task import TaskInfo from src.db.enums import TaskType -from src.core.AsyncCore import AsyncCore +from src.core.core import AsyncCore from src.core.enums import BatchStatus -from src.security_manager.SecurityManager import AccessInfo, get_access_info +from src.security.manager import get_access_info +from src.security.dtos.access_info import AccessInfo task_router = APIRouter( prefix="/task", @@ -33,7 +35,7 @@ async def get_tasks( ), async_core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info) -): +) -> GetTasksResponse: return await async_core.get_tasks( page=page, task_type=task_type, diff --git a/src/api/endpoints/url/__init__.py b/src/api/endpoints/url/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/url/dtos/__init__.py b/src/api/endpoints/url/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/DTOs/GetURLsResponseInfo.py b/src/api/endpoints/url/dtos/response.py similarity index 94% rename from src/core/DTOs/GetURLsResponseInfo.py rename to src/api/endpoints/url/dtos/response.py index a4f91f4f..5a9eb6fa 100644 --- a/src/core/DTOs/GetURLsResponseInfo.py +++ b/src/api/endpoints/url/dtos/response.py @@ -3,7 +3,7 @@ from pydantic import BaseModel -from src.collector_manager.enums import URLStatus +from src.collectors.enums import URLStatus from src.db.enums import URLMetadataAttributeType, ValidationStatus, ValidationSource class GetURLsResponseErrorInfo(BaseModel): diff --git a/src/api/routes/url.py b/src/api/endpoints/url/routes.py similarity index 77% rename from src/api/routes/url.py rename to src/api/endpoints/url/routes.py index 46b7950e..d746dc30 100644 --- a/src/api/routes/url.py +++ b/src/api/endpoints/url/routes.py @@ -1,9 +1,10 @@ from fastapi import APIRouter, Query, Depends from src.api.dependencies import get_async_core -from src.core.AsyncCore import AsyncCore -from src.core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo -from src.security_manager.SecurityManager import AccessInfo, get_access_info +from src.api.endpoints.url.dtos.response import GetURLsResponseInfo +from src.core.core import AsyncCore +from src.security.manager import get_access_info +from src.security.dtos.access_info import AccessInfo url_router = APIRouter( prefix="/url", diff --git a/src/api/main.py b/src/api/main.py index 227de24c..4b4087ef 100644 --- a/src/api/main.py +++ b/src/api/main.py @@ -2,34 +2,32 @@ import aiohttp import uvicorn +from discord_poster import DiscordPoster from fastapi import FastAPI -from starlette.responses import RedirectResponse - -from src.api.routes.annotate import annotate_router -from src.api.routes.batch import batch_router -from src.api.routes.collector import collector_router -from src.api.routes.metrics import metrics_router -from src.api.routes.review import review_router -from src.api.routes.root import root_router -from src.api.routes.search import search_router -from src.api.routes.task import task_router -from src.api.routes.url import url_router -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DatabaseClient import DatabaseClient -from src.collector_manager.AsyncCollectorManager import AsyncCollectorManager -from src.core.AsyncCore import AsyncCore -from src.core.AsyncCoreLogger import AsyncCoreLogger -from src.core.EnvVarManager import EnvVarManager -from src.core.ScheduledTaskManager import AsyncScheduledTaskManager -from src.core.SourceCollectorCore import SourceCollectorCore -from src.core.TaskManager import TaskManager -from src.html_tag_collector.ResponseParser import HTMLResponseParser -from src.html_tag_collector.RootURLCache import RootURLCache -from src.html_tag_collector.URLRequestInterface import URLRequestInterface from pdap_access_manager import AccessManager -from src.pdap_api_client.PDAPClient import PDAPClient -from discord_poster import DiscordPoster +from starlette.responses import RedirectResponse +from src.api.endpoints.annotate.routes import annotate_router +from src.api.endpoints.batch.routes import batch_router +from src.api.endpoints.collector.routes import collector_router +from src.api.endpoints.metrics.routes import metrics_router +from src.api.endpoints.review.routes import review_router +from src.api.endpoints.root import root_router +from src.api.endpoints.search.routes import search_router +from src.api.endpoints.task.routes import task_router +from src.api.endpoints.url.routes import url_router +from src.collectors.manager import AsyncCollectorManager +from src.core.core import AsyncCore +from src.core.logger import AsyncCoreLogger +from src.core.env_var_manager import EnvVarManager +from src.core.scheduled_task_manager import AsyncScheduledTaskManager +from src.core.tasks.manager import TaskManager +from src.core.tasks.operators.url_html.scraper.parser.core import HTMLResponseParser +from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface +from src.db.client.async_ import AsyncDatabaseClient +from src.db.client.sync import DatabaseClient +from src.core.tasks.operators.url_html.scraper.root_url_cache.core import RootURLCache +from src.pdap_api.client import PDAPClient @asynccontextmanager @@ -48,9 +46,6 @@ async def lifespan(app: FastAPI): session = aiohttp.ClientSession() - source_collector_core = SourceCollectorCore( - db_client=DatabaseClient(), - ) task_manager = TaskManager( adb_client=adb_client, url_request_interface=URLRequestInterface(), @@ -83,7 +78,6 @@ async def lifespan(app: FastAPI): async_scheduled_task_manager = AsyncScheduledTaskManager(async_core=async_core) # Pass dependencies into the app state - app.state.core = source_collector_core app.state.async_core = async_core app.state.async_scheduled_task_manager = async_scheduled_task_manager app.state.logger = core_logger diff --git a/src/collector_manager/CollectorManager.py b/src/collector_manager/CollectorManager.py deleted file mode 100644 index 9fd5a428..00000000 --- a/src/collector_manager/CollectorManager.py +++ /dev/null @@ -1,8 +0,0 @@ -""" -Manager for all collectors -Can start, stop, and get info on running collectors -And manages the retrieval of collector info -""" - -class InvalidCollectorError(Exception): - pass diff --git a/src/collector_manager/collector_mapping.py b/src/collector_manager/collector_mapping.py deleted file mode 100644 index 0aee33b2..00000000 --- a/src/collector_manager/collector_mapping.py +++ /dev/null @@ -1,17 +0,0 @@ -from src.collector_manager.ExampleCollector import ExampleCollector -from src.collector_manager.enums import CollectorType -from src.source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector -from src.source_collectors.ckan import CKANCollector -from src.source_collectors.common_crawler import CommonCrawlerCollector -from src.source_collectors.muckrock.classes.MuckrockCollector import MuckrockSimpleSearchCollector, \ - MuckrockCountyLevelSearchCollector, MuckrockAllFOIARequestsCollector - -COLLECTOR_MAPPING = { - CollectorType.EXAMPLE: ExampleCollector, - CollectorType.AUTO_GOOGLER: AutoGooglerCollector, - CollectorType.COMMON_CRAWLER: CommonCrawlerCollector, - CollectorType.MUCKROCK_SIMPLE_SEARCH: MuckrockSimpleSearchCollector, - CollectorType.MUCKROCK_COUNTY_SEARCH: MuckrockCountyLevelSearchCollector, - CollectorType.MUCKROCK_ALL_SEARCH: MuckrockAllFOIARequestsCollector, - CollectorType.CKAN: CKANCollector -} diff --git a/src/collector_manager/configs/sample_autogoogler_config.json b/src/collector_manager/configs/sample_autogoogler_config.json deleted file mode 100644 index b90724c1..00000000 --- a/src/collector_manager/configs/sample_autogoogler_config.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "api_key": "REPLACE_ME", - "cse_id": "REPLACE_ME", - "urls_per_result": 10, - "queries": [ - "Disco Elysium", - "Dune" - ] -} \ No newline at end of file diff --git a/src/collector_manager/README.md b/src/collectors/README.md similarity index 100% rename from src/collector_manager/README.md rename to src/collectors/README.md diff --git a/src/collectors/__init__.py b/src/collectors/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/collector_manager/enums.py b/src/collectors/enums.py similarity index 100% rename from src/collector_manager/enums.py rename to src/collectors/enums.py diff --git a/src/collectors/exceptions.py b/src/collectors/exceptions.py new file mode 100644 index 00000000..5dd51dce --- /dev/null +++ b/src/collectors/exceptions.py @@ -0,0 +1,2 @@ +class InvalidCollectorError(Exception): + pass diff --git a/src/collector_manager/AsyncCollectorManager.py b/src/collectors/manager.py similarity index 86% rename from src/collector_manager/AsyncCollectorManager.py rename to src/collectors/manager.py index 66819902..b90e03a6 100644 --- a/src/collector_manager/AsyncCollectorManager.py +++ b/src/collectors/manager.py @@ -5,13 +5,13 @@ from fastapi import HTTPException from pydantic import BaseModel -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.collector_manager.AsyncCollectorBase import AsyncCollectorBase -from src.collector_manager.CollectorManager import InvalidCollectorError -from src.collector_manager.collector_mapping import COLLECTOR_MAPPING -from src.collector_manager.enums import CollectorType -from src.core.AsyncCoreLogger import AsyncCoreLogger -from src.core.FunctionTrigger import FunctionTrigger +from src.db.client.async_ import AsyncDatabaseClient +from src.collectors.source_collectors.base import AsyncCollectorBase +from src.collectors.exceptions import InvalidCollectorError +from src.collectors.mapping import COLLECTOR_MAPPING +from src.collectors.enums import CollectorType +from src.core.logger import AsyncCoreLogger +from src.core.function_trigger import FunctionTrigger class AsyncCollectorManager: diff --git a/src/collectors/mapping.py b/src/collectors/mapping.py new file mode 100644 index 00000000..e07cac09 --- /dev/null +++ b/src/collectors/mapping.py @@ -0,0 +1,18 @@ +from src.collectors.enums import CollectorType +from src.collectors.source_collectors.auto_googler.collector import AutoGooglerCollector +from src.collectors.source_collectors.ckan.collector import CKANCollector +from src.collectors.source_collectors.common_crawler.collector import CommonCrawlerCollector +from src.collectors.source_collectors.example.core import ExampleCollector +from src.collectors.source_collectors.muckrock.collectors.all_foia.core import MuckrockAllFOIARequestsCollector +from src.collectors.source_collectors.muckrock.collectors.county.core import MuckrockCountyLevelSearchCollector +from src.collectors.source_collectors.muckrock.collectors.simple.core import MuckrockSimpleSearchCollector + +COLLECTOR_MAPPING = { + CollectorType.EXAMPLE: ExampleCollector, + CollectorType.AUTO_GOOGLER: AutoGooglerCollector, + CollectorType.COMMON_CRAWLER: CommonCrawlerCollector, + CollectorType.MUCKROCK_SIMPLE_SEARCH: MuckrockSimpleSearchCollector, + CollectorType.MUCKROCK_COUNTY_SEARCH: MuckrockCountyLevelSearchCollector, + CollectorType.MUCKROCK_ALL_SEARCH: MuckrockAllFOIARequestsCollector, + CollectorType.CKAN: CKANCollector +} diff --git a/src/source_collectors/README.md b/src/collectors/source_collectors/README.md similarity index 100% rename from src/source_collectors/README.md rename to src/collectors/source_collectors/README.md diff --git a/src/collectors/source_collectors/__init__.py b/src/collectors/source_collectors/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/source_collectors/auto_googler/README.md b/src/collectors/source_collectors/auto_googler/README.md similarity index 100% rename from src/source_collectors/auto_googler/README.md rename to src/collectors/source_collectors/auto_googler/README.md diff --git a/src/collectors/source_collectors/auto_googler/__init__.py b/src/collectors/source_collectors/auto_googler/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/source_collectors/auto_googler/AutoGoogler.py b/src/collectors/source_collectors/auto_googler/auto_googler.py similarity index 77% rename from src/source_collectors/auto_googler/AutoGoogler.py rename to src/collectors/source_collectors/auto_googler/auto_googler.py index b6e5b96d..49cdc2de 100644 --- a/src/source_collectors/auto_googler/AutoGoogler.py +++ b/src/collectors/source_collectors/auto_googler/auto_googler.py @@ -1,6 +1,6 @@ -from src.source_collectors.auto_googler.DTOs import GoogleSearchQueryResultsInnerDTO -from src.source_collectors.auto_googler.GoogleSearcher import GoogleSearcher -from src.source_collectors.auto_googler.SearchConfig import SearchConfig +from src.collectors.source_collectors.auto_googler.dtos.query_results import GoogleSearchQueryResultsInnerDTO +from src.collectors.source_collectors.auto_googler.searcher import GoogleSearcher +from src.collectors.source_collectors.auto_googler.dtos.config import SearchConfig class AutoGoogler: diff --git a/src/source_collectors/auto_googler/AutoGooglerCollector.py b/src/collectors/source_collectors/auto_googler/collector.py similarity index 65% rename from src/source_collectors/auto_googler/AutoGooglerCollector.py rename to src/collectors/source_collectors/auto_googler/collector.py index f9d06265..718bdfb7 100644 --- a/src/source_collectors/auto_googler/AutoGooglerCollector.py +++ b/src/collectors/source_collectors/auto_googler/collector.py @@ -1,12 +1,13 @@ -from src.collector_manager.AsyncCollectorBase import AsyncCollectorBase -from src.collector_manager.enums import CollectorType -from src.core.EnvVarManager import EnvVarManager -from src.core.preprocessors.AutoGooglerPreprocessor import AutoGooglerPreprocessor -from src.source_collectors.auto_googler.AutoGoogler import AutoGoogler -from src.source_collectors.auto_googler.DTOs import AutoGooglerInputDTO, AutoGooglerInnerOutputDTO -from src.source_collectors.auto_googler.GoogleSearcher import GoogleSearcher -from src.source_collectors.auto_googler.SearchConfig import SearchConfig +from src.collectors.source_collectors.base import AsyncCollectorBase +from src.collectors.enums import CollectorType +from src.core.env_var_manager import EnvVarManager +from src.core.preprocessors.autogoogler import AutoGooglerPreprocessor +from src.collectors.source_collectors.auto_googler.auto_googler import AutoGoogler +from src.collectors.source_collectors.auto_googler.dtos.output import AutoGooglerInnerOutputDTO +from src.collectors.source_collectors.auto_googler.dtos.input import AutoGooglerInputDTO +from src.collectors.source_collectors.auto_googler.searcher import GoogleSearcher +from src.collectors.source_collectors.auto_googler.dtos.config import SearchConfig from src.util.helper_functions import base_model_list_dump diff --git a/src/collectors/source_collectors/auto_googler/dtos/__init__.py b/src/collectors/source_collectors/auto_googler/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/source_collectors/auto_googler/SearchConfig.py b/src/collectors/source_collectors/auto_googler/dtos/config.py similarity index 100% rename from src/source_collectors/auto_googler/SearchConfig.py rename to src/collectors/source_collectors/auto_googler/dtos/config.py diff --git a/src/collectors/source_collectors/auto_googler/dtos/input.py b/src/collectors/source_collectors/auto_googler/dtos/input.py new file mode 100644 index 00000000..d97b9f5f --- /dev/null +++ b/src/collectors/source_collectors/auto_googler/dtos/input.py @@ -0,0 +1,15 @@ +from pydantic import BaseModel, Field + + +class AutoGooglerInputDTO(BaseModel): + urls_per_result: int = Field( + description="Maximum number of URLs returned per result. Minimum is 1. Default is 10", + default=10, + ge=1, + le=10 + ) + queries: list[str] = Field( + description="List of queries to search for.", + min_length=1, + max_length=100 + ) diff --git a/src/collectors/source_collectors/auto_googler/dtos/output.py b/src/collectors/source_collectors/auto_googler/dtos/output.py new file mode 100644 index 00000000..efa27eaa --- /dev/null +++ b/src/collectors/source_collectors/auto_googler/dtos/output.py @@ -0,0 +1,16 @@ +from pydantic import BaseModel, Field + + +class AutoGooglerInnerOutputDTO(BaseModel): + title: str = Field(description="The title of the result.") + url: str = Field(description="The URL of the result.") + snippet: str = Field(description="The snippet of the result.") + + +class AutoGooglerResultDTO(BaseModel): + query: str = Field(description="The query used for the search.") + query_results: list[AutoGooglerInnerOutputDTO] = Field(description="List of results for each query.") + + +class AutoGooglerOutputDTO(BaseModel): + results: list[AutoGooglerResultDTO] diff --git a/src/collectors/source_collectors/auto_googler/dtos/query_results.py b/src/collectors/source_collectors/auto_googler/dtos/query_results.py new file mode 100644 index 00000000..920581fb --- /dev/null +++ b/src/collectors/source_collectors/auto_googler/dtos/query_results.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel, Field + + +class GoogleSearchQueryResultsInnerDTO(BaseModel): + url: str = Field(description="The URL of the result.") + title: str = Field(description="The title of the result.") + snippet: str = Field(description="The snippet of the result.") diff --git a/src/collectors/source_collectors/auto_googler/exceptions.py b/src/collectors/source_collectors/auto_googler/exceptions.py new file mode 100644 index 00000000..2a8d7172 --- /dev/null +++ b/src/collectors/source_collectors/auto_googler/exceptions.py @@ -0,0 +1,2 @@ +class QuotaExceededError(Exception): + pass diff --git a/src/source_collectors/auto_googler/GoogleSearcher.py b/src/collectors/source_collectors/auto_googler/searcher.py similarity index 93% rename from src/source_collectors/auto_googler/GoogleSearcher.py rename to src/collectors/source_collectors/auto_googler/searcher.py index c7cf73b8..aa8a0bb6 100644 --- a/src/source_collectors/auto_googler/GoogleSearcher.py +++ b/src/collectors/source_collectors/auto_googler/searcher.py @@ -3,12 +3,10 @@ import aiohttp from googleapiclient.errors import HttpError -from src.source_collectors.auto_googler.DTOs import GoogleSearchQueryResultsInnerDTO +from src.collectors.source_collectors.auto_googler.dtos.query_results import GoogleSearchQueryResultsInnerDTO +from src.collectors.source_collectors.auto_googler.exceptions import QuotaExceededError -class QuotaExceededError(Exception): - pass - class GoogleSearcher: """ A class that provides a GoogleSearcher object for performing searches using the Google Custom Search API. diff --git a/src/collector_manager/AsyncCollectorBase.py b/src/collectors/source_collectors/base.py similarity index 91% rename from src/collector_manager/AsyncCollectorBase.py rename to src/collectors/source_collectors/base.py index 3f890c28..519d2e54 100644 --- a/src/collector_manager/AsyncCollectorBase.py +++ b/src/collectors/source_collectors/base.py @@ -6,14 +6,14 @@ from pydantic import BaseModel -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DTOs.InsertURLsInfo import InsertURLsInfo -from src.db.DTOs.LogInfo import LogInfo -from src.collector_manager.enums import CollectorType -from src.core.AsyncCoreLogger import AsyncCoreLogger -from src.core.FunctionTrigger import FunctionTrigger +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.insert_urls_info import InsertURLsInfo +from src.db.dtos.log_info import LogInfo +from src.collectors.enums import CollectorType +from src.core.logger import AsyncCoreLogger +from src.core.function_trigger import FunctionTrigger from src.core.enums import BatchStatus -from src.core.preprocessors.PreprocessorBase import PreprocessorBase +from src.core.preprocessors.base import PreprocessorBase class AsyncCollectorBase(ABC): diff --git a/src/source_collectors/ckan/README.md b/src/collectors/source_collectors/ckan/README.md similarity index 100% rename from src/source_collectors/ckan/README.md rename to src/collectors/source_collectors/ckan/README.md diff --git a/src/collectors/source_collectors/ckan/__init__.py b/src/collectors/source_collectors/ckan/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/source_collectors/ckan/CKANCollector.py b/src/collectors/source_collectors/ckan/collector.py similarity index 74% rename from src/source_collectors/ckan/CKANCollector.py rename to src/collectors/source_collectors/ckan/collector.py index 2dee4258..3239e83b 100644 --- a/src/source_collectors/ckan/CKANCollector.py +++ b/src/collectors/source_collectors/ckan/collector.py @@ -1,18 +1,19 @@ from pydantic import BaseModel -from src.collector_manager.AsyncCollectorBase import AsyncCollectorBase -from src.collector_manager.enums import CollectorType -from src.core.preprocessors.CKANPreprocessor import CKANPreprocessor -from src.source_collectors.ckan.DTOs import CKANInputDTO -from src.source_collectors.ckan.ckan_scraper_toolkit import ckan_package_search, ckan_group_package_show, \ - ckan_package_search_from_organization -from src.source_collectors.ckan.scrape_ckan_data_portals import perform_search, get_flat_list, deduplicate_entries, \ +from src.collectors.source_collectors.base import AsyncCollectorBase +from src.collectors.enums import CollectorType +from src.core.preprocessors.ckan import CKANPreprocessor +from src.collectors.source_collectors.ckan.dtos.input import CKANInputDTO +from src.collectors.source_collectors.ckan.scraper_toolkit.search_funcs.group import ckan_group_package_search +from src.collectors.source_collectors.ckan.scraper_toolkit.search_funcs.organization import ckan_package_search_from_organization +from src.collectors.source_collectors.ckan.scraper_toolkit.search_funcs.package import ckan_package_search +from src.collectors.source_collectors.ckan.scraper_toolkit.search import perform_search, get_flat_list, deduplicate_entries, \ get_collections, filter_result, parse_result from src.util.helper_functions import base_model_list_dump SEARCH_FUNCTION_MAPPINGS = { "package_search": ckan_package_search, - "group_search": ckan_group_package_show, + "group_search": ckan_group_package_search, "organization_search": ckan_package_search_from_organization } diff --git a/src/source_collectors/ckan/constants.py b/src/collectors/source_collectors/ckan/constants.py similarity index 100% rename from src/source_collectors/ckan/constants.py rename to src/collectors/source_collectors/ckan/constants.py diff --git a/src/collectors/source_collectors/ckan/dtos/__init__.py b/src/collectors/source_collectors/ckan/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/source_collectors/ckan/DTOs.py b/src/collectors/source_collectors/ckan/dtos/input.py similarity index 50% rename from src/source_collectors/ckan/DTOs.py rename to src/collectors/source_collectors/ckan/dtos/input.py index 992bb0b6..b835999e 100644 --- a/src/source_collectors/ckan/DTOs.py +++ b/src/collectors/source_collectors/ckan/dtos/input.py @@ -1,22 +1,8 @@ -from typing import Optional - from pydantic import BaseModel, Field -url_field = Field(description="The base CKAN URL to search from.") - -class CKANPackageSearchDTO(BaseModel): - url: str = url_field - terms: Optional[list[str]] = Field( - description="The search terms to use to refine the packages returned. " - "None will return all packages.", - default=None - ) +from src.collectors.source_collectors.ckan.dtos.search.group_and_organization import GroupAndOrganizationSearchDTO +from src.collectors.source_collectors.ckan.dtos.search.package import CKANPackageSearchDTO -class GroupAndOrganizationSearchDTO(BaseModel): - url: str = url_field - ids: Optional[list[str]] = Field( - description="The ids of the group or organization to get packages from." - ) class CKANInputDTO(BaseModel): package_search: list[CKANPackageSearchDTO] or None = Field( @@ -31,4 +17,3 @@ class CKANInputDTO(BaseModel): description="The list of organization searches to perform.", default=None ) - diff --git a/src/collectors/source_collectors/ckan/dtos/package.py b/src/collectors/source_collectors/ckan/dtos/package.py new file mode 100644 index 00000000..dcb0b903 --- /dev/null +++ b/src/collectors/source_collectors/ckan/dtos/package.py @@ -0,0 +1,32 @@ +from dataclasses import dataclass, field + + +@dataclass +class Package: + """ + A class representing a CKAN package (dataset). + """ + base_url: str = "" + url: str = "" + title: str = "" + agency_name: str = "" + description: str = "" + supplying_entity: str = "" + record_format: list = field(default_factory=lambda: []) + data_portal_type: str = "" + source_last_updated: str = "" + + def to_dict(self): + """ + Returns a dictionary representation of the package. + """ + return { + "source_url": self.url, + "submitted_name": self.title, + "agency_name": self.agency_name, + "description": self.description, + "supplying_entity": self.supplying_entity, + "record_format": self.record_format, + "data_portal_type": self.data_portal_type, + "source_last_updated": self.source_last_updated, + } diff --git a/src/collectors/source_collectors/ckan/dtos/search/__init__.py b/src/collectors/source_collectors/ckan/dtos/search/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/collectors/source_collectors/ckan/dtos/search/_helpers.py b/src/collectors/source_collectors/ckan/dtos/search/_helpers.py new file mode 100644 index 00000000..8c5fce06 --- /dev/null +++ b/src/collectors/source_collectors/ckan/dtos/search/_helpers.py @@ -0,0 +1,3 @@ +from pydantic import Field + +url_field = Field(description="The base CKAN URL to search from.") diff --git a/src/collectors/source_collectors/ckan/dtos/search/group_and_organization.py b/src/collectors/source_collectors/ckan/dtos/search/group_and_organization.py new file mode 100644 index 00000000..da413ce1 --- /dev/null +++ b/src/collectors/source_collectors/ckan/dtos/search/group_and_organization.py @@ -0,0 +1,12 @@ +from typing import Optional + +from pydantic import BaseModel, Field + +from src.collectors.source_collectors.ckan.dtos.search._helpers import url_field + + +class GroupAndOrganizationSearchDTO(BaseModel): + url: str = url_field + ids: Optional[list[str]] = Field( + description="The ids of the group or organization to get packages from." + ) diff --git a/src/collectors/source_collectors/ckan/dtos/search/package.py b/src/collectors/source_collectors/ckan/dtos/search/package.py new file mode 100644 index 00000000..43fcbda5 --- /dev/null +++ b/src/collectors/source_collectors/ckan/dtos/search/package.py @@ -0,0 +1,14 @@ +from typing import Optional + +from pydantic import BaseModel, Field + +from src.collectors.source_collectors.ckan.dtos.search._helpers import url_field + + +class CKANPackageSearchDTO(BaseModel): + url: str = url_field + terms: Optional[list[str]] = Field( + description="The search terms to use to refine the packages returned. " + "None will return all packages.", + default=None + ) diff --git a/src/collectors/source_collectors/ckan/exceptions.py b/src/collectors/source_collectors/ckan/exceptions.py new file mode 100644 index 00000000..90c845e8 --- /dev/null +++ b/src/collectors/source_collectors/ckan/exceptions.py @@ -0,0 +1,2 @@ +class CKANAPIError(Exception): + pass diff --git a/src/collectors/source_collectors/ckan/scraper_toolkit/README.md b/src/collectors/source_collectors/ckan/scraper_toolkit/README.md new file mode 100644 index 00000000..d01ac803 --- /dev/null +++ b/src/collectors/source_collectors/ckan/scraper_toolkit/README.md @@ -0,0 +1 @@ +Toolkit of functions that use ckanapi to retrieve packages from CKAN data portals \ No newline at end of file diff --git a/src/collectors/source_collectors/ckan/scraper_toolkit/__init__.py b/src/collectors/source_collectors/ckan/scraper_toolkit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/source_collectors/ckan/CKANAPIInterface.py b/src/collectors/source_collectors/ckan/scraper_toolkit/_api_interface.py similarity index 82% rename from src/source_collectors/ckan/CKANAPIInterface.py rename to src/collectors/source_collectors/ckan/scraper_toolkit/_api_interface.py index 563d795d..d94c1516 100644 --- a/src/source_collectors/ckan/CKANAPIInterface.py +++ b/src/collectors/source_collectors/ckan/scraper_toolkit/_api_interface.py @@ -1,12 +1,10 @@ -import asyncio from typing import Optional import aiohttp from aiohttp import ContentTypeError +from src.collectors.source_collectors.ckan.exceptions import CKANAPIError -class CKANAPIError(Exception): - pass class CKANAPIInterface: """ @@ -35,12 +33,21 @@ async def _get(self, action: str, params: dict): raise CKANAPIError(f"Request failed: {response.text()}") return data["result"] - async def package_search(self, query: str, rows: int, start: int, **kwargs): + async def package_search( + self, + query: str, + rows: int, + start: int, + **kwargs + ): return await self._get("package_search", { "q": query, "rows": rows, "start": start, **kwargs }) - async def get_organization(self, organization_id: str): + async def get_organization( + self, + organization_id: str + ): try: return await self._get("organization_show", { "id": organization_id, "include_datasets": True @@ -50,7 +57,11 @@ async def get_organization(self, organization_id: str): f"Organization {organization_id} not found for url {self.base_url}. {e}" ) - async def get_group_package(self, group_package_id: str, limit: Optional[int]): + async def get_group_package( + self, + group_package_id: str, + limit: Optional[int] + ): try: return await self._get("group_package_show", { "id": group_package_id, "limit": limit diff --git a/src/source_collectors/ckan/scrape_ckan_data_portals.py b/src/collectors/source_collectors/ckan/scraper_toolkit/search.py similarity index 95% rename from src/source_collectors/ckan/scrape_ckan_data_portals.py rename to src/collectors/source_collectors/ckan/scraper_toolkit/search.py index 48c810f8..5bf686d1 100644 --- a/src/source_collectors/ckan/scrape_ckan_data_portals.py +++ b/src/collectors/source_collectors/ckan/scraper_toolkit/search.py @@ -7,8 +7,9 @@ from from_root import from_root from tqdm import tqdm -from src.source_collectors.ckan.ckan_scraper_toolkit import Package, ckan_collection_search -from src.source_collectors.ckan.constants import CKAN_DATA_TYPES, CKAN_TYPE_CONVERSION_MAPPING +from src.collectors.source_collectors.ckan.scraper_toolkit.search_funcs.collection import ckan_collection_search +from src.collectors.source_collectors.ckan.dtos.package import Package +from src.collectors.source_collectors.ckan.constants import CKAN_DATA_TYPES, CKAN_TYPE_CONVERSION_MAPPING p = from_root(".pydocstyle").parent sys.path.insert(1, str(p)) @@ -21,7 +22,7 @@ async def perform_search( ): """Executes a search function with the given search terms. - :param search_func: The search function to execute. + :param search: The search function to execute. :param search_terms: The list of urls and search terms. In the package search template, this is "url", "terms" In the group and organization search template, this is "url", "ids" diff --git a/src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/__init__.py b/src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/collection.py b/src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/collection.py new file mode 100644 index 00000000..07fcd0f9 --- /dev/null +++ b/src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/collection.py @@ -0,0 +1,131 @@ +import asyncio +import math +from datetime import datetime +from typing import Optional +from urllib.parse import urljoin + +import aiohttp +from bs4 import ResultSet, Tag, BeautifulSoup + +from src.collectors.source_collectors.ckan.dtos.package import Package + + +async def ckan_collection_search(base_url: str, collection_id: str) -> list[Package]: + """Returns a list of CKAN packages from a collection. + + :param base_url: Base URL of the CKAN portal before the collection ID. e.g. "https://catalog.data.gov/dataset/" + :param collection_id: The ID of the parent package. + :return: List of Package objects representing the packages associated with the collection. + """ + url = f"{base_url}?collection_package_id={collection_id}" + soup = await _get_soup(url) + + # Calculate the total number of pages of packages + num_results = int(soup.find(class_="new-results").text.split()[0].replace(",", "")) + pages = math.ceil(num_results / 20) + + packages = await get_packages(base_url, collection_id, pages) + + return packages + + +async def get_packages(base_url, collection_id, pages): + packages = [] + for page in range(1, pages + 1): + url = f"{base_url}?collection_package_id={collection_id}&page={page}" + soup = await _get_soup(url) + + packages = [] + for dataset_content in soup.find_all(class_="dataset-content"): + await asyncio.sleep(1) + package = await _collection_search_get_package_data(dataset_content, base_url) + packages.append(package) + + return packages + + +async def _collection_search_get_package_data(dataset_content, base_url: str): + """Parses the dataset content and returns a Package object.""" + package = Package() + joined_url = urljoin(base_url, dataset_content.a.get("href")) + dataset_soup = await _get_soup(joined_url) + # Determine if the dataset url should be the linked page to an external site or the current site + resources = get_resources(dataset_soup) + button = get_button(resources) + set_url_and_data_portal_type(button, joined_url, package, resources) + package.base_url = base_url + set_title(dataset_soup, package) + set_agency_name(dataset_soup, package) + set_supplying_entity(dataset_soup, package) + set_description(dataset_soup, package) + set_record_format(dataset_content, package) + date = get_data(dataset_soup) + set_source_last_updated(date, package) + + return package + + +def set_source_last_updated(date, package): + package.source_last_updated = datetime.strptime(date, "%B %d, %Y").strftime( + "%Y-%d-%m" + ) + + +def get_data(dataset_soup): + return dataset_soup.find(property="dct:modified").text.strip() + + +def get_button(resources: ResultSet) -> Optional[Tag]: + if len(resources) == 0: + return None + return resources[0].find(class_="btn-group") + + +def get_resources(dataset_soup): + return dataset_soup.find("section", id="dataset-resources").find_all( + class_="resource-item" + ) + + +def set_url_and_data_portal_type( + button: Optional[Tag], + joined_url: str, + package: Package, + resources: ResultSet +): + if len(resources) == 1 and button is not None and button.a.text == "Visit page": + package.url = button.a.get("href") + else: + package.url = joined_url + package.data_portal_type = "CKAN" + + +def set_record_format(dataset_content, package): + package.record_format = [ + format1.text.strip() for format1 in dataset_content.find_all("li") + ] + package.record_format = list(set(package.record_format)) + + +def set_title(dataset_soup, package): + package.title = dataset_soup.find(itemprop="name").text.strip() + + +def set_agency_name(dataset_soup, package): + package.agency_name = dataset_soup.find("h1", class_="heading").text.strip() + + +def set_supplying_entity(dataset_soup, package): + package.supplying_entity = dataset_soup.find(property="dct:publisher").text.strip() + + +def set_description(dataset_soup, package): + package.description = dataset_soup.find(class_="notes").p.text + + +async def _get_soup(url: str) -> BeautifulSoup: + """Returns a BeautifulSoup object for the given URL.""" + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + response.raise_for_status() + return BeautifulSoup(await response.text(), "lxml") diff --git a/src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/group.py b/src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/group.py new file mode 100644 index 00000000..1c0a296d --- /dev/null +++ b/src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/group.py @@ -0,0 +1,21 @@ +import sys +from typing import Optional, Any + +from src.collectors.source_collectors.ckan.scraper_toolkit._api_interface import CKANAPIInterface + + +async def ckan_group_package_search( + base_url: str, id: str, limit: Optional[int] = sys.maxsize +) -> list[dict[str, Any]]: + """Returns a list of CKAN packages from a group. + + :param base_url: Base URL of the CKAN portal. e.g. "https://catalog.data.gov/" + :param id: The group's ID. + :param limit: Maximum number of results to return, defaults to maximum integer. + :return: List of dictionaries representing the packages associated with the group. + """ + interface = CKANAPIInterface(base_url) + results = await interface.get_group_package(group_package_id=id, limit=limit) + # Add the base_url to each package + [package.update(base_url=base_url) for package in results] + return results diff --git a/src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/organization.py b/src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/organization.py new file mode 100644 index 00000000..45ff6767 --- /dev/null +++ b/src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/organization.py @@ -0,0 +1,29 @@ +from typing import Any + +from src.collectors.source_collectors.ckan.scraper_toolkit._api_interface import CKANAPIInterface +from src.collectors.source_collectors.ckan.scraper_toolkit.search_funcs.package import ckan_package_search + + +async def ckan_package_search_from_organization( + base_url: str, organization_id: str +) -> list[dict[str, Any]]: + """Returns a list of CKAN packages from an organization. Only 10 packages are able to be returned. + + :param base_url: Base URL of the CKAN portal. e.g. "https://catalog.data.gov/" + :param organization_id: The organization's ID. + :return: List of dictionaries representing the packages associated with the organization. + """ + interface = CKANAPIInterface(base_url) + organization = await interface.get_organization(organization_id) + packages = organization["packages"] + results = await search_for_results(base_url, packages) + + return results + + +async def search_for_results(base_url, packages): + results = [] + for package in packages: + query = f"id:{package['id']}" + results += await ckan_package_search(base_url=base_url, query=query) + return results diff --git a/src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/package.py b/src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/package.py new file mode 100644 index 00000000..f5737b35 --- /dev/null +++ b/src/collectors/source_collectors/ckan/scraper_toolkit/search_funcs/package.py @@ -0,0 +1,52 @@ +import sys +from typing import Optional, Any + +from src.collectors.source_collectors.ckan.scraper_toolkit._api_interface import CKANAPIInterface + + +async def ckan_package_search( + base_url: str, + query: Optional[str] = None, + rows: Optional[int] = sys.maxsize, + start: Optional[int] = 0, + **kwargs, +) -> list[dict[str, Any]]: + """Performs a CKAN package (dataset) search from a CKAN data catalog URL. + + :param base_url: Base URL to search from. e.g. "https://catalog.data.gov/" + :param query: Search string, defaults to None. None will return all packages. + :param rows: Maximum number of results to return, defaults to maximum integer. + :param start: Offsets the results, defaults to 0. + :param kwargs: See https://docs.ckan.org/en/2.10/api/index.html#ckan.logic.action.get.package_search for additional arguments. + :return: List of dictionaries representing the CKAN package search results. + """ + interface = CKANAPIInterface(base_url) + results = [] + offset = start + rows_max = 1000 # CKAN's package search has a hard limit of 1000 packages returned at a time by default + + while start < rows: + num_rows = rows - start + offset + packages: dict = await interface.package_search( + query=query, rows=num_rows, start=start, **kwargs + ) + add_base_url_to_packages(base_url, packages) + results += packages["results"] + + total_results = packages["count"] + if rows > total_results: + rows = total_results + + result_len = len(packages["results"]) + # Check if the website has a different rows_max value than CKAN's default + if result_len != rows_max and start + rows_max < total_results: + rows_max = result_len + + start += rows_max + + return results + + +def add_base_url_to_packages(base_url, packages): + # Add the base_url to each package + [package.update(base_url=base_url) for package in packages["results"]] diff --git a/src/collectors/source_collectors/common_crawler/__init__.py b/src/collectors/source_collectors/common_crawler/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/source_collectors/common_crawler/CommonCrawlerCollector.py b/src/collectors/source_collectors/common_crawler/collector.py similarity index 64% rename from src/source_collectors/common_crawler/CommonCrawlerCollector.py rename to src/collectors/source_collectors/common_crawler/collector.py index 571a847e..e5e65dfe 100644 --- a/src/source_collectors/common_crawler/CommonCrawlerCollector.py +++ b/src/collectors/source_collectors/common_crawler/collector.py @@ -1,8 +1,8 @@ -from src.collector_manager.AsyncCollectorBase import AsyncCollectorBase -from src.collector_manager.enums import CollectorType -from src.core.preprocessors.CommonCrawlerPreprocessor import CommonCrawlerPreprocessor -from src.source_collectors.common_crawler.CommonCrawler import CommonCrawler -from src.source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO +from src.collectors.source_collectors.base import AsyncCollectorBase +from src.collectors.enums import CollectorType +from src.core.preprocessors.common_crawler import CommonCrawlerPreprocessor +from src.collectors.source_collectors.common_crawler.crawler import CommonCrawler +from src.collectors.source_collectors.common_crawler.input import CommonCrawlerInputDTO class CommonCrawlerCollector(AsyncCollectorBase): diff --git a/src/source_collectors/common_crawler/CommonCrawler.py b/src/collectors/source_collectors/common_crawler/crawler.py similarity index 98% rename from src/source_collectors/common_crawler/CommonCrawler.py rename to src/collectors/source_collectors/common_crawler/crawler.py index 64649b77..ca4f7ca9 100644 --- a/src/source_collectors/common_crawler/CommonCrawler.py +++ b/src/collectors/source_collectors/common_crawler/crawler.py @@ -6,7 +6,7 @@ import aiohttp -from src.source_collectors.common_crawler.utils import URLWithParameters +from src.collectors.source_collectors.common_crawler.utils import URLWithParameters async def async_make_request( search_url: 'URLWithParameters' diff --git a/src/source_collectors/common_crawler/DTOs.py b/src/collectors/source_collectors/common_crawler/input.py similarity index 100% rename from src/source_collectors/common_crawler/DTOs.py rename to src/collectors/source_collectors/common_crawler/input.py diff --git a/src/source_collectors/common_crawler/utils.py b/src/collectors/source_collectors/common_crawler/utils.py similarity index 100% rename from src/source_collectors/common_crawler/utils.py rename to src/collectors/source_collectors/common_crawler/utils.py diff --git a/src/collectors/source_collectors/example/__init__.py b/src/collectors/source_collectors/example/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/collector_manager/ExampleCollector.py b/src/collectors/source_collectors/example/core.py similarity index 70% rename from src/collector_manager/ExampleCollector.py rename to src/collectors/source_collectors/example/core.py index 819bb7a3..988caa09 100644 --- a/src/collector_manager/ExampleCollector.py +++ b/src/collectors/source_collectors/example/core.py @@ -5,11 +5,11 @@ """ import asyncio -from src.collector_manager.AsyncCollectorBase import AsyncCollectorBase -from src.collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from src.collector_manager.DTOs.ExampleOutputDTO import ExampleOutputDTO -from src.collector_manager.enums import CollectorType -from src.core.preprocessors.ExamplePreprocessor import ExamplePreprocessor +from src.collectors.source_collectors.base import AsyncCollectorBase +from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO +from src.collectors.source_collectors.example.dtos.output import ExampleOutputDTO +from src.collectors.enums import CollectorType +from src.core.preprocessors.example import ExamplePreprocessor class ExampleCollector(AsyncCollectorBase): diff --git a/src/collectors/source_collectors/example/dtos/__init__.py b/src/collectors/source_collectors/example/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/collector_manager/DTOs/ExampleInputDTO.py b/src/collectors/source_collectors/example/dtos/input.py similarity index 100% rename from src/collector_manager/DTOs/ExampleInputDTO.py rename to src/collectors/source_collectors/example/dtos/input.py diff --git a/src/collector_manager/DTOs/ExampleOutputDTO.py b/src/collectors/source_collectors/example/dtos/output.py similarity index 100% rename from src/collector_manager/DTOs/ExampleOutputDTO.py rename to src/collectors/source_collectors/example/dtos/output.py diff --git a/src/source_collectors/muckrock/README.md b/src/collectors/source_collectors/muckrock/README.md similarity index 100% rename from src/source_collectors/muckrock/README.md rename to src/collectors/source_collectors/muckrock/README.md diff --git a/src/collectors/source_collectors/muckrock/__init__.py b/src/collectors/source_collectors/muckrock/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/collectors/source_collectors/muckrock/api_interface/__init__.py b/src/collectors/source_collectors/muckrock/api_interface/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/source_collectors/muckrock/MuckrockAPIInterface.py b/src/collectors/source_collectors/muckrock/api_interface/core.py similarity index 80% rename from src/source_collectors/muckrock/MuckrockAPIInterface.py rename to src/collectors/source_collectors/muckrock/api_interface/core.py index 703164fc..3b174cf5 100644 --- a/src/source_collectors/muckrock/MuckrockAPIInterface.py +++ b/src/collectors/source_collectors/muckrock/api_interface/core.py @@ -1,21 +1,10 @@ -from enum import Enum from typing import Optional import requests from aiohttp import ClientSession -from pydantic import BaseModel - - -class AgencyLookupResponseType(Enum): - FOUND = "found" - NOT_FOUND = "not_found" - ERROR = "error" - -class AgencyLookupResponse(BaseModel): - name: Optional[str] - type: AgencyLookupResponseType - error: Optional[str] = None +from src.collectors.source_collectors.muckrock.api_interface.lookup_response import AgencyLookupResponse +from src.collectors.source_collectors.muckrock.enums import AgencyLookupResponseType class MuckrockAPIInterface: diff --git a/src/collectors/source_collectors/muckrock/api_interface/lookup_response.py b/src/collectors/source_collectors/muckrock/api_interface/lookup_response.py new file mode 100644 index 00000000..a714eeb5 --- /dev/null +++ b/src/collectors/source_collectors/muckrock/api_interface/lookup_response.py @@ -0,0 +1,11 @@ +from typing import Optional + +from pydantic import BaseModel + +from src.collectors.source_collectors.muckrock.enums import AgencyLookupResponseType + + +class AgencyLookupResponse(BaseModel): + name: Optional[str] + type: AgencyLookupResponseType + error: Optional[str] = None diff --git a/src/collectors/source_collectors/muckrock/collectors/__init__.py b/src/collectors/source_collectors/muckrock/collectors/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/collectors/source_collectors/muckrock/collectors/all_foia/__init__.py b/src/collectors/source_collectors/muckrock/collectors/all_foia/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/collectors/source_collectors/muckrock/collectors/all_foia/core.py b/src/collectors/source_collectors/muckrock/collectors/all_foia/core.py new file mode 100644 index 00000000..0033d242 --- /dev/null +++ b/src/collectors/source_collectors/muckrock/collectors/all_foia/core.py @@ -0,0 +1,50 @@ +from src.collectors.enums import CollectorType +from src.collectors.source_collectors.base import AsyncCollectorBase +from src.collectors.source_collectors.muckrock.collectors.all_foia.dto import MuckrockAllFOIARequestsCollectorInputDTO +from src.collectors.source_collectors.muckrock.fetchers.foia.core import FOIAFetcher +from src.collectors.source_collectors.muckrock.exceptions import MuckrockNoMoreDataError +from src.core.preprocessors.muckrock import MuckrockPreprocessor + + +class MuckrockAllFOIARequestsCollector(AsyncCollectorBase): + """ + Retrieves urls associated with all Muckrock FOIA requests + """ + collector_type = CollectorType.MUCKROCK_ALL_SEARCH + preprocessor = MuckrockPreprocessor + + async def run_implementation(self) -> None: + dto: MuckrockAllFOIARequestsCollectorInputDTO = self.dto + start_page = dto.start_page + fetcher = FOIAFetcher( + start_page=start_page, + ) + total_pages = dto.total_pages + all_page_data = await self.get_page_data(fetcher, start_page, total_pages) + all_transformed_data = self.transform_data(all_page_data) + self.data = {"urls": all_transformed_data} + + + async def get_page_data(self, fetcher, start_page, total_pages): + all_page_data = [] + for page in range(start_page, start_page + total_pages): + await self.log(f"Fetching page {fetcher.current_page}") + try: + page_data = await fetcher.fetch_next_page() + except MuckrockNoMoreDataError: + await self.log(f"No more data to fetch at page {fetcher.current_page}") + break + if page_data is None: + continue + all_page_data.append(page_data) + return all_page_data + + def transform_data(self, all_page_data): + all_transformed_data = [] + for page_data in all_page_data: + for data in page_data["results"]: + all_transformed_data.append({ + "url": data["absolute_url"], + "metadata": data + }) + return all_transformed_data diff --git a/src/collectors/source_collectors/muckrock/collectors/all_foia/dto.py b/src/collectors/source_collectors/muckrock/collectors/all_foia/dto.py new file mode 100644 index 00000000..8f69c63e --- /dev/null +++ b/src/collectors/source_collectors/muckrock/collectors/all_foia/dto.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel, Field + + +class MuckrockAllFOIARequestsCollectorInputDTO(BaseModel): + start_page: int = Field(description="The page to start from.", ge=1) + total_pages: int = Field(description="The total number of pages to fetch.", ge=1, default=1) diff --git a/src/collectors/source_collectors/muckrock/collectors/county/__init__.py b/src/collectors/source_collectors/muckrock/collectors/county/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/collectors/source_collectors/muckrock/collectors/county/core.py b/src/collectors/source_collectors/muckrock/collectors/county/core.py new file mode 100644 index 00000000..9a429d5d --- /dev/null +++ b/src/collectors/source_collectors/muckrock/collectors/county/core.py @@ -0,0 +1,60 @@ +from src.collectors.enums import CollectorType +from src.collectors.source_collectors.base import AsyncCollectorBase +from src.collectors.source_collectors.muckrock.collectors.county.dto import MuckrockCountySearchCollectorInputDTO +from src.collectors.source_collectors.muckrock.fetch_requests.foia_loop import FOIALoopFetchRequest +from src.collectors.source_collectors.muckrock.fetch_requests.jurisdiction_loop import \ + JurisdictionLoopFetchRequest +from src.collectors.source_collectors.muckrock.fetchers.foia.loop import FOIALoopFetcher +from src.collectors.source_collectors.muckrock.fetchers.jurisdiction.generator import \ + JurisdictionGeneratorFetcher +from src.core.preprocessors.muckrock import MuckrockPreprocessor + + +class MuckrockCountyLevelSearchCollector(AsyncCollectorBase): + """ + Searches for any and all requests in a certain county + """ + collector_type = CollectorType.MUCKROCK_COUNTY_SEARCH + preprocessor = MuckrockPreprocessor + + async def run_implementation(self) -> None: + jurisdiction_ids = await self.get_jurisdiction_ids() + if jurisdiction_ids is None: + await self.log("No jurisdictions found") + return + all_data = await self.get_foia_records(jurisdiction_ids) + formatted_data = self.format_data(all_data) + self.data = {"urls": formatted_data} + + def format_data(self, all_data): + formatted_data = [] + for data in all_data: + formatted_data.append({ + "url": data["absolute_url"], + "metadata": data + }) + return formatted_data + + async def get_foia_records(self, jurisdiction_ids): + all_data = [] + for name, id_ in jurisdiction_ids.items(): + await self.log(f"Fetching records for {name}...") + request = FOIALoopFetchRequest(jurisdiction=id_) + fetcher = FOIALoopFetcher(request) + await fetcher.loop_fetch() + all_data.extend(fetcher.ffm.results) + return all_data + + async def get_jurisdiction_ids(self): + dto: MuckrockCountySearchCollectorInputDTO = self.dto + parent_jurisdiction_id = dto.parent_jurisdiction_id + request = JurisdictionLoopFetchRequest( + level="l", + parent=parent_jurisdiction_id, + town_names=dto.town_names + ) + fetcher = JurisdictionGeneratorFetcher(initial_request=request) + async for message in fetcher.generator_fetch(): + await self.log(message) + jurisdiction_ids = fetcher.jfm.jurisdictions + return jurisdiction_ids diff --git a/src/collectors/source_collectors/muckrock/collectors/county/dto.py b/src/collectors/source_collectors/muckrock/collectors/county/dto.py new file mode 100644 index 00000000..b86c466c --- /dev/null +++ b/src/collectors/source_collectors/muckrock/collectors/county/dto.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel, Field + + +class MuckrockCountySearchCollectorInputDTO(BaseModel): + # TODO: How to determine the ID of a parent jurisdiction? + parent_jurisdiction_id: int = Field(description="The ID of the parent jurisdiction.", ge=1) + town_names: list[str] = Field(description="The names of the towns to search for.", min_length=1) diff --git a/src/collectors/source_collectors/muckrock/collectors/simple/__init__.py b/src/collectors/source_collectors/muckrock/collectors/simple/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/collectors/source_collectors/muckrock/collectors/simple/core.py b/src/collectors/source_collectors/muckrock/collectors/simple/core.py new file mode 100644 index 00000000..2776a69e --- /dev/null +++ b/src/collectors/source_collectors/muckrock/collectors/simple/core.py @@ -0,0 +1,58 @@ +import itertools + +from src.collectors.enums import CollectorType +from src.collectors.source_collectors.base import AsyncCollectorBase +from src.collectors.source_collectors.muckrock.collectors.simple.dto import MuckrockSimpleSearchCollectorInputDTO +from src.collectors.source_collectors.muckrock.collectors.simple.searcher import FOIASearcher +from src.collectors.source_collectors.muckrock.fetchers.foia.core import FOIAFetcher +from src.collectors.source_collectors.muckrock.exceptions import SearchCompleteException +from src.core.preprocessors.muckrock import MuckrockPreprocessor + + +class MuckrockSimpleSearchCollector(AsyncCollectorBase): + """ + Performs searches on MuckRock's database + by matching a search string to title of request + """ + collector_type = CollectorType.MUCKROCK_SIMPLE_SEARCH + preprocessor = MuckrockPreprocessor + + def check_for_count_break(self, count, max_count) -> None: + if max_count is None: + return + if count >= max_count: + raise SearchCompleteException + + async def run_implementation(self) -> None: + fetcher = FOIAFetcher() + dto: MuckrockSimpleSearchCollectorInputDTO = self.dto + searcher = FOIASearcher( + fetcher=fetcher, + search_term=dto.search_string + ) + max_count = dto.max_results + all_results = [] + results_count = 0 + for search_count in itertools.count(): + try: + results = await searcher.get_next_page_results() + all_results.extend(results) + results_count += len(results) + self.check_for_count_break(results_count, max_count) + except SearchCompleteException: + break + await self.log(f"Search {search_count}: Found {len(results)} results") + + await self.log(f"Search Complete. Total results: {results_count}") + self.data = {"urls": self.format_results(all_results)} + + def format_results(self, results: list[dict]) -> list[dict]: + formatted_results = [] + for result in results: + formatted_result = { + "url": result["absolute_url"], + "metadata": result + } + formatted_results.append(formatted_result) + + return formatted_results diff --git a/src/collectors/source_collectors/muckrock/collectors/simple/dto.py b/src/collectors/source_collectors/muckrock/collectors/simple/dto.py new file mode 100644 index 00000000..6a9d9f7f --- /dev/null +++ b/src/collectors/source_collectors/muckrock/collectors/simple/dto.py @@ -0,0 +1,11 @@ +from pydantic import BaseModel, Field + + +class MuckrockSimpleSearchCollectorInputDTO(BaseModel): + search_string: str = Field(description="The search string to use.") + max_results: int or None = Field( + description="The maximum number of results to return. " + "If none, all results will be returned (and may take considerably longer to process).", + ge=1, + default=10 + ) diff --git a/src/source_collectors/muckrock/classes/FOIASearcher.py b/src/collectors/source_collectors/muckrock/collectors/simple/searcher.py similarity index 54% rename from src/source_collectors/muckrock/classes/FOIASearcher.py rename to src/collectors/source_collectors/muckrock/collectors/simple/searcher.py index a6cde337..3bb13617 100644 --- a/src/source_collectors/muckrock/classes/FOIASearcher.py +++ b/src/collectors/source_collectors/muckrock/collectors/simple/searcher.py @@ -1,12 +1,8 @@ from typing import Optional -from tqdm import tqdm +from src.collectors.source_collectors.muckrock.fetchers.foia.core import FOIAFetcher +from src.collectors.source_collectors.muckrock.exceptions import SearchCompleteException -from src.source_collectors.muckrock.classes.muckrock_fetchers import FOIAFetcher - - -class SearchCompleteException(Exception): - pass class FOIASearcher: """ @@ -35,31 +31,6 @@ def filter_results(self, results: list[dict]) -> list[dict]: return [result for result in results if self.search_term.lower() in result["title"].lower()] return results - def update_progress(self, pbar: tqdm, results: list[dict]) -> int: - """ - Updates the progress bar and returns the count of results processed. - """ - num_results = len(results) - pbar.update(num_results) - return num_results - - async def search_to_count(self, max_count: int) -> list[dict]: - """ - Fetches and processes results up to a maximum count. - """ - count = max_count - all_results = [] - with tqdm(total=max_count, desc="Fetching results", unit="result") as pbar: - while count > 0: - try: - results = await self.get_next_page_results() - except SearchCompleteException: - break - - all_results.extend(results) - count -= self.update_progress(pbar, results) - - return all_results async def get_next_page_results(self) -> list[dict]: """ diff --git a/src/source_collectors/muckrock/constants.py b/src/collectors/source_collectors/muckrock/constants.py similarity index 100% rename from src/source_collectors/muckrock/constants.py rename to src/collectors/source_collectors/muckrock/constants.py diff --git a/src/collectors/source_collectors/muckrock/enums.py b/src/collectors/source_collectors/muckrock/enums.py new file mode 100644 index 00000000..ec83c101 --- /dev/null +++ b/src/collectors/source_collectors/muckrock/enums.py @@ -0,0 +1,7 @@ +from enum import Enum + + +class AgencyLookupResponseType(Enum): + FOUND = "found" + NOT_FOUND = "not_found" + ERROR = "error" diff --git a/src/collectors/source_collectors/muckrock/exceptions.py b/src/collectors/source_collectors/muckrock/exceptions.py new file mode 100644 index 00000000..fa0d5201 --- /dev/null +++ b/src/collectors/source_collectors/muckrock/exceptions.py @@ -0,0 +1,11 @@ +class MuckrockNoMoreDataError(Exception): + pass + +class MuckrockServerError(Exception): + pass + +class RequestFailureException(Exception): + pass + +class SearchCompleteException(Exception): + pass diff --git a/src/collectors/source_collectors/muckrock/fetch_requests/__init__.py b/src/collectors/source_collectors/muckrock/fetch_requests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/source_collectors/muckrock/classes/fetch_requests/FetchRequestBase.py b/src/collectors/source_collectors/muckrock/fetch_requests/base.py similarity index 100% rename from src/source_collectors/muckrock/classes/fetch_requests/FetchRequestBase.py rename to src/collectors/source_collectors/muckrock/fetch_requests/base.py diff --git a/src/collectors/source_collectors/muckrock/fetch_requests/foia.py b/src/collectors/source_collectors/muckrock/fetch_requests/foia.py new file mode 100644 index 00000000..1f0bffec --- /dev/null +++ b/src/collectors/source_collectors/muckrock/fetch_requests/foia.py @@ -0,0 +1,6 @@ +from src.collectors.source_collectors.muckrock.fetch_requests.base import FetchRequest + + +class FOIAFetchRequest(FetchRequest): + page: int + page_size: int diff --git a/src/collectors/source_collectors/muckrock/fetch_requests/foia_loop.py b/src/collectors/source_collectors/muckrock/fetch_requests/foia_loop.py new file mode 100644 index 00000000..54c063b6 --- /dev/null +++ b/src/collectors/source_collectors/muckrock/fetch_requests/foia_loop.py @@ -0,0 +1,5 @@ +from src.collectors.source_collectors.muckrock.fetch_requests.base import FetchRequest + + +class FOIALoopFetchRequest(FetchRequest): + jurisdiction: int diff --git a/src/collectors/source_collectors/muckrock/fetch_requests/jurisdiction_by_id.py b/src/collectors/source_collectors/muckrock/fetch_requests/jurisdiction_by_id.py new file mode 100644 index 00000000..7825ade6 --- /dev/null +++ b/src/collectors/source_collectors/muckrock/fetch_requests/jurisdiction_by_id.py @@ -0,0 +1,5 @@ +from src.collectors.source_collectors.muckrock.fetch_requests.base import FetchRequest + + +class JurisdictionByIDFetchRequest(FetchRequest): + jurisdiction_id: int diff --git a/src/source_collectors/muckrock/classes/fetch_requests/JurisdictionLoopFetchRequest.py b/src/collectors/source_collectors/muckrock/fetch_requests/jurisdiction_loop.py similarity index 52% rename from src/source_collectors/muckrock/classes/fetch_requests/JurisdictionLoopFetchRequest.py rename to src/collectors/source_collectors/muckrock/fetch_requests/jurisdiction_loop.py index 7adfbdd4..a39da62d 100644 --- a/src/source_collectors/muckrock/classes/fetch_requests/JurisdictionLoopFetchRequest.py +++ b/src/collectors/source_collectors/muckrock/fetch_requests/jurisdiction_loop.py @@ -1,4 +1,4 @@ -from src.source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest +from src.collectors.source_collectors.muckrock.fetch_requests.base import FetchRequest class JurisdictionLoopFetchRequest(FetchRequest): diff --git a/src/collectors/source_collectors/muckrock/fetchers/__init__.py b/src/collectors/source_collectors/muckrock/fetchers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/collectors/source_collectors/muckrock/fetchers/foia/__init__.py b/src/collectors/source_collectors/muckrock/fetchers/foia/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetcher.py b/src/collectors/source_collectors/muckrock/fetchers/foia/core.py similarity index 73% rename from src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetcher.py rename to src/collectors/source_collectors/muckrock/fetchers/foia/core.py index 5113665c..5717f112 100644 --- a/src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetcher.py +++ b/src/collectors/source_collectors/muckrock/fetchers/foia/core.py @@ -1,16 +1,11 @@ -from src.source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest -from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher import MuckrockFetcher -from src.source_collectors.muckrock.constants import BASE_MUCKROCK_URL +from src.collectors.source_collectors.muckrock.fetch_requests.foia import FOIAFetchRequest +from src.collectors.source_collectors.muckrock.fetchers.templates.fetcher import MuckrockFetcherBase +from src.collectors.source_collectors.muckrock.constants import BASE_MUCKROCK_URL FOIA_BASE_URL = f"{BASE_MUCKROCK_URL}/foia" -class FOIAFetchRequest(FetchRequest): - page: int - page_size: int - - -class FOIAFetcher(MuckrockFetcher): +class FOIAFetcher(MuckrockFetcherBase): """ A fetcher for FOIA requests. Iterates through all FOIA requests available through the MuckRock FOIA API. diff --git a/src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAGeneratorFetcher.py b/src/collectors/source_collectors/muckrock/fetchers/foia/generator.py similarity index 59% rename from src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAGeneratorFetcher.py rename to src/collectors/source_collectors/muckrock/fetchers/foia/generator.py index 952ab03e..8e4fa7ac 100644 --- a/src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAGeneratorFetcher.py +++ b/src/collectors/source_collectors/muckrock/fetchers/foia/generator.py @@ -1,6 +1,6 @@ -from src.source_collectors.muckrock.classes.fetch_requests.FOIALoopFetchRequest import FOIALoopFetchRequest -from src.source_collectors.muckrock.classes.muckrock_fetchers.FOIAFetchManager import FOIAFetchManager -from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockNextFetcher import MuckrockGeneratorFetcher +from src.collectors.source_collectors.muckrock.fetch_requests import FOIALoopFetchRequest +from src.collectors.source_collectors.muckrock.fetchers.foia.manager import FOIAFetchManager +from src.collectors.source_collectors.muckrock.fetchers.templates.generator import MuckrockGeneratorFetcher class FOIAGeneratorFetcher(MuckrockGeneratorFetcher): diff --git a/src/source_collectors/muckrock/classes/muckrock_fetchers/FOIALoopFetcher.py b/src/collectors/source_collectors/muckrock/fetchers/foia/loop.py similarity index 65% rename from src/source_collectors/muckrock/classes/muckrock_fetchers/FOIALoopFetcher.py rename to src/collectors/source_collectors/muckrock/fetchers/foia/loop.py index 31ce7e1e..ec21810e 100644 --- a/src/source_collectors/muckrock/classes/muckrock_fetchers/FOIALoopFetcher.py +++ b/src/collectors/source_collectors/muckrock/fetchers/foia/loop.py @@ -1,8 +1,8 @@ from datasets import tqdm -from src.source_collectors.muckrock.classes.fetch_requests.FOIALoopFetchRequest import FOIALoopFetchRequest -from src.source_collectors.muckrock.classes.muckrock_fetchers.FOIAFetchManager import FOIAFetchManager -from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockLoopFetcher import MuckrockLoopFetcher +from src.collectors.source_collectors.muckrock.fetch_requests.foia_loop import FOIALoopFetchRequest +from src.collectors.source_collectors.muckrock.fetchers.foia.manager import FOIAFetchManager +from src.collectors.source_collectors.muckrock.fetchers.templates.loop import MuckrockLoopFetcher class FOIALoopFetcher(MuckrockLoopFetcher): diff --git a/src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetchManager.py b/src/collectors/source_collectors/muckrock/fetchers/foia/manager.py similarity index 74% rename from src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetchManager.py rename to src/collectors/source_collectors/muckrock/fetchers/foia/manager.py index 1b843efd..7a38caaa 100644 --- a/src/source_collectors/muckrock/classes/muckrock_fetchers/FOIAFetchManager.py +++ b/src/collectors/source_collectors/muckrock/fetchers/foia/manager.py @@ -1,5 +1,5 @@ -from src.source_collectors.muckrock.classes.fetch_requests.FOIALoopFetchRequest import FOIALoopFetchRequest -from src.source_collectors.muckrock.constants import BASE_MUCKROCK_URL +from src.collectors.source_collectors.muckrock.fetch_requests.foia_loop import FOIALoopFetchRequest +from src.collectors.source_collectors.muckrock.constants import BASE_MUCKROCK_URL class FOIAFetchManager: diff --git a/src/collectors/source_collectors/muckrock/fetchers/jurisdiction/__init__.py b/src/collectors/source_collectors/muckrock/fetchers/jurisdiction/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/collectors/source_collectors/muckrock/fetchers/jurisdiction/core.py b/src/collectors/source_collectors/muckrock/fetchers/jurisdiction/core.py new file mode 100644 index 00000000..befbc3e9 --- /dev/null +++ b/src/collectors/source_collectors/muckrock/fetchers/jurisdiction/core.py @@ -0,0 +1,13 @@ +from src.collectors.source_collectors.muckrock.fetch_requests.jurisdiction_by_id import \ + JurisdictionByIDFetchRequest +from src.collectors.source_collectors.muckrock.fetchers.templates.fetcher import MuckrockFetcherBase +from src.collectors.source_collectors.muckrock.constants import BASE_MUCKROCK_URL + + +class JurisdictionByIDFetcher(MuckrockFetcherBase): + + def build_url(self, request: JurisdictionByIDFetchRequest) -> str: + return f"{BASE_MUCKROCK_URL}/jurisdiction/{request.jurisdiction_id}/" + + async def get_jurisdiction(self, jurisdiction_id: int) -> dict: + return await self.fetch(request=JurisdictionByIDFetchRequest(jurisdiction_id=jurisdiction_id)) diff --git a/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionGeneratorFetcher.py b/src/collectors/source_collectors/muckrock/fetchers/jurisdiction/generator.py similarity index 57% rename from src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionGeneratorFetcher.py rename to src/collectors/source_collectors/muckrock/fetchers/jurisdiction/generator.py index 8463e90b..b285e852 100644 --- a/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionGeneratorFetcher.py +++ b/src/collectors/source_collectors/muckrock/fetchers/jurisdiction/generator.py @@ -1,6 +1,6 @@ -from src.source_collectors.muckrock.classes.fetch_requests.JurisdictionLoopFetchRequest import JurisdictionLoopFetchRequest -from src.source_collectors.muckrock.classes.muckrock_fetchers.JurisdictionFetchManager import JurisdictionFetchManager -from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockNextFetcher import MuckrockGeneratorFetcher +from src.collectors.source_collectors.muckrock.fetch_requests.jurisdiction_loop import JurisdictionLoopFetchRequest +from src.collectors.source_collectors.muckrock.fetchers.jurisdiction.manager import JurisdictionFetchManager +from src.collectors.source_collectors.muckrock.fetchers.templates.generator import MuckrockGeneratorFetcher class JurisdictionGeneratorFetcher(MuckrockGeneratorFetcher): diff --git a/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionLoopFetcher.py b/src/collectors/source_collectors/muckrock/fetchers/jurisdiction/loop.py similarity index 77% rename from src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionLoopFetcher.py rename to src/collectors/source_collectors/muckrock/fetchers/jurisdiction/loop.py index 9cd94d85..5ca4b900 100644 --- a/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionLoopFetcher.py +++ b/src/collectors/source_collectors/muckrock/fetchers/jurisdiction/loop.py @@ -1,8 +1,8 @@ from tqdm import tqdm -from src.source_collectors.muckrock.classes.fetch_requests.JurisdictionLoopFetchRequest import JurisdictionLoopFetchRequest -from src.source_collectors.muckrock.classes.muckrock_fetchers.JurisdictionFetchManager import JurisdictionFetchManager -from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockLoopFetcher import MuckrockLoopFetcher +from src.collectors.source_collectors.muckrock.fetch_requests.jurisdiction_loop import JurisdictionLoopFetchRequest +from src.collectors.source_collectors.muckrock.fetchers.jurisdiction.manager import JurisdictionFetchManager +from src.collectors.source_collectors.muckrock.fetchers.templates.loop import MuckrockLoopFetcher class JurisdictionLoopFetcher(MuckrockLoopFetcher): diff --git a/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionFetchManager.py b/src/collectors/source_collectors/muckrock/fetchers/jurisdiction/manager.py similarity index 80% rename from src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionFetchManager.py rename to src/collectors/source_collectors/muckrock/fetchers/jurisdiction/manager.py index 2b789461..dfd27569 100644 --- a/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionFetchManager.py +++ b/src/collectors/source_collectors/muckrock/fetchers/jurisdiction/manager.py @@ -1,5 +1,5 @@ -from src.source_collectors.muckrock.classes.fetch_requests.JurisdictionLoopFetchRequest import JurisdictionLoopFetchRequest -from src.source_collectors.muckrock.constants import BASE_MUCKROCK_URL +from src.collectors.source_collectors.muckrock.fetch_requests.jurisdiction_loop import JurisdictionLoopFetchRequest +from src.collectors.source_collectors.muckrock.constants import BASE_MUCKROCK_URL class JurisdictionFetchManager: diff --git a/src/collectors/source_collectors/muckrock/fetchers/templates/__init__.py b/src/collectors/source_collectors/muckrock/fetchers/templates/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py b/src/collectors/source_collectors/muckrock/fetchers/templates/fetcher.py similarity index 80% rename from src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py rename to src/collectors/source_collectors/muckrock/fetchers/templates/fetcher.py index 57ef54bc..6661c04a 100644 --- a/src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockFetcher.py +++ b/src/collectors/source_collectors/muckrock/fetchers/templates/fetcher.py @@ -4,16 +4,11 @@ import requests import aiohttp -from src.source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest +from src.collectors.source_collectors.muckrock.fetch_requests.base import FetchRequest +from src.collectors.source_collectors.muckrock.exceptions import MuckrockNoMoreDataError, MuckrockServerError -class MuckrockNoMoreDataError(Exception): - pass - -class MuckrockServerError(Exception): - pass - -class MuckrockFetcher(ABC): +class MuckrockFetcherBase(ABC): async def get_async_request(self, url: str) -> dict | None: async with aiohttp.ClientSession() as session: diff --git a/src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockNextFetcher.py b/src/collectors/source_collectors/muckrock/fetchers/templates/generator.py similarity index 77% rename from src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockNextFetcher.py rename to src/collectors/source_collectors/muckrock/fetchers/templates/generator.py index da4c3a8b..3a6a0e01 100644 --- a/src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockNextFetcher.py +++ b/src/collectors/source_collectors/muckrock/fetchers/templates/generator.py @@ -1,5 +1,5 @@ -from src.source_collectors.muckrock.classes.exceptions.RequestFailureException import RequestFailureException -from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockIterFetcherBase import MuckrockIterFetcherBase +from src.collectors.source_collectors.muckrock.fetchers.templates.iter_fetcher import MuckrockIterFetcherBase +from src.collectors.source_collectors.muckrock.exceptions import RequestFailureException class MuckrockGeneratorFetcher(MuckrockIterFetcherBase): diff --git a/src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py b/src/collectors/source_collectors/muckrock/fetchers/templates/iter_fetcher.py similarity index 81% rename from src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py rename to src/collectors/source_collectors/muckrock/fetchers/templates/iter_fetcher.py index e8416a92..cc397242 100644 --- a/src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockIterFetcherBase.py +++ b/src/collectors/source_collectors/muckrock/fetchers/templates/iter_fetcher.py @@ -3,8 +3,8 @@ import aiohttp import requests -from src.source_collectors.muckrock.classes.exceptions.RequestFailureException import RequestFailureException -from src.source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest +from src.collectors.source_collectors.muckrock.fetch_requests.base import FetchRequest +from src.collectors.source_collectors.muckrock.exceptions import RequestFailureException class MuckrockIterFetcherBase(ABC): diff --git a/src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockLoopFetcher.py b/src/collectors/source_collectors/muckrock/fetchers/templates/loop.py similarity index 76% rename from src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockLoopFetcher.py rename to src/collectors/source_collectors/muckrock/fetchers/templates/loop.py index 1573572d..c3b5dc0f 100644 --- a/src/source_collectors/muckrock/classes/muckrock_fetchers/MuckrockLoopFetcher.py +++ b/src/collectors/source_collectors/muckrock/fetchers/templates/loop.py @@ -1,8 +1,8 @@ from abc import abstractmethod from time import sleep -from src.source_collectors.muckrock.classes.exceptions.RequestFailureException import RequestFailureException -from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockIterFetcherBase import MuckrockIterFetcherBase +from src.collectors.source_collectors.muckrock.fetchers.templates.iter_fetcher import MuckrockIterFetcherBase +from src.collectors.source_collectors.muckrock.exceptions import RequestFailureException class MuckrockLoopFetcher(MuckrockIterFetcherBase): diff --git a/src/core/DTOs/AnnotationRequestInfo.py b/src/core/DTOs/AnnotationRequestInfo.py deleted file mode 100644 index 0b63ed71..00000000 --- a/src/core/DTOs/AnnotationRequestInfo.py +++ /dev/null @@ -1,10 +0,0 @@ -from pydantic import BaseModel - -from src.html_tag_collector import ResponseHTMLInfo - - -class AnnotationRequestInfo(BaseModel): - url: str - metadata_id: int - html_info: ResponseHTMLInfo - suggested_value: str \ No newline at end of file diff --git a/src/core/DTOs/BatchStatusInfo.py b/src/core/DTOs/BatchStatusInfo.py deleted file mode 100644 index ad54686e..00000000 --- a/src/core/DTOs/BatchStatusInfo.py +++ /dev/null @@ -1,13 +0,0 @@ -from datetime import datetime - -from pydantic import BaseModel - -from src.collector_manager.enums import CollectorType -from src.core.enums import BatchStatus - - -class BatchStatusInfo(BaseModel): - id: int - date_generated: datetime - strategy: CollectorType - status: BatchStatus \ No newline at end of file diff --git a/src/core/DTOs/CollectionLifecycleInfo.py b/src/core/DTOs/CollectionLifecycleInfo.py deleted file mode 100644 index b1d2673f..00000000 --- a/src/core/DTOs/CollectionLifecycleInfo.py +++ /dev/null @@ -1,11 +0,0 @@ -from pydantic import BaseModel - -from src.db.DTOs.DuplicateInfo import DuplicateInfo -from src.db.DTOs.URLMapping import URLMapping - - -class CollectionLifecycleInfo(BaseModel): - batch_id: int - url_id_mapping: list[URLMapping] - duplicates: list[DuplicateInfo] - message: str diff --git a/src/core/DTOs/CollectorStartParams.py b/src/core/DTOs/CollectorStartParams.py deleted file mode 100644 index 6c7d4a61..00000000 --- a/src/core/DTOs/CollectorStartParams.py +++ /dev/null @@ -1,9 +0,0 @@ -from pydantic import BaseModel - -from src.collector_manager import CollectorType - - -class CollectorStartParams(BaseModel): - collector_type: CollectorType - config: dict - batch_id: int = None diff --git a/src/core/DTOs/MessageCountResponse.py b/src/core/DTOs/MessageCountResponse.py deleted file mode 100644 index 54da2cdf..00000000 --- a/src/core/DTOs/MessageCountResponse.py +++ /dev/null @@ -1,7 +0,0 @@ -from pydantic import Field - -from src.core.DTOs.MessageResponse import MessageResponse - - -class MessageCountResponse(MessageResponse): - count: int = Field(description="The associated count") \ No newline at end of file diff --git a/src/core/DTOs/README.md b/src/core/DTOs/README.md deleted file mode 100644 index a93eddbe..00000000 --- a/src/core/DTOs/README.md +++ /dev/null @@ -1 +0,0 @@ -This directory consists of Data Transfer Objects (DTOs) which are utilized by other core submodules. \ No newline at end of file diff --git a/src/core/DTOs/ResponseURLInfo.py b/src/core/DTOs/ResponseURLInfo.py deleted file mode 100644 index c7f7e364..00000000 --- a/src/core/DTOs/ResponseURLInfo.py +++ /dev/null @@ -1,6 +0,0 @@ -from pydantic import BaseModel - - -class ResponseURLInfo(BaseModel): - url: str - url_id: int \ No newline at end of file diff --git a/src/core/DTOs/task_data_objects/UrlHtmlTDO.py b/src/core/DTOs/task_data_objects/UrlHtmlTDO.py deleted file mode 100644 index 7c222b2a..00000000 --- a/src/core/DTOs/task_data_objects/UrlHtmlTDO.py +++ /dev/null @@ -1,14 +0,0 @@ -from typing import Optional - -from pydantic import BaseModel - -from src.db.DTOs.URLInfo import URLInfo -from src.html_tag_collector.DataClassTags import ResponseHTMLInfo -from src.html_tag_collector.URLRequestInterface import URLResponseInfo - - -class UrlHtmlTDO(BaseModel): - url_info: URLInfo - url_response_info: Optional[URLResponseInfo] = None - html_tag_info: Optional[ResponseHTMLInfo] = None - diff --git a/src/core/SourceCollectorCore.py b/src/core/SourceCollectorCore.py deleted file mode 100644 index b31d8037..00000000 --- a/src/core/SourceCollectorCore.py +++ /dev/null @@ -1,17 +0,0 @@ -from typing import Optional - -from src.db.DatabaseClient import DatabaseClient -from src.core.enums import BatchStatus - - -class SourceCollectorCore: - def __init__( - self, - db_client: Optional[DatabaseClient] = None, - ): - if db_client is None: - db_client = DatabaseClient() - self.db_client = db_client - - def get_status(self, batch_id: int) -> BatchStatus: - return self.db_client.get_batch_status(batch_id) diff --git a/src/core/AsyncCore.py b/src/core/core.py similarity index 77% rename from src/core/AsyncCore.py rename to src/core/core.py index 180c652d..f6151a85 100644 --- a/src/core/AsyncCore.py +++ b/src/core/core.py @@ -3,41 +3,42 @@ from pydantic import BaseModel from sqlalchemy.exc import IntegrityError -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DTOs.BatchInfo import BatchInfo -from src.db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo +from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.dtos.agency.response import GetNextURLForAgencyAnnotationResponse +from src.api.endpoints.annotate.dtos.all.post import AllAnnotationPostInfo +from src.api.endpoints.annotate.dtos.all.response import GetNextURLForAllAnnotationResponse +from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseOuterInfo +from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseOuterInfo +from src.api.endpoints.batch.dtos.get.duplicates import GetDuplicatesByBatchResponse +from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse +from src.api.endpoints.batch.dtos.get.status import GetBatchStatusResponse +from src.api.endpoints.batch.dtos.get.urls import GetURLsByBatchResponse +from src.api.endpoints.batch.dtos.post.abort import MessageResponse +from src.api.endpoints.collector.dtos.collector_start import CollectorStartInfo +from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO +from src.api.endpoints.collector.dtos.manual_batch.response import ManualBatchResponseDTO +from src.api.endpoints.metrics.dtos.get.backlog import GetMetricsBacklogResponseDTO +from src.api.endpoints.metrics.dtos.get.batches.aggregated import GetMetricsBatchesAggregatedResponseDTO +from src.api.endpoints.metrics.dtos.get.batches.breakdown import GetMetricsBatchesBreakdownResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.aggregated import GetMetricsURLsAggregatedResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.breakdown.pending import GetMetricsURLsBreakdownPendingResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.breakdown.submitted import GetMetricsURLsBreakdownSubmittedResponseDTO +from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo +from src.api.endpoints.review.enums import RejectionReason +from src.api.endpoints.search.dtos.response import SearchURLResponse +from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse +from src.api.endpoints.url.dtos.response import GetURLsResponseInfo +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.batch_info import BatchInfo +from src.api.endpoints.task.dtos.get.task_status import GetTaskStatusResponseInfo from src.db.enums import TaskType -from src.collector_manager.AsyncCollectorManager import AsyncCollectorManager -from src.collector_manager.enums import CollectorType -from src.core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo -from src.core.DTOs.CollectorStartInfo import CollectorStartInfo -from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason -from src.core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse -from src.core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse -from src.core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse -from src.core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO -from src.core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO -from src.core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO -from src.core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO -from src.core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO -from src.core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO -from src.core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo -from src.core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo -from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ - URLAgencyAnnotationPostInfo -from src.core.DTOs.GetNextURLForAllAnnotationResponse import GetNextURLForAllAnnotationResponse -from src.core.DTOs.GetTasksResponse import GetTasksResponse -from src.core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse -from src.core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo -from src.core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO -from src.core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO -from src.core.DTOs.MessageResponse import MessageResponse -from src.core.DTOs.SearchURLResponse import SearchURLResponse -from src.core.TaskManager import TaskManager -from src.core.classes.ErrorManager import ErrorManager +from src.collectors.manager import AsyncCollectorManager +from src.collectors.enums import CollectorType +from src.core.tasks.manager import TaskManager +from src.core.error_manager.core import ErrorManager from src.core.enums import BatchStatus, RecordType, AnnotationType, SuggestedStatus -from src.security_manager.SecurityManager import AccessInfo +from src.security.dtos.access_info import AccessInfo class AsyncCore: @@ -76,6 +77,9 @@ async def get_duplicate_urls_by_batch(self, batch_id: int, page: int = 1) -> Get dup_infos = await self.adb_client.get_duplicates_by_batch_id(batch_id, page=page) return GetDuplicatesByBatchResponse(duplicates=dup_infos) + async def get_batch_status(self, batch_id: int) -> BatchInfo: + return await self.adb_client.get_batch_by_id(batch_id) + async def get_batch_statuses( self, collector_type: Optional[CollectorType], @@ -103,7 +107,7 @@ async def initiate_collector( collector_type: CollectorType, user_id: int, dto: Optional[BaseModel] = None, - ): + ) -> CollectorStartInfo: """ Reserves a batch ID from the database and starts the requisite collector @@ -163,7 +167,7 @@ async def submit_url_relevance_annotation( url_id=url_id, suggested_status=suggested_status ) - except IntegrityError as e: + except IntegrityError: return await ErrorManager.raise_annotation_exists_error( annotation_type=AnnotationType.RELEVANCE, url_id=url_id @@ -207,7 +211,7 @@ async def submit_url_record_type_annotation( url_id=url_id, record_type=record_type ) - except IntegrityError as e: + except IntegrityError: return await ErrorManager.raise_annotation_exists_error( annotation_type=AnnotationType.RECORD_TYPE, url_id=url_id diff --git a/src/core/EnvVarManager.py b/src/core/env_var_manager.py similarity index 100% rename from src/core/EnvVarManager.py rename to src/core/env_var_manager.py diff --git a/src/core/error_manager/__init__.py b/src/core/error_manager/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/classes/ErrorManager.py b/src/core/error_manager/core.py similarity index 82% rename from src/core/classes/ErrorManager.py rename to src/core/error_manager/core.py index 5a779a80..bd93ad07 100644 --- a/src/core/classes/ErrorManager.py +++ b/src/core/error_manager/core.py @@ -1,18 +1,10 @@ -from enum import Enum from http import HTTPStatus from fastapi import HTTPException -from pydantic import BaseModel from src.core.enums import AnnotationType - - -class ErrorTypes(Enum): - ANNOTATION_EXISTS = "ANNOTATION_EXISTS" - -class ErrorFormat(BaseModel): - code: ErrorTypes - message: str +from src.core.error_manager.dtos.error_format import ErrorFormat +from src.core.error_manager.enums import ErrorTypes class ErrorManager: diff --git a/src/core/error_manager/dtos/__init__.py b/src/core/error_manager/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/error_manager/dtos/error_format.py b/src/core/error_manager/dtos/error_format.py new file mode 100644 index 00000000..d9fac337 --- /dev/null +++ b/src/core/error_manager/dtos/error_format.py @@ -0,0 +1,8 @@ +from pydantic import BaseModel + +from src.core.error_manager.enums import ErrorTypes + + +class ErrorFormat(BaseModel): + code: ErrorTypes + message: str diff --git a/src/core/error_manager/enums.py b/src/core/error_manager/enums.py new file mode 100644 index 00000000..0bc62f3b --- /dev/null +++ b/src/core/error_manager/enums.py @@ -0,0 +1,5 @@ +from enum import Enum + + +class ErrorTypes(Enum): + ANNOTATION_EXISTS = "ANNOTATION_EXISTS" diff --git a/src/core/FunctionTrigger.py b/src/core/function_trigger.py similarity index 100% rename from src/core/FunctionTrigger.py rename to src/core/function_trigger.py diff --git a/src/core/helpers.py b/src/core/helpers.py index 038e14b9..eb90f597 100644 --- a/src/core/helpers.py +++ b/src/core/helpers.py @@ -1,8 +1,8 @@ -from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.enums import SuggestionType from src.core.exceptions import MatchAgencyError -from src.pdap_api_client.DTOs import MatchAgencyResponse -from src.pdap_api_client.enums import MatchAgencyResponseStatus +from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse +from src.pdap_api.enums import MatchAgencyResponseStatus def process_match_agency_response_to_suggestions( diff --git a/src/core/AsyncCoreLogger.py b/src/core/logger.py similarity index 95% rename from src/core/AsyncCoreLogger.py rename to src/core/logger.py index e3cdc4b2..e0c9ccdb 100644 --- a/src/core/AsyncCoreLogger.py +++ b/src/core/logger.py @@ -1,7 +1,7 @@ import asyncio -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DTOs.LogInfo import LogInfo +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.log_info import LogInfo class AsyncCoreLogger: diff --git a/src/core/preprocessors/AutoGooglerPreprocessor.py b/src/core/preprocessors/autogoogler.py similarity index 87% rename from src/core/preprocessors/AutoGooglerPreprocessor.py rename to src/core/preprocessors/autogoogler.py index d2d5b1e5..b92674c2 100644 --- a/src/core/preprocessors/AutoGooglerPreprocessor.py +++ b/src/core/preprocessors/autogoogler.py @@ -1,7 +1,7 @@ from typing import List -from src.db.DTOs.URLInfo import URLInfo -from src.core.preprocessors.PreprocessorBase import PreprocessorBase +from src.db.dtos.url_info import URLInfo +from src.core.preprocessors.base import PreprocessorBase class AutoGooglerPreprocessor(PreprocessorBase): diff --git a/src/core/preprocessors/PreprocessorBase.py b/src/core/preprocessors/base.py similarity index 91% rename from src/core/preprocessors/PreprocessorBase.py rename to src/core/preprocessors/base.py index 30f73eed..a4bfa1ae 100644 --- a/src/core/preprocessors/PreprocessorBase.py +++ b/src/core/preprocessors/base.py @@ -2,7 +2,7 @@ from abc import ABC from typing import List -from src.db.DTOs.URLInfo import URLInfo +from src.db.dtos.url_info import URLInfo class PreprocessorBase(ABC): diff --git a/src/core/preprocessors/CKANPreprocessor.py b/src/core/preprocessors/ckan.py similarity index 93% rename from src/core/preprocessors/CKANPreprocessor.py rename to src/core/preprocessors/ckan.py index 271f6b3f..00cda360 100644 --- a/src/core/preprocessors/CKANPreprocessor.py +++ b/src/core/preprocessors/ckan.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import List -from src.db.DTOs.URLInfo import URLInfo +from src.db.dtos.url_info import URLInfo class CKANPreprocessor: diff --git a/src/core/preprocessors/CommonCrawlerPreprocessor.py b/src/core/preprocessors/common_crawler.py similarity index 74% rename from src/core/preprocessors/CommonCrawlerPreprocessor.py rename to src/core/preprocessors/common_crawler.py index 131d8db3..3592824e 100644 --- a/src/core/preprocessors/CommonCrawlerPreprocessor.py +++ b/src/core/preprocessors/common_crawler.py @@ -1,7 +1,7 @@ from typing import List -from src.db.DTOs.URLInfo import URLInfo -from src.core.preprocessors.PreprocessorBase import PreprocessorBase +from src.db.dtos.url_info import URLInfo +from src.core.preprocessors.base import PreprocessorBase class CommonCrawlerPreprocessor(PreprocessorBase): diff --git a/src/core/preprocessors/ExamplePreprocessor.py b/src/core/preprocessors/example.py similarity index 64% rename from src/core/preprocessors/ExamplePreprocessor.py rename to src/core/preprocessors/example.py index 3bf93455..609b112f 100644 --- a/src/core/preprocessors/ExamplePreprocessor.py +++ b/src/core/preprocessors/example.py @@ -1,8 +1,8 @@ from typing import List -from src.db.DTOs.URLInfo import URLInfo -from src.collector_manager.DTOs.ExampleOutputDTO import ExampleOutputDTO -from src.core.preprocessors.PreprocessorBase import PreprocessorBase +from src.db.dtos.url_info import URLInfo +from src.collectors.source_collectors.example.dtos.output import ExampleOutputDTO +from src.core.preprocessors.base import PreprocessorBase class ExamplePreprocessor(PreprocessorBase): diff --git a/src/core/preprocessors/MuckrockPreprocessor.py b/src/core/preprocessors/muckrock.py similarity index 77% rename from src/core/preprocessors/MuckrockPreprocessor.py rename to src/core/preprocessors/muckrock.py index 503004e9..7330ece4 100644 --- a/src/core/preprocessors/MuckrockPreprocessor.py +++ b/src/core/preprocessors/muckrock.py @@ -1,7 +1,7 @@ from typing import List -from src.db.DTOs.URLInfo import URLInfo -from src.core.preprocessors.PreprocessorBase import PreprocessorBase +from src.db.dtos.url_info import URLInfo +from src.core.preprocessors.base import PreprocessorBase class MuckrockPreprocessor(PreprocessorBase): diff --git a/src/core/ScheduledTaskManager.py b/src/core/scheduled_task_manager.py similarity index 97% rename from src/core/ScheduledTaskManager.py rename to src/core/scheduled_task_manager.py index 22502e2d..3f9faf32 100644 --- a/src/core/ScheduledTaskManager.py +++ b/src/core/scheduled_task_manager.py @@ -2,7 +2,7 @@ from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.interval import IntervalTrigger -from src.core.AsyncCore import AsyncCore +from src.core.core import AsyncCore class AsyncScheduledTaskManager: diff --git a/src/core/DTOs/task_data_objects/README.md b/src/core/tasks/README.md similarity index 88% rename from src/core/DTOs/task_data_objects/README.md rename to src/core/tasks/README.md index 3d2fc5ae..55e2225b 100644 --- a/src/core/DTOs/task_data_objects/README.md +++ b/src/core/tasks/README.md @@ -1 +1,4 @@ + +## Terminology + Task Data Objects (or TDOs) are data transfer objects (DTOs) used within a given task operation. Each Task type has one type of TDO. \ No newline at end of file diff --git a/src/core/tasks/__init__.py b/src/core/tasks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/dtos/__init__.py b/src/core/tasks/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/DTOs/TaskOperatorRunInfo.py b/src/core/tasks/dtos/run_info.py similarity index 68% rename from src/core/DTOs/TaskOperatorRunInfo.py rename to src/core/tasks/dtos/run_info.py index 6b5c29e0..1eec7198 100644 --- a/src/core/DTOs/TaskOperatorRunInfo.py +++ b/src/core/tasks/dtos/run_info.py @@ -1,11 +1,9 @@ -from enum import Enum from typing import Optional from pydantic import BaseModel -class TaskOperatorOutcome(Enum): - SUCCESS = "success" - ERROR = "error" +from src.core.tasks.enums import TaskOperatorOutcome + class TaskOperatorRunInfo(BaseModel): task_id: Optional[int] diff --git a/src/core/tasks/enums.py b/src/core/tasks/enums.py new file mode 100644 index 00000000..d27b9a25 --- /dev/null +++ b/src/core/tasks/enums.py @@ -0,0 +1,6 @@ +from enum import Enum + + +class TaskOperatorOutcome(Enum): + SUCCESS = "success" + ERROR = "error" diff --git a/src/core/TaskManager.py b/src/core/tasks/manager.py similarity index 81% rename from src/core/TaskManager.py rename to src/core/tasks/manager.py index 17008d44..215a7989 100644 --- a/src/core/TaskManager.py +++ b/src/core/tasks/manager.py @@ -1,25 +1,26 @@ import logging -from src.core.classes.task_operators.URL404ProbeTaskOperator import URL404ProbeTaskOperator -from src.core.classes.task_operators.URLDuplicateTaskOperator import URLDuplicateTaskOperator -from src.source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DTOs.TaskInfo import TaskInfo +from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse +from src.collectors.source_collectors.muckrock.api_interface.core import MuckrockAPIInterface +from src.core.tasks.operators.agency_identification.core import AgencyIdentificationTaskOperator +from src.core.tasks.operators.base import TaskOperatorBase +from src.core.tasks.operators.submit_approved_url.core import SubmitApprovedURLTaskOperator +from src.core.tasks.operators.url_404_probe.core import URL404ProbeTaskOperator +from src.core.tasks.operators.url_duplicate.core import URLDuplicateTaskOperator +from src.core.tasks.operators.url_html.core import URLHTMLTaskOperator +from src.core.tasks.operators.url_html.scraper.parser.core import HTMLResponseParser +from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface +from src.core.tasks.operators.url_miscellaneous_metadata.core import URLMiscellaneousMetadataTaskOperator +from src.db.client.async_ import AsyncDatabaseClient +from src.api.endpoints.task.dtos.get.task import TaskInfo from src.db.enums import TaskType -from src.core.DTOs.GetTasksResponse import GetTasksResponse -from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome -from src.core.FunctionTrigger import FunctionTrigger -from src.core.classes.task_operators.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator -from src.core.classes.task_operators.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator -from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from src.core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator -from src.core.classes.task_operators.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator -from src.core.classes.task_operators.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator +from src.core.tasks.dtos.run_info import TaskOperatorRunInfo +from src.core.tasks.enums import TaskOperatorOutcome +from src.core.function_trigger import FunctionTrigger +from src.core.tasks.operators.record_type.core import URLRecordTypeTaskOperator from src.core.enums import BatchStatus -from src.html_tag_collector.ResponseParser import HTMLResponseParser -from src.html_tag_collector.URLRequestInterface import URLRequestInterface -from src.llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier -from src.pdap_api_client.PDAPClient import PDAPClient +from src.core.tasks.operators.record_type.llm_api.record_classifier.openai import OpenAIRecordClassifier +from src.pdap_api.client import PDAPClient from discord_poster import DiscordPoster TASK_REPEAT_THRESHOLD = 20 @@ -173,7 +174,7 @@ async def handle_task_error(self, run_info: TaskOperatorRunInfo): task_id=run_info.task_id, error=run_info.message ) - await self.discord_poster.post_to_discord( + self.discord_poster.post_to_discord( message=f"Task {run_info.task_id} ({self.task_status.value}) failed with error.") async def get_task_info(self, task_id: int) -> TaskInfo: diff --git a/src/core/tasks/operators/__init__.py b/src/core/tasks/operators/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/operators/agency_identification/__init__.py b/src/core/tasks/operators/agency_identification/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/classes/task_operators/AgencyIdentificationTaskOperator.py b/src/core/tasks/operators/agency_identification/core.py similarity index 81% rename from src/core/classes/task_operators/AgencyIdentificationTaskOperator.py rename to src/core/tasks/operators/agency_identification/core.py index 80b09d56..0904cd79 100644 --- a/src/core/classes/task_operators/AgencyIdentificationTaskOperator.py +++ b/src/core/tasks/operators/agency_identification/core.py @@ -1,19 +1,19 @@ from aiohttp import ClientSession -from src.source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from src.collectors.source_collectors.muckrock.api_interface.core import MuckrockAPIInterface +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.url_error_info import URLErrorPydanticInfo from src.db.enums import TaskType -from src.collector_manager.enums import CollectorType -from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from src.core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO -from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from src.core.classes.subtasks.AutoGooglerAgencyIdentificationSubtask import AutoGooglerAgencyIdentificationSubtask -from src.core.classes.subtasks.CKANAgencyIdentificationSubtask import CKANAgencyIdentificationSubtask -from src.core.classes.subtasks.CommonCrawlerAgencyIdentificationSubtask import CommonCrawlerAgencyIdentificationSubtask -from src.core.classes.subtasks.MuckrockAgencyIdentificationSubtask import MuckrockAgencyIdentificationSubtask +from src.collectors.enums import CollectorType +from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo +from src.core.tasks.operators.agency_identification.dtos.tdo import AgencyIdentificationTDO +from src.core.tasks.operators.base import TaskOperatorBase +from src.core.tasks.subtasks.agency_identification.auto_googler import AutoGooglerAgencyIdentificationSubtask +from src.core.tasks.subtasks.agency_identification.ckan import CKANAgencyIdentificationSubtask +from src.core.tasks.subtasks.agency_identification.common_crawler import CommonCrawlerAgencyIdentificationSubtask +from src.core.tasks.subtasks.agency_identification.muckrock import MuckrockAgencyIdentificationSubtask from src.core.enums import SuggestionType -from src.pdap_api_client.PDAPClient import PDAPClient +from src.pdap_api.client import PDAPClient # TODO: Validate with Manual Tests @@ -63,6 +63,7 @@ async def get_subtask(self, collector_type: CollectorType): return CKANAgencyIdentificationSubtask( pdap_client=self.pdap_client ) + return None @staticmethod async def run_subtask(subtask, url_id, collector_metadata) -> list[URLAgencySuggestionInfo]: diff --git a/src/core/tasks/operators/agency_identification/dtos/__init__.py b/src/core/tasks/operators/agency_identification/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/DTOs/URLAgencySuggestionInfo.py b/src/core/tasks/operators/agency_identification/dtos/suggestion.py similarity index 100% rename from src/core/DTOs/URLAgencySuggestionInfo.py rename to src/core/tasks/operators/agency_identification/dtos/suggestion.py diff --git a/src/core/DTOs/task_data_objects/AgencyIdentificationTDO.py b/src/core/tasks/operators/agency_identification/dtos/tdo.py similarity index 78% rename from src/core/DTOs/task_data_objects/AgencyIdentificationTDO.py rename to src/core/tasks/operators/agency_identification/dtos/tdo.py index cc62430f..70ff1ae5 100644 --- a/src/core/DTOs/task_data_objects/AgencyIdentificationTDO.py +++ b/src/core/tasks/operators/agency_identification/dtos/tdo.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from src.collector_manager.enums import CollectorType +from src.collectors.enums import CollectorType class AgencyIdentificationTDO(BaseModel): diff --git a/src/core/classes/task_operators/TaskOperatorBase.py b/src/core/tasks/operators/base.py similarity index 93% rename from src/core/classes/task_operators/TaskOperatorBase.py rename to src/core/tasks/operators/base.py index 7e6df091..764b3d4f 100644 --- a/src/core/classes/task_operators/TaskOperatorBase.py +++ b/src/core/tasks/operators/base.py @@ -1,8 +1,9 @@ import traceback from abc import ABC, abstractmethod -from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.client.async_ import AsyncDatabaseClient from src.db.enums import TaskType -from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome, TaskOperatorRunInfo +from src.core.tasks.dtos.run_info import TaskOperatorRunInfo +from src.core.tasks.enums import TaskOperatorOutcome from src.core.enums import BatchStatus diff --git a/src/core/tasks/operators/record_type/__init__.py b/src/core/tasks/operators/record_type/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/classes/task_operators/URLRecordTypeTaskOperator.py b/src/core/tasks/operators/record_type/core.py similarity index 88% rename from src/core/classes/task_operators/URLRecordTypeTaskOperator.py rename to src/core/tasks/operators/record_type/core.py index 99a960a1..2514378e 100644 --- a/src/core/classes/task_operators/URLRecordTypeTaskOperator.py +++ b/src/core/tasks/operators/record_type/core.py @@ -1,10 +1,10 @@ -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.url_error_info import URLErrorPydanticInfo from src.db.enums import TaskType -from src.core.DTOs.task_data_objects.URLRecordTypeTDO import URLRecordTypeTDO -from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase +from src.core.tasks.operators.record_type.tdo import URLRecordTypeTDO +from src.core.tasks.operators.base import TaskOperatorBase from src.core.enums import RecordType -from src.llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier +from src.core.tasks.operators.record_type.llm_api.record_classifier.openai import OpenAIRecordClassifier class URLRecordTypeTaskOperator(TaskOperatorBase): diff --git a/src/core/tasks/operators/record_type/llm_api/__init__.py b/src/core/tasks/operators/record_type/llm_api/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/llm_api_logic/constants.py b/src/core/tasks/operators/record_type/llm_api/constants.py similarity index 100% rename from src/llm_api_logic/constants.py rename to src/core/tasks/operators/record_type/llm_api/constants.py diff --git a/src/core/tasks/operators/record_type/llm_api/dtos/__init__.py b/src/core/tasks/operators/record_type/llm_api/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/llm_api_logic/RecordTypeStructuredOutput.py b/src/core/tasks/operators/record_type/llm_api/dtos/record_type_structured_output.py similarity index 90% rename from src/llm_api_logic/RecordTypeStructuredOutput.py rename to src/core/tasks/operators/record_type/llm_api/dtos/record_type_structured_output.py index 735254a1..038dee7d 100644 --- a/src/llm_api_logic/RecordTypeStructuredOutput.py +++ b/src/core/tasks/operators/record_type/llm_api/dtos/record_type_structured_output.py @@ -8,6 +8,5 @@ from src.core.enums import RecordType - class RecordTypeStructuredOutput(BaseModel): - record_type: RecordType \ No newline at end of file + record_type: RecordType diff --git a/src/llm_api_logic/helpers.py b/src/core/tasks/operators/record_type/llm_api/helpers.py similarity index 75% rename from src/llm_api_logic/helpers.py rename to src/core/tasks/operators/record_type/llm_api/helpers.py index e1e0ffea..0d83866c 100644 --- a/src/llm_api_logic/helpers.py +++ b/src/core/tasks/operators/record_type/llm_api/helpers.py @@ -1,4 +1,4 @@ -from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from src.db.dtos.url_html_content_info import URLHTMLContentInfo def dictify_html_info(html_infos: list[URLHTMLContentInfo]) -> dict[str, str]: diff --git a/src/core/tasks/operators/record_type/llm_api/record_classifier/__init__.py b/src/core/tasks/operators/record_type/llm_api/record_classifier/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/llm_api_logic/LLMRecordClassifierBase.py b/src/core/tasks/operators/record_type/llm_api/record_classifier/base.py similarity index 83% rename from src/llm_api_logic/LLMRecordClassifierBase.py rename to src/core/tasks/operators/record_type/llm_api/record_classifier/base.py index a29b8d65..5e62df22 100644 --- a/src/llm_api_logic/LLMRecordClassifierBase.py +++ b/src/core/tasks/operators/record_type/llm_api/record_classifier/base.py @@ -4,10 +4,10 @@ from openai import AsyncOpenAI -from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo -from src.llm_api_logic.RecordTypeStructuredOutput import RecordTypeStructuredOutput -from src.llm_api_logic.constants import RECORD_CLASSIFICATION_QUERY_CONTENT -from src.llm_api_logic.helpers import dictify_html_info +from src.db.dtos.url_html_content_info import URLHTMLContentInfo +from src.core.tasks.operators.record_type.llm_api.dtos.record_type_structured_output import RecordTypeStructuredOutput +from src.core.tasks.operators.record_type.llm_api.constants import RECORD_CLASSIFICATION_QUERY_CONTENT +from src.core.tasks.operators.record_type.llm_api.helpers import dictify_html_info class RecordClassifierBase(ABC): diff --git a/src/llm_api_logic/DeepSeekRecordClassifier.py b/src/core/tasks/operators/record_type/llm_api/record_classifier/deepseek.py similarity index 84% rename from src/llm_api_logic/DeepSeekRecordClassifier.py rename to src/core/tasks/operators/record_type/llm_api/record_classifier/deepseek.py index d9c71441..71fa6673 100644 --- a/src/llm_api_logic/DeepSeekRecordClassifier.py +++ b/src/core/tasks/operators/record_type/llm_api/record_classifier/deepseek.py @@ -2,7 +2,7 @@ from openai import AsyncOpenAI -from src.llm_api_logic.LLMRecordClassifierBase import RecordClassifierBase +from src.core.tasks.operators.record_type.llm_api.record_classifier.base import RecordClassifierBase class DeepSeekRecordClassifier(RecordClassifierBase): diff --git a/src/llm_api_logic/OpenAIRecordClassifier.py b/src/core/tasks/operators/record_type/llm_api/record_classifier/openai.py similarity index 73% rename from src/llm_api_logic/OpenAIRecordClassifier.py rename to src/core/tasks/operators/record_type/llm_api/record_classifier/openai.py index 3511b193..fb129120 100644 --- a/src/llm_api_logic/OpenAIRecordClassifier.py +++ b/src/core/tasks/operators/record_type/llm_api/record_classifier/openai.py @@ -1,9 +1,9 @@ from openai.types.chat import ParsedChatCompletion -from src.core.EnvVarManager import EnvVarManager -from src.llm_api_logic.LLMRecordClassifierBase import RecordClassifierBase -from src.llm_api_logic.RecordTypeStructuredOutput import RecordTypeStructuredOutput +from src.core.env_var_manager import EnvVarManager +from src.core.tasks.operators.record_type.llm_api.record_classifier.base import RecordClassifierBase +from src.core.tasks.operators.record_type.llm_api.dtos.record_type_structured_output import RecordTypeStructuredOutput class OpenAIRecordClassifier(RecordClassifierBase): diff --git a/src/core/DTOs/task_data_objects/URLRecordTypeTDO.py b/src/core/tasks/operators/record_type/tdo.py similarity index 86% rename from src/core/DTOs/task_data_objects/URLRecordTypeTDO.py rename to src/core/tasks/operators/record_type/tdo.py index ae0bdfb8..5bb0784e 100644 --- a/src/core/DTOs/task_data_objects/URLRecordTypeTDO.py +++ b/src/core/tasks/operators/record_type/tdo.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from src.db.DTOs.URLWithHTML import URLWithHTML +from src.db.dtos.url_with_html import URLWithHTML from src.core.enums import RecordType diff --git a/src/core/tasks/operators/submit_approved_url/__init__.py b/src/core/tasks/operators/submit_approved_url/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/classes/task_operators/SubmitApprovedURLTaskOperator.py b/src/core/tasks/operators/submit_approved_url/core.py similarity index 86% rename from src/core/classes/task_operators/SubmitApprovedURLTaskOperator.py rename to src/core/tasks/operators/submit_approved_url/core.py index 49b6b7c1..02db5732 100644 --- a/src/core/classes/task_operators/SubmitApprovedURLTaskOperator.py +++ b/src/core/tasks/operators/submit_approved_url/core.py @@ -1,9 +1,9 @@ -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.url_error_info import URLErrorPydanticInfo from src.db.enums import TaskType -from src.core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO -from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from src.pdap_api_client.PDAPClient import PDAPClient +from src.core.tasks.operators.submit_approved_url.tdo import SubmitApprovedURLTDO +from src.core.tasks.operators.base import TaskOperatorBase +from src.pdap_api.client import PDAPClient class SubmitApprovedURLTaskOperator(TaskOperatorBase): diff --git a/src/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py b/src/core/tasks/operators/submit_approved_url/tdo.py similarity index 100% rename from src/core/DTOs/task_data_objects/SubmitApprovedURLTDO.py rename to src/core/tasks/operators/submit_approved_url/tdo.py diff --git a/src/core/tasks/operators/url_404_probe/__init__.py b/src/core/tasks/operators/url_404_probe/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/classes/task_operators/URL404ProbeTaskOperator.py b/src/core/tasks/operators/url_404_probe/core.py similarity index 87% rename from src/core/classes/task_operators/URL404ProbeTaskOperator.py rename to src/core/tasks/operators/url_404_probe/core.py index 648834d9..541d0236 100644 --- a/src/core/classes/task_operators/URL404ProbeTaskOperator.py +++ b/src/core/tasks/operators/url_404_probe/core.py @@ -2,11 +2,11 @@ from pydantic import BaseModel -from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface +from src.db.client.async_ import AsyncDatabaseClient from src.db.enums import TaskType -from src.core.DTOs.task_data_objects.URL404ProbeTDO import URL404ProbeTDO -from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from src.html_tag_collector.URLRequestInterface import URLRequestInterface +from src.core.tasks.operators.url_404_probe.tdo import URL404ProbeTDO +from src.core.tasks.operators.base import TaskOperatorBase class URL404ProbeTDOSubsets(BaseModel): diff --git a/src/core/DTOs/task_data_objects/URL404ProbeTDO.py b/src/core/tasks/operators/url_404_probe/tdo.py similarity index 100% rename from src/core/DTOs/task_data_objects/URL404ProbeTDO.py rename to src/core/tasks/operators/url_404_probe/tdo.py diff --git a/src/core/tasks/operators/url_duplicate/__init__.py b/src/core/tasks/operators/url_duplicate/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/classes/task_operators/URLDuplicateTaskOperator.py b/src/core/tasks/operators/url_duplicate/core.py similarity index 84% rename from src/core/classes/task_operators/URLDuplicateTaskOperator.py rename to src/core/tasks/operators/url_duplicate/core.py index c332a461..c5167291 100644 --- a/src/core/classes/task_operators/URLDuplicateTaskOperator.py +++ b/src/core/tasks/operators/url_duplicate/core.py @@ -2,11 +2,11 @@ from aiohttp import ClientResponseError -from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.db.client.async_ import AsyncDatabaseClient from src.db.enums import TaskType -from src.core.DTOs.task_data_objects.URLDuplicateTDO import URLDuplicateTDO -from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from src.pdap_api_client.PDAPClient import PDAPClient +from src.core.tasks.operators.url_duplicate.tdo import URLDuplicateTDO +from src.core.tasks.operators.base import TaskOperatorBase +from src.pdap_api.client import PDAPClient class URLDuplicateTaskOperator(TaskOperatorBase): diff --git a/src/core/DTOs/task_data_objects/URLDuplicateTDO.py b/src/core/tasks/operators/url_duplicate/tdo.py similarity index 100% rename from src/core/DTOs/task_data_objects/URLDuplicateTDO.py rename to src/core/tasks/operators/url_duplicate/tdo.py diff --git a/src/core/tasks/operators/url_html/__init__.py b/src/core/tasks/operators/url_html/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/classes/HTMLContentInfoGetter.py b/src/core/tasks/operators/url_html/content_info_getter.py similarity index 82% rename from src/core/classes/HTMLContentInfoGetter.py rename to src/core/tasks/operators/url_html/content_info_getter.py index 8e16fad1..fd9e3b2f 100644 --- a/src/core/classes/HTMLContentInfoGetter.py +++ b/src/core/tasks/operators/url_html/content_info_getter.py @@ -1,5 +1,5 @@ -from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType -from src.html_tag_collector.DataClassTags import ResponseHTMLInfo +from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.db.dtos.url_html_content_info import URLHTMLContentInfo, HTMLContentType class HTMLContentInfoGetter: diff --git a/src/core/classes/task_operators/URLHTMLTaskOperator.py b/src/core/tasks/operators/url_html/core.py similarity index 89% rename from src/core/classes/task_operators/URLHTMLTaskOperator.py rename to src/core/tasks/operators/url_html/core.py index 26961d72..9ae4b6fc 100644 --- a/src/core/classes/task_operators/URLHTMLTaskOperator.py +++ b/src/core/tasks/operators/url_html/core.py @@ -1,14 +1,14 @@ from http import HTTPStatus -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from src.db.DTOs.URLInfo import URLInfo +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.url_error_info import URLErrorPydanticInfo +from src.db.dtos.url_info import URLInfo from src.db.enums import TaskType -from src.core.DTOs.task_data_objects.UrlHtmlTDO import UrlHtmlTDO -from src.core.classes.HTMLContentInfoGetter import HTMLContentInfoGetter -from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from src.html_tag_collector.ResponseParser import HTMLResponseParser -from src.html_tag_collector.URLRequestInterface import URLRequestInterface +from src.core.tasks.operators.url_html.tdo import UrlHtmlTDO +from src.core.tasks.operators.url_html.content_info_getter import HTMLContentInfoGetter +from src.core.tasks.operators.base import TaskOperatorBase +from src.core.tasks.operators.url_html.scraper.parser.core import HTMLResponseParser +from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface class URLHTMLTaskOperator(TaskOperatorBase): diff --git a/src/core/tasks/operators/url_html/scraper/README.md b/src/core/tasks/operators/url_html/scraper/README.md new file mode 100644 index 00000000..2ecf3e2e --- /dev/null +++ b/src/core/tasks/operators/url_html/scraper/README.md @@ -0,0 +1,3 @@ +# HTML tag collector + +This module scrapes HTML tags from URLs \ No newline at end of file diff --git a/src/core/tasks/operators/url_html/scraper/__init__.py b/src/core/tasks/operators/url_html/scraper/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/operators/url_html/scraper/parser/__init__.py b/src/core/tasks/operators/url_html/scraper/parser/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/operators/url_html/scraper/parser/constants.py b/src/core/tasks/operators/url_html/scraper/parser/constants.py new file mode 100644 index 00000000..a550df93 --- /dev/null +++ b/src/core/tasks/operators/url_html/scraper/parser/constants.py @@ -0,0 +1,8 @@ +HEADER_TAGS = [ + "h1", + "h2", + "h3", + "h4", + "h5", + "h6" +] diff --git a/src/html_tag_collector/ResponseParser.py b/src/core/tasks/operators/url_html/scraper/parser/core.py similarity index 89% rename from src/html_tag_collector/ResponseParser.py rename to src/core/tasks/operators/url_html/scraper/parser/core.py index 4f6c5f74..96eeb8eb 100644 --- a/src/html_tag_collector/ResponseParser.py +++ b/src/core/tasks/operators/url_html/scraper/parser/core.py @@ -1,18 +1,15 @@ import json -from enum import Enum from typing import Optional from bs4 import BeautifulSoup -from src.html_tag_collector.DataClassTags import ResponseHTMLInfo -from src.html_tag_collector.RootURLCache import RootURLCache -from src.html_tag_collector.constants import HEADER_TAGS -from src.html_tag_collector.url_adjustment_functions import drop_hostname, remove_trailing_backslash, add_https -from src.html_tag_collector.util import remove_excess_whitespace +from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.core.tasks.operators.url_html.scraper.parser.enums import ParserTypeEnum +from src.core.tasks.operators.url_html.scraper.parser.constants import HEADER_TAGS +from src.core.tasks.operators.url_html.scraper.root_url_cache.core import RootURLCache +from src.core.tasks.operators.url_html.scraper.parser.util import remove_excess_whitespace, add_https, remove_trailing_backslash, \ + drop_hostname -class ParserTypeEnum(Enum): - LXML = "lxml" - LXML_XML = "lxml-xml" class HTMLResponseParser: def __init__(self, root_url_cache: RootURLCache): diff --git a/src/core/tasks/operators/url_html/scraper/parser/dtos/__init__.py b/src/core/tasks/operators/url_html/scraper/parser/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/operators/url_html/scraper/parser/dtos/response_html.py b/src/core/tasks/operators/url_html/scraper/parser/dtos/response_html.py new file mode 100644 index 00000000..dfa34510 --- /dev/null +++ b/src/core/tasks/operators/url_html/scraper/parser/dtos/response_html.py @@ -0,0 +1,20 @@ +from pydantic import BaseModel + + +class ResponseHTMLInfo(BaseModel): + index: int = -1 + url: str = "" + url_path: str = "" + title: str = "" + description: str = "" + root_page_title: str = "" + http_response: int = -1 + h1: str = "" + h2: str = "" + h3: str = "" + h4: str = "" + h5: str = "" + h6: str = "" + div: str = "" + + diff --git a/src/core/tasks/operators/url_html/scraper/parser/enums.py b/src/core/tasks/operators/url_html/scraper/parser/enums.py new file mode 100644 index 00000000..2fe3cd45 --- /dev/null +++ b/src/core/tasks/operators/url_html/scraper/parser/enums.py @@ -0,0 +1,6 @@ +from enum import Enum + + +class ParserTypeEnum(Enum): + LXML = "lxml" + LXML_XML = "lxml-xml" diff --git a/src/core/tasks/operators/url_html/scraper/parser/mapping.py b/src/core/tasks/operators/url_html/scraper/parser/mapping.py new file mode 100644 index 00000000..9f8820e3 --- /dev/null +++ b/src/core/tasks/operators/url_html/scraper/parser/mapping.py @@ -0,0 +1,13 @@ +from src.db.dtos.url_html_content_info import HTMLContentType + +ENUM_TO_ATTRIBUTE_MAPPING = { + HTMLContentType.TITLE: "title", + HTMLContentType.DESCRIPTION: "description", + HTMLContentType.H1: "h1", + HTMLContentType.H2: "h2", + HTMLContentType.H3: "h3", + HTMLContentType.H4: "h4", + HTMLContentType.H5: "h5", + HTMLContentType.H6: "h6", + HTMLContentType.DIV: "div" +} diff --git a/src/core/tasks/operators/url_html/scraper/parser/util.py b/src/core/tasks/operators/url_html/scraper/parser/util.py new file mode 100644 index 00000000..65f70981 --- /dev/null +++ b/src/core/tasks/operators/url_html/scraper/parser/util.py @@ -0,0 +1,43 @@ +from urllib.parse import urlparse + +from src.db.dtos.url_html_content_info import URLHTMLContentInfo +from src.core.tasks.operators.url_html.scraper.parser.mapping import ENUM_TO_ATTRIBUTE_MAPPING +from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo + + +def convert_to_response_html_info(html_content_infos: list[URLHTMLContentInfo]): + response_html_info = ResponseHTMLInfo() + + for html_content_info in html_content_infos: + setattr(response_html_info, ENUM_TO_ATTRIBUTE_MAPPING[html_content_info.content_type], html_content_info.content) + + return response_html_info + + +def remove_excess_whitespace(s: str) -> str: + """Removes leading, trailing, and excess adjacent whitespace. + + Args: + s (str): String to remove whitespace from. + + Returns: + str: Clean string with excess whitespace stripped. + """ + return " ".join(s.split()).strip() + + +def add_https(url: str) -> str: + if not url.startswith("http"): + url = "https://" + url + return url + + +def remove_trailing_backslash(url_path): + if url_path and url_path[-1] == "/": + url_path = url_path[:-1] + return url_path + + +def drop_hostname(new_url): + url_path = urlparse(new_url).path[1:] + return url_path diff --git a/src/core/tasks/operators/url_html/scraper/request_interface/__init__.py b/src/core/tasks/operators/url_html/scraper/request_interface/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/operators/url_html/scraper/request_interface/constants.py b/src/core/tasks/operators/url_html/scraper/request_interface/constants.py new file mode 100644 index 00000000..dc832aff --- /dev/null +++ b/src/core/tasks/operators/url_html/scraper/request_interface/constants.py @@ -0,0 +1,2 @@ +HTML_CONTENT_TYPE = "text/html" +MAX_CONCURRENCY = 5 diff --git a/src/html_tag_collector/URLRequestInterface.py b/src/core/tasks/operators/url_html/scraper/request_interface/core.py similarity index 86% rename from src/html_tag_collector/URLRequestInterface.py rename to src/core/tasks/operators/url_html/scraper/request_interface/core.py index fb0eeb9f..4a222aa3 100644 --- a/src/html_tag_collector/URLRequestInterface.py +++ b/src/core/tasks/operators/url_html/scraper/request_interface/core.py @@ -1,32 +1,14 @@ -import asyncio from http import HTTPStatus from typing import Optional from aiohttp import ClientSession, ClientResponseError from playwright.async_api import async_playwright - -from dataclasses import dataclass - -from pydantic import BaseModel from tqdm.asyncio import tqdm -MAX_CONCURRENCY = 5 - -class URLResponseInfo(BaseModel): - success: bool - status: Optional[HTTPStatus] = None - html: Optional[str] = None - content_type: Optional[str] = None - exception: Optional[str] = None - +from src.core.tasks.operators.url_html.scraper.request_interface.constants import HTML_CONTENT_TYPE +from src.core.tasks.operators.url_html.scraper.request_interface.dtos.request_resources import RequestResources +from src.core.tasks.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo -@dataclass -class RequestResources: - session: ClientSession - browser: async_playwright - semaphore: asyncio.Semaphore = asyncio.Semaphore(MAX_CONCURRENCY) - -HTML_CONTENT_TYPE = "text/html" class URLRequestInterface: @@ -96,6 +78,3 @@ async def make_simple_requests(self, urls: list[str]) -> list[URLResponseInfo]: tasks = [self.get_response(session, url) for url in urls] results = await tqdm.gather(*tasks) return results - - - diff --git a/src/core/tasks/operators/url_html/scraper/request_interface/dtos/__init__.py b/src/core/tasks/operators/url_html/scraper/request_interface/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/operators/url_html/scraper/request_interface/dtos/request_resources.py b/src/core/tasks/operators/url_html/scraper/request_interface/dtos/request_resources.py new file mode 100644 index 00000000..c17964da --- /dev/null +++ b/src/core/tasks/operators/url_html/scraper/request_interface/dtos/request_resources.py @@ -0,0 +1,14 @@ +import asyncio +from dataclasses import dataclass + +from aiohttp import ClientSession +from playwright.async_api import async_playwright + +from src.core.tasks.operators.url_html.scraper.request_interface.constants import MAX_CONCURRENCY + + +@dataclass +class RequestResources: + session: ClientSession + browser: async_playwright + semaphore: asyncio.Semaphore = asyncio.Semaphore(MAX_CONCURRENCY) diff --git a/src/core/tasks/operators/url_html/scraper/request_interface/dtos/url_response.py b/src/core/tasks/operators/url_html/scraper/request_interface/dtos/url_response.py new file mode 100644 index 00000000..8e17c078 --- /dev/null +++ b/src/core/tasks/operators/url_html/scraper/request_interface/dtos/url_response.py @@ -0,0 +1,12 @@ +from http import HTTPStatus +from typing import Optional + +from pydantic import BaseModel + + +class URLResponseInfo(BaseModel): + success: bool + status: Optional[HTTPStatus] = None + html: Optional[str] = None + content_type: Optional[str] = None + exception: Optional[str] = None diff --git a/src/core/tasks/operators/url_html/scraper/root_url_cache/__init__.py b/src/core/tasks/operators/url_html/scraper/root_url_cache/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/html_tag_collector/constants.py b/src/core/tasks/operators/url_html/scraper/root_url_cache/constants.py similarity index 91% rename from src/html_tag_collector/constants.py rename to src/core/tasks/operators/url_html/scraper/root_url_cache/constants.py index c631ca3c..52d392e0 100644 --- a/src/html_tag_collector/constants.py +++ b/src/core/tasks/operators/url_html/scraper/root_url_cache/constants.py @@ -1,13 +1,10 @@ - """ Some websites refuse the connection of automated requests, setting the User-Agent will circumvent that. """ USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" - REQUEST_HEADERS = { "User-Agent": USER_AGENT, # Make sure there's no pre-mature closing of responses before a redirect completes "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", } -HEADER_TAGS = ["h1", "h2", "h3", "h4", "h5", "h6"] diff --git a/src/html_tag_collector/RootURLCache.py b/src/core/tasks/operators/url_html/scraper/root_url_cache/core.py similarity index 90% rename from src/html_tag_collector/RootURLCache.py rename to src/core/tasks/operators/url_html/scraper/root_url_cache/core.py index 1231752f..9c8db3a8 100644 --- a/src/html_tag_collector/RootURLCache.py +++ b/src/core/tasks/operators/url_html/scraper/root_url_cache/core.py @@ -1,19 +1,15 @@ -from dataclasses import dataclass from typing import Optional from urllib.parse import urlparse from aiohttp import ClientSession from bs4 import BeautifulSoup -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.html_tag_collector.constants import REQUEST_HEADERS +from src.db.client.async_ import AsyncDatabaseClient +from src.core.tasks.operators.url_html.scraper.root_url_cache.constants import REQUEST_HEADERS +from src.core.tasks.operators.url_html.scraper.root_url_cache.dtos.response import RootURLCacheResponseInfo DEBUG = False -@dataclass -class RootURLCacheResponseInfo: - text: Optional[str] = None - exception: Optional[Exception] = None class RootURLCache: def __init__(self, adb_client: Optional[AsyncDatabaseClient] = None): diff --git a/src/core/tasks/operators/url_html/scraper/root_url_cache/dtos/__init__.py b/src/core/tasks/operators/url_html/scraper/root_url_cache/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/operators/url_html/scraper/root_url_cache/dtos/response.py b/src/core/tasks/operators/url_html/scraper/root_url_cache/dtos/response.py new file mode 100644 index 00000000..6ea1d21c --- /dev/null +++ b/src/core/tasks/operators/url_html/scraper/root_url_cache/dtos/response.py @@ -0,0 +1,11 @@ +from typing import Optional + +from pydantic import BaseModel + + +class RootURLCacheResponseInfo(BaseModel): + class Config: + arbitrary_types_allowed = True + + text: Optional[str] = None + exception: Optional[Exception] = None diff --git a/src/core/tasks/operators/url_html/tdo.py b/src/core/tasks/operators/url_html/tdo.py new file mode 100644 index 00000000..26d9aea0 --- /dev/null +++ b/src/core/tasks/operators/url_html/tdo.py @@ -0,0 +1,14 @@ +from typing import Optional + +from pydantic import BaseModel + +from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.db.dtos.url_info import URLInfo +from src.core.tasks.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo + + +class UrlHtmlTDO(BaseModel): + url_info: URLInfo + url_response_info: Optional[URLResponseInfo] = None + html_tag_info: Optional[ResponseHTMLInfo] = None + diff --git a/src/core/tasks/operators/url_miscellaneous_metadata/__init__.py b/src/core/tasks/operators/url_miscellaneous_metadata/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py b/src/core/tasks/operators/url_miscellaneous_metadata/core.py similarity index 75% rename from src/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py rename to src/core/tasks/operators/url_miscellaneous_metadata/core.py index 086631ca..505949b5 100644 --- a/src/core/classes/task_operators/URLMiscellaneousMetadataTaskOperator.py +++ b/src/core/tasks/operators/url_miscellaneous_metadata/core.py @@ -1,16 +1,16 @@ from typing import Optional -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.url_error_info import URLErrorPydanticInfo from src.db.enums import TaskType -from src.collector_manager.enums import CollectorType -from src.core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO -from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from src.core.classes.subtasks.MiscellaneousMetadata.AutoGooglerMiscMetadataSubtask import AutoGooglerMiscMetadataSubtask -from src.core.classes.subtasks.MiscellaneousMetadata.CKANMiscMetadataSubtask import CKANMiscMetadataSubtask -from src.core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ +from src.collectors.enums import CollectorType +from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO +from src.core.tasks.operators.base import TaskOperatorBase +from src.core.tasks.subtasks.miscellaneous_metadata.auto_googler import AutoGooglerMiscMetadataSubtask +from src.core.tasks.subtasks.miscellaneous_metadata.ckan import CKANMiscMetadataSubtask +from src.core.tasks.subtasks.miscellaneous_metadata.base import \ MiscellaneousMetadataSubtaskBase -from src.core.classes.subtasks.MiscellaneousMetadata.MuckrockMiscMetadataSubtask import MuckrockMiscMetadataSubtask +from src.core.tasks.subtasks.miscellaneous_metadata.muckrock import MuckrockMiscMetadataSubtask class URLMiscellaneousMetadataTaskOperator(TaskOperatorBase): diff --git a/src/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py b/src/core/tasks/operators/url_miscellaneous_metadata/tdo.py similarity index 91% rename from src/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py rename to src/core/tasks/operators/url_miscellaneous_metadata/tdo.py index 1daa40b1..9f88f3a7 100644 --- a/src/core/DTOs/task_data_objects/URLMiscellaneousMetadataTDO.py +++ b/src/core/tasks/operators/url_miscellaneous_metadata/tdo.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from src.collector_manager.enums import CollectorType +from src.collectors.enums import CollectorType class URLHTMLMetadataInfo(BaseModel): diff --git a/src/core/tasks/subtasks/__init__.py b/src/core/tasks/subtasks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/subtasks/agency_identification/__init__.py b/src/core/tasks/subtasks/agency_identification/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/classes/subtasks/AutoGooglerAgencyIdentificationSubtask.py b/src/core/tasks/subtasks/agency_identification/auto_googler.py similarity index 76% rename from src/core/classes/subtasks/AutoGooglerAgencyIdentificationSubtask.py rename to src/core/tasks/subtasks/agency_identification/auto_googler.py index b4734c71..fe52b606 100644 --- a/src/core/classes/subtasks/AutoGooglerAgencyIdentificationSubtask.py +++ b/src/core/tasks/subtasks/agency_identification/auto_googler.py @@ -1,8 +1,8 @@ from typing import Optional -from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from src.core.classes.subtasks.AgencyIdentificationSubtaskBase import AgencyIdentificationSubtaskBase +from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.enums import SuggestionType +from src.core.tasks.subtasks.agency_identification.base import AgencyIdentificationSubtaskBase class AutoGooglerAgencyIdentificationSubtask(AgencyIdentificationSubtaskBase): diff --git a/src/core/classes/subtasks/AgencyIdentificationSubtaskBase.py b/src/core/tasks/subtasks/agency_identification/base.py similarity index 76% rename from src/core/classes/subtasks/AgencyIdentificationSubtaskBase.py rename to src/core/tasks/subtasks/agency_identification/base.py index 9e7dd865..957001fa 100644 --- a/src/core/classes/subtasks/AgencyIdentificationSubtaskBase.py +++ b/src/core/tasks/subtasks/agency_identification/base.py @@ -2,7 +2,7 @@ from abc import ABC from typing import Optional -from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo class AgencyIdentificationSubtaskBase(ABC): diff --git a/src/core/classes/subtasks/CKANAgencyIdentificationSubtask.py b/src/core/tasks/subtasks/agency_identification/ckan.py similarity index 77% rename from src/core/classes/subtasks/CKANAgencyIdentificationSubtask.py rename to src/core/tasks/subtasks/agency_identification/ckan.py index 4ac8f0fd..a0f167e1 100644 --- a/src/core/classes/subtasks/CKANAgencyIdentificationSubtask.py +++ b/src/core/tasks/subtasks/agency_identification/ckan.py @@ -1,9 +1,9 @@ from typing import Optional -from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.helpers import process_match_agency_response_to_suggestions -from src.pdap_api_client.PDAPClient import PDAPClient -from src.pdap_api_client.DTOs import MatchAgencyResponse +from src.pdap_api.client import PDAPClient +from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse class CKANAgencyIdentificationSubtask: diff --git a/src/core/classes/subtasks/CommonCrawlerAgencyIdentificationSubtask.py b/src/core/tasks/subtasks/agency_identification/common_crawler.py similarity index 85% rename from src/core/classes/subtasks/CommonCrawlerAgencyIdentificationSubtask.py rename to src/core/tasks/subtasks/agency_identification/common_crawler.py index 00441a0a..7299cbf6 100644 --- a/src/core/classes/subtasks/CommonCrawlerAgencyIdentificationSubtask.py +++ b/src/core/tasks/subtasks/agency_identification/common_crawler.py @@ -1,6 +1,6 @@ from typing import Optional -from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.enums import SuggestionType diff --git a/src/core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py b/src/core/tasks/subtasks/agency_identification/muckrock.py similarity index 73% rename from src/core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py rename to src/core/tasks/subtasks/agency_identification/muckrock.py index 4e0d874d..4415ac47 100644 --- a/src/core/classes/subtasks/MuckrockAgencyIdentificationSubtask.py +++ b/src/core/tasks/subtasks/agency_identification/muckrock.py @@ -1,11 +1,13 @@ from typing import Optional -from src.source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponse, AgencyLookupResponseType -from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.collectors.source_collectors.muckrock.api_interface.core import MuckrockAPIInterface +from src.collectors.source_collectors.muckrock.api_interface.lookup_response import AgencyLookupResponse +from src.collectors.source_collectors.muckrock.enums import AgencyLookupResponseType +from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.exceptions import MuckrockAPIError from src.core.helpers import process_match_agency_response_to_suggestions -from src.pdap_api_client.PDAPClient import PDAPClient -from src.pdap_api_client.DTOs import MatchAgencyResponse +from src.pdap_api.client import PDAPClient +from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse class MuckrockAgencyIdentificationSubtask: diff --git a/src/core/tasks/subtasks/miscellaneous_metadata/__init__.py b/src/core/tasks/subtasks/miscellaneous_metadata/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/classes/subtasks/MiscellaneousMetadata/AutoGooglerMiscMetadataSubtask.py b/src/core/tasks/subtasks/miscellaneous_metadata/auto_googler.py similarity index 58% rename from src/core/classes/subtasks/MiscellaneousMetadata/AutoGooglerMiscMetadataSubtask.py rename to src/core/tasks/subtasks/miscellaneous_metadata/auto_googler.py index 8cf644ad..1a232c3b 100644 --- a/src/core/classes/subtasks/MiscellaneousMetadata/AutoGooglerMiscMetadataSubtask.py +++ b/src/core/tasks/subtasks/miscellaneous_metadata/auto_googler.py @@ -1,5 +1,5 @@ -from src.core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO -from src.core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ +from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO +from src.core.tasks.subtasks.miscellaneous_metadata.base import \ MiscellaneousMetadataSubtaskBase diff --git a/src/core/classes/subtasks/MiscellaneousMetadata/MiscellaneousMetadataSubtaskBase.py b/src/core/tasks/subtasks/miscellaneous_metadata/base.py similarity index 66% rename from src/core/classes/subtasks/MiscellaneousMetadata/MiscellaneousMetadataSubtaskBase.py rename to src/core/tasks/subtasks/miscellaneous_metadata/base.py index 0f1224ad..9c5d7e45 100644 --- a/src/core/classes/subtasks/MiscellaneousMetadata/MiscellaneousMetadataSubtaskBase.py +++ b/src/core/tasks/subtasks/miscellaneous_metadata/base.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod -from src.core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO +from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO class MiscellaneousMetadataSubtaskBase(ABC): diff --git a/src/core/classes/subtasks/MiscellaneousMetadata/CKANMiscMetadataSubtask.py b/src/core/tasks/subtasks/miscellaneous_metadata/ckan.py similarity index 72% rename from src/core/classes/subtasks/MiscellaneousMetadata/CKANMiscMetadataSubtask.py rename to src/core/tasks/subtasks/miscellaneous_metadata/ckan.py index 60c3a410..ddd5a36d 100644 --- a/src/core/classes/subtasks/MiscellaneousMetadata/CKANMiscMetadataSubtask.py +++ b/src/core/tasks/subtasks/miscellaneous_metadata/ckan.py @@ -1,5 +1,5 @@ -from src.core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO -from src.core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ +from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO +from src.core.tasks.subtasks.miscellaneous_metadata.base import \ MiscellaneousMetadataSubtaskBase diff --git a/src/core/classes/subtasks/MiscellaneousMetadata/MuckrockMiscMetadataSubtask.py b/src/core/tasks/subtasks/miscellaneous_metadata/muckrock.py similarity index 58% rename from src/core/classes/subtasks/MiscellaneousMetadata/MuckrockMiscMetadataSubtask.py rename to src/core/tasks/subtasks/miscellaneous_metadata/muckrock.py index 4bd18481..4d166542 100644 --- a/src/core/classes/subtasks/MiscellaneousMetadata/MuckrockMiscMetadataSubtask.py +++ b/src/core/tasks/subtasks/miscellaneous_metadata/muckrock.py @@ -1,5 +1,5 @@ -from src.core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO -from src.core.classes.subtasks.MiscellaneousMetadata.MiscellaneousMetadataSubtaskBase import \ +from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO +from src.core.tasks.subtasks.miscellaneous_metadata.base import \ MiscellaneousMetadataSubtaskBase diff --git a/src/db/client/__init__.py b/src/db/client/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/AsyncDatabaseClient.py b/src/db/client/async_.py similarity index 95% rename from src/db/AsyncDatabaseClient.py rename to src/db/client/async_.py index e9b78952..d6f7208d 100644 --- a/src/db/AsyncDatabaseClient.py +++ b/src/db/client/async_.py @@ -12,61 +12,62 @@ from sqlalchemy.sql.functions import coalesce from starlette import status -from src.collector_manager.enums import URLStatus, CollectorType -from src.db.ConfigManager import ConfigManager -from src.db.DTOConverter import DTOConverter -from src.db.DTOs.BatchInfo import BatchInfo -from src.db.DTOs.DuplicateInfo import DuplicateInsertInfo, DuplicateInfo -from src.db.DTOs.InsertURLsInfo import InsertURLsInfo -from src.db.DTOs.LogInfo import LogInfo, LogOutputInfo -from src.db.DTOs.TaskInfo import TaskInfo -from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType -from src.db.DTOs.URLInfo import URLInfo -from src.db.DTOs.URLMapping import URLMapping -from src.db.StatementComposer import StatementComposer +from src.api.endpoints.annotate.dtos.agency.response import GetNextURLForAgencyAnnotationResponse, \ + GetNextURLForAgencyAnnotationInnerResponse, GetNextURLForAgencyAgencyInfo +from src.api.endpoints.annotate.dtos.all.post import AllAnnotationPostInfo +from src.api.endpoints.annotate.dtos.all.response import GetNextURLForAllAnnotationResponse, \ + GetNextURLForAllAnnotationInnerResponse +from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseInfo +from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseInfo +from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO +from src.api.endpoints.collector.dtos.manual_batch.response import ManualBatchResponseDTO +from src.api.endpoints.metrics.dtos.get.backlog import GetMetricsBacklogResponseDTO, GetMetricsBacklogResponseInnerDTO +from src.api.endpoints.metrics.dtos.get.batches.aggregated import GetMetricsBatchesAggregatedResponseDTO, \ + GetMetricsBatchesAggregatedInnerResponseDTO +from src.api.endpoints.metrics.dtos.get.batches.breakdown import GetMetricsBatchesBreakdownInnerResponseDTO, \ + GetMetricsBatchesBreakdownResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.aggregated import GetMetricsURLsAggregatedResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.breakdown.pending import GetMetricsURLsBreakdownPendingResponseDTO, \ + GetMetricsURLsBreakdownPendingResponseInnerDTO +from src.api.endpoints.metrics.dtos.get.urls.breakdown.submitted import GetMetricsURLsBreakdownSubmittedResponseDTO, \ + GetMetricsURLsBreakdownSubmittedInnerDTO +from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo +from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewResponse, FinalReviewOptionalMetadata, \ + FinalReviewAnnotationInfo +from src.api.endpoints.review.enums import RejectionReason +from src.api.endpoints.search.dtos.response import SearchURLResponse +from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse, GetTasksResponseTaskInfo +from src.api.endpoints.url.dtos.response import GetURLsResponseInfo, GetURLsResponseErrorInfo, GetURLsResponseInnerInfo +from src.collectors.enums import URLStatus, CollectorType +from src.core.tasks.operators.url_html.scraper.parser.util import convert_to_response_html_info +from src.db.config_manager import ConfigManager +from src.db.dto_converter import DTOConverter +from src.db.dtos.batch_info import BatchInfo +from src.db.dtos.duplicate_info import DuplicateInsertInfo, DuplicateInfo +from src.db.dtos.insert_urls_info import InsertURLsInfo +from src.db.dtos.log_info import LogInfo, LogOutputInfo +from src.api.endpoints.task.dtos.get.task import TaskInfo +from src.db.dtos.url_error_info import URLErrorPydanticInfo +from src.db.dtos.url_html_content_info import URLHTMLContentInfo, HTMLContentType +from src.db.dtos.url_info import URLInfo +from src.db.dtos.url_mapping import URLMapping +from src.db.statement_composer import StatementComposer from src.db.constants import PLACEHOLDER_AGENCY_NAME from src.db.enums import TaskType -from src.db.models import URL, URLErrorInfo, URLHTMLContent, Base, \ +from src.db.models.templates import Base +from src.db.models.core import URL, URLErrorInfo, URLHTMLContent, \ RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Duplicate, Log, \ BacklogSnapshot, URLDataSource, URLCheckedForDuplicate, URLProbedFor404 -from src.core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo -from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason -from src.core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO, GetMetricsBacklogResponseInnerDTO -from src.core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO, \ - GetMetricsBatchesAggregatedInnerResponseDTO -from src.core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO, \ - GetMetricsBatchesBreakdownInnerResponseDTO -from src.core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO -from src.core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO, \ - GetMetricsURLsBreakdownPendingResponseInnerDTO -from src.core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO, \ - GetMetricsURLsBreakdownSubmittedInnerDTO -from src.core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseInfo -from src.core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseInfo -from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ - GetNextURLForAgencyAgencyInfo, GetNextURLForAgencyAnnotationInnerResponse -from src.core.DTOs.GetNextURLForAllAnnotationResponse import GetNextURLForAllAnnotationResponse, \ - GetNextURLForAllAnnotationInnerResponse -from src.core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewResponse, FinalReviewAnnotationInfo, \ - FinalReviewOptionalMetadata -from src.core.DTOs.GetTasksResponse import GetTasksResponse, GetTasksResponseTaskInfo -from src.core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo, GetURLsResponseErrorInfo, \ - GetURLsResponseInnerInfo -from src.core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO -from src.core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO -from src.core.DTOs.SearchURLResponse import SearchURLResponse -from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from src.core.DTOs.task_data_objects.AgencyIdentificationTDO import AgencyIdentificationTDO -from src.core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO, SubmittedURLInfo -from src.core.DTOs.task_data_objects.URL404ProbeTDO import URL404ProbeTDO -from src.core.DTOs.task_data_objects.URLDuplicateTDO import URLDuplicateTDO -from src.core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo -from src.core.EnvVarManager import EnvVarManager +from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo +from src.core.tasks.operators.agency_identification.dtos.tdo import AgencyIdentificationTDO +from src.core.tasks.operators.submit_approved_url.tdo import SubmitApprovedURLTDO, SubmittedURLInfo +from src.core.tasks.operators.url_404_probe.tdo import URL404ProbeTDO +from src.core.tasks.operators.url_duplicate.tdo import URLDuplicateTDO +from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo +from src.core.env_var_manager import EnvVarManager from src.core.enums import BatchStatus, SuggestionType, RecordType, SuggestedStatus -from src.html_tag_collector.DataClassTags import convert_to_response_html_info # Type Hints @@ -188,6 +189,16 @@ async def get_next_url_for_user_annotation( return raw_result.unique().scalars().one_or_none() + @session_manager + async def get_batch_status( + self, + session: AsyncSession, + batch_id: int + ) -> BatchStatus: + statement = select(Batch).where(Batch.id == batch_id) + result = await session.execute(statement) + return BatchStatus(result.unique().scalar_one().status) + @session_manager async def add_user_relevant_suggestion( self, diff --git a/src/db/DatabaseClient.py b/src/db/client/sync.py similarity index 91% rename from src/db/DatabaseClient.py rename to src/db/client/sync.py index 0a6c2f02..67d432fc 100644 --- a/src/db/DatabaseClient.py +++ b/src/db/client/sync.py @@ -5,17 +5,18 @@ from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import sessionmaker, scoped_session, Session -from src.collector_manager.enums import URLStatus -from src.db.ConfigManager import ConfigManager -from src.db.DTOs.BatchInfo import BatchInfo -from src.db.DTOs.DuplicateInfo import DuplicateInsertInfo -from src.db.DTOs.InsertURLsInfo import InsertURLsInfo -from src.db.DTOs.LogInfo import LogInfo -from src.db.DTOs.URLInfo import URLInfo -from src.db.DTOs.URLMapping import URLMapping -from src.db.models import Base, Batch, URL, Log, Duplicate, URLDataSource -from src.core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmittedURLInfo -from src.core.EnvVarManager import EnvVarManager +from src.collectors.enums import URLStatus +from src.db.config_manager import ConfigManager +from src.db.dtos.batch_info import BatchInfo +from src.db.dtos.duplicate_info import DuplicateInsertInfo +from src.db.dtos.insert_urls_info import InsertURLsInfo +from src.db.dtos.log_info import LogInfo +from src.db.dtos.url_info import URLInfo +from src.db.dtos.url_mapping import URLMapping +from src.db.models.templates import Base +from src.db.models.core import Batch, URL, Log, Duplicate, URLDataSource +from src.core.tasks.operators.submit_approved_url.tdo import SubmittedURLInfo +from src.core.env_var_manager import EnvVarManager from src.core.enums import BatchStatus diff --git a/src/db/ConfigManager.py b/src/db/config_manager.py similarity index 100% rename from src/db/ConfigManager.py rename to src/db/config_manager.py diff --git a/src/db/DTOConverter.py b/src/db/dto_converter.py similarity index 90% rename from src/db/DTOConverter.py rename to src/db/dto_converter.py index 811aefa3..abdf5552 100644 --- a/src/db/DTOConverter.py +++ b/src/db/dto_converter.py @@ -1,22 +1,24 @@ from typing import Optional -from src.db.DTOs.URLHTMLContentInfo import HTMLContentType, URLHTMLContentInfo -from src.db.DTOs.URLInfo import URLInfo -from src.db.DTOs.URLWithHTML import URLWithHTML -from src.db.models import AutomatedUrlAgencySuggestion, UserUrlAgencySuggestion, URLHTMLContent, URL, \ +from src.api.endpoints.annotate.dtos.agency.response import GetNextURLForAgencyAgencyInfo +from src.api.endpoints.review.dtos.get import FinalReviewAnnotationRelevantInfo, FinalReviewAnnotationAgencyAutoInfo, \ + FinalReviewAnnotationRecordTypeInfo, FinalReviewAnnotationAgencyInfo +from src.core.enums import RecordType, SuggestionType +from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.core.tasks.operators.url_html.scraper.parser.mapping import ENUM_TO_ATTRIBUTE_MAPPING +from src.db.dtos.url_html_content_info import HTMLContentType, URLHTMLContentInfo +from src.db.dtos.url_info import URLInfo +from src.db.dtos.url_with_html import URLWithHTML +from src.db.models.core import AutomatedUrlAgencySuggestion, UserUrlAgencySuggestion, URLHTMLContent, URL, \ AutoRecordTypeSuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion, AutoRelevantSuggestion, \ ConfirmedURLAgency -from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAgencyInfo -from src.core.DTOs.GetNextURLForFinalReviewResponse import FinalReviewAnnotationRelevantInfo, \ - FinalReviewAnnotationRecordTypeInfo, FinalReviewAnnotationAgencyAutoInfo, \ - FinalReviewAnnotationAgencyInfo -from src.core.enums import RecordType, SuggestionType -from src.html_tag_collector.DataClassTags import ResponseHTMLInfo, ENUM_TO_ATTRIBUTE_MAPPING + + class DTOConverter: """ - Converts SQLAlchemy objects to DTOs + Converts SQLAlchemy objects to dtos """ @staticmethod diff --git a/src/db/DTOs/README.md b/src/db/dtos/README.md similarity index 100% rename from src/db/DTOs/README.md rename to src/db/dtos/README.md diff --git a/src/db/dtos/__init__.py b/src/db/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/DTOs/BatchInfo.py b/src/db/dtos/batch_info.py similarity index 100% rename from src/db/DTOs/BatchInfo.py rename to src/db/dtos/batch_info.py diff --git a/src/db/DTOs/DuplicateInfo.py b/src/db/dtos/duplicate_info.py similarity index 100% rename from src/db/DTOs/DuplicateInfo.py rename to src/db/dtos/duplicate_info.py diff --git a/src/db/DTOs/InsertURLsInfo.py b/src/db/dtos/insert_urls_info.py similarity index 81% rename from src/db/DTOs/InsertURLsInfo.py rename to src/db/dtos/insert_urls_info.py index 21b89219..35af3f98 100644 --- a/src/db/DTOs/InsertURLsInfo.py +++ b/src/db/dtos/insert_urls_info.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from src.db.DTOs.URLMapping import URLMapping +from src.db.dtos.url_mapping import URLMapping class InsertURLsInfo(BaseModel): diff --git a/src/db/DTOs/LogInfo.py b/src/db/dtos/log_info.py similarity index 100% rename from src/db/DTOs/LogInfo.py rename to src/db/dtos/log_info.py diff --git a/src/db/DTOs/MetadataAnnotationInfo.py b/src/db/dtos/metadata_annotation_info.py similarity index 100% rename from src/db/DTOs/MetadataAnnotationInfo.py rename to src/db/dtos/metadata_annotation_info.py diff --git a/src/db/DTOs/URLAnnotationInfo.py b/src/db/dtos/url_annotation_info.py similarity index 72% rename from src/db/DTOs/URLAnnotationInfo.py rename to src/db/dtos/url_annotation_info.py index 64920e9c..035b4425 100644 --- a/src/db/DTOs/URLAnnotationInfo.py +++ b/src/db/dtos/url_annotation_info.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from src.db.dtos.url_html_content_info import URLHTMLContentInfo class URLAnnotationInfo(BaseModel): diff --git a/src/db/DTOs/URLErrorInfos.py b/src/db/dtos/url_error_info.py similarity index 100% rename from src/db/DTOs/URLErrorInfos.py rename to src/db/dtos/url_error_info.py diff --git a/src/db/DTOs/URLHTMLContentInfo.py b/src/db/dtos/url_html_content_info.py similarity index 100% rename from src/db/DTOs/URLHTMLContentInfo.py rename to src/db/dtos/url_html_content_info.py diff --git a/src/db/DTOs/URLInfo.py b/src/db/dtos/url_info.py similarity index 88% rename from src/db/DTOs/URLInfo.py rename to src/db/dtos/url_info.py index 3b6fc6b1..e409c32c 100644 --- a/src/db/DTOs/URLInfo.py +++ b/src/db/dtos/url_info.py @@ -3,7 +3,7 @@ from pydantic import BaseModel -from src.collector_manager.enums import URLStatus +from src.collectors.enums import URLStatus class URLInfo(BaseModel): diff --git a/src/db/DTOs/URLMapping.py b/src/db/dtos/url_mapping.py similarity index 100% rename from src/db/DTOs/URLMapping.py rename to src/db/dtos/url_mapping.py diff --git a/src/db/DTOs/URLMetadataInfo.py b/src/db/dtos/url_metadata_info.py similarity index 100% rename from src/db/DTOs/URLMetadataInfo.py rename to src/db/dtos/url_metadata_info.py diff --git a/src/db/DTOs/URLRelevancyInfo.py b/src/db/dtos/url_relevancy_info.py similarity index 100% rename from src/db/DTOs/URLRelevancyInfo.py rename to src/db/dtos/url_relevancy_info.py diff --git a/src/db/DTOs/URLWithHTML.py b/src/db/dtos/url_with_html.py similarity index 67% rename from src/db/DTOs/URLWithHTML.py rename to src/db/dtos/url_with_html.py index 0c767da8..8e4f5cce 100644 --- a/src/db/DTOs/URLWithHTML.py +++ b/src/db/dtos/url_with_html.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo +from src.db.dtos.url_html_content_info import URLHTMLContentInfo class URLWithHTML(BaseModel): diff --git a/src/db/helper_functions.py b/src/db/helpers.py similarity index 71% rename from src/db/helper_functions.py rename to src/db/helpers.py index cf0efcc3..618b2e6d 100644 --- a/src/db/helper_functions.py +++ b/src/db/helpers.py @@ -1,4 +1,4 @@ -from src.core.EnvVarManager import EnvVarManager +from src.core.env_var_manager import EnvVarManager def get_postgres_connection_string(is_async = False): diff --git a/src/db/models/__init__.py b/src/db/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/models.py b/src/db/models/core.py similarity index 71% rename from src/db/models.py rename to src/db/models/core.py index 3c4b615f..54c9b091 100644 --- a/src/db/models.py +++ b/src/db/models/core.py @@ -1,37 +1,30 @@ """ SQLAlchemy ORM models """ -from sqlalchemy import func, Column, Integer, String, TIMESTAMP, Float, JSON, ForeignKey, Text, UniqueConstraint, \ +from sqlalchemy import Column, Integer, String, TIMESTAMP, Float, JSON, ForeignKey, Text, UniqueConstraint, \ Boolean, ARRAY from sqlalchemy.dialects import postgresql -from sqlalchemy.orm import declarative_base, relationship +from sqlalchemy.orm import relationship -from src.db.enums import PGEnum, TaskType from src.core.enums import BatchStatus, RecordType +from src.db.enums import PGEnum, TaskType +from src.db.models.helpers import get_created_at_column, CURRENT_TIME_SERVER_DEFAULT, \ + get_agency_id_foreign_column +from src.db.models.mixins import URLDependentMixin, TaskDependentMixin, BatchDependentMixin, CreatedAtMixin, \ + UpdatedAtMixin +from src.db.models.templates import StandardModel, Base from src.util.helper_functions import get_enum_values -# Base class for SQLAlchemy ORM models -Base = declarative_base() - status_check_string = ", ".join([f"'{status}'" for status in get_enum_values(BatchStatus)]) -CURRENT_TIME_SERVER_DEFAULT = func.now() - batch_status_enum = PGEnum('ready to label', 'error', 'in-process', 'aborted', name='batch_status') record_type_values = get_enum_values(RecordType) -def get_created_at_column(): - return Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) - -def get_updated_at_column(): - return Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT, onupdate=CURRENT_TIME_SERVER_DEFAULT) - -class Batch(Base): +class Batch(StandardModel): __tablename__ = 'batches' - id = Column(Integer, primary_key=True) strategy = Column( postgresql.ENUM( 'example', @@ -79,10 +72,9 @@ class Batch(Base): duplicates = relationship("Duplicate", back_populates="batch") -class URL(Base): +class URL(UpdatedAtMixin, CreatedAtMixin, StandardModel): __tablename__ = 'urls' - id = Column(Integer, primary_key=True) # The batch this URL is associated with batch_id = Column(Integer, ForeignKey('batches.id', name='fk_url_batch_id'), nullable=False) url = Column(Text, unique=True) @@ -106,8 +98,6 @@ class URL(Base): nullable=False ) record_type = Column(postgresql.ENUM(*record_type_values, name='record_type'), nullable=True) - created_at = get_created_at_column() - updated_at = get_updated_at_column() # Relationships batch = relationship("Batch", back_populates="urls") @@ -154,31 +144,23 @@ class URL(Base): back_populates="url" ) -class URLCheckedForDuplicate(Base): +class URLCheckedForDuplicate(CreatedAtMixin, URLDependentMixin, StandardModel): __tablename__ = 'url_checked_for_duplicate' - id = Column(Integer, primary_key=True) - url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) - created_at = get_created_at_column() - # Relationships url = relationship("URL", uselist=False, back_populates="checked_for_duplicate") -class URLProbedFor404(Base): +class URLProbedFor404(URLDependentMixin, StandardModel): __tablename__ = 'url_probed_for_404' - id = Column(Integer, primary_key=True) - url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) last_probed_at = get_created_at_column() # Relationships url = relationship("URL", uselist=False, back_populates="probed_for_404") -class URLOptionalDataSourceMetadata(Base): +class URLOptionalDataSourceMetadata(URLDependentMixin, StandardModel): __tablename__ = 'url_optional_data_source_metadata' - id = Column(Integer, primary_key=True) - url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) record_formats = Column(ARRAY(String), nullable=True) data_portal_type = Column(String, nullable=True) supplying_entity = Column(String, nullable=True) @@ -186,23 +168,19 @@ class URLOptionalDataSourceMetadata(Base): # Relationships url = relationship("URL", uselist=False, back_populates="optional_data_source_metadata") -class ReviewingUserURL(Base): +class ReviewingUserURL(CreatedAtMixin, URLDependentMixin, StandardModel): __tablename__ = 'reviewing_user_url' __table_args__ = ( UniqueConstraint( "url_id", name="approving_user_url_uq_user_id_url_id"), ) - - id = Column(Integer, primary_key=True) user_id = Column(Integer, nullable=False) - url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) - created_at = get_created_at_column() # Relationships url = relationship("URL", uselist=False, back_populates="reviewing_user") -class RootURL(Base): +class RootURL(UpdatedAtMixin, StandardModel): __tablename__ = 'root_url_cache' __table_args__ = ( UniqueConstraint( @@ -210,14 +188,12 @@ class RootURL(Base): name="uq_root_url_url"), ) - id = Column(Integer, primary_key=True) url = Column(String, nullable=False) page_title = Column(String, nullable=False) page_description = Column(String, nullable=True) - updated_at = get_updated_at_column() -class URLErrorInfo(Base): +class URLErrorInfo(UpdatedAtMixin, TaskDependentMixin, URLDependentMixin, StandardModel): __tablename__ = 'url_error_info' __table_args__ = (UniqueConstraint( "url_id", @@ -225,17 +201,13 @@ class URLErrorInfo(Base): name="uq_url_id_error"), ) - id = Column(Integer, primary_key=True) - url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) error = Column(Text, nullable=False) - updated_at = get_updated_at_column() - task_id = Column(Integer, ForeignKey('tasks.id'), nullable=False) # Relationships url = relationship("URL", back_populates="error_info") task = relationship("Task", back_populates="errored_urls") -class URLHTMLContent(Base): +class URLHTMLContent(UpdatedAtMixin, URLDependentMixin, StandardModel): __tablename__ = 'url_html_content' __table_args__ = (UniqueConstraint( "url_id", @@ -243,31 +215,21 @@ class URLHTMLContent(Base): name="uq_url_id_content_type"), ) - id = Column(Integer, primary_key=True, autoincrement=True) - url_id = Column(Integer, ForeignKey('urls.id'), nullable=False) content_type = Column( PGEnum('Title', 'Description', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'Div', name='url_html_content_type'), nullable=False) content = Column(Text, nullable=False) - updated_at = get_updated_at_column() # Relationships url = relationship("URL", back_populates="html_content") -class Duplicate(Base): +class Duplicate(BatchDependentMixin, StandardModel): """ Identifies duplicates which occur within a batch """ __tablename__ = 'duplicates' - id = Column(Integer, primary_key=True) - batch_id = Column( - Integer, - ForeignKey('batches.id'), - nullable=False, - doc="The batch that produced the duplicate" - ) original_url_id = Column( Integer, ForeignKey('urls.id'), @@ -281,41 +243,34 @@ class Duplicate(Base): -class Log(Base): +class Log(CreatedAtMixin, BatchDependentMixin, StandardModel): __tablename__ = 'logs' - id = Column(Integer, primary_key=True) - batch_id = Column(Integer, ForeignKey('batches.id'), nullable=False) log = Column(Text, nullable=False) - created_at = get_created_at_column() # Relationships batch = relationship("Batch", back_populates="logs") -class Missing(Base): +class Missing(BatchDependentMixin, StandardModel): __tablename__ = 'missing' - id = Column(Integer, primary_key=True) place_id = Column(Integer, nullable=False) record_type = Column(String, nullable=False) - batch_id = Column(Integer, ForeignKey('batches.id')) strategy_used = Column(Text, nullable=False) date_searched = get_created_at_column() # Relationships batch = relationship("Batch", back_populates="missings") -class Task(Base): +class Task(UpdatedAtMixin, StandardModel): __tablename__ = 'tasks' - id = Column(Integer, primary_key=True) task_type = Column( PGEnum( *[task_type.value for task_type in TaskType], name='task_type' ), nullable=False) task_status = Column(batch_status_enum, nullable=False) - updated_at = get_updated_at_column() # Relationships urls = relationship( @@ -339,13 +294,10 @@ class LinkTaskURL(Base): -class TaskError(Base): +class TaskError(UpdatedAtMixin, TaskDependentMixin, StandardModel): __tablename__ = 'task_errors' - id = Column(Integer, primary_key=True) - task_id = Column(Integer, ForeignKey('tasks.id', ondelete="CASCADE"), nullable=False) error = Column(Text, nullable=False) - updated_at = get_updated_at_column() # Relationships task = relationship("Task", back_populates="error") @@ -356,7 +308,7 @@ class TaskError(Base): name="uq_task_id_error"), ) -class Agency(Base): +class Agency(UpdatedAtMixin, Base): __tablename__ = "agencies" agency_id = Column(Integer, primary_key=True) @@ -364,19 +316,16 @@ class Agency(Base): state = Column(String, nullable=True) county = Column(String, nullable=True) locality = Column(String, nullable=True) - updated_at = get_updated_at_column() # Relationships automated_suggestions = relationship("AutomatedUrlAgencySuggestion", back_populates="agency") user_suggestions = relationship("UserUrlAgencySuggestion", back_populates="agency") confirmed_urls = relationship("ConfirmedURLAgency", back_populates="agency") -class ConfirmedURLAgency(Base): +class ConfirmedURLAgency(URLDependentMixin, StandardModel): __tablename__ = "confirmed_url_agency" - id = Column(Integer, primary_key=True, autoincrement=True) - url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) - agency_id = Column(Integer, ForeignKey("agencies.agency_id"), nullable=False) + agency_id = get_agency_id_foreign_column() url = relationship("URL", back_populates="confirmed_agencies") agency = relationship("Agency", back_populates="confirmed_urls") @@ -385,12 +334,10 @@ class ConfirmedURLAgency(Base): UniqueConstraint("url_id", "agency_id", name="uq_confirmed_url_agency"), ) -class AutomatedUrlAgencySuggestion(Base): +class AutomatedUrlAgencySuggestion(URLDependentMixin, StandardModel): __tablename__ = "automated_url_agency_suggestions" - id = Column(Integer, primary_key=True, autoincrement=True) - agency_id = Column(Integer, ForeignKey("agencies.agency_id"), nullable=True) - url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) + agency_id = get_agency_id_foreign_column(nullable=True) is_unknown = Column(Boolean, nullable=True) agency = relationship("Agency", back_populates="automated_suggestions") @@ -401,12 +348,10 @@ class AutomatedUrlAgencySuggestion(Base): ) -class UserUrlAgencySuggestion(Base): +class UserUrlAgencySuggestion(URLDependentMixin, StandardModel): __tablename__ = "user_url_agency_suggestions" - id = Column(Integer, primary_key=True, autoincrement=True) - agency_id = Column(Integer, ForeignKey("agencies.agency_id"), nullable=True) - url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) + agency_id = get_agency_id_foreign_column(nullable=True) user_id = Column(Integer, nullable=False) is_new = Column(Boolean, nullable=True) @@ -417,14 +362,10 @@ class UserUrlAgencySuggestion(Base): UniqueConstraint("agency_id", "url_id", "user_id", name="uq_user_url_agency_suggestions"), ) -class AutoRelevantSuggestion(Base): +class AutoRelevantSuggestion(UpdatedAtMixin, CreatedAtMixin, URLDependentMixin, StandardModel): __tablename__ = "auto_relevant_suggestions" - id = Column(Integer, primary_key=True, autoincrement=True) - url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) relevant = Column(Boolean, nullable=True) - created_at = get_created_at_column() - updated_at = get_updated_at_column() __table_args__ = ( UniqueConstraint("url_id", name="auto_relevant_suggestions_uq_url_id"), @@ -435,14 +376,14 @@ class AutoRelevantSuggestion(Base): url = relationship("URL", back_populates="auto_relevant_suggestion") -class AutoRecordTypeSuggestion(Base): +class AutoRecordTypeSuggestion( + UpdatedAtMixin, + CreatedAtMixin, + URLDependentMixin, + StandardModel +): __tablename__ = "auto_record_type_suggestions" - - id = Column(Integer, primary_key=True, autoincrement=True) - url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) record_type = Column(postgresql.ENUM(*record_type_values, name='record_type'), nullable=False) - created_at = get_created_at_column() - updated_at = get_updated_at_column() __table_args__ = ( UniqueConstraint("url_id", name="auto_record_type_suggestions_uq_url_id"), @@ -452,11 +393,14 @@ class AutoRecordTypeSuggestion(Base): url = relationship("URL", back_populates="auto_record_type_suggestion") -class UserRelevantSuggestion(Base): +class UserRelevantSuggestion( + UpdatedAtMixin, + CreatedAtMixin, + URLDependentMixin, + StandardModel +): __tablename__ = "user_relevant_suggestions" - id = Column(Integer, primary_key=True, autoincrement=True) - url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) user_id = Column(Integer, nullable=False) suggested_status = Column( postgresql.ENUM( @@ -468,8 +412,6 @@ class UserRelevantSuggestion(Base): ), nullable=True ) - created_at = get_created_at_column() - updated_at = get_updated_at_column() __table_args__ = ( UniqueConstraint("url_id", "user_id", name="uq_user_relevant_suggestions"), @@ -480,15 +422,11 @@ class UserRelevantSuggestion(Base): url = relationship("URL", back_populates="user_relevant_suggestion") -class UserRecordTypeSuggestion(Base): +class UserRecordTypeSuggestion(UpdatedAtMixin, CreatedAtMixin, URLDependentMixin, StandardModel): __tablename__ = "user_record_type_suggestions" - id = Column(Integer, primary_key=True, autoincrement=True) - url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) user_id = Column(Integer, nullable=False) record_type = Column(postgresql.ENUM(*record_type_values, name='record_type'), nullable=False) - created_at = get_created_at_column() - updated_at = get_updated_at_column() __table_args__ = ( UniqueConstraint("url_id", "user_id", name="uq_user_record_type_suggestions"), @@ -498,20 +436,15 @@ class UserRecordTypeSuggestion(Base): url = relationship("URL", back_populates="user_record_type_suggestion") -class BacklogSnapshot(Base): +class BacklogSnapshot(CreatedAtMixin, StandardModel): __tablename__ = "backlog_snapshot" - id = Column(Integer, primary_key=True, autoincrement=True) count_pending_total = Column(Integer, nullable=False) - created_at = get_created_at_column() -class URLDataSource(Base): +class URLDataSource(CreatedAtMixin, URLDependentMixin, StandardModel): __tablename__ = "url_data_sources" - id = Column(Integer, primary_key=True, autoincrement=True) - url_id = Column(Integer, ForeignKey("urls.id"), nullable=False) data_source_id = Column(Integer, nullable=False) - created_at = get_created_at_column() # Relationships url = relationship( diff --git a/src/db/models/helpers.py b/src/db/models/helpers.py new file mode 100644 index 00000000..f72f06ba --- /dev/null +++ b/src/db/models/helpers.py @@ -0,0 +1,18 @@ +from sqlalchemy import Column, TIMESTAMP, func, Integer, ForeignKey + + +def get_created_at_column(): + return Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) + + +def get_agency_id_foreign_column( + nullable: bool = False +): + return Column( + 'agency_id', + Integer(), + ForeignKey('agencies.agency_id', ondelete='CASCADE'), + nullable=nullable + ) + +CURRENT_TIME_SERVER_DEFAULT = func.now() diff --git a/src/db/models/mixins.py b/src/db/models/mixins.py new file mode 100644 index 00000000..541e5d09 --- /dev/null +++ b/src/db/models/mixins.py @@ -0,0 +1,60 @@ +from sqlalchemy import Column, Integer, ForeignKey, TIMESTAMP + +from src.db.models.helpers import get_created_at_column, CURRENT_TIME_SERVER_DEFAULT + + +class URLDependentMixin: + url_id = Column( + Integer, + ForeignKey( + 'urls.id', + ondelete="CASCADE", + ), + nullable=False + ) + + +class TaskDependentMixin: + task_id = Column( + Integer, + ForeignKey( + 'tasks.id', + ondelete="CASCADE", + ), + nullable=False + ) + + +class BatchDependentMixin: + batch_id = Column( + Integer, + ForeignKey( + 'batches.id', + ondelete="CASCADE", + ), + nullable=False + ) + + +class AgencyDependentMixin: + agency_id = Column( + Integer, + ForeignKey( + 'agencies.id', + ondelete="CASCADE", + ), + nullable=False + ) + + +class CreatedAtMixin: + created_at = get_created_at_column() + + +class UpdatedAtMixin: + updated_at = Column( + TIMESTAMP, + nullable=False, + server_default=CURRENT_TIME_SERVER_DEFAULT, + onupdate=CURRENT_TIME_SERVER_DEFAULT + ) diff --git a/src/db/models/templates.py b/src/db/models/templates.py new file mode 100644 index 00000000..3e0a1c95 --- /dev/null +++ b/src/db/models/templates.py @@ -0,0 +1,11 @@ +from sqlalchemy import Integer, Column +from sqlalchemy.orm import declarative_base + +# Base class for SQLAlchemy ORM models +Base = declarative_base() + +class StandardModel(Base): + __abstract__ = True + + id = Column(Integer, primary_key=True, autoincrement=True) + diff --git a/src/db/StatementComposer.py b/src/db/statement_composer.py similarity index 95% rename from src/db/StatementComposer.py rename to src/db/statement_composer.py index 77df0dac..c1ccd367 100644 --- a/src/db/StatementComposer.py +++ b/src/db/statement_composer.py @@ -3,9 +3,9 @@ from sqlalchemy import Select, select, exists, func, Subquery, and_, not_, ColumnElement from sqlalchemy.orm import aliased -from src.collector_manager.enums import URLStatus +from src.collectors.enums import URLStatus from src.db.enums import TaskType -from src.db.models import URL, URLHTMLContent, AutomatedUrlAgencySuggestion, URLOptionalDataSourceMetadata, Batch, \ +from src.db.models.core import URL, URLHTMLContent, AutomatedUrlAgencySuggestion, URLOptionalDataSourceMetadata, Batch, \ ConfirmedURLAgency, LinkTaskURL, Task, UserUrlAgencySuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion from src.core.enums import BatchStatus diff --git a/src/html_tag_collector/DataClassTags.py b/src/html_tag_collector/DataClassTags.py deleted file mode 100644 index c920a563..00000000 --- a/src/html_tag_collector/DataClassTags.py +++ /dev/null @@ -1,41 +0,0 @@ -from dataclasses import dataclass - -from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType - - -@dataclass -class ResponseHTMLInfo: - index: int = -1 - url: str = "" - url_path: str = "" - title: str = "" - description: str = "" - root_page_title: str = "" - http_response: int = -1 - h1: str = "" - h2: str = "" - h3: str = "" - h4: str = "" - h5: str = "" - h6: str = "" - div: str = "" - -ENUM_TO_ATTRIBUTE_MAPPING = { - HTMLContentType.TITLE: "title", - HTMLContentType.DESCRIPTION: "description", - HTMLContentType.H1: "h1", - HTMLContentType.H2: "h2", - HTMLContentType.H3: "h3", - HTMLContentType.H4: "h4", - HTMLContentType.H5: "h5", - HTMLContentType.H6: "h6", - HTMLContentType.DIV: "div" -} - -def convert_to_response_html_info(html_content_infos: list[URLHTMLContentInfo]): - response_html_info = ResponseHTMLInfo() - - for html_content_info in html_content_infos: - setattr(response_html_info, ENUM_TO_ATTRIBUTE_MAPPING[html_content_info.content_type], html_content_info.content) - - return response_html_info \ No newline at end of file diff --git a/src/html_tag_collector/README.md b/src/html_tag_collector/README.md deleted file mode 100644 index 0089f338..00000000 --- a/src/html_tag_collector/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# HTML tag collector - -This script adds HTML properties to a JSON or CSV file of existing URLs (and their labels optionally) -*Properties added:* `title`, `meta`, `root_page_title` and `header` HTML tags, `http_response` - -## How to use - -1. If running from the command line, pass the name of the file you want to run as an argument and make sure your file in the same directory. It should be populated with URLs and properties as in the example provided. If importing collector_main, it expects a polars dataframe as an input. -2. Optionally, create a virtual environment. This is especially useful if you don't already have `beautifulsoup4`, `requests`, and `polars` installed. In your terminal: -```commandline -python -m venv collector-environment -source collector-environment/bin/activate -``` -3. Now install the required python libraries: -```commandline -$pip install -r requirements.txt -``` -4. Run `python3 collector.py [filename]` -5. If running from the command line, check the directory: you should now have a `labeled-urls-headers.csv` file. Invalid URLs are removed. Otherewise the function returns a processed polars dataframe. - -## JavaScript rendered HTML tags - -Some webpages will render HTML tags with JavaScript. The tag collector can render these tags at the cost of significantly longer execution time. To enable this feature on the command line, add the `--render-javascript` flag like so: - -```commandline -python3 collector.py urls.csv --render-javascript -``` - -## Why does this exist? -We can use machine learning to predict whether a URL is relevant with some success, but labelers otherwise need to visit a URL in order to determine what is kept there. By adding these properties we can label data without navigating to the URL as often. diff --git a/src/html_tag_collector/url_adjustment_functions.py b/src/html_tag_collector/url_adjustment_functions.py deleted file mode 100644 index b4d25c3c..00000000 --- a/src/html_tag_collector/url_adjustment_functions.py +++ /dev/null @@ -1,42 +0,0 @@ -from urllib.parse import urlparse - - -def standardize_url_prefixes(urls: list[tuple[str]]): - new_urls = [] - for url_tup in urls: - url = url_tup[0] - # TODO: Need logic for if URL is none -- should not be included - # (also an unlikely case in the Source Collector) - url = add_https(url) - new_urls.append(url) - return new_urls - - -def http_to_https(url): - # Assumes url is in http format - if not url[4] == "s": - url = url[:4] + "s" + url[4:] - return url - - -async def remove_json_suffix(url): - if url is not None: - url = url.removesuffix(".json") - return url - - -def add_https(url: str) -> str: - if not url.startswith("http"): - url = "https://" + url - return url - - -def remove_trailing_backslash(url_path): - if url_path and url_path[-1] == "/": - url_path = url_path[:-1] - return url_path - - -def drop_hostname(new_url): - url_path = urlparse(new_url).path[1:] - return url_path diff --git a/src/html_tag_collector/util.py b/src/html_tag_collector/util.py deleted file mode 100644 index aa067bc7..00000000 --- a/src/html_tag_collector/util.py +++ /dev/null @@ -1,10 +0,0 @@ -def remove_excess_whitespace(s: str) -> str: - """Removes leading, trailing, and excess adjacent whitespace. - - Args: - s (str): String to remove whitespace from. - - Returns: - str: Clean string with excess whitespace stripped. - """ - return " ".join(s.split()).strip() diff --git a/src/pdap_api/__init__.py b/src/pdap_api/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/pdap_api_client/PDAPClient.py b/src/pdap_api/client.py similarity index 92% rename from src/pdap_api_client/PDAPClient.py rename to src/pdap_api/client.py index 653d9c5d..08e3a9a8 100644 --- a/src/pdap_api_client/PDAPClient.py +++ b/src/pdap_api/client.py @@ -1,9 +1,10 @@ from typing import Optional -from src.core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmitApprovedURLTDO, SubmittedURLInfo -from src.pdap_api_client.DTOs import MatchAgencyInfo, UniqueURLDuplicateInfo, \ - MatchAgencyResponse -from src.pdap_api_client.enums import MatchAgencyResponseStatus +from src.core.tasks.operators.submit_approved_url.tdo import SubmitApprovedURLTDO, SubmittedURLInfo +from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse +from src.pdap_api.dtos.unique_url_duplicate import UniqueURLDuplicateInfo +from src.pdap_api.dtos.match_agency.post import MatchAgencyInfo +from src.pdap_api.enums import MatchAgencyResponseStatus from pdap_access_manager import AccessManager, DataSourcesNamespaces, RequestInfo, RequestType diff --git a/src/pdap_api/dtos/__init__.py b/src/pdap_api/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/pdap_api/dtos/match_agency/__init__.py b/src/pdap_api/dtos/match_agency/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/pdap_api/dtos/match_agency/post.py b/src/pdap_api/dtos/match_agency/post.py new file mode 100644 index 00000000..14870796 --- /dev/null +++ b/src/pdap_api/dtos/match_agency/post.py @@ -0,0 +1,11 @@ +from typing import Optional + +from pydantic import BaseModel + + +class MatchAgencyInfo(BaseModel): + id: int + submitted_name: str + state: Optional[str] = None + county: Optional[str] = None + locality: Optional[str] = None diff --git a/src/pdap_api/dtos/match_agency/response.py b/src/pdap_api/dtos/match_agency/response.py new file mode 100644 index 00000000..8077785c --- /dev/null +++ b/src/pdap_api/dtos/match_agency/response.py @@ -0,0 +1,11 @@ +from typing import List + +from pydantic import BaseModel + +from src.pdap_api.dtos.match_agency.post import MatchAgencyInfo +from src.pdap_api.enums import MatchAgencyResponseStatus + + +class MatchAgencyResponse(BaseModel): + status: MatchAgencyResponseStatus + matches: List[MatchAgencyInfo] diff --git a/src/pdap_api/dtos/unique_url_duplicate.py b/src/pdap_api/dtos/unique_url_duplicate.py new file mode 100644 index 00000000..1c71c431 --- /dev/null +++ b/src/pdap_api/dtos/unique_url_duplicate.py @@ -0,0 +1,11 @@ +from typing import Optional + +from pydantic import BaseModel + +from src.pdap_api.enums import ApprovalStatus + + +class UniqueURLDuplicateInfo(BaseModel): + original_url: str + approval_status: ApprovalStatus + rejection_note: Optional[str] = None diff --git a/src/pdap_api_client/enums.py b/src/pdap_api/enums.py similarity index 50% rename from src/pdap_api_client/enums.py rename to src/pdap_api/enums.py index 3dc7d931..36111acd 100644 --- a/src/pdap_api_client/enums.py +++ b/src/pdap_api/enums.py @@ -5,3 +5,10 @@ class MatchAgencyResponseStatus(Enum): EXACT_MATCH = "Exact Match" PARTIAL_MATCH = "Partial Matches" NO_MATCH = "No Match" + + +class ApprovalStatus(Enum): + APPROVED = "approved" + REJECTED = "rejected" + PENDING = "pending" + NEEDS_IDENTIFICATION = "needs identification" diff --git a/src/pdap_api_client/DTOs.py b/src/pdap_api_client/DTOs.py deleted file mode 100644 index 960e1995..00000000 --- a/src/pdap_api_client/DTOs.py +++ /dev/null @@ -1,29 +0,0 @@ -from enum import Enum -from typing import Optional, List - -from pydantic import BaseModel - -from src.pdap_api_client.enums import MatchAgencyResponseStatus - - -class MatchAgencyInfo(BaseModel): - id: int - submitted_name: str - state: Optional[str] = None - county: Optional[str] = None - locality: Optional[str] = None - -class ApprovalStatus(Enum): - APPROVED = "approved" - REJECTED = "rejected" - PENDING = "pending" - NEEDS_IDENTIFICATION = "needs identification" - -class UniqueURLDuplicateInfo(BaseModel): - original_url: str - approval_status: ApprovalStatus - rejection_note: Optional[str] = None - -class MatchAgencyResponse(BaseModel): - status: MatchAgencyResponseStatus - matches: List[MatchAgencyInfo] diff --git a/src/security/__init__.py b/src/security/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/security/constants.py b/src/security/constants.py new file mode 100644 index 00000000..8d4cb593 --- /dev/null +++ b/src/security/constants.py @@ -0,0 +1 @@ +ALGORITHM = "HS256" diff --git a/src/security/dtos/__init__.py b/src/security/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/security/dtos/access_info.py b/src/security/dtos/access_info.py new file mode 100644 index 00000000..ae0eace8 --- /dev/null +++ b/src/security/dtos/access_info.py @@ -0,0 +1,11 @@ +from pydantic import BaseModel + +from src.security.enums import Permissions + + +class AccessInfo(BaseModel): + user_id: int + permissions: list[Permissions] + + def has_permission(self, permission: Permissions) -> bool: + return permission in self.permissions diff --git a/src/security/enums.py b/src/security/enums.py new file mode 100644 index 00000000..c10c346b --- /dev/null +++ b/src/security/enums.py @@ -0,0 +1,6 @@ +from enum import Enum + + +class Permissions(Enum): + SOURCE_COLLECTOR = "source_collector" + SOURCE_COLLECTOR_FINAL_REVIEW = "source_collector_final_review" diff --git a/src/security_manager/SecurityManager.py b/src/security/manager.py similarity index 80% rename from src/security_manager/SecurityManager.py rename to src/security/manager.py index 6d5236d6..97bc0da8 100644 --- a/src/security_manager/SecurityManager.py +++ b/src/security/manager.py @@ -1,5 +1,4 @@ import os -from enum import Enum from typing import Annotated import dotenv @@ -8,26 +7,11 @@ from fastapi.params import Depends from fastapi.security import OAuth2PasswordBearer from jwt import InvalidTokenError -from pydantic import BaseModel from starlette import status -ALGORITHM = "HS256" - -def get_secret_key(): - dotenv.load_dotenv() - secret_key = os.getenv("DS_APP_SECRET_KEY") - return secret_key - -class Permissions(Enum): - SOURCE_COLLECTOR = "source_collector" - SOURCE_COLLECTOR_FINAL_REVIEW = "source_collector_final_review" - -class AccessInfo(BaseModel): - user_id: int - permissions: list[Permissions] - - def has_permission(self, permission: Permissions) -> bool: - return permission in self.permissions +from src.security.constants import ALGORITHM +from src.security.dtos.access_info import AccessInfo +from src.security.enums import Permissions class SecurityManager: @@ -35,7 +19,8 @@ class SecurityManager: def __init__( self ): - self.secret_key = get_secret_key() + dotenv.load_dotenv() + self.secret_key = os.getenv("DS_APP_SECRET_KEY") def validate_token(self, token: str) -> AccessInfo: try: diff --git a/src/source_collectors/auto_googler/DTOs.py b/src/source_collectors/auto_googler/DTOs.py deleted file mode 100644 index 491d4e7c..00000000 --- a/src/source_collectors/auto_googler/DTOs.py +++ /dev/null @@ -1,32 +0,0 @@ -from pydantic import BaseModel, Field - - -class AutoGooglerInputDTO(BaseModel): - urls_per_result: int = Field( - description="Maximum number of URLs returned per result. Minimum is 1. Default is 10", - default=10, - ge=1, - le=10 - ) - queries: list[str] = Field( - description="List of queries to search for.", - min_length=1, - max_length=100 - ) - -class AutoGooglerInnerOutputDTO(BaseModel): - title: str = Field(description="The title of the result.") - url: str = Field(description="The URL of the result.") - snippet: str = Field(description="The snippet of the result.") - -class AutoGooglerResultDTO(BaseModel): - query: str = Field(description="The query used for the search.") - query_results: list[AutoGooglerInnerOutputDTO] = Field(description="List of results for each query.") - -class AutoGooglerOutputDTO(BaseModel): - results: list[AutoGooglerResultDTO] - -class GoogleSearchQueryResultsInnerDTO(BaseModel): - url: str = Field(description="The URL of the result.") - title: str = Field(description="The title of the result.") - snippet: str = Field(description="The snippet of the result.") diff --git a/src/source_collectors/ckan/ckan_scraper_toolkit.py b/src/source_collectors/ckan/ckan_scraper_toolkit.py deleted file mode 100644 index 2dca5e51..00000000 --- a/src/source_collectors/ckan/ckan_scraper_toolkit.py +++ /dev/null @@ -1,254 +0,0 @@ -"""Toolkit of functions that use ckanapi to retrieve packages from CKAN data portals""" -import asyncio -import math -import sys -from dataclasses import dataclass, field -from datetime import datetime -from typing import Any, Optional -from urllib.parse import urljoin - -import aiohttp -from bs4 import BeautifulSoup, ResultSet, Tag - -from src.source_collectors.ckan.CKANAPIInterface import CKANAPIInterface - - -@dataclass -class Package: - """ - A class representing a CKAN package (dataset). - """ - base_url: str = "" - url: str = "" - title: str = "" - agency_name: str = "" - description: str = "" - supplying_entity: str = "" - record_format: list = field(default_factory=lambda: []) - data_portal_type: str = "" - source_last_updated: str = "" - - def to_dict(self): - """ - Returns a dictionary representation of the package. - """ - return { - "source_url": self.url, - "submitted_name": self.title, - "agency_name": self.agency_name, - "description": self.description, - "supplying_entity": self.supplying_entity, - "record_format": self.record_format, - "data_portal_type": self.data_portal_type, - "source_last_updated": self.source_last_updated, - } - - -async def ckan_package_search( - base_url: str, - query: Optional[str] = None, - rows: Optional[int] = sys.maxsize, - start: Optional[int] = 0, - **kwargs, -) -> list[dict[str, Any]]: - """Performs a CKAN package (dataset) search from a CKAN data catalog URL. - - :param base_url: Base URL to search from. e.g. "https://catalog.data.gov/" - :param query: Search string, defaults to None. None will return all packages. - :param rows: Maximum number of results to return, defaults to maximum integer. - :param start: Offsets the results, defaults to 0. - :param kwargs: See https://docs.ckan.org/en/2.10/api/index.html#ckan.logic.action.get.package_search for additional arguments. - :return: List of dictionaries representing the CKAN package search results. - """ - interface = CKANAPIInterface(base_url) - results = [] - offset = start - rows_max = 1000 # CKAN's package search has a hard limit of 1000 packages returned at a time by default - - while start < rows: - num_rows = rows - start + offset - packages: dict = await interface.package_search( - query=query, rows=num_rows, start=start, **kwargs - ) - add_base_url_to_packages(base_url, packages) - results += packages["results"] - - total_results = packages["count"] - if rows > total_results: - rows = total_results - - result_len = len(packages["results"]) - # Check if the website has a different rows_max value than CKAN's default - if result_len != rows_max and start + rows_max < total_results: - rows_max = result_len - - start += rows_max - - return results - - -def add_base_url_to_packages(base_url, packages): - # Add the base_url to each package - [package.update(base_url=base_url) for package in packages["results"]] - - -async def ckan_package_search_from_organization( - base_url: str, organization_id: str -) -> list[dict[str, Any]]: - """Returns a list of CKAN packages from an organization. Only 10 packages are able to be returned. - - :param base_url: Base URL of the CKAN portal. e.g. "https://catalog.data.gov/" - :param organization_id: The organization's ID. - :return: List of dictionaries representing the packages associated with the organization. - """ - interface = CKANAPIInterface(base_url) - organization = await interface.get_organization(organization_id) - packages = organization["packages"] - results = await search_for_results(base_url, packages) - - return results - - -async def search_for_results(base_url, packages): - results = [] - for package in packages: - query = f"id:{package['id']}" - results += await ckan_package_search(base_url=base_url, query=query) - return results - - -async def ckan_group_package_show( - base_url: str, id: str, limit: Optional[int] = sys.maxsize -) -> list[dict[str, Any]]: - """Returns a list of CKAN packages from a group. - - :param base_url: Base URL of the CKAN portal. e.g. "https://catalog.data.gov/" - :param id: The group's ID. - :param limit: Maximum number of results to return, defaults to maximum integer. - :return: List of dictionaries representing the packages associated with the group. - """ - interface = CKANAPIInterface(base_url) - results = await interface.get_group_package(group_package_id=id, limit=limit) - # Add the base_url to each package - [package.update(base_url=base_url) for package in results] - return results - - -async def ckan_collection_search(base_url: str, collection_id: str) -> list[Package]: - """Returns a list of CKAN packages from a collection. - - :param base_url: Base URL of the CKAN portal before the collection ID. e.g. "https://catalog.data.gov/dataset/" - :param collection_id: The ID of the parent package. - :return: List of Package objects representing the packages associated with the collection. - """ - url = f"{base_url}?collection_package_id={collection_id}" - soup = await _get_soup(url) - - # Calculate the total number of pages of packages - num_results = int(soup.find(class_="new-results").text.split()[0].replace(",", "")) - pages = math.ceil(num_results / 20) - - packages = await get_packages(base_url, collection_id, pages) - - return packages - - -async def get_packages(base_url, collection_id, pages): - packages = [] - for page in range(1, pages + 1): - url = f"{base_url}?collection_package_id={collection_id}&page={page}" - soup = await _get_soup(url) - - packages = [] - for dataset_content in soup.find_all(class_="dataset-content"): - await asyncio.sleep(1) - package = await _collection_search_get_package_data(dataset_content, base_url) - packages.append(package) - - return packages - -async def _collection_search_get_package_data(dataset_content, base_url: str): - """Parses the dataset content and returns a Package object.""" - package = Package() - joined_url = urljoin(base_url, dataset_content.a.get("href")) - dataset_soup = await _get_soup(joined_url) - # Determine if the dataset url should be the linked page to an external site or the current site - resources = get_resources(dataset_soup) - button = get_button(resources) - set_url_and_data_portal_type(button, joined_url, package, resources) - package.base_url = base_url - set_title(dataset_soup, package) - set_agency_name(dataset_soup, package) - set_supplying_entity(dataset_soup, package) - set_description(dataset_soup, package) - set_record_format(dataset_content, package) - date = get_data(dataset_soup) - set_source_last_updated(date, package) - - return package - - -def set_source_last_updated(date, package): - package.source_last_updated = datetime.strptime(date, "%B %d, %Y").strftime( - "%Y-%d-%m" - ) - - -def get_data(dataset_soup): - return dataset_soup.find(property="dct:modified").text.strip() - - -def get_button(resources: ResultSet) -> Optional[Tag]: - if len(resources) == 0: - return None - return resources[0].find(class_="btn-group") - - -def get_resources(dataset_soup): - return dataset_soup.find("section", id="dataset-resources").find_all( - class_="resource-item" - ) - - -def set_url_and_data_portal_type( - button: Optional[Tag], - joined_url: str, - package: Package, - resources: ResultSet -): - if len(resources) == 1 and button is not None and button.a.text == "Visit page": - package.url = button.a.get("href") - else: - package.url = joined_url - package.data_portal_type = "CKAN" - - -def set_record_format(dataset_content, package): - package.record_format = [ - format1.text.strip() for format1 in dataset_content.find_all("li") - ] - package.record_format = list(set(package.record_format)) - - -def set_title(dataset_soup, package): - package.title = dataset_soup.find(itemprop="name").text.strip() - - -def set_agency_name(dataset_soup, package): - package.agency_name = dataset_soup.find("h1", class_="heading").text.strip() - - -def set_supplying_entity(dataset_soup, package): - package.supplying_entity = dataset_soup.find(property="dct:publisher").text.strip() - - -def set_description(dataset_soup, package): - package.description = dataset_soup.find(class_="notes").p.text - - -async def _get_soup(url: str) -> BeautifulSoup: - """Returns a BeautifulSoup object for the given URL.""" - async with aiohttp.ClientSession() as session: - async with session.get(url) as response: - response.raise_for_status() - return BeautifulSoup(await response.text(), "lxml") diff --git a/src/source_collectors/ckan/search_terms.py b/src/source_collectors/ckan/search_terms.py deleted file mode 100644 index b5de4e2a..00000000 --- a/src/source_collectors/ckan/search_terms.py +++ /dev/null @@ -1,36 +0,0 @@ -""" -CKAN search terms -""" - -package_search = [ - { - "url": "https://catalog.data.gov/", - "terms": [ - "police", - "crime", - "tags:(court courts court-cases criminal-justice-system law-enforcement law-enforcement-agencies)", - ], - }, - {"url": "https://data.boston.gov/", "terms": ["police"]}, - {"url": "https://open.jacksonms.gov/", "terms": ["tags:police"]}, - {"url": "https://data.milwaukee.gov/", "terms": ["mpd", "wibr"]}, - {"url": "https://data.sanantonio.gov/", "terms": ["sapd"]}, - {"url": "https://data.sanjoseca.gov/", "terms": ["police"]}, -] - -group_search = [ - { - "url": "https://data.birminghamal.gov/", - "ids": [ - "3c648d96-0a29-4deb-aa96-150117119a23", - "92654c61-3a7d-484f-a146-257c0f6c55aa", - ], - } -] - -organization_search = [ - { - "url": "https://data.houstontx.gov/", - "ids": ["d6f4346d-f298-498d-b8dd-a4b95ee0846b"], - }, -] diff --git a/src/source_collectors/common_crawler/crawler.py b/src/source_collectors/common_crawler/crawler.py deleted file mode 100644 index c2646068..00000000 --- a/src/source_collectors/common_crawler/crawler.py +++ /dev/null @@ -1,160 +0,0 @@ -import json -import time -from dataclasses import dataclass -from http import HTTPStatus -from urllib.parse import quote_plus - -import requests - -from .utils import URLWithParameters - -""" -This module contains classes for managing a cache of Common Crawl search results -""" - -# TODO: What happens when no results are found? How does the CommonCrawlerManager handle this? - - -@dataclass -class CommonCrawlResult: - """ - A class to hold the results of a Common Crawl search. - Args: - last_page_search: the last page searched - url_results: the list of URLs found in the search - """ - last_page_search: int - url_results: list[str] - - -class CommonCrawlerManager: - """ - This class orchestrates the crawling process, leveraging CommonCrawler for - actual interactions with the Common Crawl Index Server and CommonCrawlerCacheManager - for caching results. - It validates crawl ids, manages pagination, and aggregates results. - """ - - def __init__(self, crawl_id="CC-MAIN-2023-50"): - """ - Initializes the CommonCrawlerManager with a crawl ID. - Args: - crawl_id: the Common Crawl index to use - """ - self.crawl_id = crawl_id - CC_INDEX_SERVER = "http://index.commoncrawl.org/" - INDEX_NAME = f"{self.crawl_id}-index" - self.root_url = f"{CC_INDEX_SERVER}{INDEX_NAME}" - - def crawl(self, search_term, keyword, start_page, num_pages) -> CommonCrawlResult: - """ - Crawls the Common Crawl index for a given search term and keyword. - Args: - search_term: the term to search for - keyword: the keyword to search for - start_page: the page to start the search from - num_pages: the number of pages to search - """ - print( - f"Searching for {keyword} on {search_term} in {self.crawl_id} for {num_pages} pages," - f" starting at page {start_page}" - ) - - url_results = [] - - end_page = start_page + num_pages - last_page = start_page - - for next_page in range(start_page, end_page): - records = self.search_common_crawl_index(search_term, next_page) - - # If records were found, filter them and add to results - if not records: - continue - - keyword_urls = self.get_urls_with_keyword(records, keyword) - url_results.extend(keyword_urls) - - last_page = next_page - - # Wait 5 seconds before making the next request, to avoid overloading the server - time.sleep(5) - - return CommonCrawlResult(last_page, url_results) - - def search_common_crawl_index( - self, url: str, page: int = 0, max_retries: int = 20 - ) -> list[dict]: - """ - This method is used to search the Common Crawl index for a given URL and page number - Args: - url: a URL to search for - page: the page number to search - - Returns: A list of records (dictionaries) containing the search results - - """ - encoded_url = quote_plus(url) - search_url = URLWithParameters(self.root_url) - search_url.add_parameter("url", encoded_url) - search_url.add_parameter("output", "json") - search_url.add_parameter("page", page) - - retries = 0 - delay = 1 - - # put HTTP GET request in re-try loop in case of rate limiting. Once per second is nice enough per common crawl doc. - while retries < max_retries: - response = self.make_request(search_url) - if response: - return self.process_response(response, url, page) - - retries += 1 - print( - f"Rate limit exceeded. Retrying in {delay} second(s)... (Attempt {retries}/{max_retries})" - ) - time.sleep(delay) - - print(f"Max retries exceeded. Failed to get records for {url} on page {page}.") - return None - - def make_request(self, search_url: str) -> requests.Response: - """ - Makes the HTTP GET request to the given search URL. - Return the response if successful, None if rate-limited. - """ - try: - response = requests.get(str(search_url)) - response.raise_for_status() - return response - except requests.exceptions.RequestException as e: - if ( - response.status_code == HTTPStatus.INTERNAL_SERVER_ERROR - and "SlowDown" in response.text - ): - return None - else: - print(f"Failed to get records: {e}") - return None - - def process_response( - self, response: requests.Response, url: str, page: int - ) -> list[dict]: - """Processes the HTTP response and returns the parsed records if successful.""" - if response.status_code == HTTPStatus.OK: - records = response.text.strip().split("\n") - print(f"Found {len(records)} records for {url} on page {page}") - return [json.loads(record) for record in records] - elif "First Page is 0, Last Page is 0" in response.text: - print("No records exist in index matching the url search term") - return None - else: - print(f"Unexpected response: {response.status_code}") - return None - - @staticmethod - def get_urls_with_keyword(records: list[dict], keyword) -> list[str]: - """ - Returns a list of URLs that contain the given keyword - """ - return [record["url"] for record in records if keyword in record["url"]] diff --git a/src/source_collectors/helpers/RequestManager.py b/src/source_collectors/helpers/RequestManager.py deleted file mode 100644 index 4cb71fbd..00000000 --- a/src/source_collectors/helpers/RequestManager.py +++ /dev/null @@ -1,2 +0,0 @@ - -# class RequestManager: \ No newline at end of file diff --git a/src/source_collectors/muckrock/.gitignore b/src/source_collectors/muckrock/.gitignore deleted file mode 100644 index 5047d9bc..00000000 --- a/src/source_collectors/muckrock/.gitignore +++ /dev/null @@ -1,228 +0,0 @@ -# Project specific -/Counties/Florida/Bay County/Scraper/attachments/* -/Counties/Florida/Bay County/Scraper/captcha/correct/* -/Counties/Florida/Bay County/Scraper/captcha/incorrect/* -/scrapers_library/CA/san_bernardino_county/data - -# Ignore dolt repos (cloned from ETL) -**/datasets -**/data-intake - -# Python gitignore from: https://github.com/github/gitignore/blob/master/Python.gitignore - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# Vim temp files -## swap -[._]*.s[a-v][a-z] -[._]*.sw[a-p] -[._]s[a-v][a-z] -[._]sw[a-p] -## session -Session.vim -## temporary -.netrwhist -*~ - -# OS generated files -.DS_Store -.DS_Store? -._* -.Spotlight-V100 -.Trashes -ehthumbs.db -Thumbs.db - -# IDE generated files -.idea - -# Emacs temp files -\#*\# -/.emacs.desktop -/.emacs.desktop.lock -*.elc -auto-save-list -tramp -.\#* - -## Org-mode -.org-id-locations -*_archive -!incident_blotter_archive/ - -## flymake-mode -*_flymake.* - -## eshell files -/eshell/history -/eshell/lastdir - -## elpa packages -/elpa/ - -## reftex files -*.rel - -## AUCTeX auto folder -/auto/ - -## cask packages -.cask/ -dist/ - -## Flycheck -flycheck_*.el - -## server auth directory -/server/ - -## projectiles files -.projectile - -## directory configuration -.dir-locals.el - -.vscode -/.vscode - -*.db -*.json -*.csv -/csv diff --git a/src/source_collectors/muckrock/DTOs.py b/src/source_collectors/muckrock/DTOs.py deleted file mode 100644 index e3399607..00000000 --- a/src/source_collectors/muckrock/DTOs.py +++ /dev/null @@ -1,20 +0,0 @@ -from pydantic import BaseModel, Field - - -class MuckrockSimpleSearchCollectorInputDTO(BaseModel): - search_string: str = Field(description="The search string to use.") - max_results: int or None = Field( - description="The maximum number of results to return. " - "If none, all results will be returned (and may take considerably longer to process).", - ge=1, - default=10 - ) - -class MuckrockCountySearchCollectorInputDTO(BaseModel): - # TODO: How to determine the ID of a parent jurisdiction? - parent_jurisdiction_id: int = Field(description="The ID of the parent jurisdiction.", ge=1) - town_names: list[str] = Field(description="The names of the towns to search for.", min_length=1) - -class MuckrockAllFOIARequestsCollectorInputDTO(BaseModel): - start_page: int = Field(description="The page to start from.", ge=1) - total_pages: int = Field(description="The total number of pages to fetch.", ge=1, default=1) \ No newline at end of file diff --git a/src/source_collectors/muckrock/allegheny-county-towns.txt b/src/source_collectors/muckrock/allegheny-county-towns.txt deleted file mode 100644 index 4588e164..00000000 --- a/src/source_collectors/muckrock/allegheny-county-towns.txt +++ /dev/null @@ -1,61 +0,0 @@ -Allegheny County -Allison Park -Bairdford -Bakerstown -Bethel Park -Brackenridge -Braddock -Bradfordwoods -Bridgeville -Buena Vista -Bunola -Carnegie -Cheswick -Clairton -Coraopolis -Coulters -Creighton -Crescent -Cuddy -Curtisville -Dravosburg -Duquesne -East McKeesport -East Pittsburgh -Elizabeth -Gibsonia -Glassport -Glenshaw -Greenock -Harwick -Homestead -Imperial -Indianola -Ingomar -Leetsdale -McKees Rocks -Mckeesport -Monroeville -Morgan -Natrona Heights -North Versailles -Oakdale -Oakmont -Pitcairn -Pittsburgh -Presto -Rural Ridge -Russellton -Sewickley -South Park -Springdale -Sturgeon -Tarentum -Turtle Creek -Verona -Warrendale -West Elizabeth -West Mifflin -Wexford -Wildwood -Wilmerding diff --git a/src/source_collectors/muckrock/classes/MuckrockCollector.py b/src/source_collectors/muckrock/classes/MuckrockCollector.py deleted file mode 100644 index 38a52af8..00000000 --- a/src/source_collectors/muckrock/classes/MuckrockCollector.py +++ /dev/null @@ -1,158 +0,0 @@ -import itertools - -from src.collector_manager.AsyncCollectorBase import AsyncCollectorBase -from src.collector_manager.enums import CollectorType -from src.core.preprocessors.MuckrockPreprocessor import MuckrockPreprocessor -from src.source_collectors.muckrock.DTOs import MuckrockAllFOIARequestsCollectorInputDTO, \ - MuckrockCountySearchCollectorInputDTO, MuckrockSimpleSearchCollectorInputDTO -from src.source_collectors.muckrock.classes.FOIASearcher import FOIASearcher, SearchCompleteException -from src.source_collectors.muckrock.classes.fetch_requests.FOIALoopFetchRequest import FOIALoopFetchRequest -from src.source_collectors.muckrock.classes.fetch_requests.JurisdictionLoopFetchRequest import JurisdictionLoopFetchRequest -from src.source_collectors.muckrock.classes.muckrock_fetchers.FOIAFetcher import FOIAFetcher -from src.source_collectors.muckrock.classes.muckrock_fetchers.FOIALoopFetcher import FOIALoopFetcher -from src.source_collectors.muckrock.classes.muckrock_fetchers.JurisdictionGeneratorFetcher import \ - JurisdictionGeneratorFetcher -from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher import MuckrockNoMoreDataError - - -class MuckrockSimpleSearchCollector(AsyncCollectorBase): - """ - Performs searches on MuckRock's database - by matching a search string to title of request - """ - collector_type = CollectorType.MUCKROCK_SIMPLE_SEARCH - preprocessor = MuckrockPreprocessor - - def check_for_count_break(self, count, max_count) -> None: - if max_count is None: - return - if count >= max_count: - raise SearchCompleteException - - async def run_implementation(self) -> None: - fetcher = FOIAFetcher() - dto: MuckrockSimpleSearchCollectorInputDTO = self.dto - searcher = FOIASearcher( - fetcher=fetcher, - search_term=dto.search_string - ) - max_count = dto.max_results - all_results = [] - results_count = 0 - for search_count in itertools.count(): - try: - results = await searcher.get_next_page_results() - all_results.extend(results) - results_count += len(results) - self.check_for_count_break(results_count, max_count) - except SearchCompleteException: - break - await self.log(f"Search {search_count}: Found {len(results)} results") - - await self.log(f"Search Complete. Total results: {results_count}") - self.data = {"urls": self.format_results(all_results)} - - def format_results(self, results: list[dict]) -> list[dict]: - formatted_results = [] - for result in results: - formatted_result = { - "url": result["absolute_url"], - "metadata": result - } - formatted_results.append(formatted_result) - - return formatted_results - - -class MuckrockCountyLevelSearchCollector(AsyncCollectorBase): - """ - Searches for any and all requests in a certain county - """ - collector_type = CollectorType.MUCKROCK_COUNTY_SEARCH - preprocessor = MuckrockPreprocessor - - async def run_implementation(self) -> None: - jurisdiction_ids = await self.get_jurisdiction_ids() - if jurisdiction_ids is None: - await self.log("No jurisdictions found") - return - all_data = await self.get_foia_records(jurisdiction_ids) - formatted_data = self.format_data(all_data) - self.data = {"urls": formatted_data} - - def format_data(self, all_data): - formatted_data = [] - for data in all_data: - formatted_data.append({ - "url": data["absolute_url"], - "metadata": data - }) - return formatted_data - - async def get_foia_records(self, jurisdiction_ids): - all_data = [] - for name, id_ in jurisdiction_ids.items(): - await self.log(f"Fetching records for {name}...") - request = FOIALoopFetchRequest(jurisdiction=id_) - fetcher = FOIALoopFetcher(request) - await fetcher.loop_fetch() - all_data.extend(fetcher.ffm.results) - return all_data - - async def get_jurisdiction_ids(self): - dto: MuckrockCountySearchCollectorInputDTO = self.dto - parent_jurisdiction_id = dto.parent_jurisdiction_id - request = JurisdictionLoopFetchRequest( - level="l", - parent=parent_jurisdiction_id, - town_names=dto.town_names - ) - fetcher = JurisdictionGeneratorFetcher(initial_request=request) - async for message in fetcher.generator_fetch(): - await self.log(message) - jurisdiction_ids = fetcher.jfm.jurisdictions - return jurisdiction_ids - - -class MuckrockAllFOIARequestsCollector(AsyncCollectorBase): - """ - Retrieves urls associated with all Muckrock FOIA requests - """ - collector_type = CollectorType.MUCKROCK_ALL_SEARCH - preprocessor = MuckrockPreprocessor - - async def run_implementation(self) -> None: - dto: MuckrockAllFOIARequestsCollectorInputDTO = self.dto - start_page = dto.start_page - fetcher = FOIAFetcher( - start_page=start_page, - ) - total_pages = dto.total_pages - all_page_data = await self.get_page_data(fetcher, start_page, total_pages) - all_transformed_data = self.transform_data(all_page_data) - self.data = {"urls": all_transformed_data} - - - async def get_page_data(self, fetcher, start_page, total_pages): - all_page_data = [] - for page in range(start_page, start_page + total_pages): - await self.log(f"Fetching page {fetcher.current_page}") - try: - page_data = await fetcher.fetch_next_page() - except MuckrockNoMoreDataError: - await self.log(f"No more data to fetch at page {fetcher.current_page}") - break - if page_data is None: - continue - all_page_data.append(page_data) - return all_page_data - - def transform_data(self, all_page_data): - all_transformed_data = [] - for page_data in all_page_data: - for data in page_data["results"]: - all_transformed_data.append({ - "url": data["absolute_url"], - "metadata": data - }) - return all_transformed_data \ No newline at end of file diff --git a/src/source_collectors/muckrock/classes/exceptions/RequestFailureException.py b/src/source_collectors/muckrock/classes/exceptions/RequestFailureException.py deleted file mode 100644 index 61fefd9c..00000000 --- a/src/source_collectors/muckrock/classes/exceptions/RequestFailureException.py +++ /dev/null @@ -1,5 +0,0 @@ -class RequestFailureException(Exception): - """ - Indicates when a failure occurred while making a request - """ - pass diff --git a/src/source_collectors/muckrock/classes/fetch_requests/FOIALoopFetchRequest.py b/src/source_collectors/muckrock/classes/fetch_requests/FOIALoopFetchRequest.py deleted file mode 100644 index be008edf..00000000 --- a/src/source_collectors/muckrock/classes/fetch_requests/FOIALoopFetchRequest.py +++ /dev/null @@ -1,5 +0,0 @@ -from src.source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest - - -class FOIALoopFetchRequest(FetchRequest): - jurisdiction: int diff --git a/src/source_collectors/muckrock/classes/muckrock_fetchers/AgencyFetcher.py b/src/source_collectors/muckrock/classes/muckrock_fetchers/AgencyFetcher.py deleted file mode 100644 index abb59c6d..00000000 --- a/src/source_collectors/muckrock/classes/muckrock_fetchers/AgencyFetcher.py +++ /dev/null @@ -1,15 +0,0 @@ -from src.source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest -from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher import MuckrockFetcher -from src.source_collectors.muckrock.constants import BASE_MUCKROCK_URL - - -class AgencyFetchRequest(FetchRequest): - agency_id: int - -class AgencyFetcher(MuckrockFetcher): - - def build_url(self, request: AgencyFetchRequest) -> str: - return f"{BASE_MUCKROCK_URL}/agency/{request.agency_id}/" - - async def get_agency(self, agency_id: int): - return await self.fetch(AgencyFetchRequest(agency_id=agency_id)) \ No newline at end of file diff --git a/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionByIDFetcher.py b/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionByIDFetcher.py deleted file mode 100644 index 0f29b9d8..00000000 --- a/src/source_collectors/muckrock/classes/muckrock_fetchers/JurisdictionByIDFetcher.py +++ /dev/null @@ -1,15 +0,0 @@ -from src.source_collectors.muckrock.classes.fetch_requests.FetchRequestBase import FetchRequest -from src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher import MuckrockFetcher -from src.source_collectors.muckrock.constants import BASE_MUCKROCK_URL - - -class JurisdictionByIDFetchRequest(FetchRequest): - jurisdiction_id: int - -class JurisdictionByIDFetcher(MuckrockFetcher): - - def build_url(self, request: JurisdictionByIDFetchRequest) -> str: - return f"{BASE_MUCKROCK_URL}/jurisdiction/{request.jurisdiction_id}/" - - async def get_jurisdiction(self, jurisdiction_id: int) -> dict: - return await self.fetch(request=JurisdictionByIDFetchRequest(jurisdiction_id=jurisdiction_id)) diff --git a/src/source_collectors/muckrock/generate_detailed_muckrock_csv.py b/src/source_collectors/muckrock/generate_detailed_muckrock_csv.py deleted file mode 100644 index d654d1df..00000000 --- a/src/source_collectors/muckrock/generate_detailed_muckrock_csv.py +++ /dev/null @@ -1,169 +0,0 @@ -""" -Converts JSON file of MuckRock FOIA requests to CSV for further processing -""" - -# TODO: Look into linking up this logic with other components in pipeline. - -import argparse -import csv -import time -from enum import Enum -from typing import Optional - -from pydantic import BaseModel - -from src.source_collectors.muckrock.classes.muckrock_fetchers import AgencyFetcher -from src.source_collectors.muckrock.classes.muckrock_fetchers.JurisdictionByIDFetcher import JurisdictionByIDFetcher -from utils import format_filename_json_to_csv, load_json_file - - -class JurisdictionType(Enum): - FEDERAL = "federal" - STATE = "state" - COUNTY = "county" - LOCAL = "local" - - -class AgencyInfo(BaseModel): - name: Optional[str] = "" - agency_described: Optional[str] = "" - record_type: Optional[str] = "" - description: Optional[str] = "" - source_url: Optional[str] = "" - readme_url: Optional[str] = "" - scraper_url: Optional[str] = "" - state: Optional[str] = "" - county: Optional[str] = "" - municipality: Optional[str] = "" - agency_type: Optional[str] = "" - jurisdiction_type: Optional[JurisdictionType] = None - agency_aggregation: Optional[str] = "" - agency_supplied: Optional[bool] = False - supplying_entity: Optional[str] = "MuckRock" - agency_originated: Optional[bool] = True - originating_agency: Optional[str] = "" - coverage_start: Optional[str] = "" - source_last_updated: Optional[str] = "" - coverage_end: Optional[str] = "" - number_of_records_available: Optional[str] = "" - size: Optional[str] = "" - access_type: Optional[str] = "" - data_portal_type: Optional[str] = "MuckRock" - access_notes: Optional[str] = "" - record_format: Optional[str] = "" - update_frequency: Optional[str] = "" - update_method: Optional[str] = "" - retention_schedule: Optional[str] = "" - detail_level: Optional[str] = "" - - - def model_dump(self, *args, **kwargs): - original_dict = super().model_dump(*args, **kwargs) - original_dict['View Archive'] = '' - return {key: (value.value if isinstance(value, Enum) else value) - for key, value in original_dict.items()} - - def keys(self) -> list[str]: - return list(self.model_dump().keys()) - - -async def main(): - json_filename = get_json_filename() - json_data = load_json_file(json_filename) - output_csv = format_filename_json_to_csv(json_filename) - agency_infos = await get_agency_infos(json_data) - write_to_csv(agency_infos, output_csv) - - -async def get_agency_infos(json_data): - a_fetcher = AgencyFetcher() - j_fetcher = JurisdictionByIDFetcher() - agency_infos = [] - # Iterate through the JSON data - for item in json_data: - print(f"Writing data for {item.get('title')}") - agency_data = await a_fetcher.get_agency(agency_id=item.get("agency")) - time.sleep(1) - jurisdiction_data = j_fetcher.get_jurisdiction( - jurisdiction_id=agency_data.get("jurisdiction") - ) - agency_name = agency_data.get("name", "") - agency_info = AgencyInfo( - name=item.get("title", ""), - originating_agency=agency_name, - agency_described=agency_name - ) - jurisdiction_level = jurisdiction_data.get("level") - add_locational_info(agency_info, j_fetcher, jurisdiction_data, jurisdiction_level) - optionally_add_agency_type(agency_data, agency_info) - optionally_add_access_info(agency_info, item) - - # Extract the relevant fields from the JSON object - # TODO: I question the utility of creating columns that are then left blank until later - # and possibly in a different file entirely. - agency_infos.append(agency_info) - return agency_infos - - -def write_to_csv(agency_infos, output_csv): - # Open a CSV file for writing - with open(output_csv, "w", newline="") as csvfile: - writer = csv.DictWriter(csvfile, fieldnames=AgencyInfo().keys()) - - # Write the header row - writer.writeheader() - - for agency_info in agency_infos: - csv_row = agency_info.model_dump() - - # Write the extracted row to the CSV file - writer.writerow(csv_row) - - -def get_json_filename(): - # Load the JSON data - parser = argparse.ArgumentParser(description="Parse JSON from a file.") - parser.add_argument( - "--json_file", type=str, required=True, help="Path to the JSON file" - ) - args = parser.parse_args() - json_filename = args.json_file - return json_filename - - -def add_locational_info(agency_info, j_fetcher, jurisdiction_data, jurisdiction_level): - match jurisdiction_level: - case "f": # federal jurisdiction level - agency_info.jurisdiction_type = JurisdictionType.FEDERAL - case "s": # state jurisdiction level - agency_info.jurisdiction_type = JurisdictionType.STATE - agency_info.state = jurisdiction_data.get("name") - case "l": # local jurisdiction level - parent_juris_data = j_fetcher.get_jurisdiction( - jurisdiction_id=jurisdiction_data.get("parent") - ) - agency_info.state = parent_juris_data.get("abbrev") - if "County" in jurisdiction_data.get("name"): - agency_info.county = jurisdiction_data.get("name") - agency_info.jurisdiction_type = JurisdictionType.COUNTY - else: - agency_info.municipality = jurisdiction_data.get("name") - agency_info.jurisdiction_type = JurisdictionType.LOCAL - - -def optionally_add_access_info(agency_info, item): - absolute_url = item.get("absolute_url") - for comm in item["communications"]: - if comm["files"]: - agency_info.source_url = absolute_url + "#files" - agency_info.access_type = "Web page,Download,API" - break - - -def optionally_add_agency_type(agency_data, agency_info): - if "Police" in agency_data.get("types"): - agency_info.agency_type = "law enforcement/police" - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/src/source_collectors/muckrock/schemas.py b/src/source_collectors/muckrock/schemas.py deleted file mode 100644 index 508f8098..00000000 --- a/src/source_collectors/muckrock/schemas.py +++ /dev/null @@ -1,5 +0,0 @@ -from marshmallow import Schema, fields - -class MuckrockURLInfoSchema(Schema): - url = fields.String(required=True) - metadata = fields.Dict(required=True) diff --git a/src/source_collectors/muckrock/utils.py b/src/source_collectors/muckrock/utils.py deleted file mode 100644 index ee2f0b9f..00000000 --- a/src/source_collectors/muckrock/utils.py +++ /dev/null @@ -1,36 +0,0 @@ -""" -utils.py - -Provides useful functions for muckrock_tools. - -Functions: - - format_filename_json_to_csv() -""" - -import json -import re - - -def format_filename_json_to_csv(json_filename: str) -> str: - """ - Converts JSON filename format to CSV filename format. - - Args: - json_file (str): A JSON filename string. - - Returns: - csv_filename (str): A CSV filename string. - - """ - csv_filename = re.sub(r"_(?=[^.]*$)", "-", json_filename[:-5]) + ".csv" - - return csv_filename - -def load_json_file(file_path: str) -> dict: - with open(file_path, "r", encoding="utf-8") as f: - data = json.load(f) - return data - -def save_json_file(file_path: str, data: dict | list[dict]): - with open(file_path, "w", encoding="utf-8") as f: - json.dump(data, f, indent=4) \ No newline at end of file diff --git a/tests/alembic/conftest.py b/tests/alembic/conftest.py index 83e55c97..405f5677 100644 --- a/tests/alembic/conftest.py +++ b/tests/alembic/conftest.py @@ -3,8 +3,8 @@ from sqlalchemy import create_engine, inspect, MetaData from sqlalchemy.orm import scoped_session, sessionmaker -from src.db.helper_functions import get_postgres_connection_string -from tests.helpers.AlembicRunner import AlembicRunner +from src.db.helpers import get_postgres_connection_string +from tests.helpers.alembic_runner import AlembicRunner @pytest.fixture() diff --git a/tests/alembic/helpers.py b/tests/alembic/helpers.py index dfebce07..96e7f62a 100644 --- a/tests/alembic/helpers.py +++ b/tests/alembic/helpers.py @@ -3,7 +3,7 @@ from sqlalchemy import text from sqlalchemy.orm import Session -from tests.helpers.AlembicRunner import AlembicRunner +from tests.helpers.alembic_runner import AlembicRunner def get_enum_values(enum_name: str, session: Session) -> list[str]: diff --git a/tests/automated/integration/api/conftest.py b/tests/automated/integration/api/conftest.py index dab293db..aae25b48 100644 --- a/tests/automated/integration/api/conftest.py +++ b/tests/automated/integration/api/conftest.py @@ -1,27 +1,27 @@ import asyncio from dataclasses import dataclass -from typing import Generator +from typing import Generator, Any, AsyncGenerator from unittest.mock import AsyncMock import pytest import pytest_asyncio from starlette.testclient import TestClient +from src.api.endpoints.batch.dtos.get.status import GetBatchStatusResponse +from src.api.endpoints.review.routes import requires_final_review_permission from src.api.main import app -from src.api.routes.review import requires_final_review_permission -from src.core.AsyncCore import AsyncCore -from src.core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse -from src.core.SourceCollectorCore import SourceCollectorCore +from src.core.core import AsyncCore from src.core.enums import BatchStatus -from src.security_manager.SecurityManager import get_access_info, AccessInfo, Permissions -from tests.helpers.DBDataCreator import DBDataCreator +from src.security.manager import get_access_info +from src.security.dtos.access_info import AccessInfo +from src.security.enums import Permissions from tests.automated.integration.api.helpers.RequestValidator import RequestValidator +from tests.helpers.db_data_creator import DBDataCreator @dataclass class APITestHelper: request_validator: RequestValidator - core: SourceCollectorCore async_core: AsyncCore db_data_creator: DBDataCreator @@ -83,10 +83,13 @@ def client() -> Generator[TestClient, None, None]: @pytest_asyncio.fixture -async def api_test_helper(client: TestClient, db_data_creator, monkeypatch) -> APITestHelper: +async def api_test_helper( + client: TestClient, + db_data_creator, + monkeypatch +) -> AsyncGenerator[APITestHelper, Any]: yield APITestHelper( request_validator=RequestValidator(client=client), - core=client.app.state.core, async_core=client.app.state.async_core, db_data_creator=db_data_creator, ) diff --git a/tests/automated/integration/api/helpers/RequestValidator.py b/tests/automated/integration/api/helpers/RequestValidator.py index 145235b4..1e94f144 100644 --- a/tests/automated/integration/api/helpers/RequestValidator.py +++ b/tests/automated/integration/api/helpers/RequestValidator.py @@ -5,38 +5,39 @@ from pydantic import BaseModel from starlette.testclient import TestClient -from src.db.DTOs.BatchInfo import BatchInfo -from src.db.DTOs.GetTaskStatusResponseInfo import GetTaskStatusResponseInfo -from src.db.DTOs.TaskInfo import TaskInfo +from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.dtos.agency.response import GetNextURLForAgencyAnnotationResponse +from src.api.endpoints.annotate.dtos.all.post import AllAnnotationPostInfo +from src.api.endpoints.annotate.dtos.all.response import GetNextURLForAllAnnotationResponse +from src.api.endpoints.annotate.dtos.record_type.post import RecordTypeAnnotationPostInfo +from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseOuterInfo +from src.api.endpoints.annotate.dtos.relevance.post import RelevanceAnnotationPostInfo +from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseOuterInfo +from src.api.endpoints.batch.dtos.get.duplicates import GetDuplicatesByBatchResponse +from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse +from src.api.endpoints.batch.dtos.get.status import GetBatchStatusResponse +from src.api.endpoints.batch.dtos.get.urls import GetURLsByBatchResponse +from src.api.endpoints.batch.dtos.post.abort import MessageResponse +from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO +from src.api.endpoints.collector.dtos.manual_batch.response import ManualBatchResponseDTO +from src.api.endpoints.metrics.dtos.get.backlog import GetMetricsBacklogResponseDTO +from src.api.endpoints.metrics.dtos.get.batches.aggregated import GetMetricsBatchesAggregatedResponseDTO +from src.api.endpoints.metrics.dtos.get.batches.breakdown import GetMetricsBatchesBreakdownResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.aggregated import GetMetricsURLsAggregatedResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.breakdown.pending import GetMetricsURLsBreakdownPendingResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.breakdown.submitted import GetMetricsURLsBreakdownSubmittedResponseDTO +from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo +from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewOuterResponse +from src.api.endpoints.review.dtos.reject import FinalReviewRejectionInfo +from src.api.endpoints.search.dtos.response import SearchURLResponse +from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse +from src.api.endpoints.url.dtos.response import GetURLsResponseInfo +from src.db.dtos.batch_info import BatchInfo +from src.api.endpoints.task.dtos.get.task_status import GetTaskStatusResponseInfo +from src.api.endpoints.task.dtos.get.task import TaskInfo from src.db.enums import TaskType -from src.collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from src.collector_manager.enums import CollectorType -from src.core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo -from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, FinalReviewRejectionInfo -from src.core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse -from src.core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse -from src.core.DTOs.GetDuplicatesByBatchResponse import GetDuplicatesByBatchResponse -from src.core.DTOs.GetMetricsBacklogResponse import GetMetricsBacklogResponseDTO -from src.core.DTOs.GetMetricsBatchesAggregatedResponseDTO import GetMetricsBatchesAggregatedResponseDTO -from src.core.DTOs.GetMetricsBatchesBreakdownResponseDTO import GetMetricsBatchesBreakdownResponseDTO -from src.core.DTOs.GetMetricsURLsAggregatedResponseDTO import GetMetricsURLsAggregatedResponseDTO -from src.core.DTOs.GetMetricsURLsBreakdownPendingResponseDTO import GetMetricsURLsBreakdownPendingResponseDTO -from src.core.DTOs.GetMetricsURLsBreakdownSubmittedResponseDTO import GetMetricsURLsBreakdownSubmittedResponseDTO -from src.core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo -from src.core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo -from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import GetNextURLForAgencyAnnotationResponse, \ - URLAgencyAnnotationPostInfo -from src.core.DTOs.GetNextURLForAllAnnotationResponse import GetNextURLForAllAnnotationResponse -from src.core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse -from src.core.DTOs.GetTasksResponse import GetTasksResponse -from src.core.DTOs.GetURLsByBatchResponse import GetURLsByBatchResponse -from src.core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo -from src.core.DTOs.ManualBatchInputDTO import ManualBatchInputDTO -from src.core.DTOs.ManualBatchResponseDTO import ManualBatchResponseDTO -from src.core.DTOs.MessageResponse import MessageResponse -from src.core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo -from src.core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo -from src.core.DTOs.SearchURLResponse import SearchURLResponse +from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO +from src.collectors.enums import CollectorType from src.core.enums import BatchStatus from src.util.helper_functions import update_if_not_none diff --git a/tests/automated/integration/api/test_annotate.py b/tests/automated/integration/api/test_annotate.py index 89c695f1..e75e3360 100644 --- a/tests/automated/integration/api/test_annotate.py +++ b/tests/automated/integration/api/test_annotate.py @@ -3,22 +3,22 @@ import pytest from fastapi import HTTPException -from src.db.DTOs.InsertURLsInfo import InsertURLsInfo -from src.db.DTOs.URLMapping import URLMapping -from src.db.models import UserUrlAgencySuggestion, UserRelevantSuggestion, UserRecordTypeSuggestion -from src.core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo -from src.core.DTOs.GetNextRecordTypeAnnotationResponseInfo import GetNextRecordTypeAnnotationResponseOuterInfo -from src.core.DTOs.GetNextRelevanceAnnotationResponseInfo import GetNextRelevanceAnnotationResponseOuterInfo -from src.core.DTOs.GetNextURLForAgencyAnnotationResponse import URLAgencyAnnotationPostInfo -from src.core.DTOs.RecordTypeAnnotationPostInfo import RecordTypeAnnotationPostInfo -from src.core.DTOs.RelevanceAnnotationPostInfo import RelevanceAnnotationPostInfo -from src.core.classes.ErrorManager import ErrorTypes +from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.dtos.all.post import AllAnnotationPostInfo +from src.api.endpoints.annotate.dtos.record_type.post import RecordTypeAnnotationPostInfo +from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseOuterInfo +from src.api.endpoints.annotate.dtos.relevance.post import RelevanceAnnotationPostInfo +from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseOuterInfo +from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.db.dtos.insert_urls_info import InsertURLsInfo +from src.db.dtos.url_mapping import URLMapping +from src.db.models.core import UserUrlAgencySuggestion, UserRelevantSuggestion, UserRecordTypeSuggestion +from src.core.error_manager.enums import ErrorTypes from src.core.enums import RecordType, SuggestionType, SuggestedStatus from src.core.exceptions import FailedValidationException -from src.html_tag_collector.DataClassTags import ResponseHTMLInfo from tests.helpers.complex_test_data_functions import AnnotateAgencySetupInfo, setup_for_annotate_agency, \ setup_for_get_next_url_for_final_review -from tests.helpers.DBDataCreator import BatchURLCreationInfo +from tests.helpers.db_data_creator import BatchURLCreationInfo from tests.automated.integration.api.conftest import MOCK_USER_ID def check_url_mappings_match( diff --git a/tests/automated/integration/api/test_batch.py b/tests/automated/integration/api/test_batch.py index 082f932b..d4900736 100644 --- a/tests/automated/integration/api/test_batch.py +++ b/tests/automated/integration/api/test_batch.py @@ -1,9 +1,9 @@ import pytest -from src.db.DTOs.BatchInfo import BatchInfo -from src.db.DTOs.InsertURLsInfo import InsertURLsInfo -from src.collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from src.collector_manager.enums import CollectorType, URLStatus +from src.db.dtos.batch_info import BatchInfo +from src.db.dtos.insert_urls_info import InsertURLsInfo +from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO +from src.collectors.enums import CollectorType, URLStatus from src.core.enums import BatchStatus @pytest.mark.asyncio diff --git a/tests/automated/integration/api/test_duplicates.py b/tests/automated/integration/api/test_duplicates.py index e96588d4..e1b45be9 100644 --- a/tests/automated/integration/api/test_duplicates.py +++ b/tests/automated/integration/api/test_duplicates.py @@ -1,7 +1,7 @@ import pytest -from src.db.DTOs.BatchInfo import BatchInfo -from src.collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO +from src.db.dtos.batch_info import BatchInfo +from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO from tests.automated.integration.api.conftest import disable_task_trigger diff --git a/tests/automated/integration/api/test_example_collector.py b/tests/automated/integration/api/test_example_collector.py index fbc77005..3f7f40fa 100644 --- a/tests/automated/integration/api/test_example_collector.py +++ b/tests/automated/integration/api/test_example_collector.py @@ -3,15 +3,14 @@ import pytest -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DTOs.BatchInfo import BatchInfo -from src.collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from src.collector_manager.ExampleCollector import ExampleCollector -from src.collector_manager.enums import CollectorType -from src.core.AsyncCoreLogger import AsyncCoreLogger -from src.core.DTOs.BatchStatusInfo import BatchStatusInfo -from src.core.DTOs.GetBatchLogsResponse import GetBatchLogsResponse -from src.core.DTOs.GetBatchStatusResponse import GetBatchStatusResponse +from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse +from src.api.endpoints.batch.dtos.get.status import GetBatchStatusResponse +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.batch_info import BatchInfo +from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO +from src.collectors.source_collectors.example.core import ExampleCollector +from src.collectors.enums import CollectorType +from src.core.logger import AsyncCoreLogger from src.core.enums import BatchStatus from tests.helpers.patch_functions import block_sleep from tests.automated.integration.api.conftest import disable_task_trigger @@ -52,7 +51,7 @@ async def test_example_collector(api_test_helper, monkeypatch): status=BatchStatus.IN_PROCESS ) assert len(bsr.results) == 1 - bsi: BatchStatusInfo = bsr.results[0] + bsi: BatchInfo = bsr.results[0] assert bsi.id == batch_id assert bsi.strategy == CollectorType.EXAMPLE.value @@ -69,7 +68,7 @@ async def test_example_collector(api_test_helper, monkeypatch): ) assert len(csr.results) == 1 - bsi: BatchStatusInfo = csr.results[0] + bsi: BatchInfo = csr.results[0] assert bsi.id == batch_id assert bsi.strategy == CollectorType.EXAMPLE.value diff --git a/tests/automated/integration/api/test_manual_batch.py b/tests/automated/integration/api/test_manual_batch.py index 85a8cdec..5dd383c3 100644 --- a/tests/automated/integration/api/test_manual_batch.py +++ b/tests/automated/integration/api/test_manual_batch.py @@ -1,9 +1,9 @@ import pytest -from src.db.models import Batch, URL, URLOptionalDataSourceMetadata -from src.collector_manager.enums import CollectorType -from src.core.DTOs.ManualBatchInputDTO import ManualBatchInnerInputDTO, ManualBatchInputDTO +from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInnerInputDTO, ManualBatchInputDTO +from src.db.models.core import Batch, URL, URLOptionalDataSourceMetadata +from src.collectors.enums import CollectorType from src.core.enums import RecordType diff --git a/tests/automated/integration/api/test_metrics.py b/tests/automated/integration/api/test_metrics.py index 16611b0e..b724fae6 100644 --- a/tests/automated/integration/api/test_metrics.py +++ b/tests/automated/integration/api/test_metrics.py @@ -1,7 +1,7 @@ import pendulum import pytest -from src.collector_manager.enums import URLStatus, CollectorType +from src.collectors.enums import URLStatus, CollectorType from src.core.enums import BatchStatus, RecordType, SuggestedStatus from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters, \ AnnotationInfo diff --git a/tests/automated/integration/api/test_review.py b/tests/automated/integration/api/test_review.py index 0e347a77..11e7c239 100644 --- a/tests/automated/integration/api/test_review.py +++ b/tests/automated/integration/api/test_review.py @@ -1,11 +1,12 @@ import pytest +from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo +from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewOuterResponse +from src.api.endpoints.review.dtos.reject import FinalReviewRejectionInfo +from src.api.endpoints.review.enums import RejectionReason from src.db.constants import PLACEHOLDER_AGENCY_NAME -from src.db.models import URL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency -from src.collector_manager.enums import URLStatus -from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason, \ - FinalReviewRejectionInfo -from src.core.DTOs.GetNextURLForFinalReviewResponse import GetNextURLForFinalReviewOuterResponse +from src.db.models.core import URL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency +from src.collectors.enums import URLStatus from src.core.enums import RecordType, SuggestedStatus from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review diff --git a/tests/automated/integration/api/test_search.py b/tests/automated/integration/api/test_search.py index 3252f144..58cc3e10 100644 --- a/tests/automated/integration/api/test_search.py +++ b/tests/automated/integration/api/test_search.py @@ -1,6 +1,6 @@ import pytest -from src.core.DTOs.SearchURLResponse import SearchURLResponse +from src.api.endpoints.search.dtos.response import SearchURLResponse @pytest.mark.asyncio diff --git a/tests/automated/integration/api/test_url.py b/tests/automated/integration/api/test_url.py index 0ec2e836..f7568f5e 100644 --- a/tests/automated/integration/api/test_url.py +++ b/tests/automated/integration/api/test_url.py @@ -1,7 +1,7 @@ import pytest -from src.db.DTOs.InsertURLsInfo import InsertURLsInfo -from src.core.DTOs.GetURLsResponseInfo import GetURLsResponseInfo +from src.api.endpoints.url.dtos.response import GetURLsResponseInfo +from src.db.dtos.insert_urls_info import InsertURLsInfo @pytest.mark.asyncio diff --git a/tests/automated/integration/collector_db/test_database_structure.py b/tests/automated/integration/collector_db/test_database_structure.py index 022b5502..5ed153c9 100644 --- a/tests/automated/integration/collector_db/test_database_structure.py +++ b/tests/automated/integration/collector_db/test_database_structure.py @@ -16,15 +16,16 @@ from sqlalchemy.dialects import postgresql from sqlalchemy.exc import DataError -from src.db.DTOs.InsertURLsInfo import InsertURLsInfo +from src.db.dtos.insert_urls_info import InsertURLsInfo from src.db.enums import URLHTMLContentType -from src.db.helper_functions import get_postgres_connection_string -from src.db.models import Base, Agency -from src.collector_manager.enums import CollectorType, URLStatus -from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo +from src.db.helpers import get_postgres_connection_string +from src.db.models.core import Agency +from src.collectors.enums import CollectorType, URLStatus +from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.enums import BatchStatus, SuggestionType +from src.db.models.templates import Base from src.util.helper_functions import get_enum_values -from tests.helpers.DBDataCreator import DBDataCreator +from tests.helpers.db_data_creator import DBDataCreator SATypes: TypeAlias = sa.Integer or sa.String or postgresql.ENUM or sa.TIMESTAMP or sa.Text diff --git a/tests/automated/integration/collector_db/test_db_client.py b/tests/automated/integration/collector_db/test_db_client.py index 5f8faa05..7196af9f 100644 --- a/tests/automated/integration/collector_db/test_db_client.py +++ b/tests/automated/integration/collector_db/test_db_client.py @@ -3,19 +3,19 @@ import pytest from fastapi import HTTPException -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DTOs.BatchInfo import BatchInfo -from src.db.DTOs.LogInfo import LogInfo -from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from src.db.DTOs.URLInfo import URLInfo -from src.db.DTOs.URLMapping import URLMapping +from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.batch_info import BatchInfo +from src.db.dtos.log_info import LogInfo +from src.db.dtos.url_error_info import URLErrorPydanticInfo +from src.db.dtos.url_info import URLInfo +from src.db.dtos.url_mapping import URLMapping from src.db.constants import PLACEHOLDER_AGENCY_NAME -from src.db.models import URL, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency -from src.collector_manager.enums import URLStatus -from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo +from src.db.models.core import URL, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency +from src.collectors.enums import URLStatus from src.core.enums import BatchStatus, RecordType, SuggestionType, SuggestedStatus from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation, setup_for_annotate_agency -from tests.helpers.DBDataCreator import DBDataCreator +from tests.helpers.db_data_creator import DBDataCreator from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review @pytest.mark.asyncio diff --git a/tests/automated/integration/conftest.py b/tests/automated/integration/conftest.py index 8aa79e36..7e4fc535 100644 --- a/tests/automated/integration/conftest.py +++ b/tests/automated/integration/conftest.py @@ -2,19 +2,10 @@ import pytest -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.collector_manager.AsyncCollectorManager import AsyncCollectorManager -from src.core.AsyncCore import AsyncCore -from src.core.AsyncCoreLogger import AsyncCoreLogger -from src.core.SourceCollectorCore import SourceCollectorCore - - -@pytest.fixture -def test_core(db_client_test): - core = SourceCollectorCore( - db_client=db_client_test, - ) - yield core +from src.collectors.manager import AsyncCollectorManager +from src.core.core import AsyncCore +from src.core.logger import AsyncCoreLogger +from src.db.client.async_ import AsyncDatabaseClient @pytest.fixture diff --git a/tests/automated/integration/core/test_async_core.py b/tests/automated/integration/core/test_async_core.py index fc0e1b7f..dac0cbda 100644 --- a/tests/automated/integration/core/test_async_core.py +++ b/tests/automated/integration/core/test_async_core.py @@ -3,14 +3,15 @@ import pytest -from src.db import AsyncDatabaseClient +from src.db.client.async_ import AsyncDatabaseClient from src.db.enums import TaskType -from src.db.models import Task -from src.core.AsyncCore import AsyncCore -from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorRunInfo, TaskOperatorOutcome -from src.core.TaskManager import TaskManager +from src.db.models.core import Task +from src.core.core import AsyncCore +from src.core.tasks.dtos.run_info import TaskOperatorRunInfo +from src.core.tasks.enums import TaskOperatorOutcome +from src.core.tasks.manager import TaskManager from src.core.enums import BatchStatus -from tests.helpers.DBDataCreator import DBDataCreator +from tests.helpers.db_data_creator import DBDataCreator def setup_async_core(adb_client: AsyncDatabaseClient): return AsyncCore( diff --git a/tests/automated/integration/core/test_example_collector_lifecycle.py b/tests/automated/integration/core/test_example_collector_lifecycle.py deleted file mode 100644 index 936be0d8..00000000 --- a/tests/automated/integration/core/test_example_collector_lifecycle.py +++ /dev/null @@ -1,67 +0,0 @@ -import asyncio - -import pytest - -from src.db.DTOs.BatchInfo import BatchInfo -from src.collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from src.collector_manager.enums import CollectorType, URLStatus -from src.core.AsyncCore import AsyncCore -from src.core.DTOs.CollectorStartInfo import CollectorStartInfo -from src.core.SourceCollectorCore import SourceCollectorCore -from src.core.enums import BatchStatus -from tests.helpers.patch_functions import block_sleep - - -@pytest.mark.asyncio -async def test_example_collector_lifecycle( - test_core: SourceCollectorCore, - test_async_core: AsyncCore, - monkeypatch -): - """ - Test the flow of an example collector, which generates fake urls - and saves them to the database - """ - acore = test_async_core - core = test_core - db_client = core.db_client - - barrier = await block_sleep(monkeypatch) - - dto = ExampleInputDTO( - example_field="example_value", - sleep_time=1 - ) - csi: CollectorStartInfo = await acore.initiate_collector( - collector_type=CollectorType.EXAMPLE, - dto=dto, - user_id=1 - ) - assert csi.message == "Started example collector." - assert csi.batch_id is not None - - batch_id = csi.batch_id - - # Yield control so coroutine runs up to the barrier - await asyncio.sleep(0) - - assert core.get_status(batch_id) == BatchStatus.IN_PROCESS - # Release the barrier to resume execution - barrier.release() - await acore.collector_manager.logger.flush_all() - assert core.get_status(batch_id) == BatchStatus.READY_TO_LABEL - - batch_info: BatchInfo = db_client.get_batch_by_id(batch_id) - assert batch_info.strategy == "example" - assert batch_info.status == BatchStatus.READY_TO_LABEL - assert batch_info.total_url_count == 2 - assert batch_info.parameters == dto.model_dump() - assert batch_info.compute_time > 0 - - url_infos = db_client.get_urls_by_batch(batch_id) - assert len(url_infos) == 2 - assert url_infos[0].outcome == URLStatus.PENDING - assert url_infos[1].outcome == URLStatus.PENDING - - assert url_infos[0].url == "https://example.com" - assert url_infos[1].url == "https://example.com/2" diff --git a/tests/automated/integration/html_tag_collector/test_root_url_cache.py b/tests/automated/integration/html_tag_collector/test_root_url_cache.py index f24fdca9..f5bf820d 100644 --- a/tests/automated/integration/html_tag_collector/test_root_url_cache.py +++ b/tests/automated/integration/html_tag_collector/test_root_url_cache.py @@ -1,6 +1,7 @@ import pytest -from src.html_tag_collector.RootURLCache import RootURLCacheResponseInfo, RootURLCache +from src.core.tasks.operators.url_html.scraper.root_url_cache.core import RootURLCache +from src.core.tasks.operators.url_html.scraper.root_url_cache.dtos.response import RootURLCacheResponseInfo async def mock_get_request(url: str) -> RootURLCacheResponseInfo: diff --git a/tests/automated/integration/security_manager/test_security_manager.py b/tests/automated/integration/security_manager/test_security_manager.py index 295b67b0..9c759d21 100644 --- a/tests/automated/integration/security_manager/test_security_manager.py +++ b/tests/automated/integration/security_manager/test_security_manager.py @@ -3,16 +3,9 @@ from starlette.testclient import TestClient from src.api.main import app -from src.security_manager.SecurityManager import Permissions, ALGORITHM +from src.security.constants import ALGORITHM +from src.security.enums import Permissions -PATCH_ROOT = "src.security_manager.SecurityManager" - -def get_patch_path(patch_name): - return f"{PATCH_ROOT}.{patch_name}" - -@pytest.fixture -def mock_get_secret_key(mocker): - mocker.patch(get_patch_path("get_secret_key"), return_value=SECRET_KEY) SECRET_KEY = "test_secret_key" VALID_TOKEN = "valid_token" @@ -23,11 +16,11 @@ def mock_get_secret_key(mocker): } def test_api_with_valid_token( - mock_get_secret_key, monkeypatch ): monkeypatch.setenv("DISCORD_WEBHOOK_URL", "https://discord.com") + monkeypatch.setenv("DS_APP_SECRET_KEY", SECRET_KEY) token = jwt.encode(FAKE_PAYLOAD, SECRET_KEY, algorithm=ALGORITHM) # Create Test Client diff --git a/tests/automated/integration/tasks/conftest.py b/tests/automated/integration/tasks/conftest.py index 42d5b29c..77b25bfd 100644 --- a/tests/automated/integration/tasks/conftest.py +++ b/tests/automated/integration/tasks/conftest.py @@ -3,7 +3,7 @@ import pytest from pdap_access_manager import AccessManager -from src.pdap_api_client.PDAPClient import PDAPClient +from src.pdap_api.client import PDAPClient @pytest.fixture diff --git a/tests/automated/integration/tasks/test_agency_preannotation_task.py b/tests/automated/integration/tasks/test_agency_preannotation_task.py index afd55c85..d24501f3 100644 --- a/tests/automated/integration/tasks/test_agency_preannotation_task.py +++ b/tests/automated/integration/tasks/test_agency_preannotation_task.py @@ -5,23 +5,26 @@ import pytest from aiohttp import ClientSession -from src.pdap_api_client.enums import MatchAgencyResponseStatus +from src.collectors.source_collectors.muckrock.api_interface.core import MuckrockAPIInterface +from src.collectors.source_collectors.muckrock.api_interface.lookup_response import AgencyLookupResponse +from src.collectors.source_collectors.muckrock.enums import AgencyLookupResponseType +from src.core.tasks.operators.agency_identification.core import AgencyIdentificationTaskOperator +from src.pdap_api.enums import MatchAgencyResponseStatus from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters -from src.source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface, AgencyLookupResponseType, AgencyLookupResponse -from src.db.models import Agency, AutomatedUrlAgencySuggestion -from src.collector_manager.enums import CollectorType, URLStatus -from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from src.core.classes.task_operators.AgencyIdentificationTaskOperator import AgencyIdentificationTaskOperator -from src.core.classes.subtasks.AutoGooglerAgencyIdentificationSubtask import AutoGooglerAgencyIdentificationSubtask -from src.core.classes.subtasks.CKANAgencyIdentificationSubtask import CKANAgencyIdentificationSubtask -from src.core.classes.subtasks.CommonCrawlerAgencyIdentificationSubtask import CommonCrawlerAgencyIdentificationSubtask -from src.core.classes.subtasks.MuckrockAgencyIdentificationSubtask import MuckrockAgencyIdentificationSubtask +from src.db.models.core import Agency, AutomatedUrlAgencySuggestion +from src.collectors.enums import CollectorType, URLStatus +from src.core.tasks.enums import TaskOperatorOutcome +from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo +from src.core.tasks.subtasks.agency_identification.auto_googler import AutoGooglerAgencyIdentificationSubtask +from src.core.tasks.subtasks.agency_identification.ckan import CKANAgencyIdentificationSubtask +from src.core.tasks.subtasks.agency_identification.common_crawler import CommonCrawlerAgencyIdentificationSubtask +from src.core.tasks.subtasks.agency_identification.muckrock import MuckrockAgencyIdentificationSubtask from src.core.enums import SuggestionType from pdap_access_manager import AccessManager -from src.pdap_api_client.DTOs import MatchAgencyResponse, MatchAgencyInfo -from src.pdap_api_client.PDAPClient import PDAPClient -from tests.helpers.DBDataCreator import DBDataCreator, BatchURLCreationInfoV2 +from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse +from src.pdap_api.dtos.match_agency.post import MatchAgencyInfo +from src.pdap_api.client import PDAPClient +from tests.helpers.db_data_creator import DBDataCreator, BatchURLCreationInfoV2 sample_agency_suggestions = [ URLAgencySuggestionInfo( diff --git a/tests/automated/integration/tasks/test_example_task.py b/tests/automated/integration/tasks/test_example_task.py index 7f5d5e73..6a77f890 100644 --- a/tests/automated/integration/tasks/test_example_task.py +++ b/tests/automated/integration/tasks/test_example_task.py @@ -3,9 +3,9 @@ import pytest from src.db.enums import TaskType -from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from src.core.classes.task_operators.TaskOperatorBase import TaskOperatorBase -from tests.helpers.DBDataCreator import DBDataCreator +from src.core.tasks.enums import TaskOperatorOutcome +from src.core.tasks.operators.base import TaskOperatorBase +from tests.helpers.db_data_creator import DBDataCreator class ExampleTaskOperator(TaskOperatorBase): diff --git a/tests/automated/integration/tasks/test_submit_approved_url_task.py b/tests/automated/integration/tasks/test_submit_approved_url_task.py index f561af17..8ce5e5dc 100644 --- a/tests/automated/integration/tasks/test_submit_approved_url_task.py +++ b/tests/automated/integration/tasks/test_submit_approved_url_task.py @@ -4,16 +4,16 @@ import pytest from deepdiff import DeepDiff +from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo +from src.core.tasks.operators.submit_approved_url.core import SubmitApprovedURLTaskOperator from src.db.enums import TaskType -from src.db.models import URL, URLErrorInfo, URLDataSource -from src.collector_manager.enums import URLStatus -from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo -from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from src.core.classes.task_operators.SubmitApprovedURLTaskOperator import SubmitApprovedURLTaskOperator +from src.db.models.core import URL, URLErrorInfo, URLDataSource +from src.collectors.enums import URLStatus +from src.core.tasks.enums import TaskOperatorOutcome from src.core.enums import RecordType, SubmitResponseStatus -from tests.helpers.DBDataCreator import BatchURLCreationInfo, DBDataCreator +from tests.helpers.db_data_creator import BatchURLCreationInfo, DBDataCreator from pdap_access_manager import RequestInfo, RequestType, ResponseInfo, DataSourcesNamespaces -from src.pdap_api_client.PDAPClient import PDAPClient +from src.pdap_api.client import PDAPClient def mock_make_request(pdap_client: PDAPClient, urls: list[str]): diff --git a/tests/automated/integration/tasks/test_url_404_probe.py b/tests/automated/integration/tasks/test_url_404_probe.py index 63283751..cd7152b5 100644 --- a/tests/automated/integration/tasks/test_url_404_probe.py +++ b/tests/automated/integration/tasks/test_url_404_probe.py @@ -5,12 +5,13 @@ import pytest from aiohttp import ClientResponseError, RequestInfo -from src.db.models import URLProbedFor404, URL -from src.collector_manager.enums import URLStatus -from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from src.core.classes.task_operators.URL404ProbeTaskOperator import URL404ProbeTaskOperator -from src.html_tag_collector.URLRequestInterface import URLResponseInfo, URLRequestInterface -from tests.helpers.DBDataCreator import DBDataCreator +from src.core.tasks.operators.url_404_probe.core import URL404ProbeTaskOperator +from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface +from src.db.models.core import URLProbedFor404, URL +from src.collectors.enums import URLStatus +from src.core.tasks.enums import TaskOperatorOutcome +from src.core.tasks.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo +from tests.helpers.db_data_creator import DBDataCreator from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters diff --git a/tests/automated/integration/tasks/test_url_duplicate_task.py b/tests/automated/integration/tasks/test_url_duplicate_task.py index 32bb435f..cc83ceca 100644 --- a/tests/automated/integration/tasks/test_url_duplicate_task.py +++ b/tests/automated/integration/tasks/test_url_duplicate_task.py @@ -3,15 +3,15 @@ import pytest -from src.db.DTOs.URLMapping import URLMapping -from src.db.models import URL, URLCheckedForDuplicate -from src.collector_manager.enums import URLStatus -from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from src.core.classes.task_operators.URLDuplicateTaskOperator import URLDuplicateTaskOperator -from tests.helpers.DBDataCreator import DBDataCreator +from src.core.tasks.operators.url_duplicate.core import URLDuplicateTaskOperator +from src.db.dtos.url_mapping import URLMapping +from src.db.models.core import URL, URLCheckedForDuplicate +from src.collectors.enums import URLStatus +from src.core.tasks.enums import TaskOperatorOutcome +from tests.helpers.db_data_creator import DBDataCreator from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters from pdap_access_manager import ResponseInfo -from src.pdap_api_client.PDAPClient import PDAPClient +from src.pdap_api.client import PDAPClient @pytest.mark.asyncio diff --git a/tests/automated/integration/tasks/test_url_html_task.py b/tests/automated/integration/tasks/test_url_html_task.py index 273a4c97..686db4ec 100644 --- a/tests/automated/integration/tasks/test_url_html_task.py +++ b/tests/automated/integration/tasks/test_url_html_task.py @@ -5,16 +5,17 @@ import pytest from aiohttp import ClientResponseError, RequestInfo -from src.db.AsyncDatabaseClient import AsyncDatabaseClient +from src.core.tasks.operators.url_html.core import URLHTMLTaskOperator +from src.core.tasks.operators.url_html.scraper.parser.core import HTMLResponseParser +from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface +from src.db.client.async_ import AsyncDatabaseClient from src.db.enums import TaskType -from src.collector_manager.enums import URLStatus -from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from src.core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator -from src.html_tag_collector.DataClassTags import ResponseHTMLInfo -from tests.helpers.DBDataCreator import DBDataCreator -from src.html_tag_collector.ResponseParser import HTMLResponseParser -from src.html_tag_collector.RootURLCache import RootURLCache -from src.html_tag_collector.URLRequestInterface import URLRequestInterface, URLResponseInfo +from src.collectors.enums import URLStatus +from src.core.tasks.enums import TaskOperatorOutcome +from tests.helpers.db_data_creator import DBDataCreator +from src.core.tasks.operators.url_html.scraper.root_url_cache.core import RootURLCache +from src.core.tasks.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo @pytest.mark.asyncio diff --git a/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py b/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py index e6a5a72f..c08a3786 100644 --- a/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py +++ b/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py @@ -2,11 +2,11 @@ import pytest -from src.db.models import URL, URLOptionalDataSourceMetadata -from src.collector_manager.enums import CollectorType -from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from src.core.classes.task_operators.URLMiscellaneousMetadataTaskOperator import URLMiscellaneousMetadataTaskOperator -from tests.helpers.DBDataCreator import DBDataCreator +from src.core.tasks.operators.url_miscellaneous_metadata.core import URLMiscellaneousMetadataTaskOperator +from src.db.models.core import URL, URLOptionalDataSourceMetadata +from src.collectors.enums import CollectorType +from src.core.tasks.enums import TaskOperatorOutcome +from tests.helpers.db_data_creator import DBDataCreator def batch_and_url( diff --git a/tests/automated/integration/tasks/test_url_record_type_task.py b/tests/automated/integration/tasks/test_url_record_type_task.py index ab50ae6f..ba49ff16 100644 --- a/tests/automated/integration/tasks/test_url_record_type_task.py +++ b/tests/automated/integration/tasks/test_url_record_type_task.py @@ -3,12 +3,12 @@ import pytest from src.db.enums import TaskType -from src.db.models import AutoRecordTypeSuggestion -from src.core.DTOs.TaskOperatorRunInfo import TaskOperatorOutcome -from src.core.classes.task_operators.URLRecordTypeTaskOperator import URLRecordTypeTaskOperator +from src.db.models.core import AutoRecordTypeSuggestion +from src.core.tasks.enums import TaskOperatorOutcome +from src.core.tasks.operators.record_type.core import URLRecordTypeTaskOperator from src.core.enums import RecordType -from tests.helpers.DBDataCreator import DBDataCreator -from src.llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier +from tests.helpers.db_data_creator import DBDataCreator +from src.core.tasks.operators.record_type.llm_api.record_classifier.deepseek import DeepSeekRecordClassifier @pytest.mark.asyncio async def test_url_record_type_task(db_data_creator: DBDataCreator): diff --git a/tests/automated/unit/core/test_core_logger.py b/tests/automated/unit/core/test_core_logger.py index b092bd0e..9ddf28d0 100644 --- a/tests/automated/unit/core/test_core_logger.py +++ b/tests/automated/unit/core/test_core_logger.py @@ -3,8 +3,8 @@ import pytest -from src.db.DTOs.LogInfo import LogInfo -from src.core.AsyncCoreLogger import AsyncCoreLogger +from src.db.dtos.log_info import LogInfo +from src.core.logger import AsyncCoreLogger @pytest.mark.asyncio diff --git a/tests/automated/unit/dto/test_all_annotation_post_info.py b/tests/automated/unit/dto/test_all_annotation_post_info.py index 3bc20c02..07ffafaa 100644 --- a/tests/automated/unit/dto/test_all_annotation_post_info.py +++ b/tests/automated/unit/dto/test_all_annotation_post_info.py @@ -1,6 +1,6 @@ import pytest -from src.core.DTOs.AllAnnotationPostInfo import AllAnnotationPostInfo +from src.api.endpoints.annotate.dtos.all.post import AllAnnotationPostInfo from src.core.enums import RecordType, SuggestedStatus from src.core.exceptions import FailedValidationException diff --git a/tests/automated/unit/security_manager/test_security_manager.py b/tests/automated/unit/security_manager/test_security_manager.py index 8f650e25..1e7aa78f 100644 --- a/tests/automated/unit/security_manager/test_security_manager.py +++ b/tests/automated/unit/security_manager/test_security_manager.py @@ -4,7 +4,9 @@ from fastapi import HTTPException from jwt import InvalidTokenError -from src.security_manager.SecurityManager import SecurityManager, Permissions, AccessInfo, get_access_info +from src.security.manager import SecurityManager, get_access_info +from src.security.dtos.access_info import AccessInfo +from src.security.enums import Permissions SECRET_KEY = "test_secret_key" VALID_TOKEN = "valid_token" diff --git a/tests/automated/unit/source_collectors/test_autogoogler_collector.py b/tests/automated/unit/source_collectors/test_autogoogler_collector.py index a8b74d9e..7026194d 100644 --- a/tests/automated/unit/source_collectors/test_autogoogler_collector.py +++ b/tests/automated/unit/source_collectors/test_autogoogler_collector.py @@ -2,16 +2,17 @@ import pytest -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DTOs.URLInfo import URLInfo -from src.core.AsyncCoreLogger import AsyncCoreLogger -from src.source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector -from src.source_collectors.auto_googler.DTOs import GoogleSearchQueryResultsInnerDTO, AutoGooglerInputDTO +from src.collectors.source_collectors.auto_googler.dtos.query_results import GoogleSearchQueryResultsInnerDTO +from src.collectors.source_collectors.auto_googler.dtos.input import AutoGooglerInputDTO +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.url_info import URLInfo +from src.core.logger import AsyncCoreLogger +from src.collectors.source_collectors.auto_googler.collector import AutoGooglerCollector @pytest.fixture def patch_get_query_results(monkeypatch): - patch_path = "src.source_collectors.auto_googler.GoogleSearcher.GoogleSearcher.get_query_results" + patch_path = "src.collectors.source_collectors.auto_googler.searcher.GoogleSearcher.get_query_results" mock = AsyncMock() mock.side_effect = [ [GoogleSearchQueryResultsInnerDTO(url="https://include.com/1", title="keyword", snippet="snippet 1"),], diff --git a/tests/automated/unit/source_collectors/test_common_crawl_collector.py b/tests/automated/unit/source_collectors/test_common_crawl_collector.py index 0f7ccab3..70c7c4ef 100644 --- a/tests/automated/unit/source_collectors/test_common_crawl_collector.py +++ b/tests/automated/unit/source_collectors/test_common_crawl_collector.py @@ -2,16 +2,16 @@ import pytest -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DTOs.URLInfo import URLInfo -from src.core.AsyncCoreLogger import AsyncCoreLogger -from src.source_collectors.common_crawler.CommonCrawlerCollector import CommonCrawlerCollector -from src.source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO +from src.collectors.source_collectors.common_crawler.input import CommonCrawlerInputDTO +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.url_info import URLInfo +from src.core.logger import AsyncCoreLogger +from src.collectors.source_collectors.common_crawler.collector import CommonCrawlerCollector @pytest.fixture def mock_get_common_crawl_search_results(): - mock_path = "src.source_collectors.common_crawler.CommonCrawler.get_common_crawl_search_results" + mock_path = "src.collectors.source_collectors.common_crawler.crawler.get_common_crawl_search_results" # Results contain other keys, but those are not relevant and thus # can be ignored mock_results = [ diff --git a/tests/automated/unit/source_collectors/test_example_collector.py b/tests/automated/unit/source_collectors/test_example_collector.py index b0aa69cb..d9d5b17a 100644 --- a/tests/automated/unit/source_collectors/test_example_collector.py +++ b/tests/automated/unit/source_collectors/test_example_collector.py @@ -1,9 +1,9 @@ from unittest.mock import AsyncMock -from src.db.DatabaseClient import DatabaseClient -from src.collector_manager.DTOs.ExampleInputDTO import ExampleInputDTO -from src.collector_manager.ExampleCollector import ExampleCollector -from src.core.AsyncCoreLogger import AsyncCoreLogger +from src.db.client.sync import DatabaseClient +from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO +from src.collectors.source_collectors.example.core import ExampleCollector +from src.core.logger import AsyncCoreLogger def test_example_collector(): diff --git a/tests/automated/unit/source_collectors/test_muckrock_collectors.py b/tests/automated/unit/source_collectors/test_muckrock_collectors.py index a73e156a..a9ec7522 100644 --- a/tests/automated/unit/source_collectors/test_muckrock_collectors.py +++ b/tests/automated/unit/source_collectors/test_muckrock_collectors.py @@ -3,19 +3,22 @@ import pytest -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DTOs.URLInfo import URLInfo -from src.core.AsyncCoreLogger import AsyncCoreLogger -from src.source_collectors.muckrock.DTOs import MuckrockSimpleSearchCollectorInputDTO, \ - MuckrockCountySearchCollectorInputDTO, MuckrockAllFOIARequestsCollectorInputDTO -from src.source_collectors.muckrock.classes.MuckrockCollector import MuckrockSimpleSearchCollector, \ - MuckrockCountyLevelSearchCollector, MuckrockAllFOIARequestsCollector -from src.source_collectors.muckrock.classes.muckrock_fetchers.FOIAFetcher import FOIAFetchRequest - +from src.collectors.source_collectors.muckrock.collectors.all_foia.core import MuckrockAllFOIARequestsCollector +from src.collectors.source_collectors.muckrock.collectors.county.core import MuckrockCountyLevelSearchCollector +from src.collectors.source_collectors.muckrock.collectors.simple.core import MuckrockSimpleSearchCollector +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.url_info import URLInfo +from src.core.logger import AsyncCoreLogger +from src.collectors.source_collectors.muckrock.collectors.all_foia.dto import MuckrockAllFOIARequestsCollectorInputDTO +from src.collectors.source_collectors.muckrock.collectors.county.dto import MuckrockCountySearchCollectorInputDTO +from src.collectors.source_collectors.muckrock.collectors.simple.dto import MuckrockSimpleSearchCollectorInputDTO +from src.collectors.source_collectors.muckrock.fetch_requests.foia import FOIAFetchRequest + +PATCH_ROOT = "src.collectors.source_collectors.muckrock" @pytest.fixture def patch_muckrock_fetcher(monkeypatch): - patch_path = "src.source_collectors.muckrock.classes.muckrock_fetchers.MuckrockFetcher.MuckrockFetcher.fetch" + patch_path = f"{PATCH_ROOT}.fetchers.templates.fetcher.MuckrockFetcherBase.fetch" inner_test_data = [ {"absolute_url": "https://include.com/1", "title": "keyword"}, {"absolute_url": "https://include.com/2", "title": "keyword"}, @@ -66,7 +69,7 @@ async def test_muckrock_simple_collector(patch_muckrock_fetcher): @pytest.fixture def patch_muckrock_county_level_search_collector_methods(monkeypatch): - patch_root = ("src.source_collectors.muckrock.classes.MuckrockCollector." + patch_root = (f"{PATCH_ROOT}.collectors.county.core." "MuckrockCountyLevelSearchCollector.") patch_path_get_jurisdiction_ids = patch_root + "get_jurisdiction_ids" patch_path_get_foia_records = patch_root + "get_foia_records" @@ -123,10 +126,11 @@ async def test_muckrock_county_search_collector(patch_muckrock_county_level_sear batch_id=1 ) + @pytest.fixture def patch_muckrock_full_search_collector(monkeypatch): - patch_path = ("src.source_collectors.muckrock.classes.MuckrockCollector." - "MuckrockAllFOIARequestsCollector.get_page_data") + module_path = f"{PATCH_ROOT}.collectors.all_foia.core.MuckrockAllFOIARequestsCollector" + patch_path = f"{module_path}.get_page_data" test_data = [{ "results": [ { @@ -148,45 +152,44 @@ def patch_muckrock_full_search_collector(monkeypatch): mock.get_page_data = AsyncMock(return_value=test_data) monkeypatch.setattr(patch_path, mock.get_page_data) - patch_path = ("src.source_collectors.muckrock.classes.MuckrockCollector." - "FOIAFetcher") mock.foia_fetcher = MagicMock() - monkeypatch.setattr(patch_path, mock.foia_fetcher) + monkeypatch.setattr(module_path, mock.foia_fetcher) return mock -@pytest.mark.asyncio -async def test_muckrock_all_foia_requests_collector(patch_muckrock_full_search_collector): - mock = patch_muckrock_full_search_collector - collector = MuckrockAllFOIARequestsCollector( - batch_id=1, - dto=MuckrockAllFOIARequestsCollectorInputDTO( - start_page=1, - total_pages=2 - ), - logger=AsyncMock(spec=AsyncCoreLogger), - adb_client=AsyncMock(spec=AsyncDatabaseClient), - raise_error=True - ) - await collector.run() - - mock.get_page_data.assert_called_once_with(mock.foia_fetcher.return_value, 1, 2) - - collector.adb_client.insert_urls.assert_called_once_with( - url_infos=[ - URLInfo( - url='https://include.com/1', - collector_metadata={'absolute_url': 'https://include.com/1', 'title': 'keyword'}, - ), - URLInfo( - url='https://include.com/2', - collector_metadata={'absolute_url': 'https://include.com/2', 'title': 'keyword'}, - ), - URLInfo( - url='https://include.com/3', - collector_metadata={'absolute_url': 'https://include.com/3', 'title': 'lemon'}, - ), - ], - batch_id=1 - ) +# TODO: Broken; fix or replace +# @pytest.mark.asyncio +# async def test_muckrock_all_foia_requests_collector(patch_muckrock_full_search_collector): +# mock = patch_muckrock_full_search_collector +# collector = MuckrockAllFOIARequestsCollector( +# batch_id=1, +# dto=MuckrockAllFOIARequestsCollectorInputDTO( +# start_page=1, +# total_pages=2 +# ), +# logger=AsyncMock(spec=AsyncCoreLogger), +# adb_client=AsyncMock(spec=AsyncDatabaseClient), +# raise_error=True +# ) +# await collector.run() +# +# mock.get_page_data.assert_called_once_with(mock.foia_fetcher.return_value, 1, 2) +# +# collector.adb_client.insert_urls.assert_called_once_with( +# url_infos=[ +# URLInfo( +# url='https://include.com/1', +# collector_metadata={'absolute_url': 'https://include.com/1', 'title': 'keyword'}, +# ), +# URLInfo( +# url='https://include.com/2', +# collector_metadata={'absolute_url': 'https://include.com/2', 'title': 'keyword'}, +# ), +# URLInfo( +# url='https://include.com/3', +# collector_metadata={'absolute_url': 'https://include.com/3', 'title': 'lemon'}, +# ), +# ], +# batch_id=1 +# ) diff --git a/tests/automated/unit/test_function_trigger.py b/tests/automated/unit/test_function_trigger.py index cc3a77b2..debea277 100644 --- a/tests/automated/unit/test_function_trigger.py +++ b/tests/automated/unit/test_function_trigger.py @@ -3,7 +3,7 @@ import pytest -from src.core.FunctionTrigger import FunctionTrigger +from src.core.function_trigger import FunctionTrigger @pytest.mark.asyncio diff --git a/tests/conftest.py b/tests/conftest.py index cab4a2ad..3485f3bd 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,14 +3,14 @@ from sqlalchemy import create_engine, inspect, MetaData from sqlalchemy.orm import scoped_session, sessionmaker -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DatabaseClient import DatabaseClient -from src.db.helper_functions import get_postgres_connection_string -from src.db.models import Base -from src.core.EnvVarManager import EnvVarManager +from src.db.client.async_ import AsyncDatabaseClient +from src.db.client.sync import DatabaseClient +from src.db.helpers import get_postgres_connection_string +from src.db.models.templates import Base +from src.core.env_var_manager import EnvVarManager from src.util.helper_functions import load_from_environment -from tests.helpers.AlembicRunner import AlembicRunner -from tests.helpers.DBDataCreator import DBDataCreator +from tests.helpers.alembic_runner import AlembicRunner +from tests.helpers.db_data_creator import DBDataCreator @pytest.fixture(autouse=True, scope="session") diff --git a/tests/helpers/AlembicRunner.py b/tests/helpers/alembic_runner.py similarity index 100% rename from tests/helpers/AlembicRunner.py rename to tests/helpers/alembic_runner.py diff --git a/tests/helpers/assert_functions.py b/tests/helpers/assert_functions.py index 32fe608c..54eeaf1e 100644 --- a/tests/helpers/assert_functions.py +++ b/tests/helpers/assert_functions.py @@ -1,4 +1,4 @@ -from src.db import AsyncDatabaseClient +from src.db.client import async_ from src.db.models import Task diff --git a/tests/helpers/AwaitableBarrier.py b/tests/helpers/awaitable_barrier.py similarity index 100% rename from tests/helpers/AwaitableBarrier.py rename to tests/helpers/awaitable_barrier.py diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index 5d1e237c..822b7333 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -2,12 +2,12 @@ from pydantic import BaseModel -from src.db.DTOs.InsertURLsInfo import InsertURLsInfo -from src.db.DTOs.URLMapping import URLMapping -from src.collector_manager.enums import URLStatus +from src.db.dtos.insert_urls_info import InsertURLsInfo +from src.db.dtos.url_mapping import URLMapping +from src.collectors.enums import URLStatus from src.core.enums import RecordType, SuggestionType -from tests.helpers.DBDataCreator import BatchURLCreationInfo -from tests.helpers.DBDataCreator import DBDataCreator +from tests.helpers.db_data_creator import BatchURLCreationInfo +from tests.helpers.db_data_creator import DBDataCreator class AnnotationSetupInfo(BaseModel): batch_id: int diff --git a/tests/helpers/DBDataCreator.py b/tests/helpers/db_data_creator.py similarity index 94% rename from tests/helpers/DBDataCreator.py rename to tests/helpers/db_data_creator.py index 8e03eeed..c96946ee 100644 --- a/tests/helpers/DBDataCreator.py +++ b/tests/helpers/db_data_creator.py @@ -4,21 +4,22 @@ from pydantic import BaseModel -from src.db.AsyncDatabaseClient import AsyncDatabaseClient -from src.db.DTOs.BatchInfo import BatchInfo -from src.db.DTOs.DuplicateInfo import DuplicateInsertInfo -from src.db.DTOs.InsertURLsInfo import InsertURLsInfo -from src.db.DTOs.URLErrorInfos import URLErrorPydanticInfo -from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo, HTMLContentType -from src.db.DTOs.URLInfo import URLInfo -from src.db.DTOs.URLMapping import URLMapping -from src.db.DatabaseClient import DatabaseClient +from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo +from src.api.endpoints.review.enums import RejectionReason +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.batch_info import BatchInfo +from src.db.dtos.duplicate_info import DuplicateInsertInfo +from src.db.dtos.insert_urls_info import InsertURLsInfo +from src.db.dtos.url_error_info import URLErrorPydanticInfo +from src.db.dtos.url_html_content_info import URLHTMLContentInfo, HTMLContentType +from src.db.dtos.url_info import URLInfo +from src.db.dtos.url_mapping import URLMapping +from src.db.client.sync import DatabaseClient from src.db.enums import TaskType -from src.collector_manager.enums import CollectorType, URLStatus -from src.core.DTOs.FinalReviewApprovalInfo import FinalReviewApprovalInfo, RejectionReason -from src.core.DTOs.URLAgencySuggestionInfo import URLAgencySuggestionInfo -from src.core.DTOs.task_data_objects.SubmitApprovedURLTDO import SubmittedURLInfo -from src.core.DTOs.task_data_objects.URLMiscellaneousMetadataTDO import URLMiscellaneousMetadataTDO +from src.collectors.enums import CollectorType, URLStatus +from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo +from src.core.tasks.operators.submit_approved_url.tdo import SubmittedURLInfo +from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO from src.core.enums import BatchStatus, SuggestionType, RecordType, SuggestedStatus from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, AnnotationInfo from tests.helpers.simple_test_data_functions import generate_test_urls diff --git a/tests/helpers/patch_functions.py b/tests/helpers/patch_functions.py index a5798014..8a42c9dc 100644 --- a/tests/helpers/patch_functions.py +++ b/tests/helpers/patch_functions.py @@ -1,10 +1,10 @@ -from tests.helpers.AwaitableBarrier import AwaitableBarrier +from tests.helpers.awaitable_barrier import AwaitableBarrier async def block_sleep(monkeypatch) -> AwaitableBarrier: barrier = AwaitableBarrier() monkeypatch.setattr( - "src.collector_manager.ExampleCollector.ExampleCollector.sleep", + "src.collectors.source_collectors.example.core.ExampleCollector.sleep", barrier ) return barrier diff --git a/tests/helpers/test_batch_creation_parameters.py b/tests/helpers/test_batch_creation_parameters.py index 7952b762..33fbd5e5 100644 --- a/tests/helpers/test_batch_creation_parameters.py +++ b/tests/helpers/test_batch_creation_parameters.py @@ -3,7 +3,7 @@ from pydantic import BaseModel, model_validator -from src.collector_manager.enums import URLStatus, CollectorType +from src.collectors.enums import URLStatus, CollectorType from src.core.enums import BatchStatus, RecordType, SuggestedStatus diff --git a/tests/manual/agency_identifier/test_muckrock_api_interface.py b/tests/manual/agency_identifier/test_muckrock_api_interface.py index 8f76385e..d00a6aa2 100644 --- a/tests/manual/agency_identifier/test_muckrock_api_interface.py +++ b/tests/manual/agency_identifier/test_muckrock_api_interface.py @@ -1,7 +1,7 @@ import pytest from aiohttp import ClientSession -from src.source_collectors.muckrock.MuckrockAPIInterface import MuckrockAPIInterface +from src.collectors.source_collectors import MuckrockAPIInterface @pytest.mark.asyncio diff --git a/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py b/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py index 3e545b2e..d9f1cd7a 100644 --- a/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py +++ b/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py @@ -2,8 +2,8 @@ import dotenv -from src.db.DTOs.BatchInfo import BatchInfo -from src.collector_manager import CollectorType +from src.db.dtos.batch_info import BatchInfo +from src.collectors import CollectorType from src.core.enums import BatchStatus from test_automated.integration.core.helpers.common_test_procedures import run_collector_and_wait_for_completion diff --git a/tests/manual/core/lifecycle/test_ckan_lifecycle.py b/tests/manual/core/lifecycle/test_ckan_lifecycle.py index 567d8f9b..7f7be82e 100644 --- a/tests/manual/core/lifecycle/test_ckan_lifecycle.py +++ b/tests/manual/core/lifecycle/test_ckan_lifecycle.py @@ -1,7 +1,7 @@ -from src.db.DTOs.BatchInfo import BatchInfo -from src.collector_manager import CollectorType +from src.db.dtos.batch_info import BatchInfo +from src.collectors import CollectorType from src.core.enums import BatchStatus -from src.source_collectors.ckan.search_terms import group_search, package_search, organization_search +from src.collectors.source_collectors.ckan import group_search, package_search, organization_search from test_automated.integration.core.helpers.common_test_procedures import run_collector_and_wait_for_completion diff --git a/tests/manual/core/lifecycle/test_common_crawler_lifecycle.py b/tests/manual/core/lifecycle/test_common_crawler_lifecycle.py index 3883c864..bb3babd1 100644 --- a/tests/manual/core/lifecycle/test_common_crawler_lifecycle.py +++ b/tests/manual/core/lifecycle/test_common_crawler_lifecycle.py @@ -1,12 +1,15 @@ import time -from src.collector_manager import CollectorType -from src.core.SourceCollectorCore import SourceCollectorCore +import pytest + +from src.collectors import CollectorType +from src.core.core import AsyncCore from src.core.enums import BatchStatus -def test_common_crawler_lifecycle(test_core: SourceCollectorCore): - core = test_core +@pytest.mark.asyncio +async def test_common_crawler_lifecycle(test_async_core: AsyncCore, monkeypatch): + acore = test_async_core db_client = src.api.dependencies.db_client config = { @@ -22,10 +25,10 @@ def test_common_crawler_lifecycle(test_core: SourceCollectorCore): ) assert response == "Started common_crawler collector with CID: 1" - response = core.get_status(1) + response = await acore.get_status(1) while response == "1 (common_crawler) - RUNNING": time.sleep(1) - response = core.get_status(1) + response = await acore.get_status(1) assert response == "1 (common_crawler) - COMPLETED" response = core.close_collector(1) diff --git a/tests/manual/core/lifecycle/test_muckrock_lifecycles.py b/tests/manual/core/lifecycle/test_muckrock_lifecycles.py index a5dfce38..a890b7df 100644 --- a/tests/manual/core/lifecycle/test_muckrock_lifecycles.py +++ b/tests/manual/core/lifecycle/test_muckrock_lifecycles.py @@ -1,5 +1,5 @@ -from src.db.DTOs.BatchInfo import BatchInfo -from src.collector_manager import CollectorType +from src.db.dtos.batch_info import BatchInfo +from src.collectors import CollectorType from src.core.enums import BatchStatus from test_automated.integration.core.helpers.common_test_procedures import run_collector_and_wait_for_completion from test_automated.integration.core.helpers.constants import ALLEGHENY_COUNTY_MUCKROCK_ID, ALLEGHENY_COUNTY_TOWN_NAMES diff --git a/tests/manual/html_collector/test_html_tag_collector_integration.py b/tests/manual/html_collector/test_html_tag_collector_integration.py index 674360a4..45b1daf9 100644 --- a/tests/manual/html_collector/test_html_tag_collector_integration.py +++ b/tests/manual/html_collector/test_html_tag_collector_integration.py @@ -1,12 +1,9 @@ import pytest -from src.db import AsyncDatabaseClient -from src.db.DTOs import URLInfo -from src.core.classes.task_operators.URLHTMLTaskOperator import URLHTMLTaskOperator -from tests.helpers.DBDataCreator import DBDataCreator -from src.html_tag_collector.ResponseParser import HTMLResponseParser -from src.html_tag_collector import RootURLCache -from src.html_tag_collector.URLRequestInterface import URLRequestInterface +from src.core.tasks.operators.url_html import URLHTMLTaskOperator +from tests.helpers.db_data_creator import DBDataCreator +from src.core.tasks.operators.url_html.scraper import HTMLResponseParser +from src.core.tasks.operators.url_html.scraper.request_interface import URLRequestInterface URLS = [ "https://pdap.io", diff --git a/tests/manual/llm_api_logic/test_deepseek_record_classifier.py b/tests/manual/llm_api_logic/test_deepseek_record_classifier.py index cf239aa4..6dcca0c7 100644 --- a/tests/manual/llm_api_logic/test_deepseek_record_classifier.py +++ b/tests/manual/llm_api_logic/test_deepseek_record_classifier.py @@ -1,12 +1,12 @@ import pytest -from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo -from src.llm_api_logic.DeepSeekRecordClassifier import DeepSeekRecordClassifier +from src.db.dtos.url_html_content_info import URLHTMLContentInfo +from src.core.tasks.operators.record_type.llm_api.record_classifier.deepseek import DeepSeekRecordClassifier @pytest.mark.asyncio async def test_deepseek_record_classifier(): - from src.db.DTOs.URLHTMLContentInfo import HTMLContentType as hct + from src.db.dtos.url_html_content_info import HTMLContentType as hct d = { hct.TITLE: "Oath of Office for Newly Promoted Corporal Lumpkin with Acworth Police – City of Acworth, GA", diff --git a/tests/manual/llm_api_logic/test_openai_record_classifier.py b/tests/manual/llm_api_logic/test_openai_record_classifier.py index b1812a27..9f1874f4 100644 --- a/tests/manual/llm_api_logic/test_openai_record_classifier.py +++ b/tests/manual/llm_api_logic/test_openai_record_classifier.py @@ -1,12 +1,12 @@ import pytest -from src.db.DTOs.URLHTMLContentInfo import URLHTMLContentInfo -from src.llm_api_logic.OpenAIRecordClassifier import OpenAIRecordClassifier +from src.db.dtos.url_html_content_info import URLHTMLContentInfo +from src.core.tasks.operators.record_type.llm_api.record_classifier.openai import OpenAIRecordClassifier @pytest.mark.asyncio async def test_openai_record_classifier(): - from src.db.DTOs.URLHTMLContentInfo import HTMLContentType as hct + from src.db.dtos.url_html_content_info import HTMLContentType as hct d = { hct.TITLE: "Oath of Office for Newly Promoted Corporal Lumpkin with Acworth Police – City of Acworth, GA", diff --git a/tests/manual/pdap_client/test_pdap_client.py b/tests/manual/pdap_client/test_pdap_client.py index a8a8da29..91bf016a 100644 --- a/tests/manual/pdap_client/test_pdap_client.py +++ b/tests/manual/pdap_client/test_pdap_client.py @@ -2,7 +2,7 @@ from aiohttp import ClientSession from pdap_access_manager import AccessManager -from src.pdap_api_client.PDAPClient import PDAPClient +from src.pdap_api.client import PDAPClient from src.util import get_from_env diff --git a/tests/manual/source_collectors/test_autogoogler_collector.py b/tests/manual/source_collectors/test_autogoogler_collector.py index 926875f9..ab926b10 100644 --- a/tests/manual/source_collectors/test_autogoogler_collector.py +++ b/tests/manual/source_collectors/test_autogoogler_collector.py @@ -2,10 +2,9 @@ import pytest -from src.db import AsyncDatabaseClient -from src.core.AsyncCoreLogger import AsyncCoreLogger -from src.source_collectors.auto_googler.AutoGooglerCollector import AutoGooglerCollector -from src.source_collectors.auto_googler.DTOs import AutoGooglerInputDTO +from src.core.logger import AsyncCoreLogger +from src.collectors.source_collectors.auto_googler.collector import AutoGooglerCollector +from src.collectors.source_collectors.auto_googler import AutoGooglerInputDTO @pytest.mark.asyncio async def test_autogoogler_collector(): diff --git a/tests/manual/source_collectors/test_ckan_collector.py b/tests/manual/source_collectors/test_ckan_collector.py index 0fadec3a..19358f56 100644 --- a/tests/manual/source_collectors/test_ckan_collector.py +++ b/tests/manual/source_collectors/test_ckan_collector.py @@ -3,11 +3,10 @@ import pytest from marshmallow import Schema, fields -from src.db import AsyncDatabaseClient -from src.core.AsyncCoreLogger import AsyncCoreLogger -from src.source_collectors.ckan import CKANCollector -from src.source_collectors.ckan.DTOs import CKANInputDTO -from src.source_collectors.ckan.search_terms import package_search, group_search, organization_search +from src.core.logger import AsyncCoreLogger +from src.collectors.source_collectors.ckan import collector +from src.collectors.source_collectors.ckan.dtos.input import CKANInputDTO +from src.collectors.source_collectors.ckan import package_search, group_search, organization_search class CKANSchema(Schema): diff --git a/tests/manual/source_collectors/test_common_crawler_collector.py b/tests/manual/source_collectors/test_common_crawler_collector.py index c91da5e7..144bfc6e 100644 --- a/tests/manual/source_collectors/test_common_crawler_collector.py +++ b/tests/manual/source_collectors/test_common_crawler_collector.py @@ -3,10 +3,9 @@ import pytest from marshmallow import Schema, fields -from src.db import AsyncDatabaseClient -from src.core.AsyncCoreLogger import AsyncCoreLogger -from src.source_collectors.common_crawler import CommonCrawlerCollector -from src.source_collectors.common_crawler.DTOs import CommonCrawlerInputDTO +from src.core.logger import AsyncCoreLogger +from src.collectors.source_collectors.common_crawler import collector +from src.collectors.source_collectors.common_crawler import CommonCrawlerInputDTO class CommonCrawlerSchema(Schema): diff --git a/tests/manual/source_collectors/test_muckrock_collectors.py b/tests/manual/source_collectors/test_muckrock_collectors.py index 5d0fd1ca..caf2274c 100644 --- a/tests/manual/source_collectors/test_muckrock_collectors.py +++ b/tests/manual/source_collectors/test_muckrock_collectors.py @@ -1,17 +1,22 @@ from unittest.mock import AsyncMock import pytest +from marshmallow import Schema, fields -from src.db import AsyncDatabaseClient -from src.core.AsyncCoreLogger import AsyncCoreLogger -from src.source_collectors.muckrock.DTOs import MuckrockSimpleSearchCollectorInputDTO, \ - MuckrockCountySearchCollectorInputDTO, MuckrockAllFOIARequestsCollectorInputDTO -from src.source_collectors.muckrock.classes import MuckrockSimpleSearchCollector, \ +from src.core.logger import AsyncCoreLogger +from src.collectors.source_collectors.muckrock.collectors.all_foia.dto import MuckrockAllFOIARequestsCollectorInputDTO +from src.collectors.source_collectors.muckrock.collectors.county.dto import MuckrockCountySearchCollectorInputDTO +from src.collectors.source_collectors.muckrock.collectors.simple.dto import MuckrockSimpleSearchCollectorInputDTO +from src.collectors.source_collectors import MuckrockSimpleSearchCollector, \ MuckrockCountyLevelSearchCollector, MuckrockAllFOIARequestsCollector -from src.source_collectors.muckrock.schemas import MuckrockURLInfoSchema +from src.db.client.async_ import AsyncDatabaseClient from tests.automated.integration.core.helpers.constants import ALLEGHENY_COUNTY_MUCKROCK_ID, \ ALLEGHENY_COUNTY_TOWN_NAMES +class MuckrockURLInfoSchema(Schema): + url = fields.String(required=True) + metadata = fields.Dict(required=True) + @pytest.mark.asyncio async def test_muckrock_simple_search_collector(): diff --git a/tests/manual/unsorted/test_common_crawler_unit.py b/tests/manual/unsorted/test_common_crawler_unit.py deleted file mode 100644 index 9853e06f..00000000 --- a/tests/manual/unsorted/test_common_crawler_unit.py +++ /dev/null @@ -1,63 +0,0 @@ -# Test Cases -import json -from unittest.mock import patch - -from common_crawler.argparser import valid_common_crawl_id -from common_crawler.crawler import CommonCrawlerManager - -# region CommonCrawler - -# Mock data -mock_search_response = json.dumps({ - "pages": 10, - "records": [{"url": "http://example.com"}, {"url": "http://example.com/page2"}] -}) - - -@patch('requests.get') -def test_search_cc_index(mock_get): - """ - Test that the search_cc_index method returns the expected records - """ - mock_get.return_value.status_code = 200 - mock_get.return_value.text = mock_search_response - - crawler = CommonCrawlerManager() - result = crawler.search_common_crawl_index("http://example.com") - - assert len(result[0]['records']) == 2 # Assuming the mock response contains 2 records - assert result[0]['records'][0]['url'] == "http://example.com" - - -def test_get_urls_with_keyword(): - """ - Test that the get_urls_with_keyword method returns the expected URLs - """ - records = [ - {"url": "http://example.com"}, - {"url": "http://example.com/page2"}, - {"url": "http://test.com"} - ] - urls = CommonCrawlerManager.get_urls_with_keyword(records, "example") - assert len(urls) == 2 - assert "http://test.com" not in urls - - -# endregion CommonCrawler - -# region Common Crawler Manager - -def test_crawl_id_validation(): - """ - Test that the valid_common_crawl_id function properly detects - valid and invalid crawl IDs - """ - - valid_crawl_id = "CC-MAIN-2023-50" - invalid_crawl_id = "CC-MAIN-202" - - assert valid_common_crawl_id(valid_crawl_id) - assert not valid_common_crawl_id(invalid_crawl_id) - - -# endregion CommonCrawlerManager diff --git a/tests/manual/unsorted/test_root_url_cache_unit.py b/tests/manual/unsorted/test_root_url_cache_unit.py index f319d813..c19261b9 100644 --- a/tests/manual/unsorted/test_root_url_cache_unit.py +++ b/tests/manual/unsorted/test_root_url_cache_unit.py @@ -5,8 +5,6 @@ import pytest -from src.html_tag_collector import RootURLCache # Adjust import according to your package structure - @pytest.fixture def temp_file(): From b6822ebb0438956a15fd0f98e7b094ee1703872c Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 2 Jun 2025 08:33:34 -0400 Subject: [PATCH 200/244] Reorganize directories --- .../unit/security_manager/test_security_manager.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/automated/unit/security_manager/test_security_manager.py b/tests/automated/unit/security_manager/test_security_manager.py index 1e7aa78f..66399d7f 100644 --- a/tests/automated/unit/security_manager/test_security_manager.py +++ b/tests/automated/unit/security_manager/test_security_manager.py @@ -13,15 +13,14 @@ INVALID_TOKEN = "invalid_token" FAKE_PAYLOAD = {"sub": 1, "permissions": [Permissions.SOURCE_COLLECTOR.value]} -PATCH_ROOT = "src.security_manager.SecurityManager" +PATCH_ROOT = "src.security.manager" def get_patch_path(patch_name): return f"{PATCH_ROOT}.{patch_name}" @pytest.fixture -def mock_get_secret_key(mocker): - mocker.patch(get_patch_path("get_secret_key"), return_value=SECRET_KEY) - +def mock_get_secret_key(monkeypatch): + monkeypatch.setenv("DS_APP_SECRET_KEY", SECRET_KEY) @pytest.fixture From 66d56adc17a7810af9170bb1718c137581a6e800 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 2 Jun 2025 10:03:28 -0400 Subject: [PATCH 201/244] Fix bug when parsing dynamic URLs --- pytest.ini | 4 +- src/core/tasks/operators/url_html/core.py | 6 ++- .../scraper/request_interface/core.py | 2 +- tests/automated/integration/api/conftest.py | 27 +---------- tests/automated/integration/api/test_task.py | 2 +- tests/conftest.py | 6 ++- tests/helpers/api_test_helper.py | 29 ++++++++++++ tests/manual/core/tasks/__init__.py | 0 .../core/tasks/test_url_html_task_operator.py | 47 +++++++++++++++++++ .../test_html_tag_collector_integration.py | 10 ++-- 10 files changed, 96 insertions(+), 37 deletions(-) create mode 100644 tests/helpers/api_test_helper.py create mode 100644 tests/manual/core/tasks/__init__.py create mode 100644 tests/manual/core/tasks/test_url_html_task_operator.py diff --git a/pytest.ini b/pytest.ini index 7ffaf369..8f6981ae 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,3 +1,5 @@ [pytest] timeout = 300 -asyncio_default_fixture_loop_scope=function \ No newline at end of file +asyncio_default_fixture_loop_scope=function +markers = + manual: mark test as manual-only (excluded from default test runs) \ No newline at end of file diff --git a/src/core/tasks/operators/url_html/core.py b/src/core/tasks/operators/url_html/core.py index 9ae4b6fc..c67f2e8c 100644 --- a/src/core/tasks/operators/url_html/core.py +++ b/src/core/tasks/operators/url_html/core.py @@ -37,12 +37,14 @@ async def inner_task_logic(self): await self.get_raw_html_data_for_urls(tdos) success_subset, error_subset = await self.separate_success_and_error_subsets(tdos) non_404_error_subset, is_404_error_subset = await self.separate_error_and_404_subsets(error_subset) + await self.process_html_data(success_subset) + await self.update_database(is_404_error_subset, non_404_error_subset, success_subset) + + async def update_database(self, is_404_error_subset, non_404_error_subset, success_subset): await self.update_errors_in_database(non_404_error_subset) await self.update_404s_in_database(is_404_error_subset) - await self.process_html_data(success_subset) await self.update_html_data_in_database(success_subset) - async def get_just_urls(self, tdos: list[UrlHtmlTDO]): return [task_info.url_info.url for task_info in tdos] diff --git a/src/core/tasks/operators/url_html/scraper/request_interface/core.py b/src/core/tasks/operators/url_html/scraper/request_interface/core.py index 4a222aa3..46d43df2 100644 --- a/src/core/tasks/operators/url_html/scraper/request_interface/core.py +++ b/src/core/tasks/operators/url_html/scraper/request_interface/core.py @@ -37,7 +37,7 @@ async def fetch_and_render(self, rr: RequestResources, url: str) -> Optional[URL if simple_response.content_type != HTML_CONTENT_TYPE: return simple_response - await self.get_dynamic_html_content(rr, url) + return await self.get_dynamic_html_content(rr, url) async def get_dynamic_html_content(self, rr, url): # For HTML responses, attempt to load the page to check for dynamic html content diff --git a/tests/automated/integration/api/conftest.py b/tests/automated/integration/api/conftest.py index aae25b48..ae25b263 100644 --- a/tests/automated/integration/api/conftest.py +++ b/tests/automated/integration/api/conftest.py @@ -1,5 +1,3 @@ -import asyncio -from dataclasses import dataclass from typing import Generator, Any, AsyncGenerator from unittest.mock import AsyncMock @@ -7,37 +5,14 @@ import pytest_asyncio from starlette.testclient import TestClient -from src.api.endpoints.batch.dtos.get.status import GetBatchStatusResponse from src.api.endpoints.review.routes import requires_final_review_permission from src.api.main import app from src.core.core import AsyncCore -from src.core.enums import BatchStatus from src.security.manager import get_access_info from src.security.dtos.access_info import AccessInfo from src.security.enums import Permissions from tests.automated.integration.api.helpers.RequestValidator import RequestValidator -from tests.helpers.db_data_creator import DBDataCreator - - -@dataclass -class APITestHelper: - request_validator: RequestValidator - async_core: AsyncCore - db_data_creator: DBDataCreator - - def adb_client(self): - return self.db_data_creator.adb_client - - async def wait_for_all_batches_to_complete(self): - for i in range(20): - data: GetBatchStatusResponse = self.request_validator.get_batch_statuses( - status=BatchStatus.IN_PROCESS - ) - if len(data.results) == 0: - return - print("Waiting...") - await asyncio.sleep(0.1) - raise ValueError("Batches did not complete in expected time") +from tests.helpers.api_test_helper import APITestHelper MOCK_USER_ID = 1 diff --git a/tests/automated/integration/api/test_task.py b/tests/automated/integration/api/test_task.py index 21e662f1..e74908e3 100644 --- a/tests/automated/integration/api/test_task.py +++ b/tests/automated/integration/api/test_task.py @@ -1,7 +1,7 @@ import pytest from src.db.enums import TaskType -from tests.automated.integration.api.conftest import APITestHelper +from tests.helpers.api_test_helper import APITestHelper async def task_setup(ath: APITestHelper) -> int: diff --git a/tests/conftest.py b/tests/conftest.py index 3485f3bd..3bdcb79e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,3 +1,5 @@ +from typing import Any, Generator + import pytest from alembic.config import Config from sqlalchemy import create_engine, inspect, MetaData @@ -97,7 +99,7 @@ def wipe_database(): @pytest.fixture -def db_client_test(wipe_database) -> DatabaseClient: +def db_client_test(wipe_database) -> Generator[DatabaseClient, Any, None]: # Drop pre-existing table conn = get_postgres_connection_string() db_client = DatabaseClient(db_url=conn) @@ -105,7 +107,7 @@ def db_client_test(wipe_database) -> DatabaseClient: db_client.engine.dispose() @pytest.fixture -def adb_client_test(wipe_database) -> AsyncDatabaseClient: +def adb_client_test(wipe_database) -> Generator[AsyncDatabaseClient, Any, None]: conn = get_postgres_connection_string(is_async=True) adb_client = AsyncDatabaseClient(db_url=conn) yield adb_client diff --git a/tests/helpers/api_test_helper.py b/tests/helpers/api_test_helper.py new file mode 100644 index 00000000..fa577b34 --- /dev/null +++ b/tests/helpers/api_test_helper.py @@ -0,0 +1,29 @@ +import asyncio +from dataclasses import dataclass + +from src.api.endpoints.batch.dtos.get.status import GetBatchStatusResponse +from src.core.core import AsyncCore +from src.core.enums import BatchStatus +from tests.automated.integration.api.helpers.RequestValidator import RequestValidator +from tests.helpers.db_data_creator import DBDataCreator + + +@dataclass +class APITestHelper: + request_validator: RequestValidator + async_core: AsyncCore + db_data_creator: DBDataCreator + + def adb_client(self): + return self.db_data_creator.adb_client + + async def wait_for_all_batches_to_complete(self): + for i in range(20): + data: GetBatchStatusResponse = self.request_validator.get_batch_statuses( + status=BatchStatus.IN_PROCESS + ) + if len(data.results) == 0: + return + print("Waiting...") + await asyncio.sleep(0.1) + raise ValueError("Batches did not complete in expected time") diff --git a/tests/manual/core/tasks/__init__.py b/tests/manual/core/tasks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/manual/core/tasks/test_url_html_task_operator.py b/tests/manual/core/tasks/test_url_html_task_operator.py new file mode 100644 index 00000000..b4f343fe --- /dev/null +++ b/tests/manual/core/tasks/test_url_html_task_operator.py @@ -0,0 +1,47 @@ +from unittest.mock import patch + +import pytest + +from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO, ManualBatchInnerInputDTO +from src.core.tasks.operators.url_html.core import URLHTMLTaskOperator +from src.core.tasks.operators.url_html.scraper.parser.core import HTMLResponseParser +from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface +from src.core.tasks.operators.url_html.scraper.root_url_cache.core import RootURLCache + + +@pytest.mark.asyncio +@pytest.mark.manual +async def test_url_html_task_operator( + adb_client_test, +): + urls_to_insert = [ + "https://www.albanyca.org/departments/fire-department/programs-classes-events", + "https://www.albanyca.gov/Departments/Police-Department/Crime-Mapping", + "https://www.facebook.com/AlbanyPoliceCa/", + "https://www.governmentjobs.com/careers/albanyca/jobs/3395149/police-officer?pagetype=jobOpportunitiesJobs", + "https://www.albanyca.org/", + "https://www.albanyca.gov/Departments/Police-Department", + "https://www.joinalbanypd.us/", + "https://www.albanyca.gov/Departments/Police-Department/Contact-Albany-Police", + "https://www.albanyca.org/departments/police-department/policies-procedures-training-sb978", + "https://www.yelp.com/biz/albany-police-department-albany-3", + ] + parser = HTMLResponseParser( + root_url_cache=RootURLCache( + adb_client=adb_client_test + ) + ) + manual_batch_dto = ManualBatchInputDTO( + name="Test Batch", + entries=[ + ManualBatchInnerInputDTO(url=url) for url in urls_to_insert + ] + ) + await adb_client_test.upload_manual_batch(dto=manual_batch_dto, user_id=1) + operator = URLHTMLTaskOperator( + adb_client=adb_client_test, + url_request_interface=URLRequestInterface(), + html_parser=parser + ) + run_info = await operator.run_task(1) + pass \ No newline at end of file diff --git a/tests/manual/html_collector/test_html_tag_collector_integration.py b/tests/manual/html_collector/test_html_tag_collector_integration.py index 45b1daf9..4a40b84e 100644 --- a/tests/manual/html_collector/test_html_tag_collector_integration.py +++ b/tests/manual/html_collector/test_html_tag_collector_integration.py @@ -1,9 +1,12 @@ import pytest -from src.core.tasks.operators.url_html import URLHTMLTaskOperator +from src.core.tasks.operators.url_html.core import URLHTMLTaskOperator +from src.core.tasks.operators.url_html.scraper.parser.core import HTMLResponseParser +from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface +from src.core.tasks.operators.url_html.scraper.root_url_cache.core import RootURLCache +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.url_info import URLInfo from tests.helpers.db_data_creator import DBDataCreator -from src.core.tasks.operators.url_html.scraper import HTMLResponseParser -from src.core.tasks.operators.url_html.scraper.request_interface import URLRequestInterface URLS = [ "https://pdap.io", @@ -71,7 +74,6 @@ async def test_url_html_cycle( url_infos.append(URLInfo(url=url)) await adb_client.insert_urls(url_infos=url_infos, batch_id=batch_id) - operator = URLHTMLTaskOperator( adb_client=adb_client, url_request_interface=URLRequestInterface(), From c6cbd487dfd8122875be55f88bf5c5e98ca7b4e3 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 2 Jun 2025 11:59:21 -0400 Subject: [PATCH 202/244] Add batch progress info for annotations --- .../annotate/dtos/agency/response.py | 7 +- .../endpoints/annotate/dtos/all/response.py | 11 +- .../annotate/dtos/record_type/response.py | 9 +- .../annotate/dtos/relevance/response.py | 11 +- .../annotate/dtos/shared/__init__.py | 0 .../annotate/dtos/shared/base/__init__.py | 0 .../annotate/dtos/shared/base/response.py | 19 +++ .../endpoints/annotate/dtos/shared/batch.py | 7 ++ src/db/client/async_.py | 108 ++++++++++++++++-- src/db/statement_composer.py | 20 +++- src/db/types.py | 3 + .../integration/api/test_annotate.py | 14 +-- .../collector_db/test_db_client.py | 36 +++++- 13 files changed, 190 insertions(+), 55 deletions(-) create mode 100644 src/api/endpoints/annotate/dtos/shared/__init__.py create mode 100644 src/api/endpoints/annotate/dtos/shared/base/__init__.py create mode 100644 src/api/endpoints/annotate/dtos/shared/base/response.py create mode 100644 src/api/endpoints/annotate/dtos/shared/batch.py create mode 100644 src/db/types.py diff --git a/src/api/endpoints/annotate/dtos/agency/response.py b/src/api/endpoints/annotate/dtos/agency/response.py index abd12877..f2dda0f5 100644 --- a/src/api/endpoints/annotate/dtos/agency/response.py +++ b/src/api/endpoints/annotate/dtos/agency/response.py @@ -2,8 +2,8 @@ from pydantic import BaseModel +from src.api.endpoints.annotate.dtos.shared.base.response import AnnotationInnerResponseInfoBase from src.core.enums import SuggestionType -from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo class GetNextURLForAgencyAgencyInfo(BaseModel): suggestion_type: SuggestionType @@ -13,13 +13,10 @@ class GetNextURLForAgencyAgencyInfo(BaseModel): county: Optional[str] = None locality: Optional[str] = None -class GetNextURLForAgencyAnnotationInnerResponse(BaseModel): - url_id: int - url: str +class GetNextURLForAgencyAnnotationInnerResponse(AnnotationInnerResponseInfoBase): agency_suggestions: list[ GetNextURLForAgencyAgencyInfo ] - html_info: ResponseHTMLInfo class GetNextURLForAgencyAnnotationResponse(BaseModel): next_annotation: Optional[GetNextURLForAgencyAnnotationInnerResponse] diff --git a/src/api/endpoints/annotate/dtos/all/response.py b/src/api/endpoints/annotate/dtos/all/response.py index 0f938337..6620624f 100644 --- a/src/api/endpoints/annotate/dtos/all/response.py +++ b/src/api/endpoints/annotate/dtos/all/response.py @@ -3,15 +3,14 @@ from pydantic import Field, BaseModel from src.api.endpoints.annotate.dtos.agency.response import GetNextURLForAgencyAgencyInfo +from src.api.endpoints.annotate.dtos.shared.base.response import AnnotationInnerResponseInfoBase from src.core.enums import RecordType -from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo -class GetNextURLForAllAnnotationInnerResponse(BaseModel): - url_id: int - url: str - html_info: ResponseHTMLInfo - agency_suggestions: Optional[list[GetNextURLForAgencyAgencyInfo]] +class GetNextURLForAllAnnotationInnerResponse(AnnotationInnerResponseInfoBase): + agency_suggestions: Optional[list[GetNextURLForAgencyAgencyInfo]] = Field( + title="The auto-labeler's suggestions for agencies" + ) suggested_relevant: Optional[bool] = Field( title="Whether the auto-labeler identified the URL as relevant or not" ) diff --git a/src/api/endpoints/annotate/dtos/record_type/response.py b/src/api/endpoints/annotate/dtos/record_type/response.py index 0b21eea2..7862d477 100644 --- a/src/api/endpoints/annotate/dtos/record_type/response.py +++ b/src/api/endpoints/annotate/dtos/record_type/response.py @@ -2,21 +2,16 @@ from pydantic import Field, BaseModel +from src.api.endpoints.annotate.dtos.shared.base.response import AnnotationInnerResponseInfoBase from src.db.dtos.url_mapping import URLMapping from src.core.enums import RecordType from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo -class GetNextRecordTypeAnnotationResponseInfo(BaseModel): - url_info: URLMapping = Field( - title="Information about the URL" - ) +class GetNextRecordTypeAnnotationResponseInfo(AnnotationInnerResponseInfoBase): suggested_record_type: Optional[RecordType] = Field( title="What record type, if any, the auto-labeler identified the URL as" ) - html_info: ResponseHTMLInfo = Field( - title="HTML information about the URL" - ) class GetNextRecordTypeAnnotationResponseOuterInfo(BaseModel): next_annotation: Optional[GetNextRecordTypeAnnotationResponseInfo] diff --git a/src/api/endpoints/annotate/dtos/relevance/response.py b/src/api/endpoints/annotate/dtos/relevance/response.py index 188fcac7..e6030d61 100644 --- a/src/api/endpoints/annotate/dtos/relevance/response.py +++ b/src/api/endpoints/annotate/dtos/relevance/response.py @@ -2,20 +2,13 @@ from pydantic import BaseModel, Field -from src.db.dtos.url_mapping import URLMapping -from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.api.endpoints.annotate.dtos.shared.base.response import AnnotationInnerResponseInfoBase -class GetNextRelevanceAnnotationResponseInfo(BaseModel): - url_info: URLMapping = Field( - title="Information about the URL" - ) +class GetNextRelevanceAnnotationResponseInfo(AnnotationInnerResponseInfoBase): suggested_relevant: Optional[bool] = Field( title="Whether the auto-labeler identified the URL as relevant or not" ) - html_info: ResponseHTMLInfo = Field( - title="HTML information about the URL" - ) class GetNextRelevanceAnnotationResponseOuterInfo(BaseModel): next_annotation: Optional[GetNextRelevanceAnnotationResponseInfo] diff --git a/src/api/endpoints/annotate/dtos/shared/__init__.py b/src/api/endpoints/annotate/dtos/shared/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/annotate/dtos/shared/base/__init__.py b/src/api/endpoints/annotate/dtos/shared/base/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/annotate/dtos/shared/base/response.py b/src/api/endpoints/annotate/dtos/shared/base/response.py new file mode 100644 index 00000000..7cd0c35d --- /dev/null +++ b/src/api/endpoints/annotate/dtos/shared/base/response.py @@ -0,0 +1,19 @@ +from typing import Optional + +from pydantic import BaseModel, Field + +from src.api.endpoints.annotate.dtos.shared.batch import AnnotationBatchInfo +from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.db.dtos.url_mapping import URLMapping + + +class AnnotationInnerResponseInfoBase(BaseModel): + url_info: URLMapping = Field( + title="Information about the URL" + ) + html_info: ResponseHTMLInfo = Field( + title="HTML information about the URL" + ) + batch_info: Optional[AnnotationBatchInfo] = Field( + title="Information about the annotation batch" + ) \ No newline at end of file diff --git a/src/api/endpoints/annotate/dtos/shared/batch.py b/src/api/endpoints/annotate/dtos/shared/batch.py new file mode 100644 index 00000000..30be91ae --- /dev/null +++ b/src/api/endpoints/annotate/dtos/shared/batch.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel + + +class AnnotationBatchInfo(BaseModel): + count_annotated: int + total_urls: int + count_not_annotated: int \ No newline at end of file diff --git a/src/db/client/async_.py b/src/db/client/async_.py index d6f7208d..05b394e7 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -19,6 +19,7 @@ GetNextURLForAllAnnotationInnerResponse from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseInfo from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseInfo +from src.api.endpoints.annotate.dtos.shared.batch import AnnotationBatchInfo from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO from src.api.endpoints.collector.dtos.manual_batch.response import ManualBatchResponseDTO from src.api.endpoints.metrics.dtos.get.backlog import GetMetricsBacklogResponseDTO, GetMetricsBacklogResponseInnerDTO @@ -68,6 +69,7 @@ from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo from src.core.env_var_manager import EnvVarManager from src.core.enums import BatchStatus, SuggestionType, RecordType, SuggestedStatus +from src.db.types import UserSuggestionType # Type Hints @@ -257,7 +259,14 @@ async def get_next_url_for_relevance_annotation( url_id=url.id ), suggested_relevant=suggestion, - html_info=html_response_info + html_info=html_response_info, + batch_info=await self.get_annotation_batch_info( + session, + batch_id=batch_id, + models=[ + UserRelevantSuggestion + ] + ) ) #endregion relevant @@ -298,7 +307,14 @@ async def get_next_url_for_record_type_annotation( url_id=url.id ), suggested_record_type=suggestion, - html_info=html_response_info + html_info=html_response_info, + batch_info=await self.get_annotation_batch_info( + session, + batch_id=batch_id, + models=[ + UserRecordTypeSuggestion, + ] + ) ) @@ -916,10 +932,19 @@ async def get_next_url_agency_for_annotation( return GetNextURLForAgencyAnnotationResponse( next_annotation=GetNextURLForAgencyAnnotationInnerResponse( - url_id=url_id, - url=url, + url_info=URLMapping( + url=url, + url_id=url_id + ), html_info=response_html_info, - agency_suggestions=agency_suggestions + agency_suggestions=agency_suggestions, + batch_info=await self.get_annotation_batch_info( + session, + batch_id=batch_id, + models=[ + UserUrlAgencySuggestion, + ] + ) ) ) @@ -1747,12 +1772,23 @@ async def get_next_url_for_all_annotations(self, session, batch_id: Optional[int return GetNextURLForAllAnnotationResponse( next_annotation=GetNextURLForAllAnnotationInnerResponse( - url_id=url.id, - url=url.url, + url_info=URLMapping( + url_id=url.id, + url=url.url + ), html_info=html_response_info, suggested_relevant=auto_relevant, suggested_record_type=auto_record_type, - agency_suggestions=agency_suggestions + agency_suggestions=agency_suggestions, + batch_info=await self.get_annotation_batch_info( + session, + batch_id=batch_id, + models=[ + UserUrlAgencySuggestion, + UserRecordTypeSuggestion, + UserRelevantSuggestion + ] + ) ) ) @@ -2380,4 +2416,58 @@ async def get_pending_urls_not_recently_probed_for_404(self, session: AsyncSessi raw_result = await session.execute(query) urls = raw_result.scalars().all() - return [URL404ProbeTDO(url=url.url, url_id=url.id) for url in urls] \ No newline at end of file + return [URL404ProbeTDO(url=url.url, url_id=url.id) for url in urls] + + @staticmethod + async def get_annotation_batch_info( + session: AsyncSession, + batch_id: Optional[int], + models: List[UserSuggestionType] + ) -> Optional[AnnotationBatchInfo]: + if batch_id is None: + return None + + sc = StatementComposer + include_queries = [ + sc.user_suggestion_exists(model) + for model in models + ] + + select_url = select(func.count(URL.id)) + + common_where_clause = [ + URL.outcome == URLStatus.PENDING.value, + URL.batch_id == batch_id, + ] + + annotated_query = ( + select_url + .where( + *common_where_clause, + *include_queries, + ) + ) + + exclude_queries = [ + sc.user_suggestion_not_exists(model) + for model in models + ] + + not_annotated_query = ( + select_url + .where( + *common_where_clause, + *exclude_queries, + ) + ) + + annotated_result_raw = await session.execute(annotated_query) + annotated_result = annotated_result_raw.scalars().one_or_none() + not_annotated_result_raw = await session.execute(not_annotated_query) + not_annotated_result = not_annotated_result_raw.scalars().one_or_none() + + return AnnotationBatchInfo( + count_annotated=annotated_result, + count_not_annotated=not_annotated_result, + total_urls=annotated_result + not_annotated_result + ) \ No newline at end of file diff --git a/src/db/statement_composer.py b/src/db/statement_composer.py index c1ccd367..cd313b59 100644 --- a/src/db/statement_composer.py +++ b/src/db/statement_composer.py @@ -8,6 +8,7 @@ from src.db.models.core import URL, URLHTMLContent, AutomatedUrlAgencySuggestion, URLOptionalDataSourceMetadata, Batch, \ ConfirmedURLAgency, LinkTaskURL, Task, UserUrlAgencySuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion from src.core.enums import BatchStatus +from src.db.types import UserSuggestionType class StatementComposer: @@ -96,6 +97,18 @@ def pending_urls_missing_miscellaneous_metadata_query() -> Select: return query + @staticmethod + def user_suggestion_exists( + model_to_include: UserSuggestionType + ) -> ColumnElement[bool]: + subquery = exists( + select(model_to_include) + .where( + model_to_include.url_id == URL.id, + ) + ) + return subquery + @staticmethod def user_suggestion_not_exists( @@ -106,12 +119,7 @@ def user_suggestion_not_exists( # subquery = not_( - exists( - select(model_to_exclude) - .where( - model_to_exclude.url_id == URL.id, - ) - ) + StatementComposer.user_suggestion_exists(model_to_exclude) ) return subquery diff --git a/src/db/types.py b/src/db/types.py new file mode 100644 index 00000000..40dc9ef3 --- /dev/null +++ b/src/db/types.py @@ -0,0 +1,3 @@ +from src.db.models.core import UserUrlAgencySuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion + +UserSuggestionType = UserUrlAgencySuggestion | UserRelevantSuggestion | UserRecordTypeSuggestion \ No newline at end of file diff --git a/tests/automated/integration/api/test_annotate.py b/tests/automated/integration/api/test_annotate.py index e75e3360..d6bbfa30 100644 --- a/tests/automated/integration/api/test_annotate.py +++ b/tests/automated/integration/api/test_annotate.py @@ -406,7 +406,7 @@ async def test_annotate_agency_multiple_auto_suggestions(api_test_helper): assert response.next_annotation next_annotation = response.next_annotation # Check that url_id matches the one we inserted - assert next_annotation.url_id == buci.url_ids[0] + assert next_annotation.url_info.url_id == buci.url_ids[0] # Check that html data is present assert next_annotation.html_info.description != "" @@ -448,7 +448,7 @@ async def test_annotate_agency_multiple_auto_suggestions_no_html(api_test_helper assert response.next_annotation next_annotation = response.next_annotation # Check that url_id matches the one we inserted - assert next_annotation.url_id == buci.url_ids[0] + assert next_annotation.url_info.url_id == buci.url_ids[0] # Check that html data is not present assert next_annotation.html_info.description == "" @@ -476,7 +476,7 @@ async def test_annotate_agency_single_unknown_auto_suggestion(api_test_helper): assert response.next_annotation next_annotation = response.next_annotation # Check that url_id matches the one we inserted - assert next_annotation.url_id == buci.url_ids[0] + assert next_annotation.url_info.url_id == buci.url_ids[0] # Check that html data is present assert next_annotation.html_info.description != "" @@ -532,7 +532,7 @@ async def test_annotate_agency_other_user_annotation(api_test_helper): assert response.next_annotation next_annotation = response.next_annotation # Check that url_id matches the one we inserted - assert next_annotation.url_id == url_ids[0] + assert next_annotation.url_info.url_id == url_ids[0] # Check that html data is present assert next_annotation.html_info.description != "" @@ -645,7 +645,7 @@ async def test_annotate_all(api_test_helper): batch_id=setup_info_2.batch_id ) - assert get_response_1.next_annotation.url_id != get_response_2.next_annotation.url_id + assert get_response_1.next_annotation.url_info.url_id != get_response_2.next_annotation.url_info.url_id # Annotate the first and submit agency_id = await ath.db_data_creator.agency() @@ -663,7 +663,7 @@ async def test_annotate_all(api_test_helper): assert post_response_1.next_annotation is not None # Confirm the second is received - assert post_response_1.next_annotation.url_id == url_mapping_2.url_id + assert post_response_1.next_annotation.url_info.url_id == url_mapping_2.url_id # Upon submitting the second, confirm that no more URLs are returned through either POST or GET post_response_2 = await ath.request_validator.post_all_annotations_and_get_next( @@ -729,7 +729,7 @@ async def test_annotate_all_post_batch_filtering(api_test_helper): ) ) - assert post_response_1.next_annotation.url_id == url_mapping_3.url_id + assert post_response_1.next_annotation.url_info.url_id == url_mapping_3.url_id @pytest.mark.asyncio diff --git a/tests/automated/integration/collector_db/test_db_client.py b/tests/automated/integration/collector_db/test_db_client.py index 7196af9f..47fa5598 100644 --- a/tests/automated/integration/collector_db/test_db_client.py +++ b/tests/automated/integration/collector_db/test_db_client.py @@ -485,9 +485,14 @@ async def test_get_next_url_for_annotation_batch_filtering( ) setup_info_2 = await setup_for_get_next_url_for_annotation( db_data_creator=db_data_creator, - url_count=1 + url_count=3 ) + def assert_batch_info(batch_info): + assert batch_info.total_urls == 3 + assert batch_info.count_annotated == 0 + assert batch_info.count_not_annotated == 3 + url_1 = setup_info_1.insert_urls_info.url_mappings[0] url_2 = setup_info_2.insert_urls_info.url_mappings[0] @@ -499,7 +504,7 @@ async def test_get_next_url_for_annotation_batch_filtering( ) assert result_with_batch_id.url_info.url == url_2.url - + assert_batch_info(result_with_batch_id.batch_info) # If no batch id is provided, return first valid URL result_no_batch_id = await db_data_creator.adb_client.get_next_url_for_relevance_annotation( user_id=1, @@ -516,6 +521,7 @@ async def test_get_next_url_for_annotation_batch_filtering( ) assert result_with_batch_id.url_info.url == url_2.url + assert_batch_info(result_with_batch_id.batch_info) # If no batch id is provided, return first valid URL result_no_batch_id = await db_data_creator.adb_client.get_next_url_for_record_type_annotation( @@ -539,7 +545,8 @@ async def test_get_next_url_for_annotation_batch_filtering( batch_id=setup_info_2.batch_id ) - assert result_with_batch_id.next_annotation.url == url_2.url + assert result_with_batch_id.next_annotation.url_info.url == url_2.url + assert_batch_info(result_with_batch_id.next_annotation.batch_info) # If no batch id is provided, return first valid URL result_no_batch_id = await db_data_creator.adb_client.get_next_url_agency_for_annotation( @@ -547,7 +554,24 @@ async def test_get_next_url_for_annotation_batch_filtering( batch_id=None ) - assert result_no_batch_id.next_annotation.url == url_1.url + assert result_no_batch_id.next_annotation.url_info.url == url_1.url + + + # All annotations + result_with_batch_id = await db_data_creator.adb_client.get_next_url_for_all_annotations( + batch_id=setup_info_2.batch_id + ) + + assert result_with_batch_id.next_annotation.url_info.url == url_2.url + assert_batch_info(result_with_batch_id.next_annotation.batch_info) + + # If no batch id is provided, return first valid URL + result_no_batch_id = await db_data_creator.adb_client.get_next_url_for_all_annotations( + batch_id=None + ) + + assert result_no_batch_id.next_annotation.url_info.url == url_1.url + @pytest.mark.asyncio @@ -630,14 +654,14 @@ async def test_annotate_url_marked_not_relevant(db_data_creator: DBDataCreator): user_id=1, batch_id=None ) - assert agency_annotation_info_user_1.next_annotation.url_id != url_to_mark_not_relevant.url_id + assert agency_annotation_info_user_1.next_annotation.url_info.url_id != url_to_mark_not_relevant.url_id # Other users also should not receive the URL for agency annotation agency_annotation_info_user_2 = await adb_client.get_next_url_agency_for_annotation( user_id=2, batch_id=None ) - assert agency_annotation_info_user_1.next_annotation.url_id != url_to_mark_not_relevant.url_id + assert agency_annotation_info_user_1.next_annotation.url_info.url_id != url_to_mark_not_relevant.url_id @pytest.mark.asyncio async def test_annotate_url_agency_agency_not_in_db(db_data_creator: DBDataCreator): From 47b0412687a2c1b7cfe697ae3070799a3e0b4192 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 3 Jun 2025 08:12:40 -0400 Subject: [PATCH 203/244] Add batch progress info for annotations --- src/api/endpoints/batch/dtos/get/status.py | 7 -- src/api/endpoints/batch/dtos/get/summaries.py | 28 ++++++ src/api/endpoints/batch/routes.py | 4 +- src/core/core.py | 8 +- src/db/client/async_.py | 52 +++------- src/db/constants.py | 4 +- src/db/queries/README.md | 1 + src/db/queries/__init__.py | 0 src/db/queries/base/__init__.py | 0 src/db/queries/base/builder.py | 41 ++++++++ src/db/queries/base/labels.py | 8 ++ src/db/queries/helpers.py | 8 ++ src/db/queries/implementations/__init__.py | 0 .../queries/implementations/core/__init__.py | 0 .../get_recent_batch_summaries/__init__.py | 0 .../get_recent_batch_summaries/builder.py | 75 ++++++++++++++ .../url_counts/__init__.py | 0 .../url_counts/builder.py | 98 +++++++++++++++++++ .../url_counts/labels.py | 16 +++ src/db/queries/protocols.py | 9 ++ src/db/statement_composer.py | 53 +++++----- src/db/types.py | 7 +- .../api/helpers/RequestValidator.py | 6 +- tests/automated/integration/api/test_batch.py | 97 +++++++++++++++++- .../integration/api/test_example_collector.py | 6 +- tests/helpers/api_test_helper.py | 4 +- 26 files changed, 441 insertions(+), 91 deletions(-) delete mode 100644 src/api/endpoints/batch/dtos/get/status.py create mode 100644 src/api/endpoints/batch/dtos/get/summaries.py create mode 100644 src/db/queries/README.md create mode 100644 src/db/queries/__init__.py create mode 100644 src/db/queries/base/__init__.py create mode 100644 src/db/queries/base/builder.py create mode 100644 src/db/queries/base/labels.py create mode 100644 src/db/queries/helpers.py create mode 100644 src/db/queries/implementations/__init__.py create mode 100644 src/db/queries/implementations/core/__init__.py create mode 100644 src/db/queries/implementations/core/get_recent_batch_summaries/__init__.py create mode 100644 src/db/queries/implementations/core/get_recent_batch_summaries/builder.py create mode 100644 src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/__init__.py create mode 100644 src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/builder.py create mode 100644 src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/labels.py create mode 100644 src/db/queries/protocols.py diff --git a/src/api/endpoints/batch/dtos/get/status.py b/src/api/endpoints/batch/dtos/get/status.py deleted file mode 100644 index a591b88e..00000000 --- a/src/api/endpoints/batch/dtos/get/status.py +++ /dev/null @@ -1,7 +0,0 @@ -from pydantic import BaseModel - -from src.db.dtos.batch_info import BatchInfo - - -class GetBatchStatusResponse(BaseModel): - results: list[BatchInfo] \ No newline at end of file diff --git a/src/api/endpoints/batch/dtos/get/summaries.py b/src/api/endpoints/batch/dtos/get/summaries.py new file mode 100644 index 00000000..d4b64a2a --- /dev/null +++ b/src/api/endpoints/batch/dtos/get/summaries.py @@ -0,0 +1,28 @@ +import datetime +from typing import Optional + +from pydantic import BaseModel + +from src.core.enums import BatchStatus + + +class BatchSummaryURLCounts(BaseModel): + total: int + pending: int + duplicate: int + not_relevant: int + submitted: int + errored: int + +class BatchSummary(BaseModel): + id: int + strategy: str + status: BatchStatus + parameters: dict + user_id: int + compute_time: Optional[float] + date_generated: datetime.datetime + url_counts: BatchSummaryURLCounts + +class GetBatchSummariesResponse(BaseModel): + results: list[BatchSummary] \ No newline at end of file diff --git a/src/api/endpoints/batch/routes.py b/src/api/endpoints/batch/routes.py index e79f7f14..c80b5eb6 100644 --- a/src/api/endpoints/batch/routes.py +++ b/src/api/endpoints/batch/routes.py @@ -6,7 +6,7 @@ from src.api.dependencies import get_async_core from src.api.endpoints.batch.dtos.get.duplicates import GetDuplicatesByBatchResponse from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse -from src.api.endpoints.batch.dtos.get.status import GetBatchStatusResponse +from src.api.endpoints.batch.dtos.get.summaries import GetBatchSummariesResponse from src.api.endpoints.batch.dtos.get.urls import GetURLsByBatchResponse from src.api.endpoints.batch.dtos.post.abort import MessageResponse from src.db.dtos.batch_info import BatchInfo @@ -43,7 +43,7 @@ async def get_batch_status( ), core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), -) -> GetBatchStatusResponse: +) -> GetBatchSummariesResponse: """ Get the status of recent batches """ diff --git a/src/core/core.py b/src/core/core.py index f6151a85..34b182d5 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -11,7 +11,7 @@ from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseOuterInfo from src.api.endpoints.batch.dtos.get.duplicates import GetDuplicatesByBatchResponse from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse -from src.api.endpoints.batch.dtos.get.status import GetBatchStatusResponse +from src.api.endpoints.batch.dtos.get.summaries import GetBatchSummariesResponse from src.api.endpoints.batch.dtos.get.urls import GetURLsByBatchResponse from src.api.endpoints.batch.dtos.post.abort import MessageResponse from src.api.endpoints.collector.dtos.collector_start import CollectorStartInfo @@ -86,14 +86,14 @@ async def get_batch_statuses( status: Optional[BatchStatus], has_pending_urls: Optional[bool], page: int - ) -> GetBatchStatusResponse: - results = await self.adb_client.get_recent_batch_status_info( + ) -> GetBatchSummariesResponse: + results = await self.adb_client.get_batch_summaries( collector_type=collector_type, status=status, page=page, has_pending_urls=has_pending_urls ) - return GetBatchStatusResponse(results=results) + return results async def get_batch_logs(self, batch_id: int) -> GetBatchLogsResponse: logs = await self.adb_client.get_logs_by_batch_id(batch_id) diff --git a/src/db/client/async_.py b/src/db/client/async_.py index 05b394e7..02a77a6e 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -20,6 +20,7 @@ from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseInfo from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseInfo from src.api.endpoints.annotate.dtos.shared.batch import AnnotationBatchInfo +from src.api.endpoints.batch.dtos.get.summaries import GetBatchSummariesResponse from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO from src.api.endpoints.collector.dtos.manual_batch.response import ManualBatchResponseDTO from src.api.endpoints.metrics.dtos.get.backlog import GetMetricsBacklogResponseDTO, GetMetricsBacklogResponseInnerDTO @@ -52,8 +53,9 @@ from src.db.dtos.url_html_content_info import URLHTMLContentInfo, HTMLContentType from src.db.dtos.url_info import URLInfo from src.db.dtos.url_mapping import URLMapping +from src.db.queries.implementations.core.get_recent_batch_summaries.builder import GetRecentBatchSummariesQueryBuilder from src.db.statement_composer import StatementComposer -from src.db.constants import PLACEHOLDER_AGENCY_NAME +from src.db.constants import PLACEHOLDER_AGENCY_NAME, STANDARD_ROW_LIMIT from src.db.enums import TaskType from src.db.models.templates import Base from src.db.models.core import URL, URLErrorInfo, URLHTMLContent, \ @@ -1618,52 +1620,22 @@ async def get_duplicates_by_batch_id(self, session, batch_id: int, page: int) -> return final_results @session_manager - async def get_recent_batch_status_info( + async def get_batch_summaries( self, session, page: int, collector_type: Optional[CollectorType] = None, status: Optional[BatchStatus] = None, has_pending_urls: Optional[bool] = None - ) -> List[BatchInfo]: + ) -> GetBatchSummariesResponse: # Get only the batch_id, collector_type, status, and created_at - limit = 100 - query = Select(Batch) - if has_pending_urls is not None: - pending_url_subquery = Select(URL).where( - and_( - URL.batch_id == Batch.id, - URL.outcome == URLStatus.PENDING.value - ) - ) - - if has_pending_urls: - # Query for all that have pending URLs - query = query.where(exists( - pending_url_subquery - )) - else: - # Query for all that DO NOT have pending URLs - # (or that have no URLs at all) - query = query.where( - not_( - exists( - pending_url_subquery - ) - ) - ) - if collector_type: - query = query.filter(Batch.strategy == collector_type.value) - if status: - query = query.filter(Batch.status == status.value) - - query = (query. - order_by(Batch.date_generated.desc()). - limit(limit). - offset((page - 1) * limit)) - raw_results = await session.execute(query) - batches = raw_results.scalars().all() - return [BatchInfo(**batch.__dict__) for batch in batches] + builder = GetRecentBatchSummariesQueryBuilder( + page=page, + collector_type=collector_type, + status=status, + has_pending_urls=has_pending_urls + ) + return await builder.run(session) @session_manager async def get_logs_by_batch_id(self, session, batch_id: int) -> List[LogOutputInfo]: diff --git a/src/db/constants.py b/src/db/constants.py index 294c8fd9..1f39857d 100644 --- a/src/db/constants.py +++ b/src/db/constants.py @@ -1,3 +1,5 @@ -PLACEHOLDER_AGENCY_NAME = "PLACEHOLDER_AGENCY_NAME" \ No newline at end of file +PLACEHOLDER_AGENCY_NAME = "PLACEHOLDER_AGENCY_NAME" + +STANDARD_ROW_LIMIT = 100 \ No newline at end of file diff --git a/src/db/queries/README.md b/src/db/queries/README.md new file mode 100644 index 00000000..7918b0ba --- /dev/null +++ b/src/db/queries/README.md @@ -0,0 +1 @@ +This directory contains classes for building more complex queries. \ No newline at end of file diff --git a/src/db/queries/__init__.py b/src/db/queries/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/queries/base/__init__.py b/src/db/queries/base/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/queries/base/builder.py b/src/db/queries/base/builder.py new file mode 100644 index 00000000..5806ef47 --- /dev/null +++ b/src/db/queries/base/builder.py @@ -0,0 +1,41 @@ +from typing import Any, Generic, Optional + +from sqlalchemy import FromClause, ColumnClause +from sqlalchemy.dialects import postgresql +from sqlalchemy.ext.asyncio import AsyncSession + +from src.db.types import LabelsType + + +class QueryBuilderBase(Generic[LabelsType]): + + def __init__(self, labels: Optional[LabelsType] = None): + self.query: Optional[FromClause] = None + self.labels = labels + + def get(self, key: str) -> ColumnClause: + return getattr(self.query.c, key) + + def get_all(self) -> list[Any]: + results = [] + for label in self.labels.get_all_labels(): + results.append(self.get(label)) + return results + + def __getitem__(self, key: str) -> ColumnClause: + return self.get(key) + + async def build(self) -> Any: + raise NotImplementedError + + async def run(self, session: AsyncSession) -> Any: + raise NotImplementedError + + @staticmethod + def compile(query) -> Any: + return query.compile( + dialect=postgresql.dialect(), + compile_kwargs={ + "literal_binds": True + } + ) diff --git a/src/db/queries/base/labels.py b/src/db/queries/base/labels.py new file mode 100644 index 00000000..50f812ce --- /dev/null +++ b/src/db/queries/base/labels.py @@ -0,0 +1,8 @@ +from dataclasses import dataclass, fields + + +@dataclass(frozen=True) +class LabelsBase: + + def get_all_labels(self) -> list[str]: + return [getattr(self, f.name) for f in fields(self)] \ No newline at end of file diff --git a/src/db/queries/helpers.py b/src/db/queries/helpers.py new file mode 100644 index 00000000..c37984cb --- /dev/null +++ b/src/db/queries/helpers.py @@ -0,0 +1,8 @@ +from sqlalchemy.dialects import postgresql + +from src.db.constants import STANDARD_ROW_LIMIT + + +def add_page_offset(statement, page, limit=STANDARD_ROW_LIMIT): + offset = (page - 1) * limit + return statement.limit(limit).offset(offset) diff --git a/src/db/queries/implementations/__init__.py b/src/db/queries/implementations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/queries/implementations/core/__init__.py b/src/db/queries/implementations/core/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/queries/implementations/core/get_recent_batch_summaries/__init__.py b/src/db/queries/implementations/core/get_recent_batch_summaries/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/queries/implementations/core/get_recent_batch_summaries/builder.py b/src/db/queries/implementations/core/get_recent_batch_summaries/builder.py new file mode 100644 index 00000000..45a495c4 --- /dev/null +++ b/src/db/queries/implementations/core/get_recent_batch_summaries/builder.py @@ -0,0 +1,75 @@ +from typing import Optional + +from sqlalchemy import Select +from sqlalchemy.ext.asyncio import AsyncSession + +from src.api.endpoints.batch.dtos.get.summaries import GetBatchSummariesResponse, BatchSummary, BatchSummaryURLCounts +from src.collectors.enums import CollectorType +from src.core.enums import BatchStatus +from src.db.models.core import Batch +from src.db.queries.base.builder import QueryBuilderBase +from src.db.queries.implementations.core.get_recent_batch_summaries.url_counts.builder import URLCountsCTEQueryBuilder +from src.db.queries.implementations.core.get_recent_batch_summaries.url_counts.labels import URLCountsLabels + + +class GetRecentBatchSummariesQueryBuilder(QueryBuilderBase): + + def __init__( + self, + page: int = 1, + has_pending_urls: Optional[bool] = None, + collector_type: Optional[CollectorType] = None, + status: Optional[BatchStatus] = None, + ): + super().__init__() + self.url_counts_cte = URLCountsCTEQueryBuilder( + page=page, + has_pending_urls=has_pending_urls, + collector_type=collector_type, + status=status, + ) + + async def run(self, session: AsyncSession) -> GetBatchSummariesResponse: + self.url_counts_cte.build() + builder = self.url_counts_cte + count_labels: URLCountsLabels = builder.labels + + query = Select( + *builder.get_all(), + Batch.strategy, + Batch.status, + Batch.parameters, + Batch.user_id, + Batch.compute_time, + Batch.date_generated, + ).join( + builder.query, + builder.get(count_labels.batch_id) == Batch.id, + ) + raw_results = await session.execute(query) + + summaries: list[BatchSummary] = [] + for row in raw_results.mappings().all(): + summaries.append( + BatchSummary( + id=row.id, + strategy=row.strategy, + status=row.status, + parameters=row.parameters, + user_id=row.user_id, + compute_time=row.compute_time, + date_generated=row.date_generated, + url_counts=BatchSummaryURLCounts( + total=row[count_labels.total], + duplicate=row[count_labels.duplicate], + not_relevant=row[count_labels.not_relevant], + submitted=row[count_labels.submitted], + errored=row[count_labels.error], + pending=row[count_labels.pending], + ), + ) + ) + + return GetBatchSummariesResponse( + results=summaries, + ) diff --git a/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/__init__.py b/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/builder.py b/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/builder.py new file mode 100644 index 00000000..ed102253 --- /dev/null +++ b/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/builder.py @@ -0,0 +1,98 @@ +from typing import Optional + +from sqlalchemy import Select, case, Label, and_, exists +from sqlalchemy.sql.functions import count, coalesce + +from src.collectors.enums import URLStatus, CollectorType +from src.core.enums import BatchStatus +from src.db.models.core import Batch, URL +from src.db.queries.base.builder import QueryBuilderBase +from src.db.queries.helpers import add_page_offset +from src.db.queries.implementations.core.get_recent_batch_summaries.url_counts.labels import URLCountsLabels + + +class URLCountsCTEQueryBuilder(QueryBuilderBase): + + def __init__( + self, + page: int = 1, + has_pending_urls: Optional[bool] = None, + collector_type: Optional[CollectorType] = None, + status: Optional[BatchStatus] = None, + ): + super().__init__(URLCountsLabels()) + self.page = page + self.has_pending_urls = has_pending_urls + self.collector_type = collector_type + self.status = status + + + def get_core_query(self): + labels: URLCountsLabels = self.labels + return ( + Select( + Batch.id.label(labels.batch_id), + coalesce(count(URL.id), 0).label(labels.total), + self.count_case_url_status(URLStatus.PENDING, labels.pending), + self.count_case_url_status(URLStatus.SUBMITTED, labels.submitted), + self.count_case_url_status(URLStatus.NOT_RELEVANT, labels.not_relevant), + self.count_case_url_status(URLStatus.ERROR, labels.error), + self.count_case_url_status(URLStatus.DUPLICATE, labels.duplicate), + ).outerjoin( + URL + ) + ) + + + def build(self): + query = self.get_core_query() + query = self.apply_pending_urls_filter(query) + query = self.apply_collector_type_filter(query) + query = self.apply_status_filter(query) + query = query.group_by(Batch.id) + query = add_page_offset(query, page=self.page) + query = query.order_by(Batch.id) + self.query = query.cte("url_counts") + + + def apply_pending_urls_filter(self, query: Select): + if self.has_pending_urls is None: + return query + pending_url_subquery = ( + exists( + Select(URL).where( + and_( + URL.batch_id == Batch.id, + URL.outcome == URLStatus.PENDING.value + ) + ) + ) + ).correlate(Batch) + if self.has_pending_urls: + return query.where(pending_url_subquery) + return query.where(~pending_url_subquery) + + def apply_collector_type_filter(self, query: Select): + if self.collector_type is None: + return query + return query.where(Batch.strategy == self.collector_type.value) + + def apply_status_filter(self, query: Select): + if self.status is None: + return query + return query.where(Batch.status == self.status.value) + + @staticmethod + def count_case_url_status( + url_status: URLStatus, + label: str + ) -> Label: + return ( + coalesce( + count( + case( + (URL.outcome == url_status.value, 1) + ) + ) + , 0).label(label) + ) diff --git a/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/labels.py b/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/labels.py new file mode 100644 index 00000000..c55d8f45 --- /dev/null +++ b/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/labels.py @@ -0,0 +1,16 @@ +from dataclasses import dataclass + +from src.db.queries.base.labels import LabelsBase + + +@dataclass(frozen=True) +class URLCountsLabels(LabelsBase): + batch_id: str = "id" + total: str = "count_total" + pending: str = "count_pending" + submitted: str = "count_submitted" + not_relevant: str = "count_not_relevant" + error: str = "count_error" + duplicate: str = "count_duplicate" + + diff --git a/src/db/queries/protocols.py b/src/db/queries/protocols.py new file mode 100644 index 00000000..0098e953 --- /dev/null +++ b/src/db/queries/protocols.py @@ -0,0 +1,9 @@ +from typing import Protocol, Optional + +from sqlalchemy import Select + + +class HasQuery(Protocol): + + def __init__(self): + self.query: Optional[Select] = None diff --git a/src/db/statement_composer.py b/src/db/statement_composer.py index cd313b59..670bc7a6 100644 --- a/src/db/statement_composer.py +++ b/src/db/statement_composer.py @@ -4,10 +4,11 @@ from sqlalchemy.orm import aliased from src.collectors.enums import URLStatus +from src.core.enums import BatchStatus +from src.db.constants import STANDARD_ROW_LIMIT from src.db.enums import TaskType from src.db.models.core import URL, URLHTMLContent, AutomatedUrlAgencySuggestion, URLOptionalDataSourceMetadata, Batch, \ - ConfirmedURLAgency, LinkTaskURL, Task, UserUrlAgencySuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion -from src.core.enums import BatchStatus + ConfirmedURLAgency, LinkTaskURL, Task from src.db.types import UserSuggestionType @@ -18,13 +19,14 @@ class StatementComposer: @staticmethod def pending_urls_without_html_data() -> Select: - exclude_subquery = (select(1). - select_from(LinkTaskURL). - join(Task, LinkTaskURL.task_id == Task.id). - where(LinkTaskURL.url_id == URL.id). - where(Task.task_type == TaskType.HTML.value). - where(Task.task_status == BatchStatus.READY_TO_LABEL.value) - ) + exclude_subquery = ( + select(1). + select_from(LinkTaskURL). + join(Task, LinkTaskURL.task_id == Task.id). + where(LinkTaskURL.url_id == URL.id). + where(Task.task_type == TaskType.HTML.value). + where(Task.task_status == BatchStatus.READY_TO_LABEL.value) + ) query = ( select(URL). outerjoin(URLHTMLContent). @@ -32,15 +34,12 @@ def pending_urls_without_html_data() -> Select: where(~exists(exclude_subquery)). where(URL.outcome == URLStatus.PENDING.value) ) - - return query - @staticmethod def exclude_urls_with_extant_model( - statement: Select, - model: Any + statement: Select, + model: Any ): return (statement.where( ~exists( @@ -51,9 +50,6 @@ def exclude_urls_with_extant_model( ) )) - - - @staticmethod def simple_count_subquery(model, attribute: str, label: str) -> Subquery: attr_value = getattr(model, attribute) @@ -79,7 +75,6 @@ def exclude_urls_with_agency_suggestions( ) return statement - @staticmethod def pending_urls_missing_miscellaneous_metadata_query() -> Select: query = select(URL).where( @@ -109,19 +104,13 @@ def user_suggestion_exists( ) return subquery - @staticmethod def user_suggestion_not_exists( - model_to_exclude: UserUrlAgencySuggestion or - UserRecordTypeSuggestion or - UserRelevantSuggestion + model_to_exclude: UserSuggestionType ) -> ColumnElement[bool]: - # - subquery = not_( - StatementComposer.user_suggestion_exists(model_to_exclude) - ) - + StatementComposer.user_suggestion_exists(model_to_exclude) + ) return subquery @staticmethod @@ -131,3 +120,13 @@ def count_distinct(field, label): @staticmethod def sum_distinct(field, label): return func.sum(func.distinct(field)).label(label) + + @staticmethod + def add_limit_and_page_offset(query: Select, page: int): + zero_offset_page = page - 1 + rows_offset = zero_offset_page * STANDARD_ROW_LIMIT + return query.offset( + rows_offset + ).limit( + STANDARD_ROW_LIMIT + ) diff --git a/src/db/types.py b/src/db/types.py index 40dc9ef3..44350e6d 100644 --- a/src/db/types.py +++ b/src/db/types.py @@ -1,3 +1,8 @@ +from typing import TypeVar + from src.db.models.core import UserUrlAgencySuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion +from src.db.queries.base.labels import LabelsBase + +UserSuggestionType = UserUrlAgencySuggestion | UserRelevantSuggestion | UserRecordTypeSuggestion -UserSuggestionType = UserUrlAgencySuggestion | UserRelevantSuggestion | UserRecordTypeSuggestion \ No newline at end of file +LabelsType = TypeVar("LabelsType", bound=LabelsBase) \ No newline at end of file diff --git a/tests/automated/integration/api/helpers/RequestValidator.py b/tests/automated/integration/api/helpers/RequestValidator.py index 1e94f144..cbc6b03b 100644 --- a/tests/automated/integration/api/helpers/RequestValidator.py +++ b/tests/automated/integration/api/helpers/RequestValidator.py @@ -15,7 +15,7 @@ from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseOuterInfo from src.api.endpoints.batch.dtos.get.duplicates import GetDuplicatesByBatchResponse from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse -from src.api.endpoints.batch.dtos.get.status import GetBatchStatusResponse +from src.api.endpoints.batch.dtos.get.summaries import GetBatchSummariesResponse from src.api.endpoints.batch.dtos.get.urls import GetURLsByBatchResponse from src.api.endpoints.batch.dtos.post.abort import MessageResponse from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO @@ -194,7 +194,7 @@ def get_batch_statuses( collector_type: Optional[CollectorType] = None, status: Optional[BatchStatus] = None, has_pending_urls: Optional[bool] = None - ) -> GetBatchStatusResponse: + ) -> GetBatchSummariesResponse: params = {} update_if_not_none( target=params, @@ -208,7 +208,7 @@ def get_batch_statuses( url=f"/batch", params=params ) - return GetBatchStatusResponse(**data) + return GetBatchSummariesResponse(**data) def example_collector(self, dto: ExampleInputDTO) -> dict: data = self.post( diff --git a/tests/automated/integration/api/test_batch.py b/tests/automated/integration/api/test_batch.py index d4900736..2f654b55 100644 --- a/tests/automated/integration/api/test_batch.py +++ b/tests/automated/integration/api/test_batch.py @@ -5,9 +5,104 @@ from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO from src.collectors.enums import CollectorType, URLStatus from src.core.enums import BatchStatus +from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters + + +@pytest.mark.asyncio +async def test_get_batch_summaries(api_test_helper): + ath = api_test_helper + + batch_params = [ + TestBatchCreationParameters( + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.PENDING + ), + TestURLCreationParameters( + count=2, + status=URLStatus.SUBMITTED + ) + ] + ), + TestBatchCreationParameters( + urls=[ + TestURLCreationParameters( + count=4, + status=URLStatus.NOT_RELEVANT + ), + TestURLCreationParameters( + count=3, + status=URLStatus.ERROR + ) + ] + ), + TestBatchCreationParameters( + urls=[ + TestURLCreationParameters( + count=7, + status=URLStatus.DUPLICATE + ), + TestURLCreationParameters( + count=1, + status=URLStatus.SUBMITTED + ) + ] + ) + ] + + batch_1_creation_info = await ath.db_data_creator.batch_v2(batch_params[0]) + batch_2_creation_info = await ath.db_data_creator.batch_v2(batch_params[1]) + batch_3_creation_info = await ath.db_data_creator.batch_v2(batch_params[2]) + + batch_1_id = batch_1_creation_info.batch_id + batch_2_id = batch_2_creation_info.batch_id + batch_3_id = batch_3_creation_info.batch_id + + + response = ath.request_validator.get_batch_statuses() + results = response.results + + assert len(results) == 3 + + result_1 = results[0] + assert result_1.id == batch_1_id + assert result_1.status == BatchStatus.READY_TO_LABEL + counts_1 = result_1.url_counts + assert counts_1.total == 3 + assert counts_1.pending == 1 + assert counts_1.submitted == 2 + assert counts_1.not_relevant == 0 + assert counts_1.duplicate == 0 + assert counts_1.errored == 0 + + result_2 = results[1] + assert result_2.id == batch_2_id + counts_2 = result_2.url_counts + assert counts_2.total == 7 + assert counts_2.not_relevant == 4 + assert counts_2.errored == 3 + assert counts_2.pending == 0 + assert counts_2.submitted == 0 + assert counts_2.duplicate == 0 + + result_3 = results[2] + assert result_3.id == batch_3_id + counts_3 = result_3.url_counts + assert counts_3.total == 8 + assert counts_3.not_relevant == 0 + assert counts_3.errored == 0 + assert counts_3.pending == 0 + assert counts_3.submitted == 1 + assert counts_3.duplicate == 7 + + + + + @pytest.mark.asyncio -async def test_get_batch_status_pending_url_filter(api_test_helper): +async def test_get_batch_summaries_pending_url_filter(api_test_helper): ath = api_test_helper # Add an errored out batch diff --git a/tests/automated/integration/api/test_example_collector.py b/tests/automated/integration/api/test_example_collector.py index 3f7f40fa..f5f66efa 100644 --- a/tests/automated/integration/api/test_example_collector.py +++ b/tests/automated/integration/api/test_example_collector.py @@ -4,7 +4,7 @@ import pytest from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse -from src.api.endpoints.batch.dtos.get.status import GetBatchStatusResponse +from src.api.endpoints.batch.dtos.get.summaries import GetBatchSummariesResponse from src.db.client.async_ import AsyncDatabaseClient from src.db.dtos.batch_info import BatchInfo from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO @@ -47,7 +47,7 @@ async def test_example_collector(api_test_helper, monkeypatch): # Check that batch currently shows as In Process - bsr: GetBatchStatusResponse = ath.request_validator.get_batch_statuses( + bsr: GetBatchSummariesResponse = ath.request_validator.get_batch_statuses( status=BatchStatus.IN_PROCESS ) assert len(bsr.results) == 1 @@ -62,7 +62,7 @@ async def test_example_collector(api_test_helper, monkeypatch): await ath.wait_for_all_batches_to_complete() - csr: GetBatchStatusResponse = ath.request_validator.get_batch_statuses( + csr: GetBatchSummariesResponse = ath.request_validator.get_batch_statuses( collector_type=CollectorType.EXAMPLE, status=BatchStatus.READY_TO_LABEL ) diff --git a/tests/helpers/api_test_helper.py b/tests/helpers/api_test_helper.py index fa577b34..53ce0cd7 100644 --- a/tests/helpers/api_test_helper.py +++ b/tests/helpers/api_test_helper.py @@ -1,7 +1,7 @@ import asyncio from dataclasses import dataclass -from src.api.endpoints.batch.dtos.get.status import GetBatchStatusResponse +from src.api.endpoints.batch.dtos.get.summaries import GetBatchSummariesResponse from src.core.core import AsyncCore from src.core.enums import BatchStatus from tests.automated.integration.api.helpers.RequestValidator import RequestValidator @@ -19,7 +19,7 @@ def adb_client(self): async def wait_for_all_batches_to_complete(self): for i in range(20): - data: GetBatchStatusResponse = self.request_validator.get_batch_statuses( + data: GetBatchSummariesResponse = self.request_validator.get_batch_statuses( status=BatchStatus.IN_PROCESS ) if len(data.results) == 0: From cb58e5c1588c3bd38283c85bbf9c6629a7932ba4 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 3 Jun 2025 08:59:04 -0400 Subject: [PATCH 204/244] Update `/batch/{id}` endpoint and associated logic/tests --- ...1380f90f5de_remove_unused_batch_columns.py | 43 +++++++++++++++++++ .../batch/dtos/get/summaries/__init__.py | 0 .../batch/dtos/get/summaries/counts.py | 10 +++++ .../batch/dtos/get/summaries/response.py | 7 +++ .../{summaries.py => summaries/summary.py} | 12 +----- src/api/endpoints/batch/routes.py | 11 +++-- src/core/core.py | 18 +++++--- src/db/client/async_.py | 36 +++++++++------- src/db/client/sync.py | 13 +++--- src/db/dtos/batch_info.py | 9 +--- src/db/models/core.py | 5 --- .../get_recent_batch_summaries/builder.py | 11 ++--- .../url_counts/builder.py | 7 +++ .../api/helpers/RequestValidator.py | 7 +-- .../integration/api/test_duplicates.py | 13 +++--- .../integration/api/test_example_collector.py | 11 ++--- .../collector_db/test_db_client.py | 2 +- tests/helpers/api_test_helper.py | 2 +- tests/helpers/db_data_creator.py | 1 - 19 files changed, 137 insertions(+), 81 deletions(-) create mode 100644 alembic/versions/2025_06_03_0814-c1380f90f5de_remove_unused_batch_columns.py create mode 100644 src/api/endpoints/batch/dtos/get/summaries/__init__.py create mode 100644 src/api/endpoints/batch/dtos/get/summaries/counts.py create mode 100644 src/api/endpoints/batch/dtos/get/summaries/response.py rename src/api/endpoints/batch/dtos/get/{summaries.py => summaries/summary.py} (60%) diff --git a/alembic/versions/2025_06_03_0814-c1380f90f5de_remove_unused_batch_columns.py b/alembic/versions/2025_06_03_0814-c1380f90f5de_remove_unused_batch_columns.py new file mode 100644 index 00000000..f88d4b4c --- /dev/null +++ b/alembic/versions/2025_06_03_0814-c1380f90f5de_remove_unused_batch_columns.py @@ -0,0 +1,43 @@ +"""Remove unused batch columns + +Revision ID: c1380f90f5de +Revises: 00cc949e0347 +Create Date: 2025-06-03 08:14:15.583777 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'c1380f90f5de' +down_revision: Union[str, None] = '00cc949e0347' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +TABLE_NAME = "batches" +TOTAL_URL_COUNT_COLUMN = "total_url_count" +ORIGINAL_URL_COUNT_COLUMN = "original_url_count" +DUPLICATE_URL_COUNT_COLUMN = "duplicate_url_count" + +def upgrade() -> None: + for column in [ + TOTAL_URL_COUNT_COLUMN, + ORIGINAL_URL_COUNT_COLUMN, + DUPLICATE_URL_COUNT_COLUMN, + ]: + op.drop_column(TABLE_NAME, column) + + +def downgrade() -> None: + for column in [ + TOTAL_URL_COUNT_COLUMN, + ORIGINAL_URL_COUNT_COLUMN, + DUPLICATE_URL_COUNT_COLUMN, + ]: + op.add_column( + TABLE_NAME, + sa.Column(column, sa.Integer(), nullable=False, default=0), + ) diff --git a/src/api/endpoints/batch/dtos/get/summaries/__init__.py b/src/api/endpoints/batch/dtos/get/summaries/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/batch/dtos/get/summaries/counts.py b/src/api/endpoints/batch/dtos/get/summaries/counts.py new file mode 100644 index 00000000..0ce4e468 --- /dev/null +++ b/src/api/endpoints/batch/dtos/get/summaries/counts.py @@ -0,0 +1,10 @@ +from pydantic import BaseModel + + +class BatchSummaryURLCounts(BaseModel): + total: int + pending: int + duplicate: int + not_relevant: int + submitted: int + errored: int diff --git a/src/api/endpoints/batch/dtos/get/summaries/response.py b/src/api/endpoints/batch/dtos/get/summaries/response.py new file mode 100644 index 00000000..9dead212 --- /dev/null +++ b/src/api/endpoints/batch/dtos/get/summaries/response.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel + +from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary + + +class GetBatchSummariesResponse(BaseModel): + results: list[BatchSummary] diff --git a/src/api/endpoints/batch/dtos/get/summaries.py b/src/api/endpoints/batch/dtos/get/summaries/summary.py similarity index 60% rename from src/api/endpoints/batch/dtos/get/summaries.py rename to src/api/endpoints/batch/dtos/get/summaries/summary.py index d4b64a2a..f00a42a5 100644 --- a/src/api/endpoints/batch/dtos/get/summaries.py +++ b/src/api/endpoints/batch/dtos/get/summaries/summary.py @@ -3,17 +3,10 @@ from pydantic import BaseModel +from src.api.endpoints.batch.dtos.get.summaries.counts import BatchSummaryURLCounts from src.core.enums import BatchStatus -class BatchSummaryURLCounts(BaseModel): - total: int - pending: int - duplicate: int - not_relevant: int - submitted: int - errored: int - class BatchSummary(BaseModel): id: int strategy: str @@ -23,6 +16,3 @@ class BatchSummary(BaseModel): compute_time: Optional[float] date_generated: datetime.datetime url_counts: BatchSummaryURLCounts - -class GetBatchSummariesResponse(BaseModel): - results: list[BatchSummary] \ No newline at end of file diff --git a/src/api/endpoints/batch/routes.py b/src/api/endpoints/batch/routes.py index c80b5eb6..bd3282fc 100644 --- a/src/api/endpoints/batch/routes.py +++ b/src/api/endpoints/batch/routes.py @@ -6,15 +6,15 @@ from src.api.dependencies import get_async_core from src.api.endpoints.batch.dtos.get.duplicates import GetDuplicatesByBatchResponse from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse -from src.api.endpoints.batch.dtos.get.summaries import GetBatchSummariesResponse +from src.api.endpoints.batch.dtos.get.summaries.response import GetBatchSummariesResponse +from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary from src.api.endpoints.batch.dtos.get.urls import GetURLsByBatchResponse from src.api.endpoints.batch.dtos.post.abort import MessageResponse -from src.db.dtos.batch_info import BatchInfo from src.collectors.enums import CollectorType from src.core.core import AsyncCore from src.core.enums import BatchStatus -from src.security.manager import get_access_info from src.security.dtos.access_info import AccessInfo +from src.security.manager import get_access_info batch_router = APIRouter( prefix="/batch", @@ -60,9 +60,8 @@ async def get_batch_info( batch_id: int = Path(description="The batch id"), core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(get_access_info), -) -> BatchInfo: - result = await core.get_batch_info(batch_id) - return result +) -> BatchSummary: + return await core.get_batch_info(batch_id) @batch_router.get("/{batch_id}/urls") async def get_urls_by_batch( diff --git a/src/core/core.py b/src/core/core.py index 34b182d5..a37af7e3 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -1,5 +1,7 @@ +from http import HTTPStatus from typing import Optional +from fastapi import HTTPException from pydantic import BaseModel from sqlalchemy.exc import IntegrityError @@ -11,7 +13,8 @@ from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseOuterInfo from src.api.endpoints.batch.dtos.get.duplicates import GetDuplicatesByBatchResponse from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse -from src.api.endpoints.batch.dtos.get.summaries import GetBatchSummariesResponse +from src.api.endpoints.batch.dtos.get.summaries.response import GetBatchSummariesResponse +from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary from src.api.endpoints.batch.dtos.get.urls import GetURLsByBatchResponse from src.api.endpoints.batch.dtos.post.abort import MessageResponse from src.api.endpoints.collector.dtos.collector_start import CollectorStartInfo @@ -62,8 +65,14 @@ async def shutdown(self): await self.collector_manager.shutdown_all_collectors() #region Batch - async def get_batch_info(self, batch_id: int) -> BatchInfo: - return await self.adb_client.get_batch_by_id(batch_id) + async def get_batch_info(self, batch_id: int) -> BatchSummary: + result = await self.adb_client.get_batch_by_id(batch_id) + if result is None: + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST, + detail=f"Batch {batch_id} does not exist" + ) + return result async def get_urls_by_batch(self, batch_id: int, page: int = 1) -> GetURLsByBatchResponse: url_infos = await self.adb_client.get_urls_by_batch(batch_id, page) @@ -77,9 +86,6 @@ async def get_duplicate_urls_by_batch(self, batch_id: int, page: int = 1) -> Get dup_infos = await self.adb_client.get_duplicates_by_batch_id(batch_id, page=page) return GetDuplicatesByBatchResponse(duplicates=dup_infos) - async def get_batch_status(self, batch_id: int) -> BatchInfo: - return await self.adb_client.get_batch_by_id(batch_id) - async def get_batch_statuses( self, collector_type: Optional[CollectorType], diff --git a/src/db/client/async_.py b/src/db/client/async_.py index 02a77a6e..1ab930c9 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -20,7 +20,8 @@ from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseInfo from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseInfo from src.api.endpoints.annotate.dtos.shared.batch import AnnotationBatchInfo -from src.api.endpoints.batch.dtos.get.summaries import GetBatchSummariesResponse +from src.api.endpoints.batch.dtos.get.summaries.response import GetBatchSummariesResponse +from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO from src.api.endpoints.collector.dtos.manual_batch.response import ManualBatchResponseDTO from src.api.endpoints.metrics.dtos.get.backlog import GetMetricsBacklogResponseDTO, GetMetricsBacklogResponseInnerDTO @@ -1365,12 +1366,17 @@ async def reject_url( session.add(rejecting_user_url) @session_manager - async def get_batch_by_id(self, session, batch_id: int) -> Optional[BatchInfo]: + async def get_batch_by_id(self, session, batch_id: int) -> Optional[BatchSummary]: """Retrieve a batch by ID.""" - query = Select(Batch).where(Batch.id == batch_id) - result = await session.execute(query) - batch = result.scalars().first() - return BatchInfo(**batch.__dict__) + builder = GetRecentBatchSummariesQueryBuilder( + batch_id=batch_id + ) + summaries = await builder.run(session) + if len(summaries) == 0: + return None + batch_summary = summaries[0] + return batch_summary + @session_manager async def get_urls_by_batch(self, session, batch_id: int, page: int = 1) -> List[URLInfo]: @@ -1434,15 +1440,12 @@ async def insert_batch(self, session: AsyncSession, batch_info: BatchInfo) -> in user_id=batch_info.user_id, status=batch_info.status.value, parameters=batch_info.parameters, - total_url_count=batch_info.total_url_count, - original_url_count=batch_info.original_url_count, - duplicate_url_count=batch_info.duplicate_url_count, compute_time=batch_info.compute_time, - strategy_success_rate=batch_info.strategy_success_rate, - metadata_success_rate=batch_info.metadata_success_rate, - agency_match_rate=batch_info.agency_match_rate, - record_type_match_rate=batch_info.record_type_match_rate, - record_category_match_rate=batch_info.record_category_match_rate, + strategy_success_rate=0, + metadata_success_rate=0, + agency_match_rate=0, + record_type_match_rate=0, + record_category_match_rate=0, ) if batch_info.date_generated is not None: batch.date_generated = batch_info.date_generated @@ -1635,7 +1638,10 @@ async def get_batch_summaries( status=status, has_pending_urls=has_pending_urls ) - return await builder.run(session) + summaries = await builder.run(session) + return GetBatchSummariesResponse( + results=summaries + ) @session_manager async def get_logs_by_batch_id(self, session, batch_id: int) -> List[LogOutputInfo]: diff --git a/src/db/client/sync.py b/src/db/client/sync.py index 67d432fc..8957ac92 100644 --- a/src/db/client/sync.py +++ b/src/db/client/sync.py @@ -61,15 +61,12 @@ def insert_batch(self, session, batch_info: BatchInfo) -> int: user_id=batch_info.user_id, status=batch_info.status.value, parameters=batch_info.parameters, - total_url_count=batch_info.total_url_count, - original_url_count=batch_info.original_url_count, - duplicate_url_count=batch_info.duplicate_url_count, compute_time=batch_info.compute_time, - strategy_success_rate=batch_info.strategy_success_rate, - metadata_success_rate=batch_info.metadata_success_rate, - agency_match_rate=batch_info.agency_match_rate, - record_type_match_rate=batch_info.record_type_match_rate, - record_category_match_rate=batch_info.record_category_match_rate, + strategy_success_rate=0, + metadata_success_rate=0, + agency_match_rate=0, + record_type_match_rate=0, + record_category_match_rate=0, ) if batch_info.date_generated is not None: batch.date_generated = batch_info.date_generated diff --git a/src/db/dtos/batch_info.py b/src/db/dtos/batch_info.py index db5505bc..3e1d265b 100644 --- a/src/db/dtos/batch_info.py +++ b/src/db/dtos/batch_info.py @@ -12,13 +12,6 @@ class BatchInfo(BaseModel): status: BatchStatus parameters: dict user_id: int - total_url_count: int = 0 - original_url_count: int = 0 - duplicate_url_count: int = 0 - strategy_success_rate: Optional[float] = None - metadata_success_rate: Optional[float] = None - agency_match_rate: Optional[float] = None - record_type_match_rate: Optional[float] = None - record_category_match_rate: Optional[float] = None + total_url_count: Optional[int] = None compute_time: Optional[float] = None date_generated: Optional[datetime] = None diff --git a/src/db/models/core.py b/src/db/models/core.py index 54c9b091..fe64b8df 100644 --- a/src/db/models/core.py +++ b/src/db/models/core.py @@ -43,11 +43,6 @@ class Batch(StandardModel): batch_status_enum, nullable=False ) - # The number of URLs in the batch - # TODO: Add means to update after execution - total_url_count = Column(Integer, nullable=False, default=0) - original_url_count = Column(Integer, nullable=False, default=0) - duplicate_url_count = Column(Integer, nullable=False, default=0) date_generated = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) # How often URLs ended up approved in the database strategy_success_rate = Column(Float) diff --git a/src/db/queries/implementations/core/get_recent_batch_summaries/builder.py b/src/db/queries/implementations/core/get_recent_batch_summaries/builder.py index 45a495c4..c9958d6f 100644 --- a/src/db/queries/implementations/core/get_recent_batch_summaries/builder.py +++ b/src/db/queries/implementations/core/get_recent_batch_summaries/builder.py @@ -3,7 +3,8 @@ from sqlalchemy import Select from sqlalchemy.ext.asyncio import AsyncSession -from src.api.endpoints.batch.dtos.get.summaries import GetBatchSummariesResponse, BatchSummary, BatchSummaryURLCounts +from src.api.endpoints.batch.dtos.get.summaries.counts import BatchSummaryURLCounts +from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary from src.collectors.enums import CollectorType from src.core.enums import BatchStatus from src.db.models.core import Batch @@ -20,6 +21,7 @@ def __init__( has_pending_urls: Optional[bool] = None, collector_type: Optional[CollectorType] = None, status: Optional[BatchStatus] = None, + batch_id: Optional[int] = None, ): super().__init__() self.url_counts_cte = URLCountsCTEQueryBuilder( @@ -27,9 +29,10 @@ def __init__( has_pending_urls=has_pending_urls, collector_type=collector_type, status=status, + batch_id=batch_id, ) - async def run(self, session: AsyncSession) -> GetBatchSummariesResponse: + async def run(self, session: AsyncSession) -> list[BatchSummary]: self.url_counts_cte.build() builder = self.url_counts_cte count_labels: URLCountsLabels = builder.labels @@ -70,6 +73,4 @@ async def run(self, session: AsyncSession) -> GetBatchSummariesResponse: ) ) - return GetBatchSummariesResponse( - results=summaries, - ) + return summaries diff --git a/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/builder.py b/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/builder.py index ed102253..bd6c382a 100644 --- a/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/builder.py +++ b/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/builder.py @@ -19,12 +19,14 @@ def __init__( has_pending_urls: Optional[bool] = None, collector_type: Optional[CollectorType] = None, status: Optional[BatchStatus] = None, + batch_id: Optional[int] = None ): super().__init__(URLCountsLabels()) self.page = page self.has_pending_urls = has_pending_urls self.collector_type = collector_type self.status = status + self.batch_id = batch_id def get_core_query(self): @@ -49,11 +51,16 @@ def build(self): query = self.apply_pending_urls_filter(query) query = self.apply_collector_type_filter(query) query = self.apply_status_filter(query) + query = self.apply_batch_id_filter(query) query = query.group_by(Batch.id) query = add_page_offset(query, page=self.page) query = query.order_by(Batch.id) self.query = query.cte("url_counts") + def apply_batch_id_filter(self, query: Select): + if self.batch_id is None: + return query + return query.where(Batch.id == self.batch_id) def apply_pending_urls_filter(self, query: Select): if self.has_pending_urls is None: diff --git a/tests/automated/integration/api/helpers/RequestValidator.py b/tests/automated/integration/api/helpers/RequestValidator.py index cbc6b03b..ac9d43f6 100644 --- a/tests/automated/integration/api/helpers/RequestValidator.py +++ b/tests/automated/integration/api/helpers/RequestValidator.py @@ -15,7 +15,8 @@ from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseOuterInfo from src.api.endpoints.batch.dtos.get.duplicates import GetDuplicatesByBatchResponse from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse -from src.api.endpoints.batch.dtos.get.summaries import GetBatchSummariesResponse +from src.api.endpoints.batch.dtos.get.summaries.response import GetBatchSummariesResponse +from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary from src.api.endpoints.batch.dtos.get.urls import GetURLsByBatchResponse from src.api.endpoints.batch.dtos.post.abort import MessageResponse from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO @@ -217,11 +218,11 @@ def example_collector(self, dto: ExampleInputDTO) -> dict: ) return data - def get_batch_info(self, batch_id: int) -> BatchInfo: + def get_batch_info(self, batch_id: int) -> BatchSummary: data = self.get( url=f"/batch/{batch_id}" ) - return BatchInfo(**data) + return BatchSummary(**data) def get_batch_urls(self, batch_id: int, page: int = 1) -> GetURLsByBatchResponse: data = self.get( diff --git a/tests/automated/integration/api/test_duplicates.py b/tests/automated/integration/api/test_duplicates.py index e1b45be9..49c1e15d 100644 --- a/tests/automated/integration/api/test_duplicates.py +++ b/tests/automated/integration/api/test_duplicates.py @@ -1,5 +1,6 @@ import pytest +from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary from src.db.dtos.batch_info import BatchInfo from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO from tests.automated.integration.api.conftest import disable_task_trigger @@ -31,13 +32,13 @@ async def test_duplicates(api_test_helper): await ath.wait_for_all_batches_to_complete() - bi_1: BatchInfo = ath.request_validator.get_batch_info(batch_id_1) - bi_2: BatchInfo = ath.request_validator.get_batch_info(batch_id_2) + bi_1: BatchSummary = ath.request_validator.get_batch_info(batch_id_1) + bi_2: BatchSummary = ath.request_validator.get_batch_info(batch_id_2) - bi_1.total_url_count = 2 - bi_2.total_url_count = 0 - bi_1.duplicate_url_count = 0 - bi_2.duplicate_url_count = 2 + bi_1.url_counts.total = 2 + bi_2.url_counts.total = 0 + bi_1.url_counts.duplicate = 0 + bi_2.url_counts.duplicate = 2 url_info_1 = ath.request_validator.get_batch_urls(batch_id_1) url_info_2 = ath.request_validator.get_batch_urls(batch_id_2) diff --git a/tests/automated/integration/api/test_example_collector.py b/tests/automated/integration/api/test_example_collector.py index f5f66efa..a1c5694f 100644 --- a/tests/automated/integration/api/test_example_collector.py +++ b/tests/automated/integration/api/test_example_collector.py @@ -4,7 +4,8 @@ import pytest from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse -from src.api.endpoints.batch.dtos.get.summaries import GetBatchSummariesResponse +from src.api.endpoints.batch.dtos.get.summaries.response import GetBatchSummariesResponse +from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary from src.db.client.async_ import AsyncDatabaseClient from src.db.dtos.batch_info import BatchInfo from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO @@ -68,15 +69,15 @@ async def test_example_collector(api_test_helper, monkeypatch): ) assert len(csr.results) == 1 - bsi: BatchInfo = csr.results[0] + bsi: BatchSummary = csr.results[0] assert bsi.id == batch_id assert bsi.strategy == CollectorType.EXAMPLE.value assert bsi.status == BatchStatus.READY_TO_LABEL - bi: BatchInfo = ath.request_validator.get_batch_info(batch_id=batch_id) + bi: BatchSummary = ath.request_validator.get_batch_info(batch_id=batch_id) assert bi.status == BatchStatus.READY_TO_LABEL - assert bi.total_url_count == 2 + assert bi.url_counts.total == 2 assert bi.parameters == dto.model_dump() assert bi.strategy == CollectorType.EXAMPLE.value assert bi.user_id is not None @@ -124,7 +125,7 @@ async def test_example_collector_error(api_test_helper, monkeypatch): await ath.wait_for_all_batches_to_complete() - bi: BatchInfo = ath.request_validator.get_batch_info(batch_id=batch_id) + bi: BatchSummary = ath.request_validator.get_batch_info(batch_id=batch_id) assert bi.status == BatchStatus.ERROR diff --git a/tests/automated/integration/collector_db/test_db_client.py b/tests/automated/integration/collector_db/test_db_client.py index 47fa5598..2269b98d 100644 --- a/tests/automated/integration/collector_db/test_db_client.py +++ b/tests/automated/integration/collector_db/test_db_client.py @@ -30,7 +30,7 @@ async def test_insert_urls( parameters={}, user_id=1 ) - batch_id = db_client_test.insert_batch(batch_info) + batch_id = await adb_client_test.insert_batch(batch_info) urls = [ URLInfo( diff --git a/tests/helpers/api_test_helper.py b/tests/helpers/api_test_helper.py index 53ce0cd7..d5de78cd 100644 --- a/tests/helpers/api_test_helper.py +++ b/tests/helpers/api_test_helper.py @@ -1,7 +1,7 @@ import asyncio from dataclasses import dataclass -from src.api.endpoints.batch.dtos.get.summaries import GetBatchSummariesResponse +from src.api.endpoints.batch.dtos.get.summaries.response import GetBatchSummariesResponse from src.core.core import AsyncCore from src.core.enums import BatchStatus from tests.automated.integration.api.helpers.RequestValidator import RequestValidator diff --git a/tests/helpers/db_data_creator.py b/tests/helpers/db_data_creator.py index c96946ee..08f1220b 100644 --- a/tests/helpers/db_data_creator.py +++ b/tests/helpers/db_data_creator.py @@ -60,7 +60,6 @@ def batch( BatchInfo( strategy=strategy.value, status=batch_status, - total_url_count=1, parameters={"test_key": "test_value"}, user_id=1, date_generated=created_at From 1051178ac3b3ef845d43b5a51d3b6e2ab6e38f47 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 3 Jun 2025 20:15:37 -0400 Subject: [PATCH 205/244] Temporarily disabled duplicate task --- src/core/tasks/manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/tasks/manager.py b/src/core/tasks/manager.py index 215a7989..af18bd1f 100644 --- a/src/core/tasks/manager.py +++ b/src/core/tasks/manager.py @@ -103,7 +103,7 @@ async def get_url_404_probe_task_operator(self): async def get_task_operators(self) -> list[TaskOperatorBase]: return [ await self.get_url_html_task_operator(), - await self.get_url_duplicate_task_operator(), + # await self.get_url_duplicate_task_operator(), await self.get_url_404_probe_task_operator(), await self.get_url_record_type_task_operator(), await self.get_agency_identification_task_operator(), From aba8518ee2110362dd6b6eaf1bdf57a91848a1a1 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 4 Jun 2025 19:49:29 -0400 Subject: [PATCH 206/244] Refactor get_next_url_for_final_review query --- src/db/client/async_.py | 507 +++++++----------- .../core/get_next_url_for_final_review.py | 220 ++++++++ 2 files changed, 401 insertions(+), 326 deletions(-) create mode 100644 src/db/queries/implementations/core/get_next_url_for_final_review.py diff --git a/src/db/client/async_.py b/src/db/client/async_.py index 1ab930c9..36750151 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -54,6 +54,7 @@ from src.db.dtos.url_html_content_info import URLHTMLContentInfo, HTMLContentType from src.db.dtos.url_info import URLInfo from src.db.dtos.url_mapping import URLMapping +from src.db.queries.implementations.core.get_next_url_for_final_review import GetNextURLForFinalReviewQueryBuilder from src.db.queries.implementations.core.get_recent_batch_summaries.builder import GetRecentBatchSummariesQueryBuilder from src.db.statement_composer import StatementComposer from src.db.constants import PLACEHOLDER_AGENCY_NAME, STANDARD_ROW_LIMIT @@ -123,10 +124,10 @@ async def wrapper(self, *args, **kwargs): # region relevant @session_manager async def add_auto_relevant_suggestion( - self, - session: AsyncSession, - url_id: int, - relevant: bool + self, + session: AsyncSession, + url_id: int, + relevant: bool ): suggestion = AutoRelevantSuggestion( url_id=url_id, @@ -136,10 +137,10 @@ async def add_auto_relevant_suggestion( @staticmethod async def get_user_suggestion( - session: AsyncSession, - model: UserSuggestionModel, - user_id: int, - url_id: int + session: AsyncSession, + model: UserSuggestionModel, + user_id: int, + url_id: int ) -> Optional[UserSuggestionModel]: statement = Select(model).where( and_( @@ -152,11 +153,11 @@ async def get_user_suggestion( @staticmethod async def get_next_url_for_user_annotation( - session: AsyncSession, - user_suggestion_model_to_exclude: UserSuggestionModel, - auto_suggestion_relationship: QueryableAttribute, - batch_id: Optional[int], - check_if_annotated_not_relevant: bool = False + session: AsyncSession, + user_suggestion_model_to_exclude: UserSuggestionModel, + auto_suggestion_relationship: QueryableAttribute, + batch_id: Optional[int], + check_if_annotated_not_relevant: bool = False ) -> URL: url_query = ( select( @@ -186,9 +187,9 @@ async def get_next_url_for_user_annotation( url_query = url_query.where(URL.batch_id == batch_id) url_query = url_query.options( - joinedload(auto_suggestion_relationship), - joinedload(URL.html_content) - ).limit(1) + joinedload(auto_suggestion_relationship), + joinedload(URL.html_content) + ).limit(1) raw_result = await session.execute(url_query) @@ -206,11 +207,11 @@ async def get_batch_status( @session_manager async def add_user_relevant_suggestion( - self, - session: AsyncSession, - url_id: int, - user_id: int, - suggested_status: SuggestedStatus + self, + session: AsyncSession, + url_id: int, + user_id: int, + suggested_status: SuggestedStatus ): prior_suggestion = await self.get_user_suggestion( session, @@ -231,10 +232,10 @@ async def add_user_relevant_suggestion( @session_manager async def get_next_url_for_relevance_annotation( - self, - session: AsyncSession, - user_id: int, - batch_id: Optional[int] + self, + session: AsyncSession, + user_id: int, + batch_id: Optional[int] ) -> Optional[GetNextRelevanceAnnotationResponseInfo]: url = await self.get_next_url_for_user_annotation( @@ -272,16 +273,16 @@ async def get_next_url_for_relevance_annotation( ) ) - #endregion relevant + # endregion relevant - #region record_type + # region record_type @session_manager async def get_next_url_for_record_type_annotation( - self, - session: AsyncSession, - user_id: int, - batch_id: Optional[int] + self, + session: AsyncSession, + user_id: int, + batch_id: Optional[int] ) -> Optional[GetNextRecordTypeAnnotationResponseInfo]: url = await self.get_next_url_for_user_annotation( @@ -320,12 +321,11 @@ async def get_next_url_for_record_type_annotation( ) ) - @session_manager async def add_auto_record_type_suggestions( - self, - session: AsyncSession, - url_and_record_type_list: list[tuple[int, RecordType]] + self, + session: AsyncSession, + url_and_record_type_list: list[tuple[int, RecordType]] ): for url_id, record_type in url_and_record_type_list: suggestion = AutoRecordTypeSuggestion( @@ -336,10 +336,10 @@ async def add_auto_record_type_suggestions( @session_manager async def add_auto_record_type_suggestion( - self, - session: AsyncSession, - url_id: int, - record_type: RecordType + self, + session: AsyncSession, + url_id: int, + record_type: RecordType ): suggestion = AutoRecordTypeSuggestion( @@ -350,9 +350,9 @@ async def add_auto_record_type_suggestion( @session_manager async def add_auto_relevance_suggestions( - self, - session: AsyncSession, - url_and_relevance_type_list: list[tuple[int, bool]] + self, + session: AsyncSession, + url_and_relevance_type_list: list[tuple[int, bool]] ): for url_id, relevant in url_and_relevance_type_list: suggestion = AutoRelevantSuggestion( @@ -363,11 +363,11 @@ async def add_auto_relevance_suggestions( @session_manager async def add_user_record_type_suggestion( - self, - session: AsyncSession, - url_id: int, - user_id: int, - record_type: RecordType + self, + session: AsyncSession, + url_id: int, + user_id: int, + record_type: RecordType ): prior_suggestion = await self.get_user_suggestion( session, @@ -386,7 +386,7 @@ async def add_user_record_type_suggestion( ) session.add(suggestion) - #endregion record_type + # endregion record_type @session_manager async def add_url_error_infos(self, session: AsyncSession, url_error_infos: list[URLErrorPydanticInfo]): @@ -409,12 +409,14 @@ async def get_urls_with_errors(self, session: AsyncSession) -> list[URLErrorPyda results = scalar_result.all() final_results = [] for url, error, updated_at, task_id in results: - final_results.append(URLErrorPydanticInfo( - url_id=url.id, - error=error, - updated_at=updated_at, - task_id=task_id - )) + final_results.append( + URLErrorPydanticInfo( + url_id=url.id, + error=error, + updated_at=updated_at, + task_id=task_id + ) + ) return final_results @@ -439,8 +441,8 @@ async def has_pending_urls_missing_miscellaneous_metadata(self, session: AsyncSe @session_manager async def get_pending_urls_missing_miscellaneous_metadata( - self, - session: AsyncSession + self, + session: AsyncSession ) -> list[URLMiscellaneousMetadataTDO]: query = StatementComposer.pending_urls_missing_miscellaneous_metadata_query() query = ( @@ -497,8 +499,6 @@ async def add_miscellaneous_metadata(self, session: AsyncSession, tdos: list[URL ) session.add(metadata_object) - - @session_manager async def get_pending_urls_without_html_data(self, session: AsyncSession) -> list[URLInfo]: # TODO: Add test that includes some urls WITH html data. Check they're not returned @@ -508,11 +508,10 @@ async def get_pending_urls_without_html_data(self, session: AsyncSession) -> lis results: list[URL] = scalar_result.all() return DTOConverter.url_list_to_url_info_list(results) - async def get_urls_with_html_data_and_without_models( - self, - session: AsyncSession, - model: Type[Base] + self, + session: AsyncSession, + model: Type[Base] ): statement = (select(URL) .options(selectinload(URL.html_content)) @@ -530,8 +529,8 @@ async def get_urls_with_html_data_and_without_models( @session_manager async def get_urls_with_html_data_and_without_auto_record_type_suggestion( - self, - session: AsyncSession + self, + session: AsyncSession ): return await self.get_urls_with_html_data_and_without_models( session=session, @@ -540,8 +539,8 @@ async def get_urls_with_html_data_and_without_auto_record_type_suggestion( @session_manager async def get_urls_with_html_data_and_without_auto_relevant_suggestion( - self, - session: AsyncSession + self, + session: AsyncSession ): return await self.get_urls_with_html_data_and_without_models( session=session, @@ -549,9 +548,9 @@ async def get_urls_with_html_data_and_without_auto_relevant_suggestion( ) async def has_urls_with_html_data_and_without_models( - self, - session: AsyncSession, - model: Type[Base] + self, + session: AsyncSession, + model: Type[Base] ) -> bool: statement = (select(URL) .join(URLHTMLContent) @@ -565,7 +564,6 @@ async def has_urls_with_html_data_and_without_models( scalar_result = await session.scalars(statement) return bool(scalar_result.first()) - @session_manager async def has_urls_with_html_data_and_without_auto_record_type_suggestion(self, session: AsyncSession) -> bool: return await self.has_urls_with_html_data_and_without_models( @@ -580,7 +578,6 @@ async def has_urls_with_html_data_and_without_auto_relevant_suggestion(self, ses model=AutoRelevantSuggestion ) - @session_manager async def get_all(self, session, model: Base, order_by_attribute: Optional[str] = None) -> list[Base]: """ @@ -653,9 +650,9 @@ async def get_urls(self, session: AsyncSession, page: int, errors: bool) -> GetU @session_manager async def initiate_task( - self, - session: AsyncSession, - task_type: TaskType + self, + session: AsyncSession, + task_type: TaskType ) -> int: # Create Task task = Task( @@ -750,11 +747,11 @@ async def link_urls_to_task(self, session: AsyncSession, task_id: int, url_ids: @session_manager async def get_tasks( - self, - session: AsyncSession, - task_type: Optional[TaskType] = None, - task_status: Optional[BatchStatus] = None, - page: int = 1 + self, + session: AsyncSession, + task_type: Optional[TaskType] = None, + task_status: Optional[BatchStatus] = None, + page: int = 1 ) -> GetTasksResponse: url_count_subquery = self.statement_composer.simple_count_subquery( LinkTaskURL, @@ -805,8 +802,8 @@ async def get_tasks( @session_manager async def has_urls_without_agency_suggestions( - self, - session: AsyncSession + self, + session: AsyncSession ) -> bool: statement = ( select( @@ -851,10 +848,10 @@ async def get_urls_without_agency_suggestions(self, session: AsyncSession) -> li @session_manager async def get_next_url_agency_for_annotation( - self, - session: AsyncSession, - user_id: int, - batch_id: Optional[int] + self, + session: AsyncSession, + user_id: int, + batch_id: Optional[int] ) -> GetNextURLForAgencyAnnotationResponse: """ Retrieve URL for annotation @@ -953,9 +950,9 @@ async def get_next_url_agency_for_annotation( @session_manager async def upsert_new_agencies( - self, - session: AsyncSession, - suggestions: list[URLAgencySuggestionInfo] + self, + session: AsyncSession, + suggestions: list[URLAgencySuggestionInfo] ): """ Add or update agencies in the database @@ -972,9 +969,9 @@ async def upsert_new_agencies( @session_manager async def add_confirmed_agency_url_links( - self, - session: AsyncSession, - suggestions: list[URLAgencySuggestionInfo] + self, + session: AsyncSession, + suggestions: list[URLAgencySuggestionInfo] ): for suggestion in suggestions: confirmed_agency = ConfirmedURLAgency( @@ -985,9 +982,9 @@ async def add_confirmed_agency_url_links( @session_manager async def add_agency_auto_suggestions( - self, - session: AsyncSession, - suggestions: list[URLAgencySuggestionInfo] + self, + session: AsyncSession, + suggestions: list[URLAgencySuggestionInfo] ): for suggestion in suggestions: url_agency_suggestion = AutomatedUrlAgencySuggestion( @@ -1001,12 +998,12 @@ async def add_agency_auto_suggestions( @session_manager async def add_agency_manual_suggestion( - self, - session: AsyncSession, - agency_id: Optional[int], - url_id: int, - user_id: int, - is_new: bool + self, + session: AsyncSession, + agency_id: Optional[int], + url_id: int, + user_id: int, + is_new: bool ): if is_new and agency_id is not None: raise ValueError("agency_id must be None when is_new is True") @@ -1038,181 +1035,31 @@ async def get_urls_with_confirmed_agencies(self, session: AsyncSession) -> list[ @session_manager async def get_next_url_for_final_review( - self, - session: AsyncSession, - batch_id: Optional[int] + self, + session: AsyncSession, + batch_id: Optional[int] ) -> Optional[GetNextURLForFinalReviewResponse]: - - def annotations_exist_subquery(model: Type[Base]): - return ( - select( - URL.id.label("url_id"), - case( - ( - exists().where(URL.id == model.url_id), 1 - ), - else_=0 - ).label("exists") - ).subquery() - ) - - user_models = [ - UserRelevantSuggestion, - UserRecordTypeSuggestion, - UserUrlAgencySuggestion - ] - - models = [ - AutoRelevantSuggestion, - AutoRecordTypeSuggestion, - AutomatedUrlAgencySuggestion, - *user_models - ] - - # The below relationships are joined directly to the URL - single_join_relationships = [ - URL.html_content, - URL.auto_record_type_suggestion, - URL.auto_relevant_suggestion, - URL.user_relevant_suggestion, - URL.user_record_type_suggestion, - URL.optional_data_source_metadata, - ] - - # The below relationships are joined to entities that are joined to the URL - double_join_relationships = [ - (URL.automated_agency_suggestions, AutomatedUrlAgencySuggestion.agency), - (URL.user_agency_suggestion, UserUrlAgencySuggestion.agency), - (URL.confirmed_agencies, ConfirmedURLAgency.agency) - ] - - exist_subqueries = [ - annotations_exist_subquery(model=model) - for model in models - ] - user_exist_subqueries = [ - annotations_exist_subquery(model=model) - for model in user_models - ] - - sum_of_exist_subqueries = ( - sum( - [ - subquery.c.exists - for subquery in exist_subqueries] - ) - ) - - - # Basic URL query - url_query = ( - select( - URL, - ( - sum_of_exist_subqueries - ).label("total_distinct_annotation_count"), - ) - ) - - for subquery in exist_subqueries: - url_query = url_query.outerjoin( - subquery, URL.id == subquery.c.url_id - ) - - where_subqueries = [ - subquery.c.exists == 1 - for subquery in user_exist_subqueries - ] - - url_query = url_query.where( - and_( - URL.outcome == URLStatus.PENDING.value, - *where_subqueries - ) - ) - if batch_id is not None: - url_query = url_query.where( - URL.batch_id == batch_id - ) - - # Apply options - url_query = url_query.options( - *[joinedload(relationship) for relationship in single_join_relationships], - *[joinedload(primary).joinedload(secondary) for primary, secondary in double_join_relationships] - ) - - # Apply order clause - url_query = url_query.order_by( - desc("total_distinct_annotation_count"), - asc(URL.id) - ) - - # Apply limit - url_query = url_query.limit(1) - - # Execute query - raw_result = await session.execute(url_query) - - full_result = raw_result.unique().all() - - if len(full_result) == 0: - return None - result: URL = full_result[0][0] - - # Convert html content to response format - html_content = result.html_content - html_content_infos = [URLHTMLContentInfo(**html_info.__dict__) for html_info in html_content] - - if result.optional_data_source_metadata is None: - optional_metadata = FinalReviewOptionalMetadata() - else: - optional_metadata = FinalReviewOptionalMetadata( - record_formats=result.optional_data_source_metadata.record_formats, - data_portal_type=result.optional_data_source_metadata.data_portal_type, - supplying_entity=result.optional_data_source_metadata.supplying_entity - ) - - - # Return - return GetNextURLForFinalReviewResponse( - id=result.id, - url=result.url, - html_info=convert_to_response_html_info(html_content_infos), - name=result.name, - description=result.description, - annotations=FinalReviewAnnotationInfo( - relevant=DTOConverter.final_review_annotation_relevant_info( - user_suggestion=result.user_relevant_suggestion, - auto_suggestion=result.auto_relevant_suggestion - ), - record_type=DTOConverter.final_review_annotation_record_type_info( - user_suggestion=result.user_record_type_suggestion, - auto_suggestion=result.auto_record_type_suggestion - ), - agency=DTOConverter.final_review_annotation_agency_info( - automated_agency_suggestions=result.automated_agency_suggestions, - user_agency_suggestion=result.user_agency_suggestion, - confirmed_agencies=result.confirmed_agencies - ) - ), - optional_metadata=optional_metadata + builder = GetNextURLForFinalReviewQueryBuilder( + batch_id=batch_id ) + result = await builder.run(session) + return result @session_manager async def approve_url( - self, - session: AsyncSession, - approval_info: FinalReviewApprovalInfo, - user_id: int, + self, + session: AsyncSession, + approval_info: FinalReviewApprovalInfo, + user_id: int, ) -> None: # Get URL def update_if_not_none( - model, - field, - value: Optional[Any], - required: bool=False + model, + field, + value: Optional[Any], + required: bool = False ): if value is not None: setattr(model, field, value) @@ -1226,7 +1073,6 @@ def update_if_not_none( detail=f"Must specify {field} if it does not already exist" ) - query = ( Select(URL) .where(URL.id == approval_info.url_id) @@ -1274,7 +1120,7 @@ def update_if_not_none( existing_agency = await session.execute(query) existing_agency = existing_agency.scalars().first() if existing_agency is None: - # If not, create it + # If not, create it agency = Agency( agency_id=new_agency_id, name=PLACEHOLDER_AGENCY_NAME, @@ -1329,11 +1175,11 @@ def update_if_not_none( @session_manager async def reject_url( - self, - session: AsyncSession, - url_id: int, - user_id: int, - rejection_reason: RejectionReason + self, + session: AsyncSession, + url_id: int, + user_id: int, + rejection_reason: RejectionReason ) -> None: query = ( @@ -1377,7 +1223,6 @@ async def get_batch_by_id(self, session, batch_id: int) -> Optional[BatchSummary batch_summary = summaries[0] return batch_summary - @session_manager async def get_urls_by_batch(self, session, batch_id: int, page: int = 1) -> List[URLInfo]: """Retrieve all URLs associated with a batch.""" @@ -1453,7 +1298,6 @@ async def insert_batch(self, session: AsyncSession, batch_info: BatchInfo) -> in await session.flush() return batch.id - async def insert_urls(self, url_infos: List[URLInfo], batch_id: int) -> InsertURLsInfo: url_mappings = [] duplicates = [] @@ -1501,7 +1345,6 @@ async def update_batch_post_collection( batch.status = batch_status.value batch.compute_time = compute_time - @session_manager async def has_validated_urls(self, session: AsyncSession) -> bool: query = ( @@ -1514,8 +1357,8 @@ async def has_validated_urls(self, session: AsyncSession) -> bool: @session_manager async def get_validated_urls( - self, - session: AsyncSession + self, + session: AsyncSession ) -> list[SubmitApprovedURLTDO]: query = ( select(URL) @@ -1581,7 +1424,6 @@ async def mark_urls_as_submitted(self, session: AsyncSession, infos: list[Submit url_data_source_object.created_at = info.submitted_at session.add(url_data_source_object) - await session.execute(query) @session_manager @@ -1685,18 +1527,22 @@ async def get_agency_suggestions(self, session, url_id: int) -> List[GetNextURLF state = autosuggestion[3] county = autosuggestion[4] locality = autosuggestion[5] - agency_suggestions.append(GetNextURLForAgencyAgencyInfo( - suggestion_type=SuggestionType.AUTO_SUGGESTION if not is_unknown else SuggestionType.UNKNOWN, - pdap_agency_id=agency_id, - agency_name=name, - state=state, - county=county, - locality=locality - )) + agency_suggestions.append( + GetNextURLForAgencyAgencyInfo( + suggestion_type=SuggestionType.AUTO_SUGGESTION if not is_unknown else SuggestionType.UNKNOWN, + pdap_agency_id=agency_id, + agency_name=name, + state=state, + county=county, + locality=locality + ) + ) return agency_suggestions @session_manager - async def get_next_url_for_all_annotations(self, session, batch_id: Optional[int] = None) -> GetNextURLForAllAnnotationResponse: + async def get_next_url_for_all_annotations( + self, session, batch_id: Optional[int] = None + ) -> GetNextURLForAllAnnotationResponse: query = ( Select(URL) .where( @@ -1772,11 +1618,11 @@ async def get_next_url_for_all_annotations(self, session, batch_id: Optional[int @session_manager async def add_all_annotations_to_url( - self, - session, - user_id: int, - url_id: int, - post_info: AllAnnotationPostInfo + self, + session, + user_id: int, + url_id: int, + post_info: AllAnnotationPostInfo ): # Add relevant annotation @@ -1808,10 +1654,10 @@ async def add_all_annotations_to_url( @session_manager async def upload_manual_batch( - self, - session: AsyncSession, - user_id: int, - dto: ManualBatchInputDTO + self, + session: AsyncSession, + user_id: int, + dto: ManualBatchInputDTO ) -> ManualBatchResponseDTO: batch = Batch( strategy=CollectorType.MANUAL.value, @@ -1856,7 +1702,6 @@ async def upload_manual_batch( session.add(optional_metadata) url_ids.append(url.id) - return ManualBatchResponseDTO( batch_id=batch_id, urls=url_ids, @@ -1886,8 +1731,10 @@ async def get_batches_aggregated_metrics(self, session: AsyncSession) -> GetMetr def batch_column(status: BatchStatus, label): return sc.count_distinct( case( - (Batch.status == status.value, - Batch.id) + ( + Batch.status == status.value, + Batch.id + ) ), label=label ) @@ -1901,8 +1748,10 @@ def batch_column(status: BatchStatus, label): def url_column(status: URLStatus, label): return sc.count_distinct( case( - (URL.outcome == status.value, - URL.id) + ( + URL.outcome == status.value, + URL.id + ) ), label=label ) @@ -1922,7 +1771,7 @@ def url_column(status: URLStatus, label): Batch.strategy ).subquery("url_count") - # Combine + # Combine query = select( Batch.strategy, batch_count_subquery.c.done_count.label("batch_done_count"), @@ -1972,9 +1821,9 @@ def url_column(status: URLStatus, label): @session_manager async def get_batches_breakdown_metrics( - self, - session: AsyncSession, - page: int + self, + session: AsyncSession, + page: int ) -> GetMetricsBatchesBreakdownResponseDTO: sc = StatementComposer @@ -1988,8 +1837,10 @@ async def get_batches_breakdown_metrics( def url_column(status: URLStatus, label): return sc.count_distinct( case( - (URL.outcome == status.value, - URL.id) + ( + URL.outcome == status.value, + URL.id + ) ), label=label ) @@ -2106,8 +1957,10 @@ async def get_urls_aggregated_metrics( def case_column(status: URLStatus, label): return sc.count_distinct( case( - (URL.outcome == status.value, - URL.id) + ( + URL.outcome == status.value, + URL.id + ) ), label=label ) @@ -2150,20 +2003,19 @@ async def get_urls_breakdown_pending_metrics( URL.id.label("url_id"), case((UserRecordTypeSuggestion.url_id != None, literal(True)), else_=literal(False)).label( "has_user_record_type_annotation" - ), + ), case((UserRelevantSuggestion.url_id != None, literal(True)), else_=literal(False)).label( "has_user_relevant_annotation" - ), + ), case((UserUrlAgencySuggestion.url_id != None, literal(True)), else_=literal(False)).label( "has_user_agency_annotation" - ), + ), ) .outerjoin(UserRecordTypeSuggestion, URL.id == UserRecordTypeSuggestion.url_id) .outerjoin(UserRelevantSuggestion, URL.id == UserRelevantSuggestion.url_id) .outerjoin(UserUrlAgencySuggestion, URL.id == UserUrlAgencySuggestion.url_id) ).cte("flags") - month = func.date_trunc('month', URL.created_at) # Build the query @@ -2171,14 +2023,20 @@ async def get_urls_breakdown_pending_metrics( select( month.label('month'), func.count(URL.id).label('count_total'), - func.count(case( - (flags.c.has_user_record_type_annotation == True, 1)) + func.count( + case( + (flags.c.has_user_record_type_annotation == True, 1) + ) ).label('user_record_type_count'), - func.count(case( - (flags.c.has_user_relevant_annotation == True, 1)) + func.count( + case( + (flags.c.has_user_relevant_annotation == True, 1) + ) ).label('user_relevant_count'), - func.count(case( - (flags.c.has_user_agency_annotation == True, 1)) + func.count( + case( + (flags.c.has_user_agency_annotation == True, 1) + ) ).label('user_agency_count'), ) .outerjoin(flags, flags.c.url_id == URL.id) @@ -2253,7 +2111,6 @@ async def get_backlog_metrics( return GetMetricsBacklogResponseDTO(entries=final_results) - @session_manager async def populate_backlog_snapshot( self, @@ -2291,7 +2148,7 @@ async def has_pending_urls_not_checked_for_duplicates(self, session: AsyncSessio URL.outcome == URLStatus.PENDING.value, URLCheckedForDuplicate.id == None ).limit(1) - ) + ) raw_result = await session.execute(query) result = raw_result.one_or_none() @@ -2308,13 +2165,12 @@ async def get_pending_urls_not_checked_for_duplicates(self, session: AsyncSessio URL.outcome == URLStatus.PENDING.value, URLCheckedForDuplicate.id == None ).limit(100) - ) + ) raw_result = await session.execute(query) urls = raw_result.scalars().all() return [URLDuplicateTDO(url=url.url, url_id=url.id) for url in urls] - @session_manager async def mark_all_as_duplicates(self, session: AsyncSession, url_ids: List[int]): query = update(URL).where(URL.id.in_(url_ids)).values(outcome=URLStatus.DUPLICATE.value) @@ -2343,7 +2199,6 @@ async def mark_all_as_recently_probed_for_404( ) await session.execute(update_stmt) - @session_manager async def mark_as_checked_for_duplicates(self, session: AsyncSession, url_ids: list[int]): for url_id in url_ids: @@ -2416,7 +2271,7 @@ async def get_annotation_batch_info( common_where_clause = [ URL.outcome == URLStatus.PENDING.value, URL.batch_id == batch_id, - ] + ] annotated_query = ( select_url @@ -2448,4 +2303,4 @@ async def get_annotation_batch_info( count_annotated=annotated_result, count_not_annotated=not_annotated_result, total_urls=annotated_result + not_annotated_result - ) \ No newline at end of file + ) diff --git a/src/db/queries/implementations/core/get_next_url_for_final_review.py b/src/db/queries/implementations/core/get_next_url_for_final_review.py new file mode 100644 index 00000000..a96f3932 --- /dev/null +++ b/src/db/queries/implementations/core/get_next_url_for_final_review.py @@ -0,0 +1,220 @@ +from typing import Optional, Type + +from sqlalchemy import case, exists, select, func, Select, and_, desc, asc, FromClause +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import joinedload + +from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewResponse, FinalReviewOptionalMetadata, \ + FinalReviewAnnotationInfo +from src.collectors.enums import URLStatus +from src.core.tasks.operators.url_html.scraper.parser.util import convert_to_response_html_info +from src.db.dto_converter import DTOConverter +from src.db.dtos.url_html_content_info import URLHTMLContentInfo +from src.db.models.core import URL, UserRelevantSuggestion, UserRecordTypeSuggestion, UserUrlAgencySuggestion, \ + AutoRelevantSuggestion, AutoRecordTypeSuggestion, AutomatedUrlAgencySuggestion, ConfirmedURLAgency +from src.db.models.mixins import URLDependentMixin +from src.db.queries.base.builder import QueryBuilderBase + + +TOTAL_DISTINCT_ANNOTATION_COUNT_LABEL = "total_distinct_annotation_count" + +class GetNextURLForFinalReviewQueryBuilder(QueryBuilderBase): + + def __init__(self, batch_id: Optional[int] = None): + super().__init__() + self.batch_id = batch_id + self.user_models = [ + UserRelevantSuggestion, + UserRecordTypeSuggestion, + UserUrlAgencySuggestion + ] + self.models = [ + AutoRelevantSuggestion, + AutoRecordTypeSuggestion, + AutomatedUrlAgencySuggestion, + *self.user_models + ] + # The below relationships are joined directly to the URL + self.single_join_relationships = [ + URL.html_content, + URL.auto_record_type_suggestion, + URL.auto_relevant_suggestion, + URL.user_relevant_suggestion, + URL.user_record_type_suggestion, + URL.optional_data_source_metadata, + ] + # The below relationships are joined to entities that are joined to the URL + self.double_join_relationships = [ + (URL.automated_agency_suggestions, AutomatedUrlAgencySuggestion.agency), + (URL.user_agency_suggestion, UserUrlAgencySuggestion.agency), + (URL.confirmed_agencies, ConfirmedURLAgency.agency) + ] + + def get_exists_label(self, model: Type[URLDependentMixin]): + return f"{model.__name__}_exists" + + async def _annotation_exists_case( + self, + models: list[Type[URLDependentMixin]] + ): + cases = [] + for model in models: + cases.append( + case( + ( + func.bool_or(model.url_id != None), 1 + ), + else_=0 + ).label(self.get_exists_label(model)) + ) + return cases + + async def _outer_join_models(self, query: Select, list_of_models: list[Type[URLDependentMixin]]): + for model in list_of_models: + query = query.outerjoin(model) + return query + + def _get_where_exist_clauses( + self, + query: FromClause, + models: list[Type[URLDependentMixin]], + ): + where_clauses = [] + for model in models: + label = self.get_exists_label(model) + where_clause = getattr(query.c, label) == 1 + where_clauses.append(where_clause) + return where_clauses + + def _build_base_query(self, anno_exists_query: FromClause, ): + where_exist_clauses_v2 = self._get_where_exist_clauses(anno_exists_query, self.user_models) + + return ( + select( + URL, + self._sum_exists_query(anno_exists_query, self.models) + ) + .select_from(anno_exists_query) + .join( + URL, + URL.id == anno_exists_query.c.id + ) + .where( + and_( + URL.outcome == URLStatus.PENDING.value, + *where_exist_clauses_v2 + ) + ) + ) + + def _sum_exists_query(self, query, models: list[Type[URLDependentMixin]]): + return sum( + [getattr(query.c, self.get_exists_label(model)) for model in models] + ).label(TOTAL_DISTINCT_ANNOTATION_COUNT_LABEL) + + + async def _apply_batch_id_filter(self, url_query: Select, batch_id: Optional[int]): + if batch_id is None: + return url_query + return url_query.where(URL.batch_id == batch_id) + + async def _apply_options( + self, + url_query: Select + ): + return url_query.options( + *[ + joinedload(relationship) + for relationship in self.single_join_relationships + ], + *[ + joinedload(primary).joinedload(secondary) + for primary, secondary in self.double_join_relationships + ] + ) + + async def _apply_order_clause(self, url_query: Select): + return url_query.order_by( + desc(TOTAL_DISTINCT_ANNOTATION_COUNT_LABEL), + asc(URL.id) + ) + + async def _extract_html_content_infos(self, url: URL) -> list[URLHTMLContentInfo]: + html_content = url.html_content + html_content_infos = [ + URLHTMLContentInfo(**html_info.__dict__) + for html_info in html_content + ] + return html_content_infos + + async def _extract_optional_metadata(self, url: URL) -> FinalReviewOptionalMetadata: + if url.optional_data_source_metadata is None: + return FinalReviewOptionalMetadata() + return FinalReviewOptionalMetadata( + record_formats=url.optional_data_source_metadata.record_formats, + data_portal_type=url.optional_data_source_metadata.data_portal_type, + supplying_entity=url.optional_data_source_metadata.supplying_entity + ) + + async def run( + self, + session: AsyncSession + ) -> Optional[GetNextURLForFinalReviewResponse]: + + annotation_exists_cases_all = await self._annotation_exists_case(self.models) + anno_exists_query = select( + URL.id, + *annotation_exists_cases_all + ) + anno_exists_query = await self._outer_join_models(anno_exists_query, self.models) + anno_exists_query = anno_exists_query.where(URL.outcome == URLStatus.PENDING.value) + anno_exists_query = anno_exists_query.group_by(URL.id).cte("annotations_exist") + + url_query = self._build_base_query(anno_exists_query) + url_query = await self._apply_batch_id_filter(url_query, self.batch_id) + url_query = await self._apply_options(url_query) + url_query = await self._apply_order_clause(url_query) + url_query = url_query.limit(1) + + raw_result = await session.execute(url_query) + row = raw_result.unique().first() + + if row is None: + return None + + result: URL = row[0] + + html_content_infos = await self._extract_html_content_infos(result) + optional_metadata = await self._extract_optional_metadata(result) + + return GetNextURLForFinalReviewResponse( + id=result.id, + url=result.url, + html_info=convert_to_response_html_info(html_content_infos), + name=result.name, + description=result.description, + annotations=FinalReviewAnnotationInfo( + relevant=DTOConverter.final_review_annotation_relevant_info( + user_suggestion=result.user_relevant_suggestion, + auto_suggestion=result.auto_relevant_suggestion + ), + record_type=DTOConverter.final_review_annotation_record_type_info( + user_suggestion=result.user_record_type_suggestion, + auto_suggestion=result.auto_record_type_suggestion + ), + agency=DTOConverter.final_review_annotation_agency_info( + automated_agency_suggestions=result.automated_agency_suggestions, + user_agency_suggestion=result.user_agency_suggestion, + confirmed_agencies=result.confirmed_agencies + ) + ), + optional_metadata=optional_metadata + ) + + + + + + + + From 8910e099d3a07edd62a00804ab7021194d515c08 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 5 Jun 2025 09:40:15 -0400 Subject: [PATCH 207/244] Allow logs to persist for up to 7 days --- src/db/client/async_.py | 2 +- .../test_autogoogler_collector.py | 23 +++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/db/client/async_.py b/src/db/client/async_.py index 36750151..0296a307 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -1498,7 +1498,7 @@ async def delete_old_logs(self, session): Delete logs older than a day """ statement = delete(Log).where( - Log.created_at < datetime.now() - timedelta(days=1) + Log.created_at < datetime.now() - timedelta(days=7) ) await session.execute(statement) diff --git a/tests/manual/source_collectors/test_autogoogler_collector.py b/tests/manual/source_collectors/test_autogoogler_collector.py index ab926b10..c5ebda01 100644 --- a/tests/manual/source_collectors/test_autogoogler_collector.py +++ b/tests/manual/source_collectors/test_autogoogler_collector.py @@ -2,21 +2,36 @@ import pytest +from src.collectors.source_collectors.auto_googler.dtos.input import AutoGooglerInputDTO +from src.core.env_var_manager import EnvVarManager from src.core.logger import AsyncCoreLogger from src.collectors.source_collectors.auto_googler.collector import AutoGooglerCollector -from src.collectors.source_collectors.auto_googler import AutoGooglerInputDTO +from src.db.client.async_ import AsyncDatabaseClient +from environs import Env @pytest.mark.asyncio -async def test_autogoogler_collector(): +async def test_autogoogler_collector(monkeypatch): + env = Env() + env.read_env() + env_var_manager = EnvVarManager.get() + env_var_manager.google_api_key = env("GOOGLE_API_KEY") + env_var_manager.google_cse_id = env("GOOGLE_CSE_ID") + collector = AutoGooglerCollector( batch_id=1, dto=AutoGooglerInputDTO( urls_per_result=5, - queries=["police"], + queries=[ + "brooklyn new york city police data", + "queens new york city police data", + "staten island new york city police data", + "manhattan new york city police data", + "bronx new york city police data" + ], ), logger = AsyncMock(spec=AsyncCoreLogger), adb_client=AsyncMock(spec=AsyncDatabaseClient), raise_error=True ) - await collector.run() + await collector.run_to_completion() print(collector.data) \ No newline at end of file From 152f2c287b11953fa6885f55fa7024cc3fb0a0c9 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 5 Jun 2025 11:15:16 -0400 Subject: [PATCH 208/244] Re-enable URL Duplicate Task --- src/core/tasks/manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/tasks/manager.py b/src/core/tasks/manager.py index af18bd1f..215a7989 100644 --- a/src/core/tasks/manager.py +++ b/src/core/tasks/manager.py @@ -103,7 +103,7 @@ async def get_url_404_probe_task_operator(self): async def get_task_operators(self) -> list[TaskOperatorBase]: return [ await self.get_url_html_task_operator(), - # await self.get_url_duplicate_task_operator(), + await self.get_url_duplicate_task_operator(), await self.get_url_404_probe_task_operator(), await self.get_url_record_type_task_operator(), await self.get_agency_identification_task_operator(), From 54f1887286e803106138171ddcd078de1c68bb5d Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 5 Jun 2025 11:35:07 -0400 Subject: [PATCH 209/244] Refactor to remove redundant ClientSession creation in `agency_identification` --- src/api/main.py | 4 ++ src/core/tasks/manager.py | 5 +- .../operators/agency_identification/core.py | 57 +++++++++---------- .../collector_db/test_db_client.py | 2 +- .../integration/core/test_async_core.py | 3 +- 5 files changed, 37 insertions(+), 34 deletions(-) diff --git a/src/api/main.py b/src/api/main.py index 4b4087ef..db5ce1ee 100644 --- a/src/api/main.py +++ b/src/api/main.py @@ -17,6 +17,7 @@ from src.api.endpoints.task.routes import task_router from src.api.endpoints.url.routes import url_router from src.collectors.manager import AsyncCollectorManager +from src.collectors.source_collectors.muckrock.api_interface.core import MuckrockAPIInterface from src.core.core import AsyncCore from src.core.logger import AsyncCoreLogger from src.core.env_var_manager import EnvVarManager @@ -62,6 +63,9 @@ async def lifespan(app: FastAPI): api_key=env_var_manager.pdap_api_key, session=session ) + ), + muckrock_api_interface=MuckrockAPIInterface( + session=session ) ) async_collector_manager = AsyncCollectorManager( diff --git a/src/core/tasks/manager.py b/src/core/tasks/manager.py index af18bd1f..695ccaf8 100644 --- a/src/core/tasks/manager.py +++ b/src/core/tasks/manager.py @@ -34,6 +34,7 @@ def __init__( html_parser: HTMLResponseParser, discord_poster: DiscordPoster, pdap_client: PDAPClient, + muckrock_api_interface: MuckrockAPIInterface ): # Dependencies self.adb_client = adb_client @@ -41,6 +42,7 @@ def __init__( self.url_request_interface = url_request_interface self.html_parser = html_parser self.discord_poster = discord_poster + self.muckrock_api_interface = muckrock_api_interface self.logger = logging.getLogger(__name__) self.logger.addHandler(logging.StreamHandler()) @@ -65,11 +67,10 @@ async def get_url_record_type_task_operator(self): return operator async def get_agency_identification_task_operator(self): - muckrock_api_interface = MuckrockAPIInterface() operator = AgencyIdentificationTaskOperator( adb_client=self.adb_client, pdap_client=self.pdap_client, - muckrock_api_interface=muckrock_api_interface + muckrock_api_interface=self.muckrock_api_interface ) return operator diff --git a/src/core/tasks/operators/agency_identification/core.py b/src/core/tasks/operators/agency_identification/core.py index 0904cd79..9da63706 100644 --- a/src/core/tasks/operators/agency_identification/core.py +++ b/src/core/tasks/operators/agency_identification/core.py @@ -70,36 +70,33 @@ async def run_subtask(subtask, url_id, collector_metadata) -> list[URLAgencySugg return await subtask.run(url_id=url_id, collector_metadata=collector_metadata) async def inner_task_logic(self): - async with ClientSession() as session: - self.pdap_client.access_manager.session = session - self.muckrock_api_interface.session = session - tdos: list[AgencyIdentificationTDO] = await self.get_pending_urls_without_agency_identification() - await self.link_urls_to_task(url_ids=[tdo.url_id for tdo in tdos]) - error_infos = [] - all_agency_suggestions = [] - for tdo in tdos: - subtask = await self.get_subtask(tdo.collector_type) - try: - new_agency_suggestions = await self.run_subtask( - subtask, - tdo.url_id, - tdo.collector_metadata - ) - all_agency_suggestions.extend(new_agency_suggestions) - except Exception as e: - error_info = URLErrorPydanticInfo( - task_id=self.task_id, - url_id=tdo.url_id, - error=str(e), - ) - error_infos.append(error_info) + tdos: list[AgencyIdentificationTDO] = await self.get_pending_urls_without_agency_identification() + await self.link_urls_to_task(url_ids=[tdo.url_id for tdo in tdos]) + error_infos = [] + all_agency_suggestions = [] + for tdo in tdos: + subtask = await self.get_subtask(tdo.collector_type) + try: + new_agency_suggestions = await self.run_subtask( + subtask, + tdo.url_id, + tdo.collector_metadata + ) + all_agency_suggestions.extend(new_agency_suggestions) + except Exception as e: + error_info = URLErrorPydanticInfo( + task_id=self.task_id, + url_id=tdo.url_id, + error=str(e), + ) + error_infos.append(error_info) - non_unknown_agency_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type != SuggestionType.UNKNOWN] - await self.adb_client.upsert_new_agencies(non_unknown_agency_suggestions) - confirmed_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type == SuggestionType.CONFIRMED] - await self.adb_client.add_confirmed_agency_url_links(confirmed_suggestions) - non_confirmed_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type != SuggestionType.CONFIRMED] - await self.adb_client.add_agency_auto_suggestions(non_confirmed_suggestions) - await self.adb_client.add_url_error_infos(error_infos) + non_unknown_agency_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type != SuggestionType.UNKNOWN] + await self.adb_client.upsert_new_agencies(non_unknown_agency_suggestions) + confirmed_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type == SuggestionType.CONFIRMED] + await self.adb_client.add_confirmed_agency_url_links(confirmed_suggestions) + non_confirmed_suggestions = [suggestion for suggestion in all_agency_suggestions if suggestion.suggestion_type != SuggestionType.CONFIRMED] + await self.adb_client.add_agency_auto_suggestions(non_confirmed_suggestions) + await self.adb_client.add_url_error_infos(error_infos) diff --git a/tests/automated/integration/collector_db/test_db_client.py b/tests/automated/integration/collector_db/test_db_client.py index 2269b98d..5019d853 100644 --- a/tests/automated/integration/collector_db/test_db_client.py +++ b/tests/automated/integration/collector_db/test_db_client.py @@ -85,7 +85,7 @@ async def test_insert_logs(db_data_creator: DBDataCreator): async def test_delete_old_logs(db_data_creator: DBDataCreator): batch_id = db_data_creator.batch() - old_datetime = datetime.now() - timedelta(days=1) + old_datetime = datetime.now() - timedelta(days=7) db_client = db_data_creator.db_client adb_client = db_data_creator.adb_client log_infos = [] diff --git a/tests/automated/integration/core/test_async_core.py b/tests/automated/integration/core/test_async_core.py index dac0cbda..eb32d2fc 100644 --- a/tests/automated/integration/core/test_async_core.py +++ b/tests/automated/integration/core/test_async_core.py @@ -21,7 +21,8 @@ def setup_async_core(adb_client: AsyncDatabaseClient): url_request_interface=AsyncMock(), html_parser=AsyncMock(), discord_poster=AsyncMock(), - pdap_client=AsyncMock() + pdap_client=AsyncMock(), + muckrock_api_interface=AsyncMock(), ), collector_manager=AsyncMock() ) From e43ba3061638a0eba8415c1139fc07f7ed26a732 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 5 Jun 2025 14:45:04 -0400 Subject: [PATCH 210/244] Increase URLs per result count --- src/collectors/source_collectors/auto_googler/dtos/input.py | 2 +- tests/automated/integration/collector_db/test_db_client.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/collectors/source_collectors/auto_googler/dtos/input.py b/src/collectors/source_collectors/auto_googler/dtos/input.py index d97b9f5f..801d6104 100644 --- a/src/collectors/source_collectors/auto_googler/dtos/input.py +++ b/src/collectors/source_collectors/auto_googler/dtos/input.py @@ -6,7 +6,7 @@ class AutoGooglerInputDTO(BaseModel): description="Maximum number of URLs returned per result. Minimum is 1. Default is 10", default=10, ge=1, - le=10 + le=50 ) queries: list[str] = Field( description="List of queries to search for.", diff --git a/tests/automated/integration/collector_db/test_db_client.py b/tests/automated/integration/collector_db/test_db_client.py index 2269b98d..5019d853 100644 --- a/tests/automated/integration/collector_db/test_db_client.py +++ b/tests/automated/integration/collector_db/test_db_client.py @@ -85,7 +85,7 @@ async def test_insert_logs(db_data_creator: DBDataCreator): async def test_delete_old_logs(db_data_creator: DBDataCreator): batch_id = db_data_creator.batch() - old_datetime = datetime.now() - timedelta(days=1) + old_datetime = datetime.now() - timedelta(days=7) db_client = db_data_creator.db_client adb_client = db_data_creator.adb_client log_infos = [] From 07d5159eec0a8ac38c04dd7a19886a665b983637 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 9 Jun 2025 17:28:10 -0400 Subject: [PATCH 211/244] Add wrapper for identifying response formatting exceptions --- src/db/exceptions.py | 3 ++ .../core/get_next_url_for_final_review.py | 48 ++++++++++--------- tests/manual/pdap_client/test_pdap_client.py | 2 +- 3 files changed, 30 insertions(+), 23 deletions(-) create mode 100644 src/db/exceptions.py diff --git a/src/db/exceptions.py b/src/db/exceptions.py new file mode 100644 index 00000000..10186cab --- /dev/null +++ b/src/db/exceptions.py @@ -0,0 +1,3 @@ + +class FailedQueryException(Exception): + pass \ No newline at end of file diff --git a/src/db/queries/implementations/core/get_next_url_for_final_review.py b/src/db/queries/implementations/core/get_next_url_for_final_review.py index a96f3932..ae1f01a7 100644 --- a/src/db/queries/implementations/core/get_next_url_for_final_review.py +++ b/src/db/queries/implementations/core/get_next_url_for_final_review.py @@ -10,6 +10,7 @@ from src.core.tasks.operators.url_html.scraper.parser.util import convert_to_response_html_info from src.db.dto_converter import DTOConverter from src.db.dtos.url_html_content_info import URLHTMLContentInfo +from src.db.exceptions import FailedQueryException from src.db.models.core import URL, UserRelevantSuggestion, UserRecordTypeSuggestion, UserUrlAgencySuggestion, \ AutoRelevantSuggestion, AutoRecordTypeSuggestion, AutomatedUrlAgencySuggestion, ConfirmedURLAgency from src.db.models.mixins import URLDependentMixin @@ -187,29 +188,32 @@ async def run( html_content_infos = await self._extract_html_content_infos(result) optional_metadata = await self._extract_optional_metadata(result) - return GetNextURLForFinalReviewResponse( - id=result.id, - url=result.url, - html_info=convert_to_response_html_info(html_content_infos), - name=result.name, - description=result.description, - annotations=FinalReviewAnnotationInfo( - relevant=DTOConverter.final_review_annotation_relevant_info( - user_suggestion=result.user_relevant_suggestion, - auto_suggestion=result.auto_relevant_suggestion - ), - record_type=DTOConverter.final_review_annotation_record_type_info( - user_suggestion=result.user_record_type_suggestion, - auto_suggestion=result.auto_record_type_suggestion + try: + return GetNextURLForFinalReviewResponse( + id=result.id, + url=result.url, + html_info=convert_to_response_html_info(html_content_infos), + name=result.name, + description=result.description, + annotations=FinalReviewAnnotationInfo( + relevant=DTOConverter.final_review_annotation_relevant_info( + user_suggestion=result.user_relevant_suggestion, + auto_suggestion=result.auto_relevant_suggestion + ), + record_type=DTOConverter.final_review_annotation_record_type_info( + user_suggestion=result.user_record_type_suggestion, + auto_suggestion=result.auto_record_type_suggestion + ), + agency=DTOConverter.final_review_annotation_agency_info( + automated_agency_suggestions=result.automated_agency_suggestions, + user_agency_suggestion=result.user_agency_suggestion, + confirmed_agencies=result.confirmed_agencies + ) ), - agency=DTOConverter.final_review_annotation_agency_info( - automated_agency_suggestions=result.automated_agency_suggestions, - user_agency_suggestion=result.user_agency_suggestion, - confirmed_agencies=result.confirmed_agencies - ) - ), - optional_metadata=optional_metadata - ) + optional_metadata=optional_metadata + ) + except Exception as e: + raise FailedQueryException(f"Failed to convert result for url id {result.id} to response") from e diff --git a/tests/manual/pdap_client/test_pdap_client.py b/tests/manual/pdap_client/test_pdap_client.py index 91bf016a..5359d790 100644 --- a/tests/manual/pdap_client/test_pdap_client.py +++ b/tests/manual/pdap_client/test_pdap_client.py @@ -3,7 +3,7 @@ from pdap_access_manager import AccessManager from src.pdap_api.client import PDAPClient -from src.util import get_from_env +from src.util.helper_functions import get_from_env @pytest.mark.asyncio From 41d34e19ced79c60a1136d03b81e2dce568e9686 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 9 Jun 2025 18:25:11 -0400 Subject: [PATCH 212/244] Fix bug in final review when url is marked as new agency --- src/db/dto_converter.py | 4 + tests/automated/integration/api/test_batch.py | 3 +- .../automated/integration/api/test_metrics.py | 10 +- .../collector_db/test_db_client.py | 796 ------------------ .../{collector_db => db}/README.md | 0 .../{collector_db => db}/__init__.py | 0 .../integration/db/client/__init__.py | 0 .../db/client/annotate_url/__init__.py | 0 .../annotate_url/test_agency_not_in_db.py | 26 + .../annotate_url/test_marked_not_relevant.py | 66 ++ .../db/client/approve_url/__init__.py | 0 .../db/client/approve_url/test_basic.py | 61 ++ .../db/client/approve_url/test_error.py | 62 ++ .../get_next_url_for_final_review/__init__.py | 0 .../test_basic.py | 52 ++ .../test_batch_id_filtering.py | 36 + .../test_favor_more_components.py | 42 + .../test_new_agency.py | 40 + .../test_not_annotations.py | 19 + .../test_only_confirmed_urls.py | 24 + .../__init__.py | 0 .../test_pending.py | 68 ++ .../test_validated.py | 36 + .../db/client/test_add_url_error_info.py | 37 + .../db/client/test_delete_old_logs.py | 25 + .../db/client/test_delete_url_updated_at.py | 24 + ...next_url_for_annotation_batch_filtering.py | 106 +++ ...get_next_url_for_user_agency_annotation.py | 61 ++ ...ext_url_for_user_record_type_annotation.py | 59 ++ .../integration/db/client/test_insert_logs.py | 26 + .../integration/db/client/test_insert_urls.py | 48 ++ .../test_database_structure.py | 0 .../tasks/test_agency_preannotation_task.py | 3 +- .../integration/tasks/test_url_404_probe.py | 3 +- .../tasks/test_url_duplicate_task.py | 3 +- .../batch_creation_parameters/__init__.py | 0 .../annotation_info.py | 29 + .../helpers/batch_creation_parameters/core.py | 26 + .../url_creation_parameters.py | 33 + tests/helpers/complex_test_data_functions.py | 5 +- tests/helpers/db_data_creator.py | 27 +- .../helpers/test_batch_creation_parameters.py | 71 -- 42 files changed, 1047 insertions(+), 884 deletions(-) delete mode 100644 tests/automated/integration/collector_db/test_db_client.py rename tests/automated/integration/{collector_db => db}/README.md (100%) rename tests/automated/integration/{collector_db => db}/__init__.py (100%) create mode 100644 tests/automated/integration/db/client/__init__.py create mode 100644 tests/automated/integration/db/client/annotate_url/__init__.py create mode 100644 tests/automated/integration/db/client/annotate_url/test_agency_not_in_db.py create mode 100644 tests/automated/integration/db/client/annotate_url/test_marked_not_relevant.py create mode 100644 tests/automated/integration/db/client/approve_url/__init__.py create mode 100644 tests/automated/integration/db/client/approve_url/test_basic.py create mode 100644 tests/automated/integration/db/client/approve_url/test_error.py create mode 100644 tests/automated/integration/db/client/get_next_url_for_final_review/__init__.py create mode 100644 tests/automated/integration/db/client/get_next_url_for_final_review/test_basic.py create mode 100644 tests/automated/integration/db/client/get_next_url_for_final_review/test_batch_id_filtering.py create mode 100644 tests/automated/integration/db/client/get_next_url_for_final_review/test_favor_more_components.py create mode 100644 tests/automated/integration/db/client/get_next_url_for_final_review/test_new_agency.py create mode 100644 tests/automated/integration/db/client/get_next_url_for_final_review/test_not_annotations.py create mode 100644 tests/automated/integration/db/client/get_next_url_for_final_review/test_only_confirmed_urls.py create mode 100644 tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/__init__.py create mode 100644 tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/test_pending.py create mode 100644 tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/test_validated.py create mode 100644 tests/automated/integration/db/client/test_add_url_error_info.py create mode 100644 tests/automated/integration/db/client/test_delete_old_logs.py create mode 100644 tests/automated/integration/db/client/test_delete_url_updated_at.py create mode 100644 tests/automated/integration/db/client/test_get_next_url_for_annotation_batch_filtering.py create mode 100644 tests/automated/integration/db/client/test_get_next_url_for_user_agency_annotation.py create mode 100644 tests/automated/integration/db/client/test_get_next_url_for_user_record_type_annotation.py create mode 100644 tests/automated/integration/db/client/test_insert_logs.py create mode 100644 tests/automated/integration/db/client/test_insert_urls.py rename tests/automated/integration/{collector_db => db}/test_database_structure.py (100%) create mode 100644 tests/helpers/batch_creation_parameters/__init__.py create mode 100644 tests/helpers/batch_creation_parameters/annotation_info.py create mode 100644 tests/helpers/batch_creation_parameters/core.py create mode 100644 tests/helpers/batch_creation_parameters/url_creation_parameters.py delete mode 100644 tests/helpers/test_batch_creation_parameters.py diff --git a/src/db/dto_converter.py b/src/db/dto_converter.py index abdf5552..cfe06a30 100644 --- a/src/db/dto_converter.py +++ b/src/db/dto_converter.py @@ -102,6 +102,10 @@ def user_url_agency_suggestion_to_final_review_annotation_agency_user_info( suggestion = user_url_agency_suggestion if suggestion is None: return None + if suggestion.is_new: + return GetNextURLForAgencyAgencyInfo( + suggestion_type=SuggestionType.NEW_AGENCY, + ) return GetNextURLForAgencyAgencyInfo( suggestion_type=SuggestionType.USER_SUGGESTION, pdap_agency_id=suggestion.agency_id, diff --git a/tests/automated/integration/api/test_batch.py b/tests/automated/integration/api/test_batch.py index 2f654b55..7b741807 100644 --- a/tests/automated/integration/api/test_batch.py +++ b/tests/automated/integration/api/test_batch.py @@ -5,7 +5,8 @@ from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO from src.collectors.enums import CollectorType, URLStatus from src.core.enums import BatchStatus -from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters @pytest.mark.asyncio diff --git a/tests/automated/integration/api/test_metrics.py b/tests/automated/integration/api/test_metrics.py index b724fae6..97a3032b 100644 --- a/tests/automated/integration/api/test_metrics.py +++ b/tests/automated/integration/api/test_metrics.py @@ -1,10 +1,12 @@ import pendulum import pytest +from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo from src.collectors.enums import URLStatus, CollectorType from src.core.enums import BatchStatus, RecordType, SuggestedStatus -from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters, \ - AnnotationInfo +from tests.helpers.batch_creation_parameters.annotation_info import AnnotationInfo +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters @pytest.mark.asyncio @@ -290,7 +292,9 @@ async def test_get_urls_breakdown_pending_metrics(api_test_helper): annotation_info=AnnotationInfo( user_relevant=SuggestedStatus.RELEVANT, user_record_type=RecordType.INCARCERATION_RECORDS, - user_agency=agency_id + user_agency=URLAgencyAnnotationPostInfo( + suggested_agency=agency_id + ) ) ), ] diff --git a/tests/automated/integration/collector_db/test_db_client.py b/tests/automated/integration/collector_db/test_db_client.py deleted file mode 100644 index 5019d853..00000000 --- a/tests/automated/integration/collector_db/test_db_client.py +++ /dev/null @@ -1,796 +0,0 @@ -from datetime import datetime, timedelta - -import pytest -from fastapi import HTTPException - -from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo -from src.db.client.async_ import AsyncDatabaseClient -from src.db.dtos.batch_info import BatchInfo -from src.db.dtos.log_info import LogInfo -from src.db.dtos.url_error_info import URLErrorPydanticInfo -from src.db.dtos.url_info import URLInfo -from src.db.dtos.url_mapping import URLMapping -from src.db.constants import PLACEHOLDER_AGENCY_NAME -from src.db.models.core import URL, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency -from src.collectors.enums import URLStatus -from src.core.enums import BatchStatus, RecordType, SuggestionType, SuggestedStatus -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation, setup_for_annotate_agency -from tests.helpers.db_data_creator import DBDataCreator -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review - -@pytest.mark.asyncio -async def test_insert_urls( - db_client_test, - adb_client_test -): - # Insert batch - batch_info = BatchInfo( - strategy="ckan", - status=BatchStatus.IN_PROCESS, - parameters={}, - user_id=1 - ) - batch_id = await adb_client_test.insert_batch(batch_info) - - urls = [ - URLInfo( - url="https://example.com/1", - collector_metadata={"name": "example_1"}, - ), - URLInfo( - url="https://example.com/2", - ), - # Duplicate - URLInfo( - url="https://example.com/1", - collector_metadata={"name": "example_duplicate"}, - ) - ] - insert_urls_info = await adb_client_test.insert_urls( - url_infos=urls, - batch_id=batch_id - ) - - url_mappings = insert_urls_info.url_mappings - assert len(url_mappings) == 2 - assert url_mappings[0].url == "https://example.com/1" - assert url_mappings[1].url == "https://example.com/2" - - - assert insert_urls_info.original_count == 2 - assert insert_urls_info.duplicate_count == 1 - -@pytest.mark.asyncio -async def test_insert_logs(db_data_creator: DBDataCreator): - batch_id_1 = db_data_creator.batch() - batch_id_2 = db_data_creator.batch() - - adb_client = db_data_creator.adb_client - db_client = db_data_creator.db_client - db_client.insert_logs( - log_infos=[ - LogInfo(log="test log", batch_id=batch_id_1), - LogInfo(log="test log", batch_id=batch_id_1), - LogInfo(log="test log", batch_id=batch_id_2), - ] - ) - - logs = await adb_client.get_logs_by_batch_id(batch_id_1) - assert len(logs) == 2 - - logs = await adb_client.get_logs_by_batch_id(batch_id_2) - assert len(logs) == 1 - -@pytest.mark.asyncio -async def test_delete_old_logs(db_data_creator: DBDataCreator): - batch_id = db_data_creator.batch() - - old_datetime = datetime.now() - timedelta(days=7) - db_client = db_data_creator.db_client - adb_client = db_data_creator.adb_client - log_infos = [] - for i in range(3): - log_infos.append(LogInfo(log="test log", batch_id=batch_id, created_at=old_datetime)) - db_client.insert_logs(log_infos=log_infos) - logs = await adb_client.get_logs_by_batch_id(batch_id=batch_id) - assert len(logs) == 3 - await adb_client.delete_old_logs() - - logs = await adb_client.get_logs_by_batch_id(batch_id=batch_id) - assert len(logs) == 0 - -def test_delete_url_updated_at(db_data_creator: DBDataCreator): - batch_id = db_data_creator.batch() - url_id = db_data_creator.urls(batch_id=batch_id, url_count=1).url_mappings[0].url_id - - db_client = db_data_creator.db_client - url_info = db_client.get_urls_by_batch(batch_id=batch_id, page=1)[0] - - old_updated_at = url_info.updated_at - - - db_client.update_url( - url_info=URLInfo( - id=url_id, - url="dg", - collector_metadata={"test_metadata": "test_metadata"}, - ) - ) - - url = db_client.get_urls_by_batch(batch_id=batch_id, page=1)[0] - assert url.updated_at > old_updated_at - - - -@pytest.mark.asyncio -async def test_add_url_error_info(db_data_creator: DBDataCreator): - batch_id = db_data_creator.batch() - url_mappings = db_data_creator.urls(batch_id=batch_id, url_count=3).url_mappings - url_ids = [url_mapping.url_id for url_mapping in url_mappings] - - adb_client = AsyncDatabaseClient() - task_id = await db_data_creator.task() - - error_infos = [] - for url_mapping in url_mappings: - uei = URLErrorPydanticInfo( - url_id=url_mapping.url_id, - error="test error", - task_id=task_id - ) - - error_infos.append(uei) - - await adb_client.add_url_error_infos( - url_error_infos=error_infos - ) - - results = await adb_client.get_urls_with_errors() - - assert len(results) == 3 - - for result in results: - assert result.url_id in url_ids - assert result.error == "test error" - - -@pytest.mark.asyncio -async def test_get_next_url_for_final_review_basic(db_data_creator: DBDataCreator): - """ - Test that an annotated URL is returned - """ - - setup_info = await setup_for_get_next_url_for_final_review( - db_data_creator=db_data_creator, - annotation_count=1, - include_user_annotations=True - ) - - url_mapping = setup_info.url_mapping - # Add agency auto suggestions - await db_data_creator.agency_auto_suggestions( - url_id=url_mapping.url_id, - count=3 - ) - - - result = await db_data_creator.adb_client.get_next_url_for_final_review( - batch_id=None - ) - - assert result.url == url_mapping.url - html_info = result.html_info - assert html_info.description == "test description" - assert html_info.title == "test html content" - - annotation_info = result.annotations - relevant_info = annotation_info.relevant - assert relevant_info.auto == True - assert relevant_info.user == SuggestedStatus.NOT_RELEVANT - - record_type_info = annotation_info.record_type - assert record_type_info.auto == RecordType.ARREST_RECORDS - assert record_type_info.user == RecordType.ACCIDENT_REPORTS - - agency_info = annotation_info.agency - auto_agency_suggestions = agency_info.auto - assert auto_agency_suggestions.unknown == False - assert len(auto_agency_suggestions.suggestions) == 3 - - # Check user agency suggestion exists and is correct - assert agency_info.user.pdap_agency_id == setup_info.user_agency_id - - -@pytest.mark.asyncio -async def test_get_next_url_for_final_review_batch_id_filtering(db_data_creator: DBDataCreator): - setup_info_1 = await setup_for_get_next_url_for_final_review( - db_data_creator=db_data_creator, - annotation_count=3, - include_user_annotations=True - ) - - setup_info_2 = await setup_for_get_next_url_for_final_review( - db_data_creator=db_data_creator, - annotation_count=3, - include_user_annotations=True - ) - - url_mapping_1 = setup_info_1.url_mapping - url_mapping_2 = setup_info_2.url_mapping - - # If a batch id is provided, return first valid URL with that batch id - result_with_batch_id =await db_data_creator.adb_client.get_next_url_for_final_review( - batch_id=setup_info_2.batch_id - ) - - assert result_with_batch_id.url == url_mapping_2.url - - # If no batch id is provided, return first valid URL - result_no_batch_id =await db_data_creator.adb_client.get_next_url_for_final_review( - batch_id=None - ) - - assert result_no_batch_id.url == url_mapping_1.url - - -@pytest.mark.asyncio -async def test_get_next_url_for_final_review_favor_more_components(db_data_creator: DBDataCreator): - """ - Test in the case of two URLs, favoring the one with more annotations for more components - i.e., if one has annotations for record type and agency id, that should be favored over one with just record type - """ - - setup_info_without_user_anno = await setup_for_get_next_url_for_final_review( - db_data_creator=db_data_creator, - annotation_count=3, - include_user_annotations=False - ) - url_mapping_without_user_anno = setup_info_without_user_anno.url_mapping - - setup_info_with_user_anno = await setup_for_get_next_url_for_final_review( - db_data_creator=db_data_creator, - annotation_count=3, - include_user_annotations=True - ) - url_mapping_with_user_anno = setup_info_with_user_anno.url_mapping - - # Have both be listed as unknown - - for url_mapping in [url_mapping_with_user_anno, url_mapping_without_user_anno]: - await db_data_creator.agency_auto_suggestions( - url_id=url_mapping.url_id, - count=3, - suggestion_type=SuggestionType.UNKNOWN - ) - - result = await db_data_creator.adb_client.get_next_url_for_final_review( - batch_id=None - ) - - assert result.id == url_mapping_with_user_anno.url_id - -@pytest.mark.asyncio -async def test_get_next_url_for_final_review_no_annotations(db_data_creator: DBDataCreator): - """ - Test in the case of one URL with no annotations. - No annotations should be returned - """ - batch_id = db_data_creator.batch() - url_mapping = db_data_creator.urls(batch_id=batch_id, url_count=1).url_mappings[0] - - result = await db_data_creator.adb_client.get_next_url_for_final_review( - batch_id=None - ) - - assert result is None - -@pytest.mark.asyncio -async def test_get_next_url_for_final_review_only_confirmed_urls(db_data_creator: DBDataCreator): - """ - Test in the case of one URL that is submitted - Should not be returned. - """ - batch_id = db_data_creator.batch() - url_mapping = db_data_creator.urls( - batch_id=batch_id, - url_count=1, - outcome=URLStatus.SUBMITTED - ).url_mappings[0] - - result = await db_data_creator.adb_client.get_next_url_for_final_review( - batch_id=None - ) - - assert result is None - -@pytest.mark.asyncio -async def test_approve_url_basic(db_data_creator: DBDataCreator): - setup_info = await setup_for_get_next_url_for_final_review( - db_data_creator=db_data_creator, - annotation_count=3, - include_user_annotations=True - ) - url_mapping = setup_info.url_mapping - - # Add confirmed agency - agency_id = await db_data_creator.agency_confirmed_suggestion( - url_id=url_mapping.url_id - ) - - adb_client = db_data_creator.adb_client - # Approve URL. Only URL should be affected. No other properties should be changed. - await adb_client.approve_url( - approval_info=FinalReviewApprovalInfo( - url_id=url_mapping.url_id, - record_type=RecordType.ARREST_RECORDS, - relevant=True, - ), - user_id=1 - ) - - # Confirm same agency id is listed as confirmed - urls: list[URL] = await adb_client.get_all(URL) - assert len(urls) == 1 - url = urls[0] - assert url.id == url_mapping.url_id - assert url.record_type == RecordType.ARREST_RECORDS.value - assert url.outcome == URLStatus.VALIDATED.value - assert url.name == "Test Name" - assert url.description == "Test Description" - - confirmed_agency: list[ConfirmedURLAgency] = await adb_client.get_all(ConfirmedURLAgency) - assert len(confirmed_agency) == 1 - assert confirmed_agency[0].url_id == url_mapping.url_id - assert confirmed_agency[0].agency_id == agency_id - - approving_user_urls: list[ReviewingUserURL] = await adb_client.get_all(ReviewingUserURL) - assert len(approving_user_urls) == 1 - assert approving_user_urls[0].user_id == 1 - assert approving_user_urls[0].url_id == url_mapping.url_id - - optional_metadata: list[URLOptionalDataSourceMetadata] = await adb_client.get_all(URLOptionalDataSourceMetadata) - assert len(optional_metadata) == 1 - assert optional_metadata[0].url_id == url_mapping.url_id - assert optional_metadata[0].record_formats == ["Test Record Format", "Test Record Format 2"] - assert optional_metadata[0].data_portal_type == "Test Data Portal Type" - assert optional_metadata[0].supplying_entity == "Test Supplying Entity" - -@pytest.mark.asyncio -async def test_approval_url_error(db_data_creator: DBDataCreator): - setup_info = await setup_for_get_next_url_for_final_review( - db_data_creator=db_data_creator, - annotation_count=3, - include_user_annotations=True, - include_miscellaneous_metadata=False - ) - url_mapping = setup_info.url_mapping - - # Set all required descriptors to none and receive an error - adb_client = db_data_creator.adb_client - with pytest.raises(HTTPException) as e: - await adb_client.approve_url( - approval_info=FinalReviewApprovalInfo( - url_id=url_mapping.url_id, - ), - user_id=1 - ) - assert e.value.status_code == 422 - - # Create kwarg dictionary with all required approval info fields - kwarg_dict = { - "record_type": RecordType.ARREST_RECORDS, - "agency_ids": [await db_data_creator.agency()], - "name": "Test Name", - "description": "Test Description", - } - # For each keyword, create a copy of the kwargs and set that one to none - # Confirm it produces the correct error - for kwarg in kwarg_dict: - kwarg_copy = kwarg_dict.copy() - kwarg_copy[kwarg] = None - with pytest.raises(HTTPException) as e: - await adb_client.approve_url( - approval_info=FinalReviewApprovalInfo( - url_id=url_mapping.url_id, - relevant=True, - **kwarg_copy - ), - user_id=1 - ) - pytest.fail(f"Expected error for kwarg {kwarg}") - - # Test that if all kwargs are set, no error is raised - await adb_client.approve_url( - approval_info=FinalReviewApprovalInfo( - url_id=url_mapping.url_id, - relevant=True, - **kwarg_dict - ), - user_id=1 - ) - -@pytest.mark.asyncio -async def test_get_next_url_for_user_relevance_annotation_pending( - db_data_creator: DBDataCreator -): - """ - Users should receive a valid URL to annotate - All users should receive the same next URL - Once any user annotates that URL, none of the users should receive it again - """ - setup_info = await setup_for_get_next_url_for_annotation( - db_data_creator=db_data_creator, - url_count=2 - ) - - url_1 = setup_info.insert_urls_info.url_mappings[0] - - # Add `Relevancy` attribute with value `True` - await db_data_creator.auto_relevant_suggestions( - url_id=url_1.url_id, - relevant=True - ) - - adb_client = db_data_creator.adb_client - url_1 = await adb_client.get_next_url_for_relevance_annotation( - user_id=1, - batch_id=None - ) - assert url_1 is not None - - url_2 = await adb_client.get_next_url_for_relevance_annotation( - user_id=2, - batch_id=None - ) - assert url_2 is not None - - assert url_1.url_info.url == url_2.url_info.url - - # Annotate this URL, then check that the second URL is returned - await adb_client.add_user_relevant_suggestion( - url_id=url_1.url_info.url_id, - user_id=1, - suggested_status=SuggestedStatus.RELEVANT - ) - - url_3 = await adb_client.get_next_url_for_relevance_annotation( - user_id=1, - batch_id=None - ) - assert url_3 is not None - - assert url_1 != url_3 - - # Check that the second URL is also returned for another user - url_4 = await adb_client.get_next_url_for_relevance_annotation( - user_id=2, - batch_id=None - ) - assert url_4 is not None - - - assert url_4 == url_3 - - -@pytest.mark.asyncio -async def test_get_next_url_for_annotation_batch_filtering( - db_data_creator: DBDataCreator -): - """ - Test that for all annotation retrievals, batch filtering works as expected - """ - setup_info_1 = await setup_for_get_next_url_for_annotation( - db_data_creator=db_data_creator, - url_count=1 - ) - setup_info_2 = await setup_for_get_next_url_for_annotation( - db_data_creator=db_data_creator, - url_count=3 - ) - - def assert_batch_info(batch_info): - assert batch_info.total_urls == 3 - assert batch_info.count_annotated == 0 - assert batch_info.count_not_annotated == 3 - - url_1 = setup_info_1.insert_urls_info.url_mappings[0] - url_2 = setup_info_2.insert_urls_info.url_mappings[0] - - # Test for relevance - # If a batch id is provided, return first valid URL with that batch id - result_with_batch_id = await db_data_creator.adb_client.get_next_url_for_relevance_annotation( - user_id=1, - batch_id=setup_info_2.batch_id - ) - - assert result_with_batch_id.url_info.url == url_2.url - assert_batch_info(result_with_batch_id.batch_info) - # If no batch id is provided, return first valid URL - result_no_batch_id = await db_data_creator.adb_client.get_next_url_for_relevance_annotation( - user_id=1, - batch_id=None - ) - - assert result_no_batch_id.url_info.url == url_1.url - - # Test for record type - # If a batch id is provided, return first valid URL with that batch id - result_with_batch_id = await db_data_creator.adb_client.get_next_url_for_record_type_annotation( - user_id=1, - batch_id=setup_info_2.batch_id - ) - - assert result_with_batch_id.url_info.url == url_2.url - assert_batch_info(result_with_batch_id.batch_info) - - # If no batch id is provided, return first valid URL - result_no_batch_id = await db_data_creator.adb_client.get_next_url_for_record_type_annotation( - user_id=1, - batch_id=None - ) - - assert result_no_batch_id.url_info.url == url_1.url - - # Test for agency - for url in [url_1, url_2]: - await db_data_creator.auto_suggestions( - url_ids=[url.url_id], - num_suggestions=2, - suggestion_type=SuggestionType.AUTO_SUGGESTION - ) - - # If a batch id is provided, return first valid URL with that batch id - result_with_batch_id = await db_data_creator.adb_client.get_next_url_agency_for_annotation( - user_id=1, - batch_id=setup_info_2.batch_id - ) - - assert result_with_batch_id.next_annotation.url_info.url == url_2.url - assert_batch_info(result_with_batch_id.next_annotation.batch_info) - - # If no batch id is provided, return first valid URL - result_no_batch_id = await db_data_creator.adb_client.get_next_url_agency_for_annotation( - user_id=1, - batch_id=None - ) - - assert result_no_batch_id.next_annotation.url_info.url == url_1.url - - - # All annotations - result_with_batch_id = await db_data_creator.adb_client.get_next_url_for_all_annotations( - batch_id=setup_info_2.batch_id - ) - - assert result_with_batch_id.next_annotation.url_info.url == url_2.url - assert_batch_info(result_with_batch_id.next_annotation.batch_info) - - # If no batch id is provided, return first valid URL - result_no_batch_id = await db_data_creator.adb_client.get_next_url_for_all_annotations( - batch_id=None - ) - - assert result_no_batch_id.next_annotation.url_info.url == url_1.url - - - -@pytest.mark.asyncio -async def test_get_next_url_for_user_relevance_annotation_validated( - db_data_creator: DBDataCreator -): - """ - A validated URL should not turn up in get_next_url_for_user_annotation - """ - - setup_info = await setup_for_get_next_url_for_annotation( - db_data_creator=db_data_creator, - url_count=1, - outcome=URLStatus.VALIDATED - ) - - - url_1 = setup_info.insert_urls_info.url_mappings[0] - - # Add `Relevancy` attribute with value `True` - await db_data_creator.auto_relevant_suggestions( - url_id=url_1.url_id, - relevant=True - ) - - adb_client = db_data_creator.adb_client - url = await adb_client.get_next_url_for_relevance_annotation( - user_id=1, - batch_id=None - ) - assert url is None - -@pytest.mark.asyncio -async def test_annotate_url_marked_not_relevant(db_data_creator: DBDataCreator): - """ - If a URL is marked not relevant by the user, they should not receive that URL - in calls to get an annotation for record type or agency - Other users should still receive the URL - """ - setup_info = await setup_for_get_next_url_for_annotation( - db_data_creator=db_data_creator, - url_count=2 - ) - adb_client = db_data_creator.adb_client - url_to_mark_not_relevant: URLMapping = setup_info.insert_urls_info.url_mappings[0] - url_to_mark_relevant: URLMapping = setup_info.insert_urls_info.url_mappings[1] - for url_mapping in setup_info.insert_urls_info.url_mappings: - await db_data_creator.agency_auto_suggestions( - url_id=url_mapping.url_id, - count=3 - ) - await adb_client.add_user_relevant_suggestion( - user_id=1, - url_id=url_to_mark_not_relevant.url_id, - suggested_status=SuggestedStatus.NOT_RELEVANT - ) - await adb_client.add_user_relevant_suggestion( - user_id=1, - url_id=url_to_mark_relevant.url_id, - suggested_status=SuggestedStatus.RELEVANT - ) - - # User should not receive the URL for record type annotation - record_type_annotation_info = await adb_client.get_next_url_for_record_type_annotation( - user_id=1, - batch_id=None - ) - assert record_type_annotation_info.url_info.url_id != url_to_mark_not_relevant.url_id - - # Other users also should not receive the URL for record type annotation - record_type_annotation_info = await adb_client.get_next_url_for_record_type_annotation( - user_id=2, - batch_id=None - ) - assert record_type_annotation_info.url_info.url_id != \ - url_to_mark_not_relevant.url_id, "Other users should not receive the URL for record type annotation" - - # User should not receive the URL for agency annotation - agency_annotation_info_user_1 = await adb_client.get_next_url_agency_for_annotation( - user_id=1, - batch_id=None - ) - assert agency_annotation_info_user_1.next_annotation.url_info.url_id != url_to_mark_not_relevant.url_id - - # Other users also should not receive the URL for agency annotation - agency_annotation_info_user_2 = await adb_client.get_next_url_agency_for_annotation( - user_id=2, - batch_id=None - ) - assert agency_annotation_info_user_1.next_annotation.url_info.url_id != url_to_mark_not_relevant.url_id - -@pytest.mark.asyncio -async def test_annotate_url_agency_agency_not_in_db(db_data_creator: DBDataCreator): - setup_info = await setup_for_annotate_agency( - db_data_creator, - url_count=1 - ) - - url_id = setup_info.url_ids[0] - await db_data_creator.adb_client.add_agency_manual_suggestion( - agency_id=1, - url_id=url_id, - user_id=1, - is_new=False - ) - - agencies = await db_data_creator.adb_client.get_all(Agency) - assert len(agencies) - assert agencies[0].name == PLACEHOLDER_AGENCY_NAME - -@pytest.mark.asyncio -async def test_get_next_url_for_user_record_type_annotation(db_data_creator: DBDataCreator): - """ - All users should receive the same next valid URL for record type annotation - Once any user annotates that URL, none of the users should receive it - """ - setup_info = await setup_for_get_next_url_for_annotation( - db_data_creator, - url_count=2 - ) - - # All users should receive the same URL - url_1 = setup_info.insert_urls_info.url_mappings[0] - url_2 = setup_info.insert_urls_info.url_mappings[1] - - adb_client = db_data_creator.adb_client - - url_user_1 = await adb_client.get_next_url_for_record_type_annotation( - user_id=1, - batch_id=None - ) - assert url_user_1 is not None - - url_user_2 = await adb_client.get_next_url_for_record_type_annotation( - user_id=2, - batch_id=None - ) - - assert url_user_2 is not None - - # Check that the URLs are the same - assert url_user_1 == url_user_2 - - # After annotating, both users should receive a different URL - await adb_client.add_user_record_type_suggestion( - user_id=1, - url_id=url_1.url_id, - record_type=RecordType.ARREST_RECORDS - ) - - next_url_user_1 = await adb_client.get_next_url_for_record_type_annotation( - user_id=1, - batch_id=None - ) - - next_url_user_2 = await adb_client.get_next_url_for_record_type_annotation( - user_id=2, - batch_id=None - ) - - assert next_url_user_1 != url_user_1 - assert next_url_user_1 == next_url_user_2 - - - - - -@pytest.mark.asyncio -async def test_get_next_url_for_user_agency_annotation(db_data_creator: DBDataCreator): - """ - All users should receive the same next valid URL for agency annotation - Once any user annotates that URL, none of the users should receive it - """ - setup_info = await setup_for_annotate_agency( - db_data_creator, - url_count=2 - ) - - # All users should receive the same URL - url_1 = setup_info.url_ids[0] - url_2 = setup_info.url_ids[1] - - adb_client = db_data_creator.adb_client - url_user_1 = await adb_client.get_next_url_agency_for_annotation( - user_id=1, - batch_id=None - ) - assert url_user_1 is not None - - url_user_2 = await adb_client.get_next_url_agency_for_annotation( - user_id=2, - batch_id=None - ) - - assert url_user_2 is not None - - # Check that the URLs are the same - assert url_user_1 == url_user_2 - - # Annotate the URL - await adb_client.add_agency_manual_suggestion( - url_id=url_1, - user_id=1, - is_new=True, - agency_id=None - ) - - # Both users should receive the next URL - next_url_user_1 = await adb_client.get_next_url_agency_for_annotation( - user_id=1, - batch_id=None - ) - assert next_url_user_1 is not None - - next_url_user_2 = await adb_client.get_next_url_agency_for_annotation( - user_id=2, - batch_id=None - ) - assert next_url_user_2 is not None - - assert url_user_1 != next_url_user_1 - assert next_url_user_1 == next_url_user_2 diff --git a/tests/automated/integration/collector_db/README.md b/tests/automated/integration/db/README.md similarity index 100% rename from tests/automated/integration/collector_db/README.md rename to tests/automated/integration/db/README.md diff --git a/tests/automated/integration/collector_db/__init__.py b/tests/automated/integration/db/__init__.py similarity index 100% rename from tests/automated/integration/collector_db/__init__.py rename to tests/automated/integration/db/__init__.py diff --git a/tests/automated/integration/db/client/__init__.py b/tests/automated/integration/db/client/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/db/client/annotate_url/__init__.py b/tests/automated/integration/db/client/annotate_url/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/db/client/annotate_url/test_agency_not_in_db.py b/tests/automated/integration/db/client/annotate_url/test_agency_not_in_db.py new file mode 100644 index 00000000..e8cd5141 --- /dev/null +++ b/tests/automated/integration/db/client/annotate_url/test_agency_not_in_db.py @@ -0,0 +1,26 @@ +import pytest + +from src.db.constants import PLACEHOLDER_AGENCY_NAME +from src.db.models.core import Agency +from tests.helpers.complex_test_data_functions import setup_for_annotate_agency +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_annotate_url_agency_agency_not_in_db(db_data_creator: DBDataCreator): + setup_info = await setup_for_annotate_agency( + db_data_creator, + url_count=1 + ) + + url_id = setup_info.url_ids[0] + await db_data_creator.adb_client.add_agency_manual_suggestion( + agency_id=1, + url_id=url_id, + user_id=1, + is_new=False + ) + + agencies = await db_data_creator.adb_client.get_all(Agency) + assert len(agencies) + assert agencies[0].name == PLACEHOLDER_AGENCY_NAME diff --git a/tests/automated/integration/db/client/annotate_url/test_marked_not_relevant.py b/tests/automated/integration/db/client/annotate_url/test_marked_not_relevant.py new file mode 100644 index 00000000..b852e9eb --- /dev/null +++ b/tests/automated/integration/db/client/annotate_url/test_marked_not_relevant.py @@ -0,0 +1,66 @@ +import pytest + +from src.core.enums import SuggestedStatus +from src.db.dtos.url_mapping import URLMapping +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_annotate_url_marked_not_relevant(db_data_creator: DBDataCreator): + """ + If a URL is marked not relevant by the user, they should not receive that URL + in calls to get an annotation for record type or agency + Other users should still receive the URL + """ + setup_info = await setup_for_get_next_url_for_annotation( + db_data_creator=db_data_creator, + url_count=2 + ) + adb_client = db_data_creator.adb_client + url_to_mark_not_relevant: URLMapping = setup_info.insert_urls_info.url_mappings[0] + url_to_mark_relevant: URLMapping = setup_info.insert_urls_info.url_mappings[1] + for url_mapping in setup_info.insert_urls_info.url_mappings: + await db_data_creator.agency_auto_suggestions( + url_id=url_mapping.url_id, + count=3 + ) + await adb_client.add_user_relevant_suggestion( + user_id=1, + url_id=url_to_mark_not_relevant.url_id, + suggested_status=SuggestedStatus.NOT_RELEVANT + ) + await adb_client.add_user_relevant_suggestion( + user_id=1, + url_id=url_to_mark_relevant.url_id, + suggested_status=SuggestedStatus.RELEVANT + ) + + # User should not receive the URL for record type annotation + record_type_annotation_info = await adb_client.get_next_url_for_record_type_annotation( + user_id=1, + batch_id=None + ) + assert record_type_annotation_info.url_info.url_id != url_to_mark_not_relevant.url_id + + # Other users also should not receive the URL for record type annotation + record_type_annotation_info = await adb_client.get_next_url_for_record_type_annotation( + user_id=2, + batch_id=None + ) + assert record_type_annotation_info.url_info.url_id != \ + url_to_mark_not_relevant.url_id, "Other users should not receive the URL for record type annotation" + + # User should not receive the URL for agency annotation + agency_annotation_info_user_1 = await adb_client.get_next_url_agency_for_annotation( + user_id=1, + batch_id=None + ) + assert agency_annotation_info_user_1.next_annotation.url_info.url_id != url_to_mark_not_relevant.url_id + + # Other users also should not receive the URL for agency annotation + agency_annotation_info_user_2 = await adb_client.get_next_url_agency_for_annotation( + user_id=2, + batch_id=None + ) + assert agency_annotation_info_user_1.next_annotation.url_info.url_id != url_to_mark_not_relevant.url_id diff --git a/tests/automated/integration/db/client/approve_url/__init__.py b/tests/automated/integration/db/client/approve_url/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/db/client/approve_url/test_basic.py b/tests/automated/integration/db/client/approve_url/test_basic.py new file mode 100644 index 00000000..67d88c16 --- /dev/null +++ b/tests/automated/integration/db/client/approve_url/test_basic.py @@ -0,0 +1,61 @@ +import pytest + +from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo +from src.collectors.enums import URLStatus +from src.core.enums import RecordType +from src.db.models.core import URL, ConfirmedURLAgency, ReviewingUserURL, URLOptionalDataSourceMetadata +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_approve_url_basic(db_data_creator: DBDataCreator): + setup_info = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + url_mapping = setup_info.url_mapping + + # Add confirmed agency + agency_id = await db_data_creator.agency_confirmed_suggestion( + url_id=url_mapping.url_id + ) + + adb_client = db_data_creator.adb_client + # Approve URL. Only URL should be affected. No other properties should be changed. + await adb_client.approve_url( + approval_info=FinalReviewApprovalInfo( + url_id=url_mapping.url_id, + record_type=RecordType.ARREST_RECORDS, + relevant=True, + ), + user_id=1 + ) + + # Confirm same agency id is listed as confirmed + urls: list[URL] = await adb_client.get_all(URL) + assert len(urls) == 1 + url = urls[0] + assert url.id == url_mapping.url_id + assert url.record_type == RecordType.ARREST_RECORDS.value + assert url.outcome == URLStatus.VALIDATED.value + assert url.name == "Test Name" + assert url.description == "Test Description" + + confirmed_agency: list[ConfirmedURLAgency] = await adb_client.get_all(ConfirmedURLAgency) + assert len(confirmed_agency) == 1 + assert confirmed_agency[0].url_id == url_mapping.url_id + assert confirmed_agency[0].agency_id == agency_id + + approving_user_urls: list[ReviewingUserURL] = await adb_client.get_all(ReviewingUserURL) + assert len(approving_user_urls) == 1 + assert approving_user_urls[0].user_id == 1 + assert approving_user_urls[0].url_id == url_mapping.url_id + + optional_metadata: list[URLOptionalDataSourceMetadata] = await adb_client.get_all(URLOptionalDataSourceMetadata) + assert len(optional_metadata) == 1 + assert optional_metadata[0].url_id == url_mapping.url_id + assert optional_metadata[0].record_formats == ["Test Record Format", "Test Record Format 2"] + assert optional_metadata[0].data_portal_type == "Test Data Portal Type" + assert optional_metadata[0].supplying_entity == "Test Supplying Entity" diff --git a/tests/automated/integration/db/client/approve_url/test_error.py b/tests/automated/integration/db/client/approve_url/test_error.py new file mode 100644 index 00000000..b38f883d --- /dev/null +++ b/tests/automated/integration/db/client/approve_url/test_error.py @@ -0,0 +1,62 @@ +import pytest +from fastapi import HTTPException + +from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo +from src.core.enums import RecordType +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_approval_url_error(db_data_creator: DBDataCreator): + setup_info = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True, + include_miscellaneous_metadata=False + ) + url_mapping = setup_info.url_mapping + + # Set all required descriptors to none and receive an error + adb_client = db_data_creator.adb_client + with pytest.raises(HTTPException) as e: + await adb_client.approve_url( + approval_info=FinalReviewApprovalInfo( + url_id=url_mapping.url_id, + ), + user_id=1 + ) + assert e.value.status_code == 422 + + # Create kwarg dictionary with all required approval info fields + kwarg_dict = { + "record_type": RecordType.ARREST_RECORDS, + "agency_ids": [await db_data_creator.agency()], + "name": "Test Name", + "description": "Test Description", + } + # For each keyword, create a copy of the kwargs and set that one to none + # Confirm it produces the correct error + for kwarg in kwarg_dict: + kwarg_copy = kwarg_dict.copy() + kwarg_copy[kwarg] = None + with pytest.raises(HTTPException) as e: + await adb_client.approve_url( + approval_info=FinalReviewApprovalInfo( + url_id=url_mapping.url_id, + relevant=True, + **kwarg_copy + ), + user_id=1 + ) + pytest.fail(f"Expected error for kwarg {kwarg}") + + # Test that if all kwargs are set, no error is raised + await adb_client.approve_url( + approval_info=FinalReviewApprovalInfo( + url_id=url_mapping.url_id, + relevant=True, + **kwarg_dict + ), + user_id=1 + ) diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/__init__.py b/tests/automated/integration/db/client/get_next_url_for_final_review/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_basic.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_basic.py new file mode 100644 index 00000000..dc285672 --- /dev/null +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_basic.py @@ -0,0 +1,52 @@ +import pytest + +from src.core.enums import SuggestedStatus, RecordType +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_get_next_url_for_final_review_basic(db_data_creator: DBDataCreator): + """ + Test that an annotated URL is returned + """ + + setup_info = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=1, + include_user_annotations=True + ) + + url_mapping = setup_info.url_mapping + # Add agency auto suggestions + await db_data_creator.agency_auto_suggestions( + url_id=url_mapping.url_id, + count=3 + ) + + + result = await db_data_creator.adb_client.get_next_url_for_final_review( + batch_id=None + ) + + assert result.url == url_mapping.url + html_info = result.html_info + assert html_info.description == "test description" + assert html_info.title == "test html content" + + annotation_info = result.annotations + relevant_info = annotation_info.relevant + assert relevant_info.auto == True + assert relevant_info.user == SuggestedStatus.NOT_RELEVANT + + record_type_info = annotation_info.record_type + assert record_type_info.auto == RecordType.ARREST_RECORDS + assert record_type_info.user == RecordType.ACCIDENT_REPORTS + + agency_info = annotation_info.agency + auto_agency_suggestions = agency_info.auto + assert auto_agency_suggestions.unknown == False + assert len(auto_agency_suggestions.suggestions) == 3 + + # Check user agency suggestion exists and is correct + assert agency_info.user.pdap_agency_id == setup_info.user_agency_id diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_batch_id_filtering.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_batch_id_filtering.py new file mode 100644 index 00000000..2da137d2 --- /dev/null +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_batch_id_filtering.py @@ -0,0 +1,36 @@ +import pytest + +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_get_next_url_for_final_review_batch_id_filtering(db_data_creator: DBDataCreator): + setup_info_1 = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + + setup_info_2 = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + + url_mapping_1 = setup_info_1.url_mapping + url_mapping_2 = setup_info_2.url_mapping + + # If a batch id is provided, return first valid URL with that batch id + result_with_batch_id =await db_data_creator.adb_client.get_next_url_for_final_review( + batch_id=setup_info_2.batch_id + ) + + assert result_with_batch_id.url == url_mapping_2.url + + # If no batch id is provided, return first valid URL + result_no_batch_id =await db_data_creator.adb_client.get_next_url_for_final_review( + batch_id=None + ) + + assert result_no_batch_id.url == url_mapping_1.url diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_favor_more_components.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_favor_more_components.py new file mode 100644 index 00000000..8321f51f --- /dev/null +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_favor_more_components.py @@ -0,0 +1,42 @@ +import pytest + +from src.core.enums import SuggestionType +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_get_next_url_for_final_review_favor_more_components(db_data_creator: DBDataCreator): + """ + Test in the case of two URLs, favoring the one with more annotations for more components + i.e., if one has annotations for record type and agency id, that should be favored over one with just record type + """ + + setup_info_without_user_anno = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=False + ) + url_mapping_without_user_anno = setup_info_without_user_anno.url_mapping + + setup_info_with_user_anno = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + url_mapping_with_user_anno = setup_info_with_user_anno.url_mapping + + # Have both be listed as unknown + + for url_mapping in [url_mapping_with_user_anno, url_mapping_without_user_anno]: + await db_data_creator.agency_auto_suggestions( + url_id=url_mapping.url_id, + count=3, + suggestion_type=SuggestionType.UNKNOWN + ) + + result = await db_data_creator.adb_client.get_next_url_for_final_review( + batch_id=None + ) + + assert result.id == url_mapping_with_user_anno.url_id diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_new_agency.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_new_agency.py new file mode 100644 index 00000000..f882f7fb --- /dev/null +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_new_agency.py @@ -0,0 +1,40 @@ +import pytest + +from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.core.enums import SuggestedStatus, RecordType, SuggestionType +from tests.helpers.batch_creation_parameters.annotation_info import AnnotationInfo +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_get_next_url_for_final_review_new_agency(db_data_creator: DBDataCreator): + """ + Test that a URL with a new agency is properly returned + """ + + # Apply batch v2 + parameters = TestBatchCreationParameters( + urls=[ + TestURLCreationParameters( + annotation_info=AnnotationInfo( + user_relevant=SuggestedStatus.RELEVANT, + user_agency=URLAgencyAnnotationPostInfo( + is_new=True + ), + user_record_type=RecordType.ARREST_RECORDS + ) + ) + ] + ) + creation_info = await db_data_creator.batch_v2(parameters) + result = await db_data_creator.adb_client.get_next_url_for_final_review( + batch_id=None + ) + + assert result is not None + user_suggestion = result.annotations.agency.user + assert user_suggestion.suggestion_type == SuggestionType.NEW_AGENCY + assert user_suggestion.pdap_agency_id is None + assert user_suggestion.agency_name is None diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_not_annotations.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_not_annotations.py new file mode 100644 index 00000000..a56d4f77 --- /dev/null +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_not_annotations.py @@ -0,0 +1,19 @@ +import pytest + +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_get_next_url_for_final_review_no_annotations(db_data_creator: DBDataCreator): + """ + Test in the case of one URL with no annotations. + No annotations should be returned + """ + batch_id = db_data_creator.batch() + url_mapping = db_data_creator.urls(batch_id=batch_id, url_count=1).url_mappings[0] + + result = await db_data_creator.adb_client.get_next_url_for_final_review( + batch_id=None + ) + + assert result is None diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_only_confirmed_urls.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_only_confirmed_urls.py new file mode 100644 index 00000000..4f6149a6 --- /dev/null +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_only_confirmed_urls.py @@ -0,0 +1,24 @@ +import pytest + +from src.collectors.enums import URLStatus +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_get_next_url_for_final_review_only_confirmed_urls(db_data_creator: DBDataCreator): + """ + Test in the case of one URL that is submitted + Should not be returned. + """ + batch_id = db_data_creator.batch() + url_mapping = db_data_creator.urls( + batch_id=batch_id, + url_count=1, + outcome=URLStatus.SUBMITTED + ).url_mappings[0] + + result = await db_data_creator.adb_client.get_next_url_for_final_review( + batch_id=None + ) + + assert result is None diff --git a/tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/__init__.py b/tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/test_pending.py b/tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/test_pending.py new file mode 100644 index 00000000..4aaf58ba --- /dev/null +++ b/tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/test_pending.py @@ -0,0 +1,68 @@ +import pytest + +from src.core.enums import SuggestedStatus +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_get_next_url_for_user_relevance_annotation_pending( + db_data_creator: DBDataCreator +): + """ + Users should receive a valid URL to annotate + All users should receive the same next URL + Once any user annotates that URL, none of the users should receive it again + """ + setup_info = await setup_for_get_next_url_for_annotation( + db_data_creator=db_data_creator, + url_count=2 + ) + + url_1 = setup_info.insert_urls_info.url_mappings[0] + + # Add `Relevancy` attribute with value `True` + await db_data_creator.auto_relevant_suggestions( + url_id=url_1.url_id, + relevant=True + ) + + adb_client = db_data_creator.adb_client + url_1 = await adb_client.get_next_url_for_relevance_annotation( + user_id=1, + batch_id=None + ) + assert url_1 is not None + + url_2 = await adb_client.get_next_url_for_relevance_annotation( + user_id=2, + batch_id=None + ) + assert url_2 is not None + + assert url_1.url_info.url == url_2.url_info.url + + # Annotate this URL, then check that the second URL is returned + await adb_client.add_user_relevant_suggestion( + url_id=url_1.url_info.url_id, + user_id=1, + suggested_status=SuggestedStatus.RELEVANT + ) + + url_3 = await adb_client.get_next_url_for_relevance_annotation( + user_id=1, + batch_id=None + ) + assert url_3 is not None + + assert url_1 != url_3 + + # Check that the second URL is also returned for another user + url_4 = await adb_client.get_next_url_for_relevance_annotation( + user_id=2, + batch_id=None + ) + assert url_4 is not None + + + assert url_4 == url_3 diff --git a/tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/test_validated.py b/tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/test_validated.py new file mode 100644 index 00000000..ae806775 --- /dev/null +++ b/tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/test_validated.py @@ -0,0 +1,36 @@ +import pytest + +from src.collectors.enums import URLStatus +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_get_next_url_for_user_relevance_annotation_validated( + db_data_creator: DBDataCreator +): + """ + A validated URL should not turn up in get_next_url_for_user_annotation + """ + + setup_info = await setup_for_get_next_url_for_annotation( + db_data_creator=db_data_creator, + url_count=1, + outcome=URLStatus.VALIDATED + ) + + + url_1 = setup_info.insert_urls_info.url_mappings[0] + + # Add `Relevancy` attribute with value `True` + await db_data_creator.auto_relevant_suggestions( + url_id=url_1.url_id, + relevant=True + ) + + adb_client = db_data_creator.adb_client + url = await adb_client.get_next_url_for_relevance_annotation( + user_id=1, + batch_id=None + ) + assert url is None diff --git a/tests/automated/integration/db/client/test_add_url_error_info.py b/tests/automated/integration/db/client/test_add_url_error_info.py new file mode 100644 index 00000000..aa5ed5f9 --- /dev/null +++ b/tests/automated/integration/db/client/test_add_url_error_info.py @@ -0,0 +1,37 @@ +import pytest + +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.url_error_info import URLErrorPydanticInfo +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_add_url_error_info(db_data_creator: DBDataCreator): + batch_id = db_data_creator.batch() + url_mappings = db_data_creator.urls(batch_id=batch_id, url_count=3).url_mappings + url_ids = [url_mapping.url_id for url_mapping in url_mappings] + + adb_client = AsyncDatabaseClient() + task_id = await db_data_creator.task() + + error_infos = [] + for url_mapping in url_mappings: + uei = URLErrorPydanticInfo( + url_id=url_mapping.url_id, + error="test error", + task_id=task_id + ) + + error_infos.append(uei) + + await adb_client.add_url_error_infos( + url_error_infos=error_infos + ) + + results = await adb_client.get_urls_with_errors() + + assert len(results) == 3 + + for result in results: + assert result.url_id in url_ids + assert result.error == "test error" diff --git a/tests/automated/integration/db/client/test_delete_old_logs.py b/tests/automated/integration/db/client/test_delete_old_logs.py new file mode 100644 index 00000000..b6688340 --- /dev/null +++ b/tests/automated/integration/db/client/test_delete_old_logs.py @@ -0,0 +1,25 @@ +from datetime import datetime, timedelta + +import pytest + +from src.db.dtos.log_info import LogInfo +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_delete_old_logs(db_data_creator: DBDataCreator): + batch_id = db_data_creator.batch() + + old_datetime = datetime.now() - timedelta(days=7) + db_client = db_data_creator.db_client + adb_client = db_data_creator.adb_client + log_infos = [] + for i in range(3): + log_infos.append(LogInfo(log="test log", batch_id=batch_id, created_at=old_datetime)) + db_client.insert_logs(log_infos=log_infos) + logs = await adb_client.get_logs_by_batch_id(batch_id=batch_id) + assert len(logs) == 3 + await adb_client.delete_old_logs() + + logs = await adb_client.get_logs_by_batch_id(batch_id=batch_id) + assert len(logs) == 0 diff --git a/tests/automated/integration/db/client/test_delete_url_updated_at.py b/tests/automated/integration/db/client/test_delete_url_updated_at.py new file mode 100644 index 00000000..03ac7ae5 --- /dev/null +++ b/tests/automated/integration/db/client/test_delete_url_updated_at.py @@ -0,0 +1,24 @@ +from src.db.dtos.url_info import URLInfo +from tests.helpers.db_data_creator import DBDataCreator + + +def test_delete_url_updated_at(db_data_creator: DBDataCreator): + batch_id = db_data_creator.batch() + url_id = db_data_creator.urls(batch_id=batch_id, url_count=1).url_mappings[0].url_id + + db_client = db_data_creator.db_client + url_info = db_client.get_urls_by_batch(batch_id=batch_id, page=1)[0] + + old_updated_at = url_info.updated_at + + + db_client.update_url( + url_info=URLInfo( + id=url_id, + url="dg", + collector_metadata={"test_metadata": "test_metadata"}, + ) + ) + + url = db_client.get_urls_by_batch(batch_id=batch_id, page=1)[0] + assert url.updated_at > old_updated_at diff --git a/tests/automated/integration/db/client/test_get_next_url_for_annotation_batch_filtering.py b/tests/automated/integration/db/client/test_get_next_url_for_annotation_batch_filtering.py new file mode 100644 index 00000000..1a348aa4 --- /dev/null +++ b/tests/automated/integration/db/client/test_get_next_url_for_annotation_batch_filtering.py @@ -0,0 +1,106 @@ +import pytest + +from src.core.enums import SuggestionType +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_get_next_url_for_annotation_batch_filtering( + db_data_creator: DBDataCreator +): + """ + Test that for all annotation retrievals, batch filtering works as expected + """ + setup_info_1 = await setup_for_get_next_url_for_annotation( + db_data_creator=db_data_creator, + url_count=1 + ) + setup_info_2 = await setup_for_get_next_url_for_annotation( + db_data_creator=db_data_creator, + url_count=3 + ) + + def assert_batch_info(batch_info): + assert batch_info.total_urls == 3 + assert batch_info.count_annotated == 0 + assert batch_info.count_not_annotated == 3 + + url_1 = setup_info_1.insert_urls_info.url_mappings[0] + url_2 = setup_info_2.insert_urls_info.url_mappings[0] + + # Test for relevance + # If a batch id is provided, return first valid URL with that batch id + result_with_batch_id = await db_data_creator.adb_client.get_next_url_for_relevance_annotation( + user_id=1, + batch_id=setup_info_2.batch_id + ) + + assert result_with_batch_id.url_info.url == url_2.url + assert_batch_info(result_with_batch_id.batch_info) + # If no batch id is provided, return first valid URL + result_no_batch_id = await db_data_creator.adb_client.get_next_url_for_relevance_annotation( + user_id=1, + batch_id=None + ) + + assert result_no_batch_id.url_info.url == url_1.url + + # Test for record type + # If a batch id is provided, return first valid URL with that batch id + result_with_batch_id = await db_data_creator.adb_client.get_next_url_for_record_type_annotation( + user_id=1, + batch_id=setup_info_2.batch_id + ) + + assert result_with_batch_id.url_info.url == url_2.url + assert_batch_info(result_with_batch_id.batch_info) + + # If no batch id is provided, return first valid URL + result_no_batch_id = await db_data_creator.adb_client.get_next_url_for_record_type_annotation( + user_id=1, + batch_id=None + ) + + assert result_no_batch_id.url_info.url == url_1.url + + # Test for agency + for url in [url_1, url_2]: + await db_data_creator.auto_suggestions( + url_ids=[url.url_id], + num_suggestions=2, + suggestion_type=SuggestionType.AUTO_SUGGESTION + ) + + # If a batch id is provided, return first valid URL with that batch id + result_with_batch_id = await db_data_creator.adb_client.get_next_url_agency_for_annotation( + user_id=1, + batch_id=setup_info_2.batch_id + ) + + assert result_with_batch_id.next_annotation.url_info.url == url_2.url + assert_batch_info(result_with_batch_id.next_annotation.batch_info) + + # If no batch id is provided, return first valid URL + result_no_batch_id = await db_data_creator.adb_client.get_next_url_agency_for_annotation( + user_id=1, + batch_id=None + ) + + assert result_no_batch_id.next_annotation.url_info.url == url_1.url + + + # All annotations + result_with_batch_id = await db_data_creator.adb_client.get_next_url_for_all_annotations( + batch_id=setup_info_2.batch_id + ) + + assert result_with_batch_id.next_annotation.url_info.url == url_2.url + assert_batch_info(result_with_batch_id.next_annotation.batch_info) + + # If no batch id is provided, return first valid URL + result_no_batch_id = await db_data_creator.adb_client.get_next_url_for_all_annotations( + batch_id=None + ) + + assert result_no_batch_id.next_annotation.url_info.url == url_1.url diff --git a/tests/automated/integration/db/client/test_get_next_url_for_user_agency_annotation.py b/tests/automated/integration/db/client/test_get_next_url_for_user_agency_annotation.py new file mode 100644 index 00000000..6e548b6b --- /dev/null +++ b/tests/automated/integration/db/client/test_get_next_url_for_user_agency_annotation.py @@ -0,0 +1,61 @@ +import pytest + +from tests.helpers.complex_test_data_functions import setup_for_annotate_agency +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_get_next_url_for_user_agency_annotation(db_data_creator: DBDataCreator): + """ + All users should receive the same next valid URL for agency annotation + Once any user annotates that URL, none of the users should receive it + """ + setup_info = await setup_for_annotate_agency( + db_data_creator, + url_count=2 + ) + + # All users should receive the same URL + url_1 = setup_info.url_ids[0] + url_2 = setup_info.url_ids[1] + + adb_client = db_data_creator.adb_client + url_user_1 = await adb_client.get_next_url_agency_for_annotation( + user_id=1, + batch_id=None + ) + assert url_user_1 is not None + + url_user_2 = await adb_client.get_next_url_agency_for_annotation( + user_id=2, + batch_id=None + ) + + assert url_user_2 is not None + + # Check that the URLs are the same + assert url_user_1 == url_user_2 + + # Annotate the URL + await adb_client.add_agency_manual_suggestion( + url_id=url_1, + user_id=1, + is_new=True, + agency_id=None + ) + + # Both users should receive the next URL + next_url_user_1 = await adb_client.get_next_url_agency_for_annotation( + user_id=1, + batch_id=None + ) + assert next_url_user_1 is not None + + next_url_user_2 = await adb_client.get_next_url_agency_for_annotation( + user_id=2, + batch_id=None + ) + assert next_url_user_2 is not None + + assert url_user_1 != next_url_user_1 + assert next_url_user_1 == next_url_user_2 diff --git a/tests/automated/integration/db/client/test_get_next_url_for_user_record_type_annotation.py b/tests/automated/integration/db/client/test_get_next_url_for_user_record_type_annotation.py new file mode 100644 index 00000000..96ee16f3 --- /dev/null +++ b/tests/automated/integration/db/client/test_get_next_url_for_user_record_type_annotation.py @@ -0,0 +1,59 @@ +import pytest + +from src.core.enums import RecordType +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_get_next_url_for_user_record_type_annotation(db_data_creator: DBDataCreator): + """ + All users should receive the same next valid URL for record type annotation + Once any user annotates that URL, none of the users should receive it + """ + setup_info = await setup_for_get_next_url_for_annotation( + db_data_creator, + url_count=2 + ) + + # All users should receive the same URL + url_1 = setup_info.insert_urls_info.url_mappings[0] + url_2 = setup_info.insert_urls_info.url_mappings[1] + + adb_client = db_data_creator.adb_client + + url_user_1 = await adb_client.get_next_url_for_record_type_annotation( + user_id=1, + batch_id=None + ) + assert url_user_1 is not None + + url_user_2 = await adb_client.get_next_url_for_record_type_annotation( + user_id=2, + batch_id=None + ) + + assert url_user_2 is not None + + # Check that the URLs are the same + assert url_user_1 == url_user_2 + + # After annotating, both users should receive a different URL + await adb_client.add_user_record_type_suggestion( + user_id=1, + url_id=url_1.url_id, + record_type=RecordType.ARREST_RECORDS + ) + + next_url_user_1 = await adb_client.get_next_url_for_record_type_annotation( + user_id=1, + batch_id=None + ) + + next_url_user_2 = await adb_client.get_next_url_for_record_type_annotation( + user_id=2, + batch_id=None + ) + + assert next_url_user_1 != url_user_1 + assert next_url_user_1 == next_url_user_2 diff --git a/tests/automated/integration/db/client/test_insert_logs.py b/tests/automated/integration/db/client/test_insert_logs.py new file mode 100644 index 00000000..f8d1cb8d --- /dev/null +++ b/tests/automated/integration/db/client/test_insert_logs.py @@ -0,0 +1,26 @@ +import pytest + +from src.db.dtos.log_info import LogInfo +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_insert_logs(db_data_creator: DBDataCreator): + batch_id_1 = db_data_creator.batch() + batch_id_2 = db_data_creator.batch() + + adb_client = db_data_creator.adb_client + db_client = db_data_creator.db_client + db_client.insert_logs( + log_infos=[ + LogInfo(log="test log", batch_id=batch_id_1), + LogInfo(log="test log", batch_id=batch_id_1), + LogInfo(log="test log", batch_id=batch_id_2), + ] + ) + + logs = await adb_client.get_logs_by_batch_id(batch_id_1) + assert len(logs) == 2 + + logs = await adb_client.get_logs_by_batch_id(batch_id_2) + assert len(logs) == 1 diff --git a/tests/automated/integration/db/client/test_insert_urls.py b/tests/automated/integration/db/client/test_insert_urls.py new file mode 100644 index 00000000..5021becd --- /dev/null +++ b/tests/automated/integration/db/client/test_insert_urls.py @@ -0,0 +1,48 @@ +import pytest + +from src.core.enums import BatchStatus +from src.db.dtos.batch_info import BatchInfo +from src.db.dtos.url_info import URLInfo + + +@pytest.mark.asyncio +async def test_insert_urls( + db_client_test, + adb_client_test +): + # Insert batch + batch_info = BatchInfo( + strategy="ckan", + status=BatchStatus.IN_PROCESS, + parameters={}, + user_id=1 + ) + batch_id = await adb_client_test.insert_batch(batch_info) + + urls = [ + URLInfo( + url="https://example.com/1", + collector_metadata={"name": "example_1"}, + ), + URLInfo( + url="https://example.com/2", + ), + # Duplicate + URLInfo( + url="https://example.com/1", + collector_metadata={"name": "example_duplicate"}, + ) + ] + insert_urls_info = await adb_client_test.insert_urls( + url_infos=urls, + batch_id=batch_id + ) + + url_mappings = insert_urls_info.url_mappings + assert len(url_mappings) == 2 + assert url_mappings[0].url == "https://example.com/1" + assert url_mappings[1].url == "https://example.com/2" + + + assert insert_urls_info.original_count == 2 + assert insert_urls_info.duplicate_count == 1 diff --git a/tests/automated/integration/collector_db/test_database_structure.py b/tests/automated/integration/db/test_database_structure.py similarity index 100% rename from tests/automated/integration/collector_db/test_database_structure.py rename to tests/automated/integration/db/test_database_structure.py diff --git a/tests/automated/integration/tasks/test_agency_preannotation_task.py b/tests/automated/integration/tasks/test_agency_preannotation_task.py index d24501f3..930d742d 100644 --- a/tests/automated/integration/tasks/test_agency_preannotation_task.py +++ b/tests/automated/integration/tasks/test_agency_preannotation_task.py @@ -10,7 +10,8 @@ from src.collectors.source_collectors.muckrock.enums import AgencyLookupResponseType from src.core.tasks.operators.agency_identification.core import AgencyIdentificationTaskOperator from src.pdap_api.enums import MatchAgencyResponseStatus -from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters from src.db.models.core import Agency, AutomatedUrlAgencySuggestion from src.collectors.enums import CollectorType, URLStatus from src.core.tasks.enums import TaskOperatorOutcome diff --git a/tests/automated/integration/tasks/test_url_404_probe.py b/tests/automated/integration/tasks/test_url_404_probe.py index cd7152b5..99664438 100644 --- a/tests/automated/integration/tasks/test_url_404_probe.py +++ b/tests/automated/integration/tasks/test_url_404_probe.py @@ -12,7 +12,8 @@ from src.core.tasks.enums import TaskOperatorOutcome from src.core.tasks.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo from tests.helpers.db_data_creator import DBDataCreator -from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters @pytest.mark.asyncio diff --git a/tests/automated/integration/tasks/test_url_duplicate_task.py b/tests/automated/integration/tasks/test_url_duplicate_task.py index cc83ceca..09bcd5c6 100644 --- a/tests/automated/integration/tasks/test_url_duplicate_task.py +++ b/tests/automated/integration/tasks/test_url_duplicate_task.py @@ -9,7 +9,8 @@ from src.collectors.enums import URLStatus from src.core.tasks.enums import TaskOperatorOutcome from tests.helpers.db_data_creator import DBDataCreator -from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters from pdap_access_manager import ResponseInfo from src.pdap_api.client import PDAPClient diff --git a/tests/helpers/batch_creation_parameters/__init__.py b/tests/helpers/batch_creation_parameters/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/helpers/batch_creation_parameters/annotation_info.py b/tests/helpers/batch_creation_parameters/annotation_info.py new file mode 100644 index 00000000..034bd2c9 --- /dev/null +++ b/tests/helpers/batch_creation_parameters/annotation_info.py @@ -0,0 +1,29 @@ +from typing import Optional + +from pydantic import BaseModel + +from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.core.enums import SuggestedStatus, RecordType + + +class AnnotationInfo(BaseModel): + user_relevant: Optional[SuggestedStatus] = None + auto_relevant: Optional[bool] = None + user_record_type: Optional[RecordType] = None + auto_record_type: Optional[RecordType] = None + user_agency: Optional[URLAgencyAnnotationPostInfo] = None + auto_agency: Optional[int] = None + confirmed_agency: Optional[int] = None + final_review_approved: Optional[bool] = None + + def has_annotations(self): + return any(value is not None for value in [ + self.user_relevant, + self.auto_relevant, + self.user_record_type, + self.auto_record_type, + self.user_agency, + self.auto_agency, + self.confirmed_agency, + self.final_review_approved + ]) diff --git a/tests/helpers/batch_creation_parameters/core.py b/tests/helpers/batch_creation_parameters/core.py new file mode 100644 index 00000000..dfc33644 --- /dev/null +++ b/tests/helpers/batch_creation_parameters/core.py @@ -0,0 +1,26 @@ +import datetime +from typing import Optional + +from pydantic import BaseModel, model_validator + +from src.collectors.enums import CollectorType +from src.core.enums import BatchStatus +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters + + +class TestBatchCreationParameters(BaseModel): + created_at: Optional[datetime.datetime] = None + outcome: BatchStatus = BatchStatus.READY_TO_LABEL + strategy: CollectorType = CollectorType.EXAMPLE + urls: Optional[list[TestURLCreationParameters]] = None + + @model_validator(mode='after') + def validate_urls(self): + if self.outcome != BatchStatus.READY_TO_LABEL: + if self.urls is not None: + raise ValueError('URLs cannot be provided if outcome is not READY_TO_LABEL') + return self + + if self.urls is None: + self.urls = [TestURLCreationParameters(count=1)] + return self diff --git a/tests/helpers/batch_creation_parameters/url_creation_parameters.py b/tests/helpers/batch_creation_parameters/url_creation_parameters.py new file mode 100644 index 00000000..3998caf2 --- /dev/null +++ b/tests/helpers/batch_creation_parameters/url_creation_parameters.py @@ -0,0 +1,33 @@ +from pydantic import BaseModel, model_validator + +from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.collectors.enums import URLStatus +from src.core.enums import RecordType +from tests.helpers.batch_creation_parameters.annotation_info import AnnotationInfo + + +class TestURLCreationParameters(BaseModel): + count: int = 1 + status: URLStatus = URLStatus.PENDING + with_html_content: bool = False + annotation_info: AnnotationInfo = AnnotationInfo() + + @model_validator(mode='after') + def validate_annotation_info(self): + if self.status == URLStatus.NOT_RELEVANT: + self.annotation_info.final_review_approved = False + return self + if self.status != URLStatus.VALIDATED: + return self + + # Assume is validated + self.annotation_info.final_review_approved = True + if self.annotation_info.user_record_type is None: + self.annotation_info.user_record_type = RecordType.ARREST_RECORDS + if self.annotation_info.user_agency is None: + self.annotation_info.user_agency = URLAgencyAnnotationPostInfo( + suggested_agency=1 + ) + + + return self diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index 822b7333..156f0251 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -2,6 +2,7 @@ from pydantic import BaseModel +from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo from src.db.dtos.insert_urls_info import InsertURLsInfo from src.db.dtos.url_mapping import URLMapping from src.collectors.enums import URLStatus @@ -83,7 +84,9 @@ async def add_agency_suggestion() -> int: agency_id = await db_data_creator.agency() await db_data_creator.agency_user_suggestions( url_id=url_mapping.url_id, - agency_id=agency_id + agency_annotation_info=URLAgencyAnnotationPostInfo( + suggested_agency=agency_id + ) ) return agency_id diff --git a/tests/helpers/db_data_creator.py b/tests/helpers/db_data_creator.py index 08f1220b..335646f6 100644 --- a/tests/helpers/db_data_creator.py +++ b/tests/helpers/db_data_creator.py @@ -4,6 +4,7 @@ from pydantic import BaseModel +from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo from src.api.endpoints.review.enums import RejectionReason from src.db.client.async_ import AsyncDatabaseClient @@ -21,7 +22,8 @@ from src.core.tasks.operators.submit_approved_url.tdo import SubmittedURLInfo from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO from src.core.enums import BatchStatus, SuggestionType, RecordType, SuggestedStatus -from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, AnnotationInfo +from tests.helpers.batch_creation_parameters.annotation_info import AnnotationInfo +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters from tests.helpers.simple_test_data_functions import generate_test_urls @@ -171,7 +173,11 @@ async def auto_relevant_suggestions(self, url_id: int, relevant: bool = True): relevant=relevant ) - async def annotate(self, url_id: int, annotation_info: AnnotationInfo): + async def annotate( + self, + url_id: int, + annotation_info: AnnotationInfo + ): info = annotation_info if info.user_relevant is not None: await self.user_relevant_suggestion_v2(url_id=url_id, suggested_status=info.user_relevant) @@ -182,7 +188,7 @@ async def annotate(self, url_id: int, annotation_info: AnnotationInfo): if info.auto_record_type is not None: await self.auto_record_type_suggestions(url_id=url_id, record_type=info.auto_record_type) if info.user_agency is not None: - await self.agency_user_suggestions(url_id=url_id, agency_id=info.user_agency) + await self.agency_user_suggestions(url_id=url_id, agency_annotation_info=info.user_agency) if info.auto_agency is not None: await self.agency_auto_suggestions(url_id=url_id, count=1, suggestion_type=SuggestionType.AUTO_SUGGESTION) if info.confirmed_agency is not None: @@ -192,7 +198,8 @@ async def annotate(self, url_id: int, annotation_info: AnnotationInfo): final_review_approval_info = FinalReviewApprovalInfo( url_id=url_id, record_type=annotation_info.user_record_type, - agency_ids=[annotation_info.user_agency] if annotation_info.user_agency is not None else None, + agency_ids=[annotation_info.user_agency.suggested_agency] + if annotation_info.user_agency is not None else None, description="Test Description", ) await self.adb_client.approve_url( @@ -478,16 +485,18 @@ async def agency_user_suggestions( self, url_id: int, user_id: Optional[int] = None, - agency_id: Optional[int] = None + agency_annotation_info: Optional[URLAgencyAnnotationPostInfo] = None ): if user_id is None: user_id = randint(1, 99999999) - if agency_id is None: - agency_id = await self.agency() + if agency_annotation_info is None: + agency_annotation_info = URLAgencyAnnotationPostInfo( + suggested_agency=await self.agency() + ) await self.adb_client.add_agency_manual_suggestion( - agency_id=agency_id, + agency_id=agency_annotation_info.suggested_agency, url_id=url_id, user_id=user_id, - is_new=False + is_new=agency_annotation_info.is_new ) diff --git a/tests/helpers/test_batch_creation_parameters.py b/tests/helpers/test_batch_creation_parameters.py deleted file mode 100644 index 33fbd5e5..00000000 --- a/tests/helpers/test_batch_creation_parameters.py +++ /dev/null @@ -1,71 +0,0 @@ -import datetime -from typing import Optional - -from pydantic import BaseModel, model_validator - -from src.collectors.enums import URLStatus, CollectorType -from src.core.enums import BatchStatus, RecordType, SuggestedStatus - - -class AnnotationInfo(BaseModel): - user_relevant: Optional[SuggestedStatus] = None - auto_relevant: Optional[bool] = None - user_record_type: Optional[RecordType] = None - auto_record_type: Optional[RecordType] = None - user_agency: Optional[int] = None - auto_agency: Optional[int] = None - confirmed_agency: Optional[int] = None - final_review_approved: Optional[bool] = None - - def has_annotations(self): - return any(value is not None for value in [ - self.user_relevant, - self.auto_relevant, - self.user_record_type, - self.auto_record_type, - self.user_agency, - self.auto_agency, - self.confirmed_agency, - self.final_review_approved - ]) - -class TestURLCreationParameters(BaseModel): - count: int - status: URLStatus = URLStatus.PENDING - with_html_content: bool = False - annotation_info: AnnotationInfo = AnnotationInfo() - - @model_validator(mode='after') - def validate_annotation_info(self): - if self.status == URLStatus.NOT_RELEVANT: - self.annotation_info.final_review_approved = False - return self - if self.status != URLStatus.VALIDATED: - return self - - # Assume is validated - self.annotation_info.final_review_approved = True - if self.annotation_info.user_record_type is None: - self.annotation_info.user_record_type = RecordType.ARREST_RECORDS - if self.annotation_info.user_agency is None: - self.annotation_info.user_agency = 1 - - - return self - -class TestBatchCreationParameters(BaseModel): - created_at: Optional[datetime.datetime] = None - outcome: BatchStatus = BatchStatus.READY_TO_LABEL - strategy: CollectorType = CollectorType.EXAMPLE - urls: Optional[list[TestURLCreationParameters]] = None - - @model_validator(mode='after') - def validate_urls(self): - if self.outcome != BatchStatus.READY_TO_LABEL: - if self.urls is not None: - raise ValueError('URLs cannot be provided if outcome is not READY_TO_LABEL') - return self - - if self.urls is None: - self.urls = [TestURLCreationParameters(count=1)] - return self \ No newline at end of file From eda508c75ea0489fe85ff323aac3ca3a95fa6cbe Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 12 Jun 2025 16:16:27 -0400 Subject: [PATCH 213/244] Update PDAP Access manager --- pyproject.toml | 2 +- uv.lock | 2490 ++++++++++++++++++++++++------------------------ 2 files changed, 1246 insertions(+), 1246 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 088965dc..49c6059c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,7 @@ dependencies = [ "lxml~=5.1.0", "marshmallow~=3.23.2", "openai~=1.60.1", - "pdap-access-manager==0.3.5", + "pdap-access-manager==0.3.6", "playwright~=1.49.1", "psycopg2-binary~=2.9.6", "psycopg[binary]~=3.1.20", diff --git a/uv.lock b/uv.lock index b039ce34..f72903eb 100644 --- a/uv.lock +++ b/uv.lock @@ -11,9 +11,9 @@ resolution-markers = [ name = "aiohappyeyeballs" version = "2.6.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload_time = "2025-03-12T01:42:48.764Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload_time = "2025-03-12T01:42:47.083Z" }, ] [[package]] @@ -29,56 +29,56 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/e7/fa1a8c00e2c54b05dc8cb5d1439f627f7c267874e3f7bb047146116020f9/aiohttp-3.11.18.tar.gz", hash = "sha256:ae856e1138612b7e412db63b7708735cff4d38d0399f6a5435d3dac2669f558a", size = 7678653, upload-time = "2025-04-21T09:43:09.191Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/10/fd9ee4f9e042818c3c2390054c08ccd34556a3cb209d83285616434cf93e/aiohttp-3.11.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:427fdc56ccb6901ff8088544bde47084845ea81591deb16f957897f0f0ba1be9", size = 712088, upload-time = "2025-04-21T09:40:55.776Z" }, - { url = "https://files.pythonhosted.org/packages/22/eb/6a77f055ca56f7aae2cd2a5607a3c9e7b9554f1497a069dcfcb52bfc9540/aiohttp-3.11.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c828b6d23b984255b85b9b04a5b963a74278b7356a7de84fda5e3b76866597b", size = 471450, upload-time = "2025-04-21T09:40:57.301Z" }, - { url = "https://files.pythonhosted.org/packages/78/dc/5f3c0d27c91abf0bb5d103e9c9b0ff059f60cf6031a5f06f456c90731f42/aiohttp-3.11.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c2eaa145bb36b33af1ff2860820ba0589e165be4ab63a49aebfd0981c173b66", size = 457836, upload-time = "2025-04-21T09:40:59.322Z" }, - { url = "https://files.pythonhosted.org/packages/49/7b/55b65af9ef48b9b811c91ff8b5b9de9650c71147f10523e278d297750bc8/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d518ce32179f7e2096bf4e3e8438cf445f05fedd597f252de9f54c728574756", size = 1690978, upload-time = "2025-04-21T09:41:00.795Z" }, - { url = "https://files.pythonhosted.org/packages/a2/5a/3f8938c4f68ae400152b42742653477fc625d6bfe02e764f3521321c8442/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0700055a6e05c2f4711011a44364020d7a10fbbcd02fbf3e30e8f7e7fddc8717", size = 1745307, upload-time = "2025-04-21T09:41:02.89Z" }, - { url = "https://files.pythonhosted.org/packages/b4/42/89b694a293333ef6f771c62da022163bcf44fb03d4824372d88e3dc12530/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bd1cde83e4684324e6ee19adfc25fd649d04078179890be7b29f76b501de8e4", size = 1780692, upload-time = "2025-04-21T09:41:04.461Z" }, - { url = "https://files.pythonhosted.org/packages/e2/ce/1a75384e01dd1bf546898b6062b1b5f7a59b6692ef802e4dd6db64fed264/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73b8870fe1c9a201b8c0d12c94fe781b918664766728783241a79e0468427e4f", size = 1676934, upload-time = "2025-04-21T09:41:06.728Z" }, - { url = "https://files.pythonhosted.org/packages/a5/31/442483276e6c368ab5169797d9873b5875213cbcf7e74b95ad1c5003098a/aiohttp-3.11.18-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25557982dd36b9e32c0a3357f30804e80790ec2c4d20ac6bcc598533e04c6361", size = 1621190, upload-time = "2025-04-21T09:41:08.293Z" }, - { url = "https://files.pythonhosted.org/packages/7b/83/90274bf12c079457966008a58831a99675265b6a34b505243e004b408934/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e889c9df381a2433802991288a61e5a19ceb4f61bd14f5c9fa165655dcb1fd1", size = 1658947, upload-time = "2025-04-21T09:41:11.054Z" }, - { url = "https://files.pythonhosted.org/packages/91/c1/da9cee47a0350b78fdc93670ebe7ad74103011d7778ab4c382ca4883098d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9ea345fda05bae217b6cce2acf3682ce3b13d0d16dd47d0de7080e5e21362421", size = 1654443, upload-time = "2025-04-21T09:41:13.213Z" }, - { url = "https://files.pythonhosted.org/packages/c9/f2/73cbe18dc25d624f79a09448adfc4972f82ed6088759ddcf783cd201956c/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9f26545b9940c4b46f0a9388fd04ee3ad7064c4017b5a334dd450f616396590e", size = 1644169, upload-time = "2025-04-21T09:41:14.827Z" }, - { url = "https://files.pythonhosted.org/packages/5b/32/970b0a196c4dccb1b0cfa5b4dc3b20f63d76f1c608f41001a84b2fd23c3d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3a621d85e85dccabd700294494d7179ed1590b6d07a35709bb9bd608c7f5dd1d", size = 1728532, upload-time = "2025-04-21T09:41:17.168Z" }, - { url = "https://files.pythonhosted.org/packages/0b/50/b1dc810a41918d2ea9574e74125eb053063bc5e14aba2d98966f7d734da0/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9c23fd8d08eb9c2af3faeedc8c56e134acdaf36e2117ee059d7defa655130e5f", size = 1750310, upload-time = "2025-04-21T09:41:19.353Z" }, - { url = "https://files.pythonhosted.org/packages/95/24/39271f5990b35ff32179cc95537e92499d3791ae82af7dcf562be785cd15/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9e6b0e519067caa4fd7fb72e3e8002d16a68e84e62e7291092a5433763dc0dd", size = 1691580, upload-time = "2025-04-21T09:41:21.868Z" }, - { url = "https://files.pythonhosted.org/packages/6b/78/75d0353feb77f041460564f12fe58e456436bbc00cbbf5d676dbf0038cc2/aiohttp-3.11.18-cp311-cp311-win32.whl", hash = "sha256:122f3e739f6607e5e4c6a2f8562a6f476192a682a52bda8b4c6d4254e1138f4d", size = 417565, upload-time = "2025-04-21T09:41:24.78Z" }, - { url = "https://files.pythonhosted.org/packages/ed/97/b912dcb654634a813f8518de359364dfc45976f822116e725dc80a688eee/aiohttp-3.11.18-cp311-cp311-win_amd64.whl", hash = "sha256:e6f3c0a3a1e73e88af384b2e8a0b9f4fb73245afd47589df2afcab6b638fa0e6", size = 443652, upload-time = "2025-04-21T09:41:26.48Z" }, - { url = "https://files.pythonhosted.org/packages/b5/d2/5bc436f42bf4745c55f33e1e6a2d69e77075d3e768e3d1a34f96ee5298aa/aiohttp-3.11.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:63d71eceb9cad35d47d71f78edac41fcd01ff10cacaa64e473d1aec13fa02df2", size = 706671, upload-time = "2025-04-21T09:41:28.021Z" }, - { url = "https://files.pythonhosted.org/packages/fe/d0/2dbabecc4e078c0474abb40536bbde717fb2e39962f41c5fc7a216b18ea7/aiohttp-3.11.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d1929da615840969929e8878d7951b31afe0bac883d84418f92e5755d7b49508", size = 466169, upload-time = "2025-04-21T09:41:29.783Z" }, - { url = "https://files.pythonhosted.org/packages/70/84/19edcf0b22933932faa6e0be0d933a27bd173da02dc125b7354dff4d8da4/aiohttp-3.11.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d0aebeb2392f19b184e3fdd9e651b0e39cd0f195cdb93328bd124a1d455cd0e", size = 457554, upload-time = "2025-04-21T09:41:31.327Z" }, - { url = "https://files.pythonhosted.org/packages/32/d0/e8d1f034ae5624a0f21e4fb3feff79342ce631f3a4d26bd3e58b31ef033b/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3849ead845e8444f7331c284132ab314b4dac43bfae1e3cf350906d4fff4620f", size = 1690154, upload-time = "2025-04-21T09:41:33.541Z" }, - { url = "https://files.pythonhosted.org/packages/16/de/2f9dbe2ac6f38f8495562077131888e0d2897e3798a0ff3adda766b04a34/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e8452ad6b2863709f8b3d615955aa0807bc093c34b8e25b3b52097fe421cb7f", size = 1733402, upload-time = "2025-04-21T09:41:35.634Z" }, - { url = "https://files.pythonhosted.org/packages/e0/04/bd2870e1e9aef990d14b6df2a695f17807baf5c85a4c187a492bda569571/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b8d2b42073611c860a37f718b3d61ae8b4c2b124b2e776e2c10619d920350ec", size = 1783958, upload-time = "2025-04-21T09:41:37.456Z" }, - { url = "https://files.pythonhosted.org/packages/23/06/4203ffa2beb5bedb07f0da0f79b7d9039d1c33f522e0d1a2d5b6218e6f2e/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fbf91f6a0ac317c0a07eb328a1384941872f6761f2e6f7208b63c4cc0a7ff6", size = 1695288, upload-time = "2025-04-21T09:41:39.756Z" }, - { url = "https://files.pythonhosted.org/packages/30/b2/e2285dda065d9f29ab4b23d8bcc81eb881db512afb38a3f5247b191be36c/aiohttp-3.11.18-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ff5625413fec55216da5eaa011cf6b0a2ed67a565914a212a51aa3755b0009", size = 1618871, upload-time = "2025-04-21T09:41:41.972Z" }, - { url = "https://files.pythonhosted.org/packages/57/e0/88f2987885d4b646de2036f7296ebea9268fdbf27476da551c1a7c158bc0/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7f33a92a2fde08e8c6b0c61815521324fc1612f397abf96eed86b8e31618fdb4", size = 1646262, upload-time = "2025-04-21T09:41:44.192Z" }, - { url = "https://files.pythonhosted.org/packages/e0/19/4d2da508b4c587e7472a032290b2981f7caeca82b4354e19ab3df2f51d56/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:11d5391946605f445ddafda5eab11caf310f90cdda1fd99865564e3164f5cff9", size = 1677431, upload-time = "2025-04-21T09:41:46.049Z" }, - { url = "https://files.pythonhosted.org/packages/eb/ae/047473ea50150a41440f3265f53db1738870b5a1e5406ece561ca61a3bf4/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3cc314245deb311364884e44242e00c18b5896e4fe6d5f942e7ad7e4cb640adb", size = 1637430, upload-time = "2025-04-21T09:41:47.973Z" }, - { url = "https://files.pythonhosted.org/packages/11/32/c6d1e3748077ce7ee13745fae33e5cb1dac3e3b8f8787bf738a93c94a7d2/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f421843b0f70740772228b9e8093289924359d306530bcd3926f39acbe1adda", size = 1703342, upload-time = "2025-04-21T09:41:50.323Z" }, - { url = "https://files.pythonhosted.org/packages/c5/1d/a3b57bfdbe285f0d45572d6d8f534fd58761da3e9cbc3098372565005606/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e220e7562467dc8d589e31c1acd13438d82c03d7f385c9cd41a3f6d1d15807c1", size = 1740600, upload-time = "2025-04-21T09:41:52.111Z" }, - { url = "https://files.pythonhosted.org/packages/a5/71/f9cd2fed33fa2b7ce4d412fb7876547abb821d5b5520787d159d0748321d/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab2ef72f8605046115bc9aa8e9d14fd49086d405855f40b79ed9e5c1f9f4faea", size = 1695131, upload-time = "2025-04-21T09:41:53.94Z" }, - { url = "https://files.pythonhosted.org/packages/97/97/d1248cd6d02b9de6aa514793d0dcb20099f0ec47ae71a933290116c070c5/aiohttp-3.11.18-cp312-cp312-win32.whl", hash = "sha256:12a62691eb5aac58d65200c7ae94d73e8a65c331c3a86a2e9670927e94339ee8", size = 412442, upload-time = "2025-04-21T09:41:55.689Z" }, - { url = "https://files.pythonhosted.org/packages/33/9a/e34e65506e06427b111e19218a99abf627638a9703f4b8bcc3e3021277ed/aiohttp-3.11.18-cp312-cp312-win_amd64.whl", hash = "sha256:364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8", size = 439444, upload-time = "2025-04-21T09:41:57.977Z" }, - { url = "https://files.pythonhosted.org/packages/0a/18/be8b5dd6b9cf1b2172301dbed28e8e5e878ee687c21947a6c81d6ceaa15d/aiohttp-3.11.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:474215ec618974054cf5dc465497ae9708543cbfc312c65212325d4212525811", size = 699833, upload-time = "2025-04-21T09:42:00.298Z" }, - { url = "https://files.pythonhosted.org/packages/0d/84/ecdc68e293110e6f6f6d7b57786a77555a85f70edd2b180fb1fafaff361a/aiohttp-3.11.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ced70adf03920d4e67c373fd692123e34d3ac81dfa1c27e45904a628567d804", size = 462774, upload-time = "2025-04-21T09:42:02.015Z" }, - { url = "https://files.pythonhosted.org/packages/d7/85/f07718cca55884dad83cc2433746384d267ee970e91f0dcc75c6d5544079/aiohttp-3.11.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d9f6c0152f8d71361905aaf9ed979259537981f47ad099c8b3d81e0319814bd", size = 454429, upload-time = "2025-04-21T09:42:03.728Z" }, - { url = "https://files.pythonhosted.org/packages/82/02/7f669c3d4d39810db8842c4e572ce4fe3b3a9b82945fdd64affea4c6947e/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a35197013ed929c0aed5c9096de1fc5a9d336914d73ab3f9df14741668c0616c", size = 1670283, upload-time = "2025-04-21T09:42:06.053Z" }, - { url = "https://files.pythonhosted.org/packages/ec/79/b82a12f67009b377b6c07a26bdd1b81dab7409fc2902d669dbfa79e5ac02/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:540b8a1f3a424f1af63e0af2d2853a759242a1769f9f1ab053996a392bd70118", size = 1717231, upload-time = "2025-04-21T09:42:07.953Z" }, - { url = "https://files.pythonhosted.org/packages/a6/38/d5a1f28c3904a840642b9a12c286ff41fc66dfa28b87e204b1f242dbd5e6/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9e6710ebebfce2ba21cee6d91e7452d1125100f41b906fb5af3da8c78b764c1", size = 1769621, upload-time = "2025-04-21T09:42:09.855Z" }, - { url = "https://files.pythonhosted.org/packages/53/2d/deb3749ba293e716b5714dda06e257f123c5b8679072346b1eb28b766a0b/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8af2ef3b4b652ff109f98087242e2ab974b2b2b496304063585e3d78de0b000", size = 1678667, upload-time = "2025-04-21T09:42:11.741Z" }, - { url = "https://files.pythonhosted.org/packages/b8/a8/04b6e11683a54e104b984bd19a9790eb1ae5f50968b601bb202d0406f0ff/aiohttp-3.11.18-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28c3f975e5ae3dbcbe95b7e3dcd30e51da561a0a0f2cfbcdea30fc1308d72137", size = 1601592, upload-time = "2025-04-21T09:42:14.137Z" }, - { url = "https://files.pythonhosted.org/packages/5e/9d/c33305ae8370b789423623f0e073d09ac775cd9c831ac0f11338b81c16e0/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c28875e316c7b4c3e745172d882d8a5c835b11018e33432d281211af35794a93", size = 1621679, upload-time = "2025-04-21T09:42:16.056Z" }, - { url = "https://files.pythonhosted.org/packages/56/45/8e9a27fff0538173d47ba60362823358f7a5f1653c6c30c613469f94150e/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:13cd38515568ae230e1ef6919e2e33da5d0f46862943fcda74e7e915096815f3", size = 1656878, upload-time = "2025-04-21T09:42:18.368Z" }, - { url = "https://files.pythonhosted.org/packages/84/5b/8c5378f10d7a5a46b10cb9161a3aac3eeae6dba54ec0f627fc4ddc4f2e72/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0e2a92101efb9f4c2942252c69c63ddb26d20f46f540c239ccfa5af865197bb8", size = 1620509, upload-time = "2025-04-21T09:42:20.141Z" }, - { url = "https://files.pythonhosted.org/packages/9e/2f/99dee7bd91c62c5ff0aa3c55f4ae7e1bc99c6affef780d7777c60c5b3735/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e6d3e32b8753c8d45ac550b11a1090dd66d110d4ef805ffe60fa61495360b3b2", size = 1680263, upload-time = "2025-04-21T09:42:21.993Z" }, - { url = "https://files.pythonhosted.org/packages/03/0a/378745e4ff88acb83e2d5c884a4fe993a6e9f04600a4560ce0e9b19936e3/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ea4cf2488156e0f281f93cc2fd365025efcba3e2d217cbe3df2840f8c73db261", size = 1715014, upload-time = "2025-04-21T09:42:23.87Z" }, - { url = "https://files.pythonhosted.org/packages/f6/0b/b5524b3bb4b01e91bc4323aad0c2fcaebdf2f1b4d2eb22743948ba364958/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d4df95ad522c53f2b9ebc07f12ccd2cb15550941e11a5bbc5ddca2ca56316d7", size = 1666614, upload-time = "2025-04-21T09:42:25.764Z" }, - { url = "https://files.pythonhosted.org/packages/c7/b7/3d7b036d5a4ed5a4c704e0754afe2eef24a824dfab08e6efbffb0f6dd36a/aiohttp-3.11.18-cp313-cp313-win32.whl", hash = "sha256:cdd1bbaf1e61f0d94aced116d6e95fe25942f7a5f42382195fd9501089db5d78", size = 411358, upload-time = "2025-04-21T09:42:27.558Z" }, - { url = "https://files.pythonhosted.org/packages/1e/3c/143831b32cd23b5263a995b2a1794e10aa42f8a895aae5074c20fda36c07/aiohttp-3.11.18-cp313-cp313-win_amd64.whl", hash = "sha256:bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01", size = 437658, upload-time = "2025-04-21T09:42:29.209Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/63/e7/fa1a8c00e2c54b05dc8cb5d1439f627f7c267874e3f7bb047146116020f9/aiohttp-3.11.18.tar.gz", hash = "sha256:ae856e1138612b7e412db63b7708735cff4d38d0399f6a5435d3dac2669f558a", size = 7678653, upload_time = "2025-04-21T09:43:09.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/10/fd9ee4f9e042818c3c2390054c08ccd34556a3cb209d83285616434cf93e/aiohttp-3.11.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:427fdc56ccb6901ff8088544bde47084845ea81591deb16f957897f0f0ba1be9", size = 712088, upload_time = "2025-04-21T09:40:55.776Z" }, + { url = "https://files.pythonhosted.org/packages/22/eb/6a77f055ca56f7aae2cd2a5607a3c9e7b9554f1497a069dcfcb52bfc9540/aiohttp-3.11.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c828b6d23b984255b85b9b04a5b963a74278b7356a7de84fda5e3b76866597b", size = 471450, upload_time = "2025-04-21T09:40:57.301Z" }, + { url = "https://files.pythonhosted.org/packages/78/dc/5f3c0d27c91abf0bb5d103e9c9b0ff059f60cf6031a5f06f456c90731f42/aiohttp-3.11.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c2eaa145bb36b33af1ff2860820ba0589e165be4ab63a49aebfd0981c173b66", size = 457836, upload_time = "2025-04-21T09:40:59.322Z" }, + { url = "https://files.pythonhosted.org/packages/49/7b/55b65af9ef48b9b811c91ff8b5b9de9650c71147f10523e278d297750bc8/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d518ce32179f7e2096bf4e3e8438cf445f05fedd597f252de9f54c728574756", size = 1690978, upload_time = "2025-04-21T09:41:00.795Z" }, + { url = "https://files.pythonhosted.org/packages/a2/5a/3f8938c4f68ae400152b42742653477fc625d6bfe02e764f3521321c8442/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0700055a6e05c2f4711011a44364020d7a10fbbcd02fbf3e30e8f7e7fddc8717", size = 1745307, upload_time = "2025-04-21T09:41:02.89Z" }, + { url = "https://files.pythonhosted.org/packages/b4/42/89b694a293333ef6f771c62da022163bcf44fb03d4824372d88e3dc12530/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bd1cde83e4684324e6ee19adfc25fd649d04078179890be7b29f76b501de8e4", size = 1780692, upload_time = "2025-04-21T09:41:04.461Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ce/1a75384e01dd1bf546898b6062b1b5f7a59b6692ef802e4dd6db64fed264/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73b8870fe1c9a201b8c0d12c94fe781b918664766728783241a79e0468427e4f", size = 1676934, upload_time = "2025-04-21T09:41:06.728Z" }, + { url = "https://files.pythonhosted.org/packages/a5/31/442483276e6c368ab5169797d9873b5875213cbcf7e74b95ad1c5003098a/aiohttp-3.11.18-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25557982dd36b9e32c0a3357f30804e80790ec2c4d20ac6bcc598533e04c6361", size = 1621190, upload_time = "2025-04-21T09:41:08.293Z" }, + { url = "https://files.pythonhosted.org/packages/7b/83/90274bf12c079457966008a58831a99675265b6a34b505243e004b408934/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e889c9df381a2433802991288a61e5a19ceb4f61bd14f5c9fa165655dcb1fd1", size = 1658947, upload_time = "2025-04-21T09:41:11.054Z" }, + { url = "https://files.pythonhosted.org/packages/91/c1/da9cee47a0350b78fdc93670ebe7ad74103011d7778ab4c382ca4883098d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9ea345fda05bae217b6cce2acf3682ce3b13d0d16dd47d0de7080e5e21362421", size = 1654443, upload_time = "2025-04-21T09:41:13.213Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f2/73cbe18dc25d624f79a09448adfc4972f82ed6088759ddcf783cd201956c/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9f26545b9940c4b46f0a9388fd04ee3ad7064c4017b5a334dd450f616396590e", size = 1644169, upload_time = "2025-04-21T09:41:14.827Z" }, + { url = "https://files.pythonhosted.org/packages/5b/32/970b0a196c4dccb1b0cfa5b4dc3b20f63d76f1c608f41001a84b2fd23c3d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3a621d85e85dccabd700294494d7179ed1590b6d07a35709bb9bd608c7f5dd1d", size = 1728532, upload_time = "2025-04-21T09:41:17.168Z" }, + { url = "https://files.pythonhosted.org/packages/0b/50/b1dc810a41918d2ea9574e74125eb053063bc5e14aba2d98966f7d734da0/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9c23fd8d08eb9c2af3faeedc8c56e134acdaf36e2117ee059d7defa655130e5f", size = 1750310, upload_time = "2025-04-21T09:41:19.353Z" }, + { url = "https://files.pythonhosted.org/packages/95/24/39271f5990b35ff32179cc95537e92499d3791ae82af7dcf562be785cd15/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9e6b0e519067caa4fd7fb72e3e8002d16a68e84e62e7291092a5433763dc0dd", size = 1691580, upload_time = "2025-04-21T09:41:21.868Z" }, + { url = "https://files.pythonhosted.org/packages/6b/78/75d0353feb77f041460564f12fe58e456436bbc00cbbf5d676dbf0038cc2/aiohttp-3.11.18-cp311-cp311-win32.whl", hash = "sha256:122f3e739f6607e5e4c6a2f8562a6f476192a682a52bda8b4c6d4254e1138f4d", size = 417565, upload_time = "2025-04-21T09:41:24.78Z" }, + { url = "https://files.pythonhosted.org/packages/ed/97/b912dcb654634a813f8518de359364dfc45976f822116e725dc80a688eee/aiohttp-3.11.18-cp311-cp311-win_amd64.whl", hash = "sha256:e6f3c0a3a1e73e88af384b2e8a0b9f4fb73245afd47589df2afcab6b638fa0e6", size = 443652, upload_time = "2025-04-21T09:41:26.48Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d2/5bc436f42bf4745c55f33e1e6a2d69e77075d3e768e3d1a34f96ee5298aa/aiohttp-3.11.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:63d71eceb9cad35d47d71f78edac41fcd01ff10cacaa64e473d1aec13fa02df2", size = 706671, upload_time = "2025-04-21T09:41:28.021Z" }, + { url = "https://files.pythonhosted.org/packages/fe/d0/2dbabecc4e078c0474abb40536bbde717fb2e39962f41c5fc7a216b18ea7/aiohttp-3.11.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d1929da615840969929e8878d7951b31afe0bac883d84418f92e5755d7b49508", size = 466169, upload_time = "2025-04-21T09:41:29.783Z" }, + { url = "https://files.pythonhosted.org/packages/70/84/19edcf0b22933932faa6e0be0d933a27bd173da02dc125b7354dff4d8da4/aiohttp-3.11.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d0aebeb2392f19b184e3fdd9e651b0e39cd0f195cdb93328bd124a1d455cd0e", size = 457554, upload_time = "2025-04-21T09:41:31.327Z" }, + { url = "https://files.pythonhosted.org/packages/32/d0/e8d1f034ae5624a0f21e4fb3feff79342ce631f3a4d26bd3e58b31ef033b/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3849ead845e8444f7331c284132ab314b4dac43bfae1e3cf350906d4fff4620f", size = 1690154, upload_time = "2025-04-21T09:41:33.541Z" }, + { url = "https://files.pythonhosted.org/packages/16/de/2f9dbe2ac6f38f8495562077131888e0d2897e3798a0ff3adda766b04a34/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e8452ad6b2863709f8b3d615955aa0807bc093c34b8e25b3b52097fe421cb7f", size = 1733402, upload_time = "2025-04-21T09:41:35.634Z" }, + { url = "https://files.pythonhosted.org/packages/e0/04/bd2870e1e9aef990d14b6df2a695f17807baf5c85a4c187a492bda569571/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b8d2b42073611c860a37f718b3d61ae8b4c2b124b2e776e2c10619d920350ec", size = 1783958, upload_time = "2025-04-21T09:41:37.456Z" }, + { url = "https://files.pythonhosted.org/packages/23/06/4203ffa2beb5bedb07f0da0f79b7d9039d1c33f522e0d1a2d5b6218e6f2e/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fbf91f6a0ac317c0a07eb328a1384941872f6761f2e6f7208b63c4cc0a7ff6", size = 1695288, upload_time = "2025-04-21T09:41:39.756Z" }, + { url = "https://files.pythonhosted.org/packages/30/b2/e2285dda065d9f29ab4b23d8bcc81eb881db512afb38a3f5247b191be36c/aiohttp-3.11.18-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ff5625413fec55216da5eaa011cf6b0a2ed67a565914a212a51aa3755b0009", size = 1618871, upload_time = "2025-04-21T09:41:41.972Z" }, + { url = "https://files.pythonhosted.org/packages/57/e0/88f2987885d4b646de2036f7296ebea9268fdbf27476da551c1a7c158bc0/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7f33a92a2fde08e8c6b0c61815521324fc1612f397abf96eed86b8e31618fdb4", size = 1646262, upload_time = "2025-04-21T09:41:44.192Z" }, + { url = "https://files.pythonhosted.org/packages/e0/19/4d2da508b4c587e7472a032290b2981f7caeca82b4354e19ab3df2f51d56/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:11d5391946605f445ddafda5eab11caf310f90cdda1fd99865564e3164f5cff9", size = 1677431, upload_time = "2025-04-21T09:41:46.049Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ae/047473ea50150a41440f3265f53db1738870b5a1e5406ece561ca61a3bf4/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3cc314245deb311364884e44242e00c18b5896e4fe6d5f942e7ad7e4cb640adb", size = 1637430, upload_time = "2025-04-21T09:41:47.973Z" }, + { url = "https://files.pythonhosted.org/packages/11/32/c6d1e3748077ce7ee13745fae33e5cb1dac3e3b8f8787bf738a93c94a7d2/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f421843b0f70740772228b9e8093289924359d306530bcd3926f39acbe1adda", size = 1703342, upload_time = "2025-04-21T09:41:50.323Z" }, + { url = "https://files.pythonhosted.org/packages/c5/1d/a3b57bfdbe285f0d45572d6d8f534fd58761da3e9cbc3098372565005606/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e220e7562467dc8d589e31c1acd13438d82c03d7f385c9cd41a3f6d1d15807c1", size = 1740600, upload_time = "2025-04-21T09:41:52.111Z" }, + { url = "https://files.pythonhosted.org/packages/a5/71/f9cd2fed33fa2b7ce4d412fb7876547abb821d5b5520787d159d0748321d/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab2ef72f8605046115bc9aa8e9d14fd49086d405855f40b79ed9e5c1f9f4faea", size = 1695131, upload_time = "2025-04-21T09:41:53.94Z" }, + { url = "https://files.pythonhosted.org/packages/97/97/d1248cd6d02b9de6aa514793d0dcb20099f0ec47ae71a933290116c070c5/aiohttp-3.11.18-cp312-cp312-win32.whl", hash = "sha256:12a62691eb5aac58d65200c7ae94d73e8a65c331c3a86a2e9670927e94339ee8", size = 412442, upload_time = "2025-04-21T09:41:55.689Z" }, + { url = "https://files.pythonhosted.org/packages/33/9a/e34e65506e06427b111e19218a99abf627638a9703f4b8bcc3e3021277ed/aiohttp-3.11.18-cp312-cp312-win_amd64.whl", hash = "sha256:364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8", size = 439444, upload_time = "2025-04-21T09:41:57.977Z" }, + { url = "https://files.pythonhosted.org/packages/0a/18/be8b5dd6b9cf1b2172301dbed28e8e5e878ee687c21947a6c81d6ceaa15d/aiohttp-3.11.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:474215ec618974054cf5dc465497ae9708543cbfc312c65212325d4212525811", size = 699833, upload_time = "2025-04-21T09:42:00.298Z" }, + { url = "https://files.pythonhosted.org/packages/0d/84/ecdc68e293110e6f6f6d7b57786a77555a85f70edd2b180fb1fafaff361a/aiohttp-3.11.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ced70adf03920d4e67c373fd692123e34d3ac81dfa1c27e45904a628567d804", size = 462774, upload_time = "2025-04-21T09:42:02.015Z" }, + { url = "https://files.pythonhosted.org/packages/d7/85/f07718cca55884dad83cc2433746384d267ee970e91f0dcc75c6d5544079/aiohttp-3.11.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d9f6c0152f8d71361905aaf9ed979259537981f47ad099c8b3d81e0319814bd", size = 454429, upload_time = "2025-04-21T09:42:03.728Z" }, + { url = "https://files.pythonhosted.org/packages/82/02/7f669c3d4d39810db8842c4e572ce4fe3b3a9b82945fdd64affea4c6947e/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a35197013ed929c0aed5c9096de1fc5a9d336914d73ab3f9df14741668c0616c", size = 1670283, upload_time = "2025-04-21T09:42:06.053Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/b82a12f67009b377b6c07a26bdd1b81dab7409fc2902d669dbfa79e5ac02/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:540b8a1f3a424f1af63e0af2d2853a759242a1769f9f1ab053996a392bd70118", size = 1717231, upload_time = "2025-04-21T09:42:07.953Z" }, + { url = "https://files.pythonhosted.org/packages/a6/38/d5a1f28c3904a840642b9a12c286ff41fc66dfa28b87e204b1f242dbd5e6/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9e6710ebebfce2ba21cee6d91e7452d1125100f41b906fb5af3da8c78b764c1", size = 1769621, upload_time = "2025-04-21T09:42:09.855Z" }, + { url = "https://files.pythonhosted.org/packages/53/2d/deb3749ba293e716b5714dda06e257f123c5b8679072346b1eb28b766a0b/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8af2ef3b4b652ff109f98087242e2ab974b2b2b496304063585e3d78de0b000", size = 1678667, upload_time = "2025-04-21T09:42:11.741Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a8/04b6e11683a54e104b984bd19a9790eb1ae5f50968b601bb202d0406f0ff/aiohttp-3.11.18-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28c3f975e5ae3dbcbe95b7e3dcd30e51da561a0a0f2cfbcdea30fc1308d72137", size = 1601592, upload_time = "2025-04-21T09:42:14.137Z" }, + { url = "https://files.pythonhosted.org/packages/5e/9d/c33305ae8370b789423623f0e073d09ac775cd9c831ac0f11338b81c16e0/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c28875e316c7b4c3e745172d882d8a5c835b11018e33432d281211af35794a93", size = 1621679, upload_time = "2025-04-21T09:42:16.056Z" }, + { url = "https://files.pythonhosted.org/packages/56/45/8e9a27fff0538173d47ba60362823358f7a5f1653c6c30c613469f94150e/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:13cd38515568ae230e1ef6919e2e33da5d0f46862943fcda74e7e915096815f3", size = 1656878, upload_time = "2025-04-21T09:42:18.368Z" }, + { url = "https://files.pythonhosted.org/packages/84/5b/8c5378f10d7a5a46b10cb9161a3aac3eeae6dba54ec0f627fc4ddc4f2e72/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0e2a92101efb9f4c2942252c69c63ddb26d20f46f540c239ccfa5af865197bb8", size = 1620509, upload_time = "2025-04-21T09:42:20.141Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2f/99dee7bd91c62c5ff0aa3c55f4ae7e1bc99c6affef780d7777c60c5b3735/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e6d3e32b8753c8d45ac550b11a1090dd66d110d4ef805ffe60fa61495360b3b2", size = 1680263, upload_time = "2025-04-21T09:42:21.993Z" }, + { url = "https://files.pythonhosted.org/packages/03/0a/378745e4ff88acb83e2d5c884a4fe993a6e9f04600a4560ce0e9b19936e3/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ea4cf2488156e0f281f93cc2fd365025efcba3e2d217cbe3df2840f8c73db261", size = 1715014, upload_time = "2025-04-21T09:42:23.87Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0b/b5524b3bb4b01e91bc4323aad0c2fcaebdf2f1b4d2eb22743948ba364958/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d4df95ad522c53f2b9ebc07f12ccd2cb15550941e11a5bbc5ddca2ca56316d7", size = 1666614, upload_time = "2025-04-21T09:42:25.764Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b7/3d7b036d5a4ed5a4c704e0754afe2eef24a824dfab08e6efbffb0f6dd36a/aiohttp-3.11.18-cp313-cp313-win32.whl", hash = "sha256:cdd1bbaf1e61f0d94aced116d6e95fe25942f7a5f42382195fd9501089db5d78", size = 411358, upload_time = "2025-04-21T09:42:27.558Z" }, + { url = "https://files.pythonhosted.org/packages/1e/3c/143831b32cd23b5263a995b2a1794e10aa42f8a895aae5074c20fda36c07/aiohttp-3.11.18-cp313-cp313-win_amd64.whl", hash = "sha256:bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01", size = 437658, upload_time = "2025-04-21T09:42:29.209Z" }, ] [[package]] @@ -88,9 +88,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frozenlist" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424, upload-time = "2024-12-13T17:10:40.86Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424, upload_time = "2024-12-13T17:10:40.86Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597, upload-time = "2024-12-13T17:10:38.469Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597, upload_time = "2024-12-13T17:10:38.469Z" }, ] [[package]] @@ -102,18 +102,18 @@ dependencies = [ { name = "sqlalchemy" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/09/f844822e4e847a3f0bd41797f93c4674cd4d2462a3f6c459aa528cdf786e/alembic-1.14.1.tar.gz", hash = "sha256:496e888245a53adf1498fcab31713a469c65836f8de76e01399aa1c3e90dd213", size = 1918219, upload-time = "2025-01-19T23:15:30.12Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/09/f844822e4e847a3f0bd41797f93c4674cd4d2462a3f6c459aa528cdf786e/alembic-1.14.1.tar.gz", hash = "sha256:496e888245a53adf1498fcab31713a469c65836f8de76e01399aa1c3e90dd213", size = 1918219, upload_time = "2025-01-19T23:15:30.12Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/7e/ac0991d1745f7d755fc1cd381b3990a45b404b4d008fc75e2a983516fbfe/alembic-1.14.1-py3-none-any.whl", hash = "sha256:1acdd7a3a478e208b0503cd73614d5e4c6efafa4e73518bb60e4f2846a37b1c5", size = 233565, upload-time = "2025-01-19T23:15:32.523Z" }, + { url = "https://files.pythonhosted.org/packages/54/7e/ac0991d1745f7d755fc1cd381b3990a45b404b4d008fc75e2a983516fbfe/alembic-1.14.1-py3-none-any.whl", hash = "sha256:1acdd7a3a478e208b0503cd73614d5e4c6efafa4e73518bb60e4f2846a37b1c5", size = 233565, upload_time = "2025-01-19T23:15:32.523Z" }, ] [[package]] name = "annotated-types" version = "0.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload_time = "2024-05-20T21:33:25.928Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload_time = "2024-05-20T21:33:24.1Z" }, ] [[package]] @@ -125,9 +125,9 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload_time = "2025-03-17T00:02:54.77Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload_time = "2025-03-17T00:02:52.713Z" }, ] [[package]] @@ -137,50 +137,50 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tzlocal" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4e/00/6d6814ddc19be2df62c8c898c4df6b5b1914f3bd024b780028caa392d186/apscheduler-3.11.0.tar.gz", hash = "sha256:4c622d250b0955a65d5d0eb91c33e6d43fd879834bf541e0a18661ae60460133", size = 107347, upload-time = "2024-11-24T19:39:26.463Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/00/6d6814ddc19be2df62c8c898c4df6b5b1914f3bd024b780028caa392d186/apscheduler-3.11.0.tar.gz", hash = "sha256:4c622d250b0955a65d5d0eb91c33e6d43fd879834bf541e0a18661ae60460133", size = 107347, upload_time = "2024-11-24T19:39:26.463Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/ae/9a053dd9229c0fde6b1f1f33f609ccff1ee79ddda364c756a924c6d8563b/APScheduler-3.11.0-py3-none-any.whl", hash = "sha256:fc134ca32e50f5eadcc4938e3a4545ab19131435e851abb40b34d63d5141c6da", size = 64004, upload-time = "2024-11-24T19:39:24.442Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ae/9a053dd9229c0fde6b1f1f33f609ccff1ee79ddda364c756a924c6d8563b/APScheduler-3.11.0-py3-none-any.whl", hash = "sha256:fc134ca32e50f5eadcc4938e3a4545ab19131435e851abb40b34d63d5141c6da", size = 64004, upload_time = "2024-11-24T19:39:24.442Z" }, ] [[package]] name = "asyncpg" version = "0.30.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/4c/7c991e080e106d854809030d8584e15b2e996e26f16aee6d757e387bc17d/asyncpg-0.30.0.tar.gz", hash = "sha256:c551e9928ab6707602f44811817f82ba3c446e018bfe1d3abecc8ba5f3eac851", size = 957746, upload-time = "2024-10-20T00:30:41.127Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/0e/f5d708add0d0b97446c402db7e8dd4c4183c13edaabe8a8500b411e7b495/asyncpg-0.30.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5e0511ad3dec5f6b4f7a9e063591d407eee66b88c14e2ea636f187da1dcfff6a", size = 674506, upload-time = "2024-10-20T00:29:27.988Z" }, - { url = "https://files.pythonhosted.org/packages/6a/a0/67ec9a75cb24a1d99f97b8437c8d56da40e6f6bd23b04e2f4ea5d5ad82ac/asyncpg-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:915aeb9f79316b43c3207363af12d0e6fd10776641a7de8a01212afd95bdf0ed", size = 645922, upload-time = "2024-10-20T00:29:29.391Z" }, - { url = "https://files.pythonhosted.org/packages/5c/d9/a7584f24174bd86ff1053b14bb841f9e714380c672f61c906eb01d8ec433/asyncpg-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c198a00cce9506fcd0bf219a799f38ac7a237745e1d27f0e1f66d3707c84a5a", size = 3079565, upload-time = "2024-10-20T00:29:30.832Z" }, - { url = "https://files.pythonhosted.org/packages/a0/d7/a4c0f9660e333114bdb04d1a9ac70db690dd4ae003f34f691139a5cbdae3/asyncpg-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3326e6d7381799e9735ca2ec9fd7be4d5fef5dcbc3cb555d8a463d8460607956", size = 3109962, upload-time = "2024-10-20T00:29:33.114Z" }, - { url = "https://files.pythonhosted.org/packages/3c/21/199fd16b5a981b1575923cbb5d9cf916fdc936b377e0423099f209e7e73d/asyncpg-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:51da377487e249e35bd0859661f6ee2b81db11ad1f4fc036194bc9cb2ead5056", size = 3064791, upload-time = "2024-10-20T00:29:34.677Z" }, - { url = "https://files.pythonhosted.org/packages/77/52/0004809b3427534a0c9139c08c87b515f1c77a8376a50ae29f001e53962f/asyncpg-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc6d84136f9c4d24d358f3b02be4b6ba358abd09f80737d1ac7c444f36108454", size = 3188696, upload-time = "2024-10-20T00:29:36.389Z" }, - { url = "https://files.pythonhosted.org/packages/52/cb/fbad941cd466117be58b774a3f1cc9ecc659af625f028b163b1e646a55fe/asyncpg-0.30.0-cp311-cp311-win32.whl", hash = "sha256:574156480df14f64c2d76450a3f3aaaf26105869cad3865041156b38459e935d", size = 567358, upload-time = "2024-10-20T00:29:37.915Z" }, - { url = "https://files.pythonhosted.org/packages/3c/0a/0a32307cf166d50e1ad120d9b81a33a948a1a5463ebfa5a96cc5606c0863/asyncpg-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:3356637f0bd830407b5597317b3cb3571387ae52ddc3bca6233682be88bbbc1f", size = 629375, upload-time = "2024-10-20T00:29:39.987Z" }, - { url = "https://files.pythonhosted.org/packages/4b/64/9d3e887bb7b01535fdbc45fbd5f0a8447539833b97ee69ecdbb7a79d0cb4/asyncpg-0.30.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c902a60b52e506d38d7e80e0dd5399f657220f24635fee368117b8b5fce1142e", size = 673162, upload-time = "2024-10-20T00:29:41.88Z" }, - { url = "https://files.pythonhosted.org/packages/6e/eb/8b236663f06984f212a087b3e849731f917ab80f84450e943900e8ca4052/asyncpg-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aca1548e43bbb9f0f627a04666fedaca23db0a31a84136ad1f868cb15deb6e3a", size = 637025, upload-time = "2024-10-20T00:29:43.352Z" }, - { url = "https://files.pythonhosted.org/packages/cc/57/2dc240bb263d58786cfaa60920779af6e8d32da63ab9ffc09f8312bd7a14/asyncpg-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c2a2ef565400234a633da0eafdce27e843836256d40705d83ab7ec42074efb3", size = 3496243, upload-time = "2024-10-20T00:29:44.922Z" }, - { url = "https://files.pythonhosted.org/packages/f4/40/0ae9d061d278b10713ea9021ef6b703ec44698fe32178715a501ac696c6b/asyncpg-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1292b84ee06ac8a2ad8e51c7475aa309245874b61333d97411aab835c4a2f737", size = 3575059, upload-time = "2024-10-20T00:29:46.891Z" }, - { url = "https://files.pythonhosted.org/packages/c3/75/d6b895a35a2c6506952247640178e5f768eeb28b2e20299b6a6f1d743ba0/asyncpg-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0f5712350388d0cd0615caec629ad53c81e506b1abaaf8d14c93f54b35e3595a", size = 3473596, upload-time = "2024-10-20T00:29:49.201Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e7/3693392d3e168ab0aebb2d361431375bd22ffc7b4a586a0fc060d519fae7/asyncpg-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:db9891e2d76e6f425746c5d2da01921e9a16b5a71a1c905b13f30e12a257c4af", size = 3641632, upload-time = "2024-10-20T00:29:50.768Z" }, - { url = "https://files.pythonhosted.org/packages/32/ea/15670cea95745bba3f0352341db55f506a820b21c619ee66b7d12ea7867d/asyncpg-0.30.0-cp312-cp312-win32.whl", hash = "sha256:68d71a1be3d83d0570049cd1654a9bdfe506e794ecc98ad0873304a9f35e411e", size = 560186, upload-time = "2024-10-20T00:29:52.394Z" }, - { url = "https://files.pythonhosted.org/packages/7e/6b/fe1fad5cee79ca5f5c27aed7bd95baee529c1bf8a387435c8ba4fe53d5c1/asyncpg-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:9a0292c6af5c500523949155ec17b7fe01a00ace33b68a476d6b5059f9630305", size = 621064, upload-time = "2024-10-20T00:29:53.757Z" }, - { url = "https://files.pythonhosted.org/packages/3a/22/e20602e1218dc07692acf70d5b902be820168d6282e69ef0d3cb920dc36f/asyncpg-0.30.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05b185ebb8083c8568ea8a40e896d5f7af4b8554b64d7719c0eaa1eb5a5c3a70", size = 670373, upload-time = "2024-10-20T00:29:55.165Z" }, - { url = "https://files.pythonhosted.org/packages/3d/b3/0cf269a9d647852a95c06eb00b815d0b95a4eb4b55aa2d6ba680971733b9/asyncpg-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c47806b1a8cbb0a0db896f4cd34d89942effe353a5035c62734ab13b9f938da3", size = 634745, upload-time = "2024-10-20T00:29:57.14Z" }, - { url = "https://files.pythonhosted.org/packages/8e/6d/a4f31bf358ce8491d2a31bfe0d7bcf25269e80481e49de4d8616c4295a34/asyncpg-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b6fde867a74e8c76c71e2f64f80c64c0f3163e687f1763cfaf21633ec24ec33", size = 3512103, upload-time = "2024-10-20T00:29:58.499Z" }, - { url = "https://files.pythonhosted.org/packages/96/19/139227a6e67f407b9c386cb594d9628c6c78c9024f26df87c912fabd4368/asyncpg-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46973045b567972128a27d40001124fbc821c87a6cade040cfcd4fa8a30bcdc4", size = 3592471, upload-time = "2024-10-20T00:30:00.354Z" }, - { url = "https://files.pythonhosted.org/packages/67/e4/ab3ca38f628f53f0fd28d3ff20edff1c975dd1cb22482e0061916b4b9a74/asyncpg-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9110df111cabc2ed81aad2f35394a00cadf4f2e0635603db6ebbd0fc896f46a4", size = 3496253, upload-time = "2024-10-20T00:30:02.794Z" }, - { url = "https://files.pythonhosted.org/packages/ef/5f/0bf65511d4eeac3a1f41c54034a492515a707c6edbc642174ae79034d3ba/asyncpg-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04ff0785ae7eed6cc138e73fc67b8e51d54ee7a3ce9b63666ce55a0bf095f7ba", size = 3662720, upload-time = "2024-10-20T00:30:04.501Z" }, - { url = "https://files.pythonhosted.org/packages/e7/31/1513d5a6412b98052c3ed9158d783b1e09d0910f51fbe0e05f56cc370bc4/asyncpg-0.30.0-cp313-cp313-win32.whl", hash = "sha256:ae374585f51c2b444510cdf3595b97ece4f233fde739aa14b50e0d64e8a7a590", size = 560404, upload-time = "2024-10-20T00:30:06.537Z" }, - { url = "https://files.pythonhosted.org/packages/c8/a4/cec76b3389c4c5ff66301cd100fe88c318563ec8a520e0b2e792b5b84972/asyncpg-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:f59b430b8e27557c3fb9869222559f7417ced18688375825f8f12302c34e915e", size = 621623, upload-time = "2024-10-20T00:30:09.024Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/2f/4c/7c991e080e106d854809030d8584e15b2e996e26f16aee6d757e387bc17d/asyncpg-0.30.0.tar.gz", hash = "sha256:c551e9928ab6707602f44811817f82ba3c446e018bfe1d3abecc8ba5f3eac851", size = 957746, upload_time = "2024-10-20T00:30:41.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/0e/f5d708add0d0b97446c402db7e8dd4c4183c13edaabe8a8500b411e7b495/asyncpg-0.30.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5e0511ad3dec5f6b4f7a9e063591d407eee66b88c14e2ea636f187da1dcfff6a", size = 674506, upload_time = "2024-10-20T00:29:27.988Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a0/67ec9a75cb24a1d99f97b8437c8d56da40e6f6bd23b04e2f4ea5d5ad82ac/asyncpg-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:915aeb9f79316b43c3207363af12d0e6fd10776641a7de8a01212afd95bdf0ed", size = 645922, upload_time = "2024-10-20T00:29:29.391Z" }, + { url = "https://files.pythonhosted.org/packages/5c/d9/a7584f24174bd86ff1053b14bb841f9e714380c672f61c906eb01d8ec433/asyncpg-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c198a00cce9506fcd0bf219a799f38ac7a237745e1d27f0e1f66d3707c84a5a", size = 3079565, upload_time = "2024-10-20T00:29:30.832Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d7/a4c0f9660e333114bdb04d1a9ac70db690dd4ae003f34f691139a5cbdae3/asyncpg-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3326e6d7381799e9735ca2ec9fd7be4d5fef5dcbc3cb555d8a463d8460607956", size = 3109962, upload_time = "2024-10-20T00:29:33.114Z" }, + { url = "https://files.pythonhosted.org/packages/3c/21/199fd16b5a981b1575923cbb5d9cf916fdc936b377e0423099f209e7e73d/asyncpg-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:51da377487e249e35bd0859661f6ee2b81db11ad1f4fc036194bc9cb2ead5056", size = 3064791, upload_time = "2024-10-20T00:29:34.677Z" }, + { url = "https://files.pythonhosted.org/packages/77/52/0004809b3427534a0c9139c08c87b515f1c77a8376a50ae29f001e53962f/asyncpg-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc6d84136f9c4d24d358f3b02be4b6ba358abd09f80737d1ac7c444f36108454", size = 3188696, upload_time = "2024-10-20T00:29:36.389Z" }, + { url = "https://files.pythonhosted.org/packages/52/cb/fbad941cd466117be58b774a3f1cc9ecc659af625f028b163b1e646a55fe/asyncpg-0.30.0-cp311-cp311-win32.whl", hash = "sha256:574156480df14f64c2d76450a3f3aaaf26105869cad3865041156b38459e935d", size = 567358, upload_time = "2024-10-20T00:29:37.915Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0a/0a32307cf166d50e1ad120d9b81a33a948a1a5463ebfa5a96cc5606c0863/asyncpg-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:3356637f0bd830407b5597317b3cb3571387ae52ddc3bca6233682be88bbbc1f", size = 629375, upload_time = "2024-10-20T00:29:39.987Z" }, + { url = "https://files.pythonhosted.org/packages/4b/64/9d3e887bb7b01535fdbc45fbd5f0a8447539833b97ee69ecdbb7a79d0cb4/asyncpg-0.30.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c902a60b52e506d38d7e80e0dd5399f657220f24635fee368117b8b5fce1142e", size = 673162, upload_time = "2024-10-20T00:29:41.88Z" }, + { url = "https://files.pythonhosted.org/packages/6e/eb/8b236663f06984f212a087b3e849731f917ab80f84450e943900e8ca4052/asyncpg-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aca1548e43bbb9f0f627a04666fedaca23db0a31a84136ad1f868cb15deb6e3a", size = 637025, upload_time = "2024-10-20T00:29:43.352Z" }, + { url = "https://files.pythonhosted.org/packages/cc/57/2dc240bb263d58786cfaa60920779af6e8d32da63ab9ffc09f8312bd7a14/asyncpg-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c2a2ef565400234a633da0eafdce27e843836256d40705d83ab7ec42074efb3", size = 3496243, upload_time = "2024-10-20T00:29:44.922Z" }, + { url = "https://files.pythonhosted.org/packages/f4/40/0ae9d061d278b10713ea9021ef6b703ec44698fe32178715a501ac696c6b/asyncpg-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1292b84ee06ac8a2ad8e51c7475aa309245874b61333d97411aab835c4a2f737", size = 3575059, upload_time = "2024-10-20T00:29:46.891Z" }, + { url = "https://files.pythonhosted.org/packages/c3/75/d6b895a35a2c6506952247640178e5f768eeb28b2e20299b6a6f1d743ba0/asyncpg-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0f5712350388d0cd0615caec629ad53c81e506b1abaaf8d14c93f54b35e3595a", size = 3473596, upload_time = "2024-10-20T00:29:49.201Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e7/3693392d3e168ab0aebb2d361431375bd22ffc7b4a586a0fc060d519fae7/asyncpg-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:db9891e2d76e6f425746c5d2da01921e9a16b5a71a1c905b13f30e12a257c4af", size = 3641632, upload_time = "2024-10-20T00:29:50.768Z" }, + { url = "https://files.pythonhosted.org/packages/32/ea/15670cea95745bba3f0352341db55f506a820b21c619ee66b7d12ea7867d/asyncpg-0.30.0-cp312-cp312-win32.whl", hash = "sha256:68d71a1be3d83d0570049cd1654a9bdfe506e794ecc98ad0873304a9f35e411e", size = 560186, upload_time = "2024-10-20T00:29:52.394Z" }, + { url = "https://files.pythonhosted.org/packages/7e/6b/fe1fad5cee79ca5f5c27aed7bd95baee529c1bf8a387435c8ba4fe53d5c1/asyncpg-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:9a0292c6af5c500523949155ec17b7fe01a00ace33b68a476d6b5059f9630305", size = 621064, upload_time = "2024-10-20T00:29:53.757Z" }, + { url = "https://files.pythonhosted.org/packages/3a/22/e20602e1218dc07692acf70d5b902be820168d6282e69ef0d3cb920dc36f/asyncpg-0.30.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05b185ebb8083c8568ea8a40e896d5f7af4b8554b64d7719c0eaa1eb5a5c3a70", size = 670373, upload_time = "2024-10-20T00:29:55.165Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b3/0cf269a9d647852a95c06eb00b815d0b95a4eb4b55aa2d6ba680971733b9/asyncpg-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c47806b1a8cbb0a0db896f4cd34d89942effe353a5035c62734ab13b9f938da3", size = 634745, upload_time = "2024-10-20T00:29:57.14Z" }, + { url = "https://files.pythonhosted.org/packages/8e/6d/a4f31bf358ce8491d2a31bfe0d7bcf25269e80481e49de4d8616c4295a34/asyncpg-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b6fde867a74e8c76c71e2f64f80c64c0f3163e687f1763cfaf21633ec24ec33", size = 3512103, upload_time = "2024-10-20T00:29:58.499Z" }, + { url = "https://files.pythonhosted.org/packages/96/19/139227a6e67f407b9c386cb594d9628c6c78c9024f26df87c912fabd4368/asyncpg-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46973045b567972128a27d40001124fbc821c87a6cade040cfcd4fa8a30bcdc4", size = 3592471, upload_time = "2024-10-20T00:30:00.354Z" }, + { url = "https://files.pythonhosted.org/packages/67/e4/ab3ca38f628f53f0fd28d3ff20edff1c975dd1cb22482e0061916b4b9a74/asyncpg-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9110df111cabc2ed81aad2f35394a00cadf4f2e0635603db6ebbd0fc896f46a4", size = 3496253, upload_time = "2024-10-20T00:30:02.794Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5f/0bf65511d4eeac3a1f41c54034a492515a707c6edbc642174ae79034d3ba/asyncpg-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04ff0785ae7eed6cc138e73fc67b8e51d54ee7a3ce9b63666ce55a0bf095f7ba", size = 3662720, upload_time = "2024-10-20T00:30:04.501Z" }, + { url = "https://files.pythonhosted.org/packages/e7/31/1513d5a6412b98052c3ed9158d783b1e09d0910f51fbe0e05f56cc370bc4/asyncpg-0.30.0-cp313-cp313-win32.whl", hash = "sha256:ae374585f51c2b444510cdf3595b97ece4f233fde739aa14b50e0d64e8a7a590", size = 560404, upload_time = "2024-10-20T00:30:06.537Z" }, + { url = "https://files.pythonhosted.org/packages/c8/a4/cec76b3389c4c5ff66301cd100fe88c318563ec8a520e0b2e792b5b84972/asyncpg-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:f59b430b8e27557c3fb9869222559f7417ced18688375825f8f12302c34e915e", size = 621623, upload_time = "2024-10-20T00:30:09.024Z" }, ] [[package]] name = "attrs" version = "25.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload_time = "2025-03-13T11:10:22.779Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload_time = "2025-03-13T11:10:21.14Z" }, ] [[package]] @@ -191,18 +191,18 @@ dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload-time = "2025-04-15T17:05:13.836Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload_time = "2025-04-15T17:05:13.836Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload-time = "2025-04-15T17:05:12.221Z" }, + { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload_time = "2025-04-15T17:05:12.221Z" }, ] [[package]] name = "boltons" version = "25.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/63/54/71a94d8e02da9a865587fb3fff100cb0fc7aa9f4d5ed9ed3a591216ddcc7/boltons-25.0.0.tar.gz", hash = "sha256:e110fbdc30b7b9868cb604e3f71d4722dd8f4dcb4a5ddd06028ba8f1ab0b5ace", size = 246294, upload-time = "2025-02-03T05:57:59.129Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/54/71a94d8e02da9a865587fb3fff100cb0fc7aa9f4d5ed9ed3a591216ddcc7/boltons-25.0.0.tar.gz", hash = "sha256:e110fbdc30b7b9868cb604e3f71d4722dd8f4dcb4a5ddd06028ba8f1ab0b5ace", size = 246294, upload_time = "2025-02-03T05:57:59.129Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/7f/0e961cf3908bc4c1c3e027de2794f867c6c89fb4916fc7dba295a0e80a2d/boltons-25.0.0-py3-none-any.whl", hash = "sha256:dc9fb38bf28985715497d1b54d00b62ea866eca3938938ea9043e254a3a6ca62", size = 194210, upload-time = "2025-02-03T05:57:56.705Z" }, + { url = "https://files.pythonhosted.org/packages/45/7f/0e961cf3908bc4c1c3e027de2794f867c6c89fb4916fc7dba295a0e80a2d/boltons-25.0.0-py3-none-any.whl", hash = "sha256:dc9fb38bf28985715497d1b54d00b62ea866eca3938938ea9043e254a3a6ca62", size = 194210, upload_time = "2025-02-03T05:57:56.705Z" }, ] [[package]] @@ -212,75 +212,75 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beautifulsoup4" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/aa/4acaf814ff901145da37332e05bb510452ebed97bc9602695059dd46ef39/bs4-0.0.2.tar.gz", hash = "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925", size = 698, upload-time = "2024-01-17T18:15:47.371Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/aa/4acaf814ff901145da37332e05bb510452ebed97bc9602695059dd46ef39/bs4-0.0.2.tar.gz", hash = "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925", size = 698, upload_time = "2024-01-17T18:15:47.371Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/bb/bf7aab772a159614954d84aa832c129624ba6c32faa559dfb200a534e50b/bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc", size = 1189, upload-time = "2024-01-17T18:15:48.613Z" }, + { url = "https://files.pythonhosted.org/packages/51/bb/bf7aab772a159614954d84aa832c129624ba6c32faa559dfb200a534e50b/bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc", size = 1189, upload_time = "2024-01-17T18:15:48.613Z" }, ] [[package]] name = "cachetools" version = "5.5.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380, upload-time = "2025-02-20T21:01:19.524Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380, upload_time = "2025-02-20T21:01:19.524Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080, upload-time = "2025-02-20T21:01:16.647Z" }, + { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080, upload_time = "2025-02-20T21:01:16.647Z" }, ] [[package]] name = "certifi" version = "2025.4.26" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705, upload-time = "2025-04-26T02:12:29.51Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705, upload_time = "2025-04-26T02:12:29.51Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618, upload-time = "2025-04-26T02:12:27.662Z" }, + { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618, upload_time = "2025-04-26T02:12:27.662Z" }, ] [[package]] name = "charset-normalizer" version = "3.4.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload-time = "2025-05-02T08:32:11.945Z" }, - { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload-time = "2025-05-02T08:32:13.946Z" }, - { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload-time = "2025-05-02T08:32:15.873Z" }, - { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload-time = "2025-05-02T08:32:17.283Z" }, - { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload-time = "2025-05-02T08:32:18.807Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload-time = "2025-05-02T08:32:20.333Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload-time = "2025-05-02T08:32:21.86Z" }, - { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload-time = "2025-05-02T08:32:23.434Z" }, - { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload-time = "2025-05-02T08:32:24.993Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload-time = "2025-05-02T08:32:26.435Z" }, - { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload-time = "2025-05-02T08:32:28.376Z" }, - { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload-time = "2025-05-02T08:32:30.281Z" }, - { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload-time = "2025-05-02T08:32:32.191Z" }, - { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload-time = "2025-05-02T08:32:33.712Z" }, - { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload-time = "2025-05-02T08:32:35.768Z" }, - { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload-time = "2025-05-02T08:32:37.284Z" }, - { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload-time = "2025-05-02T08:32:38.803Z" }, - { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload-time = "2025-05-02T08:32:40.251Z" }, - { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload-time = "2025-05-02T08:32:41.705Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload-time = "2025-05-02T08:32:43.709Z" }, - { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload-time = "2025-05-02T08:32:46.197Z" }, - { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload-time = "2025-05-02T08:32:48.105Z" }, - { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload-time = "2025-05-02T08:32:49.719Z" }, - { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload-time = "2025-05-02T08:32:51.404Z" }, - { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload-time = "2025-05-02T08:32:53.079Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload-time = "2025-05-02T08:32:54.573Z" }, - { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" }, - { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" }, - { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" }, - { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" }, - { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" }, - { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" }, - { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" }, - { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" }, - { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" }, - { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" }, - { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" }, - { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" }, - { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" }, - { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload_time = "2025-05-02T08:34:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload_time = "2025-05-02T08:32:11.945Z" }, + { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload_time = "2025-05-02T08:32:13.946Z" }, + { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload_time = "2025-05-02T08:32:15.873Z" }, + { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload_time = "2025-05-02T08:32:17.283Z" }, + { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload_time = "2025-05-02T08:32:18.807Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload_time = "2025-05-02T08:32:20.333Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload_time = "2025-05-02T08:32:21.86Z" }, + { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload_time = "2025-05-02T08:32:23.434Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload_time = "2025-05-02T08:32:24.993Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload_time = "2025-05-02T08:32:26.435Z" }, + { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload_time = "2025-05-02T08:32:28.376Z" }, + { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload_time = "2025-05-02T08:32:30.281Z" }, + { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload_time = "2025-05-02T08:32:32.191Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload_time = "2025-05-02T08:32:33.712Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload_time = "2025-05-02T08:32:35.768Z" }, + { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload_time = "2025-05-02T08:32:37.284Z" }, + { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload_time = "2025-05-02T08:32:38.803Z" }, + { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload_time = "2025-05-02T08:32:40.251Z" }, + { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload_time = "2025-05-02T08:32:41.705Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload_time = "2025-05-02T08:32:43.709Z" }, + { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload_time = "2025-05-02T08:32:46.197Z" }, + { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload_time = "2025-05-02T08:32:48.105Z" }, + { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload_time = "2025-05-02T08:32:49.719Z" }, + { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload_time = "2025-05-02T08:32:51.404Z" }, + { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload_time = "2025-05-02T08:32:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload_time = "2025-05-02T08:32:54.573Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload_time = "2025-05-02T08:32:56.363Z" }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload_time = "2025-05-02T08:32:58.551Z" }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload_time = "2025-05-02T08:33:00.342Z" }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload_time = "2025-05-02T08:33:02.081Z" }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload_time = "2025-05-02T08:33:04.063Z" }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload_time = "2025-05-02T08:33:06.418Z" }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload_time = "2025-05-02T08:33:08.183Z" }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload_time = "2025-05-02T08:33:09.986Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload_time = "2025-05-02T08:33:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload_time = "2025-05-02T08:33:13.707Z" }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload_time = "2025-05-02T08:33:15.458Z" }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload_time = "2025-05-02T08:33:17.06Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload_time = "2025-05-02T08:33:18.753Z" }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload_time = "2025-05-02T08:34:40.053Z" }, ] [[package]] @@ -295,9 +295,9 @@ dependencies = [ { name = "simplejson" }, { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/31/c0131cfe3cdae242699c2889d20016fbe2444dcaf86070ee03863d1035ba/ckanapi-4.8.tar.gz", hash = "sha256:3a98d81e6cb7480883eb1d031740205d3e94176376e9d284d218829d81d0afed", size = 37633, upload-time = "2024-04-04T15:46:09.451Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/31/c0131cfe3cdae242699c2889d20016fbe2444dcaf86070ee03863d1035ba/ckanapi-4.8.tar.gz", hash = "sha256:3a98d81e6cb7480883eb1d031740205d3e94176376e9d284d218829d81d0afed", size = 37633, upload_time = "2024-04-04T15:46:09.451Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/ac/626837e55aeb17f8e3982128a25fbf5f7880a397039eb7a1b5cebaca7fa4/ckanapi-4.8-py3-none-any.whl", hash = "sha256:a6ac36b55321368cf39d70f701542276fe098484517e339adf18595f30c076b8", size = 46316, upload-time = "2024-04-04T15:46:07.725Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ac/626837e55aeb17f8e3982128a25fbf5f7880a397039eb7a1b5cebaca7fa4/ckanapi-4.8-py3-none-any.whl", hash = "sha256:a6ac36b55321368cf39d70f701542276fe098484517e339adf18595f30c076b8", size = 46316, upload_time = "2024-04-04T15:46:07.725Z" }, ] [[package]] @@ -307,18 +307,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cd/0f/62ca20172d4f87d93cf89665fbaedcd560ac48b465bd1d92bfc7ea6b0a41/click-8.2.0.tar.gz", hash = "sha256:f5452aeddd9988eefa20f90f05ab66f17fce1ee2a36907fd30b05bbb5953814d", size = 235857, upload-time = "2025-05-10T22:21:03.111Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/0f/62ca20172d4f87d93cf89665fbaedcd560ac48b465bd1d92bfc7ea6b0a41/click-8.2.0.tar.gz", hash = "sha256:f5452aeddd9988eefa20f90f05ab66f17fce1ee2a36907fd30b05bbb5953814d", size = 235857, upload_time = "2025-05-10T22:21:03.111Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/58/1f37bf81e3c689cc74ffa42102fa8915b59085f54a6e4a80bc6265c0f6bf/click-8.2.0-py3-none-any.whl", hash = "sha256:6b303f0b2aa85f1cb4e5303078fadcbcd4e476f114fab9b5007005711839325c", size = 102156, upload-time = "2025-05-10T22:21:01.352Z" }, + { url = "https://files.pythonhosted.org/packages/a2/58/1f37bf81e3c689cc74ffa42102fa8915b59085f54a6e4a80bc6265c0f6bf/click-8.2.0-py3-none-any.whl", hash = "sha256:6b303f0b2aa85f1cb4e5303078fadcbcd4e476f114fab9b5007005711839325c", size = 102156, upload_time = "2025-05-10T22:21:01.352Z" }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload_time = "2022-10-25T02:36:22.414Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload_time = "2022-10-25T02:36:20.889Z" }, ] [[package]] @@ -390,7 +390,7 @@ requires-dist = [ { name = "lxml", specifier = "~=5.1.0" }, { name = "marshmallow", specifier = "~=3.23.2" }, { name = "openai", specifier = "~=1.60.1" }, - { name = "pdap-access-manager", specifier = "==0.3.5" }, + { name = "pdap-access-manager", specifier = "==0.3.6" }, { name = "playwright", specifier = "~=1.49.1" }, { name = "psycopg", extras = ["binary"], specifier = "~=3.1.20" }, { name = "psycopg2-binary", specifier = "~=2.9.6" }, @@ -437,9 +437,9 @@ dependencies = [ { name = "tqdm" }, { name = "xxhash" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/e7/6ee66732f74e4fb1c8915e58b3c253aded777ad0fa457f3f831dd0cd09b4/datasets-2.19.2.tar.gz", hash = "sha256:eccb82fb3bb5ee26ccc6d7a15b7f1f834e2cc4e59b7cff7733a003552bad51ef", size = 2215337, upload-time = "2024-06-03T05:11:44.756Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/e7/6ee66732f74e4fb1c8915e58b3c253aded777ad0fa457f3f831dd0cd09b4/datasets-2.19.2.tar.gz", hash = "sha256:eccb82fb3bb5ee26ccc6d7a15b7f1f834e2cc4e59b7cff7733a003552bad51ef", size = 2215337, upload_time = "2024-06-03T05:11:44.756Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/59/46818ebeb708234a60e42ccf409d20709e482519d2aa450b501ddbba4594/datasets-2.19.2-py3-none-any.whl", hash = "sha256:e07ff15d75b1af75c87dd96323ba2a361128d495136652f37fd62f918d17bb4e", size = 542113, upload-time = "2024-06-03T05:11:41.151Z" }, + { url = "https://files.pythonhosted.org/packages/3f/59/46818ebeb708234a60e42ccf409d20709e482519d2aa450b501ddbba4594/datasets-2.19.2-py3-none-any.whl", hash = "sha256:e07ff15d75b1af75c87dd96323ba2a361128d495136652f37fd62f918d17bb4e", size = 542113, upload_time = "2024-06-03T05:11:41.151Z" }, ] [[package]] @@ -449,18 +449,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "orderly-set" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0a/0f/9cd2624f7dcd755cbf1fa21fb7234541f19a1be96a56f387ec9053ebe220/deepdiff-8.5.0.tar.gz", hash = "sha256:a4dd3529fa8d4cd5b9cbb6e3ea9c95997eaa919ba37dac3966c1b8f872dc1cd1", size = 538517, upload-time = "2025-05-09T18:44:10.035Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/0f/9cd2624f7dcd755cbf1fa21fb7234541f19a1be96a56f387ec9053ebe220/deepdiff-8.5.0.tar.gz", hash = "sha256:a4dd3529fa8d4cd5b9cbb6e3ea9c95997eaa919ba37dac3966c1b8f872dc1cd1", size = 538517, upload_time = "2025-05-09T18:44:10.035Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/3b/2e0797200c51531a6d8c97a8e4c9fa6fb56de7e6e2a15c1c067b6b10a0b0/deepdiff-8.5.0-py3-none-any.whl", hash = "sha256:d4599db637f36a1c285f5fdfc2cd8d38bde8d8be8636b65ab5e425b67c54df26", size = 85112, upload-time = "2025-05-09T18:44:07.784Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3b/2e0797200c51531a6d8c97a8e4c9fa6fb56de7e6e2a15c1c067b6b10a0b0/deepdiff-8.5.0-py3-none-any.whl", hash = "sha256:d4599db637f36a1c285f5fdfc2cd8d38bde8d8be8636b65ab5e425b67c54df26", size = 85112, upload_time = "2025-05-09T18:44:07.784Z" }, ] [[package]] name = "dill" version = "0.3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/17/4d/ac7ffa80c69ea1df30a8aa11b3578692a5118e7cd1aa157e3ef73b092d15/dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", size = 184847, upload-time = "2024-01-27T23:42:16.145Z" } +sdist = { url = "https://files.pythonhosted.org/packages/17/4d/ac7ffa80c69ea1df30a8aa11b3578692a5118e7cd1aa157e3ef73b092d15/dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", size = 184847, upload_time = "2024-01-27T23:42:16.145Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252, upload-time = "2024-01-27T23:42:14.239Z" }, + { url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252, upload_time = "2024-01-27T23:42:14.239Z" }, ] [[package]] @@ -470,27 +470,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/af2d2b24f9afddebbb258b3b82c58439f0b0a91f0649af34475fbacd39f9/discord_poster-0.1.0.tar.gz", hash = "sha256:3768689a91bb59250c8b1e580903562b041ddd8ed2856abfdaaa88476817be20", size = 2385, upload-time = "2025-04-28T19:19:28.036Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/af2d2b24f9afddebbb258b3b82c58439f0b0a91f0649af34475fbacd39f9/discord_poster-0.1.0.tar.gz", hash = "sha256:3768689a91bb59250c8b1e580903562b041ddd8ed2856abfdaaa88476817be20", size = 2385, upload_time = "2025-04-28T19:19:28.036Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/fe/89f5acd8b0ad8f901792dcc5fd689e537ea373d45d55060d2a0d92648335/discord_poster-0.1.0-py3-none-any.whl", hash = "sha256:eef212ad2454669575a67c702c07a1fddc92334fd17f0ed7881ef25a7880237e", size = 3181, upload-time = "2025-04-28T19:19:26.584Z" }, + { url = "https://files.pythonhosted.org/packages/01/fe/89f5acd8b0ad8f901792dcc5fd689e537ea373d45d55060d2a0d92648335/discord_poster-0.1.0-py3-none-any.whl", hash = "sha256:eef212ad2454669575a67c702c07a1fddc92334fd17f0ed7881ef25a7880237e", size = 3181, upload_time = "2025-04-28T19:19:26.584Z" }, ] [[package]] name = "distro" version = "1.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload_time = "2023-12-24T09:54:32.31Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload_time = "2023-12-24T09:54:30.421Z" }, ] [[package]] name = "dnspython" version = "2.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197, upload-time = "2024-10-05T20:14:59.362Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197, upload_time = "2024-10-05T20:14:59.362Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632, upload-time = "2024-10-05T20:14:57.687Z" }, + { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632, upload_time = "2024-10-05T20:14:57.687Z" }, ] [[package]] @@ -502,16 +502,16 @@ dependencies = [ { name = "requests" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834, upload-time = "2024-05-23T11:13:57.216Z" } +sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834, upload_time = "2024-05-23T11:13:57.216Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774, upload-time = "2024-05-23T11:13:55.01Z" }, + { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774, upload_time = "2024-05-23T11:13:55.01Z" }, ] [[package]] name = "docopt" version = "0.6.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491", size = 25901, upload-time = "2014-06-16T11:18:57.406Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491", size = 25901, upload_time = "2014-06-16T11:18:57.406Z" } [[package]] name = "email-validator" @@ -521,9 +521,9 @@ dependencies = [ { name = "dnspython" }, { name = "idna" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967, upload-time = "2024-06-20T11:30:30.034Z" } +sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967, upload_time = "2024-06-20T11:30:30.034Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521, upload-time = "2024-06-20T11:30:28.248Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521, upload_time = "2024-06-20T11:30:28.248Z" }, ] [[package]] @@ -534,9 +534,9 @@ dependencies = [ { name = "marshmallow" }, { name = "python-dotenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/31/d3/e82bdbb8cc332e751f67a3f668c5d134d57f983497d9f3a59a375b6e8fd8/environs-14.1.1.tar.gz", hash = "sha256:03db7ee2d50ec697b68814cd175a3a05a7c7954804e4e419ca8b570dc5a835cf", size = 32050, upload-time = "2025-02-10T20:24:26.437Z" } +sdist = { url = "https://files.pythonhosted.org/packages/31/d3/e82bdbb8cc332e751f67a3f668c5d134d57f983497d9f3a59a375b6e8fd8/environs-14.1.1.tar.gz", hash = "sha256:03db7ee2d50ec697b68814cd175a3a05a7c7954804e4e419ca8b570dc5a835cf", size = 32050, upload_time = "2025-02-10T20:24:26.437Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/1c/ab9752f02d32d981d647c05822be9ff93809be8953dacea2da2bec9a9de9/environs-14.1.1-py3-none-any.whl", hash = "sha256:45bc56f1d53bbc59d8dd69bba97377dd88ec28b8229d81cedbd455b21789445b", size = 15566, upload-time = "2025-02-10T20:24:22.116Z" }, + { url = "https://files.pythonhosted.org/packages/f4/1c/ab9752f02d32d981d647c05822be9ff93809be8953dacea2da2bec9a9de9/environs-14.1.1-py3-none-any.whl", hash = "sha256:45bc56f1d53bbc59d8dd69bba97377dd88ec28b8229d81cedbd455b21789445b", size = 15566, upload_time = "2025-02-10T20:24:22.116Z" }, ] [[package]] @@ -548,9 +548,9 @@ dependencies = [ { name = "starlette" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236, upload-time = "2025-03-23T22:55:43.822Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236, upload_time = "2025-03-23T22:55:43.822Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164, upload-time = "2025-03-23T22:55:42.101Z" }, + { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164, upload_time = "2025-03-23T22:55:42.101Z" }, ] [package.optional-dependencies] @@ -572,9 +572,9 @@ dependencies = [ { name = "typer" }, { name = "uvicorn", extra = ["standard"] }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753, upload-time = "2024-12-15T14:28:10.028Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753, upload_time = "2024-12-15T14:28:10.028Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705, upload-time = "2024-12-15T14:28:06.18Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705, upload_time = "2024-12-15T14:28:06.18Z" }, ] [package.optional-dependencies] @@ -586,104 +586,104 @@ standard = [ name = "filelock" version = "3.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload-time = "2025-03-14T07:11:40.47Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload_time = "2025-03-14T07:11:40.47Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload-time = "2025-03-14T07:11:39.145Z" }, + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload_time = "2025-03-14T07:11:39.145Z" }, ] [[package]] name = "from-root" version = "1.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/30/5259cfafc8372df008a5605ca19aba9d560285471ee043f39cbc5a7b7fa2/from_root-1.3.0.tar.gz", hash = "sha256:da1359f5faabca367f685cac927cb2f307bb35c488fdd0361f963d6f1cd2674f", size = 4858, upload-time = "2022-12-27T12:41:25.78Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/30/5259cfafc8372df008a5605ca19aba9d560285471ee043f39cbc5a7b7fa2/from_root-1.3.0.tar.gz", hash = "sha256:da1359f5faabca367f685cac927cb2f307bb35c488fdd0361f963d6f1cd2674f", size = 4858, upload_time = "2022-12-27T12:41:25.78Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/a8/451d0294d5d9ead3d26c25837df0588d1bcdd9235abf91e0ded629369921/from_root-1.3.0-py3-none-any.whl", hash = "sha256:7446a9b6481e668329cc11ad0a234fe4c83c63468c652e037d02846a75c726f8", size = 5489, upload-time = "2022-12-27T12:41:23.989Z" }, + { url = "https://files.pythonhosted.org/packages/33/a8/451d0294d5d9ead3d26c25837df0588d1bcdd9235abf91e0ded629369921/from_root-1.3.0-py3-none-any.whl", hash = "sha256:7446a9b6481e668329cc11ad0a234fe4c83c63468c652e037d02846a75c726f8", size = 5489, upload_time = "2022-12-27T12:41:23.989Z" }, ] [[package]] name = "frozenlist" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/f4/d744cba2da59b5c1d88823cf9e8a6c74e4659e2b27604ed973be2a0bf5ab/frozenlist-1.6.0.tar.gz", hash = "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68", size = 42831, upload-time = "2025-04-17T22:38:53.099Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/53/b5/bc883b5296ec902115c00be161da93bf661199c465ec4c483feec6ea4c32/frozenlist-1.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae8337990e7a45683548ffb2fee1af2f1ed08169284cd829cdd9a7fa7470530d", size = 160912, upload-time = "2025-04-17T22:36:17.235Z" }, - { url = "https://files.pythonhosted.org/packages/6f/93/51b058b563d0704b39c56baa222828043aafcac17fd3734bec5dbeb619b1/frozenlist-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c952f69dd524558694818a461855f35d36cc7f5c0adddce37e962c85d06eac0", size = 124315, upload-time = "2025-04-17T22:36:18.735Z" }, - { url = "https://files.pythonhosted.org/packages/c9/e0/46cd35219428d350558b874d595e132d1c17a9471a1bd0d01d518a261e7c/frozenlist-1.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f5fef13136c4e2dee91bfb9a44e236fff78fc2cd9f838eddfc470c3d7d90afe", size = 122230, upload-time = "2025-04-17T22:36:20.6Z" }, - { url = "https://files.pythonhosted.org/packages/d1/0f/7ad2ce928ad06d6dd26a61812b959ded573d3e9d0ee6109d96c2be7172e9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:716bbba09611b4663ecbb7cd022f640759af8259e12a6ca939c0a6acd49eedba", size = 314842, upload-time = "2025-04-17T22:36:22.088Z" }, - { url = "https://files.pythonhosted.org/packages/34/76/98cbbd8a20a5c3359a2004ae5e5b216af84a150ccbad67c8f8f30fb2ea91/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7b8c4dc422c1a3ffc550b465090e53b0bf4839047f3e436a34172ac67c45d595", size = 304919, upload-time = "2025-04-17T22:36:24.247Z" }, - { url = "https://files.pythonhosted.org/packages/9a/fa/258e771ce3a44348c05e6b01dffc2bc67603fba95761458c238cd09a2c77/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b11534872256e1666116f6587a1592ef395a98b54476addb5e8d352925cb5d4a", size = 324074, upload-time = "2025-04-17T22:36:26.291Z" }, - { url = "https://files.pythonhosted.org/packages/d5/a4/047d861fd8c538210e12b208c0479912273f991356b6bdee7ea8356b07c9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c6eceb88aaf7221f75be6ab498dc622a151f5f88d536661af3ffc486245a626", size = 321292, upload-time = "2025-04-17T22:36:27.909Z" }, - { url = "https://files.pythonhosted.org/packages/c0/25/cfec8af758b4525676cabd36efcaf7102c1348a776c0d1ad046b8a7cdc65/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62c828a5b195570eb4b37369fcbbd58e96c905768d53a44d13044355647838ff", size = 301569, upload-time = "2025-04-17T22:36:29.448Z" }, - { url = "https://files.pythonhosted.org/packages/87/2f/0c819372fa9f0c07b153124bf58683b8d0ca7bb73ea5ccde9b9ef1745beb/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1c6bd2c6399920c9622362ce95a7d74e7f9af9bfec05fff91b8ce4b9647845a", size = 313625, upload-time = "2025-04-17T22:36:31.55Z" }, - { url = "https://files.pythonhosted.org/packages/50/5f/f0cf8b0fdedffdb76b3745aa13d5dbe404d63493cc211ce8250f2025307f/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49ba23817781e22fcbd45fd9ff2b9b8cdb7b16a42a4851ab8025cae7b22e96d0", size = 312523, upload-time = "2025-04-17T22:36:33.078Z" }, - { url = "https://files.pythonhosted.org/packages/e1/6c/38c49108491272d3e84125bbabf2c2d0b304899b52f49f0539deb26ad18d/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:431ef6937ae0f853143e2ca67d6da76c083e8b1fe3df0e96f3802fd37626e606", size = 322657, upload-time = "2025-04-17T22:36:34.688Z" }, - { url = "https://files.pythonhosted.org/packages/bd/4b/3bd3bad5be06a9d1b04b1c22be80b5fe65b502992d62fab4bdb25d9366ee/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9d124b38b3c299ca68433597ee26b7819209cb8a3a9ea761dfe9db3a04bba584", size = 303414, upload-time = "2025-04-17T22:36:36.363Z" }, - { url = "https://files.pythonhosted.org/packages/5b/89/7e225a30bef6e85dbfe22622c24afe932e9444de3b40d58b1ea589a14ef8/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:118e97556306402e2b010da1ef21ea70cb6d6122e580da64c056b96f524fbd6a", size = 320321, upload-time = "2025-04-17T22:36:38.16Z" }, - { url = "https://files.pythonhosted.org/packages/22/72/7e3acef4dd9e86366cb8f4d8f28e852c2b7e116927e9722b31a6f71ea4b0/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb3b309f1d4086b5533cf7bbcf3f956f0ae6469664522f1bde4feed26fba60f1", size = 323975, upload-time = "2025-04-17T22:36:40.289Z" }, - { url = "https://files.pythonhosted.org/packages/d8/85/e5da03d20507e13c66ce612c9792b76811b7a43e3320cce42d95b85ac755/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54dece0d21dce4fdb188a1ffc555926adf1d1c516e493c2914d7c370e454bc9e", size = 316553, upload-time = "2025-04-17T22:36:42.045Z" }, - { url = "https://files.pythonhosted.org/packages/ac/8e/6c609cbd0580ae8a0661c408149f196aade7d325b1ae7adc930501b81acb/frozenlist-1.6.0-cp311-cp311-win32.whl", hash = "sha256:654e4ba1d0b2154ca2f096bed27461cf6160bc7f504a7f9a9ef447c293caf860", size = 115511, upload-time = "2025-04-17T22:36:44.067Z" }, - { url = "https://files.pythonhosted.org/packages/f2/13/a84804cfde6de12d44ed48ecbf777ba62b12ff09e761f76cdd1ff9e14bb1/frozenlist-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e911391bffdb806001002c1f860787542f45916c3baf764264a52765d5a5603", size = 120863, upload-time = "2025-04-17T22:36:45.465Z" }, - { url = "https://files.pythonhosted.org/packages/9c/8a/289b7d0de2fbac832ea80944d809759976f661557a38bb8e77db5d9f79b7/frozenlist-1.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1", size = 160193, upload-time = "2025-04-17T22:36:47.382Z" }, - { url = "https://files.pythonhosted.org/packages/19/80/2fd17d322aec7f430549f0669f599997174f93ee17929ea5b92781ec902c/frozenlist-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29", size = 123831, upload-time = "2025-04-17T22:36:49.401Z" }, - { url = "https://files.pythonhosted.org/packages/99/06/f5812da431273f78c6543e0b2f7de67dfd65eb0a433978b2c9c63d2205e4/frozenlist-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25", size = 121862, upload-time = "2025-04-17T22:36:51.899Z" }, - { url = "https://files.pythonhosted.org/packages/d0/31/9e61c6b5fc493cf24d54881731204d27105234d09878be1a5983182cc4a5/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576", size = 316361, upload-time = "2025-04-17T22:36:53.402Z" }, - { url = "https://files.pythonhosted.org/packages/9d/55/22ca9362d4f0222324981470fd50192be200154d51509ee6eb9baa148e96/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8", size = 307115, upload-time = "2025-04-17T22:36:55.016Z" }, - { url = "https://files.pythonhosted.org/packages/ae/39/4fff42920a57794881e7bb3898dc7f5f539261711ea411b43bba3cde8b79/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9", size = 322505, upload-time = "2025-04-17T22:36:57.12Z" }, - { url = "https://files.pythonhosted.org/packages/55/f2/88c41f374c1e4cf0092a5459e5f3d6a1e17ed274c98087a76487783df90c/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e", size = 322666, upload-time = "2025-04-17T22:36:58.735Z" }, - { url = "https://files.pythonhosted.org/packages/75/51/034eeb75afdf3fd03997856195b500722c0b1a50716664cde64e28299c4b/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590", size = 302119, upload-time = "2025-04-17T22:37:00.512Z" }, - { url = "https://files.pythonhosted.org/packages/2b/a6/564ecde55ee633270a793999ef4fd1d2c2b32b5a7eec903b1012cb7c5143/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103", size = 316226, upload-time = "2025-04-17T22:37:02.102Z" }, - { url = "https://files.pythonhosted.org/packages/f1/c8/6c0682c32377f402b8a6174fb16378b683cf6379ab4d2827c580892ab3c7/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c", size = 312788, upload-time = "2025-04-17T22:37:03.578Z" }, - { url = "https://files.pythonhosted.org/packages/b6/b8/10fbec38f82c5d163ca1750bfff4ede69713badf236a016781cf1f10a0f0/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821", size = 325914, upload-time = "2025-04-17T22:37:05.213Z" }, - { url = "https://files.pythonhosted.org/packages/62/ca/2bf4f3a1bd40cdedd301e6ecfdbb291080d5afc5f9ce350c0739f773d6b9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70", size = 305283, upload-time = "2025-04-17T22:37:06.985Z" }, - { url = "https://files.pythonhosted.org/packages/09/64/20cc13ccf94abc2a1f482f74ad210703dc78a590d0b805af1c9aa67f76f9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f", size = 319264, upload-time = "2025-04-17T22:37:08.618Z" }, - { url = "https://files.pythonhosted.org/packages/20/ff/86c6a2bbe98cfc231519f5e6d712a0898488ceac804a917ce014f32e68f6/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046", size = 326482, upload-time = "2025-04-17T22:37:10.196Z" }, - { url = "https://files.pythonhosted.org/packages/2f/da/8e381f66367d79adca245d1d71527aac774e30e291d41ef161ce2d80c38e/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770", size = 318248, upload-time = "2025-04-17T22:37:12.284Z" }, - { url = "https://files.pythonhosted.org/packages/39/24/1a1976563fb476ab6f0fa9fefaac7616a4361dbe0461324f9fd7bf425dbe/frozenlist-1.6.0-cp312-cp312-win32.whl", hash = "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc", size = 115161, upload-time = "2025-04-17T22:37:13.902Z" }, - { url = "https://files.pythonhosted.org/packages/80/2e/fb4ed62a65f8cd66044706b1013f0010930d8cbb0729a2219561ea075434/frozenlist-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878", size = 120548, upload-time = "2025-04-17T22:37:15.326Z" }, - { url = "https://files.pythonhosted.org/packages/6f/e5/04c7090c514d96ca00887932417f04343ab94904a56ab7f57861bf63652d/frozenlist-1.6.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e", size = 158182, upload-time = "2025-04-17T22:37:16.837Z" }, - { url = "https://files.pythonhosted.org/packages/e9/8f/60d0555c61eec855783a6356268314d204137f5e0c53b59ae2fc28938c99/frozenlist-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117", size = 122838, upload-time = "2025-04-17T22:37:18.352Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a7/d0ec890e3665b4b3b7c05dc80e477ed8dc2e2e77719368e78e2cd9fec9c8/frozenlist-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4", size = 120980, upload-time = "2025-04-17T22:37:19.857Z" }, - { url = "https://files.pythonhosted.org/packages/cc/19/9b355a5e7a8eba903a008579964192c3e427444752f20b2144b10bb336df/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3", size = 305463, upload-time = "2025-04-17T22:37:21.328Z" }, - { url = "https://files.pythonhosted.org/packages/9c/8d/5b4c758c2550131d66935ef2fa700ada2461c08866aef4229ae1554b93ca/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1", size = 297985, upload-time = "2025-04-17T22:37:23.55Z" }, - { url = "https://files.pythonhosted.org/packages/48/2c/537ec09e032b5865715726b2d1d9813e6589b571d34d01550c7aeaad7e53/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c", size = 311188, upload-time = "2025-04-17T22:37:25.221Z" }, - { url = "https://files.pythonhosted.org/packages/31/2f/1aa74b33f74d54817055de9a4961eff798f066cdc6f67591905d4fc82a84/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45", size = 311874, upload-time = "2025-04-17T22:37:26.791Z" }, - { url = "https://files.pythonhosted.org/packages/bf/f0/cfec18838f13ebf4b37cfebc8649db5ea71a1b25dacd691444a10729776c/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f", size = 291897, upload-time = "2025-04-17T22:37:28.958Z" }, - { url = "https://files.pythonhosted.org/packages/ea/a5/deb39325cbbea6cd0a46db8ccd76150ae2fcbe60d63243d9df4a0b8c3205/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85", size = 305799, upload-time = "2025-04-17T22:37:30.889Z" }, - { url = "https://files.pythonhosted.org/packages/78/22/6ddec55c5243a59f605e4280f10cee8c95a449f81e40117163383829c241/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8", size = 302804, upload-time = "2025-04-17T22:37:32.489Z" }, - { url = "https://files.pythonhosted.org/packages/5d/b7/d9ca9bab87f28855063c4d202936800219e39db9e46f9fb004d521152623/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f", size = 316404, upload-time = "2025-04-17T22:37:34.59Z" }, - { url = "https://files.pythonhosted.org/packages/a6/3a/1255305db7874d0b9eddb4fe4a27469e1fb63720f1fc6d325a5118492d18/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f", size = 295572, upload-time = "2025-04-17T22:37:36.337Z" }, - { url = "https://files.pythonhosted.org/packages/2a/f2/8d38eeee39a0e3a91b75867cc102159ecccf441deb6ddf67be96d3410b84/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6", size = 307601, upload-time = "2025-04-17T22:37:37.923Z" }, - { url = "https://files.pythonhosted.org/packages/38/04/80ec8e6b92f61ef085422d7b196822820404f940950dde5b2e367bede8bc/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188", size = 314232, upload-time = "2025-04-17T22:37:39.669Z" }, - { url = "https://files.pythonhosted.org/packages/3a/58/93b41fb23e75f38f453ae92a2f987274c64637c450285577bd81c599b715/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e", size = 308187, upload-time = "2025-04-17T22:37:41.662Z" }, - { url = "https://files.pythonhosted.org/packages/6a/a2/e64df5c5aa36ab3dee5a40d254f3e471bb0603c225f81664267281c46a2d/frozenlist-1.6.0-cp313-cp313-win32.whl", hash = "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4", size = 114772, upload-time = "2025-04-17T22:37:43.132Z" }, - { url = "https://files.pythonhosted.org/packages/a0/77/fead27441e749b2d574bb73d693530d59d520d4b9e9679b8e3cb779d37f2/frozenlist-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd", size = 119847, upload-time = "2025-04-17T22:37:45.118Z" }, - { url = "https://files.pythonhosted.org/packages/df/bd/cc6d934991c1e5d9cafda83dfdc52f987c7b28343686aef2e58a9cf89f20/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64", size = 174937, upload-time = "2025-04-17T22:37:46.635Z" }, - { url = "https://files.pythonhosted.org/packages/f2/a2/daf945f335abdbfdd5993e9dc348ef4507436936ab3c26d7cfe72f4843bf/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91", size = 136029, upload-time = "2025-04-17T22:37:48.192Z" }, - { url = "https://files.pythonhosted.org/packages/51/65/4c3145f237a31247c3429e1c94c384d053f69b52110a0d04bfc8afc55fb2/frozenlist-1.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd", size = 134831, upload-time = "2025-04-17T22:37:50.485Z" }, - { url = "https://files.pythonhosted.org/packages/77/38/03d316507d8dea84dfb99bdd515ea245628af964b2bf57759e3c9205cc5e/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2", size = 392981, upload-time = "2025-04-17T22:37:52.558Z" }, - { url = "https://files.pythonhosted.org/packages/37/02/46285ef9828f318ba400a51d5bb616ded38db8466836a9cfa39f3903260b/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506", size = 371999, upload-time = "2025-04-17T22:37:54.092Z" }, - { url = "https://files.pythonhosted.org/packages/0d/64/1212fea37a112c3c5c05bfb5f0a81af4836ce349e69be75af93f99644da9/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0", size = 392200, upload-time = "2025-04-17T22:37:55.951Z" }, - { url = "https://files.pythonhosted.org/packages/81/ce/9a6ea1763e3366e44a5208f76bf37c76c5da570772375e4d0be85180e588/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0", size = 390134, upload-time = "2025-04-17T22:37:57.633Z" }, - { url = "https://files.pythonhosted.org/packages/bc/36/939738b0b495b2c6d0c39ba51563e453232813042a8d908b8f9544296c29/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e", size = 365208, upload-time = "2025-04-17T22:37:59.742Z" }, - { url = "https://files.pythonhosted.org/packages/b4/8b/939e62e93c63409949c25220d1ba8e88e3960f8ef6a8d9ede8f94b459d27/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c", size = 385548, upload-time = "2025-04-17T22:38:01.416Z" }, - { url = "https://files.pythonhosted.org/packages/62/38/22d2873c90102e06a7c5a3a5b82ca47e393c6079413e8a75c72bff067fa8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b", size = 391123, upload-time = "2025-04-17T22:38:03.049Z" }, - { url = "https://files.pythonhosted.org/packages/44/78/63aaaf533ee0701549500f6d819be092c6065cb5c577edb70c09df74d5d0/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad", size = 394199, upload-time = "2025-04-17T22:38:04.776Z" }, - { url = "https://files.pythonhosted.org/packages/54/45/71a6b48981d429e8fbcc08454dc99c4c2639865a646d549812883e9c9dd3/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215", size = 373854, upload-time = "2025-04-17T22:38:06.576Z" }, - { url = "https://files.pythonhosted.org/packages/3f/f3/dbf2a5e11736ea81a66e37288bf9f881143a7822b288a992579ba1b4204d/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2", size = 395412, upload-time = "2025-04-17T22:38:08.197Z" }, - { url = "https://files.pythonhosted.org/packages/b3/f1/c63166806b331f05104d8ea385c4acd511598568b1f3e4e8297ca54f2676/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911", size = 394936, upload-time = "2025-04-17T22:38:10.056Z" }, - { url = "https://files.pythonhosted.org/packages/ef/ea/4f3e69e179a430473eaa1a75ff986526571215fefc6b9281cdc1f09a4eb8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497", size = 391459, upload-time = "2025-04-17T22:38:11.826Z" }, - { url = "https://files.pythonhosted.org/packages/d3/c3/0fc2c97dea550df9afd072a37c1e95421652e3206bbeaa02378b24c2b480/frozenlist-1.6.0-cp313-cp313t-win32.whl", hash = "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f", size = 128797, upload-time = "2025-04-17T22:38:14.013Z" }, - { url = "https://files.pythonhosted.org/packages/ae/f5/79c9320c5656b1965634fe4be9c82b12a3305bdbc58ad9cb941131107b20/frozenlist-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348", size = 134709, upload-time = "2025-04-17T22:38:15.551Z" }, - { url = "https://files.pythonhosted.org/packages/71/3e/b04a0adda73bd52b390d730071c0d577073d3d26740ee1bad25c3ad0f37b/frozenlist-1.6.0-py3-none-any.whl", hash = "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191", size = 12404, upload-time = "2025-04-17T22:38:51.668Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ee/f4/d744cba2da59b5c1d88823cf9e8a6c74e4659e2b27604ed973be2a0bf5ab/frozenlist-1.6.0.tar.gz", hash = "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68", size = 42831, upload_time = "2025-04-17T22:38:53.099Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/b5/bc883b5296ec902115c00be161da93bf661199c465ec4c483feec6ea4c32/frozenlist-1.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae8337990e7a45683548ffb2fee1af2f1ed08169284cd829cdd9a7fa7470530d", size = 160912, upload_time = "2025-04-17T22:36:17.235Z" }, + { url = "https://files.pythonhosted.org/packages/6f/93/51b058b563d0704b39c56baa222828043aafcac17fd3734bec5dbeb619b1/frozenlist-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c952f69dd524558694818a461855f35d36cc7f5c0adddce37e962c85d06eac0", size = 124315, upload_time = "2025-04-17T22:36:18.735Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e0/46cd35219428d350558b874d595e132d1c17a9471a1bd0d01d518a261e7c/frozenlist-1.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f5fef13136c4e2dee91bfb9a44e236fff78fc2cd9f838eddfc470c3d7d90afe", size = 122230, upload_time = "2025-04-17T22:36:20.6Z" }, + { url = "https://files.pythonhosted.org/packages/d1/0f/7ad2ce928ad06d6dd26a61812b959ded573d3e9d0ee6109d96c2be7172e9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:716bbba09611b4663ecbb7cd022f640759af8259e12a6ca939c0a6acd49eedba", size = 314842, upload_time = "2025-04-17T22:36:22.088Z" }, + { url = "https://files.pythonhosted.org/packages/34/76/98cbbd8a20a5c3359a2004ae5e5b216af84a150ccbad67c8f8f30fb2ea91/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7b8c4dc422c1a3ffc550b465090e53b0bf4839047f3e436a34172ac67c45d595", size = 304919, upload_time = "2025-04-17T22:36:24.247Z" }, + { url = "https://files.pythonhosted.org/packages/9a/fa/258e771ce3a44348c05e6b01dffc2bc67603fba95761458c238cd09a2c77/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b11534872256e1666116f6587a1592ef395a98b54476addb5e8d352925cb5d4a", size = 324074, upload_time = "2025-04-17T22:36:26.291Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a4/047d861fd8c538210e12b208c0479912273f991356b6bdee7ea8356b07c9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c6eceb88aaf7221f75be6ab498dc622a151f5f88d536661af3ffc486245a626", size = 321292, upload_time = "2025-04-17T22:36:27.909Z" }, + { url = "https://files.pythonhosted.org/packages/c0/25/cfec8af758b4525676cabd36efcaf7102c1348a776c0d1ad046b8a7cdc65/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62c828a5b195570eb4b37369fcbbd58e96c905768d53a44d13044355647838ff", size = 301569, upload_time = "2025-04-17T22:36:29.448Z" }, + { url = "https://files.pythonhosted.org/packages/87/2f/0c819372fa9f0c07b153124bf58683b8d0ca7bb73ea5ccde9b9ef1745beb/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1c6bd2c6399920c9622362ce95a7d74e7f9af9bfec05fff91b8ce4b9647845a", size = 313625, upload_time = "2025-04-17T22:36:31.55Z" }, + { url = "https://files.pythonhosted.org/packages/50/5f/f0cf8b0fdedffdb76b3745aa13d5dbe404d63493cc211ce8250f2025307f/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49ba23817781e22fcbd45fd9ff2b9b8cdb7b16a42a4851ab8025cae7b22e96d0", size = 312523, upload_time = "2025-04-17T22:36:33.078Z" }, + { url = "https://files.pythonhosted.org/packages/e1/6c/38c49108491272d3e84125bbabf2c2d0b304899b52f49f0539deb26ad18d/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:431ef6937ae0f853143e2ca67d6da76c083e8b1fe3df0e96f3802fd37626e606", size = 322657, upload_time = "2025-04-17T22:36:34.688Z" }, + { url = "https://files.pythonhosted.org/packages/bd/4b/3bd3bad5be06a9d1b04b1c22be80b5fe65b502992d62fab4bdb25d9366ee/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9d124b38b3c299ca68433597ee26b7819209cb8a3a9ea761dfe9db3a04bba584", size = 303414, upload_time = "2025-04-17T22:36:36.363Z" }, + { url = "https://files.pythonhosted.org/packages/5b/89/7e225a30bef6e85dbfe22622c24afe932e9444de3b40d58b1ea589a14ef8/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:118e97556306402e2b010da1ef21ea70cb6d6122e580da64c056b96f524fbd6a", size = 320321, upload_time = "2025-04-17T22:36:38.16Z" }, + { url = "https://files.pythonhosted.org/packages/22/72/7e3acef4dd9e86366cb8f4d8f28e852c2b7e116927e9722b31a6f71ea4b0/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb3b309f1d4086b5533cf7bbcf3f956f0ae6469664522f1bde4feed26fba60f1", size = 323975, upload_time = "2025-04-17T22:36:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/d8/85/e5da03d20507e13c66ce612c9792b76811b7a43e3320cce42d95b85ac755/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54dece0d21dce4fdb188a1ffc555926adf1d1c516e493c2914d7c370e454bc9e", size = 316553, upload_time = "2025-04-17T22:36:42.045Z" }, + { url = "https://files.pythonhosted.org/packages/ac/8e/6c609cbd0580ae8a0661c408149f196aade7d325b1ae7adc930501b81acb/frozenlist-1.6.0-cp311-cp311-win32.whl", hash = "sha256:654e4ba1d0b2154ca2f096bed27461cf6160bc7f504a7f9a9ef447c293caf860", size = 115511, upload_time = "2025-04-17T22:36:44.067Z" }, + { url = "https://files.pythonhosted.org/packages/f2/13/a84804cfde6de12d44ed48ecbf777ba62b12ff09e761f76cdd1ff9e14bb1/frozenlist-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e911391bffdb806001002c1f860787542f45916c3baf764264a52765d5a5603", size = 120863, upload_time = "2025-04-17T22:36:45.465Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8a/289b7d0de2fbac832ea80944d809759976f661557a38bb8e77db5d9f79b7/frozenlist-1.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1", size = 160193, upload_time = "2025-04-17T22:36:47.382Z" }, + { url = "https://files.pythonhosted.org/packages/19/80/2fd17d322aec7f430549f0669f599997174f93ee17929ea5b92781ec902c/frozenlist-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29", size = 123831, upload_time = "2025-04-17T22:36:49.401Z" }, + { url = "https://files.pythonhosted.org/packages/99/06/f5812da431273f78c6543e0b2f7de67dfd65eb0a433978b2c9c63d2205e4/frozenlist-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25", size = 121862, upload_time = "2025-04-17T22:36:51.899Z" }, + { url = "https://files.pythonhosted.org/packages/d0/31/9e61c6b5fc493cf24d54881731204d27105234d09878be1a5983182cc4a5/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576", size = 316361, upload_time = "2025-04-17T22:36:53.402Z" }, + { url = "https://files.pythonhosted.org/packages/9d/55/22ca9362d4f0222324981470fd50192be200154d51509ee6eb9baa148e96/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8", size = 307115, upload_time = "2025-04-17T22:36:55.016Z" }, + { url = "https://files.pythonhosted.org/packages/ae/39/4fff42920a57794881e7bb3898dc7f5f539261711ea411b43bba3cde8b79/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9", size = 322505, upload_time = "2025-04-17T22:36:57.12Z" }, + { url = "https://files.pythonhosted.org/packages/55/f2/88c41f374c1e4cf0092a5459e5f3d6a1e17ed274c98087a76487783df90c/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e", size = 322666, upload_time = "2025-04-17T22:36:58.735Z" }, + { url = "https://files.pythonhosted.org/packages/75/51/034eeb75afdf3fd03997856195b500722c0b1a50716664cde64e28299c4b/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590", size = 302119, upload_time = "2025-04-17T22:37:00.512Z" }, + { url = "https://files.pythonhosted.org/packages/2b/a6/564ecde55ee633270a793999ef4fd1d2c2b32b5a7eec903b1012cb7c5143/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103", size = 316226, upload_time = "2025-04-17T22:37:02.102Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/6c0682c32377f402b8a6174fb16378b683cf6379ab4d2827c580892ab3c7/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c", size = 312788, upload_time = "2025-04-17T22:37:03.578Z" }, + { url = "https://files.pythonhosted.org/packages/b6/b8/10fbec38f82c5d163ca1750bfff4ede69713badf236a016781cf1f10a0f0/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821", size = 325914, upload_time = "2025-04-17T22:37:05.213Z" }, + { url = "https://files.pythonhosted.org/packages/62/ca/2bf4f3a1bd40cdedd301e6ecfdbb291080d5afc5f9ce350c0739f773d6b9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70", size = 305283, upload_time = "2025-04-17T22:37:06.985Z" }, + { url = "https://files.pythonhosted.org/packages/09/64/20cc13ccf94abc2a1f482f74ad210703dc78a590d0b805af1c9aa67f76f9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f", size = 319264, upload_time = "2025-04-17T22:37:08.618Z" }, + { url = "https://files.pythonhosted.org/packages/20/ff/86c6a2bbe98cfc231519f5e6d712a0898488ceac804a917ce014f32e68f6/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046", size = 326482, upload_time = "2025-04-17T22:37:10.196Z" }, + { url = "https://files.pythonhosted.org/packages/2f/da/8e381f66367d79adca245d1d71527aac774e30e291d41ef161ce2d80c38e/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770", size = 318248, upload_time = "2025-04-17T22:37:12.284Z" }, + { url = "https://files.pythonhosted.org/packages/39/24/1a1976563fb476ab6f0fa9fefaac7616a4361dbe0461324f9fd7bf425dbe/frozenlist-1.6.0-cp312-cp312-win32.whl", hash = "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc", size = 115161, upload_time = "2025-04-17T22:37:13.902Z" }, + { url = "https://files.pythonhosted.org/packages/80/2e/fb4ed62a65f8cd66044706b1013f0010930d8cbb0729a2219561ea075434/frozenlist-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878", size = 120548, upload_time = "2025-04-17T22:37:15.326Z" }, + { url = "https://files.pythonhosted.org/packages/6f/e5/04c7090c514d96ca00887932417f04343ab94904a56ab7f57861bf63652d/frozenlist-1.6.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e", size = 158182, upload_time = "2025-04-17T22:37:16.837Z" }, + { url = "https://files.pythonhosted.org/packages/e9/8f/60d0555c61eec855783a6356268314d204137f5e0c53b59ae2fc28938c99/frozenlist-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117", size = 122838, upload_time = "2025-04-17T22:37:18.352Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a7/d0ec890e3665b4b3b7c05dc80e477ed8dc2e2e77719368e78e2cd9fec9c8/frozenlist-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4", size = 120980, upload_time = "2025-04-17T22:37:19.857Z" }, + { url = "https://files.pythonhosted.org/packages/cc/19/9b355a5e7a8eba903a008579964192c3e427444752f20b2144b10bb336df/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3", size = 305463, upload_time = "2025-04-17T22:37:21.328Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8d/5b4c758c2550131d66935ef2fa700ada2461c08866aef4229ae1554b93ca/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1", size = 297985, upload_time = "2025-04-17T22:37:23.55Z" }, + { url = "https://files.pythonhosted.org/packages/48/2c/537ec09e032b5865715726b2d1d9813e6589b571d34d01550c7aeaad7e53/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c", size = 311188, upload_time = "2025-04-17T22:37:25.221Z" }, + { url = "https://files.pythonhosted.org/packages/31/2f/1aa74b33f74d54817055de9a4961eff798f066cdc6f67591905d4fc82a84/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45", size = 311874, upload_time = "2025-04-17T22:37:26.791Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f0/cfec18838f13ebf4b37cfebc8649db5ea71a1b25dacd691444a10729776c/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f", size = 291897, upload_time = "2025-04-17T22:37:28.958Z" }, + { url = "https://files.pythonhosted.org/packages/ea/a5/deb39325cbbea6cd0a46db8ccd76150ae2fcbe60d63243d9df4a0b8c3205/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85", size = 305799, upload_time = "2025-04-17T22:37:30.889Z" }, + { url = "https://files.pythonhosted.org/packages/78/22/6ddec55c5243a59f605e4280f10cee8c95a449f81e40117163383829c241/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8", size = 302804, upload_time = "2025-04-17T22:37:32.489Z" }, + { url = "https://files.pythonhosted.org/packages/5d/b7/d9ca9bab87f28855063c4d202936800219e39db9e46f9fb004d521152623/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f", size = 316404, upload_time = "2025-04-17T22:37:34.59Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3a/1255305db7874d0b9eddb4fe4a27469e1fb63720f1fc6d325a5118492d18/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f", size = 295572, upload_time = "2025-04-17T22:37:36.337Z" }, + { url = "https://files.pythonhosted.org/packages/2a/f2/8d38eeee39a0e3a91b75867cc102159ecccf441deb6ddf67be96d3410b84/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6", size = 307601, upload_time = "2025-04-17T22:37:37.923Z" }, + { url = "https://files.pythonhosted.org/packages/38/04/80ec8e6b92f61ef085422d7b196822820404f940950dde5b2e367bede8bc/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188", size = 314232, upload_time = "2025-04-17T22:37:39.669Z" }, + { url = "https://files.pythonhosted.org/packages/3a/58/93b41fb23e75f38f453ae92a2f987274c64637c450285577bd81c599b715/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e", size = 308187, upload_time = "2025-04-17T22:37:41.662Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a2/e64df5c5aa36ab3dee5a40d254f3e471bb0603c225f81664267281c46a2d/frozenlist-1.6.0-cp313-cp313-win32.whl", hash = "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4", size = 114772, upload_time = "2025-04-17T22:37:43.132Z" }, + { url = "https://files.pythonhosted.org/packages/a0/77/fead27441e749b2d574bb73d693530d59d520d4b9e9679b8e3cb779d37f2/frozenlist-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd", size = 119847, upload_time = "2025-04-17T22:37:45.118Z" }, + { url = "https://files.pythonhosted.org/packages/df/bd/cc6d934991c1e5d9cafda83dfdc52f987c7b28343686aef2e58a9cf89f20/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64", size = 174937, upload_time = "2025-04-17T22:37:46.635Z" }, + { url = "https://files.pythonhosted.org/packages/f2/a2/daf945f335abdbfdd5993e9dc348ef4507436936ab3c26d7cfe72f4843bf/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91", size = 136029, upload_time = "2025-04-17T22:37:48.192Z" }, + { url = "https://files.pythonhosted.org/packages/51/65/4c3145f237a31247c3429e1c94c384d053f69b52110a0d04bfc8afc55fb2/frozenlist-1.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd", size = 134831, upload_time = "2025-04-17T22:37:50.485Z" }, + { url = "https://files.pythonhosted.org/packages/77/38/03d316507d8dea84dfb99bdd515ea245628af964b2bf57759e3c9205cc5e/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2", size = 392981, upload_time = "2025-04-17T22:37:52.558Z" }, + { url = "https://files.pythonhosted.org/packages/37/02/46285ef9828f318ba400a51d5bb616ded38db8466836a9cfa39f3903260b/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506", size = 371999, upload_time = "2025-04-17T22:37:54.092Z" }, + { url = "https://files.pythonhosted.org/packages/0d/64/1212fea37a112c3c5c05bfb5f0a81af4836ce349e69be75af93f99644da9/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0", size = 392200, upload_time = "2025-04-17T22:37:55.951Z" }, + { url = "https://files.pythonhosted.org/packages/81/ce/9a6ea1763e3366e44a5208f76bf37c76c5da570772375e4d0be85180e588/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0", size = 390134, upload_time = "2025-04-17T22:37:57.633Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/939738b0b495b2c6d0c39ba51563e453232813042a8d908b8f9544296c29/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e", size = 365208, upload_time = "2025-04-17T22:37:59.742Z" }, + { url = "https://files.pythonhosted.org/packages/b4/8b/939e62e93c63409949c25220d1ba8e88e3960f8ef6a8d9ede8f94b459d27/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c", size = 385548, upload_time = "2025-04-17T22:38:01.416Z" }, + { url = "https://files.pythonhosted.org/packages/62/38/22d2873c90102e06a7c5a3a5b82ca47e393c6079413e8a75c72bff067fa8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b", size = 391123, upload_time = "2025-04-17T22:38:03.049Z" }, + { url = "https://files.pythonhosted.org/packages/44/78/63aaaf533ee0701549500f6d819be092c6065cb5c577edb70c09df74d5d0/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad", size = 394199, upload_time = "2025-04-17T22:38:04.776Z" }, + { url = "https://files.pythonhosted.org/packages/54/45/71a6b48981d429e8fbcc08454dc99c4c2639865a646d549812883e9c9dd3/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215", size = 373854, upload_time = "2025-04-17T22:38:06.576Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f3/dbf2a5e11736ea81a66e37288bf9f881143a7822b288a992579ba1b4204d/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2", size = 395412, upload_time = "2025-04-17T22:38:08.197Z" }, + { url = "https://files.pythonhosted.org/packages/b3/f1/c63166806b331f05104d8ea385c4acd511598568b1f3e4e8297ca54f2676/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911", size = 394936, upload_time = "2025-04-17T22:38:10.056Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ea/4f3e69e179a430473eaa1a75ff986526571215fefc6b9281cdc1f09a4eb8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497", size = 391459, upload_time = "2025-04-17T22:38:11.826Z" }, + { url = "https://files.pythonhosted.org/packages/d3/c3/0fc2c97dea550df9afd072a37c1e95421652e3206bbeaa02378b24c2b480/frozenlist-1.6.0-cp313-cp313t-win32.whl", hash = "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f", size = 128797, upload_time = "2025-04-17T22:38:14.013Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f5/79c9320c5656b1965634fe4be9c82b12a3305bdbc58ad9cb941131107b20/frozenlist-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348", size = 134709, upload_time = "2025-04-17T22:38:15.551Z" }, + { url = "https://files.pythonhosted.org/packages/71/3e/b04a0adda73bd52b390d730071c0d577073d3d26740ee1bad25c3ad0f37b/frozenlist-1.6.0-py3-none-any.whl", hash = "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191", size = 12404, upload_time = "2025-04-17T22:38:51.668Z" }, ] [[package]] name = "fsspec" version = "2024.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8b/b8/e3ba21f03c00c27adc9a8cd1cab8adfb37b6024757133924a9a4eab63a83/fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9", size = 170742, upload-time = "2024-03-18T19:35:13.995Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/b8/e3ba21f03c00c27adc9a8cd1cab8adfb37b6024757133924a9a4eab63a83/fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9", size = 170742, upload_time = "2024-03-18T19:35:13.995Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/6d/66d48b03460768f523da62a57a7e14e5e95fdf339d79e996ce3cecda2cdb/fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512", size = 171991, upload-time = "2024-03-18T19:35:11.259Z" }, + { url = "https://files.pythonhosted.org/packages/93/6d/66d48b03460768f523da62a57a7e14e5e95fdf339d79e996ce3cecda2cdb/fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512", size = 171991, upload_time = "2024-03-18T19:35:11.259Z" }, ] [package.optional-dependencies] @@ -702,9 +702,9 @@ dependencies = [ { name = "protobuf" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/09/5c/085bcb872556934bb119e5e09de54daa07873f6866b8f0303c49e72287f7/google_api_core-2.24.2.tar.gz", hash = "sha256:81718493daf06d96d6bc76a91c23874dbf2fac0adbbf542831b805ee6e974696", size = 163516, upload-time = "2025-03-10T15:55:26.201Z" } +sdist = { url = "https://files.pythonhosted.org/packages/09/5c/085bcb872556934bb119e5e09de54daa07873f6866b8f0303c49e72287f7/google_api_core-2.24.2.tar.gz", hash = "sha256:81718493daf06d96d6bc76a91c23874dbf2fac0adbbf542831b805ee6e974696", size = 163516, upload_time = "2025-03-10T15:55:26.201Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/95/f472d85adab6e538da2025dfca9e976a0d125cc0af2301f190e77b76e51c/google_api_core-2.24.2-py3-none-any.whl", hash = "sha256:810a63ac95f3c441b7c0e43d344e372887f62ce9071ba972eacf32672e072de9", size = 160061, upload-time = "2025-03-10T15:55:24.386Z" }, + { url = "https://files.pythonhosted.org/packages/46/95/f472d85adab6e538da2025dfca9e976a0d125cc0af2301f190e77b76e51c/google_api_core-2.24.2-py3-none-any.whl", hash = "sha256:810a63ac95f3c441b7c0e43d344e372887f62ce9071ba972eacf32672e072de9", size = 160061, upload_time = "2025-03-10T15:55:24.386Z" }, ] [[package]] @@ -718,9 +718,9 @@ dependencies = [ { name = "httplib2" }, { name = "uritemplate" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4f/e6/787c24738fc7c99de9289abe60bd64591800ae1cdf60db7b87e0e6ef9cdd/google_api_python_client-2.169.0.tar.gz", hash = "sha256:0585bb97bd5f5bf3ed8d4bf624593e4c5a14d06c811d1952b07a1f94b4d12c51", size = 12811341, upload-time = "2025-04-29T15:46:05.603Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/e6/787c24738fc7c99de9289abe60bd64591800ae1cdf60db7b87e0e6ef9cdd/google_api_python_client-2.169.0.tar.gz", hash = "sha256:0585bb97bd5f5bf3ed8d4bf624593e4c5a14d06c811d1952b07a1f94b4d12c51", size = 12811341, upload_time = "2025-04-29T15:46:05.603Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/bd/6aa93c38756cc9fc63262e0dc3d3f1ff7241ce6f413a25ad6e4a9c98b473/google_api_python_client-2.169.0-py3-none-any.whl", hash = "sha256:dae3e882dc0e6f28e60cf09c1f13fedfd881db84f824dd418aa9e44def2fe00d", size = 13323742, upload-time = "2025-04-29T15:46:02.521Z" }, + { url = "https://files.pythonhosted.org/packages/2d/bd/6aa93c38756cc9fc63262e0dc3d3f1ff7241ce6f413a25ad6e4a9c98b473/google_api_python_client-2.169.0-py3-none-any.whl", hash = "sha256:dae3e882dc0e6f28e60cf09c1f13fedfd881db84f824dd418aa9e44def2fe00d", size = 13323742, upload_time = "2025-04-29T15:46:02.521Z" }, ] [[package]] @@ -732,9 +732,9 @@ dependencies = [ { name = "pyasn1-modules" }, { name = "rsa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/a5/38c21d0e731bb716cffcf987bd9a3555cb95877ab4b616cfb96939933f20/google_auth-2.40.1.tar.gz", hash = "sha256:58f0e8416a9814c1d86c9b7f6acf6816b51aba167b2c76821965271bac275540", size = 280975, upload-time = "2025-05-07T01:04:55.3Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/a5/38c21d0e731bb716cffcf987bd9a3555cb95877ab4b616cfb96939933f20/google_auth-2.40.1.tar.gz", hash = "sha256:58f0e8416a9814c1d86c9b7f6acf6816b51aba167b2c76821965271bac275540", size = 280975, upload_time = "2025-05-07T01:04:55.3Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/b1/1272c6e80847ba5349f5ccb7574596393d1e222543f5003cb810865c3575/google_auth-2.40.1-py2.py3-none-any.whl", hash = "sha256:ed4cae4f5c46b41bae1d19c036e06f6c371926e97b19e816fc854eff811974ee", size = 216101, upload-time = "2025-05-07T01:04:53.612Z" }, + { url = "https://files.pythonhosted.org/packages/a1/b1/1272c6e80847ba5349f5ccb7574596393d1e222543f5003cb810865c3575/google_auth-2.40.1-py2.py3-none-any.whl", hash = "sha256:ed4cae4f5c46b41bae1d19c036e06f6c371926e97b19e816fc854eff811974ee", size = 216101, upload_time = "2025-05-07T01:04:53.612Z" }, ] [[package]] @@ -745,9 +745,9 @@ dependencies = [ { name = "google-auth" }, { name = "httplib2" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/56/be/217a598a818567b28e859ff087f347475c807a5649296fb5a817c58dacef/google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05", size = 10842, upload-time = "2023-12-12T17:40:30.722Z" } +sdist = { url = "https://files.pythonhosted.org/packages/56/be/217a598a818567b28e859ff087f347475c807a5649296fb5a817c58dacef/google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05", size = 10842, upload_time = "2023-12-12T17:40:30.722Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/8a/fe34d2f3f9470a27b01c9e76226965863f153d5fbe276f83608562e49c04/google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d", size = 9253, upload-time = "2023-12-12T17:40:13.055Z" }, + { url = "https://files.pythonhosted.org/packages/be/8a/fe34d2f3f9470a27b01c9e76226965863f153d5fbe276f83608562e49c04/google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d", size = 9253, upload_time = "2023-12-12T17:40:13.055Z" }, ] [[package]] @@ -757,60 +757,60 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/39/24/33db22342cf4a2ea27c9955e6713140fedd51e8b141b5ce5260897020f1a/googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257", size = 145903, upload-time = "2025-04-14T10:17:02.924Z" } +sdist = { url = "https://files.pythonhosted.org/packages/39/24/33db22342cf4a2ea27c9955e6713140fedd51e8b141b5ce5260897020f1a/googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257", size = 145903, upload_time = "2025-04-14T10:17:02.924Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/86/f1/62a193f0227cf15a920390abe675f386dec35f7ae3ffe6da582d3ade42c7/googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8", size = 294530, upload-time = "2025-04-14T10:17:01.271Z" }, + { url = "https://files.pythonhosted.org/packages/86/f1/62a193f0227cf15a920390abe675f386dec35f7ae3ffe6da582d3ade42c7/googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8", size = 294530, upload_time = "2025-04-14T10:17:01.271Z" }, ] [[package]] name = "greenlet" version = "3.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/ff/df5fede753cc10f6a5be0931204ea30c35fa2f2ea7a35b25bdaf4fe40e46/greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", size = 186022, upload-time = "2024-09-20T18:21:04.506Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/28/62/1c2665558618553c42922ed47a4e6d6527e2fa3516a8256c2f431c5d0441/greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70", size = 272479, upload-time = "2024-09-20T17:07:22.332Z" }, - { url = "https://files.pythonhosted.org/packages/76/9d/421e2d5f07285b6e4e3a676b016ca781f63cfe4a0cd8eaecf3fd6f7a71ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159", size = 640404, upload-time = "2024-09-20T17:36:45.588Z" }, - { url = "https://files.pythonhosted.org/packages/e5/de/6e05f5c59262a584e502dd3d261bbdd2c97ab5416cc9c0b91ea38932a901/greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e", size = 652813, upload-time = "2024-09-20T17:39:19.052Z" }, - { url = "https://files.pythonhosted.org/packages/49/93/d5f93c84241acdea15a8fd329362c2c71c79e1a507c3f142a5d67ea435ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1", size = 648517, upload-time = "2024-09-20T17:44:24.101Z" }, - { url = "https://files.pythonhosted.org/packages/15/85/72f77fc02d00470c86a5c982b8daafdf65d38aefbbe441cebff3bf7037fc/greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383", size = 647831, upload-time = "2024-09-20T17:08:40.577Z" }, - { url = "https://files.pythonhosted.org/packages/f7/4b/1c9695aa24f808e156c8f4813f685d975ca73c000c2a5056c514c64980f6/greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a", size = 602413, upload-time = "2024-09-20T17:08:31.728Z" }, - { url = "https://files.pythonhosted.org/packages/76/70/ad6e5b31ef330f03b12559d19fda2606a522d3849cde46b24f223d6d1619/greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511", size = 1129619, upload-time = "2024-09-20T17:44:14.222Z" }, - { url = "https://files.pythonhosted.org/packages/f4/fb/201e1b932e584066e0f0658b538e73c459b34d44b4bd4034f682423bc801/greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395", size = 1155198, upload-time = "2024-09-20T17:09:23.903Z" }, - { url = "https://files.pythonhosted.org/packages/12/da/b9ed5e310bb8b89661b80cbcd4db5a067903bbcd7fc854923f5ebb4144f0/greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39", size = 298930, upload-time = "2024-09-20T17:25:18.656Z" }, - { url = "https://files.pythonhosted.org/packages/7d/ec/bad1ac26764d26aa1353216fcbfa4670050f66d445448aafa227f8b16e80/greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", size = 274260, upload-time = "2024-09-20T17:08:07.301Z" }, - { url = "https://files.pythonhosted.org/packages/66/d4/c8c04958870f482459ab5956c2942c4ec35cac7fe245527f1039837c17a9/greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", size = 649064, upload-time = "2024-09-20T17:36:47.628Z" }, - { url = "https://files.pythonhosted.org/packages/51/41/467b12a8c7c1303d20abcca145db2be4e6cd50a951fa30af48b6ec607581/greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", size = 663420, upload-time = "2024-09-20T17:39:21.258Z" }, - { url = "https://files.pythonhosted.org/packages/27/8f/2a93cd9b1e7107d5c7b3b7816eeadcac2ebcaf6d6513df9abaf0334777f6/greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", size = 658035, upload-time = "2024-09-20T17:44:26.501Z" }, - { url = "https://files.pythonhosted.org/packages/57/5c/7c6f50cb12be092e1dccb2599be5a942c3416dbcfb76efcf54b3f8be4d8d/greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", size = 660105, upload-time = "2024-09-20T17:08:42.048Z" }, - { url = "https://files.pythonhosted.org/packages/f1/66/033e58a50fd9ec9df00a8671c74f1f3a320564c6415a4ed82a1c651654ba/greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", size = 613077, upload-time = "2024-09-20T17:08:33.707Z" }, - { url = "https://files.pythonhosted.org/packages/19/c5/36384a06f748044d06bdd8776e231fadf92fc896bd12cb1c9f5a1bda9578/greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", size = 1135975, upload-time = "2024-09-20T17:44:15.989Z" }, - { url = "https://files.pythonhosted.org/packages/38/f9/c0a0eb61bdf808d23266ecf1d63309f0e1471f284300ce6dac0ae1231881/greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", size = 1163955, upload-time = "2024-09-20T17:09:25.539Z" }, - { url = "https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", size = 299655, upload-time = "2024-09-20T17:21:22.427Z" }, - { url = "https://files.pythonhosted.org/packages/f3/57/0db4940cd7bb461365ca8d6fd53e68254c9dbbcc2b452e69d0d41f10a85e/greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", size = 272990, upload-time = "2024-09-20T17:08:26.312Z" }, - { url = "https://files.pythonhosted.org/packages/1c/ec/423d113c9f74e5e402e175b157203e9102feeb7088cee844d735b28ef963/greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", size = 649175, upload-time = "2024-09-20T17:36:48.983Z" }, - { url = "https://files.pythonhosted.org/packages/a9/46/ddbd2db9ff209186b7b7c621d1432e2f21714adc988703dbdd0e65155c77/greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", size = 663425, upload-time = "2024-09-20T17:39:22.705Z" }, - { url = "https://files.pythonhosted.org/packages/bc/f9/9c82d6b2b04aa37e38e74f0c429aece5eeb02bab6e3b98e7db89b23d94c6/greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", size = 657736, upload-time = "2024-09-20T17:44:28.544Z" }, - { url = "https://files.pythonhosted.org/packages/d9/42/b87bc2a81e3a62c3de2b0d550bf91a86939442b7ff85abb94eec3fc0e6aa/greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", size = 660347, upload-time = "2024-09-20T17:08:45.56Z" }, - { url = "https://files.pythonhosted.org/packages/37/fa/71599c3fd06336cdc3eac52e6871cfebab4d9d70674a9a9e7a482c318e99/greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", size = 615583, upload-time = "2024-09-20T17:08:36.85Z" }, - { url = "https://files.pythonhosted.org/packages/4e/96/e9ef85de031703ee7a4483489b40cf307f93c1824a02e903106f2ea315fe/greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", size = 1133039, upload-time = "2024-09-20T17:44:18.287Z" }, - { url = "https://files.pythonhosted.org/packages/87/76/b2b6362accd69f2d1889db61a18c94bc743e961e3cab344c2effaa4b4a25/greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", size = 1160716, upload-time = "2024-09-20T17:09:27.112Z" }, - { url = "https://files.pythonhosted.org/packages/1f/1b/54336d876186920e185066d8c3024ad55f21d7cc3683c856127ddb7b13ce/greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", size = 299490, upload-time = "2024-09-20T17:17:09.501Z" }, - { url = "https://files.pythonhosted.org/packages/5f/17/bea55bf36990e1638a2af5ba10c1640273ef20f627962cf97107f1e5d637/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", size = 643731, upload-time = "2024-09-20T17:36:50.376Z" }, - { url = "https://files.pythonhosted.org/packages/78/d2/aa3d2157f9ab742a08e0fd8f77d4699f37c22adfbfeb0c610a186b5f75e0/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", size = 649304, upload-time = "2024-09-20T17:39:24.55Z" }, - { url = "https://files.pythonhosted.org/packages/f1/8e/d0aeffe69e53ccff5a28fa86f07ad1d2d2d6537a9506229431a2a02e2f15/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", size = 646537, upload-time = "2024-09-20T17:44:31.102Z" }, - { url = "https://files.pythonhosted.org/packages/05/79/e15408220bbb989469c8871062c97c6c9136770657ba779711b90870d867/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", size = 642506, upload-time = "2024-09-20T17:08:47.852Z" }, - { url = "https://files.pythonhosted.org/packages/18/87/470e01a940307796f1d25f8167b551a968540fbe0551c0ebb853cb527dd6/greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", size = 602753, upload-time = "2024-09-20T17:08:38.079Z" }, - { url = "https://files.pythonhosted.org/packages/e2/72/576815ba674eddc3c25028238f74d7b8068902b3968cbe456771b166455e/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", size = 1122731, upload-time = "2024-09-20T17:44:20.556Z" }, - { url = "https://files.pythonhosted.org/packages/ac/38/08cc303ddddc4b3d7c628c3039a61a3aae36c241ed01393d00c2fd663473/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", size = 1142112, upload-time = "2024-09-20T17:09:28.753Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/2f/ff/df5fede753cc10f6a5be0931204ea30c35fa2f2ea7a35b25bdaf4fe40e46/greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", size = 186022, upload_time = "2024-09-20T18:21:04.506Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/62/1c2665558618553c42922ed47a4e6d6527e2fa3516a8256c2f431c5d0441/greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70", size = 272479, upload_time = "2024-09-20T17:07:22.332Z" }, + { url = "https://files.pythonhosted.org/packages/76/9d/421e2d5f07285b6e4e3a676b016ca781f63cfe4a0cd8eaecf3fd6f7a71ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159", size = 640404, upload_time = "2024-09-20T17:36:45.588Z" }, + { url = "https://files.pythonhosted.org/packages/e5/de/6e05f5c59262a584e502dd3d261bbdd2c97ab5416cc9c0b91ea38932a901/greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e", size = 652813, upload_time = "2024-09-20T17:39:19.052Z" }, + { url = "https://files.pythonhosted.org/packages/49/93/d5f93c84241acdea15a8fd329362c2c71c79e1a507c3f142a5d67ea435ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1", size = 648517, upload_time = "2024-09-20T17:44:24.101Z" }, + { url = "https://files.pythonhosted.org/packages/15/85/72f77fc02d00470c86a5c982b8daafdf65d38aefbbe441cebff3bf7037fc/greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383", size = 647831, upload_time = "2024-09-20T17:08:40.577Z" }, + { url = "https://files.pythonhosted.org/packages/f7/4b/1c9695aa24f808e156c8f4813f685d975ca73c000c2a5056c514c64980f6/greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a", size = 602413, upload_time = "2024-09-20T17:08:31.728Z" }, + { url = "https://files.pythonhosted.org/packages/76/70/ad6e5b31ef330f03b12559d19fda2606a522d3849cde46b24f223d6d1619/greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511", size = 1129619, upload_time = "2024-09-20T17:44:14.222Z" }, + { url = "https://files.pythonhosted.org/packages/f4/fb/201e1b932e584066e0f0658b538e73c459b34d44b4bd4034f682423bc801/greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395", size = 1155198, upload_time = "2024-09-20T17:09:23.903Z" }, + { url = "https://files.pythonhosted.org/packages/12/da/b9ed5e310bb8b89661b80cbcd4db5a067903bbcd7fc854923f5ebb4144f0/greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39", size = 298930, upload_time = "2024-09-20T17:25:18.656Z" }, + { url = "https://files.pythonhosted.org/packages/7d/ec/bad1ac26764d26aa1353216fcbfa4670050f66d445448aafa227f8b16e80/greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", size = 274260, upload_time = "2024-09-20T17:08:07.301Z" }, + { url = "https://files.pythonhosted.org/packages/66/d4/c8c04958870f482459ab5956c2942c4ec35cac7fe245527f1039837c17a9/greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", size = 649064, upload_time = "2024-09-20T17:36:47.628Z" }, + { url = "https://files.pythonhosted.org/packages/51/41/467b12a8c7c1303d20abcca145db2be4e6cd50a951fa30af48b6ec607581/greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", size = 663420, upload_time = "2024-09-20T17:39:21.258Z" }, + { url = "https://files.pythonhosted.org/packages/27/8f/2a93cd9b1e7107d5c7b3b7816eeadcac2ebcaf6d6513df9abaf0334777f6/greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", size = 658035, upload_time = "2024-09-20T17:44:26.501Z" }, + { url = "https://files.pythonhosted.org/packages/57/5c/7c6f50cb12be092e1dccb2599be5a942c3416dbcfb76efcf54b3f8be4d8d/greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", size = 660105, upload_time = "2024-09-20T17:08:42.048Z" }, + { url = "https://files.pythonhosted.org/packages/f1/66/033e58a50fd9ec9df00a8671c74f1f3a320564c6415a4ed82a1c651654ba/greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", size = 613077, upload_time = "2024-09-20T17:08:33.707Z" }, + { url = "https://files.pythonhosted.org/packages/19/c5/36384a06f748044d06bdd8776e231fadf92fc896bd12cb1c9f5a1bda9578/greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", size = 1135975, upload_time = "2024-09-20T17:44:15.989Z" }, + { url = "https://files.pythonhosted.org/packages/38/f9/c0a0eb61bdf808d23266ecf1d63309f0e1471f284300ce6dac0ae1231881/greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", size = 1163955, upload_time = "2024-09-20T17:09:25.539Z" }, + { url = "https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", size = 299655, upload_time = "2024-09-20T17:21:22.427Z" }, + { url = "https://files.pythonhosted.org/packages/f3/57/0db4940cd7bb461365ca8d6fd53e68254c9dbbcc2b452e69d0d41f10a85e/greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", size = 272990, upload_time = "2024-09-20T17:08:26.312Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ec/423d113c9f74e5e402e175b157203e9102feeb7088cee844d735b28ef963/greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", size = 649175, upload_time = "2024-09-20T17:36:48.983Z" }, + { url = "https://files.pythonhosted.org/packages/a9/46/ddbd2db9ff209186b7b7c621d1432e2f21714adc988703dbdd0e65155c77/greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", size = 663425, upload_time = "2024-09-20T17:39:22.705Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f9/9c82d6b2b04aa37e38e74f0c429aece5eeb02bab6e3b98e7db89b23d94c6/greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", size = 657736, upload_time = "2024-09-20T17:44:28.544Z" }, + { url = "https://files.pythonhosted.org/packages/d9/42/b87bc2a81e3a62c3de2b0d550bf91a86939442b7ff85abb94eec3fc0e6aa/greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", size = 660347, upload_time = "2024-09-20T17:08:45.56Z" }, + { url = "https://files.pythonhosted.org/packages/37/fa/71599c3fd06336cdc3eac52e6871cfebab4d9d70674a9a9e7a482c318e99/greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", size = 615583, upload_time = "2024-09-20T17:08:36.85Z" }, + { url = "https://files.pythonhosted.org/packages/4e/96/e9ef85de031703ee7a4483489b40cf307f93c1824a02e903106f2ea315fe/greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", size = 1133039, upload_time = "2024-09-20T17:44:18.287Z" }, + { url = "https://files.pythonhosted.org/packages/87/76/b2b6362accd69f2d1889db61a18c94bc743e961e3cab344c2effaa4b4a25/greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", size = 1160716, upload_time = "2024-09-20T17:09:27.112Z" }, + { url = "https://files.pythonhosted.org/packages/1f/1b/54336d876186920e185066d8c3024ad55f21d7cc3683c856127ddb7b13ce/greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", size = 299490, upload_time = "2024-09-20T17:17:09.501Z" }, + { url = "https://files.pythonhosted.org/packages/5f/17/bea55bf36990e1638a2af5ba10c1640273ef20f627962cf97107f1e5d637/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", size = 643731, upload_time = "2024-09-20T17:36:50.376Z" }, + { url = "https://files.pythonhosted.org/packages/78/d2/aa3d2157f9ab742a08e0fd8f77d4699f37c22adfbfeb0c610a186b5f75e0/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", size = 649304, upload_time = "2024-09-20T17:39:24.55Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8e/d0aeffe69e53ccff5a28fa86f07ad1d2d2d6537a9506229431a2a02e2f15/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", size = 646537, upload_time = "2024-09-20T17:44:31.102Z" }, + { url = "https://files.pythonhosted.org/packages/05/79/e15408220bbb989469c8871062c97c6c9136770657ba779711b90870d867/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", size = 642506, upload_time = "2024-09-20T17:08:47.852Z" }, + { url = "https://files.pythonhosted.org/packages/18/87/470e01a940307796f1d25f8167b551a968540fbe0551c0ebb853cb527dd6/greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", size = 602753, upload_time = "2024-09-20T17:08:38.079Z" }, + { url = "https://files.pythonhosted.org/packages/e2/72/576815ba674eddc3c25028238f74d7b8068902b3968cbe456771b166455e/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", size = 1122731, upload_time = "2024-09-20T17:44:20.556Z" }, + { url = "https://files.pythonhosted.org/packages/ac/38/08cc303ddddc4b3d7c628c3039a61a3aae36c241ed01393d00c2fd663473/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", size = 1142112, upload_time = "2024-09-20T17:09:28.753Z" }, ] [[package]] name = "h11" version = "0.16.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload_time = "2025-04-24T03:35:25.427Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload_time = "2025-04-24T03:35:24.344Z" }, ] [[package]] @@ -821,9 +821,9 @@ dependencies = [ { name = "certifi" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload_time = "2025-04-24T22:06:22.219Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload_time = "2025-04-24T22:06:20.566Z" }, ] [[package]] @@ -833,38 +833,38 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyparsing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3d/ad/2371116b22d616c194aa25ec410c9c6c37f23599dcd590502b74db197584/httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81", size = 351116, upload-time = "2023-03-21T22:29:37.214Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/ad/2371116b22d616c194aa25ec410c9c6c37f23599dcd590502b74db197584/httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81", size = 351116, upload_time = "2023-03-21T22:29:37.214Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/6c/d2fbdaaa5959339d53ba38e94c123e4e84b8fbc4b84beb0e70d7c1608486/httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc", size = 96854, upload-time = "2023-03-21T22:29:35.683Z" }, + { url = "https://files.pythonhosted.org/packages/a8/6c/d2fbdaaa5959339d53ba38e94c123e4e84b8fbc4b84beb0e70d7c1608486/httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc", size = 96854, upload_time = "2023-03-21T22:29:35.683Z" }, ] [[package]] name = "httptools" version = "0.6.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639, upload-time = "2024-10-16T19:45:08.902Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/26/bb526d4d14c2774fe07113ca1db7255737ffbb119315839af2065abfdac3/httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069", size = 199029, upload-time = "2024-10-16T19:44:18.427Z" }, - { url = "https://files.pythonhosted.org/packages/a6/17/3e0d3e9b901c732987a45f4f94d4e2c62b89a041d93db89eafb262afd8d5/httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a", size = 103492, upload-time = "2024-10-16T19:44:19.515Z" }, - { url = "https://files.pythonhosted.org/packages/b7/24/0fe235d7b69c42423c7698d086d4db96475f9b50b6ad26a718ef27a0bce6/httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975", size = 462891, upload-time = "2024-10-16T19:44:21.067Z" }, - { url = "https://files.pythonhosted.org/packages/b1/2f/205d1f2a190b72da6ffb5f41a3736c26d6fa7871101212b15e9b5cd8f61d/httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636", size = 459788, upload-time = "2024-10-16T19:44:22.958Z" }, - { url = "https://files.pythonhosted.org/packages/6e/4c/d09ce0eff09057a206a74575ae8f1e1e2f0364d20e2442224f9e6612c8b9/httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721", size = 433214, upload-time = "2024-10-16T19:44:24.513Z" }, - { url = "https://files.pythonhosted.org/packages/3e/d2/84c9e23edbccc4a4c6f96a1b8d99dfd2350289e94f00e9ccc7aadde26fb5/httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988", size = 434120, upload-time = "2024-10-16T19:44:26.295Z" }, - { url = "https://files.pythonhosted.org/packages/d0/46/4d8e7ba9581416de1c425b8264e2cadd201eb709ec1584c381f3e98f51c1/httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17", size = 88565, upload-time = "2024-10-16T19:44:29.188Z" }, - { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683, upload-time = "2024-10-16T19:44:30.175Z" }, - { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337, upload-time = "2024-10-16T19:44:31.786Z" }, - { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796, upload-time = "2024-10-16T19:44:32.825Z" }, - { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837, upload-time = "2024-10-16T19:44:33.974Z" }, - { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289, upload-time = "2024-10-16T19:44:35.111Z" }, - { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779, upload-time = "2024-10-16T19:44:36.253Z" }, - { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634, upload-time = "2024-10-16T19:44:37.357Z" }, - { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214, upload-time = "2024-10-16T19:44:38.738Z" }, - { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431, upload-time = "2024-10-16T19:44:39.818Z" }, - { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121, upload-time = "2024-10-16T19:44:41.189Z" }, - { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805, upload-time = "2024-10-16T19:44:42.384Z" }, - { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858, upload-time = "2024-10-16T19:44:43.959Z" }, - { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042, upload-time = "2024-10-16T19:44:45.071Z" }, - { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682, upload-time = "2024-10-16T19:44:46.46Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639, upload_time = "2024-10-16T19:45:08.902Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/26/bb526d4d14c2774fe07113ca1db7255737ffbb119315839af2065abfdac3/httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069", size = 199029, upload_time = "2024-10-16T19:44:18.427Z" }, + { url = "https://files.pythonhosted.org/packages/a6/17/3e0d3e9b901c732987a45f4f94d4e2c62b89a041d93db89eafb262afd8d5/httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a", size = 103492, upload_time = "2024-10-16T19:44:19.515Z" }, + { url = "https://files.pythonhosted.org/packages/b7/24/0fe235d7b69c42423c7698d086d4db96475f9b50b6ad26a718ef27a0bce6/httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975", size = 462891, upload_time = "2024-10-16T19:44:21.067Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2f/205d1f2a190b72da6ffb5f41a3736c26d6fa7871101212b15e9b5cd8f61d/httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636", size = 459788, upload_time = "2024-10-16T19:44:22.958Z" }, + { url = "https://files.pythonhosted.org/packages/6e/4c/d09ce0eff09057a206a74575ae8f1e1e2f0364d20e2442224f9e6612c8b9/httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721", size = 433214, upload_time = "2024-10-16T19:44:24.513Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/84c9e23edbccc4a4c6f96a1b8d99dfd2350289e94f00e9ccc7aadde26fb5/httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988", size = 434120, upload_time = "2024-10-16T19:44:26.295Z" }, + { url = "https://files.pythonhosted.org/packages/d0/46/4d8e7ba9581416de1c425b8264e2cadd201eb709ec1584c381f3e98f51c1/httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17", size = 88565, upload_time = "2024-10-16T19:44:29.188Z" }, + { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683, upload_time = "2024-10-16T19:44:30.175Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337, upload_time = "2024-10-16T19:44:31.786Z" }, + { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796, upload_time = "2024-10-16T19:44:32.825Z" }, + { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837, upload_time = "2024-10-16T19:44:33.974Z" }, + { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289, upload_time = "2024-10-16T19:44:35.111Z" }, + { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779, upload_time = "2024-10-16T19:44:36.253Z" }, + { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634, upload_time = "2024-10-16T19:44:37.357Z" }, + { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214, upload_time = "2024-10-16T19:44:38.738Z" }, + { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431, upload_time = "2024-10-16T19:44:39.818Z" }, + { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121, upload_time = "2024-10-16T19:44:41.189Z" }, + { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805, upload_time = "2024-10-16T19:44:42.384Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858, upload_time = "2024-10-16T19:44:43.959Z" }, + { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042, upload_time = "2024-10-16T19:44:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682, upload_time = "2024-10-16T19:44:46.46Z" }, ] [[package]] @@ -877,9 +877,9 @@ dependencies = [ { name = "httpcore" }, { name = "idna" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload_time = "2024-12-06T15:37:23.222Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload_time = "2024-12-06T15:37:21.509Z" }, ] [[package]] @@ -895,27 +895,27 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e7/ce/a734204aaae6c35a22f9956ebcd8d8708ae5b842e15d6f42bd6f49e634a4/huggingface_hub-0.28.1.tar.gz", hash = "sha256:893471090c98e3b6efbdfdacafe4052b20b84d59866fb6f54c33d9af18c303ae", size = 387074, upload-time = "2025-01-30T13:45:41.519Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/ce/a734204aaae6c35a22f9956ebcd8d8708ae5b842e15d6f42bd6f49e634a4/huggingface_hub-0.28.1.tar.gz", hash = "sha256:893471090c98e3b6efbdfdacafe4052b20b84d59866fb6f54c33d9af18c303ae", size = 387074, upload_time = "2025-01-30T13:45:41.519Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/da/6c2bea5327b640920267d3bf2c9fc114cfbd0a5de234d81cda80cc9e33c8/huggingface_hub-0.28.1-py3-none-any.whl", hash = "sha256:aa6b9a3ffdae939b72c464dbb0d7f99f56e649b55c3d52406f49e0a5a620c0a7", size = 464068, upload-time = "2025-01-30T13:45:39.514Z" }, + { url = "https://files.pythonhosted.org/packages/ea/da/6c2bea5327b640920267d3bf2c9fc114cfbd0a5de234d81cda80cc9e33c8/huggingface_hub-0.28.1-py3-none-any.whl", hash = "sha256:aa6b9a3ffdae939b72c464dbb0d7f99f56e649b55c3d52406f49e0a5a620c0a7", size = 464068, upload_time = "2025-01-30T13:45:39.514Z" }, ] [[package]] name = "idna" version = "3.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload_time = "2024-09-15T18:07:39.745Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload_time = "2024-09-15T18:07:37.964Z" }, ] [[package]] name = "iniconfig" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload_time = "2025-03-19T20:09:59.721Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload_time = "2025-03-19T20:10:01.071Z" }, ] [[package]] @@ -925,82 +925,82 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload_time = "2025-03-05T20:05:02.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload_time = "2025-03-05T20:05:00.369Z" }, ] [[package]] name = "jiter" version = "0.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1e/c2/e4562507f52f0af7036da125bb699602ead37a2332af0788f8e0a3417f36/jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893", size = 162604, upload-time = "2025-03-10T21:37:03.278Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/23/44/e241a043f114299254e44d7e777ead311da400517f179665e59611ab0ee4/jiter-0.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6c4d99c71508912a7e556d631768dcdef43648a93660670986916b297f1c54af", size = 314654, upload-time = "2025-03-10T21:35:23.939Z" }, - { url = "https://files.pythonhosted.org/packages/fb/1b/a7e5e42db9fa262baaa9489d8d14ca93f8663e7f164ed5e9acc9f467fc00/jiter-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f60fb8ce7df529812bf6c625635a19d27f30806885139e367af93f6e734ef58", size = 320909, upload-time = "2025-03-10T21:35:26.127Z" }, - { url = "https://files.pythonhosted.org/packages/60/bf/8ebdfce77bc04b81abf2ea316e9c03b4a866a7d739cf355eae4d6fd9f6fe/jiter-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51c4e1a4f8ea84d98b7b98912aa4290ac3d1eabfde8e3c34541fae30e9d1f08b", size = 341733, upload-time = "2025-03-10T21:35:27.94Z" }, - { url = "https://files.pythonhosted.org/packages/a8/4e/754ebce77cff9ab34d1d0fa0fe98f5d42590fd33622509a3ba6ec37ff466/jiter-0.9.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f4c677c424dc76684fea3e7285a7a2a7493424bea89ac441045e6a1fb1d7b3b", size = 365097, upload-time = "2025-03-10T21:35:29.605Z" }, - { url = "https://files.pythonhosted.org/packages/32/2c/6019587e6f5844c612ae18ca892f4cd7b3d8bbf49461ed29e384a0f13d98/jiter-0.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2221176dfec87f3470b21e6abca056e6b04ce9bff72315cb0b243ca9e835a4b5", size = 406603, upload-time = "2025-03-10T21:35:31.696Z" }, - { url = "https://files.pythonhosted.org/packages/da/e9/c9e6546c817ab75a1a7dab6dcc698e62e375e1017113e8e983fccbd56115/jiter-0.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c7adb66f899ffa25e3c92bfcb593391ee1947dbdd6a9a970e0d7e713237d572", size = 396625, upload-time = "2025-03-10T21:35:33.182Z" }, - { url = "https://files.pythonhosted.org/packages/be/bd/976b458add04271ebb5a255e992bd008546ea04bb4dcadc042a16279b4b4/jiter-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c98d27330fdfb77913c1097a7aab07f38ff2259048949f499c9901700789ac15", size = 351832, upload-time = "2025-03-10T21:35:35.394Z" }, - { url = "https://files.pythonhosted.org/packages/07/51/fe59e307aaebec9265dbad44d9d4381d030947e47b0f23531579b9a7c2df/jiter-0.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eda3f8cc74df66892b1d06b5d41a71670c22d95a1ca2cbab73654745ce9d0419", size = 384590, upload-time = "2025-03-10T21:35:37.171Z" }, - { url = "https://files.pythonhosted.org/packages/db/55/5dcd2693794d8e6f4889389ff66ef3be557a77f8aeeca8973a97a7c00557/jiter-0.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd5ab5ddc11418dce28343123644a100f487eaccf1de27a459ab36d6cca31043", size = 520690, upload-time = "2025-03-10T21:35:38.717Z" }, - { url = "https://files.pythonhosted.org/packages/54/d5/9f51dc90985e9eb251fbbb747ab2b13b26601f16c595a7b8baba964043bd/jiter-0.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42f8a68a69f047b310319ef8e2f52fdb2e7976fb3313ef27df495cf77bcad965", size = 512649, upload-time = "2025-03-10T21:35:40.157Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e5/4e385945179bcf128fa10ad8dca9053d717cbe09e258110e39045c881fe5/jiter-0.9.0-cp311-cp311-win32.whl", hash = "sha256:a25519efb78a42254d59326ee417d6f5161b06f5da827d94cf521fed961b1ff2", size = 206920, upload-time = "2025-03-10T21:35:41.72Z" }, - { url = "https://files.pythonhosted.org/packages/4c/47/5e0b94c603d8e54dd1faab439b40b832c277d3b90743e7835879ab663757/jiter-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:923b54afdd697dfd00d368b7ccad008cccfeb1efb4e621f32860c75e9f25edbd", size = 210119, upload-time = "2025-03-10T21:35:43.46Z" }, - { url = "https://files.pythonhosted.org/packages/af/d7/c55086103d6f29b694ec79156242304adf521577530d9031317ce5338c59/jiter-0.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7b46249cfd6c48da28f89eb0be3f52d6fdb40ab88e2c66804f546674e539ec11", size = 309203, upload-time = "2025-03-10T21:35:44.852Z" }, - { url = "https://files.pythonhosted.org/packages/b0/01/f775dfee50beb420adfd6baf58d1c4d437de41c9b666ddf127c065e5a488/jiter-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:609cf3c78852f1189894383cf0b0b977665f54cb38788e3e6b941fa6d982c00e", size = 319678, upload-time = "2025-03-10T21:35:46.365Z" }, - { url = "https://files.pythonhosted.org/packages/ab/b8/09b73a793714726893e5d46d5c534a63709261af3d24444ad07885ce87cb/jiter-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d726a3890a54561e55a9c5faea1f7655eda7f105bd165067575ace6e65f80bb2", size = 341816, upload-time = "2025-03-10T21:35:47.856Z" }, - { url = "https://files.pythonhosted.org/packages/35/6f/b8f89ec5398b2b0d344257138182cc090302854ed63ed9c9051e9c673441/jiter-0.9.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2e89dc075c1fef8fa9be219e249f14040270dbc507df4215c324a1839522ea75", size = 364152, upload-time = "2025-03-10T21:35:49.397Z" }, - { url = "https://files.pythonhosted.org/packages/9b/ca/978cc3183113b8e4484cc7e210a9ad3c6614396e7abd5407ea8aa1458eef/jiter-0.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04e8ffa3c353b1bc4134f96f167a2082494351e42888dfcf06e944f2729cbe1d", size = 406991, upload-time = "2025-03-10T21:35:50.745Z" }, - { url = "https://files.pythonhosted.org/packages/13/3a/72861883e11a36d6aa314b4922125f6ae90bdccc225cd96d24cc78a66385/jiter-0.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:203f28a72a05ae0e129b3ed1f75f56bc419d5f91dfacd057519a8bd137b00c42", size = 395824, upload-time = "2025-03-10T21:35:52.162Z" }, - { url = "https://files.pythonhosted.org/packages/87/67/22728a86ef53589c3720225778f7c5fdb617080e3deaed58b04789418212/jiter-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fca1a02ad60ec30bb230f65bc01f611c8608b02d269f998bc29cca8619a919dc", size = 351318, upload-time = "2025-03-10T21:35:53.566Z" }, - { url = "https://files.pythonhosted.org/packages/69/b9/f39728e2e2007276806d7a6609cda7fac44ffa28ca0d02c49a4f397cc0d9/jiter-0.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:237e5cee4d5d2659aaf91bbf8ec45052cc217d9446070699441a91b386ae27dc", size = 384591, upload-time = "2025-03-10T21:35:54.95Z" }, - { url = "https://files.pythonhosted.org/packages/eb/8f/8a708bc7fd87b8a5d861f1c118a995eccbe6d672fe10c9753e67362d0dd0/jiter-0.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:528b6b71745e7326eed73c53d4aa57e2a522242320b6f7d65b9c5af83cf49b6e", size = 520746, upload-time = "2025-03-10T21:35:56.444Z" }, - { url = "https://files.pythonhosted.org/packages/95/1e/65680c7488bd2365dbd2980adaf63c562d3d41d3faac192ebc7ef5b4ae25/jiter-0.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9f48e86b57bc711eb5acdfd12b6cb580a59cc9a993f6e7dcb6d8b50522dcd50d", size = 512754, upload-time = "2025-03-10T21:35:58.789Z" }, - { url = "https://files.pythonhosted.org/packages/78/f3/fdc43547a9ee6e93c837685da704fb6da7dba311fc022e2766d5277dfde5/jiter-0.9.0-cp312-cp312-win32.whl", hash = "sha256:699edfde481e191d81f9cf6d2211debbfe4bd92f06410e7637dffb8dd5dfde06", size = 207075, upload-time = "2025-03-10T21:36:00.616Z" }, - { url = "https://files.pythonhosted.org/packages/cd/9d/742b289016d155f49028fe1bfbeb935c9bf0ffeefdf77daf4a63a42bb72b/jiter-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:099500d07b43f61d8bd780466d429c45a7b25411b334c60ca875fa775f68ccb0", size = 207999, upload-time = "2025-03-10T21:36:02.366Z" }, - { url = "https://files.pythonhosted.org/packages/e7/1b/4cd165c362e8f2f520fdb43245e2b414f42a255921248b4f8b9c8d871ff1/jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7", size = 308197, upload-time = "2025-03-10T21:36:03.828Z" }, - { url = "https://files.pythonhosted.org/packages/13/aa/7a890dfe29c84c9a82064a9fe36079c7c0309c91b70c380dc138f9bea44a/jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b", size = 318160, upload-time = "2025-03-10T21:36:05.281Z" }, - { url = "https://files.pythonhosted.org/packages/6a/38/5888b43fc01102f733f085673c4f0be5a298f69808ec63de55051754e390/jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69", size = 341259, upload-time = "2025-03-10T21:36:06.716Z" }, - { url = "https://files.pythonhosted.org/packages/3d/5e/bbdbb63305bcc01006de683b6228cd061458b9b7bb9b8d9bc348a58e5dc2/jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103", size = 363730, upload-time = "2025-03-10T21:36:08.138Z" }, - { url = "https://files.pythonhosted.org/packages/75/85/53a3edc616992fe4af6814c25f91ee3b1e22f7678e979b6ea82d3bc0667e/jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635", size = 405126, upload-time = "2025-03-10T21:36:10.934Z" }, - { url = "https://files.pythonhosted.org/packages/ae/b3/1ee26b12b2693bd3f0b71d3188e4e5d817b12e3c630a09e099e0a89e28fa/jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4", size = 393668, upload-time = "2025-03-10T21:36:12.468Z" }, - { url = "https://files.pythonhosted.org/packages/11/87/e084ce261950c1861773ab534d49127d1517b629478304d328493f980791/jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d", size = 352350, upload-time = "2025-03-10T21:36:14.148Z" }, - { url = "https://files.pythonhosted.org/packages/f0/06/7dca84b04987e9df563610aa0bc154ea176e50358af532ab40ffb87434df/jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3", size = 384204, upload-time = "2025-03-10T21:36:15.545Z" }, - { url = "https://files.pythonhosted.org/packages/16/2f/82e1c6020db72f397dd070eec0c85ebc4df7c88967bc86d3ce9864148f28/jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5", size = 520322, upload-time = "2025-03-10T21:36:17.016Z" }, - { url = "https://files.pythonhosted.org/packages/36/fd/4f0cd3abe83ce208991ca61e7e5df915aa35b67f1c0633eb7cf2f2e88ec7/jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d", size = 512184, upload-time = "2025-03-10T21:36:18.47Z" }, - { url = "https://files.pythonhosted.org/packages/a0/3c/8a56f6d547731a0b4410a2d9d16bf39c861046f91f57c98f7cab3d2aa9ce/jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53", size = 206504, upload-time = "2025-03-10T21:36:19.809Z" }, - { url = "https://files.pythonhosted.org/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7", size = 204943, upload-time = "2025-03-10T21:36:21.536Z" }, - { url = "https://files.pythonhosted.org/packages/78/0f/77a63ca7aa5fed9a1b9135af57e190d905bcd3702b36aca46a01090d39ad/jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001", size = 317281, upload-time = "2025-03-10T21:36:22.959Z" }, - { url = "https://files.pythonhosted.org/packages/f9/39/a3a1571712c2bf6ec4c657f0d66da114a63a2e32b7e4eb8e0b83295ee034/jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a", size = 350273, upload-time = "2025-03-10T21:36:24.414Z" }, - { url = "https://files.pythonhosted.org/packages/ee/47/3729f00f35a696e68da15d64eb9283c330e776f3b5789bac7f2c0c4df209/jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf", size = 206867, upload-time = "2025-03-10T21:36:25.843Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/1e/c2/e4562507f52f0af7036da125bb699602ead37a2332af0788f8e0a3417f36/jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893", size = 162604, upload_time = "2025-03-10T21:37:03.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/44/e241a043f114299254e44d7e777ead311da400517f179665e59611ab0ee4/jiter-0.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6c4d99c71508912a7e556d631768dcdef43648a93660670986916b297f1c54af", size = 314654, upload_time = "2025-03-10T21:35:23.939Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/a7e5e42db9fa262baaa9489d8d14ca93f8663e7f164ed5e9acc9f467fc00/jiter-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f60fb8ce7df529812bf6c625635a19d27f30806885139e367af93f6e734ef58", size = 320909, upload_time = "2025-03-10T21:35:26.127Z" }, + { url = "https://files.pythonhosted.org/packages/60/bf/8ebdfce77bc04b81abf2ea316e9c03b4a866a7d739cf355eae4d6fd9f6fe/jiter-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51c4e1a4f8ea84d98b7b98912aa4290ac3d1eabfde8e3c34541fae30e9d1f08b", size = 341733, upload_time = "2025-03-10T21:35:27.94Z" }, + { url = "https://files.pythonhosted.org/packages/a8/4e/754ebce77cff9ab34d1d0fa0fe98f5d42590fd33622509a3ba6ec37ff466/jiter-0.9.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f4c677c424dc76684fea3e7285a7a2a7493424bea89ac441045e6a1fb1d7b3b", size = 365097, upload_time = "2025-03-10T21:35:29.605Z" }, + { url = "https://files.pythonhosted.org/packages/32/2c/6019587e6f5844c612ae18ca892f4cd7b3d8bbf49461ed29e384a0f13d98/jiter-0.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2221176dfec87f3470b21e6abca056e6b04ce9bff72315cb0b243ca9e835a4b5", size = 406603, upload_time = "2025-03-10T21:35:31.696Z" }, + { url = "https://files.pythonhosted.org/packages/da/e9/c9e6546c817ab75a1a7dab6dcc698e62e375e1017113e8e983fccbd56115/jiter-0.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c7adb66f899ffa25e3c92bfcb593391ee1947dbdd6a9a970e0d7e713237d572", size = 396625, upload_time = "2025-03-10T21:35:33.182Z" }, + { url = "https://files.pythonhosted.org/packages/be/bd/976b458add04271ebb5a255e992bd008546ea04bb4dcadc042a16279b4b4/jiter-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c98d27330fdfb77913c1097a7aab07f38ff2259048949f499c9901700789ac15", size = 351832, upload_time = "2025-03-10T21:35:35.394Z" }, + { url = "https://files.pythonhosted.org/packages/07/51/fe59e307aaebec9265dbad44d9d4381d030947e47b0f23531579b9a7c2df/jiter-0.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eda3f8cc74df66892b1d06b5d41a71670c22d95a1ca2cbab73654745ce9d0419", size = 384590, upload_time = "2025-03-10T21:35:37.171Z" }, + { url = "https://files.pythonhosted.org/packages/db/55/5dcd2693794d8e6f4889389ff66ef3be557a77f8aeeca8973a97a7c00557/jiter-0.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd5ab5ddc11418dce28343123644a100f487eaccf1de27a459ab36d6cca31043", size = 520690, upload_time = "2025-03-10T21:35:38.717Z" }, + { url = "https://files.pythonhosted.org/packages/54/d5/9f51dc90985e9eb251fbbb747ab2b13b26601f16c595a7b8baba964043bd/jiter-0.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42f8a68a69f047b310319ef8e2f52fdb2e7976fb3313ef27df495cf77bcad965", size = 512649, upload_time = "2025-03-10T21:35:40.157Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e5/4e385945179bcf128fa10ad8dca9053d717cbe09e258110e39045c881fe5/jiter-0.9.0-cp311-cp311-win32.whl", hash = "sha256:a25519efb78a42254d59326ee417d6f5161b06f5da827d94cf521fed961b1ff2", size = 206920, upload_time = "2025-03-10T21:35:41.72Z" }, + { url = "https://files.pythonhosted.org/packages/4c/47/5e0b94c603d8e54dd1faab439b40b832c277d3b90743e7835879ab663757/jiter-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:923b54afdd697dfd00d368b7ccad008cccfeb1efb4e621f32860c75e9f25edbd", size = 210119, upload_time = "2025-03-10T21:35:43.46Z" }, + { url = "https://files.pythonhosted.org/packages/af/d7/c55086103d6f29b694ec79156242304adf521577530d9031317ce5338c59/jiter-0.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7b46249cfd6c48da28f89eb0be3f52d6fdb40ab88e2c66804f546674e539ec11", size = 309203, upload_time = "2025-03-10T21:35:44.852Z" }, + { url = "https://files.pythonhosted.org/packages/b0/01/f775dfee50beb420adfd6baf58d1c4d437de41c9b666ddf127c065e5a488/jiter-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:609cf3c78852f1189894383cf0b0b977665f54cb38788e3e6b941fa6d982c00e", size = 319678, upload_time = "2025-03-10T21:35:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/ab/b8/09b73a793714726893e5d46d5c534a63709261af3d24444ad07885ce87cb/jiter-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d726a3890a54561e55a9c5faea1f7655eda7f105bd165067575ace6e65f80bb2", size = 341816, upload_time = "2025-03-10T21:35:47.856Z" }, + { url = "https://files.pythonhosted.org/packages/35/6f/b8f89ec5398b2b0d344257138182cc090302854ed63ed9c9051e9c673441/jiter-0.9.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2e89dc075c1fef8fa9be219e249f14040270dbc507df4215c324a1839522ea75", size = 364152, upload_time = "2025-03-10T21:35:49.397Z" }, + { url = "https://files.pythonhosted.org/packages/9b/ca/978cc3183113b8e4484cc7e210a9ad3c6614396e7abd5407ea8aa1458eef/jiter-0.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04e8ffa3c353b1bc4134f96f167a2082494351e42888dfcf06e944f2729cbe1d", size = 406991, upload_time = "2025-03-10T21:35:50.745Z" }, + { url = "https://files.pythonhosted.org/packages/13/3a/72861883e11a36d6aa314b4922125f6ae90bdccc225cd96d24cc78a66385/jiter-0.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:203f28a72a05ae0e129b3ed1f75f56bc419d5f91dfacd057519a8bd137b00c42", size = 395824, upload_time = "2025-03-10T21:35:52.162Z" }, + { url = "https://files.pythonhosted.org/packages/87/67/22728a86ef53589c3720225778f7c5fdb617080e3deaed58b04789418212/jiter-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fca1a02ad60ec30bb230f65bc01f611c8608b02d269f998bc29cca8619a919dc", size = 351318, upload_time = "2025-03-10T21:35:53.566Z" }, + { url = "https://files.pythonhosted.org/packages/69/b9/f39728e2e2007276806d7a6609cda7fac44ffa28ca0d02c49a4f397cc0d9/jiter-0.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:237e5cee4d5d2659aaf91bbf8ec45052cc217d9446070699441a91b386ae27dc", size = 384591, upload_time = "2025-03-10T21:35:54.95Z" }, + { url = "https://files.pythonhosted.org/packages/eb/8f/8a708bc7fd87b8a5d861f1c118a995eccbe6d672fe10c9753e67362d0dd0/jiter-0.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:528b6b71745e7326eed73c53d4aa57e2a522242320b6f7d65b9c5af83cf49b6e", size = 520746, upload_time = "2025-03-10T21:35:56.444Z" }, + { url = "https://files.pythonhosted.org/packages/95/1e/65680c7488bd2365dbd2980adaf63c562d3d41d3faac192ebc7ef5b4ae25/jiter-0.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9f48e86b57bc711eb5acdfd12b6cb580a59cc9a993f6e7dcb6d8b50522dcd50d", size = 512754, upload_time = "2025-03-10T21:35:58.789Z" }, + { url = "https://files.pythonhosted.org/packages/78/f3/fdc43547a9ee6e93c837685da704fb6da7dba311fc022e2766d5277dfde5/jiter-0.9.0-cp312-cp312-win32.whl", hash = "sha256:699edfde481e191d81f9cf6d2211debbfe4bd92f06410e7637dffb8dd5dfde06", size = 207075, upload_time = "2025-03-10T21:36:00.616Z" }, + { url = "https://files.pythonhosted.org/packages/cd/9d/742b289016d155f49028fe1bfbeb935c9bf0ffeefdf77daf4a63a42bb72b/jiter-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:099500d07b43f61d8bd780466d429c45a7b25411b334c60ca875fa775f68ccb0", size = 207999, upload_time = "2025-03-10T21:36:02.366Z" }, + { url = "https://files.pythonhosted.org/packages/e7/1b/4cd165c362e8f2f520fdb43245e2b414f42a255921248b4f8b9c8d871ff1/jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7", size = 308197, upload_time = "2025-03-10T21:36:03.828Z" }, + { url = "https://files.pythonhosted.org/packages/13/aa/7a890dfe29c84c9a82064a9fe36079c7c0309c91b70c380dc138f9bea44a/jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b", size = 318160, upload_time = "2025-03-10T21:36:05.281Z" }, + { url = "https://files.pythonhosted.org/packages/6a/38/5888b43fc01102f733f085673c4f0be5a298f69808ec63de55051754e390/jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69", size = 341259, upload_time = "2025-03-10T21:36:06.716Z" }, + { url = "https://files.pythonhosted.org/packages/3d/5e/bbdbb63305bcc01006de683b6228cd061458b9b7bb9b8d9bc348a58e5dc2/jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103", size = 363730, upload_time = "2025-03-10T21:36:08.138Z" }, + { url = "https://files.pythonhosted.org/packages/75/85/53a3edc616992fe4af6814c25f91ee3b1e22f7678e979b6ea82d3bc0667e/jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635", size = 405126, upload_time = "2025-03-10T21:36:10.934Z" }, + { url = "https://files.pythonhosted.org/packages/ae/b3/1ee26b12b2693bd3f0b71d3188e4e5d817b12e3c630a09e099e0a89e28fa/jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4", size = 393668, upload_time = "2025-03-10T21:36:12.468Z" }, + { url = "https://files.pythonhosted.org/packages/11/87/e084ce261950c1861773ab534d49127d1517b629478304d328493f980791/jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d", size = 352350, upload_time = "2025-03-10T21:36:14.148Z" }, + { url = "https://files.pythonhosted.org/packages/f0/06/7dca84b04987e9df563610aa0bc154ea176e50358af532ab40ffb87434df/jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3", size = 384204, upload_time = "2025-03-10T21:36:15.545Z" }, + { url = "https://files.pythonhosted.org/packages/16/2f/82e1c6020db72f397dd070eec0c85ebc4df7c88967bc86d3ce9864148f28/jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5", size = 520322, upload_time = "2025-03-10T21:36:17.016Z" }, + { url = "https://files.pythonhosted.org/packages/36/fd/4f0cd3abe83ce208991ca61e7e5df915aa35b67f1c0633eb7cf2f2e88ec7/jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d", size = 512184, upload_time = "2025-03-10T21:36:18.47Z" }, + { url = "https://files.pythonhosted.org/packages/a0/3c/8a56f6d547731a0b4410a2d9d16bf39c861046f91f57c98f7cab3d2aa9ce/jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53", size = 206504, upload_time = "2025-03-10T21:36:19.809Z" }, + { url = "https://files.pythonhosted.org/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7", size = 204943, upload_time = "2025-03-10T21:36:21.536Z" }, + { url = "https://files.pythonhosted.org/packages/78/0f/77a63ca7aa5fed9a1b9135af57e190d905bcd3702b36aca46a01090d39ad/jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001", size = 317281, upload_time = "2025-03-10T21:36:22.959Z" }, + { url = "https://files.pythonhosted.org/packages/f9/39/a3a1571712c2bf6ec4c657f0d66da114a63a2e32b7e4eb8e0b83295ee034/jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a", size = 350273, upload_time = "2025-03-10T21:36:24.414Z" }, + { url = "https://files.pythonhosted.org/packages/ee/47/3729f00f35a696e68da15d64eb9283c330e776f3b5789bac7f2c0c4df209/jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf", size = 206867, upload_time = "2025-03-10T21:36:25.843Z" }, ] [[package]] name = "lxml" version = "5.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/73/a6/0730ff6cbb87e42e1329a486fe4ccbd3f8f728cb629c2671b0d093a85918/lxml-5.1.1.tar.gz", hash = "sha256:42a8aa957e98bd8b884a8142175ec24ce4ef0a57760e8879f193bfe64b757ca9", size = 3838907, upload-time = "2024-03-29T06:46:52.155Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/01/977ac832ec441dbde7b373faef715d8f58c4052cc88ae01070be7f3d7907/lxml-5.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:906966babd374fdfe46e130fc656488003f0d0d63b7cba612aa5a796c8804283", size = 8756105, upload-time = "2024-03-29T06:43:08.757Z" }, - { url = "https://files.pythonhosted.org/packages/7e/0a/8ef5c87c72ba4d9a8765c829d1abc28c8482ade37735c7c2725221243d3d/lxml-5.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9c03f3715c68fc707d9383d56e482d95d198ba07cb3dad4aee9e5a5ca06b2536", size = 4751802, upload-time = "2024-03-29T06:43:13.165Z" }, - { url = "https://files.pythonhosted.org/packages/b5/2a/9096d632371ce48dafcd0459520c9afd60d3b26b6c00a5d3f8e93fdb089d/lxml-5.1.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d26243d994d4077a50056e9008848e5b421be0c6f0fd4e932a9463e1d89fc42b", size = 5202069, upload-time = "2024-03-29T06:43:16.426Z" }, - { url = "https://files.pythonhosted.org/packages/7e/03/dea246cbe3d959062751ec1aa031972e61680ae4a60c67df08bb1305b465/lxml-5.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de00750318ae6869b9dfa6429a4f82b8ecad043049414547474d09db549c2ee", size = 4921442, upload-time = "2024-03-29T06:43:19.842Z" }, - { url = "https://files.pythonhosted.org/packages/84/71/0d510fe3f99a8ddb776d7b803ed1f41b9eb64b30c5f945f241edf238adfa/lxml-5.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29b2771b4eec4e85063f10294facdd9829d010e6cc9668040d0cf936dc56733a", size = 5084186, upload-time = "2024-03-29T06:43:23.7Z" }, - { url = "https://files.pythonhosted.org/packages/de/c3/9fb0276ad05f3dc454d2f8165181039da4cbfb605f53816d7f34d5e93cca/lxml-5.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d9358f7268c161dc0a1c3216018f26c04954b5dd47ba6dead79da6598f4725d4", size = 4962146, upload-time = "2024-03-29T06:43:27.312Z" }, - { url = "https://files.pythonhosted.org/packages/eb/4f/533dd6ece9f4aa2c8455244c074f61facb23944271cc82bcceccc1eca8a1/lxml-5.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8a943826e7a9254eed661a7134fcde3c832a9fecd989d0f47c6e08c7b769cb2c", size = 5094316, upload-time = "2024-03-29T06:43:30.877Z" }, - { url = "https://files.pythonhosted.org/packages/f9/bd/62cc8a995bd34b1f44fc3706bab0c21bde489dc56482a5f4c9a6bb11ff65/lxml-5.1.1-cp311-cp311-win32.whl", hash = "sha256:74d0967c6f91eec6fe91159f9e8ccb3720fa0fbf9f462109c7bef62550df397c", size = 3560964, upload-time = "2024-03-29T06:43:34.609Z" }, - { url = "https://files.pythonhosted.org/packages/02/7e/af62091cc2c3096573458cec140a914b54f4b36892f549449cc556ed34cb/lxml-5.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:26974096654241df08a30dc2eb0e139c1ad5653660aa4b2ced66000230e96c14", size = 3909680, upload-time = "2024-03-29T06:43:38.221Z" }, - { url = "https://files.pythonhosted.org/packages/e3/0a/3901402aef812c57c27d1bb5405a29abb345fbd7e1b595d060bb065e46c6/lxml-5.1.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:55e13a19829dcdbf0c5233062977aeb6daf72e65124909128045976f659164e8", size = 8786323, upload-time = "2024-03-29T06:43:42.886Z" }, - { url = "https://files.pythonhosted.org/packages/04/92/74df36e8ccecdc96260531f0cbbf849ed25d3ff77a5655a3c89d588e982d/lxml-5.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:adedfb61be862f48907218e3a24bf051fd2ecca53358f3958b0bdb17d7881c20", size = 4764866, upload-time = "2024-03-29T06:43:46.476Z" }, - { url = "https://files.pythonhosted.org/packages/7f/b2/5dfbbec91014ffac561d51d4e3467587a646572f111fd7ddd076568d34c7/lxml-5.1.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77425482e4311d1cff119a2b5ab26c52ec209d2a3d728a54db3223ab91995e20", size = 5153741, upload-time = "2024-03-29T06:43:50.444Z" }, - { url = "https://files.pythonhosted.org/packages/5b/cf/3da2e345dd19b509c9d269000f16888f4ef50f8ca742c268f8142a7e0b84/lxml-5.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d380f183bd03ab827899753ea96dabe27d2025eb0bfd4f2ac0eee4afa0f351d", size = 4853573, upload-time = "2024-03-29T06:43:53.449Z" }, - { url = "https://files.pythonhosted.org/packages/67/78/aad9c76bf995febcacd836e12ecc670c89737502ebe44f69c472918c8ffd/lxml-5.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8682af96b5ad5093aab9eee5e4ff24cb7a9796c78699d914dd456ebfe7484a6", size = 5035899, upload-time = "2024-03-29T06:43:57.342Z" }, - { url = "https://files.pythonhosted.org/packages/7e/88/d0cb086fb1b72fec96bb45aad1058ec31b9df3b146245747c0601490428b/lxml-5.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68eed33377a9925aed7ba56c8611d50aaa1e45638c07a92b4b4b0a0436cc2dd2", size = 4896851, upload-time = "2024-03-29T06:44:00.471Z" }, - { url = "https://files.pythonhosted.org/packages/5d/69/8cb0a076851dcc5fa185042d3f19e61edb596d677280085873fd49043529/lxml-5.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7c1d2f6e9c7a1c4478146ee38d16dbe0eb3be998424bc0f01346c671c38b86d", size = 5048250, upload-time = "2024-03-29T06:44:04.436Z" }, - { url = "https://files.pythonhosted.org/packages/3f/d7/a3d5f104c46231060d3e177ad946bf5c0bbc5652f960fbf2dedb66f0f9f7/lxml-5.1.1-cp312-cp312-win32.whl", hash = "sha256:81107c8de3e463052ae8fd05fd31b97c371c7a9ce4a189b8bb5f45b0b3545fb9", size = 3571032, upload-time = "2024-03-29T06:44:07.247Z" }, - { url = "https://files.pythonhosted.org/packages/d6/6b/a7c513c461b1448122d27faeb8f4b61150777816303a21fa6f9bb8be3266/lxml-5.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:0e46181d15fae102c53621bed9356b7a599a1e837b978c934a350dd00842b1d9", size = 3909299, upload-time = "2024-03-29T06:44:11.354Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/73/a6/0730ff6cbb87e42e1329a486fe4ccbd3f8f728cb629c2671b0d093a85918/lxml-5.1.1.tar.gz", hash = "sha256:42a8aa957e98bd8b884a8142175ec24ce4ef0a57760e8879f193bfe64b757ca9", size = 3838907, upload_time = "2024-03-29T06:46:52.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/01/977ac832ec441dbde7b373faef715d8f58c4052cc88ae01070be7f3d7907/lxml-5.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:906966babd374fdfe46e130fc656488003f0d0d63b7cba612aa5a796c8804283", size = 8756105, upload_time = "2024-03-29T06:43:08.757Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0a/8ef5c87c72ba4d9a8765c829d1abc28c8482ade37735c7c2725221243d3d/lxml-5.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9c03f3715c68fc707d9383d56e482d95d198ba07cb3dad4aee9e5a5ca06b2536", size = 4751802, upload_time = "2024-03-29T06:43:13.165Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2a/9096d632371ce48dafcd0459520c9afd60d3b26b6c00a5d3f8e93fdb089d/lxml-5.1.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d26243d994d4077a50056e9008848e5b421be0c6f0fd4e932a9463e1d89fc42b", size = 5202069, upload_time = "2024-03-29T06:43:16.426Z" }, + { url = "https://files.pythonhosted.org/packages/7e/03/dea246cbe3d959062751ec1aa031972e61680ae4a60c67df08bb1305b465/lxml-5.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de00750318ae6869b9dfa6429a4f82b8ecad043049414547474d09db549c2ee", size = 4921442, upload_time = "2024-03-29T06:43:19.842Z" }, + { url = "https://files.pythonhosted.org/packages/84/71/0d510fe3f99a8ddb776d7b803ed1f41b9eb64b30c5f945f241edf238adfa/lxml-5.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29b2771b4eec4e85063f10294facdd9829d010e6cc9668040d0cf936dc56733a", size = 5084186, upload_time = "2024-03-29T06:43:23.7Z" }, + { url = "https://files.pythonhosted.org/packages/de/c3/9fb0276ad05f3dc454d2f8165181039da4cbfb605f53816d7f34d5e93cca/lxml-5.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d9358f7268c161dc0a1c3216018f26c04954b5dd47ba6dead79da6598f4725d4", size = 4962146, upload_time = "2024-03-29T06:43:27.312Z" }, + { url = "https://files.pythonhosted.org/packages/eb/4f/533dd6ece9f4aa2c8455244c074f61facb23944271cc82bcceccc1eca8a1/lxml-5.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8a943826e7a9254eed661a7134fcde3c832a9fecd989d0f47c6e08c7b769cb2c", size = 5094316, upload_time = "2024-03-29T06:43:30.877Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bd/62cc8a995bd34b1f44fc3706bab0c21bde489dc56482a5f4c9a6bb11ff65/lxml-5.1.1-cp311-cp311-win32.whl", hash = "sha256:74d0967c6f91eec6fe91159f9e8ccb3720fa0fbf9f462109c7bef62550df397c", size = 3560964, upload_time = "2024-03-29T06:43:34.609Z" }, + { url = "https://files.pythonhosted.org/packages/02/7e/af62091cc2c3096573458cec140a914b54f4b36892f549449cc556ed34cb/lxml-5.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:26974096654241df08a30dc2eb0e139c1ad5653660aa4b2ced66000230e96c14", size = 3909680, upload_time = "2024-03-29T06:43:38.221Z" }, + { url = "https://files.pythonhosted.org/packages/e3/0a/3901402aef812c57c27d1bb5405a29abb345fbd7e1b595d060bb065e46c6/lxml-5.1.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:55e13a19829dcdbf0c5233062977aeb6daf72e65124909128045976f659164e8", size = 8786323, upload_time = "2024-03-29T06:43:42.886Z" }, + { url = "https://files.pythonhosted.org/packages/04/92/74df36e8ccecdc96260531f0cbbf849ed25d3ff77a5655a3c89d588e982d/lxml-5.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:adedfb61be862f48907218e3a24bf051fd2ecca53358f3958b0bdb17d7881c20", size = 4764866, upload_time = "2024-03-29T06:43:46.476Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b2/5dfbbec91014ffac561d51d4e3467587a646572f111fd7ddd076568d34c7/lxml-5.1.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77425482e4311d1cff119a2b5ab26c52ec209d2a3d728a54db3223ab91995e20", size = 5153741, upload_time = "2024-03-29T06:43:50.444Z" }, + { url = "https://files.pythonhosted.org/packages/5b/cf/3da2e345dd19b509c9d269000f16888f4ef50f8ca742c268f8142a7e0b84/lxml-5.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d380f183bd03ab827899753ea96dabe27d2025eb0bfd4f2ac0eee4afa0f351d", size = 4853573, upload_time = "2024-03-29T06:43:53.449Z" }, + { url = "https://files.pythonhosted.org/packages/67/78/aad9c76bf995febcacd836e12ecc670c89737502ebe44f69c472918c8ffd/lxml-5.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8682af96b5ad5093aab9eee5e4ff24cb7a9796c78699d914dd456ebfe7484a6", size = 5035899, upload_time = "2024-03-29T06:43:57.342Z" }, + { url = "https://files.pythonhosted.org/packages/7e/88/d0cb086fb1b72fec96bb45aad1058ec31b9df3b146245747c0601490428b/lxml-5.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68eed33377a9925aed7ba56c8611d50aaa1e45638c07a92b4b4b0a0436cc2dd2", size = 4896851, upload_time = "2024-03-29T06:44:00.471Z" }, + { url = "https://files.pythonhosted.org/packages/5d/69/8cb0a076851dcc5fa185042d3f19e61edb596d677280085873fd49043529/lxml-5.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7c1d2f6e9c7a1c4478146ee38d16dbe0eb3be998424bc0f01346c671c38b86d", size = 5048250, upload_time = "2024-03-29T06:44:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d7/a3d5f104c46231060d3e177ad946bf5c0bbc5652f960fbf2dedb66f0f9f7/lxml-5.1.1-cp312-cp312-win32.whl", hash = "sha256:81107c8de3e463052ae8fd05fd31b97c371c7a9ce4a189b8bb5f45b0b3545fb9", size = 3571032, upload_time = "2024-03-29T06:44:07.247Z" }, + { url = "https://files.pythonhosted.org/packages/d6/6b/a7c513c461b1448122d27faeb8f4b61150777816303a21fa6f9bb8be3266/lxml-5.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:0e46181d15fae102c53621bed9356b7a599a1e837b978c934a350dd00842b1d9", size = 3909299, upload_time = "2024-03-29T06:44:11.354Z" }, ] [[package]] @@ -1010,9 +1010,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9e/38/bd5b78a920a64d708fe6bc8e0a2c075e1389d53bef8413725c63ba041535/mako-1.3.10.tar.gz", hash = "sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28", size = 392474, upload-time = "2025-04-10T12:44:31.16Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/38/bd5b78a920a64d708fe6bc8e0a2c075e1389d53bef8413725c63ba041535/mako-1.3.10.tar.gz", hash = "sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28", size = 392474, upload_time = "2025-04-10T12:44:31.16Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59", size = 78509, upload-time = "2025-04-10T12:50:53.297Z" }, + { url = "https://files.pythonhosted.org/packages/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59", size = 78509, upload_time = "2025-04-10T12:50:53.297Z" }, ] [[package]] @@ -1022,57 +1022,57 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload_time = "2023-06-03T06:41:14.443Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload_time = "2023-06-03T06:41:11.019Z" }, ] [[package]] name = "markupsafe" version = "3.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload-time = "2024-10-18T15:21:02.187Z" }, - { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload-time = "2024-10-18T15:21:02.941Z" }, - { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload-time = "2024-10-18T15:21:03.953Z" }, - { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload-time = "2024-10-18T15:21:06.495Z" }, - { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload-time = "2024-10-18T15:21:07.295Z" }, - { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload-time = "2024-10-18T15:21:08.073Z" }, - { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload-time = "2024-10-18T15:21:09.318Z" }, - { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload-time = "2024-10-18T15:21:10.185Z" }, - { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload-time = "2024-10-18T15:21:11.005Z" }, - { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload-time = "2024-10-18T15:21:12.911Z" }, - { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload-time = "2024-10-18T15:21:13.777Z" }, - { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload-time = "2024-10-18T15:21:14.822Z" }, - { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload-time = "2024-10-18T15:21:15.642Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload-time = "2024-10-18T15:21:17.133Z" }, - { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload-time = "2024-10-18T15:21:18.064Z" }, - { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload-time = "2024-10-18T15:21:18.859Z" }, - { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload-time = "2024-10-18T15:21:19.671Z" }, - { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload-time = "2024-10-18T15:21:20.971Z" }, - { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload-time = "2024-10-18T15:21:22.646Z" }, - { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload-time = "2024-10-18T15:21:23.499Z" }, - { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" }, - { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" }, - { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" }, - { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" }, - { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" }, - { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" }, - { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" }, - { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" }, - { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" }, - { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" }, - { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" }, - { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" }, - { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" }, - { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" }, - { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" }, - { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" }, - { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" }, - { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" }, - { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload_time = "2024-10-18T15:21:54.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload_time = "2024-10-18T15:21:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload_time = "2024-10-18T15:21:02.941Z" }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload_time = "2024-10-18T15:21:03.953Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload_time = "2024-10-18T15:21:06.495Z" }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload_time = "2024-10-18T15:21:07.295Z" }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload_time = "2024-10-18T15:21:08.073Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload_time = "2024-10-18T15:21:09.318Z" }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload_time = "2024-10-18T15:21:10.185Z" }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload_time = "2024-10-18T15:21:11.005Z" }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload_time = "2024-10-18T15:21:12.911Z" }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload_time = "2024-10-18T15:21:13.777Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload_time = "2024-10-18T15:21:14.822Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload_time = "2024-10-18T15:21:15.642Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload_time = "2024-10-18T15:21:17.133Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload_time = "2024-10-18T15:21:18.064Z" }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload_time = "2024-10-18T15:21:18.859Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload_time = "2024-10-18T15:21:19.671Z" }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload_time = "2024-10-18T15:21:20.971Z" }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload_time = "2024-10-18T15:21:22.646Z" }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload_time = "2024-10-18T15:21:23.499Z" }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload_time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload_time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload_time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload_time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload_time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload_time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload_time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload_time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload_time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload_time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload_time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload_time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload_time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload_time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload_time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload_time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload_time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload_time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload_time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload_time = "2024-10-18T15:21:42.784Z" }, ] [[package]] @@ -1082,95 +1082,95 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fd/c0/d674c9de69227beafa41e1601b0c48b8b51060212abc231d4332e4b1e794/marshmallow-3.23.3.tar.gz", hash = "sha256:d586c8685ebdb80bf754e1f96e3f305aaf30951f1fc69175b977453633467e76", size = 175606, upload-time = "2025-01-03T20:18:41.52Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/c0/d674c9de69227beafa41e1601b0c48b8b51060212abc231d4332e4b1e794/marshmallow-3.23.3.tar.gz", hash = "sha256:d586c8685ebdb80bf754e1f96e3f305aaf30951f1fc69175b977453633467e76", size = 175606, upload_time = "2025-01-03T20:18:41.52Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/82/d8c37cc92948ce11e5d8d71602bbac7ac4257f9e1f918fd91b1ddac4ec97/marshmallow-3.23.3-py3-none-any.whl", hash = "sha256:20c0f8c613f68bcb45b2a0d3282e2f172575560170bf220d67aafb42717910e4", size = 48911, upload-time = "2025-01-03T20:18:39.62Z" }, + { url = "https://files.pythonhosted.org/packages/af/82/d8c37cc92948ce11e5d8d71602bbac7ac4257f9e1f918fd91b1ddac4ec97/marshmallow-3.23.3-py3-none-any.whl", hash = "sha256:20c0f8c613f68bcb45b2a0d3282e2f172575560170bf220d67aafb42717910e4", size = 48911, upload_time = "2025-01-03T20:18:39.62Z" }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload_time = "2022-08-14T12:40:09.779Z" }, ] [[package]] name = "multidict" version = "6.4.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/da/2c/e367dfb4c6538614a0c9453e510d75d66099edf1c4e69da1b5ce691a1931/multidict-6.4.3.tar.gz", hash = "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", size = 89372, upload-time = "2025-04-10T22:20:17.956Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/16/e0/53cf7f27eda48fffa53cfd4502329ed29e00efb9e4ce41362cbf8aa54310/multidict-6.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", size = 65259, upload-time = "2025-04-10T22:17:59.632Z" }, - { url = "https://files.pythonhosted.org/packages/44/79/1dcd93ce7070cf01c2ee29f781c42b33c64fce20033808f1cc9ec8413d6e/multidict-6.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", size = 38451, upload-time = "2025-04-10T22:18:01.202Z" }, - { url = "https://files.pythonhosted.org/packages/f4/35/2292cf29ab5f0d0b3613fad1b75692148959d3834d806be1885ceb49a8ff/multidict-6.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad", size = 37706, upload-time = "2025-04-10T22:18:02.276Z" }, - { url = "https://files.pythonhosted.org/packages/f6/d1/6b157110b2b187b5a608b37714acb15ee89ec773e3800315b0107ea648cd/multidict-6.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", size = 226669, upload-time = "2025-04-10T22:18:03.436Z" }, - { url = "https://files.pythonhosted.org/packages/40/7f/61a476450651f177c5570e04bd55947f693077ba7804fe9717ee9ae8de04/multidict-6.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", size = 223182, upload-time = "2025-04-10T22:18:04.922Z" }, - { url = "https://files.pythonhosted.org/packages/51/7b/eaf7502ac4824cdd8edcf5723e2e99f390c879866aec7b0c420267b53749/multidict-6.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", size = 235025, upload-time = "2025-04-10T22:18:06.274Z" }, - { url = "https://files.pythonhosted.org/packages/3b/f6/facdbbd73c96b67a93652774edd5778ab1167854fa08ea35ad004b1b70ad/multidict-6.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", size = 231481, upload-time = "2025-04-10T22:18:07.742Z" }, - { url = "https://files.pythonhosted.org/packages/70/57/c008e861b3052405eebf921fd56a748322d8c44dcfcab164fffbccbdcdc4/multidict-6.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", size = 223492, upload-time = "2025-04-10T22:18:09.095Z" }, - { url = "https://files.pythonhosted.org/packages/30/4d/7d8440d3a12a6ae5d6b202d6e7f2ac6ab026e04e99aaf1b73f18e6bc34bc/multidict-6.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", size = 217279, upload-time = "2025-04-10T22:18:10.474Z" }, - { url = "https://files.pythonhosted.org/packages/7f/e7/bca0df4dd057597b94138d2d8af04eb3c27396a425b1b0a52e082f9be621/multidict-6.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", size = 228733, upload-time = "2025-04-10T22:18:11.793Z" }, - { url = "https://files.pythonhosted.org/packages/88/f5/383827c3f1c38d7c92dbad00a8a041760228573b1c542fbf245c37bbca8a/multidict-6.4.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", size = 218089, upload-time = "2025-04-10T22:18:13.153Z" }, - { url = "https://files.pythonhosted.org/packages/36/8a/a5174e8a7d8b94b4c8f9c1e2cf5d07451f41368ffe94d05fc957215b8e72/multidict-6.4.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", size = 225257, upload-time = "2025-04-10T22:18:14.654Z" }, - { url = "https://files.pythonhosted.org/packages/8c/76/1d4b7218f0fd00b8e5c90b88df2e45f8af127f652f4e41add947fa54c1c4/multidict-6.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", size = 234728, upload-time = "2025-04-10T22:18:16.236Z" }, - { url = "https://files.pythonhosted.org/packages/64/44/18372a4f6273fc7ca25630d7bf9ae288cde64f29593a078bff450c7170b6/multidict-6.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", size = 230087, upload-time = "2025-04-10T22:18:17.979Z" }, - { url = "https://files.pythonhosted.org/packages/0f/ae/28728c314a698d8a6d9491fcacc897077348ec28dd85884d09e64df8a855/multidict-6.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", size = 223137, upload-time = "2025-04-10T22:18:19.362Z" }, - { url = "https://files.pythonhosted.org/packages/22/50/785bb2b3fe16051bc91c70a06a919f26312da45c34db97fc87441d61e343/multidict-6.4.3-cp311-cp311-win32.whl", hash = "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", size = 34959, upload-time = "2025-04-10T22:18:20.728Z" }, - { url = "https://files.pythonhosted.org/packages/2f/63/2a22e099ae2f4d92897618c00c73a09a08a2a9aa14b12736965bf8d59fd3/multidict-6.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", size = 38541, upload-time = "2025-04-10T22:18:22.001Z" }, - { url = "https://files.pythonhosted.org/packages/fc/bb/3abdaf8fe40e9226ce8a2ba5ecf332461f7beec478a455d6587159f1bf92/multidict-6.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", size = 64019, upload-time = "2025-04-10T22:18:23.174Z" }, - { url = "https://files.pythonhosted.org/packages/7e/b5/1b2e8de8217d2e89db156625aa0fe4a6faad98972bfe07a7b8c10ef5dd6b/multidict-6.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", size = 37925, upload-time = "2025-04-10T22:18:24.834Z" }, - { url = "https://files.pythonhosted.org/packages/b4/e2/3ca91c112644a395c8eae017144c907d173ea910c913ff8b62549dcf0bbf/multidict-6.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", size = 37008, upload-time = "2025-04-10T22:18:26.069Z" }, - { url = "https://files.pythonhosted.org/packages/60/23/79bc78146c7ac8d1ac766b2770ca2e07c2816058b8a3d5da6caed8148637/multidict-6.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", size = 224374, upload-time = "2025-04-10T22:18:27.714Z" }, - { url = "https://files.pythonhosted.org/packages/86/35/77950ed9ebd09136003a85c1926ba42001ca5be14feb49710e4334ee199b/multidict-6.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", size = 230869, upload-time = "2025-04-10T22:18:29.162Z" }, - { url = "https://files.pythonhosted.org/packages/49/97/2a33c6e7d90bc116c636c14b2abab93d6521c0c052d24bfcc231cbf7f0e7/multidict-6.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", size = 231949, upload-time = "2025-04-10T22:18:30.679Z" }, - { url = "https://files.pythonhosted.org/packages/56/ce/e9b5d9fcf854f61d6686ada7ff64893a7a5523b2a07da6f1265eaaea5151/multidict-6.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", size = 231032, upload-time = "2025-04-10T22:18:32.146Z" }, - { url = "https://files.pythonhosted.org/packages/f0/ac/7ced59dcdfeddd03e601edb05adff0c66d81ed4a5160c443e44f2379eef0/multidict-6.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", size = 223517, upload-time = "2025-04-10T22:18:33.538Z" }, - { url = "https://files.pythonhosted.org/packages/db/e6/325ed9055ae4e085315193a1b58bdb4d7fc38ffcc1f4975cfca97d015e17/multidict-6.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", size = 216291, upload-time = "2025-04-10T22:18:34.962Z" }, - { url = "https://files.pythonhosted.org/packages/fa/84/eeee6d477dd9dcb7691c3bb9d08df56017f5dd15c730bcc9383dcf201cf4/multidict-6.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", size = 228982, upload-time = "2025-04-10T22:18:36.443Z" }, - { url = "https://files.pythonhosted.org/packages/82/94/4d1f3e74e7acf8b0c85db350e012dcc61701cd6668bc2440bb1ecb423c90/multidict-6.4.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", size = 226823, upload-time = "2025-04-10T22:18:37.924Z" }, - { url = "https://files.pythonhosted.org/packages/09/f0/1e54b95bda7cd01080e5732f9abb7b76ab5cc795b66605877caeb2197476/multidict-6.4.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", size = 222714, upload-time = "2025-04-10T22:18:39.807Z" }, - { url = "https://files.pythonhosted.org/packages/e7/a2/f6cbca875195bd65a3e53b37ab46486f3cc125bdeab20eefe5042afa31fb/multidict-6.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", size = 233739, upload-time = "2025-04-10T22:18:41.341Z" }, - { url = "https://files.pythonhosted.org/packages/79/68/9891f4d2b8569554723ddd6154375295f789dc65809826c6fb96a06314fd/multidict-6.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", size = 230809, upload-time = "2025-04-10T22:18:42.817Z" }, - { url = "https://files.pythonhosted.org/packages/e6/72/a7be29ba1e87e4fc5ceb44dabc7940b8005fd2436a332a23547709315f70/multidict-6.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", size = 226934, upload-time = "2025-04-10T22:18:44.311Z" }, - { url = "https://files.pythonhosted.org/packages/12/c1/259386a9ad6840ff7afc686da96808b503d152ac4feb3a96c651dc4f5abf/multidict-6.4.3-cp312-cp312-win32.whl", hash = "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", size = 35242, upload-time = "2025-04-10T22:18:46.193Z" }, - { url = "https://files.pythonhosted.org/packages/06/24/c8fdff4f924d37225dc0c56a28b1dca10728fc2233065fafeb27b4b125be/multidict-6.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", size = 38635, upload-time = "2025-04-10T22:18:47.498Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4b/86fd786d03915c6f49998cf10cd5fe6b6ac9e9a071cb40885d2e080fb90d/multidict-6.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", size = 63831, upload-time = "2025-04-10T22:18:48.748Z" }, - { url = "https://files.pythonhosted.org/packages/45/05/9b51fdf7aef2563340a93be0a663acba2c428c4daeaf3960d92d53a4a930/multidict-6.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", size = 37888, upload-time = "2025-04-10T22:18:50.021Z" }, - { url = "https://files.pythonhosted.org/packages/0b/43/53fc25394386c911822419b522181227ca450cf57fea76e6188772a1bd91/multidict-6.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", size = 36852, upload-time = "2025-04-10T22:18:51.246Z" }, - { url = "https://files.pythonhosted.org/packages/8a/68/7b99c751e822467c94a235b810a2fd4047d4ecb91caef6b5c60116991c4b/multidict-6.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", size = 223644, upload-time = "2025-04-10T22:18:52.965Z" }, - { url = "https://files.pythonhosted.org/packages/80/1b/d458d791e4dd0f7e92596667784fbf99e5c8ba040affe1ca04f06b93ae92/multidict-6.4.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", size = 230446, upload-time = "2025-04-10T22:18:54.509Z" }, - { url = "https://files.pythonhosted.org/packages/e2/46/9793378d988905491a7806d8987862dc5a0bae8a622dd896c4008c7b226b/multidict-6.4.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", size = 231070, upload-time = "2025-04-10T22:18:56.019Z" }, - { url = "https://files.pythonhosted.org/packages/a7/b8/b127d3e1f8dd2a5bf286b47b24567ae6363017292dc6dec44656e6246498/multidict-6.4.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", size = 229956, upload-time = "2025-04-10T22:18:59.146Z" }, - { url = "https://files.pythonhosted.org/packages/0c/93/f70a4c35b103fcfe1443059a2bb7f66e5c35f2aea7804105ff214f566009/multidict-6.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", size = 222599, upload-time = "2025-04-10T22:19:00.657Z" }, - { url = "https://files.pythonhosted.org/packages/63/8c/e28e0eb2fe34921d6aa32bfc4ac75b09570b4d6818cc95d25499fe08dc1d/multidict-6.4.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", size = 216136, upload-time = "2025-04-10T22:19:02.244Z" }, - { url = "https://files.pythonhosted.org/packages/72/f5/fbc81f866585b05f89f99d108be5d6ad170e3b6c4d0723d1a2f6ba5fa918/multidict-6.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", size = 228139, upload-time = "2025-04-10T22:19:04.151Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ba/7d196bad6b85af2307d81f6979c36ed9665f49626f66d883d6c64d156f78/multidict-6.4.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", size = 226251, upload-time = "2025-04-10T22:19:06.117Z" }, - { url = "https://files.pythonhosted.org/packages/cc/e2/fae46a370dce79d08b672422a33df721ec8b80105e0ea8d87215ff6b090d/multidict-6.4.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", size = 221868, upload-time = "2025-04-10T22:19:07.981Z" }, - { url = "https://files.pythonhosted.org/packages/26/20/bbc9a3dec19d5492f54a167f08546656e7aef75d181d3d82541463450e88/multidict-6.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", size = 233106, upload-time = "2025-04-10T22:19:09.5Z" }, - { url = "https://files.pythonhosted.org/packages/ee/8d/f30ae8f5ff7a2461177f4d8eb0d8f69f27fb6cfe276b54ec4fd5a282d918/multidict-6.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", size = 230163, upload-time = "2025-04-10T22:19:11Z" }, - { url = "https://files.pythonhosted.org/packages/15/e9/2833f3c218d3c2179f3093f766940ded6b81a49d2e2f9c46ab240d23dfec/multidict-6.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", size = 225906, upload-time = "2025-04-10T22:19:12.875Z" }, - { url = "https://files.pythonhosted.org/packages/f1/31/6edab296ac369fd286b845fa5dd4c409e63bc4655ed8c9510fcb477e9ae9/multidict-6.4.3-cp313-cp313-win32.whl", hash = "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", size = 35238, upload-time = "2025-04-10T22:19:14.41Z" }, - { url = "https://files.pythonhosted.org/packages/23/57/2c0167a1bffa30d9a1383c3dab99d8caae985defc8636934b5668830d2ef/multidict-6.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", size = 38799, upload-time = "2025-04-10T22:19:15.869Z" }, - { url = "https://files.pythonhosted.org/packages/c9/13/2ead63b9ab0d2b3080819268acb297bd66e238070aa8d42af12b08cbee1c/multidict-6.4.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", size = 68642, upload-time = "2025-04-10T22:19:17.527Z" }, - { url = "https://files.pythonhosted.org/packages/85/45/f1a751e1eede30c23951e2ae274ce8fad738e8a3d5714be73e0a41b27b16/multidict-6.4.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", size = 40028, upload-time = "2025-04-10T22:19:19.465Z" }, - { url = "https://files.pythonhosted.org/packages/a7/29/fcc53e886a2cc5595cc4560df333cb9630257bda65003a7eb4e4e0d8f9c1/multidict-6.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", size = 39424, upload-time = "2025-04-10T22:19:20.762Z" }, - { url = "https://files.pythonhosted.org/packages/f6/f0/056c81119d8b88703971f937b371795cab1407cd3c751482de5bfe1a04a9/multidict-6.4.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", size = 226178, upload-time = "2025-04-10T22:19:22.17Z" }, - { url = "https://files.pythonhosted.org/packages/a3/79/3b7e5fea0aa80583d3a69c9d98b7913dfd4fbc341fb10bb2fb48d35a9c21/multidict-6.4.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", size = 222617, upload-time = "2025-04-10T22:19:23.773Z" }, - { url = "https://files.pythonhosted.org/packages/06/db/3ed012b163e376fc461e1d6a67de69b408339bc31dc83d39ae9ec3bf9578/multidict-6.4.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", size = 227919, upload-time = "2025-04-10T22:19:25.35Z" }, - { url = "https://files.pythonhosted.org/packages/b1/db/0433c104bca380989bc04d3b841fc83e95ce0c89f680e9ea4251118b52b6/multidict-6.4.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", size = 226097, upload-time = "2025-04-10T22:19:27.183Z" }, - { url = "https://files.pythonhosted.org/packages/c2/95/910db2618175724dd254b7ae635b6cd8d2947a8b76b0376de7b96d814dab/multidict-6.4.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", size = 220706, upload-time = "2025-04-10T22:19:28.882Z" }, - { url = "https://files.pythonhosted.org/packages/d1/af/aa176c6f5f1d901aac957d5258d5e22897fe13948d1e69063ae3d5d0ca01/multidict-6.4.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", size = 211728, upload-time = "2025-04-10T22:19:30.481Z" }, - { url = "https://files.pythonhosted.org/packages/e7/42/d51cc5fc1527c3717d7f85137d6c79bb7a93cd214c26f1fc57523774dbb5/multidict-6.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", size = 226276, upload-time = "2025-04-10T22:19:32.454Z" }, - { url = "https://files.pythonhosted.org/packages/28/6b/d836dea45e0b8432343ba4acf9a8ecaa245da4c0960fb7ab45088a5e568a/multidict-6.4.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", size = 212069, upload-time = "2025-04-10T22:19:34.17Z" }, - { url = "https://files.pythonhosted.org/packages/55/34/0ee1a7adb3560e18ee9289c6e5f7db54edc312b13e5c8263e88ea373d12c/multidict-6.4.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", size = 217858, upload-time = "2025-04-10T22:19:35.879Z" }, - { url = "https://files.pythonhosted.org/packages/04/08/586d652c2f5acefe0cf4e658eedb4d71d4ba6dfd4f189bd81b400fc1bc6b/multidict-6.4.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", size = 226988, upload-time = "2025-04-10T22:19:37.434Z" }, - { url = "https://files.pythonhosted.org/packages/82/e3/cc59c7e2bc49d7f906fb4ffb6d9c3a3cf21b9f2dd9c96d05bef89c2b1fd1/multidict-6.4.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", size = 220435, upload-time = "2025-04-10T22:19:39.005Z" }, - { url = "https://files.pythonhosted.org/packages/e0/32/5c3a556118aca9981d883f38c4b1bfae646f3627157f70f4068e5a648955/multidict-6.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", size = 221494, upload-time = "2025-04-10T22:19:41.447Z" }, - { url = "https://files.pythonhosted.org/packages/b9/3b/1599631f59024b75c4d6e3069f4502409970a336647502aaf6b62fb7ac98/multidict-6.4.3-cp313-cp313t-win32.whl", hash = "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", size = 41775, upload-time = "2025-04-10T22:19:43.707Z" }, - { url = "https://files.pythonhosted.org/packages/e8/4e/09301668d675d02ca8e8e1a3e6be046619e30403f5ada2ed5b080ae28d02/multidict-6.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", size = 45946, upload-time = "2025-04-10T22:19:45.071Z" }, - { url = "https://files.pythonhosted.org/packages/96/10/7d526c8974f017f1e7ca584c71ee62a638e9334d8d33f27d7cdfc9ae79e4/multidict-6.4.3-py3-none-any.whl", hash = "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", size = 10400, upload-time = "2025-04-10T22:20:16.445Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/da/2c/e367dfb4c6538614a0c9453e510d75d66099edf1c4e69da1b5ce691a1931/multidict-6.4.3.tar.gz", hash = "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", size = 89372, upload_time = "2025-04-10T22:20:17.956Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/e0/53cf7f27eda48fffa53cfd4502329ed29e00efb9e4ce41362cbf8aa54310/multidict-6.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", size = 65259, upload_time = "2025-04-10T22:17:59.632Z" }, + { url = "https://files.pythonhosted.org/packages/44/79/1dcd93ce7070cf01c2ee29f781c42b33c64fce20033808f1cc9ec8413d6e/multidict-6.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", size = 38451, upload_time = "2025-04-10T22:18:01.202Z" }, + { url = "https://files.pythonhosted.org/packages/f4/35/2292cf29ab5f0d0b3613fad1b75692148959d3834d806be1885ceb49a8ff/multidict-6.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad", size = 37706, upload_time = "2025-04-10T22:18:02.276Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d1/6b157110b2b187b5a608b37714acb15ee89ec773e3800315b0107ea648cd/multidict-6.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", size = 226669, upload_time = "2025-04-10T22:18:03.436Z" }, + { url = "https://files.pythonhosted.org/packages/40/7f/61a476450651f177c5570e04bd55947f693077ba7804fe9717ee9ae8de04/multidict-6.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", size = 223182, upload_time = "2025-04-10T22:18:04.922Z" }, + { url = "https://files.pythonhosted.org/packages/51/7b/eaf7502ac4824cdd8edcf5723e2e99f390c879866aec7b0c420267b53749/multidict-6.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", size = 235025, upload_time = "2025-04-10T22:18:06.274Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f6/facdbbd73c96b67a93652774edd5778ab1167854fa08ea35ad004b1b70ad/multidict-6.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", size = 231481, upload_time = "2025-04-10T22:18:07.742Z" }, + { url = "https://files.pythonhosted.org/packages/70/57/c008e861b3052405eebf921fd56a748322d8c44dcfcab164fffbccbdcdc4/multidict-6.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", size = 223492, upload_time = "2025-04-10T22:18:09.095Z" }, + { url = "https://files.pythonhosted.org/packages/30/4d/7d8440d3a12a6ae5d6b202d6e7f2ac6ab026e04e99aaf1b73f18e6bc34bc/multidict-6.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", size = 217279, upload_time = "2025-04-10T22:18:10.474Z" }, + { url = "https://files.pythonhosted.org/packages/7f/e7/bca0df4dd057597b94138d2d8af04eb3c27396a425b1b0a52e082f9be621/multidict-6.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", size = 228733, upload_time = "2025-04-10T22:18:11.793Z" }, + { url = "https://files.pythonhosted.org/packages/88/f5/383827c3f1c38d7c92dbad00a8a041760228573b1c542fbf245c37bbca8a/multidict-6.4.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", size = 218089, upload_time = "2025-04-10T22:18:13.153Z" }, + { url = "https://files.pythonhosted.org/packages/36/8a/a5174e8a7d8b94b4c8f9c1e2cf5d07451f41368ffe94d05fc957215b8e72/multidict-6.4.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", size = 225257, upload_time = "2025-04-10T22:18:14.654Z" }, + { url = "https://files.pythonhosted.org/packages/8c/76/1d4b7218f0fd00b8e5c90b88df2e45f8af127f652f4e41add947fa54c1c4/multidict-6.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", size = 234728, upload_time = "2025-04-10T22:18:16.236Z" }, + { url = "https://files.pythonhosted.org/packages/64/44/18372a4f6273fc7ca25630d7bf9ae288cde64f29593a078bff450c7170b6/multidict-6.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", size = 230087, upload_time = "2025-04-10T22:18:17.979Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/28728c314a698d8a6d9491fcacc897077348ec28dd85884d09e64df8a855/multidict-6.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", size = 223137, upload_time = "2025-04-10T22:18:19.362Z" }, + { url = "https://files.pythonhosted.org/packages/22/50/785bb2b3fe16051bc91c70a06a919f26312da45c34db97fc87441d61e343/multidict-6.4.3-cp311-cp311-win32.whl", hash = "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", size = 34959, upload_time = "2025-04-10T22:18:20.728Z" }, + { url = "https://files.pythonhosted.org/packages/2f/63/2a22e099ae2f4d92897618c00c73a09a08a2a9aa14b12736965bf8d59fd3/multidict-6.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", size = 38541, upload_time = "2025-04-10T22:18:22.001Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bb/3abdaf8fe40e9226ce8a2ba5ecf332461f7beec478a455d6587159f1bf92/multidict-6.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", size = 64019, upload_time = "2025-04-10T22:18:23.174Z" }, + { url = "https://files.pythonhosted.org/packages/7e/b5/1b2e8de8217d2e89db156625aa0fe4a6faad98972bfe07a7b8c10ef5dd6b/multidict-6.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", size = 37925, upload_time = "2025-04-10T22:18:24.834Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e2/3ca91c112644a395c8eae017144c907d173ea910c913ff8b62549dcf0bbf/multidict-6.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", size = 37008, upload_time = "2025-04-10T22:18:26.069Z" }, + { url = "https://files.pythonhosted.org/packages/60/23/79bc78146c7ac8d1ac766b2770ca2e07c2816058b8a3d5da6caed8148637/multidict-6.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", size = 224374, upload_time = "2025-04-10T22:18:27.714Z" }, + { url = "https://files.pythonhosted.org/packages/86/35/77950ed9ebd09136003a85c1926ba42001ca5be14feb49710e4334ee199b/multidict-6.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", size = 230869, upload_time = "2025-04-10T22:18:29.162Z" }, + { url = "https://files.pythonhosted.org/packages/49/97/2a33c6e7d90bc116c636c14b2abab93d6521c0c052d24bfcc231cbf7f0e7/multidict-6.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", size = 231949, upload_time = "2025-04-10T22:18:30.679Z" }, + { url = "https://files.pythonhosted.org/packages/56/ce/e9b5d9fcf854f61d6686ada7ff64893a7a5523b2a07da6f1265eaaea5151/multidict-6.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", size = 231032, upload_time = "2025-04-10T22:18:32.146Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ac/7ced59dcdfeddd03e601edb05adff0c66d81ed4a5160c443e44f2379eef0/multidict-6.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", size = 223517, upload_time = "2025-04-10T22:18:33.538Z" }, + { url = "https://files.pythonhosted.org/packages/db/e6/325ed9055ae4e085315193a1b58bdb4d7fc38ffcc1f4975cfca97d015e17/multidict-6.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", size = 216291, upload_time = "2025-04-10T22:18:34.962Z" }, + { url = "https://files.pythonhosted.org/packages/fa/84/eeee6d477dd9dcb7691c3bb9d08df56017f5dd15c730bcc9383dcf201cf4/multidict-6.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", size = 228982, upload_time = "2025-04-10T22:18:36.443Z" }, + { url = "https://files.pythonhosted.org/packages/82/94/4d1f3e74e7acf8b0c85db350e012dcc61701cd6668bc2440bb1ecb423c90/multidict-6.4.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", size = 226823, upload_time = "2025-04-10T22:18:37.924Z" }, + { url = "https://files.pythonhosted.org/packages/09/f0/1e54b95bda7cd01080e5732f9abb7b76ab5cc795b66605877caeb2197476/multidict-6.4.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", size = 222714, upload_time = "2025-04-10T22:18:39.807Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a2/f6cbca875195bd65a3e53b37ab46486f3cc125bdeab20eefe5042afa31fb/multidict-6.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", size = 233739, upload_time = "2025-04-10T22:18:41.341Z" }, + { url = "https://files.pythonhosted.org/packages/79/68/9891f4d2b8569554723ddd6154375295f789dc65809826c6fb96a06314fd/multidict-6.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", size = 230809, upload_time = "2025-04-10T22:18:42.817Z" }, + { url = "https://files.pythonhosted.org/packages/e6/72/a7be29ba1e87e4fc5ceb44dabc7940b8005fd2436a332a23547709315f70/multidict-6.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", size = 226934, upload_time = "2025-04-10T22:18:44.311Z" }, + { url = "https://files.pythonhosted.org/packages/12/c1/259386a9ad6840ff7afc686da96808b503d152ac4feb3a96c651dc4f5abf/multidict-6.4.3-cp312-cp312-win32.whl", hash = "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", size = 35242, upload_time = "2025-04-10T22:18:46.193Z" }, + { url = "https://files.pythonhosted.org/packages/06/24/c8fdff4f924d37225dc0c56a28b1dca10728fc2233065fafeb27b4b125be/multidict-6.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", size = 38635, upload_time = "2025-04-10T22:18:47.498Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4b/86fd786d03915c6f49998cf10cd5fe6b6ac9e9a071cb40885d2e080fb90d/multidict-6.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", size = 63831, upload_time = "2025-04-10T22:18:48.748Z" }, + { url = "https://files.pythonhosted.org/packages/45/05/9b51fdf7aef2563340a93be0a663acba2c428c4daeaf3960d92d53a4a930/multidict-6.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", size = 37888, upload_time = "2025-04-10T22:18:50.021Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/53fc25394386c911822419b522181227ca450cf57fea76e6188772a1bd91/multidict-6.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", size = 36852, upload_time = "2025-04-10T22:18:51.246Z" }, + { url = "https://files.pythonhosted.org/packages/8a/68/7b99c751e822467c94a235b810a2fd4047d4ecb91caef6b5c60116991c4b/multidict-6.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", size = 223644, upload_time = "2025-04-10T22:18:52.965Z" }, + { url = "https://files.pythonhosted.org/packages/80/1b/d458d791e4dd0f7e92596667784fbf99e5c8ba040affe1ca04f06b93ae92/multidict-6.4.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", size = 230446, upload_time = "2025-04-10T22:18:54.509Z" }, + { url = "https://files.pythonhosted.org/packages/e2/46/9793378d988905491a7806d8987862dc5a0bae8a622dd896c4008c7b226b/multidict-6.4.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", size = 231070, upload_time = "2025-04-10T22:18:56.019Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b8/b127d3e1f8dd2a5bf286b47b24567ae6363017292dc6dec44656e6246498/multidict-6.4.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", size = 229956, upload_time = "2025-04-10T22:18:59.146Z" }, + { url = "https://files.pythonhosted.org/packages/0c/93/f70a4c35b103fcfe1443059a2bb7f66e5c35f2aea7804105ff214f566009/multidict-6.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", size = 222599, upload_time = "2025-04-10T22:19:00.657Z" }, + { url = "https://files.pythonhosted.org/packages/63/8c/e28e0eb2fe34921d6aa32bfc4ac75b09570b4d6818cc95d25499fe08dc1d/multidict-6.4.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", size = 216136, upload_time = "2025-04-10T22:19:02.244Z" }, + { url = "https://files.pythonhosted.org/packages/72/f5/fbc81f866585b05f89f99d108be5d6ad170e3b6c4d0723d1a2f6ba5fa918/multidict-6.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", size = 228139, upload_time = "2025-04-10T22:19:04.151Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ba/7d196bad6b85af2307d81f6979c36ed9665f49626f66d883d6c64d156f78/multidict-6.4.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", size = 226251, upload_time = "2025-04-10T22:19:06.117Z" }, + { url = "https://files.pythonhosted.org/packages/cc/e2/fae46a370dce79d08b672422a33df721ec8b80105e0ea8d87215ff6b090d/multidict-6.4.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", size = 221868, upload_time = "2025-04-10T22:19:07.981Z" }, + { url = "https://files.pythonhosted.org/packages/26/20/bbc9a3dec19d5492f54a167f08546656e7aef75d181d3d82541463450e88/multidict-6.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", size = 233106, upload_time = "2025-04-10T22:19:09.5Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8d/f30ae8f5ff7a2461177f4d8eb0d8f69f27fb6cfe276b54ec4fd5a282d918/multidict-6.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", size = 230163, upload_time = "2025-04-10T22:19:11Z" }, + { url = "https://files.pythonhosted.org/packages/15/e9/2833f3c218d3c2179f3093f766940ded6b81a49d2e2f9c46ab240d23dfec/multidict-6.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", size = 225906, upload_time = "2025-04-10T22:19:12.875Z" }, + { url = "https://files.pythonhosted.org/packages/f1/31/6edab296ac369fd286b845fa5dd4c409e63bc4655ed8c9510fcb477e9ae9/multidict-6.4.3-cp313-cp313-win32.whl", hash = "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", size = 35238, upload_time = "2025-04-10T22:19:14.41Z" }, + { url = "https://files.pythonhosted.org/packages/23/57/2c0167a1bffa30d9a1383c3dab99d8caae985defc8636934b5668830d2ef/multidict-6.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", size = 38799, upload_time = "2025-04-10T22:19:15.869Z" }, + { url = "https://files.pythonhosted.org/packages/c9/13/2ead63b9ab0d2b3080819268acb297bd66e238070aa8d42af12b08cbee1c/multidict-6.4.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", size = 68642, upload_time = "2025-04-10T22:19:17.527Z" }, + { url = "https://files.pythonhosted.org/packages/85/45/f1a751e1eede30c23951e2ae274ce8fad738e8a3d5714be73e0a41b27b16/multidict-6.4.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", size = 40028, upload_time = "2025-04-10T22:19:19.465Z" }, + { url = "https://files.pythonhosted.org/packages/a7/29/fcc53e886a2cc5595cc4560df333cb9630257bda65003a7eb4e4e0d8f9c1/multidict-6.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", size = 39424, upload_time = "2025-04-10T22:19:20.762Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f0/056c81119d8b88703971f937b371795cab1407cd3c751482de5bfe1a04a9/multidict-6.4.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", size = 226178, upload_time = "2025-04-10T22:19:22.17Z" }, + { url = "https://files.pythonhosted.org/packages/a3/79/3b7e5fea0aa80583d3a69c9d98b7913dfd4fbc341fb10bb2fb48d35a9c21/multidict-6.4.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", size = 222617, upload_time = "2025-04-10T22:19:23.773Z" }, + { url = "https://files.pythonhosted.org/packages/06/db/3ed012b163e376fc461e1d6a67de69b408339bc31dc83d39ae9ec3bf9578/multidict-6.4.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", size = 227919, upload_time = "2025-04-10T22:19:25.35Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/0433c104bca380989bc04d3b841fc83e95ce0c89f680e9ea4251118b52b6/multidict-6.4.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", size = 226097, upload_time = "2025-04-10T22:19:27.183Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/910db2618175724dd254b7ae635b6cd8d2947a8b76b0376de7b96d814dab/multidict-6.4.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", size = 220706, upload_time = "2025-04-10T22:19:28.882Z" }, + { url = "https://files.pythonhosted.org/packages/d1/af/aa176c6f5f1d901aac957d5258d5e22897fe13948d1e69063ae3d5d0ca01/multidict-6.4.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", size = 211728, upload_time = "2025-04-10T22:19:30.481Z" }, + { url = "https://files.pythonhosted.org/packages/e7/42/d51cc5fc1527c3717d7f85137d6c79bb7a93cd214c26f1fc57523774dbb5/multidict-6.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", size = 226276, upload_time = "2025-04-10T22:19:32.454Z" }, + { url = "https://files.pythonhosted.org/packages/28/6b/d836dea45e0b8432343ba4acf9a8ecaa245da4c0960fb7ab45088a5e568a/multidict-6.4.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", size = 212069, upload_time = "2025-04-10T22:19:34.17Z" }, + { url = "https://files.pythonhosted.org/packages/55/34/0ee1a7adb3560e18ee9289c6e5f7db54edc312b13e5c8263e88ea373d12c/multidict-6.4.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", size = 217858, upload_time = "2025-04-10T22:19:35.879Z" }, + { url = "https://files.pythonhosted.org/packages/04/08/586d652c2f5acefe0cf4e658eedb4d71d4ba6dfd4f189bd81b400fc1bc6b/multidict-6.4.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", size = 226988, upload_time = "2025-04-10T22:19:37.434Z" }, + { url = "https://files.pythonhosted.org/packages/82/e3/cc59c7e2bc49d7f906fb4ffb6d9c3a3cf21b9f2dd9c96d05bef89c2b1fd1/multidict-6.4.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", size = 220435, upload_time = "2025-04-10T22:19:39.005Z" }, + { url = "https://files.pythonhosted.org/packages/e0/32/5c3a556118aca9981d883f38c4b1bfae646f3627157f70f4068e5a648955/multidict-6.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", size = 221494, upload_time = "2025-04-10T22:19:41.447Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3b/1599631f59024b75c4d6e3069f4502409970a336647502aaf6b62fb7ac98/multidict-6.4.3-cp313-cp313t-win32.whl", hash = "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", size = 41775, upload_time = "2025-04-10T22:19:43.707Z" }, + { url = "https://files.pythonhosted.org/packages/e8/4e/09301668d675d02ca8e8e1a3e6be046619e30403f5ada2ed5b080ae28d02/multidict-6.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", size = 45946, upload_time = "2025-04-10T22:19:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/96/10/7d526c8974f017f1e7ca584c71ee62a638e9334d8d33f27d7cdfc9ae79e4/multidict-6.4.3-py3-none-any.whl", hash = "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", size = 10400, upload_time = "2025-04-10T22:20:16.445Z" }, ] [[package]] @@ -1180,37 +1180,37 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "dill" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b5/ae/04f39c5d0d0def03247c2893d6f2b83c136bf3320a2154d7b8858f2ba72d/multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1", size = 1772603, upload-time = "2024-01-28T18:52:34.85Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/ae/04f39c5d0d0def03247c2893d6f2b83c136bf3320a2154d7b8858f2ba72d/multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1", size = 1772603, upload_time = "2024-01-28T18:52:34.85Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/f7/7ec7fddc92e50714ea3745631f79bd9c96424cb2702632521028e57d3a36/multiprocess-0.70.16-py310-none-any.whl", hash = "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02", size = 134824, upload-time = "2024-01-28T18:52:26.062Z" }, - { url = "https://files.pythonhosted.org/packages/50/15/b56e50e8debaf439f44befec5b2af11db85f6e0f344c3113ae0be0593a91/multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a", size = 143519, upload-time = "2024-01-28T18:52:28.115Z" }, - { url = "https://files.pythonhosted.org/packages/0a/7d/a988f258104dcd2ccf1ed40fdc97e26c4ac351eeaf81d76e266c52d84e2f/multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e", size = 146741, upload-time = "2024-01-28T18:52:29.395Z" }, - { url = "https://files.pythonhosted.org/packages/ea/89/38df130f2c799090c978b366cfdf5b96d08de5b29a4a293df7f7429fa50b/multiprocess-0.70.16-py38-none-any.whl", hash = "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435", size = 132628, upload-time = "2024-01-28T18:52:30.853Z" }, - { url = "https://files.pythonhosted.org/packages/da/d9/f7f9379981e39b8c2511c9e0326d212accacb82f12fbfdc1aa2ce2a7b2b6/multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3", size = 133351, upload-time = "2024-01-28T18:52:31.981Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f7/7ec7fddc92e50714ea3745631f79bd9c96424cb2702632521028e57d3a36/multiprocess-0.70.16-py310-none-any.whl", hash = "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02", size = 134824, upload_time = "2024-01-28T18:52:26.062Z" }, + { url = "https://files.pythonhosted.org/packages/50/15/b56e50e8debaf439f44befec5b2af11db85f6e0f344c3113ae0be0593a91/multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a", size = 143519, upload_time = "2024-01-28T18:52:28.115Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7d/a988f258104dcd2ccf1ed40fdc97e26c4ac351eeaf81d76e266c52d84e2f/multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e", size = 146741, upload_time = "2024-01-28T18:52:29.395Z" }, + { url = "https://files.pythonhosted.org/packages/ea/89/38df130f2c799090c978b366cfdf5b96d08de5b29a4a293df7f7429fa50b/multiprocess-0.70.16-py38-none-any.whl", hash = "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435", size = 132628, upload_time = "2024-01-28T18:52:30.853Z" }, + { url = "https://files.pythonhosted.org/packages/da/d9/f7f9379981e39b8c2511c9e0326d212accacb82f12fbfdc1aa2ce2a7b2b6/multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3", size = 133351, upload_time = "2024-01-28T18:52:31.981Z" }, ] [[package]] name = "numpy" version = "1.26.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129, upload-time = "2024-02-06T00:26:44.495Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129, upload_time = "2024-02-06T00:26:44.495Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554, upload-time = "2024-02-05T23:51:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127, upload-time = "2024-02-05T23:52:15.314Z" }, - { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994, upload-time = "2024-02-05T23:52:47.569Z" }, - { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005, upload-time = "2024-02-05T23:53:15.637Z" }, - { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297, upload-time = "2024-02-05T23:53:42.16Z" }, - { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567, upload-time = "2024-02-05T23:54:11.696Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812, upload-time = "2024-02-05T23:54:26.453Z" }, - { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913, upload-time = "2024-02-05T23:54:53.933Z" }, - { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901, upload-time = "2024-02-05T23:55:32.801Z" }, - { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868, upload-time = "2024-02-05T23:55:56.28Z" }, - { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109, upload-time = "2024-02-05T23:56:20.368Z" }, - { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613, upload-time = "2024-02-05T23:56:56.054Z" }, - { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172, upload-time = "2024-02-05T23:57:21.56Z" }, - { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643, upload-time = "2024-02-05T23:57:56.585Z" }, - { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803, upload-time = "2024-02-05T23:58:08.963Z" }, - { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload-time = "2024-02-05T23:58:36.364Z" }, + { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554, upload_time = "2024-02-05T23:51:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127, upload_time = "2024-02-05T23:52:15.314Z" }, + { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994, upload_time = "2024-02-05T23:52:47.569Z" }, + { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005, upload_time = "2024-02-05T23:53:15.637Z" }, + { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297, upload_time = "2024-02-05T23:53:42.16Z" }, + { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567, upload_time = "2024-02-05T23:54:11.696Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812, upload_time = "2024-02-05T23:54:26.453Z" }, + { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913, upload_time = "2024-02-05T23:54:53.933Z" }, + { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901, upload_time = "2024-02-05T23:55:32.801Z" }, + { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868, upload_time = "2024-02-05T23:55:56.28Z" }, + { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109, upload_time = "2024-02-05T23:56:20.368Z" }, + { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613, upload_time = "2024-02-05T23:56:56.054Z" }, + { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172, upload_time = "2024-02-05T23:57:21.56Z" }, + { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643, upload_time = "2024-02-05T23:57:56.585Z" }, + { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803, upload_time = "2024-02-05T23:58:08.963Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload_time = "2024-02-05T23:58:36.364Z" }, ] [[package]] @@ -1227,27 +1227,27 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/ae/8d9706b8ff2363287b4a8807de2dd29cdbdad5424e9d05d345df724320f5/openai-1.60.2.tar.gz", hash = "sha256:a8f843e10f2855713007f491d96afb2694b11b5e02cb97c7d01a0be60bc5bb51", size = 348185, upload-time = "2025-01-27T19:37:03.72Z" } +sdist = { url = "https://files.pythonhosted.org/packages/08/ae/8d9706b8ff2363287b4a8807de2dd29cdbdad5424e9d05d345df724320f5/openai-1.60.2.tar.gz", hash = "sha256:a8f843e10f2855713007f491d96afb2694b11b5e02cb97c7d01a0be60bc5bb51", size = 348185, upload_time = "2025-01-27T19:37:03.72Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/5a/d5474ca67a547dde9b87b5bc8a8f90eadf29f523d410f2ba23d63c9b82ec/openai-1.60.2-py3-none-any.whl", hash = "sha256:993bd11b96900b9098179c728026f016b4982ded7ee30dfcf4555eab1171fff9", size = 456107, upload-time = "2025-01-27T19:37:01.065Z" }, + { url = "https://files.pythonhosted.org/packages/e5/5a/d5474ca67a547dde9b87b5bc8a8f90eadf29f523d410f2ba23d63c9b82ec/openai-1.60.2-py3-none-any.whl", hash = "sha256:993bd11b96900b9098179c728026f016b4982ded7ee30dfcf4555eab1171fff9", size = 456107, upload_time = "2025-01-27T19:37:01.065Z" }, ] [[package]] name = "orderly-set" version = "5.4.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/03/4a/38030da31c13dcd5a531490006e63a0954083fb115113be9393179738e25/orderly_set-5.4.1.tar.gz", hash = "sha256:a1fb5a4fdc5e234e9e8d8e5c1bbdbc4540f4dfe50d12bf17c8bc5dbf1c9c878d", size = 20943, upload-time = "2025-05-06T22:34:13.512Z" } +sdist = { url = "https://files.pythonhosted.org/packages/03/4a/38030da31c13dcd5a531490006e63a0954083fb115113be9393179738e25/orderly_set-5.4.1.tar.gz", hash = "sha256:a1fb5a4fdc5e234e9e8d8e5c1bbdbc4540f4dfe50d12bf17c8bc5dbf1c9c878d", size = 20943, upload_time = "2025-05-06T22:34:13.512Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/bc/e0dfb4db9210d92b44e49d6e61ba5caefbd411958357fa9d7ff489eeb835/orderly_set-5.4.1-py3-none-any.whl", hash = "sha256:b5e21d21680bd9ef456885db800c5cb4f76a03879880c0175e1b077fb166fd83", size = 12339, upload-time = "2025-05-06T22:34:12.564Z" }, + { url = "https://files.pythonhosted.org/packages/12/bc/e0dfb4db9210d92b44e49d6e61ba5caefbd411958357fa9d7ff489eeb835/orderly_set-5.4.1-py3-none-any.whl", hash = "sha256:b5e21d21680bd9ef456885db800c5cb4f76a03879880c0175e1b077fb166fd83", size = 12339, upload_time = "2025-05-06T22:34:12.564Z" }, ] [[package]] name = "packaging" version = "25.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload_time = "2025-04-19T11:48:59.673Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload_time = "2025-04-19T11:48:57.875Z" }, ] [[package]] @@ -1260,40 +1260,40 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213, upload-time = "2024-09-20T13:10:04.827Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222, upload-time = "2024-09-20T13:08:56.254Z" }, - { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274, upload-time = "2024-09-20T13:08:58.645Z" }, - { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836, upload-time = "2024-09-20T19:01:57.571Z" }, - { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505, upload-time = "2024-09-20T13:09:01.501Z" }, - { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420, upload-time = "2024-09-20T19:02:00.678Z" }, - { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457, upload-time = "2024-09-20T13:09:04.105Z" }, - { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166, upload-time = "2024-09-20T13:09:06.917Z" }, - { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893, upload-time = "2024-09-20T13:09:09.655Z" }, - { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475, upload-time = "2024-09-20T13:09:14.718Z" }, - { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645, upload-time = "2024-09-20T19:02:03.88Z" }, - { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445, upload-time = "2024-09-20T13:09:17.621Z" }, - { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235, upload-time = "2024-09-20T19:02:07.094Z" }, - { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756, upload-time = "2024-09-20T13:09:20.474Z" }, - { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248, upload-time = "2024-09-20T13:09:23.137Z" }, - { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643, upload-time = "2024-09-20T13:09:25.522Z" }, - { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573, upload-time = "2024-09-20T13:09:28.012Z" }, - { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085, upload-time = "2024-09-20T19:02:10.451Z" }, - { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809, upload-time = "2024-09-20T13:09:30.814Z" }, - { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316, upload-time = "2024-09-20T19:02:13.825Z" }, - { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055, upload-time = "2024-09-20T13:09:33.462Z" }, - { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175, upload-time = "2024-09-20T13:09:35.871Z" }, - { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650, upload-time = "2024-09-20T13:09:38.685Z" }, - { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177, upload-time = "2024-09-20T13:09:41.141Z" }, - { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526, upload-time = "2024-09-20T19:02:16.905Z" }, - { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013, upload-time = "2024-09-20T13:09:44.39Z" }, - { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620, upload-time = "2024-09-20T19:02:20.639Z" }, - { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436, upload-time = "2024-09-20T13:09:48.112Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213, upload_time = "2024-09-20T13:10:04.827Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222, upload_time = "2024-09-20T13:08:56.254Z" }, + { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274, upload_time = "2024-09-20T13:08:58.645Z" }, + { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836, upload_time = "2024-09-20T19:01:57.571Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505, upload_time = "2024-09-20T13:09:01.501Z" }, + { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420, upload_time = "2024-09-20T19:02:00.678Z" }, + { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457, upload_time = "2024-09-20T13:09:04.105Z" }, + { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166, upload_time = "2024-09-20T13:09:06.917Z" }, + { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893, upload_time = "2024-09-20T13:09:09.655Z" }, + { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475, upload_time = "2024-09-20T13:09:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645, upload_time = "2024-09-20T19:02:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445, upload_time = "2024-09-20T13:09:17.621Z" }, + { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235, upload_time = "2024-09-20T19:02:07.094Z" }, + { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756, upload_time = "2024-09-20T13:09:20.474Z" }, + { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248, upload_time = "2024-09-20T13:09:23.137Z" }, + { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643, upload_time = "2024-09-20T13:09:25.522Z" }, + { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573, upload_time = "2024-09-20T13:09:28.012Z" }, + { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085, upload_time = "2024-09-20T19:02:10.451Z" }, + { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809, upload_time = "2024-09-20T13:09:30.814Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316, upload_time = "2024-09-20T19:02:13.825Z" }, + { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055, upload_time = "2024-09-20T13:09:33.462Z" }, + { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175, upload_time = "2024-09-20T13:09:35.871Z" }, + { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650, upload_time = "2024-09-20T13:09:38.685Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177, upload_time = "2024-09-20T13:09:41.141Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526, upload_time = "2024-09-20T19:02:16.905Z" }, + { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013, upload_time = "2024-09-20T13:09:44.39Z" }, + { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620, upload_time = "2024-09-20T19:02:20.639Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436, upload_time = "2024-09-20T13:09:48.112Z" }, ] [[package]] name = "pdap-access-manager" -version = "0.3.5" +version = "0.3.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -1301,9 +1301,9 @@ dependencies = [ { name = "pydantic" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a9/54/c0e76d1d54ff2f542f18b289db96c417d3bcd7e8e948de07921b492717e7/pdap_access_manager-0.3.5.tar.gz", hash = "sha256:5f8bbe0f25ef68810a0936ca22d40d3869d77391bae3c8ba1c885f8fe74154bd", size = 4120, upload-time = "2025-05-13T13:40:24.189Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/14/d910483f08a0203a20fc2839738d9e27c83a66849fed422c3d4e804e15f5/pdap_access_manager-0.3.6.tar.gz", hash = "sha256:15c04f704e22116cd56b459e8a9d7f8514c75c36ca2c8a889b9ce2a308d88f6c", size = 4169, upload_time = "2025-06-12T20:14:55.942Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/01/d4ba10d0d7be759e59011f4235c533b1bc31d5e99db86424cfd82284ce53/pdap_access_manager-0.3.5-py3-none-any.whl", hash = "sha256:b53a006e535d7733ca884560f41aa305068fec648c89524e397967a21e69a0d0", size = 4980, upload-time = "2025-05-13T13:40:23.223Z" }, + { url = "https://files.pythonhosted.org/packages/f7/81/76803339fd732cd3eda7458d48e67487d9377197f9ea7d4583df098823b2/pdap_access_manager-0.3.6-py3-none-any.whl", hash = "sha256:a5910068f642f7548d037bcb98657ca1945997fae4e89dc4e1d47283da485b91", size = 5034, upload_time = "2025-06-12T20:14:48.452Z" }, ] [[package]] @@ -1314,39 +1314,39 @@ dependencies = [ { name = "python-dateutil" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/23/7c/009c12b86c7cc6c403aec80f8a4308598dfc5995e5c523a5491faaa3952e/pendulum-3.1.0.tar.gz", hash = "sha256:66f96303560f41d097bee7d2dc98ffca716fbb3a832c4b3062034c2d45865015", size = 85930, upload-time = "2025-04-19T14:30:01.675Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/6e/d28d3c22e6708b819a94c05bd05a3dfaed5c685379e8b6dc4b34b473b942/pendulum-3.1.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:61a03d14f8c64d13b2f7d5859e4b4053c4a7d3b02339f6c71f3e4606bfd67423", size = 338596, upload-time = "2025-04-19T14:01:11.306Z" }, - { url = "https://files.pythonhosted.org/packages/e1/e6/43324d58021d463c2eeb6146b169d2c935f2f840f9e45ac2d500453d954c/pendulum-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e674ed2d158afa5c361e60f1f67872dc55b492a10cacdaa7fcd7b7da5f158f24", size = 325854, upload-time = "2025-04-19T14:01:13.156Z" }, - { url = "https://files.pythonhosted.org/packages/b0/a7/d2ae79b960bfdea94dab67e2f118697b08bc9e98eb6bd8d32c4d99240da3/pendulum-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c75377eb16e58bbe7e03ea89eeea49be6fc5de0934a4aef0e263f8b4fa71bc2", size = 344334, upload-time = "2025-04-19T14:01:15.151Z" }, - { url = "https://files.pythonhosted.org/packages/96/94/941f071212e23c29aae7def891fb636930c648386e059ce09ea0dcd43933/pendulum-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:656b8b0ce070f0f2e5e2668247d3c783c55336534aa1f13bd0969535878955e1", size = 382259, upload-time = "2025-04-19T14:01:16.924Z" }, - { url = "https://files.pythonhosted.org/packages/51/ad/a78a701656aec00d16fee636704445c23ca11617a0bfe7c3848d1caa5157/pendulum-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48962903e6c1afe1f13548cb6252666056086c107d59e3d64795c58c9298bc2e", size = 436361, upload-time = "2025-04-19T14:01:18.796Z" }, - { url = "https://files.pythonhosted.org/packages/da/93/83f59ccbf4435c29dca8c63a6560fcbe4783079a468a5f91d9f886fd21f0/pendulum-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d364ec3f8e65010fefd4b0aaf7be5eb97e5df761b107a06f5e743b7c3f52c311", size = 353653, upload-time = "2025-04-19T14:01:20.159Z" }, - { url = "https://files.pythonhosted.org/packages/6f/0f/42d6644ec6339b41066f594e52d286162aecd2e9735aaf994d7e00c9e09d/pendulum-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd52caffc2afb86612ec43bbeb226f204ea12ebff9f3d12f900a7d3097210fcc", size = 524567, upload-time = "2025-04-19T14:01:21.457Z" }, - { url = "https://files.pythonhosted.org/packages/de/45/d84d909202755ab9d3379e5481fdf70f53344ebefbd68d6f5803ddde98a6/pendulum-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d439fccaa35c91f686bd59d30604dab01e8b5c1d0dd66e81648c432fd3f8a539", size = 525571, upload-time = "2025-04-19T14:01:23.329Z" }, - { url = "https://files.pythonhosted.org/packages/0d/e0/4de160773ce3c2f7843c310db19dd919a0cd02cc1c0384866f63b18a6251/pendulum-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:43288773a86d9c5c0ddb645f88f615ff6bd12fd1410b34323662beccb18f3b49", size = 260259, upload-time = "2025-04-19T14:01:24.689Z" }, - { url = "https://files.pythonhosted.org/packages/c1/7f/ffa278f78112c6c6e5130a702042f52aab5c649ae2edf814df07810bbba5/pendulum-3.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:569ea5072ae0f11d625e03b36d865f8037b76e838a3b621f6967314193896a11", size = 253899, upload-time = "2025-04-19T14:01:26.442Z" }, - { url = "https://files.pythonhosted.org/packages/7a/d7/b1bfe15a742f2c2713acb1fdc7dc3594ff46ef9418ac6a96fcb12a6ba60b/pendulum-3.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4dfd53e7583ccae138be86d6c0a0b324c7547df2afcec1876943c4d481cf9608", size = 336209, upload-time = "2025-04-19T14:01:27.815Z" }, - { url = "https://files.pythonhosted.org/packages/eb/87/0392da0c603c828b926d9f7097fbdddaafc01388cb8a00888635d04758c3/pendulum-3.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6a6e06a28f3a7d696546347805536f6f38be458cb79de4f80754430696bea9e6", size = 323130, upload-time = "2025-04-19T14:01:29.336Z" }, - { url = "https://files.pythonhosted.org/packages/c0/61/95f1eec25796be6dddf71440ee16ec1fd0c573fc61a73bd1ef6daacd529a/pendulum-3.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e68d6a51880708084afd8958af42dc8c5e819a70a6c6ae903b1c4bfc61e0f25", size = 341509, upload-time = "2025-04-19T14:01:31.1Z" }, - { url = "https://files.pythonhosted.org/packages/b5/7b/eb0f5e6aa87d5e1b467a1611009dbdc92f0f72425ebf07669bfadd8885a6/pendulum-3.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e3f1e5da39a7ea7119efda1dd96b529748c1566f8a983412d0908455d606942", size = 378674, upload-time = "2025-04-19T14:01:32.974Z" }, - { url = "https://files.pythonhosted.org/packages/29/68/5a4c1b5de3e54e16cab21d2ec88f9cd3f18599e96cc90a441c0b0ab6b03f/pendulum-3.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9af1e5eeddb4ebbe1b1c9afb9fd8077d73416ade42dd61264b3f3b87742e0bb", size = 436133, upload-time = "2025-04-19T14:01:34.349Z" }, - { url = "https://files.pythonhosted.org/packages/87/5d/f7a1d693e5c0f789185117d5c1d5bee104f5b0d9fbf061d715fb61c840a8/pendulum-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20f74aa8029a42e327bfc150472e0e4d2358fa5d795f70460160ba81b94b6945", size = 351232, upload-time = "2025-04-19T14:01:35.669Z" }, - { url = "https://files.pythonhosted.org/packages/30/77/c97617eb31f1d0554edb073201a294019b9e0a9bd2f73c68e6d8d048cd6b/pendulum-3.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cf6229e5ee70c2660148523f46c472e677654d0097bec010d6730f08312a4931", size = 521562, upload-time = "2025-04-19T14:01:37.05Z" }, - { url = "https://files.pythonhosted.org/packages/76/22/0d0ef3393303877e757b848ecef8a9a8c7627e17e7590af82d14633b2cd1/pendulum-3.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:350cabb23bf1aec7c7694b915d3030bff53a2ad4aeabc8c8c0d807c8194113d6", size = 523221, upload-time = "2025-04-19T14:01:38.444Z" }, - { url = "https://files.pythonhosted.org/packages/99/f3/aefb579aa3cebd6f2866b205fc7a60d33e9a696e9e629024752107dc3cf5/pendulum-3.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:42959341e843077c41d47420f28c3631de054abd64da83f9b956519b5c7a06a7", size = 260502, upload-time = "2025-04-19T14:01:39.814Z" }, - { url = "https://files.pythonhosted.org/packages/02/74/4332b5d6e34c63d4df8e8eab2249e74c05513b1477757463f7fdca99e9be/pendulum-3.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:006758e2125da2e624493324dfd5d7d1b02b0c44bc39358e18bf0f66d0767f5f", size = 253089, upload-time = "2025-04-19T14:01:41.171Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1f/af928ba4aa403dac9569f787adcf024005e7654433d71f7a84e608716837/pendulum-3.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:28658b0baf4b30eb31d096a375983cfed033e60c0a7bbe94fa23f06cd779b50b", size = 336209, upload-time = "2025-04-19T14:01:42.775Z" }, - { url = "https://files.pythonhosted.org/packages/b6/16/b010643007ba964c397da7fa622924423883c1bbff1a53f9d1022cd7f024/pendulum-3.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b114dcb99ce511cb8f5495c7b6f0056b2c3dba444ef1ea6e48030d7371bd531a", size = 323132, upload-time = "2025-04-19T14:01:44.577Z" }, - { url = "https://files.pythonhosted.org/packages/64/19/c3c47aeecb5d9bceb0e89faafd800d39809b696c5b7bba8ec8370ad5052c/pendulum-3.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2404a6a54c80252ea393291f0b7f35525a61abae3d795407f34e118a8f133a18", size = 341509, upload-time = "2025-04-19T14:01:46.084Z" }, - { url = "https://files.pythonhosted.org/packages/38/cf/c06921ff6b860ff7e62e70b8e5d4dc70e36f5abb66d168bd64d51760bc4e/pendulum-3.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d06999790d9ee9962a1627e469f98568bf7ad1085553fa3c30ed08b3944a14d7", size = 378674, upload-time = "2025-04-19T14:01:47.727Z" }, - { url = "https://files.pythonhosted.org/packages/62/0b/a43953b9eba11e82612b033ac5133f716f1b76b6108a65da6f408b3cc016/pendulum-3.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94751c52f6b7c306734d1044c2c6067a474237e1e5afa2f665d1fbcbbbcf24b3", size = 436133, upload-time = "2025-04-19T14:01:49.126Z" }, - { url = "https://files.pythonhosted.org/packages/eb/a0/ec3d70b3b96e23ae1d039f132af35e17704c22a8250d1887aaefea4d78a6/pendulum-3.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5553ac27be05e997ec26d7f004cf72788f4ce11fe60bb80dda604a64055b29d0", size = 351232, upload-time = "2025-04-19T14:01:50.575Z" }, - { url = "https://files.pythonhosted.org/packages/f4/97/aba23f1716b82f6951ba2b1c9178a2d107d1e66c102762a9bf19988547ea/pendulum-3.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f8dee234ca6142bf0514368d01a72945a44685aaa2fc4c14c98d09da9437b620", size = 521563, upload-time = "2025-04-19T14:01:51.9Z" }, - { url = "https://files.pythonhosted.org/packages/01/33/2c0d5216cc53d16db0c4b3d510f141ee0a540937f8675948541190fbd48b/pendulum-3.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7378084fe54faab4ee481897a00b710876f2e901ded6221671e827a253e643f2", size = 523221, upload-time = "2025-04-19T14:01:53.275Z" }, - { url = "https://files.pythonhosted.org/packages/51/89/8de955c339c31aeae77fd86d3225509b998c81875e9dba28cb88b8cbf4b3/pendulum-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:8539db7ae2c8da430ac2515079e288948c8ebf7eb1edd3e8281b5cdf433040d6", size = 260501, upload-time = "2025-04-19T14:01:54.749Z" }, - { url = "https://files.pythonhosted.org/packages/15/c3/226a3837363e94f8722461848feec18bfdd7d5172564d53aa3c3397ff01e/pendulum-3.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:1ce26a608e1f7387cd393fba2a129507c4900958d4f47b90757ec17656856571", size = 253087, upload-time = "2025-04-19T14:01:55.998Z" }, - { url = "https://files.pythonhosted.org/packages/6e/23/e98758924d1b3aac11a626268eabf7f3cf177e7837c28d47bf84c64532d0/pendulum-3.1.0-py3-none-any.whl", hash = "sha256:f9178c2a8e291758ade1e8dd6371b1d26d08371b4c7730a6e9a3ef8b16ebae0f", size = 111799, upload-time = "2025-04-19T14:02:34.739Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/23/7c/009c12b86c7cc6c403aec80f8a4308598dfc5995e5c523a5491faaa3952e/pendulum-3.1.0.tar.gz", hash = "sha256:66f96303560f41d097bee7d2dc98ffca716fbb3a832c4b3062034c2d45865015", size = 85930, upload_time = "2025-04-19T14:30:01.675Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/6e/d28d3c22e6708b819a94c05bd05a3dfaed5c685379e8b6dc4b34b473b942/pendulum-3.1.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:61a03d14f8c64d13b2f7d5859e4b4053c4a7d3b02339f6c71f3e4606bfd67423", size = 338596, upload_time = "2025-04-19T14:01:11.306Z" }, + { url = "https://files.pythonhosted.org/packages/e1/e6/43324d58021d463c2eeb6146b169d2c935f2f840f9e45ac2d500453d954c/pendulum-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e674ed2d158afa5c361e60f1f67872dc55b492a10cacdaa7fcd7b7da5f158f24", size = 325854, upload_time = "2025-04-19T14:01:13.156Z" }, + { url = "https://files.pythonhosted.org/packages/b0/a7/d2ae79b960bfdea94dab67e2f118697b08bc9e98eb6bd8d32c4d99240da3/pendulum-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c75377eb16e58bbe7e03ea89eeea49be6fc5de0934a4aef0e263f8b4fa71bc2", size = 344334, upload_time = "2025-04-19T14:01:15.151Z" }, + { url = "https://files.pythonhosted.org/packages/96/94/941f071212e23c29aae7def891fb636930c648386e059ce09ea0dcd43933/pendulum-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:656b8b0ce070f0f2e5e2668247d3c783c55336534aa1f13bd0969535878955e1", size = 382259, upload_time = "2025-04-19T14:01:16.924Z" }, + { url = "https://files.pythonhosted.org/packages/51/ad/a78a701656aec00d16fee636704445c23ca11617a0bfe7c3848d1caa5157/pendulum-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48962903e6c1afe1f13548cb6252666056086c107d59e3d64795c58c9298bc2e", size = 436361, upload_time = "2025-04-19T14:01:18.796Z" }, + { url = "https://files.pythonhosted.org/packages/da/93/83f59ccbf4435c29dca8c63a6560fcbe4783079a468a5f91d9f886fd21f0/pendulum-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d364ec3f8e65010fefd4b0aaf7be5eb97e5df761b107a06f5e743b7c3f52c311", size = 353653, upload_time = "2025-04-19T14:01:20.159Z" }, + { url = "https://files.pythonhosted.org/packages/6f/0f/42d6644ec6339b41066f594e52d286162aecd2e9735aaf994d7e00c9e09d/pendulum-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd52caffc2afb86612ec43bbeb226f204ea12ebff9f3d12f900a7d3097210fcc", size = 524567, upload_time = "2025-04-19T14:01:21.457Z" }, + { url = "https://files.pythonhosted.org/packages/de/45/d84d909202755ab9d3379e5481fdf70f53344ebefbd68d6f5803ddde98a6/pendulum-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d439fccaa35c91f686bd59d30604dab01e8b5c1d0dd66e81648c432fd3f8a539", size = 525571, upload_time = "2025-04-19T14:01:23.329Z" }, + { url = "https://files.pythonhosted.org/packages/0d/e0/4de160773ce3c2f7843c310db19dd919a0cd02cc1c0384866f63b18a6251/pendulum-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:43288773a86d9c5c0ddb645f88f615ff6bd12fd1410b34323662beccb18f3b49", size = 260259, upload_time = "2025-04-19T14:01:24.689Z" }, + { url = "https://files.pythonhosted.org/packages/c1/7f/ffa278f78112c6c6e5130a702042f52aab5c649ae2edf814df07810bbba5/pendulum-3.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:569ea5072ae0f11d625e03b36d865f8037b76e838a3b621f6967314193896a11", size = 253899, upload_time = "2025-04-19T14:01:26.442Z" }, + { url = "https://files.pythonhosted.org/packages/7a/d7/b1bfe15a742f2c2713acb1fdc7dc3594ff46ef9418ac6a96fcb12a6ba60b/pendulum-3.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4dfd53e7583ccae138be86d6c0a0b324c7547df2afcec1876943c4d481cf9608", size = 336209, upload_time = "2025-04-19T14:01:27.815Z" }, + { url = "https://files.pythonhosted.org/packages/eb/87/0392da0c603c828b926d9f7097fbdddaafc01388cb8a00888635d04758c3/pendulum-3.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6a6e06a28f3a7d696546347805536f6f38be458cb79de4f80754430696bea9e6", size = 323130, upload_time = "2025-04-19T14:01:29.336Z" }, + { url = "https://files.pythonhosted.org/packages/c0/61/95f1eec25796be6dddf71440ee16ec1fd0c573fc61a73bd1ef6daacd529a/pendulum-3.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e68d6a51880708084afd8958af42dc8c5e819a70a6c6ae903b1c4bfc61e0f25", size = 341509, upload_time = "2025-04-19T14:01:31.1Z" }, + { url = "https://files.pythonhosted.org/packages/b5/7b/eb0f5e6aa87d5e1b467a1611009dbdc92f0f72425ebf07669bfadd8885a6/pendulum-3.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e3f1e5da39a7ea7119efda1dd96b529748c1566f8a983412d0908455d606942", size = 378674, upload_time = "2025-04-19T14:01:32.974Z" }, + { url = "https://files.pythonhosted.org/packages/29/68/5a4c1b5de3e54e16cab21d2ec88f9cd3f18599e96cc90a441c0b0ab6b03f/pendulum-3.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9af1e5eeddb4ebbe1b1c9afb9fd8077d73416ade42dd61264b3f3b87742e0bb", size = 436133, upload_time = "2025-04-19T14:01:34.349Z" }, + { url = "https://files.pythonhosted.org/packages/87/5d/f7a1d693e5c0f789185117d5c1d5bee104f5b0d9fbf061d715fb61c840a8/pendulum-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20f74aa8029a42e327bfc150472e0e4d2358fa5d795f70460160ba81b94b6945", size = 351232, upload_time = "2025-04-19T14:01:35.669Z" }, + { url = "https://files.pythonhosted.org/packages/30/77/c97617eb31f1d0554edb073201a294019b9e0a9bd2f73c68e6d8d048cd6b/pendulum-3.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cf6229e5ee70c2660148523f46c472e677654d0097bec010d6730f08312a4931", size = 521562, upload_time = "2025-04-19T14:01:37.05Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/0d0ef3393303877e757b848ecef8a9a8c7627e17e7590af82d14633b2cd1/pendulum-3.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:350cabb23bf1aec7c7694b915d3030bff53a2ad4aeabc8c8c0d807c8194113d6", size = 523221, upload_time = "2025-04-19T14:01:38.444Z" }, + { url = "https://files.pythonhosted.org/packages/99/f3/aefb579aa3cebd6f2866b205fc7a60d33e9a696e9e629024752107dc3cf5/pendulum-3.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:42959341e843077c41d47420f28c3631de054abd64da83f9b956519b5c7a06a7", size = 260502, upload_time = "2025-04-19T14:01:39.814Z" }, + { url = "https://files.pythonhosted.org/packages/02/74/4332b5d6e34c63d4df8e8eab2249e74c05513b1477757463f7fdca99e9be/pendulum-3.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:006758e2125da2e624493324dfd5d7d1b02b0c44bc39358e18bf0f66d0767f5f", size = 253089, upload_time = "2025-04-19T14:01:41.171Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1f/af928ba4aa403dac9569f787adcf024005e7654433d71f7a84e608716837/pendulum-3.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:28658b0baf4b30eb31d096a375983cfed033e60c0a7bbe94fa23f06cd779b50b", size = 336209, upload_time = "2025-04-19T14:01:42.775Z" }, + { url = "https://files.pythonhosted.org/packages/b6/16/b010643007ba964c397da7fa622924423883c1bbff1a53f9d1022cd7f024/pendulum-3.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b114dcb99ce511cb8f5495c7b6f0056b2c3dba444ef1ea6e48030d7371bd531a", size = 323132, upload_time = "2025-04-19T14:01:44.577Z" }, + { url = "https://files.pythonhosted.org/packages/64/19/c3c47aeecb5d9bceb0e89faafd800d39809b696c5b7bba8ec8370ad5052c/pendulum-3.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2404a6a54c80252ea393291f0b7f35525a61abae3d795407f34e118a8f133a18", size = 341509, upload_time = "2025-04-19T14:01:46.084Z" }, + { url = "https://files.pythonhosted.org/packages/38/cf/c06921ff6b860ff7e62e70b8e5d4dc70e36f5abb66d168bd64d51760bc4e/pendulum-3.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d06999790d9ee9962a1627e469f98568bf7ad1085553fa3c30ed08b3944a14d7", size = 378674, upload_time = "2025-04-19T14:01:47.727Z" }, + { url = "https://files.pythonhosted.org/packages/62/0b/a43953b9eba11e82612b033ac5133f716f1b76b6108a65da6f408b3cc016/pendulum-3.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94751c52f6b7c306734d1044c2c6067a474237e1e5afa2f665d1fbcbbbcf24b3", size = 436133, upload_time = "2025-04-19T14:01:49.126Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a0/ec3d70b3b96e23ae1d039f132af35e17704c22a8250d1887aaefea4d78a6/pendulum-3.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5553ac27be05e997ec26d7f004cf72788f4ce11fe60bb80dda604a64055b29d0", size = 351232, upload_time = "2025-04-19T14:01:50.575Z" }, + { url = "https://files.pythonhosted.org/packages/f4/97/aba23f1716b82f6951ba2b1c9178a2d107d1e66c102762a9bf19988547ea/pendulum-3.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f8dee234ca6142bf0514368d01a72945a44685aaa2fc4c14c98d09da9437b620", size = 521563, upload_time = "2025-04-19T14:01:51.9Z" }, + { url = "https://files.pythonhosted.org/packages/01/33/2c0d5216cc53d16db0c4b3d510f141ee0a540937f8675948541190fbd48b/pendulum-3.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7378084fe54faab4ee481897a00b710876f2e901ded6221671e827a253e643f2", size = 523221, upload_time = "2025-04-19T14:01:53.275Z" }, + { url = "https://files.pythonhosted.org/packages/51/89/8de955c339c31aeae77fd86d3225509b998c81875e9dba28cb88b8cbf4b3/pendulum-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:8539db7ae2c8da430ac2515079e288948c8ebf7eb1edd3e8281b5cdf433040d6", size = 260501, upload_time = "2025-04-19T14:01:54.749Z" }, + { url = "https://files.pythonhosted.org/packages/15/c3/226a3837363e94f8722461848feec18bfdd7d5172564d53aa3c3397ff01e/pendulum-3.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:1ce26a608e1f7387cd393fba2a129507c4900958d4f47b90757ec17656856571", size = 253087, upload_time = "2025-04-19T14:01:55.998Z" }, + { url = "https://files.pythonhosted.org/packages/6e/23/e98758924d1b3aac11a626268eabf7f3cf177e7837c28d47bf84c64532d0/pendulum-3.1.0-py3-none-any.whl", hash = "sha256:f9178c2a8e291758ade1e8dd6371b1d26d08371b4c7730a6e9a3ef8b16ebae0f", size = 111799, upload_time = "2025-04-19T14:02:34.739Z" }, ] [[package]] @@ -1358,95 +1358,95 @@ dependencies = [ { name = "pyee" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/be/01025581052e43eb698092c4328d7497ca62bcb5c83f15a611d4a71b4b92/playwright-1.49.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:1041ffb45a0d0bc44d698d3a5aa3ac4b67c9bd03540da43a0b70616ad52592b8", size = 39559859, upload-time = "2024-12-10T17:32:14.907Z" }, - { url = "https://files.pythonhosted.org/packages/79/25/ef1010a42cc7d576282015d983c5451d73e369b198b6eb32a177fae281f8/playwright-1.49.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9f38ed3d0c1f4e0a6d1c92e73dd9a61f8855133249d6f0cec28648d38a7137be", size = 38808973, upload-time = "2024-12-10T17:32:22.516Z" }, - { url = "https://files.pythonhosted.org/packages/70/4b/3930cf10f303a10d493a382e4448aaff898b4065698b3b8d92f902e53e08/playwright-1.49.1-py3-none-macosx_11_0_universal2.whl", hash = "sha256:3be48c6d26dc819ca0a26567c1ae36a980a0303dcd4249feb6f59e115aaddfb8", size = 39559863, upload-time = "2024-12-10T17:32:29.12Z" }, - { url = "https://files.pythonhosted.org/packages/9a/c1/ea765e72a746dc7ec2ce155ffea29d454e7171db78f3c09185e888387246/playwright-1.49.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:753ca90ee31b4b03d165cfd36e477309ebf2b4381953f2a982ff612d85b147d2", size = 44163300, upload-time = "2024-12-10T17:32:35.647Z" }, - { url = "https://files.pythonhosted.org/packages/5a/52/95efac704bf36b770a2522d88a6dee298042845d10bfb35f7ca0fcc36d91/playwright-1.49.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd9bc8dab37aa25198a01f555f0a2e2c3813fe200fef018ac34dfe86b34994b9", size = 43744353, upload-time = "2024-12-10T17:32:43.189Z" }, - { url = "https://files.pythonhosted.org/packages/f9/97/a3fccc9aaa6da83890772e9980703b0ea6b1e1ad42042fb50df3aef6c641/playwright-1.49.1-py3-none-win32.whl", hash = "sha256:43b304be67f096058e587dac453ece550eff87b8fbed28de30f4f022cc1745bb", size = 34060663, upload-time = "2024-12-10T17:32:49.904Z" }, - { url = "https://files.pythonhosted.org/packages/71/a9/bd88ac0bd498c91aab3aba2e393d1fa59f72a7243e9265ccbf4861ca4f64/playwright-1.49.1-py3-none-win_amd64.whl", hash = "sha256:47b23cb346283278f5b4d1e1990bcb6d6302f80c0aa0ca93dd0601a1400191df", size = 34060667, upload-time = "2024-12-10T17:32:56.459Z" }, + { url = "https://files.pythonhosted.org/packages/ab/be/01025581052e43eb698092c4328d7497ca62bcb5c83f15a611d4a71b4b92/playwright-1.49.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:1041ffb45a0d0bc44d698d3a5aa3ac4b67c9bd03540da43a0b70616ad52592b8", size = 39559859, upload_time = "2024-12-10T17:32:14.907Z" }, + { url = "https://files.pythonhosted.org/packages/79/25/ef1010a42cc7d576282015d983c5451d73e369b198b6eb32a177fae281f8/playwright-1.49.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9f38ed3d0c1f4e0a6d1c92e73dd9a61f8855133249d6f0cec28648d38a7137be", size = 38808973, upload_time = "2024-12-10T17:32:22.516Z" }, + { url = "https://files.pythonhosted.org/packages/70/4b/3930cf10f303a10d493a382e4448aaff898b4065698b3b8d92f902e53e08/playwright-1.49.1-py3-none-macosx_11_0_universal2.whl", hash = "sha256:3be48c6d26dc819ca0a26567c1ae36a980a0303dcd4249feb6f59e115aaddfb8", size = 39559863, upload_time = "2024-12-10T17:32:29.12Z" }, + { url = "https://files.pythonhosted.org/packages/9a/c1/ea765e72a746dc7ec2ce155ffea29d454e7171db78f3c09185e888387246/playwright-1.49.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:753ca90ee31b4b03d165cfd36e477309ebf2b4381953f2a982ff612d85b147d2", size = 44163300, upload_time = "2024-12-10T17:32:35.647Z" }, + { url = "https://files.pythonhosted.org/packages/5a/52/95efac704bf36b770a2522d88a6dee298042845d10bfb35f7ca0fcc36d91/playwright-1.49.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd9bc8dab37aa25198a01f555f0a2e2c3813fe200fef018ac34dfe86b34994b9", size = 43744353, upload_time = "2024-12-10T17:32:43.189Z" }, + { url = "https://files.pythonhosted.org/packages/f9/97/a3fccc9aaa6da83890772e9980703b0ea6b1e1ad42042fb50df3aef6c641/playwright-1.49.1-py3-none-win32.whl", hash = "sha256:43b304be67f096058e587dac453ece550eff87b8fbed28de30f4f022cc1745bb", size = 34060663, upload_time = "2024-12-10T17:32:49.904Z" }, + { url = "https://files.pythonhosted.org/packages/71/a9/bd88ac0bd498c91aab3aba2e393d1fa59f72a7243e9265ccbf4861ca4f64/playwright-1.49.1-py3-none-win_amd64.whl", hash = "sha256:47b23cb346283278f5b4d1e1990bcb6d6302f80c0aa0ca93dd0601a1400191df", size = 34060667, upload_time = "2024-12-10T17:32:56.459Z" }, ] [[package]] name = "pluggy" version = "1.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload-time = "2024-04-20T21:34:42.531Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload_time = "2024-04-20T21:34:42.531Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload_time = "2024-04-20T21:34:40.434Z" }, ] [[package]] name = "propcache" version = "0.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/07/c8/fdc6686a986feae3541ea23dcaa661bd93972d3940460646c6bb96e21c40/propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", size = 43651, upload-time = "2025-03-26T03:06:12.05Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/0f/5a5319ee83bd651f75311fcb0c492c21322a7fc8f788e4eef23f44243427/propcache-0.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", size = 80243, upload-time = "2025-03-26T03:04:01.912Z" }, - { url = "https://files.pythonhosted.org/packages/ce/84/3db5537e0879942783e2256616ff15d870a11d7ac26541336fe1b673c818/propcache-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", size = 46503, upload-time = "2025-03-26T03:04:03.704Z" }, - { url = "https://files.pythonhosted.org/packages/e2/c8/b649ed972433c3f0d827d7f0cf9ea47162f4ef8f4fe98c5f3641a0bc63ff/propcache-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", size = 45934, upload-time = "2025-03-26T03:04:05.257Z" }, - { url = "https://files.pythonhosted.org/packages/59/f9/4c0a5cf6974c2c43b1a6810c40d889769cc8f84cea676cbe1e62766a45f8/propcache-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", size = 233633, upload-time = "2025-03-26T03:04:07.044Z" }, - { url = "https://files.pythonhosted.org/packages/e7/64/66f2f4d1b4f0007c6e9078bd95b609b633d3957fe6dd23eac33ebde4b584/propcache-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", size = 241124, upload-time = "2025-03-26T03:04:08.676Z" }, - { url = "https://files.pythonhosted.org/packages/aa/bf/7b8c9fd097d511638fa9b6af3d986adbdf567598a567b46338c925144c1b/propcache-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", size = 240283, upload-time = "2025-03-26T03:04:10.172Z" }, - { url = "https://files.pythonhosted.org/packages/fa/c9/e85aeeeaae83358e2a1ef32d6ff50a483a5d5248bc38510d030a6f4e2816/propcache-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", size = 232498, upload-time = "2025-03-26T03:04:11.616Z" }, - { url = "https://files.pythonhosted.org/packages/8e/66/acb88e1f30ef5536d785c283af2e62931cb934a56a3ecf39105887aa8905/propcache-0.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", size = 221486, upload-time = "2025-03-26T03:04:13.102Z" }, - { url = "https://files.pythonhosted.org/packages/f5/f9/233ddb05ffdcaee4448508ee1d70aa7deff21bb41469ccdfcc339f871427/propcache-0.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", size = 222675, upload-time = "2025-03-26T03:04:14.658Z" }, - { url = "https://files.pythonhosted.org/packages/98/b8/eb977e28138f9e22a5a789daf608d36e05ed93093ef12a12441030da800a/propcache-0.3.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", size = 215727, upload-time = "2025-03-26T03:04:16.207Z" }, - { url = "https://files.pythonhosted.org/packages/89/2d/5f52d9c579f67b8ee1edd9ec073c91b23cc5b7ff7951a1e449e04ed8fdf3/propcache-0.3.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", size = 217878, upload-time = "2025-03-26T03:04:18.11Z" }, - { url = "https://files.pythonhosted.org/packages/7a/fd/5283e5ed8a82b00c7a989b99bb6ea173db1ad750bf0bf8dff08d3f4a4e28/propcache-0.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", size = 230558, upload-time = "2025-03-26T03:04:19.562Z" }, - { url = "https://files.pythonhosted.org/packages/90/38/ab17d75938ef7ac87332c588857422ae126b1c76253f0f5b1242032923ca/propcache-0.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", size = 233754, upload-time = "2025-03-26T03:04:21.065Z" }, - { url = "https://files.pythonhosted.org/packages/06/5d/3b921b9c60659ae464137508d3b4c2b3f52f592ceb1964aa2533b32fcf0b/propcache-0.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", size = 226088, upload-time = "2025-03-26T03:04:22.718Z" }, - { url = "https://files.pythonhosted.org/packages/54/6e/30a11f4417d9266b5a464ac5a8c5164ddc9dd153dfa77bf57918165eb4ae/propcache-0.3.1-cp311-cp311-win32.whl", hash = "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", size = 40859, upload-time = "2025-03-26T03:04:24.039Z" }, - { url = "https://files.pythonhosted.org/packages/1d/3a/8a68dd867da9ca2ee9dfd361093e9cb08cb0f37e5ddb2276f1b5177d7731/propcache-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", size = 45153, upload-time = "2025-03-26T03:04:25.211Z" }, - { url = "https://files.pythonhosted.org/packages/41/aa/ca78d9be314d1e15ff517b992bebbed3bdfef5b8919e85bf4940e57b6137/propcache-0.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", size = 80430, upload-time = "2025-03-26T03:04:26.436Z" }, - { url = "https://files.pythonhosted.org/packages/1a/d8/f0c17c44d1cda0ad1979af2e593ea290defdde9eaeb89b08abbe02a5e8e1/propcache-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", size = 46637, upload-time = "2025-03-26T03:04:27.932Z" }, - { url = "https://files.pythonhosted.org/packages/ae/bd/c1e37265910752e6e5e8a4c1605d0129e5b7933c3dc3cf1b9b48ed83b364/propcache-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", size = 46123, upload-time = "2025-03-26T03:04:30.659Z" }, - { url = "https://files.pythonhosted.org/packages/d4/b0/911eda0865f90c0c7e9f0415d40a5bf681204da5fd7ca089361a64c16b28/propcache-0.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", size = 243031, upload-time = "2025-03-26T03:04:31.977Z" }, - { url = "https://files.pythonhosted.org/packages/0a/06/0da53397c76a74271621807265b6eb61fb011451b1ddebf43213df763669/propcache-0.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", size = 249100, upload-time = "2025-03-26T03:04:33.45Z" }, - { url = "https://files.pythonhosted.org/packages/f1/eb/13090e05bf6b963fc1653cdc922133ced467cb4b8dab53158db5a37aa21e/propcache-0.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", size = 250170, upload-time = "2025-03-26T03:04:35.542Z" }, - { url = "https://files.pythonhosted.org/packages/3b/4c/f72c9e1022b3b043ec7dc475a0f405d4c3e10b9b1d378a7330fecf0652da/propcache-0.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", size = 245000, upload-time = "2025-03-26T03:04:37.501Z" }, - { url = "https://files.pythonhosted.org/packages/e8/fd/970ca0e22acc829f1adf5de3724085e778c1ad8a75bec010049502cb3a86/propcache-0.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", size = 230262, upload-time = "2025-03-26T03:04:39.532Z" }, - { url = "https://files.pythonhosted.org/packages/c4/42/817289120c6b9194a44f6c3e6b2c3277c5b70bbad39e7df648f177cc3634/propcache-0.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", size = 236772, upload-time = "2025-03-26T03:04:41.109Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9c/3b3942b302badd589ad6b672da3ca7b660a6c2f505cafd058133ddc73918/propcache-0.3.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", size = 231133, upload-time = "2025-03-26T03:04:42.544Z" }, - { url = "https://files.pythonhosted.org/packages/98/a1/75f6355f9ad039108ff000dfc2e19962c8dea0430da9a1428e7975cf24b2/propcache-0.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", size = 230741, upload-time = "2025-03-26T03:04:44.06Z" }, - { url = "https://files.pythonhosted.org/packages/67/0c/3e82563af77d1f8731132166da69fdfd95e71210e31f18edce08a1eb11ea/propcache-0.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", size = 244047, upload-time = "2025-03-26T03:04:45.983Z" }, - { url = "https://files.pythonhosted.org/packages/f7/50/9fb7cca01532a08c4d5186d7bb2da6c4c587825c0ae134b89b47c7d62628/propcache-0.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5", size = 246467, upload-time = "2025-03-26T03:04:47.699Z" }, - { url = "https://files.pythonhosted.org/packages/a9/02/ccbcf3e1c604c16cc525309161d57412c23cf2351523aedbb280eb7c9094/propcache-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", size = 241022, upload-time = "2025-03-26T03:04:49.195Z" }, - { url = "https://files.pythonhosted.org/packages/db/19/e777227545e09ca1e77a6e21274ae9ec45de0f589f0ce3eca2a41f366220/propcache-0.3.1-cp312-cp312-win32.whl", hash = "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", size = 40647, upload-time = "2025-03-26T03:04:50.595Z" }, - { url = "https://files.pythonhosted.org/packages/24/bb/3b1b01da5dd04c77a204c84e538ff11f624e31431cfde7201d9110b092b1/propcache-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", size = 44784, upload-time = "2025-03-26T03:04:51.791Z" }, - { url = "https://files.pythonhosted.org/packages/58/60/f645cc8b570f99be3cf46714170c2de4b4c9d6b827b912811eff1eb8a412/propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", size = 77865, upload-time = "2025-03-26T03:04:53.406Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d4/c1adbf3901537582e65cf90fd9c26fde1298fde5a2c593f987112c0d0798/propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", size = 45452, upload-time = "2025-03-26T03:04:54.624Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b5/fe752b2e63f49f727c6c1c224175d21b7d1727ce1d4873ef1c24c9216830/propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", size = 44800, upload-time = "2025-03-26T03:04:55.844Z" }, - { url = "https://files.pythonhosted.org/packages/62/37/fc357e345bc1971e21f76597028b059c3d795c5ca7690d7a8d9a03c9708a/propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", size = 225804, upload-time = "2025-03-26T03:04:57.158Z" }, - { url = "https://files.pythonhosted.org/packages/0d/f1/16e12c33e3dbe7f8b737809bad05719cff1dccb8df4dafbcff5575002c0e/propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", size = 230650, upload-time = "2025-03-26T03:04:58.61Z" }, - { url = "https://files.pythonhosted.org/packages/3e/a2/018b9f2ed876bf5091e60153f727e8f9073d97573f790ff7cdf6bc1d1fb8/propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", size = 234235, upload-time = "2025-03-26T03:05:00.599Z" }, - { url = "https://files.pythonhosted.org/packages/45/5f/3faee66fc930dfb5da509e34c6ac7128870631c0e3582987fad161fcb4b1/propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", size = 228249, upload-time = "2025-03-26T03:05:02.11Z" }, - { url = "https://files.pythonhosted.org/packages/62/1e/a0d5ebda5da7ff34d2f5259a3e171a94be83c41eb1e7cd21a2105a84a02e/propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", size = 214964, upload-time = "2025-03-26T03:05:03.599Z" }, - { url = "https://files.pythonhosted.org/packages/db/a0/d72da3f61ceab126e9be1f3bc7844b4e98c6e61c985097474668e7e52152/propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", size = 222501, upload-time = "2025-03-26T03:05:05.107Z" }, - { url = "https://files.pythonhosted.org/packages/18/6d/a008e07ad7b905011253adbbd97e5b5375c33f0b961355ca0a30377504ac/propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", size = 217917, upload-time = "2025-03-26T03:05:06.59Z" }, - { url = "https://files.pythonhosted.org/packages/98/37/02c9343ffe59e590e0e56dc5c97d0da2b8b19fa747ebacf158310f97a79a/propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", size = 217089, upload-time = "2025-03-26T03:05:08.1Z" }, - { url = "https://files.pythonhosted.org/packages/53/1b/d3406629a2c8a5666d4674c50f757a77be119b113eedd47b0375afdf1b42/propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", size = 228102, upload-time = "2025-03-26T03:05:09.982Z" }, - { url = "https://files.pythonhosted.org/packages/cd/a7/3664756cf50ce739e5f3abd48febc0be1a713b1f389a502ca819791a6b69/propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", size = 230122, upload-time = "2025-03-26T03:05:11.408Z" }, - { url = "https://files.pythonhosted.org/packages/35/36/0bbabaacdcc26dac4f8139625e930f4311864251276033a52fd52ff2a274/propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", size = 226818, upload-time = "2025-03-26T03:05:12.909Z" }, - { url = "https://files.pythonhosted.org/packages/cc/27/4e0ef21084b53bd35d4dae1634b6d0bad35e9c58ed4f032511acca9d4d26/propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", size = 40112, upload-time = "2025-03-26T03:05:14.289Z" }, - { url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", size = 44034, upload-time = "2025-03-26T03:05:15.616Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a8/0a4fd2f664fc6acc66438370905124ce62e84e2e860f2557015ee4a61c7e/propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", size = 82613, upload-time = "2025-03-26T03:05:16.913Z" }, - { url = "https://files.pythonhosted.org/packages/4d/e5/5ef30eb2cd81576256d7b6caaa0ce33cd1d2c2c92c8903cccb1af1a4ff2f/propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", size = 47763, upload-time = "2025-03-26T03:05:18.607Z" }, - { url = "https://files.pythonhosted.org/packages/87/9a/87091ceb048efeba4d28e903c0b15bcc84b7c0bf27dc0261e62335d9b7b8/propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", size = 47175, upload-time = "2025-03-26T03:05:19.85Z" }, - { url = "https://files.pythonhosted.org/packages/3e/2f/854e653c96ad1161f96194c6678a41bbb38c7947d17768e8811a77635a08/propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", size = 292265, upload-time = "2025-03-26T03:05:21.654Z" }, - { url = "https://files.pythonhosted.org/packages/40/8d/090955e13ed06bc3496ba4a9fb26c62e209ac41973cb0d6222de20c6868f/propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", size = 294412, upload-time = "2025-03-26T03:05:23.147Z" }, - { url = "https://files.pythonhosted.org/packages/39/e6/d51601342e53cc7582449e6a3c14a0479fab2f0750c1f4d22302e34219c6/propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", size = 294290, upload-time = "2025-03-26T03:05:24.577Z" }, - { url = "https://files.pythonhosted.org/packages/3b/4d/be5f1a90abc1881884aa5878989a1acdafd379a91d9c7e5e12cef37ec0d7/propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", size = 282926, upload-time = "2025-03-26T03:05:26.459Z" }, - { url = "https://files.pythonhosted.org/packages/57/2b/8f61b998c7ea93a2b7eca79e53f3e903db1787fca9373af9e2cf8dc22f9d/propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", size = 267808, upload-time = "2025-03-26T03:05:28.188Z" }, - { url = "https://files.pythonhosted.org/packages/11/1c/311326c3dfce59c58a6098388ba984b0e5fb0381ef2279ec458ef99bd547/propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", size = 290916, upload-time = "2025-03-26T03:05:29.757Z" }, - { url = "https://files.pythonhosted.org/packages/4b/74/91939924b0385e54dc48eb2e4edd1e4903ffd053cf1916ebc5347ac227f7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", size = 262661, upload-time = "2025-03-26T03:05:31.472Z" }, - { url = "https://files.pythonhosted.org/packages/c2/d7/e6079af45136ad325c5337f5dd9ef97ab5dc349e0ff362fe5c5db95e2454/propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", size = 264384, upload-time = "2025-03-26T03:05:32.984Z" }, - { url = "https://files.pythonhosted.org/packages/b7/d5/ba91702207ac61ae6f1c2da81c5d0d6bf6ce89e08a2b4d44e411c0bbe867/propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", size = 291420, upload-time = "2025-03-26T03:05:34.496Z" }, - { url = "https://files.pythonhosted.org/packages/58/70/2117780ed7edcd7ba6b8134cb7802aada90b894a9810ec56b7bb6018bee7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", size = 290880, upload-time = "2025-03-26T03:05:36.256Z" }, - { url = "https://files.pythonhosted.org/packages/4a/1f/ecd9ce27710021ae623631c0146719280a929d895a095f6d85efb6a0be2e/propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", size = 287407, upload-time = "2025-03-26T03:05:37.799Z" }, - { url = "https://files.pythonhosted.org/packages/3e/66/2e90547d6b60180fb29e23dc87bd8c116517d4255240ec6d3f7dc23d1926/propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", size = 42573, upload-time = "2025-03-26T03:05:39.193Z" }, - { url = "https://files.pythonhosted.org/packages/cb/8f/50ad8599399d1861b4d2b6b45271f0ef6af1b09b0a2386a46dbaf19c9535/propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", size = 46757, upload-time = "2025-03-26T03:05:40.811Z" }, - { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376, upload-time = "2025-03-26T03:06:10.5Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/07/c8/fdc6686a986feae3541ea23dcaa661bd93972d3940460646c6bb96e21c40/propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", size = 43651, upload_time = "2025-03-26T03:06:12.05Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/0f/5a5319ee83bd651f75311fcb0c492c21322a7fc8f788e4eef23f44243427/propcache-0.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", size = 80243, upload_time = "2025-03-26T03:04:01.912Z" }, + { url = "https://files.pythonhosted.org/packages/ce/84/3db5537e0879942783e2256616ff15d870a11d7ac26541336fe1b673c818/propcache-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", size = 46503, upload_time = "2025-03-26T03:04:03.704Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c8/b649ed972433c3f0d827d7f0cf9ea47162f4ef8f4fe98c5f3641a0bc63ff/propcache-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", size = 45934, upload_time = "2025-03-26T03:04:05.257Z" }, + { url = "https://files.pythonhosted.org/packages/59/f9/4c0a5cf6974c2c43b1a6810c40d889769cc8f84cea676cbe1e62766a45f8/propcache-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", size = 233633, upload_time = "2025-03-26T03:04:07.044Z" }, + { url = "https://files.pythonhosted.org/packages/e7/64/66f2f4d1b4f0007c6e9078bd95b609b633d3957fe6dd23eac33ebde4b584/propcache-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", size = 241124, upload_time = "2025-03-26T03:04:08.676Z" }, + { url = "https://files.pythonhosted.org/packages/aa/bf/7b8c9fd097d511638fa9b6af3d986adbdf567598a567b46338c925144c1b/propcache-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", size = 240283, upload_time = "2025-03-26T03:04:10.172Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c9/e85aeeeaae83358e2a1ef32d6ff50a483a5d5248bc38510d030a6f4e2816/propcache-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", size = 232498, upload_time = "2025-03-26T03:04:11.616Z" }, + { url = "https://files.pythonhosted.org/packages/8e/66/acb88e1f30ef5536d785c283af2e62931cb934a56a3ecf39105887aa8905/propcache-0.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", size = 221486, upload_time = "2025-03-26T03:04:13.102Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f9/233ddb05ffdcaee4448508ee1d70aa7deff21bb41469ccdfcc339f871427/propcache-0.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", size = 222675, upload_time = "2025-03-26T03:04:14.658Z" }, + { url = "https://files.pythonhosted.org/packages/98/b8/eb977e28138f9e22a5a789daf608d36e05ed93093ef12a12441030da800a/propcache-0.3.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", size = 215727, upload_time = "2025-03-26T03:04:16.207Z" }, + { url = "https://files.pythonhosted.org/packages/89/2d/5f52d9c579f67b8ee1edd9ec073c91b23cc5b7ff7951a1e449e04ed8fdf3/propcache-0.3.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", size = 217878, upload_time = "2025-03-26T03:04:18.11Z" }, + { url = "https://files.pythonhosted.org/packages/7a/fd/5283e5ed8a82b00c7a989b99bb6ea173db1ad750bf0bf8dff08d3f4a4e28/propcache-0.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", size = 230558, upload_time = "2025-03-26T03:04:19.562Z" }, + { url = "https://files.pythonhosted.org/packages/90/38/ab17d75938ef7ac87332c588857422ae126b1c76253f0f5b1242032923ca/propcache-0.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", size = 233754, upload_time = "2025-03-26T03:04:21.065Z" }, + { url = "https://files.pythonhosted.org/packages/06/5d/3b921b9c60659ae464137508d3b4c2b3f52f592ceb1964aa2533b32fcf0b/propcache-0.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", size = 226088, upload_time = "2025-03-26T03:04:22.718Z" }, + { url = "https://files.pythonhosted.org/packages/54/6e/30a11f4417d9266b5a464ac5a8c5164ddc9dd153dfa77bf57918165eb4ae/propcache-0.3.1-cp311-cp311-win32.whl", hash = "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", size = 40859, upload_time = "2025-03-26T03:04:24.039Z" }, + { url = "https://files.pythonhosted.org/packages/1d/3a/8a68dd867da9ca2ee9dfd361093e9cb08cb0f37e5ddb2276f1b5177d7731/propcache-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", size = 45153, upload_time = "2025-03-26T03:04:25.211Z" }, + { url = "https://files.pythonhosted.org/packages/41/aa/ca78d9be314d1e15ff517b992bebbed3bdfef5b8919e85bf4940e57b6137/propcache-0.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", size = 80430, upload_time = "2025-03-26T03:04:26.436Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d8/f0c17c44d1cda0ad1979af2e593ea290defdde9eaeb89b08abbe02a5e8e1/propcache-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", size = 46637, upload_time = "2025-03-26T03:04:27.932Z" }, + { url = "https://files.pythonhosted.org/packages/ae/bd/c1e37265910752e6e5e8a4c1605d0129e5b7933c3dc3cf1b9b48ed83b364/propcache-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", size = 46123, upload_time = "2025-03-26T03:04:30.659Z" }, + { url = "https://files.pythonhosted.org/packages/d4/b0/911eda0865f90c0c7e9f0415d40a5bf681204da5fd7ca089361a64c16b28/propcache-0.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", size = 243031, upload_time = "2025-03-26T03:04:31.977Z" }, + { url = "https://files.pythonhosted.org/packages/0a/06/0da53397c76a74271621807265b6eb61fb011451b1ddebf43213df763669/propcache-0.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", size = 249100, upload_time = "2025-03-26T03:04:33.45Z" }, + { url = "https://files.pythonhosted.org/packages/f1/eb/13090e05bf6b963fc1653cdc922133ced467cb4b8dab53158db5a37aa21e/propcache-0.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", size = 250170, upload_time = "2025-03-26T03:04:35.542Z" }, + { url = "https://files.pythonhosted.org/packages/3b/4c/f72c9e1022b3b043ec7dc475a0f405d4c3e10b9b1d378a7330fecf0652da/propcache-0.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", size = 245000, upload_time = "2025-03-26T03:04:37.501Z" }, + { url = "https://files.pythonhosted.org/packages/e8/fd/970ca0e22acc829f1adf5de3724085e778c1ad8a75bec010049502cb3a86/propcache-0.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", size = 230262, upload_time = "2025-03-26T03:04:39.532Z" }, + { url = "https://files.pythonhosted.org/packages/c4/42/817289120c6b9194a44f6c3e6b2c3277c5b70bbad39e7df648f177cc3634/propcache-0.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", size = 236772, upload_time = "2025-03-26T03:04:41.109Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9c/3b3942b302badd589ad6b672da3ca7b660a6c2f505cafd058133ddc73918/propcache-0.3.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", size = 231133, upload_time = "2025-03-26T03:04:42.544Z" }, + { url = "https://files.pythonhosted.org/packages/98/a1/75f6355f9ad039108ff000dfc2e19962c8dea0430da9a1428e7975cf24b2/propcache-0.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", size = 230741, upload_time = "2025-03-26T03:04:44.06Z" }, + { url = "https://files.pythonhosted.org/packages/67/0c/3e82563af77d1f8731132166da69fdfd95e71210e31f18edce08a1eb11ea/propcache-0.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", size = 244047, upload_time = "2025-03-26T03:04:45.983Z" }, + { url = "https://files.pythonhosted.org/packages/f7/50/9fb7cca01532a08c4d5186d7bb2da6c4c587825c0ae134b89b47c7d62628/propcache-0.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5", size = 246467, upload_time = "2025-03-26T03:04:47.699Z" }, + { url = "https://files.pythonhosted.org/packages/a9/02/ccbcf3e1c604c16cc525309161d57412c23cf2351523aedbb280eb7c9094/propcache-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", size = 241022, upload_time = "2025-03-26T03:04:49.195Z" }, + { url = "https://files.pythonhosted.org/packages/db/19/e777227545e09ca1e77a6e21274ae9ec45de0f589f0ce3eca2a41f366220/propcache-0.3.1-cp312-cp312-win32.whl", hash = "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", size = 40647, upload_time = "2025-03-26T03:04:50.595Z" }, + { url = "https://files.pythonhosted.org/packages/24/bb/3b1b01da5dd04c77a204c84e538ff11f624e31431cfde7201d9110b092b1/propcache-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", size = 44784, upload_time = "2025-03-26T03:04:51.791Z" }, + { url = "https://files.pythonhosted.org/packages/58/60/f645cc8b570f99be3cf46714170c2de4b4c9d6b827b912811eff1eb8a412/propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", size = 77865, upload_time = "2025-03-26T03:04:53.406Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d4/c1adbf3901537582e65cf90fd9c26fde1298fde5a2c593f987112c0d0798/propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", size = 45452, upload_time = "2025-03-26T03:04:54.624Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b5/fe752b2e63f49f727c6c1c224175d21b7d1727ce1d4873ef1c24c9216830/propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", size = 44800, upload_time = "2025-03-26T03:04:55.844Z" }, + { url = "https://files.pythonhosted.org/packages/62/37/fc357e345bc1971e21f76597028b059c3d795c5ca7690d7a8d9a03c9708a/propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", size = 225804, upload_time = "2025-03-26T03:04:57.158Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f1/16e12c33e3dbe7f8b737809bad05719cff1dccb8df4dafbcff5575002c0e/propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", size = 230650, upload_time = "2025-03-26T03:04:58.61Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a2/018b9f2ed876bf5091e60153f727e8f9073d97573f790ff7cdf6bc1d1fb8/propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", size = 234235, upload_time = "2025-03-26T03:05:00.599Z" }, + { url = "https://files.pythonhosted.org/packages/45/5f/3faee66fc930dfb5da509e34c6ac7128870631c0e3582987fad161fcb4b1/propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", size = 228249, upload_time = "2025-03-26T03:05:02.11Z" }, + { url = "https://files.pythonhosted.org/packages/62/1e/a0d5ebda5da7ff34d2f5259a3e171a94be83c41eb1e7cd21a2105a84a02e/propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", size = 214964, upload_time = "2025-03-26T03:05:03.599Z" }, + { url = "https://files.pythonhosted.org/packages/db/a0/d72da3f61ceab126e9be1f3bc7844b4e98c6e61c985097474668e7e52152/propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", size = 222501, upload_time = "2025-03-26T03:05:05.107Z" }, + { url = "https://files.pythonhosted.org/packages/18/6d/a008e07ad7b905011253adbbd97e5b5375c33f0b961355ca0a30377504ac/propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", size = 217917, upload_time = "2025-03-26T03:05:06.59Z" }, + { url = "https://files.pythonhosted.org/packages/98/37/02c9343ffe59e590e0e56dc5c97d0da2b8b19fa747ebacf158310f97a79a/propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", size = 217089, upload_time = "2025-03-26T03:05:08.1Z" }, + { url = "https://files.pythonhosted.org/packages/53/1b/d3406629a2c8a5666d4674c50f757a77be119b113eedd47b0375afdf1b42/propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", size = 228102, upload_time = "2025-03-26T03:05:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/cd/a7/3664756cf50ce739e5f3abd48febc0be1a713b1f389a502ca819791a6b69/propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", size = 230122, upload_time = "2025-03-26T03:05:11.408Z" }, + { url = "https://files.pythonhosted.org/packages/35/36/0bbabaacdcc26dac4f8139625e930f4311864251276033a52fd52ff2a274/propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", size = 226818, upload_time = "2025-03-26T03:05:12.909Z" }, + { url = "https://files.pythonhosted.org/packages/cc/27/4e0ef21084b53bd35d4dae1634b6d0bad35e9c58ed4f032511acca9d4d26/propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", size = 40112, upload_time = "2025-03-26T03:05:14.289Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", size = 44034, upload_time = "2025-03-26T03:05:15.616Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a8/0a4fd2f664fc6acc66438370905124ce62e84e2e860f2557015ee4a61c7e/propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", size = 82613, upload_time = "2025-03-26T03:05:16.913Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e5/5ef30eb2cd81576256d7b6caaa0ce33cd1d2c2c92c8903cccb1af1a4ff2f/propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", size = 47763, upload_time = "2025-03-26T03:05:18.607Z" }, + { url = "https://files.pythonhosted.org/packages/87/9a/87091ceb048efeba4d28e903c0b15bcc84b7c0bf27dc0261e62335d9b7b8/propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", size = 47175, upload_time = "2025-03-26T03:05:19.85Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2f/854e653c96ad1161f96194c6678a41bbb38c7947d17768e8811a77635a08/propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", size = 292265, upload_time = "2025-03-26T03:05:21.654Z" }, + { url = "https://files.pythonhosted.org/packages/40/8d/090955e13ed06bc3496ba4a9fb26c62e209ac41973cb0d6222de20c6868f/propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", size = 294412, upload_time = "2025-03-26T03:05:23.147Z" }, + { url = "https://files.pythonhosted.org/packages/39/e6/d51601342e53cc7582449e6a3c14a0479fab2f0750c1f4d22302e34219c6/propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", size = 294290, upload_time = "2025-03-26T03:05:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/3b/4d/be5f1a90abc1881884aa5878989a1acdafd379a91d9c7e5e12cef37ec0d7/propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", size = 282926, upload_time = "2025-03-26T03:05:26.459Z" }, + { url = "https://files.pythonhosted.org/packages/57/2b/8f61b998c7ea93a2b7eca79e53f3e903db1787fca9373af9e2cf8dc22f9d/propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", size = 267808, upload_time = "2025-03-26T03:05:28.188Z" }, + { url = "https://files.pythonhosted.org/packages/11/1c/311326c3dfce59c58a6098388ba984b0e5fb0381ef2279ec458ef99bd547/propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", size = 290916, upload_time = "2025-03-26T03:05:29.757Z" }, + { url = "https://files.pythonhosted.org/packages/4b/74/91939924b0385e54dc48eb2e4edd1e4903ffd053cf1916ebc5347ac227f7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", size = 262661, upload_time = "2025-03-26T03:05:31.472Z" }, + { url = "https://files.pythonhosted.org/packages/c2/d7/e6079af45136ad325c5337f5dd9ef97ab5dc349e0ff362fe5c5db95e2454/propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", size = 264384, upload_time = "2025-03-26T03:05:32.984Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d5/ba91702207ac61ae6f1c2da81c5d0d6bf6ce89e08a2b4d44e411c0bbe867/propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", size = 291420, upload_time = "2025-03-26T03:05:34.496Z" }, + { url = "https://files.pythonhosted.org/packages/58/70/2117780ed7edcd7ba6b8134cb7802aada90b894a9810ec56b7bb6018bee7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", size = 290880, upload_time = "2025-03-26T03:05:36.256Z" }, + { url = "https://files.pythonhosted.org/packages/4a/1f/ecd9ce27710021ae623631c0146719280a929d895a095f6d85efb6a0be2e/propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", size = 287407, upload_time = "2025-03-26T03:05:37.799Z" }, + { url = "https://files.pythonhosted.org/packages/3e/66/2e90547d6b60180fb29e23dc87bd8c116517d4255240ec6d3f7dc23d1926/propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", size = 42573, upload_time = "2025-03-26T03:05:39.193Z" }, + { url = "https://files.pythonhosted.org/packages/cb/8f/50ad8599399d1861b4d2b6b45271f0ef6af1b09b0a2386a46dbaf19c9535/propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", size = 46757, upload_time = "2025-03-26T03:05:40.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376, upload_time = "2025-03-26T03:06:10.5Z" }, ] [[package]] @@ -1456,23 +1456,23 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/ac/87285f15f7cce6d4a008f33f1757fb5a13611ea8914eb58c3d0d26243468/proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012", size = 56142, upload-time = "2025-03-10T15:54:38.843Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/ac/87285f15f7cce6d4a008f33f1757fb5a13611ea8914eb58c3d0d26243468/proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012", size = 56142, upload_time = "2025-03-10T15:54:38.843Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/6d/280c4c2ce28b1593a19ad5239c8b826871fc6ec275c21afc8e1820108039/proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", size = 50163, upload-time = "2025-03-10T15:54:37.335Z" }, + { url = "https://files.pythonhosted.org/packages/4e/6d/280c4c2ce28b1593a19ad5239c8b826871fc6ec275c21afc8e1820108039/proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", size = 50163, upload_time = "2025-03-10T15:54:37.335Z" }, ] [[package]] name = "protobuf" version = "4.25.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/74/63/84fdeac1f03864c2b8b9f0b7fe711c4af5f95759ee281d2026530086b2f5/protobuf-4.25.7.tar.gz", hash = "sha256:28f65ae8c14523cc2c76c1e91680958700d3eac69f45c96512c12c63d9a38807", size = 380612, upload-time = "2025-04-24T02:56:58.685Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/63/84fdeac1f03864c2b8b9f0b7fe711c4af5f95759ee281d2026530086b2f5/protobuf-4.25.7.tar.gz", hash = "sha256:28f65ae8c14523cc2c76c1e91680958700d3eac69f45c96512c12c63d9a38807", size = 380612, upload_time = "2025-04-24T02:56:58.685Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/ed/9a58076cfb8edc237c92617f1d3744660e9b4457d54f3c2fdf1a4bbae5c7/protobuf-4.25.7-cp310-abi3-win32.whl", hash = "sha256:dc582cf1a73a6b40aa8e7704389b8d8352da616bc8ed5c6cc614bdd0b5ce3f7a", size = 392457, upload-time = "2025-04-24T02:56:40.798Z" }, - { url = "https://files.pythonhosted.org/packages/28/b3/e00870528029fe252cf3bd6fa535821c276db3753b44a4691aee0d52ff9e/protobuf-4.25.7-cp310-abi3-win_amd64.whl", hash = "sha256:cd873dbddb28460d1706ff4da2e7fac175f62f2a0bebc7b33141f7523c5a2399", size = 413446, upload-time = "2025-04-24T02:56:44.199Z" }, - { url = "https://files.pythonhosted.org/packages/60/1d/f450a193f875a20099d4492d2c1cb23091d65d512956fb1e167ee61b4bf0/protobuf-4.25.7-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:4c899f09b0502eb39174c717ccf005b844ea93e31137c167ddcacf3e09e49610", size = 394248, upload-time = "2025-04-24T02:56:45.75Z" }, - { url = "https://files.pythonhosted.org/packages/c8/b8/ea88e9857484a0618c74121618b9e620fc50042de43cdabbebe1b93a83e0/protobuf-4.25.7-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:6d2f5dede3d112e573f0e5f9778c0c19d9f9e209727abecae1d39db789f522c6", size = 293717, upload-time = "2025-04-24T02:56:47.427Z" }, - { url = "https://files.pythonhosted.org/packages/a7/81/d0b68e9a9a76804113b6dedc6fffed868b97048bbe6f1bedc675bdb8523c/protobuf-4.25.7-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:d41fb7ae72a25fcb79b2d71e4247f0547a02e8185ed51587c22827a87e5736ed", size = 294636, upload-time = "2025-04-24T02:56:48.976Z" }, - { url = "https://files.pythonhosted.org/packages/17/d7/1e7c80cb2ea2880cfe38580dcfbb22b78b746640c9c13fc3337a6967dc4c/protobuf-4.25.7-py3-none-any.whl", hash = "sha256:e9d969f5154eaeab41404def5dcf04e62162178f4b9de98b2d3c1c70f5f84810", size = 156468, upload-time = "2025-04-24T02:56:56.957Z" }, + { url = "https://files.pythonhosted.org/packages/41/ed/9a58076cfb8edc237c92617f1d3744660e9b4457d54f3c2fdf1a4bbae5c7/protobuf-4.25.7-cp310-abi3-win32.whl", hash = "sha256:dc582cf1a73a6b40aa8e7704389b8d8352da616bc8ed5c6cc614bdd0b5ce3f7a", size = 392457, upload_time = "2025-04-24T02:56:40.798Z" }, + { url = "https://files.pythonhosted.org/packages/28/b3/e00870528029fe252cf3bd6fa535821c276db3753b44a4691aee0d52ff9e/protobuf-4.25.7-cp310-abi3-win_amd64.whl", hash = "sha256:cd873dbddb28460d1706ff4da2e7fac175f62f2a0bebc7b33141f7523c5a2399", size = 413446, upload_time = "2025-04-24T02:56:44.199Z" }, + { url = "https://files.pythonhosted.org/packages/60/1d/f450a193f875a20099d4492d2c1cb23091d65d512956fb1e167ee61b4bf0/protobuf-4.25.7-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:4c899f09b0502eb39174c717ccf005b844ea93e31137c167ddcacf3e09e49610", size = 394248, upload_time = "2025-04-24T02:56:45.75Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b8/ea88e9857484a0618c74121618b9e620fc50042de43cdabbebe1b93a83e0/protobuf-4.25.7-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:6d2f5dede3d112e573f0e5f9778c0c19d9f9e209727abecae1d39db789f522c6", size = 293717, upload_time = "2025-04-24T02:56:47.427Z" }, + { url = "https://files.pythonhosted.org/packages/a7/81/d0b68e9a9a76804113b6dedc6fffed868b97048bbe6f1bedc675bdb8523c/protobuf-4.25.7-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:d41fb7ae72a25fcb79b2d71e4247f0547a02e8185ed51587c22827a87e5736ed", size = 294636, upload_time = "2025-04-24T02:56:48.976Z" }, + { url = "https://files.pythonhosted.org/packages/17/d7/1e7c80cb2ea2880cfe38580dcfbb22b78b746640c9c13fc3337a6967dc4c/protobuf-4.25.7-py3-none-any.whl", hash = "sha256:e9d969f5154eaeab41404def5dcf04e62162178f4b9de98b2d3c1c70f5f84810", size = 156468, upload_time = "2025-04-24T02:56:56.957Z" }, ] [[package]] @@ -1483,9 +1483,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "tzdata", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5c/6d/0939210f3ba089b360cf0d3741494719152567bc81303cca2c0f1e67c78a/psycopg-3.1.20.tar.gz", hash = "sha256:32f5862ab79f238496236f97fe374a7ab55b4b4bb839a74802026544735f9a07", size = 147567, upload-time = "2024-06-30T17:03:55.421Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/6d/0939210f3ba089b360cf0d3741494719152567bc81303cca2c0f1e67c78a/psycopg-3.1.20.tar.gz", hash = "sha256:32f5862ab79f238496236f97fe374a7ab55b4b4bb839a74802026544735f9a07", size = 147567, upload_time = "2024-06-30T17:03:55.421Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/e9/126bbfd5dded758bb109526c5f5f2c2538fe293b15b6fa208db7078c72c4/psycopg-3.1.20-py3-none-any.whl", hash = "sha256:898a29f49ac9c903d554f5a6cdc44a8fc564325557c18f82e51f39c1f4fc2aeb", size = 179473, upload-time = "2024-06-30T16:57:04.093Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e9/126bbfd5dded758bb109526c5f5f2c2538fe293b15b6fa208db7078c72c4/psycopg-3.1.20-py3-none-any.whl", hash = "sha256:898a29f49ac9c903d554f5a6cdc44a8fc564325557c18f82e51f39c1f4fc2aeb", size = 179473, upload_time = "2024-06-30T16:57:04.093Z" }, ] [package.optional-dependencies] @@ -1498,133 +1498,133 @@ name = "psycopg-binary" version = "3.1.20" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/1c/45e5f240765e80076b08c3ed02c5dfeb5e97d549769b81f8382485d70a15/psycopg_binary-3.1.20-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:802989350fcbc783732bfef660afb34439a62727642a05e8bb9acf7d68993627", size = 3350503, upload-time = "2024-06-30T16:58:27.18Z" }, - { url = "https://files.pythonhosted.org/packages/52/b8/acf96d388692d0bbf2346286f8b175778bc24046aca9181f50d9df9f4714/psycopg_binary-3.1.20-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:01b0e39128715fc37fed6cdc50ab58278eacb75709af503eb607654030975f09", size = 3480091, upload-time = "2024-06-30T16:58:33.872Z" }, - { url = "https://files.pythonhosted.org/packages/41/d4/20604282ff08823d0e90cf092738ea21b339f56a172d8583565b272fc4be/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77af1086bedfa0729465565c636de3519079ba523d7b7ee6e8b9486beb1ee905", size = 4434555, upload-time = "2024-06-30T16:58:40.795Z" }, - { url = "https://files.pythonhosted.org/packages/73/e0/3917b766508bb749e08225492d45ba7463b559de1c8a41d3f8f3cf0927cb/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9b9562395d441e225f354e8c6303ee6993a93aaeb0dbb5b94368f3249ab2388", size = 4231402, upload-time = "2024-06-30T16:58:48.586Z" }, - { url = "https://files.pythonhosted.org/packages/b4/9b/251435896f7459beda355ef3e3919b6b20d067582cd6838ba248d3cff188/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e814d69e5447a93e7b98117ec95a8ce606d3742092fd120960551ed67c376fea", size = 4484218, upload-time = "2024-06-30T16:58:56.911Z" }, - { url = "https://files.pythonhosted.org/packages/a1/12/b2057f9bb8b5f408139266a5b48bfd7578340296d7314d964b9f09e5b18f/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf1c2061600235ae9b11d7ad357cab89ac583a76bdb0199f7a29ac947939c20", size = 4176668, upload-time = "2024-06-30T16:59:02.496Z" }, - { url = "https://files.pythonhosted.org/packages/80/9c/a62fe4167427a06e69882d274ba90903507afc89caf6bcc3671790a20875/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:50f1d807b4167f973a6f67bca39bf656b737f7426be158a1dc9cb0000d020744", size = 3102502, upload-time = "2024-06-30T16:59:07.216Z" }, - { url = "https://files.pythonhosted.org/packages/98/83/bceca23dd830d4069949e70dec9feb03c114cc551b104f0e2b48b1e598c6/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4cf6ec1490232a5b208dae94a8269dc739e6762684c8658a0f3570402db934ae", size = 3080005, upload-time = "2024-06-30T16:59:14.927Z" }, - { url = "https://files.pythonhosted.org/packages/fc/83/bab7c8495e0eb11bf710663afb2849c2d3c91a2bf61b2bd597941f57f80b/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:309c09ec50a9c5c8492c2922ee666df1e30a08b08a9b63083d0daa414eccd09c", size = 3182315, upload-time = "2024-06-30T16:59:21.18Z" }, - { url = "https://files.pythonhosted.org/packages/ca/9b/bd4970faed24ae4a850ee8c6ebd621e98fd86e2962e13038603a726e2504/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e2c33a01799f93ef8c11a023df66280e39ca3c3249a2581adb2a0e5e80801088", size = 3222552, upload-time = "2024-06-30T16:59:27.663Z" }, - { url = "https://files.pythonhosted.org/packages/5d/0b/7ab0744f282df53968f5066d5fd8bf3f994f90bf2a8003ab40278818d0f2/psycopg_binary-3.1.20-cp311-cp311-win_amd64.whl", hash = "sha256:2c67532057fda72579b02d9d61e9cc8975982844bd5c3c9dc7f84ce8bcac859c", size = 2899115, upload-time = "2024-06-30T16:59:35.512Z" }, - { url = "https://files.pythonhosted.org/packages/94/12/6e909d3a20f7bfa6915c1fdf64ab47bb9ca44b837adb468841aad51bab6c/psycopg_binary-3.1.20-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ef08de60f1b8503a6f6b6f5bee612de36373c09bc0e3f84409fab09e1ff72107", size = 3326944, upload-time = "2024-06-30T16:59:41.783Z" }, - { url = "https://files.pythonhosted.org/packages/e1/4e/dc425f5c8c102045486f2fa39c3cb379b073557d6bd2cf5d06de81036d7c/psycopg_binary-3.1.20-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a4847fa31c8d3a6dd3536cf1e130dfcc454ed26be471ef274e4358bf7f709cda", size = 3475444, upload-time = "2024-06-30T16:59:48.547Z" }, - { url = "https://files.pythonhosted.org/packages/cd/cd/6484cbdb82dc29bfe43ae8c401a0be309402c304d1aaabcccf1e21908663/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b72e9c8c79dcc30e34e996079cfe0374b7c7233d2b5f6f25a0bc8872fe2babef", size = 4412872, upload-time = "2024-06-30T16:59:54.853Z" }, - { url = "https://files.pythonhosted.org/packages/25/d3/d403dc61f9d8b56683a6a1db47ab156807d2e1c442b044fba5763e786893/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836246f3c486ef7edfce6cf6cc760173e244826ebecd54c1b63c91d4cc0341f7", size = 4216654, upload-time = "2024-06-30T16:59:58.935Z" }, - { url = "https://files.pythonhosted.org/packages/d3/ff/389198638ad10ec0e80fcc97b5c8092987214d9ac529b1224bf0f7e221da/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:015f70b17539ec0ecfb0f87bcaface0c7fa1289b6e7e2313dc7cdfdc513e3235", size = 4451310, upload-time = "2024-06-30T17:00:05.647Z" }, - { url = "https://files.pythonhosted.org/packages/84/94/9ae70af00caf9ce98f857a883ff64c5d236dfea5b7b4b8528d28e80515aa/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f52498dc7b41fee74e971823ede4519e3a9597d416f7a2044dbe4b98cc61ff35", size = 4153667, upload-time = "2024-06-30T17:00:12.309Z" }, - { url = "https://files.pythonhosted.org/packages/b8/57/b8a34174803683ef0f3f2fe18304f7048d31bab431f21cf511598b894ed7/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:92b61bae0ac881580faa1c89bf2167db7041cb01cc0bd686244f9c20a010036a", size = 3081906, upload-time = "2024-06-30T17:00:17.223Z" }, - { url = "https://files.pythonhosted.org/packages/bf/e7/5df8c4794f13004787cd7ddfe456eec90f49d1b99f1a10947f7ba2a67487/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3532b8677666aadb64a4e31f6e97fe4ab71b862ab100d337faf497198339fd4d", size = 3061376, upload-time = "2024-06-30T17:00:22.232Z" }, - { url = "https://files.pythonhosted.org/packages/8e/c6/ec4abb814f54af4b659896ce10386be0c538dad8111b3daeaf672b4daa03/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f7df27f50a7db84c28e58be3df41f39618161096c3379ad68bc665a454c53e93", size = 3150174, upload-time = "2024-06-30T17:00:26.982Z" }, - { url = "https://files.pythonhosted.org/packages/0c/50/7b4382e5f5d256ac720ee0bd6470c7aa7d28f78570bd44d5e0b1c29eeb96/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:12b33c511f0be79d5a68231a10972ef9c68d954d30d176679472057ecc22891a", size = 3198871, upload-time = "2024-06-30T17:00:32.17Z" }, - { url = "https://files.pythonhosted.org/packages/76/2f/eda1b86c01d2803ac05714b94283af1e5012437dcc63dfe0679cc4d445ad/psycopg_binary-3.1.20-cp312-cp312-win_amd64.whl", hash = "sha256:6f3c0b05fc3cbd4d99aaacf5c7afa13b086df5777b9fefb78d31bf81fc70bd04", size = 2884414, upload-time = "2024-06-30T17:00:40.26Z" }, + { url = "https://files.pythonhosted.org/packages/f8/1c/45e5f240765e80076b08c3ed02c5dfeb5e97d549769b81f8382485d70a15/psycopg_binary-3.1.20-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:802989350fcbc783732bfef660afb34439a62727642a05e8bb9acf7d68993627", size = 3350503, upload_time = "2024-06-30T16:58:27.18Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/acf96d388692d0bbf2346286f8b175778bc24046aca9181f50d9df9f4714/psycopg_binary-3.1.20-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:01b0e39128715fc37fed6cdc50ab58278eacb75709af503eb607654030975f09", size = 3480091, upload_time = "2024-06-30T16:58:33.872Z" }, + { url = "https://files.pythonhosted.org/packages/41/d4/20604282ff08823d0e90cf092738ea21b339f56a172d8583565b272fc4be/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77af1086bedfa0729465565c636de3519079ba523d7b7ee6e8b9486beb1ee905", size = 4434555, upload_time = "2024-06-30T16:58:40.795Z" }, + { url = "https://files.pythonhosted.org/packages/73/e0/3917b766508bb749e08225492d45ba7463b559de1c8a41d3f8f3cf0927cb/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9b9562395d441e225f354e8c6303ee6993a93aaeb0dbb5b94368f3249ab2388", size = 4231402, upload_time = "2024-06-30T16:58:48.586Z" }, + { url = "https://files.pythonhosted.org/packages/b4/9b/251435896f7459beda355ef3e3919b6b20d067582cd6838ba248d3cff188/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e814d69e5447a93e7b98117ec95a8ce606d3742092fd120960551ed67c376fea", size = 4484218, upload_time = "2024-06-30T16:58:56.911Z" }, + { url = "https://files.pythonhosted.org/packages/a1/12/b2057f9bb8b5f408139266a5b48bfd7578340296d7314d964b9f09e5b18f/psycopg_binary-3.1.20-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf1c2061600235ae9b11d7ad357cab89ac583a76bdb0199f7a29ac947939c20", size = 4176668, upload_time = "2024-06-30T16:59:02.496Z" }, + { url = "https://files.pythonhosted.org/packages/80/9c/a62fe4167427a06e69882d274ba90903507afc89caf6bcc3671790a20875/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:50f1d807b4167f973a6f67bca39bf656b737f7426be158a1dc9cb0000d020744", size = 3102502, upload_time = "2024-06-30T16:59:07.216Z" }, + { url = "https://files.pythonhosted.org/packages/98/83/bceca23dd830d4069949e70dec9feb03c114cc551b104f0e2b48b1e598c6/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4cf6ec1490232a5b208dae94a8269dc739e6762684c8658a0f3570402db934ae", size = 3080005, upload_time = "2024-06-30T16:59:14.927Z" }, + { url = "https://files.pythonhosted.org/packages/fc/83/bab7c8495e0eb11bf710663afb2849c2d3c91a2bf61b2bd597941f57f80b/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:309c09ec50a9c5c8492c2922ee666df1e30a08b08a9b63083d0daa414eccd09c", size = 3182315, upload_time = "2024-06-30T16:59:21.18Z" }, + { url = "https://files.pythonhosted.org/packages/ca/9b/bd4970faed24ae4a850ee8c6ebd621e98fd86e2962e13038603a726e2504/psycopg_binary-3.1.20-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e2c33a01799f93ef8c11a023df66280e39ca3c3249a2581adb2a0e5e80801088", size = 3222552, upload_time = "2024-06-30T16:59:27.663Z" }, + { url = "https://files.pythonhosted.org/packages/5d/0b/7ab0744f282df53968f5066d5fd8bf3f994f90bf2a8003ab40278818d0f2/psycopg_binary-3.1.20-cp311-cp311-win_amd64.whl", hash = "sha256:2c67532057fda72579b02d9d61e9cc8975982844bd5c3c9dc7f84ce8bcac859c", size = 2899115, upload_time = "2024-06-30T16:59:35.512Z" }, + { url = "https://files.pythonhosted.org/packages/94/12/6e909d3a20f7bfa6915c1fdf64ab47bb9ca44b837adb468841aad51bab6c/psycopg_binary-3.1.20-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ef08de60f1b8503a6f6b6f5bee612de36373c09bc0e3f84409fab09e1ff72107", size = 3326944, upload_time = "2024-06-30T16:59:41.783Z" }, + { url = "https://files.pythonhosted.org/packages/e1/4e/dc425f5c8c102045486f2fa39c3cb379b073557d6bd2cf5d06de81036d7c/psycopg_binary-3.1.20-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a4847fa31c8d3a6dd3536cf1e130dfcc454ed26be471ef274e4358bf7f709cda", size = 3475444, upload_time = "2024-06-30T16:59:48.547Z" }, + { url = "https://files.pythonhosted.org/packages/cd/cd/6484cbdb82dc29bfe43ae8c401a0be309402c304d1aaabcccf1e21908663/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b72e9c8c79dcc30e34e996079cfe0374b7c7233d2b5f6f25a0bc8872fe2babef", size = 4412872, upload_time = "2024-06-30T16:59:54.853Z" }, + { url = "https://files.pythonhosted.org/packages/25/d3/d403dc61f9d8b56683a6a1db47ab156807d2e1c442b044fba5763e786893/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836246f3c486ef7edfce6cf6cc760173e244826ebecd54c1b63c91d4cc0341f7", size = 4216654, upload_time = "2024-06-30T16:59:58.935Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ff/389198638ad10ec0e80fcc97b5c8092987214d9ac529b1224bf0f7e221da/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:015f70b17539ec0ecfb0f87bcaface0c7fa1289b6e7e2313dc7cdfdc513e3235", size = 4451310, upload_time = "2024-06-30T17:00:05.647Z" }, + { url = "https://files.pythonhosted.org/packages/84/94/9ae70af00caf9ce98f857a883ff64c5d236dfea5b7b4b8528d28e80515aa/psycopg_binary-3.1.20-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f52498dc7b41fee74e971823ede4519e3a9597d416f7a2044dbe4b98cc61ff35", size = 4153667, upload_time = "2024-06-30T17:00:12.309Z" }, + { url = "https://files.pythonhosted.org/packages/b8/57/b8a34174803683ef0f3f2fe18304f7048d31bab431f21cf511598b894ed7/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:92b61bae0ac881580faa1c89bf2167db7041cb01cc0bd686244f9c20a010036a", size = 3081906, upload_time = "2024-06-30T17:00:17.223Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e7/5df8c4794f13004787cd7ddfe456eec90f49d1b99f1a10947f7ba2a67487/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3532b8677666aadb64a4e31f6e97fe4ab71b862ab100d337faf497198339fd4d", size = 3061376, upload_time = "2024-06-30T17:00:22.232Z" }, + { url = "https://files.pythonhosted.org/packages/8e/c6/ec4abb814f54af4b659896ce10386be0c538dad8111b3daeaf672b4daa03/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f7df27f50a7db84c28e58be3df41f39618161096c3379ad68bc665a454c53e93", size = 3150174, upload_time = "2024-06-30T17:00:26.982Z" }, + { url = "https://files.pythonhosted.org/packages/0c/50/7b4382e5f5d256ac720ee0bd6470c7aa7d28f78570bd44d5e0b1c29eeb96/psycopg_binary-3.1.20-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:12b33c511f0be79d5a68231a10972ef9c68d954d30d176679472057ecc22891a", size = 3198871, upload_time = "2024-06-30T17:00:32.17Z" }, + { url = "https://files.pythonhosted.org/packages/76/2f/eda1b86c01d2803ac05714b94283af1e5012437dcc63dfe0679cc4d445ad/psycopg_binary-3.1.20-cp312-cp312-win_amd64.whl", hash = "sha256:6f3c0b05fc3cbd4d99aaacf5c7afa13b086df5777b9fefb78d31bf81fc70bd04", size = 2884414, upload_time = "2024-06-30T17:00:40.26Z" }, ] [[package]] name = "psycopg2-binary" version = "2.9.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cb/0e/bdc8274dc0585090b4e3432267d7be4dfbfd8971c0fa59167c711105a6bf/psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2", size = 385764, upload-time = "2024-10-16T11:24:58.126Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/8f/9feb01291d0d7a0a4c6a6bab24094135c2b59c6a81943752f632c75896d6/psycopg2_binary-2.9.10-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff", size = 3043397, upload-time = "2024-10-16T11:19:40.033Z" }, - { url = "https://files.pythonhosted.org/packages/15/30/346e4683532011561cd9c8dfeac6a8153dd96452fee0b12666058ab7893c/psycopg2_binary-2.9.10-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1a6784f0ce3fec4edc64e985865c17778514325074adf5ad8f80636cd029ef7c", size = 3274806, upload-time = "2024-10-16T11:19:43.5Z" }, - { url = "https://files.pythonhosted.org/packages/66/6e/4efebe76f76aee7ec99166b6c023ff8abdc4e183f7b70913d7c047701b79/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f86c56eeb91dc3135b3fd8a95dc7ae14c538a2f3ad77a19645cf55bab1799c", size = 2851370, upload-time = "2024-10-16T11:19:46.986Z" }, - { url = "https://files.pythonhosted.org/packages/7f/fd/ff83313f86b50f7ca089b161b8e0a22bb3c319974096093cd50680433fdb/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b3d2491d4d78b6b14f76881905c7a8a8abcf974aad4a8a0b065273a0ed7a2cb", size = 3080780, upload-time = "2024-10-16T11:19:50.242Z" }, - { url = "https://files.pythonhosted.org/packages/e6/c4/bfadd202dcda8333a7ccafdc51c541dbdfce7c2c7cda89fa2374455d795f/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2286791ececda3a723d1910441c793be44625d86d1a4e79942751197f4d30341", size = 3264583, upload-time = "2024-10-16T11:19:54.424Z" }, - { url = "https://files.pythonhosted.org/packages/5d/f1/09f45ac25e704ac954862581f9f9ae21303cc5ded3d0b775532b407f0e90/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:512d29bb12608891e349af6a0cccedce51677725a921c07dba6342beaf576f9a", size = 3019831, upload-time = "2024-10-16T11:19:57.762Z" }, - { url = "https://files.pythonhosted.org/packages/9e/2e/9beaea078095cc558f215e38f647c7114987d9febfc25cb2beed7c3582a5/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5a507320c58903967ef7384355a4da7ff3f28132d679aeb23572753cbf2ec10b", size = 2871822, upload-time = "2024-10-16T11:20:04.693Z" }, - { url = "https://files.pythonhosted.org/packages/01/9e/ef93c5d93f3dc9fc92786ffab39e323b9aed066ba59fdc34cf85e2722271/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d4fa1079cab9018f4d0bd2db307beaa612b0d13ba73b5c6304b9fe2fb441ff7", size = 2820975, upload-time = "2024-10-16T11:20:11.401Z" }, - { url = "https://files.pythonhosted.org/packages/a5/f0/049e9631e3268fe4c5a387f6fc27e267ebe199acf1bc1bc9cbde4bd6916c/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:851485a42dbb0bdc1edcdabdb8557c09c9655dfa2ca0460ff210522e073e319e", size = 2919320, upload-time = "2024-10-16T11:20:17.959Z" }, - { url = "https://files.pythonhosted.org/packages/dc/9a/bcb8773b88e45fb5a5ea8339e2104d82c863a3b8558fbb2aadfe66df86b3/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:35958ec9e46432d9076286dda67942ed6d968b9c3a6a2fd62b48939d1d78bf68", size = 2957617, upload-time = "2024-10-16T11:20:24.711Z" }, - { url = "https://files.pythonhosted.org/packages/e2/6b/144336a9bf08a67d217b3af3246abb1d027095dab726f0687f01f43e8c03/psycopg2_binary-2.9.10-cp311-cp311-win32.whl", hash = "sha256:ecced182e935529727401b24d76634a357c71c9275b356efafd8a2a91ec07392", size = 1024618, upload-time = "2024-10-16T11:20:27.718Z" }, - { url = "https://files.pythonhosted.org/packages/61/69/3b3d7bd583c6d3cbe5100802efa5beacaacc86e37b653fc708bf3d6853b8/psycopg2_binary-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:ee0e8c683a7ff25d23b55b11161c2663d4b099770f6085ff0a20d4505778d6b4", size = 1163816, upload-time = "2024-10-16T11:20:30.777Z" }, - { url = "https://files.pythonhosted.org/packages/49/7d/465cc9795cf76f6d329efdafca74693714556ea3891813701ac1fee87545/psycopg2_binary-2.9.10-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0", size = 3044771, upload-time = "2024-10-16T11:20:35.234Z" }, - { url = "https://files.pythonhosted.org/packages/8b/31/6d225b7b641a1a2148e3ed65e1aa74fc86ba3fee850545e27be9e1de893d/psycopg2_binary-2.9.10-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a", size = 3275336, upload-time = "2024-10-16T11:20:38.742Z" }, - { url = "https://files.pythonhosted.org/packages/30/b7/a68c2b4bff1cbb1728e3ec864b2d92327c77ad52edcd27922535a8366f68/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539", size = 2851637, upload-time = "2024-10-16T11:20:42.145Z" }, - { url = "https://files.pythonhosted.org/packages/0b/b1/cfedc0e0e6f9ad61f8657fd173b2f831ce261c02a08c0b09c652b127d813/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526", size = 3082097, upload-time = "2024-10-16T11:20:46.185Z" }, - { url = "https://files.pythonhosted.org/packages/18/ed/0a8e4153c9b769f59c02fb5e7914f20f0b2483a19dae7bf2db54b743d0d0/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1", size = 3264776, upload-time = "2024-10-16T11:20:50.879Z" }, - { url = "https://files.pythonhosted.org/packages/10/db/d09da68c6a0cdab41566b74e0a6068a425f077169bed0946559b7348ebe9/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e", size = 3020968, upload-time = "2024-10-16T11:20:56.819Z" }, - { url = "https://files.pythonhosted.org/packages/94/28/4d6f8c255f0dfffb410db2b3f9ac5218d959a66c715c34cac31081e19b95/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f", size = 2872334, upload-time = "2024-10-16T11:21:02.411Z" }, - { url = "https://files.pythonhosted.org/packages/05/f7/20d7bf796593c4fea95e12119d6cc384ff1f6141a24fbb7df5a668d29d29/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00", size = 2822722, upload-time = "2024-10-16T11:21:09.01Z" }, - { url = "https://files.pythonhosted.org/packages/4d/e4/0c407ae919ef626dbdb32835a03b6737013c3cc7240169843965cada2bdf/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5", size = 2920132, upload-time = "2024-10-16T11:21:16.339Z" }, - { url = "https://files.pythonhosted.org/packages/2d/70/aa69c9f69cf09a01da224909ff6ce8b68faeef476f00f7ec377e8f03be70/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47", size = 2959312, upload-time = "2024-10-16T11:21:25.584Z" }, - { url = "https://files.pythonhosted.org/packages/d3/bd/213e59854fafe87ba47814bf413ace0dcee33a89c8c8c814faca6bc7cf3c/psycopg2_binary-2.9.10-cp312-cp312-win32.whl", hash = "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64", size = 1025191, upload-time = "2024-10-16T11:21:29.912Z" }, - { url = "https://files.pythonhosted.org/packages/92/29/06261ea000e2dc1e22907dbbc483a1093665509ea586b29b8986a0e56733/psycopg2_binary-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0", size = 1164031, upload-time = "2024-10-16T11:21:34.211Z" }, - { url = "https://files.pythonhosted.org/packages/3e/30/d41d3ba765609c0763505d565c4d12d8f3c79793f0d0f044ff5a28bf395b/psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d", size = 3044699, upload-time = "2024-10-16T11:21:42.841Z" }, - { url = "https://files.pythonhosted.org/packages/35/44/257ddadec7ef04536ba71af6bc6a75ec05c5343004a7ec93006bee66c0bc/psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb", size = 3275245, upload-time = "2024-10-16T11:21:51.989Z" }, - { url = "https://files.pythonhosted.org/packages/1b/11/48ea1cd11de67f9efd7262085588790a95d9dfcd9b8a687d46caf7305c1a/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7", size = 2851631, upload-time = "2024-10-16T11:21:57.584Z" }, - { url = "https://files.pythonhosted.org/packages/62/e0/62ce5ee650e6c86719d621a761fe4bc846ab9eff8c1f12b1ed5741bf1c9b/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d", size = 3082140, upload-time = "2024-10-16T11:22:02.005Z" }, - { url = "https://files.pythonhosted.org/packages/27/ce/63f946c098611f7be234c0dd7cb1ad68b0b5744d34f68062bb3c5aa510c8/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73", size = 3264762, upload-time = "2024-10-16T11:22:06.412Z" }, - { url = "https://files.pythonhosted.org/packages/43/25/c603cd81402e69edf7daa59b1602bd41eb9859e2824b8c0855d748366ac9/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673", size = 3020967, upload-time = "2024-10-16T11:22:11.583Z" }, - { url = "https://files.pythonhosted.org/packages/5f/d6/8708d8c6fca531057fa170cdde8df870e8b6a9b136e82b361c65e42b841e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f", size = 2872326, upload-time = "2024-10-16T11:22:16.406Z" }, - { url = "https://files.pythonhosted.org/packages/ce/ac/5b1ea50fc08a9df82de7e1771537557f07c2632231bbab652c7e22597908/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909", size = 2822712, upload-time = "2024-10-16T11:22:21.366Z" }, - { url = "https://files.pythonhosted.org/packages/c4/fc/504d4503b2abc4570fac3ca56eb8fed5e437bf9c9ef13f36b6621db8ef00/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1", size = 2920155, upload-time = "2024-10-16T11:22:25.684Z" }, - { url = "https://files.pythonhosted.org/packages/b2/d1/323581e9273ad2c0dbd1902f3fb50c441da86e894b6e25a73c3fda32c57e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567", size = 2959356, upload-time = "2024-10-16T11:22:30.562Z" }, - { url = "https://files.pythonhosted.org/packages/08/50/d13ea0a054189ae1bc21af1d85b6f8bb9bbc5572991055d70ad9006fe2d6/psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142", size = 2569224, upload-time = "2025-01-04T20:09:19.234Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/cb/0e/bdc8274dc0585090b4e3432267d7be4dfbfd8971c0fa59167c711105a6bf/psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2", size = 385764, upload_time = "2024-10-16T11:24:58.126Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/8f/9feb01291d0d7a0a4c6a6bab24094135c2b59c6a81943752f632c75896d6/psycopg2_binary-2.9.10-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff", size = 3043397, upload_time = "2024-10-16T11:19:40.033Z" }, + { url = "https://files.pythonhosted.org/packages/15/30/346e4683532011561cd9c8dfeac6a8153dd96452fee0b12666058ab7893c/psycopg2_binary-2.9.10-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1a6784f0ce3fec4edc64e985865c17778514325074adf5ad8f80636cd029ef7c", size = 3274806, upload_time = "2024-10-16T11:19:43.5Z" }, + { url = "https://files.pythonhosted.org/packages/66/6e/4efebe76f76aee7ec99166b6c023ff8abdc4e183f7b70913d7c047701b79/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f86c56eeb91dc3135b3fd8a95dc7ae14c538a2f3ad77a19645cf55bab1799c", size = 2851370, upload_time = "2024-10-16T11:19:46.986Z" }, + { url = "https://files.pythonhosted.org/packages/7f/fd/ff83313f86b50f7ca089b161b8e0a22bb3c319974096093cd50680433fdb/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b3d2491d4d78b6b14f76881905c7a8a8abcf974aad4a8a0b065273a0ed7a2cb", size = 3080780, upload_time = "2024-10-16T11:19:50.242Z" }, + { url = "https://files.pythonhosted.org/packages/e6/c4/bfadd202dcda8333a7ccafdc51c541dbdfce7c2c7cda89fa2374455d795f/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2286791ececda3a723d1910441c793be44625d86d1a4e79942751197f4d30341", size = 3264583, upload_time = "2024-10-16T11:19:54.424Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f1/09f45ac25e704ac954862581f9f9ae21303cc5ded3d0b775532b407f0e90/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:512d29bb12608891e349af6a0cccedce51677725a921c07dba6342beaf576f9a", size = 3019831, upload_time = "2024-10-16T11:19:57.762Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2e/9beaea078095cc558f215e38f647c7114987d9febfc25cb2beed7c3582a5/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5a507320c58903967ef7384355a4da7ff3f28132d679aeb23572753cbf2ec10b", size = 2871822, upload_time = "2024-10-16T11:20:04.693Z" }, + { url = "https://files.pythonhosted.org/packages/01/9e/ef93c5d93f3dc9fc92786ffab39e323b9aed066ba59fdc34cf85e2722271/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d4fa1079cab9018f4d0bd2db307beaa612b0d13ba73b5c6304b9fe2fb441ff7", size = 2820975, upload_time = "2024-10-16T11:20:11.401Z" }, + { url = "https://files.pythonhosted.org/packages/a5/f0/049e9631e3268fe4c5a387f6fc27e267ebe199acf1bc1bc9cbde4bd6916c/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:851485a42dbb0bdc1edcdabdb8557c09c9655dfa2ca0460ff210522e073e319e", size = 2919320, upload_time = "2024-10-16T11:20:17.959Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9a/bcb8773b88e45fb5a5ea8339e2104d82c863a3b8558fbb2aadfe66df86b3/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:35958ec9e46432d9076286dda67942ed6d968b9c3a6a2fd62b48939d1d78bf68", size = 2957617, upload_time = "2024-10-16T11:20:24.711Z" }, + { url = "https://files.pythonhosted.org/packages/e2/6b/144336a9bf08a67d217b3af3246abb1d027095dab726f0687f01f43e8c03/psycopg2_binary-2.9.10-cp311-cp311-win32.whl", hash = "sha256:ecced182e935529727401b24d76634a357c71c9275b356efafd8a2a91ec07392", size = 1024618, upload_time = "2024-10-16T11:20:27.718Z" }, + { url = "https://files.pythonhosted.org/packages/61/69/3b3d7bd583c6d3cbe5100802efa5beacaacc86e37b653fc708bf3d6853b8/psycopg2_binary-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:ee0e8c683a7ff25d23b55b11161c2663d4b099770f6085ff0a20d4505778d6b4", size = 1163816, upload_time = "2024-10-16T11:20:30.777Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/465cc9795cf76f6d329efdafca74693714556ea3891813701ac1fee87545/psycopg2_binary-2.9.10-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0", size = 3044771, upload_time = "2024-10-16T11:20:35.234Z" }, + { url = "https://files.pythonhosted.org/packages/8b/31/6d225b7b641a1a2148e3ed65e1aa74fc86ba3fee850545e27be9e1de893d/psycopg2_binary-2.9.10-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a", size = 3275336, upload_time = "2024-10-16T11:20:38.742Z" }, + { url = "https://files.pythonhosted.org/packages/30/b7/a68c2b4bff1cbb1728e3ec864b2d92327c77ad52edcd27922535a8366f68/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539", size = 2851637, upload_time = "2024-10-16T11:20:42.145Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b1/cfedc0e0e6f9ad61f8657fd173b2f831ce261c02a08c0b09c652b127d813/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526", size = 3082097, upload_time = "2024-10-16T11:20:46.185Z" }, + { url = "https://files.pythonhosted.org/packages/18/ed/0a8e4153c9b769f59c02fb5e7914f20f0b2483a19dae7bf2db54b743d0d0/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1", size = 3264776, upload_time = "2024-10-16T11:20:50.879Z" }, + { url = "https://files.pythonhosted.org/packages/10/db/d09da68c6a0cdab41566b74e0a6068a425f077169bed0946559b7348ebe9/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e", size = 3020968, upload_time = "2024-10-16T11:20:56.819Z" }, + { url = "https://files.pythonhosted.org/packages/94/28/4d6f8c255f0dfffb410db2b3f9ac5218d959a66c715c34cac31081e19b95/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f", size = 2872334, upload_time = "2024-10-16T11:21:02.411Z" }, + { url = "https://files.pythonhosted.org/packages/05/f7/20d7bf796593c4fea95e12119d6cc384ff1f6141a24fbb7df5a668d29d29/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00", size = 2822722, upload_time = "2024-10-16T11:21:09.01Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e4/0c407ae919ef626dbdb32835a03b6737013c3cc7240169843965cada2bdf/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5", size = 2920132, upload_time = "2024-10-16T11:21:16.339Z" }, + { url = "https://files.pythonhosted.org/packages/2d/70/aa69c9f69cf09a01da224909ff6ce8b68faeef476f00f7ec377e8f03be70/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47", size = 2959312, upload_time = "2024-10-16T11:21:25.584Z" }, + { url = "https://files.pythonhosted.org/packages/d3/bd/213e59854fafe87ba47814bf413ace0dcee33a89c8c8c814faca6bc7cf3c/psycopg2_binary-2.9.10-cp312-cp312-win32.whl", hash = "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64", size = 1025191, upload_time = "2024-10-16T11:21:29.912Z" }, + { url = "https://files.pythonhosted.org/packages/92/29/06261ea000e2dc1e22907dbbc483a1093665509ea586b29b8986a0e56733/psycopg2_binary-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0", size = 1164031, upload_time = "2024-10-16T11:21:34.211Z" }, + { url = "https://files.pythonhosted.org/packages/3e/30/d41d3ba765609c0763505d565c4d12d8f3c79793f0d0f044ff5a28bf395b/psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d", size = 3044699, upload_time = "2024-10-16T11:21:42.841Z" }, + { url = "https://files.pythonhosted.org/packages/35/44/257ddadec7ef04536ba71af6bc6a75ec05c5343004a7ec93006bee66c0bc/psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb", size = 3275245, upload_time = "2024-10-16T11:21:51.989Z" }, + { url = "https://files.pythonhosted.org/packages/1b/11/48ea1cd11de67f9efd7262085588790a95d9dfcd9b8a687d46caf7305c1a/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7", size = 2851631, upload_time = "2024-10-16T11:21:57.584Z" }, + { url = "https://files.pythonhosted.org/packages/62/e0/62ce5ee650e6c86719d621a761fe4bc846ab9eff8c1f12b1ed5741bf1c9b/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d", size = 3082140, upload_time = "2024-10-16T11:22:02.005Z" }, + { url = "https://files.pythonhosted.org/packages/27/ce/63f946c098611f7be234c0dd7cb1ad68b0b5744d34f68062bb3c5aa510c8/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73", size = 3264762, upload_time = "2024-10-16T11:22:06.412Z" }, + { url = "https://files.pythonhosted.org/packages/43/25/c603cd81402e69edf7daa59b1602bd41eb9859e2824b8c0855d748366ac9/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673", size = 3020967, upload_time = "2024-10-16T11:22:11.583Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d6/8708d8c6fca531057fa170cdde8df870e8b6a9b136e82b361c65e42b841e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f", size = 2872326, upload_time = "2024-10-16T11:22:16.406Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ac/5b1ea50fc08a9df82de7e1771537557f07c2632231bbab652c7e22597908/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909", size = 2822712, upload_time = "2024-10-16T11:22:21.366Z" }, + { url = "https://files.pythonhosted.org/packages/c4/fc/504d4503b2abc4570fac3ca56eb8fed5e437bf9c9ef13f36b6621db8ef00/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1", size = 2920155, upload_time = "2024-10-16T11:22:25.684Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d1/323581e9273ad2c0dbd1902f3fb50c441da86e894b6e25a73c3fda32c57e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567", size = 2959356, upload_time = "2024-10-16T11:22:30.562Z" }, + { url = "https://files.pythonhosted.org/packages/08/50/d13ea0a054189ae1bc21af1d85b6f8bb9bbc5572991055d70ad9006fe2d6/psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142", size = 2569224, upload_time = "2025-01-04T20:09:19.234Z" }, ] [[package]] name = "pyarrow" version = "20.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187, upload-time = "2025-04-27T12:34:23.264Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/a2/b7930824181ceadd0c63c1042d01fa4ef63eee233934826a7a2a9af6e463/pyarrow-20.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:24ca380585444cb2a31324c546a9a56abbe87e26069189e14bdba19c86c049f0", size = 30856035, upload-time = "2025-04-27T12:28:40.78Z" }, - { url = "https://files.pythonhosted.org/packages/9b/18/c765770227d7f5bdfa8a69f64b49194352325c66a5c3bb5e332dfd5867d9/pyarrow-20.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:95b330059ddfdc591a3225f2d272123be26c8fa76e8c9ee1a77aad507361cfdb", size = 32309552, upload-time = "2025-04-27T12:28:47.051Z" }, - { url = "https://files.pythonhosted.org/packages/44/fb/dfb2dfdd3e488bb14f822d7335653092dde150cffc2da97de6e7500681f9/pyarrow-20.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f0fb1041267e9968c6d0d2ce3ff92e3928b243e2b6d11eeb84d9ac547308232", size = 41334704, upload-time = "2025-04-27T12:28:55.064Z" }, - { url = "https://files.pythonhosted.org/packages/58/0d/08a95878d38808051a953e887332d4a76bc06c6ee04351918ee1155407eb/pyarrow-20.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8ff87cc837601532cc8242d2f7e09b4e02404de1b797aee747dd4ba4bd6313f", size = 42399836, upload-time = "2025-04-27T12:29:02.13Z" }, - { url = "https://files.pythonhosted.org/packages/f3/cd/efa271234dfe38f0271561086eedcad7bc0f2ddd1efba423916ff0883684/pyarrow-20.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:7a3a5dcf54286e6141d5114522cf31dd67a9e7c9133d150799f30ee302a7a1ab", size = 40711789, upload-time = "2025-04-27T12:29:09.951Z" }, - { url = "https://files.pythonhosted.org/packages/46/1f/7f02009bc7fc8955c391defee5348f510e589a020e4b40ca05edcb847854/pyarrow-20.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a6ad3e7758ecf559900261a4df985662df54fb7fdb55e8e3b3aa99b23d526b62", size = 42301124, upload-time = "2025-04-27T12:29:17.187Z" }, - { url = "https://files.pythonhosted.org/packages/4f/92/692c562be4504c262089e86757a9048739fe1acb4024f92d39615e7bab3f/pyarrow-20.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6bb830757103a6cb300a04610e08d9636f0cd223d32f388418ea893a3e655f1c", size = 42916060, upload-time = "2025-04-27T12:29:24.253Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ec/9f5c7e7c828d8e0a3c7ef50ee62eca38a7de2fa6eb1b8fa43685c9414fef/pyarrow-20.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:96e37f0766ecb4514a899d9a3554fadda770fb57ddf42b63d80f14bc20aa7db3", size = 44547640, upload-time = "2025-04-27T12:29:32.782Z" }, - { url = "https://files.pythonhosted.org/packages/54/96/46613131b4727f10fd2ffa6d0d6f02efcc09a0e7374eff3b5771548aa95b/pyarrow-20.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3346babb516f4b6fd790da99b98bed9708e3f02e734c84971faccb20736848dc", size = 25781491, upload-time = "2025-04-27T12:29:38.464Z" }, - { url = "https://files.pythonhosted.org/packages/a1/d6/0c10e0d54f6c13eb464ee9b67a68b8c71bcf2f67760ef5b6fbcddd2ab05f/pyarrow-20.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:75a51a5b0eef32727a247707d4755322cb970be7e935172b6a3a9f9ae98404ba", size = 30815067, upload-time = "2025-04-27T12:29:44.384Z" }, - { url = "https://files.pythonhosted.org/packages/7e/e2/04e9874abe4094a06fd8b0cbb0f1312d8dd7d707f144c2ec1e5e8f452ffa/pyarrow-20.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:211d5e84cecc640c7a3ab900f930aaff5cd2702177e0d562d426fb7c4f737781", size = 32297128, upload-time = "2025-04-27T12:29:52.038Z" }, - { url = "https://files.pythonhosted.org/packages/31/fd/c565e5dcc906a3b471a83273039cb75cb79aad4a2d4a12f76cc5ae90a4b8/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba3cf4182828be7a896cbd232aa8dd6a31bd1f9e32776cc3796c012855e1199", size = 41334890, upload-time = "2025-04-27T12:29:59.452Z" }, - { url = "https://files.pythonhosted.org/packages/af/a9/3bdd799e2c9b20c1ea6dc6fa8e83f29480a97711cf806e823f808c2316ac/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c3a01f313ffe27ac4126f4c2e5ea0f36a5fc6ab51f8726cf41fee4b256680bd", size = 42421775, upload-time = "2025-04-27T12:30:06.875Z" }, - { url = "https://files.pythonhosted.org/packages/10/f7/da98ccd86354c332f593218101ae56568d5dcedb460e342000bd89c49cc1/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a2791f69ad72addd33510fec7bb14ee06c2a448e06b649e264c094c5b5f7ce28", size = 40687231, upload-time = "2025-04-27T12:30:13.954Z" }, - { url = "https://files.pythonhosted.org/packages/bb/1b/2168d6050e52ff1e6cefc61d600723870bf569cbf41d13db939c8cf97a16/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4250e28a22302ce8692d3a0e8ec9d9dde54ec00d237cff4dfa9c1fbf79e472a8", size = 42295639, upload-time = "2025-04-27T12:30:21.949Z" }, - { url = "https://files.pythonhosted.org/packages/b2/66/2d976c0c7158fd25591c8ca55aee026e6d5745a021915a1835578707feb3/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:89e030dc58fc760e4010148e6ff164d2f44441490280ef1e97a542375e41058e", size = 42908549, upload-time = "2025-04-27T12:30:29.551Z" }, - { url = "https://files.pythonhosted.org/packages/31/a9/dfb999c2fc6911201dcbf348247f9cc382a8990f9ab45c12eabfd7243a38/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6102b4864d77102dbbb72965618e204e550135a940c2534711d5ffa787df2a5a", size = 44557216, upload-time = "2025-04-27T12:30:36.977Z" }, - { url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b", size = 25660496, upload-time = "2025-04-27T12:30:42.809Z" }, - { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501, upload-time = "2025-04-27T12:30:48.351Z" }, - { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895, upload-time = "2025-04-27T12:30:55.238Z" }, - { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322, upload-time = "2025-04-27T12:31:05.587Z" }, - { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441, upload-time = "2025-04-27T12:31:15.675Z" }, - { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027, upload-time = "2025-04-27T12:31:24.631Z" }, - { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473, upload-time = "2025-04-27T12:31:31.311Z" }, - { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897, upload-time = "2025-04-27T12:31:39.406Z" }, - { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847, upload-time = "2025-04-27T12:31:45.997Z" }, - { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219, upload-time = "2025-04-27T12:31:54.11Z" }, - { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957, upload-time = "2025-04-27T12:31:59.215Z" }, - { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972, upload-time = "2025-04-27T12:32:05.369Z" }, - { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434, upload-time = "2025-04-27T12:32:11.814Z" }, - { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648, upload-time = "2025-04-27T12:32:20.766Z" }, - { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853, upload-time = "2025-04-27T12:32:28.1Z" }, - { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743, upload-time = "2025-04-27T12:32:35.792Z" }, - { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441, upload-time = "2025-04-27T12:32:46.64Z" }, - { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279, upload-time = "2025-04-27T12:32:56.503Z" }, - { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982, upload-time = "2025-04-27T12:33:04.72Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187, upload_time = "2025-04-27T12:34:23.264Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/a2/b7930824181ceadd0c63c1042d01fa4ef63eee233934826a7a2a9af6e463/pyarrow-20.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:24ca380585444cb2a31324c546a9a56abbe87e26069189e14bdba19c86c049f0", size = 30856035, upload_time = "2025-04-27T12:28:40.78Z" }, + { url = "https://files.pythonhosted.org/packages/9b/18/c765770227d7f5bdfa8a69f64b49194352325c66a5c3bb5e332dfd5867d9/pyarrow-20.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:95b330059ddfdc591a3225f2d272123be26c8fa76e8c9ee1a77aad507361cfdb", size = 32309552, upload_time = "2025-04-27T12:28:47.051Z" }, + { url = "https://files.pythonhosted.org/packages/44/fb/dfb2dfdd3e488bb14f822d7335653092dde150cffc2da97de6e7500681f9/pyarrow-20.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f0fb1041267e9968c6d0d2ce3ff92e3928b243e2b6d11eeb84d9ac547308232", size = 41334704, upload_time = "2025-04-27T12:28:55.064Z" }, + { url = "https://files.pythonhosted.org/packages/58/0d/08a95878d38808051a953e887332d4a76bc06c6ee04351918ee1155407eb/pyarrow-20.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8ff87cc837601532cc8242d2f7e09b4e02404de1b797aee747dd4ba4bd6313f", size = 42399836, upload_time = "2025-04-27T12:29:02.13Z" }, + { url = "https://files.pythonhosted.org/packages/f3/cd/efa271234dfe38f0271561086eedcad7bc0f2ddd1efba423916ff0883684/pyarrow-20.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:7a3a5dcf54286e6141d5114522cf31dd67a9e7c9133d150799f30ee302a7a1ab", size = 40711789, upload_time = "2025-04-27T12:29:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/46/1f/7f02009bc7fc8955c391defee5348f510e589a020e4b40ca05edcb847854/pyarrow-20.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a6ad3e7758ecf559900261a4df985662df54fb7fdb55e8e3b3aa99b23d526b62", size = 42301124, upload_time = "2025-04-27T12:29:17.187Z" }, + { url = "https://files.pythonhosted.org/packages/4f/92/692c562be4504c262089e86757a9048739fe1acb4024f92d39615e7bab3f/pyarrow-20.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6bb830757103a6cb300a04610e08d9636f0cd223d32f388418ea893a3e655f1c", size = 42916060, upload_time = "2025-04-27T12:29:24.253Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ec/9f5c7e7c828d8e0a3c7ef50ee62eca38a7de2fa6eb1b8fa43685c9414fef/pyarrow-20.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:96e37f0766ecb4514a899d9a3554fadda770fb57ddf42b63d80f14bc20aa7db3", size = 44547640, upload_time = "2025-04-27T12:29:32.782Z" }, + { url = "https://files.pythonhosted.org/packages/54/96/46613131b4727f10fd2ffa6d0d6f02efcc09a0e7374eff3b5771548aa95b/pyarrow-20.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3346babb516f4b6fd790da99b98bed9708e3f02e734c84971faccb20736848dc", size = 25781491, upload_time = "2025-04-27T12:29:38.464Z" }, + { url = "https://files.pythonhosted.org/packages/a1/d6/0c10e0d54f6c13eb464ee9b67a68b8c71bcf2f67760ef5b6fbcddd2ab05f/pyarrow-20.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:75a51a5b0eef32727a247707d4755322cb970be7e935172b6a3a9f9ae98404ba", size = 30815067, upload_time = "2025-04-27T12:29:44.384Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e2/04e9874abe4094a06fd8b0cbb0f1312d8dd7d707f144c2ec1e5e8f452ffa/pyarrow-20.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:211d5e84cecc640c7a3ab900f930aaff5cd2702177e0d562d426fb7c4f737781", size = 32297128, upload_time = "2025-04-27T12:29:52.038Z" }, + { url = "https://files.pythonhosted.org/packages/31/fd/c565e5dcc906a3b471a83273039cb75cb79aad4a2d4a12f76cc5ae90a4b8/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba3cf4182828be7a896cbd232aa8dd6a31bd1f9e32776cc3796c012855e1199", size = 41334890, upload_time = "2025-04-27T12:29:59.452Z" }, + { url = "https://files.pythonhosted.org/packages/af/a9/3bdd799e2c9b20c1ea6dc6fa8e83f29480a97711cf806e823f808c2316ac/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c3a01f313ffe27ac4126f4c2e5ea0f36a5fc6ab51f8726cf41fee4b256680bd", size = 42421775, upload_time = "2025-04-27T12:30:06.875Z" }, + { url = "https://files.pythonhosted.org/packages/10/f7/da98ccd86354c332f593218101ae56568d5dcedb460e342000bd89c49cc1/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a2791f69ad72addd33510fec7bb14ee06c2a448e06b649e264c094c5b5f7ce28", size = 40687231, upload_time = "2025-04-27T12:30:13.954Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1b/2168d6050e52ff1e6cefc61d600723870bf569cbf41d13db939c8cf97a16/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4250e28a22302ce8692d3a0e8ec9d9dde54ec00d237cff4dfa9c1fbf79e472a8", size = 42295639, upload_time = "2025-04-27T12:30:21.949Z" }, + { url = "https://files.pythonhosted.org/packages/b2/66/2d976c0c7158fd25591c8ca55aee026e6d5745a021915a1835578707feb3/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:89e030dc58fc760e4010148e6ff164d2f44441490280ef1e97a542375e41058e", size = 42908549, upload_time = "2025-04-27T12:30:29.551Z" }, + { url = "https://files.pythonhosted.org/packages/31/a9/dfb999c2fc6911201dcbf348247f9cc382a8990f9ab45c12eabfd7243a38/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6102b4864d77102dbbb72965618e204e550135a940c2534711d5ffa787df2a5a", size = 44557216, upload_time = "2025-04-27T12:30:36.977Z" }, + { url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b", size = 25660496, upload_time = "2025-04-27T12:30:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501, upload_time = "2025-04-27T12:30:48.351Z" }, + { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895, upload_time = "2025-04-27T12:30:55.238Z" }, + { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322, upload_time = "2025-04-27T12:31:05.587Z" }, + { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441, upload_time = "2025-04-27T12:31:15.675Z" }, + { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027, upload_time = "2025-04-27T12:31:24.631Z" }, + { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473, upload_time = "2025-04-27T12:31:31.311Z" }, + { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897, upload_time = "2025-04-27T12:31:39.406Z" }, + { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847, upload_time = "2025-04-27T12:31:45.997Z" }, + { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219, upload_time = "2025-04-27T12:31:54.11Z" }, + { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957, upload_time = "2025-04-27T12:31:59.215Z" }, + { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972, upload_time = "2025-04-27T12:32:05.369Z" }, + { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434, upload_time = "2025-04-27T12:32:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648, upload_time = "2025-04-27T12:32:20.766Z" }, + { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853, upload_time = "2025-04-27T12:32:28.1Z" }, + { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743, upload_time = "2025-04-27T12:32:35.792Z" }, + { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441, upload_time = "2025-04-27T12:32:46.64Z" }, + { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279, upload_time = "2025-04-27T12:32:56.503Z" }, + { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982, upload_time = "2025-04-27T12:33:04.72Z" }, ] [[package]] name = "pyarrow-hotfix" version = "0.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d2/ed/c3e8677f7abf3981838c2af7b5ac03e3589b3ef94fcb31d575426abae904/pyarrow_hotfix-0.7.tar.gz", hash = "sha256:59399cd58bdd978b2e42816a4183a55c6472d4e33d183351b6069f11ed42661d", size = 9910, upload-time = "2025-04-25T10:17:06.247Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/ed/c3e8677f7abf3981838c2af7b5ac03e3589b3ef94fcb31d575426abae904/pyarrow_hotfix-0.7.tar.gz", hash = "sha256:59399cd58bdd978b2e42816a4183a55c6472d4e33d183351b6069f11ed42661d", size = 9910, upload_time = "2025-04-25T10:17:06.247Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/c3/94ade4906a2f88bc935772f59c934013b4205e773bcb4239db114a6da136/pyarrow_hotfix-0.7-py3-none-any.whl", hash = "sha256:3236f3b5f1260f0e2ac070a55c1a7b339c4bb7267839bd2015e283234e758100", size = 7923, upload-time = "2025-04-25T10:17:05.224Z" }, + { url = "https://files.pythonhosted.org/packages/2e/c3/94ade4906a2f88bc935772f59c934013b4205e773bcb4239db114a6da136/pyarrow_hotfix-0.7-py3-none-any.whl", hash = "sha256:3236f3b5f1260f0e2ac070a55c1a7b339c4bb7267839bd2015e283234e758100", size = 7923, upload_time = "2025-04-25T10:17:05.224Z" }, ] [[package]] name = "pyasn1" version = "0.6.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload-time = "2024-09-10T22:41:42.55Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload_time = "2024-09-10T22:41:42.55Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload-time = "2024-09-11T16:00:36.122Z" }, + { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload_time = "2024-09-11T16:00:36.122Z" }, ] [[package]] @@ -1634,9 +1634,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload_time = "2025-03-28T02:41:22.17Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload_time = "2025-03-28T02:41:19.028Z" }, ] [[package]] @@ -1649,9 +1649,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513, upload-time = "2025-04-08T13:27:06.399Z" } +sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513, upload_time = "2025-04-08T13:27:06.399Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591, upload-time = "2025-04-08T13:27:03.789Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591, upload_time = "2025-04-08T13:27:03.789Z" }, ] [[package]] @@ -1661,62 +1661,62 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395, upload-time = "2025-04-02T09:49:41.8Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/7f/c6298830cb780c46b4f46bb24298d01019ffa4d21769f39b908cd14bbd50/pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", size = 2044224, upload-time = "2025-04-02T09:47:04.199Z" }, - { url = "https://files.pythonhosted.org/packages/a8/65/6ab3a536776cad5343f625245bd38165d6663256ad43f3a200e5936afd6c/pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", size = 1858845, upload-time = "2025-04-02T09:47:05.686Z" }, - { url = "https://files.pythonhosted.org/packages/e9/15/9a22fd26ba5ee8c669d4b8c9c244238e940cd5d818649603ca81d1c69861/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", size = 1910029, upload-time = "2025-04-02T09:47:07.042Z" }, - { url = "https://files.pythonhosted.org/packages/d5/33/8cb1a62818974045086f55f604044bf35b9342900318f9a2a029a1bec460/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", size = 1997784, upload-time = "2025-04-02T09:47:08.63Z" }, - { url = "https://files.pythonhosted.org/packages/c0/ca/49958e4df7715c71773e1ea5be1c74544923d10319173264e6db122543f9/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", size = 2141075, upload-time = "2025-04-02T09:47:10.267Z" }, - { url = "https://files.pythonhosted.org/packages/7b/a6/0b3a167a9773c79ba834b959b4e18c3ae9216b8319bd8422792abc8a41b1/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", size = 2745849, upload-time = "2025-04-02T09:47:11.724Z" }, - { url = "https://files.pythonhosted.org/packages/0b/60/516484135173aa9e5861d7a0663dce82e4746d2e7f803627d8c25dfa5578/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", size = 2005794, upload-time = "2025-04-02T09:47:13.099Z" }, - { url = "https://files.pythonhosted.org/packages/86/70/05b1eb77459ad47de00cf78ee003016da0cedf8b9170260488d7c21e9181/pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", size = 2123237, upload-time = "2025-04-02T09:47:14.355Z" }, - { url = "https://files.pythonhosted.org/packages/c7/57/12667a1409c04ae7dc95d3b43158948eb0368e9c790be8b095cb60611459/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", size = 2086351, upload-time = "2025-04-02T09:47:15.676Z" }, - { url = "https://files.pythonhosted.org/packages/57/61/cc6d1d1c1664b58fdd6ecc64c84366c34ec9b606aeb66cafab6f4088974c/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", size = 2258914, upload-time = "2025-04-02T09:47:17Z" }, - { url = "https://files.pythonhosted.org/packages/d1/0a/edb137176a1f5419b2ddee8bde6a0a548cfa3c74f657f63e56232df8de88/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", size = 2257385, upload-time = "2025-04-02T09:47:18.631Z" }, - { url = "https://files.pythonhosted.org/packages/26/3c/48ca982d50e4b0e1d9954919c887bdc1c2b462801bf408613ccc641b3daa/pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", size = 1923765, upload-time = "2025-04-02T09:47:20.34Z" }, - { url = "https://files.pythonhosted.org/packages/33/cd/7ab70b99e5e21559f5de38a0928ea84e6f23fdef2b0d16a6feaf942b003c/pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", size = 1950688, upload-time = "2025-04-02T09:47:22.029Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ae/db1fc237b82e2cacd379f63e3335748ab88b5adde98bf7544a1b1bd10a84/pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", size = 1908185, upload-time = "2025-04-02T09:47:23.385Z" }, - { url = "https://files.pythonhosted.org/packages/c8/ce/3cb22b07c29938f97ff5f5bb27521f95e2ebec399b882392deb68d6c440e/pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", size = 2026640, upload-time = "2025-04-02T09:47:25.394Z" }, - { url = "https://files.pythonhosted.org/packages/19/78/f381d643b12378fee782a72126ec5d793081ef03791c28a0fd542a5bee64/pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", size = 1852649, upload-time = "2025-04-02T09:47:27.417Z" }, - { url = "https://files.pythonhosted.org/packages/9d/2b/98a37b80b15aac9eb2c6cfc6dbd35e5058a352891c5cce3a8472d77665a6/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", size = 1892472, upload-time = "2025-04-02T09:47:29.006Z" }, - { url = "https://files.pythonhosted.org/packages/4e/d4/3c59514e0f55a161004792b9ff3039da52448f43f5834f905abef9db6e4a/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", size = 1977509, upload-time = "2025-04-02T09:47:33.464Z" }, - { url = "https://files.pythonhosted.org/packages/a9/b6/c2c7946ef70576f79a25db59a576bce088bdc5952d1b93c9789b091df716/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", size = 2128702, upload-time = "2025-04-02T09:47:34.812Z" }, - { url = "https://files.pythonhosted.org/packages/88/fe/65a880f81e3f2a974312b61f82a03d85528f89a010ce21ad92f109d94deb/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", size = 2679428, upload-time = "2025-04-02T09:47:37.315Z" }, - { url = "https://files.pythonhosted.org/packages/6f/ff/4459e4146afd0462fb483bb98aa2436d69c484737feaceba1341615fb0ac/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", size = 2008753, upload-time = "2025-04-02T09:47:39.013Z" }, - { url = "https://files.pythonhosted.org/packages/7c/76/1c42e384e8d78452ededac8b583fe2550c84abfef83a0552e0e7478ccbc3/pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", size = 2114849, upload-time = "2025-04-02T09:47:40.427Z" }, - { url = "https://files.pythonhosted.org/packages/00/72/7d0cf05095c15f7ffe0eb78914b166d591c0eed72f294da68378da205101/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", size = 2069541, upload-time = "2025-04-02T09:47:42.01Z" }, - { url = "https://files.pythonhosted.org/packages/b3/69/94a514066bb7d8be499aa764926937409d2389c09be0b5107a970286ef81/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", size = 2239225, upload-time = "2025-04-02T09:47:43.425Z" }, - { url = "https://files.pythonhosted.org/packages/84/b0/e390071eadb44b41f4f54c3cef64d8bf5f9612c92686c9299eaa09e267e2/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", size = 2248373, upload-time = "2025-04-02T09:47:44.979Z" }, - { url = "https://files.pythonhosted.org/packages/d6/b2/288b3579ffc07e92af66e2f1a11be3b056fe1214aab314748461f21a31c3/pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", size = 1907034, upload-time = "2025-04-02T09:47:46.843Z" }, - { url = "https://files.pythonhosted.org/packages/02/28/58442ad1c22b5b6742b992ba9518420235adced665513868f99a1c2638a5/pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", size = 1956848, upload-time = "2025-04-02T09:47:48.404Z" }, - { url = "https://files.pythonhosted.org/packages/a1/eb/f54809b51c7e2a1d9f439f158b8dd94359321abcc98767e16fc48ae5a77e/pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", size = 1903986, upload-time = "2025-04-02T09:47:49.839Z" }, - { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551, upload-time = "2025-04-02T09:47:51.648Z" }, - { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785, upload-time = "2025-04-02T09:47:53.149Z" }, - { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758, upload-time = "2025-04-02T09:47:55.006Z" }, - { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109, upload-time = "2025-04-02T09:47:56.532Z" }, - { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159, upload-time = "2025-04-02T09:47:58.088Z" }, - { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222, upload-time = "2025-04-02T09:47:59.591Z" }, - { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980, upload-time = "2025-04-02T09:48:01.397Z" }, - { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840, upload-time = "2025-04-02T09:48:03.056Z" }, - { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518, upload-time = "2025-04-02T09:48:04.662Z" }, - { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025, upload-time = "2025-04-02T09:48:06.226Z" }, - { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991, upload-time = "2025-04-02T09:48:08.114Z" }, - { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262, upload-time = "2025-04-02T09:48:09.708Z" }, - { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626, upload-time = "2025-04-02T09:48:11.288Z" }, - { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590, upload-time = "2025-04-02T09:48:12.861Z" }, - { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963, upload-time = "2025-04-02T09:48:14.553Z" }, - { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896, upload-time = "2025-04-02T09:48:16.222Z" }, - { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810, upload-time = "2025-04-02T09:48:17.97Z" }, - { url = "https://files.pythonhosted.org/packages/0b/76/1794e440c1801ed35415238d2c728f26cd12695df9057154ad768b7b991c/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", size = 2042858, upload-time = "2025-04-02T09:49:03.419Z" }, - { url = "https://files.pythonhosted.org/packages/73/b4/9cd7b081fb0b1b4f8150507cd59d27b275c3e22ad60b35cb19ea0977d9b9/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", size = 1873745, upload-time = "2025-04-02T09:49:05.391Z" }, - { url = "https://files.pythonhosted.org/packages/e1/d7/9ddb7575d4321e40d0363903c2576c8c0c3280ebea137777e5ab58d723e3/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", size = 1904188, upload-time = "2025-04-02T09:49:07.352Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a8/3194ccfe461bb08da19377ebec8cb4f13c9bd82e13baebc53c5c7c39a029/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", size = 2083479, upload-time = "2025-04-02T09:49:09.304Z" }, - { url = "https://files.pythonhosted.org/packages/42/c7/84cb569555d7179ca0b3f838cef08f66f7089b54432f5b8599aac6e9533e/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", size = 2118415, upload-time = "2025-04-02T09:49:11.25Z" }, - { url = "https://files.pythonhosted.org/packages/3b/67/72abb8c73e0837716afbb58a59cc9e3ae43d1aa8677f3b4bc72c16142716/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", size = 2079623, upload-time = "2025-04-02T09:49:13.292Z" }, - { url = "https://files.pythonhosted.org/packages/0b/cd/c59707e35a47ba4cbbf153c3f7c56420c58653b5801b055dc52cccc8e2dc/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", size = 2250175, upload-time = "2025-04-02T09:49:15.597Z" }, - { url = "https://files.pythonhosted.org/packages/84/32/e4325a6676b0bed32d5b084566ec86ed7fd1e9bcbfc49c578b1755bde920/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", size = 2254674, upload-time = "2025-04-02T09:49:17.61Z" }, - { url = "https://files.pythonhosted.org/packages/12/6f/5596dc418f2e292ffc661d21931ab34591952e2843e7168ea5a52591f6ff/pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", size = 2080951, upload-time = "2025-04-02T09:49:19.559Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395, upload_time = "2025-04-02T09:49:41.8Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/7f/c6298830cb780c46b4f46bb24298d01019ffa4d21769f39b908cd14bbd50/pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", size = 2044224, upload_time = "2025-04-02T09:47:04.199Z" }, + { url = "https://files.pythonhosted.org/packages/a8/65/6ab3a536776cad5343f625245bd38165d6663256ad43f3a200e5936afd6c/pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", size = 1858845, upload_time = "2025-04-02T09:47:05.686Z" }, + { url = "https://files.pythonhosted.org/packages/e9/15/9a22fd26ba5ee8c669d4b8c9c244238e940cd5d818649603ca81d1c69861/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", size = 1910029, upload_time = "2025-04-02T09:47:07.042Z" }, + { url = "https://files.pythonhosted.org/packages/d5/33/8cb1a62818974045086f55f604044bf35b9342900318f9a2a029a1bec460/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", size = 1997784, upload_time = "2025-04-02T09:47:08.63Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ca/49958e4df7715c71773e1ea5be1c74544923d10319173264e6db122543f9/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", size = 2141075, upload_time = "2025-04-02T09:47:10.267Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a6/0b3a167a9773c79ba834b959b4e18c3ae9216b8319bd8422792abc8a41b1/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", size = 2745849, upload_time = "2025-04-02T09:47:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/0b/60/516484135173aa9e5861d7a0663dce82e4746d2e7f803627d8c25dfa5578/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", size = 2005794, upload_time = "2025-04-02T09:47:13.099Z" }, + { url = "https://files.pythonhosted.org/packages/86/70/05b1eb77459ad47de00cf78ee003016da0cedf8b9170260488d7c21e9181/pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", size = 2123237, upload_time = "2025-04-02T09:47:14.355Z" }, + { url = "https://files.pythonhosted.org/packages/c7/57/12667a1409c04ae7dc95d3b43158948eb0368e9c790be8b095cb60611459/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", size = 2086351, upload_time = "2025-04-02T09:47:15.676Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/cc6d1d1c1664b58fdd6ecc64c84366c34ec9b606aeb66cafab6f4088974c/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", size = 2258914, upload_time = "2025-04-02T09:47:17Z" }, + { url = "https://files.pythonhosted.org/packages/d1/0a/edb137176a1f5419b2ddee8bde6a0a548cfa3c74f657f63e56232df8de88/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", size = 2257385, upload_time = "2025-04-02T09:47:18.631Z" }, + { url = "https://files.pythonhosted.org/packages/26/3c/48ca982d50e4b0e1d9954919c887bdc1c2b462801bf408613ccc641b3daa/pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", size = 1923765, upload_time = "2025-04-02T09:47:20.34Z" }, + { url = "https://files.pythonhosted.org/packages/33/cd/7ab70b99e5e21559f5de38a0928ea84e6f23fdef2b0d16a6feaf942b003c/pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", size = 1950688, upload_time = "2025-04-02T09:47:22.029Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ae/db1fc237b82e2cacd379f63e3335748ab88b5adde98bf7544a1b1bd10a84/pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", size = 1908185, upload_time = "2025-04-02T09:47:23.385Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ce/3cb22b07c29938f97ff5f5bb27521f95e2ebec399b882392deb68d6c440e/pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", size = 2026640, upload_time = "2025-04-02T09:47:25.394Z" }, + { url = "https://files.pythonhosted.org/packages/19/78/f381d643b12378fee782a72126ec5d793081ef03791c28a0fd542a5bee64/pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", size = 1852649, upload_time = "2025-04-02T09:47:27.417Z" }, + { url = "https://files.pythonhosted.org/packages/9d/2b/98a37b80b15aac9eb2c6cfc6dbd35e5058a352891c5cce3a8472d77665a6/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", size = 1892472, upload_time = "2025-04-02T09:47:29.006Z" }, + { url = "https://files.pythonhosted.org/packages/4e/d4/3c59514e0f55a161004792b9ff3039da52448f43f5834f905abef9db6e4a/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", size = 1977509, upload_time = "2025-04-02T09:47:33.464Z" }, + { url = "https://files.pythonhosted.org/packages/a9/b6/c2c7946ef70576f79a25db59a576bce088bdc5952d1b93c9789b091df716/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", size = 2128702, upload_time = "2025-04-02T09:47:34.812Z" }, + { url = "https://files.pythonhosted.org/packages/88/fe/65a880f81e3f2a974312b61f82a03d85528f89a010ce21ad92f109d94deb/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", size = 2679428, upload_time = "2025-04-02T09:47:37.315Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ff/4459e4146afd0462fb483bb98aa2436d69c484737feaceba1341615fb0ac/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", size = 2008753, upload_time = "2025-04-02T09:47:39.013Z" }, + { url = "https://files.pythonhosted.org/packages/7c/76/1c42e384e8d78452ededac8b583fe2550c84abfef83a0552e0e7478ccbc3/pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", size = 2114849, upload_time = "2025-04-02T09:47:40.427Z" }, + { url = "https://files.pythonhosted.org/packages/00/72/7d0cf05095c15f7ffe0eb78914b166d591c0eed72f294da68378da205101/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", size = 2069541, upload_time = "2025-04-02T09:47:42.01Z" }, + { url = "https://files.pythonhosted.org/packages/b3/69/94a514066bb7d8be499aa764926937409d2389c09be0b5107a970286ef81/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", size = 2239225, upload_time = "2025-04-02T09:47:43.425Z" }, + { url = "https://files.pythonhosted.org/packages/84/b0/e390071eadb44b41f4f54c3cef64d8bf5f9612c92686c9299eaa09e267e2/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", size = 2248373, upload_time = "2025-04-02T09:47:44.979Z" }, + { url = "https://files.pythonhosted.org/packages/d6/b2/288b3579ffc07e92af66e2f1a11be3b056fe1214aab314748461f21a31c3/pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", size = 1907034, upload_time = "2025-04-02T09:47:46.843Z" }, + { url = "https://files.pythonhosted.org/packages/02/28/58442ad1c22b5b6742b992ba9518420235adced665513868f99a1c2638a5/pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", size = 1956848, upload_time = "2025-04-02T09:47:48.404Z" }, + { url = "https://files.pythonhosted.org/packages/a1/eb/f54809b51c7e2a1d9f439f158b8dd94359321abcc98767e16fc48ae5a77e/pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", size = 1903986, upload_time = "2025-04-02T09:47:49.839Z" }, + { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551, upload_time = "2025-04-02T09:47:51.648Z" }, + { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785, upload_time = "2025-04-02T09:47:53.149Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758, upload_time = "2025-04-02T09:47:55.006Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109, upload_time = "2025-04-02T09:47:56.532Z" }, + { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159, upload_time = "2025-04-02T09:47:58.088Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222, upload_time = "2025-04-02T09:47:59.591Z" }, + { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980, upload_time = "2025-04-02T09:48:01.397Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840, upload_time = "2025-04-02T09:48:03.056Z" }, + { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518, upload_time = "2025-04-02T09:48:04.662Z" }, + { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025, upload_time = "2025-04-02T09:48:06.226Z" }, + { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991, upload_time = "2025-04-02T09:48:08.114Z" }, + { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262, upload_time = "2025-04-02T09:48:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626, upload_time = "2025-04-02T09:48:11.288Z" }, + { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590, upload_time = "2025-04-02T09:48:12.861Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963, upload_time = "2025-04-02T09:48:14.553Z" }, + { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896, upload_time = "2025-04-02T09:48:16.222Z" }, + { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810, upload_time = "2025-04-02T09:48:17.97Z" }, + { url = "https://files.pythonhosted.org/packages/0b/76/1794e440c1801ed35415238d2c728f26cd12695df9057154ad768b7b991c/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", size = 2042858, upload_time = "2025-04-02T09:49:03.419Z" }, + { url = "https://files.pythonhosted.org/packages/73/b4/9cd7b081fb0b1b4f8150507cd59d27b275c3e22ad60b35cb19ea0977d9b9/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", size = 1873745, upload_time = "2025-04-02T09:49:05.391Z" }, + { url = "https://files.pythonhosted.org/packages/e1/d7/9ddb7575d4321e40d0363903c2576c8c0c3280ebea137777e5ab58d723e3/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", size = 1904188, upload_time = "2025-04-02T09:49:07.352Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/3194ccfe461bb08da19377ebec8cb4f13c9bd82e13baebc53c5c7c39a029/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", size = 2083479, upload_time = "2025-04-02T09:49:09.304Z" }, + { url = "https://files.pythonhosted.org/packages/42/c7/84cb569555d7179ca0b3f838cef08f66f7089b54432f5b8599aac6e9533e/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", size = 2118415, upload_time = "2025-04-02T09:49:11.25Z" }, + { url = "https://files.pythonhosted.org/packages/3b/67/72abb8c73e0837716afbb58a59cc9e3ae43d1aa8677f3b4bc72c16142716/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", size = 2079623, upload_time = "2025-04-02T09:49:13.292Z" }, + { url = "https://files.pythonhosted.org/packages/0b/cd/c59707e35a47ba4cbbf153c3f7c56420c58653b5801b055dc52cccc8e2dc/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", size = 2250175, upload_time = "2025-04-02T09:49:15.597Z" }, + { url = "https://files.pythonhosted.org/packages/84/32/e4325a6676b0bed32d5b084566ec86ed7fd1e9bcbfc49c578b1755bde920/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", size = 2254674, upload_time = "2025-04-02T09:49:17.61Z" }, + { url = "https://files.pythonhosted.org/packages/12/6f/5596dc418f2e292ffc661d21931ab34591952e2843e7168ea5a52591f6ff/pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", size = 2080951, upload_time = "2025-04-02T09:49:19.559Z" }, ] [[package]] @@ -1726,36 +1726,36 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d2/a7/8faaa62a488a2a1e0d56969757f087cbd2729e9bcfa508c230299f366b4c/pyee-12.0.0.tar.gz", hash = "sha256:c480603f4aa2927d4766eb41fa82793fe60a82cbfdb8d688e0d08c55a534e145", size = 29675, upload-time = "2024-08-30T19:40:43.555Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/a7/8faaa62a488a2a1e0d56969757f087cbd2729e9bcfa508c230299f366b4c/pyee-12.0.0.tar.gz", hash = "sha256:c480603f4aa2927d4766eb41fa82793fe60a82cbfdb8d688e0d08c55a534e145", size = 29675, upload_time = "2024-08-30T19:40:43.555Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/0d/95993c08c721ec68892547f2117e8f9dfbcef2ca71e098533541b4a54d5f/pyee-12.0.0-py3-none-any.whl", hash = "sha256:7b14b74320600049ccc7d0e0b1becd3b4bd0a03c745758225e31a59f4095c990", size = 14831, upload-time = "2024-08-30T19:40:42.132Z" }, + { url = "https://files.pythonhosted.org/packages/1d/0d/95993c08c721ec68892547f2117e8f9dfbcef2ca71e098533541b4a54d5f/pyee-12.0.0-py3-none-any.whl", hash = "sha256:7b14b74320600049ccc7d0e0b1becd3b4bd0a03c745758225e31a59f4095c990", size = 14831, upload_time = "2024-08-30T19:40:42.132Z" }, ] [[package]] name = "pygments" version = "2.19.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload-time = "2025-01-06T17:26:30.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload_time = "2025-01-06T17:26:30.443Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload-time = "2025-01-06T17:26:25.553Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload_time = "2025-01-06T17:26:25.553Z" }, ] [[package]] name = "pyjwt" version = "2.10.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload_time = "2024-11-28T03:43:29.933Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload_time = "2024-11-28T03:43:27.893Z" }, ] [[package]] name = "pyparsing" version = "3.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608, upload-time = "2025-03-25T05:01:28.114Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608, upload_time = "2025-03-25T05:01:28.114Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload-time = "2025-03-25T05:01:24.908Z" }, + { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload_time = "2025-03-25T05:01:24.908Z" }, ] [[package]] @@ -1768,9 +1768,9 @@ dependencies = [ { name = "packaging" }, { name = "pluggy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload_time = "2025-03-02T12:54:54.503Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload_time = "2025-03-02T12:54:52.069Z" }, ] [[package]] @@ -1780,9 +1780,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f2/a8/ecbc8ede70921dd2f544ab1cadd3ff3bf842af27f87bbdea774c7baa1d38/pytest_asyncio-0.25.3.tar.gz", hash = "sha256:fc1da2cf9f125ada7e710b4ddad05518d4cee187ae9412e9ac9271003497f07a", size = 54239, upload-time = "2025-01-28T18:37:58.729Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/a8/ecbc8ede70921dd2f544ab1cadd3ff3bf842af27f87bbdea774c7baa1d38/pytest_asyncio-0.25.3.tar.gz", hash = "sha256:fc1da2cf9f125ada7e710b4ddad05518d4cee187ae9412e9ac9271003497f07a", size = 54239, upload_time = "2025-01-28T18:37:58.729Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/17/3493c5624e48fd97156ebaec380dcaafee9506d7e2c46218ceebbb57d7de/pytest_asyncio-0.25.3-py3-none-any.whl", hash = "sha256:9e89518e0f9bd08928f97a3482fdc4e244df17529460bc038291ccaf8f85c7c3", size = 19467, upload-time = "2025-01-28T18:37:56.798Z" }, + { url = "https://files.pythonhosted.org/packages/67/17/3493c5624e48fd97156ebaec380dcaafee9506d7e2c46218ceebbb57d7de/pytest_asyncio-0.25.3-py3-none-any.whl", hash = "sha256:9e89518e0f9bd08928f97a3482fdc4e244df17529460bc038291ccaf8f85c7c3", size = 19467, upload_time = "2025-01-28T18:37:56.798Z" }, ] [[package]] @@ -1792,9 +1792,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b3/96/25588c55fbe330b751bd7c7d723c3544957566bc090f6d506551b514f488/pytest-mock-3.12.0.tar.gz", hash = "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9", size = 32139, upload-time = "2023-10-19T16:25:57.7Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/96/25588c55fbe330b751bd7c7d723c3544957566bc090f6d506551b514f488/pytest-mock-3.12.0.tar.gz", hash = "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9", size = 32139, upload_time = "2023-10-19T16:25:57.7Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/25/b29fd10dd062cf41e66787a7951b3842881a2a2d7e3a41fcbb58a8466046/pytest_mock-3.12.0-py3-none-any.whl", hash = "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f", size = 9771, upload-time = "2023-10-19T16:25:55.764Z" }, + { url = "https://files.pythonhosted.org/packages/b9/25/b29fd10dd062cf41e66787a7951b3842881a2a2d7e3a41fcbb58a8466046/pytest_mock-3.12.0-py3-none-any.whl", hash = "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f", size = 9771, upload_time = "2023-10-19T16:25:55.764Z" }, ] [[package]] @@ -1804,9 +1804,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/93/0d/04719abc7a4bdb3a7a1f968f24b0f5253d698c9cc94975330e9d3145befb/pytest-timeout-2.3.1.tar.gz", hash = "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9", size = 17697, upload-time = "2024-03-07T21:04:01.069Z" } +sdist = { url = "https://files.pythonhosted.org/packages/93/0d/04719abc7a4bdb3a7a1f968f24b0f5253d698c9cc94975330e9d3145befb/pytest-timeout-2.3.1.tar.gz", hash = "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9", size = 17697, upload_time = "2024-03-07T21:04:01.069Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/03/27/14af9ef8321f5edc7527e47def2a21d8118c6f329a9342cc61387a0c0599/pytest_timeout-2.3.1-py3-none-any.whl", hash = "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e", size = 14148, upload-time = "2024-03-07T21:03:58.764Z" }, + { url = "https://files.pythonhosted.org/packages/03/27/14af9ef8321f5edc7527e47def2a21d8118c6f329a9342cc61387a0c0599/pytest_timeout-2.3.1-py3-none-any.whl", hash = "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e", size = 14148, upload_time = "2024-03-07T21:03:58.764Z" }, ] [[package]] @@ -1816,27 +1816,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload_time = "2024-03-01T18:36:20.211Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload_time = "2024-03-01T18:36:18.57Z" }, ] [[package]] name = "python-dotenv" version = "1.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115, upload-time = "2024-01-23T06:33:00.505Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115, upload_time = "2024-01-23T06:33:00.505Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863, upload-time = "2024-01-23T06:32:58.246Z" }, + { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863, upload_time = "2024-01-23T06:32:58.246Z" }, ] [[package]] name = "python-multipart" version = "0.0.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload-time = "2024-12-16T19:45:46.972Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload_time = "2024-12-16T19:45:46.972Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" }, + { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload_time = "2024-12-16T19:45:44.423Z" }, ] [[package]] @@ -1846,18 +1846,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "text-unidecode" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload-time = "2024-02-08T18:32:45.488Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload_time = "2024-02-08T18:32:45.488Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload-time = "2024-02-08T18:32:43.911Z" }, + { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload_time = "2024-02-08T18:32:43.911Z" }, ] [[package]] name = "pytz" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload_time = "2025-03-25T02:25:00.538Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload_time = "2025-03-25T02:24:58.468Z" }, ] [[package]] @@ -1865,50 +1865,50 @@ name = "pywin32" version = "310" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284, upload-time = "2025-03-17T00:55:53.124Z" }, - { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748, upload-time = "2025-03-17T00:55:55.203Z" }, - { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941, upload-time = "2025-03-17T00:55:57.048Z" }, - { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239, upload-time = "2025-03-17T00:55:58.807Z" }, - { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839, upload-time = "2025-03-17T00:56:00.8Z" }, - { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470, upload-time = "2025-03-17T00:56:02.601Z" }, - { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384, upload-time = "2025-03-17T00:56:04.383Z" }, - { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039, upload-time = "2025-03-17T00:56:06.207Z" }, - { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload-time = "2025-03-17T00:56:07.819Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284, upload_time = "2025-03-17T00:55:53.124Z" }, + { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748, upload_time = "2025-03-17T00:55:55.203Z" }, + { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941, upload_time = "2025-03-17T00:55:57.048Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239, upload_time = "2025-03-17T00:55:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839, upload_time = "2025-03-17T00:56:00.8Z" }, + { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470, upload_time = "2025-03-17T00:56:02.601Z" }, + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384, upload_time = "2025-03-17T00:56:04.383Z" }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039, upload_time = "2025-03-17T00:56:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload_time = "2025-03-17T00:56:07.819Z" }, ] [[package]] name = "pyyaml" version = "6.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload-time = "2024-08-06T20:32:03.408Z" }, - { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload-time = "2024-08-06T20:32:04.926Z" }, - { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload-time = "2024-08-06T20:32:06.459Z" }, - { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload-time = "2024-08-06T20:32:08.338Z" }, - { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload-time = "2024-08-06T20:32:14.124Z" }, - { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload-time = "2024-08-06T20:32:16.17Z" }, - { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload-time = "2024-08-06T20:32:18.555Z" }, - { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload-time = "2024-08-06T20:32:19.889Z" }, - { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload-time = "2024-08-06T20:32:21.273Z" }, - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload-time = "2024-08-06T20:32:25.131Z" }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload-time = "2024-08-06T20:32:26.511Z" }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload-time = "2024-08-06T20:32:28.363Z" }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload-time = "2024-08-06T20:32:30.058Z" }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload-time = "2024-08-06T20:32:31.881Z" }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload-time = "2024-08-06T20:32:37.083Z" }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" }, - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload_time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload_time = "2024-08-06T20:32:03.408Z" }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload_time = "2024-08-06T20:32:04.926Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload_time = "2024-08-06T20:32:06.459Z" }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload_time = "2024-08-06T20:32:08.338Z" }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload_time = "2024-08-06T20:32:14.124Z" }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload_time = "2024-08-06T20:32:16.17Z" }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload_time = "2024-08-06T20:32:18.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload_time = "2024-08-06T20:32:19.889Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload_time = "2024-08-06T20:32:21.273Z" }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload_time = "2024-08-06T20:32:25.131Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload_time = "2024-08-06T20:32:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload_time = "2024-08-06T20:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload_time = "2024-08-06T20:32:30.058Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload_time = "2024-08-06T20:32:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload_time = "2024-08-06T20:32:37.083Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload_time = "2024-08-06T20:32:38.898Z" }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload_time = "2024-08-06T20:32:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload_time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload_time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload_time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload_time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload_time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload_time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload_time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload_time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload_time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload_time = "2024-08-06T20:33:04.33Z" }, ] [[package]] @@ -1921,9 +1921,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload-time = "2024-05-29T15:37:49.536Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload_time = "2024-05-29T15:37:49.536Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload-time = "2024-05-29T15:37:47.027Z" }, + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload_time = "2024-05-29T15:37:47.027Z" }, ] [[package]] @@ -1934,9 +1934,9 @@ dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload-time = "2025-03-30T14:15:14.23Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload_time = "2025-03-30T14:15:14.23Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload-time = "2025-03-30T14:15:12.283Z" }, + { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload_time = "2025-03-30T14:15:12.283Z" }, ] [[package]] @@ -1948,9 +1948,9 @@ dependencies = [ { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f6/31/b6d055f291a660a7bcaec4bcc9457b9fef8ecb6293e527b1eef1840aefd4/rich_toolkit-0.14.6.tar.gz", hash = "sha256:9dbd40e83414b84e828bf899115fff8877ce5951b73175f44db142902f07645d", size = 110805, upload-time = "2025-05-12T19:19:15.284Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/31/b6d055f291a660a7bcaec4bcc9457b9fef8ecb6293e527b1eef1840aefd4/rich_toolkit-0.14.6.tar.gz", hash = "sha256:9dbd40e83414b84e828bf899115fff8877ce5951b73175f44db142902f07645d", size = 110805, upload_time = "2025-05-12T19:19:15.284Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/3c/7a824c0514e87c61000583ac22c8321da6dc8e58a93d5f56e583482a2ee0/rich_toolkit-0.14.6-py3-none-any.whl", hash = "sha256:764f3a5f9e4b539ce805596863299e8982599514906dc5e3ccc2d390ef74c301", size = 24815, upload-time = "2025-05-12T19:19:13.713Z" }, + { url = "https://files.pythonhosted.org/packages/2e/3c/7a824c0514e87c61000583ac22c8321da6dc8e58a93d5f56e583482a2ee0/rich_toolkit-0.14.6-py3-none-any.whl", hash = "sha256:764f3a5f9e4b539ce805596863299e8982599514906dc5e3ccc2d390ef74c301", size = 24815, upload_time = "2025-05-12T19:19:13.713Z" }, ] [[package]] @@ -1960,102 +1960,102 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload-time = "2025-04-16T09:51:18.218Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload_time = "2025-04-16T09:51:18.218Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" }, + { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload_time = "2025-04-16T09:51:17.142Z" }, ] [[package]] name = "setuptools" version = "80.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/0cc40fe41fd2adb80a2f388987f4f8db3c866c69e33e0b4c8b093fdf700e/setuptools-80.4.0.tar.gz", hash = "sha256:5a78f61820bc088c8e4add52932ae6b8cf423da2aff268c23f813cfbb13b4006", size = 1315008, upload-time = "2025-05-09T20:42:27.972Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/0cc40fe41fd2adb80a2f388987f4f8db3c866c69e33e0b4c8b093fdf700e/setuptools-80.4.0.tar.gz", hash = "sha256:5a78f61820bc088c8e4add52932ae6b8cf423da2aff268c23f813cfbb13b4006", size = 1315008, upload_time = "2025-05-09T20:42:27.972Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/93/dba5ed08c2e31ec7cdc2ce75705a484ef0be1a2fecac8a58272489349de8/setuptools-80.4.0-py3-none-any.whl", hash = "sha256:6cdc8cb9a7d590b237dbe4493614a9b75d0559b888047c1f67d49ba50fc3edb2", size = 1200812, upload-time = "2025-05-09T20:42:25.325Z" }, + { url = "https://files.pythonhosted.org/packages/b1/93/dba5ed08c2e31ec7cdc2ce75705a484ef0be1a2fecac8a58272489349de8/setuptools-80.4.0-py3-none-any.whl", hash = "sha256:6cdc8cb9a7d590b237dbe4493614a9b75d0559b888047c1f67d49ba50fc3edb2", size = 1200812, upload_time = "2025-05-09T20:42:25.325Z" }, ] [[package]] name = "shellingham" version = "1.5.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload_time = "2023-10-24T04:13:40.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload_time = "2023-10-24T04:13:38.866Z" }, ] [[package]] name = "simplejson" version = "3.20.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/92/51b417685abd96b31308b61b9acce7ec50d8e1de8fbc39a7fd4962c60689/simplejson-3.20.1.tar.gz", hash = "sha256:e64139b4ec4f1f24c142ff7dcafe55a22b811a74d86d66560c8815687143037d", size = 85591, upload-time = "2025-02-15T05:18:53.15Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/59/74bc90d1c051bc2432c96b34bd4e8036875ab58b4fcbe4d6a5a76985f853/simplejson-3.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:325b8c107253d3217e89d7b50c71015b5b31e2433e6c5bf38967b2f80630a8ca", size = 92132, upload-time = "2025-02-15T05:16:15.743Z" }, - { url = "https://files.pythonhosted.org/packages/71/c7/1970916e0c51794fff89f76da2f632aaf0b259b87753c88a8c409623d3e1/simplejson-3.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88a7baa8211089b9e58d78fbc1b0b322103f3f3d459ff16f03a36cece0d0fcf0", size = 74956, upload-time = "2025-02-15T05:16:17.062Z" }, - { url = "https://files.pythonhosted.org/packages/c8/0d/98cc5909180463f1d75fac7180de62d4cdb4e82c4fef276b9e591979372c/simplejson-3.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:299b1007b8101d50d95bc0db1bf5c38dc372e85b504cf77f596462083ee77e3f", size = 74772, upload-time = "2025-02-15T05:16:19.204Z" }, - { url = "https://files.pythonhosted.org/packages/e1/94/a30a5211a90d67725a3e8fcc1c788189f2ae2ed2b96b63ed15d0b7f5d6bb/simplejson-3.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ec618ed65caab48e81e3ed29586236a8e57daef792f1f3bb59504a7e98cd10", size = 143575, upload-time = "2025-02-15T05:16:21.337Z" }, - { url = "https://files.pythonhosted.org/packages/ee/08/cdb6821f1058eb5db46d252de69ff7e6c53f05f1bae6368fe20d5b51d37e/simplejson-3.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2cdead1d3197f0ff43373cf4730213420523ba48697743e135e26f3d179f38", size = 153241, upload-time = "2025-02-15T05:16:22.859Z" }, - { url = "https://files.pythonhosted.org/packages/4c/2d/ca3caeea0bdc5efc5503d5f57a2dfb56804898fb196dfada121323ee0ccb/simplejson-3.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3466d2839fdc83e1af42e07b90bc8ff361c4e8796cd66722a40ba14e458faddd", size = 141500, upload-time = "2025-02-15T05:16:25.068Z" }, - { url = "https://files.pythonhosted.org/packages/e1/33/d3e0779d5c58245e7370c98eb969275af6b7a4a5aec3b97cbf85f09ad328/simplejson-3.20.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d492ed8e92f3a9f9be829205f44b1d0a89af6582f0cf43e0d129fa477b93fe0c", size = 144757, upload-time = "2025-02-15T05:16:28.301Z" }, - { url = "https://files.pythonhosted.org/packages/54/53/2d93128bb55861b2fa36c5944f38da51a0bc6d83e513afc6f7838440dd15/simplejson-3.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f924b485537b640dc69434565463fd6fc0c68c65a8c6e01a823dd26c9983cf79", size = 144409, upload-time = "2025-02-15T05:16:29.687Z" }, - { url = "https://files.pythonhosted.org/packages/99/4c/dac310a98f897ad3435b4bdc836d92e78f09e38c5dbf28211ed21dc59fa2/simplejson-3.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e8eacf6a3491bf76ea91a8d46726368a6be0eb94993f60b8583550baae9439e", size = 146082, upload-time = "2025-02-15T05:16:31.064Z" }, - { url = "https://files.pythonhosted.org/packages/ee/22/d7ba958cfed39827335b82656b1c46f89678faecda9a7677b47e87b48ee6/simplejson-3.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d04bf90b4cea7c22d8b19091633908f14a096caa301b24c2f3d85b5068fb8", size = 154339, upload-time = "2025-02-15T05:16:32.719Z" }, - { url = "https://files.pythonhosted.org/packages/b8/c8/b072b741129406a7086a0799c6f5d13096231bf35fdd87a0cffa789687fc/simplejson-3.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:69dd28d4ce38390ea4aaf212902712c0fd1093dc4c1ff67e09687c3c3e15a749", size = 147915, upload-time = "2025-02-15T05:16:34.291Z" }, - { url = "https://files.pythonhosted.org/packages/6c/46/8347e61e9cf3db5342a42f7fd30a81b4f5cf85977f916852d7674a540907/simplejson-3.20.1-cp311-cp311-win32.whl", hash = "sha256:dfe7a9da5fd2a3499436cd350f31539e0a6ded5da6b5b3d422df016444d65e43", size = 73972, upload-time = "2025-02-15T05:16:35.712Z" }, - { url = "https://files.pythonhosted.org/packages/01/85/b52f24859237b4e9d523d5655796d911ba3d46e242eb1959c45b6af5aedd/simplejson-3.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:896a6c04d7861d507d800da7642479c3547060bf97419d9ef73d98ced8258766", size = 75595, upload-time = "2025-02-15T05:16:36.957Z" }, - { url = "https://files.pythonhosted.org/packages/8d/eb/34c16a1ac9ba265d024dc977ad84e1659d931c0a700967c3e59a98ed7514/simplejson-3.20.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f31c4a3a7ab18467ee73a27f3e59158255d1520f3aad74315edde7a940f1be23", size = 93100, upload-time = "2025-02-15T05:16:38.801Z" }, - { url = "https://files.pythonhosted.org/packages/41/fc/2c2c007d135894971e6814e7c0806936e5bade28f8db4dd7e2a58b50debd/simplejson-3.20.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:884e6183d16b725e113b83a6fc0230152ab6627d4d36cb05c89c2c5bccfa7bc6", size = 75464, upload-time = "2025-02-15T05:16:40.905Z" }, - { url = "https://files.pythonhosted.org/packages/0f/05/2b5ecb33b776c34bb5cace5de5d7669f9b60e3ca13c113037b2ca86edfbd/simplejson-3.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03d7a426e416fe0d3337115f04164cd9427eb4256e843a6b8751cacf70abc832", size = 75112, upload-time = "2025-02-15T05:16:42.246Z" }, - { url = "https://files.pythonhosted.org/packages/fe/36/1f3609a2792f06cd4b71030485f78e91eb09cfd57bebf3116bf2980a8bac/simplejson-3.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:000602141d0bddfcff60ea6a6e97d5e10c9db6b17fd2d6c66199fa481b6214bb", size = 150182, upload-time = "2025-02-15T05:16:43.557Z" }, - { url = "https://files.pythonhosted.org/packages/2f/b0/053fbda38b8b602a77a4f7829def1b4f316cd8deb5440a6d3ee90790d2a4/simplejson-3.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af8377a8af78226e82e3a4349efdde59ffa421ae88be67e18cef915e4023a595", size = 158363, upload-time = "2025-02-15T05:16:45.748Z" }, - { url = "https://files.pythonhosted.org/packages/d1/4b/2eb84ae867539a80822e92f9be4a7200dffba609275faf99b24141839110/simplejson-3.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15c7de4c88ab2fbcb8781a3b982ef883696736134e20b1210bca43fb42ff1acf", size = 148415, upload-time = "2025-02-15T05:16:47.861Z" }, - { url = "https://files.pythonhosted.org/packages/e0/bd/400b0bd372a5666addf2540c7358bfc3841b9ce5cdbc5cc4ad2f61627ad8/simplejson-3.20.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:455a882ff3f97d810709f7b620007d4e0aca8da71d06fc5c18ba11daf1c4df49", size = 152213, upload-time = "2025-02-15T05:16:49.25Z" }, - { url = "https://files.pythonhosted.org/packages/50/12/143f447bf6a827ee9472693768dc1a5eb96154f8feb140a88ce6973a3cfa/simplejson-3.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc0f523ce923e7f38eb67804bc80e0a028c76d7868500aa3f59225574b5d0453", size = 150048, upload-time = "2025-02-15T05:16:51.5Z" }, - { url = "https://files.pythonhosted.org/packages/5e/ea/dd9b3e8e8ed710a66f24a22c16a907c9b539b6f5f45fd8586bd5c231444e/simplejson-3.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76461ec929282dde4a08061071a47281ad939d0202dc4e63cdd135844e162fbc", size = 151668, upload-time = "2025-02-15T05:16:53Z" }, - { url = "https://files.pythonhosted.org/packages/99/af/ee52a8045426a0c5b89d755a5a70cc821815ef3c333b56fbcad33c4435c0/simplejson-3.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19c2da8c043607bde4d4ef3a6b633e668a7d2e3d56f40a476a74c5ea71949f", size = 158840, upload-time = "2025-02-15T05:16:54.851Z" }, - { url = "https://files.pythonhosted.org/packages/68/db/ab32869acea6b5de7d75fa0dac07a112ded795d41eaa7e66c7813b17be95/simplejson-3.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b2578bedaedf6294415197b267d4ef678fea336dd78ee2a6d2f4b028e9d07be3", size = 154212, upload-time = "2025-02-15T05:16:56.318Z" }, - { url = "https://files.pythonhosted.org/packages/fa/7a/e3132d454977d75a3bf9a6d541d730f76462ebf42a96fea2621498166f41/simplejson-3.20.1-cp312-cp312-win32.whl", hash = "sha256:339f407373325a36b7fd744b688ba5bae0666b5d340ec6d98aebc3014bf3d8ea", size = 74101, upload-time = "2025-02-15T05:16:57.746Z" }, - { url = "https://files.pythonhosted.org/packages/bc/5d/4e243e937fa3560107c69f6f7c2eed8589163f5ed14324e864871daa2dd9/simplejson-3.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:627d4486a1ea7edf1f66bb044ace1ce6b4c1698acd1b05353c97ba4864ea2e17", size = 75736, upload-time = "2025-02-15T05:16:59.017Z" }, - { url = "https://files.pythonhosted.org/packages/c4/03/0f453a27877cb5a5fff16a975925f4119102cc8552f52536b9a98ef0431e/simplejson-3.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:71e849e7ceb2178344998cbe5ade101f1b329460243c79c27fbfc51c0447a7c3", size = 93109, upload-time = "2025-02-15T05:17:00.377Z" }, - { url = "https://files.pythonhosted.org/packages/74/1f/a729f4026850cabeaff23e134646c3f455e86925d2533463420635ae54de/simplejson-3.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b63fdbab29dc3868d6f009a59797cefaba315fd43cd32ddd998ee1da28e50e29", size = 75475, upload-time = "2025-02-15T05:17:02.544Z" }, - { url = "https://files.pythonhosted.org/packages/e2/14/50a2713fee8ff1f8d655b1a14f4a0f1c0c7246768a1b3b3d12964a4ed5aa/simplejson-3.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1190f9a3ce644fd50ec277ac4a98c0517f532cfebdcc4bd975c0979a9f05e1fb", size = 75112, upload-time = "2025-02-15T05:17:03.875Z" }, - { url = "https://files.pythonhosted.org/packages/45/86/ea9835abb646755140e2d482edc9bc1e91997ed19a59fd77ae4c6a0facea/simplejson-3.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1336ba7bcb722ad487cd265701ff0583c0bb6de638364ca947bb84ecc0015d1", size = 150245, upload-time = "2025-02-15T05:17:06.899Z" }, - { url = "https://files.pythonhosted.org/packages/12/b4/53084809faede45da829fe571c65fbda8479d2a5b9c633f46b74124d56f5/simplejson-3.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e975aac6a5acd8b510eba58d5591e10a03e3d16c1cf8a8624ca177491f7230f0", size = 158465, upload-time = "2025-02-15T05:17:08.707Z" }, - { url = "https://files.pythonhosted.org/packages/a9/7d/d56579468d1660b3841e1f21c14490d103e33cf911886b22652d6e9683ec/simplejson-3.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a6dd11ee282937ad749da6f3b8d87952ad585b26e5edfa10da3ae2536c73078", size = 148514, upload-time = "2025-02-15T05:17:11.323Z" }, - { url = "https://files.pythonhosted.org/packages/19/e3/874b1cca3d3897b486d3afdccc475eb3a09815bf1015b01cf7fcb52a55f0/simplejson-3.20.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab980fcc446ab87ea0879edad41a5c28f2d86020014eb035cf5161e8de4474c6", size = 152262, upload-time = "2025-02-15T05:17:13.543Z" }, - { url = "https://files.pythonhosted.org/packages/32/84/f0fdb3625292d945c2bd13a814584603aebdb38cfbe5fe9be6b46fe598c4/simplejson-3.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f5aee2a4cb6b146bd17333ac623610f069f34e8f31d2f4f0c1a2186e50c594f0", size = 150164, upload-time = "2025-02-15T05:17:15.021Z" }, - { url = "https://files.pythonhosted.org/packages/95/51/6d625247224f01eaaeabace9aec75ac5603a42f8ebcce02c486fbda8b428/simplejson-3.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:652d8eecbb9a3b6461b21ec7cf11fd0acbab144e45e600c817ecf18e4580b99e", size = 151795, upload-time = "2025-02-15T05:17:16.542Z" }, - { url = "https://files.pythonhosted.org/packages/7f/d9/bb921df6b35be8412f519e58e86d1060fddf3ad401b783e4862e0a74c4c1/simplejson-3.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8c09948f1a486a89251ee3a67c9f8c969b379f6ffff1a6064b41fea3bce0a112", size = 159027, upload-time = "2025-02-15T05:17:18.083Z" }, - { url = "https://files.pythonhosted.org/packages/03/c5/5950605e4ad023a6621cf4c931b29fd3d2a9c1f36be937230bfc83d7271d/simplejson-3.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cbbd7b215ad4fc6f058b5dd4c26ee5c59f72e031dfda3ac183d7968a99e4ca3a", size = 154380, upload-time = "2025-02-15T05:17:20.334Z" }, - { url = "https://files.pythonhosted.org/packages/66/ad/b74149557c5ec1e4e4d55758bda426f5d2ec0123cd01a53ae63b8de51fa3/simplejson-3.20.1-cp313-cp313-win32.whl", hash = "sha256:ae81e482476eaa088ef9d0120ae5345de924f23962c0c1e20abbdff597631f87", size = 74102, upload-time = "2025-02-15T05:17:22.475Z" }, - { url = "https://files.pythonhosted.org/packages/db/a9/25282fdd24493e1022f30b7f5cdf804255c007218b2bfaa655bd7ad34b2d/simplejson-3.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:1b9fd15853b90aec3b1739f4471efbf1ac05066a2c7041bf8db821bb73cd2ddc", size = 75736, upload-time = "2025-02-15T05:17:24.122Z" }, - { url = "https://files.pythonhosted.org/packages/4b/30/00f02a0a921556dd5a6db1ef2926a1bc7a8bbbfb1c49cfed68a275b8ab2b/simplejson-3.20.1-py3-none-any.whl", hash = "sha256:8a6c1bbac39fa4a79f83cbf1df6ccd8ff7069582a9fd8db1e52cea073bc2c697", size = 57121, upload-time = "2025-02-15T05:18:51.243Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/af/92/51b417685abd96b31308b61b9acce7ec50d8e1de8fbc39a7fd4962c60689/simplejson-3.20.1.tar.gz", hash = "sha256:e64139b4ec4f1f24c142ff7dcafe55a22b811a74d86d66560c8815687143037d", size = 85591, upload_time = "2025-02-15T05:18:53.15Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/59/74bc90d1c051bc2432c96b34bd4e8036875ab58b4fcbe4d6a5a76985f853/simplejson-3.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:325b8c107253d3217e89d7b50c71015b5b31e2433e6c5bf38967b2f80630a8ca", size = 92132, upload_time = "2025-02-15T05:16:15.743Z" }, + { url = "https://files.pythonhosted.org/packages/71/c7/1970916e0c51794fff89f76da2f632aaf0b259b87753c88a8c409623d3e1/simplejson-3.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88a7baa8211089b9e58d78fbc1b0b322103f3f3d459ff16f03a36cece0d0fcf0", size = 74956, upload_time = "2025-02-15T05:16:17.062Z" }, + { url = "https://files.pythonhosted.org/packages/c8/0d/98cc5909180463f1d75fac7180de62d4cdb4e82c4fef276b9e591979372c/simplejson-3.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:299b1007b8101d50d95bc0db1bf5c38dc372e85b504cf77f596462083ee77e3f", size = 74772, upload_time = "2025-02-15T05:16:19.204Z" }, + { url = "https://files.pythonhosted.org/packages/e1/94/a30a5211a90d67725a3e8fcc1c788189f2ae2ed2b96b63ed15d0b7f5d6bb/simplejson-3.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ec618ed65caab48e81e3ed29586236a8e57daef792f1f3bb59504a7e98cd10", size = 143575, upload_time = "2025-02-15T05:16:21.337Z" }, + { url = "https://files.pythonhosted.org/packages/ee/08/cdb6821f1058eb5db46d252de69ff7e6c53f05f1bae6368fe20d5b51d37e/simplejson-3.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2cdead1d3197f0ff43373cf4730213420523ba48697743e135e26f3d179f38", size = 153241, upload_time = "2025-02-15T05:16:22.859Z" }, + { url = "https://files.pythonhosted.org/packages/4c/2d/ca3caeea0bdc5efc5503d5f57a2dfb56804898fb196dfada121323ee0ccb/simplejson-3.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3466d2839fdc83e1af42e07b90bc8ff361c4e8796cd66722a40ba14e458faddd", size = 141500, upload_time = "2025-02-15T05:16:25.068Z" }, + { url = "https://files.pythonhosted.org/packages/e1/33/d3e0779d5c58245e7370c98eb969275af6b7a4a5aec3b97cbf85f09ad328/simplejson-3.20.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d492ed8e92f3a9f9be829205f44b1d0a89af6582f0cf43e0d129fa477b93fe0c", size = 144757, upload_time = "2025-02-15T05:16:28.301Z" }, + { url = "https://files.pythonhosted.org/packages/54/53/2d93128bb55861b2fa36c5944f38da51a0bc6d83e513afc6f7838440dd15/simplejson-3.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f924b485537b640dc69434565463fd6fc0c68c65a8c6e01a823dd26c9983cf79", size = 144409, upload_time = "2025-02-15T05:16:29.687Z" }, + { url = "https://files.pythonhosted.org/packages/99/4c/dac310a98f897ad3435b4bdc836d92e78f09e38c5dbf28211ed21dc59fa2/simplejson-3.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e8eacf6a3491bf76ea91a8d46726368a6be0eb94993f60b8583550baae9439e", size = 146082, upload_time = "2025-02-15T05:16:31.064Z" }, + { url = "https://files.pythonhosted.org/packages/ee/22/d7ba958cfed39827335b82656b1c46f89678faecda9a7677b47e87b48ee6/simplejson-3.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d04bf90b4cea7c22d8b19091633908f14a096caa301b24c2f3d85b5068fb8", size = 154339, upload_time = "2025-02-15T05:16:32.719Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c8/b072b741129406a7086a0799c6f5d13096231bf35fdd87a0cffa789687fc/simplejson-3.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:69dd28d4ce38390ea4aaf212902712c0fd1093dc4c1ff67e09687c3c3e15a749", size = 147915, upload_time = "2025-02-15T05:16:34.291Z" }, + { url = "https://files.pythonhosted.org/packages/6c/46/8347e61e9cf3db5342a42f7fd30a81b4f5cf85977f916852d7674a540907/simplejson-3.20.1-cp311-cp311-win32.whl", hash = "sha256:dfe7a9da5fd2a3499436cd350f31539e0a6ded5da6b5b3d422df016444d65e43", size = 73972, upload_time = "2025-02-15T05:16:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/01/85/b52f24859237b4e9d523d5655796d911ba3d46e242eb1959c45b6af5aedd/simplejson-3.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:896a6c04d7861d507d800da7642479c3547060bf97419d9ef73d98ced8258766", size = 75595, upload_time = "2025-02-15T05:16:36.957Z" }, + { url = "https://files.pythonhosted.org/packages/8d/eb/34c16a1ac9ba265d024dc977ad84e1659d931c0a700967c3e59a98ed7514/simplejson-3.20.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f31c4a3a7ab18467ee73a27f3e59158255d1520f3aad74315edde7a940f1be23", size = 93100, upload_time = "2025-02-15T05:16:38.801Z" }, + { url = "https://files.pythonhosted.org/packages/41/fc/2c2c007d135894971e6814e7c0806936e5bade28f8db4dd7e2a58b50debd/simplejson-3.20.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:884e6183d16b725e113b83a6fc0230152ab6627d4d36cb05c89c2c5bccfa7bc6", size = 75464, upload_time = "2025-02-15T05:16:40.905Z" }, + { url = "https://files.pythonhosted.org/packages/0f/05/2b5ecb33b776c34bb5cace5de5d7669f9b60e3ca13c113037b2ca86edfbd/simplejson-3.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03d7a426e416fe0d3337115f04164cd9427eb4256e843a6b8751cacf70abc832", size = 75112, upload_time = "2025-02-15T05:16:42.246Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/1f3609a2792f06cd4b71030485f78e91eb09cfd57bebf3116bf2980a8bac/simplejson-3.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:000602141d0bddfcff60ea6a6e97d5e10c9db6b17fd2d6c66199fa481b6214bb", size = 150182, upload_time = "2025-02-15T05:16:43.557Z" }, + { url = "https://files.pythonhosted.org/packages/2f/b0/053fbda38b8b602a77a4f7829def1b4f316cd8deb5440a6d3ee90790d2a4/simplejson-3.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af8377a8af78226e82e3a4349efdde59ffa421ae88be67e18cef915e4023a595", size = 158363, upload_time = "2025-02-15T05:16:45.748Z" }, + { url = "https://files.pythonhosted.org/packages/d1/4b/2eb84ae867539a80822e92f9be4a7200dffba609275faf99b24141839110/simplejson-3.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15c7de4c88ab2fbcb8781a3b982ef883696736134e20b1210bca43fb42ff1acf", size = 148415, upload_time = "2025-02-15T05:16:47.861Z" }, + { url = "https://files.pythonhosted.org/packages/e0/bd/400b0bd372a5666addf2540c7358bfc3841b9ce5cdbc5cc4ad2f61627ad8/simplejson-3.20.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:455a882ff3f97d810709f7b620007d4e0aca8da71d06fc5c18ba11daf1c4df49", size = 152213, upload_time = "2025-02-15T05:16:49.25Z" }, + { url = "https://files.pythonhosted.org/packages/50/12/143f447bf6a827ee9472693768dc1a5eb96154f8feb140a88ce6973a3cfa/simplejson-3.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc0f523ce923e7f38eb67804bc80e0a028c76d7868500aa3f59225574b5d0453", size = 150048, upload_time = "2025-02-15T05:16:51.5Z" }, + { url = "https://files.pythonhosted.org/packages/5e/ea/dd9b3e8e8ed710a66f24a22c16a907c9b539b6f5f45fd8586bd5c231444e/simplejson-3.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76461ec929282dde4a08061071a47281ad939d0202dc4e63cdd135844e162fbc", size = 151668, upload_time = "2025-02-15T05:16:53Z" }, + { url = "https://files.pythonhosted.org/packages/99/af/ee52a8045426a0c5b89d755a5a70cc821815ef3c333b56fbcad33c4435c0/simplejson-3.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19c2da8c043607bde4d4ef3a6b633e668a7d2e3d56f40a476a74c5ea71949f", size = 158840, upload_time = "2025-02-15T05:16:54.851Z" }, + { url = "https://files.pythonhosted.org/packages/68/db/ab32869acea6b5de7d75fa0dac07a112ded795d41eaa7e66c7813b17be95/simplejson-3.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b2578bedaedf6294415197b267d4ef678fea336dd78ee2a6d2f4b028e9d07be3", size = 154212, upload_time = "2025-02-15T05:16:56.318Z" }, + { url = "https://files.pythonhosted.org/packages/fa/7a/e3132d454977d75a3bf9a6d541d730f76462ebf42a96fea2621498166f41/simplejson-3.20.1-cp312-cp312-win32.whl", hash = "sha256:339f407373325a36b7fd744b688ba5bae0666b5d340ec6d98aebc3014bf3d8ea", size = 74101, upload_time = "2025-02-15T05:16:57.746Z" }, + { url = "https://files.pythonhosted.org/packages/bc/5d/4e243e937fa3560107c69f6f7c2eed8589163f5ed14324e864871daa2dd9/simplejson-3.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:627d4486a1ea7edf1f66bb044ace1ce6b4c1698acd1b05353c97ba4864ea2e17", size = 75736, upload_time = "2025-02-15T05:16:59.017Z" }, + { url = "https://files.pythonhosted.org/packages/c4/03/0f453a27877cb5a5fff16a975925f4119102cc8552f52536b9a98ef0431e/simplejson-3.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:71e849e7ceb2178344998cbe5ade101f1b329460243c79c27fbfc51c0447a7c3", size = 93109, upload_time = "2025-02-15T05:17:00.377Z" }, + { url = "https://files.pythonhosted.org/packages/74/1f/a729f4026850cabeaff23e134646c3f455e86925d2533463420635ae54de/simplejson-3.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b63fdbab29dc3868d6f009a59797cefaba315fd43cd32ddd998ee1da28e50e29", size = 75475, upload_time = "2025-02-15T05:17:02.544Z" }, + { url = "https://files.pythonhosted.org/packages/e2/14/50a2713fee8ff1f8d655b1a14f4a0f1c0c7246768a1b3b3d12964a4ed5aa/simplejson-3.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1190f9a3ce644fd50ec277ac4a98c0517f532cfebdcc4bd975c0979a9f05e1fb", size = 75112, upload_time = "2025-02-15T05:17:03.875Z" }, + { url = "https://files.pythonhosted.org/packages/45/86/ea9835abb646755140e2d482edc9bc1e91997ed19a59fd77ae4c6a0facea/simplejson-3.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1336ba7bcb722ad487cd265701ff0583c0bb6de638364ca947bb84ecc0015d1", size = 150245, upload_time = "2025-02-15T05:17:06.899Z" }, + { url = "https://files.pythonhosted.org/packages/12/b4/53084809faede45da829fe571c65fbda8479d2a5b9c633f46b74124d56f5/simplejson-3.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e975aac6a5acd8b510eba58d5591e10a03e3d16c1cf8a8624ca177491f7230f0", size = 158465, upload_time = "2025-02-15T05:17:08.707Z" }, + { url = "https://files.pythonhosted.org/packages/a9/7d/d56579468d1660b3841e1f21c14490d103e33cf911886b22652d6e9683ec/simplejson-3.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a6dd11ee282937ad749da6f3b8d87952ad585b26e5edfa10da3ae2536c73078", size = 148514, upload_time = "2025-02-15T05:17:11.323Z" }, + { url = "https://files.pythonhosted.org/packages/19/e3/874b1cca3d3897b486d3afdccc475eb3a09815bf1015b01cf7fcb52a55f0/simplejson-3.20.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab980fcc446ab87ea0879edad41a5c28f2d86020014eb035cf5161e8de4474c6", size = 152262, upload_time = "2025-02-15T05:17:13.543Z" }, + { url = "https://files.pythonhosted.org/packages/32/84/f0fdb3625292d945c2bd13a814584603aebdb38cfbe5fe9be6b46fe598c4/simplejson-3.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f5aee2a4cb6b146bd17333ac623610f069f34e8f31d2f4f0c1a2186e50c594f0", size = 150164, upload_time = "2025-02-15T05:17:15.021Z" }, + { url = "https://files.pythonhosted.org/packages/95/51/6d625247224f01eaaeabace9aec75ac5603a42f8ebcce02c486fbda8b428/simplejson-3.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:652d8eecbb9a3b6461b21ec7cf11fd0acbab144e45e600c817ecf18e4580b99e", size = 151795, upload_time = "2025-02-15T05:17:16.542Z" }, + { url = "https://files.pythonhosted.org/packages/7f/d9/bb921df6b35be8412f519e58e86d1060fddf3ad401b783e4862e0a74c4c1/simplejson-3.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8c09948f1a486a89251ee3a67c9f8c969b379f6ffff1a6064b41fea3bce0a112", size = 159027, upload_time = "2025-02-15T05:17:18.083Z" }, + { url = "https://files.pythonhosted.org/packages/03/c5/5950605e4ad023a6621cf4c931b29fd3d2a9c1f36be937230bfc83d7271d/simplejson-3.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cbbd7b215ad4fc6f058b5dd4c26ee5c59f72e031dfda3ac183d7968a99e4ca3a", size = 154380, upload_time = "2025-02-15T05:17:20.334Z" }, + { url = "https://files.pythonhosted.org/packages/66/ad/b74149557c5ec1e4e4d55758bda426f5d2ec0123cd01a53ae63b8de51fa3/simplejson-3.20.1-cp313-cp313-win32.whl", hash = "sha256:ae81e482476eaa088ef9d0120ae5345de924f23962c0c1e20abbdff597631f87", size = 74102, upload_time = "2025-02-15T05:17:22.475Z" }, + { url = "https://files.pythonhosted.org/packages/db/a9/25282fdd24493e1022f30b7f5cdf804255c007218b2bfaa655bd7ad34b2d/simplejson-3.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:1b9fd15853b90aec3b1739f4471efbf1ac05066a2c7041bf8db821bb73cd2ddc", size = 75736, upload_time = "2025-02-15T05:17:24.122Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/00f02a0a921556dd5a6db1ef2926a1bc7a8bbbfb1c49cfed68a275b8ab2b/simplejson-3.20.1-py3-none-any.whl", hash = "sha256:8a6c1bbac39fa4a79f83cbf1df6ccd8ff7069582a9fd8db1e52cea073bc2c697", size = 57121, upload_time = "2025-02-15T05:18:51.243Z" }, ] [[package]] name = "six" version = "1.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload_time = "2024-12-04T17:35:28.174Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload_time = "2024-12-04T17:35:26.475Z" }, ] [[package]] name = "sniffio" version = "1.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload_time = "2024-02-25T23:20:04.057Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload_time = "2024-02-25T23:20:01.196Z" }, ] [[package]] name = "soupsieve" version = "2.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload-time = "2025-04-20T18:50:08.518Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload_time = "2025-04-20T18:50:08.518Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload-time = "2025-04-20T18:50:07.196Z" }, + { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload_time = "2025-04-20T18:50:07.196Z" }, ] [[package]] @@ -2066,33 +2066,33 @@ dependencies = [ { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/c3/3f2bfa5e4dcd9938405fe2fab5b6ab94a9248a4f9536ea2fd497da20525f/sqlalchemy-2.0.40.tar.gz", hash = "sha256:d827099289c64589418ebbcaead0145cd19f4e3e8a93919a0100247af245fa00", size = 9664299, upload-time = "2025-03-27T17:52:31.876Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/77/7e/55044a9ec48c3249bb38d5faae93f09579c35e862bb318ebd1ed7a1994a5/sqlalchemy-2.0.40-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f6bacab7514de6146a1976bc56e1545bee247242fab030b89e5f70336fc0003e", size = 2114025, upload-time = "2025-03-27T18:49:29.456Z" }, - { url = "https://files.pythonhosted.org/packages/77/0f/dcf7bba95f847aec72f638750747b12d37914f71c8cc7c133cf326ab945c/sqlalchemy-2.0.40-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5654d1ac34e922b6c5711631f2da497d3a7bffd6f9f87ac23b35feea56098011", size = 2104419, upload-time = "2025-03-27T18:49:30.75Z" }, - { url = "https://files.pythonhosted.org/packages/75/70/c86a5c20715e4fe903dde4c2fd44fc7e7a0d5fb52c1b954d98526f65a3ea/sqlalchemy-2.0.40-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35904d63412db21088739510216e9349e335f142ce4a04b69e2528020ee19ed4", size = 3222720, upload-time = "2025-03-27T18:44:29.871Z" }, - { url = "https://files.pythonhosted.org/packages/12/cf/b891a8c1d0c27ce9163361664c2128c7a57de3f35000ea5202eb3a2917b7/sqlalchemy-2.0.40-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c7a80ed86d6aaacb8160a1caef6680d4ddd03c944d985aecee940d168c411d1", size = 3222682, upload-time = "2025-03-27T18:55:20.097Z" }, - { url = "https://files.pythonhosted.org/packages/15/3f/7709d8c8266953d945435a96b7f425ae4172a336963756b58e996fbef7f3/sqlalchemy-2.0.40-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:519624685a51525ddaa7d8ba8265a1540442a2ec71476f0e75241eb8263d6f51", size = 3159542, upload-time = "2025-03-27T18:44:31.333Z" }, - { url = "https://files.pythonhosted.org/packages/85/7e/717eaabaf0f80a0132dc2032ea8f745b7a0914451c984821a7c8737fb75a/sqlalchemy-2.0.40-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2ee5f9999a5b0e9689bed96e60ee53c3384f1a05c2dd8068cc2e8361b0df5b7a", size = 3179864, upload-time = "2025-03-27T18:55:21.784Z" }, - { url = "https://files.pythonhosted.org/packages/e4/cc/03eb5dfcdb575cbecd2bd82487b9848f250a4b6ecfb4707e834b4ce4ec07/sqlalchemy-2.0.40-cp311-cp311-win32.whl", hash = "sha256:c0cae71e20e3c02c52f6b9e9722bca70e4a90a466d59477822739dc31ac18b4b", size = 2084675, upload-time = "2025-03-27T18:48:55.915Z" }, - { url = "https://files.pythonhosted.org/packages/9a/48/440946bf9dc4dc231f4f31ef0d316f7135bf41d4b86aaba0c0655150d370/sqlalchemy-2.0.40-cp311-cp311-win_amd64.whl", hash = "sha256:574aea2c54d8f1dd1699449f332c7d9b71c339e04ae50163a3eb5ce4c4325ee4", size = 2110099, upload-time = "2025-03-27T18:48:57.45Z" }, - { url = "https://files.pythonhosted.org/packages/92/06/552c1f92e880b57d8b92ce6619bd569b25cead492389b1d84904b55989d8/sqlalchemy-2.0.40-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9d3b31d0a1c44b74d3ae27a3de422dfccd2b8f0b75e51ecb2faa2bf65ab1ba0d", size = 2112620, upload-time = "2025-03-27T18:40:00.071Z" }, - { url = "https://files.pythonhosted.org/packages/01/72/a5bc6e76c34cebc071f758161dbe1453de8815ae6e662393910d3be6d70d/sqlalchemy-2.0.40-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:37f7a0f506cf78c80450ed1e816978643d3969f99c4ac6b01104a6fe95c5490a", size = 2103004, upload-time = "2025-03-27T18:40:04.204Z" }, - { url = "https://files.pythonhosted.org/packages/bf/fd/0e96c8e6767618ed1a06e4d7a167fe13734c2f8113c4cb704443e6783038/sqlalchemy-2.0.40-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bb933a650323e476a2e4fbef8997a10d0003d4da996aad3fd7873e962fdde4d", size = 3252440, upload-time = "2025-03-27T18:51:25.624Z" }, - { url = "https://files.pythonhosted.org/packages/cd/6a/eb82e45b15a64266a2917a6833b51a334ea3c1991728fd905bfccbf5cf63/sqlalchemy-2.0.40-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6959738971b4745eea16f818a2cd086fb35081383b078272c35ece2b07012716", size = 3263277, upload-time = "2025-03-27T18:50:28.142Z" }, - { url = "https://files.pythonhosted.org/packages/45/97/ebe41ab4530f50af99e3995ebd4e0204bf1b0dc0930f32250dde19c389fe/sqlalchemy-2.0.40-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:110179728e442dae85dd39591beb74072ae4ad55a44eda2acc6ec98ead80d5f2", size = 3198591, upload-time = "2025-03-27T18:51:27.543Z" }, - { url = "https://files.pythonhosted.org/packages/e6/1c/a569c1b2b2f5ac20ba6846a1321a2bf52e9a4061001f282bf1c5528dcd69/sqlalchemy-2.0.40-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8040680eaacdce4d635f12c55c714f3d4c7f57da2bc47a01229d115bd319191", size = 3225199, upload-time = "2025-03-27T18:50:30.069Z" }, - { url = "https://files.pythonhosted.org/packages/8f/91/87cc71a6b10065ca0209d19a4bb575378abda6085e72fa0b61ffb2201b84/sqlalchemy-2.0.40-cp312-cp312-win32.whl", hash = "sha256:650490653b110905c10adac69408380688cefc1f536a137d0d69aca1069dc1d1", size = 2082959, upload-time = "2025-03-27T18:45:57.574Z" }, - { url = "https://files.pythonhosted.org/packages/2a/9f/14c511cda174aa1ad9b0e42b64ff5a71db35d08b0d80dc044dae958921e5/sqlalchemy-2.0.40-cp312-cp312-win_amd64.whl", hash = "sha256:2be94d75ee06548d2fc591a3513422b873490efb124048f50556369a834853b0", size = 2108526, upload-time = "2025-03-27T18:45:58.965Z" }, - { url = "https://files.pythonhosted.org/packages/8c/18/4e3a86cc0232377bc48c373a9ba6a1b3fb79ba32dbb4eda0b357f5a2c59d/sqlalchemy-2.0.40-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:915866fd50dd868fdcc18d61d8258db1bf9ed7fbd6dfec960ba43365952f3b01", size = 2107887, upload-time = "2025-03-27T18:40:05.461Z" }, - { url = "https://files.pythonhosted.org/packages/cb/60/9fa692b1d2ffc4cbd5f47753731fd332afed30137115d862d6e9a1e962c7/sqlalchemy-2.0.40-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a4c5a2905a9ccdc67a8963e24abd2f7afcd4348829412483695c59e0af9a705", size = 2098367, upload-time = "2025-03-27T18:40:07.182Z" }, - { url = "https://files.pythonhosted.org/packages/4c/9f/84b78357ca641714a439eb3fbbddb17297dacfa05d951dbf24f28d7b5c08/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55028d7a3ebdf7ace492fab9895cbc5270153f75442a0472d8516e03159ab364", size = 3184806, upload-time = "2025-03-27T18:51:29.356Z" }, - { url = "https://files.pythonhosted.org/packages/4b/7d/e06164161b6bfce04c01bfa01518a20cccbd4100d5c951e5a7422189191a/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cfedff6878b0e0d1d0a50666a817ecd85051d12d56b43d9d425455e608b5ba0", size = 3198131, upload-time = "2025-03-27T18:50:31.616Z" }, - { url = "https://files.pythonhosted.org/packages/6d/51/354af20da42d7ec7b5c9de99edafbb7663a1d75686d1999ceb2c15811302/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bb19e30fdae77d357ce92192a3504579abe48a66877f476880238a962e5b96db", size = 3131364, upload-time = "2025-03-27T18:51:31.336Z" }, - { url = "https://files.pythonhosted.org/packages/7a/2f/48a41ff4e6e10549d83fcc551ab85c268bde7c03cf77afb36303c6594d11/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:16d325ea898f74b26ffcd1cf8c593b0beed8714f0317df2bed0d8d1de05a8f26", size = 3159482, upload-time = "2025-03-27T18:50:33.201Z" }, - { url = "https://files.pythonhosted.org/packages/33/ac/e5e0a807163652a35be878c0ad5cfd8b1d29605edcadfb5df3c512cdf9f3/sqlalchemy-2.0.40-cp313-cp313-win32.whl", hash = "sha256:a669cbe5be3c63f75bcbee0b266779706f1a54bcb1000f302685b87d1b8c1500", size = 2080704, upload-time = "2025-03-27T18:46:00.193Z" }, - { url = "https://files.pythonhosted.org/packages/1c/cb/f38c61f7f2fd4d10494c1c135ff6a6ddb63508d0b47bccccd93670637309/sqlalchemy-2.0.40-cp313-cp313-win_amd64.whl", hash = "sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad", size = 2104564, upload-time = "2025-03-27T18:46:01.442Z" }, - { url = "https://files.pythonhosted.org/packages/d1/7c/5fc8e802e7506fe8b55a03a2e1dab156eae205c91bee46305755e086d2e2/sqlalchemy-2.0.40-py3-none-any.whl", hash = "sha256:32587e2e1e359276957e6fe5dad089758bc042a971a8a09ae8ecf7a8fe23d07a", size = 1903894, upload-time = "2025-03-27T18:40:43.796Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/68/c3/3f2bfa5e4dcd9938405fe2fab5b6ab94a9248a4f9536ea2fd497da20525f/sqlalchemy-2.0.40.tar.gz", hash = "sha256:d827099289c64589418ebbcaead0145cd19f4e3e8a93919a0100247af245fa00", size = 9664299, upload_time = "2025-03-27T17:52:31.876Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/7e/55044a9ec48c3249bb38d5faae93f09579c35e862bb318ebd1ed7a1994a5/sqlalchemy-2.0.40-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f6bacab7514de6146a1976bc56e1545bee247242fab030b89e5f70336fc0003e", size = 2114025, upload_time = "2025-03-27T18:49:29.456Z" }, + { url = "https://files.pythonhosted.org/packages/77/0f/dcf7bba95f847aec72f638750747b12d37914f71c8cc7c133cf326ab945c/sqlalchemy-2.0.40-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5654d1ac34e922b6c5711631f2da497d3a7bffd6f9f87ac23b35feea56098011", size = 2104419, upload_time = "2025-03-27T18:49:30.75Z" }, + { url = "https://files.pythonhosted.org/packages/75/70/c86a5c20715e4fe903dde4c2fd44fc7e7a0d5fb52c1b954d98526f65a3ea/sqlalchemy-2.0.40-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35904d63412db21088739510216e9349e335f142ce4a04b69e2528020ee19ed4", size = 3222720, upload_time = "2025-03-27T18:44:29.871Z" }, + { url = "https://files.pythonhosted.org/packages/12/cf/b891a8c1d0c27ce9163361664c2128c7a57de3f35000ea5202eb3a2917b7/sqlalchemy-2.0.40-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c7a80ed86d6aaacb8160a1caef6680d4ddd03c944d985aecee940d168c411d1", size = 3222682, upload_time = "2025-03-27T18:55:20.097Z" }, + { url = "https://files.pythonhosted.org/packages/15/3f/7709d8c8266953d945435a96b7f425ae4172a336963756b58e996fbef7f3/sqlalchemy-2.0.40-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:519624685a51525ddaa7d8ba8265a1540442a2ec71476f0e75241eb8263d6f51", size = 3159542, upload_time = "2025-03-27T18:44:31.333Z" }, + { url = "https://files.pythonhosted.org/packages/85/7e/717eaabaf0f80a0132dc2032ea8f745b7a0914451c984821a7c8737fb75a/sqlalchemy-2.0.40-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2ee5f9999a5b0e9689bed96e60ee53c3384f1a05c2dd8068cc2e8361b0df5b7a", size = 3179864, upload_time = "2025-03-27T18:55:21.784Z" }, + { url = "https://files.pythonhosted.org/packages/e4/cc/03eb5dfcdb575cbecd2bd82487b9848f250a4b6ecfb4707e834b4ce4ec07/sqlalchemy-2.0.40-cp311-cp311-win32.whl", hash = "sha256:c0cae71e20e3c02c52f6b9e9722bca70e4a90a466d59477822739dc31ac18b4b", size = 2084675, upload_time = "2025-03-27T18:48:55.915Z" }, + { url = "https://files.pythonhosted.org/packages/9a/48/440946bf9dc4dc231f4f31ef0d316f7135bf41d4b86aaba0c0655150d370/sqlalchemy-2.0.40-cp311-cp311-win_amd64.whl", hash = "sha256:574aea2c54d8f1dd1699449f332c7d9b71c339e04ae50163a3eb5ce4c4325ee4", size = 2110099, upload_time = "2025-03-27T18:48:57.45Z" }, + { url = "https://files.pythonhosted.org/packages/92/06/552c1f92e880b57d8b92ce6619bd569b25cead492389b1d84904b55989d8/sqlalchemy-2.0.40-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9d3b31d0a1c44b74d3ae27a3de422dfccd2b8f0b75e51ecb2faa2bf65ab1ba0d", size = 2112620, upload_time = "2025-03-27T18:40:00.071Z" }, + { url = "https://files.pythonhosted.org/packages/01/72/a5bc6e76c34cebc071f758161dbe1453de8815ae6e662393910d3be6d70d/sqlalchemy-2.0.40-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:37f7a0f506cf78c80450ed1e816978643d3969f99c4ac6b01104a6fe95c5490a", size = 2103004, upload_time = "2025-03-27T18:40:04.204Z" }, + { url = "https://files.pythonhosted.org/packages/bf/fd/0e96c8e6767618ed1a06e4d7a167fe13734c2f8113c4cb704443e6783038/sqlalchemy-2.0.40-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bb933a650323e476a2e4fbef8997a10d0003d4da996aad3fd7873e962fdde4d", size = 3252440, upload_time = "2025-03-27T18:51:25.624Z" }, + { url = "https://files.pythonhosted.org/packages/cd/6a/eb82e45b15a64266a2917a6833b51a334ea3c1991728fd905bfccbf5cf63/sqlalchemy-2.0.40-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6959738971b4745eea16f818a2cd086fb35081383b078272c35ece2b07012716", size = 3263277, upload_time = "2025-03-27T18:50:28.142Z" }, + { url = "https://files.pythonhosted.org/packages/45/97/ebe41ab4530f50af99e3995ebd4e0204bf1b0dc0930f32250dde19c389fe/sqlalchemy-2.0.40-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:110179728e442dae85dd39591beb74072ae4ad55a44eda2acc6ec98ead80d5f2", size = 3198591, upload_time = "2025-03-27T18:51:27.543Z" }, + { url = "https://files.pythonhosted.org/packages/e6/1c/a569c1b2b2f5ac20ba6846a1321a2bf52e9a4061001f282bf1c5528dcd69/sqlalchemy-2.0.40-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8040680eaacdce4d635f12c55c714f3d4c7f57da2bc47a01229d115bd319191", size = 3225199, upload_time = "2025-03-27T18:50:30.069Z" }, + { url = "https://files.pythonhosted.org/packages/8f/91/87cc71a6b10065ca0209d19a4bb575378abda6085e72fa0b61ffb2201b84/sqlalchemy-2.0.40-cp312-cp312-win32.whl", hash = "sha256:650490653b110905c10adac69408380688cefc1f536a137d0d69aca1069dc1d1", size = 2082959, upload_time = "2025-03-27T18:45:57.574Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/14c511cda174aa1ad9b0e42b64ff5a71db35d08b0d80dc044dae958921e5/sqlalchemy-2.0.40-cp312-cp312-win_amd64.whl", hash = "sha256:2be94d75ee06548d2fc591a3513422b873490efb124048f50556369a834853b0", size = 2108526, upload_time = "2025-03-27T18:45:58.965Z" }, + { url = "https://files.pythonhosted.org/packages/8c/18/4e3a86cc0232377bc48c373a9ba6a1b3fb79ba32dbb4eda0b357f5a2c59d/sqlalchemy-2.0.40-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:915866fd50dd868fdcc18d61d8258db1bf9ed7fbd6dfec960ba43365952f3b01", size = 2107887, upload_time = "2025-03-27T18:40:05.461Z" }, + { url = "https://files.pythonhosted.org/packages/cb/60/9fa692b1d2ffc4cbd5f47753731fd332afed30137115d862d6e9a1e962c7/sqlalchemy-2.0.40-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a4c5a2905a9ccdc67a8963e24abd2f7afcd4348829412483695c59e0af9a705", size = 2098367, upload_time = "2025-03-27T18:40:07.182Z" }, + { url = "https://files.pythonhosted.org/packages/4c/9f/84b78357ca641714a439eb3fbbddb17297dacfa05d951dbf24f28d7b5c08/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55028d7a3ebdf7ace492fab9895cbc5270153f75442a0472d8516e03159ab364", size = 3184806, upload_time = "2025-03-27T18:51:29.356Z" }, + { url = "https://files.pythonhosted.org/packages/4b/7d/e06164161b6bfce04c01bfa01518a20cccbd4100d5c951e5a7422189191a/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cfedff6878b0e0d1d0a50666a817ecd85051d12d56b43d9d425455e608b5ba0", size = 3198131, upload_time = "2025-03-27T18:50:31.616Z" }, + { url = "https://files.pythonhosted.org/packages/6d/51/354af20da42d7ec7b5c9de99edafbb7663a1d75686d1999ceb2c15811302/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bb19e30fdae77d357ce92192a3504579abe48a66877f476880238a962e5b96db", size = 3131364, upload_time = "2025-03-27T18:51:31.336Z" }, + { url = "https://files.pythonhosted.org/packages/7a/2f/48a41ff4e6e10549d83fcc551ab85c268bde7c03cf77afb36303c6594d11/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:16d325ea898f74b26ffcd1cf8c593b0beed8714f0317df2bed0d8d1de05a8f26", size = 3159482, upload_time = "2025-03-27T18:50:33.201Z" }, + { url = "https://files.pythonhosted.org/packages/33/ac/e5e0a807163652a35be878c0ad5cfd8b1d29605edcadfb5df3c512cdf9f3/sqlalchemy-2.0.40-cp313-cp313-win32.whl", hash = "sha256:a669cbe5be3c63f75bcbee0b266779706f1a54bcb1000f302685b87d1b8c1500", size = 2080704, upload_time = "2025-03-27T18:46:00.193Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cb/f38c61f7f2fd4d10494c1c135ff6a6ddb63508d0b47bccccd93670637309/sqlalchemy-2.0.40-cp313-cp313-win_amd64.whl", hash = "sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad", size = 2104564, upload_time = "2025-03-27T18:46:01.442Z" }, + { url = "https://files.pythonhosted.org/packages/d1/7c/5fc8e802e7506fe8b55a03a2e1dab156eae205c91bee46305755e086d2e2/sqlalchemy-2.0.40-py3-none-any.whl", hash = "sha256:32587e2e1e359276957e6fe5dad089758bc042a971a8a09ae8ecf7a8fe23d07a", size = 1903894, upload_time = "2025-03-27T18:40:43.796Z" }, ] [[package]] @@ -2102,18 +2102,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ff/fb/2984a686808b89a6781526129a4b51266f678b2d2b97ab2d325e56116df8/starlette-0.45.3.tar.gz", hash = "sha256:2cbcba2a75806f8a41c722141486f37c28e30a0921c5f6fe4346cb0dcee1302f", size = 2574076, upload-time = "2025-01-24T11:17:36.535Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/fb/2984a686808b89a6781526129a4b51266f678b2d2b97ab2d325e56116df8/starlette-0.45.3.tar.gz", hash = "sha256:2cbcba2a75806f8a41c722141486f37c28e30a0921c5f6fe4346cb0dcee1302f", size = 2574076, upload_time = "2025-01-24T11:17:36.535Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl", hash = "sha256:dfb6d332576f136ec740296c7e8bb8c8a7125044e7c6da30744718880cdd059d", size = 71507, upload-time = "2025-01-24T11:17:34.182Z" }, + { url = "https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl", hash = "sha256:dfb6d332576f136ec740296c7e8bb8c8a7125044e7c6da30744718880cdd059d", size = 71507, upload_time = "2025-01-24T11:17:34.182Z" }, ] [[package]] name = "text-unidecode" version = "1.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload-time = "2019-08-30T21:36:45.405Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload_time = "2019-08-30T21:36:45.405Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload-time = "2019-08-30T21:37:03.543Z" }, + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload_time = "2019-08-30T21:37:03.543Z" }, ] [[package]] @@ -2123,9 +2123,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload_time = "2024-11-24T20:12:22.481Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload_time = "2024-11-24T20:12:19.698Z" }, ] [[package]] @@ -2138,18 +2138,18 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/1a/5f36851f439884bcfe8539f6a20ff7516e7b60f319bbaf69a90dc35cc2eb/typer-0.15.3.tar.gz", hash = "sha256:818873625d0569653438316567861899f7e9972f2e6e0c16dab608345ced713c", size = 101641, upload-time = "2025-04-28T21:40:59.204Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/1a/5f36851f439884bcfe8539f6a20ff7516e7b60f319bbaf69a90dc35cc2eb/typer-0.15.3.tar.gz", hash = "sha256:818873625d0569653438316567861899f7e9972f2e6e0c16dab608345ced713c", size = 101641, upload_time = "2025-04-28T21:40:59.204Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/20/9d953de6f4367163d23ec823200eb3ecb0050a2609691e512c8b95827a9b/typer-0.15.3-py3-none-any.whl", hash = "sha256:c86a65ad77ca531f03de08d1b9cb67cd09ad02ddddf4b34745b5008f43b239bd", size = 45253, upload-time = "2025-04-28T21:40:56.269Z" }, + { url = "https://files.pythonhosted.org/packages/48/20/9d953de6f4367163d23ec823200eb3ecb0050a2609691e512c8b95827a9b/typer-0.15.3-py3-none-any.whl", hash = "sha256:c86a65ad77ca531f03de08d1b9cb67cd09ad02ddddf4b34745b5008f43b239bd", size = 45253, upload_time = "2025-04-28T21:40:56.269Z" }, ] [[package]] name = "typing-extensions" version = "4.13.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload_time = "2025-04-10T14:19:05.416Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload_time = "2025-04-10T14:19:03.967Z" }, ] [[package]] @@ -2159,18 +2159,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222, upload-time = "2025-02-25T17:27:59.638Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222, upload_time = "2025-02-25T17:27:59.638Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125, upload-time = "2025-02-25T17:27:57.754Z" }, + { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125, upload_time = "2025-02-25T17:27:57.754Z" }, ] [[package]] name = "tzdata" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload_time = "2025-03-23T13:54:43.652Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload_time = "2025-03-23T13:54:41.845Z" }, ] [[package]] @@ -2180,27 +2180,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tzdata", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload-time = "2025-03-05T21:17:41.549Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload_time = "2025-03-05T21:17:41.549Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d", size = 18026, upload-time = "2025-03-05T21:17:39.857Z" }, + { url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d", size = 18026, upload_time = "2025-03-05T21:17:39.857Z" }, ] [[package]] name = "uritemplate" version = "4.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d2/5a/4742fdba39cd02a56226815abfa72fe0aa81c33bed16ed045647d6000eba/uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0", size = 273898, upload-time = "2021-10-13T11:15:14.84Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/5a/4742fdba39cd02a56226815abfa72fe0aa81c33bed16ed045647d6000eba/uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0", size = 273898, upload_time = "2021-10-13T11:15:14.84Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c0/7461b49cd25aeece13766f02ee576d1db528f1c37ce69aee300e075b485b/uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e", size = 10356, upload-time = "2021-10-13T11:15:12.316Z" }, + { url = "https://files.pythonhosted.org/packages/81/c0/7461b49cd25aeece13766f02ee576d1db528f1c37ce69aee300e075b485b/uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e", size = 10356, upload_time = "2021-10-13T11:15:12.316Z" }, ] [[package]] name = "urllib3" version = "1.26.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/e8/6ff5e6bc22095cfc59b6ea711b687e2b7ed4bdb373f7eeec370a97d7392f/urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32", size = 307380, upload-time = "2024-08-29T15:43:11.37Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/e8/6ff5e6bc22095cfc59b6ea711b687e2b7ed4bdb373f7eeec370a97d7392f/urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32", size = 307380, upload_time = "2024-08-29T15:43:11.37Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/cf/8435d5a7159e2a9c83a95896ed596f68cf798005fe107cc655b5c5c14704/urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e", size = 144225, upload-time = "2024-08-29T15:43:08.921Z" }, + { url = "https://files.pythonhosted.org/packages/33/cf/8435d5a7159e2a9c83a95896ed596f68cf798005fe107cc655b5c5c14704/urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e", size = 144225, upload_time = "2024-08-29T15:43:08.921Z" }, ] [[package]] @@ -2211,9 +2211,9 @@ dependencies = [ { name = "click" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815, upload-time = "2025-04-19T06:02:50.101Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815, upload_time = "2025-04-19T06:02:50.101Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483, upload-time = "2025-04-19T06:02:48.42Z" }, + { url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483, upload_time = "2025-04-19T06:02:48.42Z" }, ] [package.optional-dependencies] @@ -2231,26 +2231,26 @@ standard = [ name = "uvloop" version = "0.21.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741, upload-time = "2024-10-14T23:38:35.489Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/57/a7/4cf0334105c1160dd6819f3297f8700fda7fc30ab4f61fbf3e725acbc7cc/uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8", size = 1447410, upload-time = "2024-10-14T23:37:33.612Z" }, - { url = "https://files.pythonhosted.org/packages/8c/7c/1517b0bbc2dbe784b563d6ab54f2ef88c890fdad77232c98ed490aa07132/uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0", size = 805476, upload-time = "2024-10-14T23:37:36.11Z" }, - { url = "https://files.pythonhosted.org/packages/ee/ea/0bfae1aceb82a503f358d8d2fa126ca9dbdb2ba9c7866974faec1cb5875c/uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e", size = 3960855, upload-time = "2024-10-14T23:37:37.683Z" }, - { url = "https://files.pythonhosted.org/packages/8a/ca/0864176a649838b838f36d44bf31c451597ab363b60dc9e09c9630619d41/uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb", size = 3973185, upload-time = "2024-10-14T23:37:40.226Z" }, - { url = "https://files.pythonhosted.org/packages/30/bf/08ad29979a936d63787ba47a540de2132169f140d54aa25bc8c3df3e67f4/uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6", size = 3820256, upload-time = "2024-10-14T23:37:42.839Z" }, - { url = "https://files.pythonhosted.org/packages/da/e2/5cf6ef37e3daf2f06e651aae5ea108ad30df3cb269102678b61ebf1fdf42/uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d", size = 3937323, upload-time = "2024-10-14T23:37:45.337Z" }, - { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284, upload-time = "2024-10-14T23:37:47.833Z" }, - { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349, upload-time = "2024-10-14T23:37:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089, upload-time = "2024-10-14T23:37:51.703Z" }, - { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770, upload-time = "2024-10-14T23:37:54.122Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321, upload-time = "2024-10-14T23:37:55.766Z" }, - { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022, upload-time = "2024-10-14T23:37:58.195Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123, upload-time = "2024-10-14T23:38:00.688Z" }, - { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325, upload-time = "2024-10-14T23:38:02.309Z" }, - { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806, upload-time = "2024-10-14T23:38:04.711Z" }, - { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068, upload-time = "2024-10-14T23:38:06.385Z" }, - { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428, upload-time = "2024-10-14T23:38:08.416Z" }, - { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018, upload-time = "2024-10-14T23:38:10.888Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741, upload_time = "2024-10-14T23:38:35.489Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/a7/4cf0334105c1160dd6819f3297f8700fda7fc30ab4f61fbf3e725acbc7cc/uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8", size = 1447410, upload_time = "2024-10-14T23:37:33.612Z" }, + { url = "https://files.pythonhosted.org/packages/8c/7c/1517b0bbc2dbe784b563d6ab54f2ef88c890fdad77232c98ed490aa07132/uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0", size = 805476, upload_time = "2024-10-14T23:37:36.11Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ea/0bfae1aceb82a503f358d8d2fa126ca9dbdb2ba9c7866974faec1cb5875c/uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e", size = 3960855, upload_time = "2024-10-14T23:37:37.683Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ca/0864176a649838b838f36d44bf31c451597ab363b60dc9e09c9630619d41/uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb", size = 3973185, upload_time = "2024-10-14T23:37:40.226Z" }, + { url = "https://files.pythonhosted.org/packages/30/bf/08ad29979a936d63787ba47a540de2132169f140d54aa25bc8c3df3e67f4/uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6", size = 3820256, upload_time = "2024-10-14T23:37:42.839Z" }, + { url = "https://files.pythonhosted.org/packages/da/e2/5cf6ef37e3daf2f06e651aae5ea108ad30df3cb269102678b61ebf1fdf42/uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d", size = 3937323, upload_time = "2024-10-14T23:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284, upload_time = "2024-10-14T23:37:47.833Z" }, + { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349, upload_time = "2024-10-14T23:37:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089, upload_time = "2024-10-14T23:37:51.703Z" }, + { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770, upload_time = "2024-10-14T23:37:54.122Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321, upload_time = "2024-10-14T23:37:55.766Z" }, + { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022, upload_time = "2024-10-14T23:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123, upload_time = "2024-10-14T23:38:00.688Z" }, + { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325, upload_time = "2024-10-14T23:38:02.309Z" }, + { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806, upload_time = "2024-10-14T23:38:04.711Z" }, + { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068, upload_time = "2024-10-14T23:38:06.385Z" }, + { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428, upload_time = "2024-10-14T23:38:08.416Z" }, + { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018, upload_time = "2024-10-14T23:38:10.888Z" }, ] [[package]] @@ -2260,141 +2260,141 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/03/e2/8ed598c42057de7aa5d97c472254af4906ff0a59a66699d426fc9ef795d7/watchfiles-1.0.5.tar.gz", hash = "sha256:b7529b5dcc114679d43827d8c35a07c493ad6f083633d573d81c660abc5979e9", size = 94537, upload-time = "2025-04-08T10:36:26.722Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/39/f4/41b591f59021786ef517e1cdc3b510383551846703e03f204827854a96f8/watchfiles-1.0.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:237f9be419e977a0f8f6b2e7b0475ababe78ff1ab06822df95d914a945eac827", size = 405336, upload-time = "2025-04-08T10:34:59.359Z" }, - { url = "https://files.pythonhosted.org/packages/ae/06/93789c135be4d6d0e4f63e96eea56dc54050b243eacc28439a26482b5235/watchfiles-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0da39ff917af8b27a4bdc5a97ac577552a38aac0d260a859c1517ea3dc1a7c4", size = 395977, upload-time = "2025-04-08T10:35:00.522Z" }, - { url = "https://files.pythonhosted.org/packages/d2/db/1cd89bd83728ca37054512d4d35ab69b5f12b8aa2ac9be3b0276b3bf06cc/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfcb3952350e95603f232a7a15f6c5f86c5375e46f0bd4ae70d43e3e063c13d", size = 455232, upload-time = "2025-04-08T10:35:01.698Z" }, - { url = "https://files.pythonhosted.org/packages/40/90/d8a4d44ffe960517e487c9c04f77b06b8abf05eb680bed71c82b5f2cad62/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68b2dddba7a4e6151384e252a5632efcaa9bc5d1c4b567f3cb621306b2ca9f63", size = 459151, upload-time = "2025-04-08T10:35:03.358Z" }, - { url = "https://files.pythonhosted.org/packages/6c/da/267a1546f26465dead1719caaba3ce660657f83c9d9c052ba98fb8856e13/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95cf944fcfc394c5f9de794ce581914900f82ff1f855326f25ebcf24d5397418", size = 489054, upload-time = "2025-04-08T10:35:04.561Z" }, - { url = "https://files.pythonhosted.org/packages/b1/31/33850dfd5c6efb6f27d2465cc4c6b27c5a6f5ed53c6fa63b7263cf5f60f6/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf6cd9f83d7c023b1aba15d13f705ca7b7d38675c121f3cc4a6e25bd0857ee9", size = 523955, upload-time = "2025-04-08T10:35:05.786Z" }, - { url = "https://files.pythonhosted.org/packages/09/84/b7d7b67856efb183a421f1416b44ca975cb2ea6c4544827955dfb01f7dc2/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:852de68acd6212cd6d33edf21e6f9e56e5d98c6add46f48244bd479d97c967c6", size = 502234, upload-time = "2025-04-08T10:35:07.187Z" }, - { url = "https://files.pythonhosted.org/packages/71/87/6dc5ec6882a2254cfdd8b0718b684504e737273903b65d7338efaba08b52/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5730f3aa35e646103b53389d5bc77edfbf578ab6dab2e005142b5b80a35ef25", size = 454750, upload-time = "2025-04-08T10:35:08.859Z" }, - { url = "https://files.pythonhosted.org/packages/3d/6c/3786c50213451a0ad15170d091570d4a6554976cf0df19878002fc96075a/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:18b3bd29954bc4abeeb4e9d9cf0b30227f0f206c86657674f544cb032296acd5", size = 631591, upload-time = "2025-04-08T10:35:10.64Z" }, - { url = "https://files.pythonhosted.org/packages/1b/b3/1427425ade4e359a0deacce01a47a26024b2ccdb53098f9d64d497f6684c/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba5552a1b07c8edbf197055bc9d518b8f0d98a1c6a73a293bc0726dce068ed01", size = 625370, upload-time = "2025-04-08T10:35:12.412Z" }, - { url = "https://files.pythonhosted.org/packages/15/ba/f60e053b0b5b8145d682672024aa91370a29c5c921a88977eb565de34086/watchfiles-1.0.5-cp311-cp311-win32.whl", hash = "sha256:2f1fefb2e90e89959447bc0420fddd1e76f625784340d64a2f7d5983ef9ad246", size = 277791, upload-time = "2025-04-08T10:35:13.719Z" }, - { url = "https://files.pythonhosted.org/packages/50/ed/7603c4e164225c12c0d4e8700b64bb00e01a6c4eeea372292a3856be33a4/watchfiles-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:b6e76ceb1dd18c8e29c73f47d41866972e891fc4cc7ba014f487def72c1cf096", size = 291622, upload-time = "2025-04-08T10:35:15.071Z" }, - { url = "https://files.pythonhosted.org/packages/a2/c2/99bb7c96b4450e36877fde33690ded286ff555b5a5c1d925855d556968a1/watchfiles-1.0.5-cp311-cp311-win_arm64.whl", hash = "sha256:266710eb6fddc1f5e51843c70e3bebfb0f5e77cf4f27129278c70554104d19ed", size = 283699, upload-time = "2025-04-08T10:35:16.732Z" }, - { url = "https://files.pythonhosted.org/packages/2a/8c/4f0b9bdb75a1bfbd9c78fad7d8854369283f74fe7cf03eb16be77054536d/watchfiles-1.0.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5eb568c2aa6018e26da9e6c86f3ec3fd958cee7f0311b35c2630fa4217d17f2", size = 401511, upload-time = "2025-04-08T10:35:17.956Z" }, - { url = "https://files.pythonhosted.org/packages/dc/4e/7e15825def77f8bd359b6d3f379f0c9dac4eb09dd4ddd58fd7d14127179c/watchfiles-1.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a04059f4923ce4e856b4b4e5e783a70f49d9663d22a4c3b3298165996d1377f", size = 392715, upload-time = "2025-04-08T10:35:19.202Z" }, - { url = "https://files.pythonhosted.org/packages/58/65/b72fb817518728e08de5840d5d38571466c1b4a3f724d190cec909ee6f3f/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e380c89983ce6e6fe2dd1e1921b9952fb4e6da882931abd1824c092ed495dec", size = 454138, upload-time = "2025-04-08T10:35:20.586Z" }, - { url = "https://files.pythonhosted.org/packages/3e/a4/86833fd2ea2e50ae28989f5950b5c3f91022d67092bfec08f8300d8b347b/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fe43139b2c0fdc4a14d4f8d5b5d967f7a2777fd3d38ecf5b1ec669b0d7e43c21", size = 458592, upload-time = "2025-04-08T10:35:21.87Z" }, - { url = "https://files.pythonhosted.org/packages/38/7e/42cb8df8be9a37e50dd3a818816501cf7a20d635d76d6bd65aae3dbbff68/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee0822ce1b8a14fe5a066f93edd20aada932acfe348bede8aa2149f1a4489512", size = 487532, upload-time = "2025-04-08T10:35:23.143Z" }, - { url = "https://files.pythonhosted.org/packages/fc/fd/13d26721c85d7f3df6169d8b495fcac8ab0dc8f0945ebea8845de4681dab/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0dbcb1c2d8f2ab6e0a81c6699b236932bd264d4cef1ac475858d16c403de74d", size = 522865, upload-time = "2025-04-08T10:35:24.702Z" }, - { url = "https://files.pythonhosted.org/packages/a1/0d/7f9ae243c04e96c5455d111e21b09087d0eeaf9a1369e13a01c7d3d82478/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a2014a2b18ad3ca53b1f6c23f8cd94a18ce930c1837bd891262c182640eb40a6", size = 499887, upload-time = "2025-04-08T10:35:25.969Z" }, - { url = "https://files.pythonhosted.org/packages/8e/0f/a257766998e26aca4b3acf2ae97dff04b57071e991a510857d3799247c67/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f6ae86d5cb647bf58f9f655fcf577f713915a5d69057a0371bc257e2553234", size = 454498, upload-time = "2025-04-08T10:35:27.353Z" }, - { url = "https://files.pythonhosted.org/packages/81/79/8bf142575a03e0af9c3d5f8bcae911ee6683ae93a625d349d4ecf4c8f7df/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1a7bac2bde1d661fb31f4d4e8e539e178774b76db3c2c17c4bb3e960a5de07a2", size = 630663, upload-time = "2025-04-08T10:35:28.685Z" }, - { url = "https://files.pythonhosted.org/packages/f1/80/abe2e79f610e45c63a70d271caea90c49bbf93eb00fa947fa9b803a1d51f/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ab626da2fc1ac277bbf752446470b367f84b50295264d2d313e28dc4405d663", size = 625410, upload-time = "2025-04-08T10:35:30.42Z" }, - { url = "https://files.pythonhosted.org/packages/91/6f/bc7fbecb84a41a9069c2c6eb6319f7f7df113adf113e358c57fc1aff7ff5/watchfiles-1.0.5-cp312-cp312-win32.whl", hash = "sha256:9f4571a783914feda92018ef3901dab8caf5b029325b5fe4558c074582815249", size = 277965, upload-time = "2025-04-08T10:35:32.023Z" }, - { url = "https://files.pythonhosted.org/packages/99/a5/bf1c297ea6649ec59e935ab311f63d8af5faa8f0b86993e3282b984263e3/watchfiles-1.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:360a398c3a19672cf93527f7e8d8b60d8275119c5d900f2e184d32483117a705", size = 291693, upload-time = "2025-04-08T10:35:33.225Z" }, - { url = "https://files.pythonhosted.org/packages/7f/7b/fd01087cc21db5c47e5beae507b87965db341cce8a86f9eb12bf5219d4e0/watchfiles-1.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:1a2902ede862969077b97523987c38db28abbe09fb19866e711485d9fbf0d417", size = 283287, upload-time = "2025-04-08T10:35:34.568Z" }, - { url = "https://files.pythonhosted.org/packages/c7/62/435766874b704f39b2fecd8395a29042db2b5ec4005bd34523415e9bd2e0/watchfiles-1.0.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0b289572c33a0deae62daa57e44a25b99b783e5f7aed81b314232b3d3c81a11d", size = 401531, upload-time = "2025-04-08T10:35:35.792Z" }, - { url = "https://files.pythonhosted.org/packages/6e/a6/e52a02c05411b9cb02823e6797ef9bbba0bfaf1bb627da1634d44d8af833/watchfiles-1.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a056c2f692d65bf1e99c41045e3bdcaea3cb9e6b5a53dcaf60a5f3bd95fc9763", size = 392417, upload-time = "2025-04-08T10:35:37.048Z" }, - { url = "https://files.pythonhosted.org/packages/3f/53/c4af6819770455932144e0109d4854437769672d7ad897e76e8e1673435d/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9dca99744991fc9850d18015c4f0438865414e50069670f5f7eee08340d8b40", size = 453423, upload-time = "2025-04-08T10:35:38.357Z" }, - { url = "https://files.pythonhosted.org/packages/cb/d1/8e88df58bbbf819b8bc5cfbacd3c79e01b40261cad0fc84d1e1ebd778a07/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:894342d61d355446d02cd3988a7326af344143eb33a2fd5d38482a92072d9563", size = 458185, upload-time = "2025-04-08T10:35:39.708Z" }, - { url = "https://files.pythonhosted.org/packages/ff/70/fffaa11962dd5429e47e478a18736d4e42bec42404f5ee3b92ef1b87ad60/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab44e1580924d1ffd7b3938e02716d5ad190441965138b4aa1d1f31ea0877f04", size = 486696, upload-time = "2025-04-08T10:35:41.469Z" }, - { url = "https://files.pythonhosted.org/packages/39/db/723c0328e8b3692d53eb273797d9a08be6ffb1d16f1c0ba2bdbdc2a3852c/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6f9367b132078b2ceb8d066ff6c93a970a18c3029cea37bfd7b2d3dd2e5db8f", size = 522327, upload-time = "2025-04-08T10:35:43.289Z" }, - { url = "https://files.pythonhosted.org/packages/cd/05/9fccc43c50c39a76b68343484b9da7b12d42d0859c37c61aec018c967a32/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2e55a9b162e06e3f862fb61e399fe9f05d908d019d87bf5b496a04ef18a970a", size = 499741, upload-time = "2025-04-08T10:35:44.574Z" }, - { url = "https://files.pythonhosted.org/packages/23/14/499e90c37fa518976782b10a18b18db9f55ea73ca14641615056f8194bb3/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0125f91f70e0732a9f8ee01e49515c35d38ba48db507a50c5bdcad9503af5827", size = 453995, upload-time = "2025-04-08T10:35:46.336Z" }, - { url = "https://files.pythonhosted.org/packages/61/d9/f75d6840059320df5adecd2c687fbc18960a7f97b55c300d20f207d48aef/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:13bb21f8ba3248386337c9fa51c528868e6c34a707f729ab041c846d52a0c69a", size = 629693, upload-time = "2025-04-08T10:35:48.161Z" }, - { url = "https://files.pythonhosted.org/packages/fc/17/180ca383f5061b61406477218c55d66ec118e6c0c51f02d8142895fcf0a9/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:839ebd0df4a18c5b3c1b890145b5a3f5f64063c2a0d02b13c76d78fe5de34936", size = 624677, upload-time = "2025-04-08T10:35:49.65Z" }, - { url = "https://files.pythonhosted.org/packages/bf/15/714d6ef307f803f236d69ee9d421763707899d6298d9f3183e55e366d9af/watchfiles-1.0.5-cp313-cp313-win32.whl", hash = "sha256:4a8ec1e4e16e2d5bafc9ba82f7aaecfeec990ca7cd27e84fb6f191804ed2fcfc", size = 277804, upload-time = "2025-04-08T10:35:51.093Z" }, - { url = "https://files.pythonhosted.org/packages/a8/b4/c57b99518fadf431f3ef47a610839e46e5f8abf9814f969859d1c65c02c7/watchfiles-1.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:f436601594f15bf406518af922a89dcaab416568edb6f65c4e5bbbad1ea45c11", size = 291087, upload-time = "2025-04-08T10:35:52.458Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/03/e2/8ed598c42057de7aa5d97c472254af4906ff0a59a66699d426fc9ef795d7/watchfiles-1.0.5.tar.gz", hash = "sha256:b7529b5dcc114679d43827d8c35a07c493ad6f083633d573d81c660abc5979e9", size = 94537, upload_time = "2025-04-08T10:36:26.722Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/f4/41b591f59021786ef517e1cdc3b510383551846703e03f204827854a96f8/watchfiles-1.0.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:237f9be419e977a0f8f6b2e7b0475ababe78ff1ab06822df95d914a945eac827", size = 405336, upload_time = "2025-04-08T10:34:59.359Z" }, + { url = "https://files.pythonhosted.org/packages/ae/06/93789c135be4d6d0e4f63e96eea56dc54050b243eacc28439a26482b5235/watchfiles-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0da39ff917af8b27a4bdc5a97ac577552a38aac0d260a859c1517ea3dc1a7c4", size = 395977, upload_time = "2025-04-08T10:35:00.522Z" }, + { url = "https://files.pythonhosted.org/packages/d2/db/1cd89bd83728ca37054512d4d35ab69b5f12b8aa2ac9be3b0276b3bf06cc/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfcb3952350e95603f232a7a15f6c5f86c5375e46f0bd4ae70d43e3e063c13d", size = 455232, upload_time = "2025-04-08T10:35:01.698Z" }, + { url = "https://files.pythonhosted.org/packages/40/90/d8a4d44ffe960517e487c9c04f77b06b8abf05eb680bed71c82b5f2cad62/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68b2dddba7a4e6151384e252a5632efcaa9bc5d1c4b567f3cb621306b2ca9f63", size = 459151, upload_time = "2025-04-08T10:35:03.358Z" }, + { url = "https://files.pythonhosted.org/packages/6c/da/267a1546f26465dead1719caaba3ce660657f83c9d9c052ba98fb8856e13/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95cf944fcfc394c5f9de794ce581914900f82ff1f855326f25ebcf24d5397418", size = 489054, upload_time = "2025-04-08T10:35:04.561Z" }, + { url = "https://files.pythonhosted.org/packages/b1/31/33850dfd5c6efb6f27d2465cc4c6b27c5a6f5ed53c6fa63b7263cf5f60f6/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf6cd9f83d7c023b1aba15d13f705ca7b7d38675c121f3cc4a6e25bd0857ee9", size = 523955, upload_time = "2025-04-08T10:35:05.786Z" }, + { url = "https://files.pythonhosted.org/packages/09/84/b7d7b67856efb183a421f1416b44ca975cb2ea6c4544827955dfb01f7dc2/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:852de68acd6212cd6d33edf21e6f9e56e5d98c6add46f48244bd479d97c967c6", size = 502234, upload_time = "2025-04-08T10:35:07.187Z" }, + { url = "https://files.pythonhosted.org/packages/71/87/6dc5ec6882a2254cfdd8b0718b684504e737273903b65d7338efaba08b52/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5730f3aa35e646103b53389d5bc77edfbf578ab6dab2e005142b5b80a35ef25", size = 454750, upload_time = "2025-04-08T10:35:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6c/3786c50213451a0ad15170d091570d4a6554976cf0df19878002fc96075a/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:18b3bd29954bc4abeeb4e9d9cf0b30227f0f206c86657674f544cb032296acd5", size = 631591, upload_time = "2025-04-08T10:35:10.64Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b3/1427425ade4e359a0deacce01a47a26024b2ccdb53098f9d64d497f6684c/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba5552a1b07c8edbf197055bc9d518b8f0d98a1c6a73a293bc0726dce068ed01", size = 625370, upload_time = "2025-04-08T10:35:12.412Z" }, + { url = "https://files.pythonhosted.org/packages/15/ba/f60e053b0b5b8145d682672024aa91370a29c5c921a88977eb565de34086/watchfiles-1.0.5-cp311-cp311-win32.whl", hash = "sha256:2f1fefb2e90e89959447bc0420fddd1e76f625784340d64a2f7d5983ef9ad246", size = 277791, upload_time = "2025-04-08T10:35:13.719Z" }, + { url = "https://files.pythonhosted.org/packages/50/ed/7603c4e164225c12c0d4e8700b64bb00e01a6c4eeea372292a3856be33a4/watchfiles-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:b6e76ceb1dd18c8e29c73f47d41866972e891fc4cc7ba014f487def72c1cf096", size = 291622, upload_time = "2025-04-08T10:35:15.071Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c2/99bb7c96b4450e36877fde33690ded286ff555b5a5c1d925855d556968a1/watchfiles-1.0.5-cp311-cp311-win_arm64.whl", hash = "sha256:266710eb6fddc1f5e51843c70e3bebfb0f5e77cf4f27129278c70554104d19ed", size = 283699, upload_time = "2025-04-08T10:35:16.732Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8c/4f0b9bdb75a1bfbd9c78fad7d8854369283f74fe7cf03eb16be77054536d/watchfiles-1.0.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5eb568c2aa6018e26da9e6c86f3ec3fd958cee7f0311b35c2630fa4217d17f2", size = 401511, upload_time = "2025-04-08T10:35:17.956Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4e/7e15825def77f8bd359b6d3f379f0c9dac4eb09dd4ddd58fd7d14127179c/watchfiles-1.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a04059f4923ce4e856b4b4e5e783a70f49d9663d22a4c3b3298165996d1377f", size = 392715, upload_time = "2025-04-08T10:35:19.202Z" }, + { url = "https://files.pythonhosted.org/packages/58/65/b72fb817518728e08de5840d5d38571466c1b4a3f724d190cec909ee6f3f/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e380c89983ce6e6fe2dd1e1921b9952fb4e6da882931abd1824c092ed495dec", size = 454138, upload_time = "2025-04-08T10:35:20.586Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a4/86833fd2ea2e50ae28989f5950b5c3f91022d67092bfec08f8300d8b347b/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fe43139b2c0fdc4a14d4f8d5b5d967f7a2777fd3d38ecf5b1ec669b0d7e43c21", size = 458592, upload_time = "2025-04-08T10:35:21.87Z" }, + { url = "https://files.pythonhosted.org/packages/38/7e/42cb8df8be9a37e50dd3a818816501cf7a20d635d76d6bd65aae3dbbff68/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee0822ce1b8a14fe5a066f93edd20aada932acfe348bede8aa2149f1a4489512", size = 487532, upload_time = "2025-04-08T10:35:23.143Z" }, + { url = "https://files.pythonhosted.org/packages/fc/fd/13d26721c85d7f3df6169d8b495fcac8ab0dc8f0945ebea8845de4681dab/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0dbcb1c2d8f2ab6e0a81c6699b236932bd264d4cef1ac475858d16c403de74d", size = 522865, upload_time = "2025-04-08T10:35:24.702Z" }, + { url = "https://files.pythonhosted.org/packages/a1/0d/7f9ae243c04e96c5455d111e21b09087d0eeaf9a1369e13a01c7d3d82478/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a2014a2b18ad3ca53b1f6c23f8cd94a18ce930c1837bd891262c182640eb40a6", size = 499887, upload_time = "2025-04-08T10:35:25.969Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0f/a257766998e26aca4b3acf2ae97dff04b57071e991a510857d3799247c67/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f6ae86d5cb647bf58f9f655fcf577f713915a5d69057a0371bc257e2553234", size = 454498, upload_time = "2025-04-08T10:35:27.353Z" }, + { url = "https://files.pythonhosted.org/packages/81/79/8bf142575a03e0af9c3d5f8bcae911ee6683ae93a625d349d4ecf4c8f7df/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1a7bac2bde1d661fb31f4d4e8e539e178774b76db3c2c17c4bb3e960a5de07a2", size = 630663, upload_time = "2025-04-08T10:35:28.685Z" }, + { url = "https://files.pythonhosted.org/packages/f1/80/abe2e79f610e45c63a70d271caea90c49bbf93eb00fa947fa9b803a1d51f/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ab626da2fc1ac277bbf752446470b367f84b50295264d2d313e28dc4405d663", size = 625410, upload_time = "2025-04-08T10:35:30.42Z" }, + { url = "https://files.pythonhosted.org/packages/91/6f/bc7fbecb84a41a9069c2c6eb6319f7f7df113adf113e358c57fc1aff7ff5/watchfiles-1.0.5-cp312-cp312-win32.whl", hash = "sha256:9f4571a783914feda92018ef3901dab8caf5b029325b5fe4558c074582815249", size = 277965, upload_time = "2025-04-08T10:35:32.023Z" }, + { url = "https://files.pythonhosted.org/packages/99/a5/bf1c297ea6649ec59e935ab311f63d8af5faa8f0b86993e3282b984263e3/watchfiles-1.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:360a398c3a19672cf93527f7e8d8b60d8275119c5d900f2e184d32483117a705", size = 291693, upload_time = "2025-04-08T10:35:33.225Z" }, + { url = "https://files.pythonhosted.org/packages/7f/7b/fd01087cc21db5c47e5beae507b87965db341cce8a86f9eb12bf5219d4e0/watchfiles-1.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:1a2902ede862969077b97523987c38db28abbe09fb19866e711485d9fbf0d417", size = 283287, upload_time = "2025-04-08T10:35:34.568Z" }, + { url = "https://files.pythonhosted.org/packages/c7/62/435766874b704f39b2fecd8395a29042db2b5ec4005bd34523415e9bd2e0/watchfiles-1.0.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0b289572c33a0deae62daa57e44a25b99b783e5f7aed81b314232b3d3c81a11d", size = 401531, upload_time = "2025-04-08T10:35:35.792Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a6/e52a02c05411b9cb02823e6797ef9bbba0bfaf1bb627da1634d44d8af833/watchfiles-1.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a056c2f692d65bf1e99c41045e3bdcaea3cb9e6b5a53dcaf60a5f3bd95fc9763", size = 392417, upload_time = "2025-04-08T10:35:37.048Z" }, + { url = "https://files.pythonhosted.org/packages/3f/53/c4af6819770455932144e0109d4854437769672d7ad897e76e8e1673435d/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9dca99744991fc9850d18015c4f0438865414e50069670f5f7eee08340d8b40", size = 453423, upload_time = "2025-04-08T10:35:38.357Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d1/8e88df58bbbf819b8bc5cfbacd3c79e01b40261cad0fc84d1e1ebd778a07/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:894342d61d355446d02cd3988a7326af344143eb33a2fd5d38482a92072d9563", size = 458185, upload_time = "2025-04-08T10:35:39.708Z" }, + { url = "https://files.pythonhosted.org/packages/ff/70/fffaa11962dd5429e47e478a18736d4e42bec42404f5ee3b92ef1b87ad60/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab44e1580924d1ffd7b3938e02716d5ad190441965138b4aa1d1f31ea0877f04", size = 486696, upload_time = "2025-04-08T10:35:41.469Z" }, + { url = "https://files.pythonhosted.org/packages/39/db/723c0328e8b3692d53eb273797d9a08be6ffb1d16f1c0ba2bdbdc2a3852c/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6f9367b132078b2ceb8d066ff6c93a970a18c3029cea37bfd7b2d3dd2e5db8f", size = 522327, upload_time = "2025-04-08T10:35:43.289Z" }, + { url = "https://files.pythonhosted.org/packages/cd/05/9fccc43c50c39a76b68343484b9da7b12d42d0859c37c61aec018c967a32/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2e55a9b162e06e3f862fb61e399fe9f05d908d019d87bf5b496a04ef18a970a", size = 499741, upload_time = "2025-04-08T10:35:44.574Z" }, + { url = "https://files.pythonhosted.org/packages/23/14/499e90c37fa518976782b10a18b18db9f55ea73ca14641615056f8194bb3/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0125f91f70e0732a9f8ee01e49515c35d38ba48db507a50c5bdcad9503af5827", size = 453995, upload_time = "2025-04-08T10:35:46.336Z" }, + { url = "https://files.pythonhosted.org/packages/61/d9/f75d6840059320df5adecd2c687fbc18960a7f97b55c300d20f207d48aef/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:13bb21f8ba3248386337c9fa51c528868e6c34a707f729ab041c846d52a0c69a", size = 629693, upload_time = "2025-04-08T10:35:48.161Z" }, + { url = "https://files.pythonhosted.org/packages/fc/17/180ca383f5061b61406477218c55d66ec118e6c0c51f02d8142895fcf0a9/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:839ebd0df4a18c5b3c1b890145b5a3f5f64063c2a0d02b13c76d78fe5de34936", size = 624677, upload_time = "2025-04-08T10:35:49.65Z" }, + { url = "https://files.pythonhosted.org/packages/bf/15/714d6ef307f803f236d69ee9d421763707899d6298d9f3183e55e366d9af/watchfiles-1.0.5-cp313-cp313-win32.whl", hash = "sha256:4a8ec1e4e16e2d5bafc9ba82f7aaecfeec990ca7cd27e84fb6f191804ed2fcfc", size = 277804, upload_time = "2025-04-08T10:35:51.093Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b4/c57b99518fadf431f3ef47a610839e46e5f8abf9814f969859d1c65c02c7/watchfiles-1.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:f436601594f15bf406518af922a89dcaab416568edb6f65c4e5bbbad1ea45c11", size = 291087, upload_time = "2025-04-08T10:35:52.458Z" }, ] [[package]] name = "websockets" version = "15.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload-time = "2025-03-05T20:01:56.276Z" }, - { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload-time = "2025-03-05T20:01:57.563Z" }, - { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload-time = "2025-03-05T20:01:59.063Z" }, - { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload-time = "2025-03-05T20:02:00.305Z" }, - { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883, upload-time = "2025-03-05T20:02:03.148Z" }, - { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload-time = "2025-03-05T20:02:05.29Z" }, - { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload-time = "2025-03-05T20:02:07.458Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958, upload-time = "2025-03-05T20:02:09.842Z" }, - { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload-time = "2025-03-05T20:02:11.968Z" }, - { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388, upload-time = "2025-03-05T20:02:13.32Z" }, - { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828, upload-time = "2025-03-05T20:02:14.585Z" }, - { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload-time = "2025-03-05T20:02:16.706Z" }, - { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload-time = "2025-03-05T20:02:18.832Z" }, - { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload-time = "2025-03-05T20:02:20.187Z" }, - { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload-time = "2025-03-05T20:02:22.286Z" }, - { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096, upload-time = "2025-03-05T20:02:24.368Z" }, - { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload-time = "2025-03-05T20:02:25.669Z" }, - { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload-time = "2025-03-05T20:02:26.99Z" }, - { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165, upload-time = "2025-03-05T20:02:30.291Z" }, - { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload-time = "2025-03-05T20:02:31.634Z" }, - { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395, upload-time = "2025-03-05T20:02:33.017Z" }, - { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841, upload-time = "2025-03-05T20:02:34.498Z" }, - { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, - { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, - { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, - { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, - { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, - { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, - { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, - { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, - { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload_time = "2025-03-05T20:03:41.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload_time = "2025-03-05T20:01:56.276Z" }, + { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload_time = "2025-03-05T20:01:57.563Z" }, + { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload_time = "2025-03-05T20:01:59.063Z" }, + { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload_time = "2025-03-05T20:02:00.305Z" }, + { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883, upload_time = "2025-03-05T20:02:03.148Z" }, + { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload_time = "2025-03-05T20:02:05.29Z" }, + { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload_time = "2025-03-05T20:02:07.458Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958, upload_time = "2025-03-05T20:02:09.842Z" }, + { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload_time = "2025-03-05T20:02:11.968Z" }, + { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388, upload_time = "2025-03-05T20:02:13.32Z" }, + { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828, upload_time = "2025-03-05T20:02:14.585Z" }, + { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload_time = "2025-03-05T20:02:16.706Z" }, + { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload_time = "2025-03-05T20:02:18.832Z" }, + { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload_time = "2025-03-05T20:02:20.187Z" }, + { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload_time = "2025-03-05T20:02:22.286Z" }, + { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096, upload_time = "2025-03-05T20:02:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload_time = "2025-03-05T20:02:25.669Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload_time = "2025-03-05T20:02:26.99Z" }, + { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165, upload_time = "2025-03-05T20:02:30.291Z" }, + { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload_time = "2025-03-05T20:02:31.634Z" }, + { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395, upload_time = "2025-03-05T20:02:33.017Z" }, + { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841, upload_time = "2025-03-05T20:02:34.498Z" }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload_time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload_time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload_time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload_time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload_time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload_time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload_time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload_time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload_time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload_time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload_time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload_time = "2025-03-05T20:03:39.41Z" }, ] [[package]] name = "xxhash" version = "3.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/00/5e/d6e5258d69df8b4ed8c83b6664f2b47d30d2dec551a29ad72a6c69eafd31/xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f", size = 84241, upload-time = "2024-08-17T09:20:38.972Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/c7/afed0f131fbda960ff15eee7f304fa0eeb2d58770fade99897984852ef23/xxhash-3.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02c2e816896dc6f85922ced60097bcf6f008dedfc5073dcba32f9c8dd786f3c1", size = 31969, upload-time = "2024-08-17T09:18:00.852Z" }, - { url = "https://files.pythonhosted.org/packages/8c/0c/7c3bc6d87e5235672fcc2fb42fd5ad79fe1033925f71bf549ee068c7d1ca/xxhash-3.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6027dcd885e21581e46d3c7f682cfb2b870942feeed58a21c29583512c3f09f8", size = 30800, upload-time = "2024-08-17T09:18:01.863Z" }, - { url = "https://files.pythonhosted.org/packages/04/9e/01067981d98069eec1c20201f8c145367698e9056f8bc295346e4ea32dd1/xxhash-3.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1308fa542bbdbf2fa85e9e66b1077eea3a88bef38ee8a06270b4298a7a62a166", size = 221566, upload-time = "2024-08-17T09:18:03.461Z" }, - { url = "https://files.pythonhosted.org/packages/d4/09/d4996de4059c3ce5342b6e1e6a77c9d6c91acce31f6ed979891872dd162b/xxhash-3.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c28b2fdcee797e1c1961cd3bcd3d545cab22ad202c846235197935e1df2f8ef7", size = 201214, upload-time = "2024-08-17T09:18:05.616Z" }, - { url = "https://files.pythonhosted.org/packages/62/f5/6d2dc9f8d55a7ce0f5e7bfef916e67536f01b85d32a9fbf137d4cadbee38/xxhash-3.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:924361811732ddad75ff23e90efd9ccfda4f664132feecb90895bade6a1b4623", size = 429433, upload-time = "2024-08-17T09:18:06.957Z" }, - { url = "https://files.pythonhosted.org/packages/d9/72/9256303f10e41ab004799a4aa74b80b3c5977d6383ae4550548b24bd1971/xxhash-3.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89997aa1c4b6a5b1e5b588979d1da048a3c6f15e55c11d117a56b75c84531f5a", size = 194822, upload-time = "2024-08-17T09:18:08.331Z" }, - { url = "https://files.pythonhosted.org/packages/34/92/1a3a29acd08248a34b0e6a94f4e0ed9b8379a4ff471f1668e4dce7bdbaa8/xxhash-3.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:685c4f4e8c59837de103344eb1c8a3851f670309eb5c361f746805c5471b8c88", size = 208538, upload-time = "2024-08-17T09:18:10.332Z" }, - { url = "https://files.pythonhosted.org/packages/53/ad/7fa1a109663366de42f724a1cdb8e796a260dbac45047bce153bc1e18abf/xxhash-3.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbd2ecfbfee70bc1a4acb7461fa6af7748ec2ab08ac0fa298f281c51518f982c", size = 216953, upload-time = "2024-08-17T09:18:11.707Z" }, - { url = "https://files.pythonhosted.org/packages/35/02/137300e24203bf2b2a49b48ce898ecce6fd01789c0fcd9c686c0a002d129/xxhash-3.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25b5a51dc3dfb20a10833c8eee25903fd2e14059e9afcd329c9da20609a307b2", size = 203594, upload-time = "2024-08-17T09:18:13.799Z" }, - { url = "https://files.pythonhosted.org/packages/23/03/aeceb273933d7eee248c4322b98b8e971f06cc3880e5f7602c94e5578af5/xxhash-3.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a8fb786fb754ef6ff8c120cb96629fb518f8eb5a61a16aac3a979a9dbd40a084", size = 210971, upload-time = "2024-08-17T09:18:15.824Z" }, - { url = "https://files.pythonhosted.org/packages/e3/64/ed82ec09489474cbb35c716b189ddc1521d8b3de12b1b5ab41ce7f70253c/xxhash-3.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a905ad00ad1e1c34fe4e9d7c1d949ab09c6fa90c919860c1534ff479f40fd12d", size = 415050, upload-time = "2024-08-17T09:18:17.142Z" }, - { url = "https://files.pythonhosted.org/packages/71/43/6db4c02dcb488ad4e03bc86d70506c3d40a384ee73c9b5c93338eb1f3c23/xxhash-3.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:963be41bcd49f53af6d795f65c0da9b4cc518c0dd9c47145c98f61cb464f4839", size = 192216, upload-time = "2024-08-17T09:18:18.779Z" }, - { url = "https://files.pythonhosted.org/packages/22/6d/db4abec29e7a567455344433d095fdb39c97db6955bb4a2c432e486b4d28/xxhash-3.5.0-cp311-cp311-win32.whl", hash = "sha256:109b436096d0a2dd039c355fa3414160ec4d843dfecc64a14077332a00aeb7da", size = 30120, upload-time = "2024-08-17T09:18:20.009Z" }, - { url = "https://files.pythonhosted.org/packages/52/1c/fa3b61c0cf03e1da4767213672efe186b1dfa4fc901a4a694fb184a513d1/xxhash-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:b702f806693201ad6c0a05ddbbe4c8f359626d0b3305f766077d51388a6bac58", size = 30003, upload-time = "2024-08-17T09:18:21.052Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8e/9e6fc572acf6e1cc7ccb01973c213f895cb8668a9d4c2b58a99350da14b7/xxhash-3.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:c4dcb4120d0cc3cc448624147dba64e9021b278c63e34a38789b688fd0da9bf3", size = 26777, upload-time = "2024-08-17T09:18:22.809Z" }, - { url = "https://files.pythonhosted.org/packages/07/0e/1bfce2502c57d7e2e787600b31c83535af83746885aa1a5f153d8c8059d6/xxhash-3.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:14470ace8bd3b5d51318782cd94e6f94431974f16cb3b8dc15d52f3b69df8e00", size = 31969, upload-time = "2024-08-17T09:18:24.025Z" }, - { url = "https://files.pythonhosted.org/packages/3f/d6/8ca450d6fe5b71ce521b4e5db69622383d039e2b253e9b2f24f93265b52c/xxhash-3.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59aa1203de1cb96dbeab595ded0ad0c0056bb2245ae11fac11c0ceea861382b9", size = 30787, upload-time = "2024-08-17T09:18:25.318Z" }, - { url = "https://files.pythonhosted.org/packages/5b/84/de7c89bc6ef63d750159086a6ada6416cc4349eab23f76ab870407178b93/xxhash-3.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08424f6648526076e28fae6ea2806c0a7d504b9ef05ae61d196d571e5c879c84", size = 220959, upload-time = "2024-08-17T09:18:26.518Z" }, - { url = "https://files.pythonhosted.org/packages/fe/86/51258d3e8a8545ff26468c977101964c14d56a8a37f5835bc0082426c672/xxhash-3.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61a1ff00674879725b194695e17f23d3248998b843eb5e933007ca743310f793", size = 200006, upload-time = "2024-08-17T09:18:27.905Z" }, - { url = "https://files.pythonhosted.org/packages/02/0a/96973bd325412feccf23cf3680fd2246aebf4b789122f938d5557c54a6b2/xxhash-3.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f2c61bee5844d41c3eb015ac652a0229e901074951ae48581d58bfb2ba01be", size = 428326, upload-time = "2024-08-17T09:18:29.335Z" }, - { url = "https://files.pythonhosted.org/packages/11/a7/81dba5010f7e733de88af9555725146fc133be97ce36533867f4c7e75066/xxhash-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d32a592cac88d18cc09a89172e1c32d7f2a6e516c3dfde1b9adb90ab5df54a6", size = 194380, upload-time = "2024-08-17T09:18:30.706Z" }, - { url = "https://files.pythonhosted.org/packages/fb/7d/f29006ab398a173f4501c0e4977ba288f1c621d878ec217b4ff516810c04/xxhash-3.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70dabf941dede727cca579e8c205e61121afc9b28516752fd65724be1355cc90", size = 207934, upload-time = "2024-08-17T09:18:32.133Z" }, - { url = "https://files.pythonhosted.org/packages/8a/6e/6e88b8f24612510e73d4d70d9b0c7dff62a2e78451b9f0d042a5462c8d03/xxhash-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e5d0ddaca65ecca9c10dcf01730165fd858533d0be84c75c327487c37a906a27", size = 216301, upload-time = "2024-08-17T09:18:33.474Z" }, - { url = "https://files.pythonhosted.org/packages/af/51/7862f4fa4b75a25c3b4163c8a873f070532fe5f2d3f9b3fc869c8337a398/xxhash-3.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e5b5e16c5a480fe5f59f56c30abdeba09ffd75da8d13f6b9b6fd224d0b4d0a2", size = 203351, upload-time = "2024-08-17T09:18:34.889Z" }, - { url = "https://files.pythonhosted.org/packages/22/61/8d6a40f288f791cf79ed5bb113159abf0c81d6efb86e734334f698eb4c59/xxhash-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149b7914451eb154b3dfaa721315117ea1dac2cc55a01bfbd4df7c68c5dd683d", size = 210294, upload-time = "2024-08-17T09:18:36.355Z" }, - { url = "https://files.pythonhosted.org/packages/17/02/215c4698955762d45a8158117190261b2dbefe9ae7e5b906768c09d8bc74/xxhash-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:eade977f5c96c677035ff39c56ac74d851b1cca7d607ab3d8f23c6b859379cab", size = 414674, upload-time = "2024-08-17T09:18:38.536Z" }, - { url = "https://files.pythonhosted.org/packages/31/5c/b7a8db8a3237cff3d535261325d95de509f6a8ae439a5a7a4ffcff478189/xxhash-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa9f547bd98f5553d03160967866a71056a60960be00356a15ecc44efb40ba8e", size = 192022, upload-time = "2024-08-17T09:18:40.138Z" }, - { url = "https://files.pythonhosted.org/packages/78/e3/dd76659b2811b3fd06892a8beb850e1996b63e9235af5a86ea348f053e9e/xxhash-3.5.0-cp312-cp312-win32.whl", hash = "sha256:f7b58d1fd3551b8c80a971199543379be1cee3d0d409e1f6d8b01c1a2eebf1f8", size = 30170, upload-time = "2024-08-17T09:18:42.163Z" }, - { url = "https://files.pythonhosted.org/packages/d9/6b/1c443fe6cfeb4ad1dcf231cdec96eb94fb43d6498b4469ed8b51f8b59a37/xxhash-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:fa0cafd3a2af231b4e113fba24a65d7922af91aeb23774a8b78228e6cd785e3e", size = 30040, upload-time = "2024-08-17T09:18:43.699Z" }, - { url = "https://files.pythonhosted.org/packages/0f/eb/04405305f290173acc0350eba6d2f1a794b57925df0398861a20fbafa415/xxhash-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:586886c7e89cb9828bcd8a5686b12e161368e0064d040e225e72607b43858ba2", size = 26796, upload-time = "2024-08-17T09:18:45.29Z" }, - { url = "https://files.pythonhosted.org/packages/c9/b8/e4b3ad92d249be5c83fa72916c9091b0965cb0faeff05d9a0a3870ae6bff/xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6", size = 31795, upload-time = "2024-08-17T09:18:46.813Z" }, - { url = "https://files.pythonhosted.org/packages/fc/d8/b3627a0aebfbfa4c12a41e22af3742cf08c8ea84f5cc3367b5de2d039cce/xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5", size = 30792, upload-time = "2024-08-17T09:18:47.862Z" }, - { url = "https://files.pythonhosted.org/packages/c3/cc/762312960691da989c7cd0545cb120ba2a4148741c6ba458aa723c00a3f8/xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc", size = 220950, upload-time = "2024-08-17T09:18:49.06Z" }, - { url = "https://files.pythonhosted.org/packages/fe/e9/cc266f1042c3c13750e86a535496b58beb12bf8c50a915c336136f6168dc/xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3", size = 199980, upload-time = "2024-08-17T09:18:50.445Z" }, - { url = "https://files.pythonhosted.org/packages/bf/85/a836cd0dc5cc20376de26b346858d0ac9656f8f730998ca4324921a010b9/xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c", size = 428324, upload-time = "2024-08-17T09:18:51.988Z" }, - { url = "https://files.pythonhosted.org/packages/b4/0e/15c243775342ce840b9ba34aceace06a1148fa1630cd8ca269e3223987f5/xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb", size = 194370, upload-time = "2024-08-17T09:18:54.164Z" }, - { url = "https://files.pythonhosted.org/packages/87/a1/b028bb02636dfdc190da01951d0703b3d904301ed0ef6094d948983bef0e/xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f", size = 207911, upload-time = "2024-08-17T09:18:55.509Z" }, - { url = "https://files.pythonhosted.org/packages/80/d5/73c73b03fc0ac73dacf069fdf6036c9abad82de0a47549e9912c955ab449/xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7", size = 216352, upload-time = "2024-08-17T09:18:57.073Z" }, - { url = "https://files.pythonhosted.org/packages/b6/2a/5043dba5ddbe35b4fe6ea0a111280ad9c3d4ba477dd0f2d1fe1129bda9d0/xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326", size = 203410, upload-time = "2024-08-17T09:18:58.54Z" }, - { url = "https://files.pythonhosted.org/packages/a2/b2/9a8ded888b7b190aed75b484eb5c853ddd48aa2896e7b59bbfbce442f0a1/xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf", size = 210322, upload-time = "2024-08-17T09:18:59.943Z" }, - { url = "https://files.pythonhosted.org/packages/98/62/440083fafbc917bf3e4b67c2ade621920dd905517e85631c10aac955c1d2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7", size = 414725, upload-time = "2024-08-17T09:19:01.332Z" }, - { url = "https://files.pythonhosted.org/packages/75/db/009206f7076ad60a517e016bb0058381d96a007ce3f79fa91d3010f49cc2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c", size = 192070, upload-time = "2024-08-17T09:19:03.007Z" }, - { url = "https://files.pythonhosted.org/packages/1f/6d/c61e0668943a034abc3a569cdc5aeae37d686d9da7e39cf2ed621d533e36/xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637", size = 30172, upload-time = "2024-08-17T09:19:04.355Z" }, - { url = "https://files.pythonhosted.org/packages/96/14/8416dce965f35e3d24722cdf79361ae154fa23e2ab730e5323aa98d7919e/xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43", size = 30041, upload-time = "2024-08-17T09:19:05.435Z" }, - { url = "https://files.pythonhosted.org/packages/27/ee/518b72faa2073f5aa8e3262408d284892cb79cf2754ba0c3a5870645ef73/xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b", size = 26801, upload-time = "2024-08-17T09:19:06.547Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/00/5e/d6e5258d69df8b4ed8c83b6664f2b47d30d2dec551a29ad72a6c69eafd31/xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f", size = 84241, upload_time = "2024-08-17T09:20:38.972Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/c7/afed0f131fbda960ff15eee7f304fa0eeb2d58770fade99897984852ef23/xxhash-3.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02c2e816896dc6f85922ced60097bcf6f008dedfc5073dcba32f9c8dd786f3c1", size = 31969, upload_time = "2024-08-17T09:18:00.852Z" }, + { url = "https://files.pythonhosted.org/packages/8c/0c/7c3bc6d87e5235672fcc2fb42fd5ad79fe1033925f71bf549ee068c7d1ca/xxhash-3.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6027dcd885e21581e46d3c7f682cfb2b870942feeed58a21c29583512c3f09f8", size = 30800, upload_time = "2024-08-17T09:18:01.863Z" }, + { url = "https://files.pythonhosted.org/packages/04/9e/01067981d98069eec1c20201f8c145367698e9056f8bc295346e4ea32dd1/xxhash-3.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1308fa542bbdbf2fa85e9e66b1077eea3a88bef38ee8a06270b4298a7a62a166", size = 221566, upload_time = "2024-08-17T09:18:03.461Z" }, + { url = "https://files.pythonhosted.org/packages/d4/09/d4996de4059c3ce5342b6e1e6a77c9d6c91acce31f6ed979891872dd162b/xxhash-3.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c28b2fdcee797e1c1961cd3bcd3d545cab22ad202c846235197935e1df2f8ef7", size = 201214, upload_time = "2024-08-17T09:18:05.616Z" }, + { url = "https://files.pythonhosted.org/packages/62/f5/6d2dc9f8d55a7ce0f5e7bfef916e67536f01b85d32a9fbf137d4cadbee38/xxhash-3.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:924361811732ddad75ff23e90efd9ccfda4f664132feecb90895bade6a1b4623", size = 429433, upload_time = "2024-08-17T09:18:06.957Z" }, + { url = "https://files.pythonhosted.org/packages/d9/72/9256303f10e41ab004799a4aa74b80b3c5977d6383ae4550548b24bd1971/xxhash-3.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89997aa1c4b6a5b1e5b588979d1da048a3c6f15e55c11d117a56b75c84531f5a", size = 194822, upload_time = "2024-08-17T09:18:08.331Z" }, + { url = "https://files.pythonhosted.org/packages/34/92/1a3a29acd08248a34b0e6a94f4e0ed9b8379a4ff471f1668e4dce7bdbaa8/xxhash-3.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:685c4f4e8c59837de103344eb1c8a3851f670309eb5c361f746805c5471b8c88", size = 208538, upload_time = "2024-08-17T09:18:10.332Z" }, + { url = "https://files.pythonhosted.org/packages/53/ad/7fa1a109663366de42f724a1cdb8e796a260dbac45047bce153bc1e18abf/xxhash-3.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbd2ecfbfee70bc1a4acb7461fa6af7748ec2ab08ac0fa298f281c51518f982c", size = 216953, upload_time = "2024-08-17T09:18:11.707Z" }, + { url = "https://files.pythonhosted.org/packages/35/02/137300e24203bf2b2a49b48ce898ecce6fd01789c0fcd9c686c0a002d129/xxhash-3.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25b5a51dc3dfb20a10833c8eee25903fd2e14059e9afcd329c9da20609a307b2", size = 203594, upload_time = "2024-08-17T09:18:13.799Z" }, + { url = "https://files.pythonhosted.org/packages/23/03/aeceb273933d7eee248c4322b98b8e971f06cc3880e5f7602c94e5578af5/xxhash-3.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a8fb786fb754ef6ff8c120cb96629fb518f8eb5a61a16aac3a979a9dbd40a084", size = 210971, upload_time = "2024-08-17T09:18:15.824Z" }, + { url = "https://files.pythonhosted.org/packages/e3/64/ed82ec09489474cbb35c716b189ddc1521d8b3de12b1b5ab41ce7f70253c/xxhash-3.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a905ad00ad1e1c34fe4e9d7c1d949ab09c6fa90c919860c1534ff479f40fd12d", size = 415050, upload_time = "2024-08-17T09:18:17.142Z" }, + { url = "https://files.pythonhosted.org/packages/71/43/6db4c02dcb488ad4e03bc86d70506c3d40a384ee73c9b5c93338eb1f3c23/xxhash-3.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:963be41bcd49f53af6d795f65c0da9b4cc518c0dd9c47145c98f61cb464f4839", size = 192216, upload_time = "2024-08-17T09:18:18.779Z" }, + { url = "https://files.pythonhosted.org/packages/22/6d/db4abec29e7a567455344433d095fdb39c97db6955bb4a2c432e486b4d28/xxhash-3.5.0-cp311-cp311-win32.whl", hash = "sha256:109b436096d0a2dd039c355fa3414160ec4d843dfecc64a14077332a00aeb7da", size = 30120, upload_time = "2024-08-17T09:18:20.009Z" }, + { url = "https://files.pythonhosted.org/packages/52/1c/fa3b61c0cf03e1da4767213672efe186b1dfa4fc901a4a694fb184a513d1/xxhash-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:b702f806693201ad6c0a05ddbbe4c8f359626d0b3305f766077d51388a6bac58", size = 30003, upload_time = "2024-08-17T09:18:21.052Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8e/9e6fc572acf6e1cc7ccb01973c213f895cb8668a9d4c2b58a99350da14b7/xxhash-3.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:c4dcb4120d0cc3cc448624147dba64e9021b278c63e34a38789b688fd0da9bf3", size = 26777, upload_time = "2024-08-17T09:18:22.809Z" }, + { url = "https://files.pythonhosted.org/packages/07/0e/1bfce2502c57d7e2e787600b31c83535af83746885aa1a5f153d8c8059d6/xxhash-3.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:14470ace8bd3b5d51318782cd94e6f94431974f16cb3b8dc15d52f3b69df8e00", size = 31969, upload_time = "2024-08-17T09:18:24.025Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d6/8ca450d6fe5b71ce521b4e5db69622383d039e2b253e9b2f24f93265b52c/xxhash-3.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59aa1203de1cb96dbeab595ded0ad0c0056bb2245ae11fac11c0ceea861382b9", size = 30787, upload_time = "2024-08-17T09:18:25.318Z" }, + { url = "https://files.pythonhosted.org/packages/5b/84/de7c89bc6ef63d750159086a6ada6416cc4349eab23f76ab870407178b93/xxhash-3.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08424f6648526076e28fae6ea2806c0a7d504b9ef05ae61d196d571e5c879c84", size = 220959, upload_time = "2024-08-17T09:18:26.518Z" }, + { url = "https://files.pythonhosted.org/packages/fe/86/51258d3e8a8545ff26468c977101964c14d56a8a37f5835bc0082426c672/xxhash-3.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61a1ff00674879725b194695e17f23d3248998b843eb5e933007ca743310f793", size = 200006, upload_time = "2024-08-17T09:18:27.905Z" }, + { url = "https://files.pythonhosted.org/packages/02/0a/96973bd325412feccf23cf3680fd2246aebf4b789122f938d5557c54a6b2/xxhash-3.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f2c61bee5844d41c3eb015ac652a0229e901074951ae48581d58bfb2ba01be", size = 428326, upload_time = "2024-08-17T09:18:29.335Z" }, + { url = "https://files.pythonhosted.org/packages/11/a7/81dba5010f7e733de88af9555725146fc133be97ce36533867f4c7e75066/xxhash-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d32a592cac88d18cc09a89172e1c32d7f2a6e516c3dfde1b9adb90ab5df54a6", size = 194380, upload_time = "2024-08-17T09:18:30.706Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7d/f29006ab398a173f4501c0e4977ba288f1c621d878ec217b4ff516810c04/xxhash-3.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70dabf941dede727cca579e8c205e61121afc9b28516752fd65724be1355cc90", size = 207934, upload_time = "2024-08-17T09:18:32.133Z" }, + { url = "https://files.pythonhosted.org/packages/8a/6e/6e88b8f24612510e73d4d70d9b0c7dff62a2e78451b9f0d042a5462c8d03/xxhash-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e5d0ddaca65ecca9c10dcf01730165fd858533d0be84c75c327487c37a906a27", size = 216301, upload_time = "2024-08-17T09:18:33.474Z" }, + { url = "https://files.pythonhosted.org/packages/af/51/7862f4fa4b75a25c3b4163c8a873f070532fe5f2d3f9b3fc869c8337a398/xxhash-3.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e5b5e16c5a480fe5f59f56c30abdeba09ffd75da8d13f6b9b6fd224d0b4d0a2", size = 203351, upload_time = "2024-08-17T09:18:34.889Z" }, + { url = "https://files.pythonhosted.org/packages/22/61/8d6a40f288f791cf79ed5bb113159abf0c81d6efb86e734334f698eb4c59/xxhash-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149b7914451eb154b3dfaa721315117ea1dac2cc55a01bfbd4df7c68c5dd683d", size = 210294, upload_time = "2024-08-17T09:18:36.355Z" }, + { url = "https://files.pythonhosted.org/packages/17/02/215c4698955762d45a8158117190261b2dbefe9ae7e5b906768c09d8bc74/xxhash-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:eade977f5c96c677035ff39c56ac74d851b1cca7d607ab3d8f23c6b859379cab", size = 414674, upload_time = "2024-08-17T09:18:38.536Z" }, + { url = "https://files.pythonhosted.org/packages/31/5c/b7a8db8a3237cff3d535261325d95de509f6a8ae439a5a7a4ffcff478189/xxhash-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa9f547bd98f5553d03160967866a71056a60960be00356a15ecc44efb40ba8e", size = 192022, upload_time = "2024-08-17T09:18:40.138Z" }, + { url = "https://files.pythonhosted.org/packages/78/e3/dd76659b2811b3fd06892a8beb850e1996b63e9235af5a86ea348f053e9e/xxhash-3.5.0-cp312-cp312-win32.whl", hash = "sha256:f7b58d1fd3551b8c80a971199543379be1cee3d0d409e1f6d8b01c1a2eebf1f8", size = 30170, upload_time = "2024-08-17T09:18:42.163Z" }, + { url = "https://files.pythonhosted.org/packages/d9/6b/1c443fe6cfeb4ad1dcf231cdec96eb94fb43d6498b4469ed8b51f8b59a37/xxhash-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:fa0cafd3a2af231b4e113fba24a65d7922af91aeb23774a8b78228e6cd785e3e", size = 30040, upload_time = "2024-08-17T09:18:43.699Z" }, + { url = "https://files.pythonhosted.org/packages/0f/eb/04405305f290173acc0350eba6d2f1a794b57925df0398861a20fbafa415/xxhash-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:586886c7e89cb9828bcd8a5686b12e161368e0064d040e225e72607b43858ba2", size = 26796, upload_time = "2024-08-17T09:18:45.29Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b8/e4b3ad92d249be5c83fa72916c9091b0965cb0faeff05d9a0a3870ae6bff/xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6", size = 31795, upload_time = "2024-08-17T09:18:46.813Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d8/b3627a0aebfbfa4c12a41e22af3742cf08c8ea84f5cc3367b5de2d039cce/xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5", size = 30792, upload_time = "2024-08-17T09:18:47.862Z" }, + { url = "https://files.pythonhosted.org/packages/c3/cc/762312960691da989c7cd0545cb120ba2a4148741c6ba458aa723c00a3f8/xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc", size = 220950, upload_time = "2024-08-17T09:18:49.06Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e9/cc266f1042c3c13750e86a535496b58beb12bf8c50a915c336136f6168dc/xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3", size = 199980, upload_time = "2024-08-17T09:18:50.445Z" }, + { url = "https://files.pythonhosted.org/packages/bf/85/a836cd0dc5cc20376de26b346858d0ac9656f8f730998ca4324921a010b9/xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c", size = 428324, upload_time = "2024-08-17T09:18:51.988Z" }, + { url = "https://files.pythonhosted.org/packages/b4/0e/15c243775342ce840b9ba34aceace06a1148fa1630cd8ca269e3223987f5/xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb", size = 194370, upload_time = "2024-08-17T09:18:54.164Z" }, + { url = "https://files.pythonhosted.org/packages/87/a1/b028bb02636dfdc190da01951d0703b3d904301ed0ef6094d948983bef0e/xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f", size = 207911, upload_time = "2024-08-17T09:18:55.509Z" }, + { url = "https://files.pythonhosted.org/packages/80/d5/73c73b03fc0ac73dacf069fdf6036c9abad82de0a47549e9912c955ab449/xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7", size = 216352, upload_time = "2024-08-17T09:18:57.073Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2a/5043dba5ddbe35b4fe6ea0a111280ad9c3d4ba477dd0f2d1fe1129bda9d0/xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326", size = 203410, upload_time = "2024-08-17T09:18:58.54Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b2/9a8ded888b7b190aed75b484eb5c853ddd48aa2896e7b59bbfbce442f0a1/xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf", size = 210322, upload_time = "2024-08-17T09:18:59.943Z" }, + { url = "https://files.pythonhosted.org/packages/98/62/440083fafbc917bf3e4b67c2ade621920dd905517e85631c10aac955c1d2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7", size = 414725, upload_time = "2024-08-17T09:19:01.332Z" }, + { url = "https://files.pythonhosted.org/packages/75/db/009206f7076ad60a517e016bb0058381d96a007ce3f79fa91d3010f49cc2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c", size = 192070, upload_time = "2024-08-17T09:19:03.007Z" }, + { url = "https://files.pythonhosted.org/packages/1f/6d/c61e0668943a034abc3a569cdc5aeae37d686d9da7e39cf2ed621d533e36/xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637", size = 30172, upload_time = "2024-08-17T09:19:04.355Z" }, + { url = "https://files.pythonhosted.org/packages/96/14/8416dce965f35e3d24722cdf79361ae154fa23e2ab730e5323aa98d7919e/xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43", size = 30041, upload_time = "2024-08-17T09:19:05.435Z" }, + { url = "https://files.pythonhosted.org/packages/27/ee/518b72faa2073f5aa8e3262408d284892cb79cf2754ba0c3a5870645ef73/xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b", size = 26801, upload_time = "2024-08-17T09:19:06.547Z" }, ] [[package]] @@ -2406,75 +2406,75 @@ dependencies = [ { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/62/51/c0edba5219027f6eab262e139f73e2417b0f4efffa23bf562f6e18f76ca5/yarl-1.20.0.tar.gz", hash = "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307", size = 185258, upload-time = "2025-04-17T00:45:14.661Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/60/82/a59d8e21b20ffc836775fa7daedac51d16bb8f3010c4fcb495c4496aa922/yarl-1.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fdb5204d17cb32b2de2d1e21c7461cabfacf17f3645e4b9039f210c5d3378bf3", size = 145178, upload-time = "2025-04-17T00:42:04.511Z" }, - { url = "https://files.pythonhosted.org/packages/ba/81/315a3f6f95947cfbf37c92d6fbce42a1a6207b6c38e8c2b452499ec7d449/yarl-1.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eaddd7804d8e77d67c28d154ae5fab203163bd0998769569861258e525039d2a", size = 96859, upload-time = "2025-04-17T00:42:06.43Z" }, - { url = "https://files.pythonhosted.org/packages/ad/17/9b64e575583158551b72272a1023cdbd65af54fe13421d856b2850a6ddb7/yarl-1.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:634b7ba6b4a85cf67e9df7c13a7fb2e44fa37b5d34501038d174a63eaac25ee2", size = 94647, upload-time = "2025-04-17T00:42:07.976Z" }, - { url = "https://files.pythonhosted.org/packages/2c/29/8f291e7922a58a21349683f6120a85701aeefaa02e9f7c8a2dc24fe3f431/yarl-1.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d409e321e4addf7d97ee84162538c7258e53792eb7c6defd0c33647d754172e", size = 355788, upload-time = "2025-04-17T00:42:09.902Z" }, - { url = "https://files.pythonhosted.org/packages/26/6d/b4892c80b805c42c228c6d11e03cafabf81662d371b0853e7f0f513837d5/yarl-1.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ea52f7328a36960ba3231c6677380fa67811b414798a6e071c7085c57b6d20a9", size = 344613, upload-time = "2025-04-17T00:42:11.768Z" }, - { url = "https://files.pythonhosted.org/packages/d7/0e/517aa28d3f848589bae9593717b063a544b86ba0a807d943c70f48fcf3bb/yarl-1.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8703517b924463994c344dcdf99a2d5ce9eca2b6882bb640aa555fb5efc706a", size = 370953, upload-time = "2025-04-17T00:42:13.983Z" }, - { url = "https://files.pythonhosted.org/packages/5f/9b/5bd09d2f1ad6e6f7c2beae9e50db78edd2cca4d194d227b958955573e240/yarl-1.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:077989b09ffd2f48fb2d8f6a86c5fef02f63ffe6b1dd4824c76de7bb01e4f2e2", size = 369204, upload-time = "2025-04-17T00:42:16.386Z" }, - { url = "https://files.pythonhosted.org/packages/9c/85/d793a703cf4bd0d4cd04e4b13cc3d44149470f790230430331a0c1f52df5/yarl-1.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0acfaf1da020253f3533526e8b7dd212838fdc4109959a2c53cafc6db611bff2", size = 358108, upload-time = "2025-04-17T00:42:18.622Z" }, - { url = "https://files.pythonhosted.org/packages/6f/54/b6c71e13549c1f6048fbc14ce8d930ac5fb8bafe4f1a252e621a24f3f1f9/yarl-1.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4230ac0b97ec5eeb91d96b324d66060a43fd0d2a9b603e3327ed65f084e41f8", size = 346610, upload-time = "2025-04-17T00:42:20.9Z" }, - { url = "https://files.pythonhosted.org/packages/a0/1a/d6087d58bdd0d8a2a37bbcdffac9d9721af6ebe50d85304d9f9b57dfd862/yarl-1.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a6a1e6ae21cdd84011c24c78d7a126425148b24d437b5702328e4ba640a8902", size = 365378, upload-time = "2025-04-17T00:42:22.926Z" }, - { url = "https://files.pythonhosted.org/packages/02/84/e25ddff4cbc001dbc4af76f8d41a3e23818212dd1f0a52044cbc60568872/yarl-1.20.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:86de313371ec04dd2531f30bc41a5a1a96f25a02823558ee0f2af0beaa7ca791", size = 356919, upload-time = "2025-04-17T00:42:25.145Z" }, - { url = "https://files.pythonhosted.org/packages/04/76/898ae362353bf8f64636495d222c8014c8e5267df39b1a9fe1e1572fb7d0/yarl-1.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dd59c9dd58ae16eaa0f48c3d0cbe6be8ab4dc7247c3ff7db678edecbaf59327f", size = 364248, upload-time = "2025-04-17T00:42:27.475Z" }, - { url = "https://files.pythonhosted.org/packages/1b/b0/9d9198d83a622f1c40fdbf7bd13b224a6979f2e1fc2cf50bfb1d8773c495/yarl-1.20.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a0bc5e05f457b7c1994cc29e83b58f540b76234ba6b9648a4971ddc7f6aa52da", size = 378418, upload-time = "2025-04-17T00:42:29.333Z" }, - { url = "https://files.pythonhosted.org/packages/c7/ce/1f50c1cc594cf5d3f5bf4a9b616fca68680deaec8ad349d928445ac52eb8/yarl-1.20.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c9471ca18e6aeb0e03276b5e9b27b14a54c052d370a9c0c04a68cefbd1455eb4", size = 383850, upload-time = "2025-04-17T00:42:31.668Z" }, - { url = "https://files.pythonhosted.org/packages/89/1e/a59253a87b35bfec1a25bb5801fb69943330b67cfd266278eb07e0609012/yarl-1.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40ed574b4df723583a26c04b298b283ff171bcc387bc34c2683235e2487a65a5", size = 381218, upload-time = "2025-04-17T00:42:33.523Z" }, - { url = "https://files.pythonhosted.org/packages/85/b0/26f87df2b3044b0ef1a7cf66d321102bdca091db64c5ae853fcb2171c031/yarl-1.20.0-cp311-cp311-win32.whl", hash = "sha256:db243357c6c2bf3cd7e17080034ade668d54ce304d820c2a58514a4e51d0cfd6", size = 86606, upload-time = "2025-04-17T00:42:35.873Z" }, - { url = "https://files.pythonhosted.org/packages/33/46/ca335c2e1f90446a77640a45eeb1cd8f6934f2c6e4df7db0f0f36ef9f025/yarl-1.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c12cd754d9dbd14204c328915e23b0c361b88f3cffd124129955e60a4fbfcfb", size = 93374, upload-time = "2025-04-17T00:42:37.586Z" }, - { url = "https://files.pythonhosted.org/packages/c3/e8/3efdcb83073df978bb5b1a9cc0360ce596680e6c3fac01f2a994ccbb8939/yarl-1.20.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f", size = 147089, upload-time = "2025-04-17T00:42:39.602Z" }, - { url = "https://files.pythonhosted.org/packages/60/c3/9e776e98ea350f76f94dd80b408eaa54e5092643dbf65fd9babcffb60509/yarl-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e", size = 97706, upload-time = "2025-04-17T00:42:41.469Z" }, - { url = "https://files.pythonhosted.org/packages/0c/5b/45cdfb64a3b855ce074ae607b9fc40bc82e7613b94e7612b030255c93a09/yarl-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e", size = 95719, upload-time = "2025-04-17T00:42:43.666Z" }, - { url = "https://files.pythonhosted.org/packages/2d/4e/929633b249611eeed04e2f861a14ed001acca3ef9ec2a984a757b1515889/yarl-1.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33", size = 343972, upload-time = "2025-04-17T00:42:45.391Z" }, - { url = "https://files.pythonhosted.org/packages/49/fd/047535d326c913f1a90407a3baf7ff535b10098611eaef2c527e32e81ca1/yarl-1.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58", size = 339639, upload-time = "2025-04-17T00:42:47.552Z" }, - { url = "https://files.pythonhosted.org/packages/48/2f/11566f1176a78f4bafb0937c0072410b1b0d3640b297944a6a7a556e1d0b/yarl-1.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f", size = 353745, upload-time = "2025-04-17T00:42:49.406Z" }, - { url = "https://files.pythonhosted.org/packages/26/17/07dfcf034d6ae8837b33988be66045dd52f878dfb1c4e8f80a7343f677be/yarl-1.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae", size = 354178, upload-time = "2025-04-17T00:42:51.588Z" }, - { url = "https://files.pythonhosted.org/packages/15/45/212604d3142d84b4065d5f8cab6582ed3d78e4cc250568ef2a36fe1cf0a5/yarl-1.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018", size = 349219, upload-time = "2025-04-17T00:42:53.674Z" }, - { url = "https://files.pythonhosted.org/packages/e6/e0/a10b30f294111c5f1c682461e9459935c17d467a760c21e1f7db400ff499/yarl-1.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672", size = 337266, upload-time = "2025-04-17T00:42:55.49Z" }, - { url = "https://files.pythonhosted.org/packages/33/a6/6efa1d85a675d25a46a167f9f3e80104cde317dfdf7f53f112ae6b16a60a/yarl-1.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8", size = 360873, upload-time = "2025-04-17T00:42:57.895Z" }, - { url = "https://files.pythonhosted.org/packages/77/67/c8ab718cb98dfa2ae9ba0f97bf3cbb7d45d37f13fe1fbad25ac92940954e/yarl-1.20.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7", size = 360524, upload-time = "2025-04-17T00:43:00.094Z" }, - { url = "https://files.pythonhosted.org/packages/bd/e8/c3f18660cea1bc73d9f8a2b3ef423def8dadbbae6c4afabdb920b73e0ead/yarl-1.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594", size = 365370, upload-time = "2025-04-17T00:43:02.242Z" }, - { url = "https://files.pythonhosted.org/packages/c9/99/33f3b97b065e62ff2d52817155a89cfa030a1a9b43fee7843ef560ad9603/yarl-1.20.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6", size = 373297, upload-time = "2025-04-17T00:43:04.189Z" }, - { url = "https://files.pythonhosted.org/packages/3d/89/7519e79e264a5f08653d2446b26d4724b01198a93a74d2e259291d538ab1/yarl-1.20.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1", size = 378771, upload-time = "2025-04-17T00:43:06.609Z" }, - { url = "https://files.pythonhosted.org/packages/3a/58/6c460bbb884abd2917c3eef6f663a4a873f8dc6f498561fc0ad92231c113/yarl-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b", size = 375000, upload-time = "2025-04-17T00:43:09.01Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2a/dd7ed1aa23fea996834278d7ff178f215b24324ee527df53d45e34d21d28/yarl-1.20.0-cp312-cp312-win32.whl", hash = "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64", size = 86355, upload-time = "2025-04-17T00:43:11.311Z" }, - { url = "https://files.pythonhosted.org/packages/ca/c6/333fe0338305c0ac1c16d5aa7cc4841208d3252bbe62172e0051006b5445/yarl-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c", size = 92904, upload-time = "2025-04-17T00:43:13.087Z" }, - { url = "https://files.pythonhosted.org/packages/0f/6f/514c9bff2900c22a4f10e06297714dbaf98707143b37ff0bcba65a956221/yarl-1.20.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f", size = 145030, upload-time = "2025-04-17T00:43:15.083Z" }, - { url = "https://files.pythonhosted.org/packages/4e/9d/f88da3fa319b8c9c813389bfb3463e8d777c62654c7168e580a13fadff05/yarl-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3", size = 96894, upload-time = "2025-04-17T00:43:17.372Z" }, - { url = "https://files.pythonhosted.org/packages/cd/57/92e83538580a6968b2451d6c89c5579938a7309d4785748e8ad42ddafdce/yarl-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d", size = 94457, upload-time = "2025-04-17T00:43:19.431Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ee/7ee43bd4cf82dddd5da97fcaddb6fa541ab81f3ed564c42f146c83ae17ce/yarl-1.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0", size = 343070, upload-time = "2025-04-17T00:43:21.426Z" }, - { url = "https://files.pythonhosted.org/packages/4a/12/b5eccd1109e2097bcc494ba7dc5de156e41cf8309fab437ebb7c2b296ce3/yarl-1.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501", size = 337739, upload-time = "2025-04-17T00:43:23.634Z" }, - { url = "https://files.pythonhosted.org/packages/7d/6b/0eade8e49af9fc2585552f63c76fa59ef469c724cc05b29519b19aa3a6d5/yarl-1.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc", size = 351338, upload-time = "2025-04-17T00:43:25.695Z" }, - { url = "https://files.pythonhosted.org/packages/45/cb/aaaa75d30087b5183c7b8a07b4fb16ae0682dd149a1719b3a28f54061754/yarl-1.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d", size = 353636, upload-time = "2025-04-17T00:43:27.876Z" }, - { url = "https://files.pythonhosted.org/packages/98/9d/d9cb39ec68a91ba6e66fa86d97003f58570327d6713833edf7ad6ce9dde5/yarl-1.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0", size = 348061, upload-time = "2025-04-17T00:43:29.788Z" }, - { url = "https://files.pythonhosted.org/packages/72/6b/103940aae893d0cc770b4c36ce80e2ed86fcb863d48ea80a752b8bda9303/yarl-1.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a", size = 334150, upload-time = "2025-04-17T00:43:31.742Z" }, - { url = "https://files.pythonhosted.org/packages/ef/b2/986bd82aa222c3e6b211a69c9081ba46484cffa9fab2a5235e8d18ca7a27/yarl-1.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2", size = 362207, upload-time = "2025-04-17T00:43:34.099Z" }, - { url = "https://files.pythonhosted.org/packages/14/7c/63f5922437b873795d9422cbe7eb2509d4b540c37ae5548a4bb68fd2c546/yarl-1.20.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9", size = 361277, upload-time = "2025-04-17T00:43:36.202Z" }, - { url = "https://files.pythonhosted.org/packages/81/83/450938cccf732466953406570bdb42c62b5ffb0ac7ac75a1f267773ab5c8/yarl-1.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5", size = 364990, upload-time = "2025-04-17T00:43:38.551Z" }, - { url = "https://files.pythonhosted.org/packages/b4/de/af47d3a47e4a833693b9ec8e87debb20f09d9fdc9139b207b09a3e6cbd5a/yarl-1.20.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877", size = 374684, upload-time = "2025-04-17T00:43:40.481Z" }, - { url = "https://files.pythonhosted.org/packages/62/0b/078bcc2d539f1faffdc7d32cb29a2d7caa65f1a6f7e40795d8485db21851/yarl-1.20.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e", size = 382599, upload-time = "2025-04-17T00:43:42.463Z" }, - { url = "https://files.pythonhosted.org/packages/74/a9/4fdb1a7899f1fb47fd1371e7ba9e94bff73439ce87099d5dd26d285fffe0/yarl-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384", size = 378573, upload-time = "2025-04-17T00:43:44.797Z" }, - { url = "https://files.pythonhosted.org/packages/fd/be/29f5156b7a319e4d2e5b51ce622b4dfb3aa8d8204cd2a8a339340fbfad40/yarl-1.20.0-cp313-cp313-win32.whl", hash = "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62", size = 86051, upload-time = "2025-04-17T00:43:47.076Z" }, - { url = "https://files.pythonhosted.org/packages/52/56/05fa52c32c301da77ec0b5f63d2d9605946fe29defacb2a7ebd473c23b81/yarl-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c", size = 92742, upload-time = "2025-04-17T00:43:49.193Z" }, - { url = "https://files.pythonhosted.org/packages/d4/2f/422546794196519152fc2e2f475f0e1d4d094a11995c81a465faf5673ffd/yarl-1.20.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051", size = 163575, upload-time = "2025-04-17T00:43:51.533Z" }, - { url = "https://files.pythonhosted.org/packages/90/fc/67c64ddab6c0b4a169d03c637fb2d2a212b536e1989dec8e7e2c92211b7f/yarl-1.20.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d", size = 106121, upload-time = "2025-04-17T00:43:53.506Z" }, - { url = "https://files.pythonhosted.org/packages/6d/00/29366b9eba7b6f6baed7d749f12add209b987c4cfbfa418404dbadc0f97c/yarl-1.20.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229", size = 103815, upload-time = "2025-04-17T00:43:55.41Z" }, - { url = "https://files.pythonhosted.org/packages/28/f4/a2a4c967c8323c03689383dff73396281ced3b35d0ed140580825c826af7/yarl-1.20.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1", size = 408231, upload-time = "2025-04-17T00:43:57.825Z" }, - { url = "https://files.pythonhosted.org/packages/0f/a1/66f7ffc0915877d726b70cc7a896ac30b6ac5d1d2760613603b022173635/yarl-1.20.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb", size = 390221, upload-time = "2025-04-17T00:44:00.526Z" }, - { url = "https://files.pythonhosted.org/packages/41/15/cc248f0504610283271615e85bf38bc014224122498c2016d13a3a1b8426/yarl-1.20.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00", size = 411400, upload-time = "2025-04-17T00:44:02.853Z" }, - { url = "https://files.pythonhosted.org/packages/5c/af/f0823d7e092bfb97d24fce6c7269d67fcd1aefade97d0a8189c4452e4d5e/yarl-1.20.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de", size = 411714, upload-time = "2025-04-17T00:44:04.904Z" }, - { url = "https://files.pythonhosted.org/packages/83/70/be418329eae64b9f1b20ecdaac75d53aef098797d4c2299d82ae6f8e4663/yarl-1.20.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5", size = 404279, upload-time = "2025-04-17T00:44:07.721Z" }, - { url = "https://files.pythonhosted.org/packages/19/f5/52e02f0075f65b4914eb890eea1ba97e6fd91dd821cc33a623aa707b2f67/yarl-1.20.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a", size = 384044, upload-time = "2025-04-17T00:44:09.708Z" }, - { url = "https://files.pythonhosted.org/packages/6a/36/b0fa25226b03d3f769c68d46170b3e92b00ab3853d73127273ba22474697/yarl-1.20.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9", size = 416236, upload-time = "2025-04-17T00:44:11.734Z" }, - { url = "https://files.pythonhosted.org/packages/cb/3a/54c828dd35f6831dfdd5a79e6c6b4302ae2c5feca24232a83cb75132b205/yarl-1.20.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145", size = 402034, upload-time = "2025-04-17T00:44:13.975Z" }, - { url = "https://files.pythonhosted.org/packages/10/97/c7bf5fba488f7e049f9ad69c1b8fdfe3daa2e8916b3d321aa049e361a55a/yarl-1.20.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda", size = 407943, upload-time = "2025-04-17T00:44:16.052Z" }, - { url = "https://files.pythonhosted.org/packages/fd/a4/022d2555c1e8fcff08ad7f0f43e4df3aba34f135bff04dd35d5526ce54ab/yarl-1.20.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f", size = 423058, upload-time = "2025-04-17T00:44:18.547Z" }, - { url = "https://files.pythonhosted.org/packages/4c/f6/0873a05563e5df29ccf35345a6ae0ac9e66588b41fdb7043a65848f03139/yarl-1.20.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd", size = 423792, upload-time = "2025-04-17T00:44:20.639Z" }, - { url = "https://files.pythonhosted.org/packages/9e/35/43fbbd082708fa42e923f314c24f8277a28483d219e049552e5007a9aaca/yarl-1.20.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f", size = 422242, upload-time = "2025-04-17T00:44:22.851Z" }, - { url = "https://files.pythonhosted.org/packages/ed/f7/f0f2500cf0c469beb2050b522c7815c575811627e6d3eb9ec7550ddd0bfe/yarl-1.20.0-cp313-cp313t-win32.whl", hash = "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac", size = 93816, upload-time = "2025-04-17T00:44:25.491Z" }, - { url = "https://files.pythonhosted.org/packages/3f/93/f73b61353b2a699d489e782c3f5998b59f974ec3156a2050a52dfd7e8946/yarl-1.20.0-cp313-cp313t-win_amd64.whl", hash = "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe", size = 101093, upload-time = "2025-04-17T00:44:27.418Z" }, - { url = "https://files.pythonhosted.org/packages/ea/1f/70c57b3d7278e94ed22d85e09685d3f0a38ebdd8c5c73b65ba4c0d0fe002/yarl-1.20.0-py3-none-any.whl", hash = "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124", size = 46124, upload-time = "2025-04-17T00:45:12.199Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/62/51/c0edba5219027f6eab262e139f73e2417b0f4efffa23bf562f6e18f76ca5/yarl-1.20.0.tar.gz", hash = "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307", size = 185258, upload_time = "2025-04-17T00:45:14.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/82/a59d8e21b20ffc836775fa7daedac51d16bb8f3010c4fcb495c4496aa922/yarl-1.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fdb5204d17cb32b2de2d1e21c7461cabfacf17f3645e4b9039f210c5d3378bf3", size = 145178, upload_time = "2025-04-17T00:42:04.511Z" }, + { url = "https://files.pythonhosted.org/packages/ba/81/315a3f6f95947cfbf37c92d6fbce42a1a6207b6c38e8c2b452499ec7d449/yarl-1.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eaddd7804d8e77d67c28d154ae5fab203163bd0998769569861258e525039d2a", size = 96859, upload_time = "2025-04-17T00:42:06.43Z" }, + { url = "https://files.pythonhosted.org/packages/ad/17/9b64e575583158551b72272a1023cdbd65af54fe13421d856b2850a6ddb7/yarl-1.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:634b7ba6b4a85cf67e9df7c13a7fb2e44fa37b5d34501038d174a63eaac25ee2", size = 94647, upload_time = "2025-04-17T00:42:07.976Z" }, + { url = "https://files.pythonhosted.org/packages/2c/29/8f291e7922a58a21349683f6120a85701aeefaa02e9f7c8a2dc24fe3f431/yarl-1.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d409e321e4addf7d97ee84162538c7258e53792eb7c6defd0c33647d754172e", size = 355788, upload_time = "2025-04-17T00:42:09.902Z" }, + { url = "https://files.pythonhosted.org/packages/26/6d/b4892c80b805c42c228c6d11e03cafabf81662d371b0853e7f0f513837d5/yarl-1.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ea52f7328a36960ba3231c6677380fa67811b414798a6e071c7085c57b6d20a9", size = 344613, upload_time = "2025-04-17T00:42:11.768Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0e/517aa28d3f848589bae9593717b063a544b86ba0a807d943c70f48fcf3bb/yarl-1.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8703517b924463994c344dcdf99a2d5ce9eca2b6882bb640aa555fb5efc706a", size = 370953, upload_time = "2025-04-17T00:42:13.983Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9b/5bd09d2f1ad6e6f7c2beae9e50db78edd2cca4d194d227b958955573e240/yarl-1.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:077989b09ffd2f48fb2d8f6a86c5fef02f63ffe6b1dd4824c76de7bb01e4f2e2", size = 369204, upload_time = "2025-04-17T00:42:16.386Z" }, + { url = "https://files.pythonhosted.org/packages/9c/85/d793a703cf4bd0d4cd04e4b13cc3d44149470f790230430331a0c1f52df5/yarl-1.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0acfaf1da020253f3533526e8b7dd212838fdc4109959a2c53cafc6db611bff2", size = 358108, upload_time = "2025-04-17T00:42:18.622Z" }, + { url = "https://files.pythonhosted.org/packages/6f/54/b6c71e13549c1f6048fbc14ce8d930ac5fb8bafe4f1a252e621a24f3f1f9/yarl-1.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4230ac0b97ec5eeb91d96b324d66060a43fd0d2a9b603e3327ed65f084e41f8", size = 346610, upload_time = "2025-04-17T00:42:20.9Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1a/d6087d58bdd0d8a2a37bbcdffac9d9721af6ebe50d85304d9f9b57dfd862/yarl-1.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a6a1e6ae21cdd84011c24c78d7a126425148b24d437b5702328e4ba640a8902", size = 365378, upload_time = "2025-04-17T00:42:22.926Z" }, + { url = "https://files.pythonhosted.org/packages/02/84/e25ddff4cbc001dbc4af76f8d41a3e23818212dd1f0a52044cbc60568872/yarl-1.20.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:86de313371ec04dd2531f30bc41a5a1a96f25a02823558ee0f2af0beaa7ca791", size = 356919, upload_time = "2025-04-17T00:42:25.145Z" }, + { url = "https://files.pythonhosted.org/packages/04/76/898ae362353bf8f64636495d222c8014c8e5267df39b1a9fe1e1572fb7d0/yarl-1.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dd59c9dd58ae16eaa0f48c3d0cbe6be8ab4dc7247c3ff7db678edecbaf59327f", size = 364248, upload_time = "2025-04-17T00:42:27.475Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b0/9d9198d83a622f1c40fdbf7bd13b224a6979f2e1fc2cf50bfb1d8773c495/yarl-1.20.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a0bc5e05f457b7c1994cc29e83b58f540b76234ba6b9648a4971ddc7f6aa52da", size = 378418, upload_time = "2025-04-17T00:42:29.333Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ce/1f50c1cc594cf5d3f5bf4a9b616fca68680deaec8ad349d928445ac52eb8/yarl-1.20.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c9471ca18e6aeb0e03276b5e9b27b14a54c052d370a9c0c04a68cefbd1455eb4", size = 383850, upload_time = "2025-04-17T00:42:31.668Z" }, + { url = "https://files.pythonhosted.org/packages/89/1e/a59253a87b35bfec1a25bb5801fb69943330b67cfd266278eb07e0609012/yarl-1.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40ed574b4df723583a26c04b298b283ff171bcc387bc34c2683235e2487a65a5", size = 381218, upload_time = "2025-04-17T00:42:33.523Z" }, + { url = "https://files.pythonhosted.org/packages/85/b0/26f87df2b3044b0ef1a7cf66d321102bdca091db64c5ae853fcb2171c031/yarl-1.20.0-cp311-cp311-win32.whl", hash = "sha256:db243357c6c2bf3cd7e17080034ade668d54ce304d820c2a58514a4e51d0cfd6", size = 86606, upload_time = "2025-04-17T00:42:35.873Z" }, + { url = "https://files.pythonhosted.org/packages/33/46/ca335c2e1f90446a77640a45eeb1cd8f6934f2c6e4df7db0f0f36ef9f025/yarl-1.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c12cd754d9dbd14204c328915e23b0c361b88f3cffd124129955e60a4fbfcfb", size = 93374, upload_time = "2025-04-17T00:42:37.586Z" }, + { url = "https://files.pythonhosted.org/packages/c3/e8/3efdcb83073df978bb5b1a9cc0360ce596680e6c3fac01f2a994ccbb8939/yarl-1.20.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f", size = 147089, upload_time = "2025-04-17T00:42:39.602Z" }, + { url = "https://files.pythonhosted.org/packages/60/c3/9e776e98ea350f76f94dd80b408eaa54e5092643dbf65fd9babcffb60509/yarl-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e", size = 97706, upload_time = "2025-04-17T00:42:41.469Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/45cdfb64a3b855ce074ae607b9fc40bc82e7613b94e7612b030255c93a09/yarl-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e", size = 95719, upload_time = "2025-04-17T00:42:43.666Z" }, + { url = "https://files.pythonhosted.org/packages/2d/4e/929633b249611eeed04e2f861a14ed001acca3ef9ec2a984a757b1515889/yarl-1.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33", size = 343972, upload_time = "2025-04-17T00:42:45.391Z" }, + { url = "https://files.pythonhosted.org/packages/49/fd/047535d326c913f1a90407a3baf7ff535b10098611eaef2c527e32e81ca1/yarl-1.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58", size = 339639, upload_time = "2025-04-17T00:42:47.552Z" }, + { url = "https://files.pythonhosted.org/packages/48/2f/11566f1176a78f4bafb0937c0072410b1b0d3640b297944a6a7a556e1d0b/yarl-1.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f", size = 353745, upload_time = "2025-04-17T00:42:49.406Z" }, + { url = "https://files.pythonhosted.org/packages/26/17/07dfcf034d6ae8837b33988be66045dd52f878dfb1c4e8f80a7343f677be/yarl-1.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae", size = 354178, upload_time = "2025-04-17T00:42:51.588Z" }, + { url = "https://files.pythonhosted.org/packages/15/45/212604d3142d84b4065d5f8cab6582ed3d78e4cc250568ef2a36fe1cf0a5/yarl-1.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018", size = 349219, upload_time = "2025-04-17T00:42:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e0/a10b30f294111c5f1c682461e9459935c17d467a760c21e1f7db400ff499/yarl-1.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672", size = 337266, upload_time = "2025-04-17T00:42:55.49Z" }, + { url = "https://files.pythonhosted.org/packages/33/a6/6efa1d85a675d25a46a167f9f3e80104cde317dfdf7f53f112ae6b16a60a/yarl-1.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8", size = 360873, upload_time = "2025-04-17T00:42:57.895Z" }, + { url = "https://files.pythonhosted.org/packages/77/67/c8ab718cb98dfa2ae9ba0f97bf3cbb7d45d37f13fe1fbad25ac92940954e/yarl-1.20.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7", size = 360524, upload_time = "2025-04-17T00:43:00.094Z" }, + { url = "https://files.pythonhosted.org/packages/bd/e8/c3f18660cea1bc73d9f8a2b3ef423def8dadbbae6c4afabdb920b73e0ead/yarl-1.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594", size = 365370, upload_time = "2025-04-17T00:43:02.242Z" }, + { url = "https://files.pythonhosted.org/packages/c9/99/33f3b97b065e62ff2d52817155a89cfa030a1a9b43fee7843ef560ad9603/yarl-1.20.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6", size = 373297, upload_time = "2025-04-17T00:43:04.189Z" }, + { url = "https://files.pythonhosted.org/packages/3d/89/7519e79e264a5f08653d2446b26d4724b01198a93a74d2e259291d538ab1/yarl-1.20.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1", size = 378771, upload_time = "2025-04-17T00:43:06.609Z" }, + { url = "https://files.pythonhosted.org/packages/3a/58/6c460bbb884abd2917c3eef6f663a4a873f8dc6f498561fc0ad92231c113/yarl-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b", size = 375000, upload_time = "2025-04-17T00:43:09.01Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/dd7ed1aa23fea996834278d7ff178f215b24324ee527df53d45e34d21d28/yarl-1.20.0-cp312-cp312-win32.whl", hash = "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64", size = 86355, upload_time = "2025-04-17T00:43:11.311Z" }, + { url = "https://files.pythonhosted.org/packages/ca/c6/333fe0338305c0ac1c16d5aa7cc4841208d3252bbe62172e0051006b5445/yarl-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c", size = 92904, upload_time = "2025-04-17T00:43:13.087Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6f/514c9bff2900c22a4f10e06297714dbaf98707143b37ff0bcba65a956221/yarl-1.20.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f", size = 145030, upload_time = "2025-04-17T00:43:15.083Z" }, + { url = "https://files.pythonhosted.org/packages/4e/9d/f88da3fa319b8c9c813389bfb3463e8d777c62654c7168e580a13fadff05/yarl-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3", size = 96894, upload_time = "2025-04-17T00:43:17.372Z" }, + { url = "https://files.pythonhosted.org/packages/cd/57/92e83538580a6968b2451d6c89c5579938a7309d4785748e8ad42ddafdce/yarl-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d", size = 94457, upload_time = "2025-04-17T00:43:19.431Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ee/7ee43bd4cf82dddd5da97fcaddb6fa541ab81f3ed564c42f146c83ae17ce/yarl-1.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0", size = 343070, upload_time = "2025-04-17T00:43:21.426Z" }, + { url = "https://files.pythonhosted.org/packages/4a/12/b5eccd1109e2097bcc494ba7dc5de156e41cf8309fab437ebb7c2b296ce3/yarl-1.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501", size = 337739, upload_time = "2025-04-17T00:43:23.634Z" }, + { url = "https://files.pythonhosted.org/packages/7d/6b/0eade8e49af9fc2585552f63c76fa59ef469c724cc05b29519b19aa3a6d5/yarl-1.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc", size = 351338, upload_time = "2025-04-17T00:43:25.695Z" }, + { url = "https://files.pythonhosted.org/packages/45/cb/aaaa75d30087b5183c7b8a07b4fb16ae0682dd149a1719b3a28f54061754/yarl-1.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d", size = 353636, upload_time = "2025-04-17T00:43:27.876Z" }, + { url = "https://files.pythonhosted.org/packages/98/9d/d9cb39ec68a91ba6e66fa86d97003f58570327d6713833edf7ad6ce9dde5/yarl-1.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0", size = 348061, upload_time = "2025-04-17T00:43:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/72/6b/103940aae893d0cc770b4c36ce80e2ed86fcb863d48ea80a752b8bda9303/yarl-1.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a", size = 334150, upload_time = "2025-04-17T00:43:31.742Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b2/986bd82aa222c3e6b211a69c9081ba46484cffa9fab2a5235e8d18ca7a27/yarl-1.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2", size = 362207, upload_time = "2025-04-17T00:43:34.099Z" }, + { url = "https://files.pythonhosted.org/packages/14/7c/63f5922437b873795d9422cbe7eb2509d4b540c37ae5548a4bb68fd2c546/yarl-1.20.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9", size = 361277, upload_time = "2025-04-17T00:43:36.202Z" }, + { url = "https://files.pythonhosted.org/packages/81/83/450938cccf732466953406570bdb42c62b5ffb0ac7ac75a1f267773ab5c8/yarl-1.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5", size = 364990, upload_time = "2025-04-17T00:43:38.551Z" }, + { url = "https://files.pythonhosted.org/packages/b4/de/af47d3a47e4a833693b9ec8e87debb20f09d9fdc9139b207b09a3e6cbd5a/yarl-1.20.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877", size = 374684, upload_time = "2025-04-17T00:43:40.481Z" }, + { url = "https://files.pythonhosted.org/packages/62/0b/078bcc2d539f1faffdc7d32cb29a2d7caa65f1a6f7e40795d8485db21851/yarl-1.20.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e", size = 382599, upload_time = "2025-04-17T00:43:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/74/a9/4fdb1a7899f1fb47fd1371e7ba9e94bff73439ce87099d5dd26d285fffe0/yarl-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384", size = 378573, upload_time = "2025-04-17T00:43:44.797Z" }, + { url = "https://files.pythonhosted.org/packages/fd/be/29f5156b7a319e4d2e5b51ce622b4dfb3aa8d8204cd2a8a339340fbfad40/yarl-1.20.0-cp313-cp313-win32.whl", hash = "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62", size = 86051, upload_time = "2025-04-17T00:43:47.076Z" }, + { url = "https://files.pythonhosted.org/packages/52/56/05fa52c32c301da77ec0b5f63d2d9605946fe29defacb2a7ebd473c23b81/yarl-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c", size = 92742, upload_time = "2025-04-17T00:43:49.193Z" }, + { url = "https://files.pythonhosted.org/packages/d4/2f/422546794196519152fc2e2f475f0e1d4d094a11995c81a465faf5673ffd/yarl-1.20.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051", size = 163575, upload_time = "2025-04-17T00:43:51.533Z" }, + { url = "https://files.pythonhosted.org/packages/90/fc/67c64ddab6c0b4a169d03c637fb2d2a212b536e1989dec8e7e2c92211b7f/yarl-1.20.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d", size = 106121, upload_time = "2025-04-17T00:43:53.506Z" }, + { url = "https://files.pythonhosted.org/packages/6d/00/29366b9eba7b6f6baed7d749f12add209b987c4cfbfa418404dbadc0f97c/yarl-1.20.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229", size = 103815, upload_time = "2025-04-17T00:43:55.41Z" }, + { url = "https://files.pythonhosted.org/packages/28/f4/a2a4c967c8323c03689383dff73396281ced3b35d0ed140580825c826af7/yarl-1.20.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1", size = 408231, upload_time = "2025-04-17T00:43:57.825Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a1/66f7ffc0915877d726b70cc7a896ac30b6ac5d1d2760613603b022173635/yarl-1.20.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb", size = 390221, upload_time = "2025-04-17T00:44:00.526Z" }, + { url = "https://files.pythonhosted.org/packages/41/15/cc248f0504610283271615e85bf38bc014224122498c2016d13a3a1b8426/yarl-1.20.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00", size = 411400, upload_time = "2025-04-17T00:44:02.853Z" }, + { url = "https://files.pythonhosted.org/packages/5c/af/f0823d7e092bfb97d24fce6c7269d67fcd1aefade97d0a8189c4452e4d5e/yarl-1.20.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de", size = 411714, upload_time = "2025-04-17T00:44:04.904Z" }, + { url = "https://files.pythonhosted.org/packages/83/70/be418329eae64b9f1b20ecdaac75d53aef098797d4c2299d82ae6f8e4663/yarl-1.20.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5", size = 404279, upload_time = "2025-04-17T00:44:07.721Z" }, + { url = "https://files.pythonhosted.org/packages/19/f5/52e02f0075f65b4914eb890eea1ba97e6fd91dd821cc33a623aa707b2f67/yarl-1.20.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a", size = 384044, upload_time = "2025-04-17T00:44:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/6a/36/b0fa25226b03d3f769c68d46170b3e92b00ab3853d73127273ba22474697/yarl-1.20.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9", size = 416236, upload_time = "2025-04-17T00:44:11.734Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3a/54c828dd35f6831dfdd5a79e6c6b4302ae2c5feca24232a83cb75132b205/yarl-1.20.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145", size = 402034, upload_time = "2025-04-17T00:44:13.975Z" }, + { url = "https://files.pythonhosted.org/packages/10/97/c7bf5fba488f7e049f9ad69c1b8fdfe3daa2e8916b3d321aa049e361a55a/yarl-1.20.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda", size = 407943, upload_time = "2025-04-17T00:44:16.052Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a4/022d2555c1e8fcff08ad7f0f43e4df3aba34f135bff04dd35d5526ce54ab/yarl-1.20.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f", size = 423058, upload_time = "2025-04-17T00:44:18.547Z" }, + { url = "https://files.pythonhosted.org/packages/4c/f6/0873a05563e5df29ccf35345a6ae0ac9e66588b41fdb7043a65848f03139/yarl-1.20.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd", size = 423792, upload_time = "2025-04-17T00:44:20.639Z" }, + { url = "https://files.pythonhosted.org/packages/9e/35/43fbbd082708fa42e923f314c24f8277a28483d219e049552e5007a9aaca/yarl-1.20.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f", size = 422242, upload_time = "2025-04-17T00:44:22.851Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f7/f0f2500cf0c469beb2050b522c7815c575811627e6d3eb9ec7550ddd0bfe/yarl-1.20.0-cp313-cp313t-win32.whl", hash = "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac", size = 93816, upload_time = "2025-04-17T00:44:25.491Z" }, + { url = "https://files.pythonhosted.org/packages/3f/93/f73b61353b2a699d489e782c3f5998b59f974ec3156a2050a52dfd7e8946/yarl-1.20.0-cp313-cp313t-win_amd64.whl", hash = "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe", size = 101093, upload_time = "2025-04-17T00:44:27.418Z" }, + { url = "https://files.pythonhosted.org/packages/ea/1f/70c57b3d7278e94ed22d85e09685d3f0a38ebdd8c5c73b65ba4c0d0fe002/yarl-1.20.0-py3-none-any.whl", hash = "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124", size = 46124, upload_time = "2025-04-17T00:45:12.199Z" }, ] From b6d682880a7bacec7cf8847add814e5c68d046bb Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 16 Jun 2025 10:24:56 -0400 Subject: [PATCH 214/244] Reorganize SQLAlchemy models --- ...0922-fb199cf58ecd_update_agencies_table.py | 49 ++ src/db/client/async_.py | 36 +- src/db/client/sync.py | 6 +- src/db/dto_converter.py | 13 +- src/db/models/README.md | 1 + src/db/models/core.py | 449 ------------------ src/db/models/instantiations/__init__.py | 0 src/db/models/instantiations/agency.py | 20 + .../models/instantiations/backlog_snapshot.py | 10 + src/db/models/instantiations/batch.py | 52 ++ .../instantiations/confirmed_url_agency.py | 19 + src/db/models/instantiations/duplicate.py | 23 + src/db/models/instantiations/link_task_url.py | 15 + src/db/models/instantiations/log.py | 14 + src/db/models/instantiations/missing.py | 18 + .../models/instantiations/root_url_cache.py | 17 + src/db/models/instantiations/task/__init__.py | 0 src/db/models/instantiations/task/core.py | 27 ++ src/db/models/instantiations/task/error.py | 20 + src/db/models/instantiations/url/__init__.py | 0 .../url/checked_for_duplicate.py | 11 + src/db/models/instantiations/url/core.py | 80 ++++ .../models/instantiations/url/data_source.py | 18 + .../models/instantiations/url/error_info.py | 20 + .../models/instantiations/url/html_content.py | 24 + .../url/optional_data_source_metadata.py | 16 + .../instantiations/url/probed_for_404.py | 14 + .../instantiations/url/reviewing_user.py | 18 + .../instantiations/url/suggestion/README.md | 1 + .../instantiations/url/suggestion/__init__.py | 0 .../url/suggestion/agency/__init__.py | 0 .../url/suggestion/agency/auto.py | 20 + .../url/suggestion/agency/user.py | 21 + .../url/suggestion/record_type/__init__.py | 0 .../url/suggestion/record_type/auto.py | 27 ++ .../url/suggestion/record_type/user.py | 22 + .../url/suggestion/relevant/__init__.py | 0 .../url/suggestion/relevant/auto.py | 19 + .../url/suggestion/relevant/user.py | 35 ++ src/db/models/types.py | 6 + .../core/get_next_url_for_final_review.py | 12 +- .../get_recent_batch_summaries/builder.py | 2 +- .../url_counts/builder.py | 3 +- src/db/statement_composer.py | 10 +- src/db/types.py | 4 +- src/util/alembic_helpers.py | 21 +- tests/alembic/test_revisions.py | 371 --------------- .../integration/api/test_annotate.py | 4 +- .../integration/api/test_manual_batch.py | 4 +- .../automated/integration/api/test_review.py | 5 +- .../collector_db/test_database_structure.py | 2 +- .../collector_db/test_db_client.py | 6 +- .../integration/core/test_async_core.py | 2 +- .../tasks/test_agency_preannotation_task.py | 3 +- .../tasks/test_submit_approved_url_task.py | 4 +- .../integration/tasks/test_url_404_probe.py | 3 +- .../tasks/test_url_duplicate_task.py | 3 +- .../test_url_miscellaneous_metadata_task.py | 3 +- .../tasks/test_url_record_type_task.py | 2 +- 59 files changed, 750 insertions(+), 855 deletions(-) create mode 100644 alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py create mode 100644 src/db/models/README.md delete mode 100644 src/db/models/core.py create mode 100644 src/db/models/instantiations/__init__.py create mode 100644 src/db/models/instantiations/agency.py create mode 100644 src/db/models/instantiations/backlog_snapshot.py create mode 100644 src/db/models/instantiations/batch.py create mode 100644 src/db/models/instantiations/confirmed_url_agency.py create mode 100644 src/db/models/instantiations/duplicate.py create mode 100644 src/db/models/instantiations/link_task_url.py create mode 100644 src/db/models/instantiations/log.py create mode 100644 src/db/models/instantiations/missing.py create mode 100644 src/db/models/instantiations/root_url_cache.py create mode 100644 src/db/models/instantiations/task/__init__.py create mode 100644 src/db/models/instantiations/task/core.py create mode 100644 src/db/models/instantiations/task/error.py create mode 100644 src/db/models/instantiations/url/__init__.py create mode 100644 src/db/models/instantiations/url/checked_for_duplicate.py create mode 100644 src/db/models/instantiations/url/core.py create mode 100644 src/db/models/instantiations/url/data_source.py create mode 100644 src/db/models/instantiations/url/error_info.py create mode 100644 src/db/models/instantiations/url/html_content.py create mode 100644 src/db/models/instantiations/url/optional_data_source_metadata.py create mode 100644 src/db/models/instantiations/url/probed_for_404.py create mode 100644 src/db/models/instantiations/url/reviewing_user.py create mode 100644 src/db/models/instantiations/url/suggestion/README.md create mode 100644 src/db/models/instantiations/url/suggestion/__init__.py create mode 100644 src/db/models/instantiations/url/suggestion/agency/__init__.py create mode 100644 src/db/models/instantiations/url/suggestion/agency/auto.py create mode 100644 src/db/models/instantiations/url/suggestion/agency/user.py create mode 100644 src/db/models/instantiations/url/suggestion/record_type/__init__.py create mode 100644 src/db/models/instantiations/url/suggestion/record_type/auto.py create mode 100644 src/db/models/instantiations/url/suggestion/record_type/user.py create mode 100644 src/db/models/instantiations/url/suggestion/relevant/__init__.py create mode 100644 src/db/models/instantiations/url/suggestion/relevant/auto.py create mode 100644 src/db/models/instantiations/url/suggestion/relevant/user.py create mode 100644 src/db/models/types.py diff --git a/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py b/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py new file mode 100644 index 00000000..ebd6db4e --- /dev/null +++ b/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py @@ -0,0 +1,49 @@ +"""Update agencies table and add `agencies_sync_state` table + +Revision ID: fb199cf58ecd +Revises: c1380f90f5de +Create Date: 2025-06-16 09:22:05.813695 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +from src.util.alembic_helpers import created_at_column, updated_at_column + +# revision identifiers, used by Alembic. +revision: str = 'fb199cf58ecd' +down_revision: Union[str, None] = 'c1380f90f5de' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +AGENCIES_TABLE_NAME = 'agencies' + +def upgrade() -> None: + op.add_column( + AGENCIES_TABLE_NAME, + created_at_column() + ) + + op.add_column( + AGENCIES_TABLE_NAME, + sa.Column('ds_last_updated_at', sa.DateTime(), nullable=True) + ) + + op.create_table( + 'agencies_sync_state', + sa.Column('last_full_sync_at', sa.DateTime(), nullable=True), + sa.Column('current_cutoff_date', sa.Date(), nullable=True), + sa.Column('current_page', sa.Integer(), nullable=True), + ) + + # Add row to `agencies_sync_state` table + op.execute('INSERT INTO agencies_sync_state VALUES (null, null, null)') + + +def downgrade() -> None: + for column in ['ds_last_updated_at', 'created_at']: + op.drop_column(AGENCIES_TABLE_NAME, column) + + op.drop_table('agencies_sync_state') diff --git a/src/db/client/async_.py b/src/db/client/async_.py index 0296a307..8377d2cb 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -4,7 +4,7 @@ from typing import Optional, Type, Any, List from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, desc, Select, not_, and_, update, asc, delete, literal +from sqlalchemy import select, exists, func, case, Select, not_, and_, update, delete, literal from sqlalchemy.dialects import postgresql from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker @@ -35,8 +35,7 @@ from src.api.endpoints.metrics.dtos.get.urls.breakdown.submitted import GetMetricsURLsBreakdownSubmittedResponseDTO, \ GetMetricsURLsBreakdownSubmittedInnerDTO from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo -from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewResponse, FinalReviewOptionalMetadata, \ - FinalReviewAnnotationInfo +from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewResponse from src.api.endpoints.review.enums import RejectionReason from src.api.endpoints.search.dtos.response import SearchURLResponse from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse, GetTasksResponseTaskInfo @@ -54,17 +53,36 @@ from src.db.dtos.url_html_content_info import URLHTMLContentInfo, HTMLContentType from src.db.dtos.url_info import URLInfo from src.db.dtos.url_mapping import URLMapping +from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion +from src.db.models.instantiations.url.suggestion.record_type.user import UserRecordTypeSuggestion +from src.db.models.instantiations.url.suggestion.relevant.auto import AutoRelevantSuggestion +from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion from src.db.queries.implementations.core.get_next_url_for_final_review import GetNextURLForFinalReviewQueryBuilder from src.db.queries.implementations.core.get_recent_batch_summaries.builder import GetRecentBatchSummariesQueryBuilder from src.db.statement_composer import StatementComposer -from src.db.constants import PLACEHOLDER_AGENCY_NAME, STANDARD_ROW_LIMIT +from src.db.constants import PLACEHOLDER_AGENCY_NAME from src.db.enums import TaskType from src.db.models.templates import Base -from src.db.models.core import URL, URLErrorInfo, URLHTMLContent, \ - RootURL, Task, TaskError, LinkTaskURL, Batch, Agency, AutomatedUrlAgencySuggestion, \ - UserUrlAgencySuggestion, AutoRelevantSuggestion, AutoRecordTypeSuggestion, UserRelevantSuggestion, \ - UserRecordTypeSuggestion, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Duplicate, Log, \ - BacklogSnapshot, URLDataSource, URLCheckedForDuplicate, URLProbedFor404 +from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency +from src.db.models.instantiations.link_task_url import LinkTaskURL +from src.db.models.instantiations.url.error_info import URLErrorInfo +from src.db.models.instantiations.agency import Agency +from src.db.models.instantiations.duplicate import Duplicate +from src.db.models.instantiations.log import Log +from src.db.models.instantiations.task.error import TaskError +from src.db.models.instantiations.task.core import Task +from src.db.models.instantiations.backlog_snapshot import BacklogSnapshot +from src.db.models.instantiations.url.suggestion.record_type.auto import AutoRecordTypeSuggestion +from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion +from src.db.models.instantiations.url.data_source import URLDataSource +from src.db.models.instantiations.root_url_cache import RootURL +from src.db.models.instantiations.url.html_content import URLHTMLContent +from src.db.models.instantiations.url.reviewing_user import ReviewingUserURL +from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata +from src.db.models.instantiations.url.probed_for_404 import URLProbedFor404 +from src.db.models.instantiations.url.checked_for_duplicate import URLCheckedForDuplicate +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.batch import Batch from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.tasks.operators.agency_identification.dtos.tdo import AgencyIdentificationTDO from src.core.tasks.operators.submit_approved_url.tdo import SubmitApprovedURLTDO, SubmittedURLInfo diff --git a/src/db/client/sync.py b/src/db/client/sync.py index 8957ac92..65456bc1 100644 --- a/src/db/client/sync.py +++ b/src/db/client/sync.py @@ -14,7 +14,11 @@ from src.db.dtos.url_info import URLInfo from src.db.dtos.url_mapping import URLMapping from src.db.models.templates import Base -from src.db.models.core import Batch, URL, Log, Duplicate, URLDataSource +from src.db.models.instantiations.duplicate import Duplicate +from src.db.models.instantiations.log import Log +from src.db.models.instantiations.url.data_source import URLDataSource +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.batch import Batch from src.core.tasks.operators.submit_approved_url.tdo import SubmittedURLInfo from src.core.env_var_manager import EnvVarManager from src.core.enums import BatchStatus diff --git a/src/db/dto_converter.py b/src/db/dto_converter.py index abdf5552..6c5453f1 100644 --- a/src/db/dto_converter.py +++ b/src/db/dto_converter.py @@ -9,10 +9,15 @@ from src.db.dtos.url_html_content_info import HTMLContentType, URLHTMLContentInfo from src.db.dtos.url_info import URLInfo from src.db.dtos.url_with_html import URLWithHTML -from src.db.models.core import AutomatedUrlAgencySuggestion, UserUrlAgencySuggestion, URLHTMLContent, URL, \ - AutoRecordTypeSuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion, AutoRelevantSuggestion, \ - ConfirmedURLAgency - +from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency +from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion +from src.db.models.instantiations.url.suggestion.record_type.auto import AutoRecordTypeSuggestion +from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion +from src.db.models.instantiations.url.html_content import URLHTMLContent +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.url.suggestion.record_type.user import UserRecordTypeSuggestion +from src.db.models.instantiations.url.suggestion.relevant.auto import AutoRelevantSuggestion +from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion class DTOConverter: diff --git a/src/db/models/README.md b/src/db/models/README.md new file mode 100644 index 00000000..ef8f247f --- /dev/null +++ b/src/db/models/README.md @@ -0,0 +1 @@ +Contains SQLAlchemy database models and associated logic \ No newline at end of file diff --git a/src/db/models/core.py b/src/db/models/core.py deleted file mode 100644 index fe64b8df..00000000 --- a/src/db/models/core.py +++ /dev/null @@ -1,449 +0,0 @@ -""" -SQLAlchemy ORM models -""" -from sqlalchemy import Column, Integer, String, TIMESTAMP, Float, JSON, ForeignKey, Text, UniqueConstraint, \ - Boolean, ARRAY -from sqlalchemy.dialects import postgresql -from sqlalchemy.orm import relationship - -from src.core.enums import BatchStatus, RecordType -from src.db.enums import PGEnum, TaskType -from src.db.models.helpers import get_created_at_column, CURRENT_TIME_SERVER_DEFAULT, \ - get_agency_id_foreign_column -from src.db.models.mixins import URLDependentMixin, TaskDependentMixin, BatchDependentMixin, CreatedAtMixin, \ - UpdatedAtMixin -from src.db.models.templates import StandardModel, Base -from src.util.helper_functions import get_enum_values - -status_check_string = ", ".join([f"'{status}'" for status in get_enum_values(BatchStatus)]) - -batch_status_enum = PGEnum('ready to label', 'error', 'in-process', 'aborted', name='batch_status') - -record_type_values = get_enum_values(RecordType) - - -class Batch(StandardModel): - __tablename__ = 'batches' - - strategy = Column( - postgresql.ENUM( - 'example', - 'ckan', - 'muckrock_county_search', - 'auto_googler', - 'muckrock_all_search', - 'muckrock_simple_search', - 'common_crawler', - 'manual', - name='batch_strategy'), - nullable=False) - user_id = Column(Integer, nullable=False) - # Gives the status of the batch - status = Column( - batch_status_enum, - nullable=False - ) - date_generated = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) - # How often URLs ended up approved in the database - strategy_success_rate = Column(Float) - # Percentage of metadata identified by models - metadata_success_rate = Column(Float) - # Rate of matching to agencies - agency_match_rate = Column(Float) - # Rate of matching to record types - record_type_match_rate = Column(Float) - # Rate of matching to record categories - record_category_match_rate = Column(Float) - # Time taken to generate the batch - # TODO: Add means to update after execution - compute_time = Column(Float) - # The parameters used to generate the batch - parameters = Column(JSON) - - # Relationships - urls = relationship("URL", back_populates="batch") - missings = relationship("Missing", back_populates="batch") - logs = relationship("Log", back_populates="batch") - duplicates = relationship("Duplicate", back_populates="batch") - - -class URL(UpdatedAtMixin, CreatedAtMixin, StandardModel): - __tablename__ = 'urls' - - # The batch this URL is associated with - batch_id = Column(Integer, ForeignKey('batches.id', name='fk_url_batch_id'), nullable=False) - url = Column(Text, unique=True) - name = Column(String) - description = Column(Text) - # The metadata from the collector - collector_metadata = Column(JSON) - # The outcome of the URL: submitted, human_labeling, rejected, duplicate, etc. - outcome = Column( - postgresql.ENUM( - 'pending', - 'submitted', - 'validated', - 'not relevant', - 'duplicate', - 'error', - '404 not found', - 'individual record', - name='url_status' - ), - nullable=False - ) - record_type = Column(postgresql.ENUM(*record_type_values, name='record_type'), nullable=True) - - # Relationships - batch = relationship("Batch", back_populates="urls") - duplicates = relationship("Duplicate", back_populates="original_url") - html_content = relationship("URLHTMLContent", back_populates="url", cascade="all, delete-orphan") - error_info = relationship("URLErrorInfo", back_populates="url", cascade="all, delete-orphan") - tasks = relationship( - "Task", - secondary="link_task_urls", - back_populates="urls", - ) - automated_agency_suggestions = relationship( - "AutomatedUrlAgencySuggestion", back_populates="url") - user_agency_suggestion = relationship( - "UserUrlAgencySuggestion", uselist=False, back_populates="url") - auto_record_type_suggestion = relationship( - "AutoRecordTypeSuggestion", uselist=False, back_populates="url") - user_record_type_suggestion = relationship( - "UserRecordTypeSuggestion", uselist=False, back_populates="url") - auto_relevant_suggestion = relationship( - "AutoRelevantSuggestion", uselist=False, back_populates="url") - user_relevant_suggestion = relationship( - "UserRelevantSuggestion", uselist=False, back_populates="url") - reviewing_user = relationship( - "ReviewingUserURL", uselist=False, back_populates="url") - optional_data_source_metadata = relationship( - "URLOptionalDataSourceMetadata", uselist=False, back_populates="url") - confirmed_agencies = relationship( - "ConfirmedURLAgency", - ) - data_source = relationship( - "URLDataSource", - back_populates="url", - uselist=False - ) - checked_for_duplicate = relationship( - "URLCheckedForDuplicate", - uselist=False, - back_populates="url" - ) - probed_for_404 = relationship( - "URLProbedFor404", - uselist=False, - back_populates="url" - ) - -class URLCheckedForDuplicate(CreatedAtMixin, URLDependentMixin, StandardModel): - __tablename__ = 'url_checked_for_duplicate' - - # Relationships - url = relationship("URL", uselist=False, back_populates="checked_for_duplicate") - -class URLProbedFor404(URLDependentMixin, StandardModel): - __tablename__ = 'url_probed_for_404' - - last_probed_at = get_created_at_column() - - # Relationships - url = relationship("URL", uselist=False, back_populates="probed_for_404") - -class URLOptionalDataSourceMetadata(URLDependentMixin, StandardModel): - __tablename__ = 'url_optional_data_source_metadata' - - record_formats = Column(ARRAY(String), nullable=True) - data_portal_type = Column(String, nullable=True) - supplying_entity = Column(String, nullable=True) - - # Relationships - url = relationship("URL", uselist=False, back_populates="optional_data_source_metadata") - -class ReviewingUserURL(CreatedAtMixin, URLDependentMixin, StandardModel): - __tablename__ = 'reviewing_user_url' - __table_args__ = ( - UniqueConstraint( - "url_id", - name="approving_user_url_uq_user_id_url_id"), - ) - user_id = Column(Integer, nullable=False) - - # Relationships - url = relationship("URL", uselist=False, back_populates="reviewing_user") - -class RootURL(UpdatedAtMixin, StandardModel): - __tablename__ = 'root_url_cache' - __table_args__ = ( - UniqueConstraint( - "url", - name="uq_root_url_url"), - ) - - url = Column(String, nullable=False) - page_title = Column(String, nullable=False) - page_description = Column(String, nullable=True) - - -class URLErrorInfo(UpdatedAtMixin, TaskDependentMixin, URLDependentMixin, StandardModel): - __tablename__ = 'url_error_info' - __table_args__ = (UniqueConstraint( - "url_id", - "task_id", - name="uq_url_id_error"), - ) - - error = Column(Text, nullable=False) - - # Relationships - url = relationship("URL", back_populates="error_info") - task = relationship("Task", back_populates="errored_urls") - -class URLHTMLContent(UpdatedAtMixin, URLDependentMixin, StandardModel): - __tablename__ = 'url_html_content' - __table_args__ = (UniqueConstraint( - "url_id", - "content_type", - name="uq_url_id_content_type"), - ) - - content_type = Column( - PGEnum('Title', 'Description', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'Div', name='url_html_content_type'), - nullable=False) - content = Column(Text, nullable=False) - - - # Relationships - url = relationship("URL", back_populates="html_content") - -class Duplicate(BatchDependentMixin, StandardModel): - """ - Identifies duplicates which occur within a batch - """ - __tablename__ = 'duplicates' - - original_url_id = Column( - Integer, - ForeignKey('urls.id'), - nullable=False, - doc="The original URL ID" - ) - - # Relationships - batch = relationship("Batch", back_populates="duplicates") - original_url = relationship("URL", back_populates="duplicates") - - - -class Log(CreatedAtMixin, BatchDependentMixin, StandardModel): - __tablename__ = 'logs' - - log = Column(Text, nullable=False) - - # Relationships - batch = relationship("Batch", back_populates="logs") - -class Missing(BatchDependentMixin, StandardModel): - __tablename__ = 'missing' - - place_id = Column(Integer, nullable=False) - record_type = Column(String, nullable=False) - strategy_used = Column(Text, nullable=False) - date_searched = get_created_at_column() - - # Relationships - batch = relationship("Batch", back_populates="missings") - -class Task(UpdatedAtMixin, StandardModel): - __tablename__ = 'tasks' - - task_type = Column( - PGEnum( - *[task_type.value for task_type in TaskType], - name='task_type' - ), nullable=False) - task_status = Column(batch_status_enum, nullable=False) - - # Relationships - urls = relationship( - "URL", - secondary="link_task_urls", - back_populates="tasks" - ) - error = relationship("TaskError", back_populates="task") - errored_urls = relationship("URLErrorInfo", back_populates="task") - -class LinkTaskURL(Base): - __tablename__ = 'link_task_urls' - __table_args__ = (UniqueConstraint( - "task_id", - "url_id", - name="uq_task_id_url_id"), - ) - - task_id = Column(Integer, ForeignKey('tasks.id', ondelete="CASCADE"), primary_key=True) - url_id = Column(Integer, ForeignKey('urls.id', ondelete="CASCADE"), primary_key=True) - - - -class TaskError(UpdatedAtMixin, TaskDependentMixin, StandardModel): - __tablename__ = 'task_errors' - - error = Column(Text, nullable=False) - - # Relationships - task = relationship("Task", back_populates="error") - - __table_args__ = (UniqueConstraint( - "task_id", - "error", - name="uq_task_id_error"), - ) - -class Agency(UpdatedAtMixin, Base): - __tablename__ = "agencies" - - agency_id = Column(Integer, primary_key=True) - name = Column(String, nullable=False) - state = Column(String, nullable=True) - county = Column(String, nullable=True) - locality = Column(String, nullable=True) - - # Relationships - automated_suggestions = relationship("AutomatedUrlAgencySuggestion", back_populates="agency") - user_suggestions = relationship("UserUrlAgencySuggestion", back_populates="agency") - confirmed_urls = relationship("ConfirmedURLAgency", back_populates="agency") - -class ConfirmedURLAgency(URLDependentMixin, StandardModel): - __tablename__ = "confirmed_url_agency" - - agency_id = get_agency_id_foreign_column() - - url = relationship("URL", back_populates="confirmed_agencies") - agency = relationship("Agency", back_populates="confirmed_urls") - - __table_args__ = ( - UniqueConstraint("url_id", "agency_id", name="uq_confirmed_url_agency"), - ) - -class AutomatedUrlAgencySuggestion(URLDependentMixin, StandardModel): - __tablename__ = "automated_url_agency_suggestions" - - agency_id = get_agency_id_foreign_column(nullable=True) - is_unknown = Column(Boolean, nullable=True) - - agency = relationship("Agency", back_populates="automated_suggestions") - url = relationship("URL", back_populates="automated_agency_suggestions") - - __table_args__ = ( - UniqueConstraint("agency_id", "url_id", name="uq_automated_url_agency_suggestions"), - ) - - -class UserUrlAgencySuggestion(URLDependentMixin, StandardModel): - __tablename__ = "user_url_agency_suggestions" - - agency_id = get_agency_id_foreign_column(nullable=True) - user_id = Column(Integer, nullable=False) - is_new = Column(Boolean, nullable=True) - - agency = relationship("Agency", back_populates="user_suggestions") - url = relationship("URL", back_populates="user_agency_suggestion") - - __table_args__ = ( - UniqueConstraint("agency_id", "url_id", "user_id", name="uq_user_url_agency_suggestions"), - ) - -class AutoRelevantSuggestion(UpdatedAtMixin, CreatedAtMixin, URLDependentMixin, StandardModel): - __tablename__ = "auto_relevant_suggestions" - - relevant = Column(Boolean, nullable=True) - - __table_args__ = ( - UniqueConstraint("url_id", name="auto_relevant_suggestions_uq_url_id"), - ) - - # Relationships - - url = relationship("URL", back_populates="auto_relevant_suggestion") - - -class AutoRecordTypeSuggestion( - UpdatedAtMixin, - CreatedAtMixin, - URLDependentMixin, - StandardModel -): - __tablename__ = "auto_record_type_suggestions" - record_type = Column(postgresql.ENUM(*record_type_values, name='record_type'), nullable=False) - - __table_args__ = ( - UniqueConstraint("url_id", name="auto_record_type_suggestions_uq_url_id"), - ) - - # Relationships - - url = relationship("URL", back_populates="auto_record_type_suggestion") - -class UserRelevantSuggestion( - UpdatedAtMixin, - CreatedAtMixin, - URLDependentMixin, - StandardModel -): - __tablename__ = "user_relevant_suggestions" - - user_id = Column(Integer, nullable=False) - suggested_status = Column( - postgresql.ENUM( - 'relevant', - 'not relevant', - 'individual record', - 'broken page/404 not found', - name='suggested_status' - ), - nullable=True - ) - - __table_args__ = ( - UniqueConstraint("url_id", "user_id", name="uq_user_relevant_suggestions"), - ) - - # Relationships - - url = relationship("URL", back_populates="user_relevant_suggestion") - - -class UserRecordTypeSuggestion(UpdatedAtMixin, CreatedAtMixin, URLDependentMixin, StandardModel): - __tablename__ = "user_record_type_suggestions" - - user_id = Column(Integer, nullable=False) - record_type = Column(postgresql.ENUM(*record_type_values, name='record_type'), nullable=False) - - __table_args__ = ( - UniqueConstraint("url_id", "user_id", name="uq_user_record_type_suggestions"), - ) - - # Relationships - - url = relationship("URL", back_populates="user_record_type_suggestion") - -class BacklogSnapshot(CreatedAtMixin, StandardModel): - __tablename__ = "backlog_snapshot" - - count_pending_total = Column(Integer, nullable=False) - -class URLDataSource(CreatedAtMixin, URLDependentMixin, StandardModel): - __tablename__ = "url_data_sources" - - data_source_id = Column(Integer, nullable=False) - - # Relationships - url = relationship( - "URL", - back_populates="data_source", - uselist=False - ) \ No newline at end of file diff --git a/src/db/models/instantiations/__init__.py b/src/db/models/instantiations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/models/instantiations/agency.py b/src/db/models/instantiations/agency.py new file mode 100644 index 00000000..84716726 --- /dev/null +++ b/src/db/models/instantiations/agency.py @@ -0,0 +1,20 @@ +from sqlalchemy import Column, Integer, String +from sqlalchemy.orm import relationship + +from src.db.models.mixins import UpdatedAtMixin +from src.db.models.templates import Base + + +class Agency(UpdatedAtMixin, Base): + __tablename__ = "agencies" + + agency_id = Column(Integer, primary_key=True) + name = Column(String, nullable=False) + state = Column(String, nullable=True) + county = Column(String, nullable=True) + locality = Column(String, nullable=True) + + # Relationships + automated_suggestions = relationship("AutomatedUrlAgencySuggestion", back_populates="agency") + user_suggestions = relationship("UserUrlAgencySuggestion", back_populates="agency") + confirmed_urls = relationship("ConfirmedURLAgency", back_populates="agency") diff --git a/src/db/models/instantiations/backlog_snapshot.py b/src/db/models/instantiations/backlog_snapshot.py new file mode 100644 index 00000000..240a82fd --- /dev/null +++ b/src/db/models/instantiations/backlog_snapshot.py @@ -0,0 +1,10 @@ +from sqlalchemy import Column, Integer + +from src.db.models.mixins import CreatedAtMixin +from src.db.models.templates import StandardModel + + +class BacklogSnapshot(CreatedAtMixin, StandardModel): + __tablename__ = "backlog_snapshot" + + count_pending_total = Column(Integer, nullable=False) diff --git a/src/db/models/instantiations/batch.py b/src/db/models/instantiations/batch.py new file mode 100644 index 00000000..55bc1b01 --- /dev/null +++ b/src/db/models/instantiations/batch.py @@ -0,0 +1,52 @@ +from sqlalchemy import Column, Integer, TIMESTAMP, Float, JSON +from sqlalchemy.dialects import postgresql +from sqlalchemy.orm import relationship + +from src.db.models.helpers import CURRENT_TIME_SERVER_DEFAULT +from src.db.models.templates import StandardModel +from src.db.models.types import batch_status_enum + + +class Batch(StandardModel): + __tablename__ = 'batches' + + strategy = Column( + postgresql.ENUM( + 'example', + 'ckan', + 'muckrock_county_search', + 'auto_googler', + 'muckrock_all_search', + 'muckrock_simple_search', + 'common_crawler', + 'manual', + name='batch_strategy'), + nullable=False) + user_id = Column(Integer, nullable=False) + # Gives the status of the batch + status = Column( + batch_status_enum, + nullable=False + ) + date_generated = Column(TIMESTAMP, nullable=False, server_default=CURRENT_TIME_SERVER_DEFAULT) + # How often URLs ended up approved in the database + strategy_success_rate = Column(Float) + # Percentage of metadata identified by models + metadata_success_rate = Column(Float) + # Rate of matching to agencies + agency_match_rate = Column(Float) + # Rate of matching to record types + record_type_match_rate = Column(Float) + # Rate of matching to record categories + record_category_match_rate = Column(Float) + # Time taken to generate the batch + # TODO: Add means to update after execution + compute_time = Column(Float) + # The parameters used to generate the batch + parameters = Column(JSON) + + # Relationships + urls = relationship("URL", back_populates="batch") + # missings = relationship("Missing", back_populates="batch") # Not in active use + logs = relationship("Log", back_populates="batch") + duplicates = relationship("Duplicate", back_populates="batch") diff --git a/src/db/models/instantiations/confirmed_url_agency.py b/src/db/models/instantiations/confirmed_url_agency.py new file mode 100644 index 00000000..db63b114 --- /dev/null +++ b/src/db/models/instantiations/confirmed_url_agency.py @@ -0,0 +1,19 @@ +from sqlalchemy import UniqueConstraint +from sqlalchemy.orm import relationship + +from src.db.models.helpers import get_agency_id_foreign_column +from src.db.models.mixins import URLDependentMixin +from src.db.models.templates import StandardModel + + +class ConfirmedURLAgency(URLDependentMixin, StandardModel): + __tablename__ = "confirmed_url_agency" + + agency_id = get_agency_id_foreign_column() + + url = relationship("URL", back_populates="confirmed_agencies") + agency = relationship("Agency", back_populates="confirmed_urls") + + __table_args__ = ( + UniqueConstraint("url_id", "agency_id", name="uq_confirmed_url_agency"), + ) diff --git a/src/db/models/instantiations/duplicate.py b/src/db/models/instantiations/duplicate.py new file mode 100644 index 00000000..7a80d918 --- /dev/null +++ b/src/db/models/instantiations/duplicate.py @@ -0,0 +1,23 @@ +from sqlalchemy import Column, Integer, ForeignKey +from sqlalchemy.orm import relationship + +from src.db.models.mixins import BatchDependentMixin +from src.db.models.templates import StandardModel + + +class Duplicate(BatchDependentMixin, StandardModel): + """ + Identifies duplicates which occur within a batch + """ + __tablename__ = 'duplicates' + + original_url_id = Column( + Integer, + ForeignKey('urls.id'), + nullable=False, + doc="The original URL ID" + ) + + # Relationships + batch = relationship("Batch", back_populates="duplicates") + original_url = relationship("URL", back_populates="duplicates") diff --git a/src/db/models/instantiations/link_task_url.py b/src/db/models/instantiations/link_task_url.py new file mode 100644 index 00000000..02ef02c3 --- /dev/null +++ b/src/db/models/instantiations/link_task_url.py @@ -0,0 +1,15 @@ +from sqlalchemy import UniqueConstraint, Column, Integer, ForeignKey + +from src.db.models.templates import Base + + +class LinkTaskURL(Base): + __tablename__ = 'link_task_urls' + __table_args__ = (UniqueConstraint( + "task_id", + "url_id", + name="uq_task_id_url_id"), + ) + + task_id = Column(Integer, ForeignKey('tasks.id', ondelete="CASCADE"), primary_key=True) + url_id = Column(Integer, ForeignKey('urls.id', ondelete="CASCADE"), primary_key=True) diff --git a/src/db/models/instantiations/log.py b/src/db/models/instantiations/log.py new file mode 100644 index 00000000..756e10c5 --- /dev/null +++ b/src/db/models/instantiations/log.py @@ -0,0 +1,14 @@ +from sqlalchemy import Column, Text +from sqlalchemy.orm import relationship + +from src.db.models.mixins import CreatedAtMixin, BatchDependentMixin +from src.db.models.templates import StandardModel + + +class Log(CreatedAtMixin, BatchDependentMixin, StandardModel): + __tablename__ = 'logs' + + log = Column(Text, nullable=False) + + # Relationships + batch = relationship("Batch", back_populates="logs") diff --git a/src/db/models/instantiations/missing.py b/src/db/models/instantiations/missing.py new file mode 100644 index 00000000..0babd91d --- /dev/null +++ b/src/db/models/instantiations/missing.py @@ -0,0 +1,18 @@ +from sqlalchemy import Column, Integer, String, Text +from sqlalchemy.orm import relationship + +from src.db.models.helpers import get_created_at_column +from src.db.models.mixins import BatchDependentMixin +from src.db.models.templates import StandardModel + + +class Missing(BatchDependentMixin, StandardModel): + __tablename__ = 'missing' + + place_id = Column(Integer, nullable=False) + record_type = Column(String, nullable=False) + strategy_used = Column(Text, nullable=False) + date_searched = get_created_at_column() + + # Relationships + batch = relationship("Batch") diff --git a/src/db/models/instantiations/root_url_cache.py b/src/db/models/instantiations/root_url_cache.py new file mode 100644 index 00000000..d121ae28 --- /dev/null +++ b/src/db/models/instantiations/root_url_cache.py @@ -0,0 +1,17 @@ +from sqlalchemy import UniqueConstraint, Column, String + +from src.db.models.mixins import UpdatedAtMixin +from src.db.models.templates import StandardModel + + +class RootURL(UpdatedAtMixin, StandardModel): + __tablename__ = 'root_url_cache' + __table_args__ = ( + UniqueConstraint( + "url", + name="uq_root_url_url"), + ) + + url = Column(String, nullable=False) + page_title = Column(String, nullable=False) + page_description = Column(String, nullable=True) diff --git a/src/db/models/instantiations/task/__init__.py b/src/db/models/instantiations/task/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/models/instantiations/task/core.py b/src/db/models/instantiations/task/core.py new file mode 100644 index 00000000..89c80405 --- /dev/null +++ b/src/db/models/instantiations/task/core.py @@ -0,0 +1,27 @@ +from sqlalchemy import Column +from sqlalchemy.orm import relationship + +from src.db.enums import PGEnum, TaskType +from src.db.models.mixins import UpdatedAtMixin +from src.db.models.templates import StandardModel +from src.db.models.types import batch_status_enum + + +class Task(UpdatedAtMixin, StandardModel): + __tablename__ = 'tasks' + + task_type = Column( + PGEnum( + *[task_type.value for task_type in TaskType], + name='task_type' + ), nullable=False) + task_status = Column(batch_status_enum, nullable=False) + + # Relationships + urls = relationship( + "URL", + secondary="link_task_urls", + back_populates="tasks" + ) + error = relationship("TaskError", back_populates="task") + errored_urls = relationship("URLErrorInfo", back_populates="task") diff --git a/src/db/models/instantiations/task/error.py b/src/db/models/instantiations/task/error.py new file mode 100644 index 00000000..cf1ae24f --- /dev/null +++ b/src/db/models/instantiations/task/error.py @@ -0,0 +1,20 @@ +from sqlalchemy import Column, Text, UniqueConstraint +from sqlalchemy.orm import relationship + +from src.db.models.mixins import UpdatedAtMixin, TaskDependentMixin +from src.db.models.templates import StandardModel + + +class TaskError(UpdatedAtMixin, TaskDependentMixin, StandardModel): + __tablename__ = 'task_errors' + + error = Column(Text, nullable=False) + + # Relationships + task = relationship("Task", back_populates="error") + + __table_args__ = (UniqueConstraint( + "task_id", + "error", + name="uq_task_id_error"), + ) diff --git a/src/db/models/instantiations/url/__init__.py b/src/db/models/instantiations/url/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/models/instantiations/url/checked_for_duplicate.py b/src/db/models/instantiations/url/checked_for_duplicate.py new file mode 100644 index 00000000..d5811c6e --- /dev/null +++ b/src/db/models/instantiations/url/checked_for_duplicate.py @@ -0,0 +1,11 @@ +from sqlalchemy.orm import relationship + +from src.db.models.mixins import CreatedAtMixin, URLDependentMixin +from src.db.models.templates import StandardModel + + +class URLCheckedForDuplicate(CreatedAtMixin, URLDependentMixin, StandardModel): + __tablename__ = 'url_checked_for_duplicate' + + # Relationships + url = relationship("URL", uselist=False, back_populates="checked_for_duplicate") diff --git a/src/db/models/instantiations/url/core.py b/src/db/models/instantiations/url/core.py new file mode 100644 index 00000000..b5df711a --- /dev/null +++ b/src/db/models/instantiations/url/core.py @@ -0,0 +1,80 @@ +from sqlalchemy import Column, Integer, ForeignKey, Text, String, JSON +from sqlalchemy.dialects import postgresql +from sqlalchemy.orm import relationship + +from src.db.models.mixins import UpdatedAtMixin, CreatedAtMixin +from src.db.models.templates import StandardModel +from src.db.models.types import record_type_values + + +class URL(UpdatedAtMixin, CreatedAtMixin, StandardModel): + __tablename__ = 'urls' + + # The batch this URL is associated with + batch_id = Column(Integer, ForeignKey('batches.id', name='fk_url_batch_id'), nullable=False) + url = Column(Text, unique=True) + name = Column(String) + description = Column(Text) + # The metadata from the collector + collector_metadata = Column(JSON) + # The outcome of the URL: submitted, human_labeling, rejected, duplicate, etc. + outcome = Column( + postgresql.ENUM( + 'pending', + 'submitted', + 'validated', + 'not relevant', + 'duplicate', + 'error', + '404 not found', + 'individual record', + name='url_status' + ), + nullable=False + ) + record_type = Column(postgresql.ENUM(*record_type_values, name='record_type'), nullable=True) + + # Relationships + batch = relationship("Batch", back_populates="urls") + duplicates = relationship("Duplicate", back_populates="original_url") + html_content = relationship("URLHTMLContent", back_populates="url", cascade="all, delete-orphan") + error_info = relationship("URLErrorInfo", back_populates="url", cascade="all, delete-orphan") + tasks = relationship( + "Task", + secondary="link_task_urls", + back_populates="urls", + ) + automated_agency_suggestions = relationship( + "AutomatedUrlAgencySuggestion", back_populates="url") + user_agency_suggestion = relationship( + "UserUrlAgencySuggestion", uselist=False, back_populates="url") + auto_record_type_suggestion = relationship( + "AutoRecordTypeSuggestion", uselist=False, back_populates="url") + user_record_type_suggestion = relationship( + "UserRecordTypeSuggestion", uselist=False, back_populates="url") + auto_relevant_suggestion = relationship( + "AutoRelevantSuggestion", uselist=False, back_populates="url") + user_relevant_suggestion = relationship( + "UserRelevantSuggestion", uselist=False, back_populates="url") + reviewing_user = relationship( + "ReviewingUserURL", uselist=False, back_populates="url") + optional_data_source_metadata = relationship( + "URLOptionalDataSourceMetadata", uselist=False, back_populates="url") + confirmed_agencies = relationship( + "ConfirmedURLAgency", + ) + data_source = relationship( + "URLDataSource", + back_populates="url", + uselist=False + ) + checked_for_duplicate = relationship( + "URLCheckedForDuplicate", + uselist=False, + back_populates="url" + ) + probed_for_404 = relationship( + "URLProbedFor404", + uselist=False, + back_populates="url" + ) diff --git a/src/db/models/instantiations/url/data_source.py b/src/db/models/instantiations/url/data_source.py new file mode 100644 index 00000000..ad6caf46 --- /dev/null +++ b/src/db/models/instantiations/url/data_source.py @@ -0,0 +1,18 @@ +from sqlalchemy import Column, Integer +from sqlalchemy.orm import relationship + +from src.db.models.mixins import CreatedAtMixin, URLDependentMixin +from src.db.models.templates import StandardModel + + +class URLDataSource(CreatedAtMixin, URLDependentMixin, StandardModel): + __tablename__ = "url_data_sources" + + data_source_id = Column(Integer, nullable=False) + + # Relationships + url = relationship( + "URL", + back_populates="data_source", + uselist=False + ) diff --git a/src/db/models/instantiations/url/error_info.py b/src/db/models/instantiations/url/error_info.py new file mode 100644 index 00000000..d2a09b6a --- /dev/null +++ b/src/db/models/instantiations/url/error_info.py @@ -0,0 +1,20 @@ +from sqlalchemy import UniqueConstraint, Column, Text +from sqlalchemy.orm import relationship + +from src.db.models.mixins import UpdatedAtMixin, TaskDependentMixin, URLDependentMixin +from src.db.models.templates import StandardModel + + +class URLErrorInfo(UpdatedAtMixin, TaskDependentMixin, URLDependentMixin, StandardModel): + __tablename__ = 'url_error_info' + __table_args__ = (UniqueConstraint( + "url_id", + "task_id", + name="uq_url_id_error"), + ) + + error = Column(Text, nullable=False) + + # Relationships + url = relationship("URL", back_populates="error_info") + task = relationship("Task", back_populates="errored_urls") diff --git a/src/db/models/instantiations/url/html_content.py b/src/db/models/instantiations/url/html_content.py new file mode 100644 index 00000000..39ad3666 --- /dev/null +++ b/src/db/models/instantiations/url/html_content.py @@ -0,0 +1,24 @@ +from sqlalchemy import UniqueConstraint, Column, Text +from sqlalchemy.orm import relationship + +from src.db.enums import PGEnum +from src.db.models.mixins import UpdatedAtMixin, URLDependentMixin +from src.db.models.templates import StandardModel + + +class URLHTMLContent(UpdatedAtMixin, URLDependentMixin, StandardModel): + __tablename__ = 'url_html_content' + __table_args__ = (UniqueConstraint( + "url_id", + "content_type", + name="uq_url_id_content_type"), + ) + + content_type = Column( + PGEnum('Title', 'Description', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'Div', name='url_html_content_type'), + nullable=False) + content = Column(Text, nullable=False) + + + # Relationships + url = relationship("URL", back_populates="html_content") diff --git a/src/db/models/instantiations/url/optional_data_source_metadata.py b/src/db/models/instantiations/url/optional_data_source_metadata.py new file mode 100644 index 00000000..84871982 --- /dev/null +++ b/src/db/models/instantiations/url/optional_data_source_metadata.py @@ -0,0 +1,16 @@ +from sqlalchemy import Column, ARRAY, String +from sqlalchemy.orm import relationship + +from src.db.models.mixins import URLDependentMixin +from src.db.models.templates import StandardModel + + +class URLOptionalDataSourceMetadata(URLDependentMixin, StandardModel): + __tablename__ = 'url_optional_data_source_metadata' + + record_formats = Column(ARRAY(String), nullable=True) + data_portal_type = Column(String, nullable=True) + supplying_entity = Column(String, nullable=True) + + # Relationships + url = relationship("URL", uselist=False, back_populates="optional_data_source_metadata") diff --git a/src/db/models/instantiations/url/probed_for_404.py b/src/db/models/instantiations/url/probed_for_404.py new file mode 100644 index 00000000..3913e37e --- /dev/null +++ b/src/db/models/instantiations/url/probed_for_404.py @@ -0,0 +1,14 @@ +from sqlalchemy.orm import relationship + +from src.db.models.helpers import get_created_at_column +from src.db.models.mixins import URLDependentMixin +from src.db.models.templates import StandardModel + + +class URLProbedFor404(URLDependentMixin, StandardModel): + __tablename__ = 'url_probed_for_404' + + last_probed_at = get_created_at_column() + + # Relationships + url = relationship("URL", uselist=False, back_populates="probed_for_404") diff --git a/src/db/models/instantiations/url/reviewing_user.py b/src/db/models/instantiations/url/reviewing_user.py new file mode 100644 index 00000000..d28a33e7 --- /dev/null +++ b/src/db/models/instantiations/url/reviewing_user.py @@ -0,0 +1,18 @@ +from sqlalchemy import UniqueConstraint, Column, Integer +from sqlalchemy.orm import relationship + +from src.db.models.mixins import CreatedAtMixin, URLDependentMixin +from src.db.models.templates import StandardModel + + +class ReviewingUserURL(CreatedAtMixin, URLDependentMixin, StandardModel): + __tablename__ = 'reviewing_user_url' + __table_args__ = ( + UniqueConstraint( + "url_id", + name="approving_user_url_uq_user_id_url_id"), + ) + user_id = Column(Integer, nullable=False) + + # Relationships + url = relationship("URL", uselist=False, back_populates="reviewing_user") diff --git a/src/db/models/instantiations/url/suggestion/README.md b/src/db/models/instantiations/url/suggestion/README.md new file mode 100644 index 00000000..1a7a246f --- /dev/null +++ b/src/db/models/instantiations/url/suggestion/README.md @@ -0,0 +1 @@ +Contains all suggestion/annotations for URLs \ No newline at end of file diff --git a/src/db/models/instantiations/url/suggestion/__init__.py b/src/db/models/instantiations/url/suggestion/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/models/instantiations/url/suggestion/agency/__init__.py b/src/db/models/instantiations/url/suggestion/agency/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/models/instantiations/url/suggestion/agency/auto.py b/src/db/models/instantiations/url/suggestion/agency/auto.py new file mode 100644 index 00000000..5831882f --- /dev/null +++ b/src/db/models/instantiations/url/suggestion/agency/auto.py @@ -0,0 +1,20 @@ +from sqlalchemy import Column, Boolean, UniqueConstraint +from sqlalchemy.orm import relationship + +from src.db.models.helpers import get_agency_id_foreign_column +from src.db.models.mixins import URLDependentMixin +from src.db.models.templates import StandardModel + + +class AutomatedUrlAgencySuggestion(URLDependentMixin, StandardModel): + __tablename__ = "automated_url_agency_suggestions" + + agency_id = get_agency_id_foreign_column(nullable=True) + is_unknown = Column(Boolean, nullable=True) + + agency = relationship("Agency", back_populates="automated_suggestions") + url = relationship("URL", back_populates="automated_agency_suggestions") + + __table_args__ = ( + UniqueConstraint("agency_id", "url_id", name="uq_automated_url_agency_suggestions"), + ) diff --git a/src/db/models/instantiations/url/suggestion/agency/user.py b/src/db/models/instantiations/url/suggestion/agency/user.py new file mode 100644 index 00000000..cb92bfc0 --- /dev/null +++ b/src/db/models/instantiations/url/suggestion/agency/user.py @@ -0,0 +1,21 @@ +from sqlalchemy import Column, Boolean, UniqueConstraint, Integer +from sqlalchemy.orm import relationship + +from src.db.models.helpers import get_agency_id_foreign_column +from src.db.models.mixins import URLDependentMixin +from src.db.models.templates import StandardModel + + +class UserUrlAgencySuggestion(URLDependentMixin, StandardModel): + __tablename__ = "user_url_agency_suggestions" + + agency_id = get_agency_id_foreign_column(nullable=True) + user_id = Column(Integer, nullable=False) + is_new = Column(Boolean, nullable=True) + + agency = relationship("Agency", back_populates="user_suggestions") + url = relationship("URL", back_populates="user_agency_suggestion") + + __table_args__ = ( + UniqueConstraint("agency_id", "url_id", "user_id", name="uq_user_url_agency_suggestions"), + ) diff --git a/src/db/models/instantiations/url/suggestion/record_type/__init__.py b/src/db/models/instantiations/url/suggestion/record_type/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/models/instantiations/url/suggestion/record_type/auto.py b/src/db/models/instantiations/url/suggestion/record_type/auto.py new file mode 100644 index 00000000..00d738b8 --- /dev/null +++ b/src/db/models/instantiations/url/suggestion/record_type/auto.py @@ -0,0 +1,27 @@ +from sqlalchemy import Column, UniqueConstraint +from sqlalchemy.dialects import postgresql +from sqlalchemy.orm import relationship + +from src.db.models.mixins import URLDependentMixin, UpdatedAtMixin, CreatedAtMixin +from src.db.models.templates import StandardModel +from src.db.models.types import record_type_values + + +class AutoRecordTypeSuggestion( + UpdatedAtMixin, + CreatedAtMixin, + URLDependentMixin, + StandardModel +): + __tablename__ = "auto_record_type_suggestions" + record_type = Column(postgresql.ENUM(*record_type_values, name='record_type'), nullable=False) + + __table_args__ = ( + UniqueConstraint("url_id", name="auto_record_type_suggestions_uq_url_id"), + ) + + # Relationships + + url = relationship("URL", back_populates="auto_record_type_suggestion") + + diff --git a/src/db/models/instantiations/url/suggestion/record_type/user.py b/src/db/models/instantiations/url/suggestion/record_type/user.py new file mode 100644 index 00000000..cda6fb17 --- /dev/null +++ b/src/db/models/instantiations/url/suggestion/record_type/user.py @@ -0,0 +1,22 @@ +from sqlalchemy import Column, Integer, UniqueConstraint +from sqlalchemy.dialects import postgresql +from sqlalchemy.orm import relationship + +from src.db.models.mixins import UpdatedAtMixin, CreatedAtMixin, URLDependentMixin +from src.db.models.templates import StandardModel +from src.db.models.types import record_type_values + + +class UserRecordTypeSuggestion(UpdatedAtMixin, CreatedAtMixin, URLDependentMixin, StandardModel): + __tablename__ = "user_record_type_suggestions" + + user_id = Column(Integer, nullable=False) + record_type = Column(postgresql.ENUM(*record_type_values, name='record_type'), nullable=False) + + __table_args__ = ( + UniqueConstraint("url_id", "user_id", name="uq_user_record_type_suggestions"), + ) + + # Relationships + + url = relationship("URL", back_populates="user_record_type_suggestion") diff --git a/src/db/models/instantiations/url/suggestion/relevant/__init__.py b/src/db/models/instantiations/url/suggestion/relevant/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/models/instantiations/url/suggestion/relevant/auto.py b/src/db/models/instantiations/url/suggestion/relevant/auto.py new file mode 100644 index 00000000..f624c759 --- /dev/null +++ b/src/db/models/instantiations/url/suggestion/relevant/auto.py @@ -0,0 +1,19 @@ +from sqlalchemy import Column, Boolean, UniqueConstraint +from sqlalchemy.orm import relationship + +from src.db.models.mixins import UpdatedAtMixin, CreatedAtMixin, URLDependentMixin +from src.db.models.templates import StandardModel + + +class AutoRelevantSuggestion(UpdatedAtMixin, CreatedAtMixin, URLDependentMixin, StandardModel): + __tablename__ = "auto_relevant_suggestions" + + relevant = Column(Boolean, nullable=True) + + __table_args__ = ( + UniqueConstraint("url_id", name="auto_relevant_suggestions_uq_url_id"), + ) + + # Relationships + + url = relationship("URL", back_populates="auto_relevant_suggestion") diff --git a/src/db/models/instantiations/url/suggestion/relevant/user.py b/src/db/models/instantiations/url/suggestion/relevant/user.py new file mode 100644 index 00000000..35d30c44 --- /dev/null +++ b/src/db/models/instantiations/url/suggestion/relevant/user.py @@ -0,0 +1,35 @@ +from sqlalchemy import Column, UniqueConstraint, Integer +from sqlalchemy.dialects import postgresql +from sqlalchemy.orm import relationship + +from src.db.models.mixins import UpdatedAtMixin, CreatedAtMixin, URLDependentMixin +from src.db.models.templates import StandardModel + + +class UserRelevantSuggestion( + UpdatedAtMixin, + CreatedAtMixin, + URLDependentMixin, + StandardModel +): + __tablename__ = "user_relevant_suggestions" + + user_id = Column(Integer, nullable=False) + suggested_status = Column( + postgresql.ENUM( + 'relevant', + 'not relevant', + 'individual record', + 'broken page/404 not found', + name='suggested_status' + ), + nullable=True + ) + + __table_args__ = ( + UniqueConstraint("url_id", "user_id", name="uq_user_relevant_suggestions"), + ) + + # Relationships + + url = relationship("URL", back_populates="user_relevant_suggestion") diff --git a/src/db/models/types.py b/src/db/models/types.py new file mode 100644 index 00000000..dbaa398f --- /dev/null +++ b/src/db/models/types.py @@ -0,0 +1,6 @@ +from src.core.enums import BatchStatus, RecordType +from src.db.enums import PGEnum +from src.util.helper_functions import get_enum_values + +batch_status_enum = PGEnum('ready to label', 'error', 'in-process', 'aborted', name='batch_status') +record_type_values = get_enum_values(RecordType) diff --git a/src/db/queries/implementations/core/get_next_url_for_final_review.py b/src/db/queries/implementations/core/get_next_url_for_final_review.py index a96f3932..b526925a 100644 --- a/src/db/queries/implementations/core/get_next_url_for_final_review.py +++ b/src/db/queries/implementations/core/get_next_url_for_final_review.py @@ -1,6 +1,6 @@ from typing import Optional, Type -from sqlalchemy import case, exists, select, func, Select, and_, desc, asc, FromClause +from sqlalchemy import case, select, func, Select, and_, desc, asc, FromClause from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import joinedload @@ -10,8 +10,14 @@ from src.core.tasks.operators.url_html.scraper.parser.util import convert_to_response_html_info from src.db.dto_converter import DTOConverter from src.db.dtos.url_html_content_info import URLHTMLContentInfo -from src.db.models.core import URL, UserRelevantSuggestion, UserRecordTypeSuggestion, UserUrlAgencySuggestion, \ - AutoRelevantSuggestion, AutoRecordTypeSuggestion, AutomatedUrlAgencySuggestion, ConfirmedURLAgency +from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency +from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion +from src.db.models.instantiations.url.suggestion.record_type.auto import AutoRecordTypeSuggestion +from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.url.suggestion.record_type.user import UserRecordTypeSuggestion +from src.db.models.instantiations.url.suggestion.relevant.auto import AutoRelevantSuggestion +from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion from src.db.models.mixins import URLDependentMixin from src.db.queries.base.builder import QueryBuilderBase diff --git a/src/db/queries/implementations/core/get_recent_batch_summaries/builder.py b/src/db/queries/implementations/core/get_recent_batch_summaries/builder.py index c9958d6f..3a74e5b0 100644 --- a/src/db/queries/implementations/core/get_recent_batch_summaries/builder.py +++ b/src/db/queries/implementations/core/get_recent_batch_summaries/builder.py @@ -7,7 +7,7 @@ from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary from src.collectors.enums import CollectorType from src.core.enums import BatchStatus -from src.db.models.core import Batch +from src.db.models.instantiations.batch import Batch from src.db.queries.base.builder import QueryBuilderBase from src.db.queries.implementations.core.get_recent_batch_summaries.url_counts.builder import URLCountsCTEQueryBuilder from src.db.queries.implementations.core.get_recent_batch_summaries.url_counts.labels import URLCountsLabels diff --git a/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/builder.py b/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/builder.py index bd6c382a..a34d8ff2 100644 --- a/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/builder.py +++ b/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/builder.py @@ -5,7 +5,8 @@ from src.collectors.enums import URLStatus, CollectorType from src.core.enums import BatchStatus -from src.db.models.core import Batch, URL +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.batch import Batch from src.db.queries.base.builder import QueryBuilderBase from src.db.queries.helpers import add_page_offset from src.db.queries.implementations.core.get_recent_batch_summaries.url_counts.labels import URLCountsLabels diff --git a/src/db/statement_composer.py b/src/db/statement_composer.py index 670bc7a6..b712a581 100644 --- a/src/db/statement_composer.py +++ b/src/db/statement_composer.py @@ -7,8 +7,14 @@ from src.core.enums import BatchStatus from src.db.constants import STANDARD_ROW_LIMIT from src.db.enums import TaskType -from src.db.models.core import URL, URLHTMLContent, AutomatedUrlAgencySuggestion, URLOptionalDataSourceMetadata, Batch, \ - ConfirmedURLAgency, LinkTaskURL, Task +from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency +from src.db.models.instantiations.link_task_url import LinkTaskURL +from src.db.models.instantiations.task.core import Task +from src.db.models.instantiations.url.html_content import URLHTMLContent +from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.batch import Batch +from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion from src.db.types import UserSuggestionType diff --git a/src/db/types.py b/src/db/types.py index 44350e6d..dadef2f1 100644 --- a/src/db/types.py +++ b/src/db/types.py @@ -1,6 +1,8 @@ from typing import TypeVar -from src.db.models.core import UserUrlAgencySuggestion, UserRecordTypeSuggestion, UserRelevantSuggestion +from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion +from src.db.models.instantiations.url.suggestion.record_type.user import UserRecordTypeSuggestion +from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion from src.db.queries.base.labels import LabelsBase UserSuggestionType = UserUrlAgencySuggestion | UserRelevantSuggestion | UserRecordTypeSuggestion diff --git a/src/util/alembic_helpers.py b/src/util/alembic_helpers.py index 822b4cd9..579ba34e 100644 --- a/src/util/alembic_helpers.py +++ b/src/util/alembic_helpers.py @@ -52,4 +52,23 @@ def alter_enum_value( """ Changes one value of an enum type """ - op.execute(f"ALTER TYPE {enum_name} RENAME VALUE '{old_value}' TO '{new_value}'") \ No newline at end of file + op.execute(f"ALTER TYPE {enum_name} RENAME VALUE '{old_value}' TO '{new_value}'") + +def created_at_column(): + """Returns a standard `created_at` column.""" + return sa.Column( + 'created_at', + sa.DateTime(), + server_default=sa.text('now()'), + nullable=False + ) + +def updated_at_column(): + """Returns a standard `updated_at` column.""" + return sa.Column( + 'updated_at', + sa.DateTime(), + server_default=sa.text('now()'), + server_onupdate=sa.text('now()'), + nullable=False + ) diff --git a/tests/alembic/test_revisions.py b/tests/alembic/test_revisions.py index 5ddd77e5..19b5d046 100644 --- a/tests/alembic/test_revisions.py +++ b/tests/alembic/test_revisions.py @@ -1,378 +1,7 @@ """ This module tests that revisions perform as expected. - -Specifically, they test that: -* Columns are added, removed, or renamed as expected after appropriate migrations -* Data is properly modified (or not modified) after migrations - -They do not test the overall integrity of the schema; - such tests are reserved for database structure tests, - which test only the most recent version of the schema. - """ -from itertools import product - -from sqlalchemy import text - -from tests.alembic.helpers import columns_in_table -from tests.alembic.helpers import get_enum_values, table_creation_check - - -def test_base(alembic_runner): - table_names = alembic_runner.inspector.get_table_names() - assert table_names == [ - 'alembic_version', - ] - - alembic_runner.upgrade("d11f07224d1f") - - # Reflect the updated database state - alembic_runner.reflect() - - table_names = alembic_runner.inspector.get_table_names() - assert table_names.sort() == [ - 'batches', - 'logs', - 'missing', - 'urls', - 'duplicates', - 'alembic_version', - ].sort() - -def test_add_url_updated_at(alembic_runner): - alembic_runner.upgrade("d11f07224d1f") - - columns = [col["name"] for col in alembic_runner.inspector.get_columns("urls")] - assert "updated_at" not in columns - - alembic_runner.upgrade("a4750e7ff8e7") - - # # Reflect the updated database state - alembic_runner.reflect() - - columns = [col["name"] for col in alembic_runner.inspector.get_columns("urls")] - assert "updated_at" in columns - # - with alembic_runner.session() as session: - pass - # # Add a batch - session.execute(text( - """ - INSERT INTO - BATCHES(strategy, user_id, status, total_url_count, original_url_count, duplicate_url_count) - VALUES('test', 1, 'complete', 0, 0, 0); - COMMIT; - """ - )) - - result = session.execute(text( - """ - INSERT INTO URLS(batch_id, url, url_metadata, outcome) - VALUES(1, 'https://example.com', '{}', 'success') - RETURNING id; - """ - )) - url_id = result.scalar() - with alembic_runner.session() as session: - updated_1 = session.execute(text( - f"""SELECT UPDATED_AT FROM URLS WHERE ID = {url_id};""" - )).scalar() - - session.execute(text( - f""" - UPDATE URLS SET url = 'https://example.com/new' - WHERE id = {url_id}; - COMMIT; - """ - )) - - result = session.execute(text( - f""" - SELECT url, updated_at FROM URLs WHERE id = {url_id}; - """ - )).fetchone() - - assert result[0] == "https://example.com/new" - updated_2 = result[1] - - assert updated_1 < updated_2 - - # Create a new URL entry - - - - - -def test_add_url_metadata(alembic_runner): - alembic_runner.upgrade("a4750e7ff8e7") - - columns = [col["name"] for col in alembic_runner.inspector.get_columns("urls")] - assert "collector_metadata" not in columns - assert "url_metadata" in columns - - alembic_runner.upgrade("86692fc1d862") - - # Reflect the updated database state - alembic_runner.reflect() - - columns = [col["name"] for col in alembic_runner.inspector.get_columns("urls")] - - assert "collector_metadata" in columns - assert "url_metadata" not in columns - assert 'url_metadata' in alembic_runner.inspector.get_table_names() - - columns = [col["name"] for col in alembic_runner.inspector.get_columns("url_metadata")] - assert columns.sort() == [ - 'id', - 'url_id', - 'attribute', - 'value', - 'validation_status', - 'validation_source', - 'created_at', - 'updated_at', - ].sort() - - - - # Test happy path - - # Test unique constraint - - # Test foreign key - - # Test each enum violation - -def test_convert_batch_strategy_status_to_enum(alembic_runner): - alembic_runner.upgrade("86692fc1d862") - - # Add batches with the following columns - - existing_strategy_strings = [ - "ckan", - "muckrock_county_search", - "auto_googler", - "muckrock_all_search", - "muckrock_simple_search", - "common_crawler" - ] - existing_status_strings = [ - "complete", - "error", - "in-process", - "aborted" - ] - d = {} - for strategy, status in product(existing_strategy_strings, existing_status_strings): - # Execute inserts and store each ID - query = f""" - INSERT INTO BATCHES - (strategy, user_id, status, total_url_count, original_url_count, duplicate_url_count) - VALUES( - '{strategy}', - 1, - '{status}', - 0, - 0, - 0 - ) - RETURNING ID; - """ - - id_ = alembic_runner.execute(query)[0][0] - d[id_] = [strategy, status] - - alembic_runner.upgrade('db6d60feda7d') - - # Assert all strategies and statuses remain the same - for id_ in d.keys(): - strategy, status = d[id_] - - result = alembic_runner.execute( - f""" - SELECT strategy, status FROM BATCHES WHERE id = {id_}; - """ - )[0] - assert result[0] == strategy - assert result [1] == status - - -def test_convert_url_outcome_to_enum(alembic_runner): - alembic_runner.upgrade('db6d60feda7d') - existing_outcome_strings = [ - 'pending', - 'submitted', - 'human_labeling', - 'rejected', - 'duplicate', - ] - d = {} - # with alembic_runner.session() as session: - batch_id = alembic_runner.execute( - """INSERT INTO BATCHES - (strategy, user_id, status, total_url_count, original_url_count, duplicate_url_count) - VALUES( - 'ckan', - 1, - 'in-process', - 0, - 0, - 0 - ) - RETURNING ID; - """ - )[0][0] - - - for outcome in existing_outcome_strings: - id_ = alembic_runner.execute( - f""" - INSERT INTO URLS - (batch_id, url, collector_metadata, outcome) - VALUES ( - '{batch_id}', - 'https://example.com/{outcome}', - '{{}}', - '{outcome}' - ) - RETURNING ID; - """ - )[0][0] - d[id_] = outcome - - alembic_runner.upgrade('e27c5f8409a3') - - for id_ in d.keys(): - outcome = d[id_] - - result = alembic_runner.execute( - f"""SELECT OUTCOME FROM URLS WHERE ID = {id_};""" - )[0][0] - - assert result == outcome - -def test_create_htmlcontent_and_rooturl_tables(alembic_runner): - alembic_runner.upgrade('e27c5f8409a3') - assert 'url_html_content' not in alembic_runner.inspector.get_table_names() - assert 'root_urls' not in alembic_runner.inspector.get_table_names() - - alembic_runner.upgrade('9afd8a5633c9') - alembic_runner.reflect() - - assert 'url_html_content' in alembic_runner.inspector.get_table_names() - assert 'root_urls' in alembic_runner.inspector.get_table_names() - - -def test_create_url_error_info_table_and_url_error_status(alembic_runner): - alembic_runner.upgrade('9afd8a5633c9') - alembic_runner.reflect() - - with alembic_runner.session() as session: - result = get_enum_values("url_outcome", session) - assert "error" not in result - - alembic_runner.upgrade("5a5ca06f36fa") - alembic_runner.reflect() - - with alembic_runner.session() as session: - result = get_enum_values("url_status", session) - assert "error" in result - - -def test_add_in_label_studio_metadata_status(alembic_runner): - alembic_runner.upgrade("5a5ca06f36fa") - alembic_runner.reflect() - - with alembic_runner.session() as session: - result = get_enum_values("validation_status", session) - assert "Pending Validation" not in result - - alembic_runner.upgrade("108dac321086") - alembic_runner.reflect() - with alembic_runner.session() as session: - result = get_enum_values("metadata_validation_status", session) - assert "Pending Validation" in result - -def test_create_metadata_annotation_table(alembic_runner): - table_creation_check( - alembic_runner, - ["metadata_annotations"], - start_revision="108dac321086", - end_revision="dcd158092de0" - ) - -def test_add_task_tables_and_linking_logic(alembic_runner): - alembic_runner.upgrade("dcd158092de0") - assert not columns_in_table( - alembic_runner, - table_name="url_error_info", - columns_to_check=["task_id"], - ) - assert not columns_in_table( - alembic_runner, - table_name="url_metadata", - columns_to_check=["notes"], - ) - table_creation_check( - alembic_runner, - tables=[ - "tasks", - "task_errors", - "link_task_urls" - ], - end_revision="072b32a45b1c" - ) - assert columns_in_table( - alembic_runner, - table_name="url_error_info", - columns_to_check=["task_id"], - ) - assert columns_in_table( - alembic_runner, - table_name="url_metadata", - columns_to_check=["notes"], - ) - -def test_add_url_agency_suggestions(alembic_runner): - table_creation_check( - alembic_runner, - tables=[ - "url_agency_suggestions" - ], - start_revision="072b32a45b1c", - end_revision="19bf57df581a" - ) - -def test_add_user_url_agency_suggestions(alembic_runner): - def column_check() -> bool: - return columns_in_table( - alembic_runner, - table_name="url_agency_suggestions", - columns_to_check=["user_id"] - ) - - alembic_runner.upgrade("19bf57df581a") - assert not column_check() - alembic_runner.reflect() - alembic_runner.upgrade("8c44e02733ae") - assert column_check() - -def test_revise_agency_suggestions(alembic_runner): - - tables_to_check = [ - "user_url_agency_suggestions", - "automated_url_agency_suggestions", - "agencies", - "confirmed_url_agency" - ] - - alembic_runner.upgrade("8c44e02733ae") - assert alembic_runner.table_exists("url_agency_suggestions") - assert not alembic_runner.tables_exist(tables_to_check) - alembic_runner.upgrade("d7eb670edaf0") - assert not alembic_runner.table_exists("url_agency_suggestions") - assert alembic_runner.tables_exist(tables_to_check) def test_full_upgrade_downgrade(alembic_runner): # Both should run without error diff --git a/tests/automated/integration/api/test_annotate.py b/tests/automated/integration/api/test_annotate.py index d6bbfa30..04102fe0 100644 --- a/tests/automated/integration/api/test_annotate.py +++ b/tests/automated/integration/api/test_annotate.py @@ -12,10 +12,12 @@ from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo from src.db.dtos.insert_urls_info import InsertURLsInfo from src.db.dtos.url_mapping import URLMapping -from src.db.models.core import UserUrlAgencySuggestion, UserRelevantSuggestion, UserRecordTypeSuggestion +from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion from src.core.error_manager.enums import ErrorTypes from src.core.enums import RecordType, SuggestionType, SuggestedStatus from src.core.exceptions import FailedValidationException +from src.db.models.instantiations.url.suggestion.record_type.user import UserRecordTypeSuggestion +from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion from tests.helpers.complex_test_data_functions import AnnotateAgencySetupInfo, setup_for_annotate_agency, \ setup_for_get_next_url_for_final_review from tests.helpers.db_data_creator import BatchURLCreationInfo diff --git a/tests/automated/integration/api/test_manual_batch.py b/tests/automated/integration/api/test_manual_batch.py index 5dd383c3..1c186d7a 100644 --- a/tests/automated/integration/api/test_manual_batch.py +++ b/tests/automated/integration/api/test_manual_batch.py @@ -2,7 +2,9 @@ import pytest from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInnerInputDTO, ManualBatchInputDTO -from src.db.models.core import Batch, URL, URLOptionalDataSourceMetadata +from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.batch import Batch from src.collectors.enums import CollectorType from src.core.enums import RecordType diff --git a/tests/automated/integration/api/test_review.py b/tests/automated/integration/api/test_review.py index 11e7c239..54ca972a 100644 --- a/tests/automated/integration/api/test_review.py +++ b/tests/automated/integration/api/test_review.py @@ -5,7 +5,10 @@ from src.api.endpoints.review.dtos.reject import FinalReviewRejectionInfo from src.api.endpoints.review.enums import RejectionReason from src.db.constants import PLACEHOLDER_AGENCY_NAME -from src.db.models.core import URL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency +from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency +from src.db.models.instantiations.agency import Agency +from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata +from src.db.models.instantiations.url.core import URL from src.collectors.enums import URLStatus from src.core.enums import RecordType, SuggestedStatus from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review diff --git a/tests/automated/integration/collector_db/test_database_structure.py b/tests/automated/integration/collector_db/test_database_structure.py index 5ed153c9..c07ffb33 100644 --- a/tests/automated/integration/collector_db/test_database_structure.py +++ b/tests/automated/integration/collector_db/test_database_structure.py @@ -19,7 +19,7 @@ from src.db.dtos.insert_urls_info import InsertURLsInfo from src.db.enums import URLHTMLContentType from src.db.helpers import get_postgres_connection_string -from src.db.models.core import Agency +from src.db.models.instantiations.agency import Agency from src.collectors.enums import CollectorType, URLStatus from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.enums import BatchStatus, SuggestionType diff --git a/tests/automated/integration/collector_db/test_db_client.py b/tests/automated/integration/collector_db/test_db_client.py index 5019d853..75d39d06 100644 --- a/tests/automated/integration/collector_db/test_db_client.py +++ b/tests/automated/integration/collector_db/test_db_client.py @@ -11,7 +11,11 @@ from src.db.dtos.url_info import URLInfo from src.db.dtos.url_mapping import URLMapping from src.db.constants import PLACEHOLDER_AGENCY_NAME -from src.db.models.core import URL, ReviewingUserURL, URLOptionalDataSourceMetadata, ConfirmedURLAgency, Agency +from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency +from src.db.models.instantiations.agency import Agency +from src.db.models.instantiations.url.reviewing_user import ReviewingUserURL +from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata +from src.db.models.instantiations.url.core import URL from src.collectors.enums import URLStatus from src.core.enums import BatchStatus, RecordType, SuggestionType, SuggestedStatus from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation, setup_for_annotate_agency diff --git a/tests/automated/integration/core/test_async_core.py b/tests/automated/integration/core/test_async_core.py index eb32d2fc..40ee6b8c 100644 --- a/tests/automated/integration/core/test_async_core.py +++ b/tests/automated/integration/core/test_async_core.py @@ -5,7 +5,7 @@ from src.db.client.async_ import AsyncDatabaseClient from src.db.enums import TaskType -from src.db.models.core import Task +from src.db.models.instantiations.task.core import Task from src.core.core import AsyncCore from src.core.tasks.dtos.run_info import TaskOperatorRunInfo from src.core.tasks.enums import TaskOperatorOutcome diff --git a/tests/automated/integration/tasks/test_agency_preannotation_task.py b/tests/automated/integration/tasks/test_agency_preannotation_task.py index d24501f3..dedd5d46 100644 --- a/tests/automated/integration/tasks/test_agency_preannotation_task.py +++ b/tests/automated/integration/tasks/test_agency_preannotation_task.py @@ -9,9 +9,10 @@ from src.collectors.source_collectors.muckrock.api_interface.lookup_response import AgencyLookupResponse from src.collectors.source_collectors.muckrock.enums import AgencyLookupResponseType from src.core.tasks.operators.agency_identification.core import AgencyIdentificationTaskOperator +from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion from src.pdap_api.enums import MatchAgencyResponseStatus from tests.helpers.test_batch_creation_parameters import TestBatchCreationParameters, TestURLCreationParameters -from src.db.models.core import Agency, AutomatedUrlAgencySuggestion +from src.db.models.instantiations.agency import Agency from src.collectors.enums import CollectorType, URLStatus from src.core.tasks.enums import TaskOperatorOutcome from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo diff --git a/tests/automated/integration/tasks/test_submit_approved_url_task.py b/tests/automated/integration/tasks/test_submit_approved_url_task.py index 8ce5e5dc..e7403e0e 100644 --- a/tests/automated/integration/tasks/test_submit_approved_url_task.py +++ b/tests/automated/integration/tasks/test_submit_approved_url_task.py @@ -7,7 +7,9 @@ from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo from src.core.tasks.operators.submit_approved_url.core import SubmitApprovedURLTaskOperator from src.db.enums import TaskType -from src.db.models.core import URL, URLErrorInfo, URLDataSource +from src.db.models.instantiations.url.error_info import URLErrorInfo +from src.db.models.instantiations.url.data_source import URLDataSource +from src.db.models.instantiations.url.core import URL from src.collectors.enums import URLStatus from src.core.tasks.enums import TaskOperatorOutcome from src.core.enums import RecordType, SubmitResponseStatus diff --git a/tests/automated/integration/tasks/test_url_404_probe.py b/tests/automated/integration/tasks/test_url_404_probe.py index cd7152b5..6226c526 100644 --- a/tests/automated/integration/tasks/test_url_404_probe.py +++ b/tests/automated/integration/tasks/test_url_404_probe.py @@ -7,7 +7,8 @@ from src.core.tasks.operators.url_404_probe.core import URL404ProbeTaskOperator from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface -from src.db.models.core import URLProbedFor404, URL +from src.db.models.instantiations.url.probed_for_404 import URLProbedFor404 +from src.db.models.instantiations.url.core import URL from src.collectors.enums import URLStatus from src.core.tasks.enums import TaskOperatorOutcome from src.core.tasks.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo diff --git a/tests/automated/integration/tasks/test_url_duplicate_task.py b/tests/automated/integration/tasks/test_url_duplicate_task.py index cc83ceca..0098442c 100644 --- a/tests/automated/integration/tasks/test_url_duplicate_task.py +++ b/tests/automated/integration/tasks/test_url_duplicate_task.py @@ -5,7 +5,8 @@ from src.core.tasks.operators.url_duplicate.core import URLDuplicateTaskOperator from src.db.dtos.url_mapping import URLMapping -from src.db.models.core import URL, URLCheckedForDuplicate +from src.db.models.instantiations.url.checked_for_duplicate import URLCheckedForDuplicate +from src.db.models.instantiations.url.core import URL from src.collectors.enums import URLStatus from src.core.tasks.enums import TaskOperatorOutcome from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py b/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py index c08a3786..6396cd7a 100644 --- a/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py +++ b/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py @@ -3,7 +3,8 @@ import pytest from src.core.tasks.operators.url_miscellaneous_metadata.core import URLMiscellaneousMetadataTaskOperator -from src.db.models.core import URL, URLOptionalDataSourceMetadata +from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata +from src.db.models.instantiations.url.core import URL from src.collectors.enums import CollectorType from src.core.tasks.enums import TaskOperatorOutcome from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/tasks/test_url_record_type_task.py b/tests/automated/integration/tasks/test_url_record_type_task.py index ba49ff16..6e92b5d7 100644 --- a/tests/automated/integration/tasks/test_url_record_type_task.py +++ b/tests/automated/integration/tasks/test_url_record_type_task.py @@ -3,7 +3,7 @@ import pytest from src.db.enums import TaskType -from src.db.models.core import AutoRecordTypeSuggestion +from src.db.models.instantiations.url.suggestion.record_type.auto import AutoRecordTypeSuggestion from src.core.tasks.enums import TaskOperatorOutcome from src.core.tasks.operators.record_type.core import URLRecordTypeTaskOperator from src.core.enums import RecordType From be25827f40488e52e9552fb8142fa4cee6845bd9 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 16 Jun 2025 12:02:42 -0400 Subject: [PATCH 215/244] Manual test for `sync_agencies`, set up task operator shell --- ...0922-fb199cf58ecd_update_agencies_table.py | 36 ++++++++++++++++- .../tasks/operators/agency_sync/__init__.py | 0 src/core/tasks/operators/agency_sync/core.py | 26 ++++++++++++ src/db/enums.py | 1 + src/db/models/instantiations/agency.py | 19 +++++++-- .../instantiations/sync_state_agencies.py | 32 +++++++++++++++ src/pdap_api/client.py | 33 +++++++++++++++ src/pdap_api/dtos/agencies_sync.py | 15 +++++++ tests/manual/pdap_client/conftest.py | 40 +++++++++++++++++++ .../manual/pdap_client/test_access_manager.py | 23 ----------- .../pdap_client/test_check_for_duplicate.py | 9 +++++ tests/manual/pdap_client/test_match_agency.py | 6 +++ tests/manual/pdap_client/test_pdap_client.py | 39 ------------------ .../pdap_client/test_refresh_session.py | 12 ++++++ .../manual/pdap_client/test_sync_agencies.py | 16 ++++++++ 15 files changed, 241 insertions(+), 66 deletions(-) create mode 100644 src/core/tasks/operators/agency_sync/__init__.py create mode 100644 src/core/tasks/operators/agency_sync/core.py create mode 100644 src/db/models/instantiations/sync_state_agencies.py create mode 100644 src/pdap_api/dtos/agencies_sync.py create mode 100644 tests/manual/pdap_client/conftest.py delete mode 100644 tests/manual/pdap_client/test_access_manager.py create mode 100644 tests/manual/pdap_client/test_check_for_duplicate.py create mode 100644 tests/manual/pdap_client/test_match_agency.py delete mode 100644 tests/manual/pdap_client/test_pdap_client.py create mode 100644 tests/manual/pdap_client/test_refresh_session.py create mode 100644 tests/manual/pdap_client/test_sync_agencies.py diff --git a/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py b/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py index ebd6db4e..25e5826e 100644 --- a/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py +++ b/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py @@ -10,7 +10,7 @@ from alembic import op import sqlalchemy as sa -from src.util.alembic_helpers import created_at_column, updated_at_column +from src.util.alembic_helpers import created_at_column, updated_at_column, switch_enum_type # revision identifiers, used by Alembic. revision: str = 'fb199cf58ecd' @@ -41,9 +41,43 @@ def upgrade() -> None: # Add row to `agencies_sync_state` table op.execute('INSERT INTO agencies_sync_state VALUES (null, null, null)') + # Add 'Sync Agencies' to TaskType Enum + switch_enum_type( + table_name='tasks', + column_name='task_type', + enum_name='task_type', + new_enum_values=[ + 'HTML', + 'Relevancy', + 'Record Type', + 'Agency Identification', + 'Misc Metadata', + 'Submit Approved URLs', + 'Duplicate Detection', + '404 Probe', + 'Sync Agencies', + ] + ) + def downgrade() -> None: for column in ['ds_last_updated_at', 'created_at']: op.drop_column(AGENCIES_TABLE_NAME, column) op.drop_table('agencies_sync_state') + + switch_enum_type( + table_name='tasks', + column_name='task_type', + enum_name='task_type', + new_enum_values=[ + 'HTML', + 'Relevancy', + 'Record Type', + 'Agency Identification', + 'Misc Metadata', + 'Submit Approved URLs', + 'Duplicate Detection', + '404 Probe', + ] + ) diff --git a/src/core/tasks/operators/agency_sync/__init__.py b/src/core/tasks/operators/agency_sync/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/operators/agency_sync/core.py b/src/core/tasks/operators/agency_sync/core.py new file mode 100644 index 00000000..843e22c3 --- /dev/null +++ b/src/core/tasks/operators/agency_sync/core.py @@ -0,0 +1,26 @@ +from src.core.tasks.operators.base import TaskOperatorBase +from src.db.client.async_ import AsyncDatabaseClient +from src.db.enums import TaskType +from src.pdap_api.client import PDAPClient + + +class SyncAgenciesTaskOperator(TaskOperatorBase): + + def __init__( + self, + adb_client: AsyncDatabaseClient, + pdap_client: PDAPClient + ): + super().__init__(adb_client) + self.pdap_client = pdap_client + + @property + def task_type(self) -> TaskType: + return TaskType.SYNC_AGENCIES + + async def meets_task_prerequisites(self): + pass + + async def inner_task_logic(self): + pass + diff --git a/src/db/enums.py b/src/db/enums.py index 2ea65aef..0a45addd 100644 --- a/src/db/enums.py +++ b/src/db/enums.py @@ -41,6 +41,7 @@ class TaskType(PyEnum): DUPLICATE_DETECTION = "Duplicate Detection" IDLE = "Idle" PROBE_404 = "404 Probe" + SYNC_AGENCIES = "Sync Agencies" class PGEnum(TypeDecorator): impl = postgresql.ENUM diff --git a/src/db/models/instantiations/agency.py b/src/db/models/instantiations/agency.py index 84716726..37beec3d 100644 --- a/src/db/models/instantiations/agency.py +++ b/src/db/models/instantiations/agency.py @@ -1,11 +1,19 @@ -from sqlalchemy import Column, Integer, String +""" +References an agency in the data sources database. +""" + +from sqlalchemy import Column, Integer, String, DateTime from sqlalchemy.orm import relationship -from src.db.models.mixins import UpdatedAtMixin +from src.db.models.mixins import UpdatedAtMixin, CreatedAtMixin from src.db.models.templates import Base -class Agency(UpdatedAtMixin, Base): +class Agency( + CreatedAtMixin, # When agency was added to database + UpdatedAtMixin, # When agency was last updated in database + Base +): __tablename__ = "agencies" agency_id = Column(Integer, primary_key=True) @@ -13,6 +21,11 @@ class Agency(UpdatedAtMixin, Base): state = Column(String, nullable=True) county = Column(String, nullable=True) locality = Column(String, nullable=True) + ds_last_updated_at = Column( + DateTime, + nullable=True, + comment="The last time the agency was updated in the data sources database." + ) # Relationships automated_suggestions = relationship("AutomatedUrlAgencySuggestion", back_populates="agency") diff --git a/src/db/models/instantiations/sync_state_agencies.py b/src/db/models/instantiations/sync_state_agencies.py new file mode 100644 index 00000000..b822a002 --- /dev/null +++ b/src/db/models/instantiations/sync_state_agencies.py @@ -0,0 +1,32 @@ +""" +Tracks the status of the agencies sync +""" + +from sqlalchemy import DateTime, Date, Integer, Column + +from src.db.models.templates import Base + + +class AgenciesSyncState(Base): + __tablename__ = 'agencies_sync_state' + + last_full_sync_at = Column( + DateTime(), + nullable=True, + comment="The datetime of the last *full* sync " + "(i.e., the last sync that got all entries " + "available to be synchronized)." + ) + current_cutoff_date = Column( + Date(), + nullable=True, + comment="Tracks the cutoff date passed to the agencies sync endpoint." + "On completion of a full sync, this is set to " + "the day before the present day." + ) + current_page = Column( + Integer(), + nullable=True, + comment="Tracks the current page passed to the agencies sync endpoint." + "On completion of a full sync, this is set to `null`." + ) \ No newline at end of file diff --git a/src/pdap_api/client.py b/src/pdap_api/client.py index 08e3a9a8..91137ad1 100644 --- a/src/pdap_api/client.py +++ b/src/pdap_api/client.py @@ -1,6 +1,8 @@ +from datetime import datetime from typing import Optional from src.core.tasks.operators.submit_approved_url.tdo import SubmitApprovedURLTDO, SubmittedURLInfo +from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInnerInfo, AgenciesSyncResponseInfo from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse from src.pdap_api.dtos.unique_url_duplicate import UniqueURLDuplicateInfo from src.pdap_api.dtos.match_agency.post import MatchAgencyInfo @@ -143,3 +145,34 @@ async def submit_urls( results.append(response_object) return results + + async def sync_agencies( + self, + page: int, + update_at: Optional[datetime], + ) -> AgenciesSyncResponseInfo: + url =self.access_manager.build_url( + namespace=DataSourcesNamespaces.SOURCE_COLLECTOR, + subdomains=[ + "agencies", + "sync" + ] + ) + headers = await self.access_manager.jwt_header() + headers['Content-Type'] = "application/json" + request_info = RequestInfo( + type_=RequestType.GET, + url=url, + headers=headers, + params={ + "page": page, + "update_at": update_at + } + ) + response_info = await self.access_manager.make_request(request_info) + return AgenciesSyncResponseInfo( + agencies=[ + AgenciesSyncResponseInnerInfo(**entry) + for entry in response_info.data["agencies"] + ] + ) \ No newline at end of file diff --git a/src/pdap_api/dtos/agencies_sync.py b/src/pdap_api/dtos/agencies_sync.py new file mode 100644 index 00000000..7f2b5ad0 --- /dev/null +++ b/src/pdap_api/dtos/agencies_sync.py @@ -0,0 +1,15 @@ +import datetime +from typing import Optional + +from pydantic import BaseModel + +class AgenciesSyncResponseInnerInfo(BaseModel): + display_name: str + agency_id: int + state_name: Optional[str] + county_name: Optional[str] + locality_name: Optional[str] + updated_at: datetime.datetime + +class AgenciesSyncResponseInfo(BaseModel): + agencies: list[AgenciesSyncResponseInnerInfo] diff --git a/tests/manual/pdap_client/conftest.py b/tests/manual/pdap_client/conftest.py new file mode 100644 index 00000000..218d59a4 --- /dev/null +++ b/tests/manual/pdap_client/conftest.py @@ -0,0 +1,40 @@ +import pytest +import pytest_asyncio +from aiohttp import ClientSession +from pdap_access_manager import AccessManager + +from src.pdap_api.client import PDAPClient +from src.util.helper_functions import get_from_env + + +@pytest_asyncio.fixture +async def client_session(): + async with ClientSession() as session: + yield session + +@pytest.fixture +def access_manager(client_session): + return AccessManager( + email=get_from_env("PDAP_PROD_EMAIL"), + password=get_from_env("PDAP_PROD_PASSWORD"), + api_key=get_from_env("PDAP_API_KEY", allow_none=True), + session=client_session + ) + +@pytest.fixture +def access_manager_dev(client_session): + return AccessManager( + email=get_from_env("PDAP_DEV_EMAIL"), + password=get_from_env("PDAP_DEV_PASSWORD"), + api_key=get_from_env("PDAP_DEV_API_KEY", allow_none=True), + data_sources_url=get_from_env("PDAP_DEV_API_URL"), + session=client_session + ) + +@pytest.fixture +def pdap_client(access_manager): + return PDAPClient(access_manager=access_manager) + +@pytest.fixture +def pdap_client_dev(access_manager_dev): + return PDAPClient(access_manager=access_manager_dev) \ No newline at end of file diff --git a/tests/manual/pdap_client/test_access_manager.py b/tests/manual/pdap_client/test_access_manager.py deleted file mode 100644 index 2844464a..00000000 --- a/tests/manual/pdap_client/test_access_manager.py +++ /dev/null @@ -1,23 +0,0 @@ -import pytest -from aiohttp import ClientSession - -from pdap_access_manager import AccessManager -from src.util import get_from_env - - -@pytest.mark.asyncio -async def test_refresh_session(): - async with ClientSession() as session: - access_manager = AccessManager( - email=get_from_env("PDAP_PROD_EMAIL"), - password=get_from_env("PDAP_PROD_PASSWORD"), - api_key=get_from_env("PDAP_API_KEY", allow_none=True), - session=session - ) - old_access_token = await access_manager.access_token - old_refresh_token = await access_manager.refresh_token - await access_manager.refresh_access_token() - new_access_token = await access_manager.access_token - new_refresh_token = await access_manager.refresh_token - assert old_access_token != new_access_token - assert old_refresh_token != new_refresh_token diff --git a/tests/manual/pdap_client/test_check_for_duplicate.py b/tests/manual/pdap_client/test_check_for_duplicate.py new file mode 100644 index 00000000..34bbc317 --- /dev/null +++ b/tests/manual/pdap_client/test_check_for_duplicate.py @@ -0,0 +1,9 @@ +import pytest + + +@pytest.mark.asyncio +async def test_check_for_duplicate(pdap_client): + + response = await pdap_client.is_url_duplicate(url_to_check="https://example.com") + + print(response) diff --git a/tests/manual/pdap_client/test_match_agency.py b/tests/manual/pdap_client/test_match_agency.py new file mode 100644 index 00000000..a637dad0 --- /dev/null +++ b/tests/manual/pdap_client/test_match_agency.py @@ -0,0 +1,6 @@ +import pytest + + +@pytest.mark.asyncio +async def test_match_agency(pdap_client): + response = await pdap_client.match_agency(name="police") diff --git a/tests/manual/pdap_client/test_pdap_client.py b/tests/manual/pdap_client/test_pdap_client.py deleted file mode 100644 index 91bf016a..00000000 --- a/tests/manual/pdap_client/test_pdap_client.py +++ /dev/null @@ -1,39 +0,0 @@ -import pytest -from aiohttp import ClientSession - -from pdap_access_manager import AccessManager -from src.pdap_api.client import PDAPClient -from src.util import get_from_env - - -@pytest.mark.asyncio -async def test_match_agency(): - - async with ClientSession() as session: - access_manager = AccessManager( - email=get_from_env("PDAP_PROD_EMAIL"), - password=get_from_env("PDAP_PROD_PASSWORD"), - api_key=get_from_env("PDAP_API_KEY", allow_none=True), - session=session - ) - pdap_client = PDAPClient(access_manager=access_manager) - - response = await pdap_client.match_agency(name="police") - - print(response) - -@pytest.mark.asyncio -async def test_check_for_duplicate(): - - async with ClientSession() as session: - access_manager = AccessManager( - email=get_from_env("PDAP_PROD_EMAIL"), - password=get_from_env("PDAP_PROD_PASSWORD"), - api_key=get_from_env("PDAP_API_KEY", allow_none=True), - session=session - ) - pdap_client = PDAPClient(access_manager=access_manager) - - response = await pdap_client.is_url_duplicate(url_to_check="https://example.com") - - print(response) \ No newline at end of file diff --git a/tests/manual/pdap_client/test_refresh_session.py b/tests/manual/pdap_client/test_refresh_session.py new file mode 100644 index 00000000..1eb1f1f8 --- /dev/null +++ b/tests/manual/pdap_client/test_refresh_session.py @@ -0,0 +1,12 @@ +import pytest + + +@pytest.mark.asyncio +async def test_refresh_session(access_manager): + old_access_token = await access_manager.access_token + old_refresh_token = await access_manager.refresh_token + await access_manager.refresh_access_token() + new_access_token = await access_manager.access_token + new_refresh_token = await access_manager.refresh_token + assert old_access_token != new_access_token + assert old_refresh_token != new_refresh_token diff --git a/tests/manual/pdap_client/test_sync_agencies.py b/tests/manual/pdap_client/test_sync_agencies.py new file mode 100644 index 00000000..d5ce5c1f --- /dev/null +++ b/tests/manual/pdap_client/test_sync_agencies.py @@ -0,0 +1,16 @@ +import pytest +import time + +@pytest.mark.asyncio +async def test_sync_agencies(pdap_client_dev): + + start = time.perf_counter() + response = await pdap_client_dev.sync_agencies( + page=1, + update_at=None + ) + end = time.perf_counter() + print(response) + + duration = end - start + print(f"Duration: {duration:.4f} seconds") \ No newline at end of file From d1cebd8155dcd6c40ca4f8070c03a38ffd3557d7 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 16 Jun 2025 12:16:22 -0400 Subject: [PATCH 216/244] Fix broken imports --- .../db/client/annotate_url/test_agency_not_in_db.py | 2 +- .../automated/integration/db/client/approve_url/test_basic.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/automated/integration/db/client/annotate_url/test_agency_not_in_db.py b/tests/automated/integration/db/client/annotate_url/test_agency_not_in_db.py index e8cd5141..4949b092 100644 --- a/tests/automated/integration/db/client/annotate_url/test_agency_not_in_db.py +++ b/tests/automated/integration/db/client/annotate_url/test_agency_not_in_db.py @@ -1,7 +1,7 @@ import pytest from src.db.constants import PLACEHOLDER_AGENCY_NAME -from src.db.models.core import Agency +from src.db.models.instantiations.agency import Agency from tests.helpers.complex_test_data_functions import setup_for_annotate_agency from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/approve_url/test_basic.py b/tests/automated/integration/db/client/approve_url/test_basic.py index 67d88c16..b1d93f72 100644 --- a/tests/automated/integration/db/client/approve_url/test_basic.py +++ b/tests/automated/integration/db/client/approve_url/test_basic.py @@ -3,7 +3,9 @@ from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo from src.collectors.enums import URLStatus from src.core.enums import RecordType -from src.db.models.core import URL, ConfirmedURLAgency, ReviewingUserURL, URLOptionalDataSourceMetadata +from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency +from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata +from src.db.models.instantiations.url.reviewing_user import ReviewingUserURL from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review from tests.helpers.db_data_creator import DBDataCreator From 733e0a54fd3709b5f448571ebb101fd3d8d017b7 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 16 Jun 2025 12:18:40 -0400 Subject: [PATCH 217/244] Fix broken imports --- tests/automated/integration/db/client/approve_url/test_basic.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/automated/integration/db/client/approve_url/test_basic.py b/tests/automated/integration/db/client/approve_url/test_basic.py index b1d93f72..74c68e38 100644 --- a/tests/automated/integration/db/client/approve_url/test_basic.py +++ b/tests/automated/integration/db/client/approve_url/test_basic.py @@ -4,6 +4,7 @@ from src.collectors.enums import URLStatus from src.core.enums import RecordType from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency +from src.db.models.instantiations.url.core import URL from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata from src.db.models.instantiations.url.reviewing_user import ReviewingUserURL from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review From f68d4e0cb0d0288ef4a7ecf46001232240272a71 Mon Sep 17 00:00:00 2001 From: maxachis Date: Mon, 16 Jun 2025 13:44:48 -0400 Subject: [PATCH 218/244] Reorganize, remove unused logic --- src/db/client/async_.py | 41 +------------------ .../core/final_review/__init__.py | 0 .../get_next.py} | 0 3 files changed, 1 insertion(+), 40 deletions(-) create mode 100644 src/db/queries/implementations/core/final_review/__init__.py rename src/db/queries/implementations/core/{get_next_url_for_final_review.py => final_review/get_next.py} (100%) diff --git a/src/db/client/async_.py b/src/db/client/async_.py index 8377d2cb..99b209e6 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -57,7 +57,7 @@ from src.db.models.instantiations.url.suggestion.record_type.user import UserRecordTypeSuggestion from src.db.models.instantiations.url.suggestion.relevant.auto import AutoRelevantSuggestion from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion -from src.db.queries.implementations.core.get_next_url_for_final_review import GetNextURLForFinalReviewQueryBuilder +from src.db.queries.implementations.core.final_review.get_next import GetNextURLForFinalReviewQueryBuilder from src.db.queries.implementations.core.get_recent_batch_summaries.builder import GetRecentBatchSummariesQueryBuilder from src.db.statement_composer import StatementComposer from src.db.constants import PLACEHOLDER_AGENCY_NAME @@ -213,16 +213,6 @@ async def get_next_url_for_user_annotation( return raw_result.unique().scalars().one_or_none() - @session_manager - async def get_batch_status( - self, - session: AsyncSession, - batch_id: int - ) -> BatchStatus: - statement = select(Batch).where(Batch.id == batch_id) - result = await session.execute(statement) - return BatchStatus(result.unique().scalar_one().status) - @session_manager async def add_user_relevant_suggestion( self, @@ -366,19 +356,6 @@ async def add_auto_record_type_suggestion( ) session.add(suggestion) - @session_manager - async def add_auto_relevance_suggestions( - self, - session: AsyncSession, - url_and_relevance_type_list: list[tuple[int, bool]] - ): - for url_id, relevant in url_and_relevance_type_list: - suggestion = AutoRelevantSuggestion( - url_id=url_id, - relevant=relevant - ) - session.add(suggestion) - @session_manager async def add_user_record_type_suggestion( self, @@ -555,15 +532,6 @@ async def get_urls_with_html_data_and_without_auto_record_type_suggestion( model=AutoRecordTypeSuggestion ) - @session_manager - async def get_urls_with_html_data_and_without_auto_relevant_suggestion( - self, - session: AsyncSession - ): - return await self.get_urls_with_html_data_and_without_models( - session=session, - model=AutoRelevantSuggestion - ) async def has_urls_with_html_data_and_without_models( self, @@ -589,13 +557,6 @@ async def has_urls_with_html_data_and_without_auto_record_type_suggestion(self, model=AutoRecordTypeSuggestion ) - @session_manager - async def has_urls_with_html_data_and_without_auto_relevant_suggestion(self, session: AsyncSession) -> bool: - return await self.has_urls_with_html_data_and_without_models( - session=session, - model=AutoRelevantSuggestion - ) - @session_manager async def get_all(self, session, model: Base, order_by_attribute: Optional[str] = None) -> list[Base]: """ diff --git a/src/db/queries/implementations/core/final_review/__init__.py b/src/db/queries/implementations/core/final_review/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/queries/implementations/core/get_next_url_for_final_review.py b/src/db/queries/implementations/core/final_review/get_next.py similarity index 100% rename from src/db/queries/implementations/core/get_next_url_for_final_review.py rename to src/db/queries/implementations/core/final_review/get_next.py From 026f4b0b1728664849758972df95de08f50a3a37 Mon Sep 17 00:00:00 2001 From: maxachis Date: Mon, 16 Jun 2025 15:56:13 -0400 Subject: [PATCH 219/244] Begin draft --- src/api/endpoints/review/dtos/get.py | 11 + src/db/client/async_.py | 2 +- .../core/final_review/{get_next.py => get.py} | 102 +++++++-- .../api/helpers/RequestValidator.py | 9 +- .../integration/api/review/__init__.py | 0 .../integration/api/review/conftest.py | 45 ++++ .../api/review/rejection/__init__.py | 0 .../api/review/rejection/helpers.py | 39 ++++ .../api/review/rejection/test_broken_page.py | 14 ++ .../rejection/test_individual_record.py | 15 ++ .../api/review/rejection/test_not_relevant.py | 14 ++ .../test_approve_and_get_next_source.py | 77 +++++++ .../api/review/test_batch_filtering.py | 23 ++ .../api/review/test_next_source.py | 64 ++++++ .../automated/integration/api/test_review.py | 196 ------------------ 15 files changed, 398 insertions(+), 213 deletions(-) rename src/db/queries/implementations/core/final_review/{get_next.py => get.py} (77%) create mode 100644 tests/automated/integration/api/review/__init__.py create mode 100644 tests/automated/integration/api/review/conftest.py create mode 100644 tests/automated/integration/api/review/rejection/__init__.py create mode 100644 tests/automated/integration/api/review/rejection/helpers.py create mode 100644 tests/automated/integration/api/review/rejection/test_broken_page.py create mode 100644 tests/automated/integration/api/review/rejection/test_individual_record.py create mode 100644 tests/automated/integration/api/review/rejection/test_not_relevant.py create mode 100644 tests/automated/integration/api/review/test_approve_and_get_next_source.py create mode 100644 tests/automated/integration/api/review/test_batch_filtering.py create mode 100644 tests/automated/integration/api/review/test_next_source.py delete mode 100644 tests/automated/integration/api/test_review.py diff --git a/src/api/endpoints/review/dtos/get.py b/src/api/endpoints/review/dtos/get.py index 4767f824..bf33d1d6 100644 --- a/src/api/endpoints/review/dtos/get.py +++ b/src/api/endpoints/review/dtos/get.py @@ -64,6 +64,14 @@ class FinalReviewOptionalMetadata(BaseModel): default=None ) +class FinalReviewBatchInfo(BaseModel): + count_reviewed: int = Field( + title="The number of URLs in the batch that have been reviewed", + ) + count_ready_for_review: int = Field( + title="The number of URLs in the batch that are ready for review", + ) + class GetNextURLForFinalReviewResponse(BaseModel): id: int = Field(title="The id of the URL") url: str = Field(title="The URL") @@ -76,6 +84,9 @@ class GetNextURLForFinalReviewResponse(BaseModel): optional_metadata: FinalReviewOptionalMetadata = Field( title="Optional metadata for the source", ) + batch_info: Optional[FinalReviewBatchInfo] = Field( + title="Information about the batch", + ) class GetNextURLForFinalReviewOuterResponse(BaseModel): next_source: Optional[GetNextURLForFinalReviewResponse] = Field( diff --git a/src/db/client/async_.py b/src/db/client/async_.py index 99b209e6..bda34263 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -57,7 +57,7 @@ from src.db.models.instantiations.url.suggestion.record_type.user import UserRecordTypeSuggestion from src.db.models.instantiations.url.suggestion.relevant.auto import AutoRelevantSuggestion from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion -from src.db.queries.implementations.core.final_review.get_next import GetNextURLForFinalReviewQueryBuilder +from src.db.queries.implementations.core.final_review.get import GetNextURLForFinalReviewQueryBuilder from src.db.queries.implementations.core.get_recent_batch_summaries.builder import GetRecentBatchSummariesQueryBuilder from src.db.statement_composer import StatementComposer from src.db.constants import PLACEHOLDER_AGENCY_NAME diff --git a/src/db/queries/implementations/core/final_review/get_next.py b/src/db/queries/implementations/core/final_review/get.py similarity index 77% rename from src/db/queries/implementations/core/final_review/get_next.py rename to src/db/queries/implementations/core/final_review/get.py index 61d07774..d56009a0 100644 --- a/src/db/queries/implementations/core/final_review/get_next.py +++ b/src/db/queries/implementations/core/final_review/get.py @@ -5,7 +5,7 @@ from sqlalchemy.orm import joinedload from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewResponse, FinalReviewOptionalMetadata, \ - FinalReviewAnnotationInfo + FinalReviewAnnotationInfo, FinalReviewBatchInfo from src.collectors.enums import URLStatus from src.core.tasks.operators.url_html.scraper.parser.util import convert_to_response_html_info from src.db.dto_converter import DTOConverter @@ -84,17 +84,16 @@ async def _outer_join_models(self, query: Select, list_of_models: list[Type[URLD def _get_where_exist_clauses( self, query: FromClause, - models: list[Type[URLDependentMixin]], ): where_clauses = [] - for model in models: + for model in self.user_models: label = self.get_exists_label(model) where_clause = getattr(query.c, label) == 1 where_clauses.append(where_clause) return where_clauses def _build_base_query(self, anno_exists_query: FromClause, ): - where_exist_clauses_v2 = self._get_where_exist_clauses(anno_exists_query, self.user_models) + where_exist_clauses = self._get_where_exist_clauses(anno_exists_query) return ( select( @@ -109,7 +108,7 @@ def _build_base_query(self, anno_exists_query: FromClause, ): .where( and_( URL.outcome == URLStatus.PENDING.value, - *where_exist_clauses_v2 + *where_exist_clauses ) ) ) @@ -163,19 +162,81 @@ async def _extract_optional_metadata(self, url: URL) -> FinalReviewOptionalMetad supplying_entity=url.optional_data_source_metadata.supplying_entity ) + async def get_batch_info(self, session: AsyncSession) -> Optional[FinalReviewBatchInfo]: + if self.batch_id is None: + return None + + count_label = "count" + count_reviewed_query = ( + select( + URL.batch_id, + func.count(URL.id).label(count_label) + ) + .where( + URL.outcome.in_( + [ + URLStatus.VALIDATED.value, + URLStatus.NOT_RELEVANT.value, + URLStatus.SUBMITTED.value, + URLStatus.INDIVIDUAL_RECORD.value + ] + ), + URL.batch_id == self.batch_id + ) + .group_by(URL.batch_id) + .subquery("count_reviewed") + ) + + anno_exists_query = await self.get_anno_exists_query() + count_ready_query = ( + select( + URL.batch_id, + func.count(URL.id).label(count_label) + ) + .join( + anno_exists_query, + anno_exists_query.c.id == URL.id + ) + .where( + URL.batch_id == self.batch_id, + URL.outcome == URLStatus.PENDING.value, + *self._get_where_exist_clauses( + anno_exists_query + ) + ) + .group_by(URL.batch_id) + .subquery("count_ready") + ) + + full_query = ( + select( + func.coalesce(count_reviewed_query.c[count_label], 0).label("count_reviewed"), + func.coalesce(count_ready_query.c[count_label], 0).label("count_ready_for_review") + ) + .select_from( + count_reviewed_query.outerjoin( + count_ready_query, + count_reviewed_query.c.batch_id == count_ready_query.c.batch_id + ) + ) + ) + + raw_result = await session.execute(full_query) + return FinalReviewBatchInfo(**raw_result.mappings().one()) + + + + + + + + async def run( self, session: AsyncSession ) -> Optional[GetNextURLForFinalReviewResponse]: - annotation_exists_cases_all = await self._annotation_exists_case(self.models) - anno_exists_query = select( - URL.id, - *annotation_exists_cases_all - ) - anno_exists_query = await self._outer_join_models(anno_exists_query, self.models) - anno_exists_query = anno_exists_query.where(URL.outcome == URLStatus.PENDING.value) - anno_exists_query = anno_exists_query.group_by(URL.id).cte("annotations_exist") + anno_exists_query = await self.get_anno_exists_query() url_query = self._build_base_query(anno_exists_query) url_query = await self._apply_batch_id_filter(url_query, self.batch_id) @@ -194,6 +255,7 @@ async def run( html_content_infos = await self._extract_html_content_infos(result) optional_metadata = await self._extract_optional_metadata(result) + batch_info = await self.get_batch_info(session) try: return GetNextURLForFinalReviewResponse( id=result.id, @@ -216,11 +278,23 @@ async def run( confirmed_agencies=result.confirmed_agencies ) ), - optional_metadata=optional_metadata + optional_metadata=optional_metadata, + batch_info=batch_info ) except Exception as e: raise FailedQueryException(f"Failed to convert result for url id {result.id} to response") from e + async def get_anno_exists_query(self): + annotation_exists_cases_all = await self._annotation_exists_case(self.models) + anno_exists_query = select( + URL.id, + *annotation_exists_cases_all + ) + anno_exists_query = await self._outer_join_models(anno_exists_query, self.models) + anno_exists_query = anno_exists_query.where(URL.outcome == URLStatus.PENDING.value) + anno_exists_query = anno_exists_query.group_by(URL.id).cte("annotations_exist") + return anno_exists_query + diff --git a/tests/automated/integration/api/helpers/RequestValidator.py b/tests/automated/integration/api/helpers/RequestValidator.py index ac9d43f6..a83589b3 100644 --- a/tests/automated/integration/api/helpers/RequestValidator.py +++ b/tests/automated/integration/api/helpers/RequestValidator.py @@ -334,9 +334,14 @@ def get_tasks( ) return GetTasksResponse(**data) - async def review_next_source(self) -> GetNextURLForFinalReviewOuterResponse: + async def review_next_source(self, batch_id: Optional[int] = None) -> GetNextURLForFinalReviewOuterResponse: + if batch_id is not None: + params = {"batch_id": batch_id} + else: + params = None data = self.get( - url=f"/review/next-source" + url=f"/review/next-source", + params=params ) return GetNextURLForFinalReviewOuterResponse(**data) diff --git a/tests/automated/integration/api/review/__init__.py b/tests/automated/integration/api/review/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/api/review/conftest.py b/tests/automated/integration/api/review/conftest.py new file mode 100644 index 00000000..cb1b8d04 --- /dev/null +++ b/tests/automated/integration/api/review/conftest.py @@ -0,0 +1,45 @@ +import pytest_asyncio + +from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.collectors.enums import URLStatus +from src.core.enums import SuggestedStatus, RecordType +from tests.helpers.batch_creation_parameters.annotation_info import AnnotationInfo +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters + + +@pytest_asyncio.fixture +async def batch_url_creation_info(db_data_creator): + simple_parameter_statuses = [ + URLStatus.VALIDATED, + URLStatus.SUBMITTED, + URLStatus.INDIVIDUAL_RECORD, + URLStatus.NOT_RELEVANT, + URLStatus.ERROR, + URLStatus.DUPLICATE, + URLStatus.NOT_FOUND + ] + simple_parameters = [ + TestURLCreationParameters( + status=status + ) for status in simple_parameter_statuses + ] + + parameters = TestBatchCreationParameters( + urls=[ + *simple_parameters, + TestURLCreationParameters( + count=2, + status=URLStatus.PENDING, + annotation_info=AnnotationInfo( + user_relevant=SuggestedStatus.RELEVANT, + user_record_type=RecordType.ARREST_RECORDS, + user_agency=URLAgencyAnnotationPostInfo( + suggested_agency=await db_data_creator.agency() + ) + ) + ) + ] + ) + + return await db_data_creator.batch_v2(parameters=parameters) diff --git a/tests/automated/integration/api/review/rejection/__init__.py b/tests/automated/integration/api/review/rejection/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/api/review/rejection/helpers.py b/tests/automated/integration/api/review/rejection/helpers.py new file mode 100644 index 00000000..c6c3ff66 --- /dev/null +++ b/tests/automated/integration/api/review/rejection/helpers.py @@ -0,0 +1,39 @@ +from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewOuterResponse +from src.api.endpoints.review.dtos.reject import FinalReviewRejectionInfo +from src.api.endpoints.review.enums import RejectionReason +from src.collectors.enums import URLStatus +from src.db.models.instantiations.url.core import URL +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review + + +async def run_rejection_test( + api_test_helper, + rejection_reason: RejectionReason, + url_status: URLStatus +): + ath = api_test_helper + db_data_creator = ath.db_data_creator + + setup_info = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + annotation_count=3, + include_user_annotations=True + ) + url_mapping = setup_info.url_mapping + + result: GetNextURLForFinalReviewOuterResponse = await ath.request_validator.reject_and_get_next_source_for_review( + review_info=FinalReviewRejectionInfo( + url_id=url_mapping.url_id, + rejection_reason=rejection_reason + ) + ) + + assert result.next_source is None + + adb_client = db_data_creator.adb_client + # Confirm same agency id is listed as rejected + urls: list[URL] = await adb_client.get_all(URL) + assert len(urls) == 1 + url = urls[0] + assert url.id == url_mapping.url_id + assert url.outcome == url_status.value diff --git a/tests/automated/integration/api/review/rejection/test_broken_page.py b/tests/automated/integration/api/review/rejection/test_broken_page.py new file mode 100644 index 00000000..813e523a --- /dev/null +++ b/tests/automated/integration/api/review/rejection/test_broken_page.py @@ -0,0 +1,14 @@ +import pytest + +from src.api.endpoints.review.enums import RejectionReason +from src.collectors.enums import URLStatus +from tests.automated.integration.api.review.rejection.helpers import run_rejection_test + + +@pytest.mark.asyncio +async def test_rejection_broken_page(api_test_helper): + await run_rejection_test( + api_test_helper, + rejection_reason=RejectionReason.BROKEN_PAGE_404, + url_status=URLStatus.NOT_FOUND + ) diff --git a/tests/automated/integration/api/review/rejection/test_individual_record.py b/tests/automated/integration/api/review/rejection/test_individual_record.py new file mode 100644 index 00000000..6e81d378 --- /dev/null +++ b/tests/automated/integration/api/review/rejection/test_individual_record.py @@ -0,0 +1,15 @@ +import pytest + +from src.api.endpoints.review.enums import RejectionReason +from src.collectors.enums import URLStatus +from tests.automated.integration.api.review.rejection.helpers import run_rejection_test + + +@pytest.mark.asyncio +async def test_rejection_individual_record(api_test_helper): + await run_rejection_test( + api_test_helper, + rejection_reason=RejectionReason.INDIVIDUAL_RECORD, + url_status=URLStatus.INDIVIDUAL_RECORD + ) + diff --git a/tests/automated/integration/api/review/rejection/test_not_relevant.py b/tests/automated/integration/api/review/rejection/test_not_relevant.py new file mode 100644 index 00000000..1ad2847f --- /dev/null +++ b/tests/automated/integration/api/review/rejection/test_not_relevant.py @@ -0,0 +1,14 @@ +import pytest + +from src.api.endpoints.review.enums import RejectionReason +from src.collectors.enums import URLStatus +from tests.automated.integration.api.review.rejection.helpers import run_rejection_test + + +@pytest.mark.asyncio +async def test_rejection_not_relevant(api_test_helper): + await run_rejection_test( + api_test_helper, + rejection_reason=RejectionReason.NOT_RELEVANT, + url_status=URLStatus.NOT_RELEVANT + ) diff --git a/tests/automated/integration/api/review/test_approve_and_get_next_source.py b/tests/automated/integration/api/review/test_approve_and_get_next_source.py new file mode 100644 index 00000000..89a65acc --- /dev/null +++ b/tests/automated/integration/api/review/test_approve_and_get_next_source.py @@ -0,0 +1,77 @@ +import pytest + +from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo +from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewOuterResponse +from src.collectors.enums import URLStatus +from src.core.enums import RecordType +from src.db.constants import PLACEHOLDER_AGENCY_NAME +from src.db.models.instantiations.agency import Agency +from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review + + +@pytest.mark.asyncio +async def test_approve_and_get_next_source_for_review(api_test_helper): + ath = api_test_helper + db_data_creator = ath.db_data_creator + + setup_info = await setup_for_get_next_url_for_final_review( + db_data_creator=db_data_creator, + include_user_annotations=True + ) + url_mapping = setup_info.url_mapping + + # Add confirmed agency + await db_data_creator.confirmed_suggestions([url_mapping.url_id]) + + # Additionally, include an agency not yet included in the database + additional_agency = 999999 + + agency_ids = [await db_data_creator.agency() for _ in range(3)] + agency_ids.append(additional_agency) + + result: GetNextURLForFinalReviewOuterResponse = await ath.request_validator.approve_and_get_next_source_for_review( + approval_info=FinalReviewApprovalInfo( + url_id=url_mapping.url_id, + record_type=RecordType.ARREST_RECORDS, + agency_ids=agency_ids, + name="New Test Name", + description="New Test Description", + record_formats=["New Test Record Format", "New Test Record Format 2"], + data_portal_type="New Test Data Portal Type", + supplying_entity="New Test Supplying Entity" + ) + ) + + assert result.next_source is None + + adb_client = db_data_creator.adb_client + # Confirm same agency id is listed as confirmed + urls = await adb_client.get_all(URL) + assert len(urls) == 1 + url = urls[0] + assert url.id == url_mapping.url_id + assert url.record_type == RecordType.ARREST_RECORDS.value + assert url.outcome == URLStatus.VALIDATED.value + assert url.name == "New Test Name" + assert url.description == "New Test Description" + + optional_metadata = await adb_client.get_all(URLOptionalDataSourceMetadata) + assert len(optional_metadata) == 1 + assert optional_metadata[0].data_portal_type == "New Test Data Portal Type" + assert optional_metadata[0].supplying_entity == "New Test Supplying Entity" + assert optional_metadata[0].record_formats == ["New Test Record Format", "New Test Record Format 2"] + + # Get agencies + confirmed_agencies = await adb_client.get_all(ConfirmedURLAgency) + assert len(confirmed_agencies) == 4 + for agency in confirmed_agencies: + assert agency.agency_id in agency_ids + + # Check that created agency has placeholder + agencies = await adb_client.get_all(Agency) + for agency in agencies: + if agency.agency_id == additional_agency: + assert agency.name == PLACEHOLDER_AGENCY_NAME diff --git a/tests/automated/integration/api/review/test_batch_filtering.py b/tests/automated/integration/api/review/test_batch_filtering.py new file mode 100644 index 00000000..be0ea54f --- /dev/null +++ b/tests/automated/integration/api/review/test_batch_filtering.py @@ -0,0 +1,23 @@ +import pytest + + +@pytest.mark.asyncio +async def test_batch_filtering( + batch_url_creation_info, + api_test_helper +): + ath = api_test_helper + rv = ath.request_validator + + # Receive null batch info if batch id not provided + outer_result_no_batch_info = await rv.review_next_source() + assert outer_result_no_batch_info.next_source.batch_info is None + + # Get batch info if batch id is provided + outer_result = await ath.request_validator.review_next_source( + batch_id=batch_url_creation_info.batch_id + ) + batch_info = outer_result.next_source.batch_info + assert batch_info.count_reviewed == 4 + assert batch_info.count_ready_for_review == 2 + diff --git a/tests/automated/integration/api/review/test_next_source.py b/tests/automated/integration/api/review/test_next_source.py new file mode 100644 index 00000000..913457c0 --- /dev/null +++ b/tests/automated/integration/api/review/test_next_source.py @@ -0,0 +1,64 @@ +import pytest + +from src.core.enums import SuggestedStatus, RecordType +from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review + + +@pytest.mark.asyncio +async def test_review_next_source(api_test_helper): + ath = api_test_helper + + setup_info = await setup_for_get_next_url_for_final_review( + db_data_creator=ath.db_data_creator, + include_user_annotations=True + ) + url_mapping = setup_info.url_mapping + + await ath.db_data_creator.agency_auto_suggestions( + url_id=url_mapping.url_id, + count=3 + ) + confirmed_agency_id = await ath.db_data_creator.agency_confirmed_suggestion(url_id=url_mapping.url_id) + + outer_result = await ath.request_validator.review_next_source() + + result = outer_result.next_source + + assert result.name == "Test Name" + assert result.description == "Test Description" + + optional_metadata = result.optional_metadata + + assert optional_metadata.data_portal_type == "Test Data Portal Type" + assert optional_metadata.supplying_entity == "Test Supplying Entity" + assert optional_metadata.record_formats == ["Test Record Format", "Test Record Format 2"] + + assert result.url == url_mapping.url + html_info = result.html_info + assert html_info.description == "test description" + assert html_info.title == "test html content" + + annotation_info = result.annotations + relevant_info = annotation_info.relevant + assert relevant_info.auto == True + assert relevant_info.user == SuggestedStatus.NOT_RELEVANT + + record_type_info = annotation_info.record_type + assert record_type_info.auto == RecordType.ARREST_RECORDS + assert record_type_info.user == RecordType.ACCIDENT_REPORTS + + agency_info = annotation_info.agency + auto_agency_suggestions = agency_info.auto + assert auto_agency_suggestions.unknown == False + assert len(auto_agency_suggestions.suggestions) == 3 + + # Check user agency suggestions exist and in descending order of count + user_agency_suggestion = agency_info.user + assert user_agency_suggestion.pdap_agency_id == setup_info.user_agency_id + + + # Check confirmed agencies exist + confirmed_agencies = agency_info.confirmed + assert len(confirmed_agencies) == 1 + confirmed_agency = confirmed_agencies[0] + assert confirmed_agency.pdap_agency_id == confirmed_agency_id diff --git a/tests/automated/integration/api/test_review.py b/tests/automated/integration/api/test_review.py deleted file mode 100644 index 54ca972a..00000000 --- a/tests/automated/integration/api/test_review.py +++ /dev/null @@ -1,196 +0,0 @@ -import pytest - -from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo -from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewOuterResponse -from src.api.endpoints.review.dtos.reject import FinalReviewRejectionInfo -from src.api.endpoints.review.enums import RejectionReason -from src.db.constants import PLACEHOLDER_AGENCY_NAME -from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency -from src.db.models.instantiations.agency import Agency -from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata -from src.db.models.instantiations.url.core import URL -from src.collectors.enums import URLStatus -from src.core.enums import RecordType, SuggestedStatus -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review - - -@pytest.mark.asyncio -async def test_review_next_source(api_test_helper): - ath = api_test_helper - - setup_info = await setup_for_get_next_url_for_final_review( - db_data_creator=ath.db_data_creator, - include_user_annotations=True - ) - url_mapping = setup_info.url_mapping - - await ath.db_data_creator.agency_auto_suggestions( - url_id=url_mapping.url_id, - count=3 - ) - confirmed_agency_id = await ath.db_data_creator.agency_confirmed_suggestion(url_id=url_mapping.url_id) - - outer_result = await ath.request_validator.review_next_source() - - result = outer_result.next_source - - assert result.name == "Test Name" - assert result.description == "Test Description" - - optional_metadata = result.optional_metadata - - assert optional_metadata.data_portal_type == "Test Data Portal Type" - assert optional_metadata.supplying_entity == "Test Supplying Entity" - assert optional_metadata.record_formats == ["Test Record Format", "Test Record Format 2"] - - assert result.url == url_mapping.url - html_info = result.html_info - assert html_info.description == "test description" - assert html_info.title == "test html content" - - annotation_info = result.annotations - relevant_info = annotation_info.relevant - assert relevant_info.auto == True - assert relevant_info.user == SuggestedStatus.NOT_RELEVANT - - record_type_info = annotation_info.record_type - assert record_type_info.auto == RecordType.ARREST_RECORDS - assert record_type_info.user == RecordType.ACCIDENT_REPORTS - - agency_info = annotation_info.agency - auto_agency_suggestions = agency_info.auto - assert auto_agency_suggestions.unknown == False - assert len(auto_agency_suggestions.suggestions) == 3 - - # Check user agency suggestions exist and in descending order of count - user_agency_suggestion = agency_info.user - assert user_agency_suggestion.pdap_agency_id == setup_info.user_agency_id - - - # Check confirmed agencies exist - confirmed_agencies = agency_info.confirmed - assert len(confirmed_agencies) == 1 - confirmed_agency = confirmed_agencies[0] - assert confirmed_agency.pdap_agency_id == confirmed_agency_id - -@pytest.mark.asyncio -async def test_approve_and_get_next_source_for_review(api_test_helper): - ath = api_test_helper - db_data_creator = ath.db_data_creator - - setup_info = await setup_for_get_next_url_for_final_review( - db_data_creator=db_data_creator, - include_user_annotations=True - ) - url_mapping = setup_info.url_mapping - - # Add confirmed agency - await db_data_creator.confirmed_suggestions([url_mapping.url_id]) - - # Additionally, include an agency not yet included in the database - additional_agency = 999999 - - agency_ids = [await db_data_creator.agency() for _ in range(3)] - agency_ids.append(additional_agency) - - result: GetNextURLForFinalReviewOuterResponse = await ath.request_validator.approve_and_get_next_source_for_review( - approval_info=FinalReviewApprovalInfo( - url_id=url_mapping.url_id, - record_type=RecordType.ARREST_RECORDS, - agency_ids=agency_ids, - name="New Test Name", - description="New Test Description", - record_formats=["New Test Record Format", "New Test Record Format 2"], - data_portal_type="New Test Data Portal Type", - supplying_entity="New Test Supplying Entity" - ) - ) - - assert result.next_source is None - - adb_client = db_data_creator.adb_client - # Confirm same agency id is listed as confirmed - urls = await adb_client.get_all(URL) - assert len(urls) == 1 - url = urls[0] - assert url.id == url_mapping.url_id - assert url.record_type == RecordType.ARREST_RECORDS.value - assert url.outcome == URLStatus.VALIDATED.value - assert url.name == "New Test Name" - assert url.description == "New Test Description" - - optional_metadata = await adb_client.get_all(URLOptionalDataSourceMetadata) - assert len(optional_metadata) == 1 - assert optional_metadata[0].data_portal_type == "New Test Data Portal Type" - assert optional_metadata[0].supplying_entity == "New Test Supplying Entity" - assert optional_metadata[0].record_formats == ["New Test Record Format", "New Test Record Format 2"] - - # Get agencies - confirmed_agencies = await adb_client.get_all(ConfirmedURLAgency) - assert len(confirmed_agencies) == 4 - for agency in confirmed_agencies: - assert agency.agency_id in agency_ids - - # Check that created agency has placeholder - agencies = await adb_client.get_all(Agency) - for agency in agencies: - if agency.agency_id == additional_agency: - assert agency.name == PLACEHOLDER_AGENCY_NAME - - -async def run_rejection_test( - api_test_helper, - rejection_reason: RejectionReason, - url_status: URLStatus -): - ath = api_test_helper - db_data_creator = ath.db_data_creator - - setup_info = await setup_for_get_next_url_for_final_review( - db_data_creator=db_data_creator, - annotation_count=3, - include_user_annotations=True - ) - url_mapping = setup_info.url_mapping - - result: GetNextURLForFinalReviewOuterResponse = await ath.request_validator.reject_and_get_next_source_for_review( - review_info=FinalReviewRejectionInfo( - url_id=url_mapping.url_id, - rejection_reason=rejection_reason - ) - ) - - assert result.next_source is None - - adb_client = db_data_creator.adb_client - # Confirm same agency id is listed as rejected - urls: list[URL] = await adb_client.get_all(URL) - assert len(urls) == 1 - url = urls[0] - assert url.id == url_mapping.url_id - assert url.outcome == url_status.value - -@pytest.mark.asyncio -async def test_rejection_not_relevant(api_test_helper): - await run_rejection_test( - api_test_helper, - rejection_reason=RejectionReason.NOT_RELEVANT, - url_status=URLStatus.NOT_RELEVANT - ) - -@pytest.mark.asyncio -async def test_rejection_broken_page(api_test_helper): - await run_rejection_test( - api_test_helper, - rejection_reason=RejectionReason.BROKEN_PAGE_404, - url_status=URLStatus.NOT_FOUND - ) - -@pytest.mark.asyncio -async def test_rejection_individual_record(api_test_helper): - await run_rejection_test( - api_test_helper, - rejection_reason=RejectionReason.INDIVIDUAL_RECORD, - url_status=URLStatus.INDIVIDUAL_RECORD - ) - From 9e78a69dbcda605b7c57459c2843dabbb0753b83 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 16 Jun 2025 16:54:50 -0400 Subject: [PATCH 220/244] Fix bug --- .../implementations/core/final_review/get.py | 13 +++++++++---- .../test_batch_id_filtering.py | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/db/queries/implementations/core/final_review/get.py b/src/db/queries/implementations/core/final_review/get.py index d56009a0..f5e5bd92 100644 --- a/src/db/queries/implementations/core/final_review/get.py +++ b/src/db/queries/implementations/core/final_review/get.py @@ -11,6 +11,7 @@ from src.db.dto_converter import DTOConverter from src.db.dtos.url_html_content_info import URLHTMLContentInfo from src.db.exceptions import FailedQueryException +from src.db.models.instantiations.batch import Batch from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion from src.db.models.instantiations.url.suggestion.record_type.auto import AutoRecordTypeSuggestion @@ -169,9 +170,13 @@ async def get_batch_info(self, session: AsyncSession) -> Optional[FinalReviewBat count_label = "count" count_reviewed_query = ( select( - URL.batch_id, + Batch.id.label("batch_id"), func.count(URL.id).label(count_label) ) + .outerjoin( + URL, + URL.batch_id == Batch.id + ) .where( URL.outcome.in_( [ @@ -183,7 +188,7 @@ async def get_batch_info(self, session: AsyncSession) -> Optional[FinalReviewBat ), URL.batch_id == self.batch_id ) - .group_by(URL.batch_id) + .group_by(Batch.id) .subquery("count_reviewed") ) @@ -214,8 +219,8 @@ async def get_batch_info(self, session: AsyncSession) -> Optional[FinalReviewBat func.coalesce(count_ready_query.c[count_label], 0).label("count_ready_for_review") ) .select_from( - count_reviewed_query.outerjoin( - count_ready_query, + count_ready_query.outerjoin( + count_reviewed_query, count_reviewed_query.c.batch_id == count_ready_query.c.batch_id ) ) diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_batch_id_filtering.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_batch_id_filtering.py index 2da137d2..fa2d739e 100644 --- a/tests/automated/integration/db/client/get_next_url_for_final_review/test_batch_id_filtering.py +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_batch_id_filtering.py @@ -22,7 +22,7 @@ async def test_get_next_url_for_final_review_batch_id_filtering(db_data_creator: url_mapping_2 = setup_info_2.url_mapping # If a batch id is provided, return first valid URL with that batch id - result_with_batch_id =await db_data_creator.adb_client.get_next_url_for_final_review( + result_with_batch_id = await db_data_creator.adb_client.get_next_url_for_final_review( batch_id=setup_info_2.batch_id ) From 7e17fbac5e386d5dbddb9cf76365176b97d17f16 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 16 Jun 2025 18:52:06 -0400 Subject: [PATCH 221/244] Refactor GetNextURLForFinalReviewQueryBuilder Extract logic to AnnotationExistsCTEQueryBuilder Begin work on GetMetricsURLSAggregatedPendingQueryBuilder --- .../dtos/get/urls/aggregated/__init__.py | 0 .../{aggregated.py => aggregated/core.py} | 0 .../dtos/get/urls/aggregated/pending.py | 12 ++ src/api/endpoints/metrics/routes.py | 10 +- src/core/core.py | 8 +- src/db/client/async_.py | 5 +- src/db/constants.py | 24 ++- .../implementations/core/common/__init__.py | 0 .../core/common/annotation_exists.py | 65 +++++++ .../implementations/core/final_review/get.py | 167 +++++++----------- .../implementations/core/metrics/__init__.py | 0 .../core/metrics/urls/__init__.py | 0 .../core/metrics/urls/aggregated/__init__.py | 0 .../core/metrics/urls/aggregated/pending.py | 15 ++ .../api/helpers/RequestValidator.py | 3 +- 15 files changed, 200 insertions(+), 109 deletions(-) create mode 100644 src/api/endpoints/metrics/dtos/get/urls/aggregated/__init__.py rename src/api/endpoints/metrics/dtos/get/urls/{aggregated.py => aggregated/core.py} (100%) create mode 100644 src/api/endpoints/metrics/dtos/get/urls/aggregated/pending.py create mode 100644 src/db/queries/implementations/core/common/__init__.py create mode 100644 src/db/queries/implementations/core/common/annotation_exists.py create mode 100644 src/db/queries/implementations/core/metrics/__init__.py create mode 100644 src/db/queries/implementations/core/metrics/urls/__init__.py create mode 100644 src/db/queries/implementations/core/metrics/urls/aggregated/__init__.py create mode 100644 src/db/queries/implementations/core/metrics/urls/aggregated/pending.py diff --git a/src/api/endpoints/metrics/dtos/get/urls/aggregated/__init__.py b/src/api/endpoints/metrics/dtos/get/urls/aggregated/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/metrics/dtos/get/urls/aggregated.py b/src/api/endpoints/metrics/dtos/get/urls/aggregated/core.py similarity index 100% rename from src/api/endpoints/metrics/dtos/get/urls/aggregated.py rename to src/api/endpoints/metrics/dtos/get/urls/aggregated/core.py diff --git a/src/api/endpoints/metrics/dtos/get/urls/aggregated/pending.py b/src/api/endpoints/metrics/dtos/get/urls/aggregated/pending.py new file mode 100644 index 00000000..e2c290a3 --- /dev/null +++ b/src/api/endpoints/metrics/dtos/get/urls/aggregated/pending.py @@ -0,0 +1,12 @@ +from pydantic import BaseModel + + +class GetMetricsURLsAggregatedPendingResponseDTO(BaseModel): + all: int + relevant: int + record_type: int + agency: int + annotations_0: int + annotations_1: int + annotations_2: int + annotations_3: int \ No newline at end of file diff --git a/src/api/endpoints/metrics/routes.py b/src/api/endpoints/metrics/routes.py index ac6a3b60..cc043061 100644 --- a/src/api/endpoints/metrics/routes.py +++ b/src/api/endpoints/metrics/routes.py @@ -5,7 +5,8 @@ from src.api.endpoints.metrics.dtos.get.backlog import GetMetricsBacklogResponseDTO from src.api.endpoints.metrics.dtos.get.batches.aggregated import GetMetricsBatchesAggregatedResponseDTO from src.api.endpoints.metrics.dtos.get.batches.breakdown import GetMetricsBatchesBreakdownResponseDTO -from src.api.endpoints.metrics.dtos.get.urls.aggregated import GetMetricsURLsAggregatedResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.aggregated.core import GetMetricsURLsAggregatedResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.aggregated.pending import GetMetricsURLsAggregatedPendingResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.pending import GetMetricsURLsBreakdownPendingResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.submitted import GetMetricsURLsBreakdownSubmittedResponseDTO from src.core.core import AsyncCore @@ -43,6 +44,13 @@ async def get_urls_aggregated_metrics( ) -> GetMetricsURLsAggregatedResponseDTO: return await core.get_urls_aggregated_metrics() +@metrics_router.get("/urls/aggregate/pending") +async def get_urls_aggregated_pending_metrics( + core: AsyncCore = Depends(get_async_core), + access_info: AccessInfo = Depends(get_access_info) +) -> GetMetricsURLsAggregatedPendingResponseDTO: + return await core.get_urls_aggregated_pending_metrics() + @metrics_router.get("/urls/breakdown/submitted") async def get_urls_breakdown_submitted_metrics( core: AsyncCore = Depends(get_async_core), diff --git a/src/core/core.py b/src/core/core.py index a37af7e3..640a00e8 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -23,7 +23,8 @@ from src.api.endpoints.metrics.dtos.get.backlog import GetMetricsBacklogResponseDTO from src.api.endpoints.metrics.dtos.get.batches.aggregated import GetMetricsBatchesAggregatedResponseDTO from src.api.endpoints.metrics.dtos.get.batches.breakdown import GetMetricsBatchesBreakdownResponseDTO -from src.api.endpoints.metrics.dtos.get.urls.aggregated import GetMetricsURLsAggregatedResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.aggregated.core import GetMetricsURLsAggregatedResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.aggregated.pending import GetMetricsURLsAggregatedPendingResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.pending import GetMetricsURLsBreakdownPendingResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.submitted import GetMetricsURLsBreakdownSubmittedResponseDTO from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo @@ -334,4 +335,7 @@ async def get_urls_breakdown_pending_metrics(self) -> GetMetricsURLsBreakdownPen return await self.adb_client.get_urls_breakdown_pending_metrics() async def get_backlog_metrics(self) -> GetMetricsBacklogResponseDTO: - return await self.adb_client.get_backlog_metrics() \ No newline at end of file + return await self.adb_client.get_backlog_metrics() + + async def get_urls_aggregated_pending_metrics(self) -> GetMetricsURLsAggregatedPendingResponseDTO: + return await self.adb_client.get_urls_aggregated_pending_metrics() \ No newline at end of file diff --git a/src/db/client/async_.py b/src/db/client/async_.py index bda34263..6dd893f9 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -29,7 +29,7 @@ GetMetricsBatchesAggregatedInnerResponseDTO from src.api.endpoints.metrics.dtos.get.batches.breakdown import GetMetricsBatchesBreakdownInnerResponseDTO, \ GetMetricsBatchesBreakdownResponseDTO -from src.api.endpoints.metrics.dtos.get.urls.aggregated import GetMetricsURLsAggregatedResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.aggregated.core import GetMetricsURLsAggregatedResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.pending import GetMetricsURLsBreakdownPendingResponseDTO, \ GetMetricsURLsBreakdownPendingResponseInnerDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.submitted import GetMetricsURLsBreakdownSubmittedResponseDTO, \ @@ -2283,3 +2283,6 @@ async def get_annotation_batch_info( count_not_annotated=not_annotated_result, total_urls=annotated_result + not_annotated_result ) + + async def get_urls_aggregated_pending_metrics(self): + pass diff --git a/src/db/constants.py b/src/db/constants.py index 1f39857d..80cbcd93 100644 --- a/src/db/constants.py +++ b/src/db/constants.py @@ -1,5 +1,25 @@ - +from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion +from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion +from src.db.models.instantiations.url.suggestion.record_type.auto import AutoRecordTypeSuggestion +from src.db.models.instantiations.url.suggestion.record_type.user import UserRecordTypeSuggestion +from src.db.models.instantiations.url.suggestion.relevant.auto import AutoRelevantSuggestion +from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion PLACEHOLDER_AGENCY_NAME = "PLACEHOLDER_AGENCY_NAME" -STANDARD_ROW_LIMIT = 100 \ No newline at end of file +STANDARD_ROW_LIMIT = 100 + +ALL_ANNOTATION_MODELS = [ + AutoRecordTypeSuggestion, + AutoRelevantSuggestion, + AutomatedUrlAgencySuggestion, + UserRelevantSuggestion, + UserRecordTypeSuggestion, + UserUrlAgencySuggestion +] + +USER_ANNOTATION_MODELS = [ + UserRelevantSuggestion, + UserRecordTypeSuggestion, + UserUrlAgencySuggestion +] \ No newline at end of file diff --git a/src/db/queries/implementations/core/common/__init__.py b/src/db/queries/implementations/core/common/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/queries/implementations/core/common/annotation_exists.py b/src/db/queries/implementations/core/common/annotation_exists.py new file mode 100644 index 00000000..3d6c5cbc --- /dev/null +++ b/src/db/queries/implementations/core/common/annotation_exists.py @@ -0,0 +1,65 @@ +""" +The annotation exists common table expression +Provides a set of boolean flags indicating whether a URL +has each kind of possible annotation +Each row should have the following columns: +- url_id +- UserRelevantSuggestion_exists +- UserRecordTypeSuggestion_exists +- UserUrlAgencySuggestion_exists +- UserAutoRelevantSuggestion_exists +- UserAutoRecordTypeSuggestion_exists +- UserAutoUrlAgencySuggestion_exists +""" + +from typing import Any, Type + +from sqlalchemy import case, func, Select, select + +from src.collectors.enums import URLStatus +from src.db.constants import ALL_ANNOTATION_MODELS +from src.db.models.instantiations.url.core import URL +from src.db.models.mixins import URLDependentMixin +from src.db.queries.base.builder import QueryBuilderBase + + +class AnnotationExistsCTEQueryBuilder(QueryBuilderBase): + + @property + def url_id(self): + return self.query.c.url_id + + def get_exists_label(self, model: Type[URLDependentMixin]): + return f"{model.__name__}_exists" + + async def _annotation_exists_case( + self, + ): + cases = [] + for model in ALL_ANNOTATION_MODELS: + cases.append( + case( + ( + func.bool_or(model.url_id.is_not(None)), 1 + ), + else_=0 + ).label(self.get_exists_label(model)) + ) + return cases + + async def _outer_join_models(self, query: Select): + for model in ALL_ANNOTATION_MODELS: + query = query.outerjoin(model) + return query + + + async def build(self) -> Any: + annotation_exists_cases_all = await self._annotation_exists_case() + anno_exists_query = select( + URL.id.label("url_id"), + *annotation_exists_cases_all + ) + anno_exists_query = await self._outer_join_models(anno_exists_query) + anno_exists_query = anno_exists_query.where(URL.outcome == URLStatus.PENDING.value) + anno_exists_query = anno_exists_query.group_by(URL.id).cte("annotations_exist") + self.query = anno_exists_query diff --git a/src/db/queries/implementations/core/final_review/get.py b/src/db/queries/implementations/core/final_review/get.py index f5e5bd92..a0b1f2d5 100644 --- a/src/db/queries/implementations/core/final_review/get.py +++ b/src/db/queries/implementations/core/final_review/get.py @@ -8,6 +8,7 @@ FinalReviewAnnotationInfo, FinalReviewBatchInfo from src.collectors.enums import URLStatus from src.core.tasks.operators.url_html.scraper.parser.util import convert_to_response_html_info +from src.db.constants import ALL_ANNOTATION_MODELS, USER_ANNOTATION_MODELS from src.db.dto_converter import DTOConverter from src.db.dtos.url_html_content_info import URLHTMLContentInfo from src.db.exceptions import FailedQueryException @@ -22,7 +23,7 @@ from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion from src.db.models.mixins import URLDependentMixin from src.db.queries.base.builder import QueryBuilderBase - +from src.db.queries.implementations.core.common.annotation_exists import AnnotationExistsCTEQueryBuilder TOTAL_DISTINCT_ANNOTATION_COUNT_LABEL = "total_distinct_annotation_count" @@ -31,17 +32,7 @@ class GetNextURLForFinalReviewQueryBuilder(QueryBuilderBase): def __init__(self, batch_id: Optional[int] = None): super().__init__() self.batch_id = batch_id - self.user_models = [ - UserRelevantSuggestion, - UserRecordTypeSuggestion, - UserUrlAgencySuggestion - ] - self.models = [ - AutoRelevantSuggestion, - AutoRecordTypeSuggestion, - AutomatedUrlAgencySuggestion, - *self.user_models - ] + self.anno_exists_builder = AnnotationExistsCTEQueryBuilder() # The below relationships are joined directly to the URL self.single_join_relationships = [ URL.html_content, @@ -58,53 +49,34 @@ def __init__(self, batch_id: Optional[int] = None): (URL.confirmed_agencies, ConfirmedURLAgency.agency) ] - def get_exists_label(self, model: Type[URLDependentMixin]): - return f"{model.__name__}_exists" - - async def _annotation_exists_case( - self, - models: list[Type[URLDependentMixin]] - ): - cases = [] - for model in models: - cases.append( - case( - ( - func.bool_or(model.url_id != None), 1 - ), - else_=0 - ).label(self.get_exists_label(model)) - ) - return cases - - async def _outer_join_models(self, query: Select, list_of_models: list[Type[URLDependentMixin]]): - for model in list_of_models: - query = query.outerjoin(model) - return query + self.count_label = "count" def _get_where_exist_clauses( self, query: FromClause, ): where_clauses = [] - for model in self.user_models: - label = self.get_exists_label(model) + for model in USER_ANNOTATION_MODELS: + label = self.anno_exists_builder.get_exists_label(model) where_clause = getattr(query.c, label) == 1 where_clauses.append(where_clause) return where_clauses def _build_base_query(self, anno_exists_query: FromClause, ): - where_exist_clauses = self._get_where_exist_clauses(anno_exists_query) + builder = self.anno_exists_builder + where_exist_clauses = self._get_where_exist_clauses( + builder.query + ) return ( select( URL, - self._sum_exists_query(anno_exists_query, self.models) + self._sum_exists_query(anno_exists_query, ALL_ANNOTATION_MODELS) ) .select_from(anno_exists_query) .join( URL, - URL.id == anno_exists_query.c.id + URL.id == builder.url_id ) .where( and_( @@ -116,7 +88,7 @@ def _build_base_query(self, anno_exists_query: FromClause, ): def _sum_exists_query(self, query, models: list[Type[URLDependentMixin]]): return sum( - [getattr(query.c, self.get_exists_label(model)) for model in models] + [getattr(query.c, self.anno_exists_builder.get_exists_label(model)) for model in models] ).label(TOTAL_DISTINCT_ANNOTATION_COUNT_LABEL) @@ -167,87 +139,82 @@ async def get_batch_info(self, session: AsyncSession) -> Optional[FinalReviewBat if self.batch_id is None: return None - count_label = "count" - count_reviewed_query = ( + count_reviewed_query = await self.get_count_reviewed_query() + + count_ready_query = await self.get_count_ready_query() + + full_query = ( select( - Batch.id.label("batch_id"), - func.count(URL.id).label(count_label) + func.coalesce(count_reviewed_query.c[self.count_label], 0).label("count_reviewed"), + func.coalesce(count_ready_query.c[self.count_label], 0).label("count_ready_for_review") ) - .outerjoin( - URL, - URL.batch_id == Batch.id - ) - .where( - URL.outcome.in_( - [ - URLStatus.VALIDATED.value, - URLStatus.NOT_RELEVANT.value, - URLStatus.SUBMITTED.value, - URLStatus.INDIVIDUAL_RECORD.value - ] - ), - URL.batch_id == self.batch_id + .select_from( + count_ready_query.outerjoin( + count_reviewed_query, + count_reviewed_query.c.batch_id == count_ready_query.c.batch_id + ) ) - .group_by(Batch.id) - .subquery("count_reviewed") ) - anno_exists_query = await self.get_anno_exists_query() + raw_result = await session.execute(full_query) + return FinalReviewBatchInfo(**raw_result.mappings().one()) + + async def get_count_ready_query(self): + builder = self.anno_exists_builder count_ready_query = ( select( URL.batch_id, - func.count(URL.id).label(count_label) + func.count(URL.id).label(self.count_label) ) .join( - anno_exists_query, - anno_exists_query.c.id == URL.id + builder.query, + builder.url_id == URL.id ) .where( URL.batch_id == self.batch_id, URL.outcome == URLStatus.PENDING.value, *self._get_where_exist_clauses( - anno_exists_query + builder.query ) ) .group_by(URL.batch_id) .subquery("count_ready") ) + return count_ready_query - full_query = ( + async def get_count_reviewed_query(self): + count_reviewed_query = ( select( - func.coalesce(count_reviewed_query.c[count_label], 0).label("count_reviewed"), - func.coalesce(count_ready_query.c[count_label], 0).label("count_ready_for_review") + Batch.id.label("batch_id"), + func.count(URL.id).label(self.count_label) ) - .select_from( - count_ready_query.outerjoin( - count_reviewed_query, - count_reviewed_query.c.batch_id == count_ready_query.c.batch_id - ) + .outerjoin( + URL, + URL.batch_id == Batch.id ) + .where( + URL.outcome.in_( + [ + URLStatus.VALIDATED.value, + URLStatus.NOT_RELEVANT.value, + URLStatus.SUBMITTED.value, + URLStatus.INDIVIDUAL_RECORD.value + ] + ), + URL.batch_id == self.batch_id + ) + .group_by(Batch.id) + .subquery("count_reviewed") ) - - raw_result = await session.execute(full_query) - return FinalReviewBatchInfo(**raw_result.mappings().one()) - - - - - - - + return count_reviewed_query async def run( self, session: AsyncSession ) -> Optional[GetNextURLForFinalReviewResponse]: + await self.anno_exists_builder.build() - anno_exists_query = await self.get_anno_exists_query() - - url_query = self._build_base_query(anno_exists_query) - url_query = await self._apply_batch_id_filter(url_query, self.batch_id) - url_query = await self._apply_options(url_query) - url_query = await self._apply_order_clause(url_query) - url_query = url_query.limit(1) + url_query = await self.build_url_query() raw_result = await session.execute(url_query) row = raw_result.unique().first() @@ -289,16 +256,14 @@ async def run( except Exception as e: raise FailedQueryException(f"Failed to convert result for url id {result.id} to response") from e - async def get_anno_exists_query(self): - annotation_exists_cases_all = await self._annotation_exists_case(self.models) - anno_exists_query = select( - URL.id, - *annotation_exists_cases_all - ) - anno_exists_query = await self._outer_join_models(anno_exists_query, self.models) - anno_exists_query = anno_exists_query.where(URL.outcome == URLStatus.PENDING.value) - anno_exists_query = anno_exists_query.group_by(URL.id).cte("annotations_exist") - return anno_exists_query + async def build_url_query(self): + anno_exists_query = self.anno_exists_builder.query + url_query = self._build_base_query(anno_exists_query) + url_query = await self._apply_batch_id_filter(url_query, self.batch_id) + url_query = await self._apply_options(url_query) + url_query = await self._apply_order_clause(url_query) + url_query = url_query.limit(1) + return url_query diff --git a/src/db/queries/implementations/core/metrics/__init__.py b/src/db/queries/implementations/core/metrics/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/queries/implementations/core/metrics/urls/__init__.py b/src/db/queries/implementations/core/metrics/urls/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/queries/implementations/core/metrics/urls/aggregated/__init__.py b/src/db/queries/implementations/core/metrics/urls/aggregated/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/queries/implementations/core/metrics/urls/aggregated/pending.py b/src/db/queries/implementations/core/metrics/urls/aggregated/pending.py new file mode 100644 index 00000000..d6b5b579 --- /dev/null +++ b/src/db/queries/implementations/core/metrics/urls/aggregated/pending.py @@ -0,0 +1,15 @@ +from typing import Any + +from sqlalchemy.ext.asyncio import AsyncSession + +from src.db.queries.base.builder import QueryBuilderBase + + +class GetMetricsURLSAggregatedPendingQueryBuilder(QueryBuilderBase): + + async def get_flags(self, session: AsyncSession) -> Any: + raise NotImplementedError + + async def run(self, session: AsyncSession) -> Any: + raise NotImplementedError + diff --git a/tests/automated/integration/api/helpers/RequestValidator.py b/tests/automated/integration/api/helpers/RequestValidator.py index a83589b3..07e65cde 100644 --- a/tests/automated/integration/api/helpers/RequestValidator.py +++ b/tests/automated/integration/api/helpers/RequestValidator.py @@ -24,7 +24,7 @@ from src.api.endpoints.metrics.dtos.get.backlog import GetMetricsBacklogResponseDTO from src.api.endpoints.metrics.dtos.get.batches.aggregated import GetMetricsBatchesAggregatedResponseDTO from src.api.endpoints.metrics.dtos.get.batches.breakdown import GetMetricsBatchesBreakdownResponseDTO -from src.api.endpoints.metrics.dtos.get.urls.aggregated import GetMetricsURLsAggregatedResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.aggregated.core import GetMetricsURLsAggregatedResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.pending import GetMetricsURLsBreakdownPendingResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.submitted import GetMetricsURLsBreakdownSubmittedResponseDTO from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo @@ -33,7 +33,6 @@ from src.api.endpoints.search.dtos.response import SearchURLResponse from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse from src.api.endpoints.url.dtos.response import GetURLsResponseInfo -from src.db.dtos.batch_info import BatchInfo from src.api.endpoints.task.dtos.get.task_status import GetTaskStatusResponseInfo from src.api.endpoints.task.dtos.get.task import TaskInfo from src.db.enums import TaskType From b442d006309d126d54995f5f2370b0c2e65cd7cf Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 16 Jun 2025 19:33:25 -0400 Subject: [PATCH 222/244] Refactor GetNDraft GetMetricsURLSAggregatedPendingQueryBuilder logic --- .../core/metrics/urls/aggregated/pending.py | 120 +++++++++++++++++- 1 file changed, 118 insertions(+), 2 deletions(-) diff --git a/src/db/queries/implementations/core/metrics/urls/aggregated/pending.py b/src/db/queries/implementations/core/metrics/urls/aggregated/pending.py index d6b5b579..68467c78 100644 --- a/src/db/queries/implementations/core/metrics/urls/aggregated/pending.py +++ b/src/db/queries/implementations/core/metrics/urls/aggregated/pending.py @@ -1,15 +1,131 @@ -from typing import Any +from typing import Any, Type +from sqlalchemy import select, func, case from sqlalchemy.ext.asyncio import AsyncSession +from src.api.endpoints.metrics.dtos.get.urls.aggregated.pending import GetMetricsURLsAggregatedPendingResponseDTO +from src.collectors.enums import URLStatus +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion +from src.db.models.instantiations.url.suggestion.record_type.user import UserRecordTypeSuggestion +from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion +from src.db.models.mixins import URLDependentMixin from src.db.queries.base.builder import QueryBuilderBase +from src.db.queries.implementations.core.common.annotation_exists import AnnotationExistsCTEQueryBuilder + +class PendingAnnotationExistsCTEQueryBuilder(AnnotationExistsCTEQueryBuilder): + + @property + def has_user_relevant_annotation(self): + return self.get_exists_for_model(UserRelevantSuggestion) + + @property + def has_user_record_type_annotation(self): + return self.get_exists_for_model(UserRecordTypeSuggestion) + + @property + def has_user_agency_annotation(self): + return self.get_exists_for_model(UserUrlAgencySuggestion) + + def get_exists_for_model(self, model: Type[URLDependentMixin]): + return self.query.c[ + self.get_exists_label(model) + ] + + async def build(self) -> Any: + await super().build() + + self.query = ( + self.query + .join( + URL, + URL.id == self.url_id + ) + .where( + URL.outcome == URLStatus.PENDING.value + ).cte("pending") + ) + class GetMetricsURLSAggregatedPendingQueryBuilder(QueryBuilderBase): + def __init__(self): + super().__init__() + self.pending_builder = PendingAnnotationExistsCTEQueryBuilder() + async def get_flags(self, session: AsyncSession) -> Any: raise NotImplementedError async def run(self, session: AsyncSession) -> Any: - raise NotImplementedError + await self.pending_builder.build() + + anno_breakdown_count_query = await self.get_anno_breakdown_count_query() + count_breakdown_count_query = await self.get_count_breakdown_count_query() + + raw_result = await session.execute(anno_breakdown_count_query) + # Anno breakdown has only one row, + # with a column for each annotation type + anno_breakdown_count = raw_result.mappings().one() + + raw_result = await session.execute(count_breakdown_count_query) + + # Count breakdown has multiple rows, + # with a column for each count of annotations (0, 1, 2, 3) + count_breakdown_count = raw_result.mappings().all() + d = {f"annotations_{num}": 0 for num in range(4)} + total_count = 0 + for row in count_breakdown_count: + key = f"annotations_{row['true_count']}" + d[key] = row["url_count"] + total_count += row["url_count"] + + return GetMetricsURLsAggregatedPendingResponseDTO( + all=total_count, + relevant=anno_breakdown_count["relevant"], + record_type=anno_breakdown_count["record_type"], + agency=anno_breakdown_count["agency"], + **d + ) + + + async def get_count_breakdown_count_query(self): + pb = self.pending_builder + true_count = ( + case(pb.has_user_relevant_annotation, else_=0) + + case(pb.has_user_record_type_annotation, else_=0) + + case(pb.has_user_agency_annotation, else_=0) + ).label("true_count") + true_count_query = ( + select( + true_count, + func.count(func.count()).label("url_count") + ).select_from( + pb.query + ).group_by( + true_count + ).order_by( + true_count.asc() + ) + ) + + return true_count_query + + async def get_anno_breakdown_count_query(self): + pb = self.pending_builder + + def func_sum(col, label): + return func.sum(case((col, 1), else_=0)).label(label) + + anno_count_query = select( + func_sum(pb.has_user_relevant_annotation, "has_user_relevant_annotation").label( + "relevant" + ), + func_sum(pb.has_user_record_type_annotation, "has_user_record_type_annotation").label( + "record_type" + ), + func_sum(pb.has_user_agency_annotation, "has_user_agency_annotation").label("agency"), + ).select_from(pb.query) + + return anno_count_query From f96bc672d969a90e3ad1b4bc4aeec2de4e7c659b Mon Sep 17 00:00:00 2001 From: Max Chis Date: Tue, 17 Jun 2025 08:20:56 -0400 Subject: [PATCH 223/244] Finish endpoint logic and test --- src/db/client/async_.py | 14 +- .../core/common/annotation_exists.py | 7 + .../core/metrics/urls/aggregated/pending.py | 14 +- .../{helpers => _helpers}/RequestValidator.py | 9 +- .../api/{helpers => _helpers}/__init__.py | 0 tests/automated/integration/api/conftest.py | 2 +- .../integration/api/metrics/__init__.py | 0 .../api/metrics/batches/__init__.py | 0 .../api/metrics/batches/test_aggregated.py | 73 +++ .../api/metrics/batches/test_breakdown.py | 99 ++++ .../integration/api/metrics/test_backlog.py | 104 ++++ .../integration/api/metrics/urls/__init__.py | 0 .../api/metrics/urls/aggregated/__init__.py | 0 .../api/metrics/urls/aggregated/test_core.py | 75 +++ .../metrics/urls/aggregated/test_pending.py | 111 ++++ .../api/metrics/urls/breakdown/__init__.py | 0 .../metrics/urls/breakdown/test_pending.py | 97 ++++ .../metrics/urls/breakdown/test_submitted.py | 68 +++ .../automated/integration/api/test_metrics.py | 482 ------------------ tests/helpers/api_test_helper.py | 2 +- 20 files changed, 664 insertions(+), 493 deletions(-) rename tests/automated/integration/api/{helpers => _helpers}/RequestValidator.py (97%) rename tests/automated/integration/api/{helpers => _helpers}/__init__.py (100%) create mode 100644 tests/automated/integration/api/metrics/__init__.py create mode 100644 tests/automated/integration/api/metrics/batches/__init__.py create mode 100644 tests/automated/integration/api/metrics/batches/test_aggregated.py create mode 100644 tests/automated/integration/api/metrics/batches/test_breakdown.py create mode 100644 tests/automated/integration/api/metrics/test_backlog.py create mode 100644 tests/automated/integration/api/metrics/urls/__init__.py create mode 100644 tests/automated/integration/api/metrics/urls/aggregated/__init__.py create mode 100644 tests/automated/integration/api/metrics/urls/aggregated/test_core.py create mode 100644 tests/automated/integration/api/metrics/urls/aggregated/test_pending.py create mode 100644 tests/automated/integration/api/metrics/urls/breakdown/__init__.py create mode 100644 tests/automated/integration/api/metrics/urls/breakdown/test_pending.py create mode 100644 tests/automated/integration/api/metrics/urls/breakdown/test_submitted.py delete mode 100644 tests/automated/integration/api/test_metrics.py diff --git a/src/db/client/async_.py b/src/db/client/async_.py index 6dd893f9..f64b7dd7 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -59,6 +59,8 @@ from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion from src.db.queries.implementations.core.final_review.get import GetNextURLForFinalReviewQueryBuilder from src.db.queries.implementations.core.get_recent_batch_summaries.builder import GetRecentBatchSummariesQueryBuilder +from src.db.queries.implementations.core.metrics.urls.aggregated.pending import \ + GetMetricsURLSAggregatedPendingQueryBuilder from src.db.statement_composer import StatementComposer from src.db.constants import PLACEHOLDER_AGENCY_NAME from src.db.enums import TaskType @@ -2284,5 +2286,13 @@ async def get_annotation_batch_info( total_urls=annotated_result + not_annotated_result ) - async def get_urls_aggregated_pending_metrics(self): - pass + @session_manager + async def get_urls_aggregated_pending_metrics( + self, + session: AsyncSession + ): + builder = GetMetricsURLSAggregatedPendingQueryBuilder() + result = await builder.run( + session=session + ) + return result diff --git a/src/db/queries/implementations/core/common/annotation_exists.py b/src/db/queries/implementations/core/common/annotation_exists.py index 3d6c5cbc..656b56f3 100644 --- a/src/db/queries/implementations/core/common/annotation_exists.py +++ b/src/db/queries/implementations/core/common/annotation_exists.py @@ -32,6 +32,13 @@ def url_id(self): def get_exists_label(self, model: Type[URLDependentMixin]): return f"{model.__name__}_exists" + def get_all(self) -> list[Any]: + l = [self.url_id] + for model in ALL_ANNOTATION_MODELS: + label = self.get_exists_label(model) + l.append(self.get(label)) + return l + async def _annotation_exists_case( self, ): diff --git a/src/db/queries/implementations/core/metrics/urls/aggregated/pending.py b/src/db/queries/implementations/core/metrics/urls/aggregated/pending.py index 68467c78..503af6c3 100644 --- a/src/db/queries/implementations/core/metrics/urls/aggregated/pending.py +++ b/src/db/queries/implementations/core/metrics/urls/aggregated/pending.py @@ -36,7 +36,9 @@ async def build(self) -> Any: await super().build() self.query = ( - self.query + select( + *self.get_all() + ) .join( URL, URL.id == self.url_id @@ -92,14 +94,14 @@ async def run(self, session: AsyncSession) -> Any: async def get_count_breakdown_count_query(self): pb = self.pending_builder true_count = ( - case(pb.has_user_relevant_annotation, else_=0) - + case(pb.has_user_record_type_annotation, else_=0) - + case(pb.has_user_agency_annotation, else_=0) + pb.has_user_relevant_annotation + + pb.has_user_record_type_annotation + + pb.has_user_agency_annotation ).label("true_count") true_count_query = ( select( true_count, - func.count(func.count()).label("url_count") + func.count().label("url_count") ).select_from( pb.query ).group_by( @@ -115,7 +117,7 @@ async def get_anno_breakdown_count_query(self): pb = self.pending_builder def func_sum(col, label): - return func.sum(case((col, 1), else_=0)).label(label) + return func.sum(col).label(label) anno_count_query = select( func_sum(pb.has_user_relevant_annotation, "has_user_relevant_annotation").label( diff --git a/tests/automated/integration/api/helpers/RequestValidator.py b/tests/automated/integration/api/_helpers/RequestValidator.py similarity index 97% rename from tests/automated/integration/api/helpers/RequestValidator.py rename to tests/automated/integration/api/_helpers/RequestValidator.py index 07e65cde..36cda8ce 100644 --- a/tests/automated/integration/api/helpers/RequestValidator.py +++ b/tests/automated/integration/api/_helpers/RequestValidator.py @@ -25,6 +25,7 @@ from src.api.endpoints.metrics.dtos.get.batches.aggregated import GetMetricsBatchesAggregatedResponseDTO from src.api.endpoints.metrics.dtos.get.batches.breakdown import GetMetricsBatchesBreakdownResponseDTO from src.api.endpoints.metrics.dtos.get.urls.aggregated.core import GetMetricsURLsAggregatedResponseDTO +from src.api.endpoints.metrics.dtos.get.urls.aggregated.pending import GetMetricsURLsAggregatedPendingResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.pending import GetMetricsURLsBreakdownPendingResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.submitted import GetMetricsURLsBreakdownSubmittedResponseDTO from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo @@ -455,4 +456,10 @@ async def get_urls_aggregated_metrics(self) -> GetMetricsURLsAggregatedResponseD data = self.get_v2( url="/metrics/urls/aggregate", ) - return GetMetricsURLsAggregatedResponseDTO(**data) \ No newline at end of file + return GetMetricsURLsAggregatedResponseDTO(**data) + + async def get_urls_aggregated_pending_metrics(self) -> GetMetricsURLsAggregatedPendingResponseDTO: + data = self.get_v2( + url="/metrics/urls/aggregate/pending", + ) + return GetMetricsURLsAggregatedPendingResponseDTO(**data) \ No newline at end of file diff --git a/tests/automated/integration/api/helpers/__init__.py b/tests/automated/integration/api/_helpers/__init__.py similarity index 100% rename from tests/automated/integration/api/helpers/__init__.py rename to tests/automated/integration/api/_helpers/__init__.py diff --git a/tests/automated/integration/api/conftest.py b/tests/automated/integration/api/conftest.py index ae25b263..d07e92d5 100644 --- a/tests/automated/integration/api/conftest.py +++ b/tests/automated/integration/api/conftest.py @@ -11,7 +11,7 @@ from src.security.manager import get_access_info from src.security.dtos.access_info import AccessInfo from src.security.enums import Permissions -from tests.automated.integration.api.helpers.RequestValidator import RequestValidator +from tests.automated.integration.api._helpers.RequestValidator import RequestValidator from tests.helpers.api_test_helper import APITestHelper MOCK_USER_ID = 1 diff --git a/tests/automated/integration/api/metrics/__init__.py b/tests/automated/integration/api/metrics/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/api/metrics/batches/__init__.py b/tests/automated/integration/api/metrics/batches/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/api/metrics/batches/test_aggregated.py b/tests/automated/integration/api/metrics/batches/test_aggregated.py new file mode 100644 index 00000000..084762b9 --- /dev/null +++ b/tests/automated/integration/api/metrics/batches/test_aggregated.py @@ -0,0 +1,73 @@ +import pytest + +from src.collectors.enums import CollectorType, URLStatus +from src.core.enums import BatchStatus +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters + + +@pytest.mark.asyncio +async def test_get_batches_aggregated_metrics(api_test_helper): + ath = api_test_helper + # Create successful batches with URLs of different statuses + all_params = [] + for i in range(3): + params = TestBatchCreationParameters( + strategy=CollectorType.MANUAL, + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.PENDING + ), + TestURLCreationParameters( + count=2, + status=URLStatus.SUBMITTED + ), + TestURLCreationParameters( + count=3, + status=URLStatus.NOT_RELEVANT + ), + TestURLCreationParameters( + count=4, + status=URLStatus.ERROR + ), + TestURLCreationParameters( + count=5, + status=URLStatus.VALIDATED + ) + ] + ) + all_params.append(params) + + + # Create failed batches + for i in range(2): + params = TestBatchCreationParameters( + outcome=BatchStatus.ERROR + ) + all_params.append(params) + + for params in all_params: + await ath.db_data_creator.batch_v2(params) + + dto = await ath.request_validator.get_batches_aggregated_metrics() + assert dto.total_batches == 5 + inner_dto_example = dto.by_strategy[CollectorType.EXAMPLE] + assert inner_dto_example.count_urls == 0 + assert inner_dto_example.count_successful_batches == 0 + assert inner_dto_example.count_failed_batches == 2 + assert inner_dto_example.count_urls_pending == 0 + assert inner_dto_example.count_urls_submitted == 0 + assert inner_dto_example.count_urls_rejected == 0 + assert inner_dto_example.count_urls_errors == 0 + assert inner_dto_example.count_urls_validated == 0 + + inner_dto_manual = dto.by_strategy[CollectorType.MANUAL] + assert inner_dto_manual.count_urls == 45 + assert inner_dto_manual.count_successful_batches == 3 + assert inner_dto_manual.count_failed_batches == 0 + assert inner_dto_manual.count_urls_pending == 3 + assert inner_dto_manual.count_urls_submitted == 6 + assert inner_dto_manual.count_urls_rejected == 9 + assert inner_dto_manual.count_urls_errors == 12 + assert inner_dto_manual.count_urls_validated == 15 diff --git a/tests/automated/integration/api/metrics/batches/test_breakdown.py b/tests/automated/integration/api/metrics/batches/test_breakdown.py new file mode 100644 index 00000000..0cce8740 --- /dev/null +++ b/tests/automated/integration/api/metrics/batches/test_breakdown.py @@ -0,0 +1,99 @@ +import pendulum +import pytest + +from src.collectors.enums import CollectorType, URLStatus +from src.core.enums import BatchStatus +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters + + +@pytest.mark.asyncio +async def test_get_batches_breakdown_metrics(api_test_helper): + # Create a different batch for each month, with different URLs + today = pendulum.parse('2021-01-01') + ath = api_test_helper + + batch_1_params = TestBatchCreationParameters( + strategy=CollectorType.MANUAL, + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.PENDING + ), + TestURLCreationParameters( + count=2, + status=URLStatus.SUBMITTED + ), + ] + ) + batch_1 = await ath.db_data_creator.batch_v2(batch_1_params) + batch_2_params = TestBatchCreationParameters( + strategy=CollectorType.EXAMPLE, + outcome=BatchStatus.ERROR, + created_at=today.subtract(weeks=1), + ) + batch_2 = await ath.db_data_creator.batch_v2(batch_2_params) + batch_3_params = TestBatchCreationParameters( + strategy=CollectorType.AUTO_GOOGLER, + created_at=today.subtract(weeks=2), + urls=[ + TestURLCreationParameters( + count=3, + status=URLStatus.NOT_RELEVANT + ), + TestURLCreationParameters( + count=4, + status=URLStatus.ERROR + ), + TestURLCreationParameters( + count=5, + status=URLStatus.VALIDATED + ), + ] + ) + batch_3 = await ath.db_data_creator.batch_v2(batch_3_params) + + dto_1 = await ath.request_validator.get_batches_breakdown_metrics( + page=1 + ) + assert len(dto_1.batches) == 3 + dto_batch_1 = dto_1.batches[2] + assert dto_batch_1.batch_id == batch_1.batch_id + assert dto_batch_1.strategy == CollectorType.MANUAL + assert dto_batch_1.status == BatchStatus.READY_TO_LABEL + assert pendulum.instance(dto_batch_1.created_at) > today + assert dto_batch_1.count_url_total == 3 + assert dto_batch_1.count_url_pending == 1 + assert dto_batch_1.count_url_submitted == 2 + assert dto_batch_1.count_url_rejected == 0 + assert dto_batch_1.count_url_error == 0 + assert dto_batch_1.count_url_validated == 0 + + dto_batch_2 = dto_1.batches[1] + assert dto_batch_2.batch_id == batch_2.batch_id + assert dto_batch_2.status == BatchStatus.ERROR + assert dto_batch_2.strategy == CollectorType.EXAMPLE + assert pendulum.instance(dto_batch_2.created_at) == today.subtract(weeks=1) + assert dto_batch_2.count_url_total == 0 + assert dto_batch_2.count_url_submitted == 0 + assert dto_batch_2.count_url_pending == 0 + assert dto_batch_2.count_url_rejected == 0 + assert dto_batch_2.count_url_error == 0 + assert dto_batch_2.count_url_validated == 0 + + dto_batch_3 = dto_1.batches[0] + assert dto_batch_3.batch_id == batch_3.batch_id + assert dto_batch_3.status == BatchStatus.READY_TO_LABEL + assert dto_batch_3.strategy == CollectorType.AUTO_GOOGLER + assert pendulum.instance(dto_batch_3.created_at) == today.subtract(weeks=2) + assert dto_batch_3.count_url_total == 12 + assert dto_batch_3.count_url_pending == 0 + assert dto_batch_3.count_url_submitted == 0 + assert dto_batch_3.count_url_rejected == 3 + assert dto_batch_3.count_url_error == 4 + assert dto_batch_3.count_url_validated == 5 + + dto_2 = await ath.request_validator.get_batches_breakdown_metrics( + page=2 + ) + assert len(dto_2.batches) == 0 diff --git a/tests/automated/integration/api/metrics/test_backlog.py b/tests/automated/integration/api/metrics/test_backlog.py new file mode 100644 index 00000000..a6807a23 --- /dev/null +++ b/tests/automated/integration/api/metrics/test_backlog.py @@ -0,0 +1,104 @@ +import pendulum +import pytest + +from src.collectors.enums import CollectorType, URLStatus +from src.core.enums import SuggestedStatus +from tests.helpers.batch_creation_parameters.annotation_info import AnnotationInfo +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters + + +@pytest.mark.asyncio +async def test_get_backlog_metrics(api_test_helper): + today = pendulum.parse('2021-01-01') + + ath = api_test_helper + adb_client = ath.adb_client() + + + # Populate the backlog table and test that backlog metrics returned on a monthly basis + # Ensure that multiple days in each month are added to the backlog table, with different values + + + batch_1_params = TestBatchCreationParameters( + strategy=CollectorType.MANUAL, + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.PENDING, + annotation_info=AnnotationInfo( + user_relevant=SuggestedStatus.NOT_RELEVANT + ) + ), + TestURLCreationParameters( + count=2, + status=URLStatus.SUBMITTED + ), + ] + ) + batch_1 = await ath.db_data_creator.batch_v2(batch_1_params) + + await adb_client.populate_backlog_snapshot( + dt=today.subtract(months=3).naive() + ) + + await adb_client.populate_backlog_snapshot( + dt=today.subtract(months=2, days=3).naive() + ) + + batch_2_params = TestBatchCreationParameters( + strategy=CollectorType.AUTO_GOOGLER, + urls=[ + TestURLCreationParameters( + count=4, + status=URLStatus.PENDING, + annotation_info=AnnotationInfo( + user_relevant=SuggestedStatus.NOT_RELEVANT + ) + ), + TestURLCreationParameters( + count=2, + status=URLStatus.ERROR + ), + ] + ) + batch_2 = await ath.db_data_creator.batch_v2(batch_2_params) + + await adb_client.populate_backlog_snapshot( + dt=today.subtract(months=2).naive() + ) + + await adb_client.populate_backlog_snapshot( + dt=today.subtract(months=1, days=4).naive() + ) + + batch_3_params = TestBatchCreationParameters( + strategy=CollectorType.AUTO_GOOGLER, + urls=[ + TestURLCreationParameters( + count=7, + status=URLStatus.PENDING, + annotation_info=AnnotationInfo( + user_relevant=SuggestedStatus.NOT_RELEVANT + ) + ), + TestURLCreationParameters( + count=5, + status=URLStatus.VALIDATED + ), + ] + ) + batch_3 = await ath.db_data_creator.batch_v2(batch_3_params) + + await adb_client.populate_backlog_snapshot( + dt=today.subtract(months=1).naive() + ) + + dto = await ath.request_validator.get_backlog_metrics() + + assert len(dto.entries) == 3 + + # Test that the count closest to the beginning of the month is returned for each month + assert dto.entries[0].count_pending_total == 1 + assert dto.entries[1].count_pending_total == 5 + assert dto.entries[2].count_pending_total == 12 diff --git a/tests/automated/integration/api/metrics/urls/__init__.py b/tests/automated/integration/api/metrics/urls/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/api/metrics/urls/aggregated/__init__.py b/tests/automated/integration/api/metrics/urls/aggregated/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/api/metrics/urls/aggregated/test_core.py b/tests/automated/integration/api/metrics/urls/aggregated/test_core.py new file mode 100644 index 00000000..15b48f1e --- /dev/null +++ b/tests/automated/integration/api/metrics/urls/aggregated/test_core.py @@ -0,0 +1,75 @@ +import pendulum +import pytest + +from src.collectors.enums import CollectorType, URLStatus +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters + + +@pytest.mark.asyncio +async def test_get_urls_aggregated_metrics(api_test_helper): + ath = api_test_helper + today = pendulum.parse('2021-01-01') + + batch_0_params = TestBatchCreationParameters( + strategy=CollectorType.MANUAL, + created_at=today.subtract(days=1), + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.PENDING, + ), + ] + ) + batch_0 = await ath.db_data_creator.batch_v2(batch_0_params) + oldest_url_id = batch_0.url_creation_infos[URLStatus.PENDING].url_mappings[0].url_id + + + batch_1_params = TestBatchCreationParameters( + strategy=CollectorType.MANUAL, + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.PENDING, + ), + TestURLCreationParameters( + count=2, + status=URLStatus.SUBMITTED + ), + ] + ) + batch_1 = await ath.db_data_creator.batch_v2(batch_1_params) + + batch_2_params = TestBatchCreationParameters( + strategy=CollectorType.AUTO_GOOGLER, + urls=[ + TestURLCreationParameters( + count=4, + status=URLStatus.PENDING, + ), + TestURLCreationParameters( + count=2, + status=URLStatus.ERROR + ), + TestURLCreationParameters( + count=1, + status=URLStatus.VALIDATED + ), + TestURLCreationParameters( + count=5, + status=URLStatus.NOT_RELEVANT + ), + ] + ) + batch_2 = await ath.db_data_creator.batch_v2(batch_2_params) + + dto = await ath.request_validator.get_urls_aggregated_metrics() + + assert dto.oldest_pending_url_id == oldest_url_id + assert dto.oldest_pending_url_created_at == today.subtract(days=1).in_timezone('UTC').naive() + assert dto.count_urls_pending == 6 + assert dto.count_urls_rejected == 5 + assert dto.count_urls_errors == 2 + assert dto.count_urls_validated == 1 + assert dto.count_urls_submitted == 2 + assert dto.count_urls_total == 16 diff --git a/tests/automated/integration/api/metrics/urls/aggregated/test_pending.py b/tests/automated/integration/api/metrics/urls/aggregated/test_pending.py new file mode 100644 index 00000000..6ccd85da --- /dev/null +++ b/tests/automated/integration/api/metrics/urls/aggregated/test_pending.py @@ -0,0 +1,111 @@ +import pytest + +from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.core.enums import SuggestedStatus, RecordType +from tests.helpers.batch_creation_parameters.annotation_info import AnnotationInfo +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters + + +def create_batch( + annotation_info: AnnotationInfo = AnnotationInfo(), + count: int = 1, +): + return TestBatchCreationParameters( + urls=[ + TestURLCreationParameters( + count=count, + annotation_info=annotation_info, + ) + ] + ) + + + +async def setup_test_batches(db_data_creator): + batches = [ + create_batch( + annotation_info=AnnotationInfo( + user_relevant=SuggestedStatus.NOT_RELEVANT + ) + ), + create_batch( + annotation_info=AnnotationInfo( + user_relevant=SuggestedStatus.RELEVANT, + user_record_type=RecordType.ARREST_RECORDS + ), + count=2 + ), + create_batch( + annotation_info=AnnotationInfo( + user_relevant=SuggestedStatus.RELEVANT, + user_record_type=RecordType.CALLS_FOR_SERVICE, + user_agency=URLAgencyAnnotationPostInfo( + suggested_agency=await db_data_creator.agency() + ) + ), + count=3 + ), + create_batch( + annotation_info=AnnotationInfo( + user_agency=URLAgencyAnnotationPostInfo( + is_new=True + ) + ), + count=1 + ), + create_batch( + count=5 + ), + create_batch( + annotation_info=AnnotationInfo( + user_relevant=SuggestedStatus.NOT_RELEVANT, + user_record_type=RecordType.PERSONNEL_RECORDS, + user_agency=URLAgencyAnnotationPostInfo( + suggested_agency=await db_data_creator.agency() + ) + ), + count=2 + ), + create_batch( + annotation_info=AnnotationInfo( + user_relevant=SuggestedStatus.RELEVANT, + user_agency=URLAgencyAnnotationPostInfo( + is_new=True + ) + ), + count=3 + ), + create_batch( + annotation_info=AnnotationInfo( + user_record_type=RecordType.BOOKING_REPORTS, + ), + count=2 + ), + create_batch( + count=2 + ) + ] + + for batch in batches: + await db_data_creator.batch_v2(batch) + +@pytest.mark.asyncio +async def test_get_urls_aggregated_pending_metrics(api_test_helper): + ath = api_test_helper + db_data_creator = ath.db_data_creator + await setup_test_batches(db_data_creator) + + response = await ath.request_validator.get_urls_aggregated_pending_metrics() + r = response + assert r.all == 21 + assert r.relevant == 11 + assert r.record_type == 9 + assert r.agency == 9 + assert r.annotations_0 == 7 + assert r.annotations_1 == 4 + assert r.annotations_2 == 5 + assert r.annotations_3 == 5 + + + diff --git a/tests/automated/integration/api/metrics/urls/breakdown/__init__.py b/tests/automated/integration/api/metrics/urls/breakdown/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/api/metrics/urls/breakdown/test_pending.py b/tests/automated/integration/api/metrics/urls/breakdown/test_pending.py new file mode 100644 index 00000000..a401c6fd --- /dev/null +++ b/tests/automated/integration/api/metrics/urls/breakdown/test_pending.py @@ -0,0 +1,97 @@ +import pendulum +import pytest + +from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.collectors.enums import CollectorType, URLStatus +from src.core.enums import SuggestedStatus, RecordType +from tests.helpers.batch_creation_parameters.annotation_info import AnnotationInfo +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters + + +@pytest.mark.asyncio +async def test_get_urls_breakdown_pending_metrics(api_test_helper): + # Build URLs, broken down into three separate weeks, + # with each week having a different number of pending URLs + # with a different number of kinds of annotations per URLs + + + today = pendulum.parse('2021-01-01') + ath = api_test_helper + + agency_id = await ath.db_data_creator.agency() + # Additionally, add some URLs that are submitted, + # validated, errored, and ensure they are not counted + batch_1_params = TestBatchCreationParameters( + strategy=CollectorType.MANUAL, + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.PENDING, + annotation_info=AnnotationInfo( + user_relevant=SuggestedStatus.NOT_RELEVANT + ) + ), + TestURLCreationParameters( + count=2, + status=URLStatus.SUBMITTED + ), + ] + ) + batch_1 = await ath.db_data_creator.batch_v2(batch_1_params) + batch_2_params = TestBatchCreationParameters( + strategy=CollectorType.EXAMPLE, + urls=[ + TestURLCreationParameters( + count=3, + status=URLStatus.PENDING, + annotation_info=AnnotationInfo( + user_relevant=SuggestedStatus.RELEVANT, + user_record_type=RecordType.CALLS_FOR_SERVICE + ) + ) + ], + created_at=today.subtract(weeks=1), + ) + batch_2 = await ath.db_data_creator.batch_v2(batch_2_params) + batch_3_params = TestBatchCreationParameters( + strategy=CollectorType.AUTO_GOOGLER, + created_at=today.subtract(weeks=1), + urls=[ + TestURLCreationParameters( + count=3, + status=URLStatus.SUBMITTED + ), + TestURLCreationParameters( + count=4, + status=URLStatus.ERROR + ), + TestURLCreationParameters( + count=5, + status=URLStatus.PENDING, + annotation_info=AnnotationInfo( + user_relevant=SuggestedStatus.RELEVANT, + user_record_type=RecordType.INCARCERATION_RECORDS, + user_agency=URLAgencyAnnotationPostInfo( + suggested_agency=agency_id + ) + ) + ), + ] + ) + batch_3 = await ath.db_data_creator.batch_v2(batch_3_params) + + dto = await ath.request_validator.get_urls_breakdown_pending_metrics() + assert len(dto.entries) == 2 + + entry_1 = dto.entries[0] + assert entry_1.count_pending_total == 8 + assert entry_1.count_pending_relevant_user == 8 + assert entry_1.count_pending_record_type_user == 8 + assert entry_1.count_pending_agency_user == 5 + + entry_2 = dto.entries[1] + assert entry_2.count_pending_total == 1 + assert entry_2.count_pending_relevant_user == 1 + assert entry_2.count_pending_record_type_user == 0 + assert entry_2.count_pending_agency_user == 0 diff --git a/tests/automated/integration/api/metrics/urls/breakdown/test_submitted.py b/tests/automated/integration/api/metrics/urls/breakdown/test_submitted.py new file mode 100644 index 00000000..71e00e51 --- /dev/null +++ b/tests/automated/integration/api/metrics/urls/breakdown/test_submitted.py @@ -0,0 +1,68 @@ +import pendulum +import pytest + +from src.collectors.enums import CollectorType, URLStatus +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters + + +@pytest.mark.asyncio +async def test_get_urls_breakdown_submitted_metrics(api_test_helper): + # Create URLs with submitted status, broken down in different amounts by different weeks + # And ensure the URLs are + today = pendulum.parse('2021-01-01') + ath = api_test_helper + + batch_1_params = TestBatchCreationParameters( + strategy=CollectorType.MANUAL, + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.PENDING + ), + TestURLCreationParameters( + count=2, + status=URLStatus.SUBMITTED + ), + ] + ) + batch_1 = await ath.db_data_creator.batch_v2(batch_1_params) + batch_2_params = TestBatchCreationParameters( + strategy=CollectorType.EXAMPLE, + urls=[ + TestURLCreationParameters( + count=3, + status=URLStatus.SUBMITTED + ) + ], + created_at=today.subtract(weeks=1), + ) + batch_2 = await ath.db_data_creator.batch_v2(batch_2_params) + batch_3_params = TestBatchCreationParameters( + strategy=CollectorType.AUTO_GOOGLER, + created_at=today.subtract(weeks=1), + urls=[ + TestURLCreationParameters( + count=3, + status=URLStatus.SUBMITTED + ), + TestURLCreationParameters( + count=4, + status=URLStatus.ERROR + ), + TestURLCreationParameters( + count=5, + status=URLStatus.VALIDATED + ), + ] + ) + batch_3 = await ath.db_data_creator.batch_v2(batch_3_params) + + dto = await ath.request_validator.get_urls_breakdown_submitted_metrics() + assert len(dto.entries) == 2 + + entry_1 = dto.entries[0] + assert entry_1.count_submitted == 6 + + entry_2 = dto.entries[1] + assert entry_2.count_submitted == 2 diff --git a/tests/automated/integration/api/test_metrics.py b/tests/automated/integration/api/test_metrics.py deleted file mode 100644 index 97a3032b..00000000 --- a/tests/automated/integration/api/test_metrics.py +++ /dev/null @@ -1,482 +0,0 @@ -import pendulum -import pytest - -from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo -from src.collectors.enums import URLStatus, CollectorType -from src.core.enums import BatchStatus, RecordType, SuggestedStatus -from tests.helpers.batch_creation_parameters.annotation_info import AnnotationInfo -from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters -from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters - - -@pytest.mark.asyncio -async def test_get_batches_aggregated_metrics(api_test_helper): - ath = api_test_helper - # Create successful batches with URLs of different statuses - all_params = [] - for i in range(3): - params = TestBatchCreationParameters( - strategy=CollectorType.MANUAL, - urls=[ - TestURLCreationParameters( - count=1, - status=URLStatus.PENDING - ), - TestURLCreationParameters( - count=2, - status=URLStatus.SUBMITTED - ), - TestURLCreationParameters( - count=3, - status=URLStatus.NOT_RELEVANT - ), - TestURLCreationParameters( - count=4, - status=URLStatus.ERROR - ), - TestURLCreationParameters( - count=5, - status=URLStatus.VALIDATED - ) - ] - ) - all_params.append(params) - - - # Create failed batches - for i in range(2): - params = TestBatchCreationParameters( - outcome=BatchStatus.ERROR - ) - all_params.append(params) - - for params in all_params: - await ath.db_data_creator.batch_v2(params) - - dto = await ath.request_validator.get_batches_aggregated_metrics() - assert dto.total_batches == 5 - inner_dto_example = dto.by_strategy[CollectorType.EXAMPLE] - assert inner_dto_example.count_urls == 0 - assert inner_dto_example.count_successful_batches == 0 - assert inner_dto_example.count_failed_batches == 2 - assert inner_dto_example.count_urls_pending == 0 - assert inner_dto_example.count_urls_submitted == 0 - assert inner_dto_example.count_urls_rejected == 0 - assert inner_dto_example.count_urls_errors == 0 - assert inner_dto_example.count_urls_validated == 0 - - inner_dto_manual = dto.by_strategy[CollectorType.MANUAL] - assert inner_dto_manual.count_urls == 45 - assert inner_dto_manual.count_successful_batches == 3 - assert inner_dto_manual.count_failed_batches == 0 - assert inner_dto_manual.count_urls_pending == 3 - assert inner_dto_manual.count_urls_submitted == 6 - assert inner_dto_manual.count_urls_rejected == 9 - assert inner_dto_manual.count_urls_errors == 12 - assert inner_dto_manual.count_urls_validated == 15 - - -@pytest.mark.asyncio -async def test_get_batches_breakdown_metrics(api_test_helper): - # Create a different batch for each month, with different URLs - today = pendulum.parse('2021-01-01') - ath = api_test_helper - - batch_1_params = TestBatchCreationParameters( - strategy=CollectorType.MANUAL, - urls=[ - TestURLCreationParameters( - count=1, - status=URLStatus.PENDING - ), - TestURLCreationParameters( - count=2, - status=URLStatus.SUBMITTED - ), - ] - ) - batch_1 = await ath.db_data_creator.batch_v2(batch_1_params) - batch_2_params = TestBatchCreationParameters( - strategy=CollectorType.EXAMPLE, - outcome=BatchStatus.ERROR, - created_at=today.subtract(weeks=1), - ) - batch_2 = await ath.db_data_creator.batch_v2(batch_2_params) - batch_3_params = TestBatchCreationParameters( - strategy=CollectorType.AUTO_GOOGLER, - created_at=today.subtract(weeks=2), - urls=[ - TestURLCreationParameters( - count=3, - status=URLStatus.NOT_RELEVANT - ), - TestURLCreationParameters( - count=4, - status=URLStatus.ERROR - ), - TestURLCreationParameters( - count=5, - status=URLStatus.VALIDATED - ), - ] - ) - batch_3 = await ath.db_data_creator.batch_v2(batch_3_params) - - dto_1 = await ath.request_validator.get_batches_breakdown_metrics( - page=1 - ) - assert len(dto_1.batches) == 3 - dto_batch_1 = dto_1.batches[2] - assert dto_batch_1.batch_id == batch_1.batch_id - assert dto_batch_1.strategy == CollectorType.MANUAL - assert dto_batch_1.status == BatchStatus.READY_TO_LABEL - assert pendulum.instance(dto_batch_1.created_at) > today - assert dto_batch_1.count_url_total == 3 - assert dto_batch_1.count_url_pending == 1 - assert dto_batch_1.count_url_submitted == 2 - assert dto_batch_1.count_url_rejected == 0 - assert dto_batch_1.count_url_error == 0 - assert dto_batch_1.count_url_validated == 0 - - dto_batch_2 = dto_1.batches[1] - assert dto_batch_2.batch_id == batch_2.batch_id - assert dto_batch_2.status == BatchStatus.ERROR - assert dto_batch_2.strategy == CollectorType.EXAMPLE - assert pendulum.instance(dto_batch_2.created_at) == today.subtract(weeks=1) - assert dto_batch_2.count_url_total == 0 - assert dto_batch_2.count_url_submitted == 0 - assert dto_batch_2.count_url_pending == 0 - assert dto_batch_2.count_url_rejected == 0 - assert dto_batch_2.count_url_error == 0 - assert dto_batch_2.count_url_validated == 0 - - dto_batch_3 = dto_1.batches[0] - assert dto_batch_3.batch_id == batch_3.batch_id - assert dto_batch_3.status == BatchStatus.READY_TO_LABEL - assert dto_batch_3.strategy == CollectorType.AUTO_GOOGLER - assert pendulum.instance(dto_batch_3.created_at) == today.subtract(weeks=2) - assert dto_batch_3.count_url_total == 12 - assert dto_batch_3.count_url_pending == 0 - assert dto_batch_3.count_url_submitted == 0 - assert dto_batch_3.count_url_rejected == 3 - assert dto_batch_3.count_url_error == 4 - assert dto_batch_3.count_url_validated == 5 - - dto_2 = await ath.request_validator.get_batches_breakdown_metrics( - page=2 - ) - assert len(dto_2.batches) == 0 - -@pytest.mark.asyncio -async def test_get_urls_breakdown_submitted_metrics(api_test_helper): - # Create URLs with submitted status, broken down in different amounts by different weeks - # And ensure the URLs are - today = pendulum.parse('2021-01-01') - ath = api_test_helper - - batch_1_params = TestBatchCreationParameters( - strategy=CollectorType.MANUAL, - urls=[ - TestURLCreationParameters( - count=1, - status=URLStatus.PENDING - ), - TestURLCreationParameters( - count=2, - status=URLStatus.SUBMITTED - ), - ] - ) - batch_1 = await ath.db_data_creator.batch_v2(batch_1_params) - batch_2_params = TestBatchCreationParameters( - strategy=CollectorType.EXAMPLE, - urls=[ - TestURLCreationParameters( - count=3, - status=URLStatus.SUBMITTED - ) - ], - created_at=today.subtract(weeks=1), - ) - batch_2 = await ath.db_data_creator.batch_v2(batch_2_params) - batch_3_params = TestBatchCreationParameters( - strategy=CollectorType.AUTO_GOOGLER, - created_at=today.subtract(weeks=1), - urls=[ - TestURLCreationParameters( - count=3, - status=URLStatus.SUBMITTED - ), - TestURLCreationParameters( - count=4, - status=URLStatus.ERROR - ), - TestURLCreationParameters( - count=5, - status=URLStatus.VALIDATED - ), - ] - ) - batch_3 = await ath.db_data_creator.batch_v2(batch_3_params) - - dto = await ath.request_validator.get_urls_breakdown_submitted_metrics() - assert len(dto.entries) == 2 - - entry_1 = dto.entries[0] - assert entry_1.count_submitted == 6 - - entry_2 = dto.entries[1] - assert entry_2.count_submitted == 2 - - -@pytest.mark.asyncio -async def test_get_urls_breakdown_pending_metrics(api_test_helper): - # Build URLs, broken down into three separate weeks, - # with each week having a different number of pending URLs - # with a different number of kinds of annotations per URLs - - - today = pendulum.parse('2021-01-01') - ath = api_test_helper - - agency_id = await ath.db_data_creator.agency() - # Additionally, add some URLs that are submitted, - # validated, errored, and ensure they are not counted - batch_1_params = TestBatchCreationParameters( - strategy=CollectorType.MANUAL, - urls=[ - TestURLCreationParameters( - count=1, - status=URLStatus.PENDING, - annotation_info=AnnotationInfo( - user_relevant=SuggestedStatus.NOT_RELEVANT - ) - ), - TestURLCreationParameters( - count=2, - status=URLStatus.SUBMITTED - ), - ] - ) - batch_1 = await ath.db_data_creator.batch_v2(batch_1_params) - batch_2_params = TestBatchCreationParameters( - strategy=CollectorType.EXAMPLE, - urls=[ - TestURLCreationParameters( - count=3, - status=URLStatus.PENDING, - annotation_info=AnnotationInfo( - user_relevant=SuggestedStatus.RELEVANT, - user_record_type=RecordType.CALLS_FOR_SERVICE - ) - ) - ], - created_at=today.subtract(weeks=1), - ) - batch_2 = await ath.db_data_creator.batch_v2(batch_2_params) - batch_3_params = TestBatchCreationParameters( - strategy=CollectorType.AUTO_GOOGLER, - created_at=today.subtract(weeks=1), - urls=[ - TestURLCreationParameters( - count=3, - status=URLStatus.SUBMITTED - ), - TestURLCreationParameters( - count=4, - status=URLStatus.ERROR - ), - TestURLCreationParameters( - count=5, - status=URLStatus.PENDING, - annotation_info=AnnotationInfo( - user_relevant=SuggestedStatus.RELEVANT, - user_record_type=RecordType.INCARCERATION_RECORDS, - user_agency=URLAgencyAnnotationPostInfo( - suggested_agency=agency_id - ) - ) - ), - ] - ) - batch_3 = await ath.db_data_creator.batch_v2(batch_3_params) - - dto = await ath.request_validator.get_urls_breakdown_pending_metrics() - assert len(dto.entries) == 2 - - entry_1 = dto.entries[0] - assert entry_1.count_pending_total == 8 - assert entry_1.count_pending_relevant_user == 8 - assert entry_1.count_pending_record_type_user == 8 - assert entry_1.count_pending_agency_user == 5 - - entry_2 = dto.entries[1] - assert entry_2.count_pending_total == 1 - assert entry_2.count_pending_relevant_user == 1 - assert entry_2.count_pending_record_type_user == 0 - assert entry_2.count_pending_agency_user == 0 - -@pytest.mark.asyncio -async def test_get_urls_aggregate_metrics(api_test_helper): - ath = api_test_helper - today = pendulum.parse('2021-01-01') - - batch_0_params = TestBatchCreationParameters( - strategy=CollectorType.MANUAL, - created_at=today.subtract(days=1), - urls=[ - TestURLCreationParameters( - count=1, - status=URLStatus.PENDING, - ), - ] - ) - batch_0 = await ath.db_data_creator.batch_v2(batch_0_params) - oldest_url_id = batch_0.url_creation_infos[URLStatus.PENDING].url_mappings[0].url_id - - - batch_1_params = TestBatchCreationParameters( - strategy=CollectorType.MANUAL, - urls=[ - TestURLCreationParameters( - count=1, - status=URLStatus.PENDING, - ), - TestURLCreationParameters( - count=2, - status=URLStatus.SUBMITTED - ), - ] - ) - batch_1 = await ath.db_data_creator.batch_v2(batch_1_params) - - batch_2_params = TestBatchCreationParameters( - strategy=CollectorType.AUTO_GOOGLER, - urls=[ - TestURLCreationParameters( - count=4, - status=URLStatus.PENDING, - ), - TestURLCreationParameters( - count=2, - status=URLStatus.ERROR - ), - TestURLCreationParameters( - count=1, - status=URLStatus.VALIDATED - ), - TestURLCreationParameters( - count=5, - status=URLStatus.NOT_RELEVANT - ), - ] - ) - batch_2 = await ath.db_data_creator.batch_v2(batch_2_params) - - dto = await ath.request_validator.get_urls_aggregated_metrics() - - assert dto.oldest_pending_url_id == oldest_url_id - assert dto.oldest_pending_url_created_at == today.subtract(days=1).in_timezone('UTC').naive() - assert dto.count_urls_pending == 6 - assert dto.count_urls_rejected == 5 - assert dto.count_urls_errors == 2 - assert dto.count_urls_validated == 1 - assert dto.count_urls_submitted == 2 - assert dto.count_urls_total == 16 - - - -@pytest.mark.asyncio -async def test_get_backlog_metrics(api_test_helper): - today = pendulum.parse('2021-01-01') - - ath = api_test_helper - adb_client = ath.adb_client() - - - # Populate the backlog table and test that backlog metrics returned on a monthly basis - # Ensure that multiple days in each month are added to the backlog table, with different values - - - batch_1_params = TestBatchCreationParameters( - strategy=CollectorType.MANUAL, - urls=[ - TestURLCreationParameters( - count=1, - status=URLStatus.PENDING, - annotation_info=AnnotationInfo( - user_relevant=SuggestedStatus.NOT_RELEVANT - ) - ), - TestURLCreationParameters( - count=2, - status=URLStatus.SUBMITTED - ), - ] - ) - batch_1 = await ath.db_data_creator.batch_v2(batch_1_params) - - await adb_client.populate_backlog_snapshot( - dt=today.subtract(months=3).naive() - ) - - await adb_client.populate_backlog_snapshot( - dt=today.subtract(months=2, days=3).naive() - ) - - batch_2_params = TestBatchCreationParameters( - strategy=CollectorType.AUTO_GOOGLER, - urls=[ - TestURLCreationParameters( - count=4, - status=URLStatus.PENDING, - annotation_info=AnnotationInfo( - user_relevant=SuggestedStatus.NOT_RELEVANT - ) - ), - TestURLCreationParameters( - count=2, - status=URLStatus.ERROR - ), - ] - ) - batch_2 = await ath.db_data_creator.batch_v2(batch_2_params) - - await adb_client.populate_backlog_snapshot( - dt=today.subtract(months=2).naive() - ) - - await adb_client.populate_backlog_snapshot( - dt=today.subtract(months=1, days=4).naive() - ) - - batch_3_params = TestBatchCreationParameters( - strategy=CollectorType.AUTO_GOOGLER, - urls=[ - TestURLCreationParameters( - count=7, - status=URLStatus.PENDING, - annotation_info=AnnotationInfo( - user_relevant=SuggestedStatus.NOT_RELEVANT - ) - ), - TestURLCreationParameters( - count=5, - status=URLStatus.VALIDATED - ), - ] - ) - batch_3 = await ath.db_data_creator.batch_v2(batch_3_params) - - await adb_client.populate_backlog_snapshot( - dt=today.subtract(months=1).naive() - ) - - dto = await ath.request_validator.get_backlog_metrics() - - assert len(dto.entries) == 3 - - # Test that the count closest to the beginning of the month is returned for each month - assert dto.entries[0].count_pending_total == 1 - assert dto.entries[1].count_pending_total == 5 - assert dto.entries[2].count_pending_total == 12 \ No newline at end of file diff --git a/tests/helpers/api_test_helper.py b/tests/helpers/api_test_helper.py index d5de78cd..55a85345 100644 --- a/tests/helpers/api_test_helper.py +++ b/tests/helpers/api_test_helper.py @@ -4,7 +4,7 @@ from src.api.endpoints.batch.dtos.get.summaries.response import GetBatchSummariesResponse from src.core.core import AsyncCore from src.core.enums import BatchStatus -from tests.automated.integration.api.helpers.RequestValidator import RequestValidator +from tests.automated.integration.api._helpers.RequestValidator import RequestValidator from tests.helpers.db_data_creator import DBDataCreator From a8117cc2cf21a686490c97a6d66df3c981e7f23a Mon Sep 17 00:00:00 2001 From: maxachis Date: Tue, 17 Jun 2025 10:47:57 -0400 Subject: [PATCH 224/244] Add `remaining` attribute to review get next source logic --- src/api/endpoints/review/dtos/get.py | 3 ++ src/api/endpoints/review/routes.py | 9 ++---- src/core/core.py | 3 +- src/db/client/async_.py | 4 +-- .../implementations/core/final_review/get.py | 28 +++++++++++++++---- .../test_approve_and_get_next_source.py | 1 + .../api/review/test_batch_filtering.py | 1 + .../api/review/test_next_source.py | 1 + 8 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/api/endpoints/review/dtos/get.py b/src/api/endpoints/review/dtos/get.py index bf33d1d6..09b035b5 100644 --- a/src/api/endpoints/review/dtos/get.py +++ b/src/api/endpoints/review/dtos/get.py @@ -91,4 +91,7 @@ class GetNextURLForFinalReviewResponse(BaseModel): class GetNextURLForFinalReviewOuterResponse(BaseModel): next_source: Optional[GetNextURLForFinalReviewResponse] = Field( title="The next source to be reviewed", + ) + remaining: int = Field( + title="The number of URLs left to review", ) \ No newline at end of file diff --git a/src/api/endpoints/review/routes.py b/src/api/endpoints/review/routes.py index 2a037e65..a142d71d 100644 --- a/src/api/endpoints/review/routes.py +++ b/src/api/endpoints/review/routes.py @@ -28,8 +28,7 @@ async def get_next_source( "If not specified, defaults to first qualifying URL", default=None), ) -> GetNextURLForFinalReviewOuterResponse: - next_source = await core.get_next_source_for_review(batch_id=batch_id) - return GetNextURLForFinalReviewOuterResponse(next_source=next_source) + return await core.get_next_source_for_review(batch_id=batch_id) @review_router.post("/approve-source") async def approve_source( @@ -45,8 +44,7 @@ async def approve_source( approval_info, access_info=access_info, ) - next_source = await core.get_next_source_for_review(batch_id=batch_id) - return GetNextURLForFinalReviewOuterResponse(next_source=next_source) + return await core.get_next_source_for_review(batch_id=batch_id) @review_router.post("/reject-source") async def reject_source( @@ -63,5 +61,4 @@ async def reject_source( access_info=access_info, rejection_reason=review_info.rejection_reason ) - next_source = await core.get_next_source_for_review(batch_id=batch_id) - return GetNextURLForFinalReviewOuterResponse(next_source=next_source) \ No newline at end of file + return await core.get_next_source_for_review(batch_id=batch_id) diff --git a/src/core/core.py b/src/core/core.py index 640a00e8..06854c59 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -28,6 +28,7 @@ from src.api.endpoints.metrics.dtos.get.urls.breakdown.pending import GetMetricsURLsBreakdownPendingResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.submitted import GetMetricsURLsBreakdownSubmittedResponseDTO from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo +from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewOuterResponse from src.api.endpoints.review.enums import RejectionReason from src.api.endpoints.search.dtos.response import SearchURLResponse from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse @@ -258,7 +259,7 @@ async def submit_url_agency_annotation( async def get_next_source_for_review( self, batch_id: Optional[int] - ): + ) -> GetNextURLForFinalReviewOuterResponse: return await self.adb_client.get_next_url_for_final_review( batch_id=batch_id ) diff --git a/src/db/client/async_.py b/src/db/client/async_.py index f64b7dd7..191694d1 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -35,7 +35,7 @@ from src.api.endpoints.metrics.dtos.get.urls.breakdown.submitted import GetMetricsURLsBreakdownSubmittedResponseDTO, \ GetMetricsURLsBreakdownSubmittedInnerDTO from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo -from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewResponse +from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewResponse, GetNextURLForFinalReviewOuterResponse from src.api.endpoints.review.enums import RejectionReason from src.api.endpoints.search.dtos.response import SearchURLResponse from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse, GetTasksResponseTaskInfo @@ -1019,7 +1019,7 @@ async def get_next_url_for_final_review( self, session: AsyncSession, batch_id: Optional[int] - ) -> Optional[GetNextURLForFinalReviewResponse]: + ) -> GetNextURLForFinalReviewOuterResponse: builder = GetNextURLForFinalReviewQueryBuilder( batch_id=batch_id diff --git a/src/db/queries/implementations/core/final_review/get.py b/src/db/queries/implementations/core/final_review/get.py index a0b1f2d5..c2640102 100644 --- a/src/db/queries/implementations/core/final_review/get.py +++ b/src/db/queries/implementations/core/final_review/get.py @@ -5,7 +5,7 @@ from sqlalchemy.orm import joinedload from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewResponse, FinalReviewOptionalMetadata, \ - FinalReviewAnnotationInfo, FinalReviewBatchInfo + FinalReviewAnnotationInfo, FinalReviewBatchInfo, GetNextURLForFinalReviewOuterResponse from src.collectors.enums import URLStatus from src.core.tasks.operators.url_html.scraper.parser.util import convert_to_response_html_info from src.db.constants import ALL_ANNOTATION_MODELS, USER_ANNOTATION_MODELS @@ -211,16 +211,27 @@ async def get_count_reviewed_query(self): async def run( self, session: AsyncSession - ) -> Optional[GetNextURLForFinalReviewResponse]: + ) -> GetNextURLForFinalReviewOuterResponse: await self.anno_exists_builder.build() url_query = await self.build_url_query() - raw_result = await session.execute(url_query) + raw_result = await session.execute(url_query.limit(1)) row = raw_result.unique().first() if row is None: - return None + return GetNextURLForFinalReviewOuterResponse( + next_source=None, + remaining=0 + ) + + count_query = ( + select( + func.count() + ).select_from(url_query.subquery("count")) + ) + remaining_result = (await session.execute(count_query)).scalar() + result: URL = row[0] @@ -229,7 +240,8 @@ async def run( batch_info = await self.get_batch_info(session) try: - return GetNextURLForFinalReviewResponse( + + next_source = GetNextURLForFinalReviewResponse( id=result.id, url=result.url, html_info=convert_to_response_html_info(html_content_infos), @@ -253,6 +265,10 @@ async def run( optional_metadata=optional_metadata, batch_info=batch_info ) + return GetNextURLForFinalReviewOuterResponse( + next_source=next_source, + remaining=remaining_result + ) except Exception as e: raise FailedQueryException(f"Failed to convert result for url id {result.id} to response") from e @@ -262,7 +278,7 @@ async def build_url_query(self): url_query = await self._apply_batch_id_filter(url_query, self.batch_id) url_query = await self._apply_options(url_query) url_query = await self._apply_order_clause(url_query) - url_query = url_query.limit(1) + return url_query diff --git a/tests/automated/integration/api/review/test_approve_and_get_next_source.py b/tests/automated/integration/api/review/test_approve_and_get_next_source.py index 89a65acc..e1c40eff 100644 --- a/tests/automated/integration/api/review/test_approve_and_get_next_source.py +++ b/tests/automated/integration/api/review/test_approve_and_get_next_source.py @@ -45,6 +45,7 @@ async def test_approve_and_get_next_source_for_review(api_test_helper): ) ) + assert result.remaining == 0 assert result.next_source is None adb_client = db_data_creator.adb_client diff --git a/tests/automated/integration/api/review/test_batch_filtering.py b/tests/automated/integration/api/review/test_batch_filtering.py index be0ea54f..2e8aa63c 100644 --- a/tests/automated/integration/api/review/test_batch_filtering.py +++ b/tests/automated/integration/api/review/test_batch_filtering.py @@ -17,6 +17,7 @@ async def test_batch_filtering( outer_result = await ath.request_validator.review_next_source( batch_id=batch_url_creation_info.batch_id ) + assert outer_result.remaining == 2 batch_info = outer_result.next_source.batch_info assert batch_info.count_reviewed == 4 assert batch_info.count_ready_for_review == 2 diff --git a/tests/automated/integration/api/review/test_next_source.py b/tests/automated/integration/api/review/test_next_source.py index 913457c0..c747d486 100644 --- a/tests/automated/integration/api/review/test_next_source.py +++ b/tests/automated/integration/api/review/test_next_source.py @@ -21,6 +21,7 @@ async def test_review_next_source(api_test_helper): confirmed_agency_id = await ath.db_data_creator.agency_confirmed_suggestion(url_id=url_mapping.url_id) outer_result = await ath.request_validator.review_next_source() + assert outer_result.remaining == 1 result = outer_result.next_source From 325a0b533c9ace463da02d4a3c81c633b9287cde Mon Sep 17 00:00:00 2001 From: maxachis Date: Tue, 17 Jun 2025 10:50:13 -0400 Subject: [PATCH 225/244] Fix breaking tests --- .../db/client/get_next_url_for_final_review/test_basic.py | 3 ++- .../get_next_url_for_final_review/test_batch_id_filtering.py | 4 ++-- .../test_favor_more_components.py | 2 +- .../client/get_next_url_for_final_review/test_new_agency.py | 3 ++- .../get_next_url_for_final_review/test_not_annotations.py | 2 +- .../get_next_url_for_final_review/test_only_confirmed_urls.py | 2 +- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_basic.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_basic.py index dc285672..1bba4e7f 100644 --- a/tests/automated/integration/db/client/get_next_url_for_final_review/test_basic.py +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_basic.py @@ -25,9 +25,10 @@ async def test_get_next_url_for_final_review_basic(db_data_creator: DBDataCreato ) - result = await db_data_creator.adb_client.get_next_url_for_final_review( + outer_result = await db_data_creator.adb_client.get_next_url_for_final_review( batch_id=None ) + result = outer_result.next_source assert result.url == url_mapping.url html_info = result.html_info diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_batch_id_filtering.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_batch_id_filtering.py index fa2d739e..bf7017e3 100644 --- a/tests/automated/integration/db/client/get_next_url_for_final_review/test_batch_id_filtering.py +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_batch_id_filtering.py @@ -26,11 +26,11 @@ async def test_get_next_url_for_final_review_batch_id_filtering(db_data_creator: batch_id=setup_info_2.batch_id ) - assert result_with_batch_id.url == url_mapping_2.url + assert result_with_batch_id.next_source.url == url_mapping_2.url # If no batch id is provided, return first valid URL result_no_batch_id =await db_data_creator.adb_client.get_next_url_for_final_review( batch_id=None ) - assert result_no_batch_id.url == url_mapping_1.url + assert result_no_batch_id.next_source.url == url_mapping_1.url diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_favor_more_components.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_favor_more_components.py index 8321f51f..103b1d03 100644 --- a/tests/automated/integration/db/client/get_next_url_for_final_review/test_favor_more_components.py +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_favor_more_components.py @@ -39,4 +39,4 @@ async def test_get_next_url_for_final_review_favor_more_components(db_data_creat batch_id=None ) - assert result.id == url_mapping_with_user_anno.url_id + assert result.next_source.id == url_mapping_with_user_anno.url_id diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_new_agency.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_new_agency.py index f882f7fb..7f91c93a 100644 --- a/tests/automated/integration/db/client/get_next_url_for_final_review/test_new_agency.py +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_new_agency.py @@ -29,9 +29,10 @@ async def test_get_next_url_for_final_review_new_agency(db_data_creator: DBDataC ] ) creation_info = await db_data_creator.batch_v2(parameters) - result = await db_data_creator.adb_client.get_next_url_for_final_review( + outer_result = await db_data_creator.adb_client.get_next_url_for_final_review( batch_id=None ) + result = outer_result.next_source assert result is not None user_suggestion = result.annotations.agency.user diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_not_annotations.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_not_annotations.py index a56d4f77..b82ebee2 100644 --- a/tests/automated/integration/db/client/get_next_url_for_final_review/test_not_annotations.py +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_not_annotations.py @@ -16,4 +16,4 @@ async def test_get_next_url_for_final_review_no_annotations(db_data_creator: DBD batch_id=None ) - assert result is None + assert result.next_source is None diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_only_confirmed_urls.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_only_confirmed_urls.py index 4f6149a6..6c9a29c8 100644 --- a/tests/automated/integration/db/client/get_next_url_for_final_review/test_only_confirmed_urls.py +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_only_confirmed_urls.py @@ -21,4 +21,4 @@ async def test_get_next_url_for_final_review_only_confirmed_urls(db_data_creator batch_id=None ) - assert result is None + assert result.next_source is None From 725bc8abee52af24245c8e2deffbfda8d67e5963 Mon Sep 17 00:00:00 2001 From: maxachis Date: Tue, 17 Jun 2025 12:27:21 -0400 Subject: [PATCH 226/244] Continue draft on agencies sync logic --- src/core/tasks/manager.py | 11 +++++++- .../tasks/operators/agency_sync/constants.py | 7 ++++++ src/core/tasks/operators/agency_sync/core.py | 25 ++++++++++++++++++- .../operators/agency_sync/dtos/__init__.py | 0 .../operators/agency_sync/dtos/parameters.py | 9 +++++++ .../tasks/operators/agency_sync/exceptions.py | 5 ++++ src/db/client/async_.py | 22 ++++++++++++++++ src/pdap_api/client.py | 8 +++--- .../manual/pdap_client/test_sync_agencies.py | 9 +++++-- 9 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 src/core/tasks/operators/agency_sync/constants.py create mode 100644 src/core/tasks/operators/agency_sync/dtos/__init__.py create mode 100644 src/core/tasks/operators/agency_sync/dtos/parameters.py create mode 100644 src/core/tasks/operators/agency_sync/exceptions.py diff --git a/src/core/tasks/manager.py b/src/core/tasks/manager.py index 2e62fa92..dc0fe336 100644 --- a/src/core/tasks/manager.py +++ b/src/core/tasks/manager.py @@ -3,6 +3,7 @@ from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse from src.collectors.source_collectors.muckrock.api_interface.core import MuckrockAPIInterface from src.core.tasks.operators.agency_identification.core import AgencyIdentificationTaskOperator +from src.core.tasks.operators.agency_sync.core import SyncAgenciesTaskOperator from src.core.tasks.operators.base import TaskOperatorBase from src.core.tasks.operators.submit_approved_url.core import SubmitApprovedURLTaskOperator from src.core.tasks.operators.url_404_probe.core import URL404ProbeTaskOperator @@ -101,6 +102,13 @@ async def get_url_404_probe_task_operator(self): ) return operator + async def get_sync_agencies_task_operator(self): + operator = SyncAgenciesTaskOperator( + adb_client=self.adb_client, + pdap_client=self.pdap_client + ) + return operator + async def get_task_operators(self) -> list[TaskOperatorBase]: return [ await self.get_url_html_task_operator(), @@ -109,7 +117,8 @@ async def get_task_operators(self) -> list[TaskOperatorBase]: await self.get_url_record_type_task_operator(), await self.get_agency_identification_task_operator(), await self.get_url_miscellaneous_metadata_task_operator(), - await self.get_submit_approved_url_task_operator() + await self.get_submit_approved_url_task_operator(), + await self.get_sync_agencies_task_operator() ] #endregion diff --git a/src/core/tasks/operators/agency_sync/constants.py b/src/core/tasks/operators/agency_sync/constants.py new file mode 100644 index 00000000..a58a7aca --- /dev/null +++ b/src/core/tasks/operators/agency_sync/constants.py @@ -0,0 +1,7 @@ + + +""" +Denotes the maximum number of requests to the Agencies Sync endpoint +permissible in a single task run. +""" +MAX_SYNC_REQUESTS = 30 \ No newline at end of file diff --git a/src/core/tasks/operators/agency_sync/core.py b/src/core/tasks/operators/agency_sync/core.py index 843e22c3..2e60ef80 100644 --- a/src/core/tasks/operators/agency_sync/core.py +++ b/src/core/tasks/operators/agency_sync/core.py @@ -1,3 +1,5 @@ +from src.core.tasks.operators.agency_sync.constants import MAX_SYNC_REQUESTS +from src.core.tasks.operators.agency_sync.exceptions import MaxRequestsExceededError from src.core.tasks.operators.base import TaskOperatorBase from src.db.client.async_ import AsyncDatabaseClient from src.db.enums import TaskType @@ -19,8 +21,29 @@ def task_type(self) -> TaskType: return TaskType.SYNC_AGENCIES async def meets_task_prerequisites(self): - pass + return await self.adb_client.last_full_agencies_sync_over_a_day_ago() async def inner_task_logic(self): + params = await self.adb_client.get_agencies_sync_parameters() + if params.page is None: + params.page = 1 + + response = await self.pdap_client.sync_agencies(params) + request_count = 1 + while len(response.agencies) > 0: + if request_count > MAX_SYNC_REQUESTS: + raise MaxRequestsExceededError( + f"Max requests in a single task run ({MAX_SYNC_REQUESTS}) exceeded." + ) + await self.adb_client.upsert_agencies(response.agencies) + + params.page += 1 + await self.adb_client.update_agencies_sync_progress(params.page) + + response = await self.pdap_client.sync_agencies(params) + request_count += 1 + + await self.adb_client.mark_full_agencies_sync() + pass diff --git a/src/core/tasks/operators/agency_sync/dtos/__init__.py b/src/core/tasks/operators/agency_sync/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/operators/agency_sync/dtos/parameters.py b/src/core/tasks/operators/agency_sync/dtos/parameters.py new file mode 100644 index 00000000..3d8cceb4 --- /dev/null +++ b/src/core/tasks/operators/agency_sync/dtos/parameters.py @@ -0,0 +1,9 @@ +from datetime import date +from typing import Optional + +from pydantic import BaseModel + + +class AgencySyncParameters(BaseModel): + cutoff_date: Optional[date] + page: Optional[int] diff --git a/src/core/tasks/operators/agency_sync/exceptions.py b/src/core/tasks/operators/agency_sync/exceptions.py new file mode 100644 index 00000000..0af9937f --- /dev/null +++ b/src/core/tasks/operators/agency_sync/exceptions.py @@ -0,0 +1,5 @@ + + + +class MaxRequestsExceededError(Exception): + pass \ No newline at end of file diff --git a/src/db/client/async_.py b/src/db/client/async_.py index 191694d1..b50be7b1 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -41,6 +41,7 @@ from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse, GetTasksResponseTaskInfo from src.api.endpoints.url.dtos.response import GetURLsResponseInfo, GetURLsResponseErrorInfo, GetURLsResponseInnerInfo from src.collectors.enums import URLStatus, CollectorType +from src.core.tasks.operators.agency_sync.dtos.parameters import AgencySyncParameters from src.core.tasks.operators.url_html.scraper.parser.util import convert_to_response_html_info from src.db.config_manager import ConfigManager from src.db.dto_converter import DTOConverter @@ -94,6 +95,7 @@ from src.core.env_var_manager import EnvVarManager from src.core.enums import BatchStatus, SuggestionType, RecordType, SuggestedStatus from src.db.types import UserSuggestionType +from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInnerInfo # Type Hints @@ -2296,3 +2298,23 @@ async def get_urls_aggregated_pending_metrics( session=session ) return result + + async def last_full_agencies_sync_over_a_day_ago(self) -> bool: + pass + + async def get_agencies_sync_parameters(self) -> AgencySyncParameters: + pass + + async def upsert_agencies( + self, + agencies: list[AgenciesSyncResponseInnerInfo] + ): + pass + + async def update_agencies_sync_progress(self, page: int): + query = update( + + ) + + async def mark_full_agencies_sync(self): + pass diff --git a/src/pdap_api/client.py b/src/pdap_api/client.py index 91137ad1..2614226d 100644 --- a/src/pdap_api/client.py +++ b/src/pdap_api/client.py @@ -1,6 +1,7 @@ from datetime import datetime from typing import Optional +from src.core.tasks.operators.agency_sync.dtos.parameters import AgencySyncParameters from src.core.tasks.operators.submit_approved_url.tdo import SubmitApprovedURLTDO, SubmittedURLInfo from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInnerInfo, AgenciesSyncResponseInfo from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse @@ -148,8 +149,7 @@ async def submit_urls( async def sync_agencies( self, - page: int, - update_at: Optional[datetime], + params: AgencySyncParameters ) -> AgenciesSyncResponseInfo: url =self.access_manager.build_url( namespace=DataSourcesNamespaces.SOURCE_COLLECTOR, @@ -165,8 +165,8 @@ async def sync_agencies( url=url, headers=headers, params={ - "page": page, - "update_at": update_at + "page": params.page, + "update_at": params.cutoff_date } ) response_info = await self.access_manager.make_request(request_info) diff --git a/tests/manual/pdap_client/test_sync_agencies.py b/tests/manual/pdap_client/test_sync_agencies.py index d5ce5c1f..7079cfb4 100644 --- a/tests/manual/pdap_client/test_sync_agencies.py +++ b/tests/manual/pdap_client/test_sync_agencies.py @@ -1,13 +1,18 @@ import pytest import time +from src.core.tasks.operators.agency_sync.dtos.parameters import AgencySyncParameters + + @pytest.mark.asyncio async def test_sync_agencies(pdap_client_dev): start = time.perf_counter() response = await pdap_client_dev.sync_agencies( - page=1, - update_at=None + params=AgencySyncParameters( + page=1, + cutoff_date=None + ) ) end = time.perf_counter() print(response) From 7ee1d4c8437da4a314960071125846a1a05b8e7d Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 18 Jun 2025 15:17:43 -0400 Subject: [PATCH 227/244] Refactor DB Client with helpers --- ...0922-fb199cf58ecd_update_agencies_table.py | 5 +- src/db/client/async_.py | 52 +++++++++---------- .../instantiations/sync_state_agencies.py | 2 +- src/util/alembic_helpers.py | 10 ++++ 4 files changed, 39 insertions(+), 30 deletions(-) diff --git a/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py b/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py index 25e5826e..9556aee9 100644 --- a/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py +++ b/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py @@ -10,7 +10,7 @@ from alembic import op import sqlalchemy as sa -from src.util.alembic_helpers import created_at_column, updated_at_column, switch_enum_type +from src.util.alembic_helpers import created_at_column, updated_at_column, switch_enum_type, id_column # revision identifiers, used by Alembic. revision: str = 'fb199cf58ecd' @@ -33,13 +33,14 @@ def upgrade() -> None: op.create_table( 'agencies_sync_state', + id_column(), sa.Column('last_full_sync_at', sa.DateTime(), nullable=True), sa.Column('current_cutoff_date', sa.Date(), nullable=True), sa.Column('current_page', sa.Integer(), nullable=True), ) # Add row to `agencies_sync_state` table - op.execute('INSERT INTO agencies_sync_state VALUES (null, null, null)') + op.execute('INSERT INTO agencies_sync_state (last_full_sync_at, current_cutoff_date, current_page) VALUES (null, null, null)') # Add 'Sync Agencies' to TaskType Enum switch_enum_type( diff --git a/src/db/client/async_.py b/src/db/client/async_.py index b50be7b1..797c743e 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -54,6 +54,7 @@ from src.db.dtos.url_html_content_info import URLHTMLContentInfo, HTMLContentType from src.db.dtos.url_info import URLInfo from src.db.dtos.url_mapping import URLMapping +from src.db.models.instantiations.sync_state_agencies import AgenciesSyncState from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion from src.db.models.instantiations.url.suggestion.record_type.user import UserRecordTypeSuggestion from src.db.models.instantiations.url.suggestion.relevant.auto import AutoRelevantSuggestion @@ -173,6 +174,14 @@ async def get_user_suggestion( result = await session.execute(statement) return result.unique().scalar_one_or_none() + @session_manager + async def execute(self, session: AsyncSession, statement): + await session.execute(statement) + + @session_manager + async def add(self, session: AsyncSession, model: Base): + session.add(model) + @staticmethod async def get_next_url_for_user_annotation( session: AsyncSession, @@ -346,19 +355,16 @@ async def add_auto_record_type_suggestions( ) session.add(suggestion) - @session_manager async def add_auto_record_type_suggestion( self, - session: AsyncSession, url_id: int, record_type: RecordType ): - suggestion = AutoRecordTypeSuggestion( url_id=url_id, record_type=record_type.value ) - session.add(suggestion) + await self.add(suggestion) @session_manager async def add_user_record_type_suggestion( @@ -583,10 +589,9 @@ async def load_root_url_cache(self, session: AsyncSession) -> dict[str, str]: d[result.url] = result.page_title return d - @session_manager - async def add_to_root_url_cache(self, session: AsyncSession, url: str, page_title: str) -> None: + async def add_to_root_url_cache(self, url: str, page_title: str) -> None: cache = RootURL(url=url, page_title=page_title) - session.add(cache) + await self.add(cache) @session_manager async def get_urls(self, session: AsyncSession, page: int, errors: bool) -> GetURLsResponseInfo: @@ -652,16 +657,13 @@ async def initiate_task( async def update_task_status(self, session: AsyncSession, task_id: int, status: BatchStatus): task = await session.get(Task, task_id) task.task_status = status.value - await session.commit() - @session_manager - async def add_task_error(self, session: AsyncSession, task_id: int, error: str): + async def add_task_error(self, task_id: int, error: str): task_error = TaskError( task_id=task_id, error=error ) - session.add(task_error) - await session.commit() + await self.add(task_error) @session_manager async def get_task_info(self, session: AsyncSession, task_id: int) -> TaskInfo: @@ -977,8 +979,6 @@ async def add_agency_auto_suggestions( ) session.add(url_agency_suggestion) - await session.commit() - @session_manager async def add_agency_manual_suggestion( self, @@ -1475,15 +1475,14 @@ async def get_logs_by_batch_id(self, session, batch_id: int) -> List[LogOutputIn logs = raw_results.scalars().all() return ([LogOutputInfo(**log.__dict__) for log in logs]) - @session_manager - async def delete_old_logs(self, session): + async def delete_old_logs(self): """ Delete logs older than a day """ statement = delete(Log).where( Log.created_at < datetime.now() - timedelta(days=7) ) - await session.execute(statement) + await self.execute(statement) async def get_agency_suggestions(self, session, url_id: int) -> List[GetNextURLForAgencyAgencyInfo]: # Get relevant autosuggestions and agency info, if an associated agency exists @@ -2154,20 +2153,16 @@ async def get_pending_urls_not_checked_for_duplicates(self, session: AsyncSessio urls = raw_result.scalars().all() return [URLDuplicateTDO(url=url.url, url_id=url.id) for url in urls] - @session_manager - async def mark_all_as_duplicates(self, session: AsyncSession, url_ids: List[int]): + async def mark_all_as_duplicates(self, url_ids: List[int]): query = update(URL).where(URL.id.in_(url_ids)).values(outcome=URLStatus.DUPLICATE.value) - await session.execute(query) + await self.execute(query) - @session_manager - async def mark_all_as_404(self, session: AsyncSession, url_ids: List[int]): + async def mark_all_as_404(self, url_ids: List[int]): query = update(URL).where(URL.id.in_(url_ids)).values(outcome=URLStatus.NOT_FOUND.value) - await session.execute(query) + await self.execute(query) - @session_manager async def mark_all_as_recently_probed_for_404( self, - session: AsyncSession, url_ids: List[int], dt: datetime = func.now() ): @@ -2180,7 +2175,7 @@ async def mark_all_as_recently_probed_for_404( index_elements=['url_id'], set_={"last_probed_at": dt} ) - await session.execute(update_stmt) + await self.execute(update_stmt) @session_manager async def mark_as_checked_for_duplicates(self, session: AsyncSession, url_ids: list[int]): @@ -2313,8 +2308,11 @@ async def upsert_agencies( async def update_agencies_sync_progress(self, page: int): query = update( - + AgenciesSyncState + ).values( + page=page ) + await self.execute(query) async def mark_full_agencies_sync(self): pass diff --git a/src/db/models/instantiations/sync_state_agencies.py b/src/db/models/instantiations/sync_state_agencies.py index b822a002..207a2936 100644 --- a/src/db/models/instantiations/sync_state_agencies.py +++ b/src/db/models/instantiations/sync_state_agencies.py @@ -9,7 +9,7 @@ class AgenciesSyncState(Base): __tablename__ = 'agencies_sync_state' - + id = Column(Integer, primary_key=True) last_full_sync_at = Column( DateTime(), nullable=True, diff --git a/src/util/alembic_helpers.py b/src/util/alembic_helpers.py index 579ba34e..784ff964 100644 --- a/src/util/alembic_helpers.py +++ b/src/util/alembic_helpers.py @@ -54,6 +54,16 @@ def alter_enum_value( """ op.execute(f"ALTER TYPE {enum_name} RENAME VALUE '{old_value}' TO '{new_value}'") +def id_column(): + """Returns a standard `id` column.""" + return sa.Column( + 'id', + sa.Integer(), + primary_key=True, + autoincrement=True, + nullable=False + ) + def created_at_column(): """Returns a standard `created_at` column.""" return sa.Column( From 23e3311f71f59a7f3078bcaffeb51ec736a25a6f Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 18 Jun 2025 21:59:38 -0400 Subject: [PATCH 228/244] Begin building test logic --- src/db/client/async_.py | 163 ++++++++++++------ .../implementations/core/tasks/__init__.py | 0 .../core/tasks/agency_sync/__init__.py | 0 .../core/tasks/agency_sync/upsert.py | 38 ++++ src/pdap_api/client.py | 6 +- .../integration/tasks/agency_sync/__init__.py | 0 .../integration/tasks/agency_sync/conftest.py | 24 +++ .../integration/tasks/agency_sync/data.py | 80 +++++++++ .../tasks/agency_sync/existence_checker.py | 28 +++ .../integration/tasks/agency_sync/helpers.py | 77 +++++++++ .../tasks/agency_sync/test_happy_path.py | 57 ++++++ .../tasks/agency_sync/test_interruption.py | 88 ++++++++++ .../tasks/agency_sync/test_no_new_results.py | 55 ++++++ 13 files changed, 563 insertions(+), 53 deletions(-) create mode 100644 src/db/queries/implementations/core/tasks/__init__.py create mode 100644 src/db/queries/implementations/core/tasks/agency_sync/__init__.py create mode 100644 src/db/queries/implementations/core/tasks/agency_sync/upsert.py create mode 100644 tests/automated/integration/tasks/agency_sync/__init__.py create mode 100644 tests/automated/integration/tasks/agency_sync/conftest.py create mode 100644 tests/automated/integration/tasks/agency_sync/data.py create mode 100644 tests/automated/integration/tasks/agency_sync/existence_checker.py create mode 100644 tests/automated/integration/tasks/agency_sync/helpers.py create mode 100644 tests/automated/integration/tasks/agency_sync/test_happy_path.py create mode 100644 tests/automated/integration/tasks/agency_sync/test_interruption.py create mode 100644 tests/automated/integration/tasks/agency_sync/test_no_new_results.py diff --git a/src/db/client/async_.py b/src/db/client/async_.py index 797c743e..e1ffd20c 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -4,8 +4,9 @@ from typing import Optional, Type, Any, List from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, Select, not_, and_, update, delete, literal +from sqlalchemy import select, exists, func, case, Select, not_, and_, update, delete, literal, text from sqlalchemy.dialects import postgresql +from sqlalchemy.dialects.postgresql import insert as pg_insert from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import selectinload, joinedload, QueryableAttribute, aliased @@ -35,66 +36,67 @@ from src.api.endpoints.metrics.dtos.get.urls.breakdown.submitted import GetMetricsURLsBreakdownSubmittedResponseDTO, \ GetMetricsURLsBreakdownSubmittedInnerDTO from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo -from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewResponse, GetNextURLForFinalReviewOuterResponse +from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewOuterResponse from src.api.endpoints.review.enums import RejectionReason from src.api.endpoints.search.dtos.response import SearchURLResponse +from src.api.endpoints.task.dtos.get.task import TaskInfo from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse, GetTasksResponseTaskInfo from src.api.endpoints.url.dtos.response import GetURLsResponseInfo, GetURLsResponseErrorInfo, GetURLsResponseInnerInfo from src.collectors.enums import URLStatus, CollectorType +from src.core.enums import BatchStatus, SuggestionType, RecordType, SuggestedStatus +from src.core.env_var_manager import EnvVarManager +from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo +from src.core.tasks.operators.agency_identification.dtos.tdo import AgencyIdentificationTDO from src.core.tasks.operators.agency_sync.dtos.parameters import AgencySyncParameters +from src.core.tasks.operators.submit_approved_url.tdo import SubmitApprovedURLTDO, SubmittedURLInfo +from src.core.tasks.operators.url_404_probe.tdo import URL404ProbeTDO +from src.core.tasks.operators.url_duplicate.tdo import URLDuplicateTDO from src.core.tasks.operators.url_html.scraper.parser.util import convert_to_response_html_info +from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo from src.db.config_manager import ConfigManager +from src.db.constants import PLACEHOLDER_AGENCY_NAME from src.db.dto_converter import DTOConverter from src.db.dtos.batch_info import BatchInfo from src.db.dtos.duplicate_info import DuplicateInsertInfo, DuplicateInfo from src.db.dtos.insert_urls_info import InsertURLsInfo from src.db.dtos.log_info import LogInfo, LogOutputInfo -from src.api.endpoints.task.dtos.get.task import TaskInfo from src.db.dtos.url_error_info import URLErrorPydanticInfo from src.db.dtos.url_html_content_info import URLHTMLContentInfo, HTMLContentType from src.db.dtos.url_info import URLInfo from src.db.dtos.url_mapping import URLMapping +from src.db.enums import TaskType +from src.db.models.instantiations.agency import Agency +from src.db.models.instantiations.backlog_snapshot import BacklogSnapshot +from src.db.models.instantiations.batch import Batch +from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency +from src.db.models.instantiations.duplicate import Duplicate +from src.db.models.instantiations.link_task_url import LinkTaskURL +from src.db.models.instantiations.log import Log +from src.db.models.instantiations.root_url_cache import RootURL from src.db.models.instantiations.sync_state_agencies import AgenciesSyncState +from src.db.models.instantiations.task.core import Task +from src.db.models.instantiations.task.error import TaskError +from src.db.models.instantiations.url.checked_for_duplicate import URLCheckedForDuplicate +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.url.data_source import URLDataSource +from src.db.models.instantiations.url.error_info import URLErrorInfo +from src.db.models.instantiations.url.html_content import URLHTMLContent +from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata +from src.db.models.instantiations.url.probed_for_404 import URLProbedFor404 +from src.db.models.instantiations.url.reviewing_user import ReviewingUserURL from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion +from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion +from src.db.models.instantiations.url.suggestion.record_type.auto import AutoRecordTypeSuggestion from src.db.models.instantiations.url.suggestion.record_type.user import UserRecordTypeSuggestion from src.db.models.instantiations.url.suggestion.relevant.auto import AutoRelevantSuggestion from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion +from src.db.models.templates import Base from src.db.queries.implementations.core.final_review.get import GetNextURLForFinalReviewQueryBuilder from src.db.queries.implementations.core.get_recent_batch_summaries.builder import GetRecentBatchSummariesQueryBuilder from src.db.queries.implementations.core.metrics.urls.aggregated.pending import \ GetMetricsURLSAggregatedPendingQueryBuilder +from src.db.queries.implementations.core.tasks.agency_sync.upsert import get_upsert_agencies_query from src.db.statement_composer import StatementComposer -from src.db.constants import PLACEHOLDER_AGENCY_NAME -from src.db.enums import TaskType -from src.db.models.templates import Base -from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency -from src.db.models.instantiations.link_task_url import LinkTaskURL -from src.db.models.instantiations.url.error_info import URLErrorInfo -from src.db.models.instantiations.agency import Agency -from src.db.models.instantiations.duplicate import Duplicate -from src.db.models.instantiations.log import Log -from src.db.models.instantiations.task.error import TaskError -from src.db.models.instantiations.task.core import Task -from src.db.models.instantiations.backlog_snapshot import BacklogSnapshot -from src.db.models.instantiations.url.suggestion.record_type.auto import AutoRecordTypeSuggestion -from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion -from src.db.models.instantiations.url.data_source import URLDataSource -from src.db.models.instantiations.root_url_cache import RootURL -from src.db.models.instantiations.url.html_content import URLHTMLContent -from src.db.models.instantiations.url.reviewing_user import ReviewingUserURL -from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata -from src.db.models.instantiations.url.probed_for_404 import URLProbedFor404 -from src.db.models.instantiations.url.checked_for_duplicate import URLCheckedForDuplicate -from src.db.models.instantiations.url.core import URL -from src.db.models.instantiations.batch import Batch -from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo -from src.core.tasks.operators.agency_identification.dtos.tdo import AgencyIdentificationTDO -from src.core.tasks.operators.submit_approved_url.tdo import SubmitApprovedURLTDO, SubmittedURLInfo -from src.core.tasks.operators.url_404_probe.tdo import URL404ProbeTDO -from src.core.tasks.operators.url_duplicate.tdo import URLDuplicateTDO -from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo -from src.core.env_var_manager import EnvVarManager -from src.core.enums import BatchStatus, SuggestionType, RecordType, SuggestedStatus from src.db.types import UserSuggestionType from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInnerInfo @@ -144,6 +146,43 @@ async def wrapper(self, *args, **kwargs): return wrapper + + @session_manager + async def execute(self, session: AsyncSession, statement): + await session.execute(statement) + + @session_manager + async def add(self, session: AsyncSession, model: Base): + session.add(model) + + @session_manager + async def add_all(self, session: AsyncSession, models: list[Base]): + session.add_all(models) + + @session_manager + async def bulk_update( + self, + session: AsyncSession, + model: Base, + mappings: list[dict] + ): + session.bulk_update_mappings(model, mappings) + + @session_manager + async def scalar(self, session: AsyncSession, statement): + return (await session.execute(statement)).scalar() + + @session_manager + async def scalars(self, session: AsyncSession, statement): + return (await session.execute(statement)).scalars() + + @session_manager + async def mapping(self, session: AsyncSession, statement): + return (await session.execute(statement)).mappings().one() + + + + # region relevant @session_manager async def add_auto_relevant_suggestion( @@ -174,14 +213,6 @@ async def get_user_suggestion( result = await session.execute(statement) return result.unique().scalar_one_or_none() - @session_manager - async def execute(self, session: AsyncSession, statement): - await session.execute(statement) - - @session_manager - async def add(self, session: AsyncSession, model: Base): - session.add(model) - @staticmethod async def get_next_url_for_user_annotation( session: AsyncSession, @@ -568,7 +599,12 @@ async def has_urls_with_html_data_and_without_auto_record_type_suggestion(self, ) @session_manager - async def get_all(self, session, model: Base, order_by_attribute: Optional[str] = None) -> list[Base]: + async def get_all( + self, + session, + model: Base, + order_by_attribute: Optional[str] = None + ) -> list[Base]: """ Get all records of a model Used primarily in testing @@ -2166,7 +2202,6 @@ async def mark_all_as_recently_probed_for_404( url_ids: List[int], dt: datetime = func.now() ): - from sqlalchemy.dialects.postgresql import insert as pg_insert values = [ {"url_id": url_id, "last_probed_at": dt} for url_id in url_ids ] @@ -2294,25 +2329,53 @@ async def get_urls_aggregated_pending_metrics( ) return result - async def last_full_agencies_sync_over_a_day_ago(self) -> bool: - pass + @session_manager + async def last_full_agencies_sync_over_a_day_ago( + self, + session: AsyncSession + ) -> bool: + query = ( + select( + AgenciesSyncState.last_full_sync_at >= func.now() - text('interval \'1 day\'') + ) + ) + synced_over_a_day_ago = (await session.execute(query)).scalar() + return synced_over_a_day_ago async def get_agencies_sync_parameters(self) -> AgencySyncParameters: - pass + query = select( + AgenciesSyncState.current_page, + AgenciesSyncState.current_cutoff_date + ) + raw_result = await self.mapping(query) + + return AgencySyncParameters( + page=raw_result['current_page'], + cutoff_date=raw_result['current_cutoff_date'] + ) async def upsert_agencies( self, agencies: list[AgenciesSyncResponseInnerInfo] ): - pass + await self.execute( + get_upsert_agencies_query(agencies) + ) async def update_agencies_sync_progress(self, page: int): query = update( AgenciesSyncState ).values( - page=page + current_page=page ) await self.execute(query) async def mark_full_agencies_sync(self): - pass + query = update( + AgenciesSyncState + ).values( + last_full_sync_at=func.now(), + current_cutoff_date=func.now() - text('interval \'1 month\''), + current_page=None + ) + await self.execute(query) diff --git a/src/db/queries/implementations/core/tasks/__init__.py b/src/db/queries/implementations/core/tasks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/queries/implementations/core/tasks/agency_sync/__init__.py b/src/db/queries/implementations/core/tasks/agency_sync/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/queries/implementations/core/tasks/agency_sync/upsert.py b/src/db/queries/implementations/core/tasks/agency_sync/upsert.py new file mode 100644 index 00000000..0e6c67b6 --- /dev/null +++ b/src/db/queries/implementations/core/tasks/agency_sync/upsert.py @@ -0,0 +1,38 @@ +from sqlalchemy.dialects.postgresql import insert as pg_insert + +from src.db.models.instantiations.sync_state_agencies import AgenciesSyncState +from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInnerInfo + + +def get_upsert_agencies_query( + agencies: list[AgenciesSyncResponseInnerInfo] +): + agency_dicts = {} + for agency in agencies: + agency_dict = { + 'agency_id': agency.agency_id, + 'name': agency.display_name, + 'state': agency.state_name, + 'county': agency.county_name, + 'locality': agency.locality_name, + 'updated_at': agency.updated_at + } + agency_dicts[agency.pdap_agency_id] = agency_dict + + stmt = ( + pg_insert(AgenciesSyncState) + .values(agency_dicts) + ) + + stmt = stmt.on_conflict_do_update( + index_elements=['agency_id'], + set_={ + 'name': stmt.excluded.name, + 'state': stmt.excluded.state, + 'county': stmt.excluded.county, + 'locality': stmt.excluded.locality, + 'updated_at': stmt.excluded.updated_at + } + ) + + return stmt \ No newline at end of file diff --git a/src/pdap_api/client.py b/src/pdap_api/client.py index 2614226d..2f1adabb 100644 --- a/src/pdap_api/client.py +++ b/src/pdap_api/client.py @@ -1,14 +1,14 @@ -from datetime import datetime from typing import Optional +from pdap_access_manager import AccessManager, DataSourcesNamespaces, RequestInfo, RequestType + from src.core.tasks.operators.agency_sync.dtos.parameters import AgencySyncParameters from src.core.tasks.operators.submit_approved_url.tdo import SubmitApprovedURLTDO, SubmittedURLInfo from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInnerInfo, AgenciesSyncResponseInfo +from src.pdap_api.dtos.match_agency.post import MatchAgencyInfo from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse from src.pdap_api.dtos.unique_url_duplicate import UniqueURLDuplicateInfo -from src.pdap_api.dtos.match_agency.post import MatchAgencyInfo from src.pdap_api.enums import MatchAgencyResponseStatus -from pdap_access_manager import AccessManager, DataSourcesNamespaces, RequestInfo, RequestType class PDAPClient: diff --git a/tests/automated/integration/tasks/agency_sync/__init__.py b/tests/automated/integration/tasks/agency_sync/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/tasks/agency_sync/conftest.py b/tests/automated/integration/tasks/agency_sync/conftest.py new file mode 100644 index 00000000..da103736 --- /dev/null +++ b/tests/automated/integration/tasks/agency_sync/conftest.py @@ -0,0 +1,24 @@ +from unittest.mock import patch + +import pytest +import pytest_asyncio + +from src.core.tasks.operators.agency_sync.core import SyncAgenciesTaskOperator +from tests.automated.integration.tasks.agency_sync.data import AGENCIES_SYNC_RESPONSES +from tests.automated.integration.tasks.agency_sync.helpers import update_existing_agencies_updated_at, \ + add_existing_agencies + +@pytest_asyncio.fixture +async def setup( + db_data_creator, + mock_pdap_client +) -> SyncAgenciesTaskOperator: + await add_existing_agencies(db_data_creator) + await update_existing_agencies_updated_at(db_data_creator) + + return SyncAgenciesTaskOperator( + adb_client=db_data_creator.adb_client, + pdap_client=mock_pdap_client + ) + + diff --git a/tests/automated/integration/tasks/agency_sync/data.py b/tests/automated/integration/tasks/agency_sync/data.py new file mode 100644 index 00000000..223e17ff --- /dev/null +++ b/tests/automated/integration/tasks/agency_sync/data.py @@ -0,0 +1,80 @@ +from datetime import datetime + +from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInfo, AgenciesSyncResponseInnerInfo + +PREEXISTING_AGENCY_1 = AgenciesSyncResponseInnerInfo( + display_name="Preexisting Agency 1", + agency_id=1, + state_name="CA", + county_name="San Francisco", + locality_name="San Francisco", + updated_at=datetime(2023, 1, 1, 0, 0, 0) +) + +PREEXISTING_AGENCY_2 = AgenciesSyncResponseInnerInfo( + display_name="Preexisting Agency 2", + agency_id=2, + state_name="NC", + county_name="NC County", + locality_name="NC City", + updated_at=datetime(2025, 10, 17, 3, 0, 0) +) + +PREEXISTING_AGENCIES = [ + PREEXISTING_AGENCY_1, + PREEXISTING_AGENCY_2 +] + +FIRST_CALL_RESPONSE = AgenciesSyncResponseInfo( + agencies=[ + AgenciesSyncResponseInnerInfo( + display_name="New Agency 1", + agency_id=1, + state_name=None, + county_name=None, + locality_name=None, + updated_at=datetime(2022, 3, 5, 7, 6, 9) + ), + AgenciesSyncResponseInnerInfo( + display_name="New Agency 2", + agency_id=2, + state_name="Ohio", + county_name=None, + locality_name=None, + updated_at=datetime(2024, 9, 5, 7, 6, 9) + ), + AgenciesSyncResponseInnerInfo( + display_name="New Agency 3", + agency_id=1, + state_name="AL", + county_name="AL County", + locality_name=None, + updated_at=datetime(2023, 12, 4, 0, 0, 0) + ), + AgenciesSyncResponseInnerInfo( + display_name="Test Agency 2", + agency_id=2, + state_name="TX", + county_name="TX County", + locality_name="TX City", + updated_at=datetime(2021, 1, 1, 0, 0, 0) + ), + PREEXISTING_AGENCY_1 + ], +) + +SECOND_CALL_RESPONSE = AgenciesSyncResponseInfo( + agencies=[ + PREEXISTING_AGENCY_2 + ] +) + +THIRD_CALL_RESPONSE = AgenciesSyncResponseInfo( + agencies=[] +) + +AGENCIES_SYNC_RESPONSES = [ + FIRST_CALL_RESPONSE, + SECOND_CALL_RESPONSE, + THIRD_CALL_RESPONSE +] \ No newline at end of file diff --git a/tests/automated/integration/tasks/agency_sync/existence_checker.py b/tests/automated/integration/tasks/agency_sync/existence_checker.py new file mode 100644 index 00000000..0cffde7f --- /dev/null +++ b/tests/automated/integration/tasks/agency_sync/existence_checker.py @@ -0,0 +1,28 @@ +from src.db.models.instantiations.agency import Agency +from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInnerInfo +from tests.automated.integration.tasks.agency_sync.data import FIRST_CALL_RESPONSE, SECOND_CALL_RESPONSE + + +class AgencyChecker: + """ + Checks if an agency matches expected values + """ + + def __init__(self): + self.dict_ = {} + for response in [FIRST_CALL_RESPONSE, SECOND_CALL_RESPONSE]: + for agency in response.agencies: + self.dict_[agency.agency_id] = agency + + def check( + self, + agency: Agency + ): + info: AgenciesSyncResponseInnerInfo = self.dict_.get( + agency.agency_id + ) + assert info.display_name == agency.name + assert info.state_name == agency.state + assert info.county_name == agency.county + assert info.locality_name == agency.locality + assert info.updated_at == agency.ds_last_updated_at \ No newline at end of file diff --git a/tests/automated/integration/tasks/agency_sync/helpers.py b/tests/automated/integration/tasks/agency_sync/helpers.py new file mode 100644 index 00000000..bc62e1a3 --- /dev/null +++ b/tests/automated/integration/tasks/agency_sync/helpers.py @@ -0,0 +1,77 @@ +from contextlib import contextmanager +from datetime import timedelta +from unittest.mock import patch + +from sqlalchemy import select, func + +from src.db.client.async_ import AsyncDatabaseClient +from src.db.models.instantiations.agency import Agency +from src.db.models.instantiations.sync_state_agencies import AgenciesSyncState +from src.pdap_api.client import PDAPClient +from tests.automated.integration.tasks.agency_sync.data import PREEXISTING_AGENCIES + + +async def check_sync_concluded( + db_client: AsyncDatabaseClient +): + current_db_datetime = await db_client.scalar( + select( + func.current_timestamp() + ) + ) + + sync_state_results = await db_client.scalar( + select( + AgenciesSyncState + ) + ) + assert sync_state_results.current_page is None + assert sync_state_results.last_full_sync_at > current_db_datetime - timedelta(minutes=5) + assert sync_state_results.current_cutoff_date > current_db_datetime - timedelta(days=2) + + updated_ats = await db_client.scalars( + select( + Agency.updated_at + ) + ) + assert all( + updated_at > current_db_datetime - timedelta(minutes=5) + for updated_at in updated_ats + ) + + +async def update_existing_agencies_updated_at(db_data_creator): + update_mappings = [] + for preexisting_agency in PREEXISTING_AGENCIES: + update_mapping = { + "agency_id": preexisting_agency.agency_id, + "updated_at": preexisting_agency.updated_at + } + update_mappings.append(update_mapping) + await db_data_creator.adb_client.bulk_update( + model=Agency, + mappings=update_mappings + ) + + +async def add_existing_agencies(db_data_creator): + agencies_to_add = [] + for preexisting_agency in PREEXISTING_AGENCIES: + agency_to_add = Agency( + name=preexisting_agency.display_name, + state=preexisting_agency.state_name, + county=preexisting_agency.county_name, + locality=preexisting_agency.locality_name, + agency_id=preexisting_agency.agency_id, + ) + agencies_to_add.append(agency_to_add) + await db_data_creator.adb_client.add_all(agencies_to_add) + +@contextmanager +def patch_sync_agencies(side_effects: list): + with patch.object( + PDAPClient, + "sync_agencies", + side_effect=side_effects + ): + yield \ No newline at end of file diff --git a/tests/automated/integration/tasks/agency_sync/test_happy_path.py b/tests/automated/integration/tasks/agency_sync/test_happy_path.py new file mode 100644 index 00000000..be1371ea --- /dev/null +++ b/tests/automated/integration/tasks/agency_sync/test_happy_path.py @@ -0,0 +1,57 @@ +from unittest.mock import patch, MagicMock, call + +import pytest + +from src.core.tasks.operators.agency_sync.core import SyncAgenciesTaskOperator +from src.core.tasks.operators.agency_sync.dtos.parameters import AgencySyncParameters +from src.db.models.instantiations.agency import Agency +from tests.automated.integration.tasks.agency_sync.data import AGENCIES_SYNC_RESPONSES +from tests.automated.integration.tasks.agency_sync.existence_checker import AgencyChecker +from tests.automated.integration.tasks.agency_sync.helpers import check_sync_concluded, patch_sync_agencies + + +@pytest.mark.asyncio +async def test_agency_sync_happy_path( + setup: SyncAgenciesTaskOperator +): + operator = setup + db_client = operator.adb_client + + assert await operator.meets_task_prerequisites() + with patch_sync_agencies(AGENCIES_SYNC_RESPONSES): + await operator.run_task(1) + mock_func: MagicMock = operator.pdap_client.sync_agencies + + mock_func.assert_has_calls( + [ + call( + params=AgencySyncParameters( + cutoff_date=None, + page=1 + ) + ), + call( + params=AgencySyncParameters( + cutoff_date=None, + page=2 + ) + ), + call( + params=AgencySyncParameters( + cutoff_date=None, + page=3 + ) + ) + ] + ) + assert not await operator.meets_task_prerequisites() + + await check_sync_concluded(db_client) + + # Check six entries in database + agencies: list[Agency] = await db_client.scalars(Agency) + assert len(agencies) == 6 + + checker = AgencyChecker() + for agency in agencies: + checker.check(agency) \ No newline at end of file diff --git a/tests/automated/integration/tasks/agency_sync/test_interruption.py b/tests/automated/integration/tasks/agency_sync/test_interruption.py new file mode 100644 index 00000000..34847bea --- /dev/null +++ b/tests/automated/integration/tasks/agency_sync/test_interruption.py @@ -0,0 +1,88 @@ +from datetime import datetime + +import pytest +from sqlalchemy import select, insert, update + +from src.core.tasks.operators.agency_sync.core import SyncAgenciesTaskOperator +from src.db.models.instantiations.agency import Agency +from src.db.models.instantiations.sync_state_agencies import AgenciesSyncState +from tests.automated.integration.tasks.agency_sync.data import AGENCIES_SYNC_RESPONSES, FIRST_CALL_RESPONSE, \ + THIRD_CALL_RESPONSE, SECOND_CALL_RESPONSE +from tests.automated.integration.tasks.agency_sync.existence_checker import AgencyChecker +from tests.automated.integration.tasks.agency_sync.helpers import patch_sync_agencies, check_sync_concluded + + +@pytest.mark.asyncio +async def test_agency_sync_interruption( + setup: SyncAgenciesTaskOperator +): + """ + Simulate interruption that causes it to stop on the second iteration. + Should be able to resume where it left off. + """ + operator = setup + db_client = operator.adb_client + + + + with patch_sync_agencies( + [FIRST_CALL_RESPONSE, ValueError("test error")] + ): + await operator.run_task(1) + + assert await operator.meets_task_prerequisites() + + # Get current updated_ats from database for the 5 recently updated + query = ( + select( + Agency.updated_at + ).order_by( + Agency.updated_at.desc() + ).limit(5) + ) + updated_ats = await db_client.scalars(query) + # Assert all have same value + assert all( + updated_at == updated_ats[0] + for updated_at in updated_ats + ) + initial_updated_at = updated_ats[0] + + # Check sync state results + sync_state_results = await db_client.scalar( + select( + AgenciesSyncState + ) + ) + assert sync_state_results.current_page == 1 + assert sync_state_results.last_full_sync_at is None + assert sync_state_results.current_cutoff_date is None + + with patch_sync_agencies([SECOND_CALL_RESPONSE, THIRD_CALL_RESPONSE]): + await operator.run_task(2) + assert not await operator.meets_task_prerequisites() + + + await check_sync_concluded(db_client) + + # Check six entries in database + agencies: list[Agency] = await db_client.scalars(( + select( + Agency + ).order_by( + Agency.updated_at + ) + )) + assert len(agencies) == 6 + + checker = AgencyChecker() + for agency in agencies: + checker.check(agency) + + # Check newly updated agency has distinct updated_at value + assert agencies[-1].updated_at != initial_updated_at + # Check other agencies have same updated_at value + assert all( + agency.updated_at == initial_updated_at + for agency in agencies[:-1] + ) \ No newline at end of file diff --git a/tests/automated/integration/tasks/agency_sync/test_no_new_results.py b/tests/automated/integration/tasks/agency_sync/test_no_new_results.py new file mode 100644 index 00000000..254030c2 --- /dev/null +++ b/tests/automated/integration/tasks/agency_sync/test_no_new_results.py @@ -0,0 +1,55 @@ +from datetime import datetime +from unittest.mock import MagicMock + +import pytest +from sqlalchemy import update + +from src.core.tasks.operators.agency_sync.core import SyncAgenciesTaskOperator +from src.core.tasks.operators.agency_sync.dtos.parameters import AgencySyncParameters +from src.db.models.instantiations.agency import Agency +from src.db.models.instantiations.sync_state_agencies import AgenciesSyncState +from tests.automated.integration.tasks.agency_sync.data import THIRD_CALL_RESPONSE +from tests.automated.integration.tasks.agency_sync.existence_checker import AgencyChecker +from tests.automated.integration.tasks.agency_sync.helpers import patch_sync_agencies, check_sync_concluded + + +@pytest.mark.asyncio +async def test_agency_sync_task_no_new_results( + setup: SyncAgenciesTaskOperator +): + operator = setup + db_client = operator.adb_client + + cutoff_date = datetime(2025, 5, 1).date() + + # Add cutoff date to database + await db_client.execute( + update(AgenciesSyncState).values( + current_cutoff_date=cutoff_date + ) + ) + + with patch_sync_agencies([THIRD_CALL_RESPONSE]): + await operator.run_task(1) + mock_func: MagicMock = operator.pdap_client.sync_agencies + mock_func.assert_called_once_with( + params=AgencySyncParameters( + cutoff_date=cutoff_date, + page=1 + ) + ) + + + assert not await operator.meets_task_prerequisites() + + await check_sync_concluded(db_client) + + # Check two entries in database + agencies: list[Agency] = await db_client.scalars(Agency) + assert len(agencies) == 2 + + # Neither should be updated with new values + checker = AgencyChecker() + for agency in agencies: + with pytest.raises(AssertionError): + checker.check(agency) \ No newline at end of file From a8fe5754cbc64051eee7df26dabb85db333f8e31 Mon Sep 17 00:00:00 2001 From: maxachis Date: Thu, 19 Jun 2025 09:05:20 -0400 Subject: [PATCH 229/244] Continue draft on agencies sync logic --- alembic/env.py | 1 + ...0922-fb199cf58ecd_update_agencies_table.py | 13 +++++-- src/db/client/async_.py | 36 +++++++++++++------ .../integration/tasks/agency_sync/helpers.py | 2 +- .../tasks/agency_sync/test_no_new_results.py | 4 ++- tests/conftest.py | 2 ++ tests/helpers/alembic_runner.py | 1 - tests/helpers/assert_functions.py | 9 +++-- 8 files changed, 48 insertions(+), 20 deletions(-) diff --git a/alembic/env.py b/alembic/env.py index 7c6f0293..3d305e32 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -1,3 +1,4 @@ +import logging from datetime import datetime from logging.config import fileConfig diff --git a/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py b/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py index 9556aee9..f1879b39 100644 --- a/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py +++ b/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py @@ -31,7 +31,7 @@ def upgrade() -> None: sa.Column('ds_last_updated_at', sa.DateTime(), nullable=True) ) - op.create_table( + table = op.create_table( 'agencies_sync_state', id_column(), sa.Column('last_full_sync_at', sa.DateTime(), nullable=True), @@ -40,7 +40,16 @@ def upgrade() -> None: ) # Add row to `agencies_sync_state` table - op.execute('INSERT INTO agencies_sync_state (last_full_sync_at, current_cutoff_date, current_page) VALUES (null, null, null)') + op.bulk_insert( + table, + [ + { + "last_full_sync_at": None, + "current_cutoff_date": None, + "current_page": None + } + ] + ) # Add 'Sync Agencies' to TaskType Enum switch_enum_type( diff --git a/src/db/client/async_.py b/src/db/client/async_.py index e1ffd20c..e15bccf5 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -4,10 +4,10 @@ from typing import Optional, Type, Any, List from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, Select, not_, and_, update, delete, literal, text +from sqlalchemy import select, exists, func, case, Select, not_, and_, update, delete, literal, text, bindparam from sqlalchemy.dialects import postgresql from sqlalchemy.dialects.postgresql import insert as pg_insert -from sqlalchemy.exc import IntegrityError +from sqlalchemy.exc import IntegrityError, NoResultFound from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import selectinload, joinedload, QueryableAttribute, aliased from sqlalchemy.sql.functions import coalesce @@ -164,9 +164,14 @@ async def bulk_update( self, session: AsyncSession, model: Base, - mappings: list[dict] + mappings: list[dict], ): - session.bulk_update_mappings(model, mappings) + # Note, mapping must include primary key + await session.execute( + update(model), + mappings + ) + @session_manager async def scalar(self, session: AsyncSession, statement): @@ -2342,17 +2347,28 @@ async def last_full_agencies_sync_over_a_day_ago( synced_over_a_day_ago = (await session.execute(query)).scalar() return synced_over_a_day_ago - async def get_agencies_sync_parameters(self) -> AgencySyncParameters: + @session_manager + async def get_agencies_sync_parameters( + self, + session: AsyncSession + ) -> AgencySyncParameters: query = select( AgenciesSyncState.current_page, AgenciesSyncState.current_cutoff_date ) - raw_result = await self.mapping(query) + try: + result = (await session.execute(query)).mappings().one() + return AgencySyncParameters( + page=result['current_page'], + cutoff_date=result['current_cutoff_date'] + ) + except NoResultFound: + # Add value + state = AgenciesSyncState() + session.add(state) + return AgencySyncParameters(page=None, cutoff_date=None) + - return AgencySyncParameters( - page=raw_result['current_page'], - cutoff_date=raw_result['current_cutoff_date'] - ) async def upsert_agencies( self, diff --git a/tests/automated/integration/tasks/agency_sync/helpers.py b/tests/automated/integration/tasks/agency_sync/helpers.py index bc62e1a3..61a92814 100644 --- a/tests/automated/integration/tasks/agency_sync/helpers.py +++ b/tests/automated/integration/tasks/agency_sync/helpers.py @@ -50,7 +50,7 @@ async def update_existing_agencies_updated_at(db_data_creator): update_mappings.append(update_mapping) await db_data_creator.adb_client.bulk_update( model=Agency, - mappings=update_mappings + mappings=update_mappings, ) diff --git a/tests/automated/integration/tasks/agency_sync/test_no_new_results.py b/tests/automated/integration/tasks/agency_sync/test_no_new_results.py index 254030c2..03839f39 100644 --- a/tests/automated/integration/tasks/agency_sync/test_no_new_results.py +++ b/tests/automated/integration/tasks/agency_sync/test_no_new_results.py @@ -11,6 +11,7 @@ from tests.automated.integration.tasks.agency_sync.data import THIRD_CALL_RESPONSE from tests.automated.integration.tasks.agency_sync.existence_checker import AgencyChecker from tests.automated.integration.tasks.agency_sync.helpers import patch_sync_agencies, check_sync_concluded +from tests.helpers.assert_functions import assert_task_run_success @pytest.mark.asyncio @@ -30,7 +31,8 @@ async def test_agency_sync_task_no_new_results( ) with patch_sync_agencies([THIRD_CALL_RESPONSE]): - await operator.run_task(1) + run_info = await operator.run_task(1) + assert_task_run_success(run_info) mock_func: MagicMock = operator.pdap_client.sync_agencies mock_func.assert_called_once_with( params=AgencySyncParameters( diff --git a/tests/conftest.py b/tests/conftest.py index 3bdcb79e..294ceb19 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,3 +1,4 @@ +import logging from typing import Any, Generator import pytest @@ -17,6 +18,7 @@ @pytest.fixture(autouse=True, scope="session") def setup_and_teardown(): + logging.disable(logging.INFO) # Set up environment variables that must be defined # outside of tests required_env_vars: dict = load_from_environment( diff --git a/tests/helpers/alembic_runner.py b/tests/helpers/alembic_runner.py index cb435d5a..53458109 100644 --- a/tests/helpers/alembic_runner.py +++ b/tests/helpers/alembic_runner.py @@ -24,7 +24,6 @@ def upgrade(self, revision: str): self.reflect() def downgrade(self, revision: str): - print("Downgrading...") command.downgrade(self.alembic_config, revision) def stamp(self, revision: str): diff --git a/tests/helpers/assert_functions.py b/tests/helpers/assert_functions.py index 54eeaf1e..ecdb4c36 100644 --- a/tests/helpers/assert_functions.py +++ b/tests/helpers/assert_functions.py @@ -1,7 +1,6 @@ -from src.db.client import async_ -from src.db.models import Task +from src.core.tasks.dtos.run_info import TaskOperatorRunInfo +from src.core.tasks.enums import TaskOperatorOutcome -async def assert_database_has_no_tasks(adb_client: AsyncDatabaseClient): - tasks = await adb_client.get_all(Task) - assert len(tasks) == 0 \ No newline at end of file +def assert_task_run_success(run_info: TaskOperatorRunInfo): + assert run_info.outcome == TaskOperatorOutcome.SUCCESS, run_info.message \ No newline at end of file From ed28c3b1c901a51ad8493b681d0cf69d81003096 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 23 Jun 2025 10:32:20 -0400 Subject: [PATCH 230/244] Set up agencies sync task --- ...0922-fb199cf58ecd_update_agencies_table.py | 17 ++ local_database/DockerInfos.py | 2 +- pytest.ini | 2 +- .../annotate/dtos/record_type/response.py | 10 +- .../annotate/dtos/shared/base/response.py | 2 +- src/api/endpoints/review/dtos/get.py | 3 +- src/api/main.py | 60 +++-- src/core/core.py | 13 +- src/core/helpers.py | 2 +- src/core/tasks/README.md | 4 - .../tasks/{operators => base}/__init__.py | 0 .../{operators/base.py => base/operator.py} | 39 +--- src/core/tasks/base/run_info.py | 13 ++ src/core/tasks/dtos/run_info.py | 8 +- src/core/tasks/handler.py | 61 +++++ src/core/tasks/manager.py | 209 ------------------ src/core/tasks/scheduled/README.md | 2 + .../__init__.py | 0 src/core/tasks/scheduled/loader.py | 23 ++ .../scheduled/manager.py} | 41 +++- .../dtos => scheduled/operators}/__init__.py | 0 .../operators/agency_sync/__init__.py | 0 .../operators/agency_sync/constants.py | 0 .../operators/agency_sync/core.py | 22 +- .../operators/agency_sync/dtos/__init__.py | 0 .../operators/agency_sync/dtos/parameters.py | 0 .../operators/agency_sync/exceptions.py | 0 src/core/tasks/scheduled/operators/base.py | 32 +++ src/core/tasks/url/README.md | 9 + .../record_type => url}/__init__.py | 0 src/core/tasks/{ => url}/enums.py | 0 src/core/tasks/url/loader.py | 98 ++++++++ src/core/tasks/url/manager.py | 75 +++++++ .../llm_api => url/operators}/__init__.py | 0 .../agency_identification}/__init__.py | 0 .../operators/agency_identification/core.py | 18 +- .../agency_identification/dtos}/__init__.py | 0 .../agency_identification/dtos/suggestion.py | 0 .../agency_identification/dtos/tdo.py | 0 src/core/tasks/url/operators/base.py | 61 +++++ .../operators/record_type}/__init__.py | 0 .../{ => url}/operators/record_type/core.py | 8 +- .../record_type/llm_api}/__init__.py | 0 .../record_type/llm_api/constants.py | 0 .../record_type/llm_api/dtos}/__init__.py | 0 .../dtos/record_type_structured_output.py | 0 .../operators/record_type/llm_api/helpers.py | 0 .../llm_api/record_classifier}/__init__.py | 0 .../llm_api/record_classifier/base.py | 7 +- .../llm_api/record_classifier/deepseek.py | 2 +- .../llm_api/record_classifier/openai.py | 5 +- .../{ => url}/operators/record_type/tdo.py | 0 .../submit_approved_url}/__init__.py | 0 .../operators/submit_approved_url/core.py | 6 +- .../operators/submit_approved_url/tdo.py | 0 .../operators/url_404_probe}/__init__.py | 0 .../{ => url}/operators/url_404_probe/core.py | 8 +- .../{ => url}/operators/url_404_probe/tdo.py | 0 .../operators/url_duplicate}/__init__.py | 0 .../{ => url}/operators/url_duplicate/core.py | 6 +- .../{ => url}/operators/url_duplicate/tdo.py | 0 .../operators/url_html}/__init__.py | 0 .../operators/url_html/content_info_getter.py | 2 +- .../{ => url}/operators/url_html/core.py | 12 +- .../operators/url_html/scraper/README.md | 0 .../operators/url_html/scraper}/__init__.py | 0 .../url_html/scraper/parser}/__init__.py | 0 .../url_html/scraper/parser/constants.py | 0 .../operators/url_html/scraper/parser/core.py | 10 +- .../url_html/scraper/parser}/dtos/__init__.py | 0 .../scraper/parser/dtos/response_html.py | 0 .../url_html/scraper/parser/enums.py | 0 .../url_html/scraper/parser/mapping.py | 0 .../operators/url_html/scraper/parser/util.py | 4 +- .../scraper/request_interface}/__init__.py | 0 .../scraper/request_interface/constants.py | 0 .../scraper/request_interface/core.py | 6 +- .../request_interface/dtos}/__init__.py | 0 .../dtos/request_resources.py | 2 +- .../request_interface/dtos/url_response.py | 0 .../scraper/root_url_cache}/__init__.py | 0 .../scraper/root_url_cache/constants.py | 0 .../url_html/scraper/root_url_cache/core.py | 4 +- .../scraper/root_url_cache/dtos}/__init__.py | 0 .../scraper/root_url_cache/dtos/response.py | 0 .../tasks/{ => url}/operators/url_html/tdo.py | 4 +- .../url_miscellaneous_metadata/__init__.py | 0 .../url_miscellaneous_metadata/core.py | 14 +- .../url_miscellaneous_metadata/tdo.py | 0 src/core/tasks/url/subtasks/__init__.py | 0 .../agency_identification/__init__.py | 0 .../agency_identification/auto_googler.py | 4 +- .../subtasks/agency_identification/base.py | 2 +- .../subtasks/agency_identification/ckan.py | 2 +- .../agency_identification/common_crawler.py | 2 +- .../agency_identification/muckrock.py | 2 +- .../miscellaneous_metadata/__init__.py | 0 .../miscellaneous_metadata/auto_googler.py | 4 +- .../subtasks/miscellaneous_metadata/base.py | 2 +- .../subtasks/miscellaneous_metadata/ckan.py | 4 +- .../miscellaneous_metadata/muckrock.py | 4 +- src/db/client/async_.py | 80 ++++--- src/db/client/sync.py | 2 +- src/db/config_manager.py | 2 +- src/db/dto_converter.py | 4 +- .../implementations/core/final_review/get.py | 10 +- .../core/tasks/agency_sync/upsert.py | 31 +-- src/pdap_api/client.py | 4 +- start_mirrored_local_app.py | 2 +- .../integration/api/test_annotate.py | 2 +- tests/automated/integration/api/test_task.py | 2 +- .../integration/core/async_/__init__.py | 0 .../core/async_/conclude_task/__init__.py | 0 .../core/async_/conclude_task/conftest.py | 18 ++ .../core/async_/conclude_task/helpers.py | 19 ++ .../core/async_/conclude_task/setup_info.py | 9 + .../core/async_/conclude_task/test_error.py | 32 +++ .../core/async_/conclude_task/test_success.py | 31 +++ .../integration/core/async_/helpers.py | 20 ++ .../core/async_/run_task/__init__.py | 0 .../core/async_/run_task/test_break_loop.py | 43 ++++ .../core/async_/run_task/test_prereq_met.py | 51 +++++ .../async_/run_task/test_prereq_not_met.py | 21 ++ .../integration/core/test_async_core.py | 176 --------------- .../integration/db/test_database_structure.py | 2 +- .../html_tag_collector/test_root_url_cache.py | 4 +- .../integration/tasks/agency_sync/conftest.py | 6 +- .../integration/tasks/agency_sync/data.py | 16 +- .../integration/tasks/agency_sync/helpers.py | 12 +- .../tasks/agency_sync/test_happy_path.py | 21 +- .../tasks/agency_sync/test_interruption.py | 18 +- .../tasks/agency_sync/test_no_new_results.py | 23 +- .../tasks/test_agency_preannotation_task.py | 14 +- .../integration/tasks/test_example_task.py | 6 +- .../tasks/test_submit_approved_url_task.py | 4 +- .../integration/tasks/test_url_404_probe.py | 8 +- .../tasks/test_url_duplicate_task.py | 4 +- .../integration/tasks/test_url_html_task.py | 14 +- .../test_url_miscellaneous_metadata_task.py | 4 +- .../tasks/test_url_record_type_task.py | 6 +- tests/helpers/assert_functions.py | 4 +- tests/helpers/db_data_creator.py | 6 +- .../core/tasks/test_url_html_task_operator.py | 8 +- .../test_html_tag_collector_integration.py | 8 +- .../test_deepseek_record_classifier.py | 2 +- .../test_openai_record_classifier.py | 2 +- .../manual/pdap_client/test_sync_agencies.py | 2 +- 147 files changed, 990 insertions(+), 715 deletions(-) delete mode 100644 src/core/tasks/README.md rename src/core/tasks/{operators => base}/__init__.py (100%) rename src/core/tasks/{operators/base.py => base/operator.py} (62%) create mode 100644 src/core/tasks/base/run_info.py create mode 100644 src/core/tasks/handler.py delete mode 100644 src/core/tasks/manager.py create mode 100644 src/core/tasks/scheduled/README.md rename src/core/tasks/{operators/agency_identification => scheduled}/__init__.py (100%) create mode 100644 src/core/tasks/scheduled/loader.py rename src/core/{scheduled_task_manager.py => tasks/scheduled/manager.py} (51%) rename src/core/tasks/{operators/agency_identification/dtos => scheduled/operators}/__init__.py (100%) rename src/core/tasks/{ => scheduled}/operators/agency_sync/__init__.py (100%) rename src/core/tasks/{ => scheduled}/operators/agency_sync/constants.py (100%) rename src/core/tasks/{ => scheduled}/operators/agency_sync/core.py (64%) rename src/core/tasks/{ => scheduled}/operators/agency_sync/dtos/__init__.py (100%) rename src/core/tasks/{ => scheduled}/operators/agency_sync/dtos/parameters.py (100%) rename src/core/tasks/{ => scheduled}/operators/agency_sync/exceptions.py (100%) create mode 100644 src/core/tasks/scheduled/operators/base.py create mode 100644 src/core/tasks/url/README.md rename src/core/tasks/{operators/record_type => url}/__init__.py (100%) rename src/core/tasks/{ => url}/enums.py (100%) create mode 100644 src/core/tasks/url/loader.py create mode 100644 src/core/tasks/url/manager.py rename src/core/tasks/{operators/record_type/llm_api => url/operators}/__init__.py (100%) rename src/core/tasks/{operators/record_type/llm_api/dtos => url/operators/agency_identification}/__init__.py (100%) rename src/core/tasks/{ => url}/operators/agency_identification/core.py (84%) rename src/core/tasks/{operators/record_type/llm_api/record_classifier => url/operators/agency_identification/dtos}/__init__.py (100%) rename src/core/tasks/{ => url}/operators/agency_identification/dtos/suggestion.py (100%) rename src/core/tasks/{ => url}/operators/agency_identification/dtos/tdo.py (100%) create mode 100644 src/core/tasks/url/operators/base.py rename src/core/tasks/{operators/submit_approved_url => url/operators/record_type}/__init__.py (100%) rename src/core/tasks/{ => url}/operators/record_type/core.py (90%) rename src/core/tasks/{operators/url_404_probe => url/operators/record_type/llm_api}/__init__.py (100%) rename src/core/tasks/{ => url}/operators/record_type/llm_api/constants.py (100%) rename src/core/tasks/{operators/url_duplicate => url/operators/record_type/llm_api/dtos}/__init__.py (100%) rename src/core/tasks/{ => url}/operators/record_type/llm_api/dtos/record_type_structured_output.py (100%) rename src/core/tasks/{ => url}/operators/record_type/llm_api/helpers.py (100%) rename src/core/tasks/{operators/url_html => url/operators/record_type/llm_api/record_classifier}/__init__.py (100%) rename src/core/tasks/{ => url}/operators/record_type/llm_api/record_classifier/base.py (85%) rename src/core/tasks/{ => url}/operators/record_type/llm_api/record_classifier/deepseek.py (83%) rename src/core/tasks/{ => url}/operators/record_type/llm_api/record_classifier/openai.py (77%) rename src/core/tasks/{ => url}/operators/record_type/tdo.py (100%) rename src/core/tasks/{operators/url_html/scraper => url/operators/submit_approved_url}/__init__.py (100%) rename src/core/tasks/{ => url}/operators/submit_approved_url/core.py (91%) rename src/core/tasks/{ => url}/operators/submit_approved_url/tdo.py (100%) rename src/core/tasks/{operators/url_html/scraper/parser => url/operators/url_404_probe}/__init__.py (100%) rename src/core/tasks/{ => url}/operators/url_404_probe/core.py (87%) rename src/core/tasks/{ => url}/operators/url_404_probe/tdo.py (100%) rename src/core/tasks/{operators/url_html/scraper/parser/dtos => url/operators/url_duplicate}/__init__.py (100%) rename src/core/tasks/{ => url}/operators/url_duplicate/core.py (88%) rename src/core/tasks/{ => url}/operators/url_duplicate/tdo.py (100%) rename src/core/tasks/{operators/url_html/scraper/request_interface => url/operators/url_html}/__init__.py (100%) rename src/core/tasks/{ => url}/operators/url_html/content_info_getter.py (90%) rename src/core/tasks/{ => url}/operators/url_html/core.py (91%) rename src/core/tasks/{ => url}/operators/url_html/scraper/README.md (100%) rename src/core/tasks/{operators/url_html/scraper/request_interface/dtos => url/operators/url_html/scraper}/__init__.py (100%) rename src/core/tasks/{operators/url_html/scraper/root_url_cache => url/operators/url_html/scraper/parser}/__init__.py (100%) rename src/core/tasks/{ => url}/operators/url_html/scraper/parser/constants.py (100%) rename src/core/tasks/{ => url}/operators/url_html/scraper/parser/core.py (89%) rename src/core/tasks/{operators/url_html/scraper/root_url_cache => url/operators/url_html/scraper/parser}/dtos/__init__.py (100%) rename src/core/tasks/{ => url}/operators/url_html/scraper/parser/dtos/response_html.py (100%) rename src/core/tasks/{ => url}/operators/url_html/scraper/parser/enums.py (100%) rename src/core/tasks/{ => url}/operators/url_html/scraper/parser/mapping.py (100%) rename src/core/tasks/{ => url}/operators/url_html/scraper/parser/util.py (84%) rename src/core/tasks/{operators/url_miscellaneous_metadata => url/operators/url_html/scraper/request_interface}/__init__.py (100%) rename src/core/tasks/{ => url}/operators/url_html/scraper/request_interface/constants.py (100%) rename src/core/tasks/{ => url}/operators/url_html/scraper/request_interface/core.py (90%) rename src/core/tasks/{subtasks => url/operators/url_html/scraper/request_interface/dtos}/__init__.py (100%) rename src/core/tasks/{ => url}/operators/url_html/scraper/request_interface/dtos/request_resources.py (74%) rename src/core/tasks/{ => url}/operators/url_html/scraper/request_interface/dtos/url_response.py (100%) rename src/core/tasks/{subtasks/agency_identification => url/operators/url_html/scraper/root_url_cache}/__init__.py (100%) rename src/core/tasks/{ => url}/operators/url_html/scraper/root_url_cache/constants.py (100%) rename src/core/tasks/{ => url}/operators/url_html/scraper/root_url_cache/core.py (92%) rename src/core/tasks/{subtasks/miscellaneous_metadata => url/operators/url_html/scraper/root_url_cache/dtos}/__init__.py (100%) rename src/core/tasks/{ => url}/operators/url_html/scraper/root_url_cache/dtos/response.py (100%) rename src/core/tasks/{ => url}/operators/url_html/tdo.py (55%) create mode 100644 src/core/tasks/url/operators/url_miscellaneous_metadata/__init__.py rename src/core/tasks/{ => url}/operators/url_miscellaneous_metadata/core.py (80%) rename src/core/tasks/{ => url}/operators/url_miscellaneous_metadata/tdo.py (100%) create mode 100644 src/core/tasks/url/subtasks/__init__.py create mode 100644 src/core/tasks/url/subtasks/agency_identification/__init__.py rename src/core/tasks/{ => url}/subtasks/agency_identification/auto_googler.py (75%) rename src/core/tasks/{ => url}/subtasks/agency_identification/base.py (75%) rename src/core/tasks/{ => url}/subtasks/agency_identification/ckan.py (89%) rename src/core/tasks/{ => url}/subtasks/agency_identification/common_crawler.py (85%) rename src/core/tasks/{ => url}/subtasks/agency_identification/muckrock.py (94%) create mode 100644 src/core/tasks/url/subtasks/miscellaneous_metadata/__init__.py rename src/core/tasks/{ => url}/subtasks/miscellaneous_metadata/auto_googler.py (62%) rename src/core/tasks/{ => url}/subtasks/miscellaneous_metadata/base.py (66%) rename src/core/tasks/{ => url}/subtasks/miscellaneous_metadata/ckan.py (74%) rename src/core/tasks/{ => url}/subtasks/miscellaneous_metadata/muckrock.py (61%) create mode 100644 tests/automated/integration/core/async_/__init__.py create mode 100644 tests/automated/integration/core/async_/conclude_task/__init__.py create mode 100644 tests/automated/integration/core/async_/conclude_task/conftest.py create mode 100644 tests/automated/integration/core/async_/conclude_task/helpers.py create mode 100644 tests/automated/integration/core/async_/conclude_task/setup_info.py create mode 100644 tests/automated/integration/core/async_/conclude_task/test_error.py create mode 100644 tests/automated/integration/core/async_/conclude_task/test_success.py create mode 100644 tests/automated/integration/core/async_/helpers.py create mode 100644 tests/automated/integration/core/async_/run_task/__init__.py create mode 100644 tests/automated/integration/core/async_/run_task/test_break_loop.py create mode 100644 tests/automated/integration/core/async_/run_task/test_prereq_met.py create mode 100644 tests/automated/integration/core/async_/run_task/test_prereq_not_met.py delete mode 100644 tests/automated/integration/core/test_async_core.py diff --git a/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py b/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py index f1879b39..48a55bc7 100644 --- a/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py +++ b/alembic/versions/2025_06_16_0922-fb199cf58ecd_update_agencies_table.py @@ -26,6 +26,23 @@ def upgrade() -> None: created_at_column() ) + # Add trigger for updated_at to update on any change + op.execute(""" + CREATE OR REPLACE FUNCTION update_updated_at_column() + RETURNS TRIGGER AS $$ + BEGIN + NEW.updated_at = CURRENT_TIMESTAMP; + RETURN NEW; + END; + $$ LANGUAGE plpgsql; + """) + op.execute(""" + CREATE TRIGGER set_updated_at + BEFORE UPDATE ON agencies + FOR EACH ROW + EXECUTE FUNCTION update_updated_at_column(); + """) + op.add_column( AGENCIES_TABLE_NAME, sa.Column('ds_last_updated_at', sa.DateTime(), nullable=True) diff --git a/local_database/DockerInfos.py b/local_database/DockerInfos.py index ad7228fb..654b59bc 100644 --- a/local_database/DockerInfos.py +++ b/local_database/DockerInfos.py @@ -1,5 +1,5 @@ from local_database.DTOs import DockerInfo, DockerfileInfo, HealthCheckInfo, VolumeInfo -from src.util import get_from_env, project_path +from src.util.helper_functions import project_path, get_from_env def get_database_docker_info() -> DockerInfo: diff --git a/pytest.ini b/pytest.ini index 8f6981ae..ceaa093c 100644 --- a/pytest.ini +++ b/pytest.ini @@ -2,4 +2,4 @@ timeout = 300 asyncio_default_fixture_loop_scope=function markers = - manual: mark test as manual-only (excluded from default test runs) \ No newline at end of file + manual: mark test as manual-only (excluded from default test runs) diff --git a/src/api/endpoints/annotate/dtos/record_type/response.py b/src/api/endpoints/annotate/dtos/record_type/response.py index 7862d477..d46c8e12 100644 --- a/src/api/endpoints/annotate/dtos/record_type/response.py +++ b/src/api/endpoints/annotate/dtos/record_type/response.py @@ -3,15 +3,17 @@ from pydantic import Field, BaseModel from src.api.endpoints.annotate.dtos.shared.base.response import AnnotationInnerResponseInfoBase -from src.db.dtos.url_mapping import URLMapping from src.core.enums import RecordType -from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo -class GetNextRecordTypeAnnotationResponseInfo(AnnotationInnerResponseInfoBase): +class GetNextRecordTypeAnnotationResponseInfo( + AnnotationInnerResponseInfoBase +): suggested_record_type: Optional[RecordType] = Field( title="What record type, if any, the auto-labeler identified the URL as" ) -class GetNextRecordTypeAnnotationResponseOuterInfo(BaseModel): +class GetNextRecordTypeAnnotationResponseOuterInfo( + BaseModel +): next_annotation: Optional[GetNextRecordTypeAnnotationResponseInfo] diff --git a/src/api/endpoints/annotate/dtos/shared/base/response.py b/src/api/endpoints/annotate/dtos/shared/base/response.py index 7cd0c35d..11f8fdc7 100644 --- a/src/api/endpoints/annotate/dtos/shared/base/response.py +++ b/src/api/endpoints/annotate/dtos/shared/base/response.py @@ -3,7 +3,7 @@ from pydantic import BaseModel, Field from src.api.endpoints.annotate.dtos.shared.batch import AnnotationBatchInfo -from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo from src.db.dtos.url_mapping import URLMapping diff --git a/src/api/endpoints/review/dtos/get.py b/src/api/endpoints/review/dtos/get.py index 09b035b5..5fa969dc 100644 --- a/src/api/endpoints/review/dtos/get.py +++ b/src/api/endpoints/review/dtos/get.py @@ -4,7 +4,8 @@ from src.api.endpoints.annotate.dtos.agency.response import GetNextURLForAgencyAgencyInfo from src.core.enums import RecordType, SuggestedStatus -from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo + class FinalReviewAnnotationRelevantInfo(BaseModel): auto: Optional[bool] = Field(title="Whether the auto-labeler has marked the URL as relevant") diff --git a/src/api/main.py b/src/api/main.py index db5ce1ee..54fd6ae9 100644 --- a/src/api/main.py +++ b/src/api/main.py @@ -21,13 +21,16 @@ from src.core.core import AsyncCore from src.core.logger import AsyncCoreLogger from src.core.env_var_manager import EnvVarManager -from src.core.scheduled_task_manager import AsyncScheduledTaskManager -from src.core.tasks.manager import TaskManager -from src.core.tasks.operators.url_html.scraper.parser.core import HTMLResponseParser -from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface +from src.core.tasks.handler import TaskHandler +from src.core.tasks.scheduled.loader import ScheduledTaskOperatorLoader +from src.core.tasks.scheduled.manager import AsyncScheduledTaskManager +from src.core.tasks.url.loader import URLTaskOperatorLoader +from src.core.tasks.url.manager import TaskManager +from src.core.tasks.url.operators.url_html.scraper.parser.core import HTMLResponseParser +from src.core.tasks.url.operators.url_html.scraper.request_interface.core import URLRequestInterface from src.db.client.async_ import AsyncDatabaseClient from src.db.client.sync import DatabaseClient -from src.core.tasks.operators.url_html.scraper.root_url_cache.core import RootURLCache +from src.core.tasks.url.operators.url_html.scraper.root_url_cache.core import RootURLCache from src.pdap_api.client import PDAPClient @@ -47,26 +50,35 @@ async def lifespan(app: FastAPI): session = aiohttp.ClientSession() - task_manager = TaskManager( + task_handler = TaskHandler( adb_client=adb_client, - url_request_interface=URLRequestInterface(), - html_parser=HTMLResponseParser( - root_url_cache=RootURLCache() - ), discord_poster=DiscordPoster( webhook_url=env_var_manager.discord_webhook_url - ), - pdap_client=PDAPClient( - access_manager=AccessManager( - email=env_var_manager.pdap_email, - password=env_var_manager.pdap_password, - api_key=env_var_manager.pdap_api_key, + ) + ) + pdap_client = PDAPClient( + access_manager=AccessManager( + data_sources_url=env_var_manager.pdap_api_url, + email=env_var_manager.pdap_email, + password=env_var_manager.pdap_password, + api_key=env_var_manager.pdap_api_key, + session=session + ) + ) + + task_manager = TaskManager( + handler=task_handler, + loader=URLTaskOperatorLoader( + adb_client=adb_client, + url_request_interface=URLRequestInterface(), + html_parser=HTMLResponseParser( + root_url_cache=RootURLCache() + ), + pdap_client=pdap_client, + muckrock_api_interface=MuckrockAPIInterface( session=session ) ), - muckrock_api_interface=MuckrockAPIInterface( - session=session - ) ) async_collector_manager = AsyncCollectorManager( logger=core_logger, @@ -79,7 +91,15 @@ async def lifespan(app: FastAPI): task_manager=task_manager, collector_manager=async_collector_manager ) - async_scheduled_task_manager = AsyncScheduledTaskManager(async_core=async_core) + async_scheduled_task_manager = AsyncScheduledTaskManager( + async_core=async_core, + handler=task_handler, + loader=ScheduledTaskOperatorLoader( + adb_client=adb_client, + pdap_client=pdap_client + ) + ) + await async_scheduled_task_manager.setup() # Pass dependencies into the app state app.state.async_core = async_core diff --git a/src/core/core.py b/src/core/core.py index 06854c59..4ce2c76f 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -31,6 +31,7 @@ from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewOuterResponse from src.api.endpoints.review.enums import RejectionReason from src.api.endpoints.search.dtos.response import SearchURLResponse +from src.api.endpoints.task.dtos.get.task import TaskInfo from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse from src.api.endpoints.url.dtos.response import GetURLsResponseInfo from src.db.client.async_ import AsyncDatabaseClient @@ -39,7 +40,7 @@ from src.db.enums import TaskType from src.collectors.manager import AsyncCollectorManager from src.collectors.enums import CollectorType -from src.core.tasks.manager import TaskManager +from src.core.tasks.url.manager import TaskManager from src.core.error_manager.core import ErrorManager from src.core.enums import BatchStatus, RecordType, AnnotationType, SuggestedStatus @@ -141,7 +142,7 @@ async def initiate_collector( # endregion async def get_current_task_status(self) -> GetTaskStatusResponseInfo: - return GetTaskStatusResponseInfo(status=self.task_manager.task_status) + return GetTaskStatusResponseInfo(status=self.task_manager.manager_status) async def run_tasks(self): await self.task_manager.trigger_task_run() @@ -152,14 +153,16 @@ async def get_tasks( task_type: TaskType, task_status: BatchStatus ) -> GetTasksResponse: - return await self.task_manager.get_tasks( + return await self.adb_client.get_tasks( page=page, task_type=task_type, task_status=task_status ) - async def get_task_info(self, task_id): - return await self.task_manager.get_task_info(task_id) + + async def get_task_info(self, task_id: int) -> TaskInfo: + return await self.adb_client.get_task_info(task_id=task_id) + #region Annotations and Review diff --git a/src/core/helpers.py b/src/core/helpers.py index eb90f597..cc513a0a 100644 --- a/src/core/helpers.py +++ b/src/core/helpers.py @@ -1,6 +1,6 @@ -from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.enums import SuggestionType from src.core.exceptions import MatchAgencyError +from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse from src.pdap_api.enums import MatchAgencyResponseStatus diff --git a/src/core/tasks/README.md b/src/core/tasks/README.md deleted file mode 100644 index 55e2225b..00000000 --- a/src/core/tasks/README.md +++ /dev/null @@ -1,4 +0,0 @@ - -## Terminology - -Task Data Objects (or TDOs) are data transfer objects (DTOs) used within a given task operation. Each Task type has one type of TDO. \ No newline at end of file diff --git a/src/core/tasks/operators/__init__.py b/src/core/tasks/base/__init__.py similarity index 100% rename from src/core/tasks/operators/__init__.py rename to src/core/tasks/base/__init__.py diff --git a/src/core/tasks/operators/base.py b/src/core/tasks/base/operator.py similarity index 62% rename from src/core/tasks/operators/base.py rename to src/core/tasks/base/operator.py index 764b3d4f..ba7a3d3a 100644 --- a/src/core/tasks/operators/base.py +++ b/src/core/tasks/base/operator.py @@ -1,49 +1,31 @@ import traceback from abc import ABC, abstractmethod + +from src.core.tasks.base.run_info import TaskOperatorRunInfo +from src.core.tasks.url.enums import TaskOperatorOutcome from src.db.client.async_ import AsyncDatabaseClient from src.db.enums import TaskType -from src.core.tasks.dtos.run_info import TaskOperatorRunInfo -from src.core.tasks.enums import TaskOperatorOutcome -from src.core.enums import BatchStatus class TaskOperatorBase(ABC): - def __init__(self, adb_client: AsyncDatabaseClient): self.adb_client = adb_client self.task_id = None - self.tasks_linked = False - self.linked_url_ids = [] @property @abstractmethod def task_type(self) -> TaskType: raise NotImplementedError - @abstractmethod - async def meets_task_prerequisites(self): - """ - A task should not be initiated unless certain - conditions are met - """ - raise NotImplementedError - - async def link_urls_to_task(self, url_ids: list[int]): - self.linked_url_ids = url_ids - async def initiate_task_in_db(self) -> int: task_id = await self.adb_client.initiate_task( task_type=self.task_type ) return task_id + @abstractmethod async def conclude_task(self): - if not self.linked_url_ids: - raise Exception("Task has not been linked to any URLs") - return await self.run_info( - outcome=TaskOperatorOutcome.SUCCESS, - message="Task completed successfully" - ) + raise NotImplementedError async def run_task(self, task_id: int) -> TaskOperatorRunInfo: self.task_id = task_id @@ -57,13 +39,10 @@ async def run_task(self, task_id: int) -> TaskOperatorRunInfo: message=str(e) + "\n" + stack_trace ) - async def run_info(self, outcome: TaskOperatorOutcome, message: str): - return TaskOperatorRunInfo( - task_id=self.task_id, - linked_url_ids=self.linked_url_ids, - outcome=outcome, - message=message - ) + @abstractmethod + async def run_info(self, outcome: TaskOperatorOutcome, message: str) -> TaskOperatorRunInfo: + raise NotImplementedError + @abstractmethod async def inner_task_logic(self): diff --git a/src/core/tasks/base/run_info.py b/src/core/tasks/base/run_info.py new file mode 100644 index 00000000..b822c59f --- /dev/null +++ b/src/core/tasks/base/run_info.py @@ -0,0 +1,13 @@ +from typing import Optional + +from pydantic import BaseModel + +from src.core.tasks.url.enums import TaskOperatorOutcome +from src.db.enums import TaskType + + +class TaskOperatorRunInfo(BaseModel): + task_id: Optional[int] + task_type: TaskType + outcome: TaskOperatorOutcome + message: str = "" \ No newline at end of file diff --git a/src/core/tasks/dtos/run_info.py b/src/core/tasks/dtos/run_info.py index 1eec7198..2296f65b 100644 --- a/src/core/tasks/dtos/run_info.py +++ b/src/core/tasks/dtos/run_info.py @@ -2,11 +2,9 @@ from pydantic import BaseModel -from src.core.tasks.enums import TaskOperatorOutcome +from src.core.tasks.base.run_info import TaskOperatorRunInfo +from src.core.tasks.url.enums import TaskOperatorOutcome -class TaskOperatorRunInfo(BaseModel): - task_id: Optional[int] +class URLTaskOperatorRunInfo(TaskOperatorRunInfo): linked_url_ids: list[int] - outcome: TaskOperatorOutcome - message: str = "" \ No newline at end of file diff --git a/src/core/tasks/handler.py b/src/core/tasks/handler.py new file mode 100644 index 00000000..3e3aca77 --- /dev/null +++ b/src/core/tasks/handler.py @@ -0,0 +1,61 @@ +import logging + +from discord_poster import DiscordPoster + +from src.core.enums import BatchStatus +from src.core.tasks.base.run_info import TaskOperatorRunInfo +from src.core.tasks.dtos.run_info import URLTaskOperatorRunInfo +from src.core.tasks.url.enums import TaskOperatorOutcome +from src.db.client.async_ import AsyncDatabaseClient +from src.db.enums import TaskType + + +class TaskHandler: + + def __init__( + self, + adb_client: AsyncDatabaseClient, + discord_poster: DiscordPoster + ): + self.adb_client = adb_client + self.discord_poster = discord_poster + + self.logger = logging.getLogger(__name__) + self.logger.addHandler(logging.StreamHandler()) + self.logger.setLevel(logging.INFO) + + + async def post_to_discord(self, message: str): + self.discord_poster.post_to_discord(message=message) + + async def initiate_task_in_db(self, task_type: TaskType) -> int: # + self.logger.info(f"Initiating {task_type.value} Task") + task_id = await self.adb_client.initiate_task(task_type=task_type) + return task_id + + async def handle_outcome(self, run_info: TaskOperatorRunInfo): # + match run_info.outcome: + case TaskOperatorOutcome.ERROR: + await self.handle_task_error(run_info) + case TaskOperatorOutcome.SUCCESS: + await self.adb_client.update_task_status( + task_id=run_info.task_id, + status=BatchStatus.READY_TO_LABEL + ) + + async def handle_task_error(self, run_info: TaskOperatorRunInfo): # + await self.adb_client.update_task_status( + task_id=run_info.task_id, + status=BatchStatus.ERROR) + await self.adb_client.add_task_error( + task_id=run_info.task_id, + error=run_info.message + ) + self.discord_poster.post_to_discord( + message=f"Task {run_info.task_id} ({run_info.task_type.value}) failed with error.") + + async def link_urls_to_task(self, task_id: int, url_ids: list[int]): + await self.adb_client.link_urls_to_task( + task_id=task_id, + url_ids=url_ids + ) \ No newline at end of file diff --git a/src/core/tasks/manager.py b/src/core/tasks/manager.py deleted file mode 100644 index dc0fe336..00000000 --- a/src/core/tasks/manager.py +++ /dev/null @@ -1,209 +0,0 @@ -import logging - -from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse -from src.collectors.source_collectors.muckrock.api_interface.core import MuckrockAPIInterface -from src.core.tasks.operators.agency_identification.core import AgencyIdentificationTaskOperator -from src.core.tasks.operators.agency_sync.core import SyncAgenciesTaskOperator -from src.core.tasks.operators.base import TaskOperatorBase -from src.core.tasks.operators.submit_approved_url.core import SubmitApprovedURLTaskOperator -from src.core.tasks.operators.url_404_probe.core import URL404ProbeTaskOperator -from src.core.tasks.operators.url_duplicate.core import URLDuplicateTaskOperator -from src.core.tasks.operators.url_html.core import URLHTMLTaskOperator -from src.core.tasks.operators.url_html.scraper.parser.core import HTMLResponseParser -from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface -from src.core.tasks.operators.url_miscellaneous_metadata.core import URLMiscellaneousMetadataTaskOperator -from src.db.client.async_ import AsyncDatabaseClient -from src.api.endpoints.task.dtos.get.task import TaskInfo -from src.db.enums import TaskType -from src.core.tasks.dtos.run_info import TaskOperatorRunInfo -from src.core.tasks.enums import TaskOperatorOutcome -from src.core.function_trigger import FunctionTrigger -from src.core.tasks.operators.record_type.core import URLRecordTypeTaskOperator -from src.core.enums import BatchStatus -from src.core.tasks.operators.record_type.llm_api.record_classifier.openai import OpenAIRecordClassifier -from src.pdap_api.client import PDAPClient -from discord_poster import DiscordPoster - -TASK_REPEAT_THRESHOLD = 20 - -class TaskManager: - - def __init__( - self, - adb_client: AsyncDatabaseClient, - url_request_interface: URLRequestInterface, - html_parser: HTMLResponseParser, - discord_poster: DiscordPoster, - pdap_client: PDAPClient, - muckrock_api_interface: MuckrockAPIInterface - ): - # Dependencies - self.adb_client = adb_client - self.pdap_client = pdap_client - self.url_request_interface = url_request_interface - self.html_parser = html_parser - self.discord_poster = discord_poster - self.muckrock_api_interface = muckrock_api_interface - - self.logger = logging.getLogger(__name__) - self.logger.addHandler(logging.StreamHandler()) - self.logger.setLevel(logging.INFO) - self.task_trigger = FunctionTrigger(self.run_tasks) - self.task_status: TaskType = TaskType.IDLE - - #region Task Operators - async def get_url_html_task_operator(self): - operator = URLHTMLTaskOperator( - adb_client=self.adb_client, - url_request_interface=self.url_request_interface, - html_parser=self.html_parser - ) - return operator - - async def get_url_record_type_task_operator(self): - operator = URLRecordTypeTaskOperator( - adb_client=self.adb_client, - classifier=OpenAIRecordClassifier() - ) - return operator - - async def get_agency_identification_task_operator(self): - operator = AgencyIdentificationTaskOperator( - adb_client=self.adb_client, - pdap_client=self.pdap_client, - muckrock_api_interface=self.muckrock_api_interface - ) - return operator - - async def get_submit_approved_url_task_operator(self): - operator = SubmitApprovedURLTaskOperator( - adb_client=self.adb_client, - pdap_client=self.pdap_client - ) - return operator - - async def get_url_miscellaneous_metadata_task_operator(self): - operator = URLMiscellaneousMetadataTaskOperator( - adb_client=self.adb_client - ) - return operator - - async def get_url_duplicate_task_operator(self): - operator = URLDuplicateTaskOperator( - adb_client=self.adb_client, - pdap_client=self.pdap_client - ) - return operator - - async def get_url_404_probe_task_operator(self): - operator = URL404ProbeTaskOperator( - adb_client=self.adb_client, - url_request_interface=self.url_request_interface - ) - return operator - - async def get_sync_agencies_task_operator(self): - operator = SyncAgenciesTaskOperator( - adb_client=self.adb_client, - pdap_client=self.pdap_client - ) - return operator - - async def get_task_operators(self) -> list[TaskOperatorBase]: - return [ - await self.get_url_html_task_operator(), - await self.get_url_duplicate_task_operator(), - await self.get_url_404_probe_task_operator(), - await self.get_url_record_type_task_operator(), - await self.get_agency_identification_task_operator(), - await self.get_url_miscellaneous_metadata_task_operator(), - await self.get_submit_approved_url_task_operator(), - await self.get_sync_agencies_task_operator() - ] - - #endregion - - #region Tasks - async def set_task_status(self, task_type: TaskType): - self.task_status = task_type - - async def run_tasks(self): - operators = await self.get_task_operators() - for operator in operators: - count = 0 - await self.set_task_status(task_type=operator.task_type) - - meets_prereq = await operator.meets_task_prerequisites() - while meets_prereq: - print(f"Running {operator.task_type.value} Task") - if count > TASK_REPEAT_THRESHOLD: - message = f"Task {operator.task_type.value} has been run more than {TASK_REPEAT_THRESHOLD} times in a row. Task loop terminated." - print(message) - self.discord_poster.post_to_discord(message=message) - break - task_id = await self.initiate_task_in_db(task_type=operator.task_type) - run_info: TaskOperatorRunInfo = await operator.run_task(task_id) - await self.conclude_task(run_info) - if run_info.outcome == TaskOperatorOutcome.ERROR: - break - count += 1 - meets_prereq = await operator.meets_task_prerequisites() - await self.set_task_status(task_type=TaskType.IDLE) - - async def trigger_task_run(self): - await self.task_trigger.trigger_or_rerun() - - - async def conclude_task(self, run_info): - await self.adb_client.link_urls_to_task( - task_id=run_info.task_id, - url_ids=run_info.linked_url_ids - ) - await self.handle_outcome(run_info) - - async def initiate_task_in_db(self, task_type: TaskType) -> int: - self.logger.info(f"Initiating {task_type.value} Task") - task_id = await self.adb_client.initiate_task(task_type=task_type) - return task_id - - async def handle_outcome(self, run_info: TaskOperatorRunInfo): - match run_info.outcome: - case TaskOperatorOutcome.ERROR: - await self.handle_task_error(run_info) - case TaskOperatorOutcome.SUCCESS: - await self.adb_client.update_task_status( - task_id=run_info.task_id, - status=BatchStatus.READY_TO_LABEL - ) - - async def handle_task_error(self, run_info: TaskOperatorRunInfo): - await self.adb_client.update_task_status( - task_id=run_info.task_id, - status=BatchStatus.ERROR) - await self.adb_client.add_task_error( - task_id=run_info.task_id, - error=run_info.message - ) - self.discord_poster.post_to_discord( - message=f"Task {run_info.task_id} ({self.task_status.value}) failed with error.") - - async def get_task_info(self, task_id: int) -> TaskInfo: - return await self.adb_client.get_task_info(task_id=task_id) - - async def get_tasks( - self, - page: int, - task_type: TaskType, - task_status: BatchStatus - ) -> GetTasksResponse: - return await self.adb_client.get_tasks( - page=page, - task_type=task_type, - task_status=task_status - ) - - - #endregion - - - diff --git a/src/core/tasks/scheduled/README.md b/src/core/tasks/scheduled/README.md new file mode 100644 index 00000000..9867aea4 --- /dev/null +++ b/src/core/tasks/scheduled/README.md @@ -0,0 +1,2 @@ +Scheduled tasks operate on a specific schedule, which is unique to each task. + diff --git a/src/core/tasks/operators/agency_identification/__init__.py b/src/core/tasks/scheduled/__init__.py similarity index 100% rename from src/core/tasks/operators/agency_identification/__init__.py rename to src/core/tasks/scheduled/__init__.py diff --git a/src/core/tasks/scheduled/loader.py b/src/core/tasks/scheduled/loader.py new file mode 100644 index 00000000..34b7c505 --- /dev/null +++ b/src/core/tasks/scheduled/loader.py @@ -0,0 +1,23 @@ +from src.core.tasks.scheduled.operators.agency_sync.core import SyncAgenciesTaskOperator +from src.db.client.async_ import AsyncDatabaseClient +from src.pdap_api.client import PDAPClient + + +class ScheduledTaskOperatorLoader: + + def __init__( + self, + adb_client: AsyncDatabaseClient, + pdap_client: PDAPClient, + ): + # Dependencies + self.adb_client = adb_client + self.pdap_client = pdap_client + + + async def get_sync_agencies_task_operator(self): + operator = SyncAgenciesTaskOperator( + adb_client=self.adb_client, + pdap_client=self.pdap_client + ) + return operator \ No newline at end of file diff --git a/src/core/scheduled_task_manager.py b/src/core/tasks/scheduled/manager.py similarity index 51% rename from src/core/scheduled_task_manager.py rename to src/core/tasks/scheduled/manager.py index 3f9faf32..44576cfa 100644 --- a/src/core/scheduled_task_manager.py +++ b/src/core/tasks/scheduled/manager.py @@ -3,24 +3,39 @@ from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.interval import IntervalTrigger from src.core.core import AsyncCore +from src.core.tasks.base.run_info import TaskOperatorRunInfo +from src.core.tasks.handler import TaskHandler +from src.core.tasks.scheduled.loader import ScheduledTaskOperatorLoader +from src.core.tasks.scheduled.operators.base import ScheduledTaskOperatorBase + class AsyncScheduledTaskManager: - def __init__(self, async_core: AsyncCore): + def __init__( + self, + async_core: AsyncCore, + handler: TaskHandler, + loader: ScheduledTaskOperatorLoader + ): # Dependencies self.async_core = async_core + self.handler = handler + self.loader = loader # Main objects self.scheduler = AsyncIOScheduler() - self.scheduler.start() - self.add_scheduled_tasks() # Jobs self.run_cycles_job = None self.delete_logs_job = None self.populate_backlog_snapshot_job = None + self.sync_agencies_job = None - def add_scheduled_tasks(self): + async def setup(self): + self.scheduler.start() + await self.add_scheduled_tasks() + + async def add_scheduled_tasks(self): self.run_cycles_job = self.scheduler.add_job( self.async_core.run_tasks, trigger=IntervalTrigger( @@ -43,7 +58,23 @@ def add_scheduled_tasks(self): start_date=datetime.now() + timedelta(minutes=20) ) ) + self.sync_agencies_job = self.scheduler.add_job( + self.run_task, + trigger=IntervalTrigger( + days=1, + start_date=datetime.now() + timedelta(minutes=2) + ), + kwargs={ + "operator": await self.loader.get_sync_agencies_task_operator() + } + ) def shutdown(self): if self.scheduler.running: - self.scheduler.shutdown() \ No newline at end of file + self.scheduler.shutdown() + + async def run_task(self, operator: ScheduledTaskOperatorBase): + print(f"Running {operator.task_type.value} Task") + task_id = await self.handler.initiate_task_in_db(task_type=operator.task_type) + run_info: TaskOperatorRunInfo = await operator.run_task(task_id) + await self.handler.handle_outcome(run_info) diff --git a/src/core/tasks/operators/agency_identification/dtos/__init__.py b/src/core/tasks/scheduled/operators/__init__.py similarity index 100% rename from src/core/tasks/operators/agency_identification/dtos/__init__.py rename to src/core/tasks/scheduled/operators/__init__.py diff --git a/src/core/tasks/operators/agency_sync/__init__.py b/src/core/tasks/scheduled/operators/agency_sync/__init__.py similarity index 100% rename from src/core/tasks/operators/agency_sync/__init__.py rename to src/core/tasks/scheduled/operators/agency_sync/__init__.py diff --git a/src/core/tasks/operators/agency_sync/constants.py b/src/core/tasks/scheduled/operators/agency_sync/constants.py similarity index 100% rename from src/core/tasks/operators/agency_sync/constants.py rename to src/core/tasks/scheduled/operators/agency_sync/constants.py diff --git a/src/core/tasks/operators/agency_sync/core.py b/src/core/tasks/scheduled/operators/agency_sync/core.py similarity index 64% rename from src/core/tasks/operators/agency_sync/core.py rename to src/core/tasks/scheduled/operators/agency_sync/core.py index 2e60ef80..65af05d9 100644 --- a/src/core/tasks/operators/agency_sync/core.py +++ b/src/core/tasks/scheduled/operators/agency_sync/core.py @@ -1,12 +1,14 @@ -from src.core.tasks.operators.agency_sync.constants import MAX_SYNC_REQUESTS -from src.core.tasks.operators.agency_sync.exceptions import MaxRequestsExceededError -from src.core.tasks.operators.base import TaskOperatorBase +from src.core.tasks.scheduled.operators.agency_sync.constants import MAX_SYNC_REQUESTS +from src.core.tasks.scheduled.operators.agency_sync.dtos.parameters import AgencySyncParameters +from src.core.tasks.scheduled.operators.agency_sync.exceptions import MaxRequestsExceededError +from src.core.tasks.scheduled.operators.base import ScheduledTaskOperatorBase +from src.core.tasks.url.operators.base import URLTaskOperatorBase from src.db.client.async_ import AsyncDatabaseClient from src.db.enums import TaskType from src.pdap_api.client import PDAPClient -class SyncAgenciesTaskOperator(TaskOperatorBase): +class SyncAgenciesTaskOperator(ScheduledTaskOperatorBase): def __init__( self, @@ -17,12 +19,9 @@ def __init__( self.pdap_client = pdap_client @property - def task_type(self) -> TaskType: + def task_type(self) -> TaskType: # return TaskType.SYNC_AGENCIES - async def meets_task_prerequisites(self): - return await self.adb_client.last_full_agencies_sync_over_a_day_ago() - async def inner_task_logic(self): params = await self.adb_client.get_agencies_sync_parameters() if params.page is None: @@ -37,7 +36,10 @@ async def inner_task_logic(self): ) await self.adb_client.upsert_agencies(response.agencies) - params.page += 1 + params = AgencySyncParameters( + page=params.page + 1, + cutoff_date=params.cutoff_date + ) await self.adb_client.update_agencies_sync_progress(params.page) response = await self.pdap_client.sync_agencies(params) @@ -45,5 +47,3 @@ async def inner_task_logic(self): await self.adb_client.mark_full_agencies_sync() - pass - diff --git a/src/core/tasks/operators/agency_sync/dtos/__init__.py b/src/core/tasks/scheduled/operators/agency_sync/dtos/__init__.py similarity index 100% rename from src/core/tasks/operators/agency_sync/dtos/__init__.py rename to src/core/tasks/scheduled/operators/agency_sync/dtos/__init__.py diff --git a/src/core/tasks/operators/agency_sync/dtos/parameters.py b/src/core/tasks/scheduled/operators/agency_sync/dtos/parameters.py similarity index 100% rename from src/core/tasks/operators/agency_sync/dtos/parameters.py rename to src/core/tasks/scheduled/operators/agency_sync/dtos/parameters.py diff --git a/src/core/tasks/operators/agency_sync/exceptions.py b/src/core/tasks/scheduled/operators/agency_sync/exceptions.py similarity index 100% rename from src/core/tasks/operators/agency_sync/exceptions.py rename to src/core/tasks/scheduled/operators/agency_sync/exceptions.py diff --git a/src/core/tasks/scheduled/operators/base.py b/src/core/tasks/scheduled/operators/base.py new file mode 100644 index 00000000..02e38268 --- /dev/null +++ b/src/core/tasks/scheduled/operators/base.py @@ -0,0 +1,32 @@ +from abc import abstractmethod + +from src.core.tasks.base.operator import TaskOperatorBase +from src.core.tasks.base.run_info import TaskOperatorRunInfo +from src.core.tasks.url.enums import TaskOperatorOutcome +from src.db.enums import TaskType + + +class ScheduledTaskOperatorBase(TaskOperatorBase): + + @property + @abstractmethod + def task_type(self) -> TaskType: + raise NotImplementedError + + async def conclude_task(self): + return await self.run_info( + outcome=TaskOperatorOutcome.SUCCESS, + message="Task completed successfully" + ) + + async def run_info( + self, + outcome: TaskOperatorOutcome, + message: str + ) -> TaskOperatorRunInfo: + return TaskOperatorRunInfo( + task_id=self.task_id, + task_type=self.task_type, + outcome=outcome, + message=message + ) diff --git a/src/core/tasks/url/README.md b/src/core/tasks/url/README.md new file mode 100644 index 00000000..ceaa045e --- /dev/null +++ b/src/core/tasks/url/README.md @@ -0,0 +1,9 @@ +URL Tasks are tasks that operate on the URL level. + +Such tasks will operate if a single URL meets that tasks's prerequisites, but typically operate on a batch of URLs at a time. + +The suite of URL tasks are checked on an hourly basis (via a scheduled task) and are also triggered in response to certain events, such as the completion of a batch. + +## Terminology + +Task Data Objects (or TDOs) are data transfer objects (DTOs) used within a given task operation. Each Task type has one type of TDO. \ No newline at end of file diff --git a/src/core/tasks/operators/record_type/__init__.py b/src/core/tasks/url/__init__.py similarity index 100% rename from src/core/tasks/operators/record_type/__init__.py rename to src/core/tasks/url/__init__.py diff --git a/src/core/tasks/enums.py b/src/core/tasks/url/enums.py similarity index 100% rename from src/core/tasks/enums.py rename to src/core/tasks/url/enums.py diff --git a/src/core/tasks/url/loader.py b/src/core/tasks/url/loader.py new file mode 100644 index 00000000..4882a319 --- /dev/null +++ b/src/core/tasks/url/loader.py @@ -0,0 +1,98 @@ +""" +The task loader loads task a task operator and all dependencies. +""" + +from src.collectors.source_collectors.muckrock.api_interface.core import MuckrockAPIInterface +from src.core.tasks.url.operators.agency_identification.core import AgencyIdentificationTaskOperator +from src.core.tasks.url.operators.base import URLTaskOperatorBase +from src.core.tasks.url.operators.record_type.core import URLRecordTypeTaskOperator +from src.core.tasks.url.operators.record_type.llm_api.record_classifier.openai import OpenAIRecordClassifier +from src.core.tasks.url.operators.submit_approved_url.core import SubmitApprovedURLTaskOperator +from src.core.tasks.url.operators.url_404_probe.core import URL404ProbeTaskOperator +from src.core.tasks.url.operators.url_duplicate.core import URLDuplicateTaskOperator +from src.core.tasks.url.operators.url_html.core import URLHTMLTaskOperator +from src.core.tasks.url.operators.url_html.scraper.parser.core import HTMLResponseParser +from src.core.tasks.url.operators.url_html.scraper.request_interface.core import URLRequestInterface +from src.core.tasks.url.operators.url_miscellaneous_metadata.core import URLMiscellaneousMetadataTaskOperator +from src.db.client.async_ import AsyncDatabaseClient +from src.pdap_api.client import PDAPClient + + +class URLTaskOperatorLoader: + + def __init__( + self, + adb_client: AsyncDatabaseClient, + url_request_interface: URLRequestInterface, + html_parser: HTMLResponseParser, + pdap_client: PDAPClient, + muckrock_api_interface: MuckrockAPIInterface + ): + # Dependencies + self.adb_client = adb_client + self.pdap_client = pdap_client + self.url_request_interface = url_request_interface + self.html_parser = html_parser + + self.muckrock_api_interface = muckrock_api_interface + + async def get_url_html_task_operator(self): + operator = URLHTMLTaskOperator( + adb_client=self.adb_client, + url_request_interface=self.url_request_interface, + html_parser=self.html_parser + ) + return operator + + async def get_url_record_type_task_operator(self): + operator = URLRecordTypeTaskOperator( + adb_client=self.adb_client, + classifier=OpenAIRecordClassifier() + ) + return operator + + async def get_agency_identification_task_operator(self): + operator = AgencyIdentificationTaskOperator( + adb_client=self.adb_client, + pdap_client=self.pdap_client, + muckrock_api_interface=self.muckrock_api_interface + ) + return operator + + async def get_submit_approved_url_task_operator(self): + operator = SubmitApprovedURLTaskOperator( + adb_client=self.adb_client, + pdap_client=self.pdap_client + ) + return operator + + async def get_url_miscellaneous_metadata_task_operator(self): + operator = URLMiscellaneousMetadataTaskOperator( + adb_client=self.adb_client + ) + return operator + + async def get_url_duplicate_task_operator(self): + operator = URLDuplicateTaskOperator( + adb_client=self.adb_client, + pdap_client=self.pdap_client + ) + return operator + + async def get_url_404_probe_task_operator(self): + operator = URL404ProbeTaskOperator( + adb_client=self.adb_client, + url_request_interface=self.url_request_interface + ) + return operator + + async def get_task_operators(self) -> list[URLTaskOperatorBase]: + return [ + await self.get_url_html_task_operator(), + await self.get_url_duplicate_task_operator(), + await self.get_url_404_probe_task_operator(), + await self.get_url_record_type_task_operator(), + await self.get_agency_identification_task_operator(), + await self.get_url_miscellaneous_metadata_task_operator(), + await self.get_submit_approved_url_task_operator(), + ] diff --git a/src/core/tasks/url/manager.py b/src/core/tasks/url/manager.py new file mode 100644 index 00000000..6d03aca0 --- /dev/null +++ b/src/core/tasks/url/manager.py @@ -0,0 +1,75 @@ +import logging + +from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse +from src.core.tasks.handler import TaskHandler +from src.core.tasks.url.loader import URLTaskOperatorLoader +from src.db.client.async_ import AsyncDatabaseClient +from src.api.endpoints.task.dtos.get.task import TaskInfo +from src.db.enums import TaskType +from src.core.tasks.dtos.run_info import URLTaskOperatorRunInfo +from src.core.tasks.url.enums import TaskOperatorOutcome +from src.core.function_trigger import FunctionTrigger +from src.core.enums import BatchStatus +from discord_poster import DiscordPoster + +TASK_REPEAT_THRESHOLD = 20 + +class TaskManager: + + def __init__( + self, + loader: URLTaskOperatorLoader, + handler: TaskHandler + ): + # Dependencies + self.loader = loader + self.handler = handler + + self.logger = logging.getLogger(__name__) + self.logger.addHandler(logging.StreamHandler()) + self.logger.setLevel(logging.INFO) + self.task_trigger = FunctionTrigger(self.run_tasks) + self.manager_status: TaskType = TaskType.IDLE + + + #region Tasks + async def set_manager_status(self, task_type: TaskType): + self.manager_status = task_type + + async def run_tasks(self): + operators = await self.loader.get_task_operators() + for operator in operators: + count = 0 + await self.set_manager_status(task_type=operator.task_type) + + meets_prereq = await operator.meets_task_prerequisites() + while meets_prereq: + print(f"Running {operator.task_type.value} Task") + if count > TASK_REPEAT_THRESHOLD: + message = f"Task {operator.task_type.value} has been run more than {TASK_REPEAT_THRESHOLD} times in a row. Task loop terminated." + print(message) + await self.handler.post_to_discord(message=message) + break + task_id = await self.handler.initiate_task_in_db(task_type=operator.task_type) + run_info: URLTaskOperatorRunInfo = await operator.run_task(task_id) + await self.conclude_task(run_info) + if run_info.outcome == TaskOperatorOutcome.ERROR: + break + count += 1 + meets_prereq = await operator.meets_task_prerequisites() + await self.set_manager_status(task_type=TaskType.IDLE) + + async def trigger_task_run(self): + await self.task_trigger.trigger_or_rerun() + + + async def conclude_task(self, run_info: URLTaskOperatorRunInfo): + await self.handler.link_urls_to_task( + task_id=run_info.task_id, + url_ids=run_info.linked_url_ids + ) + await self.handler.handle_outcome(run_info) + + + + diff --git a/src/core/tasks/operators/record_type/llm_api/__init__.py b/src/core/tasks/url/operators/__init__.py similarity index 100% rename from src/core/tasks/operators/record_type/llm_api/__init__.py rename to src/core/tasks/url/operators/__init__.py diff --git a/src/core/tasks/operators/record_type/llm_api/dtos/__init__.py b/src/core/tasks/url/operators/agency_identification/__init__.py similarity index 100% rename from src/core/tasks/operators/record_type/llm_api/dtos/__init__.py rename to src/core/tasks/url/operators/agency_identification/__init__.py diff --git a/src/core/tasks/operators/agency_identification/core.py b/src/core/tasks/url/operators/agency_identification/core.py similarity index 84% rename from src/core/tasks/operators/agency_identification/core.py rename to src/core/tasks/url/operators/agency_identification/core.py index 9da63706..b85e4666 100644 --- a/src/core/tasks/operators/agency_identification/core.py +++ b/src/core/tasks/url/operators/agency_identification/core.py @@ -1,24 +1,22 @@ -from aiohttp import ClientSession - from src.collectors.source_collectors.muckrock.api_interface.core import MuckrockAPIInterface +from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo +from src.core.tasks.url.operators.agency_identification.dtos.tdo import AgencyIdentificationTDO from src.db.client.async_ import AsyncDatabaseClient from src.db.dtos.url_error_info import URLErrorPydanticInfo from src.db.enums import TaskType from src.collectors.enums import CollectorType -from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo -from src.core.tasks.operators.agency_identification.dtos.tdo import AgencyIdentificationTDO -from src.core.tasks.operators.base import TaskOperatorBase -from src.core.tasks.subtasks.agency_identification.auto_googler import AutoGooglerAgencyIdentificationSubtask -from src.core.tasks.subtasks.agency_identification.ckan import CKANAgencyIdentificationSubtask -from src.core.tasks.subtasks.agency_identification.common_crawler import CommonCrawlerAgencyIdentificationSubtask -from src.core.tasks.subtasks.agency_identification.muckrock import MuckrockAgencyIdentificationSubtask +from src.core.tasks.url.operators.base import URLTaskOperatorBase +from src.core.tasks.url.subtasks.agency_identification.auto_googler import AutoGooglerAgencyIdentificationSubtask +from src.core.tasks.url.subtasks.agency_identification.ckan import CKANAgencyIdentificationSubtask +from src.core.tasks.url.subtasks.agency_identification.common_crawler import CommonCrawlerAgencyIdentificationSubtask +from src.core.tasks.url.subtasks.agency_identification.muckrock import MuckrockAgencyIdentificationSubtask from src.core.enums import SuggestionType from src.pdap_api.client import PDAPClient # TODO: Validate with Manual Tests -class AgencyIdentificationTaskOperator(TaskOperatorBase): +class AgencyIdentificationTaskOperator(URLTaskOperatorBase): def __init__( self, diff --git a/src/core/tasks/operators/record_type/llm_api/record_classifier/__init__.py b/src/core/tasks/url/operators/agency_identification/dtos/__init__.py similarity index 100% rename from src/core/tasks/operators/record_type/llm_api/record_classifier/__init__.py rename to src/core/tasks/url/operators/agency_identification/dtos/__init__.py diff --git a/src/core/tasks/operators/agency_identification/dtos/suggestion.py b/src/core/tasks/url/operators/agency_identification/dtos/suggestion.py similarity index 100% rename from src/core/tasks/operators/agency_identification/dtos/suggestion.py rename to src/core/tasks/url/operators/agency_identification/dtos/suggestion.py diff --git a/src/core/tasks/operators/agency_identification/dtos/tdo.py b/src/core/tasks/url/operators/agency_identification/dtos/tdo.py similarity index 100% rename from src/core/tasks/operators/agency_identification/dtos/tdo.py rename to src/core/tasks/url/operators/agency_identification/dtos/tdo.py diff --git a/src/core/tasks/url/operators/base.py b/src/core/tasks/url/operators/base.py new file mode 100644 index 00000000..59c41c6a --- /dev/null +++ b/src/core/tasks/url/operators/base.py @@ -0,0 +1,61 @@ +import traceback +from abc import ABC, abstractmethod + +from src.core.tasks.base.operator import TaskOperatorBase +from src.db.client.async_ import AsyncDatabaseClient +from src.db.enums import TaskType +from src.core.tasks.dtos.run_info import URLTaskOperatorRunInfo +from src.core.tasks.url.enums import TaskOperatorOutcome +from src.core.enums import BatchStatus + + +class URLTaskOperatorBase(TaskOperatorBase): + + def __init__(self, adb_client: AsyncDatabaseClient): + super().__init__(adb_client) + self.tasks_linked = False + self.linked_url_ids = [] + + @abstractmethod + async def meets_task_prerequisites(self): + """ + A task should not be initiated unless certain + conditions are met + """ + raise NotImplementedError + + async def link_urls_to_task(self, url_ids: list[int]): + self.linked_url_ids = url_ids + + async def conclude_task(self): + if not self.linked_url_ids: + raise Exception("Task has not been linked to any URLs") + return await self.run_info( + outcome=TaskOperatorOutcome.SUCCESS, + message="Task completed successfully" + ) + + async def run_task(self, task_id: int) -> URLTaskOperatorRunInfo: + self.task_id = task_id + try: + await self.inner_task_logic() + return await self.conclude_task() + except Exception as e: + stack_trace = traceback.format_exc() + return await self.run_info( + outcome=TaskOperatorOutcome.ERROR, + message=str(e) + "\n" + stack_trace + ) + + async def run_info( + self, + outcome: TaskOperatorOutcome, + message: str + ) -> URLTaskOperatorRunInfo: + return URLTaskOperatorRunInfo( + task_id=self.task_id, + task_type=self.task_type, + linked_url_ids=self.linked_url_ids, + outcome=outcome, + message=message + ) diff --git a/src/core/tasks/operators/submit_approved_url/__init__.py b/src/core/tasks/url/operators/record_type/__init__.py similarity index 100% rename from src/core/tasks/operators/submit_approved_url/__init__.py rename to src/core/tasks/url/operators/record_type/__init__.py diff --git a/src/core/tasks/operators/record_type/core.py b/src/core/tasks/url/operators/record_type/core.py similarity index 90% rename from src/core/tasks/operators/record_type/core.py rename to src/core/tasks/url/operators/record_type/core.py index 2514378e..2888a52c 100644 --- a/src/core/tasks/operators/record_type/core.py +++ b/src/core/tasks/url/operators/record_type/core.py @@ -1,13 +1,13 @@ from src.db.client.async_ import AsyncDatabaseClient from src.db.dtos.url_error_info import URLErrorPydanticInfo from src.db.enums import TaskType -from src.core.tasks.operators.record_type.tdo import URLRecordTypeTDO -from src.core.tasks.operators.base import TaskOperatorBase +from src.core.tasks.url.operators.record_type.tdo import URLRecordTypeTDO +from src.core.tasks.url.operators.base import URLTaskOperatorBase from src.core.enums import RecordType -from src.core.tasks.operators.record_type.llm_api.record_classifier.openai import OpenAIRecordClassifier +from src.core.tasks.url.operators.record_type.llm_api.record_classifier.openai import OpenAIRecordClassifier -class URLRecordTypeTaskOperator(TaskOperatorBase): +class URLRecordTypeTaskOperator(URLTaskOperatorBase): def __init__( self, diff --git a/src/core/tasks/operators/url_404_probe/__init__.py b/src/core/tasks/url/operators/record_type/llm_api/__init__.py similarity index 100% rename from src/core/tasks/operators/url_404_probe/__init__.py rename to src/core/tasks/url/operators/record_type/llm_api/__init__.py diff --git a/src/core/tasks/operators/record_type/llm_api/constants.py b/src/core/tasks/url/operators/record_type/llm_api/constants.py similarity index 100% rename from src/core/tasks/operators/record_type/llm_api/constants.py rename to src/core/tasks/url/operators/record_type/llm_api/constants.py diff --git a/src/core/tasks/operators/url_duplicate/__init__.py b/src/core/tasks/url/operators/record_type/llm_api/dtos/__init__.py similarity index 100% rename from src/core/tasks/operators/url_duplicate/__init__.py rename to src/core/tasks/url/operators/record_type/llm_api/dtos/__init__.py diff --git a/src/core/tasks/operators/record_type/llm_api/dtos/record_type_structured_output.py b/src/core/tasks/url/operators/record_type/llm_api/dtos/record_type_structured_output.py similarity index 100% rename from src/core/tasks/operators/record_type/llm_api/dtos/record_type_structured_output.py rename to src/core/tasks/url/operators/record_type/llm_api/dtos/record_type_structured_output.py diff --git a/src/core/tasks/operators/record_type/llm_api/helpers.py b/src/core/tasks/url/operators/record_type/llm_api/helpers.py similarity index 100% rename from src/core/tasks/operators/record_type/llm_api/helpers.py rename to src/core/tasks/url/operators/record_type/llm_api/helpers.py diff --git a/src/core/tasks/operators/url_html/__init__.py b/src/core/tasks/url/operators/record_type/llm_api/record_classifier/__init__.py similarity index 100% rename from src/core/tasks/operators/url_html/__init__.py rename to src/core/tasks/url/operators/record_type/llm_api/record_classifier/__init__.py diff --git a/src/core/tasks/operators/record_type/llm_api/record_classifier/base.py b/src/core/tasks/url/operators/record_type/llm_api/record_classifier/base.py similarity index 85% rename from src/core/tasks/operators/record_type/llm_api/record_classifier/base.py rename to src/core/tasks/url/operators/record_type/llm_api/record_classifier/base.py index 5e62df22..52aae6e6 100644 --- a/src/core/tasks/operators/record_type/llm_api/record_classifier/base.py +++ b/src/core/tasks/url/operators/record_type/llm_api/record_classifier/base.py @@ -4,10 +4,11 @@ from openai import AsyncOpenAI +from src.core.tasks.url.operators.record_type.llm_api.dtos.record_type_structured_output import \ + RecordTypeStructuredOutput from src.db.dtos.url_html_content_info import URLHTMLContentInfo -from src.core.tasks.operators.record_type.llm_api.dtos.record_type_structured_output import RecordTypeStructuredOutput -from src.core.tasks.operators.record_type.llm_api.constants import RECORD_CLASSIFICATION_QUERY_CONTENT -from src.core.tasks.operators.record_type.llm_api.helpers import dictify_html_info +from src.core.tasks.url.operators.record_type.llm_api.constants import RECORD_CLASSIFICATION_QUERY_CONTENT +from src.core.tasks.url.operators.record_type.llm_api.helpers import dictify_html_info class RecordClassifierBase(ABC): diff --git a/src/core/tasks/operators/record_type/llm_api/record_classifier/deepseek.py b/src/core/tasks/url/operators/record_type/llm_api/record_classifier/deepseek.py similarity index 83% rename from src/core/tasks/operators/record_type/llm_api/record_classifier/deepseek.py rename to src/core/tasks/url/operators/record_type/llm_api/record_classifier/deepseek.py index 71fa6673..d30c5e6e 100644 --- a/src/core/tasks/operators/record_type/llm_api/record_classifier/deepseek.py +++ b/src/core/tasks/url/operators/record_type/llm_api/record_classifier/deepseek.py @@ -2,7 +2,7 @@ from openai import AsyncOpenAI -from src.core.tasks.operators.record_type.llm_api.record_classifier.base import RecordClassifierBase +from src.core.tasks.url.operators.record_type.llm_api.record_classifier.base import RecordClassifierBase class DeepSeekRecordClassifier(RecordClassifierBase): diff --git a/src/core/tasks/operators/record_type/llm_api/record_classifier/openai.py b/src/core/tasks/url/operators/record_type/llm_api/record_classifier/openai.py similarity index 77% rename from src/core/tasks/operators/record_type/llm_api/record_classifier/openai.py rename to src/core/tasks/url/operators/record_type/llm_api/record_classifier/openai.py index fb129120..cb834dd8 100644 --- a/src/core/tasks/operators/record_type/llm_api/record_classifier/openai.py +++ b/src/core/tasks/url/operators/record_type/llm_api/record_classifier/openai.py @@ -2,8 +2,9 @@ from openai.types.chat import ParsedChatCompletion from src.core.env_var_manager import EnvVarManager -from src.core.tasks.operators.record_type.llm_api.record_classifier.base import RecordClassifierBase -from src.core.tasks.operators.record_type.llm_api.dtos.record_type_structured_output import RecordTypeStructuredOutput +from src.core.tasks.url.operators.record_type.llm_api.dtos.record_type_structured_output import \ + RecordTypeStructuredOutput +from src.core.tasks.url.operators.record_type.llm_api.record_classifier.base import RecordClassifierBase class OpenAIRecordClassifier(RecordClassifierBase): diff --git a/src/core/tasks/operators/record_type/tdo.py b/src/core/tasks/url/operators/record_type/tdo.py similarity index 100% rename from src/core/tasks/operators/record_type/tdo.py rename to src/core/tasks/url/operators/record_type/tdo.py diff --git a/src/core/tasks/operators/url_html/scraper/__init__.py b/src/core/tasks/url/operators/submit_approved_url/__init__.py similarity index 100% rename from src/core/tasks/operators/url_html/scraper/__init__.py rename to src/core/tasks/url/operators/submit_approved_url/__init__.py diff --git a/src/core/tasks/operators/submit_approved_url/core.py b/src/core/tasks/url/operators/submit_approved_url/core.py similarity index 91% rename from src/core/tasks/operators/submit_approved_url/core.py rename to src/core/tasks/url/operators/submit_approved_url/core.py index 02db5732..66f5fe99 100644 --- a/src/core/tasks/operators/submit_approved_url/core.py +++ b/src/core/tasks/url/operators/submit_approved_url/core.py @@ -1,12 +1,12 @@ from src.db.client.async_ import AsyncDatabaseClient from src.db.dtos.url_error_info import URLErrorPydanticInfo from src.db.enums import TaskType -from src.core.tasks.operators.submit_approved_url.tdo import SubmitApprovedURLTDO -from src.core.tasks.operators.base import TaskOperatorBase +from src.core.tasks.url.operators.submit_approved_url.tdo import SubmitApprovedURLTDO +from src.core.tasks.url.operators.base import URLTaskOperatorBase from src.pdap_api.client import PDAPClient -class SubmitApprovedURLTaskOperator(TaskOperatorBase): +class SubmitApprovedURLTaskOperator(URLTaskOperatorBase): def __init__( self, diff --git a/src/core/tasks/operators/submit_approved_url/tdo.py b/src/core/tasks/url/operators/submit_approved_url/tdo.py similarity index 100% rename from src/core/tasks/operators/submit_approved_url/tdo.py rename to src/core/tasks/url/operators/submit_approved_url/tdo.py diff --git a/src/core/tasks/operators/url_html/scraper/parser/__init__.py b/src/core/tasks/url/operators/url_404_probe/__init__.py similarity index 100% rename from src/core/tasks/operators/url_html/scraper/parser/__init__.py rename to src/core/tasks/url/operators/url_404_probe/__init__.py diff --git a/src/core/tasks/operators/url_404_probe/core.py b/src/core/tasks/url/operators/url_404_probe/core.py similarity index 87% rename from src/core/tasks/operators/url_404_probe/core.py rename to src/core/tasks/url/operators/url_404_probe/core.py index 541d0236..7da96068 100644 --- a/src/core/tasks/operators/url_404_probe/core.py +++ b/src/core/tasks/url/operators/url_404_probe/core.py @@ -2,11 +2,11 @@ from pydantic import BaseModel -from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface +from src.core.tasks.url.operators.url_html.scraper.request_interface.core import URLRequestInterface from src.db.client.async_ import AsyncDatabaseClient from src.db.enums import TaskType -from src.core.tasks.operators.url_404_probe.tdo import URL404ProbeTDO -from src.core.tasks.operators.base import TaskOperatorBase +from src.core.tasks.url.operators.url_404_probe.tdo import URL404ProbeTDO +from src.core.tasks.url.operators.base import URLTaskOperatorBase class URL404ProbeTDOSubsets(BaseModel): @@ -15,7 +15,7 @@ class URL404ProbeTDOSubsets(BaseModel): -class URL404ProbeTaskOperator(TaskOperatorBase): +class URL404ProbeTaskOperator(URLTaskOperatorBase): def __init__( self, diff --git a/src/core/tasks/operators/url_404_probe/tdo.py b/src/core/tasks/url/operators/url_404_probe/tdo.py similarity index 100% rename from src/core/tasks/operators/url_404_probe/tdo.py rename to src/core/tasks/url/operators/url_404_probe/tdo.py diff --git a/src/core/tasks/operators/url_html/scraper/parser/dtos/__init__.py b/src/core/tasks/url/operators/url_duplicate/__init__.py similarity index 100% rename from src/core/tasks/operators/url_html/scraper/parser/dtos/__init__.py rename to src/core/tasks/url/operators/url_duplicate/__init__.py diff --git a/src/core/tasks/operators/url_duplicate/core.py b/src/core/tasks/url/operators/url_duplicate/core.py similarity index 88% rename from src/core/tasks/operators/url_duplicate/core.py rename to src/core/tasks/url/operators/url_duplicate/core.py index c5167291..f8aec6f4 100644 --- a/src/core/tasks/operators/url_duplicate/core.py +++ b/src/core/tasks/url/operators/url_duplicate/core.py @@ -4,12 +4,12 @@ from src.db.client.async_ import AsyncDatabaseClient from src.db.enums import TaskType -from src.core.tasks.operators.url_duplicate.tdo import URLDuplicateTDO -from src.core.tasks.operators.base import TaskOperatorBase +from src.core.tasks.url.operators.url_duplicate.tdo import URLDuplicateTDO +from src.core.tasks.url.operators.base import URLTaskOperatorBase from src.pdap_api.client import PDAPClient -class URLDuplicateTaskOperator(TaskOperatorBase): +class URLDuplicateTaskOperator(URLTaskOperatorBase): def __init__( self, diff --git a/src/core/tasks/operators/url_duplicate/tdo.py b/src/core/tasks/url/operators/url_duplicate/tdo.py similarity index 100% rename from src/core/tasks/operators/url_duplicate/tdo.py rename to src/core/tasks/url/operators/url_duplicate/tdo.py diff --git a/src/core/tasks/operators/url_html/scraper/request_interface/__init__.py b/src/core/tasks/url/operators/url_html/__init__.py similarity index 100% rename from src/core/tasks/operators/url_html/scraper/request_interface/__init__.py rename to src/core/tasks/url/operators/url_html/__init__.py diff --git a/src/core/tasks/operators/url_html/content_info_getter.py b/src/core/tasks/url/operators/url_html/content_info_getter.py similarity index 90% rename from src/core/tasks/operators/url_html/content_info_getter.py rename to src/core/tasks/url/operators/url_html/content_info_getter.py index fd9e3b2f..da389738 100644 --- a/src/core/tasks/operators/url_html/content_info_getter.py +++ b/src/core/tasks/url/operators/url_html/content_info_getter.py @@ -1,4 +1,4 @@ -from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo from src.db.dtos.url_html_content_info import URLHTMLContentInfo, HTMLContentType diff --git a/src/core/tasks/operators/url_html/core.py b/src/core/tasks/url/operators/url_html/core.py similarity index 91% rename from src/core/tasks/operators/url_html/core.py rename to src/core/tasks/url/operators/url_html/core.py index c67f2e8c..5b4c82be 100644 --- a/src/core/tasks/operators/url_html/core.py +++ b/src/core/tasks/url/operators/url_html/core.py @@ -4,14 +4,14 @@ from src.db.dtos.url_error_info import URLErrorPydanticInfo from src.db.dtos.url_info import URLInfo from src.db.enums import TaskType -from src.core.tasks.operators.url_html.tdo import UrlHtmlTDO -from src.core.tasks.operators.url_html.content_info_getter import HTMLContentInfoGetter -from src.core.tasks.operators.base import TaskOperatorBase -from src.core.tasks.operators.url_html.scraper.parser.core import HTMLResponseParser -from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface +from src.core.tasks.url.operators.url_html.tdo import UrlHtmlTDO +from src.core.tasks.url.operators.url_html.content_info_getter import HTMLContentInfoGetter +from src.core.tasks.url.operators.base import URLTaskOperatorBase +from src.core.tasks.url.operators.url_html.scraper.parser.core import HTMLResponseParser +from src.core.tasks.url.operators.url_html.scraper.request_interface.core import URLRequestInterface -class URLHTMLTaskOperator(TaskOperatorBase): +class URLHTMLTaskOperator(URLTaskOperatorBase): def __init__( self, diff --git a/src/core/tasks/operators/url_html/scraper/README.md b/src/core/tasks/url/operators/url_html/scraper/README.md similarity index 100% rename from src/core/tasks/operators/url_html/scraper/README.md rename to src/core/tasks/url/operators/url_html/scraper/README.md diff --git a/src/core/tasks/operators/url_html/scraper/request_interface/dtos/__init__.py b/src/core/tasks/url/operators/url_html/scraper/__init__.py similarity index 100% rename from src/core/tasks/operators/url_html/scraper/request_interface/dtos/__init__.py rename to src/core/tasks/url/operators/url_html/scraper/__init__.py diff --git a/src/core/tasks/operators/url_html/scraper/root_url_cache/__init__.py b/src/core/tasks/url/operators/url_html/scraper/parser/__init__.py similarity index 100% rename from src/core/tasks/operators/url_html/scraper/root_url_cache/__init__.py rename to src/core/tasks/url/operators/url_html/scraper/parser/__init__.py diff --git a/src/core/tasks/operators/url_html/scraper/parser/constants.py b/src/core/tasks/url/operators/url_html/scraper/parser/constants.py similarity index 100% rename from src/core/tasks/operators/url_html/scraper/parser/constants.py rename to src/core/tasks/url/operators/url_html/scraper/parser/constants.py diff --git a/src/core/tasks/operators/url_html/scraper/parser/core.py b/src/core/tasks/url/operators/url_html/scraper/parser/core.py similarity index 89% rename from src/core/tasks/operators/url_html/scraper/parser/core.py rename to src/core/tasks/url/operators/url_html/scraper/parser/core.py index 96eeb8eb..1b5e0f91 100644 --- a/src/core/tasks/operators/url_html/scraper/parser/core.py +++ b/src/core/tasks/url/operators/url_html/scraper/parser/core.py @@ -3,11 +3,11 @@ from bs4 import BeautifulSoup -from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo -from src.core.tasks.operators.url_html.scraper.parser.enums import ParserTypeEnum -from src.core.tasks.operators.url_html.scraper.parser.constants import HEADER_TAGS -from src.core.tasks.operators.url_html.scraper.root_url_cache.core import RootURLCache -from src.core.tasks.operators.url_html.scraper.parser.util import remove_excess_whitespace, add_https, remove_trailing_backslash, \ +from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.core.tasks.url.operators.url_html.scraper.parser.enums import ParserTypeEnum +from src.core.tasks.url.operators.url_html.scraper.parser.constants import HEADER_TAGS +from src.core.tasks.url.operators.url_html.scraper.root_url_cache.core import RootURLCache +from src.core.tasks.url.operators.url_html.scraper.parser.util import remove_excess_whitespace, add_https, remove_trailing_backslash, \ drop_hostname diff --git a/src/core/tasks/operators/url_html/scraper/root_url_cache/dtos/__init__.py b/src/core/tasks/url/operators/url_html/scraper/parser/dtos/__init__.py similarity index 100% rename from src/core/tasks/operators/url_html/scraper/root_url_cache/dtos/__init__.py rename to src/core/tasks/url/operators/url_html/scraper/parser/dtos/__init__.py diff --git a/src/core/tasks/operators/url_html/scraper/parser/dtos/response_html.py b/src/core/tasks/url/operators/url_html/scraper/parser/dtos/response_html.py similarity index 100% rename from src/core/tasks/operators/url_html/scraper/parser/dtos/response_html.py rename to src/core/tasks/url/operators/url_html/scraper/parser/dtos/response_html.py diff --git a/src/core/tasks/operators/url_html/scraper/parser/enums.py b/src/core/tasks/url/operators/url_html/scraper/parser/enums.py similarity index 100% rename from src/core/tasks/operators/url_html/scraper/parser/enums.py rename to src/core/tasks/url/operators/url_html/scraper/parser/enums.py diff --git a/src/core/tasks/operators/url_html/scraper/parser/mapping.py b/src/core/tasks/url/operators/url_html/scraper/parser/mapping.py similarity index 100% rename from src/core/tasks/operators/url_html/scraper/parser/mapping.py rename to src/core/tasks/url/operators/url_html/scraper/parser/mapping.py diff --git a/src/core/tasks/operators/url_html/scraper/parser/util.py b/src/core/tasks/url/operators/url_html/scraper/parser/util.py similarity index 84% rename from src/core/tasks/operators/url_html/scraper/parser/util.py rename to src/core/tasks/url/operators/url_html/scraper/parser/util.py index 65f70981..7f186c87 100644 --- a/src/core/tasks/operators/url_html/scraper/parser/util.py +++ b/src/core/tasks/url/operators/url_html/scraper/parser/util.py @@ -1,8 +1,8 @@ from urllib.parse import urlparse from src.db.dtos.url_html_content_info import URLHTMLContentInfo -from src.core.tasks.operators.url_html.scraper.parser.mapping import ENUM_TO_ATTRIBUTE_MAPPING -from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.core.tasks.url.operators.url_html.scraper.parser.mapping import ENUM_TO_ATTRIBUTE_MAPPING +from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo def convert_to_response_html_info(html_content_infos: list[URLHTMLContentInfo]): diff --git a/src/core/tasks/operators/url_miscellaneous_metadata/__init__.py b/src/core/tasks/url/operators/url_html/scraper/request_interface/__init__.py similarity index 100% rename from src/core/tasks/operators/url_miscellaneous_metadata/__init__.py rename to src/core/tasks/url/operators/url_html/scraper/request_interface/__init__.py diff --git a/src/core/tasks/operators/url_html/scraper/request_interface/constants.py b/src/core/tasks/url/operators/url_html/scraper/request_interface/constants.py similarity index 100% rename from src/core/tasks/operators/url_html/scraper/request_interface/constants.py rename to src/core/tasks/url/operators/url_html/scraper/request_interface/constants.py diff --git a/src/core/tasks/operators/url_html/scraper/request_interface/core.py b/src/core/tasks/url/operators/url_html/scraper/request_interface/core.py similarity index 90% rename from src/core/tasks/operators/url_html/scraper/request_interface/core.py rename to src/core/tasks/url/operators/url_html/scraper/request_interface/core.py index 46d43df2..f45780cb 100644 --- a/src/core/tasks/operators/url_html/scraper/request_interface/core.py +++ b/src/core/tasks/url/operators/url_html/scraper/request_interface/core.py @@ -5,9 +5,9 @@ from playwright.async_api import async_playwright from tqdm.asyncio import tqdm -from src.core.tasks.operators.url_html.scraper.request_interface.constants import HTML_CONTENT_TYPE -from src.core.tasks.operators.url_html.scraper.request_interface.dtos.request_resources import RequestResources -from src.core.tasks.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo +from src.core.tasks.url.operators.url_html.scraper.request_interface.constants import HTML_CONTENT_TYPE +from src.core.tasks.url.operators.url_html.scraper.request_interface.dtos.request_resources import RequestResources +from src.core.tasks.url.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo class URLRequestInterface: diff --git a/src/core/tasks/subtasks/__init__.py b/src/core/tasks/url/operators/url_html/scraper/request_interface/dtos/__init__.py similarity index 100% rename from src/core/tasks/subtasks/__init__.py rename to src/core/tasks/url/operators/url_html/scraper/request_interface/dtos/__init__.py diff --git a/src/core/tasks/operators/url_html/scraper/request_interface/dtos/request_resources.py b/src/core/tasks/url/operators/url_html/scraper/request_interface/dtos/request_resources.py similarity index 74% rename from src/core/tasks/operators/url_html/scraper/request_interface/dtos/request_resources.py rename to src/core/tasks/url/operators/url_html/scraper/request_interface/dtos/request_resources.py index c17964da..62ad714a 100644 --- a/src/core/tasks/operators/url_html/scraper/request_interface/dtos/request_resources.py +++ b/src/core/tasks/url/operators/url_html/scraper/request_interface/dtos/request_resources.py @@ -4,7 +4,7 @@ from aiohttp import ClientSession from playwright.async_api import async_playwright -from src.core.tasks.operators.url_html.scraper.request_interface.constants import MAX_CONCURRENCY +from src.core.tasks.url.operators.url_html.scraper.request_interface.constants import MAX_CONCURRENCY @dataclass diff --git a/src/core/tasks/operators/url_html/scraper/request_interface/dtos/url_response.py b/src/core/tasks/url/operators/url_html/scraper/request_interface/dtos/url_response.py similarity index 100% rename from src/core/tasks/operators/url_html/scraper/request_interface/dtos/url_response.py rename to src/core/tasks/url/operators/url_html/scraper/request_interface/dtos/url_response.py diff --git a/src/core/tasks/subtasks/agency_identification/__init__.py b/src/core/tasks/url/operators/url_html/scraper/root_url_cache/__init__.py similarity index 100% rename from src/core/tasks/subtasks/agency_identification/__init__.py rename to src/core/tasks/url/operators/url_html/scraper/root_url_cache/__init__.py diff --git a/src/core/tasks/operators/url_html/scraper/root_url_cache/constants.py b/src/core/tasks/url/operators/url_html/scraper/root_url_cache/constants.py similarity index 100% rename from src/core/tasks/operators/url_html/scraper/root_url_cache/constants.py rename to src/core/tasks/url/operators/url_html/scraper/root_url_cache/constants.py diff --git a/src/core/tasks/operators/url_html/scraper/root_url_cache/core.py b/src/core/tasks/url/operators/url_html/scraper/root_url_cache/core.py similarity index 92% rename from src/core/tasks/operators/url_html/scraper/root_url_cache/core.py rename to src/core/tasks/url/operators/url_html/scraper/root_url_cache/core.py index 9c8db3a8..c30bc16e 100644 --- a/src/core/tasks/operators/url_html/scraper/root_url_cache/core.py +++ b/src/core/tasks/url/operators/url_html/scraper/root_url_cache/core.py @@ -5,8 +5,8 @@ from bs4 import BeautifulSoup from src.db.client.async_ import AsyncDatabaseClient -from src.core.tasks.operators.url_html.scraper.root_url_cache.constants import REQUEST_HEADERS -from src.core.tasks.operators.url_html.scraper.root_url_cache.dtos.response import RootURLCacheResponseInfo +from src.core.tasks.url.operators.url_html.scraper.root_url_cache.constants import REQUEST_HEADERS +from src.core.tasks.url.operators.url_html.scraper.root_url_cache.dtos.response import RootURLCacheResponseInfo DEBUG = False diff --git a/src/core/tasks/subtasks/miscellaneous_metadata/__init__.py b/src/core/tasks/url/operators/url_html/scraper/root_url_cache/dtos/__init__.py similarity index 100% rename from src/core/tasks/subtasks/miscellaneous_metadata/__init__.py rename to src/core/tasks/url/operators/url_html/scraper/root_url_cache/dtos/__init__.py diff --git a/src/core/tasks/operators/url_html/scraper/root_url_cache/dtos/response.py b/src/core/tasks/url/operators/url_html/scraper/root_url_cache/dtos/response.py similarity index 100% rename from src/core/tasks/operators/url_html/scraper/root_url_cache/dtos/response.py rename to src/core/tasks/url/operators/url_html/scraper/root_url_cache/dtos/response.py diff --git a/src/core/tasks/operators/url_html/tdo.py b/src/core/tasks/url/operators/url_html/tdo.py similarity index 55% rename from src/core/tasks/operators/url_html/tdo.py rename to src/core/tasks/url/operators/url_html/tdo.py index 26d9aea0..02178ff1 100644 --- a/src/core/tasks/operators/url_html/tdo.py +++ b/src/core/tasks/url/operators/url_html/tdo.py @@ -2,9 +2,9 @@ from pydantic import BaseModel -from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo from src.db.dtos.url_info import URLInfo -from src.core.tasks.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo +from src.core.tasks.url.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo class UrlHtmlTDO(BaseModel): diff --git a/src/core/tasks/url/operators/url_miscellaneous_metadata/__init__.py b/src/core/tasks/url/operators/url_miscellaneous_metadata/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/operators/url_miscellaneous_metadata/core.py b/src/core/tasks/url/operators/url_miscellaneous_metadata/core.py similarity index 80% rename from src/core/tasks/operators/url_miscellaneous_metadata/core.py rename to src/core/tasks/url/operators/url_miscellaneous_metadata/core.py index 505949b5..90694e4f 100644 --- a/src/core/tasks/operators/url_miscellaneous_metadata/core.py +++ b/src/core/tasks/url/operators/url_miscellaneous_metadata/core.py @@ -4,16 +4,16 @@ from src.db.dtos.url_error_info import URLErrorPydanticInfo from src.db.enums import TaskType from src.collectors.enums import CollectorType -from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO -from src.core.tasks.operators.base import TaskOperatorBase -from src.core.tasks.subtasks.miscellaneous_metadata.auto_googler import AutoGooglerMiscMetadataSubtask -from src.core.tasks.subtasks.miscellaneous_metadata.ckan import CKANMiscMetadataSubtask -from src.core.tasks.subtasks.miscellaneous_metadata.base import \ +from src.core.tasks.url.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO +from src.core.tasks.url.operators.base import URLTaskOperatorBase +from src.core.tasks.url.subtasks.miscellaneous_metadata.auto_googler import AutoGooglerMiscMetadataSubtask +from src.core.tasks.url.subtasks.miscellaneous_metadata.ckan import CKANMiscMetadataSubtask +from src.core.tasks.url.subtasks.miscellaneous_metadata.base import \ MiscellaneousMetadataSubtaskBase -from src.core.tasks.subtasks.miscellaneous_metadata.muckrock import MuckrockMiscMetadataSubtask +from src.core.tasks.url.subtasks.miscellaneous_metadata.muckrock import MuckrockMiscMetadataSubtask -class URLMiscellaneousMetadataTaskOperator(TaskOperatorBase): +class URLMiscellaneousMetadataTaskOperator(URLTaskOperatorBase): def __init__( self, diff --git a/src/core/tasks/operators/url_miscellaneous_metadata/tdo.py b/src/core/tasks/url/operators/url_miscellaneous_metadata/tdo.py similarity index 100% rename from src/core/tasks/operators/url_miscellaneous_metadata/tdo.py rename to src/core/tasks/url/operators/url_miscellaneous_metadata/tdo.py diff --git a/src/core/tasks/url/subtasks/__init__.py b/src/core/tasks/url/subtasks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/url/subtasks/agency_identification/__init__.py b/src/core/tasks/url/subtasks/agency_identification/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/subtasks/agency_identification/auto_googler.py b/src/core/tasks/url/subtasks/agency_identification/auto_googler.py similarity index 75% rename from src/core/tasks/subtasks/agency_identification/auto_googler.py rename to src/core/tasks/url/subtasks/agency_identification/auto_googler.py index fe52b606..6f19ee7b 100644 --- a/src/core/tasks/subtasks/agency_identification/auto_googler.py +++ b/src/core/tasks/url/subtasks/agency_identification/auto_googler.py @@ -1,8 +1,8 @@ from typing import Optional -from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.enums import SuggestionType -from src.core.tasks.subtasks.agency_identification.base import AgencyIdentificationSubtaskBase +from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo +from src.core.tasks.url.subtasks.agency_identification.base import AgencyIdentificationSubtaskBase class AutoGooglerAgencyIdentificationSubtask(AgencyIdentificationSubtaskBase): diff --git a/src/core/tasks/subtasks/agency_identification/base.py b/src/core/tasks/url/subtasks/agency_identification/base.py similarity index 75% rename from src/core/tasks/subtasks/agency_identification/base.py rename to src/core/tasks/url/subtasks/agency_identification/base.py index 957001fa..5727fcc8 100644 --- a/src/core/tasks/subtasks/agency_identification/base.py +++ b/src/core/tasks/url/subtasks/agency_identification/base.py @@ -2,7 +2,7 @@ from abc import ABC from typing import Optional -from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo +from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo class AgencyIdentificationSubtaskBase(ABC): diff --git a/src/core/tasks/subtasks/agency_identification/ckan.py b/src/core/tasks/url/subtasks/agency_identification/ckan.py similarity index 89% rename from src/core/tasks/subtasks/agency_identification/ckan.py rename to src/core/tasks/url/subtasks/agency_identification/ckan.py index a0f167e1..0d87de65 100644 --- a/src/core/tasks/subtasks/agency_identification/ckan.py +++ b/src/core/tasks/url/subtasks/agency_identification/ckan.py @@ -1,7 +1,7 @@ from typing import Optional -from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.helpers import process_match_agency_response_to_suggestions +from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.pdap_api.client import PDAPClient from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse diff --git a/src/core/tasks/subtasks/agency_identification/common_crawler.py b/src/core/tasks/url/subtasks/agency_identification/common_crawler.py similarity index 85% rename from src/core/tasks/subtasks/agency_identification/common_crawler.py rename to src/core/tasks/url/subtasks/agency_identification/common_crawler.py index 7299cbf6..fae8faaf 100644 --- a/src/core/tasks/subtasks/agency_identification/common_crawler.py +++ b/src/core/tasks/url/subtasks/agency_identification/common_crawler.py @@ -1,7 +1,7 @@ from typing import Optional -from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.enums import SuggestionType +from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo class CommonCrawlerAgencyIdentificationSubtask: diff --git a/src/core/tasks/subtasks/agency_identification/muckrock.py b/src/core/tasks/url/subtasks/agency_identification/muckrock.py similarity index 94% rename from src/core/tasks/subtasks/agency_identification/muckrock.py rename to src/core/tasks/url/subtasks/agency_identification/muckrock.py index 4415ac47..9d22f9fc 100644 --- a/src/core/tasks/subtasks/agency_identification/muckrock.py +++ b/src/core/tasks/url/subtasks/agency_identification/muckrock.py @@ -3,9 +3,9 @@ from src.collectors.source_collectors.muckrock.api_interface.core import MuckrockAPIInterface from src.collectors.source_collectors.muckrock.api_interface.lookup_response import AgencyLookupResponse from src.collectors.source_collectors.muckrock.enums import AgencyLookupResponseType -from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.exceptions import MuckrockAPIError from src.core.helpers import process_match_agency_response_to_suggestions +from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.pdap_api.client import PDAPClient from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse diff --git a/src/core/tasks/url/subtasks/miscellaneous_metadata/__init__.py b/src/core/tasks/url/subtasks/miscellaneous_metadata/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/subtasks/miscellaneous_metadata/auto_googler.py b/src/core/tasks/url/subtasks/miscellaneous_metadata/auto_googler.py similarity index 62% rename from src/core/tasks/subtasks/miscellaneous_metadata/auto_googler.py rename to src/core/tasks/url/subtasks/miscellaneous_metadata/auto_googler.py index 1a232c3b..0f183f78 100644 --- a/src/core/tasks/subtasks/miscellaneous_metadata/auto_googler.py +++ b/src/core/tasks/url/subtasks/miscellaneous_metadata/auto_googler.py @@ -1,5 +1,5 @@ -from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO -from src.core.tasks.subtasks.miscellaneous_metadata.base import \ +from src.core.tasks.url.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO +from src.core.tasks.url.subtasks.miscellaneous_metadata.base import \ MiscellaneousMetadataSubtaskBase diff --git a/src/core/tasks/subtasks/miscellaneous_metadata/base.py b/src/core/tasks/url/subtasks/miscellaneous_metadata/base.py similarity index 66% rename from src/core/tasks/subtasks/miscellaneous_metadata/base.py rename to src/core/tasks/url/subtasks/miscellaneous_metadata/base.py index 9c5d7e45..7b38504d 100644 --- a/src/core/tasks/subtasks/miscellaneous_metadata/base.py +++ b/src/core/tasks/url/subtasks/miscellaneous_metadata/base.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod -from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO +from src.core.tasks.url.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO class MiscellaneousMetadataSubtaskBase(ABC): diff --git a/src/core/tasks/subtasks/miscellaneous_metadata/ckan.py b/src/core/tasks/url/subtasks/miscellaneous_metadata/ckan.py similarity index 74% rename from src/core/tasks/subtasks/miscellaneous_metadata/ckan.py rename to src/core/tasks/url/subtasks/miscellaneous_metadata/ckan.py index ddd5a36d..90512e2b 100644 --- a/src/core/tasks/subtasks/miscellaneous_metadata/ckan.py +++ b/src/core/tasks/url/subtasks/miscellaneous_metadata/ckan.py @@ -1,5 +1,5 @@ -from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO -from src.core.tasks.subtasks.miscellaneous_metadata.base import \ +from src.core.tasks.url.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO +from src.core.tasks.url.subtasks.miscellaneous_metadata.base import \ MiscellaneousMetadataSubtaskBase diff --git a/src/core/tasks/subtasks/miscellaneous_metadata/muckrock.py b/src/core/tasks/url/subtasks/miscellaneous_metadata/muckrock.py similarity index 61% rename from src/core/tasks/subtasks/miscellaneous_metadata/muckrock.py rename to src/core/tasks/url/subtasks/miscellaneous_metadata/muckrock.py index 4d166542..bb3eaadf 100644 --- a/src/core/tasks/subtasks/miscellaneous_metadata/muckrock.py +++ b/src/core/tasks/url/subtasks/miscellaneous_metadata/muckrock.py @@ -1,5 +1,5 @@ -from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO -from src.core.tasks.subtasks.miscellaneous_metadata.base import \ +from src.core.tasks.url.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO +from src.core.tasks.url.subtasks.miscellaneous_metadata.base import \ MiscellaneousMetadataSubtaskBase diff --git a/src/db/client/async_.py b/src/db/client/async_.py index e15bccf5..92f52513 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -4,7 +4,7 @@ from typing import Optional, Type, Any, List from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, Select, not_, and_, update, delete, literal, text, bindparam +from sqlalchemy import select, exists, func, case, Select, not_, and_, update, delete, literal, text from sqlalchemy.dialects import postgresql from sqlalchemy.dialects.postgresql import insert as pg_insert from sqlalchemy.exc import IntegrityError, NoResultFound @@ -45,14 +45,14 @@ from src.collectors.enums import URLStatus, CollectorType from src.core.enums import BatchStatus, SuggestionType, RecordType, SuggestedStatus from src.core.env_var_manager import EnvVarManager -from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo -from src.core.tasks.operators.agency_identification.dtos.tdo import AgencyIdentificationTDO -from src.core.tasks.operators.agency_sync.dtos.parameters import AgencySyncParameters -from src.core.tasks.operators.submit_approved_url.tdo import SubmitApprovedURLTDO, SubmittedURLInfo -from src.core.tasks.operators.url_404_probe.tdo import URL404ProbeTDO -from src.core.tasks.operators.url_duplicate.tdo import URLDuplicateTDO -from src.core.tasks.operators.url_html.scraper.parser.util import convert_to_response_html_info -from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo +from src.core.tasks.scheduled.operators.agency_sync.dtos.parameters import AgencySyncParameters +from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo +from src.core.tasks.url.operators.agency_identification.dtos.tdo import AgencyIdentificationTDO +from src.core.tasks.url.operators.submit_approved_url.tdo import SubmitApprovedURLTDO, SubmittedURLInfo +from src.core.tasks.url.operators.url_404_probe.tdo import URL404ProbeTDO +from src.core.tasks.url.operators.url_duplicate.tdo import URLDuplicateTDO +from src.core.tasks.url.operators.url_html.scraper.parser.util import convert_to_response_html_info +from src.core.tasks.url.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo from src.db.config_manager import ConfigManager from src.db.constants import PLACEHOLDER_AGENCY_NAME from src.db.dto_converter import DTOConverter @@ -95,11 +95,13 @@ from src.db.queries.implementations.core.get_recent_batch_summaries.builder import GetRecentBatchSummariesQueryBuilder from src.db.queries.implementations.core.metrics.urls.aggregated.pending import \ GetMetricsURLSAggregatedPendingQueryBuilder -from src.db.queries.implementations.core.tasks.agency_sync.upsert import get_upsert_agencies_query +from src.db.queries.implementations.core.tasks.agency_sync.upsert import get_upsert_agencies_mappings from src.db.statement_composer import StatementComposer from src.db.types import UserSuggestionType from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInnerInfo +import logging + # Type Hints UserSuggestionModel = UserRelevantSuggestion or UserRecordTypeSuggestion or UserUrlAgencySuggestion @@ -115,9 +117,10 @@ class AsyncDatabaseClient: def __init__(self, db_url: Optional[str] = None): if db_url is None: db_url = EnvVarManager.get().get_postgres_connection_string(is_async=True) + echo = ConfigManager.get_sqlalchemy_echo() self.engine = create_async_engine( url=db_url, - echo=ConfigManager.get_sqlalchemy_echo(), + echo=echo, ) self.session_maker = async_sessionmaker(bind=self.engine, expire_on_commit=False) self.statement_composer = StatementComposer() @@ -172,6 +175,34 @@ async def bulk_update( mappings ) + @session_manager + async def bulk_upsert( + self, + session: AsyncSession, + model: Base, + mappings: list[dict], + id_value: str = "id" + ): + + query = pg_insert(model) + + set_ = {} + for k, v in mappings[0].items(): + if k == id_value: + continue + set_[k] = getattr(query.excluded, k) + + query = query.on_conflict_do_update( + index_elements=[id_value], + set_=set_ + ) + + + # Note, mapping must include primary key + await session.execute( + query, + mappings + ) @session_manager async def scalar(self, session: AsyncSession, statement): @@ -179,7 +210,7 @@ async def scalar(self, session: AsyncSession, statement): @session_manager async def scalars(self, session: AsyncSession, statement): - return (await session.execute(statement)).scalars() + return (await session.execute(statement)).scalars().all() @session_manager async def mapping(self, session: AsyncSession, statement): @@ -845,7 +876,9 @@ async def has_urls_without_agency_suggestions( return len(result) != 0 @session_manager - async def get_urls_without_agency_suggestions(self, session: AsyncSession) -> list[AgencyIdentificationTDO]: + async def get_urls_without_agency_suggestions( + self, session: AsyncSession + ) -> list[AgencyIdentificationTDO]: """ Retrieve URLs without confirmed or suggested agencies Args: @@ -2334,19 +2367,6 @@ async def get_urls_aggregated_pending_metrics( ) return result - @session_manager - async def last_full_agencies_sync_over_a_day_ago( - self, - session: AsyncSession - ) -> bool: - query = ( - select( - AgenciesSyncState.last_full_sync_at >= func.now() - text('interval \'1 day\'') - ) - ) - synced_over_a_day_ago = (await session.execute(query)).scalar() - return synced_over_a_day_ago - @session_manager async def get_agencies_sync_parameters( self, @@ -2374,8 +2394,10 @@ async def upsert_agencies( self, agencies: list[AgenciesSyncResponseInnerInfo] ): - await self.execute( - get_upsert_agencies_query(agencies) + await self.bulk_upsert( + model=Agency, + mappings=get_upsert_agencies_mappings(agencies), + id_value="agency_id", ) async def update_agencies_sync_progress(self, page: int): @@ -2391,7 +2413,7 @@ async def mark_full_agencies_sync(self): AgenciesSyncState ).values( last_full_sync_at=func.now(), - current_cutoff_date=func.now() - text('interval \'1 month\''), + current_cutoff_date=func.now() - text('interval \'1 day\''), current_page=None ) await self.execute(query) diff --git a/src/db/client/sync.py b/src/db/client/sync.py index 65456bc1..38b1a150 100644 --- a/src/db/client/sync.py +++ b/src/db/client/sync.py @@ -19,7 +19,7 @@ from src.db.models.instantiations.url.data_source import URLDataSource from src.db.models.instantiations.url.core import URL from src.db.models.instantiations.batch import Batch -from src.core.tasks.operators.submit_approved_url.tdo import SubmittedURLInfo +from src.core.tasks.url.operators.submit_approved_url.tdo import SubmittedURLInfo from src.core.env_var_manager import EnvVarManager from src.core.enums import BatchStatus diff --git a/src/db/config_manager.py b/src/db/config_manager.py index 4598ca97..2b29c88c 100644 --- a/src/db/config_manager.py +++ b/src/db/config_manager.py @@ -16,5 +16,5 @@ def get_sqlalchemy_echo() -> bool: SQLALCHEMY_ECHO is set to False by default. """ load_dotenv() - echo = os.getenv("SQLALCHEMY_ECHO", False) + echo = bool(os.getenv("SQLALCHEMY_ECHO", False)) return echo diff --git a/src/db/dto_converter.py b/src/db/dto_converter.py index 9b36f225..fb5d2dfe 100644 --- a/src/db/dto_converter.py +++ b/src/db/dto_converter.py @@ -4,8 +4,8 @@ from src.api.endpoints.review.dtos.get import FinalReviewAnnotationRelevantInfo, FinalReviewAnnotationAgencyAutoInfo, \ FinalReviewAnnotationRecordTypeInfo, FinalReviewAnnotationAgencyInfo from src.core.enums import RecordType, SuggestionType -from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo -from src.core.tasks.operators.url_html.scraper.parser.mapping import ENUM_TO_ATTRIBUTE_MAPPING +from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.core.tasks.url.operators.url_html.scraper.parser.mapping import ENUM_TO_ATTRIBUTE_MAPPING from src.db.dtos.url_html_content_info import HTMLContentType, URLHTMLContentInfo from src.db.dtos.url_info import URLInfo from src.db.dtos.url_with_html import URLWithHTML diff --git a/src/db/queries/implementations/core/final_review/get.py b/src/db/queries/implementations/core/final_review/get.py index c2640102..42a549bc 100644 --- a/src/db/queries/implementations/core/final_review/get.py +++ b/src/db/queries/implementations/core/final_review/get.py @@ -1,26 +1,22 @@ from typing import Optional, Type -from sqlalchemy import case, select, func, Select, and_, desc, asc, FromClause +from sqlalchemy import select, func, Select, and_, desc, asc, FromClause from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import joinedload from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewResponse, FinalReviewOptionalMetadata, \ FinalReviewAnnotationInfo, FinalReviewBatchInfo, GetNextURLForFinalReviewOuterResponse from src.collectors.enums import URLStatus -from src.core.tasks.operators.url_html.scraper.parser.util import convert_to_response_html_info +from src.core.tasks.url.operators.url_html.scraper.parser.util import convert_to_response_html_info from src.db.constants import ALL_ANNOTATION_MODELS, USER_ANNOTATION_MODELS from src.db.dto_converter import DTOConverter from src.db.dtos.url_html_content_info import URLHTMLContentInfo from src.db.exceptions import FailedQueryException from src.db.models.instantiations.batch import Batch from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency +from src.db.models.instantiations.url.core import URL from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion -from src.db.models.instantiations.url.suggestion.record_type.auto import AutoRecordTypeSuggestion from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion -from src.db.models.instantiations.url.core import URL -from src.db.models.instantiations.url.suggestion.record_type.user import UserRecordTypeSuggestion -from src.db.models.instantiations.url.suggestion.relevant.auto import AutoRelevantSuggestion -from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion from src.db.models.mixins import URLDependentMixin from src.db.queries.base.builder import QueryBuilderBase from src.db.queries.implementations.core.common.annotation_exists import AnnotationExistsCTEQueryBuilder diff --git a/src/db/queries/implementations/core/tasks/agency_sync/upsert.py b/src/db/queries/implementations/core/tasks/agency_sync/upsert.py index 0e6c67b6..8e9406fe 100644 --- a/src/db/queries/implementations/core/tasks/agency_sync/upsert.py +++ b/src/db/queries/implementations/core/tasks/agency_sync/upsert.py @@ -1,13 +1,10 @@ -from sqlalchemy.dialects.postgresql import insert as pg_insert - -from src.db.models.instantiations.sync_state_agencies import AgenciesSyncState from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInnerInfo -def get_upsert_agencies_query( +def get_upsert_agencies_mappings( agencies: list[AgenciesSyncResponseInnerInfo] -): - agency_dicts = {} +) -> list[dict]: + agency_dicts = [] for agency in agencies: agency_dict = { 'agency_id': agency.agency_id, @@ -15,24 +12,8 @@ def get_upsert_agencies_query( 'state': agency.state_name, 'county': agency.county_name, 'locality': agency.locality_name, - 'updated_at': agency.updated_at - } - agency_dicts[agency.pdap_agency_id] = agency_dict - - stmt = ( - pg_insert(AgenciesSyncState) - .values(agency_dicts) - ) - - stmt = stmt.on_conflict_do_update( - index_elements=['agency_id'], - set_={ - 'name': stmt.excluded.name, - 'state': stmt.excluded.state, - 'county': stmt.excluded.county, - 'locality': stmt.excluded.locality, - 'updated_at': stmt.excluded.updated_at + 'ds_last_updated_at': agency.updated_at } - ) + agency_dicts.append(agency_dict) - return stmt \ No newline at end of file + return agency_dicts \ No newline at end of file diff --git a/src/pdap_api/client.py b/src/pdap_api/client.py index 2f1adabb..22cdc3cd 100644 --- a/src/pdap_api/client.py +++ b/src/pdap_api/client.py @@ -2,8 +2,8 @@ from pdap_access_manager import AccessManager, DataSourcesNamespaces, RequestInfo, RequestType -from src.core.tasks.operators.agency_sync.dtos.parameters import AgencySyncParameters -from src.core.tasks.operators.submit_approved_url.tdo import SubmitApprovedURLTDO, SubmittedURLInfo +from src.core.tasks.scheduled.operators.agency_sync.dtos.parameters import AgencySyncParameters +from src.core.tasks.url.operators.submit_approved_url.tdo import SubmitApprovedURLTDO, SubmittedURLInfo from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInnerInfo, AgenciesSyncResponseInfo from src.pdap_api.dtos.match_agency.post import MatchAgencyInfo from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse diff --git a/start_mirrored_local_app.py b/start_mirrored_local_app.py index 7bcd573f..5199fba2 100644 --- a/start_mirrored_local_app.py +++ b/start_mirrored_local_app.py @@ -46,7 +46,7 @@ def main(): # Run `fastapi dev main.py` try: uvicorn.run( - "api.main:app", + "src.api.main:app", host="0.0.0.0", port=8000 ) diff --git a/tests/automated/integration/api/test_annotate.py b/tests/automated/integration/api/test_annotate.py index 04102fe0..b869c80a 100644 --- a/tests/automated/integration/api/test_annotate.py +++ b/tests/automated/integration/api/test_annotate.py @@ -9,7 +9,7 @@ from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseOuterInfo from src.api.endpoints.annotate.dtos.relevance.post import RelevanceAnnotationPostInfo from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseOuterInfo -from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo from src.db.dtos.insert_urls_info import InsertURLsInfo from src.db.dtos.url_mapping import URLMapping from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion diff --git a/tests/automated/integration/api/test_task.py b/tests/automated/integration/api/test_task.py index e74908e3..95ebe003 100644 --- a/tests/automated/integration/api/test_task.py +++ b/tests/automated/integration/api/test_task.py @@ -49,7 +49,7 @@ async def test_get_task_status(api_test_helper): assert response.status == TaskType.IDLE for task in [task for task in TaskType]: - await ath.async_core.task_manager.set_task_status(task) + await ath.async_core.task_manager.set_manager_status(task) response = await ath.request_validator.get_current_task_status() assert response.status == task diff --git a/tests/automated/integration/core/async_/__init__.py b/tests/automated/integration/core/async_/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/core/async_/conclude_task/__init__.py b/tests/automated/integration/core/async_/conclude_task/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/core/async_/conclude_task/conftest.py b/tests/automated/integration/core/async_/conclude_task/conftest.py new file mode 100644 index 00000000..8a49272f --- /dev/null +++ b/tests/automated/integration/core/async_/conclude_task/conftest.py @@ -0,0 +1,18 @@ +import pytest_asyncio + +from tests.automated.integration.core.async_.conclude_task.setup_info import TestAsyncCoreSetupInfo + + +@pytest_asyncio.fixture +async def setup(db_data_creator) -> TestAsyncCoreSetupInfo: + ddc = db_data_creator + + batch_id = ddc.batch() + url_ids = ddc.urls(batch_id=batch_id, url_count=3).url_ids + task_id = await ddc.task() + + return TestAsyncCoreSetupInfo( + batch_id=batch_id, + task_id=task_id, + url_ids=url_ids + ) \ No newline at end of file diff --git a/tests/automated/integration/core/async_/conclude_task/helpers.py b/tests/automated/integration/core/async_/conclude_task/helpers.py new file mode 100644 index 00000000..35e106c8 --- /dev/null +++ b/tests/automated/integration/core/async_/conclude_task/helpers.py @@ -0,0 +1,19 @@ +from src.core.tasks.dtos.run_info import URLTaskOperatorRunInfo +from src.core.tasks.url.enums import TaskOperatorOutcome +from src.db.enums import TaskType +from tests.automated.integration.core.async_.conclude_task.setup_info import TestAsyncCoreSetupInfo + + +def setup_run_info( + setup_info: TestAsyncCoreSetupInfo, + outcome: TaskOperatorOutcome, + message: str = "" +): + run_info = URLTaskOperatorRunInfo( + task_id=setup_info.task_id, + task_type=TaskType.HTML, + linked_url_ids=setup_info.url_ids, + outcome=outcome, + message=message, + ) + return run_info \ No newline at end of file diff --git a/tests/automated/integration/core/async_/conclude_task/setup_info.py b/tests/automated/integration/core/async_/conclude_task/setup_info.py new file mode 100644 index 00000000..05d132f2 --- /dev/null +++ b/tests/automated/integration/core/async_/conclude_task/setup_info.py @@ -0,0 +1,9 @@ +from pydantic import BaseModel + + +class TestAsyncCoreSetupInfo(BaseModel): + batch_id: int + url_ids: list[int] + task_id: int + + diff --git a/tests/automated/integration/core/async_/conclude_task/test_error.py b/tests/automated/integration/core/async_/conclude_task/test_error.py new file mode 100644 index 00000000..0f92fd26 --- /dev/null +++ b/tests/automated/integration/core/async_/conclude_task/test_error.py @@ -0,0 +1,32 @@ +import pytest + +from src.core.enums import BatchStatus +from src.core.tasks.dtos.run_info import URLTaskOperatorRunInfo +from src.core.tasks.url.enums import TaskOperatorOutcome +from src.db.enums import TaskType +from tests.automated.integration.core.async_.conclude_task.helpers import setup_run_info +from tests.automated.integration.core.async_.conclude_task.setup_info import TestAsyncCoreSetupInfo +from tests.automated.integration.core.async_.helpers import setup_async_core +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_conclude_task_error( + db_data_creator: DBDataCreator, + setup: TestAsyncCoreSetupInfo +): + ddc = db_data_creator + run_info = setup_run_info( + setup_info=setup, + outcome=TaskOperatorOutcome.ERROR, + message="test error" + ) + + core = setup_async_core(db_data_creator.adb_client) + await core.task_manager.conclude_task(run_info=run_info) + + task_info = await ddc.adb_client.get_task_info(task_id=setup.task_id) + + assert task_info.task_status == BatchStatus.ERROR + assert task_info.error_info == "test error" + assert len(task_info.urls) == 3 diff --git a/tests/automated/integration/core/async_/conclude_task/test_success.py b/tests/automated/integration/core/async_/conclude_task/test_success.py new file mode 100644 index 00000000..19bd0f4f --- /dev/null +++ b/tests/automated/integration/core/async_/conclude_task/test_success.py @@ -0,0 +1,31 @@ +import pytest + +from src.core.enums import BatchStatus +from src.core.tasks.dtos.run_info import URLTaskOperatorRunInfo +from src.core.tasks.url.enums import TaskOperatorOutcome +from src.db.enums import TaskType +from tests.automated.integration.core.async_.conclude_task.helpers import setup_run_info +from tests.automated.integration.core.async_.conclude_task.setup_info import TestAsyncCoreSetupInfo +from tests.automated.integration.core.async_.helpers import setup_async_core +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_conclude_task_success( + db_data_creator: DBDataCreator, + setup: TestAsyncCoreSetupInfo +): + ddc = db_data_creator + + run_info = setup_run_info( + setup_info=setup, + outcome=TaskOperatorOutcome.SUCCESS + ) + + core = setup_async_core(db_data_creator.adb_client) + await core.task_manager.conclude_task(run_info=run_info) + + task_info = await ddc.adb_client.get_task_info(task_id=setup.task_id) + + assert task_info.task_status == BatchStatus.READY_TO_LABEL + assert len(task_info.urls) == 3 diff --git a/tests/automated/integration/core/async_/helpers.py b/tests/automated/integration/core/async_/helpers.py new file mode 100644 index 00000000..5ae32089 --- /dev/null +++ b/tests/automated/integration/core/async_/helpers.py @@ -0,0 +1,20 @@ +from unittest.mock import AsyncMock + +from src.core.core import AsyncCore +from src.core.tasks.handler import TaskHandler +from src.core.tasks.url.manager import TaskManager +from src.db.client.async_ import AsyncDatabaseClient + + +def setup_async_core(adb_client: AsyncDatabaseClient): + return AsyncCore( + adb_client=adb_client, + task_manager=TaskManager( + loader=AsyncMock(), + handler=TaskHandler( + adb_client=adb_client, + discord_poster=AsyncMock() + ), + ), + collector_manager=AsyncMock() + ) diff --git a/tests/automated/integration/core/async_/run_task/__init__.py b/tests/automated/integration/core/async_/run_task/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/core/async_/run_task/test_break_loop.py b/tests/automated/integration/core/async_/run_task/test_break_loop.py new file mode 100644 index 00000000..e438c26d --- /dev/null +++ b/tests/automated/integration/core/async_/run_task/test_break_loop.py @@ -0,0 +1,43 @@ +import types +from unittest.mock import AsyncMock + +import pytest + +from src.db.enums import TaskType +from src.core.tasks.dtos.run_info import URLTaskOperatorRunInfo +from src.core.tasks.url.enums import TaskOperatorOutcome +from tests.automated.integration.core.async_.helpers import setup_async_core +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_run_task_break_loop(db_data_creator: DBDataCreator): + """ + If the task loop for a single task runs more than 20 times in a row, + this is considered suspicious and possibly indicative of a bug. + In this case, the task loop should be terminated + and an alert should be sent to discord + """ + + async def run_task(self, task_id: int) -> URLTaskOperatorRunInfo: + return URLTaskOperatorRunInfo( + task_id=task_id, + outcome=TaskOperatorOutcome.SUCCESS, + linked_url_ids=[1, 2, 3], + task_type=TaskType.HTML + ) + + core = setup_async_core(db_data_creator.adb_client) + core.task_manager.conclude_task = AsyncMock() + + mock_operator = AsyncMock() + mock_operator.meets_task_prerequisites = AsyncMock(return_value=True) + mock_operator.task_type = TaskType.HTML + mock_operator.run_task = types.MethodType(run_task, mock_operator) + + core.task_manager.loader.get_task_operators = AsyncMock(return_value=[mock_operator]) + await core.task_manager.trigger_task_run() + + core.task_manager.handler.discord_poster.post_to_discord.assert_called_once_with( + message="Task HTML has been run more than 20 times in a row. Task loop terminated." + ) diff --git a/tests/automated/integration/core/async_/run_task/test_prereq_met.py b/tests/automated/integration/core/async_/run_task/test_prereq_met.py new file mode 100644 index 00000000..b171402d --- /dev/null +++ b/tests/automated/integration/core/async_/run_task/test_prereq_met.py @@ -0,0 +1,51 @@ +import types +from unittest.mock import AsyncMock, call + +import pytest + +from src.core.enums import BatchStatus +from src.core.tasks.dtos.run_info import URLTaskOperatorRunInfo +from src.core.tasks.url.enums import TaskOperatorOutcome +from src.db.enums import TaskType +from src.db.models.instantiations.task.core import Task +from tests.automated.integration.core.async_.helpers import setup_async_core +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_run_task_prereq_met(db_data_creator: DBDataCreator): + """ + When a task pre-requisite is met, the task should be run + And a task entry should be created in the database + """ + + async def run_task(self, task_id: int) -> URLTaskOperatorRunInfo: + return URLTaskOperatorRunInfo( + task_id=task_id, + task_type=TaskType.HTML, + outcome=TaskOperatorOutcome.SUCCESS, + linked_url_ids=[1, 2, 3] + ) + + core = setup_async_core(db_data_creator.adb_client) + core.task_manager.conclude_task = AsyncMock() + + mock_operator = AsyncMock() + mock_operator.meets_task_prerequisites = AsyncMock( + side_effect=[True, False] + ) + mock_operator.task_type = TaskType.HTML + mock_operator.run_task = types.MethodType(run_task, mock_operator) + + core.task_manager.loader.get_task_operators = AsyncMock(return_value=[mock_operator]) + await core.run_tasks() + + # There should be two calls to meets_task_prerequisites + mock_operator.meets_task_prerequisites.assert_has_calls([call(), call()]) + + results = await db_data_creator.adb_client.get_all(Task) + + assert len(results) == 1 + assert results[0].task_status == BatchStatus.IN_PROCESS.value + + core.task_manager.conclude_task.assert_called_once() diff --git a/tests/automated/integration/core/async_/run_task/test_prereq_not_met.py b/tests/automated/integration/core/async_/run_task/test_prereq_not_met.py new file mode 100644 index 00000000..ef068cd5 --- /dev/null +++ b/tests/automated/integration/core/async_/run_task/test_prereq_not_met.py @@ -0,0 +1,21 @@ +from unittest.mock import AsyncMock + +import pytest + +from tests.automated.integration.core.async_.helpers import setup_async_core + + +@pytest.mark.asyncio +async def test_run_task_prereq_not_met(): + """ + When a task pre-requisite is not met, the task should not be run + """ + core = setup_async_core(AsyncMock()) + + mock_operator = AsyncMock() + mock_operator.meets_task_prerequisites = AsyncMock(return_value=False) + core.task_manager.loader.get_task_operators = AsyncMock(return_value=[mock_operator]) + await core.run_tasks() + + mock_operator.meets_task_prerequisites.assert_called_once() + mock_operator.run_task.assert_not_called() diff --git a/tests/automated/integration/core/test_async_core.py b/tests/automated/integration/core/test_async_core.py deleted file mode 100644 index 40ee6b8c..00000000 --- a/tests/automated/integration/core/test_async_core.py +++ /dev/null @@ -1,176 +0,0 @@ -import types -from unittest.mock import AsyncMock, call - -import pytest - -from src.db.client.async_ import AsyncDatabaseClient -from src.db.enums import TaskType -from src.db.models.instantiations.task.core import Task -from src.core.core import AsyncCore -from src.core.tasks.dtos.run_info import TaskOperatorRunInfo -from src.core.tasks.enums import TaskOperatorOutcome -from src.core.tasks.manager import TaskManager -from src.core.enums import BatchStatus -from tests.helpers.db_data_creator import DBDataCreator - -def setup_async_core(adb_client: AsyncDatabaseClient): - return AsyncCore( - adb_client=adb_client, - task_manager=TaskManager( - adb_client=adb_client, - url_request_interface=AsyncMock(), - html_parser=AsyncMock(), - discord_poster=AsyncMock(), - pdap_client=AsyncMock(), - muckrock_api_interface=AsyncMock(), - ), - collector_manager=AsyncMock() - ) - -@pytest.mark.asyncio -async def test_conclude_task_success(db_data_creator: DBDataCreator): - ddc = db_data_creator - - batch_id = ddc.batch() - url_ids = ddc.urls(batch_id=batch_id, url_count=3).url_ids - task_id = await ddc.task() - run_info = TaskOperatorRunInfo( - task_id=task_id, - linked_url_ids=url_ids, - outcome=TaskOperatorOutcome.SUCCESS, - ) - - core = setup_async_core(db_data_creator.adb_client) - await core.conclude_task(run_info=run_info) - - task_info = await ddc.adb_client.get_task_info(task_id=task_id) - - assert task_info.task_status == BatchStatus.READY_TO_LABEL - assert len(task_info.urls) == 3 - -@pytest.mark.asyncio -async def test_conclude_task_success(db_data_creator: DBDataCreator): - ddc = db_data_creator - - batch_id = ddc.batch() - url_ids = ddc.urls(batch_id=batch_id, url_count=3).url_ids - task_id = await ddc.task() - run_info = TaskOperatorRunInfo( - task_id=task_id, - linked_url_ids=url_ids, - outcome=TaskOperatorOutcome.SUCCESS, - ) - - core = setup_async_core(db_data_creator.adb_client) - await core.task_manager.conclude_task(run_info=run_info) - - task_info = await ddc.adb_client.get_task_info(task_id=task_id) - - assert task_info.task_status == BatchStatus.READY_TO_LABEL - assert len(task_info.urls) == 3 - -@pytest.mark.asyncio -async def test_conclude_task_error(db_data_creator: DBDataCreator): - ddc = db_data_creator - - batch_id = ddc.batch() - url_ids = ddc.urls(batch_id=batch_id, url_count=3).url_ids - task_id = await ddc.task() - run_info = TaskOperatorRunInfo( - task_id=task_id, - linked_url_ids=url_ids, - outcome=TaskOperatorOutcome.ERROR, - message="test error", - ) - - core = setup_async_core(db_data_creator.adb_client) - await core.task_manager.conclude_task(run_info=run_info) - - task_info = await ddc.adb_client.get_task_info(task_id=task_id) - - assert task_info.task_status == BatchStatus.ERROR - assert task_info.error_info == "test error" - assert len(task_info.urls) == 3 - -@pytest.mark.asyncio -async def test_run_task_prereq_not_met(): - """ - When a task pre-requisite is not met, the task should not be run - """ - core = setup_async_core(AsyncMock()) - - mock_operator = AsyncMock() - mock_operator.meets_task_prerequisites = AsyncMock(return_value=False) - core.task_manager.get_task_operators = AsyncMock(return_value=[mock_operator]) - await core.run_tasks() - - mock_operator.meets_task_prerequisites.assert_called_once() - mock_operator.run_task.assert_not_called() - -@pytest.mark.asyncio -async def test_run_task_prereq_met(db_data_creator: DBDataCreator): - """ - When a task pre-requisite is met, the task should be run - And a task entry should be created in the database - """ - - async def run_task(self, task_id: int) -> TaskOperatorRunInfo: - return TaskOperatorRunInfo( - task_id=task_id, - outcome=TaskOperatorOutcome.SUCCESS, - linked_url_ids=[1, 2, 3] - ) - - core = setup_async_core(db_data_creator.adb_client) - core.task_manager.conclude_task = AsyncMock() - - mock_operator = AsyncMock() - mock_operator.meets_task_prerequisites = AsyncMock( - side_effect=[True, False] - ) - mock_operator.task_type = TaskType.HTML - mock_operator.run_task = types.MethodType(run_task, mock_operator) - - core.task_manager.get_task_operators = AsyncMock(return_value=[mock_operator]) - await core.run_tasks() - - # There should be two calls to meets_task_prerequisites - mock_operator.meets_task_prerequisites.assert_has_calls([call(), call()]) - - results = await db_data_creator.adb_client.get_all(Task) - - assert len(results) == 1 - assert results[0].task_status == BatchStatus.IN_PROCESS.value - - core.task_manager.conclude_task.assert_called_once() - -@pytest.mark.asyncio -async def test_run_task_break_loop(db_data_creator: DBDataCreator): - """ - If the task loop for a single task runs more than 20 times in a row, - this is considered suspicious and possibly indicative of a bug. - In this case, the task loop should be terminated - and an alert should be sent to discord - """ - - async def run_task(self, task_id: int) -> TaskOperatorRunInfo: - return TaskOperatorRunInfo( - task_id=task_id, - outcome=TaskOperatorOutcome.SUCCESS, - linked_url_ids=[1, 2, 3] - ) - - core = setup_async_core(db_data_creator.adb_client) - core.task_manager.conclude_task = AsyncMock() - - mock_operator = AsyncMock() - mock_operator.meets_task_prerequisites = AsyncMock(return_value=True) - mock_operator.task_type = TaskType.HTML - mock_operator.run_task = types.MethodType(run_task, mock_operator) - - core.task_manager.get_task_operators = AsyncMock(return_value=[mock_operator]) - await core.task_manager.trigger_task_run() - - core.task_manager.discord_poster.post_to_discord.assert_called_once_with( - message="Task HTML has been run more than 20 times in a row. Task loop terminated." - ) diff --git a/tests/automated/integration/db/test_database_structure.py b/tests/automated/integration/db/test_database_structure.py index c07ffb33..e95e218e 100644 --- a/tests/automated/integration/db/test_database_structure.py +++ b/tests/automated/integration/db/test_database_structure.py @@ -16,12 +16,12 @@ from sqlalchemy.dialects import postgresql from sqlalchemy.exc import DataError +from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.db.dtos.insert_urls_info import InsertURLsInfo from src.db.enums import URLHTMLContentType from src.db.helpers import get_postgres_connection_string from src.db.models.instantiations.agency import Agency from src.collectors.enums import CollectorType, URLStatus -from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.enums import BatchStatus, SuggestionType from src.db.models.templates import Base from src.util.helper_functions import get_enum_values diff --git a/tests/automated/integration/html_tag_collector/test_root_url_cache.py b/tests/automated/integration/html_tag_collector/test_root_url_cache.py index f5bf820d..16ab5941 100644 --- a/tests/automated/integration/html_tag_collector/test_root_url_cache.py +++ b/tests/automated/integration/html_tag_collector/test_root_url_cache.py @@ -1,7 +1,7 @@ import pytest -from src.core.tasks.operators.url_html.scraper.root_url_cache.core import RootURLCache -from src.core.tasks.operators.url_html.scraper.root_url_cache.dtos.response import RootURLCacheResponseInfo +from src.core.tasks.url.operators.url_html.scraper.root_url_cache.core import RootURLCache +from src.core.tasks.url.operators.url_html.scraper.root_url_cache.dtos.response import RootURLCacheResponseInfo async def mock_get_request(url: str) -> RootURLCacheResponseInfo: diff --git a/tests/automated/integration/tasks/agency_sync/conftest.py b/tests/automated/integration/tasks/agency_sync/conftest.py index da103736..587b85fa 100644 --- a/tests/automated/integration/tasks/agency_sync/conftest.py +++ b/tests/automated/integration/tasks/agency_sync/conftest.py @@ -1,10 +1,6 @@ -from unittest.mock import patch - -import pytest import pytest_asyncio -from src.core.tasks.operators.agency_sync.core import SyncAgenciesTaskOperator -from tests.automated.integration.tasks.agency_sync.data import AGENCIES_SYNC_RESPONSES +from src.core.tasks.scheduled.operators.agency_sync.core import SyncAgenciesTaskOperator from tests.automated.integration.tasks.agency_sync.helpers import update_existing_agencies_updated_at, \ add_existing_agencies diff --git a/tests/automated/integration/tasks/agency_sync/data.py b/tests/automated/integration/tasks/agency_sync/data.py index 223e17ff..ecf50a00 100644 --- a/tests/automated/integration/tasks/agency_sync/data.py +++ b/tests/automated/integration/tasks/agency_sync/data.py @@ -28,32 +28,32 @@ FIRST_CALL_RESPONSE = AgenciesSyncResponseInfo( agencies=[ AgenciesSyncResponseInnerInfo( - display_name="New Agency 1", - agency_id=1, + display_name="New Agency 3", + agency_id=3, state_name=None, county_name=None, locality_name=None, updated_at=datetime(2022, 3, 5, 7, 6, 9) ), AgenciesSyncResponseInnerInfo( - display_name="New Agency 2", - agency_id=2, + display_name="New Agency 4", + agency_id=4, state_name="Ohio", county_name=None, locality_name=None, updated_at=datetime(2024, 9, 5, 7, 6, 9) ), AgenciesSyncResponseInnerInfo( - display_name="New Agency 3", - agency_id=1, + display_name="New Agency 5", + agency_id=5, state_name="AL", county_name="AL County", locality_name=None, updated_at=datetime(2023, 12, 4, 0, 0, 0) ), AgenciesSyncResponseInnerInfo( - display_name="Test Agency 2", - agency_id=2, + display_name="New Agency 6", + agency_id=6, state_name="TX", county_name="TX County", locality_name="TX City", diff --git a/tests/automated/integration/tasks/agency_sync/helpers.py b/tests/automated/integration/tasks/agency_sync/helpers.py index 61a92814..12c13ff5 100644 --- a/tests/automated/integration/tasks/agency_sync/helpers.py +++ b/tests/automated/integration/tasks/agency_sync/helpers.py @@ -2,7 +2,7 @@ from datetime import timedelta from unittest.mock import patch -from sqlalchemy import select, func +from sqlalchemy import select, func, TIMESTAMP, cast from src.db.client.async_ import AsyncDatabaseClient from src.db.models.instantiations.agency import Agency @@ -12,11 +12,12 @@ async def check_sync_concluded( - db_client: AsyncDatabaseClient + db_client: AsyncDatabaseClient, + check_updated_at: bool = True ): current_db_datetime = await db_client.scalar( select( - func.current_timestamp() + cast(func.now(), TIMESTAMP) ) ) @@ -27,7 +28,10 @@ async def check_sync_concluded( ) assert sync_state_results.current_page is None assert sync_state_results.last_full_sync_at > current_db_datetime - timedelta(minutes=5) - assert sync_state_results.current_cutoff_date > current_db_datetime - timedelta(days=2) + assert sync_state_results.current_cutoff_date > (current_db_datetime - timedelta(days=2)).date() + + if not check_updated_at: + return updated_ats = await db_client.scalars( select( diff --git a/tests/automated/integration/tasks/agency_sync/test_happy_path.py b/tests/automated/integration/tasks/agency_sync/test_happy_path.py index be1371ea..c8a29fb5 100644 --- a/tests/automated/integration/tasks/agency_sync/test_happy_path.py +++ b/tests/automated/integration/tasks/agency_sync/test_happy_path.py @@ -1,13 +1,15 @@ -from unittest.mock import patch, MagicMock, call +from unittest.mock import MagicMock, call import pytest +from sqlalchemy import select -from src.core.tasks.operators.agency_sync.core import SyncAgenciesTaskOperator -from src.core.tasks.operators.agency_sync.dtos.parameters import AgencySyncParameters +from src.core.tasks.scheduled.operators.agency_sync.core import SyncAgenciesTaskOperator +from src.core.tasks.scheduled.operators.agency_sync.dtos.parameters import AgencySyncParameters from src.db.models.instantiations.agency import Agency from tests.automated.integration.tasks.agency_sync.data import AGENCIES_SYNC_RESPONSES from tests.automated.integration.tasks.agency_sync.existence_checker import AgencyChecker from tests.automated.integration.tasks.agency_sync.helpers import check_sync_concluded, patch_sync_agencies +from tests.helpers.assert_functions import assert_task_run_success @pytest.mark.asyncio @@ -17,39 +19,38 @@ async def test_agency_sync_happy_path( operator = setup db_client = operator.adb_client - assert await operator.meets_task_prerequisites() with patch_sync_agencies(AGENCIES_SYNC_RESPONSES): - await operator.run_task(1) + run_info = await operator.run_task(1) + assert_task_run_success(run_info) mock_func: MagicMock = operator.pdap_client.sync_agencies mock_func.assert_has_calls( [ call( - params=AgencySyncParameters( + AgencySyncParameters( cutoff_date=None, page=1 ) ), call( - params=AgencySyncParameters( + AgencySyncParameters( cutoff_date=None, page=2 ) ), call( - params=AgencySyncParameters( + AgencySyncParameters( cutoff_date=None, page=3 ) ) ] ) - assert not await operator.meets_task_prerequisites() await check_sync_concluded(db_client) # Check six entries in database - agencies: list[Agency] = await db_client.scalars(Agency) + agencies: list[Agency] = await db_client.scalars(select(Agency)) assert len(agencies) == 6 checker = AgencyChecker() diff --git a/tests/automated/integration/tasks/agency_sync/test_interruption.py b/tests/automated/integration/tasks/agency_sync/test_interruption.py index 34847bea..d37fe395 100644 --- a/tests/automated/integration/tasks/agency_sync/test_interruption.py +++ b/tests/automated/integration/tasks/agency_sync/test_interruption.py @@ -1,15 +1,15 @@ -from datetime import datetime - import pytest -from sqlalchemy import select, insert, update +from sqlalchemy import select -from src.core.tasks.operators.agency_sync.core import SyncAgenciesTaskOperator +from src.core.tasks.scheduled.operators.agency_sync.core import SyncAgenciesTaskOperator +from src.core.tasks.url.enums import TaskOperatorOutcome from src.db.models.instantiations.agency import Agency from src.db.models.instantiations.sync_state_agencies import AgenciesSyncState -from tests.automated.integration.tasks.agency_sync.data import AGENCIES_SYNC_RESPONSES, FIRST_CALL_RESPONSE, \ +from tests.automated.integration.tasks.agency_sync.data import FIRST_CALL_RESPONSE, \ THIRD_CALL_RESPONSE, SECOND_CALL_RESPONSE from tests.automated.integration.tasks.agency_sync.existence_checker import AgencyChecker from tests.automated.integration.tasks.agency_sync.helpers import patch_sync_agencies, check_sync_concluded +from tests.helpers.assert_functions import assert_task_run_success @pytest.mark.asyncio @@ -28,9 +28,9 @@ async def test_agency_sync_interruption( with patch_sync_agencies( [FIRST_CALL_RESPONSE, ValueError("test error")] ): - await operator.run_task(1) + run_info = await operator.run_task(1) + assert run_info.outcome == TaskOperatorOutcome.ERROR, run_info.message - assert await operator.meets_task_prerequisites() # Get current updated_ats from database for the 5 recently updated query = ( @@ -54,14 +54,12 @@ async def test_agency_sync_interruption( AgenciesSyncState ) ) - assert sync_state_results.current_page == 1 + assert sync_state_results.current_page == 2 assert sync_state_results.last_full_sync_at is None assert sync_state_results.current_cutoff_date is None with patch_sync_agencies([SECOND_CALL_RESPONSE, THIRD_CALL_RESPONSE]): await operator.run_task(2) - assert not await operator.meets_task_prerequisites() - await check_sync_concluded(db_client) diff --git a/tests/automated/integration/tasks/agency_sync/test_no_new_results.py b/tests/automated/integration/tasks/agency_sync/test_no_new_results.py index 03839f39..b0c9377c 100644 --- a/tests/automated/integration/tasks/agency_sync/test_no_new_results.py +++ b/tests/automated/integration/tasks/agency_sync/test_no_new_results.py @@ -1,11 +1,11 @@ from datetime import datetime -from unittest.mock import MagicMock +from unittest.mock import AsyncMock import pytest -from sqlalchemy import update +from sqlalchemy import select -from src.core.tasks.operators.agency_sync.core import SyncAgenciesTaskOperator -from src.core.tasks.operators.agency_sync.dtos.parameters import AgencySyncParameters +from src.core.tasks.scheduled.operators.agency_sync.core import SyncAgenciesTaskOperator +from src.core.tasks.scheduled.operators.agency_sync.dtos.parameters import AgencySyncParameters from src.db.models.instantiations.agency import Agency from src.db.models.instantiations.sync_state_agencies import AgenciesSyncState from tests.automated.integration.tasks.agency_sync.data import THIRD_CALL_RESPONSE @@ -24,8 +24,8 @@ async def test_agency_sync_task_no_new_results( cutoff_date = datetime(2025, 5, 1).date() # Add cutoff date to database - await db_client.execute( - update(AgenciesSyncState).values( + await db_client.add( + AgenciesSyncState( current_cutoff_date=cutoff_date ) ) @@ -33,21 +33,18 @@ async def test_agency_sync_task_no_new_results( with patch_sync_agencies([THIRD_CALL_RESPONSE]): run_info = await operator.run_task(1) assert_task_run_success(run_info) - mock_func: MagicMock = operator.pdap_client.sync_agencies + mock_func: AsyncMock = operator.pdap_client.sync_agencies mock_func.assert_called_once_with( - params=AgencySyncParameters( + AgencySyncParameters( cutoff_date=cutoff_date, page=1 ) ) - - assert not await operator.meets_task_prerequisites() - - await check_sync_concluded(db_client) + await check_sync_concluded(db_client, check_updated_at=False) # Check two entries in database - agencies: list[Agency] = await db_client.scalars(Agency) + agencies: list[Agency] = await db_client.scalars(select(Agency)) assert len(agencies) == 2 # Neither should be updated with new values diff --git a/tests/automated/integration/tasks/test_agency_preannotation_task.py b/tests/automated/integration/tasks/test_agency_preannotation_task.py index fc187c3e..ad2f9b3a 100644 --- a/tests/automated/integration/tasks/test_agency_preannotation_task.py +++ b/tests/automated/integration/tasks/test_agency_preannotation_task.py @@ -8,19 +8,19 @@ from src.collectors.source_collectors.muckrock.api_interface.core import MuckrockAPIInterface from src.collectors.source_collectors.muckrock.api_interface.lookup_response import AgencyLookupResponse from src.collectors.source_collectors.muckrock.enums import AgencyLookupResponseType -from src.core.tasks.operators.agency_identification.core import AgencyIdentificationTaskOperator +from src.core.tasks.url.operators.agency_identification.core import AgencyIdentificationTaskOperator +from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion from src.pdap_api.enums import MatchAgencyResponseStatus from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters from src.db.models.instantiations.agency import Agency from src.collectors.enums import CollectorType, URLStatus -from src.core.tasks.enums import TaskOperatorOutcome -from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo -from src.core.tasks.subtasks.agency_identification.auto_googler import AutoGooglerAgencyIdentificationSubtask -from src.core.tasks.subtasks.agency_identification.ckan import CKANAgencyIdentificationSubtask -from src.core.tasks.subtasks.agency_identification.common_crawler import CommonCrawlerAgencyIdentificationSubtask -from src.core.tasks.subtasks.agency_identification.muckrock import MuckrockAgencyIdentificationSubtask +from src.core.tasks.url.enums import TaskOperatorOutcome +from src.core.tasks.url.subtasks.agency_identification.auto_googler import AutoGooglerAgencyIdentificationSubtask +from src.core.tasks.url.subtasks.agency_identification.ckan import CKANAgencyIdentificationSubtask +from src.core.tasks.url.subtasks.agency_identification.common_crawler import CommonCrawlerAgencyIdentificationSubtask +from src.core.tasks.url.subtasks.agency_identification.muckrock import MuckrockAgencyIdentificationSubtask from src.core.enums import SuggestionType from pdap_access_manager import AccessManager from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse diff --git a/tests/automated/integration/tasks/test_example_task.py b/tests/automated/integration/tasks/test_example_task.py index 6a77f890..9a2a2fc9 100644 --- a/tests/automated/integration/tasks/test_example_task.py +++ b/tests/automated/integration/tasks/test_example_task.py @@ -3,11 +3,11 @@ import pytest from src.db.enums import TaskType -from src.core.tasks.enums import TaskOperatorOutcome -from src.core.tasks.operators.base import TaskOperatorBase +from src.core.tasks.url.enums import TaskOperatorOutcome +from src.core.tasks.url.operators.base import URLTaskOperatorBase from tests.helpers.db_data_creator import DBDataCreator -class ExampleTaskOperator(TaskOperatorBase): +class ExampleTaskOperator(URLTaskOperatorBase): @property def task_type(self) -> TaskType: diff --git a/tests/automated/integration/tasks/test_submit_approved_url_task.py b/tests/automated/integration/tasks/test_submit_approved_url_task.py index e7403e0e..084bef03 100644 --- a/tests/automated/integration/tasks/test_submit_approved_url_task.py +++ b/tests/automated/integration/tasks/test_submit_approved_url_task.py @@ -5,13 +5,13 @@ from deepdiff import DeepDiff from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo -from src.core.tasks.operators.submit_approved_url.core import SubmitApprovedURLTaskOperator +from src.core.tasks.url.operators.submit_approved_url.core import SubmitApprovedURLTaskOperator from src.db.enums import TaskType from src.db.models.instantiations.url.error_info import URLErrorInfo from src.db.models.instantiations.url.data_source import URLDataSource from src.db.models.instantiations.url.core import URL from src.collectors.enums import URLStatus -from src.core.tasks.enums import TaskOperatorOutcome +from src.core.tasks.url.enums import TaskOperatorOutcome from src.core.enums import RecordType, SubmitResponseStatus from tests.helpers.db_data_creator import BatchURLCreationInfo, DBDataCreator from pdap_access_manager import RequestInfo, RequestType, ResponseInfo, DataSourcesNamespaces diff --git a/tests/automated/integration/tasks/test_url_404_probe.py b/tests/automated/integration/tasks/test_url_404_probe.py index d75ec2fe..7a88f759 100644 --- a/tests/automated/integration/tasks/test_url_404_probe.py +++ b/tests/automated/integration/tasks/test_url_404_probe.py @@ -5,13 +5,13 @@ import pytest from aiohttp import ClientResponseError, RequestInfo -from src.core.tasks.operators.url_404_probe.core import URL404ProbeTaskOperator -from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface +from src.core.tasks.url.operators.url_404_probe.core import URL404ProbeTaskOperator +from src.core.tasks.url.operators.url_html.scraper.request_interface.core import URLRequestInterface from src.db.models.instantiations.url.probed_for_404 import URLProbedFor404 from src.db.models.instantiations.url.core import URL from src.collectors.enums import URLStatus -from src.core.tasks.enums import TaskOperatorOutcome -from src.core.tasks.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo +from src.core.tasks.url.enums import TaskOperatorOutcome +from src.core.tasks.url.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo from tests.helpers.db_data_creator import DBDataCreator from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters diff --git a/tests/automated/integration/tasks/test_url_duplicate_task.py b/tests/automated/integration/tasks/test_url_duplicate_task.py index f37fd100..b63695c0 100644 --- a/tests/automated/integration/tasks/test_url_duplicate_task.py +++ b/tests/automated/integration/tasks/test_url_duplicate_task.py @@ -3,12 +3,12 @@ import pytest -from src.core.tasks.operators.url_duplicate.core import URLDuplicateTaskOperator +from src.core.tasks.url.operators.url_duplicate.core import URLDuplicateTaskOperator from src.db.dtos.url_mapping import URLMapping from src.db.models.instantiations.url.checked_for_duplicate import URLCheckedForDuplicate from src.db.models.instantiations.url.core import URL from src.collectors.enums import URLStatus -from src.core.tasks.enums import TaskOperatorOutcome +from src.core.tasks.url.enums import TaskOperatorOutcome from tests.helpers.db_data_creator import DBDataCreator from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters diff --git a/tests/automated/integration/tasks/test_url_html_task.py b/tests/automated/integration/tasks/test_url_html_task.py index 686db4ec..ebe43e9b 100644 --- a/tests/automated/integration/tasks/test_url_html_task.py +++ b/tests/automated/integration/tasks/test_url_html_task.py @@ -5,17 +5,17 @@ import pytest from aiohttp import ClientResponseError, RequestInfo -from src.core.tasks.operators.url_html.core import URLHTMLTaskOperator -from src.core.tasks.operators.url_html.scraper.parser.core import HTMLResponseParser -from src.core.tasks.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo -from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface +from src.core.tasks.url.operators.url_html.core import URLHTMLTaskOperator +from src.core.tasks.url.operators.url_html.scraper.parser.core import HTMLResponseParser +from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.core.tasks.url.operators.url_html.scraper.request_interface.core import URLRequestInterface from src.db.client.async_ import AsyncDatabaseClient from src.db.enums import TaskType from src.collectors.enums import URLStatus -from src.core.tasks.enums import TaskOperatorOutcome +from src.core.tasks.url.enums import TaskOperatorOutcome from tests.helpers.db_data_creator import DBDataCreator -from src.core.tasks.operators.url_html.scraper.root_url_cache.core import RootURLCache -from src.core.tasks.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo +from src.core.tasks.url.operators.url_html.scraper.root_url_cache.core import RootURLCache +from src.core.tasks.url.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo @pytest.mark.asyncio diff --git a/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py b/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py index 6396cd7a..e3d7c529 100644 --- a/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py +++ b/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py @@ -2,11 +2,11 @@ import pytest -from src.core.tasks.operators.url_miscellaneous_metadata.core import URLMiscellaneousMetadataTaskOperator +from src.core.tasks.url.operators.url_miscellaneous_metadata.core import URLMiscellaneousMetadataTaskOperator from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata from src.db.models.instantiations.url.core import URL from src.collectors.enums import CollectorType -from src.core.tasks.enums import TaskOperatorOutcome +from src.core.tasks.url.enums import TaskOperatorOutcome from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/tasks/test_url_record_type_task.py b/tests/automated/integration/tasks/test_url_record_type_task.py index 6e92b5d7..514aa716 100644 --- a/tests/automated/integration/tasks/test_url_record_type_task.py +++ b/tests/automated/integration/tasks/test_url_record_type_task.py @@ -4,11 +4,11 @@ from src.db.enums import TaskType from src.db.models.instantiations.url.suggestion.record_type.auto import AutoRecordTypeSuggestion -from src.core.tasks.enums import TaskOperatorOutcome -from src.core.tasks.operators.record_type.core import URLRecordTypeTaskOperator +from src.core.tasks.url.enums import TaskOperatorOutcome +from src.core.tasks.url.operators.record_type.core import URLRecordTypeTaskOperator from src.core.enums import RecordType from tests.helpers.db_data_creator import DBDataCreator -from src.core.tasks.operators.record_type.llm_api.record_classifier.deepseek import DeepSeekRecordClassifier +from src.core.tasks.url.operators.record_type.llm_api.record_classifier.deepseek import DeepSeekRecordClassifier @pytest.mark.asyncio async def test_url_record_type_task(db_data_creator: DBDataCreator): diff --git a/tests/helpers/assert_functions.py b/tests/helpers/assert_functions.py index ecdb4c36..fa9f0eec 100644 --- a/tests/helpers/assert_functions.py +++ b/tests/helpers/assert_functions.py @@ -1,5 +1,5 @@ -from src.core.tasks.dtos.run_info import TaskOperatorRunInfo -from src.core.tasks.enums import TaskOperatorOutcome +from src.core.tasks.base.run_info import TaskOperatorRunInfo +from src.core.tasks.url.enums import TaskOperatorOutcome def assert_task_run_success(run_info: TaskOperatorRunInfo): diff --git a/tests/helpers/db_data_creator.py b/tests/helpers/db_data_creator.py index 335646f6..dfdac1f5 100644 --- a/tests/helpers/db_data_creator.py +++ b/tests/helpers/db_data_creator.py @@ -7,6 +7,7 @@ from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo from src.api.endpoints.review.enums import RejectionReason +from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.db.client.async_ import AsyncDatabaseClient from src.db.dtos.batch_info import BatchInfo from src.db.dtos.duplicate_info import DuplicateInsertInfo @@ -18,9 +19,8 @@ from src.db.client.sync import DatabaseClient from src.db.enums import TaskType from src.collectors.enums import CollectorType, URLStatus -from src.core.tasks.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo -from src.core.tasks.operators.submit_approved_url.tdo import SubmittedURLInfo -from src.core.tasks.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO +from src.core.tasks.url.operators.submit_approved_url.tdo import SubmittedURLInfo +from src.core.tasks.url.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO from src.core.enums import BatchStatus, SuggestionType, RecordType, SuggestedStatus from tests.helpers.batch_creation_parameters.annotation_info import AnnotationInfo from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters diff --git a/tests/manual/core/tasks/test_url_html_task_operator.py b/tests/manual/core/tasks/test_url_html_task_operator.py index b4f343fe..f4cc36d6 100644 --- a/tests/manual/core/tasks/test_url_html_task_operator.py +++ b/tests/manual/core/tasks/test_url_html_task_operator.py @@ -3,10 +3,10 @@ import pytest from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO, ManualBatchInnerInputDTO -from src.core.tasks.operators.url_html.core import URLHTMLTaskOperator -from src.core.tasks.operators.url_html.scraper.parser.core import HTMLResponseParser -from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface -from src.core.tasks.operators.url_html.scraper.root_url_cache.core import RootURLCache +from src.core.tasks.url.operators.url_html.core import URLHTMLTaskOperator +from src.core.tasks.url.operators.url_html.scraper.parser.core import HTMLResponseParser +from src.core.tasks.url.operators.url_html.scraper.request_interface.core import URLRequestInterface +from src.core.tasks.url.operators.url_html.scraper.root_url_cache.core import RootURLCache @pytest.mark.asyncio diff --git a/tests/manual/html_collector/test_html_tag_collector_integration.py b/tests/manual/html_collector/test_html_tag_collector_integration.py index 4a40b84e..b66fbd77 100644 --- a/tests/manual/html_collector/test_html_tag_collector_integration.py +++ b/tests/manual/html_collector/test_html_tag_collector_integration.py @@ -1,9 +1,9 @@ import pytest -from src.core.tasks.operators.url_html.core import URLHTMLTaskOperator -from src.core.tasks.operators.url_html.scraper.parser.core import HTMLResponseParser -from src.core.tasks.operators.url_html.scraper.request_interface.core import URLRequestInterface -from src.core.tasks.operators.url_html.scraper.root_url_cache.core import RootURLCache +from src.core.tasks.url.operators.url_html.core import URLHTMLTaskOperator +from src.core.tasks.url.operators.url_html.scraper.parser.core import HTMLResponseParser +from src.core.tasks.url.operators.url_html.scraper.request_interface.core import URLRequestInterface +from src.core.tasks.url.operators.url_html.scraper.root_url_cache.core import RootURLCache from src.db.client.async_ import AsyncDatabaseClient from src.db.dtos.url_info import URLInfo from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/manual/llm_api_logic/test_deepseek_record_classifier.py b/tests/manual/llm_api_logic/test_deepseek_record_classifier.py index 6dcca0c7..c88ee2bb 100644 --- a/tests/manual/llm_api_logic/test_deepseek_record_classifier.py +++ b/tests/manual/llm_api_logic/test_deepseek_record_classifier.py @@ -1,7 +1,7 @@ import pytest from src.db.dtos.url_html_content_info import URLHTMLContentInfo -from src.core.tasks.operators.record_type.llm_api.record_classifier.deepseek import DeepSeekRecordClassifier +from src.core.tasks.url.operators.record_type.llm_api.record_classifier.deepseek import DeepSeekRecordClassifier @pytest.mark.asyncio diff --git a/tests/manual/llm_api_logic/test_openai_record_classifier.py b/tests/manual/llm_api_logic/test_openai_record_classifier.py index 9f1874f4..d7fa344f 100644 --- a/tests/manual/llm_api_logic/test_openai_record_classifier.py +++ b/tests/manual/llm_api_logic/test_openai_record_classifier.py @@ -1,7 +1,7 @@ import pytest from src.db.dtos.url_html_content_info import URLHTMLContentInfo -from src.core.tasks.operators.record_type.llm_api.record_classifier.openai import OpenAIRecordClassifier +from src.core.tasks.url.operators.record_type.llm_api.record_classifier.openai import OpenAIRecordClassifier @pytest.mark.asyncio diff --git a/tests/manual/pdap_client/test_sync_agencies.py b/tests/manual/pdap_client/test_sync_agencies.py index 7079cfb4..107007d4 100644 --- a/tests/manual/pdap_client/test_sync_agencies.py +++ b/tests/manual/pdap_client/test_sync_agencies.py @@ -1,7 +1,7 @@ import pytest import time -from src.core.tasks.operators.agency_sync.dtos.parameters import AgencySyncParameters +from src.core.tasks.scheduled.operators.agency_sync.dtos import AgencySyncParameters @pytest.mark.asyncio From 51ad317d808d973c59da55e203984172526da018 Mon Sep 17 00:00:00 2001 From: Josh Chamberlain Date: Mon, 23 Jun 2025 14:23:13 -0400 Subject: [PATCH 231/244] link to api tos --- api/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/main.py b/api/main.py index 356467af..1b7ba8fe 100644 --- a/api/main.py +++ b/api/main.py @@ -66,7 +66,8 @@ async def setup_database(db_client): app = FastAPI( title="Source Collector API", - description="API for collecting data sources", + description="API for collecting data sources" + "\n\nBy accessing our API, you are agreeing to our [Terms of Service](https://docs.pdap.io/meta/operations/legal/terms-of-service). Please read them before you start.", version="0.1.0", lifespan=lifespan ) From 63fedd17d49c39656850a2ff262ba241638722d2 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Mon, 23 Jun 2025 14:33:13 -0400 Subject: [PATCH 232/244] Adjust main description. --- src/api/main.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/api/main.py b/src/api/main.py index 54fd6ae9..63013207 100644 --- a/src/api/main.py +++ b/src/api/main.py @@ -127,7 +127,9 @@ async def setup_database(db_client): app = FastAPI( title="Source Collector API", - description="API for collecting data sources", + description="API for collecting data sources. " + "\n\nBy accessing our API, you are agreeing to our [Terms of Service](https://docs.pdap.io/meta/operations/legal/terms-of-service). " + "Please read them before you start.", docs_url='/api', version="0.1.0", lifespan=lifespan From 7c790c4b072dd1a0ce458362ca670bef73301ad0 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sat, 5 Jul 2025 14:14:13 -0400 Subject: [PATCH 233/244] Add logic for storing compressed html when scraping HTML --- ...f43f61598_add_url_compressed_html_table.py | 37 +++++ pyproject.toml | 1 + .../annotate/dtos/shared/base/response.py | 2 +- .../endpoints/batch/dtos/get/duplicates.py | 2 +- src/api/endpoints/batch/dtos/get/logs.py | 2 +- src/api/endpoints/batch/dtos/get/urls.py | 2 +- src/api/endpoints/task/dtos/get/task.py | 4 +- src/collectors/source_collectors/base.py | 4 +- src/core/core.py | 2 +- src/core/logger.py | 2 +- src/core/preprocessors/autogoogler.py | 2 +- src/core/preprocessors/base.py | 2 +- src/core/preprocessors/ckan.py | 2 +- src/core/preprocessors/common_crawler.py | 2 +- src/core/preprocessors/example.py | 2 +- src/core/preprocessors/muckrock.py | 2 +- .../operators/agency_identification/core.py | 2 +- .../tasks/url/operators/record_type/core.py | 2 +- .../operators/record_type/llm_api/helpers.py | 2 +- .../llm_api/record_classifier/base.py | 2 +- .../tasks/url/operators/record_type/tdo.py | 2 +- .../url/operators/submit_approved_url/core.py | 2 +- .../operators/url_html/content_info_getter.py | 2 +- src/core/tasks/url/operators/url_html/core.py | 20 ++- .../url_html/scraper/parser/README.md | 1 + .../operators/url_html/scraper/parser/core.py | 1 + .../url_html/scraper/parser/mapping.py | 2 +- .../operators/url_html/scraper/parser/util.py | 2 +- .../scraper/request_interface/README.md | 1 + src/core/tasks/url/operators/url_html/tdo.py | 2 +- .../url_miscellaneous_metadata/core.py | 2 +- src/db/client/async_.py | 52 +++++-- src/db/client/sync.py | 12 +- src/db/dto_converter.py | 6 +- src/db/dtos/{batch_info.py => batch.py} | 0 .../dtos/{duplicate_info.py => duplicate.py} | 0 src/db/dtos/{log_info.py => log.py} | 0 ...otation_info.py => metadata_annotation.py} | 0 .../db/dtos/url}/__init__.py | 0 .../annotation.py} | 2 +- src/db/dtos/{url_info.py => url/core.py} | 0 .../dtos/{url_error_info.py => url/error.py} | 0 .../html_content.py} | 0 .../{insert_urls_info.py => url/insert.py} | 2 +- .../dtos/{url_mapping.py => url/mapping.py} | 0 .../{url_metadata_info.py => url/metadata.py} | 0 src/db/dtos/url/raw_html.py | 6 + .../relevancy.py} | 0 .../{url_with_html.py => url/with_html.py} | 2 +- .../instantiations/url/compressed_html.py | 21 +++ src/db/models/instantiations/url/core.py | 5 + .../implementations/core/final_review/get.py | 2 +- src/db/utils/__init__.py | 0 src/db/utils/compression.py | 8 ++ .../integration/api/test_annotate.py | 4 +- tests/automated/integration/api/test_batch.py | 4 +- .../integration/api/test_duplicates.py | 2 +- .../integration/api/test_example_collector.py | 2 +- tests/automated/integration/api/test_url.py | 2 +- .../integration/collector_db/__init__.py | 0 .../annotate_url/test_marked_not_relevant.py | 2 +- .../db/client/test_add_url_error_info.py | 2 +- .../db/client/test_delete_old_logs.py | 2 +- .../db/client/test_delete_url_updated_at.py | 2 +- .../integration/db/client/test_insert_logs.py | 2 +- .../integration/db/client/test_insert_urls.py | 4 +- .../integration/db/test_database_structure.py | 2 +- .../integration/tasks/scheduled/__init__.py | 0 .../tasks/scheduled/agency_sync/__init__.py | 0 .../{ => scheduled}/agency_sync/conftest.py | 2 +- .../tasks/{ => scheduled}/agency_sync/data.py | 0 .../agency_sync/existence_checker.py | 2 +- .../{ => scheduled}/agency_sync/helpers.py | 2 +- .../agency_sync/test_happy_path.py | 6 +- .../agency_sync/test_interruption.py | 7 +- .../agency_sync/test_no_new_results.py | 6 +- .../integration/tasks/test_url_html_task.py | 129 ------------------ .../integration/tasks/url/__init__.py | 0 .../tasks/url/duplicate/__init__.py | 0 .../tasks/url/duplicate/constants.py | 16 +++ .../duplicate}/test_url_duplicate_task.py | 22 +-- .../integration/tasks/url/html/__init__.py | 0 .../integration/tasks/url/html/asserts.py | 64 +++++++++ .../tasks/url/html/mocks/__init__.py | 0 .../tasks/url/html/mocks/constants.py | 3 + .../tasks/url/html/mocks/methods.py | 61 +++++++++ .../integration/tasks/url/html/setup.py | 41 ++++++ .../integration/tasks/url/html/test_task.py | 42 ++++++ .../test_agency_preannotation_task.py | 0 .../tasks/{ => url}/test_example_task.py | 0 .../test_submit_approved_url_task.py | 0 .../tasks/{ => url}/test_url_404_probe.py | 0 .../test_url_miscellaneous_metadata_task.py | 0 .../{ => url}/test_url_record_type_task.py | 0 tests/automated/unit/core/test_core_logger.py | 2 +- .../test_autogoogler_collector.py | 2 +- .../test_common_crawl_collector.py | 2 +- .../test_muckrock_collectors.py | 4 +- tests/helpers/complex_test_data_functions.py | 4 +- tests/helpers/db_data_creator.py | 14 +- .../lifecycle/test_auto_googler_lifecycle.py | 2 +- .../core/lifecycle/test_ckan_lifecycle.py | 2 +- .../lifecycle/test_muckrock_lifecycles.py | 2 +- .../test_html_tag_collector_integration.py | 2 +- .../test_deepseek_record_classifier.py | 4 +- .../test_openai_record_classifier.py | 4 +- uv.lock | 56 ++++++++ 107 files changed, 513 insertions(+), 253 deletions(-) create mode 100644 alembic/versions/2025_07_05_0801-4b0f43f61598_add_url_compressed_html_table.py create mode 100644 src/core/tasks/url/operators/url_html/scraper/parser/README.md create mode 100644 src/core/tasks/url/operators/url_html/scraper/request_interface/README.md rename src/db/dtos/{batch_info.py => batch.py} (100%) rename src/db/dtos/{duplicate_info.py => duplicate.py} (100%) rename src/db/dtos/{log_info.py => log.py} (100%) rename src/db/dtos/{metadata_annotation_info.py => metadata_annotation.py} (100%) rename {tests/automated/integration/tasks/agency_sync => src/db/dtos/url}/__init__.py (100%) rename src/db/dtos/{url_annotation_info.py => url/annotation.py} (72%) rename src/db/dtos/{url_info.py => url/core.py} (100%) rename src/db/dtos/{url_error_info.py => url/error.py} (100%) rename src/db/dtos/{url_html_content_info.py => url/html_content.py} (100%) rename src/db/dtos/{insert_urls_info.py => url/insert.py} (81%) rename src/db/dtos/{url_mapping.py => url/mapping.py} (100%) rename src/db/dtos/{url_metadata_info.py => url/metadata.py} (100%) create mode 100644 src/db/dtos/url/raw_html.py rename src/db/dtos/{url_relevancy_info.py => url/relevancy.py} (100%) rename src/db/dtos/{url_with_html.py => url/with_html.py} (67%) create mode 100644 src/db/models/instantiations/url/compressed_html.py create mode 100644 src/db/utils/__init__.py create mode 100644 src/db/utils/compression.py create mode 100644 tests/automated/integration/collector_db/__init__.py create mode 100644 tests/automated/integration/tasks/scheduled/__init__.py create mode 100644 tests/automated/integration/tasks/scheduled/agency_sync/__init__.py rename tests/automated/integration/tasks/{ => scheduled}/agency_sync/conftest.py (81%) rename tests/automated/integration/tasks/{ => scheduled}/agency_sync/data.py (100%) rename tests/automated/integration/tasks/{ => scheduled}/agency_sync/existence_checker.py (88%) rename tests/automated/integration/tasks/{ => scheduled}/agency_sync/helpers.py (96%) rename tests/automated/integration/tasks/{ => scheduled}/agency_sync/test_happy_path.py (83%) rename tests/automated/integration/tasks/{ => scheduled}/agency_sync/test_interruption.py (87%) rename tests/automated/integration/tasks/{ => scheduled}/agency_sync/test_no_new_results.py (83%) delete mode 100644 tests/automated/integration/tasks/test_url_html_task.py create mode 100644 tests/automated/integration/tasks/url/__init__.py create mode 100644 tests/automated/integration/tasks/url/duplicate/__init__.py create mode 100644 tests/automated/integration/tasks/url/duplicate/constants.py rename tests/automated/integration/tasks/{ => url/duplicate}/test_url_duplicate_task.py (80%) create mode 100644 tests/automated/integration/tasks/url/html/__init__.py create mode 100644 tests/automated/integration/tasks/url/html/asserts.py create mode 100644 tests/automated/integration/tasks/url/html/mocks/__init__.py create mode 100644 tests/automated/integration/tasks/url/html/mocks/constants.py create mode 100644 tests/automated/integration/tasks/url/html/mocks/methods.py create mode 100644 tests/automated/integration/tasks/url/html/setup.py create mode 100644 tests/automated/integration/tasks/url/html/test_task.py rename tests/automated/integration/tasks/{ => url}/test_agency_preannotation_task.py (100%) rename tests/automated/integration/tasks/{ => url}/test_example_task.py (100%) rename tests/automated/integration/tasks/{ => url}/test_submit_approved_url_task.py (100%) rename tests/automated/integration/tasks/{ => url}/test_url_404_probe.py (100%) rename tests/automated/integration/tasks/{ => url}/test_url_miscellaneous_metadata_task.py (100%) rename tests/automated/integration/tasks/{ => url}/test_url_record_type_task.py (100%) diff --git a/alembic/versions/2025_07_05_0801-4b0f43f61598_add_url_compressed_html_table.py b/alembic/versions/2025_07_05_0801-4b0f43f61598_add_url_compressed_html_table.py new file mode 100644 index 00000000..7a1d0425 --- /dev/null +++ b/alembic/versions/2025_07_05_0801-4b0f43f61598_add_url_compressed_html_table.py @@ -0,0 +1,37 @@ +"""Add url_compressed_html table + +Revision ID: 4b0f43f61598 +Revises: fb199cf58ecd +Create Date: 2025-07-05 08:01:58.124060 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +from src.util.alembic_helpers import created_at_column, updated_at_column, id_column + +# revision identifiers, used by Alembic. +revision: str = '4b0f43f61598' +down_revision: Union[str, None] = 'fb199cf58ecd' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +TABLE_NAME = 'url_compressed_html' + +def upgrade() -> None: + op.create_table( + TABLE_NAME, + id_column(), + sa.Column('url_id', sa.Integer(), nullable=False), + sa.Column('compressed_html', sa.LargeBinary(), nullable=False), + created_at_column(), + updated_at_column(), + sa.ForeignKeyConstraint(['url_id'], ['urls.id'], name='fk_url_compressed_html_url_id'), + sa.UniqueConstraint('url_id', name='uq_url_compressed_html_url_id') + ) + + +def downgrade() -> None: + op.drop_table(TABLE_NAME) diff --git a/pyproject.toml b/pyproject.toml index 49c6059c..15e3c8ea 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,6 +8,7 @@ dependencies = [ "apscheduler~=3.11.0", "asyncpg~=0.30.0", "beautifulsoup4>=4.12.3", + "brotli>=1.1.0", "bs4~=0.0.2", "ckanapi~=4.8", "datasets~=2.19.1", diff --git a/src/api/endpoints/annotate/dtos/shared/base/response.py b/src/api/endpoints/annotate/dtos/shared/base/response.py index 11f8fdc7..a7e30385 100644 --- a/src/api/endpoints/annotate/dtos/shared/base/response.py +++ b/src/api/endpoints/annotate/dtos/shared/base/response.py @@ -4,7 +4,7 @@ from src.api.endpoints.annotate.dtos.shared.batch import AnnotationBatchInfo from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo -from src.db.dtos.url_mapping import URLMapping +from src.db.dtos.url.mapping import URLMapping class AnnotationInnerResponseInfoBase(BaseModel): diff --git a/src/api/endpoints/batch/dtos/get/duplicates.py b/src/api/endpoints/batch/dtos/get/duplicates.py index bf4838a8..3838be77 100644 --- a/src/api/endpoints/batch/dtos/get/duplicates.py +++ b/src/api/endpoints/batch/dtos/get/duplicates.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from src.db.dtos.duplicate_info import DuplicateInfo +from src.db.dtos.duplicate import DuplicateInfo class GetDuplicatesByBatchResponse(BaseModel): diff --git a/src/api/endpoints/batch/dtos/get/logs.py b/src/api/endpoints/batch/dtos/get/logs.py index 33c6d19a..a350caa1 100644 --- a/src/api/endpoints/batch/dtos/get/logs.py +++ b/src/api/endpoints/batch/dtos/get/logs.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from src.db.dtos.log_info import LogOutputInfo +from src.db.dtos.log import LogOutputInfo class GetBatchLogsResponse(BaseModel): diff --git a/src/api/endpoints/batch/dtos/get/urls.py b/src/api/endpoints/batch/dtos/get/urls.py index 12473130..40b1e753 100644 --- a/src/api/endpoints/batch/dtos/get/urls.py +++ b/src/api/endpoints/batch/dtos/get/urls.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from src.db.dtos.url_info import URLInfo +from src.db.dtos.url.core import URLInfo class GetURLsByBatchResponse(BaseModel): diff --git a/src/api/endpoints/task/dtos/get/task.py b/src/api/endpoints/task/dtos/get/task.py index 509ae727..411ad7f7 100644 --- a/src/api/endpoints/task/dtos/get/task.py +++ b/src/api/endpoints/task/dtos/get/task.py @@ -3,8 +3,8 @@ from pydantic import BaseModel -from src.db.dtos.url_error_info import URLErrorPydanticInfo -from src.db.dtos.url_info import URLInfo +from src.db.dtos.url.error import URLErrorPydanticInfo +from src.db.dtos.url.core import URLInfo from src.db.enums import TaskType from src.core.enums import BatchStatus diff --git a/src/collectors/source_collectors/base.py b/src/collectors/source_collectors/base.py index 519d2e54..5fbb08c5 100644 --- a/src/collectors/source_collectors/base.py +++ b/src/collectors/source_collectors/base.py @@ -7,8 +7,8 @@ from pydantic import BaseModel from src.db.client.async_ import AsyncDatabaseClient -from src.db.dtos.insert_urls_info import InsertURLsInfo -from src.db.dtos.log_info import LogInfo +from src.db.dtos.url.insert import InsertURLsInfo +from src.db.dtos.log import LogInfo from src.collectors.enums import CollectorType from src.core.logger import AsyncCoreLogger from src.core.function_trigger import FunctionTrigger diff --git a/src/core/core.py b/src/core/core.py index 4ce2c76f..13433921 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -35,7 +35,7 @@ from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse from src.api.endpoints.url.dtos.response import GetURLsResponseInfo from src.db.client.async_ import AsyncDatabaseClient -from src.db.dtos.batch_info import BatchInfo +from src.db.dtos.batch import BatchInfo from src.api.endpoints.task.dtos.get.task_status import GetTaskStatusResponseInfo from src.db.enums import TaskType from src.collectors.manager import AsyncCollectorManager diff --git a/src/core/logger.py b/src/core/logger.py index e0c9ccdb..e49dd057 100644 --- a/src/core/logger.py +++ b/src/core/logger.py @@ -1,7 +1,7 @@ import asyncio from src.db.client.async_ import AsyncDatabaseClient -from src.db.dtos.log_info import LogInfo +from src.db.dtos.log import LogInfo class AsyncCoreLogger: diff --git a/src/core/preprocessors/autogoogler.py b/src/core/preprocessors/autogoogler.py index b92674c2..e827c77d 100644 --- a/src/core/preprocessors/autogoogler.py +++ b/src/core/preprocessors/autogoogler.py @@ -1,6 +1,6 @@ from typing import List -from src.db.dtos.url_info import URLInfo +from src.db.dtos.url.core import URLInfo from src.core.preprocessors.base import PreprocessorBase diff --git a/src/core/preprocessors/base.py b/src/core/preprocessors/base.py index a4bfa1ae..dea8df10 100644 --- a/src/core/preprocessors/base.py +++ b/src/core/preprocessors/base.py @@ -2,7 +2,7 @@ from abc import ABC from typing import List -from src.db.dtos.url_info import URLInfo +from src.db.dtos.url.core import URLInfo class PreprocessorBase(ABC): diff --git a/src/core/preprocessors/ckan.py b/src/core/preprocessors/ckan.py index 00cda360..c07d4ab5 100644 --- a/src/core/preprocessors/ckan.py +++ b/src/core/preprocessors/ckan.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import List -from src.db.dtos.url_info import URLInfo +from src.db.dtos.url.core import URLInfo class CKANPreprocessor: diff --git a/src/core/preprocessors/common_crawler.py b/src/core/preprocessors/common_crawler.py index 3592824e..9a7e1d04 100644 --- a/src/core/preprocessors/common_crawler.py +++ b/src/core/preprocessors/common_crawler.py @@ -1,6 +1,6 @@ from typing import List -from src.db.dtos.url_info import URLInfo +from src.db.dtos.url.core import URLInfo from src.core.preprocessors.base import PreprocessorBase diff --git a/src/core/preprocessors/example.py b/src/core/preprocessors/example.py index 609b112f..dfc7338a 100644 --- a/src/core/preprocessors/example.py +++ b/src/core/preprocessors/example.py @@ -1,6 +1,6 @@ from typing import List -from src.db.dtos.url_info import URLInfo +from src.db.dtos.url.core import URLInfo from src.collectors.source_collectors.example.dtos.output import ExampleOutputDTO from src.core.preprocessors.base import PreprocessorBase diff --git a/src/core/preprocessors/muckrock.py b/src/core/preprocessors/muckrock.py index 7330ece4..281ea2f8 100644 --- a/src/core/preprocessors/muckrock.py +++ b/src/core/preprocessors/muckrock.py @@ -1,6 +1,6 @@ from typing import List -from src.db.dtos.url_info import URLInfo +from src.db.dtos.url.core import URLInfo from src.core.preprocessors.base import PreprocessorBase diff --git a/src/core/tasks/url/operators/agency_identification/core.py b/src/core/tasks/url/operators/agency_identification/core.py index b85e4666..06e20658 100644 --- a/src/core/tasks/url/operators/agency_identification/core.py +++ b/src/core/tasks/url/operators/agency_identification/core.py @@ -2,7 +2,7 @@ from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.tasks.url.operators.agency_identification.dtos.tdo import AgencyIdentificationTDO from src.db.client.async_ import AsyncDatabaseClient -from src.db.dtos.url_error_info import URLErrorPydanticInfo +from src.db.dtos.url.error import URLErrorPydanticInfo from src.db.enums import TaskType from src.collectors.enums import CollectorType from src.core.tasks.url.operators.base import URLTaskOperatorBase diff --git a/src/core/tasks/url/operators/record_type/core.py b/src/core/tasks/url/operators/record_type/core.py index 2888a52c..ce73ceb4 100644 --- a/src/core/tasks/url/operators/record_type/core.py +++ b/src/core/tasks/url/operators/record_type/core.py @@ -1,5 +1,5 @@ from src.db.client.async_ import AsyncDatabaseClient -from src.db.dtos.url_error_info import URLErrorPydanticInfo +from src.db.dtos.url.error import URLErrorPydanticInfo from src.db.enums import TaskType from src.core.tasks.url.operators.record_type.tdo import URLRecordTypeTDO from src.core.tasks.url.operators.base import URLTaskOperatorBase diff --git a/src/core/tasks/url/operators/record_type/llm_api/helpers.py b/src/core/tasks/url/operators/record_type/llm_api/helpers.py index 0d83866c..7ca821e5 100644 --- a/src/core/tasks/url/operators/record_type/llm_api/helpers.py +++ b/src/core/tasks/url/operators/record_type/llm_api/helpers.py @@ -1,4 +1,4 @@ -from src.db.dtos.url_html_content_info import URLHTMLContentInfo +from src.db.dtos.url.html_content import URLHTMLContentInfo def dictify_html_info(html_infos: list[URLHTMLContentInfo]) -> dict[str, str]: diff --git a/src/core/tasks/url/operators/record_type/llm_api/record_classifier/base.py b/src/core/tasks/url/operators/record_type/llm_api/record_classifier/base.py index 52aae6e6..b995bda9 100644 --- a/src/core/tasks/url/operators/record_type/llm_api/record_classifier/base.py +++ b/src/core/tasks/url/operators/record_type/llm_api/record_classifier/base.py @@ -6,7 +6,7 @@ from src.core.tasks.url.operators.record_type.llm_api.dtos.record_type_structured_output import \ RecordTypeStructuredOutput -from src.db.dtos.url_html_content_info import URLHTMLContentInfo +from src.db.dtos.url.html_content import URLHTMLContentInfo from src.core.tasks.url.operators.record_type.llm_api.constants import RECORD_CLASSIFICATION_QUERY_CONTENT from src.core.tasks.url.operators.record_type.llm_api.helpers import dictify_html_info diff --git a/src/core/tasks/url/operators/record_type/tdo.py b/src/core/tasks/url/operators/record_type/tdo.py index 5bb0784e..43a32bab 100644 --- a/src/core/tasks/url/operators/record_type/tdo.py +++ b/src/core/tasks/url/operators/record_type/tdo.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from src.db.dtos.url_with_html import URLWithHTML +from src.db.dtos.url.with_html import URLWithHTML from src.core.enums import RecordType diff --git a/src/core/tasks/url/operators/submit_approved_url/core.py b/src/core/tasks/url/operators/submit_approved_url/core.py index 66f5fe99..26cec954 100644 --- a/src/core/tasks/url/operators/submit_approved_url/core.py +++ b/src/core/tasks/url/operators/submit_approved_url/core.py @@ -1,5 +1,5 @@ from src.db.client.async_ import AsyncDatabaseClient -from src.db.dtos.url_error_info import URLErrorPydanticInfo +from src.db.dtos.url.error import URLErrorPydanticInfo from src.db.enums import TaskType from src.core.tasks.url.operators.submit_approved_url.tdo import SubmitApprovedURLTDO from src.core.tasks.url.operators.base import URLTaskOperatorBase diff --git a/src/core/tasks/url/operators/url_html/content_info_getter.py b/src/core/tasks/url/operators/url_html/content_info_getter.py index da389738..644e12e4 100644 --- a/src/core/tasks/url/operators/url_html/content_info_getter.py +++ b/src/core/tasks/url/operators/url_html/content_info_getter.py @@ -1,5 +1,5 @@ from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo -from src.db.dtos.url_html_content_info import URLHTMLContentInfo, HTMLContentType +from src.db.dtos.url.html_content import URLHTMLContentInfo, HTMLContentType class HTMLContentInfoGetter: diff --git a/src/core/tasks/url/operators/url_html/core.py b/src/core/tasks/url/operators/url_html/core.py index 5b4c82be..495845a4 100644 --- a/src/core/tasks/url/operators/url_html/core.py +++ b/src/core/tasks/url/operators/url_html/core.py @@ -1,8 +1,9 @@ from http import HTTPStatus from src.db.client.async_ import AsyncDatabaseClient -from src.db.dtos.url_error_info import URLErrorPydanticInfo -from src.db.dtos.url_info import URLInfo +from src.db.dtos.url.error import URLErrorPydanticInfo +from src.db.dtos.url.core import URLInfo +from src.db.dtos.url.raw_html import RawHTMLInfo from src.db.enums import TaskType from src.core.tasks.url.operators.url_html.tdo import UrlHtmlTDO from src.core.tasks.url.operators.url_html.content_info_getter import HTMLContentInfoGetter @@ -40,7 +41,12 @@ async def inner_task_logic(self): await self.process_html_data(success_subset) await self.update_database(is_404_error_subset, non_404_error_subset, success_subset) - async def update_database(self, is_404_error_subset, non_404_error_subset, success_subset): + async def update_database( + self, + is_404_error_subset: list[UrlHtmlTDO], + non_404_error_subset: list[UrlHtmlTDO], + success_subset: list[UrlHtmlTDO] + ): await self.update_errors_in_database(non_404_error_subset) await self.update_404s_in_database(is_404_error_subset) await self.update_html_data_in_database(success_subset) @@ -115,6 +121,7 @@ async def update_errors_in_database(self, error_tdos: list[UrlHtmlTDO]): async def process_html_data(self, tdos: list[UrlHtmlTDO]): for tdto in tdos: + html_tag_info = await self.html_parser.parse( url=tdto.url_info.url, html_content=tdto.url_response_info.html, @@ -124,12 +131,19 @@ async def process_html_data(self, tdos: list[UrlHtmlTDO]): async def update_html_data_in_database(self, tdos: list[UrlHtmlTDO]): html_content_infos = [] + raw_html_data = [] for tdto in tdos: hcig = HTMLContentInfoGetter( response_html_info=tdto.html_tag_info, url_id=tdto.url_info.id ) + rhi = RawHTMLInfo( + url_id=tdto.url_info.id, + html=tdto.url_response_info.html + ) + raw_html_data.append(rhi) results = hcig.get_all_html_content() html_content_infos.extend(results) await self.adb_client.add_html_content_infos(html_content_infos) + await self.adb_client.add_raw_html(raw_html_data) diff --git a/src/core/tasks/url/operators/url_html/scraper/parser/README.md b/src/core/tasks/url/operators/url_html/scraper/parser/README.md new file mode 100644 index 00000000..c15bcc85 --- /dev/null +++ b/src/core/tasks/url/operators/url_html/scraper/parser/README.md @@ -0,0 +1 @@ +The HTML Response Parser extracts information from the HTML response and stores it in the database. \ No newline at end of file diff --git a/src/core/tasks/url/operators/url_html/scraper/parser/core.py b/src/core/tasks/url/operators/url_html/scraper/parser/core.py index 1b5e0f91..737f03dd 100644 --- a/src/core/tasks/url/operators/url_html/scraper/parser/core.py +++ b/src/core/tasks/url/operators/url_html/scraper/parser/core.py @@ -12,6 +12,7 @@ class HTMLResponseParser: + def __init__(self, root_url_cache: RootURLCache): self.root_url_cache = root_url_cache diff --git a/src/core/tasks/url/operators/url_html/scraper/parser/mapping.py b/src/core/tasks/url/operators/url_html/scraper/parser/mapping.py index 9f8820e3..6b5f0b83 100644 --- a/src/core/tasks/url/operators/url_html/scraper/parser/mapping.py +++ b/src/core/tasks/url/operators/url_html/scraper/parser/mapping.py @@ -1,4 +1,4 @@ -from src.db.dtos.url_html_content_info import HTMLContentType +from src.db.dtos.url.html_content import HTMLContentType ENUM_TO_ATTRIBUTE_MAPPING = { HTMLContentType.TITLE: "title", diff --git a/src/core/tasks/url/operators/url_html/scraper/parser/util.py b/src/core/tasks/url/operators/url_html/scraper/parser/util.py index 7f186c87..09453984 100644 --- a/src/core/tasks/url/operators/url_html/scraper/parser/util.py +++ b/src/core/tasks/url/operators/url_html/scraper/parser/util.py @@ -1,6 +1,6 @@ from urllib.parse import urlparse -from src.db.dtos.url_html_content_info import URLHTMLContentInfo +from src.db.dtos.url.html_content import URLHTMLContentInfo from src.core.tasks.url.operators.url_html.scraper.parser.mapping import ENUM_TO_ATTRIBUTE_MAPPING from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo diff --git a/src/core/tasks/url/operators/url_html/scraper/request_interface/README.md b/src/core/tasks/url/operators/url_html/scraper/request_interface/README.md new file mode 100644 index 00000000..d9a622ed --- /dev/null +++ b/src/core/tasks/url/operators/url_html/scraper/request_interface/README.md @@ -0,0 +1 @@ +The URL Request Interface module is responsible for making HTTP requests to a URL and returning the response information. \ No newline at end of file diff --git a/src/core/tasks/url/operators/url_html/tdo.py b/src/core/tasks/url/operators/url_html/tdo.py index 02178ff1..7fe14078 100644 --- a/src/core/tasks/url/operators/url_html/tdo.py +++ b/src/core/tasks/url/operators/url_html/tdo.py @@ -3,7 +3,7 @@ from pydantic import BaseModel from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo -from src.db.dtos.url_info import URLInfo +from src.db.dtos.url.core import URLInfo from src.core.tasks.url.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo diff --git a/src/core/tasks/url/operators/url_miscellaneous_metadata/core.py b/src/core/tasks/url/operators/url_miscellaneous_metadata/core.py index 90694e4f..988fbe8b 100644 --- a/src/core/tasks/url/operators/url_miscellaneous_metadata/core.py +++ b/src/core/tasks/url/operators/url_miscellaneous_metadata/core.py @@ -1,7 +1,7 @@ from typing import Optional from src.db.client.async_ import AsyncDatabaseClient -from src.db.dtos.url_error_info import URLErrorPydanticInfo +from src.db.dtos.url.error import URLErrorPydanticInfo from src.db.enums import TaskType from src.collectors.enums import CollectorType from src.core.tasks.url.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO diff --git a/src/db/client/async_.py b/src/db/client/async_.py index 92f52513..87e62d9c 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -4,7 +4,7 @@ from typing import Optional, Type, Any, List from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, Select, not_, and_, update, delete, literal, text +from sqlalchemy import select, exists, func, case, Select, not_, and_, update, delete, literal, text, insert from sqlalchemy.dialects import postgresql from sqlalchemy.dialects.postgresql import insert as pg_insert from sqlalchemy.exc import IntegrityError, NoResultFound @@ -56,14 +56,15 @@ from src.db.config_manager import ConfigManager from src.db.constants import PLACEHOLDER_AGENCY_NAME from src.db.dto_converter import DTOConverter -from src.db.dtos.batch_info import BatchInfo -from src.db.dtos.duplicate_info import DuplicateInsertInfo, DuplicateInfo -from src.db.dtos.insert_urls_info import InsertURLsInfo -from src.db.dtos.log_info import LogInfo, LogOutputInfo -from src.db.dtos.url_error_info import URLErrorPydanticInfo -from src.db.dtos.url_html_content_info import URLHTMLContentInfo, HTMLContentType -from src.db.dtos.url_info import URLInfo -from src.db.dtos.url_mapping import URLMapping +from src.db.dtos.batch import BatchInfo +from src.db.dtos.duplicate import DuplicateInsertInfo, DuplicateInfo +from src.db.dtos.url.insert import InsertURLsInfo +from src.db.dtos.log import LogInfo, LogOutputInfo +from src.db.dtos.url.error import URLErrorPydanticInfo +from src.db.dtos.url.html_content import URLHTMLContentInfo, HTMLContentType +from src.db.dtos.url.core import URLInfo +from src.db.dtos.url.mapping import URLMapping +from src.db.dtos.url.raw_html import RawHTMLInfo from src.db.enums import TaskType from src.db.models.instantiations.agency import Agency from src.db.models.instantiations.backlog_snapshot import BacklogSnapshot @@ -77,6 +78,7 @@ from src.db.models.instantiations.task.core import Task from src.db.models.instantiations.task.error import TaskError from src.db.models.instantiations.url.checked_for_duplicate import URLCheckedForDuplicate +from src.db.models.instantiations.url.compressed_html import URLCompressedHTML from src.db.models.instantiations.url.core import URL from src.db.models.instantiations.url.data_source import URLDataSource from src.db.models.instantiations.url.error_info import URLErrorInfo @@ -98,10 +100,9 @@ from src.db.queries.implementations.core.tasks.agency_sync.upsert import get_upsert_agencies_mappings from src.db.statement_composer import StatementComposer from src.db.types import UserSuggestionType +from src.db.utils.compression import decompress_html, compress_html from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInnerInfo -import logging - # Type Hints UserSuggestionModel = UserRelevantSuggestion or UserRecordTypeSuggestion or UserUrlAgencySuggestion @@ -2417,3 +2418,32 @@ async def mark_full_agencies_sync(self): current_page=None ) await self.execute(query) + + @session_manager + async def get_html_for_url( + self, + session: AsyncSession, + url_id: int + ) -> str: + query = ( + select(URLCompressedHTML.compressed_html) + .where(URLCompressedHTML.url_id == url_id) + ) + execution_result = await session.execute(query) + row = execution_result.mappings().one_or_none() + if row is None: + return None + return decompress_html(row["compressed_html"]) + + @session_manager + async def add_raw_html( + self, + session: AsyncSession, + info_list: list[RawHTMLInfo] + ): + for info in info_list: + compressed_html = URLCompressedHTML( + url_id=info.url_id, + compressed_html=compress_html(info.html) + ) + session.add(compressed_html) diff --git a/src/db/client/sync.py b/src/db/client/sync.py index 38b1a150..e62edf08 100644 --- a/src/db/client/sync.py +++ b/src/db/client/sync.py @@ -7,12 +7,12 @@ from src.collectors.enums import URLStatus from src.db.config_manager import ConfigManager -from src.db.dtos.batch_info import BatchInfo -from src.db.dtos.duplicate_info import DuplicateInsertInfo -from src.db.dtos.insert_urls_info import InsertURLsInfo -from src.db.dtos.log_info import LogInfo -from src.db.dtos.url_info import URLInfo -from src.db.dtos.url_mapping import URLMapping +from src.db.dtos.batch import BatchInfo +from src.db.dtos.duplicate import DuplicateInsertInfo +from src.db.dtos.url.insert import InsertURLsInfo +from src.db.dtos.log import LogInfo +from src.db.dtos.url.core import URLInfo +from src.db.dtos.url.mapping import URLMapping from src.db.models.templates import Base from src.db.models.instantiations.duplicate import Duplicate from src.db.models.instantiations.log import Log diff --git a/src/db/dto_converter.py b/src/db/dto_converter.py index fb5d2dfe..8d90cc6b 100644 --- a/src/db/dto_converter.py +++ b/src/db/dto_converter.py @@ -6,9 +6,9 @@ from src.core.enums import RecordType, SuggestionType from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo from src.core.tasks.url.operators.url_html.scraper.parser.mapping import ENUM_TO_ATTRIBUTE_MAPPING -from src.db.dtos.url_html_content_info import HTMLContentType, URLHTMLContentInfo -from src.db.dtos.url_info import URLInfo -from src.db.dtos.url_with_html import URLWithHTML +from src.db.dtos.url.html_content import HTMLContentType, URLHTMLContentInfo +from src.db.dtos.url.core import URLInfo +from src.db.dtos.url.with_html import URLWithHTML from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion from src.db.models.instantiations.url.suggestion.record_type.auto import AutoRecordTypeSuggestion diff --git a/src/db/dtos/batch_info.py b/src/db/dtos/batch.py similarity index 100% rename from src/db/dtos/batch_info.py rename to src/db/dtos/batch.py diff --git a/src/db/dtos/duplicate_info.py b/src/db/dtos/duplicate.py similarity index 100% rename from src/db/dtos/duplicate_info.py rename to src/db/dtos/duplicate.py diff --git a/src/db/dtos/log_info.py b/src/db/dtos/log.py similarity index 100% rename from src/db/dtos/log_info.py rename to src/db/dtos/log.py diff --git a/src/db/dtos/metadata_annotation_info.py b/src/db/dtos/metadata_annotation.py similarity index 100% rename from src/db/dtos/metadata_annotation_info.py rename to src/db/dtos/metadata_annotation.py diff --git a/tests/automated/integration/tasks/agency_sync/__init__.py b/src/db/dtos/url/__init__.py similarity index 100% rename from tests/automated/integration/tasks/agency_sync/__init__.py rename to src/db/dtos/url/__init__.py diff --git a/src/db/dtos/url_annotation_info.py b/src/db/dtos/url/annotation.py similarity index 72% rename from src/db/dtos/url_annotation_info.py rename to src/db/dtos/url/annotation.py index 035b4425..cbc1bcda 100644 --- a/src/db/dtos/url_annotation_info.py +++ b/src/db/dtos/url/annotation.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from src.db.dtos.url_html_content_info import URLHTMLContentInfo +from src.db.dtos.url.html_content import URLHTMLContentInfo class URLAnnotationInfo(BaseModel): diff --git a/src/db/dtos/url_info.py b/src/db/dtos/url/core.py similarity index 100% rename from src/db/dtos/url_info.py rename to src/db/dtos/url/core.py diff --git a/src/db/dtos/url_error_info.py b/src/db/dtos/url/error.py similarity index 100% rename from src/db/dtos/url_error_info.py rename to src/db/dtos/url/error.py diff --git a/src/db/dtos/url_html_content_info.py b/src/db/dtos/url/html_content.py similarity index 100% rename from src/db/dtos/url_html_content_info.py rename to src/db/dtos/url/html_content.py diff --git a/src/db/dtos/insert_urls_info.py b/src/db/dtos/url/insert.py similarity index 81% rename from src/db/dtos/insert_urls_info.py rename to src/db/dtos/url/insert.py index 35af3f98..f3143668 100644 --- a/src/db/dtos/insert_urls_info.py +++ b/src/db/dtos/url/insert.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from src.db.dtos.url_mapping import URLMapping +from src.db.dtos.url.mapping import URLMapping class InsertURLsInfo(BaseModel): diff --git a/src/db/dtos/url_mapping.py b/src/db/dtos/url/mapping.py similarity index 100% rename from src/db/dtos/url_mapping.py rename to src/db/dtos/url/mapping.py diff --git a/src/db/dtos/url_metadata_info.py b/src/db/dtos/url/metadata.py similarity index 100% rename from src/db/dtos/url_metadata_info.py rename to src/db/dtos/url/metadata.py diff --git a/src/db/dtos/url/raw_html.py b/src/db/dtos/url/raw_html.py new file mode 100644 index 00000000..e3474d7f --- /dev/null +++ b/src/db/dtos/url/raw_html.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel + + +class RawHTMLInfo(BaseModel): + url_id: int + html: str \ No newline at end of file diff --git a/src/db/dtos/url_relevancy_info.py b/src/db/dtos/url/relevancy.py similarity index 100% rename from src/db/dtos/url_relevancy_info.py rename to src/db/dtos/url/relevancy.py diff --git a/src/db/dtos/url_with_html.py b/src/db/dtos/url/with_html.py similarity index 67% rename from src/db/dtos/url_with_html.py rename to src/db/dtos/url/with_html.py index 8e4f5cce..8663930e 100644 --- a/src/db/dtos/url_with_html.py +++ b/src/db/dtos/url/with_html.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from src.db.dtos.url_html_content_info import URLHTMLContentInfo +from src.db.dtos.url.html_content import URLHTMLContentInfo class URLWithHTML(BaseModel): diff --git a/src/db/models/instantiations/url/compressed_html.py b/src/db/models/instantiations/url/compressed_html.py new file mode 100644 index 00000000..5c2e06c0 --- /dev/null +++ b/src/db/models/instantiations/url/compressed_html.py @@ -0,0 +1,21 @@ +from sqlalchemy import Column, LargeBinary +from sqlalchemy.orm import relationship + +from src.db.models.mixins import CreatedAtMixin, URLDependentMixin +from src.db.models.templates import StandardModel + + +class URLCompressedHTML( + CreatedAtMixin, + URLDependentMixin, + StandardModel +): + __tablename__ = 'url_compressed_html' + + compressed_html = Column(LargeBinary, nullable=False) + + url = relationship( + "URL", + uselist=False, + back_populates="compressed_html" + ) \ No newline at end of file diff --git a/src/db/models/instantiations/url/core.py b/src/db/models/instantiations/url/core.py index b5df711a..72fdf628 100644 --- a/src/db/models/instantiations/url/core.py +++ b/src/db/models/instantiations/url/core.py @@ -78,3 +78,8 @@ class URL(UpdatedAtMixin, CreatedAtMixin, StandardModel): uselist=False, back_populates="url" ) + compressed_html = relationship( + "URLCompressedHTML", + uselist=False, + back_populates="url" + ) \ No newline at end of file diff --git a/src/db/queries/implementations/core/final_review/get.py b/src/db/queries/implementations/core/final_review/get.py index 42a549bc..2f181c0e 100644 --- a/src/db/queries/implementations/core/final_review/get.py +++ b/src/db/queries/implementations/core/final_review/get.py @@ -10,7 +10,7 @@ from src.core.tasks.url.operators.url_html.scraper.parser.util import convert_to_response_html_info from src.db.constants import ALL_ANNOTATION_MODELS, USER_ANNOTATION_MODELS from src.db.dto_converter import DTOConverter -from src.db.dtos.url_html_content_info import URLHTMLContentInfo +from src.db.dtos.url.html_content import URLHTMLContentInfo from src.db.exceptions import FailedQueryException from src.db.models.instantiations.batch import Batch from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency diff --git a/src/db/utils/__init__.py b/src/db/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/utils/compression.py b/src/db/utils/compression.py new file mode 100644 index 00000000..2944b893 --- /dev/null +++ b/src/db/utils/compression.py @@ -0,0 +1,8 @@ +import brotli + + +def compress_html(html: str) -> bytes: + return brotli.compress(html.encode('utf-8')) + +def decompress_html(compressed_html: bytes) -> str: + return brotli.decompress(compressed_html).decode('utf-8') \ No newline at end of file diff --git a/tests/automated/integration/api/test_annotate.py b/tests/automated/integration/api/test_annotate.py index b869c80a..ebaec4e8 100644 --- a/tests/automated/integration/api/test_annotate.py +++ b/tests/automated/integration/api/test_annotate.py @@ -10,8 +10,8 @@ from src.api.endpoints.annotate.dtos.relevance.post import RelevanceAnnotationPostInfo from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseOuterInfo from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo -from src.db.dtos.insert_urls_info import InsertURLsInfo -from src.db.dtos.url_mapping import URLMapping +from src.db.dtos.url.insert import InsertURLsInfo +from src.db.dtos.url.mapping import URLMapping from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion from src.core.error_manager.enums import ErrorTypes from src.core.enums import RecordType, SuggestionType, SuggestedStatus diff --git a/tests/automated/integration/api/test_batch.py b/tests/automated/integration/api/test_batch.py index 7b741807..eea90bf2 100644 --- a/tests/automated/integration/api/test_batch.py +++ b/tests/automated/integration/api/test_batch.py @@ -1,7 +1,7 @@ import pytest -from src.db.dtos.batch_info import BatchInfo -from src.db.dtos.insert_urls_info import InsertURLsInfo +from src.db.dtos.batch import BatchInfo +from src.db.dtos.url.insert import InsertURLsInfo from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO from src.collectors.enums import CollectorType, URLStatus from src.core.enums import BatchStatus diff --git a/tests/automated/integration/api/test_duplicates.py b/tests/automated/integration/api/test_duplicates.py index 49c1e15d..0534292c 100644 --- a/tests/automated/integration/api/test_duplicates.py +++ b/tests/automated/integration/api/test_duplicates.py @@ -1,7 +1,7 @@ import pytest from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary -from src.db.dtos.batch_info import BatchInfo +from src.db.dtos.batch import BatchInfo from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO from tests.automated.integration.api.conftest import disable_task_trigger diff --git a/tests/automated/integration/api/test_example_collector.py b/tests/automated/integration/api/test_example_collector.py index a1c5694f..d1d537e2 100644 --- a/tests/automated/integration/api/test_example_collector.py +++ b/tests/automated/integration/api/test_example_collector.py @@ -7,7 +7,7 @@ from src.api.endpoints.batch.dtos.get.summaries.response import GetBatchSummariesResponse from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary from src.db.client.async_ import AsyncDatabaseClient -from src.db.dtos.batch_info import BatchInfo +from src.db.dtos.batch import BatchInfo from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO from src.collectors.source_collectors.example.core import ExampleCollector from src.collectors.enums import CollectorType diff --git a/tests/automated/integration/api/test_url.py b/tests/automated/integration/api/test_url.py index f7568f5e..95c5f99f 100644 --- a/tests/automated/integration/api/test_url.py +++ b/tests/automated/integration/api/test_url.py @@ -1,7 +1,7 @@ import pytest from src.api.endpoints.url.dtos.response import GetURLsResponseInfo -from src.db.dtos.insert_urls_info import InsertURLsInfo +from src.db.dtos.url.insert import InsertURLsInfo @pytest.mark.asyncio diff --git a/tests/automated/integration/collector_db/__init__.py b/tests/automated/integration/collector_db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/db/client/annotate_url/test_marked_not_relevant.py b/tests/automated/integration/db/client/annotate_url/test_marked_not_relevant.py index b852e9eb..de2794ec 100644 --- a/tests/automated/integration/db/client/annotate_url/test_marked_not_relevant.py +++ b/tests/automated/integration/db/client/annotate_url/test_marked_not_relevant.py @@ -1,7 +1,7 @@ import pytest from src.core.enums import SuggestedStatus -from src.db.dtos.url_mapping import URLMapping +from src.db.dtos.url.mapping import URLMapping from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/test_add_url_error_info.py b/tests/automated/integration/db/client/test_add_url_error_info.py index aa5ed5f9..34d103ce 100644 --- a/tests/automated/integration/db/client/test_add_url_error_info.py +++ b/tests/automated/integration/db/client/test_add_url_error_info.py @@ -1,7 +1,7 @@ import pytest from src.db.client.async_ import AsyncDatabaseClient -from src.db.dtos.url_error_info import URLErrorPydanticInfo +from src.db.dtos.url.error import URLErrorPydanticInfo from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/test_delete_old_logs.py b/tests/automated/integration/db/client/test_delete_old_logs.py index b6688340..d451af8f 100644 --- a/tests/automated/integration/db/client/test_delete_old_logs.py +++ b/tests/automated/integration/db/client/test_delete_old_logs.py @@ -2,7 +2,7 @@ import pytest -from src.db.dtos.log_info import LogInfo +from src.db.dtos.log import LogInfo from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/test_delete_url_updated_at.py b/tests/automated/integration/db/client/test_delete_url_updated_at.py index 03ac7ae5..a6ca731b 100644 --- a/tests/automated/integration/db/client/test_delete_url_updated_at.py +++ b/tests/automated/integration/db/client/test_delete_url_updated_at.py @@ -1,4 +1,4 @@ -from src.db.dtos.url_info import URLInfo +from src.db.dtos.url.core import URLInfo from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/test_insert_logs.py b/tests/automated/integration/db/client/test_insert_logs.py index f8d1cb8d..d752c894 100644 --- a/tests/automated/integration/db/client/test_insert_logs.py +++ b/tests/automated/integration/db/client/test_insert_logs.py @@ -1,6 +1,6 @@ import pytest -from src.db.dtos.log_info import LogInfo +from src.db.dtos.log import LogInfo from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/test_insert_urls.py b/tests/automated/integration/db/client/test_insert_urls.py index 5021becd..73a88d02 100644 --- a/tests/automated/integration/db/client/test_insert_urls.py +++ b/tests/automated/integration/db/client/test_insert_urls.py @@ -1,8 +1,8 @@ import pytest from src.core.enums import BatchStatus -from src.db.dtos.batch_info import BatchInfo -from src.db.dtos.url_info import URLInfo +from src.db.dtos.batch import BatchInfo +from src.db.dtos.url.core import URLInfo @pytest.mark.asyncio diff --git a/tests/automated/integration/db/test_database_structure.py b/tests/automated/integration/db/test_database_structure.py index e95e218e..80362aaf 100644 --- a/tests/automated/integration/db/test_database_structure.py +++ b/tests/automated/integration/db/test_database_structure.py @@ -17,7 +17,7 @@ from sqlalchemy.exc import DataError from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo -from src.db.dtos.insert_urls_info import InsertURLsInfo +from src.db.dtos.url.insert import InsertURLsInfo from src.db.enums import URLHTMLContentType from src.db.helpers import get_postgres_connection_string from src.db.models.instantiations.agency import Agency diff --git a/tests/automated/integration/tasks/scheduled/__init__.py b/tests/automated/integration/tasks/scheduled/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/tasks/scheduled/agency_sync/__init__.py b/tests/automated/integration/tasks/scheduled/agency_sync/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/tasks/agency_sync/conftest.py b/tests/automated/integration/tasks/scheduled/agency_sync/conftest.py similarity index 81% rename from tests/automated/integration/tasks/agency_sync/conftest.py rename to tests/automated/integration/tasks/scheduled/agency_sync/conftest.py index 587b85fa..b621250f 100644 --- a/tests/automated/integration/tasks/agency_sync/conftest.py +++ b/tests/automated/integration/tasks/scheduled/agency_sync/conftest.py @@ -1,7 +1,7 @@ import pytest_asyncio from src.core.tasks.scheduled.operators.agency_sync.core import SyncAgenciesTaskOperator -from tests.automated.integration.tasks.agency_sync.helpers import update_existing_agencies_updated_at, \ +from tests.automated.integration.tasks.scheduled.agency_sync.helpers import update_existing_agencies_updated_at, \ add_existing_agencies @pytest_asyncio.fixture diff --git a/tests/automated/integration/tasks/agency_sync/data.py b/tests/automated/integration/tasks/scheduled/agency_sync/data.py similarity index 100% rename from tests/automated/integration/tasks/agency_sync/data.py rename to tests/automated/integration/tasks/scheduled/agency_sync/data.py diff --git a/tests/automated/integration/tasks/agency_sync/existence_checker.py b/tests/automated/integration/tasks/scheduled/agency_sync/existence_checker.py similarity index 88% rename from tests/automated/integration/tasks/agency_sync/existence_checker.py rename to tests/automated/integration/tasks/scheduled/agency_sync/existence_checker.py index 0cffde7f..82ac7a88 100644 --- a/tests/automated/integration/tasks/agency_sync/existence_checker.py +++ b/tests/automated/integration/tasks/scheduled/agency_sync/existence_checker.py @@ -1,6 +1,6 @@ from src.db.models.instantiations.agency import Agency from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInnerInfo -from tests.automated.integration.tasks.agency_sync.data import FIRST_CALL_RESPONSE, SECOND_CALL_RESPONSE +from tests.automated.integration.tasks.scheduled.agency_sync.data import FIRST_CALL_RESPONSE, SECOND_CALL_RESPONSE class AgencyChecker: diff --git a/tests/automated/integration/tasks/agency_sync/helpers.py b/tests/automated/integration/tasks/scheduled/agency_sync/helpers.py similarity index 96% rename from tests/automated/integration/tasks/agency_sync/helpers.py rename to tests/automated/integration/tasks/scheduled/agency_sync/helpers.py index 12c13ff5..c198db68 100644 --- a/tests/automated/integration/tasks/agency_sync/helpers.py +++ b/tests/automated/integration/tasks/scheduled/agency_sync/helpers.py @@ -8,7 +8,7 @@ from src.db.models.instantiations.agency import Agency from src.db.models.instantiations.sync_state_agencies import AgenciesSyncState from src.pdap_api.client import PDAPClient -from tests.automated.integration.tasks.agency_sync.data import PREEXISTING_AGENCIES +from tests.automated.integration.tasks.scheduled.agency_sync.data import PREEXISTING_AGENCIES async def check_sync_concluded( diff --git a/tests/automated/integration/tasks/agency_sync/test_happy_path.py b/tests/automated/integration/tasks/scheduled/agency_sync/test_happy_path.py similarity index 83% rename from tests/automated/integration/tasks/agency_sync/test_happy_path.py rename to tests/automated/integration/tasks/scheduled/agency_sync/test_happy_path.py index c8a29fb5..903008b4 100644 --- a/tests/automated/integration/tasks/agency_sync/test_happy_path.py +++ b/tests/automated/integration/tasks/scheduled/agency_sync/test_happy_path.py @@ -6,9 +6,9 @@ from src.core.tasks.scheduled.operators.agency_sync.core import SyncAgenciesTaskOperator from src.core.tasks.scheduled.operators.agency_sync.dtos.parameters import AgencySyncParameters from src.db.models.instantiations.agency import Agency -from tests.automated.integration.tasks.agency_sync.data import AGENCIES_SYNC_RESPONSES -from tests.automated.integration.tasks.agency_sync.existence_checker import AgencyChecker -from tests.automated.integration.tasks.agency_sync.helpers import check_sync_concluded, patch_sync_agencies +from tests.automated.integration.tasks.scheduled.agency_sync.data import AGENCIES_SYNC_RESPONSES +from tests.automated.integration.tasks.scheduled.agency_sync.existence_checker import AgencyChecker +from tests.automated.integration.tasks.scheduled.agency_sync.helpers import check_sync_concluded, patch_sync_agencies from tests.helpers.assert_functions import assert_task_run_success diff --git a/tests/automated/integration/tasks/agency_sync/test_interruption.py b/tests/automated/integration/tasks/scheduled/agency_sync/test_interruption.py similarity index 87% rename from tests/automated/integration/tasks/agency_sync/test_interruption.py rename to tests/automated/integration/tasks/scheduled/agency_sync/test_interruption.py index d37fe395..f11e4e1f 100644 --- a/tests/automated/integration/tasks/agency_sync/test_interruption.py +++ b/tests/automated/integration/tasks/scheduled/agency_sync/test_interruption.py @@ -5,11 +5,10 @@ from src.core.tasks.url.enums import TaskOperatorOutcome from src.db.models.instantiations.agency import Agency from src.db.models.instantiations.sync_state_agencies import AgenciesSyncState -from tests.automated.integration.tasks.agency_sync.data import FIRST_CALL_RESPONSE, \ +from tests.automated.integration.tasks.scheduled.agency_sync.data import FIRST_CALL_RESPONSE, \ THIRD_CALL_RESPONSE, SECOND_CALL_RESPONSE -from tests.automated.integration.tasks.agency_sync.existence_checker import AgencyChecker -from tests.automated.integration.tasks.agency_sync.helpers import patch_sync_agencies, check_sync_concluded -from tests.helpers.assert_functions import assert_task_run_success +from tests.automated.integration.tasks.scheduled.agency_sync.existence_checker import AgencyChecker +from tests.automated.integration.tasks.scheduled.agency_sync.helpers import patch_sync_agencies, check_sync_concluded @pytest.mark.asyncio diff --git a/tests/automated/integration/tasks/agency_sync/test_no_new_results.py b/tests/automated/integration/tasks/scheduled/agency_sync/test_no_new_results.py similarity index 83% rename from tests/automated/integration/tasks/agency_sync/test_no_new_results.py rename to tests/automated/integration/tasks/scheduled/agency_sync/test_no_new_results.py index b0c9377c..9d01555e 100644 --- a/tests/automated/integration/tasks/agency_sync/test_no_new_results.py +++ b/tests/automated/integration/tasks/scheduled/agency_sync/test_no_new_results.py @@ -8,9 +8,9 @@ from src.core.tasks.scheduled.operators.agency_sync.dtos.parameters import AgencySyncParameters from src.db.models.instantiations.agency import Agency from src.db.models.instantiations.sync_state_agencies import AgenciesSyncState -from tests.automated.integration.tasks.agency_sync.data import THIRD_CALL_RESPONSE -from tests.automated.integration.tasks.agency_sync.existence_checker import AgencyChecker -from tests.automated.integration.tasks.agency_sync.helpers import patch_sync_agencies, check_sync_concluded +from tests.automated.integration.tasks.scheduled.agency_sync.data import THIRD_CALL_RESPONSE +from tests.automated.integration.tasks.scheduled.agency_sync.existence_checker import AgencyChecker +from tests.automated.integration.tasks.scheduled.agency_sync.helpers import patch_sync_agencies, check_sync_concluded from tests.helpers.assert_functions import assert_task_run_success diff --git a/tests/automated/integration/tasks/test_url_html_task.py b/tests/automated/integration/tasks/test_url_html_task.py deleted file mode 100644 index ebe43e9b..00000000 --- a/tests/automated/integration/tasks/test_url_html_task.py +++ /dev/null @@ -1,129 +0,0 @@ -import types -from http import HTTPStatus -from typing import Optional - -import pytest -from aiohttp import ClientResponseError, RequestInfo - -from src.core.tasks.url.operators.url_html.core import URLHTMLTaskOperator -from src.core.tasks.url.operators.url_html.scraper.parser.core import HTMLResponseParser -from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo -from src.core.tasks.url.operators.url_html.scraper.request_interface.core import URLRequestInterface -from src.db.client.async_ import AsyncDatabaseClient -from src.db.enums import TaskType -from src.collectors.enums import URLStatus -from src.core.tasks.url.enums import TaskOperatorOutcome -from tests.helpers.db_data_creator import DBDataCreator -from src.core.tasks.url.operators.url_html.scraper.root_url_cache.core import RootURLCache -from src.core.tasks.url.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo - - -@pytest.mark.asyncio -async def test_url_html_task(db_data_creator: DBDataCreator): - - mock_html_content = "" - mock_content_type = "text/html" - - async def mock_make_requests(self, urls: list[str]) -> list[URLResponseInfo]: - results = [] - for idx, url in enumerate(urls): - if idx == 1: - results.append( - URLResponseInfo( - success=False, - content_type=mock_content_type, - exception=str(ClientResponseError( - request_info=RequestInfo( - url=url, - method="GET", - real_url=url, - headers={}, - ), - code=HTTPStatus.NOT_FOUND.value, - history=(None,), - )), - status=HTTPStatus.NOT_FOUND - ) - ) - continue - - if idx == 2: - results.append( - URLResponseInfo( - success=False, - exception=str(ValueError("test error")), - content_type=mock_content_type - )) - else: - results.append(URLResponseInfo( - html=mock_html_content, success=True, content_type=mock_content_type)) - return results - - async def mock_parse(self, url: str, html_content: str, content_type: str) -> ResponseHTMLInfo: - assert html_content == mock_html_content - assert content_type == mock_content_type - return ResponseHTMLInfo( - url=url, - title="fake title", - description="fake description", - ) - - async def mock_get_from_cache(self, url: str) -> Optional[str]: - return None - - # Add mock methods or mock classes - url_request_interface = URLRequestInterface() - url_request_interface.make_requests_with_html = types.MethodType(mock_make_requests, url_request_interface) - - mock_root_url_cache = RootURLCache() - mock_root_url_cache.get_from_cache = types.MethodType(mock_get_from_cache, mock_root_url_cache) - - html_parser = HTMLResponseParser( - root_url_cache=mock_root_url_cache - ) - html_parser.parse = types.MethodType(mock_parse, html_parser) - - operator = URLHTMLTaskOperator( - adb_client=AsyncDatabaseClient(), - url_request_interface=url_request_interface, - html_parser=html_parser - ) - - meets_prereqs = await operator.meets_task_prerequisites() - # Check that, because no URLs were created, the prereqs are not met - assert not meets_prereqs - - batch_id = db_data_creator.batch() - url_mappings = db_data_creator.urls(batch_id=batch_id, url_count=3).url_mappings - url_ids = [url_info.url_id for url_info in url_mappings] - - task_id = await db_data_creator.adb_client.initiate_task(task_type=TaskType.HTML) - run_info = await operator.run_task(task_id) - assert run_info.outcome == TaskOperatorOutcome.SUCCESS - assert run_info.linked_url_ids == url_ids - - - # Check in database that - # - task type is listed as 'HTML' - # - task has 3 urls - # - task has one errored url with error "ValueError" - task_info = await db_data_creator.adb_client.get_task_info( - task_id=operator.task_id - ) - - assert task_info.error_info is None - assert task_info.task_type == TaskType.HTML - - assert len(task_info.url_errors) == 1 - assert task_info.url_errors[0].error == "test error" - - adb = db_data_creator.adb_client - # Check that success url has two rows of HTML data - await adb.link_urls_to_task(task_id=run_info.task_id, url_ids=run_info.linked_url_ids) - hci = await adb.get_html_content_info(url_id=url_ids[0]) - assert len(hci) == 2 - - # Check that 404 url has status of 404 - url_info_404 = await adb.get_url_info_by_id(url_id=url_ids[1]) - assert url_info_404.outcome == URLStatus.NOT_FOUND - # Check that errored url has error info diff --git a/tests/automated/integration/tasks/url/__init__.py b/tests/automated/integration/tasks/url/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/tasks/url/duplicate/__init__.py b/tests/automated/integration/tasks/url/duplicate/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/tasks/url/duplicate/constants.py b/tests/automated/integration/tasks/url/duplicate/constants.py new file mode 100644 index 00000000..01682c3a --- /dev/null +++ b/tests/automated/integration/tasks/url/duplicate/constants.py @@ -0,0 +1,16 @@ +from src.collectors.enums import URLStatus +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters + +BATCH_CREATION_PARAMETERS = TestBatchCreationParameters( + urls=[ + TestURLCreationParameters( + count=1, + status=URLStatus.ERROR + ), + TestURLCreationParameters( + count=2, + status=URLStatus.PENDING + ), + ] +) \ No newline at end of file diff --git a/tests/automated/integration/tasks/test_url_duplicate_task.py b/tests/automated/integration/tasks/url/duplicate/test_url_duplicate_task.py similarity index 80% rename from tests/automated/integration/tasks/test_url_duplicate_task.py rename to tests/automated/integration/tasks/url/duplicate/test_url_duplicate_task.py index b63695c0..c8eebd03 100644 --- a/tests/automated/integration/tasks/test_url_duplicate_task.py +++ b/tests/automated/integration/tasks/url/duplicate/test_url_duplicate_task.py @@ -4,14 +4,13 @@ import pytest from src.core.tasks.url.operators.url_duplicate.core import URLDuplicateTaskOperator -from src.db.dtos.url_mapping import URLMapping +from src.db.dtos.url.mapping import URLMapping from src.db.models.instantiations.url.checked_for_duplicate import URLCheckedForDuplicate from src.db.models.instantiations.url.core import URL from src.collectors.enums import URLStatus from src.core.tasks.url.enums import TaskOperatorOutcome +from tests.automated.integration.tasks.url.duplicate.constants import BATCH_CREATION_PARAMETERS from tests.helpers.db_data_creator import DBDataCreator -from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters -from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters from pdap_access_manager import ResponseInfo from src.pdap_api.client import PDAPClient @@ -21,8 +20,6 @@ async def test_url_duplicate_task( db_data_creator: DBDataCreator, mock_pdap_client: PDAPClient ): - - operator = URLDuplicateTaskOperator( adb_client=db_data_creator.adb_client, pdap_client=mock_pdap_client @@ -34,20 +31,7 @@ async def test_url_duplicate_task( make_request_mock.assert_not_called() # Add three URLs to the database, one of which is in error, the other two pending - creation_info = await db_data_creator.batch_v2( - parameters=TestBatchCreationParameters( - urls=[ - TestURLCreationParameters( - count=1, - status=URLStatus.ERROR - ), - TestURLCreationParameters( - count=2, - status=URLStatus.PENDING - ), - ] - ) - ) + creation_info = await db_data_creator.batch_v2(BATCH_CREATION_PARAMETERS) pending_urls: list[URLMapping] = creation_info.url_creation_infos[URLStatus.PENDING].url_mappings duplicate_url = pending_urls[0] non_duplicate_url = pending_urls[1] diff --git a/tests/automated/integration/tasks/url/html/__init__.py b/tests/automated/integration/tasks/url/html/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/tasks/url/html/asserts.py b/tests/automated/integration/tasks/url/html/asserts.py new file mode 100644 index 00000000..a5bf19f6 --- /dev/null +++ b/tests/automated/integration/tasks/url/html/asserts.py @@ -0,0 +1,64 @@ +from src.collectors.enums import URLStatus +from src.core.tasks.url.enums import TaskOperatorOutcome +from src.db.client.async_ import AsyncDatabaseClient +from src.db.enums import TaskType +from src.db.models.instantiations.url.compressed_html import URLCompressedHTML +from src.db.utils.compression import decompress_html +from tests.automated.integration.tasks.url.html.mocks.constants import MOCK_HTML_CONTENT + + +async def assert_prereqs_not_met(operator): + # TODO: Look into using this function in other tests + meets_prereqs = await operator.meets_task_prerequisites() + assert not meets_prereqs + + +def assert_task_has_expected_run_info(run_info, url_ids: list[int]): + assert run_info.outcome == TaskOperatorOutcome.SUCCESS + assert run_info.linked_url_ids == url_ids + + +async def assert_success_url_has_two_html_content_entries( + adb: AsyncDatabaseClient, + run_info, + url_id: int +): + await adb.link_urls_to_task(task_id=run_info.task_id, url_ids=run_info.linked_url_ids) + hci = await adb.get_html_content_info(url_id=url_id) + assert len(hci) == 2 + +async def assert_url_has_one_compressed_html_content_entry( + adb: AsyncDatabaseClient, + url_id: int +): + html = await adb.get_html_for_url(url_id=url_id) + assert html == MOCK_HTML_CONTENT + +async def assert_success_url_has_one_compressed_html_content_entry( + adb: AsyncDatabaseClient, + run_info, + url_id: int +): + await adb.link_urls_to_task(task_id=run_info.task_id, url_ids=run_info.linked_url_ids) + hci = await adb.get_html_content_info(url_id=url_id) + assert len(hci) == 1 + +async def assert_404_url_has_404_status( + adb: AsyncDatabaseClient, + url_id: int +): + url_info_404 = await adb.get_url_info_by_id(url_id=url_id) + assert url_info_404.outcome == URLStatus.NOT_FOUND + + +def assert_task_has_one_url_error(task_info): + assert len(task_info.url_errors) == 1 + assert task_info.url_errors[0].error == "test error" + + +def assert_task_type_is_html(task_info): + assert task_info.task_type == TaskType.HTML + + +def assert_task_ran_without_error(task_info): + assert task_info.error_info is None diff --git a/tests/automated/integration/tasks/url/html/mocks/__init__.py b/tests/automated/integration/tasks/url/html/mocks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/tasks/url/html/mocks/constants.py b/tests/automated/integration/tasks/url/html/mocks/constants.py new file mode 100644 index 00000000..0b60341d --- /dev/null +++ b/tests/automated/integration/tasks/url/html/mocks/constants.py @@ -0,0 +1,3 @@ + +MOCK_HTML_CONTENT = "" +MOCK_CONTENT_TYPE = "text/html" \ No newline at end of file diff --git a/tests/automated/integration/tasks/url/html/mocks/methods.py b/tests/automated/integration/tasks/url/html/mocks/methods.py new file mode 100644 index 00000000..dd623ee8 --- /dev/null +++ b/tests/automated/integration/tasks/url/html/mocks/methods.py @@ -0,0 +1,61 @@ +from http import HTTPStatus +from typing import Optional + +from aiohttp import ClientResponseError, RequestInfo + +from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo +from src.core.tasks.url.operators.url_html.scraper.request_interface.dtos.url_response import URLResponseInfo +from tests.automated.integration.tasks.url.html.mocks.constants import MOCK_CONTENT_TYPE, MOCK_HTML_CONTENT + + +async def mock_make_requests(self, urls: list[str]) -> list[URLResponseInfo]: + results = [] + for idx, url in enumerate(urls): + # Second result should produce a 404 + if idx == 1: + results.append( + URLResponseInfo( + success=False, + content_type=MOCK_CONTENT_TYPE, + exception=str(ClientResponseError( + request_info=RequestInfo( + url=url, + method="GET", + real_url=url, + headers={}, + ), + code=HTTPStatus.NOT_FOUND.value, + history=(None,), + )), + status=HTTPStatus.NOT_FOUND + ) + ) + continue + + if idx == 2: + # 3rd result should produce an error + results.append( + URLResponseInfo( + success=False, + exception=str(ValueError("test error")), + content_type=MOCK_CONTENT_TYPE + )) + else: + # All other results should succeed + results.append(URLResponseInfo( + html=MOCK_HTML_CONTENT, success=True, content_type=MOCK_CONTENT_TYPE)) + return results + + +async def mock_parse(self, url: str, html_content: str, content_type: str) -> ResponseHTMLInfo: + assert html_content == MOCK_HTML_CONTENT + assert content_type == MOCK_CONTENT_TYPE + return ResponseHTMLInfo( + url=url, + title="fake title", + description="fake description", + ) + + +async def mock_get_from_cache(self, url: str) -> Optional[str]: + return None diff --git a/tests/automated/integration/tasks/url/html/setup.py b/tests/automated/integration/tasks/url/html/setup.py new file mode 100644 index 00000000..e71bf013 --- /dev/null +++ b/tests/automated/integration/tasks/url/html/setup.py @@ -0,0 +1,41 @@ +import types + +from src.core.tasks.url.operators.url_html.core import URLHTMLTaskOperator +from src.core.tasks.url.operators.url_html.scraper.parser.core import HTMLResponseParser + +from src.core.tasks.url.operators.url_html.scraper.request_interface.core import URLRequestInterface +from src.core.tasks.url.operators.url_html.scraper.root_url_cache.core import RootURLCache +from src.db.client.async_ import AsyncDatabaseClient +from tests.automated.integration.tasks.url.html.mocks.methods import mock_make_requests, mock_get_from_cache, mock_parse + + +async def setup_mocked_url_request_interface(): + url_request_interface = URLRequestInterface() + url_request_interface.make_requests_with_html = types.MethodType(mock_make_requests, url_request_interface) + return url_request_interface + + +async def setup_mocked_root_url_cache(): + mock_root_url_cache = RootURLCache() + mock_root_url_cache.get_from_cache = types.MethodType(mock_get_from_cache, mock_root_url_cache) + return mock_root_url_cache + + +async def setup_urls(db_data_creator): + batch_id = db_data_creator.batch() + url_mappings = db_data_creator.urls(batch_id=batch_id, url_count=3).url_mappings + url_ids = [url_info.url_id for url_info in url_mappings] + return url_ids + + +async def setup_operator(): + html_parser = HTMLResponseParser( + root_url_cache=await setup_mocked_root_url_cache() + ) + html_parser.parse = types.MethodType(mock_parse, html_parser) + operator = URLHTMLTaskOperator( + adb_client=AsyncDatabaseClient(), + url_request_interface=await setup_mocked_url_request_interface(), + html_parser=html_parser + ) + return operator diff --git a/tests/automated/integration/tasks/url/html/test_task.py b/tests/automated/integration/tasks/url/html/test_task.py new file mode 100644 index 00000000..6c44ab93 --- /dev/null +++ b/tests/automated/integration/tasks/url/html/test_task.py @@ -0,0 +1,42 @@ +import pytest + +from src.db.enums import TaskType +from tests.automated.integration.tasks.url.html.asserts import assert_prereqs_not_met, \ + assert_task_has_expected_run_info, \ + assert_success_url_has_two_html_content_entries, assert_404_url_has_404_status, assert_task_has_one_url_error, \ + assert_task_type_is_html, assert_task_ran_without_error, assert_url_has_one_compressed_html_content_entry +from tests.automated.integration.tasks.url.html.setup import setup_urls, setup_operator +from tests.helpers.db_data_creator import DBDataCreator + + +@pytest.mark.asyncio +async def test_url_html_task(db_data_creator: DBDataCreator): + + operator = await setup_operator() + + # No URLs were created, the prereqs should not be met + await assert_prereqs_not_met(operator) + + url_ids = await setup_urls(db_data_creator) + success_url_id = url_ids[0] + not_found_url_id = url_ids[1] + + task_id = await db_data_creator.adb_client.initiate_task(task_type=TaskType.HTML) + run_info = await operator.run_task(task_id) + assert_task_has_expected_run_info(run_info, url_ids) + + + task_info = await db_data_creator.adb_client.get_task_info( + task_id=operator.task_id + ) + + assert_task_ran_without_error(task_info) + assert_task_type_is_html(task_info) + assert_task_has_one_url_error(task_info) + + adb = db_data_creator.adb_client + await assert_success_url_has_two_html_content_entries(adb, run_info, success_url_id) + await assert_url_has_one_compressed_html_content_entry(adb, success_url_id) + await assert_404_url_has_404_status(adb, not_found_url_id) + + diff --git a/tests/automated/integration/tasks/test_agency_preannotation_task.py b/tests/automated/integration/tasks/url/test_agency_preannotation_task.py similarity index 100% rename from tests/automated/integration/tasks/test_agency_preannotation_task.py rename to tests/automated/integration/tasks/url/test_agency_preannotation_task.py diff --git a/tests/automated/integration/tasks/test_example_task.py b/tests/automated/integration/tasks/url/test_example_task.py similarity index 100% rename from tests/automated/integration/tasks/test_example_task.py rename to tests/automated/integration/tasks/url/test_example_task.py diff --git a/tests/automated/integration/tasks/test_submit_approved_url_task.py b/tests/automated/integration/tasks/url/test_submit_approved_url_task.py similarity index 100% rename from tests/automated/integration/tasks/test_submit_approved_url_task.py rename to tests/automated/integration/tasks/url/test_submit_approved_url_task.py diff --git a/tests/automated/integration/tasks/test_url_404_probe.py b/tests/automated/integration/tasks/url/test_url_404_probe.py similarity index 100% rename from tests/automated/integration/tasks/test_url_404_probe.py rename to tests/automated/integration/tasks/url/test_url_404_probe.py diff --git a/tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py b/tests/automated/integration/tasks/url/test_url_miscellaneous_metadata_task.py similarity index 100% rename from tests/automated/integration/tasks/test_url_miscellaneous_metadata_task.py rename to tests/automated/integration/tasks/url/test_url_miscellaneous_metadata_task.py diff --git a/tests/automated/integration/tasks/test_url_record_type_task.py b/tests/automated/integration/tasks/url/test_url_record_type_task.py similarity index 100% rename from tests/automated/integration/tasks/test_url_record_type_task.py rename to tests/automated/integration/tasks/url/test_url_record_type_task.py diff --git a/tests/automated/unit/core/test_core_logger.py b/tests/automated/unit/core/test_core_logger.py index 9ddf28d0..f6738011 100644 --- a/tests/automated/unit/core/test_core_logger.py +++ b/tests/automated/unit/core/test_core_logger.py @@ -3,7 +3,7 @@ import pytest -from src.db.dtos.log_info import LogInfo +from src.db.dtos.log import LogInfo from src.core.logger import AsyncCoreLogger diff --git a/tests/automated/unit/source_collectors/test_autogoogler_collector.py b/tests/automated/unit/source_collectors/test_autogoogler_collector.py index 7026194d..96fbf8c4 100644 --- a/tests/automated/unit/source_collectors/test_autogoogler_collector.py +++ b/tests/automated/unit/source_collectors/test_autogoogler_collector.py @@ -5,7 +5,7 @@ from src.collectors.source_collectors.auto_googler.dtos.query_results import GoogleSearchQueryResultsInnerDTO from src.collectors.source_collectors.auto_googler.dtos.input import AutoGooglerInputDTO from src.db.client.async_ import AsyncDatabaseClient -from src.db.dtos.url_info import URLInfo +from src.db.dtos.url.core import URLInfo from src.core.logger import AsyncCoreLogger from src.collectors.source_collectors.auto_googler.collector import AutoGooglerCollector diff --git a/tests/automated/unit/source_collectors/test_common_crawl_collector.py b/tests/automated/unit/source_collectors/test_common_crawl_collector.py index 70c7c4ef..070f9533 100644 --- a/tests/automated/unit/source_collectors/test_common_crawl_collector.py +++ b/tests/automated/unit/source_collectors/test_common_crawl_collector.py @@ -4,7 +4,7 @@ from src.collectors.source_collectors.common_crawler.input import CommonCrawlerInputDTO from src.db.client.async_ import AsyncDatabaseClient -from src.db.dtos.url_info import URLInfo +from src.db.dtos.url.core import URLInfo from src.core.logger import AsyncCoreLogger from src.collectors.source_collectors.common_crawler.collector import CommonCrawlerCollector diff --git a/tests/automated/unit/source_collectors/test_muckrock_collectors.py b/tests/automated/unit/source_collectors/test_muckrock_collectors.py index a9ec7522..b3e9fec1 100644 --- a/tests/automated/unit/source_collectors/test_muckrock_collectors.py +++ b/tests/automated/unit/source_collectors/test_muckrock_collectors.py @@ -3,13 +3,11 @@ import pytest -from src.collectors.source_collectors.muckrock.collectors.all_foia.core import MuckrockAllFOIARequestsCollector from src.collectors.source_collectors.muckrock.collectors.county.core import MuckrockCountyLevelSearchCollector from src.collectors.source_collectors.muckrock.collectors.simple.core import MuckrockSimpleSearchCollector from src.db.client.async_ import AsyncDatabaseClient -from src.db.dtos.url_info import URLInfo +from src.db.dtos.url.core import URLInfo from src.core.logger import AsyncCoreLogger -from src.collectors.source_collectors.muckrock.collectors.all_foia.dto import MuckrockAllFOIARequestsCollectorInputDTO from src.collectors.source_collectors.muckrock.collectors.county.dto import MuckrockCountySearchCollectorInputDTO from src.collectors.source_collectors.muckrock.collectors.simple.dto import MuckrockSimpleSearchCollectorInputDTO from src.collectors.source_collectors.muckrock.fetch_requests.foia import FOIAFetchRequest diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index 156f0251..600ccfd7 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -3,8 +3,8 @@ from pydantic import BaseModel from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo -from src.db.dtos.insert_urls_info import InsertURLsInfo -from src.db.dtos.url_mapping import URLMapping +from src.db.dtos.url.insert import InsertURLsInfo +from src.db.dtos.url.mapping import URLMapping from src.collectors.enums import URLStatus from src.core.enums import RecordType, SuggestionType from tests.helpers.db_data_creator import BatchURLCreationInfo diff --git a/tests/helpers/db_data_creator.py b/tests/helpers/db_data_creator.py index dfdac1f5..2591b9cb 100644 --- a/tests/helpers/db_data_creator.py +++ b/tests/helpers/db_data_creator.py @@ -9,13 +9,13 @@ from src.api.endpoints.review.enums import RejectionReason from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.db.client.async_ import AsyncDatabaseClient -from src.db.dtos.batch_info import BatchInfo -from src.db.dtos.duplicate_info import DuplicateInsertInfo -from src.db.dtos.insert_urls_info import InsertURLsInfo -from src.db.dtos.url_error_info import URLErrorPydanticInfo -from src.db.dtos.url_html_content_info import URLHTMLContentInfo, HTMLContentType -from src.db.dtos.url_info import URLInfo -from src.db.dtos.url_mapping import URLMapping +from src.db.dtos.batch import BatchInfo +from src.db.dtos.duplicate import DuplicateInsertInfo +from src.db.dtos.url.insert import InsertURLsInfo +from src.db.dtos.url.error import URLErrorPydanticInfo +from src.db.dtos.url.html_content import URLHTMLContentInfo, HTMLContentType +from src.db.dtos.url.core import URLInfo +from src.db.dtos.url.mapping import URLMapping from src.db.client.sync import DatabaseClient from src.db.enums import TaskType from src.collectors.enums import CollectorType, URLStatus diff --git a/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py b/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py index d9f1cd7a..ae78c5dd 100644 --- a/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py +++ b/tests/manual/core/lifecycle/test_auto_googler_lifecycle.py @@ -2,7 +2,7 @@ import dotenv -from src.db.dtos.batch_info import BatchInfo +from src.db.dtos.batch import BatchInfo from src.collectors import CollectorType from src.core.enums import BatchStatus from test_automated.integration.core.helpers.common_test_procedures import run_collector_and_wait_for_completion diff --git a/tests/manual/core/lifecycle/test_ckan_lifecycle.py b/tests/manual/core/lifecycle/test_ckan_lifecycle.py index 7f7be82e..d6f10064 100644 --- a/tests/manual/core/lifecycle/test_ckan_lifecycle.py +++ b/tests/manual/core/lifecycle/test_ckan_lifecycle.py @@ -1,4 +1,4 @@ -from src.db.dtos.batch_info import BatchInfo +from src.db.dtos.batch import BatchInfo from src.collectors import CollectorType from src.core.enums import BatchStatus from src.collectors.source_collectors.ckan import group_search, package_search, organization_search diff --git a/tests/manual/core/lifecycle/test_muckrock_lifecycles.py b/tests/manual/core/lifecycle/test_muckrock_lifecycles.py index a890b7df..772d4d4a 100644 --- a/tests/manual/core/lifecycle/test_muckrock_lifecycles.py +++ b/tests/manual/core/lifecycle/test_muckrock_lifecycles.py @@ -1,4 +1,4 @@ -from src.db.dtos.batch_info import BatchInfo +from src.db.dtos.batch import BatchInfo from src.collectors import CollectorType from src.core.enums import BatchStatus from test_automated.integration.core.helpers.common_test_procedures import run_collector_and_wait_for_completion diff --git a/tests/manual/html_collector/test_html_tag_collector_integration.py b/tests/manual/html_collector/test_html_tag_collector_integration.py index b66fbd77..251d123c 100644 --- a/tests/manual/html_collector/test_html_tag_collector_integration.py +++ b/tests/manual/html_collector/test_html_tag_collector_integration.py @@ -5,7 +5,7 @@ from src.core.tasks.url.operators.url_html.scraper.request_interface.core import URLRequestInterface from src.core.tasks.url.operators.url_html.scraper.root_url_cache.core import RootURLCache from src.db.client.async_ import AsyncDatabaseClient -from src.db.dtos.url_info import URLInfo +from src.db.dtos.url.core import URLInfo from tests.helpers.db_data_creator import DBDataCreator URLS = [ diff --git a/tests/manual/llm_api_logic/test_deepseek_record_classifier.py b/tests/manual/llm_api_logic/test_deepseek_record_classifier.py index c88ee2bb..612e7425 100644 --- a/tests/manual/llm_api_logic/test_deepseek_record_classifier.py +++ b/tests/manual/llm_api_logic/test_deepseek_record_classifier.py @@ -1,12 +1,12 @@ import pytest -from src.db.dtos.url_html_content_info import URLHTMLContentInfo +from src.db.dtos.url.html_content import URLHTMLContentInfo from src.core.tasks.url.operators.record_type.llm_api.record_classifier.deepseek import DeepSeekRecordClassifier @pytest.mark.asyncio async def test_deepseek_record_classifier(): - from src.db.dtos.url_html_content_info import HTMLContentType as hct + from src.db.dtos.url.html_content import HTMLContentType as hct d = { hct.TITLE: "Oath of Office for Newly Promoted Corporal Lumpkin with Acworth Police – City of Acworth, GA", diff --git a/tests/manual/llm_api_logic/test_openai_record_classifier.py b/tests/manual/llm_api_logic/test_openai_record_classifier.py index d7fa344f..7f3cb67e 100644 --- a/tests/manual/llm_api_logic/test_openai_record_classifier.py +++ b/tests/manual/llm_api_logic/test_openai_record_classifier.py @@ -1,12 +1,12 @@ import pytest -from src.db.dtos.url_html_content_info import URLHTMLContentInfo +from src.db.dtos.url.html_content import URLHTMLContentInfo from src.core.tasks.url.operators.record_type.llm_api.record_classifier.openai import OpenAIRecordClassifier @pytest.mark.asyncio async def test_openai_record_classifier(): - from src.db.dtos.url_html_content_info import HTMLContentType as hct + from src.db.dtos.url.html_content import HTMLContentType as hct d = { hct.TITLE: "Oath of Office for Newly Promoted Corporal Lumpkin with Acworth Police – City of Acworth, GA", diff --git a/uv.lock b/uv.lock index f72903eb..70d4fd96 100644 --- a/uv.lock +++ b/uv.lock @@ -205,6 +205,60 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/45/7f/0e961cf3908bc4c1c3e027de2794f867c6c89fb4916fc7dba295a0e80a2d/boltons-25.0.0-py3-none-any.whl", hash = "sha256:dc9fb38bf28985715497d1b54d00b62ea866eca3938938ea9043e254a3a6ca62", size = 194210, upload_time = "2025-02-03T05:57:56.705Z" }, ] +[[package]] +name = "brotli" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/c2/f9e977608bdf958650638c3f1e28f85a1b075f075ebbe77db8555463787b/Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724", size = 7372270, upload_time = "2023-09-07T14:05:41.643Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/12/ad41e7fadd5db55459c4c401842b47f7fee51068f86dd2894dd0dcfc2d2a/Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc", size = 873068, upload_time = "2023-09-07T14:03:37.779Z" }, + { url = "https://files.pythonhosted.org/packages/95/4e/5afab7b2b4b61a84e9c75b17814198ce515343a44e2ed4488fac314cd0a9/Brotli-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8146669223164fc87a7e3de9f81e9423c67a79d6b3447994dfb9c95da16e2d6", size = 446244, upload_time = "2023-09-07T14:03:39.223Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e6/f305eb61fb9a8580c525478a4a34c5ae1a9bcb12c3aee619114940bc513d/Brotli-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30924eb4c57903d5a7526b08ef4a584acc22ab1ffa085faceb521521d2de32dd", size = 2906500, upload_time = "2023-09-07T14:03:40.858Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4f/af6846cfbc1550a3024e5d3775ede1e00474c40882c7bf5b37a43ca35e91/Brotli-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ceb64bbc6eac5a140ca649003756940f8d6a7c444a68af170b3187623b43bebf", size = 2943950, upload_time = "2023-09-07T14:03:42.896Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e7/ca2993c7682d8629b62630ebf0d1f3bb3d579e667ce8e7ca03a0a0576a2d/Brotli-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a469274ad18dc0e4d316eefa616d1d0c2ff9da369af19fa6f3daa4f09671fd61", size = 2918527, upload_time = "2023-09-07T14:03:44.552Z" }, + { url = "https://files.pythonhosted.org/packages/b3/96/da98e7bedc4c51104d29cc61e5f449a502dd3dbc211944546a4cc65500d3/Brotli-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:524f35912131cc2cabb00edfd8d573b07f2d9f21fa824bd3fb19725a9cf06327", size = 2845489, upload_time = "2023-09-07T14:03:46.594Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ef/ccbc16947d6ce943a7f57e1a40596c75859eeb6d279c6994eddd69615265/Brotli-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5b3cc074004d968722f51e550b41a27be656ec48f8afaeeb45ebf65b561481dd", size = 2914080, upload_time = "2023-09-07T14:03:48.204Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/0bd38d758d1afa62a5524172f0b18626bb2392d717ff94806f741fcd5ee9/Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9", size = 2813051, upload_time = "2023-09-07T14:03:50.348Z" }, + { url = "https://files.pythonhosted.org/packages/14/56/48859dd5d129d7519e001f06dcfbb6e2cf6db92b2702c0c2ce7d97e086c1/Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265", size = 2938172, upload_time = "2023-09-07T14:03:52.395Z" }, + { url = "https://files.pythonhosted.org/packages/3d/77/a236d5f8cd9e9f4348da5acc75ab032ab1ab2c03cc8f430d24eea2672888/Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8", size = 2933023, upload_time = "2023-09-07T14:03:53.96Z" }, + { url = "https://files.pythonhosted.org/packages/f1/87/3b283efc0f5cb35f7f84c0c240b1e1a1003a5e47141a4881bf87c86d0ce2/Brotli-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c247dd99d39e0338a604f8c2b3bc7061d5c2e9e2ac7ba9cc1be5a69cb6cd832f", size = 2935871, upload_time = "2024-10-18T12:32:16.688Z" }, + { url = "https://files.pythonhosted.org/packages/f3/eb/2be4cc3e2141dc1a43ad4ca1875a72088229de38c68e842746b342667b2a/Brotli-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1b2c248cd517c222d89e74669a4adfa5577e06ab68771a529060cf5a156e9757", size = 2847784, upload_time = "2024-10-18T12:32:18.459Z" }, + { url = "https://files.pythonhosted.org/packages/66/13/b58ddebfd35edde572ccefe6890cf7c493f0c319aad2a5badee134b4d8ec/Brotli-1.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2a24c50840d89ded6c9a8fdc7b6ed3692ed4e86f1c4a4a938e1e92def92933e0", size = 3034905, upload_time = "2024-10-18T12:32:20.192Z" }, + { url = "https://files.pythonhosted.org/packages/84/9c/bc96b6c7db824998a49ed3b38e441a2cae9234da6fa11f6ed17e8cf4f147/Brotli-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f31859074d57b4639318523d6ffdca586ace54271a73ad23ad021acd807eb14b", size = 2929467, upload_time = "2024-10-18T12:32:21.774Z" }, + { url = "https://files.pythonhosted.org/packages/e7/71/8f161dee223c7ff7fea9d44893fba953ce97cf2c3c33f78ba260a91bcff5/Brotli-1.1.0-cp311-cp311-win32.whl", hash = "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50", size = 333169, upload_time = "2023-09-07T14:03:55.404Z" }, + { url = "https://files.pythonhosted.org/packages/02/8a/fece0ee1057643cb2a5bbf59682de13f1725f8482b2c057d4e799d7ade75/Brotli-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1", size = 357253, upload_time = "2023-09-07T14:03:56.643Z" }, + { url = "https://files.pythonhosted.org/packages/5c/d0/5373ae13b93fe00095a58efcbce837fd470ca39f703a235d2a999baadfbc/Brotli-1.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:32d95b80260d79926f5fab3c41701dbb818fde1c9da590e77e571eefd14abe28", size = 815693, upload_time = "2024-10-18T12:32:23.824Z" }, + { url = "https://files.pythonhosted.org/packages/8e/48/f6e1cdf86751300c288c1459724bfa6917a80e30dbfc326f92cea5d3683a/Brotli-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b760c65308ff1e462f65d69c12e4ae085cff3b332d894637f6273a12a482d09f", size = 422489, upload_time = "2024-10-18T12:32:25.641Z" }, + { url = "https://files.pythonhosted.org/packages/06/88/564958cedce636d0f1bed313381dfc4b4e3d3f6015a63dae6146e1b8c65c/Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409", size = 873081, upload_time = "2023-09-07T14:03:57.967Z" }, + { url = "https://files.pythonhosted.org/packages/58/79/b7026a8bb65da9a6bb7d14329fd2bd48d2b7f86d7329d5cc8ddc6a90526f/Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2", size = 446244, upload_time = "2023-09-07T14:03:59.319Z" }, + { url = "https://files.pythonhosted.org/packages/e5/18/c18c32ecea41b6c0004e15606e274006366fe19436b6adccc1ae7b2e50c2/Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451", size = 2906505, upload_time = "2023-09-07T14:04:01.327Z" }, + { url = "https://files.pythonhosted.org/packages/08/c8/69ec0496b1ada7569b62d85893d928e865df29b90736558d6c98c2031208/Brotli-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f4bf76817c14aa98cc6697ac02f3972cb8c3da93e9ef16b9c66573a68014f91", size = 2944152, upload_time = "2023-09-07T14:04:03.033Z" }, + { url = "https://files.pythonhosted.org/packages/ab/fb/0517cea182219d6768113a38167ef6d4eb157a033178cc938033a552ed6d/Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0c5516f0aed654134a2fc936325cc2e642f8a0e096d075209672eb321cff408", size = 2919252, upload_time = "2023-09-07T14:04:04.675Z" }, + { url = "https://files.pythonhosted.org/packages/c7/53/73a3431662e33ae61a5c80b1b9d2d18f58dfa910ae8dd696e57d39f1a2f5/Brotli-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c3020404e0b5eefd7c9485ccf8393cfb75ec38ce75586e046573c9dc29967a0", size = 2845955, upload_time = "2023-09-07T14:04:06.585Z" }, + { url = "https://files.pythonhosted.org/packages/55/ac/bd280708d9c5ebdbf9de01459e625a3e3803cce0784f47d633562cf40e83/Brotli-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ed11165dd45ce798d99a136808a794a748d5dc38511303239d4e2363c0695dc", size = 2914304, upload_time = "2023-09-07T14:04:08.668Z" }, + { url = "https://files.pythonhosted.org/packages/76/58/5c391b41ecfc4527d2cc3350719b02e87cb424ef8ba2023fb662f9bf743c/Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180", size = 2814452, upload_time = "2023-09-07T14:04:10.736Z" }, + { url = "https://files.pythonhosted.org/packages/c7/4e/91b8256dfe99c407f174924b65a01f5305e303f486cc7a2e8a5d43c8bec3/Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248", size = 2938751, upload_time = "2023-09-07T14:04:12.875Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a6/e2a39a5d3b412938362bbbeba5af904092bf3f95b867b4a3eb856104074e/Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966", size = 2933757, upload_time = "2023-09-07T14:04:14.551Z" }, + { url = "https://files.pythonhosted.org/packages/13/f0/358354786280a509482e0e77c1a5459e439766597d280f28cb097642fc26/Brotli-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87a3044c3a35055527ac75e419dfa9f4f3667a1e887ee80360589eb8c90aabb9", size = 2936146, upload_time = "2024-10-18T12:32:27.257Z" }, + { url = "https://files.pythonhosted.org/packages/80/f7/daf538c1060d3a88266b80ecc1d1c98b79553b3f117a485653f17070ea2a/Brotli-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c5529b34c1c9d937168297f2c1fde7ebe9ebdd5e121297ff9c043bdb2ae3d6fb", size = 2848055, upload_time = "2024-10-18T12:32:29.376Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0eaa0585c4077d3c2d1edf322d8e97aabf317941d3a72d7b3ad8bce004b0/Brotli-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca63e1890ede90b2e4454f9a65135a4d387a4585ff8282bb72964fab893f2111", size = 3035102, upload_time = "2024-10-18T12:32:31.371Z" }, + { url = "https://files.pythonhosted.org/packages/d8/63/1c1585b2aa554fe6dbce30f0c18bdbc877fa9a1bf5ff17677d9cca0ac122/Brotli-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839", size = 2930029, upload_time = "2024-10-18T12:32:33.293Z" }, + { url = "https://files.pythonhosted.org/packages/5f/3b/4e3fd1893eb3bbfef8e5a80d4508bec17a57bb92d586c85c12d28666bb13/Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0", size = 333276, upload_time = "2023-09-07T14:04:16.49Z" }, + { url = "https://files.pythonhosted.org/packages/3d/d5/942051b45a9e883b5b6e98c041698b1eb2012d25e5948c58d6bf85b1bb43/Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951", size = 357255, upload_time = "2023-09-07T14:04:17.83Z" }, + { url = "https://files.pythonhosted.org/packages/0a/9f/fb37bb8ffc52a8da37b1c03c459a8cd55df7a57bdccd8831d500e994a0ca/Brotli-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5", size = 815681, upload_time = "2024-10-18T12:32:34.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/b3/dbd332a988586fefb0aa49c779f59f47cae76855c2d00f450364bb574cac/Brotli-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8", size = 422475, upload_time = "2024-10-18T12:32:36.485Z" }, + { url = "https://files.pythonhosted.org/packages/bb/80/6aaddc2f63dbcf2d93c2d204e49c11a9ec93a8c7c63261e2b4bd35198283/Brotli-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f", size = 2906173, upload_time = "2024-10-18T12:32:37.978Z" }, + { url = "https://files.pythonhosted.org/packages/ea/1d/e6ca79c96ff5b641df6097d299347507d39a9604bde8915e76bf026d6c77/Brotli-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648", size = 2943803, upload_time = "2024-10-18T12:32:39.606Z" }, + { url = "https://files.pythonhosted.org/packages/ac/a3/d98d2472e0130b7dd3acdbb7f390d478123dbf62b7d32bda5c830a96116d/Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0", size = 2918946, upload_time = "2024-10-18T12:32:41.679Z" }, + { url = "https://files.pythonhosted.org/packages/c4/a5/c69e6d272aee3e1423ed005d8915a7eaa0384c7de503da987f2d224d0721/Brotli-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089", size = 2845707, upload_time = "2024-10-18T12:32:43.478Z" }, + { url = "https://files.pythonhosted.org/packages/58/9f/4149d38b52725afa39067350696c09526de0125ebfbaab5acc5af28b42ea/Brotli-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368", size = 2936231, upload_time = "2024-10-18T12:32:45.224Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5a/145de884285611838a16bebfdb060c231c52b8f84dfbe52b852a15780386/Brotli-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c", size = 2848157, upload_time = "2024-10-18T12:32:46.894Z" }, + { url = "https://files.pythonhosted.org/packages/50/ae/408b6bfb8525dadebd3b3dd5b19d631da4f7d46420321db44cd99dcf2f2c/Brotli-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284", size = 3035122, upload_time = "2024-10-18T12:32:48.844Z" }, + { url = "https://files.pythonhosted.org/packages/af/85/a94e5cfaa0ca449d8f91c3d6f78313ebf919a0dbd55a100c711c6e9655bc/Brotli-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7", size = 2930206, upload_time = "2024-10-18T12:32:51.198Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f0/a61d9262cd01351df22e57ad7c34f66794709acab13f34be2675f45bf89d/Brotli-1.1.0-cp313-cp313-win32.whl", hash = "sha256:43395e90523f9c23a3d5bdf004733246fba087f2948f87ab28015f12359ca6a0", size = 333804, upload_time = "2024-10-18T12:32:52.661Z" }, + { url = "https://files.pythonhosted.org/packages/7e/c1/ec214e9c94000d1c1974ec67ced1c970c148aa6b8d8373066123fc3dbf06/Brotli-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b", size = 358517, upload_time = "2024-10-18T12:32:54.066Z" }, +] + [[package]] name = "bs4" version = "0.0.2" @@ -331,6 +385,7 @@ dependencies = [ { name = "apscheduler" }, { name = "asyncpg" }, { name = "beautifulsoup4" }, + { name = "brotli" }, { name = "bs4" }, { name = "ckanapi" }, { name = "datasets" }, @@ -377,6 +432,7 @@ requires-dist = [ { name = "apscheduler", specifier = "~=3.11.0" }, { name = "asyncpg", specifier = "~=0.30.0" }, { name = "beautifulsoup4", specifier = ">=4.12.3" }, + { name = "brotli", specifier = ">=1.1.0" }, { name = "bs4", specifier = "~=0.0.2" }, { name = "ckanapi", specifier = "~=4.8" }, { name = "datasets", specifier = "~=2.19.1" }, From 0e95f742754e83b2a5e9f030fec6269a273ac052 Mon Sep 17 00:00:00 2001 From: Josh <30379833+josh-chamberlain@users.noreply.github.com> Date: Thu, 10 Jul 2025 10:43:15 -0400 Subject: [PATCH 234/244] update readme chart for accuracy! --- README.md | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 2f7d8e8d..394cb919 100644 --- a/README.md +++ b/README.md @@ -78,19 +78,16 @@ Be sure to inspect the `docker-compose.yml` file in the root directory -- some e ```mermaid flowchart TD - SourceCollectors["**Source Collectors:** batches of potentially useful URLs created with a variety of strategies"] - Logging["Logging source collection attempts"] - API["Submitting sources to the **Data Sources API** for approval"] - Identifier["**Data Source Identifier:** automatically collecting metadata and attempting to identify properties"] - SourceCollectorLabeling["Human labeling of missing or uncertain metadata in Source Collector"] - - Identifier --> SourceCollectorLabeling - Identifier ---> API - SourceCollectorLabeling --> API - Identifier --> Logging + SourceCollectors["**Source Collectors:** scripts for creating batches of potentially useful URLs using different strategies"] + Identifier["Batches are prepared for labeling by automatically collecting metadata and identifying low-hanging fruit properties"] + SourceCollectorLabeling["Human labeling of missing or uncertain metadata takes place in Source Collector Retool app"] + SourceCollectorReview["Human Final Review of the labeled sources, for submission or discard, in Retool"] + API["Submitting sources to the Data Sources API when they are Relevant and have an **Agency, Record Type, and Name**"] SourceCollectors --> Identifier - + Identifier --> SourceCollectorLabeling + SourceCollectorLabeling --> SourceCollectorReview + SourceCollectorReview --> API API --> Search["Allowing users to search for data and browse maps"] Search --> Sentiment["Capturing user sentiment and overall database utility"] API --> MLModels["Improving ML metadata labelers: relevance, agency, record type, etc"] @@ -104,7 +101,6 @@ flowchart TD class API gold; class Search lightgold; class MLModels,Missingness lightergold; - class SourceCollectors,Identifier byzantium %% Define specific classes classDef gray fill:#bfc0c0 From e172e764cfcfb12742cfaca022907bed832d9713 Mon Sep 17 00:00:00 2001 From: maxachis Date: Tue, 15 Jul 2025 12:33:32 -0400 Subject: [PATCH 235/244] Begin first draft --- ENV.md | 1 + ...3ca5c9_alter_relevant_annotations_table.py | 59 +++++++++++++++++++ src/api/main.py | 2 +- src/core/helpers.py | 4 +- src/core/tasks/scheduled/loader.py | 2 +- .../scheduled/operators/agency_sync/core.py | 3 +- src/core/tasks/url/loader.py | 2 +- .../operators/agency_identification/core.py | 2 +- .../url/operators/submit_approved_url/core.py | 2 +- .../tasks/url/operators/url_duplicate/core.py | 2 +- .../subtasks/agency_identification/ckan.py | 4 +- .../agency_identification/muckrock.py | 4 +- src/db/client/async_.py | 4 +- .../url/suggestion/relevant/auto.py | 4 +- .../core/tasks/agency_sync/upsert.py | 2 +- src/external/README.md | 3 + src/{pdap_api => external}/__init__.py | 0 .../dtos => external/huggingface}/__init__.py | 0 src/external/huggingface/inference/README.md | 1 + .../huggingface/inference}/__init__.py | 0 src/external/huggingface/inference/client.py | 45 ++++++++++++++ .../huggingface/inference/constants.py | 3 + .../huggingface/inference/models}/__init__.py | 0 .../huggingface/inference/models/input.py | 6 ++ .../huggingface/inference/models/output.py | 7 +++ src/external/pdap/__init__.py | 0 src/{pdap_api => external/pdap}/client.py | 10 ++-- src/external/pdap/dtos/__init__.py | 0 .../pdap}/dtos/agencies_sync.py | 0 .../pdap/dtos/match_agency/__init__.py | 0 .../pdap}/dtos/match_agency/post.py | 0 .../pdap}/dtos/match_agency/response.py | 4 +- .../pdap}/dtos/unique_url_duplicate.py | 2 +- src/{pdap_api => external/pdap}/enums.py | 0 src/util/alembic_helpers.py | 11 ++++ tests/automated/integration/tasks/conftest.py | 2 +- .../tasks/scheduled/agency_sync/data.py | 2 +- .../agency_sync/existence_checker.py | 2 +- .../tasks/scheduled/agency_sync/helpers.py | 2 +- .../url/duplicate/test_url_duplicate_task.py | 2 +- .../url/test_agency_preannotation_task.py | 8 +-- .../url/test_submit_approved_url_task.py | 2 +- tests/manual/external/__init__.py | 0 tests/manual/external/huggingface/__init__.py | 0 .../huggingface/inference/__init__.py | 0 .../huggingface/inference/constants.py | 3 + .../huggingface/inference/test_relevancy.py | 29 +++++++++ tests/manual/external/pdap/__init__.py | 0 .../pdap}/conftest.py | 2 +- .../pdap}/test_check_for_duplicate.py | 0 .../pdap}/test_match_agency.py | 0 .../pdap}/test_refresh_session.py | 0 .../pdap}/test_sync_agencies.py | 0 53 files changed, 206 insertions(+), 37 deletions(-) create mode 100644 alembic/versions/2025_07_15_1106-d6519a3ca5c9_alter_relevant_annotations_table.py create mode 100644 src/external/README.md rename src/{pdap_api => external}/__init__.py (100%) rename src/{pdap_api/dtos => external/huggingface}/__init__.py (100%) create mode 100644 src/external/huggingface/inference/README.md rename src/{pdap_api/dtos/match_agency => external/huggingface/inference}/__init__.py (100%) create mode 100644 src/external/huggingface/inference/client.py create mode 100644 src/external/huggingface/inference/constants.py rename {tests/manual/pdap_client => src/external/huggingface/inference/models}/__init__.py (100%) create mode 100644 src/external/huggingface/inference/models/input.py create mode 100644 src/external/huggingface/inference/models/output.py create mode 100644 src/external/pdap/__init__.py rename src/{pdap_api => external/pdap}/client.py (93%) create mode 100644 src/external/pdap/dtos/__init__.py rename src/{pdap_api => external/pdap}/dtos/agencies_sync.py (100%) create mode 100644 src/external/pdap/dtos/match_agency/__init__.py rename src/{pdap_api => external/pdap}/dtos/match_agency/post.py (100%) rename src/{pdap_api => external/pdap}/dtos/match_agency/response.py (56%) rename src/{pdap_api => external/pdap}/dtos/unique_url_duplicate.py (79%) rename src/{pdap_api => external/pdap}/enums.py (100%) create mode 100644 tests/manual/external/__init__.py create mode 100644 tests/manual/external/huggingface/__init__.py create mode 100644 tests/manual/external/huggingface/inference/__init__.py create mode 100644 tests/manual/external/huggingface/inference/constants.py create mode 100644 tests/manual/external/huggingface/inference/test_relevancy.py create mode 100644 tests/manual/external/pdap/__init__.py rename tests/manual/{pdap_client => external/pdap}/conftest.py (95%) rename tests/manual/{pdap_client => external/pdap}/test_check_for_duplicate.py (100%) rename tests/manual/{pdap_client => external/pdap}/test_match_agency.py (100%) rename tests/manual/{pdap_client => external/pdap}/test_refresh_session.py (100%) rename tests/manual/{pdap_client => external/pdap}/test_sync_agencies.py (100%) diff --git a/ENV.md b/ENV.md index fdd7d029..0c752f93 100644 --- a/ENV.md +++ b/ENV.md @@ -20,6 +20,7 @@ Please ensure these are properly defined in a `.env` file in the root directory. |`PDAP_API_KEY`| An API key for accessing the PDAP API. | `abc123` | |`PDAP_API_URL`| The URL for the PDAP API| `https://data-sources-v2.pdap.dev/api`| |`DISCORD_WEBHOOK_URL`| The URL for the Discord webhook used for notifications| `abc123` | +|'HUGGINGFACE_INFERENCE_API_KEY' | The API key required for accessing the Huggingface Inference API. | `abc123` | [^1:] The user account in question will require elevated permissions to access certain endpoints. At a minimum, the user will require the `source_collector` and `db_write` permissions. diff --git a/alembic/versions/2025_07_15_1106-d6519a3ca5c9_alter_relevant_annotations_table.py b/alembic/versions/2025_07_15_1106-d6519a3ca5c9_alter_relevant_annotations_table.py new file mode 100644 index 00000000..fa6edadf --- /dev/null +++ b/alembic/versions/2025_07_15_1106-d6519a3ca5c9_alter_relevant_annotations_table.py @@ -0,0 +1,59 @@ +"""Alter relevant annotations table + +Revision ID: d6519a3ca5c9 +Revises: 4b0f43f61598 +Create Date: 2025-07-15 11:06:36.534900 + +""" +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = 'd6519a3ca5c9' +down_revision: Union[str, None] = '4b0f43f61598' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +HTML_TABLE_NAME = 'url_compressed_html' +AUTO_RELEVANT_TABLE_NAME = 'auto_relevant_suggestions' + +CONFIDENCE_COLUMN_NAME = 'confidence' +MODEL_NAME_COLUMN_NAME = 'model_name' + +CHECK_CONSTRAINT_NAME = f'ck_{AUTO_RELEVANT_TABLE_NAME}_{CONFIDENCE_COLUMN_NAME}_between_0_and_1' + + +def _alter_auto_relevant_table() -> None: + # Add confidence column + op.add_column( + AUTO_RELEVANT_TABLE_NAME, + sa.Column(CONFIDENCE_COLUMN_NAME, sa.Float(), nullable=True) + ) + # Add check constraint that confidence is between 0 and 1 + op.create_check_constraint( + CHECK_CONSTRAINT_NAME, + AUTO_RELEVANT_TABLE_NAME, + f'{CONFIDENCE_COLUMN_NAME} BETWEEN 0 AND 1' + ) + + # Add model name column + op.add_column( + AUTO_RELEVANT_TABLE_NAME, + sa.Column(MODEL_NAME_COLUMN_NAME, sa.String(), nullable=True) + ) + + +def _revert_auto_relevant_table() -> None: + op.drop_column(AUTO_RELEVANT_TABLE_NAME, CONFIDENCE_COLUMN_NAME) + op.drop_column(AUTO_RELEVANT_TABLE_NAME, MODEL_NAME_COLUMN_NAME) + + + +def upgrade() -> None: + _alter_auto_relevant_table() + + +def downgrade() -> None: + _revert_auto_relevant_table() diff --git a/src/api/main.py b/src/api/main.py index 63013207..67118a69 100644 --- a/src/api/main.py +++ b/src/api/main.py @@ -31,7 +31,7 @@ from src.db.client.async_ import AsyncDatabaseClient from src.db.client.sync import DatabaseClient from src.core.tasks.url.operators.url_html.scraper.root_url_cache.core import RootURLCache -from src.pdap_api.client import PDAPClient +from src.external.pdap.client import PDAPClient @asynccontextmanager diff --git a/src/core/helpers.py b/src/core/helpers.py index cc513a0a..eeb951fe 100644 --- a/src/core/helpers.py +++ b/src/core/helpers.py @@ -1,8 +1,8 @@ from src.core.enums import SuggestionType from src.core.exceptions import MatchAgencyError from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo -from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse -from src.pdap_api.enums import MatchAgencyResponseStatus +from src.external.pdap.dtos.match_agency.response import MatchAgencyResponse +from src.external.pdap.enums import MatchAgencyResponseStatus def process_match_agency_response_to_suggestions( diff --git a/src/core/tasks/scheduled/loader.py b/src/core/tasks/scheduled/loader.py index 34b7c505..fb92dcb0 100644 --- a/src/core/tasks/scheduled/loader.py +++ b/src/core/tasks/scheduled/loader.py @@ -1,6 +1,6 @@ from src.core.tasks.scheduled.operators.agency_sync.core import SyncAgenciesTaskOperator from src.db.client.async_ import AsyncDatabaseClient -from src.pdap_api.client import PDAPClient +from src.external.pdap.client import PDAPClient class ScheduledTaskOperatorLoader: diff --git a/src/core/tasks/scheduled/operators/agency_sync/core.py b/src/core/tasks/scheduled/operators/agency_sync/core.py index 65af05d9..c522effd 100644 --- a/src/core/tasks/scheduled/operators/agency_sync/core.py +++ b/src/core/tasks/scheduled/operators/agency_sync/core.py @@ -2,10 +2,9 @@ from src.core.tasks.scheduled.operators.agency_sync.dtos.parameters import AgencySyncParameters from src.core.tasks.scheduled.operators.agency_sync.exceptions import MaxRequestsExceededError from src.core.tasks.scheduled.operators.base import ScheduledTaskOperatorBase -from src.core.tasks.url.operators.base import URLTaskOperatorBase from src.db.client.async_ import AsyncDatabaseClient from src.db.enums import TaskType -from src.pdap_api.client import PDAPClient +from src.external.pdap.client import PDAPClient class SyncAgenciesTaskOperator(ScheduledTaskOperatorBase): diff --git a/src/core/tasks/url/loader.py b/src/core/tasks/url/loader.py index 4882a319..d52e3bf8 100644 --- a/src/core/tasks/url/loader.py +++ b/src/core/tasks/url/loader.py @@ -15,7 +15,7 @@ from src.core.tasks.url.operators.url_html.scraper.request_interface.core import URLRequestInterface from src.core.tasks.url.operators.url_miscellaneous_metadata.core import URLMiscellaneousMetadataTaskOperator from src.db.client.async_ import AsyncDatabaseClient -from src.pdap_api.client import PDAPClient +from src.external.pdap.client import PDAPClient class URLTaskOperatorLoader: diff --git a/src/core/tasks/url/operators/agency_identification/core.py b/src/core/tasks/url/operators/agency_identification/core.py index 06e20658..d93143aa 100644 --- a/src/core/tasks/url/operators/agency_identification/core.py +++ b/src/core/tasks/url/operators/agency_identification/core.py @@ -11,7 +11,7 @@ from src.core.tasks.url.subtasks.agency_identification.common_crawler import CommonCrawlerAgencyIdentificationSubtask from src.core.tasks.url.subtasks.agency_identification.muckrock import MuckrockAgencyIdentificationSubtask from src.core.enums import SuggestionType -from src.pdap_api.client import PDAPClient +from src.external.pdap.client import PDAPClient # TODO: Validate with Manual Tests diff --git a/src/core/tasks/url/operators/submit_approved_url/core.py b/src/core/tasks/url/operators/submit_approved_url/core.py index 26cec954..dd2df39e 100644 --- a/src/core/tasks/url/operators/submit_approved_url/core.py +++ b/src/core/tasks/url/operators/submit_approved_url/core.py @@ -3,7 +3,7 @@ from src.db.enums import TaskType from src.core.tasks.url.operators.submit_approved_url.tdo import SubmitApprovedURLTDO from src.core.tasks.url.operators.base import URLTaskOperatorBase -from src.pdap_api.client import PDAPClient +from src.external.pdap.client import PDAPClient class SubmitApprovedURLTaskOperator(URLTaskOperatorBase): diff --git a/src/core/tasks/url/operators/url_duplicate/core.py b/src/core/tasks/url/operators/url_duplicate/core.py index f8aec6f4..ed3d00a5 100644 --- a/src/core/tasks/url/operators/url_duplicate/core.py +++ b/src/core/tasks/url/operators/url_duplicate/core.py @@ -6,7 +6,7 @@ from src.db.enums import TaskType from src.core.tasks.url.operators.url_duplicate.tdo import URLDuplicateTDO from src.core.tasks.url.operators.base import URLTaskOperatorBase -from src.pdap_api.client import PDAPClient +from src.external.pdap.client import PDAPClient class URLDuplicateTaskOperator(URLTaskOperatorBase): diff --git a/src/core/tasks/url/subtasks/agency_identification/ckan.py b/src/core/tasks/url/subtasks/agency_identification/ckan.py index 0d87de65..6092aed4 100644 --- a/src/core/tasks/url/subtasks/agency_identification/ckan.py +++ b/src/core/tasks/url/subtasks/agency_identification/ckan.py @@ -2,8 +2,8 @@ from src.core.helpers import process_match_agency_response_to_suggestions from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo -from src.pdap_api.client import PDAPClient -from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse +from src.external.pdap.client import PDAPClient +from src.external.pdap.dtos.match_agency.response import MatchAgencyResponse class CKANAgencyIdentificationSubtask: diff --git a/src/core/tasks/url/subtasks/agency_identification/muckrock.py b/src/core/tasks/url/subtasks/agency_identification/muckrock.py index 9d22f9fc..df61e281 100644 --- a/src/core/tasks/url/subtasks/agency_identification/muckrock.py +++ b/src/core/tasks/url/subtasks/agency_identification/muckrock.py @@ -6,8 +6,8 @@ from src.core.exceptions import MuckrockAPIError from src.core.helpers import process_match_agency_response_to_suggestions from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo -from src.pdap_api.client import PDAPClient -from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse +from src.external.pdap.client import PDAPClient +from src.external.pdap.dtos.match_agency.response import MatchAgencyResponse class MuckrockAgencyIdentificationSubtask: diff --git a/src/db/client/async_.py b/src/db/client/async_.py index 87e62d9c..62cfb7d3 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -4,7 +4,7 @@ from typing import Optional, Type, Any, List from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, Select, not_, and_, update, delete, literal, text, insert +from sqlalchemy import select, exists, func, case, Select, not_, and_, update, delete, literal, text from sqlalchemy.dialects import postgresql from sqlalchemy.dialects.postgresql import insert as pg_insert from sqlalchemy.exc import IntegrityError, NoResultFound @@ -101,7 +101,7 @@ from src.db.statement_composer import StatementComposer from src.db.types import UserSuggestionType from src.db.utils.compression import decompress_html, compress_html -from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInnerInfo +from src.external.pdap.dtos.agencies_sync import AgenciesSyncResponseInnerInfo # Type Hints diff --git a/src/db/models/instantiations/url/suggestion/relevant/auto.py b/src/db/models/instantiations/url/suggestion/relevant/auto.py index f624c759..db7f8ea2 100644 --- a/src/db/models/instantiations/url/suggestion/relevant/auto.py +++ b/src/db/models/instantiations/url/suggestion/relevant/auto.py @@ -1,4 +1,4 @@ -from sqlalchemy import Column, Boolean, UniqueConstraint +from sqlalchemy import Column, Boolean, UniqueConstraint, String, Float from sqlalchemy.orm import relationship from src.db.models.mixins import UpdatedAtMixin, CreatedAtMixin, URLDependentMixin @@ -9,6 +9,8 @@ class AutoRelevantSuggestion(UpdatedAtMixin, CreatedAtMixin, URLDependentMixin, __tablename__ = "auto_relevant_suggestions" relevant = Column(Boolean, nullable=True) + confidence = Column(Float, nullable=True) + model_name = Column(String, nullable=True) __table_args__ = ( UniqueConstraint("url_id", name="auto_relevant_suggestions_uq_url_id"), diff --git a/src/db/queries/implementations/core/tasks/agency_sync/upsert.py b/src/db/queries/implementations/core/tasks/agency_sync/upsert.py index 8e9406fe..cff2044b 100644 --- a/src/db/queries/implementations/core/tasks/agency_sync/upsert.py +++ b/src/db/queries/implementations/core/tasks/agency_sync/upsert.py @@ -1,4 +1,4 @@ -from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInnerInfo +from src.external.pdap.dtos.agencies_sync import AgenciesSyncResponseInnerInfo def get_upsert_agencies_mappings( diff --git a/src/external/README.md b/src/external/README.md new file mode 100644 index 00000000..230364ab --- /dev/null +++ b/src/external/README.md @@ -0,0 +1,3 @@ +This directory consists of logic for interacting with services external to this repository/app. + +This includes *other* PDAP services. diff --git a/src/pdap_api/__init__.py b/src/external/__init__.py similarity index 100% rename from src/pdap_api/__init__.py rename to src/external/__init__.py diff --git a/src/pdap_api/dtos/__init__.py b/src/external/huggingface/__init__.py similarity index 100% rename from src/pdap_api/dtos/__init__.py rename to src/external/huggingface/__init__.py diff --git a/src/external/huggingface/inference/README.md b/src/external/huggingface/inference/README.md new file mode 100644 index 00000000..cb5b6c53 --- /dev/null +++ b/src/external/huggingface/inference/README.md @@ -0,0 +1 @@ +Logic related to use of the [HuggingFace Inference API](https://huggingface.co/docs/huggingface_hub/v0.13.2/en/guides/inference). \ No newline at end of file diff --git a/src/pdap_api/dtos/match_agency/__init__.py b/src/external/huggingface/inference/__init__.py similarity index 100% rename from src/pdap_api/dtos/match_agency/__init__.py rename to src/external/huggingface/inference/__init__.py diff --git a/src/external/huggingface/inference/client.py b/src/external/huggingface/inference/client.py new file mode 100644 index 00000000..bfa0c67c --- /dev/null +++ b/src/external/huggingface/inference/client.py @@ -0,0 +1,45 @@ +import asyncio + +from aiohttp import ClientSession +from aiohttp.web import HTTPServiceUnavailable + +from src.external.huggingface.inference.constants import RELEVANCY_ENDPOINT +from src.external.huggingface.inference.models.input import BasicInput +from src.external.huggingface.inference.models.output import BasicOutput + + +class HuggingFaceInferenceClient: + + def __init__( + self, + session: ClientSession, + token: str + ): + self.session = session + self.token = token + + + async def get_relevancy_annotation( + self, input_: BasicInput, attempts: int = 3 + ) -> BasicOutput: + + for _ in range(attempts): + try: + async with self.session.post( + RELEVANCY_ENDPOINT, + json={ + "inputs": input_.model_dump_json(), + }, + headers={ + "Accept": "application/json", + "Authorization": f"Bearer {self.token}", + "Content-Type": "application/json" + } + ) as response: + response.raise_for_status() + result = BasicOutput(**(await response.json())) + break + except HTTPServiceUnavailable as e: + print(f"Service unavailable: {e}. Retrying after backoff...") + await asyncio.sleep(1) + return result diff --git a/src/external/huggingface/inference/constants.py b/src/external/huggingface/inference/constants.py new file mode 100644 index 00000000..5c2362d3 --- /dev/null +++ b/src/external/huggingface/inference/constants.py @@ -0,0 +1,3 @@ + + +RELEVANCY_ENDPOINT = "https://erjp42mzm4k2tyn1.us-east-1.aws.endpoints.huggingface.cloud" \ No newline at end of file diff --git a/tests/manual/pdap_client/__init__.py b/src/external/huggingface/inference/models/__init__.py similarity index 100% rename from tests/manual/pdap_client/__init__.py rename to src/external/huggingface/inference/models/__init__.py diff --git a/src/external/huggingface/inference/models/input.py b/src/external/huggingface/inference/models/input.py new file mode 100644 index 00000000..970bc8db --- /dev/null +++ b/src/external/huggingface/inference/models/input.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel + + +class BasicInput(BaseModel): + html: str + diff --git a/src/external/huggingface/inference/models/output.py b/src/external/huggingface/inference/models/output.py new file mode 100644 index 00000000..204b6ed0 --- /dev/null +++ b/src/external/huggingface/inference/models/output.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel, Field + + +class BasicOutput(BaseModel): + annotation: bool + confidence: float + model: str \ No newline at end of file diff --git a/src/external/pdap/__init__.py b/src/external/pdap/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/pdap_api/client.py b/src/external/pdap/client.py similarity index 93% rename from src/pdap_api/client.py rename to src/external/pdap/client.py index 22cdc3cd..126e7970 100644 --- a/src/pdap_api/client.py +++ b/src/external/pdap/client.py @@ -4,11 +4,11 @@ from src.core.tasks.scheduled.operators.agency_sync.dtos.parameters import AgencySyncParameters from src.core.tasks.url.operators.submit_approved_url.tdo import SubmitApprovedURLTDO, SubmittedURLInfo -from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInnerInfo, AgenciesSyncResponseInfo -from src.pdap_api.dtos.match_agency.post import MatchAgencyInfo -from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse -from src.pdap_api.dtos.unique_url_duplicate import UniqueURLDuplicateInfo -from src.pdap_api.enums import MatchAgencyResponseStatus +from src.external.pdap.dtos.agencies_sync import AgenciesSyncResponseInnerInfo, AgenciesSyncResponseInfo +from src.external.pdap.dtos.match_agency.post import MatchAgencyInfo +from src.external.pdap.dtos.match_agency.response import MatchAgencyResponse +from src.external.pdap.dtos.unique_url_duplicate import UniqueURLDuplicateInfo +from src.external.pdap.enums import MatchAgencyResponseStatus class PDAPClient: diff --git a/src/external/pdap/dtos/__init__.py b/src/external/pdap/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/pdap_api/dtos/agencies_sync.py b/src/external/pdap/dtos/agencies_sync.py similarity index 100% rename from src/pdap_api/dtos/agencies_sync.py rename to src/external/pdap/dtos/agencies_sync.py diff --git a/src/external/pdap/dtos/match_agency/__init__.py b/src/external/pdap/dtos/match_agency/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/pdap_api/dtos/match_agency/post.py b/src/external/pdap/dtos/match_agency/post.py similarity index 100% rename from src/pdap_api/dtos/match_agency/post.py rename to src/external/pdap/dtos/match_agency/post.py diff --git a/src/pdap_api/dtos/match_agency/response.py b/src/external/pdap/dtos/match_agency/response.py similarity index 56% rename from src/pdap_api/dtos/match_agency/response.py rename to src/external/pdap/dtos/match_agency/response.py index 8077785c..aa4d9ec3 100644 --- a/src/pdap_api/dtos/match_agency/response.py +++ b/src/external/pdap/dtos/match_agency/response.py @@ -2,8 +2,8 @@ from pydantic import BaseModel -from src.pdap_api.dtos.match_agency.post import MatchAgencyInfo -from src.pdap_api.enums import MatchAgencyResponseStatus +from src.external.pdap.dtos.match_agency.post import MatchAgencyInfo +from src.external.pdap.enums import MatchAgencyResponseStatus class MatchAgencyResponse(BaseModel): diff --git a/src/pdap_api/dtos/unique_url_duplicate.py b/src/external/pdap/dtos/unique_url_duplicate.py similarity index 79% rename from src/pdap_api/dtos/unique_url_duplicate.py rename to src/external/pdap/dtos/unique_url_duplicate.py index 1c71c431..096622fe 100644 --- a/src/pdap_api/dtos/unique_url_duplicate.py +++ b/src/external/pdap/dtos/unique_url_duplicate.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from src.pdap_api.enums import ApprovalStatus +from src.external.pdap.enums import ApprovalStatus class UniqueURLDuplicateInfo(BaseModel): diff --git a/src/pdap_api/enums.py b/src/external/pdap/enums.py similarity index 100% rename from src/pdap_api/enums.py rename to src/external/pdap/enums.py diff --git a/src/util/alembic_helpers.py b/src/util/alembic_helpers.py index 784ff964..c6b60002 100644 --- a/src/util/alembic_helpers.py +++ b/src/util/alembic_helpers.py @@ -82,3 +82,14 @@ def updated_at_column(): server_onupdate=sa.text('now()'), nullable=False ) + +def url_id_column(): + sa.Column( + 'url_id', + sa.Integer(), + sa.ForeignKey( + 'urls.id', + ondelete='CASCADE' + ), + nullable=False + ), \ No newline at end of file diff --git a/tests/automated/integration/tasks/conftest.py b/tests/automated/integration/tasks/conftest.py index 77b25bfd..807157cb 100644 --- a/tests/automated/integration/tasks/conftest.py +++ b/tests/automated/integration/tasks/conftest.py @@ -3,7 +3,7 @@ import pytest from pdap_access_manager import AccessManager -from src.pdap_api.client import PDAPClient +from src.external.pdap.client import PDAPClient @pytest.fixture diff --git a/tests/automated/integration/tasks/scheduled/agency_sync/data.py b/tests/automated/integration/tasks/scheduled/agency_sync/data.py index ecf50a00..fa06ea33 100644 --- a/tests/automated/integration/tasks/scheduled/agency_sync/data.py +++ b/tests/automated/integration/tasks/scheduled/agency_sync/data.py @@ -1,6 +1,6 @@ from datetime import datetime -from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInfo, AgenciesSyncResponseInnerInfo +from src.external.pdap.dtos.agencies_sync import AgenciesSyncResponseInfo, AgenciesSyncResponseInnerInfo PREEXISTING_AGENCY_1 = AgenciesSyncResponseInnerInfo( display_name="Preexisting Agency 1", diff --git a/tests/automated/integration/tasks/scheduled/agency_sync/existence_checker.py b/tests/automated/integration/tasks/scheduled/agency_sync/existence_checker.py index 82ac7a88..150df5b0 100644 --- a/tests/automated/integration/tasks/scheduled/agency_sync/existence_checker.py +++ b/tests/automated/integration/tasks/scheduled/agency_sync/existence_checker.py @@ -1,5 +1,5 @@ from src.db.models.instantiations.agency import Agency -from src.pdap_api.dtos.agencies_sync import AgenciesSyncResponseInnerInfo +from src.external.pdap.dtos.agencies_sync import AgenciesSyncResponseInnerInfo from tests.automated.integration.tasks.scheduled.agency_sync.data import FIRST_CALL_RESPONSE, SECOND_CALL_RESPONSE diff --git a/tests/automated/integration/tasks/scheduled/agency_sync/helpers.py b/tests/automated/integration/tasks/scheduled/agency_sync/helpers.py index c198db68..c05e61f7 100644 --- a/tests/automated/integration/tasks/scheduled/agency_sync/helpers.py +++ b/tests/automated/integration/tasks/scheduled/agency_sync/helpers.py @@ -7,7 +7,7 @@ from src.db.client.async_ import AsyncDatabaseClient from src.db.models.instantiations.agency import Agency from src.db.models.instantiations.sync_state_agencies import AgenciesSyncState -from src.pdap_api.client import PDAPClient +from src.external.pdap.client import PDAPClient from tests.automated.integration.tasks.scheduled.agency_sync.data import PREEXISTING_AGENCIES diff --git a/tests/automated/integration/tasks/url/duplicate/test_url_duplicate_task.py b/tests/automated/integration/tasks/url/duplicate/test_url_duplicate_task.py index c8eebd03..cb46c845 100644 --- a/tests/automated/integration/tasks/url/duplicate/test_url_duplicate_task.py +++ b/tests/automated/integration/tasks/url/duplicate/test_url_duplicate_task.py @@ -12,7 +12,7 @@ from tests.automated.integration.tasks.url.duplicate.constants import BATCH_CREATION_PARAMETERS from tests.helpers.db_data_creator import DBDataCreator from pdap_access_manager import ResponseInfo -from src.pdap_api.client import PDAPClient +from src.external.pdap.client import PDAPClient @pytest.mark.asyncio diff --git a/tests/automated/integration/tasks/url/test_agency_preannotation_task.py b/tests/automated/integration/tasks/url/test_agency_preannotation_task.py index ad2f9b3a..03961fe0 100644 --- a/tests/automated/integration/tasks/url/test_agency_preannotation_task.py +++ b/tests/automated/integration/tasks/url/test_agency_preannotation_task.py @@ -11,7 +11,7 @@ from src.core.tasks.url.operators.agency_identification.core import AgencyIdentificationTaskOperator from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion -from src.pdap_api.enums import MatchAgencyResponseStatus +from src.external.pdap.enums import MatchAgencyResponseStatus from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters from src.db.models.instantiations.agency import Agency @@ -23,9 +23,9 @@ from src.core.tasks.url.subtasks.agency_identification.muckrock import MuckrockAgencyIdentificationSubtask from src.core.enums import SuggestionType from pdap_access_manager import AccessManager -from src.pdap_api.dtos.match_agency.response import MatchAgencyResponse -from src.pdap_api.dtos.match_agency.post import MatchAgencyInfo -from src.pdap_api.client import PDAPClient +from src.external.pdap.dtos.match_agency.response import MatchAgencyResponse +from src.external.pdap.dtos.match_agency.post import MatchAgencyInfo +from src.external.pdap.client import PDAPClient from tests.helpers.db_data_creator import DBDataCreator, BatchURLCreationInfoV2 sample_agency_suggestions = [ diff --git a/tests/automated/integration/tasks/url/test_submit_approved_url_task.py b/tests/automated/integration/tasks/url/test_submit_approved_url_task.py index 084bef03..db4069d3 100644 --- a/tests/automated/integration/tasks/url/test_submit_approved_url_task.py +++ b/tests/automated/integration/tasks/url/test_submit_approved_url_task.py @@ -15,7 +15,7 @@ from src.core.enums import RecordType, SubmitResponseStatus from tests.helpers.db_data_creator import BatchURLCreationInfo, DBDataCreator from pdap_access_manager import RequestInfo, RequestType, ResponseInfo, DataSourcesNamespaces -from src.pdap_api.client import PDAPClient +from src.external.pdap.client import PDAPClient def mock_make_request(pdap_client: PDAPClient, urls: list[str]): diff --git a/tests/manual/external/__init__.py b/tests/manual/external/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/manual/external/huggingface/__init__.py b/tests/manual/external/huggingface/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/manual/external/huggingface/inference/__init__.py b/tests/manual/external/huggingface/inference/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/manual/external/huggingface/inference/constants.py b/tests/manual/external/huggingface/inference/constants.py new file mode 100644 index 00000000..6bedf277 --- /dev/null +++ b/tests/manual/external/huggingface/inference/constants.py @@ -0,0 +1,3 @@ + + +EXAMPLE_WEBSITE = "https://www.scrapethissite.com/pages/simple/" \ No newline at end of file diff --git a/tests/manual/external/huggingface/inference/test_relevancy.py b/tests/manual/external/huggingface/inference/test_relevancy.py new file mode 100644 index 00000000..e001d864 --- /dev/null +++ b/tests/manual/external/huggingface/inference/test_relevancy.py @@ -0,0 +1,29 @@ +import pytest +from aiohttp import ClientSession + +from src.external.huggingface.inference.client import HuggingFaceInferenceClient +from src.external.huggingface.inference.models.input import BasicInput +from tests.manual.external.huggingface.inference.constants import EXAMPLE_WEBSITE + +from environs import Env + + +@pytest.mark.asyncio +async def test_huggingface_inference_relevancy_annotation(): + env = Env() + env.read_env() + token = env.str("HUGGINGFACE_INFERENCE_API_KEY") + + async with ClientSession() as session: + # Get example HTML content + response = await session.get(EXAMPLE_WEBSITE) + html_content = await response.text() + + hf_client = HuggingFaceInferenceClient( + session=session, + token=token + ) + hf_response = await hf_client.get_relevancy_annotation( + input_=BasicInput(html=html_content) + ) + print(hf_response) diff --git a/tests/manual/external/pdap/__init__.py b/tests/manual/external/pdap/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/manual/pdap_client/conftest.py b/tests/manual/external/pdap/conftest.py similarity index 95% rename from tests/manual/pdap_client/conftest.py rename to tests/manual/external/pdap/conftest.py index 218d59a4..de386ad7 100644 --- a/tests/manual/pdap_client/conftest.py +++ b/tests/manual/external/pdap/conftest.py @@ -3,7 +3,7 @@ from aiohttp import ClientSession from pdap_access_manager import AccessManager -from src.pdap_api.client import PDAPClient +from src.external.pdap.client import PDAPClient from src.util.helper_functions import get_from_env diff --git a/tests/manual/pdap_client/test_check_for_duplicate.py b/tests/manual/external/pdap/test_check_for_duplicate.py similarity index 100% rename from tests/manual/pdap_client/test_check_for_duplicate.py rename to tests/manual/external/pdap/test_check_for_duplicate.py diff --git a/tests/manual/pdap_client/test_match_agency.py b/tests/manual/external/pdap/test_match_agency.py similarity index 100% rename from tests/manual/pdap_client/test_match_agency.py rename to tests/manual/external/pdap/test_match_agency.py diff --git a/tests/manual/pdap_client/test_refresh_session.py b/tests/manual/external/pdap/test_refresh_session.py similarity index 100% rename from tests/manual/pdap_client/test_refresh_session.py rename to tests/manual/external/pdap/test_refresh_session.py diff --git a/tests/manual/pdap_client/test_sync_agencies.py b/tests/manual/external/pdap/test_sync_agencies.py similarity index 100% rename from tests/manual/pdap_client/test_sync_agencies.py rename to tests/manual/external/pdap/test_sync_agencies.py From 66ff19e3c0cfc9dd3d88628e300b569e127659b9 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 16 Jul 2025 15:37:13 -0400 Subject: [PATCH 236/244] Finish developing auto relevant task --- ENV.md | 2 +- src/api/main.py | 5 ++ src/core/env_var_manager.py | 1 + src/core/tasks/url/loader.py | 17 +++- .../url/operators/auto_relevant/__init__.py | 0 .../tasks/url/operators/auto_relevant/core.py | 85 +++++++++++++++++++ .../auto_relevant/models/__init__.py | 0 .../auto_relevant/models/annotation.py | 7 ++ .../operators/auto_relevant/models/subsets.py | 6 ++ .../url/operators/auto_relevant/models/tdo.py | 11 +++ .../auto_relevant/queries/__init__.py | 0 .../auto_relevant/queries/get_tdos.py | 56 ++++++++++++ .../tasks/url/operators/auto_relevant/sort.py | 14 +++ src/db/client/async_.py | 54 +++++++++--- src/db/dtos/url/annotation.py | 10 --- src/db/dtos/url/annotations/__init__.py | 0 src/db/dtos/url/annotations/auto/__init__.py | 0 src/db/dtos/url/annotations/auto/relevancy.py | 8 ++ src/db/dtos/url/relevancy.py | 6 -- src/external/huggingface/inference/client.py | 7 +- .../huggingface/inference/models/output.py | 6 +- tests/automated/integration/tasks/asserts.py | 11 +++ .../tasks/url/auto_relevant/__init__.py | 0 .../tasks/url/auto_relevant/setup.py | 45 ++++++++++ .../tasks/url/auto_relevant/test_task.py | 46 ++++++++++ .../integration/tasks/url/html/asserts.py | 14 --- .../integration/tasks/url/html/setup.py | 8 +- .../integration/tasks/url/html/test_task.py | 5 +- tests/conftest.py | 1 + tests/helpers/db_data_creator.py | 31 ++++++- 30 files changed, 397 insertions(+), 59 deletions(-) create mode 100644 src/core/tasks/url/operators/auto_relevant/__init__.py create mode 100644 src/core/tasks/url/operators/auto_relevant/core.py create mode 100644 src/core/tasks/url/operators/auto_relevant/models/__init__.py create mode 100644 src/core/tasks/url/operators/auto_relevant/models/annotation.py create mode 100644 src/core/tasks/url/operators/auto_relevant/models/subsets.py create mode 100644 src/core/tasks/url/operators/auto_relevant/models/tdo.py create mode 100644 src/core/tasks/url/operators/auto_relevant/queries/__init__.py create mode 100644 src/core/tasks/url/operators/auto_relevant/queries/get_tdos.py create mode 100644 src/core/tasks/url/operators/auto_relevant/sort.py delete mode 100644 src/db/dtos/url/annotation.py create mode 100644 src/db/dtos/url/annotations/__init__.py create mode 100644 src/db/dtos/url/annotations/auto/__init__.py create mode 100644 src/db/dtos/url/annotations/auto/relevancy.py delete mode 100644 src/db/dtos/url/relevancy.py create mode 100644 tests/automated/integration/tasks/asserts.py create mode 100644 tests/automated/integration/tasks/url/auto_relevant/__init__.py create mode 100644 tests/automated/integration/tasks/url/auto_relevant/setup.py create mode 100644 tests/automated/integration/tasks/url/auto_relevant/test_task.py diff --git a/ENV.md b/ENV.md index 0c752f93..a2e84f24 100644 --- a/ENV.md +++ b/ENV.md @@ -20,7 +20,7 @@ Please ensure these are properly defined in a `.env` file in the root directory. |`PDAP_API_KEY`| An API key for accessing the PDAP API. | `abc123` | |`PDAP_API_URL`| The URL for the PDAP API| `https://data-sources-v2.pdap.dev/api`| |`DISCORD_WEBHOOK_URL`| The URL for the Discord webhook used for notifications| `abc123` | -|'HUGGINGFACE_INFERENCE_API_KEY' | The API key required for accessing the Huggingface Inference API. | `abc123` | +|`HUGGINGFACE_INFERENCE_API_KEY` | The API key required for accessing the Huggingface Inference API. | `abc123` | [^1:] The user account in question will require elevated permissions to access certain endpoints. At a minimum, the user will require the `source_collector` and `db_write` permissions. diff --git a/src/api/main.py b/src/api/main.py index 67118a69..355fbedf 100644 --- a/src/api/main.py +++ b/src/api/main.py @@ -31,6 +31,7 @@ from src.db.client.async_ import AsyncDatabaseClient from src.db.client.sync import DatabaseClient from src.core.tasks.url.operators.url_html.scraper.root_url_cache.core import RootURLCache +from src.external.huggingface.inference.client import HuggingFaceInferenceClient from src.external.pdap.client import PDAPClient @@ -77,6 +78,10 @@ async def lifespan(app: FastAPI): pdap_client=pdap_client, muckrock_api_interface=MuckrockAPIInterface( session=session + ), + hf_inference_client=HuggingFaceInferenceClient( + session=session, + token=env_var_manager.hf_inference_api_key ) ), ) diff --git a/src/core/env_var_manager.py b/src/core/env_var_manager.py index 39e4ce83..8fce7ac3 100644 --- a/src/core/env_var_manager.py +++ b/src/core/env_var_manager.py @@ -29,6 +29,7 @@ def _load(self): self.discord_webhook_url = self.require_env("DISCORD_WEBHOOK_URL") self.openai_api_key = self.require_env("OPENAI_API_KEY") + self.hf_inference_api_key = self.require_env("HUGGINGFACE_INFERENCE_API_KEY") self.postgres_user = self.require_env("POSTGRES_USER") self.postgres_password = self.require_env("POSTGRES_PASSWORD") diff --git a/src/core/tasks/url/loader.py b/src/core/tasks/url/loader.py index d52e3bf8..99997e3f 100644 --- a/src/core/tasks/url/loader.py +++ b/src/core/tasks/url/loader.py @@ -4,6 +4,7 @@ from src.collectors.source_collectors.muckrock.api_interface.core import MuckrockAPIInterface from src.core.tasks.url.operators.agency_identification.core import AgencyIdentificationTaskOperator +from src.core.tasks.url.operators.auto_relevant.core import URLAutoRelevantTaskOperator from src.core.tasks.url.operators.base import URLTaskOperatorBase from src.core.tasks.url.operators.record_type.core import URLRecordTypeTaskOperator from src.core.tasks.url.operators.record_type.llm_api.record_classifier.openai import OpenAIRecordClassifier @@ -15,6 +16,7 @@ from src.core.tasks.url.operators.url_html.scraper.request_interface.core import URLRequestInterface from src.core.tasks.url.operators.url_miscellaneous_metadata.core import URLMiscellaneousMetadataTaskOperator from src.db.client.async_ import AsyncDatabaseClient +from src.external.huggingface.inference.client import HuggingFaceInferenceClient from src.external.pdap.client import PDAPClient @@ -26,15 +28,18 @@ def __init__( url_request_interface: URLRequestInterface, html_parser: HTMLResponseParser, pdap_client: PDAPClient, - muckrock_api_interface: MuckrockAPIInterface + muckrock_api_interface: MuckrockAPIInterface, + hf_inference_client: HuggingFaceInferenceClient ): # Dependencies self.adb_client = adb_client - self.pdap_client = pdap_client self.url_request_interface = url_request_interface self.html_parser = html_parser + # External clients and interfaces + self.pdap_client = pdap_client self.muckrock_api_interface = muckrock_api_interface + self.hf_inference_client = hf_inference_client async def get_url_html_task_operator(self): operator = URLHTMLTaskOperator( @@ -86,6 +91,13 @@ async def get_url_404_probe_task_operator(self): ) return operator + async def get_url_auto_relevance_task_operator(self): + operator = URLAutoRelevantTaskOperator( + adb_client=self.adb_client, + hf_client=self.hf_inference_client + ) + return operator + async def get_task_operators(self) -> list[URLTaskOperatorBase]: return [ await self.get_url_html_task_operator(), @@ -95,4 +107,5 @@ async def get_task_operators(self) -> list[URLTaskOperatorBase]: await self.get_agency_identification_task_operator(), await self.get_url_miscellaneous_metadata_task_operator(), await self.get_submit_approved_url_task_operator(), + await self.get_url_auto_relevance_task_operator() ] diff --git a/src/core/tasks/url/operators/auto_relevant/__init__.py b/src/core/tasks/url/operators/auto_relevant/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/url/operators/auto_relevant/core.py b/src/core/tasks/url/operators/auto_relevant/core.py new file mode 100644 index 00000000..1a0c6c13 --- /dev/null +++ b/src/core/tasks/url/operators/auto_relevant/core.py @@ -0,0 +1,85 @@ +from src.core.tasks.url.operators.auto_relevant.models.annotation import RelevanceAnnotationInfo +from src.core.tasks.url.operators.auto_relevant.models.tdo import URLRelevantTDO +from src.core.tasks.url.operators.auto_relevant.sort import separate_success_and_error_subsets +from src.core.tasks.url.operators.base import URLTaskOperatorBase +from src.db.client.async_ import AsyncDatabaseClient +from src.db.dtos.url.annotations.auto.relevancy import AutoRelevancyAnnotationInput +from src.db.dtos.url.error import URLErrorPydanticInfo +from src.db.enums import TaskType +from src.external.huggingface.inference.client import HuggingFaceInferenceClient +from src.external.huggingface.inference.models.input import BasicInput + + +class URLAutoRelevantTaskOperator(URLTaskOperatorBase): + + def __init__( + self, + adb_client: AsyncDatabaseClient, + hf_client: HuggingFaceInferenceClient + ): + super().__init__(adb_client) + self.hf_client = hf_client + + @property + def task_type(self): + return TaskType.RELEVANCY + + async def meets_task_prerequisites(self): + return await self.adb_client.has_urls_with_html_data_and_without_auto_relevant_suggestion() + + async def get_tdos(self) -> list[URLRelevantTDO]: + return await self.adb_client.get_tdos_for_auto_relevancy() + + async def inner_task_logic(self): + tdos = await self.get_tdos() + url_ids = [tdo.url_id for tdo in tdos] + await self.link_urls_to_task(url_ids=url_ids) + + await self.get_ml_classifications(tdos) + subsets = await separate_success_and_error_subsets(tdos) + + await self.put_results_into_database(subsets.success) + await self.update_errors_in_database(subsets.error) + + async def get_ml_classifications(self, tdos: list[URLRelevantTDO]): + for tdo in tdos: + try: + input_ = BasicInput( + html=tdo.html + ) + output = await self.hf_client.get_relevancy_annotation(input_) + except Exception as e: + tdo.error = str(e) + continue + + annotation_info = RelevanceAnnotationInfo( + is_relevant=output.annotation, + confidence=output.confidence, + model_name=output.model + ) + tdo.annotation = annotation_info + + async def put_results_into_database(self, tdos: list[URLRelevantTDO]): + inputs = [] + for tdo in tdos: + input_ = AutoRelevancyAnnotationInput( + url_id=tdo.url_id, + is_relevant=tdo.annotation.is_relevant, + confidence=tdo.annotation.confidence, + model_name=tdo.annotation.model_name + ) + inputs.append(input_) + await self.adb_client.add_user_relevant_suggestions(inputs) + + async def update_errors_in_database(self, tdos: list[URLRelevantTDO]): + error_infos = [] + for tdo in tdos: + error_info = URLErrorPydanticInfo( + task_id=self.task_id, + url_id=tdo.url_id, + error=tdo.error + ) + error_infos.append(error_info) + await self.adb_client.add_url_error_infos(error_infos) + + diff --git a/src/core/tasks/url/operators/auto_relevant/models/__init__.py b/src/core/tasks/url/operators/auto_relevant/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/url/operators/auto_relevant/models/annotation.py b/src/core/tasks/url/operators/auto_relevant/models/annotation.py new file mode 100644 index 00000000..f99c3bff --- /dev/null +++ b/src/core/tasks/url/operators/auto_relevant/models/annotation.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel + + +class RelevanceAnnotationInfo(BaseModel): + is_relevant: bool + confidence: float + model_name: str \ No newline at end of file diff --git a/src/core/tasks/url/operators/auto_relevant/models/subsets.py b/src/core/tasks/url/operators/auto_relevant/models/subsets.py new file mode 100644 index 00000000..dd0ed924 --- /dev/null +++ b/src/core/tasks/url/operators/auto_relevant/models/subsets.py @@ -0,0 +1,6 @@ +from src.core.tasks.url.operators.auto_relevant.models.tdo import URLRelevantTDO + + +class URLRelevantAnnotationOutcomeSubsets: + success: list[URLRelevantTDO] = [] + error: list[URLRelevantTDO] = [] diff --git a/src/core/tasks/url/operators/auto_relevant/models/tdo.py b/src/core/tasks/url/operators/auto_relevant/models/tdo.py new file mode 100644 index 00000000..4e89bcb9 --- /dev/null +++ b/src/core/tasks/url/operators/auto_relevant/models/tdo.py @@ -0,0 +1,11 @@ +from pydantic import BaseModel + +from src.core.tasks.url.operators.auto_relevant.models.annotation import RelevanceAnnotationInfo + + +class URLRelevantTDO(BaseModel): + url_id: int + html: str + annotation: RelevanceAnnotationInfo | None = None + error: str | None = None + diff --git a/src/core/tasks/url/operators/auto_relevant/queries/__init__.py b/src/core/tasks/url/operators/auto_relevant/queries/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/url/operators/auto_relevant/queries/get_tdos.py b/src/core/tasks/url/operators/auto_relevant/queries/get_tdos.py new file mode 100644 index 00000000..79acd077 --- /dev/null +++ b/src/core/tasks/url/operators/auto_relevant/queries/get_tdos.py @@ -0,0 +1,56 @@ +from typing import Any, Sequence + +from sqlalchemy import select, Row +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import selectinload + +from src.collectors.enums import URLStatus +from src.core.tasks.url.operators.auto_relevant.models.tdo import URLRelevantTDO +from src.db.models.instantiations.url.compressed_html import URLCompressedHTML +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.url.suggestion.relevant.auto import AutoRelevantSuggestion +from src.db.queries.base.builder import QueryBuilderBase +from src.db.statement_composer import StatementComposer +from src.db.utils.compression import decompress_html + + +class GetAutoRelevantTDOsQueryBuilder(QueryBuilderBase): + + def __init__(self): + super().__init__() + + async def run(self, session: AsyncSession) -> list[URLRelevantTDO]: + query = ( + select( + URL + ) + .options( + selectinload(URL.compressed_html) + ) + .outerjoin( + URLCompressedHTML, + URL.id == URLCompressedHTML.url_id + ) + .where( + URL.outcome == URLStatus.PENDING.value, + URLCompressedHTML.compressed_html.is_not(None) + ) + ) + query = StatementComposer.exclude_urls_with_extant_model( + query, + model=AutoRelevantSuggestion + ) + query = query.limit(100).order_by(URL.id) + raw_result = await session.execute(query) + urls: Sequence[Row[URL]] = raw_result.unique().scalars().all() + tdos = [] + for url in urls: + tdos.append( + URLRelevantTDO( + url_id=url.id, + html=decompress_html(url.compressed_html.compressed_html), + ) + ) + + return tdos + diff --git a/src/core/tasks/url/operators/auto_relevant/sort.py b/src/core/tasks/url/operators/auto_relevant/sort.py new file mode 100644 index 00000000..23312625 --- /dev/null +++ b/src/core/tasks/url/operators/auto_relevant/sort.py @@ -0,0 +1,14 @@ +from src.core.tasks.url.operators.auto_relevant.models.subsets import URLRelevantAnnotationOutcomeSubsets +from src.core.tasks.url.operators.auto_relevant.models.tdo import URLRelevantTDO + + +async def separate_success_and_error_subsets( + tdos: list[URLRelevantTDO] +) -> URLRelevantAnnotationOutcomeSubsets: + subsets = URLRelevantAnnotationOutcomeSubsets() + for tdo in tdos: + if tdo.error is not None: + subsets.error.append(tdo) + else: + subsets.success.append(tdo) + return subsets diff --git a/src/db/client/async_.py b/src/db/client/async_.py index 62cfb7d3..d1a3aa09 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -1,10 +1,10 @@ from datetime import datetime, timedelta from functools import wraps from operator import or_ -from typing import Optional, Type, Any, List +from typing import Optional, Type, Any, List, Sequence from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, Select, not_, and_, update, delete, literal, text +from sqlalchemy import select, exists, func, case, Select, not_, and_, update, delete, literal, text, Row from sqlalchemy.dialects import postgresql from sqlalchemy.dialects.postgresql import insert as pg_insert from sqlalchemy.exc import IntegrityError, NoResultFound @@ -48,6 +48,8 @@ from src.core.tasks.scheduled.operators.agency_sync.dtos.parameters import AgencySyncParameters from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.tasks.url.operators.agency_identification.dtos.tdo import AgencyIdentificationTDO +from src.core.tasks.url.operators.auto_relevant.models.tdo import URLRelevantTDO +from src.core.tasks.url.operators.auto_relevant.queries.get_tdos import GetAutoRelevantTDOsQueryBuilder from src.core.tasks.url.operators.submit_approved_url.tdo import SubmitApprovedURLTDO, SubmittedURLInfo from src.core.tasks.url.operators.url_404_probe.tdo import URL404ProbeTDO from src.core.tasks.url.operators.url_duplicate.tdo import URLDuplicateTDO @@ -58,6 +60,7 @@ from src.db.dto_converter import DTOConverter from src.db.dtos.batch import BatchInfo from src.db.dtos.duplicate import DuplicateInsertInfo, DuplicateInfo +from src.db.dtos.url.annotations.auto.relevancy import AutoRelevancyAnnotationInput from src.db.dtos.url.insert import InsertURLsInfo from src.db.dtos.log import LogInfo, LogOutputInfo from src.db.dtos.url.error import URLErrorPydanticInfo @@ -93,6 +96,7 @@ from src.db.models.instantiations.url.suggestion.relevant.auto import AutoRelevantSuggestion from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion from src.db.models.templates import Base +from src.db.queries.base.builder import QueryBuilderBase from src.db.queries.implementations.core.final_review.get import GetNextURLForFinalReviewQueryBuilder from src.db.queries.implementations.core.get_recent_batch_summaries.builder import GetRecentBatchSummariesQueryBuilder from src.db.queries.implementations.core.metrics.urls.aggregated.pending import \ @@ -217,22 +221,36 @@ async def scalars(self, session: AsyncSession, statement): async def mapping(self, session: AsyncSession, statement): return (await session.execute(statement)).mappings().one() - - + @session_manager + async def run_query_builder( + self, + session: AsyncSession, + builder: QueryBuilderBase + ) -> Any: + return await builder.run(session) # region relevant @session_manager async def add_auto_relevant_suggestion( self, - session: AsyncSession, - url_id: int, - relevant: bool + input_: AutoRelevancyAnnotationInput ): - suggestion = AutoRelevantSuggestion( - url_id=url_id, - relevant=relevant - ) - session.add(suggestion) + await self.add_user_relevant_suggestions([input_]) + + async def add_user_relevant_suggestions( + self, + inputs: list[AutoRelevancyAnnotationInput] + ): + models = [ + AutoRelevantSuggestion( + url_id=input_.url_id, + relevant=input_.is_relevant, + confidence=input_.confidence, + model_name=input_.model_name + ) + for input_ in inputs + ] + await self.add_all(models) @staticmethod async def get_user_suggestion( @@ -294,6 +312,9 @@ async def get_next_url_for_user_annotation( return raw_result.unique().scalars().one_or_none() + async def get_tdos_for_auto_relevancy(self) -> list[URLRelevantTDO]: + return await self.run_query_builder(builder=GetAutoRelevantTDOsQueryBuilder()) + @session_manager async def add_user_relevant_suggestion( self, @@ -595,7 +616,7 @@ async def get_urls_with_html_data_and_without_models( ) statement = statement.limit(100).order_by(URL.id) raw_result = await session.execute(statement) - urls: list[URL] = raw_result.unique().scalars().all() + urls: Sequence[Row[URL]] = raw_result.unique().scalars().all() final_results = DTOConverter.url_list_to_url_with_html_list(urls) return final_results @@ -628,6 +649,13 @@ async def has_urls_with_html_data_and_without_models( scalar_result = await session.scalars(statement) return bool(scalar_result.first()) + @session_manager + async def has_urls_with_html_data_and_without_auto_relevant_suggestion(self, session: AsyncSession) -> bool: + return await self.has_urls_with_html_data_and_without_models( + session=session, + model=AutoRelevantSuggestion + ) + @session_manager async def has_urls_with_html_data_and_without_auto_record_type_suggestion(self, session: AsyncSession) -> bool: return await self.has_urls_with_html_data_and_without_models( diff --git a/src/db/dtos/url/annotation.py b/src/db/dtos/url/annotation.py deleted file mode 100644 index cbc1bcda..00000000 --- a/src/db/dtos/url/annotation.py +++ /dev/null @@ -1,10 +0,0 @@ -from pydantic import BaseModel - -from src.db.dtos.url.html_content import URLHTMLContentInfo - - -class URLAnnotationInfo(BaseModel): - metadata_id: int - url: str - html_infos: list[URLHTMLContentInfo] - suggested_value: str \ No newline at end of file diff --git a/src/db/dtos/url/annotations/__init__.py b/src/db/dtos/url/annotations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/dtos/url/annotations/auto/__init__.py b/src/db/dtos/url/annotations/auto/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/dtos/url/annotations/auto/relevancy.py b/src/db/dtos/url/annotations/auto/relevancy.py new file mode 100644 index 00000000..950cc530 --- /dev/null +++ b/src/db/dtos/url/annotations/auto/relevancy.py @@ -0,0 +1,8 @@ +from pydantic import BaseModel + + +class AutoRelevancyAnnotationInput(BaseModel): + url_id: int + is_relevant: bool + confidence: float + model_name: str \ No newline at end of file diff --git a/src/db/dtos/url/relevancy.py b/src/db/dtos/url/relevancy.py deleted file mode 100644 index 6369da2a..00000000 --- a/src/db/dtos/url/relevancy.py +++ /dev/null @@ -1,6 +0,0 @@ -from pydantic import BaseModel - - -class URLRelevancyInfo(BaseModel): - url_id: int - relevant: bool \ No newline at end of file diff --git a/src/external/huggingface/inference/client.py b/src/external/huggingface/inference/client.py index bfa0c67c..d3ea2501 100644 --- a/src/external/huggingface/inference/client.py +++ b/src/external/huggingface/inference/client.py @@ -23,7 +23,7 @@ async def get_relevancy_annotation( self, input_: BasicInput, attempts: int = 3 ) -> BasicOutput: - for _ in range(attempts): + for i in range(attempts): try: async with self.session.post( RELEVANCY_ENDPOINT, @@ -40,6 +40,7 @@ async def get_relevancy_annotation( result = BasicOutput(**(await response.json())) break except HTTPServiceUnavailable as e: - print(f"Service unavailable: {e}. Retrying after backoff...") - await asyncio.sleep(1) + backoff = 60 * (i + 1) + print(f"Service unavailable: {e}. Retrying after backoff of {backoff} seconds...") + await asyncio.sleep(backoff) return result diff --git a/src/external/huggingface/inference/models/output.py b/src/external/huggingface/inference/models/output.py index 204b6ed0..823253f5 100644 --- a/src/external/huggingface/inference/models/output.py +++ b/src/external/huggingface/inference/models/output.py @@ -1,7 +1,11 @@ -from pydantic import BaseModel, Field +from pydantic import BaseModel class BasicOutput(BaseModel): + """Corresponds to `BasicOutput` model in inference repository. + + https://github.com/Police-Data-Accessibility-Project/relevance-inference/blob/main/src/dtos/output/basic.py + """ annotation: bool confidence: float model: str \ No newline at end of file diff --git a/tests/automated/integration/tasks/asserts.py b/tests/automated/integration/tasks/asserts.py new file mode 100644 index 00000000..17f7cba5 --- /dev/null +++ b/tests/automated/integration/tasks/asserts.py @@ -0,0 +1,11 @@ +from src.core.tasks.url.enums import TaskOperatorOutcome + + +async def assert_prereqs_not_met(operator): + meets_prereqs = await operator.meets_task_prerequisites() + assert not meets_prereqs + + +def assert_task_has_expected_run_info(run_info, url_ids: list[int]): + assert run_info.outcome == TaskOperatorOutcome.SUCCESS + assert run_info.linked_url_ids == url_ids diff --git a/tests/automated/integration/tasks/url/auto_relevant/__init__.py b/tests/automated/integration/tasks/url/auto_relevant/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/automated/integration/tasks/url/auto_relevant/setup.py b/tests/automated/integration/tasks/url/auto_relevant/setup.py new file mode 100644 index 00000000..fdd17e16 --- /dev/null +++ b/tests/automated/integration/tasks/url/auto_relevant/setup.py @@ -0,0 +1,45 @@ +from unittest.mock import AsyncMock + +from src.core.tasks.url.operators.auto_relevant.core import URLAutoRelevantTaskOperator +from src.db.client.async_ import AsyncDatabaseClient +from src.external.huggingface.inference.models.output import BasicOutput +from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters +from tests.helpers.batch_creation_parameters.url_creation_parameters import TestURLCreationParameters +from tests.helpers.db_data_creator import DBDataCreator, BatchURLCreationInfoV2 + + +async def setup_operator(adb_client: AsyncDatabaseClient) -> URLAutoRelevantTaskOperator: + """Create pending urls with compressed html data and no auto relevant suggestion""" + mock_hf_client = AsyncMock() + mock_hf_client.get_relevancy_annotation.side_effect = [ + BasicOutput( + annotation=True, + confidence=0.5, + model="test_model" + ), + BasicOutput( + annotation=False, + confidence=0.5, + model="test_model" + ), + Exception("test exception") + ] + return URLAutoRelevantTaskOperator( + adb_client=adb_client, + hf_client=mock_hf_client + ) + +async def setup_urls(db_data_creator: DBDataCreator) -> list[int]: + """Create pending urls with compressed html data and no auto relevant suggestion""" + parameters = TestBatchCreationParameters( + urls=[ + TestURLCreationParameters( + count=3, + with_html_content=True + ) + ] + ) + + batch_url_creation_info = await db_data_creator.batch_v2(parameters=parameters) + + return batch_url_creation_info.url_ids \ No newline at end of file diff --git a/tests/automated/integration/tasks/url/auto_relevant/test_task.py b/tests/automated/integration/tasks/url/auto_relevant/test_task.py new file mode 100644 index 00000000..0c39cb9a --- /dev/null +++ b/tests/automated/integration/tasks/url/auto_relevant/test_task.py @@ -0,0 +1,46 @@ +import pytest + +from src.db.enums import TaskType +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.url.error_info import URLErrorInfo +from src.db.models.instantiations.url.suggestion.relevant.auto import AutoRelevantSuggestion +from tests.automated.integration.tasks.asserts import assert_prereqs_not_met, assert_task_has_expected_run_info +from tests.automated.integration.tasks.url.auto_relevant.setup import setup_operator, setup_urls + + +@pytest.mark.asyncio +async def test_url_auto_relevant_task(db_data_creator): + + operator = await setup_operator(adb_client=db_data_creator.adb_client) + await assert_prereqs_not_met(operator) + + url_ids = await setup_urls(db_data_creator) + + task_id = await db_data_creator.adb_client.initiate_task(task_type=TaskType.RELEVANCY) + + run_info = await operator.run_task(task_id) + + assert_task_has_expected_run_info(run_info, url_ids) + + adb_client = db_data_creator.adb_client + # Get URLs, confirm one is marked as error + urls: list[URL] = await adb_client.get_all(URL) + assert len(urls) == 3 + statuses = [url.outcome for url in urls] + assert sorted(statuses) == sorted(["pending", "pending", "error"]) + + # Confirm two annotations were created + suggestions: list[AutoRelevantSuggestion] = await adb_client.get_all(AutoRelevantSuggestion) + assert len(suggestions) == 2 + for suggestion in suggestions: + assert suggestion.url_id in url_ids + assert suggestion.relevant is not None + assert suggestion.confidence == 0.5 + assert suggestion.model_name == "test_model" + + # Confirm presence of url error + errors = await adb_client.get_all(URLErrorInfo) + assert len(errors) == 1 + + + diff --git a/tests/automated/integration/tasks/url/html/asserts.py b/tests/automated/integration/tasks/url/html/asserts.py index a5bf19f6..5566aab6 100644 --- a/tests/automated/integration/tasks/url/html/asserts.py +++ b/tests/automated/integration/tasks/url/html/asserts.py @@ -1,23 +1,9 @@ from src.collectors.enums import URLStatus -from src.core.tasks.url.enums import TaskOperatorOutcome from src.db.client.async_ import AsyncDatabaseClient from src.db.enums import TaskType -from src.db.models.instantiations.url.compressed_html import URLCompressedHTML -from src.db.utils.compression import decompress_html from tests.automated.integration.tasks.url.html.mocks.constants import MOCK_HTML_CONTENT -async def assert_prereqs_not_met(operator): - # TODO: Look into using this function in other tests - meets_prereqs = await operator.meets_task_prerequisites() - assert not meets_prereqs - - -def assert_task_has_expected_run_info(run_info, url_ids: list[int]): - assert run_info.outcome == TaskOperatorOutcome.SUCCESS - assert run_info.linked_url_ids == url_ids - - async def assert_success_url_has_two_html_content_entries( adb: AsyncDatabaseClient, run_info, diff --git a/tests/automated/integration/tasks/url/html/setup.py b/tests/automated/integration/tasks/url/html/setup.py index e71bf013..e6a4de81 100644 --- a/tests/automated/integration/tasks/url/html/setup.py +++ b/tests/automated/integration/tasks/url/html/setup.py @@ -9,26 +9,26 @@ from tests.automated.integration.tasks.url.html.mocks.methods import mock_make_requests, mock_get_from_cache, mock_parse -async def setup_mocked_url_request_interface(): +async def setup_mocked_url_request_interface() -> URLRequestInterface: url_request_interface = URLRequestInterface() url_request_interface.make_requests_with_html = types.MethodType(mock_make_requests, url_request_interface) return url_request_interface -async def setup_mocked_root_url_cache(): +async def setup_mocked_root_url_cache() -> RootURLCache: mock_root_url_cache = RootURLCache() mock_root_url_cache.get_from_cache = types.MethodType(mock_get_from_cache, mock_root_url_cache) return mock_root_url_cache -async def setup_urls(db_data_creator): +async def setup_urls(db_data_creator) -> list[int]: batch_id = db_data_creator.batch() url_mappings = db_data_creator.urls(batch_id=batch_id, url_count=3).url_mappings url_ids = [url_info.url_id for url_info in url_mappings] return url_ids -async def setup_operator(): +async def setup_operator() -> URLHTMLTaskOperator: html_parser = HTMLResponseParser( root_url_cache=await setup_mocked_root_url_cache() ) diff --git a/tests/automated/integration/tasks/url/html/test_task.py b/tests/automated/integration/tasks/url/html/test_task.py index 6c44ab93..e39d7576 100644 --- a/tests/automated/integration/tasks/url/html/test_task.py +++ b/tests/automated/integration/tasks/url/html/test_task.py @@ -1,10 +1,9 @@ import pytest from src.db.enums import TaskType -from tests.automated.integration.tasks.url.html.asserts import assert_prereqs_not_met, \ - assert_task_has_expected_run_info, \ - assert_success_url_has_two_html_content_entries, assert_404_url_has_404_status, assert_task_has_one_url_error, \ +from tests.automated.integration.tasks.url.html.asserts import assert_success_url_has_two_html_content_entries, assert_404_url_has_404_status, assert_task_has_one_url_error, \ assert_task_type_is_html, assert_task_ran_without_error, assert_url_has_one_compressed_html_content_entry +from tests.automated.integration.tasks.asserts import assert_prereqs_not_met, assert_task_has_expected_run_info from tests.automated.integration.tasks.url.html.setup import setup_urls, setup_operator from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/conftest.py b/tests/conftest.py index 294ceb19..a33014d1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -40,6 +40,7 @@ def setup_and_teardown(): "PDAP_API_URL", "DISCORD_WEBHOOK_URL", "OPENAI_API_KEY", + "HUGGINGFACE_INFERENCE_API_KEY" ] all_env_vars = required_env_vars.copy() for env_var in test_env_vars: diff --git a/tests/helpers/db_data_creator.py b/tests/helpers/db_data_creator.py index 2591b9cb..85995671 100644 --- a/tests/helpers/db_data_creator.py +++ b/tests/helpers/db_data_creator.py @@ -11,12 +11,14 @@ from src.db.client.async_ import AsyncDatabaseClient from src.db.dtos.batch import BatchInfo from src.db.dtos.duplicate import DuplicateInsertInfo +from src.db.dtos.url.annotations.auto.relevancy import AutoRelevancyAnnotationInput from src.db.dtos.url.insert import InsertURLsInfo from src.db.dtos.url.error import URLErrorPydanticInfo from src.db.dtos.url.html_content import URLHTMLContentInfo, HTMLContentType from src.db.dtos.url.core import URLInfo from src.db.dtos.url.mapping import URLMapping from src.db.client.sync import DatabaseClient +from src.db.dtos.url.raw_html import RawHTMLInfo from src.db.enums import TaskType from src.collectors.enums import CollectorType, URLStatus from src.core.tasks.url.operators.submit_approved_url.tdo import SubmittedURLInfo @@ -32,10 +34,22 @@ class URLCreationInfo(BaseModel): outcome: URLStatus annotation_info: Optional[AnnotationInfo] = None + @property + def url_ids(self) -> list[int]: + return [url_mapping.url_id for url_mapping in self.url_mappings] + class BatchURLCreationInfoV2(BaseModel): batch_id: int url_creation_infos: dict[URLStatus, URLCreationInfo] + @property + def url_ids(self) -> list[int]: + url_creation_infos = self.url_creation_infos.values() + url_ids = [] + for url_creation_info in url_creation_infos: + url_ids.extend(url_creation_info.url_ids) + return url_ids + class BatchURLCreationInfo(BaseModel): batch_id: int url_ids: list[int] @@ -90,6 +104,7 @@ async def batch_v2( ) d: dict[URLStatus, URLCreationInfo] = {} + # Create urls for url_parameters in parameters.urls: iui: InsertURLsInfo = self.urls( batch_id=batch_id, @@ -169,8 +184,12 @@ async def agency(self) -> int: async def auto_relevant_suggestions(self, url_id: int, relevant: bool = True): await self.adb_client.add_auto_relevant_suggestion( - url_id=url_id, - relevant=relevant + input_=AutoRelevancyAnnotationInput( + url_id=url_id, + is_relevant=relevant, + confidence=0.5, + model_name="test_model" + ) ) async def annotate( @@ -397,6 +416,7 @@ def duplicate_urls(self, duplicate_batch_id: int, url_ids: list[int]): async def html_data(self, url_ids: list[int]): html_content_infos = [] + raw_html_info_list = [] for url_id in url_ids: html_content_infos.append( URLHTMLContentInfo( @@ -412,6 +432,13 @@ async def html_data(self, url_ids: list[int]): content="test description" ) ) + raw_html_info = RawHTMLInfo( + url_id=url_id, + html="" + ) + raw_html_info_list.append(raw_html_info) + + await self.adb_client.add_raw_html(raw_html_info_list) await self.adb_client.add_html_content_infos(html_content_infos) async def error_info( From 535fcf5f3ac5e26e9833081e1096f1390090921d Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 16 Jul 2025 18:09:06 -0400 Subject: [PATCH 237/244] Update endpoints to use full relevancy confidence and model name as well --- .../{dtos/agency => _shared}/__init__.py | 0 .../{dtos/all => _shared/queries}/__init__.py | 0 .../queries/get_annotation_batch_info.py | 75 +++ .../get_next_url_for_user_annotation.py | 64 ++ .../{dtos/relevance => agency}/__init__.py | 0 .../dtos => annotate/agency/get}/__init__.py | 0 .../agency/response.py => agency/get/dto.py} | 0 .../annotate/agency/get/queries}/__init__.py | 0 .../agency/get/queries/agency_suggestion.py | 55 ++ .../agency/get/queries/next_for_annotation.py | 128 ++++ .../annotate/agency/post}/__init__.py | 0 .../agency/post.py => agency/post/dto.py} | 0 .../endpoints/annotate/all}/__init__.py | 0 .../endpoints/annotate/all/get/__init__.py | 0 .../{dtos/all/response.py => all/get/dto.py} | 9 +- src/api/endpoints/annotate/all/get/query.py | 109 ++++ .../endpoints/annotate/all/post/__init__.py | 0 .../{dtos/all/post.py => all/post/dto.py} | 2 +- .../annotate/dtos/relevance/response.py | 14 - .../endpoints/annotate/relevance/__init__.py | 0 .../annotate/relevance/get/__init__.py | 0 .../endpoints/annotate/relevance/get/dto.py | 25 + .../endpoints/annotate/relevance/get/query.py | 64 ++ .../annotate/relevance/post/__init__.py | 0 .../post.py => relevance/post/dto.py} | 0 src/api/endpoints/annotate/routes.py | 12 +- src/api/endpoints/review/approve/__init__.py | 0 .../{dtos/approve.py => approve/dto.py} | 2 +- src/api/endpoints/review/approve/query.py | 150 +++++ src/api/endpoints/review/next/__init__.py | 0 .../review/{dtos/get.py => next/dto.py} | 5 +- .../endpoints/review/next/query.py} | 17 +- src/api/endpoints/review/reject/__init__.py | 0 .../review/{dtos/reject.py => reject/dto.py} | 2 +- src/api/endpoints/review/reject/query.py | 55 ++ src/api/endpoints/review/routes.py | 31 +- src/api/endpoints/review/shared/__init__.py | 0 .../endpoints/review/shared/dtos/__init__.py | 0 .../review/{ => shared}/dtos/base.py | 0 src/core/core.py | 14 +- src/db/client/async_.py | 557 ++---------------- src/db/client/types.py | 9 + src/db/dto_converter.py | 14 +- .../implementations/core/get/__init__.py | 0 .../core/get/html_content_info.py | 22 + .../get/recent_batch_summaries/__init__.py | 0 .../recent_batch_summaries}/builder.py | 4 +- .../url_counts/__init__.py | 0 .../url_counts/builder.py | 2 +- .../url_counts/labels.py | 0 .../api/_helpers/RequestValidator.py | 18 +- .../metrics/urls/aggregated/test_pending.py | 2 +- .../metrics/urls/breakdown/test_pending.py | 2 +- .../integration/api/review/conftest.py | 2 +- .../api/review/rejection/helpers.py | 4 +- .../test_approve_and_get_next_source.py | 4 +- .../api/review/test_next_source.py | 2 +- .../integration/api/test_annotate.py | 10 +- .../db/client/approve_url/test_basic.py | 2 +- .../db/client/approve_url/test_error.py | 4 +- .../test_basic.py | 2 +- .../test_new_agency.py | 2 +- .../url/test_submit_approved_url_task.py | 2 +- .../unit/dto/test_all_annotation_post_info.py | 2 +- .../annotation_info.py | 2 +- .../url_creation_parameters.py | 2 +- tests/helpers/complex_test_data_functions.py | 2 +- tests/helpers/db_data_creator.py | 4 +- .../external/pdap/test_sync_agencies.py | 2 +- .../source_collectors/test_ckan_collector.py | 2 +- 70 files changed, 910 insertions(+), 603 deletions(-) rename src/api/endpoints/annotate/{dtos/agency => _shared}/__init__.py (100%) rename src/api/endpoints/annotate/{dtos/all => _shared/queries}/__init__.py (100%) create mode 100644 src/api/endpoints/annotate/_shared/queries/get_annotation_batch_info.py create mode 100644 src/api/endpoints/annotate/_shared/queries/get_next_url_for_user_annotation.py rename src/api/endpoints/annotate/{dtos/relevance => agency}/__init__.py (100%) rename src/api/endpoints/{review/dtos => annotate/agency/get}/__init__.py (100%) rename src/api/endpoints/annotate/{dtos/agency/response.py => agency/get/dto.py} (100%) rename src/{db/queries/implementations/core/final_review => api/endpoints/annotate/agency/get/queries}/__init__.py (100%) create mode 100644 src/api/endpoints/annotate/agency/get/queries/agency_suggestion.py create mode 100644 src/api/endpoints/annotate/agency/get/queries/next_for_annotation.py rename src/{db/queries/implementations/core/get_recent_batch_summaries => api/endpoints/annotate/agency/post}/__init__.py (100%) rename src/api/endpoints/annotate/{dtos/agency/post.py => agency/post/dto.py} (100%) rename src/{db/queries/implementations/core/get_recent_batch_summaries/url_counts => api/endpoints/annotate/all}/__init__.py (100%) create mode 100644 src/api/endpoints/annotate/all/get/__init__.py rename src/api/endpoints/annotate/{dtos/all/response.py => all/get/dto.py} (63%) create mode 100644 src/api/endpoints/annotate/all/get/query.py create mode 100644 src/api/endpoints/annotate/all/post/__init__.py rename src/api/endpoints/annotate/{dtos/all/post.py => all/post/dto.py} (94%) delete mode 100644 src/api/endpoints/annotate/dtos/relevance/response.py create mode 100644 src/api/endpoints/annotate/relevance/__init__.py create mode 100644 src/api/endpoints/annotate/relevance/get/__init__.py create mode 100644 src/api/endpoints/annotate/relevance/get/dto.py create mode 100644 src/api/endpoints/annotate/relevance/get/query.py create mode 100644 src/api/endpoints/annotate/relevance/post/__init__.py rename src/api/endpoints/annotate/{dtos/relevance/post.py => relevance/post/dto.py} (100%) create mode 100644 src/api/endpoints/review/approve/__init__.py rename src/api/endpoints/review/{dtos/approve.py => approve/dto.py} (95%) create mode 100644 src/api/endpoints/review/approve/query.py create mode 100644 src/api/endpoints/review/next/__init__.py rename src/api/endpoints/review/{dtos/get.py => next/dto.py} (92%) rename src/{db/queries/implementations/core/final_review/get.py => api/endpoints/review/next/query.py} (96%) create mode 100644 src/api/endpoints/review/reject/__init__.py rename src/api/endpoints/review/{dtos/reject.py => reject/dto.py} (71%) create mode 100644 src/api/endpoints/review/reject/query.py create mode 100644 src/api/endpoints/review/shared/__init__.py create mode 100644 src/api/endpoints/review/shared/dtos/__init__.py rename src/api/endpoints/review/{ => shared}/dtos/base.py (100%) create mode 100644 src/db/client/types.py create mode 100644 src/db/queries/implementations/core/get/__init__.py create mode 100644 src/db/queries/implementations/core/get/html_content_info.py create mode 100644 src/db/queries/implementations/core/get/recent_batch_summaries/__init__.py rename src/db/queries/implementations/core/{get_recent_batch_summaries => get/recent_batch_summaries}/builder.py (95%) create mode 100644 src/db/queries/implementations/core/get/recent_batch_summaries/url_counts/__init__.py rename src/db/queries/implementations/core/{get_recent_batch_summaries => get/recent_batch_summaries}/url_counts/builder.py (98%) rename src/db/queries/implementations/core/{get_recent_batch_summaries => get/recent_batch_summaries}/url_counts/labels.py (100%) diff --git a/src/api/endpoints/annotate/dtos/agency/__init__.py b/src/api/endpoints/annotate/_shared/__init__.py similarity index 100% rename from src/api/endpoints/annotate/dtos/agency/__init__.py rename to src/api/endpoints/annotate/_shared/__init__.py diff --git a/src/api/endpoints/annotate/dtos/all/__init__.py b/src/api/endpoints/annotate/_shared/queries/__init__.py similarity index 100% rename from src/api/endpoints/annotate/dtos/all/__init__.py rename to src/api/endpoints/annotate/_shared/queries/__init__.py diff --git a/src/api/endpoints/annotate/_shared/queries/get_annotation_batch_info.py b/src/api/endpoints/annotate/_shared/queries/get_annotation_batch_info.py new file mode 100644 index 00000000..b9b0a634 --- /dev/null +++ b/src/api/endpoints/annotate/_shared/queries/get_annotation_batch_info.py @@ -0,0 +1,75 @@ +from typing import List + +from sqlalchemy import select, func +from sqlalchemy.ext.asyncio import AsyncSession + +from src.api.endpoints.annotate.dtos.shared.batch import AnnotationBatchInfo +from src.collectors.enums import URLStatus +from src.db.models.instantiations.url.core import URL +from src.db.queries.base.builder import QueryBuilderBase +from src.db.statement_composer import StatementComposer +from src.db.types import UserSuggestionType + + +class GetAnnotationBatchInfoQueryBuilder(QueryBuilderBase): + + def __init__( + self, + batch_id: int | None, + models: List[UserSuggestionType] + ): + super().__init__() + self.batch_id = batch_id + self.models = models + + async def run( + self, + session: AsyncSession + ) -> AnnotationBatchInfo | None: + if self.batch_id is None: + return None + + sc = StatementComposer + include_queries = [ + sc.user_suggestion_exists(model) + for model in self.models + ] + + select_url = select(func.count(URL.id)) + + common_where_clause = [ + URL.outcome == URLStatus.PENDING.value, + URL.batch_id == self.batch_id, + ] + + annotated_query = ( + select_url + .where( + *common_where_clause, + *include_queries, + ) + ) + + exclude_queries = [ + sc.user_suggestion_not_exists(model) + for model in self.models + ] + + not_annotated_query = ( + select_url + .where( + *common_where_clause, + *exclude_queries, + ) + ) + + annotated_result_raw = await session.execute(annotated_query) + annotated_result = annotated_result_raw.scalars().one_or_none() + not_annotated_result_raw = await session.execute(not_annotated_query) + not_annotated_result = not_annotated_result_raw.scalars().one_or_none() + + return AnnotationBatchInfo( + count_annotated=annotated_result, + count_not_annotated=not_annotated_result, + total_urls=annotated_result + not_annotated_result + ) \ No newline at end of file diff --git a/src/api/endpoints/annotate/_shared/queries/get_next_url_for_user_annotation.py b/src/api/endpoints/annotate/_shared/queries/get_next_url_for_user_annotation.py new file mode 100644 index 00000000..c500641a --- /dev/null +++ b/src/api/endpoints/annotate/_shared/queries/get_next_url_for_user_annotation.py @@ -0,0 +1,64 @@ +from sqlalchemy import select, not_, exists +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import QueryableAttribute, joinedload + +from src.collectors.enums import URLStatus +from src.core.enums import SuggestedStatus +from src.db.client.types import UserSuggestionModel +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion +from src.db.queries.base.builder import QueryBuilderBase +from src.db.statement_composer import StatementComposer + + +class GetNextURLForUserAnnotationQueryBuilder(QueryBuilderBase): + + def __init__( + self, + user_suggestion_model_to_exclude: UserSuggestionModel, + auto_suggestion_relationship: QueryableAttribute, + batch_id: int | None, + check_if_annotated_not_relevant: bool = False + ): + super().__init__() + self.check_if_annotated_not_relevant = check_if_annotated_not_relevant + self.batch_id = batch_id + self.user_suggestion_model_to_exclude = user_suggestion_model_to_exclude + self.auto_suggestion_relationship = auto_suggestion_relationship + + async def run(self, session: AsyncSession): + url_query = ( + select( + URL, + ) + .where(URL.outcome == URLStatus.PENDING.value) + # URL must not have user suggestion + .where( + StatementComposer.user_suggestion_not_exists(self.user_suggestion_model_to_exclude) + ) + ) + + if self.check_if_annotated_not_relevant: + url_query = url_query.where( + not_( + exists( + select(UserRelevantSuggestion) + .where( + UserRelevantSuggestion.url_id == URL.id, + UserRelevantSuggestion.suggested_status != SuggestedStatus.RELEVANT.value + ) + ) + ) + ) + + if self.batch_id is not None: + url_query = url_query.where(URL.batch_id == self.batch_id) + + url_query = url_query.options( + joinedload(self.auto_suggestion_relationship), + joinedload(URL.html_content) + ).limit(1) + + raw_result = await session.execute(url_query) + + return raw_result.unique().scalars().one_or_none() \ No newline at end of file diff --git a/src/api/endpoints/annotate/dtos/relevance/__init__.py b/src/api/endpoints/annotate/agency/__init__.py similarity index 100% rename from src/api/endpoints/annotate/dtos/relevance/__init__.py rename to src/api/endpoints/annotate/agency/__init__.py diff --git a/src/api/endpoints/review/dtos/__init__.py b/src/api/endpoints/annotate/agency/get/__init__.py similarity index 100% rename from src/api/endpoints/review/dtos/__init__.py rename to src/api/endpoints/annotate/agency/get/__init__.py diff --git a/src/api/endpoints/annotate/dtos/agency/response.py b/src/api/endpoints/annotate/agency/get/dto.py similarity index 100% rename from src/api/endpoints/annotate/dtos/agency/response.py rename to src/api/endpoints/annotate/agency/get/dto.py diff --git a/src/db/queries/implementations/core/final_review/__init__.py b/src/api/endpoints/annotate/agency/get/queries/__init__.py similarity index 100% rename from src/db/queries/implementations/core/final_review/__init__.py rename to src/api/endpoints/annotate/agency/get/queries/__init__.py diff --git a/src/api/endpoints/annotate/agency/get/queries/agency_suggestion.py b/src/api/endpoints/annotate/agency/get/queries/agency_suggestion.py new file mode 100644 index 00000000..f1ab8b67 --- /dev/null +++ b/src/api/endpoints/annotate/agency/get/queries/agency_suggestion.py @@ -0,0 +1,55 @@ +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from src.api.endpoints.annotate.agency.get.dto import GetNextURLForAgencyAgencyInfo +from src.core.enums import SuggestionType +from src.db.models.instantiations.agency import Agency +from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion +from src.db.queries.base.builder import QueryBuilderBase + + +class GetAgencySuggestionsQueryBuilder(QueryBuilderBase): + + def __init__( + self, + url_id: int + ): + super().__init__() + self.url_id = url_id + + async def run(self, session: AsyncSession) -> list[GetNextURLForAgencyAgencyInfo]: + # Get relevant autosuggestions and agency info, if an associated agency exists + + statement = ( + select( + AutomatedUrlAgencySuggestion.agency_id, + AutomatedUrlAgencySuggestion.is_unknown, + Agency.name, + Agency.state, + Agency.county, + Agency.locality + ) + .join(Agency, isouter=True) + .where(AutomatedUrlAgencySuggestion.url_id == self.url_id) + ) + raw_autosuggestions = await session.execute(statement) + autosuggestions = raw_autosuggestions.all() + agency_suggestions = [] + for autosuggestion in autosuggestions: + agency_id = autosuggestion[0] + is_unknown = autosuggestion[1] + name = autosuggestion[2] + state = autosuggestion[3] + county = autosuggestion[4] + locality = autosuggestion[5] + agency_suggestions.append( + GetNextURLForAgencyAgencyInfo( + suggestion_type=SuggestionType.AUTO_SUGGESTION if not is_unknown else SuggestionType.UNKNOWN, + pdap_agency_id=agency_id, + agency_name=name, + state=state, + county=county, + locality=locality + ) + ) + return agency_suggestions \ No newline at end of file diff --git a/src/api/endpoints/annotate/agency/get/queries/next_for_annotation.py b/src/api/endpoints/annotate/agency/get/queries/next_for_annotation.py new file mode 100644 index 00000000..be625fb0 --- /dev/null +++ b/src/api/endpoints/annotate/agency/get/queries/next_for_annotation.py @@ -0,0 +1,128 @@ +from sqlalchemy import select, exists +from sqlalchemy.ext.asyncio import AsyncSession + +from src.api.endpoints.annotate._shared.queries.get_annotation_batch_info import GetAnnotationBatchInfoQueryBuilder +from src.api.endpoints.annotate.agency.get.dto import GetNextURLForAgencyAnnotationResponse, \ + GetNextURLForAgencyAnnotationInnerResponse +from src.api.endpoints.annotate.agency.get.queries.agency_suggestion import GetAgencySuggestionsQueryBuilder +from src.collectors.enums import URLStatus +from src.core.enums import SuggestedStatus +from src.core.tasks.url.operators.url_html.scraper.parser.util import convert_to_response_html_info +from src.db.dtos.url.mapping import URLMapping +from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion +from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion +from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion +from src.db.queries.base.builder import QueryBuilderBase +from src.db.queries.implementations.core.get.html_content_info import GetHTMLContentInfoQueryBuilder + + +class GetNextURLAgencyForAnnotationQueryBuilder(QueryBuilderBase): + + def __init__( + self, + batch_id: int | None, + user_id: int + ): + super().__init__() + self.batch_id = batch_id + self.user_id = user_id + + async def run( + self, + session: AsyncSession + ) -> GetNextURLForAgencyAnnotationResponse: + """ + Retrieve URL for annotation + The URL must + not be a confirmed URL + not have been annotated by this user + have extant autosuggestions + """ + # Select statement + statement = ( + select(URL.id, URL.url) + # Must not have confirmed agencies + .where( + URL.outcome == URLStatus.PENDING.value + ) + ) + + if self.batch_id is not None: + statement = statement.where(URL.batch_id == self.batch_id) + + # Must not have been annotated by a user + statement = ( + statement.join(UserUrlAgencySuggestion, isouter=True) + .where( + ~exists( + select(UserUrlAgencySuggestion). + where(UserUrlAgencySuggestion.url_id == URL.id). + correlate(URL) + ) + ) + # Must have extant autosuggestions + .join(AutomatedUrlAgencySuggestion, isouter=True) + .where( + exists( + select(AutomatedUrlAgencySuggestion). + where(AutomatedUrlAgencySuggestion.url_id == URL.id). + correlate(URL) + ) + ) + # Must not have confirmed agencies + .join(ConfirmedURLAgency, isouter=True) + .where( + ~exists( + select(ConfirmedURLAgency). + where(ConfirmedURLAgency.url_id == URL.id). + correlate(URL) + ) + ) + # Must not have been marked as "Not Relevant" by this user + .join(UserRelevantSuggestion, isouter=True) + .where( + ~exists( + select(UserRelevantSuggestion). + where( + (UserRelevantSuggestion.user_id == self.user_id) & + (UserRelevantSuggestion.url_id == URL.id) & + (UserRelevantSuggestion.suggested_status != SuggestedStatus.RELEVANT.value) + ).correlate(URL) + ) + ) + ).limit(1) + raw_result = await session.execute(statement) + results = raw_result.all() + if len(results) == 0: + return GetNextURLForAgencyAnnotationResponse( + next_annotation=None + ) + + result = results[0] + url_id = result[0] + url = result[1] + + agency_suggestions = await GetAgencySuggestionsQueryBuilder(url_id=url_id).run(session) + + # Get HTML content info + html_content_infos = await GetHTMLContentInfoQueryBuilder(url_id).run(session) + response_html_info = convert_to_response_html_info(html_content_infos) + + return GetNextURLForAgencyAnnotationResponse( + next_annotation=GetNextURLForAgencyAnnotationInnerResponse( + url_info=URLMapping( + url=url, + url_id=url_id + ), + html_info=response_html_info, + agency_suggestions=agency_suggestions, + batch_info=await GetAnnotationBatchInfoQueryBuilder( + batch_id=self.batch_id, + models=[ + UserUrlAgencySuggestion, + ] + ).run(session) + ) + ) \ No newline at end of file diff --git a/src/db/queries/implementations/core/get_recent_batch_summaries/__init__.py b/src/api/endpoints/annotate/agency/post/__init__.py similarity index 100% rename from src/db/queries/implementations/core/get_recent_batch_summaries/__init__.py rename to src/api/endpoints/annotate/agency/post/__init__.py diff --git a/src/api/endpoints/annotate/dtos/agency/post.py b/src/api/endpoints/annotate/agency/post/dto.py similarity index 100% rename from src/api/endpoints/annotate/dtos/agency/post.py rename to src/api/endpoints/annotate/agency/post/dto.py diff --git a/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/__init__.py b/src/api/endpoints/annotate/all/__init__.py similarity index 100% rename from src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/__init__.py rename to src/api/endpoints/annotate/all/__init__.py diff --git a/src/api/endpoints/annotate/all/get/__init__.py b/src/api/endpoints/annotate/all/get/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/annotate/dtos/all/response.py b/src/api/endpoints/annotate/all/get/dto.py similarity index 63% rename from src/api/endpoints/annotate/dtos/all/response.py rename to src/api/endpoints/annotate/all/get/dto.py index 6620624f..63d46ce6 100644 --- a/src/api/endpoints/annotate/dtos/all/response.py +++ b/src/api/endpoints/annotate/all/get/dto.py @@ -2,19 +2,20 @@ from pydantic import Field, BaseModel -from src.api.endpoints.annotate.dtos.agency.response import GetNextURLForAgencyAgencyInfo +from src.api.endpoints.annotate.agency.get.dto import GetNextURLForAgencyAgencyInfo from src.api.endpoints.annotate.dtos.shared.base.response import AnnotationInnerResponseInfoBase +from src.api.endpoints.annotate.relevance.get.dto import RelevanceAnnotationResponseInfo from src.core.enums import RecordType class GetNextURLForAllAnnotationInnerResponse(AnnotationInnerResponseInfoBase): - agency_suggestions: Optional[list[GetNextURLForAgencyAgencyInfo]] = Field( + agency_suggestions: list[GetNextURLForAgencyAgencyInfo] | None = Field( title="The auto-labeler's suggestions for agencies" ) - suggested_relevant: Optional[bool] = Field( + suggested_relevant: RelevanceAnnotationResponseInfo | None = Field( title="Whether the auto-labeler identified the URL as relevant or not" ) - suggested_record_type: Optional[RecordType] = Field( + suggested_record_type: RecordType | None = Field( title="What record type, if any, the auto-labeler identified the URL as" ) diff --git a/src/api/endpoints/annotate/all/get/query.py b/src/api/endpoints/annotate/all/get/query.py new file mode 100644 index 00000000..d23d749e --- /dev/null +++ b/src/api/endpoints/annotate/all/get/query.py @@ -0,0 +1,109 @@ +from sqlalchemy import Select, and_ +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import selectinload + +from src.api.endpoints.annotate._shared.queries.get_annotation_batch_info import GetAnnotationBatchInfoQueryBuilder +from src.api.endpoints.annotate.agency.get.queries.agency_suggestion import GetAgencySuggestionsQueryBuilder +from src.api.endpoints.annotate.agency.get.queries.next_for_annotation import GetNextURLAgencyForAnnotationQueryBuilder +from src.api.endpoints.annotate.all.get.dto import GetNextURLForAllAnnotationResponse, \ + GetNextURLForAllAnnotationInnerResponse +from src.api.endpoints.annotate.relevance.get.dto import RelevanceAnnotationResponseInfo +from src.collectors.enums import URLStatus +from src.db.dto_converter import DTOConverter +from src.db.dtos.url.mapping import URLMapping +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion +from src.db.models.instantiations.url.suggestion.record_type.user import UserRecordTypeSuggestion +from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion +from src.db.queries.base.builder import QueryBuilderBase +from src.db.statement_composer import StatementComposer + + +class GetNextURLForAllAnnotationQueryBuilder(QueryBuilderBase): + + def __init__( + self, + batch_id: int | None + ): + super().__init__() + self.batch_id = batch_id + + async def run( + self, + session: AsyncSession + ) -> GetNextURLForAllAnnotationResponse: + query = ( + Select(URL) + .where( + and_( + URL.outcome == URLStatus.PENDING.value, + StatementComposer.user_suggestion_not_exists(UserUrlAgencySuggestion), + StatementComposer.user_suggestion_not_exists(UserRecordTypeSuggestion), + StatementComposer.user_suggestion_not_exists(UserRelevantSuggestion), + ) + ) + ) + if self.batch_id is not None: + query = query.where(URL.batch_id == self.batch_id) + + load_options = [ + URL.html_content, + URL.automated_agency_suggestions, + URL.auto_relevant_suggestion, + URL.auto_record_type_suggestion + ] + select_in_loads = [ + selectinload(load_option) for load_option in load_options + ] + + # Add load options + query = query.options( + *select_in_loads + ) + + query = query.order_by(URL.id.asc()).limit(1) + raw_results = await session.execute(query) + url = raw_results.scalars().one_or_none() + if url is None: + return GetNextURLForAllAnnotationResponse( + next_annotation=None + ) + + html_response_info = DTOConverter.html_content_list_to_html_response_info( + url.html_content + ) + + if url.auto_relevant_suggestion is not None: + auto_relevant = url.auto_relevant_suggestion + else: + auto_relevant = None + + if url.auto_record_type_suggestion is not None: + auto_record_type = url.auto_record_type_suggestion.record_type + else: + auto_record_type = None + + agency_suggestions = await GetAgencySuggestionsQueryBuilder(url_id=url.id).run(session) + + return GetNextURLForAllAnnotationResponse( + next_annotation=GetNextURLForAllAnnotationInnerResponse( + url_info=URLMapping( + url_id=url.id, + url=url.url + ), + html_info=html_response_info, + suggested_relevant=RelevanceAnnotationResponseInfo( + is_relevant=auto_relevant.relevant, + confidence=auto_relevant.confidence, + model_name=auto_relevant.model_name + ) if auto_relevant is not None else None, + suggested_record_type=auto_record_type, + agency_suggestions=agency_suggestions, + batch_info=await GetAnnotationBatchInfoQueryBuilder( + batch_id=self.batch_id, + models=[ + UserUrlAgencySuggestion, + ] + ).run(session) + ) + ) \ No newline at end of file diff --git a/src/api/endpoints/annotate/all/post/__init__.py b/src/api/endpoints/annotate/all/post/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/annotate/dtos/all/post.py b/src/api/endpoints/annotate/all/post/dto.py similarity index 94% rename from src/api/endpoints/annotate/dtos/all/post.py rename to src/api/endpoints/annotate/all/post/dto.py index 67b683c9..293dcd7a 100644 --- a/src/api/endpoints/annotate/dtos/all/post.py +++ b/src/api/endpoints/annotate/all/post/dto.py @@ -2,7 +2,7 @@ from pydantic import BaseModel, model_validator -from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.agency.post.dto import URLAgencyAnnotationPostInfo from src.core.enums import RecordType, SuggestedStatus from src.core.exceptions import FailedValidationException diff --git a/src/api/endpoints/annotate/dtos/relevance/response.py b/src/api/endpoints/annotate/dtos/relevance/response.py deleted file mode 100644 index e6030d61..00000000 --- a/src/api/endpoints/annotate/dtos/relevance/response.py +++ /dev/null @@ -1,14 +0,0 @@ -from typing import Optional - -from pydantic import BaseModel, Field - -from src.api.endpoints.annotate.dtos.shared.base.response import AnnotationInnerResponseInfoBase - - -class GetNextRelevanceAnnotationResponseInfo(AnnotationInnerResponseInfoBase): - suggested_relevant: Optional[bool] = Field( - title="Whether the auto-labeler identified the URL as relevant or not" - ) - -class GetNextRelevanceAnnotationResponseOuterInfo(BaseModel): - next_annotation: Optional[GetNextRelevanceAnnotationResponseInfo] diff --git a/src/api/endpoints/annotate/relevance/__init__.py b/src/api/endpoints/annotate/relevance/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/annotate/relevance/get/__init__.py b/src/api/endpoints/annotate/relevance/get/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/annotate/relevance/get/dto.py b/src/api/endpoints/annotate/relevance/get/dto.py new file mode 100644 index 00000000..5d494555 --- /dev/null +++ b/src/api/endpoints/annotate/relevance/get/dto.py @@ -0,0 +1,25 @@ +from typing import Optional + +from pydantic import BaseModel, Field + +from src.api.endpoints.annotate.dtos.shared.base.response import AnnotationInnerResponseInfoBase +from src.core.tasks.url.operators.auto_relevant.models.annotation import RelevanceAnnotationInfo + +class RelevanceAnnotationResponseInfo(BaseModel): + is_relevant: bool | None = Field( + title="Whether the URL is relevant" + ) + confidence: float | None = Field( + title="The confidence of the annotation" + ) + model_name: str | None = Field( + title="The name of the model that made the annotation" + ) + +class GetNextRelevanceAnnotationResponseInfo(AnnotationInnerResponseInfoBase): + annotation: RelevanceAnnotationInfo | None = Field( + title="The auto-labeler's annotation for relevance" + ) + +class GetNextRelevanceAnnotationResponseOuterInfo(BaseModel): + next_annotation: Optional[GetNextRelevanceAnnotationResponseInfo] diff --git a/src/api/endpoints/annotate/relevance/get/query.py b/src/api/endpoints/annotate/relevance/get/query.py new file mode 100644 index 00000000..d8cf72e0 --- /dev/null +++ b/src/api/endpoints/annotate/relevance/get/query.py @@ -0,0 +1,64 @@ +from sqlalchemy.ext.asyncio import AsyncSession + +from src.api.endpoints.annotate._shared.queries.get_annotation_batch_info import GetAnnotationBatchInfoQueryBuilder +from src.api.endpoints.annotate._shared.queries.get_next_url_for_user_annotation import \ + GetNextURLForUserAnnotationQueryBuilder +from src.api.endpoints.annotate.relevance.get.dto import GetNextRelevanceAnnotationResponseInfo +from src.core.tasks.url.operators.auto_relevant.models.annotation import RelevanceAnnotationInfo +from src.db.dto_converter import DTOConverter +from src.db.dtos.url.mapping import URLMapping +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion +from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion +from src.db.queries.base.builder import QueryBuilderBase + + +class GetNextUrlForRelevanceAnnotationQueryBuilder(QueryBuilderBase): + + def __init__( + self, + batch_id: int | None + ): + super().__init__() + self.batch_id = batch_id + + async def run( + self, + session: AsyncSession + ) -> GetNextRelevanceAnnotationResponseInfo | None: + url = await GetNextURLForUserAnnotationQueryBuilder( + user_suggestion_model_to_exclude=UserRelevantSuggestion, + auto_suggestion_relationship=URL.auto_relevant_suggestion, + batch_id=self.batch_id + ).run(session) + if url is None: + return None + + # Next, get all HTML content for the URL + html_response_info = DTOConverter.html_content_list_to_html_response_info( + url.html_content + ) + + if url.auto_relevant_suggestion is not None: + suggestion = url.auto_relevant_suggestion.relevant + else: + suggestion = None + + return GetNextRelevanceAnnotationResponseInfo( + url_info=URLMapping( + url=url.url, + url_id=url.id + ), + annotation=RelevanceAnnotationInfo( + is_relevant=suggestion.is_relevant, + confidence=suggestion.confidence, + model_name=suggestion.model_name + ), + html_info=html_response_info, + batch_info=await GetAnnotationBatchInfoQueryBuilder( + batch_id=self.batch_id, + models=[ + UserUrlAgencySuggestion, + ] + ).run(session) + ) diff --git a/src/api/endpoints/annotate/relevance/post/__init__.py b/src/api/endpoints/annotate/relevance/post/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/annotate/dtos/relevance/post.py b/src/api/endpoints/annotate/relevance/post/dto.py similarity index 100% rename from src/api/endpoints/annotate/dtos/relevance/post.py rename to src/api/endpoints/annotate/relevance/post/dto.py diff --git a/src/api/endpoints/annotate/routes.py b/src/api/endpoints/annotate/routes.py index f1e2c895..fb5b117e 100644 --- a/src/api/endpoints/annotate/routes.py +++ b/src/api/endpoints/annotate/routes.py @@ -3,14 +3,14 @@ from fastapi import APIRouter, Depends, Path, Query from src.api.dependencies import get_async_core -from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo -from src.api.endpoints.annotate.dtos.agency.response import GetNextURLForAgencyAnnotationResponse -from src.api.endpoints.annotate.dtos.all.post import AllAnnotationPostInfo -from src.api.endpoints.annotate.dtos.all.response import GetNextURLForAllAnnotationResponse +from src.api.endpoints.annotate.agency.get.dto import GetNextURLForAgencyAnnotationResponse +from src.api.endpoints.annotate.agency.post.dto import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.all.get.dto import GetNextURLForAllAnnotationResponse +from src.api.endpoints.annotate.all.post.dto import AllAnnotationPostInfo from src.api.endpoints.annotate.dtos.record_type.post import RecordTypeAnnotationPostInfo from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseOuterInfo -from src.api.endpoints.annotate.dtos.relevance.post import RelevanceAnnotationPostInfo -from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseOuterInfo +from src.api.endpoints.annotate.relevance.get.dto import GetNextRelevanceAnnotationResponseOuterInfo +from src.api.endpoints.annotate.relevance.post.dto import RelevanceAnnotationPostInfo from src.core.core import AsyncCore from src.security.manager import get_access_info from src.security.dtos.access_info import AccessInfo diff --git a/src/api/endpoints/review/approve/__init__.py b/src/api/endpoints/review/approve/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/review/dtos/approve.py b/src/api/endpoints/review/approve/dto.py similarity index 95% rename from src/api/endpoints/review/dtos/approve.py rename to src/api/endpoints/review/approve/dto.py index 0288c954..0d9628f7 100644 --- a/src/api/endpoints/review/dtos/approve.py +++ b/src/api/endpoints/review/approve/dto.py @@ -2,7 +2,7 @@ from pydantic import Field -from src.api.endpoints.review.dtos.base import FinalReviewBaseInfo +from src.api.endpoints.review.shared.dtos.base import FinalReviewBaseInfo from src.core.enums import RecordType diff --git a/src/api/endpoints/review/approve/query.py b/src/api/endpoints/review/approve/query.py new file mode 100644 index 00000000..bff32bf3 --- /dev/null +++ b/src/api/endpoints/review/approve/query.py @@ -0,0 +1,150 @@ +from typing import Any + +from sqlalchemy import Select, select +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import joinedload +from starlette.exceptions import HTTPException +from starlette.status import HTTP_400_BAD_REQUEST + +from src.api.endpoints.review.approve.dto import FinalReviewApprovalInfo +from src.collectors.enums import URLStatus +from src.db.constants import PLACEHOLDER_AGENCY_NAME +from src.db.models.instantiations.agency import Agency +from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata +from src.db.models.instantiations.url.reviewing_user import ReviewingUserURL +from src.db.queries.base.builder import QueryBuilderBase + + +class ApproveURLQueryBuilder(QueryBuilderBase): + + def __init__( + self, + user_id: int, + approval_info: FinalReviewApprovalInfo + ): + super().__init__() + self.user_id = user_id + self.approval_info = approval_info + + async def run(self, session: AsyncSession) -> None: + # Get URL + def update_if_not_none( + model, + field, + value: Any, + required: bool = False + ): + if value is not None: + setattr(model, field, value) + return + if not required: + return + model_value = getattr(model, field, None) + if model_value is None: + raise HTTPException( + status_code=HTTP_400_BAD_REQUEST, + detail=f"Must specify {field} if it does not already exist" + ) + + query = ( + Select(URL) + .where(URL.id == self.approval_info.url_id) + .options( + joinedload(URL.optional_data_source_metadata), + joinedload(URL.confirmed_agencies), + ) + ) + + url = await session.execute(query) + url = url.scalars().first() + + update_if_not_none( + url, + "record_type", + self.approval_info.record_type.value + if self.approval_info.record_type is not None else None, + required=True + ) + + # Get existing agency ids + existing_agencies = url.confirmed_agencies or [] + existing_agency_ids = [agency.agency_id for agency in existing_agencies] + new_agency_ids = self.approval_info.agency_ids or [] + if len(existing_agency_ids) == 0 and len(new_agency_ids) == 0: + raise HTTPException( + status_code=HTTP_400_BAD_REQUEST, + detail="Must specify agency_id if URL does not already have a confirmed agency" + ) + + # Get any existing agency ids that are not in the new agency ids + # If new agency ids are specified, overwrite existing + if len(new_agency_ids) != 0: + for existing_agency in existing_agencies: + if existing_agency.id not in new_agency_ids: + # If the existing agency id is not in the new agency ids, delete it + await session.delete(existing_agency) + # Add any new agency ids that are not in the existing agency ids + for new_agency_id in new_agency_ids: + if new_agency_id not in existing_agency_ids: + # Check if the new agency exists in the database + query = ( + select(Agency) + .where(Agency.agency_id == new_agency_id) + ) + existing_agency = await session.execute(query) + existing_agency = existing_agency.scalars().first() + if existing_agency is None: + # If not, create it + agency = Agency( + agency_id=new_agency_id, + name=PLACEHOLDER_AGENCY_NAME, + ) + session.add(agency) + + # If the new agency id is not in the existing agency ids, add it + confirmed_url_agency = ConfirmedURLAgency( + url_id=self.approval_info.url_id, + agency_id=new_agency_id + ) + session.add(confirmed_url_agency) + + # If it does, do nothing + + url.outcome = URLStatus.VALIDATED.value + + update_if_not_none(url, "name", self.approval_info.name, required=True) + update_if_not_none(url, "description", self.approval_info.description, required=True) + + optional_metadata = url.optional_data_source_metadata + if optional_metadata is None: + url.optional_data_source_metadata = URLOptionalDataSourceMetadata( + record_formats=self.approval_info.record_formats, + data_portal_type=self.approval_info.data_portal_type, + supplying_entity=self.approval_info.supplying_entity + ) + else: + update_if_not_none( + optional_metadata, + "record_formats", + self.approval_info.record_formats + ) + update_if_not_none( + optional_metadata, + "data_portal_type", + self.approval_info.data_portal_type + ) + update_if_not_none( + optional_metadata, + "supplying_entity", + self.approval_info.supplying_entity + ) + + # Add approving user + approving_user_url = ReviewingUserURL( + user_id=self.user_id, + url_id=self.approval_info.url_id + ) + + session.add(approving_user_url) \ No newline at end of file diff --git a/src/api/endpoints/review/next/__init__.py b/src/api/endpoints/review/next/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/review/dtos/get.py b/src/api/endpoints/review/next/dto.py similarity index 92% rename from src/api/endpoints/review/dtos/get.py rename to src/api/endpoints/review/next/dto.py index 5fa969dc..7fc53b17 100644 --- a/src/api/endpoints/review/dtos/get.py +++ b/src/api/endpoints/review/next/dto.py @@ -2,13 +2,14 @@ from pydantic import BaseModel, Field -from src.api.endpoints.annotate.dtos.agency.response import GetNextURLForAgencyAgencyInfo +from src.api.endpoints.annotate.agency.get.dto import GetNextURLForAgencyAgencyInfo +from src.api.endpoints.annotate.relevance.get.dto import RelevanceAnnotationResponseInfo from src.core.enums import RecordType, SuggestedStatus from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo class FinalReviewAnnotationRelevantInfo(BaseModel): - auto: Optional[bool] = Field(title="Whether the auto-labeler has marked the URL as relevant") + auto: Optional[RelevanceAnnotationResponseInfo] = Field(title="Whether the auto-labeler has marked the URL as relevant") user: Optional[SuggestedStatus] = Field( title="The status marked by a user, if any", ) diff --git a/src/db/queries/implementations/core/final_review/get.py b/src/api/endpoints/review/next/query.py similarity index 96% rename from src/db/queries/implementations/core/final_review/get.py rename to src/api/endpoints/review/next/query.py index 2f181c0e..e1ca7ba5 100644 --- a/src/db/queries/implementations/core/final_review/get.py +++ b/src/api/endpoints/review/next/query.py @@ -1,14 +1,14 @@ from typing import Optional, Type -from sqlalchemy import select, func, Select, and_, desc, asc, FromClause +from sqlalchemy import FromClause, select, and_, Select, desc, asc, func from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import joinedload -from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewResponse, FinalReviewOptionalMetadata, \ - FinalReviewAnnotationInfo, FinalReviewBatchInfo, GetNextURLForFinalReviewOuterResponse +from src.api.endpoints.review.next.dto import FinalReviewOptionalMetadata, FinalReviewBatchInfo, \ + GetNextURLForFinalReviewOuterResponse, GetNextURLForFinalReviewResponse, FinalReviewAnnotationInfo from src.collectors.enums import URLStatus from src.core.tasks.url.operators.url_html.scraper.parser.util import convert_to_response_html_info -from src.db.constants import ALL_ANNOTATION_MODELS, USER_ANNOTATION_MODELS +from src.db.constants import USER_ANNOTATION_MODELS, ALL_ANNOTATION_MODELS from src.db.dto_converter import DTOConverter from src.db.dtos.url.html_content import URLHTMLContentInfo from src.db.exceptions import FailedQueryException @@ -23,6 +23,7 @@ TOTAL_DISTINCT_ANNOTATION_COUNT_LABEL = "total_distinct_annotation_count" + class GetNextURLForFinalReviewQueryBuilder(QueryBuilderBase): def __init__(self, batch_id: Optional[int] = None): @@ -276,11 +277,3 @@ async def build_url_query(self): url_query = await self._apply_order_clause(url_query) return url_query - - - - - - - - diff --git a/src/api/endpoints/review/reject/__init__.py b/src/api/endpoints/review/reject/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/review/dtos/reject.py b/src/api/endpoints/review/reject/dto.py similarity index 71% rename from src/api/endpoints/review/dtos/reject.py rename to src/api/endpoints/review/reject/dto.py index bc9f92c4..3667d865 100644 --- a/src/api/endpoints/review/dtos/reject.py +++ b/src/api/endpoints/review/reject/dto.py @@ -1,4 +1,4 @@ -from src.api.endpoints.review.dtos.base import FinalReviewBaseInfo +from src.api.endpoints.review.shared.dtos.base import FinalReviewBaseInfo from src.api.endpoints.review.enums import RejectionReason diff --git a/src/api/endpoints/review/reject/query.py b/src/api/endpoints/review/reject/query.py new file mode 100644 index 00000000..50bee0bc --- /dev/null +++ b/src/api/endpoints/review/reject/query.py @@ -0,0 +1,55 @@ + +from sqlalchemy import Select +from starlette.exceptions import HTTPException +from starlette.status import HTTP_400_BAD_REQUEST + +from src.api.endpoints.review.enums import RejectionReason +from src.collectors.enums import URLStatus +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.url.reviewing_user import ReviewingUserURL +from src.db.queries.base.builder import QueryBuilderBase + + +class RejectURLQueryBuilder(QueryBuilderBase): + + def __init__( + self, + url_id: int, + user_id: int, + rejection_reason: RejectionReason + ): + super().__init__() + self.url_id = url_id + self.user_id = user_id + self.rejection_reason = rejection_reason + + async def run(self, session) -> None: + + query = ( + Select(URL) + .where(URL.id == self.url_id) + ) + + url = await session.execute(query) + url = url.scalars().first() + + match self.rejection_reason: + case RejectionReason.INDIVIDUAL_RECORD: + url.outcome = URLStatus.INDIVIDUAL_RECORD.value + case RejectionReason.BROKEN_PAGE_404: + url.outcome = URLStatus.NOT_FOUND.value + case RejectionReason.NOT_RELEVANT: + url.outcome = URLStatus.NOT_RELEVANT.value + case _: + raise HTTPException( + status_code=HTTP_400_BAD_REQUEST, + detail="Invalid rejection reason" + ) + + # Add rejecting user + rejecting_user_url = ReviewingUserURL( + user_id=self.user_id, + url_id=self.url_id + ) + + session.add(rejecting_user_url) \ No newline at end of file diff --git a/src/api/endpoints/review/routes.py b/src/api/endpoints/review/routes.py index a142d71d..c2ceada9 100644 --- a/src/api/endpoints/review/routes.py +++ b/src/api/endpoints/review/routes.py @@ -1,15 +1,13 @@ -from typing import Optional - from fastapi import APIRouter, Depends, Query from src.api.dependencies import get_async_core -from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo -from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewOuterResponse -from src.api.endpoints.review.dtos.reject import FinalReviewRejectionInfo +from src.api.endpoints.review.approve.dto import FinalReviewApprovalInfo +from src.api.endpoints.review.next.dto import GetNextURLForFinalReviewOuterResponse +from src.api.endpoints.review.reject.dto import FinalReviewRejectionInfo from src.core.core import AsyncCore -from src.security.manager import require_permission from src.security.dtos.access_info import AccessInfo from src.security.enums import Permissions +from src.security.manager import require_permission review_router = APIRouter( prefix="/review", @@ -19,14 +17,17 @@ requires_final_review_permission = require_permission(Permissions.SOURCE_COLLECTOR_FINAL_REVIEW) +batch_id_query = Query( + description="The batch id of the next URL to get. " + "If not specified, defaults to first qualifying URL", + default=None +) + @review_router.get("/next-source") async def get_next_source( core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(requires_final_review_permission), - batch_id: Optional[int] = Query( - description="The batch id of the next URL to get. " - "If not specified, defaults to first qualifying URL", - default=None), + batch_id: int | None = batch_id_query, ) -> GetNextURLForFinalReviewOuterResponse: return await core.get_next_source_for_review(batch_id=batch_id) @@ -35,10 +36,7 @@ async def approve_source( core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(requires_final_review_permission), approval_info: FinalReviewApprovalInfo = FinalReviewApprovalInfo, - batch_id: Optional[int] = Query( - description="The batch id of the next URL to get. " - "If not specified, defaults to first qualifying URL", - default=None), + batch_id: int | None = batch_id_query, ) -> GetNextURLForFinalReviewOuterResponse: await core.approve_url( approval_info, @@ -51,10 +49,7 @@ async def reject_source( core: AsyncCore = Depends(get_async_core), access_info: AccessInfo = Depends(requires_final_review_permission), review_info: FinalReviewRejectionInfo = FinalReviewRejectionInfo, - batch_id: Optional[int] = Query( - description="The batch id of the next URL to get. " - "If not specified, defaults to first qualifying URL", - default=None), + batch_id: int | None = batch_id_query, ) -> GetNextURLForFinalReviewOuterResponse: await core.reject_url( url_id=review_info.url_id, diff --git a/src/api/endpoints/review/shared/__init__.py b/src/api/endpoints/review/shared/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/review/shared/dtos/__init__.py b/src/api/endpoints/review/shared/dtos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/review/dtos/base.py b/src/api/endpoints/review/shared/dtos/base.py similarity index 100% rename from src/api/endpoints/review/dtos/base.py rename to src/api/endpoints/review/shared/dtos/base.py diff --git a/src/core/core.py b/src/core/core.py index 13433921..e2709e01 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -5,12 +5,12 @@ from pydantic import BaseModel from sqlalchemy.exc import IntegrityError -from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo -from src.api.endpoints.annotate.dtos.agency.response import GetNextURLForAgencyAnnotationResponse -from src.api.endpoints.annotate.dtos.all.post import AllAnnotationPostInfo -from src.api.endpoints.annotate.dtos.all.response import GetNextURLForAllAnnotationResponse +from src.api.endpoints.annotate.agency.get.dto import GetNextURLForAgencyAnnotationResponse +from src.api.endpoints.annotate.agency.post.dto import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.all.get.dto import GetNextURLForAllAnnotationResponse +from src.api.endpoints.annotate.all.post.dto import AllAnnotationPostInfo from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseOuterInfo -from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseOuterInfo +from src.api.endpoints.annotate.relevance.get.dto import GetNextRelevanceAnnotationResponseOuterInfo from src.api.endpoints.batch.dtos.get.duplicates import GetDuplicatesByBatchResponse from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse from src.api.endpoints.batch.dtos.get.summaries.response import GetBatchSummariesResponse @@ -27,9 +27,9 @@ from src.api.endpoints.metrics.dtos.get.urls.aggregated.pending import GetMetricsURLsAggregatedPendingResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.pending import GetMetricsURLsBreakdownPendingResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.submitted import GetMetricsURLsBreakdownSubmittedResponseDTO -from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo -from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewOuterResponse +from src.api.endpoints.review.approve.dto import FinalReviewApprovalInfo from src.api.endpoints.review.enums import RejectionReason +from src.api.endpoints.review.next.dto import GetNextURLForFinalReviewOuterResponse from src.api.endpoints.search.dtos.response import SearchURLResponse from src.api.endpoints.task.dtos.get.task import TaskInfo from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse diff --git a/src/db/client/async_.py b/src/db/client/async_.py index d1a3aa09..cc47d221 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -4,7 +4,7 @@ from typing import Optional, Type, Any, List, Sequence from fastapi import HTTPException -from sqlalchemy import select, exists, func, case, Select, not_, and_, update, delete, literal, text, Row +from sqlalchemy import select, exists, func, case, Select, and_, update, delete, literal, text, Row from sqlalchemy.dialects import postgresql from sqlalchemy.dialects.postgresql import insert as pg_insert from sqlalchemy.exc import IntegrityError, NoResultFound @@ -13,14 +13,16 @@ from sqlalchemy.sql.functions import coalesce from starlette import status -from src.api.endpoints.annotate.dtos.agency.response import GetNextURLForAgencyAnnotationResponse, \ - GetNextURLForAgencyAnnotationInnerResponse, GetNextURLForAgencyAgencyInfo -from src.api.endpoints.annotate.dtos.all.post import AllAnnotationPostInfo -from src.api.endpoints.annotate.dtos.all.response import GetNextURLForAllAnnotationResponse, \ - GetNextURLForAllAnnotationInnerResponse +from src.api.endpoints.annotate._shared.queries.get_annotation_batch_info import GetAnnotationBatchInfoQueryBuilder +from src.api.endpoints.annotate._shared.queries.get_next_url_for_user_annotation import \ + GetNextURLForUserAnnotationQueryBuilder +from src.api.endpoints.annotate.agency.get.dto import GetNextURLForAgencyAnnotationResponse +from src.api.endpoints.annotate.agency.get.queries.next_for_annotation import GetNextURLAgencyForAnnotationQueryBuilder +from src.api.endpoints.annotate.all.get.dto import GetNextURLForAllAnnotationResponse +from src.api.endpoints.annotate.all.get.query import GetNextURLForAllAnnotationQueryBuilder +from src.api.endpoints.annotate.all.post.dto import AllAnnotationPostInfo from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseInfo -from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseInfo -from src.api.endpoints.annotate.dtos.shared.batch import AnnotationBatchInfo +from src.api.endpoints.annotate.relevance.get.dto import GetNextRelevanceAnnotationResponseInfo from src.api.endpoints.batch.dtos.get.summaries.response import GetBatchSummariesResponse from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO @@ -35,9 +37,11 @@ GetMetricsURLsBreakdownPendingResponseInnerDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.submitted import GetMetricsURLsBreakdownSubmittedResponseDTO, \ GetMetricsURLsBreakdownSubmittedInnerDTO -from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo -from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewOuterResponse +from src.api.endpoints.review.approve.dto import FinalReviewApprovalInfo +from src.api.endpoints.review.approve.query import ApproveURLQueryBuilder from src.api.endpoints.review.enums import RejectionReason +from src.api.endpoints.review.next.dto import GetNextURLForFinalReviewOuterResponse +from src.api.endpoints.review.reject.query import RejectURLQueryBuilder from src.api.endpoints.search.dtos.response import SearchURLResponse from src.api.endpoints.task.dtos.get.task import TaskInfo from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse, GetTasksResponseTaskInfo @@ -48,24 +52,25 @@ from src.core.tasks.scheduled.operators.agency_sync.dtos.parameters import AgencySyncParameters from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.tasks.url.operators.agency_identification.dtos.tdo import AgencyIdentificationTDO +from src.core.tasks.url.operators.auto_relevant.models.annotation import RelevanceAnnotationInfo from src.core.tasks.url.operators.auto_relevant.models.tdo import URLRelevantTDO from src.core.tasks.url.operators.auto_relevant.queries.get_tdos import GetAutoRelevantTDOsQueryBuilder from src.core.tasks.url.operators.submit_approved_url.tdo import SubmitApprovedURLTDO, SubmittedURLInfo from src.core.tasks.url.operators.url_404_probe.tdo import URL404ProbeTDO from src.core.tasks.url.operators.url_duplicate.tdo import URLDuplicateTDO -from src.core.tasks.url.operators.url_html.scraper.parser.util import convert_to_response_html_info from src.core.tasks.url.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo +from src.db.client.types import UserSuggestionModel from src.db.config_manager import ConfigManager from src.db.constants import PLACEHOLDER_AGENCY_NAME from src.db.dto_converter import DTOConverter from src.db.dtos.batch import BatchInfo from src.db.dtos.duplicate import DuplicateInsertInfo, DuplicateInfo -from src.db.dtos.url.annotations.auto.relevancy import AutoRelevancyAnnotationInput -from src.db.dtos.url.insert import InsertURLsInfo from src.db.dtos.log import LogInfo, LogOutputInfo +from src.db.dtos.url.annotations.auto.relevancy import AutoRelevancyAnnotationInput +from src.db.dtos.url.core import URLInfo from src.db.dtos.url.error import URLErrorPydanticInfo from src.db.dtos.url.html_content import URLHTMLContentInfo, HTMLContentType -from src.db.dtos.url.core import URLInfo +from src.db.dtos.url.insert import InsertURLsInfo from src.db.dtos.url.mapping import URLMapping from src.db.dtos.url.raw_html import RawHTMLInfo from src.db.enums import TaskType @@ -97,21 +102,16 @@ from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion from src.db.models.templates import Base from src.db.queries.base.builder import QueryBuilderBase -from src.db.queries.implementations.core.final_review.get import GetNextURLForFinalReviewQueryBuilder -from src.db.queries.implementations.core.get_recent_batch_summaries.builder import GetRecentBatchSummariesQueryBuilder +from src.api.endpoints.review.next.query import GetNextURLForFinalReviewQueryBuilder +from src.db.queries.implementations.core.get.html_content_info import GetHTMLContentInfoQueryBuilder +from src.db.queries.implementations.core.get.recent_batch_summaries.builder import GetRecentBatchSummariesQueryBuilder from src.db.queries.implementations.core.metrics.urls.aggregated.pending import \ GetMetricsURLSAggregatedPendingQueryBuilder from src.db.queries.implementations.core.tasks.agency_sync.upsert import get_upsert_agencies_mappings from src.db.statement_composer import StatementComposer -from src.db.types import UserSuggestionType from src.db.utils.compression import decompress_html, compress_html from src.external.pdap.dtos.agencies_sync import AgenciesSyncResponseInnerInfo -# Type Hints - -UserSuggestionModel = UserRelevantSuggestion or UserRecordTypeSuggestion or UserUrlAgencySuggestion -AutoSuggestionModel = AutoRelevantSuggestion or AutoRecordTypeSuggestion or AutomatedUrlAgencySuggestion - def add_standard_limit_and_offset(statement, page, limit=100): offset = (page - 1) * limit @@ -230,12 +230,11 @@ async def run_query_builder( return await builder.run(session) # region relevant - @session_manager async def add_auto_relevant_suggestion( self, input_: AutoRelevancyAnnotationInput ): - await self.add_user_relevant_suggestions([input_]) + await self.add_user_relevant_suggestions(inputs=[input_]) async def add_user_relevant_suggestions( self, @@ -268,50 +267,22 @@ async def get_user_suggestion( result = await session.execute(statement) return result.unique().scalar_one_or_none() - @staticmethod async def get_next_url_for_user_annotation( - session: AsyncSession, + self, user_suggestion_model_to_exclude: UserSuggestionModel, auto_suggestion_relationship: QueryableAttribute, batch_id: Optional[int], check_if_annotated_not_relevant: bool = False ) -> URL: - url_query = ( - select( - URL, - ) - .where(URL.outcome == URLStatus.PENDING.value) - # URL must not have user suggestion - .where( - StatementComposer.user_suggestion_not_exists(user_suggestion_model_to_exclude) + return await self.run_query_builder( + builder=GetNextURLForUserAnnotationQueryBuilder( + user_suggestion_model_to_exclude=user_suggestion_model_to_exclude, + auto_suggestion_relationship=auto_suggestion_relationship, + batch_id=batch_id, + check_if_annotated_not_relevant=check_if_annotated_not_relevant ) ) - if check_if_annotated_not_relevant: - url_query = url_query.where( - not_( - exists( - select(UserRelevantSuggestion) - .where( - UserRelevantSuggestion.url_id == URL.id, - UserRelevantSuggestion.suggested_status != SuggestedStatus.RELEVANT.value - ) - ) - ) - ) - - if batch_id is not None: - url_query = url_query.where(URL.batch_id == batch_id) - - url_query = url_query.options( - joinedload(auto_suggestion_relationship), - joinedload(URL.html_content) - ).limit(1) - - raw_result = await session.execute(url_query) - - return raw_result.unique().scalars().one_or_none() - async def get_tdos_for_auto_relevancy(self) -> list[URLRelevantTDO]: return await self.run_query_builder(builder=GetAutoRelevantTDOsQueryBuilder()) @@ -346,14 +317,13 @@ async def get_next_url_for_relevance_annotation( session: AsyncSession, user_id: int, batch_id: Optional[int] - ) -> Optional[GetNextRelevanceAnnotationResponseInfo]: + ) -> GetNextRelevanceAnnotationResponseInfo | None: - url = await self.get_next_url_for_user_annotation( - session, + url = await GetNextURLForUserAnnotationQueryBuilder( user_suggestion_model_to_exclude=UserRelevantSuggestion, auto_suggestion_relationship=URL.auto_relevant_suggestion, batch_id=batch_id - ) + ).run(session) if url is None: return None @@ -363,7 +333,7 @@ async def get_next_url_for_relevance_annotation( ) if url.auto_relevant_suggestion is not None: - suggestion = url.auto_relevant_suggestion.relevant + suggestion = url.auto_relevant_suggestion else: suggestion = None @@ -372,15 +342,18 @@ async def get_next_url_for_relevance_annotation( url=url.url, url_id=url.id ), - suggested_relevant=suggestion, + annotation=RelevanceAnnotationInfo( + is_relevant=suggestion.relevant, + confidence=suggestion.confidence, + model_name=suggestion.model_name + ) if suggestion is not None else None, html_info=html_response_info, - batch_info=await self.get_annotation_batch_info( - session, + batch_info=await GetAnnotationBatchInfoQueryBuilder( batch_id=batch_id, models=[ - UserRelevantSuggestion + UserUrlAgencySuggestion, ] - ) + ).run(session) ) # endregion relevant @@ -395,13 +368,12 @@ async def get_next_url_for_record_type_annotation( batch_id: Optional[int] ) -> Optional[GetNextRecordTypeAnnotationResponseInfo]: - url = await self.get_next_url_for_user_annotation( - session, + url = await GetNextURLForUserAnnotationQueryBuilder( user_suggestion_model_to_exclude=UserRecordTypeSuggestion, auto_suggestion_relationship=URL.auto_record_type_suggestion, batch_id=batch_id, check_if_annotated_not_relevant=True - ) + ).run(session) if url is None: return None @@ -422,13 +394,12 @@ async def get_next_url_for_record_type_annotation( ), suggested_record_type=suggestion, html_info=html_response_info, - batch_info=await self.get_annotation_batch_info( - session, + batch_info=await GetAnnotationBatchInfoQueryBuilder( batch_id=batch_id, models=[ - UserRecordTypeSuggestion, + UserUrlAgencySuggestion, ] - ) + ).run(session) ) @session_manager @@ -813,14 +784,8 @@ async def get_task_info(self, session: AsyncSession, task_id: int) -> TaskInfo: url_errors=errored_urls ) - @session_manager - async def get_html_content_info(self, session: AsyncSession, url_id: int) -> list[URLHTMLContentInfo]: - session_result = await session.execute( - select(URLHTMLContent) - .where(URLHTMLContent.url_id == url_id) - ) - results = session_result.scalars().all() - return [URLHTMLContentInfo(**result.__dict__) for result in results] + async def get_html_content_info(self, url_id: int) -> list[URLHTMLContentInfo]: + return await self.run_query_builder(GetHTMLContentInfoQueryBuilder(url_id)) @session_manager async def link_urls_to_task(self, session: AsyncSession, task_id: int, url_ids: list[int]): @@ -934,107 +899,16 @@ async def get_urls_without_agency_suggestions( for raw_result in raw_results ] - @session_manager async def get_next_url_agency_for_annotation( self, - session: AsyncSession, user_id: int, - batch_id: Optional[int] + batch_id: int | None ) -> GetNextURLForAgencyAnnotationResponse: - """ - Retrieve URL for annotation - The URL must - not be a confirmed URL - not have been annotated by this user - have extant autosuggestions - """ - # Select statement - statement = ( - select(URL.id, URL.url) - # Must not have confirmed agencies - .where( - URL.outcome == URLStatus.PENDING.value - ) - ) - - if batch_id is not None: - statement = statement.where(URL.batch_id == batch_id) - - # Must not have been annotated by a user - statement = ( - statement.join(UserUrlAgencySuggestion, isouter=True) - .where( - ~exists( - select(UserUrlAgencySuggestion). - where(UserUrlAgencySuggestion.url_id == URL.id). - correlate(URL) - ) - ) - # Must have extant autosuggestions - .join(AutomatedUrlAgencySuggestion, isouter=True) - .where( - exists( - select(AutomatedUrlAgencySuggestion). - where(AutomatedUrlAgencySuggestion.url_id == URL.id). - correlate(URL) - ) - ) - # Must not have confirmed agencies - .join(ConfirmedURLAgency, isouter=True) - .where( - ~exists( - select(ConfirmedURLAgency). - where(ConfirmedURLAgency.url_id == URL.id). - correlate(URL) - ) - ) - # Must not have been marked as "Not Relevant" by this user - .join(UserRelevantSuggestion, isouter=True) - .where( - ~exists( - select(UserRelevantSuggestion). - where( - (UserRelevantSuggestion.user_id == user_id) & - (UserRelevantSuggestion.url_id == URL.id) & - (UserRelevantSuggestion.suggested_status != SuggestedStatus.RELEVANT.value) - ).correlate(URL) - ) - ) - ).limit(1) - raw_result = await session.execute(statement) - results = raw_result.all() - if len(results) == 0: - return GetNextURLForAgencyAnnotationResponse( - next_annotation=None - ) - - result = results[0] - url_id = result[0] - url = result[1] - - agency_suggestions = await self.get_agency_suggestions(session, url_id=url_id) + return await self.run_query_builder(builder=GetNextURLAgencyForAnnotationQueryBuilder( + user_id=user_id, + batch_id=batch_id + )) - # Get HTML content info - html_content_infos = await self.get_html_content_info(url_id) - response_html_info = convert_to_response_html_info(html_content_infos) - - return GetNextURLForAgencyAnnotationResponse( - next_annotation=GetNextURLForAgencyAnnotationInnerResponse( - url_info=URLMapping( - url=url, - url_id=url_id - ), - html_info=response_html_info, - agency_suggestions=agency_suggestions, - batch_info=await self.get_annotation_batch_info( - session, - batch_id=batch_id, - models=[ - UserUrlAgencySuggestion, - ] - ) - ) - ) @session_manager async def upsert_new_agencies( @@ -1132,170 +1006,28 @@ async def get_next_url_for_final_review( result = await builder.run(session) return result - @session_manager async def approve_url( self, - session: AsyncSession, approval_info: FinalReviewApprovalInfo, user_id: int, ) -> None: - - # Get URL - def update_if_not_none( - model, - field, - value: Optional[Any], - required: bool = False - ): - if value is not None: - setattr(model, field, value) - return - if not required: - return - model_value = getattr(model, field, None) - if model_value is None: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail=f"Must specify {field} if it does not already exist" - ) - - query = ( - Select(URL) - .where(URL.id == approval_info.url_id) - .options( - joinedload(URL.optional_data_source_metadata), - joinedload(URL.confirmed_agencies), - ) - ) - - url = await session.execute(query) - url = url.scalars().first() - - update_if_not_none( - url, - "record_type", - approval_info.record_type.value if approval_info.record_type is not None else None, - required=True - ) - - # Get existing agency ids - existing_agencies = url.confirmed_agencies or [] - existing_agency_ids = [agency.agency_id for agency in existing_agencies] - new_agency_ids = approval_info.agency_ids or [] - if len(existing_agency_ids) == 0 and len(new_agency_ids) == 0: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="Must specify agency_id if URL does not already have a confirmed agency" - ) - - # Get any existing agency ids that are not in the new agency ids - # If new agency ids are specified, overwrite existing - if len(new_agency_ids) != 0: - for existing_agency in existing_agencies: - if existing_agency.id not in new_agency_ids: - # If the existing agency id is not in the new agency ids, delete it - await session.delete(existing_agency) - # Add any new agency ids that are not in the existing agency ids - for new_agency_id in new_agency_ids: - if new_agency_id not in existing_agency_ids: - # Check if the new agency exists in the database - query = ( - select(Agency) - .where(Agency.agency_id == new_agency_id) - ) - existing_agency = await session.execute(query) - existing_agency = existing_agency.scalars().first() - if existing_agency is None: - # If not, create it - agency = Agency( - agency_id=new_agency_id, - name=PLACEHOLDER_AGENCY_NAME, - ) - session.add(agency) - - # If the new agency id is not in the existing agency ids, add it - confirmed_url_agency = ConfirmedURLAgency( - url_id=approval_info.url_id, - agency_id=new_agency_id - ) - session.add(confirmed_url_agency) - - # If it does, do nothing - - url.outcome = URLStatus.VALIDATED.value - - update_if_not_none(url, "name", approval_info.name, required=True) - update_if_not_none(url, "description", approval_info.description, required=True) - - optional_metadata = url.optional_data_source_metadata - if optional_metadata is None: - url.optional_data_source_metadata = URLOptionalDataSourceMetadata( - record_formats=approval_info.record_formats, - data_portal_type=approval_info.data_portal_type, - supplying_entity=approval_info.supplying_entity - ) - else: - update_if_not_none( - optional_metadata, - "record_formats", - approval_info.record_formats - ) - update_if_not_none( - optional_metadata, - "data_portal_type", - approval_info.data_portal_type - ) - update_if_not_none( - optional_metadata, - "supplying_entity", - approval_info.supplying_entity - ) - - # Add approving user - approving_user_url = ReviewingUserURL( + await self.run_query_builder(ApproveURLQueryBuilder( user_id=user_id, - url_id=approval_info.url_id - ) - - session.add(approving_user_url) + approval_info=approval_info + )) - @session_manager async def reject_url( self, - session: AsyncSession, url_id: int, user_id: int, rejection_reason: RejectionReason ) -> None: - - query = ( - Select(URL) - .where(URL.id == url_id) - ) - - url = await session.execute(query) - url = url.scalars().first() - - match rejection_reason: - case RejectionReason.INDIVIDUAL_RECORD: - url.outcome = URLStatus.INDIVIDUAL_RECORD.value - case RejectionReason.BROKEN_PAGE_404: - url.outcome = URLStatus.NOT_FOUND.value - case RejectionReason.NOT_RELEVANT: - url.outcome = URLStatus.NOT_RELEVANT.value - case _: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="Invalid rejection reason" - ) - - # Add rejecting user - rejecting_user_url = ReviewingUserURL( + await self.run_query_builder(RejectURLQueryBuilder( + url_id=url_id, user_id=user_id, - url_id=url_id - ) + rejection_reason=rejection_reason + )) - session.add(rejecting_user_url) @session_manager async def get_batch_by_id(self, session, batch_id: int) -> Optional[BatchSummary]: @@ -1587,119 +1319,10 @@ async def delete_old_logs(self): ) await self.execute(statement) - async def get_agency_suggestions(self, session, url_id: int) -> List[GetNextURLForAgencyAgencyInfo]: - # Get relevant autosuggestions and agency info, if an associated agency exists - - statement = ( - select( - AutomatedUrlAgencySuggestion.agency_id, - AutomatedUrlAgencySuggestion.is_unknown, - Agency.name, - Agency.state, - Agency.county, - Agency.locality - ) - .join(Agency, isouter=True) - .where(AutomatedUrlAgencySuggestion.url_id == url_id) - ) - raw_autosuggestions = await session.execute(statement) - autosuggestions = raw_autosuggestions.all() - agency_suggestions = [] - for autosuggestion in autosuggestions: - agency_id = autosuggestion[0] - is_unknown = autosuggestion[1] - name = autosuggestion[2] - state = autosuggestion[3] - county = autosuggestion[4] - locality = autosuggestion[5] - agency_suggestions.append( - GetNextURLForAgencyAgencyInfo( - suggestion_type=SuggestionType.AUTO_SUGGESTION if not is_unknown else SuggestionType.UNKNOWN, - pdap_agency_id=agency_id, - agency_name=name, - state=state, - county=county, - locality=locality - ) - ) - return agency_suggestions - - @session_manager async def get_next_url_for_all_annotations( - self, session, batch_id: Optional[int] = None + self, batch_id: int | None = None ) -> GetNextURLForAllAnnotationResponse: - query = ( - Select(URL) - .where( - and_( - URL.outcome == URLStatus.PENDING.value, - StatementComposer.user_suggestion_not_exists(UserUrlAgencySuggestion), - StatementComposer.user_suggestion_not_exists(UserRecordTypeSuggestion), - StatementComposer.user_suggestion_not_exists(UserRelevantSuggestion), - ) - ) - ) - if batch_id is not None: - query = query.where(URL.batch_id == batch_id) - - load_options = [ - URL.html_content, - URL.automated_agency_suggestions, - URL.auto_relevant_suggestion, - URL.auto_record_type_suggestion - ] - select_in_loads = [selectinload(load_option) for load_option in load_options] - - # Add load options - query = query.options( - *select_in_loads - ) - - query = query.order_by(URL.id.asc()).limit(1) - raw_results = await session.execute(query) - url = raw_results.scalars().one_or_none() - if url is None: - return GetNextURLForAllAnnotationResponse( - next_annotation=None - ) - - html_response_info = DTOConverter.html_content_list_to_html_response_info( - url.html_content - ) - - if url.auto_relevant_suggestion is not None: - auto_relevant = url.auto_relevant_suggestion.relevant - else: - auto_relevant = None - - if url.auto_record_type_suggestion is not None: - auto_record_type = url.auto_record_type_suggestion.record_type - else: - auto_record_type = None - - agency_suggestions = await self.get_agency_suggestions(session, url_id=url.id) - - return GetNextURLForAllAnnotationResponse( - next_annotation=GetNextURLForAllAnnotationInnerResponse( - url_info=URLMapping( - url_id=url.id, - url=url.url - ), - html_info=html_response_info, - suggested_relevant=auto_relevant, - suggested_record_type=auto_record_type, - agency_suggestions=agency_suggestions, - batch_info=await self.get_annotation_batch_info( - session, - batch_id=batch_id, - models=[ - UserUrlAgencySuggestion, - UserRecordTypeSuggestion, - UserRelevantSuggestion - ] - ) - ) - ) + return await self.run_query_builder(GetNextURLForAllAnnotationQueryBuilder(batch_id)) @session_manager async def add_all_annotations_to_url( @@ -2331,60 +1954,6 @@ async def get_pending_urls_not_recently_probed_for_404(self, session: AsyncSessi urls = raw_result.scalars().all() return [URL404ProbeTDO(url=url.url, url_id=url.id) for url in urls] - @staticmethod - async def get_annotation_batch_info( - session: AsyncSession, - batch_id: Optional[int], - models: List[UserSuggestionType] - ) -> Optional[AnnotationBatchInfo]: - if batch_id is None: - return None - - sc = StatementComposer - include_queries = [ - sc.user_suggestion_exists(model) - for model in models - ] - - select_url = select(func.count(URL.id)) - - common_where_clause = [ - URL.outcome == URLStatus.PENDING.value, - URL.batch_id == batch_id, - ] - - annotated_query = ( - select_url - .where( - *common_where_clause, - *include_queries, - ) - ) - - exclude_queries = [ - sc.user_suggestion_not_exists(model) - for model in models - ] - - not_annotated_query = ( - select_url - .where( - *common_where_clause, - *exclude_queries, - ) - ) - - annotated_result_raw = await session.execute(annotated_query) - annotated_result = annotated_result_raw.scalars().one_or_none() - not_annotated_result_raw = await session.execute(not_annotated_query) - not_annotated_result = not_annotated_result_raw.scalars().one_or_none() - - return AnnotationBatchInfo( - count_annotated=annotated_result, - count_not_annotated=not_annotated_result, - total_urls=annotated_result + not_annotated_result - ) - @session_manager async def get_urls_aggregated_pending_metrics( self, diff --git a/src/db/client/types.py b/src/db/client/types.py new file mode 100644 index 00000000..5ee28c10 --- /dev/null +++ b/src/db/client/types.py @@ -0,0 +1,9 @@ +from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion +from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion +from src.db.models.instantiations.url.suggestion.record_type.auto import AutoRecordTypeSuggestion +from src.db.models.instantiations.url.suggestion.record_type.user import UserRecordTypeSuggestion +from src.db.models.instantiations.url.suggestion.relevant.auto import AutoRelevantSuggestion +from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion + +UserSuggestionModel = UserRelevantSuggestion or UserRecordTypeSuggestion or UserUrlAgencySuggestion +AutoSuggestionModel = AutoRelevantSuggestion or AutoRecordTypeSuggestion or AutomatedUrlAgencySuggestion diff --git a/src/db/dto_converter.py b/src/db/dto_converter.py index 8d90cc6b..c9b7dc0c 100644 --- a/src/db/dto_converter.py +++ b/src/db/dto_converter.py @@ -1,8 +1,9 @@ from typing import Optional -from src.api.endpoints.annotate.dtos.agency.response import GetNextURLForAgencyAgencyInfo -from src.api.endpoints.review.dtos.get import FinalReviewAnnotationRelevantInfo, FinalReviewAnnotationAgencyAutoInfo, \ - FinalReviewAnnotationRecordTypeInfo, FinalReviewAnnotationAgencyInfo +from src.api.endpoints.annotate.agency.get.dto import GetNextURLForAgencyAgencyInfo +from src.api.endpoints.annotate.relevance.get.dto import RelevanceAnnotationResponseInfo +from src.api.endpoints.review.next.dto import FinalReviewAnnotationRelevantInfo, FinalReviewAnnotationRecordTypeInfo, \ + FinalReviewAnnotationAgencyAutoInfo, FinalReviewAnnotationAgencyInfo from src.core.enums import RecordType, SuggestionType from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo from src.core.tasks.url.operators.url_html.scraper.parser.mapping import ENUM_TO_ATTRIBUTE_MAPPING @@ -32,7 +33,12 @@ def final_review_annotation_relevant_info( auto_suggestion: AutoRelevantSuggestion ) -> FinalReviewAnnotationRelevantInfo: - auto_value = auto_suggestion.relevant if auto_suggestion else None + auto_value = RelevanceAnnotationResponseInfo( + is_relevant=auto_suggestion.relevant, + confidence=auto_suggestion.confidence, + model_name=auto_suggestion.model_name + + ) if auto_suggestion else None user_value = user_suggestion.suggested_status if user_suggestion else None return FinalReviewAnnotationRelevantInfo( auto=auto_value, diff --git a/src/db/queries/implementations/core/get/__init__.py b/src/db/queries/implementations/core/get/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/queries/implementations/core/get/html_content_info.py b/src/db/queries/implementations/core/get/html_content_info.py new file mode 100644 index 00000000..fb26a527 --- /dev/null +++ b/src/db/queries/implementations/core/get/html_content_info.py @@ -0,0 +1,22 @@ +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from src.db.dtos.url.html_content import URLHTMLContentInfo +from src.db.models.instantiations.url.html_content import URLHTMLContent +from src.db.queries.base.builder import QueryBuilderBase + + +class GetHTMLContentInfoQueryBuilder(QueryBuilderBase): + + def __init__(self, url_id: int): + super().__init__() + self.url_id = url_id + + async def run(self, session: AsyncSession) -> list[URLHTMLContentInfo]: + session_result = await session.execute( + select(URLHTMLContent) + .where(URLHTMLContent.url_id == self.url_id) + ) + results = session_result.scalars().all() + return [URLHTMLContentInfo(**result.__dict__) for result in results] + diff --git a/src/db/queries/implementations/core/get/recent_batch_summaries/__init__.py b/src/db/queries/implementations/core/get/recent_batch_summaries/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/queries/implementations/core/get_recent_batch_summaries/builder.py b/src/db/queries/implementations/core/get/recent_batch_summaries/builder.py similarity index 95% rename from src/db/queries/implementations/core/get_recent_batch_summaries/builder.py rename to src/db/queries/implementations/core/get/recent_batch_summaries/builder.py index 3a74e5b0..8ac1b4af 100644 --- a/src/db/queries/implementations/core/get_recent_batch_summaries/builder.py +++ b/src/db/queries/implementations/core/get/recent_batch_summaries/builder.py @@ -9,8 +9,8 @@ from src.core.enums import BatchStatus from src.db.models.instantiations.batch import Batch from src.db.queries.base.builder import QueryBuilderBase -from src.db.queries.implementations.core.get_recent_batch_summaries.url_counts.builder import URLCountsCTEQueryBuilder -from src.db.queries.implementations.core.get_recent_batch_summaries.url_counts.labels import URLCountsLabels +from src.db.queries.implementations.core.get.recent_batch_summaries.url_counts.builder import URLCountsCTEQueryBuilder +from src.db.queries.implementations.core.get.recent_batch_summaries.url_counts.labels import URLCountsLabels class GetRecentBatchSummariesQueryBuilder(QueryBuilderBase): diff --git a/src/db/queries/implementations/core/get/recent_batch_summaries/url_counts/__init__.py b/src/db/queries/implementations/core/get/recent_batch_summaries/url_counts/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/builder.py b/src/db/queries/implementations/core/get/recent_batch_summaries/url_counts/builder.py similarity index 98% rename from src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/builder.py rename to src/db/queries/implementations/core/get/recent_batch_summaries/url_counts/builder.py index a34d8ff2..564c68f6 100644 --- a/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/builder.py +++ b/src/db/queries/implementations/core/get/recent_batch_summaries/url_counts/builder.py @@ -9,7 +9,7 @@ from src.db.models.instantiations.batch import Batch from src.db.queries.base.builder import QueryBuilderBase from src.db.queries.helpers import add_page_offset -from src.db.queries.implementations.core.get_recent_batch_summaries.url_counts.labels import URLCountsLabels +from src.db.queries.implementations.core.get.recent_batch_summaries.url_counts.labels import URLCountsLabels class URLCountsCTEQueryBuilder(QueryBuilderBase): diff --git a/src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/labels.py b/src/db/queries/implementations/core/get/recent_batch_summaries/url_counts/labels.py similarity index 100% rename from src/db/queries/implementations/core/get_recent_batch_summaries/url_counts/labels.py rename to src/db/queries/implementations/core/get/recent_batch_summaries/url_counts/labels.py diff --git a/tests/automated/integration/api/_helpers/RequestValidator.py b/tests/automated/integration/api/_helpers/RequestValidator.py index 36cda8ce..e3b43f39 100644 --- a/tests/automated/integration/api/_helpers/RequestValidator.py +++ b/tests/automated/integration/api/_helpers/RequestValidator.py @@ -5,14 +5,14 @@ from pydantic import BaseModel from starlette.testclient import TestClient -from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo -from src.api.endpoints.annotate.dtos.agency.response import GetNextURLForAgencyAnnotationResponse -from src.api.endpoints.annotate.dtos.all.post import AllAnnotationPostInfo -from src.api.endpoints.annotate.dtos.all.response import GetNextURLForAllAnnotationResponse +from src.api.endpoints.annotate.agency.get.dto import GetNextURLForAgencyAnnotationResponse +from src.api.endpoints.annotate.agency.post.dto import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.all.get.dto import GetNextURLForAllAnnotationResponse +from src.api.endpoints.annotate.all.post.dto import AllAnnotationPostInfo from src.api.endpoints.annotate.dtos.record_type.post import RecordTypeAnnotationPostInfo from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseOuterInfo -from src.api.endpoints.annotate.dtos.relevance.post import RelevanceAnnotationPostInfo -from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseOuterInfo +from src.api.endpoints.annotate.relevance.get.dto import GetNextRelevanceAnnotationResponseOuterInfo +from src.api.endpoints.annotate.relevance.post.dto import RelevanceAnnotationPostInfo from src.api.endpoints.batch.dtos.get.duplicates import GetDuplicatesByBatchResponse from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse from src.api.endpoints.batch.dtos.get.summaries.response import GetBatchSummariesResponse @@ -28,9 +28,9 @@ from src.api.endpoints.metrics.dtos.get.urls.aggregated.pending import GetMetricsURLsAggregatedPendingResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.pending import GetMetricsURLsBreakdownPendingResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.submitted import GetMetricsURLsBreakdownSubmittedResponseDTO -from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo -from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewOuterResponse -from src.api.endpoints.review.dtos.reject import FinalReviewRejectionInfo +from src.api.endpoints.review.approve.dto import FinalReviewApprovalInfo +from src.api.endpoints.review.next.dto import GetNextURLForFinalReviewOuterResponse +from src.api.endpoints.review.reject.dto import FinalReviewRejectionInfo from src.api.endpoints.search.dtos.response import SearchURLResponse from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse from src.api.endpoints.url.dtos.response import GetURLsResponseInfo diff --git a/tests/automated/integration/api/metrics/urls/aggregated/test_pending.py b/tests/automated/integration/api/metrics/urls/aggregated/test_pending.py index 6ccd85da..1b55f04d 100644 --- a/tests/automated/integration/api/metrics/urls/aggregated/test_pending.py +++ b/tests/automated/integration/api/metrics/urls/aggregated/test_pending.py @@ -1,6 +1,6 @@ import pytest -from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.agency.post.dto import URLAgencyAnnotationPostInfo from src.core.enums import SuggestedStatus, RecordType from tests.helpers.batch_creation_parameters.annotation_info import AnnotationInfo from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters diff --git a/tests/automated/integration/api/metrics/urls/breakdown/test_pending.py b/tests/automated/integration/api/metrics/urls/breakdown/test_pending.py index a401c6fd..e81d6ec7 100644 --- a/tests/automated/integration/api/metrics/urls/breakdown/test_pending.py +++ b/tests/automated/integration/api/metrics/urls/breakdown/test_pending.py @@ -1,7 +1,7 @@ import pendulum import pytest -from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.agency.post.dto import URLAgencyAnnotationPostInfo from src.collectors.enums import CollectorType, URLStatus from src.core.enums import SuggestedStatus, RecordType from tests.helpers.batch_creation_parameters.annotation_info import AnnotationInfo diff --git a/tests/automated/integration/api/review/conftest.py b/tests/automated/integration/api/review/conftest.py index cb1b8d04..e4345821 100644 --- a/tests/automated/integration/api/review/conftest.py +++ b/tests/automated/integration/api/review/conftest.py @@ -1,6 +1,6 @@ import pytest_asyncio -from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.agency.post.dto import URLAgencyAnnotationPostInfo from src.collectors.enums import URLStatus from src.core.enums import SuggestedStatus, RecordType from tests.helpers.batch_creation_parameters.annotation_info import AnnotationInfo diff --git a/tests/automated/integration/api/review/rejection/helpers.py b/tests/automated/integration/api/review/rejection/helpers.py index c6c3ff66..2a0a248b 100644 --- a/tests/automated/integration/api/review/rejection/helpers.py +++ b/tests/automated/integration/api/review/rejection/helpers.py @@ -1,6 +1,6 @@ -from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewOuterResponse -from src.api.endpoints.review.dtos.reject import FinalReviewRejectionInfo from src.api.endpoints.review.enums import RejectionReason +from src.api.endpoints.review.next.dto import GetNextURLForFinalReviewOuterResponse +from src.api.endpoints.review.reject.dto import FinalReviewRejectionInfo from src.collectors.enums import URLStatus from src.db.models.instantiations.url.core import URL from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review diff --git a/tests/automated/integration/api/review/test_approve_and_get_next_source.py b/tests/automated/integration/api/review/test_approve_and_get_next_source.py index e1c40eff..89279e38 100644 --- a/tests/automated/integration/api/review/test_approve_and_get_next_source.py +++ b/tests/automated/integration/api/review/test_approve_and_get_next_source.py @@ -1,7 +1,7 @@ import pytest -from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo -from src.api.endpoints.review.dtos.get import GetNextURLForFinalReviewOuterResponse +from src.api.endpoints.review.approve.dto import FinalReviewApprovalInfo +from src.api.endpoints.review.next.dto import GetNextURLForFinalReviewOuterResponse from src.collectors.enums import URLStatus from src.core.enums import RecordType from src.db.constants import PLACEHOLDER_AGENCY_NAME diff --git a/tests/automated/integration/api/review/test_next_source.py b/tests/automated/integration/api/review/test_next_source.py index c747d486..19910e38 100644 --- a/tests/automated/integration/api/review/test_next_source.py +++ b/tests/automated/integration/api/review/test_next_source.py @@ -41,7 +41,7 @@ async def test_review_next_source(api_test_helper): annotation_info = result.annotations relevant_info = annotation_info.relevant - assert relevant_info.auto == True + assert relevant_info.auto.is_relevant == True assert relevant_info.user == SuggestedStatus.NOT_RELEVANT record_type_info = annotation_info.record_type diff --git a/tests/automated/integration/api/test_annotate.py b/tests/automated/integration/api/test_annotate.py index ebaec4e8..a81ed27a 100644 --- a/tests/automated/integration/api/test_annotate.py +++ b/tests/automated/integration/api/test_annotate.py @@ -3,12 +3,12 @@ import pytest from fastapi import HTTPException -from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo -from src.api.endpoints.annotate.dtos.all.post import AllAnnotationPostInfo +from src.api.endpoints.annotate.agency.post.dto import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.all.post.dto import AllAnnotationPostInfo from src.api.endpoints.annotate.dtos.record_type.post import RecordTypeAnnotationPostInfo from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseOuterInfo -from src.api.endpoints.annotate.dtos.relevance.post import RelevanceAnnotationPostInfo -from src.api.endpoints.annotate.dtos.relevance.response import GetNextRelevanceAnnotationResponseOuterInfo +from src.api.endpoints.annotate.relevance.get.dto import GetNextRelevanceAnnotationResponseOuterInfo +from src.api.endpoints.annotate.relevance.post.dto import RelevanceAnnotationPostInfo from src.core.tasks.url.operators.url_html.scraper.parser.dtos.response_html import ResponseHTMLInfo from src.db.dtos.url.insert import InsertURLsInfo from src.db.dtos.url.mapping import URLMapping @@ -74,7 +74,7 @@ async def test_annotate_relevancy(api_test_helper): check_html_info_not_empty(inner_info_1.html_info) # Validate that the correct relevant value is returned - assert inner_info_1.suggested_relevant is True + assert inner_info_1.annotation.is_relevant is True # A second user should see the same URL diff --git a/tests/automated/integration/db/client/approve_url/test_basic.py b/tests/automated/integration/db/client/approve_url/test_basic.py index 74c68e38..426719d7 100644 --- a/tests/automated/integration/db/client/approve_url/test_basic.py +++ b/tests/automated/integration/db/client/approve_url/test_basic.py @@ -1,6 +1,6 @@ import pytest -from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo +from src.api.endpoints.review.approve.dto import FinalReviewApprovalInfo from src.collectors.enums import URLStatus from src.core.enums import RecordType from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency diff --git a/tests/automated/integration/db/client/approve_url/test_error.py b/tests/automated/integration/db/client/approve_url/test_error.py index b38f883d..9b93da9e 100644 --- a/tests/automated/integration/db/client/approve_url/test_error.py +++ b/tests/automated/integration/db/client/approve_url/test_error.py @@ -1,7 +1,7 @@ import pytest -from fastapi import HTTPException +from starlette.exceptions import HTTPException -from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo +from src.api.endpoints.review.approve.dto import FinalReviewApprovalInfo from src.core.enums import RecordType from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_basic.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_basic.py index 1bba4e7f..a96b6ca4 100644 --- a/tests/automated/integration/db/client/get_next_url_for_final_review/test_basic.py +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_basic.py @@ -37,7 +37,7 @@ async def test_get_next_url_for_final_review_basic(db_data_creator: DBDataCreato annotation_info = result.annotations relevant_info = annotation_info.relevant - assert relevant_info.auto == True + assert relevant_info.auto.is_relevant == True assert relevant_info.user == SuggestedStatus.NOT_RELEVANT record_type_info = annotation_info.record_type diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_new_agency.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_new_agency.py index 7f91c93a..4b04d4d1 100644 --- a/tests/automated/integration/db/client/get_next_url_for_final_review/test_new_agency.py +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_new_agency.py @@ -1,6 +1,6 @@ import pytest -from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.agency.post.dto import URLAgencyAnnotationPostInfo from src.core.enums import SuggestedStatus, RecordType, SuggestionType from tests.helpers.batch_creation_parameters.annotation_info import AnnotationInfo from tests.helpers.batch_creation_parameters.core import TestBatchCreationParameters diff --git a/tests/automated/integration/tasks/url/test_submit_approved_url_task.py b/tests/automated/integration/tasks/url/test_submit_approved_url_task.py index db4069d3..0bdc3718 100644 --- a/tests/automated/integration/tasks/url/test_submit_approved_url_task.py +++ b/tests/automated/integration/tasks/url/test_submit_approved_url_task.py @@ -4,7 +4,7 @@ import pytest from deepdiff import DeepDiff -from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo +from src.api.endpoints.review.approve.dto import FinalReviewApprovalInfo from src.core.tasks.url.operators.submit_approved_url.core import SubmitApprovedURLTaskOperator from src.db.enums import TaskType from src.db.models.instantiations.url.error_info import URLErrorInfo diff --git a/tests/automated/unit/dto/test_all_annotation_post_info.py b/tests/automated/unit/dto/test_all_annotation_post_info.py index 07ffafaa..cd0c5f56 100644 --- a/tests/automated/unit/dto/test_all_annotation_post_info.py +++ b/tests/automated/unit/dto/test_all_annotation_post_info.py @@ -1,6 +1,6 @@ import pytest -from src.api.endpoints.annotate.dtos.all.post import AllAnnotationPostInfo +from src.api.endpoints.annotate.all.post.post import AllAnnotationPostInfo from src.core.enums import RecordType, SuggestedStatus from src.core.exceptions import FailedValidationException diff --git a/tests/helpers/batch_creation_parameters/annotation_info.py b/tests/helpers/batch_creation_parameters/annotation_info.py index 034bd2c9..f9c9ef2d 100644 --- a/tests/helpers/batch_creation_parameters/annotation_info.py +++ b/tests/helpers/batch_creation_parameters/annotation_info.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.agency.post.dto import URLAgencyAnnotationPostInfo from src.core.enums import SuggestedStatus, RecordType diff --git a/tests/helpers/batch_creation_parameters/url_creation_parameters.py b/tests/helpers/batch_creation_parameters/url_creation_parameters.py index 3998caf2..2e30cca0 100644 --- a/tests/helpers/batch_creation_parameters/url_creation_parameters.py +++ b/tests/helpers/batch_creation_parameters/url_creation_parameters.py @@ -1,6 +1,6 @@ from pydantic import BaseModel, model_validator -from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.agency.post.dto import URLAgencyAnnotationPostInfo from src.collectors.enums import URLStatus from src.core.enums import RecordType from tests.helpers.batch_creation_parameters.annotation_info import AnnotationInfo diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/complex_test_data_functions.py index 600ccfd7..fd723ccc 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/complex_test_data_functions.py @@ -2,7 +2,7 @@ from pydantic import BaseModel -from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo +from src.api.endpoints.annotate.agency.post.dto import URLAgencyAnnotationPostInfo from src.db.dtos.url.insert import InsertURLsInfo from src.db.dtos.url.mapping import URLMapping from src.collectors.enums import URLStatus diff --git a/tests/helpers/db_data_creator.py b/tests/helpers/db_data_creator.py index 85995671..1a1d0a70 100644 --- a/tests/helpers/db_data_creator.py +++ b/tests/helpers/db_data_creator.py @@ -4,8 +4,8 @@ from pydantic import BaseModel -from src.api.endpoints.annotate.dtos.agency.post import URLAgencyAnnotationPostInfo -from src.api.endpoints.review.dtos.approve import FinalReviewApprovalInfo +from src.api.endpoints.annotate.agency.post.dto import URLAgencyAnnotationPostInfo +from src.api.endpoints.review.approve.dto import FinalReviewApprovalInfo from src.api.endpoints.review.enums import RejectionReason from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.db.client.async_ import AsyncDatabaseClient diff --git a/tests/manual/external/pdap/test_sync_agencies.py b/tests/manual/external/pdap/test_sync_agencies.py index 107007d4..6d070977 100644 --- a/tests/manual/external/pdap/test_sync_agencies.py +++ b/tests/manual/external/pdap/test_sync_agencies.py @@ -1,7 +1,7 @@ import pytest import time -from src.core.tasks.scheduled.operators.agency_sync.dtos import AgencySyncParameters +from src.core.tasks.scheduled.operators.agency_sync.dtos.parameters import AgencySyncParameters @pytest.mark.asyncio diff --git a/tests/manual/source_collectors/test_ckan_collector.py b/tests/manual/source_collectors/test_ckan_collector.py index 19358f56..bfe065dc 100644 --- a/tests/manual/source_collectors/test_ckan_collector.py +++ b/tests/manual/source_collectors/test_ckan_collector.py @@ -3,10 +3,10 @@ import pytest from marshmallow import Schema, fields +from src.collectors.source_collectors.ckan.collector import CKANCollector from src.core.logger import AsyncCoreLogger from src.collectors.source_collectors.ckan import collector from src.collectors.source_collectors.ckan.dtos.input import CKANInputDTO -from src.collectors.source_collectors.ckan import package_search, group_search, organization_search class CKANSchema(Schema): From c43c7a3aa410aaf2e4a78a19752f3f483a56cf99 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 16 Jul 2025 18:11:57 -0400 Subject: [PATCH 238/244] Fix broken import --- tests/automated/unit/dto/test_all_annotation_post_info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/automated/unit/dto/test_all_annotation_post_info.py b/tests/automated/unit/dto/test_all_annotation_post_info.py index cd0c5f56..0778c089 100644 --- a/tests/automated/unit/dto/test_all_annotation_post_info.py +++ b/tests/automated/unit/dto/test_all_annotation_post_info.py @@ -1,6 +1,6 @@ import pytest -from src.api.endpoints.annotate.all.post.post import AllAnnotationPostInfo +from src.api.endpoints.annotate.all.post.dto import AllAnnotationPostInfo from src.core.enums import RecordType, SuggestedStatus from src.core.exceptions import FailedValidationException From 2dd4c070cee263a324c2228fae45a0014c2533a6 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 16 Jul 2025 18:34:05 -0400 Subject: [PATCH 239/244] Fix broken logic - Inconsistency between prereq check and dto for relevancy task - Incorrect DTO used for relevancy annotation get endpoint --- src/api/endpoints/annotate/relevance/get/dto.py | 2 +- src/api/endpoints/annotate/relevance/get/query.py | 5 +++-- .../tasks/url/operators/auto_relevant/queries/get_tdos.py | 8 ++------ src/db/client/async_.py | 2 +- tests/automated/integration/tasks/asserts.py | 4 ++++ .../integration/tasks/url/auto_relevant/test_task.py | 4 +++- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/api/endpoints/annotate/relevance/get/dto.py b/src/api/endpoints/annotate/relevance/get/dto.py index 5d494555..b4467365 100644 --- a/src/api/endpoints/annotate/relevance/get/dto.py +++ b/src/api/endpoints/annotate/relevance/get/dto.py @@ -17,7 +17,7 @@ class RelevanceAnnotationResponseInfo(BaseModel): ) class GetNextRelevanceAnnotationResponseInfo(AnnotationInnerResponseInfoBase): - annotation: RelevanceAnnotationInfo | None = Field( + annotation: RelevanceAnnotationResponseInfo | None = Field( title="The auto-labeler's annotation for relevance" ) diff --git a/src/api/endpoints/annotate/relevance/get/query.py b/src/api/endpoints/annotate/relevance/get/query.py index d8cf72e0..5098f2b0 100644 --- a/src/api/endpoints/annotate/relevance/get/query.py +++ b/src/api/endpoints/annotate/relevance/get/query.py @@ -3,7 +3,8 @@ from src.api.endpoints.annotate._shared.queries.get_annotation_batch_info import GetAnnotationBatchInfoQueryBuilder from src.api.endpoints.annotate._shared.queries.get_next_url_for_user_annotation import \ GetNextURLForUserAnnotationQueryBuilder -from src.api.endpoints.annotate.relevance.get.dto import GetNextRelevanceAnnotationResponseInfo +from src.api.endpoints.annotate.relevance.get.dto import GetNextRelevanceAnnotationResponseInfo, \ + RelevanceAnnotationResponseInfo from src.core.tasks.url.operators.auto_relevant.models.annotation import RelevanceAnnotationInfo from src.db.dto_converter import DTOConverter from src.db.dtos.url.mapping import URLMapping @@ -49,7 +50,7 @@ async def run( url=url.url, url_id=url.id ), - annotation=RelevanceAnnotationInfo( + annotation=RelevanceAnnotationResponseInfo( is_relevant=suggestion.is_relevant, confidence=suggestion.confidence, model_name=suggestion.model_name diff --git a/src/core/tasks/url/operators/auto_relevant/queries/get_tdos.py b/src/core/tasks/url/operators/auto_relevant/queries/get_tdos.py index 79acd077..b444b5b3 100644 --- a/src/core/tasks/url/operators/auto_relevant/queries/get_tdos.py +++ b/src/core/tasks/url/operators/auto_relevant/queries/get_tdos.py @@ -1,4 +1,4 @@ -from typing import Any, Sequence +from typing import Sequence from sqlalchemy import select, Row from sqlalchemy.ext.asyncio import AsyncSession @@ -27,13 +27,9 @@ async def run(self, session: AsyncSession) -> list[URLRelevantTDO]: .options( selectinload(URL.compressed_html) ) - .outerjoin( - URLCompressedHTML, - URL.id == URLCompressedHTML.url_id - ) + .join(URLCompressedHTML) .where( URL.outcome == URLStatus.PENDING.value, - URLCompressedHTML.compressed_html.is_not(None) ) ) query = StatementComposer.exclude_urls_with_extant_model( diff --git a/src/db/client/async_.py b/src/db/client/async_.py index cc47d221..d09f13a5 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -609,7 +609,7 @@ async def has_urls_with_html_data_and_without_models( model: Type[Base] ) -> bool: statement = (select(URL) - .join(URLHTMLContent) + .join(URLCompressedHTML) .where(URL.outcome == URLStatus.PENDING.value)) # Exclude URLs with auto suggested record types statement = self.statement_composer.exclude_urls_with_extant_model( diff --git a/tests/automated/integration/tasks/asserts.py b/tests/automated/integration/tasks/asserts.py index 17f7cba5..6e4e0d7e 100644 --- a/tests/automated/integration/tasks/asserts.py +++ b/tests/automated/integration/tasks/asserts.py @@ -5,6 +5,10 @@ async def assert_prereqs_not_met(operator): meets_prereqs = await operator.meets_task_prerequisites() assert not meets_prereqs +async def assert_prereqs_met(operator): + meets_prereqs = await operator.meets_task_prerequisites() + assert meets_prereqs + def assert_task_has_expected_run_info(run_info, url_ids: list[int]): assert run_info.outcome == TaskOperatorOutcome.SUCCESS diff --git a/tests/automated/integration/tasks/url/auto_relevant/test_task.py b/tests/automated/integration/tasks/url/auto_relevant/test_task.py index 0c39cb9a..287b5f13 100644 --- a/tests/automated/integration/tasks/url/auto_relevant/test_task.py +++ b/tests/automated/integration/tasks/url/auto_relevant/test_task.py @@ -4,7 +4,8 @@ from src.db.models.instantiations.url.core import URL from src.db.models.instantiations.url.error_info import URLErrorInfo from src.db.models.instantiations.url.suggestion.relevant.auto import AutoRelevantSuggestion -from tests.automated.integration.tasks.asserts import assert_prereqs_not_met, assert_task_has_expected_run_info +from tests.automated.integration.tasks.asserts import assert_prereqs_not_met, assert_task_has_expected_run_info, \ + assert_prereqs_met from tests.automated.integration.tasks.url.auto_relevant.setup import setup_operator, setup_urls @@ -15,6 +16,7 @@ async def test_url_auto_relevant_task(db_data_creator): await assert_prereqs_not_met(operator) url_ids = await setup_urls(db_data_creator) + await assert_prereqs_met(operator) task_id = await db_data_creator.adb_client.initiate_task(task_type=TaskType.RELEVANCY) From c137dbdd3c094ace52290c8b37505ac4d7d97d51 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Wed, 16 Jul 2025 18:42:22 -0400 Subject: [PATCH 240/244] Fix broken logic - Inconsistency between prereq check and dto for relevancy task - Incorrect DTO used for relevancy annotation get endpoint --- .../endpoints/annotate/relevance/get/query.py | 6 +-- src/db/client/async_.py | 48 +++---------------- 2 files changed, 9 insertions(+), 45 deletions(-) diff --git a/src/api/endpoints/annotate/relevance/get/query.py b/src/api/endpoints/annotate/relevance/get/query.py index 5098f2b0..ffd37d2c 100644 --- a/src/api/endpoints/annotate/relevance/get/query.py +++ b/src/api/endpoints/annotate/relevance/get/query.py @@ -41,7 +41,7 @@ async def run( ) if url.auto_relevant_suggestion is not None: - suggestion = url.auto_relevant_suggestion.relevant + suggestion = url.auto_relevant_suggestion else: suggestion = None @@ -51,10 +51,10 @@ async def run( url_id=url.id ), annotation=RelevanceAnnotationResponseInfo( - is_relevant=suggestion.is_relevant, + is_relevant=suggestion.relevant, confidence=suggestion.confidence, model_name=suggestion.model_name - ), + ) if suggestion else None, html_info=html_response_info, batch_info=await GetAnnotationBatchInfoQueryBuilder( batch_id=self.batch_id, diff --git a/src/db/client/async_.py b/src/db/client/async_.py index d09f13a5..00af074d 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -22,7 +22,9 @@ from src.api.endpoints.annotate.all.get.query import GetNextURLForAllAnnotationQueryBuilder from src.api.endpoints.annotate.all.post.dto import AllAnnotationPostInfo from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseInfo -from src.api.endpoints.annotate.relevance.get.dto import GetNextRelevanceAnnotationResponseInfo +from src.api.endpoints.annotate.relevance.get.dto import GetNextRelevanceAnnotationResponseInfo, \ + RelevanceAnnotationResponseInfo +from src.api.endpoints.annotate.relevance.get.query import GetNextUrlForRelevanceAnnotationQueryBuilder from src.api.endpoints.batch.dtos.get.summaries.response import GetBatchSummariesResponse from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO @@ -311,50 +313,12 @@ async def add_user_relevant_suggestion( ) session.add(suggestion) - @session_manager async def get_next_url_for_relevance_annotation( self, - session: AsyncSession, - user_id: int, - batch_id: Optional[int] + batch_id: int | None, + user_id: int | None = None, ) -> GetNextRelevanceAnnotationResponseInfo | None: - - url = await GetNextURLForUserAnnotationQueryBuilder( - user_suggestion_model_to_exclude=UserRelevantSuggestion, - auto_suggestion_relationship=URL.auto_relevant_suggestion, - batch_id=batch_id - ).run(session) - if url is None: - return None - - # Next, get all HTML content for the URL - html_response_info = DTOConverter.html_content_list_to_html_response_info( - url.html_content - ) - - if url.auto_relevant_suggestion is not None: - suggestion = url.auto_relevant_suggestion - else: - suggestion = None - - return GetNextRelevanceAnnotationResponseInfo( - url_info=URLMapping( - url=url.url, - url_id=url.id - ), - annotation=RelevanceAnnotationInfo( - is_relevant=suggestion.relevant, - confidence=suggestion.confidence, - model_name=suggestion.model_name - ) if suggestion is not None else None, - html_info=html_response_info, - batch_info=await GetAnnotationBatchInfoQueryBuilder( - batch_id=batch_id, - models=[ - UserUrlAgencySuggestion, - ] - ).run(session) - ) + return await self.run_query_builder(GetNextUrlForRelevanceAnnotationQueryBuilder(batch_id)) # endregion relevant From 744c1bdbef63c338787ddacddc668112f315ac9b Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 17 Jul 2025 13:19:01 -0400 Subject: [PATCH 241/244] Update logic to disconnect URLs from Batches --- ...ccf4_remove_batches_dependency_for_urls.py | 83 +++ .../queries/get_annotation_batch_info.py | 8 +- .../get_next_url_for_user_annotation.py | 23 +- .../agency/get/queries/next_for_annotation.py | 22 +- src/api/endpoints/annotate/all/get/query.py | 9 +- .../batches => batch/duplicates}/__init__.py | 0 .../get/duplicates.py => duplicates/dto.py} | 0 src/api/endpoints/batch/duplicates/query.py | 60 ++ src/api/endpoints/batch/routes.py | 4 +- .../{url/dtos => batch/urls}/__init__.py | 0 .../batch/{dtos/get/urls.py => urls/dto.py} | 0 src/api/endpoints/batch/urls/query.py | 31 ++ .../endpoints/collector/manual}/__init__.py | 0 src/api/endpoints/collector/manual/query.py | 80 +++ .../api/endpoints/metrics/batches/__init__.py | 0 .../metrics/batches/aggregated/__init__.py | 0 .../aggregated/dto.py} | 0 .../metrics/batches/aggregated/query.py | 117 ++++ .../metrics/batches/breakdown/__init__.py | 0 .../breakdown.py => batches/breakdown/dto.py} | 0 .../metrics/batches/breakdown/query.py | 97 ++++ src/api/endpoints/metrics/routes.py | 4 +- src/api/endpoints/review/next/query.py | 46 +- src/api/endpoints/task/by_id/__init__.py | 0 .../task/{dtos/get/task.py => by_id/dto.py} | 0 src/api/endpoints/task/by_id/query.py | 67 +++ src/api/endpoints/task/routes.py | 2 +- src/api/endpoints/url/get/__init__.py | 0 .../url/{dtos/response.py => get/dto.py} | 0 src/api/endpoints/url/get/query.py | 65 +++ src/api/endpoints/url/routes.py | 2 +- src/core/core.py | 12 +- src/core/tasks/url/manager.py | 5 - .../agency_identification/queries/__init__.py | 0 ...pending_urls_without_agency_suggestions.py | 36 ++ .../operators/url_html/queries/__init__.py | 0 .../get_pending_urls_without_html_data.py | 32 ++ .../queries/__init__.py | 0 ...pending_urls_missing_miscellaneous_data.py | 43 ++ ...pending_urls_missing_miscellaneous_data.py | 14 + src/db/client/async_.py | 511 +++--------------- src/db/client/helpers.py | 3 + src/db/client/sync.py | 65 ++- src/db/dto_converter.py | 18 - src/db/models/instantiations/batch.py | 6 +- src/db/models/instantiations/link/__init__.py | 0 .../instantiations/link/link_batch_urls.py | 17 + .../{ => link}/link_task_url.py | 0 src/db/models/instantiations/url/core.py | 8 +- .../url_counts/builder.py | 10 +- src/db/statement_composer.py | 10 +- src/util/alembic_helpers.py | 23 +- .../api/_helpers/RequestValidator.py | 12 +- .../integration/api/test_duplicates.py | 63 --- .../integration/api/test_example_collector.py | 1 - .../integration/api/test_manual_batch.py | 8 +- tests/automated/integration/api/test_url.py | 2 +- .../security_manager/test_security_manager.py | 2 - tests/automated/integration/tasks/asserts.py | 5 +- 59 files changed, 1016 insertions(+), 610 deletions(-) create mode 100644 alembic/versions/2025_07_17_0856-9552d354ccf4_remove_batches_dependency_for_urls.py rename src/api/endpoints/{metrics/dtos/get/batches => batch/duplicates}/__init__.py (100%) rename src/api/endpoints/batch/{dtos/get/duplicates.py => duplicates/dto.py} (100%) create mode 100644 src/api/endpoints/batch/duplicates/query.py rename src/api/endpoints/{url/dtos => batch/urls}/__init__.py (100%) rename src/api/endpoints/batch/{dtos/get/urls.py => urls/dto.py} (100%) create mode 100644 src/api/endpoints/batch/urls/query.py rename {tests/automated/integration/collector_db => src/api/endpoints/collector/manual}/__init__.py (100%) create mode 100644 src/api/endpoints/collector/manual/query.py rename tests/automated/integration/collector_db/test_db_client.py => src/api/endpoints/metrics/batches/__init__.py (100%) create mode 100644 src/api/endpoints/metrics/batches/aggregated/__init__.py rename src/api/endpoints/metrics/{dtos/get/batches/aggregated.py => batches/aggregated/dto.py} (100%) create mode 100644 src/api/endpoints/metrics/batches/aggregated/query.py create mode 100644 src/api/endpoints/metrics/batches/breakdown/__init__.py rename src/api/endpoints/metrics/{dtos/get/batches/breakdown.py => batches/breakdown/dto.py} (100%) create mode 100644 src/api/endpoints/metrics/batches/breakdown/query.py create mode 100644 src/api/endpoints/task/by_id/__init__.py rename src/api/endpoints/task/{dtos/get/task.py => by_id/dto.py} (100%) create mode 100644 src/api/endpoints/task/by_id/query.py create mode 100644 src/api/endpoints/url/get/__init__.py rename src/api/endpoints/url/{dtos/response.py => get/dto.py} (100%) create mode 100644 src/api/endpoints/url/get/query.py create mode 100644 src/core/tasks/url/operators/agency_identification/queries/__init__.py create mode 100644 src/core/tasks/url/operators/agency_identification/queries/get_pending_urls_without_agency_suggestions.py create mode 100644 src/core/tasks/url/operators/url_html/queries/__init__.py create mode 100644 src/core/tasks/url/operators/url_html/queries/get_pending_urls_without_html_data.py create mode 100644 src/core/tasks/url/operators/url_miscellaneous_metadata/queries/__init__.py create mode 100644 src/core/tasks/url/operators/url_miscellaneous_metadata/queries/get_pending_urls_missing_miscellaneous_data.py create mode 100644 src/core/tasks/url/operators/url_miscellaneous_metadata/queries/has_pending_urls_missing_miscellaneous_data.py create mode 100644 src/db/client/helpers.py create mode 100644 src/db/models/instantiations/link/__init__.py create mode 100644 src/db/models/instantiations/link/link_batch_urls.py rename src/db/models/instantiations/{ => link}/link_task_url.py (100%) delete mode 100644 tests/automated/integration/api/test_duplicates.py diff --git a/alembic/versions/2025_07_17_0856-9552d354ccf4_remove_batches_dependency_for_urls.py b/alembic/versions/2025_07_17_0856-9552d354ccf4_remove_batches_dependency_for_urls.py new file mode 100644 index 00000000..5a97a228 --- /dev/null +++ b/alembic/versions/2025_07_17_0856-9552d354ccf4_remove_batches_dependency_for_urls.py @@ -0,0 +1,83 @@ +"""Remove batches dependency for urls + +Revision ID: 9552d354ccf4 +Revises: d6519a3ca5c9 +Create Date: 2025-07-17 08:56:22.919486 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +from src.util.alembic_helpers import id_column, created_at_column, updated_at_column, url_id_column, batch_id_column + +# revision identifiers, used by Alembic. +revision: str = '9552d354ccf4' +down_revision: Union[str, None] = 'd6519a3ca5c9' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +LINK_TABLE_NAME = 'link_batch_urls' + +BATCHES_COLUMN_NAME = 'batch_id' + +def _create_link_table(): + op.create_table( + LINK_TABLE_NAME, + id_column(), + batch_id_column(), + url_id_column(), + created_at_column(), + updated_at_column(), + sa.UniqueConstraint('url_id', name='uq_link_table_url_id') + ) + +def _drop_link_table(): + op.drop_table(LINK_TABLE_NAME) + +def _migrate_batch_ids_to_link_table(): + op.execute(f""" + INSERT INTO {LINK_TABLE_NAME} (batch_id, url_id) + SELECT batch_id, id + FROM urls + """) + +def _migrate_link_table_to_batch_ids(): + op.execute(f""" + UPDATE urls + SET batch_id = ( + SELECT batch_id + FROM {LINK_TABLE_NAME} + WHERE url_id = urls.id + ) + """) + +def _drop_url_batches_column(): + op.drop_column('urls', BATCHES_COLUMN_NAME) + +def _add_url_batches_column(): + op.add_column( + 'urls', + batch_id_column(nullable=True) + ) + +def _add_not_null_constraint(): + op.alter_column( + 'urls', + BATCHES_COLUMN_NAME, + nullable=False + ) + + +def upgrade() -> None: + _create_link_table() + _migrate_batch_ids_to_link_table() + _drop_url_batches_column() + + +def downgrade() -> None: + _add_url_batches_column() + _migrate_link_table_to_batch_ids() + _add_not_null_constraint() + _drop_link_table() diff --git a/src/api/endpoints/annotate/_shared/queries/get_annotation_batch_info.py b/src/api/endpoints/annotate/_shared/queries/get_annotation_batch_info.py index b9b0a634..15f5b631 100644 --- a/src/api/endpoints/annotate/_shared/queries/get_annotation_batch_info.py +++ b/src/api/endpoints/annotate/_shared/queries/get_annotation_batch_info.py @@ -5,6 +5,7 @@ from src.api.endpoints.annotate.dtos.shared.batch import AnnotationBatchInfo from src.collectors.enums import URLStatus +from src.db.models.instantiations.link.link_batch_urls import LinkBatchURL from src.db.models.instantiations.url.core import URL from src.db.queries.base.builder import QueryBuilderBase from src.db.statement_composer import StatementComposer @@ -35,11 +36,14 @@ async def run( for model in self.models ] - select_url = select(func.count(URL.id)) + select_url = ( + select(func.count(URL.id)) + .join(LinkBatchURL) + ) common_where_clause = [ URL.outcome == URLStatus.PENDING.value, - URL.batch_id == self.batch_id, + LinkBatchURL.batch_id == self.batch_id, ] annotated_query = ( diff --git a/src/api/endpoints/annotate/_shared/queries/get_next_url_for_user_annotation.py b/src/api/endpoints/annotate/_shared/queries/get_next_url_for_user_annotation.py index c500641a..3bda8ff3 100644 --- a/src/api/endpoints/annotate/_shared/queries/get_next_url_for_user_annotation.py +++ b/src/api/endpoints/annotate/_shared/queries/get_next_url_for_user_annotation.py @@ -5,6 +5,7 @@ from src.collectors.enums import URLStatus from src.core.enums import SuggestedStatus from src.db.client.types import UserSuggestionModel +from src.db.models.instantiations.link.link_batch_urls import LinkBatchURL from src.db.models.instantiations.url.core import URL from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion from src.db.queries.base.builder import QueryBuilderBase @@ -27,10 +28,21 @@ def __init__( self.auto_suggestion_relationship = auto_suggestion_relationship async def run(self, session: AsyncSession): - url_query = ( + query = ( select( URL, ) + ) + + if self.batch_id is not None: + query = ( + query + .join(LinkBatchURL) + .where(LinkBatchURL.batch_id == self.batch_id) + ) + + query = ( + query .where(URL.outcome == URLStatus.PENDING.value) # URL must not have user suggestion .where( @@ -39,7 +51,7 @@ async def run(self, session: AsyncSession): ) if self.check_if_annotated_not_relevant: - url_query = url_query.where( + query = query.where( not_( exists( select(UserRelevantSuggestion) @@ -51,14 +63,13 @@ async def run(self, session: AsyncSession): ) ) - if self.batch_id is not None: - url_query = url_query.where(URL.batch_id == self.batch_id) - url_query = url_query.options( + + query = query.options( joinedload(self.auto_suggestion_relationship), joinedload(URL.html_content) ).limit(1) - raw_result = await session.execute(url_query) + raw_result = await session.execute(query) return raw_result.unique().scalars().one_or_none() \ No newline at end of file diff --git a/src/api/endpoints/annotate/agency/get/queries/next_for_annotation.py b/src/api/endpoints/annotate/agency/get/queries/next_for_annotation.py index be625fb0..5bfd6e8a 100644 --- a/src/api/endpoints/annotate/agency/get/queries/next_for_annotation.py +++ b/src/api/endpoints/annotate/agency/get/queries/next_for_annotation.py @@ -10,6 +10,7 @@ from src.core.tasks.url.operators.url_html.scraper.parser.util import convert_to_response_html_info from src.db.dtos.url.mapping import URLMapping from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency +from src.db.models.instantiations.link.link_batch_urls import LinkBatchURL from src.db.models.instantiations.url.core import URL from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion @@ -41,20 +42,19 @@ async def run( have extant autosuggestions """ # Select statement - statement = ( - select(URL.id, URL.url) - # Must not have confirmed agencies - .where( - URL.outcome == URLStatus.PENDING.value - ) + query = select(URL.id, URL.url) + if self.batch_id is not None: + query = query.join(LinkBatchURL).where(LinkBatchURL.batch_id == self.batch_id) + + # Must not have confirmed agencies + query = query.where( + URL.outcome == URLStatus.PENDING.value ) - if self.batch_id is not None: - statement = statement.where(URL.batch_id == self.batch_id) # Must not have been annotated by a user - statement = ( - statement.join(UserUrlAgencySuggestion, isouter=True) + query = ( + query.join(UserUrlAgencySuggestion, isouter=True) .where( ~exists( select(UserUrlAgencySuggestion). @@ -93,7 +93,7 @@ async def run( ) ) ).limit(1) - raw_result = await session.execute(statement) + raw_result = await session.execute(query) results = raw_result.all() if len(results) == 0: return GetNextURLForAgencyAnnotationResponse( diff --git a/src/api/endpoints/annotate/all/get/query.py b/src/api/endpoints/annotate/all/get/query.py index d23d749e..1191e8d6 100644 --- a/src/api/endpoints/annotate/all/get/query.py +++ b/src/api/endpoints/annotate/all/get/query.py @@ -11,6 +11,7 @@ from src.collectors.enums import URLStatus from src.db.dto_converter import DTOConverter from src.db.dtos.url.mapping import URLMapping +from src.db.models.instantiations.link.link_batch_urls import LinkBatchURL from src.db.models.instantiations.url.core import URL from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion from src.db.models.instantiations.url.suggestion.record_type.user import UserRecordTypeSuggestion @@ -32,8 +33,11 @@ async def run( self, session: AsyncSession ) -> GetNextURLForAllAnnotationResponse: + query = Select(URL) + if self.batch_id is not None: + query = query.join(LinkBatchURL).where(LinkBatchURL.batch_id == self.batch_id) query = ( - Select(URL) + query .where( and_( URL.outcome == URLStatus.PENDING.value, @@ -43,8 +47,7 @@ async def run( ) ) ) - if self.batch_id is not None: - query = query.where(URL.batch_id == self.batch_id) + load_options = [ URL.html_content, diff --git a/src/api/endpoints/metrics/dtos/get/batches/__init__.py b/src/api/endpoints/batch/duplicates/__init__.py similarity index 100% rename from src/api/endpoints/metrics/dtos/get/batches/__init__.py rename to src/api/endpoints/batch/duplicates/__init__.py diff --git a/src/api/endpoints/batch/dtos/get/duplicates.py b/src/api/endpoints/batch/duplicates/dto.py similarity index 100% rename from src/api/endpoints/batch/dtos/get/duplicates.py rename to src/api/endpoints/batch/duplicates/dto.py diff --git a/src/api/endpoints/batch/duplicates/query.py b/src/api/endpoints/batch/duplicates/query.py new file mode 100644 index 00000000..a4c3aa31 --- /dev/null +++ b/src/api/endpoints/batch/duplicates/query.py @@ -0,0 +1,60 @@ +from sqlalchemy import Select +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import aliased + +from src.db.dtos.duplicate import DuplicateInfo +from src.db.models.instantiations.batch import Batch +from src.db.models.instantiations.duplicate import Duplicate +from src.db.models.instantiations.link.link_batch_urls import LinkBatchURL +from src.db.models.instantiations.url.core import URL +from src.db.queries.base.builder import QueryBuilderBase + + +class GetDuplicatesByBatchIDQueryBuilder(QueryBuilderBase): + + def __init__( + self, + batch_id: int, + page: int + ): + super().__init__() + self.batch_id = batch_id + self.page = page + + async def run(self, session: AsyncSession) -> list[DuplicateInfo]: + original_batch = aliased(Batch) + duplicate_batch = aliased(Batch) + + query = ( + Select( + URL.url.label("source_url"), + URL.id.label("original_url_id"), + duplicate_batch.id.label("duplicate_batch_id"), + duplicate_batch.parameters.label("duplicate_batch_parameters"), + original_batch.id.label("original_batch_id"), + original_batch.parameters.label("original_batch_parameters"), + ) + .select_from(Duplicate) + .join(URL, Duplicate.original_url_id == URL.id) + .join(duplicate_batch, Duplicate.batch_id == duplicate_batch.id) + .join(LinkBatchURL, URL.id == LinkBatchURL.url_id) + .join(original_batch, LinkBatchURL.batch_id == original_batch.id) + .filter(duplicate_batch.id == self.batch_id) + .limit(100) + .offset((self.page - 1) * 100) + ) + raw_results = await session.execute(query) + results = raw_results.all() + final_results = [] + for result in results: + final_results.append( + DuplicateInfo( + source_url=result.source_url, + duplicate_batch_id=result.duplicate_batch_id, + duplicate_metadata=result.duplicate_batch_parameters, + original_batch_id=result.original_batch_id, + original_metadata=result.original_batch_parameters, + original_url_id=result.original_url_id + ) + ) + return final_results diff --git a/src/api/endpoints/batch/routes.py b/src/api/endpoints/batch/routes.py index bd3282fc..879c643d 100644 --- a/src/api/endpoints/batch/routes.py +++ b/src/api/endpoints/batch/routes.py @@ -4,12 +4,12 @@ from fastapi.params import Query, Depends from src.api.dependencies import get_async_core -from src.api.endpoints.batch.dtos.get.duplicates import GetDuplicatesByBatchResponse from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse from src.api.endpoints.batch.dtos.get.summaries.response import GetBatchSummariesResponse from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary -from src.api.endpoints.batch.dtos.get.urls import GetURLsByBatchResponse from src.api.endpoints.batch.dtos.post.abort import MessageResponse +from src.api.endpoints.batch.duplicates.dto import GetDuplicatesByBatchResponse +from src.api.endpoints.batch.urls.dto import GetURLsByBatchResponse from src.collectors.enums import CollectorType from src.core.core import AsyncCore from src.core.enums import BatchStatus diff --git a/src/api/endpoints/url/dtos/__init__.py b/src/api/endpoints/batch/urls/__init__.py similarity index 100% rename from src/api/endpoints/url/dtos/__init__.py rename to src/api/endpoints/batch/urls/__init__.py diff --git a/src/api/endpoints/batch/dtos/get/urls.py b/src/api/endpoints/batch/urls/dto.py similarity index 100% rename from src/api/endpoints/batch/dtos/get/urls.py rename to src/api/endpoints/batch/urls/dto.py diff --git a/src/api/endpoints/batch/urls/query.py b/src/api/endpoints/batch/urls/query.py new file mode 100644 index 00000000..fcfba3ee --- /dev/null +++ b/src/api/endpoints/batch/urls/query.py @@ -0,0 +1,31 @@ +from sqlalchemy import Select +from sqlalchemy.ext.asyncio import AsyncSession + +from src.db.dtos.url.core import URLInfo +from src.db.models.instantiations.link.link_batch_urls import LinkBatchURL +from src.db.models.instantiations.url.core import URL +from src.db.queries.base.builder import QueryBuilderBase + + +class GetURLsByBatchQueryBuilder(QueryBuilderBase): + + def __init__( + self, + batch_id: int, + page: int = 1 + ): + super().__init__() + self.batch_id = batch_id + self.page = page + + async def run(self, session: AsyncSession) -> list[URLInfo]: + query = ( + Select(URL) + .join(LinkBatchURL) + .where(LinkBatchURL.batch_id == self.batch_id) + .order_by(URL.id) + .limit(100) + .offset((self.page - 1) * 100)) + result = await session.execute(query) + urls = result.scalars().all() + return [URLInfo(**url.__dict__) for url in urls] \ No newline at end of file diff --git a/tests/automated/integration/collector_db/__init__.py b/src/api/endpoints/collector/manual/__init__.py similarity index 100% rename from tests/automated/integration/collector_db/__init__.py rename to src/api/endpoints/collector/manual/__init__.py diff --git a/src/api/endpoints/collector/manual/query.py b/src/api/endpoints/collector/manual/query.py new file mode 100644 index 00000000..2f29a357 --- /dev/null +++ b/src/api/endpoints/collector/manual/query.py @@ -0,0 +1,80 @@ +from sqlalchemy.exc import IntegrityError +from sqlalchemy.ext.asyncio import AsyncSession + +from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO +from src.api.endpoints.collector.dtos.manual_batch.response import ManualBatchResponseDTO +from src.collectors.enums import CollectorType, URLStatus +from src.core.enums import BatchStatus +from src.db.models.instantiations.batch import Batch +from src.db.models.instantiations.link.link_batch_urls import LinkBatchURL +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata +from src.db.queries.base.builder import QueryBuilderBase + + +class UploadManualBatchQueryBuilder(QueryBuilderBase): + + def __init__( + self, + user_id: int, + dto: ManualBatchInputDTO + ): + super().__init__() + self.dto = dto + self.user_id = user_id + + + async def run(self, session: AsyncSession) -> ManualBatchResponseDTO: + batch = Batch( + strategy=CollectorType.MANUAL.value, + status=BatchStatus.READY_TO_LABEL.value, + parameters={ + "name": self.dto.name + }, + user_id=self.user_id + ) + session.add(batch) + await session.flush() + + batch_id = batch.id + url_ids = [] + duplicate_urls = [] + + for entry in self.dto.entries: + url = URL( + url=entry.url, + name=entry.name, + description=entry.description, + collector_metadata=entry.collector_metadata, + outcome=URLStatus.PENDING.value, + record_type=entry.record_type.value if entry.record_type is not None else None, + ) + + async with session.begin_nested(): + try: + session.add(url) + await session.flush() + except IntegrityError: + duplicate_urls.append(entry.url) + continue + await session.flush() + link = LinkBatchURL( + batch_id=batch_id, + url_id=url.id + ) + session.add(link) + + optional_metadata = URLOptionalDataSourceMetadata( + url_id=url.id, + record_formats=entry.record_formats, + data_portal_type=entry.data_portal_type, + supplying_entity=entry.supplying_entity, + ) + session.add(optional_metadata) + url_ids.append(url.id) + + return ManualBatchResponseDTO( + batch_id=batch_id, + urls=url_ids, + duplicate_urls=duplicate_urls + ) \ No newline at end of file diff --git a/tests/automated/integration/collector_db/test_db_client.py b/src/api/endpoints/metrics/batches/__init__.py similarity index 100% rename from tests/automated/integration/collector_db/test_db_client.py rename to src/api/endpoints/metrics/batches/__init__.py diff --git a/src/api/endpoints/metrics/batches/aggregated/__init__.py b/src/api/endpoints/metrics/batches/aggregated/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/metrics/dtos/get/batches/aggregated.py b/src/api/endpoints/metrics/batches/aggregated/dto.py similarity index 100% rename from src/api/endpoints/metrics/dtos/get/batches/aggregated.py rename to src/api/endpoints/metrics/batches/aggregated/dto.py diff --git a/src/api/endpoints/metrics/batches/aggregated/query.py b/src/api/endpoints/metrics/batches/aggregated/query.py new file mode 100644 index 00000000..12616a22 --- /dev/null +++ b/src/api/endpoints/metrics/batches/aggregated/query.py @@ -0,0 +1,117 @@ +from sqlalchemy import case, select +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.sql.functions import coalesce + +from src.api.endpoints.metrics.batches.aggregated.dto import GetMetricsBatchesAggregatedResponseDTO, \ + GetMetricsBatchesAggregatedInnerResponseDTO +from src.collectors.enums import URLStatus, CollectorType +from src.core.enums import BatchStatus +from src.db.models.instantiations.batch import Batch +from src.db.models.instantiations.link.link_batch_urls import LinkBatchURL +from src.db.models.instantiations.url.core import URL +from src.db.queries.base.builder import QueryBuilderBase +from src.db.statement_composer import StatementComposer + + +class GetBatchesAggregatedMetricsQueryBuilder(QueryBuilderBase): + + async def run( + self, + session: AsyncSession + ) -> GetMetricsBatchesAggregatedResponseDTO: + sc = StatementComposer + + # First, get all batches broken down by collector type and status + def batch_column(status: BatchStatus, label): + return sc.count_distinct( + case( + ( + Batch.status == status.value, + Batch.id + ) + ), + label=label + ) + + batch_count_subquery = select( + batch_column(BatchStatus.READY_TO_LABEL, label="done_count"), + batch_column(BatchStatus.ERROR, label="error_count"), + Batch.strategy, + ).group_by(Batch.strategy).subquery("batch_count") + + def url_column(status: URLStatus, label): + return sc.count_distinct( + case( + ( + URL.outcome == status.value, + URL.id + ) + ), + label=label + ) + + # Next, count urls + url_count_subquery = select( + Batch.strategy, + url_column(URLStatus.PENDING, label="pending_count"), + url_column(URLStatus.ERROR, label="error_count"), + url_column(URLStatus.VALIDATED, label="validated_count"), + url_column(URLStatus.SUBMITTED, label="submitted_count"), + url_column(URLStatus.NOT_RELEVANT, label="rejected_count"), + + ).join( + LinkBatchURL, + LinkBatchURL.url_id == URL.id + ).outerjoin( + Batch, Batch.id == LinkBatchURL.batch_id + ).group_by( + Batch.strategy + ).subquery("url_count") + + # Combine + query = select( + Batch.strategy, + batch_count_subquery.c.done_count.label("batch_done_count"), + batch_count_subquery.c.error_count.label("batch_error_count"), + coalesce(url_count_subquery.c.pending_count, 0).label("pending_count"), + coalesce(url_count_subquery.c.error_count, 0).label("error_count"), + coalesce(url_count_subquery.c.submitted_count, 0).label("submitted_count"), + coalesce(url_count_subquery.c.rejected_count, 0).label("rejected_count"), + coalesce(url_count_subquery.c.validated_count, 0).label("validated_count") + ).join( + batch_count_subquery, + Batch.strategy == batch_count_subquery.c.strategy + ).outerjoin( + url_count_subquery, + Batch.strategy == url_count_subquery.c.strategy + ) + raw_results = await session.execute(query) + results = raw_results.all() + d: dict[CollectorType, GetMetricsBatchesAggregatedInnerResponseDTO] = {} + for result in results: + d[CollectorType(result.strategy)] = GetMetricsBatchesAggregatedInnerResponseDTO( + count_successful_batches=result.batch_done_count, + count_failed_batches=result.batch_error_count, + count_urls=result.pending_count + result.submitted_count + + result.rejected_count + result.error_count + + result.validated_count, + count_urls_pending=result.pending_count, + count_urls_validated=result.validated_count, + count_urls_submitted=result.submitted_count, + count_urls_rejected=result.rejected_count, + count_urls_errors=result.error_count + ) + + total_batch_query = await session.execute( + select( + sc.count_distinct(Batch.id, label="count") + ) + ) + total_batch_count = total_batch_query.scalars().one_or_none() + if total_batch_count is None: + total_batch_count = 0 + + return GetMetricsBatchesAggregatedResponseDTO( + total_batches=total_batch_count, + by_strategy=d + ) \ No newline at end of file diff --git a/src/api/endpoints/metrics/batches/breakdown/__init__.py b/src/api/endpoints/metrics/batches/breakdown/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/metrics/dtos/get/batches/breakdown.py b/src/api/endpoints/metrics/batches/breakdown/dto.py similarity index 100% rename from src/api/endpoints/metrics/dtos/get/batches/breakdown.py rename to src/api/endpoints/metrics/batches/breakdown/dto.py diff --git a/src/api/endpoints/metrics/batches/breakdown/query.py b/src/api/endpoints/metrics/batches/breakdown/query.py new file mode 100644 index 00000000..771543ac --- /dev/null +++ b/src/api/endpoints/metrics/batches/breakdown/query.py @@ -0,0 +1,97 @@ +from sqlalchemy import select, case +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.sql.functions import coalesce + +from src.api.endpoints.metrics.batches.breakdown.dto import GetMetricsBatchesBreakdownResponseDTO, \ + GetMetricsBatchesBreakdownInnerResponseDTO +from src.collectors.enums import URLStatus, CollectorType +from src.core.enums import BatchStatus +from src.db.models.instantiations.batch import Batch +from src.db.models.instantiations.link.link_batch_urls import LinkBatchURL +from src.db.models.instantiations.url.core import URL +from src.db.queries.base.builder import QueryBuilderBase +from src.db.statement_composer import StatementComposer + + +class GetBatchesBreakdownMetricsQueryBuilder(QueryBuilderBase): + + def __init__( + self, + page: int + ): + super().__init__() + self.page = page + + async def run(self, session: AsyncSession) -> GetMetricsBatchesBreakdownResponseDTO: + sc = StatementComposer + + main_query = select( + Batch.strategy, + Batch.id, + Batch.status, + Batch.date_generated.label("created_at"), + ) + + def url_column(status: URLStatus, label): + return sc.count_distinct( + case( + ( + URL.outcome == status.value, + URL.id + ) + ), + label=label + ) + + count_query = select( + LinkBatchURL.batch_id, + sc.count_distinct(URL.id, label="count_total"), + url_column(URLStatus.PENDING, label="count_pending"), + url_column(URLStatus.SUBMITTED, label="count_submitted"), + url_column(URLStatus.NOT_RELEVANT, label="count_rejected"), + url_column(URLStatus.ERROR, label="count_error"), + url_column(URLStatus.VALIDATED, label="count_validated"), + ).join(URL, LinkBatchURL.url_id == URL.id).group_by( + LinkBatchURL.batch_id + ).subquery("url_count") + + query = (select( + main_query.c.strategy, + main_query.c.id, + main_query.c.created_at, + main_query.c.status, + coalesce(count_query.c.count_total, 0).label("count_total"), + coalesce(count_query.c.count_pending, 0).label("count_pending"), + coalesce(count_query.c.count_submitted, 0).label("count_submitted"), + coalesce(count_query.c.count_rejected, 0).label("count_rejected"), + coalesce(count_query.c.count_error, 0).label("count_error"), + coalesce(count_query.c.count_validated, 0).label("count_validated"), + ).outerjoin( + count_query, + main_query.c.id == count_query.c.batch_id + ).offset( + (self.page - 1) * 100 + ).order_by( + main_query.c.created_at.asc() + )) + + raw_results = await session.execute(query) + results = raw_results.all() + batches: list[GetMetricsBatchesBreakdownInnerResponseDTO] = [] + for result in results: + dto = GetMetricsBatchesBreakdownInnerResponseDTO( + batch_id=result.id, + strategy=CollectorType(result.strategy), + status=BatchStatus(result.status), + created_at=result.created_at, + count_url_total=result.count_total, + count_url_pending=result.count_pending, + count_url_submitted=result.count_submitted, + count_url_rejected=result.count_rejected, + count_url_error=result.count_error, + count_url_validated=result.count_validated + ) + batches.append(dto) + return GetMetricsBatchesBreakdownResponseDTO( + batches=batches, + ) \ No newline at end of file diff --git a/src/api/endpoints/metrics/routes.py b/src/api/endpoints/metrics/routes.py index cc043061..59fa5906 100644 --- a/src/api/endpoints/metrics/routes.py +++ b/src/api/endpoints/metrics/routes.py @@ -2,9 +2,9 @@ from fastapi.params import Query, Depends from src.api.dependencies import get_async_core +from src.api.endpoints.metrics.batches.aggregated.dto import GetMetricsBatchesAggregatedResponseDTO +from src.api.endpoints.metrics.batches.breakdown.dto import GetMetricsBatchesBreakdownResponseDTO from src.api.endpoints.metrics.dtos.get.backlog import GetMetricsBacklogResponseDTO -from src.api.endpoints.metrics.dtos.get.batches.aggregated import GetMetricsBatchesAggregatedResponseDTO -from src.api.endpoints.metrics.dtos.get.batches.breakdown import GetMetricsBatchesBreakdownResponseDTO from src.api.endpoints.metrics.dtos.get.urls.aggregated.core import GetMetricsURLsAggregatedResponseDTO from src.api.endpoints.metrics.dtos.get.urls.aggregated.pending import GetMetricsURLsAggregatedPendingResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.pending import GetMetricsURLsBreakdownPendingResponseDTO diff --git a/src/api/endpoints/review/next/query.py b/src/api/endpoints/review/next/query.py index e1ca7ba5..8f7d5e35 100644 --- a/src/api/endpoints/review/next/query.py +++ b/src/api/endpoints/review/next/query.py @@ -1,6 +1,6 @@ from typing import Optional, Type -from sqlalchemy import FromClause, select, and_, Select, desc, asc, func +from sqlalchemy import FromClause, select, and_, Select, desc, asc, func, join from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import joinedload @@ -14,6 +14,7 @@ from src.db.exceptions import FailedQueryException from src.db.models.instantiations.batch import Batch from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency +from src.db.models.instantiations.link.link_batch_urls import LinkBatchURL from src.db.models.instantiations.url.core import URL from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion @@ -59,29 +60,46 @@ def _get_where_exist_clauses( where_clauses.append(where_clause) return where_clauses - def _build_base_query(self, anno_exists_query: FromClause, ): + def _build_base_query( + self, + anno_exists_query: FromClause, + ) -> Select: builder = self.anno_exists_builder where_exist_clauses = self._get_where_exist_clauses( builder.query ) - return ( + query = ( select( URL, - self._sum_exists_query(anno_exists_query, ALL_ANNOTATION_MODELS) + self._sum_exists_query(anno_exists_query, USER_ANNOTATION_MODELS) ) .select_from(anno_exists_query) .join( URL, URL.id == builder.url_id ) - .where( + ) + if self.batch_id is not None: + query = ( + query.join( + LinkBatchURL + ) + .where( + LinkBatchURL.batch_id == self.batch_id + ) + ) + + query = ( + query.where( and_( URL.outcome == URLStatus.PENDING.value, *where_exist_clauses ) ) ) + return query + def _sum_exists_query(self, query, models: list[Type[URLDependentMixin]]): return sum( @@ -160,21 +178,23 @@ async def get_count_ready_query(self): builder = self.anno_exists_builder count_ready_query = ( select( - URL.batch_id, + LinkBatchURL.batch_id, func.count(URL.id).label(self.count_label) ) + .select_from(LinkBatchURL) + .join(URL) .join( builder.query, builder.url_id == URL.id ) .where( - URL.batch_id == self.batch_id, + LinkBatchURL.batch_id == self.batch_id, URL.outcome == URLStatus.PENDING.value, *self._get_where_exist_clauses( builder.query ) ) - .group_by(URL.batch_id) + .group_by(LinkBatchURL.batch_id) .subquery("count_ready") ) return count_ready_query @@ -185,10 +205,9 @@ async def get_count_reviewed_query(self): Batch.id.label("batch_id"), func.count(URL.id).label(self.count_label) ) - .outerjoin( - URL, - URL.batch_id == Batch.id - ) + .select_from(Batch) + .join(LinkBatchURL) + .outerjoin(URL, URL.id == LinkBatchURL.url_id) .where( URL.outcome.in_( [ @@ -198,7 +217,7 @@ async def get_count_reviewed_query(self): URLStatus.INDIVIDUAL_RECORD.value ] ), - URL.batch_id == self.batch_id + LinkBatchURL.batch_id == self.batch_id ) .group_by(Batch.id) .subquery("count_reviewed") @@ -272,7 +291,6 @@ async def run( async def build_url_query(self): anno_exists_query = self.anno_exists_builder.query url_query = self._build_base_query(anno_exists_query) - url_query = await self._apply_batch_id_filter(url_query, self.batch_id) url_query = await self._apply_options(url_query) url_query = await self._apply_order_clause(url_query) diff --git a/src/api/endpoints/task/by_id/__init__.py b/src/api/endpoints/task/by_id/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/task/dtos/get/task.py b/src/api/endpoints/task/by_id/dto.py similarity index 100% rename from src/api/endpoints/task/dtos/get/task.py rename to src/api/endpoints/task/by_id/dto.py diff --git a/src/api/endpoints/task/by_id/query.py b/src/api/endpoints/task/by_id/query.py new file mode 100644 index 00000000..a57b9daf --- /dev/null +++ b/src/api/endpoints/task/by_id/query.py @@ -0,0 +1,67 @@ +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import selectinload + +from src.api.endpoints.task.by_id.dto import TaskInfo +from src.collectors.enums import URLStatus +from src.core.enums import BatchStatus +from src.db.dtos.url.core import URLInfo +from src.db.dtos.url.error import URLErrorPydanticInfo +from src.db.enums import TaskType +from src.db.models.instantiations.task.core import Task +from src.db.models.instantiations.url.core import URL +from src.db.queries.base.builder import QueryBuilderBase + + +class GetTaskInfoQueryBuilder(QueryBuilderBase): + + def __init__(self, task_id: int): + super().__init__() + self.task_id = task_id + + async def run(self, session: AsyncSession) -> TaskInfo: + # Get Task + result = await session.execute( + select(Task) + .where(Task.id == self.task_id) + .options( + selectinload(Task.urls) + .selectinload(URL.batch), + selectinload(Task.error), + selectinload(Task.errored_urls) + ) + ) + task = result.scalars().first() + error = task.error[0].error if len(task.error) > 0 else None + # Get error info if any + # Get URLs + urls = task.urls + url_infos = [] + for url in urls: + url_info = URLInfo( + id=url.id, + batch_id=url.batch.id, + url=url.url, + collector_metadata=url.collector_metadata, + outcome=URLStatus(url.outcome), + updated_at=url.updated_at + ) + url_infos.append(url_info) + + errored_urls = [] + for url in task.errored_urls: + url_error_info = URLErrorPydanticInfo( + task_id=url.task_id, + url_id=url.url_id, + error=url.error, + updated_at=url.updated_at + ) + errored_urls.append(url_error_info) + return TaskInfo( + task_type=TaskType(task.task_type), + task_status=BatchStatus(task.task_status), + error_info=error, + updated_at=task.updated_at, + urls=url_infos, + url_errors=errored_urls + ) \ No newline at end of file diff --git a/src/api/endpoints/task/routes.py b/src/api/endpoints/task/routes.py index e24d6e76..a719d6b9 100644 --- a/src/api/endpoints/task/routes.py +++ b/src/api/endpoints/task/routes.py @@ -3,9 +3,9 @@ from fastapi import APIRouter, Depends, Query, Path from src.api.dependencies import get_async_core +from src.api.endpoints.task.by_id.dto import TaskInfo from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse from src.api.endpoints.task.dtos.get.task_status import GetTaskStatusResponseInfo -from src.api.endpoints.task.dtos.get.task import TaskInfo from src.db.enums import TaskType from src.core.core import AsyncCore from src.core.enums import BatchStatus diff --git a/src/api/endpoints/url/get/__init__.py b/src/api/endpoints/url/get/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/api/endpoints/url/dtos/response.py b/src/api/endpoints/url/get/dto.py similarity index 100% rename from src/api/endpoints/url/dtos/response.py rename to src/api/endpoints/url/get/dto.py diff --git a/src/api/endpoints/url/get/query.py b/src/api/endpoints/url/get/query.py new file mode 100644 index 00000000..1ba5a75f --- /dev/null +++ b/src/api/endpoints/url/get/query.py @@ -0,0 +1,65 @@ +from sqlalchemy import select, exists +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import selectinload + +from src.api.endpoints.url.get.dto import GetURLsResponseInfo, GetURLsResponseErrorInfo, GetURLsResponseInnerInfo +from src.collectors.enums import URLStatus +from src.db.client.helpers import add_standard_limit_and_offset +from src.db.models.instantiations.url.core import URL +from src.db.models.instantiations.url.error_info import URLErrorInfo +from src.db.queries.base.builder import QueryBuilderBase + + +class GetURLsQueryBuilder(QueryBuilderBase): + + def __init__( + self, + page: int, + errors: bool + ): + super().__init__() + self.page = page + self.errors = errors + + async def run(self, session: AsyncSession) -> GetURLsResponseInfo: + statement = select(URL).options( + selectinload(URL.error_info), + selectinload(URL.batch) + ).order_by(URL.id) + if self.errors: + # Only return URLs with errors + statement = statement.where( + exists( + select(URLErrorInfo).where(URLErrorInfo.url_id == URL.id) + ) + ) + add_standard_limit_and_offset(statement, self.page) + execute_result = await session.execute(statement) + all_results = execute_result.scalars().all() + final_results = [] + for result in all_results: + error_results = [] + for error in result.error_info: + error_result = GetURLsResponseErrorInfo( + id=error.id, + error=error.error, + updated_at=error.updated_at + ) + error_results.append(error_result) + final_results.append( + GetURLsResponseInnerInfo( + id=result.id, + batch_id=result.batch.id if result.batch is not None else None, + url=result.url, + status=URLStatus(result.outcome), + collector_metadata=result.collector_metadata, + updated_at=result.updated_at, + created_at=result.created_at, + errors=error_results, + ) + ) + + return GetURLsResponseInfo( + urls=final_results, + count=len(final_results) + ) \ No newline at end of file diff --git a/src/api/endpoints/url/routes.py b/src/api/endpoints/url/routes.py index d746dc30..225dd5d6 100644 --- a/src/api/endpoints/url/routes.py +++ b/src/api/endpoints/url/routes.py @@ -1,7 +1,7 @@ from fastapi import APIRouter, Query, Depends from src.api.dependencies import get_async_core -from src.api.endpoints.url.dtos.response import GetURLsResponseInfo +from src.api.endpoints.url.get.dto import GetURLsResponseInfo from src.core.core import AsyncCore from src.security.manager import get_access_info from src.security.dtos.access_info import AccessInfo diff --git a/src/core/core.py b/src/core/core.py index e2709e01..78554b39 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -11,18 +11,18 @@ from src.api.endpoints.annotate.all.post.dto import AllAnnotationPostInfo from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseOuterInfo from src.api.endpoints.annotate.relevance.get.dto import GetNextRelevanceAnnotationResponseOuterInfo -from src.api.endpoints.batch.dtos.get.duplicates import GetDuplicatesByBatchResponse from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse from src.api.endpoints.batch.dtos.get.summaries.response import GetBatchSummariesResponse from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary -from src.api.endpoints.batch.dtos.get.urls import GetURLsByBatchResponse from src.api.endpoints.batch.dtos.post.abort import MessageResponse +from src.api.endpoints.batch.duplicates.dto import GetDuplicatesByBatchResponse +from src.api.endpoints.batch.urls.dto import GetURLsByBatchResponse from src.api.endpoints.collector.dtos.collector_start import CollectorStartInfo from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO from src.api.endpoints.collector.dtos.manual_batch.response import ManualBatchResponseDTO +from src.api.endpoints.metrics.batches.aggregated.dto import GetMetricsBatchesAggregatedResponseDTO +from src.api.endpoints.metrics.batches.breakdown.dto import GetMetricsBatchesBreakdownResponseDTO from src.api.endpoints.metrics.dtos.get.backlog import GetMetricsBacklogResponseDTO -from src.api.endpoints.metrics.dtos.get.batches.aggregated import GetMetricsBatchesAggregatedResponseDTO -from src.api.endpoints.metrics.dtos.get.batches.breakdown import GetMetricsBatchesBreakdownResponseDTO from src.api.endpoints.metrics.dtos.get.urls.aggregated.core import GetMetricsURLsAggregatedResponseDTO from src.api.endpoints.metrics.dtos.get.urls.aggregated.pending import GetMetricsURLsAggregatedPendingResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.pending import GetMetricsURLsBreakdownPendingResponseDTO @@ -31,9 +31,9 @@ from src.api.endpoints.review.enums import RejectionReason from src.api.endpoints.review.next.dto import GetNextURLForFinalReviewOuterResponse from src.api.endpoints.search.dtos.response import SearchURLResponse -from src.api.endpoints.task.dtos.get.task import TaskInfo +from src.api.endpoints.task.by_id.dto import TaskInfo from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse -from src.api.endpoints.url.dtos.response import GetURLsResponseInfo +from src.api.endpoints.url.get.dto import GetURLsResponseInfo from src.db.client.async_ import AsyncDatabaseClient from src.db.dtos.batch import BatchInfo from src.api.endpoints.task.dtos.get.task_status import GetTaskStatusResponseInfo diff --git a/src/core/tasks/url/manager.py b/src/core/tasks/url/manager.py index 6d03aca0..1d843b95 100644 --- a/src/core/tasks/url/manager.py +++ b/src/core/tasks/url/manager.py @@ -1,16 +1,11 @@ import logging -from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse from src.core.tasks.handler import TaskHandler from src.core.tasks.url.loader import URLTaskOperatorLoader -from src.db.client.async_ import AsyncDatabaseClient -from src.api.endpoints.task.dtos.get.task import TaskInfo from src.db.enums import TaskType from src.core.tasks.dtos.run_info import URLTaskOperatorRunInfo from src.core.tasks.url.enums import TaskOperatorOutcome from src.core.function_trigger import FunctionTrigger -from src.core.enums import BatchStatus -from discord_poster import DiscordPoster TASK_REPEAT_THRESHOLD = 20 diff --git a/src/core/tasks/url/operators/agency_identification/queries/__init__.py b/src/core/tasks/url/operators/agency_identification/queries/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/url/operators/agency_identification/queries/get_pending_urls_without_agency_suggestions.py b/src/core/tasks/url/operators/agency_identification/queries/get_pending_urls_without_agency_suggestions.py new file mode 100644 index 00000000..27459145 --- /dev/null +++ b/src/core/tasks/url/operators/agency_identification/queries/get_pending_urls_without_agency_suggestions.py @@ -0,0 +1,36 @@ +from typing import Any + +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from src.collectors.enums import URLStatus, CollectorType +from src.core.tasks.url.operators.agency_identification.dtos.tdo import AgencyIdentificationTDO +from src.db.models.instantiations.batch import Batch +from src.db.models.instantiations.link.link_batch_urls import LinkBatchURL +from src.db.models.instantiations.url.core import URL +from src.db.queries.base.builder import QueryBuilderBase +from src.db.statement_composer import StatementComposer + + +class GetPendingURLsWithoutAgencySuggestionsQueryBuilder(QueryBuilderBase): + + async def run(self, session: AsyncSession) -> list[AgencyIdentificationTDO]: + + statement = ( + select(URL.id, URL.collector_metadata, Batch.strategy) + .select_from(URL) + .where(URL.outcome == URLStatus.PENDING.value) + .join(LinkBatchURL) + .join(Batch) + ) + statement = StatementComposer.exclude_urls_with_agency_suggestions(statement) + statement = statement.limit(100) + raw_results = await session.execute(statement) + return [ + AgencyIdentificationTDO( + url_id=raw_result[0], + collector_metadata=raw_result[1], + collector_type=CollectorType(raw_result[2]) + ) + for raw_result in raw_results + ] \ No newline at end of file diff --git a/src/core/tasks/url/operators/url_html/queries/__init__.py b/src/core/tasks/url/operators/url_html/queries/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/url/operators/url_html/queries/get_pending_urls_without_html_data.py b/src/core/tasks/url/operators/url_html/queries/get_pending_urls_without_html_data.py new file mode 100644 index 00000000..6af92abe --- /dev/null +++ b/src/core/tasks/url/operators/url_html/queries/get_pending_urls_without_html_data.py @@ -0,0 +1,32 @@ +from sqlalchemy.ext.asyncio import AsyncSession + +from src.db.dto_converter import DTOConverter +from src.db.dtos.url.core import URLInfo +from src.db.models.instantiations.url.core import URL +from src.db.queries.base.builder import QueryBuilderBase +from src.db.statement_composer import StatementComposer + + +class GetPendingURLsWithoutHTMLDataQueryBuilder(QueryBuilderBase): + + async def run(self, session: AsyncSession) -> list[URLInfo]: + statement = StatementComposer.pending_urls_without_html_data() + statement = statement.limit(100).order_by(URL.id) + scalar_result = await session.scalars(statement) + url_results: list[URL] = scalar_result.all() + + final_results = [] + for url in url_results: + url_info = URLInfo( + id=url.id, + batch_id=url.batch.id if url.batch is not None else None, + url=url.url, + collector_metadata=url.collector_metadata, + outcome=url.outcome, + created_at=url.created_at, + updated_at=url.updated_at, + name=url.name + ) + final_results.append(url_info) + + return final_results diff --git a/src/core/tasks/url/operators/url_miscellaneous_metadata/queries/__init__.py b/src/core/tasks/url/operators/url_miscellaneous_metadata/queries/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/core/tasks/url/operators/url_miscellaneous_metadata/queries/get_pending_urls_missing_miscellaneous_data.py b/src/core/tasks/url/operators/url_miscellaneous_metadata/queries/get_pending_urls_missing_miscellaneous_data.py new file mode 100644 index 00000000..c4c9892f --- /dev/null +++ b/src/core/tasks/url/operators/url_miscellaneous_metadata/queries/get_pending_urls_missing_miscellaneous_data.py @@ -0,0 +1,43 @@ +from typing import Any + +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import selectinload + +from src.collectors.enums import CollectorType +from src.core.tasks.url.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo +from src.db.dtos.url.html_content import HTMLContentType +from src.db.models.instantiations.url.core import URL +from src.db.queries.base.builder import QueryBuilderBase +from src.db.statement_composer import StatementComposer + + +class GetPendingURLsMissingMiscellaneousDataQueryBuilder(QueryBuilderBase): + + + async def run(self, session: AsyncSession) -> list[URLMiscellaneousMetadataTDO]: + query = StatementComposer.pending_urls_missing_miscellaneous_metadata_query() + query = ( + query.options( + selectinload(URL.batch), + selectinload(URL.html_content) + ).limit(100).order_by(URL.id) + ) + + scalar_result = await session.scalars(query) + all_results = scalar_result.all() + final_results = [] + for result in all_results: + tdo = URLMiscellaneousMetadataTDO( + url_id=result.id, + collector_metadata=result.collector_metadata or {}, + collector_type=CollectorType(result.batch.strategy), + ) + html_info = URLHTMLMetadataInfo() + for html_content in result.html_content: + if html_content.content_type == HTMLContentType.TITLE.value: + html_info.title = html_content.content + elif html_content.content_type == HTMLContentType.DESCRIPTION.value: + html_info.description = html_content.content + tdo.html_metadata_info = html_info + final_results.append(tdo) + return final_results diff --git a/src/core/tasks/url/operators/url_miscellaneous_metadata/queries/has_pending_urls_missing_miscellaneous_data.py b/src/core/tasks/url/operators/url_miscellaneous_metadata/queries/has_pending_urls_missing_miscellaneous_data.py new file mode 100644 index 00000000..137c228a --- /dev/null +++ b/src/core/tasks/url/operators/url_miscellaneous_metadata/queries/has_pending_urls_missing_miscellaneous_data.py @@ -0,0 +1,14 @@ +from sqlalchemy.ext.asyncio import AsyncSession + +from src.db.queries.base.builder import QueryBuilderBase +from src.db.statement_composer import StatementComposer + + +class HasPendingURsMissingMiscellaneousDataQueryBuilder(QueryBuilderBase): + + async def run(self, session: AsyncSession) -> bool: + query = StatementComposer.pending_urls_missing_miscellaneous_metadata_query() + query = query.limit(1) + + scalar_result = await session.scalars(query) + return bool(scalar_result.first()) \ No newline at end of file diff --git a/src/db/client/async_.py b/src/db/client/async_.py index 00af074d..45505be5 100644 --- a/src/db/client/async_.py +++ b/src/db/client/async_.py @@ -3,15 +3,12 @@ from operator import or_ from typing import Optional, Type, Any, List, Sequence -from fastapi import HTTPException from sqlalchemy import select, exists, func, case, Select, and_, update, delete, literal, text, Row from sqlalchemy.dialects import postgresql from sqlalchemy.dialects.postgresql import insert as pg_insert from sqlalchemy.exc import IntegrityError, NoResultFound from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker -from sqlalchemy.orm import selectinload, joinedload, QueryableAttribute, aliased -from sqlalchemy.sql.functions import coalesce -from starlette import status +from sqlalchemy.orm import selectinload, QueryableAttribute from src.api.endpoints.annotate._shared.queries.get_annotation_batch_info import GetAnnotationBatchInfoQueryBuilder from src.api.endpoints.annotate._shared.queries.get_next_url_for_user_annotation import \ @@ -22,18 +19,20 @@ from src.api.endpoints.annotate.all.get.query import GetNextURLForAllAnnotationQueryBuilder from src.api.endpoints.annotate.all.post.dto import AllAnnotationPostInfo from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseInfo -from src.api.endpoints.annotate.relevance.get.dto import GetNextRelevanceAnnotationResponseInfo, \ - RelevanceAnnotationResponseInfo +from src.api.endpoints.annotate.relevance.get.dto import GetNextRelevanceAnnotationResponseInfo from src.api.endpoints.annotate.relevance.get.query import GetNextUrlForRelevanceAnnotationQueryBuilder from src.api.endpoints.batch.dtos.get.summaries.response import GetBatchSummariesResponse from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary +from src.api.endpoints.batch.duplicates.query import GetDuplicatesByBatchIDQueryBuilder +from src.api.endpoints.batch.urls.query import GetURLsByBatchQueryBuilder from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO from src.api.endpoints.collector.dtos.manual_batch.response import ManualBatchResponseDTO +from src.api.endpoints.collector.manual.query import UploadManualBatchQueryBuilder +from src.api.endpoints.metrics.batches.aggregated.dto import GetMetricsBatchesAggregatedResponseDTO +from src.api.endpoints.metrics.batches.aggregated.query import GetBatchesAggregatedMetricsQueryBuilder +from src.api.endpoints.metrics.batches.breakdown.dto import GetMetricsBatchesBreakdownResponseDTO +from src.api.endpoints.metrics.batches.breakdown.query import GetBatchesBreakdownMetricsQueryBuilder from src.api.endpoints.metrics.dtos.get.backlog import GetMetricsBacklogResponseDTO, GetMetricsBacklogResponseInnerDTO -from src.api.endpoints.metrics.dtos.get.batches.aggregated import GetMetricsBatchesAggregatedResponseDTO, \ - GetMetricsBatchesAggregatedInnerResponseDTO -from src.api.endpoints.metrics.dtos.get.batches.breakdown import GetMetricsBatchesBreakdownInnerResponseDTO, \ - GetMetricsBatchesBreakdownResponseDTO from src.api.endpoints.metrics.dtos.get.urls.aggregated.core import GetMetricsURLsAggregatedResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.pending import GetMetricsURLsBreakdownPendingResponseDTO, \ GetMetricsURLsBreakdownPendingResponseInnerDTO @@ -45,22 +44,34 @@ from src.api.endpoints.review.next.dto import GetNextURLForFinalReviewOuterResponse from src.api.endpoints.review.reject.query import RejectURLQueryBuilder from src.api.endpoints.search.dtos.response import SearchURLResponse -from src.api.endpoints.task.dtos.get.task import TaskInfo +from src.api.endpoints.task.by_id.dto import TaskInfo + +from src.api.endpoints.task.by_id.query import GetTaskInfoQueryBuilder from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse, GetTasksResponseTaskInfo -from src.api.endpoints.url.dtos.response import GetURLsResponseInfo, GetURLsResponseErrorInfo, GetURLsResponseInnerInfo +from src.api.endpoints.url.get.dto import GetURLsResponseInfo + +from src.api.endpoints.url.get.query import GetURLsQueryBuilder from src.collectors.enums import URLStatus, CollectorType from src.core.enums import BatchStatus, SuggestionType, RecordType, SuggestedStatus from src.core.env_var_manager import EnvVarManager from src.core.tasks.scheduled.operators.agency_sync.dtos.parameters import AgencySyncParameters from src.core.tasks.url.operators.agency_identification.dtos.suggestion import URLAgencySuggestionInfo from src.core.tasks.url.operators.agency_identification.dtos.tdo import AgencyIdentificationTDO -from src.core.tasks.url.operators.auto_relevant.models.annotation import RelevanceAnnotationInfo +from src.core.tasks.url.operators.agency_identification.queries.get_pending_urls_without_agency_suggestions import \ + GetPendingURLsWithoutAgencySuggestionsQueryBuilder from src.core.tasks.url.operators.auto_relevant.models.tdo import URLRelevantTDO from src.core.tasks.url.operators.auto_relevant.queries.get_tdos import GetAutoRelevantTDOsQueryBuilder from src.core.tasks.url.operators.submit_approved_url.tdo import SubmitApprovedURLTDO, SubmittedURLInfo from src.core.tasks.url.operators.url_404_probe.tdo import URL404ProbeTDO from src.core.tasks.url.operators.url_duplicate.tdo import URLDuplicateTDO -from src.core.tasks.url.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO, URLHTMLMetadataInfo +from src.core.tasks.url.operators.url_html.queries.get_pending_urls_without_html_data import \ + GetPendingURLsWithoutHTMLDataQueryBuilder +from src.core.tasks.url.operators.url_miscellaneous_metadata.queries.get_pending_urls_missing_miscellaneous_data import \ + GetPendingURLsMissingMiscellaneousDataQueryBuilder +from src.core.tasks.url.operators.url_miscellaneous_metadata.queries.has_pending_urls_missing_miscellaneous_data import \ + HasPendingURsMissingMiscellaneousDataQueryBuilder +from src.core.tasks.url.operators.url_miscellaneous_metadata.tdo import URLMiscellaneousMetadataTDO +from src.db.client.helpers import add_standard_limit_and_offset from src.db.client.types import UserSuggestionModel from src.db.config_manager import ConfigManager from src.db.constants import PLACEHOLDER_AGENCY_NAME @@ -71,7 +82,7 @@ from src.db.dtos.url.annotations.auto.relevancy import AutoRelevancyAnnotationInput from src.db.dtos.url.core import URLInfo from src.db.dtos.url.error import URLErrorPydanticInfo -from src.db.dtos.url.html_content import URLHTMLContentInfo, HTMLContentType +from src.db.dtos.url.html_content import URLHTMLContentInfo from src.db.dtos.url.insert import InsertURLsInfo from src.db.dtos.url.mapping import URLMapping from src.db.dtos.url.raw_html import RawHTMLInfo @@ -81,7 +92,8 @@ from src.db.models.instantiations.batch import Batch from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency from src.db.models.instantiations.duplicate import Duplicate -from src.db.models.instantiations.link_task_url import LinkTaskURL +from src.db.models.instantiations.link.link_batch_urls import LinkBatchURL +from src.db.models.instantiations.link.link_task_url import LinkTaskURL from src.db.models.instantiations.log import Log from src.db.models.instantiations.root_url_cache import RootURL from src.db.models.instantiations.sync_state_agencies import AgenciesSyncState @@ -95,7 +107,6 @@ from src.db.models.instantiations.url.html_content import URLHTMLContent from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata from src.db.models.instantiations.url.probed_for_404 import URLProbedFor404 -from src.db.models.instantiations.url.reviewing_user import ReviewingUserURL from src.db.models.instantiations.url.suggestion.agency.auto import AutomatedUrlAgencySuggestion from src.db.models.instantiations.url.suggestion.agency.user import UserUrlAgencySuggestion from src.db.models.instantiations.url.suggestion.record_type.auto import AutoRecordTypeSuggestion @@ -115,11 +126,6 @@ from src.external.pdap.dtos.agencies_sync import AgenciesSyncResponseInnerInfo -def add_standard_limit_and_offset(statement, page, limit=100): - offset = (page - 1) * limit - return statement.limit(limit).offset(offset) - - class AsyncDatabaseClient: def __init__(self, db_url: Optional[str] = None): if db_url is None: @@ -229,7 +235,7 @@ async def run_query_builder( session: AsyncSession, builder: QueryBuilderBase ) -> Any: - return await builder.run(session) + return await builder.run(session=session) # region relevant async def add_auto_relevant_suggestion( @@ -460,45 +466,13 @@ async def has_pending_urls_without_html_data(self, session: AsyncSession) -> boo scalar_result = await session.scalars(statement) return bool(scalar_result.first()) - @session_manager - async def has_pending_urls_missing_miscellaneous_metadata(self, session: AsyncSession) -> bool: - query = StatementComposer.pending_urls_missing_miscellaneous_metadata_query() - query = query.limit(1) - - scalar_result = await session.scalars(query) - return bool(scalar_result.first()) + async def has_pending_urls_missing_miscellaneous_metadata(self) -> bool: + return await self.run_query_builder(HasPendingURsMissingMiscellaneousDataQueryBuilder()) - @session_manager async def get_pending_urls_missing_miscellaneous_metadata( self, - session: AsyncSession ) -> list[URLMiscellaneousMetadataTDO]: - query = StatementComposer.pending_urls_missing_miscellaneous_metadata_query() - query = ( - query.options( - selectinload(URL.batch), - selectinload(URL.html_content) - ).limit(100).order_by(URL.id) - ) - - scalar_result = await session.scalars(query) - all_results = scalar_result.all() - final_results = [] - for result in all_results: - tdo = URLMiscellaneousMetadataTDO( - url_id=result.id, - collector_metadata=result.collector_metadata or {}, - collector_type=CollectorType(result.batch.strategy), - ) - html_info = URLHTMLMetadataInfo() - for html_content in result.html_content: - if html_content.content_type == HTMLContentType.TITLE.value: - html_info.title = html_content.content - elif html_content.content_type == HTMLContentType.DESCRIPTION.value: - html_info.description = html_content.content - tdo.html_metadata_info = html_info - final_results.append(tdo) - return final_results + return await self.run_query_builder(GetPendingURLsMissingMiscellaneousDataQueryBuilder()) @session_manager async def add_miscellaneous_metadata(self, session: AsyncSession, tdos: list[URLMiscellaneousMetadataTDO]): @@ -528,14 +502,8 @@ async def add_miscellaneous_metadata(self, session: AsyncSession, tdos: list[URL ) session.add(metadata_object) - @session_manager - async def get_pending_urls_without_html_data(self, session: AsyncSession) -> list[URLInfo]: - # TODO: Add test that includes some urls WITH html data. Check they're not returned - statement = self.statement_composer.pending_urls_without_html_data() - statement = statement.limit(100).order_by(URL.id) - scalar_result = await session.scalars(statement) - results: list[URL] = scalar_result.all() - return DTOConverter.url_list_to_url_info_list(results) + async def get_pending_urls_without_html_data(self) -> list[URLInfo]: + return await self.run_query_builder(GetPendingURLsWithoutHTMLDataQueryBuilder()) async def get_urls_with_html_data_and_without_models( self, @@ -629,48 +597,15 @@ async def add_to_root_url_cache(self, url: str, page_title: str) -> None: cache = RootURL(url=url, page_title=page_title) await self.add(cache) - @session_manager - async def get_urls(self, session: AsyncSession, page: int, errors: bool) -> GetURLsResponseInfo: - statement = select(URL).options( - selectinload(URL.error_info) - ).order_by(URL.id) - if errors: - # Only return URLs with errors - statement = statement.where( - exists( - select(URLErrorInfo).where(URLErrorInfo.url_id == URL.id) - ) - ) - add_standard_limit_and_offset(statement, page) - execute_result = await session.execute(statement) - all_results = execute_result.scalars().all() - final_results = [] - for result in all_results: - error_results = [] - for error in result.error_info: - error_result = GetURLsResponseErrorInfo( - id=error.id, - error=error.error, - updated_at=error.updated_at - ) - error_results.append(error_result) - final_results.append( - GetURLsResponseInnerInfo( - id=result.id, - batch_id=result.batch_id, - url=result.url, - status=URLStatus(result.outcome), - collector_metadata=result.collector_metadata, - updated_at=result.updated_at, - created_at=result.created_at, - errors=error_results, - ) - ) + async def get_urls( + self, + page: int, + errors: bool + ) -> GetURLsResponseInfo: + return await self.run_query_builder(GetURLsQueryBuilder( + page=page, errors=errors + )) - return GetURLsResponseInfo( - urls=final_results, - count=len(final_results) - ) @session_manager async def initiate_task( @@ -701,52 +636,11 @@ async def add_task_error(self, task_id: int, error: str): ) await self.add(task_error) - @session_manager - async def get_task_info(self, session: AsyncSession, task_id: int) -> TaskInfo: - # Get Task - result = await session.execute( - select(Task) - .where(Task.id == task_id) - .options( - selectinload(Task.urls), - selectinload(Task.error), - selectinload(Task.errored_urls) - ) - ) - task = result.scalars().first() - error = task.error[0].error if len(task.error) > 0 else None - # Get error info if any - # Get URLs - urls = task.urls - url_infos = [] - for url in urls: - url_info = URLInfo( - id=url.id, - batch_id=url.batch_id, - url=url.url, - collector_metadata=url.collector_metadata, - outcome=URLStatus(url.outcome), - updated_at=url.updated_at - ) - url_infos.append(url_info) - - errored_urls = [] - for url in task.errored_urls: - url_error_info = URLErrorPydanticInfo( - task_id=url.task_id, - url_id=url.url_id, - error=url.error, - updated_at=url.updated_at - ) - errored_urls.append(url_error_info) - return TaskInfo( - task_type=TaskType(task.task_type), - task_status=BatchStatus(task.task_status), - error_info=error, - updated_at=task.updated_at, - urls=url_infos, - url_errors=errored_urls - ) + async def get_task_info( + self, + task_id: int + ) -> TaskInfo: + return await self.run_query_builder(GetTaskInfoQueryBuilder(task_id)) async def get_html_content_info(self, url_id: int) -> list[URLHTMLContentInfo]: return await self.run_query_builder(GetHTMLContentInfoQueryBuilder(url_id)) @@ -833,35 +727,12 @@ async def has_urls_without_agency_suggestions( result = raw_result.all() return len(result) != 0 - @session_manager async def get_urls_without_agency_suggestions( - self, session: AsyncSession + self ) -> list[AgencyIdentificationTDO]: - """ - Retrieve URLs without confirmed or suggested agencies - Args: - session: - - Returns: - - """ + """Retrieve URLs without confirmed or suggested agencies.""" + return await self.run_query_builder(GetPendingURLsWithoutAgencySuggestionsQueryBuilder()) - statement = ( - select(URL.id, URL.collector_metadata, Batch.strategy) - .where(URL.outcome == URLStatus.PENDING.value) - .join(Batch) - ) - statement = self.statement_composer.exclude_urls_with_agency_suggestions(statement) - statement = statement.limit(100) - raw_results = await session.execute(statement) - return [ - AgencyIdentificationTDO( - url_id=raw_result[0], - collector_metadata=raw_result[1], - collector_type=CollectorType(raw_result[2]) - ) - for raw_result in raw_results - ] async def get_next_url_agency_for_annotation( self, @@ -1005,19 +876,17 @@ async def get_batch_by_id(self, session, batch_id: int) -> Optional[BatchSummary batch_summary = summaries[0] return batch_summary - @session_manager - async def get_urls_by_batch(self, session, batch_id: int, page: int = 1) -> List[URLInfo]: + async def get_urls_by_batch(self, batch_id: int, page: int = 1) -> list[URLInfo]: """Retrieve all URLs associated with a batch.""" - query = Select(URL).where(URL.batch_id == batch_id).order_by(URL.id).limit(100).offset((page - 1) * 100) - result = await session.execute(query) - urls = result.scalars().all() - return ([URLInfo(**url.__dict__) for url in urls]) + return await self.run_query_builder(GetURLsByBatchQueryBuilder( + batch_id=batch_id, + page=page + )) @session_manager async def insert_url(self, session: AsyncSession, url_info: URLInfo) -> int: """Insert a new URL into the database.""" url_entry = URL( - batch_id=url_info.batch_id, url=url_info.url, collector_metadata=url_info.collector_metadata, outcome=url_info.outcome.value @@ -1026,6 +895,10 @@ async def insert_url(self, session: AsyncSession, url_info: URLInfo) -> int: url_entry.created_at = url_info.created_at session.add(url_entry) await session.flush() + link = LinkBatchURL( + batch_id=url_info.batch_id, + url_id=url_entry.id + ) return url_entry.id @session_manager @@ -1208,43 +1081,11 @@ async def mark_urls_as_submitted(self, session: AsyncSession, infos: list[Submit await session.execute(query) - @session_manager - async def get_duplicates_by_batch_id(self, session, batch_id: int, page: int) -> List[DuplicateInfo]: - original_batch = aliased(Batch) - duplicate_batch = aliased(Batch) - - query = ( - Select( - URL.url.label("source_url"), - URL.id.label("original_url_id"), - duplicate_batch.id.label("duplicate_batch_id"), - duplicate_batch.parameters.label("duplicate_batch_parameters"), - original_batch.id.label("original_batch_id"), - original_batch.parameters.label("original_batch_parameters"), - ) - .select_from(Duplicate) - .join(URL, Duplicate.original_url_id == URL.id) - .join(duplicate_batch, Duplicate.batch_id == duplicate_batch.id) - .join(original_batch, URL.batch_id == original_batch.id) - .filter(duplicate_batch.id == batch_id) - .limit(100) - .offset((page - 1) * 100) - ) - raw_results = await session.execute(query) - results = raw_results.all() - final_results = [] - for result in results: - final_results.append( - DuplicateInfo( - source_url=result.source_url, - duplicate_batch_id=result.duplicate_batch_id, - duplicate_metadata=result.duplicate_batch_parameters, - original_batch_id=result.original_batch_id, - original_metadata=result.original_batch_parameters, - original_url_id=result.original_url_id - ) - ) - return final_results + async def get_duplicates_by_batch_id(self, batch_id: int, page: int) -> list[DuplicateInfo]: + return await self.run_query_builder(GetDuplicatesByBatchIDQueryBuilder( + batch_id=batch_id, + page=page + )) @session_manager async def get_batch_summaries( @@ -1324,61 +1165,16 @@ async def add_all_annotations_to_url( ) session.add(agency_suggestion) - @session_manager async def upload_manual_batch( self, - session: AsyncSession, user_id: int, dto: ManualBatchInputDTO ) -> ManualBatchResponseDTO: - batch = Batch( - strategy=CollectorType.MANUAL.value, - status=BatchStatus.READY_TO_LABEL.value, - parameters={ - "name": dto.name - }, - user_id=user_id - ) - session.add(batch) - await session.flush() - - batch_id = batch.id - url_ids = [] - duplicate_urls = [] - - for entry in dto.entries: - url = URL( - url=entry.url, - name=entry.name, - description=entry.description, - batch_id=batch_id, - collector_metadata=entry.collector_metadata, - outcome=URLStatus.PENDING.value, - record_type=entry.record_type.value if entry.record_type is not None else None, - ) - - async with session.begin_nested(): - try: - session.add(url) - await session.flush() - except IntegrityError: - duplicate_urls.append(entry.url) - continue - await session.flush() - optional_metadata = URLOptionalDataSourceMetadata( - url_id=url.id, - record_formats=entry.record_formats, - data_portal_type=entry.data_portal_type, - supplying_entity=entry.supplying_entity, - ) - session.add(optional_metadata) - url_ids.append(url.id) + return await self.run_query_builder(UploadManualBatchQueryBuilder( + user_id=user_id, + dto=dto + )) - return ManualBatchResponseDTO( - batch_id=batch_id, - urls=url_ids, - duplicate_urls=duplicate_urls - ) @session_manager async def search_for_url(self, session: AsyncSession, url: str) -> SearchURLResponse: @@ -1395,179 +1191,20 @@ async def search_for_url(self, session: AsyncSession, url: str) -> SearchURLResp url_id=url.id ) - @session_manager - async def get_batches_aggregated_metrics(self, session: AsyncSession) -> GetMetricsBatchesAggregatedResponseDTO: - sc = StatementComposer - - # First, get all batches broken down by collector type and status - def batch_column(status: BatchStatus, label): - return sc.count_distinct( - case( - ( - Batch.status == status.value, - Batch.id - ) - ), - label=label - ) - - batch_count_subquery = select( - batch_column(BatchStatus.READY_TO_LABEL, label="done_count"), - batch_column(BatchStatus.ERROR, label="error_count"), - Batch.strategy, - ).group_by(Batch.strategy).subquery("batch_count") - - def url_column(status: URLStatus, label): - return sc.count_distinct( - case( - ( - URL.outcome == status.value, - URL.id - ) - ), - label=label - ) - - # Next, count urls - url_count_subquery = select( - Batch.strategy, - url_column(URLStatus.PENDING, label="pending_count"), - url_column(URLStatus.ERROR, label="error_count"), - url_column(URLStatus.VALIDATED, label="validated_count"), - url_column(URLStatus.SUBMITTED, label="submitted_count"), - url_column(URLStatus.NOT_RELEVANT, label="rejected_count"), - - ).outerjoin( - Batch, Batch.id == URL.batch_id - ).group_by( - Batch.strategy - ).subquery("url_count") - - # Combine - query = select( - Batch.strategy, - batch_count_subquery.c.done_count.label("batch_done_count"), - batch_count_subquery.c.error_count.label("batch_error_count"), - coalesce(url_count_subquery.c.pending_count, 0).label("pending_count"), - coalesce(url_count_subquery.c.error_count, 0).label("error_count"), - coalesce(url_count_subquery.c.submitted_count, 0).label("submitted_count"), - coalesce(url_count_subquery.c.rejected_count, 0).label("rejected_count"), - coalesce(url_count_subquery.c.validated_count, 0).label("validated_count") - ).join( - batch_count_subquery, - Batch.strategy == batch_count_subquery.c.strategy - ).outerjoin( - url_count_subquery, - Batch.strategy == url_count_subquery.c.strategy - ) - raw_results = await session.execute(query) - results = raw_results.all() - d: dict[CollectorType, GetMetricsBatchesAggregatedInnerResponseDTO] = {} - for result in results: - d[CollectorType(result.strategy)] = GetMetricsBatchesAggregatedInnerResponseDTO( - count_successful_batches=result.batch_done_count, - count_failed_batches=result.batch_error_count, - count_urls=result.pending_count + result.submitted_count + - result.rejected_count + result.error_count + - result.validated_count, - count_urls_pending=result.pending_count, - count_urls_validated=result.validated_count, - count_urls_submitted=result.submitted_count, - count_urls_rejected=result.rejected_count, - count_urls_errors=result.error_count - ) - - total_batch_query = await session.execute( - select( - sc.count_distinct(Batch.id, label="count") - ) + async def get_batches_aggregated_metrics(self) -> GetMetricsBatchesAggregatedResponseDTO: + return await self.run_query_builder( + GetBatchesAggregatedMetricsQueryBuilder() ) - total_batch_count = total_batch_query.scalars().one_or_none() - if total_batch_count is None: - total_batch_count = 0 - return GetMetricsBatchesAggregatedResponseDTO( - total_batches=total_batch_count, - by_strategy=d - ) - @session_manager async def get_batches_breakdown_metrics( self, - session: AsyncSession, page: int ) -> GetMetricsBatchesBreakdownResponseDTO: - sc = StatementComposer - - main_query = select( - Batch.strategy, - Batch.id, - Batch.status, - Batch.date_generated.label("created_at"), - ) - - def url_column(status: URLStatus, label): - return sc.count_distinct( - case( - ( - URL.outcome == status.value, - URL.id - ) - ), - label=label - ) - - count_query = select( - URL.batch_id, - sc.count_distinct(URL.id, label="count_total"), - url_column(URLStatus.PENDING, label="count_pending"), - url_column(URLStatus.SUBMITTED, label="count_submitted"), - url_column(URLStatus.NOT_RELEVANT, label="count_rejected"), - url_column(URLStatus.ERROR, label="count_error"), - url_column(URLStatus.VALIDATED, label="count_validated"), - ).group_by( - URL.batch_id - ).subquery("url_count") - - query = (select( - main_query.c.strategy, - main_query.c.id, - main_query.c.created_at, - main_query.c.status, - coalesce(count_query.c.count_total, 0).label("count_total"), - coalesce(count_query.c.count_pending, 0).label("count_pending"), - coalesce(count_query.c.count_submitted, 0).label("count_submitted"), - coalesce(count_query.c.count_rejected, 0).label("count_rejected"), - coalesce(count_query.c.count_error, 0).label("count_error"), - coalesce(count_query.c.count_validated, 0).label("count_validated"), - ).outerjoin( - count_query, - main_query.c.id == count_query.c.batch_id - ).offset( - (page - 1) * 100 - ).order_by( - main_query.c.created_at.asc() - )) - - raw_results = await session.execute(query) - results = raw_results.all() - batches: list[GetMetricsBatchesBreakdownInnerResponseDTO] = [] - for result in results: - dto = GetMetricsBatchesBreakdownInnerResponseDTO( - batch_id=result.id, - strategy=CollectorType(result.strategy), - status=BatchStatus(result.status), - created_at=result.created_at, - count_url_total=result.count_total, - count_url_pending=result.count_pending, - count_url_submitted=result.count_submitted, - count_url_rejected=result.count_rejected, - count_url_error=result.count_error, - count_url_validated=result.count_validated + return await self.run_query_builder( + GetBatchesBreakdownMetricsQueryBuilder( + page=page ) - batches.append(dto) - return GetMetricsBatchesBreakdownResponseDTO( - batches=batches, ) @session_manager diff --git a/src/db/client/helpers.py b/src/db/client/helpers.py new file mode 100644 index 00000000..74099bb4 --- /dev/null +++ b/src/db/client/helpers.py @@ -0,0 +1,3 @@ +def add_standard_limit_and_offset(statement, page, limit=100): + offset = (page - 1) * limit + return statement.limit(limit).offset(offset) diff --git a/src/db/client/sync.py b/src/db/client/sync.py index e62edf08..8ec13085 100644 --- a/src/db/client/sync.py +++ b/src/db/client/sync.py @@ -1,7 +1,7 @@ from functools import wraps from typing import Optional, List -from sqlalchemy import create_engine, update +from sqlalchemy import create_engine, update, Select from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import sessionmaker, scoped_session, Session @@ -13,6 +13,7 @@ from src.db.dtos.log import LogInfo from src.db.dtos.url.core import URLInfo from src.db.dtos.url.mapping import URLMapping +from src.db.models.instantiations.link.link_batch_urls import LinkBatchURL from src.db.models.templates import Base from src.db.models.instantiations.duplicate import Duplicate from src.db.models.instantiations.log import Log @@ -58,7 +59,7 @@ def wrapper(self, *args, **kwargs): return wrapper @session_manager - def insert_batch(self, session, batch_info: BatchInfo) -> int: + def insert_batch(self, session: Session, batch_info: BatchInfo) -> int: """Insert a new batch into the database and return its ID.""" batch = Batch( strategy=batch_info.strategy, @@ -80,14 +81,22 @@ def insert_batch(self, session, batch_info: BatchInfo) -> int: return batch.id @session_manager - def get_batch_by_id(self, session, batch_id: int) -> Optional[BatchInfo]: + def get_batch_by_id( + self, + session: Session, + batch_id: int + ) -> BatchInfo | None: """Retrieve a batch by ID.""" batch = session.query(Batch).filter_by(id=batch_id).first() return BatchInfo(**batch.__dict__) @session_manager - def insert_duplicates(self, session, duplicate_infos: list[DuplicateInsertInfo]): + def insert_duplicates( + self, + session: Session, + duplicate_infos: list[DuplicateInsertInfo] + ): for duplicate_info in duplicate_infos: duplicate = Duplicate( batch_id=duplicate_info.duplicate_batch_id, @@ -97,7 +106,10 @@ def insert_duplicates(self, session, duplicate_infos: list[DuplicateInsertInfo]) @session_manager - def get_url_info_by_url(self, session, url: str) -> Optional[URLInfo]: + def get_url_info_by_url( + self, + session: Session, url: str + ) -> URLInfo | None: url = session.query(URL).filter_by(url=url).first() return URLInfo(**url.__dict__) @@ -105,7 +117,6 @@ def get_url_info_by_url(self, session, url: str) -> Optional[URLInfo]: def insert_url(self, session, url_info: URLInfo) -> int: """Insert a new URL into the database.""" url_entry = URL( - batch_id=url_info.batch_id, url=url_info.url, collector_metadata=url_info.collector_metadata, outcome=url_info.outcome.value, @@ -116,6 +127,11 @@ def insert_url(self, session, url_info: URLInfo) -> int: session.add(url_entry) session.commit() session.refresh(url_entry) + link = LinkBatchURL( + batch_id=url_info.batch_id, + url_id=url_entry.id + ) + session.add(link) return url_entry.id def insert_urls(self, url_infos: List[URLInfo], batch_id: int) -> InsertURLsInfo: @@ -144,14 +160,31 @@ def insert_urls(self, url_infos: List[URLInfo], batch_id: int) -> InsertURLsInfo ) @session_manager - def get_urls_by_batch(self, session, batch_id: int, page: int = 1) -> List[URLInfo]: + def get_urls_by_batch( + self, + session: Session, + batch_id: int, + page: int = 1 + ) -> list[URLInfo]: """Retrieve all URLs associated with a batch.""" - urls = (session.query(URL).filter_by(batch_id=batch_id) - .order_by(URL.id).limit(100).offset((page - 1) * 100).all()) + query = ( + Select(URL) + .join(LinkBatchURL) + .where(LinkBatchURL.batch_id == batch_id) + .order_by(URL.id) + .limit(100) + .offset((page - 1) * 100) + ) + urls = session.scalars(query).all() + return ([URLInfo(**url.__dict__) for url in urls]) @session_manager - def insert_logs(self, session, log_infos: List[LogInfo]): + def insert_logs( + self, + session: Session, + log_infos: List[LogInfo] + ): for log_info in log_infos: log = Log(log=log_info.log, batch_id=log_info.batch_id) if log_info.created_at is not None: @@ -159,12 +192,20 @@ def insert_logs(self, session, log_infos: List[LogInfo]): session.add(log) @session_manager - def get_batch_status(self, session, batch_id: int) -> BatchStatus: + def get_batch_status( + self, + session: Session, + batch_id: int + ) -> BatchStatus: batch = session.query(Batch).filter_by(id=batch_id).first() return BatchStatus(batch.status) @session_manager - def update_url(self, session, url_info: URLInfo): + def update_url( + self, + session: Session, + url_info: URLInfo + ): url = session.query(URL).filter_by(id=url_info.id).first() url.collector_metadata = url_info.collector_metadata diff --git a/src/db/dto_converter.py b/src/db/dto_converter.py index c9b7dc0c..5397c803 100644 --- a/src/db/dto_converter.py +++ b/src/db/dto_converter.py @@ -176,24 +176,6 @@ def final_review_annotation_agency_info( def url_list_to_url_with_html_list(url_list: list[URL]) -> list[URLWithHTML]: return [DTOConverter.url_to_url_with_html(url) for url in url_list] - @staticmethod - def url_list_to_url_info_list(urls: list[URL]) -> list[URLInfo]: - results = [] - for url in urls: - url_info = URLInfo( - id=url.id, - batch_id=url.batch_id, - url=url.url, - collector_metadata=url.collector_metadata, - outcome=url.outcome, - created_at=url.created_at, - updated_at=url.updated_at, - name=url.name - ) - results.append(url_info) - - return results - @staticmethod def url_to_url_with_html(url: URL) -> URLWithHTML: url_val = url.url diff --git a/src/db/models/instantiations/batch.py b/src/db/models/instantiations/batch.py index 55bc1b01..89645f4a 100644 --- a/src/db/models/instantiations/batch.py +++ b/src/db/models/instantiations/batch.py @@ -46,7 +46,11 @@ class Batch(StandardModel): parameters = Column(JSON) # Relationships - urls = relationship("URL", back_populates="batch") + urls = relationship( + "URL", + secondary="link_batch_urls", + back_populates="batch" + ) # missings = relationship("Missing", back_populates="batch") # Not in active use logs = relationship("Log", back_populates="batch") duplicates = relationship("Duplicate", back_populates="batch") diff --git a/src/db/models/instantiations/link/__init__.py b/src/db/models/instantiations/link/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/db/models/instantiations/link/link_batch_urls.py b/src/db/models/instantiations/link/link_batch_urls.py new file mode 100644 index 00000000..f357ae6a --- /dev/null +++ b/src/db/models/instantiations/link/link_batch_urls.py @@ -0,0 +1,17 @@ +from sqlalchemy.orm import relationship + +from src.db.models.mixins import CreatedAtMixin, UpdatedAtMixin, BatchDependentMixin, URLDependentMixin +from src.db.models.templates import StandardModel + + +class LinkBatchURL( + UpdatedAtMixin, + CreatedAtMixin, + URLDependentMixin, + BatchDependentMixin, + StandardModel +): + __tablename__ = "link_batch_urls" + + url = relationship('URL') + batch = relationship('Batch') \ No newline at end of file diff --git a/src/db/models/instantiations/link_task_url.py b/src/db/models/instantiations/link/link_task_url.py similarity index 100% rename from src/db/models/instantiations/link_task_url.py rename to src/db/models/instantiations/link/link_task_url.py diff --git a/src/db/models/instantiations/url/core.py b/src/db/models/instantiations/url/core.py index 72fdf628..8e9860fc 100644 --- a/src/db/models/instantiations/url/core.py +++ b/src/db/models/instantiations/url/core.py @@ -11,7 +11,6 @@ class URL(UpdatedAtMixin, CreatedAtMixin, StandardModel): __tablename__ = 'urls' # The batch this URL is associated with - batch_id = Column(Integer, ForeignKey('batches.id', name='fk_url_batch_id'), nullable=False) url = Column(Text, unique=True) name = Column(String) description = Column(Text) @@ -35,7 +34,12 @@ class URL(UpdatedAtMixin, CreatedAtMixin, StandardModel): record_type = Column(postgresql.ENUM(*record_type_values, name='record_type'), nullable=True) # Relationships - batch = relationship("Batch", back_populates="urls") + batch = relationship( + "Batch", + secondary="link_batch_urls", + back_populates="urls", + uselist=False + ) duplicates = relationship("Duplicate", back_populates="original_url") html_content = relationship("URLHTMLContent", back_populates="url", cascade="all, delete-orphan") error_info = relationship("URLErrorInfo", back_populates="url", cascade="all, delete-orphan") diff --git a/src/db/queries/implementations/core/get/recent_batch_summaries/url_counts/builder.py b/src/db/queries/implementations/core/get/recent_batch_summaries/url_counts/builder.py index 564c68f6..571db2a0 100644 --- a/src/db/queries/implementations/core/get/recent_batch_summaries/url_counts/builder.py +++ b/src/db/queries/implementations/core/get/recent_batch_summaries/url_counts/builder.py @@ -5,6 +5,7 @@ from src.collectors.enums import URLStatus, CollectorType from src.core.enums import BatchStatus +from src.db.models.instantiations.link.link_batch_urls import LinkBatchURL from src.db.models.instantiations.url.core import URL from src.db.models.instantiations.batch import Batch from src.db.queries.base.builder import QueryBuilderBase @@ -41,7 +42,10 @@ def get_core_query(self): self.count_case_url_status(URLStatus.NOT_RELEVANT, labels.not_relevant), self.count_case_url_status(URLStatus.ERROR, labels.error), self.count_case_url_status(URLStatus.DUPLICATE, labels.duplicate), - ).outerjoin( + ) + .select_from(Batch) + .outerjoin(LinkBatchURL) + .outerjoin( URL ) ) @@ -68,9 +72,9 @@ def apply_pending_urls_filter(self, query: Select): return query pending_url_subquery = ( exists( - Select(URL).where( + Select(URL).join(LinkBatchURL).where( and_( - URL.batch_id == Batch.id, + LinkBatchURL.batch_id == Batch.id, URL.outcome == URLStatus.PENDING.value ) ) diff --git a/src/db/statement_composer.py b/src/db/statement_composer.py index b712a581..9d5faa97 100644 --- a/src/db/statement_composer.py +++ b/src/db/statement_composer.py @@ -1,14 +1,15 @@ from typing import Any from sqlalchemy import Select, select, exists, func, Subquery, and_, not_, ColumnElement -from sqlalchemy.orm import aliased +from sqlalchemy.orm import aliased, selectinload from src.collectors.enums import URLStatus from src.core.enums import BatchStatus from src.db.constants import STANDARD_ROW_LIMIT from src.db.enums import TaskType from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency -from src.db.models.instantiations.link_task_url import LinkTaskURL +from src.db.models.instantiations.link.link_batch_urls import LinkBatchURL +from src.db.models.instantiations.link.link_task_url import LinkTaskURL from src.db.models.instantiations.task.core import Task from src.db.models.instantiations.url.html_content import URLHTMLContent from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata @@ -39,6 +40,9 @@ def pending_urls_without_html_data() -> Select: where(URLHTMLContent.id == None). where(~exists(exclude_subquery)). where(URL.outcome == URLStatus.PENDING.value) + .options( + selectinload(URL.batch) + ) ) return query @@ -92,6 +96,8 @@ def pending_urls_missing_miscellaneous_metadata_query() -> Select: ) ).outerjoin( URLOptionalDataSourceMetadata + ).join( + LinkBatchURL ).join( Batch ) diff --git a/src/util/alembic_helpers.py b/src/util/alembic_helpers.py index c6b60002..3eb18773 100644 --- a/src/util/alembic_helpers.py +++ b/src/util/alembic_helpers.py @@ -54,7 +54,7 @@ def alter_enum_value( """ op.execute(f"ALTER TYPE {enum_name} RENAME VALUE '{old_value}' TO '{new_value}'") -def id_column(): +def id_column() -> sa.Column: """Returns a standard `id` column.""" return sa.Column( 'id', @@ -64,7 +64,7 @@ def id_column(): nullable=False ) -def created_at_column(): +def created_at_column() -> sa.Column: """Returns a standard `created_at` column.""" return sa.Column( 'created_at', @@ -73,7 +73,7 @@ def created_at_column(): nullable=False ) -def updated_at_column(): +def updated_at_column() -> sa.Column: """Returns a standard `updated_at` column.""" return sa.Column( 'updated_at', @@ -83,8 +83,8 @@ def updated_at_column(): nullable=False ) -def url_id_column(): - sa.Column( +def url_id_column() -> sa.Column: + return sa.Column( 'url_id', sa.Integer(), sa.ForeignKey( @@ -92,4 +92,15 @@ def url_id_column(): ondelete='CASCADE' ), nullable=False - ), \ No newline at end of file + ) + +def batch_id_column(nullable=False) -> sa.Column: + return sa.Column( + 'batch_id', + sa.Integer(), + sa.ForeignKey( + 'batches.id', + ondelete='CASCADE' + ), + nullable=nullable + ) \ No newline at end of file diff --git a/tests/automated/integration/api/_helpers/RequestValidator.py b/tests/automated/integration/api/_helpers/RequestValidator.py index e3b43f39..33c3120d 100644 --- a/tests/automated/integration/api/_helpers/RequestValidator.py +++ b/tests/automated/integration/api/_helpers/RequestValidator.py @@ -13,17 +13,17 @@ from src.api.endpoints.annotate.dtos.record_type.response import GetNextRecordTypeAnnotationResponseOuterInfo from src.api.endpoints.annotate.relevance.get.dto import GetNextRelevanceAnnotationResponseOuterInfo from src.api.endpoints.annotate.relevance.post.dto import RelevanceAnnotationPostInfo -from src.api.endpoints.batch.dtos.get.duplicates import GetDuplicatesByBatchResponse from src.api.endpoints.batch.dtos.get.logs import GetBatchLogsResponse from src.api.endpoints.batch.dtos.get.summaries.response import GetBatchSummariesResponse from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary -from src.api.endpoints.batch.dtos.get.urls import GetURLsByBatchResponse from src.api.endpoints.batch.dtos.post.abort import MessageResponse +from src.api.endpoints.batch.duplicates.dto import GetDuplicatesByBatchResponse +from src.api.endpoints.batch.urls.dto import GetURLsByBatchResponse from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInputDTO from src.api.endpoints.collector.dtos.manual_batch.response import ManualBatchResponseDTO +from src.api.endpoints.metrics.batches.aggregated.dto import GetMetricsBatchesAggregatedResponseDTO +from src.api.endpoints.metrics.batches.breakdown.dto import GetMetricsBatchesBreakdownResponseDTO from src.api.endpoints.metrics.dtos.get.backlog import GetMetricsBacklogResponseDTO -from src.api.endpoints.metrics.dtos.get.batches.aggregated import GetMetricsBatchesAggregatedResponseDTO -from src.api.endpoints.metrics.dtos.get.batches.breakdown import GetMetricsBatchesBreakdownResponseDTO from src.api.endpoints.metrics.dtos.get.urls.aggregated.core import GetMetricsURLsAggregatedResponseDTO from src.api.endpoints.metrics.dtos.get.urls.aggregated.pending import GetMetricsURLsAggregatedPendingResponseDTO from src.api.endpoints.metrics.dtos.get.urls.breakdown.pending import GetMetricsURLsBreakdownPendingResponseDTO @@ -32,10 +32,10 @@ from src.api.endpoints.review.next.dto import GetNextURLForFinalReviewOuterResponse from src.api.endpoints.review.reject.dto import FinalReviewRejectionInfo from src.api.endpoints.search.dtos.response import SearchURLResponse +from src.api.endpoints.task.by_id.dto import TaskInfo from src.api.endpoints.task.dtos.get.tasks import GetTasksResponse -from src.api.endpoints.url.dtos.response import GetURLsResponseInfo from src.api.endpoints.task.dtos.get.task_status import GetTaskStatusResponseInfo -from src.api.endpoints.task.dtos.get.task import TaskInfo +from src.api.endpoints.url.get.dto import GetURLsResponseInfo from src.db.enums import TaskType from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO from src.collectors.enums import CollectorType diff --git a/tests/automated/integration/api/test_duplicates.py b/tests/automated/integration/api/test_duplicates.py deleted file mode 100644 index 0534292c..00000000 --- a/tests/automated/integration/api/test_duplicates.py +++ /dev/null @@ -1,63 +0,0 @@ -import pytest - -from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary -from src.db.dtos.batch import BatchInfo -from src.collectors.source_collectors.example.dtos.input import ExampleInputDTO -from tests.automated.integration.api.conftest import disable_task_trigger - - -@pytest.mark.asyncio -async def test_duplicates(api_test_helper): - ath = api_test_helper - - # Temporarily disable task trigger - disable_task_trigger(ath) - - dto = ExampleInputDTO( - sleep_time=0 - ) - - batch_id_1 = ath.request_validator.example_collector( - dto=dto - )["batch_id"] - - assert batch_id_1 is not None - - batch_id_2 = ath.request_validator.example_collector( - dto=dto - )["batch_id"] - - assert batch_id_2 is not None - - await ath.wait_for_all_batches_to_complete() - - - bi_1: BatchSummary = ath.request_validator.get_batch_info(batch_id_1) - bi_2: BatchSummary = ath.request_validator.get_batch_info(batch_id_2) - - bi_1.url_counts.total = 2 - bi_2.url_counts.total = 0 - bi_1.url_counts.duplicate = 0 - bi_2.url_counts.duplicate = 2 - - url_info_1 = ath.request_validator.get_batch_urls(batch_id_1) - url_info_2 = ath.request_validator.get_batch_urls(batch_id_2) - - assert len(url_info_1.urls) == 2 - assert len(url_info_2.urls) == 0 - - dup_info_1 = ath.request_validator.get_batch_url_duplicates(batch_id_1) - dup_info_2 = ath.request_validator.get_batch_url_duplicates(batch_id_2) - - assert len(dup_info_1.duplicates) == 0 - assert len(dup_info_2.duplicates) == 2 - - assert dup_info_2.duplicates[0].original_url_id == url_info_1.urls[0].id - assert dup_info_2.duplicates[1].original_url_id == url_info_1.urls[1].id - - assert dup_info_2.duplicates[0].original_batch_id == batch_id_1 - assert dup_info_2.duplicates[1].original_batch_id == batch_id_1 - - - - diff --git a/tests/automated/integration/api/test_example_collector.py b/tests/automated/integration/api/test_example_collector.py index d1d537e2..1e20362d 100644 --- a/tests/automated/integration/api/test_example_collector.py +++ b/tests/automated/integration/api/test_example_collector.py @@ -77,7 +77,6 @@ async def test_example_collector(api_test_helper, monkeypatch): bi: BatchSummary = ath.request_validator.get_batch_info(batch_id=batch_id) assert bi.status == BatchStatus.READY_TO_LABEL - assert bi.url_counts.total == 2 assert bi.parameters == dto.model_dump() assert bi.strategy == CollectorType.EXAMPLE.value assert bi.user_id is not None diff --git a/tests/automated/integration/api/test_manual_batch.py b/tests/automated/integration/api/test_manual_batch.py index 1c186d7a..a7be37e4 100644 --- a/tests/automated/integration/api/test_manual_batch.py +++ b/tests/automated/integration/api/test_manual_batch.py @@ -2,6 +2,7 @@ import pytest from src.api.endpoints.collector.dtos.manual_batch.post import ManualBatchInnerInputDTO, ManualBatchInputDTO +from src.db.models.instantiations.link.link_batch_urls import LinkBatchURL from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata from src.db.models.instantiations.url.core import URL from src.db.models.instantiations.batch import Batch @@ -69,6 +70,7 @@ async def test_manual_batch(api_test_helper): # Get URLs from database urls: list[URL] = await adb_client.get_all(URL) + links: list[LinkBatchURL] = await adb_client.get_all(LinkBatchURL) # Confirm 100 URLs assert len(urls) == 100 @@ -87,8 +89,10 @@ def check_attributes( return False return True + def check_link(link: LinkBatchURL): + assert link.batch_id == batch.id + def check_url(url: URL, url_only: bool): - assert url.batch_id == batch.id assert url.url is not None other_attributes = ["name", "description", "collector_metadata", "record_type"] return check_attributes(url, other_attributes, url_only) @@ -99,6 +103,8 @@ def check_url(url: URL, url_only: bool): for url in urls: if check_url(url, True): count_only_name += 1 + for link in links: + check_link(link) assert count_only_name == 50 # Confirm 50 have all optional fields count_all = 0 diff --git a/tests/automated/integration/api/test_url.py b/tests/automated/integration/api/test_url.py index 95c5f99f..e59c8299 100644 --- a/tests/automated/integration/api/test_url.py +++ b/tests/automated/integration/api/test_url.py @@ -1,6 +1,6 @@ import pytest -from src.api.endpoints.url.dtos.response import GetURLsResponseInfo +from src.api.endpoints.url.get.dto import GetURLsResponseInfo from src.db.dtos.url.insert import InsertURLsInfo diff --git a/tests/automated/integration/security_manager/test_security_manager.py b/tests/automated/integration/security_manager/test_security_manager.py index 9c759d21..14120493 100644 --- a/tests/automated/integration/security_manager/test_security_manager.py +++ b/tests/automated/integration/security_manager/test_security_manager.py @@ -1,12 +1,10 @@ import jwt -import pytest from starlette.testclient import TestClient from src.api.main import app from src.security.constants import ALGORITHM from src.security.enums import Permissions - SECRET_KEY = "test_secret_key" VALID_TOKEN = "valid_token" INVALID_TOKEN = "invalid_token" diff --git a/tests/automated/integration/tasks/asserts.py b/tests/automated/integration/tasks/asserts.py index 6e4e0d7e..224e56a1 100644 --- a/tests/automated/integration/tasks/asserts.py +++ b/tests/automated/integration/tasks/asserts.py @@ -1,3 +1,4 @@ +from src.core.tasks.base.run_info import TaskOperatorRunInfo from src.core.tasks.url.enums import TaskOperatorOutcome @@ -10,6 +11,6 @@ async def assert_prereqs_met(operator): assert meets_prereqs -def assert_task_has_expected_run_info(run_info, url_ids: list[int]): - assert run_info.outcome == TaskOperatorOutcome.SUCCESS +def assert_task_has_expected_run_info(run_info: TaskOperatorRunInfo, url_ids: list[int]): + assert run_info.outcome == TaskOperatorOutcome.SUCCESS, run_info.message assert run_info.linked_url_ids == url_ids From ffe914f7df61e1fc183b4799cfb4afb541085049 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 17 Jul 2025 15:48:34 -0400 Subject: [PATCH 242/244] Extract logic, break up functions into separate domain directories and files --- .../api/review/rejection/helpers.py | 2 +- .../test_approve_and_get_next_source.py | 2 +- .../api/review/test_next_source.py | 2 +- .../integration/api/test_annotate.py | 5 +- .../annotate_url/test_agency_not_in_db.py | 2 +- .../annotate_url/test_marked_not_relevant.py | 2 +- .../db/client/approve_url/test_basic.py | 2 +- .../db/client/approve_url/test_error.py | 2 +- .../test_basic.py | 2 +- .../test_batch_id_filtering.py | 2 +- .../test_favor_more_components.py | 2 +- .../test_pending.py | 2 +- .../test_validated.py | 2 +- ...next_url_for_annotation_batch_filtering.py | 2 +- ...get_next_url_for_user_agency_annotation.py | 2 +- ...ext_url_for_user_record_type_annotation.py | 2 +- .../integration/db/test_database_structure.py | 2 +- .../html_tag_collector/test_root_url_cache.py | 2 +- .../scheduled/agency_sync/test_happy_path.py | 2 +- .../agency_sync/test_no_new_results.py | 2 +- tests/conftest.py | 20 ++----- .../{assert_functions.py => asserts.py} | 0 tests/helpers/setup/__init__.py | 0 .../helpers/setup/annotate_agency/__init__.py | 0 tests/helpers/setup/annotate_agency/core.py | 22 +++++++ tests/helpers/setup/annotate_agency/model.py | 6 ++ tests/helpers/setup/annotation/__init__.py | 0 tests/helpers/setup/annotation/core.py | 22 +++++++ tests/helpers/setup/annotation/model.py | 8 +++ tests/helpers/setup/final_review/__init__.py | 0 .../final_review/core.py} | 58 +------------------ tests/helpers/setup/final_review/model.py | 11 ++++ tests/helpers/setup/wipe.py | 12 ++++ .../test_muckrock_api_interface.py | 2 +- 34 files changed, 112 insertions(+), 92 deletions(-) rename tests/helpers/{assert_functions.py => asserts.py} (100%) create mode 100644 tests/helpers/setup/__init__.py create mode 100644 tests/helpers/setup/annotate_agency/__init__.py create mode 100644 tests/helpers/setup/annotate_agency/core.py create mode 100644 tests/helpers/setup/annotate_agency/model.py create mode 100644 tests/helpers/setup/annotation/__init__.py create mode 100644 tests/helpers/setup/annotation/core.py create mode 100644 tests/helpers/setup/annotation/model.py create mode 100644 tests/helpers/setup/final_review/__init__.py rename tests/helpers/{complex_test_data_functions.py => setup/final_review/core.py} (57%) create mode 100644 tests/helpers/setup/final_review/model.py create mode 100644 tests/helpers/setup/wipe.py diff --git a/tests/automated/integration/api/review/rejection/helpers.py b/tests/automated/integration/api/review/rejection/helpers.py index 2a0a248b..8fb26603 100644 --- a/tests/automated/integration/api/review/rejection/helpers.py +++ b/tests/automated/integration/api/review/rejection/helpers.py @@ -3,7 +3,7 @@ from src.api.endpoints.review.reject.dto import FinalReviewRejectionInfo from src.collectors.enums import URLStatus from src.db.models.instantiations.url.core import URL -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review +from tests.helpers.setup.final_review.core import setup_for_get_next_url_for_final_review async def run_rejection_test( diff --git a/tests/automated/integration/api/review/test_approve_and_get_next_source.py b/tests/automated/integration/api/review/test_approve_and_get_next_source.py index 89279e38..9afc16d8 100644 --- a/tests/automated/integration/api/review/test_approve_and_get_next_source.py +++ b/tests/automated/integration/api/review/test_approve_and_get_next_source.py @@ -9,7 +9,7 @@ from src.db.models.instantiations.confirmed_url_agency import ConfirmedURLAgency from src.db.models.instantiations.url.core import URL from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review +from tests.helpers.setup.final_review.core import setup_for_get_next_url_for_final_review @pytest.mark.asyncio diff --git a/tests/automated/integration/api/review/test_next_source.py b/tests/automated/integration/api/review/test_next_source.py index 19910e38..790914ee 100644 --- a/tests/automated/integration/api/review/test_next_source.py +++ b/tests/automated/integration/api/review/test_next_source.py @@ -1,7 +1,7 @@ import pytest from src.core.enums import SuggestedStatus, RecordType -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review +from tests.helpers.setup.final_review.core import setup_for_get_next_url_for_final_review @pytest.mark.asyncio diff --git a/tests/automated/integration/api/test_annotate.py b/tests/automated/integration/api/test_annotate.py index a81ed27a..b0039212 100644 --- a/tests/automated/integration/api/test_annotate.py +++ b/tests/automated/integration/api/test_annotate.py @@ -18,8 +18,9 @@ from src.core.exceptions import FailedValidationException from src.db.models.instantiations.url.suggestion.record_type.user import UserRecordTypeSuggestion from src.db.models.instantiations.url.suggestion.relevant.user import UserRelevantSuggestion -from tests.helpers.complex_test_data_functions import AnnotateAgencySetupInfo, setup_for_annotate_agency, \ - setup_for_get_next_url_for_final_review +from tests.helpers.setup.annotate_agency.model import AnnotateAgencySetupInfo +from tests.helpers.setup.final_review.core import setup_for_get_next_url_for_final_review +from tests.helpers.setup.annotate_agency.core import setup_for_annotate_agency from tests.helpers.db_data_creator import BatchURLCreationInfo from tests.automated.integration.api.conftest import MOCK_USER_ID diff --git a/tests/automated/integration/db/client/annotate_url/test_agency_not_in_db.py b/tests/automated/integration/db/client/annotate_url/test_agency_not_in_db.py index 4949b092..33a93998 100644 --- a/tests/automated/integration/db/client/annotate_url/test_agency_not_in_db.py +++ b/tests/automated/integration/db/client/annotate_url/test_agency_not_in_db.py @@ -2,7 +2,7 @@ from src.db.constants import PLACEHOLDER_AGENCY_NAME from src.db.models.instantiations.agency import Agency -from tests.helpers.complex_test_data_functions import setup_for_annotate_agency +from tests.helpers.setup.annotate_agency.core import setup_for_annotate_agency from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/annotate_url/test_marked_not_relevant.py b/tests/automated/integration/db/client/annotate_url/test_marked_not_relevant.py index de2794ec..ccf76dc8 100644 --- a/tests/automated/integration/db/client/annotate_url/test_marked_not_relevant.py +++ b/tests/automated/integration/db/client/annotate_url/test_marked_not_relevant.py @@ -2,7 +2,7 @@ from src.core.enums import SuggestedStatus from src.db.dtos.url.mapping import URLMapping -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation +from tests.helpers.setup.annotation.core import setup_for_get_next_url_for_annotation from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/approve_url/test_basic.py b/tests/automated/integration/db/client/approve_url/test_basic.py index 426719d7..590f9cd1 100644 --- a/tests/automated/integration/db/client/approve_url/test_basic.py +++ b/tests/automated/integration/db/client/approve_url/test_basic.py @@ -7,7 +7,7 @@ from src.db.models.instantiations.url.core import URL from src.db.models.instantiations.url.optional_data_source_metadata import URLOptionalDataSourceMetadata from src.db.models.instantiations.url.reviewing_user import ReviewingUserURL -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review +from tests.helpers.setup.final_review.core import setup_for_get_next_url_for_final_review from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/approve_url/test_error.py b/tests/automated/integration/db/client/approve_url/test_error.py index 9b93da9e..52871e76 100644 --- a/tests/automated/integration/db/client/approve_url/test_error.py +++ b/tests/automated/integration/db/client/approve_url/test_error.py @@ -3,7 +3,7 @@ from src.api.endpoints.review.approve.dto import FinalReviewApprovalInfo from src.core.enums import RecordType -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review +from tests.helpers.setup.final_review.core import setup_for_get_next_url_for_final_review from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_basic.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_basic.py index a96b6ca4..adb48844 100644 --- a/tests/automated/integration/db/client/get_next_url_for_final_review/test_basic.py +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_basic.py @@ -1,7 +1,7 @@ import pytest from src.core.enums import SuggestedStatus, RecordType -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review +from tests.helpers.setup.final_review.core import setup_for_get_next_url_for_final_review from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_batch_id_filtering.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_batch_id_filtering.py index bf7017e3..bce7d8e2 100644 --- a/tests/automated/integration/db/client/get_next_url_for_final_review/test_batch_id_filtering.py +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_batch_id_filtering.py @@ -1,6 +1,6 @@ import pytest -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review +from tests.helpers.setup.final_review.core import setup_for_get_next_url_for_final_review from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/get_next_url_for_final_review/test_favor_more_components.py b/tests/automated/integration/db/client/get_next_url_for_final_review/test_favor_more_components.py index 103b1d03..874dba18 100644 --- a/tests/automated/integration/db/client/get_next_url_for_final_review/test_favor_more_components.py +++ b/tests/automated/integration/db/client/get_next_url_for_final_review/test_favor_more_components.py @@ -1,7 +1,7 @@ import pytest from src.core.enums import SuggestionType -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_final_review +from tests.helpers.setup.final_review.core import setup_for_get_next_url_for_final_review from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/test_pending.py b/tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/test_pending.py index 4aaf58ba..57c6ae35 100644 --- a/tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/test_pending.py +++ b/tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/test_pending.py @@ -1,7 +1,7 @@ import pytest from src.core.enums import SuggestedStatus -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation +from tests.helpers.setup.annotation.core import setup_for_get_next_url_for_annotation from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/test_validated.py b/tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/test_validated.py index ae806775..3736c2b8 100644 --- a/tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/test_validated.py +++ b/tests/automated/integration/db/client/get_next_url_for_user_relevance_annotation/test_validated.py @@ -1,7 +1,7 @@ import pytest from src.collectors.enums import URLStatus -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation +from tests.helpers.setup.annotation.core import setup_for_get_next_url_for_annotation from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/test_get_next_url_for_annotation_batch_filtering.py b/tests/automated/integration/db/client/test_get_next_url_for_annotation_batch_filtering.py index 1a348aa4..5a402727 100644 --- a/tests/automated/integration/db/client/test_get_next_url_for_annotation_batch_filtering.py +++ b/tests/automated/integration/db/client/test_get_next_url_for_annotation_batch_filtering.py @@ -1,7 +1,7 @@ import pytest from src.core.enums import SuggestionType -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation +from tests.helpers.setup.annotation.core import setup_for_get_next_url_for_annotation from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/test_get_next_url_for_user_agency_annotation.py b/tests/automated/integration/db/client/test_get_next_url_for_user_agency_annotation.py index 6e548b6b..8f03286c 100644 --- a/tests/automated/integration/db/client/test_get_next_url_for_user_agency_annotation.py +++ b/tests/automated/integration/db/client/test_get_next_url_for_user_agency_annotation.py @@ -1,6 +1,6 @@ import pytest -from tests.helpers.complex_test_data_functions import setup_for_annotate_agency +from tests.helpers.setup.annotate_agency.core import setup_for_annotate_agency from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/client/test_get_next_url_for_user_record_type_annotation.py b/tests/automated/integration/db/client/test_get_next_url_for_user_record_type_annotation.py index 96ee16f3..292ab33f 100644 --- a/tests/automated/integration/db/client/test_get_next_url_for_user_record_type_annotation.py +++ b/tests/automated/integration/db/client/test_get_next_url_for_user_record_type_annotation.py @@ -1,7 +1,7 @@ import pytest from src.core.enums import RecordType -from tests.helpers.complex_test_data_functions import setup_for_get_next_url_for_annotation +from tests.helpers.setup.annotation.core import setup_for_get_next_url_for_annotation from tests.helpers.db_data_creator import DBDataCreator diff --git a/tests/automated/integration/db/test_database_structure.py b/tests/automated/integration/db/test_database_structure.py index 80362aaf..7b34cebb 100644 --- a/tests/automated/integration/db/test_database_structure.py +++ b/tests/automated/integration/db/test_database_structure.py @@ -130,7 +130,7 @@ def run_column_tests(self): self.run_column_test(column) -def test_batch(wipe_database): +def test_batch(wiped_database): engine = create_engine(get_postgres_connection_string()) table_tester = TableTester( table_name="batches", diff --git a/tests/automated/integration/html_tag_collector/test_root_url_cache.py b/tests/automated/integration/html_tag_collector/test_root_url_cache.py index 16ab5941..151985cf 100644 --- a/tests/automated/integration/html_tag_collector/test_root_url_cache.py +++ b/tests/automated/integration/html_tag_collector/test_root_url_cache.py @@ -8,7 +8,7 @@ async def mock_get_request(url: str) -> RootURLCacheResponseInfo: return RootURLCacheResponseInfo(text="Test Title") @pytest.mark.asyncio -async def test_root_url_cache_happy_path(wipe_database): +async def test_root_url_cache_happy_path(wiped_database): cache = RootURLCache() cache.get_request = mock_get_request title = await cache.get_title("https://example.com") diff --git a/tests/automated/integration/tasks/scheduled/agency_sync/test_happy_path.py b/tests/automated/integration/tasks/scheduled/agency_sync/test_happy_path.py index 903008b4..863acf5c 100644 --- a/tests/automated/integration/tasks/scheduled/agency_sync/test_happy_path.py +++ b/tests/automated/integration/tasks/scheduled/agency_sync/test_happy_path.py @@ -9,7 +9,7 @@ from tests.automated.integration.tasks.scheduled.agency_sync.data import AGENCIES_SYNC_RESPONSES from tests.automated.integration.tasks.scheduled.agency_sync.existence_checker import AgencyChecker from tests.automated.integration.tasks.scheduled.agency_sync.helpers import check_sync_concluded, patch_sync_agencies -from tests.helpers.assert_functions import assert_task_run_success +from tests.helpers.asserts import assert_task_run_success @pytest.mark.asyncio diff --git a/tests/automated/integration/tasks/scheduled/agency_sync/test_no_new_results.py b/tests/automated/integration/tasks/scheduled/agency_sync/test_no_new_results.py index 9d01555e..fcc353ef 100644 --- a/tests/automated/integration/tasks/scheduled/agency_sync/test_no_new_results.py +++ b/tests/automated/integration/tasks/scheduled/agency_sync/test_no_new_results.py @@ -11,7 +11,7 @@ from tests.automated.integration.tasks.scheduled.agency_sync.data import THIRD_CALL_RESPONSE from tests.automated.integration.tasks.scheduled.agency_sync.existence_checker import AgencyChecker from tests.automated.integration.tasks.scheduled.agency_sync.helpers import patch_sync_agencies, check_sync_concluded -from tests.helpers.assert_functions import assert_task_run_success +from tests.helpers.asserts import assert_task_run_success @pytest.mark.asyncio diff --git a/tests/conftest.py b/tests/conftest.py index a33014d1..97d92c2d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -14,6 +14,7 @@ from src.util.helper_functions import load_from_environment from tests.helpers.alembic_runner import AlembicRunner from tests.helpers.db_data_creator import DBDataCreator +from tests.helpers.setup.wipe import wipe_database @pytest.fixture(autouse=True, scope="session") @@ -87,22 +88,13 @@ def setup_and_teardown(): engine.dispose() @pytest.fixture -def wipe_database(): - """ - Wipe all data from database - Returns: - - """ - conn = get_postgres_connection_string() - engine = create_engine(conn) - with engine.connect() as connection: - for table in reversed(Base.metadata.sorted_tables): - connection.execute(table.delete()) - connection.commit() +def wiped_database(): + """Wipe all data from database.""" + wipe_database(get_postgres_connection_string()) @pytest.fixture -def db_client_test(wipe_database) -> Generator[DatabaseClient, Any, None]: +def db_client_test(wiped_database) -> Generator[DatabaseClient, Any, None]: # Drop pre-existing table conn = get_postgres_connection_string() db_client = DatabaseClient(db_url=conn) @@ -110,7 +102,7 @@ def db_client_test(wipe_database) -> Generator[DatabaseClient, Any, None]: db_client.engine.dispose() @pytest.fixture -def adb_client_test(wipe_database) -> Generator[AsyncDatabaseClient, Any, None]: +def adb_client_test(wiped_database) -> Generator[AsyncDatabaseClient, Any, None]: conn = get_postgres_connection_string(is_async=True) adb_client = AsyncDatabaseClient(db_url=conn) yield adb_client diff --git a/tests/helpers/assert_functions.py b/tests/helpers/asserts.py similarity index 100% rename from tests/helpers/assert_functions.py rename to tests/helpers/asserts.py diff --git a/tests/helpers/setup/__init__.py b/tests/helpers/setup/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/helpers/setup/annotate_agency/__init__.py b/tests/helpers/setup/annotate_agency/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/helpers/setup/annotate_agency/core.py b/tests/helpers/setup/annotate_agency/core.py new file mode 100644 index 00000000..fbd7bc53 --- /dev/null +++ b/tests/helpers/setup/annotate_agency/core.py @@ -0,0 +1,22 @@ +from src.core.enums import SuggestionType +from tests.helpers.db_data_creator import DBDataCreator, BatchURLCreationInfo +from tests.helpers.setup.annotate_agency.model import AnnotateAgencySetupInfo + + +async def setup_for_annotate_agency( + db_data_creator: DBDataCreator, + url_count: int, + suggestion_type: SuggestionType = SuggestionType.UNKNOWN, + with_html_content: bool = True +): + buci: BatchURLCreationInfo = await db_data_creator.batch_and_urls( + url_count=url_count, + with_html_content=with_html_content + ) + await db_data_creator.auto_suggestions( + url_ids=buci.url_ids, + num_suggestions=1, + suggestion_type=suggestion_type + ) + + return AnnotateAgencySetupInfo(batch_id=buci.batch_id, url_ids=buci.url_ids) diff --git a/tests/helpers/setup/annotate_agency/model.py b/tests/helpers/setup/annotate_agency/model.py new file mode 100644 index 00000000..467d208d --- /dev/null +++ b/tests/helpers/setup/annotate_agency/model.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel + + +class AnnotateAgencySetupInfo(BaseModel): + batch_id: int + url_ids: list[int] diff --git a/tests/helpers/setup/annotation/__init__.py b/tests/helpers/setup/annotation/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/helpers/setup/annotation/core.py b/tests/helpers/setup/annotation/core.py new file mode 100644 index 00000000..d8d3bb0c --- /dev/null +++ b/tests/helpers/setup/annotation/core.py @@ -0,0 +1,22 @@ +from src.collectors.enums import URLStatus +from tests.helpers.db_data_creator import DBDataCreator +from tests.helpers.setup.annotation.model import AnnotationSetupInfo + + +async def setup_for_get_next_url_for_annotation( + db_data_creator: DBDataCreator, + url_count: int, + outcome: URLStatus = URLStatus.PENDING +) -> AnnotationSetupInfo: + batch_id = db_data_creator.batch() + insert_urls_info = db_data_creator.urls( + batch_id=batch_id, + url_count=url_count, + outcome=outcome + ) + await db_data_creator.html_data( + [ + url.url_id for url in insert_urls_info.url_mappings + ] + ) + return AnnotationSetupInfo(batch_id=batch_id, insert_urls_info=insert_urls_info) diff --git a/tests/helpers/setup/annotation/model.py b/tests/helpers/setup/annotation/model.py new file mode 100644 index 00000000..fc1627ba --- /dev/null +++ b/tests/helpers/setup/annotation/model.py @@ -0,0 +1,8 @@ +from pydantic import BaseModel + +from src.db.dtos.url.insert import InsertURLsInfo + + +class AnnotationSetupInfo(BaseModel): + batch_id: int + insert_urls_info: InsertURLsInfo diff --git a/tests/helpers/setup/final_review/__init__.py b/tests/helpers/setup/final_review/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/helpers/complex_test_data_functions.py b/tests/helpers/setup/final_review/core.py similarity index 57% rename from tests/helpers/complex_test_data_functions.py rename to tests/helpers/setup/final_review/core.py index fd723ccc..87c4da59 100644 --- a/tests/helpers/complex_test_data_functions.py +++ b/tests/helpers/setup/final_review/core.py @@ -1,63 +1,10 @@ from typing import Optional -from pydantic import BaseModel - from src.api.endpoints.annotate.agency.post.dto import URLAgencyAnnotationPostInfo -from src.db.dtos.url.insert import InsertURLsInfo -from src.db.dtos.url.mapping import URLMapping -from src.collectors.enums import URLStatus -from src.core.enums import RecordType, SuggestionType -from tests.helpers.db_data_creator import BatchURLCreationInfo +from src.core.enums import RecordType from tests.helpers.db_data_creator import DBDataCreator +from tests.helpers.setup.final_review.model import FinalReviewSetupInfo -class AnnotationSetupInfo(BaseModel): - batch_id: int - insert_urls_info: InsertURLsInfo - -async def setup_for_get_next_url_for_annotation( - db_data_creator: DBDataCreator, - url_count: int, - outcome: URLStatus = URLStatus.PENDING -) -> AnnotationSetupInfo: - batch_id = db_data_creator.batch() - insert_urls_info = db_data_creator.urls( - batch_id=batch_id, - url_count=url_count, - outcome=outcome - ) - await db_data_creator.html_data( - [ - url.url_id for url in insert_urls_info.url_mappings - ] - ) - return AnnotationSetupInfo(batch_id=batch_id, insert_urls_info=insert_urls_info) - -class AnnotateAgencySetupInfo(BaseModel): - batch_id: int - url_ids: list[int] - -async def setup_for_annotate_agency( - db_data_creator: DBDataCreator, - url_count: int, - suggestion_type: SuggestionType = SuggestionType.UNKNOWN, - with_html_content: bool = True -): - buci: BatchURLCreationInfo = await db_data_creator.batch_and_urls( - url_count=url_count, - with_html_content=with_html_content - ) - await db_data_creator.auto_suggestions( - url_ids=buci.url_ids, - num_suggestions=1, - suggestion_type=suggestion_type - ) - - return AnnotateAgencySetupInfo(batch_id=buci.batch_id, url_ids=buci.url_ids) - -class FinalReviewSetupInfo(BaseModel): - batch_id: int - url_mapping: URLMapping - user_agency_id: Optional[int] async def setup_for_get_next_url_for_final_review( db_data_creator: DBDataCreator, @@ -124,4 +71,3 @@ async def add_relevant_suggestion(relevant: bool): url_mapping=url_mapping, user_agency_id=user_agency_id ) - diff --git a/tests/helpers/setup/final_review/model.py b/tests/helpers/setup/final_review/model.py new file mode 100644 index 00000000..c75fb847 --- /dev/null +++ b/tests/helpers/setup/final_review/model.py @@ -0,0 +1,11 @@ +from typing import Optional + +from pydantic import BaseModel + +from src.db.dtos.url.mapping import URLMapping + + +class FinalReviewSetupInfo(BaseModel): + batch_id: int + url_mapping: URLMapping + user_agency_id: Optional[int] diff --git a/tests/helpers/setup/wipe.py b/tests/helpers/setup/wipe.py new file mode 100644 index 00000000..2145bcf1 --- /dev/null +++ b/tests/helpers/setup/wipe.py @@ -0,0 +1,12 @@ +from sqlalchemy import create_engine + +from src.db.models.templates import Base + + +def wipe_database(connection_string: str) -> None: + """Wipe all data from database.""" + engine = create_engine(connection_string) + with engine.connect() as connection: + for table in reversed(Base.metadata.sorted_tables): + connection.execute(table.delete()) + connection.commit() diff --git a/tests/manual/agency_identifier/test_muckrock_api_interface.py b/tests/manual/agency_identifier/test_muckrock_api_interface.py index d00a6aa2..1b809718 100644 --- a/tests/manual/agency_identifier/test_muckrock_api_interface.py +++ b/tests/manual/agency_identifier/test_muckrock_api_interface.py @@ -1,7 +1,7 @@ import pytest from aiohttp import ClientSession -from src.collectors.source_collectors import MuckrockAPIInterface +from src.collectors.source_collectors.muckrock.api_interface.core import MuckrockAPIInterface @pytest.mark.asyncio From 927cc73895d5bbe9a922220ab62dc814363635c6 Mon Sep 17 00:00:00 2001 From: Max Chis Date: Thu, 17 Jul 2025 16:11:45 -0400 Subject: [PATCH 243/244] Fix bug in `get_urls` logic --- src/api/endpoints/url/get/dto.py | 2 +- tests/conftest.py | 19 +++++++++++++++---- tests/helpers/setup/populate.py | 18 ++++++++++++++++++ 3 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 tests/helpers/setup/populate.py diff --git a/src/api/endpoints/url/get/dto.py b/src/api/endpoints/url/get/dto.py index 5a9eb6fa..3b3e980e 100644 --- a/src/api/endpoints/url/get/dto.py +++ b/src/api/endpoints/url/get/dto.py @@ -22,7 +22,7 @@ class GetURLsResponseMetadataInfo(BaseModel): class GetURLsResponseInnerInfo(BaseModel): id: int - batch_id: int + batch_id: int | None url: str status: URLStatus collector_metadata: Optional[dict] diff --git a/tests/conftest.py b/tests/conftest.py index 97d92c2d..ee9a6774 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,7 +1,8 @@ import logging -from typing import Any, Generator +from typing import Any, Generator, AsyncGenerator, Coroutine import pytest +import pytest_asyncio from alembic.config import Config from sqlalchemy import create_engine, inspect, MetaData from sqlalchemy.orm import scoped_session, sessionmaker @@ -14,6 +15,7 @@ from src.util.helper_functions import load_from_environment from tests.helpers.alembic_runner import AlembicRunner from tests.helpers.db_data_creator import DBDataCreator +from tests.helpers.setup.populate import populate_database from tests.helpers.setup.wipe import wipe_database @@ -93,6 +95,7 @@ def wiped_database(): wipe_database(get_postgres_connection_string()) + @pytest.fixture def db_client_test(wiped_database) -> Generator[DatabaseClient, Any, None]: # Drop pre-existing table @@ -101,14 +104,22 @@ def db_client_test(wiped_database) -> Generator[DatabaseClient, Any, None]: yield db_client db_client.engine.dispose() -@pytest.fixture -def adb_client_test(wiped_database) -> Generator[AsyncDatabaseClient, Any, None]: +@pytest_asyncio.fixture +async def populated_database(wiped_database) -> None: + conn = get_postgres_connection_string(is_async=True) + adb_client = AsyncDatabaseClient(db_url=conn) + await populate_database(adb_client) + +@pytest_asyncio.fixture +async def adb_client_test(wiped_database) -> AsyncGenerator[AsyncDatabaseClient, Any]: conn = get_postgres_connection_string(is_async=True) adb_client = AsyncDatabaseClient(db_url=conn) yield adb_client adb_client.engine.dispose() @pytest.fixture -def db_data_creator(db_client_test): +def db_data_creator( + db_client_test, +): db_data_creator = DBDataCreator(db_client=db_client_test) yield db_data_creator diff --git a/tests/helpers/setup/populate.py b/tests/helpers/setup/populate.py new file mode 100644 index 00000000..1741253b --- /dev/null +++ b/tests/helpers/setup/populate.py @@ -0,0 +1,18 @@ +from src.db.client.async_ import AsyncDatabaseClient +from src.db.models.instantiations.url.core import URL + + +async def populate_database(adb_client: AsyncDatabaseClient) -> None: + """Populate database with test data.""" + url = URL( + url="https://www.test-data.com/static-test-data", + name="Fake test data", + description="Test data populated as a result of `reset_database`, " + "which imitates a validated URL synchronized from the Data Sources App.", + collector_metadata={ + "source_collector": "test-data", + }, + outcome='validated', + record_type="Other" + ) + await adb_client.add(url) \ No newline at end of file From aeec7aeaeeecfdabde98cd8904c833bf5f28627f Mon Sep 17 00:00:00 2001 From: Josh <30379833+josh-chamberlain@users.noreply.github.com> Date: Tue, 22 Jul 2025 11:43:45 -0400 Subject: [PATCH 244/244] link to design principles --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 394cb919..ae2263dc 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ Note that to access API endpoints, you will need to have a valid Bearer Token fr Thank you for your interest in contributing to this project! Please follow these guidelines: +- [These Design Principles](https://github.com/Police-Data-Accessibility-Project/meta/blob/main/DESIGN-PRINCIPLES.md) may be used to make decisions or guide your work. - If you want to work on something, create an issue first so the broader community can discuss it. - If you make a utility, script, app, or other useful bit of code: put it in a top-level directory with an appropriate name and dedicated README and add it to the index.

  • + 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�=t*`+IA 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ǝqn~A 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